ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGIyMDdhOTYuLmEzNjc5YjEgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMiw2ICsyLDUgQEAKICAgICAiY2FtZXJhIiwKICAgICAiZHJtLyoiLAogICAgICJtZWRpYS8qIiwKLSAgICAicmFkaW8iLAogICAgICJzb3VuZHRyaWdnZXIiLAogXQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCA2NmY1ZmMyLi5mOTA2NTY0IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtNSwzNiArNSwzMSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYWRybSIsCiAKLSAgICBhaWRsOiB7Ci0gICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJhaWRsIl0sCi0gICAgICAgIGV4cG9ydF9haWRsX2hlYWRlcnM6IHRydWUsCi0gICAgfSwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsIiwKLQotICAgICAgICAiQ2FzSW1wbC5jcHAiLAotICAgICAgICAiRGVzY3JhbWJsZXJJbXBsLmNwcCIsCiAgICAgICAgICJEcm1QbHVnaW5QYXRoLmNwcCIsCiAgICAgICAgICJEcm1TZXNzaW9uTWFuYWdlci5jcHAiLAogICAgICAgICAiSUNyeXB0by5jcHAiLAogICAgICAgICAiSURybS5jcHAiLAogICAgICAgICAiSURybUNsaWVudC5jcHAiLAogICAgICAgICAiSU1lZGlhRHJtU2VydmljZS5jcHAiLAotICAgICAgICAiTWVkaWFDYXNEZWZzLmNwcCIsCisgICAgICAgICJQbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcCIsCiAgICAgICAgICJTaGFyZWRMaWJyYXJ5LmNwcCIsCiAgICAgICAgICJEcm1IYWwuY3BwIiwKICAgICAgICAgIkNyeXB0b0hhbC5jcHAiLAorICAgICAgICAicHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvIiwKICAgICBdLAogCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgIH0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQ2FzSW1wbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vQ2FzSW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzNiYjAuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0Nhc0ltcGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkNhc0ltcGwiCi0KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9DYXNBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9DYXNJbXBsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2hhcmVkTGlicmFyeS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBTdGF0dXMgZ2V0QmluZGVyU3RhdHVzKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0gICAgaWYgKGVyciA9PSBCQURfVkFMVUUpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5UKTsKLSAgICB9Ci0gICAgaWYgKGVyciA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShTdGF0dXM6OkVYX0lMTEVHQUxfU1RBVEUpOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoZXJyKTsKLX0KLQotc3RhdGljIFN0cmluZzggc2Vzc2lvbklkVG9TdHJpbmcoY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQpIHsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlc3Npb25JZC5zaXplKCk7IGkrKykgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMDJ4ICIsIHNlc3Npb25JZFtpXSk7Ci0gICAgfQotICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIihudWxsKSIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJ1Y3QgQ2FzSW1wbDo6UGx1Z2luSG9sZGVyIDogcHVibGljIFJlZkJhc2UgewotcHVibGljOgotICAgIGV4cGxpY2l0IFBsdWdpbkhvbGRlcihDYXNQbHVnaW4gKnBsdWdpbikgOiBtUGx1Z2luKHBsdWdpbikge30KLSAgICB+UGx1Z2luSG9sZGVyKCkgeyBpZiAobVBsdWdpbiAhPSBOVUxMKSBkZWxldGUgbVBsdWdpbjsgfQotICAgIENhc1BsdWdpbiogZ2V0KCkgeyByZXR1cm4gbVBsdWdpbjsgfQotCi1wcml2YXRlOgotICAgIENhc1BsdWdpbiAqbVBsdWdpbjsKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQbHVnaW5Ib2xkZXIpOwotfTsKLQotQ2FzSW1wbDo6Q2FzSW1wbChjb25zdCBzcDxJQ2FzTGlzdGVuZXI+ICZsaXN0ZW5lcikKLSAgICA6IG1QbHVnaW5Ib2xkZXIoTlVMTCksIG1MaXN0ZW5lcihsaXN0ZW5lcikgewotICAgIEFMT0dWKCJDVE9SIik7Ci19Ci0KLUNhc0ltcGw6On5DYXNJbXBsKCkgewotICAgIEFMT0dWKCJEVE9SIik7Ci0gICAgcmVsZWFzZSgpOwotfQotCi0vL3N0YXRpYwotdm9pZCBDYXNJbXBsOjpPbkV2ZW50KAotICAgICAgICB2b2lkICphcHBEYXRhLAotICAgICAgICBpbnQzMl90IGV2ZW50LAotICAgICAgICBpbnQzMl90IGFyZywKLSAgICAgICAgdWludDhfdCAqZGF0YSwKLSAgICAgICAgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoYXBwRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGFwcERhdGEhIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ2FzSW1wbCAqY2FzSW1wbCA9IHN0YXRpY19jYXN0PENhc0ltcGwgKj4oYXBwRGF0YSk7Ci0gICAgY2FzSW1wbC0+b25FdmVudChldmVudCwgYXJnLCBkYXRhLCBzaXplKTsKLX0KLQotdm9pZCBDYXNJbXBsOjppbml0KGNvbnN0IHNwPFNoYXJlZExpYnJhcnk+JiBsaWJyYXJ5LCBDYXNQbHVnaW4gKnBsdWdpbikgewotICAgIG1MaWJyYXJ5ID0gbGlicmFyeTsKLSAgICBtUGx1Z2luSG9sZGVyID0gbmV3IFBsdWdpbkhvbGRlcihwbHVnaW4pOwotfQotCi12b2lkIENhc0ltcGw6Om9uRXZlbnQoCi0gICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtTGlzdGVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RkOjp1bmlxdWVfcHRyPENhc0RhdGE+IGV2ZW50RGF0YTsKLSAgICBpZiAoZGF0YSAhPSBOVUxMICYmIHNpemUgPiAwKSB7Ci0gICAgICAgIGV2ZW50RGF0YS5yZXNldChuZXcgQ2FzRGF0YShkYXRhLCBkYXRhICsgc2l6ZSkpOwotICAgIH0KLQotICAgIG1MaXN0ZW5lci0+b25FdmVudChldmVudCwgYXJnLCBldmVudERhdGEpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6c2V0UHJpdmF0ZURhdGEoY29uc3QgQ2FzRGF0YSYgcHZ0RGF0YSkgewotICAgIEFMT0dWKCJzZXRQcml2YXRlRGF0YSIpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+c2V0UHJpdmF0ZURhdGEocHZ0RGF0YSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6b3BlblNlc3Npb24oQ2FzU2Vzc2lvbklkKiBzZXNzaW9uSWQpIHsKLSAgICBBTE9HVigib3BlblNlc3Npb24iKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnIgPSBob2xkZXItPmdldCgpLT5vcGVuU2Vzc2lvbihzZXNzaW9uSWQpOwotCi0gICAgQUxPR1YoIm9wZW5TZXNzaW9uOiBzZXNzaW9uIG9wZW5lZCwgc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKCpzZXNzaW9uSWQpLnN0cmluZygpKTsKLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoZXJyKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnNldFNlc3Npb25Qcml2YXRlRGF0YSgKLSAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGNvbnN0IENhc0RhdGEmIHB2dERhdGEpIHsKLSAgICBBTE9HVigic2V0U2Vzc2lvblByaXZhdGVEYXRhOiBzZXNzaW9uSWQ9JXMiLAotICAgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhob2xkZXItPmdldCgpLT5zZXRTZXNzaW9uUHJpdmF0ZURhdGEoc2Vzc2lvbklkLCBwdnREYXRhKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpjbG9zZVNlc3Npb24oY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQpIHsKLSAgICBBTE9HVigiY2xvc2VTZXNzaW9uOiBzZXNzaW9uSWQ9JXMiLAotICAgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhob2xkZXItPmdldCgpLT5jbG9zZVNlc3Npb24oc2Vzc2lvbklkKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpwcm9jZXNzRWNtKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLCBjb25zdCBQYXJjZWxhYmxlQ2FzRGF0YSYgZWNtKSB7Ci0gICAgQUxPR1YoInByb2Nlc3NFY206IHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+cHJvY2Vzc0VjbShzZXNzaW9uSWQsIGVjbSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cHJvY2Vzc0VtbShjb25zdCBQYXJjZWxhYmxlQ2FzRGF0YSYgZW1tKSB7Ci0gICAgQUxPR1YoInByb2Nlc3NFbW0iKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+cHJvY2Vzc0VtbShlbW0pKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnNlbmRFdmVudCgKLSAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPENhc0RhdGE+ICZldmVudERhdGEpIHsKLSAgICBBTE9HVigic2VuZEV2ZW50Iik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKGV2ZW50RGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIGVyciA9IGhvbGRlci0+Z2V0KCktPnNlbmRFdmVudChldmVudCwgYXJnLCBDYXNEYXRhKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IGhvbGRlci0+Z2V0KCktPnNlbmRFdmVudChldmVudCwgYXJnLCAqZXZlbnREYXRhKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhlcnIpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cHJvdmlzaW9uKGNvbnN0IFN0cmluZzE2JiBwcm92aXNpb25TdHJpbmcpIHsKLSAgICBBTE9HVigicHJvdmlzaW9uOiBwcm92aXNpb25TdHJpbmc9JXMiLCBTdHJpbmc4KHByb3Zpc2lvblN0cmluZykuc3RyaW5nKCkpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhob2xkZXItPmdldCgpLT5wcm92aXNpb24oU3RyaW5nOChwcm92aXNpb25TdHJpbmcpKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpyZWZyZXNoRW50aXRsZW1lbnRzKAotICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiAmcmVmcmVzaERhdGEpIHsKLSAgICBBTE9HVigicmVmcmVzaEVudGl0bGVtZW50cyIpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmIChyZWZyZXNoRGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIGVyciA9IGhvbGRlci0+Z2V0KCktPnJlZnJlc2hFbnRpdGxlbWVudHMocmVmcmVzaFR5cGUsIENhc0RhdGEoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gaG9sZGVyLT5nZXQoKS0+cmVmcmVzaEVudGl0bGVtZW50cyhyZWZyZXNoVHlwZSwgKnJlZnJlc2hEYXRhKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhlcnIpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cmVsZWFzZSgpIHsKLSAgICBBTE9HVigicmVsZWFzZTogcGx1Z2luPSVwIiwKLSAgICAgICAgICAgIG1QbHVnaW5Ib2xkZXIgPT0gTlVMTCA/IG1QbHVnaW5Ib2xkZXItPmdldCgpIDogTlVMTCk7Ci0gICAgbVBsdWdpbkhvbGRlci5jbGVhcigpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0Rlc2NyYW1ibGVySW1wbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRGVzY3JhbWJsZXJJbXBsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlMDllMi4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRGVzY3JhbWJsZXJJbXBsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJEZXNjcmFtYmxlckltcGwiCi0KLSNpbmNsdWRlIDxtZWRpYS9jYXMvRGVzY3JhbWJsZXJBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9EZXNjcmFtYmxlckltcGwuaD4KLSNpbmNsdWRlIDxtZWRpYS9TaGFyZWRMaWJyYXJ5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgU3RhdHVzIGdldEJpbmRlclN0YXR1cyhzdGF0dXNfdCBlcnIpIHsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9JTExFR0FMX1NUQVRFKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKGVycik7Ci19Ci0KLXN0YXRpYyBTdHJpbmc4IHNlc3Npb25JZFRvU3RyaW5nKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXNzaW9uSWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTAyeCAiLCBzZXNzaW9uSWRbaV0pOwotICAgIH0KLSAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIobnVsbCkiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRGVzY3JhbWJsZXJJbXBsOjpEZXNjcmFtYmxlckltcGwoCi0gICAgICAgIGNvbnN0IHNwPFNoYXJlZExpYnJhcnk+JiBsaWJyYXJ5LCBEZXNjcmFtYmxlclBsdWdpbiAqcGx1Z2luKSA6Ci0gICAgICAgIG1MaWJyYXJ5KGxpYnJhcnkpLCBtUGx1Z2luKHBsdWdpbikgewotICAgIEFMT0dWKCJDVE9SOiBtUGx1Z2luPSVwIiwgbVBsdWdpbik7Ci19Ci0KLURlc2NyYW1ibGVySW1wbDo6fkRlc2NyYW1ibGVySW1wbCgpIHsKLSAgICBBTE9HVigiRFRPUjogbVBsdWdpbj0lcCIsIG1QbHVnaW4pOwotICAgIHJlbGVhc2UoKTsKLX0KLQotU3RhdHVzIERlc2NyYW1ibGVySW1wbDo6c2V0TWVkaWFDYXNTZXNzaW9uKGNvbnN0IENhc1Nlc3Npb25JZCYgc2Vzc2lvbklkKSB7Ci0gICAgQUxPR1YoInNldE1lZGlhQ2FzU2Vzc2lvbjogc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhtUGx1Z2luLT5zZXRNZWRpYUNhc1Nlc3Npb24oc2Vzc2lvbklkKSk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudCgKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIG1pbWUsIGJvb2wgKnJlc3VsdCkgewotICAgICpyZXN1bHQgPSBtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoU3RyaW5nOChtaW1lKSk7Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKE9LKTsKLX0KLQotU3RhdHVzIERlc2NyYW1ibGVySW1wbDo6ZGVzY3JhbWJsZSgKLSAgICAgICAgY29uc3QgRGVzY3JhbWJsZUluZm8mIGluZm8sIGludDMyX3QgKnJlc3VsdCkgewotICAgIEFMT0dWKCJkZXNjcmFtYmxlIik7Ci0KLSAgICAqcmVzdWx0ID0gbVBsdWdpbi0+ZGVzY3JhbWJsZSgKLSAgICAgICAgICAgIGluZm8uZHN0VHlwZSAhPSBEZXNjcmFtYmxlSW5mbzo6a0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlciwKLSAgICAgICAgICAgIGluZm8uc2NyYW1ibGluZ0NvbnRyb2wsCi0gICAgICAgICAgICBpbmZvLm51bVN1YlNhbXBsZXMsCi0gICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXMsCi0gICAgICAgICAgICBpbmZvLnNyY01lbS0+cG9pbnRlcigpLAotICAgICAgICAgICAgaW5mby5zcmNPZmZzZXQsCi0gICAgICAgICAgICBpbmZvLmRzdFR5cGUgPT0gRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIgPwotICAgICAgICAgICAgICAgICAgICBpbmZvLnNyY01lbS0+cG9pbnRlcigpIDogaW5mby5kc3RQdHIsCi0gICAgICAgICAgICBpbmZvLmRzdE9mZnNldCwKLSAgICAgICAgICAgIE5VTEwpOwotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cygqcmVzdWx0ID49IDAgPyBPSyA6ICpyZXN1bHQpOwotfQotCi1TdGF0dXMgRGVzY3JhbWJsZXJJbXBsOjpyZWxlYXNlKCkgewotICAgIEFMT0dWKCJyZWxlYXNlOiBtUGx1Z2luPSVwIiwgbVBsdWdpbik7Ci0KLSAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtUGx1Z2luOwotICAgICAgICBtUGx1Z2luID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCmluZGV4IDM4NjU0NmYuLjMxNTBlM2MgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvRHJtSGFsLmg+CiAjaW5jbHVkZSA8bWVkaWEvRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oPgogI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgpAQCAtMTk0LDcgKzE5NSwxOCBAQAogICAgICBtSW5pdENoZWNrKChtRmFjdG9yaWVzLnNpemUoKSA9PSAwKSA/IEVSUk9SX1VOU1VQUE9SVEVEIDogTk9fSU5JVCkgewogfQogCit2b2lkIERybUhhbDo6Y2xvc2VPcGVuU2Vzc2lvbnMoKSB7CisgICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1QbHVnaW4tPmNsb3NlU2Vzc2lvbih0b0hpZGxWZWMobU9wZW5TZXNzaW9uc1tpXSkpOworICAgICAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24obU9wZW5TZXNzaW9uc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbU9wZW5TZXNzaW9ucy5jbGVhcigpOworfQorCiBEcm1IYWw6On5Ecm1IYWwoKSB7CisgICAgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlRHJtKG1Ecm1TZXNzaW9uQ2xpZW50KTsKIH0KIApAQCAtNDA1LDExICs0MTcsMTIgQEAKIAogc3RhdHVzX3QgRHJtSGFsOjpkZXN0cm95UGx1Z2luKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKICAgICB9CiAKKyAgICBjbG9zZU9wZW5TZXNzaW9ucygpOworICAgIHJlcG9ydE1ldHJpY3MoKTsKICAgICBzZXRMaXN0ZW5lcihOVUxMKTsKICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CiAgICAgICAgIG1QbHVnaW4tPnNldExpc3RlbmVyKE5VTEwpOwpAQCAtNDYxLDYgKzQ3NCw3IEBACiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+YWRkU2Vzc2lvbihnZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgbURybVNlc3Npb25DbGllbnQsIHNlc3Npb25JZCk7CisgICAgICAgIG1PcGVuU2Vzc2lvbnMucHVzaChzZXNzaW9uSWQpOwogICAgIH0KICAgICByZXR1cm4gZXJyOwogfQpAQCAtNDc1LDcgKzQ4OSwxNCBAQAogICAgIFN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5jbG9zZVNlc3Npb24odG9IaWRsVmVjKHNlc3Npb25JZCkpOwogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewogICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtT3BlblNlc3Npb25zW2ldID09IHNlc3Npb25JZCkgeworICAgICAgICAgICAgICAgIG1PcGVuU2Vzc2lvbnMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisgICAgcmVwb3J0TWV0cmljcygpOwogICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdHVzKTsKIH0KIApAQCAtNzI3LDYgKzc0OCwxMiBAQAogCiBzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwobmFtZSwgdmFsdWUpOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVybmFsIHRvIHRoZSBjbGFzcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCisgICAgLy8gbUxvY2sgaXMgYWxyZWFkeSBoZWxkLgogCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CkBAIC03NDgsNiArNzc1LDEyIEBACiAKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKG5hbWUsIHZhbHVlKTsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdCB7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbCB0byB0aGUgY2xhc3MgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZQorICAgIC8vIG1Mb2NrIGlzIGFscmVhZHkgaGVsZC4KIAogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwpAQCAtOTYyLDYgKzk5NSw3IEBACiB2b2lkIERybUhhbDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvIF9fdW51c2VkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKICAgICBzZXRMaXN0ZW5lcihOVUxMKTsKICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CiAgICAgICAgIG1QbHVnaW4tPnNldExpc3RlbmVyKE5VTEwpOwpAQCAtOTgwLDQgKzEwMTQsMjAgQEAKICAgICB9CiB9CiAKK3ZvaWQgRHJtSGFsOjpyZXBvcnRNZXRyaWNzKCkgY29uc3QKK3sKKyAgICBWZWN0b3I8dWludDhfdD4gbWV0cmljczsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIGlmIChnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCB2ZW5kb3IpID09IE9LICYmCisgICAgICAgICAgICBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKSA9PSBPSyAmJgorICAgICAgICAgICAgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4KCJtZXRyaWNzIiksIG1ldHJpY3MpID09IE9LKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IGFuZHJvaWQ6OnJlcG9ydERybVBsdWdpbk1ldHJpY3MoCisgICAgICAgICAgICAgICAgbWV0cmljcywgdmVuZG9yLCBkZXNjcmlwdGlvbik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRyaWNzIHdlcmUgcmV0cmlldmVkIGJ1dCBjb3VsZCBub3QgYmUgcmVwb3J0ZWQ6ICVpIiwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9NZWRpYUNhc0RlZnMuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL01lZGlhQ2FzRGVmcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMmJhMzguLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL01lZGlhQ2FzRGVmcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQ2FzIgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFDYXNEZWZzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotbmFtZXNwYWNlIE1lZGlhQ2FzIHsKLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc0RhdGE6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgcmV0dXJuIHBhcmNlbC0+cmVhZEJ5dGVWZWN0b3IodGhpcyk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbGFibGVDYXNEYXRhOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCAgewotICAgIHJldHVybiBwYXJjZWwtPndyaXRlQnl0ZVZlY3RvcigqdGhpcyk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogLypwYXJjZWwqLykgewotICAgIEFMT0dFKCJDQVBsdWdpbkRlc2NyaXB0b3I6OnJlYWRGcm9tUGFyY2VsKCkgc2hvdWxkbid0IGJlIGNhbGxlZCIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUNBU3lzdGVtSWQpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmNlbC0+d3JpdGVTdHJpbmcxNihtTmFtZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIE1lZGlhQ2FzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLW5hbWVzcGFjZSBNZWRpYURlc2NyYW1ibGVyIHsKLQotRGVzY3JhbWJsZUluZm86OkRlc2NyYW1ibGVJbmZvKCkge30KLQotRGVzY3JhbWJsZUluZm86On5EZXNjcmFtYmxlSW5mbygpIHt9Ci0KLXN0YXR1c190IERlc2NyYW1ibGVJbmZvOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICAgIHN0YXR1c190IGVyciA9IHBhcmNlbC0+cmVhZEludDMyKChpbnQzMl90KikmZHN0VHlwZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBpZiAoZHN0VHlwZSAhPSBrRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlCi0gICAgICAgICAgICAmJiBkc3RUeXBlICE9IGtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigoaW50MzJfdCopJnNjcmFtYmxpbmdDb250cm9sKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT5yZWFkVWludDMyKCh1aW50MzJfdCopJm51bVN1YlNhbXBsZXMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgaWYgKG51bVN1YlNhbXBsZXMgPiAweGZmZmYpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBzdWJTYW1wbGVzID0gbmV3IERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGVbbnVtU3ViU2FtcGxlc107Ci0gICAgaWYgKHN1YlNhbXBsZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIGVyciA9IHBhcmNlbC0+cmVhZFVpbnQzMigmc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyID0gcGFyY2VsLT5yZWFkVWludDMyKCZzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcmNNZW0gPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihwYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgaWYgKHNyY01lbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJnNyY09mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmF0aXZlSGFuZGxlID0gTlVMTDsKLSAgICBpZiAoZHN0VHlwZSA9PSBrRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7Ci0gICAgICAgIG5hdGl2ZUhhbmRsZSA9IHBhcmNlbC0+cmVhZE5hdGl2ZUhhbmRsZSgpOwotICAgICAgICBkc3RQdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KG5hdGl2ZUhhbmRsZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0UHRyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmZHN0T2Zmc2V0KTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXNjcmFtYmxlSW5mbzo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIGlmIChkc3RUeXBlICE9IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUKLSAgICAgICAgICAgICYmIGRzdFR5cGUgIT0ga0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlcikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdClkc3RUeXBlKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKHNjcmFtYmxpbmdDb250cm9sKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZVVpbnQzMihudW1TdWJTYW1wbGVzKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZXJyID0gcGFyY2VsLT53cml0ZVVpbnQzMihzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwYXJjZWwtPndyaXRlVWludDMyKHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc3JjTWVtKSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihzcmNPZmZzZXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoZHN0VHlwZSA9PSBrRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVOYXRpdmVIYW5kbGUoc3RhdGljX2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KGRzdFB0cikpOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihkc3RPZmZzZXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXIKLQotfSAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzAyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlBsdWdpbk1ldHJpY3NSZXBvcnRpbmciCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKworI2luY2x1ZGUgInByb3Rvcy9wbHVnaW5fbWV0cmljcy5wYi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXA7Cit1c2luZyBhbmRyb2lkOjpkcm1fbWV0cmljczo6TWV0cmljc0dyb3VwX01ldHJpYzsKK3VzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXBfTWV0cmljX01ldHJpY1ZhbHVlOworCitjb25zdCBjaGFyKiBjb25zdCBrUGFyZW50QXR0cmlidXRlID0gIi9wYXJlbnQvZXh0ZXJuYWwiOworCitzdGF0dXNfdCByZXBvcnRNZXRyaWNzR3JvdXAoY29uc3QgTWV0cmljc0dyb3VwJiBtZXRyaWNzR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYmF0Y2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QqIHBhcmVudElkKSB7CisgICAgTWVkaWFBbmFseXRpY3NJdGVtIGFuYWx5dGljc0l0ZW0oYmF0Y2hOYW1lLmNfc3RyKCkpOworICAgIGFuYWx5dGljc0l0ZW0uZ2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICBpbnQ2NF90IHNlc3Npb25JZCA9IGFuYWx5dGljc0l0ZW0uZ2V0U2Vzc2lvbklEKCk7CisgICAgaWYgKHBhcmVudElkICE9IE5VTEwpIHsKKyAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXRJbnQ2NChrUGFyZW50QXR0cmlidXRlLCAqcGFyZW50SWQpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0cmljc0dyb3VwLm1ldHJpY19zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBNZXRyaWNzR3JvdXBfTWV0cmljJiBtZXRyaWMgPSBtZXRyaWNzR3JvdXAubWV0cmljKGkpOworICAgICAgICBpZiAoIW1ldHJpYy5oYXNfbmFtZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0cmljIHdpdGggbm8gbmFtZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1ldHJpYy5oYXNfdmFsdWUoKSkgeworICAgICAgICAgICAgQUxPR0UoIk1ldHJpYyB3aXRoIG5vIHZhbHVlLiIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IE1ldHJpY3NHcm91cF9NZXRyaWNfTWV0cmljVmFsdWUmIHZhbHVlID0gbWV0cmljLnZhbHVlKCk7CisgICAgICAgIGlmICh2YWx1ZS5oYXNfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgICAgIGFuYWx5dGljc0l0ZW0uc2V0SW50NjQobWV0cmljLm5hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5pbnRfdmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaGFzX2RvdWJsZV92YWx1ZSgpKSB7CisgICAgICAgICAgICBhbmFseXRpY3NJdGVtLnNldERvdWJsZShtZXRyaWMubmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5kb3VibGVfdmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaGFzX3N0cmluZ192YWx1ZSgpKSB7CisgICAgICAgICAgICBhbmFseXRpY3NJdGVtLnNldENTdHJpbmcobWV0cmljLm5hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnN0cmluZ192YWx1ZSgpLmNfc3RyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIk1ldHJpYyBWYWx1ZSB3aXRoIG5vIGFjdHVhbCB2YWx1ZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhbmFseXRpY3NJdGVtLnNldEZpbmFsaXplZCh0cnVlKTsKKyAgICBhbmFseXRpY3NJdGVtLnNlbGZyZWNvcmQoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0cmljc0dyb3VwLm1ldHJpY19zdWJfZ3JvdXBfc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgTWV0cmljc0dyb3VwJiBzdWJHcm91cCA9IG1ldHJpY3NHcm91cC5tZXRyaWNfc3ViX2dyb3VwKGkpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBvcnRNZXRyaWNzR3JvdXAoc3ViR3JvdXAsIGJhdGNoTmFtZSwgJnNlc3Npb25JZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1N0cmluZzggc2FuaXRpemUoY29uc3QgU3RyaW5nOCYgaW5wdXQpIHsKKyAgICAvLyBGaWx0ZXJzIHRoZSBpbnB1dCBzdHJpbmcgZG93biB0byBqdXN0IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLgorICAgIFN0cmluZzggb3V0cHV0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY2hhciBjYW5kaWRhdGUgPSBpbnB1dFtpXTsKKyAgICAgICAgaWYgKChjYW5kaWRhdGUgPj0gJ2EnICYmIGNhbmRpZGF0ZSA8PSAneicpIHx8CisgICAgICAgICAgICAgICAgKGNhbmRpZGF0ZSA+PSAnQScgJiYgY2FuZGlkYXRlIDw9ICdaJykgfHwKKyAgICAgICAgICAgICAgICAoY2FuZGlkYXRlID49ICcwJyAmJiBjYW5kaWRhdGUgPD0gJzknKSkgeworICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgmY2FuZGlkYXRlLCAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RhdHVzX3QgcmVwb3J0RHJtUGx1Z2luTWV0cmljcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlcmlhbGl6ZWRNZXRyaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiB2ZW5kb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGRlc2NyaXB0aW9uKSB7CisgICAgTWV0cmljc0dyb3VwIHJvb3RfbWV0cmljc19ncm91cDsKKyAgICBpZiAoIXJvb3RfbWV0cmljc19ncm91cC5QYXJzZUZyb21BcnJheShzZXJpYWxpemVkTWV0cmljcy5hcnJheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRNZXRyaWNzLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWx1cmUgdG8gcGFyc2UuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJkcm0udmVuZG9yLiVzLiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FuaXRpemUodmVuZG9yKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZShkZXNjcmlwdGlvbikuY19zdHIoKSk7CisKKyAgICByZXR1cm4gcmVwb3J0TWV0cmljc0dyb3VwKHJvb3RfbWV0cmljc19ncm91cCwgbmFtZSwgTlVMTCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXMuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQ2NTkzLi4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDYXM7Ci0KLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElDYXMgewotICAgIHZvaWQgc2V0UHJpdmF0ZURhdGEoaW4gYnl0ZVtdIHB2dERhdGEpOwotICAgIGJ5dGVbXSBvcGVuU2Vzc2lvbigpOwotICAgIHZvaWQgY2xvc2VTZXNzaW9uKGluIGJ5dGVbXSBzZXNzaW9uSWQpOwotICAgIHZvaWQgc2V0U2Vzc2lvblByaXZhdGVEYXRhKGluIGJ5dGVbXSBzZXNzaW9uSWQsIGluIGJ5dGVbXSBwdnREYXRhKTsKLSAgICB2b2lkIHByb2Nlc3NFY20oaW4gYnl0ZVtdIHNlc3Npb25JZCwgaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZWNtKTsKLSAgICB2b2lkIHByb2Nlc3NFbW0oaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZW1tKTsKLSAgICB2b2lkIHNlbmRFdmVudChpbnQgZXZlbnQsIGludCBhcmcsIGluIEBudWxsYWJsZSBieXRlW10gZXZlbnREYXRhKTsKLSAgICB2b2lkIHByb3Zpc2lvbihTdHJpbmcgcHJvdmlzaW9uU3RyaW5nKTsKLSAgICB2b2lkIHJlZnJlc2hFbnRpdGxlbWVudHMoaW50IHJlZnJlc2hUeXBlLCBpbiBAbnVsbGFibGUgYnl0ZVtdIHJlZnJlc2hEYXRhKTsKLSAgICB2b2lkIHJlbGVhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhNWFiYy4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqIEBoaWRlICovCi1pbnRlcmZhY2UgSUNhc0xpc3RlbmVyIHsKLSAgICB2b2lkIG9uRXZlbnQoaW50IGV2ZW50LCBpbnQgYXJnLCBpbiBAbnVsbGFibGUgYnl0ZVtdIGRhdGEpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjY4MjUuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5JRGVzY3JhbWJsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5JQ2FzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuSUNhc0xpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDYXM7Ci0KLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElNZWRpYUNhc1NlcnZpY2UgewotICAgIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yW10gZW51bWVyYXRlUGx1Z2lucygpOwotICAgIGJvb2xlYW4gaXNTeXN0ZW1JZFN1cHBvcnRlZChpbnQgQ0Ffc3lzdGVtX2lkKTsKLSAgICBJQ2FzIGNyZWF0ZVBsdWdpbihpbnQgQ0Ffc3lzdGVtX2lkLCBJQ2FzTGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIGJvb2xlYW4gaXNEZXNjcmFtYmxlclN1cHBvcnRlZChpbnQgQ0Ffc3lzdGVtX2lkKTsKLSAgICBJRGVzY3JhbWJsZXIgY3JlYXRlRGVzY3JhbWJsZXIoaW50IENBX3N5c3RlbV9pZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFDYXMuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFDYXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4ZDBjNi4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhQ2FzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKiogQGhpZGUgKi8KLXBhcmNlbGFibGUgTWVkaWFDYXMuUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IgY3BwX2hlYWRlciAibWVkaWEvTWVkaWFDYXNEZWZzLmgiOwotCi0vKiogQGhpZGUgKi8KLXBhcmNlbGFibGUgTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgY3BwX2hlYWRlciAibWVkaWEvTWVkaWFDYXNEZWZzLmgiOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmFtYmxlci5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyYW1ibGVyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODkyNDQuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyYW1ibGVyLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKiogQGhpZGUgKi8KLXBhcmNlbGFibGUgTWVkaWFEZXNjcmFtYmxlci5EZXNjcmFtYmxlSW5mbyBjcHBfaGVhZGVyICJtZWRpYS9NZWRpYUNhc0RlZnMuaCI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Byb3Rvcy9wbHVnaW5fbWV0cmljcy5wcm90byBiL2RybS9saWJtZWRpYWRybS9wcm90b3MvcGx1Z2luX21ldHJpY3MucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyNmYxNAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9wcm90b3MvcGx1Z2luX21ldHJpY3MucHJvdG8KQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGFuZHJvaWQuZHJtX21ldHJpY3M7CisKKy8vIG5lZWQgdGhpcyBpZiB3ZSBhcmUgdXNpbmcgbGlicHJvdG9idWYtY3BwLTIuMy4wLWxpdGUKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKKy8vIFRoZSBNZXRyaWNzR3JvdXAgaXMgYSBjb2xsZWN0aW9uIG9mIG1ldHJpYyBuYW1lL3ZhbHVlIHBhaXIgaW5zdGFuY2VzCisvLyB0aGF0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBwcm92aWRlZCB0byBhIGNhbGxlci4KK21lc3NhZ2UgTWV0cmljc0dyb3VwIHsKKyAgbWVzc2FnZSBNZXRyaWMgeworICAgIG1lc3NhZ2UgTWV0cmljVmFsdWUgeworICAgICAgLy8gRXhhY3RseSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbXVzdCBiZSBzZXQuCisgICAgICBvcHRpb25hbCBpbnQ2NCBpbnRfdmFsdWUgPSAxOworICAgICAgb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDI7CisgICAgICBvcHRpb25hbCBzdHJpbmcgc3RyaW5nX3ZhbHVlID0gMzsKKyAgICB9CisKKyAgICAvLyBUaGUgbmFtZSBvZiB0aGUgbWV0cmljLiBNdXN0IGJlIHZhbGlkIFVURi04LiBSZXF1aXJlZC4KKyAgICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisKKyAgICAvLyBUaGUgdmFsdWUgb2YgdGhlIG1ldHJpYy4gUmVxdWlyZWQuCisgICAgb3B0aW9uYWwgTWV0cmljVmFsdWUgdmFsdWUgPSAyOworICB9CisKKyAgLy8gVGhlIGxpc3Qgb2YgbmFtZS92YWx1ZSBwYWlycyBvZiBtZXRyaWNzLgorICByZXBlYXRlZCBNZXRyaWMgbWV0cmljID0gMTsKKworICAvLyBBbGxvdyBtdWx0aXBsZSBzdWIgZ3JvdXBzIG9mIG1ldHJpY3MuCisgIHJlcGVhdGVkIE1ldHJpY3NHcm91cCBtZXRyaWNfc3ViX2dyb3VwID0gMjsKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rCmluZGV4IDhmZDg2NmMuLjRiMTM5YTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tawpAQCAtMjgsOCArMjgsNyBAQAogCiBMT0NBTF9NT0RVTEUgOj0gbGliY2xlYXJrZXljYXNwbHVnaW4KIAotI1RPRE86IG1vdmUgdGhpcyBiYWNrIHRvIC92ZW5kb3IvbGliIGFmdGVyIGNvbnZlcnNpb24gdG8gdHJlYmxlCi0jTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBtZWRpYWNhcwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKQEAgLTM5LDYgKzM4LDkgQEAKICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKICAgICBsaWJwcm90b2J1Zi1jcHAtbGl0ZSBcCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIG1lZGlhX3BsdWdpbl9oZWFkZXJzCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmpzbW4gXAogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKaW5kZXggNGVkNWZjZS4uZTI3NjMxZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcApAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KIAogICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uSWQpOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICBzcDxDbGVhcktleUNhc1Nlc3Npb24+IHNlc3Npb24gPQogICAgICAgICAgICAgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUtleUZldGNoZXJMb2NrKTsKQEAgLTI5Myw3ICsyOTMsNyBAQAogc3RhdHVzX3QgQ2xlYXJLZXlDYXNTZXNzaW9uOjp1cGRhdGVFQ00oCiAgICAgICAgIEtleUZldGNoZXIgKmtleUZldGNoZXIsIHZvaWQgKmVjbSwgc2l6ZV90IHNpemUpIHsKICAgICBpZiAoa2V5RmV0Y2hlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PVF9QUk9WSVNJT05FRDsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA8IGtFY21IZWFkZXJMZW5ndGgpIHsKQEAgLTM0NCw3ICszNDQsNyBAQAogICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgY29uc3QgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywKICAgICAgICAgY29uc3Qgdm9pZCAqc3JjUHRyLCB2b2lkICpkc3RQdHIsIEFTdHJpbmcgKiAvKiBlcnJvckRldGFpbE1zZyAqLykgewogICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX0NBTk5PVF9IQU5ETEU7CiAgICAgfQogCiAgICAgQUVTX0tFWSBjb250ZW50S2V5OwpAQCAtMzU2LDcgKzM1Niw3IEBACiAgICAgICAgIGludDMyX3Qga2V5SW5kZXggPSAoc2NyYW1ibGluZ0NvbnRyb2wgJiAxKTsKICAgICAgICAgaWYgKCFtS2V5SW5mb1trZXlJbmRleF0udmFsaWQpIHsKICAgICAgICAgICAgIEFMT0dFKCJkZWNyeXB0OiBrZXkgJWQgaXMgaW52YWxpZCIsIGtleUluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVDUllQVDsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9DQVNfREVDUllQVDsKICAgICAgICAgfQogICAgICAgICBjb250ZW50S2V5ID0gbUtleUluZm9ba2V5SW5kZXhdLmNvbnRlbnRLZXk7CiAgICAgfQpAQCAtNDIwLDcgKzQyMCw3IEBACiAKICAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJDbGVhcktleURlc2NyYW1ibGVyUGx1Z2luOiBzZXNzaW9uIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgbUNBU1Nlc3Npb24gPSBzZXNzaW9uOwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAKICAgICBpZiAobUNBU1Nlc3Npb24gPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiVW5pbml0aWFsaXplZCBDQVMgc2Vzc2lvbiEiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQ7CiAgICAgfQogCiAgICAgcmV0dXJuIG1DQVNTZXNzaW9uLT5kZWNyeXB0KApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAKaW5kZXggOWNkNzdlOS4uNmUxMDA0YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwCkBAIC00OCwyNCArNDgsMjQgQEAKICAqIEV4dHJhY3QgYSBjbGVhciBrZXkgYXNzZXQgZnJvbSBhIEpTT04gc3RyaW5nLgogICoKICAqIFJldHVybnMgT0sgaWYgYSBjbGVhciBrZXkgYXNzZXQgaXMgZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseSwKLSAqIG9yIEVSUk9SX0RSTV9OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKKyAqIG9yIEVSUk9SX0NBU19OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKICAqIGNsZWFyIGtleSBhc3NldC4KICAqLwogc3RhdHVzX3QgSnNvbkFzc2V0TG9hZGVyOjpleHRyYWN0QXNzZXRGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBTdHJpbmc4JiBqc29uQXNzZXRTdHJpbmcsIEFzc2V0ICphc3NldCkgewogICAgIGlmICghcGFyc2VKc29uQXNzZXRTdHJpbmcoanNvbkFzc2V0U3RyaW5nLCAmbUpzb25PYmplY3RzKSkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfTk9fTElDRU5TRTsKICAgICB9CiAKICAgICBpZiAobUpzb25PYmplY3RzLnNpemUoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PX0xJQ0VOU0U7CiAgICAgfQogCiAgICAgaWYgKCFwYXJzZUpzb25PYmplY3QobUpzb25PYmplY3RzWzBdLCAmbVRva2VucykpCi0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogCiAgICAgaWYgKCFmaW5kS2V5KG1Kc29uT2JqZWN0c1swXSwgYXNzZXQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmgKaW5kZXggMmVmMDZjNC4uNWZiZGVhNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbV9nZW5lcmF0b3IuaApAQCAtMjksNyArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNsZWFya2V5Y2FzIHsKIGVudW0gewotICAgIENMRUFSS0VZX1NUQVRVU19CQVNFID0gRVJST1JfRFJNX1ZFTkRPUl9NQVgsCisgICAgQ0xFQVJLRVlfU1RBVFVTX0JBU0UgPSBFUlJPUl9DQVNfVkVORE9SX01BWCwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJREFTU0VUSUQgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDEsCiAgICAgQ0xFQVJLRVlfU1RBVFVTX0lOVkFMSURTWVNURU1JRCA9IENMRUFSS0VZX1NUQVRVU19CQVNFIC0gMiwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDMsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5tawppbmRleCBjYmY3YmU3Li5lMTU0NWFmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTIxLDEyICsyMSwxMyBAQAogICAgIENsZWFyS2V5RmV0Y2hlclRlc3QuY3BwCiAKIExPQ0FMX01PRFVMRSA6PSBDbGVhcktleUZldGNoZXJUZXN0CitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIAogIyBMT0NBTF9MREZMQUdTIGlzIG5lZWRlZCBoZXJlIGZvciB0aGUgdGVzdCB0byB1c2UgdGhlIHBsdWdpbiwgYmVjYXVzZQogIyB0aGUgcGx1Z2luIGlzIG5vdCBpbiBzdGFuZGFyZCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiBXaXRob3V0IHRoaXMgLnNvCiAjIGxvYWRpbmcgZmFpbHMgYXQgcnVuLXRpbWUgKGxpbmtpbmcgaXMgb2theSkuCiBMT0NBTF9MREZMQUdTIDo9IFwKLSAgICAtV2wsLS1ycGF0aCxcJCR7T1JJR0lOfS8uLi8uLi8uLi9zeXN0ZW0vbGliL21lZGlhY2FzIC1XbCwtLWVuYWJsZS1uZXctZHRhZ3MKKyAgICAtV2wsLS1ycGF0aCxcJCR7T1JJR0lOfS8uLi8uLi8uLi9zeXN0ZW0vdmVuZG9yL2xpYi9tZWRpYWNhcyAtV2wsLS1lbmFibGUtbmV3LWR0YWdzCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYnV0aWxzIGxpYmNsZWFya2V5Y2FzcGx1Z2luIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlicHJvdG9idWYtY3BwLWxpdGUgbGlibG9nCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsKaW5kZXggYTk3ZmFjNi4uYTFkNjFkYSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5tawpAQCAtMjgsNiArMjgsOCBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGlidXRpbHMgbGlibG9nCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gbWVkaWFfcGx1Z2luX2hlYWRlcnMKKwogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEgXApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYWM1N2Q2NS4uMGZjZmM2NCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zNCw0ICszNCw1IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCiB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKaW5kZXggN2Y0NDgxOS4uYWJkMTg4NCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icApAQCAtMjIsNiArMjIsOCBAQAogICAgIHZlbmRvcjogdHJ1ZSwKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJtZWRpYWRybSIsCiAKKyAgICBoZWFkZXJfbGliczogWyJtZWRpYV9wbHVnaW5faGVhZGVycyJdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL09XTkVSUyBiL2luY2x1ZGUvT1dORVJTCmluZGV4IDBlYzc1MjkuLjNjYjZkOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvT1dORVJTCisrKyBiL2luY2x1ZGUvT1dORVJTCkBAIC0xLDUgKzEsNiBAQAogZWxhdXJlbnRAZ29vZ2xlLmNvbQogZ2thc3RlbkBhbmRyb2lkLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQoranRpbmtlckBnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCiBtYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYTA1MzBlNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIGRybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaAppbmRleCBmZGY5OWViLi45ZWZkNzZkIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApAQCAtMTQsMTQgKzE0LDI1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRGVzY3JhbWJsZXI7CisjaWZuZGVmIEFORFJPSURfQVVESU9fQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19DTElFTlRfSAogCi0vKiogQGhpZGUgKi8KLWludGVyZmFjZSBJRGVzY3JhbWJsZXIgewotICAgIHZvaWQgc2V0TWVkaWFDYXNTZXNzaW9uKGluIGJ5dGVbXSBzZXNzaW9uSWQpOwotICAgIGJvb2xlYW4gcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KFN0cmluZyBtaW1lKTsKLSAgICBpbnQgZGVzY3JhbWJsZShpbiBNZWRpYURlc2NyYW1ibGVyLkRlc2NyYW1ibGVJbmZvIGRlc2NyYW1ibGVJbmZvKTsKLSAgICB2b2lkIHJlbGVhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb0NsaWVudCB7CisgcHVibGljOgorICAgIEF1ZGlvQ2xpZW50KCkgOgorICAgICAgICBjbGllbnRVaWQoLTEpLCBjbGllbnRQaWQoLTEpLCBwYWNrYWdlTmFtZSgiIikge30KKworICAgIHVpZF90IGNsaWVudFVpZDsKKyAgICBwaWRfdCBjbGllbnRQaWQ7CisgICAgU3RyaW5nMTYgcGFja2FnZU5hbWU7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaAppbmRleCA1MGUxMmY0Li43NzFmMWI4IDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLi4vLi4vbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAppbmRleCAzMDljMjNkLi5jZTMwYTc4IDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLi4vLi4vbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQ2FzSW1wbC5oIGIvaW5jbHVkZS9tZWRpYS9DYXNJbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNmYxY2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9DYXNJbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDQVNfSU1QTF9IXwotI2RlZmluZSBDQVNfSU1QTF9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5DYXMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXNMaXN0ZW5lcjsKLX0KLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKLXVzaW5nIG5hbWVzcGFjZSBNZWRpYUNhczsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotc3RydWN0IENhc1BsdWdpbjsKLWNsYXNzIFNoYXJlZExpYnJhcnk7Ci0KLWNsYXNzIENhc0ltcGwgOiBwdWJsaWMgQm5DYXMgewotcHVibGljOgotICAgIENhc0ltcGwoY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIpOwotICAgIHZpcnR1YWwgfkNhc0ltcGwoKTsKLQotICAgIHN0YXRpYyB2b2lkIE9uRXZlbnQoCi0gICAgICAgICAgICB2b2lkICphcHBEYXRhLAotICAgICAgICAgICAgaW50MzJfdCBldmVudCwKLSAgICAgICAgICAgIGludDMyX3QgYXJnLAotICAgICAgICAgICAgdWludDhfdCAqZGF0YSwKLSAgICAgICAgICAgIHNpemVfdCBzaXplKTsKLQotICAgIHZvaWQgaW5pdChjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgQ2FzUGx1Z2luICpwbHVnaW4pOwotICAgIHZvaWQgb25FdmVudCgKLSAgICAgICAgICAgIGludDMyX3QgZXZlbnQsCi0gICAgICAgICAgICBpbnQzMl90IGFyZywKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAvLyBJQ2FzIGluaGVyaXRzCi0KLSAgICB2aXJ0dWFsIFN0YXR1cyBzZXRQcml2YXRlRGF0YSgKLSAgICAgICAgICAgIGNvbnN0IENhc0RhdGEmIHB2dERhdGEpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgb3BlblNlc3Npb24oQ2FzU2Vzc2lvbklkKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgY2xvc2VTZXNzaW9uKGNvbnN0IENhc1Nlc3Npb25JZCYgc2Vzc2lvbklkKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHNldFNlc3Npb25Qcml2YXRlRGF0YSgKLSAgICAgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCYgc2Vzc2lvbklkLAotICAgICAgICAgICAgY29uc3QgQ2FzRGF0YSYgcHZ0RGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBwcm9jZXNzRWNtKAotICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkJiBzZXNzaW9uSWQsIGNvbnN0IFBhcmNlbGFibGVDYXNEYXRhJiBlY20pIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcHJvY2Vzc0VtbShjb25zdCBQYXJjZWxhYmxlQ2FzRGF0YSYgZW1tKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHNlbmRFdmVudCgKLSAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiAmZXZlbnREYXRhKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHByb3Zpc2lvbihjb25zdCBTdHJpbmcxNiYgcHJvdmlzaW9uU3RyaW5nKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHJlZnJlc2hFbnRpdGxlbWVudHMoCi0gICAgICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiAmcmVmcmVzaERhdGEpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcmVsZWFzZSgpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBQbHVnaW5Ib2xkZXI7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbUxpYnJhcnk7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBtUGx1Z2luSG9sZGVyOwotICAgIHNwPElDYXNMaXN0ZW5lcj4gbUxpc3RlbmVyOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2FzSW1wbCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBDQVNfSU1QTF9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9EZXNjcmFtYmxlckltcGwuaCBiL2luY2x1ZGUvbWVkaWEvRGVzY3JhbWJsZXJJbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMjEyYWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9EZXNjcmFtYmxlckltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERFU0NSQU1CTEVSX0lNUExfSF8KLSNkZWZpbmUgREVTQ1JBTUJMRVJfSU1QTF9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5EZXNjcmFtYmxlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7Ci11c2luZyBuYW1lc3BhY2UgTWVkaWFEZXNjcmFtYmxlcjsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotc3RydWN0IERlc2NyYW1ibGVyUGx1Z2luOwotY2xhc3MgU2hhcmVkTGlicmFyeTsKLQotY2xhc3MgRGVzY3JhbWJsZXJJbXBsIDogcHVibGljIEJuRGVzY3JhbWJsZXIgewotcHVibGljOgotICAgIERlc2NyYW1ibGVySW1wbChjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgRGVzY3JhbWJsZXJQbHVnaW4gKnBsdWdpbik7Ci0gICAgdmlydHVhbCB+RGVzY3JhbWJsZXJJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBzZXRNZWRpYUNhc1Nlc3Npb24oCi0gICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgbWltZSwgYm9vbCAqcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGRlc2NyYW1ibGUoCi0gICAgICAgICAgICBjb25zdCBEZXNjcmFtYmxlSW5mbyYgZGVzY3JhbWJsZUluZm8sIGludDMyX3QgKnJlc3VsdCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyByZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbUxpYnJhcnk7Ci0gICAgRGVzY3JhbWJsZXJQbHVnaW4gKm1QbHVnaW47Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXNjcmFtYmxlckltcGwpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gREVTQ1JBTUJMRVJfSU1QTF9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUNhc0RlZnMuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFDYXNEZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNWE5NjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYUNhc0RlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0NBU19ERUZTX0hfCi0jZGVmaW5lIE1FRElBX0NBU19ERUZTX0hfCi0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Nhc0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9EZXNjcmFtYmxlckFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotY2xhc3MgSU1lbW9yeTsKLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLW5hbWVzcGFjZSBNZWRpYUNhcyB7Ci1jbGFzcyBQYXJjZWxhYmxlQ2FzRGF0YSA6IHB1YmxpYyBDYXNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUGFyY2VsYWJsZSB7Ci1wdWJsaWM6Ci0gICAgUGFyY2VsYWJsZUNhc0RhdGEoKSB7fQotICAgIFBhcmNlbGFibGVDYXNEYXRhKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSA6Ci0gICAgICAgIENhc0RhdGEoZGF0YSwgZGF0YSArIHNpemUpIHt9Ci0gICAgdmlydHVhbCB+UGFyY2VsYWJsZUNhc0RhdGEoKSB7fQotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYXJjZWxhYmxlQ2FzRGF0YSk7Ci19OwotCi1jbGFzcyBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvciA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKLXB1YmxpYzoKLSAgICBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcihpbnQzMl90IENBX3N5c3RlbV9pZCwgY29uc3QgY2hhciAqbmFtZSkKLSAgICAgICAgOiBtQ0FTeXN0ZW1JZChDQV9zeXN0ZW1faWQpLCBtTmFtZShuYW1lKSB7fQotCi0gICAgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoKSA6IG1DQVN5c3RlbUlkKDApIHt9Ci0KLSAgICBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcihQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvciYmIGRlc2MpID0gZGVmYXVsdDsKLQotICAgIHZpcnR1YWwgflBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKCkge30KLQotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBpbnQzMl90IG1DQVN5c3RlbUlkOwotICAgIFN0cmluZzE2IG1OYW1lOwotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKTsKLX07Ci19Ci0KLW5hbWVzcGFjZSBNZWRpYURlc2NyYW1ibGVyIHsKLWNsYXNzIERlc2NyYW1ibGVJbmZvIDogcHVibGljIFBhcmNlbGFibGUgewotcHVibGljOgotICAgIGVudW0gRGVzdGluYXRpb25UeXBlIHsKLSAgICAgICAga0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlciwgICAgLy8gbm9uLXNlY3VyZQotICAgICAgICBrRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlICAvLyBzZWN1cmUKLSAgICB9OwotCi0gICAgRGVzdGluYXRpb25UeXBlIGRzdFR5cGU7Ci0gICAgRGVzY3JhbWJsZXJQbHVnaW46OlNjcmFtYmxpbmdDb250cm9sIHNjcmFtYmxpbmdDb250cm9sOwotICAgIHNpemVfdCBudW1TdWJTYW1wbGVzOwotICAgIERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXM7Ci0gICAgc3A8SU1lbW9yeT4gc3JjTWVtOwotICAgIGludDMyX3Qgc3JjT2Zmc2V0OwotICAgIHZvaWQgKmRzdFB0cjsKLSAgICBpbnQzMl90IGRzdE9mZnNldDsKLQotICAgIERlc2NyYW1ibGVJbmZvKCk7Ci0gICAgdmlydHVhbCB+RGVzY3JhbWJsZUluZm8oKTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXNjcmFtYmxlSW5mbyk7Ci19OwotfQotCi19IC8vIG5hbWVzcGFjZSBtZWRpYQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KLSNlbmRpZiAvLyBNRURJQV9DQVNfREVGU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmggYi9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43ZDlhN2EwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsIGIvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbAppbmRleCAzN2UyYzM5Li5mNDAwNTgyIDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsCisrKyBiL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8gYi9pbmNsdWRlL21lZGlhL25iYWlvCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA2N2QwYmE2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41NTg0MWU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmY1YmNjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQzYmZhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOGExM2I2YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI3NTBmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40ZWE0M2JlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjMwZjQyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZmY2YTE1MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jMzU0MDFlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uN2FjZmM5MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hNGJiYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY0YjIxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzRhM2IwNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaCBiL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMDZkMGFlOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKQEAgLTAsMCArMSBAQAorL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9wYXdpbi9tYXN0ZXIvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmE4NzVlOGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtMCwwICsxIEBACisvdXNyL2xvY2FsL2dvb2dsZS9ob21lL3Bhd2luL21hc3Rlci9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhL29teC8xLjAvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teC5oIGIvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4xOTZiMzA2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaApAQCAtMCwwICsxIEBACisvdXNyL2xvY2FsL2dvb2dsZS9ob21lL3Bhd2luL21hc3Rlci9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhL29teC8xLjAvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214QnVmZmVyU291cmNlLmggYi9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjgyMzdjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvcGF3aW4vbWFzdGVyL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEvb214LzEuMC9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmggYi9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mMzBkNTljCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKQEAgLTAsMCArMSBAQAorL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9wYXdpbi9tYXN0ZXIvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhPYnNlcnZlci5oIGIvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjFiODYxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE9ic2VydmVyLmgKQEAgLTAsMCArMSBAQAorL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9wYXdpbi9tYXN0ZXIvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IDlkYTVlZjMuLmZmNDQwYmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtNTY4LDYgKzU2OCw5IEBACiAgICAgLy8gd2hpY2ggbWF5IGluY2x1ZGUgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpOwogCisgICAgLy8gU2FmZSBmcmFtZXMgcmVhZHkgcXVlcnkgdXNlZCBieSBkdW1wKCkgLSB0aGlzIGhhcyBubyBzaWRlIGVmZmVjdHMuCisgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdDsKKwogICAgIC8vIEN1cnJlbnRseSBBdWRpb0ZsaW5nZXIgd2lsbCBjYWxsIGZyYW1lc1JlYWR5KCkgZm9yIGEgZmFzdCB0cmFjayBmcm9tIHR3byB0aHJlYWRzOgogICAgIC8vIEZhc3RNaXhlciB0aHJlYWQsIGFuZCBub3JtYWwgbWl4ZXIgdGhyZWFkLiAgVGhpcyBpcyBkYW5nZXJvdXMsIGFzIHRoZSBwcm94eSBpcyBpbnRlbmRlZAogICAgIC8vIHRvIGJlIGNhbGxlZCBmcm9tIGF0IG1vc3Qgb25lIHRocmVhZCBvZiBzZXJ2ZXIsIGFuZCBvbmUgdGhyZWFkIG9mIGNsaWVudC4KQEAgLTYyMCw2ICs2MjMsNyBAQAogCiBwdWJsaWM6CiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpOworICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBmcmFtZXNSZWFkeUlzQ2FsbGVkQnlNdWx0aXBsZVRocmVhZHMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc3ZjhmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElSYWRpbyA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0KLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFJhZGlvKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5SYWRpbzogcHVibGljIEJuSW50ZXJmYWNlPElSYWRpbz4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVJBRElPX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvQ2xpZW50LmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpb0NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDYyYWQ2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSVJhZGlvQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLQotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUmFkaW9DbGllbnQpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KSA9IDA7Ci0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5SYWRpb0NsaWVudCA6IHB1YmxpYyBCbkludGVyZmFjZTxJUmFkaW9DbGllbnQ+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9JUmFkaW9TZXJ2aWNlLmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpb1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NmRkNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JhZGlvL0lSYWRpb1NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19TRVJWSUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJUmFkaW87Ci1jbGFzcyBJUmFkaW9DbGllbnQ7Ci0KLWNsYXNzIElSYWRpb1NlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotCi0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShSYWRpb1NlcnZpY2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCByYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElSYWRpbz4mIHJhZGlvKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuUmFkaW9TZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVJhZGlvU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVJBRElPX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9SYWRpby5oIGIvaW5jbHVkZS9yYWRpby9SYWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjRkZDJmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vUmFkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0gKLQotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHJhZGlvL1JhZGlvQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVtb3J5RGVhbGVyOwotCi1jbGFzcyBSYWRpbyA6IHB1YmxpYyBCblJhZGlvQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci17Ci1wdWJsaWM6Ci0KLSAgICB2aXJ0dWFsIH5SYWRpbygpOwotCi0gICAgc3RhdGljICBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKLSAgICBzdGF0aWMgIHNwPFJhZGlvPiBhdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+JiBjYWxsYmFjayk7Ci0KLQotICAgICAgICAgICAgdm9pZCBkZXRhY2goKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGNhbmNlbCgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCk7Ci0KLSAgICAgICAgICAgIC8vIEJwUmFkaW9DbGllbnQKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7Ci0KLSAgICAgICAgICAgIC8vSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwotCi1wcml2YXRlOgotICAgICAgICAgICAgUmFkaW8ocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+Jik7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3Qgc3A8SVJhZGlvU2VydmljZT4gZ2V0UmFkaW9TZXJ2aWNlKCk7Ci0KLSAgICAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgICAgICAgICAgc3A8SVJhZGlvPiAgICAgICAgICAgICAgbUlSYWRpbzsKLSAgICAgICAgICAgIHNwPFJhZGlvQ2FsbGJhY2s+ICAgICAgIG1DYWxsYmFjazsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfUkFESU9fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9SYWRpb0NhbGxiYWNrLmggYi9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3ZjFhNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fQ0FMTEJBQ0tfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0NBTExCQUNLX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBSYWRpb0NhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLQotICAgICAgICAgICAgUmFkaW9DYWxsYmFjaygpIHt9Ci0gICAgdmlydHVhbCB+UmFkaW9DYWxsYmFjaygpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChzdHJ1Y3QgcmFkaW9fZXZlbnQgKmV2ZW50KSA9IDA7Ci0KLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfUkFESU9fQ0FMTEJBQ0tfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tayBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKaW5kZXggYWZkMTE4OS4uM2VlNzQ5NCAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCkBAIC0xNCw3ICsxNCw2IEBACiAJbGlibG9nIFwKIAlsaWJtZWRpYWxvZ3NlcnZpY2UgXAogCWxpYm5iYWlvIFwKLQlsaWJyYWRpb3NlcnZpY2UgXAogCWxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UgXAogCWxpYnV0aWxzIFwKIAlsaWJod2JpbmRlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAgYi9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcAppbmRleCBlZTAyZDIzLi4zNGM2MjliIDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcAorKysgYi9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcApAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJNZWRpYUxvZ1NlcnZpY2UuaCIKLSNpbmNsdWRlICJSYWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CkBAIC0xMzMsNyArMTMyLDYgQEAKICAgICAgICAgQXVkaW9GbGluZ2VyOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIEFBdWRpb1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7Ci0gICAgICAgIFJhZGlvU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKaW5kZXggZjUzOWJhOS4uNmU2MGYyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKQEAgLTE2LDEyICsxNiwxNCBAQAogICAgIG5hbWU6ICJsaWJBQXVkaW9faGVhZGVycyIsCiAgICAgZnJvbTogImluY2x1ZGUiLAogICAgIHRvOiAiIiwKLSAgICBzcmNzOiBbImluY2x1ZGUvYWF1ZGlvLyouaCJdLAorICAgIC8vIG9taXQgQUF1ZGlvVGVzdGluZy5oOyBzdXBwbGllZCBzZXBhcmF0ZWx5IHRvIHRob3NlIHdobyBuZWVkIGl0CisgICAgc3JjczogWyJpbmNsdWRlL2FhdWRpby9BQXVkaW8uaCJdLAogICAgIGxpY2Vuc2U6ICJpbmNsdWRlL2FhdWRpby9OT1RJQ0UiLAogfQogCiBuZGtfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmFhdWRpbyIsCisgICAgLy8gZGVsaWJlcmF0ZWx5IGluY2x1ZGVzIHN5bWJvbHMgZnJvbSBBQXVkaW9UZXN0aW5nLmgKICAgICBzeW1ib2xfZmlsZTogImxpYmFhdWRpby5tYXAudHh0IiwKICAgICBmaXJzdF92ZXJzaW9uOiAiMjYiLAogICAgIHVudmVyc2lvbmVkX3VudGlsOiAiY3VycmVudCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vT1dORVJTIGIvbWVkaWEvbGliYWF1ZGlvL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQ1MWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL09XTkVSUwpAQCAtMCwwICsxIEBACitwaGlsYnVya0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAKaW5kZXggOTEwYjEwYy4uZWRmNjQ0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcApAQCAtNzQsNyArNzQsNyBAQAogICAgIGRldmljZUlkID0gQUF1ZGlvU3RyZWFtX2dldERldmljZUlkKGFhdWRpb1N0cmVhbSk7CiAgICAgcHJpbnRmKCJkZXZpY2VJZCA9ICVkXG4iLCBkZXZpY2VJZCk7CiAKLSAgICBhY3R1YWxTYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKGFhdWRpb1N0cmVhbSk7CisgICAgYWN0dWFsU2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChhYXVkaW9TdHJlYW0pOwogICAgIHByaW50ZigiU2FtcGxlc1BlckZyYW1lID0gJWRcbiIsIGFjdHVhbFNhbXBsZXNQZXJGcmFtZSk7CiAgICAgYWN0dWFsU2FtcGxlUmF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKGFhdWRpb1N0cmVhbSk7CiAgICAgcHJpbnRmKCJTYW1wbGVzUGVyRnJhbWUgPSAlZFxuIiwgYWN0dWFsU2FtcGxlUmF0ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCmluZGV4IGNiMTJmZGEuLjZiZTkxMTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgICAgIGlmIChtU3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChtU3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQobVN0cmVhbSk7OwogICAgIH0KICAgICAvKioKICAgICAgKiBPbmx5IGNhbGwgdGhpcyBhZnRlciBvcGVuKCkgaGFzIGJlZW4gY2FsbGVkLgpAQCAtMTc5LDcgKzE3OSw3IEBACiAKICAgICAvLyBXcml0ZSB6ZXJvIGRhdGEgdG8gZmlsbCB1cCB0aGUgYnVmZmVyIGFuZCBwcmV2ZW50IHVuZGVycnVucy4KICAgICBhYXVkaW9fcmVzdWx0X3QgcHJpbWUoKSB7Ci0gICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShtU3RyZWFtKTsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KG1TdHJlYW0pOwogICAgICAgICBjb25zdCBpbnQgbnVtRnJhbWVzID0gMzI7IC8vIGFyYml0cmFyeQogICAgICAgICBmbG9hdCB6ZXJvc1tudW1GcmFtZXMgKiBzYW1wbGVzUGVyRnJhbWVdOwogICAgICAgICBtZW1zZXQoemVyb3MsIDAsIHNpemVvZih6ZXJvcykpOwpAQCAtMjUyLDcgKzI1Miw3IEBACiAgICAgfQogICAgIFBlYWtUcmFja2VyRGF0YV90ICpkYXRhID0gKFBlYWtUcmFja2VyRGF0YV90ICopIHVzZXJEYXRhOwogICAgIC8vIHByaW50ZigiTXlDYWxsYmFja1Byb2MoKTogZnJhbWVDb3VudCA9ICVkXG4iLCBudW1GcmFtZXMpOwotICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShzdHJlYW0pOworICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChzdHJlYW0pOwogICAgIGZsb2F0IHNhbXBsZTsKICAgICAvLyBUaGlzIGNvZGUgYXNzdW1lIG1vbm8gb3Igc3RlcmVvLgogICAgIHN3aXRjaCAoQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChzdHJlYW0pKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmggYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKaW5kZXggZTE4ODZhYy4uZTVmMGRlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaApAQCAtMjM0LDE0ICsyMzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQpOwogCiAvKioKLSAqCi0gKiBAZGVwcmVjYXRlZCB1c2UgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoKQotICovCi0vLyBUT0RPIHJlbW92ZSBhcyBzb29uIGFzIHRoZSBOREsgYW5kIE9TIGFyZSBpbiBzeW5jLCBiZWZvcmUgUkMxCi1BQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSk7Ci0KLS8qKgogICogUmVxdWVzdCBhIHNhbXBsZSBkYXRhIGZvcm1hdCwgZm9yIGV4YW1wbGUgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LgogICoKICAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX1VOU1BFQ0lGSUVELgpAQCAtNzI5LDE1ICs3MjEsNiBAQAogQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOwogCiAvKioKLSAqIFRoZSBzYW1wbGVzUGVyRnJhbWUgaXMgYWxzbyBrbm93biBhcyBjaGFubmVsQ291bnQuCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoKQotICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gYWN0dWFsIHNhbXBsZXMgcGVyIGZyYW1lCi0gKi8KLUFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKLQotLyoqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBhY3R1YWwgZGV2aWNlIElECiAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dCBiL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dAppbmRleCAyYmE1MjUwLi5iOTAxMmU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vbGliYWF1ZGlvLm1hcC50eHQKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0CkBAIC0xMSw3ICsxMSw2IEBACiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRFcnJvckNhbGxiYWNrOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlUmF0ZTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZTsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudDsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdDsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlOwpAQCAtMzUsNyArMzQsNiBAQAogICAgIEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzOwogICAgIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQ7CiAgICAgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGU7Ci0gICAgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZTsKICAgICBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50OwogICAgIEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGU7CiAgICAgQUF1ZGlvU3RyZWFtX2dldERldmljZUlkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKaW5kZXggM2Y1ZGU3Ny4uY2E0MjQ0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCkBAIC0xNTAsMTMgKzE1MCw2IEBACiAgICAgc3RyZWFtQnVpbGRlci0+c2V0U2FtcGxlc1BlckZyYW1lKGNoYW5uZWxDb3VudCk7CiB9CiAKLUFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQotewotICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwotICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpOwotfQotCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pCiB7CkBAIC0zNTcsMTIgKzM1MCw2IEBACiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKIH0KIAotQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCi17Ci0gICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICByZXR1cm4gYXVkaW9TdHJlYW0tPmdldFNhbXBsZXNQZXJGcmFtZSgpOwotfQotCiBBQVVESU9fQVBJIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCAyZjcxMGJkLi4yMTFiZDdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC0xMjk3LDcgKzEyOTcsNyBAQAogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKICAgICByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiID0gTlVMTDsKQEAgLTEzMDcsNyArMTMwNyw3IEBACiAgICAgfQogCiAgICAgaWYgKGNiICE9IE5VTEwpIHsKLSAgICAgICAgY2IoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IGIwYjAxZGIuLjMxZTFlMmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgpAQCAtNjIsMTEgKzYzLDYgQEAKICAgICByZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfbnNlYyAvIDEwMDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBjb252ZXJ0VGltZXNwZWNUb05zKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdHYpCi17Ci0gICAgcmV0dXJuIHR2LnR2X3NlYyAqIChsb25nIGxvbmcpTkFOT1NfUEVSX1NFQ09ORCArIHR2LnR2X25zZWM7Ci19Ci0KIC8vIGN1cnJlbnQgbW9ub3RvbmljIHRpbWUgaW4gbWljcm9zZWNvbmRzLgogc3RhdGljIGludDY0X3QgZ2V0Tm93VXMoKQogewpAQCAtMjU2Myw3ICsyNTU5LDcgQEAKICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIHRpbWVzdGFtcCB0aW1lIGV2ZW4gd2hlbiBwYXVzZWQuCiAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQgLyogbm90IG5lZWRlZDogU1RBVEVfUEFVU0VEX1NUT1BQSU5HICovKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGF0ID0gY29udmVydFRpbWVzcGVjVG9Ocyh0aW1lc3RhbXAubVRpbWUpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGF0ID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZXN0YW1wLm1UaW1lKTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWcgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldHMubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10gPCAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0cy5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxfTEFTVEtFUk5FTE9LXSA8IDApCkBAIC0yNjk1LDggKzI2OTEsOSBAQAogICAgIC8vIFRoaXMgaXMgc29tZXRpbWVzIGNhdXNlZCBieSBlcnJhdGljIHJlcG9ydHMgb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgQUxTQSBkcml2ZXJzLgogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKHByZXZpb3VzVGltZXN0YW1wVmFsaWQpIHsKLSAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcHJldmlvdXNUaW1lTmFub3MgPSBjb252ZXJ0VGltZXNwZWNUb05zKG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZSk7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lTmFub3MgPSBjb252ZXJ0VGltZXNwZWNUb05zKHRpbWVzdGFtcC5tVGltZSk7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHByZXZpb3VzVGltZU5hbm9zID0KKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY3VycmVudFRpbWVOYW5vcyA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWVzdGFtcC5tVGltZSk7CiAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IHByZXZpb3VzVGltZU5hbm9zKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coInJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1cnJlbnRUaW1lTmFub3MsIChsb25nIGxvbmcpcHJldmlvdXNUaW1lTmFub3MpOwpAQCAtMjcyNiw3ICsyNzIzLDcgQEAKICNpZiAwCiAgICAgICAgICAgICAvLyBVbmNvbW1lbnQgdGhpcyB0byB2ZXJpZnkgYXVkaW8gdGltZXN0YW1wIHJhdGUuCiAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUaW1lc3BlY1RvTnModGltZXN0YW1wLm1UaW1lKSAtIHByZXZpb3VzVGltZU5hbm9zOworICAgICAgICAgICAgICAgICAgICBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lc3RhbXAubVRpbWUpIC0gcHJldmlvdXNUaW1lTmFub3M7CiAgICAgICAgICAgICBpZiAoZGVsdGFUaW1lICE9IDApIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGNvbXB1dGVkU2FtcGxlUmF0ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uICogKGxvbmcgbG9uZylOQU5PU19QRVJfU0VDT05EIC8gZGVsdGFUaW1lOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCAyY2U2YzYzLi5lNDk5NDViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMzYsNyArMzYsNyBAQAogLy8gYSB2YWx1ZSBiZXR3ZWVuICJvdGhlciIgKyAxIGFuZCAib3RoZXIiICsgSU5UMzJfTUFYLCB0aGUgY2hvaWNlIG9mCiAvLyB3aGljaCBuZWVkcyB0byBiZSB0aGUgImxlYXN0IHJlY2VudGx5IHVzZWQiIHNlcXVlbmNlIHZhbHVlIGZvciAic2VsZiIuCiAvLyBJbiBnZW5lcmFsLCB0aGlzIG1lYW5zIChuZXdfc2VsZikgcmV0dXJuZWQgaXMgbWF4KHNlbGYsIG90aGVyKSArIDEuCi0KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogc3RhdGljIHVpbnQzMl90IGluY3JlbWVudFNlcXVlbmNlKHVpbnQzMl90IHNlbGYsIHVpbnQzMl90IG90aGVyKSB7CiAgICAgaW50MzJfdCBkaWZmID0gKGludDMyX3QpIHNlbGYgLSAoaW50MzJfdCkgb3RoZXI7CiAgICAgaWYgKGRpZmYgPj0gMCAmJiBkaWZmIDwgSU5UMzJfTUFYKSB7CkBAIC0zODksNiArMzg5LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBBdWRpb1RyYWNrQ2xpZW50UHJveHk6OmZsdXNoKCkKIHsKICAgICAvLyBUaGlzIHdvcmtzIGZvciBtRnJhbWVDb3VudFAyIDw9IDJeMzAKQEAgLTgzMiw2ICs4MzMsMjUgQEAKICAgICByZXR1cm4gZmlsbGVkOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKK3NpemVfdCBBdWRpb1RyYWNrU2VydmVyUHJveHk6OmZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0Cit7CisgICAgaWYgKG1Jc1NodXRkb3duKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKKyAgICBjb25zdCBpbnQzMl90IGZsdXNoID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubUZsdXNoKTsKKyAgICBpZiAoZmx1c2ggIT0gbUZsdXNoKSB7CisgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKKyAgICB9CisgICAgY29uc3QgaW50MzJfdCByZWFyID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIpOworICAgIGNvbnN0IHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CisgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgeworICAgICAgICByZXR1cm4gMDsgLy8gZXJyb3IgY29uZGl0aW9uLCBzaWxlbnRseSByZXR1cm4gMC4KKyAgICB9CisgICAgcmV0dXJuIGZpbGxlZDsKK30KKwogYm9vbCAgQXVkaW9UcmFja1NlcnZlclByb3h5OjpzZXRTdHJlYW1FbmREb25lKCkgewogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIGJvb2wgb2xkID0KQEAgLTg0Myw2ICs4NjMsNyBAQAogICAgIHJldHVybiBvbGQ7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBBdWRpb1RyYWNrU2VydmVyUHJveHk6OnRhbGx5VW5kZXJydW5GcmFtZXModWludDMyX3QgZnJhbWVDb3VudCkKIHsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKQEAgLTkwMCw2ICs5MjEsMTEgQEAKICAgICByZXR1cm4gbUZyYW1lc1JlYWR5U2FmZTsKIH0KIAorc2l6ZV90IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6ZnJhbWVzUmVhZHlTYWZlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUZyYW1lc1JlYWR5U2FmZTsKK30KKwogc3RhdHVzX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojp1cGRhdGVTdGF0ZVdpdGhMb29wKAogICAgICAgICBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgKmxvY2FsU3RhdGUsIGNvbnN0IFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSAmdXBkYXRlKSBjb25zdAogewpAQCAtOTkzLDYgKzEwMTksNyBAQAogICAgIHJldHVybiAoc3NpemVfdCkgbVN0YXRlLm1Qb3NpdGlvbjsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCiBzdGF0dXNfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCkKIHsKICAgICBpZiAobUlzU2h1dGRvd24pIHsKQEAgLTEwMzcsNiArMTA2NCw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpyZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKQogewogICAgIHNpemVfdCBzdGVwQ291bnQgPSBidWZmZXItPm1GcmFtZUNvdW50OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAppbmRleCA5OGEwNTIxLi5hZDdmMWRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcApAQCAtNDgsNiArNDgsMTggQEAKICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNvbmZpZy0+Zm9ybWF0KTsKIH0KIAoraW5saW5lIHZvaWQgcmVhZFJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSwgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKKyAgICBjbGllbnRJbmZvLT51aWQgPSAodWlkX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgIGNsaWVudEluZm8tPnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOworICAgIGNsaWVudEluZm8tPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKK30KKworaW5saW5lIHZvaWQgd3JpdGVSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChQYXJjZWwmIGRhdGEsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7CisgICAgZGF0YS53cml0ZVVpbnQzMigodWludDMyX3QpIGNsaWVudEluZm8tPnVpZCk7CisgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRJbmZvLT5zZXNzaW9uKTsKKyAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNvdXJjZSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGNsYXNzIEJwQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50IDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+CiB7CkBAIC04MCwxNCArOTIsMTMgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE1JWF9TVEFURV9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIAotICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZXZlbnQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzb3VyY2UpOworICAgICAgICB3cml0ZVJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGRhdGEsIGNsaWVudEluZm8pOwogICAgICAgICB3cml0ZUF1ZGlvQ29uZmlnQmFzZVRvUGFyY2VsKGRhdGEsIGNsaWVudENvbmZpZyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgZGV2aWNlQ29uZmlnKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBhdGNoSGFuZGxlKTsKQEAgLTEyMywxNCArMTM0LDE0IEBACiAgICAgY2FzZSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgZXZlbnQgPSAoaW50KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgY2xpZW50SW5mbzsKICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY2xpZW50Q29uZmlnOwogICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWc7CisgICAgICAgICAgICByZWFkUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgJmNsaWVudEluZm8pOwogICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmNsaWVudENvbmZpZyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmZGV2aWNlQ29uZmlnKTsKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsICZjbGllbnRDb25maWcsICZkZXZpY2VDb25maWcsCisgICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZjbGllbnRJbmZvLCAmY2xpZW50Q29uZmlnLCAmZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyYjlmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2drYXN0ZW5AZ29vZ2xlLmNvbQoram10cml2aUBnb29nbGUuY29tCittbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggMmUzOWQyMy4uNGQ1YjMxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMzMsNyArMzMsNyBAQAogCiB0eXBlZGVmIHZvaWQgKCphdWRpb19lcnJvcl9jYWxsYmFjaykoc3RhdHVzX3QgZXJyKTsKIHR5cGVkZWYgdm9pZCAoKmR5bmFtaWNfcG9saWN5X2NhbGxiYWNrKShpbnQgZXZlbnQsIFN0cmluZzggcmVnSWQsIGludCB2YWwpOwotdHlwZWRlZiB2b2lkICgqcmVjb3JkX2NvbmZpZ19jYWxsYmFjaykoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgaW50IHNvdXJjZSwKK3R5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogCkBAIC00NDAsOCArNDQwLDkgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKICAgICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaAppbmRleCBkOTRhZDAwLi5lMGQyNDk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaApAQCAtMjYsNiArMjYsMTYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHsKKyAgICB1aWRfdCB1aWQ7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHJlY29yZF9jbGllbnRfaW5mb190OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNsYXNzIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgSUludGVyZmFjZQogewogcHVibGljOgpAQCAtMzgsOCArNDgsOCBAQAogICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBtaXhpbmcgc3RhdGUgb2YgYSBzcGVjaWZpYyBtaXggaW4gYSBkeW5hbWljIGF1ZGlvIHBvbGljeQogICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKSA9IDA7CiAgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24KLSAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5tawppbmRleCBlNTkyMTY5Li44Mjc5MDhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQubWsKQEAgLTMsNiArMyw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW91dGlscyBcCiAgICAgbGliY3V0aWxzICAgXAogICAgIGxpYmxvZyAgICAgIFwKICAgICBsaWJ1dGlscyAgICBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwCmluZGV4IDcxZmJkOTguLjQ5ZWY5OTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwCkBAIC05OCw3ICs5OCw4IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpIHsKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgewogfQogCiBEZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKQEAgLTEyMCwyNCArMTIxLDIxIEBACiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBwcmltYXJ5RGV2ID0gSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKG1EZXZpY2UpOwotICAgIGlmIChwcmltYXJ5RGV2ID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBwcmltYXJ5RGV2LT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBwcmltYXJ5RGV2ID0gSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKG1EZXZpY2UpOwotICAgIGlmIChwcmltYXJ5RGV2ID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgcHJpbWFyeURldi0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gcHJpbWFyeURldi0+Z2V0TWFzdGVyVm9sdW1lKAorICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAogICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7CiAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKQEAgLTE0OSw5ICsxNDcsOCBAQAogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgcHJpbWFyeURldi0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5oCmluZGV4IDlkYTAyYTQuLjg2NTFiNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmgKQEAgLTE4LDExICsxOCwxMyBAQAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KIAogI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xMTAsNiArMTEyLDcgQEAKICAgcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOwogICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7CisgICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgogCiAgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgogICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMgYi9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NmFiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2tyb2NhcmRAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcAppbmRleCA0Mjc4NWQ1Li4xNzZhYmVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtNDgsNiArNDgsMTggQEAKICAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCiAgICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAogICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKKworICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KKyAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgeworICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgeworICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KIH0KIAogU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7CkBAIC0xMzUsNiArMTQ3LDcgQEAKICAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwogfQogCkBAIC0zMTEsNyArMzI0LDcgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKKyAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAogICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAogICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKICAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47CkBAIC0zMjAsNiArMzMzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOwogICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKApAQCAtNTgwLDcgKzU5NSw3IEBACiAgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOwogICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OlJFQUQ7CiAgICAgcGFyYW1zLnBhcmFtcy5yZWFkID0gYnl0ZXM7Ci0gICAgcmV0dXJuIGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCisgICAgc3RhdHVzID0gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJyZWFkIiwKICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF2YWlsVG9SZWFkID0gbURhdGFNUS0+YXZhaWxhYmxlVG9SZWFkKCk7CiAgICAgICAgICAgICAgICAgaWYgKCFtRGF0YU1RLT5yZWFkKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpLCBzdGQ6Om1pbihieXRlcywgYXZhaWxUb1JlYWQpKSkgewpAQCAtNTkxLDYgKzYwNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKICAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKICAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oCmluZGV4IGE3ZGYyNzYuLmE2OWNjZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KIAogI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW07CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOwpAQCAtMTAzLDYgKzEwNCw5IEBACiAKICAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKIAorICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKICAgcHJpdmF0ZToKICAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7CiAgICAgSVN0cmVhbSAqbVN0cmVhbTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcAppbmRleCAwNTgwMGEwLi5kYzE3ZjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuY3BwCkBAIC0yNyw3ICsyNywxNSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBtRGV2aWNlKGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7CisgICAgICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7CisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7CisgICAgfQogfQogCiBTdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgewpAQCAtOTUsNyArMTAzLDkgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7CkBAIC0xMzMsNiArMTQzLDcgQEAKICAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CiAgICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgewogICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKndyaXR0ZW4gPSAwOwpAQCAtMjY2LDYgKzI3Nyw3IEBACiAgICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKICAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKICAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0gZWxzZSB7CiAgICAgICAgICpyZWFkID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oCmluZGV4IDhjOTZjMWYuLmM3MTM2ZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAogCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04Myw2ICs4NCw5IEBACiAKICAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKIAorICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKICAgcHJpdmF0ZToKICAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtUG93ZXJMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzhiMWFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtUG93ZXJMb2cuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvUG93ZXJMb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmVhbVBvd2VyTG9nIHsKK3B1YmxpYzoKKyAgICBTdHJlYW1Qb3dlckxvZygpIDoKKyAgICAgICAgbUlzVXNlckRlYnVnT3JFbmdCdWlsZChpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkpLAorICAgICAgICBtUG93ZXJMb2cobnVsbHB0ciksCisgICAgICAgIG1GcmFtZVNpemUoMCkgeworICAgICAgICAvLyB1c2UgaW5pdCgpIHRvIHNldCB1cCB0aGUgcG93ZXIgbG9nLgorICAgIH0KKworICAgIH5TdHJlYW1Qb3dlckxvZygpIHsKKyAgICAgICAgcG93ZXJfbG9nX2Rlc3Ryb3kobVBvd2VyTG9nKTsgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgIG1Qb3dlckxvZyA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQSBvbmUtdGltZSBpbml0aWFsaXphdGlvbiAoZG8gbm90IGNhbGwgdHdpY2UpIGJlZm9yZSB1c2luZyBTdHJlYW1Qb3dlckxvZy4KKyAgICB2b2lkIGluaXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgICAgICBpZiAobVBvd2VyTG9nID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IEEgd2F5IHRvIGdldCBjaGFubmVsIGNvdW50IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbCBtYXNrcworICAgICAgICAgICAgLy8gYnV0IGRvZXMgbm90IGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBjaGFubmVsIG1hc2suCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spKTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgICAgICBpZiAobUZyYW1lU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzYW1wbGVSYXRlICoga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2cgPSBwb3dlcl9sb2dfY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gbVBvd2VyTG9nIG1heSBiZSBOVUxMIChub3QgdGhlIHJpZ2h0IGJ1aWxkLCBmb3JtYXQgbm90IGFjY2VwdGVkLCBldGMuKS4KKyAgICB9CisKKyAgICAvLyBEdW1wIHRoZSBwb3dlciBsb2cgdG8gZmQuCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3QgeworICAgICAgICAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgKHZvaWQpcG93ZXJfbG9nX2R1bXAoCisgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBmZCwgIiAgICAgICIgLyogcHJlZml4ICovLCBrUG93ZXJMb2dMaW5lcywgMCAvKiBsaW1pdF9ucyAqLyk7CisgICAgfQorCisgICAgLy8gTG9nIHRoZSBhdWRpbyBkYXRhIGNvbnRhaW5lZCBpbiBidWZmZXIuCisgICAgdm9pZCBsb2coY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZUluQnl0ZXMpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyAhPSBudWxscHRyKSB7IC8vIG1GcmFtZVNpemUgaXMgYWx3YXlzIG5vbnplcm8gaWYgbVBvd2VyTG9nIGV4aXN0cy4KKyAgICAgICAgICAgIHBvd2VyX2xvZ19sb2coCisgICAgICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgYnVmZmVyLCBzaXplSW5CeXRlcyAvIG1GcmFtZVNpemUsIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzVXNlckRlYnVnT3JFbmdCdWlsZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgfQorCitwcml2YXRlOgorCisgICAgc3RhdGljIGlubGluZSBib29sIGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSB7CisgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgKHZvaWQpcHJvcGVydHlfZ2V0KCJyby5idWlsZC50eXBlIiwgdmFsdWUsICJ1bmtub3duIik7IC8vIGlnbm9yZSBhY3R1YWwgbGVuZ3RoCisgICAgICAgIHJldHVybiBzdHJjbXAodmFsdWUsICJ1c2VyZGVidWciKSA9PSAwIHx8IHN0cmNtcCh2YWx1ZSwgImVuZyIpID09IDA7CisgICAgfQorCisgICAgLy8gQXVkaW8gc2lnbmFsIHBvd2VyIGxvZyBjb25maWd1cmF0aW9uLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nTGluZXMgPSA0MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyA9IDUwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRW50cmllcyA9ICgxIC8qIG1pbnV0ZXMgKi8gKiA2MCAvKiBzZWNvbmRzICovICogMTAwMCAvKiBtc2VjICovCisgICAgICAgICAgICAvIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyk7CisKKyAgICBjb25zdCBib29sIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgcG93ZXJfbG9nX3QgKm1Qb3dlckxvZzsKKyAgICBzaXplX3QgbUZyYW1lU2l6ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0RldmljZUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9EZXZpY2VIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdEhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL1N0cmVhbUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9TdHJlYW1IYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9oaWRsL0hhbERlYXRoSGFuZGxlci5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXIuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQuYnAKaW5kZXggY2NhYTJiNC4uMGRkM2YxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icApAQCAtMSArMSBAQAotc3ViZGlycyA9IFsiZmFjdG9yeSJdCitzdWJkaXJzID0gWyJmYWN0b3J5IiwgImNvbmZpZyJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL09XTkVSUyBiL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlM2RlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2tyb2NhcmRAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQorcmFnb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzk4YTkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icApAQCAtMCwwICsxLDE3IEBACisvLyBFZmZlY3QgY29uZmlndXJhdGlvbgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJlZmZlY3RzY29uZmlnIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWyJzcmMvRWZmZWN0c0NvbmZpZy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidGlueXhtbDIiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWyJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyJdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvaW5jbHVkZS9tZWRpYS9FZmZlY3RzQ29uZmlnLmggYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTE3MzBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvaW5jbHVkZS9tZWRpYS9FZmZlY3RzQ29uZmlnLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9FRkZFQ1RTQ09ORklHX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9FRkZFQ1RTQ09ORklHX0gKKworLyoqIEBmaWxlIFBhcnNlcyBhdWRpbyBlZmZlY3RzIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBDIGFuZCBDKysgc3RydWN0dXJlLgorICogQHNlZSBhdWRpb19lZmZlY3RzX2NvbmZfVjJfMC54c2QgZm9yIGRvY3VtZW50YXRpb24gb24gZWFjaCBzdHJ1Y3R1cmUKKyAqLworCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0c0NvbmZpZyB7CisKKy8qKiBEZWZhdWx0IHBhdGggb2YgZWZmZWN0IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi8KK2NvbnN0ZXhwciBjaGFyIERFRkFVTFRfUEFUSFtdID0gIi92ZW5kb3IvZXRjL2F1ZGlvX2VmZmVjdHMueG1sIjsKKworLyoqIERpcmVjdG9yaWVzIHdoZXJlIHRoZSBlZmZlY3QgbGlicmFyaWVzIHdpbGwgYmUgc2VhcmNoIGZvci4gKi8KK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBMRF9FRkZFQ1RfTElCUkFSWV9QQVRIW10gPQorI2lmZGVmIF9fTFA2NF9fCisgICAgICAgIHsiL29kbS9saWI2NC9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliNjQvc291bmRmeCIsICIvc3lzdGVtL2xpYjY0L3NvdW5kZngifTsKKyNlbHNlCisgICAgICAgIHsiL29kbS9saWIvc291bmRmeCIsICIvdmVuZG9yL2xpYi9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliL3NvdW5kZngifTsKKyNlbmRpZgorCitzdHJ1Y3QgTGlicmFyeSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBzdGQ6OnN0cmluZyBwYXRoOworfTsKK3VzaW5nIExpYnJhcmllcyA9IHN0ZDo6dmVjdG9yPExpYnJhcnk+OworCitzdHJ1Y3QgRWZmZWN0SW1wbCB7CisgICAgTGlicmFyeSogbGlicmFyeTsgLy88IE9ubHkgdmFsaWQgYXMgbG9uZyBhcyB0aGUgYXNzb2NpYXRlZCBsaWJyYXJ5IHZlY3RvciBpcyB1bm1vZGlmaWVkCisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworfTsKKworc3RydWN0IEVmZmVjdCA6IHB1YmxpYyBFZmZlY3RJbXBsIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGJvb2wgaXNQcm94eTsKKyAgICBFZmZlY3RJbXBsIGxpYlN3OyAvLzwgT25seSB2YWxpZCBpZiBpc1Byb3h5CisgICAgRWZmZWN0SW1wbCBsaWJIdzsgLy88IE9ubHkgdmFsaWQgaWYgaXNQcm94eQorfTsKKwordXNpbmcgRWZmZWN0cyA9IHN0ZDo6dmVjdG9yPEVmZmVjdD47CisKK3RlbXBsYXRlIDxjbGFzcyBUeXBlPgorc3RydWN0IFN0cmVhbSB7CisgICAgVHlwZSB0eXBlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8RWZmZWN0Pj4gZWZmZWN0czsKK307Cit1c2luZyBPdXRwdXRTdHJlYW0gPSBTdHJlYW08YXVkaW9fc3RyZWFtX3R5cGVfdD47Cit1c2luZyBJbnB1dFN0cmVhbSA9IFN0cmVhbTxhdWRpb19zb3VyY2VfdD47CisKKy8qKiBQYXJzZWQgY29uZmlndXJhdGlvbi4KKyAqIEludGVuZGVkIHRvIGJlIGEgdHJhbnNpZW50IHN0cnVjdHVyZSBvbmx5IHVzZWQgZm9yIGRlc2VyaWFsaXphdGlvbi4KKyAqIE5vdGU6IEV2ZXJ5dGhpbmcgaXMgY29waWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIHhtbCBkb20uCisgKiAgICAgICBJZiBjb3BpZXMgbmVlZGVkIHRvIGJlIGF2b2lkZWQgZHVlIHRvIHBlcmZvcm1hbmNlIGlzc3VlLAorICogICAgICAgY29uc2lkZXIga2VlcGluZyBhIHByaXZhdGUgaGFuZGxlIG9uIHRoZSB4bWwgZG9tIGFuZCByZXBsYWNlIGFsbCBzdHJpbmdzIGJ5IGRvbSBwb2ludGVycy4KKyAqICAgICAgIE9yIGV2ZW4gYmV0dGVyLCB1c2UgU0FYIHBhcnNpbmcgdG8gYXZvaWQgdGhlIGFsbG9jYXRpb25zIGFsbCB0b2dldGhlci4KKyAqLworc3RydWN0IENvbmZpZyB7CisgICAgZmxvYXQgdmVyc2lvbjsKKyAgICBMaWJyYXJpZXMgbGlicmFyaWVzOworICAgIEVmZmVjdHMgZWZmZWN0czsKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW0+IHBvc3Rwcm9jZXNzOworICAgIHN0ZDo6dmVjdG9yPElucHV0U3RyZWFtPiBwcmVwcm9jZXNzOworfTsKKworLyoqIFJlc3VsdCBvZiBgcGFyc2UoY29uc3QgY2hhciopYCAqLworc3RydWN0IFBhcnNpbmdSZXN1bHQgeworICAgIC8qKiBQYXJzZWQgY29uZmlnLCBudWxscHRyIGlmIHRoZSB4bWwgbGliIGNvdWxkIG5vdCBsb2FkIHRoZSBmaWxlICovCisgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gcGFyc2VkQ29uZmlnOworICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50OyAvLzwgTnVtYmVyIG9mIHNraXBwZWQgaW52YWxpZCBsaWJyYXJ5LCBlZmZlY3Qgb3IgcHJvY2Vzc2luZyBjaGFpbgorfTsKKworLyoqIFBhcnNlcyB0aGUgcHJvdmlkZWQgZWZmZWN0IGNvbmZpZ3VyYXRpb24uCisgKiBQYXJzaW5nIGRvIG5vdCBzdG9wIG9mIGZpcnN0IGludmFsaWQgZWxlbWVudCwgYnV0IGNvbnRpbnVlcyB0byB0aGUgbmV4dC4KKyAqIEBzZWUgUGFyc2luZ1Jlc3VsdDo6bmJTa2lwcGVkRWxlbWVudAorICovCitQYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGggPSBERUZBVUxUX1BBVEgpOworCit9IC8vIG5hbWVzcGFjZSBlZmZlY3RzQ29uZmlnCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfRUZGRUNUU0NPTkZJR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0NjJmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0NvbmZpZyIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8dGlueXhtbDIuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisKK3VzaW5nIG5hbWVzcGFjZSB0aW55eG1sMjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdHNDb25maWcgeworCisvKiogQWxsIGZ1bmN0aW9ucyBleGNlcHQgYHBhcnNlKGNvbnN0IGNoYXIqKWAgYXJlIHN0YXRpYy4gKi8KK25hbWVzcGFjZSB7CisKKy8qKiBAcmV0dXJuIGFsbCBgbm9kZWBzIGNoaWxkcmVuIHRoYXQgYXJlIGVsZW1lbnRzIGFuZCBtYXRjaCB0aGUgdGFnIGlmIHByb3ZpZGVkLiAqLworc3RkOjp2ZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBYTUxFbGVtZW50Pj4gZ2V0Q2hpbGRyZW4oY29uc3QgWE1MTm9kZSYgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNoaWxkVGFnID0gbnVsbHB0cikgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgWE1MRWxlbWVudD4+IGNoaWxkcmVuOworICAgIGZvciAoYXV0byogY2hpbGQgPSBub2RlLkZpcnN0Q2hpbGRFbGVtZW50KGNoaWxkVGFnKTsgY2hpbGQgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPk5leHRTaWJsaW5nRWxlbWVudChjaGlsZFRhZykpIHsKKyAgICAgICAgY2hpbGRyZW4uZW1wbGFjZV9iYWNrKCpjaGlsZCk7CisgICAgfQorICAgIHJldHVybiBjaGlsZHJlbjsKK30KKworLyoqIEByZXR1cm4geG1sIGR1bXAgb2YgdGhlIHByb3ZpZGVkIGVsZW1lbnQuCisgKiBCeSBub3QgcHJvdmlkaW5nIGEgcHJpbnRlciwgaXQgaXMgaW1wbGljaXRseSBjcmVhdGVkIGluIHRoZSBjYWxsZXIgY29udGV4dC4KKyAqIEluIHN1Y2ggY2FzZSB0aGUgcmV0dXJuIHBvaW50ZXIgaGFzIHRoZSBzYW1lIGxpZmV0aW1lIGFzIHRoZSBleHByZXNzaW9uIGNvbnRhaW5pbmcgZHVtcCgpLgorICovCitjb25zdCBjaGFyKiBkdW1wKGNvbnN0IFhNTEVsZW1lbnQmIGVsZW1lbnQsIFhNTFByaW50ZXImJiBwcmludGVyID0ge30pIHsKKyAgICBlbGVtZW50LkFjY2VwdCgmcHJpbnRlcik7CisgICAgcmV0dXJuIHByaW50ZXIuQ1N0cigpOworfQorCisKK2Jvb2wgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCkKK3sKKyAgICB1aW50MzJfdCB0bXBbMTBdOworCisgICAgaWYgKHNzY2FuZihzdHIsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB0bXAsIHRtcCsxLCB0bXArMiwgdG1wKzMsIHRtcCs0LCB0bXArNSwgdG1wKzYsIHRtcCs3LCB0bXArOCwgdG1wKzkpIDwgMTApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB1dWlkLT50aW1lTG93ID0gKHVpbnQzMl90KXRtcFswXTsKKyAgICB1dWlkLT50aW1lTWlkID0gKHVpbnQxNl90KXRtcFsxXTsKKyAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uID0gKHVpbnQxNl90KXRtcFsyXTsKKyAgICB1dWlkLT5jbG9ja1NlcSA9ICh1aW50MTZfdCl0bXBbM107CisgICAgdXVpZC0+bm9kZVswXSA9ICh1aW50OF90KXRtcFs0XTsKKyAgICB1dWlkLT5ub2RlWzFdID0gKHVpbnQ4X3QpdG1wWzVdOworICAgIHV1aWQtPm5vZGVbMl0gPSAodWludDhfdCl0bXBbNl07CisgICAgdXVpZC0+bm9kZVszXSA9ICh1aW50OF90KXRtcFs3XTsKKyAgICB1dWlkLT5ub2RlWzRdID0gKHVpbnQ4X3QpdG1wWzhdOworICAgIHV1aWQtPm5vZGVbNV0gPSAodWludDhfdCl0bXBbOV07CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIE1hcCB0aGUgZW51bSBhbmQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nIHR5cGUuCisgKiAgSW50ZW5kZWQgdG8gYmUgc3BlY2lhbGl6ZWQgZm9yIGVhY2ggZW51bSB0byBkZXNlcmlhbGl6ZS4KKyAqICBUaGUgZ2VuZXJhbCB0ZW1wbGF0ZSBpcyBkaXNhYmxlZC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIEVudW0+Citjb25zdGV4cHIgc3RkOjplbmFibGVfaWY8ZmFsc2UsIEVudW0+IFNUUkVBTV9OQU1FX01BUDsKKworLyoqIEFsbCBvdXRwdXQgc3RyZWFtIHR5cGVzIHdoaWNoIHN1cHBvcnQgZWZmZWN0cy4KKyAqIFRoaXMgbmVlZCB0byBiZSBrZXB0IGluIHNpbmsgd2l0aCB0aGUgeHNkIHN0cmVhbU91dHB1dFR5cGUuCisgKi8KK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgc3RkOjpwYWlyPGF1ZGlvX3N0cmVhbV90eXBlX3QsIGNvbnN0IGNoYXIqPiBTVFJFQU1fTkFNRV9NQVA8YXVkaW9fc3RyZWFtX3R5cGVfdD5bXSA9IHsKKyAgICAgICAge0FVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCAidm9pY2VfY2FsbCJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX1NZU1RFTSwgInN5c3RlbSJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX1JJTkcsICJyaW5nIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fTVVTSUMsICJtdXNpYyJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX0FMQVJNLCAiYWxhcm0ifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sICJub3RpZmljYXRpb24ifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPLCAiYmx1ZXRvb3RoX3NjbyJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUsICJlbmZvcmNlZF9hdWRpYmxlIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fRFRNRiwgImR0bWYifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9UVFMsICJ0dHMifSwKK307CisKKy8qKiBBbGwgaW5wdXQgc3RyZWFtIHR5cGVzIHdoaWNoIHN1cHBvcnQgZWZmZWN0cy4KKyAqIFRoaXMgbmVlZCB0byBiZSBrZXB0IGluIHNpbmsgd2l0aCB0aGUgeHNkIHN0cmVhbU91dHB1dFR5cGUuCisgKi8KK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgc3RkOjpwYWlyPGF1ZGlvX3NvdXJjZV90LCBjb25zdCBjaGFyKj4gU1RSRUFNX05BTUVfTUFQPGF1ZGlvX3NvdXJjZV90PltdID0geworICAgICAgICB7QVVESU9fU09VUkNFX01JQywgIm1pYyJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSywgInZvaWNlX3VwbGluayJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LLCAidm9pY2VfZG93bmxpbmsifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9DQUxMLCAidm9pY2VfY2FsbCJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX0NBTUNPUkRFUiwgImNhbWNvcmRlciJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLCAidm9pY2VfcmVjb2duaXRpb24ifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCAidm9pY2VfY29tbXVuaWNhdGlvbiJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1VOUFJPQ0VTU0VELCAidW5wcm9jZXNzZWQifSwKK307CisKKy8qKiBGaW5kIHRoZSBzdHJlYW0gdHlwZSBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmVhbSB0eXBlIG5hbWUgb3IgcmV0dXJuIGZhbHNlICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4KK2Jvb2wgc3RyaW5nVG9TdHJlYW1UeXBlKGNvbnN0IGNoYXIgKnN0cmVhbU5hbWUsIFR5cGUqIHR5cGUpCit7CisgICAgZm9yIChhdXRvJiBzdHJlYW1OYW1lUGFpciA6IFNUUkVBTV9OQU1FX01BUDxUeXBlPikgeworICAgICAgICBpZiAoc3RyY21wKHN0cmVhbU5hbWVQYWlyLnNlY29uZCwgc3RyZWFtTmFtZSkgPT0gMCkgeworICAgICAgICAgICAgKnR5cGUgPSBzdHJlYW1OYW1lUGFpci5maXJzdDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqIFBhcnNlIGEgbGlicmFyeSB4bWwgbm90ZSBhbmQgcHVzaCB0aGUgcmVzdWx0IGluIGxpYnJhcmllcyBvciByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZS4gKi8KK2Jvb2wgcGFyc2VMaWJyYXJ5KGNvbnN0IFhNTEVsZW1lbnQmIHhtbExpYnJhcnksIExpYnJhcmllcyogbGlicmFyaWVzKSB7CisgICAgY29uc3QgY2hhciogbmFtZSA9IHhtbExpYnJhcnkuQXR0cmlidXRlKCJuYW1lIik7CisgICAgY29uc3QgY2hhciogcGF0aCA9IHhtbExpYnJhcnkuQXR0cmlidXRlKCJwYXRoIik7CisgICAgaWYgKG5hbWUgPT0gbnVsbHB0ciB8fCBwYXRoID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImxpYnJhcnkgbXVzdCBoYXZlIGEgbmFtZSBhbmQgYSBwYXRoOiAlcyIsIGR1bXAoeG1sTGlicmFyeSkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGxpYnJhcmllcy0+cHVzaF9iYWNrKHtuYW1lLCBwYXRofSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBGaW5kIGFuIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIGJ5IGl0cyBuYW1lLgorICogQHJldHVybiBudWxscHRyIGlmIG5vdCBmb3VuZCwgdGhlIGVsbGVtZW50cyBhZGRyZXNzIGlmIGZvdW5kLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1QqIGZpbmRCeU5hbWUoY29uc3QgY2hhciogbmFtZSwgc3RkOjp2ZWN0b3I8VD4mIGNvbGxlY3Rpb24pIHsKKyAgICBhdXRvIGl0ID0gZmluZF9pZihiZWdpbihjb2xsZWN0aW9uKSwgZW5kKGNvbGxlY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXSAoYXV0byYgaXRlbSkgeyByZXR1cm4gaXRlbS5uYW1lID09IG5hbWU7IH0pOworICAgIHJldHVybiBpdCAhPSBlbmQoY29sbGVjdGlvbikgPyAmKml0IDogbnVsbHB0cjsKK30KKworLyoqIFBhcnNlIGFuIGVmZmVjdCBmcm9tIGFuIHhtbCBlbGVtZW50IGRlc2NyaWJpbmcgaXQuCisgKiBAcmV0dXJuIHRydWUgYW5kIHB1c2hlcyB0aGUgZWZmZWN0IGluIGVmZmVjdHMgb24gc3VjY2VzcywKKyAqICAgICAgICAgZmFsc2Ugb24gZmFpbHVyZS4gKi8KK2Jvb2wgcGFyc2VFZmZlY3QoY29uc3QgWE1MRWxlbWVudCYgeG1sRWZmZWN0LCBMaWJyYXJpZXMmIGxpYnJhcmllcywgRWZmZWN0cyogZWZmZWN0cykgeworICAgIEVmZmVjdCBlZmZlY3R7fTsKKworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSB4bWxFZmZlY3QuQXR0cmlidXRlKCJuYW1lIik7CisgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgbXVzdCBoYXZlIGEgbmFtZTogJXMiLCB4bWxFZmZlY3QuVmFsdWUoKSwgZHVtcCh4bWxFZmZlY3QpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlZmZlY3QubmFtZSA9IG5hbWU7CisKKyAgICAvLyBGdW5jdGlvbiB0byBwYXJzZSBlZmZlY3QubGlicmFyeSBhbmQgZWZmZWN0LnV1aWQgZnJvbSB4bWwKKyAgICBhdXRvIHBhcnNlSW1wbCA9IFsmbGlicmFyaWVzXShjb25zdCBYTUxFbGVtZW50JiB4bWxJbXBsLCBFZmZlY3RJbXBsJiBlZmZlY3QpIHsKKyAgICAgICAgLy8gUmV0cmlldmUgbGlicmFyeSBuYW1lIGFuZCB1dWlkIGZyb20geG1sCisgICAgICAgIGNvbnN0IGNoYXIqIGxpYnJhcnlOYW1lID0geG1sSW1wbC5BdHRyaWJ1dGUoImxpYnJhcnkiKTsKKyAgICAgICAgY29uc3QgY2hhciogdXVpZCA9IHhtbEltcGwuQXR0cmlidXRlKCJ1dWlkIik7CisgICAgICAgIGlmIChsaWJyYXJ5TmFtZSA9PSBudWxscHRyIHx8IHV1aWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoImVmZmVjdCBtdXN0IGhhdmUgYSBsaWJyYXJ5IG5hbWUgYW5kIGEgdXVpZDogJXMiLCBkdW1wKHhtbEltcGwpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgbGlicmFyeSBuYW1lIHRvIGEgcG9pbnRlciB0byB0aGUgcHJldmlvdXNseSBsb2FkZWQgbGlicmFyeQorICAgICAgICBhdXRvKiBsaWJyYXJ5ID0gZmluZEJ5TmFtZShsaWJyYXJ5TmFtZSwgbGlicmFyaWVzKTsKKyAgICAgICAgaWYgKGxpYnJhcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgcmVmZXJlbmNlZCBpbjogJXMiLCBkdW1wKHhtbEltcGwpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlZmZlY3QubGlicmFyeSA9IGxpYnJhcnk7CisKKyAgICAgICAgaWYgKCFzdHJpbmdUb1V1aWQodXVpZCwgJmVmZmVjdC51dWlkKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdXVpZCBpbjogJXMiLCBkdW1wKHhtbEltcGwpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgaWYgKCFwYXJzZUltcGwoeG1sRWZmZWN0LCBlZmZlY3QpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgcHJveHkgZWZmZWN0cworICAgIGVmZmVjdC5pc1Byb3h5ID0gZmFsc2U7CisgICAgaWYgKHN0ZDo6c3RyY21wKHhtbEVmZmVjdC5OYW1lKCksICJlZmZlY3RQcm94eSIpID09IDApIHsKKyAgICAgICAgZWZmZWN0LmlzUHJveHkgPSB0cnVlOworCisgICAgICAgIC8vIEZ1bmN0aW9uIHRvIHBhcnNlIGxpYmh3IGFuZCBsaWJzdworICAgICAgICBhdXRvIHBhcnNlUHJveHkgPSBbJnhtbEVmZmVjdCwgJnBhcnNlSW1wbF0oY29uc3QgY2hhciogdGFnLCBFZmZlY3RJbXBsJiBwcm94eUxpYikgeworICAgICAgICAgICAgYXV0byogeG1sUHJveHlMaWIgPSB4bWxFZmZlY3QuRmlyc3RDaGlsZEVsZW1lbnQodGFnKTsKKyAgICAgICAgICAgIGlmICh4bWxQcm94eUxpYiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImVmZmVjdFByb3h5IG11c3QgY29udGFpbiBhIDwlcz46ICVzIiwgdGFnLCBkdW1wKCp4bWxQcm94eUxpYikpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYXJzZUltcGwoKnhtbFByb3h5TGliLCBwcm94eUxpYik7CisgICAgICAgIH07CisgICAgICAgIGlmICghcGFyc2VQcm94eSgibGliaHciLCBlZmZlY3QubGliSHcpIHx8ICFwYXJzZVByb3h5KCJsaWJzdyIsIGVmZmVjdC5saWJTdykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVmZmVjdHMtPnB1c2hfYmFjayhzdGQ6Om1vdmUoZWZmZWN0KSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBQYXJzZSBhbiBzdHJlYW0gZnJvbSBhbiB4bWwgZWxlbWVudCBkZXNjcmliaW5nIGl0LgorICogQHJldHVybiB0cnVlIGFuZCBwdXNoZXMgdGhlIHN0cmVhbSBpbiBzdHJlYW1zIG9uIHN1Y2Nlc3MsCisgKiAgICAgICAgIGZhbHNlIG9uIGZhaWx1cmUuICovCit0ZW1wbGF0ZSA8Y2xhc3MgU3RyZWFtPgorYm9vbCBwYXJzZVN0cmVhbShjb25zdCBYTUxFbGVtZW50JiB4bWxTdHJlYW0sIEVmZmVjdHMmIGVmZmVjdHMsIHN0ZDo6dmVjdG9yPFN0cmVhbT4qIHN0cmVhbXMpIHsKKyAgICBjb25zdCBjaGFyKiBzdHJlYW1UeXBlID0geG1sU3RyZWFtLkF0dHJpYnV0ZSgidHlwZSIpOworICAgIGlmIChzdHJlYW1UeXBlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoInN0cmVhbSBtdXN0IGhhdmUgYSB0eXBlOiAlcyIsIGR1bXAoeG1sU3RyZWFtKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU3RyZWFtIHN0cmVhbTsKKyAgICBpZiAoIXN0cmluZ1RvU3RyZWFtVHlwZShzdHJlYW1UeXBlLCAmc3RyZWFtLnR5cGUpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSB0eXBlICVzOiAlcyIsIHN0cmVhbVR5cGUsIGR1bXAoeG1sU3RyZWFtKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIHhtbEFwcGx5IDogZ2V0Q2hpbGRyZW4oeG1sU3RyZWFtLCAiYXBwbHkiKSkgeworICAgICAgICBjb25zdCBjaGFyKiBlZmZlY3ROYW1lID0geG1sQXBwbHkuZ2V0KCkuQXR0cmlidXRlKCJlZmZlY3QiKTsKKyAgICAgICAgaWYgKGVmZmVjdE5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoInN0cmVhbS9hcHBseSBtdXN0IGhhdmUgcmVmZXJlbmNlIGFuIGVmZmVjdDogJXMiLCBkdW1wKHhtbEFwcGx5KSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYXV0byogZWZmZWN0ID0gZmluZEJ5TmFtZShlZmZlY3ROYW1lLCBlZmZlY3RzKTsKKyAgICAgICAgaWYgKGVmZmVjdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgZWZmZWN0IHJlZmVyZW5jZWQgaW46ICVzIiwgZHVtcCh4bWxBcHBseSkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0cmVhbS5lZmZlY3RzLmVtcGxhY2VfYmFjaygqZWZmZWN0KTsKKyAgICB9CisgICAgc3RyZWFtcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShzdHJlYW0pKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsgLy8gbmFtZXNwYWNlCisKK1BhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCkgeworICAgIFhNTERvY3VtZW50IGRvYzsKKyAgICBkb2MuTG9hZEZpbGUocGF0aCk7CisgICAgaWYgKGRvYy5FcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgJXM6IFRpbnl4bWwyIGVycm9yICglZCk6ICVzICVzIiwgcGF0aCwKKyAgICAgICAgICAgICAgZG9jLkVycm9ySUQoKSwgZG9jLkdldEVycm9yU3RyMSgpLCBkb2MuR2V0RXJyb3JTdHIyKCkpOworICAgICAgICByZXR1cm4ge251bGxwdHIsIDB9OworICAgIH0KKworICAgIGF1dG8gY29uZmlnID0gc3RkOjptYWtlX3VuaXF1ZTxDb25maWc+KCk7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnRzID0gMDsKKyAgICBhdXRvIHJlZ2lzdGVyRmFpbHVyZSA9IFsmbmJTa2lwcGVkRWxlbWVudHNdKGJvb2wgcmVzdWx0KSB7CisgICAgICAgIG5iU2tpcHBlZEVsZW1lbnRzICs9IHJlc3VsdCA/IDAgOiAxOworICAgIH07CisgICAgZm9yIChhdXRvJiB4bWxDb25maWcgOiBnZXRDaGlsZHJlbihkb2MsICJhdWRpb19lZmZlY3RzX2NvbmYiKSkgeworCisgICAgICAgIC8vIFBhcnNlIGxpYnJhcnkKKyAgICAgICAgZm9yIChhdXRvJiB4bWxMaWJyYXJpZXMgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJsaWJyYXJpZXMiKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiB4bWxMaWJyYXJ5IDogZ2V0Q2hpbGRyZW4oeG1sTGlicmFyaWVzLCAibGlicmFyeSIpKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGYWlsdXJlKHBhcnNlTGlicmFyeSh4bWxMaWJyYXJ5LCAmY29uZmlnLT5saWJyYXJpZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIGVmZmVjdHMKKyAgICAgICAgZm9yIChhdXRvJiB4bWxFZmZlY3RzIDogZ2V0Q2hpbGRyZW4oeG1sQ29uZmlnLCAiZWZmZWN0cyIpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHhtbEVmZmVjdCA6IGdldENoaWxkcmVuKHhtbEVmZmVjdHMpKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGYWlsdXJlKHBhcnNlRWZmZWN0KHhtbEVmZmVjdCwgY29uZmlnLT5saWJyYXJpZXMsICZjb25maWctPmVmZmVjdHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIHByZSBwcm9jZXNzaW5nIGNoYWlucworICAgICAgICBmb3IgKGF1dG8mIHhtbFByZXByb2Nlc3MgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJwcmVwcm9jZXNzIikpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgeG1sU3RyZWFtIDogZ2V0Q2hpbGRyZW4oeG1sUHJlcHJvY2VzcywgInN0cmVhbSIpKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGYWlsdXJlKHBhcnNlU3RyZWFtKHhtbFN0cmVhbSwgY29uZmlnLT5lZmZlY3RzLCAmY29uZmlnLT5wcmVwcm9jZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzZSBwb3N0IHByb2Nlc3NpbmcgY2hhaW5zCisgICAgICAgIGZvciAoYXV0byYgeG1sUG9zdHByb2Nlc3MgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJwb3N0cHJvY2VzcyIpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHhtbFN0cmVhbSA6IGdldENoaWxkcmVuKHhtbFBvc3Rwcm9jZXNzLCAic3RyZWFtIikpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VTdHJlYW0oeG1sU3RyZWFtLCBjb25maWctPmVmZmVjdHMsICZjb25maWctPnBvc3Rwcm9jZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHtzdGQ6Om1vdmUoY29uZmlnKSwgbmJTa2lwcGVkRWxlbWVudHN9OworfQorCit9IC8vIG5hbWVzcGFjZSBlZmZlY3RzQ29uZmlnCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rCmluZGV4IDczZjZlZjUuLjI4Yjk2ZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw3IEBACiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgogCiBMT0NBTF9IRUFERVJfTElCUkFSSUVTICs9IGxpYmhhcmR3YXJlX2hlYWRlcnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCmluZGV4IGYyN2Q1Y2EuLjUxOWY0YTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwpAQCAtMzMsNiArMzMsMTAgQEAKIAogI2RlZmluZSBNSU5VU18zX0RCX0lOX1ExOV8xMiAyODk2IC8vIC0zZEIgPSAwLjcwNyAqIDJeMTIgPSAyODk2CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBNSU5VU18zX0RCX0lOX0ZMT0FUIDAuNzA3MTA2NzhmIC8vIC0zZEIgPSAwLjcwNzEwNjc4ZgorI2VuZGlmCisKIC8vIHN1YnNldCBvZiBwb3NzaWJsZSBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZXMsIGFuZCBBVURJT19DSEFOTkVMX09VVF8qIHJlbmFtZWQgdG8gQ0hBTk5FTF9NQVNLXyoKIHR5cGVkZWYgZW51bSB7CiAgICAgQ0hBTk5FTF9NQVNLX1FVQURfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSywKQEAgLTgyLDggKzg2LDE5IEBACiAKIC8vIG51bWJlciBvZiBlZmZlY3RzIGluIHRoaXMgbGlicmFyeQogY29uc3QgaW50IGtOYkVmZmVjdHMgPSBzaXplb2YoZ0Rlc2NyaXB0b3JzKSAvIHNpemVvZihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICopOwotCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorc3RhdGljIExWTV9GTE9BVCBjbGFtcF9mbG9hdChMVk1fRkxPQVQgYSkgeworICAgIGlmIChhID4gMS4wZikgeworICAgICAgICByZXR1cm4gMS4wZjsKKyAgICB9CisgICAgZWxzZSBpZiAoYSA8IC0xLjBmKSB7CisgICAgICAgIHJldHVybiAtMS4wZjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBhOworICAgIH0KK30KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBUZXN0IGNvZGUKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjg2LDcgKzMwMSw3IEBACiAgICAgcmV0dXJuIC1FSU5WQUw7CiB9CiAKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogLyotLS0gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uIC0tLSovCiAKIHN0YXRpYyBpbnQgRG93bm1peF9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLApAQCAtMzg1LDcgKzQwMCwxMDggQEAKIAogICAgIHJldHVybiAwOwogfQorI2Vsc2UgLypCVUlMRF9GTE9BVCovCisvKi0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gLS0tKi8KIAorc3RhdGljIGludCBEb3dubWl4X1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsCisgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikgeworCisgICAgZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlcjsKKyAgICBMVk1fRkxPQVQgKnBTcmMsICpwRHN0OworICAgIGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKXNlbGY7CisKKyAgICBpZiAocER3bU1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBvdXRCdWZmZXIgPT0gTlVMTCB8fCBvdXRCdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwRG93bm1peGVyID0gKGRvd25taXhfb2JqZWN0X3QqKSAmcER3bU1vZHVsZS0+Y29udGV4dDsKKworICAgIGlmIChwRG93bm1peGVyLT5zdGF0ZSA9PSBET1dOTUlYX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgQUxPR0UoIkRvd25taXhfUHJvY2VzcyBlcnJvcjogdHJ5aW5nIHRvIHVzZSBhbiB1bmluaXRpYWxpemVkIGRvd25taXhlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9IGVsc2UgaWYgKHBEb3dubWl4ZXItPnN0YXRlID09IERPV05NSVhfU1RBVEVfSU5JVElBTElaRUQpIHsKKyAgICAgICAgQUxPR0UoIkRvd25taXhfUHJvY2VzcyBlcnJvcjogdHJ5aW5nIHRvIHVzZSBhIG5vbi1jb25maWd1cmVkIGRvd25taXhlciIpOworICAgICAgICByZXR1cm4gLUVOT0RBVEE7CisgICAgfQorCisgICAgcFNyYyA9IChMVk1fRkxPQVQgKikgaW5CdWZmZXItPnMxNjsKKyAgICBwRHN0ID0gKExWTV9GTE9BVCAqKSBvdXRCdWZmZXItPnMxNjsKKyAgICBzaXplX3QgbnVtRnJhbWVzID0gb3V0QnVmZmVyLT5mcmFtZUNvdW50OworCisgICAgY29uc3QgYm9vbCBhY2N1bXVsYXRlID0KKyAgICAgICAgICAgIChwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7CisgICAgY29uc3QgdWludDMyX3QgZG93bm1peElucHV0Q2hhbm5lbE1hc2sgPSBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHM7CisKKyAgICBzd2l0Y2gocERvd25taXhlci0+dHlwZSkgeworCisgICAgICBjYXNlIERPV05NSVhfVFlQRV9TVFJJUDoKKyAgICAgICAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIHBTcmNbMF0pOworICAgICAgICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyBwU3JjWzFdKTsKKyAgICAgICAgICAgICAgICAgIHBTcmMgKz0gcERvd25taXhlci0+aW5wdXRfY2hhbm5lbF9jb3VudDsKKyAgICAgICAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgICAgICAgcERzdFswXSA9IHBTcmNbMF07CisgICAgICAgICAgICAgICAgICBwRHN0WzFdID0gcFNyY1sxXTsKKyAgICAgICAgICAgICAgICAgIHBTcmMgKz0gcERvd25taXhlci0+aW5wdXRfY2hhbm5lbF9jb3VudDsKKyAgICAgICAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIERPV05NSVhfVFlQRV9GT0xEOgorI2lmZGVmIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUgorICAgICAgICAgIC8vIGJ5cGFzcyB0aGUgb3B0aW1pemVkIGRvd25taXggcm91dGluZXMgZm9yIHRoZSBjb21tb24gZm9ybWF0cworICAgICAgICAgIGlmICghRG93bm1peF9mb2xkR2VuZXJpYygKKyAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrLCBwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpKSB7CisgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCUiIFBSSXgzMiAiIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAvLyBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBmb3JtYXRzCisgICAgICAgIHN3aXRjaCgoZG93bm1peF9pbnB1dF9jaGFubmVsX21hc2tfdClkb3dubWl4SW5wdXRDaGFubmVsTWFzaykgeworICAgICAgICBjYXNlIENIQU5ORUxfTUFTS19RVUFEX0JBQ0s6CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLX1FVQURfU0lERToKKyAgICAgICAgICAgIERvd25taXhfZm9sZEZyb21RdWFkKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfNVBPSU5UMV9CQUNLOgorICAgICAgICBjYXNlIENIQU5ORUxfTUFTS181UE9JTlQxX1NJREU6CisgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzdQT0lOVDE6CisgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrLCBwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk11bHRpY2hhbm5lbCBjb25maWd1cmF0aW9uIDB4JSIgUFJJeDMyICIgaXMgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgRG93bm1peF9Db21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAogICAgICAgICB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewpAQCAtODE4LDYgKzkzNCw3IEBACiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgRG93bm1peF9mb2xkRnJvbVF1YWQoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKICAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTAogICAgIC8vIHNhbXBsZSBhdCBpbmRleCAxIGlzIEZSCkBAIC04NDUsNyArOTYyLDM1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbHNlCit2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAxIGlzIEZSCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDIgaXMgUkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMyBpcyBSUgorICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIEZMICsgUkwKKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKChwU3JjWzBdICsgcFNyY1syXSkgLyAyLjBmKSk7CisgICAgICAgICAgICAvLyBGUiArIFJSCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArICgocFNyY1sxXSArIHBTcmNbM10pIC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSA0OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgorICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBGTCArIFJMCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQoKHBTcmNbMF0gKyBwU3JjWzJdKSAvIDIuMGYpOworICAgICAgICAgICAgLy8gRlIgKyBSUgorICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KChwU3JjWzFdICsgcFNyY1szXSkgLyAyLjBmKTsKKyAgICAgICAgICAgIHBTcmMgKz0gNDsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRG93bm1peF9mb2xkRnJvbTVQb2ludDEoKQpAQCAtODY0LDYgKzEwMDksNyBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CiAgICAgaW50MzJfdCBsdCwgcnQsIGNlbnRlclBsdXNMZmVDb250cmliOyAvLyBzYW1wbGVzIGluIFExOS4xMiBmb3JtYXQKICAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTApAQCAtOTA4LDcgKzEwNTQsNTIgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2Vsc2UKK3ZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgeworICAgIExWTV9GTE9BVCBsdCwgcnQsIGNlbnRlclBsdXNMZmVDb250cmliOyAvLyBzYW1wbGVzIGluIFExOS4xMiBmb3JtYXQKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAxIGlzIEZSCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDIgaXMgRkMKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMyBpcyBMRkUKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNCBpcyBSTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA1IGlzIFJSCisgICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0CisgICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQorICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKKyAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQorICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7CisgICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgUkwKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s0XTsKKyAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSUgorICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzVdOworICAgICAgICAgICAgLy8gYWNjdW11bGF0ZSBpbiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyAobHQgLyAyLjBmKSk7CisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArIChydCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBTcmMgKz0gNjsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gc2FtZSBjb2RlIGFzIGFib3ZlIGJ1dCB3aXRob3V0IGFkZGluZyBhbmQgY2xhbXBpbmcgcERzdFtpXSB0byBpdHNlbGYKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQorICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpCisgICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKTsKKyAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSTAorICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzRdOworICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJSCisgICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNV07CisgICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KGx0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHJ0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcFNyYyArPSA2OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MSgpCkBAIC05MjcsNiArMTExOCw3IEBACiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKICAgICBpbnQzMl90IGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAogICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCkBAIC05NzMsOCArMTE2NSw1NCBAQAogICAgICAgICB9CiAgICAgfQogfQotCi0KKyNlbHNlCit2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKKyAgICBMVk1fRkxPQVQgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0CisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIEZDCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgTEZFCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDQgaXMgUkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNSBpcyBSUgorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA2IGlzIFNMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDcgaXMgU1IKKyAgICAvLyBjb2RlIGlzIG1vc3RseSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgb2YgYWNjdW11bGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHRlc3QKKyAgICAvLyBmb3IgZXZlcnkgc2FtcGxlCisgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQorICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKQorICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgorICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzddICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vYWNjdW11bGF0ZSBpbiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyAobHQgLyAyLjBmKSk7CisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArIChydCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBTcmMgKz0gODsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gc2FtZSBjb2RlIGFzIGFib3ZlIGJ1dCB3aXRob3V0IGFkZGluZyBhbmQgY2xhbXBpbmcgcERzdFtpXSB0byBpdHNlbGYKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQorICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpCisgICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKTsKKyAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTTCArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNl0gKyBwU3JjWzRdOworICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNSICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s3XSArIHBTcmNbNV07CisgICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KGx0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHJ0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcFNyYyArPSA4OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRG93bm1peF9mb2xkR2VuZXJpYygpCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEwMDEsNiArMTIzOSw3IEBACiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGJvb2wgRG93bm1peF9mb2xkR2VuZXJpYygKICAgICAgICAgdWludDMyX3QgbWFzaywgaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKIApAQCAtMTA5MiwzICsxMzMxLDk2IEBACiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQorI2Vsc2UKK2Jvb2wgRG93bm1peF9mb2xkR2VuZXJpYygKKyAgICAgICAgdWludDMyX3QgbWFzaywgTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgeworCisgICAgaWYgKCFEb3dubWl4X3ZhbGlkQ2hhbm5lbE1hc2sobWFzaykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgaGFzU2lkZXMgPSAobWFzayAmIGtTaWRlcykgIT0gMDsKKyAgICBjb25zdCBib29sIGhhc0JhY2tzID0gKG1hc2sgJiBrQmFja3MpICE9IDA7CisKKyAgICBjb25zdCBpbnQgbnVtQ2hhbiA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtYXNrKTsKKyAgICBjb25zdCBib29sIGhhc0ZDID0gKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKSA9PSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpOworICAgIGNvbnN0IGJvb2wgaGFzTEZFID0KKyAgICAgICAgICAgICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpID09IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpOworICAgIGNvbnN0IGJvb2wgaGFzQkMgPSAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUikgPT0gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpOworICAgIC8vIGNvbXB1dGUgYXQgd2hhdCBpbmRleCBlYWNoIGNoYW5uZWwgaXM6IHNhbXBsZXMgd2lsbCBiZSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICAgIC8vICAgRkwgRlIgRkMgTEZFIEJMIEJSIEJDIFNMIFNSCisgICAgLy8gd2hlbiBhIGNoYW5uZWwgaXMgbm90IHByZXNlbnQsIGl0cyBpbmRleCBpcyBzZXQgdG8gdGhlIHNhbWUgYXMgdGhlIGluZGV4IG9mIHRoZSBwcmVjZWRpbmcKKyAgICAvLyBjaGFubmVsCisgICAgY29uc3QgaW50IGluZGV4RkMgID0gaGFzRkMgICAgPyAyICAgICAgICAgICAgOiAxOyAgICAgICAgLy8gZnJvbnQgY2VudGVyCisgICAgY29uc3QgaW50IGluZGV4TEZFID0gaGFzTEZFICAgPyBpbmRleEZDICsgMSAgOiBpbmRleEZDOyAgLy8gbG93IGZyZXF1ZW5jeQorICAgIGNvbnN0IGludCBpbmRleEJMICA9IGhhc0JhY2tzID8gaW5kZXhMRkUgKyAxIDogaW5kZXhMRkU7IC8vIGJhY2sgbGVmdAorICAgIGNvbnN0IGludCBpbmRleEJSICA9IGhhc0JhY2tzID8gaW5kZXhCTCArIDEgIDogaW5kZXhCTDsgIC8vIGJhY2sgcmlnaHQKKyAgICBjb25zdCBpbnQgaW5kZXhCQyAgPSBoYXNCQyAgICA/IGluZGV4QlIgKyAxICA6IGluZGV4QlI7ICAvLyBiYWNrIGNlbnRlcgorICAgIGNvbnN0IGludCBpbmRleFNMICA9IGhhc1NpZGVzID8gaW5kZXhCQyArIDEgIDogaW5kZXhCQzsgIC8vIHNpZGUgbGVmdAorICAgIGNvbnN0IGludCBpbmRleFNSICA9IGhhc1NpZGVzID8gaW5kZXhTTCArIDEgIDogaW5kZXhTTDsgIC8vIHNpZGUgcmlnaHQKKworICAgIExWTV9GTE9BVCBsdCwgcnQsIGNlbnRlcnNMZmVDb250cmliOworICAgIC8vIGNvZGUgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyBvZiBhY2N1bXVsYXRlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGUgdGVzdAorICAgIC8vIGZvciBldmVyeSBzYW1wbGUKKyAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjb21wdXRlIGNvbnRyaWJ1dGlvbiBvZiBGQywgQkMgYW5kIExGRQorICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgPSAwOworICAgICAgICAgICAgaWYgKGhhc0ZDKSAgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4RkNdOyB9CisgICAgICAgICAgICBpZiAoaGFzTEZFKSB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhMRkVdOyB9CisgICAgICAgICAgICBpZiAoaGFzQkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhCQ107IH0KKyAgICAgICAgICAgIGNlbnRlcnNMZmVDb250cmliICo9IE1JTlVTXzNfREJfSU5fRkxPQVQ7CisgICAgICAgICAgICAvLyBhbHdheXMgaGFzIEZML0ZSCisgICAgICAgICAgICBsdCA9IHBTcmNbMF07CisgICAgICAgICAgICBydCA9IHBTcmNbMV07CisgICAgICAgICAgICAvLyBtaXggaW4gc2lkZXMgYW5kIGJhY2tzCisgICAgICAgICAgICBpZiAoaGFzU2lkZXMpIHsKKyAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4U0xdOworICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhTUl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzQmFja3MpIHsKKyAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4QkxdOworICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhCUl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsdCArPSBjZW50ZXJzTGZlQ29udHJpYjsKKyAgICAgICAgICAgIHJ0ICs9IGNlbnRlcnNMZmVDb250cmliOworICAgICAgICAgICAgLy8gYWNjdW11bGF0ZSBpbiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyAobHQgLyAyLjBmKSk7CisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArIChydCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBTcmMgKz0gbnVtQ2hhbjsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY29tcHV0ZSBjb250cmlidXRpb24gb2YgRkMsIEJDIGFuZCBMRkUKKyAgICAgICAgICAgIGNlbnRlcnNMZmVDb250cmliID0gMDsKKyAgICAgICAgICAgIGlmIChoYXNGQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEZDXTsgfQorICAgICAgICAgICAgaWYgKGhhc0xGRSkgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4TEZFXTsgfQorICAgICAgICAgICAgaWYgKGhhc0JDKSAgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4QkNdOyB9CisgICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiAqPSBNSU5VU18zX0RCX0lOX0ZMT0FUOworICAgICAgICAgICAgLy8gYWx3YXlzIGhhcyBGTC9GUgorICAgICAgICAgICAgbHQgPSBwU3JjWzBdOworICAgICAgICAgICAgcnQgPSBwU3JjWzFdOworICAgICAgICAgICAgLy8gbWl4IGluIHNpZGVzIGFuZCBiYWNrcworICAgICAgICAgICAgaWYgKGhhc1NpZGVzKSB7CisgICAgICAgICAgICAgICAgbHQgKz0gcFNyY1tpbmRleFNMXTsKKyAgICAgICAgICAgICAgICBydCArPSBwU3JjW2luZGV4U1JdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc0JhY2tzKSB7CisgICAgICAgICAgICAgICAgbHQgKz0gcFNyY1tpbmRleEJMXTsKKyAgICAgICAgICAgICAgICBydCArPSBwU3JjW2luZGV4QlJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHQgKz0gY2VudGVyc0xmZUNvbnRyaWI7CisgICAgICAgICAgICBydCArPSBjZW50ZXJzTGZlQ29udHJpYjsKKyAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQobHQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocnQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwU3JjICs9IG51bUNoYW47CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmggYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCmluZGV4IDIzOTlhYmQuLmMxYmUwZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaApAQCAtMjcsNyArMjcsOSBAQAogKi8KIAogI2RlZmluZSBET1dOTUlYX09VVFBVVF9DSEFOTkVMUyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIExWTV9GTE9BVCBmbG9hdAorI2VuZGlmCiB0eXBlZGVmIGVudW0gewogICAgIERPV05NSVhfU1RBVEVfVU5JTklUSUFMSVpFRCwKICAgICBET1dOTUlYX1NUQVRFX0lOSVRJQUxJWkVELApAQCAtOTUsMTEgKzk3LDE4IEBACiBpbnQgRG93bm1peF9SZXNldChkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBib29sIGluaXQpOwogaW50IERvd25taXhfc2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90IHNpemUsIHZvaWQgKnBWYWx1ZSk7CiBpbnQgRG93bm1peF9nZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3QgKnBTaXplLCB2b2lkICpwVmFsdWUpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRG93bm1peF9mb2xkRnJvbVF1YWQoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Cit2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwordm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKK2Jvb2wgRG93bm1peF9mb2xkR2VuZXJpYygKKyAgICAgICAgdWludDMyX3QgbWFzaywgTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CisjZWxzZQogdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiB2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIHZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAogICAgICAgICB1aW50MzJfdCBtYXNrLCBpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CisjZW5kaWYKIAogI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RET1dOTUlYX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQuYnAKaW5kZXggMTY2ODBiZC4uZGRiZmRkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQuYnAKQEAgLTEwLDE4ICsxMCw0NyBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJlZmZlY3RzIiwKICAgICB2ZW5kb3I6IHRydWUsCi0gICAgc3JjczogWyJFZmZlY3RzRmFjdG9yeS5jIl0sCisgICAgc3JjczogWworICAgICAgICAgIkVmZmVjdHNGYWN0b3J5LmMiLAorICAgICAgICAgIkVmZmVjdHNDb25maWdMb2FkZXIuYyIsCisgICAgICAgICAiRWZmZWN0c0ZhY3RvcnlTdGF0ZS5jIiwKKyAgICAgICAgICJFZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcCIsCisgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmVmZmVjdHNjb25maWciLAogICAgIF0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsic3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSJdLAorICAgIGNmbGFnczogWyItZnZpc2liaWxpdHk9aGlkZGVuIl0sCiAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6WyJpbmNsdWRlL21lZGlhIl0sCiAKLSAgICBoZWFkZXJfbGliczogWyJsaWJlZmZlY3RzX2hlYWRlcnMiXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICAgICAgImxpYmVmZmVjdHNfaGVhZGVycyIsCisgICAgXSwKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmVmZmVjdHNfaGVhZGVycyJdLAogfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJkdW1wRWZmZWN0Q29uZmlnRmlsZSIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyY3M6IFsidGVzdC9EdW1wQ29uZmlnLmNwcCJdLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZWZmZWN0c2NvbmZpZyIsCisgICAgICAgICJsaWJlZmZlY3RzIiwKKyAgICBdLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczpbIi4iLCAiaW5jbHVkZSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlZjM2ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5Q29uZmlnTG9hZGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0NvbmZpZ0xvYWRlci5oIgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBMb2NhbCBmdW5jdGlvbnMgcHJvdG90eXBlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgaW50IGxvYWRFZmZlY3RDb25maWdGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOworc3RhdGljIGludCBsb2FkTGlicmFyaWVzKGNub2RlICpyb290KTsKK3N0YXRpYyBpbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpOworc3RhdGljIGludCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCk7CitzdGF0aWMgaW50IGxvYWRFZmZlY3QoY25vZGUgKm5vZGUpOworLy8gVG8gZ2V0IGFuZCBhZGQgdGhlIGVmZmVjdCBwb2ludGVkIGJ5IHRoZSBwYXNzZWQgbm9kZSB0byB0aGUgZ1N1YkVmZmVjdExpc3QKK3N0YXRpYyBpbnQgYWRkU3ViRWZmZWN0KGNub2RlICpyb290KTsKK3N0YXRpYyBsaWJfZW50cnlfdCAqZ2V0TGlicmFyeShjb25zdCBjaGFyICpwYXRoKTsKKworc3RhdGljIGxpYl9lbnRyeV90ICpnQ2FjaGVkTGlicmFyeTsgIC8vIGxhc3QgbGlicmFyeSBhY2Nlc3NlZCBieSBnZXRMaWJyYXJ5KCkKKworaW50IEVmZmVjdExvYWRFZmZlY3RDb25maWcoKQoreworICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICByZXR1cm4gbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7CisgICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgcmV0dXJuIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsb2FkRWZmZWN0Q29uZmlnRmlsZShjb25zdCBjaGFyICpwYXRoKQoreworICAgIGNub2RlICpyb290OworICAgIGNoYXIgKmRhdGE7CisKKyAgICBkYXRhID0gbG9hZF9maWxlKHBhdGgsIE5VTEwpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOworICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOworICAgIGxvYWRMaWJyYXJpZXMocm9vdCk7CisgICAgbG9hZEVmZmVjdHMocm9vdCk7CisgICAgY29uZmlnX2ZyZWUocm9vdCk7CisgICAgZnJlZShyb290KTsKKyAgICBmcmVlKGRhdGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsb2FkTGlicmFyaWVzKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUklFU19UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBsb2FkTGlicmFyeShub2RlLCBub2RlLT5uYW1lKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWZkZWYgX19MUDY0X18KKy8vIGF1ZGlvX2VmZmVjdHMuY29uZiBhbHdheXMgc3BlY2lmaWVzIDMyIGJpdCBsaWIgcGF0aDogY29udmVydCB0byA2NCBiaXQgcGF0aCBpZiBuZWVkZWQKK3N0YXRpYyBjb25zdCBjaGFyICprTGlicmFyeVBhdGhSb290W10gPQorICAgICAgICB7Ii9vZG0vbGliNjQvc291bmRmeCIsICIvdmVuZG9yL2xpYjY0L3NvdW5kZngiLCAiL3N5c3RlbS9saWI2NC9zb3VuZGZ4In07CisjZWxzZQorc3RhdGljIGNvbnN0IGNoYXIgKmtMaWJyYXJ5UGF0aFJvb3RbXSA9CisgICAgICAgIHsiL29kbS9saWIvc291bmRmeCIsICIvdmVuZG9yL2xpYi9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliL3NvdW5kZngifTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgaW50IGtMaWJyYXJ5UGF0aFJvb3RTaXplID0KKyAgICAgICAgKHNpemVvZihrTGlicmFyeVBhdGhSb290KSAvIHNpemVvZihrTGlicmFyeVBhdGhSb290WzBdKSk7CisKKy8vIENoZWNrcyBpZiB0aGUgbGlicmFyeSBwYXRoIHBhc3NlZCBhcyBsaWJfcGF0aF9pbiBjYW4gYmUgb3BlbmVkIGFuZCBpZiBub3QKKy8vIHRyaWVzIGluIHN0YW5kYXJkIGVmZmVjdCBsaWJyYXJ5IGRpcmVjdG9yaWVzIHdpdGgganVzdCB0aGUgbGlicmFyeSBuYW1lIGFuZCByZXR1cm5zIGNvcnJlY3QgcGF0aAorLy8gaW4gbGliX3BhdGhfb3V0CitpbnQgY2hlY2tMaWJyYXJ5UGF0aChjb25zdCBjaGFyICpsaWJfcGF0aF9pbiwgY2hhciAqbGliX3BhdGhfb3V0KSB7CisgICAgY2hhciAqc3RyOworICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lOworICAgIHNpemVfdCBsZW47CisKKyAgICBpZiAobGliX3BhdGhfaW4gPT0gTlVMTCB8fCBsaWJfcGF0aF9vdXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzdHJsY3B5KGxpYl9wYXRoX291dCwgbGliX3BhdGhfaW4sIFBBVEhfTUFYKTsKKworICAgIC8vIFRyeSBleGFjdCBwYXRoIGZpcnN0CisgICAgc3RyID0gc3Ryc3RyKGxpYl9wYXRoX291dCwgIi9saWIvc291bmRmeC8iKTsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy8gRXh0cmFjdCBsaWJyYXJ5IG5hbWUgZnJvbSBpbnB1dCBwYXRoCisgICAgbGVuID0gc3RyIC0gbGliX3BhdGhfb3V0OworICAgIGxpYl9uYW1lID0gbGliX3BhdGhfaW4gKyBsZW4gKyBzdHJsZW4oIi9saWIvc291bmRmeC8iKTsKKworICAgIC8vIFRoZW4gdHJ5IHdpdGggbGlicmFyeSBuYW1lIGFuZCBzdGFuZGFyZCBwYXRoIG5hbWVzIGluIG9yZGVyIG9mIHByZWZlcmVuY2UKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtMaWJyYXJ5UGF0aFJvb3RTaXplOyBpKyspIHsKKyAgICAgICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKKworICAgICAgICBzbnByaW50ZihwYXRoLAorICAgICAgICAgICAgICAgICBQQVRIX01BWCwKKyAgICAgICAgICAgICAgICAgIiVzLyVzIiwKKyAgICAgICAgICAgICAgICAga0xpYnJhcnlQYXRoUm9vdFtpXSwKKyAgICAgICAgICAgICAgICAgbGliX25hbWUpOworICAgICAgICBpZiAoRl9PSyA9PSBhY2Nlc3MocGF0aCwgMCkpIHsKKyAgICAgICAgICAgIHN0cmNweShsaWJfcGF0aF9vdXQsIHBhdGgpOworICAgICAgICAgICAgQUxPR1dfSUYoc3RybmNtcChsaWJfcGF0aF9vdXQsIGxpYl9wYXRoX2luLCBQQVRIX01BWCkgIT0gMCwKKyAgICAgICAgICAgICAgICAiY2hlY2tMaWJyYXJ5UGF0aCgpIGNvcnJlY3RlZCBsaWJyYXJ5IHBhdGggJXMgdG8gJXMiLCBsaWJfcGF0aF9pbiwgbGliX3BhdGhfb3V0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtRUlOVkFMOworfQorCisKKworaW50IGxvYWRMaWJyYXJ5KGNub2RlICpyb290LCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNub2RlICpub2RlOworICAgIHZvaWQgKmhkbCA9IE5VTEw7CisgICAgYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqZGVzYzsKKyAgICBsaXN0X2VsZW1fdCAqZTsKKyAgICBsaWJfZW50cnlfdCAqbDsKKyAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFBBVEhfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChjaGVja0xpYnJhcnlQYXRoKChjb25zdCBjaGFyICopbm9kZS0+dmFsdWUsIHBhdGgpICE9IDApIHsKKyAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgY291bGQgbm90IGZpbmQgbGlicmFyeSAlcyIsIHBhdGgpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGhkbCA9IGRsb3BlbihwYXRoLCBSVExEX05PVyk7CisgICAgaWYgKGhkbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGZhaWxlZCB0byBvcGVuICVzIiwgcGF0aCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZGVzYyA9IChhdWRpb19lZmZlY3RfbGlicmFyeV90ICopZGxzeW0oaGRsLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpOworICAgIGlmIChkZXNjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgY291bGQgbm90IGZpbmQgc3ltYm9sICVzIiwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHICE9IGRlc2MtPnRhZykgeworICAgICAgICBBTE9HVygiZ2V0TGlicmFyeSgpIGJhZCB0YWcgJTA4eCBpbiBsaWIgaW5mbyBzdHJ1Y3QiLCBkZXNjLT50YWcpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZGVzYy0+dmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgYmFkIGxpYiB2ZXJzaW9uICUwOHgiLCBkZXNjLT52ZXJzaW9uKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBhZGQgZW50cnkgZm9yIGxpYnJhcnkgaW4gZ0xpYnJhcnlMaXN0CisgICAgbCA9IG1hbGxvYyhzaXplb2YobGliX2VudHJ5X3QpKTsKKyAgICBsLT5uYW1lID0gc3RybmR1cChuYW1lLCBQQVRIX01BWCk7CisgICAgbC0+cGF0aCA9IHN0cm5kdXAocGF0aCwgUEFUSF9NQVgpOworICAgIGwtPmhhbmRsZSA9IGhkbDsKKyAgICBsLT5kZXNjID0gZGVzYzsKKyAgICBsLT5lZmZlY3RzID0gTlVMTDsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmwtPmxvY2ssIE5VTEwpOworCisgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5vYmplY3QgPSBsOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworICAgIGUtPm5leHQgPSBnTGlicmFyeUxpc3Q7CisgICAgZ0xpYnJhcnlMaXN0ID0gZTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOworICAgIEFMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBsLCBwYXRoKTsKKworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBpZiAoaGRsICE9IE5VTEwpIHsKKyAgICAgICAgZGxjbG9zZShoZGwpOworICAgIH0KKyAgICAvL2FkZCBlbnRyeSBmb3IgbGlicmFyeSBlcnJvcnMgaW4gZ0xpYnJhcnlGYWlsZWRMaXN0CisgICAgbGliX2ZhaWxlZF9lbnRyeV90ICpmbCA9IG1hbGxvYyhzaXplb2YobGliX2ZhaWxlZF9lbnRyeV90KSk7CisgICAgZmwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKKyAgICBmbC0+cGF0aCA9IHN0cm5kdXAocGF0aCwgUEFUSF9NQVgpOworCisgICAgbGlzdF9lbGVtX3QgKmZlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOworICAgIGZlLT5vYmplY3QgPSBmbDsKKyAgICBmZS0+bmV4dCA9IGdMaWJyYXJ5RmFpbGVkTGlzdDsKKyAgICBnTGlicmFyeUZhaWxlZExpc3QgPSBmZTsKKyAgICBBTE9HVigiZ2V0TGlicmFyeSgpIGxpbmtlZCBlcnJvciBpbiBsaWJyYXJ5ICVwIGZvciBwYXRoICVzIiwgZmwsIHBhdGgpOworCisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8vIFRoaXMgd2lsbCBmaW5kIHRoZSBsaWJyYXJ5IGFuZCBVVUlEIHRhZ3Mgb2YgdGhlIHN1YiBlZmZlY3QgcG9pbnRlZCBieSB0aGUKKy8vIG5vZGUsIGdldHMgdGhlIGVmZmVjdCBkZXNjcmlwdG9yIGFuZCBsaWJfZW50cnlfdCBhbmQgYWRkcyB0aGUgc3ViZWZmZWN0IC0KKy8vIHN1Yl9lbnRyeV90IHRvIHRoZSBnU3ViRWZmZWN0TGlzdAoraW50IGFkZFN1YkVmZmVjdChjbm9kZSAqcm9vdCkKK3sKKyAgICBBTE9HVigiYWRkU3ViRWZmZWN0Iik7CisgICAgY25vZGUgKm5vZGU7CisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQ7CisgICAgbGliX2VudHJ5X3QgKmw7CisgICAgbGlzdF9lbGVtX3QgKmU7CisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUllfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBsID0gZ2V0TGlicmFyeShub2RlLT52YWx1ZSk7CisgICAgaWYgKGwgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiYWRkU3ViRWZmZWN0KCkgY291bGQgbm90IGdldCBsaWJyYXJ5ICVzIiwgbm9kZS0+dmFsdWUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFVVSURfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoc3RyaW5nVG9VdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gMCkgeworICAgICAgICBBTE9HVygiYWRkU3ViRWZmZWN0KCkgaW52YWxpZCB1dWlkICVzIiwgbm9kZS0+dmFsdWUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgZCA9IG1hbGxvYyhzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIGlmIChsLT5kZXNjLT5nZXRfZGVzY3JpcHRvcigmdXVpZCwgZCkgIT0gMCkgeworICAgICAgICBjaGFyIHNbNDBdOworICAgICAgICB1dWlkVG9TdHJpbmcoJnV1aWQsIHMsIDQwKTsKKyAgICAgICAgQUxPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLCBzLCBsLT5uYW1lKTsKKyAgICAgICAgZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGNoYXIgc1s1MTJdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIHNpemVvZihzKSwgMCAvKiBpbmRlbnQgKi8pOworICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QoKSByZWFkIGRlc2NyaXB0b3IgJXA6JXMiLGQsIHMpOworI2VuZGlmCisgICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkLT5hcGlWZXJzaW9uKSAhPQorICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OKSkgeworICAgICAgICBBTE9HVygiQmFkIEFQSSB2ZXJzaW9uICUwOHggb24gbGliICVzIiwgZC0+YXBpVmVyc2lvbiwgbC0+bmFtZSk7CisgICAgICAgIGZyZWUoZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKnN1Yl9lZmZlY3QgPSBtYWxsb2Moc2l6ZW9mKHN1Yl9lZmZlY3RfZW50cnlfdCkpOworICAgIHN1Yl9lZmZlY3QtPm9iamVjdCA9IGQ7CisgICAgLy8gbGliX2VudHJ5X3QgaXMgc3RvcmVkIHNpbmNlIHRoZSBzdWIgZWZmZWN0cyBhcmUgbm90IGxpbmtlZCB0byB0aGUgbGlicmFyeQorICAgIHN1Yl9lZmZlY3QtPmxpYiA9IGw7CisgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5vYmplY3QgPSBzdWJfZWZmZWN0OworICAgIGUtPm5leHQgPSBnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW07CisgICAgZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtID0gZTsKKyAgICBBTE9HVigiYWRkU3ViRWZmZWN0IGVuZCIpOworICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGU7CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgRUZGRUNUU19UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBsb2FkRWZmZWN0KG5vZGUpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsb2FkRWZmZWN0KGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlOworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBsaWJfZW50cnlfdCAqbDsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkOworICAgIGxpc3RfZWxlbV90ICplOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUllfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGwgPSBnZXRMaWJyYXJ5KG5vZGUtPnZhbHVlKTsKKyAgICBpZiAobCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgY291bGQgbm90IGdldCBsaWJyYXJ5ICVzIiwgbm9kZS0+dmFsdWUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChzdHJpbmdUb1V1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgaW52YWxpZCB1dWlkICVzIiwgbm9kZS0+dmFsdWUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgbGliX2VudHJ5X3QgKnRtcDsKKyAgICBib29sIHNraXAgPSBmYWxzZTsKKyAgICBpZiAoZmluZEVmZmVjdChOVUxMLCAmdXVpZCwgJnRtcCwgTlVMTCkgPT0gMCkgeworICAgICAgICBBTE9HVygic2tpcHBpbmcgZHVwbGljYXRlIHV1aWQgJXMgJXMiLCBub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICBub2RlLT5uZXh0ID8gImFuZCBpdHMgc3ViLWVmZmVjdHMiIDogIiIpOworICAgICAgICBza2lwID0gdHJ1ZTsKKyAgICB9CisKKyAgICBkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgaWYgKGwtPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZ1dWlkLCBkKSAhPSAwKSB7CisgICAgICAgIGNoYXIgc1s0MF07CisgICAgICAgIHV1aWRUb1N0cmluZygmdXVpZCwgcywgNDApOworICAgICAgICBBTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsIHMsIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisjaWYgKExPR19OREVCVUc9PTApCisgICAgY2hhciBzWzUxMl07CisgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7CisgICAgQUxPR1YoImxvYWRFZmZlY3QoKSByZWFkIGRlc2NyaXB0b3IgJXA6JXMiLGQsIHMpOworI2VuZGlmCisgICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkLT5hcGlWZXJzaW9uKSAhPQorICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OKSkgeworICAgICAgICBBTE9HVygiQmFkIEFQSSB2ZXJzaW9uICUwOHggb24gbGliICVzIiwgZC0+YXBpVmVyc2lvbiwgbC0+bmFtZSk7CisgICAgICAgIGZyZWUoZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOworICAgIGUtPm9iamVjdCA9IGQ7CisgICAgaWYgKHNraXApIHsKKyAgICAgICAgZS0+bmV4dCA9IGdTa2lwcGVkRWZmZWN0czsKKyAgICAgICAgZ1NraXBwZWRFZmZlY3RzID0gZTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZS0+bmV4dCA9IGwtPmVmZmVjdHM7CisgICAgICAgIGwtPmVmZmVjdHMgPSBlOworICAgIH0KKworICAgIC8vIEFmdGVyIHRoZSBVVUlEIG5vZGUgaW4gdGhlIGNvbmZpZ190cmVlLCBpZiBub2RlLT5uZXh0IGlzIHZhbGlkLAorICAgIC8vIHRoYXQgd291bGQgYmUgc3ViIGVmZmVjdCBub2RlLgorICAgIC8vIEZpbmQgdGhlIHN1YiBlZmZlY3RzIGFuZCBhZGQgdGhlbSB0byB0aGUgZ1N1YkVmZmVjdExpc3QKKyAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICBpbnQgY291bnQgPSAyOworICAgIGJvb2wgaHdTdWJlZnggPSBmYWxzZSwgc3dTdWJlZnggPSBmYWxzZTsKKyAgICBsaXN0X3N1Yl9lbGVtX3QgKnN1YmUgPSBOVUxMOworICAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIkFkZGluZyB0aGUgZWZmZWN0IHRvIGdFZmZlY3RTdWJMaXN0IGFzIHRoZXJlIGFyZSBzdWIgZWZmZWN0cyIpOworICAgICAgICBzdWJlID0gbWFsbG9jKHNpemVvZihsaXN0X3N1Yl9lbGVtX3QpKTsKKyAgICAgICAgc3ViZS0+b2JqZWN0ID0gZDsKKyAgICAgICAgc3ViZS0+c3ViX2VsZW0gPSBOVUxMOworICAgICAgICBzdWJlLT5uZXh0ID0gZ1N1YkVmZmVjdExpc3Q7CisgICAgICAgIGdTdWJFZmZlY3RMaXN0ID0gc3ViZTsKKyAgICB9CisgICAgd2hpbGUgKG5vZGUgIT0gTlVMTCAmJiBjb3VudCkgeworICAgICAgIGlmIChhZGRTdWJFZmZlY3Qobm9kZSkpIHsKKyAgICAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBjb3VsZCBub3QgYWRkIHN1YkVmZmVjdCAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBnU3ViRWZmZWN0TGlzdCB0byBwb2ludCB0byBvbGRlciBsaXN0OworICAgICAgICAgICBnU3ViRWZmZWN0TGlzdCA9IHN1YmUtPm5leHQ7CisgICAgICAgICAgIGZyZWUoc3ViZS0+c3ViX2VsZW0pOy8vIEZyZWUgYW4gYWxyZWFkeSBhZGRlZCBzdWIgZWZmZWN0CisgICAgICAgICAgIHN1YmUtPnN1Yl9lbGVtID0gTlVMTDsKKyAgICAgICAgICAgZnJlZShzdWJlKTsKKyAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgICAgfQorICAgICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqc3ViRW50cnkgPSAoc3ViX2VmZmVjdF9lbnRyeV90KilnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW0tPm9iamVjdDsKKyAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpzdWJFZmZlY3REZXNjID0gKGVmZmVjdF9kZXNjcmlwdG9yX3QqKShzdWJFbnRyeS0+b2JqZWN0KTsKKyAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBkdW1teSBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCisgICAgICAgLy8gZ2V0X2Rlc2NyaXB0b3IgY2FsbCx3ZSByZXBsYWNlIGl0IHdpdGggdGhlIGNvcnJlc3BvZGluZworICAgICAgIC8vIHN3IGVmZmVjdCBkZXNjcmlwdG9yLCBidXQgd2l0aCBQcm94eSBVVUlECisgICAgICAgLy8gY2hlY2sgZm9yIFN3IGRlc2MKKyAgICAgICAgaWYgKCEoKHN1YkVmZmVjdERlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfSFdfQUNDX01BU0spID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0ZMQUdfSFdfQUNDX1RVTk5FTCkpIHsKKyAgICAgICAgICAgICBzd1N1YmVmeCA9IHRydWU7CisgICAgICAgICAgICAgKmQgPSAqc3ViRWZmZWN0RGVzYzsKKyAgICAgICAgICAgICBkLT51dWlkID0gdXVpZDsKKyAgICAgICAgICAgICBBTE9HVigibG9hZEVmZmVjdCgpIENoYW5nZWQgdGhlIFByb3h5IGRlc2MiKTsKKyAgICAgICB9IGVsc2UKKyAgICAgICAgICAgaHdTdWJlZnggPSB0cnVlOworICAgICAgIGNvdW50LS07CisgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIC8vIDEgSFcgYW5kIDEgU1cgc3ViIGVmZmVjdCBmb3VuZC4gU2V0IHRoZSBvZmZsb2FkIGZsYWcgaW4gdGhlIFByb3h5IGRlc2MKKyAgICBpZiAoaHdTdWJlZnggJiYgc3dTdWJlZngpIHsKKyAgICAgICAgZC0+ZmxhZ3MgfD0gRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitsaWJfZW50cnlfdCAqZ2V0TGlicmFyeShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGxpc3RfZWxlbV90ICplOworCisgICAgaWYgKGdDYWNoZWRMaWJyYXJ5ICYmCisgICAgICAgICAgICAhc3RybmNtcChnQ2FjaGVkTGlicmFyeS0+bmFtZSwgbmFtZSwgUEFUSF9NQVgpKSB7CisgICAgICAgIHJldHVybiBnQ2FjaGVkTGlicmFyeTsKKyAgICB9CisKKyAgICBlID0gZ0xpYnJhcnlMaXN0OworICAgIHdoaWxlIChlKSB7CisgICAgICAgIGxpYl9lbnRyeV90ICpsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OworICAgICAgICBpZiAoIXN0cmNtcChsLT5uYW1lLCBuYW1lKSkgeworICAgICAgICAgICAgZ0NhY2hlZExpYnJhcnkgPSBsOworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKyAgICAgICAgZSA9IGUtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjgyNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNDT05GSUdMT0FERVJfSAorI2RlZmluZSBBTkRST0lEX0VGRkVDVFNDT05GSUdMT0FERVJfSAorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKiBQYXJzZXMgdGhlIHBsYXRmb3JtIGVmZmVjdCBjb25maWd1cmF0aW9uCisgKiBhbmQgc3RvcmVzIGl0cyBjb250ZW50IGluIHRoZSBnbG9iYWwgRWZmZWN0RmFjdG9yeVN0YXRlLiAqLworQU5EUk9JRF9BUEkKK2ludCBFZmZlY3RMb2FkRWZmZWN0Q29uZmlnKCk7CisKKworI2lmZGVmICBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBBTkRST0lEX0VGRkVDVFNDT05GSUdMT0FERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwppbmRleCAzN2MwYmI3Li5jZDBlNzY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwpAQCAtMTcsNjUgKzE3LDQ2IEBACiAjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5IgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnkuaCIKLQotI2luY2x1ZGUgPGRsZmNuLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzQ29uZmlnTG9hZGVyLmgiCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIgorI2luY2x1ZGUgIkVmZmVjdHNYbWxDb25maWdMb2FkZXIuaCIKKworI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5LmgiCiAKIHN0YXRpYyBsaXN0X2VsZW1fdCAqZ0VmZmVjdExpc3Q7IC8vIGxpc3Qgb2YgZWZmZWN0X2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgY3JlYXRlZCBlZmZlY3RzCi1zdGF0aWMgbGlzdF9lbGVtX3QgKmdMaWJyYXJ5TGlzdDsgLy8gbGlzdCBvZiBsaWJfZW50cnlfdDogYWxsIGN1cnJlbnRseSBsb2FkZWQgbGlicmFyaWVzCi1zdGF0aWMgbGlzdF9lbGVtX3QgKmdTa2lwcGVkRWZmZWN0czsgLy8gbGlzdCBvZiBlZmZlY3RzIHNraXBwZWQgYmVjYXVzZSBvZiBkdXBsaWNhdGUgdXVpZAotLy8gbGlzdCBvZiBlZmZlY3RfZGVzY3JpcHRvciBhbmQgbGlzdCBvZiBzdWIgZWZmZWN0cyA6IGFsbCBjdXJyZW50bHkgbG9hZGVkCi0vLyBJdCBkb2VzIG5vdCBjb250YWluIGVmZmVjdHMgd2l0aG91dCBzdWIgZWZmZWN0cy4KLXN0YXRpYyBsaXN0X3N1Yl9lbGVtX3QgKmdTdWJFZmZlY3RMaXN0Owotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBnTGliTG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7IC8vIGNvbnRyb2xzIGFjY2VzcyB0byBnTGlicmFyeUxpc3QKIHN0YXRpYyB1aW50MzJfdCBnTnVtRWZmZWN0czsgICAgICAgICAvLyB0b3RhbCBudW1iZXIgbnVtYmVyIG9mIGVmZmVjdHMKIHN0YXRpYyBsaXN0X2VsZW1fdCAqZ0N1ckxpYjsgICAgLy8gY3VycmVudCBsaWJyYXJ5IGluIGVudW1lcmF0aW9uIHByb2Nlc3MKIHN0YXRpYyBsaXN0X2VsZW1fdCAqZ0N1ckVmZmVjdDsgLy8gY3VycmVudCBlZmZlY3QgaW4gZW51bWVyYXRpb24gcHJvY2Vzcwogc3RhdGljIHVpbnQzMl90IGdDdXJFZmZlY3RJZHg7ICAgICAgIC8vIGN1cnJlbnQgZWZmZWN0IGluZGV4IGluIGVudW1lcmF0aW9uIHByb2Nlc3MKLXN0YXRpYyBsaWJfZW50cnlfdCAqZ0NhY2hlZExpYnJhcnk7ICAvLyBsYXN0IGxpYnJhcnkgYWNjZXNzZWQgYnkgZ2V0TGlicmFyeSgpCisvKiogTnVtYmVyIG9mIGVsZW1lbnRzIHNraXBwZWQgZHVyaW5nIHRoZSBlZmZlY3RzIGNvbmZpZ3VyYXRpb24gbG9hZGluZy4KKyAqICAtMSBpZiB0aGUgY29uZmlnIGxvYWRlciBmYWlsZWQKKyAqICAtMiBpZiBjb25maWcgbG9hZCB3YXMgc2tpcHBlZAorICovCitzdGF0aWMgc3NpemVfdCBnQ29uZmlnTmJFbGVtU2tpcHBlZCA9IC0yOwogCiBzdGF0aWMgaW50IGdJbml0RG9uZTsgLy8gdHJ1ZSBpcyBnbG9iYWwgaW5pdGlhbGl6YXRpb24gaGFzIGJlZW4gcHJlZm9ybWVkCiBzdGF0aWMgaW50IGdDYW5RdWVyeUVmZmVjdDsgLy8gaW5kaWNhdGVzIHRoYXQgY2FsbCB0byBFZmZlY3RRdWVyeUVmZmVjdCgpIGlzIHZhbGlkLCBpLmUuIHRoYXQgdGhlIGxpc3Qgb2YgZWZmZWN0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgbm90IG1vZGlmaWVkIHNpbmNlIGxhc3QgY2FsbCB0byBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoKQotCi1zdGF0aWMgbGlzdF9lbGVtX3QgKmdMaWJyYXJ5RmFpbGVkTGlzdDsgIC8vbGlzdCBvZiBsaWJfZmFpbGVkX2VudHJ5X3Q6IGxpYnJhcmllcyBmYWlsZWQgdG8gbG9hZAotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyAgICAgIExvY2FsIGZ1bmN0aW9ucyBwcm90b3R5cGVzCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHN0YXRpYyBpbnQgaW5pdCgpOwotc3RhdGljIGludCBsb2FkRWZmZWN0Q29uZmlnRmlsZShjb25zdCBjaGFyICpwYXRoKTsKLXN0YXRpYyBpbnQgbG9hZExpYnJhcmllcyhjbm9kZSAqcm9vdCk7Ci1zdGF0aWMgaW50IGxvYWRMaWJyYXJ5KGNub2RlICpyb290LCBjb25zdCBjaGFyICpuYW1lKTsKLXN0YXRpYyBpbnQgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QpOwotc3RhdGljIGludCBsb2FkRWZmZWN0KGNub2RlICpub2RlKTsKLS8vIFRvIGdldCBhbmQgYWRkIHRoZSBlZmZlY3QgcG9pbnRlZCBieSB0aGUgcGFzc2VkIG5vZGUgdG8gdGhlIGdTdWJFZmZlY3RMaXN0Ci1zdGF0aWMgaW50IGFkZFN1YkVmZmVjdChjbm9kZSAqcm9vdCk7Ci1zdGF0aWMgbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqcGF0aCk7CiBzdGF0aWMgdm9pZCByZXNldEVmZmVjdEVudW1lcmF0aW9uKCk7CiBzdGF0aWMgdWludDMyX3QgdXBkYXRlTnVtRWZmZWN0cygpOwotc3RhdGljIGludCBmaW5kRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCi0gICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYyk7CiAvLyBUbyBzZWFyY2ggYSBzdWJlZmZlY3QgaW4gdGhlIGdTdWJFZmZlY3RMaXN0CiBzdGF0aWMgaW50IGZpbmRTdWJFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKICAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAogICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOwotc3RhdGljIHZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBpbnQgaW5kZW50KTsKLXN0YXRpYyBpbnQgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCk7Ci1zdGF0aWMgaW50IHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyAgICAgIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBmdW5jdGlvbnMKQEAgLTQ2MSwxMCArNDQyLDEyIEBACiAgICAgaWYgKGlnbm9yZUZ4Q29uZkZpbGVzKSB7CiAgICAgICAgIEFMT0dJKCJBdWRpbyBlZmZlY3RzIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMgd2lsbCBiZSBpZ25vcmVkIik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFKTsKLSAgICAgICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgICAgIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICAgICAgZ0NvbmZpZ05iRWxlbVNraXBwZWQgPSBFZmZlY3RMb2FkWG1sRWZmZWN0Q29uZmlnKE5VTEwpOworICAgICAgICBpZiAoZ0NvbmZpZ05iRWxlbVNraXBwZWQgPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGxvYWQgWE1MIGVmZmVjdCBjb25maWd1cmF0aW9uLCBmYWxsYmFjayB0byAuY29uZiIpOworICAgICAgICAgICAgRWZmZWN0TG9hZEVmZmVjdENvbmZpZygpOworICAgICAgICB9IGVsc2UgaWYgKGdDb25maWdOYkVsZW1Ta2lwcGVkID4gMCkgeworICAgICAgICAgICAgQUxPR0UoIkVmZmVjdCBjb25maWcgaXMgcGFydGlhbGx5IGludmFsaWQsIHNraXBwZWQgJXpkIGVsZW1lbnRzIiwgZ0NvbmZpZ05iRWxlbVNraXBwZWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NzQsMzY3ICs0NTcsNiBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBjbm9kZSAqcm9vdDsKLSAgICBjaGFyICpkYXRhOwotCi0gICAgZGF0YSA9IGxvYWRfZmlsZShwYXRoLCBOVUxMKTsKLSAgICBpZiAoZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKLSAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKLSAgICBsb2FkTGlicmFyaWVzKHJvb3QpOwotICAgIGxvYWRFZmZlY3RzKHJvb3QpOwotICAgIGNvbmZpZ19mcmVlKHJvb3QpOwotICAgIGZyZWUocm9vdCk7Ci0gICAgZnJlZShkYXRhKTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgbG9hZExpYnJhcmllcyhjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqbm9kZTsKLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJJRVNfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgbG9hZExpYnJhcnkobm9kZSwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotI2lmZGVmIF9fTFA2NF9fCi0vLyBhdWRpb19lZmZlY3RzLmNvbmYgYWx3YXlzIHNwZWNpZmllcyAzMiBiaXQgbGliIHBhdGg6IGNvbnZlcnQgdG8gNjQgYml0IHBhdGggaWYgbmVlZGVkCi1zdGF0aWMgY29uc3QgY2hhciAqa0xpYnJhcnlQYXRoUm9vdFtdID0KLSAgICAgICAgeyIvb2RtL2xpYjY0L3NvdW5kZngiLCAiL3ZlbmRvci9saWI2NC9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliNjQvc291bmRmeCJ9OwotI2Vsc2UKLXN0YXRpYyBjb25zdCBjaGFyICprTGlicmFyeVBhdGhSb290W10gPQotICAgICAgICB7Ii9vZG0vbGliL3NvdW5kZngiLCAiL3ZlbmRvci9saWIvc291bmRmeCIsICIvc3lzdGVtL2xpYi9zb3VuZGZ4In07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IGludCBrTGlicmFyeVBhdGhSb290U2l6ZSA9Ci0gICAgICAgIChzaXplb2Yoa0xpYnJhcnlQYXRoUm9vdCkgLyBzaXplb2Yoa0xpYnJhcnlQYXRoUm9vdFswXSkpOwotCi0vLyBDaGVja3MgaWYgdGhlIGxpYnJhcnkgcGF0aCBwYXNzZWQgYXMgbGliX3BhdGhfaW4gY2FuIGJlIG9wZW5lZCBhbmQgaWYgbm90Ci0vLyB0cmllcyBpbiBzdGFuZGFyZCBlZmZlY3QgbGlicmFyeSBkaXJlY3RvcmllcyB3aXRoIGp1c3QgdGhlIGxpYnJhcnkgbmFtZSBhbmQgcmV0dXJucyBjb3JyZWN0IHBhdGgKLS8vIGluIGxpYl9wYXRoX291dAotaW50IGNoZWNrTGlicmFyeVBhdGgoY29uc3QgY2hhciAqbGliX3BhdGhfaW4sIGNoYXIgKmxpYl9wYXRoX291dCkgewotICAgIGNoYXIgKnN0cjsKLSAgICBjb25zdCBjaGFyICpsaWJfbmFtZTsKLSAgICBzaXplX3QgbGVuOwotCi0gICAgaWYgKGxpYl9wYXRoX2luID09IE5VTEwgfHwgbGliX3BhdGhfb3V0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgc3RybGNweShsaWJfcGF0aF9vdXQsIGxpYl9wYXRoX2luLCBQQVRIX01BWCk7Ci0KLSAgICAvLyBUcnkgZXhhY3QgcGF0aCBmaXJzdAotICAgIHN0ciA9IHN0cnN0cihsaWJfcGF0aF9vdXQsICIvbGliL3NvdW5kZngvIik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIC8vIEV4dHJhY3QgbGlicmFyeSBuYW1lIGZyb20gaW5wdXQgcGF0aAotICAgIGxlbiA9IHN0ciAtIGxpYl9wYXRoX291dDsKLSAgICBsaWJfbmFtZSA9IGxpYl9wYXRoX2luICsgbGVuICsgc3RybGVuKCIvbGliL3NvdW5kZngvIik7Ci0KLSAgICAvLyBUaGVuIHRyeSB3aXRoIGxpYnJhcnkgbmFtZSBhbmQgc3RhbmRhcmQgcGF0aCBuYW1lcyBpbiBvcmRlciBvZiBwcmVmZXJlbmNlCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTGlicmFyeVBhdGhSb290U2l6ZTsgaSsrKSB7Ci0gICAgICAgIGNoYXIgcGF0aFtQQVRIX01BWF07Ci0KLSAgICAgICAgc25wcmludGYocGF0aCwKLSAgICAgICAgICAgICAgICAgUEFUSF9NQVgsCi0gICAgICAgICAgICAgICAgICIlcy8lcyIsCi0gICAgICAgICAgICAgICAgIGtMaWJyYXJ5UGF0aFJvb3RbaV0sCi0gICAgICAgICAgICAgICAgIGxpYl9uYW1lKTsKLSAgICAgICAgaWYgKEZfT0sgPT0gYWNjZXNzKHBhdGgsIDApKSB7Ci0gICAgICAgICAgICBzdHJjcHkobGliX3BhdGhfb3V0LCBwYXRoKTsKLSAgICAgICAgICAgIEFMT0dXX0lGKHN0cm5jbXAobGliX3BhdGhfb3V0LCBsaWJfcGF0aF9pbiwgUEFUSF9NQVgpICE9IDAsCi0gICAgICAgICAgICAgICAgImNoZWNrTGlicmFyeVBhdGgoKSBjb3JyZWN0ZWQgbGlicmFyeSBwYXRoICVzIHRvICVzIiwgbGliX3BhdGhfaW4sIGxpYl9wYXRoX291dCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotCi0KLWludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBjbm9kZSAqbm9kZTsKLSAgICB2b2lkICpoZGwgPSBOVUxMOwotICAgIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKmRlc2M7Ci0gICAgbGlzdF9lbGVtX3QgKmU7Ci0gICAgbGliX2VudHJ5X3QgKmw7Ci0gICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBQQVRIX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoY2hlY2tMaWJyYXJ5UGF0aCgoY29uc3QgY2hhciAqKW5vZGUtPnZhbHVlLCBwYXRoKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgJXMiLCBwYXRoKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBoZGwgPSBkbG9wZW4ocGF0aCwgUlRMRF9OT1cpOwotICAgIGlmIChoZGwgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBmYWlsZWQgdG8gb3BlbiAlcyIsIHBhdGgpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGRlc2MgPSAoYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqKWRsc3ltKGhkbCwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKLSAgICBpZiAoZGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGNvdWxkIG5vdCBmaW5kIHN5bWJvbCAlcyIsIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRyAhPSBkZXNjLT50YWcpIHsKLSAgICAgICAgQUxPR1coImdldExpYnJhcnkoKSBiYWQgdGFnICUwOHggaW4gbGliIGluZm8gc3RydWN0IiwgZGVzYy0+dGFnKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGRlc2MtPnZlcnNpb24pICE9Ci0gICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04pKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGJhZCBsaWIgdmVyc2lvbiAlMDh4IiwgZGVzYy0+dmVyc2lvbik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgLy8gYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGluIGdMaWJyYXJ5TGlzdAotICAgIGwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9lbnRyeV90KSk7Ci0gICAgbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOwotICAgIGwtPnBhdGggPSBzdHJuZHVwKHBhdGgsIFBBVEhfTUFYKTsKLSAgICBsLT5oYW5kbGUgPSBoZGw7Ci0gICAgbC0+ZGVzYyA9IGRlc2M7Ci0gICAgbC0+ZWZmZWN0cyA9IE5VTEw7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZsLT5sb2NrLCBOVUxMKTsKLQotICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZS0+b2JqZWN0ID0gbDsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKLSAgICBlLT5uZXh0ID0gZ0xpYnJhcnlMaXN0OwotICAgIGdMaWJyYXJ5TGlzdCA9IGU7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKLSAgICBBTE9HVigiZ2V0TGlicmFyeSgpIGxpbmtlZCBsaWJyYXJ5ICVwIGZvciBwYXRoICVzIiwgbCwgcGF0aCk7Ci0KLSAgICByZXR1cm4gMDsKLQotZXJyb3I6Ci0gICAgaWYgKGhkbCAhPSBOVUxMKSB7Ci0gICAgICAgIGRsY2xvc2UoaGRsKTsKLSAgICB9Ci0gICAgLy9hZGQgZW50cnkgZm9yIGxpYnJhcnkgZXJyb3JzIGluIGdMaWJyYXJ5RmFpbGVkTGlzdAotICAgIGxpYl9mYWlsZWRfZW50cnlfdCAqZmwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9mYWlsZWRfZW50cnlfdCkpOwotICAgIGZsLT5uYW1lID0gc3RybmR1cChuYW1lLCBQQVRIX01BWCk7Ci0gICAgZmwtPnBhdGggPSBzdHJuZHVwKHBhdGgsIFBBVEhfTUFYKTsKLQotICAgIGxpc3RfZWxlbV90ICpmZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKLSAgICBmZS0+b2JqZWN0ID0gZmw7Ci0gICAgZmUtPm5leHQgPSBnTGlicmFyeUZhaWxlZExpc3Q7Ci0gICAgZ0xpYnJhcnlGYWlsZWRMaXN0ID0gZmU7Ci0gICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgZXJyb3IgaW4gbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGZsLCBwYXRoKTsKLQotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi0vLyBUaGlzIHdpbGwgZmluZCB0aGUgbGlicmFyeSBhbmQgVVVJRCB0YWdzIG9mIHRoZSBzdWIgZWZmZWN0IHBvaW50ZWQgYnkgdGhlCi0vLyBub2RlLCBnZXRzIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBhbmQgbGliX2VudHJ5X3QgYW5kIGFkZHMgdGhlIHN1YmVmZmVjdCAtCi0vLyBzdWJfZW50cnlfdCB0byB0aGUgZ1N1YkVmZmVjdExpc3QKLWludCBhZGRTdWJFZmZlY3QoY25vZGUgKnJvb3QpCi17Ci0gICAgQUxPR1YoImFkZFN1YkVmZmVjdCIpOwotICAgIGNub2RlICpub2RlOwotICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKLSAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkOwotICAgIGxpYl9lbnRyeV90ICpsOwotICAgIGxpc3RfZWxlbV90ICplOwotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgbCA9IGdldExpYnJhcnkobm9kZS0+dmFsdWUpOwotICAgIGlmIChsID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImFkZFN1YkVmZmVjdCgpIGNvdWxkIG5vdCBnZXQgbGlicmFyeSAlcyIsIG5vZGUtPnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKLSAgICAgICAgQUxPR1coImFkZFN1YkVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKLSAgICAgICAgY2hhciBzWzQwXTsKLSAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7Ci0gICAgICAgIEFMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwgcywgbC0+bmFtZSk7Ci0gICAgICAgIGZyZWUoZCk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSNpZiAoTE9HX05ERUJVRz09MCkKLSAgICBjaGFyIHNbNTEyXTsKLSAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKLSAgICBBTE9HVigiYWRkU3ViRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKLSNlbmRpZgotICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KLSAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTikpIHsKLSAgICAgICAgQUxPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOwotICAgICAgICBmcmVlKGQpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJfZWZmZWN0ID0gbWFsbG9jKHNpemVvZihzdWJfZWZmZWN0X2VudHJ5X3QpKTsKLSAgICBzdWJfZWZmZWN0LT5vYmplY3QgPSBkOwotICAgIC8vIGxpYl9lbnRyeV90IGlzIHN0b3JlZCBzaW5jZSB0aGUgc3ViIGVmZmVjdHMgYXJlIG5vdCBsaW5rZWQgdG8gdGhlIGxpYnJhcnkKLSAgICBzdWJfZWZmZWN0LT5saWIgPSBsOwotICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZS0+b2JqZWN0ID0gc3ViX2VmZmVjdDsKLSAgICBlLT5uZXh0ID0gZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtOwotICAgIGdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbSA9IGU7Ci0gICAgQUxPR1YoImFkZFN1YkVmZmVjdCBlbmQiKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlOwotCi0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEVGRkVDVFNfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgbG9hZEVmZmVjdChub2RlKTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgbG9hZEVmZmVjdChjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqbm9kZTsKLSAgICBlZmZlY3RfdXVpZF90IHV1aWQ7Ci0gICAgbGliX2VudHJ5X3QgKmw7Ci0gICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKLSAgICBsaXN0X2VsZW1fdCAqZTsKLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBsID0gZ2V0TGlicmFyeShub2RlLT52YWx1ZSk7Ci0gICAgaWYgKGwgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGNvdWxkIG5vdCBnZXQgbGlicmFyeSAlcyIsIG5vZGUtPnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFVVSURfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBpZiAoc3RyaW5nVG9VdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gMCkgewotICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGxpYl9lbnRyeV90ICp0bXA7Ci0gICAgYm9vbCBza2lwID0gZmFsc2U7Ci0gICAgaWYgKGZpbmRFZmZlY3QoTlVMTCwgJnV1aWQsICZ0bXAsIE5VTEwpID09IDApIHsKLSAgICAgICAgQUxPR1coInNraXBwaW5nIGR1cGxpY2F0ZSB1dWlkICVzICVzIiwgbm9kZS0+dmFsdWUsCi0gICAgICAgICAgICAgICAgbm9kZS0+bmV4dCA/ICJhbmQgaXRzIHN1Yi1lZmZlY3RzIiA6ICIiKTsKLSAgICAgICAgc2tpcCA9IHRydWU7Ci0gICAgfQotCi0gICAgZCA9IG1hbGxvYyhzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgIGlmIChsLT5kZXNjLT5nZXRfZGVzY3JpcHRvcigmdXVpZCwgZCkgIT0gMCkgewotICAgICAgICBjaGFyIHNbNDBdOwotICAgICAgICB1dWlkVG9TdHJpbmcoJnV1aWQsIHMsIDQwKTsKLSAgICAgICAgQUxPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLCBzLCBsLT5uYW1lKTsKLSAgICAgICAgZnJlZShkKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotI2lmIChMT0dfTkRFQlVHPT0wKQotICAgIGNoYXIgc1s1MTJdOwotICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIHNpemVvZihzKSwgMCAvKiBpbmRlbnQgKi8pOwotICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKLSNlbmRpZgotICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KLSAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTikpIHsKLSAgICAgICAgQUxPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOwotICAgICAgICBmcmVlKGQpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKLSAgICBlLT5vYmplY3QgPSBkOwotICAgIGlmIChza2lwKSB7Ci0gICAgICAgIGUtPm5leHQgPSBnU2tpcHBlZEVmZmVjdHM7Ci0gICAgICAgIGdTa2lwcGVkRWZmZWN0cyA9IGU7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGUtPm5leHQgPSBsLT5lZmZlY3RzOwotICAgICAgICBsLT5lZmZlY3RzID0gZTsKLSAgICB9Ci0KLSAgICAvLyBBZnRlciB0aGUgVVVJRCBub2RlIGluIHRoZSBjb25maWdfdHJlZSwgaWYgbm9kZS0+bmV4dCBpcyB2YWxpZCwKLSAgICAvLyB0aGF0IHdvdWxkIGJlIHN1YiBlZmZlY3Qgbm9kZS4KLSAgICAvLyBGaW5kIHRoZSBzdWIgZWZmZWN0cyBhbmQgYWRkIHRoZW0gdG8gdGhlIGdTdWJFZmZlY3RMaXN0Ci0gICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgaW50IGNvdW50ID0gMjsKLSAgICBib29sIGh3U3ViZWZ4ID0gZmFsc2UsIHN3U3ViZWZ4ID0gZmFsc2U7Ci0gICAgbGlzdF9zdWJfZWxlbV90ICpzdWJlID0gTlVMTDsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJBZGRpbmcgdGhlIGVmZmVjdCB0byBnRWZmZWN0U3ViTGlzdCBhcyB0aGVyZSBhcmUgc3ViIGVmZmVjdHMiKTsKLSAgICAgICAgc3ViZSA9IG1hbGxvYyhzaXplb2YobGlzdF9zdWJfZWxlbV90KSk7Ci0gICAgICAgIHN1YmUtPm9iamVjdCA9IGQ7Ci0gICAgICAgIHN1YmUtPnN1Yl9lbGVtID0gTlVMTDsKLSAgICAgICAgc3ViZS0+bmV4dCA9IGdTdWJFZmZlY3RMaXN0OwotICAgICAgICBnU3ViRWZmZWN0TGlzdCA9IHN1YmU7Ci0gICAgfQotICAgIHdoaWxlIChub2RlICE9IE5VTEwgJiYgY291bnQpIHsKLSAgICAgICBpZiAoYWRkU3ViRWZmZWN0KG5vZGUpKSB7Ci0gICAgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgY291bGQgbm90IGFkZCBzdWJFZmZlY3QgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgICAgIC8vIENoYW5nZSB0aGUgZ1N1YkVmZmVjdExpc3QgdG8gcG9pbnQgdG8gb2xkZXIgbGlzdDsKLSAgICAgICAgICAgZ1N1YkVmZmVjdExpc3QgPSBzdWJlLT5uZXh0OwotICAgICAgICAgICBmcmVlKHN1YmUtPnN1Yl9lbGVtKTsvLyBGcmVlIGFuIGFscmVhZHkgYWRkZWQgc3ViIGVmZmVjdAotICAgICAgICAgICBzdWJlLT5zdWJfZWxlbSA9IE5VTEw7Ci0gICAgICAgICAgIGZyZWUoc3ViZSk7Ci0gICAgICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgICAgIH0KLSAgICAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKnN1YkVudHJ5ID0gKHN1Yl9lZmZlY3RfZW50cnlfdCopZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtLT5vYmplY3Q7Ci0gICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqc3ViRWZmZWN0RGVzYyA9IChlZmZlY3RfZGVzY3JpcHRvcl90Kikoc3ViRW50cnktPm9iamVjdCk7Ci0gICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgZHVtbXkgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZwotICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsd2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBjb3JyZXNwb2RpbmcKLSAgICAgICAvLyBzdyBlZmZlY3QgZGVzY3JpcHRvciwgYnV0IHdpdGggUHJveHkgVVVJRAotICAgICAgIC8vIGNoZWNrIGZvciBTdyBkZXNjCi0gICAgICAgIGlmICghKChzdWJFZmZlY3REZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19NQVNLKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwpKSB7Ci0gICAgICAgICAgICAgc3dTdWJlZnggPSB0cnVlOwotICAgICAgICAgICAgICpkID0gKnN1YkVmZmVjdERlc2M7Ci0gICAgICAgICAgICAgZC0+dXVpZCA9IHV1aWQ7Ci0gICAgICAgICAgICAgQUxPR1YoImxvYWRFZmZlY3QoKSBDaGFuZ2VkIHRoZSBQcm94eSBkZXNjIik7Ci0gICAgICAgfSBlbHNlCi0gICAgICAgICAgIGh3U3ViZWZ4ID0gdHJ1ZTsKLSAgICAgICBjb3VudC0tOwotICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICAvLyAxIEhXIGFuZCAxIFNXIHN1YiBlZmZlY3QgZm91bmQuIFNldCB0aGUgb2ZmbG9hZCBmbGFnIGluIHRoZSBQcm94eSBkZXNjCi0gICAgaWYgKGh3U3ViZWZ4ICYmIHN3U3ViZWZ4KSB7Ci0gICAgICAgIGQtPmZsYWdzIHw9IEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogLy8gU2VhcmNoZXMgdGhlIHN1YiBlZmZlY3QgbWF0Y2hpbmcgdG8gdGhlIHNwZWNpZmllZCB1dWlkCiAvLyBpbiB0aGUgZ1N1YkVmZmVjdExpc3QuIEl0IGdldHMgdGhlIGxpYl9lbnRyeV90IGZvcgogLy8gdGhlIG1hdGNoZWQgc3ViX2VmZmVjdCAuIFVzZWQgaW4gRWZmZWN0Q3JlYXRlIG9mIHN1YiBlZmZlY3RzCkBAIC04ODEsMjkgKzUwMyw2IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBsaXN0X2VsZW1fdCAqZTsKLQotICAgIGlmIChnQ2FjaGVkTGlicmFyeSAmJgotICAgICAgICAgICAgIXN0cm5jbXAoZ0NhY2hlZExpYnJhcnktPm5hbWUsIG5hbWUsIFBBVEhfTUFYKSkgewotICAgICAgICByZXR1cm4gZ0NhY2hlZExpYnJhcnk7Ci0gICAgfQotCi0gICAgZSA9IGdMaWJyYXJ5TGlzdDsKLSAgICB3aGlsZSAoZSkgewotICAgICAgICBsaWJfZW50cnlfdCAqbCA9IChsaWJfZW50cnlfdCAqKWUtPm9iamVjdDsKLSAgICAgICAgaWYgKCFzdHJjbXAobC0+bmFtZSwgbmFtZSkpIHsKLSAgICAgICAgICAgIGdDYWNoZWRMaWJyYXJ5ID0gbDsKLSAgICAgICAgICAgIHJldHVybiBsOwotICAgICAgICB9Ci0gICAgICAgIGUgPSBlLT5uZXh0OwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0KIHZvaWQgcmVzZXRFZmZlY3RFbnVtZXJhdGlvbigpCiB7CiAgICAgZ0N1ckxpYiA9IGdMaWJyYXJ5TGlzdDsKQEAgLTkzNSwxMTQgKzUzNCw2IEBACiAgICAgcmV0dXJuIGNudDsKIH0KIAotaW50IGZpbmRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKLSAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKQotewotICAgIGxpc3RfZWxlbV90ICplID0gZ0xpYnJhcnlMaXN0OwotICAgIGxpYl9lbnRyeV90ICpsID0gTlVMTDsKLSAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkID0gTlVMTDsKLSAgICBpbnQgZm91bmQgPSAwOwotICAgIGludCByZXQgPSAwOwotCi0gICAgd2hpbGUgKGUgJiYgIWZvdW5kKSB7Ci0gICAgICAgIGwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7Ci0gICAgICAgIGxpc3RfZWxlbV90ICplZnggPSBsLT5lZmZlY3RzOwotICAgICAgICB3aGlsZSAoZWZ4KSB7Ci0gICAgICAgICAgICBkID0gKGVmZmVjdF9kZXNjcmlwdG9yX3QgKillZngtPm9iamVjdDsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IE5VTEwgJiYgbWVtY21wKCZkLT50eXBlLCB0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodXVpZCAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dXVpZCwgdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWZ4ID0gZWZ4LT5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIGUgPSBlLT5uZXh0OwotICAgIH0KLSAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgIEFMT0dWKCJmaW5kRWZmZWN0KCkgZWZmZWN0IG5vdCBmb3VuZCIpOwotICAgICAgICByZXQgPSAtRU5PRU5UOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJmaW5kRWZmZWN0KCkgZm91bmQgZWZmZWN0OiAlcyBpbiBsaWIgJXMiLCBkLT5uYW1lLCBsLT5uYW1lKTsKLSAgICAgICAgKmxpYiA9IGw7Ci0gICAgICAgIGlmIChkZXNjKSB7Ci0gICAgICAgICAgICAqZGVzYyA9IGQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCkgewotICAgIGNoYXIgc1syNTZdOwotICAgIGNoYXIgc3NbMjU2XTsKLSAgICBjaGFyIGlkdFtpbmRlbnQgKyAxXTsKLQotICAgIG1lbXNldChpZHQsICcgJywgaW5kZW50KTsKLSAgICBpZHRbaW5kZW50XSA9IDA7Ci0KLSAgICBzdHJbMF0gPSAwOwotCi0gICAgc25wcmludGYocywgc2l6ZW9mKHMpLCAiJXMlcyAvICVzXG4iLCBpZHQsIGRlc2MtPm5hbWUsIGRlc2MtPmltcGxlbWVudG9yKTsKLSAgICBzdHJsY2F0KHN0ciwgcywgbGVuKTsKLQotICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dXVpZCwgcywgc2l6ZW9mKHMpKTsKLSAgICBzbnByaW50Zihzcywgc2l6ZW9mKHNzKSwgIiVzICBVVUlEOiAlc1xuIiwgaWR0LCBzKTsKLSAgICBzdHJsY2F0KHN0ciwgc3MsIGxlbik7Ci0KLSAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnR5cGUsIHMsIHNpemVvZihzKSk7Ci0gICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVFlQRTogJXNcbiIsIGlkdCwgcyk7Ci0gICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOwotCi0gICAgc3ByaW50ZihzLCAiJXMgIGFwaVZlcnNpb246ICUwOFhcbiVzICBmbGFnczogJTA4WFxuIiwgaWR0LAotICAgICAgICAgICAgZGVzYy0+YXBpVmVyc2lvbiwgaWR0LCBkZXNjLT5mbGFncyk7Ci0gICAgc3RybGNhdChzdHIsIHMsIGxlbik7Ci19Ci0KLWludCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKQotewotICAgIGludCB0bXBbMTBdOwotCi0gICAgaWYgKHNzY2FuZihzdHIsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCi0gICAgICAgICAgICB0bXAsIHRtcCsxLCB0bXArMiwgdG1wKzMsIHRtcCs0LCB0bXArNSwgdG1wKzYsIHRtcCs3LCB0bXArOCwgdG1wKzkpIDwgMTApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIHV1aWQtPnRpbWVMb3cgPSAodWludDMyX3QpdG1wWzBdOwotICAgIHV1aWQtPnRpbWVNaWQgPSAodWludDE2X3QpdG1wWzFdOwotICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24gPSAodWludDE2X3QpdG1wWzJdOwotICAgIHV1aWQtPmNsb2NrU2VxID0gKHVpbnQxNl90KXRtcFszXTsKLSAgICB1dWlkLT5ub2RlWzBdID0gKHVpbnQ4X3QpdG1wWzRdOwotICAgIHV1aWQtPm5vZGVbMV0gPSAodWludDhfdCl0bXBbNV07Ci0gICAgdXVpZC0+bm9kZVsyXSA9ICh1aW50OF90KXRtcFs2XTsKLSAgICB1dWlkLT5ub2RlWzNdID0gKHVpbnQ4X3QpdG1wWzddOwotICAgIHV1aWQtPm5vZGVbNF0gPSAodWludDhfdCl0bXBbOF07Ci0gICAgdXVpZC0+bm9kZVs1XSA9ICh1aW50OF90KXRtcFs5XTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbikKLXsKLQotICAgIHNucHJpbnRmKHN0ciwgbWF4TGVuLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAotICAgICAgICAgICAgdXVpZC0+dGltZUxvdywKLSAgICAgICAgICAgIHV1aWQtPnRpbWVNaWQsCi0gICAgICAgICAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uLAotICAgICAgICAgICAgdXVpZC0+Y2xvY2tTZXEsCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzBdLAotICAgICAgICAgICAgdXVpZC0+bm9kZVsxXSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbMl0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzNdLAotICAgICAgICAgICAgdXVpZC0+bm9kZVs0XSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbNV0pOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KIGludCBFZmZlY3REdW1wRWZmZWN0cyhpbnQgZmQpIHsKICAgICBjaGFyIHNbNTEyXTsKIApAQCAtMTA5Miw2ICs1ODMsMjAgQEAKICAgICAgICAgICAgIGUgPSBlLT5uZXh0OwogICAgICAgICB9CiAgICAgfQorICAgIHN3aXRjaCAoZ0NvbmZpZ05iRWxlbVNraXBwZWQpIHsKKyAgICBjYXNlIC0yOgorICAgICAgICBkcHJpbnRmKGZkLCAiRWZmZWN0IGNvbmZpZ3VyYXRpb24gbG9hZGluZyBza2lwcGVkLlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgLTE6CisgICAgICAgIGRwcmludGYoZmQsICJYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24gZmFpbGVkIHRvIGxvYWQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAwOgorICAgICAgICBkcHJpbnRmKGZkLCAiWE1MIGVmZmVjdCBjb25maWd1cmF0aW9uIGxvYWRlZCBzdWNjZXNzZnVsbHkuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZHByaW50ZihmZCwgIlhNTCBlZmZlY3QgY29uZmlndXJhdGlvbiBwYXJ0aWFsbHkgbG9hZGVkLCBza2lwcGVkICV6ZCBlbGVtZW50cy5cbiIsCisgICAgICAgICAgICAgICAgZ0NvbmZpZ05iRWxlbVNraXBwZWQpOworICAgIH0KICAgICByZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5oCmluZGV4IDcyZTA5MzEuLjI5ZGJjOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KIAogI2lmIF9fY3BsdXNwbHVzCkBAIC05Niw2ICs5Niw3IEBACiAvLyAgICAgICAgKnBEZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBzdWIgZWZmZWN0IGRlc2NyaXB0b3JzLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdEdldFN1YkVmZmVjdHMoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKipwU3ViZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeVN0YXRlLmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNjQwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeVN0YXRlIgorCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIgorCisjaW5jbHVkZSAibG9nL2xvZy5oIgorCitsaXN0X2VsZW1fdCAqZ0xpYnJhcnlMaXN0OworbGlzdF9lbGVtX3QgKmdTa2lwcGVkRWZmZWN0czsKK2xpc3Rfc3ViX2VsZW1fdCAqZ1N1YkVmZmVjdExpc3Q7CitwdGhyZWFkX211dGV4X3QgZ0xpYkxvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCitsaXN0X2VsZW1fdCAqZ0xpYnJhcnlGYWlsZWRMaXN0OyAgLy9saXN0IG9mIGxpYl9mYWlsZWRfZW50cnlfdDogbGlicmFyaWVzIGZhaWxlZCB0byBsb2FkCisKKworaW50IGZpbmRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKKyAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKQoreworICAgIGxpc3RfZWxlbV90ICplID0gZ0xpYnJhcnlMaXN0OworICAgIGxpYl9lbnRyeV90ICpsID0gTlVMTDsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkID0gTlVMTDsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCByZXQgPSAwOworCisgICAgd2hpbGUgKGUgJiYgIWZvdW5kKSB7CisgICAgICAgIGwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7CisgICAgICAgIGxpc3RfZWxlbV90ICplZnggPSBsLT5lZmZlY3RzOworICAgICAgICB3aGlsZSAoZWZ4KSB7CisgICAgICAgICAgICBkID0gKGVmZmVjdF9kZXNjcmlwdG9yX3QgKillZngtPm9iamVjdDsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IE5VTEwgJiYgbWVtY21wKCZkLT50eXBlLCB0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXVpZCAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dXVpZCwgdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZ4ID0gZWZ4LT5uZXh0OworICAgICAgICB9CisgICAgICAgIGUgPSBlLT5uZXh0OworICAgIH0KKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIEFMT0dWKCJmaW5kRWZmZWN0KCkgZWZmZWN0IG5vdCBmb3VuZCIpOworICAgICAgICByZXQgPSAtRU5PRU5UOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJmaW5kRWZmZWN0KCkgZm91bmQgZWZmZWN0OiAlcyBpbiBsaWIgJXMiLCBkLT5uYW1lLCBsLT5uYW1lKTsKKyAgICAgICAgKmxpYiA9IGw7CisgICAgICAgIGlmIChkZXNjKSB7CisgICAgICAgICAgICAqZGVzYyA9IGQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCkKK3sKKyAgICBpbnQgdG1wWzEwXTsKKworICAgIGlmIChzc2NhbmYoc3RyLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgdG1wLCB0bXArMSwgdG1wKzIsIHRtcCszLCB0bXArNCwgdG1wKzUsIHRtcCs2LCB0bXArNywgdG1wKzgsIHRtcCs5KSA8IDEwKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICB1dWlkLT50aW1lTG93ID0gKHVpbnQzMl90KXRtcFswXTsKKyAgICB1dWlkLT50aW1lTWlkID0gKHVpbnQxNl90KXRtcFsxXTsKKyAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uID0gKHVpbnQxNl90KXRtcFsyXTsKKyAgICB1dWlkLT5jbG9ja1NlcSA9ICh1aW50MTZfdCl0bXBbM107CisgICAgdXVpZC0+bm9kZVswXSA9ICh1aW50OF90KXRtcFs0XTsKKyAgICB1dWlkLT5ub2RlWzFdID0gKHVpbnQ4X3QpdG1wWzVdOworICAgIHV1aWQtPm5vZGVbMl0gPSAodWludDhfdCl0bXBbNl07CisgICAgdXVpZC0+bm9kZVszXSA9ICh1aW50OF90KXRtcFs3XTsKKyAgICB1dWlkLT5ub2RlWzRdID0gKHVpbnQ4X3QpdG1wWzhdOworICAgIHV1aWQtPm5vZGVbNV0gPSAodWludDhfdCl0bXBbOV07CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pCit7CisKKyAgICBzbnByaW50ZihzdHIsIG1heExlbiwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIHV1aWQtPnRpbWVMb3csCisgICAgICAgICAgICB1dWlkLT50aW1lTWlkLAorICAgICAgICAgICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiwKKyAgICAgICAgICAgIHV1aWQtPmNsb2NrU2VxLAorICAgICAgICAgICAgdXVpZC0+bm9kZVswXSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbMV0sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzJdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVszXSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbNF0sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzVdKTsKKworICAgIHJldHVybiAwOworfQorCisKK3ZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBpbnQgaW5kZW50KSB7CisgICAgY2hhciBzWzI1Nl07CisgICAgY2hhciBzc1syNTZdOworICAgIGNoYXIgaWR0W2luZGVudCArIDFdOworCisgICAgbWVtc2V0KGlkdCwgJyAnLCBpbmRlbnQpOworICAgIGlkdFtpbmRlbnRdID0gMDsKKworICAgIHN0clswXSA9IDA7CisKKyAgICBzbnByaW50ZihzLCBzaXplb2YocyksICIlcyVzIC8gJXNcbiIsIGlkdCwgZGVzYy0+bmFtZSwgZGVzYy0+aW1wbGVtZW50b3IpOworICAgIHN0cmxjYXQoc3RyLCBzLCBsZW4pOworCisgICAgdXVpZFRvU3RyaW5nKCZkZXNjLT51dWlkLCBzLCBzaXplb2YocykpOworICAgIHNucHJpbnRmKHNzLCBzaXplb2Yoc3MpLCAiJXMgIFVVSUQ6ICVzXG4iLCBpZHQsIHMpOworICAgIHN0cmxjYXQoc3RyLCBzcywgbGVuKTsKKworICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dHlwZSwgcywgc2l6ZW9mKHMpKTsKKyAgICBzbnByaW50Zihzcywgc2l6ZW9mKHNzKSwgIiVzICBUWVBFOiAlc1xuIiwgaWR0LCBzKTsKKyAgICBzdHJsY2F0KHN0ciwgc3MsIGxlbik7CisKKyAgICBzcHJpbnRmKHMsICIlcyAgYXBpVmVyc2lvbjogJTA4WFxuJXMgIGZsYWdzOiAlMDhYXG4iLCBpZHQsCisgICAgICAgICAgICBkZXNjLT5hcGlWZXJzaW9uLCBpZHQsIGRlc2MtPmZsYWdzKTsKKyAgICBzdHJsY2F0KHN0ciwgcywgbGVuKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeVN0YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZjk0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUU0ZBQ1RPUllTVEFURV9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVFNGQUNUT1JZU1RBVEVfSF8KKworI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5LmgiCisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEBmaWxlIENvbnRhaW5zIHRoZSBzdGF0ZSBzaGFyZWQgd2l0aCBjb25maWd1cmF0aW9uIGxvYWRlciBvZiB0aGUgRWZmZWN0IGZhY3RvcnkuCisgKiAgICAgICAgVGhpcyBnbG9iYWwgc3RhdGUgc2hvdWxkIHByb2JhYmx5IGJlIHJlZmFjdG9yIGluIGEgc3RydWN0dXJlCisgKiAgICAgICAgcHJvdmlkZWQgYnkgdGhlIGNvbmZpZyBsb2FkZXIgb24gRWZmZWN0c0ZhY3RvcnkgaW5pdC4KKyAqICAgICAgICBUaGlzIGhlYWRlciBhbHNvIGNvbnRhaW5zIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIG9uIHRoZSBzdGF0ZS4KKyAqLworCitleHRlcm4gbGlzdF9lbGVtX3QgKmdMaWJyYXJ5TGlzdDsgLy8gbGlzdCBvZiBsaWJfZW50cnlfdDogYWxsIGN1cnJlbnRseSBsb2FkZWQgbGlicmFyaWVzCisvLyBsaXN0IG9mIGVmZmVjdHMgc2tpcHBlZCBiZWNhdXNlIG9mIGR1cGxpY2F0ZSB1dWlkIG9yIGludmFsaWQgdmVyc2lvbgorZXh0ZXJuIGxpc3RfZWxlbV90ICpnU2tpcHBlZEVmZmVjdHM7CisvLyBsaXN0IG9mIGVmZmVjdF9kZXNjcmlwdG9yIGFuZCBsaXN0IG9mIHN1YiBlZmZlY3RzIDogYWxsIGN1cnJlbnRseSBsb2FkZWQKKy8vIEl0IGRvZXMgbm90IGNvbnRhaW4gZWZmZWN0cyB3aXRob3V0IHN1YiBlZmZlY3RzLgorZXh0ZXJuIGxpc3Rfc3ViX2VsZW1fdCAqZ1N1YkVmZmVjdExpc3Q7CitleHRlcm4gcHRocmVhZF9tdXRleF90IGdMaWJMb2NrOyAvLyBjb250cm9scyBhY2Nlc3MgdG8gZ0xpYnJhcnlMaXN0CisKK2V4dGVybiBsaXN0X2VsZW1fdCAqZ0xpYnJhcnlGYWlsZWRMaXN0OyAgLy9saXN0IG9mIGxpYl9mYWlsZWRfZW50cnlfdDogbGlicmFyaWVzIGZhaWxlZCB0byBsb2FkCisKKworCitpbnQgZmluZEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAorICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOworCitpbnQgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCk7CisvKiogVXNlZCB0byBsb2cgVVVJRHMgKi8KK2ludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKTsKKworLyoqIFVzZWQgZm9yIGRlYnVnaW5nLiAqLwordm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCBpbmRlbnQpOworCisjaWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBBTkRST0lEX0VGRkVDVFNGQUNUT1JZU1RBVEVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzhiNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUNvbmZpZ0xvYWRlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNDb25maWcuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNDb25maWdMb2FkZXIuaCIKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisjaW5jbHVkZSAiRWZmZWN0c1htbENvbmZpZ0xvYWRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG5hbWVzcGFjZSBlZmZlY3RzQ29uZmlnOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgIExvY2FsIGZ1bmN0aW9ucworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgeworCisvKiogU2ltaWxhcmx5IHRvIGRsb3BlbiwgbG9va3MgZm9yIHRoZSBwcm92aWRlZCBwYXRoIGluIExEX0VGRkVDVF9MSUJSQVJZX1BBVEguCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxpYnJhcnkgaXMgZm91bmQgYW5kIHNldCByZXNvbHZlZFBhdGggdG8gaXRzIGFic29sdXRlIHBhdGguCisgKiAgICAgICAgIGZhbHNlIGlmIG5vdCBmb3VuZAorICovCitib29sIHJlc29sdmVMaWJyYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogcmVzb2x2ZWRQYXRoKSB7CisgICAgZm9yIChhdXRvKiBsaWJyYXJ5RGlyZWN0b3J5IDogTERfRUZGRUNUX0xJQlJBUllfUEFUSCkgeworICAgICAgICBzdGQ6OnN0cmluZyBjYW5kaWRhdGVQYXRoID0gc3RkOjpzdHJpbmcobGlicmFyeURpcmVjdG9yeSkgKyAnLycgKyBwYXRoOworICAgICAgICBpZiAoYWNjZXNzKGNhbmRpZGF0ZVBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgKnJlc29sdmVkUGF0aCA9IHN0ZDo6bW92ZShjYW5kaWRhdGVQYXRoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqIExvYWRzIGEgbGlicmFyeSBnaXZlbiBpdHMgcmVsYXRpdmUgcGF0aCBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gbGliRW50cnkuCisgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcyB3aXRoIGxpYkVudHJ5J3MgcGF0aCwgaGFuZGxlIGFuZCBkZXNjIGZpbGxlZAorICogICAgICAgICBmYWxzZSBvbiBzdWNjZXNzIHdpdGggbGliRW50cnkncyBwYXRoIGZpbGxlZCB3aXRoIHRoZSBwYXRoIG9mIHRoZSBmYWlsZWQgbGliCisgKiBUaGUgY2FsbGVyIE1VU1QgZnJlZSB0aGUgcmVzb3VyY2VzIHBhdGggKGZyZWUpIGFuZCBoYW5kbGUgKGRsY2xvc2UpIGlmIGZpbGxlZC4KKyAqLworYm9vbCBsb2FkTGlicmFyeShjb25zdCBjaGFyKiByZWxhdGl2ZVBhdGgsIGxpYl9lbnRyeV90KiBsaWJFbnRyeSkgbm9leGNlcHQgeworCisgICAgc3RkOjpzdHJpbmcgYWJzb2x1dGVQYXRoOworICAgIGlmICghcmVzb2x2ZUxpYnJhcnkocmVsYXRpdmVQYXRoLCAmYWJzb2x1dGVQYXRoKSkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgbGlicmFyeSBpbiBlZmZlY3QgZGlyZWN0b3JpZXM6ICVzIiwgcmVsYXRpdmVQYXRoKTsKKyAgICAgICAgbGliRW50cnktPnBhdGggPSBzdHJkdXAocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBjaGFyKiBwYXRoID0gYWJzb2x1dGVQYXRoLmNfc3RyKCk7CisgICAgbGliRW50cnktPnBhdGggPSBzdHJkdXAocGF0aCk7CisKKyAgICAvLyBNYWtlIHN1cmUgdGhlIGxpYiBpcyBjbG9zZWQgb24gZWFybHkgcmV0dXJuCisgICAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIGRlY2x0eXBlKGRsY2xvc2UpKj4gbGliSGFuZGxlKGRsb3BlbihwYXRoLCBSVExEX05PVyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGxjbG9zZSk7CisgICAgaWYgKGxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZGxvcGVuIGxpYnJhcnkgJXM6ICVzIiwgcGF0aCwgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1dG8qIGRlc2NyaXB0aW9uID0gc3RhdGljX2Nhc3Q8YXVkaW9fZWZmZWN0X2xpYnJhcnlfdCo+KAorICAgICAgICAgIGRsc3ltKGxpYkhhbmRsZS5nZXQoKSwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKSk7CisgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgZWZmZWN0IGxpYnJhcnksIGZhaWxlZCBub3QgZmluZCBzeW1ib2wgJyVzJyBpbiAlczogJXMiLAorICAgICAgICAgICAgICBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIsIHBhdGgsIGRsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZGVzY3JpcHRpb24tPnRhZyAhPSBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcpIHsKKyAgICAgICAgQUxPR0UoIkJhZCB0YWcgJSMwOHggaW4gZGVzY3JpcHRpb24gc3RydWN0dXJlLCBleHBlY3RlZCAlIzA4eCBmb3IgbGlicmFyeSAlcyIsCisgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLT50YWcsIEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywgcGF0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtYWpvclZlcnNpb24gPSBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZGVzY3JpcHRpb24tPnZlcnNpb24pOworICAgIHVpbnQzMl90IGV4cGVjdGVkTWFqb3JWZXJzaW9uID0gRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAobWFqb3JWZXJzaW9uICE9IGV4cGVjdGVkTWFqb3JWZXJzaW9uKSB7CisgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBtYWpvciB2ZXJzaW9uICUjMDh4LCBleHBlY3RlZCAlIzA4eCBmb3IgbGlicmFyeSAlcyIsCisgICAgICAgICAgICAgIG1ham9yVmVyc2lvbiwgZXhwZWN0ZWRNYWpvclZlcnNpb24sIHBhdGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbGliRW50cnktPmhhbmRsZSA9IGxpYkhhbmRsZS5yZWxlYXNlKCk7CisgICAgbGliRW50cnktPmRlc2MgPSBkZXNjcmlwdGlvbjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIEJlY2F1c2UgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBkZXN0cm95ZWQgYnkgYyBjb2RlLCB1c2luZyBuZXcgdG8gYWxsb2NhdGUgc2hhcmVkIHN0cnVjdHVyZQorICogaXMgbm90IHBvc3NpYmxlLiBQcm92aWRlIGEgZXF1aXZhbGVudCBvZiB1bmlxdWVfcHRyIGZvciBtYWxsb2MvZnJlZWQgc3RydWN0dXJlIHRvIG1ha2Ugc3VyZQorICogdGhleSBhcmUgbm90IGxlYWtlZCBpbiB0aGUgYysrIGNvZGUuCisgQHsgKi8KK3N0cnVjdCBGcmVlRGVsZXRlciB7CisgICAgdm9pZCBvcGVyYXRvcigpKHZvaWQqIHApIHsKKyAgICAgICAgZnJlZShwKTsKKyAgICB9Cit9OworLyoqIHVuaXF1ZV9wdHIgZm9yIG9iamVjdCBjcmVhdGVkIHdpdGggbWFsbG9jLiAqLwordGVtcGxhdGUgPGNsYXNzIFQ+Cit1c2luZyBVbmlxdWVDUHRyID0gc3RkOjp1bmlxdWVfcHRyPFQsIEZyZWVEZWxldGVyPjsKKworLyoqIGMgdmVyc2lvbiBvZiBzdGQ6Om1ha2VfdW5pcXVlLiBVc2VzIG1hbGxvYyBhbmQgZnJlZS4gKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorVW5pcXVlQ1B0cjxUPiBtYWtlVW5pcXVlQygpIHsKKyAgICBUKiBwdHIgPSBuZXcgKG1hbGxvYyhzaXplb2YoVCkpKSBUe307IC8vIFVzZSBwbGFjZW1lbnQgbmV3IHRvIGluaXRpYWxpemUgdGhlIHN0cnVjdHVyZQorICAgIHJldHVybiBVbmlxdWVDUHRyPFQ+e3B0cn07Cit9CisKKy8qKiBAfSAqLworCisvKiogUHVzaCBhbiBub3Qgb3duZWQgZWxlbWVudCBpbiBhIGxpc3RfZWxlbSBsaW5rIGxpc3Qgd2l0aCBhbiBvcHRpb25hbCBsb2NrLiAqLwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIExpc3RFbGVtPgordm9pZCBsaXN0UHVzaChUKiBvYmplY3QsIExpc3RFbGVtKiogbGlzdCwgcHRocmVhZF9tdXRleF90KiBtdXRleCA9IG51bGxwdHIpIG5vZXhjZXB0IHsKKyAgICBhdXRvIGxpc3RFbGVtID0gbWFrZVVuaXF1ZUM8TGlzdEVsZW0+KCk7CisgICAgbGlzdEVsZW0tPm9iamVjdCA9IG9iamVjdDsKKyAgICBpZiAobXV0ZXggIT0gbnVsbHB0cikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpOworICAgIH0KKyAgICBsaXN0RWxlbS0+bmV4dCA9ICpsaXN0OworICAgICpsaXN0ID0gbGlzdEVsZW0ucmVsZWFzZSgpOworICAgIGlmIChtdXRleCAhPSBudWxscHRyKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11dGV4KTsKKyAgICB9Cit9CisKKy8qKiBQdXNoIGFuIG93bmVkIGVsZW1lbnQgaW4gYSBsaXN0X2VsZW0gbGluayBsaXN0IHdpdGggYW4gb3B0aW9uYWwgbG9jay4gKi8KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBMaXN0RWxlbT4KK3ZvaWQgbGlzdFB1c2goVW5pcXVlQ1B0cjxUPiYmIG9iamVjdCwgTGlzdEVsZW0qKiBsaXN0LCBwdGhyZWFkX211dGV4X3QqIG11dGV4ID0gbnVsbHB0cikgbm9leGNlcHQgeworICAgIGxpc3RQdXNoKG9iamVjdC5yZWxlYXNlKCksIGxpc3QsIG11dGV4KTsKK30KKworc2l6ZV90IGxvYWRMaWJyYXJpZXMoY29uc3QgZWZmZWN0c0NvbmZpZzo6TGlicmFyaWVzJiBsaWJzLAorICAgICAgICAgICAgICAgICAgICAgbGlzdF9lbGVtX3QqKiBsaWJMaXN0LCBwdGhyZWFkX211dGV4X3QqIGxpYkxpc3RMb2NrLAorICAgICAgICAgICAgICAgICAgICAgbGlzdF9lbGVtX3QqKiBsaWJGYWlsZWRMaXN0KQoreworICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50ID0gMDsKKyAgICBmb3IgKGF1dG8mIGxpYnJhcnkgOiBsaWJzKSB7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgbGliIGVudHJ5CisgICAgICAgIGF1dG8gbGliRW50cnkgPSBtYWtlVW5pcXVlQzxsaWJfZW50cnlfdD4oKTsKKyAgICAgICAgbGliRW50cnktPm5hbWUgPSBzdHJkdXAobGlicmFyeS5uYW1lLmNfc3RyKCkpOworICAgICAgICBsaWJFbnRyeS0+ZWZmZWN0cyA9IG51bGxwdHI7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbGliRW50cnktPmxvY2ssIG51bGxwdHIpOworCisgICAgICAgIGlmICghbG9hZExpYnJhcnkobGlicmFyeS5wYXRoLmNfc3RyKCksIGxpYkVudHJ5LmdldCgpKSkgeworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgbGlicmFyeSBsb2FkIGZhaWx1cmUKKyAgICAgICAgICAgIGxpc3RQdXNoKHN0ZDo6bW92ZShsaWJFbnRyeSksIGxpYkZhaWxlZExpc3QpOworICAgICAgICAgICAgKytuYlNraXBwZWRFbGVtZW50OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGxpYkVudHJ5KSwgbGliTGlzdCwgbGliTGlzdExvY2spOworICAgIH0KKyAgICByZXR1cm4gbmJTa2lwcGVkRWxlbWVudDsKK30KKworLyoqIEZpbmQgYSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIGxpc3QuICovCitsaWJfZW50cnlfdCogZmluZExpYnJhcnkoY29uc3QgY2hhciogbmFtZSwgbGlzdF9lbGVtX3QqIGxpc3QpIHsKKworICAgIHdoaWxlIChsaXN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgYXV0byogb2JqZWN0ID0gc3RhdGljX2Nhc3Q8bGliX2VudHJ5X3QqPihsaXN0LT5vYmplY3QpOworICAgICAgICBpZiAoc3RyY21wKG9iamVjdC0+bmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICAgICAgfQorICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0cnVjdCBVdWlkU3RyIHsKKyAgICAvKiogTGVuZ3RoIG9mIGFuIHV1aWQgcmVwcmVzZW50ZWQgYXMgc3RyaW5nLiBAVE9ETzogdXNlIGEgY29uc3RhbnQgaW5zdGVhZCBvZiA0MC4gKi8KKyAgICBjaGFyIGJ1ZmZbNDBdOworfTsKKworLyoqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwcm92aWRlZCB1dWlkLgorICogQnkgbm90IHByb3ZpZGluZyBhbiBvdXRwdXQgYnVmZmVyLCBpdCBpcyBpbXBsaWNpdGx5IGNyZWF0ZWQgaW4gdGhlIGNhbGxlciBjb250ZXh0LgorICogSW4gc3VjaCBjYXNlIHRoZSByZXR1cm4gcG9pbnRlciBoYXMgdGhlIHNhbWUgbGlmZXRpbWUgYXMgdGhlIGV4cHJlc3Npb24gY29udGFpbmluZyB1dWlkVG9TdHJpbmcoKQorICovCitjaGFyKiB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCwgVXVpZFN0ciYmIHN0ciA9IHt9KSB7CisgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzdHIuYnVmZiwgc2l6ZW9mKHN0ci5idWZmKSk7CisgICAgcmV0dXJuIHN0ci5idWZmOworfQorCitzdHJ1Y3QgTG9hZEVmZmVjdFJlc3VsdCB7CisgICAgLyoqIHRydWUgaWYgdGhlIGVmZmVjdCBpcyB1c2FibGUgKGFrYSwgZXhpc3RpbmcgbGliLCBkZXNjLCByaWdodCB2ZXJzaW9uLCB1bmlxdWUgdXVpZCkgKi8KKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAvKiogU2V0IGlmIHRoZSBlZmZlY3QgbGliIHdhcyBmb3VuZCovCisgICAgbGliX2VudHJ5X3QqIGxpYiA9IG51bGxwdHI7CisgICAgLy8qIFNldCBpZiB0aGUgZGVzY3JpcHRpb24gd2FzIHN1Y2Nlc3NmdWx5IHJldHJpZXZlZCBmcm9tIHRoZSBsaWIgKi8KKyAgICBVbmlxdWVDUHRyPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdERlc2M7Cit9OworCitMb2FkRWZmZWN0UmVzdWx0IGxvYWRFZmZlY3QoY29uc3QgRWZmZWN0SW1wbCYgZWZmZWN0LCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2VsZW1fdCogbGliTGlzdCkgeworICAgIExvYWRFZmZlY3RSZXN1bHQgcmVzdWx0OworCisgICAgLy8gRmluZCB0aGUgZWZmZWN0IGxpYnJhcnkKKyAgICByZXN1bHQubGliID0gZmluZExpYnJhcnkoZWZmZWN0LmxpYnJhcnktPm5hbWUuY19zdHIoKSwgbGliTGlzdCk7CisgICAgaWYgKHJlc3VsdC5saWIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgbGlicmFyeSAlcyB0byBsb2FkIGVmZmVjdCAlcyIsCisgICAgICAgICAgICAgIGVmZmVjdC5saWJyYXJ5LT5uYW1lLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcmVzdWx0LmVmZmVjdERlc2MgPSBtYWtlVW5pcXVlQzxlZmZlY3RfZGVzY3JpcHRvcl90PigpOworCisgICAgLy8gR2V0IHRoZSBlZmZlY3QgZGVzY3JpcHRvcgorICAgIGlmIChyZXN1bHQubGliLT5kZXNjLT5nZXRfZGVzY3JpcHRvcigmZWZmZWN0LnV1aWQsIHJlc3VsdC5lZmZlY3REZXNjLmdldCgpKSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwKKyAgICAgICAgICAgICAgdXVpZFRvU3RyaW5nKGVmZmVjdC51dWlkKSwgcmVzdWx0LmxpYi0+bmFtZSk7CisgICAgICAgIHJlc3VsdC5lZmZlY3REZXNjLnJlc2V0KCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gRHVtcCBlZmZlY3QgZm9yIGRlYnVnCisjaWYgKExPR19OREVCVUc9PTApCisgICAgY2hhciBzWzUxMl07CisgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IocmVzdWx0LmVmZmVjdERlc2MuZ2V0KCksIHMsIHNpemVvZihzKSwgMCAvKiBpbmRlbnQgKi8pOworICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIiwgcmVzdWx0LmVmZmVjdERlc2MuZ2V0KCksIHMpOworI2VuZGlmCisKKyAgICAvLyBDaGVjayBlZmZlY3QgaXMgc3VwcG9ydGVkCisgICAgdWludDMyX3QgZXhwZWN0ZWRNYWpvclZlcnNpb24gPSBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pOworICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IocmVzdWx0LmVmZmVjdERlc2MtPmFwaVZlcnNpb24pICE9IGV4cGVjdGVkTWFqb3JWZXJzaW9uKSB7CisgICAgICAgIEFMT0dFKCJCYWQgQVBJIHZlcnNpb24gJSMwOHggZm9yIGVmZmVjdCAlcyBpbiBsaWIgJXMsIGV4cGVjdGVkIG1ham9yICUjMDh4IiwKKyAgICAgICAgICAgICAgcmVzdWx0LmVmZmVjdERlc2MtPmFwaVZlcnNpb24sIG5hbWUuY19zdHIoKSwgcmVzdWx0LmxpYi0+bmFtZSwgZXhwZWN0ZWRNYWpvclZlcnNpb24pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGxpYl9lbnRyeV90ICpfOworICAgIGlmIChmaW5kRWZmZWN0KG51bGxwdHIsICZlZmZlY3QudXVpZCwgJl8sIG51bGxwdHIpID09IDApIHsKKyAgICAgICAgQUxPR0UoIkVmZmVjdCAlcyB1dWlkICVzIGFscmVhZHkgZXhpc3QiLCB1dWlkVG9TdHJpbmcoZWZmZWN0LnV1aWQpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHJlc3VsdC5zdWNjZXNzID0gdHJ1ZTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzaXplX3QgbG9hZEVmZmVjdHMoY29uc3QgRWZmZWN0cyYgZWZmZWN0cywgbGlzdF9lbGVtX3QqIGxpYkxpc3QsIGxpc3RfZWxlbV90Kiogc2tpcHBlZEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgbGlzdF9zdWJfZWxlbV90Kiogc3ViRWZmZWN0TGlzdCkgeworICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50ID0gMDsKKworICAgIGZvciAoYXV0byYgZWZmZWN0IDogZWZmZWN0cykgeworCisgICAgICAgIGF1dG8gZWZmZWN0TG9hZFJlc3VsdCA9IGxvYWRFZmZlY3QoZWZmZWN0LCBlZmZlY3QubmFtZSwgbGliTGlzdCk7CisgICAgICAgIGlmICghZWZmZWN0TG9hZFJlc3VsdC5zdWNjZXNzKSB7CisgICAgICAgICAgICBpZiAoZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUoZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjKSwgc2tpcHBlZEVmZmVjdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytuYlNraXBwZWRFbGVtZW50OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZWZmZWN0LmlzUHJveHkpIHsKKyAgICAgICAgICAgIGF1dG8gc3dFZmZlY3RMb2FkUmVzdWx0ID0gbG9hZEVmZmVjdChlZmZlY3QubGliU3csIGVmZmVjdC5uYW1lICsgIiBsaWJzdyIsIGxpYkxpc3QpOworICAgICAgICAgICAgYXV0byBod0VmZmVjdExvYWRSZXN1bHQgPSBsb2FkRWZmZWN0KGVmZmVjdC5saWJIdywgZWZmZWN0Lm5hbWUgKyAiIGxpYmh3IiwgbGliTGlzdCk7CisgICAgICAgICAgICBpZiAoIXN3RWZmZWN0TG9hZFJlc3VsdC5zdWNjZXNzIHx8ICFod0VmZmVjdExvYWRSZXN1bHQuc3VjY2VzcykgeworICAgICAgICAgICAgICAgIC8vIFB1c2ggdGhlIG1haW4gZWZmZWN0IGluIHRoZSBza2lwcGVkIGxpc3QgZXZlbiBpZiBvbmx5IGEgc3ViZWZmZWN0IGlzIGludmFsaWQKKyAgICAgICAgICAgICAgICAvLyBhcyB0aGUgbWFpbiBlZmZlY3QgaXMgbm90IHVzYWJsZSB3aXRob3V0IGl0cyBzdWJlZmZlY3RzLgorICAgICAgICAgICAgICAgIGxpc3RQdXNoKHN0ZDo6bW92ZShlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MpLCBza2lwcGVkRWZmZWN0cyk7CisgICAgICAgICAgICAgICAgKytuYlNraXBwZWRFbGVtZW50OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdFB1c2goZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjLmdldCgpLCBzdWJFZmZlY3RMaXN0KTsKKworICAgICAgICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgZHVtbXkgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZworICAgICAgICAgICAgLy8gZ2V0X2Rlc2NyaXB0b3IgY2FsbCwgd2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAvLyBzdyBlZmZlY3QgZGVzY3JpcHRvciwgYnV0IGtlZXAgdGhlIFByb3h5IFVVSUQKKyAgICAgICAgICAgICplZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MgPSAqc3dFZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2M7CisgICAgICAgICAgICBlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MtPnV1aWQgPSBlZmZlY3QudXVpZDsKKworICAgICAgICAgICAgZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjLT5mbGFncyB8PSBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRDsKKworICAgICAgICAgICAgYXV0byByZWdpc3RlclN1YkVmZmVjdCA9IFtzdWJFZmZlY3RMaXN0XShhdXRvJiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgYXV0byBlbnRyeSA9IG1ha2VVbmlxdWVDPHN1Yl9lZmZlY3RfZW50cnlfdD4oKTsKKyAgICAgICAgICAgICAgICBlbnRyeS0+b2JqZWN0ID0gcmVzdWx0LmVmZmVjdERlc2MucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIC8vIGxpYl9lbnRyeV90IGlzIHN0b3JlZCBzaW5jZSB0aGUgc3ViIGVmZmVjdHMgYXJlIG5vdCBsaW5rZWQgdG8gdGhlIGxpYnJhcnkKKyAgICAgICAgICAgICAgICBlbnRyeS0+bGliID0gcmVzdWx0LmxpYjsKKyAgICAgICAgICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUoZW50cnkpLCAmKCpzdWJFZmZlY3RMaXN0KS0+c3ViX2VsZW0pOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJlZ2lzdGVyU3ViRWZmZWN0KHN0ZDo6bW92ZShzd0VmZmVjdExvYWRSZXN1bHQpKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyU3ViRWZmZWN0KHN0ZDo6bW92ZShod0VmZmVjdExvYWRSZXN1bHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxpc3RQdXNoKHN0ZDo6bW92ZShlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MpLCAmZWZmZWN0TG9hZFJlc3VsdC5saWItPmVmZmVjdHMpOworICAgIH0KKyAgICByZXR1cm4gbmJTa2lwcGVkRWxlbWVudDsKK30KKworfSAvLyBuYW1lc3BhY2UKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBJbnRlcmZhY2UgZnVuY3Rpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZXh0ZXJuICJDIiBzc2l6ZV90IEVmZmVjdExvYWRYbWxFZmZlY3RDb25maWcoY29uc3QgY2hhciogcGF0aCkKK3sKKyAgICB1c2luZyBlZmZlY3RzQ29uZmlnOjpwYXJzZTsKKyAgICBhdXRvIHJlc3VsdCA9IHBhdGggPyBwYXJzZShwYXRoKSA6IHBhcnNlKCk7CisgICAgaWYgKHJlc3VsdC5wYXJzZWRDb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHBhcnNlIFhNTCBjb25maWd1cmF0aW9uIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXN1bHQubmJTa2lwcGVkRWxlbWVudCArPSBsb2FkTGlicmFyaWVzKHJlc3VsdC5wYXJzZWRDb25maWctPmxpYnJhcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnTGlicmFyeUxpc3QsICZnTGliTG9jaywgJmdMaWJyYXJ5RmFpbGVkTGlzdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRFZmZlY3RzKHJlc3VsdC5wYXJzZWRDb25maWctPmVmZmVjdHMsIGdMaWJyYXJ5TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ1NraXBwZWRFZmZlY3RzLCAmZ1N1YkVmZmVjdExpc3QpOworCisgICAgQUxPR0VfSUYocmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQgIT0gMCwgIiV6dSBlcnJvcnMgZHVyaW5nIGxvYWRpbmcgb2YgY29uZmlndXJhdGlvbjogJXMiLAorICAgICAgICAgICAgIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50LCBwYXRoID86IGVmZmVjdHNDb25maWc6OkRFRkFVTFRfUEFUSCk7CisKKyAgICByZXR1cm4gcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZmU5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUU1hNTENPTkZJR0xPQURFUl9ICisjZGVmaW5lIEFORFJPSURfRUZGRUNUU1hNTENPTkZJR0xPQURFUl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBQYXJzZXMgdGhlIHBsYXRmb3JtIGVmZmVjdCB4bWwgY29uZmlndXJhdGlvbiBhbmQgc3RvcmVzIGl0cyBjb250ZW50IGluIEVmZmVjdEZhY3RvcnlTdGF0ZS4KKyAqIEBwYXJhbVtpbl0gcGF0aCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIG9yIE5VTEzCoHRvIGxvYWQgdGhlIGRlZmF1bHQgb25lCisgKiBAcmV0dXJuIC0xwqBvbiB1bnJlY292ZXJhYmxlIGVycm9yIChlZzogbm8gY29uZmlndXJhdGlvbiBmaWxlKQorICogICAgICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgICAgdGhlIG51bWJlciBvZiBpbnZhbGlkIGVsZW1lbnRzIChsaWIgJiBlZmZlY3QpIHNraXBwZWQgaWYgdGhlIGNvbmZpZyBpcyBwYXJ0aWFsbHkgaW52YWxpZAorICogQG5vdGUgdGhpcyBmdW5jdGlvbiBpcyBleHBvcnRlZCBmb3IgdGVzdCBwdXJwb3NlIG9ubHkuIERvIG5vdCBjYWxsIGZyb20gb3V0c2lkZSB0aGlzIGxpYnJhcnkuCisgKi8KK0FORFJPSURfQVBJCitzc2l6ZV90IEVmZmVjdExvYWRYbWxFZmZlY3RDb25maWcoY29uc3QgY2hhciogcGF0aCk7CisKKyNpZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBBTkRST0lEX0VGRkVDVFNYTUxDT05GSUdMT0FERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmgKaW5kZXggNjRhMzIxMi4uYTVhMTJlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfRUZGRUNUU0ZBQ1RPUllBUElfSF8KICNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWUFQSV9IXwogCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTUyLDYgKzUzLDcgQEAKIC8vICAgICAgICAqcE51bUVmZmVjdHM6ICAgICB1cGRhdGVkIHdpdGggbnVtYmVyIG9mIGVmZmVjdHMgaW4gZmFjdG9yeQogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNzksNiArODEsNyBAQAogLy8gICAgICAgICpwRGVzY3JpcHRvcjogICAgIHVwZGF0ZWQgd2l0aCB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTExMCw2ICsxMTMsNyBAQAogLy8gICAgICAgICpwSGFuZGxlOiAgICAgICAgIHVwZGF0ZWQgd2l0aCB0aGUgZWZmZWN0IGhhbmRsZS4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RDcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCiAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSk7CiAKQEAgLTEzMCw2ICsxMzQsNyBAQAogLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZQogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSk7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xNTMsNiArMTU4LDcgQEAKIC8vICAgICAgICAqcERlc2NyaXB0b3I6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdEdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTE2OSw4ICsxNzUsMTAgQEAKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBpZiB1dWlkIGlzIGVxdWFsIHRvIEVGRkVDVF9VVUlEX05VTEwuCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0SXNOdWxsVXVpZChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCk7CiAKK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0RHVtcEVmZmVjdHMoaW50IGZkKTsKIAogI2lmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvdGVzdC9EdW1wQ29uZmlnLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS90ZXN0L0R1bXBDb25maWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMTU2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvdGVzdC9EdW1wQ29uZmlnLmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiRWZmZWN0c1htbENvbmZpZ0xvYWRlci5oIgorI2luY2x1ZGUgIkVmZmVjdHNDb25maWdMb2FkZXIuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGNvbnN0IGNoYXIqIHBhdGggPSBudWxscHRyOworICAgIGJvb2wgbGVnYWN5Rm9ybWF0OworCisgICAgaWYgKGFyZ2MgPT0gMiAmJiBzdHJjbXAoYXJndlsxXSwgIi0tbGVnYWN5IikgPT0gMCkgeworICAgICAgICBsZWdhY3lGb3JtYXQgPSB0cnVlOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkR1bXBpbmcgbGVnYWN5IGVmZmVjdCBjb25maWcgZmlsZVxuIik7CisgICAgfSBlbHNlIGlmICgoYXJnYyA9PSAyIHx8IGFyZ2MgPT0gMykgJiYgc3RyY21wKGFyZ3ZbMV0sICItLXhtbCIpID09IDApIHsKKyAgICAgICAgbGVnYWN5Rm9ybWF0ID0gZmFsc2U7CisgICAgICAgIGlmIChhcmdjID09IDMpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRHVtcGluZyBYTUwgZWZmZWN0IGNvbmZpZyBmaWxlOiAlc1xuIiwgcGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkR1bXBpbmcgZGVmYXVsdCBYTUwgZWZmZWN0IGNvbmZpZyBmaWxlLlxuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgYXJndW1lbnRzLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIlVzYWdlOiAlcyBbLS1sZWdhY3l8LS14bWwgW0ZJTEVdXVxuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICghbGVnYWN5Rm9ybWF0KSB7CisgICAgICAgIHNzaXplX3QgcmV0ID0gRWZmZWN0TG9hZFhtbEVmZmVjdENvbmZpZyhwYXRoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibG9hZFhtbEVmZmVjdENvbmZpZyBmYWlsZWQsIHNlZSBsb2djYXQgZm9yIGRldGFpbC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUGFydGlhbGx5IGZhaWxlZCB0byBsb2FkIGNvbmZpZy4gU2tpcHBlZCAlenUgZWxlbWVudHMsICIKKyAgICAgICAgICAgICAgICAgICAgInNlZSBsb2djYXQgZm9yIGRldGFpbC5cbiIsIChzaXplX3QpcmV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsZWdhY3lGb3JtYXQpIHsKKyAgICAgICAgYXV0byByZXQgPSBFZmZlY3RMb2FkRWZmZWN0Q29uZmlnKCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxvYWRFZmZlY3RDb25maWcgZmFpbGVkLCBzZWUgbG9nY2F0IGZvciBkZXRhaWwuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGVnYWN5IGxvYWRFZmZlY3RDb25maWcgaGFzIHByb2JhYmx5IHN1Y2NlZWQsIHNlZSBsb2djYXQgdG8gbWFrZSBzdXJlLlxuIik7CisgICAgfQorCisgICAgaWYgKEVmZmVjdER1bXBFZmZlY3RzKFNURE9VVF9GSUxFTk8pICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFZmZlY3QgZHVtcCBmYWlsZWQsIHNlZSBsb2djYXQgZm9yIGRldGFpbC5cbiIpOworICAgICAgICByZXR1cm4gNDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rCmluZGV4IDgzZTgyODguLjk0MWViM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rCkBAIC03MiwxOSArNzIsMjUgQEAKICAgICBDb21tb24vc3JjL0Zyb20yaVRvTW9ub18xNi5jIFwKICAgICBDb21tb24vc3JjL0NvcHlfMTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Nb25vVG8ySV8xNi5jIFwKKyAgICBDb21tb24vc3JjL01vbm9UbzJJXzMyLmMgXAogICAgIENvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMgXAorICAgIENvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMgXAogICAgIENvbW1vbi9zcmMvZEJfdG9fTGluMzIuYyBcCiAgICAgQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jIFwKKyAgICBDb21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMgXAogICAgIENvbW1vbi9zcmMvQWJzXzMyLmMgXAogICAgIENvbW1vbi9zcmMvSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNi5jIFwKICAgICBDb21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIFwKICAgICBDb21tb24vc3JjL211bHQzc18xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL011bHQzc18zMngxNi5jIFwKICAgICBDb21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMgXAogICAgIENvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMgXAogICAgIENvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jIFwKICAgICBDb21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIFwKICAgICBDb21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYyBcCiAgICAgQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jIFwKICAgICBDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMgXAogICAgIENvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jIFwKQEAgLTEyMCw3ICsxMjYsNyBAQAogICAgICQoTE9DQUxfUEFUSCkvU3RlcmVvV2lkZW5pbmcvc3JjIFwKICAgICAkKExPQ0FMX1BBVEgpL1N0ZXJlb1dpZGVuaW5nL2xpYgogCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCVUlMRF9GTE9BVCAtREhJR0hFUl9GUwogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpAQCAtMTc5LDYgKzE4NSw3IEBACiAgICAgJChMT0NBTF9QQVRIKS9Db21tb24vbGliIFwKICAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9zcmMKIAotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EQlVJTERfRkxPQVQgLURISUdIRVJfRlMKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKaW5kZXggMjI4OTc3ZC4uNGMyYjk1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKQEAgLTE5OCw2ICsxOTgsMTAgQEAKICNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzMyMDAwICAgICAgICAgICAgICAgNjQKICNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ0MTAwICAgICAgICAgICAgICAgMTI4CiAjZGVmaW5lIExWREJFX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgIDI1NgorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorI2RlZmluZSBMVkRCRV9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgMTAyNAorI2VuZGlmCiAKIHR5cGVkZWYgZW51bQogewpAQCAtMjEwLDYgKzIxNCwxMCBAQAogICAgIExWREJFX0ZTXzMyMDAwID0gNiwKICAgICBMVkRCRV9GU180NDEwMCA9IDcsCiAgICAgTFZEQkVfRlNfNDgwMDAgPSA4LAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIExWREJFX0ZTXzk2MDAwID0gOSwKKyAgICBMVkRCRV9GU18xOTIwMDAgPSAxMCwKKyNlbmRpZgogICAgIExWREJFX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9Gc19lbjsKIApAQCAtNDUwLDEyICs0NTgsMTcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIExWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaAppbmRleCBiMWViYWRmLi5mMzJlZDMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCkBAIC0xOSw2ICsxOSw3IEBACiAjZGVmaW5lIF9fTFZEQkVfQ09FRkZTX0hfXwogCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTUxNCw1ICs1MTUsNjMyIEBACiAjZGVmaW5lIE1JWF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk1MTUgKi8KICNkZWZpbmUgTUlYX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIxNTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTE1MCAqLwogCisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFZEQkVfU0NBTEVTSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBIaWdoIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNTVIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1ODg0OWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTE3Njk4ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjk1ODg0OWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTM5MDAxZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDgwN2YKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjY5MDlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzMzgxOGYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjY5MDlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1NTczMmYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTY2OTBmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY4NjUwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MzczMDBmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY4NjUwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTkzMjdmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTYwMTM4ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzU4OGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ3MTc2ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzU4OGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY5NDk0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTk1MmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc2NzFmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1NTM0M2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc2NzFmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3Nzg2M2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzgxMDVmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTUxZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTcxMDJmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTUxZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Nzk2NjJmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc5ODY2ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTA0MmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTYyMDg0ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTA0MmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg0NzQ2ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDg2MWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODMwOTdmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NjE5NGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODMwOTdmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4ODkzMWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODg5OTJmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzNTM5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjcwNzlmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzNTM5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODk4MzFmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg5ODgyZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MDQwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NzIwODBmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MDQwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45OTQ5MTVmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0OTI4ZgorCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3Mjk0ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzQ1ODhmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3Mjk0ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTc0NThmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk3NDYxZgogI2VuZGlmCisKKworIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA2Nkh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTUzMDE2ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MDYwMzJmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTUzMDE2ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MjY4MTBmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTI5Mzk2ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2MjYzOGYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTI1Mjc1ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2MjYzOGYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ2ODgxZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk0ODI1NmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjQ3MThmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyOTQzNWYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjQ3MThmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MTE5NmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTIzNTlmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTcwNjIyZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NDEyNDRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTcwNjIyZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NjMzOTRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY0MDUyZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NTUwOWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTUxMDE5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NTUwOWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTczNDM2ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3Mzc4NGYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzY1NjNmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MzEyNWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzY1NjNmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3NTU5NGYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzU4ODlmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc5NTQ3ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTkwOTNmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc5NTQ3ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODE2OTVmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxODYxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MjAxMGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY0MDE5ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MjAxMGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg2NzE4ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjgwNWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODI1NDBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NTA3OWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODI1NDBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4Nzc5N2YKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODc4NzFmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODU1MzlmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MTA3N2YKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU1MzlmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mzg5OGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTM5MTdmCisKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcwNDNmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3NDA4NmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcwNDNmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5Njk0OWYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY5NTRmCisjZW5kaWYKKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDc4SHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NDY2OTNmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjg5MzM4N2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgMC45NDY2OTNmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkxMzUxN2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMC45MTcxMDVmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3OTk5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MTU5OThmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3OTk5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45MzcyMjlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTM5MTQwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2MDQ0NmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTIwODkyZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2MDQ0NmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQyMzI2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk0Mzk0NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjczOTdmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzNDc5NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjczOTdmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1Njc0MGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTc2NTZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTczMTU2ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NDYzMTNmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTczMTU2ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Njg2MDdmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5MDkyZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NDM5OGYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ4Nzk3ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NDM5OGYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTcxMTU3ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MTU2OGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc5MThmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1NTgzNmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc5MThmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3ODM2N2YKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzg1OTlmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgwODI0ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjE2NDlmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgwODI0ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODQzMDNmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDI1ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTQ1MGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTYyOTAwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTQ1MGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg1NTc4ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTY4MWYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY5OTg0ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTkyNzg5ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgxNWYKKworI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4Njc2OWYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTczNTM5ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4Njc2OWYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk2Mzk0ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjQwMWYKKyNlbmRpZgorCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgOTBIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwNDEyZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjg4MDgyNWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDQxMmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45MDAyMzFmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45MDQ5NzdmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NTMzODNmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTA2NzY2ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTUzMzgzZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjkyNzU3OWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjkzMDExMWYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk1NjE5M2YKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45MTIzODdmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NTYxOTNmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTMzNDU5ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTM1NjAzZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTY0MTgzZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjkyODM2NWYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NDE4M2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NTAwODdmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NTEzMDNmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NzA4MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTQxNjE4ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTcwODA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2Mzc3OGYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NDQyM2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3MjIzOWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NDQ0NzdmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NzIyMzlmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTY2NzIxZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTY3MjY2ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTc2MjkyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MjU4NGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3NjI5MmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzUwNDBmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzUzNDdmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk2NDFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTU5MjgyZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTc5NjQxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MTg4OGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MjA1MGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4MDM2MmYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjA3MjRmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODAzNjJmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTgzMzU5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTgzNDk3ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDQ2ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45Njg4OTJmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDQ2ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45OTE2ODBmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkxNzE0ZgorCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzI5OTJmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTU4NDBmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1ODQ4ZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQmFuZCBQYXNzIEZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNTVIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA5MTk3ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwOTE5N2YKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Nzk1NDVmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODEzOTNmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDY2OTFmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA2NjkxZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NTQ4OGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ2NGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNjE1MGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDYxNTBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTg2NzMzZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3NTU3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NjIwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDYyMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTAxODlmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTA2NTNmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDMzNTdmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMzU3ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mjk2NGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MzIwOWYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMzA4NWYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDMwODVmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkzNTUyZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkzNzU5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMzE1ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMjMxNWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTUxOTlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTUzMTZmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE2ODFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxNjgxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NjUzN2YKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjU5OWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU0NWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDE1NDVmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk2ODIzZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODc1ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA3NjJmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwNzYyZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5ODQ2MWYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5ODQ3N2YKKworI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzgxZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDM4MWYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTkyMzRmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTkyMzhmCisjZW5kaWYKKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDEyNjQ4ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTI2NDhmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzE3NjBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk3NDQxMmYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA5MjA5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDkyMDlmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45Nzk5NjZmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4MTM2OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA4NDY4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDg0NjhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODE2ODVmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4Mjg2OWYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA2MzY0ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDYzNjRmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODY0NTdmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4NzEyNGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA0NjI2ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDQ2MjZmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTAyODhmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MDY0MWYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA0MjUyZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDQyNTJmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTExMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MTM5OGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAzMTkyZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDMxOTJmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTMzNzRmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzU0MWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAyMzE4ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDIzMThmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTUyMjFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NTMwOWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAyMTMxZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDIxMzFmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTU2MTVmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NTY5MGYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDEwNTVmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTA1NWYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5Nzg2OGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3ODkxZgorCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDUyOGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAtMC4wMDA1MjhmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgIC0xLjk5ODkzOWYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4OTQ1ZgorI2VuZGlmCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxODU3MmYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDE4NTcyZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTU4NzQ1ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjI0MjdmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxMzU0NWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDEzNTQ1ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTcwNjQ3ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45NzI1OTZmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxMjQ1OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDEyNDU4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTczMTQ4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45NzQ3OTVmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwOTM3M2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA5MzczZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTgwMTA4ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODEwMzdmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNjgxOWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA2ODE5ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTg1NzE0ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODYyMDRmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNjI2OGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA2MjY4ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTg2OTA0ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODczMThmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDcwOWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA0NzA5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkwMjQwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTA0NzNmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMzQyMWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAzNDIxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkyOTU1ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTMwNzhmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMzE0NGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMTQ0ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkzNTM1ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM2MzlmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxNTU1ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAwMTU1NTVmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgIC0xLjk5Njg2MGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODkxZgorCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDc3OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAtMC4wMDA3NzhmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgIC0xLjk5ODQzN2YKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4NDQ0ZgorI2VuZGlmCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA5MEh6ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI3NjBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgLTAuMDIyNzYwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0OTA3M2YKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1Mzk1M2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxNjYxOWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTY2MTlmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTYzNzkxZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTY2Mzc3ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDE1Mjg5ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxNTI4OWYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjY4ODJmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjkwNjdmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTE1MTFmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDExNTExZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk3NTQ3N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk3NjcxMWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwODM3OWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDgzNzlmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTgyMzk1ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDQ3ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA3NzA0ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNzcwNGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODM4NjNmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0MTRmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDU3ODlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA1Nzg5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4Nzk3N2YKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4ODI4OGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNDIwN2YKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDQyMDdmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkxMzI0ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkxNDg4ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzODY3ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzg2N2YKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTIwMzhmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTIxNzdmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTkxM2YKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTkxM2YKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5NjEzNGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjE3NGYKKworI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwOTU4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDAwOTU4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgLTEuOTk4MDc1ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk4MDg1ZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXV0b21hdGljIEdhaW4gQ29udHJvbCB0aW1lIGNvbnN0YW50cyBhbmQgZ2FpbiBzZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBR0MgVGltZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgQUdDX0FUVEFDS19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODQxMzk1ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44ODIyMjNmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg5MTI1MWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTE3Mjc2ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45MzkyNjdmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk0NDA2MWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3NzQ1ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NjkxNThmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk3MTYyOGYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBBR0NfQVRUQUNLX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NzEyZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyODMwZgorI2VuZGlmCisKKyNkZWZpbmUgREVDQVlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCisKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDQyZgorI2RlZmluZSBBR0NfREVDQVlfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzBmCisjZGVmaW5lIEFHQ19ERUNBWV9GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAyOGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDIxZgorI2RlZmluZSBBR0NfREVDQVlfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTVmCisjZGVmaW5lIEFHQ19ERUNBWV9GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxNGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDEwZgorI2RlZmluZSBBR0NfREVDQVlfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDhmCisjZGVmaW5lIEFHQ19ERUNBWV9GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwN2YKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBBR0NfREVDQVlfRlM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMzVmCisjZGVmaW5lIEFHQ19ERUNBWV9GUzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDE3NWYKKyNlbmRpZgorCisvKiBBR0MgR2FpbiBzZXR0aW5ncyAqLworI2RlZmluZSBBR0NfR0FJTl9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBBR0NfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBBR0NfVEFSR0VUTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODg1NTNmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQxMjUzOGYKKyNkZWZpbmUgQUdDX0dBSU5fMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODQ4OTNmCisjZGVmaW5lIEFHQ19HQUlOXzFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyMjAxOGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzc4Mjc5ZgorI2RlZmluZSBBR0NfR0FJTl8yZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTg5MjVmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5NTI2MmYKKyNkZWZpbmUgQUdDX0dBSU5fM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDEyNTM4ZgorI2RlZmluZSBBR0NfSFBGR0FJTl80ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMzg3MjFmCisjZGVmaW5lIEFHQ19HQUlOXzRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU4NDg5M2YKKyNkZWZpbmUgQUdDX0hQRkdBSU5fNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTExODg2ZgorI2RlZmluZSBBR0NfR0FJTl81ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43NzgyNzlmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzZkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjgxODM4M2YKKyNkZWZpbmUgQUdDX0dBSU5fNmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MjYyZgorI2RlZmluZSBBR0NfSFBGR0FJTl83ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjIyNzhmCisjZGVmaW5lIEFHQ19HQUlOXzdkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIzODcyMWYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fOGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTQ4MTM0ZgorI2RlZmluZSBBR0NfR0FJTl84ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE4ODZmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzlkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk4MTA3MmYKKyNkZWZpbmUgQUdDX0dBSU5fOWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODE4MzgzZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NjY4MzZmCisjZGVmaW5lIEFHQ19HQUlOXzEwZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2MjI3OGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDExODcyZgorI2RlZmluZSBBR0NfR0FJTl8xMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NDgxMzRmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzEyZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjYyMzQxM2YKKyNkZWZpbmUgQUdDX0dBSU5fMTJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTgxMDcyZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4zMDk1NzNmCisjZGVmaW5lIEFHQ19HQUlOXzEzZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjQ2NjgzNmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDYuMDc5NDU4ZgorI2RlZmluZSBBR0NfR0FJTl8xNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMTE4NzJmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA2Ljk0MzI4MmYKKyNkZWZpbmUgQUdDX0dBSU5fMTVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNjIzNDEzZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFZvbHVtZSBjb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVm9sdW1lIGNvbnRyb2wgZ2FpbiAqLworI2RlZmluZSBWT0xVTUVfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEluIGRCcyAqLworI2RlZmluZSBWT0xVTUVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEluIGRCcyAqLworCisvKiBWb2x1bWUgY29udHJvbCB0aW1lIGNvbnN0YW50cyAqLworI2RlZmluZSBWT0xfVENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBWT0xfVENfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyNDY5MGYKKyNkZWZpbmUgVk9MX1RDX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTc5NzdmCisjZGVmaW5lIFZPTF9UQ19GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDE2NTI5ZgorI2RlZmluZSBWT0xfVENfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxMjQyMmYKKyNkZWZpbmUgVk9MX1RDX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDkwMjlmCisjZGVmaW5lIFZPTF9UQ19GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA4Mjk5ZgorI2RlZmluZSBWT0xfVENfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNjIzMWYKKyNkZWZpbmUgVk9MX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQ1MjVmCisjZGVmaW5lIFZPTF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MTU4ZgorI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBWT0xfVENfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMjA3OWYKKyNkZWZpbmUgVk9MX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDEwMzlmCisjZW5kaWYKKyNkZWZpbmUgTUlYX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjkzNjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg5NjE1MSAqLworI2RlZmluZSBNSVhfVENfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDIzMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTIyNTQ4ICovCisjZGVmaW5lIE1JWF9UQ19GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNDIyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Mjg0MTUgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA5NzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0NTM4NyAqLworI2RlZmluZSBNSVhfVENfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTQ1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU5ODA0ICovCisjZGVmaW5lIE1JWF9UQ19GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNTU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjI5NTYgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE4NTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MTk3MyAqLworI2RlZmluZSBNSVhfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjA5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTE1ICovCisjZGVmaW5lIE1JWF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMTUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODExNTAgKi8KKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTUlYX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0NTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDUzMCAqLworI2RlZmluZSBNSVhfVENfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjYxMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkyNTI0ICovCisjZW5kaWYKKworI2VuZGlmIC8qQlVJTERfRkxPQVQqLworI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKaW5kZXggYjY2MzJhMy4uZmQ0MDE2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCkBAIC0xMDcsMzUgKzEwNyw2OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQogewogCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgdGhlIHRhYmxlIG9mZnNldHMKICAgICAgKi8KLSAgICBMVk1fVUlOVDE2IE9mZnNldCA9IChMVk1fVUlOVDE2KSgoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlICsgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzQ4MDAwKSkpOwotCisgICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU18xOTIwMDApKSk7CisjZWxzZQorICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCisgICAgICovCisgICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU180ODAwMCkpKTsgICAgCisjZW5kaWYKIAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KLSAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKKyAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KKyAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwogICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpOyAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotICAgIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLworI2Vsc2UKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisjZW5kaWYKKyNpZm5kZWYgQlVJTERfRkxPQVQKKyAgICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUV9DMzJfQ29lZnNfdCAqKSZMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XSk7CisjZWxzZQorICAgIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJRX0ZMT0FUX0NvZWZzX3QgKikmTFZEQkVfSFBGX1RhYmxlW09mZnNldF0pOworI2VuZGlmCiAKIAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KLSAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOlwKKyAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMpL3NpemVvZihMVk1fSU5UMTYpKTsgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyNlbHNlCisgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOyAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworI2VuZGlmCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUF9DMzJfQ29lZnNfdCAqKSZMVkRCRV9CUEZfVGFibGVbT2Zmc2V0XSk7Ci0KKyNlbHNlCisgICAgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlBfRkxPQVRfQ29lZnNfdCAqKSZMVkRCRV9CUEZfVGFibGVbT2Zmc2V0XSk7CisjZW5kaWYKIH0KIAogCkBAIC0xNzUsNyArMjA4LDkgQEAKICAgICB7CiAgICAgICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19NYXhHYWluICAgPSBMVkRCRV9BR0NfR0FJTl9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5FZmZlY3RMZXZlbF07ICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIG9mZiAqLwogICAgIH0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfR2FpblNoaWZ0ID0gQUdDX0dBSU5fU0hJRlQ7CisjZW5kaWYKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfVGFyZ2V0ID0gQUdDX1RBUkdFVExFVkVMOwogCiB9CkBAIC0yMTIsNiArMjQ3LDkgQEAKICAgICBMVk1fVUlOVDE2ICAgICAgZEJPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUYWJsZSBvZmZzZXQgKi8KICAgICBMVk1fSU5UMTYgICAgICAgVm9sdW1lID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXF1aXJlZCB2b2x1bWUgaW4gZEJzICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgZEJTaGlmdHNfZmFjOworI2VuZGlmCiAgICAgLyoKICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGlmIGVuYWJsZWQKICAgICAgKi8KQEAgLTIzNywzMyArMjc1LDU4IEBACiAgICAgZEJPZmZzZXQgPSAoTFZNX1VJTlQxNikoNiArIFZvbHVtZSAlIDYpOyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBkQnMgMC01ICovCiAgICAgZEJTaGlmdHMgPSAoTFZNX1VJTlQxNikoVm9sdW1lIC8gLTYpOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSA2ZEIgc2hpZnRzICovCiAKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgZEJTaGlmdHNfZmFjID0gKExWTV9GTE9BVCkoMSA8PCBkQlNoaWZ0cyk7CisjZW5kaWYKICAgICAvKgogICAgICAqIFdoZW4gREJFIGlzIGVuYWJsZWQgdXNlIEFHQyB2b2x1bWUKICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSAoKExWTV9JTlQzMilMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0gPDwgMTYpOwogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA+PiBkQlNoaWZ0czsKLQorI2Vsc2UKKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSAoTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgLyBkQlNoaWZ0c19mYWM7CisjZW5kaWYKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5Wb2x1bWVUQyAgICA9IExWREJFX1ZvbHVtZVRDVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lU2hpZnQgPSBWT0xVTUVfU0hJRlQrMTsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBXaGVuIERCRSBpcyBkaXNhYmxlZCB1c2UgdGhlIGJ5cGFzcyB2b2x1bWUgY29udHJvbAogICAgICAqLwogICAgIGlmKGRCU2hpZnRzID4gMCkKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwoKChMVk1fSU5UMzIpTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdKSA+PiBkQlNoaWZ0cykpOworI2Vsc2UKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSAvIGRCU2hpZnRzX2ZhYyk7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLChMVk1fSU5UMzIpTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyNlbHNlCisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOworI2VuZGlmCiAgICAgfQogCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01JWEVSX1RDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworI2Vsc2UKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworI2VuZGlmCiB9CiAKIApAQCAtMzA5LDcgKzM3MiwxMSBAQAogewogCiAgICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyOworI2Vsc2UKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2UgPSAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXI7CisjZW5kaWYKIAogCiAgICAgLyoKQEAgLTMzMiwxMiArMzk5LDE5IEBACiAgICAgewogICAgICAgICBMVkRCRV9TZXRBR0MocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKICAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CiAKICAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKICAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisKKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCiAKIAogICAgIH0KQEAgLTM1NywxMyArNDMxLDIzIEBACiAKICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZT09TFZEQkVfT04gJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT0ZGKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCk7CiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDB4MDAwMDdGRkYpOworI2Vsc2UKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDApOworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMS4wZik7CisjZW5kaWYKICAgICB9CiAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU9PUxWREJFX09GRiAmJiBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PTikKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDB4MDAwMDdGRkYpOwogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwwKTsKKyNlbHNlCisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAxLjBmKTsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDApOworI2VuZGlmCiAgICAgfQogCiAgICAgLyoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCmluZGV4IGEzNjIzYmMuLjNmZmYyYTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwpAQCAtODAsNyArODAsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogRGF0YSBtZW1vcnkKICAgICAgICAgICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgID0gc2l6ZW9mKExWREJFX0RhdGFfRkxPQVRfdCk7CisjZWxzZQogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfRGF0YV90KTsKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0RBVEFfQUxJR047CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfREFUQTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CkBAIC04OCw3ICs5MiwxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBDb2VmIG1lbW9yeQogICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0NvZWZfdCk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgID0gc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCk7CisjZWxzZQorICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfQ29lZl90KTsgICAKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUZfQUxJR047CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CkBAIC05Niw3ICsxMDQsMTIgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKICAgICAgICAgICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikoTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSpzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworI2Vsc2UgLypCVUlMRF9GTE9BVCovCiAgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9JTlQxNikqcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gU2NyYXRjaFNpemU7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9TQ1JBVENIX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgID0gTFZEQkVfU0NSQVRDSDsKQEAgLTE1MSwxMCArMTY0LDE2IEBACiB7CiAKICAgICBMVkRCRV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAgICAgICAqcE1peGVyX0luc3RhbmNlOworICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICBNaXhHYWluOworI2Vsc2UKICAgICBMVk1peGVyM18xU3Rfc3QgICAgICAgKnBNaXhlcl9JbnN0YW5jZTsKICAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgaTsKICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgTWl4R2FpbjsKKyNlbmRpZgorICAgIExWTV9JTlQxNiAgICAgICAgICAgICBpOwogCiAKICAgICAvKgpAQCAtMjM1LDcgKzI1NCwxMSBAQAogICAgIC8vIGluaXRpYWxpemUgdGhlIG1peGVyIHdpdGggc29tZSBmaXhlcyB2YWx1ZXMgc2luY2Ugb3RoZXJ3aXNlIExWREJFX1NldFZvbHVtZSBlbmRzIHVwCiAgICAgLy8gcmVhZGluZyB1bmluaXRpYWxpemVkIGRhdGEKICAgICBwTWl4ZXJfSW5zdGFuY2UgPSAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLDB4MDAwMDdGRkYsMHgwMDAwN0ZGRik7CisjZWxzZQorICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCAxLjAsIDEuMCk7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgdm9sdW1lCkBAIC0yNDUsOSArMjY4LDEzIEBACiAKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5Wb2x1bWUgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIGFzIHRoZSB0YXJnZXQgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIE1peEdhaW4gPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKTsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSxNaXhHYWluLE1peEdhaW4pOworI2Vsc2UKKyAgICBNaXhHYWluID0gTFZDX01peGVyX0dldFRhcmdldCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSk7CisgICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIE1peEdhaW4sIE1peEdhaW4pOworI2VuZGlmCiAKICAgICAvKiBDb25maWd1cmUgdGhlIG1peGVyIHByb2Nlc3MgcGF0aCAqLwogICAgIHBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CkBAIC0yNjgsOSArMjk1LDExIEBACiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWTV9OVUxMOwogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQ9MDsKKwogICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLDAsMCk7CiAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwyKTsKKwogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSB1bnByb2Nlc3NlZCBwYXRoCiAgICAgICovCkBAIC0yNzgsOSArMzA3LDE1IEBACiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayA9IExWTV9OVUxMOwogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQ9MDsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwweDAwMDA3RkZGLDB4MDAwMDdGRkYpOwogICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCiAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCAxLjAsIDEuMCk7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CisjZW5kaWYKIAogICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCmluZGV4IDgzMzlkM2MuLjRlNTIwN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaApAQCAtNzcsNiArNzcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIERhdGEgc3RydWN0dXJlICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgIC8qIEFHQyBwYXJhbWV0ZXJzICovCkBAIC05OCw3ICs5OSwyOSBAQAogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgICBCUEZJbnN0YW5jZTsgICAgICAgIC8qIEJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KIAogfSBMVkRCRV9Db2VmX3Q7CisjZWxzZQorLyogRGF0YSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogQUdDIHBhcmFtZXRlcnMgKi8KKyAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICBBR0NJbnN0YW5jZTsgICAgICAgIC8qIEFHQyBpbnN0YW5jZSBwYXJhbWV0ZXJzICovCiAKKyAgICAvKiBQcm9jZXNzIHZhcmlhYmxlcyAqLworICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgICBIUEZUYXBzOyAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgdGFwcyAqLworICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgICBCUEZUYXBzOyAgICAgICAgICAgIC8qIEJhbmQgcGFzcyBmaWx0ZXIgdGFwcyAqLworICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAgICAgICAgICAgICBCeXBhc3NWb2x1bWU7ICAgICAgIC8qIEJ5cGFzcyB2b2x1bWUgc2NhbGVyICovCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAgICAgICAgIEJ5cGFzc01peGVyOyAgICAgICAgLyogQnlwYXNzIE1peGVyIGZvciBDbGljayBSZW1vdmFsICovCisKK30gTFZEQkVfRGF0YV9GTE9BVF90OworCisvKiBDb2VmcyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAgSFBGSW5zdGFuY2U7ICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIGluc3RhbmNlICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgIEJQRkluc3RhbmNlOyAgICAgICAgLyogQmFuZCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLworfSBMVkRCRV9Db2VmX0ZMT0FUX3Q7CisjZW5kaWYKIC8qIEluc3RhbmNlIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTEwOCw4ICsxMzEsMTMgQEAKICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAgIC8qIEluc3RhbmNlIGNhcGFiaWxpdGllcyAqLwogCiAgICAgLyogRGF0YSBhbmQgY29lZmZpY2llbnQgcG9pbnRlcnMgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVkRCRV9EYXRhX3QgICAgICAgICAgICAgICAgKnBEYXRhOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBkYXRhICovCiAgICAgTFZEQkVfQ29lZl90ICAgICAgICAgICAgICAgICpwQ29lZjsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgY29lZmZpY2llbnRzICovCisjZWxzZQorICAgIExWREJFX0RhdGFfRkxPQVRfdCAgICAgICAgICAgICAgICAqcERhdGE7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGRhdGEgKi8KKyAgICBMVkRCRV9Db2VmX0ZMT0FUX3QgICAgICAgICAgICAgICAgKnBDb2VmOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBjb2VmZmljaWVudHMgKi8KKyNlbmRpZgogfSBMVkRCRV9JbnN0YW5jZV90OwogCiAKQEAgLTEzNiw1ICsxNjQsMyBAQAogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAKICNlbmRpZiAgICAgIC8qIF9fTFZEQkVfUFJJVkFURV9IX18gKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYwppbmRleCA2OWQ3OWQyLi4xMGVhNzAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlICJBR0MuaCIKICNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzIsMTM2ICs3MSwyMzYgQEAKIC8qICAgICBvdmVyYWxsIGVuZCB0byBlbmQgZ2FpbiBpcyBvZEIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICBjb25zdCBMVk1fSU5UMTYgKnBJbkRhdGEsIExWTV9JTlQxNiAqcE91dERhdGEsIExWTV9VSU5UMTYgTnVtU2FtcGxlcykgewogCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKQorICBMVkRCRV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPSAoTFZEQkVfSW5zdGFuY2VfdCAqKSBoSW5zdGFuY2U7CisgIExWTV9JTlQzMiAqcFNjcmF0Y2ggPQorICAgICAgKExWTV9JTlQzMiAqKSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICBMVk1fSU5UMzIgKnBNb25vOworICBMVk1fSU5UMTYgKnBJbnB1dCA9IChMVk1fSU5UMTYgKikgcEluRGF0YTsKKworICAvKiBTY3JhdGNoIGZvciBWb2x1bWUgQ29udHJvbCBzdGFydHMgYXQgb2Zmc2V0IG9mIDIqTnVtU2FtcGxlcyBzaG9ydCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLworICBMVk1fSU5UMTYgKnBTY3JhdGNoVm9sID0gKExWTV9JTlQxNiAqKSAoJnBTY3JhdGNoW051bVNhbXBsZXNdKTsKKworICAvKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZiAyKk51bVNhbXBsZXMgMzItYml0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCisgIHBNb25vID0gJnBTY3JhdGNoWzIgKiBOdW1TYW1wbGVzXTsKKworICAvKgorICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgKi8KKyAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpIHsKKyAgICByZXR1cm4gKExWREJFX1RPT01BTllTQU1QTEVTKTsKKyAgfQorCisgIC8qCisgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAorICAgKi8KKyAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KKyAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKQorICAgICAgfHwgKExWQ19NaXhlcl9HZXRDdXJyZW50KAorICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkKKyAgICAgICAgICAhPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KAorICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pKSkgeworCisgICAgLyoKKyAgICAgKiBDb252ZXJ0IDE2LWJpdCBzYW1wbGVzIHRvIDMyLWJpdCBhbmQgc2NhbGUKKyAgICAgKiAoRm9yIGEgMTYtYml0IGltcGxlbWVudGF0aW9uIGFwcGx5IGhlYWRyb29tIGxvc3MgaGVyZSkKKyAgICAgKi8KKyAgICBJbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIocElucHV0LCAvKiBTb3VyY2UgMTYtYml0IGRhdGEgICAgKi8KKyAgICBwU2NyYXRjaCwgLyogRGVzdC4gMzItYml0IGRhdGEgICAgICovCisgICAgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCisgICAgTFZEQkVfU0NBTEVTSElGVCk7IC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLworCisgICAgLyoKKyAgICAgKiBBcHBseSB0aGUgaGlnaCBwYXNzIGZpbHRlciBpZiBzZWxlY3RlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKSB7CisgICAgICBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KKyAgICAgIChMVk1fSU5UMzIgKikgcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCisgICAgICAoTFZNX0lOVDMyICopIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLworICAgICAgKExWTV9JTlQxNikgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCisgICAgICovCisgICAgRnJvbTJpVG9Nb25vXzMyKHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICovCisgICAgKExWTV9JTlQxNikgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworCisgICAgLyoKKyAgICAgKiBBcHBseSB0aGUgYmFuZCBwYXNzIGZpbHRlcgorICAgICAqLworICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgICovCisgICAgKExWTV9JTlQzMiAqKSBwTW9ubywgLyogU291cmNlICAgICAgICAgICAgICAgICovCisgICAgKExWTV9JTlQzMiAqKSBwTW9ubywgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCisgICAgKExWTV9JTlQxNikgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworCisgICAgLyoKKyAgICAgKiBBcHBseSB0aGUgQUdDIGFuZCBtaXgKKyAgICAgKi8KKyAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KKyAgICBwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLworICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gZGVzdGluYXRpb24gICAgKi8KKyAgICBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisKKyAgICAvKgorICAgICAqIENvbnZlcnQgMzItYml0IHNhbXBsZXMgdG8gMTYtYml0IGFuZCBzYXR1cmF0ZQorICAgICAqIChOb3QgcmVxdWlyZWQgZm9yIDE2LWJpdCBpbXBsZW1lbmF0aW9ucykKKyAgICAgKi8KKyAgICBJbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2KHBTY3JhdGNoLCAvKiBTb3VyY2UgMzItYml0IGRhdGEgICAgKi8KKyAgICAoTFZNX0lOVDE2ICopIHBTY3JhdGNoLCAvKiBEZXN0LiAxNi1iaXQgZGF0YSAgICAgKi8KKyAgICAoTFZNX0lOVDE2KSAoMiAqIE51bVNhbXBsZXMpLCAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KKyAgICBMVkRCRV9TQ0FMRVNISUZUKTsgLyogU2hpZnQgc2NhbGUgICAgICAgICAgICovCisKKyAgfQorCisgIC8qIEJ5cGFzcyBWb2x1bWUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT0ZGIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KKyAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRikKKyAgICAgIHx8IChMVkNfTWl4ZXJfR2V0Q3VycmVudCgKKyAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pCisgICAgICAgICAgIT0gTFZDX01peGVyX0dldFRhcmdldCgKKyAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKSkpIHsKKworICAgIC8qCisgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKKyAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQorICAgICAqLworICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsIHBJbkRhdGEsCisgICAgICAgIHBTY3JhdGNoVm9sLCAoTFZNX0lOVDE2KSAoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICAgKi8KKworICB9CisKKyAgLyoKKyAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCisgICAqLworICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCisgICAgICAoTFZNX0lOVDE2ICopIHBTY3JhdGNoLCBwU2NyYXRjaFZvbCwgcE91dERhdGEsCisgICAgICAoTFZNX0lOVDE2KSAoMiAqIE51bVNhbXBsZXMpKTsKKworICByZXR1cm4gKExWREJFX1NVQ0NFU1MpOworfQorI2Vsc2UgLypCVUlMRF9GTE9BVCovCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgY29uc3QgTFZNX0ZMT0FUICpwSW5EYXRhLAorICAgIExWTV9GTE9BVCAqcE91dERhdGEsCisgICAgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKQogewogCi0gICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAqcFNjcmF0Y2ggID0gKExWTV9JTlQzMiAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAqcE1vbm87Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAqcElucHV0ICAgID0gKExWTV9JTlQxNiAqKXBJbkRhdGE7CisgIExWREJFX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7CisgIExWTV9GTE9BVCAqcFNjcmF0Y2hfaW4gPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb24KKyAgW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7CisgIExWTV9GTE9BVCAqcFNjcmF0Y2ggPSBwU2NyYXRjaF9pbiArIDIgKiBOdW1TYW1wbGVzOworICBMVk1fRkxPQVQgKnBNb25vOworICBMVk1fSU5UMzIgaWkgPSAwOwogCisgIC8qIFNjcmF0Y2ggZm9yIFZvbHVtZSBDb250cm9sIHN0YXJ0cyBhdCBvZmZzZXQgb2YgNCpOdW1TYW1wbGVzIGZsb2F0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCisgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoVm9sID0gKExWTV9GTE9BVCAqKSgmcFNjcmF0Y2hfaW5bNCAqIE51bVNhbXBsZXNdKTsKKy8vICBMVk1fSU5UMTYgKnBTY3JhdGNoVm9sX2ludCA9IChMVk1fSU5UMTYgKikocFNjcmF0Y2hWb2wpOwogCi0gICAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiAyKk51bVNhbXBsZXMgc2hvcnQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICpwU2NyYXRjaFZvbCA9IChMVk1fSU5UMTYgKikoJnBTY3JhdGNoW051bVNhbXBsZXNdKTsKKyAgLyogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YgNipOdW1TYW1wbGVzIDMyLWJpdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLworICBwTW9ubyA9ICZwU2NyYXRjaF9pbls0ICogTnVtU2FtcGxlc107CiAKLSAgICAvKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZiAyKk51bVNhbXBsZXMgMzItYml0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCi0gICAgcE1vbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAmcFNjcmF0Y2hbMipOdW1TYW1wbGVzXTsKKyAgLyoKKyAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICovCisgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICB7CisgICAgcmV0dXJuKExWREJFX1RPT01BTllTQU1QTEVTKTsKKyAgfQorCisgIC8qCisgICAqIENvbnZlcnQgMTYtYml0IHNhbXBsZXMgdG8gRmxvYXQKKyAgICovCisgIENvcHlfRmxvYXQocEluRGF0YSwgLyogU291cmNlIDE2LWJpdCBkYXRhICAgICovCisgICAgICBwU2NyYXRjaF9pbiwgLyogRGVzdC4gMzItYml0IGRhdGEgICAgICovCisgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KKworICBmb3IgKGlpID0gMDsgaWkgPCAyICogTnVtU2FtcGxlczsgaWkrKykgeworICAgIHBTY3JhdGNoW2lpXSA9IHBTY3JhdGNoX2luW2lpXTsKKyAgfQorICAvKgorICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAgICovCisgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PTil8fAorICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkKKyAgICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpCisgIHsKIAogICAgIC8qCi0gICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAgKiBBcHBseSB0aGUgaGlnaCBwYXNzIGZpbHRlciBpZiBzZWxlY3RlZAogICAgICAqLwotICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKQogICAgIHsKLSAgICAgICAgcmV0dXJuKExWREJFX1RPT01BTllTQU1QTEVTKTsKKyAgICAgIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLworICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCisgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgKi8KICAgICB9CiAKICAgICAvKgotICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAorICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KICAgICAgKi8KLSAgICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwotICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PTil8fAotICAgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKQotICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKQotICAgIHsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IDE2LWJpdCBzYW1wbGVzIHRvIDMyLWJpdCBhbmQgc2NhbGUKLSAgICAgICAgICogKEZvciBhIDE2LWJpdCBpbXBsZW1lbnRhdGlvbiBhcHBseSBoZWFkcm9vbSBsb3NzIGhlcmUpCi0gICAgICAgICAqLwotICAgICAgICBJbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIocElucHV0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgMTYtYml0IGRhdGEgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdC4gMzItYml0IGRhdGEgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpLCAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfU0NBTEVTSElGVCk7ICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdCBzY2FsZSAgICAgICAgICAgKi8KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCi0gICAgICAgICAqLwotICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKLSAgICAgICAgewotICAgICAgICAgICAgICBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwgICAgICAgICAgIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcFNjcmF0Y2gsICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgKi8KLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQotICAgICAgICAgKi8KLSAgICAgICAgRnJvbTJpVG9Nb25vXzMyKHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwTW9ubywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCi0gICAgICAgICAqLwotICAgICAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsICAgICAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBNb25vLCAgICAgICAgICAgICAgICAgLyogU291cmNlICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwTW9ubywgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSBBR0MgYW5kIG1peAotICAgICAgICAgKi8KLSAgICAgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgICAgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vbm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgMzItYml0IHNhbXBsZXMgdG8gMTYtYml0IGFuZCBzYXR1cmF0ZQotICAgICAgICAgKiAoTm90IHJlcXVpcmVkIGZvciAxNi1iaXQgaW1wbGVtZW5hdGlvbnMpCi0gICAgICAgICAqLwotICAgICAgICBJbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2KHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgMzItYml0IGRhdGEgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsICAgICAgICAgICAgLyogRGVzdC4gMTYtYml0IGRhdGEgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSwgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1NDQUxFU0hJRlQpOyAgICAgICAgICAgICAgICAvKiBTaGlmdCBzY2FsZSAgICAgICAgICAgKi8KLQotICAgIH0KLQotICAgIC8qIEJ5cGFzcyBWb2x1bWUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT0ZGIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT0ZGKXx8Ci0gICAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pCi0gICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKSkpCi0gICAgewotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgYnV0IHZvbHVtZSBtYW5hZ2VtZW50IGlzIHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yCi0gICAgICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCi0gICAgICAgICAqLwotICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgICAqLwotCi0gICAgfQorICAgIEZyb20yaVRvTW9ub19GbG9hdCgoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLworICAgICAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICovCisgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLwogCiAgICAgLyoKLSAgICAgKiBNaXggREJFIHByb2Nlc3NlZCBwYXRoIGFuZCBieXBhc3Mgdm9sdW1lIHBhdGgKKyAgICAgKiBBcHBseSB0aGUgYmFuZCBwYXNzIGZpbHRlcgogICAgICAqLwotICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFZvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7CisgICAgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAgKi8KKyAgICAgICAgKExWTV9GTE9BVCAqKXBNb25vLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgKExWTV9GTE9BVCAqKXBNb25vLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KKyAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCiAKLSAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CisgICAgLyoKKyAgICAgKiBBcHBseSB0aGUgQUdDIGFuZCBtaXgKKyAgICAgKi8KKyAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KKyAgICAgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLworICAgICAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gZGVzdGluYXRpb24gICAgKi8KKyAgICAgICAgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworCisgICAgZm9yIChpaSA9IDA7IGlpIDwgMiAqIE51bVNhbXBsZXM7IGlpKyspIHsKKyAgICAgIC8vVE9ETzogcmVwbGFjZSB3aXRoIGV4aXN0aW5nIGNsYW1waW5nIGZ1bmN0aW9uCisgICAgICBpZihwU2NyYXRjaFtpaV0gPCAtMS4wKSB7CisgICAgICAgIHBTY3JhdGNoW2lpXSA9IC0xLjA7CisgICAgICB9IGVsc2UgaWYocFNjcmF0Y2hbaWldID4gMS4wKSB7CisgICAgICAgIHBTY3JhdGNoW2lpXSA9IDEuMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpfHwKKyAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pCisgICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkpKQorICB7CisKKyAgICAvKgorICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgYnV0IHZvbHVtZSBtYW5hZ2VtZW50IGlzIHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yCisgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKKyAgICAgKi8KKyAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLAorICAgICAgICBwU2NyYXRjaF9pbiwKKyAgICAgICAgcFNjcmF0Y2hWb2wsCisgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICovCisgIH0KKworICAvKgorICAgKiBNaXggREJFIHByb2Nlc3NlZCBwYXRoIGFuZCBieXBhc3Mgdm9sdW1lIHBhdGgKKyAgICovCisgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKKyAgICAgIHBTY3JhdGNoLAorICAgICAgcFNjcmF0Y2hWb2wsCisgICAgICBwT3V0RGF0YSwKKyAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CisKKyAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOwogfQotCi0KLQotCi0KLQotCi0KLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwppbmRleCBmNWQyMjllLi5jNGE5YjE0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCkBAIC0zNiw3ICszNiwxMSBAQAogLyoKICAqIEhpZ2ggUGFzcyBGaWx0ZXIgQ29lZmZpY2llbnQgdGFibGUKICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgQlFfQzMyX0NvZWZzX3QgTFZEQkVfSFBGX1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IEJRX0ZMT0FUX0NvZWZzX3QgTFZEQkVfSFBGX1RhYmxlW10gPSB7CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA1NUh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7SFBGX0ZzODAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzODAwMF9GYzU1X0ExLApAQCAtODMsNiArODcsMTggQEAKICAgICAgSFBGX0ZzNDgwMDBfRmM1NV9BMCwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzOTYwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM5NjAwMF9GYzU1X0ExLAorICAgICBIUEZfRnM5NjAwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnMxOTIwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczE5MjAwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM1NV9CMX0sCisjZW5kaWYKIAogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNjZIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0hQRl9GczgwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0xMzAsNiArMTQ2LDE5IEBACiAgICAgIEhQRl9GczQ4MDAwX0ZjNjZfQTAsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczk2MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzOTYwMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzOTYwMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMTkyMDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE5MjAwMF9GYzY2X0ExLAorICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNjZfQjF9LAorI2VuZGlmCisKIAogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNzhIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0hQRl9GczgwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0xNzcsNiArMjA2LDE5IEBACiAgICAgIEhQRl9GczQ4MDAwX0ZjNzhfQTAsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczk2MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMTkyMDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE5MjAwMF9GYzc4X0ExLAorICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNzhfQjF9LAorI2VuZGlmCisKIAogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgOTBIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0hQRl9GczgwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0yMjMsMTIgKzI2NSwzMiBAQAogICAgICBIUEZfRnM0ODAwMF9GYzkwX0ExLAogICAgICBIUEZfRnM0ODAwMF9GYzkwX0EwLAogICAgICAtSFBGX0ZzNDgwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjOTBfQjF9fTsKKyAgICAgLUhQRl9GczQ4MDAwX0ZjOTBfQjF9CisKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsCisgICAge0hQRl9Gczk2MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMTkyMDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE5MjAwMF9GYzkwX0ExLAorICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjOTBfQjF9CisjZW5kaWYKKworfTsKIAogLyoKICAqIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnQgdGFibGUKICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgQlBfQzMyX0NvZWZzX3QgTFZEQkVfQlBGX1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IEJQX0ZMT0FUX0NvZWZzX3QgTFZEQkVfQlBGX1RhYmxlW10gPSB7CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA1NUh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7QlBGX0ZzODAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczgwMDBfRmM1NV9CMiwKQEAgLTI1Nyw2ICszMTksMTQgQEAKICAgICB7QlBGX0ZzNDgwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMiwKICAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgICB7QlBGX0ZzOTYwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMiwKKyAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjF9LAorICAgICB7QlBGX0ZzMTkyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMiwKKyAgICAgLUJQRl9GczE5MjAwMF9GYzU1X0IxfSwKKyNlbmRpZgogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7QlBGX0ZzODAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTI4Niw2ICszNTYsMTQgQEAKICAgICB7QlBGX0ZzNDgwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMiwKICAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtCUEZfRnM5NjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczE5MjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMX0sCisjZW5kaWYKIAogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNzhIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0JQRl9GczgwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0zMTUsNiArMzkzLDE0IEBACiAgICAge0JQRl9GczQ4MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7QlBGX0ZzOTYwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnMxOTIwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjF9LAorI2VuZGlmCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtCUEZfRnM4MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMzQzLDcgKzQyOSwxOSBAQAogICAgICAtQlBGX0ZzNDQxMDBfRmM5MF9CMX0sCiAgICAge0JQRl9GczQ4MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IxfX07CisgICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IxfQorI2lmZGVmIEhJR0hFUl9GUworICAgICwKKyAgICB7QlBGX0ZzOTYwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzOTYwMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnMxOTIwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjF9CisjZW5kaWYKKworCit9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNTMsNyArNDUxLDExIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBBdHRhY2sgdGltZSAoc2lnbmFsIHRvbyBsYXJnZSkgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9BR0NfQVRUQUNLX1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfQVRUQUNLX1RhYmxlW10gPSB7CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAgICAgQUdDX0FUVEFDS19GczgwMDAsCiAgICAgQUdDX0FUVEFDS19GczExMDI1LAogICAgIEFHQ19BVFRBQ0tfRnMxMjAwMCwKQEAgLTM2MiwxMCArNDY0LDIwIEBACiAgICAgQUdDX0FUVEFDS19GczI0MDAwLAogICAgIEFHQ19BVFRBQ0tfRnMzMjAwMCwKICAgICBBR0NfQVRUQUNLX0ZzNDQxMDAsCi0gICAgQUdDX0FUVEFDS19GczQ4MDAwfTsKKyAgICBBR0NfQVRUQUNLX0ZzNDgwMDAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsQUdDX0FUVEFDS19Gczk2MDAwCisgICAgLEFHQ19BVFRBQ0tfRnMxOTIwMDAKKyNlbmRpZgorCit9OwogCiAvKiBEZWNheSB0aW1lIChzaWduYWwgdG9vIHNtYWxsKSAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDE2IExWREJFX0FHQ19ERUNBWV9UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW10gPSB7CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAgICAgQUdDX0RFQ0FZX0ZzODAwMCwKICAgICBBR0NfREVDQVlfRnMxMTAyNSwKICAgICBBR0NfREVDQVlfRnMxMjAwMCwKQEAgLTM3NCwxMCArNDg2LDIwIEBACiAgICAgQUdDX0RFQ0FZX0ZzMjQwMDAsCiAgICAgQUdDX0RFQ0FZX0ZzMzIwMDAsCiAgICAgQUdDX0RFQ0FZX0ZzNDQxMDAsCi0gICAgQUdDX0RFQ0FZX0ZzNDgwMDB9OworICAgIEFHQ19ERUNBWV9GczQ4MDAwCisjaWZkZWYgSElHSEVSX0ZTCisgICAgLEFHQ19ERUNBWV9GUzk2MDAwCisgICAgLEFHQ19ERUNBWV9GUzE5MjAwMAorI2VuZGlmCisKK307CiAKIC8qIEdhaW4gZm9yIHVzZSB3aXRob3V0IHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMzIgTFZEQkVfQUdDX0dBSU5fVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19HQUlOX1RhYmxlW10gPSB7CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAgICAgQUdDX0dBSU5fMGRCLAogICAgIEFHQ19HQUlOXzFkQiwKICAgICBBR0NfR0FJTl8yZEIsCkBAIC0zOTYsNyArNTE4LDExIEBACiAgICAgQUdDX0dBSU5fMTVkQn07CiAKIC8qIEdhaW4gZm9yIHVzZSB3aXRoIHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMzIgTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW10gPSB7CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAgICAgQUdDX0hQRkdBSU5fMGRCLAogICAgIEFHQ19IUEZHQUlOXzFkQiwKICAgICBBR0NfSFBGR0FJTl8yZEIsCkBAIC00MjIsNiArNTQ4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfVm9sdW1lVGFibGVbXSA9IHsKICAgICAweDQwMDAsICAgICAgICAgICAgIC8qIC02ZEIgKi8KICAgICAweDQ3RkIsICAgICAgICAgICAgIC8qIC01ZEIgKi8KQEAgLTQzMCw4ICs1NTcsMjIgQEAKICAgICAweDY1QUQsICAgICAgICAgICAgIC8qIC0yZEIgKi8KICAgICAweDcyMTUsICAgICAgICAgICAgIC8qIC0xZEIgKi8KICAgICAweDdGRkZ9OyAgICAgICAgICAgIC8qICAwZEIgKi8KKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRhYmxlW10gPSB7CisgICAgMC41MDAwMDBmLCAgICAgICAgIC8qIC02ZEIgKi8KKyAgICAwLjU2MjM0MWYsICAgICAgICAgLyogLTVkQiAqLworICAgIDAuNjMwOTU3ZiwgICAgICAgICAvKiAtNGRCICovCisgICAgMC43MDc5NDZmLCAgICAgICAgIC8qIC0zZEIgKi8KKyAgICAwLjc5NDMyOGYsICAgICAgICAgLyogLTJkQiAqLworICAgIDAuODkxMjUxZiwgICAgICAgICAvKiAtMWRCICovCisgICAgMS4wMDAwMDBmfTsgICAgICAgIC8qICAwZEIgKi8KKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDE2IExWREJFX1ZvbHVtZVRDVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRDVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICBWT0xfVENfRnM4MDAwLAogICAgIFZPTF9UQ19GczExMDI1LAogICAgIFZPTF9UQ19GczEyMDAwLApAQCAtNDQwLDkgKzU4MSwxNyBAQAogICAgIFZPTF9UQ19GczI0MDAwLAogICAgIFZPTF9UQ19GczMyMDAwLAogICAgIFZPTF9UQ19GczQ0MTAwLAotICAgIFZPTF9UQ19GczQ4MDAwfTsKKyAgICBWT0xfVENfRnM0ODAwMAorI2lmZGVmIEhJR0hFUl9GUworICAgICxWT0xfVENfRnM5NjAwMAorICAgICxWT0xfVENfRnMxOTIwMDAKKyNlbmRpZgorfTsKKworCiAKIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9NaXhlclRDVGFibGVbXSA9IHsKKwogICAgIE1JWF9UQ19GczgwMDAsCiAgICAgTUlYX1RDX0ZzMTEwMjUsCiAgICAgTUlYX1RDX0ZzMTIwMDAsCkBAIC00NTEsNiArNjAwLDEwIEBACiAgICAgTUlYX1RDX0ZzMjQwMDAsCiAgICAgTUlYX1RDX0ZzMzIwMDAsCiAgICAgTUlYX1RDX0ZzNDQxMDAsCi0gICAgTUlYX1RDX0ZzNDgwMDB9OworICAgIE1JWF9UQ19GczQ4MDAwCisjaWZkZWYgSElHSEVSX0ZTCisgICAgLE1JWF9UQ19Gczk2MDAwCisgICAgLE1JWF9UQ19GczE5MjAwMAorI2VuZGlmCiAKLQorfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuaAppbmRleCA0NzZlNmEwLi5jYTQ2ZTM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgQ29lZmZpY2llbnRzIGNvbnN0YW50IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTc2LDggKzc3LDU3IEBACiAKIGV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfVm9sdW1lVENUYWJsZVtdOwogCisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCisgKi8KK2V4dGVybiBjb25zdCBCUV9GTE9BVF9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdOworCisvKgorICogQmFuZCBQYXNzIEZpbHRlciBjb2VmZmljaWVudCB0YWJsZQorICovCitleHRlcm4gY29uc3QgQlBfRkxPQVRfQ29lZnNfdCBMVkRCRV9CUEZfVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBR0MgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEF0dGFjayB0aW1lIChzaWduYWwgdG9vIGxhcmdlKSAqLworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfQVRUQUNLX1RhYmxlW107CisKKy8qIERlY2F5IHRpbWUgKHNpZ25hbCB0b28gc21hbGwpICovCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19ERUNBWV9UYWJsZVtdOworCisvKiBHYWluIGZvciB1c2Ugd2l0aG91dCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfR0FJTl9UYWJsZVtdOworCisvKiBHYWluIGZvciB1c2Ugd2l0aCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFZvbHVtZSBjb250cm9sIGdhaW4gYW5kIHRpbWUgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVENUYWJsZVtdOworCisjZW5kaWYgLypCVUlMRF9GTE9BVCovCisKIGV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfTWl4ZXJUQ1RhYmxlW107CiAKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKaW5kZXggMWZmMmEyYy4uOWI2ZGEzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKQEAgLTUxNCwxMSArNTE0LDE5IEBACiAvKiAgICAgIFNURVJFTyAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzYW1wbGUgcGFpcnMgaW4gdGhlIGJsb2NrICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisjZWxzZQogTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKKyNlbmRpZgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKaW5kZXggNmNiZWU3ZC4uMGEzYzMwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCkBAIC00OCw3ICs0OCwxNTIgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVk1fQnVmZmVyTWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqKnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICoqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgKnBOdW1TYW1wbGVzKQorewogCisgICAgTFZNX0lOVDE2ICAgICAgICBTYW1wbGVDb3VudDsgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCB0aGlzIGNhbGwgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgIE51bVNhbXBsZXM7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gc2NyYXRjaCBidWZmZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICpwU3RhcnQ7CisgICAgTFZNX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fQnVmZmVyX3QgICAgICpwQnVmZmVyOworICAgIExWTV9GTE9BVCAgICAgICAgKnBEZXN0OworICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCisgICAgICovCisgICAgcEJ1ZmZlciAgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIHBEZXN0ICAgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisgICAgKnBUb1Byb2Nlc3MgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKyAgICAqcFByb2Nlc3NlZCA9IHBCdWZmZXItPnBTY3JhdGNoOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlyc3QgY2FsbCBmb3IgYSBuZXcgYmxvY2sgb2Ygc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICsgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOworICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKKyAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICAgID0gTFZNX0ZJUlNUQ0FMTDsKKyAgICB9CisgICAgcFN0YXJ0ID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgc2FtcGxlcyAqLworICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgdG8gb3V0cHV0IGlzIHNhbWUgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgcmVhZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIHRoaXMgY2FsbCBhbmQgdXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFByb2Nlc3MgdGhlIG1heGltdW0gYm9jayBzaXplIG9mIHNhbXBsZXMuCisgICAgICAgICAqLworICAgICAgICBTYW1wbGVDb3VudCA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIE51bVNhbXBsZXMgID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTGFzdCBjYWxsIGZvciB0aGUgYmxvY2ssIHNvIGNhbGN1bGF0ZSBob3cgbWFueSBmcmFtZXMgYW5kIHNhbXBsZXMgdG8gcHJvY2VzcworICAgICAgICAgICovCisgICAgICAgIExWTV9JTlQxNiAgIE51bUZyYW1lczsKKworICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKKyAgICAgICAgTnVtRnJhbWVzICAgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA+PiBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikoTnVtRnJhbWVzIDw8IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGJ1ZmZlciBzdGF0ZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlID0gTFZNX0ZJUlNUTEFTVENBTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9MQVNUQ0FMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgIC8qIFNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgKi8KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHNhbXBsZXMgZnJvbSB0aGUgZGVsYXkgYnVmZmVyIGFzIHJlcXVpcmVkCisgICAgICovCisgICAgaWYgKCgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkgfHwKKyAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSkgJiYKKyAgICAgICAgKHBCdWZmZXItPkluRGVsYXlTYW1wbGVzICE9IDApKQorICAgIHsKKyAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+SW5EZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1DaGFubmVscyAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKSk7ICAgIC8qIE51bWJlciBvZiBkZWxheSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOyAvKiBVcGRhdGUgc2FtcGxlIGNvdW50ICovCisgICAgICAgIHBEZXN0ICs9IE51bUNoYW5uZWxzICogcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXM7ICAgICAgLyogVXBkYXRlIHRoZSBkZXN0aW5hdGlvbiBwb2ludGVyICovCisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIHJlc3Qgb2YgdGhlIHNhbXBsZXMgZm9yIHRoaXMgY2FsbCBmcm9tIHRoZSBpbnB1dCBidWZmZXIKKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IDApCisgICAgeworICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzKSk7ICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgcFN0YXJ0ICs9IE51bUNoYW5uZWxzICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGlucHV0IGRhdGEgcG9pbnRlciBhbmQgc2FtcGxlcyB0byBvdXRwdXQKKyAgICAgICAgICovCisgICAgICAgIC8qIFVwZGF0ZSBzYW1wbGVzIHRvIG91dHB1dCAqLworICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgKyBOdW1TYW1wbGVzKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICAqIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50IGFuZCBpbnB1dCBwb2ludGVyCisgICAgICovCisgICAgLyogVXBkYXRlIHRoZSBjb3VudCBvZiBzYW1wbGVzICovCisgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtIFNhbXBsZUNvdW50KTsKKyAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgID0gcFN0YXJ0OyAvKiBVcGRhdGUgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KKworCisgICAgLyoKKyAgICAgKiBTYXZlIHNhbXBsZXMgdG8gdGhlIGRlbGF5IGJ1ZmZlciBpZiBhbnkgbGVmdCB1bnByb2Nlc3NlZAorICAgICAqLworICAgIGlmICgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpIHx8CisgICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fTEFTVENBTEwpKQorICAgIHsKKyAgICAgICAgTnVtU2FtcGxlcyA9IHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKKyAgICAgICAgcFN0YXJ0ICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnQgb2YgdGhlIGJ1ZmZlciAqLworICAgICAgICBwU3RhcnQgICAgKz0gTnVtQ2hhbm5lbHMgKiBTYW1wbGVDb3VudDsgLyogT2Zmc2V0IGJ5IHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyAgICAgICAgaWYgKE51bVNhbXBsZXMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzKSk7ICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBkZWxheSBzYW1wbGUgY291bnQKKyAgICAgICAgICovCisgICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzICAgICA9IE51bVNhbXBsZXM7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGUgcGFpcnMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsIFNhbXBsZXMgdXNlZCAqLworICAgIH0KK30KKyNlbHNlCiB2b2lkIExWTV9CdWZmZXJNYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICoqcFRvUHJvY2VzcywKQEAgLTE4OSw3ICszMzQsNyBAQAogICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGwgU2FtcGxlcyB1c2VkICovCiAgICAgfQogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIxMyw3ICszNTgsNDcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICoqcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID09IDApCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsgICAgLyogR2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGZpcnN0IGNhbGwgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKnBUb1Byb2Nlc3M7ICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgSS9PIHBvaW50ZXJzICovCisgICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICAgPSAqcFByb2Nlc3NlZDsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0ZSBibG9jayBzaXplIHRvIHByb2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQorICAgICAgICB7CisgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHByb2Nlc3MgcG9pbnRlcnMKKyAgICAgKi8KKyAgICAqcFRvUHJvY2VzcyA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsKKyAgICAqcFByb2Nlc3NlZCA9IHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXM7Cit9CisjZWxzZQogdm9pZCBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICoqcFRvUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKipwUHJvY2Vzc2VkLApAQCAtMjUyLDcgKzQzNyw3IEBACiAgICAgKnBUb1Byb2Nlc3MgPSBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXM7CiAgICAgKnBQcm9jZXNzZWQgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOwogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI3OCw2ICs0NjMsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVk1fQnVmZmVyT3B0aW1pc2VkSW4oTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqKnBUb1Byb2Nlc3MsCkBAIC00MTYsNyArNjAyLDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVySW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00NzEsNyArNjU3LDM3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQorewogCisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgd2hpY2ggbW9kZSwgbWFuYWdlZCBvciB1bm1hbmFnZWQKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4oaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KK30KKyNlbHNlCiB2b2lkIExWTV9CdWZmZXJJbihMVk1fSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICoqcFRvUHJvY2VzcywKQEAgLTUwMSw3ICs3MTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOwogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZE91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MjIsNyArNzM4LDE1NiBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWTV9CdWZmZXJNYW5hZ2VkT3V0KExWTV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90ICAgICpwQnVmZmVyICAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKKyAgICBMVk1fSU5UMTYgICAgICAgU2FtcGxlQ291bnQgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsKKyAgICBMVk1fSU5UMTYgICAgICAgTnVtU2FtcGxlczsKKyAgICBMVk1fRkxPQVQgICAgICAgKnBTdGFydDsKKyAgICBMVk1fRkxPQVQgICAgICAgKnBEZXN0OworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcG9pbnRlcnMKKyAgICAgKi8KKyAgICBOdW1TYW1wbGVzID0gcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OworICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKworCisgICAgLyoKKyAgICAgKiBjaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCisgICAgICAqLworICAgIGlmICgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkgfHwKKyAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSkKKyAgICB7CisgICAgICAgIC8qIEZpcnN0IGNhbGwgZm9yIGEgbmV3IGJsb2NrICovCisgICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgPSBwT3V0RGF0YTsgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGRlc3RpbmF0aW9uICovCisgICAgfQorICAgIHBEZXN0ID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG91dHB1dCBhZGRyZXNzICovCisKKworICAgIC8qCisgICAgICogSWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vbi16ZXJvIHRoZW4gdGhlcmUgYXJlIHN0aWxsIHNhbXBsZXMgdG8gc2VuZCB0bworICAgICAqIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICovCisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCisgICAgICAgIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSBkZWxheWVkIG91dHB1dCBidWZmZXIgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAqLworICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIDw9IE51bVNhbXBsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IGFsbCBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyk7IC8qIFNhbXBsZXMgbGVmdCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlbmQgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBvbmx5IHNvbWUgb2YgdGhlIG91cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBOdW1TYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCisgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgLSBOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIgKiBOdW1TYW1wbGVzXSwgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlICovCisgICAgICAgICAgICBOdW1TYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgcHJvY2Vzc2VkIHJlc3VsdHMgdG8gdGhlIG91dHB1dAorICAgICAqLworICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJgorICAgICAgICAoU2FtcGxlQ291bnQgIT0gMCkpCisgICAgeworICAgICAgICBpZiAoU2FtcGxlQ291bnQgPD0gTnVtU2FtcGxlcykKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgYWxsIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCAgICAgICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gU2FtcGxlQ291bnQpOyAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlcnMgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBwU3RhcnQgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzZWQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBEZXN0ICAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgU2FtcGxlQ291bnQgID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBOdW1TYW1wbGVzKTsgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIHNhbXBsZSBjb3VudCAqLworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIHJlbWFpbmluZyBwcm9jZXNzZWQgZGF0YSB0byB0aGUgb3V0cHV0IGRlbGF5IGJ1ZmZlcgorICAgICAqLworICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQorICAgIHsKKyAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyAgICAgICAgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KKyAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICsgU2FtcGxlQ291bnQpOworICAgIH0KKworICAgIC8qCisgICAgICogcG9pbnRlcnMsIGNvdW50cyBhbmQgc2V0IGRlZmF1bHQgYnVmZmVyIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcERlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICA9IExWTV9NQVhCTE9DS0NBTEw7ICAgICAgICAgICAgICAgICAgIC8qIFNldCBmb3IgdGhlIGRlZmF1bHQgY2FsbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgc2l6ZSAqLworICAgIC8qIFRoaXMgd2lsbCB0ZXJtaW5hdGUgdGhlIGxvb3Agd2hlbiBhbGwgc2FtcGxlcyBwcm9jZXNzZWQgKi8KKyAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7Cit9CisjZWxzZQogdm9pZCBMVk1fQnVmZmVyTWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCkBAIC02NzIsNyArMTAzNyw3IEBACiAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICA9IExWTV9NQVhCTE9DS0NBTEw7ICAgICAgICAgICAgICAgICAgIC8qIFNldCBmb3IgdGhlIGRlZmF1bHQgY2FsbCBibG9jayBzaXplICovCiAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOyAgICAgICAgIC8qIFRoaXMgd2lsbCB0ZXJtaW5hdGUgdGhlIGxvb3Agd2hlbiBhbGwgc2FtcGxlcyBwcm9jZXNzZWQgKi8KIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03NDEsNiArMTEwNiw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIExWTV9CdWZmZXJPcHRpbWlzZWRPdXQoTFZNX0hhbmRsZV90ICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCiB7CkBAIC04MDUsNyArMTE3MSw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODQzLDcgKzEyMDksMzEgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVk1fQnVmZmVyT3V0KExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKQorewogCisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIENoZWNrIHdoaWNoIG1vZGUsIG1hbmFnZWQgb3IgdW5tYW5hZ2VkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCisgICAgeworICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZE91dChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJVbm1hbmFnZWRPdXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVk1fQnVmZmVyT3V0KExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKQpAQCAtODY3LDQgKzEyNTcsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKICAgICB9CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCmluZGV4IDI3MTJiMmMuLjM1MzU2MGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKQEAgLTI2LDEwICsyNiw2NTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNkZWZpbmUgVHJlYmxlQm9vc3RDb3JuZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAwMAotI2RlZmluZSBUcmVibGVCb29zdE1pblJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBUcmVibGVCb29zdFN0ZXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgVHJlYmxlQm9vc3RNaW5SYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUcmVibGVCb29zdFN0ZXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAyMjA1MEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wMzg0MzQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzE1OTkKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA4MTU1NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI4ODQ3NQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTI5OTQzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjQwMDkwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xODQyMzIKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODU4MDEKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI0NTE0NQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNDg4NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzEzNDkxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDU2NTQxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zOTAxNzcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDIwMTQ0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NzYyMTkKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTA2MTg3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41NzI3NjEKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjAyNzI4CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjgxMDgyCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjMxMTA0OQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjgwMjYyMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40MzI1ODgKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45Mzg5ODkKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTY4OTU2CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDkxOTk3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjcyMTk2NAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjI2MzY3NAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44OTM2NDEKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi40NTYzMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDg2MjY3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDI0MDAwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA0NDY2MgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyMzI4NworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDk0NzczCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTczMTc2CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNTA5OTkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMTY5NTAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIxNDA4NgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA1Mzg2MworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjg0ODcwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAxNjkyMQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjQyOTEKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wOTYzNDIKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ1MzQwMworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xODU0NTQKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjU1MzM4OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yODU0NDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY2NTU3NAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zOTc2MjUKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43OTE0NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTIzNDk5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTMyNjgyCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY2NDczMworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5MTE0OAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44MjMxOTkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yNjg5NTAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDAxMDAxCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDY4NDQ3CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjIwMDQ5OAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjY5MjI4NworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS40MjQzMzgKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMzIwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDYxMDA5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjA2MTAwOQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjk0NjMKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEyOTQ2MworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMDYyNjcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIwNjI2NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI5MjQ0NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yOTI0NDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zODkxNDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzg5MTQwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ5NzYzMQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3NjMxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYxOTM2MQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjE5MzYxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc1NTk0MworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzU1OTQzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkwOTE5MQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTA5MTkxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wODExMzkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjA4MTEzOQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yNzQwNjcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjc0MDY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDkwNTM2CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNDkwNTM2CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjczMzQxOAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS43MzM0MTgKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMDA1OTM2CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjAwNTkzNgorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjMxMTcwNworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjMxMTcwNworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgNDQxMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDc0MzY0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI5MzI1NworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE1NzgwMQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNzY2OTUKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1MTQyMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQ3MDMxMworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM1NjQ2MQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzUzNTUKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NzQzMjAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjkzMjEzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MDY1NTkKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44MjU0NTMKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc1NDkzNQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjk3MzgyOAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkyMTQxNAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4xNDAzMDgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xMDgyMDgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMzI3MTAxCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzE3NzkzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNTM2Njg3CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTUyOTUyCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNzcxODQ2CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE2ODA1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMDM1Njk4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjExMjg1MgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4zMzE3NDYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NDUwMjMKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi42NjM5MTYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy44MTc3MjQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMy4wMzY2MTgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDQ4MDAwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNzczNTcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM0NTMwNgorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNjQxNTIKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQzMjEwMQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNjE1MzgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjUyOTQ4OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzcwODA3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjM4NzU3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40OTM0MDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjEzNTkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MzA5NzEKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODk4OTIwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzg1MzE4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjA1MzI2NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTU4NDk4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjI2NDQ3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE1MjgwOQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNDIwNzU4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zNzA4MjkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjYzODc3OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjYxNTQ1MgorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjg4MzQwMQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjg4OTkyNAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjE1Nzg3MworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xOTc4ODYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuNDY1ODM1CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNTQzNDI1CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuODExMzc0CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMy45MzExMjcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjE5OTA3NgorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKIAorI2lmZGVmIEhJR0hFUl9GUworCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDk2MDAwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wOTYyMzMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY3MzU4MworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMDQyMDgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc4MTU1OAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zMjUzNTgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjkwMjcwOAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDYxMjkxCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDM4NjQxCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MTM4MTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4xOTExNjAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43ODQ5MzkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMzYyMjg5CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45NzY5NDkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNTU0Mjk5CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xOTIzODcKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS43Njk3MzgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi40MzQxMTMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjAxMTQ2NAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIuNzA1MzM1CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0yLjI4MjY4NQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjAwOTY1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjU4NzAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4zNTEwOTcKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi45Mjg0NDcKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy43MzQyMDcKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuMzExNTU4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNC4xNjQwNjQKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjc0MTQxNAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDQuNjQ2MzcxCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtNC4yMjM3MjEKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMTkyMDAwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEwNzgyMworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg3NTE1MAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIyODgwMworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjk5NjEzMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjQ1NDQKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4xMzE4NzEKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTE2ODQ5CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjg0MTc2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42ODc3MzcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNDU1MDY0CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODc5NDc3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS42NDY4MDQKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDk0NjEzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS44NjE5NDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMzNTk5OQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4xMDMzMjYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjA2ODM5CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMzc0MTY2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMi45MTA3MjYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0yLjY3ODA1MworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMjUxNjkzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjAxOTAyMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNjM0MjY0CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjQwMTU5MQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wNjM1MTYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjgzMDg0MworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjU0NTE0NQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtNC4zMTI0NzIKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDUuMDg1NTQyCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTQuODUyODY4CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorCisjZW5kaWYKKworI2Vsc2UKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjIwNTBIeiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xNjQyOTEgKi8KQEAgLTU3MSwzICsxMjE2LDQgQEAKIAogCiAjZW5kaWYKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCmluZGV4IDcyNTY0ZDQuLmNmZTUzYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpAQCAtNjUsOSArNjUsMTYgQEAKICAgICBpZigKICAgICAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCiAgICAgICAgICgocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09OKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgKChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAmJgorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSAgICAgICYmCisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkpICAgICAgfHwKKyNlbHNlCiAgICAgICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCiAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApKSAgICAgIHx8CisjZW5kaWYKICAgICAgICAgKChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgfHwKICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID4gTFZNX0VYX0hFQURQSE9ORVMpKQogICAgIHsKQEAgLTI2OCw3ICsyNzUsMTIgQEAKIHZvaWQgTFZNX1NldFRyZWJsZUJvb3N0KExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBleHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190ICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOworI2Vsc2UKICAgICBleHRlcm4gRk9fQzE2X0xTaHhfQ29lZnNfdCAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKKyNlbmRpZgorCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgT2Zmc2V0OwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEVmZmVjdExldmVsID0gMDsKIApAQCAtMjk4LDYgKzMxMCwyMCBAQAogICAgICAgICAgICAgICogTG9hZCB0aGUgY29lZmZpY2llbnRzIGFuZCBlbmFibGVkIHRoZSB0cmVibGUgYm9vc3QKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgT2Zmc2V0ID0gKExWTV9JTlQxNikoRWZmZWN0TGV2ZWwgLSAxICsgVHJlYmxlQm9vc3RTdGVwcyAqIChwUGFyYW1zLT5TYW1wbGVSYXRlIC0gVHJlYmxlQm9vc3RNaW5SYXRlKSk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkxWTV9UcmVibGVCb29zdENvZWZzW09mZnNldF0pOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2xlYXIgdGhlIHRhcHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KChMVk1fRkxPQVQpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLCAgLyogRGVzdGluYXRpb24uXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMpIC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOyAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyNlbHNlCiAgICAgICAgICAgICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMVk1fVHJlYmxlQm9vc3RDb2Vmc1tPZmZzZXRdKTsKQEAgLTMwOSw2ICszMzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsICAvKiBEZXN0aW5hdGlvbi5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisjZW5kaWYKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCkBAIC0zNDIsNiArMzY5LDkgQEAKICAgICBMVk1fVUlOVDE2ICAgICAgZEJTaGlmdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ZEIgc2hpZnRzICovCiAgICAgTFZNX1VJTlQxNiAgICAgIGRCT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFibGUgb2Zmc2V0ICovCiAgICAgTFZNX0lOVDE2ICAgICAgIFZvbHVtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICBUZW1wOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIExpbWl0IHRoZSBnYWluIHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQKQEAgLTQwMSwyMiArNDMxLDQ2IEBACiAgICAgICovCiAgICAgaWYoZEJTaGlmdHMgPT0gMCkKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpTFZNX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMilMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKLSAgICB9CisjZW5kaWYKKyAgICAgICAgfQogICAgIGVsc2UKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgVGVtcCA9IExWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF07CisgICAgICAgIHdoaWxlKGRCU2hpZnRzKSB7CisgICAgICAgICAgICBUZW1wID0gVGVtcCAvIDIuMGY7CisgICAgICAgICAgICBkQlNoaWZ0cy0tOworICAgICAgICB9CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCBUZW1wKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChMVk1fSU5UMzIpTFZNX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk+PmRCU2hpZnRzKSk7CisjZW5kaWYKICAgICB9CiAgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOwogICAgIGlmKHBJbnN0YW5jZS0+Tm9TbW9vdGhWb2x1bWUgPT0gTFZNX1RSVUUpCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sMCxwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUscEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwyKTsKKyNlbmRpZgogICAgIH0KIH0KIApAQCAtNTU0LDggKzYwOCwyMyBAQAogICAgICAgICAvKiBDb25maWd1cmUgTWl4ZXIgbW9kdWxlIGZvciBncmFkdWFsIGNoYW5nZXMgdG8gdm9sdW1lKi8KICAgICAgICAgaWYoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA8IDApCiAgICAgICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgTFZNX0ZMT0FUIFRhcmdldF9GbG9hdDsKKyNlbHNlCiAgICAgICAgICAgICBMVk1fSU5UMzIgVGFyZ2V0OworI2VuZGlmCiAgICAgICAgICAgICAvKiBEcm9wIGluIHJpZ2h0IGNoYW5uZWwgdm9sdW1lKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gTFZNX01BWEZMT0FUOworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLCBUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisKKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IGRCX3RvX0xpbkZsb2F0KChMVk1fSU5UMTYpKExvY2FsUGFyYW1zLlZDX0JhbGFuY2UgPDwgNCkpOworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisjZWxzZQogICAgICAgICAgICAgVGFyZ2V0ID0gTFZNX01BWElOVF8xNjsKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CkBAIC01NjMsMTEgKzYzMiwyNyBAQAogICAgICAgICAgICAgVGFyZ2V0ID0gZEJfdG9fTGluMzIoKExWTV9JTlQxNikoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZTw8NCkpOwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA+MCkKICAgICAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OworI2Vsc2UKICAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7CisjZW5kaWYKICAgICAgICAgICAgIC8qIERyb3AgaW4gbGVmdCBjaGFubmVsIHZvbHVtZSovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IGRCX3RvX0xpbkZsb2F0KChMVk1fSU5UMTYpKCgtTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSkgPDwgNCkpOworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLCBUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisKKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworI2Vsc2UKICAgICAgICAgICAgIFRhcmdldCA9IGRCX3RvX0xpbjMyKChMVk1fSU5UMTYpKCgtTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSk8PDQpKTsKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CkBAIC01NzUsMTcgKzY2MCwzNiBAQAogICAgICAgICAgICAgVGFyZ2V0ID0gTFZNX01BWElOVF8xNjsKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CisjZW5kaWYKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgTFZNX0ZMT0FUIFRhcmdldF9GbG9hdDsKKyNlbHNlCiAgICAgICAgICAgICBMVk1fSU5UMzIgVGFyZ2V0OworI2VuZGlmCiAgICAgICAgICAgICAvKiBObyBkcm9wKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gTFZNX01BWEZMT0FUOworI2Vsc2UKICAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworCisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisjZWxzZQogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLFRhcmdldCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKIAogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgfQogICAgIC8qCkBAIC0xMDA4LDE4ICsxMTEyLDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgICBDYWxsQmFja1BhcmFtKQogewogICAgIExWTV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKilwQnVuZGxlSGFuZGxlOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgIFRhcmdldDsKKyNlbHNlCiAgICAgTFZNX0lOVDMyICAgIFRhcmdldDsKKyNlbmRpZgogCiAgICAgKHZvaWQpIHBHZW5lcmFsUHVycG9zZTsKICAgICAodm9pZCkgQ2FsbEJhY2tQYXJhbTsKIAogICAgIC8qIFdoZW4gdm9sdW1lIG1peGVyIGhhcyByZWFjaGVkIDAgZEIgdGFyZ2V0IHRoZW4gc3RvcCBpdCB0byBhdm9pZAogICAgICAgIHVubmVjZXNzYXJ5IHByb2Nlc3NpbmcuICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBUYXJnZXQgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSk7CisgICAgaWYoVGFyZ2V0ID09IDEuMGYpCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSA9IExWTV9GQUxTRTsKKyAgICB9CisjZWxzZQogICAgIFRhcmdldCA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdKTsKIAogICAgIGlmKFRhcmdldCA9PSAweDdGRkYpCiAgICAgewogICAgICAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSA9IExWTV9GQUxTRTsKICAgICB9CisjZW5kaWYKICAgICByZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCmluZGV4IDU0MmMzYzguLjI2YzFjNGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwpAQCAtMjMyLDcgKzIzMiwxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7CisjZWxzZQogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOworI2VuZGlmCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuQ2VudHJlRnJlcXVlbmN5ID0gTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6IHwgTFZEQkVfQ0FQX0NFTlRSRV83OEh6IHwgTFZEQkVfQ0FQX0NFTlRSRV85MEh6OwogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IEludGVybmFsQmxvY2tTaXplOwogCkBAIC0yNjUsNyArMjY5LDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKKyNlbHNlCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOworI2VuZGlmCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9DQVBfU1RFUkVPIHwgTFZFUU5CX0NBUF9NT05PSU5TVEVSRU87CiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSA9IEludGVybmFsQmxvY2tTaXplOwogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCYW5kcyAgICAgPSBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kczsKQEAgLTU0MiwxMCArNTUwLDE1IEBACiAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gKExWTV9JTlQzMikoNiAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpICogc2l6ZW9mKExWTV9JTlQxNikpOwogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5wU2NyYXRjaCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAgIC8qIFNjcmF0Y2ggMSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUJ1bmRsZVNjcmF0Y2hTaXplKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpKTsKKyNlbHNlCiAgICAgICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpKTsKKyNlbmRpZgogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5U2FtcGxlcyA9IE1JTl9JTlRFUk5BTF9CTE9DS1NJWkU7IC8qIFNldCB0aGUgbnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KICAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+T3V0RGVsYXlTYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkJ1ZmZlclN0YXRlID0gTFZNX0ZJUlNUQ0FMTDsgICAgICAgICAgICAgLyogU2V0IHRoZSBzdGF0ZSByZWFkeSBmb3IgdGhlIGZpcnN0IGNhbGwgKi8KQEAgLTU5OCwxNCArNjExLDI2IEBACiAgICAgLyogSW4gbWFuYWdlZCBidWZmZXJpbmcsIHN0YXJ0IHdpdGggbG93IHNpZ25hbCBsZXZlbCBhcyBkZWxheSBpbiBidWZmZXIgbWFuYWdlbWVudCBjYXVzZXMgYSBjbGljayovCiAgICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwgMCk7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKKyNlbmRpZgogICAgIH0KICAgICBlbHNlCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQpOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLExWTV9NQVhJTlRfMTYsTFZNX01BWElOVF8xNik7CisjZW5kaWYKICAgICB9CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAogICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLDAsTFZNX0ZTXzgwMDAsMik7CisjZWxzZQorICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCAwLCBMVk1fRlNfODAwMCwgMik7CisjZW5kaWYKIAogICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lZEIgICAgICAgICAgICAgICAgICA9IDA7CiAgICAgcEluc3RhbmNlLT5WQ19BVkxGaXhlZFZvbHVtZSAgICAgICAgICAgID0gMDsKQEAgLTYxNSwxNSArNjQwLDI0IEBACiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDA7CiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSAgICA9IHBJbnN0YW5jZTsKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX1ZDQ2FsbEJhY2s7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7CisjZWxzZQogICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKKyNlbmRpZgogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMVk1fRlNfODAwMCwyKTsKIAogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOwogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAwOwogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7CiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQpOworI2Vsc2UKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYsTFZNX01BWElOVF8xNik7CisjZW5kaWYKICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX1ZDX01JWEVSX1RJTUUsTFZNX0ZTXzgwMDAsMik7CisKICAgICAvKgogICAgICAqIFNldCB0aGUgZGVmYXVsdCBFUU5CIHByZS1nYWluIGFuZCBwb2ludGVyIHRvIHRoZSBiYW5kIGRlZmluaXRpb25zCiAgICAgICovCkBAIC03MDksNyArNzQzLDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKKyNlbHNlCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDA7CisjZW5kaWYKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5DZW50cmVGcmVxdWVuY3kgPSBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzY2SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzc4SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzkwSHo7CiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CiAKQEAgLTc2Myw3ICs4MDEsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTkyMDAwOworI2Vsc2UKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7CisjZW5kaWYKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJhbmRzICAgICAgICA9IHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzOwogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5Tb3VyY2VGb3JtYXQgICAgPSBMVkVRTkJfQ0FQX1NURVJFTyB8IExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPOwpAQCAtODY4LDkgKzkxMCwxNCBAQAogICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7CiAKICAgICAgICAgICAgIC8qIEZhc3QgVGVtcG9yYXJ5ICovCisjaWZkZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9JTlQxNikpOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworI2Vsc2UKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMikgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fSU5UMTYpKTsKKyNlbmRpZgogICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MgICAgICAgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLDApOwogCiAKQEAgLTk5NCw3ICsxMDQxLDYgQEAKICAgICAvKiBEQyByZW1vdmFsIGZpbHRlciAqLwogICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKIAotCiAgICAgcmV0dXJuIExWTV9TVUNDRVNTOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaAppbmRleCAyZTg1Zjc3Li5iNDUzMjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKQEAgLTEzOCw2ICsxMzgsMjMgQEAKIAogCiAvKiBCdWZmZXIgTWFuYWdlbWVudCAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsgICAgICAgICAgLyogQnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCisKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCdWZmZXJTdGF0ZTsgICAgICAgIC8qIEJ1ZmZlciBzdGF0dXMgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBJbkRlbGF5QnVmZmVyWzYgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogSW5wdXQgYnVmZmVyIGRlbGF5IGxpbmUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW5EZWxheVNhbXBsZXM7ICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCisKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlclsyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIE91dHB1dCBidWZmZXIgZGVsYXkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgT3V0RGVsYXlTYW1wbGVzOyAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGRlbGF5IGJ1ZmZlciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb091dHB1dDsgICAgLyogU2FtcGxlcyB0byB3cml0ZSB0byB0aGUgb3V0cHV0ICovCit9IExWTV9CdWZmZXJfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwU2NyYXRjaDsgICAgICAgICAgLyogQnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCkBAIC0xNTAsMjIgKzE2NywyOCBAQAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE91dERlbGF5U2FtcGxlczsgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIsIGxlZnQgYW5kIHJpZ2h0ICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvT3V0cHV0OyAgICAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KIH0gTFZNX0J1ZmZlcl90OwotCisjZW5kaWYKIAogLyogRmlsdGVyIHRhcHMgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdCBUcmVibGVCb29zdF9UYXBzOyAgIC8qIFRyZWJsZSBib29zdCBUYXBzICovCisjZWxzZQogICAgIEJpcXVhZF8ySV9PcmRlcjFfVGFwc190IFRyZWJsZUJvb3N0X1RhcHM7ICAgLyogVHJlYmxlIGJvb3N0IFRhcHMgKi8KKyNlbmRpZgogfSBMVk1fVEVfRGF0YV90OwogCi0KIC8qIENvZWZmaWNpZW50cyAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFRyZWJsZUJvb3N0X1N0YXRlOyAgLyogU3RhdGUgZm9yIHRoZSB0cmVibGUgYm9vc3QgZmlsdGVyICovCisjZWxzZQogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFRyZWJsZUJvb3N0X1N0YXRlOyAgLyogU3RhdGUgZm9yIHRoZSB0cmVibGUgYm9vc3QgZmlsdGVyICovCisjZW5kaWYKIH0gTFZNX1RFX0NvZWZzX3Q7CiAKLQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAvKiBQdWJsaWMgcGFyYW1ldGVycyAqLwpAQCAtMTgxLDE1ICsyMDQsMjQgQEAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZTsgIC8qIE1heGltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSAqLwogICAgIExWTV9CdWZmZXJfdCAgICAgICAgICAgICpwQnVmZmVyTWFuYWdlbWVudDsgLyogQnVmZmVyIG1hbmFnZW1lbnQgdmFyaWFibGVzICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzczsgICAvKiBJbnB1dCBzYW1wbGVzIGxlZnQgdG8gcHJvY2VzcyAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBJbnB1dFNhbXBsZXM7ICAgICAvKiBFeHRlcm5hbCBpbnB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT3V0cHV0U2FtcGxlczsgICAgLyogRXh0ZXJuYWwgb3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwSW5wdXRTYW1wbGVzOyAgICAgLyogRXh0ZXJuYWwgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcE91dHB1dFNhbXBsZXM7ICAgIC8qIEV4dGVybmFsIG91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAKICAgICAvKiBDb25maWd1cmF0aW9uIG51bWJlciAqLwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25OdW1iZXI7CiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQmxpY2tTaXplTXVsdGlwbGU7CiAKICAgICAvKiBEQyByZW1vdmFsICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBEQ19SZW1vdmFsSW5zdGFuY2U7IC8qIERDIHJlbW92YWwgZmlsdGVyIGluc3RhbmNlICovCisjZWxzZQogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIERDX1JlbW92YWxJbnN0YW5jZTsgLyogREMgcmVtb3ZhbCBmaWx0ZXIgaW5zdGFuY2UgKi8KKyNlbmRpZgogCiAgICAgLyogQ29uY2VydCBTb3VuZCAqLwogICAgIExWQ1NfSGFuZGxlX3QgICAgICAgICAgIGhDU0luc3RhbmNlOyAgICAgICAgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSBoYW5kbGUgKi8KQEAgLTIwOSw4ICsyNDEsMTYgQEAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBEQkVfQWN0aXZlOyAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLwogCiAgICAgLyogVm9sdW1lIENvbnRyb2wgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAgIFZDX1ZvbHVtZTsgICAgICAgICAgLyogVm9sdW1lIHNjYWxlciAqLworI2Vsc2UKICAgICBMVk1peGVyM18xU3Rfc3QgICAgICAgICBWQ19Wb2x1bWU7ICAgICAgICAgIC8qIFZvbHVtZSBzY2FsZXIgKi8KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAgICAgVkNfQmFsYW5jZU1peDsgICAgICAvKiBWQyBiYWxhbmNlIG1peGVyICovCisjZWxzZQogICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgIFZDX0JhbGFuY2VNaXg7ICAgICAgLyogVkMgYmFsYW5jZSBtaXhlciAqLworI2VuZGlmCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfVm9sdW1lZEI7ICAgICAgICAvKiBHYWluIGluIGRCICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfQWN0aXZlOyAgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWQ19BVkxGaXhlZFZvbHVtZTsgIC8qIEFWTCBmaXhlZCB2b2x1bWUgKi8KQEAgLTIzNCw3ICsyNzQsMTEgQEAKICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQU0FfQ29udHJvbFBhcmFtczsgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGNvbnRyb2wgcGFyYW1ldGVycyAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFBTQV9HYWluT2Zmc2V0OyAgICAgLyogVG9uZSBjb250cm9sIGZsYWcgKi8KICAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICBDYWxsQmFjazsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwUFNBSW5wdXQ7ICAgICAgICAgLyogUFNBIGlucHV0IHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBQU0FJbnB1dDsgICAgICAgICAvKiBQU0EgaW5wdXQgcG9pbnRlciAqLworI2VuZGlmCiAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgIE5vU21vb3RoVm9sdW1lOyAgICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIHNtb290aCB2b2x1bWUgY2hhbmdlcyovCiAKQEAgLTI2MSwxNiArMzA1LDI4IEBACiAKIHZvaWQgICAgTFZNX1NldEhlYWRyb29tKCAgICBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCAgICBMVk1fQnVmZmVySW4oICAgTFZNX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAqKnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpOworI2Vsc2UKIHZvaWQgICAgTFZNX0J1ZmZlckluKCAgIExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwVG9Qcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgICAgTFZNX0J1ZmZlck91dCggIExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcyk7CisjZWxzZQogdm9pZCAgICBMVk1fQnVmZmVyT3V0KCAgTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKTsKKyNlbmRpZgogCiBMVk1fSU5UMzIgTFZNX0FsZ29DYWxsQmFjayggICAgIHZvaWQgICAgICAgICAgKnBCdW5kbGVIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBEYXRhLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKaW5kZXggZjVhMDFmMy4uNGExOWExMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCkBAIC01MSw3ICs1MSwyMzEgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKQorewogCisgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBTYW1wbGVDb3VudCA9IE51bVNhbXBsZXM7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcElucHV0ICAgICA9IChMVk1fRkxPQVQgKilwSW5EYXRhOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBUb1Byb2Nlc3MgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwUHJvY2Vzc2VkID0gcE91dERhdGE7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgU3RhdHVzOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgemVybworICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID09IDApCisgICAgeworICAgICAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDaGVjayB2YWxpZCBwb2ludHMgaGF2ZSBiZWVuIGdpdmVuCisgICAgICovCisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIHVubWFuYWdlZCBtb2RlIG9ubHkKKyAgICAgKi8KKyAgICBpZihwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpCisgICAgeworICAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIGEgZ29vZCBtdWx0aXBsZSAodW5tYW5hZ2VkIG1vZGUgb25seSkKKyAgICAgICAgICovCisgICAgICAgIGlmKChOdW1TYW1wbGVzICUgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWTV9JTlZBTElETlVNU0FNUExFUyk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayB0aGUgYnVmZmVyIGFsaWdubWVudAorICAgICAgICAgKi8KKyAgICAgICAgaWYoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWTV9BTElHTk1FTlRFUlJPUik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIG5ldyBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgU3RhdHVzID0gTFZNX0FwcGx5TmV3U2V0dGluZ3MoaEluc3RhbmNlKTsKKworICAgICAgICBpZihTdGF0dXMgIT0gTFZNX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29udmVydCBmcm9tIE1vbm8gaWYgbmVjZXNzYXJ5CisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTykKKyAgICB7CisgICAgICAgIE1vbm9UbzJJX0Zsb2F0KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICBwSW5wdXQgICAgID0gcE91dERhdGE7CisgICAgICAgIHBUb1Byb2Nlc3MgPSBwT3V0RGF0YTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogUHJvY2VzcyB0aGUgZGF0YSB3aXRoIG1hbmFnZWQgYnVmZmVycworICAgICAqLworICAgIHdoaWxlIChTYW1wbGVDb3VudCAhPSAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlIHRoZSBpbnB1dCBidWZmZXIgYW5kIGZyYW1lIHByb2Nlc3NpbmcKKyAgICAgICAgICovCisgICAgICAgIExWTV9CdWZmZXJJbihoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICBwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAmcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICZwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgJlNhbXBsZUNvdW50KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBPbmx5IHByb2Nlc3MgZGF0YSB3aGVuIFNhbXBsZUNvdW50IGlzIG5vbmUgemVybywgYSB6ZXJvIGNvdW50IGNhbiBvY2N1ciB3aGVuCisgICAgICAgICAqIHRoZSBCdWZmZXJJbiByb3V0aW5lIGlzIHdvcmtpbmcgaW4gbWFuYWdlZCBtb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IENvbmNlcnRTb3VuZCBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5DU19BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKHZvaWQpTFZDU19Qcm9jZXNzKHBJbnN0YW5jZS0+aENTSW5zdGFuY2UsICAgICAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB2b2x1bWUgaWYgcmVxdWlyZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VkNfQWN0aXZlIT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsIE4tQmFuZCBlcXVhbGlzZXIgaWYgZW5hYmxlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5FUU5CX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkVRTkJfUHJvY2VzcyhwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UsICAgIC8qIE4tQmFuZCBlcXVhbGlzZXIgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhbGwgYmFzcyBlbmhhbmNlbWVudCBpZiBlbmFibGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkRCRV9BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZEQkVfUHJvY2VzcyhwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZSwgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQnlwYXNzIG1vZGUgb3IgZXZlcnl0aGluZyBvZmYsIHNvIGNvcHkgdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBUb1Byb2Nlc3MgIT0gcFByb2Nlc3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBUb1Byb2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0cmVibGUgYm9vc3QgaWYgcmVxdWlyZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VEVfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFZvbHVtZSBiYWxhbmNlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFBlcmZvcm0gUGFyYW1ldHJpYyBTcGVjdHVtIEFuYWx5c2lzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09OKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKFNhbXBsZUNvdW50KSk7CisKKyAgICAgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoU2FtcGxlQ291bnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIERDIHJlbW92YWwKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgRENfMklfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKKworCisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBNYW5hZ2UgdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIExWTV9CdWZmZXJPdXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICZTYW1wbGVDb3VudCk7CisKKyAgICB9CisKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMjczLDMgKzQ5Nyw0IEBACiAKICAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOwogfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCmluZGV4IGUxNGY5MDkuLjE5OWRkZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKQEAgLTI5LDcgKzI5LDM0MiBAQAogLyogICAgVHJlYmxlIEJvb3N0IEZpbHRlciBDb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCiAKK0ZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdID0geworCisgICAgICAgICAgICAgICAgICAgIC8qIDIya0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiAyNGtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xNV9CMX0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogMzJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDQ0a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjFfQjEsfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xNV9CMX0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogNDhrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTVfQjF9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgLyogOTZrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDE5MmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xNV9CMX0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9OworI2Vsc2UKIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXSA9IHsKIAogICAgICAgICAgICAgICAgICAgICAvKiAyMmtIeiBzYW1wbGluZyByYXRlICovCkBAIC0zNDAsOCArNjc1LDkgQEAKICAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCiAgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfQTAsCiAgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X1NoaWZ0fX07Ci0KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNV9TaGlmdH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzUwLDYgKzY4NiwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUIExWTV9Wb2x1bWVUYWJsZVtdID0geworICAgIDEuMDAwZiwgICAgICAgICAgICAgLyogIDBkQiAqLworICAgIDAuODkxZiwgICAgICAgICAgICAgLyogLTFkQiAqLworICAgIDAuNzk0ZiwgICAgICAgICAgICAgLyogLTJkQiAqLworICAgIDAuNzA4ZiwgICAgICAgICAgICAgLyogLTNkQiAqLworICAgIDAuNjMxZiwgICAgICAgICAgICAgLyogLTRkQiAqLworICAgIDAuNTYyZiwgICAgICAgICAgICAgLyogLTVkQiAqLworICAgIDAuNTAxZn07ICAgICAgICAgICAgLyogLTZkQiAqLworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiBMVk1fVm9sdW1lVGFibGVbXSA9IHsKICAgICAweDdGRkYsICAgICAgICAgICAgIC8qICAwZEIgKi8KICAgICAweDcyMTUsICAgICAgICAgICAgIC8qIC0xZEIgKi8KQEAgLTM1OCw2ICs3MDQsNyBAQAogICAgIDB4NTBDMywgICAgICAgICAgICAgLyogLTRkQiAqLwogICAgIDB4NDdGQiwgICAgICAgICAgICAgLyogLTVkQiAqLwogICAgIDB4NDAwMH07ICAgICAgICAgICAgLyogLTZkQiAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCmluZGV4IGE3NjAxZmYuLjRjZjcxMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKQEAgLTM3LDE2ICszNywyMyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorZXh0ZXJuIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKKyNlbHNlCiBleHRlcm4gRk9fQzE2X0xTaHhfQ29lZnNfdCAgICAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVm9sdW1lIGNvbnRyb2wgZ2FpbiBhbmQgdGltZSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZNX1ZvbHVtZVRhYmxlW107CisjZWxzZQogZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVk1fVm9sdW1lVGFibGVbXTsKKyNlbmRpZgorCiBleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWTV9NaXhlclRDVGFibGVbXTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCmluZGV4IDIwODBkNjQuLjlhM2QzNWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCkBAIC0zNyw3ICszNyw3IEBACiAvKiAgICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyICBBR0NfR2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCBBR0MgZ2FpbiAqLwpAQCAtNTIsMjAgKzUyLDM5IEBACiAgICAgTFZNX0lOVDE2ICBWb2x1bWVUQzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KIAogfSBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICBBR0NfR2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgQUdDX01heEdhaW47ICAgICAgICAgICAgICAgICAgICAgLyogVGhlIG1heGltdW0gQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgIFZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICBUYXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgdGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICBBR0NfVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUICBBR0NfQXR0YWNrOyAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgYXR0YWNrIHNjYWxlciAqLworICAgIExWTV9GTE9BVCAgQUdDX0RlY2F5OyAgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIGRlY2F5IHNjYWxlciAqLworICAgIExWTV9GTE9BVCAgVm9sdW1lVEM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCiAKK30gQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90OworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuKTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyNlbHNlCiB2b2lkIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgbik7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCi0KKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKaW5kZXggN2FjN2ZiZC4uM2VlN2Y2MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKQEAgLTI3LDE5ICsyNywzNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOU1RBTkNFIE1FTU9SWSBUWVBFIERFRklOSVRJT04KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBTdG9yYWdlWzZdOwogCit9IEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyIFN0b3JhZ2VbNl07CiAKIH0gQmlxdWFkX0luc3RhbmNlX3Q7Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ09FRkZJQ0lFTlQgVFlQRSBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogQmlxdWFkIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgQTI7ICAgLyogIGEyICAqLworICAgIExWTV9GTE9BVCAgQTE7ICAgLyogIGExICAqLworICAgIExWTV9GTE9BVCAgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9GTE9BVCAgQjI7ICAgLyogLWIyISAqLworICAgIExWTV9GTE9BVCAgQjE7ICAgLyogLWIxISAqLworfSBCUV9GTE9BVF9Db2Vmc190OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDE2IEEyOyAgIC8qICBhMiAgKi8KQEAgLTU3LDggKzcyLDE3IEBACiAgICAgTFZNX0lOVDMyICBCMjsgICAvKiAtYjIhICovCiAgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCiB9IEJRX0MzMl9Db2Vmc190OworI2VuZGlmCiAKIC8qKiogRmlyc3Qgb3JkZXIgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBBMTsgICAvKiAgYTEgICovCisgICAgTFZNX0ZMT0FUIEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgQjE7ICAgLyogLWIxISAqLworfSBGT19GTE9BVF9Db2Vmc190OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDE2IEExOyAgIC8qICBhMSAgKi8KQEAgLTcyLDggKzk2LDE3IEBACiAgICAgTFZNX0lOVDMyICBBMDsgICAvKiAgYTAgICovCiAgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCiB9IEZPX0MzMl9Db2Vmc190OworI2VuZGlmCiAKIC8qKiogRmlyc3Qgb3JkZXIgY29lZmZpY2llbnRzIHdpdGggU2hpZnQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgQTE7ICAgIC8qICBhMSAgKi8KKyAgICBMVk1fRkxPQVQgQTA7ICAgIC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgQjE7ICAgIC8qIC1iMSEgKi8KK30gRk9fRkxPQVRfTFNoeF9Db2Vmc190OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDE2IEExOyAgICAvKiAgYTEgICovCkBAIC04MSw4ICsxMTQsMTYgQEAKICAgICBMVk1fSU5UMTYgQjE7ICAgIC8qIC1iMSEgKi8KICAgICBMVk1fSU5UMTYgU2hpZnQ7IC8qIFNoaWZ0ICovCiB9IEZPX0MxNl9MU2h4X0NvZWZzX3Q7Ci0KKyNlbmRpZgogLyoqKiBCYW5kIHBhc3MgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUICBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0ZMT0FUICBCMTsgICAvKiAtYjEhICovCit9IEJQX0ZMT0FUX0NvZWZzX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMTYgQTA7ICAgLyogIGEwICAqLwpAQCAtOTYsOCArMTM3LDE4IEBACiAgICAgTFZNX0lOVDMyICBCMjsgICAvKiAtYjIhICovCiAgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCiB9IEJQX0MzMl9Db2Vmc190OworI2VuZGlmCiAKIC8qKiogUGVha2luZyBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIyOyAgIC8qIC1iMiEgKi8KKyAgICBMVk1fRkxPQVQgQjE7ICAgLyogLWIxISAqLworICAgIExWTV9GTE9BVCAgRzsgICAvKiBHYWluICovCit9IFBLX0ZMT0FUX0NvZWZzX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMTYgQTA7ICAgLyogIGEwICAqLwpAQCAtMTEzLDE2ICsxNjQsMjYgQEAKICAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KICAgICBMVk1fSU5UMTYgIEc7ICAgLyogR2FpbiAqLwogfSBQS19DMzJfQ29lZnNfdDsKLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBUQVBTIFRZUEUgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIFR5cGVzIHVzZWQgZm9yIGZpcnN0IG9yZGVyIGFuZCBzaGVsdmluZyBmaWx0ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDEgKiAyKSBdOyAgLyogT25lIGNoYW5uZWwsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCit9IEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190OwogCiB0eXBlZGVmIHN0cnVjdAogeworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDIpIF07ICAvKiBUd28gY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCit9IEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CiAgICAgTFZNX0lOVDMyIFN0b3JhZ2VbICgxKjIpIF07ICAvKiBPbmUgY2hhbm5lbCwgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KIH0gQmlxdWFkXzFJX09yZGVyMV9UYXBzX3Q7CiAKQEAgLTEzMCwxMiArMTkxLDIyIEBACiB7CiAgICAgTFZNX0lOVDMyIFN0b3JhZ2VbICgyKjIpIF07ICAvKiBUd28gY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCiB9IEJpcXVhZF8ySV9PcmRlcjFfVGFwc190OwotCisjZW5kaWYKIAogLyoqKiBUeXBlcyB1c2VkIGZvciBiaXF1YWQsIGJhbmQgcGFzcyBhbmQgcGVha2luZyBmaWx0ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KK30gQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3Q7CiAKIHR5cGVkZWYgc3RydWN0CiB7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogNCkgXTsgIC8qIFR3byBjaGFubmVscywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCit9IEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CiAgICAgTFZNX0lOVDMyIFN0b3JhZ2VbICgxKjQpIF07ICAvKiBPbmUgY2hhbm5lbCwgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCiB9IEJpcXVhZF8xSV9PcmRlcjJfVGFwc190OwogCkBAIC0xNDMsNyArMjE0LDcgQEAKIHsKICAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDIqNCkgXTsgIC8qIFR3byBjaGFubmVscywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCiB9IEJpcXVhZF8ySV9PcmRlcjJfVGFwc190OwotCisjZW5kaWYKIC8qIFRoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb25zIGFyZSBjaGFuZ2VkIHRvIHNhdGlzZnkgUUFDIHJ1bGVzOiBOYW1lIHNob3VsZCBiZSBVbmlxdWUgd2l0aGluZyAxNiBjaGFyYWN0ZXJzKi8KICNkZWZpbmUgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAgSW5pdF9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMQogI2RlZmluZSBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMiAgICAgICBUV09fQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIKQEAgLTE1NCw1OSArMjI1LDE0OCBAQAogCiAvKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKIAorI2VuZGlmCiAvKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwordm9pZCBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKQEAgLTIxNSwzMyArMzc1LDY2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IEZJUlNUIE9SREVSIEZJTFRFUlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMTZfTFNoeF9Db2Vmc190ICAgICAqcENvZWYpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgogLyoqKiAzMiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKK3ZvaWQgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CkBAIC0yNTAsMTMgKzQ0MywyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBCQU5EIFBBU1MgRklMVEVSUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAqcENvZWYpOwordm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwordm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0IChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICpwQ29lZik7Cit2b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CkBAIC0yNzQsMTAgKzQ4MiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCi0KKyNlbmRpZgogLyoqKiAzMiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKK3ZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoICAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKQEAgLTI4Niw0MiArNTAxLDU5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgogCiAvKioqIDMyIGJpdCBkYXRhIHBhdGggU1RFUkVPICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci0KIHZvaWQgUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEgKCAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBEQyBSRU1PVkFMIEZJTFRFUlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIDE2IGJpdCBkYXRhIHBhdGggU1RFUkVPICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKIAordm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7CiAKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQorI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oCmluZGV4IDRjYjhhYTIuLjQ5OGZhYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKQEAgLTY2LDEzICs2NiwxNyBAQAogLyogIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgICAgICAgIEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgIEJsb2NrTGVuZ3RoKTsKKyNlbHNlCiB2b2lkIE5vbkxpbkNvbXBfRDE2KExWTV9JTlQxNiAgICAgICAgR2FpbiwKICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcFN0ZXJCZkluLAogICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwU3RlckJmT3V0LAogICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgIEJsb2NrTGVuZ3RoKTsKLQotCisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oCmluZGV4IDIyOTcwMWEuLjBjODk1NWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oCkBAIC0zMywxMSArMzMsMzIgQEAKICAgIERFRklORVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBGSUxURVJfTE9TUyAgICAgMzI3MzAgICAgICAgLyogLTAuMDFkQiBsb3NzIHRvIGF2b2lkIHdyYXBwaW5nIGR1ZSB0byBiYW5kIHJpcHBsZSAqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgRklMVEVSX0xPU1NfRkxPQVQgICAgMC45OTg4NDlmCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAogCitMVk1fRkxPQVQgTFZNX1Bvd2VyMTAoICAgTFZNX0ZMT0FUICBYKTsKKworTFZNX0ZMT0FUIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpwQ29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgWCk7CisjaWZkZWYgSElHSEVSX0ZTCitMVk1fRkxPQVQgICBMVk1fR2V0T21lZ2EoTFZNX1VJTlQzMiAgRmMsCisjZWxzZQorTFZNX0ZMT0FUICAgTFZNX0dldE9tZWdhKExWTV9VSU5UMTYgIEZjLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgU2FtcGxlUmF0ZSk7CisKK0xWTV9GTE9BVCBMVk1fRk9fTFBGKCAgICBMVk1fRkxPQVQgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpOworCitMVk1fRkxPQVQgTFZNX0ZPX0hQRiggICAgTFZNX0ZMT0FUICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZzKTsKKyNlbHNlCiBMVk1fSU5UMzIgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiBOLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKnBDb2VmZmljaWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICBYKTsKQEAgLTUyLDcgKzczLDcgQEAKIAogTFZNX0lOVDMyICAgTFZNX0dldE9tZWdhKExWTV9VSU5UMTYgIEZjLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgIFNhbXBsZVJhdGUpOwotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCmluZGV4IDY4YzU1ZjcuLmNiMTViNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCkBAIC00NCw2ICs0NCw5IEBACiAKICNkZWZpbmUgTFZNX01BWElOVF84ICAgICAgICAgICAgMTI3ICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc2l6ZSAqLwogI2RlZmluZSBMVk1fTUFYSU5UXzE2ICAgICAgICAgICAzMjc2NworI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIExWTV9NQVhGTE9BVCAgICAgICAgICAgIDEuMGYKKyNlbmRpZgogI2RlZmluZSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAyMTQ3NDgzNjQ3CiAjZGVmaW5lIExWTV9NQVhFTlVNICAgICAgICAgICAgIDIxNDc0ODM2NDcKIApAQCAtOTUsNyArOTgsOSBAQAogdHlwZWRlZiAgICAgaW50MzJfdCAgICAgICAgICAgICBMVk1fSU5UMzI7ICAgICAgICAgIC8qIFNpZ25lZCAzMi1iaXQgd29yZCAqLwogdHlwZWRlZiAgICAgdWludDMyX3QgICAgICAgICAgICBMVk1fVUlOVDMyOyAgICAgICAgIC8qIFVuc2lnbmVkIDMyLWJpdCB3b3JkICovCiAKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmICAgICBmbG9hdCAgICAgICAgICAgICAgIExWTV9GTE9BVDsgICAgICAgICAgLyogc2luZ2xlIHByZWNpc3Npb24gZmxvYXRpbmcgcG9pbnQqLworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFN0YW5kYXJkIEVudW1lcmF0ZWQgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMzMsNiArMTM4LDEwIEBACiAgICAgTFZNX0ZTXzMyMDAwID0gNiwKICAgICBMVk1fRlNfNDQxMDAgPSA3LAogICAgIExWTV9GU180ODAwMCA9IDgsCisjaWZkZWYgSElHSEVSX0ZTCisgICAgTFZNX0ZTXzk2MDAwID0gOSwKKyAgICBMVk1fRlNfMTkyMDAwID0gMTAsCisjZW5kaWYKICAgICBMVk1fRlNfSU5WQUxJRCA9IExWTV9NQVhFTlVNLTEsCiAgICAgTFZNX0ZTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX0ZzX2VuOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKaW5kZXggODlkZWIwZC4uMDdjNTNjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCkBAIC0zMCw2ICszMCw0MyBAQAogICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVCAvKiBCVUlMRF9GTE9BVCovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgIEFscGhhOyAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGNvbnN0YW50LiBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSAqLworICAgIExWTV9GTE9BVCAgIFRhcmdldDsgICAgICAgICAgICAgICAgICAvKiBUYXJnZXQgdmFsdWUuICBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSAqLworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQ7ICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHZhbHVlLiAgU2V0IGJ5IHRoZSBtaXhlciBmdW5jdGlvbi4gKi8KKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDsgICAgICAgICAgICAgLyogQm9vbGVhbi4gIFNob3VsZCBiZSBzZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggdGltZSB0aGUgdGFyZ2V0IHZhbHVlIGlzIHVwZGF0ZWQgKi8KKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1BhcmFtOyAgICAgICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTsgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworICAgIHZvaWQgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgICAgICAvKiBQb2ludGVyIGZvciBnZW5lcmFsIHB1cnBvc2UgdXNhZ2UgKi8KKyAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrOyAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK30gTWl4XzFTdF9DbGxfRkxPQVRfdDsKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgQWxwaGExOworICAgIExWTV9GTE9BVCAgIFRhcmdldDE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudDE7CisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tTZXQxOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW0xOworICAgIHZvaWQgICAgICAgICpwQ2FsbGJhY2tIYW5kbGUxOworICAgIHZvaWQgICAgICAgICpwR2VuZXJhbFB1cnBvc2UxOworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2sxOworCisgICAgTFZNX0ZMT0FUICAgQWxwaGEyOyAgICAgICAgICAgICAgICAgICAvKiBXYXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoaXMgbG9jYXRpb24gaXMgcGFzc2VkIGFzIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBNaXhfMVN0X0NsbF90IGluIHNvbWUgZnVuY3Rpb25zICovCisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0MjsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50MjsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDI7CisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTI7CisgICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTI7CisgICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTI7CisgICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazI7Cit9IE1peF8yU3RfQ2xsX0ZMT0FUX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgICBBbHBoYTsgICAgICAgICAgICAgICAgICAgIC8qIFRpbWUgY29uc3RhbnQuIFNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uLiAgQ2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgKi8KQEAgLTY0LDkgKzEwMSwzNSBAQAogCiB9IE1peF8yU3RfQ2xsX3Q7CiAKKyNlbmRpZgogCiAvKioqIEdlbmVyYWwgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAogCitMVk1fRkxPQVQgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyICAgdGMsCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgRnMsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIEZzLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpOworCit2b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKK3ZvaWQgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCggICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKK3ZvaWQgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbHNlCiBMVk1fVUlOVDMyIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpOwpAQCAtODgsMTAgKzE1MSwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CiAKKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoTE9XIExFVkVMIFNVQkZVTkNUSU9OUykKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Cit2b2lkIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Cit2b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2Vsc2UKIHZvaWQgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKQEAgLTEwNyw2ICsxODYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KQEAgLTExNSwxMyArMTk1LDMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZW5kaWYgLyogX19NSVhFUl9IX18gKi8KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCmluZGV4IDNkNjI3MDQuLmNkYjM4MzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKQEAgLTM0LDcgKzM0LDEyIEBACiAvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KIAogLyogQWJzb2x1dGUgdmFsdWUgaW5jbHVkaW5nIHRoZSBjb3JuZXIgY2FzZSBmb3IgdGhlIGV4dHJlbWUgbmVnYXRpdmUgdmFsdWUgKi8KKworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgICBBYnNfRmxvYXQoTFZNX0ZMT0FUICAgICBpbnB1dCk7CisjZWxzZQogTFZNX0lOVDMyICAgQWJzXzMyKExWTV9JTlQzMiAgICAgaW5wdXQpOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgTmFtZSAgICAgICAgOiBkQl90b19MaW4zMigpCkBAIC00OCw4ICs1MywxMSBAQAogICogICAgICAgICAgICAgICAgICAoMTUtPjAxKSA9IGRlY2ltYWwgcGFydAogICogIFJldHVybnMgICAgIDogTGluIHZhbHVlIGZvcm1hdCAxLjE2LjE1CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2ICAgIGRiX2ZpeCk7CisjZWxzZQogTFZNX0lOVDMyIGRCX3RvX0xpbjMyKExWTV9JTlQxNiAgZGJfZml4KTsKKyNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAppbmRleCAyYjc5MWJkLi4wYmEyMGEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCkBAIC0yOSw2ICsyOSwxMSBAQAogICAgIFZBUklPVVMgRlVOQ1RJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExvYWRDb25zdF9GbG9hdCggICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgTG9hZENvbnN0XzE2KCAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CkBAIC0zNiwxMCArNDEsMTcgQEAKIHZvaWQgTG9hZENvbnN0XzMyKCAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIENvcHlfRmxvYXQoICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIENvcHlfMTYoICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBub3RlOiBJbiBNdWx0M3NfMTZ4MTYoKSBzYXR1cmF0aW9uIG9mIHJlc3VsdCBpcyBub3QgdGFrZW4gY2FyZSB3aGVuICAgICAgICAgICAqCkBAIC00OSwxMCArNjEsMTcgQEAKICAqICAgICAgIFRoaXMgaXMgdGhlIG9ubHkgY2FzZSB3aGljaCB3aWxsIGdpdmUgd3JvbmcgcmVzdWx0LiAgICAgICAgICAgICAgICAgICAgICoKICAqICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZmVyIHRvIFZlY3Rvcl9Bcml0aG1ldGljLmRvYyBpbiAvZG9jIGZvbGRlciAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTXVsdDNzX0Zsb2F0KCAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworI2Vsc2UKIHZvaWQgTXVsdDNzXzE2eDE2KCAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbm90ZTogSW4gTXVsdDNzXzMyeDE2KCkgc2F0dXJhdGlvbiBvZiByZXN1bHQgaXMgbm90IHRha2VuIGNhcmUgd2hlbiAgICAgICAgICAgKgpAQCAtNjYsMjAgKzg1LDMxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRGVsYXlNaXhfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsICAgICAgICAgICAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLworICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRlbGF5LCAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsICAgICAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LCAgICAgICAvKiBEZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pICA7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCisjZWxzZQogdm9pZCBEZWxheU1peF8xNngxNiggICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2VuZGlmCiB2b2lkIERlbGF5V3JpdGVfMzIoICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsICAgICAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwT2Zmc2V0LCAgICAgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBBZGQyX1NhdF9GbG9hdCggICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBBZGQyX1NhdF8xNngxNiggICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CkBAIC04Nyw3ICsxMTcsMTMgQEAKIHZvaWQgQWRkMl9TYXRfMzJ4MzIoICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1hYzNzX1NhdF9GbG9hdCggICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyNlbHNlCiB2b2lkIE1hYzNzX1NhdF8xNngxNiggICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKQEAgLTk3LDcgKzEzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjZW5kaWYKIHZvaWQgRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIoICAgIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IHNpemUsICAgICAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBjb2VmZiwgICAgICAgICAgICAgICAgLyogQWxsIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50ICovCkBAIC0xMDksNyArMTQ1LDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIFNISUZUIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBTaGlmdF9TYXRfRmxvYXQgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pOworI2Vsc2UKIHZvaWQgU2hpZnRfU2F0X3YxNnh2MTYgKCAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LApAQCAtMTE5LDExICsxNjAsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBBVURJTyBGT1JNQVQgQ09OVkVSU0lPTiBGVU5DVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTW9ub1RvMklfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyNlbHNlCiB2b2lkIE1vbm9UbzJJXzE2KCAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwpAQCAtMTMxLDI5ICsxNzYsNTIgQEAKIHZvaWQgTW9ub1RvMklfMzIoICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KCAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyNlbHNlCiB2b2lkIEZyb20yaVRvTW9ub18zMiggICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1TVG8yaV9TYXRfRmxvYXQoICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyY00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyY1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBNU1RvMmlfU2F0XzE2eDE2KCAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmNNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmNTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGcm9tMmlUb01TX0Zsb2F0KCAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgRnJvbTJpVG9NU18xNngxNiggICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3RNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3RTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgSm9pblRvMmlfRmxvYXQoICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmNSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIEZyb20yaVRvTW9ub18xNiggICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCiB2b2lkIEpvaW5UbzJpXzMyeDMyKCAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmNMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgREFUQSBUWVBFIENPTlZFUlNJT04gRlVOQ1RJT05TCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jCmluZGV4IDkyMGI1MTUuLmZhOWYwMWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jCkBAIC0zMyw3ICszMywxMCBAQAogCiAjZGVmaW5lIFZPTF9UQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KICNkZWZpbmUgREVDQVlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgVk9MX1RDX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjBmICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBERUNBWV9GQUNfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQuMGYgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY5LDcgKzcyLDcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KQEAgLTE5Myw0ICsxOTYsMTEzIEBACiAKICAgICByZXR1cm47CiB9CisjZWxzZQordm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCit7CiAKKyAgICAvKgorICAgICAqIEdlbmVyYWwgdmFyaWFibGVzCisgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCisgICAgTFZNX0ZMT0FUICAgICAgIExlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBzYW1wbGUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgUmlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSaWdodCBzYW1wbGUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgTW9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIHNhbXBsZSAqLworICAgIExWTV9GTE9BVCAgICAgICBBYnNQZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIHBlYWsgc2lnbmFsICovCisgICAgTFZNX0ZMT0FUICAgICAgIEFHQ19NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICAgVm9sX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCB2b2x1bWUgKi8KKworCisgICAgLyoKKyAgICAgKiBJbnN0YW5jZSBjb250cm9sIHZhcmlhYmxlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19HYWluICAgICAgPSBwSW5zdGFuY2UtPkFHQ19HYWluOyAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19NYXhHYWluICAgPSBwSW5zdGFuY2UtPkFHQ19NYXhHYWluOyAgICAgIC8qIEdldCBtYXhpbXVtIEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0F0dGFjayAgICA9IHBJbnN0YW5jZS0+QUdDX0F0dGFjazsgICAgICAgLyogQXR0YWNrIHNjYWxlciAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19EZWNheSAgICAgPSAocEluc3RhbmNlLT5BR0NfRGVjYXkgKiAoMSA8PCAoREVDQVlfU0hJRlQpKSk7LyogRGVjYXkgc2NhbGVyICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+QUdDX1RhcmdldDsgICAgICAgLyogR2V0IHRoZSB0YXJnZXQgbGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfQ3VycmVudCAgID0gcEluc3RhbmNlLT5Wb2x1bWU7ICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAgICAgICAgICAvKiBUYXJnZXQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfVEMgICAgICAgID0gcEluc3RhbmNlLT5Wb2x1bWVUQzsgICAgICAgICAvKiBUaW1lIGNvbnN0YW50ICovCisKKworICAgIC8qCisgICAgICogUHJvY2VzcyBvbiBhIHNhbXBsZSBieSBzYW1wbGUgYmFzaXMKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTnVtU2FtcGxlczsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgZWFjaCBzYW1wbGUgKi8KKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBzaG9ydCBzY2FsZXJzCisgICAgICAgICAqLworICAgICAgICBBR0NfTXVsdCAgICA9IChMVk1fRkxPQVQpKEFHQ19HYWluKTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgc2hvcnQgQUdDIGdhaW4gKi8KKyAgICAgICAgVm9sX011bHQgICAgPSAoTFZNX0ZMT0FUKShWb2xfQ3VycmVudCk7ICAgICAgICAgICAvKiBHZXQgdGhlIHNob3J0IHZvbHVtZSBnYWluICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGlucHV0IHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIExlZnQgID0gKnBTdFNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBsZWZ0IHNhbXBsZSAqLworICAgICAgICBSaWdodCA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgcmlnaHQgc2FtcGxlICovCisgICAgICAgIE1vbm8gID0gKnBNb25vU3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtb25vIHNhbXBsZSAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIEFHQyBnYWluIHRvIHRoZSBtb25vIGlucHV0IGFuZCBtaXggd2l0aCB0aGUgc3RlcmVvIHNpZ25hbAorICAgICAgICAgKi8KKyAgICAgICAgTGVmdCAgKz0gKE1vbm8gKiBBR0NfTXVsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1peCBpbiB0aGUgbW9ubyBzaWduYWwgKi8KKyAgICAgICAgUmlnaHQgKz0gKE1vbm8gKiBBR0NfTXVsdCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIHZvbHVtZSBhbmQgd3JpdGUgdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICovCisgICAgICAgIExlZnQgID0gTGVmdCAgKiBWb2xfTXVsdDsKKyAgICAgICAgUmlnaHQgPSBSaWdodCAqIFZvbF9NdWx0OworICAgICAgICAqcERzdCsrID0gTGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhlIHJlc3VsdHMgKi8KKyAgICAgICAgKnBEc3QrKyA9IFJpZ2h0OworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgQUdDIGdhaW4KKyAgICAgICAgICovCisgICAgICAgIEFic1BlYWsgPSBBYnNfRmxvYXQoTGVmdCkgPiBBYnNfRmxvYXQoUmlnaHQpID8gQWJzX0Zsb2F0KExlZnQpIDogQWJzX0Zsb2F0KFJpZ2h0KTsKKyAgICAgICAgaWYgKEFic1BlYWsgPiBBR0NfVGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHNpZ25hbCBpcyB0b28gbGFyZ2Ugc28gZGVjcmVhc2UgdGhlIGdhaW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQUdDX0dhaW4gPSBBR0NfR2FpbiAqIEFHQ19BdHRhY2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHNpZ25hbCBpcyB0b28gc21hbGwgc28gaW5jcmVhc2UgdGhlIGdhaW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKEFHQ19HYWluID4gQUdDX01heEdhaW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUdDX0dhaW4gLT0gKEFHQ19EZWNheSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUdDX0dhaW4gKz0gKEFHQ19EZWNheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGdhaW4KKyAgICAgICAgICovCisgICAgICAgIFZvbF9DdXJyZW50ICs9ICAoVm9sX1RhcmdldCAtIFZvbF9DdXJyZW50KSAqICgoTFZNX0ZMT0FUKVZvbF9UQyAvIFZPTF9UQ19GTE9BVCk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+Vm9sdW1lID0gVm9sX0N1cnJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIHBJbnN0YW5jZS0+QUdDX0dhaW4gPSBBR0NfR2FpbjsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmMKaW5kZXggOTEyOGI4Mi4uODRmYWJkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmMKQEAgLTQ3LDQgKzQ3LDE0IEBACiAgICAgfQogICAgIHJldHVybiBpbnB1dDsKIH0KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgICAgQWJzX0Zsb2F0KExWTV9GTE9BVCAgICBpbnB1dCkKK3sKKyAgICBpZihpbnB1dCA8ICAwKQorICAgIHsKKyAgICAgICAgLyogTmVnYXRpdmUgaW5wdXQsIHNvIGludmVydCAqLworICAgICAgICBpbnB1dCA9IChMVk1fRkxPQVQpKC1pbnB1dCk7CisgICAgfQorICAgIHJldHVybiBpbnB1dDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKaW5kZXggNjlkMzU3ZS4uZTNlZGNjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jCkBAIC01Nyw0ICs1NywzMyBAQAogICAgIHJldHVybjsKIH0KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEFkZDJfU2F0X0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9GTE9BVCBUZW1wOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkgKnNyYykgKyAoKExWTV9GTE9BVCkgKmRzdCk7CisgICAgICAgIHNyYysrOworCisgICAgICAgIGlmIChUZW1wID4gMS4wMDAwMDBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMS4wMDAwMDBmOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wMDAwMDBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLTEuMDAwMDAwZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworICAgIH0KKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKaW5kZXggZjRjNTc1Ny4uODhmOTk4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCkBAIC0zMyw3ICszMyw1MSBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQogCisKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPSAoQTAgICogKHgobilMICAtIHgobi0yKUwgICkgKQorICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqICgoKnBEYXRhSW4pLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSk7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQorICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkgKQorICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtNzgsNCArMTIyLDUgQEAKICAgICAgICAgfQogCiAgICAgfQorI2VuZGlmCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCA4ODkxNGFkLi4yN2FiNTdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zOCw2ICszOCwxOSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7Cit9CisjZWxzZQogdm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTQ5LDYgKzYyLDcgQEAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT1wQ29lZi0+QjI7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09cENvZWYtPkIxOwogICB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDk4MDUzOWMuLmUxOTRmOTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI3LDQgKzI3LDEzIEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworCisgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLypfQlBfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYwppbmRleCBiYTFhNDJmLi4zYWJkZDQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMKQEAgLTMzLDcgKzMzLDQ4IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKK3sKKyAgICBMVk1fRkxPQVQgeW5MLHRlbXBsOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKXBJbnN0YW5jZTsKIAorICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLy8geW5MPSAoQTAgKiAoeChuKUwgLSB4KG4tMilMICkpCisgICAgICAgIHRlbXBsID0gKExWTV9GTE9BVCkgKnBEYXRhSW4gLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiB0ZW1wbDsKKworICAgICAgICAvLyB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApICkKKyAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgLy8geW5MKz0gKCgtQjEgICogeShuLTEpTCAgKSkKKyAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMTYKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAorCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgKnBEYXRhT3V0KysgPSAoeW5MKTsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKyAgICAgICAgfQorfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTgwLDQgKzEyMSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggZTgzMzIxOC4uZDZlMDQ3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtNDgsNiArNDgsMjAgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0oTFZNX0ZMT0FUICopIHBUYXBzOworCisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gIHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gIHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gIHBDb2VmLT5CMTsKK30KKyNlbHNlCiB2b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTksNiArNzMsNyBAQAogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gIHBDb2VmLT5CMjsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9ICBwQ29lZi0+QjE7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDljY2E2MjcuLmFhOWU2NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI2LDUgKzI2LDEyIEBACiB9RmlsdGVyX1N0YXRlOwogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GbG9hdDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0Zsb2F0ICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKICNlbmRpZiAvKl9CUF8xSV9EMTZGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jCmluZGV4IGIwOWMxYWEuLmFiZGIyZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYwpAQCAtMzMsNyArMzMsNTIgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMiAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5bkwsdGVtcGw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD0gKEEwICAqICh4KG4pTCAgLSB4KG4tMilMICApICkKKyAgICAgICAgICAgIHRlbXBsID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiB0ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSApCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkgKQorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IHluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMiAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtNzgsNCArMTIzLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYwppbmRleCA5MzY3OTEyLi41NTkwYzMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jCkBAIC0zNyw2ICszNywyMSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9KExWTV9GTE9BVCAqKSBwVGFwczsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSBwQ29lZi0+QTA7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gcENvZWYtPkIyOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHBDb2VmLT5CMTsKK30KKyNlbHNlCiB2b2lkIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTAsNiArNjUsNyBAQAogCiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09cENvZWYtPkIxOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaAppbmRleCA1Y2MxY2UyLi44MGMzOTIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oCkBAIC0yNiw1ICsyNiwxMyBAQAogfUZpbHRlcl9TdGF0ZTsKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0Zsb2F0OwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAKICNlbmRpZiAvKl9CUF8xSV9EMzJGMzJDTExfVFJDX1dSQV8wMl9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCmluZGV4IGYyZjhjNmIuLmVlOWJmN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpAQCAtMzIsNyArMzIsNTYgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAgKC1CMiAgKiB5KG4tMilMICkKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8vIHluTCs9ICgtQjEgICogeShuLTEpTCAgKQorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKworCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC04Miw0ICsxMzEsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IGJhZjBjMWEuLjNkNWJlZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM3LDYgKzM3LDI2IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzIDsKKyAgICB0ZW1wID0gcENvZWYtPkEyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTU2LDYgKzc2LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggOTA5YzY5OS4uODExZGE4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjcsNCArMjcsMTMgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKICNlbmRpZiAvKl9CUV8xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYwppbmRleCA5MmY2Y2FmLi5jNzRhMTM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKQEAgLTMyLDcgKzMyLDU0IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAtQjEgICogeShuLTEpTAorICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgIC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpKHluTCk7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC04MSw0ICsxMjgsNCBAQAogCiAgICAgICAgIH0KICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IGFlYTEwZjAuLjk4MTIyNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI3LDQgKzI3LDEzIEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogI2VuZGlmIC8qX0JRXzFJX0QxNkYzMkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCmluZGV4IDFkNmJlNGUuLmZlYWUyMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKQEAgLTM4LDYgKzM4LDI3IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopcFRhcHM7CisKKyAgICB0ZW1wID0gcENvZWYtPkEyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTU3LDYgKzc4LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKaW5kZXggOTcyZTcwNC4uOWIwZmRlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCkBAIC0zNyw3ICszNyw4MSBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoIC1CMiAgKiB5KG4tMilMICApCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOworCisgICAgICAgICAgICAvLyB5bkwrPSggLUIxICAqIHkobi0xKUwgKQorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluUj1BMiAgKiB4KG4tMilSCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8vIHluUis9QTEgICogeChuLTEpUgorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5SKz1BMCAgKiB4KG4pUgorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvLyB5blIrPSAoIC1CMiAgKiB5KG4tMilSICApCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddOworCisgICAgICAgICAgICAvLyB5blIrPSggLUIxICAqIHkobi0xKVIgICkKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8vIHgobi0yKVI9eChuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUgorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOyAvLyBXcml0ZSBSaWdodCBvdXB1dAorCisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExMiwzICsxODYsNCBAQAogCiAgICAgfQogCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwppbmRleCBlMDU2MzczLi5mMjRkYjhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKQEAgLTM3LDcgKzM3LDgxIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCAtQjIgICogeShuLTIpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKKworICAgICAgICAgICAgLy8geW5MKz0oIC1CMSAgKiB5KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOworCisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5SPUEyICAqIHgobi0yKVIKKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLy8geW5SKz1BMSAgKiB4KG4tMSlSCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilSCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8vIHluUis9ICggLUIyICAqIHkobi0yKVIgICkKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107CisKKyAgICAgICAgICAgIC8vIHluUis9KCAtQjEgICogeShuLTEpUiAgKQorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvLyB5KG4tMilSPXkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLy8geChuLTIpUj14KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlSCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5blI7IC8vIFdyaXRlIFJpZ2h0IG91cHV0CisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExMSw0ICsxODUsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDBhOGFjMzUuLjM5ZTFiZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM4LDYgKzM4LDI3IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzICAgICAgICAgICAgOworCisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Nyw2ICs3OCw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDdkNDJjZWQuLjA2OTFiOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI4LDQgKzI4LDE0IEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgcERlbGF5czsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgKi8KKyAgICBMVk1fRkxPQVQgICAgIGNvZWZzWzVdOyAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgorCiAjZW5kaWYgLyogX0JRXzJJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCmluZGV4IDRhMGNjZTQuLjYxYzA3YzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYwpAQCAtMzcsNyArMzcsNzkgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAqIHgobi0yKUwgKi8KKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMSogeChuLTEpTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMCogeChuKUwgICAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9LUIyKnkobi0yKUwgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5bkwrPS1CMSp5KG4tMSlMICovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPUEyICogeChuLTIpUiAqLworICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExKiB4KG4tMSlSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvKiB5blIrPUEwKiB4KG4pUiAgICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8qIHluUis9LUIyICogeShuLTIpUiAqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9LUIxICogeShuLTEpUiAqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMICovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5SKTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExNSw0ICsxODcsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKaW5kZXggMDUyZTJhMC4uY2YxOWUwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCkBAIC0zNiw3ICszNiw4MiBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5bkw9QTIgICogeChuLTIpTCAqLworICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPUExICAqIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTAgICogeChuKUwgKi8KKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvKiB5bkwrPSAoICgtQjIgICogeShuLTIpTCAgKSkqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKworICAgICAgICAgICAgLyogeW5MKz0oICgtQjEgICogeShuLTEpTCAgKSkgICovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICApKSovCisgICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5SKz0oICgtQjEgICogeShuLTEpUiAgKSkgICovCisgICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlSICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpTCAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5MKTsgLyogV3JpdGUgTGVmdCBvdXRwdXQgKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTQsNCArMTg5LDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jCmluZGV4IDhjNzQxZTEuLjI2MTFiMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYwpAQCAtMzYsNyArMzYsODQgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5bkw9QTIgICogeChuLTIpTCAqLworICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPUExICAqIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTAgICogeChuKUwgKi8KKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvKiB5bkwrPSAoICgtQjIgICogeShuLTIpTCApICAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKworICAgICAgICAgICAgLyogeW5MKz0oICgtQjEgICogeShuLTEpTCAgKSkgICovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgICogeChuLTIpUiAqLworICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExICAqIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAgICogeChuKVIgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCAoLUIyICAqIHkobi0yKVIgKSAqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKworICAgICAgICAgICAgLyogeW5SKz0oICgtQjEgICogeShuLTEpUiAgKSkgaW4gUTE1ICovCisgICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAvKiBVcGRhdGUgeShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7IC8qIFVwZGF0ZSB5KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5bkwpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5SKTsgLyogV3JpdGUgUmlnaHQgb3VwdXQqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTQsNCArMTkxLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA0ZjBjZjY3Li5jMDMxOWM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yOCw0ICsyOCwxNCBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Vmc1s1XTsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCisKICNlbmRpZiAvKiBfQlFfMklfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCmluZGV4IDQ1OTFlZTAuLjRkOWJiZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKQEAgLTM3LDYgKzM3LDI2IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTYsNiArNzYsNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwppbmRleCBmZDgyMTJlNC4uOTYwZGU3OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCkBAIC0zNiw3ICszNiw5NCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKIAorCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MLHluUix0ZW1wbCx0ZW1wZDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5bkw9ICggQTIgICogeChuLTIpTCAgKSAqLworICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCBBMSAgKiB4KG4tMSlMICApKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MKz0gKCBBMCAgKiB4KG4pTCAgKSAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgIC8qIHluTCs9ICgtQjIgICogeShuLTIpTCAgKSAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSAoLUIxICAqIHkobi0xKUwgICkqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9ICggQTIgICogeChuLTIpUiAgKSAqLworICAgICAgICAgICAgeW5SID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCBBMSAgKiB4KG4tMSlSICApICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisgICAgICAgICAgICB5blIgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9ICggQTAgICogeChuKVIgICkgKi8KKyAgICAgICAgICAgIHRlbXBkID0qIChwRGF0YUluKzEpOworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogdGVtcGQ7CisgICAgICAgICAgICB5blIgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9ICgtQjIgICogeShuLTIpUiAgKSAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoLUIxICAqIHkobi0xKVIgICkgICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07CisgICAgICAgICAgICB5blIgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IChMVk1fRkxPQVQpeW5SOyAvKiBVcGRhdGUgeShuLTEpUiAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0gKExWTV9GTE9BVCl5bkw7IC8qIFVwZGF0ZSB5KG4tMSlMICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluTDsgLyogV3JpdGUgTGVmdCBvdXRwdXQgKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluUjsgLyogV3JpdGUgUmlnaHQgb3VwdXQgKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTEyMyw0ICsyMTAsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwppbmRleCAxNzA5ZjcxLi5mZmYwNWVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zNyw2ICszNywyNiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKKyAgICB0ZW1wID0gcENvZWYtPkEyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTU2LDYgKzc2LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUV8ySV9EMzJGMzJDMzJfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggNzQ3YWY2YS4uYzBmMGRjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjksNCArMjksMTQgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9CUV8ySV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYwppbmRleCAyMDQwNGFkLi5lNDg5MDMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCkBAIC01NCw1ICs1NCwzNSBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIENvcHlfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CiAKKyAgICBpZiAoc3JjID4gZHN0KQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICAgICAgZHN0Kys7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzcmMgKz0gbiAtIDE7CisgICAgICAgIGRzdCArPSBuIC0gMTsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICAgICAgZHN0LS07CisgICAgICAgICAgICBzcmMtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jCmluZGV4IGJmNjllMzUuLmVhOTgwNDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jCkBAIC0yNSw3ICsyNSwzNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIENPUkVfTUlYSEFSRF8yU1RfRDMyQzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9GTE9BVCAgVGVtcDEsVGVtcDIsVGVtcDM7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9GTE9BVCBDdXJyZW50MVNob3J0OworICAgIExWTV9GTE9BVCBDdXJyZW50MlNob3J0OwogCisgICAgQ3VycmVudDFTaG9ydCA9IChwSW5zdGFuY2UtPkN1cnJlbnQxKTsKKyAgICBDdXJyZW50MlNob3J0ID0gKHBJbnN0YW5jZS0+Q3VycmVudDIpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0peworICAgICAgICBUZW1wMSA9ICpzcmMxKys7CisgICAgICAgIFRlbXAzID0gVGVtcDEgKiBDdXJyZW50MVNob3J0OworICAgICAgICBUZW1wMiA9ICpzcmMyKys7CisgICAgICAgIFRlbXAxID0gVGVtcDIgKiBDdXJyZW50MlNob3J0OworICAgICAgICBUZW1wMiA9IChUZW1wMSAvIDIuMGYpICsgKFRlbXAzIC8gMi4wZik7CisgICAgICAgIGlmIChUZW1wMiA+IDAuNWYpCisgICAgICAgICAgICBUZW1wMiA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAyIDwgLTAuNWYgKQorICAgICAgICAgICAgVGVtcDIgPSAtMS4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgVGVtcDIgPSAoVGVtcDIgKiAyKTsKKyAgICAgICAgICAgICpkc3QrKyA9IFRlbXAyOworICAgIH0KK30KKyNlbHNlCiB2b2lkIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggICBNaXhfMlN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKQEAgLTU1LDYgKzg1LDUgQEAKICAgICAgICAgICAgICpkc3QrKyA9IFRlbXAyOwogICAgIH0KIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCmluZGV4IDM0NzFmMDUuLjI4MTRmMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMKQEAgLTI2LDYgKzI2LDcwIEBACiAgICBGVU5DVElPTiBDT1JFX01JWFNPRlRfMVNUX0QzMkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQgLyogQlVJTERfRkxPQVQgKi8KK3ZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgICAgVGVtcDEsVGVtcDIsVGVtcDM7CisgICAgTFZNX0lOVDE2ICAgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgICAgSW5Mb29wOworICAgIExWTV9GTE9BVCAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhOworICAgIExWTV9GTE9BVCAgICBDdXJyZW50VGltZXNBbHBoYTsKKyAgICBMVk1fSU5UMTYgICAgIGlpLGpqOworCisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSA9ICgoMS4wZiAtcEluc3RhbmNlLT5BbHBoYSkgKiBwSW5zdGFuY2UtPlRhcmdldCk7CisgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCl7CisgICAgICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgKz0oTFZNX0ZMT0FUKSgyLjBmIC8gMjE0NzQ4MzY0Ny4wZik7IC8qIENlaWwqLworICAgIH0KKworICAgIGlmIChPdXRMb29wKXsKKworICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGE7CisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKKworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIFRlbXAxID0gKnNyYysrOworICAgICAgICBUZW1wMiA9ICpkc3Q7CisKKyAgICAgICAgVGVtcDMgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICBUZW1wMSA9IFRlbXAyICsgVGVtcDM7CisKKyAgICAgICAgaWYgKFRlbXAxID4gMS4wZikKKyAgICAgICAgICAgIFRlbXAxID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcDEgPCAtMS4wZikKKyAgICAgICAgICAgIFRlbXAxID0gLTEuMGY7CisKKyAgICAgICAgKmRzdCsrID0gVGVtcDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKworICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGE7CisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKKworICAgICAgICBmb3IgKGpqID0gNDsgamohPTAgOyBqai0tKXsKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYysrOworICAgICAgICAgICAgVGVtcDIgPSAqZHN0OworCisgICAgICAgICAgICBUZW1wMyA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICBUZW1wMSA9IFRlbXAyICsgVGVtcDM7CisKKyAgICAgICAgICAgIGlmIChUZW1wMSA+IDEuMGYpCisgICAgICAgICAgICAgICAgVGVtcDEgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcDEgPCAtMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wMSA9IC0xLjBmOworICAgICAgICAgICAgKmRzdCsrID0gVGVtcDE7CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQogdm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCAgICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LApAQCAtODksNiArMTUzLDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYwppbmRleCA3MDljMzA0Li44MTRjY2VlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYwpAQCAtMjUsNyArMjUsNzkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWFNPRlRfMVNUX0QzMkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUIFRlbXAxLFRlbXAyOworICAgIExWTV9JTlQxNiBPdXRMb29wOworICAgIExWTV9JTlQxNiBJbkxvb3A7CisgICAgTFZNX0ZMT0FUIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnRUaW1lc0FscGhhOwogCisgICAgTFZNX0lOVDE2IGlpOworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgPSAoMS4wZiAtIHBJbnN0YW5jZS0+QWxwaGEpICogcEluc3RhbmNlLT5UYXJnZXQ7IC8qIGZsb2F0ICogZmxvYXQgaW4gZmxvYXQgKi8KKyAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPj0gcEluc3RhbmNlLT5DdXJyZW50KQorICAgIHsKKyAgICAgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArPSAoTFZNX0ZMT0FUKSgyLjBmIC8gMjE0NzQ4MzY0Ny4wZik7IC8qIENlaWwqLworICAgIH0KKworICAgIGlmIChPdXRMb29wICE9IDApCisgICAgeworICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IChwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhKTsKKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSBwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhOworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7CisKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworCisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKQEAgLTk4LDYgKzE3MCw1IEBACiAgICAgICAgICAgICBkc3QrKzsKICAgICB9CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCmluZGV4IDQ5ZmExODQuLmQyNjFjOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYwpAQCAtMTgsNyArMTgsNTMgQEAKICNpbmNsdWRlICJCSVFVQUQuaCIKICNpbmNsdWRlICJEQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgTGVmdERDLFJpZ2h0REM7CisgICAgICAgIExWTV9GTE9BVCBEaWZmOworICAgICAgICBMVk1fSU5UMzIgajsKKyAgICAgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZSkgcEluc3RhbmNlOwogCisgICAgICAgIExlZnREQyA9IHBCaXF1YWRTdGF0ZS0+TGVmdERDOworICAgICAgICBSaWdodERDID0gcEJpcXVhZFN0YXRlLT5SaWdodERDOworICAgICAgICBmb3IoaiA9IE5yU2FtcGxlcy0xOyBqID49IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoTGVmdERDKTsKKyAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgeworICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOyB9CisgICAgICAgICAgICBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KKyAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7CisgICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKKyAgICAgICAgICAgICAgICBMZWZ0REMgLT0gRENfRkxPQVRfU1RFUDsgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTGVmdERDICs9IERDX0ZMT0FUX1NURVA7IH0KKworCisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLworICAgICAgICAgICAgRGlmZiA9KiAocERhdGFJbisrKSAtIChSaWdodERDKTsKKyAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgeworICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOyB9CisgICAgICAgICAgICBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KKyAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7CisgICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKKyAgICAgICAgICAgICAgICBSaWdodERDIC09IERDX0ZMT0FUX1NURVA7IH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFJpZ2h0REMgKz0gRENfRkxPQVRfU1RFUDsgfQorCisgICAgICAgIH0KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgPSBMZWZ0REM7CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyA9IFJpZ2h0REM7CisKKworICAgIH0KKyNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC02NCw0ICsxMTAsNCBAQAogCiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDQ2OGE4OGQuLjRmNGZjZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTE3LDExICsxNywxOCBAQAogCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQoreworICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGUgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgICAgID0gMC4wZjsKKyAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgICAgICAgPSAwLjBmOworfQorI2Vsc2UKIHZvaWQgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQogewogICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CiAgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgICAgID0gMDsKICAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgICAgICAgPSAwOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA4OWE0ZTY4Li5mYTZiNzI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0xOCwxMSArMTgsMjMgQEAKICNpZm5kZWYgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KICNkZWZpbmUgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIERDX0ZMT0FUX1NURVAgICAwLjAwMDAwMDIzODRmOworI2Vsc2UKICNkZWZpbmUgRENfRDE2X1NURVAgICAgIDB4MjAwOworI2VuZGlmCiAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9GTE9BVF9TdGF0ZV8KK3sKKyAgICBMVk1fRkxPQVQgIExlZnREQzsgICAgIC8qIExlZnREQyAgKi8KKyAgICBMVk1fRkxPQVQgIFJpZ2h0REM7ICAgIC8qIFJpZ2h0REMgICovCit9RmlsdGVyX0ZMT0FUX1N0YXRlOwordHlwZWRlZiBGaWx0ZXJfRkxPQVRfU3RhdGUgKiBQRmlsdGVyX0ZMT0FUX1N0YXRlIDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwogewogICBMVk1fSU5UMzIgIExlZnREQzsgICAgIC8qIExlZnREQyAgKi8KQEAgLTMwLDUgKzQyLDUgQEAKIH1GaWx0ZXJfU3RhdGU7CiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KKyNlbmRpZgogI2VuZGlmIC8qIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYwppbmRleCA3ZTMxODJkLi5mNTAyNzE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMKQEAgLTM2LDEwICszNiw1NSBAQAogICAgIExWTV9JTlQxNiAgIE9mZnNldCAgPSAqcE9mZnNldDsKICAgICBMVk1fSU5UMTYgICB0ZW1wOwogCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLworICAgICAgICB0ZW1wID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpICsgKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKKyAgICAgICAgKmRzdCA9IHRlbXA7CisgICAgICAgIGRzdCsrOworCisgICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOworICAgICAgICBPZmZzZXQrKzsKKyAgICAgICAgc3JjKys7CisKKworICAgICAgICAvKiBSaWdodCBjaGFubmVsICovCisgICAgICAgIHRlbXAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgLSAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICAqZHN0ID0gdGVtcDsKKyAgICAgICAgZHN0Kys7CisKKyAgICAgICAgZGVsYXlbT2Zmc2V0XSA9ICpzcmM7CisgICAgICAgIE9mZnNldCsrOworICAgICAgICBzcmMrKzsKKworICAgICAgICAvKiBNYWtlIHRoZSByZXZlcmIgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCisgICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0ICovCisgICAgKnBPZmZzZXQgPSBPZmZzZXQ7CisKKyAgICByZXR1cm47Cit9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRGVsYXlNaXhfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsICAgICAgICAgICAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRlbGF5LCAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsICAgICAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LCAgICAgICAvKiBEZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KK3sKKyAgICBMVk1fSU5UMTYgICBpOworICAgIExWTV9JTlQxNiAgIE9mZnNldCAgPSAqcE9mZnNldDsKKyAgICBMVk1fRkxPQVQgICB0ZW1wOworCiAgICAgZm9yIChpPTA7IGk8bjsgaSsrKQogICAgIHsKICAgICAgICAgLyogTGVmdCBjaGFubmVsICovCi0gICAgICAgIHRlbXAgICAgICAgICAgICA9IChMVk1fSU5UMTYpKChMVk1fVUlOVDMyKSgoTFZNX0lOVDMyKSgqZHN0KSArIChMVk1fSU5UMzIpZGVsYXlbT2Zmc2V0XSkgPj4gMSk7CisgICAgICAgIHRlbXAgICAgICAgICAgICA9IChMVk1fRkxPQVQpKChMVk1fRkxPQVQpKCpkc3QgKyAoTFZNX0ZMT0FUKWRlbGF5W09mZnNldF0pIC8gMi4wZik7CiAgICAgICAgICpkc3QgICAgICAgICAgICA9IHRlbXA7CiAgICAgICAgIGRzdCsrOwogCkBAIC00OSw3ICs5NCw3IEBACiAKIAogICAgICAgICAvKiBSaWdodCBjaGFubmVsICovCi0gICAgICAgIHRlbXAgICAgICAgICAgICA9IChMVk1fSU5UMTYpKChMVk1fVUlOVDMyKSgoTFZNX0lOVDMyKSgqZHN0KSAtIChMVk1fSU5UMzIpZGVsYXlbT2Zmc2V0XSkgPj4gMSk7CisgICAgICAgIHRlbXAgICAgICAgICAgICA9IChMVk1fRkxPQVQpKChMVk1fRkxPQVQpKCpkc3QgLSAoTFZNX0ZMT0FUKWRlbGF5W09mZnNldF0pIC8gMi4wZik7CiAgICAgICAgICpkc3QgICAgICAgICAgICA9IHRlbXA7CiAgICAgICAgIGRzdCsrOwogCkBAIC02OSw1ICsxMTQsNSBAQAogCiAgICAgcmV0dXJuOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKaW5kZXggZGU3NzM2MS4uMDM5Yzg4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCkBAIC0zMSw2ICszMSw0NiBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gICgtQjEgICogeShuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTcxLDQgKzExMSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggOTYyNTJjYy4uYjIxYjhhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzgsNiArMzgsMjIgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpICBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopcFRhcHM7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTUzLDYgKzY5LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggNTE2Y2E4My4uNmZkYjAzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjgsNCArMjgsMTQgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogI2VuZGlmIC8qIF9GT18xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYwppbmRleCAwZjFkNWJjLi40MTZlOGViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMKQEAgLTMxLDcgKzMxLDQ3IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgIGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMSAgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAgKiB5KG4tMSlMCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtNzEsNCArMTExLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwppbmRleCAxMzZlNGY2Li5mMzNkMjRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zNyw2ICszNywyMyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgICAgcFRhcHM7CisKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTIsNiArNjksNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA5NGFkNDhjLi5mZGI1MjhiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yOSw0ICsyOSwxMyBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVRfCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRkxPQVQ7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKICNlbmRpZiAvKiBfRk9fMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCmluZGV4IDgzODgwNTAuLjE5MjkyN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKQEAgLTMyLDcgKzMyLDkyIEBACiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTEpUiBpbiBRMTUgZm9ybWF0CiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTEpUiBpbiBRMzAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgICB5bkwseW5SOworICAgICAgICBMVk1fRkxPQVQgICBUZW1wOworICAgICAgICBMVk1fRkxPQVQgICBOZWdTYXRWYWx1ZTsKKyAgICAgICAgTFZNX0lOVDE2ICAgaWk7CiAKKyAgICAgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgIE5lZ1NhdFZhbHVlID0gLTEuMGY7CisKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgLy8geW5MID1BMSAgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgICAgICAvLyB5blIgPUExICAqIHgobi0xKVIKKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworCisgICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKKyAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKihwRGF0YUluKzEpKTsKKworCisgICAgICAgICAgICAvLyB5bkwgKz0gICgtQjEgICogeShuLTEpTCAgKQorICAgICAgICAgICAgVGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07CisgICAgICAgICAgICB5bkwgKz0gVGVtcDsKKyAgICAgICAgICAgIC8vIHluUiArPSAgKC1CMSAgKiB5KG4tMSlSICkgKQorICAgICAgICAgICAgVGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07CisgICAgICAgICAgICB5blIgKz0gVGVtcDsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHluUjsgLy8gVXBkYXRlIHkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKVIKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIC8qU2F0dXJhdGUgcmVzdWx0cyovCisgICAgICAgICAgICBpZih5bkwgPiAxLjBmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHluTCA9IDEuMGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoeW5MIDwgTmVnU2F0VmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB5bkwgPSBOZWdTYXRWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHluUiA+IDEuMGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeW5SID0gMS4wZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih5blIgPCBOZWdTYXRWYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHluUiA9IE5lZ1NhdFZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsKKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5blI7CisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMjUsNCArMjEwLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggYTE5YzMyYy4uMzNjYTZjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM3LDYgKzM3LDIzIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyAgICAgICAgICAgIDsKKworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0xTaHhfQ29lZnNfdCAgICAgICAgKnBDb2VmKQpAQCAtNTUsNiArNzIsNyBAQAogICB0ZW1wPXBDb2VmLT5TaGlmdDsKICAgcEJpcXVhZFN0YXRlLT5TaGlmdCA9IHRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDQ2NDA3NDMuLjM2OGJmY2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yMCw2ICsyMCwxNSBAQAogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgICAgTFZNX0ZMT0FUICAgICAqcERlbGF5czsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX0Zsb2F0X1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9GbG9hdF9TdGF0ZSAqIFBGaWx0ZXJfRmxvYXRfU3RhdGUgOworI2Vsc2UKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCiB7CiAgIExWTV9JTlQzMiAgICAgKnBEZWxheXM7ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCkBAIC0yOCw1ICszNyw1IEBACiB9RmlsdGVyX1N0YXRlOwogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotCisjZW5kaWYKICNlbmRpZiAvKiBfRk9fMklfRDE2RjMyQ1NTX0xTSFhfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKaW5kZXggNGQzMmRmMS4uYjFmZGUwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaApAQCAtMzQsNiArMzQsNyBAQAogICogQmlxdWFkIHdpdGggY29lZmZpY2llbnRzIEEwLCBBMSwgQTIsIEIxIGFuZCBCMiBjb2VmZmljaWVudHMKICAqLwogLyogU2luZ2xlIHByZWNpc2lvbiAoMTYtYml0KSBCaXF1YWQgc2VjdGlvbiBjb2VmZmljaWVudHMgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgICAgIExWTV9JTlQxNiAgIEEwOwpAQCAtNDMsMTIgKzQ0LDIyIEBACiAgICAgICAgIExWTV9JTlQxNiAgIEIyOwogICAgICAgICBMVk1fVUlOVDE2ICBTY2FsZTsKIH0gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdDsKLQotCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICBBMDsKKyAgICBMVk1fRkxPQVQgICBBMTsKKyAgICBMVk1fRkxPQVQgICBBMjsKKyAgICBMVk1fRkxPQVQgICBCMTsKKyAgICBMVk1fRkxPQVQgICBCMjsKKyAgICBMVk1fVUlOVDE2ICBTY2FsZTsKK30gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdDsKKyNlbmRpZgogLyoKICAqIEJpcXVhZCB3aXRoIGNvZWZmaWNpZW50cyBBMCwgQTEgYW5kIEIxIGNvZWZmaWNpZW50cwogICovCiAvKiBTaW5nbGUgcHJlY2lzaW9uICgxNi1iaXQpIEJpcXVhZCBzZWN0aW9uIGNvZWZmaWNpZW50cyAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAgICAgTFZNX0lOVDE2ICAgQTA7CkBAIC01Niw4ICs2NywxNSBAQAogICAgICAgICBMVk1fSU5UMTYgICBCMTsKICAgICAgICAgTFZNX1VJTlQxNiAgU2NhbGU7CiB9IEJpcXVhZEEwMUIxQ29lZnNTUF90OwotCi0KKyNlbHNlCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgIEEwOworICAgIExWTV9GTE9BVCAgIEExOworICAgIExWTV9GTE9BVCAgIEIxOworICAgIExWTV9VSU5UMTYgIFNjYWxlOworfSBCaXF1YWRBMDFCMUNvZWZzU1BfdDsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYwppbmRleCA3OTc1ZThiLi4yYzZlNmMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jCkBAIC01Myw1ICs1MywzNCBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZyb20yaVRvTVNfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0UywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDEsbGVmdCxyaWdodDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBsZWZ0ID0gKExWTV9GTE9BVCkqc3JjOworICAgICAgICBzcmMrKzsKIAorICAgICAgICByaWdodCA9IChMVk1fRkxPQVQpKnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgLyogQ29tcHV0ZSBNIHNpZ25hbCovCisgICAgICAgIHRlbXAxID0gIChsZWZ0ICsgcmlnaHQpIC8gMi4wZjsKKyAgICAgICAgKmRzdE0gPSAoTFZNX0ZMT0FUKXRlbXAxOworICAgICAgICBkc3RNKys7CisKKyAgICAgICAgLyogQ29tcHV0ZSBTIHNpZ25hbCovCisgICAgICAgIHRlbXAxID0gIChsZWZ0IC0gcmlnaHQpIC8gMi4wZjsKKyAgICAgICAgKmRzdFMgPSAoTFZNX0ZMT0FUKXRlbXAxOworICAgICAgICBkc3RTKys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKaW5kZXggOGJiMjkyZi4uYWMxZWVhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKQEAgLTQ2LDUgKzQ2LDI3IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIFRlbXA7CiAKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoKnNyYyk7CisgICAgICAgIHNyYysrOworCisgICAgICAgIFRlbXAgKz0gKCpzcmMpOworICAgICAgICBzcmMrKzsKKworICAgICAgICAqZHN0ID0gVGVtcCAvIDIuMGY7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYwppbmRleCA5YjkzOGJkLi5lYmM0NzdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKQEAgLTQ5LDYgKzQ5LDMxIEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgSm9pblRvMmlfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjTCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgIG4gKQoreworICAgIExWTV9JTlQxNiBpaTsKIAorICAgIHNyY0wgKz0gbiAtIDE7CisgICAgc3JjUiArPSBuIC0gMTsKKyAgICBkc3QgICs9ICgoMiAqIG4pIC0gMSk7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSAqc3JjUjsKKyAgICAgICAgZHN0LS07CisgICAgICAgIHNyY1ItLTsKKworICAgICAgICAqZHN0ID0gKnNyY0w7CisgICAgICAgIGRzdC0tOworICAgICAgICBzcmNMLS07CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jCmluZGV4IDNkMzliOTMuLmViNTc1NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKQEAgLTI3LDcgKzI3LDM5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKQoreworICAgIExWTV9GTE9BVCAgVGVtcDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKXBJbnN0YW5jZTEtPkN1cnJlbnQpOworICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOwogCisgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpcEluc3RhbmNlMi0+Q3VycmVudCk7CisgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgfQorCisKK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCkBAIC02Niw0ICs5OCw1IEBACiAKIAogfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYwppbmRleCAyZGFmNzRhLi5lYzBiYWFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jCkBAIC0yNCw3ICsyNCwzNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhIQVJEXzJTVF9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUICBUZW1wOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQyOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOwogCisKKyAgICBDdXJyZW50MSA9IChwSW5zdGFuY2UxLT5DdXJyZW50KTsKKyAgICBDdXJyZW50MiA9IChwSW5zdGFuY2UyLT5DdXJyZW50KTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcCA9ICgoKExWTV9GTE9BVCkqKHNyYzErKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQxKSkgKworICAgICAgICAgICAgICAgKCgoTFZNX0ZMT0FUKSooc3JjMisrKSAqIChMVk1fRkxPQVQpQ3VycmVudDIpKTsKKyAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYzEsCkBAIC01NCw2ICs4NCw1IEBACiAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0lOVDE2KVRlbXA7CiAgICAgfQogfQotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCBjYWEwOTUxLi5kMjY5NGNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKQEAgLTI1LDcgKzI1LDk2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CiAKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaSxqajsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTFZNX0ZMT0FUICAgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgTFZNX0ZMT0FUICAgVGVtcDsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBpZihDdXJyZW50IDwgVGFyZ2V0KXsKKyAgICAgICAgaWYgKE91dExvb3ApeworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMCA7IGpqLS0peworICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSA0OyBqaiAhPSAwIDsgamotLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnQ7Cit9CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LApAQCAtMTIzLDYgKzIxMiw1IEBACiAgICAgfQogICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OwogfQotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMKaW5kZXggMDllYzQyNy4uNjU2YTExNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYwpAQCAtMjYsNyArMjYsMTI3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3N0YXRpYyBMVk1fRkxPQVQgQUREMl9TQVRfRkxPQVQoTFZNX0ZMT0FUIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgYykKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICB0ZW1wID0gYSArIGIgOworICAgIGlmICh0ZW1wIDwgLTEuMGYpCisgICAgICAgIGMgPSAtMS4wZjsKKyAgICBlbHNlIGlmICh0ZW1wID4gMS4wZikKKyAgICAgICAgYyA9IDEuMGY7CisgICAgZWxzZQorICAgICAgICBjID0gdGVtcDsKKyAgICByZXR1cm4gYzsKK30KK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKQoreworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlTCA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlUiA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOwogCisgICAgTFZNX0ZMT0FUICAgRGVsdGFMID0gcEluc3RhbmNlTC0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudEwgPSBwSW5zdGFuY2VMLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldEwgPSBwSW5zdGFuY2VMLT5UYXJnZXQ7CisKKyAgICBMVk1fRkxPQVQgICBEZWx0YVIgPSBwSW5zdGFuY2VSLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50UiA9IHBJbnN0YW5jZVItPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0UiA9IHBJbnN0YW5jZVItPlRhcmdldDsKKworICAgIExWTV9GTE9BVCAgIFRlbXAgPSAwOworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIGlmIChPdXRMb29wKQorICAgIHsKKyAgICAgICAgaWYoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50TCwgRGVsdGFMLCBUZW1wKTsKKyAgICAgICAgICAgIEN1cnJlbnRMID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA+IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudEwgLT0gRGVsdGFMOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKworICAgICAgICBpZihDdXJyZW50UiA8IFRhcmdldFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRSLCBEZWx0YVIsIFRlbXApOworICAgICAgICAgICAgQ3VycmVudFIgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50UiAtPSBEZWx0YVI7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKQorICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wICogMjsgaWkgIT0gMDsgaWkgLT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGlpID0gSW5Mb29wICogMjsgaWkgIT0gMDsgaWktPTIpCisgICAgeworICAgICAgICBpZihDdXJyZW50TCA8IFRhcmdldEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRMLCBEZWx0YUwsIFRlbXApOworICAgICAgICAgICAgQ3VycmVudEwgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudFIsIERlbHRhUiwgVGVtcCk7CisgICAgICAgICAgICBDdXJyZW50UiA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPiBUYXJnZXRSKQorICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRSIC09IERlbHRhUjsKKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA8IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKKyAgICB9CisgICAgcEluc3RhbmNlTC0+Q3VycmVudCA9IEN1cnJlbnRMOworICAgIHBJbnN0YW5jZVItPkN1cnJlbnQgPSBDdXJyZW50UjsKKworfQorI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnNyYywKQEAgLTE0MCw0ICsyNjAsNSBAQAogICAgIHBJbnN0YW5jZVItPkN1cnJlbnQ9Q3VycmVudFI7CiAKIH0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKaW5kZXggZjFhOWNhMy4uYjVlN2Y1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwpAQCAtMjYsNyArMjYsODYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTFZNX0ZMT0FUICAgRGVsdGE9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0PSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9GTE9BVCAgIFRlbXA7CiAKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgaWYoQ3VycmVudDxUYXJnZXQpeworICAgICAgICBpZiAoT3V0TG9vcCl7CisKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOworCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworCisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworCisgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOworCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgaWYgKE91dExvb3ApeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICB9CisgICAgfQorICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OworfQorI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LApAQCAtMTAxLDYgKzE4MCw1IEBACiAgICAgfQogICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OwogfQotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jCmluZGV4IDAwNTJkZDcuLjE5MmYxMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jCkBAIC0zMyw3ICszMyw4MCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWElOU09GVF9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKIAorICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZil7CisgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQoc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIG4pOworICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KXsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKXsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisjZWxzZQogdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LApAQCAtMTA4LDUgKzE4MSw1IEBACiAgICAgfQogCiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYwppbmRleCBmNDQzYzhmLi5iZDVhOTI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKQEAgLTMzLDcgKzMzLDEzOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKIAorICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fCAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQorICAgIHsKKyAgICAgICAgaWYocEluc3RhbmNlMS0+RGVsdGEgPT0gMS4wZikKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYoSGFyZE1peGluZyA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwSW5zdGFuY2UyLT5EZWx0YSA9PSAxLjBmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CisgICAgICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIFRhcmdldEdhaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoSGFyZE1peGluZyA9PSBGQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKQorICAgIHsKKyAgICAgICAgaWYgKChwSW5zdGFuY2UxLT5UYXJnZXQgPT0gMS4wZikgJiYgKHBJbnN0YW5jZTItPlRhcmdldCA9PSAxLjBmKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc3JjICE9IGRzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkKKyAgICB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTEtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0KQorICAgIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKmRzdCwKQEAgLTE0OCw1ICsyNzksNSBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKaW5kZXggYzhkY2FkNy4uMTAxN2RlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCkBAIC0zMyw3ICszMyw3NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWTWl4ZXIzX01JWFNPRlRfMVNUX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZil7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID09IDApCisgICAgICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMC4wLCBkc3QsIG4pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpICE9IDEuMGYpCisgICAgICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBuKTsKKyAgICAgICAgICAgIGVsc2UgaWYoc3JjICE9IGRzdCkKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KXsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKXsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCkBAIC0xMDcsNSArMTc3LDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmLypCVUlMRF9GTE9BVCovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCmluZGV4IDcyNDA3MDUuLjNjOTAwNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwpAQCAtMjUsNyArMjUsNDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKK3sKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKXsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2UgaWYgKChwSW5zdGFuY2UyLT5DdXJyZW50ID09IHBJbnN0YW5jZTItPlRhcmdldCkgJiYgKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gMCkpeworICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgZHN0LCBuKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQorICAgIHsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgZHN0LCBuKTsKKyAgICAgICAgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICBIQVJEIE1JWElORworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBzcmMyLCBkc3QsIG4pOworICAgIH0KK30KKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMTYgICAgICAgKnNyYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAqc3JjMiwKQEAgLTY2LDUgKzEwOCw1IEBACiAgICAgICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCBzcmMxLCBzcmMyLCBkc3QsIG4pOwogICAgIH0KIH0KLQorI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oCmluZGV4IDk4MGM3ODMuLmY5MDQ5MTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oCkBAIC0zMSw2ICszMSwxOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIExWTWl4ZXIzX3N0IHN0cnVjdHVyZSBzdG9yZXMgSW5zdGFuY2UgcGFyYW1ldGVycyBmb3Igb25lIGF1ZGlvIHN0cmVhbSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgICAgICBQcml2YXRlUGFyYW1zWzNdOyAgIC8qIFByaXZhdGUgSW5zdGFuY2UgcGFyYW1zIGZvciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW8gU3RyZWFtIHNoaWZ0IHBhcmFtZXRlciAqLworICAgIExWTV9JTlQxNiAgICAgICBDYWxsYmFja1NldDsgICAgICAgIC8qIEJvb2xlYW4uICBTaG91bGQgYmUgc2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggdGltZSB0aGUgdGFyZ2V0IHZhbHVlIGlzIHVwZGF0ZWQgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tQYXJhbTsgICAgICAvKiBQYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNhbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAgICAgKnBDYWxsYmFja0hhbmRsZTsgICAvKiBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZTsgICAvKiBQb2ludGVyIGZvciBnZW5lcmFsIHB1cnBvc2UgdXNhZ2UgKi8KKyAgICBMVk1fQ2FsbGJhY2sgICAgcENhbGxCYWNrOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworfSBMVk1peGVyM19GTE9BVF9zdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiAgICAgICBQcml2YXRlUGFyYW1zWzRdOyAgIC8qIFByaXZhdGUgSW5zdGFuY2UgcGFyYW1zIGZvciBBdWRpbyBTdHJlYW0gKi8KQEAgLTQwLDIyICs1MywzNSBAQAogICAgIHZvaWQgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLwogICAgIExWTV9DYWxsYmFjayAgICBwQ2FsbEJhY2s7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCiB9IExWTWl4ZXIzX3N0OwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgTWl4ZXJTdHJlYW1bMV07ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3Igb25lIEF1ZGlvIFN0cmVhbSAqLworfSBMVk1peGVyM18xU3RfRkxPQVRfc3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1peGVyM19zdCAgICAgTWl4ZXJTdHJlYW1bMV07ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3Igb25lIEF1ZGlvIFN0cmVhbSAqLwogfSBMVk1peGVyM18xU3Rfc3Q7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICBNaXhlclN0cmVhbVsyXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciB0d28gQXVkaW8gU3RyZWFtcyAqLworfSBMVk1peGVyM18yU3RfRkxPQVRfc3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1peGVyM19zdCAgICAgTWl4ZXJTdHJlYW1bMl07ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdHdvIEF1ZGlvIFN0cmVhbXMgKi8KIH0gTFZNaXhlcjNfMlN0X3N0OwotCisjZW5kaWYKKyNpZm5kZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzNdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHRocmVlIEF1ZGlvIFN0cmVhbXMgKi8KIH0gTFZNaXhlcjNfM1N0X3N0OwotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTIChISUdIIExFVkVMIEZVTkNUSU9OUykKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzUsNTcgKzEwMSwxMTUgQEAKIC8qIHRoZW4gdGhlIGNhbGN1bGF0aW9uIHdpbGwgZ2l2ZSBhbiBpbmNvcnJlY3QgdmFsdWUgZm9yIGFscGhhLCBzZWUgdGhlIG1peGVyICAgICAqLwogLyogZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICBUYXJnZXRHYWluKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRhcmdldEdhaW4pOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKTsKKyNlbHNlCiBMVk1fSU5UMzIgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRDdXJyZW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSk7CisjZWxzZQogTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRDdXJyZW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSk7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgVGFyZ2V0R2FpbiwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgQ3VycmVudEdhaW4pOworI2Vsc2UKIHZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRhcmdldEdhaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgQ3VycmVudEdhaW4pOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKTsKKyNlbmRpZgogCiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pOwotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBNaXhlclN0cmVhbVswXSBhcHBsaWVzIHRvIExlZnQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE1peGVyU3RyZWFtWzFdIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOyAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCisjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwotCi0KKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jCmluZGV4IGI1YWUyNjQuLjU5OTA0MTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYwpAQCAtMzEsNyArMzEsMTUgQEAKIC8qICBDdXJyZW50R2FpbiAgICAgIC0gQ3VycmVudEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKQoreworICAgIExWTV9GTE9BVCAgICAgICBDdXJyZW50R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgQ3VycmVudEdhaW4gPSBwSW5zdGFuY2UtPkN1cnJlbnQ7ICAvLyBDdXJyZW50R2FpbgorICAgIHJldHVybiBDdXJyZW50R2FpbjsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKQogewogICAgIExWTV9JTlQzMiAgICAgICBDdXJyZW50R2FpbjsKQEAgLTM5LDMgKzQ3LDQgQEAKICAgICBDdXJyZW50R2Fpbj1wSW5zdGFuY2UtPkN1cnJlbnQ+PigxNi1wSW5zdGFuY2UtPlNoaWZ0KTsgIC8vIEN1cnJlbnRHYWluIGluIFExNi4xNSBmb3JtYXQKICAgICByZXR1cm4gQ3VycmVudEdhaW47CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYwppbmRleCBkYzJmOGU5Li5jNjc0NTVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCkBAIC0zMCw3ICszMCwxNiBAQAogLyogIFRhcmdldEdhaW4gICAgICAtIFRhcmdldEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSkKK3sKKyAgICBMVk1fRkxPQVQgICAgICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgCisgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgLy8gVGFyZ2V0R2FpbgorICAgIHJldHVybiBUYXJnZXRHYWluOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCBMVk1peGVyM19zdCAqcFN0cmVhbSkKIHsKICAgICBMVk1fSU5UMzIgICAgICAgVGFyZ2V0R2FpbjsKQEAgLTQwLDMgKzQ5LDQgQEAKIAogICAgIHJldHVybiBUYXJnZXRHYWluOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYwppbmRleCA0NDllN2IxLi43MzdlMjZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKQEAgLTQ0LDcgKzQ0LDE5IEBACiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIFRhcmdldEdhaW4sCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnRHYWluKQoreworICAgIExWTV9GTE9BVCBNYXhHYWluID0gVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBpZihDdXJyZW50R2FpbiA+IE1heEdhaW4pCisgICAgICAgIE1heEdhaW4gPSBDdXJyZW50R2FpbjsKKyAgICBwSW5zdGFuY2UtPlRhcmdldCA9IFRhcmdldEdhaW47ICAgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBUYXJnZXQKKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50R2FpbjsgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50Cit9CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2FpbiwKICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBDdXJyZW50R2FpbikKQEAgLTY0LDQgKzc2LDQgQEAKICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudEdhaW48PCgxNi1TaGlmdCk7IC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gQ3VycmVudAogICAgIHBJbnN0YW5jZS0+U2hpZnQ9U2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFNoaWZ0CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKaW5kZXggMjk0ZTA1Yy4uZDBkMGUxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCkBAIC0yNiw2ICsyNiwxNSBAQAogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAogLyogSW5zdGFuY2UgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEdlbmVyYWwgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldDsgICAgICAgICAgIC8qbnVtYmVyIHNwZWNpZnlpbmcgdmFsdWUgb2YgVGFyZ2V0IEdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQ7ICAgICAgICAgIC8qbnVtYmVyIHNwZWNpZnlpbmcgdmFsdWUgb2YgQ3VycmVudCBHYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBEZWx0YTsgICAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIERlbHRhIEdhaW4gKi8KK30gTWl4X1ByaXZhdGVfRkxPQVRfc3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAvKiBHZW5lcmFsICovCkBAIC0zNCw4ICs0Myw3IEBACiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICBTaGlmdDsgICAgICAgICAgICAgICAgICAvKiBMZWZ0IFNoaWZ0IGZvciBJbnRlZ2VyIHBhcnQgb2YgR2FpbiAqLwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgRGVsdGE7ICAgICAgICAgICAgICAgICAgLyogMzIgYml0IG51bWJlciBzcGVjaWZ5aW5nIHRoZSBmcmFjdGlvbmFsIHZhbHVlIG9mIERlbHRhIEdhaW4gKi8KIH0gTWl4X1ByaXZhdGVfc3Q7Ci0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBERUZJTklUSU9OUwpAQCAtNDksMjMgKzU3LDQzIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAqcEluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICAqcEluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgICpwSW5zdGFuY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03MywxMiArMTAxLDE5IEBACiAvKiBwdHJJbnN0YW5jZTIgYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pOyAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGb3IgYXBwbHlpbmcgZGlmZmVyZW50IGdhaW5zIHRvIExlZnQgYW5kIHJpZ2h0IGNoZW5uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTg2LDE2ICsxMjEsMjIgQEAKIC8qIHB0ckluc3RhbmNlMiBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICpkc3QsICAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsgICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KLQotCisjZW5kaWYKIAogLyoqKiAzMiBiaXQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCkBAIC0xMTIsNyArMTUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZW5kaWYgLy8jaWZuZGVmIF9fTFZDX01JWEVSX1BSSVZBVEVfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmMKaW5kZXggNWVmYTUwMS4uNTc3MTc5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYwpAQCAtNDMsNyArNDMsMTQgQEAKIC8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgVGFyZ2V0R2FpbikKK3sKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBwSW5zdGFuY2UtPlRhcmdldCA9IFRhcmdldEdhaW47ICAgICAgICAgICAgICAgLy8gVXBkYXRlIGdhaW4gVGFyZ2V0Cit9CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluKQogewpAQCAtNjQsMyArNzEsNCBAQAogICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50R2Fpbjw8KDE2LVNoaWZ0KTsgICAgICAgICAgICAgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50CiAgICAgcEluc3RhbmNlLT5TaGlmdD1TaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgU2hpZnQKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCmluZGV4IDRjMWM4YjIuLjQ4ZjVkNTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKQEAgLTQ0LDcgKzQ0LDUxIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudChMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKK3sKKyNpZmRlZiBISUdIRVJfRlMKKyAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzExXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MTQwNmYsLyoyMjA1MCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY3ZiwvKjk2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMDgzM2Z9Oy8qMTkyMDAwKi8KKyNlbHNlCisgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVs5XSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwvKjIyMDUwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTY2NjY2ZiwvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDgzMzMzZn07Lyo0ODAwMCovCisjZW5kaWYKIAorICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIExWTV9GTE9BVCBEZWx0YSA9IERlbHRhVGFibGVbRnNdOworICAgIERlbHRhID0gRGVsdGEgLyAoTnVtQ2hhbm5lbHMpOworCisgICAgaWYoVGNfbWlsbGlzZWMgPT0gMCkKKyAgICAgICAgRGVsdGEgPSAxLjAwMDAwMGY7CisgICAgZWxzZQorICAgICAgICBEZWx0YSA9IERlbHRhIC8gVGNfbWlsbGlzZWM7CisKKyAgICBpZihEZWx0YSA9PSAwKQorICAgICAgICBEZWx0YSA9IDAuMDAwMDAwMDAwNWY7ICAvKiBJZiBUaW1lIENvbnN0YW50IGlzIHNvIGxhcmdlIHRoYXQgRGVsdGEgaXMgMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhICovCisgICAgcEluc3RhbmNlLT5EZWx0YSA9IERlbHRhOyAgLy8gRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykKK30KKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLApAQCAtNzMsMyArMTE3LDQgQEAKIAogICAgIHBJbnN0YW5jZS0+RGVsdGE9RGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKSBpbiBRIDAuMzEgZm9ybWF0CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYwppbmRleCA4ZDUzMDRlLi45ZGM3ZDIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCkBAIC00NSw3ICs0NSw3MiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQoreworI2lmZGVmIEhJR0hFUl9GUworICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzExXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY2ZiwvKjk2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCisjZWxzZQorICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbOV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MTQwNmYsLyoyMjA1MCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2Z9Oy8qNDgwMDAqLworI2VuZGlmCisgICAgTFZNX0ZMT0FUIFRjX21pbGxpc2VjX2Zsb2F0OworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIExWTV9GTE9BVCBEZWx0YSA9IERlbHRhVGFibGVbRnNdOwogCisgICAgTFZNX0ZMT0FUICAgQ3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQ7CisKKyAgICBEZWx0YT1EZWx0YSAvIChOdW1DaGFubmVscyk7CisKKyAgICAvKiAgR2V0IGdhaW4gdmFsdWVzICAqLworICAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisKKyAgICBpZiAoQ3VycmVudCAhPSBUYXJnZXQpCisgICAgeworICAgICAgICBUY19taWxsaXNlY19mbG9hdCA9IChMVk1fRkxPQVQpKFRjX21pbGxpc2VjKSAvIChDdXJyZW50IC0gVGFyZ2V0KTsKKyAgICAgICAgaWYgKFRjX21pbGxpc2VjX2Zsb2F0IDwgMCkKKyAgICAgICAgICAgIFRjX21pbGxpc2VjX2Zsb2F0ID0gLVRjX21pbGxpc2VjX2Zsb2F0OworCisgICAgICAgIGlmKFRjX21pbGxpc2VjID09IDApCisgICAgICAgICAgICBEZWx0YSA9IDEuMDAwMDAwZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRGVsdGEgPSBEZWx0YSAvIFRjX21pbGxpc2VjX2Zsb2F0OworCisgICAgICAgIGlmKERlbHRhID09IDApCisgICAgICAgICAgICBEZWx0YSA9IDAuMDAwMDAwMDAwNWY7IC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIE1pbmltdW0gdmFsdWUgZm9yIHByb3BlciBjYWxsLWJhY2tzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHRpbmcgaXQgdG8gemVybyBoYXMgc29tZSBwcm9ibGVtcywgdG8gYmUgY29ycmVjdGVkKSAqLworICAgIH0KKworICAgIHBJbnN0YW5jZS0+RGVsdGEgPSBEZWx0YTsgICAgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpCit9CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCkBAIC05MywzICsxNTgsNCBAQAogCiAgICAgcEluc3RhbmNlLT5EZWx0YT1EZWx0YTsgICAgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpIGluIFEgMC4zMSBmb3JtYXQKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0hQRi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0hQRi5jCmluZGV4IDZkOGZlNDYuLjkwOTQ2MjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMKQEAgLTUzLDcgKzUzLDcgQEAKIC8qICAgQTkgICAgICAgICAgICAgMTk0NjY5NTc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIEExMCAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsg77+9Li4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02OCw3ICs2OCwzNiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZNX0ZPX0hQRiggICBMVk1fRkxPQVQgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZzKQoreworICAgIExWTV9GTE9BVCBZLENvZWZmaWNpZW50c1sxM10gPSB7LTAuOTk5OTk2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5ODAxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQ5NzgyNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMyMjkzN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xODA4ODBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODc2NThmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDMyMTAyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA4MTYzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTI1MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA4OWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OworICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpOSwgQ29lZmZpY2llbnRzLCB3KTsKIAorICAgIHBDb2VmZnMtPkIxID0gLVk7ICAgICAgICAgLyogU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwPSgxLUIxKS8yPSBCMS8yIC0gMC41Ki8KKyAgICBZID0gWSAvIDIuMGY7ICAgICAgICAgICAgICAgICAvKiBBMD1ZPUIxLzIqLworICAgIFkgPSBZIC0gMC41ZjsgICAgICAgICAvKiBBMD1ZPShCMS8yIC0gMC41KSovCisKKyAgICBwQ29lZmZzLT5BMCA9IFkgKiBGSUxURVJfTE9TU19GTE9BVDsgICAgICAgICAgICAgICAgICAvKiBBcHBseSBsb3NzIHRvIGF2b2lkIG92ZXJmbG93Ki8KKyAgICBwQ29lZmZzLT5BMSA9IC1wQ29lZmZzLT5BMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSBBMT0tQTAqLworCisgICAgcmV0dXJuIDE7Cit9CisjZWxzZQogTFZNX0lOVDMyIExWTV9GT19IUEYoICAgTFZNX0lOVDMyICAgICAgIHcsCiAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpCiB7CkBAIC05Nyw0ICsxMjYsNCBAQAogCiAgICAgcmV0dXJuIDE7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jCmluZGV4IDg2ZWM5NTEuLjlmZTY3ZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMKQEAgLTUzLDcgKzUzLDcgQEAKIC8qICAgQTkgICAgICAgICAgICAgMTk0NjY5NTc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIEExMCAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsg77+9Li4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02OCw3ICs2OCwzMyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZNX0ZPX0xQRiggICBMVk1fRkxPQVQgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZzKQoreworICAgIExWTV9GTE9BVCBZLENvZWZmaWNpZW50c1sxM10gPSB7LTAuOTk5OTk2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5ODAxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQ5NzgyNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMyMjkzN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xODA4ODBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODc2NThmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDMyMTAyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA4MTYzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTI1MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA4OWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfTsKKyAgICBZPUxWTV9Qb2x5bm9taWFsKChMVk1fVUlOVDE2KTksIENvZWZmaWNpZW50cywgdyk7CisgICAgcENvZWZmcy0+QjEgPSAtWTsgICAgIC8vIFN0b3JlIC1CMSBpbiBmaWx0ZXIgc3RydWN0dXJlIGluc3RlYWQgb2YgQjEhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBMD0oMStCMSkvMj0gQjEvMiArIDAuNQorICAgIFkgPSBZIC8gMi4wZjsgICAgICAgICAgICAgLy8gQTA9WT1CMS8yCisgICAgWSA9IFkgKyAwLjVmOyAgICAgLy8gQTA9WT0oQjEvMiArIDAuNSkKIAorICAgIHBDb2VmZnMtPkEwID0gWSAqIEZJTFRFUl9MT1NTX0ZMT0FUOworICAgIHBDb2VmZnMtPkExID0gcENvZWZmcy0+QTA7CisKKyAgICByZXR1cm4gMTsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZNX0ZPX0xQRiggICBMVk1fSU5UMzIgICAgICAgdywKICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAqcENvZWZmcykKIHsKQEAgLTk0LDQgKzEyMCw0IEBACiAgICAgcENvZWZmcy0+QTE9cENvZWZmcy0+QTA7CiAgICAgcmV0dXJuIDE7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYwppbmRleCBmM2I5YjNjLi43ODQ2Y2EwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYwpAQCAtMzIsMTYgKzMyLDQ1IEBACiAjZGVmaW5lIExWVkRMXzJQaUJ5RnNfU0hJRlQxICAgIDEyICAgICAgICAgIC8qIFFmb3JtYXQgc2hpZnQgZm9yIDhrSHosIDExLjAyNWtIeiBhbmQgMTJrSHogaS5lLiAxMj00MS0yOSAqLwogI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMiAgICAxMyAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciAxNmtIeiwgMjIuMDUwa0h6IGFuZCAyNGtIeiBpLmUuIDEzPTQyLTI5ICovCiAjZGVmaW5lIExWVkRMXzJQaUJ5RnNfU0hJRlQzICAgIDE0ICAgICAgICAgIC8qIFFmb3JtYXQgc2hpZnQgZm9yIDMya0h6LCA0NC4xa0h6IGFuZCA0OGtIeiBpLmUuIDE0PTQzLTI5ICovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQzMiAgICAgTFZWRExfMlBpT25Gc1RhYmxlW10gPSAge0xWVkRMXzJQaUJ5XzgwMDAgLCAvKiA4a0h6IGluIFE0MSwgMTZrSHogaW4gUTQyLCAzMmtIeiBpbiBRNDMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTEwMjUsICAvKiAxMTAyNSBIeiBpbiBRNDEsIDIyMDUwSHogaW4gUTQyLCA0NDEwMCBIeiBpbiBRNDMqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMjAwMH07IC8qIDEya0h6IGluIFE0MSwgMjRrSHogaW4gUTQyLCA0OGtIeiBpbiBRNDMgKi8KLQorI2VuZGlmCiAKIGNvbnN0IExWTV9JTlQzMiAgICAgTFZWRExfMlBpT25Gc1NoaWZ0VGFibGVbXT17TFZWRExfMlBpQnlGc19TSElGVDEgLCAgICAgICAgIC8qIDhrSHosIDExMDI1SHosIDEya0h6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5RnNfU0hJRlQyLCAgICAgICAgICAvKiAxNmtIeiwgMjIwNTBIeiwgMjRrSHoqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeUZzX1NISUZUM307ICAgICAgICAgLyogMzJrSHosIDQ0MTAwSHosIDQ4a0h6ICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTFZWRExfMlBpQnlfODAwMF9mICAgICAgICAwLjAwMDc4NTM5OGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTEwMjVfZiAgICAgICAwLjAwMDU2OTkwM2YKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTIwMDBfZiAgICAgICAwLjAwMDUyMzU5OWYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTYwMDBfZiAgICAgICAwLjAwMDM5MjcwMGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMjIwNTBfZiAgICAgICAwLjAwMDI4NDk1MmYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMjQwMDBfZiAgICAgICAwLjAwMDI2MTgwMGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMzIwMDBfZiAgICAgICAwLjAwMDE5NjM1MGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfNDQxMDBfZiAgICAgICAwLjAwMDE0MjQ3NmYKKyNkZWZpbmUgTFZWRExfMlBpQnlfNDgwMDBfZiAgICAgICAwLjAwMDEzMDkwMGYKIAorI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVlZETF8yUGlCeV85NjAwMF9mICAgICAgIDAuMDAwMDY1NDUwZgorI2RlZmluZSBMVlZETF8yUGlCeV8xOTIwMDBfZiAgICAgIDAuMDAwMDMyNzI1ZgorI2VuZGlmCitjb25zdCBMVk1fRkxPQVQgICAgIExWVkRMXzJQaU9uRnNUYWJsZVtdID0gIHtMVlZETF8yUGlCeV84MDAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMTAyNV9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTIwMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzE2MDAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8yMjA1MF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMjQwMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzMyMDAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV80NDEwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfNDgwMDBfZgorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZWRExfMlBpQnlfOTYwMDBfZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZWRExfMlBpQnlfMTkyMDAwX2YKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBMVk1fR2V0T21lZ2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU5LDcgKzg4LDIwIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB3PTIqcGkqRmMvRnMgaW4gUTIuMjkgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2lmZGVmIEhJR0hFUl9GUworTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgRmMsCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKKyNlbHNlCitMVk1fRkxPQVQgTFZNX0dldE9tZWdhKExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBGYywKKyAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIEZzKQorI2VuZGlmCit7CisgICAgTFZNX0ZMT0FUICAgdzsKKyAgICB3ID0gKExWTV9GTE9BVClGYyAqIExWVkRMXzJQaU9uRnNUYWJsZVtGc107CisgICAgcmV0dXJuIHc7Cit9CisjZWxzZQogTFZNX0lOVDMyIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRmMsCiAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKIHsKQEAgLTY3LDQgKzEwOSw0IEBACiAgICAgTVVMMzJ4MzJJTlRPMzIoKExWTV9JTlQzMilGYyxMVlZETF8yUGlPbkZzVGFibGVbRnMlM10sdyxMVlZETF8yUGlPbkZzU2hpZnRUYWJsZVtGcy8zXSkKICAgICByZXR1cm4gdzsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgKaW5kZXggNjg0NmQ0OS4uZjFlNDVmYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaApAQCAtODcsNSArODcsNTggQEAKICNkZWZpbmUgQUxQSEFfNDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCiAjZGVmaW5lIEFMUEhBXzUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQgLyogQlVJTERfRkxPQVQgKi8KKyNkZWZpbmUgQUxQSEFfRmxvYXRfMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OThmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMyAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzUgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5MmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTg5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF83ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5ODVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzggICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk3OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfOSAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTcwZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xMCAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5NTdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzExICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTkzOWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTE0ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xMyAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4NzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE0ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgyOWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTUgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5NzU4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNiAgICAgICAgICAgICAgICAgICAgICAgMC45OTk2NThmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE3ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTUxNmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTggICAgICAgICAgICAgICAgICAgICAgIDAuOTk5MzE2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xOSAgICAgICAgICAgICAgICAgICAgICAgMC45OTkwMzNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIwICAgICAgICAgICAgICAgICAgICAgICAwLjk5ODYzM2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjEgICAgICAgICAgICAgICAgICAgICAgIDAuOTk4MDY3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTcyNjhmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIzICAgICAgICAgICAgICAgICAgICAgICAwLjk5NjEzOWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjQgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0NTQ1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNSAgICAgICAgICAgICAgICAgICAgICAgMC45OTIyOTVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI2ICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTEyM2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjcgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NjU0ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yOCAgICAgICAgICAgICAgICAgICAgICAgMC45NzgzNzBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI5ICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTU1M2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3MjIxZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMSAgICAgICAgICAgICAgICAgICAgICAgMC45NDAwNTFmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMyICAgICAgICAgICAgICAgICAgICAgICAwLjkxNjI5N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzMgICAgICAgICAgICAgICAgICAgICAgIDAuODgzNzI5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zNCAgICAgICAgICAgICAgICAgICAgICAgMC44Mzk2NDVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM1ICAgICAgICAgICAgICAgICAgICAgICAwLjc4MTAzNmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzYgICAgICAgICAgICAgICAgICAgICAgIDAuNzA1MDc4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zNyAgICAgICAgICAgICAgICAgICAgICAgMC42MTAxMDhmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM4ICAgICAgICAgICAgICAgICAgICAgICAwLjQ5NzIzOWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzkgICAgICAgICAgICAgICAgICAgICAgIDAuMzcyMzQzZgorI2RlZmluZSBBTFBIQV9GbG9hdF80MCAgICAgICAgICAgICAgICAgICAgICAgMC4yNDczNTFmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQxICAgICAgICAgICAgICAgICAgICAgICAwLjEzODcyMmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDIgICAgICAgICAgICAgICAgICAgICAgIDAuMDYxMjM0ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80MyAgICAgICAgICAgICAgICAgICAgICAgMC4wMTkyNjdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ0ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMzc1NmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDUgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzcyZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTRmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ3ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDggICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBBTFBIQV9GbG9hdF80OSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzUwICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYwppbmRleCA4MDlkOTA0Li4xOGIyNzgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jCkBAIC01Nyw3ICs1NywxMTAgQEAKIC8qICBBbHBoYSAgIC0gdGhlIGZpbHRlciBjb2VmZmljaWVudCBRMzEgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICBGcywKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIEZzLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKQorewogCisgICAgTFZNX1VJTlQzMiAgUHJvZHVjdDsKKyAgICBMVk1fRkxPQVQgIFByb2R1Y3RGbG9hdDsKKyAgICBMVk1fSU5UMTYgICBJbnRlcnBvbGF0ZVNob3J0OworICAgIExWTV9GTE9BVCAgIEludGVycG9sYXRlOworICAgIExWTV9VSU5UMTYgIFNoaWZ0OworICAgIExWTV9GTE9BVCAgIERpZmY7CisgICAgTFZNX0ZMT0FUICBUYWJsZVtdID0ge0FMUEhBX0Zsb2F0XzAsICAgICAgICAgICAgIC8qIExvZyBzcGFjZWQgbG9vay11cCB0YWJsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF81LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF82LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF83LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF84LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF85LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNTB9OworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBwcm9kdWN0IG9mIHRoZSB0aW1lIGNvbnN0YW50IGFuZCB0aGUgc2FtcGxlIHJhdGUgKi8KKyAgICBQcm9kdWN0ID0gKCh0YyA+PiAxNikgKiAoTFZNX1VJTlQzMilGcykgPDwgMTM7ICAvKiBTdGVyZW8gdmFsdWUgKi8KKyAgICBQcm9kdWN0ID0gUHJvZHVjdCArICgoKHRjICYgMHgwMDAwRkZGRikgKiAoTFZNX1VJTlQzMilGcykgPj4gMyk7CisKKyAgICBpZiAoTnVtQ2hhbm5lbHMgPT0gMSkKKyAgICB7CisgICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0ID4+IDE7ICAgLyogTW9ubyB2YWx1ZSAqLworICAgIH0KKworICAgIC8qIE5vcm1hbGl6ZSB0byBnZXQgdGhlIHRhYmxlIGluZGV4IGFuZCBpbnRlcnBvbGF0aW9uIGZhY3RvciAqLworICAgIGZvciAoU2hpZnQgPSAwOyBTaGlmdCA8ICgoQWxwaGFfVGFibGVTaXplIC0gMSkgLyAyKTsgU2hpZnQrKykKKyAgICB7CisgICAgICAgIGlmICgoUHJvZHVjdCAmIDB4ODAwMDAwMDApICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgUHJvZHVjdCA9IFByb2R1Y3QgPDwgMTsKKyAgICB9CisgICAgU2hpZnQgPSAoTFZNX1VJTlQxNikoKFNoaWZ0IDw8IDEpKTsKKworICAgIGlmICgoUHJvZHVjdCAmIDB4NDAwMDAwMDApPT0wKQorICAgIHsKKyAgICAgICAgU2hpZnQrKzsKKyAgICB9CisKKyAgICBJbnRlcnBvbGF0ZVNob3J0ID0gKExWTV9JTlQxNikoKFByb2R1Y3QgPj4gMTUpICYgMHgwMDAwN0ZGRik7CisgICAgSW50ZXJwb2xhdGUgPSAoTFZNX0ZMT0FUKUludGVycG9sYXRlU2hvcnQgLyAzMjc2OC4wZjsKKworICAgIERpZmYgPSAoVGFibGVbU2hpZnRdIC0gVGFibGVbU2hpZnQgKyAxXSk7CisgICAgRGlmZiA9IERpZmYgKiBJbnRlcnBvbGF0ZTsKKyAgICBQcm9kdWN0RmxvYXQgPSBUYWJsZVtTaGlmdCArIDFdICsgRGlmZjsKKworICAgIHJldHVybiBQcm9kdWN0RmxvYXQ7Cit9CisjZWxzZQogTFZNX1VJTlQzMiBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKQpAQCAtMTU0LDMgKzI1Nyw0IEBACiAKICAgICByZXR1cm4gUHJvZHVjdDsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMKaW5kZXggYTZkN2RiMi4uY2Q1Nzc2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jCkBAIC0yNSw3ICsyNSw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBwb2x5bm9taWFsIGV4cGFuc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBMVk1fSU5UMzIgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiAgICBOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAqcENvZWZmaWNpZW50cywgICAgICAgICAgICAgICAgICAqLwpAQCAtNDAsNyArNDAsNDggQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIFRoZSByZXN1bHQgb2YgdGhlIHBvbHlub21pYWwgZXhwYW5zaW9uIGluIFExLjMxIGZvcm1hdCAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgKnBDb2VmZmljaWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgIFgpCit7CisgICAgTFZNX0lOVDMyIGk7CisgICAgTFZNX0ZMT0FUIFksQSxYVGVtcCxUZW1wLHNpZ247CiAKKyAgICBZID0gKnBDb2VmZmljaWVudHM7IC8qIFk9QTAqLworICAgIHBDb2VmZmljaWVudHMrKzsKKworICAgIGlmKFggPT0gLTEuMGYpCisgICAgeworICAgICAgICBUZW1wID0gLTE7CisgICAgICAgIHNpZ24gPSBUZW1wOworICAgICAgICBmb3IoaSA9IDE7IGkgPD0gTjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBZICs9ICgoKnBDb2VmZmljaWVudHMpICogc2lnbik7CisgICAgICAgICAgICBwQ29lZmZpY2llbnRzKys7CisgICAgICAgICAgICBzaWduICo9IFRlbXA7CisgICAgICAgIH0KKworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFhUZW1wID0gWDsKKyAgICAgICAgZm9yKGkgPSBOLTE7IGkgPj0gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBBID0gKnBDb2VmZmljaWVudHM7CisgICAgICAgICAgICBwQ29lZmZpY2llbnRzKys7CisKKyAgICAgICAgICAgIFRlbXAgPSBBICogWFRlbXA7CisgICAgICAgICAgICBZICs9IFRlbXA7CisKKyAgICAgICAgICAgIFRlbXAgPSBYVGVtcCAqIFg7CisgICAgICAgICAgICBYVGVtcCA9IFRlbXA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFk7Cit9CisjZWxzZQogTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKnBDb2VmZmljaWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgIFgpCkBAIC05Myw0ICsxMzQsNCBAQAogICAgIH0KICAgICByZXR1cm4gWTsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYwppbmRleCA2Y2ExMDc3Li44Nzg1NTk0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIC8qICAgQTExICAgICAgICAgICAgNTA0NzcyNDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIEExMiAgICAgICAgICAgIC0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsg77+9Li4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NCw3ICs1NCwyOCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgVGhlIHJlc3VsdCBvZiB0aGUgMTB4IGV4cGFuc2lvbiBpbiBROC4yNCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVk1fUG93ZXIxMChMVk1fRkxPQVQgICAgIFgpCit7CisgICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXT17MC45OTk5MDZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzAyNDc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjY1Mjc2NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wMzU0OTRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTY1NjY3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUzNzY3NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMTMxOTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDY5NjAzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxNjU1M2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQzNzNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxODE3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM2N2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNikxMSwKKyAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgIFgpOworICAgIHJldHVybiBZOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fUG93ZXIxMChMVk1fSU5UMzIgICAgIFgpCiB7CiAgICAgTFZNX0lOVDMyIFksQ29lZmZpY2llbnRzWzEzXT17ICAxNjc3NTYzNiwKQEAgLTc1LDQgKzk2LDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFgpOwogICAgIHJldHVybiBZOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMKaW5kZXggMmYxZTU5MS4uOWUxNGMzYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMKQEAgLTI0LDcgKzI0LDIyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTG9hZENvbnN0XzMyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMb2FkQ29uc3RfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICAgdmFsLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKQoreworICAgIExWTV9JTlQxNiBpaTsKIAorICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9IHZhbDsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2Vsc2UKIHZvaWQgTG9hZENvbnN0XzMyKGNvbnN0IExWTV9JTlQzMiAgIHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKQEAgLTM5LDUgKzU0LDYgQEAKIAogICAgIHJldHVybjsKIH0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYwppbmRleCAyNjI5N2U3Li4wMmM5MDZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jCkBAIC03Nyw0ICs3Nyw1OCBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1TVG8yaV9TYXRfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICAqc3JjTSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmNTLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9GTE9BVCB0ZW1wLG1WYWwsc1ZhbDsKKyAgICBMVk1fSU5UMTYgaWk7CisKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgbVZhbCA9IChMVk1fRkxPQVQpKnNyY007CisgICAgICAgIHNyY00rKzsKKworICAgICAgICBzVmFsID0gKExWTV9GTE9BVCkqc3JjUzsKKyAgICAgICAgc3JjUysrOworCisgICAgICAgIHRlbXAgPSBtVmFsICsgc1ZhbDsKKworICAgICAgICBpZiAodGVtcCA+IDEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAxLjBmOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMS4wZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0xLjBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKworICAgICAgICB0ZW1wID0gbVZhbCAtIHNWYWw7CisKKyAgICAgICAgaWYgKHRlbXAgPiAxLjBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMS4wZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtIDEuMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jCmluZGV4IGYyOGYzNjYuLmUzZmI0MGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jCkBAIC02NCw3ICs2NCw0NCBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1hYzNzX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgc3JjdmFsOworICAgIExWTV9GTE9BVCBUZW1wLGRJblZhbDsKIAorICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgc3JjdmFsID0gKnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgVGVtcCA9IHNyY3ZhbCAqIHZhbDsKKworICAgICAgICBkSW5WYWwgID0gKExWTV9GTE9BVCkqZHN0OworICAgICAgICBUZW1wID0gVGVtcCArIGRJblZhbDsKKworICAgICAgICBpZiAoVGVtcCA+IDEuMDAwMDAwZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDEuMDAwMDAwZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMDAwMDAwZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0xLjAwMDAwMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCmluZGV4IDczYzI2ZWQuLjE2ZTM2N2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwpAQCAtMzIsNyArMzIsNzEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhJTlNPRlRfRDMyQzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIG4pCit7CisgICAgY2hhciBIYXJkTWl4aW5nID0gVFJVRTsKIAorICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYocEluc3RhbmNlLT5BbHBoYSA9PSAwKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICB9ZWxzZSBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA8IFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSAmJgorICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVChwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKXsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpCisgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQoc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBJbiBjYXNlIHRoZSBjb3JlIGZ1bmN0aW9uIHdvdWxkIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBDYWxsIGJhY2sgYmVmb3JlIHRoZSBoYXJkIG1peGluZywgYmVjYXVzZSBpbiB0aGlzIGNhc2UsIGhhcmQgbWl4aW5nIG1ha2VzCisgICAgICAgdXNlIG9mIHRoZSBjb3JlIHNvZnQgbWl4IGZ1bmN0aW9uIHdoaWNoIGNhbiBjaGFuZ2UgdGhlIEN1cnJlbnQgdmFsdWUhICAgICAgKi8KKworICAgIGlmIChwSW5zdGFuY2UtPkNhbGxiYWNrU2V0KXsKKyAgICAgICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA8IFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSAmJgorICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBDYWxsQmFjayAhPSAwKXsKKyAgICAgICAgICAgICAgICAoKnBJbnN0YW5jZS0+cENhbGxCYWNrKSAoIHBJbnN0YW5jZS0+cENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCiB2b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKCBNaXhfMVN0X0NsbF90ICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICpkc3QsCkBAIC05MSw1ICsxNTUsNSBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCmluZGV4IGNhODhiMDQuLjg2OTI5M2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKQEAgLTM0LDcgKzM0LDY4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTUlYU09GVF8xU1RfRDMyQzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgfWVsc2UgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA8IFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSAmJgorICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEocEluc3RhbmNlLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKKyAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBkc3QsIG4pOworICAgICAgICBlbHNlIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpeworICAgICAgICAgICAgaWYgKHNyYyAhPSBkc3QpCisgICAgICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilzcmMsIChMVk1fRkxPQVQqKWRzdCwgKExWTV9JTlQxNikobikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE11bHQzc19GbG9hdChzcmMsIHBJbnN0YW5jZS0+Q3VycmVudCwgZHN0LCBuKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwSW5zdGFuY2UtPkNhbGxiYWNrU2V0KXsKKyAgICAgICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA8IFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSAmJgorICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBDYWxsQmFjayAhPSAwKXsKKyAgICAgICAgICAgICAgICAoKnBJbnN0YW5jZS0+cENhbGxCYWNrKSAoIHBJbnN0YW5jZS0+cENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCiB2b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCkBAIC05MSw1ICsxNTIsNSBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jCmluZGV4IDJlMGEwOTkuLjZmYzFiOTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMKQEAgLTI2LDcgKzI2LDQ0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTUlYU09GVF8yU1RfRDMyQzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCggICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKIAorICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudDEgIT0gcEluc3RhbmNlLT5UYXJnZXQxKSB8fCAocEluc3RhbmNlLT5DdXJyZW50MiAhPSBwSW5zdGFuY2UtPlRhcmdldDIpKQorICAgIHsKKyAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgoTWl4XzFTdF9DbGxfRkxPQVRfdCopcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOworICAgICAgICBNaXhJblNvZnRfRDMyQzMxX1NBVCgodm9pZCAqKSZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudDEgPT0gMCkKKyAgICAgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoKHZvaWQgKikgJnBJbnN0YW5jZS0+QWxwaGEyLCAvKiBDYXN0IHRvIHZvaWQ6IG5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CisgICAgICAgIGVsc2UgaWYgKHBJbnN0YW5jZS0+Q3VycmVudDIgPT0gMCkKKyAgICAgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKSBwSW5zdGFuY2UsIHNyYzEsIGRzdCwgbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVChwSW5zdGFuY2UsIHNyYzEsIHNyYzIsIGRzdCwgbik7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCggICAgTWl4XzJTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLApAQCAtNjEsNSArOTgsNiBAQAogICAgICAgICAgICAgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCBwSW5zdGFuY2UsIHNyYzEsIHNyYzIsIGRzdCwgbik7CiAgICAgfQogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmgKaW5kZXggNjA3MDczYy4uMDBkNTVlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaApAQCAtMjYsNiArMjYsMTAgQEAKIAogI2RlZmluZSBQT0lOVF9aRVJPX09ORV9EQiAyNDczODA1IC8qIDAuMDEgZEIgb24gYSBmdWxsIHNjYWxlIHNpZ25hbCA9ICgxMF4oMC4wMS8yMCkgLTEpICogMl4zMSAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgUE9JTlRfWkVST19PTkVfREJfRkxPQVQgMC4wMDExNTIgLyogMC4wMSBkQiBvbiBhIGZ1bGwgc2NhbGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwgPSAoMTBeKDAuMDEvMjApIC0xKSAqIDJeMzEgKi8KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jCmluZGV4IGMwOWVjMGYuLjc5NmExNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYwpAQCAtNDUsNSArNDUsMjYgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNb25vVG8ySV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIHNyYyArPSAobiAtIDEpOworICAgIGRzdCArPSAoKG4gKiAyKSAtIDEpOwogCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgZHN0LS07CisKKyAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgIGRzdC0tOworICAgICAgICBzcmMtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYwppbmRleCBhNWRjNTBmLi5jNzU4NTYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYwpAQCAtNDcsNSArNDcsMjMgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNdWx0M3NfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCisgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9GTE9BVCB0ZW1wOwogCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICB0ZW1wID0gKCpzcmMpICogdmFsOworICAgICAgICBzcmMrKzsKKyAgICAgICAgKmRzdCA9IHRlbXA7CisgICAgICAgIGRzdCsrOworICAgIH0KKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMKaW5kZXggNzMzNDNjZC4uNTE1NmVkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jCkBAIC0xMTQsNCArMTE0LDU0IEBACiAgICAgfQogCiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgICAgICAgIEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgIEJsb2NrTGVuZ3RoKQorewogCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgU2FtcGxlOyAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgc2FtcGxlcyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgIFNhbXBsZU5vOyAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICBUZW1wOworCisKKyAgICAvKgorICAgICAqIFByb2Nlc3MgYSBibG9jayBvZiBzYW1wbGVzCisgICAgICovCisgICAgZm9yKFNhbXBsZU5vID0gMDsgU2FtcGxlTm8gPCBCbG9ja0xlbmd0aDsgU2FtcGxlTm8rKykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJlYWQgdGhlIGlucHV0CisgICAgICAgICAqLworICAgICAgICBTYW1wbGUgPSAqcERhdGFJbjsKKyAgICAgICAgcERhdGFJbisrOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGNvbXBhbmRlciwgdGhpcyBjb21wcmVzc2VzIHRoZSBzaWduYWwgYXQgdGhlIGV4cGVuc2Ugb2YKKyAgICAgICAgICogaGFybW9uaWMgZGlzdG9ydGlvbi4gVGhlIGFtb3VudCBvZiBjb21wcmVzc2lvbiBpcyBjb250cm9sIGJ5IHRoZQorICAgICAgICAgKiBnYWluIGZhY3RvcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKFNhbXBsZSAhPSAtMS4wZikKKyAgICAgICAgeworICAgICAgICAgICAgVGVtcCA9ICgoU2FtcGxlICogU2FtcGxlKSk7CisgICAgICAgICAgICBpZihTYW1wbGUgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNhbXBsZSA9IChTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlIC0gVGVtcCkpICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNhbXBsZSA9IChTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlICsgVGVtcCkpICkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTYXZlIHRoZSBvdXRwdXQKKyAgICAgICAgICovCisgICAgICAgICpwRGF0YU91dCA9IFNhbXBsZTsKKyAgICAgICAgcERhdGFPdXQrKzsKKyAgICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCmluZGV4IGM4YzE1MjcuLjljMTdhMDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYwpAQCAtMzgsNiArMzgsODggQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5bkwseW5SLHluTE8seW5STyx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0Zsb2F0IHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0Zsb2F0KSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5bkw9IChBMCAgKiAoeChuKUwgLSB4KG4tMilMICApICkqLworICAgICAgICAgICAgdGVtcGwgPSAoKnBEYXRhSW4pIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworICAgICAgICAgICAgeW5MID0gdGVtcGwgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApKSAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSAoKC1CMSAqIHkobi0xKUwgICkgKSAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5bkxPPSAoKEdhaW4gKiB5bkwgKSkgKi8KKyAgICAgICAgICAgIHluTE8gPSB5bkwgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5bkxPPSggeW5MTyArIHgobilMICApKi8KKyAgICAgICAgICAgIHluTE8gKz0gKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPSAoQTAgICogKHgobilSICAtIHgobi0yKVIgICkgKSAqLworICAgICAgICAgICAgdGVtcGwgPSAoKihwRGF0YUluICsgMSkpIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworICAgICAgICAgICAgeW5SID0gdGVtcGwgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOworCisgICAgICAgICAgICAvKiB5blIrPSAoKC1CMiAgKiB5KG4tMilSICApICkgICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV07CisgICAgICAgICAgICB5blIgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9ICgoLUIxICAqIHkobi0xKVIgICkgKSAgICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07CisgICAgICAgICAgICB5blIgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUk89ICgoR2FpbiAgKiB5blIgKSkgKi8KKyAgICAgICAgICAgIHluUk8gPSB5blIgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5blJPPSggeW5STyArIHgobilSICApKi8KKyAgICAgICAgICAgIHluUk8gKz0gKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgLyogVXBkYXRlIHkobi0xKUwgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMICovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IHluTE87IC8qIFdyaXRlIExlZnQgb3V0cHV0Ki8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQgPSB5blJPOyAvKiBXcml0ZSBSaWdodCBvdXB1dCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTgsNCArMjAwLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jCmluZGV4IDY3YTU3MGIuLmY3MDVjYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYwpAQCAtMzgsNiArMzgsNyBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBQS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE2LDQgKzExNyw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggMWQ2MTQyYy4uNjU0NzVhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIlBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKIAotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkICBQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MzMl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtMzUsNCArMzUsNCBAQAogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdPXBDb2VmLT5HOwogCiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IGI5ZjY0ZTYuLmEzNjMzMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTE3LDcgKzE3LDIzIEBACiAKICNpbmNsdWRlICJCSVFVQUQuaCIKICNpbmNsdWRlICJQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBQRmlsdGVyX1N0YXRlX0Zsb2F0IHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0Zsb2F0KSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKIAorICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSBwQ29lZi0+QTA7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gcENvZWYtPkIyOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHBDb2VmLT5CMTsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSBwQ29lZi0+RzsKK30KKyNlbHNlCiB2b2lkICBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtMzQsNCArNTAsNCBAQAogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdPXBDb2VmLT5HOwogCiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IGUyMDUwZTAuLjFlMzIwNjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTIxLDYgKzIxLDE2IEBACiAKIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KKworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0Zsb2F0XworeworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0Zsb2F0OworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GbG9hdCAqIFBGaWx0ZXJfU3RhdGVfRmxvYXQgOworI2VuZGlmCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwogewogICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jCmluZGV4IDgzNjMyNzAuLjI4ZmVhNjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYwpAQCAtMjQsNyArMjQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFNoaWZ0X1NhdF92MTZ4djE2CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBTaGlmdF9TYXRfdjE2eHYxNiAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAqZHN0LApAQCAtNzcsNSArNzcsNSBAQAogICAgIH0KICAgICByZXR1cm47CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYwppbmRleCBmYmQxMzJlLi5mYWM5ZGU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMKQEAgLTI0LDcgKzI0LDYyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gU2hpZnRfU2F0X3YzMnh2MzIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIFNoaWZ0X1NhdF9GbG9hdCAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKK3sKKyAgICBMVk1fRkxPQVQgICB0ZW1wOworICAgIExWTV9JTlQzMiAgIGlpLGlqOworICAgIExWTV9JTlQxNiAgIFJTaGlmdDsKIAorICAgIGlmKHZhbCA+IDApCisgICAgeworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA9IChMVk1fRkxPQVQpKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgZm9yKGlqID0gMDsgaWogPCB2YWw7IGlqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgKiAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZih0ZW1wID4gMS4wKQorICAgICAgICAgICAgICAgIHRlbXAgPSAxLjA7CisgICAgICAgICAgICBpZih0ZW1wIDwgLTEuMCkKKyAgICAgICAgICAgICAgICB0ZW1wID0gLTEuMDsKKworICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYodmFsIDwgMCkKKyAgICB7CisgICAgICAgIFJTaGlmdD0oTFZNX0lOVDE2KSgtdmFsKTsKKworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA9IChMVk1fRkxPQVQpKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgZm9yKGlqID0gMDsgaWogPCBSU2hpZnQ7IGlqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgLyAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHNyYyAhPSBkc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKyNlbHNlCiB2b2lkIFNoaWZ0X1NhdF92MzJ4djMyIChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDMyICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICpkc3QsCkBAIC03OSw1ICsxMzQsNSBAQAogICAgIH0KICAgICByZXR1cm47CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuYwppbmRleCBhYzAzNDNmLi45YTcyNmYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMKQEAgLTI5LDYgKzI5LDkgQEAKIC8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwogCiAjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorI2lmZGVmIEJVSUxEX0ZMT0FUCisjaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTY0LDYgKzY3LDE4IEBACiAjZGVmaW5lIFNFQ09ORF9DT0VGICAgICAgMzg4MzYKICNkZWZpbmUgTUFYX1ZBTFVFICAgICAgICAxNTM2ICAgICAgICAgICAgICAgICAgIC8qIDk2ICogMTYgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgICBkQl90b19MaW5GbG9hdChMVk1fSU5UMTYgICAgZGJfZml4KQoreworICAgIExWTV9GTE9BVCAgICBkQl9GbG9hdDsKKyAgICBMVk1fRkxPQVQgICAgTGluRmxvYXQ7CisKKyAgICBkQl9GbG9hdCA9IChMVk1fRkxPQVQpKChMVk1fRkxPQVQpZGJfZml4IC8gMTYuMGYpOworICAgIExpbkZsb2F0ID0gcG93KDEwLCBkQl9GbG9hdCAvIDIwLjApOworCisgICAgcmV0dXJuIExpbkZsb2F0OworfQorI2Vsc2UKIExWTV9JTlQzMiAgIGRCX3RvX0xpbjMyKExWTV9JTlQxNiAgICBkYl9maXgpCiB7CiAgICAgTFZNX0lOVDMyIExpbl92YWxfMzI7CkBAIC0xMDYsNCArMTIxLDQgQEAKIAogICAgIHJldHVybiBMaW5fdmFsXzMyOyAgLyogZm9ybWF0IDEuMTYuMTUgKi8KIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAppbmRleCBkYjZhYWJlLi44ZTBiNzM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKQEAgLTIwMCw2ICsyMDAsMTAgQEAKICNkZWZpbmUgTFZFUU5CX0NBUF9GU18zMjAwMCAgICAgICAgICAgICAgICA2NAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ0MTAwICAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgIDI1NgorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgIDUxMgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgIDEwMjQKKyNlbmRpZgogCiB0eXBlZGVmIGVudW0KIHsKQEAgLTIxMiw2ICsyMTYsMTAgQEAKICAgICBMVkVRTkJfRlNfMzIwMDAgPSA2LAogICAgIExWRVFOQl9GU180NDEwMCA9IDcsCiAgICAgTFZFUU5CX0ZTXzQ4MDAwID0gOCwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICBMVkVRTkJfRlNfOTYwMDAgPSA5LAorICAgIExWRVFOQl9GU18xOTIwMDAgPSAxMCwKKyNlbmRpZgogICAgIExWRVFOQl9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX0ZzX2VuOwogCkBAIC0yNjgsNiArMjc2LDcgQEAKIHsKICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsKKwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBTb3VyY2VGb3JtYXQ7CiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsKICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4QmFuZHM7CkBAIC00NjAsMTEgKzQ2OSwxNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZWxzZQogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbmRpZgogCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMKaW5kZXggZmRkZWRiOS4uZmY1MmI3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jCkBAIC0yMiw3ICsyMiw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2luY2x1ZGUgPG1hdGguaD4KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzcsNiArNzksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfRG91YmxlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cykKQEAgLTE2OCw3ICsxNzEsNyBAQAogICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CiAKIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMDUsNyArMjA4LDY3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgKnBDb2VmZmljaWVudHMpCit7CiAKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWRVFOQl9HYWluVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZFUU5CX0RUYWJsZVtdOworCisKKyAgICAvKgorICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgIEdhaW4gICAgICAgID0gcEZpbHRlckRlZmluaXRpb24tPkdhaW47CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBGcmVxdWVuY3kgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5GcmVxdWVuY3k7CisgICAgLyogQXMgbWVudGlvbmVkIGluIGVmZmVjdGJ1bmRsZS5oICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICBRRmFjdG9yICAgICA9IChMVk1fRkxPQVQpcEZpbHRlckRlZmluaXRpb24tPlFGYWN0b3IgLyAxMDAuMGY7CisKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBEOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gRnJlcXVlbmN5ICogTFZFUU5CX1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAgICAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIGlmIChHYWluID49IDApCisgICAgeworICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVsxNV07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEQgPSAxICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbR2FpbiArIDE1XTsgICAgICAgICAgICAgICAgICAgIC8qIEQgPSAxIC8gKDEgKyBHKSAgaWYgR2FpbmRCIDwgIDAgKi8KKyAgICB9CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjIsQjEsQTAgY29lZmZpY2llbnRzCisgICAgICovCisgICAgQjIgPSAtMC41ICogKDIgKiBRRmFjdG9yIC0gRCAqIFQwKSAvICgyICogUUZhY3RvciArIEQgKiBUMCk7CisgICAgQjEgPSAoMC41IC0gQjIpICogY29zKFQwKTsKKyAgICBBMCA9ICgwLjUgKyBCMikgLyAyLjA7CisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgLyogYWxsIHRoZSBjb2VmZmljaWVudHMgYXJlIG11bHRpcGxpZWQgd2l0aCAyIHRvIG1ha2UgdGhlbSBhbGlnbiB3aXRoIGZpeGVkIHBvaW50IHZhbHVlcyovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSAyICogQTA7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSAyICogQjE7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSAyICogQjI7CisgICAgcENvZWZmaWNpZW50cy0+RyAgPSBMVkVRTkJfR2FpblRhYmxlW0dhaW4gKyAxNV07CisKKyAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpCkBAIC0yOTYsMyArMzU5LDQgQEAKICAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOwogCiB9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCmluZGV4IDk1MjEyZjIuLmYwZGViNmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCkBAIC0yNSw3ICsyNSwzOSBAQAogLyogR2FpbiB0YWJsZSBmb3IgKDEwXihHYWluLzIwKSAtIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjgyMjE3MmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjgwMDQ3NGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc3NjEyOGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc0ODgxMWYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjcxODE2MmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY4Mzc3MmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnOV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY0NTE4N2YKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYwMTg5M2YKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU1MzMxNmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQ5ODgxM2YKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQzNzY1OWYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM2OTA0M2YKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI5MjA1NGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIwNTY3MmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEwODc0OWYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyMjAxOGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1ODkyNWYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQxMjUzOGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU4NDg5M2YKKyNkZWZpbmUgTFZFUU5CX0dhaW5fNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc3ODI3OWYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fNl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5NTI2MmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIzODcyMWYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTg4NmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fOV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjgxODM4M2YKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2MjI3OGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU0ODEzNGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk4MTA3MmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjQ2NjgzNmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAxMTg3MmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjYyMzQxM2YKKyNlbHNlCiAjZGVmaW5lIExWRVFOQl9HQUlOU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCiAjZGVmaW5lIExWRVFOQl9HYWluX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNjg0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODIyMTcyICovCiAjZGVmaW5lIExWRVFOQl9HYWluX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNjM5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODAwNDc0ICovCkBAIC01OCwxNCArOTAsMzAgQEAKICNkZWZpbmUgTFZFUU5CX0dhaW5fMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAzLjQ2NjgzNiAqLwogI2RlZmluZSBMVkVRTkJfR2Fpbl8xNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODIxNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuMDExODcyICovCiAjZGVmaW5lIExWRVFOQl9HYWluXzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NDY5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC42MjM0MTMgKi8KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRnJlcXVlbmN5IHRhYmxlIGZvciAyKlBpL0ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIExWRVFOQl8yUGlPbl84MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDc4NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTcwZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA1MjRmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM5M2YKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMjg1ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAyNjJmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8zMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDE5NmYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTQyZgorI2RlZmluZSBMVkVRTkJfMlBpT25fNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxMzFmCiAKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDY1ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzNmCisjZW5kaWYKKworI2Vsc2UKICNkZWZpbmUgTFZFUU5CX0ZSRVFTSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KICNkZWZpbmUgTFZFUU5CXzJQaU9uXzgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYzNTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDc4NSAqLwogI2RlZmluZSBMVkVRTkJfMlBpT25fMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTEyMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwNTcwICovCkBAIC03NiwxNCArMTI0LDMxIEBACiAjZGVmaW5lIExWRVFOQl8yUGlPbl8zMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAxOTYgKi8KICNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3ODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDE0MiAqLwogI2RlZmluZSBMVkVRTkJfMlBpT25fNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM5MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMTMxICovCi0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIDUwRCB0YWJsZSBmb3IgNTAgLyAoIDEgKyBHYWluICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjYyMzQxM2YKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMDExODcyZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC40NjY4MzZmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjk4MTA3MmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNTQ4MTM0ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xNjIyNzhmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjgxODM4M2YKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTExODg2ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc3X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yMzg3MjFmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk5NTI2MmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzc4Mjc5ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41ODQ4OTNmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQxMjUzOGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjU4OTI1ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjIwMThmCisjZGVmaW5lIExWRVFOQl8xMDBEXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMGYKKyNlbHNlCiAjZGVmaW5lIExWRVFOQl8xMDBEU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCiAjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OTk1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNS42MjM0MTMgKi8KICNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA1LjAxMTg3MiAqLwpAQCAtMTAxLDYgKzE2Niw2IEBACiAjZGVmaW5lIExWRVFOQl8xMDBEX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4yNTg5MjUgKi8KICNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjEyMjAxOCAqLwogI2RlZmluZSBMVkVRTkJfMTAwRF8wX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICovCi0KKyNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYwppbmRleCAxMGU3ZDc0Li5jMjkwYWVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jCkBAIC0xNDAsOCArMTQwLDEyIEBACiB2b2lkICAgIExWRVFOQl9TZXRGaWx0ZXJzKExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCiB7Ci0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICBleHRlcm4gY29uc3QgTFZNX1VJTlQzMiAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW107ICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSB0YWJsZSAqLworI2Vsc2UKICAgICBleHRlcm4gY29uc3QgTFZNX1VJTlQxNiAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW107ICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSB0YWJsZSAqLworI2VuZGlmCisKICAgICBMVk1fVUlOVDE2ICAgICAgICAgIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYmFuZCBpbmRleCAqLwogICAgIExWTV9VSU5UMzIgICAgICAgICAgZnMgPSAoTFZNX1VJTlQzMilMVkVRTkJfU2FtcGxlUmF0ZVRhYlsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgIC8qIFNhbXBsZSByYXRlICovCiAgICAgTFZNX1VJTlQzMiAgICAgICAgICBmYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGNlbnRyZSBmcmVxdWVuY3kgKi8KQEAgLTE1OCwxMSArMTYyLDE1IEBACiAgICAgICAgIGZjID0gKExWTV9VSU5UMzIpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeTsgICAgIC8qIEdldCB0aGUgYmFuZCBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAgICAgIFFGYWN0b3IgPSAoTFZNX0lOVDE2KXBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yOyAgIC8qIEdldCB0aGUgYmFuZCBRIGZhY3RvciAqLwogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDsgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCisjZWxzZQogICAgICAgICAvKgogICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIgc2V0IHRoZSB0eXBlIG9mIGJpcXVhZCByZXF1aXJlZAogICAgICAgICAgKi8KICAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb247ICAgICAgICAgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCisjZW5kaWYKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgaWYgKChmYyA8PCAxNSkgPD0gKExPV19GUkVRICogZnMpKQogICAgICAgICB7CiAgICAgICAgICAgICAvKgpAQCAtMTc3LDcgKzE4NSw3IEBACiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfRG91YmxlUHJlY2lzaW9uOwogICAgICAgICB9Ci0KKyNlbmRpZgogCiAgICAgICAgIC8qCiAgICAgICAgICAqIENoZWNrIGZvciBvdXQgb2YgcmFuZ2UgZnJlcXVlbmNpZXMKQEAgLTIzMCw2ICsyMzgsMjUgQEAKICAgICAgICAgQmlxdWFkVHlwZSA9IHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV07CiAgICAgICAgIHN3aXRjaCAgKEJpcXVhZFR5cGUpCiAgICAgICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgY2FzZSAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgTFZFUU5CX1NpbmdsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorI2Vsc2UKICAgICAgICAgICAgIGNhc2UgICAgTFZFUU5CX0RvdWJsZVByZWNpc2lvbjoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKQEAgLTI2OSw2ICsyOTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisjZW5kaWYKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI4OCw3ICszMTYsNyBAQAogLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UpCiB7CiAgICAgTFZNX0lOVDE2ICAgICAgICpwVGFwQWRkcmVzczsKQEAgLTMwNSw4ICszMzMsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgIE51bVRhcHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCiAgICAgfQogfQorI2Vsc2UKK3ZvaWQgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShMVkVRTkJfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSkKK3sKKyAgICBMVk1fRkxPQVQgICAgICAgKnBUYXBBZGRyZXNzOworICAgIExWTV9JTlQxNiAgICAgICBOdW1UYXBzOwogCisgICAgcFRhcEFkZHJlc3MgPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0OworICAgIE51bVRhcHMgICAgID0gKExWTV9JTlQxNikoKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSkgLyBzaXplb2YoTFZNX0ZMT0FUKSk7CiAKKyAgICBpZiAoTnVtVGFwcyAhPSAwKQorICAgIHsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBUYXBBZGRyZXNzLCAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE51bVRhcHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgfQorfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MjIsOSArNDY2LDEzIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKQogICAgICAgICAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMS4wZik7CisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMC4wZik7CisjZWxzZQogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sTFZNX01BWElOVF8xNik7CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwwKTsKLQorI2VuZGlmCiAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKICAgICAgICAgICAgIH0KQEAgLTQzMiwxNSArNDgwLDE4IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogU3RheSBvbiB0aGUgT04gb3BlcmF0aW5nIG1vZGUgdW50aWwgdGhlIHRyYW5zaXRpb24gaXMgZG9uZSAqLwogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfT047Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDAuMGYpOworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDEuMGYpOworI2Vsc2UKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDApOwogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sTFZNX01BWElOVF8xNik7CisjZW5kaWYKICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CiAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sTFZFUU5CX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7Ci0KICAgICAgICAgICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fVFJVRTsKICAgICAgICAgfQogCkBAIC00NzAsOCArNTIxLDEzIEBACiAgICAgIC8qCiAgICAgICAqIFNlbmQgYW4gQUxHT0ZGIGV2ZW50IGlmIHRoZSBPTi0+T0ZGIHN3aXRjaCB0cmFuc2l0aW9uIGlzIGZpbmlzaGVkCiAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgaWYoKExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pID09IDApICYmCisgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpeworI2Vsc2UKICAgICBpZigoTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkgPT0gMHgwMDAwMDAwMCkgJiYKICAgICAgICAoQ2FsbGJhY2tQYXJhbSA9PSAwKSl7CisjZW5kaWYKICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9CWVBBU1M7CiAgICAgICAgIGlmIChDYWxsQmFjayAhPSBMVk1fTlVMTCl7CiAgICAgICAgICAgICBDYWxsQmFjayhwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsIExWTV9OVUxMLCBBTEdPUklUSE1fRVFOQl9JRHxMVkVRTkJfRVZFTlRfQUxHT0ZGKTsKQEAgLTQ4NSw5ICs1NDEsMyBAQAogCiAgICAgcmV0dXJuIDE7CiB9Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMKaW5kZXggZTAxYzFjNS4uZGUxYmJiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYwpAQCAtOTcsNiArOTcsMjEgQEAKICAgICAgICAgICovCiAgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7CisgICAgICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgVGFwcyAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKSk7CisgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JhbmREZWZfdCkpKTsKKyAgICAgICAgLyogQmlxdWFkIHR5cGVzICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmlxdWFkVHlwZV9lbikpKTsKKyNlbHNlCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpOwogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCkBAIC0xMDcsNiArMTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JhbmREZWZfdCkpKTsgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLwogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pKSk7ICAgIC8qIEJpcXVhZCB0eXBlcyAqLworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLkFsaWdubWVudCAgICA9IExWRVFOQl9EQVRBX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZFUU5CX1BFUlNJU1RFTlRfREFUQTsKQEAgLTExNywxMiArMTMzLDIyIEBACiAgICAgICAgICAqLwogICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOworICAgICAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7CisjZWxzZQogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOwogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOyAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0NPRUZfQUxJR047CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVF9DT0VGOwpAQCAtMTMzLDggKzE1OSwxNCBAQAogICAgICAgICAgKi8KICAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworI2Vsc2UKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTKnNpemVvZihMVk1fSU5UMTYpKnBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLkFsaWdubWVudCAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0hfQUxJR047CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgICAgICAgPSBMVkVRTkJfU0NSQVRDSDsKQEAgLTI0OCw4ICsyODAsMTUgQEAKICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyk7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyAgICBwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7CisjZWxzZQogICAgIHBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGUgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOyAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCisjZW5kaWYKIAogCiAKQEAgLTI1OSw5ICsyOTgsMTUgQEAKICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyk7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIE1lbVNpemUgPSAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKKyAgICBwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXQgPSAoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOworI2Vsc2UKICAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190KSk7CiAgICAgcEluc3RhbmNlLT5wRVFOQl9UYXBzID0gKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKKyNlbmRpZgogICAgIE1lbVNpemUgPSAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JhbmREZWZfdCkpOwogICAgIHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucyAgPSAoTFZFUU5CX0JhbmREZWZfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CkBAIC0yNzksOCArMzI0LDEzIEBACiAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzKTsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeSA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworI2Vsc2UKICAgICBwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5ID0gKExWTV9JTlQxNiAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0lOVDE2KSk7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCkBAIC0zMDgsMTUgKzM1OCwyMiBAQAogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSAgICA9ICh2b2lkKilwSW5zdGFuY2U7CiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjazsKKwogICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDAsMCk7CiAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwLExWTV9GU184MDAwLDIpOwogCisKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gTFZNX05VTEw7CiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fTlVMTDsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwLCAxLjBmKTsKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwLCBMVk1fRlNfODAwMCwgMik7CisjZWxzZQogICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDAsTFZNX01BWElOVF8xNik7CiAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwwLExWTV9GU184MDAwLDIpOworI2VuZGlmCiAKICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uICAgICAgPSBMVk1fRkFMU0U7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAppbmRleCA5ZGY5ODBjLi41NmIwMmUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCkBAIC02MCw2ICs2MCw5IEBACiAvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCiB0eXBlZGVmIGVudW0KIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQgPSAtMSwKKyNlbmRpZgogICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb24gPSAwLAogICAgIExWRVFOQl9Eb3VibGVQcmVjaXNpb24gPSAxLAogICAgIExWRVFOQl9PdXRPZlJhbmdlICAgICAgPSAyLApAQCAtODQsMTEgKzg3LDIwIEBACiAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICAgICAgICBDYXBhYmlsaXRpZXM7ICAgICAgIC8qIEluc3RhbmNlIGNhcGFiaWxpdGllcyAqLwogCiAgICAgLyogQWxpZ25lZCBtZW1vcnkgcG9pbnRlcnMgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAqcEZhc3RUZW1wb3Jhcnk7ICAgICAgICAvKiBGYXN0IHRlbXBvcmFyeSBkYXRhIGJhc2UgYWRkcmVzcyAqLworI2Vsc2UKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgKnBGYXN0VGVtcG9yYXJ5OyAgICAgICAgLyogRmFzdCB0ZW1wb3JhcnkgZGF0YSBiYXNlIGFkZHJlc3MgKi8KKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwRVFOQl9UYXBzX0Zsb2F0OyAgICAgICAgLyogRXF1YWxpc2VyIFRhcHMgKi8KKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdDsgLyogU3RhdGUgZm9yIGVhY2ggZmlsdGVyIGJhbmQgKi8KKyNlbHNlCiAgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICAgICAgICpwRVFOQl9UYXBzOyAgICAgICAgLyogRXF1YWxpc2VyIFRhcHMgKi8KICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAgICAgICpwRVFOQl9GaWx0ZXJTdGF0ZTsgLyogU3RhdGUgZm9yIGVhY2ggZmlsdGVyIGJhbmQgKi8KKyNlbmRpZgogCiAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zIGFuZCBjYWxsIGJhY2sgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIE5CYW5kczsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzICovCkBAIC05Niw3ICsxMDgsMTIgQEAKICAgICBMVkVRTkJfQmlxdWFkVHlwZV9lbiAgICAgICAgICAgICpwQmlxdWFkVHlwZTsgICAgICAgLyogRmlsdGVyIGJpcXVhZCB0eXBlcyAqLwogCiAgICAgLyogQnlwYXNzIHZhcmlhYmxlICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgIEJ5cGFzc01peGVyOworI2Vsc2UKICAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICAgIEJ5cGFzc01peGVyOyAgICAgICAgICAgICAgLyogQnlwYXNzIG1peGVyIHVzZWQgaW4gdHJhbnNpdGlvbnMgKi8KKyNlbmRpZgorCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgYkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb247IC8qIE9wZXJhdGluZyBtb2RlIHRyYW5zaXRpb24gZmxhZyAqLwogCiB9IExWRVFOQl9JbnN0YW5jZV90OwpAQCAtMTE0LDcgKzEzMSwxMSBAQAogdm9pZCAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKExWRVFOQl9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UpOwogCiB2b2lkICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QgKnBJbnN0YW5jZSk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKTsKKyNlbHNlCiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MxNl9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKTsKQEAgLTEyMiw2ICsxNDMsNyBAQAogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfRG91YmxlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cyk7CisjZW5kaWYKIAogTFZNX0lOVDMyIExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrICh2b2lkKiBoSW5zdGFuY2UsIHZvaWQgKnBHZW5lcmFsUHVycG9zZSwgTFZNX0lOVDE2IENhbGxiYWNrUGFyYW0pOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKaW5kZXggNThmNThlZC4uNjMyODE4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwpAQCAtNTcsNyArNTcsMTIxIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICpwQmlxdWFkOworICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2g7CisKKworICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIGJ1ZmZlcnMgYXJlIDMyLWJpdCBhbGlnbmVkICovCisgICAgaWYgKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZFUU5CX0FMSUdOTUVOVEVSUk9SOworICAgIH0KKworICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OworCisgICAgLyoKKyAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVkVRTkJfVE9PTUFOWVNBTVBMRVMpOworICAgIH0KKworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgaW5wdXQgZGF0YSBpbiB0byBzY3JhdGNoIGJ1ZmZlcgorICAgICAgICAgKi8KKworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgUmlnaHQgKi8KKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIGVhY2ggc2VjdGlvbiBleGVjdGUgdGhlIGZpbHRlciB1bmxlc3MgdGhlIGdhaW4gaXMgMGRCCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5OQmFuZHMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBJbnN0YW5jZS0+TkJhbmRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDaGVjayBpZiBiYW5kIGlzIG5vbi16ZXJvIGRCIGdhaW4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLkdhaW4gIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgYmlxdWFkIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CisKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBTZWxlY3Qgc2luZ2xlIG9yIGRvdWJsZSBwcmVjaXNpb24gYXMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisgICAgICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKKyAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiApKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIFJpZ2h0ICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTW9kZSBpcyBPRkYgc28gY29weSB0aGUgZGF0YSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIFJpZ2h0IHNhbXBsZXMgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworCit9CisjZWxzZQogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dERhdGEsCkBAIC0xOTgsMyArMzEyLDQgQEAKICAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOwogCiB9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCmluZGV4IDhlMmUwZTguLjU2MzE4MWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCkBAIC0zNiw2ICszNiwyMCBAQAogICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCiAgKiBmcmVxdWVuY3kKICAqLworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorY29uc3QgTFZNX1VJTlQzMiAgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdID0gezgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDAKK307CisjZWxzZQogY29uc3QgTFZNX1VJTlQxNiAgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdID0gezgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKQEAgLTQ0LDggKzU4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMH07ICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCi0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMAorfTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU2LDYgKzcxLDIyIEBACiAvKgogICogVGFibGUgZm9yIDIgKiBQaSAvIEZzCiAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgICBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXSA9IHtMVkVRTkJfMlBpT25fODAwMCwgICAgICAvKiA4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8yNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80ODAwMAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fOTYwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzE5MjAwMAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisjZWxzZQogY29uc3QgTFZNX0lOVDE2ICAgICBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXSA9IHtMVkVRTkJfMlBpT25fODAwMCwgICAgICAvKiA4a1MvcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMjAwMCwKQEAgLTY1LDEwICs5Niw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwfTsgICAgLyogNDhrUy9zICovCisjZW5kaWYKIAogLyoKICAqIEdhaW4gdGFibGUKICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgIExWRVFOQl9HYWluVGFibGVbXSA9IHtMVkVRTkJfR2Fpbl9OZWcxNV9kQiwgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzE0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzExX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTBfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc5X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnOF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzdfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc2X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWczX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8wX2RCLCAgICAgICAgICAgIC8qIDBkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl80X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzZfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl83X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fOF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzlfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzExX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzE0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTVfZEJ9OyAgICAgICAgICAvKiArMTVkQiBnYWluICovCisjZWxzZQogY29uc3QgTFZNX0lOVDE2ICAgICBMVkVRTkJfR2FpblRhYmxlW10gPSB7TFZFUU5CX0dhaW5fTmVnMTVfZEIsICAgICAgICAvKiAtMTVkQiBnYWluICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxNF9kQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEzX2RCLApAQCAtMTAxLDEwICsxNjYsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzE0X2RCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTVfZEJ9OyAgICAgICAgICAvKiArMTVkQiBnYWluICovCiAKLQorI2VuZGlmCiAvKgogICogRCB0YWJsZSBmb3IgMTAwIC8gKEdhaW4gKyAxKQogICovCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgICBMVkVRTkJfRFRhYmxlW10gPSB7TFZFUU5CXzEwMERfTmVnMTVfZEIsICAgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTBfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzlfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzhfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzdfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzZfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzVfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEXzBfZEJ9OyAgICAgICAgICAgICAgIC8qIDBkQiBnYWluICovCisjZWxzZQogY29uc3QgTFZNX0lOVDE2ICAgIExWRVFOQl9EVGFibGVbXSA9IHtMVkVRTkJfMTAwRF9OZWcxNV9kQiwgICAgICAgICAgICAvKiAtMTVkQiBnYWluICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzE0X2RCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxM19kQiwKQEAgLTEyMiw3ICsyMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxX2RCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF8wX2RCfTsgICAgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLwogCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGaWx0ZXIgcG9seW5vbWlhbCBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmgKaW5kZXggMjhlMzM2OS4uOWMyZTI5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oCkBAIC0xMDcsOCArMTA3LDE0IEBACiAKICAgICAvKiBQYXJhbWV0ZXJzIGZvciBSRVYgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTGV2ZWw7ICAgICAgICAgICAgICAgICAgLyogTGV2ZWwsIDAgdG8gMTAwIHJlcHJlc2VudGluZyBwZXJjZW50YWdlIG9mIHJldmVyYiAqLworI2lmbmRlZiBISUdIRVJfRlMKICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTFBGOyAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyLCBpbiBIeiAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBIUEY7ICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyLCBpbiBIeiAqLworI2Vsc2UKKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgTFBGOyAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyLCBpbiBIeiAqLworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBIUEY7ICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyLCBpbiBIeiAqLworI2VuZGlmCisKICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgVDYwOyAgICAgICAgICAgICAgICAgICAgLyogRGVjYXkgdGltZSBjb25zdGFudCwgaW4gbXMgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRGVuc2l0eTsgICAgICAgICAgICAgICAgLyogRWNobyBkZW5zaXR5LCAwIHRvIDEwMCBmb3IgbWluaW11bSB0byBtYXhpbXVtIGRlbnNpdHkgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRGFtcGluZzsgICAgICAgICAgICAgICAgLyogRGFtcGluZyAqLwpAQCAtMjk3LDExICszMDMsMTcgQEAKIC8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIExWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKLQorI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jCmluZGV4IGFjMmVmOWQuLmU3MTA4NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMKQEAgLTQxLDYgKzQxLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIExWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9BcHBseU5ld1NldHRpbmdzIChMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBQcml2YXRlKQogewogCkBAIC01OTMsOCArNTk0LDU4OSBAQAogCiAgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7CiB9CisjZWxzZSAvKiBCVUlMRF9GTE9BVCovCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyAoTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwUHJpdmF0ZSkKK3sKKworICAgIExWTV9Nb2RlX2VuICBPcGVyYXRpbmdNb2RlOworICAgIExWTV9JTlQzMiAgICBOdW1iZXJPZkRlbGF5TGluZXM7CiAKIAorICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXIgKi8KKyAgICBpZihwUHJpdmF0ZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICBPcGVyYXRpbmdNb2RlID0gcFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlOworCisgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSA0OworICAgIH0KKyAgICBlbHNlIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgaGlnaCBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5IUEYgICAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkhQRikgICAgICAgIHx8CisgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgIE9tZWdhOworICAgICAgICBGT19GTE9BVF9Db2Vmc190ICBDb2VmZnM7CisKKyAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5IUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgIExWTV9GT19IUEYoT21lZ2EsICZDb2VmZnMpOworICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgJkNvZWZmcyk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcFByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGxvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYgICAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxQRikgICAgICAgIHx8CisgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgIE9tZWdhOworICAgICAgICBGT19GTE9BVF9Db2Vmc190ICBDb2VmZnM7CisKKyAgICAgICAgQ29lZmZzLkEwID0gMTsKKyAgICAgICAgQ29lZmZzLkExID0gMDsKKyAgICAgICAgQ29lZmZzLkIxID0gMDsKKyAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYgPD0gKExWTV9Gc1RhYmxlW3BQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZV0gPj4gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9tZWdhID0gTFZNX0dldE9tZWdhKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRG8gbm90IGFwcGx5IGZpbHRlciBpZiB3ID0yKnBpKmZjL2ZzID49IDIuOQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZihPbWVnYSA8PSAoTFZNX0ZMT0FUKUxWUkVWXzJfOV9JTlEyOSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVk1fRk9fTFBGKE9tZWdhLCAmQ29lZmZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+TFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgJkNvZWZmcyk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcFByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHJvb20gc2l6ZSBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBpZiggcFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkKKyAgICB7CisgICAgICAgIC8qIFJvb20gc2l6ZSByYW5nZSBpcyAxMG1zIHRvIDIwMG1zCisgICAgICAgICAqIDAlICAgLS0gMTBtcworICAgICAgICAgKiA1MCUgIC0tIDY1bXMKKyAgICAgICAgICogMTAwJSAtLSAxMjBtcworICAgICAgICAgKi8KKyAgICAgICAgcFByaXZhdGUtPlJvb21TaXplSW5tcyA9IDEwICsgKCgocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSoxMSkgKyA1KSAvIDEwKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBUIGRlbGF5IG51bWJlciBvZiBzYW1wbGVzIGFuZCB0aGUgYWxsIHBhc3MgZGVsYXkgbnVtYmVyIG9mIHNhbXBsZXMKKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKworICAgICAgICBMVk1fVUlOVDMyICBUZW1wOworICAgICAgICBMVk1fSU5UMzIgICBBUERlbGF5U2l6ZTsKKyAgICAgICAgTFZNX0lOVDMyICAgRnMgPSBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKKyAgICAgICAgTFZNX1VJTlQzMiAgRGVsYXlMZW5ndGhTYW1wbGVzID0gKExWTV9VSU5UMzIpKEZzICogcFByaXZhdGUtPlJvb21TaXplSW5tcyk7CisgICAgICAgIExWTV9JTlQxNiAgIGk7CisgICAgICAgIExWTV9GTE9BVCAgIFNjYWxlVGFibGVbXSAgPSB7TFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNH07CisgICAgICAgIExWTV9JTlQxNiAgIE1heFRfRGVsYXlbXSAgPSB7TFZSRVZfTUFYX1QwX0RFTEFZLCBMVlJFVl9NQVhfVDFfREVMQVksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfVDJfREVMQVksIExWUkVWX01BWF9UM19ERUxBWX07CisgICAgICAgIExWTV9JTlQxNiAgIE1heEFQX0RlbGF5W10gPSB7TFZSRVZfTUFYX0FQMF9ERUxBWSwgTFZSRVZfTUFYX0FQMV9ERUxBWSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01BWF9BUDJfREVMQVksIExWUkVWX01BWF9BUDNfREVMQVl9OworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIGVhY2ggZGVsYXkgbGluZQorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWTV9GTE9BVCBUZW1wMTsgIC8qIHRvIGF2b2lkIFFBQyB3YXJuaW5nIG9uIHR5cGUgY29udmVyc2lvbiAqLworCisgICAgICAgICAgICAgICAgVGVtcDE9KExWTV9GTE9BVClEZWxheUxlbmd0aFNhbXBsZXM7CisgICAgICAgICAgICAgICAgVGVtcCA9IChMVk1fVUlOVDMyKShUZW1wMSAqIFNjYWxlVGFibGVbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVGVtcCA9IERlbGF5TGVuZ3RoU2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFQRGVsYXlTaXplID0gVGVtcCAgLyAxNTAwOworCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTZXQgdGhlIGZpeGVkIGRlbGF5CisgICAgICAgICAgICAgKi8KKworI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgVGVtcCAgPSAoTWF4VF9EZWxheVtpXSAtIE1heEFQX0RlbGF5W2ldKSAqIEZzIC8gMTkyMDAwOworI2Vsc2UKKyAgICAgICAgICAgIFRlbXAgID0gKE1heFRfRGVsYXlbaV0gLSBNYXhBUF9EZWxheVtpXSkgKiBGcyAvIDQ4MDAwOworI2VuZGlmCisgICAgICAgICAgICBwUHJpdmF0ZS0+RGVsYXlfQVBbaV0gPSBwUHJpdmF0ZS0+VFtpXSAtIFRlbXA7CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgdGFwIHNlbGVjdGlvbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byB0YXAgQiAqLworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltpXSAgICAgICAgICAgICA9ICZwUHJpdmF0ZS0+cERlbGF5X1RbaV1bcFByaXZhdGUtPlRbaV0gLSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wIC0gQVBEZWxheVNpemVdOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXSAgICAgICAgICA9IEFQRGVsYXlTaXplOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSA9IDA7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQyID0gMS4wZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQiB0byB0YXAgQSAqLworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QVtpXSAgICAgICAgICAgICA9ICZwUHJpdmF0ZS0+cERlbGF5X1RbaV1bcFByaXZhdGUtPlRbaV0gLSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wIC0gQVBEZWxheVNpemVdOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSAgICAgICAgICA9IEFQRGVsYXlTaXplOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDA7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxID0gMS4wZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgbWF4aW11bSBibG9jayBzaXplIHRvIHRoZSBzbWFsbGVzdCBkZWxheSBzaXplCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gICA9IFRlbXA7CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk1heEJsa0xlbiA+IHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkFCX1NlbGVjdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTGltaXQgdGhlIG1heGltdW0gYmxvY2sgbGVuZ3RoCisgICAgICAgICAqLworICAgICAgICAvKiBKdXN0IGFzIGEgcHJlY2F1c2lvbiwgYnV0IG5vIHByb2JsZW0gaWYgd2UgcmVtb3ZlIHRoaXMgbGluZSAgICAgICovCisgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gPSBwUHJpdmF0ZS0+TWF4QmxrTGVuIC0gMjsKKyAgICAgICAgaWYocFByaXZhdGUtPk1heEJsa0xlbiA+IHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5NYXhCbG9ja1NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gPSAoTFZNX0lOVDMyKXBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5NYXhCbG9ja1NpemU7CisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGxvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudAorICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5EYW1waW5nICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRhbXBpbmcpICAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9JTlQzMiAgICAgICBUZW1wOworICAgICAgICBMVk1fRkxPQVQgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgIENvZWZmczsKKyAgICAgICAgTFZNX0lOVDE2ICAgICAgIGk7CisgICAgICAgIExWTV9JTlQxNiAgICAgICBEYW1waW5nICAgICAgPSAoTFZNX0lOVDE2KSgocFByaXZhdGUtPk5ld1BhcmFtcy5EYW1waW5nICogMTAwKSArIDEwMDApOworICAgICAgICBMVk1fRkxPQVQgICAgICAgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl8wX29uXzQsIExWUkVWX1RfM19Qb3dlcl8xX29uXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyXzJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyXzNfb25fNH07CisKKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIKKyAgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKExWTV9JTlQzMikoU2NhbGVUYWJsZVtpXSAqIERhbXBpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRlbXAgPSBEYW1waW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoVGVtcCA8PSAoTFZNX0lOVDMyKShMVk1fRnNUYWJsZVtwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGVdID4+IDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9tZWdhID0gTFZNX0dldE9tZWdhKFRlbXAsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgTFZNX0ZPX0xQRihPbWVnYSwgJkNvZWZmcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29lZmZzLkEwID0gMTsKKyAgICAgICAgICAgICAgICBDb2VmZnMuQTEgPSAwOworICAgICAgICAgICAgICAgIENvZWZmcy5CMSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5SZXZMUENvZWZzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzW2ldLCAmQ29lZmZzKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgQWxsLXBhc3MgZmlsdGVyIG1peGVyIHRpbWUgY29uc3RhbnRzCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRlbnNpdHkpKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQWxwaGE7CisgICAgICAgIExWTV9GTE9BVCAgIEFscGhhVGFwOworCisgICAgICAgIEFscGhhID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9BTExQQVNTX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgICAgICBBbHBoYVRhcCA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQUxMUEFTU19UQVBfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQWxwaGExICAgICAgID0gQWxwaGFUYXA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkFscGhhMiAgICAgICA9IEFscGhhVGFwOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uQWxwaGEgICAgPSBBbHBoYTsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLkFscGhhID0gQWxwaGE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBmZWVkIGJhY2sgZ2FpbgorICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5UNjApICAgICAgICB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgR1s0XTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZlZWRiYWNrIGdhaW4gKFE3LjI0KSAqLworCisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEdbM10gPSAwOworICAgICAgICAgICAgR1syXSA9IDA7CisgICAgICAgICAgICBHWzFdID0gMDsKKyAgICAgICAgICAgIEdbMF0gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDE7CisgICAgICAgICAgICBMVk1fRkxPQVQgICBUZW1wMjsKKyAgICAgICAgICAgIExWTV9JTlQxNiAgIGk7CisgICAgICAgICAgICBMVk1fRkxPQVQgICBTY2FsZVRhYmxlW10gPSB7TFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OworCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGb3IgZWFjaCBkZWxheSBsaW5lCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZW1wMSA9ICgzICogcFByaXZhdGUtPlJvb21TaXplSW5tcyAqIFNjYWxlVGFibGVbaV0pIC8gcFByaXZhdGUtPk5ld1BhcmFtcy5UNjA7CisgICAgICAgICAgICAgICAgaWYoVGVtcDEgPj0gKDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR1tpXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoKFRlbXAxID49ICgyKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUZW1wMiA9IExWTV9Qb3dlcjEwKC0oVGVtcDEgLyAyLjBmKSk7CisgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gTFZNX1Bvd2VyMTAoLShUZW1wMSAvIDIuMGYpKTsKKyAgICAgICAgICAgICAgICAgICAgVGVtcDEgPSBUZW1wMSAqIFRlbXAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IExWTV9Qb3dlcjEwKC0oVGVtcDEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKE51bWJlck9mRGVsYXlMaW5lcyA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR1tpXSA9IFRlbXAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICBUZW1wRzsKKyAgICAgICAgICAgICAgICAgICAgVGVtcEcgPSBUZW1wMSAqIE9ORV9PVkVSX1NRUlRfVFdPOworICAgICAgICAgICAgICAgICAgICBHW2ldPVRlbXBHOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCB1cCB0aGUgZmVlZGJhY2sgbWl4ZXJzIGZvciBmb3VyIGRlbGF5IGxpbmVzICovCisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzBdLlRhcmdldD1HWzBdOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsxXS5UYXJnZXQ9R1sxXTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMl0uVGFyZ2V0PUdbMl07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzNdLlRhcmdldD1HWzNdOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGdhaW4gY29ycmVjdGlvbgorICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSB8fAorICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxldmVsKSAgICB8fAorICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkgKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyIEluZGV4PTA7CisgICAgICAgIExWTV9GTE9BVCBJbmRleF9GTE9BVDsKKyAgICAgICAgTFZNX0lOVDMyIGk9MDsKKyAgICAgICAgTFZNX0ZMT0FUIEdhaW49MDsKKyAgICAgICAgTFZNX0lOVDMyIFJvb21TaXplPTA7CisgICAgICAgIExWTV9GTE9BVCBUNjA7CisgICAgICAgIExWTV9GTE9BVCBDb2Vmc1s1XTsKKworCisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgUm9vbVNpemUgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUm9vbVNpemUgPSAoTFZNX0lOVDMyKXBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemU7CisgICAgICAgIH0KKworCisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwIDwgMTAwKQorICAgICAgICB7CisgICAgICAgICAgICBUNjAgPSAxMDAgKiBMVlJFVl9UNjBfU0NBTEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBUNjAgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAqIExWUkVWX1Q2MF9TQ0FMRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmQgdGhlIG5lYXJlc3Qgcm9vbSBzaXplIGluIHRhYmxlICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IDI0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFJvb21TaXplIDw9IExWUkVWX0dhaW5Qb2x5VGFibGVbaV1bMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBpZihSb29tU2l6ZSA9PSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGFrZSB0YWJsZSB2YWx1ZXMgaWYgdGhlIHJvb20gc2l6ZSBpcyBpbiB0YWJsZSAqLworICAgICAgICAgICAgZm9yKGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZzW2ktMV0gPSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvZWZzWzRdID0gMDsKKyAgICAgICAgICAgIEdhaW4gPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgICAgICAgLyogUS4yNCByZXN1bHQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEludGVycG9sYXRlIHRoZSBnYWluIGJldHdlZW4gbmVhcmVzdCByb29tIHNpemVzICovCisKKyAgICAgICAgICAgIExWTV9GTE9BVCBHYWluMSxHYWluMjsKKyAgICAgICAgICAgIExWTV9JTlQzMiBUb3RfRGlzdCxEaXN0OworCisgICAgICAgICAgICBUb3RfRGlzdCA9IChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdWzBdIC0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4LTFdWzBdOworICAgICAgICAgICAgRGlzdCA9IFJvb21TaXplIC0gKExWTV9VSU5UMzIpTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleCAtIDFdWzBdOworCisKKyAgICAgICAgICAgIC8qIEdldCBnYWluIGZvciBmaXJzdCAqLworICAgICAgICAgICAgZm9yKGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZzW2ktMV0gPSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4LTFdW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29lZnNbNF0gPSAwOworCisgICAgICAgICAgICBHYWluMSA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisKKyAgICAgICAgICAgIC8qIEdldCBnYWluIGZvciBzZWNvbmQgKi8KKyAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XSA9IDA7CisKKyAgICAgICAgICAgIEdhaW4yID0gTFZNX1BvbHlub21pYWwoMywgQ29lZnMsIFQ2MCk7ICAgICAgLyogUS4yNCByZXN1bHQgKi8KKworICAgICAgICAgICAgLyogTGluZWFyIEludGVycG9sYXRlIHRoZSBnYWluICovCisgICAgICAgICAgICBHYWluID0gR2FpbjEgKyAoKChHYWluMiAtIEdhaW4xKSAqIERpc3QpIC8gKFRvdF9EaXN0KSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgaW52ZXJzZSBvZiBnYWluOiBRLjE1CisgICAgICAgICAqIEdhaW4gaXMgbW9zdGx5IGFib3ZlIG9uZSBleGNlcHQgZmV3IGNhc2VzLCB0YWtlIG9ubHkgZ2FpbnMgYWJvdmUgMQorICAgICAgICAgKi8KKyAgICAgICAgaWYoR2FpbiA8IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5HYWluID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5HYWluID0gMSAvIEdhaW47CisgICAgICAgIH0KKworICAgICAgICBJbmRleF9GTE9BVCA9IDEwMC4wZiAvIChMVk1fRkxPQVQpKDEwMCArIHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwpOworICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IHBQcml2YXRlLT5HYWluICogSW5kZXhfRkxPQVQ7CisgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ID0gKHBQcml2YXRlLT5HYWluKkluZGV4X0ZMT0FUKSAvIDI7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgYWxsIHBhc3MgY29tYiBmaWx0ZXIgY29lZmZpY2llbnQKKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisgICAgICAgIExWTV9JTlQxNiAgIGk7CisgICAgICAgIExWTV9GTE9BVCAgIGIgPSAoTFZNX0ZMT0FUKXBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAqIExWUkVWX0JfOF9vbl8xMDAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLlRhcmdldCAgICA9IGI7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgPSBiOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgYnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnQKKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgICB8fAorICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIE1PTk8gZm9ybWF0ICovCisgICAgICAgIExWTV9GTE9BVCAgICBBbHBoYTsKKworICAgICAgICBBbHBoYSA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfRkVFREJBQ0tNSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5BbHBoYSA9IEFscGhhOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsxXS5BbHBoYSA9IEFscGhhOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsyXS5BbHBoYSA9IEFscGhhOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5BbHBoYSA9IEFscGhhOworCisgICAgICAgIE51bUNoYW5uZWxzID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbHdheXMgc3RlcmVvIG91dHB1dCAqLworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9CWVBBU1NNSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIE51bUNoYW5uZWxzKTsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMiA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTE7CisgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuQWxwaGEgICAgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGJ5cGFzcyBtaXhlciB0YXJnZXRzCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxldmVsKSAmJgorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSkKKyAgICB7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKExWTV9GTE9BVCkocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCApIC8gMTAwLjBmOworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CisgICAgICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCA9PSAwKSAmJiAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX0ZBTFNFKSkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrU2V0MiA9IExWTV9UUlVFOworICAgICAgICB9CisgICAgICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlKQorICAgIHsKKyAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IChMVk1fRkxPQVQpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgKSAvIDEwMC4wZjsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKKworICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrU2V0MiA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgICAgICAgICAgICAgICAgICAgICAgPSBMVk1fTU9ERV9PTjsKKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAweDAwMDAwMDAwOworICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOworICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrU2V0MiA9IExWTV9UUlVFOworICAgICAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgICAgPSAwLjAzMTI1ZjsKKyAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qICBJZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCB0byBBcHBseU5ldyBzZXR0aW5ncyBmb3JjZSB0aGUgY3VycmVudCB0byB0aGUgdGFyZ2V0IFwKKyAgICAgICAgdG8gYmVnaW4gaW1tZWRpYXRlIHBsYXliYWNrIG9mIHRoZSBlZmZlY3QgKi8KKyAgICBpZihwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fVFJVRSkKKyAgICB7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MSA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxOworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDIgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MjsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgbmV3IHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcyA9IHBQcml2YXRlLT5OZXdQYXJhbXM7CisgICAgcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSA9IE9wZXJhdGluZ01vZGU7CisKKworICAgIC8qCisgICAgICogVXBkYXRlIGZsYWcKKyAgICAgKi8KKyAgICBpZihwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fVFJVRSkKKyAgICB7CisgICAgICAgIHBQcml2YXRlLT5iRmlyc3RDb250cm9sID0gTFZNX0ZBTFNFOworICAgIH0KKworCisgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7Cit9CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIEJ5cGFzc01peGVyX0NhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuYwppbmRleCA2YmIxZTg4Li45NDkxMDE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMKQEAgLTYxLDE2ICs2MSwyNiBAQAogICAgICAqIENsZWFyIGFsbCBmaWx0ZXIgdGFwIGRhdGEsIGRlbGF5LWxpbmVzIGFuZCBvdGhlciBzaWduYWwgcmVsYXRlZCBkYXRhCiAgICAgICovCiAKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgIDIpOworICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAyKTsKKyNlbHNlCiAgICAgTG9hZENvbnN0XzMyKDAsCiAgICAgICAgICh2b2lkICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KICAgICAgICAgMik7CiAgICAgTG9hZENvbnN0XzMyKDAsCiAgICAgICAgICh2b2lkICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KICAgICAgICAgMik7Ci0KKyNlbmRpZgogICAgIGlmKChMVk1fVUlOVDE2KXBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTG9hZENvbnN0XzMyKDAsIChMVk1fSU5UMzIgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzNdLCAyKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAsIChMVk1fSU5UMzIgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzJdLCAyKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAsIChMVk1fSU5UMzIgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzFdLCAyKTsKQEAgLTgwLDI0ICs5MCw0NiBAQAogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QyX0RFTEFZKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMV9ERUxBWSk7CiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworI2Vsc2UKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzNdLCAyKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzJdLCAyKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzFdLCAyKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKIAorICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdLCBMVlJFVl9NQVhfVDNfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCBMVlJFVl9NQVhfVDJfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOworI2VuZGlmCiAgICAgfQogCiAgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzIpCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwogCiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbHNlCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgTFZSRVZfTUFYX1QxX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbmRpZgogICAgIH0KIAogICAgIGlmKChMVk1fVUlOVDE2KXBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPj0gTFZSRVZfREVMQVlMSU5FU18xKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTG9hZENvbnN0XzMyKDAsIChMVk1fSU5UMzIgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisjZWxzZQorICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOworI2VuZGlmCiAgICAgfQotCiAgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jCmluZGV4IGZmYTUxMzguLjMzNjZiY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYwpAQCAtMTA4LDExICsxMDgsMjkgQEAKICAgICAvKgogICAgICAqIFplcm8gYWxsIG1lbW9yeSByZWdpb25zCiAgICAgICovCi0gICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7Ci0gICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7Ci0gICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7Ci0gICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpIC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUpIC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7CisjZWxzZQorICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKKyAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOworICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisjZW5kaWYKICAgICAvKgogICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCiAgICAgICovCkBAIC0xNDYsNyArMTY0LDcgQEAKICAgICAgKiBTZXQgdGhlIGRhdGEsIGNvZWZmaWNpZW50IGFuZCB0ZW1wb3JhcnkgbWVtb3J5IHBvaW50ZXJzCiAgICAgICovCiAgICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBzaXplb2YoTFZSRVZfRmFzdERhdGFfc3QpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IGRhdGEgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQogICAgIHsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgICogc2l6ZW9mKExWTV9JTlQzMikpOwpAQCAtMTkwLDcgKzIwOCw2NyBAQAogCiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CiAgICAgfQorI2Vsc2UKKyAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgeworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbM10gICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0gICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMl9ERUxBWSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0gICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOwogCisgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbM10sIExWUkVWX01BWF9UM19ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0sIExWUkVWX01BWF9UMl9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIExWUkVWX01BWF9UMV9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMV9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyAgICB9CisKKyAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzEpCisgICAgeworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCAxOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorI2VuZGlmCiAgICAgLyogQWxsLXBhc3MgZGVsYXkgYnVmZmVyIGFkZHJlc3NlcyBhbmQgc2l6ZXMgKi8KICAgICBwTFZSRVZfUHJpdmF0ZS0+VFswXSAgICAgICAgID0gTFZSRVZfTUFYX1QwX0RFTEFZOwogICAgIHBMVlJFVl9Qcml2YXRlLT5UWzFdICAgICAgICAgPSBMVlJFVl9NQVhfVDFfREVMQVk7CkBAIC0yMDAsMTAgKzI3OCwxOSBAQAogCiAKICAgICBwTFZSRVZfUHJpdmF0ZS0+cEZhc3RDb2VmICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdENvZWYsIHNpemVvZihMVlJFVl9GYXN0Q29lZl9zdCkpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgY29lZmZpY2llbnQgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaCAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgICAgICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIHNjcmF0Y2ggKi8KICAgICBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCAyICogc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlIGZvciBlbmQgbWl4ICovCiAgICAgTG9hZENvbnN0XzMyKDAsIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlLCAoTFZNX0lOVDE2KShNYXhCbG9ja1NpemUqMikpOwotCisjZWxzZQorICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoICovCisgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICAvKiBNb25vLT5zdGVyZW8gaW5wdXQgc2F2ZSBmb3IgZW5kIG1peCAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSwgKExWTV9JTlQxNikoTWF4QmxvY2tTaXplICogMikpOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNhdmUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQpAQCAtMjUyLDkgKzMzOSwxMyBAQAogICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucEdlbmVyYWxQdXJwb3NlICAgID0gTFZNX05VTEw7CiAgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fTlVMTDsKICAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkNhbGxiYWNrU2V0ICAgICAgICA9IExWTV9GQUxTRTsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkN1cnJlbnQgICAgICAgICAgICA9IDB4MDNmZmZmZmY7CiAgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgICAgICAgICAgICAgPSAweDAzZmZmZmZmOwotCisjZWxzZQorICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ3VycmVudCAgICAgICAgICAgID0gMC4wMzEyNWY7Ly8weDAzZmZmZmZmOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgICAgICAgICAgID0gMC4wMzEyNWY7Ly8weDAzZmZmZmZmOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldCB0aGUgQWxsLVBhc3MgRmlsdGVyIG1peGVycwpAQCAtMjc3LDcgKzM2OCwxMSBAQAogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsQmFjazEgICAgICAgPSBMVk1fTlVMTDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DYWxsYmFja1NldDEgICAgID0gTFZNX0ZBTFNFOwogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkN1cnJlbnQxICAgICAgICAgPSAwOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgICAgICAgICAgPSAweDdmZmZmZmZmOworI2Vsc2UKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxICAgICAgICAgID0gMTsKKyNlbmRpZgogICAgICAgICAvKiBGZWVkZm9yd2FyZCBtaXhlciAqLwogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DYWxsYmFja1BhcmFtICAgPSAwOwogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jCmluZGV4IDIwMTI0MzIuLmY2ZDQ0NmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuYwpAQCAtMTYxLDIxICsxNjEsMzcgQEAKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIHNpemVvZihMVlJFVl9GYXN0RGF0YV9zdCkpOwogICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCiAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgICogc2l6ZW9mKExWTV9JTlQzMikpOwogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMl9ERUxBWSAgKiBzaXplb2YoTFZNX0lOVDMyKSk7CiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOwogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyNlbHNlCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMl9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCiAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworI2Vsc2UKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzEpCiAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisjZWxzZQorICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkZhc3REYXRhKTsKQEAgLTE5NSwxNCArMjExLDI1IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFRlbXBvcmFyeSBmYXN0IG1lbW9yeQogICAgICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoIG1lbW9yeSAqLwogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIqc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmVkIGZvciBlbmQgbWl4ICovCi0KKyNlbHNlCisgICAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoIG1lbW9yeSAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKKyAgICAgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmVkIGZvciBlbmQgbWl4ICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKKyNlbmRpZgogICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZvcihpPTA7IGk8NDsgaSsrKQogICAgICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKKyNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIxMCw3ICsyMzcsMTIgQEAKICAgICAgICAgewogICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspCiAgICAgICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisjZWxzZQorICAgICAgICAgICAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjE4LDcgKzI1MCwxMiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmb3IoaT0wOyBpPDE7IGkrKykKICAgICAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKaW5kZXggZmJmYTQzNy4uZmY3NDc1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaApAQCAtNDIsMTYgKzQyLDI3IEBACiAvKiAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKiBHZW5lcmFsICovCiAjZGVmaW5lIE9ORV9PVkVSX1NRUlRfVFdPICAgICAgICAgICAgICAgMjMxNzAgICAgICAgICAgIC8qIDEvc3FydCgyKSAqIDJeMTUgKi8KICNkZWZpbmUgTFZSRVZfQl84X29uXzEwMDAgICAgICAgICAgICAxNzE3OTg2OSAgICAgICAgICAgLyogMC44ICogMl4zMSAqLwogI2RlZmluZSBMVlJFVl9IRUFEUk9PTSAgICAgICAgICAgICAgICAgICA4MTkyICAgICAgICAgICAvKiAtMTJkQiAqIDJeMTUgKi8KICNkZWZpbmUgTFZSRVZfMl85X0lOUTI5ICAgICAgICAgICAxNTgzNzY5MTkwTCAgICAgICAgICAgLyogMi45IGluIFEyOSBmb3JtYXQgKi8KICNkZWZpbmUgTFZSRVZfTUlOM0RCICAgICAgICAgICAgICAgICAgIDB4NUE4MiAgICAgICAgICAgLyogLTNkQiBpbiBRMTUgZm9ybWF0ICovCisjZWxzZQorLyogR2VuZXJhbCAqLworI2RlZmluZSBPTkVfT1ZFUl9TUVJUX1RXTyAgICAgICAgICAgIDAuNzA3MTA3ZiAgICAgICAgICAgLyogMS9zcXJ0KDIpICogMl4xNSAqLworI2RlZmluZSBMVlJFVl9CXzhfb25fMTAwMCAgICAgICAgICAgICAgIDAuMDA4ZiAgICAgICAgICAgLyogMC44ICogMl4zMSAqLworI2RlZmluZSBMVlJFVl9IRUFEUk9PTSAgICAgICAgICAgICAgICAgICAwLjI1ZiAgICAgICAgICAgLyogLTEyZEIgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWXzJfOV9JTlEyOSAgICAgICAgICAgICAgICAgICAyLjlmICAgICAgICAgICAvKiAyLjkgaW4gUTI5IGZvcm1hdCAqLworI2RlZmluZSBMVlJFVl9NSU4zREIgICAgICAgICAgICAgICAgMC43MDc5NDU3ZiAgICAgICAgICAgLyogLTNkQiBpbiBRMTUgZm9ybWF0ICovCisjZW5kaWYKIAogLyogSW50ZW5hbCBjb25zdGFudHMgKi8KICNkZWZpbmUgTFZSRVZfTFBfUG9seV9PcmRlciAgICAgICAgICAgICAgICAgNAogI2RlZmluZSBMVlJFVl9MUF9Qb2x5X1NoaWZ0ICAgICAgICAgICAgICAgICA1CisKKyNpZm5kZWYgQlVJTERfRkxPQVQKICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzBfb25fNCAgICAgICAgICAzMjc2OAogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMV9vbl80ICAgICAgICAgIDQzMTI1CiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8yX29uXzQgICAgICAgICAgNTY3NTUKQEAgLTYxLDE0ICs3Miw0NyBAQAogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQgICAgIDI0ODk4ICAgICAgICAgICAvKiAzXigtMS80KSAqIDJeMTUgKi8KICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80ICAgICAxODkxOSAgICAgICAgICAgLyogM14oLTIvNCkgKiAyXjE1ICovCiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCAgICAgMTQzNzUgICAgICAgICAgIC8qIDNeKC0zLzQpICogMl4xNSAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDNfREVMQVkgICAgICAgICAgICAgICAyNTI3ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxMDAwICovCi0jZGVmaW5lIExWUkVWX01BWF9UMl9ERUxBWSAgICAgICAgICAgICAgIDMzMjYgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QxX0RFTEFZICAgICAgICAgICAgICAgNDM3NyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDBfREVMQVkgICAgICAgICAgICAgICA1NzYwICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxMDAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDNfREVMQVkgICAgICAgICAgICAgIDE2ODUgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMl9ERUxBWSAgICAgICAgICAgICAgMjIxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTUwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAxX0RFTEFZICAgICAgICAgICAgICAyOTE4ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80KSA+PiAxNSkgLyAxNTAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDBfREVMQVkgICAgICAgICAgICAgIDM4NDAgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNlbHNlLypCVUlMRF9GTE9BVCovCisjZGVmaW5lIExWUkVWX1Q2MF9TQ0FMRSAgICAgICAgICAgICAgICAwLjAwMDE0MmYgICAgICAgICAgIC8qKDEvNzAwMCkgKi8KKworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMF9vbl80ICAgICAgICAgICAgICAxLjBmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8xX29uXzQgICAgICAgICAxLjMxNjA3NGYKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzJfb25fNCAgICAgICAgIDEuNzMyMDUxZgorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfM19vbl80ICAgICAgICAgMi4yNzk1MDdmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCAgICAgICAgIDEuMGYgICAgICAgIC8qIDNeKC0wLzQpICogMl4xNSAqLworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQgICAgMC43NTk4MzZmICAgICAgICAvKiAzXigtMS80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80ICAgIDAuNTc3MzUwZiAgICAgICAgLyogM14oLTIvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCAgICAwLjQzODY5MWYgICAgICAgIC8qIDNeKC0zLzQpICogMl4xNSAqLworI2VuZGlmCisKKyNpZm5kZWYgSElHSEVSX0ZTCisjZGVmaW5lIExWUkVWX01BWF9UM19ERUxBWSAgICAgICAgICAgICAgICAyNTI3ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMl9ERUxBWSAgICAgICAgICAgICAgICAzMzI2ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMV9ERUxBWSAgICAgICAgICAgICAgICA0Mzc3ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMF9ERUxBWSAgICAgICAgICAgICAgICA1NzYwICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDNfREVMQVkgICAgICAgICAgICAgICAxNjg1ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDJfREVMQVkgICAgICAgICAgICAgICAyMjE4ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDFfREVMQVkgICAgICAgICAgICAgICAyOTE4ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDBfREVMQVkgICAgICAgICAgICAgICAzODQwICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZWxzZQorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UM19ERUxBWSAgICAgICAgICAgICAgIDEwMTA4CisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QyX0RFTEFZICAgICAgICAgICAgICAgMTMzMDQKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDFfREVMQVkgICAgICAgICAgICAgICAxNzUwOAorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMF9ERUxBWSAgICAgICAgICAgICAgIDIzMDQwCisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQM19ERUxBWSAgICAgICAgICAgICAgIDY3NDAKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAyX0RFTEFZICAgICAgICAgICAgICAgODg3MgorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDFfREVMQVkgICAgICAgICAgICAgIDExNjcyCisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMF9ERUxBWSAgICAgICAgICAgICAgMTUzNjAKKyNlbmRpZgorCiAjZGVmaW5lIExWUkVWX0JZUEFTU01JWEVSX1RDICAgICAgICAgICAgIDEwMDAgICAgICAgICAgIC8qIEJ5cGFzcyBtaXhlciB0aW1lIGNvbnN0YW50Ki8KICNkZWZpbmUgTFZSRVZfQUxMUEFTU19UQyAgICAgICAgICAgICAgICAgMTAwMCAgICAgICAgICAgLyogQWxsLXBhc3MgZmlsdGVyIHRpbWUgY29uc3RhbnQgKi8KICNkZWZpbmUgTFZSRVZfQUxMUEFTU19UQVBfVEMgICAgICAgICAgICAgMTAwMDAgICAgICAgICAgIC8qIEFsbC1wYXNzIGZpbHRlciBkZWx5IHRhcCBjaGFuZ2UgKi8KQEAgLTc2LDcgKzEyMCwxMiBAQAogI2RlZmluZSBMVlJFVl9PVVRQVVRHQUlOX1NISUZUICAgICAgICAgICAgICA1ICAgICAgICAgICAvKiBCaXRzIHNoaWZ0IGZvciBvdXRwdXQgZ2FpbiBjb3JyZWN0aW9uICovCiAKIC8qIFBhcmFtZXRlciBsaW1pdHMgKi8KKyNpZm5kZWYgSElHSEVSX0ZTCiAjZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgIDkgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCisjZWxzZQorI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLworI2VuZGlmCisKICNkZWZpbmUgTFZSRVZfTUFYQkxLU0laRV9MSU1JVCAgICAgICAgICAgICA2NCAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGxvdyBsaW1pdCAqLwogI2RlZmluZSBMVlJFVl9NQVhfTEVWRUwgICAgICAgICAgICAgICAgICAgMTAwICAgICAgICAgICAvKiBNYXhpbXVtIGxldmVsLCAxMDAlICovCiAjZGVmaW5lIExWUkVWX01JTl9MUEZfQ09STkVSICAgICAgICAgICAgICAgNTAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciBsaW1pdHMgKi8KQEAgLTk1LDYgKzE0NCw3IEBACiAvKiAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKiBGYXN0IGRhdGEgc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMTYxLDcgKzIxMSw4MSBAQAogCiB9IExWUkVWX0luc3RhbmNlX3N0OwogCisjZWxzZSAvKiBCVUlMRF9GTE9BVCAqLwogCisvKiBGYXN0IGRhdGEgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IEhQVGFwczsgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBMUFRhcHM7ICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBSZXZMUFRhcHNbNF07ICAgICAgICAgICAgICAgLyogUmV2ZXJiIGxvdyBwYXNzIGZpbHRlcnMgdGFwcyAqLworCit9IExWUkVWX0Zhc3REYXRhX3N0OworCisKKy8qIEZhc3QgY29lZmZpY2llbnQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgSFBDb2VmczsgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgTFBDb2VmczsgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBSZXZMUENvZWZzWzRdOyAgICAgICAgLyogUmV2ZXJiIGxvdyBwYXNzIGZpbHRlcnMgY29lZmZpY2llbnRzICovCisKK30gTFZSRVZfRmFzdENvZWZfc3Q7Cit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEdlbmVyYWwgKi8KKyAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCBJbnN0YW5jZVBhcmFtczsgICAgICAgICAgIC8qIEluaXRpYWxpc2F0aW9uIHRpbWUgaW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgIE1lbW9yeVRhYmxlOyAgICAgICAgICAgICAgLyogTWVtb3J5IHRhYmxlICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgQ3VycmVudFBhcmFtczsgICAgICAgICAgICAvKiBQYXJhbWV0ZXJzIGJlaW5nIHVzZWQgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICBOZXdQYXJhbXM7ICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzIGZyb20gdGhlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgYXBwbGljYXRpb24gKi8KKyAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICBiQ29udHJvbFBlbmRpbmc7ICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgbmV3IHBhcmFtZXRlcnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGF2YWlsYWJsZSAqLworICAgIExWTV9DSEFSICAgICAgICAgICAgICAgIGJGaXJzdENvbnRyb2w7ICAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb250cm9sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKyAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICBiRGlzYWJsZVJldmVyYjsgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWl4IGxldmVsIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwJSBhbmQgdGhlIHJldmVyYiBjYW4gYmUgZGlzYWJsZWQgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBSb29tU2l6ZUlubXM7ICAgICAgICAgICAgIC8qIFJvb20gc2l6ZSBpbiBtc2VjICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgTWF4QmxrTGVuOyAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZm9yIGludGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nICovCisKKyAgICAvKiBBbGlnbmVkIG1lbW9yeSBwb2ludGVycyAqLworICAgIExWUkVWX0Zhc3REYXRhX3N0ICAgICAgICpwRmFzdERhdGE7ICAgICAgICAgICAgICAgLyogRmFzdCBkYXRhIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKyAgICBMVlJFVl9GYXN0Q29lZl9zdCAgICAgICAqcEZhc3RDb2VmOyAgICAgICAgICAgICAgIC8qIEZhc3QgY29lZmZpY2llbnQgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaERlbGF5TGluZVs0XTsgICAgLyogRGVsYXkgbGluZSBzY3JhdGNoIG1lbW9yeSAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsgICAgICAgICAgICAgICAgLyogTXVsdGkgdXNzZ2Ugc2NyYXRjaCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRTYXZlOyAgICAgICAgICAgICAgLyogUmV2ZXJiIGJsb2NrIGlucHV0IHNhdmUgZm9yIGRyeS93ZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGluZyovCisKKyAgICAvKiBGZWVkYmFjayBtYXRyaXggKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICBGZWVkYmFja01peGVyWzRdOyAgICAgICAgIC8qIE1peGVyIGZvciBQb3AgYW5kIENsaWNrIFN1cHJlc3Npb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2VkIGJ5IGZlZWRiYWNrIEdhaW4gKi8KKworCisgICAgLyogQWxsLVBhc3MgRmlsdGVyICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgVFs0XTsgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGRlbGF5IHNpemUgb2YgYnVmZmVyICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEZWxheV9UWzRdOyAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIGRlbGF5IGJ1ZmZlcnMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBEZWxheV9BUFs0XTsgICAgICAgICAgICAgIC8qIE9mZnNldCB0byBBUCBkZWxheSBidWZmZXIgc3RhcnQgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBBQl9TZWxlY3Rpb247ICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBBIHRvIEIgd2hlbiAxIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBCIHRvIEEgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBBX0RlbGF5U2l6ZVs0XTsgICAgICAgICAgIC8qIEEgZGVsYXkgbGVuZ3RoIGluIHNhbXBsZXMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBCX0RlbGF5U2l6ZVs0XTsgICAgICAgICAgIC8qIEIgZGVsYXkgbGVuZ3RoIGluIHNhbXBsZXMgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE9mZnNldEFbNF07ICAgICAgICAgICAgIC8qIE9mZnNldCBmb3IgdGhlIEEgZGVsYXkgdGFwICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPZmZzZXRCWzRdOyAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBCIGRlbGF5IHRhcCAqLworICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgIE1peGVyX0FQVGFwc1s0XTsgICAgICAgICAgLyogU21vb3RoZWQgQVAgZGVsYXkgbWl4ZXIgKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICBNaXhlcl9TR0ZlZWRiYWNrWzRdOyAgICAgIC8qIFNtb290aGVkIFNBZmVlZGJhY2sgZ2FpbiAqLworICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIE1peGVyX1NHRmVlZGZvcndhcmRbNF07ICAgLyogU21vb3RoZWQgQVAgZmVlZGZvcndhcmQgZ2FpbiAqLworCisgICAgLyogT3V0cHV0IGdhaW4gKi8KKyAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICBCeXBhc3NNaXhlcjsgICAgICAgICAgICAgIC8qIERyeS93ZXQgbWl4ZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBHYWluOyAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gYXBwbGllZCB0byBvdXRwdXQgdG8gbWFpbnRhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2Ugc2lnbmFsIHBvd2VyICovCisgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgR2Fpbk1peGVyOyAgICAgICAgICAgICAgICAvKiBHYWluIHNtb290aGluZyAqLworCit9IExWUkVWX0luc3RhbmNlX3N0OworCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE2OSwxMiArMjkzLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyhMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBQcml2YXRlKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICAgICAgICAgICAgICAgICAgICBSZXZlcmJCbG9jayhMVk1fRkxPQVQgICAgICAgICAgICpwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAqcFByaXZhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIHZvaWQgICAgICAgICAgICAgICAgICAgIFJldmVyYkJsb2NrKExWTV9JTlQzMiAgICAgICAgICAgKnBJbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICpwUHJpdmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgogTFZNX0lOVDMyICAgICAgICAgICAgICAgQnlwYXNzTWl4ZXJfQ2FsbGJhY2sodm9pZCAgICAgICAqcENhbGxiYWNrRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKnBHZW5lcmFsUHVycG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgR2VuZXJhbFB1cnBvc2UgKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYwppbmRleCA1YzdhOGEwLi41NjZkODRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCkBAIC00NiwxNCArNDYsMjYgQEAKIC8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgIE51bVNhbXBsZXMpCisjZWxzZQogTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgIE51bVNhbXBsZXMpCisjZW5kaWYKIHsKICAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcElucHV0ICA9IChMVk1fRkxPQVQgKilwSW5EYXRhOworICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0cHV0ID0gcE91dERhdGE7CisjZWxzZQogICAgTFZNX0lOVDMyICAgICAgICAgICAgICpwSW5wdXQgID0gKExWTV9JTlQzMiAqKXBJbkRhdGE7CiAgICBMVk1fSU5UMzIgICAgICAgICAgICAgKnBPdXRwdXQgPSBwT3V0RGF0YTsKKyNlbmRpZgogICAgTFZNX0lOVDMyICAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3MsIFJlbWFpbmluZ1NhbXBsZXM7CiAgICBMVk1fSU5UMzIgICAgICAgICAgICAgZm9ybWF0ID0gMTsKIApAQCAtMTA1LDcgKzExNyw3IEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgY29udmVydCB0byBzdGVyZW8gaXMgcmVxdWlyZWQKICAgICAgICAgICAgICAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBpZihwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pewogICAgICAgICAgICAgICAgIE1vbm9UbzJJXzMyKHBJbnB1dCwgcE91dHB1dCwgTnVtU2FtcGxlcyk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTEzLDYgKzEyNSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDIpKTsgLy8gMzIgYml0IGRhdGEsIHN0ZXJlbwogICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIGlmKHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTyl7CisgICAgICAgICAgICAgICAgTW9ub1RvMklfRmxvYXQocElucHV0LCBwT3V0cHV0LCBOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKSk7IC8vIDMyIGJpdCBkYXRhLCBzdGVyZW8KKyAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7CkBAIC0xNDMsOSArMTY0LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBSZXZlcmJCbG9jayhwSW5wdXQsIHBPdXRwdXQsIHBMVlJFVl9Qcml2YXRlLCAoTFZNX1VJTlQxNilTYW1wbGVzVG9Qcm9jZXNzKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIHBJbnB1dCAgPSAoTFZNX0ZMT0FUICopKHBJbnB1dCArIChTYW1wbGVzVG9Qcm9jZXNzICogZm9ybWF0KSk7CisgICAgICAgIHBPdXRwdXQgPSAoTFZNX0ZMT0FUICopKHBPdXRwdXQgKyAoU2FtcGxlc1RvUHJvY2VzcyAqIDIpKTsgICAgICAvLyBBbHdheXMgc3RlcmVvIG91dHB1dAorI2Vsc2UKICAgICAgICAgcElucHV0ICA9IChMVk1fSU5UMzIgKikocElucHV0ICsoU2FtcGxlc1RvUHJvY2Vzcypmb3JtYXQpKTsKLSAgICAgICAgcE91dHB1dCA9IChMVk1fSU5UMzIgKikocE91dHB1dCsoU2FtcGxlc1RvUHJvY2VzcyoyKSk7ICAgICAgLy8gQWx3YXlzIHN0ZXJlbyBvdXRwdXQKKyAgICAgICAgcE91dHB1dCA9IChMVk1fSU5UMzIgKikocE91dHB1dCsoU2FtcGxlc1RvUHJvY2VzcyoyKSk7CisjZW5kaWYKICAgICB9CiAKICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKQEAgLTE3NSw3ICsyMDAsNyBAQAogLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIFJldmVyYkJsb2NrKExWTV9JTlQzMiAqcElucHV0LCBMVk1fSU5UMzIgKnBPdXRwdXQsIExWUkVWX0luc3RhbmNlX3N0ICpwUHJpdmF0ZSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKQogewogICAgIExWTV9JTlQxNiAgIGosIHNpemU7CkBAIC00NzksNyArNTA0LDMyMiBAQAogCiAgICAgcmV0dXJuOwogfQorI2Vsc2UKK3ZvaWQgUmV2ZXJiQmxvY2soTFZNX0ZMT0FUICpwSW5wdXQsIExWTV9GTE9BVCAqcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2Vfc3QgKnBQcml2YXRlLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpCit7CisgICAgTFZNX0lOVDE2ICAgaiwgc2l6ZTsKKyAgICBMVk1fRkxPQVQgICAqcERlbGF5TGluZTsKKyAgICBMVk1fRkxPQVQgICAqcERlbGF5TGluZUlucHV0ID0gcFByaXZhdGUtPnBTY3JhdGNoOworICAgIExWTV9GTE9BVCAgICpwU2NyYXRjaCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKKyAgICBMVk1fRkxPQVQgICAqcEluOworICAgIExWTV9GTE9BVCAgICpwVGVtcCA9IHBQcml2YXRlLT5wSW5wdXRTYXZlOworICAgIExWTV9JTlQzMiAgIE51bWJlck9mRGVsYXlMaW5lczsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBBbGwgY2FsY3VsYXRpb25zIHdpbGwgZ28gaW50byB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgcFRlbXAsIHRoaXMgd2lsbCAgICAqCisgICAgICogdGhlbiBiZSBtaXhlZCB3aXRoIHRoZSBvcmlnaW5hbCBpbnB1dCB0byBjcmVhdGUgdGhlIGZpbmFsIG91dHB1dC4gICAgICAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiBXaGVuIElOUExBQ0UgcHJvY2Vzc2luZyBpcyBzZWxlY3RlZCB0aGlzIG11c3QgYmUgYSB0ZW1wb3JhcnkgYnVmZmVyIGFuZCAgICAqCisgICAgICogaGVuY2UgdGhpcyBpcyB0aGUgd29yc3QgY2FzZSwgc28gZm9yIHNpbXBsaWNpdHkgdGhpcyB3aWxsIEFMV0FZUyBiZSBzbyAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiBUaGUgaW5wdXQgYnVmZmVyIHdpbGwgcmVtYWluIHVudG91Y2hlZCB1bnRpbCB0aGUgb3V0cHV0IG9mIHRoZSBtaXhlciBpZiAgICAqCisgICAgICogSU5QTEFDRSBwcm9jZXNzaW5nIGlzIHNlbGVjdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiBUaGUgdGVtcCBidWZmZXIgd2lsbCBhbHdheXMgYmUgTnVtU2FtcGxlcyBpbiBzaXplIHJlZ2FyZGxlc3Mgb2YgTU9OTyBvciAgICAqCisgICAgICogU1RFUkVPIGlucHV0LiBJbiB0aGUgY2FzZSBvZiBzdGVyZW8gaW5wdXQgYWxsIHByb2Nlc3NpbmcgaXMgZG9uZSBpbiBNT05PICAgKgorICAgICAqIGFuZCB0aGUgZmluYWwgb3V0cHV0IGlzIGNvbnZlcnRlZCB0byBTVEVSRU8gYWZ0ZXIgdGhlIG1peGVyICAgICAgICAgICAgICAgICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSA0OworICAgIH0KKyAgICBlbHNlIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gMTsKKyAgICB9CisKKyAgICBpZihwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pCisgICAgeworICAgICAgICBwSW4gPSBwSW5wdXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqICBTdGVyZW8gdG8gbW9ubyBjb252ZXJzaW9uCisgICAgICAgICAqLworCisgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIHBJbiA9IHBUZW1wOworICAgIH0KKworICAgIE11bHQzc19GbG9hdChwSW4sCisgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpTFZSRVZfSEVBRFJPT00sCisgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgLyoKKyAgICAgKiAgSGlnaCBwYXNzIGZpbHRlcgorICAgICAqLworICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5IUENvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgLyoKKyAgICAgKiAgTG93IHBhc3MgZmlsdGVyCisgICAgICovCisgICAgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoJnBQcml2YXRlLT5wRmFzdENvZWYtPkxQQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAKKyAgICAvKgorICAgICAqICBQcm9jZXNzIGFsbCBkZWxheSBsaW5lcworICAgICAqLworCisgICAgZm9yKGogPSAwOyBqIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBqKyspCisgICAgeworICAgICAgICBwRGVsYXlMaW5lID0gcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2pdOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFsbC1wYXNzIGZpbHRlciB3aXRoIHBvcCBhbmQgY2xpY2sgc3VwcHJlc3Npb24KKyAgICAgICAgICovCisgICAgICAgIC8qIEdldCB0aGUgc21vb3RoZWQsIGRlbGF5ZWQgb3V0cHV0LiBQdXQgaXQgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCgmcFByaXZhdGUtPk1peGVyX0FQVGFwc1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEFbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRCW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgLyogUmUtYWxpZ24gdGhlIGFsbCBwYXNzIGZpbHRlciBkZWxheSBidWZmZXIgYW5kIGNvcHlpbmcgdGhlIGZpeGVkIGRlbGF5IGRhdGEgXAorICAgICAgICAgICB0byB0aGUgQVAgZGVsYXkgaW4gdGhlIHByb2Nlc3MgKi8KKyAgICAgICAgQ29weV9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW051bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wRGVsYXlfVFtqXSwKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXMpKTsgICAgICAgICAvKiAzMi1iaXQgZGF0YSAqLworICAgICAgICAvKiBBcHBseSB0aGUgc21vb3RoZWQgZmVlZGJhY2sgYW5kIHNhdmUgdG8gZml4ZWQgZGVsYXkgaW5wdXQgKGN1cnJlbnRseSBlbXB0eSkgKi8KKyAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgLyogU3VtIGludG8gdGhlIEFQIGRlbGF5IGxpbmUgKi8KKyAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KCZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBmLCAgICAvKiBJbnZlcnQgc2luY2UgdGhlIGZlZWRiYWNrIGNvZWZmaWNpZW50IGlzIG5lZ2F0aXZlICovCisgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5EZWxheV9BUFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgLyogQXBwbHkgc21vb3RoZWQgZmVlZGZvcndhcmQgc2FuZCBzYXZlIHRvIGZpeGVkIGRlbGF5IGlucHV0IChjdXJyZW50bHkgZW1wdHkpICovCisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPkRlbGF5X0FQW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFN1bSBpbnRvIHRoZSBBUCBvdXRwdXQgKi8KKyAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KCZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgRmVlZGJhY2sgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbal0sIHBEZWxheUxpbmUsIHBEZWxheUxpbmUsIE51bVNhbXBsZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqICBMb3cgcGFzcyBmaWx0ZXIKKyAgICAgICAgICovCisgICAgICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5SZXZMUENvZWZzW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIH0KKworICAgIC8qCisgICAgICogIEFwcGx5IHJvdGF0aW9uIG1hdHJpeCBhbmQgZGVsYXkgc2FtcGxlcworICAgICAqLworICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQorICAgIHsKKworICAgICAgICBDb3B5X0Zsb2F0KHBUZW1wLAorICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7CisgICAgICAgIC8qCisgICAgICAgICAqICBSb3RhdGlvbiBtYXRyaXggbWl4CisgICAgICAgICAqLworICAgICAgICBzd2l0Y2goaikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDEgYW5kIDIgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMyBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMyBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMSBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMSBhbmQgMiBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDEgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgIFNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVElOQVRJT04qLworICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIERlbGF5IHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXQocERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAvKiAzMi1iaXQgZGF0YSAqLworICAgIH0KIAogCisgICAgLyoKKyAgICAgKiAgQ3JlYXRlIHN0ZXJlbyBvdXRwdXQKKyAgICAgKi8KKyAgICBzd2l0Y2gocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cykKKyAgICB7CisgICAgICAgIGNhc2UgTFZSRVZfREVMQVlMSU5FU180OgorICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgICAgICAgICAgSm9pblRvMmlfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMjoKKworICAgICAgICAgICAgIENvcHlfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7CisKKyAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgICAgICAgICAgIEpvaW5UbzJpX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTFZSRVZfREVMQVlMSU5FU18xOgorICAgICAgICAgICAgTW9ub1RvMklfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIC8qCisgICAgICogIERyeS93ZXQgbWl4ZXIKKyAgICAgKi8KKworICAgIHNpemUgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpOworICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5CeXBhc3NNaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICAvKiBBcHBseSBHYWluKi8KKworICAgIFNoaWZ0X1NhdF9GbG9hdChMVlJFVl9PVVRQVVRHQUlOX1NISUZULAorICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5HYWluTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKiBFbmQgb2YgZmlsZSAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYwppbmRleCBmNTg5NWE3Li5hNzE5MDUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKQEAgLTYxLDEwICs2MSwxNSBAQAogICAgICAqIENoZWNrIGFsbCBuZXcgY29udHJvbCBwYXJhbWV0ZXJzIGFyZSBpbiByYW5nZQogICAgICAqLwogICAgIGlmKCAgICAoKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocE5ld1BhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgorICAgICAgICAoCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkpICAgICAgfHwKLSAgICAgICAgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgKQorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSAgICAgIAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApCisjZW5kaWYKKyAgICAgICAgKQorICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSApCiAgICAgewogICAgICAgICByZXR1cm4gKExWUkVWX09VVE9GUkFOR0UpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKaW5kZXggNWE2ZDQzZC4uYjNlZGM2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKQEAgLTI5LDYgKzI5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBUYWJsZSB3aXRoIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcy4gIFRoZSB0YWJsZSBjYW4gYmUgaW5kZXhlZCB1c2luZyBMVk1fRnNfZW4gICAgICAgKi8KKyNpZm5kZWYgSElHSEVSX0ZTCiBjb25zdCBMVk1fVUlOVDE2IExWTV9Gc1RhYmxlW10gPSB7CiAgICAgODAwMCAsCiAgICAgMTEwMjUsCkBAIC00MCwxNCArNDEsMzcgQEAKICAgICA0NDEwMCwKICAgICA0ODAwMAogfTsKLQorI2Vsc2UKK2NvbnN0IExWTV9VSU5UMzIgTFZNX0ZzVGFibGVbXSA9IHsKKyAgICA4MDAwICwKKyAgICAxMTAyNSwKKyAgICAxMjAwMCwKKyAgICAxNjAwMCwKKyAgICAyMjA1MCwKKyAgICAyNDAwMCwKKyAgICAzMjAwMCwKKyAgICA0NDEwMCwKKyAgICA0ODAwMCwKKyAgICA5NjAwMCwKKyAgICAxOTIwMDAKK307CisjZW5kaWYKIC8qIFRhYmxlIHdpdGggc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzLiAgVGhlIHRhYmxlIGNhbiBiZSBpbmRleGVkIHVzaW5nIExWTV9Gc19lbiAgICAgICAqLworI2lmbmRlZiBISUdIRVJfRlMKIExWTV9VSU5UMTYgTFZNX0dldEZzRnJvbVRhYmxlKExWTV9Gc19lbiBGc0luZGV4KXsKICAgICBpZiAoRnNJbmRleCA+IExWTV9GU180ODAwMCkKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICByZXR1cm4gKExWTV9Gc1RhYmxlW0ZzSW5kZXhdKTsKIH0KKyNlbHNlCitMVk1fVUlOVDMyIExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCl7CisgICAgaWYgKEZzSW5kZXggPiBMVk1fRlNfMTkyMDAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAoTFZNX0ZzVGFibGVbRnNJbmRleF0pOworfQorI2VuZGlmCiAKIC8qIEluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RhbnQgaW5wdXQgYW5kIG91dCBwdXQgc2lnbmFsIHN0cmVuZ3RocwogICAgb3V0cHV0IGdhaW4vYXR0ZW51YXRpb24gaXMgYXBwbGllZC4gVGhpcyBnYWluIGRlcGVuZHMgb24gVDYwIGFuZCBSb29tcwpAQCAtNjksNiArOTMsNyBAQAogICAqLwogCiAvKiBOb3JtYWxpemluZyBvdXRwdXQgaW5jbHVkaW5nIFJldmVyYiBMZXZlbCBwYXJ0IChvbmx5IHNoaWZ0IHVwKSovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMzIgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV09e3sxLDE3NTQ3NDM0LDEyODg2NzQzNCwtMTIwOTg4ODk2LDUwNzYxMjI4LH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLDE4MjU2ODY5LDE3MjY2NjkwMiwtMTkzMTY5MjkyLDg4MzQ1NzQ0LH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLDE2NTkxMzExLDEzOTI1MDE1MSwtMTQ5NjY3MjM0LDY2NzcwMDU5LH0sCkBAIC05NCw2ICsxMTksMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezkwLDE2MDAzMzIyLDQ4MzIzNjYxLC0zNTYwNzM3OCwxMzE1Mzg3Mix9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAwLDE1OTU1MjIzLDQ4NTU4MjAxLC0zMzcwNjg2NSwxMTcxNTc5Mix9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCisjZWxzZQorY29uc3QgTFZNX0ZMT0FUIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdPXt7MSwxLjA0NTkwOWYsNy42ODEwOThmLC03LjIxMTUwMGYsMy4wMjU2MDVmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLDEuMDg4MTk0ZiwxMC4yOTE3NDlmLC0xMS41MTM3ODdmLDUuMjY1ODE3Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MywwLjk4ODkxOWYsOC4yOTk5NTZmLC04LjkyMDg2MmYsMy45Nzk4MDZmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0LDEuMDM1OTI3ZiwxMC4xODI1NjdmLC0xMC4zNDYxMzRmLDQuNTQ2NTMzZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NSwxLjEzMDMxM2YsMTIuNTM4NzI3ZiwtMTMuNjI3MDIzZiw2LjE2NTIwOGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezYsMS4wNjA3NDNmLDguMDkxNzEzZiwtOC41ODgwNzlmLDMuODM0MjMwZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NywxLjA0MDM4MWYsMTAuNDA2NTY2ZiwtMTEuMTc2NjUwZiw1LjA3NTEzMmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgsMS4wMjY5NDRmLDguMzg3MzAyZiwtOC42ODk3OTZmLDMuODk1ODYzZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OSwxLjAxMzMxMmYsOS43MjcyMzZmLC0xMC41MzQxNjVmLDQuNzQyMjcyZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAsMC45OTYwOTVmLDguNDkyMjQ5ZiwtNy45NDc2NzdmLDMuNDc4OTE3Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTMsMS4wNzkzNDZmLDguODk0NDI1ZiwtOS42NDE3NjhmLDQuNDM0NDQyZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTUsMC45OTQzMjdmLDcuNDQxMzM1ZiwtOC4wMDM5NzlmLDMuNTgxMTc3Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTcsMC45OTEwNjdmLDcuMjA4MzczZiwtNy4yNTc4NTlmLDMuMTY3Nzc0Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjAsMS4wMzM0NDVmLDcuNDc2MzcxZiwtNy41NDY5NjBmLDMuMzY5NzAzZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjUsMC45ODI4MzBmLDUuOTEzODY3ZiwtNS42Mzg0NDhmLDIuNDIwOTMyZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MzAsMC45Mjg3ODJmLDUuMDM1MzQzZiwtNC40OTIxMDRmLDEuODQ0OTA0Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NDAsMC45NTM3MTRmLDUuMDYwMjMyZiwtNC40NzIyMDRmLDEuODI5NjQyZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NTAsMC44OTkyNThmLDQuMjczMzU3ZiwtMy41Mzc0OTJmLDEuMzg3NTc2Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NjAsMC45NDM1ODRmLDQuMDkzMjI4ZiwtMy40Njk2NThmLDEuNDEwOTExZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NzAsMC45MjYwMjFmLDMuOTczMTI1ZiwtMy4zMzE5ODVmLDEuMzQ0NjkwZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NzUsMC44OTQ4NTNmLDIuODcxNzQ3ZiwtMS40Mzg3NThmLDAuMzExODU2Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ODAsMC45MzUxMjJmLDIuOTkxODU3ZiwtMi4wMzg4ODJmLDAuNjg2Mzk1Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OTAsMC45NTM4NzJmLDIuODgwMzE1ZiwtMi4xMjIzNjVmLDAuNzg0MDMyZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAwLDAuOTUxMDA1ZiwyLjg5NDI5NGYsLTIuMDA5MDg2ZiwwLjY5ODMxNmYsfSwKK307CisjZW5kaWYKIC8qIEVuZCBvZiBmaWxlICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmgKaW5kZXggNWY5OTNiZC4uMDY1ODE4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmgKQEAgLTM3LDEwICszNywxOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBISUdIRVJfRlMKIGV4dGVybiBjb25zdCAgICBMVk1fVUlOVDE2ICBMVk1fRnNUYWJsZVtdOwogZXh0ZXJuICAgICAgICAgIExWTV9VSU5UMTYgIExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCk7Ci1leHRlcm4gICAgICAgICAgTFZNX0lOVDMyICAgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV07CisjZWxzZQorZXh0ZXJuIGNvbnN0ICAgIExWTV9VSU5UMzIgIExWTV9Gc1RhYmxlW107CitleHRlcm4gICAgICAgICAgTFZNX1VJTlQzMiAgTFZNX0dldEZzRnJvbVRhYmxlKExWTV9Gc19lbiBGc0luZGV4KTsKKyNlbmRpZgogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCitleHRlcm4gICAgICAgICAgTFZNX0lOVDMyICAgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV07CisjZWxzZQorZXh0ZXJuICAgICAgICAgIExWTV9GTE9BVCAgIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdOworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaAppbmRleCBhNjc1Y2IyLi4yMDM4ZmJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaApAQCAtMjE2LDExICsyMTYsMTcgQEAKIC8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgQXVkaW9UaW1lICAgICAgICAgICAgICk7CisjZWxzZQogTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgQXVkaW9UaW1lICAgICAgICAgICAgICk7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRTcGVjdHJ1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmMKaW5kZXggY2Q1ZjY5Yy4uZjZjNGVhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jCkBAIC0yOCw2ICsyOCwxNSBAQAogTFZQU0FfUkVUVVJOIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICpwRmlsdGVyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpOworCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgKnBDb2VmZmljaWVudHMpOworI2Vsc2UKIExWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgKnBGaWx0ZXJQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpOwpAQCAtMzksNyArNDgsNyBAQAogTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAqcEZpbHRlclBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZmZpY2llbnRzKTsKLQorI2VuZGlmCiBMVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGQ29lZmZpY2llbnRzKCBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApOwogCkBAIC0xNzksNyArMTg4LDExIEBACiAgICAgTFZNX1VJTlQxNiBGcmVxOwogICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgIFBhcmFtczsKICAgICBleHRlcm4gTFZNX0lOVDE2ICAgICAgICBMVlBTQV9uU2FtcGxlc0J1ZmZlclVwZGF0ZVtdOworI2lmbmRlZiBISUdIRVJfRlMKICAgICBleHRlcm4gTFZNX1VJTlQxNiAgICAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107CisjZWxzZQorICAgIGV4dGVybiBMVk1fVUlOVDMyICAgICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsKKyNlbmRpZgogICAgIGV4dGVybiBMVk1fVUlOVDE2ICAgICAgIExWUFNBX0Rvd25TYW1wbGluZ0ZhY3RvcltdOwogCiAKQEAgLTI2Nyw4ICsyODAsMTEgQEAKIExWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlICggICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKQogewotCisjaWZuZGVmIEhJR0hFUl9GUwogICAgIGV4dGVybiBMVk1fVUlOVDE2ICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyNlbHNlCisgICAgZXh0ZXJuIExWTV9VSU5UMzIgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107ICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSB0YWJsZSAqLworI2VuZGlmCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICBpaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYmFuZCBpbmRleCAqLwogICAgIExWTV9VSU5UMzIgICAgICAgICAgZnMgPSAoTFZNX1VJTlQzMilMVlBTQV9TYW1wbGVSYXRlVGFiWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkZzXTsgICAgICAvKiBTYW1wbGUgcmF0ZSAqLwogICAgIExWTV9VSU5UMzIgICAgICAgICAgZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGNlbnRyZSBmcmVxdWVuY3kgKi8KQEAgLTM0MiwyNiArMzU4LDQyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgICAgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOgogICAgICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOwogCiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGRvdWJsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAmcEluc3QtPnBCUF9JbnN0YW5jZXNbaWldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBCUF9UYXBzW2lpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisjZWxzZQorICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGRvdWJsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAmcEluc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBCUF9UYXBzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisjZW5kaWYKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSAgICBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6CiAgICAgICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CiAKICAgICAgICAgICAgICAgICAvKgpAQCAtMzc0LDkgKzQwNiwyNiBAQAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICgmcEluc3QtPnBCUF9JbnN0YW5jZXNbaWldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBCUF9UYXBzW2lpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisjZWxzZQorICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwUGFyYW1zLT5GcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICgmcEluc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBCUF9UYXBzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisjZW5kaWYKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDA5LDE4ICs0NTgsMzEgQEAKIHsKICAgICBMVk1fVUlOVDE2ICAgICBpaTsKICAgICBMVk1fRnNfZW4gICAgICBGcyA9IHBQYXJhbXMtPkZzOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIFFQRF9DMzJfQ29lZnMgICpwQ29lZmZpY2llbnRzOwogICAgIGV4dGVybiAgICAgICAgIFFQRF9DMzJfQ29lZnMgICAgIExWUFNBX1FQRF9Db2Vmc1tdOwogCi0KICAgICBwQ29lZmZpY2llbnRzID0gJkxWUFNBX1FQRF9Db2Vmc1socFBhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCAqIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKSArIEZzXTsKKyNlbHNlCisgICAgUVBEX0ZMT0FUX0NvZWZzICAqcENvZWZmaWNpZW50czsKKyAgICBleHRlcm4gICAgICAgICBRUERfRkxPQVRfQ29lZnMgICAgIExWUFNBX1FQRF9GbG9hdF9Db2Vmc1tdOworCisgICAgcENvZWZmaWNpZW50cyA9ICZMVlBTQV9RUERfRmxvYXRfQ29lZnNbKHBQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9OUl9TVVBQT1JURURfUkFURSkgKyBGc107CisjZW5kaWYKIAogCiAgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspCiAgICAgewotICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgKCZwSW5zdC0+cFFQRF9TdGF0ZXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cFFQRF9UYXBzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmZpY2llbnRzICk7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExWUFNBX1FQRF9Jbml0ICgmcEluc3QtPnBRUERfU3RhdGVzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cFFQRF9UYXBzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmZmljaWVudHMgKTsKKyNlbHNlCisgICAgICAgIExWUFNBX1FQRF9Jbml0X0Zsb2F0ICgmcEluc3QtPnBRUERfU3RhdGVzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cFFQRF9UYXBzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmZmljaWVudHMgKTsKKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybihMVlBTQV9PSyk7CkBAIC00NjAsNiArNTIyLDg3IEBACiAvKiAgICAgb2YgdGhlIG4gYmFuZHMgZXF1YWxpemVyIChMVkVRTkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgICpwRmlsdGVyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAqcENvZWZmaWNpZW50cykKK3sKKworICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X0Nvc0NvZWZbXTsKKworCisgICAgLyoKKyAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICBUMDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEQ7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBBMDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIxOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjI7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBEdDA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMl9EZW47CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMl9OdW07CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBDT1NfVDA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBjb2VmOworICAgIExWTV9GTE9BVCAgICAgICAgICAgZmFjdG9yOworICAgIExWTV9GTE9BVCAgICAgICAgICAgdDA7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBpOworCisKKyAgICAvKgorICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgRnJlcXVlbmN5ICAgPSAoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5DZW50ZXJGcmVxdWVuY3kpOworICAgIExWTV9GTE9BVCAgICAgICAgICBRRmFjdG9yICAgICA9ICgoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5RRmFjdG9yKSkgLyAxMDA7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgICAgICovCisgICAgVDAgPSBGcmVxdWVuY3kgKiBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtGc107ICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLworICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAorICAgICAqLworICAgIER0MCA9ICBUMCAvIDIwNDggOworICAgIEIyX0RlbiA9IFFGYWN0b3IgKyBEdDA7CisgICAgQjJfTnVtID0gRHQwIC0gUUZhY3RvcjsKKyAgICBCMiA9IEIyX051bSAvICgyICogQjJfRGVuKTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBjb3NpbmUgYnkgYSBwb2x5bm9taWFsIGV4cGFuc2lvbiB1c2luZyB0aGUgZXF1YXRpb246CisgICAgICoKKyAgICAgKiAgQ29zICs9IGNvZWYobikgKiB0MF5uICAgICAgICAgICAgICAgICAgIEZvciBuID0gMCB0byA2CisgICAgICovCisgICAgVDAgPSAoVDAgLyAyMDQ4KSAqIDAuNjM2NTg1NThmOyAgICAgICAgICAgICAgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy8yICovCisgICAgdDAgPSBUMCA7CisgICAgZmFjdG9yID0gMS4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENPU19UMCA9IDAuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaSA9IDE7IGkgPCA3OyBpKyspCisgICAgeworICAgICAgICBjb2VmICAgID0gTFZQU0FfRmxvYXRfQ29zQ29lZltpXTsgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBudGggY29lZmZpY2llbnQgKi8KKyAgICAgICAgQ09TX1QwICs9IChmYWN0b3IgKiBjb2VmKTsgICAgICAgICAvKiBUaGUgbnRoIHBhcnRpYWwgc3VtICovCisgICAgICAgIGZhY3RvciAgPSAoZmFjdG9yICogdDApIDsgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0MF5uICovCisgICAgfQorICAgIENPU19UMCA9IENPU19UMCAqIDg7ICAgIC8qTFZQU0FfQ29zQ29lZl9mbG9hdFswXSovICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworCisKKyAgICBCMSA9ICgoTFZNX0ZMT0FUKTAuNSAtIEIyKSAqIChDT1NfVDApOyAgICAvKiBCMSA9ICgwLjUgLSBiMikgKiBjb3ModDApICovCisgICAgQTAgPSAoKExWTV9GTE9BVCkwLjUgKyBCMikgLyAyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyKSAvIDIgKi8KKworICAgIC8qCisgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwQ29lZmZpY2llbnRzLT5BMCA9IEEwICogMjsKKyAgICBwQ29lZmZpY2llbnRzLT5CMSA9IEIxICogMjsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IEIyICogMjsKKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisjZWxzZQogTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKCAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAqcEZpbHRlclBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICAqcENvZWZmaWNpZW50cykKQEAgLTU0MSw3ICs2ODQsNyBAQAogCiAgICAgcmV0dXJuKExWUFNBX09LKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01ODQsNiArNzI3LDkwIEBACiAvKiAgICAgb2YgdGhlIG4gYmFuZHMgZXF1YWxpemVyIChMVkVRTkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyggICBMVk1fVUlOVDE2ICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICpwRmlsdGVyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAqcENvZWZmaWNpZW50cykKK3sKKworICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X0RQQ29zQ29lZltdOworCisgICAgLyoKKyAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICBUMDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEQ7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBBMDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIxOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjI7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBEdDA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMl9EZW47CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMl9OdW07CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBDb3NFcnI7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBjb2VmOworICAgIExWTV9GTE9BVCAgICAgICAgICAgZmFjdG9yOworICAgIExWTV9GTE9BVCAgICAgICAgICAgdDA7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBpOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgIEZyZXF1ZW5jeSAgID0gKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+Q2VudGVyRnJlcXVlbmN5KTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgUUZhY3RvciAgICAgPSAoKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+UUZhY3RvcikpIC8gMTAwOworCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgICAgICovCisgICAgVDAgPSBGcmVxdWVuY3kgKiBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtGc107ICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgRCA9IDMyMDA7ICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICgxKjEwMCoyXjUpICovCisgICAgICAgICAgICAgICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgRHQwID0gIFQwIC8gMjA0OCA7CisgICAgQjJfRGVuID0gUUZhY3RvciArIER0MDsKKyAgICBCMl9OdW0gPSBEdDAgLSBRRmFjdG9yOworICAgIEIyID0gQjJfTnVtIC8gKDIgKiBCMl9EZW4pOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBlcnJvciBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKKyAgICAgKgorICAgICAqICBDb3NFcnIgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDQKKyAgICAgKi8KKyAgICBUMCA9IFQwICogMC45OTQ3NTBmOyAgICAgICAgICAgICAgICAgICAgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy81MCAqLworICAgIHQwID0gVDA7CisgICAgZmFjdG9yID0gMS4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENvc0VyciA9IDAuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgeworICAgICAgICBjb2VmID0gTFZQU0FfRmxvYXRfRFBDb3NDb2VmW2ldOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBudGggY29lZmZpY2llbnQgKi8KKyAgICAgICAgQ29zRXJyICs9IGZhY3RvciAqIGNvZWY7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgPSBmYWN0b3IgKiB0MDsgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0MF5uICovCisgICAgfQorICAgIENvc0VyciA9IENvc0VyciAqIDI7ICAgICAgICAgIC8qIENvcnJlY3QgdGhlIHNjYWxpbmcgKi8KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMSBhbmQgQTAgY29lZmZpY2llbnRzCisgICAgICovCisgICAgQjEgPSAoKExWTV9GTE9BVCkwLjUgLSBCMik7ICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIpICovCisgICAgQTAgPSBCMSAqIENvc0VyciA7ICAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIGZvciAoMC41IC0gYjIpICogY29zZXJyKHQwKSAqLworICAgIEIxIC09IEEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIpICogKDEgLSBjb3NlcnIodDApKSAgKi8KKyAgICBBMCA9ICgoTFZNX0ZMT0FUKTAuNSAgKyBCMikgLyAyOyAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSBBMDsKKyAgICBwQ29lZmZpY2llbnRzLT5CMSA9IEIxOworICAgIHBDb2VmZmljaWVudHMtPkIyID0gQjI7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorI2Vsc2UKIExWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyggICBMVk1fVUlOVDE2ICAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgKnBGaWx0ZXJQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgKnBDb2VmZmljaWVudHMpCkBAIC02NjYsNyArODkzLDcgQEAKIAogICAgIHJldHVybihMVlBTQV9PSyk7CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjkwLDExICs5MTcsMTcgQEAKIAogICAgIC8qIEJhbmQgUGFzcyBmaWx0ZXJzIHRhcHMgKi8KICAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCAqKXBJbnN0LT5wQlBfVGFwczsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGZvcihpID0gMDsgaSA8IHBJbnN0LT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QpOyBpKyspCisgICAgeworICAgICAgICBwVGFwQWRkcmVzc1tpXSA9IDA7CisgICAgfQorI2Vsc2UKICAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfVGFwc190KTsgaSsrKQogICAgIHsKICAgICAgICAgcFRhcEFkZHJlc3NbaV0gPSAwOwogICAgIH0KLQorI2VuZGlmCiAgICAgLyogUXVhc2ktcGVhayBmaWx0ZXJzIHRhcHMgKi8KICAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCAqKXBJbnN0LT5wUVBEX1RhcHM7CiAgICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KTsgaSsrKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMKaW5kZXggMjdhNGJjMy4uMWMyNjg2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jCkBAIC00Nyw3ICs0NywxMSBAQAogICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgICAqcExWUFNBX0luc3Q7CiAgICAgTFZQU0FfUkVUVVJOICAgICAgICAgICAgICAgIGVycm9yQ29kZSAgICAgICA9IExWUFNBX09LOwogICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBpaTsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBleHRlcm4gTFZNX0lOVDE2ICAgICAgICAgICAgTFZQU0FfR2FpblRhYmxlW107CisjZWxzZQorICAgIGV4dGVybiBMVk1fRkxPQVQgICAgICAgICAgICBMVlBTQV9GbG9hdF9HYWluVGFibGVbXTsKKyNlbmRpZgogICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBCdWZmZXJMZW5ndGggPSAwOwogCiAgICAgLyogSW50c19BbGxvYyBpbnN0YW5jZXMsIG5lZWRlZCBmb3IgbWVtb3J5IGFsaWdubWVudCBtYW5hZ2VtZW50ICovCkBAIC0xNDEsMTkgKzE0NSwzNyBAQAogCiAKICAgICAvKiBBc3NpZ24gdGhlIHBvaW50ZXJzICovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyAgICAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQxNikgKTsKKyNlbHNlCisgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnMgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSApOworI2VuZGlmCiAgICAgcExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0ZpbHRlclBhcmFtX3QpICk7CiAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCAqIHNpemVvZihMVk1fVUlOVDgpICk7CiAgICAgcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9VSU5UOCkgKTsKICAgICBwTFZQU0FfSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbiAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4pICk7Ci0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlcyAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSApOwogICAgIHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcyAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1N0YXRlX3QpICk7CisjZWxzZQorICAgIHBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICk7CisgICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihRUERfRkxPQVRfU3RhdGVfdCkgKTsKKyNlbmRpZgogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUFNBX0luc3QtPnBCUF9UYXBzICAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKTsKICAgICBwTFZQU0FfSW5zdC0+cFFQRF9UYXBzICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpICk7CiAKKyNlbHNlCisgICAgcExWUFNBX0luc3QtPnBCUF9UYXBzICAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKKyAgICBwTFZQU0FfSW5zdC0+cFFQRF9UYXBzICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFFQRF9GTE9BVF9UYXBzX3QpICk7CisjZW5kaWYKIAogICAgIC8qIENvcHkgZmlsdGVycyBwYXJhbWV0ZXJzIGluIHRoZSBwcml2YXRlIGluc3RhbmNlICovCiAgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQpAQCAtMTY0LDcgKzE4NiwxMiBAQAogICAgIC8qIFNldCBQb3N0IGZpbHRlcnMgZ2FpbnMqLwogICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW2lpXSA9KExWTV9VSU5UMTYpIExWUFNBX0dhaW5UYWJsZVtwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICsgMTVdOworI2Vsc2UKKyAgICAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnNbaWldID0gTFZQU0FfRmxvYXRfR2FpblRhYmxlWzE1ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluXTsKKyNlbmRpZgogICAgIH0KICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYwppbmRleCAwOTg0YjEwLi4wNmE4ZjlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jCkBAIC0xMDYsNyArMTA2LDExIEBACiAgICAgICAgICAqLwogCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgc2l6ZW9mKExWUFNBX0luc3RhbmNlUHJfdCkgKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX0ZMT0FUKSApOworI2Vsc2UKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9VSU5UMTYpICk7CisjZW5kaWYKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0ZpbHRlclBhcmFtX3QpICk7CiAKICAgICAgICAgewpAQCAtMTM0LDcgKzEzOCwxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQogICAgICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJlNjcmF0Y2gsIDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0lOVDE2KSApOworI2Vsc2UKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJlNjcmF0Y2gsIDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0ZMT0FUKSApOworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJlNjcmF0Y2gpOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgID0gTFZQU0FfU0NSQVRDSDsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpAQCAtMTQyLDggKzE1MCwxMyBAQAogICAgICAgICAvKgogICAgICAgICAgKiBQZXJzaXN0ZW50IGNvZWZmaWNpZW50cyBtZW1vcnkKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSApOwogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkgKTsKKyNlbHNlCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfRkxPQVRfU3RhdGVfdCkgKTsKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkNvZWYpOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVlBTQV9QRVJTSVNURU5UX0NPRUY7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpAQCAtMTUxLDggKzE2NCwxMyBAQAogICAgICAgICAvKgogICAgICAgICAgKiBQZXJzaXN0ZW50IGRhdGEgbWVtb3J5CiAgICAgICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCkgKTsKKyNlbHNlCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfRkxPQVRfVGFwc190KSApOworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmRGF0YSk7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWUFNBX1BFUlNJU1RFTlRfREFUQTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaAppbmRleCAwMzUyMmZiLi5hNzUwYmIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKQEAgLTQzLDggKzQzLDExIEBACiAjZGVmaW5lIExWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUYgIDEgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBjb2VmZmljaWVudHMgIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICovCiAjZGVmaW5lIExWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEEgIDIgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCB0YXBzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAgICAgICAgICovCiAjZGVmaW5lIExWUFNBX01FTVJFR0lPTl9TQ1JBVENIICAgICAgICAgIDMgICAgICAvKiBPZmZzZXQgdG8gc2NyYXRjaCAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgOSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDQ4MDAwSHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgSElHSEVSX0ZTCisjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDkgICAgICAvKiBGcm9tIDgwMDBIeiB0byA0ODAwMEh6Ki8KKyNlbHNlCisjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDExICAgICAgLyogRnJvbSA4MDAwSHogdG8gMTkyMDAwSHoqLworI2VuZGlmCiAjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9TUEVFRCAgICAgICAgIDMgICAgICAvKiBMT1csIE1FRElVTSwgSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKICNkZWZpbmUgTFZQU0FfTUFYQlVGRkVSRFVSQVRJT04gICAgICAgICAgNDAwMCAgIC8qIE1heGltdW0gbGVuZ3RoIGluIG1zIG9mIHRoZSBsZXZlbHMgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTkzLDEyICs5NiwyNyBAQAogICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICBNZW1vcnlUYWJsZTsKIAogICAgIExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuICpwQlBGaWx0ZXJzUHJlY2lzaW9uOyAgICAgICAgICAgICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZmlsdGVyIHByZWNpc2lvbiBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgICpwQlBfSW5zdGFuY2VzOyAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgYmFuZCBwYXNzIGZpbHRlciBpbnN0YW5jZSBmb3IgZWFjaCBiYW5kICAgICAqLwogICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgICpwQlBfVGFwczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgYmFuZCBwYXNzIGZpbHRlciB0YXBzIGZvciBlYWNoIGJhbmQgICAgICAgICAqLwogICAgIFFQRF9TdGF0ZV90ICAgICAgICAgICAgICAgICpwUVBEX1N0YXRlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgUVBEIGZpbHRlciBpbnN0YW5jZSBmb3IgZWFjaCBiYW5kICAgICAgICAgICAqLwogICAgIFFQRF9UYXBzX3QgICAgICAgICAgICAgICAgICpwUVBEX1RhcHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgUVBEIGZpbHRlciB0YXBzIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgICAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICpwUG9zdEdhaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgcG9zdC1maWx0ZXIgZ2FpbnMgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAqLworI2Vsc2UKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAqcEJQX0luc3RhbmNlczsKKyAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgYmFuZCBwYXNzIGZpbHRlciB0YXBzIGZvciBlYWNoIGJhbmQgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAqcEJQX1RhcHM7CisgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAqLworICAgIFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgICAgICAgICAgICpwUVBEX1N0YXRlczsKKyAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgUVBEIGZpbHRlciB0YXBzIGZvciBlYWNoIGJhbmQgKi8KKyAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAgICAgICAgICAqcFFQRF9UYXBzOworI2VuZGlmCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAqcFBvc3RHYWluczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHBvc3QtZmlsdGVyIGdhaW5zIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgKi8KKyNlbHNlCisgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHBvc3QtZmlsdGVyIGdhaW5zIGZvciBlYWNoIGJhbmQgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcFBvc3RHYWluczsKKyNlbmRpZgogICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgICAgICpwRmlsdGVyc1BhcmFtczsgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IG9mIHRoZSBmaWx0ZXJzIHBhcmFtZXRlcnMgZnJvbSB0aGUgaW5wdXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jCmluZGV4IDllMjlmNjguLmVhNWY3NGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYwpAQCAtNDMsNiArNDMsOTYgQEAKIC8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgQXVkaW9UaW1lICAgICAgICAgICAgKQorCit7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGlpOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEF1ZGlvVGltZUluYzsKKyAgICBleHRlcm4gTFZNX1VJTlQzMiAgICAgICBMVlBTQV9TYW1wbGVSYXRlSW52VGFiW107CisgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBXcml0ZV9TYXZlOyAgICAgICAgIC8qIFBvc2l0aW9uIG9mIHRoZSB3cml0ZSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2Nlc3MgICovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0hFQ0sgUEFSQU1FVEVSUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYoaEluc3RhbmNlID09IExWTV9OVUxMIHx8IHBMVlBTQV9JbnB1dFNhbXBsZXMgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKyAgICBpZihJbnB1dEJsb2NrU2l6ZSA9PSAwIHx8IElucHV0QmxvY2tTaXplID4gcExWUFNBX0luc3QtPk1heElucHV0QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgfQorCisgICAgcFNjcmF0Y2ggPSAoTFZNX0ZMT0FUKilwTFZQU0FfSW5zdC0+TWVtb3J5VGFibGUuUmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7CisgICAgcFdyaXRlX1NhdmUgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBBUFBMWSBORVcgU0VUVElOR1MgSUYgTkVFREVECisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPSAwOworICAgICAgICBMVlBTQV9BcHBseU5ld1NldHRpbmdzKCBwTFZQU0FfSW5zdCk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFBST0NFU1MgU0FNUExFUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogUHV0IHNhbXBsZXMgaW4gcmFuZ2UgWy0wLjU7MC41WyBmb3IgQlAgZmlsdGVycyAoc2VlIEJpcXVhZHMgZG9jdW1lbnRhdGlvbikgKi8KKyAgICBDb3B5X0Zsb2F0KHBMVlBTQV9JbnB1dFNhbXBsZXMsIHBTY3JhdGNoLCAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKyAgICBTaGlmdF9TYXRfRmxvYXQoLTEsIHBTY3JhdGNoLCBwU2NyYXRjaCwgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKKyAgICB7CisgICAgICAgIHN3aXRjaChwTFZQU0FfSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOgorICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICAoICZwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXI6CisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgICggJnBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgICAoIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaSk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFVQREFURSBTcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIT0gcFdyaXRlX1NhdmUpCisgICAgeworICAgICAgICBNVUwzMngzMklOVE8zMigoQXVkaW9UaW1lICsgKExWTV9JTlQzMikoKExWTV9JTlQzMilwTFZQU0FfSW5zdC0+TG9jYWxTYW1wbGVzQ291bnQqMTAwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMilMVlBTQV9TYW1wbGVSYXRlSW52VGFiW3BMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZUluYywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZzSW52ZXJ0U2hpZnQpCisgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgPSBBdWRpb1RpbWUgKyBBdWRpb1RpbWVJbmM7CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKyNlbHNlCiBMVlBTQV9SRVRVUk4gTFZQU0FfUHJvY2VzcyAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpwTFZQU0FfSW5wdXRTYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgSW5wdXRCbG9ja1NpemUsCkBAIC0xMzAsNyArMjIwLDcgQEAKIAogICAgIHJldHVybihMVlBTQV9PSyk7CiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaAppbmRleCA4MzZiZmQ3Li45OWQ4NDRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCkBAIC0zMSw2ICszMSwxNSBAQAogICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29lZnNbMl07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KIH1RUERfU3RhdGVfdCwgKnBRUERfU3RhdGVfdDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGVsYXk7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZzWzJdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9UVBEX0ZMT0FUX1N0YXRlX3QsICpwUVBEX0ZMT0FUX1N0YXRlX3Q7CisjZW5kaWYKKwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgS1A7ICAgIC8qc2hvdWxkIHN0b3JlIGEwKi8KQEAgLTM4LDEyICs0NywzMCBAQAogCiB9IFFQRF9DMzJfQ29lZnMsICpQUVBEX0MzMl9Db2VmczsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBLUDsgICAgLypzaG91bGQgc3RvcmUgYTAqLworICAgIExWTV9GTE9BVCBLTTsgICAgLypzaG91bGQgc3RvcmUgYjIqLworCit9IFFQRF9GTE9BVF9Db2VmcywgKlBRUERfRkxPQVRfQ29lZnM7CisjZW5kaWYKKworCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiBTdG9yYWdlWzFdOwogCiB9IFFQRF9UYXBzX3QsICpwUVBEX1RhcHNfdDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBTdG9yYWdlWzFdOworCit9IFFQRF9GTE9BVF9UYXBzX3QsICpwUVBEX0ZMT0FUX1RhcHNfdDsKKworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02Miw2ICs4OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCk7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVlBTQV9RUERfUHJvY2Vzc19GbG9hdCAoICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAqcEluU2FtcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4KTsKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODAsOCArMTEzLDEyIEBACiB2b2lkIExWUFNBX1FQRF9Jbml0ICggICBRUERfU3RhdGVfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgUVBEX1RhcHNfdCAgICAgICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0MzMl9Db2VmcyAgICAgKnBDb2VmICAgICApOworI2lmZGVmIEJVSUxEX0ZMT0FUCiAKLQordm9pZCBMVlBTQV9RUERfSW5pdF9GbG9hdCAoICAgUVBEX0ZMT0FUX1N0YXRlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9UYXBzX3QgICAgICAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyAgICAgICAgICpwQ29lZiAgICAgKTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMKaW5kZXggNTBlMGE4MC4uMmNjMzJhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMKQEAgLTQwLDMgKzQwLDE0IEBACiAgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gID0gcENvZWYtPktQOwogICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdICA9IHBDb2VmLT5LTTsKIH0KKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWUFNBX1FQRF9Jbml0X0Zsb2F0ICggICBwUVBEX0ZMT0FUX1N0YXRlX3QgICAgICAgcFFQRF9TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9UYXBzX3QgICAgICAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfQ29lZnMgICAgICAgICAgKnBDb2VmICAgICApCit7CisgICAgcFFQRF9TdGF0ZS0+cERlbGF5ICA9IHBUYXBzLT5TdG9yYWdlOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzBdICA9ICgoTFZNX0ZMT0FUKXBDb2VmLT5LUCk7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMV0gID0gKChMVk1fRkxPQVQpcENvZWYtPktNKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuYwppbmRleCA2NzE5N2MxLi5lMjMzMTcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuYwpAQCAtMzUsMTIgKzM1LDE2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgTFZQU0FfUVBEX1dyaXRlUGVhayggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgIHBMVlBTQV9JbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAqKnBwV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFuZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZhbHVlICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAgICoqcHBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIFZhbHVlICAgKTsKIAotCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICoqcHBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgVmFsdWUgICApOworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NCw2ICs1OCw3IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIExWUFNBX1FQRF9Qcm9jZXNzICggICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW5TYW1wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCkBAIC0xNzMsNyArMTc4LDEzMSBAQAogICAgICAgICBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQgPSAoTFZNX1VJTlQxNikoLWlpKTsKICAgICB9CiB9CisjZWxzZQordm9pZCBMVlBTQV9RUERfUHJvY2Vzc19GbG9hdCAoICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAqcEluU2FtcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4KQorewogCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFBBUkFNRVRFUlMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIFFQRF9GTE9BVF9TdGF0ZV90ICpwUVBEU3RhdGUgPSAgKFFQRF9GTE9BVF9TdGF0ZV90KikmcExWUFNBX0luc3QtPnBRUERfU3RhdGVzW0JhbmRJbmRleF07CisKKyAgICAvKiBQb2ludGVyIHRvIHRhcHMgKi8KKyAgICBMVk1fRkxPQVQqIHBEZWxheSAgPSBwUVBEU3RhdGUtPnBEZWxheTsKKworICAgIC8qIFBhcmFtZXRlcnMgbmVlZGVkIGR1cmluZyBxdWFzaSBwZWFrIGNhbGN1bGF0aW9ucyAqLworICAgIExWTV9GTE9BVCAgIFgwOworICAgIExWTV9GTE9BVCAgIHRlbXAsdGVtcDI7CisgICAgTFZNX0ZMT0FUICAgYWNjdTsKKyAgICBMVk1fRkxPQVQgICBYZzA7CisgICAgTFZNX0ZMT0FUICAgRDA7CisgICAgTFZNX0ZMT0FUICAgVjAgPSAoTFZNX0ZMT0FUKSgqcERlbGF5KTsKKworICAgIC8qIEZpbHRlcidzIGNvZWYgKi8KKyAgICBMVk1fRkxPQVQgICBLcCA9ICgoTFZNX0ZMT0FUKShwUVBEU3RhdGUtPkNvZWZzWzBdKSk7CisgICAgTFZNX0ZMT0FUICAgS20gPSAoKExWTV9GTE9BVCkocFFQRFN0YXRlLT5Db2Vmc1sxXSkpOworCisgICAgTFZNX0lOVDE2ICAgaWkgPSBudW1TYW1wbGVzOworCisgICAgTFZNX1VJTlQ4ICAqcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CisgICAgTFZNX0lOVDMyICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gcExWUFNBX0luc3QtPkJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudDsKKyAgICBMVk1fVUlOVDE2ICBEb3duU2FtcGxpbmdGYWN0b3IgPSBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nRmFjdG9yOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIElOSVRJQUxJWkFUSU9OCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBDb3JyZWN0IHRoZSBwb2ludGVyIHRvIHRha2UgdGhlIGZpcnN0IGRvd24gc2FtcGxlZCBzaWduYWwgc2FtcGxlICovCisgICAgcEluU2FtcHMgKz0gcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50OworICAgIC8qIENvcnJlY3QgYWxzbyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICBpaSA9IChMVk1fSU5UMTYpKGlpIC0gKExWTV9JTlQxNilwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQpOworCisgICAgd2hpbGUgKGlpID4gMCkKKyAgICB7CisgICAgICAgIC8qIEFwcGx5IHBvc3QgZ2FpbiAqLworICAgICAgICAvKiAtIDEgdG8gY29tcGVuc2F0ZSBzY2FsaW5nIGluIHByb2Nlc3MgZnVuY3Rpb24qLworICAgICAgICBYMCA9ICgqcEluU2FtcHMpICogcExWUFNBX0luc3QtPnBQb3N0R2FpbnNbQmFuZEluZGV4XTsKKyAgICAgICAgcEluU2FtcHMgPSBwSW5TYW1wcyArIERvd25TYW1wbGluZ0ZhY3RvcjsKKworICAgICAgICAvKiBTYXR1cmF0ZSBhbmQgdGFrZSBhYnNvbHV0ZSB2YWx1ZSAqLworICAgICAgICBpZihYMCA8IDAuMGYpCisgICAgICAgICAgICBYMCA9IC1YMDsKKyAgICAgICAgaWYgKFgwID4gMS4wZikKKyAgICAgICAgICAgIFhnMCA9IDEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFhnMCA9WDA7CisKKworICAgICAgICAvKiBRdWFzaSBwZWFrIGZpbHRlciBjYWxjdWxhdGlvbiAqLworICAgICAgICBEMCAgPSBYZzAgLSBWMDsKKworICAgICAgICB0ZW1wMiA9IEQwOworCisgICAgICAgIGFjY3UgPSB0ZW1wMiAqIEtwOworICAgICAgICBEMCAgICA9IEQwIC8gMi4wZjsKKyAgICAgICAgaWYgKEQwIDwgMC4wZil7CisgICAgICAgICAgICBEMCA9IC1EMDsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXAyID0gRDA7CisKKyAgICAgICAgdGVtcCA9IEQwICogS207CisgICAgICAgIGFjY3UgKz0gdGVtcCArIFhnMDsKKworICAgICAgICBpZiAoYWNjdSA+IDEuMGYpCisgICAgICAgICAgICBhY2N1ID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZihhY2N1IDwgMC4wZikKKyAgICAgICAgICAgIGFjY3UgPSAwLjBmOworCisgICAgICAgIFYwID0gYWNjdTsKKworICAgICAgICBpZigoKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSAtIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCkgPCBEb3duU2FtcGxpbmdGYWN0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KCBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMCk7CisKKyAgICAgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCAtPSBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGU7CisgICAgICAgICAgICBwTFZQU0FfSW5zdC0+TG9jYWxTYW1wbGVzQ291bnQgPSAoTFZNX1VJTlQxNikobnVtU2FtcGxlcyAtIGlpKTsKKyAgICAgICAgfQorICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgKz0gRG93blNhbXBsaW5nRmFjdG9yOworCisgICAgICAgIGlpID0gKExWTV9JTlQxNikoaWkgLSBEb3duU2FtcGxpbmdGYWN0b3IpOworCisgICAgfQorCisgICAgLyogU3RvcmUgbGFzdCB0YXBzIGluIG1lbW9yeSAqLworICAgICpwRGVsYXkgPSBWMDsKKworICAgIC8qIElmIHRoaXMgaXMgdGhlIGxhc3QgY2FsbCB0byB0aGUgZnVuY3Rpb24gYWZ0ZXIgbGFzdCBiYW5kIHByb2Nlc3NpbmcsCisgICAgICAgdXBkYXRlIHRoZSBwYXJhbWV0ZXJzLiAqLworICAgIGlmKEJhbmRJbmRleCA9PSAocExWUFNBX0luc3QtPm5SZWxldmFudEZpbHRlcnMgLSAxKSkKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcFdyaXRlOworICAgICAgICAvKiBBZGp1c3RtZW50IGZvciAxMTAyNUh6IGlucHV0LCAyMjAsNSBpcyBub3JtYWxseQorICAgICAgICAgICB0aGUgZXhhY3QgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIDIwbXMuKi8KKyAgICAgICAgaWYoKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZSkmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GcyA9PSBMVk1fRlNfMTEwMjUpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPT0gMjIwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9IDIyMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPSAyMjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwV3JpdGU7CisgICAgICAgIHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgPSBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7CisgICAgICAgIHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudCA9IChMVk1fVUlOVDE2KSgtaWkpOworICAgIH0KK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfV3JpdGVQZWFrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjA5LDQgKzMzOCwyMyBAQAogICAgICpwcFdyaXRlID0gcFdyaXRlOwogCiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqKnBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFZhbHVlICAgKQoreworICAgIExWTV9VSU5UOCAqcFdyaXRlID0gKnBwV3JpdGU7CiAKKyAgICAvKiBXcml0ZSB0aGUgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlciAqLworICAgICoocFdyaXRlICsgQmFuZEluZGV4KSA9IChMVk1fVUlOVDgpKFZhbHVlICogMjU2KTsKKyAgICBwV3JpdGUgKz0gcExWUFNBX0luc3QtPm5CYW5kczsKKyAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsgcExWUFNBX0luc3QtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpKQorICAgIHsKKyAgICAgICAgcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKKyAgICB9CisKKyAgICAqcHBXcml0ZSA9IHBXcml0ZTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCmluZGV4IDIxYTVkOGQuLjEyODc1MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKQEAgLTM0LDYgKzM0LDcgQEAKICAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAogICogZnJlcXVlbmN5CiAgKi8KKyNpZm5kZWYgSElHSEVSX0ZTCiBjb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXSA9IHsgICA4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLApAQCAtNDMsNiArNDQsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMH07ICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisjZWxzZQorY29uc3QgTFZNX1VJTlQzMiAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW10gPSB7ICAgODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTYyLDcgKzc2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODk0NzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjcxMDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDg2OTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ3Mzl9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NzM5CisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIyMzY5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExMTg1ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKIAogCkBAIC04NCw3ICsxMDMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwfTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxOTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzODQwICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERvd24gc2FtcGxpbmcgZmFjdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwMiw3ICsxMjYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgIC8qIDI0MDAwIFMvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEsICAgICAgICAgICAgICAgICAgIC8qIDMyMDAwIFMvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgICAgICAgIC8qIDQ0MTAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzJ9OyAgICAgICAgICAgICAgICAgIC8qIDQ4MDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgIC8qIDQ4MDAwIFMvcyAgKi8KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsNjQgICAgICAgICAgICAgICAgICAgLyogOTYwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMjggICAgICAgICAgICAgICAgICAvKjE5MjAwMCBTL3MgICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTIyLDggKzE1MSwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU4OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTJ9OyAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzkyCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjE5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEwOTggICAgLyogMTkya1MvcyAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgICAgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXSA9IHsgIDAuODA0Mjg0N2YsICAgICAgLyogOGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTgzNjA1NGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUzNjE3OTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MDIxNDIzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjkxNzg3NGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2ODEwNTFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMDEwNTU5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTQ1OTA4OWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEzNDAzNzJmCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjA2NzAxODZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjAzMzUwOTNmICAgIC8qIDE5MmtTL3MgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworI2VuZGlmCiAvKgogICogR2FpbiB0YWJsZQogICovCkBAIC0xNTksNiArMjEwLDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjY0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTU3Nn07ICAgICAgICAvKiArMTVkQiBnYWluICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICBMVlBTQV9GbG9hdF9HYWluVGFibGVbXT17ICAwLjE3NzczNDM3NWYsICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xOTkyMTg3NTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyMzYzMjgxMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwOTc2NTYyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yODE3MzgyODFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMxNTkxNzk2OGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzU0NDkyMTg3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zOTc5NDkyMThmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQ0NjI4OTA2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTAwOTc2NTYyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41NjIwMTE3MThmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjYzMDg1OTM3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzA3NTE5NTMxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43OTM5NDUzMTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg5MTExMzI4MWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDAwMDAwMDAwZiwgICAgICAgICAvKiAwZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyMTU4MjAzMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjU4Nzg5MDYyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40MTIxMDkzNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjU4NDQ3MjY1NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzc3ODMyMDMxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wMDAwMDAwMDBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjIzODI4MTI1MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTExNzE4NzUwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi44MTgzNTkzNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjE2MjEwOTM3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNTQ3ODUxNTYyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy45ODA5NTcwMzFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjQ2Njc5Njg3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMDExNzE4NzUwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS42NTIzNDM3NTBmfTsgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgQ29zb25lIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTgxLDcgKzI2NSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgICAgTFZQU0FfRmxvYXRfQ29zQ29lZltdID0geyAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDM4ZiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMDk4NmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MDE5Nzc1ZiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjA4MTUxNDlmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzI0MjA0MmYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjg5NjIwNmZ9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE1ICovCisjZW5kaWYKIC8qCiAgKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgZXJyb3Igd2l0aCB0aGUgZXF1YXRpb246CiAgKgpAQCAtMjAxLDcgKzI5MywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGExICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NTg2LCAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ0fTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXSA9IHsxLjBmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwODMxMWYsICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTA2MTc5OTlmLCAgICAgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEzNDI4MWZ9OyAgICAgICAgICAgICAgICAvKiBhMyAqLworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBRdWFzaSBwZWFrIGZpbHRlciBjb2VmZmljaWVudHMgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMzksMyArMzM3LDU0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEEzNzVCMkM2LDB4MUU5NDNCQkN9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMkUxRTk1MCwweDFFMkE1MzJFfX07IC8qIDQ4a1MvcyAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IFFQRF9GTE9BVF9Db2VmcyAgICAgTFZQU0FfUVBEX0Zsb2F0X0NvZWZzW10gPSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX0xPVyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTM2ODMxOTg5MzI1NTgzZiwwLjAwNjIxMzU1NjUwOTQ2NTBmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzU4MzMzMzIxMjg4MjNmLDAuMDA2MzExNTQ5MzM5NDQzNGZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTM2ODMxOTg5MzI1NTgzZiwwLjAwNjIxMzU1NjUwOTQ2NTBmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMzNjg2NjMzNTk0MzM0ZiwwLjAwNjUyMjE2NzAwODM3MDJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX01FRElVTSAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTY4MDc5NDI1OTUzMzI5ZiwwLjA0MTg3NDI2NjY5NTIzMTJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NjE0MTMwNDY5MDM5MDhmLDAuMDQyNTA5MDgyMjM5MTIxMmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTY4MDc5NDI1OTUzMzI5ZiwwLjA0MTg3NDI2NjY5NTIzMTJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQ3MDk5OTU1Mzc5OTYzZiwwLjA0Mzg3MDg1NTU4ODQ2NTlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vezB4ODYwMEM3QjksMHgwNUNGQTZDRn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAvKiBMVlBTQV9TUEVFRF9ISUdIICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjc0MTUxODY3OTA3NDk0MzFmLDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzM4MTQ1MTIwNDQxOTEzNmYsMC4yMjc5MjA5NjUyOTE1NTk3Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjc0MTUxODY3OTA3NDk0MzFmLDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjczMDk1ODEzNTMzMjkxMjJmLDAuMjMzMTU2ODIyNjIxODIyNGZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCmluZGV4IDBkNjIyNzQuLmU3NTY5NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCkBAIC0zNzQsMTIgKzM3NCwxNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLQorI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jCmluZGV4IDNlNDhjN2UuLjI5ZTNjOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMKQEAgLTcwLDExICs3MCwxNyBAQAogewogCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICBPZmZzZXQ7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZNX1VJTlQzMiAgICAgICAgICBHYWluOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQ3VycmVudDsKKyNlbHNlCisgICAgTFZNX0ZMT0FUICAgICAgICAgICBHYWluOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQ3VycmVudDsKKyNlbmRpZgogICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwogICAgIExWQ1NfQnlwYXNzTWl4X3QgICAgKnBDb25maWcgICA9IChMVkNTX0J5cGFzc01peF90ICopJnBJbnN0YW5jZS0+QnlwYXNzTWl4OwogICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGU7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICBDdXJyZW50OworCiAKIAogICAgIC8qCkBAIC04NSw3ICs5MSwxMSBAQAogICAgICAgICAmJiAocEluc3RhbmNlLT5NU1RhcmdldDEgIT0gMHg3RkZGKSAvKiB0aGlzIGluZGljYXRlcyBhbiBvZmYtPm9uIHRyYW5zdGlvbiAqLwogICAgICAgICApCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluID0gcFBhcmFtcy0+RWZmZWN0TGV2ZWw7CisjZWxzZQorICAgICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluID0gKChMVk1fRkxPQVQpcFBhcmFtcy0+RWZmZWN0TGV2ZWwgLyAzMjc2Nyk7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTEwMiwyMyArMTEyLDQ2IEBACiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHByb2Nlc3NlZCBwYXRoCiAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgR2FpbiA9IChMVk1fVUlOVDMyKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pOworI2Vsc2UKKyAgICBHYWluID0gIChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogcEluc3RhbmNlLT5UcmFuc2l0aW9uR2Fpbik7CisjZW5kaWYKIAogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gPSAwOwogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWTV9OVUxMOwogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0PTE7CisKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sKExWTV9JTlQzMikoR2FpbiA+PiAxNSksQ3VycmVudCk7CiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLCAoTFZNX0ZMT0FUKShHYWluKSwgQ3VycmVudCk7CisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisjZW5kaWYKKwogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSB1bnByb2Nlc3NlZCBwYXRoCiAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgR2FpbiA9IChMVk1fVUlOVDMyKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqICgweDdGRkYgLSBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSk7CiAgICAgR2FpbiA9IChMVk1fVUlOVDMyKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogKEdhaW4gPj4gMTUpOwogICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0pOwogICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwoTFZNX0lOVDMyKShHYWluID4+IDE1KSxDdXJyZW50KTsKICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICBHYWluID0gKExWTV9GTE9BVCkocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiAoMS4wIC0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSk7CisgICAgR2FpbiA9IChMVk1fRkxPQVQpcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlVucHJvY0xvc3MgKiBHYWluOworICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwgKExWTV9GTE9BVCkoR2FpbiksIEN1cnJlbnQpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSA9IDA7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlID0gaEluc3RhbmNlOwogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0PTE7CkBAIC0xMzQsNyArMTY3LDcgQEAKICAgICAgKiBDb3JyZWN0IGdhaW4gZm9yIHRoZSBlZmZlY3QgbGV2ZWwKICAgICAgKi8KICAgICB7Ci0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBHYWluQ29ycmVjdDsKICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBHYWluMTsKICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBHYWluMjsKQEAgLTE3Miw2ICsyMDUsNDMgQEAKICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sR2FpbjI+PjE2KTsKICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbkNvcnJlY3Q7CisgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjE7CisgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjI7CisKKyAgICAgICAgR2FpbjEgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgICAgIEdhaW4yID0gTFZDX01peGVyX0dldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0pOworICAgICAgICAvKgorICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGdhaW4gY29ycmVjdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkNvbXByZXNzb3JNb2RlID09IExWTV9NT0RFX09OKQorICAgICAgICB7CisgICAgICAgIEdhaW5Db3JyZWN0ID0gKExWTV9GTE9BVCkoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4gKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2FpbkZ1bGwgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKSkpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIEdhaW4xID0gKEdhaW4xICogR2FpbkNvcnJlY3QpOworICAgICAgICBHYWluMiA9IChHYWluMiAqIEdhaW5Db3JyZWN0KTsKKworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBnYWluIHZhbHVlcworICAgICAgICAgKi8KKyAgICAgICAgcENvbmZpZy0+T3V0cHV0X1NoaWZ0ID0gcENvbmZpZy0+T3V0cHV0X1NoaWZ0OworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSxHYWluMSk7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sR2FpbjIpOworICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisjZW5kaWYKICAgICB9CiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKQEAgLTIwNiw5ICsyNzYsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBVbnByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0RGF0YSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwVW5wcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCisjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCiB7CiAKQEAgLTIyMyw2ICsyOTksNyBAQAogICAgICAgICAvKgogICAgICAgICAgKiBBcHBseSB0aGUgYnlwYXNzIG1peAogICAgICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSBwVW5wcm9jZXNzZWQsCkBAIC0yMzYsNiArMzEzLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYqKXBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KilwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KKyNlbHNlCisgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSBwVW5wcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSBvdXRwdXQgZ2FpbiBjb3JyZWN0aW9uIHNoaWZ0CisgICAgICAgICAqLworICAgICAgICBTaGlmdF9TYXRfRmxvYXQoKExWTV9JTlQxNilwQ29uZmlnLT5PdXRwdXRfU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQqLworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmgKaW5kZXggZDFlZjcwYS4uZjY5YmEzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaApAQCAtNDIsMTIgKzQyLDE2IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIC8qIE1peGVyIHNldHRpbmdzICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICBNaXhlcl9JbnN0YW5jZTsgICAgICAgICAgICAgLyogTWl4ZXIgaW5zdGFuY2UgKi8KKyNlbHNlCiAgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgTWl4ZXJfSW5zdGFuY2U7ICAgICAgICAgICAgIC8qIE1peGVyIGluc3RhbmNlICovCisjZW5kaWYKICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPdXRwdXRfU2hpZnQ7ICAgICAgICAgICAgICAgLyogQ29ycmVjdGluZyBnYWluIG91dHB1dCBzaGlmdCAqLwogCiB9IExWQ1NfQnlwYXNzTWl4X3Q7CiAKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogLyogT3V0cHV0IGdhaW4gdHlwZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTU2LDggKzYwLDE1IEBACiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgTG9zczsgICAgICAgICAgICAgICAgICAgICAgIC8qIExvc3MgcmVxdWlyZWQgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBVbnByb2NMb3NzOyAgICAgICAgICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBsb3NzICovCiB9IEdhaW5fdDsKLQotCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBPdXRwdXQgZ2FpbiBzZXR0aW5ncywgR2FpbiA9IChMb3NzLzMyNzY4KSAqIDJeU2hpZnQgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgIFNoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IHNoaWZ0cyByZXF1aXJlZCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgTG9zczsgICAgICAgICAgICAgICAgICAgICAgIC8qIExvc3MgcmVxdWlyZWQgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgIFVucHJvY0xvc3M7ICAgICAgICAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGxvc3MgKi8KK30gR2Fpbl90OworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjcsMTMgKzc4LDE5IEBACiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peEluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAqcFBhcmFtcyk7CiAKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqdW5Qcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICBOdW1TYW1wbGVzKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgTnVtU2FtcGxlcyk7CisjZWxzZQorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqdW5Qcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICBOdW1TYW1wbGVzKTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jCmluZGV4IGNlNmQ0MTAuLjNiZjZlYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYwpAQCAtMTIwLDExICsxMjAsMTMgQEAKICAgICAgICAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0ID0gcExWQ1NfVm9sQ29ycmVjdFRhYmxlW09mZnNldF07CiAKICAgICAgICAgcEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPSBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbjsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwgMCwgMCk7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKLQotCisjZW5kaWYKICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICBHYWluOwogICAgICAgICAgICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZSA9IChHYWluX3QqKSZMVkNTX091dHB1dEdhaW5UYWJsZVswXTsKICAgICAgICAgICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiBMVk1fTUFYSU5UXzE2KTsKQEAgLTE0MCw3ICsxNDIsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAogICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICBHYWluOworICAgICAgICAgICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZSA9IChHYWluX3QqKSZMVkNTX091dHB1dEdhaW5UYWJsZVswXTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyk7CisgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVClwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIChHYWluKTsKIAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgR2FpbiA9IChHYWluICogcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4pOworCisgICAgICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sIDAsIEdhaW4pOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisjZW5kaWYKICAgICAgICAgfQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYwppbmRleCAyNWIwZDg2Li5lYzUzMTJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jCkBAIC01Myw3ICs1Myw3MiBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKIAorICAgIExWTV9VSU5UMTYgICAgICAgICAgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfRXF1YWxpc2VyX3QgICAgKnBDb25maWcgICA9IChMVkNTX0VxdWFsaXNlcl90ICopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOworICAgIExWQ1NfRGF0YV90ICAgICAgICAgKnBEYXRhOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHM7CisgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmczsKKyAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICpwRXF1YWxpc2VyQ29lZlRhYmxlOworCisgICAgcERhdGEgPSAoTFZDU19EYXRhX3QgKikgXAorICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICAvKgorICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBjaGFuZ2VzIHJlLWluaXRpYWxpc2UgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IHBQYXJhbXMtPlNwZWFrZXJUeXBlKSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFuZCBjbGVhciB0aGUgaGlzdG9yeQorICAgICAgICAgKi8KKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNhbXBsZVJhdGUgKyAocFBhcmFtcy0+U3BlYWtlclR5cGUgKiAoMSArIExWTV9GU180ODAwMCkpKTsKKyAgICAgICAgcEVxdWFsaXNlckNvZWZUYWJsZSA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19FcXVhbGlzZXJDb2VmVGFibGVbMF07CisKKyAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgZmlsdGVycyAqLworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmcy5BMCA9IChMVk1fRkxPQVQpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzLkExID0gKExWTV9GTE9BVCkgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkExOworICAgICAgICBDb2VmZnMuQTIgPSAoTFZNX0ZMT0FUKSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTI7CisgICAgICAgIENvZWZmcy5CMSA9IChMVk1fRkxPQVQpLXBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5CMTsKKyAgICAgICAgQ29lZmZzLkIyID0gKExWTV9GTE9BVCktcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkIyOworCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgoTFZNX0lOVDE2KTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMsICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CisKKyAgICAgICAgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50cy0+RXF1YWxpc2VyQmlxdWFkSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnMpOworCisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBzd2l0Y2gocEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLlNjYWxlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKIHsKQEAgLTExMiw3ICsxNzcsNyBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19FcXVhbGlzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTMyLDcgKzE5NywzNyBAQAogLyogIDEuICBBbHdheXMgcHJvY2Vzc2VzIGluIHBsYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcykKK3sKIAorICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfRXF1YWxpc2VyX3QgICAgKnBDb25maWcgICA9IChMVkNTX0VxdWFsaXNlcl90ICAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICpwQ29lZmZpY2llbnRzOworCisKKyAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCisgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBlcXVhbGlzZXIgaXMgcmVxdWlyZWQKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgJiBMVkNTX0VRVUFMSVNFUlNXSVRDSCkgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIEFwcGx5IGZpbHRlciB0byB0aGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgKi8KKyAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFjaykoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29lZmZpY2llbnRzLT5FcXVhbGlzZXJCaXF1YWRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBJbnB1dE91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcykKQEAgLTE1Nyw0ICsyNTIsNCBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oCmluZGV4IGNmOTZmNWIuLjBlNzU2ZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKQEAgLTMyLDggKzMyLDExIEBACiAvKiBFcXVhbGlzZXIgc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHZvaWQgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7Ci0KKyNlbHNlCisgICAgdm9pZCAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiwgTFZNX0ZMT0FUKiwgTFZNX0ZMT0FUKiwgTFZNX0lOVDE2KTsKKyNlbmRpZgogfSBMVkNTX0VxdWFsaXNlcl90OwogCiAKQEAgLTQ1LDEyICs0OCwxNSBAQAogCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcyk7Ci0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgKnBJbnB1dE91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KLQorI2Vsc2UKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAppbmRleCAzZTY0MGNiLi40ZjUyMjFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKQEAgLTI0LDcgKzI0LDQ2MyBAQAogLyogVGhlIFN0ZXJlbyBFbmhhbmNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTI1OCAqLworI2RlZmluZSBDU19NSURETEVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI3NzIwCisjZGVmaW5lIENTX01JRERMRV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTUxMjUKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTIxODk5CisjZGVmaW5lIENTX01JRERMRV84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjExNDQxCisjZGVmaW5lIENTX1NJREVfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zODAzNDQKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIzMTA5NworI2RlZmluZSBDU19TSURFXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjIyNDcwCisjZGVmaW5lIENTX1NJREVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMzA3NTkKKyNkZWZpbmUgQ1NfU0lERV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyOTQzICovCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMzA4MzgKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgIC0wLjIyMTU1OQorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAtMC45NDMwNTYKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC41NTczNzIKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM5MTQ5MAorI2RlZmluZSBDU19TSURFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTY1ODgxCisjZGVmaW5lIENTX1NJREVfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMC44ODA2MDgKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAzMjM5NworI2RlZmluZSBDU19TSURFXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyMTkxICovCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI5OTMyCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTAuMjIxNDM2CisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTAuOTQ3NjE2CisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC41NTgzOTgKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM5MjIxMQorI2RlZmluZSBDU19TSURFXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTY2MTg3CisjZGVmaW5lIENTX1NJREVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMC44OTI1NTAKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAzMjg1NgorI2RlZmluZSBDU19TSURFXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjM3MSAqLworI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwNjM4CisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yMjQyMzIKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuOTYwNTUwCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjQ5OTY5NQorI2RlZmluZSBDU19TSURFXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzU1NTQzCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNDQxNTIKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjA1MDc4OAorI2RlZmluZSBDU19TSURFXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTQ0MTA0CisjZGVmaW5lIENTX1NJREVfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYwNzgxICovCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMjg3NDkKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNDEyOAorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMC45NzEyNjIKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQ0MDExMgorI2RlZmluZSBDU19TSURFXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2MTA5NgorI2RlZmluZSBDU19TSURFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE3OTAxNgorI2RlZmluZSBDU19TSURFXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjExNjc4NgorI2RlZmluZSBDU19TSURFXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MjUwNworI2RlZmluZSBDU19TSURFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTg4MiAqLworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMzAzOTUKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjI2MTE3CisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMC45NzM1NzMKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQxNDc3MAorI2RlZmluZSBDU19TSURFXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yODcxODIKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTI3NTg4CisjZGVmaW5lIENTX1NJREVfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjIyOTY0OAorI2RlZmluZSBDU19TSURFXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yODIxNzcKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjAzMjIgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyODQwMAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjI1MjE0CisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjk4MDEyNgorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjQ1NzkKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIwNzM1NQorI2RlZmluZSBDU19TSURFXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTU3MjI0CisjZGVmaW5lIENTX1NJREVfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yNzQyMzEKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMxMjQ5NQorI2RlZmluZSBDU19TSURFXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA0NDEwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MzgzNCAqLworI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzU5MworI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjIzMTIyNQorI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjk4NTU0NQorI2RlZmluZSBDU19NSURETEVfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjI4NDU3MworI2RlZmluZSBDU19TSURFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgIC0wLjI1ODkxMAorI2RlZmluZSBDU19TSURFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAyNTY2MgorI2RlZmluZSBDU19TSURFXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjU3MjI0OAorI2RlZmluZSBDU19TSURFXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjU4ODM5OQorI2RlZmluZSBDU19TSURFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjQ0MDIgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzQ0NDUKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yMzIyNjEKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45ODY3MTMKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjcyNjA2CisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjI2Njk1MgorI2RlZmluZSBDU19TSURFXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAtMC4wMDU2NTQKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTEuNjE3MTQxCisjZGVmaW5lIENTX1NJREVfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjYzMDQwNQorI2RlZmluZSBDU19TSURFXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisjaWZkZWYgSElHSEVSX0ZTCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA5NjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjUqLworLyogaGlnaCBwYXNzIGZpbHRlciB3aXRoIGN1dG9mZiBmcmVxdWVuY3kgMTAyLjE4IEh6Ki8KKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzU1MzIKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yMzQ0MzIKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45OTMzMzQKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKy8qIGJhbmRwYXNzIGZpbHRlciB3aXRoIGZjMSAyNzAgYW5kIGZjMiAzNzAzLCBkZXNpZ25lZCB1c2luZyAybmQgb3JkZXIgYnV0dGVyd29ydGggKi8KKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDE2NzI3CisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19TSURFXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAtMC4wMTY3MjcKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTEuNzkzMzcyCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjc5NzIzNgorI2RlZmluZSBDU19TSURFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTkyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2ODkqLworI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yNDEyMTkKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjQwNjU2CisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45OTY2NjEKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorLyogYmFuZHBhc3MgZmlsdGVyIHdpdGggZmMxIDI3MCBhbmQgZmMyIDM3MDMsIGRlc2lnbmVkIHVzaW5nIDJuZCBvcmRlciBidXR0ZXJ3b3J0aCAqLworI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA4OTkxCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAwODk5MQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTEuODkyNTA5CisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC44OTM1MjQKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgUmV2ZXJiIFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJldmVyYiBkZWxheSBzZXR0aW5ncyBpbiBzYW1wbGVzICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfOEtIWiAgICAgICAgICAgICAgICAgICAgIDkzICAgICAgICAgLyogU2FtcGxlIHJhdGUgOGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xMUtIWiAgICAgICAgICAgICAgICAgICAxMjggICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxMWtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xMktIWiAgICAgICAgICAgICAgICAgICAxMzkgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxMmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xNktIWiAgICAgICAgICAgICAgICAgICAxODYgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxNmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18yMktIWiAgICAgICAgICAgICAgICAgICAyNTYgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAyMmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18yNEtIWiAgICAgICAgICAgICAgICAgICAyNzkgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAyNGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiAgICAgICAgICAgICAgICAgICAzNzIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAzMmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiAgICAgICAgICAgICAgICAgICA1MTIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0NGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiAgICAgICAgICAgICAgICAgICA1MTIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0OGtTL3MgKi8KKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjY3MjcxCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY2NzI3MQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjY4MTc5CisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxMTAyNUh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAwLjY5OTYzOAorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgIC0wLjY5OTYzOAorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgIC0wLjc0OTA5NgorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgMC43MDY5MzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgLTAuNzA2OTMxCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMC43MjgyNzIKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgLTAuNzI4MjcyCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAtMC44MjA2NzkKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuNTE2Mzk2CisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgLTAuNTE2Mzk2CisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgLTAuNTE4NTEyCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgLTAuMjkwOTkwCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjQ3OTU2NQorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC40Nzk1NjUKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0wLjYzNzc0NQorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgLTAuMTk4OTEyCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjM4MDM0OQorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgLTAuMzgwMzQ5CisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgIC0wLjk1MDg3MworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgMC4wNDkxMjcKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjk3Mzg5CisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAtMC4yOTczODkKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjAwNDIzCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1NjUyOQorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjc4NjYxCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjI3ODY2MQorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuMjU0OTkzCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4zMDMzNDcKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworI2lmZGVmIEhJR0hFUl9GUworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgOTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAqLworI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMTYwMjQ4OAorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4xNjAyNDg4CisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS41ODU0MTMKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjU5OTM3NworI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxOTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAqLworI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzgzNjkKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wODc4MzY5CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuNzc2NTc2NAorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjc4MDQwNzYKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKyNlbmRpZgorCisKKy8qIFJldmVyYiBHYWluIFNldHRpbmdzICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0RFTEFZR0FJTiAgICAgICAgICAgICAgIDAuODAwMDAwICAgICAgICAgLyogQWxnb3JpdGhtIGRlbGF5IHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9PVVRQVVRHQUlOICAgICAgICAgICAgICAxLjAwMDAwMCAgICAgICAgIC8qIEFsZ29yaXRobSBvdXRwdXQgZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9QUk9DR0FJTiAgICAgICAgICAgICAgICAgICAxODQwMyAgICAgICAgIC8qIFByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfVU5QUk9DR0FJTiAgICAgICAgICAgICAgICAgMTg0MDMgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfR0FJTkNPUlJFQ1QgICAgICAgICAgICAgMS4wMDkzNDMgICAgICAgICAvKiBEZWxheSBtaXhlciBnYWluIGNvcnJlY3Rpb24gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgRXF1YWxpc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDM4NDk3IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzc1NDgwICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMS4yNjMzMTIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjYwMTc0OAorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMjgwNjgxCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC40NzU4NjUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgIC0wLjQwODE1NAorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAwLjk0MzM1NworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0ExICAgICAgICAgICAgICAgICAgIC0wLjQ0OTM0NQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0EyICAgICAgICAgICAgICAgICAgIC0wLjIwOTU5NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0IxICAgICAgICAgICAgICAgICAgIC0wLjQ3NTg2NQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0IyICAgICAgICAgICAgICAgICAgIC0wLjQwODE1NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxMTAyNUh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAyNzc2MSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2NzQ2MyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgIDEuMTAxMTQ1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgMC4xMzkwMjAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EyICAgICAgICAgICAgICAgICAgIC0wLjg2NDQyMworI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgIDAuMDI0NTQxCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAtMC45MDg5MzAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgIDAuOTc2MDU4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0ExICAgICAgICAgICAgICAgICAgIC0wLjY5NTMyNgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAtMC4wOTA4MDkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgLTAuNjEwNTk0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0IyICAgICAgICAgICAgICAgICAgIC0wLjMxMTE0OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNQorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAzMjUyMSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MTAxNyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMS4yNzY2NjEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgLTEuMDE3NTE5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjA0NDEyOAorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAtMC43Mjk2MTYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgLTAuMjA0NTMyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EwICAgICAgICAgICAgICAgICAxLjAwNzA5NQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMSAgICAgICAgICAgICAgICAtMC44NzE5MTIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTIgICAgICAgICAgICAgICAgIDAuMDIzMjMyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IxICAgICAgICAgICAgICAgIC0wLjc0NTg1NworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAtMC4xODkxNzEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzEzNzggYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzAxNjQgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMS4yODE2MjkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMS4wNzU4NzIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAtMC4wNDEzNjUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC43MjUyMzkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAtMC4yMjQzNTgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAxLjA4MTA5MQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgLTAuODY3MTgzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EyICAgICAgICAgICAgICAgICAtMC4wNzAyNDcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjEgICAgICAgICAgICAgICAgIC0wLjUxNTEyMQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgLTAuNDI1ODkzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDQxNTc2IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzc3Nzc5ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAxLjM4ODYwNQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAtMS4zMDU3OTkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgIDAuMDM5OTIyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgIC0wLjcxOTQ5NAorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAtMC4yNDMyNDUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgMS4yNzI5MTAKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAtMS4zNDEwMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgMC4xNjc0NjIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAtMC42MTQyMTkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAtMC4zNDUzODQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzQ0OTUgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzI0OTEgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjQwOTgzMgorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgLTEuNDU2NTA2CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgMC4xNTE0MTAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgIC0wLjgwNDIwMQorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgLTAuMTYzNzgzCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgMS4yOTkxOTgKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTEgICAgICAgICAgICAgICAgIC0xLjQ1MjQ0NworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgIDAuMjQwNDg5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IxICAgICAgICAgICAgICAgICAtMC42NjkzMDMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjI5NDk4NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjA0NDU1OSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc4MDAwNiAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxLjU2MDk4OAorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0xLjg3NzcyNAorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjM4OTc0MQorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjkwNzQxMAorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgIC0wLjA3MDQ4OQorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgIDEuNzg1MDQ5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0ExICAgICAgICAgICAgICAgICAtMi4yMzM0OTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAwLjUyNjQzMQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNDQ1OTM5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAtMC41MjI0NDYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMjIxNzAgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NjMyODggKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgMS42MjM5OTMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAtMi4yNzA3NDMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgMC42ODg4MjkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAtMS4xMTcxOTAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgMC4xMzAyMDgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgMi4wMjgzMTUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAtMi44ODI0NTkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgMC45MDQ1MzUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAtMC41OTMzMDgKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAtMC4zODU4MTYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMTg2MzUgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NjA2NDggKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjY0MTE3NworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgLTIuMzY0Njg3CisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgMC43NTk5MTAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgIC0xLjE2Njc3NAorI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuMTc4MDc0CisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgMi4wOTk2NTUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTEgICAgICAgICAgICAgICAgIC0zLjA2NTIyMAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMiAgICAgICAgICAgICAgICAgIDEuMDEwNDE3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAtMC42MzQwMjEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjM0NzMzMgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjc4NDQ5NworI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgLTMuMDAxNDM1CisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMS4yMjg0MjIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgIC0xLjQ3NzgwNAorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuNDgxMzY5CisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgMi43NTczCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0ExICAgICAgICAgICAgICAgICAtNC42NzIxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgMS45MzE3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxICAgICAgICAgICAgICAgICAtMC45NzE3MTgKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjAyMTIxNgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuODg5NTgyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgLTMuNDU2MTQwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgIDEuNTY5ODY0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgLTEuNzAwNzk4CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuNzAxODI0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAzLjQyNzMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAtNi4yOTM2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgIDIuODcyMAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjEgICAgICAgICAgICAgICAgIC0xLjMxMDc0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgMC4zMTMxMgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKyNlbmRpZgorCisKKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgIC8qIE91dHB1dCBTaGlmdCAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MgICAgICAgICAgICAgICAgICAwLjg0Nzc3MzUgICAgICAgICAgLyogT3V0cHV0IFNoaWZ0IGxvc3MgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfR0FJTiAgICAgICAgICAgICAgICAgICAgICAgMC4yMDg3NDY1ICAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0ICovCisjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUyAgICAgICAgICAgICAgIDAuNTY5MjI1ICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgbG9zcyAqLworI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9HQUlOICAgICAgICAgICAgICAgICAgICAwLjA3Nzk0NDI1ICAgICAgICAgLyogRVggVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCisjZWxzZQogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjEyNTggKi8KICNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDc0NjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjIyNzcyMCAqLwogI2RlZmluZSBDU19NSURETEVfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtNzA0OSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxNTEyNSAqLwpAQCAtMzk0LDUgKzg1MCw2IEBACiAjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgKi8KICNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgMTg2MDAgICAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCBsb3NzICovCiAjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgICA1MTA4ICAgICAgICAgICAgICAvKiBFWCBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KLQogI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMKaW5kZXggMTkwNGU0Ni4uZDRjNzYyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jCkBAIC05OCw3ICs5OCwxMyBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQogICAgICAgICAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAvKiBJbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisjZWxzZQogICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKShMVkNTX1NDUkFUQ0hCVUZGRVJTKnNpemVvZihMVk1fSU5UMTYpKnBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7ICAgICAvKiBJbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSAgICAgICAgID0gU2NyYXRjaFNpemU7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgPSBMVkNTX1NDUkFUQ0g7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKQEAgLTE5MCw2ICsxOTYsNyBAQAogICAgIHBMVkNTX1ZvbENvcnJlY3RUYWJsZSAgICAgICAgICAgID0gKExWQ1NfVm9sQ29ycmVjdF90KikmTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07CiAgICAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0ICAgICAgICAgICAgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07CiAgICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiAgICAgICAgPSAwOworCiAgICAgLyogVGhlc2UgY3VycmVudCBhbmQgdGFyZ2V0IHZhbHVlcyBhcmUgaW50aWFsaXplZCBhZ2FpbiBpbiBMVkNTX0NvbnRyb2wuYyAqLwogICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwwLDApOwogICAgIC8qIFRoZXNlIGN1cnJlbnQgYW5kIHRhcmdldCB2YWx1ZXMgYXJlIGludGlhbGl6ZWQgYWdhaW4gaW4gTFZDU19Db250cm9sLmMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCmluZGV4IGYzYWRiOGQuLmE5N2U0ZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaApAQCAtOTUsMTAgKzk1LDE3IEBACiAvKiBWb2x1bWUgY29ycmVjdGlvbiBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICBDb21wRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvc3QgQ1MgY29tcHJlc3Npb24gMTAwJSBlZmZlY3QgKi8KKyAgICBMVk1fRkxPQVQgICBDb21wTWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvc3QgQ1MgY29tcHJlc3Npb24gMCUgZWZmZWN0ICovCisgICAgTFZNX0ZMT0FUICAgR2FpbkZ1bGw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDUyBnYWluIGNvcnJlY3QgMTAwJSBlZmZlY3QgKi8KKyAgICBMVk1fRkxPQVQgICBHYWluTWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAwJSBlZmZlY3QgKi8KKyNlbHNlCiAgICAgTFZNX0lOVDE2ICAgQ29tcEZ1bGw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDEwMCUgZWZmZWN0ICovCiAgICAgTFZNX0lOVDE2ICAgQ29tcE1pbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDAlIGVmZmVjdCAqLwogICAgIExWTV9JTlQxNiAgIEdhaW5GdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDEwMCUgZWZmZWN0ICovCiAgICAgTFZNX0lOVDE2ICAgR2Fpbk1pbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDUyBnYWluIGNvcnJlY3QgMCUgZWZmZWN0ICovCisjZW5kaWYKIH0gTFZDU19Wb2xDb3JyZWN0X3Q7CiAKIC8qIEluc3RhbmNlIHN0cnVjdHVyZSAqLwpAQCAtMTEyLDggKzExOSwxMyBAQAogICAgIC8qIFByaXZhdGUgcGFyYW1ldGVycyAqLwogICAgIExWQ1NfT3V0cHV0RGV2aWNlX2VuICAgIE91dHB1dERldmljZTsgICAgICAgLyogU2VsZWN0ZWQgb3V0cHV0IGRldmljZSB0eXBlICovCiAgICAgTFZDU19Wb2xDb3JyZWN0X3QgICAgICAgVm9sQ29ycmVjdDsgICAgICAgICAvKiBWb2x1bWUgY29ycmVjdGlvbiBzZXR0aW5ncyAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFRyYW5zaXRpb25HYWluOyAgICAgLyogVHJhbnNpdGlvbiBnYWluICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQ29tcHJlc3NHYWluOyAgICAgICAvKiBMYXN0IHVzZWQgY29tcHJlc3NvciBnYWluKi8KKyNlbHNlCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgVHJhbnNpdGlvbkdhaW47ICAgICAvKiBUcmFuc2l0aW9uIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBDb21wcmVzc0dhaW47ICAgICAgIC8qIExhc3QgdXNlZCBjb21wcmVzc29yIGdhaW4qLworI2VuZGlmCiAKICAgICAvKiBTdWItYmxvY2sgY29uZmlndXJhdGlvbnMgKi8KICAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICBTdGVyZW9FbmhhbmNlcjsgICAgIC8qIFN0ZXJlbyBlbmhhbmNlciBjb25maWd1cmF0aW9uICovCkBAIC0xMzQsMjQgKzE0NiwzNSBAQAogLyogQ29lZmZpY2llbnQgU3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgRXF1YWxpc2VyQmlxdWFkSW5zdGFuY2U7CisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgUmV2ZXJiQmlxdWFkSW5zdGFuY2U7CisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgU0VCaXF1YWRJbnN0YW5jZU1pZDsKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlU2lkZTsKKyNlbHNlCiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgRXF1YWxpc2VyQmlxdWFkSW5zdGFuY2U7CiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgUmV2ZXJiQmlxdWFkSW5zdGFuY2U7CiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgU0VCaXF1YWRJbnN0YW5jZU1pZDsKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlU2lkZTsKLQorI2VuZGlmCiB9IExWQ1NfQ29lZmZpY2llbnRfdDsKIAogLyogRGF0YSBTdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCBFcXVhbGlzZXJCaXF1YWRUYXBzOworICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190IFJldmVyYkJpcXVhZFRhcHM7CisgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgU0VCaXF1YWRUYXBzTWlkOworICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190IFNFQmlxdWFkVGFwc1NpZGU7CisjZWxzZQogICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190IEVxdWFsaXNlckJpcXVhZFRhcHM7CiAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgUmV2ZXJiQmlxdWFkVGFwczsKICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCBTRUJpcXVhZFRhcHNNaWQ7CiAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgU0VCaXF1YWRUYXBzU2lkZTsKLQorI2VuZGlmCiB9IExWQ1NfRGF0YV90OwogCi0KIHZvaWQgTFZDU19UaW1lckNhbGxCYWNrICggICB2b2lkKiBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcENhbGxCYWNrUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBDYWxsYmFja1BhcmFtKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCmluZGV4IDVkOTk0NjEuLjM5NTZkNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpAQCAtNjYsNyArNjYsNzcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzX0NTKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKyAgICBjb25zdCBMVk1fRkxPQVQgICAgICpwSW5wdXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2g7CisgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOwogCisgICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKSBcCisgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgcHJvY2Vzc2luZyBpcyBpbnBsYWNlCisgICAgICovCisgICAgaWYgKHBJbkRhdGEgPT0gcE91dERhdGEpCisgICAgeworICAgICAgICAvKiBQcm9jZXNzaW5nIGlucGxhY2UgKi8KKyAgICAgICAgcElucHV0ID0gcFNjcmF0Y2ggKyAoMiAqIE51bVNhbXBsZXMpOworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dCwgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCisgICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxsIHRoZSBzdGVyZW8gZW5oYW5jZXIKKyAgICAgKi8KKyAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKworICAgIC8qCisgICAgICogQ2FsbCB0aGUgcmV2ZXJiIGdlbmVyYXRvcgorICAgICAqLworICAgIGVyciA9IExWQ1NfUmV2ZXJiR2VuZXJhdG9yKGhJbnN0YW5jZSwgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworICAgIAorICAgIC8qCisgICAgICogQ2FsbCB0aGUgZXF1YWxpc2VyCisgICAgICovCisgICAgZXJyID0gTFZDU19FcXVhbGlzZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworCisgICAgLyoKKyAgICAgKiBDYWxsIHRoZSBieXBhc3MgbWl4ZXIKKyAgICAgKi8KKyAgICBlcnIgPSBMVkNTX0J5cGFzc01peGVyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHByb2Nlc3NlZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXQsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgKHVucHJvY2Vzc2VkKSBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICBpZihlcnIgIT0gTFZDU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3NfQ1MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKQEAgLTEzMyw3ICsyMDMsNyBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTYwLDcgKzIzMCwxNzAgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKQorewogCisgICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7CisKKyAgICAvKgorICAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgICAgeworICAgICAgICByZXR1cm4oTFZDU19UT09NQU5ZU0FNUExFUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRikKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENhbGwgQ1MgcHJvY2VzcyBmdW5jdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgICAgIGVyciA9IExWQ1NfUHJvY2Vzc19DUyhoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIENvbXByZXNzIHRvIHJlZHVjZSBleHBhbnNpb24gZWZmZWN0IG9mIENvbmNlcnQgU291bmQgYW5kIGNvcnJlY3Qgdm9sdW1lCisgICAgICAgICAqIGRpZmZlcmVuY2VzIGZvciBkaWZmZXJlbmNlIHNldHRpbmdzLiBOb3QgYXBwbGllZCBpbiB0ZXN0IG1vZGVzCisgICAgICAgICAqLworICAgICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZDU19PTikmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkNvbXByZXNzb3JNb2RlID09IExWTV9NT0RFX09OKSkKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX0ZMT0FUIEdhaW4gPSBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbjsKKyAgICAgICAgICAgIExWTV9GTE9BVCBDdXJyZW50MTsKKworICAgICAgICAgICAgQ3VycmVudDEgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOworICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpKCAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbiAgKiAoQ3VycmVudDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcEZ1bGwgKiAoQ3VycmVudDEpKSkpOworCisgICAgICAgICAgICBpZihOdW1TYW1wbGVzIDwgTFZDU19DT01QR0FJTkZSQU1FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiBzZXR0aW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIE51bVNhbXBsZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgIEdhaW5TdGVwOworICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgRmluYWxHYWluOworICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgU2FtcGxlVG9Qcm9jZXNzID0gTnVtU2FtcGxlczsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpwT3V0UHRyOworCisgICAgICAgICAgICAgICAgLyogTGFyZ2UgY2hhbmdlcyBpbiBHYWluIGNhbiBjYXVzZSBjbGlja3MgaW4gb3V0cHV0CisgICAgICAgICAgICAgICAgICAgU3BsaXQgZGF0YSBpbnRvIHNtYWxsIGJsb2NrcyBhbmQgdXNlIGludGVycG9sYXRlZCBnYWluIHZhbHVlcyAqLworCisgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAoTFZNX0ZMT0FUKSgoKEdhaW4tcEluc3RhbmNlLT5Db21wcmVzc0dhaW4pICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DT01QR0FJTkZSQU1FKSAvIE51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID09IDApICYmIChwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA8IEdhaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPT0gMCkgJiYgKHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID4gR2FpbikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBGaW5hbEdhaW4gPSBHYWluOworICAgICAgICAgICAgICAgIEdhaW4gPSBwSW5zdGFuY2UtPkNvbXByZXNzR2FpbjsKKyAgICAgICAgICAgICAgICBwT3V0UHRyID0gcE91dERhdGE7CisKKyAgICAgICAgICAgICAgICB3aGlsZShTYW1wbGVUb1Byb2Nlc3MgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpKEdhaW4gKyBHYWluU3RlcCk7CisgICAgICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA+IDApICYmIChGaW5hbEdhaW4gPD0gR2FpbikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdhaW4gPSBGaW5hbEdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPCAwKSAmJiAoRmluYWxHYWluID4gR2FpbikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdhaW4gPSBGaW5hbEdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZihTYW1wbGVUb1Byb2Nlc3MgPiBMVkNTX0NPTVBHQUlORlJBTUUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiBzZXR0aW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIgKiBMVkNTX0NPTVBHQUlORlJBTUUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIgKz0gKDIgKiBMVkNTX0NPTVBHQUlORlJBTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoU2FtcGxlVG9Qcm9jZXNzIC0gTFZDU19DT01QR0FJTkZSQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiBzZXR0aW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIgKiBTYW1wbGVUb1Byb2Nlc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVRvUHJvY2VzcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU3RvcmUgZ2FpbiB2YWx1ZSovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA9IEdhaW47CisgICAgICAgIH0KKworCisgICAgICAgIGlmKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpeworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUmUtaW5pdCBieXBhc3MgbWl4IHdoZW4gdGltZXIgaGFzIGNvbXBsZXRlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9PSBMVk1fVFJVRSkgJiYKKyAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gTFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKKworICAgICAgICAgICAgICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBMVk1fVGltZXIgKCAmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAqcE91dERhdGEsCkBAIC0zMjEsMTMgKzU1NCw0IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQotCi0KLQotCi0KLQotCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMKaW5kZXggZWUyNTdiOC4uMTA4NTEwMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYwpAQCAtNTcsNyArNTcsOTggQEAKIC8qICAyLiAgVGhlIG51bWVyYXRvciBjb2VmZmljaWVudHMgb2YgdGhlIGZpbHRlciBhcmUgbmVnYXRlZCB0byBjYXVzZSBhbiBpbnZlcnNpb24uICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAqcFBhcmFtcykKK3sKIAorICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIERlbGF5OworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKKyAgICBMVkNTX0RhdGFfdCAgICAgICAgICAgICAqcERhdGE7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudHM7CisgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgIENvZWZmczsKKyAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAqcFJldmVyYkNvZWZUYWJsZTsKKworCisgICAgcERhdGEgPSAoTFZDU19EYXRhX3QgKikgXAorICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworCisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBkZWxheSBhbmQgZmlsdGVycyBpZjoKKyAgICAgKiAgLSB0aGUgc2FtcGxlIHJhdGUgaGFzIGNoYW5nZWQKKyAgICAgKiAgLSB0aGUgc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkIHRvIG9yIGZyb20gdGhlIG1vYmlsZSBzcGVha2VyCisgICAgICovCisgICAgaWYocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlICkgICAgICAvKiBTYW1wbGUgcmF0ZSBjaGFuZ2UgdGVzdCAqLworCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCB0aGUgZGVsYXkKKyAgICAgICAgICovCisgICAgICAgIERlbGF5ID0gKExWTV9VSU5UMTYpTFZDU19TdGVyZW9EZWxheUNTWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOworCisKKyAgICAgICAgcENvbmZpZy0+RGVsYXlTaXplICAgICAgPSAoTFZNX0lOVDE2KSgyICogRGVsYXkpOworICAgICAgICBwQ29uZmlnLT5EZWxheU9mZnNldCAgICA9IDA7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcENvbmZpZy0+U3RlcmVvU2FtcGxlc1swXSwgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBDb25maWctPlN0ZXJlb1NhbXBsZXMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIGZpbHRlcnMKKyAgICAgICAgICovCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGU7CisgICAgICAgIHBSZXZlcmJDb2VmVGFibGUgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfUmV2ZXJiQ29lZlRhYmxlWzBdOworCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzLkEwID0gKExWTV9GTE9BVClwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmcy5BMSA9IChMVk1fRkxPQVQpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkExOworICAgICAgICBDb2VmZnMuQTIgPSAoTFZNX0ZMT0FUKXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzLkIxID0gKExWTV9GTE9BVCktcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0ZMT0FUKS1wUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQjI7CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzLCAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CisKKyAgICAgICAgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50cy0+UmV2ZXJiQmlxdWFkSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnMpOworCisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBzd2l0Y2gocFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLlNjYWxlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIKKyAgICAgICAgICovCisgICAgICAgIHBDb25maWctPlByb2NHYWluID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5QUk9DKTsKKyAgICAgICAgcENvbmZpZy0+VW5wcm9jR2FpbiAgPSAoTFZNX1VJTlQxNikoSEVBRFBIT05FR0FJTlVOUFJPQyk7CisgICAgfQorCisgICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgIT0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWwpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgICBSZXZlcmJQZXJjZW50YWdlID0gODM4ODY7ICAgICAgLy8gMSBQZXJjZW50IFJldmVyYiBpLmUgMS8xMDAgaW4gUSAyMyBmb3JtYXQKKyAgICAgICAgUmV2ZXJiUGVyY2VudGFnZSAqPSBwUGFyYW1zLT5SZXZlcmJMZXZlbDsgIC8vIEFjdHVhbCBSZXZlcmIgTGV2ZWwgaW4gUSAyMyBmb3JtYXQKKyAgICAgICAgcENvbmZpZy0+UmV2ZXJiTGV2ZWwgPSAoKExWTV9GTE9BVCkoUmV2ZXJiUGVyY2VudGFnZT4+OCkpIC8gMzI3NjcuMGY7CisgICAgfQorICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpCiB7CkBAIC0xNDAsNyArMjMxLDcgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfUmV2ZXJiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE3OSw3ICsyNzAsOTEgQEAKIC8qICAyLiAgVGhlIEdhaW4gaXMgY29tYmluZWQgd2l0aCB0aGUgTFBGIGFuZCBpbmNvcnBvcmF0ZWQgaW4gdG8gdGhlIGNvZWZmaWNpZW50cyAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKIAorICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90ICAqcENvbmZpZyAgID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgKikmcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnRzOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsKKworICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopXAorICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopXAorICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQgaW4gb3V0cGxhY2UgcHJvY2Vzc2luZworICAgICAqLworICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUmV2ZXJiIG5vdCByZXF1aXJlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgfQorCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSByZXZlcmIgaXMgcmVxdWlyZWQKKyAgICAgKi8KKyAgICAvKiBEaXNhYmxlIHdoZW4gQ1M0TVMgaW4gc3RlcmVvIG1vZGUgKi8KKyAgICBpZiAoKChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0hFQURQSE9ORSkgfHwgXAorICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfRVhfSEVBRFBIT05FUykgfHwKKyAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gTFZDU19TVEVSRU8pKSAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciB2YWxpZGF0aW9uIHRlc3RpbmcgKi8KKyAgICAgICAgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19SRVZFUkJTV0lUQ0gpICE9MCkpCisgICAgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogQ29weSB0aGUgaW5wdXQgZGF0YSB0byBzY3JhdGNoIG1lbW9yeSBhbmQgZmlsdGVyIGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHRoZSBzY3JhdGNoIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBGaWx0ZXIgdGhlIGRhdGEKKyAgICAgICAgICovCisgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICBNdWx0M3NfRmxvYXQoIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBkZWxheSBtaXgKKyAgICAgICAgICovCisgICAgICAgIERlbGF5TWl4X0Zsb2F0KChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBDb25maWctPlN0ZXJlb1NhbXBsZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPkRlbGF5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5EZWxheU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworCisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dERhdGEsCkBAIC0yNTcsOCArNDMyLDQgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCi0KLQotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCmluZGV4IDZlMDI2ZmYuLjY5ODkyYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKQEAgLTU4LDE0ICs1OCwyMCBAQAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBEZWxheU9mZnNldDsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgUHJvY0dhaW47CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIFVucHJvY0dhaW47CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBTdGVyZW9TYW1wbGVzWzIqTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWl07Ci0KICAgICAvKiBSZXZlcmIgTGV2ZWwgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7Ci0KICAgICAvKiBGaWx0ZXIgKi8KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7Ci0KKyNlbHNlCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFN0ZXJlb1NhbXBsZXNbMiAqIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFpdOworICAgIC8qIFJldmVyYiBMZXZlbCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICBSZXZlcmJMZXZlbDsKKyAgICAvKiBGaWx0ZXIgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiwgTFZNX0ZMT0FUKiwgTFZNX0lOVDE2KTsKKyNlbmRpZgogfSBMVkNTX1JldmVyYkdlbmVyYXRvcl90OwogCiAKQEAgLTc3LDEyICs4MywxNyBAQAogCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICpwUGFyYW1zKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcElucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOwotCisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jCmluZGV4IGI5YjhiMDUuLjI5OTJjMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jCkBAIC00OSw3ICs0OSwxMDMgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CiAKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgICpwQ29uZmlnICAgPSAoTFZDU19TdGVyZW9FbmhhbmNlcl90ICopJnBJbnN0YW5jZS0+U3RlcmVvRW5oYW5jZXI7CisgICAgTFZDU19EYXRhX3QgICAgICAgICAgICAgKnBEYXRhOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnQ7CisgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICBDb2VmZnNNaWQ7CisgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICBDb2VmZnNTaWRlOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgKnBTRVNpZGVDb2VmczsKKworCisgICAgcERhdGEgICAgID0gKExWQ1NfRGF0YV90ICopIFwKKyAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwQ29lZmZpY2llbnQgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdXBkYXRlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgYmFzZWQgb24gdGhlIHNhbXBsZSByYXRlCisgICAgICAgICAqLworICAgICAgICAvKiBNaWQgZmlsdGVyICovCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGU7CisKKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnNNaWQuQTAgPSAoTFZNX0ZMT0FUKSBMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmc01pZC5BMSA9IChMVk1fRkxPQVQpIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzTWlkLkIxID0gKExWTV9GTE9BVCktTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkIxOworCisgICAgICAgIC8qIENsZWFyIHRoZSB0YXBzICovCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlNFQmlxdWFkVGFwc01pZCwgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc01pZCkgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworCisgICAgICAgIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZU1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc01pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzTWlkKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgaWYoTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLlNjYWxlID09IDE1KQorICAgICAgICB7CisgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkICA9IEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOworICAgICAgICB9CisKKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNhbXBsZVJhdGUpOworICAgICAgICBwU0VTaWRlQ29lZnMgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfU0VTaWRlQ29lZlRhYmxlWzBdOworCisgICAgICAgIC8qIFNpZGUgZmlsdGVyICovCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzU2lkZS5BMCA9IChMVk1fRkxPQVQpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnNTaWRlLkExID0gKExWTV9GTE9BVCkgcFNFU2lkZUNvZWZzW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmc1NpZGUuQTIgPSAoTFZNX0ZMT0FUKSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzU2lkZS5CMSA9IChMVk1fRkxPQVQpLXBTRVNpZGVDb2Vmc1tPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnNTaWRlLkIyID0gKExWTV9GTE9BVCktcFNFU2lkZUNvZWZzW09mZnNldF0uQjI7CisKKyAgICAgICAgLyogQ2xlYXIgdGhlIHRhcHMgKi8KKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc1NpZGUpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIHN3aXRjaChwU0VTaWRlQ29lZnNbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOworCisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUgID0gQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzU2lkZSk7CisKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSAgPSBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKIHsKQEAgLTEzOCw3ICsyMzQsNyBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19TdGVyZW9FbmhhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTc3LDcgKzI3Myw5MCBAQAogLyogIDEuICBUaGUgc2lkZSBmaWx0ZXIgaXMgbm90IHVzZWQgaW4gTW9iaWxlIFNwZWFrZXIgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICBOdW1TYW1wbGVzKQorewogCisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgICpwQ29uZmlnICAgPSAoTFZDU19TdGVyZW9FbmhhbmNlcl90ICopJnBJbnN0YW5jZS0+U3RlcmVvRW5oYW5jZXI7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7CisKKyAgICBwQ29lZmZpY2llbnQgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKSBcCisgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgU3RlcmVvIEVuaGFuY2VyIGlzIGVuYWJsZWQKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgJiBMVkNTX1NURVJFT0VOSEFOQ0VTV0lUQ0gpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCBmcm9tIHN0ZXJlbyB0byBtaWRkbGUgYW5kIHNpZGUKKyAgICAgICAgICovCisgICAgICAgIEZyb20yaVRvTVNfRmxvYXQocEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIE51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSBmaWx0ZXIgdG8gdGhlIG1pZGRsZSBzaWduYWwKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFja19NaWQpKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIE11bHQzc19GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpcENvbmZpZy0+TWlkR2FpbiwgICAgICAvKiBHYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlciB0aGUgc2lkZSBzaWduYWwgb25seSBpbiBzdGVyZW8gbW9kZSBmb3IgaGVhZHBob25lcworICAgICAgICAgKiBhbmQgaW4gYWxsIG1vZGVzIGZvciBtb2JpbGUgc3BlYWtlcnMKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZDU19TVEVSRU8pCisgICAgICAgIHsKKyAgICAgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSkoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopKHBTY3JhdGNoICsgTnVtU2FtcGxlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBDb252ZXJ0IGZyb20gbWlkZGxlIGFuZCBzaWRlIHRvIHN0ZXJlbworICAgICAgICAgKi8KKyAgICAgICAgTVNUbzJpX1NhdF9GbG9hdChwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIE51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgc3RlcmVvIGVuaGFuY2VyIGlzIGRpc2FibGVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQorICAgICAgICAgKi8KKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICpwT3V0RGF0YSwKQEAgLTI1NCw3ICs0MzMsNCBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KLQotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaAppbmRleCAxNWJjNDA3Li40MTI1ZjI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaApAQCAtNDMsMTggKzQzLDMxIEBACiAvKiBTdGVyZW8gZW5oYW5jZXIgc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogeworCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgLyoKICAgICAgKiBNaWRkbGUgZmlsdGVyCiAgICAgICovCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2tfTWlkKShCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7Ci0KICAgICAvKgogICAgICAqIFNpZGUgZmlsdGVyCiAgICAgICovCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2tfU2lkZSkoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1pZEdhaW47ICAgICAgICAgICAgLyogTWlkZGxlIGdhaW4gaW4gbW9iaWxlIHNwZWFrZXIgbW9kZSAqLworI2Vsc2UKKyAgICAvKgorICAgICAqIE1pZGRsZSBmaWx0ZXIKKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19NaWQpKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CiAKLSAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1pZEdhaW47ICAgICAgICAgICAgLyogTWlkZGxlIGdhaW4gaW4gbW9iaWxlIHNwZWFrZXIgbW9kZSAqLwotCisgICAgLyoKKyAgICAgKiBTaWRlIGZpbHRlcgorICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX1NpZGUpKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICBNaWRHYWluOyAgICAgICAgICAgIC8qIE1pZGRsZSBnYWluIGluIG1vYmlsZSBzcGVha2VyIG1vZGUgKi8KKyNlbmRpZgogfSBMVkNTX1N0ZXJlb0VuaGFuY2VyX3Q7CiAKIApAQCAtNjcsMTIgKzgwLDE3IEBACiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICpwUGFyYW1zKTsKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KLQorI2Vsc2UKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCmluZGV4IDk3NGRlMjEuLmUxNTRlMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKQEAgLTcxLDcgKzcxLDE5IEBACiAgICAge0NTX01JRERMRV80ODAwMF9BMCwgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfTUlERExFXzQ4MDAwX0ExLAogICAgICBDU19NSURETEVfNDgwMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDgwMDBfU0NBTEV9fTsKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV80ODAwMF9TQ0FMRX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsCisgICAge0NTX01JRERMRV85NjAwMF9BMCwgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzk2MDAwX0ExLAorICAgICBDU19NSURETEVfOTYwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfOTYwMDBfU0NBTEV9LAorICAgIHtDU19NSURETEVfMTkyMDAwX0EwLCAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzE5MjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzE5MjAwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xOTIwMDBfU0NBTEV9CisjZW5kaWYKKyAgICB9OwogCiAvKiBDb2VmZmljaWVudCB0YWJsZSBmb3IgdGhlIHNpZGUgZmlsdGVyICovCiBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfU0VTaWRlQ29lZlRhYmxlW10gPSB7CkBAIC0xMzAsNiArMTQyLDIxIEBACiAgICAgIENTX1NJREVfNDgwMDBfQjEsCiAgICAgIENTX1NJREVfNDgwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzQ4MDAwX1NDQUxFfQorI2lmZGVmIEhJR0hFUl9GUworICAgICAsCisgICAgIHtDU19TSURFXzk2MDAwX0EwLCAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfOTYwMDBfQTEsCisgICAgIENTX1NJREVfOTYwMDBfQTIsCisgICAgIENTX1NJREVfOTYwMDBfQjEsCisgICAgIENTX1NJREVfOTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzk2MDAwX1NDQUxFfSwKKyAgICAge0NTX1NJREVfMTkyMDAwX0EwLCAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzE5MjAwMF9BMSwKKyAgICAgQ1NfU0lERV8xOTIwMDBfQTIsCisgICAgIENTX1NJREVfMTkyMDAwX0IxLAorICAgICBDU19TSURFXzE5MjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMTkyMDAwX1NDQUxFfQorI2VuZGlmCiB9OwogCiAKQEAgLTE5NSw2ICsyMjIsMjAgQEAKICAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IxLAogICAgICBDU19FUVVBTElTRVJfNDgwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfNDgwMDBfU0NBTEV9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtDU19FUVVBTElTRVJfOTYwMDBfQTAsICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyLAorICAgICBDU19FUVVBTElTRVJfOTYwMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl85NjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl85NjAwMF9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl8xOTIwMDBfQTAsICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0EyLAorICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRX0sCisjZW5kaWYKIAogICAgIC8qIENvbmNlcnQgU291bmQgRVggSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLwogICAgIHtDU0VYX0VRVUFMSVNFUl84MDAwX0EwLCAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTI1MSw2ICsyOTIsMjEgQEAKICAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEsCiAgICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEV9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgLAorICAgIHtDU0VYX0VRVUFMSVNFUl85NjAwMF9BMCwgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgICB7Q1NFWF9FUVVBTElTRVJfMTkyMDAwX0EwLCAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRX0KKyNlbmRpZgogfTsKIAogCkBAIC0zMzQsNiArMzkwLDIxIEBACiAgICAgIENTX1JFVkVSQl80ODAwMF9CMSwKICAgICAgQ1NfUkVWRVJCXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFfQorI2lmZGVmIEhJR0hFUl9GUworICAgICwKKyAgICB7Q1NfUkVWRVJCXzk2MDAwX0EwLCAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfUkVWRVJCXzk2MDAwX0ExLAorICAgICBDU19SRVZFUkJfOTYwMDBfQTIsCisgICAgIENTX1JFVkVSQl85NjAwMF9CMSwKKyAgICAgQ1NfUkVWRVJCXzk2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzk2MDAwX1NDQUxFfSwKKyAgICAge0NTX1JFVkVSQl8xOTIwMDBfQTAsICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzE5MjAwMF9CMSwKKyAgICAgQ1NfUkVWRVJCXzE5MjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8xOTIwMDBfU0NBTEV9CisjZW5kaWYKIH07CiAKIApAQCAtMzg1LDYgKzQ1NiwyNCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBjb25zdCBMVkNTX1ZvbENvcnJlY3RfdCBMVkNTX1ZvbENvcnJlY3RUYWJsZVtdID0geworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgezAuNDMzMzYyZiwgICAgICAgICAgLyogSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICAwLjAwMDAwMGYsCisgICAgIDEuMDAwMDI0ZiwKKyAgICAgMS40MTI2NDBmfSwKKyAgICB7MC40MzMzNjJmLCAgICAgICAgICAvKiBFWCBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgIDAuMDAwMDAwZiwKKyAgICAgMS4wMDAwMjRmLAorICAgICAxLjQxMjY0MGZ9LAorICAgIHsxLjAwMDAwMGYsICAgICAgICAgLyogSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgMC4wMDAwMDBmLAorICAgICAxLjAwMDAyNGYsCisgICAgIDEuNDEyNjQwZn0sCisgICAgezEuMDAwMDAwZiwgICAgICAgICAvKiBFWCBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLworICAgICAwLjAwMDAwMGYsCisgICAgIDEuMDAwMDI0ZiwKKyAgICAgMS40MTI2NDBmfQorI2Vsc2UKICAgICB7MTQyMDAsICAgICAgICAgIC8qIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KICAgICAgMCwKICAgICAgNDA5NiwKQEAgLTQwMSw2ICs0OTAsNyBAQAogICAgICAwLAogICAgICA0MDk2LAogICAgICA1Nzg2fQorI2VuZGlmCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDE4LDggKzUwOCwyNSBAQAogI2RlZmluZSBMVkNTX1ZPTF9UQ19GczMyMDAwICAgICAzMjcyMSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLwogI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ0MTAwICAgICAzMjczNCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODk2MjQwMiAqLwogI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ4MDAwICAgICAzMjczNyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorI2RlZmluZSBMVkNTX1ZPTF9UQ19Gczk2MDAwICAgICAzMjc1MSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTUxMTcwMyAqLyAgIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE5MjAwMCAgICAzMjc2MyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTg3NzkyNSAqLyAgLyogVG9kbyBAIG5lZWQgdG8gcmUgY2hlY2sgdGhpcyB2YWx1ZSovCisjZW5kaWYKIAotCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCitjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzExXSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczExMDI1LAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxMjAwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczIyMDUwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMyNDAwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczQ0MTAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM0ODAwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzOTYwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczE5MjAwMAorfTsKKyNlbHNlCiBjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzldID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczExMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTIwMDAsCkBAIC00MjgsMTUgKzUzNSwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMjQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDgwMDB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDgwMDAKK307CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU2FtcGxlIHJhdGUgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWNvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzldID0gezgwMDAsCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCitjb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVsxMV0gPSB7ODAwMCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKKwkJCQkJCQkJCQkJICAxMjAwMCwKKwkJCQkJCQkJCQkJICAxNjAwMCwKKwkJCQkJCQkJCQkJICAyMjA1MCwKKwkJCQkJCQkJCQkJICAyNDAwMCwKKwkJCQkJCQkJCQkJICAzMjAwMCwKKwkJCQkJCQkJCQkJICA0NDEwMCwKKwkJCQkJCQkJCQkJICA0ODAwMCwKKwkJCQkJCQkJCQkJICA5NjAwMCwKKwkJCQkJCQkJCQkJICAxOTIwMDAKK307CisjZWxzZQorY29uc3QgTFZNX0lOVDE2ICAgTFZDU19TYW1wbGVSYXRlVGFibGVbOV0gPSB7ODAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKQEAgLTQ0NCw1ICs1NjYsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMH07Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tawppbmRleCBlZmQzMGZiLi5mMTA2YWFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCkBAIC0xMCw3ICsxMCw3IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKIAotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EQlVJTERfRkxPQVQgLURISUdIRVJfRlMKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCiAKIExPQ0FMX01PRFVMRTo9IGxpYmJ1bmRsZXdyYXBwZXIKQEAgLTQzLDcgKzQzLDcgQEAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKICAgICBSZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAogCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCVUlMRF9GTE9BVCAtREhJR0hFUl9GUwogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKIAogTE9DQUxfTU9EVUxFOj0gbGlicmV2ZXJid3JhcHBlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKaW5kZXggZGY2NTAxYi4uNGYxZmVkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCkBAIC0xNCw3ICsxNCw5IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCisjaWZuZGVmIExWTV9GTE9BVAordHlwZWRlZiBmbG9hdCBMVk1fRkxPQVQ7CisjZW5kaWYKICNkZWZpbmUgTE9HX1RBRyAiQnVuZGxlIgogI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIChhcnJheSkgLyBzaXplb2YgKGFycmF5KVswXSkKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKQEAgLTI3MSw3ICsyNzMsMTAgQEAKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAgID0gMDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgICAgID0gMDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgICAgID0gMDsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciAgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgICAgICAgICAgICA9IE5VTEw7CisjZW5kaWYKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOwogICAgICAgICB9CkBAIC00MzksNiArNDQ0LDE0IEBACiAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcik7CiAgICAgICAgIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIpOworICAgICAgICB9CisjZW5kaWYKICAgICAgICAgZGVsZXRlIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQ7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBMVk1fTlVMTDsKICAgICB9CkBAIC02OTUsNyArNzA4LDQ3IEBACiAgICAgcmV0dXJuIDA7CiB9ICAgLyogZW5kIEx2bUJ1bmRsZV9pbml0ICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIElOVDE2TFRPRkxPQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gVG9kbzogbmVlZCB0byB3cml0ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCitzdGF0aWMgdm9pZCBJbnQxNlRvRmxvYXQoY29uc3QgTFZNX0lOVDE2ICpzcmMsIExWTV9GTE9BVCAqZHN0LCBzaXplX3QgbikgeworICAgIHNpemVfdCBpaTsKKyAgICBzcmMgKz0gbi0xOworICAgIGRzdCArPSBuLTE7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgKmRzdCA9ICgoTFZNX0ZMT0FUKSgoTFZNX0lOVDE2KSpzcmMpKSAvIDMyNzY4LjBmOworICAgICAgICBzcmMtLTsKKyAgICAgICAgZHN0LS07CisgICAgfQorICAgIHJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBGTE9BVFRPSU5UMTZfU0FUCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRvZG8gOiBOZWVkIHRvIHdyaXRlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKK3N0YXRpYyB2b2lkIEZsb2F0VG9JbnQxNl9TQVQoY29uc3QgTFZNX0ZMT0FUICpzcmMsIExWTV9JTlQxNiAqZHN0LCBzaXplX3QgbikgeworICAgIHNpemVfdCBpaTsKKyAgICBMVk1fSU5UMzIgdGVtcDsKIAorICAgIHNyYyArPSBuLTE7CisgICAgZHN0ICs9IG4tMTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICB0ZW1wID0gKExWTV9JTlQzMikoKCpzcmMpICogMzI3NjguMGYpOworICAgICAgICBpZiAodGVtcCA+PSAzMjc2NykgeworICAgICAgICAgICAgKmRzdCA9IDMyNzY3OworICAgICAgICB9IGVsc2UgaWYgKHRlbXAgPD0gLTMyNzY4KSB7CisgICAgICAgICAgICAqZHN0ID0gLTMyNzY4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBzcmMtLTsKKyAgICAgICAgZHN0LS07CisgICAgfQorICAgIHJldHVybjsKK30KKyNlbmRpZgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBMdm1CdW5kbGVfcHJvY2VzcygpCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTcxMyw3ICs3NjYsOTkgQEAKIC8vICBwT3V0OiAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgc3RlcmVvIDE2IGJpdCBvdXRwdXQgZGF0YQogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitpbnQgTHZtQnVuZGxlX3Byb2Nlc3MoTFZNX0lOVDE2ICAgICAgICAqcEluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBPdXQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdENvbnRleHQgICAgKnBDb250ZXh0KXsKIAorCisgICAgLy9MVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcE91dFRtcDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0QnVmZjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE91dHB1dEJ1ZmY7CisKKyAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9IChMVk1fRkxPQVQgKiltYWxsb2MoZnJhbWVDb3VudCAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSAqIEZDQ18yKTsKKyAgICB9CisKKyAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgeworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPSAoTFZNX0ZMT0FUICopbWFsbG9jKGZyYW1lQ291bnQgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgIH0KKworICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9PSBOVUxMKSkgeworICAgICAgICBBTE9HVigiTFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgbWVtb3J5IGFsbG9jYXRpb24gZm9yIGZsb2F0IGJ1ZmZlcidzIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwSW5wdXRCdWZmID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyOworICAgIHBPdXRwdXRCdWZmID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcjsKKworICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFKXsKKyAgICAgICAgcE91dFRtcCA9IHBPdXQ7CisgICAgfSBlbHNlIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpeworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCAhPSBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fSU5UMTYpICogRkNDXzIpOworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcE91dFRtcCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkxWTV9FUlJPUiA6IEx2bUJ1bmRsZV9wcm9jZXNzIGludmFsaWQgYWNjZXNzIG1vZGUiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgI2lmZGVmIExWTV9QQ00KKyAgICBmd3JpdGUocEluLCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOworICAgICNlbmRpZgorCisgICAgLyogQ29udmVydGluZyBpbnB1dCBkYXRhIGZyb20gZml4ZWQgcG9pbnQgdG8gZmxvYXQgcG9pbnQgKi8KKyAgICBJbnQxNlRvRmxvYXQocEluLCBwSW5wdXRCdWZmLCBmcmFtZUNvdW50ICogMik7CisKKyAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzICovCisgICAgTHZtU3RhdHVzID0gTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXRCdWZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lQ291bnQsICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXVkbyBUaW1lICovCisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1Byb2Nlc3MiLCAiTHZtQnVuZGxlX3Byb2Nlc3MiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvKiBDb252ZXJ0aW5nIG91dHB1dCBkYXRhIGZyb20gZmxvYXQgcG9pbnQgdG8gZml4ZWQgcG9pbnQgKi8KKyAgICBGbG9hdFRvSW50MTZfU0FUKHBPdXRwdXRCdWZmLCBwT3V0VG1wLCAoTFZNX1VJTlQxNilmcmFtZUNvdW50ICogMik7CisgICAgI2lmZGVmIExWTV9QQ00KKyAgICBmd3JpdGUocE91dFRtcCwgZnJhbWVDb3VudCpzaXplb2YoTFZNX0lOVDE2KSAqIEZDQ18yLCAxLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOworICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOworICAgICNlbmRpZgorCisgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIDI7IGkrKyl7CisgICAgICAgICAgICBwT3V0W2ldID0gY2xhbXAxNigoTFZNX0lOVDMyKXBPdXRbaV0gKyAoTFZNX0lOVDMyKXBPdXRUbXBbaV0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfSAgICAvKiBlbmQgTHZtQnVuZGxlX3Byb2Nlc3MgKi8KKyNlbHNlCiBpbnQgTHZtQnVuZGxlX3Byb2Nlc3MoTFZNX0lOVDE2ICAgICAgICAqcEluLAogICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmcmFtZUNvdW50LApAQCAtNzcxLDcgKzkxNiw3IEBACiAgICAgfQogICAgIHJldHVybiAwOwogfSAgICAvKiBlbmQgTHZtQnVuZGxlX3Byb2Nlc3MgKi8KLQorI2VuZGlmCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zKCkKQEAgLTExMjYsNiArMTI3MSwxNiBAQAogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzQ4MDAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gNDgwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbwogICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICBjYXNlIDk2MDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gOTYwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE5MjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxOTIwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbworICAgICAgICBicmVhazsKKyNlbmRpZgogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCmluZGV4IGVlNjA0ZWIuLmNhZDg5ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCkBAIC0xMDMsNiArMTAzLDEwIEBACiAgICAgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUGNtSW5QdHI7CiAgICAgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUGNtT3V0UHRyOwogICAgICNlbmRpZgorICAgICNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgKnBJbnB1dEJ1ZmZlcjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICpwT3V0cHV0QnVmZmVyOworICAgICNlbmRpZgogfTsKIAogLyogU2Vzc2lvbkNvbnRleHQgOiBPbmUgc2Vzc2lvbiAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKaW5kZXggMTJhMDM4Zi4uYWI2YjYzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCkBAIC0xNCw3ICsxNCw5IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCisjaWZuZGVmIExWTV9GTE9BVAordHlwZWRlZiBmbG9hdCBMVk1fRkxPQVQ7CisjZW5kaWYKICNkZWZpbmUgTE9HX1RBRyAiUmV2ZXJiIgogI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIChhcnJheSkgLyBzaXplb2YgKGFycmF5KVswXSkKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKQEAgLTE1Miw2ICsxNTQsOCBAQAogICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsKICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICpJbkZyYW1lczMyOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgKk91dEZyYW1lczMyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZUluOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZU91dDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eGlsaWFyeTsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldDsKICAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgIGN1clByZXNldDsKQEAgLTE3Miw4ICsxNzYsMTEgQEAKIAogI2RlZmluZSBSRVZFUkJfREVGQVVMVF9QUkVTRVQgUkVWRVJCX1BSRVNFVF9OT05FCiAKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIFJFVkVSQl9TRU5EX0xFVkVMICAgMC43NWYgLy8gMC43NSBpbiA0LjEyIGZvcm1hdAorI2Vsc2UKICNkZWZpbmUgUkVWRVJCX1NFTkRfTEVWRUwgICAoMHgwQzAwKSAvLyAwLjc1IGluIDQuMTIgZm9ybWF0CisjZW5kaWYKICNkZWZpbmUgUkVWRVJCX1VOSVRfVk9MVU1FICAoMHgxMDAwKSAvLyAxLjAgaW4gNC4xMiBmb3JtYXQKIAogLy8tLS0gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwpAQCAtMjY5LDggKzI3NiwxNSBAQAogCiAKICAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHJldmVyYiBwcm9jZXNzICgqMiBpcyBmb3IgU1RFUkVPKQotICAgIHBDb250ZXh0LT5JbkZyYW1lczMyICA9IChMVk1fSU5UMzIgKiltYWxsb2MoTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOwotICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MoTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKGZsb2F0KSAqIDI7CisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBwQ29udGV4dC0+YnVmZmVyU2l6ZUluOworI2Vsc2UKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDI7CisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBwQ29udGV4dC0+YnVmZmVyU2l6ZUluOworI2VuZGlmCisgICAgcENvbnRleHQtPkluRnJhbWVzMzIgID0gKExWTV9JTlQzMiAqKW1hbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZUluKTsKKyAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIgPSAoTFZNX0lOVDMyICopbWFsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplT3V0KTsKIAogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAlcCwgc2l6ZSAlenUiLCBwQ29udGV4dCwgc2l6ZW9mKFJldmVyYkNvbnRleHQpKTsKICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgZW5kXG4iKTsKQEAgLTI5Miw2ICszMDYsOCBAQAogICAgICNlbmRpZgogICAgIGZyZWUocENvbnRleHQtPkluRnJhbWVzMzIpOwogICAgIGZyZWUocENvbnRleHQtPk91dEZyYW1lczMyKTsKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gMDsKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IDA7CiAgICAgUmV2ZXJiX2ZyZWUocENvbnRleHQpOwogICAgIGRlbGV0ZSBwQ29udGV4dDsKICAgICByZXR1cm4gMDsKQEAgLTM4OCw2ICs0MDQsNDggQEAKIH0KICNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBJTlQxNkxUT0ZMT0FUCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRvZG86IG5lZWQgdG8gd3JpdGUgZnVuY3Rpb24gZGVzY3JpcHRvcgorc3RhdGljIHZvaWQgSW50MTZUb0Zsb2F0KGNvbnN0IExWTV9JTlQxNiAqc3JjLCBMVk1fRkxPQVQgKmRzdCwgc2l6ZV90IG4pIHsKKyAgICBzaXplX3QgaWk7CisgICAgc3JjICs9IG4tMTsKKyAgICBkc3QgKz0gbi0xOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICpkc3QgPSAoKExWTV9GTE9BVCkoKExWTV9JTlQxNikqc3JjKSkgLyAzMjc2OC4wZjsKKyAgICAgICAgc3JjLS07CisgICAgICAgIGRzdC0tOworICAgIH0KKyAgICByZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRkxPQVRUT0lOVDE2X1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUb2RvIDogTmVlZCB0byB3cml0ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCitzdGF0aWMgdm9pZCBGbG9hdFRvSW50MTZfU0FUKGNvbnN0IExWTV9GTE9BVCAqc3JjLCBMVk1fSU5UMTYgKmRzdCwgc2l6ZV90IG4pIHsKKyAgICBzaXplX3QgaWk7CisgICAgTFZNX0lOVDMyIHRlbXA7CisKKyAgICBzcmMgKz0gbi0xOworICAgIGRzdCArPSBuLTE7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKCgqc3JjKSAqIDMyNzY4LjBmKTsKKyAgICAgICAgaWYgKHRlbXAgPj0gMzI3NjcpIHsKKyAgICAgICAgICAgICpkc3QgPSAzMjc2NzsKKyAgICAgICAgfSBlbHNlIGlmICh0ZW1wIDw9IC0zMjc2OCkgeworICAgICAgICAgICAgKmRzdCA9IC0zMjc2ODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7CisgICAgICAgIH0KKyAgICAgICAgc3JjLS07CisgICAgICAgIGRzdC0tOworICAgIH0KKyAgICByZXR1cm47Cit9CisjZW5kaWYKKwogc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCiB7CiAgICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKQEAgLTQyMSw4ICs0NzksMzEgQEAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxOwogICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7ICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogICAgIExWTV9JTlQxNiAqT3V0RnJhbWVzMTY7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0QnVmZjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE91dHB1dEJ1ZmY7CisjZW5kaWYKIAotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBpZiAocENvbnRleHQtPkluRnJhbWVzMzIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA8IGZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogMikgeworICAgICAgICBpZiAocENvbnRleHQtPkluRnJhbWVzMzIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+SW5GcmFtZXMzMik7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IGZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogMjsKKyAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzIgPSAoTFZNX0lOVDMyICopbWFsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplSW4pOworICAgIH0KKyAgICBpZiAocENvbnRleHQtPk91dEZyYW1lczMyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0IDwgZnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiAyKSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+T3V0RnJhbWVzMzIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+T3V0RnJhbWVzMzIpOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gZnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiAyOworICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIgPSAoTFZNX0lOVDMyICopbWFsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplT3V0KTsKKyAgICB9CisgICAgcElucHV0QnVmZiA9IChmbG9hdCAqKXBDb250ZXh0LT5JbkZyYW1lczMyOworICAgIHBPdXRwdXRCdWZmID0gKGZsb2F0ICopcENvbnRleHQtPk91dEZyYW1lczMyOworI2VuZGlmCiAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5wdXQgaXMgZWl0aGVyIG1vbm8gb3Igc3RlcmVvCiAgICAgaWYgKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7CiAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDI7CkBAIC00NDgsNDkgKzUyOSw4NCBAQAogICAgICAgICBSZXZlcmJfTG9hZFByZXNldChwQ29udGV4dCk7CiAgICAgfQogCi0KLQogICAgIC8vIENvbnZlcnQgdG8gSW5wdXQgMzIgYml0cwogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgSW50MTZUb0Zsb2F0KHBJbiwgcElucHV0QnVmZiwgZnJhbWVDb3VudCAqIHNhbXBsZXNQZXJGcmFtZSk7CisjZWxzZQogICAgICAgICBmb3IoaW50IGk9MDsgaTxmcmFtZUNvdW50KnNhbXBsZXNQZXJGcmFtZTsgaSsrKXsKICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyW2ldID0gKExWTV9JTlQzMilwSW5baV08PDg7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGluc2VydCByZXZlcmIgaW5wdXQgaXMgYWx3YXlzIHN0ZXJlbwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzJbMippXSA9IChwSW5bMippXSAqIFJFVkVSQl9TRU5EX0xFVkVMKSA+PiA0OyAvLyA8PDggKyA+PjEyCiAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMlsyKmkrMV0gPSAocEluWzIqaSsxXSAqIFJFVkVSQl9TRU5EX0xFVkVMKSA+PiA0OyAvLyA8PDggKyA+PjEyCisjZWxzZQorICAgICAgICAgICAgcElucHV0QnVmZlsyICogaV0gPSAoTFZNX0ZMT0FUKXBJblsyICogaV0gKiBSRVZFUkJfU0VORF9MRVZFTCAvIDMyNzY4LjBmOworICAgICAgICAgICAgcElucHV0QnVmZlsyICogaSArIDFdID0gKExWTV9GTE9BVClwSW5bMiAqIGkgKyAxXSAqIFJFVkVSQl9TRU5EX0xFVkVMIC8gMzI3NjguMGY7CisjZW5kaWYKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cHJlc2V0ICYmIHBDb250ZXh0LT5jdXJQcmVzZXQgPT0gUkVWRVJCX1BSRVNFVF9OT05FKSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgbWVtc2V0KHBPdXRwdXRCdWZmLCAwLCBmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9GTE9BVCkgKiAyKTsgLy9hbHdheXMgc3RlcmVvIGhlcmUKKyNlbHNlCiAgICAgICAgIG1lbXNldChwQ29udGV4dC0+T3V0RnJhbWVzMzIsIDAsIGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorI2VuZGlmCiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYocENvbnRleHQtPmJFbmFibGVkID09IExWTV9GQUxTRSAmJiBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID4gMCkgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBtZW1zZXQocElucHV0QnVmZiwgMCwgZnJhbWVDb3VudCAqIHNpemVvZihMVk1fRkxPQVQpICogc2FtcGxlc1BlckZyYW1lKTsKKyNlbHNlCiAgICAgICAgICAgICBtZW1zZXQocENvbnRleHQtPkluRnJhbWVzMzIsMCxmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9JTlQzMikgKiBzYW1wbGVzUGVyRnJhbWUpOworI2VuZGlmCiAgICAgICAgICAgICBBTE9HVigiXHRaZXJvaW5nICVkIHNhbXBsZXMgcGVyIGZyYW1lIGF0IHRoZSBlbmQgb2YgY2FsbCIsIHNhbXBsZXNQZXJGcmFtZSk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzLCBwcm9kdWNpbmcgYSBzdGVyZW8gb3V0cHV0ICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfUHJvY2VzcyhwQ29udGV4dC0+aEluc3RhbmNlLCAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmYsICAgICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0QnVmZiwgICAgLyogT3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLworI2Vsc2UKICAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfUHJvY2VzcyhwQ29udGV4dC0+aEluc3RhbmNlLCAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyLCAgICAgLyogSW5wdXQgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lczMyLCAgICAvKiBPdXRwdXQgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCi0gICAgfQorI2VuZGlmCisgICAgICAgIH0KIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9Qcm9jZXNzIiwgInByb2Nlc3MiKQogICAgIGlmKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAogICAgIC8vIENvbnZlcnQgdG8gMTYgYml0cwogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgRmxvYXRUb0ludDE2X1NBVChwT3V0cHV0QnVmZiwgT3V0RnJhbWVzMTYsIChzaXplX3QpZnJhbWVDb3VudCAqIDIpOworI2Vsc2UKICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCoyOyBpKyspIHsgLy9hbHdheXMgc3RlcmVvIGhlcmUKICAgICAgICAgICAgIE91dEZyYW1lczE2W2ldID0gY2xhbXAxNihwQ29udGV4dC0+T3V0RnJhbWVzMzJbaV0+PjgpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCoyOyBpKyspIHsgLy9hbHdheXMgc3RlcmVvIGhlcmUKLSAgICAgICAgICAgIE91dEZyYW1lczE2W2ldID0gY2xhbXAxNigocENvbnRleHQtPk91dEZyYW1lczMyW2ldPj44KSArIChMVk1fSU5UMzIpcEluW2ldKTsKLSAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIDI7IGkrKykgey8vYWx3YXlzIHN0ZXJlbyBoZXJlCisgICAgICAgICAgICAgICAgLy9wT3V0cHV0QnVmZiBhbmQgT3V0RnJhbWVzMTYgcG9pbnQgdG8gdGhlIHNhbWUgYnVmZmVyLCBzbyBiZXR0ZXIgdG8KKyAgICAgICAgICAgICAgICAvL2FjY3VtdWxhdGUgaW4gcElucHV0QnVmZiwgd2hpY2ggaXMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgcElucHV0QnVmZltpXSA9IHBPdXRwdXRCdWZmW2ldICsgKExWTV9GTE9BVClwSW5baV0gLyAzMjc2OC4wZjsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgRmxvYXRUb0ludDE2X1NBVChwSW5wdXRCdWZmLCBPdXRGcmFtZXMxNiwgKHNpemVfdClmcmFtZUNvdW50ICogMik7CisjZWxzZQorICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCoyOyBpKyspIHsgLy9hbHdheXMgc3RlcmVvIGhlcmUKKyAgICAgICAgICAgICAgICBPdXRGcmFtZXMxNltpXSA9IGNsYW1wMTYoKHBDb250ZXh0LT5PdXRGcmFtZXMzMltpXT4+OCkgKyAoTFZNX0lOVDMyKXBJbltpXSk7CisgICAgICAgICAgICB9CisjZW5kaWYKICAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHdpdGggcmFtcCBpZiBuZWVkZWQKICAgICAgICAgaWYgKChwQ29udGV4dC0+bGVmdFZvbHVtZSAhPSBwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgfHwKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cmlnaHRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSkgJiYKQEAgLTY0Myw2ICs3NTksMTQgQEAKICAgICBjYXNlIDQ4MDAwOgogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzQ4MDAwOwogICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICBjYXNlIDk2MDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE5MjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CisgICAgICAgIGJyZWFrOworI2VuZGlmCiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1YoIlxyUmV2ZXJiX3NldENvbmZpZyBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTEwMTAsNyArMTEzNCw3IEBACiAgICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCgpIEFjdGl2ZVBhcmFtcy5MUEZMICVkLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsOiAlZCwgIgogICAgIC8vICAgICAiY29udmVydGVkIGxldmVsOiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxQRiwgcENvbnRleHQtPlNhdmVkSGZMZXZlbCwgbGV2ZWwpOwogCi0gICAgaWYoQWN0aXZlUGFyYW1zLkxQRiAhPSBsZXZlbCl7CisgICAgaWYoKGludDE2X3QpQWN0aXZlUGFyYW1zLkxQRiAhPSBsZXZlbCl7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IChpZ25vcmUgYXQgc3RhcnQgdXApIFJldmVyYkdldFJvb21IZkxldmVsKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAogICAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkxldmVsLCBsZXZlbCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKaW5kZXggYmJlOTdlZS4uMDQzYzg0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCkBAIC0xLDcgKzEsNyBAQAogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiLCAib214LzEuMC9pbmNsdWRlIl0sCiB9CiAKIGNjX2xpYnJhcnkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggZjA4ZmFiYi4uMTliMDBmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lDYXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CkBAIC0xMTcsMTIgKzExNiwxMiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICYgY2FzKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSB7CiAgICAgICAgIEFMT0dWKCJzZXRNZWRpYUNhcyIpOwogCiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKEJwTWVkaWFFeHRyYWN0b3I6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2FzKSk7CisgICAgICAgIGRhdGEud3JpdGVCeXRlVmVjdG9yKGNhc1Rva2VuKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUTUVESUFDQVMsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKQEAgLTIwNiwxNSArMjA1LDE0IEBACiAgICAgICAgICAgICBBTE9HVigic2V0TWVkaWFDYXMiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFFeHRyYWN0b3IsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgc3A8SUJpbmRlcj4gY2FzQmluZGVyOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZGF0YS5yZWFkTnVsbGFibGVTdHJvbmdCaW5kZXIoJmNhc0JpbmRlcik7CisgICAgICAgICAgICBISW50ZXJmYWNlVG9rZW4gY2FzVG9rZW47CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkYXRhLnJlYWRCeXRlVmVjdG9yKCZjYXNUb2tlbik7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlYWRpbmcgY2FzIGZyb20gcGFyY2VsIik7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlYWRpbmcgY2FzVG9rZW4gZnJvbSBwYXJjZWwiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8SUNhcz4gY2FzID0gaW50ZXJmYWNlX2Nhc3Q8SUNhcz4oY2FzQmluZGVyKTsKIAotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0TWVkaWFDYXMoY2FzKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRNZWRpYUNhcyhjYXNUb2tlbikpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCmluZGV4IDQzMTMwZWIuLmEwNzMwODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAotI2luY2x1ZGUgPG9teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9JR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaAppbmRleCBlMDMxNzY1Li41ZDI1ZTRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKQEAgLTM5LDYgKzM5LDExIEBACiAKIHN0cnVjdCBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlOwogCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbCwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyKSB7CisgICAgaWYgKGwuc2l6ZSgpICE9IHIuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIG1lbWNtcChsLmFycmF5KCksIHIuYXJyYXkoKSwgbC5zaXplKCkpID09IDA7Cit9CisKIHN0cnVjdCBEcm1IYWwgOiBwdWJsaWMgQm5Ecm0sCiAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAogICAgICAgICAgICAgIHB1YmxpYyBJRHJtUGx1Z2luTGlzdGVuZXIgewpAQCAtMTYxLDYgKzE2Niw5IEBACiAgICAgY29uc3QgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gbUZhY3RvcmllczsKICAgICBzcDxJRHJtUGx1Z2luPiBtUGx1Z2luOwogCisgICAgVmVjdG9yPFZlY3Rvcjx1aW50OF90Pj4gbU9wZW5TZXNzaW9uczsKKyAgICB2b2lkIGNsb3NlT3BlblNlc3Npb25zKCk7CisKICAgICAvKioKICAgICAgKiBtSW5pdENoZWNrIGlzOgogICAgICAqICAgTk9fSU5JVCBpZiBhIHBsdWdpbiBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldApAQCAtMTc1LDYgKzE4MywxMSBAQAogCiAgICAgdm9pZCB3cml0ZUJ5dGVBcnJheShQYXJjZWwgJm9iaiwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGFycmF5KTsKIAorICAgIHZvaWQgcmVwb3J0TWV0cmljcygpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtSGFsKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3Rvci5oCmluZGV4IGFiNDBmNTMuLjFlMTNiNjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaApAQCAtMjAsMTQgKzIwLDEyIEBACiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE1ldGFEYXRhOwotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci19OwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwordHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50OF90PiBISW50ZXJmYWNlVG9rZW47CiAKIGNsYXNzIElNZWRpYUV4dHJhY3RvciA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKIHB1YmxpYzoKQEAgLTY1LDcgKzYzLDcgQEAKICAgICAvLyBmb3IgRFJNCiAgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSAgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmY2FzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IHVpZCkgID0gMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTVhMzYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUExVR0lOX01FVFJJQ1NfUkVQT1JUSU5HX0hfCisKKyNkZWZpbmUgUExVR0lOX01FVFJJQ1NfUkVQT1JUSU5HX0hfCisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgcmVwb3J0RHJtUGx1Z2luTWV0cmljcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlcmlhbGl6ZWRNZXRyaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiB2ZW5kb3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBkZXNjcmlwdGlvbik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUExVR0lOX01FVFJJQ1NfUkVQT1JUSU5HX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oIGIvbWVkaWEvbGlibWVkaWEvb214LzEuMC9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvb214LzEuMC9pbmNsdWRlL21lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL29teC8xLjAvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmggYi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL29teC8xLjAvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL29teC8xLjAvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWEvb214LzEuMC9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaCBiL21lZGlhL2xpYm1lZGlhL29teC8xLjAvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE9ic2VydmVyLmggYi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggNmEwOTIyNy4uZGYzNjA0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC0xMTcxLDcgKzExNzEsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtU291cmNlICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtU3VyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdXJmYWNlID09IE5VTEwgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSBhdWRpbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKQEAgLTExODIsNyArMTE4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9TaW5rID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvU2luayA9PSBOVUxMIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBlcnJvciwgb3IgdGhpcyBzdHJlYW0gaGFzIG9ubHkgdmlkZW8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgZXJyb3IsIG5vdGlmeSBjbGllbnQgb2YgZXJyb3IuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIGVycik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCBhZDc4OGY3Li4wZmMxYWE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTYzOSwxMSArNjM5LDYgQEAKICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TVE9QUEVEKTsKICAgICB9CiAKLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCBmYWxzZSkpIHsKLSAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOwotICAgICAgICBkdW1wKC0xLCBhcmdzKTsKLSAgICB9Ci0KICAgICBtU3RhdGUgPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzsKICAgICBtUGxheWVyLT5yZXNldEFzeW5jKCk7CiAKQEAgLTkzNSw3ICs5MzAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2VuZCBjb21wbGV0aW9uIGV2ZW50IHdoZW4gbG9vcGluZwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmRlYnVnLnNmLnN0YXRzIiwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICAgICAgICAgICAgICAgICAgZHVtcCgtMSwgYXJncyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCmluZGV4IDc1OGRiMWYuLjQ4M2E5ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKQEAgLTg0MCw3ICs4NDAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOwogfQogCiBzaXplX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewpAQCAtOTE3LDEwICs5MTcsMTAgQEAKICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CiAgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IG5vdGlmeUVPUyAiCisgICAgICAgICAgICBBTE9HVigiZmlsbEF1ZGlvQnVmZmVyOiBub3RpZnlFT1NfbCAiCiAgICAgICAgICAgICAgICAgICAgICJtTnVtRnJhbWVzV3JpdHRlbjoldSAgZmluYWxSZXN1bHQ6JWQgIHBvc3RFT1NEZWxheTolbGxkIiwKICAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4sIGVudHJ5LT5tRmluYWxSZXN1bHQsIChsb25nIGxvbmcpcG9zdEVPU0RlbGF5VXMpOwotICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKKyAgICAgICAgICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc2l6ZUNvcGllZDsKQEAgLTE0MDgsNiArMTQwOCwxMSBAQAogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5RU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG5vdGlmeUVPU19sKGF1ZGlvLCBmaW5hbFJlc3VsdCwgZGVsYXlVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlFT1NfbChib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzKSB7CiAgICAgaWYgKGF1ZGlvICYmIGRlbGF5VXMgPiAwKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFT1MsIHRoaXMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJhdWRpb0VPU0dlbmVyYXRpb24iLCBtQXVkaW9FT1NHZW5lcmF0aW9uKTsKQEAgLTE0MjAsNiArMTQyNSwxMSBAQAogICAgIG5vdGlmeS0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKICAgICBub3RpZnktPnNldEludDMyKCJmaW5hbFJlc3VsdCIsIGZpbmFsUmVzdWx0KTsKICAgICBub3RpZnktPnBvc3QoZGVsYXlVcyk7CisKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgLy8gVmlkZW8gbWlnaHQgb3V0bGl2ZSBhdWRpby4gQ2xlYXIgYW5jaG9yIHRvIGVuYWJsZSB2aWRlbyBvbmx5IGNhc2UuCisgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOworICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUF1ZGlvVGVhckRvd24oQXVkaW9UZWFyRG93blJlYXNvbiByZWFzb24pIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCmluZGV4IGU2ODUwYjUuLmY1OGI3OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApAQCAtMjc1LDYgKzI3NSw3IEBACiAgICAgdm9pZCBvbkNoYW5nZUF1ZGlvRm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwogCiAgICAgdm9pZCBub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOworICAgIHZvaWQgbm90aWZ5RU9TX2woYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOwogICAgIHZvaWQgbm90aWZ5Rmx1c2hDb21wbGV0ZShib29sIGF1ZGlvKTsKICAgICB2b2lkIG5vdGlmeVBvc2l0aW9uKCk7CiAgICAgdm9pZCBub3RpZnlWaWRlb0xhdGVCeShpbnQ2NF90IGxhdGVCeVVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCmluZGV4IGY1MTE4NzYuLjQyMjBiNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icApAQCAtMSwxNSArMSw1MSBAQAorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYm5iYWlvX21vbm9fZGVmYXVsdHMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIk1vbm9QaXBlLmNwcCIsCisgICAgICAgICJNb25vUGlwZVJlYWRlci5jcHAiLAorICAgICAgICAiTkJBSU8uY3BwIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlX21vbm8iXSwKK30KKworLy8gbGlibmJhaW9fbW9ubyBpcyB0aGUgcGFydCBvZiBsaWJuYmFpbyB0aGF0IGlzIGF2YWlsYWJsZSBmb3IgdmVuZG9ycyB0byB1c2UuIFZlbmRvciBtb2R1bGVzIGNhbid0CisvLyBsaW5rIGFnYWluc3QgbGlibmJhaW8gYW5kIHN5c3RlbSBtb2R1bGVzIGNhbid0IGxpbmsgYWdhaW5zdCBsaWJuYmFpb19tb25vLiBUaGUgcmVzdCBvZiBsaWJuYmFpbworLy8gcHVsbHMgaW4gdG9vIG1hbnkgb3RoZXIgZGVwZW5kZW5jaWVzLgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJuYmFpb19tb25vIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgZGVmYXVsdHM6IFsibGlibmJhaW9fbW9ub19kZWZhdWx0cyJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm5iYWlvIiwKKyAgICBkZWZhdWx0czogWyJsaWJuYmFpb19tb25vX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWwogICAgICAgICAiQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5jcHAiLAogICAgICAgICAiQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAiLAogICAgICAgICAiQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCIsCi0gICAgICAgICJNb25vUGlwZS5jcHAiLAotICAgICAgICAiTW9ub1BpcGVSZWFkZXIuY3BwIiwKLSAgICAgICAgIk5CQUlPLmNwcCIsCiAgICAgICAgICJOQkxvZy5jcHAiLAorICAgICAgICAiUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAiLAogICAgICAgICAiUGlwZS5jcHAiLAogICAgICAgICAiUGlwZVJlYWRlci5jcHAiLAorICAgICAgICAiUmVwb3J0UGVyZm9ybWFuY2UuY3BwIiwKICAgICAgICAgIlNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuY3BwIiwKICAgICBdLAogCkBAIC0yNCw4ICs2MCw4IEBACiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0zNSw3ICs3MSw1IEBACiAKICAgICBpbmNsdWRlX2RpcnM6IFsic3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUiXSwKIAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0KICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCmluZGV4IGNiZmY4N2QuLjg1NjQ4OTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcApAQCAtMTgsNiArMTgsNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaD4KIApAQCAtODIsOCArODMsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBwb3NpdGlvbjY0OwotICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KLSAgICAgICAgICAgIHRpbWUudHZfc2VjICogMTAwMDAwMDAwMExMICsgdGltZS50dl9uc2VjOworICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAgYi9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKaW5kZXggZWJiOTBjOC4uMmY2MzlkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcApAQCAtMTgsMTQgKzE4LDE0IEBACiAqIERvY3VtZW50YXRpb246IFdvcmtmbG93IHN1bW1hcnkgZm9yIGhpc3RvZ3JhbSBkYXRhIHByb2Nlc3Npbmc6CiAqIEZvciBtb3JlIGRldGFpbHMgb24gRklGTywgcGxlYXNlIHNlZSBzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHM7IGRveHlnZW4KICogVE9ETzogYWRkIHRoaXMgZG9jdW1lbnRhdGlvbiB0byBkb3h5Z2VuIG9uY2UgaXQgaXMgZnVydGhlciBkZXZlbG9wZWQKLSogMSkgd3JpdGluZyB0aGUgZGF0YSB0byBhIGJ1ZmZlcgotKiBvbldvcmsKKyogMSkgV3JpdGluZyBidWZmZXIgcGVyaW9kIHRpbWVzdGFtcCB0byB0aGUgY2lyY3VsYXIgYnVmZmVyCisqIG9uV29yaygpCiAqICAgICBDYWxsZWQgZXZlcnkgcGVyaW9kIGxlbmd0aCAoZS5nLiwgNG1zKQogKiAgICAgQ2FsbHMgTE9HX0hJU1RfVFMKICogTE9HX0hJU1RfVFMKLSogICAgIEhhc2hlcyBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCi0qICAgICBjYWxscyBOQkxPRzo6V3JpdGVyOjpsb2dIaXN0VFMgb25jZQotKiBOQkxPRzo6V3JpdGVyOjpsb2dIaXN0VFMKKyogICAgIEhhc2hlcyBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyLCBhbmQgd3JpdGVzIHNpbmdsZSB0aW1lc3RhbXAgdG8gYnVmZmVyCisqICAgICBjYWxscyBOQkxPRzo6V3JpdGVyOjpsb2dFdmVudEhpc3RUUyBvbmNlCisqIE5CTE9HOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRTCiAqICAgICBjYWxscyBOQkxPRzo6V3JpdGVyOjpsb2cgb24gaGFzaCBhbmQgY3VycmVudCB0aW1lc3RhbXAKICogICAgIHRpbWUgaXMgaW4gQ0xPQ0tfTU9OT1RPTklDIGNvbnZlcnRlZCB0byBucwogKiBOQkxPRzo6V3JpdGVyOjpsb2coRXZlbnQsIGNvbnN0IHZvaWQqLCBzaXplX3QpCkBAIC00NCw2ICs0NCw4IEBACiAqIHNzaXplX3QgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6Om9idGFpbgogKiAgICAgRGV0ZXJtaW5lcyByZWFkYWJsZSBidWZmZXIgc2VjdGlvbiB2aWEgcG9pbnRlciBhcml0aG1ldGljIG9uIHJlYWRlcgogKiAgICAgYW5kIHdyaXRlciBwb2ludGVycworKiBTaW1pbGFybHksIExPR19BVURJT19TVEFURSgpIGlzIGNhbGxlZCBieSBvblN0YXRlQ2hhbmdlIHdoZW5ldmVyIGF1ZGlvIGlzCisqIHR1cm5lZCBvbiBvciBvZmYsIGFuZCB3cml0ZXMgdGhpcyBub3RpZmljYXRpb24gdG8gdGhlIEZJRk8uCiAqCiAqIDIpIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBzaGFyZWQgbWVtb3J5CiAqIFRocmVhZDo6dGhyZWFkbG9vcCgpCkBAIC01MSw2ICs1Myw3IEBACiAqIE5CTG9nOjpNZXJnZVRocmVhZDo6dGhyZWFkTG9vcCgpCiAqICAgICBjYWxscyBOQkxvZzo6TWVyZ2VyOjptZXJnZQogKiBOQkxvZzo6TWVyZ2VyOjptZXJnZQorKiAgICAgTWVyZ2VzIHNuYXBzaG90cyBzb3J0ZWQgYnkgdGltZXN0YW1wCiAqICAgICBmb3IgZWFjaCByZWFkZXIgaW4gdmVjdG9yIG9mIGNsYXNzIE5hbWVkUmVhZGVyLAogKiAgICAgY2FsbHNOYW1lZFJlYWRlcjo6cmVhZGVyKCktPmdldFNuYXBzaG90CiAqICAgICBUT0RPOiBjaGVjayB3aGV0aGVyIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gaXMgcmVsZXZhbnQKQEAgLTU5LDExICs2MiwxMiBAQAogKiAgICAgY2FsbHMgbUZpZm9SZWFkZXItPm9idGFpbiB0byBmaW5kIHJlYWRhYmxlIGRhdGEKICogICAgIHNldHMgc25hcHNob3QuYmVnaW4oKSBhbmQgLmVuZCgpIGl0ZXJhdG9ycyB0byBib3VuZGFyaWVzIG9mIHZhbGlkIGVudHJpZXMKICogICAgIG1vdmVzIHRoZSBmaWZvIHJlYWRlciBpbmRleCB0byBhZnRlciB0aGUgbGFzdCBlbnRyeSByZWFkCi0qICAgICBpbiB0aGlzIGNhc2UsIHRoZSBidWZmZXIgaXMgaW4gc2hhcmVkIG1lbW9yeS4gaW4gKDMpLCB0aGUgYnVmZmVyIGlzIHByaXZhdGUKKyogICAgIGluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciBpcyBpbiBzaGFyZWQgbWVtb3J5LiBpbiAoNCksIHRoZSBidWZmZXIgaXMgcHJpdmF0ZQogKgogKiAzKSByZWFkaW5nIHRoZSBkYXRhIGZyb20gcHJpdmF0ZSBidWZmZXIKICogTWVkaWFMb2dTZXJ2aWNlOjpkdW1wCi0qICAgICBjYWxscyBOQkxvZzo6UmVhZGVyOjpkdW1wKGludCkgb24gaW5zdGFuY2Ugb2Ygc3ViY2xhc3MgbWVyZ2VSZWFkZXIKKyogICAgIGNhbGxzIE5CTG9nOjpSZWFkZXI6OmR1bXAoQ09OU09MRSkKKyogICAgIFRoZSBwcml2YXRlIGJ1ZmZlciBjb250YWlucyBhbGwgbG9ncyBmb3IgYWxsIHJlYWRlcnMgaW4gc2hhcmVkIG1lbW9yeQogKiBOQkxvZzo6UmVhZGVyOjpkdW1wKGludCkKICogICAgIGNhbGxzIGdldFNuYXBzaG90IG9uIHRoZSBjdXJyZW50IHJlYWRlcgogKiAgICAgY2FsbHMgZHVtcChpbnQsIHNpemVfdCwgU25hcHNob3QpCkBAIC03Miw5ICs3NiwxMCBAQAogKiAgICAgKHN0cmluZywgdGltZXN0YW1wLCBldGMuLi4pCiAqICAgICBJbiB0aGUgY2FzZSBvZiBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsIGFkZHMgYSBsaXN0IG9mIHRpbWVzdGFtcCBzZXF1ZW5jZXMKICogICAgIChoaXN0b2dyYW0gZW50cnkpIHRvIE5CTG9nOjptSGlzdHMKLSogICAgIEluIHRoZSBjYXNlIG9mIEVWRU5UX0hJU1RPR1JBTV9GTFVTSCwgY2FsbHMgZHJhd0hpc3RvZ3JhbSBvbiBlYWNoIGVsZW1lbnQgaW4KLSogICAgIHRoZSBsaXN0IGFuZCBlcmFzZXMgaXQKLSogICAgIFRPRE86IHdoZW4gZG8gdGhlc2UgZXZlbnRzIG9jY3VyPworKiAgICAgVE9ETzogYWRkIGV2ZXJ5IEhJU1RPR1JBTV9FTlRSWV9UUyB0byB0d28KKyogICAgIGNpcmN1bGFyIGJ1ZmZlcnM6IG9uZSBzaG9ydC10ZXJtIGFuZCBvbmUgbG9uZy10ZXJtIChjYW4gYWRkIGV2ZW4gbG9uZ2VyLXRlcm0KKyogICAgIHN0cnVjdHVyZXMgaW4gdGhlIGZ1dHVyZSkuIFdoZW4gZHVtcCBpcyBjYWxsZWQsIHByaW50IGV2ZXJ5dGhpbmcgY3VycmVudGx5CisqICAgICBpbiB0aGUgYnVmZmVyLgogKiBOQkxvZzo6ZHJhd0hpc3RvZ3JhbQogKiAgICAgaW5wdXQ6IHRpbWVzdGFtcCBhcnJheQogKiAgICAgYnVja2V0cyB0aGlzIHRvIGEgaGlzdG9ncmFtIGFuZCBwcmludHMKQEAgLTgyLDcgKzg3LDcgQEAKICovCiAKICNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNsaW1pdHM+CkBAIC0xMDIsNiArMTA3LDggQEAKICNpbmNsdWRlIDxuZXc+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmg+CiAvLyAjaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+IC8vIHVzZWQgdG8gcHJpbnQgY2FsbHN0YWNrCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtMTM0LDcgKzE0MSw3IEBACiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6CiAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZvcm1hdEVudHJ5PihGb3JtYXRFbnRyeShwdHIpKTsKLSAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9GTFVTSDoKKyAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOgogICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOgogICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxIaXN0b2dyYW1FbnRyeT4oSGlzdG9ncmFtRW50cnkocHRyKSk7CiAgICAgZGVmYXVsdDoKQEAgLTUxMyw3ICs1MjAsNyBAQAogICAgIGxvZyhFVkVOVF9IQVNILCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKIH0KIAotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dIaXN0VFMobG9nX2hhc2hfdCBoYXNoKQordm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKQogewogICAgIGlmICghbUVuYWJsZWQpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNTIyLDIyICs1MjksNyBAQAogICAgIGRhdGEuaGFzaCA9IGhhc2g7CiAgICAgZGF0YS50cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKICAgICBpZiAoZGF0YS50cyA+IDApIHsKLSAgICAgICAgbG9nKEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgJmRhdGEsIHNpemVvZihkYXRhKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0hpc3RGbHVzaChsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEhpc3RUc0VudHJ5IGRhdGE7Ci0gICAgZGF0YS5oYXNoID0gaGFzaDsKLSAgICBkYXRhLnRzID0gZ2V0X21vbm90b25pY19ucygpOwotICAgIGlmIChkYXRhLnRzID4gMCkgewotICAgICAgICBsb2coRVZFTlRfSElTVE9HUkFNX0ZMVVNILCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgICAgbG9nKGV2ZW50LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKICAgICB9CkBAIC03NzEsMTUgKzc2MywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UU307CiBjb25zdCBzdGQ6OnNldDxOQkxvZzo6RXZlbnQ+IE5CTG9nOjpSZWFkZXI6OmVuZGluZ1R5cGVzICAge05CTG9nOjpFdmVudDo6RVZFTlRfRU5EX0ZNVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0ZMVVNIfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9BVURJT19TVEFURX07CisKIE5CTG9nOjpSZWFkZXI6OlJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQogICAgIDogbVNoYXJlZCgoLypjb25zdCovIFNoYXJlZCAqKSBzaGFyZWQpLCAvKm1JTWVtb3J5Ki8KICAgICAgIG1GZCgtMSksIG1JbmRlbnQoMCksCiAgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwogICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCiAgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1JlYWRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKCptRmlmbykgOiBOVUxMKSwKLSAgICAgIGZpbmRHbGl0Y2goZmFsc2UpCisgICAgICBtRmlmb1JlYWRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKCptRmlmbykgOiBOVUxMKQogewogfQogCkBAIC03OTUsMzkgKzc4Nyw2IEBACiAgICAgZGVsZXRlIG1GaWZvOwogfQogCi1pbmxpbmUgc3RhdGljIGludCBkZWx0YU1zKGludDY0X3QgbnMxLCBpbnQ2NF90IG5zMikgewotICAgIHJldHVybiAobnMyIC0gbnMxKSAvICgxMDAwICogMTAwMCk7Ci19Ci0KLS8vIFByb2R1Y2VzIGEgbG9nIHdhcm5pbmcgaWYgdGhlIHRpbWluZyBvZiByZWNlbnQgYnVmZmVyIHBlcmlvZHMgY2F1c2VkIGEgZ2xpdGNoCi0vLyBDb21wdXRlcyBzdW0gb2YgcnVubmluZyB3aW5kb3cgb2YgdGhyZWUgYnVmZmVyIHBlcmlvZHMKLS8vIENoZWNrcyB3aGV0aGVyIHRoZSBidWZmZXIgcGVyaW9kcyBsZWF2ZSBlbm91Z2ggQ1BVIHRpbWUgZm9yIHRoZSBuZXh0IG9uZQotLy8gZS5nLiBpZiBhIGJ1ZmZlciBwZXJpb2QgaXMgZXhwZWN0ZWQgdG8gYmUgNCBtcyBhbmQgYSBidWZmZXIgcmVxdWlyZXMgMyBtcyBvZiBDUFUgdGltZSwKLS8vIGhlcmUgYXJlIHNvbWUgZ2xpdGNoIGNhc2VzOgotLy8gNCArIDQgKyA2IDsgNSArIDQgKyA1OyAyICsgMiArIDEwCi0vLyBUT0RPOiBkZXZlbG9wIHRoaXMgY29kZSB0byB0cmFjayBjaGFuZ2VzIGluIGhpc3RvZ3JhbSBkaXN0cmlidXRpb24gaW4gYWRkaXRpb24KLS8vIHRvIC8gaW5zdGVhZCBvZiBnbGl0Y2hlcwotdm9pZCBOQkxvZzo6UmVhZGVyOjphbGVydElmR2xpdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzKSB7Ci0gICAgLy9UT0RPOiBtZWFzdXJlIGtQZXJpb2RMZW4gYW5kIGtSYXRpbyBmcm9tIHRoZSBkYXRhIGFzIHRoZXkgbWF5IGNoYW5nZS4KLSAgICBzdGF0aWMgY29uc3QgaW50IGtQZXJpb2RMZW4gPSA0OyAvLyBjdXJyZW50IHBlcmlvZCBsZW5ndGggaXMgaWRlYWxseSA0IG1zCi0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrUmF0aW8gPSAwLjc1OyAvLyBlc3RpbWF0ZSBvZiBDUFUgdGltZSBhcyByYXRpbyBvZiBwZXJpb2QgbGVuZ3RoCi0gICAgLy8gREFDIHByb2Nlc3NpbmcgdGltZSBmb3IgNCBtcyBidWZmZXIKLSAgICBzdGF0aWMgY29uc3QgaW50IGtQZXJpb2RUaW1lID0gc3RhdGljX2Nhc3Q8aW50Pihyb3VuZChrUGVyaW9kTGVuICoga1JhdGlvKSk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBrTnVtQnVmZiA9IDM7IC8vIG51bWJlciBvZiBidWZmZXJzIGNvbnNpZGVyZWQgaW4gbG9jYWwgaGlzdG9yeQotICAgIHN0ZDo6ZGVxdWU8aW50PiBwZXJpb2RzKGtOdW1CdWZmLCBrUGVyaW9kTGVuKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsgLy8gc2tpcCBmaXJzdCB0aW1lIGVudHJ5Ci0gICAgICAgIHBlcmlvZHMucHVzaF9mcm9udChkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKSk7Ci0gICAgICAgIHBlcmlvZHMucG9wX2JhY2soKTsKLSAgICAgICAgLy8gVE9ETzogY2hlY2sgdGhhdCBhbGwgZ2xpdGNoIGNhc2VzIGFyZSBjb3ZlcmVkCi0gICAgICAgIGlmIChzdGQ6OmFjY3VtdWxhdGUocGVyaW9kcy5iZWdpbigpLCBwZXJpb2RzLmVuZCgpLCAwKSA+IGtOdW1CdWZmICoga1BlcmlvZExlbiArCi0gICAgICAgICAgICBrUGVyaW9kTGVuIC0ga1BlcmlvZFRpbWUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQSBnbGl0Y2ggb2NjdXJyZWQiKTsKLSAgICAgICAgICAgICAgICBwZXJpb2RzLmFzc2lnbihrTnVtQnVmZiwga1BlcmlvZExlbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCiBjb25zdCB1aW50OF90ICpOQkxvZzo6UmVhZGVyOjpmaW5kTGFzdEVudHJ5T2ZUeXBlcyhjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcykgewogICAgIHdoaWxlIChiYWNrICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldCA+PSBmcm9udCkgewpAQCAtOTExLDYxICs4NzAsMTcgQEAKIAogfQogCi0vLyB3cml0ZXMgc2FtcGxlIGRlbHRhcyB0byBmaWxlLCBlaXRoZXIgdHJ1bmNhdGluZyBvciBhcHBlbmRpbmcKLWlubGluZSB2b2lkIHdyaXRlSGlzdFRvRmlsZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmc2FtcGxlcywgYm9vbCBhcHBlbmQpIHsKLSAgICAvLyBuYW1lIG9mIGZpbGUgb24gYXVkaW9zZXJ2ZXIKLSAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga05hbWUgPSAoY2hhciAqKSIvZGF0YS9taXNjL2F1ZGlvc2VydmVyL3NhbXBsZV9yZXN1bHRzLnR4dCI7Ci0gICAgLy8gc3RvcmVzIGRlbHRhcyBiZXR3ZWVuIHRoZSBzYW1wbGVzCi0gICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gaW50ZXJ2YWxzOwotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgc2FtcGxlcy5zaXplKCk7ICsraSkgewotICAgICAgICBpbnRlcnZhbHMucHVzaF9iYWNrKGRlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pKTsKLSAgICB9Ci0gICAgaWYgKGludGVydmFscy5lbXB0eSgpKSByZXR1cm47Ci0gICAgLy8gRGVsZXRlcyBtYXhpbXVtIHZhbHVlIGluIGEgaGlzdG9ncmFtLiBUZW1wIHF1aWNrIGZpeC4KLSAgICAvLyBGSVhNRTogbmVlZCB0byBmaW5kIHJvb3QgY2F1c2Ugb2YgYXBwcm94LiAzNXRoIGVsZW1lbnQgZnJvbSB0aGUgZW5kCi0gICAgLy8gY29uc2lzdGVudGx5IGJlaW5nIGFuIG91dGxpZXIgaW4gdGhlIGZpcnN0IGhpc3RvZ3JhbSBvZiBhIGZsdXNoCi0gICAgLy8gQUxPR1coIiUiIFBSSWQ2NCAiYmVmb3JlIiwgKGludDY0X3QpICooc3RkOjptYXhfZWxlbWVudChpbnRlcnZhbHMuYmVnaW4oKSwgaW50ZXJ2YWxzLmVuZCgpKSkpOwotICAgIGludGVydmFscy5lcmFzZShzdGQ6Om1heF9lbGVtZW50KGludGVydmFscy5iZWdpbigpLCBpbnRlcnZhbHMuZW5kKCkpKTsKLSAgICAvLyBBTE9HVygiJSIgUFJJZDY0ICJhZnRlciIsIChpbnQ2NF90KSAqKHN0ZDo6bWF4X2VsZW1lbnQoaW50ZXJ2YWxzLmJlZ2luKCksIGludGVydmFscy5lbmQoKSkpKTsKLSAgICBzdGQ6Om9mc3RyZWFtIG9mczsKLSAgICBvZnMub3BlbihrTmFtZSwgYXBwZW5kID8gc3RkOjppb3M6OmFwcCA6IHN0ZDo6aW9zOjp0cnVuYyk7Ci0gICAgaWYgKCFvZnMpIHsKLSAgICAgICAgQUxPR1coImNvdWxkbid0IG9wZW4gZmlsZSAlcyIsIGtOYW1lKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGludGVydmFscy5zaXplKCk7ICsraSkgewotICAgICAgICBvZnMgPDwgaW50ZXJ2YWxzW2ldIDw8ICJcbiI7Ci0gICAgfQotICAgIG9mcy5jbG9zZSgpOwotfQotCisvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gUGVyZm9ybWFuY2VBbmFseXNpcworLy8gVE9ETzogbWFrZSBjYWxsIHRvIGR1bXAgcGVyaW9kaWMgc28gdGhhdCBkYXRhIGluIHNoYXJlZCBGSUZPIGRvZXMgbm90IGdldCBvdmVyd3JpdHRlbgogdm9pZCBOQkxvZzo6UmVhZGVyOjpkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCwgTkJMb2c6OlJlYWRlcjo6U25hcHNob3QgJnNuYXBzaG90KQogewotICAvLyAgQ2FsbFN0YWNrIGNzKExPR19UQUcpOwotI2lmIDAKLSAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0gICAgdGltZV90IG1heFNlYyA9IC0xOwotICAgIHdoaWxlIChlbnRyeSAtIHN0YXJ0ID49IChpbnQpIEVudHJ5OjprT3ZlcmhlYWQpIHsKLSAgICAgICAgaWYgKHByZXZFbnRyeSAtIHN0YXJ0IDwgMCB8fCAhcHJldkVudHJ5Lmhhc0NvbnNpc3RlbnRMZW5ndGgoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZXZFbnRyeS0+dHlwZSA9PSBFVkVOVF9USU1FU1RBTVApIHsKLSAgICAgICAgICAgIGlmIChwcmV2RW50cnktPmxlbmd0aCAhPSBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSkgewotICAgICAgICAgICAgICAgIC8vIGNvcnJ1cHQKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZFbnRyeS5jb3B5RGF0YSgodWludDhfdCopICZ0cyk7Ci0gICAgICAgICAgICBpZiAodHMudHZfc2VjID4gbWF4U2VjKSB7Ci0gICAgICAgICAgICAgICAgbWF4U2VjID0gdHMudHZfc2VjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC0tZW50cnk7Ci0gICAgICAgIC0tcHJldkVudHJ5OwotICAgIH0KLSNlbmRpZgogICAgIG1GZCA9IGZkOwogICAgIG1JbmRlbnQgPSBpbmRlbnQ7CiAgICAgU3RyaW5nOCB0aW1lc3RhbXAsIGJvZHk7CisgICAgLy8gRklYTUU6IHRoaXMgaXMgbm90IHRocmVhZCBzYWZlCisgICAgLy8gVE9ETzogbmVlZCBhIHNlcGFyYXRlIGluc3RhbmNlIG9mIHBlcmZvcm1hbmNlQW5hbHlzaXMgZm9yIGVhY2ggdGhyZWFkCisgICAgLy8gdXNlZCB0byBzdG9yZSBkYXRhIGFuZCB0byBjYWxsIGFuYWx5c2lzIGZ1bmN0aW9ucworICAgIHN0YXRpYyBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VBbmFseXNpcyBwZXJmb3JtYW5jZUFuYWx5c2lzOwogICAgIHNpemVfdCBsb3N0ID0gc25hcHNob3QubG9zdCgpICsgKHNuYXBzaG90LmJlZ2luKCkgLSBFbnRyeUl0ZXJhdG9yKHNuYXBzaG90LmRhdGEoKSkpOwogICAgIGlmIChsb3N0ID4gMCkgewogICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogbG9zdCAlenUgYnl0ZXMgd29ydGggb2YgZXZlbnRzIiwgbG9zdCk7CkBAIC05NzMsODUgKzg4OCw5IEBACiAgICAgICAgIC8vICAgICAgbG9nIHRvIHB1c2ggaXQgb3V0LiAgQ29uc2lkZXIga2VlcGluZyB0aGUgdGltZXN0YW1wL2JvZHkgYmV0d2VlbiBjYWxscyB0byBjb3B5RW50cnlEYXRhQXQoKS4KICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKICAgICB9Ci0jaWYgMAotICAgIHNpemVfdCB3aWR0aCA9IDE7Ci0gICAgd2hpbGUgKG1heFNlYyA+PSAxMCkgewotICAgICAgICArK3dpZHRoOwotICAgICAgICBtYXhTZWMgLz0gMTA7Ci0gICAgfQotICAgIGlmIChtYXhTZWMgPj0gMCkgewotICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJSpzXSIsIChpbnQpIHdpZHRoICsgNCwgIiIpOwotICAgIH0KLSAgICBib29sIGRlZmVycmVkVGltZXN0YW1wID0gZmFsc2U7Ci0jZW5kaWYKIAogICAgIGZvciAoYXV0byBlbnRyeSA9IHNuYXBzaG90LmJlZ2luKCk7IGVudHJ5ICE9IHNuYXBzaG90LmVuZCgpOykgewogICAgICAgICBzd2l0Y2ggKGVudHJ5LT50eXBlKSB7Ci0jaWYgMAotICAgICAgICBjYXNlIEVWRU5UX1NUUklORzoKLSAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCIlLipzIiwgKGludCkgZW50cnkubGVuZ3RoKCksIGVudHJ5LmRhdGEoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9USU1FU1RBTVA6IHsKLSAgICAgICAgICAgIC8vIGFscmVhZHkgY2hlY2tlZCB0aGF0IGxlbmd0aCA9PSBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKTsKLSAgICAgICAgICAgIGVudHJ5LmNvcHlEYXRhKChjb25zdCB1aW50OF90KikgJnRzKTsKLSAgICAgICAgICAgIGxvbmcgcHJldk5zZWMgPSB0cy50dl9uc2VjOwotICAgICAgICAgICAgbG9uZyBkZWx0YU1pbiA9IExPTkdfTUFYOwotICAgICAgICAgICAgbG9uZyBkZWx0YU1heCA9IC0xOwotICAgICAgICAgICAgbG9uZyBkZWx0YVRvdGFsID0gMDsKLSAgICAgICAgICAgIGF1dG8gYXV4KGVudHJ5KTsKLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICArK2F1eDsKLSAgICAgICAgICAgICAgICBpZiAoZW5kIC0gYXV4ID49IDAgfHwgYXV4LnR5cGUoKSAhPSBFVkVOVF9USU1FU1RBTVApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0c05leHQ7Ci0gICAgICAgICAgICAgICAgYXV4LmNvcHlEYXRhKChjb25zdCB1aW50OF90KikgJnRzTmV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRzTmV4dC50dl9zZWMgIT0gdHMudHZfc2VjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb25nIGRlbHRhID0gdHNOZXh0LnR2X25zZWMgLSBwcmV2TnNlYzsKLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPCBkZWx0YU1pbikgewotICAgICAgICAgICAgICAgICAgICBkZWx0YU1pbiA9IGRlbHRhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPiBkZWx0YU1heCkgewotICAgICAgICAgICAgICAgICAgICBkZWx0YU1heCA9IGRlbHRhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWx0YVRvdGFsICs9IGRlbHRhOwotICAgICAgICAgICAgICAgIHByZXZOc2VjID0gdHNOZXh0LnR2X25zZWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaXplX3QgbiA9IChhdXggLSBlbnRyeSkgLyAoc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYykgKyAzIC8qRW50cnk6OmtPdmVyaGVhZD8qLyk7Ci0gICAgICAgICAgICBpZiAoZGVmZXJyZWRUaW1lc3RhbXApIHsKLSAgICAgICAgICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwotICAgICAgICAgICAgICAgIGRlZmVycmVkVGltZXN0YW1wID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aW1lc3RhbXAuY2xlYXIoKTsKLSAgICAgICAgICAgIGlmIChuID49IGtTcXVhc2hUaW1lc3RhbXApIHsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJWQuJTAzZCB0byAuJS4wM2QgYnkgLiUuMDNkIHRvIC4lLjAzZF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgdHMudHZfc2VjLCAoaW50KSAodHMudHZfbnNlYyAvIDEwMDAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cy50dl9uc2VjICsgZGVsdGFUb3RhbCkgLyAxMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChkZWx0YU1pbiAvIDEwMDAwMDApLCAoaW50KSAoZGVsdGFNYXggLyAxMDAwMDAwKSk7Ci0gICAgICAgICAgICAgICAgZW50cnkgPSBhdXg7Ci0gICAgICAgICAgICAgICAgLy8gYWR2YW5jZSA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSB0cy50dl9zZWMsCi0gICAgICAgICAgICAgICAgICAgIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCkpOwotICAgICAgICAgICAgZGVmZXJyZWRUaW1lc3RhbXAgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfSU5URUdFUjoKLSAgICAgICAgICAgIGFwcGVuZEludCgmYm9keSwgZW50cnkuZGF0YSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX0ZMT0FUOgotICAgICAgICAgICAgYXBwZW5kRmxvYXQoJmJvZHksIGVudHJ5LmRhdGEoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9QSUQ6Ci0gICAgICAgICAgICBhcHBlbmRQSUQoJmJvZHksIGVudHJ5LmRhdGEoKSwgZW50cnkubGVuZ3RoKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKICAgICAgICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6CiAgICAgICAgICAgICBlbnRyeSA9IGhhbmRsZUZvcm1hdChGb3JtYXRFbnRyeShlbnRyeSksICZ0aW1lc3RhbXAsICZib2R5KTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA2Myw0MCArOTAyLDEyIEBACiAgICAgICAgICAgICBtZW1jcHkoJmhhc2gsICYoZGF0YS0+aGFzaCksIHNpemVvZihoYXNoKSk7CiAgICAgICAgICAgICBpbnQ2NF90IHRzOwogICAgICAgICAgICAgbWVtY3B5KCZ0cywgJmRhdGEtPnRzLCBzaXplb2YodHMpKTsKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6cGFpcjxsb2dfaGFzaF90LCBpbnQ+IGtleShoYXNoLCBkYXRhLT5hdXRob3IpOwotICAgICAgICAgICAgLy8gVE9ETyBtaWdodCB3YW50IHRvIGZpbHRlciBleGNlc3NpdmVseSBoaWdoIG91dGxpZXJzLCB3aGljaCBhcmUgdXN1YWxseSBjYXVzZWQKLSAgICAgICAgICAgIC8vIGJ5IHRoZSB0aHJlYWQgYmVpbmcgaW5hY3RpdmUuCi0gICAgICAgICAgICBtSGlzdHNba2V5XS5wdXNoX2JhY2sodHMpOworICAgICAgICAgICAgcGVyZm9ybWFuY2VBbmFseXNpcy5sb2dUc0VudHJ5KHRzKTsKICAgICAgICAgICAgICsrZW50cnk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICAvLyBkcmF3cyBoaXN0b2dyYW1zIHN0b3JlZCBpbiBnbG9iYWwgUmVhZGVyOjptSGlzdHMgYW5kIGVyYXNlcyB0aGVtCi0gICAgICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0ZMVVNIOiB7Ci0gICAgICAgICAgICBIaXN0b2dyYW1FbnRyeSBoaXN0RW50cnkoZW50cnkpOwotICAgICAgICAgICAgLy8gTG9nIHRpbWVzdGFtcAotICAgICAgICAgICAgLy8gVGltZXN0YW1wIG9mIGNhbGwgdG8gZHJhd0hpc3RvZ3JhbSwgbm90IHdoZW4gYXVkaW8gd2FzIGdlbmVyYXRlZAotICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGhpc3RFbnRyeS50aW1lc3RhbXAoKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcC5jbGVhcigpOwotICAgICAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKLSAgICAgICAgICAgIC8vIExvZyBoaXN0b2dyYW1zCi0gICAgICAgICAgICBzZXRGaW5kR2xpdGNoKHRydWUpOwotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkhpc3RvZ3JhbSBmbHVzaCAtICIpOwotICAgICAgICAgICAgaGFuZGxlQXV0aG9yKGhpc3RFbnRyeSwgJmJvZHkpOwotICAgICAgICAgICAgZm9yIChhdXRvIGhpc3QgPSBtSGlzdHMuYmVnaW4oKTsgaGlzdCAhPSBtSGlzdHMuZW5kKCk7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhpc3QtPmZpcnN0LnNlY29uZCA9PSBoaXN0RW50cnkuYXV0aG9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIiVYIiwgKGludCloaXN0LT5maXJzdC5maXJzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaW5kR2xpdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGVydElmR2xpdGNoKGhpc3QtPnNlY29uZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGZpbGUgdG8gZW1wdHkgYW5kIHdyaXRlIGRhdGEgZm9yIGFsbCBoaXN0b2dyYW1zIGluIHRoaXMgc2V0Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlSGlzdFRvRmlsZShoaXN0LT5zZWNvbmQsIGhpc3QgIT0gbUhpc3RzLmJlZ2luKCkpOwotICAgICAgICAgICAgICAgICAgICBkcmF3SGlzdG9ncmFtKCZib2R5LCBoaXN0LT5zZWNvbmQsIHRydWUsIGluZGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGhpc3QgPSBtSGlzdHMuZXJhc2UoaGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKytoaXN0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURTogeworICAgICAgICAgICAgcGVyZm9ybWFuY2VBbmFseXNpcy5oYW5kbGVTdGF0ZUNoYW5nZSgpOwogICAgICAgICAgICAgKytlbnRyeTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMTEwLDEwICs5MjEsMTAgQEAKICAgICAgICAgICAgICsrZW50cnk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCi0gICAgICAgIGlmICghYm9keS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7Ci0gICAgICAgIH0KKyAgICB9CisgICAgcGVyZm9ybWFuY2VBbmFseXNpcy5yZXBvcnRQZXJmb3JtYW5jZSgmYm9keSk7CisgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgeworICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwogICAgIH0KIH0KIApAQCAtMTEzOSwxNiArOTUwLDYgQEAKICAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7CiB9CiAKLXZvaWQgTkJMb2c6OlJlYWRlcjo6c2V0RmluZEdsaXRjaChib29sIHMpCi17Ci0gICAgZmluZEdsaXRjaCA9IHM7Ci19Ci0KLWJvb2wgTkJMb2c6OlJlYWRlcjo6aXNGaW5kR2xpdGNoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmluZEdsaXRjaDsKLX0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHZvaWQgTkJMb2c6OmFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7CkBAIC0xMjgzLDEyNiArMTA4NCw2IEBACiAgICAgcmV0dXJuIGFyZzsKIH0KIAotc3RhdGljIGludCB3aWR0aE9mKGludCB4KSB7Ci0gICAgaW50IHdpZHRoID0gMDsKLSAgICB3aGlsZSAoeCA+IDApIHsKLSAgICAgICAgKyt3aWR0aDsKLSAgICAgICAgeCAvPSAxMDsKLSAgICB9Ci0gICAgcmV0dXJuIHdpZHRoOwotfQotCi1zdGF0aWMgc3RkOjptYXA8aW50LCBpbnQ+IGJ1aWxkQnVja2V0cyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmc2FtcGxlcykgewotICAgIC8vIFRPRE8gYWxsb3cgYnVja2V0cyBvZiB2YXJpYWJsZSByZXNvbHV0aW9uCi0gICAgc3RkOjptYXA8aW50LCBpbnQ+IGJ1Y2tldHM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICsrYnVja2V0c1tkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKV07Ci0gICAgfQotICAgIHJldHVybiBidWNrZXRzOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IGxvZzIodWludDMyX3QgeCkgewotICAgIC8vIFRoaXMgd29ya3MgZm9yIHggPiAwCi0gICAgcmV0dXJuIDMxIC0gX19idWlsdGluX2Nseih4KTsKLX0KLQotLy8gVE9ETyBwdXQgdGhpcyBmdW5jdGlvbiBpbiBzZXBhcmF0ZSBmaWxlLiBNYWtlIGl0IHJldHVybiBhIHN0ZDo6c3RyaW5nIGluc3RlYWQgb2YgbW9kaWZ5aW5nIGJvZHkKLS8qCi1FeGFtcGxlIG91dHB1dDoKLVs1NC4yMzRdIEhpc3RvZ3JhbSBmbHVzaCAtIEF1ZGlvT3V0X0Q6Ci1IaXN0b2dyYW0gMzM2NDBCRjEKLSAgICAgICAgICAgIFsgMV1bIDFdWyAxXVsgM11bNTRdWzY5XVsgMV1bIDJdWyAxXQotICAgICAgICA2NHwgICAgICAgICAgICAgICAgICAgICAgW10KLSAgICAgICAgMzJ8ICAgICAgICAgICAgICAgICAgW10gIFtdCi0gICAgICAgIDE2fCAgICAgICAgICAgICAgICAgIFtdICBbXQotICAgICAgICAgOHwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgIDR8ICAgICAgICAgICAgICAgICAgW10gIFtdCi0gICAgICAgICAyfF9fX19fX19fX19fX19fW11fX1tdX19bXV9fX19fX1tdX19fXwotICAgICAgICAgICAgICA0ICAgNSAgIDYgICA4ICAgOSAgMTAgIDExICAxMyAgMTUKLU5vdGljZSB0aGF0IGFsbCB2YWx1ZXMgdGhhdCBmYWxsIGluIHRoZSBzYW1lIHJvdyBoYXZlIHRoZSBzYW1lIGhlaWdodCAoNjUgYW5kIDEyNyBhcmUgZGlzcGxheWVkCi1pZGVudGljYWxseSkuIFRoYXQncyB3aHkgZXhhY3QgY291bnRzIGFyZSBhZGRlZCBhdCB0aGUgdG9wLgotKi8KLXZvaWQgTkJMb2c6OlJlYWRlcjo6ZHJhd0hpc3RvZ3JhbShTdHJpbmc4ICpib2R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9nU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4SGVpZ2h0KSB7Ci0gICAgLy8gdGhpcyBhdm9pZHMgc29tZSBjb3JuZXIgY2FzZXMKLSAgICBpZiAoc2FtcGxlcy5zaXplKCkgPD0gMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIHRlbXAgY29kZSBmb3IgZGVidWdnaW5nIHRoZSBvdXRsaWVyIHRpbWVzdGFtcAotICAgIGNvbnN0IGludCBrTWF4TXMgPSAxMDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKS0xOyArK2kpIHsKLSAgICAgICAgY29uc3QgaW50IGN1cnJEZWx0YSA9IGRlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pOwotICAgICAgICBpZiAoY3VyckRlbHRhID4ga01heE1zKSB7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxubG9jYXRpb246ICV6dSwgc2l6ZTogJXp1LCBwb3MgZnJvbSBlbmQ6ICV6dSwgJWRcdCIsIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLnNpemUoKSwgc2FtcGxlcy5zaXplKCkgLSBpLCBjdXJyRGVsdGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIEZJWE1FOiBhcyBjYW4gYmUgc2VlbiB3aGVuIHByaW50aW5nIHRoZSB2YWx1ZXMsIHRoZSBvdXRsaWVyIHRpbWVzdGFtcHMgdHlwaWNhbGx5IG9jY3VyCi0gICAgLy8gaW4gdGhlIGZpcnN0IGhpc3RvZ3JhbSAzNSB0byAzOCBpbmRpY2VzIGZyb20gdGhlIGVuZCAobW9zdCBvZnRlbiAzNSkuCi0gICAgLy8gVE9ETzogYnVpbGQgaGlzdG9ncmFtIGJ1Y2tldHMgZWFybGllciBhbmQgZGlzY2FyZCB0aW1lc3RhbXBzIHRvIHNhdmUgbWVtb3J5Ci0gICAgc3RkOjptYXA8aW50LCBpbnQ+IGJ1Y2tldHMgPSBidWlsZEJ1Y2tldHMoc2FtcGxlcyk7Ci0gICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyBhbGwgaW50cyB0byB1aW50MzJfdCBvciB1aW50NjRfdAotCi0gICAgLy8gdW5kZXJzY29yZXMgYW5kIHNwYWNlcyBsZW5ndGggY29ycmVzcG9uZHMgdG8gbWF4aW11bSB3aWR0aCBvZiBoaXN0b2dyYW0KLSAgICBzdGF0aWMgY29uc3QgaW50IGtMZW4gPSA0MDsKLSAgICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlcyhrTGVuLCAnLScpOwotICAgIHN0ZDo6c3RyaW5nIHNwYWNlcyhrTGVuLCAnICcpOwotCi0gICAgYXV0byBpdCA9IGJ1Y2tldHMuYmVnaW4oKTsKLSAgICBpbnQgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgaW50IG1heENvdW50ID0gaXQtPnNlY29uZDsKLSAgICAvLyBDb21wdXRlIG1heGltdW0gdmFsdWVzCi0gICAgd2hpbGUgKCsraXQgIT0gYnVja2V0cy5lbmQoKSkgewotICAgICAgICBpZiAoaXQtPmZpcnN0ID4gbWF4RGVsdGEpIHsKLSAgICAgICAgICAgIG1heERlbHRhID0gaXQtPmZpcnN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdC0+c2Vjb25kID4gbWF4Q291bnQpIHsKLSAgICAgICAgICAgIG1heENvdW50ID0gaXQtPnNlY29uZDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgaGVpZ2h0ID0gbG9nU2NhbGUgPyBsb2cyKG1heENvdW50KSArIDEgOiBtYXhDb3VudDsgLy8gbWF4Q291bnQgPiAwLCBzYWZlIHRvIGNhbGwgbG9nMgotICAgIGNvbnN0IGludCBsZWZ0UGFkZGluZyA9IHdpZHRoT2YobG9nU2NhbGUgPyBwb3coMiwgaGVpZ2h0KSA6IG1heENvdW50KTsKLSAgICBjb25zdCBpbnQgY29sV2lkdGggPSBzdGQ6Om1heChzdGQ6Om1heCh3aWR0aE9mKG1heERlbHRhKSArIDEsIDMpLCBsZWZ0UGFkZGluZyArIDIpOwotICAgIGludCBzY2FsaW5nRmFjdG9yID0gMTsKLSAgICAvLyBzY2FsZSBkYXRhIGlmIGl0IGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQKLSAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7Ci0gICAgICAgIHNjYWxpbmdGYWN0b3IgPSAoaGVpZ2h0ICsgbWF4SGVpZ2h0KSAvIG1heEhlaWdodDsKLSAgICAgICAgaGVpZ2h0IC89IHNjYWxpbmdGYWN0b3I7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBsZWZ0UGFkZGluZyArIDExLCAiT2NjdXJyZW5jZXMiKTsKLSAgICAvLyB3cml0ZSBoaXN0b2dyYW0gbGFiZWwgbGluZSB3aXRoIGJ1Y2tldCB2YWx1ZXMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzIiwgaW5kZW50LCAiICIpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7Ci0gICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LnNlY29uZCk7Ci0gICAgfQotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBhc2NpaSBhcnQKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzIiwgaW5kZW50LCAiICIpOwotICAgIGZvciAoaW50IHJvdyA9IGhlaWdodCAqIHNjYWxpbmdGYWN0b3I7IHJvdyA+PSAwOyByb3cgLT0gc2NhbGluZ0ZhY3RvcikgewotICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSBsb2dTY2FsZSA/ICgxIDw8IHJvdykgOiByb3c7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIGxlZnRQYWRkaW5nLCBzcGFjZXMuY19zdHIoKSk7Ci0gICAgICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGNvbFdpZHRoIC0gMSwgc3BhY2VzLmNfc3RyKCksIHguc2Vjb25kIDwgdmFsdWUgPyAiICIgOiAifCIpOwotICAgICAgICB9Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgfQotICAgIC8vIHByaW50IHgtYXhpcwotICAgIGNvbnN0IGludCBjb2x1bW5zID0gc3RhdGljX2Nhc3Q8aW50PihidWNrZXRzLnNpemUoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmMiLCBsZWZ0UGFkZGluZywgJyAnKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoY29sdW1ucyArIDEpICogY29sV2lkdGgsIHVuZGVyc2NvcmVzLmNfc3RyKCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0KLSAgICAvLyB3cml0ZSBmb290ZXIgd2l0aCBidWNrZXQgbGFiZWxzCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguZmlyc3QpOwotICAgIH0KLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGNvbFdpZHRoLCBzcGFjZXMuY19zdHIoKSwgIm1zXG4iKTsKLX0KLQogTkJMb2c6Ok1lcmdlcjo6TWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOgogICAgICAgbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCiAgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vT1dORVJTIGIvbWVkaWEvbGlibmJhaW8vT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2I1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmFpby9PV05FUlMKQEAgLTAsMCArMSBAQAorZ2thc3RlbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCBiL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2JkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcApAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2RlZmluZSBMT0dfVEFHICJQZXJmb3JtYW5jZUFuYWx5c2lzIgorLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisvLyAjaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+IC8vIHVzZWQgdG8gcHJpbnQgY2FsbHN0YWNrCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgeworCitQZXJmb3JtYW5jZUFuYWx5c2lzOjpQZXJmb3JtYW5jZUFuYWx5c2lzKCkgeworICAgIC8vIFRoZXNlIHZhcmlhYmxlcyB3aWxsIGJlIChGSVhNRSkgbGVhcm5lZCBmcm9tIHRoZSBkYXRhCisgICAga1BlcmlvZE1zID0gNDsgLy8gdHlwaWNhbCBidWZmZXIgcGVyaW9kIChtb2RlKQorICAgIC8vIGF2ZXJhZ2UgbnVtYmVyIG9mIE1zIHNwZW50IHByb2Nlc3NpbmcgYnVmZmVyCisgICAga1BlcmlvZE1zQ1BVID0gc3RhdGljX2Nhc3Q8aW50PihrUGVyaW9kTXMgKiBrUmF0aW8pOworfQorCisvLyBjb252ZXJ0cyBhIHRpbWUgc2VyaWVzIGludG8gYSBtYXAuIGtleTogYnVmZmVyIHBlcmlvZCBsZW5ndGguIHZhbHVlOiBjb3VudAorc3RhdGljIHN0ZDo6bWFwPGludCwgaW50PiBidWlsZEJ1Y2tldHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKKyAgICAvLyBUT0RPIGFsbG93IGJ1Y2tldHMgb2YgdmFyaWFibGUgcmVzb2x1dGlvbgorICAgIHN0ZDo6bWFwPGludCwgaW50PiBidWNrZXRzOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgc2FtcGxlcy5zaXplKCk7ICsraSkgeworICAgICAgICArK2J1Y2tldHNbZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSldOworICAgIH0KKyAgICByZXR1cm4gYnVja2V0czsKK30KKworc3RhdGljIGludCB3aWR0aE9mKGludCB4KSB7CisgICAgaW50IHdpZHRoID0gMDsKKyAgICB3aGlsZSAoeCA+IDApIHsKKyAgICAgICAgKyt3aWR0aDsKKyAgICAgICAgeCAvPSAxMDsKKyAgICB9CisgICAgcmV0dXJuIHdpZHRoOworfQorCisvLyBHaXZlbiBhIHNlcmllcyBvZiBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXBzLAorLy8gYnVja2V0cyB0aGUgdGltZSBpbnRlcnZhbHMgaW50byBhIGhpc3RvZ3JhbSwgc2VhcmNoZXMgZm9yCisvLyBvdXRsaWVycywgYW5hbHl6ZXMgdGhlIG91dGxpZXIgc2VyaWVzIGZvciB1bmV4cGVjdGVkbHkKKy8vIHNtYWxsIG9yIGxhcmdlIHZhbHVlcyBhbmQgc3RvcmVzIHRoZXNlIGFzIHBlYWtzLCBhbmQgZmx1c2hlcworLy8gdGhlIHRpbWVzdGFtcCBzZXJpZXMgZnJvbSBtZW1vcnkuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpIHsKKyAgICAvLyAxKSBhbmFseXplIHRoZSBzZXJpZXMgdG8gc3RvcmUgYWxsIG91dGxpZXJzIGFuZCB0aGVpciBleGFjdCB0aW1lc3RhbXBzOgorICAgIHN0b3JlT3V0bGllckRhdGEobVRpbWVTdGFtcFNlcmllcyk7CisKKyAgICAvLyAyKSBkZXRlY3QgcGVha3MgaW4gdGhlIG91dGxpZXIgc2VyaWVzCisgICAgZGV0ZWN0UGVha3MoKTsKKworICAgIC8vIDMpIGNvbXB1dGUgaXRzIGhpc3RvZ3JhbSwgYXBwZW5kIHRvIG1SZWNlbnRIaXN0cyBhbmQgY2xlYXIgdGhlIHRpbWUgc2VyaWVzCisgICAgbVJlY2VudEhpc3RzLmVtcGxhY2VfYmFjayhzdGF0aWNfY2FzdDx0aW1lc3RhbXA+KG1UaW1lU3RhbXBTZXJpZXNbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRCdWNrZXRzKG1UaW1lU3RhbXBTZXJpZXMpKTsKKyAgICAvLyBkbyBub3QgbGV0IG1SZWNlbnRIaXN0cyBleGNlZWQgY2FwYWNpdHkKKyAgICAvLyBBTE9HRCgibVJlY2VudEhpc3RzIHNpemU6ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihtUmVjZW50SGlzdHMuc2l6ZSgpKSk7CisgICAgaWYgKG1SZWNlbnRIaXN0cy5zaXplKCkgPj0ga1JlY2VudEhpc3RzQ2FwYWNpdHkpIHsKKyAgICAgICAgLy8gIEFMT0dEKCJwb3BwZWQgYmFjayBtUmVjZW50SGlzdHMiKTsKKyAgICAgICAgbVJlY2VudEhpc3RzLnBvcF9mcm9udCgpOworICAgIH0KKyAgICBtVGltZVN0YW1wU2VyaWVzLmNsZWFyKCk7Cit9CisKKy8vIGZvcmNlcyBzaG9ydC10ZXJtIGhpc3RvZ3JhbSBzdG9yYWdlIHRvIGF2b2lkIGFkZGluZyBpZGxlIGF1ZGlvIHRpbWUgaW50ZXJ2YWwKKy8vIHRvIGJ1ZmZlciBwZXJpb2QgZGF0YQordm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpoYW5kbGVTdGF0ZUNoYW5nZSgpIHsKKyAgICBBTE9HRCgiaGFuZGxlU3RhdGVDaGFuZ2UiKTsKKyAgICBwcm9jZXNzQW5kRmx1c2hUaW1lU3RhbXBTZXJpZXMoKTsKKyAgICByZXR1cm47Cit9CisKKy8vIFRha2VzIGEgc2luZ2xlIGJ1ZmZlciBwZXJpb2QgdGltZXN0YW1wIGVudHJ5IGluZm9ybWF0aW9uIGFuZCBzdG9yZXMgaXQgaW4gYQorLy8gdGVtcG9yYXJ5IHNlcmllcyBvZiB0aW1lc3RhbXBzLiBPbmNlIHRoZSBzZXJpZXMgaXMgZnVsbCwgdGhlIGRhdGEgaXMgYW5hbHl6ZWQsCisvLyBzdG9yZWQsIGFuZCBlbXB0aWVkLgordm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpsb2dUc0VudHJ5KGludDY0X3QgdHMpIHsKKyAgICAvLyBUT0RPIG1pZ2h0IHdhbnQgdG8gZmlsdGVyIGV4Y2Vzc2l2ZWx5IGhpZ2ggb3V0bGllcnMsIHdoaWNoIGFyZSB1c3VhbGx5IGNhdXNlZAorICAgIC8vIGJ5IHRoZSB0aHJlYWQgYmVpbmcgaW5hY3RpdmUuCisgICAgLy8gU3RvcmUgdGltZSBzZXJpZXMgZGF0YSBmb3IgZWFjaCByZWFkZXIgaW4gb3JkZXIgdG8gYnVja2V0IGl0IG9uY2UgdGhlcmUKKyAgICAvLyBpcyBlbm91Z2ggZGF0YS4gVGhlbiwgd3JpdGUgdG8gcmVjZW50SGlzdHMgYXMgYSBoaXN0b2dyYW0uCisgICAgbVRpbWVTdGFtcFNlcmllcy5wdXNoX2JhY2sodHMpOworICAgIC8vIGlmIGxlbmd0aCBvZiB0aGUgdGltZSBzZXJpZXMgaGFzIHJlYWNoZWQga1Nob3J0SGlzdFNpemUgc2FtcGxlcywKKyAgICAvLyBhbmFseXplIHRoZSBkYXRhIGFuZCBmbHVzaCB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeQorICAgIGlmIChtVGltZVN0YW1wU2VyaWVzLnNpemUoKSA+PSBrU2hvcnRIaXN0U2l6ZSkgeworICAgICAgICBwcm9jZXNzQW5kRmx1c2hUaW1lU3RhbXBTZXJpZXMoKTsKKyAgICB9Cit9CisKKy8vIFdoZW4gdGhlIHNob3J0LXRlcm0gaGlzdG9ncmFtIGFycmF5IG1SZWNlbnRIaXN0cyBoYXMgcmVhY2hlZCBjYXBhY2l0eSwKKy8vIG1lcmdlIGhpc3RvZ3JhbXMgZm9yIGRhdGEgY29tcHJlc3Npb24gYW5kIHN0b3JlIHRoZW0gaW4gbUxvbmdUZXJtSGlzdHMKKy8vIGNsZWFycyBtUmVjZW50SGlzdHMKKy8vIFRPRE86IGhhdmUgbG9nVHNFbnRyeSB3cml0ZSBkaXJlY3RseSB0byBtTG9uZ1Rlcm1IaXN0cywgZGlzY2FyZCBtUmVjZW50SGlzdHMsCisvLyBzdGFydCBhIG5ldyBoaXN0b2dyYW0gd2hlbiBhIHBlYWsgb2NjdXJzCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnByb2Nlc3NBbmRGbHVzaFJlY2VudEhpc3RzKCkgeworCisgICAgLy8gQnVja2V0cyBpcyB1c2VkIHRvIGFnZ3JlZ2F0ZSBzaG9ydC10ZXJtIGhpc3RvZ3JhbXMuCisgICAgSGlzdG9ncmFtIGJ1Y2tldHM7CisgICAgdGltZXN0YW1wIHN0YXJ0aW5nVHMgPSBtUmVjZW50SGlzdHNbMF0uZmlyc3Q7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNob3J0SGlzdDogbVJlY2VudEhpc3RzKSB7CisgICAgICAgIC8vIElmIHRoZSB0aW1lIGJldHdlZW4gc3RhcnRpbmcgYW5kIGVuZGluZyB0aW1lc3RhbXBzIGhhcyByZWFjaGVkIHRoZSBtYXhpbXVtLAorICAgICAgICAvLyBhZGQgdGhlIGN1cnJlbnQgaGlzdG9ncmFtIChidWNrZXRzKSB0byB0aGUgbG9uZy10ZXJtIGhpc3RvZ3JhbSBidWZmZXIsCisgICAgICAgIC8vIGNsZWFyIGJ1Y2tldHMsIGFuZCBzdGFydCBhIG5ldyBsb25nLXRlcm0gaGlzdG9ncmFtIGFnZ3JlZ2F0aW9uIHByb2Nlc3MuCisgICAgICAgIGlmIChkZWx0YU1zKHN0YXJ0aW5nVHMsIHNob3J0SGlzdC5maXJzdCkgPj0ga01heEhpc3RUaW1lc3Bhbk1zKSB7CisgICAgICAgICAgICBtTG9uZ1Rlcm1IaXN0cy5lbXBsYWNlX2JhY2soc3RhcnRpbmdUcywgc3RkOjptb3ZlKGJ1Y2tldHMpKTsKKyAgICAgICAgICAgIGJ1Y2tldHMuY2xlYXIoKTsKKyAgICAgICAgICAgIHN0YXJ0aW5nVHMgPSBzaG9ydEhpc3QuZmlyc3Q7CisgICAgICAgICAgICAvLyBXaGVuIG1lbW9yeSBpcyBmdWxsLCBkZWxldGUgb2xkZXN0IGhpc3RvZ3JhbQorICAgICAgICAgICAgLy8gVE9ETyB1c2UgYSBjaXJjdWxhciBidWZmZXIKKyAgICAgICAgICAgIGlmIChtTG9uZ1Rlcm1IaXN0cy5zaXplKCkgPj0ga0xvbmdUZXJtSGlzdHNDYXBhY2l0eSkgeworICAgICAgICAgICAgICAgIG1Mb25nVGVybUhpc3RzLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIGN1cnJlbnQgaGlzdG9ncmFtIHRvIGJ1Y2tldHMKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjb3VudFBhaXIgOiBzaG9ydEhpc3Quc2Vjb25kKSB7CisgICAgICAgICAgICBidWNrZXRzW2NvdW50UGFpci5maXJzdF0gKz0gY291bnRQYWlyLnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUmVjZW50SGlzdHMuY2xlYXIoKTsKKyAgICAvLyBUT0RPOiBkZWNpZGUgd2hlbi93aGVyZSB0byBjYWxsIHdyaXRlVG9GaWxlCisgICAgLy8gVE9ETzogYWRkIGEgdGhyZWFkLXNwZWNpZmljIGV4dGVuc2lvbiB0byB0aGUgZmlsZSBuYW1lCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtOYW1lID0gKGNvbnN0IGNoYXIgKikgIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIvc2FtcGxlX3Jlc3VsdHMudHh0IjsKKyAgICB3cml0ZVRvRmlsZShtT3V0bGllckRhdGEsIG1Mb25nVGVybUhpc3RzLCBrTmFtZSwgZmFsc2UpOworfQorCisvLyBHaXZlbiBhIHNlcmllcyBvZiBvdXRsaWVyIGludGVydmFscyAobU91dGxpZXIgZGF0YSksCisvLyBsb29rcyBmb3IgY2hhbmdlcyBpbiBkaXN0cmlidXRpb24gKHBlYWtzKSwgd2hpY2ggY2FuIGJlIGVpdGhlciBwb3NpdGl2ZSBvciBuZWdhdGl2ZS4KKy8vIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBtZWFuIHRvIHRoZSBzdGFydGluZyB2YWx1ZSBhbmQgc2lnbWEgdG8gMCwgYW5kIHVwZGF0ZXMKKy8vIHRoZW0gYXMgbG9uZyBhcyBubyBwZWFrIGlzIGRldGVjdGVkLiBXaGVuIGEgdmFsdWUgaXMgbW9yZSB0aGFuICd0aHJlc2hvbGQnCisvLyBzdGFuZGFyZCBkZXZpYXRpb25zIGZyb20gdGhlIG1lYW4sIGEgcGVhayBpcyBkZXRlY3RlZCBhbmQgdGhlIG1lYW4gYW5kIHNpZ21hCisvLyBhcmUgc2V0IHRvIHRoZSBwZWFrIHZhbHVlIGFuZCAwLgordm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpkZXRlY3RQZWFrcygpIHsKKyAgICBpZiAobU91dGxpZXJEYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNvbXB1dGUgbWVhbiBvZiB0aGUgZGlzdHJpYnV0aW9uLiBVc2VkIHRvIGNoZWNrIHdoZXRoZXIgYSB2YWx1ZSBpcyBsYXJnZQorICAgIGNvbnN0IGRvdWJsZSBrVHlwaWNhbERpZmYgPSBzdGQ6OmFjY3VtdWxhdGUoCisgICAgICAgIG1PdXRsaWVyRGF0YS5iZWdpbigpLCBtT3V0bGllckRhdGEuZW5kKCksIDAsCisgICAgICAgIFtdKGF1dG8gJmEsIGF1dG8gJmIpe3JldHVybiBhICsgYi5maXJzdDt9KSAvIG1PdXRsaWVyRGF0YS5zaXplKCk7CisgICAgLy8gQUxPR0QoInR5cGljYWxEaWZmICVmIiwga1R5cGljYWxEaWZmKTsKKworICAgIC8vIGl0ZXJhdG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzZXF1ZW5jZSwgb3IgdXBkYXRlZCB0byB0aGUgbW9zdCByZWNlbnQgcGVhaworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHVpbnQ2NF90LCB1aW50NjRfdD4+OjppdGVyYXRvciBzdGFydCA9IG1PdXRsaWVyRGF0YS5iZWdpbigpOworICAgIC8vIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gYXJlIHVwZGF0ZWQgZXZlcnkgdGltZSBhIHBlYWsgaXMgZGV0ZWN0ZWQKKyAgICAvLyBpbml0aWFsaXplIGZpcnN0IHRpbWUuIFRoZSBtZWFuIGZyb20gdGhlIHByZXZpb3VzIHNlcXVlbmNlIGlzIHN0b3JlZAorICAgIC8vIGZvciB0aGUgbmV4dCBzZXF1ZW5jZS4gSGVyZSwgdGhleSBhcmUgaW5pdGlhbGl6ZWQgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgIGlmIChtUGVha0RldGVjdG9yTWVhbiA8IDApIHsKKyAgICAgICAgbVBlYWtEZXRlY3Rvck1lYW4gPSBzdGF0aWNfY2FzdDxkb3VibGU+KHN0YXJ0LT5maXJzdCk7CisgICAgICAgIG1QZWFrRGV0ZWN0b3JTZCA9IDA7CisgICAgfQorICAgIGF1dG8gc3FyID0gW10oYXV0byB4KXsgcmV0dXJuIHggKiB4OyB9OworICAgIGZvciAoYXV0byBpdCA9IG1PdXRsaWVyRGF0YS5iZWdpbigpOyBpdCAhPSBtT3V0bGllckRhdGEuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgLy8gbm8gc3VycHJpc2Ugb2NjdXJyZWQ6CisgICAgICAgIC8vIHRoZSBuZXcgZWxlbWVudCBpcyBhIHNtYWxsIG51bWJlciBvZiBzdGFuZGFyZCBkZXZpYXRpb25zIGZyb20gdGhlIG1lYW4KKyAgICAgICAgaWYgKChmYWJzKGl0LT5maXJzdCAtIG1QZWFrRGV0ZWN0b3JNZWFuKSA8IGtTdGRkZXZUaHJlc2hvbGQgKiBtUGVha0RldGVjdG9yU2QpIHx8CisgICAgICAgICAgICAgLy8gb3I6IHJpZ2h0IGFmdGVyIHBlYWsgaGFzIGJlZW4gZGV0ZWN0ZWQsIHRoZSBkZWx0YSBpcyBzbWFsbGVyIHRoYW4gYXZlcmFnZQorICAgICAgICAgICAgKG1QZWFrRGV0ZWN0b3JTZCA9PSAwICYmIGZhYnMoaXQtPmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pIDwga1R5cGljYWxEaWZmKSkgeworICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBtZWFuIGFuZCBzZDoKKyAgICAgICAgICAgIC8vIGNvdW50IG51bWJlciBvZiBlbGVtZW50cyAoZGlzdGFuY2UgYmV0d2VlbiBzdGFydCBpbnRlcmF0b3IgYW5kIGN1cnJlbnQpCisgICAgICAgICAgICBjb25zdCBpbnQga04gPSBzdGQ6OmRpc3RhbmNlKHN0YXJ0LCBpdCkgKyAxOworICAgICAgICAgICAgLy8gdXN1YWwgZm9ybXVsYXMgZm9yIG1lYW4gYW5kIHNkCisgICAgICAgICAgICBtUGVha0RldGVjdG9yTWVhbiA9IHN0ZDo6YWNjdW11bGF0ZShzdGFydCwgaXQgKyAxLCAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGF1dG8gJmEsIGF1dG8gJmIpe3JldHVybiBhICsgYi5maXJzdDt9KSAvIGtOOworICAgICAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gc3FydChzdGQ6OmFjY3VtdWxhdGUoc3RhcnQsIGl0ICsgMSwgMC4wLAorICAgICAgICAgICAgICAgICAgICAgIFs9XShhdXRvICZhLCBhdXRvICZiKXsgcmV0dXJuIGEgKyBzcXIoYi5maXJzdCAtIG1QZWFrRGV0ZWN0b3JNZWFuKTt9KSkgLworICAgICAgICAgICAgICAgICAgICAgICgoa04gPiAxKT8ga04gLSAxIDoga04pOyAvLyBrTiAtIDE6IG1lYW4gaXMgY29ycmVsYXRlZCB3aXRoIHZhcmlhbmNlCisgICAgICAgIH0KKyAgICAgICAgLy8gc3VycHJpc2luZyB2YWx1ZTogc3RvcmUgcGVhayB0aW1lc3RhbXAgYW5kIHJlc2V0IG1lYW4sIHNkLCBhbmQgc3RhcnQgaXRlcmF0b3IKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtUGVha1RpbWVzdGFtcHMuZW1wbGFjZV9iYWNrKGl0LT5zZWNvbmQpOworICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHBvcF9mcm9udCBvbmNlIGEgY2lyY3VsYXIgYnVmZmVyIGlzIGluIHBsYWNlCisgICAgICAgICAgICBpZiAobVBlYWtUaW1lc3RhbXBzLnNpemUoKSA+PSBrUGVha1Nlcmllc1NpemUpIHsKKyAgICAgICAgICAgICAgICBtUGVha1RpbWVzdGFtcHMucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVha0RldGVjdG9yTWVhbiA9IHN0YXRpY19jYXN0PGRvdWJsZT4oaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JTZCA9IDA7CisgICAgICAgICAgICBzdGFydCA9IGl0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworLy8gQ2FsbGVkIGJ5IExvZ1RzRW50cnkuIFRoZSBpbnB1dCBpcyBhIHZlY3RvciBvZiB0aW1lc3RhbXBzLgorLy8gRmluZHMgb3V0bGllcnMgYW5kIHdyaXRlcyB0byBtT3V0bGllcmRhdGEuCisvLyBFYWNoIHZhbHVlIGluIG1PdXRsaWVyZGF0YSBjb25zaXN0cyBvZjogPG91dGxpZXIgdGltZXN0YW1wLCB0aW1lIGVsYXBzZWQgc2luY2UgcHJldmlvdXMgb3V0bGllcj4uCisvLyBlLmcuIHRpbWVzdGFtcHMgKG1zKSAxLCA0LCA1LCAxNiwgMTgsIDI4IHdpbGwgcHJvZHVjZSBwYWlycyAoNCwgNSksICgxMywgMTgpLgorLy8gVGhpcyBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSB0aW1lIHNlcmllcyBiZWZvcmUgaXQgaXMgY29udmVydGVkIGludG8gYSBoaXN0b2dyYW0uCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnN0b3JlT3V0bGllckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnRpbWVzdGFtcHMpIHsKKyAgICBpZiAodGltZXN0YW1wcy5zaXplKCkgPCAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZmlyc3QgcGFzczogbmVlZCB0byBpbml0aWFsaXplCisgICAgaWYgKG1FbGFwc2VkID09IDApIHsKKyAgICAgICAgbVByZXZOcyA9IHRpbWVzdGFtcHNbMF07CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmdHM6IHRpbWVzdGFtcHMpIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgZGlmZk1zID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGRlbHRhTXMobVByZXZOcywgdHMpKTsKKyAgICAgICAgaWYgKGRpZmZNcyA+PSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oa091dGxpZXJNcykpIHsKKyAgICAgICAgICAgIG1PdXRsaWVyRGF0YS5lbXBsYWNlX2JhY2sobUVsYXBzZWQsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihtUHJldk5zKSk7CisgICAgICAgICAgICAvLyBSZW1vdmUgb2xkZXN0IHZhbHVlIGlmIHRoZSB2ZWN0b3IgaXMgZnVsbAorICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHBvcF9mcm9udCBvbmNlIGNpcmN1bGFyIGJ1ZmZlciBpcyBpbiBwbGFjZQorICAgICAgICAgICAgLy8gRklYTUU6IG1ha2Ugc3VyZSBrU2hvcnRIaXN0U2l6ZSBpcyBsYXJnZSBlbm91Z2ggdGhhdCB0aGF0IGRhdGEgd2lsbCBuZXZlciBiZSBsb3N0CisgICAgICAgICAgICAvLyBiZWZvcmUgYmVpbmcgd3JpdHRlbiB0byBmaWxlIG9yIHRvIGEgRklGTworICAgICAgICAgICAgaWYgKG1PdXRsaWVyRGF0YS5zaXplKCkgPj0ga091dGxpZXJTZXJpZXNTaXplKSB7CisgICAgICAgICAgICAgICAgbU91dGxpZXJEYXRhLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUVsYXBzZWQgPSAwOworICAgICAgICB9CisgICAgICAgIG1FbGFwc2VkICs9IGRpZmZNczsKKyAgICAgICAgbVByZXZOcyA9IHRzOworICAgIH0KK30KKworCisvLyBGSVhNRTogZGVsZXRlIHRoaXMgdGVtcG9yYXJ5IHRlc3QgY29kZSwgcmVjeWNsZWQgZm9yIHZhcmlvdXMgbmV3IGZ1bmN0aW9ucwordm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjp0ZXN0RnVuY3Rpb24oKSB7CisgICAgLy8gcHJvZHVjZXMgdmFsdWVzICg0OiA1MDAwMDAwKSwgKDEzOiAxODAwMDAwMCkKKyAgICAvLyBucyB0aW1lc3RhbXBzIG9mIGJ1ZmZlciBwZXJpb2RzCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD5rVGVtcFRlc3REYXRhID0gezEwMDAwMDAsIDQwMDAwMDAsIDUwMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwMDAwLCAxODAwMDAwMCwgMjgwMDAwMDB9OworICAgIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnN0b3JlT3V0bGllckRhdGEoa1RlbXBUZXN0RGF0YSk7CisgICAgZm9yIChjb25zdCBhdXRvICZvdXRsaWVyOiBtT3V0bGllckRhdGEpIHsKKyAgICAgICAgQUxPR0UoIlBlcmZvcm1hbmNlQW5hbHlzaXMgdGVzdCAlbGxkOiAlbGxkIiwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLmZpcnN0KSwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLnNlY29uZCkpOworICAgIH0KKyAgICBkZXRlY3RQZWFrcygpOworfQorCisvLyBUT0RPIE1ha2UgaXQgcmV0dXJuIGEgc3RkOjpzdHJpbmcgaW5zdGVhZCBvZiBtb2RpZnlpbmcgYm9keSAtLT4gaXMgdGhpcyBzdGlsbCByZWxldmFudD8KKy8vIFRPRE8gY29uc2lkZXIgY2hhbmdpbmcgYWxsIGludHMgdG8gdWludDMyX3Qgb3IgdWludDY0X3QKKy8vIFRPRE86IG1vdmUgdGhpcyB0byBSZXBvcnRQZXJmb3JtYW5jZSwgcHJvYmFibHkgbWFrZSBpdCBhIGZyaWVuZCBmdW5jdGlvbiBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnJlcG9ydFBlcmZvcm1hbmNlKFN0cmluZzggKmJvZHksIGludCBtYXhIZWlnaHQpIHsKKyAgICBpZiAobVJlY2VudEhpc3RzLnNpemUoKSA8IDEpIHsKKyAgICAgICAgQUxPR0QoInJlcG9ydFBlcmZvcm1hbmNlOiBtUmVjZW50SGlzdHMgaXMgZW1wdHkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HRCgicmVwb3J0UGVyZm9ybWFuY2U6IGhpc3RzIHNpemUgJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KG1SZWNlbnRIaXN0cy5zaXplKCkpKTsKKyAgICAvLyBUT0RPOiBtb3JlIGVsYWJvcmF0ZSBkYXRhIGFuYWx5c2lzCisgICAgc3RkOjptYXA8aW50LCBpbnQ+IGJ1Y2tldHM7CisgICAgZm9yIChjb25zdCBhdXRvICZzaG9ydEhpc3Q6IG1SZWNlbnRIaXN0cykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNvdW50UGFpciA6IHNob3J0SGlzdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJ1Y2tldHNbY291bnRQYWlyLmZpcnN0XSArPSBjb3VudFBhaXIuc2Vjb25kOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdW5kZXJzY29yZXMgYW5kIHNwYWNlcyBsZW5ndGggY29ycmVzcG9uZHMgdG8gbWF4aW11bSB3aWR0aCBvZiBoaXN0b2dyYW0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtMZW4gPSA0MDsKKyAgICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlcyhrTGVuLCAnXycpOworICAgIHN0ZDo6c3RyaW5nIHNwYWNlcyhrTGVuLCAnICcpOworCisgICAgYXV0byBpdCA9IGJ1Y2tldHMuYmVnaW4oKTsKKyAgICBpbnQgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7CisgICAgaW50IG1heENvdW50ID0gaXQtPnNlY29uZDsKKyAgICAvLyBDb21wdXRlIG1heGltdW0gdmFsdWVzCisgICAgd2hpbGUgKCsraXQgIT0gYnVja2V0cy5lbmQoKSkgeworICAgICAgICBpZiAoaXQtPmZpcnN0ID4gbWF4RGVsdGEpIHsKKyAgICAgICAgICAgIG1heERlbHRhID0gaXQtPmZpcnN0OworICAgICAgICB9CisgICAgICAgIGlmIChpdC0+c2Vjb25kID4gbWF4Q291bnQpIHsKKyAgICAgICAgICAgIG1heENvdW50ID0gaXQtPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbnQgaGVpZ2h0ID0gbG9nMihtYXhDb3VudCkgKyAxOyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCisgICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZigxIDw8IGhlaWdodCk7CisgICAgY29uc3QgaW50IGNvbFdpZHRoID0gc3RkOjptYXgoc3RkOjptYXgod2lkdGhPZihtYXhEZWx0YSkgKyAxLCAzKSwgbGVmdFBhZGRpbmcgKyAyKTsKKyAgICBpbnQgc2NhbGluZ0ZhY3RvciA9IDE7CisgICAgLy8gc2NhbGUgZGF0YSBpZiBpdCBleGNlZWRzIG1heGltdW0gaGVpZ2h0CisgICAgaWYgKGhlaWdodCA+IG1heEhlaWdodCkgeworICAgICAgICBzY2FsaW5nRmFjdG9yID0gKGhlaWdodCArIG1heEhlaWdodCkgLyBtYXhIZWlnaHQ7CisgICAgICAgIGhlaWdodCAvPSBzY2FsaW5nRmFjdG9yOworICAgIH0KKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzIiwgbGVmdFBhZGRpbmcgKyAxMSwgIk9jY3VycmVuY2VzIik7CisgICAgLy8gd3JpdGUgaGlzdG9ncmFtIGxhYmVsIGxpbmUgd2l0aCBidWNrZXQgdmFsdWVzCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOworICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5zZWNvbmQpOworICAgIH0KKyAgICAvLyB3cml0ZSBoaXN0b2dyYW0gYXNjaWkgYXJ0CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICBmb3IgKGludCByb3cgPSBoZWlnaHQgKiBzY2FsaW5nRmFjdG9yOyByb3cgPj0gMDsgcm93IC09IHNjYWxpbmdGYWN0b3IpIHsKKyAgICAgICAgY29uc3QgaW50IHZhbHVlID0gMSA8PCByb3c7CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIGxlZnRQYWRkaW5nLCBzcGFjZXMuY19zdHIoKSk7CisgICAgICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKKyAgICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGNvbFdpZHRoIC0gMSwgc3BhY2VzLmNfc3RyKCksIHguc2Vjb25kIDwgdmFsdWUgPyAiICIgOiAifCIpOworICAgICAgICB9CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7CisgICAgfQorICAgIC8vIHByaW50IHgtYXhpcworICAgIGNvbnN0IGludCBjb2x1bW5zID0gc3RhdGljX2Nhc3Q8aW50PihidWNrZXRzLnNpemUoKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmMiLCBsZWZ0UGFkZGluZywgJyAnKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoY29sdW1ucyArIDEpICogY29sV2lkdGgsIHVuZGVyc2NvcmVzLmNfc3RyKCkpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7CisKKyAgICAvLyB3cml0ZSBmb290ZXIgd2l0aCBidWNrZXQgbGFiZWxzCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKKyAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguZmlyc3QpOworICAgIH0KKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGNvbFdpZHRoLCBzcGFjZXMuY19zdHIoKSwgIm1zXG4iKTsKKworICAgIC8vIE5vdyByZXBvcnQgZ2xpdGNoZXMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxudGltZSBlbGFwc2VkIGJldHdlZW4gZ2xpdGNoZXMgYW5kIGdsaXRjaCB0aW1lc3RhbXBzXG4iKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dGxpZXI6IG1PdXRsaWVyRGF0YSkgeworICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVsbGQ6ICVsbGRcbiIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuc2Vjb25kKSk7CisgICAgfQorCit9CisKKworLy8gUHJvZHVjZXMgYSBsb2cgd2FybmluZyBpZiB0aGUgdGltaW5nIG9mIHJlY2VudCBidWZmZXIgcGVyaW9kcyBjYXVzZWQgYSBnbGl0Y2gKKy8vIENvbXB1dGVzIHN1bSBvZiBydW5uaW5nIHdpbmRvdyBvZiB0aHJlZSBidWZmZXIgcGVyaW9kcworLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGJ1ZmZlciBwZXJpb2RzIGxlYXZlIGVub3VnaCBDUFUgdGltZSBmb3IgdGhlIG5leHQgb25lCisvLyBlLmcuIGlmIGEgYnVmZmVyIHBlcmlvZCBpcyBleHBlY3RlZCB0byBiZSA0IG1zIGFuZCBhIGJ1ZmZlciByZXF1aXJlcyAzIG1zIG9mIENQVSB0aW1lLAorLy8gaGVyZSBhcmUgc29tZSBnbGl0Y2ggY2FzZXM6CisvLyA0ICsgNCArIDYgOyA1ICsgNCArIDU7IDIgKyAyICsgMTAKKy8vIFRPRE86IGRldmVsb3AgdGhpcyBjb2RlIHRvIHRyYWNrIGNoYW5nZXMgaW4gaGlzdG9ncmFtIGRpc3RyaWJ1dGlvbiBpbiBhZGRpdGlvbgorLy8gdG8gLyBpbnN0ZWFkIG9mIGdsaXRjaGVzLgordm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjphbGVydElmR2xpdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzKSB7CisgICAgc3RkOjpkZXF1ZTxpbnQ+IHBlcmlvZHMoa051bUJ1ZmYsIGtQZXJpb2RNcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDI7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7IC8vIHNraXAgZmlyc3QgdGltZSBlbnRyeQorICAgICAgICBwZXJpb2RzLnB1c2hfZnJvbnQoZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSkpOworICAgICAgICBwZXJpb2RzLnBvcF9iYWNrKCk7CisgICAgICAgIC8vIFRPRE86IGNoZWNrIHRoYXQgYWxsIGdsaXRjaCBjYXNlcyBhcmUgY292ZXJlZAorICAgICAgICBpZiAoc3RkOjphY2N1bXVsYXRlKHBlcmlvZHMuYmVnaW4oKSwgcGVyaW9kcy5lbmQoKSwgMCkgPiBrTnVtQnVmZiAqIGtQZXJpb2RNcyArCisgICAgICAgICAgICBrUGVyaW9kTXMgLSBrUGVyaW9kTXNDUFUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQSBnbGl0Y2ggb2NjdXJyZWQiKTsKKyAgICAgICAgICAgICAgICBwZXJpb2RzLmFzc2lnbihrTnVtQnVmZiwga1BlcmlvZE1zKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuY3BwIGIvbWVkaWEvbGlibmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNTBhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUmVwb3J0UGVyZm9ybWFuY2UiCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oPgorLy8gI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPiAvLyB1c2VkIHRvIHByaW50IGNhbGxzdGFjaworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgeworCisvLyBXcml0ZXMgb3V0bGllciBpbnRlcnZhbHMsIHRpbWVzdGFtcHMsIGFuZCBoaXN0b2dyYW1zIHNwYW5uaW5nIGxvbmcgdGltZSBpbnRlcnZhbHMgdG8gYSBmaWxlLgorLy8gVE9ETzogZm9ybWF0IHRoZSBkYXRhIGVmZmljaWVudGx5IGFuZCB3cml0ZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YSB0byBkaWZmZXJlbnQgZmlsZXMKK3ZvaWQgd3JpdGVUb0ZpbGUoc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8b3V0bGllckludGVydmFsLCB0aW1lc3RhbXA+PiAmb3V0bGllckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+ICZoaXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXBwZW5kKSB7CisgICAgQUxPR0QoIndyaXRpbmcgcGVyZm9ybWFuY2UgZGF0YSB0byBmaWxlIik7CisgICAgaWYgKG91dGxpZXJEYXRhLmVtcHR5KCkgfHwgaGlzdHMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpvZnN0cmVhbSBvZnM7CisgICAgb2ZzLm9wZW4oa05hbWUsIGFwcGVuZCA/IHN0ZDo6aW9zOjphcHAgOiBzdGQ6Omlvczo6dHJ1bmMpOworICAgIGlmICghb2ZzLmlzX29wZW4oKSkgeworICAgICAgICBBTE9HVygiY291bGRuJ3Qgb3BlbiBmaWxlICVzIiwga05hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG9mcyA8PCAiT3V0bGllciBkYXRhOiBpbnRlcnZhbCBhbmQgdGltZXN0YW1wXG4iOworICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllciA6IG91dGxpZXJEYXRhKSB7CisgICAgICAgIG9mcyA8PCBvdXRsaWVyLmZpcnN0IDw8ICI6ICIgPDwgb3V0bGllci5zZWNvbmQgPDwgIlxuIjsKKyAgICB9CisgICAgb2ZzIDw8ICJIaXN0b2dyYW0gZGF0YVxuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmhpc3QgOiBoaXN0cykgeworICAgICAgICBvZnMgPDwgIlx0dGltZXN0YW1wXG4iOworICAgICAgICBvZnMgPDwgaGlzdC5maXJzdCA8PCAiXG4iOworICAgICAgICBvZnMgPDwgIlx0YnVja2V0cyBhbmQgY291bnRzXG4iOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmJ1Y2tldCA6IGhpc3Quc2Vjb25kKSB7CisgICAgICAgICAgICBvZnMgPDwgYnVja2V0LmZpcnN0IDw8ICI6ICIgPDwgYnVja2V0LnNlY29uZCA8PCAiXG4iOworICAgICAgICB9CisgICAgfQorICAgIG9mcy5jbG9zZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCmluZGV4IDQ3NDdkY2YuLjcxMTgyYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCkBAIC0xOSw4ICsxOSw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fQlVGRkVSX1BST1ZJREVSX1NPVVJDRV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fQlVGRkVSX1BST1ZJREVSX1NPVVJDRV9ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9TdHJlYW1JblNvdXJjZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCmluZGV4IDUwOGUwZmUuLjhhM2ZmYmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9TdHJlYW1JblNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fU1RSRUFNX0lOX1NPVVJDRV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fU1RSRUFNX0lOX1NPVVJDRV9ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbU91dFNpbmsuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbU91dFNpbmsuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaAppbmRleCA1NmEyYTM4Li4zNDhiNGY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19TVFJFQU1fT1VUX1NJTktfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX1NUUkVBTV9PVVRfU0lOS19ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNpbmsuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oCmluZGV4IDk3YTU3ZTAzLi41MzVlM2Y1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0xpYnNuZGZpbGVTaW5rLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oCkBAIC0xNyw3ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TSU5LX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19MSUJTTkRGSUxFX1NJTktfSAogCi0jaW5jbHVkZSAiTkJBSU8uaCIKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgorCiAjaW5jbHVkZSAic25kZmlsZS5oIgogCiAvLyBJbXBsZW1lbnRhdGlvbiBvZiBOQkFJT19TaW5rIHRoYXQgd3JhcHMgYSBsaWJzbmRmaWxlIG9wZW5lZCBpbiBTRk1fV1JJVEUgbW9kZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU291cmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0xpYnNuZGZpbGVTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKaW5kZXggNGZiZGI0Yi4uYmM2YWE5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU291cmNlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKQEAgLTE3LDcgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19MSUJTTkRGSUxFX1NPVVJDRV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TT1VSQ0VfSAogCi0jaW5jbHVkZSAiTkJBSU8uaCIKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgorCiAjaW5jbHVkZSAic25kZmlsZS5oIgogCiAvLyBJbXBsZW1lbnRhdGlvbiBvZiBOQkFJT19Tb3VyY2UgdGhhdCB3cmFwcyBhIGxpYnNuZGZpbGUgb3BlbmVkIGluIFNGTV9SRUFEIG1vZGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTkJMb2cuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL05CTG9nLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaAppbmRleCA3ODViOWMyLi4zZTQ4ZWUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL05CTG9nLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8dmVjdG9yPgogCkBAIC00Myw4ICs0NCw2IEBACiBjbGFzcyBXcml0ZXI7CiBjbGFzcyBSZWFkZXI7CiAKLXByaXZhdGU6Ci0KIGVudW0gRXZlbnQgOiB1aW50OF90IHsKICAgICBFVkVOVF9SRVNFUlZFRCwKICAgICBFVkVOVF9TVFJJTkcsICAgICAgICAgICAgICAgLy8gQVNDSUkgc3RyaW5nLCBub3QgTlVMLXRlcm1pbmF0ZWQKQEAgLTU5LDEyICs1OCwxMyBAQAogICAgIEVWRU5UX0hBU0gsICAgICAgICAgICAgICAgICAvLyB1bmlxdWUgSEFTSCBvZiBsb2cgb3JpZ2luLCBvcmlnaW5hdGVzIGZyb20gaGFzaCBvZiBmaWxlIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGxpbmUgbnVtYmVyCiAgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQotICAgIEVWRU5UX0hJU1RPR1JBTV9GTFVTSCwgICAgICAvLyBzaG93IGhpc3RvZ3JhbSBvbiBsb2cKKyAgICBFVkVOVF9BVURJT19TVEFURSwgICAgICAgICAgLy8gYXVkaW8gb24vb2ZmIGV2ZW50OiBsb2dnZWQgdXBvbiBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UoKSBjYWxsCiAgICAgRVZFTlRfRU5EX0ZNVCwgICAgICAgICAgICAgIC8vIGVuZCBvZiBsb2dGb3JtYXQgYXJndW1lbnQgbGlzdAogCiAgICAgRVZFTlRfVVBQRVJfQk9VTkQsICAgICAgICAgIC8vIHRvIGNoZWNrIGZvciBpbnZhbGlkIGV2ZW50cwogfTsKIAorcHJpdmF0ZToKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBBUEkgZm9yIGhhbmRsaW5nIGZvcm1hdCBlbnRyeSBvcGVyYXRpb25zCkBAIC0yNDgsNiArMjQ4LDggQEAKICAgICBpbnQgYXV0aG9yOwogfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCit1c2luZyBTdGF0ZVRzRW50cnlXaXRoQXV0aG9yID0gSGlzdFRzRW50cnlXaXRoQXV0aG9yOworCiBzdHJ1Y3QgSGlzdEludEVudHJ5IHsKICAgICBsb2dfaGFzaF90IGhhc2g7CiAgICAgaW50IHZhbHVlOwpAQCAtMzQxLDggKzM0Myw3IEBACiAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7CiAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0VuZCgpOwogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ0hpc3RUUyhsb2dfaGFzaF90IGhhc2gpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIaXN0Rmx1c2gobG9nX2hhc2hfdCBoYXNoKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7CiAKQEAgLTQwNyw2ICs0MDgsNyBAQAogcHVibGljOgogCiAgICAgLy8gQSBzbmFwc2hvdCBvZiBhIHJlYWRlcnMgYnVmZmVyCisgICAgLy8gVGhpcyBpcyByYXcgZGF0YS4gTm8gYW5hbHlzaXMgaGFzIGJlZW4gZG9uZSBvbiBpdAogICAgIGNsYXNzIFNuYXBzaG90IHsKICAgICBwdWJsaWM6CiAgICAgICAgIFNuYXBzaG90KCkgOiBtRGF0YShOVUxMKSwgbUxvc3QoMCkge30KQEAgLTQ0MywyMCArNDQ1LDE3IEBACiAKICAgICB2aXJ0dWFsIH5SZWFkZXIoKTsKIAotICAgIHZvaWQgYWxlcnRJZkdsaXRjaChjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmc2FtcGxlcyk7Ci0KICAgICAvLyBnZXQgc25hcHNob3Qgb2YgcmVhZGVycyBmaWZvIGJ1ZmZlciwgZWZmZWN0aXZlbHkgY29uc3VtaW5nIHRoZSBidWZmZXIKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KCk7CiAgICAgLy8gZHVtcCBhIHBhcnRpY3VsYXIgc25hcHNob3Qgb2YgdGhlIHJlYWRlcgorICAgIC8vIFRPRE86IG1vdmUgZHVtcCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzLiBNb2RlbC92aWV3L2NvbnRyb2xsZXIgZGVzaWduCiAgICAgdm9pZCAgICAgZHVtcChpbnQgZmQsIHNpemVfdCBpbmRlbnQsIFNuYXBzaG90ICYgc25hcCk7CiAgICAgLy8gZHVtcCB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSByZWFkZXIncyBidWZmZXIgKGNhbGwgZ2V0U25hcHNob3QoKSBhbmQgcHJldmlvdXMgZHVtcCgpKQogICAgIHZvaWQgICAgIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50ID0gMCk7CiAgICAgYm9vbCAgICAgaXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdDsKLSAgICAvLyBpZiBmaW5kR2xpdGNoIGlzIHRydWUsIGxvZyB3YXJuaW5nIHdoZW4gYnVmZmVyIHBlcmlvZHMgY2F1c2VkIGdsaXRjaAotICAgIHZvaWQgICAgIHNldEZpbmRHbGl0Y2goYm9vbCBzKTsKLSAgICBib29sICAgICBpc0ZpbmRHbGl0Y2goKSBjb25zdDsKIAogcHJpdmF0ZToKKwogICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gc3RhcnRpbmdUeXBlczsKICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IGVuZGluZ1R5cGVzOwogICAgIC8qY29uc3QqLyBTaGFyZWQqIGNvbnN0IG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnksIGFjdHVhbGx5IGNvbnN0IGJ1dCBub3QKQEAgLTQ2OSwxMCArNDY4LDYgQEAKICAgICBhdWRpb191dGlsc19maWZvX3JlYWRlciAqIGNvbnN0IG1GaWZvUmVhZGVyOyAgICAvLyB1c2VkIHRvIHJlYWQgZnJvbSBGSUZPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscwogCi0gICAgLy8gZWFjaCBwYWlyIGNvbnRhaW5zIGEgc2VxdWVuY2Ugb2YgdGltZXN0YW1wcyAob25lIGhpc3RvZ3JhbSdzIHdvcnRoKQotICAgIC8vIHBhaXIncyBsb2dfaGFzaF90IGlzIHRoZSBoYXNoIG9mIHRoZSBzb3VyY2UgY29kZSBsb2NhdGlvbiB3aGVyZSB0aGUgdGltZXN0YW1wIHdhcyB0YWtlbgotICAgIC8vIHBhaXIncyBpbnQgcG9pbnRzIHRvIHRoZSBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQotICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxsb2dfaGFzaF90LCBpbnQ+LCBzdGQ6OnZlY3RvcjxpbnQ2NF90Pj4gbUhpc3RzOwogICAgIC8vIFRPRE86IGl0IG1pZ2h0IGJlIGNsZWFyZXIsIGluc3RlYWQgb2YgYSBkaXJlY3QgbWFwIGZyb20gc291cmNlIGxvY2F0aW9uIHRvIHZlY3RvciBvZgogICAgIC8vIHRpbWVzdGFtcHMsIGlmIHdlIGluc3RlYWQgZmlyc3QgbWFwcGVkIGZyb20gc291cmNlIGxvY2F0aW9uIHRvIGFuIG9iamVjdCB0aGF0CiAgICAgLy8gcmVwcmVzZW50ZWQgdGhhdCBsb2NhdGlvbi4gQW5kIG9uZV9vZiBpdHMgZmllbGRzIHdvdWxkIGJlIGEgdmVjdG9yIG9mIHRpbWVzdGFtcHMuCkBAIC00ODUsMTcgKzQ4MCwxMiBAQAogICAgIC8vIGR1bW15IG1ldGhvZCBmb3IgaGFuZGxpbmcgYWJzZW50IGF1dGhvciBlbnRyeQogICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSYgLypmbXRFbnRyeSovLCBTdHJpbmc4KiAvKmJvZHkqLykge30KIAotICAgIHN0YXRpYyB2b2lkIGRyYXdIaXN0b2dyYW0oU3RyaW5nOCAqYm9keSwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvZ1NjYWxlLCBpbnQgaW5kZW50ID0gMCwgaW50IG1heEhlaWdodCA9IDEwKTsKLQogICAgIC8vIFNlYXJjaGVzIGZvciB0aGUgbGFzdCBlbnRyeSBvZiB0eXBlIDx0eXBlPiBpbiB0aGUgcmFuZ2UgW2Zyb250LCBiYWNrKQogICAgIC8vIGJhY2sgaGFzIHRvIGJlIGVudHJ5LWFsaWduZWQuIFJldHVybnMgbnVsbHB0ciBpZiBub25lIGVuY29udW50ZXJlZC4KICAgICBzdGF0aWMgY29uc3QgdWludDhfdCAqZmluZExhc3RFbnRyeU9mVHlwZXMoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiAmdHlwZXMpOwogCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU3F1YXNoVGltZXN0YW1wID0gNTsgLy8gc3F1YXNoIHRoaXMgbWFueSBvciBtb3JlIGFkamFjZW50IHRpbWVzdGFtcHMKLQotICAgIGJvb2wgZmluZEdsaXRjaDsgLy8gYWxlcnQgaWYgYSBsb2NhbCBidWZmZXIgcGVyaW9kIHNlcXVlbmNlIGNhdXNlZCBhbiBhdWRpbyBnbGl0Y2gKIH07CiAKIC8vIFdyYXBwZXIgZm9yIGEgcmVhZGVyIHdpdGggYSBuYW1lLiBDb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHJlYWRlciBhbmQgYSBwb2ludGVyIHRvIHRoZSBuYW1lCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZGMxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIE5vbi1ibG9ja2luZyBldmVudCBsb2dnZXIgaW50ZW5kZWQgZm9yIHNhZmUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHByb2Nlc3NlcyB2aWEgc2hhcmVkIG1lbW9yeQorCisjaWZuZGVmIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgIk5CTG9nLmgiCisjaW5jbHVkZSAiUmVwb3J0UGVyZm9ybWFuY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgeworCitjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzIHsKKyAgICAvLyBUaGlzIGNsYXNzIHN0b3JlcyBhbmQgYW5hbHl6ZXMgYXVkaW8gcHJvY2Vzc2luZyB3YWtldXAgdGltZXN0YW1wcyBmcm9tIE5CTG9nCisgICAgLy8gRklYTUU6IGN1cnJlbnRseSwgYWxsIHBlcmZvcm1hbmNlIGRhdGEgaXMgc3RvcmVkIGluIGRlcXVlcy4gTmVlZCB0byBhZGQgYSBtdXRleC4KKyAgICAvLyBGSVhNRTogY29udGludWUgdGhpcyB3YXkgdW50aWwgYW5hbHlzaXMgaXMgZG9uZSBpbiBhIHNlcGFyYXRlIHRocmVhZC4gVGhlbiwgdXNlCisgICAgLy8gdGhlIGZpZm8gd3JpdGVyIHV0aWxpdGllcy4KK3B1YmxpYzoKKworICAgIFBlcmZvcm1hbmNlQW5hbHlzaXMoKTsKKworICAgIC8vIEdpdmVuIGEgc2VyaWVzIG9mIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMsCisgICAgLy8gY29tcHJlc3NlcyBhbmQgYW5kIGFuYWx5emVzIHRoZSBkYXRhLCBhbmQgZmx1c2hlcworICAgIC8vIHRoZSB0aW1lc3RhbXAgc2VyaWVzIGZyb20gbWVtb3J5LgorICAgIHZvaWQgcHJvY2Vzc0FuZEZsdXNoVGltZVN0YW1wU2VyaWVzKCk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhbiBhdWRpbyBvbi9vZmYgZXZlbnQgaXMgcmVhZCBmcm9tIHRoZSBidWZmZXIsCisgICAgLy8gZS5nLiBFVkVOVF9BVURJT19TVEFURS4KKyAgICAvLyBjYWxscyBmbHVzaFRpbWVTdGFtcFNlcmllcyBvbiB0aGUgZGF0YSB1cCB0byB0aGUgZXZlbnQsCisgICAgLy8gZWZmZWN0aXZlbHkgZGlzY2FyZGluZyB0aGUgaWRsZSBhdWRpbyB0aW1lIGludGVydmFsCisgICAgdm9pZCBoYW5kbGVTdGF0ZUNoYW5nZSgpOworCisgICAgLy8gV2hlbiB0aGUgc2hvcnQtdGVybSBoaXN0b2dyYW0gYXJyYXkgbVJlY2VudEhpc3RzIGhhcyByZWFjaGVkIGNhcGFjaXR5LAorICAgIC8vIG1lcmdlcyBoaXN0b2dyYW1zIGZvciBkYXRhIGNvbXByZXNzaW9uIGFuZCBzdG9yZXMgdGhlbSBpbiBtTG9uZ1Rlcm1IaXN0cworICAgIHZvaWQgcHJvY2Vzc0FuZEZsdXNoUmVjZW50SGlzdHMoKTsKKworICAgIC8vIFdyaXRlcyB3YWtldXAgdGltZXN0YW1wIGVudHJ5IHRvIGxvZyBhbmQgcnVucyBhbmFseXNpcworICAgIC8vIFRPRE86IG1ha2UgdGhpcyB0aHJlYWQgc2FmZS4gRWFjaCB0aHJlYWQgc2hvdWxkIGhhdmUgaXRzIG93biBpbnN0YW5jZQorICAgIC8vIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMuCisgICAgdm9pZCBsb2dUc0VudHJ5KHRpbWVzdGFtcF9yYXcgdHMpOworCisgICAgLy8gRklYTUU6IG1ha2UgcGVha2RldGVjdG9yIGFuZCBzdG9yZU91dGxpZXJEYXRhIGEgc2luZ2xlIGZ1bmN0aW9uCisgICAgLy8gSW5wdXQ6IG1PdXRsaWVyRGF0YS4gTG9va3MgYXQgdGltZSBlbGFwc2VkIGJldHdlZW4gb3V0bGllcnMKKyAgICAvLyBmaW5kcyBzaWduaWZpY2FudCBjaGFuZ2VzIGluIHRoZSBkaXN0cmlidXRpb24KKyAgICAvLyB3cml0ZXMgdGltZXN0YW1wcyBvZiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIG1QZWFrVGltZXN0YW1wcworICAgIHZvaWQgZGV0ZWN0UGVha3MoKTsKKworICAgIC8vIHJ1bnMgYW5hbHlzaXMgb24gdGltZXN0YW1wIHNlcmllcyBiZWZvcmUgaXQgaXMgY29udmVydGVkIHRvIGEgaGlzdG9ncmFtCisgICAgLy8gZmluZHMgb3V0bGllcnMKKyAgICAvLyB3cml0ZXMgdG8gbU91dGxpZXJEYXRhIDx0aW1lIGVsYXBzZWQgc2luY2UgcHJldmlvdXMgb3V0bGllciwgb3V0bGllciB0aW1lc3RhbXA+CisgICAgdm9pZCBzdG9yZU91dGxpZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPHRpbWVzdGFtcF9yYXc+ICZ0aW1lc3RhbXBzKTsKKworICAgIC8vIGlucHV0OiBzZXJpZXMgb2Ygc2hvcnQgaGlzdG9ncmFtcy4gR2VuZXJhdGVzIGEgc3RyaW5nIG9mIGFuYWx5c2lzIG9mIHRoZSBidWZmZXIgcGVyaW9kcworICAgIC8vIFRPRE86IFdJUCB3cml0ZSBtb3JlIGRldGFpbGVkIGFuYWx5c2lzCisgICAgLy8gRklYTUU6IG1vdmUgdGhpcyBkYXRhIHZpc3VhbGl6YXRpb24gdG8gYSBzZXBhcmF0ZSBjbGFzcy4gTW9kZWwvdmlldy9jb250cm9sbGVyCisgICAgdm9pZCByZXBvcnRQZXJmb3JtYW5jZShTdHJpbmc4ICpib2R5LCBpbnQgbWF4SGVpZ2h0ID0gMTApOworCisgICAgLy8gVE9ETzogZGVsZXRlIHRoaXMuIHRlbXAgZm9yIHRlc3RpbmcKKyAgICB2b2lkIHRlc3RGdW5jdGlvbigpOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiB1c2VkIHRvIGRldGVjdCBnbGl0Y2hlcyBpbiBhIHRpbWUgc2VyaWVzCisgICAgLy8gVE9ETyBpbmNvcnBvcmF0ZSB0aGlzIGludG8gdGhlIGFuYWx5c2lzIChjdXJyZW50bHkgdW51c2VkKQorICAgIHZvaWQgYWxlcnRJZkdsaXRjaChjb25zdCBzdGQ6OnZlY3Rvcjx0aW1lc3RhbXBfcmF3PiAmc2FtcGxlcyk7CisKK3ByaXZhdGU6CisKKyAgICAvLyBzdG9yZXMgb3V0bGllciBhbmFseXNpczogPGVsYXBzZWQgdGltZSBiZXR3ZWVuIG91dGxpZXJzIGluIG1zLCBvdXRsaWVyIHRpbWVzdGFtcD4KKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxvdXRsaWVySW50ZXJ2YWwsIHRpbWVzdGFtcD4+IG1PdXRsaWVyRGF0YTsKKworICAgIC8vIHN0b3JlcyBlYWNoIHRpbWVzdGFtcCBhdCB3aGljaCBhIHBlYWsgd2FzIGRldGVjdGVkCisgICAgLy8gYSBwZWFrIGlzIGEgbW9tZW50IGF0IHdoaWNoIHRoZSBhdmVyYWdlIG91dGxpZXIgaW50ZXJ2YWwgY2hhbmdlZCBzaWduaWZpY2FudGx5CisgICAgc3RkOjpkZXF1ZTx0aW1lc3RhbXA+IG1QZWFrVGltZXN0YW1wczsKKworICAgIC8vIFRPRE86IHR1cm4gdGhlc2UgaW50byBjaXJjdWxhciBidWZmZXJzIGZvciBiZXR0ZXIgZGF0YSBmbG93CisgICAgLy8gRklGTyBvZiBzbWFsbCBoaXN0b2dyYW1zCisgICAgLy8gc3RvcmVzIGZpeGVkLXNpemUgc2hvcnQgYnVmZmVyIHBlcmlvZCBoaXN0b2dyYW1zIHdpdGggdGltZXN0YW1wIG9mIGZpcnN0IHNhbXBsZQorICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gbVJlY2VudEhpc3RzOworCisgICAgLy8gRklGTyBvZiBzbWFsbCBoaXN0b2dyYW1zCisgICAgLy8gc3RvcmVzIGZpeGVkLXNpemUgbG9uZy10ZXJtIGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIHRpbWVzdGFtcCBvZiBmaXJzdCBzYW1wbGUKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+IG1Mb25nVGVybUhpc3RzOworCisgICAgLy8gdmVjdG9yIG9mIHRpbWVzdGFtcHMsIGNvbGxlY3RlZCBmcm9tIE5CTG9nIGZvciBhIChUT0RPKSBzcGVjaWZpYyB0aHJlYWQKKyAgICAvLyB3aGVuIGEgdmVjdG9yIHJlYWNoZXMgaXRzIG1heGltdW0gc2l6ZSwgdGhlIGRhdGEgaXMgcHJvY2Vzc2VkIGFuZCBmbHVzaGVkCisgICAgc3RkOjp2ZWN0b3I8dGltZXN0YW1wX3Jhdz4gbVRpbWVTdGFtcFNlcmllczsKKworICAgIHN0YXRpYyBjb25zdCBpbnQga01zUGVyU2VjID0gMTAwMDsKKworICAgIC8vIFBhcmFtZXRlcnMgdXNlZCB3aGVuIGRldGVjdGluZyBvdXRsaWVycworICAgIC8vIFRPRE86IGxlYXJuIHNvbWUgb2YgdGhlc2UgZnJvbSB0aGUgZGF0YSwgZGVsZXRlIHVudXNlZCBvbmVzCisgICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIG1ha2Uga1BlcmlvZE1zIHN0YXRpYy4KKyAgICBzdGF0aWMgY29uc3QgaW50IGtOdW1CdWZmID0gMzsgLy8gbnVtYmVyIG9mIGJ1ZmZlcnMgY29uc2lkZXJlZCBpbiBsb2NhbCBoaXN0b3J5CisgICAgaW50IGtQZXJpb2RNczsgLy8gY3VycmVudCBwZXJpb2QgbGVuZ3RoIGlzIGlkZWFsbHkgNCBtcworICAgIHN0YXRpYyBjb25zdCBpbnQga091dGxpZXJNcyA9IDc7IC8vIHZhbHVlcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoaXMgY2F1c2UgZ2xpdGNoZXMKKyAgICAvLyBEQUMgcHJvY2Vzc2luZyB0aW1lIGZvciA0IG1zIGJ1ZmZlcgorICAgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtSYXRpbyA9IDAuNzU7IC8vIGVzdGltYXRlIG9mIENQVSB0aW1lIGFzIHJhdGlvIG9mIHBlcmlvZCBsZW5ndGgKKyAgICBpbnQga1BlcmlvZE1zQ1BVOyAvLyBjb21wdXRlIGJhc2VkIG9uIGtQZXJpb2RMZW4gYW5kIGtSYXRpbworCisgICAgLy8gUGVhayBkZXRlY3Rpb246IG51bWJlciBvZiBzdGFuZGFyZCBkZXZpYXRpb25zIGZyb20gbWVhbiBjb25zaWRlcmVkIGEgc2lnbmlmaWNhbnQgY2hhbmdlCisgICAgc3RhdGljIGNvbnN0IGludCBrU3RkZGV2VGhyZXNob2xkID0gNTsKKworICAgIC8vIGNhcGFjaXR5IGFsbG9jYXRlZCB0byBkYXRhIHN0cnVjdHVyZXMKKyAgICAvLyBUT0RPOiBhZGp1c3QgYWxsIG9mIHRoZXNlIHZhbHVlcworICAgIHN0YXRpYyBjb25zdCBpbnQga1JlY2VudEhpc3RzQ2FwYWNpdHkgPSAxMDA7IC8vIG51bWJlciBvZiBzaG9ydC10ZXJtIGhpc3RvZ3JhbXMgc3RvcmVkIGluIG1lbW9yeQorICAgIHN0YXRpYyBjb25zdCBpbnQga1Nob3J0SGlzdFNpemUgPSA1MDsgLy8gbnVtYmVyIG9mIHNhbXBsZXMgaW4gYSBzaG9ydC10ZXJtIGhpc3RvZ3JhbQorICAgIHN0YXRpYyBjb25zdCBpbnQga091dGxpZXJTZXJpZXNTaXplID0gMTAwOyAvLyBudW1iZXIgb2YgdmFsdWVzIHN0b3JlZCBpbiBvdXRsaWVyIGFycmF5CisgICAgc3RhdGljIGNvbnN0IGludCBrUGVha1Nlcmllc1NpemUgPSAxMDA7IC8vIG51bWJlciBvZiB2YWx1ZXMgc3RvcmVkIGluIHBlYWsgYXJyYXkKKyAgICBzdGF0aWMgY29uc3QgaW50IGtMb25nVGVybUhpc3RzQ2FwYWNpdHkgPSAyMDsgLy8gbnVtYmVyIG9mIGxvbmctdGVybSBoaXN0b2dyYW0gc3RvcmVkIGluIG1lbW9yeQorICAgIC8vIG1heGltdW0gZWxhcHNlZCB0aW1lIGJldHdlZW4gZmlyc3QgYW5kIGxhc3QgdGltZXN0YW1wIG9mIGEgbG9uZy10ZXJtIGhpc3RvZ3JhbQorICAgIHN0YXRpYyBjb25zdCBpbnQga01heEhpc3RUaW1lc3Bhbk1zID0gNSAqIGtNc1BlclNlYzsKKworICAgIC8vIHRoZXNlIHZhcmlhYmxlcyBhcmUgc3RvcmVkIGluLWNsYXNzIHRvIGVuc3VyZSBjb250aW51aXR5IHdoaWxlIGFuYWx5emluZyB0aGUgdGltZXN0YW1wCisgICAgLy8gc2VyaWVzIG9uZSBzaG9ydCBzZXF1ZW5jZSBhdCBhIHRpbWU6IHRoZSB2YXJpYWJsZXMgYXJlIG5vdCByZS1pbml0aWFsaXplZCBldmVyeSB0aW1lLgorICAgIC8vIEZJWE1FOiBjcmVhdGUgaW5uZXIgY2xhc3MgZm9yIHRoZXNlIHZhcmlhYmxlcyBhbmQgZGVjaWRlIHdoaWNoIG90aGVyIG9uZXMgdG8gYWRkIHRvIGl0CisgICAgZG91YmxlIG1QZWFrRGV0ZWN0b3JNZWFuID0gLTE7CisgICAgZG91YmxlIG1QZWFrRGV0ZWN0b3JTZCA9IC0xOworICAgIC8vIHZhcmlhYmxlcyBmb3Igc3RvcmVPdXRsaWVyRGF0YQorICAgIHVpbnQ2NF90IG1FbGFwc2VkID0gMDsKKyAgICBpbnQ2NF90IG1QcmV2TnMgPSAtMTsKKworfTsKKworfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9QRVJGT1JNQU5DRUFOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9QaXBlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCmluZGV4IDU4Yjk3NTAuLjA0MzE5NzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fUElQRV9ICiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+Ci0jaW5jbHVkZSAiTkJBSU8uaCIKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZVJlYWRlci5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZVJlYWRlci5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZDI4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9SRVBPUlRQRVJGT1JNQU5DRV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSAorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgcmVwb3J0UGVyZm9ybWFuY2UgZnVuY3Rpb24KKy8vIFRPRE8gbW92ZSByZXBvcnRQZXJmb3JtYW5jZSBmdW5jdGlvbiB0byBSZXBvcnRQZXJmb3JtYW5jZS5jcHAKK2NsYXNzIFN0cmluZzg7CisKK25hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CisKKy8vIHN0b3JlcyBhIGhpc3RvZ3JhbToga2V5OiBvYnNlcnZlZCBidWZmZXIgcGVyaW9kLiB2YWx1ZTogY291bnQKKy8vIFRPRE86IHVuc2lnbmVkLCB1bnNpZ25lZAordXNpbmcgSGlzdG9ncmFtID0gc3RkOjptYXA8aW50LCBpbnQ+OworCit1c2luZyBvdXRsaWVySW50ZXJ2YWwgPSB1aW50NjRfdDsKKy8vIGludDY0X3QgdGltZXN0YW1wcyBhcmUgY29udmVydGVkIHRvIHVpbnQ2NF90IGluIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnN0b3JlT3V0bGllckRhdGEsCisvLyBhbmQgYWxsIGFuYWx5c2lzIGZ1bmN0aW9ucyB1c2UgdWludDY0X3QuCit1c2luZyB0aW1lc3RhbXAgPSB1aW50NjRfdDsKK3VzaW5nIHRpbWVzdGFtcF9yYXcgPSBpbnQ2NF90OworCisvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gdXNlIDY0IG9yIDMyIGJpdHMKKy8vIFRPRE86IHRoZSBjb2RlIGhhcyBhIG1peCBvZiB0eXBlZGVmIGFuZCB1c2luZy4gU3RhbmRhcmRpemUgdG8gb25lIG9yIHRoZSBvdGhlci4KK3R5cGVkZWYgdWludDY0X3QgbG9nX2hhc2hfdDsKKworc3RhdGljIGlubGluZSBpbnQgZGVsdGFNcyhpbnQ2NF90IG5zMSwgaW50NjRfdCBuczIpIHsKKyAgICByZXR1cm4gKG5zMiAtIG5zMSkgLyAoMTAwMCAqIDEwMDApOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGxvZzIodWludDMyX3QgeCkgeworICAgIC8vIFRoaXMgd29ya3MgZm9yIHggPiAwCisgICAgcmV0dXJuIDMxIC0gX19idWlsdGluX2Nseih4KTsKK30KKworLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyBzcGFubmluZyBsb25nIHRpbWUKKy8vIGludGVydmFscyB0byBhIGZpbGUuCit2b2lkIHdyaXRlVG9GaWxlKHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPG91dGxpZXJJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAorICAgICAgICAgICAgICAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+ICZoaXN0cywKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGtOYW1lLAorICAgICAgICAgICAgICAgICBib29sIGFwcGVuZCk7CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKaW5kZXggYWU0OTkwMy4uY2MyZDAxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKQEAgLTE5LDcgKzE5LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TT1VSQ0VfQVVESU9fQlVGRkVSX1BST1ZJREVSX0gKICNkZWZpbmUgQU5EUk9JRF9TT1VSQ0VfQVVESU9fQlVGRkVSX1BST1ZJREVSX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Nb25vUGlwZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Nb25vUGlwZS5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTW9ub1BpcGUuaAppbmRleCA2MGFlOTJlLi5jNTFkMGZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL01vbm9QaXBlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgogI2luY2x1ZGUgPG1lZGlhL1NpbmdsZVN0YXRlUXVldWUuaD4KLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Nb25vUGlwZVJlYWRlci5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGVSZWFkZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTkJBSU8uaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9OQkFJTy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL05CQUlPLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9OQkFJTy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCmluZGV4IDBkOTY5NmYuLjNjN2FlM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxudW1lcmljPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMzQsOCArMzQsMTEgQEAKICNpbmNsdWRlICJpbmNsdWRlL1NoYXJlZE1lbW9yeUJ1ZmZlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBiaW5kZXI6OlN0YXR1czsKLXVzaW5nIE1lZGlhRGVzY3JhbWJsZXI6OkRlc2NyYW1ibGVJbmZvOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOwogdXNpbmcgQnVmZmVySW5mbyA9IEFDb2RlY0J1ZmZlckNoYW5uZWw6OkJ1ZmZlckluZm87CiB1c2luZyBCdWZmZXJJbmZvSXRlcmF0b3IgPSBzdGQ6OnZlY3Rvcjxjb25zdCBCdWZmZXJJbmZvPjo6Y29uc3RfaXRlcmF0b3I7CiAKQEAgLTExNCw3NCArMTE3LDk3IEBACiAgICAgICAgIHJldHVybiAtRU5PRU5UOwogICAgIH0KIAotICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqc2VjdXJlSGFuZGxlID0gTlVMTDsKICAgICBpZiAoc2VjdXJlKSB7CiAgICAgICAgIHNwPFNlY3VyZUJ1ZmZlcj4gc2VjdXJlRGF0YSA9CiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2VjdXJlQnVmZmVyICo+KGl0LT5tQ29kZWNCdWZmZXIuZ2V0KCkpOwotICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IHNlY3VyZURhdGEtPmdldERlc3RpbmF0aW9uVHlwZSgpOwotICAgICAgICBpZiAoZGVzdGluYXRpb24ubVR5cGUgIT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZSkgeworICAgICAgICBpZiAoc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25UeXBlKCkgIT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZSkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBkZXN0aW5hdGlvbi5tSGFuZGxlID0KLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25Qb2ludGVyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeTsKLSAgICAgICAgZGVzdGluYXRpb24ubVNoYXJlZE1lbW9yeSA9IG1EZWNyeXB0RGVzdGluYXRpb247CisgICAgICAgIHNlY3VyZUhhbmRsZSA9IHN0YXRpY19jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblBvaW50ZXIoKSk7CiAgICAgfQotCi0gICAgSUNyeXB0bzo6U291cmNlQnVmZmVyIHNvdXJjZTsKLSAgICBzb3VyY2UubVNoYXJlZE1lbW9yeSA9IGl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyOwotICAgIHNvdXJjZS5tSGVhcFNlcU51bSA9IG1IZWFwU2VxTnVtOwotCiAgICAgc3NpemVfdCByZXN1bHQgPSAtMTsKICAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGU7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tSGFuZGxlID0gc2VjdXJlSGFuZGxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5OworICAgICAgICAgICAgZGVzdGluYXRpb24ubVNoYXJlZE1lbW9yeSA9IG1EZWNyeXB0RGVzdGluYXRpb247CisgICAgICAgIH0KKworICAgICAgICBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgc291cmNlOworICAgICAgICBzb3VyY2UubVNoYXJlZE1lbW9yeSA9IGl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyOworICAgICAgICBzb3VyY2UubUhlYXBTZXFOdW0gPSBtSGVhcFNlcU51bTsKKwogICAgICAgICByZXN1bHQgPSBtQ3J5cHRvLT5kZWNyeXB0KGtleSwgaXYsIG1vZGUsIHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgc291cmNlLCBpdC0+bUNsaWVudEJ1ZmZlci0+b2Zmc2V0KCksCiAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZGVzdGluYXRpb24sIGVycm9yRGV0YWlsTXNnKTsKLSAgICB9IGVsc2UgewotICAgICAgICBEZXNjcmFtYmxlSW5mbyBkZXNjcmFtYmxlSW5mbzsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uZHN0VHlwZSA9IGRlc3RpbmF0aW9uLm1UeXBlID09Ci0gICAgICAgICAgICAgICAgSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSA/Ci0gICAgICAgICAgICAgICAgRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIgOgotICAgICAgICAgICAgICAgIERlc2NyYW1ibGVJbmZvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5zY3JhbWJsaW5nQ29udHJvbCA9IGtleSAhPSBOVUxMID8KLSAgICAgICAgICAgICAgICAoRGVzY3JhbWJsZXJQbHVnaW46OlNjcmFtYmxpbmdDb250cm9sKWtleVswXSA6Ci0gICAgICAgICAgICAgICAgRGVzY3JhbWJsZXJQbHVnaW46OmtTY3JhbWJsaW5nX1Vuc2NyYW1ibGVkOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5udW1TdWJTYW1wbGVzID0gbnVtU3ViU2FtcGxlczsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uc3ViU2FtcGxlcyA9IChEZXNjcmFtYmxlclBsdWdpbjo6U3ViU2FtcGxlICopc3ViU2FtcGxlczsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uc3JjTWVtID0gaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXI7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLnNyY09mZnNldCA9IDA7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLmRzdFB0ciA9IE5VTEw7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLmRzdE9mZnNldCA9IDA7Ci0KLSAgICAgICAgaW50MzJfdCBkZXNjcmFtYmxlUmVzdWx0ID0gLTE7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoZGVzY3JhbWJsZUluZm8sICZkZXNjcmFtYmxlUmVzdWx0KTsKLQotICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gZGVzY3JhbWJsZVJlc3VsdDsKLSAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGVzY3JhbWJsZSBmYWlsZWQsIGV4Y2VwdGlvbkNvZGU9JWQsIGVycj0lZCwgcmVzdWx0PSV6ZCIsCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25Db2RlKCksIHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCksIHJlc3VsdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiZGVzY3JhbWJsZSBzdWNjZWVkZWQsIHJlc3VsdD0lemQiLCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChyZXN1bHQgPiAwICYmIGRlc3RpbmF0aW9uLm1UeXBlID09IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnkpIHsKLSAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5LT5wb2ludGVyKCksCisgICAgICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSA9PSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5KSB7CisgICAgICAgICAgICBtZW1jcHkoaXQtPm1Db2RlY0J1ZmZlci0+YmFzZSgpLCBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5LT5wb2ludGVyKCksIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBIZXJlIHdlIGNhc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgdG8gaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTdWJTYW1wbGUKKyAgICAgICAgLy8gZGlyZWN0bHksIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgc2hvdWxkIG1hdGNoIGFzIGNoZWNrZWQgaW4gRGVzY3JhbWJsZXJJbXBsLmNwcC4KKyAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBoaWRsU3ViU2FtcGxlczsKKyAgICAgICAgaGlkbFN1YlNhbXBsZXMuc2V0VG9FeHRlcm5hbCgoU3ViU2FtcGxlICopc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZmFsc2UgLypvd24qLyk7CisKKyAgICAgICAgc3NpemVfdCBvZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpdC0+bVNoYXJlZEVuY3J5cHRlZEJ1ZmZlci0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKKyAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgc3JjQnVmZmVyID0geworICAgICAgICAgICAgICAgIC5oZWFwQmFzZSA9IG1IaWRsTWVtb3J5LAorICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAodWludDY0X3QpIG9mZnNldCwKKyAgICAgICAgICAgICAgICAuc2l6ZSA9IHNpemUKKyAgICAgICAgfTsKKworICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkc3RCdWZmZXI7CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6TkFUSVZFX0hBTkRMRTsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci5zZWN1cmVNZW1vcnkgPSBoaWRsX2hhbmRsZShzZWN1cmVIYW5kbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0QnVmZmVyLnR5cGUgPSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZOworICAgICAgICAgICAgZHN0QnVmZmVyLm5vbnNlY3VyZU1lbW9yeSA9IHNyY0J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgICAgICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOworCisgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKKyAgICAgICAgICAgICAgICBrZXkgIT0gTlVMTCA/IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF0gOiBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQsCisgICAgICAgICAgICAgICAgaGlkbFN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZyZXN1bHQsICZkZXRhaWxlZEVycm9yXSAoCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgX3N0YXR1cywgdWludDMyX3QgX2J5dGVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBfZGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfc3RhdHVzOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoc3NpemVfdClfYnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gX2RldGFpbGVkRXJyb3I7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpPSyB8fCByZXN1bHQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzLCBzdGF0dXM9JWQsIHJlc3VsdD0lemQiLAorICAgICAgICAgICAgICAgICAgICByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgc3RhdHVzLCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiZGVzY3JhbWJsZSBzdWNjZWVkZWQsICV6ZCBieXRlcyIsIHJlc3VsdCk7CisKKyAgICAgICAgaWYgKGRzdEJ1ZmZlci50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgICAgIG1lbWNweShpdC0+bUNvZGVjQnVmZmVyLT5iYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KilpdC0+bVNoYXJlZEVuY3J5cHRlZEJ1ZmZlci0+cG9pbnRlcigpLCByZXN1bHQpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBpZiAoZGVzdGluYXRpb24ubVR5cGUgPT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSkgewotICAgICAgICBtZW1jcHkoaXQtPm1Db2RlY0J1ZmZlci0+YmFzZSgpLCBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5LT5wb2ludGVyKCksIHJlc3VsdCk7Ci0gICAgfQotCiAgICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgcmVzdWx0KTsKIAogICAgIC8vIENvcHkgbWV0YWRhdGEgZnJvbSBjbGllbnQgdG8gY29kZWMgYnVmZmVyLgpAQCAtMjc1LDEwICszMDEsMjEgQEAKICAgICAgICAgaW50MzJfdCBzZXFOdW0gPSBtQ3J5cHRvLT5zZXRIZWFwKGRlYWxlci0+Z2V0TWVtb3J5SGVhcCgpKTsKICAgICAgICAgaWYgKHNlcU51bSA+PSAwKSB7CiAgICAgICAgICAgICBtSGVhcFNlcU51bSA9IHNlcU51bTsKLSAgICAgICAgICAgIEFMT0dEKCJzZXRIZWFwIHJldHVybmVkIG1IZWFwU2VxTnVtPSVkIiwgbUhlYXBTZXFOdW0pOworICAgICAgICAgICAgQUxPR1YoInNldEhlYXAgcmV0dXJuZWQgbUhlYXBTZXFOdW09JWQiLCBtSGVhcFNlcU51bSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtSGVhcFNlcU51bSA9IC0xOwotICAgICAgICAgICAgQUxPR0QoInNldEhlYXAgZmFpbGVkLCBzZXR0aW5nIG1IZWFwU2VxTnVtPS0xIik7CisgICAgICAgICAgICBBTE9HRSgic2V0SGVhcCBmYWlsZWQsIHNldHRpbmcgbUhlYXBTZXFOdW09LTEiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobURlc2NyYW1ibGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBkZWFsZXItPmdldE1lbW9yeUhlYXAoKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKG5hdGl2ZUhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbnQgZmQgPSBoZWFwLT5nZXRIZWFwSUQoKTsKKyAgICAgICAgICAgIG5hdGl2ZUhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgICAgICAgICAgbUhpZGxNZW1vcnkgPSBoaWRsX21lbW9yeSgiYXNobWVtIiwgaGlkbF9oYW5kbGUobmF0aXZlSGFuZGxlKSwgaGVhcC0+Z2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVkIGhpZGxfbWVtb3J5IGZvciBkZXNjcmFtYmxlciIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjcmVhdGUgaGlkbF9tZW1vcnkgZm9yIGRlc2NyYW1ibGVyIik7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGRlYWxlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCmluZGV4IDZjYzFhY2UuLjIwNDFiODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsNyBAQAogICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKICAgICAgICAgIkF1ZGlvU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJJbXBsLmNwcCIsCisgICAgICAgICJDb2RlY0Jhc2UuY3BwIiwKICAgICAgICAgIkNhbGxiYWNrRGF0YVNvdXJjZS5jcHAiLAogICAgICAgICAiQ2FtZXJhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIiwKQEAgLTEwNCw2ICsxMDUsOSBAQAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJAMS4wIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MTBiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlY0Jhc2UiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIEJ1ZmZlckNoYW5uZWxCYXNlOjpzZXRDcnlwdG8oY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bykgeworICAgIG1DcnlwdG8gPSBjcnlwdG87Cit9CisKK3ZvaWQgQnVmZmVyQ2hhbm5lbEJhc2U6OnNldERlc2NyYW1ibGVyKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKSB7CisgICAgbURlc2NyYW1ibGVyID0gZGVzY3JhbWJsZXI7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuY3BwCmluZGV4IDkxNzg3MGYuLjFhYTNiYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmNwcApAQCAtODgsNyArODgsOSBAQAogCiBzdGF0dXNfdCBGcmFtZVJlbmRlclRyYWNrZXI6Om9uRnJhbWVSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHN5c3RlbU5hbm8pIHsKICAgICAvLyBlbnN1cmUgbW9ub3RvbmljIHRpbWVzdGFtcHMKLSAgICBpZiAobUxhc3RSZW5kZXJUaW1lTnMgPj0gc3lzdGVtTmFubykgeworICAgIGlmIChtTGFzdFJlbmRlclRpbWVOcyA+IHN5c3RlbU5hbm8gfHwKKyAgICAgICAgLy8gRU9TIGlzIG5vcm1hbGx5IG1hcmtlZCBvbiB0aGUgbGFzdCBmcmFtZQorICAgICAgICAobUxhc3RSZW5kZXJUaW1lTnMgPT0gc3lzdGVtTmFubyAmJiBtZWRpYVRpbWVVcyAhPSBJTlQ2NF9NQVgpKSB7CiAgICAgICAgIEFMT0dXKCJbJXNdIElnbm9yaW5nIG91dCBvZiBvcmRlci9zdGFsZSBzeXN0ZW0gbmFubyAlbGxkIGZvciBtZWRpYSB0aW1lICVsbGQgZnJvbSBjb2RlYy4iLAogICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpc3lzdGVtTmFubywgKGxvbmcgbG9uZyltZWRpYVRpbWVVcyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IGJkNzE2MzIuLjk4ZDEwMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC0yMyw3ICsyMyw4IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9TaGFyZWRNZW1vcnlCdWZmZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA1MWYxYmEzLi42NDBjYjgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTnVNZWRpYUV4dHJhY3RvciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTgzLDggKzgyLDggQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIGlmIChtQ2FzICE9IE5VTEwpIHsKLSAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXMpOworICAgIGlmICghbUNhc1Rva2VuLmVtcHR5KCkpIHsKKyAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXNUb2tlbik7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyID0gdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7CkBAIC0xMTksOCArMTE4LDggQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIGlmIChtQ2FzICE9IE5VTEwpIHsKLSAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXMpOworICAgIGlmICghbUNhc1Rva2VuLmVtcHR5KCkpIHsKKyAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXNUb2tlbik7CiAgICAgfQogCiAgICAgZXJyID0gdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7CkBAIC0xNDksOCArMTQ4LDggQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIGlmIChtQ2FzICE9IE5VTEwpIHsKLSAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXMpOworICAgIGlmICghbUNhc1Rva2VuLmVtcHR5KCkpIHsKKyAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXNUb2tlbik7CiAgICAgfQogCiAgICAgZXJyID0gdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7CkBAIC0xNjEsMjQgKzE2MCwzNiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpIHsKLSAgICBBTE9HVigic2V0TWVkaWFDYXM6IGNhcz0lcCIsIGNhcy5nZXQoKSk7CitzdGF0aWMgU3RyaW5nOCBhcnJheVRvU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhcnJheSkgeworICAgIFN0cmluZzggcmVzdWx0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTAyeCAiLCBhcnJheVtpXSk7CisgICAgfQorICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIihudWxsKSIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSB7CisgICAgQUxPR1YoInNldE1lZGlhQ2FzOiBjYXNUb2tlbj17JXN9IiwgYXJyYXlUb1N0cmluZyhjYXNUb2tlbikuY19zdHIoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgaWYgKGNhcyA9PSBOVUxMKSB7CisgICAgaWYgKGNhc1Rva2VuLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBtQ2FzVG9rZW4gPSBjYXNUb2tlbjsKKwogICAgIGlmIChtSW1wbCAhPSBOVUxMKSB7Ci0gICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhjYXMpOworICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMoY2FzVG9rZW4pOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSB1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1DYXMgPSBjYXM7CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCmluZGV4IDlmYmRiNzIuLmUwYzBjMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCkBAIC0yMTgsNiArMjE4LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRBQUMyOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKChPTVhfVTMyKSBpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ0FBQyA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKmFhY1BhcmFtcyA9CkBAIC0zNDIsNiArMzY2LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nQUFDKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKaW5kZXggNzU1MzE1My4uYjdlODRlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCkBAIC0xNDMsNiArMTQzLDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRBTVI6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdBTVIgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FtcjoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKmFtclBhcmFtcyA9CkBAIC0yMzYsNiArMjYwLDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nQU1SKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FtcjoKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKmFhY1BhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCmluZGV4IGY4OTY4OGMuLmNmZjRhMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCkBAIC02OCw3ICs2OCw3IEBACiAgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CiAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1JbnB1dEJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gODE5MjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSAzMjc2ODsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAppbmRleCBmN2MwNDI5Li43YTRjY2E5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKQEAgLTEwNSw2ICsxMDUsMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdEc3MTE6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdHNzExIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KQEAgLTE3Myw2ICsxOTcsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdHNzExKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCmluZGV4IDExOTk5YjQuLmQ3NzcyMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCkBAIC0xMDUsNiArMTA1LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRHU006OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdHU01GUiA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0xNjQsNiArMTg4LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nR1NNRlIpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IDNkZWYxZjAuLjIzNjQ2ODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTM0LDYgKzEzNCwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0TVAzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nTVAzIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KQEAgLTIwOCw2ICsyMzIsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdNUDMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAppbmRleCAyYWM2Y2UwLi5kMWY1ZTU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKQEAgLTEyOSw2ICsxMjksMzEgQEAKIE9NWF9FUlJPUlRZUEUgU29mdE9wdXM6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoKGludClpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gKE9NWF9BVURJT19DT0RJTkdUWVBFKU9NWF9BVURJT19Db2RpbmdBbmRyb2lkT1BVUyA6CisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXM6CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICpvcHVzUGFyYW1zID0KQEAgLTIxMiw2ICsyMzcsMzAgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0FVRElPX0NPRElOR1RZUEUpT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqb3B1c1BhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcAppbmRleCBhY2IyYjM3Li4xYTUyN2IzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKQEAgLTYwLDcgKzYwLDcgQEAKICAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKICAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gMzIgKiAxMDI0OworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDY0ICogMTAyNDsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CkBAIC03OCw3ICs3OCw3IEBACiAgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OwogICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKLSAgICBkZWYubkJ1ZmZlclNpemUgPSAzMiAqIDEwMjQ7CisgICAgZGVmLm5CdWZmZXJTaXplID0gNjQgKiAxMDI0OwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKQEAgLTEwMCw2ICsxMDAsMjggQEAKIE9NWF9FUlJPUlRZUEUgU29mdFJhdzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KQEAgLTE1Myw2ICsxNzUsMjYgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKaW5kZXggMTRkZDI1MC4uOTZlMDFiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKQEAgLTEyOSw2ICsxMjksMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdFZvcmJpczo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ1ZPUkJJUyA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqdm9yYmlzUGFyYW1zID0KQEAgLTIyMSw2ICsyNDUsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdWT1JCSVMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqdm9yYmlzUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAppbmRleCA5MTQ2MmM4Li45MTA4Y2UxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCkBAIC0xLDcgKzEsMTIgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAogICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSIsCkBAIC0xMSwxMiArMTYsMTMgQEAKICAgICAgICAgImluY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbiIsCiAgICAgXSwKIAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgIF0sCi0KICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oCmluZGV4IDBkYTJlODEuLmYyNTNhNTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oCkBAIC0zMCw2ICszMCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgaGFyZHdhcmU6OmhpZGxfbWVtb3J5OworCiAvKioKICAqIEJ1ZmZlckNoYW5uZWxCYXNlIGltcGxlbWVudGF0aW9uIGZvciBBQ29kZWMuCiAgKi8KQEAgLTExNyw2ICsxMTksNyBAQAogICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKICAgICBzcDxJTWVtb3J5PiBtRGVjcnlwdERlc3RpbmF0aW9uOwogICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisgICAgaGlkbF9tZW1vcnkgbUhpZGxNZW1vcnk7CiAKICAgICAvLyBUaGVzZSBzaG91bGQgb25seSBiZSBhY2Nlc3NlZCB2aWEgc3RkOjphdG9taWNfKiBmdW5jdGlvbnMuCiAgICAgLy8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgKaW5kZXggMmE3NTI5OC4uYWM5M2I1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHMlRTRXh0cmFjdG9yIjsgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKaW5kZXggMGRkNzdiYS4uNjI0NWNjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCkBAIC0yNCwyNyArMjQsMzEgQEAKIAogI2RlZmluZSBTVFJJTkdJRllfRU5VTVMKIAotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+Ci0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgogI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgogCi0jaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwogY2xhc3MgQnVmZmVyQ2hhbm5lbEJhc2U7CiBzdHJ1Y3QgQnVmZmVyUHJvZHVjZXJXcmFwcGVyOwogY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKIHN0cnVjdCBQZXJzaXN0ZW50U3VyZmFjZTsKIHN0cnVjdCBSZW5kZXJlZEZyYW1lSW5mbzsKIGNsYXNzIFN1cmZhY2U7CitzdHJ1Y3QgSUNyeXB0bzsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FzIHsKK25hbWVzcGFjZSBuYXRpdmUgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElEZXNjcmFtYmxlcjsKK319fX0KK3VzaW5nIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6SURlc2NyYW1ibGVyOwogCiBzdHJ1Y3QgQ29kZWNCYXNlIDogcHVibGljIEFIYW5kbGVyLCAvKiBzdGF0aWMgKi8gQ29sb3JVdGlscyB7CiAgICAgLyoqCkBAIC0yNTYsMTMgKzI2MCw5IEBACiAgICAgICAgIG1DYWxsYmFjayA9IHN0ZDo6bW92ZShjYWxsYmFjayk7CiAgICAgfQogCi0gICAgaW5saW5lIHZvaWQgc2V0Q3J5cHRvKGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8pIHsKLSAgICAgICAgbUNyeXB0byA9IGNyeXB0bzsKLSAgICB9CisgICAgdm9pZCBzZXRDcnlwdG8oY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0byk7CiAKLSAgICBpbmxpbmUgdm9pZCBzZXREZXNjcmFtYmxlcihjb25zdCBzcDxJRGVzY3JhbWJsZXI+ICZkZXNjcmFtYmxlcikgewotICAgICAgICBtRGVzY3JhbWJsZXIgPSBkZXNjcmFtYmxlcjsKLSAgICB9CisgICAgdm9pZCBzZXREZXNjcmFtYmxlcihjb25zdCBzcDxJRGVzY3JhbWJsZXI+ICZkZXNjcmFtYmxlcik7CiAKICAgICAvKioKICAgICAgKiBRdWV1ZSBhbiBpbnB1dCBidWZmZXIgaW50byB0aGUgYnVmZmVyIGNoYW5uZWwuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCmluZGV4IDQxNDAyNjYuLjIwOWZlMTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCkBAIC00NywxMCArNDcsMTMgQEAKIHN0cnVjdCBQZXJzaXN0ZW50U3VyZmFjZTsKIGNsYXNzIFNvZnR3YXJlUmVuZGVyZXI7CiBjbGFzcyBTdXJmYWNlOwotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElEZXNjcmFtYmxlcjsKLX07Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhcyB7CituYW1lc3BhY2UgbmF0aXZlIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJRGVzY3JhbWJsZXI7Cit9fX19Cit1c2luZyBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OklEZXNjcmFtYmxlcjsKIAogc3RydWN0IE1lZGlhQ29kZWMgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gQ29uZmlndXJlRmxhZ3MgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCmluZGV4IDJlNjYzZWMuLjZhNWM2YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKQEAgLTc5LDYgKzc5LDI2IEBACiAgICAgSEVBUlRCRUFUX0VSUk9SX0JBU0UgPSAtMzAwMCwKICAgICBFUlJPUl9IRUFSVEJFQVRfVEVSTUlOQVRFX1JFUVVFU1RFRCAgICAgICAgICAgICAgICAgICAgID0gSEVBUlRCRUFUX0VSUk9SX0JBU0UsCiAKKyAgICAvLyBDQVMtcmVsYXRlZCBlcnJvciBjb2RlcworICAgIENBU19FUlJPUl9CQVNFID0gLTQwMDAsCisKKyAgICBFUlJPUl9DQVNfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UsCisgICAgRVJST1JfQ0FTX05PX0xJQ0VOU0UgICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMSwKKyAgICBFUlJPUl9DQVNfTElDRU5TRV9FWFBJUkVEICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAyLAorICAgIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDMsCisgICAgRVJST1JfQ0FTX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQgICA9IENBU19FUlJPUl9CQVNFIC0gNCwKKyAgICBFUlJPUl9DQVNfREVDUllQVCAgICAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA1LAorICAgIEVSUk9SX0NBU19DQU5OT1RfSEFORExFICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDYsCisgICAgRVJST1JfQ0FTX1RBTVBFUl9ERVRFQ1RFRCAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gNywKKyAgICBFUlJPUl9DQVNfTk9UX1BST1ZJU0lPTkVEICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA4LAorICAgIEVSUk9SX0NBU19ERVZJQ0VfUkVWT0tFRCAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDksCisgICAgRVJST1JfQ0FTX1JFU09VUkNFX0JVU1kgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMTAsCisgICAgRVJST1JfQ0FTX0lOU1VGRklDSUVOVF9PVVRQVVRfUFJPVEVDVElPTiA9IENBU19FUlJPUl9CQVNFIC0gMTEsCisgICAgRVJST1JfQ0FTX0xBU1RfVVNFRF9FUlJPUkNPREUgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMTEsCisKKyAgICBFUlJPUl9DQVNfVkVORE9SX01BWCAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA1MDAsCisgICAgRVJST1JfQ0FTX1ZFTkRPUl9NSU4gICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gOTk5LAorCiAgICAgLy8gTkRLIEVycm9yIGNvZGVzCiAgICAgLy8gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmgKICAgICAvLyBmcm9tIC0xMDAwMCAoMHhGRkZGRDhGMCAtIDB4RkZGRkQ4RUMpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKaW5kZXggYTg1NmIyYi4uZjEyMTYwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtMjMsMTAgKzIzLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci19OwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwogY2xhc3MgRGF0YVNvdXJjZTsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIGNsYXNzIE1ldGFEYXRhOwpAQCAtNzAsNyArNjYsNyBAQAogICAgIH0KICAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IC8qdWlkKi8pIHsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiYgLypjYXMqLykgb3ZlcnJpZGUgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICYvKmNhc1Rva2VuKi8pIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAppbmRleCAzZTNjYzE3Li42YTkzYmQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaApAQCAtMjgsMTAgKzI4LDYgQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci19Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CiAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IEFNZXNzYWdlOwpAQCAtNjQsNyArNjAsNyBAQAogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YXNvdXJjZSk7CiAKLSAgICBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmY2FzKTsKKyAgICBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKTsKIAogICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFRyYWNrRm9ybWF0KHNpemVfdCBpbmRleCwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQsIHVpbnQzMl90IGZsYWdzID0gMCkgY29uc3Q7CkBAIC0xMTUsNyArMTExLDcgQEAKICAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKIAogICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gbUltcGw7Ci0gICAgc3A8SUNhcz4gbUNhczsKKyAgICBISW50ZXJmYWNlVG9rZW4gbUNhc1Rva2VuOwogCiAgICAgVmVjdG9yPFRyYWNrSW5mbz4gbVNlbGVjdGVkVHJhY2tzOwogICAgIGludDY0X3QgbVRvdGFsQml0cmF0ZTsgIC8vIGluIGJpdHMvc2VjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKaW5kZXggMzFlZGIyMS4uYTI1NmE0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcApAQCAtMjMsOCArMjMsOCBAQAogI2luY2x1ZGUgIkVTUXVldWUuaCIKICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00MSw4ICs0MSwxMiBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotdXNpbmcgTWVkaWFEZXNjcmFtYmxlcjo6RGVzY3JhbWJsZUluZm87Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CiAKIC8vIEkgd2FudCB0aGUgZXhwcmVzc2lvbiAieSIgZXZhbHVhdGVkIGV2ZW4gaWYgdmVyYm9zZSBsb2dnaW5nIGlzIG9mZi4KICNkZWZpbmUgTVlfTE9HVih4LCB5KSBcCkBAIC0yMDMsNiArMjA3LDcgQEAKICAgICBzcDxBTWVzc2FnZT4gbVNhbXBsZUFlc0tleUl0ZW07CiAgICAgc3A8SU1lbW9yeT4gbU1lbTsKICAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CisgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgbURlc2NyYW1ibGVyU3JjQnVmZmVyOwogICAgIHNwPEFCdWZmZXI+IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKICAgICBMaXN0PFN1YlNhbXBsZUluZm8+IG1TdWJTYW1wbGVzOwogICAgIHNwPElEZXNjcmFtYmxlcj4gbURlc2NyYW1ibGVyOwpAQCAtMjM1LDcgKzI0MCw3IEBACiAKICAgICAvLyBFbnN1cmUgaW50ZXJuYWwgYnVmZmVycyBjYW4gaG9sZCBzcGVjaWZpZWQgc2l6ZSwgYW5kIHdpbGwgcmUtYWxsb2NhdGUKICAgICAvLyBhcyBuZWVkZWQuCi0gICAgdm9pZCBlbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3Qgc2l6ZSk7CisgICAgYm9vbCBlbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3Qgc2l6ZSk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJlYW0pOwogfTsKQEAgLTgwNyw5ICs4MTIsOSBAQAogICAgIG1RdWV1ZSA9IE5VTEw7CiB9CiAKLXZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OmVuc3VyZUJ1ZmZlckNhcGFjaXR5KHNpemVfdCBuZWVkZWRTaXplKSB7Citib29sIEFUU1BhcnNlcjo6U3RyZWFtOjplbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3QgbmVlZGVkU2l6ZSkgewogICAgIGlmIChtQnVmZmVyICE9IE5VTEwgJiYgbUJ1ZmZlci0+Y2FwYWNpdHkoKSA+PSBuZWVkZWRTaXplKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgQUxPR1YoImVuc3VyZUJ1ZmZlckNhcGFjaXR5OiBjdXJyZW50IHNpemUgJXp1LCBuZXcgc2l6ZSAlenUsIHNjcmFtYmxlZCAlZCIsCkBAIC04MzcsNiArODQyLDI2IEBACiAgICAgICAgIG1NZW0gPSBuZXdNZW07CiAgICAgICAgIG1EZWFsZXIgPSBuZXdEZWFsZXI7CiAgICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlciA9IG5ld1NjcmFtYmxlZEJ1ZmZlcjsKKworICAgICAgICBzc2l6ZV90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbmV3TWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOworICAgICAgICBpZiAoaGVhcCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKCFuYXRpdmVIYW5kbGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBmYWlsZWQgdG8gY3JlYXRlIG5hdGl2ZSBoYW5kbGUiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlSGFuZGxlLT5kYXRhWzBdID0gaGVhcC0+Z2V0SGVhcElEKCk7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9IGhpZGxfbWVtb3J5KCJhc2htZW0iLAorICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKG5hdGl2ZUhhbmRsZSksIGhlYXAtPmdldFNpemUoKSk7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5vZmZzZXQgPSAodWludDY0X3QpIG9mZnNldDsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLnNpemUgPSAodWludDY0X3QpIHNpemU7CisKKyAgICAgICAgQUxPR0QoIltzdHJlYW0gJWRdIGNyZWF0ZWQgc2hhcmVkIGJ1ZmZlciBmb3IgZGVzY3JhbWJsaW5nLCBvZmZzZXQgJXpkLCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG9mZnNldCwgc2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQWxpZ24gdG8gbXVsdGlwbGVzIG9mIDY0Sy4KICAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwpAQCAtODUwLDYgKzg3NSw3IEBACiAgICAgICAgIG5ld0J1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgfQogICAgIG1CdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXR1c190IEFUU1BhcnNlcjo6U3RyZWFtOjpwYXJzZSgKQEAgLTkyMyw3ICs5NDksOSBAQAogICAgIH0KIAogICAgIHNpemVfdCBuZWVkZWRTaXplID0gbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gODsKLSAgICBlbnN1cmVCdWZmZXJDYXBhY2l0eShuZWVkZWRTaXplKTsKKyAgICBpZiAoIWVuc3VyZUJ1ZmZlckNhcGFjaXR5KG5lZWRlZFNpemUpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQogCiAgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnNpemUoKSwgYnItPmRhdGEoKSwgcGF5bG9hZFNpemVCaXRzIC8gOCk7CiAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gOCk7CkBAIC0xMzY1LDQ3ICsxMzkzLDU5IEBACiAgICAgICAgIG1lbWNweShtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIGRlc2NyYW1ibGVCeXRlcyk7CiAKLSAgICAgICAgc3A8QUJ1ZmZlcj4gc3ViU2FtcGxlcyA9IG5ldyBBQnVmZmVyKAotICAgICAgICAgICAgICAgIHNpemVvZihEZXNjcmFtYmxlclBsdWdpbjo6U3ViU2FtcGxlKSAqIGRlc2NyYW1ibGVTdWJTYW1wbGVzKTsKLQotICAgICAgICBEZXNjcmFtYmxlSW5mbyBpbmZvOwotICAgICAgICBpbmZvLmRzdFR5cGUgPSBEZXNjcmFtYmxlSW5mbzo6a0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlcjsKLSAgICAgICAgaW5mby5zY3JhbWJsaW5nQ29udHJvbCA9IChEZXNjcmFtYmxlclBsdWdpbjo6U2NyYW1ibGluZ0NvbnRyb2wpc2N0cmw7Ci0gICAgICAgIGluZm8ubnVtU3ViU2FtcGxlcyA9IGRlc2NyYW1ibGVTdWJTYW1wbGVzOwotICAgICAgICBpbmZvLnN1YlNhbXBsZXMgPSAoRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqKXN1YlNhbXBsZXMtPmRhdGEoKTsKLSAgICAgICAgaW5mby5zcmNNZW0gPSBtTWVtOwotICAgICAgICBpbmZvLnNyY09mZnNldCA9IDA7Ci0gICAgICAgIGluZm8uZHN0UHRyID0gTlVMTDsgLy8gaW4tcGxhY2UgZGVzY3JhbWJsaW5nIGludG8gc3JjTWVtCi0gICAgICAgIGluZm8uZHN0T2Zmc2V0ID0gMDsKKyAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBzdWJTYW1wbGVzOworICAgICAgICBzdWJTYW1wbGVzLnJlc2l6ZShkZXNjcmFtYmxlU3ViU2FtcGxlcyk7CiAKICAgICAgICAgaW50MzJfdCBpID0gMDsKICAgICAgICAgZm9yIChhdXRvIGl0ID0gbVN1YlNhbXBsZXMuYmVnaW4oKTsKICAgICAgICAgICAgICAgICBpdCAhPSBtU3ViU2FtcGxlcy5lbmQoKSAmJiBpIDwgZGVzY3JhbWJsZVN1YlNhbXBsZXM7IGl0KyssIGkrKykgewogICAgICAgICAgICAgaWYgKGl0LT50cmFuc3BvcnRfc2NyYW1ibGluZ19tb2RlICE9IDAgfHwgcGVzU2NyYW1ibGluZ0NvbnRyb2wgIT0gMCkgewotICAgICAgICAgICAgICAgIGluZm8uc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSA9IDA7Ci0gICAgICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGl0LT5zdWJTYW1wbGVTaXplOworICAgICAgICAgICAgICAgIHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IDA7CisgICAgICAgICAgICAgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGl0LT5zdWJTYW1wbGVTaXplOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKLSAgICAgICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gMDsKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZDbGVhckRhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHVpbnQ2NF90IHNyY09mZnNldCA9IDAsIGRzdE9mZnNldCA9IDA7CiAgICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgIGluZm8uc3JjT2Zmc2V0ID0gaW5mby5kc3RPZmZzZXQgPSBwZXNPZmZzZXQ7Ci0gICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbMF0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhIC09IHBlc09mZnNldDsKKyAgICAgICAgICAgIHNyY09mZnNldCA9IGRzdE9mZnNldCA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgLT0gcGVzT2Zmc2V0OwogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoaW5mbywgJnJlc3VsdCk7CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgICAgICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOworICAgICAgICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOwogCi0gICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgZmFpbGVkLCBleGNlcHRpb25Db2RlPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHN0YXR1cy5leGNlcHRpb25Db2RlKCkpOworICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkc3RCdWZmZXI7CisgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWTsKKyAgICAgICAgZHN0QnVmZmVyLm5vbnNlY3VyZU1lbW9yeSA9IG1EZXNjcmFtYmxlclNyY0J1ZmZlcjsKKworICAgICAgICBhdXRvIHJldHVyblZvaWQgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoCisgICAgICAgICAgICAgICAgKFNjcmFtYmxpbmdDb250cm9sKSBzY3RybCwKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlciwKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmJ5dGVzV3JpdHRlbiwgJmRldGFpbGVkRXJyb3JdICgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IF9ieXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIGJ5dGVzV3JpdHRlbik7CiAgICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggMzc0ZTAxMS4uNDFjMTljZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yOSwxMSArMjksMTMgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzOwotY2xhc3MgSURlc2NyYW1ibGVyOwotfTsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FzIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJQ2FzOworfX19Cit1c2luZyBoYXJkd2FyZTo6Y2FzOjpWMV8wOjpJQ2FzOworCiBjbGFzcyBBQml0UmVhZGVyOwogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAppbmRleCA5NmViNWJmLi4yMTI1OWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCkBAIC0zNSw1ICszNSw4IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmNwcAppbmRleCAwNDdiMWIzLi45ZmY0NTIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5jcHAKQEAgLTE4LDE1ICsxOCwxOSBAQAogI2RlZmluZSBMT0dfVEFHICJDYXNNYW5hZ2VyIgogI2luY2x1ZGUgIkNhc01hbmFnZXIuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzLzEuMC9JQ2FzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvMS4wL0lNZWRpYUNhc1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgYmluZGVyOjpTdGF0dXM7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CiAKIHN0cnVjdCBBVFNQYXJzZXI6OkNhc01hbmFnZXI6OlByb2dyYW1DYXNNYW5hZ2VyIDogcHVibGljIFJlZkJhc2UgewogICAgIFByb2dyYW1DYXNNYW5hZ2VyKHVuc2lnbmVkIHByb2dyYW1OdW1iZXIsIGNvbnN0IENBRGVzY3JpcHRvciAmZGVzY3JpcHRvcik7CkBAIC0xMjUsNDUgKzEyOSw2MCBAQAogICAgICAgICAgY29uc3Qgc3A8SUNhcz4mIGNhcywKICAgICAgICAgIFBpZFRvU2Vzc2lvbk1hcCAmc2Vzc2lvbk1hcCwKICAgICAgICAgIENhc1Nlc3Npb24gKnNlc3Npb24pIHsKLSAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgc3A8SUJpbmRlcj4gY2FzU2VydmljZUJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYXMiKSk7Ci0gICAgc3A8SU1lZGlhQ2FzU2VydmljZT4gY2FzU2VydmljZSA9Ci0gICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFDYXNTZXJ2aWNlPihjYXNTZXJ2aWNlQmluZGVyKTsKLQorICAgIHNwPElNZWRpYUNhc1NlcnZpY2U+IGNhc1NlcnZpY2UgPSBJTWVkaWFDYXNTZXJ2aWNlOjpnZXRTZXJ2aWNlKCJkZWZhdWx0Iik7CiAgICAgaWYgKGNhc1NlcnZpY2UgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiQ2Fubm90IG9idGFpbiBJTWVkaWFDYXNTZXJ2aWNlIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAorICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgc3A8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcjsKKyAgICBzcDxJRGVzY3JhbWJsZXJCYXNlPiBkZXNjcmFtYmxlckJhc2U7CisgICAgUmV0dXJuPFN0YXR1cz4gcmV0dXJuU3RhdHVzKFN0YXR1czo6T0spOworICAgIFJldHVybjxzcDxJRGVzY3JhbWJsZXJCYXNlPiA+IHJldHVybkRlc2NyYW1ibGVyKE5VTEwpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKICAgICBjb25zdCBDQURlc2NyaXB0b3IgJmRlc2NyaXB0b3IgPSBzZXNzaW9uLT5tQ0FEZXNjcmlwdG9yOwogCi0gICAgU3RhdHVzIHN0YXR1cyA9IGNhcy0+b3BlblNlc3Npb24oJnNlc3Npb25JZCk7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBzZXNzaW9uOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIGF1dG8gcmV0dXJuVm9pZCA9IGNhcy0+b3BlblNlc3Npb24oCisgICAgICAgICAgICBbJnN0YXR1cywgJnNlc3Npb25JZF0gKFN0YXR1cyBfc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgX3Nlc3Npb25JZCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gX3Nlc3Npb25JZDsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHNlc3Npb246IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMpOwogICAgICAgICBnb3RvIGxfZmFpbDsKICAgICB9CiAKLSAgICBjYXMtPnNldFNlc3Npb25Qcml2YXRlRGF0YShzZXNzaW9uSWQsIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgcHJpdmF0ZSBkYXRhOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIHJldHVyblN0YXR1cyA9IGNhcy0+c2V0U2Vzc2lvblByaXZhdGVEYXRhKHNlc3Npb25JZCwgZGVzY3JpcHRvci5tUHJpdmF0ZURhdGEpOworICAgIGlmICghcmV0dXJuU3RhdHVzLmlzT2soKSB8fCByZXR1cm5TdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwcml2YXRlIGRhdGE6IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCksIChTdGF0dXMpcmV0dXJuU3RhdHVzKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCi0gICAgc3RhdHVzID0gY2FzU2VydmljZS0+Y3JlYXRlRGVzY3JhbWJsZXIoZGVzY3JpcHRvci5tU3lzdGVtSUQsICZkZXNjcmFtYmxlcik7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpIHx8IGRlc2NyYW1ibGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGVzY3JhbWJsZXI6IDogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICByZXR1cm5EZXNjcmFtYmxlciA9IGNhc1NlcnZpY2UtPmNyZWF0ZURlc2NyYW1ibGVyKGRlc2NyaXB0b3IubVN5c3RlbUlEKTsKKyAgICBpZiAoIXJldHVybkRlc2NyYW1ibGVyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkZXNjcmFtYmxlcjogdHJhbnM9JXMiLAorICAgICAgICAgICAgICAgIHJldHVybkRlc2NyYW1ibGVyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIGdvdG8gbF9mYWlsOworICAgIH0KKyAgICBkZXNjcmFtYmxlckJhc2UgPSAoc3A8SURlc2NyYW1ibGVyQmFzZT4pIHJldHVybkRlc2NyYW1ibGVyOworICAgIGlmIChkZXNjcmFtYmxlckJhc2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkZXNjcmFtYmxlcjogbnVsbCBwdHIiKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCi0gICAgc3RhdHVzID0gZGVzY3JhbWJsZXItPnNldE1lZGlhQ2FzU2Vzc2lvbihzZXNzaW9uSWQpOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZGVzY3JhbWJsZXI6IDogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICByZXR1cm5TdGF0dXMgPSBkZXNjcmFtYmxlckJhc2UtPnNldE1lZGlhQ2FzU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIGlmICghcmV0dXJuU3RhdHVzLmlzT2soKSB8fCAoU3RhdHVzKSByZXR1cm5TdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZGVzY3JhbWJsZXI6IDogdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgcmV0dXJuU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgKFN0YXR1cykgcmV0dXJuU3RhdHVzKTsKKyAgICAgICAgZ290byBsX2ZhaWw7CisgICAgfQorCisgICAgZGVzY3JhbWJsZXIgPSBJRGVzY3JhbWJsZXI6OmNhc3RGcm9tKGRlc2NyYW1ibGVyQmFzZSk7CisgICAgaWYgKGRlc2NyYW1ibGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjYXN0IGZyb20gSURlc2NyYW1ibGVyQmFzZSB0byBJRGVzY3JhbWJsZXIiKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCkBAIC0xNzcsOCArMTk2LDggQEAKICAgICBpZiAoIXNlc3Npb25JZC5lbXB0eSgpKSB7CiAgICAgICAgIGNhcy0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgfQotICAgIGlmIChkZXNjcmFtYmxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlc2NyYW1ibGVyLT5yZWxlYXNlKCk7CisgICAgaWYgKGRlc2NyYW1ibGVyQmFzZSAhPSBOVUxMKSB7CisgICAgICAgIGRlc2NyYW1ibGVyQmFzZS0+cmVsZWFzZSgpOwogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKIH0KQEAgLTMxNiwxMSArMzM1LDEyIEBACiAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIE1lZGlhQ2FzOjpQYXJjZWxhYmxlQ2FzRGF0YSBlY20oYnItPmRhdGEoKSwgYnItPm51bUJpdHNMZWZ0KCkgLyA4KTsKLSAgICBTdGF0dXMgc3RhdHVzID0gbUlDYXMtPnByb2Nlc3NFY20obUNBUGlkVG9TZXNzaW9uSWRNYXBbaW5kZXhdLCBlY20pOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHByb2Nlc3MgRUNNOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGVjbTsKKyAgICBlY20uc2V0VG9FeHRlcm5hbCgodWludDhfdCopYnItPmRhdGEoKSwgYnItPm51bUJpdHNMZWZ0KCkgLyA4KTsKKyAgICBhdXRvIHJldHVyblN0YXR1cyA9IG1JQ2FzLT5wcm9jZXNzRWNtKG1DQVBpZFRvU2Vzc2lvbklkTWFwW2luZGV4XSwgZWNtKTsKKyAgICBpZiAoIXJldHVyblN0YXR1cy5pc09rKCkgfHwgKFN0YXR1cykgcmV0dXJuU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwcm9jZXNzIEVDTTogdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgcmV0dXJuU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgKFN0YXR1cykgcmV0dXJuU3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7IC8vIGhhbmRsZWQKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKaW5kZXggODA4OGRlYy4uODFmNjU0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKQEAgLTIxLDEwICsyMSwxMyBAQAogI2luY2x1ZGUgPHNldD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci1jbGFzcyBJRGVzY3JhbWJsZXI7Ci19CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhcyB7CituYW1lc3BhY2UgbmF0aXZlIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJRGVzY3JhbWJsZXI7Cit9fX19Cit1c2luZyBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OklEZXNjcmFtYmxlcjsKIAogc3RydWN0IEFUU1BhcnNlcjo6Q2FzTWFuYWdlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBDYXNNYW5hZ2VyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAppbmRleCBjM2YxMjc0Li45ZDY4NGUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTM4LDggKzM4LDEzIEBACiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgIkFUU1BhcnNlci5oIgogCisjaW5jbHVkZSA8aGlkbC9IeWJyaWRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy8xLjAvSUNhcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGhhcmR3YXJlOjpjYXM6OlYxXzA6OklDYXM7CisKIHN0YXRpYyBjb25zdCBzaXplX3Qga1RTUGFja2V0U2l6ZSA9IDE4ODsKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmVhZFNpemUgPSAyNTAwMDBMTDsKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmV0cnkgPSA2OwpAQCAtMTU2LDcgKzE2MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQsIG1pbWUpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJmNhcykgeworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgeworICAgIEhhbFRva2VuIGhhbFRva2VuOworICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QqKWNhc1Rva2VuLmRhdGEoKSwgY2FzVG9rZW4uc2l6ZSgpKTsKKyAgICBzcDxJQ2FzPiBjYXMgPSBJQ2FzOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOwogICAgIEFMT0dEKCJzZXRNZWRpYUNhczogJXAiLCBjYXMuZ2V0KCkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+c2V0TWVkaWFDYXMoY2FzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKaW5kZXggMjJkN2QyNy4uYzZmYTRhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKQEAgLTI0Niw2ICsyNDYsMTUgQEAKICAgICB2aXJ0dWFsIH5DYWxsYmFja0Rpc3BhdGNoZXIoKTsKIAogcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBmcmFtZV9yZW5kZXJlZCBtZXNzYWdlIGJhdGNoaW5nLCB3aGljaCB3aWxsIGV2ZW50dWFsbHkgZW5kIHVwIGluIGEKKyAgICAgICAgLy8gc2luZ2xlIEFNZXNzYWdlIGluIE1lZGlhQ29kZWMgd2hlbiBpdCBpcyBzaWduYWxlZCB0byB0aGUgYXBwLiBBTWVzc2FnZSBjYW4gY29udGFpbgorICAgICAgICAvLyB1cC10byA2NCBrZXktdmFsdWUgcGFpcnMsIGFuZCBlYWNoIGZyYW1lX3JlbmRlcmVkIG1lc3NhZ2UgdXNlcyAyIGtleXMsIHNvIHRoZSBtYXgKKyAgICAgICAgLy8gdmFsdWUgZm9yIHRoaXMgd291bGQgYmUgMzIuIE5vbmV0aGVsZXNzLCBsaW1pdCB0aGlzIHRvIDEyIHRvIHdoaWNoIGdpdmVzIGF0IGxlYXN0IDEwCisgICAgICAgIC8vIG1zZWNvbmRzIG9mIGJhdGNoaW5nIGF0IDEyMEh6LgorICAgICAgICBrTWF4UXVldWVTaXplID0gMTIsCisgICAgfTsKKwogICAgIE11dGV4IG1Mb2NrOwogCiAgICAgc3A8T01YTm9kZUluc3RhbmNlPiBjb25zdCBtT3duZXI7CkBAIC0yOTAsNyArMjk5LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgbVF1ZXVlLnB1c2hfYmFjayhtc2cpOwotICAgIGlmIChyZWFsVGltZSkgeworICAgIGlmIChyZWFsVGltZSB8fCBtUXVldWUuc2l6ZSgpID49IGtNYXhRdWV1ZVNpemUpIHsKICAgICAgICAgbVF1ZXVlQ2hhbmdlZC5zaWduYWwoKTsKICAgICB9CiB9CkBAIC0yMTY4LDggKzIxNzcsOCBAQAogICAgICAgICAgICAgbXNnLmZlbmNlRmQgPSAtMTsKICAgICAgICAgICAgIG1zZy51LnJlbmRlcl9kYXRhLnRpbWVzdGFtcCA9IHJlbmRlckRhdGFbaV0ubk1lZGlhVGltZVVzOwogICAgICAgICAgICAgbXNnLnUucmVuZGVyX2RhdGEubmFub1RpbWUgPSByZW5kZXJEYXRhW2ldLm5TeXN0ZW1UaW1lTnM7Ci0KLSAgICAgICAgICAgIGluc3RhbmNlLT5tRGlzcGF0Y2hlci0+cG9zdChtc2csIGZhbHNlIC8qIHJlYWxUaW1lICovKTsKKyAgICAgICAgICAgIGJvb2wgcmVhbFRpbWUgPSBtc2cudS5yZW5kZXJfZGF0YS50aW1lc3RhbXAgPT0gSU5UNjRfTUFYOworICAgICAgICAgICAgaW5zdGFuY2UtPm1EaXNwYXRjaGVyLT5wb3N0KG1zZywgcmVhbFRpbWUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAppbmRleCBmY2NiMTJiLi4wYmM2NWUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCkBAIC04NSw3ICs4NSwyMSBAQAogICAgICAgICBsaWJOYW1lLmFwcGVuZChrQ29tcG9uZW50c1tpXS5tTGliTmFtZVN1ZmZpeCk7CiAgICAgICAgIGxpYk5hbWUuYXBwZW5kKCIuc28iKTsKIAotICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliTmFtZS5jX3N0cigpLCBSVExEX05PVyk7CisgICAgICAgIC8vIFJUTERfTk9ERUxFVEUgbWVhbnMgd2Uga2VlcCB0aGUgc2hhcmVkIGxpYnJhcnkgYXJvdW5kIGZvcmV2ZXIuCisgICAgICAgIC8vIHRoaXMgZWxpbWluYXRlcyB0aHJhc2hpbmcgZHVyaW5nIHNlcXVlbmNlcyBsaWtlIGxvYWRpbmcgc291bmRwb29scy4KKyAgICAgICAgLy8gSXQgYWxzbyBsZWF2ZXMgdGhlIHJlc3Qgb2YgdGhlIGxvZ2ljIGFyb3VuZCB0aGUgZGxvcGVuKCkvZGxjbG9zZSgpCisgICAgICAgIC8vIGNhbGxzIGluIHRoaXMgZmlsZSB1bmNoYW5nZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEltcGxpY2F0aW9ucyBvZiB0aGUgY2hhbmdlOgorICAgICAgICAvLyAtLSB0aGUgY29kZWMgcHJvY2VzcyAod2hlcmUgdGhpcyBoYXBwZW5zKSB3aWxsIGhhdmUgYSBzbGlnaHRseSBsYXJnZXIKKyAgICAgICAgLy8gICAgbG9uZy10ZXJtIG1lbW9yeSBmb290cHJpbnQgYXMgaXQgYWNjdW11bGF0ZXMgdGhlIGxvYWRlZCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgICAvLyAgICBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeS4KKyAgICAgICAgLy8gLS0gcGx1Z2luIGNvZGVjcyBjYW4gbm8gbG9uZ2VyIChhbmQgbmV2ZXIgc2hvdWxkIGhhdmUpIGRlcGVuZCBvbiBhCisgICAgICAgIC8vICAgIGZyZWUgcmVzZXQgb2YgYW55IHN0YXRpYyBkYXRhIGFzIHRoZSBsaWJyYXJ5IHdvdWxkIGhhdmUgY3Jvc3NlZAorICAgICAgICAvLyAgICBhIGRsY2xvc2UvZGxvcGVuIGN5Y2xlLgorICAgICAgICAvLworCisgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJOYW1lLmNfc3RyKCksIFJUTERfTk9XfFJUTERfTk9ERUxFVEUpOwogCiAgICAgICAgIGlmIChsaWJIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoInVuYWJsZSB0byBkbG9wZW4gJXM6ICVzIiwgbGliTmFtZS5jX3N0cigpLCBkbGVycm9yKCkpOwpkaWZmIC0tZ2l0IGEvcmFkaW8vQW5kcm9pZC5icCBiL3JhZGlvL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNjE0ZjIuLjAwMDAwMDAKLS0tIGEvcmFkaW8vQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGlicmFkaW8iLAotCi0gICAgc3JjczogWwotICAgICAgICAiUmFkaW8uY3BwIiwKLSAgICAgICAgIklSYWRpby5jcHAiLAotICAgICAgICAiSVJhZGlvQ2xpZW50LmNwcCIsCi0gICAgICAgICJJUmFkaW9TZXJ2aWNlLmNwcCIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJyYWRpb19tZXRhZGF0YSIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV2FsbCIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL3JhZGlvL0lSYWRpby5jcHAgYi9yYWRpby9JUmFkaW8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmYzYjY4Li4wMDAwMDAwCi0tLSBhL3JhZGlvL0lSYWRpby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJJUmFkaW8iCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL1JhZGlvTWV0YWRhdGFXcmFwcGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgREVUQUNIID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBTRVRfQ09ORklHVVJBVElPTiwKLSAgICBHRVRfQ09ORklHVVJBVElPTiwKLSAgICBTRVRfTVVURSwKLSAgICBHRVRfTVVURSwKLSAgICBTQ0FOLAotICAgIFNURVAsCi0gICAgVFVORSwKLSAgICBDQU5DRUwsCi0gICAgR0VUX1BST0dSQU1fSU5GT1JNQVRJT04sCi0gICAgSEFTX0NPTlRST0wKLX07Ci0KLWNsYXNzIEJwUmFkaW86IHB1YmxpYyBCcEludGVyZmFjZTxJUmFkaW8+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBSYWRpbyhjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJUmFkaW8+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgZGV0YWNoKCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJkZXRhY2giKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREVUQUNILCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQ09ORklHVVJBVElPTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT05GSUdVUkFUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHkucmVhZChjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtdXRlID8gMSA6IDApOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01VVEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAobXV0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTVVURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGludDMyX3QgbXV0ZXJlYWQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICAqbXV0ZSA9IG11dGVyZWFkICE9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZGlyZWN0aW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNraXBTdWJDaGFubmVsID8gMSA6IDApOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0NBTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGRpcmVjdGlvbik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihza2lwU3ViQ2hhbm5lbCA/IDEgOiAwKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNURVAsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVuZSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBzdWJDaGFubmVsKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKGNoYW5uZWwpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKHN1YkNoYW5uZWwpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVFVORSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWwoKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ0FOQ0VMLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAoaW5mbyA9PSBudWxscHRyIHx8IGluZm8tPm1ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmFkaW9fbWV0YWRhdGFfdCAqbWV0YWRhdGEgPSBpbmZvLT5tZXRhZGF0YTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUk9HUkFNX0lORk9STUFUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHkucmVhZChpbmZvLCBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbykpOwotICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgbG9jYWwgbWV0YWRhdGEgcG9pbnRlcgotICAgICAgICAgICAgICAgIGluZm8tPm1ldGFkYXRhID0gbWV0YWRhdGE7Ci0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBtZXRhZGF0YVNpemUgPSByZXBseS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX3QgKm5ld01ldGFkYXRhID0gKHJhZGlvX21ldGFkYXRhX3QgKiltYWxsb2MobWV0YWRhdGFTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01ldGFkYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVwbHkucmVhZChuZXdNZXRhZGF0YSwgbWV0YWRhdGFTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcmFkaW9fbWV0YWRhdGFfYWRkX21ldGFkYXRhKCZpbmZvLT5tZXRhZGF0YSwgbmV3TWV0YWRhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKG5ld01ldGFkYXRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgaWYgKGhhc0NvbnRyb2wgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSEFTX0NPTlRST0wsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAqaGFzQ29udHJvbCA9IHJlcGx5LnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoUmFkaW8sICJhbmRyb2lkLmhhcmR3YXJlLklSYWRpbyIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuUmFkaW86Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIERFVEFDSDogewotICAgICAgICAgICAgQUxPR1YoIkRFVEFDSCIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgZGV0YWNoKCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX0NPTkZJR1VSQVRJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyBjb25maWc7Ci0gICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0Q29uZmlndXJhdGlvbigmY29uZmlnKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBHRVRfQ09ORklHVVJBVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnIGNvbmZpZzsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldENvbmZpZ3VyYXRpb24oJmNvbmZpZyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTRVRfTVVURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vbCBtdXRlID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0TXV0ZShtdXRlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBHRVRfTVVURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vbCBtdXRlOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TXV0ZSgmbXV0ZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG11dGUgPyAxIDogMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTQ0FOOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSAocmFkaW9fZGlyZWN0aW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJvb2wgc2tpcFN1YkNoYW5uZWwgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzY2FuKGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNURVA6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IChyYWRpb19kaXJlY3Rpb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYm9vbCBza2lwU3ViQ2hhbm5lbCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0ZXAoZGlyZWN0aW9uLCBza2lwU3ViQ2hhbm5lbCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVFVORTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbCA9IGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3Qgc3ViQ2hhbm5lbCA9IGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDQU5DRUw6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNhbmNlbCgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9QUk9HUkFNX0lORk9STUFUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvIGluZm87Ci0gICAgICAgICAgICBSYWRpb01ldGFkYXRhV3JhcHBlciBtZXRhZGF0YVdyYXBwZXIoJmluZm8ubWV0YWRhdGEpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQcm9ncmFtSW5mb3JtYXRpb24oJmluZm8pOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmluZm8sIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJhZGlvX21ldGFkYXRhX2dldF9jb3VudChpbmZvLm1ldGFkYXRhKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSByYWRpb19tZXRhZGF0YV9nZXRfc2l6ZShpbmZvLm1ldGFkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKCh1aW50MzJfdClzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKGluZm8ubWV0YWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMigwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBIQVNfQ09OVFJPTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vbCBjb250cm9sOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFzQ29udHJvbCgmY29udHJvbCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvbnRyb2wgPyAxIDogMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9JUmFkaW9DbGllbnQuY3BwIGIvcmFkaW8vSVJhZGlvQ2xpZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyMTk0OS4uMDAwMDAwMAotLS0gYS9yYWRpby9JUmFkaW9DbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBPTl9FVkVOVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi19OwotCi1jbGFzcyBCcFJhZGlvQ2xpZW50OiBwdWJsaWMgQnBJbnRlcmZhY2U8SVJhZGlvQ2xpZW50PgotewotCi1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBSYWRpb0NsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJUmFkaW9DbGllbnQ+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpb0NsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihldmVudE1lbW9yeSkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fRVZFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoUmFkaW9DbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuSVJhZGlvQ2xpZW50Iik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5SYWRpb0NsaWVudDo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgT05fRVZFTlQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW9DbGllbnQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oCi0gICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgb25FdmVudChldmVudE1lbW9yeSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0gICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3JhZGlvL0lSYWRpb1NlcnZpY2UuY3BwIGIvcmFkaW8vSVJhZGlvU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTNhNjEuLjAwMDAwMDAKLS0tIGEvcmFkaW8vSVJhZGlvU2VydmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJCcFJhZGlvU2VydmljZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvU2VydmljZS5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gewotICAgIExJU1RfTU9EVUxFUyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgQVRUQUNILAotfTsKLQotI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNAotCi1jbGFzcyBCcFJhZGlvU2VydmljZTogcHVibGljIEJwSW50ZXJmYWNlPElSYWRpb1NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBSYWRpb1NlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SVJhZGlvU2VydmljZT4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQotICAgIHsKLSAgICAgICAgaWYgKG51bU1vZHVsZXMgPT0gTlVMTCB8fCAoKm51bU1vZHVsZXMgIT0gMCAmJiBwcm9wZXJ0aWVzID09IE5VTEwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHVpbnQzMl90IG51bU1vZHVsZXNSZXEgPSAocHJvcGVydGllcyA9PSBOVUxMKSA/IDAgOiAqbnVtTW9kdWxlczsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG51bU1vZHVsZXNSZXEpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9NT0RVTEVTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAqbnVtTW9kdWxlcyA9ICh1aW50MzJfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigibGlzdE1vZHVsZXMoKSBzdGF0dXMgJWQgZ290ICpudW1Nb2R1bGVzICVkIiwgc3RhdHVzLCAqbnVtTW9kdWxlcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gKm51bU1vZHVsZXMpIHsKLSAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxID0gKm51bU1vZHVsZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXBseS5yZWFkKHByb3BlcnRpZXMsIG51bU1vZHVsZXNSZXEgKiBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFuZGxlKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKLSAgICAgICAgQUxPR1YoImF0dGFjaCgpIGNvbmZpZyAlcCB3aXRoQXVkaW8gJWQgcmVnaW9uICVkIHR5cGUgJWQiLAotICAgICAgICAgICAgICBjb25maWcgPT0gTlVMTCA/IDAgOiBjb25maWcsIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgY29uZmlnID09IE5VTEwgPyAwIDogY29uZmlnLT5yZWdpb24sCi0gICAgICAgICAgICAgIGNvbmZpZyA9PSBOVUxMID8gMCA6IGNvbmZpZy0+YmFuZC50eXBlKTsKLSAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih3aXRoQXVkaW8gPyAxIDogMCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBVFRBQ0gsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7Ci0gICAgICAgICAgICByYWRpbyA9IGludGVyZmFjZV9jYXN0PElSYWRpbz4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSYWRpb1NlcnZpY2UsICJhbmRyb2lkLmhhcmR3YXJlLklSYWRpb1NlcnZpY2UiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCblJhZGlvU2VydmljZTo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgTElTVF9NT0RVTEVTOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3QgbnVtTW9kdWxlc1JlcSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgewotICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBudW1Nb2R1bGVzID0gbnVtTW9kdWxlc1JlcTsKLSAgICAgICAgICAgIHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzID0KLSAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICopY2FsbG9jKG51bU1vZHVsZXNSZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMpKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdE1vZHVsZXMocHJvcGVydGllcywgJm51bU1vZHVsZXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bU1vZHVsZXMpOwotICAgICAgICAgICAgQUxPR1YoIkxJU1RfTU9EVUxFUyBzdGF0dXMgJWQgZ290IG51bU1vZHVsZXMgJWQiLCBzdGF0dXMsIG51bU1vZHVsZXMpOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiBudW1Nb2R1bGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSBudW1Nb2R1bGVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUocHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSAqIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEFUVEFDSDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpb1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJhZGlvX2hhbmRsZV90IGhhbmRsZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzcDxJUmFkaW9DbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElSYWRpb0NsaWVudD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnIGNvbmZpZzsKLSAgICAgICAgICAgIHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnUHRyID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKLSAgICAgICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOwotICAgICAgICAgICAgICAgIGNvbmZpZ1B0ciA9ICZjb25maWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIHdpdGhBdWRpbyA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKLSAgICAgICAgICAgIEFMT0dWKCJBVFRBQ0ggY29uZmlnUHRyICVwIHdpdGhBdWRpbyAlZCIsIGNvbmZpZ1B0ciwgd2l0aEF1ZGlvKTsKLSAgICAgICAgICAgIHNwPElSYWRpbz4gcmFkaW87Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRhY2goaGFuZGxlLCBjbGllbnQsIGNvbmZpZ1B0ciwgd2l0aEF1ZGlvLCByYWRpbyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHJhZGlvICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIocmFkaW8pKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvcmFkaW8vT1dORVJTIGIvcmFkaW8vT1dORVJTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM4YTM1Li4wMDAwMDAwCi0tLSBhL3JhZGlvL09XTkVSUworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZWxhdXJlbnRAZ29vZ2xlLmNvbQotdHdhc2lsY3p5a0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9yYWRpby9SYWRpby5jcHAgYi9yYWRpby9SYWRpby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZGQyMjEuLjAwMDAwMDAKLS0tIGEvcmFkaW8vUmFkaW8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IChDKSAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotCi0jaW5jbHVkZSA8cmFkaW8vUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8cmFkaW8vUmFkaW9DYWxsYmFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0gICAgc3A8SVJhZGlvU2VydmljZT4gICAgICAgICAgZ1JhZGlvU2VydmljZTsKLSAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICBrUmFkaW9TZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCi0gICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAga1JhZGlvU2VydmljZU5hbWUgICAgICA9ICJtZWRpYS5yYWRpbyI7Ci0gICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgZ0xvY2s7Ci0KLSAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgRGVhdGhOb3RpZmllcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJiaW5kZXJEaWVkIik7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwotICAgICAgICAgICAgZ1JhZGlvU2VydmljZS5jbGVhcigpOwotICAgICAgICAgICAgQUxPR1coIlJhZGlvIHNlcnZpY2UgZGllZCEiKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzcDxEZWF0aE5vdGlmaWVyPiAgICAgICAgIGdEZWF0aE5vdGlmaWVyOwotfTsgLy8gbmFtZXNwYWNlIGFub255bW91cwotCi1jb25zdCBzcDxJUmFkaW9TZXJ2aWNlPiBSYWRpbzo6Z2V0UmFkaW9TZXJ2aWNlKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwotICAgIGlmIChnUmFkaW9TZXJ2aWNlLmdldCgpID09IDApIHsKLSAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KGtSYWRpb1NlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dXKCJSYWRpb1NlcnZpY2Ugbm90IHB1Ymxpc2hlZCwgd2FpdGluZy4uLiIpOwotICAgICAgICAgICAgdXNsZWVwKGtSYWRpb1NlcnZpY2VQb2xsRGVsYXkpOwotICAgICAgICB9IHdoaWxlKHRydWUpOwotICAgICAgICBpZiAoZ0RlYXRoTm90aWZpZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgZ0RlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcigpOwotICAgICAgICB9Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZ0RlYXRoTm90aWZpZXIpOwotICAgICAgICBnUmFkaW9TZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvU2VydmljZT4oYmluZGVyKTsKLSAgICB9Ci0gICAgQUxPR0VfSUYoZ1JhZGlvU2VydmljZSA9PSAwLCAibm8gUmFkaW9TZXJ2aWNlIT8iKTsKLSAgICByZXR1cm4gZ1JhZGlvU2VydmljZTsKLX0KLQotLy8gU3RhdGljIG1ldGhvZHMKLXN0YXR1c190IFJhZGlvOjpsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKLXsKLSAgICBBTE9HVigibGlzdE1vZHVsZXMoKSIpOwotICAgIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRSYWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZS0+bGlzdE1vZHVsZXMocHJvcGVydGllcywgbnVtTW9kdWxlcyk7Ci19Ci0KLXNwPFJhZGlvPiBSYWRpbzo6YXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYgY2FsbGJhY2spCi17Ci0gICAgQUxPR1YoImF0dGFjaCgpIik7Ci0gICAgc3A8UmFkaW8+IHJhZGlvOwotICAgIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRSYWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByYWRpbzsKLSAgICB9Ci0gICAgcmFkaW8gPSBuZXcgUmFkaW8oaGFuZGxlLCBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VydmljZS0+YXR0YWNoKGhhbmRsZSwgcmFkaW8sIGNvbmZpZywgd2l0aEF1ZGlvLCByYWRpby0+bUlSYWRpbyk7Ci0KLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJhZGlvLT5tSVJhZGlvICE9IDApIHsKLSAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIocmFkaW8tPm1JUmFkaW8pLT5saW5rVG9EZWF0aChyYWRpbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gcmFkaW8gc2VydmljZSIsIHN0YXR1cyk7Ci0gICAgICAgIHJhZGlvLmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiByYWRpbzsKLX0KLQotCi0KLS8vIFJhZGlvCi1SYWRpbzo6UmFkaW8ocmFkaW9faGFuZGxlX3QgLypoYW5kbGUqLywgY29uc3Qgc3A8UmFkaW9DYWxsYmFjaz4mIGNhbGxiYWNrKQotICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKQotewotfQotCi1SYWRpbzo6flJhZGlvKCkKLXsKLSAgICBpZiAobUlSYWRpbyAhPSAwKSB7Ci0gICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOwotICAgIH0KLX0KLQotCi12b2lkIFJhZGlvOjpkZXRhY2goKSB7Ci0gICAgQUxPR1YoImRldGFjaCgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBpZiAobUlSYWRpbyAhPSAwKSB7Ci0gICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOwotICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtSVJhZGlvKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgbUlSYWRpbyA9IDA7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBSYWRpbzo6c2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5zZXRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPmdldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnNldE11dGUoYm9vbCBtdXRlKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNldE11dGUobXV0ZSk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRNdXRlKGJvb2wgKm11dGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Z2V0TXV0ZShtdXRlKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJjaGFubmVsKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNjYW4oZGlyZWN0aW9uLCBza2lwU3ViY2hhbm5lbCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViY2hhbm5lbCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5zdGVwKGRpcmVjdGlvbiwgc2tpcFN1YmNoYW5uZWwpOwotfQotCi1zdGF0dXNfdCBSYWRpbzo6dHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+dHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OmNhbmNlbCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Y2FuY2VsKCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5nZXRQcm9ncmFtSW5mb3JtYXRpb24oaW5mbyk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+aGFzQ29udHJvbChoYXNDb250cm9sKTsKLX0KLQotCi0vLyBCcFJhZGlvQ2xpZW50Ci12b2lkIFJhZGlvOjpvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhlIGV2ZW50IGxheW91dCBpbiBzaGFyZWQgbWVtb3J5IGlzOgotICAgIC8vIHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpIGJ5dGVzIDogdGhlIGV2ZW50IGl0c2VsZgotICAgIC8vIDQgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWV0YWRhdGEgc2l6ZSBvciAwCi0gICAgLy8gTiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YSBpZiBwcmVzZW50Ci0gICAgc3RydWN0IHJhZGlvX2V2ZW50ICpldmVudCA9IChzdHJ1Y3QgcmFkaW9fZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhT2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgKyBzaXplb2YodWludDMyX3QpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9ICoodWludDMyX3QgKikoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0IC0gc2l6ZW9mKHVpbnQzMl90KSk7Ci0KLSAgICAvLyByZXN0b3JlIGxvY2FsIG1ldGFkYXRhIHBvaW50ZXIgZnJvbSBvZmZzZXQKLSAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChyYWRpb19tZXRhZGF0YV90ICopKCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9NRVRBREFUQToKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBldmVudC0+bWV0YWRhdGEgPQotICAgICAgICAgICAgICAgICAgICAocmFkaW9fbWV0YWRhdGFfdCAqKSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXZlbnQtPm1ldGFkYXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgbUNhbGxiYWNrLT5vbkV2ZW50KGV2ZW50KTsKLSAgICB9Ci19Ci0KLQotLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAotdm9pZCBSYWRpbzo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBTE9HVygiUmFkaW8gc2VydmVyIGJpbmRlciBEaWVkICIpOwotICAgIG1JUmFkaW8gPSAwOwotICAgIHN0cnVjdCByYWRpb19ldmVudCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX1NFUlZFUl9ESUVEOwotICAgIGV2ZW50LnN0YXR1cyA9IERFQURfT0JKRUNUOwotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoJmV2ZW50KTsKLSAgICB9Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IGM0ZjFhZjMuLmMxMGZhMDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC0xMzgsNyArMTM4LDggQEAKIAogdm9pZCBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UoKQogewotICAgIExPR19ISVNUX0ZMVVNIKCk7CisgICAgLy8gbG9nIHRoYXQgYXVkaW8gd2FzIHR1cm5lZCBvbi9vZmYKKyAgICBMT0dfQVVESU9fU1RBVEUoKTsKICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBwcmV2aW91cyA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtUHJldmlvdXM7CiAgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKaW5kZXggMmEyN2RmZC4uMzY2YTE2NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TW1hcFRyYWNrKCk7CiAKQEAgLTM5LDcgKzQwLDcgQEAKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgICBzdGF0aWMgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIE1tYXBUaHJlYWQ7CkBAIC01NSw1ICs1Niw2IEBACiAgICAgdmlydHVhbCBpbnQ2NF90IGZyYW1lc1JlbGVhc2VkKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIG9uVGltZXN0YW1wKGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApOwogCisgICAgcGlkX3QgbVBpZDsKIH07ICAvLyBlbmQgb2YgVHJhY2sKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzZTRkMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKQEAgLTAsMCArMSwzIEBACitodW5nYUBnb29nbGUuY29tCitqbXRyaXZpQGdvb2dsZS5jb20KK21uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAppbmRleCBkN2MwNzI4Li4yN2M2ZDM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCkBAIC00NzQsNiArNDc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOwogICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKQEAgLTQ5NCw2ICs0OTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmJ1ZmZlclNpemUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKaW5kZXggM2YxYTBjMC4uMWMxYTk4OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKQEAgLTMwLDYgKzMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCkBAIC00MCw3ICs0MSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIAogICAgIHN0YXRpYyAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gPSBBVURJT19TRVNTSU9OX05PTkUpOwpAQCAtMjQwLDYgKzI0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFRyYWNrKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAppbmRleCAzZjgzY2E4Li5mOGRhNzgwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLApAQCAtNTAsNyArNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtcDsgfQogCiAgICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKQEAgLTEwMiw2ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGF0Y2hSZWNvcmQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCmluZGV4IGE2N2FjZDYuLjJhODc3ZTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKQEAgLTE1NDMsNiArMTU0Myw3IEBACiAgICAgICAgIEFMT0dXKCJBY3RpdmVUcmFja3M8VD46OmFkZCB0cmFjayAlcCBhbHJlYWR5IHRoZXJlIiwgdHJhY2suZ2V0KCkpOwogICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQorICAgIGxvZ1RyYWNrKCJhZGQiLCB0cmFjayk7CiAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24rKzsKICAgICBtTGF0ZXN0QWN0aXZlVHJhY2sgPSB0cmFjazsKICAgICArK21CYXR0ZXJ5Q291bnRlclt0cmFjay0+dWlkKCldLnNlY29uZDsKQEAgLTE1NTYsNiArMTU1Nyw3IEBACiAgICAgICAgIEFMT0dXKCJBY3RpdmVUcmFja3M8VD46OnJlbW92ZSBub25leGlzdGVudCB0cmFjayAlcCIsIHRyYWNrLmdldCgpKTsKICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgIH0KKyAgICBsb2dUcmFjaygicmVtb3ZlIiwgdHJhY2spOwogICAgIG1BY3RpdmVUcmFja3NHZW5lcmF0aW9uKys7CiAgICAgLS1tQmF0dGVyeUNvdW50ZXJbdHJhY2stPnVpZCgpXS5zZWNvbmQ7CiAgICAgLy8gbUxhdGVzdEFjdGl2ZVRyYWNrIGlzIG5vdCBjbGVhcmVkIGV2ZW4gaWYgaXMgdGhlIHNhbWUgYXMgdHJhY2suCkBAIC0xNTY2LDYgKzE1NjgsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OkFjdGl2ZVRyYWNrczxUPjo6Y2xlYXIoKSB7CiAgICAgZm9yIChjb25zdCBzcDxUPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CiAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RvcEF1ZGlvKHRyYWNrLT51aWQoKSk7CisgICAgICAgIGxvZ1RyYWNrKCJjbGVhciIsIHRyYWNrKTsKICAgICB9CiAgICAgbUxhc3RBY3RpdmVUcmFja3NHZW5lcmF0aW9uID0gbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb247CiAgICAgbUFjdGl2ZVRyYWNrcy5jbGVhcigpOwpAQCAtMTYwNCw2ICsxNjA3LDE2IEBACiAgICAgfQogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpBY3RpdmVUcmFja3M8VD46OmxvZ1RyYWNrKAorICAgICAgICBjb25zdCBjaGFyICpmdW5jTmFtZSwgY29uc3Qgc3A8VD4gJnRyYWNrKSBjb25zdCB7CisgICAgaWYgKG1Mb2NhbExvZyAhPSBudWxscHRyKSB7CisgICAgICAgIFN0cmluZzggcmVzdWx0OworICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIGZhbHNlIC8qIGFjdGl2ZSAqLyk7CisgICAgICAgIG1Mb2NhbExvZy0+bG9nKCJBVDo6JS0xMHMoJXApICVzIiwgZnVuY05hbWUsIHRyYWNrLmdldCgpLCByZXN1bHQuc3RyaW5nKCkpOworICAgIH0KK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmJyb2FkY2FzdF9sKCkKIHsKICAgICAvLyBUaHJlYWQgY291bGQgYmUgYmxvY2tlZCB3YWl0aW5nIGZvciBhc3luYwpAQCAtMTYzOSw2ICsxNjUyLDcgQEAKICAgICAgICAgbVN1c3BlbmRlZCgwKSwgbUJ5dGVzV3JpdHRlbigwKSwKICAgICAgICAgbUZyYW1lc1dyaXR0ZW4oMCksCiAgICAgICAgIG1TdXNwZW5kZWRGcmFtZXMoMCksCisgICAgICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZyksCiAgICAgICAgIC8vIG1TdHJlYW1UeXBlc1tdIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yIGJvZHkKICAgICAgICAgbU91dHB1dChvdXRwdXQpLAogICAgICAgICBtTGFzdFdyaXRlVGltZSgtMSksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSksCkBAIC0xNzA2LDggKzE3MjAsNiBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBTdHJlYW0gdm9sdW1lcyBpbiBkQjogIik7CkBAIC0xNzM0LDggKzE3NDYsMTAgQEAKICAgICBzaXplX3QgbnVtYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CiAgICAgZHByaW50ZihmZCwgIiAgJXp1IFRyYWNrcyIsIG51bXRyYWNrcyk7CiAgICAgc2l6ZV90IG51bWFjdGl2ZXNlZW4gPSAwOworICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKQEAgLTE3NDQsOCArMTc1OCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICBudW1hY3RpdmVzZWVuKys7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgYWN0aXZlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgYWN0aXZlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xNzUzLDE1ICsxNzY3LDE1IEBACiAgICAgfQogICAgIGlmIChudW1hY3RpdmVzZWVuICE9IG51bWFjdGl2ZSkgewogICAgICAgICAvLyBzb21lIHRyYWNrcyBpbiB0aGUgYWN0aXZlIGxpc3Qgd2VyZSBub3QgaW4gdGhlIHRyYWNrcyBsaXN0Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIHRydWUgLyogYWN0aXZlICovKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTIwMTIsNyArMjAyNiw4IEBACiAgICAgICAgIH0KIAogICAgICAgICB0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIE5VTEwsIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKIAogICAgICAgICBsU3RhdHVzID0gdHJhY2sgIT0gMCA/IHRyYWNrLT5pbml0Q2hlY2soKSA6IChzdGF0dXNfdCkgTk9fTUVNT1JZOwpAQCAtMjE3MSwxMCArMjE4Niw2IEBACiAgICAgICAgICAgICBjaGFpbi0+aW5jQWN0aXZlVHJhY2tDbnQoKTsKICAgICAgICAgfQogCi0gICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgICAgIG1Mb2NhbExvZy5sb2coImFkZFRyYWNrX2wgICAgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCBidWZmZXIgKyA0KTsgLy8gbG9nIGZvciBhbmFseXNpcwotCiAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIH0KIApAQCAtMjIwMSw5ICsyMjEyLDkgQEAKIHsKICAgICB0cmFjay0+dHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9QUkVTRU5UQVRJT05fQ09NUExFVEUpOwogCi0gICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICB0cmFjay0+ZHVtcChidWZmZXIsIGFycmF5c2l6ZShidWZmZXIpLCBmYWxzZSAvKiBhY3RpdmUgKi8pOwotICAgIG1Mb2NhbExvZy5sb2coInJlbW92ZVRyYWNrX2wgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCBidWZmZXIgKyA0KTsgLy8gbG9nIGZvciBhbmFseXNpcworICAgIFN0cmluZzggcmVzdWx0OworICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgZmFsc2UgLyogYWN0aXZlICovKTsKKyAgICBtTG9jYWxMb2cubG9nKCJyZW1vdmVUcmFja19sICglcCkgJXMiLCB0cmFjay5nZXQoKSwgcmVzdWx0LnN0cmluZygpKTsKIAogICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICBkZWxldGVUcmFja05hbWVfbCh0cmFjay0+bmFtZSgpKTsKQEAgLTM0MDMsMTAgKzM0MTQsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewogICAgICAgICAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2spOwotICAgICAgICAgICAgfSBlbHNlIHsgLy8gaW5hY3RpdmUgYnV0IG5vdCB0ZXJtaW5hdGVkCi0gICAgICAgICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIGFycmF5c2l6ZShidWZmZXIpLCBmYWxzZSAvKiBhY3RpdmUgKi8pOwotICAgICAgICAgICAgICAgIG1Mb2NhbExvZy5sb2coInJlbW92ZVRyYWNrc19sKCVwKSAlcyIsIHRyYWNrLmdldCgpLCBidWZmZXIgKyA0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTU5MjQsNyArNTkzMSw5IEBACiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6CiAgICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBSRUNPUkQsIHN5c3RlbVJlYWR5KSwKLSAgICBtSW5wdXQoaW5wdXQpLCBtUnNtcEluQnVmZmVyKE5VTEwpLAorICAgIG1JbnB1dChpbnB1dCksCisgICAgbUFjdGl2ZVRyYWNrcygmdGhpcy0+bUxvY2FsTG9nKSwKKyAgICBtUnNtcEluQnVmZmVyKE5VTEwpLAogICAgIC8vIG1Sc21wSW5GcmFtZXMsIG1Sc21wSW5GcmFtZXNQMiwgYW5kIG1Sc21wSW5GcmFtZXNPQSBhcmUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCiAgICAgbVJzbXBJblJlYXIoMCkKICNpZmRlZiBURUVfU0lOSwpAQCAtNjY5NSw3ICs2NzA0LDggQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgICAgICB0cmFjayA9IG5ldyBSZWNvcmRUcmFjayh0aGlzLCBjbGllbnQsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgc2Vzc2lvbklkLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIHNlc3Npb25JZCwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIHBvcnRJZCk7CiAKICAgICAgICAgbFN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKQEAgLTY4ODcsNiArNjg5NywxMCBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZW1vdmVUcmFja19sKGNvbnN0IHNwPFJlY29yZFRyYWNrPiYgdHJhY2spCiB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBmYWxzZSAvKiBhY3RpdmUgKi8pOworICAgIG1Mb2NhbExvZy5sb2coInJlbW92ZVRyYWNrX2wgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCByZXN1bHQuc3RyaW5nKCkpOworCiAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgIC8vIG5lZWQgYW55dGhpbmcgcmVsYXRlZCB0byBlZmZlY3RzIGhlcmU/CiAgICAgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CkBAIC02OTAwLDYgKzY5MTQsOCBAQAogICAgIGR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwogICAgIGR1bXBUcmFja3MoZmQsIGFyZ3MpOwogICAgIGR1bXBFZmZlY3RDaGFpbnMoZmQsIGFyZ3MpOworICAgIGRwcmludGYoZmQsICIgIExvY2FsIGxvZzpcbiIpOworICAgIG1Mb2NhbExvZy5kdW1wKGZkLCAiICAgIiAvKiBwcmVmaXggKi8sIDQwIC8qIGxpbmVzICovKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCkBAIC02OTEzLDYgKzY5MjksMTIgQEAKICAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgcmVjb3JkIGNsaWVudHNcbiIpOwogICAgIH0KKworICAgIGlmIChpbnB1dCAhPSBudWxscHRyKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIEhhbCBzdHJlYW0gZHVtcDpcbiIpOworICAgICAgICAodm9pZClpbnB1dC0+c3RyZWFtLT5kdW1wKGZkKTsKKyAgICB9CisKICAgICBkcHJpbnRmKGZkLCAiICBGYXN0IGNhcHR1cmUgdGhyZWFkOiAlc1xuIiwgaGFzRmFzdENhcHR1cmUoKSA/ICJ5ZXMiIDogIm5vIik7CiAgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFjayBhdmFpbGFibGU6ICVzXG4iLCBtRmFzdFRyYWNrQXZhaWwgPyAieWVzIiA6ICJubyIpOwogCkBAIC02OTI3LDE2ICs2OTQ5LDE1IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotCiAgICAgc2l6ZV90IG51bXRyYWNrcyA9IG1UcmFja3Muc2l6ZSgpOwogICAgIHNpemVfdCBudW1hY3RpdmUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKICAgICBzaXplX3QgbnVtYWN0aXZlc2VlbiA9IDA7CiAgICAgZHByaW50ZihmZCwgIiAgJXp1IFRyYWNrcyIsIG51bXRyYWNrcyk7CisgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrcyA7ICsraSkgewogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKQEAgLTY5NDUsOCArNjk2Niw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICBudW1hY3RpdmVzZWVuKys7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgYWN0aXZlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgYWN0aXZlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC02OTU0LDE1ICs2OTc1LDE1IEBACiAgICAgfQogCiAgICAgaWYgKG51bWFjdGl2ZXNlZW4gIT0gbnVtYWN0aXZlKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIHRydWUgLyogYWN0aXZlICovKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC03NTQ0LDcgKzc1NjUsOCBAQAogICAgICAgICBBdWRpb0h3RGV2aWNlICpod0Rldiwgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0sCiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6IFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgTU1BUCwgc3lzdGVtUmVhZHkpLAotICAgICAgbUhhbFN0cmVhbShzdHJlYW0pLCBtSGFsRGV2aWNlKGh3RGV2LT5od0RldmljZSgpKSwgbUF1ZGlvSHdEZXYoaHdEZXYpCisgICAgICBtSGFsU3RyZWFtKHN0cmVhbSksIG1IYWxEZXZpY2UoaHdEZXYtPmh3RGV2aWNlKCkpLCBtQXVkaW9Id0Rldihod0RldiksCisgICAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpCiB7CiAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgIHJlYWRIYWxQYXJhbWV0ZXJzX2woKTsKQEAgLTc2OTIsNyArNzcxNCw3IEBACiAgICAgfQogCiAgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG5ldyBNbWFwVHJhY2sodGhpcywgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsIHBvcnRJZCk7CiAKICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CiAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChtU2Vzc2lvbklkKTsKQEAgLTgxNjAsNiArODE4Miw4IEBACiAgICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7CiAgICAgZHVtcFRyYWNrcyhmZCwgYXJncyk7CiAgICAgZHVtcEVmZmVjdENoYWlucyhmZCwgYXJncyk7CisgICAgZHByaW50ZihmZCwgIiAgTG9jYWwgbG9nOlxuIik7CisgICAgbUxvY2FsTG9nLmR1bXAoZmQsICIgICAiIC8qIHByZWZpeCAqLywgNDAgLyogbGluZXMgKi8pOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCkBAIC04MTc2LDE4ICs4MjAwLDE3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKLQogICAgIHNpemVfdCBudW10cmFja3MgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKLSAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzIiwgbnVtdHJhY2tzKTsKKyAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzXG4iLCBudW10cmFja3MpOworICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgTW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKLSAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIHRydWUgLyogYWN0aXZlICovKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICJcbiIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggMDYyYmFkNi4uMzJmMmJjNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC01MDgsOSArNTA4LDEwIEBACiAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgICAgICAgICAgICAgY2xhc3MgQWN0aXZlVHJhY2tzIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgIEFjdGl2ZVRyYWNrcygpCisgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0IEFjdGl2ZVRyYWNrcyhTaW1wbGVMb2cgKmxvY2FsTG9nID0gbnVsbHB0cikKICAgICAgICAgICAgICAgICAgICAgICAgIDogbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24oMCkKICAgICAgICAgICAgICAgICAgICAgICAgICwgbUxhc3RBY3RpdmVUcmFja3NHZW5lcmF0aW9uKDApCisgICAgICAgICAgICAgICAgICAgICAgICAsIG1Mb2NhbExvZyhsb2NhbExvZykKICAgICAgICAgICAgICAgICAgICAgeyB9CiAKICAgICAgICAgICAgICAgICAgICAgfkFjdGl2ZVRyYWNrcygpIHsKQEAgLTU2Miw2ICs1NjMsOCBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgdXBkYXRlUG93ZXJTdGF0ZShzcDxUaHJlYWRCYXNlPiB0aHJlYWQsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAKICAgICAgICAgICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgbG9nVHJhY2soY29uc3QgY2hhciAqZnVuY05hbWUsIGNvbnN0IHNwPFQ+ICZ0cmFjaykgY29uc3Q7CisKICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPHVpZF90PiBnZXRXYWtlTG9ja1VpZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8dWlkX3Q+IHdha2VMb2NrVWlkczsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3A8VD4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewpAQCAtNTc2LDYgKzU3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUxhc3RBY3RpdmVUcmFja3NHZW5lcmF0aW9uOwogICAgICAgICAgICAgICAgICAgICB3cDxUPiAgICAgICAgICAgICAgIG1MYXRlc3RBY3RpdmVUcmFjazsgLy8gbGF0ZXN0IHRyYWNrIGFkZGVkIHRvIEFjdGl2ZVRyYWNrcworICAgICAgICAgICAgICAgICAgICBTaW1wbGVMb2cgKiBjb25zdCAgIG1Mb2NhbExvZzsKICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgICAgU2ltcGxlTG9nIG1Mb2NhbExvZzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAppbmRleCBjYjU0MGNhLi5kNGNlMGI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCkBAIC02MSw2ICs2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3V0LApAQCAtODIsNiArODMsNyBAQAogCiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBnZXRCdWZmZXJzKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlck1lbW9yeTsgfQogICAgICAgICAgICAgdm9pZCogICAgICAgYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcjsgfQorICAgICAgICAgICAgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9CiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0ID0gMDsKICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT3V0cHV0VHJhY2soKSBjb25zdCB7IHJldHVybiAobVR5cGUgPT0gVFlQRV9PVVRQVVQpOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc1BhdGNoVHJhY2soKSBjb25zdCB7IHJldHVybiAobVR5cGUgPT0gVFlQRV9QQVRDSCk7IH0KQEAgLTEzMyw2ICsxMzUsNDAgQEAKICAgICAgICAgbVRlcm1pbmF0ZWQgPSB0cnVlOwogICAgIH0KIAorICAgIC8vIFVwcGVyIGNhc2UgY2hhcmFjdGVycyBhcmUgZmluYWwgc3RhdGVzLgorICAgIC8vIExvd2VyIGNhc2UgY2hhcmFjdGVycyBhcmUgdHJhbnNpdG9yeS4KKyAgICBjb25zdCBjaGFyICpnZXRUcmFja1N0YXRlU3RyaW5nKCkgY29uc3QgeworICAgICAgICBpZiAoaXNUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiVCAiOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgSURMRToKKyAgICAgICAgICAgIHJldHVybiAiSSAiOworICAgICAgICBjYXNlIFNUT1BQSU5HXzE6IC8vIGZvciBGYXN0IGFuZCBPZmZsb2FkCisgICAgICAgICAgICByZXR1cm4gInMxIjsKKyAgICAgICAgY2FzZSBTVE9QUElOR18yOiAvLyBmb3IgRmFzdCBhbmQgT2ZmbG9hZAorICAgICAgICAgICAgcmV0dXJuICJzMiI7CisgICAgICAgIGNhc2UgU1RPUFBFRDoKKyAgICAgICAgICAgIHJldHVybiAiUyAiOworICAgICAgICBjYXNlIFJFU1VNSU5HOgorICAgICAgICAgICAgcmV0dXJuICJyICI7CisgICAgICAgIGNhc2UgQUNUSVZFOgorICAgICAgICAgICAgcmV0dXJuICJBICI7CisgICAgICAgIGNhc2UgUEFVU0lORzoKKyAgICAgICAgICAgIHJldHVybiAicCAiOworICAgICAgICBjYXNlIFBBVVNFRDoKKyAgICAgICAgICAgIHJldHVybiAiUCAiOworICAgICAgICBjYXNlIEZMVVNIRUQ6CisgICAgICAgICAgICByZXR1cm4gIkYgIjsKKyAgICAgICAgY2FzZSBTVEFSVElOR18xOiAvLyBmb3IgUmVjb3JkVHJhY2sKKyAgICAgICAgICAgIHJldHVybiAicjEiOworICAgICAgICBjYXNlIFNUQVJUSU5HXzI6IC8vIGZvciBSZWNvcmRUcmFjaworICAgICAgICAgICAgcmV0dXJuICJyMiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIj8gIjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGJvb2wgaXNPdXQoKSBjb25zdCB7IHJldHVybiBtSXNPdXQ7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUgZm9yIFRyYWNrLCBmYWxzZSBmb3IgUmVjb3JkVHJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGEgdHJhY2sgdHlwZSBpZiBuZWVkZWQgbGF0ZXIKQEAgLTE0NCw2ICsxODAsNyBAQAogICAgIHNwPElNZW1vcnk+ICAgICAgICAgbUJ1ZmZlck1lbW9yeTsgIC8vIGN1cnJlbnRseSBub24tMCBmb3IgZmFzdCBSZWNvcmRUcmFjayBvbmx5CiAgICAgdm9pZCogICAgICAgICAgICAgICBtQnVmZmVyOyAgICAvLyBzdGFydCBvZiB0cmFjayBidWZmZXIsIHR5cGljYWxseSBpbiBzaGFyZWQgbWVtb3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHQgZm9yIE91dHB1dFRyYWNrIHdoZW4gaXQgaXMgaW4gbG9jYWwgbWVtb3J5CisgICAgc2l6ZV90ICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgLy8gc2l6ZSBvZiBtQnVmZmVyIGluIGJ5dGVzCiAgICAgLy8gd2UgZG9uJ3QgcmVhbGx5IG5lZWQgYSBsb2NrIGZvciB0aGVzZQogICAgIHRyYWNrX3N0YXRlICAgICAgICAgbVN0YXRlOwogICAgIGNvbnN0IHVpbnQzMl90ICAgICAgbVNhbXBsZVJhdGU7ICAgIC8vIGluaXRpYWwgc2FtcGxlIHJhdGUgb25seTsgZm9yIHRyYWNrcyB3aGljaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAppbmRleCA5NzYzYmYyLi4wZjI1MTUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcApAQCAtNTAsMTAgKzUwLDYgQEAKICNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKLS8vIFRPRE8gbW92ZSB0byBhIGNvbW1vbiBoZWFkZXIgIChBbHNvIHNoYXJlZCB3aXRoIEF1ZGlvVHJhY2suY3BwKQotI2RlZmluZSBOQU5PU19QRVJfU0VDT05EICAgIDEwMDAwMDAwMDAKLSNkZWZpbmUgVElNRV9UT19OQU5PUyh0aW1lKSAoKHVpbnQ2NF90KSh0aW1lKS50dl9zZWMgKiBOQU5PU19QRVJfU0VDT05EICsgKHRpbWUpLnR2X25zZWMpCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzEsNiArNjcsNyBAQAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgICAgIGJvb2wgaXNPdXQsCkBAIC04MSw3ICs3OCw3IEBACiAgICAgICAgIG1UaHJlYWQodGhyZWFkKSwKICAgICAgICAgbUNsaWVudChjbGllbnQpLAogICAgICAgICBtQ2JsayhOVUxMKSwKLSAgICAgICAgLy8gbUJ1ZmZlcgorICAgICAgICAvLyBtQnVmZmVyLCBtQnVmZmVyU2l6ZQogICAgICAgICBtU3RhdGUoSURMRSksCiAgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLAogICAgICAgICBtRm9ybWF0KGZvcm1hdCksCkBAIC0xMTMsMTUgKzExMCwyMiBAQAogCiAgICAgLy8gQUxPR0QoIkNyZWF0aW5nIHRyYWNrIHdpdGggJWQgYnVmZmVycyBAICVkIGJ5dGVzIiwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpOwogCi0gICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBidWZmZXIgPT0gTlVMTCA/IHJvdW5kdXAoZnJhbWVDb3VudCkgOiBmcmFtZUNvdW50OworICAgIHNpemVfdCBtaW5CdWZmZXJTaXplID0gYnVmZmVyID09IE5VTEwgPyByb3VuZHVwKGZyYW1lQ291bnQpIDogZnJhbWVDb3VudDsKICAgICAvLyBjaGVjayBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyBidWZmZXJTaXplIGR1ZSB0byBtdWx0aXBsaWNhdGlvbiBieSBtRnJhbWVTaXplLgotICAgIGlmIChidWZmZXJTaXplIDwgZnJhbWVDb3VudCAgLy8gcm91bmR1cCByb3VuZHMgZG93biBmb3IgdmFsdWVzIGFib3ZlIFVJTlRfTUFYIC8gMgorICAgIGlmIChtaW5CdWZmZXJTaXplIDwgZnJhbWVDb3VudCAgLy8gcm91bmR1cCByb3VuZHMgZG93biBmb3IgdmFsdWVzIGFib3ZlIFVJTlRfTUFYIC8gMgogICAgICAgICAgICAgfHwgbUZyYW1lU2l6ZSA9PSAwICAgLy8gZm9ybWF0IG5lZWRzIHRvIGJlIGNvcnJlY3QKLSAgICAgICAgICAgIHx8IGJ1ZmZlclNpemUgPiBTSVpFX01BWCAvIG1GcmFtZVNpemUpIHsKKyAgICAgICAgICAgIHx8IG1pbkJ1ZmZlclNpemUgPiBTSVpFX01BWCAvIG1GcmFtZVNpemUpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNDc0OTU3MSIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGJ1ZmZlclNpemUgKj0gbUZyYW1lU2l6ZTsKKyAgICBtaW5CdWZmZXJTaXplICo9IG1GcmFtZVNpemU7CisKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgYnVmZmVyU2l6ZSA9IG1pbkJ1ZmZlclNpemU7IC8vIGFsbG9jYXRlZCBoZXJlLgorICAgIH0gZWxzZSBpZiAobWluQnVmZmVyU2l6ZSA+IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzODM0MDExNyIpOworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICBpZiAoYnVmZmVyID09IE5VTEwgJiYgYWxsb2MgPT0gQUxMT0NfQ0JMSykgewpAQCAtMTc3LDYgKzE4MSw3IEBACiAgICAgICAgICAgICAvLyBJdCBzaG91bGQgcmVmZXJlbmNlcyB0aGUgYnVmZmVyIHZpYSB0aGUgcGlwZS4KICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgdG8gZGV0ZWN0IGluY29ycmVjdCB1c2FnZSBvZiB0aGUgYnVmZmVyLCB3ZSBzZXQgbUJ1ZmZlciB0byBOVUxMLgogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBidWZmZXJTaXplID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFMTE9DX0NCTEs6CiAgICAgICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycwpAQCAtMTk2LDcgKzIwMSwxMCBAQAogICAgICAgICBjYXNlIEFMTE9DX05PTkU6CiAgICAgICAgICAgICBtQnVmZmVyID0gYnVmZmVyOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIGFsbG9jYXRpb24gdHlwZTogJWQiLCAoaW50KWFsbG9jKTsKICAgICAgICAgfQorICAgICAgICBtQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CiAKICNpZmRlZiBURUVfU0lOSwogICAgICAgICBpZiAobVRlZVNpbmtUcmFja0VuYWJsZWQpIHsKQEAgLTM2OCw2ICszNzYsNyBAQAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICB1aWRfdCB1aWQsCkBAIC0zNzYsNiArMzg1LDcgQEAKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgOiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5zaXplKCkgOiBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIHRydWUgLyppc091dCovLAogICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gVFlQRV9QQVRDSCkgPyAoIGJ1ZmZlciA9PSBOVUxMID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSA6IEFMTE9DX0NCTEssCiAgICAgICAgICAgICAgICAgICB0eXBlLCBwb3J0SWQpLApAQCAtNDExLDIxICs0MjEsNiBAQAogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICBtRnJhbWVTaXplLCAhaXNFeHRlcm5hbFRyYWNrKCksIHNhbXBsZVJhdGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIElzIHRoZSBzaGFyZWQgYnVmZmVyIG9mIHN1ZmZpY2llbnQgc2l6ZT8KLSAgICAgICAgLy8gKGZyYW1lQ291bnQgKiBtRnJhbWVTaXplKSBpcyA8PSBTSVpFX01BWCwgY2hlY2tlZCBpbiBUcmFja0Jhc2UuCi0gICAgICAgIGlmIChzaGFyZWRCdWZmZXItPnNpemUoKSA8IGZyYW1lQ291bnQgKiBtRnJhbWVTaXplKSB7Ci0gICAgICAgICAgICAvLyBXb3JrYXJvdW5kOiBjbGVhciBvdXQgbUNibGsgdG8gaW5kaWNhdGUgdHJhY2sgaGFzbid0IGJlZW4gcHJvcGVybHkgY3JlYXRlZC4KLSAgICAgICAgICAgIG1DYmxrLT5+YXVkaW9fdHJhY2tfY2Jsa190KCk7ICAgLy8gZGVzdHJveSBvdXIgc2hhcmVkLXN0cnVjdHVyZS4KLSAgICAgICAgICAgIGlmIChtQ2xpZW50ID09IDApIHsKLSAgICAgICAgICAgICAgICBmcmVlKG1DYmxrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYmxrID0gTlVMTDsKLQotICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlci5jbGVhcigpOyAvLyByZWxlYXNlIHNoYXJlZCBidWZmZXIgZWFybHkKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzgzNDAxMTciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIG1GcmFtZVNpemUpOwogICAgIH0KQEAgLTUwMyw1OCArNDk4LDQwIEBACiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgIE5hbWUgQWN0aXZlIENsaWVudCBUeXBlICAgICAgRm10IENobiBtYXNrIFNlc3Npb24gZkNvdW50IFMgRiBTUmF0ZSAgIgotICAgICAgICAgICAgICAgICAgIkwgZEIgIFIgZEIgIFZTIGRCICAgIFNlcnZlciBNYWluIGJ1ZiAgQXV4IGJ1ZiBGbGFncyBVbmRGcm1DbnQgIEZsdXNoZWRcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIlQgTmFtZSBBY3RpdmUgQ2xpZW50IFNlc3Npb24gUyAgRmxhZ3MgIgorICAgICAgICAgICAgICAgICAgIiAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAiCisgICAgICAgICAgICAgICAgICAiU1QgIEwgZEIgIFIgZEIgIFZTIGRCICIKKyAgICAgICAgICAgICAgICAgICIgIFNlcnZlciBGcm1DbnQgIEZybVJkeSBGIFVuZGVycnVucyAgRmx1c2hlZCAiCisgICAgICAgICAgICAgICAgICAiTWFpbiBCdWYgIEF1eCBCdWZcbiIpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQogewotICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7Ci0gICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgRiAlMmQiLCBtRmFzdEluZGV4KTsKLSAgICB9IGVsc2UgaWYgKG1OYW1lID49IEF1ZGlvTWl4ZXI6OlRSQUNLMCkgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICAlNGQiLCBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgbm9uZSIpOwotICAgIH0KLSAgICB0cmFja19zdGF0ZSBzdGF0ZSA9IG1TdGF0ZTsKLSAgICBjaGFyIHN0YXRlQ2hhcjsKLSAgICBpZiAoaXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgc3RhdGVDaGFyID0gJ1QnOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgY2FzZSBJRExFOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ0knOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUFBJTkdfMToKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdzJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUT1BQSU5HXzI6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnNSc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVE9QUEVEOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ1MnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVTVU1JTkc6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnUic7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQ1RJVkU6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnQSc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQQVVTSU5HOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ3AnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEFVU0VEOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ1AnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRkxVU0hFRDoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdGJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJz8nOwotICAgICAgICAgICAgYnJlYWs7CisgICAgY2hhciB0cmFja1R5cGU7CisgICAgc3dpdGNoIChtVHlwZSkgeworICAgIGNhc2UgVFlQRV9ERUZBVUxUOgorICAgIGNhc2UgVFlQRV9PVVRQVVQ6CisgICAgICAgIGlmIChtU2hhcmVkQnVmZmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHRyYWNrVHlwZSA9ICdTJzsgLy8gc3RhdGljCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmFja1R5cGUgPSAnICc7IC8vIG5vcm1hbAogICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9QQVRDSDoKKyAgICAgICAgdHJhY2tUeXBlID0gJ1AnOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB0cmFja1R5cGUgPSAnPyc7CiAgICAgfQorCisgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiRiVjICUzZCIsIHRyYWNrVHlwZSwgbUZhc3RJbmRleCk7CisgICAgfSBlbHNlIGlmIChtTmFtZSA+PSBBdWRpb01peGVyOjpUUkFDSzApIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgJTRkIiwgdHJhY2tUeXBlLCBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgbm9uZSIsIHRyYWNrVHlwZSk7CisgICAgfQorCiAgICAgY2hhciBub3dJblVuZGVycnVuOwogICAgIHN3aXRjaCAobU9ic2VydmVkVW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQpIHsKICAgICBjYXNlIFVOREVSUlVOX0ZVTEw6CkBAIC01NzEsMzEgKzU0OCw3NSBAQAogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBzdGQ6OnBhaXI8ZmxvYXQgLyogdm9sdW1lICovLCBib29sIC8qIGFjdGl2ZSAqLz4gdnNWb2x1bWUgPSBtVm9sdW1lSGFuZGxlci0+Z2V0TGFzdFZvbHVtZSgpOwotICAgIHNucHJpbnRmKCZidWZmZXJbOF0sIHNpemUgLSA4LCAiICU2cyAlNnUgJTR1ICUwOFggJTA4WCAlN3UgJTZ6dSAlMWMgJTFkICU1dSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlNS4yZyAlNS4yZyAlNS4yZyVjICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOHpYICUwOHpYIDB4JTAzWCAlOXUlYyAlN3VcbiIsCisgICAgY2hhciBmaWxsaW5nU3RhdHVzOworICAgIHN3aXRjaCAobUZpbGxpbmdVcFN0YXR1cykgeworICAgIGNhc2UgRlNfSU5WQUxJRDoKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICdJJzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGU19GSUxMSU5HOgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJ2YnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZTX0ZJTExFRDoKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICdGJzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGU19BQ1RJVkU6CisgICAgICAgIGZpbGxpbmdTdGF0dXMgPSAnQSc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGZpbGxpbmdTdGF0dXMgPSAnPyc7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIGNsaXAgZnJhbWVzUmVhZHlTYWZlIHRvIG1heCByZXByZXNlbnRhdGlvbiBpbiBkdW1wCisgICAgY29uc3Qgc2l6ZV90IGZyYW1lc1JlYWR5U2FmZSA9CisgICAgICAgICAgICBzdGQ6Om1pbihtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeVNhZmUoKSwgKHNpemVfdCk5OTk5OTk5OSk7CisKKyAgICAvLyBvYnRhaW4gdm9sdW1lcworICAgIGNvbnN0IGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgY29uc3Qgc3RkOjpwYWlyPGZsb2F0IC8qIHZvbHVtZSAqLywgYm9vbCAvKiBhY3RpdmUgKi8+IHZzVm9sdW1lID0KKyAgICAgICAgICAgIG1Wb2x1bWVIYW5kbGVyLT5nZXRMYXN0Vm9sdW1lKCk7CisKKyAgICAvLyBPdXIgZWZmZWN0aXZlIGZyYW1lIGNvdW50IGlzIG9idGFpbmVkIGJ5IFNlcnZlclByb3h5OjpnZXRCdWZmZXJTaXplSW5GcmFtZXMoKQorICAgIC8vIGFzIGl0IG1heSBiZSByZWR1Y2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZUluRnJhbWVzID0gKHNpemVfdCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRCdWZmZXJTaXplSW5GcmFtZXMoKTsKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBidWZmZXIgc2l6ZSBoYXMgYmVlbiBtb2RpZmllZCBieSB0aGUgYXBwLgorICAgIGNvbnN0IGNoYXIgbW9kaWZpZWRCdWZmZXJDaGFyID0gYnVmZmVyU2l6ZUluRnJhbWVzIDwgbUZyYW1lQ291bnQKKyAgICAgICAgICAgID8gJ3InIC8qIGJ1ZmZlciByZWR1Y2VkICovOiBidWZmZXJTaXplSW5GcmFtZXMgPiBtRnJhbWVDb3VudAorICAgICAgICAgICAgICAgICAgICA/ICdlJyAvKiBlcnJvciAqLyA6ICcgJyAvKiBpZGVudGljYWwgKi87CisKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlN3MgJTZ1ICU3dSAlMnMgMHglMDNYICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMnUgJTUuMmcgJTUuMmcgJTUuMmclYyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlNnp1JWMgJTZ6dSAlYyAlOXUlYyAlN3UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOHpYICUwOHpYXG4iLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCi0gICAgICAgICAgICBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICBnZXRUcmFja1N0YXRlU3RyaW5nKCksCisgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAorCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICAgIG1GcmFtZUNvdW50LAotICAgICAgICAgICAgc3RhdGVDaGFyLAotICAgICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKSwKKworICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpKSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpKSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMCh2c1ZvbHVtZS5maXJzdCksIC8vIFZvbHVtZVNoYXBlcihzKSB0b3RhbCB2b2x1bWUKICAgICAgICAgICAgIHZzVm9sdW1lLnNlY29uZCA/ICdBJyA6ICcgJywgIC8vIGlmIGFueSBWb2x1bWVTaGFwZXJzIGFjdGl2ZQorCiAgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKLSAgICAgICAgICAgIChzaXplX3QpbU1haW5CdWZmZXIsIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAotICAgICAgICAgICAgKHNpemVfdCltQXV4QnVmZmVyLCAgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4Ci0gICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAorICAgICAgICAgICAgYnVmZmVyU2l6ZUluRnJhbWVzLAorICAgICAgICAgICAgbW9kaWZpZWRCdWZmZXJDaGFyLAorICAgICAgICAgICAgZnJhbWVzUmVhZHlTYWZlLAorICAgICAgICAgICAgZmlsbGluZ1N0YXR1cywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCksCiAgICAgICAgICAgICBub3dJblVuZGVycnVuLAotICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwKTsgLy8gNyBkaWdpdHMKKyAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMCwKKworICAgICAgICAgICAgKHNpemVfdCltTWFpbkJ1ZmZlciwgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4CisgICAgICAgICAgICAoc2l6ZV90KW1BdXhCdWZmZXIgICAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKKyAgICAgICAgICAgICk7CiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzYW1wbGVSYXRlKCkgY29uc3QgewpAQCAtMTIzNSw3ICsxMjU2LDggQEAKICAgICAgICAgICAgIHVpZF90IHVpZCkKICAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIEFVRElPX1NUUkVBTV9QQVRDSCwKICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgTlVMTCwgMCwgQVVESU9fU0VTU0lPTl9OT05FLCB1aWQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgbnVsbHB0ciAvKiBzaGFyZWRCdWZmZXIgKi8sCisgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgdWlkLCBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICBUWVBFX09VVFBVVCksCiAgICAgbUFjdGl2ZShmYWxzZSksIG1Tb3VyY2VUaHJlYWQoc291cmNlVGhyZWFkKQogewpAQCAtMTM1MSw3ICsxMzczLDkgQEAKICAgICAgICAgICAgIGlmIChtQnVmZmVyUXVldWUuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLnJlbW92ZUF0KDApOwogICAgICAgICAgICAgICAgIGZyZWUocEluQnVmZmVyLT5tQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcEluQnVmZmVyOworICAgICAgICAgICAgICAgIGlmIChwSW5CdWZmZXIgIT0gJmluQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwSW5CdWZmZXI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgcmVsZWFzZWQgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTQzMCwxMCArMTQ1NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKICAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgIGJ1ZmZlciwgMCwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIG51bGxwdHIgLyogc2hhcmVkQnVmZmVyICovLAorICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCiAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpKQogewogICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KQEAgLTE1NjcsMTMgKzE1OTMsMTQgQEAKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlLAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGJ1ZmZlciwgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qaXNPdXQqLywKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBidWZmZXIsIGJ1ZmZlclNpemUsIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKmlzT3V0Ki8sCiAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX0RFRkFVTFQpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgKChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgPyBBTExPQ19QSVBFIDogQUxMT0NfQ0JMSykgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJ1ZmZlciA9PSBOVUxMKSA/IEFMTE9DX0xPQ0FMIDogQUxMT0NfTk9ORSksCkBAIC0xNzAxLDIyICsxNzI4LDI4IEBACiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIiAgICBBY3RpdmUgQ2xpZW50IEZtdCBDaG4gbWFzayBTZXNzaW9uIFMgICBTZXJ2ZXIgZkNvdW50IFNSYXRlXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCJBY3RpdmUgQ2xpZW50IFNlc3Npb24gUyAgRmxhZ3MgICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICAgU2VydmVyIEZybUNudFxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAgJTZzICU2dSAlM3UgJTA4WCAlN3UgJTFkICUwOFggJTZ6dSAlNXVcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMlNXMgJTZ1ICU3dSAlMnMgMHglMDNYICIKKyAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKKyAgICAgICAgICAgICIlMDhYICU2enVcbiIsCisgICAgICAgICAgICBpc0Zhc3RUcmFjaygpID8gJ0YnIDogJyAnLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgZ2V0VHJhY2tTdGF0ZVN0cmluZygpLAorICAgICAgICAgICAgbUNibGstPm1GbGFncywKKwogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICBtU3RhdGUsCi0gICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKLSAgICAgICAgICAgIG1GcmFtZUNvdW50LAotICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgbVNhbXBsZVJhdGUsCiAKKyAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAorICAgICAgICAgICAgbUZyYW1lQ291bnQKKyAgICAgICAgICAgICk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkKQEAgLTE3NjcsOSArMTgwMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogICAgIDogICBSZWNvcmRUcmFjayhyZWNvcmRUaHJlYWQsIE5VTEwsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgYnVmZmVyLCBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCiAgICAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgZmFsc2UsIHRydWUpKQogewogICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcmVjb3JkVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCkBAIC0xODM0LDExICsxODY4LDE1IEBACiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIE5VTEwsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCAwLCBOVUxMLCBzZXNzaW9uSWQsIHVpZCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgKHNpemVfdCkwIC8qIGZyYW1lQ291bnQgKi8sCisgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCisgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyogaXNPdXQgKi8sCiAgICAgICAgICAgICAgICAgICBBTExPQ19OT05FLAotICAgICAgICAgICAgICAgICAgVFlQRV9ERUZBVUxULCBwb3J0SWQpCisgICAgICAgICAgICAgICAgICBUWVBFX0RFRkFVTFQsIHBvcnRJZCksCisgICAgICAgIG1QaWQocGlkKQogewogfQogCkBAIC0xODg1LDE3ICsxOTIzLDE3IEBACiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgIENsaWVudCBGbXQgQ2huIG1hc2sgIFNSYXRlXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCJDbGllbnQgU2Vzc2lvbiAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGVcbiIpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUgX191bnVzZWQpCiB7Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgICAgICAgICAgJTZ1ICUzdSAgICAlMDhYICU1dVxuIiwKLSAgICAgICAgICAgIG1VaWQsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ1ICU3dSAlMDhYICUwOFggJTZ1XG4iLAorICAgICAgICAgICAgbVBpZCwKKyAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgbVNhbXBsZVJhdGUpOwotCiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKaW5kZXggMmQ4NDAyOC4uOTA5YWYwOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKQEAgLTg4LDExICs4OCwxMSBAQAogCiAvLyBXcml0ZSBoaXN0b2dyYW0gdGltZXN0YW1wIGVudHJ5CiAjZGVmaW5lIExPR19ISVNUX1RTKCkgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5sb2dIaXN0VFMoaGFzaChfX0ZJTEVfXywgX19MSU5FX18pKTsgfSB3aGlsZSgwKQorICAgICAgICB4LT5sb2dFdmVudEhpc3RUcyhOQkxvZzo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCBoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCiAKLS8vIGZsdXNoIGFsbCBoaXN0b2dyYW0KLSNkZWZpbmUgTE9HX0hJU1RfRkxVU0goKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPmxvZ0hpc3RGbHVzaChoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCisvLyBSZWNvcmQgdGhhdCBhdWRpbyB3YXMgdHVybmVkIG9uL29mZgorI2RlZmluZSBMT0dfQVVESU9fU1RBVEUoKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZ0V2ZW50SGlzdFRzKE5CTG9nOjpFVkVOVF9BVURJT19TVEFURSwgaGFzaChfX0ZJTEVfXywgX19MSU5FX18pKTsgfSB3aGlsZSgwKQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBleHRlcm4gIkMiIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCmluZGV4IGFkMzQwZTUuLjY1NTcxZjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsOCBAQAogICAgIGxpYmhhcmR3YXJlX2xlZ2FjeSBcCiAgICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlciBcCi0gICAgbGlibWVkaWFfaGVscGVyCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJlZmZlY3RzY29uZmlnCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKaW5kZXggYzg2ODIwNi4uN2IxOWY1OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCkBAIC0zNDksOCArMzQ5LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpID0gMDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODQ4M2ZhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTCkBAIC0wLDAgKzEsMyBAQAoram10cml2aUBnb29nbGUuY29tCitrcm9jYXJkQGdvb2dsZS5jb20KK21uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaAppbmRleCBjYTA3MGNmLi5jZWRmMjJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KICNpbmNsdWRlICJBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDQsMTQgKzQ1LDE0IEBACiAKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb247IH0KLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSgpY29uc3QgeyByZXR1cm4gbUlucHV0U291cmNlOyB9CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uOyB9CisgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UoKWNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZTsgfQogICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuZm9ybWF0OyB9CiAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuc2FtcGxlX3JhdGU7IH0KICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuY2hhbm5lbF9tYXNrOyB9CiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQotICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1VaWQ7IH0KLSAgICB2b2lkIHNldFVpZCh1aWRfdCB1aWQpIHsgbVVpZCA9IHVpZDsgfQorICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnVpZDsgfQorICAgIHZvaWQgc2V0VWlkKHVpZF90IHVpZCkgeyBtUmVjb3JkQ2xpZW50SW5mby51aWQgPSB1aWQ7IH0KICAgICBib29sIG1hdGNoZXMoY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAmb3RoZXIpIGNvbnN0OwogICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIoKSBjb25zdCB7IHJldHVybiBtSXNTb3VuZFRyaWdnZXI7IH0KICAgICB1aW50MzJfdCBvcGVuQ291bnQoKSBjb25zdCB7IHJldHVybiBtT3BlbkNvdW50OyB9IDsKQEAgLTY1LDExICs2Niw5IEBACiAgICAgdmlydHVhbCB2b2lkIG9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBjb25zdCBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb247Ci0gICAgY29uc3QgYXVkaW9fc291cmNlX3QgbUlucHV0U291cmNlOworICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1SZWNvcmRDbGllbnRJbmZvOwogICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ29uZmlnOwogICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgbUZsYWdzOwotICAgIHVpZF90IG1VaWQ7CiAgICAgYm9vbCAgbUlzU291bmRUcmlnZ2VyOwogICAgIHVpbnQzMl90ICBtT3BlbkNvdW50OwogICAgIHVpbnQzMl90ICBtQWN0aXZlQ291bnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcAppbmRleCBiZWE5ZjRmLi41YjU3ZDNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKQEAgLTM4LDkgKzM4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCogcG9saWN5TWl4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkgOgotICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtSW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpLAorICAgIG1SZWNvcmRDbGllbnRJbmZvKHsgLnVpZCA9IHVpZCwgLnNlc3Npb24gPSBzZXNzaW9uLCAuc291cmNlID0gaW5wdXRTb3VyY2V9KSwKICAgICBtQ29uZmlnKHsgLmZvcm1hdCA9IGZvcm1hdCwgLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZSwgLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrfSksCi0gICAgbUZsYWdzKGZsYWdzKSwgbVVpZCh1aWQpLCBtSXNTb3VuZFRyaWdnZXIoaXNTb3VuZFRyaWdnZXIpLAorICAgIG1GbGFncyhmbGFncyksIG1Jc1NvdW5kVHJpZ2dlcihpc1NvdW5kVHJpZ2dlciksCiAgICAgbU9wZW5Db3VudCgxKSwgbUFjdGl2ZUNvdW50KDApLCBtUG9saWN5TWl4KHBvbGljeU1peCksIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKSwKICAgICBtSW5mb1Byb3ZpZGVyKE5VTEwpCiB7CkBAIC05Miw3ICs5Miw3IEBACiAgICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKHByb3ZpZGVyICE9IE5VTEwpID8gcHJvdmlkZXItPmdldFBhdGNoSGFuZGxlKCkgOgogICAgICAgICAgICAgICAgIEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICBpZiAocGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgbVNlc3Npb24sIG1JbnB1dFNvdXJjZSwKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJm1SZWNvcmRDbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAyLDEzICsxMDIsMTMgQEAKIAogYm9vbCBBdWRpb1Nlc3Npb246Om1hdGNoZXMoY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAmb3RoZXIpIGNvbnN0CiB7Ci0gICAgaWYgKG90aGVyLT5zZXNzaW9uKCkgPT0gbVNlc3Npb24gJiYKLSAgICAgICAgb3RoZXItPmlucHV0U291cmNlKCkgPT0gbUlucHV0U291cmNlICYmCisgICAgaWYgKG90aGVyLT5zZXNzaW9uKCkgPT0gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbiAmJgorICAgICAgICBvdGhlci0+aW5wdXRTb3VyY2UoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UgJiYKICAgICAgICAgb3RoZXItPmZvcm1hdCgpID09IG1Db25maWcuZm9ybWF0ICYmCiAgICAgICAgIG90aGVyLT5zYW1wbGVSYXRlKCkgPT0gbUNvbmZpZy5zYW1wbGVfcmF0ZSAmJgogICAgICAgICBvdGhlci0+Y2hhbm5lbE1hc2soKSA9PSBtQ29uZmlnLmNoYW5uZWxfbWFzayAmJgogICAgICAgICBvdGhlci0+ZmxhZ3MoKSA9PSBtRmxhZ3MgJiYKLSAgICAgICAgb3RoZXItPnVpZCgpID09IG1VaWQpIHsKKyAgICAgICAgb3RoZXItPnVpZCgpID09IG1SZWNvcmRDbGllbnRJbmZvLnVpZCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTMwLDggKzEzMCw3IEBACiAgICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLCBtSW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLCAmZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICZtUmVjb3JkQ2xpZW50SW5mbywgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE0NCwxMSArMTQzLDExIEBACiAKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBzZXNzaW9uICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2Vzc2lvbjogJTJkXG4iLCBzcGFjZXMsICIiLCBtU2Vzc2lvbik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzZXNzaW9uOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb24pOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtVWlkKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby51aWQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlucHV0IHNvdXJjZTogJWRcbiIsIHNwYWNlcywgIiIsIG1JbnB1dFNvdXJjZSk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpbnB1dCBzb3VyY2U6ICVkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdDogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUNvbmZpZy5mb3JtYXQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAppbmRleCBkYmNjMDcwLi4zMWM5NTc1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCkBAIC0yMjAsMTEgKzIyMCwxMSBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7Ci0gICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAogICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCmluZGV4IDY1NDQ2NWQuLjg0YjEwNzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKQEAgLTIwLDggKzIwLDEwIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNDb25maWcuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KQEAgLTM5LDExICs0MSwxNyBAQAogCiBBdWRpb1BvbGljeUVmZmVjdHM6OkF1ZGlvUG9saWN5RWZmZWN0cygpCiB7Ci0gICAgLy8gbG9hZCBhdXRvbWF0aWMgYXVkaW8gZWZmZWN0IG1vZHVsZXMKLSAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOwotICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgIGxvYWRBdWRpb0VmZmVjdENvbmZpZyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgc3RhdHVzX3QgbG9hZFJlc3VsdCA9IGxvYWRBdWRpb0VmZmVjdFhtbENvbmZpZygpOworICAgIGlmIChsb2FkUmVzdWx0IDwgMCkgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGxvYWQgWE1MIGVmZmVjdCBjb25maWd1cmF0aW9uLCBmYWxsYmFjayB0byAuY29uZiIpOworICAgICAgICAvLyBsb2FkIGF1dG9tYXRpYyBhdWRpbyBlZmZlY3QgbW9kdWxlcworICAgICAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgICAgIGxvYWRBdWRpb0VmZmVjdENvbmZpZyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgICAgIGxvYWRBdWRpb0VmZmVjdENvbmZpZyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGxvYWRSZXN1bHQgPiAwKSB7CisgICAgICAgIEFMT0dFKCJFZmZlY3QgY29uZmlnIGlzIHBhcnRpYWxseSBpbnZhbGlkLCBza2lwcGVkICVkIGVsZW1lbnRzIiwgbG9hZFJlc3VsdCk7CiAgICAgfQogfQogCkBAIC02ODUsNiArNjkzLDI4IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRBdWRpb0VmZmVjdFhtbENvbmZpZygpIHsKKyAgICBhdXRvIHJlc3VsdCA9IGVmZmVjdHNDb25maWc6OnBhcnNlKCk7CisgICAgaWYgKHJlc3VsdC5wYXJzZWRDb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisKKyAgICBhdXRvIGxvYWRQcm9jZXNzaW5nQ2hhaW4gPSBbXShhdXRvJiBwcm9jZXNzaW5nQ2hhaW4sIGF1dG8mIHN0cmVhbXMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBzdHJlYW0gOiBwcm9jZXNzaW5nQ2hhaW4pIHsKKyAgICAgICAgICAgIGF1dG8gZWZmZWN0RGVzY3MgPSBzdGQ6Om1ha2VfdW5pcXVlPEVmZmVjdERlc2NWZWN0b3I+KCk7CisgICAgICAgICAgICBmb3IgKGF1dG8mIGVmZmVjdCA6IHN0cmVhbS5lZmZlY3RzKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3MtPm1FZmZlY3RzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFZmZlY3REZXNje2VmZmVjdC5nZXQoKS5uYW1lLmNfc3RyKCksIGVmZmVjdC5nZXQoKS51dWlkfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW1zLmFkZChzdHJlYW0udHlwZSwgZWZmZWN0RGVzY3MucmVsZWFzZSgpKTsKKyAgICAgICAgfQorICAgIH07CisgICAgbG9hZFByb2Nlc3NpbmdDaGFpbihyZXN1bHQucGFyc2VkQ29uZmlnLT5wcmVwcm9jZXNzLCBtSW5wdXRTb3VyY2VzKTsKKyAgICBsb2FkUHJvY2Vzc2luZ0NoYWluKHJlc3VsdC5wYXJzZWRDb25maWctPnBvc3Rwcm9jZXNzLCBtT3V0cHV0U3RyZWFtcyk7CisgICAgLy8gQ2FzdGluZyBmcm9tIHNzaXplX3QgdG8gc3RhdHVzX3QgaXMgcHJvYmFibHkgc2FmZSwgdGhlcmUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gMl4zMSBlcnJvcnMKKyAgICByZXR1cm4gcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQ7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEF1ZGlvRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCiB7CiAgICAgY25vZGUgKnJvb3Q7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaAppbmRleCAwYzc0ZDg3Li41OWQ1ZDE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKQEAgLTE1NSw3ICsxNTUsOCBAQAogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKTsKIAogICAgIC8vIFBhcnNlIGF1ZGlvX2VmZmVjdHMuY29uZgotICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdENvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKKyAgICBzdGF0dXNfdCBsb2FkQXVkaW9FZmZlY3RDb25maWcoY29uc3QgY2hhciAqcGF0aCk7IC8vIFRPRE86IGFkZCBsZWdhY3kgaW4gdGhlIG5hbWUKKyAgICBzdGF0dXNfdCBsb2FkQXVkaW9FZmZlY3RYbWxDb25maWcoKTsgLy8gVE9ETzogcmVtb3ZlICJYbWwiIGluIHRoZSBuYW1lCiAKICAgICAvLyBMb2FkIGFsbCBlZmZlY3RzIGRlc2NyaXB0b3JzIGluIGNvbmZpZ3VyYXRpb24gZmlsZQogICAgIHN0YXR1c190IGxvYWRFZmZlY3RzKGNub2RlICpyb290LCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGM0ZjYzNjcuLmI0MTc2MzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTE4NSwyMSArMTg1LDIxIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKGV2ZW50LCBjbGllbnRJbmZvLAogICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgc2Vzc2lvbiwgc291cmNlLAorICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKICAgICB9CiB9CkBAIC0yNjcsMTIgKzI2NywxMiBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDApIHsKLSAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgIH0KIH0KQEAgLTU0NCw4ICs1NDQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZGF0YS0+bUV2ZW50LCBkYXRhLT5tU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tU291cmNlLCAmZGF0YS0+bUNsaWVudENvbmZpZywgJmRhdGEtPm1EZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZGF0YS0+bUV2ZW50LCAmZGF0YS0+bUNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPm1DbGllbnRDb25maWcsICZkYXRhLT5tRGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1QYXRjaEhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKQEAgLTgxMCw3ICs4MTAsNyBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7CkBAIC04MTgsMTQgKzgxOCwxMyBAQAogICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFOwogICAgIFJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVEYXRhICpkYXRhID0gbmV3IFJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVEYXRhKCk7CiAgICAgZGF0YS0+bUV2ZW50ID0gZXZlbnQ7Ci0gICAgZGF0YS0+bVNlc3Npb24gPSBzZXNzaW9uOwotICAgIGRhdGEtPm1Tb3VyY2UgPSBzb3VyY2U7CisgICAgZGF0YS0+bUNsaWVudEluZm8gPSAqY2xpZW50SW5mbzsKICAgICBkYXRhLT5tQ2xpZW50Q29uZmlnID0gKmNsaWVudENvbmZpZzsKICAgICBkYXRhLT5tRGV2aWNlQ29uZmlnID0gKmRldmljZUNvbmZpZzsKICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaEhhbmRsZTsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gdXBkYXRlIGV2ZW50ICVkLCBzb3VyY2UgJWQiLAotICAgICAgICAgICAgZXZlbnQsIHNvdXJjZSk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGUgZXZlbnQgJWQsIHNvdXJjZSAlZCB1aWQgJXUiLAorICAgICAgICAgICAgZXZlbnQsIGNsaWVudEluZm8tPnNvdXJjZSwgY2xpZW50SW5mby0+dWlkKTsKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggMzU1NDJmMS4uMzhkNGIxNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yMjgsMTEgKzIyOCwxMSBAQAogCiAgICAgICAgICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgIHZvaWQgZG9PbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7Ci0gICAgICAgICAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgdm9pZCBkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogCiBwcml2YXRlOgpAQCAtMzA2LDggKzMwNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKQEAgLTQwNCw4ICs0MDQsNyBAQAogICAgICAgICBjbGFzcyBSZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgaW50IG1FdmVudDsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IG1Tb3VyY2U7CisgICAgICAgICAgICByZWNvcmRfY2xpZW50X2luZm9fdCBtQ2xpZW50SW5mbzsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ2xpZW50Q29uZmlnOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1EZXZpY2VDb25maWc7CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7CkBAIC01MTgsNyArNTE3LDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogCkBAIC01NDAsOCArNTM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggODc2YzY4NS4uZjNiYjM1YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC00MDQsNiArNDA0LDggQEAKICAgICB9IGVsc2UgewogICAgICAgICBkdW1wUmVjZW50KHJlc3VsdCwgdHNfc2luY2UsIG9ubHkpOwogICAgIH0KKyAgICBmcmVlKCh2b2lkKilvbmx5KTsKKyAgICBvbmx5PU5VTEw7CiAKIAogICAgIGlmIChjbGVhcikgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKaW5kZXggNmIzMGRiNi4uMmRhYTgyOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCkBAIC0xNyw3ICsxNyw2IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIE1lZGlhQ2FzU2VydmljZS5jcHAgXAogICAgIE1lZGlhRHJtU2VydmljZS5jcHAgXAogICAgIG1haW5fbWVkaWFkcm1zZXJ2ZXIuY3BwCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL0ZhY3RvcnlMb2FkZXIuaCBiL3NlcnZpY2VzL21lZGlhZHJtL0ZhY3RvcnlMb2FkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmMTExOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9GYWN0b3J5TG9hZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ0FTX0xPQURFUl9IXwotI2RlZmluZSBNRURJQV9DQVNfTE9BREVSX0hfCi0KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPG1lZGlhL1NoYXJlZExpYnJhcnkuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7Ci11c2luZyBuYW1lc3BhY2UgTWVkaWFDYXM7Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotY2xhc3MgRmFjdG9yeUxvYWRlciB7Ci1wdWJsaWM6Ci0gICAgRmFjdG9yeUxvYWRlcihjb25zdCBjaGFyICpuYW1lKSA6Ci0gICAgICAgIG1GYWN0b3J5KE5VTEwpLCBtQ3JlYXRlRmFjdG9yeUZ1bmNOYW1lKG5hbWUpIHt9Ci0KLSAgICB2aXJ0dWFsIH5GYWN0b3J5TG9hZGVyKCkgeyBjbG9zZUZhY3RvcnkoKTsgfQotCi0gICAgYm9vbCBmaW5kRmFjdG9yeUZvclNjaGVtZSgKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnkgPSBOVUxMLAotICAgICAgICAgICAgVCoqIGZhY3RvcnkgPSBOVUxMKTsKLQotICAgIGJvb2wgZW51bWVyYXRlUGx1Z2lucyh2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKTsKLQotcHJpdmF0ZToKLSAgICB0eXBlZGVmIFQqKCpDcmVhdGVGYWN0b3J5RnVuYykoKTsKLQotICAgIE11dGV4IG1NYXBMb2NrOwotICAgIFQqIG1GYWN0b3J5OwotICAgIGNvbnN0IGNoYXIgKm1DcmVhdGVGYWN0b3J5RnVuY05hbWU7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbUxpYnJhcnk7Ci0gICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgU3RyaW5nOD4gbUNBU3lzdGVtSWRUb0xpYnJhcnlQYXRoTWFwOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIHdwPFNoYXJlZExpYnJhcnk+ID4gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcDsKLQotICAgIGJvb2wgbG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJnBhdGgsCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKLSAgICAgICAgICAgIHNwPFNoYXJlZExpYnJhcnk+ICpsaWJyYXJ5LAotICAgICAgICAgICAgVCoqIGZhY3RvcnkpOwotCi0gICAgYm9vbCBxdWVyeVBsdWdpbnNGcm9tUGF0aCgKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJnBhdGgsCi0gICAgICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKTsKLQotICAgIGJvb2wgb3BlbkZhY3RvcnkoY29uc3QgU3RyaW5nOCAmcGF0aCk7Ci0gICAgdm9pZCBjbG9zZUZhY3RvcnkoKTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotYm9vbCBGYWN0b3J5TG9hZGVyPFQ+OjpmaW5kRmFjdG9yeUZvclNjaGVtZSgKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsIHNwPFNoYXJlZExpYnJhcnk+ICpsaWJyYXJ5LCBUKiogZmFjdG9yeSkgewotICAgIGlmIChsaWJyYXJ5ICE9IE5VTEwpIHsKLSAgICAgICAgbGlicmFyeS0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewotICAgICAgICAqZmFjdG9yeSA9IE5VTEw7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NYXBMb2NrKTsKLQotICAgIC8vIGZpcnN0IGNoZWNrIGNhY2hlCi0gICAgc3NpemVfdCBpbmRleCA9IG1DQVN5c3RlbUlkVG9MaWJyYXJ5UGF0aE1hcC5pbmRleE9mS2V5KENBX3N5c3RlbV9pZCk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgcmV0dXJuIGxvYWRGYWN0b3J5Rm9yU2NoZW1lRnJvbVBhdGgoCi0gICAgICAgICAgICAgICAgbUNBU3lzdGVtSWRUb0xpYnJhcnlQYXRoTWFwW2luZGV4XSwKLSAgICAgICAgICAgICAgICBDQV9zeXN0ZW1faWQsIGxpYnJhcnksIGZhY3RvcnkpOwotICAgIH0KLQotICAgIC8vIG5vIGx1Y2ssIGhhdmUgdG8gc2VhcmNoCi0gICAgU3RyaW5nOCBkaXJQYXRoKCIvc3lzdGVtL2xpYi9tZWRpYWNhcyIpOwotICAgIERJUiogcERpciA9IG9wZW5kaXIoZGlyUGF0aC5zdHJpbmcoKSk7Ci0KLSAgICBpZiAocERpciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBwbHVnaW4gZGlyZWN0b3J5ICVzIiwgZGlyUGF0aC5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgZGlyZW50KiBwRW50cnk7Ci0gICAgd2hpbGUgKChwRW50cnkgPSByZWFkZGlyKHBEaXIpKSkgewotICAgICAgICBTdHJpbmc4IHBsdWdpblBhdGggPSBkaXJQYXRoICsgIi8iICsgcEVudHJ5LT5kX25hbWU7Ci0gICAgICAgIGlmIChwbHVnaW5QYXRoLmdldFBhdGhFeHRlbnNpb24oKSA9PSAiLnNvIikgewotICAgICAgICAgICAgaWYgKGxvYWRGYWN0b3J5Rm9yU2NoZW1lRnJvbVBhdGgoCi0gICAgICAgICAgICAgICAgICAgIHBsdWdpblBhdGgsIENBX3N5c3RlbV9pZCwgbGlicmFyeSwgZmFjdG9yeSkpIHsKLSAgICAgICAgICAgICAgICBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXAuYWRkKENBX3N5c3RlbV9pZCwgcGx1Z2luUGF0aCk7Ci0gICAgICAgICAgICAgICAgY2xvc2VkaXIocERpcik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsb3NlZGlyKHBEaXIpOwotCi0gICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIHBsdWdpbiIpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OmVudW1lcmF0ZVBsdWdpbnMoCi0gICAgICAgIHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpIHsKLSAgICBBTE9HSSgiZW51bWVyYXRlUGx1Z2lucyIpOwotCi0gICAgcmVzdWx0cy0+Y2xlYXIoKTsKLQotICAgIFN0cmluZzggZGlyUGF0aCgiL3N5c3RlbS9saWIvbWVkaWFjYXMiKTsKLSAgICBESVIqIHBEaXIgPSBvcGVuZGlyKGRpclBhdGguc3RyaW5nKCkpOwotCi0gICAgaWYgKHBEaXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gcGx1Z2luIGRpcmVjdG9yeSAlcyIsIGRpclBhdGguc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NYXBMb2NrKTsKLQotICAgIHN0cnVjdCBkaXJlbnQqIHBFbnRyeTsKLSAgICB3aGlsZSAoKHBFbnRyeSA9IHJlYWRkaXIocERpcikpKSB7Ci0gICAgICAgIFN0cmluZzggcGx1Z2luUGF0aCA9IGRpclBhdGggKyAiLyIgKyBwRW50cnktPmRfbmFtZTsKLSAgICAgICAgaWYgKHBsdWdpblBhdGguZ2V0UGF0aEV4dGVuc2lvbigpID09ICIuc28iKSB7Ci0gICAgICAgICAgICBxdWVyeVBsdWdpbnNGcm9tUGF0aChwbHVnaW5QYXRoLCByZXN1bHRzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OmxvYWRGYWN0b3J5Rm9yU2NoZW1lRnJvbVBhdGgoCi0gICAgICAgIGNvbnN0IFN0cmluZzggJnBhdGgsIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICBzcDxTaGFyZWRMaWJyYXJ5PiAqbGlicmFyeSwgVCoqIGZhY3RvcnkpIHsKLSAgICBjbG9zZUZhY3RvcnkoKTsKLQotICAgIGlmICghb3BlbkZhY3RvcnkocGF0aCkgfHwgIW1GYWN0b3J5LT5pc1N5c3RlbUlkU3VwcG9ydGVkKENBX3N5c3RlbV9pZCkpIHsKLSAgICAgICAgY2xvc2VGYWN0b3J5KCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobGlicmFyeSAhPSBOVUxMKSB7Ci0gICAgICAgICpsaWJyYXJ5ID0gbUxpYnJhcnk7Ci0gICAgfQotICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKLSAgICAgICAgKmZhY3RvcnkgPSBtRmFjdG9yeTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotYm9vbCBGYWN0b3J5TG9hZGVyPFQ+OjpxdWVyeVBsdWdpbnNGcm9tUGF0aCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwgdmVjdG9yPFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yPiogcmVzdWx0cykgewotICAgIGNsb3NlRmFjdG9yeSgpOwotCi0gICAgdmVjdG9yPENhc1BsdWdpbkRlc2NyaXB0b3I+IGRlc2NyaXB0b3JzOwotICAgIGlmICghb3BlbkZhY3RvcnkocGF0aCkgfHwgbUZhY3RvcnktPnF1ZXJ5UGx1Z2lucygmZGVzY3JpcHRvcnMpICE9IE9LKSB7Ci0gICAgICAgIGNsb3NlRmFjdG9yeSgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yIChhdXRvIGl0ID0gZGVzY3JpcHRvcnMuYmVnaW4oKTsgaXQgIT0gZGVzY3JpcHRvcnMuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgcmVzdWx0cy0+cHVzaF9iYWNrKFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIGl0LT5DQV9zeXN0ZW1faWQsIGl0LT5uYW1lKSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6b3BlbkZhY3RvcnkoY29uc3QgU3RyaW5nOCAmcGF0aCkgewotICAgIC8vIGdldCBzdHJvbmcgcG9pbnRlciB0byBvcGVuIHNoYXJlZCBsaWJyYXJ5Ci0gICAgc3NpemVfdCBpbmRleCA9IG1MaWJyYXJ5UGF0aFRvT3BlbkxpYnJhcnlNYXAuaW5kZXhPZktleShwYXRoKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBtTGlicmFyeSA9IG1MaWJyYXJ5UGF0aFRvT3BlbkxpYnJhcnlNYXBbaW5kZXhdLnByb21vdGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbmRleCA9IG1MaWJyYXJ5UGF0aFRvT3BlbkxpYnJhcnlNYXAuYWRkKHBhdGgsIE5VTEwpOwotICAgIH0KLQotICAgIGlmICghbUxpYnJhcnkuZ2V0KCkpIHsKLSAgICAgICAgbUxpYnJhcnkgPSBuZXcgU2hhcmVkTGlicmFyeShwYXRoKTsKLSAgICAgICAgaWYgKCEqbUxpYnJhcnkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1MaWJyYXJ5UGF0aFRvT3BlbkxpYnJhcnlNYXAucmVwbGFjZVZhbHVlQXQoaW5kZXgsIG1MaWJyYXJ5KTsKLSAgICB9Ci0KLSAgICBDcmVhdGVGYWN0b3J5RnVuYyBjcmVhdGVGYWN0b3J5ID0KLSAgICAgICAgKENyZWF0ZUZhY3RvcnlGdW5jKW1MaWJyYXJ5LT5sb29rdXAobUNyZWF0ZUZhY3RvcnlGdW5jTmFtZSk7Ci0gICAgaWYgKGNyZWF0ZUZhY3RvcnkgPT0gTlVMTCB8fCAobUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5KCkpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci12b2lkIEZhY3RvcnlMb2FkZXI8VD46OmNsb3NlRmFjdG9yeSgpIHsKLSAgICBkZWxldGUgbUZhY3Rvcnk7Ci0gICAgbUZhY3RvcnkgPSBOVUxMOwotICAgIG1MaWJyYXJ5LmNsZWFyKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIE1FRElBX0NBU19MT0FERVJfSF8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYUNhc1NlcnZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTExMjgzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDYXNTZXJ2aWNlIgotCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9DYXNBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9jYXMvRGVzY3JhbWJsZXJBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9DYXNJbXBsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGVzY3JhbWJsZXJJbXBsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotI2luY2x1ZGUgIk1lZGlhQ2FzU2VydmljZS5oIgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhc0xpc3RlbmVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy9zdGF0aWMKLXZvaWQgTWVkaWFDYXNTZXJ2aWNlOjppbnN0YW50aWF0ZSgpIHsKLSAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZSgKLSAgICAgICAgICAgIFN0cmluZzE2KCJtZWRpYS5jYXMiKSwgbmV3IE1lZGlhQ2FzU2VydmljZSgpKTsKLX0KLQotTWVkaWFDYXNTZXJ2aWNlOjpNZWRpYUNhc1NlcnZpY2UoKSA6Ci0gICAgbUNhc0xvYWRlcihuZXcgRmFjdG9yeUxvYWRlcjxDYXNGYWN0b3J5PigiY3JlYXRlQ2FzRmFjdG9yeSIpKSwKLSAgICBtRGVzY3JhbWJsZXJMb2FkZXIobmV3IEZhY3RvcnlMb2FkZXI8RGVzY3JhbWJsZXJGYWN0b3J5PigKLSAgICAgICAgICAgICJjcmVhdGVEZXNjcmFtYmxlckZhY3RvcnkiKSkgewotfQotCi1NZWRpYUNhc1NlcnZpY2U6On5NZWRpYUNhc1NlcnZpY2UoKSB7Ci0gICAgZGVsZXRlIG1DYXNMb2FkZXI7Ci0gICAgZGVsZXRlIG1EZXNjcmFtYmxlckxvYWRlcjsKLX0KLQotU3RhdHVzIE1lZGlhQ2FzU2VydmljZTo6ZW51bWVyYXRlUGx1Z2lucygKLSAgICAgICAgdmVjdG9yPFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yPiogcmVzdWx0cykgewotICAgIEFMT0dWKCJlbnVtZXJhdGVQbHVnaW5zIik7Ci0KLSAgICBtQ2FzTG9hZGVyLT5lbnVtZXJhdGVQbHVnaW5zKHJlc3VsdHMpOwotCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIE1lZGlhQ2FzU2VydmljZTo6aXNTeXN0ZW1JZFN1cHBvcnRlZCgKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsIGJvb2wqIHJlc3VsdCkgewotICAgIEFMT0dWKCJpc1N5c3RlbUlkU3VwcG9ydGVkOiBDQV9zeXN0ZW1faWQ9JWQiLCBDQV9zeXN0ZW1faWQpOwotCi0gICAgKnJlc3VsdCA9IG1DYXNMb2FkZXItPmZpbmRGYWN0b3J5Rm9yU2NoZW1lKENBX3N5c3RlbV9pZCk7Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjpjcmVhdGVQbHVnaW4oCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICBjb25zdCBzcDxJQ2FzTGlzdGVuZXI+ICZsaXN0ZW5lciwKLSAgICAgICAgc3A8SUNhcz4qIHJlc3VsdCkgewotICAgIEFMT0dWKCJjcmVhdGVQbHVnaW46IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICByZXN1bHQtPmNsZWFyKCk7Ci0KLSAgICBDYXNGYWN0b3J5ICpmYWN0b3J5OwotICAgIHNwPFNoYXJlZExpYnJhcnk+IGxpYnJhcnk7Ci0gICAgaWYgKG1DYXNMb2FkZXItPmZpbmRGYWN0b3J5Rm9yU2NoZW1lKENBX3N5c3RlbV9pZCwgJmxpYnJhcnksICZmYWN0b3J5KSkgewotICAgICAgICBDYXNQbHVnaW4gKnBsdWdpbiA9IE5VTEw7Ci0gICAgICAgIHNwPENhc0ltcGw+IGNhc0ltcGwgPSBuZXcgQ2FzSW1wbChsaXN0ZW5lcik7Ci0gICAgICAgIGlmIChmYWN0b3J5LT5jcmVhdGVQbHVnaW4oQ0Ffc3lzdGVtX2lkLCAodWludDY0X3QpY2FzSW1wbC5nZXQoKSwKLSAgICAgICAgICAgICAgICAmQ2FzSW1wbDo6T25FdmVudCwgJnBsdWdpbikgPT0gT0sgJiYgcGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNhc0ltcGwtPmluaXQobGlicmFyeSwgcGx1Z2luKTsKLSAgICAgICAgICAgICpyZXN1bHQgPSBjYXNJbXBsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIE1lZGlhQ2FzU2VydmljZTo6aXNEZXNjcmFtYmxlclN1cHBvcnRlZCgKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsIGJvb2wqIHJlc3VsdCkgewotICAgIEFMT0dWKCJpc0Rlc2NyYW1ibGVyU3VwcG9ydGVkOiBDQV9zeXN0ZW1faWQ9JWQiLCBDQV9zeXN0ZW1faWQpOwotCi0gICAgKnJlc3VsdCA9IG1EZXNjcmFtYmxlckxvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBNZWRpYUNhc1NlcnZpY2U6OmNyZWF0ZURlc2NyYW1ibGVyKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgc3A8SURlc2NyYW1ibGVyPiogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImNyZWF0ZURlc2NyYW1ibGVyOiBDQV9zeXN0ZW1faWQ9JWQiLCBDQV9zeXN0ZW1faWQpOwotCi0gICAgcmVzdWx0LT5jbGVhcigpOwotCi0gICAgRGVzY3JhbWJsZXJGYWN0b3J5ICpmYWN0b3J5OwotICAgIHNwPFNoYXJlZExpYnJhcnk+IGxpYnJhcnk7Ci0gICAgaWYgKG1EZXNjcmFtYmxlckxvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoCi0gICAgICAgICAgICBDQV9zeXN0ZW1faWQsICZsaWJyYXJ5LCAmZmFjdG9yeSkpIHsKLSAgICAgICAgRGVzY3JhbWJsZXJQbHVnaW4gKnBsdWdpbiA9IE5VTEw7Ci0gICAgICAgIGlmIChmYWN0b3J5LT5jcmVhdGVQbHVnaW4oQ0Ffc3lzdGVtX2lkLCAmcGx1Z2luKSA9PSBPSwotICAgICAgICAgICAgICAgICYmIHBsdWdpbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcmVzdWx0ID0gbmV3IERlc2NyYW1ibGVySW1wbChsaWJyYXJ5LCBwbHVnaW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYUNhc1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4MjhmMi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYUNhc1NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0NBU19TRVJWSUNFX0hfCi0jZGVmaW5lIE1FRElBX0NBU19TRVJWSUNFX0hfCi0KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuTWVkaWFDYXNTZXJ2aWNlLmg+Ci0KLSNpbmNsdWRlICJGYWN0b3J5TG9hZGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotc3RydWN0IENhc0ZhY3Rvcnk7Ci1zdHJ1Y3QgRGVzY3JhbWJsZXJGYWN0b3J5OwotCi1jbGFzcyBNZWRpYUNhc1NlcnZpY2UgOiBwdWJsaWMgQm5NZWRpYUNhc1NlcnZpY2UgewotcHVibGljOgotICAgIHN0YXRpYyB2b2lkIGluc3RhbnRpYXRlKCk7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBlbnVtZXJhdGVQbHVnaW5zKAotICAgICAgICAgICAgdmVjdG9yPFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yPiogcmVzdWx0cykgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBpc1N5c3RlbUlkU3VwcG9ydGVkKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsIGJvb2wqIHJlc3VsdCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBjcmVhdGVQbHVnaW4oCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKLSAgICAgICAgICAgIGNvbnN0IHNwPElDYXNMaXN0ZW5lcj4gJmxpc3RlbmVyLAotICAgICAgICAgICAgc3A8SUNhcz4qIHJlc3VsdCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBpc0Rlc2NyYW1ibGVyU3VwcG9ydGVkKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsIGJvb2wqIHJlc3VsdCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBjcmVhdGVEZXNjcmFtYmxlcigKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBzcDxJRGVzY3JhbWJsZXI+KiByZXN1bHQpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIEZhY3RvcnlMb2FkZXI8Q2FzRmFjdG9yeT4gKm1DYXNMb2FkZXI7Ci0gICAgRmFjdG9yeUxvYWRlcjxEZXNjcmFtYmxlckZhY3Rvcnk+ICptRGVzY3JhbWJsZXJMb2FkZXI7Ci0KLSAgICBNZWRpYUNhc1NlcnZpY2UoKTsKLSAgICB2aXJ0dWFsIH5NZWRpYUNhc1NlcnZpY2UoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIE1FRElBX0NBU19TRVJWSUNFX0hfCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9tYWluX21lZGlhZHJtc2VydmVyLmNwcCBiL3NlcnZpY2VzL21lZGlhZHJtL21haW5fbWVkaWFkcm1zZXJ2ZXIuY3BwCmluZGV4IGI2ODVhZTAuLmI3NjdiOGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL21haW5fbWVkaWFkcm1zZXJ2ZXIuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhZHJtL21haW5fbWVkaWFkcm1zZXJ2ZXIuY3BwCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlICJNZWRpYURybVNlcnZpY2UuaCIKLSNpbmNsdWRlICJNZWRpYUNhc1NlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTM5LDcgKzM4LDYgQEAKICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CiAgICAgQUxPR0koIlNlcnZpY2VNYW5hZ2VyOiAlcCIsIHNtLmdldCgpKTsKICAgICBNZWRpYURybVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7Ci0gICAgTWVkaWFDYXNTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvT1dORVJTIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDUxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9PV05FUlMKQEAgLTAsMCArMSBAQAorcGhpbGJ1cmtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vQW5kcm9pZC5tayBiL3NlcnZpY2VzL3JhZGlvL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNTBkYzMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBSYWRpb1NlcnZpY2UuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliYmluZGVyIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmF1ZGlvY2xpZW50IFwKLSAgICBsaWJoYXJkd2FyZSBcCi0gICAgbGlicmFkaW8gXAotICAgIGxpYnJhZGlvX21ldGFkYXRhCi0KLWlmZXEgKCQoVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwpLHRydWUpCi0jIGxpYmhhcmR3YXJlIGNvbmZpZ3VyYXRpb24KLUxPQ0FMX1NSQ19GSUxFUyArPSAgICAgICAgICAgICAgIFwKLSAgICBSYWRpb0hhbExlZ2FjeS5jcHAKLWVsc2UKLSMgVHJlYmxlIGNvbmZpZ3VyYXRpb24KLQotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICBIaWRsVXRpbHMuY3BwIFwKLSAgICBSYWRpb0hhbEhpZGwuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAotICAgIGxpYmh3YmluZGVyIFwKLSAgICBsaWJoaWRsYmFzZSBcCi0gICAgbGliaGlkbHRyYW5zcG9ydCBcCi0gICAgbGliYmFzZSBcCi0gICAgbGliYXVkaW9oYWwgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuYnJvYWRjYXN0cmFkaW9AMS4wCi1lbmRpZgotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnJhZGlvc2VydmljZQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuY3BwIGIvc2VydmljZXMvcmFkaW8vSGlkbFV0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg5NTM3Ny4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2RlZmluZSBMT0dfVEFHICJIaWRsVXRpbHMiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvX21ldGFkYXRhLmg+Ci0KLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6Ok1ldGFkYXRhVHlwZTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6QmFuZDsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6RGVlbXBoYXNpczsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UmRzOwotCi0vL3N0YXRpYwotaW50IEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChSZXN1bHQgcmVzdWx0KQotewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzoKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6Ci0gICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OlRJTUVPVVQ6Ci0gICAgICAgICAgICByZXR1cm4gLUVUSU1FRE9VVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLX0KLQotCi0vL3N0YXRpYwotdm9pZCBIaWRsVXRpbHM6OmNvbnZlcnRCYW5kQ29uZmlnVG9IYWwoQmFuZENvbmZpZyAqaGFsQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykKLXsKLSAgICBoYWxDb25maWctPnR5cGUgPSBzdGF0aWNfY2FzdDxCYW5kPihjb25maWctPnR5cGUpOwotICAgIGhhbENvbmZpZy0+YW50ZW5uYUNvbm5lY3RlZCA9IGNvbmZpZy0+YW50ZW5uYV9jb25uZWN0ZWQ7Ci0gICAgaGFsQ29uZmlnLT5sb3dlckxpbWl0ID0gY29uZmlnLT5sb3dlcl9saW1pdDsKLSAgICBoYWxDb25maWctPnVwcGVyTGltaXQgPSBjb25maWctPnVwcGVyX2xpbWl0OwotICAgIGhhbENvbmZpZy0+c3BhY2luZ3Muc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVuc2lnbmVkIGludCAqPigmY29uZmlnLT5zcGFjaW5nc1swXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm51bV9zcGFjaW5ncyAqIHNpemVvZih1aW50MzJfdCkpOwotICAgIC8vIEZJWE1FOiB0cmFuc2ZlciBidWZmZXIgb3duZXJzaGlwLiBzaG91bGQgaGF2ZSBhIG1ldGhvZCBmb3IgdGhhdCBpbiBoaWRsX3ZlYwotICAgIGhhbENvbmZpZy0+c3BhY2luZ3MucmVzaXplKGNvbmZpZy0+bnVtX3NwYWNpbmdzKTsKLQotICAgIGlmIChoYWxDb25maWctPnR5cGUgPT0gQmFuZDo6Rk0pIHsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0uZGVlbXBoYXNpcyA9IHN0YXRpY19jYXN0PERlZW1waGFzaXM+KGNvbmZpZy0+Zm0uZGVlbXBoYXNpcyk7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLnN0ZXJlbyA9IGNvbmZpZy0+Zm0uc3RlcmVvOwotICAgICAgICBoYWxDb25maWctPmV4dC5mbS5yZHMgPSBzdGF0aWNfY2FzdDxSZHM+KGNvbmZpZy0+Zm0ucmRzKTsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0udGEgPSBjb25maWctPmZtLnRhOwotICAgICAgICBoYWxDb25maWctPmV4dC5mbS5hZiA9IGNvbmZpZy0+Zm0uYWY7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLmVhID0gY29uZmlnLT5mbS5lYTsKLSAgICB9IGVsc2UgewotICAgICAgICBoYWxDb25maWctPmV4dC5hbS5zdGVyZW8gPSBjb25maWctPmFtLnN0ZXJlbzsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi12b2lkIEhpZGxVdGlsczo6Y29udmVydFByb3BlcnRpZXNGcm9tSGFsKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3BlcnRpZXMgKmhhbFByb3BlcnRpZXMpCi17Ci0gICAgcHJvcGVydGllcy0+Y2xhc3NfaWQgPSBzdGF0aWNfY2FzdDxyYWRpb19jbGFzc190PihoYWxQcm9wZXJ0aWVzLT5jbGFzc0lkKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPmltcGxlbWVudG9yLCBoYWxQcm9wZXJ0aWVzLT5pbXBsZW1lbnRvci5jX3N0cigpLCBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5wcm9kdWN0LCBoYWxQcm9wZXJ0aWVzLT5wcm9kdWN0LmNfc3RyKCksIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnZlcnNpb24sIGhhbFByb3BlcnRpZXMtPnZlcnNpb24uY19zdHIoKSwgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+c2VyaWFsLCBoYWxQcm9wZXJ0aWVzLT5zZXJpYWwuY19zdHIoKSwgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHByb3BlcnRpZXMtPm51bV90dW5lcnMgPSBoYWxQcm9wZXJ0aWVzLT5udW1UdW5lcnM7Ci0gICAgcHJvcGVydGllcy0+bnVtX2F1ZGlvX3NvdXJjZXMgPSBoYWxQcm9wZXJ0aWVzLT5udW1BdWRpb1NvdXJjZXM7Ci0gICAgcHJvcGVydGllcy0+c3VwcG9ydHNfY2FwdHVyZSA9IGhhbFByb3BlcnRpZXMtPnN1cHBvcnRzQ2FwdHVyZTsKLSAgICBwcm9wZXJ0aWVzLT5udW1fYmFuZHMgPSBoYWxQcm9wZXJ0aWVzLT5iYW5kcy5zaXplKCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbFByb3BlcnRpZXMtPmJhbmRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnZlcnRCYW5kQ29uZmlnRnJvbUhhbCgmcHJvcGVydGllcy0+YmFuZHNbaV0sICZoYWxQcm9wZXJ0aWVzLT5iYW5kc1tpXSk7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBIaWRsVXRpbHM6OmNvbnZlcnRCYW5kQ29uZmlnRnJvbUhhbChyYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYW5kQ29uZmlnICpoYWxDb25maWcpCi17Ci0gICAgY29uZmlnLT50eXBlID0gc3RhdGljX2Nhc3Q8cmFkaW9fYmFuZF90PihoYWxDb25maWctPnR5cGUpOwotICAgIGNvbmZpZy0+YW50ZW5uYV9jb25uZWN0ZWQgPSBoYWxDb25maWctPmFudGVubmFDb25uZWN0ZWQ7Ci0gICAgY29uZmlnLT5sb3dlcl9saW1pdCA9IGhhbENvbmZpZy0+bG93ZXJMaW1pdDsKLSAgICBjb25maWctPnVwcGVyX2xpbWl0ID0gaGFsQ29uZmlnLT51cHBlckxpbWl0OwotICAgIGNvbmZpZy0+bnVtX3NwYWNpbmdzID0gaGFsQ29uZmlnLT5zcGFjaW5ncy5zaXplKCk7Ci0gICAgaWYgKGNvbmZpZy0+bnVtX3NwYWNpbmdzID4gUkFESU9fTlVNX1NQQUNJTkdTX01BWCkgewotICAgICAgICBjb25maWctPm51bV9zcGFjaW5ncyA9IFJBRElPX05VTV9TUEFDSU5HU19NQVg7Ci0gICAgfQotICAgIG1lbWNweShjb25maWctPnNwYWNpbmdzLCBoYWxDb25maWctPnNwYWNpbmdzLmRhdGEoKSwKLSAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSAqIGNvbmZpZy0+bnVtX3NwYWNpbmdzKTsKLQotICAgIGlmIChoYWxDb25maWctPnR5cGUgPT0gQmFuZDo6Rk0pIHsKLSAgICAgICAgY29uZmlnLT5mbS5kZWVtcGhhc2lzID0gc3RhdGljX2Nhc3Q8cmFkaW9fZGVlbXBoYXNpc190PihoYWxDb25maWctPmV4dC5mbS5kZWVtcGhhc2lzKTsKLSAgICAgICAgY29uZmlnLT5mbS5zdGVyZW8gPSBoYWxDb25maWctPmV4dC5mbS5zdGVyZW87Ci0gICAgICAgIGNvbmZpZy0+Zm0ucmRzID0gc3RhdGljX2Nhc3Q8cmFkaW9fcmRzX3Q+KGhhbENvbmZpZy0+ZXh0LmZtLnJkcyk7Ci0gICAgICAgIGNvbmZpZy0+Zm0udGEgPSBoYWxDb25maWctPmV4dC5mbS50YTsKLSAgICAgICAgY29uZmlnLT5mbS5hZiA9IGhhbENvbmZpZy0+ZXh0LmZtLmFmOwotICAgICAgICBjb25maWctPmZtLmVhID0gaGFsQ29uZmlnLT5leHQuZm0uZWE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29uZmlnLT5hbS5zdGVyZW8gPSBoYWxDb25maWctPmV4dC5hbS5zdGVyZW87Ci0gICAgfQotfQotCi0KLS8vc3RhdGljCi12b2lkIEhpZGxVdGlsczo6Y29udmVydFByb2dyYW1JbmZvRnJvbUhhbChyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1JbmZvICpoYWxJbmZvKQotewotICAgIGluZm8tPmNoYW5uZWwgPSBoYWxJbmZvLT5jaGFubmVsOwotICAgIGluZm8tPnN1Yl9jaGFubmVsID0gaGFsSW5mby0+c3ViQ2hhbm5lbDsKLSAgICBpbmZvLT50dW5lZCA9IGhhbEluZm8tPnR1bmVkOwotICAgIGluZm8tPnN0ZXJlbyA9IGhhbEluZm8tPnN0ZXJlbzsKLSAgICBpbmZvLT5kaWdpdGFsID0gaGFsSW5mby0+ZGlnaXRhbDsKLSAgICBpbmZvLT5zaWduYWxfc3RyZW5ndGggPSBoYWxJbmZvLT5zaWduYWxTdHJlbmd0aDsKLSAgICBjb252ZXJ0TWV0YURhdGFGcm9tSGFsKCZpbmZvLT5tZXRhZGF0YSwgaGFsSW5mby0+bWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxJbmZvLT5jaGFubmVsLCBoYWxJbmZvLT5zdWJDaGFubmVsKTsKLX0KLQotLy8gVE9ETyh0d2FzaWxjenlrKTogZHJvcCB1bm5lY2Vzc2FyeSBjaGFubmVsIGluZm8KLS8vc3RhdGljCi12b2lkIEhpZGxVdGlsczo6Y29udmVydE1ldGFEYXRhRnJvbUhhbChyYWRpb19tZXRhZGF0YV90ICoqbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxNZXRhRGF0YT4mIGhhbE1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbCBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1YkNoYW5uZWwgX191bnVzZWQpCi17Ci0KLSAgICBpZiAobWV0YWRhdGEgPT0gbnVsbHB0ciB8fCAqbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiZGVzdGluYXRpb24gbWV0YWRhdGEgYnVmZmVyIGlzIGEgbnVsbHB0ciIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsTWV0YWRhdGEuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcmFkaW9fbWV0YWRhdGFfa2V5X3Qga2V5ID0gc3RhdGljX2Nhc3Q8cmFkaW9fbWV0YWRhdGFfa2V5X3Q+KGhhbE1ldGFkYXRhW2ldLmtleSk7Ci0gICAgICAgIHJhZGlvX21ldGFkYXRhX3R5cGVfdCB0eXBlID0gc3RhdGljX2Nhc3Q8cmFkaW9fbWV0YWRhdGFfa2V5X3Q+KGhhbE1ldGFkYXRhW2ldLnR5cGUpOwotICAgICAgICByYWRpb19tZXRhZGF0YV9jbG9ja190IGNsb2NrOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIFJBRElPX01FVEFEQVRBX1RZUEVfSU5UOgotICAgICAgICAgICAgcmFkaW9fbWV0YWRhdGFfYWRkX2ludChtZXRhZGF0YSwga2V5LCBoYWxNZXRhZGF0YVtpXS5pbnRWYWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSQURJT19NRVRBREFUQV9UWVBFX1RFWFQ6Ci0gICAgICAgICAgICByYWRpb19tZXRhZGF0YV9hZGRfdGV4dChtZXRhZGF0YSwga2V5LCBoYWxNZXRhZGF0YVtpXS5zdHJpbmdWYWx1ZS5jX3N0cigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBRElPX01FVEFEQVRBX1RZUEVfUkFXOgotICAgICAgICAgICAgcmFkaW9fbWV0YWRhdGFfYWRkX3JhdyhtZXRhZGF0YSwga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxNZXRhZGF0YVtpXS5yYXdWYWx1ZS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbE1ldGFkYXRhW2ldLnJhd1ZhbHVlLnNpemUoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSQURJT19NRVRBREFUQV9UWVBFX0NMT0NLOgotICAgICAgICAgICAgY2xvY2sudXRjX3NlY29uZHNfc2luY2VfZXBvY2ggPQotICAgICAgICAgICAgICAgICAgICBoYWxNZXRhZGF0YVtpXS5jbG9ja1ZhbHVlLnV0Y1NlY29uZHNTaW5jZUVwb2NoOwotICAgICAgICAgICAgY2xvY2sudGltZXpvbmVfb2Zmc2V0X2luX21pbnV0ZXMgPQotICAgICAgICAgICAgICAgICAgICBoYWxNZXRhZGF0YVtpXS5jbG9ja1ZhbHVlLnRpbWV6b25lT2Zmc2V0SW5NaW51dGVzOwotICAgICAgICAgICAgcmFkaW9fbWV0YWRhdGFfYWRkX2Nsb2NrKG1ldGFkYXRhLCBrZXksICZjbG9jayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCIlcyBpbnZhbGlkIG1ldGFkYXRhIHR5cGUgJXUiLF9fRlVOQ1RJT05fXywgaGFsTWV0YWRhdGFbaV0udHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5oIGIvc2VydmljZXMvcmFkaW8vSGlkbFV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NzEwNjAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vSGlkbFV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfSElETF9VVElMU19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfVVRJTFNfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9icm9hZGNhc3RyYWRpby8xLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UmVzdWx0OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpQcm9wZXJ0aWVzOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpCYW5kQ29uZmlnOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpQcm9ncmFtSW5mbzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6TWV0YURhdGE7Ci0KLWNsYXNzIEhpZGxVdGlscyB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIGludCBjb252ZXJ0SGFsUmVzdWx0KFJlc3VsdCByZXN1bHQpOwotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRCYW5kQ29uZmlnRnJvbUhhbChyYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYW5kQ29uZmlnICpoYWxDb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRQcm9wZXJ0aWVzRnJvbUhhbChyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9wZXJ0aWVzICpoYWxQcm9wZXJ0aWVzKTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0QmFuZENvbmZpZ1RvSGFsKEJhbmRDb25maWcgKmhhbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwocmFkaW9fcHJvZ3JhbV9pbmZvX3QgKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtSW5mbyAqaGFsSW5mbyk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydE1ldGFEYXRhRnJvbUhhbChyYWRpb19tZXRhZGF0YV90ICoqbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxNZXRhRGF0YT4mIGhhbE1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1YkNoYW5uZWwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX1VUSUxTX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL09XTkVSUyBiL3NlcnZpY2VzL3JhZGlvL09XTkVSUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5NTQ5YS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9PV05FUlMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWVsYXVyZW50QGdvb2dsZS5jb20KLWh1bmdhQGdvb2dsZS5jb20KLXR3YXNpbGN6eWtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmNwcCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MzcyNzUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJSYWRpb0hhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vUmFkaW9NZXRhZGF0YVdyYXBwZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC9JQnJvYWRjYXN0UmFkaW9GYWN0b3J5Lmg+Ci0KLSNpbmNsdWRlICJSYWRpb0hhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OklCcm9hZGNhc3RSYWRpb0ZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkNsYXNzOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpEaXJlY3Rpb247Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlByb3BlcnRpZXM7Ci0KLQotLyogc3RhdGljICovCi1zcDxSYWRpb0ludGVyZmFjZT4gUmFkaW9JbnRlcmZhY2U6OmNvbm5lY3RNb2R1bGUocmFkaW9fY2xhc3NfdCBjbGFzc0lkKQotewotICAgIHJldHVybiBuZXcgUmFkaW9IYWxIaWRsKGNsYXNzSWQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpnZXRQcm9wZXJ0aWVzKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICBzcDxJQnJvYWRjYXN0UmFkaW8+IG1vZHVsZSA9IGdldFNlcnZpY2UoKTsKLSAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIFByb3BlcnRpZXMgaGFsUHJvcGVydGllczsKLSAgICBSZXN1bHQgaGFsUmVzdWx0ID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IGhpZGxSZXR1cm4gPQotICAgICAgICAgICAgbW9kdWxlLT5nZXRQcm9wZXJ0aWVzKFsmXShSZXN1bHQgcmVzdWx0LCBjb25zdCBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFJlc3VsdCA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgaWYgKGhhbFJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIEhpZGxVdGlsczo6Y29udmVydFByb3BlcnRpZXNGcm9tSGFsKHByb3BlcnRpZXMsICZoYWxQcm9wZXJ0aWVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoYWxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpvcGVuVHVuZXIoY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgc3A8SUJyb2FkY2FzdFJhZGlvPiBtb2R1bGUgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBzcDxUdW5lcj4gdHVuZXJJbXBsID0gbmV3IFR1bmVyKGNhbGxiYWNrLCB0aGlzKTsKLQotICAgIEJhbmRDb25maWcgaGFsQ29uZmlnOwotICAgIFJlc3VsdCBoYWxSZXN1bHQgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBzcDxJVHVuZXI+IGhhbFR1bmVyOwotCi0gICAgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7Ci0gICAgUmV0dXJuPHZvaWQ+IGhpZGxSZXR1cm4gPQotICAgICAgICAgICAgbW9kdWxlLT5vcGVuVHVuZXIoaGFsQ29uZmlnLCBhdWRpbywgdHVuZXJJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IHNwPElUdW5lcj4mIHR1bmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFJlc3VsdCA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYWxUdW5lciA9IHR1bmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICBpZiAoaGFsUmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgdHVuZXJJbXBsLT5zZXRIYWxUdW5lcihoYWxUdW5lcik7Ci0gICAgICAgIHR1bmVyID0gdHVuZXJJbXBsOwotICAgIH0KLQotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGFsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6Y2xvc2VUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKQotewotICAgIHNwPFR1bmVyPiB0dW5lckltcGwgPSBzdGF0aWNfY2FzdDxUdW5lciAqPih0dW5lci5nZXQoKSk7Ci0gICAgc3A8SVR1bmVyPiBjbGVhclR1bmVyOwotICAgIHR1bmVySW1wbC0+c2V0SGFsVHVuZXIoY2xlYXJUdW5lcik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVJhZGlvSGFsSGlkbDo6UmFkaW9IYWxIaWRsKHJhZGlvX2NsYXNzX3QgY2xhc3NJZCkKLSAgICA6IG1DbGFzc0lkKGNsYXNzSWQpCi17Ci19Ci0KLVJhZGlvSGFsSGlkbDo6flJhZGlvSGFsSGlkbCgpCi17Ci19Ci0KLXNwPElCcm9hZGNhc3RSYWRpbz4gUmFkaW9IYWxIaWRsOjpnZXRTZXJ2aWNlKCkKLXsKLSAgICBpZiAobUhhbE1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHNwPElCcm9hZGNhc3RSYWRpb0ZhY3Rvcnk+IGZhY3RvcnkgPSBJQnJvYWRjYXN0UmFkaW9GYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChmYWN0b3J5ICE9IDApIHsKLSAgICAgICAgICAgIGZhY3RvcnktPmNvbm5lY3RNb2R1bGUoc3RhdGljX2Nhc3Q8Q2xhc3M+KG1DbGFzc0lkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHJldHZhbCwgY29uc3QgOjphbmRyb2lkOjpzcDxJQnJvYWRjYXN0UmFkaW8+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgbUhhbE1vZHVsZSA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiJXMgT1VUIG1vZHVsZSAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbE1vZHVsZS5nZXQoKSk7Ci0gICAgcmV0dXJuIG1IYWxNb2R1bGU7Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpjbGVhclNlcnZpY2UoKQotewotICAgIEFMT0dWKCIlcyBJTiBtb2R1bGUgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxNb2R1bGUuZ2V0KCkpOwotICAgIG1IYWxNb2R1bGUuY2xlYXIoKTsKLX0KLQotCi1pbnQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6c2V0Q29uZmlndXJhdGlvbihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0KLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIEJhbmRDb25maWcgaGFsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOwotCi0gICAgUmV0dXJuPFJlc3VsdD4gaGlkbFJlc3VsdCA9IG1IYWxUdW5lci0+c2V0Q29uZmlndXJhdGlvbihoYWxDb25maWcpOwotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGlkbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpnZXRDb25maWd1cmF0aW9uKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIEJhbmRDb25maWcgaGFsQ29uZmlnOwotICAgIFJlc3VsdCBoYWxSZXN1bHQ7Ci0gICAgUmV0dXJuPHZvaWQ+IGhpZGxSZXR1cm4gPQotICAgICAgICAgICAgbUhhbFR1bmVyLT5nZXRDb25maWd1cmF0aW9uKFsmXShSZXN1bHQgcmVzdWx0LCBjb25zdCBCYW5kQ29uZmlnJiBjb25maWcpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFsUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbENvbmZpZyA9IGNvbmZpZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIGlmIChoaWRsUmV0dXJuLmlzT2soKSAmJiBoYWxSZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBIaWRsVXRpbHM6OmNvbnZlcnRCYW5kQ29uZmlnRnJvbUhhbChjb25maWcsICZoYWxDb25maWcpOwotICAgIH0KLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhhbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBSZXR1cm48UmVzdWx0PiBoaWRsUmVzdWx0ID0KLSAgICAgICAgICAgIG1IYWxUdW5lci0+c2NhbihzdGF0aWNfY2FzdDxEaXJlY3Rpb24+KGRpcmVjdGlvbiksIHNraXBfc3ViX2NoYW5uZWwpOwotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGlkbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBSZXR1cm48UmVzdWx0PiBoaWRsUmVzdWx0ID0KLSAgICAgICAgICAgIG1IYWxUdW5lci0+c3RlcChzdGF0aWNfY2FzdDxEaXJlY3Rpb24+KGRpcmVjdGlvbiksIHNraXBfc3ViX2NoYW5uZWwpOwotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGlkbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjp0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViX2NoYW5uZWwpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIFJldHVybjxSZXN1bHQ+IGhpZGxSZXN1bHQgPQotICAgICAgICAgICAgbUhhbFR1bmVyLT50dW5lKGNoYW5uZWwsIHN1Yl9jaGFubmVsKTsKLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhpZGxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6Y2FuY2VsKCkKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgUmV0dXJuPFJlc3VsdD4gaGlkbFJlc3VsdCA9IG1IYWxUdW5lci0+Y2FuY2VsKCk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmdldFByb2dyYW1JbmZvcm1hdGlvbihyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbykKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgaWYgKGluZm8gPT0gbnVsbHB0ciB8fCBpbmZvLT5tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIFByb2dyYW1JbmZvIGhhbEluZm87Ci0gICAgUmVzdWx0IGhhbFJlc3VsdDsKLSAgICBSZXR1cm48dm9pZD4gaGlkbFJldHVybiA9IG1IYWxUdW5lci0+Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKAotICAgICAgICBbJl0oUmVzdWx0IHJlc3VsdCwgY29uc3QgUHJvZ3JhbUluZm8mIGluZm8pIHsKLSAgICAgICAgICAgIGhhbFJlc3VsdCA9IHJlc3VsdDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGhhbEluZm8gPSBpbmZvOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICBpZiAoaGlkbFJldHVybi5pc09rKCkgJiYgaGFsUmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgSGlkbFV0aWxzOjpjb252ZXJ0UHJvZ3JhbUluZm9Gcm9tSGFsKGluZm8sICZoYWxJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoYWxSZXN1bHQpOwotfQotCi1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6aGFyZHdhcmVGYWlsdXJlKCkKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIGhhbmRsZUh3RmFpbHVyZSgpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmNvbmZpZ0NoYW5nZShSZXN1bHQgcmVzdWx0LCBjb25zdCBCYW5kQ29uZmlnJiBjb25maWcpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfQ09ORklHOwotICAgIGV2ZW50LnN0YXR1cyA9IEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChyZXN1bHQpOwotICAgIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdGcm9tSGFsKCZldmVudC5jb25maWcsICZjb25maWcpOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjp0dW5lQ29tcGxldGUoUmVzdWx0IHJlc3VsdCwgY29uc3QgUHJvZ3JhbUluZm8mIGluZm8pCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudCA9IHt9OwotICAgIFJhZGlvTWV0YWRhdGFXcmFwcGVyIG1ldGFkYXRhV3JhcHBlcigmZXZlbnQuaW5mby5tZXRhZGF0YSk7Ci0KLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfVFVORUQ7Ci0gICAgZXZlbnQuc3RhdHVzID0gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KHJlc3VsdCk7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0UHJvZ3JhbUluZm9Gcm9tSGFsKCZldmVudC5pbmZvLCAmaW5mbyk7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmFmU3dpdGNoKGNvbnN0IFByb2dyYW1JbmZvJiBpbmZvKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQgPSB7fTsKLSAgICBSYWRpb01ldGFkYXRhV3JhcHBlciBtZXRhZGF0YVdyYXBwZXIoJmV2ZW50LmluZm8ubWV0YWRhdGEpOwotCi0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0FGX1NXSVRDSDsKLSAgICBIaWRsVXRpbHM6OmNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwoJmV2ZW50LmluZm8sICZpbmZvKTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotCi1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6YW50ZW5uYVN0YXRlQ2hhbmdlKGJvb2wgY29ubmVjdGVkKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKHJhZGlvX2hhbF9ldmVudF90KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0FOVEVOTkE7Ci0gICAgZXZlbnQub24gPSBjb25uZWN0ZWQ7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjp0cmFmZmljQW5ub3VuY2VtZW50KGJvb2wgYWN0aXZlKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKHJhZGlvX2hhbF9ldmVudF90KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX1RBOwotICAgIGV2ZW50Lm9uID0gYWN0aXZlOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6ZW1lcmdlbmN5QW5ub3VuY2VtZW50KGJvb2wgYWN0aXZlKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKHJhZGlvX2hhbF9ldmVudF90KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0VBOwotICAgIGV2ZW50Lm9uID0gYWN0aXZlOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6bmV3TWV0YWRhdGEodWludDMyX3QgY2hhbm5lbCwgdWludDMyX3Qgc3ViQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPE1ldGFEYXRhPiYgbWV0YWRhdGEpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudCA9IHt9OwotICAgIFJhZGlvTWV0YWRhdGFXcmFwcGVyIG1ldGFkYXRhV3JhcHBlcigmZXZlbnQubWV0YWRhdGEpOwotCi0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX01FVEFEQVRBOwotICAgIEhpZGxVdGlsczo6Y29udmVydE1ldGFEYXRhRnJvbUhhbCgmZXZlbnQubWV0YWRhdGEsIG1ldGFkYXRhLCBjaGFubmVsLCBzdWJDaGFubmVsKTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotCi0KLVJhZGlvSGFsSGlkbDo6VHVuZXI6OlR1bmVyKHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLCBzcDxSYWRpb0hhbEhpZGw+IG1vZHVsZSkKLSAgICA6IFR1bmVySW50ZXJmYWNlKCksIG1IYWxUdW5lcihOVUxMKSwgbUNhbGxiYWNrKGNhbGxiYWNrKSwgbVBhcmVudE1vZHVsZShtb2R1bGUpCi17Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBoYW5kbGVyIHdlIGFyZSBwYXNzaW5nIGluIG9ubHkgZGVhbHMgd2l0aCBjb25zdCBtZW1iZXJzLAotICAgIC8vIGFzIGl0IGNhbiBiZSBjYWxsZWQgb24gYW4gYXJiaXRyYXJ5IHRocmVhZC4KLSAgICBjb25zdCBhdXRvJiBzZWxmID0gdGhpczsKLSAgICBIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCktPnJlZ2lzdGVyQXRFeGl0SGFuZGxlcigKLSAgICAgICAgICAgIHRoaXMsIFsmc2VsZl0oKSB7IHNlbGYtPnNlbmRId0ZhaWx1cmVFdmVudCgpOyB9KTsKLX0KLQotCi1SYWRpb0hhbEhpZGw6OlR1bmVyOjp+VHVuZXIoKQotewotICAgIEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+dW5yZWdpc3RlckF0RXhpdEhhbmRsZXIodGhpcyk7Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6c2V0SGFsVHVuZXIoc3A8SVR1bmVyPiYgaGFsVHVuZXIpIHsKLSAgICBpZiAobUhhbFR1bmVyICE9IDApIHsKLSAgICAgICAgbUhhbFR1bmVyLT51bmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSk7Ci0gICAgfQotICAgIG1IYWxUdW5lciA9IGhhbFR1bmVyOwotICAgIGlmIChtSGFsVHVuZXIgIT0gMCkgewotICAgICAgICBtSGFsVHVuZXItPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6aGFuZGxlSHdGYWlsdXJlKCkKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHNwPFJhZGlvSGFsSGlkbD4gcGFyZW50TW9kdWxlID0gbVBhcmVudE1vZHVsZS5wcm9tb3RlKCk7Ci0gICAgaWYgKHBhcmVudE1vZHVsZSAhPSAwKSB7Ci0gICAgICAgIHBhcmVudE1vZHVsZS0+Y2xlYXJTZXJ2aWNlKCk7Ci0gICAgfQotICAgIHNlbmRId0ZhaWx1cmVFdmVudCgpOwotICAgIG1IYWxUdW5lci5jbGVhcigpOwotfQotCi12b2lkIFJhZGlvSGFsSGlkbDo6VHVuZXI6OnNlbmRId0ZhaWx1cmVFdmVudCgpIGNvbnN0Ci17Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKHJhZGlvX2hhbF9ldmVudF90KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0hXX0ZBSUxVUkU7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotfQotCi12b2lkIFJhZGlvSGFsSGlkbDo6VHVuZXI6Om9uQ2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KSBjb25zdAotewotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoaGFsRXZlbnQpOwotICAgIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4NDIwZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfSElETF9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgIlJhZGlvSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9icm9hZGNhc3RyYWRpby8xLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC9JQnJvYWRjYXN0UmFkaW8uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC9JVHVuZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC9JVHVuZXJDYWxsYmFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlJlc3VsdDsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6SUJyb2FkY2FzdFJhZGlvOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpJVHVuZXI7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OklUdW5lckNhbGxiYWNrOwotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkJhbmRDb25maWc7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlByb2dyYW1JbmZvOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpNZXRhRGF0YTsKLQotY2xhc3MgUmFkaW9IYWxIaWRsIDogcHVibGljIFJhZGlvSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgIFJhZGlvSGFsSGlkbChyYWRpb19jbGFzc190IGNsYXNzSWQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFJhZGlvSW50ZXJmYWNlCi0gICAgICAgIHZpcnR1YWwgaW50IGdldFByb3BlcnRpZXMocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcyk7Ci0gICAgICAgIHZpcnR1YWwgaW50IG9wZW5UdW5lcihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0gICAgICAgIHZpcnR1YWwgaW50IGNsb3NlVHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0KLSAgICAgICAgY2xhc3MgVHVuZXIgIDogcHVibGljIFR1bmVySW50ZXJmYWNlLCBwdWJsaWMgdmlydHVhbCBJVHVuZXJDYWxsYmFjawotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIFR1bmVyKHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLCBzcDxSYWRpb0hhbEhpZGw+IG1vZHVsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1bmVySW50ZXJmYWNlCi0gICAgICAgICAgICB2aXJ0dWFsIGludCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgZ2V0Q29uZmlndXJhdGlvbihyYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViX2NoYW5uZWwpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgY2FuY2VsKCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBnZXRQcm9ncmFtSW5mb3JtYXRpb24ocmFkaW9fcHJvZ3JhbV9pbmZvX3QgKmluZm8pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJVHVuZXJDYWxsYmFjawotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gaGFyZHdhcmVGYWlsdXJlKCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjb25maWdDaGFuZ2UoUmVzdWx0IHJlc3VsdCwgY29uc3QgQmFuZENvbmZpZyYgY29uZmlnKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHR1bmVDb21wbGV0ZShSZXN1bHQgcmVzdWx0LCBjb25zdCBQcm9ncmFtSW5mbyYgaW5mbyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBhZlN3aXRjaChjb25zdCBQcm9ncmFtSW5mbyYgaW5mbyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBhbnRlbm5hU3RhdGVDaGFuZ2UoYm9vbCBjb25uZWN0ZWQpOwotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gdHJhZmZpY0Fubm91bmNlbWVudChib29sIGFjdGl2ZSk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBlbWVyZ2VuY3lBbm5vdW5jZW1lbnQoYm9vbCBhY3RpdmUpOwotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gbmV3TWV0YWRhdGEodWludDMyX3QgY2hhbm5lbCwgdWludDMyX3Qgc3ViQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8TWV0YURhdGE+JiBtZXRhZGF0YSk7Ci0KLSAgICAgICAgICAgIHZvaWQgc2V0SGFsVHVuZXIoc3A8SVR1bmVyPiYgaGFsVHVuZXIpOwotICAgICAgICAgICAgc3A8SVR1bmVyPiBnZXRIYWxUdW5lcigpIHsgcmV0dXJuIG1IYWxUdW5lcjsgfQotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICB2aXJ0dWFsICAgICAgICAgIH5UdW5lcigpOwotCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgIG9uQ2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KSBjb25zdDsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgaGFuZGxlSHdGYWlsdXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgIHNlbmRId0ZhaWx1cmVFdmVudCgpIGNvbnN0OwotCi0gICAgICAgICAgICBzcDxJVHVuZXI+IG1IYWxUdW5lcjsKLSAgICAgICAgICAgIGNvbnN0IHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IG1DYWxsYmFjazsKLSAgICAgICAgICAgIHdwPFJhZGlvSGFsSGlkbD4gbVBhcmVudE1vZHVsZTsKLSAgICAgICAgfTsKLQotICAgICAgICBzcDxJQnJvYWRjYXN0UmFkaW8+IGdldFNlcnZpY2UoKTsKLSAgICAgICAgdm9pZCBjbGVhclNlcnZpY2UoKTsKLQotcHJpdmF0ZToKLSAgICAgICAgdmlydHVhbCAgICAgICAgIH5SYWRpb0hhbEhpZGwoKTsKLQotICAgICAgICAgICAgICAgIHJhZGlvX2NsYXNzX3QgbUNsYXNzSWQ7Ci0gICAgICAgICAgICAgICAgc3A8SUJyb2FkY2FzdFJhZGlvPiBtSGFsTW9kdWxlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfSElETF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGNjZDQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxMZWdhY3kuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvSGFsTGVnYWN5IgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgIlJhZGlvSGFsTGVnYWN5LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY29uc3QgY2hhciAqUmFkaW9IYWxMZWdhY3k6OnNDbGFzc01vZHVsZU5hbWVzW10gPSB7Ci0gICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0ZNLCAvKiBjb3JyZXNwb25kcyB0byBSQURJT19DTEFTU19BTV9GTSAqLwotICAgIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRF9TQVQsICAvKiBjb3JyZXNwb25kcyB0byBSQURJT19DTEFTU19TQVQgKi8KLSAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSURfRFQsICAgLyogY29ycmVzcG9uZHMgdG8gUkFESU9fQ0xBU1NfRFQgKi8KLX07Ci0KLS8qIHN0YXRpYyAqLwotc3A8UmFkaW9JbnRlcmZhY2U+IFJhZGlvSW50ZXJmYWNlOjpjb25uZWN0TW9kdWxlKHJhZGlvX2NsYXNzX3QgY2xhc3NJZCkKLXsKLSAgICByZXR1cm4gbmV3IFJhZGlvSGFsTGVnYWN5KGNsYXNzSWQpOwotfQotCi1SYWRpb0hhbExlZ2FjeTo6UmFkaW9IYWxMZWdhY3kocmFkaW9fY2xhc3NfdCBjbGFzc0lkKQotICAgIDogUmFkaW9JbnRlcmZhY2UoKSwgbUNsYXNzSWQoY2xhc3NJZCksIG1Id0RldmljZShOVUxMKQotewotfQotCi12b2lkIFJhZGlvSGFsTGVnYWN5OjpvbkZpcnN0UmVmKCkKLXsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOwotICAgIGludCByYzsKLSAgICBBTE9HSSgiJXMgbUNsYXNzSWQgJWQiLCBfX0ZVTkNUSU9OX18sIG1DbGFzc0lkKTsKLQotICAgIG1Id0RldmljZSA9IE5VTEw7Ci0KLSAgICBpZiAoKG1DbGFzc0lkIDwgMCkgfHwKLSAgICAgICAgICAgIChtQ2xhc3NJZCA+PSBORUxFTShzQ2xhc3NNb2R1bGVOYW1lcykpKSB7Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIGNsYXNzIElEICVkIiwgbUNsYXNzSWQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR0koIiVzIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCAlcyAlcyIsCi0gICAgICAgICAgX19GVU5DVElPTl9fLCBSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIHNDbGFzc01vZHVsZU5hbWVzW21DbGFzc0lkXSk7Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBzQ2xhc3NNb2R1bGVOYW1lc1ttQ2xhc3NJZF0sICZtb2QpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZG4ndCBsb2FkIHJhZGlvIG1vZHVsZSAlcy4lcyAoJXMpIiwKLSAgICAgICAgICAgICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBzQ2xhc3NNb2R1bGVOYW1lc1ttQ2xhc3NJZF0sIHN0cmVycm9yKC1yYykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJjID0gcmFkaW9faHdfZGV2aWNlX29wZW4obW9kLCAmbUh3RGV2aWNlKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbiByYWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsCi0gICAgICAgICAgICAgIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgInByaW1hcnkiLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgbUh3RGV2aWNlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobUh3RGV2aWNlLT5jb21tb24udmVyc2lvbiAhPSBSQURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fQ1VSUkVOVCkgewotICAgICAgICBBTE9HRSgid3JvbmcgcmFkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24pOwotICAgICAgICByYWRpb19od19kZXZpY2VfY2xvc2UobUh3RGV2aWNlKTsKLSAgICAgICAgbUh3RGV2aWNlID0gTlVMTDsKLSAgICB9Ci19Ci0KLVJhZGlvSGFsTGVnYWN5Ojp+UmFkaW9IYWxMZWdhY3koKQotewotICAgIGlmIChtSHdEZXZpY2UgIT0gTlVMTCkgewotICAgICAgICByYWRpb19od19kZXZpY2VfY2xvc2UobUh3RGV2aWNlKTsKLSAgICB9Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6Z2V0UHJvcGVydGllcyhyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0KLSAgICBpbnQgcmMgPSBtSHdEZXZpY2UtPmdldF9wcm9wZXJ0aWVzKG1Id0RldmljZSwgcHJvcGVydGllcyk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkIG5vdCByZWFkIGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXMiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6b3BlblR1bmVyKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgYm9vbCBhdWRpbywKLSAgICAgICAgICAgICAgICBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgc3A8VHVuZXI+IHR1bmVySW1wbCA9IG5ldyBUdW5lcihjYWxsYmFjayk7Ci0KLSAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKmhhbFR1bmVyOwotICAgIGludCByYyA9IG1Id0RldmljZS0+b3Blbl90dW5lcihtSHdEZXZpY2UsIGNvbmZpZywgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6Y2FsbGJhY2ssIHR1bmVySW1wbC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbFR1bmVyKTsKLSAgICBpZiAocmMgPT0gMCkgewotICAgICAgICB0dW5lckltcGwtPnNldEhhbFR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgdHVuZXIgPSB0dW5lckltcGw7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpjbG9zZVR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBpZiAodHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgc3A8VHVuZXI+IHR1bmVySW1wbCA9IChUdW5lciAqKXR1bmVyLmdldCgpOwotICAgIHJldHVybiBtSHdEZXZpY2UtPmNsb3NlX3R1bmVyKG1Id0RldmljZSwgdHVuZXJJbXBsLT5nZXRIYWxUdW5lcigpKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6c2V0Q29uZmlndXJhdGlvbihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+c2V0X2NvbmZpZ3VyYXRpb24obUhhbFR1bmVyLCBjb25maWcpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpnZXRDb25maWd1cmF0aW9uKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5nZXRfY29uZmlndXJhdGlvbihtSGFsVHVuZXIsIGNvbmZpZyk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5zY2FuKG1IYWxUdW5lciwgZGlyZWN0aW9uLCBza2lwX3N1Yl9jaGFubmVsKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6c3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCkKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPnN0ZXAobUhhbFR1bmVyLCBkaXJlY3Rpb24sIHNraXBfc3ViX2NoYW5uZWwpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjp0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViX2NoYW5uZWwpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT50dW5lKG1IYWxUdW5lciwgY2hhbm5lbCwgc3ViX2NoYW5uZWwpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpjYW5jZWwoKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+Y2FuY2VsKG1IYWxUdW5lcik7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OmdldFByb2dyYW1JbmZvcm1hdGlvbihyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbykKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPmdldF9wcm9ncmFtX2luZm9ybWF0aW9uKG1IYWxUdW5lciwgaW5mbyk7Ci19Ci0KLXZvaWQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpvbkNhbGxiYWNrKHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCkKLXsKLSAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgbUNhbGxiYWNrLT5vbkV2ZW50KGhhbEV2ZW50KTsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi12b2lkIFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6Y2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50LCB2b2lkICpjb29raWUpCi17Ci0gICAgd3A8UmFkaW9IYWxMZWdhY3k6OlR1bmVyPiB3ZWFrID0gd3A8UmFkaW9IYWxMZWdhY3k6OlR1bmVyPigoUmFkaW9IYWxMZWdhY3k6OlR1bmVyICopY29va2llKTsKLSAgICBzcDxSYWRpb0hhbExlZ2FjeTo6VHVuZXI+IHR1bmVyID0gd2Vhay5wcm9tb3RlKCk7Ci0gICAgaWYgKHR1bmVyICE9IDApIHsKLSAgICAgICAgdHVuZXItPm9uQ2FsbGJhY2soaGFsRXZlbnQpOwotICAgIH0KLX0KLQotUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpUdW5lcihzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaykKLSAgICA6IFR1bmVySW50ZXJmYWNlKCksIG1IYWxUdW5lcihOVUxMKSwgbUNhbGxiYWNrKGNhbGxiYWNrKQotewotfQotCi0KLVJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6flR1bmVyKCkKLXsKLX0KLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5oIGIvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxMZWdhY3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0ODMxYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfTEVHQUNZX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfTEVHQUNZX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9yYWRpby5oPgotI2luY2x1ZGUgIlJhZGlvSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgUmFkaW9IYWxMZWdhY3kgOiBwdWJsaWMgUmFkaW9JbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICAgICAgUmFkaW9IYWxMZWdhY3kocmFkaW9fY2xhc3NfdCBjbGFzc0lkKTsKLQotICAgICAgICAvLyBSYWRpb0ludGVyZmFjZQotICAgICAgICB2aXJ0dWFsIGludCBnZXRQcm9wZXJ0aWVzKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMpOwotICAgICAgICB2aXJ0dWFsIGludCBvcGVuVHVuZXIoY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpOwotICAgICAgICB2aXJ0dWFsIGludCBjbG9zZVR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpOwotCi0gICAgICAgIC8vIFJlZkJhc2UKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKLQotICAgICAgICBjbGFzcyBUdW5lciAgOiBwdWJsaWMgVHVuZXJJbnRlcmZhY2UKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBUdW5lcihzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjayk7Ci0KLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHNldENvbmZpZ3VyYXRpb24oY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBnZXRDb25maWd1cmF0aW9uKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBjYW5jZWwoKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGdldFByb2dyYW1JbmZvcm1hdGlvbihyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbyk7Ci0KLSAgICAgICAgICAgIHN0YXRpYyB2b2lkIGNhbGxiYWNrKHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCwgdm9pZCAqY29va2llKTsKLSAgICAgICAgICAgICAgICAgICB2b2lkIG9uQ2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KTsKLQotICAgICAgICAgICAgdm9pZCBzZXRIYWxUdW5lcihjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKmhhbFR1bmVyKSB7IG1IYWxUdW5lciA9IGhhbFR1bmVyOyB9Ci0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKmdldEhhbFR1bmVyKCkgeyByZXR1cm4gbUhhbFR1bmVyOyB9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIHZpcnR1YWwgICAgICB+VHVuZXIoKTsKLQotICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICAgICptSGFsVHVuZXI7Ci0gICAgICAgICAgICBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiAgbUNhbGxiYWNrOwotICAgICAgICB9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgICAgIH5SYWRpb0hhbExlZ2FjeSgpOwotCi1wcml2YXRlOgotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIHNDbGFzc01vZHVsZU5hbWVzW107Ci0KLSAgICAgICAgcmFkaW9fY2xhc3NfdCBtQ2xhc3NJZDsKLSAgICAgICAgc3RydWN0IHJhZGlvX2h3X2RldmljZSAgKm1Id0RldmljZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0xFR0FDWV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0ludGVyZmFjZS5oIGIvc2VydmljZXMvcmFkaW8vUmFkaW9JbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmYjRkNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19JTlRFUkZBQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0jaW5jbHVkZSAiVHVuZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgUmFkaW9JbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgICAgIC8qIGdldCBhIHNvdW5kIHRyaWdnZXIgSEFMIGluc3RhbmNlICovCi0gICAgICAgIHN0YXRpYyBzcDxSYWRpb0ludGVyZmFjZT4gY29ubmVjdE1vZHVsZShyYWRpb19jbGFzc190IGNsYXNzSWQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJldHJpZXZlIGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBwcm9wZXJ0aWVzOiB3aGVyZSB0byByZXR1cm4gdGhlIG1vZHVsZSBwcm9wZXJ0aWVzCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIG5vIGVycm9yCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQKLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IGdldFByb3BlcnRpZXMocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcykgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE9wZW4gYSB0dW5lciBpbnRlcmZhY2UgZm9yIHRoZSByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICogSWYgbm8gb3RoZXIgdHVuZXIgaXMgb3BlbmVkLCB0aGlzIHdpbGwgYWN0aXZhdGUgdGhlIHJhZGlvIG1vZHVsZS4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGNvbmZpZzogdGhlIGJhbmQgY29uZmlndXJhdGlvbiB0byBhcHBseQotICAgICAgICAgKiAtIGF1ZGlvOiB0aGlzIHR1bmVyIHdpbGwgYmUgdXNlZCBmb3IgbGl2ZSByYWRpbyBsaXN0ZW5pbmcgYW5kIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8KLSAgICAgICAgICogdGhlIHJhZGlvIGF1ZGlvIHNvdXJjZS4KLSAgICAgICAgICogLSBjYWxsYmFjazogdGhlIGV2ZW50IGNhbGxiYWNrCi0gICAgICAgICAqIC0gY29va2llOiB0aGUgY29va2llIHRvIHBhc3Mgd2hlbiBjYWxsaW5nIHRoZSBjYWxsYmFjawotICAgICAgICAgKiAtIHR1bmVyOiB3aGVyZSB0byByZXR1cm4gdGhlIHR1bmVyIGludGVyZmFjZQotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiBIVyB3YXMgcG93ZXJlZCB1cCBhbmQgY29uZmlndXJhdGlvbiBjb3VsZCBiZSBhcHBsaWVkCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkIGlzIGludmFsaWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKgotICAgICAgICAgKiBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX0NPTkZJRyBNVVNUIGJlIGNhbGxlZCBvbmNlIHRoZQotICAgICAgICAgKiBjb25maWd1cmF0aW9uIGlzIGFwcGxpZWQgb3IgYSBmYWlsdXJlIG9jY3VycyBvciBhZnRlciBhIHRpbWUgb3V0LgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgb3BlblR1bmVyKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ2xvc2UgYSB0dW5lciBpbnRlcmZhY2UuCi0gICAgICAgICAqIElmIHRoZSBsYXN0IHR1bmVyIGlzIGNsb3NlZCwgdGhlIHJhZGlvIG1vZHVsZSBpcyBkZWFjdGl2YXRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIHR1bmVyOiB0aGUgdHVuZXIgaW50ZXJmYWNlIHRvIGNsb3NlCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHBvd2VyZWQgZG93biBzdWNjZXNzZnVsbHkuCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGFuIGludmFsaWQgYXJndW1lbnQgaXMgcGFzc2VkCi0gICAgICAgICAqICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2UKLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IGNsb3NlVHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIFJhZGlvSW50ZXJmYWNlKCkge30KLSAgICAgICAgdmlydHVhbCAgICAgflJhZGlvSW50ZXJmYWNlKCkge30KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvUmVnaW9ucy5oIGIvc2VydmljZXMvcmFkaW8vUmFkaW9SZWdpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MGVlODMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vUmFkaW9SZWdpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19SRUdJT05TX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19SRUdJT05TX0gKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMSAgICA4NzUwMAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTEgICAgMTA4MDAwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUxICAxMDAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTIgICAgODc5MDAKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUyICAgIDEwNzkwMAotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMiAgMjAwCi0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9KQVBBTiAgICA3NjAwMAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX0pBUEFOICAgIDkwMDAwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9KQVBBTiAgMTAwCi0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9PSVJUICAgIDY1ODAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fT0lSVCAgICA3NDAwMAotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfRk1fT0lSVCAgMTAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0xXICAgICAgICAgMTUzCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfTFcgICAgICAgICAyNzkKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0xXICAgICAgIDkKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX01XX0lVVDEgICAgNTMxCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfTVdfSVRVMSAgICAxNjExCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUxICA5Ci0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9NV19JVVQyICAgIDU0MAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX01XX0lUVTIgICAgMTYxMAotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfTVdfSVRVMiAgMTAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX1NXICAgICAgICAgMjMwMAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX1NXICAgICAgICAgMjYxMDAKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX1NXICAgICAgIDUKLQotCi0jaWZuZGVmIEFSUkFZX1NJWkUKLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCi0jZW5kaWYKLQotY29uc3QgcmFkaW9fYmFuZF9jb25maWdfdCBzS25vd25SZWdpb25Db25maWdzW10gPSB7Ci0gICAgeyAgIC8vIEZNIElUVSAxCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMSwKLSAgICAgICAgewotICAgICAgICBSQURJT19CQU5EX0ZNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTEsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUxfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU181MCwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19XT1JMRCwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBGTSBBbWVyaWNhcwotICAgICAgICBSQURJT19SRUdJT05fSVRVXzIsCi0gICAgICAgIHsKLSAgICAgICAgUkFESU9fQkFORF9GTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUyLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUyLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMn0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNzUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfVVMsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gRk0gSmFwYW4KLSAgICAgICAgUkFESU9fUkVHSU9OX0pBUEFOLAotICAgICAgICB7Ci0gICAgICAgIFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSkFQQU4sCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0pBUEFOLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSkFQQU59LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzUwLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEZNIEtvcmVhCi0gICAgICAgIFJBRElPX1JFR0lPTl9LT1JFQSwKLSAgICAgICAgewotICAgICAgICBSQURJT19CQU5EX0ZNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTEsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUxfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU183NSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19XT1JMRCwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBGTSBPSVJUCi0gICAgICAgIFJBRElPX1JFR0lPTl9PSVJULAotICAgICAgICB7Ci0gICAgICAgIFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fT0lSVCwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fT0lSVCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX09JUlR9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzUwLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEZNIFVTIEhEIHJhZGlvCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMiwKLSAgICAgICAgewotICAgICAgICAgICAgUkFESU9fQkFORF9GTV9IRCwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUyLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUyLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMn0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNzUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfVVMsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gQU0gTFcKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0FNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0xXLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9MVywKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0xXfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEFNIFNXCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMSwKLSAgICAgICAgewotICAgICAgICAgICAgUkFESU9fQkFORF9BTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9TVywKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfU1csCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19TV30sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBBTSBNVyBJVFUxCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMSwKLSAgICAgICAgewotICAgICAgICAgICAgUkFESU9fQkFORF9BTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9NV19JVVQxLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9NV19JVFUxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfTVdfSVRVMX0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBBTSBNVyBJVFUyCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMiwKLSAgICAgICAgewotICAgICAgICAgICAgUkFESU9fQkFORF9BTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9NV19JVVQyLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9NV19JVFUyLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfTVdfSVRVMn0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fUkVHSU9OU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuY3BwIGIvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViN2MwOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpb19tZXRhZGF0YS5oPgotI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL3JhZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KLSNpbmNsdWRlICJSYWRpb1NlcnZpY2UuaCIKLSNpbmNsdWRlICJSYWRpb1JlZ2lvbnMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciBrUmFkaW9UdW5lckF1ZGlvRGV2aWNlTmFtZVtdID0gIlJhZGlvIHR1bmVyIHNvdXJjZSI7Ci0KLXN0YXRpYyBjb25zdCBTdHJpbmcxNiBSQURJT19QRVJNSVNTSU9OKCJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0ZNX1JBRElPIik7Ci0KLVJhZGlvU2VydmljZTo6UmFkaW9TZXJ2aWNlKCkKLSAgICA6IEJuUmFkaW9TZXJ2aWNlKCksIG1OZXh0VW5pcXVlSWQoMSkKLXsKLSAgICBBTE9HSSgiJXMiLCBfX0ZVTkNUSU9OX18pOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6b25GaXJzdFJlZigpCi17Ci0gICAgQUxPR0koIiVzIiwgX19GVU5DVElPTl9fKTsKLQotICAgIHNwPFJhZGlvSW50ZXJmYWNlPiBkZXYgPSBSYWRpb0ludGVyZmFjZTo6Y29ubmVjdE1vZHVsZShSQURJT19DTEFTU19BTV9GTSk7Ci0KLSAgICBpZiAoZGV2ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdHJ1Y3QgcmFkaW9faGFsX3Byb3BlcnRpZXMgaGFsUHJvcGVydGllczsKLSAgICBpbnQgcmMgPSBkZXYtPmdldFByb3BlcnRpZXMoJmhhbFByb3BlcnRpZXMpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZCBub3QgcmVhZCBpbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByYWRpb19wcm9wZXJ0aWVzX3QgcHJvcGVydGllczsKLSAgICBwcm9wZXJ0aWVzLmhhbmRsZSA9Ci0gICAgICAgICAgICAocmFkaW9faGFuZGxlX3QpYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKLSAgICBjb252ZXJ0UHJvcGVydGllcygmcHJvcGVydGllcywgJmhhbFByb3BlcnRpZXMpOwotCi0gICAgQUxPR0koImxvYWRlZCBkZWZhdWx0IG1vZHVsZSAlcywgdmVyICVzLCBoYW5kbGUgJWQiLCBwcm9wZXJ0aWVzLnByb2R1Y3QsCi0gICAgICAgIHByb3BlcnRpZXMudmVyc2lvbiwgcHJvcGVydGllcy5oYW5kbGUpOwotCi0gICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBuZXcgTW9kdWxlKGRldiwgcHJvcGVydGllcyk7Ci0gICAgbU1vZHVsZXMuYWRkKHByb3BlcnRpZXMuaGFuZGxlLCBtb2R1bGUpOwotfQotCi1SYWRpb1NlcnZpY2U6On5SYWRpb1NlcnZpY2UoKQotewotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Omxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEFMT0dWKCJsaXN0TW9kdWxlcyIpOwotCi0gICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIHByb3BlcnRpZXMgPT0gTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgdWludDMyX3QgbWF4TW9kdWxlcyA9ICpudW1Nb2R1bGVzOwotICAgICpudW1Nb2R1bGVzID0gbU1vZHVsZXMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpICYmIGkgPCBtYXhNb2R1bGVzOyBpKyspIHsKLSAgICAgICAgcHJvcGVydGllc1tpXSA9IG1Nb2R1bGVzLnZhbHVlQXQoaSktPnByb3BlcnRpZXMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6OmF0dGFjaChyYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBTE9HVigiJXMgJWQgY29uZmlnICVwIHdpdGhBdWRpbyAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlLCBjb25maWcsIHdpdGhBdWRpbyk7Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOwotICAgIHJhZGlvLmNsZWFyKCk7Ci0gICAgaWYgKGNsaWVudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNzaXplX3QgaW5kZXggPSBtTW9kdWxlcy5pbmRleE9mS2V5KGhhbmRsZSk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGVzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbmZpZyA9IG1vZHVsZS0+Z2V0RGVmYXVsdENvbmZpZygpOwotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiJXMgcmVnaW9uICVkIHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIGNvbmZpZy0+cmVnaW9uLCBjb25maWctPmJhbmQudHlwZSk7Ci0KLSAgICByYWRpbyA9IG1vZHVsZS0+YWRkQ2xpZW50KGNsaWVudCwgY29uZmlnLCB3aXRoQXVkaW8pOwotCi0gICAgaWYgKHJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXAgPSA2MDAwMDsKLQotc3RhdGljIGJvb2wgdHJ5TG9jayhNdXRleCYgbXV0ZXgpCi17Ci0gICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgewotICAgICAgICBpZiAobXV0ZXgudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxvY2tlZDsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBSYWRpb1NlcnZpY2UiKTsKLSAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gUmFkaW9TZXJ2aWNlIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKLSAgICAgICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlJhZGlvU2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIik7Ci0gICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2NrZWQpIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgewotICAgIHJldHVybiBCblJhZGlvU2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotfQotCi0KLS8qIHN0YXRpYyAqLwotdm9pZCBSYWRpb1NlcnZpY2U6OmNvbnZlcnRQcm9wZXJ0aWVzKHJhZGlvX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfcHJvcGVydGllc190ICpoYWxQcm9wZXJ0aWVzKQotewotICAgIG1lbXNldChwcm9wZXJ0aWVzLCAwLCBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMpKTsKLSAgICBwcm9wZXJ0aWVzLT5jbGFzc19pZCA9IGhhbFByb3BlcnRpZXMtPmNsYXNzX2lkOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+aW1wbGVtZW50b3IsIGhhbFByb3BlcnRpZXMtPmltcGxlbWVudG9yLAotICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+cHJvZHVjdCwgaGFsUHJvcGVydGllcy0+cHJvZHVjdCwKLSAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnZlcnNpb24sIGhhbFByb3BlcnRpZXMtPnZlcnNpb24sCi0gICAgICAgICAgICBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5zZXJpYWwsIGhhbFByb3BlcnRpZXMtPnNlcmlhbCwKLSAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBwcm9wZXJ0aWVzLT5udW1fdHVuZXJzID0gaGFsUHJvcGVydGllcy0+bnVtX3R1bmVyczsKLSAgICBwcm9wZXJ0aWVzLT5udW1fYXVkaW9fc291cmNlcyA9IGhhbFByb3BlcnRpZXMtPm51bV9hdWRpb19zb3VyY2VzOwotICAgIHByb3BlcnRpZXMtPnN1cHBvcnRzX2NhcHR1cmUgPSBoYWxQcm9wZXJ0aWVzLT5zdXBwb3J0c19jYXB0dXJlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNLbm93blJlZ2lvbkNvbmZpZ3MpOyBpKyspIHsKLSAgICAgICAgY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmJhbmQgPSAmc0tub3duUmVnaW9uQ29uZmlnc1tpXS5iYW5kOwotICAgICAgICBzaXplX3QgajsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGhhbFByb3BlcnRpZXMtPm51bV9iYW5kczsgaisrKSB7Ci0gICAgICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqaGFsQmFuZCA9ICZoYWxQcm9wZXJ0aWVzLT5iYW5kc1tqXTsKLSAgICAgICAgICAgIHNpemVfdCBrOwotICAgICAgICAgICAgaWYgKGJhbmQtPnR5cGUgIT0gaGFsQmFuZC0+dHlwZSkgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoYmFuZC0+bG93ZXJfbGltaXQgPCBoYWxCYW5kLT5sb3dlcl9saW1pdCkgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoYmFuZC0+dXBwZXJfbGltaXQgPiBoYWxCYW5kLT51cHBlcl9saW1pdCkgY29udGludWU7Ci0gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaGFsQmFuZC0+bnVtX3NwYWNpbmdzOyBrKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYmFuZC0+c3BhY2luZ3NbMF0gPT0gaGFsQmFuZC0+c3BhY2luZ3Nba10pIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGsgPT0gaGFsQmFuZC0+bnVtX3NwYWNpbmdzKSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChiYW5kLT50eXBlID09IFJBRElPX0JBTkRfQU0pIGJyZWFrOwotICAgICAgICAgICAgaWYgKChiYW5kLT5mbS5kZWVtcGhhc2lzICYgaGFsQmFuZC0+Zm0uZGVlbXBoYXNpcykgPT0gMCkgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoaGFsQmFuZC0+Zm0ucmRzID09IDApIGJyZWFrOwotICAgICAgICAgICAgaWYgKChiYW5kLT5mbS5yZHMgJiBoYWxCYW5kLT5mbS5yZHMpICE9IDApIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqID09IGhhbFByb3BlcnRpZXMtPm51bV9iYW5kcykgY29udGludWU7Ci0KLSAgICAgICAgQUxPR0koImNvbnZlcnRQcm9wZXJ0aWVzKCkgQWRkaW5nIGJhbmQgdHlwZSAlZCByZWdpb24gJWQiLAotICAgICAgICAgICAgICBzS25vd25SZWdpb25Db25maWdzW2ldLmJhbmQudHlwZSAsIHNLbm93blJlZ2lvbkNvbmZpZ3NbaV0ucmVnaW9uKTsKLQotICAgICAgICBtZW1jcHkoJnByb3BlcnRpZXMtPmJhbmRzW3Byb3BlcnRpZXMtPm51bV9iYW5kcysrXSwKLSAgICAgICAgICAgICAgICZzS25vd25SZWdpb25Db25maWdzW2ldLAotICAgICAgICAgICAgICAgc2l6ZW9mKHJhZGlvX2JhbmRfY29uZmlnX3QpKTsKLSAgICB9Ci19Ci0KLSN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQiCi0KLVJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OkNhbGxiYWNrVGhyZWFkKGNvbnN0IHdwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCkKLSAgICA6IG1Nb2R1bGVDbGllbnQobW9kdWxlQ2xpZW50KSwgbU1lbW9yeURlYWxlcihuZXcgTWVtb3J5RGVhbGVyKDEwMjQgKiAxMDI0LCAiUmFkaW9TZXJ2aWNlIikpCi17Ci19Ci0KLVJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6On5DYWxsYmFja1RocmVhZCgpCi17Ci0gICAgbUV2ZW50UXVldWUuY2xlYXIoKTsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBydW4oIlJhZGlvU2VydmljZSBjYmsiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7Ci19Ci0KLWJvb2wgUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpCi17Ci0gICAgd2hpbGUgKCFleGl0UGVuZGluZygpKSB7Ci0gICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5OwotICAgICAgICBzcDxNb2R1bGVDbGllbnQ+IG1vZHVsZUNsaWVudDsKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOwotICAgICAgICAgICAgd2hpbGUgKG1FdmVudFF1ZXVlLmlzRW1wdHkoKSAmJiAhZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpIHNsZWVwIik7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29uZC53YWl0KG1DYWxsYmFja0xvY2spOwotICAgICAgICAgICAgICAgIEFMT0dWKCJDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpIHdha2UgdXAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBldmVudE1lbW9yeSA9IG1FdmVudFF1ZXVlWzBdOwotICAgICAgICAgICAgbUV2ZW50UXVldWUucmVtb3ZlQXQoMCk7Ci0gICAgICAgICAgICBtb2R1bGVDbGllbnQgPSBtTW9kdWxlQ2xpZW50LnByb21vdGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kdWxlQ2xpZW50ICE9IDApIHsKLSAgICAgICAgICAgIG1vZHVsZUNsaWVudC0+b25DYWxsYmFja0V2ZW50KGV2ZW50TWVtb3J5KTsKLSAgICAgICAgICAgIGV2ZW50TWVtb3J5LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OmV4aXQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKLSAgICByZXF1ZXN0RXhpdCgpOwotICAgIG1DYWxsYmFja0NvbmQuYnJvYWRjYXN0KCk7Ci19Ci0KLXNwPElNZW1vcnk+IFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnByZXBhcmVFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpCi17Ci0gICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7Ci0KLSAgICAvLyBUaGUgZXZlbnQgbGF5b3V0IGluIHNoYXJlZCBtZW1vcnkgaXM6Ci0gICAgLy8gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgYnl0ZXMgOiB0aGUgZXZlbnQgaXRzZWxmCi0gICAgLy8gNCBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YSBzaXplIG9yIDAKLSAgICAvLyBOIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ldGFkYXRhIGlmIHByZXNlbnQKLSAgICB1aW50MzJfdCBtZXRhZGF0YU9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpICsgc2l6ZW9mKHVpbnQzMl90KTsKLSAgICB1aW50MzJfdCBtZXRhZGF0YVNpemUgPSAwOwotCi0gICAgc3dpdGNoIChoYWxFdmVudC0+dHlwZSkgewotICAgIGNhc2UgUkFESU9fRVZFTlRfVFVORUQ6Ci0gICAgY2FzZSBSQURJT19FVkVOVF9BRl9TV0lUQ0g6Ci0gICAgICAgIGlmIChyYWRpb19tZXRhZGF0YV9jaGVjayhoYWxFdmVudC0+aW5mby5tZXRhZGF0YSkgPT0gMCkgewotICAgICAgICAgICAgbWV0YWRhdGFTaXplID0gKHVpbnQzMl90KXJhZGlvX21ldGFkYXRhX2dldF9zaXplKGhhbEV2ZW50LT5pbmZvLm1ldGFkYXRhKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX01FVEFEQVRBOgotICAgICAgICBpZiAocmFkaW9fbWV0YWRhdGFfY2hlY2soaGFsRXZlbnQtPm1ldGFkYXRhKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7Ci0gICAgICAgIH0KLSAgICAgICAgbWV0YWRhdGFTaXplID0gKHVpbnQzMl90KXJhZGlvX21ldGFkYXRhX2dldF9zaXplKGhhbEV2ZW50LT5tZXRhZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGV2ZW50TWVtb3J5ID0gbU1lbW9yeURlYWxlci0+YWxsb2NhdGUobWV0YWRhdGFPZmZzZXQgKyBtZXRhZGF0YVNpemUpOwotICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICBldmVudE1lbW9yeS5jbGVhcigpOwotICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7Ci0gICAgfQotCi0gICAgc3RydWN0IHJhZGlvX2V2ZW50ICpldmVudCA9IChzdHJ1Y3QgcmFkaW9fZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOwotCi0gICAgKih1aW50MzJfdCAqKSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQgLSBzaXplb2YodWludDMyX3QpKSA9IG1ldGFkYXRhU2l6ZTsKLQotICAgIGV2ZW50LT50eXBlID0gaGFsRXZlbnQtPnR5cGU7Ci0gICAgZXZlbnQtPnN0YXR1cyA9IGhhbEV2ZW50LT5zdGF0dXM7Ci0KLSAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9DT05GSUc6Ci0gICAgICAgIGV2ZW50LT5jb25maWcuYmFuZCA9IGhhbEV2ZW50LT5jb25maWc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkFESU9fRVZFTlRfVFVORUQ6Ci0gICAgY2FzZSBSQURJT19FVkVOVF9BRl9TV0lUQ0g6Ci0gICAgICAgIGV2ZW50LT5pbmZvID0gaGFsRXZlbnQtPmluZm87Ci0gICAgICAgIGlmIChtZXRhZGF0YVNpemUgIT0gMCkgewotICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCwgaGFsRXZlbnQtPmluZm8ubWV0YWRhdGEsIG1ldGFkYXRhU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UQToKLSAgICBjYXNlIFJBRElPX0VWRU5UX0VBOgotICAgIGNhc2UgUkFESU9fRVZFTlRfQU5URU5OQToKLSAgICBjYXNlIFJBRElPX0VWRU5UX0NPTlRST0w6Ci0gICAgICAgIGV2ZW50LT5vbiA9IGhhbEV2ZW50LT5vbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9NRVRBREFUQToKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0LCBoYWxFdmVudC0+bWV0YWRhdGEsIG1ldGFkYXRhU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9IV19GQUlMVVJFOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBldmVudE1lbW9yeTsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpzZW5kRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmV2ZW50KQotIHsKLSAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlRXZlbnQoZXZlbnQpOwotICAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgewotICAgICAgICAgcmV0dXJuOwotICAgICB9Ci0KLSAgICAgQXV0b011dGV4IGxvY2sobUNhbGxiYWNrTG9jayk7Ci0gICAgIG1FdmVudFF1ZXVlLmFkZChldmVudE1lbW9yeSk7Ci0gICAgIG1DYWxsYmFja0NvbmQuc2lnbmFsKCk7Ci0gICAgIEFMT0dWKCIlcyBET05FIiwgX19GVU5DVElPTl9fKTsKLX0KLQotCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJSYWRpb1NlcnZpY2U6Ok1vZHVsZSIKLQotUmFkaW9TZXJ2aWNlOjpNb2R1bGU6Ok1vZHVsZShzcDxSYWRpb0ludGVyZmFjZT4gaHdEZXZpY2UsIHJhZGlvX3Byb3BlcnRpZXMgcHJvcGVydGllcykKLSA6IG1Id0RldmljZShod0RldmljZSksIG1Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpLCBtTXV0ZSh0cnVlKQotewotfQotCi1SYWRpb1NlcnZpY2U6Ok1vZHVsZTo6fk1vZHVsZSgpIHsKLSAgICBtSHdEZXZpY2UuY2xlYXIoKTsKLSAgICBtTW9kdWxlQ2xpZW50cy5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6ZHVtcChpbnQgZmQgX191bnVzZWQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXNwPFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50PiBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6YWRkQ2xpZW50KGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbykKLXsKLSAgICBBTE9HVigiYWRkQ2xpZW50KCkgJXAgY29uZmlnICVwIHByb2R1Y3QgJXMiLCB0aGlzLCBjb25maWcsIG1Qcm9wZXJ0aWVzLnByb2R1Y3QpOwotCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIHNwPE1vZHVsZUNsaWVudD4gbW9kdWxlQ2xpZW50OwotICAgIGludCByZXQ7Ci0KLSAgICBpZiAobUh3RGV2aWNlID09IDApIHsKLSAgICAgICAgcmV0dXJuIG1vZHVsZUNsaWVudDsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVDbGllbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+Y2xpZW50KCkgPT0gY2xpZW50KSB7Ci0gICAgICAgICAgICAvLyBjbGllbnQgYWxyZWFkeSBjb25uZWN0ZWQ6IHJlamVjdAotICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUNsaWVudDsKLSAgICAgICAgfQotICAgIH0KLSAgICBtb2R1bGVDbGllbnQgPSBuZXcgTW9kdWxlQ2xpZW50KHRoaXMsIGNsaWVudCwgY29uZmlnLCBhdWRpbyk7Ci0KLSAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZzsKLSAgICBoYWxDb25maWcgPSBjb25maWctPmJhbmQ7Ci0KLSAgICAvLyBUdW5lciBwcmVlbXB0aW9uIGxvZ2ljOgotICAgIC8vIFRoZXJlIGlzIGEgbGltaXRlZCBhbW91bnQgb2YgdHVuZXJzIGFuZCBhIGxpbWl0ZWQgYW1vdW50IG9mIHJhZGlvIGF1ZGlvIHNvdXJjZXMgcGVyIG1vZHVsZS4KLSAgICAvLyBUaGUgbWluaW11bSBpcyBvbmUgdHVuZXIgYW5kIG9uZSBhdWRpbyBzb3VyY2UuCi0gICAgLy8gVGhlIG51bWJlcnMgb2YgdHVuZXJzIGFuZCBzb3VyY2VzIGFyZSBpbmRpY2F0ZWQgaW4gdGhlIG1vZHVsZSBwcm9wZXJ0aWVzLgotICAgIC8vIE5PVEU6IGN1cnJlbnQgZnJhbWV3b3JrIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgb25lIHJhZGlvIGF1ZGlvIHNvdXJjZS4KLSAgICAvLyBJdCBpcyBwb3NzaWJsZSB0byBvcGVuIG1vcmUgdGhhbiBvbmUgdHVuZXIgYXQgYSB0aW1lIGJ1dCBvbmx5IG9uZSB0dW5lciBjYW4gYmUgY29ubmVjdGVkCi0gICAgLy8gdG8gdGhlIHJhZGlvIGF1ZGlvIHNvdXJjZSAoQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKS4KLSAgICAvLyBUaGUgYmFzZSBydWxlIGlzIHRoYXQgYSBuZXdseSBjb25uZWN0ZWQgdHVuZXIgYWx3YXlzIHdpbnMsIGkuZS4gYWx3YXlzIGdldHMgYSB0dW5lcgotICAgIC8vIGFuZCBjYW4gdXNlIHRoZSBhdWRpbyBzb3VyY2UgaWYgcmVxdWVzdGVkLgotICAgIC8vIElmIGFub3RoZXIgY2xpZW50IGlzIHByZWVtcHRlZCwgaXQgaXMgbm90aWZpZWQgYnkgYSBjYWxsYmFjayB3aXRoIFJBRElPX0VWRU5UX0NPTlRST0wKLSAgICAvLyBpbmRpY2F0aW5nIGxvc3Mgb2YgY29udHJvbC4KLSAgICAvLyAtIElmIHRoZSBuZXdseSBjb25uZWN0ZWQgY2xpZW50IHJlcXVlc3RzIHRoZSBhdWRpbyBzb3VyY2UgKGF1ZGlvID09IHRydWUpOgotICAgIC8vICAgIC0gaWYgYW4gYXVkaW8gc291cmNlIGlzIGF2YWlsYWJsZQotICAgIC8vICAgICAgICAgIG5vIHByb2JsZW0KLSAgICAvLyAgICAtIGlmIG5vdDoKLSAgICAvLyAgICAgICAgICB0aGUgb2xkZXN0IGNsaWVudCBpbiB0aGUgbGlzdCB1c2luZyBhdWRpbyBpcyBwcmVlbXB0ZWQuCi0gICAgLy8gLSBJZiB0aGUgbmV3bHkgY29ubmVjdGVkIGNsaWVudCBkb2VzIG5vdCByZXF1ZXN0IHRoZSBhdWRpbyBzb3VyY2UgKGF1ZGlvID09IGZhbHNlKToKLSAgICAvLyAgICAtIGlmIGEgdHVuZXIgaXMgYXZhaWxhYmxlCi0gICAgLy8gICAgICAgICAgbm8gcHJvYmxlbQotICAgIC8vICAgIC0gaWYgbm90OgotICAgIC8vICAgICAgICAgIFRoZSBvbGRlc3QgY2xpZW50IG5vdCB1c2luZyBhdWRpbyBpcyBwcmVlbXB0ZWQgZmlyc3QgYW5kIGlmIG5vbmUgaXMgZm91bmQgdGhlCi0gICAgLy8gICAgICAgICAgdGhlIG9sZGVzdCBjbGllbnQgdXNpbmcgYXVkaW8gaXMgcHJlZW1wdGVkLgotICAgIC8vIEVhY2ggdGltZSBhIHR1bmVyIHVzaW5nIHRoZSBhdWRpbyBzb3VyY2UgaXMgb3BlbmVkIG9yIGNsb3NlZCwgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGlzCi0gICAgLy8gbm90aWZpZWQgb2YgdGhlIGNvbm5lY3Rpb24gb3IgZGlzY29ubmVjdGlvbiBvZiBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIuCi0KLSAgICBzcDxNb2R1bGVDbGllbnQ+IG9sZGVzdFR1bmVyOwotICAgIHNwPE1vZHVsZUNsaWVudD4gb2xkZXN0QXVkaW87Ci0gICAgc2l6ZV90IGFsbG9jYXRlZFR1bmVycyA9IDA7Ci0gICAgc2l6ZV90IGFsbG9jYXRlZEF1ZGlvID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVDbGllbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+Z2V0VHVuZXIoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmF1ZGlvKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAob2xkZXN0QXVkaW8gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBvbGRlc3RBdWRpbyA9IG1Nb2R1bGVDbGllbnRzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhbGxvY2F0ZWRBdWRpbysrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAob2xkZXN0VHVuZXIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBvbGRlc3RUdW5lciA9IG1Nb2R1bGVDbGllbnRzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhbGxvY2F0ZWRUdW5lcnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPFR1bmVySW50ZXJmYWNlPiBoYWxUdW5lcjsKLSAgICBzcDxNb2R1bGVDbGllbnQ+IHByZWVtdGVkQ2xpZW50OwotICAgIGlmIChhdWRpbykgewotICAgICAgICBpZiAoYWxsb2NhdGVkQXVkaW8gPj0gbVByb3BlcnRpZXMubnVtX2F1ZGlvX3NvdXJjZXMpIHsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKG9sZGVzdEF1ZGlvICE9IDAsICJhZGRDbGllbnQoKSBhbGxvY2F0ZWRBdWRpby9vbGRlc3RBdWRpbyBtaXNtYXRjaCIpOwotICAgICAgICAgICAgcHJlZW10ZWRDbGllbnQgPSBvbGRlc3RBdWRpbzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhbGxvY2F0ZWRBdWRpbyArIGFsbG9jYXRlZFR1bmVycyA+PSBtUHJvcGVydGllcy5udW1fdHVuZXJzKSB7Ci0gICAgICAgICAgICBpZiAoYWxsb2NhdGVkVHVuZXJzICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChvbGRlc3RUdW5lciAhPSAwLCAiYWRkQ2xpZW50KCkgYWxsb2NhdGVkVHVuZXJzL29sZGVzdFR1bmVyIG1pc21hdGNoIik7Ci0gICAgICAgICAgICAgICAgcHJlZW10ZWRDbGllbnQgPSBvbGRlc3RUdW5lcjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQob2xkZXN0QXVkaW8gIT0gMCwgImFkZENsaWVudCgpIGFsbG9jYXRlZEF1ZGlvL29sZGVzdEF1ZGlvIG1pc21hdGNoIik7Ci0gICAgICAgICAgICAgICAgcHJlZW10ZWRDbGllbnQgPSBvbGRlc3RBdWRpbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocHJlZW10ZWRDbGllbnQgIT0gMCkgewotICAgICAgICBoYWxUdW5lciA9IHByZWVtdGVkQ2xpZW50LT5nZXRUdW5lcigpOwotICAgICAgICBzcDxUdW5lckludGVyZmFjZT4gY2xlYXI7Ci0gICAgICAgIHByZWVtdGVkQ2xpZW50LT5zZXRUdW5lcihjbGVhcik7Ci0gICAgICAgIG1Id0RldmljZS0+Y2xvc2VUdW5lcihoYWxUdW5lcik7Ci0gICAgICAgIGlmIChwcmVlbXRlZENsaWVudC0+YXVkaW8oKSkgewotICAgICAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbihmYWxzZSwgIiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0ID0gbUh3RGV2aWNlLT5vcGVuVHVuZXIoJmhhbENvbmZpZywgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFR1bmVyKTsKLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgQUxPR1YoImFkZENsaWVudCgpIHNldFR1bmVyICVwIiwgaGFsVHVuZXIuZ2V0KCkpOwotICAgICAgICBtb2R1bGVDbGllbnQtPnNldFR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgbU1vZHVsZUNsaWVudHMuYWRkKG1vZHVsZUNsaWVudCk7Ci0gICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbih0cnVlLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoImFkZENsaWVudCgpIERPTkUgbW9kdWxlQ2xpZW50ICVwIiwgbW9kdWxlQ2xpZW50LmdldCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiJXMgb3Blbl90dW5lciBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKLSAgICAgICAgbW9kdWxlQ2xpZW50LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZHVsZUNsaWVudDsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6cmVtb3ZlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCkgewotICAgIEFMT0dWKCJyZW1vdmVDbGllbnQoKSIpOwotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBpbnQgcmV0OwotICAgIHNzaXplX3QgaW5kZXggPSAtMTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldID09IG1vZHVsZUNsaWVudCkgewotICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtTW9kdWxlQ2xpZW50cy5yZW1vdmVBdChpbmRleCk7Ci0gICAgc3A8VHVuZXJJbnRlcmZhY2U+IGhhbFR1bmVyID0gbW9kdWxlQ2xpZW50LT5nZXRUdW5lcigpOwotICAgIGlmIChoYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUh3RGV2aWNlICE9IDApIHsKLSAgICAgICAgbUh3RGV2aWNlLT5jbG9zZVR1bmVyKGhhbFR1bmVyKTsKLSAgICB9Ci0KLSAgICBpZiAobW9kdWxlQ2xpZW50LT5hdWRpbygpKSB7Ci0gICAgICAgIG5vdGlmeURldmljZUNvbm5lY3Rpb24oZmFsc2UsICIiKTsKLSAgICB9Ci0KLSAgICBtTXV0ZSA9IHRydWU7Ci0KLSAgICBpZiAobU1vZHVsZUNsaWVudHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUh3RGV2aWNlID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFR1bmVyIHJlYWxsb2NhdGlvbiBsb2dpYzoKLSAgICAvLyBXaGVuIGEgY2xpZW50IGlzIHJlbW92ZWQgYW5kIHdhcyBjb250cm9sbGluZyBhIHR1bmVyLCB0aGlzIHR1bmVyIHdpbGwgYmUgYWxsb2NhdGVkIHRvIGEKLSAgICAvLyBwcmV2aW91c2x5IHByZWVtcHRlZCBjbGllbnQuIFRoaXMgY2xpZW50IHdpbGwgYmUgbm90aWZpZWQgYnkgYSBjYWxsYmFjayB3aXRoCi0gICAgLy8gUkFESU9fRVZFTlRfQ09OVFJPTCBpbmRpY2F0aW5nIGdhaW4gb2YgY29udHJvbC4KLSAgICAvLyAtIElmIGEgcHJlZW1wdGVkIGNsaWVudCBpcyB3YWl0aW5nIGZvciBhbiBhdWRpbyBzb3VyY2UgYW5kIG9uZSBiZWNvbWVzIGF2YWlsYWJsZToKLSAgICAvLyAgICBBbGxvY2F0ZSB0aGUgdHVuZXIgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgY2xpZW50IHdhaXRpbmcgZm9yIGFuIGF1ZGlvIHNvdXJjZQotICAgIC8vIC0gSWYgbm90OgotICAgIC8vICAgIEFsbG9jYXRlIHRoZSB0dW5lciB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjbGllbnQuCi0gICAgLy8gRWFjaCB0aW1lIGEgdHVuZXIgdXNpbmcgdGhlIGF1ZGlvIHNvdXJjZSBpcyBvcGVuZWQgb3IgY2xvc2VkLCB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMKLSAgICAvLyBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbiBvciBkaXNjb25uZWN0aW9uIG9mIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUi4KLQotICAgIHNwPE1vZHVsZUNsaWVudD4geW91bmdlc3RDbGllbnQ7Ci0gICAgc3A8TW9kdWxlQ2xpZW50PiB5b3VuZ2VzdENsaWVudEF1ZGlvOwotICAgIHNpemVfdCBhbGxvY2F0ZWRUdW5lcnMgPSAwOwotICAgIHNpemVfdCBhbGxvY2F0ZWRBdWRpbyA9IDA7Ci0gICAgZm9yIChzc2l6ZV90IGkgPSBtTW9kdWxlQ2xpZW50cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmdldFR1bmVyKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5hdWRpbygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHlvdW5nZXN0Q2xpZW50QXVkaW8gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB5b3VuZ2VzdENsaWVudEF1ZGlvID0gbU1vZHVsZUNsaWVudHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoeW91bmdlc3RDbGllbnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB5b3VuZ2VzdENsaWVudCA9IG1Nb2R1bGVDbGllbnRzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+YXVkaW8oKSkgewotICAgICAgICAgICAgICAgIGFsbG9jYXRlZEF1ZGlvKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFsbG9jYXRlZFR1bmVycysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQUxPR19BU1NFUlQoYWxsb2NhdGVkVHVuZXJzICsgYWxsb2NhdGVkQXVkaW8gPCBtUHJvcGVydGllcy5udW1fdHVuZXJzLAotICAgICAgICAgICAgICAgICJyZW1vdmVDbGllbnQoKSByZW1vdmVkIGNsaWVudCBidXQgbm8gdHVuZXIgYXZhaWxhYmxlIik7Ci0KLSAgICBBTE9HX0FTU0VSVCghbW9kdWxlQ2xpZW50LT5hdWRpbygpIHx8IGFsbG9jYXRlZEF1ZGlvIDwgbVByb3BlcnRpZXMubnVtX2F1ZGlvX3NvdXJjZXMsCi0gICAgICAgICAgICAgICAgInJlbW92ZUNsaWVudCgpIHJlbW92ZWQgYXVkaW8gY2xpZW50IGJ1dCBubyB0dW5lciB3aXRoIGF1ZGlvIGF2YWlsYWJsZSIpOwotCi0gICAgaWYgKGFsbG9jYXRlZEF1ZGlvIDwgbVByb3BlcnRpZXMubnVtX2F1ZGlvX3NvdXJjZXMgJiYgeW91bmdlc3RDbGllbnRBdWRpbyAhPSAwKSB7Ci0gICAgICAgIHlvdW5nZXN0Q2xpZW50ID0geW91bmdlc3RDbGllbnRBdWRpbzsKLSAgICB9Ci0KLSAgICBBTE9HX0FTU0VSVCh5b3VuZ2VzdENsaWVudCAhPSAwLCAicmVtb3ZlQ2xpZW50KCkgcmVtb3ZlZCBjbGllbnQgbm8gY2FuZGlkYXRlIGZvdW5kIGZvciB0dW5lciIpOwotCi0gICAgc3RydWN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZyBoYWxDb25maWcgPSB5b3VuZ2VzdENsaWVudC0+aGFsQ29uZmlnKCk7Ci0gICAgcmV0ID0gbUh3RGV2aWNlLT5vcGVuVHVuZXIoJmhhbENvbmZpZywgeW91bmdlc3RDbGllbnQtPmF1ZGlvKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsVHVuZXIpOwotCi0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgIHlvdW5nZXN0Q2xpZW50LT5zZXRUdW5lcihoYWxUdW5lcik7Ci0gICAgICAgIGlmICh5b3VuZ2VzdENsaWVudC0+YXVkaW8oKSkgewotICAgICAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbih0cnVlLCAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlOjpzZXRNdXRlKGJvb2wgbXV0ZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtdXRlICE9IG1NdXRlKSB7Ci0gICAgICAgIG1NdXRlID0gbXV0ZTsKLSAgICAgICAgLy9UT0RPIG5vdGlmaWZ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIG9mIG1lZGlhIGFjdGl2aXR5IG9uIHJhZGlvIGF1ZGlvIGRldmljZQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlOjpnZXRNdXRlKGJvb2wgKm11dGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAqbXV0ZSA9IG1NdXRlOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi1jb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKlJhZGlvU2VydmljZTo6TW9kdWxlOjpnZXREZWZhdWx0Q29uZmlnKCkgY29uc3QKLXsKLSAgICBpZiAobVByb3BlcnRpZXMubnVtX2JhbmRzID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiAmbVByb3BlcnRpZXMuYmFuZHNbMF07Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6Om5vdGlmeURldmljZUNvbm5lY3Rpb24oYm9vbCBjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MpIHsKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA/IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGtSYWRpb1R1bmVyQXVkaW9EZXZpY2VOYW1lKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLX0KLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQiCi0KLVJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpNb2R1bGVDbGllbnQoY29uc3Qgc3A8TW9kdWxlPiYgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvKQotIDogbU1vZHVsZShtb2R1bGUpLCBtQ2xpZW50KGNsaWVudCksIG1Db25maWcoKmNvbmZpZyksIG1BdWRpbyhhdWRpbyksIG1UdW5lcigwKQotewotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpvbkZpcnN0UmVmKCkKLXsKLSAgICBtQ2FsbGJhY2tUaHJlYWQgPSBuZXcgQ2FsbGJhY2tUaHJlYWQodGhpcyk7Ci0gICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPmxpbmtUb0RlYXRoKHRoaXMpOwotfQotCi1SYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6fk1vZHVsZUNsaWVudCgpIHsKLSAgICBpZiAobUNsaWVudCAhPSAwKSB7Ci0gICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1DbGllbnQpLT51bmxpbmtUb0RlYXRoKHRoaXMpOwotICAgICAgICBtQ2xpZW50LmNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChtQ2FsbGJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2tUaHJlYWQtPmV4aXQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KQotewotICAgIG1DYWxsYmFja1RocmVhZC0+c2VuZEV2ZW50KGhhbEV2ZW50KTsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmR1bXAoaW50IGZkIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6ZGV0YWNoKCkgewotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3A8TW9kdWxlQ2xpZW50PiBzdHJvbmdNZSA9IHRoaXM7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtQ2xpZW50ICE9IDApIHsKLSAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1DbGllbnQpLT51bmxpbmtUb0RlYXRoKHRoaXMpOwotICAgICAgICAgICAgbUNsaWVudC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7Ci0gICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbW9kdWxlLT5yZW1vdmVDbGllbnQodGhpcyk7Ci19Ci0KLXJhZGlvX2hhbF9iYW5kX2NvbmZpZ190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpoYWxDb25maWcoKSBjb25zdAotewotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICByZXR1cm4gbUNvbmZpZy5iYW5kOwotfQotCi1zcDxUdW5lckludGVyZmFjZT4mIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRUdW5lcigpCi17Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBtVHVuZXI7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldFR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgQUxPR1YoIiVzICVwIiwgX19GVU5DVElPTl9fLCB0aGlzKTsKLQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBtVHVuZXIgPSB0dW5lcjsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLQotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50OwotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9DT05UUk9MOwotICAgIGV2ZW50LnN0YXR1cyA9IDA7Ci0gICAgZXZlbnQub24gPSBtVHVuZXIgIT0gMDsKLSAgICBtQ2FsbGJhY2tUaHJlYWQtPnNlbmRFdmVudCgmZXZlbnQpOwotICAgIEFMT0dWKCIlcyBET05FIiwgX19GVU5DVElPTl9fKTsKLQotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLQotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZzsKLSAgICAgICAgaGFsQ29uZmlnID0gY29uZmlnLT5iYW5kOwotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5zZXRDb25maWd1cmF0aW9uKCZoYWxDb25maWcpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ29uZmlnID0gKmNvbmZpZzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Db25maWcgPSAqY29uZmlnOwotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLQotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZzsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+Z2V0Q29uZmlndXJhdGlvbigmaGFsQ29uZmlnKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbUNvbmZpZy5iYW5kID0gaGFsQ29uZmlnOwotICAgICAgICB9Ci0gICAgfQotICAgICpjb25maWcgPSBtQ29uZmlnOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldE11dGUoYm9vbCBtdXRlKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgc3A8TW9kdWxlPiBtb2R1bGU7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgaWYgKG1UdW5lciA9PSAwIHx8ICFtQXVkaW8pIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKLSAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgIH0KLSAgICBtb2R1bGUtPnNldE11dGUobXV0ZSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0TXV0ZShib29sICptdXRlKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgc3A8TW9kdWxlPiBtb2R1bGU7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1vZHVsZS0+Z2V0TXV0ZShtdXRlKTsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+c2NhbihkaXJlY3Rpb24sIHNraXBTdWJDaGFubmVsKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+c3RlcChkaXJlY3Rpb24sIHNraXBTdWJDaGFubmVsKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnR1bmUodWludDMyX3QgY2hhbm5lbCwgdWludDMyX3Qgc3ViQ2hhbm5lbCkKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1UdW5lciAhPSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPnR1bmUoY2hhbm5lbCwgc3ViQ2hhbm5lbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpjYW5jZWwoKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+Y2FuY2VsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1UdW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPmdldFByb2dyYW1JbmZvcm1hdGlvbihpbmZvKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6aGFzQ29udHJvbChib29sICpoYXNDb250cm9sKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICpoYXNDb250cm9sID0gbVR1bmVyICE9IDA7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQotewotICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3A8SVJhZGlvQ2xpZW50PiBjbGllbnQ7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByYWRpb19ldmVudF90ICpldmVudCA9IChyYWRpb19ldmVudF90ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKTsKLSAgICAgICAgc3dpdGNoIChldmVudC0+dHlwZSkgewotICAgICAgICBjYXNlIFJBRElPX0VWRU5UX0NPTkZJRzoKLSAgICAgICAgICAgIG1Db25maWcuYmFuZCA9IGV2ZW50LT5jb25maWcuYmFuZDsKLSAgICAgICAgICAgIGV2ZW50LT5jb25maWcucmVnaW9uID0gbUNvbmZpZy5yZWdpb247Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2xpZW50ID0gbUNsaWVudDsKLSAgICB9Ci0gICAgaWYgKGNsaWVudCAhPSAwKSB7Ci0gICAgICAgIGNsaWVudC0+b25FdmVudChldmVudE1lbW9yeSk7Ci0gICAgfQotfQotCi0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmJpbmRlckRpZWQoCi0gICAgY29uc3Qgd3A8SUJpbmRlcj4gJndobyBfX3VudXNlZCkgewotICAgIEFMT0dXKCJjbGllbnQgYmluZGVyIGRpZWQgZm9yIGNsaWVudCAlcCIsIHRoaXMpOwotICAgIGRldGFjaCgpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0ZWI3YS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0vLyNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JQXBwT3BzQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvcmFkaW8uaD4KLSNpbmNsdWRlICJSYWRpb0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJDYWxsYmFja0ludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lbW9yeUhlYXBCYXNlOwotCi1jbGFzcyBSYWRpb1NlcnZpY2UgOgotICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPFJhZGlvU2VydmljZT4sCi0gICAgcHVibGljIEJuUmFkaW9TZXJ2aWNlCi17Ci0gICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8UmFkaW9TZXJ2aWNlPjsKLQotcHVibGljOgotICAgIGNsYXNzIE1vZHVsZUNsaWVudDsKLSAgICBjbGFzcyBNb2R1bGU7Ci0KLSAgICBzdGF0aWMgY2hhciBjb25zdCogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEucmFkaW8iOyB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU2VydmljZSgpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgflJhZGlvU2VydmljZSgpOwotCi0gICAgLy8gSVJhZGlvU2VydmljZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChyYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElSYWRpbz4mIHJhZGlvKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0KLSAgICBjbGFzcyBNb2R1bGUgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICBNb2R1bGUoc3A8UmFkaW9JbnRlcmZhY2U+IGh3RGV2aWNlLAotICAgICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyBwcm9wZXJ0aWVzKTsKLQotICAgICAgIHZpcnR1YWwgfk1vZHVsZSgpOwotCi0gICAgICAgICAgICAgICBzcDxNb2R1bGVDbGllbnQ+IGFkZENsaWVudChjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbyk7Ci0KLSAgICAgICAgICAgICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCk7Ci0KLSAgICAgICAgICAgICAgIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKTsKLQotICAgICAgICAgICAgICAgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgICAgc3A8UmFkaW9JbnRlcmZhY2U+IGh3RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlOyB9Ci0gICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgcHJvcGVydGllcygpIGNvbnN0IHsgcmV0dXJuIG1Qcm9wZXJ0aWVzOyB9Ci0gICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpnZXREZWZhdWx0Q29uZmlnKCkgY29uc3QgOwotCi0gICAgcHJpdmF0ZToKLQotICAgICAgIHZvaWQgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbihib29sIGNvbm5lY3RlZCwgY29uc3QgY2hhciAqYWRkcmVzcyk7Ci0KLSAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7ICAgICAgICAgIC8vIHByb3RlY3RzICBtTW9kdWxlQ2xpZW50cwotICAgICAgICBzcDxSYWRpb0ludGVyZmFjZT4gICAgICAgICAgICBtSHdEZXZpY2U7ICAgICAgLy8gSEFMIGhhcmR3YXJlIGRldmljZQotICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyBtUHJvcGVydGllczsgICAgLy8gY2FjaGVkIGhhcmR3YXJlIG1vZHVsZSBwcm9wZXJ0aWVzCi0gICAgICAgIFZlY3Rvcjwgc3A8TW9kdWxlQ2xpZW50PiA+ICAgIG1Nb2R1bGVDbGllbnRzOyAvLyBsaXN0IG9mIGF0dGFjaGVkIGNsaWVudHMKLSAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbU11dGU7ICAgICAgICAgIC8vIHJhZGlvIGF1ZGlvIHNvdXJjZSBzdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB1bm11dGVkLCBhdWRpbyBpcyByb3V0ZWQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGZvciBtZWRpYSB1c2UgY2FzZS4KLSAgICB9OyAvLyBjbGFzcyBNb2R1bGUKLQotICAgIGNsYXNzIENhbGxiYWNrVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgcHVibGljOgotCi0gICAgICAgIGV4cGxpY2l0IENhbGxiYWNrVGhyZWFkKGNvbnN0IHdwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCk7Ci0KLSAgICAgICAgdmlydHVhbCB+Q2FsbGJhY2tUaHJlYWQoKTsKLQotCi0gICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscwotICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwotCi0gICAgICAgIC8vIFJlZkJhc2UKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKLQotICAgICAgICAgICAgICAgIHZvaWQgZXhpdCgpOwotCi0gICAgICAgICAgICAgICAgdm9pZCBzZW5kRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KTsKLSAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBwcmVwYXJlRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHdwPE1vZHVsZUNsaWVudD4gICAgICBtTW9kdWxlQ2xpZW50OyAgICAvLyBjbGllbnQgbW9kdWxlIHRoZSB0aHJlYWQgYmVsb25ncyB0bwotICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgbUNhbGxiYWNrQ29uZDsgICAgLy8gY29uZGl0aW9uIHNpZ25hbGVkIHdoZW4gYSBuZXcgZXZlbnQgaXMgcG9zdGVkCi0gICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tMb2NrOyAgICAvLyBwcm90ZWN0cyBtRXZlbnRRdWV1ZQotICAgICAgICBWZWN0b3I8IHNwPElNZW1vcnk+ID4gbUV2ZW50UXVldWU7ICAgICAgLy8gcGVuZGluZyBjYWxsYmFjayBldmVudHMKLSAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiAgICAgIG1NZW1vcnlEZWFsZXI7ICAgIC8vIHNoYXJlZCBtZW1vcnkgZm9yIGNhbGxiYWNrIGV2ZW50Ci0gICAgfTsgLy8gY2xhc3MgQ2FsbGJhY2tUaHJlYWQKLQotICAgIGNsYXNzIE1vZHVsZUNsaWVudCA6IHB1YmxpYyBCblJhZGlvLAotICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKLSAgICAgICAgICAgICAgICAgICBwdWJsaWMgVHVuZXJDYWxsYmFja0ludGVyZmFjZSB7Ci0gICAgcHVibGljOgotCi0gICAgICAgTW9kdWxlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZT4mIG1vZHVsZSwKLSAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgYm9vbCBhdWRpbyk7Ci0KLSAgICAgICB2aXJ0dWFsIH5Nb2R1bGVDbGllbnQoKTsKLQotICAgICAgIC8vIElSYWRpbwotICAgICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbCgpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbyk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgICAgICAgICAgICAgc3A8SVJhZGlvQ2xpZW50PiBjbGllbnQoKSBjb25zdCB7IHJldHVybiBtQ2xpZW50OyB9Ci0gICAgICAgICAgICAgICB3cDxNb2R1bGU+IG1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGU7IH0KLSAgICAgICAgICAgICAgIHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190IGhhbENvbmZpZygpIGNvbnN0OwotICAgICAgICAgICAgICAgc3A8Q2FsbGJhY2tUaHJlYWQ+IGNhbGxiYWNrVGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbUNhbGxiYWNrVGhyZWFkOyB9Ci0gICAgICAgICAgICAgICB2b2lkIHNldFR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpOwotICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiBnZXRUdW5lcigpOwotICAgICAgICAgICAgICAgYm9vbCBhdWRpbygpIGNvbnN0IHsgcmV0dXJuIG1BdWRpbzsgfQotCi0gICAgICAgICAgICAgICB2b2lkIG9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnQpOwotCi0gICAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKLQotCi0gICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KLSAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7Ci0KLSAgICAgICAvLyBUdW5lckNhbGxiYWNrSW50ZXJmYWNlCi0gICAgICAgdmlydHVhbCB2b2lkIG9uRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmV2ZW50KTsKLQotICAgIHByaXZhdGU6Ci0KLSAgICAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgICAgICAgLy8gcHJvdGVjdHMgbUNsaWVudCwgbUNvbmZpZyBhbmQgbVR1bmVyCi0gICAgICAgIHdwPE1vZHVsZT4gICAgICAgICAgICAgICAgICBtTW9kdWxlOyAgICAgICAgIC8vIFRoZSBtb2R1bGUgdGhpcyBjbGllbnQgaXMgYXR0YWNoZWQgdG8KLSAgICAgICAgc3A8SVJhZGlvQ2xpZW50PiAgICAgICAgICAgIG1DbGllbnQ7ICAgICAgICAgLy8gZXZlbnQgY2FsbGJhY2sgYmluZGVyIGludGVyZmFjZQotICAgICAgICByYWRpb19iYW5kX2NvbmZpZ190ICAgICAgICAgbUNvbmZpZzsgICAgICAgICAvLyBjdXJyZW50IGJhbmQgY29uZmlndXJhdGlvbgotICAgICAgICBzcDxDYWxsYmFja1RocmVhZD4gICAgICAgICAgbUNhbGxiYWNrVGhyZWFkOyAvLyBldmVudCBjYWxsYmFjayB0aHJlYWQKLSAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1BdWRpbzsKLSAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+ICAgICAgICAgIG1UdW5lcjsgICAgICAgIC8vIEhBTCB0dW5lciBpbnRlcmZhY2UuIE5VTEwgaW5kaWNhdGVzIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNsaWVudCBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb24gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVuZXIKLSAgICB9OyAvLyBjbGFzcyBNb2R1bGVDbGllbnQKLQotCi0gICAgc3RhdGljIHZvaWQgY2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50LCB2b2lkICpjb29raWUpOwotCi1wcml2YXRlOgotCi0gICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRQcm9wZXJ0aWVzKHJhZGlvX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfcHJvcGVydGllc190ICpoYWxQcm9wZXJ0aWVzKTsKLSAgICBNdXRleCAgICAgICAgICAgICAgIG1TZXJ2aWNlTG9jazsgICAvLyBwcm90ZWN0cyBtTW9kdWxlcwotICAgIHZvbGF0aWxlIGludDMyX3QgICAgbU5leHRVbmlxdWVJZDsgIC8vIGZvciBtb2R1bGUgSUQgYWxsb2NhdGlvbgotICAgIERlZmF1bHRLZXllZFZlY3RvcjwgcmFkaW9faGFuZGxlX3QsIHNwPE1vZHVsZT4gPiBtTW9kdWxlczsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9UdW5lckNhbGxiYWNrSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9yYWRpby9UdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NzNjY2UuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vVHVuZXJDYWxsYmFja0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9DQUxMQkFDS19JTlRFUkZBQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0NBTExCQUNLX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgVHVuZXJDYWxsYmFja0ludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChyYWRpb19oYWxfZXZlbnRfdCAqZXZlbnQpID0gMDsKLQotcHJvdGVjdGVkOgotICAgICAgICAgICAgICAgICBUdW5lckNhbGxiYWNrSW50ZXJmYWNlKCkge30KLSAgICB2aXJ0dWFsICAgICAgflR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UoKSB7fQotCi19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0NBTExCQUNLX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9UdW5lckludGVyZmFjZS5oIGIvc2VydmljZXMvcmFkaW8vVHVuZXJJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2NTdkMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9UdW5lckludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfVFVORVJfSU5URVJGQUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9JTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFR1bmVySW50ZXJmYWNlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQotewotcHVibGljOgotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSBjdXJyZW50IHJhZGlvIGJhbmQgY29uZmlndXJhdGlvbiAoYmFuZCwgcmFuZ2UsIGNoYW5uZWwgc3BhY2luZyAuLi4pLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gY29uZmlnOiB0aGUgYmFuZCBjb25maWd1cmF0aW9uIHRvIGFwcGx5Ci0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIGNvbmZpZ3VyYXRpb24gY291bGQgYmUgYXBwbGllZAotICAgICAgICAgKiAgLUVJTlZBTCBpZiBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCBpcyBpbnZhbGlkCi0gICAgICAgICAqCi0gICAgICAgICAqIEF1dG9tYXRpY2FsbHkgY2FuY2VscyBwZW5kaW5nIHNjYW4sIHN0ZXAgb3IgdHVuZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBldmVudCBSQURJT19FVkVOVF9DT05GSUcgTVVTVCBiZSBjYWxsZWQgb25jZSB0aGUKLSAgICAgICAgICogY29uZmlndXJhdGlvbiBpcyBhcHBsaWVkIG9yIGEgZmFpbHVyZSBvY2N1cnMgb3IgYWZ0ZXIgYSB0aW1lIG91dC4KLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgc2V0Q29uZmlndXJhdGlvbihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmV0cmlldmUgY3VycmVudCByYWRpbyBiYW5kIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBjb25maWc6IHdoZXJlIHRvIHJldHVybiB0aGUgYmFuZCBjb25maWd1cmF0aW9uCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHZhbGlkIGNvbmZpZ3VyYXRpb24gaXMgcmV0dXJuZWQKLSAgICAgICAgICogIC1FSU5WQUwgaWYgaW52YWxpZCBhcmd1bWVudHMgYXJlIHBhc3NlZAotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCBnZXRDb25maWd1cmF0aW9uKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTdGFydCBzY2FubmluZyB1cCB0byBuZXh0IHZhbGlkIHN0YXRpb24uCi0gICAgICAgICAqIE11c3QgYmUgY2FsbGVkIHdoZW4gYSB2YWxpZCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGFwcGxpZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBkaXJlY3Rpb246IFJBRElPX0RJUkVDVElPTl9VUCBvciBSQURJT19ESVJFQ1RJT05fRE9XTgotICAgICAgICAgKiAtIHNraXBfc3ViX2NoYW5uZWw6IHZhbGlkIGZvciBIRCByYWRpbyBvciBkaWdpdGFsIHJhZGlvcyBvbmx5OiBpZ25vcmUgc3ViIGNoYW5uZWxzCi0gICAgICAgICAqICAoZS5nIFNQUyBmb3IgSEQgcmFkaW8pLgotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiBzY2FuIHN1Y2Nlc3NmdWxseSBzdGFydGVkCi0gICAgICAgICAqICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2UKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICoKLSAgICAgICAgICogQXV0b21hdGljYWxseSBjYW5jZWxzIHBlbmRpbmcgc2Nhbiwgc3RlcCBvciB0dW5lLgotICAgICAgICAgKgotICAgICAgICAgKiAgQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBldmVudCBSQURJT19FVkVOVF9UVU5FRCBNVVNUIGJlIGNhbGxlZCBvbmNlCi0gICAgICAgICAqICBsb2NrZWQgb24gYSBzdGF0aW9uIG9yIGFmdGVyIGEgdGltZSBvdXQgb3IgZnVsbCBmcmVxdWVuY3kgc2NhbiBpZgotICAgICAgICAgKiAgbm8gc3RhdGlvbiBmb3VuZC4gVGhlIGV2ZW50IHN0YXR1cyBzaG91bGQgaW5kaWNhdGUgaWYgYSB2YWxpZCBzdGF0aW9uCi0gICAgICAgICAqICBpcyB0dW5lZCBvciBub3QuCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBNb3ZlIG9uZSBjaGFubmVsIHNwYWNpbmcgdXAgb3IgZG93bi4KLSAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgd2hlbiBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gYXBwbGllZC4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGRpcmVjdGlvbjogUkFESU9fRElSRUNUSU9OX1VQIG9yIFJBRElPX0RJUkVDVElPTl9ET1dOCi0gICAgICAgICAqIC0gc2tpcF9zdWJfY2hhbm5lbDogdmFsaWQgZm9yIEhEIHJhZGlvIG9yIGRpZ2l0YWwgcmFkaW9zIG9ubHk6IGlnbm9yZSBzdWIgY2hhbm5lbHMKLSAgICAgICAgICogIChlLmcgU1BTIGZvciBIRCByYWRpbykuCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHN0ZXAgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKiAgLUVOT0RFViBpZiBhbm90aGVyIGVycm9yIG9jY3VycwotICAgICAgICAgKgotICAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbmNlbHMgcGVuZGluZyBzY2FuLCBzdGVwIG9yIHR1bmUuCi0gICAgICAgICAqCi0gICAgICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggZXZlbnQgUkFESU9fRVZFTlRfVFVORUQgTVVTVCBiZSBjYWxsZWQgb25jZQotICAgICAgICAgKiBzdGVwIGNvbXBsZXRlZCBvciBhZnRlciBhIHRpbWUgb3V0LiBUaGUgZXZlbnQgc3RhdHVzIHNob3VsZCBpbmRpY2F0ZQotICAgICAgICAgKiBpZiBhIHZhbGlkIHN0YXRpb24gaXMgdHVuZWQgb3Igbm90LgotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVHVuZSB0byBzcGVjaWZpZWQgZnJlcXVlbmN5LgotICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCB3aGVuIGEgdmFsaWQgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBhcHBsaWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gY2hhbm5lbDogY2hhbm5lbCB0byB0dW5lIHRvLiBBIGZyZXF1ZW5jeSBpbiBrSHogZm9yIEFNL0ZNL0hEIFJhZGlvIGJhbmRzLgotICAgICAgICAgKiAtIHN1Yl9jaGFubmVsOiB2YWxpZCBmb3IgSEQgcmFkaW8gb3IgZGlnaXRhbCByYWRpb3Mgb25seTogKGUuZyBTUFMgbnVtYmVyIGZvciBIRCByYWRpbykuCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHR1bmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKiAgLUVJTlZBTCBpZiBpbnZhbGlkIGFyZ3VtZW50cyBhcmUgcGFzc2VkCi0gICAgICAgICAqICAtRU5PREVWIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJzCi0gICAgICAgICAqCi0gICAgICAgICAqIEF1dG9tYXRpY2FsbHkgY2FuY2VscyBwZW5kaW5nIHNjYW4sIHN0ZXAgb3IgdHVuZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBldmVudCBSQURJT19FVkVOVF9UVU5FRCBNVVNUIGJlIGNhbGxlZCBvbmNlCi0gICAgICAgICAqIHR1bmVkIG9yIGFmdGVyIGEgdGltZSBvdXQuIFRoZSBldmVudCBzdGF0dXMgc2hvdWxkIGluZGljYXRlCi0gICAgICAgICAqIGlmIGEgdmFsaWQgc3RhdGlvbiBpcyB0dW5lZCBvciBub3QuCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCkgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENhbmNlbCBhIHNjYW4sIHN0ZXAgb3IgdHVuZSBvcGVyYXRpb24uCi0gICAgICAgICAqIE11c3QgYmUgY2FsbGVkIHdoaWxlIGEgc2Nhbiwgc3RlcCBvciB0dW5lIG9wZXJhdGlvbiBpcyBwZW5kaW5nCi0gICAgICAgICAqIChjYWxsYmFjayBub3QgeWV0IHNlbnQpLgotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiBzdWNjZXNzZnVsCi0gICAgICAgICAqICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2UKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIGNhbGxiYWNrIGlzIG5vdCBzZW50LgotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCBjYW5jZWwoKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmV0cmlldmUgY3VycmVudCBzdGF0aW9uIGluZm9ybWF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gaW5mbzogd2hlcmUgdG8gcmV0dXJuIHRoZSBwcm9ncmFtIGluZm8uCi0gICAgICAgICAqIElmIGluZm8tPm1ldGFkYXRhIGlzIE5VTEwuIG5vIG1ldGEgZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAgICAgICAqIElmIG1ldGEgZGF0YSBtdXN0IGJlIHJldHVybmVkLCB0aGV5IHNob3VsZCBiZSBhZGRlZCB0byBvciBjbG9uZWQgdG8KLSAgICAgICAgICogaW5mby0+bWV0YWRhdGEsIG5vdCBwYXNzZWQgZnJvbSBhIG5ld2x5IGNyZWF0ZWQgbWV0YSBkYXRhIGJ1ZmZlci4KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgdHVuZWQgYW5kIGluZm9ybWF0aW9uIGF2YWlsYWJsZQotICAgICAgICAgKiAgLUVJTlZBTCBpZiBpbnZhbGlkIGFyZ3VtZW50cyBhcmUgcGFzc2VkCi0gICAgICAgICAqICAtRU5PREVWIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJzCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IGdldFByb2dyYW1JbmZvcm1hdGlvbihyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbykgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgICAgICAgICAgVHVuZXJJbnRlcmZhY2UoKSB7fQotICAgIHZpcnR1YWwgICAgIH5UdW5lckludGVyZmFjZSgpIHt9Ci0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVFVORVJfSU5URVJGQUNFX0gK