ZGlmZiAtLWdpdCBhL2NhbWVyYS9RQ2FtZXJhSFdJLmNwcCBiL2NhbWVyYS9RQ2FtZXJhSFdJLmNwcAppbmRleCBjYzg4ZjhhLi5lZWM4YWRiIDEwMDc1NQotLS0gYS9jYW1lcmEvUUNhbWVyYUhXSS5jcHAKKysrIGIvY2FtZXJhL1FDYW1lcmFIV0kuY3BwCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KIAogI2luY2x1ZGUgIlFDYW1lcmFIQUwuaCIKICNpbmNsdWRlICJRQ2FtZXJhSFdJLmgiCkBAIC0yODIsNiArMjg0LDEzIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbUNhbWVyYVN0YXRlID0gQ0FNRVJBX1NUQVRFX1JFQURZOworICAgIGxpYmRuciA9IGRsb3BlbigibGlibW9ycGhvX25vaXNlX3JlZHVjdGlvbi5zbyIsIFJUTERfTk9XKTsKKyAgICBpZiAobGliZG5yKSB7CisgICAgICAgIEFMT0dEKCJPcGVuIE1NIGNhbWVyYSBETCBsaWJtb3JwaG9fbm9pc2VfcmVkdWN0aW9uIGxvYWRlZCBhdCAlcCAmICVwICIsIGxpYmRucik7CisgICAgICAgICoodm9pZCAqKikmTElOS19tb3JwaG9fRE5SX1Byb2Nlc3NGcmFtZSA9IGRsc3ltKGxpYmRuciwgIkxJTktfbW1fY2FtZXJhX21vcnBob19ub2lzZV9yZWR1Y3Rpb24iKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIG9wZW4gbGlibW9ycGhvX25vaXNlX3JlZHVjdGlvbiIpOwogCiAgICAgQUxPR0koIlFDYW1lcmFIYXJkd2FyZUludGVyZmFjZTogWCIpOwogfQpAQCAtMzMyLDYgKzM0MSwxMSBAQAogICAgICAgICBRQ2FtZXJhU3RyZWFtX1NuYXBzaG90OjpkZWxldGVJbnN0YW5jZSAobVN0cmVhbVNuYXApOwogICAgICAgICBtU3RyZWFtU25hcCA9IE5VTEw7CiAgICAgfQorICAgIGlmIChsaWJkbnIgIT0gTlVMTCkgeworICAgICAgICAgZGxjbG9zZShsaWJkbnIpOworICAgICAgICAgbGliZG5yID0gTlVMTDsKKyAgICAgICAgIEFMT0dEKCJjbG9zZWQgbGlibW9ycGhvX25vaXNlX3JlZHVjdGlvbi5zbyIpOworICAgIH0KIAogICAgIGlmIChtU3RyZWFtTGl2ZVNuYXApewogICAgICAgICBRQ2FtZXJhU3RyZWFtX1NuYXBzaG90OjpkZWxldGVJbnN0YW5jZSAobVN0cmVhbUxpdmVTbmFwKTsKQEAgLTEzODksNyArMTQwMyw3IEBACiAKIHN0YXR1c190IFFDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6YXV0b0ZvY3VzTW92ZUV2ZW50KGNhbV9jdHJsX3N0YXR1c190ICpzdGF0dXMsIGFwcF9ub3RpZnlfY2JfdCAqYXBwX2NiKQogewotICAgIEFMT0dJKCJhdXRvRm9jdXNNb3ZlRXZlbnQ6IEUiKTsKKyAgICBBTE9HVigiYXV0b0ZvY3VzTW92ZUV2ZW50OiBFIik7CiAgICAgaW50IHJldCA9IE5PX0VSUk9SOwogCiAgICAgaXNwM2FfYWZfbW9kZV90IGFmTW9kZSA9IGdldEF1dG9Gb2N1c01vZGUobVBhcmFtZXRlcnMpOwpAQCAtMTQxMiw3ICsxNDI2LDcgQEAKICAgICAgICAgICAgIEFMT0dFKCIlczpVbmtub3duIEFGIE1vdmUgU3RhdHVzIHJlY2VpdmVkICglZCkgcmVjZWl2ZWQiLF9fZnVuY19fLCpzdGF0dXMpOwogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dJKCJhdXRvRm9jdXNNb3ZlRXZlbnQ6IFgiKTsKKyAgICBBTE9HVigiYXV0b0ZvY3VzTW92ZUV2ZW50OiBYIik7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ3Myw3ICsxNDg3LDcgQEAKICAgICAgIGFwcF9jYi0+YXJnbV9ub3RpZnkuZXh0MiA9IDA7CiAgICAgICBhcHBfY2ItPmFyZ21fbm90aWZ5LmNvb2tpZSA9ICBtQ2FsbGJhY2tDb29raWU7CiAKLSAgICAgIEFMT0dEKCJBdXRvIGZvdWNzIHN0YXRlID0lZCIsICpzdGF0dXMpOworICAgICAgQUxPR1YoIkF1dG8gZm9jdXMgc3RhdGUgPSVkIiwgKnN0YXR1cyk7CiAgICAgICBpZigqc3RhdHVzPT1DQU1fQ1RSTF9TVUNDRVNTKSB7CiAgICAgICAgIGFwcF9jYi0+YXJnbV9ub3RpZnkuZXh0MSA9IHRydWU7CiAgICAgICB9CmRpZmYgLS1naXQgYS9jYW1lcmEvUUNhbWVyYUhXSS5oIGIvY2FtZXJhL1FDYW1lcmFIV0kuaAppbmRleCBjNjg5YjcwLi4yYmM4YWJjIDEwMDY0NAotLS0gYS9jYW1lcmEvUUNhbWVyYUhXSS5oCisrKyBiL2NhbWVyYS9RQ2FtZXJhSFdJLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlICJRQ2FtZXJhU3RyZWFtLmgiCiAjaW5jbHVkZSAiUUNhbWVyYV9JbnRmLmgiCiAKKyNpbmNsdWRlICJoZHIvaW5jbHVkZS9tb3JwaG9fbm9pc2VfcmVkdWN0aW9uX2V4dC5oIgogLy9FcnJvciBjb2RlcwogI2RlZmluZSAgTk9UX0ZPVU5EIC0xCiAjZGVmaW5lIE1BWF9aT09NX1JBVElPUyA2MgpAQCAtODAwLDYgKzgwMSw4IEBACiAgICAgY2FtZXJhX3NpemVfdHlwZSogbVZpZGVvU2l6ZXM7CiAgICAgY29uc3QgY2FtZXJhX3NpemVfdHlwZSAqIG1QaWN0dXJlU2l6ZXNQdHI7CiAgICAgSEFMX2NhbWVyYV9zdGF0ZV90eXBlX3QgbUNhbWVyYVN0YXRlOworICAgIHZvaWQgKmxpYmRucjsKKyAgICBpbnQgKCpMSU5LX21vcnBob19ETlJfUHJvY2Vzc0ZyYW1lKSh1bnNpZ25lZCBjaGFyKiB5dXZJbWFnZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgeV9sZXZlbCwgaW50IGNfbGV2ZWwpOwogCiAgICAgIC8qIFRlbXBvcmFyeSAtIGNhbiBiZSByZW1vdmVkIGFmdGVyIEhvbmV5Y29tYiovCiAjaWZkZWYgVVNFX0lPTgpkaWZmIC0tZ2l0IGEvY2FtZXJhL1FDYW1lcmFIV0lfU3RpbGwuY3BwIGIvY2FtZXJhL1FDYW1lcmFIV0lfU3RpbGwuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNTgwZjM2OC4uN2FjZDhmZAotLS0gYS9jYW1lcmEvUUNhbWVyYUhXSV9TdGlsbC5jcHAKKysrIGIvY2FtZXJhL1FDYW1lcmFIV0lfU3RpbGwuY3BwCkBAIC0xODMyLDYgKzE4MzIsNyBAQAogICAgIGludCBidWZfaW5kZXggPSAwOwogICAgIGNvbW1vbl9jcm9wX3QgY3JvcDsKICAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBpbnQgY3VyX2x1eF9pZHggPSAwOwogCiAgICAgY2FtZXJhX25vdGlmeV9jYWxsYmFjayAgICAgICAgIG5vdGlmeUNiOwogICAgIGNhbWVyYV9kYXRhX2NhbGxiYWNrICAgICAgICAgICBkYXRhQ2IsIGpwZ0RhdGFDYjsKQEAgLTE5MTAsNyArMTkxMSwzNCBAQAogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBtZW1jcHkoZnJhbWUsIHJlY3ZkX2ZyYW1lLCBzaXplb2YobW1fY2FtZXJhX2NoX2RhdGFfYnVmX3QpKTsKKyAgICAgICAgcmMgPSBjYW1fY29uZmlnX2dldF9wYXJtKG1DYW1lcmFJZCwgTU1fQ0FNRVJBX1BBUk1fTFVYX0lEWCwgJmN1cl9sdXhfaWR4KTsKIAorICAgICAgICBpZiAoY3VyX2x1eF9pZHggPiAzNzApIHsKKyAgICAgICAgICAgIHN0YXRpYyBpbnQgaW5wdXRfd2lkdGggPSAwLCBpbnB1dF9oZWlnaHQgPSAwOworICAgICAgICAgICAgc3RhdGljIGludCByZXQgPSAwOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZG5yX2J1ZmZlcjsKKyAgICAgICAgICAgIGlucHV0X3dpZHRoID0gbVBpY3R1cmVXaWR0aDsKKyAgICAgICAgICAgIGlucHV0X2hlaWdodCA9IG1QaWN0dXJlSGVpZ2h0OworCisgICAgICAgICAgICBBTE9HVigiJXM6IHJlY2VpdmVkIGZyYW1lICVkICogJWQiLCBfX2Z1bmNfXywgaW5wdXRfd2lkdGgsIGlucHV0X2hlaWdodCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG5yX2J1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGlucHV0X3dpZHRoKmlucHV0X2hlaWdodCozLzIpOworICAgICAgICAgICAgICAgIGlmIChkbnJfYnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJkbnJfYnVmZmVyIGFsbG9jIGZhaWwiKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiZG5yX2J1ZmZlciBhbGxvY2F0ZWQgc2l6ZSA6ICVkIiwgaW5wdXRfd2lkdGgqaW5wdXRfaGVpZ2h0KjMvMik7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRucl9idWZmZXIsICh1aW50OF90ICopZnJhbWUtPnNuYXBzaG90Lm1haW4uZnJhbWUtPmJ1ZmZlciwgaW5wdXRfd2lkdGgqaW5wdXRfaGVpZ2h0KjMvMik7CisgICAgICAgICAgICAgICAgQUxPR1YoImRucl9idWZmZXIgbWVtY3B5IGNvbXBsZXRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJbRE5SXSBETlIgUHJvY2Vzc2luZyBTdGFydC4uLi4gJWQgKiAlZFxuIiwgbVBpY3R1cmVXaWR0aCwgbVBpY3R1cmVIZWlnaHQpOworICAgICAgICAgICAgcmV0ID0gTk9fRVJST1I7CisgICAgICAgICAgICBpZiAobUhhbENhbUN0cmwtPkxJTktfbW9ycGhvX0ROUl9Qcm9jZXNzRnJhbWUpCisgICAgICAgICAgICAgICAgcmV0ID0gKGludCltSGFsQ2FtQ3RybC0+TElOS19tb3JwaG9fRE5SX1Byb2Nlc3NGcmFtZShkbnJfYnVmZmVyLCBtUGljdHVyZVdpZHRoLCBtUGljdHVyZUhlaWdodCwgMSwgMSk7IC8vYnJpZ2h0LT5ub3JtYWwtPmRhcmsKKyAgICAgICAgICAgIEFMT0dWKCJbRE5SXSBETlIgUHJvY2Vzc2luZyByZXN1bHQuLi4uIHJldCA9ICVkXG4iLCByZXQpOworICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopcmVjdmRfZnJhbWUtPnNuYXBzaG90Lm1haW4uZnJhbWUtPmJ1ZmZlciwgKHVpbnQ4X3QgKilkbnJfYnVmZmVyLCBtUGljdHVyZVdpZHRoKm1QaWN0dXJlSGVpZ2h0KjMvMik7CisgICAgICAgICAgICBBTE9HVigiW0ROUl0gRE5SIFByb2Nlc3NpbmcgRU5ELi4uLlxuIik7CisgICAgICAgICAgICBpZihkbnJfYnVmZmVyKQorICAgICAgICAgICAgICAgIGZyZWUoZG5yX2J1ZmZlcik7CisgICAgICAgIH0KICAgICAgICAgLy9tU3RvcENhbGxiYWNrTG9jay5sb2NrKCk7CiAKICAgICAgICAgLy8gb25seSBpbiBaU0wgbW9kZSBhbmQgV2F2ZWxldCBEZW5vaXNlIGlzIGVuYWJsZWQsIHdlIHdpbGwgc2VuZCBmcmFtZSB0byBkZWFtb24gdG8gZG8gV0ROCmRpZmYgLS1naXQgYS9jYW1lcmEvUUNhbWVyYV9JbnRmLmggYi9jYW1lcmEvUUNhbWVyYV9JbnRmLmgKaW5kZXggZDc1MTRlMi4uMTNlY2M2MyAxMDA2NDQKLS0tIGEvY2FtZXJhL1FDYW1lcmFfSW50Zi5oCisrKyBiL2NhbWVyYS9RQ2FtZXJhX0ludGYuaApAQCAtNDcwLDYgKzQ3MCw3IEBACiAjaWZkZWYgRkFTVF9BRgogICAgIE1NX0NBTUVSQV9QQVJNX0NBRl9UWVBFLAogI2VuZGlmCisgICAgTU1fQ0FNRVJBX1BBUk1fTFVYX0lEWCwKICAgICBNTV9DQU1FUkFfUEFSTV9NQVgKIH0gbW1fY2FtZXJhX3Bhcm1fdHlwZV90OwogCkBAIC02MTksNiArNjIwLDcgQEAKICNpZmRlZiBGQVNUX0FGCiAgIENBTUVSQV9TRVRfUEFSTV9DQUZfVFlQRSwKICNlbmRpZgorICBDQU1FUkFfR0VUX1BBUk1fTFVYX0lEWCwKICAgQ0FNRVJBX0NUUkxfUEFSTV9NQVgKIH0gY2FtX2N0cmxfdHlwZTsKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL2hkci9pbmNsdWRlL21vcnBob19hcGkuaCBiL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1ZTI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fYXBpLmgKQEAgLTAsMCArMSwyMyBAQAorLyoqDQorICogQGZpbGUgICAgIG1vcnBob19hcGkuaA0KKyAqIEBicmllZiAgICBBUEmK1pCUkuiLYILMg32DToONDQorICogQHZlcnNpb24gIDEuMC4wDQorICogQGRhdGUgICAgIFR1ZSBTZXAgMjEgMTc6Mzc6MzUgMjAxMA0KKyAqDQorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTIgTW9ycGhvLCBJbmMuDQorICovDQorDQorI2lmbmRlZiBNT1JQSE9fQVBJX0gNCisjZGVmaW5lIE1PUlBIT19BUElfSA0KKw0KKy8qKiANCisgKiBBUEmK1pCUgvCS6ItggreC6YLGgquCyY5nl3AuDQorICogV2luZG93c4LFRExMgvCN7JCsgreC6Y3bk5mCyY+RgquKt4KmgumCsYLGgsWQ2ILokdaCponClFwNCisgKi8NCisjaWYgZGVmaW5lZChNT1JQSE9fRExMKSAmJiBkZWZpbmVkKF9XSU4zMikNCisjZGVmaW5lIE1PUlBIT19BUEkodHlwZSkgX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybiB0eXBlDQorI2Vsc2UNCisjZGVmaW5lIE1PUlBIT19BUEkodHlwZSkgZXh0ZXJuIHR5cGUNCisjZW5kaWYNCisNCisjZW5kaWYgLyogI2lmbmRlZiBNT1JQSE9fQVBJX0ggKi8NCmRpZmYgLS1naXQgYS9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX2Vhc3lfaGRyLmggYi9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX2Vhc3lfaGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0MTc2MgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fZWFzeV9oZHIuaApAQCAtMCwwICsxLDc2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBtb3JwaG9fZWFzeV9oZHIuaA0KKyAqIFtDUDkzMi9DUkxGXSB7IIKgIJWEjYaJu5X7jq6OqZOulLuS6JdwIH0NCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEyIE1vcnBobyxJbmMuDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBNT1JQSE9fRUFTWV9IRFJfSA0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0gNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAibW9ycGhvX2FwaS5oIg0KKyNpbmNsdWRlICJtb3JwaG9fZXJyb3IuaCINCisjaW5jbHVkZSAibW9ycGhvX2ltYWdlX2RhdGEuaCINCisjaW5jbHVkZSAibW9ycGhvX3JlY3RfaW50LmgiDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfVkVSICJNb3JwaG8gRWFzeUhEUiBWZXIuMi4wLjEgMjAxMi8wNy8xOCINCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKiAoaW5wdXQtbGltaXRhaW9uKSAqLw0KKw0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX01JTl9JTUFHRV9XSURUSCAgICAxMDANCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NQVhfSU1BR0VfV0lEVEggICA4MTkyDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfTUlOX0lNQUdFX0hFSUdIVCAgIDEwMA0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX01BWF9JTUFHRV9IRUlHSFQgIDgxOTINCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NSU5fTklNQUdFUyAgIDINCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NQVhfTklNQUdFUyAgMTANCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKiAocGFyYW1ldGVyKSAqLw0KKw0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0RJU0FCTEVEIDANCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9FTkFCTEVEICAxDQorDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfSU1BR0VfQUxJR05NRU5UX0RFRkFVTFQgIE1PUlBIT19FQVNZX0hEUl9FTkFCTEVEDQorDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfR0hPU1RfUkVNT1ZBTF9ERUZBVUxUICBNT1JQSE9fRUFTWV9IRFJfRU5BQkxFRA0KKw0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0FVVE9fU0NBTElOR19ERUZBVUxUICBNT1JQSE9fRUFTWV9IRFJfRU5BQkxFRA0KKw0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0ZBQ0VfREVURUNUSU9OX0RFRkFVTFQgIE1PUlBIT19FQVNZX0hEUl9FTkFCTEVEDQorDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfRkFJTF9TT0ZUX01FUkdJTkdfREVGQVVMVCAgTU9SUEhPX0VBU1lfSERSX0VOQUJMRUQNCisNCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9HSE9TVF9ERVRFQ1RJT05fU0VOU0lUSVZJVFlfTEVWRUxfTUlOICAgICAgMA0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0dIT1NUX0RFVEVDVElPTl9TRU5TSVRJVklUWV9MRVZFTF9NQVggICAgIDEwDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfR0hPU1RfREVURUNUSU9OX1NFTlNJVElWSVRZX0xFVkVMX0RFRkFVTFQgIDcNCisNCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9TTU9PVEhORVNTX0xFVkVMX01JTiAgICAgIDANCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9TTU9PVEhORVNTX0xFVkVMX01BWCAgICAgMTANCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9TTU9PVEhORVNTX0xFVkVMX0RFRkFVTFQgIDYNCisNCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9QQVJBTV9NSU4gICAgICAgIDANCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9QQVJBTV9NQVggICAgICAyNTUNCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9QQVJBTTFfREVGQVVMVCAgIDANCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9QQVJBTTJfREVGQVVMVCAxMjgNCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9QQVJBTTNfREVGQVVMVCAgIDANCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9NRVJHRV9QQVJBTTRfREVGQVVMVCAyNTUNCisNCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9SRUxJQUJMRV9SRUNUX1JBVEVfVEhSRVNIT0xEX01JTiAgICAgICAwDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfUkVMSUFCTEVfUkVDVF9SQVRFX1RIUkVTSE9MRF9NQVggICAgIDEwMA0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX1JFTElBQkxFX1JFQ1RfUkFURV9USFJFU0hPTERfREVGQVVMVCAgODANCisNCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9HSE9TVF9SQVRFX1RIUkVTSE9MRF9NSU4gICAgICAgMA0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0dIT1NUX1JBVEVfVEhSRVNIT0xEX01BWCAgICAgMTAwDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfR0hPU1RfUkFURV9USFJFU0hPTERfREVGQVVMVCAgOTANCisNCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9DQ19PRkZTRVRfTUlOICAgICAgICAgIDANCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9DQ19PRkZTRVRfTUFYICAgICAgICAyNTUNCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9DQ19ZX09GRlNFVF9ERUZBVUxUICAgIDANCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9DQ19DX09GRlNFVF9ERUZBVUxUICAgIDANCisNCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9DQ19HQUlOX01JTiAgICAgICAgMTAwDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfQ0NfR0FJTl9NQVggICAgICAgMjAwMA0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0NDX1lfR0FJTl9ERUZBVUxUIDEwMDANCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9DQ19DX0dBSU5fREVGQVVMVCAxMDAwDQorDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfQ0NfR0FNTUFfTUlOICAgICAgICAxMDANCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9DQ19HQU1NQV9NQVggICAgICAgMjAwMA0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0NDX1lfR0FNTUFfREVGQVVMVCAxMDAwDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfQ0NfQ19HQU1NQV9ERUZBVUxUIDEwMDANCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKiAobWVyZ2Utc3RhdHVzKSAqLw0KKw0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwDQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfRVJST1JfSU1BR0VfQUxJR05NRU5UX0ZBSUxVUkUgIDB4MDAwMDAwMDENCisjZGVmaW5lIE1PUlBIT19FQVNZX0hEUl9FUlJPUl9FWFBfRVNUSU1BVElPTl9GQUlMVVJFICAgMHgwMDAwMDAwMg0KKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0VSUk9SX01PU1RMWV9HSE9TVCAgICAgICAgICAgICAweDAwMDAwMDA0DQorI2RlZmluZSBNT1JQSE9fRUFTWV9IRFJfRVJST1JfSU5URVJOQUwgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDANCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit0eXBlZGVmIHN0cnVjdCBfbW9ycGhvX0Vhc3lIRFIgbW9ycGhvX0Vhc3lIRFI7DQordHlwZWRlZiBzdHJ1Y3QgX21vcnBob19FYXN5SERSX0NhbGxiYWNrIG1vcnBob19FYXN5SERSX0NhbGxiYWNrOw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qKiBFYXN5SERSICovDQorc3RydWN0IF9tb3JwaG9fRWFzeUhEUg0KK3sNCisgICAgdm9pZCAqcDsgLyoqPCCT4JWUjVyRopHMgtaCzIN8g0ODk4NeICovDQorfTsNCisNCisvKiogRWFzeUhEUiBDYWxsYmFjayAoZm9yIG11bHRpLXRocmVhZCBwcm9jZXNzaW5nKSAqLw0KK3N0cnVjdCBfbW9ycGhvX0Vhc3lIRFJfQ2FsbGJhY2sNCit7DQorICAgIHZvaWQgKnA7IC8qKjwgg1KBW4OLg2+DYoNOitaQlILMkeaI6oj4kJSCxoK1gsSTboKzguqC6ZJsICovDQorDQorICAgIHZvaWQgKiAoKiB0aHJlYWRfY3JlYXRlICkodm9pZCAqcCwgaW50IGluZGV4LCB2b2lkICooKnN0YXJ0X3JvdXRpbmUpKHZvaWQgKmFyZyksIHZvaWQgKmFyZyk7DQorICAgIGludCAgICAoKiB0aHJlYWRfZGVzdHJveSkodm9pZCAqcCwgdm9pZCAqdGhyZWFkKTsNCisgICAgaW50ICAgICgqIHRocmVhZF9qb2luICAgKSh2b2lkICpwLCB2b2lkICp0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpOw0KKw0KKyAgICB2b2lkICogKCogbXV0ZXhfY3JlYXRlICkodm9pZCAqcCk7DQorICAgIGludCAgICAoKiBtdXRleF9kZXN0cm95KSh2b2lkICpwLCB2b2lkICptdXRleCk7DQorICAgIGludCAgICAoKiBtdXRleF9sb2NrICAgKSh2b2lkICpwLCB2b2lkICptdXRleCk7DQorICAgIGludCAgICAoKiBtdXRleF90cnlsb2NrKSh2b2lkICpwLCB2b2lkICptdXRleCk7DQorICAgIGludCAgICAoKiBtdXRleF91bmxvY2sgKSh2b2lkICpwLCB2b2lkICptdXRleCk7DQorDQorICAgIHZvaWQgKiAoKiBjb25kX2NyZWF0ZSAgICkodm9pZCAqcCk7DQorICAgIGludCAgICAoKiBjb25kX2Rlc3Ryb3kgICkodm9pZCAqcCwgdm9pZCAqY29uZCk7DQorICAgIGludCAgICAoKiBjb25kX3dhaXQgICAgICkodm9pZCAqcCwgdm9pZCAqY29uZCwgdm9pZCAqbG9jayk7DQorICAgIGludCAgICAoKiBjb25kX3NpZ25hbCAgICkodm9pZCAqcCwgdm9pZCAqY29uZCk7DQorICAgIGludCAgICAoKiBjb25kX2Jyb2FkY2FzdCkodm9pZCAqcCwgdm9pZCAqY29uZCk7DQorfTsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiDQorew0KKyNlbmRpZg0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qKg0KKyAqIINvgVuDV4OHg5OVto6al/GC8I7mk74NCisgKg0KKyAqIEByZXR1cm4gg2+BW4NXg4eDk5W2jpqX8ShNT1JQSE9fRUFTWV9IRFJfVkVSKQ0KKyAqLw0KK01PUlBIT19BUEkoY2hhciBjb25zdCAqKQ0KK21vcnBob19FYXN5SERSX2dldFZlcnNpb24odm9pZCk7DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorLyoqDQorICoglUuXdoLIg4GDgoOKg1SDQ4NZgvCO5pO+DQorICoNCisgKiBAcGFyYW1baW5dICBtYXhfd2lkdGggICCT/JfNieaRnILMjcWR5ZWdDQorICogQHBhcmFtW2luXSAgbWF4X2hlaWdodCAgk/yXzYnmkZyCzI3FkeWNgoKzDQorICogQHBhcmFtW2luXSAgZm9ybWF0ICAgICAgieaRnIN0g0iBW4N9g2KDZ5W2jpqX8Q0KKyAqDQorICogQHJldHVybiCVS5d2gsiDgYOCg4qDVINDg1koYnl0ZSkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9nZXRCdWZmZXJTaXplKA0KKyAgICBpbnQgbWF4X3dpZHRoLA0KKyAgICBpbnQgbWF4X2hlaWdodCwNCisgICAgY2hhciBjb25zdCAqZm9ybWF0KTsNCisNCisvKioNCisgKiCPiYr6ibsNCisgKg0KKyAqII5nl3CDWIOMg2KDaJCUgskwiMiJuoLMkmyC8JDdkuiCtYK9j+qNh4FBDQorICoglaqKhI7AjXOC8I1zgqSBQg0KKyAqDQorICogjmeXcINYg4yDYoNokJSCyTGIyI/jgsySbILwkN2S6IK1gr2P6o2HgUENCisgKiCI6oqHjsCNc4LwjXOCpIFCDQorICoNCisgKiCOZ5dwg1iDjINig2iQlILJMojIj+OCzJJsgvCQ3ZLogrWCvY/qjYeBQQ0KKyAqIIN9g4uDYINYg4yDYoNogsmC5oLplcCX8Y7AjXMoiOqKh47AjXMpgvCNc4KkgUINCisgKiBjYWxsYmFjayCCyZNLkNiCyJJsgvCQ3ZLogreC6ZVLl3aCoILogUINCisgKg0KKyAqIIF5jsCNc4/zkdSCzJFKiNqBeg0KKyAqICAgICA/X1VOS05PV04ggaggMF9JTklUSUFMSVpFRA0KKyAqDQorICogQHBhcmFtW2luLG91dF0gIHAgICAgICAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KKyAqIEBwYXJhbVtvdXRdICAgICBidWZmZXIgICAgICAgRWFzeUhEUoLJioSC6JOWgsSC6YOBg4KDioLWgsyDfINDg5ODXg0KKyAqIEBwYXJhbVtpbl0gICAgICBidWZmZXJfc2l6ZSAgRWFzeUhEUoLJioSC6JOWgsSC6YOBg4KDioLMg1SDQ4NZDQorICogQHBhcmFtW2luXSAgICAgIG50aHJlYWRzICAgICCOZ5dwg1iDjINig2iQlCAog1KDQZCUKQ0KKyAqIEBwYXJhbVtpbl0gICAgICBjYWxsYmFjayAgICAgg1KBW4OLg2+DYoNOitaQlIxRDQorICoNCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19FYXN5SERSX2luaXRpYWxpemUoDQorICAgIG1vcnBob19FYXN5SERSICpwLA0KKyAgICB2b2lkICpidWZmZXIsDQorICAgIGludCBidWZmZXJfc2l6ZSwNCisgICAgaW50IG50aHJlYWRzLA0KKyAgICBtb3JwaG9fRWFzeUhEUl9DYWxsYmFjayBjb25zdCAqY2FsbGJhY2spOw0KKw0KKy8qKg0KKyAqIINOg4qBW4OTg0GDYoN2DQorICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdICBwICBFYXN5SERSIINDg5ODWINeg5ODWA0KKyAqDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9maW5hbGl6ZSgNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnApOw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qKg0KKyAqII2HkKyCzIpKjm6BRY7AjXMNCisgKiBzZXRJbWFnZUZvcm1hdCgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIIF5jsCNc4/zkdSCzJFKiNogKIjqioeOwI1zjp4pgXoNCisgKiAgICAgMF9JTklUSUFMSVpFRCCBqCAoMV9QUk9DRVNTSU5HKSCBqCAwX0lOSVRJQUxJWkVEICiPiJediq6XuSkNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCBqCAyX1NVU1BFTkRFRCAgIChzdXNwZW5kKCmMxILRj2+CtSkNCisgKg0KKyAqIIF5jsCNc4/zkdSCzJFKiNogKJWqioSOwI1zjp4pgXoNCisgKiAgICAgMF9JTklUSUFMSVpFRCCBqCAzX1BBVVNFRCAgICAgICiPiJedkoYpDQorICogICAgICAgICAgICAgICAgICAggaggMF9JTklUSUFMSVpFRCAoj4iXnYqul7kpDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgICAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KKyAqIEBwYXJhbVtvdXRdICAgICBvdXRwdXRfaW1hZ2UgIIyLicqJ5pGcICiBdTGWh5bagXaCzJP8l82J5pGcgvCOd5LoicKUXCkNCisgKiBAcGFyYW1baW4sb3V0XSAgaW5wdXRfaW1hZ2VzICCT/JfNieaRnIxRICiDR4OTg1eDk4LJguaCwYLEj5GCq4q3gqaC54LqgukpDQorICogQHBhcmFtW2luXSAgICAgIG5pbWFnZXMgICAgICAgk/yXzYnmkZyCzJCUDQorICoNCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19FYXN5SERSX21lcmdlKA0KKyAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCisgICAgbW9ycGhvX0ltYWdlRGF0YSAqb3V0cHV0X2ltYWdlLA0KKyAgICBtb3JwaG9fSW1hZ2VEYXRhICppbnB1dF9pbWFnZXNbXSwNCisgICAgaW50IG5pbWFnZXMpOw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qKg0KKyAqII2HkKyCzIxwkbGOwI1zDQorICoNCisgKiBtZXJnZSgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIJWqioSOwI1zjp4oaW5pdGlhbGl6ZSgpIILFIG50aHJlYWRzIILJIDAggvCOd5LogrWCvYLGgqspgsyC3ZdMjPgNCisgKg0KKyAqIIF5jsCNc4/zkdSCzJFKiNogKJWqioSOwI1zjp4pgXoNCisgKiAgICAgM19QQVVTRUQggaggM19QQVVTRUQgICAgICAoj4iXnZKGKQ0KKyAqICAgICAgICAgICAgICCBqCAwX0lOSVRJQUxJWkVEICiPiJediq6XuSkNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdICBwICBFYXN5SERSIINDg5ODWINeg5ODWA0KKyAqDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9wcm9jZXNzKA0KKyAgICBtb3JwaG9fRWFzeUhEUiAqcCk7DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorLyoqDQorICogjYeQrILMkoaSZiAolcqDUoOTg2WDTINYg2eCqYLngsyMxILRj2+CtYLJguaC6SkNCisgKiBtZXJnZSgpII7AjXOShoLJjsCNc4nClFwNCisgKg0KKyAqIIF5jsCNc4/zkdSCzJFKiNogKIjqioeOwI1zjp4pgXoNCisgKiAgICAgMV9QUk9DRVNTSU5HIIGoIDJfU1VTUEVOREVEDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfc3VzcGVuZCgNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnApOw0KKw0KKy8qKg0KKyAqII2HkKyCzI3EikoNCisgKiBzdXNwZW5kKCkgjsCNc4zjgsmOwI1zicKUXA0KKyAqDQorICoggXmOwI1zj/OR1ILMkUqI2iAoiOqKh47AjXOOnimBeg0KKyAqICAgICAyX1NVU1BFTkRFRCCBqCAoMV9QUk9DRVNTSU5HKSCBqCAwX0lOSVRJQUxJWkVEICiPiJediq6XuSkNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAggaggMl9TVVNQRU5ERUQgICAoc3VzcGVuZCgpjMSC0Y9vgrUpDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfcmVzdW1lKA0KKyAgICBtb3JwaG9fRWFzeUhEUiAqcCk7DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorLyoqDQorICogieaRnIN0g0iBW4N9g2KDZ4LMkN2S6A0KKyAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KKyAqIEBwYXJhbVtpbl0gICAgICBmb3JtYXQgIInmkZyDdINIgVuDfYNig2eC8IKggueC7YK3lbaOmpfxDQorICoNCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19FYXN5SERSX3NldEltYWdlRm9ybWF0KA0KKyAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCisgICAgY2hhciBjb25zdCAqZm9ybWF0KTsNCisNCisvKioNCisgKiCJ5pGcg3SDSIFbg32DYoNngsyO5pO+DQorICogc2V0SW1hZ2VGb3JtYXQoKSCOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgICAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW291dF0gICAgIGJ1ZmZlciAgICAgICCJ5pGcg3SDSIFbg32DYoNngvCCoILngu2Ct5W2jpqX8YKqimmUW4KzguqC6YNvg2KDdINADQorICogQHBhcmFtW2luXSAgICAgIGJ1ZmZlcl9zaXplICCDb4Nig3SDQILMg1SDQ4NZKI9JkluVto6aityC3ikNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfZ2V0SW1hZ2VGb3JtYXQoDQorICAgIG1vcnBob19FYXN5SERSICpwLA0KKyAgICBjaGFyICpidWZmZXIsDQorICAgIGludCBidWZmZXJfc2l6ZSk7DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorLyoqDQorICogiMqSdY2Hgu2CuSiO6ILUguqV4pCzKYLMl0yWs4LMkN2S6A0KKyAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiB2YWx1ZToNCisgKiAgIE1PUl9FQVNZX0hEUl9FTkFCTEVEICA6IIjKknWNh4LtgrmCoILoDQorICogICBNT1JfRUFTWV9IRFJfRElTQUJMRUQgOiCIypJ1jYeC7YK5gsiCtQ0KKyAqDQorICogQHBhcmFtW2luLG91dF0gIHAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KKyAqIEBwYXJhbVtpbl0gICAgICB2YWx1ZSAgkN2S6JJsDQorICoNCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19FYXN5SERSX3NldEltYWdlQWxpZ25tZW50U3RhdHVzKA0KKyAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCisgICAgaW50IHZhbHVlKTsNCisNCisvKioNCisgKiCIypJ1jYeC7YK5KI7ogtSC6pXikLMpgsyXTJazgsyO5pO+DQorICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCisgKiBAcGFyYW1bb3V0XSAgICAgdmFsdWUgIJDdkuiSbIpplFuQ5g0KKyAqDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9nZXRJbWFnZUFsaWdubWVudFN0YXR1cygNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQorICAgIGludCAqdmFsdWUpOw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qKg0KKyAqIINTgVuDWINnj5yLjiiU7Y7KkcyC1ILqleKQsymCzJdMlrOCzJDdkugNCisgKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KKyAqDQorICogdmFsdWU6DQorICogICBNT1JfRUFTWV9IRFJfRU5BQkxFRCAgOiCDU4Fbg1iDZ4+ci46CoILoDQorICogICBNT1JfRUFTWV9IRFJfRElTQUJMRUQgOiCDU4Fbg1iDZ4+ci46CyIK1DQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW2luXSAgICAgIHZhbHVlICCQ3ZLokmwNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfc2V0R2hvc3RSZW1vdmFsU3RhdHVzKA0KKyAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCisgICAgaW50IHZhbHVlKTsNCisNCisvKioNCisgKiCDU4Fbg1iDZ4+ci44olO2OypHMgtSC6pXikLMpgsyXTJazgsyO5pO+DQorICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCisgKiBAcGFyYW1bb3V0XSAgICAgdmFsdWUgIJDdkuiSbIpplFuQ5g0KKyAqDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9nZXRHaG9zdFJlbW92YWxTdGF0dXMoDQorICAgIG1vcnBob19FYXN5SERSICpwLA0KKyAgICBpbnQgKnZhbHVlKTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKioNCisgKiCOqZOuimeR5SiDToOKg2KDc4OTg08pgsyXTJazgsyQ3ZLoDQorICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIHZhbHVlOg0KKyAqICAgTU9SX0VBU1lfSERSX0VOQUJMRUQgIDogjqmTropnkeWCoILoDQorICogICBNT1JfRUFTWV9IRFJfRElTQUJMRUQgOiCOqZOuimeR5YLIgrUNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCisgKiBAcGFyYW1baW5dICAgICAgdmFsdWUgIJDdkuiSbA0KKyAqDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9zZXRBdXRvU2NhbGluZ1N0YXR1cygNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQorICAgIGludCB2YWx1ZSk7DQorDQorLyoqDQorICogjqmTropnkeUog06DioNig3ODk4NPKYLMl0yWs4LMjuaTvg0KKyAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW291dF0gICAgIHZhbHVlICCQ3ZLokmyKaZRbkOYNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfZ2V0QXV0b1NjYWxpbmdTdGF0dXMoDQorICAgIG1vcnBob19FYXN5SERSICpwLA0KKyAgICBpbnQgKnZhbHVlKTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKioNCisgKiCK54yfj2+V4pCzgsyXTJazgsyQ3ZLoDQorICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIHZhbHVlOg0KKyAqICAgTU9SX0VBU1lfSERSX0VOQUJMRUQgIDogiueMn49vleKQs4KggugNCisgKiAgIE1PUl9FQVNZX0hEUl9ESVNBQkxFRCA6IIrnjJ+Pb5XikLOCyIK1DQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW2luXSAgICAgIHZhbHVlICCQ3ZLokmwNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfc2V0RmFjZURldGVjdGlvblN0YXR1cygNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQorICAgIGludCB2YWx1ZSk7DQorDQorLyoqDQorICogiueMn49vleKQs4LMl0yWs4LMjuaTvg0KKyAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW291dF0gICAgIHZhbHVlICCQ3ZLokmyKaZRbkOYNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfZ2V0RmFjZURldGVjdGlvblN0YXR1cygNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQorICAgIGludCAqdmFsdWUpOw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qKg0KKyAqIEZhaWwtc29mdC1tZXJnaW5nIILMl0yWs4LMkN2S6A0KKyAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiB2YWx1ZToNCisgKiAgIE1PUl9FQVNZX0hEUl9FTkFCTEVEICA6IEZhaWwtc29mdC1tZXJnaW5nIIKggugNCisgKiAgIE1PUl9FQVNZX0hEUl9ESVNBQkxFRCA6IEZhaWwtc29mdC1tZXJnaW5nIILIgrUNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCisgKiBAcGFyYW1baW5dICAgICAgdmFsdWUgIJDdkuiSbA0KKyAqDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9zZXRGYWlsU29mdE1lcmdpbmdTdGF0dXMoDQorICAgIG1vcnBob19FYXN5SERSICpwLA0KKyAgICBpbnQgdmFsdWUpOw0KKw0KKy8qKg0KKyAqIEZhaWwtc29mdC1tZXJnaW5nIILMl0yWs4LMjuaTvg0KKyAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW291dF0gICAgIHZhbHVlICCQ3ZLokmyKaZRbkOYNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfZ2V0RmFpbFNvZnRNZXJnaW5nU3RhdHVzKA0KKyAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCisgICAgaW50ICp2YWx1ZSk7DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorLyoqDQorICogg1OBW4NYg2eUu5LoirSTeIOMg3iDi4LMkN2S6A0KKyAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW2luXSAgICAgIHZhbHVlICCQ3ZLokmwNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfc2V0R2hvc3REZXRlY3Rpb25TZW5zaXRpdml0eUxldmVsKA0KKyAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCisgICAgaW50IHZhbHVlKTsNCisNCisvKioNCisgKiCDU4Fbg1iDZ5S7kuiKtJN4g4yDeIOLgsyO5pO+DQorICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCisgKiBAcGFyYW1bb3V0XSAgICAgdmFsdWUgIJDdkuiSbIpplFuQ5g0KKyAqDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9nZXRHaG9zdERldGVjdGlvblNlbnNpdGl2aXR5TGV2ZWwoDQorICAgIG1vcnBob19FYXN5SERSICpwLA0KKyAgICBpbnQgKnZhbHVlKTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKioNCisgKiCNh5CsgsiC34LngqmCs4LMkN2S6A0KKyAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW2luXSAgICAgIHZhbHVlICCQ3ZLokmwNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfc2V0TWVyZ2VTbW9vdGhuZXNzTGV2ZWwoDQorICAgIG1vcnBob19FYXN5SERSICpwLA0KKyAgICBpbnQgdmFsdWUpOw0KKw0KKy8qKg0KKyAqII2HkKyCyILfgueCqYKzgsyO5pO+DQorICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCisgKiBAcGFyYW1bb3V0XSAgICAgdmFsdWUgIJDdkuiSbIpplFuQ5g0KKyAqDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9nZXRNZXJnZVNtb290aG5lc3NMZXZlbCgNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQorICAgIGludCAqdmFsdWUpOw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qKg0KKyAqII2HkKyDcIOJg4GBW4NegsyQ3ZLoDQorICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW2luXSAgICAgIHZhbHVlMSAgkN2S6JJsDQorICogQHBhcmFtW2luXSAgICAgIHZhbHVlMiAgkN2S6JJsDQorICogQHBhcmFtW2luXSAgICAgIHZhbHVlMyAgkN2S6JJsDQorICogQHBhcmFtW2luXSAgICAgIHZhbHVlNCAgkN2S6JJsDQorICoNCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19FYXN5SERSX3NldE1lcmdlUGFyYW1ldGVycygNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQorICAgIGludCB2YWx1ZTEsDQorICAgIGludCB2YWx1ZTIsDQorICAgIGludCB2YWx1ZTMsDQorICAgIGludCB2YWx1ZTQpOw0KKw0KKy8qKg0KKyAqII2HkKyDcIOJg4GBW4NegsyO5pO+DQorICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdICBwICAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW291dF0gICAgIHZhbHVlMSAgkN2S6JJsimmUW5DmDQorICogQHBhcmFtW291dF0gICAgIHZhbHVlMiAgkN2S6JJsimmUW5DmDQorICogQHBhcmFtW291dF0gICAgIHZhbHVlMyAgkN2S6JJsimmUW5DmDQorICogQHBhcmFtW291dF0gICAgIHZhbHVlNCAgkN2S6JJsimmUW5DmDQorICoNCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19FYXN5SERSX2dldE1lcmdlUGFyYW1ldGVycygNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQorICAgIGludCAqdmFsdWUxLA0KKyAgICBpbnQgKnZhbHVlMiwNCisgICAgaW50ICp2YWx1ZTMsDQorICAgIGludCAqdmFsdWU0KTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKioNCisgKiCXTIz4l8yI5uiHkmyCzJDdkugNCisgKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KKyAqDQorICogQHBhcmFtW2luLG91dF0gIHAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW2luXSAgICAgIHJhdGUgIJDdkuiSbCAokoaJmyByYXRlICUgi+mMYCkNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfc2V0UmVsaWFibGVSZWN0UmF0ZVRocmVzaG9sZCgNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQorICAgIGludCByYXRlKTsNCisNCisvKioNCisgKiCXTIz4l8yI5uiHkmyCzI7mk74NCisgKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KKyAqDQorICogQHBhcmFtW2luLG91dF0gIHAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW291dF0gICAgIHJhdGUgIJDdkuiSbIpplFuQ5g0KKyAqDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9nZXRSZWxpYWJsZVJlY3RSYXRlVGhyZXNob2xkKA0KKyAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCisgICAgaW50ICpyYXRlKTsNCisNCisvKioNCisgKiCXTIz4l8yI5oLMjuaTvg0KKyAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQorICogKJdMjPiCyJJsgqqDWoNig2eCs4LqgumCzILNIG1lcmdlKCkgjOMpDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCisgKiBAcGFyYW1bb3V0XSAgICAgcmVjdCAgkN2S6JJsimmUW5DmDQorICoNCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19FYXN5SERSX2dldFJlbGlhYmxlUmVjdCgNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnAsDQorICAgIG1vcnBob19SZWN0SW50ICpyZWN0KTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKioNCisgKiCDU4Fbg1iDZ4qEjYfoh5JsgsyQ3ZLoDQorICogaW5pdGlhbGl6ZSgpII7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdICBwICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KKyAqIEBwYXJhbVtpbl0gICAgICByYXRlICCQ3ZLokmwNCisgKg0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0Vhc3lIRFJfc2V0R2hvc3RSYXRlVGhyZXNob2xkKA0KKyAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCisgICAgaW50IHJhdGUpOw0KKw0KKy8qKg0KKyAqIINTgVuDWINnioSNh+iHkmyCzI7mk74NCisgKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KKyAqDQorICogQHBhcmFtW2luLG91dF0gIHAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW291dF0gICAgIHJhdGUgIJDdkuiSbIpplFuQ5g0KKyAqDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9nZXRHaG9zdFJhdGVUaHJlc2hvbGQoDQorICAgIG1vcnBob19FYXN5SERSICpwLA0KKyAgICBpbnQgKnJhdGUpOw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qKg0KKyAqIJBGleKQs4Nwg4mDgYFbg16CzJDdkugNCisgKiBpbml0aWFsaXplKCkgjsCNc4zjgsmOwI1zicKUXA0KKyAqDQorICogQHBhcmFtW2luLG91dF0gIHAgICAgICAgICBFYXN5SERSIINDg5ODWINeg5ODWA0KKyAqIEBwYXJhbVtpbl0gICAgICB5X29mZnNldCAgkN2S6JJsDQorICogQHBhcmFtW2luXSAgICAgIHlfZ2FpbiAgICCQ3ZLokmwNCisgKiBAcGFyYW1baW5dICAgICAgeV9nYW1tYSAgIJDdkuiSbA0KKyAqIEBwYXJhbVtpbl0gICAgICBjX29mZnNldCAgkN2S6JJsDQorICogQHBhcmFtW2luXSAgICAgIGNfZ2FpbiAgICCQ3ZLokmwNCisgKiBAcGFyYW1baW5dICAgICAgY19nYW1tYSAgIJDdkuiSbA0KKyAqDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9zZXRDb2xvckNvcnJlY3Rpb25QYXJhbWV0ZXJzKA0KKyAgICBtb3JwaG9fRWFzeUhEUiAqcCwNCisgICAgaW50IHlfb2Zmc2V0LA0KKyAgICBpbnQgeV9nYWluLA0KKyAgICBpbnQgeV9nYW1tYSwNCisgICAgaW50IGNfb2Zmc2V0LA0KKyAgICBpbnQgY19nYWluLA0KKyAgICBpbnQgY19nYW1tYSk7DQorDQorLyoqDQorICogkEaV4pCzg3CDiYOBgVuDXoLMjuaTvg0KKyAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgICAgICAgIEVhc3lIRFIgg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW291dF0gICAgIHlfb2Zmc2V0ICCQ3ZLokmyKaZRbkOYNCisgKiBAcGFyYW1bb3V0XSAgICAgeV9nYWluICAgIJDdkuiSbIpplFuQ5g0KKyAqIEBwYXJhbVtvdXRdICAgICB5X2dhbW1hICAgkN2S6JJsimmUW5DmDQorICogQHBhcmFtW291dF0gICAgIGNfb2Zmc2V0ICCQ3ZLokmyKaZRbkOYNCisgKiBAcGFyYW1bb3V0XSAgICAgY19nYWluICAgIJDdkuiSbIpplFuQ5g0KKyAqIEBwYXJhbVtvdXRdICAgICBjX2dhbW1hICAgkN2S6JJsimmUW5DmDQorICoNCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19FYXN5SERSX2dldENvbG9yQ29ycmVjdGlvblBhcmFtZXRlcnMoDQorICAgIG1vcnBob19FYXN5SERSICpwLA0KKyAgICBpbnQgKnlfb2Zmc2V0LA0KKyAgICBpbnQgKnlfZ2FpbiwNCisgICAgaW50ICp5X2dhbW1hLA0KKyAgICBpbnQgKmNfb2Zmc2V0LA0KKyAgICBpbnQgKmNfZ2FpbiwNCisgICAgaW50ICpjX2dhbW1hKTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKioNCisgKiCNh5Csg1iDZYFbg16DWILMjuaTvg0KKyAqIGluaXRpYWxpemUoKSCOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiCDWINlgVuDXoNYg1KBW4NoDQorICogICBNT1JQSE9fRUFTWV9IRFJfT0sNCisgKiAgIE1PUlBIT19FQVNZX0hEUl9FUlJPUl8qDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSAgcCAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCisgKg0KKyAqIEByZXR1cm4gg1iDZYFbg16DWINSgVuDaCAoTU9SUEhPX0VBU01PUlBIT19FQVNZX0hEUl9FUlJPUl8NCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fRWFzeUhEUl9nZXRNZXJnZVN0YXR1cygNCisgICAgbW9ycGhvX0Vhc3lIRFIgKnApOw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qKg0KKyAqIINUg4CDbINDg4uCzI3skKwgKI9vl82J5pGcgsyPa4+sKQ0KKyAqIG1vcnBob19FYXN5SERSX3NldEltYWdlRm9ybWF0KCkgjsCNc4zjgsmOwI1zicKUXA0KKyAqDQorICogQHBhcmFtW2luLG91dF0gIHAgICAgICAgICAgICAgICAgRWFzeUhEUiCDQ4OTg1iDXoOTg1gNCisgKiBAcGFyYW1bb3V0XSAgICAgdGh1bWJuYWlsX2ltYWdlICCPb5fNieaRnA0KKyAqIEBwYXJhbVtpbl0gICAgICBvdXRwdXRfaW1hZ2UgICAgIJP8l82J5pGcDQorICoNCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19FYXN5SERSX21ha2VUaHVtYm5haWwoDQorICAgIG1vcnBob19FYXN5SERSICpwLA0KKyAgICBtb3JwaG9fSW1hZ2VEYXRhICp0aHVtYm5haWxfaW1hZ2UsDQorICAgIG1vcnBob19JbWFnZURhdGEgY29uc3QgKm91dHB1dF9pbWFnZSk7DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfSAvKiBleHRlcm4gIkMiICovDQorI2VuZGlmDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2VuZGlmIC8qICFNT1JQSE9fRUFTWV9IRFJfSCAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qIFtFT0ZdICovDQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2hkci9pbmNsdWRlL21vcnBob19lYXN5X2hkcl9leHQuaCBiL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fZWFzeV9oZHJfZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0YmQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fZWFzeV9oZHJfZXh0LmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBNT1JQSE9fRUFTWV9IRFJfRVhUX0gKKyNkZWZpbmUgTU9SUEhPX0VBU1lfSERSX0VYVF9ICisKKyNpbmNsdWRlICJtb3JwaG9fZWFzeV9oZHIuaCIKKy8qCityZXR1cm4gPT0gMCA6IE9LCityZXR1cm4gIT0gMCA6IE5HIChQbGVhc2UgcHJpbnQgdGhlIHJldHVybiB2YWx1ZSB0byBjaGVjayBFcnJvciB0eXBlcykKKyovCitNT1JQSE9fQVBJKGludCkKK0xJTktfbW1fY2FtZXJhX0hEUigKKyAgICB1bnNpZ25lZCBjaGFyKiB5dXZJbnB1dDAxLAorICAgIHVuc2lnbmVkIGNoYXIqIHl1dklucHV0MDIsCisgICAgdW5zaWduZWQgY2hhciogeXV2SW5wdXQwMywKKyAgICB1bnNpZ25lZCBjaGFyKiBwSERST3V0SW1hZ2UsCisgICAgaW50IHdpZHRoLAorICAgIGludCBoZWlnaHQsCisgICAgaW50IGluZG9vcik7CisKKyNlbmRpZiAvL01PUlBIT19FQVNZX0hEUl9FWFRfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL2hkci9pbmNsdWRlL21vcnBob19lcnJvci5oIGIvY2FtZXJhL2hkci9pbmNsdWRlL21vcnBob19lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ODIxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX2Vycm9yLmgKQEAgLTAsMCArMSwyOSBAQAorLyoqDQorICogQGZpbGUgICAgIG1vcnBob19lcnJvci5oDQorICogQGJyaWVmICAgIINHg4mBW4NSgVuDaILMkuiLYA0KKyAqIEB2ZXJzaW9uICAxLjAuMA0KKyAqIEBkYXRlICAgICAyMDA4LTA2LTA5DQorICoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMiBNb3JwaG8sIEluYy4NCisgKi8NCisNCisjaWZuZGVmIE1PUlBIT19FUlJPUl9IDQorI2RlZmluZSBNT1JQSE9fRVJST1JfSA0KKw0KKy8qKiCDR4OJgVuDUoFbg2ggLiovDQorI2RlZmluZSBNT1JQSE9fT0sgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApICAvKio8IJCsjPcgKi8NCisjZGVmaW5lIE1PUlBIT19ET1BST0NFU1MgICAgICAgICAgICAoMHgwMDAwMDAwMSkgIC8qKjwgj4iXnZKGICovDQorI2RlZmluZSBNT1JQSE9fQ0FOQ0VMRUQgICAgICAgICAgICAgKDB4MDAwMDAwMDIpICAvKio8IINMg4ODk4Nag4uCs4Lqgr0gKi8NCisjZGVmaW5lIE1PUlBIT19TVVNQRU5ERUQgICAgICAgICAgICAoMHgwMDAwMDAwOCkgIC8qKjwgkoaSZoKzguqCvSAqLw0KKw0KKyNkZWZpbmUgTU9SUEhPX0VSUk9SX0dFTkVSQUxfRVJST1IgICgweDgwMDAwMDAwKSAgLyoqPCCI6pTKk0mCyINHg4mBWy4gKi8NCisjZGVmaW5lIE1PUlBIT19FUlJPUl9QQVJBTSAgICAgICAgICAoMHg4MDAwMDAwMSkgIC8qKjwgiPiQlIKqlXOQsy4gKi8NCisjZGVmaW5lIE1PUlBIT19FUlJPUl9TVEFURSAgICAgICAgICAoMHg4MDAwMDAwMikgIC8qKjwgk+CVlI/zkdSC4orWkJSMxI9vj4ePmIKqlXOQsy4gKi8NCisjZGVmaW5lIE1PUlBIT19FUlJPUl9NQUxMT0MgICAgICAgICAoMHg4MDAwMDAwNCkgIC8qKjwgg4GDgoOKg0GDjYNQgVuDVoOHg5ODR4OJgVsuICovDQorI2RlZmluZSBNT1JQSE9fRVJST1JfSU8gICAgICAgICAgICAgKDB4ODAwMDAwMDgpICAvKio8IJP8j2+XzYNHg4mBWy4gKi8NCisjZGVmaW5lIE1PUlBIT19FUlJPUl9VTlNVUFBPUlRFRCAgICAoMHg4MDAwMDAxMCkgIC8qKjwgi0CUXILwg1SDfIFbg2eCtYLEgqKCyIKiLiAqLw0KKyNkZWZpbmUgTU9SUEhPX0VSUk9SX05PVEZPVU5EICAgICAgICgweDgwMDAwMDIwKSAgLyoqPCCMn431kc6P24KqjKmCwoKpgueCyIKiICovDQorI2RlZmluZSBNT1JQSE9fRVJST1JfSU5URVJOQUwgICAgICAgKDB4ODAwMDAwNDApICAvKio8IJPglZSDR4OJgVsuICovDQorI2RlZmluZSBNT1JQSE9fRVJST1JfVU5LTk9XTiAgICAgICAgKDB4QzAwMDAwMDApICAvKio8II/ji0yIyIpPgsyDR4OJgVsuICovDQorDQorI2VuZGlmIC8qICNpZm5kZWYgTU9SUEhPX0VSUk9SX0ggKi8NCmRpZmYgLS1naXQgYS9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX2dldF9pbWFnZV9zaXplLmggYi9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX2dldF9pbWFnZV9zaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmNTM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fZ2V0X2ltYWdlX3NpemUuaApAQCAtMCwwICsxLDg5IEBACisvKioNCisgKiBAZmlsZSAgICAgbW9ycGhvX2dldF9pbWFnZV9zaXplLmgNCisgKiBAYnJpZWYgICAgieaRnILJlUuXdoLIg4GDgoOKg1SDQ4NZgvCO5pO+greC6YrWkJQNCisgKiBAdmVyc2lvbiAgMS4wLjANCisgKiBAZGF0ZSAgICAgMjAwOC0wNy0wMQ0KKyAqDQorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTIgTW9ycGhvLCBJbmMuDQorICovDQorDQorI2lmbmRlZiBNT1JQSE9fR0VUX0lNQUdFX1NJWkVfSA0KKyNkZWZpbmUgTU9SUEhPX0dFVF9JTUFHRV9TSVpFX0gNCisNCisjaW5jbHVkZSAibW9ycGhvX2FwaS5oIg0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKw0KKy8qKg0KKyAqIJWdgsaNgoKzgsaDdINIgVuDfYNig2eWvIKpgueBQYnmkZyC8IpplFuCt4LpgsyCyZVLl3aCyIOBg4KDioNUg0ODWYLwk76C6S4NCisgKg0KKyAqIEBwYXJhbSB3aWR0aCAgICAgICCVnQ0KKyAqIEBwYXJhbSBoZWlnaHQgICAgICCNgoKzDQorICogQHBhcmFtIHBfZm9ybWF0ICAgIInmkZyDdINIgVuDfYNig2eVto6al/ENCisgKiBAcmV0dXJuICAgICAgICAgICAgieaRnILJlUuXdoLIg4GDgoOKg1SDQ4NZDQorICovDQorI2RlZmluZSBtb3JwaG9fZ2V0SW1hZ2VTaXplIG1vcl9ub2lzZV9yZWR1Y3Rpb25fSUZfZ2V0SW1hZ2VTaXplDQorDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX2dldEltYWdlU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IGNoYXIgKnBfZm9ybWF0KTsNCisNCisvKioNCisgKiBZieaRnINmgVuDXoNUg0ODWYLwjuaTvi4NCisgKg0KKyAqIEBwYXJhbSB3aWR0aCAgICAgICCVnQ0KKyAqIEBwYXJhbSBoZWlnaHQgICAgICCNgoKzDQorICogQHBhcmFtIHBfZm9ybWF0ICAgIInmkZyDdINIgVuDfYNig2eVto6al/ENCisgKiBAcmV0dXJuICAgICAgICAgICAgWYnmkZyDZoFbg16DVINDg1kNCisgKi8NCisjZGVmaW5lIG1vcnBob19nZXRJbWFnZVNpemVZIG1vcl9ub2lzZV9yZWR1Y3Rpb25fSUZfZ2V0SW1hZ2VTaXplWQ0KKw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19nZXRJbWFnZVNpemVZKGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgY2hhciAqcF9mb3JtYXQpOw0KKw0KKy8qKg0KKyAqIFWJ5pGcg2aBW4Neg1SDQ4NZgvCO5pO+Lg0KKyAqDQorICogQHBhcmFtIHdpZHRoICAgICAgIJWdDQorICogQHBhcmFtIGhlaWdodCAgICAgII2CgrMNCisgKiBAcGFyYW0gcF9mb3JtYXQgICAgieaRnIN0g0iBW4N9g2KDZ5W2jpqX8Q0KKyAqIEByZXR1cm4gICAgICAgICAgICBVieaRnINmgVuDXoNUg0ODWQ0KKyAqLw0KKyNkZWZpbmUgbW9ycGhvX2dldEltYWdlU2l6ZVUgbW9yX25vaXNlX3JlZHVjdGlvbl9JRl9nZXRJbWFnZVNpemVVDQorDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX2dldEltYWdlU2l6ZVUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBjaGFyICpwX2Zvcm1hdCk7DQorDQorLyoqDQorICogVonmkZyDZoFbg16DVINDg1mC8I7mk74uDQorICoNCisgKiBAcGFyYW0gd2lkdGggICAgICAglZ0NCisgKiBAcGFyYW0gaGVpZ2h0ICAgICAgjYKCsw0KKyAqIEBwYXJhbSBwX2Zvcm1hdCAgICCJ5pGcg3SDSIFbg32DYoNnlbaOmpfxDQorICogQHJldHVybiAgICAgICAgICAgIFaJ5pGcg2aBW4Neg1SDQ4NZDQorICovDQorI2RlZmluZSBtb3JwaG9fZ2V0SW1hZ2VTaXplViBtb3Jfbm9pc2VfcmVkdWN0aW9uX0lGX2dldEltYWdlU2l6ZVYNCisNCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fZ2V0SW1hZ2VTaXplVihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IGNoYXIgKnBfZm9ybWF0KTsNCisNCisvKioNCisgKiBVVonmkZyDZoFbg16DVINDg1mC8I7mk74uDQorICoNCisgKiBAcGFyYW0gd2lkdGggICAgICAglZ0NCisgKiBAcGFyYW0gaGVpZ2h0ICAgICAgjYKCsw0KKyAqIEBwYXJhbSBwX2Zvcm1hdCAgICCJ5pGcg3SDSIFbg32DYoNnlbaOmpfxDQorICogQHJldHVybiAgICAgICAgICAgIFVWieaRnINmgVuDXoNUg0ODWQ0KKyAqLw0KKyNkZWZpbmUgbW9ycGhvX2dldEltYWdlU2l6ZVVWIG1vcl9ub2lzZV9yZWR1Y3Rpb25fSUZfZ2V0SW1hZ2VTaXplVVYNCisNCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fZ2V0SW1hZ2VTaXplVVYoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBjaGFyICpwX2Zvcm1hdCk7DQorDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfSAvKiBleHRlcm4gIkMiIHsgKi8NCisjZW5kaWYNCisNCisjZW5kaWYgLyogTU9SUEhPX0dFVF9JTUFHRV9TSVpFX0ggKi8NCmRpZmYgLS1naXQgYS9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX2hkcl9jaGVja2VyLmggYi9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX2hkcl9jaGVja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyY2ZjMQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9faGRyX2NoZWNrZXIuaApAQCAtMCwwICsxLDE1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBtb3JwaG9faGRyX2NoZWNrZXIuaA0KKyAqIFtDUDkzMi9DUkxGXSB7IIKgIJWEjYaJu5X7jq6OqZOulLuS6JdwIH0NCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIE1vcnBobyxJbmMuDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBNT1JQSE9fSERSX0NIRUNLRVJfSA0KKyNkZWZpbmUgTU9SUEhPX0hEUl9DSEVDS0VSX0gNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAibW9ycGhvX2FwaS5oIg0KKyNpbmNsdWRlICJtb3JwaG9fZXJyb3IuaCINCisjaW5jbHVkZSAibW9ycGhvX2ltYWdlX2RhdGEuaCINCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjZGVmaW5lIE1PUlBIT19IRFJfQ0hFQ0tFUl9WRVIgIk1vcnBobyBEUiBDaGVja2VyIFZlci4xLjEuMCAyMDEyLzEvMTciDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2RlZmluZSBNT1JQSE9fSERSX0NIRUNLRVJfTUlOX0lNQUdFX1dJRFRIICAgICAyDQorI2RlZmluZSBNT1JQSE9fSERSX0NIRUNLRVJfTUFYX0lNQUdFX1dJRFRIICA4MTkyDQorI2RlZmluZSBNT1JQSE9fSERSX0NIRUNLRVJfTUlOX0lNQUdFX0hFSUdIVCAgICAyDQorI2RlZmluZSBNT1JQSE9fSERSX0NIRUNLRVJfTUFYX0lNQUdFX0hFSUdIVCA4MTkyDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQordHlwZWRlZiBzdHJ1Y3QgX21vcnBob19IRFJDaGVja2VyIG1vcnBob19IRFJDaGVja2VyOw0KKw0KKy8qIEhEUo53lVeVXYm/iu0gKi8NCitzdHJ1Y3QgX21vcnBob19IRFJDaGVja2VyDQorew0KKyAgICB2b2lkICpwOyAvKio8IJPglZSNXJGikcyC1oLMg3yDQ4OTg14gKi8NCit9Ow0KKw0KKy8qIJSSlPKC0YFFjZWCwoLUguqUu5LogsyVcYq0k3ggKi8NCit0eXBlZGVmIGVudW0gew0KKyAgICBNT1JQSE9fSERSX0NIRUNLRVJfU0VOU0lUSVZJVFlfU0VOU0lUSVZFLA0KKyAgICBNT1JQSE9fSERSX0NIRUNLRVJfU0VOU0lUSVZJVFlfTk9STUFMLA0KKyAgICBNT1JQSE9fSERSX0NIRUNLRVJfU0VOU0lUSVZJVFlfSU5TRU5TSVRJVkUsDQorfSBNT1JQSE9fSERSX0NIRUNLRVJfU0VOU0lUSVZJVFk7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorDQorLyoqDQorICogg2+BW4NXg4eDk5W2jpqX8YLwjuaTvg0KKyAqDQorICogQHJldHVybiCDb4Fbg1eDh4OTlbaOmpfxKE1PUlBIT19FQVNZX0hEUl9WRVIpDQorICovDQorTU9SUEhPX0FQSShjb25zdCBjaGFyKikNCittb3JwaG9fSERSQ2hlY2tlcl9nZXRWZXJzaW9uKHZvaWQpOw0KKw0KKy8qKg0KKyAqIJVLl3aCyIOBg4KDioNUg0ODWYLwjuaTvg0KKyAqDQorICogQHBhcmFtW2luXSB3aWR0aCAgk/yXzYnmkZyCzJWdDQorICogQHBhcmFtW2luXSBoZWlnaHQgk/yXzYnmkZyCzI2CgrMNCisgKiBAcGFyYW1baW5dIGZvcm1hdCCT/JfNieaRnILMg3SDSIFbg32DYoNnDQorICogQHJldHVybiCVS5d2gsiDgYOCg4qDVINDg1koYnl0ZSkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fSERSQ2hlY2tlcl9nZXRCdWZmZXJTaXplKA0KKyAgICBpbnQgd2lkdGgsDQorICAgIGludCBoZWlnaHQsDQorICAgIGNvbnN0IGNoYXIgKmZvcm1hdCk7DQorDQorLyoqDQorICogj4mK+om7DQorICoNCisgKiBAcGFyYW1baW4sb3V0XSBwICAgICAgICAgICBIRFJDaGVja2Vyg0ODk4NYg16Dk4NYDQorICogQHBhcmFtW2luXSAgICAgYnVmZmVyICAgICAgSERSQ2hlY2tlcoLJioSC6JOWgsSC6YOBg4KDioLWgsyDfINDg5ODXg0KKyAqIEBwYXJhbVtpbl0gICAgIGJ1ZmZlcl9zaXplIEhEUkNoZWNrZXKCyYqEguiTloLEgumDgYOCg4qCzINUg0ODWQ0KKyAqIEBwYXJhbVtpbl0gICAgIHdpZHRoICAgICAgIJP8l82J5pGcgsyVnQ0KKyAqIEBwYXJhbVtpbl0gICAgIGhlaWdodCAgICAgIJP8l82J5pGcgsyNgoKzDQorICogQHBhcmFtW2luXSAgICAgZm9ybWF0ICAgICAgk/yXzYnmkZyCzIN0g0iBW4N9g2KDZw0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0hEUkNoZWNrZXJfaW5pdGlhbGl6ZSgNCisgICAgbW9ycGhvX0hEUkNoZWNrZXIgKiBjb25zdCBwLA0KKyAgICB2b2lkICogY29uc3QgYnVmZmVyLA0KKyAgICBjb25zdCBpbnQgYnVmZmVyX3NpemUsDQorICAgIGNvbnN0IGludCB3aWR0aCwNCisgICAgY29uc3QgaW50IGhlaWdodCwNCisgICAgY29uc3QgY2hhciAqZm9ybWF0KTsNCisNCisvKioNCisgKiCDToOKgVuDk4NBg2KDdg0KKyAqIGluaXRpYWxpemUoKY7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdIHAgSERSQ2hlY2tlcoNDg5ODWINeg5ODWA0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX0hEUkNoZWNrZXJfZmluYWxpemUoDQorICAgIG1vcnBob19IRFJDaGVja2VyICpwKTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKioNCisgKiBIRFKOd5VXjHaOWoLMlXGKtJCrgsyQ3ZLoDQorICogaW5pdGlhbGl6ZSgpjsCNc4zjgsmOwI1zicKUXA0KKyAqDQorICogQHBhcmFtW2luLG91dF0gcCAgICAgICAgICAgSERSQ2hlY2tlcoNDg5ODWINeg5ODWA0KKyAqIEBwYXJhbVtpbl0gICAgIHNlbnNpdGl2aXR5IJVxirSQqyhNT1JQSE9fSERSX0NIRUNLRVJfU0VOU0lUSVZJWZfxi5ORzILFjneS6CkNCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19IRFJDaGVja2VyX3NldFNlbnNpdGl2aXR5KA0KKyAgICBtb3JwaG9fSERSQ2hlY2tlciAqIGNvbnN0IHAsDQorICAgIE1PUlBIT19IRFJfQ0hFQ0tFUl9TRU5TSVRJVklUWSBzZW5zaXRpdml0eSk7DQorDQorLyoqDQorICogSERSjneVV4x2jlqCzJVxirSQq4LMjuaTvg0KKyAqIGluaXRpYWxpemUoKY7AjXOM44LJjsCNc4nClFwNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdIHAgICAgICAgICAgIEhEUkNoZWNrZXKDQ4OTg1iDXoOTg1gNCisgKiBAcGFyYW1bb3V0XSAgICBzZW5zaXRpdml0eSCVcYq0kKuC1oLMg3yDQ4OTg14NCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19IRFJDaGVja2VyX2dldFNlbnNpdGl2aXR5KA0KKyAgICBtb3JwaG9fSERSQ2hlY2tlciAqIGNvbnN0IHAsDQorICAgIE1PUlBIT19IRFJfQ0hFQ0tFUl9TRU5TSVRJVklUWSAqc2Vuc2l0aXZpdHkpOw0KKw0KKy8qKg0KKyAqIEhEUo53lVeCzJVdib8NCisgKiBpbml0aWFsaXplKCmOwI1zjOOCyY7AjXOJwpRcDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSBwICAgICAgSERSQ2hlY2tlcoNDg5ODWINeg5ODWA0KKyAqIEBwYXJhbVtvdXRdICAgIHJlc3VsdCCVXYm/jIuJyoLwimmUW4K3gumUepfxKJd2kWaQlDSCzJR6l/EpDQorICogICAgICAgICAgICAgICAgICAgICAgIJd2kWaCqpTxg1uDjYLMj+qNh4LJkc6JnoK3gumJuotMgsyYSY9vgsyJ5pGcgqqVS5d2gsaUu5LoDQorICogICAgICAgICAgICAgICAgICAgICAgIHsrMiwgKzEsIC0xLCAtMn2CzI+HgsmUu5LojIuJyoKqimmUW4KzguqC6Q0KKyAqIEBwYXJhbVtpbl0gICAgIGlucHV0X2ltYWdlIJP8l82J5pGcDQorICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fSERSQ2hlY2tlcl9ldmFsdWF0ZSgNCisgICAgbW9ycGhvX0hEUkNoZWNrZXIgKiBjb25zdCBwLA0KKyAgICBpbnQgKiBjb25zdCByZXN1bHQsDQorICAgIGNvbnN0IG1vcnBob19JbWFnZURhdGEgKiBjb25zdCBpbnB1dF9pbWFnZSk7DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvKiBNT1JQSE9fSERSX0NIRUNLRVJfSCAqLw0KZGlmZiAtLWdpdCBhL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9faW1hZ2VfZGF0YS5oIGIvY2FtZXJhL2hkci9pbmNsdWRlL21vcnBob19pbWFnZV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjMDVhYQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9faW1hZ2VfZGF0YS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qKg0KKyAqIEBmaWxlICAgICBtb3JwaG9faW1hZ2VfZGF0YS5oDQorICogQGJyaWVmICAgIInmkZyDZoFbg16CzI1ckaKRzJLoi2ANCisgKiBAdmVyc2lvbiAgMS4wLjANCisgKiBAZGF0ZSAgICAgMjAwOC0wNi0wOQ0KKyAqDQorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTIgTW9ycGhvLCBJbmMuDQorICovDQorDQorI2lmbmRlZiBNT1JQSE9fSU1BR0VfREFUQV9IDQorI2RlZmluZSBNT1JQSE9fSU1BR0VfREFUQV9IDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorDQordHlwZWRlZiBzdHJ1Y3R7DQorICAgIHZvaWQgKiB5OyAgICAgICAgICAgICAgIC8qKjwgWYnmkZyCzJDmk6qDfINDg5ODXiAqLw0KKyAgICB2b2lkICogdTsgICAgICAgICAgICAgICAvKio8IFWJ5pGcgsyQ5pOqg3yDQ4OTg14gKi8NCisgICAgdm9pZCAqIHY7ICAgICAgICAgICAgICAgLyoqPCBWieaRnILMkOaTqoN8g0ODk4NeICovDQorfSBtb3JwaG9fSW1hZ2VZdXZQbGFuYXI7DQorDQordHlwZWRlZiBzdHJ1Y3R7DQorICAgIHZvaWQgKiB5OyAgICAgICAgICAgICAgIC8qKjwgWYnmkZyCzJDmk6qDfINDg5ODXiAqLw0KKyAgICB2b2lkICogdXY7ICAgICAgICAgICAgICAvKio8IFVWieaRnILMkOaTqoN8g0ODk4NeICovDQorfSBtb3JwaG9fSW1hZ2VZdXZTZW1pUGxhbmFyOw0KKw0KKy8qKiCJ5pGcg2aBW4NeLiAqLw0KK3R5cGVkZWYgc3RydWN0IHsNCisgICAgaW50IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCCVnSAqLw0KKyAgICBpbnQgaGVpZ2h0OyAgICAgICAgICAgICAvKio8II2CgrMgKi8NCisgICAgdW5pb257DQorICAgICAgICB2b2lkICogcDsgICAgICAgICAgIC8qKjwgieaRnINmgVuDXoLMkOaTqoN8g0ODk4NeICovDQorICAgICAgICBtb3JwaG9fSW1hZ2VZdXZQbGFuYXIgcGxhbmFyOw0KKyAgICAgICAgbW9ycGhvX0ltYWdlWXV2U2VtaVBsYW5hciBzZW1pX3BsYW5hcjsNCisgICAgfSBkYXQ7DQorfSBtb3JwaG9fSW1hZ2VEYXRhOw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisNCisjZW5kaWYgLyogI2lmbmRlZiBNT1JQSE9fSU1BR0VfREFUQV9IICovDQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2hkci9pbmNsdWRlL21vcnBob19pbWFnZV9kYXRhX2V4LmggYi9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX2ltYWdlX2RhdGFfZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjMzZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2hkci9pbmNsdWRlL21vcnBob19pbWFnZV9kYXRhX2V4LmgKQEAgLTAsMCArMSw1MSBAQAorLyoqCisgKiBAZmlsZSAgICAgbW9ycGhvX2ltYWdlX2RhdGFfZXguaAorICogQGJyaWVmICAgIOeUu+WDj+ODh+ODvOOCv+OBruani+mAoOS9k+Wumue+qQorICogQHZlcnNpb24gIDEuMC4wCisgKiBAZGF0ZSAgICAgMjAxMC0wMy0zMAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIE1vcnBobywgSW5jLgorICovCisKKyNpZm5kZWYgTU9SUEhPX0lNQUdFX0RBVEFfRVhfSAorI2RlZmluZSBNT1JQSE9fSU1BR0VfREFUQV9FWF9ICisKKyNpbmNsdWRlICJtb3JwaG9faW1hZ2VfZGF0YS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0eworICAgIGludCB5OworICAgIGludCB1OworICAgIGludCB2OworfSBtb3JwaG9fSW1hZ2VZdXZQbGFuYXJQaXRjaDsKKwordHlwZWRlZiBzdHJ1Y3R7CisgICAgaW50IHk7CisgICAgaW50IHV2OworfSBtb3JwaG9fSW1hZ2VZdXZTZW1pUGxhbmFyUGl0Y2g7CisKKy8qKiDnlLvlg4/jg4fjg7zjgr8uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCDluYUgKi8KKyAgICBpbnQgaGVpZ2h0OyAgICAgICAgICAgICAvKio8IOmrmOOBlSAqLworICAgIHVuaW9ueworICAgICAgICB2b2lkICpwOyAgICAgICAgICAgIC8qKjwg55S75YOP44OH44O844K/44Gu5YWI6aCt44Od44Kk44Oz44K/ICovCisgICAgICAgIG1vcnBob19JbWFnZVl1dlBsYW5hciBwbGFuYXI7CisgICAgICAgIG1vcnBob19JbWFnZVl1dlNlbWlQbGFuYXIgc2VtaV9wbGFuYXI7CisgICAgfSBkYXQ7CisgICAgdW5pb257CisgICAgICAgIGludCBwOyAgICAgICAgICAgICAgLyoqPCDjg6njgqTjg7Pjga7lhYjpoK3jgYvjgonmrKHjga7jg6njgqTjg7PlhYjpoK3jgb7jgafjga7jg5DjgqTjg4jmlbAgKi8KKyAgICAgICAgbW9ycGhvX0ltYWdlWXV2UGxhbmFyUGl0Y2ggcGxhbmFyOworICAgICAgICBtb3JwaG9fSW1hZ2VZdXZTZW1pUGxhbmFyUGl0Y2ggc2VtaV9wbGFuYXI7CisgICAgfSBwaXRjaDsKK30gbW9ycGhvX0ltYWdlRGF0YUV4OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAjaWZuZGVmIE1PUlBIT19JTUFHRV9EQVRBX0VYX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fbW90aW9uX2RhdGEuaCBiL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fbW90aW9uX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI3OGRiCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2hkci9pbmNsdWRlL21vcnBob19tb3Rpb25fZGF0YS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qKg0KKyAqIEBmaWxlICAgICBtb3JwaG9fbW90aW9uX2RhdGEuaA0KKyAqIEBicmllZiAgICCTroKrg2aBW4NegsyNXJGikcyS6ItgDQorICogQHZlcnNpb24gIDEuMC4wDQorICogQGRhdGUgICAgIDIwMDgtMDYtMDkNCisgKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEyIE1vcnBobywgSW5jLg0KKyAqLw0KKw0KKyNpZm5kZWYgTU9SUEhPX01PVElPTl9EQVRBX0gNCisjZGVmaW5lIE1PUlBIT19NT1RJT05fREFUQV9IDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorDQorLyoqIJOugquDZoFbg14uICovDQordHlwZWRlZiBzdHJ1Y3Qgew0KKyAgICBpbnQgdls2XTsgIC8qKjwgk66Cq4NmgVuDXiAqLw0KKyAgICBpbnQgZmNvZGU7IC8qKjwgkKyM9zowIC8gjriUczowiMiKT4FpjriUc4K1gr2MtIj2gWogKi8NCit9IG1vcnBob19Nb3Rpb25EYXRhOw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisNCisjZW5kaWYgLyogI2lmbmRlZiBNT1JQSE9fTU9USU9OX0RBVEFfSCAqLw0KZGlmZiAtLWdpdCBhL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fbm9pc2VfcmVkdWN0aW9uLmggYi9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX25vaXNlX3JlZHVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmMyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX25vaXNlX3JlZHVjdGlvbi5oCkBAIC0wLDAgKzEsMjA0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gbW9ycGhvX25vaXNlX3JlZHVjdGlvbi5oDQorLy8gW1NKSVMvQ1JMRl0geyCCoCCVhI2GibuV+46ujqmTrpS7kuiXcCB9DQorLy8NCisvLyBDb3B5cmlnaHQoYykgMjAwNi0yMDEyIE1vcnBobyxJbmMuDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyNpZm5kZWYgTU9SUEhPX05PSVNFX1JFRFVDVElPTl9IDQorIyBkZWZpbmUgTU9SUEhPX05PSVNFX1JFRFVDVElPTl9IDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgaW5jbHVkZSAibW9ycGhvX2FwaS5oIg0KKyMgaW5jbHVkZSAibW9ycGhvX2Vycm9yLmgiDQorIyBpbmNsdWRlICJtb3JwaG9faW1hZ2VfZGF0YS5oIg0KKyMgaW5jbHVkZSAibW9ycGhvX21vdGlvbl9kYXRhLmgiDQorIyBpbmNsdWRlICJtb3JwaG9fcmVjdF9pbnQuaCINCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyMgZW5kaWYNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorLyoqIINvgVuDV4OHg5OVto6al/EgKi8NCisjIGRlZmluZSBNT1JQSE9fTk9JU0VfUkVEVUNUSU9OX1ZFUlNJT04gIk1vcnBobyBOb2lzZSBSZWR1Y3Rpb24gVmVyLjAuOS4wIDIwMTIvMDgvMDkiDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8qKiCDbYNDg1mPnIuOiu0gKi8NCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAgdm9pZCAqcDsgLyoqPCCT4JWUjVyRopHMgtaCzIN8g0ODk4NeICovDQorfSBtb3JwaG9fTm9pc2VSZWR1Y3Rpb247DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKy8qKg0KKyAqIINvgVuDV4OHg5OVto6al/GC8I7mk74NCisgKg0KKyAqIEByZXR1cm4gg2+BW4NXg4eDk5W2jpqX8ShNT1JQSE9fSU1BR0VfU1RBQklMSVpFUl9WRVJTSU9OKQ0KKyAqLw0KK01PUlBIT19BUEkoY29uc3QgY2hhciAqKQ0KK21vcnBob19Ob2lzZVJlZHVjdGlvbl9nZXRWZXJzaW9uKHZvaWQpOw0KKw0KKy8qKg0KKyAqIINtg0ODWY+ci46PiJedgsmVS5d2gsiDgYOCg4qDVINDg1mC8I7mk74NCisgKiCOd5LogsWCq4Lpg3SDSIFbg32DYoNngs1UUk2C8I5Rj8aBQg0KKyAqDQorICogQHBhcmFtW2luXSB3aWR0aCAgk/yXzYnmkZyCzJWdDQorICogQHBhcmFtW2luXSBoZWlnaHQgk/yXzYnmkZyCzI2CgrMNCisgKiBAcGFyYW1baW5dIGZvcm1hdCCJ5pGcg3SDSIFbg32DYoNnlbaOmpfxDQorICogQHJldHVybiCVS5d2gsiDgYOCg4qDVINDg1koYnl0ZSkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fTm9pc2VSZWR1Y3Rpb25fZ2V0QnVmZmVyU2l6ZSgNCisgICAgaW50IHdpZHRoLA0KKyAgICBpbnQgaGVpZ2h0LA0KKyAgICBjb25zdCBjaGFyICpmb3JtYXQpOw0KKw0KKy8qKg0KKyAqIINtg0ODWY+ci46K7YLMj4mK+om7DQorICoNCisgKiBAcGFyYW1bb3V0XSByZWR1Y2VyICCDbYNDg1mPnIuOiu0NCisgKiBAcGFyYW1bb3V0XSBidWZmZXIgICAgICCDbYNDg1mPnIuOiu2CyYqEguiTloLEgumDgYOCg4qC1oLMg3yDQ4OTg14NCisgKiBAcGFyYW1baW5dICBidWZmZXJfc2l6ZSCDbYNDg1mPnIuOiu2CyYqEguiTloLEgumDgYOCg4qCzINUg0ODWS4NCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaChtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fTm9pc2VSZWR1Y3Rpb25faW5pdGlhbGl6ZSgNCisgICAgbW9ycGhvX05vaXNlUmVkdWN0aW9uICpyZWR1Y2VyLA0KKyAgICB2b2lkICpidWZmZXIsDQorICAgIGludCBidWZmZXJfc2l6ZSk7DQorDQorLyoqDQorICogg22DQ4NZj5yLjortgsyDToOKgVuDk4NBg2KDdg0KKyAqDQorICogQHBhcmFtW2luLG91dF0gcmVkdWNlciCDbYNDg1mPnIuOiu0NCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaChtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fTm9pc2VSZWR1Y3Rpb25fZmluYWxpemUoDQorICAgIG1vcnBob19Ob2lzZVJlZHVjdGlvbiAqcmVkdWNlcik7DQorDQorLyoqDQorICogg22DQ4NZj5yLjo+Il506II+Il52KSo5uDQorICogj2+XzYnmkZwob3V0cHV0X2ltYWdlKYLNMZaHltqCzJP8l82J5pGcgsaTr4K2gsWC4JfHgqINCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdIHJlZHVjZXIgICAgg22DQ4NZj5yLjortDQorICogQHBhcmFtW291dF0gICAgb3V0cHV0X2ltYWdlICCPb5fNieaRnA0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoKG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19Ob2lzZVJlZHVjdGlvbl9zdGFydCgNCisgICAgbW9ycGhvX05vaXNlUmVkdWN0aW9uICpyZWR1Y2VyLA0KKyAgICBtb3JwaG9fSW1hZ2VEYXRhICpvdXRwdXRfaW1hZ2UpOw0KKw0KKy8qKg0KKyAqIINtg0ODWY+ci46PiJedOiCDbYNDg1mPnIuODQorICoNCisgKiBAcGFyYW1baW4sb3V0XSByZWR1Y2VyICAgg22DQ4NZj5yLjortDQorICogQHBhcmFtW291dF0gICAgaW5wdXRfaW1hZ2UgII9vl82J5pGcDQorICogQHJldHVybiCDR4OJgVuDUoFbg2gobW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX05vaXNlUmVkdWN0aW9uX3JlZHVjZU5vaXNlKA0KKyAgICBtb3JwaG9fTm9pc2VSZWR1Y3Rpb24gKnJlZHVjZXIsDQorICAgIG1vcnBob19JbWFnZURhdGEgKmlucHV0X2ltYWdlKTsNCisNCisvKioNCisgKiCJ5pGcg3SDSIFbg32DYoNngvCO5pO+DQorICogaW5pdGlhbGl6ZSgpjsCNc4zjgsmO5pO+icKUXA0KKyAqIINvg2KDdINAg1SDQ4NZgs0zMojIj+OCxoK3gumCsYLGDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSByZWR1Y2VyIINtg0ODWY+ci46K7Q0KKyAqIEBwYXJhbVtvdXRdIGZvcm1hdCCJ5pGcg3SDSIFbg32DYoNnlbaOmpfxgqqKaZRbgrOC6oLpDQorICogQHBhcmFtW2luXSBidWZmZXJfc2l6ZSCDb4Nig3SDQINUg0ODWQ0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoKG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19Ob2lzZVJlZHVjdGlvbl9nZXRJbWFnZUZvcm1hdCgNCisgICAgbW9ycGhvX05vaXNlUmVkdWN0aW9uICpyZWR1Y2VyLA0KKyAgICBjaGFyICpmb3JtYXQsDQorICAgIGNvbnN0IGludCBidWZmZXJfc2l6ZSk7DQorDQorLyoqDQorICogi1CTeINtg0ODWY+ci46LrZN4g4yDeIOLgvCO5pO+DQorICogaW5pdGlhbGl6ZSgpjsCNc4zjgsmO5pO+icKUXA0KKyAqDQorICogQHBhcmFtW2luLG91dF0gcmVkdWNlciCDbYNDg1mPnIuOiu0NCisgKiBAcGFyYW1bb3V0XSBsZXZlbCCLUJN4g22DQ4NZj5yLjoutk3iDjIN4g4uCqopplFuCs4LqgukNCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaChtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fTm9pc2VSZWR1Y3Rpb25fZ2V0THVtYU5vaXNlUmVkdWN0aW9uTGV2ZWwoDQorICAgIG1vcnBob19Ob2lzZVJlZHVjdGlvbiAqcmVkdWNlciwNCisgICAgaW50ICpsZXZlbCk7DQorDQorLyoqDQorICogg06DjYN9g22DQ4NZj5yLjoutk3iDjIN4g4uC8I7mk74NCisgKiBpbml0aWFsaXplKCmOwI1zjOOCyY7mk76JwpRcDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSByZWR1Y2VyIINtg0ODWY+ci46K7Q0KKyAqIEBwYXJhbVtvdXRdIGxldmVsIINOg42DfYNtg0ODWY+ci46LrZN4g4yDeIOLgqqKaZRbgrOC6oLpDQorICogQHJldHVybiCDR4OJgVuDUoFbg2gobW9ycGhvX2Vycm9yLmgpDQorICovDQorTU9SUEhPX0FQSShpbnQpDQorbW9ycGhvX05vaXNlUmVkdWN0aW9uX2dldENocm9tYU5vaXNlUmVkdWN0aW9uTGV2ZWwoDQorICAgIG1vcnBob19Ob2lzZVJlZHVjdGlvbiAqcmVkdWNlciwNCisgICAgaW50ICpsZXZlbCk7DQorDQorLyoqDQorICogieaRnIN0g0iBW4N9g2KDZ4LwkN2S6A0KKyAqIGluaXRpYWxpemUoKY7AjXOM44KpgsJzdGFydCgpjsCNc5FPgsmQ3ZLoicKUXA0KKyAqII53kuiCxYKrgumDdINIgVuDfYNig2eCzVRSTYLwjlGPxoFCDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSByZWR1Y2VyIINtg0ODWY+ci46K7Q0KKyAqIEBwYXJhbVtpbl0gZm9ybWF0IInmkZyDdINIgVuDfYNig2eVto6al/ENCisgKiBAcmV0dXJuIINHg4mBW4NSgVuDaChtb3JwaG9fZXJyb3IuaCkNCisgKi8NCitNT1JQSE9fQVBJKGludCkNCittb3JwaG9fTm9pc2VSZWR1Y3Rpb25fc2V0SW1hZ2VGb3JtYXQoDQorICAgIG1vcnBob19Ob2lzZVJlZHVjdGlvbiAqcmVkdWNlciwNCisgICAgY29uc3QgY2hhciAqZm9ybWF0KTsNCisNCisvKioNCisgKiCLUJN4g22DQ4NZj5yLjoutk3iDjIN4g4uC8JDdkugNCisgKiBpbml0aWFsaXplKCmOwI1zjOOCqYLCc3RhcnQoKY7AjXORT4LJkN2S6InClFwNCisgKg0KKyAqIEBwYXJhbVtpbixvdXRdIHJlZHVjZXIgg22DQ4NZj5yLjortDQorICogQHBhcmFtW2luXSBsZXZlbCCLUJN4g22DQ4NZj5yLjoutk3iDjIN4g4soMC03KQ0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoKG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19Ob2lzZVJlZHVjdGlvbl9zZXRMdW1hTm9pc2VSZWR1Y3Rpb25MZXZlbCgNCisgICAgbW9ycGhvX05vaXNlUmVkdWN0aW9uICpyZWR1Y2VyLA0KKyAgICBpbnQgbGV2ZWwpOw0KKw0KKy8qKg0KKyAqIINOg42DfYNtg0ODWY+ci46LrZN4g4yDeIOLgvCQ3ZLoDQorICogaW5pdGlhbGl6ZSgpjsCNc4zjgqmCwnN0YXJ0KCmOwI1zkU+CyZDdkuiJwpRcDQorICoNCisgKiBAcGFyYW1baW4sb3V0XSByZWR1Y2VyIINtg0ODWY+ci46K7Q0KKyAqIEBwYXJhbVtpbl0gbGV2ZWwgg06DjYN9g22DQ4NZj5yLjoutk3iDjIN4g4soMC03KQ0KKyAqIEByZXR1cm4gg0eDiYFbg1KBW4NoKG1vcnBob19lcnJvci5oKQ0KKyAqLw0KK01PUlBIT19BUEkoaW50KQ0KK21vcnBob19Ob2lzZVJlZHVjdGlvbl9zZXRDaHJvbWFOb2lzZVJlZHVjdGlvbkxldmVsKA0KKyAgICBtb3JwaG9fTm9pc2VSZWR1Y3Rpb24gKnJlZHVjZXIsDQorICAgIGludCBsZXZlbCk7DQorDQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyMgaWZkZWYgX19jcGx1c3BsdXMNCit9IC8vIGV4dGVybiAiQyINCisjIGVuZGlmDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyNlbmRpZiAvLyAhTU9SUEhPX0lNQUdFX1NUQUJJTElaRVIzX0gNCisNCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorLy8gW0VPRl0NCmRpZmYgLS1naXQgYS9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX25vaXNlX3JlZHVjdGlvbl9leHQuaCBiL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fbm9pc2VfcmVkdWN0aW9uX2V4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTU5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvaGRyL2luY2x1ZGUvbW9ycGhvX25vaXNlX3JlZHVjdGlvbl9leHQuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIE1PUlBIT19OUl9FWFRfSAorI2RlZmluZSBNT1JQSE9fTlJfRVhUX0gKKworI2luY2x1ZGUgIm1vcnBob19ub2lzZV9yZWR1Y3Rpb24uaCIKKy8qCityZXR1cm4gPT0gMCA6IE9LCityZXR1cm4gIT0gMCA6IE5HIChQbGVhc2UgcHJpbnQgdGhlIHJldHVybiB2YWx1ZSB0byBjaGVjayBFcnJvciB0eXBlcykKKyovCitNT1JQSE9fQVBJKGludCkKK0xJTktfbW1fY2FtZXJhX21vcnBob19ub2lzZV9yZWR1Y3Rpb24oCisgICAgdW5zaWduZWQgY2hhciogeXV2SW1hZ2UsCisgICAgaW50IHdpZHRoLAorICAgIGludCBoZWlnaHQsCisgICAgaW50IHlfbGV2ZWwsCisgICAgaW50IGNfbGV2ZWwpOworCisjZW5kaWYgLy9NT1JQSE9fTlJfRVhUX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fcmVjdF9pbnQuaCBiL2NhbWVyYS9oZHIvaW5jbHVkZS9tb3JwaG9fcmVjdF9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzUzNGE0Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2hkci9pbmNsdWRlL21vcnBob19yZWN0X2ludC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qKg0KKyAqIEBmaWxlICAgICBtb3JwaG9fcmVjdF9pbnQuaA0KKyAqIEBicmllZiAgICCL6Yxgg2aBW4NegsyNXJGikcyS6ItgDQorICogQHZlcnNpb24gIDEuMC4wDQorICogQGRhdGUgICAgIDIwMDgtMDYtMDkNCisgKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEyIE1vcnBobywgSW5jLg0KKyAqLw0KKw0KKyNpZm5kZWYgTU9SUEhPX1JFQ1RfSU5UX0gNCisjZGVmaW5lIE1PUlBIT19SRUNUX0lOVF9IDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorDQorLyoqIIvpjGCDZoFbg14uICovDQordHlwZWRlZiBzdHJ1Y3Qgew0KKyAgICBpbnQgc3g7IC8qKjwgbGVmdCAqLw0KKyAgICBpbnQgc3k7IC8qKjwgdG9wICovDQorICAgIGludCBleDsgLyoqPCByaWdodCAqLw0KKyAgICBpbnQgZXk7IC8qKjwgYm90dG9tICovDQorfSBtb3JwaG9fUmVjdEludDsNCisNCisvKiogi+mMYJfMiOYgcmVjdCCCzI22j+ONwJVXIChsLHQpIILGiUWJuo3AlVcgKHIsYikggvCQ3ZLogreC6S4gKi8NCisjZGVmaW5lIG1vcnBob19SZWN0SW50X3NldFJlY3QocmVjdCxsLHQscixiKSBkbyB7IFwNCisJKHJlY3QpLT5zeD0obCk7XA0KKwkocmVjdCktPnN5PSh0KTtcDQorCShyZWN0KS0+ZXg9KHIpO1wNCisJKHJlY3QpLT5leT0oYik7XA0KKyAgICB9IHdoaWxlKDApDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvKiAjaWZuZGVmIE1PUlBIT19SRUNUX0lOVF9IICovDQpkaWZmIC0tZ2l0IGEvY2FtZXJhL21tLWNhbWVyYS1pbnRlcmZhY2UvbW1fY2FtZXJhLmMgYi9jYW1lcmEvbW0tY2FtZXJhLWludGVyZmFjZS9tbV9jYW1lcmEuYwppbmRleCA1YmE0OTk2Li4xMjIwM2UwIDEwMDY0NAotLS0gYS9jYW1lcmEvbW0tY2FtZXJhLWludGVyZmFjZS9tbV9jYW1lcmEuYworKysgYi9jYW1lcmEvbW0tY2FtZXJhLWludGVyZmFjZS9tbV9jYW1lcmEuYwpAQCAtNjQzLDYgKzY0MywxMCBAQAogICAgIGNhc2UgTU1fQ0FNRVJBX1BBUk1fVkZFX09VVFBVVF9FTkFCTEU6CiAgICAgICAgICooKGludCAqKXBhcm0tPnBfdmFsdWUpID0gbXlfb2JqLT5wcm9wZXJ0aWVzLnZmZV9vdXRwdXRfZW5hYmxlOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NBTUVSQV9QQVJNX0xVWF9JRFg6CisgICAgICAgIENEQkcoIiVzOiBNTV9DQU1FUkFfUEFSTV9MVVhfSURYXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBtbV9jYW1lcmFfc2VuZF9uYXRpdmVfY3RybF9jbWQobXlfb2JqLCBDQU1FUkFfR0VUX1BBUk1fTFVYX0lEWCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpLCAodm9pZCAqKXBhcm0tPnBfdmFsdWUpOwogICAgIGNhc2UgTU1fQ0FNRVJBX1BBUk1fTUFYX05VTV9GQUNFU19ERUNUOgogICAgICAgICByZXR1cm4gbW1fY2FtZXJhX3NlbmRfbmF0aXZlX2N0cmxfY21kKG15X29iaiwgQ0FNRVJBX0dFVF9NQVhfTlVNX0ZBQ0VTX0RFQ1QsCiAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSwgKHZvaWQgKilwYXJtLT5wX3ZhbHVlKTsK