ZGlmZiAtLWdpdCBhL0NPUkUvSEREL2luYy93bGFuX2hkZF9jZmcuaCBiL0NPUkUvSEREL2luYy93bGFuX2hkZF9jZmcuaAppbmRleCAyZGZkY2E1Li41MDdlYjZlIDEwMDY0NAotLS0gYS9DT1JFL0hERC9pbmMvd2xhbl9oZGRfY2ZnLmgKKysrIGIvQ09SRS9IREQvaW5jL3dsYW5faGRkX2NmZy5oCkBAIC0xMzQzLDEwICsxMzQzLDE3IEBACiAgKiBBbGxvdyBHTyBpbiBNQ0MgbW9kZSB0byBhY2NlcHQgZGlmZmVyZW50IGJlYWNvbiBpbnRlcnZhbCB0aGFuIFNUQSdzLgogICogQWRkZWQgZm9yIFdpLUZpIENlcnQuIDUuMS4xMgogICogRGVmYXVsdDogRGlzYWJsZQorICogSWYgZ0FsbG93TUNDR09EaWZmQkkgPSAxICAvLyBTZXQgdG8gMSBmb3IgV0ZBIGNlcnRpZmljYXRpb24uIEdPIEJlYWNvbiBpbnRlcnZhbCBpcyBub3QgY2hhbmdlZC4gTUNDIEdPIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNuJ3Qgd29yayB3ZWxsIGluIG9wdGltaXplZCB3YXkuIEluIHdvcnN0IHNjZW5hcmlvLCBpdCBtYXkgaW52aXRlIFNUQSAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3Rpb24uCisgKiBnQWxsb3dNQ0NHT0RpZmZCSSA9IDIgICAgIC8vSWYgc2V0IHRvIDIgd29ya2Fyb3VuZCAxIGRpc2Fzc29jIGFsbCB0aGUgY2xpZW50cyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdXBkYXRlIGJlYWNvbiBJbnRlcnZhbAorICogZ0FsbG93TUNDR09EaWZmQkkgPSAzICAgICAvL0lmIHNldCB0byAzIHRlYXIgZG93biB0aGUgUDJQIGxpbmsgaW4gYXV0by8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uLWF1dG9ub21vdXMgLUdPIGNhc2UKICAqLwogI2RlZmluZSBDRkdfQUxMT1dfTUNDX0dPX0RJRkZfQklfTkFNRSAgICAgICAgICAgImdBbGxvd01DQ0dPRGlmZkJJIgogI2RlZmluZSBDRkdfQUxMT1dfTUNDX0dPX0RJRkZfQklfTUlOICAgICAgICAgICAgKCAwICkKLSNkZWZpbmUgQ0ZHX0FMTE9XX01DQ19HT19ESUZGX0JJX01BWCAgICAgICAgICAgICggMSApCisjZGVmaW5lIENGR19BTExPV19NQ0NfR09fRElGRl9CSV9NQVggICAgICAgICAgICAoIDMgKQogI2RlZmluZSBDRkdfQUxMT1dfTUNDX0dPX0RJRkZfQklfREVGQVVMVCAgICAgICAgKCAwICkgCiAKIC8qCmRpZmYgLS1naXQgYS9DT1JFL0hERC9zcmMvd2xhbl9oZGRfY2ZnLmMgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfY2ZnLmMKaW5kZXggODdlMzYyNC4uZTgwMTRjYSAxMDA2NDQKLS0tIGEvQ09SRS9IREQvc3JjL3dsYW5faGRkX2NmZy5jCisrKyBiL0NPUkUvSEREL3NyYy93bGFuX2hkZF9jZmcuYwpAQCAtMTU5Niw5ICsxNTk2LDkgQEAKICAgICAgICAgICAgICBWQVJfRkxBR1NfT1BUSU9OQUwgfCBWQVJfRkxBR1NfUkFOR0VfQ0hFQ0tfQVNTVU1FX0RFRkFVTFQsIAogICAgICAgICAgICAgIENGR19BTExPV19NQ0NfR09fRElGRl9CSV9ERUZBVUxULCAKICAgICAgICAgICAgICBDRkdfQUxMT1dfTUNDX0dPX0RJRkZfQklfTUlOLCAKLSAgICAgICAgICAgICBDRkdfQUxMT1dfTUNDX0dPX0RJRkZfQklfTUFYICksICAgICAgICAgICAgIAorICAgICAgICAgICAgIENGR19BTExPV19NQ0NfR09fRElGRl9CSV9NQVggKSwKIAotIFJFR19WQVJJQUJMRSggQ0ZHX1RIRVJNQUxfTUlHUkFUSU9OX0VOQUJMRV9OQU1FLCBXTEFOX1BBUkFNX0ludGVnZXIsCitSRUdfVkFSSUFCTEUoIENGR19USEVSTUFMX01JR1JBVElPTl9FTkFCTEVfTkFNRSwgV0xBTl9QQVJBTV9JbnRlZ2VyLAogICAgICAgICAgICAgICBoZGRfY29uZmlnX3QsIHRoZXJtYWxNaXRpZ2F0aW9uRW5hYmxlLCAKICAgICAgICAgICAgICAgVkFSX0ZMQUdTX09QVElPTkFMIHwgVkFSX0ZMQUdTX1JBTkdFX0NIRUNLX0FTU1VNRV9ERUZBVUxULCAKICAgICAgICAgICAgICAgQ0ZHX1RIRVJNQUxfTUlHUkFUSU9OX0VOQUJMRV9ERUZBVUxULCAKZGlmZiAtLWdpdCBhL0NPUkUvSEREL3NyYy93bGFuX2hkZF9ob3N0YXBkLmMgYi9DT1JFL0hERC9zcmMvd2xhbl9oZGRfaG9zdGFwZC5jCmluZGV4IDc1ZjBkNTMuLjlkMDhhNWEgMTAwNjQ0Ci0tLSBhL0NPUkUvSEREL3NyYy93bGFuX2hkZF9ob3N0YXBkLmMKKysrIGIvQ09SRS9IREQvc3JjL3dsYW5faGRkX2hvc3RhcGQuYwpAQCAtMzQxLDYgKzM0MSw3NiBAQAogICAgIEVYSVQoKTsKIH0KIAorVk9TX1NUQVRVUyBoZGRfY2hhbmdlX21jY19nb19iZWFjb25faW50ZXJ2YWwoaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyKQoreworICAgIHZfQ09OVEVYVF90IHBWb3NDb250ZXh0ID0gKFdMQU5fSEREX0dFVF9DVFgocEhvc3RhcGRBZGFwdGVyKSktPnB2b3NDb250ZXh0OworICAgIHB0U2FwQ29udGV4dCAgcFNhcEN0eCA9IE5VTEw7CisgICAgZUhhbFN0YXR1cyBoYWxTdGF0dXMgPSBlSEFMX1NUQVRVU19GQUlMVVJFOworICAgIHZfUFZPSURfdCBoSGFsID0gTlVMTDsKKworICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAiJXM6IFVQREFURSBCZWFjb24gUGFyYW1zIiwgX19mdW5jX18pOworCisgICAgaWYoVk9TX1NUQV9TQVBfTU9ERSA9PSB2b3NfZ2V0X2NvbnBhcmFtICggKSl7CisgICAgICAgIHBTYXBDdHggPSBWT1NfR0VUX1NBUF9DQihwVm9zQ29udGV4dCk7CisgICAgICAgIGlmICggTlVMTCA9PSBwU2FwQ3R4ICkKKyAgICAgICAgeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgU0FQIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgIH0KKworICAgICAgICBoSGFsID0gVk9TX0dFVF9IQUxfQ0IocFNhcEN0eC0+cHZvc0dDdHgpOworICAgICAgICBpZiAoIE5VTEwgPT0gaEhhbCApeworICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgSEFMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CisgICAgICAgIH0KKyAgICAgICAgaGFsU3RhdHVzID0gc21lX0NoYW5nZU1DQ0JlYWNvbkludGVydmFsKGhIYWwsIHBTYXBDdHgtPnNlc3Npb25JZCk7CisgICAgICAgIGlmKGhhbFN0YXR1cyA9PSBlSEFMX1NUQVRVU19GQUlMVVJFICl7CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHVwZGF0ZSBCZWFjb24gUGFyYW1zIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgaGRkX2NsZWFyX2FsbF9zdGEoaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyLCB2X1BWT0lEX3QgdXNyRGF0YUZvckNhbGxiYWNrKQoreworICAgIHZfVThfdCBzdGFJZCA9IDA7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKil1c3JEYXRhRm9yQ2FsbGJhY2s7CisKKyAgICBoZGRMb2coTE9HRSwgRkwoIkNsZWFyaW5nIGFsbCB0aGUgU1RBIGVudHJ5Li4uLlxuIikpOworICAgIGZvciAoc3RhSWQgPSAwOyBzdGFJZCA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgc3RhSWQrKykKKyAgICB7CisgICAgICAgIGlmICggcEhvc3RhcGRBZGFwdGVyLT5hU3RhSW5mb1tzdGFJZF0uaXNVc2VkICYmIAorICAgICAgICAgICAoIHN0YUlkICE9IChXTEFOX0hERF9HRVRfQVBfQ1RYX1BUUihwSG9zdGFwZEFkYXB0ZXIpKS0+dUJDU3RhSWQpKQorICAgICAgICB7CisgICAgICAgICAgICAvL0Rpc2Nvbm5lY3QgYWxsIHRoZSBzdGF0aW9ucworICAgICAgICAgICAgaGRkX3NvZnRhcF9zdGFfZGlzYXNzb2MocEhvc3RhcGRBZGFwdGVyLCAmcEhvc3RhcGRBZGFwdGVyLT5hU3RhSW5mb1tzdGFJZF0ubWFjQWRkclNUQS5ieXRlc1swXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaGRkX3N0b3BfcDJwX2xpbmsoaGRkX2FkYXB0ZXJfdCAqcEhvc3RhcGRBZGFwdGVyLHZfUFZPSURfdCB1c3JEYXRhRm9yQ2FsbGJhY2spCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBWT1NfU1RBVFVTIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKil1c3JEYXRhRm9yQ2FsbGJhY2s7CisgICAgRU5URVIoKTsKKyAgICBpZih0ZXN0X2JpdChTT0ZUQVBfQlNTX1NUQVJURUQsICZwSG9zdGFwZEFkYXB0ZXItPmV2ZW50X2ZsYWdzKSkgCisgICAgeworICAgICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSAoc3RhdHVzID0gV0xBTlNBUF9TdG9wQnNzKChXTEFOX0hERF9HRVRfQ1RYKHBIb3N0YXBkQWRhcHRlcikpLT5wdm9zQ29udGV4dCkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCBGTCgiRGVsZXRpbmcgUDJQIGxpbmshISEhISEiKSk7CisgICAgICAgIH0KKyAgICAgICAgY2xlYXJfYml0KFNPRlRBUF9CU1NfU1RBUlRFRCwgJnBIb3N0YXBkQWRhcHRlci0+ZXZlbnRfZmxhZ3MpOworICAgIH0KKyAgICBFWElUKCk7CisgICAgcmV0dXJuIChzdGF0dXMgPT0gVk9TX1NUQVRVU19TVUNDRVNTKSA/IDAgOiAtRUJVU1k7Cit9CiAKIFZPU19TVEFUVVMgaGRkX2hvc3RhcGRfU0FQRXZlbnRDQiggdHBTYXBfRXZlbnQgcFNhcEV2ZW50LCB2X1BWT0lEX3QgdXNyRGF0YUZvckNhbGxiYWNrKQogewpAQCAtNjI3LDYgKzY5Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CiAjZW5kaWYKICNlbmRpZgorICAgICAgICAgICAgLy9VcGRhdGUgdGhlIGJlYWNvbiBJbnRlcnZhbCBpZiBpdCBpcyBQMlAgR08KKyAgICAgICAgICAgIGhkZF9jaGFuZ2VfbWNjX2dvX2JlYWNvbl9pbnRlcnZhbChwSG9zdGFwZEFkYXB0ZXIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgZVNBUF9XUFNfUEJDX1BST0JFX1JFUV9FVkVOVDoKICAgICAgICAgewpAQCAtNzE0LDYgKzc4NiwxNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgZVNBUF9TVEFfQVNTT0NfSU5EOgogICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKKworICAgICAgICBjYXNlIGVTQVBfRElTQ09OTkVDVF9BTExfUDJQX0NMSUVOVDoKKyAgICAgICAgICAgIGhkZExvZyhMT0cxLCBGTCgiIERpc2Nvbm5lY3RpbmcgYWxsIHRoZSBQMlAgQ2xpZW50cy4uLi5cbiIpKTsKKyAgICAgICAgICAgIGhkZF9jbGVhcl9hbGxfc3RhKHBIb3N0YXBkQWRhcHRlciwgdXNyRGF0YUZvckNhbGxiYWNrKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKKyAgICAgICAgY2FzZSBlU0FQX01BQ19UUklHX1NUT1BfQlNTX0VWRU5UIDoKKyAgICAgICAgICAgIGhkZF9zdG9wX3AycF9saW5rKHBIb3N0YXBkQWRhcHRlciwgdXNyRGF0YUZvckNhbGxiYWNrKTsKKyAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGhkZExvZyhMT0cxLCJTQVAgbWVzc2FnZSBpcyBub3QgaGFuZGxlZFxuIik7CiAgICAgICAgICAgICBnb3RvIHN0b3Bic3M7CmRpZmYgLS1naXQgYS9DT1JFL01BQy9pbmMvc2lyQXBpLmggYi9DT1JFL01BQy9pbmMvc2lyQXBpLmgKaW5kZXggZGVjZmU5OC4uNTVjOWFlNCAxMDA2NDQKLS0tIGEvQ09SRS9NQUMvaW5jL3NpckFwaS5oCisrKyBiL0NPUkUvTUFDL2luYy9zaXJBcGkuaApAQCAtMzY4NCw2ICszNjg0LDE2IEBACiAgICAgdEFOSV9VOCAgICAgICAgc3NpZEhpZGRlbjsgICAgIC8vIEhpZGUgU1NJRAogfSB0U2lyVXBkYXRlUGFyYW1zLCAqdHBTaXJVcGRhdGVQYXJhbXM7CiAKKy8vQmVhY29uIEludGVydmFsCit0eXBlZGVmIHN0cnVjdCBzU2lyQ2hhbmdlQklQYXJhbXMKK3sKKyAgICB0QU5JX1UxNiAgICAgICBtZXNzYWdlVHlwZTsgICAgIAorICAgIHRBTklfVTE2ICAgICAgIGxlbmd0aDsKKyAgICB0QU5JX1UxNiAgICAgICBiZWFjb25JbnRlcnZhbDsgLy8gQmVhY29uIEludGVydmFsCisgICAgdFNpck1hY0FkZHIgICAgYnNzSWQ7CisgICAgdEFOSV9VOCAgICAgICAgc2Vzc2lvbklkOyAgICAgIC8vIFNlc3Npb24gSUQKK30gdFNpckNoYW5nZUJJUGFyYW1zLCAqdHBTaXJDaGFuZ2VCSVBhcmFtczsKKwogI2RlZmluZSBTSVJfV1BTX1VVSURfTEVOIDE2CiAjZGVmaW5lIFNJUl9XUFNfUEJDX1dBTEtfVElNRSAgIDEyMCAgLy8gMTIwIFNlY29uZAogCmRpZmYgLS1naXQgYS9DT1JFL01BQy9pbmMvd25pQXBpLmggYi9DT1JFL01BQy9pbmMvd25pQXBpLmgKaW5kZXggOWVmNDEwZC4uOGViZTVkMCAxMDA2NDQKLS0tIGEvQ09SRS9NQUMvaW5jL3duaUFwaS5oCisrKyBiL0NPUkUvTUFDL2luYy93bmlBcGkuaApAQCAtMjE5LDYgKzIxOSw3IEBACiAgICAgZVdOSV9TTUVfU0VUX0FQV1BBUlNOSUVzX1JFUSwKICAgICBlV05JX1NNRV9VUFBFUl9MQVlFUl9BU1NPQ19DTkYsCiAgICAgZVdOSV9TTUVfSElERV9TU0lEX1JFUSwKKyAgICBlV05JX1NNRV9DSE5HX01DQ19CRUFDT05fSU5URVJWQUwsCiAjZW5kaWYKICNpZmRlZiBXTEFOX0ZFQVRVUkVfUDJQCiAgICAgZVdOSV9TTUVfUkVNQUlOX09OX0NIQU5ORUxfUkVRLApkaWZmIC0tZ2l0IGEvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzTWVzc2FnZVF1ZXVlLmMgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NNZXNzYWdlUXVldWUuYwppbmRleCBkYTVlYTZhLi41NmZhOTRiIDEwMDY0NAotLS0gYS9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NNZXNzYWdlUXVldWUuYworKysgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NNZXNzYWdlUXVldWUuYwpAQCAtMTM2OSw2ICsxMzY5LDcgQEAKICAgICAgICAgY2FzZSBlV05JX1NNRV9ISURFX1NTSURfUkVROgogICAgICAgICBjYXNlIGVXTklfU01FX0dFVF9XUFNQQkNfU0VTU0lPTl9SRVE6CiAgICAgICAgIGNhc2UgZVdOSV9TTUVfU0VUX0FQV1BBUlNOSUVzX1JFUToKKyAgICAgICAgY2FzZSBlV05JX1NNRV9DSE5HX01DQ19CRUFDT05fSU5URVJWQUw6CiAjZW5kaWYKICNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9WT1dJRkkKICAgICAgICAgY2FzZSBlV05JX1NNRV9ORUlHSEJPUl9SRVBPUlRfUkVRX0lORDoKZGlmZiAtLWdpdCBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2VzLmMgYi9DT1JFL01BQy9zcmMvcGUvbGltL2xpbVByb2Nlc3NTbWVSZXFNZXNzYWdlcy5jCmluZGV4IDIwNDAxZGYuLjFmYTQ3MWUgMTAwNjQ0Ci0tLSBhL0NPUkUvTUFDL3NyYy9wZS9saW0vbGltUHJvY2Vzc1NtZVJlcU1lc3NhZ2VzLmMKKysrIGIvQ09SRS9NQUMvc3JjL3BlL2xpbS9saW1Qcm9jZXNzU21lUmVxTWVzc2FnZXMuYwpAQCAtNDQzNiw2ICs0NDM2LDYyIEBACiAgICAgcmV0dXJuOwogfSAvKioqIGVuZCBfX2xpbVByb2Nlc3NTbWVTZXRXUEFSU05JRXModHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgKnBNc2dCdWYpICoqKi8KIAorLyoKK1VwZGF0ZSB0aGUgYmVhY29uIEludGVydmFsIGR5bmFtaWNhbGx5IGlmIGJlYWNvbkludGVydmFsIGlzIGRpZmZlcmVudCBpbiBNQ0MgCisqLworc3RhdGljIHZvaWQKK19fbGltUHJvY2Vzc1NtZUNoYW5nZUJJKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKQoreworICAgIHRwU2lyQ2hhbmdlQklQYXJhbXMgICAgIHBDaGFuZ2VCSVBhcmFtczsKKyAgICB0cFBFU2Vzc2lvbiAgICAgICAgICAgICBwc2Vzc2lvbkVudHJ5OworICAgIHRBTklfVTggIHNlc3Npb25JZCA9IDA7CisgICAgdFVwZGF0ZUJlYWNvblBhcmFtcyBiZWFjb25QYXJhbXM7CisKKyAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgIEZMKCJyZWNlaXZlZCBVcGRhdGUgQmVhY29uIEludGVydmFsIG1lc3NhZ2VcbiIpKTspOworICAgIAorICAgIGlmKHBNc2dCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxpbUxvZyhwTWFjLCBMT0dFLEZMKCJCdWZmZXIgaXMgUG9pbnRpbmcgdG8gTlVMTFxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcENoYW5nZUJJUGFyYW1zID0gKHRwU2lyQ2hhbmdlQklQYXJhbXMpcE1zZ0J1ZjsKKworICAgIGlmKChwc2Vzc2lvbkVudHJ5ID0gcGVGaW5kU2Vzc2lvbkJ5QnNzaWQocE1hYywgcENoYW5nZUJJUGFyYW1zLT5ic3NJZCwgJnNlc3Npb25JZCkpID09IE5VTEwpCisgICAgeworICAgICAgICBsaW1Mb2cocE1hYywgTE9HRSwgRkwoIlNlc3Npb24gZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIEJTU0lEXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKlVwZGF0ZSBzZXNzaW9uRW50cnkgQmVhY29uIEludGVydmFsKi8KKyAgICBpZihwc2Vzc2lvbkVudHJ5LT5iZWFjb25QYXJhbXMuYmVhY29uSW50ZXJ2YWwgIT0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYW5nZUJJUGFyYW1zLT5iZWFjb25JbnRlcnZhbCApCisgICAgeworICAgICAgIHBzZXNzaW9uRW50cnktPmJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbCA9IHBDaGFuZ2VCSVBhcmFtcy0+YmVhY29uSW50ZXJ2YWw7CisgICAgfQorCisgICAgLypVcGRhdGUgc2NoIGJlYWNvbkludGVydmFsKi8KKyAgICBpZihwTWFjLT5zY2guc2NoT2JqZWN0LmdTY2hCZWFjb25JbnRlcnZhbCAhPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbmdlQklQYXJhbXMtPmJlYWNvbkludGVydmFsICkKKyAgICB7CisgICAgICAgIHBNYWMtPnNjaC5zY2hPYmplY3QuZ1NjaEJlYWNvbkludGVydmFsID0gcENoYW5nZUJJUGFyYW1zLT5iZWFjb25JbnRlcnZhbDsKKworICAgICAgICBQRUxPRzEobGltTG9nKHBNYWMsIExPRzEsCisgICAgICAgICAgICAgICBGTCgiTElNIHNlbmQgdXBkYXRlIEJlYWNvbkludGVydmFsIEluZGljYXRpb24gOiAlZCIpLHBDaGFuZ2VCSVBhcmFtcy0+YmVhY29uSW50ZXJ2YWwpOyk7CisKKyAgICAgICAgLyogVXBkYXRlIGJlYWNvbiAqLworICAgICAgICBzY2hTZXRGaXhlZEJlYWNvbkZpZWxkcyhwTWFjLCBwc2Vzc2lvbkVudHJ5KTsKKworICAgICAgICAvL1NldCBjaGFuZ2UgaW4gYmVhY29uIEludGVydmFsCisgICAgICAgIGJlYWNvblBhcmFtcy5iZWFjb25JbnRlcnZhbCA9IHBDaGFuZ2VCSVBhcmFtcy0+YmVhY29uSW50ZXJ2YWw7CisgICAgICAgIGJlYWNvblBhcmFtcy5wYXJhbUNoYW5nZUJpdG1hcCB8PSBQQVJBTV9CQ05fSU5URVJWQUxfQ0hBTkdFRDsKKyAgICAgICAgbGltU2VuZEJlYWNvblBhcmFtcyhwTWFjLCAmYmVhY29uUGFyYW1zLCBwc2Vzc2lvbkVudHJ5KTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9IC8qKiogZW5kIF9fbGltUHJvY2Vzc1NtZUNoYW5nZUJJKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyICpwTXNnQnVmKSAqKiovCisKICNlbmRpZgogCiAKQEAgLTQ5ODksNiArNTA0NSwxMSBAQAogICAgICAgICBjYXNlIGVXTklfU01FX1NFVF9BUFdQQVJTTklFc19SRVE6CiAgICAgICAgICAgICAgIF9fbGltUHJvY2Vzc1NtZVNldFdQQVJTTklFcyhwTWFjLCBwTXNnQnVmKTsgICAgICAgIAogICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGVXTklfU01FX0NITkdfTUNDX0JFQUNPTl9JTlRFUlZBTDoKKyAgICAgICAgICAgICAvL1VwZGF0ZSB0aGUgYmVhY29uSW50ZXJ2YWwKKyAgICAgICAgICAgICBfX2xpbVByb2Nlc3NTbWVDaGFuZ2VCSShwTWFjLCBwTXNnQnVmICk7CisgICAgICAgICAgICAgYnJlYWs7CiAjZW5kaWYgICAgICAgICAgICAKICAgICAgICAgICAgIAogI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX1ZPV0lGSSAKZGlmZiAtLWdpdCBhL0NPUkUvU0FQL2luYy9zYXBBcGkuaCBiL0NPUkUvU0FQL2luYy9zYXBBcGkuaAppbmRleCA1NmYzM2I1Li4wZWI5Y2JiIDEwMDY0NAotLS0gYS9DT1JFL1NBUC9pbmMvc2FwQXBpLmgKKysrIGIvQ09SRS9TQVAvaW5jL3NhcEFwaS5oCkBAIC0xOTAsNiArMTkwLDggQEAKICAgICBlU0FQX0lORElDQVRFX01HTVRfRlJBTUUsCiAgICAgZVNBUF9SRU1BSU5fQ0hBTl9SRUFEWSwKICAgICBlU0FQX1NFTkRfQUNUSU9OX0NORiwKKyAgICBlU0FQX0RJU0NPTk5FQ1RfQUxMX1AyUF9DTElFTlQsCisgICAgZVNBUF9NQUNfVFJJR19TVE9QX0JTU19FVkVOVCwKICNlbmRpZgogICAgIGVTQVBfVU5LTk9XTl9TVEFfSk9JTiwgLyogRXZlbnQgc2VuZCB3aGVuIGEgU1RBIGluIG5laXRoZXIgd2hpdGUgbGlzdCBvciBibGFjayBsaXN0IHRyaWVzIHRvIGFzc29jaWF0ZSBpbiBzb2Z0YXAgbW9kZSAqLwogICAgIGVTQVBfTUFYX0FTU09DX0VYQ0VFREVELCAvKiBFdmVudCBzZW5kIHdoZW4gYSBuZXcgU1RBIGlzIHJlamVjdGVkIGFzc29jaWF0aW9uIHNpbmNlIHNvZnRBUCBtYXggYXNzb2MgbGltaXQgaGFzIHJlYWNoZWQgKi8KZGlmZiAtLWdpdCBhL0NPUkUvU0FQL3NyYy9zYXBBcGlMaW5rQ250bC5jIGIvQ09SRS9TQVAvc3JjL3NhcEFwaUxpbmtDbnRsLmMKaW5kZXggMjZkODc5Yi4uMTNlYzk0MSAxMDA2NDQKLS0tIGEvQ09SRS9TQVAvc3JjL3NhcEFwaUxpbmtDbnRsLmMKKysrIGIvQ09SRS9TQVAvc3JjL3NhcEFwaUxpbmtDbnRsLmMKQEAgLTM4Miw2ICszODIsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSgoIHJvYW1SZXN1bHQgPT0gZUNTUl9ST0FNX1JFU1VMVF9OT05FKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVNBUF9TVEFUVVNfU1VDQ0VTUyA6IGVTQVBfU1RBVFVTX0ZBSUxVUkUpKTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBlQ1NSX1JPQU1fRElTQ09OTkVDVF9BTExfUDJQX0NMSUVOVFM6CisgICAgICAgICAgICBzYXBTaWduYWxIRERldmVudChzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTQVBfRElTQ09OTkVDVF9BTExfUDJQX0NMSUVOVCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkgZVNBUF9TVEFUVVNfU1VDQ0VTUyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICBjYXNlIGVDU1JfUk9BTV9TRU5EX1AyUF9TVE9QX0JTUzoKKyAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1NBUCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwgIkluICVzLCBSZWNlaXZlZCBzdG9wYnNzIiwgX19mdW5jX18pOworICAgICAgICAgICBzYXBTaWduYWxIRERldmVudChzYXBDb250ZXh0LCBwQ3NyUm9hbUluZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTQVBfTUFDX1RSSUdfU1RPUF9CU1NfRVZFTlQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpIGVTQVBfU1RBVFVTX1NVQ0NFU1MgKTsKKyAgICAgICAgYnJlYWs7CiAjZW5kaWYKIAogICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvQ09SRS9TQVAvc3JjL3NhcEZzbS5jIGIvQ09SRS9TQVAvc3JjL3NhcEZzbS5jCmluZGV4IDBkOTM3YTAuLjljYmZmY2UgMTAwNjQ0Ci0tLSBhL0NPUkUvU0FQL3NyYy9zYXBGc20uYworKysgYi9DT1JFL1NBUC9zcmMvc2FwRnNtLmMKQEAgLTY3MCw2ICs2NzAsMjMgQEAKICAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gZVNBUF9TRU5EX0FDVElPTl9DTkY7CiAgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcGV2dC5zYXBBY3Rpb25DbmYuYWN0aW9uU2VuZFN1Y2Nlc3MgPSAoZVNhcFN0YXR1cyljb250ZXh0OwogICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIGVTQVBfRElTQ09OTkVDVF9BTExfUDJQX0NMSUVOVDoKKyAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9TQVAsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiAlcywgU0FQIGV2ZW50IGNhbGxiYWNrIGV2ZW50ID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAiZVNBUF9ESVNDT05ORUNUX0FMTF9QMlBfQ0xJRU5UIik7CisgICAgICAgICAgICBzYXBBcEFwcEV2ZW50LnNhcEhkZEV2ZW50Q29kZSA9IGVTQVBfRElTQ09OTkVDVF9BTExfUDJQX0NMSUVOVDsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcEFjdGlvbkNuZi5hY3Rpb25TZW5kU3VjY2VzcyA9IChlU2FwU3RhdHVzKWNvbnRleHQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgIGNhc2UgZVNBUF9NQUNfVFJJR19TVE9QX0JTU19FVkVOVCA6CisgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfU0FQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW4gJXMsIFNBUCBldmVudCBjYWxsYmFjayBldmVudCA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgImVTQVBfTUFDX1RSSUdfU1RPUF9CU1NfRVZFTlQiKTsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwSGRkRXZlbnRDb2RlID0gZVNBUF9NQUNfVFJJR19TVE9QX0JTU19FVkVOVDsKKyAgICAgICAgICAgIHNhcEFwQXBwRXZlbnQuc2FwZXZ0LnNhcEFjdGlvbkNuZi5hY3Rpb25TZW5kU3VjY2VzcyA9IChlU2FwU3RhdHVzKWNvbnRleHQ7CisgICAgICAgICAgICBicmVhazsKKwogI2VuZGlmCiAKICAgICAgICAgY2FzZSBlU0FQX1VOS05PV05fU1RBX0pPSU46CmRpZmYgLS1naXQgYS9DT1JFL1NNRS9pbmMvY3NyQXBpLmggYi9DT1JFL1NNRS9pbmMvY3NyQXBpLmgKaW5kZXggNzM1ODE3Zi4uZjZmZGYzYiAxMDA2NDQKLS0tIGEvQ09SRS9TTUUvaW5jL2NzckFwaS5oCisrKyBiL0NPUkUvU01FL2luYy9jc3JBcGkuaApAQCAtNDE4LDYgKzQxOCwxMCBAQAogI2lmZGVmIEZFQVRVUkVfV0xBTl9MRlIKICAgICBlQ1NSX1JPQU1fUE1LX05PVElGWSwKICNlbmRpZgorICAgIGVDU1JfUk9BTV9ESVNDT05ORUNUX0FMTF9QMlBfQ0xJRU5UUywgLy9EaXNhY29ubmVjdCBhbGwgdGhlIGNsaWVudHMKKyAgICBlQ1NSX1JPQU1fU0VORF9QMlBfU1RPUF9CU1MsIC8vU3RvcGJzcyB0cmlnZ2VyZWQgZnJvbSBTTUUgZHVlIHRvIGRpZmZlcmVudCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlYWNvbiBpbnRlcnZhbAorCiB9ZVJvYW1DbWRTdGF0dXM7CiAKIApkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvaW5jL2NzckludGVybmFsLmggYi9DT1JFL1NNRS9pbmMvY3NySW50ZXJuYWwuaAppbmRleCA1NTkzMThiLi5lMzMyMjViIDEwMDY0NAotLS0gYS9DT1JFL1NNRS9pbmMvY3NySW50ZXJuYWwuaAorKysgYi9DT1JFL1NNRS9pbmMvY3NySW50ZXJuYWwuaApAQCAtMzQ1LDYgKzM0NSw4IEBACiAgICAgdFZPU19DT05fTU9ERSAgICAgICBic3NQZXJzb25hOwogICAgIHRBTklfVTE2ICAgICAgICAgICAgblJTTklFTGVuZ3RoOyAgLy9UaGUgYnl0ZSBjb3VudCBpbiB0aGUgcFJTTklFLCBpZiAwLCBwUlNOSUUgaXMgaWdub3JlZC4KICAgICB0QU5JX1U4ICAgICAgICAgICAgICpwUlNOSUU7ICAgICAvL0lmIG5vdCBudWxsLCBpdCBoYXMgdGhlIElFIGJ5dGUgc3RyZWFtIGZvciBSU04KKyAgICB0QU5JX0JPT0xFQU4gICAgICAgIHVwZGF0ZWJlYWNvbkludGVydmFsOyAvL0ZsYWcgdXNlZCB0byBpbmRpY2F0ZSB1cGRhdGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWFjb25JbnRlcnZhbCAKIH10Q3NyUm9hbVN0YXJ0QnNzUGFyYW1zOwogCiAKQEAgLTQ5NSw4ICs0OTcsOCBAQAogICAgIHRBTklfQk9PTEVBTiBzaG9ydFNsb3RUaW1lOwogICAgIHRBTklfQk9PTEVBTiBQcm9wcmlldGFyeVJhdGVzRW5hYmxlZDsKICAgICB0QU5JX0JPT0xFQU4gIGZlbmFibGVNQ0NNb2RlOwotICAgIHRBTklfQk9PTEVBTiAgZkFsbG93TUNDR09EaWZmQkk7CiAgICAgdEFOSV9VMTYgVHhSYXRlOworICAgIHRBTklfVTggIGZBbGxvd01DQ0dPRGlmZkJJOwogICAgIHRBTklfVTggQWRIb2NDaGFubmVsMjQ7CiAgICAgdEFOSV9VOCBBZEhvY0NoYW5uZWw1RzsKICAgICB0QU5JX1UzMiBpbXBzU2xlZXBUaW1lOyAgICAgLy9pbiB1bml0cyBvZiBtaWNyb3NlY29uZHMKZGlmZiAtLWdpdCBhL0NPUkUvU01FL2luYy9jc3JTdXBwb3J0LmggYi9DT1JFL1NNRS9pbmMvY3NyU3VwcG9ydC5oCmluZGV4IGU0ZmE1MTIuLjEzOWU1NDkgMTAwNjQ0Ci0tLSBhL0NPUkUvU01FL2luYy9jc3JTdXBwb3J0LmgKKysrIGIvQ09SRS9TTUUvaW5jL2NzclN1cHBvcnQuaApAQCAtODAzLDggKzgwMywxMSBAQAogY3NySXNjb25jdXJyZW50c2Vzc2lvblZhbGlkKHRwQW5pU2lyR2xvYmFsIHBNYWMsdEFOSV9VMzIgY3Vyc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFZPU19DT05fTU9ERSBjdXJyQnNzUGVyc29uYSk7CiAKLS8vQmVhY29uSW50ZXJ2YWwgdmFsaWFkYXRpb24gZm9yIE1DQyBzdXBwb3J0Ci1lSGFsU3RhdHVzIGNzclZhbGlkYXRlQmVhY29uSW50ZXJ2YWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjaGFubmVsSWQsIAorLy9VcGRhdGUgYmVhY29uSW50ZXJ2YWwgZm9yIFAyUC1HTyBjYXNlIGlmIGl0IGlzIGRpZmZlcmVudCAKK2VIYWxTdGF0dXMgY3NyVXBkYXRlcDJwQmVhY29uSW50ZXJ2YWwodHBBbmlTaXJHbG9iYWwgcE1hYyk7CisKKy8vQmVhY29uSW50ZXJ2YWwgdmFsaWRhdGlvbiBmb3IgTUNDIHN1cHBvcnQKK2VIYWxTdGF0dXMgY3NyVmFsaWRhdGVNQ0NCZWFjb25JbnRlcnZhbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGNoYW5uZWxJZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgKmJlYWNvbkludGVydmFsLCB0QU5JX1UzMiBjdXJzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFZPU19DT05fTU9ERSBjdXJyQnNzUGVyc29uYSk7CiAKZGlmZiAtLWdpdCBhL0NPUkUvU01FL2luYy9zbWVfQXBpLmggYi9DT1JFL1NNRS9pbmMvc21lX0FwaS5oCmluZGV4IDRjY2Q4YjUuLjM3Zjk5MDAgMTAwNjQ0Ci0tLSBhL0NPUkUvU01FL2luYy9zbWVfQXBpLmgKKysrIGIvQ09SRS9TTUUvaW5jL3NtZV9BcGkuaApAQCAtMTU5NSw5ICsxNTk1LDkgQEAKIAogICAgIFxwYXJhbSBwQVBXUFNJRVMgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdENzclJvYW1BUFdQU0lFUwogCi0gICAgXHJldHVybiBlSGFsU3RhdHVzIMKWIFNVQ0NFU1MgwpYgUm9hbSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBpbmRpY2F0ZSBhY3R1YWxseSByZXN1bHRzCisgICAgXHJldHVybiBlSGFsU3RhdHVzIJYgU1VDQ0VTUyCWIFJvYW0gY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgaW5kaWNhdGUgYWN0dWFsbHkgcmVzdWx0cwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgRkFJTFVSRSBvciBSRVNPVVJDRVMgwpYgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUgb3IgUkVTT1VSQ0VTIJYgVGhlIEFQSSBmaW5pc2hlZCBhbmQgZmFpbGVkLgogCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0xNjExLDEzICsxNjExLDI2IEBACiAKICAgICBccGFyYW0gcEFQU2lyUlNOaWUgLSBwb2ludGVyIHRvIGEgY2FsbGVyIGFsbG9jYXRlZCBvYmplY3Qgb2YgdFNpclJTTmllIHdpdGggV1BTL1JTTiBJRXMKIAotICAgIFxyZXR1cm4gZUhhbFN0YXR1cyDCliBTVUNDRVNTIMKWIAorICAgIFxyZXR1cm4gZUhhbFN0YXR1cyCWIFNVQ0NFU1MgliAKIAotICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUgb3IgUkVTT1VSQ0VTIMKWIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFIG9yIFJFU09VUkNFUyCWIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGVIYWxTdGF0dXMgc21lX1JvYW1VcGRhdGVBUFdQQVJTTklFcyh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkLCB0U2lyUlNOaWUgKiBwQVBTaXJSU05pZSk7CiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgc21lX0NoYW5nZU1DQ0JlYWNvbkludGVydmFsCisKKyAgICBcYnJpZWYgVG8gdXBkYXRlIFAyUC1HTydzIGJlYWNvbiBJbnRlcnZhbC4gCisKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgliBTVUNDRVNTIAorICAgICAgICAgICAgICAgICAgICAgICCWIEZBSUxVUkUgb3IgUkVTT1VSQ0VTIAorICAgICAgICAgICAgICAgICAgICAgICCWIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlSGFsU3RhdHVzIHNtZV9DaGFuZ2VNQ0NCZWFjb25JbnRlcnZhbCh0SGFsSGFuZGxlIGhIYWwsIHRBTklfVTggc2Vzc2lvbklkKTsKKworCiAjZW5kaWYKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNjI1LDkgKzE2MzgsOCBAQAogICBcYnJpZWYgQVBJIHRvIHNlbmQgdGhlIGJ0QU1Qc3RhdGUgdG8gRlcKICAgXHBhcmFtICBoSGFsIC0gVGhlIGhhbmRsZSByZXR1cm5lZCBieSBtYWNPcGVuLgogICBccGFyYW0gIGJ0QW1wRXZlbnQgLS0gYnRBTVAgZXZlbnQKLSAgXHJldHVybiBlSGFsU3RhdHVzIMKWIFNVQ0NFU1MgwpYKLQotICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUgb3IgUkVTT1VSQ0VTIMKWIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKyAgXHJldHVybiBlSGFsU3RhdHVzIJYgU1VDQ0VTUyCWCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTFVSRSBvciBSRVNPVVJDRVMgliBUaGUgQVBJIGZpbmlzaGVkIGFuZCBmYWlsZWQuCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCmRpZmYgLS1naXQgYS9DT1JFL1NNRS9zcmMvY3NyL2NzckFwaVJvYW0uYyBiL0NPUkUvU01FL3NyYy9jc3IvY3NyQXBpUm9hbS5jCmluZGV4IGQ4Nzc4ZjIuLjkxZjIwZWYgMTAwNjQ0Ci0tLSBhL0NPUkUvU01FL3NyYy9jc3IvY3NyQXBpUm9hbS5jCisrKyBiL0NPUkUvU01FL3NyYy9jc3IvY3NyQXBpUm9hbS5jCkBAIC0xMjA3Myw2ICsxMjA3Myw0OSBAQAogICAgIH0gd2hpbGUoIDAgKTsKICAgICByZXR1cm4oIHN0YXR1cyApOwogfQorCitlSGFsU3RhdHVzCitjc3JTZW5kQ2huZ01DQ0JlYWNvbkludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCkKK3sKKyAgICB0cFNpckNoYW5nZUJJUGFyYW1zIHBNc2c7CisgICAgdEFOSV9VMTYgbGVuID0gMDsKKyAgICBlSGFsU3RhdHVzIHN0YXR1cyAgID0gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB0Q3NyUm9hbVNlc3Npb24gKnBTZXNzaW9uID0gQ1NSX0dFVF9TRVNTSU9OKCBwTWFjLCBzZXNzaW9uSWQgKTsKKworICAgIGlmKCFwU2Vzc2lvbikKKyAgICB7CisgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiICBzZXNzaW9uICVkIG5vdCBmb3VuZCAiKSwgc2Vzc2lvbklkKTsKKyAgICAgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy9OTyBuZWVkIHRvIHVwZGF0ZSB0aGUgQmVhY29uIFBhcmFtcyBpZiB1cGRhdGUgYmVhY29uIHBhcmFtZXRlciBmbGFnIGlzIG5vdCBzZXQKKyAgICBpZighcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmJzc1BhcmFtcy51cGRhdGViZWFjb25JbnRlcnZhbCApCisgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworCisgICAgcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmJzc1BhcmFtcy51cGRhdGViZWFjb25JbnRlcnZhbCA9ICBlQU5JX0JPT0xFQU5fRkFMU0U7CisKKyAgICAgLyogQ3JlYXRlIHRoZSBtZXNzYWdlIGFuZCBzZW5kIHRvIGxpbSAqLworICAgICBsZW4gPSBzaXplb2YodFNpckNoYW5nZUJJUGFyYW1zKTsgCisgICAgIHN0YXR1cyA9IHBhbEFsbG9jYXRlTWVtb3J5KCBwTWFjLT5oSGRkLCAodm9pZCAqKikmcE1zZywgbGVuICk7CisgICAgIGlmKEhBTF9TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorICAgICB7CisgICAgICAgICBwYWxaZXJvTWVtb3J5KHBNYWMtPmhIZGQsIHBNc2csIHNpemVvZih0U2lyQ2hhbmdlQklQYXJhbXMpICk7CisgICAgICAgICBwTXNnLT5tZXNzYWdlVHlwZSAgICAgPSBlV05JX1NNRV9DSE5HX01DQ19CRUFDT05fSU5URVJWQUw7CisgICAgICAgICBwTXNnLT5sZW5ndGggICAgICAgICAgPSBsZW47CisKKyAgICAgICAgLy8gYnNzSWQKKyAgICAgICAgcGFsQ29weU1lbW9yeSggcE1hYy0+aEhkZCwgKHRTaXJNYWNBZGRyICopcE1zZy0+YnNzSWQsICZwU2Vzc2lvbi0+c2VsZk1hY0FkZHIsIHNpemVvZih0U2lyTWFjQWRkcikgKTsKKyAgICAgICAgc21zTG9nKCBwTWFjLCBMT0cxLCBGTCgiQ1NSIEF0dGVtcHRpbmcgdG8gY2hhbmdlIEJJIGZvciBCc3NpZD0gJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnggIiksIAorICAgICAgICAgICAgICAgICAgcE1zZy0+YnNzSWRbIDAgXSwgcE1zZy0+YnNzSWRbIDEgXSwgcE1zZy0+YnNzSWRbIDIgXSwKKyAgICAgICAgICAgICAgICAgIHBNc2ctPmJzc0lkWyAzIF0sIHBNc2ctPmJzc0lkWyA0IF0sIHBNc2ctPmJzc0lkWyA1IF0gKTsKKyAgICAgICAgcE1zZy0+c2Vzc2lvbklkICAgICAgID0gc2Vzc2lvbklkOworICAgICAgICBzbXNMb2cocE1hYywgTE9HMSwgRkwoIiAgc2Vzc2lvbiAlZCBCZWFjb25JbnRlcnZhbCAlZFxuIiksIHNlc3Npb25JZCwgcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmJzc1BhcmFtcy5iZWFjb25JbnRlcnZhbCk7CisgICAgICAgIHBNc2ctPmJlYWNvbkludGVydmFsID0gcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmJzc1BhcmFtcy5iZWFjb25JbnRlcnZhbDsgCisgICAgICAgIHN0YXR1cyA9IHBhbFNlbmRNQk1lc3NhZ2UocE1hYy0+aEhkZCwgcE1zZyk7CisgICAgfQorICAgICByZXR1cm4gc3RhdHVzOworfQorCiAjZW5kaWYKIGVIYWxTdGF0dXMgY3NyU2VuZE1CRGVhdXRoUmVxTXNnKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsIHRTaXJNYWNBZGRyIGJzc0lkLCB0QU5JX1UxNiByZWFzb25Db2RlICkKIHsKQEAgLTEyNDY1LDcgKzEyNTA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLT5ic3NQZXJzb25hKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCiAgICAgICAgIHsgICAgCi0gICAgICAgICAgIGNzclZhbGlkYXRlQmVhY29uSW50ZXJ2YWwocE1hYywgcFBhcmFtLT5vcGVyYXRpb25DaG4sICZ3VG1wLCBzZXNzaW9uSWQsCisgICAgICAgICAgIGNzclZhbGlkYXRlTUNDQmVhY29uSW50ZXJ2YWwocE1hYywgcFBhcmFtLT5vcGVyYXRpb25DaG4sICZ3VG1wLCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+YnNzUGVyc29uYSk7CiAgICAgICAgICAgIC8vVXBkYXRlIHRoZSBiZWFjb24gSW50ZXJ2YWwgCiAgICAgICAgICAgIHBQYXJhbS0+YmVhY29uSW50ZXJ2YWwgPSB3VG1wOwpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvc3JjL2Nzci9jc3JJbnNpZGVBcGkuaCBiL0NPUkUvU01FL3NyYy9jc3IvY3NySW5zaWRlQXBpLmgKaW5kZXggNjgyYzk2OS4uNTg2NDUxMiAxMDA2NDQKLS0tIGEvQ09SRS9TTUUvc3JjL2Nzci9jc3JJbnNpZGVBcGkuaAorKysgYi9DT1JFL1NNRS9zcmMvY3NyL2Nzckluc2lkZUFwaS5oCkBAIC05MDMsNyArOTAzLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiBlSGFsU3RhdHVzIGNzclNlbmRNQkdldFdQU1BCQ1Nlc3Npb25zKCB0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1UzMiBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNpck1hY0FkZHIgYnNzSWQsIHZvaWQgKnBVc3JDb250ZXh0LCB2b2lkICpwZm5TYXBFdmVudENhbGxiYWNrLHZfTUFDQUREUl90IHBSZW1vdmVNYWMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBcZm4gY3NyU2VuZENobmdNQ0NCZWFjb25JbnRlcnZhbAorICAgIFxicmllZiBjc3IgZnVuY3Rpb24gdGhhdCBIREQgY2FsbHMgdG8gc2VuZCBVcGRhdGUgYmVhY29uIGludGVydmFsCisgICAgXHBhcmFtIHNlc3Npb25JZCAtIHNlc3Npb24gSWQgZm9yIFNvZnQgQVAKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMKK2NzclNlbmRDaG5nTUNDQmVhY29uSW50ZXJ2YWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VMzIgc2Vzc2lvbklkKTsKKwogI2VuZGlmCiAjaWZkZWYgRkVBVFVSRV9XTEFOX0JUQU1QX1VUX1JGCiBlSGFsU3RhdHVzIGNzclJvYW1TdGFydEpvaW5SZXRyeVRpbWVyKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTMyIHNlc3Npb25JZCwgdEFOSV9VMzIgaW50ZXJ2YWwpOwpkaWZmIC0tZ2l0IGEvQ09SRS9TTUUvc3JjL2Nzci9jc3JVdGlsLmMgYi9DT1JFL1NNRS9zcmMvY3NyL2NzclV0aWwuYwppbmRleCBhMzM2NWM5Li43N2U0NjhmIDEwMDY0NAotLS0gYS9DT1JFL1NNRS9zcmMvY3NyL2NzclV0aWwuYworKysgYi9DT1JFL1NNRS9zcmMvY3NyL2NzclV0aWwuYwpAQCAtMTcxMiw3ICsxNzEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gZUhBTF9TVEFUVVNfU1VDQ0VTUyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoY3NyVmFsaWRhdGVCZWFjb25JbnRlcnZhbCggcE1hYywgcEJzc0Rlc2MtPmNoYW5uZWxJZCwgCisgICAgICAgICAgICAgICAgaWYoY3NyVmFsaWRhdGVNQ0NCZWFjb25JbnRlcnZhbCggcE1hYywgcEJzc0Rlc2MtPmNoYW5uZWxJZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCc3NEZXNjLT5iZWFjb25JbnRlcnZhbCwgc2Vzc2lvbklkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBlSEFMX1NUQVRVU19TVUNDRVNTKQpAQCAtMjc4MywxNCArMjc4Myw4NiBAQAogCiB9CiAKLWVIYWxTdGF0dXMgY3NyVmFsaWRhdGVCZWFjb25JbnRlcnZhbCh0cEFuaVNpckdsb2JhbCBwTWFjLCB0QU5JX1U4IGNoYW5uZWxJZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFOSV9VMTYgKmJlYWNvbkludGVydmFsLCB0QU5JX1UzMiBjdXJzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFZPU19DT05fTU9ERSBjdXJyQnNzUGVyc29uYSkKK2VIYWxTdGF0dXMgY3NyVXBkYXRlTUNDcDJwQmVhY29uSW50ZXJ2YWwodHBBbmlTaXJHbG9iYWwgcE1hYykKIHsKICAgICB0QU5JX1UzMiBzZXNzaW9uSWQgPSAwOwogCiAgICAgLy9JZiBNQ0MgaXMgbm90IHN1cHBvcnRlZCBqdXN0IGJyZWFrIGFuZCByZXR1cm4gU1VDQ0VTUwotICAgIGlmICggIUlTX01DQ19TVVBQT1JURUQgJiYgIXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZmVuYWJsZU1DQ01vZGUpeworICAgIGlmICggIXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZmVuYWJsZU1DQ01vZGUpeworICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICB9CisKKyAgICBmb3IgKHNlc3Npb25JZCA9IDA7IHNlc3Npb25JZCA8IENTUl9ST0FNX1NFU1NJT05fTUFYOyBzZXNzaW9uSWQrKyApCisgICAgeworICAgICAgICAvKiBJZiBHTyBpbiBNQ0Mgc3VwcG9ydCBkaWZmZXJlbnQgYmVhY29uIGludGVydmFsLCAKKyAgICAgICAgICogY2hhbmdlIHRoZSBCSSBvZiB0aGUgUDJQLUdPICovCisgICAgICAgIGlmKChwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uYnNzUGFyYW1zLmJzc1BlcnNvbmEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFZPU19QMlBfR09fTU9ERSkgJiYKKyAgICAgICAgICAgKHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5ic3NQYXJhbXMudXBkYXRlYmVhY29uSW50ZXJ2YWwgKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNzclJvYW1DYWxsQ2FsbGJhY2socE1hYywgc2Vzc2lvbklkLCBOVUxMLCAwLCBlQ1NSX1JPQU1fRElTQ09OTkVDVF9BTExfUDJQX0NMSUVOVFMsIGVDU1JfUk9BTV9SRVNVTFRfTk9ORSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVIQUxfU1RBVFVTX0ZBSUxVUkU7Cit9CisKK3RBTklfVTE2IGNzckNhbGN1bGF0ZU1DQ0JlYWNvbkludGVydmFsKHRwQW5pU2lyR2xvYmFsIHBNYWMsIHRBTklfVTE2IHN0YV9iaSwgdEFOSV9VMTYgZ29fZ2JpKQoreworICAgIHRBTklfVTggbnVtX2JlYWNvbnMgPSAwOworICAgIHRBTklfVTggaXNfbXVsdGlwbGUgPSAwOworICAgIHRBTklfVTE2IGdvX2NiaSA9IDA7CisgICAgdEFOSV9VMTYgZ29fZmJpID0gMDsKKyAgICB0QU5JX1UxNiBzdGFfY2JpID0gMDsKKworICAgIC8vSWYgR08ncyBnaXZlbiBiZWFjb24gSW50ZXJ2YWwgaXMgbGVzcyB0aGFuIDEwMCAKKyAgICBpZihnb19nYmkgPCAxMDApCisgICAgICAgZ29fY2JpID0gMTAwOworICAgIC8vaWYgR08ncyBnaXZlbiBiZWFjb24gSW50ZXJ2YWwgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwMAorICAgIGVsc2UKKyAgICAgICBnb19jYmkgPSAxMDAgKyAoZ29fZ2JpICUgMTAwKTsKKworICAgIC8vIGNoZWNrLCBpZiBlaXRoZXIgb25lIGlzIG11bHRpcGxlIG9mIGFub3RoZXIKKyAgICBpZiAoc3RhX2JpID4gZ29fY2JpKQorICAgIHsKKyAgICAgICAgaXNfbXVsdGlwbGUgPSAhKHN0YV9iaSAlIGdvX2NiaSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlzX211bHRpcGxlID0gIShnb19jYmkgJSBzdGFfYmkpOworICAgIH0KKyAgICAvLyBpZiBpdCBpcyBtdWx0aXBsZSwgdGhlbiBhY2NlcHQgR0+ScyBiZWFjb24gaW50ZXJ2YWwgcmFuZ2UgWzEwMCwxOTldIGFzIGl0ICBpcworICAgIGlmKGlzX211bHRpcGxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdvX2NiaTsKKyAgICB9CisgICAgLy9lbHNlICwgaWYgaXQgaXMgbm90IG11bHRpcGxlLCB0aGVuIHRoZW4gY2hlY2sgZm9yIG51bWJlciBvZiBiZWFjb25zIHRvIGJlIAorICAgIC8vaW5zZXJ0ZWQgYmFzZWQgb24gc3RhIEJJCisgICAgbnVtX2JlYWNvbnMgPSBzdGFfYmkgLyAxMDA7CisgICAgaWYobnVtX2JlYWNvbnMpCisgICAgeyAKKyAgICAgICAgLy8gR0+ScyBmaW5hbCBiZWFjb24gaW50ZXJ2YWwgd2lsbCBiZSBhbGlnbmVkIHRvIHN0YSBiZWFjb24gaW50ZXJ2YWwsIGJ1dCAKKyAgICAgICAgLy9pbiB0aGUgcmFuZ2Ugb2YgWzEwMCwgMTk5XS4KKyAgICAgICAgc3RhX2NiaSA9IHN0YV9iaSAvIG51bV9iZWFjb25zOworICAgICAgICBnb19mYmkgPSBzdGFfY2JpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBpZiBTVEEgYmVhY29uIGludGVydmFsIGlzIGxlc3MgdGhhbiAxMDAsIHVzZSBHT5JzIGNoYW5nZSBiYWNvbiBpbnRlcnZhbCAKKyAgICAgICAgLy9pbnN0ZWFkIG9mIHVwZGF0aW5nIHRvIFNUQZJzIGJlYWNvbiBpbnRlcnZhbC4KKyAgICAgICAgZ29fZmJpID0gZ29fY2JpOworICAgIH0KKyAgICByZXR1cm4gZ29fZmJpOworfQorCitlSGFsU3RhdHVzIGNzclZhbGlkYXRlTUNDQmVhY29uSW50ZXJ2YWwodHBBbmlTaXJHbG9iYWwgcE1hYywgdEFOSV9VOCBjaGFubmVsSWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBTklfVTE2ICpiZWFjb25JbnRlcnZhbCwgdEFOSV9VMzIgY3Vyc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRWT1NfQ09OX01PREUgY3VyckJzc1BlcnNvbmEpCit7CisgICAgdEFOSV9VMzIgc2Vzc2lvbklkID0gMDsKKyAgICB0QU5JX1UxNiBuZXdfYmVhY29uSW50ZXJ2YWwgPSAwOworICAKKyAgICAvL0lmIE1DQyBpcyBub3Qgc3VwcG9ydGVkIGp1c3QgYnJlYWsKKyAgICBpZiAoIXBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZmVuYWJsZU1DQ01vZGUpewogICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKICAgICB9CiAKQEAgLTI4MjcsMTcgKzI4OTksNDcgQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uYnNzUGFyYW1zLmJzc1BlcnNvbmEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gVk9TX1AyUF9HT19NT0RFKSAvL0NoZWNrIGZvciBQMlAgZ28gc2NlbmFyaW8KICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgR08gaW4gTUNDIHN1cHBvcnQgZGlmZmVyZW50IGJlYWNvbiBpbnRlcnZhbCwgcmV0dXJuIHN1Y2Nlc3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mQWxsb3dNQ0NHT0RpZmZCSSA9PSBUUlVFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5ic3NQYXJhbXMub3BlcmF0aW9uQ2huIAorICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgR08gaW4gTUNDIHN1cHBvcnQgZGlmZmVyZW50IGJlYWNvbiBpbnRlcnZhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBjaGFuZ2UgdGhlIEJJIG9mIHRoZSBQMlAtR08gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uYnNzUGFyYW1zLm9wZXJhdGlvbkNobiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gY2hhbm5lbElkICkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmJzc1BhcmFtcy5iZWFjb25JbnRlcnZhbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uYnNzUGFyYW1zLmJlYWNvbkludGVydmFsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSAqYmVhY29uSW50ZXJ2YWwpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQmVhY29uSW50ZXZhbCBpcyBkaWZmZXJlbnQgY2Fubm90IGNvbm5lY3QgdG8gcHJlZmVyZWQgQVAuLi5cbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgR08gaW4gTUNDIHN1cHBvcnQgZGlmZmVyZW50IGJlYWNvbiBpbnRlcnZhbCwgcmV0dXJuIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcE1hYy0+cm9hbS5jb25maWdQYXJhbS5mQWxsb3dNQ0NHT0RpZmZCSSA9PSAweDAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlSEFMX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBvbmx5IEJyb2FkY2FzdCBkaXNhc3NvYyBhbmQgdXBkYXRlIGJlYWNvbkludGVydmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHBNYWMtPnJvYW0uY29uZmlnUGFyYW0uZkFsbG93TUNDR09EaWZmQkkgPT0gMHgwMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIHRvIHBhc3MgdGhlIHJpZ2h0IGJlYWNvbiBJbnRlcnZhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19iZWFjb25JbnRlcnZhbCA9IGNzckNhbGN1bGF0ZU1DQ0JlYWNvbkludGVydmFsKHBNYWMsICpiZWFjb25JbnRlcnZhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uYnNzUGFyYW1zLmJlYWNvbkludGVydmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbXNMb2cocE1hYywgTE9HMSwgRkwoIiBQZWVyIEFQIEJJIDogJWQsIG5ldyBCZWFjb24gSW50ZXJ2YWw6ICVkXG4iKSwqYmVhY29uSW50ZXJ2YWwsbmV3X2JlYWNvbkludGVydmFsICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9VcGRhdGUgdGhlIGJlY29uIEludGVydmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKmJlYWNvbkludGVydmFsICE9IG5ld19iZWFjb25JbnRlcnZhbCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1VwZGF0ZSB0aGUgYmVhY29uSW50ZXJ2YWwgbm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgiIEJlYWNvbiBJbnRlcnZhbCBnb3QgY2hhbmdlZFxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uYnNzUGFyYW1zLmJlYWNvbkludGVydmFsID0gbmV3X2JlYWNvbkludGVydmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uYnNzUGFyYW1zLnVwZGF0ZWJlYWNvbkludGVydmFsID0gZUFOSV9CT09MRUFOX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzclVwZGF0ZU1DQ3AycEJlYWNvbkludGVydmFsKHBNYWMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRGlzY29ubmVjdCB0aGUgUDJQIHNlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocE1hYy0+cm9hbS5jb25maWdQYXJhbS5mQWxsb3dNQ0NHT0RpZmZCSSA9PSAweDAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5ic3NQYXJhbXMudXBkYXRlYmVhY29uSW50ZXJ2YWwgPSAgZUFOSV9CT09MRUFOX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjc3JSb2FtQ2FsbENhbGxiYWNrKHBNYWMsIHNlc3Npb25JZCwgTlVMTCwgMCwgZUNTUl9ST0FNX1NFTkRfUDJQX1NUT1BfQlNTLCBlQ1NSX1JPQU1fUkVTVUxUX05PTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0dFLCBGTCgiQmVhY29uSW50ZXZhbCBpcyBkaWZmZXJlbnQgY2Fubm90IGNvbm5lY3QgdG8gcHJlZmVyZWQgQVAuLi5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI4NzYsMTAgKzI5NzgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBjYXNlIFZPU19QMlBfR09fTU9ERSA6CisgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZihwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0ucEN1clJvYW1Qcm9maWxlICAmJiAKICAgICAgICAgICAgICAgICAgICAgICAoKHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5wQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gVk9TX1AyUF9DTElFTlRfTU9ERSkKLSAgICAgICAgICAgICAgICAgICAgIHx8IChwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0ucEN1clJvYW1Qcm9maWxlLT5jc3JQZXJzb25hIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFZPU19QMlBfQ0xJRU5UX01PREUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKHBNYWMtPnJvYW0ucm9hbVNlc3Npb25bc2Vzc2lvbklkXS5wQ3VyUm9hbVByb2ZpbGUtPmNzclBlcnNvbmEgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gVk9TX1NUQV9NT0RFKSkpIC8vY2hlY2sgZm9yIFAyUF9jbGllbnQgc2NlbmFyaW8KICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwTWFjLT5yb2FtLnJvYW1TZXNzaW9uW3Nlc3Npb25JZF0uY29ubmVjdGVkUHJvZmlsZS5vcGVyYXRpb25DaGFubmVsIApAQCAtMjkwMSwxMiArMzAwNCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZWQgYmVhY29uSW50ZXJ2YWwgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIHdlIGFyZSBzdGFydGluZyBhIG5ldyBCU1MgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbm90IGluY2FzZSBvZiBjbGllbnQgb3IgU1RBIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYmVhY29uSW50ZXJ2YWwgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmNvbm5lY3RlZFByb2ZpbGUuYmVhY29uSW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9DYWxjdWxhdGUgYmVhY29uIEludGVydmFsIGZvciBQMlAtR08gaW5jYXNlIG9mIE1DQworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19iZWFjb25JbnRlcnZhbCA9IGNzckNhbGN1bGF0ZU1DQ0JlYWNvbkludGVydmFsKHBNYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hYy0+cm9hbS5yb2FtU2Vzc2lvbltzZXNzaW9uSWRdLmJzc1BhcmFtcy5iZWFjb25JbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpiZWFjb25JbnRlcnZhbCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCpiZWFjb25JbnRlcnZhbCAhPSBuZXdfYmVhY29uSW50ZXJ2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpiZWFjb25JbnRlcnZhbCA9IG5ld19iZWFjb25JbnRlcnZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUhBTF9TVEFUVVNfU1VDQ0VTUzsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgZGVmYXVsdCA6CiAgICAgICAgICAgICAgICAgICAgIHNtc0xvZyhwTWFjLCBMT0cxLCBGTCgiIFBlcnNvbmEgbm90IHN1cHBvcnRlZCA6ICVkXG4iKSxjdXJyQnNzUGVyc29uYSk7CmRpZmYgLS1naXQgYS9DT1JFL1NNRS9zcmMvc21lX2NvbW1vbi9zbWVfQXBpLmMgYi9DT1JFL1NNRS9zcmMvc21lX2NvbW1vbi9zbWVfQXBpLmMKaW5kZXggOTYxMTg5Zi4uMTZmOGFmZiAxMDA2NDQKLS0tIGEvQ09SRS9TTUUvc3JjL3NtZV9jb21tb24vc21lX0FwaS5jCisrKyBiL0NPUkUvU01FL3NyYy9zbWVfY29tbW9uL3NtZV9BcGkuYwpAQCAtNTA0OSw3ICs1MDQ5LDM1IEBACiAgICByZXR1cm4gKHN0YXR1cyk7CiB9CiAjZW5kaWYKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisgICAgXGZuIHNtZV9DaGFuZ2VNQ0NCZWFjb25JbnRlcnZhbAorCisgICAgXGJyaWVmIFRvIHVwZGF0ZSBQMlAtR08gYmVhY29uSW50ZXJ2YWwuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciAKKyAgICBkaXNhc3NvY2lhdGluZyBhbGwgdGhlIHN0YXRpb24gaXMgZG9uZSAKKyAgICBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBBUEkuCisKKyAgICBccGFyYW0gCisKKyAgICBccmV0dXJuIGVIYWxTdGF0dXMgliBTVUNDRVNTIAorICAgICAgICAgICAgICAgICAgICAgICCWIEZBSUxVUkUgb3IgUkVTT1VSQ0VTIAorICAgICAgICAgICAgICAgICAgICAgICCWIFRoZSBBUEkgZmluaXNoZWQgYW5kIGZhaWxlZC4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VIYWxTdGF0dXMgc21lX0NoYW5nZU1DQ0JlYWNvbkludGVydmFsKHRIYWxIYW5kbGUgaEhhbCwgdEFOSV9VOCBzZXNzaW9uSWQpCit7CisgICBlSGFsU3RhdHVzIHN0YXR1cyA9IGVIQUxfU1RBVFVTX0ZBSUxVUkU7CisgICB0cEFuaVNpckdsb2JhbCBwTWFjID0gUE1BQ19TVFJVQ1QoIGhIYWwgKTsKKworICAgc21zTG9nKHBNYWMsIExPRzEsIEZMKCJVcGRhdGUgQmVhY29uIFBBUkFNUyBcbiIpKTsKKyAgIHN0YXR1cyA9IHNtZV9BY3F1aXJlR2xvYmFsTG9jayggJnBNYWMtPnNtZSApOworICAgaWYgKCBIQUxfU1RBVFVTX1NVQ0NFU1MoIHN0YXR1cyApICkKKyAgIHsKKyAgICAgIHN0YXR1cyA9IGNzclNlbmRDaG5nTUNDQmVhY29uSW50ZXJ2YWwoIHBNYWMsIHNlc3Npb25JZCk7CisgICAgICBzbWVfUmVsZWFzZUdsb2JhbExvY2soICZwTWFjLT5zbWUgKTsKKyAgIH0KKyAgIHJldHVybiAoc3RhdHVzKTsKK30KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogCg==