From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH v2 04/18] x86/traps: move all PV emulation code to pv/emulate_ops.h Date: Fri, 5 May 2017 15:48:22 +0100 Message-ID: <20170505144836.8612-5-wei.liu2@citrix.com> References: <20170505144836.8612-1-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d6eXE-0000Bw-5j for xen-devel@lists.xenproject.org; Fri, 05 May 2017 14:48:45 +0000 In-Reply-To: <20170505144836.8612-1-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Xen-devel Cc: Andrew Cooper , Wei Liu , Jan Beulich List-Id: xen-devel@lists.xenproject.org TW92ZSB0aGUgZm9sbG93aW5nIGVtdWxhdGlvbiBjb2RlIGZyb20gdHJhcHMuYzoKCjEuIGludmFs aWQgb3AKMi4gcmR0c2MKMy4gcHJpdmlsZWdlIGluc3RydWN0aW9ucwo0LiBnYXRlIG9wZXJhdGlv bgo1LiBwdiBjcHVpZCBlbXVsYXRpb24KCkV4cG9ydCB0aGUgZW11bGF0ZV8qIGZ1bmN0aW9ucyB2 aWEgcHYvdHJhcHMuaC4KCk5vIGZ1bmN0aW9uYWwgY2hhbmdlLgoKU2lnbmVkLW9mZi1ieTogV2Vp IExpdSA8d2VpLmxpdTJAY2l0cml4LmNvbT4KLS0tCiB4ZW4vYXJjaC94ODYvcHYvTWFrZWZpbGUg ICAgICAgfCAgICAxICsKIHhlbi9hcmNoL3g4Ni9wdi9lbXVsYXRlX29wcy5jICB8IDE5MjkgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogeGVuL2FyY2gveDg2L3RyYXBz LmMgICAgICAgICAgIHwgMTg4MCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KIHhlbi9pbmNsdWRlL2FzbS14ODYvcHYvdHJhcHMuaCB8ICAgNTQgKysKIDQgZmlsZXMgY2hh bmdlZCwgMTk4NSBpbnNlcnRpb25zKCspLCAxODc5IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUg MTAwNjQ0IHhlbi9hcmNoL3g4Ni9wdi9lbXVsYXRlX29wcy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQg eGVuL2luY2x1ZGUvYXNtLXg4Ni9wdi90cmFwcy5oCgpkaWZmIC0tZ2l0IGEveGVuL2FyY2gveDg2 L3B2L01ha2VmaWxlIGIveGVuL2FyY2gveDg2L3B2L01ha2VmaWxlCmluZGV4IDQ4OWE5ZjU5Y2Iu LmVmM2NlY2M0NjMgMTAwNjQ0Ci0tLSBhL3hlbi9hcmNoL3g4Ni9wdi9NYWtlZmlsZQorKysgYi94 ZW4vYXJjaC94ODYvcHYvTWFrZWZpbGUKQEAgLTMsMyArMyw0IEBAIG9iai15ICs9IHRyYXBzLm8K IAogb2JqLWJpbi15ICs9IGRvbTBfYnVpbGQuaW5pdC5vCiBvYmoteSArPSBkb21haW4ubworb2Jq LXkgKz0gZW11bGF0ZV9vcHMubwpkaWZmIC0tZ2l0IGEveGVuL2FyY2gveDg2L3B2L2VtdWxhdGVf b3BzLmMgYi94ZW4vYXJjaC94ODYvcHYvZW11bGF0ZV9vcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwLi41ZjA5NjVlMDViCi0tLSAvZGV2L251bGwKKysrIGIveGVuL2Fy Y2gveDg2L3B2L2VtdWxhdGVfb3BzLmMKQEAgLTAsMCArMSwxOTI5IEBACisvKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqCisgKiBhcmNoL3g4Ni9wdi9lbXVsYXRlX29wcy5jCisgKgorICogUFYgZW11bGF0 aW9uIGNvZGUKKyAqCisgKiBNb2RpZmljYXRpb25zIHRvIExpbnV4IG9yaWdpbmFsIGFyZSBjb3B5 cmlnaHQgKGMpIDIwMDItMjAwNCwgSyBBIEZyYXNlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxv bmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGlj ZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8eGVuL2Vycm5vLmg+CisjaW5jbHVkZSA8eGVuL2V2 ZW50Lmg+CisjaW5jbHVkZSA8eGVuL2d1ZXN0X2FjY2Vzcy5oPgorI2luY2x1ZGUgPHhlbi9pb2Nh cC5oPgorI2luY2x1ZGUgPHhlbi9zcGlubG9jay5oPgorI2luY2x1ZGUgPHhlbi90cmFjZS5oPgor CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vZGVidWdyZWcuaD4KKyNpbmNs dWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGFzbS9oeXBlcmNhbGwuaD4KKyNpbmNsdWRlIDxh c20vbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxhc20vcDJtLmg+CisjaW5jbHVkZSA8YXNtL3B2 L3RyYXBzLmg+CisjaW5jbHVkZSA8YXNtL3NoYXJlZC5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5o PgorI2luY2x1ZGUgPGFzbS94ODZfZW11bGF0ZS5oPgorCisjaW5jbHVkZSA8eHNtL3hzbS5oPgor CisvKiBJL08gZW11bGF0aW9uIHN1cHBvcnQuIEhlbHBlciByb3V0aW5lcyBmb3IsIGFuZCB0eXBl IG9mLCB0aGUgc3RhY2sgc3R1Yi4qLwordm9pZCBob3N0X3RvX2d1ZXN0X2dwcl9zd2l0Y2goc3Ry dWN0IGNwdV91c2VyX3JlZ3MgKik7Cit1bnNpZ25lZCBsb25nIGd1ZXN0X3RvX2hvc3RfZ3ByX3N3 aXRjaCh1bnNpZ25lZCBsb25nKTsKKwordm9pZCAoKnB2X3Bvc3Rfb3V0Yl9ob29rKSh1bnNpZ25l ZCBpbnQgcG9ydCwgdTggdmFsdWUpOworCit0eXBlZGVmIHZvaWQgaW9fZW11bF9zdHViX3Qoc3Ry dWN0IGNwdV91c2VyX3JlZ3MgKik7CisKK3N0cnVjdCBwcml2X29wX2N0eHQgeworICAgIHN0cnVj dCB4ODZfZW11bGF0ZV9jdHh0IGN0eHQ7CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQg bG9uZyBiYXNlLCBsaW1pdDsKKyAgICB9IGNzOworICAgIGNoYXIgKmlvX2VtdWxfc3R1YjsKKyAg ICB1bnNpZ25lZCBpbnQgYnBtYXRjaDsKKyAgICB1bnNpZ25lZCBpbnQgdHNjOworI2RlZmluZSBU U0NfQkFTRSAxCisjZGVmaW5lIFRTQ19BVVggMgorfTsKKworc3RhdGljIHZvaWQgaW5zdHJ1Y3Rp b25fZG9uZShzdHJ1Y3QgY3B1X3VzZXJfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyByaXApCit7 CisgICAgcmVncy0+cmlwID0gcmlwOworICAgIHJlZ3MtPmVmbGFncyAmPSB+WDg2X0VGTEFHU19S RjsKKyAgICBpZiAoIHJlZ3MtPmVmbGFncyAmIFg4Nl9FRkxBR1NfVEYgKQorICAgIHsKKyAgICAg ICAgY3VycmVudC0+YXJjaC5kZWJ1Z3JlZ1s2XSB8PSBEUl9TVEVQIHwgRFJfU1RBVFVTX1JFU0VS VkVEX09ORTsKKyAgICAgICAgcHZfaW5qZWN0X3RyYXAoVFJBUF9kZWJ1ZywgcmVncyk7CisgICAg fQorfQorCitzdGF0aWMgaW50IHB2X2VtdWxfdmlydF90b19saW5lYXIodW5zaWduZWQgbG9uZyBi YXNlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsIHVuc2lnbmVkIGxvbmcgbGltaXQsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZW51bSB4ODZfc2VnbWVudCBzZWcsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sK KyAgICBpbnQgcmMgPSBYODZFTVVMX09LQVk7CisKKyAgICAqYWRkciA9IGJhc2UgKyBvZmZzZXQ7 CisKKyAgICBpZiAoIGN0eHQtPmFkZHJfc2l6ZSA8IDY0ICkKKyAgICB7CisgICAgICAgIGlmICgg bGltaXQgPCBieXRlcyAtIDEgfHwgb2Zmc2V0ID4gbGltaXQgLSBieXRlcyArIDEgKQorICAgICAg ICAgICAgcmMgPSBYODZFTVVMX0VYQ0VQVElPTjsKKyAgICAgICAgKmFkZHIgPSAodWludDMyX3Qp KmFkZHI7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19hZGRyX29rKCphZGRyKSApCisgICAgICAg IHJjID0gWDg2RU1VTF9FWENFUFRJT047CisKKyAgICBpZiAoIHVubGlrZWx5KHJjID09IFg4NkVN VUxfRVhDRVBUSU9OKSApCisgICAgICAgIHg4Nl9lbXVsX2h3X2V4Y2VwdGlvbihzZWcgIT0geDg2 X3NlZ19zcyA/IFRSQVBfZ3BfZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDogVFJBUF9zdGFja19lcnJvciwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDAsIGN0eHQpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBy aXZfb3BfaW5zbl9mZXRjaChlbnVtIHg4Nl9zZWdtZW50IHNlZywKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdm9pZCAqcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5z aWduZWQgaW50IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHg4 Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisgICAgY29uc3Qgc3RydWN0IHByaXZfb3BfY3R4dCAq cG9jID0KKyAgICAgICAgY29udGFpbmVyX29mKGN0eHQsIHN0cnVjdCBwcml2X29wX2N0eHQsIGN0 eHQpOworICAgIHVuc2lnbmVkIGludCByYzsKKyAgICB1bnNpZ25lZCBsb25nIGFkZHIgPSBwb2Mt PmNzLmJhc2UgKyBvZmZzZXQ7CisKKyAgICBBU1NFUlQoc2VnID09IHg4Nl9zZWdfY3MpOworCisg ICAgLyogV2UgZG9uJ3QgbWVhbiB0byBlbXVsYXRlIGFueSBicmFuY2hlcy4gKi8KKyAgICBpZiAo ICFieXRlcyApCisgICAgICAgIHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKKworICAgIHJj ID0gcHZfZW11bF92aXJ0X3RvX2xpbmVhcihwb2MtPmNzLmJhc2UsIG9mZnNldCwgYnl0ZXMsIHBv Yy0+Y3MubGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Nl9zZWdfY3Ms IGN0eHQsICZhZGRyKTsKKyAgICBpZiAoIHJjICE9IFg4NkVNVUxfT0tBWSApCisgICAgICAgIHJl dHVybiByYzsKKworICAgIGlmICggKHJjID0gX19jb3B5X2Zyb21fdXNlcihwX2RhdGEsICh2b2lk ICopYWRkciwgYnl0ZXMpKSAhPSAwICkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRP RE86IFRoaXMgc2hvdWxkIHJlcG9ydCBQRkVDX2luc25fZmV0Y2ggd2hlbiBnb2MtPmluc25fZmV0 Y2ggJiYKKyAgICAgICAgICogY3B1X2hhc19ueCwgYnV0IHdlJ2QgdGhlbiBuZWVkIGEgImZldGNo IiB2YXJpYW50IG9mCisgICAgICAgICAqIF9fY29weV9mcm9tX3VzZXIoKSByZXNwZWN0aW5nIE5Y LCBTTUVQLCBhbmQgcHJvdGVjdGlvbiBrZXlzLgorICAgICAgICAgKi8KKyAgICAgICAgeDg2X2Vt dWxfcGFnZWZhdWx0KDAsIGFkZHIgKyBieXRlcyAtIHJjLCBjdHh0KTsKKyAgICAgICAgcmV0dXJu IFg4NkVNVUxfRVhDRVBUSU9OOworICAgIH0KKworICAgIHJldHVybiBYODZFTVVMX09LQVk7Cit9 CisKK3N0YXRpYyBpbnQgcmVhZF9kZXNjcmlwdG9yKHVuc2lnbmVkIGludCBzZWwsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdmNwdSAqdiwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBsb25nICpsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu c2lnbmVkIGludCAqYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sX3QgaW5zbl9m ZXRjaCkKK3sKKyAgICBzdHJ1Y3QgZGVzY19zdHJ1Y3QgZGVzYzsKKworICAgIGlmICggc2VsIDwg NCkKKyAgICAgICAgZGVzYy5iID0gZGVzYy5hID0gMDsKKyAgICBlbHNlIGlmICggX19nZXRfdXNl cihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgZGVzY19zdHJ1 Y3QgKikoIShzZWwgJiA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgPyBHRFRfVklSVF9TVEFSVCh2KQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBMRFRfVklSVF9TVEFSVCh2KSkKKyAg ICAgICAgICAgICAgICAgICAgICAgICArIChzZWwgPj4gMykpICkKKyAgICAgICAgcmV0dXJuIDA7 CisgICAgaWYgKCAhaW5zbl9mZXRjaCApCisgICAgICAgIGRlc2MuYiAmPSB+X1NFR01FTlRfTDsK KworICAgICphciA9IGRlc2MuYiAmIDB4MDBmMGZmMDA7CisgICAgaWYgKCAhKGRlc2MuYiAmIF9T RUdNRU5UX0wpICkKKyAgICB7CisgICAgICAgICpiYXNlID0gKChkZXNjLmEgPj4gMTYpICsgKChk ZXNjLmIgJiAweGZmKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAoZGVzYy5iICYgMHhmZjAw MDAwMCkpOworICAgICAgICAqbGltaXQgPSAoZGVzYy5hICYgMHhmZmZmKSB8IChkZXNjLmIgJiAw eDAwMGYwMDAwKTsKKyAgICAgICAgaWYgKCBkZXNjLmIgJiBfU0VHTUVOVF9HICkKKyAgICAgICAg ICAgICpsaW1pdCA9ICgoKmxpbWl0ICsgMSkgPDwgMTIpIC0gMTsKKyNpZm5kZWYgTkRFQlVHCisg ICAgICAgIGlmICggc2VsID4gMyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGlu dCBhLCBsOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB2YWxpZDsKKworICAgICAgICAgICAg YXNtIHZvbGF0aWxlICgKKyAgICAgICAgICAgICAgICAibGFybCAlMiwlMCA7IHNldHogJTEiCisg ICAgICAgICAgICAgICAgOiAiPXIiIChhKSwgIj1xbSIgKHZhbGlkKSA6ICJybSIgKHNlbCkpOwor ICAgICAgICAgICAgQlVHX09OKHZhbGlkICYmICgoYSAmIDB4MDBmMGZmMDApICE9ICphcikpOwor ICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgKKyAgICAgICAgICAgICAgICAibHNsbCAlMiwlMCA7 IHNldHogJTEiCisgICAgICAgICAgICAgICAgOiAiPXIiIChsKSwgIj1xbSIgKHZhbGlkKSA6ICJy bSIgKHNlbCkpOworICAgICAgICAgICAgQlVHX09OKHZhbGlkICYmIChsICE9ICpsaW1pdCkpOwor ICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmJhc2Ug PSAwVUw7CisgICAgICAgICpsaW1pdCA9IH4wVUw7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9 CisKK3N0YXRpYyBpbnQgcHJpdl9vcF9yZWFkX3NlZ21lbnQoZW51bSB4ODZfc2VnbWVudCBzZWcs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZWdtZW50X3JlZ2lzdGVy ICpyZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB4ODZfZW11bGF0 ZV9jdHh0ICpjdHh0KQoreworICAgIC8qIENoZWNrIGlmIHRoaXMgaXMgYW4gYXR0ZW1wdCB0byBh Y2Nlc3MgdGhlIEkvTyBiaXRtYXAuICovCisgICAgaWYgKCBzZWcgPT0geDg2X3NlZ190ciApCisg ICAgeworICAgICAgICBzd2l0Y2ggKCBjdHh0LT5vcGNvZGUgKQorICAgICAgICB7CisgICAgICAg IGNhc2UgMHg2YyAuLi4gMHg2ZjogLyogaW5zIC8gb3V0cyAqLworICAgICAgICBjYXNlIDB4ZTQg Li4uIDB4ZTc6IC8qIGluIC8gb3V0IChpbW1lZGlhdGUgcG9ydCkgKi8KKyAgICAgICAgY2FzZSAw eGVjIC4uLiAweGVmOiAvKiBpbiAvIG91dCAocG9ydCBpbiAlZHgpICovCisgICAgICAgICAgICAv KiBEZWZlciB0aGUgY2hlY2sgdG8gcHJpdl9vcF97cmVhZCx3cml0ZX1faW8oKS4gKi8KKyAgICAg ICAgICAgIHJldHVybiBYODZFTVVMX0RPTkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAo IGN0eHQtPmFkZHJfc2l6ZSA8IDY0ICkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbGlt aXQ7CisgICAgICAgIHVuc2lnbmVkIGludCBzZWwsIGFyOworCisgICAgICAgIHN3aXRjaCAoIHNl ZyApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSB4ODZfc2VnX2NzOiBzZWwgPSBjdHh0LT5yZWdz LT5jczsgYnJlYWs7CisgICAgICAgIGNhc2UgeDg2X3NlZ19kczogc2VsID0gcmVhZF9zcmVnKGRz KTsgIGJyZWFrOworICAgICAgICBjYXNlIHg4Nl9zZWdfZXM6IHNlbCA9IHJlYWRfc3JlZyhlcyk7 ICBicmVhazsKKyAgICAgICAgY2FzZSB4ODZfc2VnX2ZzOiBzZWwgPSByZWFkX3NyZWcoZnMpOyAg YnJlYWs7CisgICAgICAgIGNhc2UgeDg2X3NlZ19nczogc2VsID0gcmVhZF9zcmVnKGdzKTsgIGJy ZWFrOworICAgICAgICBjYXNlIHg4Nl9zZWdfc3M6IHNlbCA9IGN0eHQtPnJlZ3MtPnNzOyBicmVh azsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOworICAgICAg ICB9CisKKyAgICAgICAgaWYgKCAhcmVhZF9kZXNjcmlwdG9yKHNlbCwgY3VycmVudCwgJnJlZy0+ YmFzZSwgJmxpbWl0LCAmYXIsIDApICkKKyAgICAgICAgICAgIHJldHVybiBYODZFTVVMX1VOSEFO RExFQUJMRTsKKworICAgICAgICByZWctPmxpbWl0ID0gbGltaXQ7CisgICAgICAgIHJlZy0+YXR0 ci5ieXRlcyA9IGFyID4+IDg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN3aXRj aCAoIHNlZyApCisgICAgICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICgg IWlzX3g4Nl91c2VyX3NlZ21lbnQoc2VnKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIFg4NkVN VUxfVU5IQU5ETEVBQkxFOworICAgICAgICAgICAgcmVnLT5iYXNlID0gMDsKKyAgICAgICAgICAg IGJyZWFrOworICAgICAgICBjYXNlIHg4Nl9zZWdfZnM6CisgICAgICAgICAgICByZWctPmJhc2Ug PSByZGZzYmFzZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgeDg2X3NlZ19n czoKKyAgICAgICAgICAgIHJlZy0+YmFzZSA9IHJkZ3NiYXNlKCk7CisgICAgICAgICAgICBicmVh azsKKyAgICAgICAgfQorCisgICAgICAgIHJlZy0+bGltaXQgPSB+MFU7CisKKyAgICAgICAgcmVn LT5hdHRyLmJ5dGVzID0gMDsKKyAgICAgICAgcmVnLT5hdHRyLmZpZWxkcy50eXBlID0gX1NFR01F TlRfV1IgPj4gODsKKyAgICAgICAgaWYgKCBzZWcgPT0geDg2X3NlZ19jcyApCisgICAgICAgIHsK KyAgICAgICAgICAgIHJlZy0+YXR0ci5maWVsZHMudHlwZSB8PSBfU0VHTUVOVF9DT0RFID4+IDg7 CisgICAgICAgICAgICByZWctPmF0dHIuZmllbGRzLmwgPSAxOworICAgICAgICB9CisgICAgICAg IGVsc2UKKyAgICAgICAgICAgIHJlZy0+YXR0ci5maWVsZHMuZGIgPSAxOworICAgICAgICByZWct PmF0dHIuZmllbGRzLnMgICA9IDE7CisgICAgICAgIHJlZy0+YXR0ci5maWVsZHMuZHBsID0gMzsK KyAgICAgICAgcmVnLT5hdHRyLmZpZWxkcy5wICAgPSAxOworICAgICAgICByZWctPmF0dHIuZmll bGRzLmcgICA9IDE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgeDg2X2VtdWxhdGUuYydz IG1vZGVfcmluZzAoKSB0byB3b3JrLCBmYWtlIGEgRFBMIG9mIHplcm8uCisgICAgICogQWxzbyBk byB0aGlzIGZvciBjb25zaXN0ZW5jeSBmb3Igbm9uLWNvbmZvcm1pbmcgY29kZSBzZWdtZW50cy4K KyAgICAgKi8KKyAgICBpZiAoIChzZWcgPT0geDg2X3NlZ19zcyB8fAorICAgICAgICAgIChzZWcg PT0geDg2X3NlZ19jcyAmJgorICAgICAgICAgICAhKHJlZy0+YXR0ci5maWVsZHMudHlwZSAmIChf U0VHTUVOVF9FQyA+PiA4KSkpKSAmJgorICAgICAgICAgZ3Vlc3Rfa2VybmVsX21vZGUoY3VycmVu dCwgY3R4dC0+cmVncykgKQorICAgICAgICByZWctPmF0dHIuZmllbGRzLmRwbCA9IDA7CisKKyAg ICByZXR1cm4gWDg2RU1VTF9PS0FZOworfQorCisvKiBQZXJmb3JtIElPUEwgY2hlY2sgYmV0d2Vl biB0aGUgdmNwdSdzIHNoYWRvd2VkIElPUEwsIGFuZCB0aGUgYXNzdW1lZCBjcGwuICovCitzdGF0 aWMgYm9vbF90IGlvcGxfb2soY29uc3Qgc3RydWN0IHZjcHUgKnYsIGNvbnN0IHN0cnVjdCBjcHVf dXNlcl9yZWdzICpyZWdzKQoreworICAgIHVuc2lnbmVkIGludCBjcGwgPSBndWVzdF9rZXJuZWxf bW9kZSh2LCByZWdzKSA/CisgICAgICAgIChWTV9BU1NJU1Qodi0+ZG9tYWluLCBhcmNoaXRlY3R1 cmFsX2lvcGwpID8gMCA6IDEpIDogMzsKKworICAgIEFTU0VSVCgodi0+YXJjaC5wdl92Y3B1Lmlv cGwgJiB+WDg2X0VGTEFHU19JT1BMKSA9PSAwKTsKKworICAgIHJldHVybiBJT1BMKGNwbCkgPD0g di0+YXJjaC5wdl92Y3B1LmlvcGw7Cit9CisKK3N0YXRpYyBpb19lbXVsX3N0dWJfdCAqaW9fZW11 bF9zdHViX3NldHVwKHN0cnVjdCBwcml2X29wX2N0eHQgKmN0eHQsIHU4IG9wY29kZSwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3J0LCB1 bnNpZ25lZCBpbnQgYnl0ZXMpCit7CisgICAgaWYgKCAhY3R4dC0+aW9fZW11bF9zdHViICkKKyAg ICAgICAgY3R4dC0+aW9fZW11bF9zdHViID0gbWFwX2RvbWFpbl9wYWdlKF9tZm4odGhpc19jcHUo c3R1YnMubWZuKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICh0aGlzX2NwdShzdHVicy5hZGRyKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgflBBR0VfTUFTSykgKworICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgU1RVQl9CVUZfU0laRSAvIDI7CisKKyAgICAvKiBtb3ZxICRo b3N0X3RvX2d1ZXN0X2dwcl9zd2l0Y2gsJXJjeCAqLworICAgIGN0eHQtPmlvX2VtdWxfc3R1Ylsw XSA9IDB4NDg7CisgICAgY3R4dC0+aW9fZW11bF9zdHViWzFdID0gMHhiOTsKKyAgICAqKHZvaWQg KiopJmN0eHQtPmlvX2VtdWxfc3R1YlsyXSA9ICh2b2lkICopaG9zdF90b19ndWVzdF9ncHJfc3dp dGNoOworICAgIC8qIGNhbGxxIColcmN4ICovCisgICAgY3R4dC0+aW9fZW11bF9zdHViWzEwXSA9 IDB4ZmY7CisgICAgY3R4dC0+aW9fZW11bF9zdHViWzExXSA9IDB4ZDE7CisgICAgLyogZGF0YTE2 IG9yIG5vcCAqLworICAgIGN0eHQtPmlvX2VtdWxfc3R1YlsxMl0gPSAoYnl0ZXMgIT0gMikgPyAw eDkwIDogMHg2NjsKKyAgICAvKiA8aW8tYWNjZXNzIG9wY29kZT4gKi8KKyAgICBjdHh0LT5pb19l bXVsX3N0dWJbMTNdID0gb3Bjb2RlOworICAgIC8qIGltbTggb3Igbm9wICovCisgICAgY3R4dC0+ aW9fZW11bF9zdHViWzE0XSA9ICEob3Bjb2RlICYgOCkgPyBwb3J0IDogMHg5MDsKKyAgICAvKiBy ZXQgKGp1bXBzIHRvIGd1ZXN0X3RvX2hvc3RfZ3ByX3N3aXRjaCkgKi8KKyAgICBjdHh0LT5pb19l bXVsX3N0dWJbMTVdID0gMHhjMzsKKyAgICBCVUlMRF9CVUdfT04oU1RVQl9CVUZfU0laRSAvIDIg PCAxNik7CisKKyAgICBpZiAoIGlvZW11bF9oYW5kbGVfcXVpcmsgKQorICAgICAgICBpb2VtdWxf aGFuZGxlX3F1aXJrKG9wY29kZSwgJmN0eHQtPmlvX2VtdWxfc3R1YlsxMl0sIGN0eHQtPmN0eHQu cmVncyk7CisKKyAgICAvKiBIYW5keSBmdW5jdGlvbi10eXBlZCBwb2ludGVyIHRvIHRoZSBzdHVi LiAqLworICAgIHJldHVybiAodm9pZCAqKSh0aGlzX2NwdShzdHVicy5hZGRyKSArIFNUVUJfQlVG X1NJWkUgLyAyKTsKK30KKworLyogSGFzIHRoZSBndWVzdCByZXF1ZXN0ZWQgc3VmZmljaWVudCBw ZXJtaXNzaW9uIGZvciB0aGlzIEkvTyBhY2Nlc3M/ICovCitzdGF0aWMgaW50IGd1ZXN0X2lvX29r YXkoCisgICAgdW5zaWduZWQgaW50IHBvcnQsIHVuc2lnbmVkIGludCBieXRlcywKKyAgICBzdHJ1 Y3QgdmNwdSAqdiwgc3RydWN0IGNwdV91c2VyX3JlZ3MgKnJlZ3MpCit7CisgICAgLyogSWYgaW4g dXNlciBtb2RlLCBzd2l0Y2ggdG8ga2VybmVsIG1vZGUganVzdCB0byByZWFkIEkvTyBiaXRtYXAu ICovCisgICAgaW50IHVzZXJfbW9kZSA9ICEodi0+YXJjaC5mbGFncyAmIFRGX2tlcm5lbF9tb2Rl KTsKKyNkZWZpbmUgVE9HR0xFX01PREUoKSBpZiAoIHVzZXJfbW9kZSApIHRvZ2dsZV9ndWVzdF9t b2RlKHYpCisKKyAgICBpZiAoIGlvcGxfb2sodiwgcmVncykgKQorICAgICAgICByZXR1cm4gMTsK KworICAgIGlmICggdi0+YXJjaC5wdl92Y3B1LmlvYm1wX2xpbWl0ID4gKHBvcnQgKyBieXRlcykg KQorICAgIHsKKyAgICAgICAgdW5pb24geyB1aW50OF90IGJ5dGVzWzJdOyB1aW50MTZfdCBtYXNr OyB9IHg7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR3JhYiBwZXJtaXNzaW9uIGJ5dGVzIGZy b20gZ3Vlc3Qgc3BhY2UuIEluYWNjZXNzaWJsZSBieXRlcyBhcmUKKyAgICAgICAgICogcmVhZCBh cyAweGZmIChubyBhY2Nlc3MgYWxsb3dlZCkuCisgICAgICAgICAqLworICAgICAgICBUT0dHTEVf TU9ERSgpOworICAgICAgICBzd2l0Y2ggKCBfX2NvcHlfZnJvbV9ndWVzdF9vZmZzZXQoeC5ieXRl cywgdi0+YXJjaC5wdl92Y3B1LmlvYm1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcG9ydD4+MywgMikgKQorICAgICAgICB7CisgICAgICAgIGRlZmF1bHQ6IHgu Ynl0ZXNbMF0gPSB+MDsKKyAgICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgICAgIGNh c2UgMTogIHguYnl0ZXNbMV0gPSB+MDsKKyAgICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovCisg ICAgICAgIGNhc2UgMDogIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFRPR0dMRV9NT0RFKCk7 CisKKyAgICAgICAgaWYgKCAoeC5tYXNrICYgKCgoMTw8Ynl0ZXMpLTEpIDw8IChwb3J0JjcpKSkg PT0gMCApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30K Kworc3RhdGljIHVuc2lnbmVkIGludCBjaGVja19ndWVzdF9pb19icmVha3BvaW50KHN0cnVjdCB2 Y3B1ICp2LAorICAgIHVuc2lnbmVkIGludCBwb3J0LCB1bnNpZ25lZCBpbnQgbGVuKQoreworICAg IHVuc2lnbmVkIGludCB3aWR0aCwgaSwgbWF0Y2ggPSAwOworICAgIHVuc2lnbmVkIGxvbmcgc3Rh cnQ7CisKKyAgICBpZiAoICEodi0+YXJjaC5kZWJ1Z3JlZ1s1XSkgfHwKKyAgICAgICAgICEodi0+ YXJjaC5wdl92Y3B1LmN0cmxyZWdbNF0gJiBYODZfQ1I0X0RFKSApCisgICAgICAgIHJldHVybiAw OworCisgICAgZm9yICggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCAh KHYtPmFyY2guZGVidWdyZWdbNV0gJgorICAgICAgICAgICAgICAgKDMgPDwgKGkgKiBEUl9FTkFC TEVfU0laRSkpKSApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzdGFydCA9IHYt PmFyY2guZGVidWdyZWdbaV07CisgICAgICAgIHdpZHRoID0gMDsKKworICAgICAgICBzd2l0Y2gg KCAodi0+YXJjaC5kZWJ1Z3JlZ1s3XSA+PgorICAgICAgICAgICAgICAgICAgKERSX0NPTlRST0xf U0hJRlQgKyBpICogRFJfQ09OVFJPTF9TSVpFKSkgJiAweGMgKQorICAgICAgICB7CisgICAgICAg IGNhc2UgRFJfTEVOXzE6IHdpZHRoID0gMTsgYnJlYWs7CisgICAgICAgIGNhc2UgRFJfTEVOXzI6 IHdpZHRoID0gMjsgYnJlYWs7CisgICAgICAgIGNhc2UgRFJfTEVOXzQ6IHdpZHRoID0gNDsgYnJl YWs7CisgICAgICAgIGNhc2UgRFJfTEVOXzg6IHdpZHRoID0gODsgYnJlYWs7CisgICAgICAgIH0K KworICAgICAgICBpZiAoIChzdGFydCA8IChwb3J0ICsgbGVuKSkgJiYgKChzdGFydCArIHdpZHRo KSA+IHBvcnQpICkKKyAgICAgICAgICAgIG1hdGNoIHw9IDEgPDwgaTsKKyAgICB9CisKKyAgICBy ZXR1cm4gbWF0Y2g7Cit9CisKKy8qIEhhcyB0aGUgYWRtaW5pc3RyYXRvciBncmFudGVkIHN1ZmZp Y2llbnQgcGVybWlzc2lvbiBmb3IgdGhpcyBJL08gYWNjZXNzPyAqLworc3RhdGljIGJvb2xfdCBh ZG1pbl9pb19va2F5KHVuc2lnbmVkIGludCBwb3J0LCB1bnNpZ25lZCBpbnQgYnl0ZXMsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGRvbWFpbiAqZCkKK3sKKyAgICAv KgorICAgICAqIFBvcnQgMHhjZjggKENPTkZJR19BRERSRVNTKSBpcyBvbmx5IHZpc2libGUgZm9y IERXT1JEIGFjY2Vzc2VzLgorICAgICAqIFdlIG5ldmVyIHBlcm1pdCBkaXJlY3QgYWNjZXNzIHRv IHRoYXQgcmVnaXN0ZXIuCisgICAgICovCisgICAgaWYgKCAocG9ydCA9PSAweGNmOCkgJiYgKGJ5 dGVzID09IDQpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBXZSBhbHNvIG5ldmVyIHBl cm1pdCBkaXJlY3QgYWNjZXNzIHRvIHRoZSBSVEMvQ01PUyByZWdpc3RlcnMuICovCisgICAgaWYg KCAoKHBvcnQgJiB+MSkgPT0gUlRDX1BPUlQoMCkpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg ICByZXR1cm4gaW9wb3J0c19hY2Nlc3NfcGVybWl0dGVkKGQsIHBvcnQsIHBvcnQgKyBieXRlcyAt IDEpOworfQorCitzdGF0aWMgYm9vbF90IHBjaV9jZmdfb2soc3RydWN0IGRvbWFpbiAqY3VycmQs IHVuc2lnbmVkIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBp bnQgc2l6ZSwgdWludDMyX3QgKndyaXRlKQoreworICAgIHVpbnQzMl90IG1hY2hpbmVfYmRmOwor CisgICAgaWYgKCAhaXNfaGFyZHdhcmVfZG9tYWluKGN1cnJkKSApCisgICAgICAgIHJldHVybiAw OworCisgICAgaWYgKCAhQ0Y4X0VOQUJMRUQoY3VycmQtPmFyY2gucGNpX2NmOCkgKQorICAgICAg ICByZXR1cm4gMTsKKworICAgIG1hY2hpbmVfYmRmID0gQ0Y4X0JERihjdXJyZC0+YXJjaC5wY2lf Y2Y4KTsKKyAgICBpZiAoIHdyaXRlICkKKyAgICB7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxv bmcgKnJvX21hcCA9IHBjaV9nZXRfcm9fbWFwKDApOworCisgICAgICAgIGlmICggcm9fbWFwICYm IHRlc3RfYml0KG1hY2hpbmVfYmRmLCByb19tYXApICkKKyAgICAgICAgICAgIHJldHVybiAwOwor ICAgIH0KKyAgICBzdGFydCB8PSBDRjhfQUREUl9MTyhjdXJyZC0+YXJjaC5wY2lfY2Y4KTsKKyAg ICAvKiBBTUQgZXh0ZW5kZWQgY29uZmlndXJhdGlvbiBzcGFjZSBhY2Nlc3M/ICovCisgICAgaWYg KCBDRjhfQUREUl9ISShjdXJyZC0+YXJjaC5wY2lfY2Y4KSAmJgorICAgICAgICAgYm9vdF9jcHVf ZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EICYmCisgICAgICAgICBib290X2NwdV9k YXRhLng4NiA+PSAweDEwICYmIGJvb3RfY3B1X2RhdGEueDg2IDw9IDB4MTcgKQorICAgIHsKKyAg ICAgICAgdWludDY0X3QgbXNyX3ZhbDsKKworICAgICAgICBpZiAoIHJkbXNyX3NhZmUoTVNSX0FN RDY0X05CX0NGRywgbXNyX3ZhbCkgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlm ICggbXNyX3ZhbCAmICgxVUxMIDw8IEFNRDY0X05CX0NGR19DRjhfRVhUX0VOQUJMRV9CSVQpICkK KyAgICAgICAgICAgIHN0YXJ0IHw9IENGOF9BRERSX0hJKGN1cnJkLT5hcmNoLnBjaV9jZjgpOwor ICAgIH0KKworICAgIHJldHVybiAhd3JpdGUgPworICAgICAgICAgICB4c21fcGNpX2NvbmZpZ19w ZXJtaXNzaW9uKFhTTV9IT09LLCBjdXJyZCwgbWFjaGluZV9iZGYsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIHN0YXJ0ICsgc2l6ZSAtIDEsIDApID09IDAgOgor ICAgICAgICAgICBwY2lfY29uZl93cml0ZV9pbnRlcmNlcHQoMCwgbWFjaGluZV9iZGYsIHN0YXJ0 LCBzaXplLCB3cml0ZSkgPj0gMDsKK30KKwordWludDMyX3QgZ3Vlc3RfaW9fcmVhZCh1bnNpZ25l ZCBpbnQgcG9ydCwgdW5zaWduZWQgaW50IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICBz dHJ1Y3QgZG9tYWluICpjdXJyZCkKK3sKKyAgICB1aW50MzJfdCBkYXRhID0gMDsKKyAgICB1bnNp Z25lZCBpbnQgc2hpZnQgPSAwOworCisgICAgaWYgKCBhZG1pbl9pb19va2F5KHBvcnQsIGJ5dGVz LCBjdXJyZCkgKQorICAgIHsKKyAgICAgICAgc3dpdGNoICggYnl0ZXMgKQorICAgICAgICB7Cisg ICAgICAgIGNhc2UgMTogcmV0dXJuIGluYihwb3J0KTsKKyAgICAgICAgY2FzZSAyOiByZXR1cm4g aW53KHBvcnQpOworICAgICAgICBjYXNlIDQ6IHJldHVybiBpbmwocG9ydCk7CisgICAgICAgIH0K KyAgICB9CisKKyAgICB3aGlsZSAoIGJ5dGVzICE9IDAgKQorICAgIHsKKyAgICAgICAgdW5zaWdu ZWQgaW50IHNpemUgPSAxOworICAgICAgICB1aW50MzJfdCBzdWJfZGF0YSA9IH4wOworCisgICAg ICAgIGlmICggKHBvcnQgPT0gMHg0MikgfHwgKHBvcnQgPT0gMHg0MykgfHwgKHBvcnQgPT0gMHg2 MSkgKQorICAgICAgICB7CisgICAgICAgICAgICBzdWJfZGF0YSA9IHB2X3BpdF9oYW5kbGVyKHBv cnQsIDAsIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBwb3J0ID09IFJUQ19QT1JU KDApICkKKyAgICAgICAgeworICAgICAgICAgICAgc3ViX2RhdGEgPSBjdXJyZC0+YXJjaC5jbW9z X2lkeDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggKHBvcnQgPT0gUlRDX1BPUlQoMSkp ICYmCisgICAgICAgICAgICAgICAgICBpb3BvcnRzX2FjY2Vzc19wZXJtaXR0ZWQoY3VycmQsIFJU Q19QT1JUKDApLCBSVENfUE9SVCgxKSkgKQorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25l ZCBsb25nIGZsYWdzOworCisgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ss IGZsYWdzKTsKKyAgICAgICAgICAgIG91dGIoY3VycmQtPmFyY2guY21vc19pZHggJiAweDdmLCBS VENfUE9SVCgwKSk7CisgICAgICAgICAgICBzdWJfZGF0YSA9IGluYihSVENfUE9SVCgxKSk7Cisg ICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworICAg ICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAocG9ydCA9PSAweGNmOCkgJiYgKGJ5dGVzID09IDQp ICkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZSA9IDQ7CisgICAgICAgICAgICBzdWJfZGF0 YSA9IGN1cnJkLT5hcmNoLnBjaV9jZjg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChw b3J0ICYgMHhmZmZjKSA9PSAweGNmYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUgPSBt aW4oYnl0ZXMsIDQgLSAocG9ydCAmIDMpKTsKKyAgICAgICAgICAgIGlmICggc2l6ZSA9PSAzICkK KyAgICAgICAgICAgICAgICBzaXplID0gMjsKKyAgICAgICAgICAgIGlmICggcGNpX2NmZ19vayhj dXJyZCwgcG9ydCAmIDMsIHNpemUsIE5VTEwpICkKKyAgICAgICAgICAgICAgICBzdWJfZGF0YSA9 IHBjaV9jb25mX3JlYWQoY3VycmQtPmFyY2gucGNpX2NmOCwgcG9ydCAmIDMsIHNpemUpOworICAg ICAgICB9CisKKyAgICAgICAgaWYgKCBzaXplID09IDQgKQorICAgICAgICAgICAgcmV0dXJuIHN1 Yl9kYXRhOworCisgICAgICAgIGRhdGEgfD0gKHN1Yl9kYXRhICYgKCgxdSA8PCAoc2l6ZSAqIDgp KSAtIDEpKSA8PCBzaGlmdDsKKyAgICAgICAgc2hpZnQgKz0gc2l6ZSAqIDg7CisgICAgICAgIHBv cnQgKz0gc2l6ZTsKKyAgICAgICAgYnl0ZXMgLT0gc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4g ZGF0YTsKK30KKwordm9pZCBndWVzdF9pb193cml0ZSh1bnNpZ25lZCBpbnQgcG9ydCwgdW5zaWdu ZWQgaW50IGJ5dGVzLCB1aW50MzJfdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qg ZG9tYWluICpjdXJyZCkKK3sKKyAgICBpZiAoIGFkbWluX2lvX29rYXkocG9ydCwgYnl0ZXMsIGN1 cnJkKSApCisgICAgeworICAgICAgICBzd2l0Y2ggKCBieXRlcyApIHsKKyAgICAgICAgY2FzZSAx OgorICAgICAgICAgICAgb3V0YigodWludDhfdClkYXRhLCBwb3J0KTsKKyAgICAgICAgICAgIGlm ICggcHZfcG9zdF9vdXRiX2hvb2sgKQorICAgICAgICAgICAgICAgIHB2X3Bvc3Rfb3V0Yl9ob29r KHBvcnQsICh1aW50OF90KWRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug MjoKKyAgICAgICAgICAgIG91dHcoKHVpbnQxNl90KWRhdGEsIHBvcnQpOworICAgICAgICAgICAg YnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG91dGwoZGF0YSwgcG9ydCk7Cisg ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisg ICAgd2hpbGUgKCBieXRlcyAhPSAwICkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBzaXpl ID0gMTsKKworICAgICAgICBpZiAoIChwb3J0ID09IDB4NDIpIHx8IChwb3J0ID09IDB4NDMpIHx8 IChwb3J0ID09IDB4NjEpICkKKyAgICAgICAgeworICAgICAgICAgICAgcHZfcGl0X2hhbmRsZXIo cG9ydCwgKHVpbnQ4X3QpZGF0YSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHBv cnQgPT0gUlRDX1BPUlQoMCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyZC0+YXJjaC5j bW9zX2lkeCA9IGRhdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChwb3J0ID09IFJU Q19QT1JUKDEpKSAmJgorICAgICAgICAgICAgICAgICAgaW9wb3J0c19hY2Nlc3NfcGVybWl0dGVk KGN1cnJkLCBSVENfUE9SVCgwKSwgUlRDX1BPUlQoMSkpICkKKyAgICAgICAgeworICAgICAgICAg ICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICAgICAgaWYgKCBwdl9ydGNfaGFuZGxl ciApCisgICAgICAgICAgICAgICAgcHZfcnRjX2hhbmRsZXIoY3VycmQtPmFyY2guY21vc19pZHgg JiAweDdmLCBkYXRhKTsKKyAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywg ZmxhZ3MpOworICAgICAgICAgICAgb3V0YihjdXJyZC0+YXJjaC5jbW9zX2lkeCAmIDB4N2YsIFJU Q19QT1JUKDApKTsKKyAgICAgICAgICAgIG91dGIoZGF0YSwgUlRDX1BPUlQoMSkpOworICAgICAg ICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKKyAgICAgICAg fQorICAgICAgICBlbHNlIGlmICggKHBvcnQgPT0gMHhjZjgpICYmIChieXRlcyA9PSA0KSApCisg ICAgICAgIHsKKyAgICAgICAgICAgIHNpemUgPSA0OworICAgICAgICAgICAgY3VycmQtPmFyY2gu cGNpX2NmOCA9IGRhdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChwb3J0ICYgMHhm ZmZjKSA9PSAweGNmYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUgPSBtaW4oYnl0ZXMs IDQgLSAocG9ydCAmIDMpKTsKKyAgICAgICAgICAgIGlmICggc2l6ZSA9PSAzICkKKyAgICAgICAg ICAgICAgICBzaXplID0gMjsKKyAgICAgICAgICAgIGlmICggcGNpX2NmZ19vayhjdXJyZCwgcG9y dCAmIDMsIHNpemUsICZkYXRhKSApCisgICAgICAgICAgICAgICAgcGNpX2NvbmZfd3JpdGUoY3Vy cmQtPmFyY2gucGNpX2NmOCwgcG9ydCAmIDMsIHNpemUsIGRhdGEpOworICAgICAgICB9CisKKyAg ICAgICAgaWYgKCBzaXplID09IDQgKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHBv cnQgKz0gc2l6ZTsKKyAgICAgICAgYnl0ZXMgLT0gc2l6ZTsKKyAgICAgICAgZGF0YSA+Pj0gc2l6 ZSAqIDg7CisgICAgfQorfQorCitzdGF0aWMgaW50IHByaXZfb3BfcmVhZF9pbyh1bnNpZ25lZCBp bnQgcG9ydCwgdW5zaWduZWQgaW50IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg dW5zaWduZWQgbG9uZyAqdmFsLCBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3sKKyAg ICBzdHJ1Y3QgcHJpdl9vcF9jdHh0ICpwb2MgPSBjb250YWluZXJfb2YoY3R4dCwgc3RydWN0IHBy aXZfb3BfY3R4dCwgY3R4dCk7CisgICAgc3RydWN0IHZjcHUgKmN1cnIgPSBjdXJyZW50OworICAg IHN0cnVjdCBkb21haW4gKmN1cnJkID0gY3VycmVudC0+ZG9tYWluOworCisgICAgLyogSU5TIG11 c3Qgbm90IGNvbWUgaGVyZS4gKi8KKyAgICBBU1NFUlQoKGN0eHQtPm9wY29kZSAmIH45KSA9PSAw eGU0KTsKKworICAgIGlmICggIWd1ZXN0X2lvX29rYXkocG9ydCwgYnl0ZXMsIGN1cnIsIGN0eHQt PnJlZ3MpICkKKyAgICAgICAgcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOworCisgICAgcG9j LT5icG1hdGNoID0gY2hlY2tfZ3Vlc3RfaW9fYnJlYWtwb2ludChjdXJyLCBwb3J0LCBieXRlcyk7 CisKKyAgICBpZiAoIGFkbWluX2lvX29rYXkocG9ydCwgYnl0ZXMsIGN1cnJkKSApCisgICAgewor ICAgICAgICBpb19lbXVsX3N0dWJfdCAqaW9fZW11bCA9CisgICAgICAgICAgICBpb19lbXVsX3N0 dWJfc2V0dXAocG9jLCBjdHh0LT5vcGNvZGUsIHBvcnQsIGJ5dGVzKTsKKworICAgICAgICBtYXJr X3JlZ3NfZGlydHkoY3R4dC0+cmVncyk7CisgICAgICAgIGlvX2VtdWwoY3R4dC0+cmVncyk7Cisg ICAgICAgIHJldHVybiBYODZFTVVMX0RPTkU7CisgICAgfQorCisgICAgKnZhbCA9IGd1ZXN0X2lv X3JlYWQocG9ydCwgYnl0ZXMsIGN1cnJkKTsKKworICAgIHJldHVybiBYODZFTVVMX09LQVk7Cit9 CisKK3N0YXRpYyBpbnQgcHJpdl9vcF93cml0ZV9pbyh1bnNpZ25lZCBpbnQgcG9ydCwgdW5zaWdu ZWQgaW50IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcg dmFsLCBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3sKKyAgICBzdHJ1Y3QgcHJpdl9v cF9jdHh0ICpwb2MgPSBjb250YWluZXJfb2YoY3R4dCwgc3RydWN0IHByaXZfb3BfY3R4dCwgY3R4 dCk7CisgICAgc3RydWN0IHZjcHUgKmN1cnIgPSBjdXJyZW50OworICAgIHN0cnVjdCBkb21haW4g KmN1cnJkID0gY3VycmVudC0+ZG9tYWluOworCisgICAgLyogT1VUUyBtdXN0IG5vdCBjb21lIGhl cmUuICovCisgICAgQVNTRVJUKChjdHh0LT5vcGNvZGUgJiB+OSkgPT0gMHhlNik7CisKKyAgICBp ZiAoICFndWVzdF9pb19va2F5KHBvcnQsIGJ5dGVzLCBjdXJyLCBjdHh0LT5yZWdzKSApCisgICAg ICAgIHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKKworICAgIHBvYy0+YnBtYXRjaCA9IGNo ZWNrX2d1ZXN0X2lvX2JyZWFrcG9pbnQoY3VyciwgcG9ydCwgYnl0ZXMpOworCisgICAgaWYgKCBh ZG1pbl9pb19va2F5KHBvcnQsIGJ5dGVzLCBjdXJyZCkgKQorICAgIHsKKyAgICAgICAgaW9fZW11 bF9zdHViX3QgKmlvX2VtdWwgPQorICAgICAgICAgICAgaW9fZW11bF9zdHViX3NldHVwKHBvYywg Y3R4dC0+b3Bjb2RlLCBwb3J0LCBieXRlcyk7CisKKyAgICAgICAgbWFya19yZWdzX2RpcnR5KGN0 eHQtPnJlZ3MpOworICAgICAgICBpb19lbXVsKGN0eHQtPnJlZ3MpOworICAgICAgICBpZiAoIChi eXRlcyA9PSAxKSAmJiBwdl9wb3N0X291dGJfaG9vayApCisgICAgICAgICAgICBwdl9wb3N0X291 dGJfaG9vayhwb3J0LCB2YWwpOworICAgICAgICByZXR1cm4gWDg2RU1VTF9ET05FOworICAgIH0K KworICAgIGd1ZXN0X2lvX3dyaXRlKHBvcnQsIGJ5dGVzLCB2YWwsIGN1cnJkKTsKKworICAgIHJl dHVybiBYODZFTVVMX09LQVk7Cit9CisKK3N0YXRpYyBpbnQgcHJpdl9vcF9yZXBfaW5zKHVpbnQx Nl90IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHg4Nl9zZWdtZW50IHNl ZywgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNp Z25lZCBpbnQgYnl0ZXNfcGVyX3JlcCwgdW5zaWduZWQgbG9uZyAqcmVwcywKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworICAgIHN0 cnVjdCBwcml2X29wX2N0eHQgKnBvYyA9IGNvbnRhaW5lcl9vZihjdHh0LCBzdHJ1Y3QgcHJpdl9v cF9jdHh0LCBjdHh0KTsKKyAgICBzdHJ1Y3QgdmNwdSAqY3VyciA9IGN1cnJlbnQ7CisgICAgc3Ry dWN0IGRvbWFpbiAqY3VycmQgPSBjdXJyZW50LT5kb21haW47CisgICAgdW5zaWduZWQgbG9uZyBn b2FsID0gKnJlcHM7CisgICAgc3RydWN0IHNlZ21lbnRfcmVnaXN0ZXIgc3JlZzsKKyAgICBpbnQg cmM7CisKKyAgICBBU1NFUlQoc2VnID09IHg4Nl9zZWdfZXMpOworCisgICAgKnJlcHMgPSAwOwor CisgICAgaWYgKCAhZ3Vlc3RfaW9fb2theShwb3J0LCBieXRlc19wZXJfcmVwLCBjdXJyLCBjdHh0 LT5yZWdzKSApCisgICAgICAgIHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKKworICAgIHJj ID0gcHJpdl9vcF9yZWFkX3NlZ21lbnQoeDg2X3NlZ19lcywgJnNyZWcsIGN0eHQpOworICAgIGlm ICggcmMgIT0gWDg2RU1VTF9PS0FZICkKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgaWYgKCAh c3JlZy5hdHRyLmZpZWxkcy5wICkKKyAgICAgICAgcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxF OworICAgIGlmICggIXNyZWcuYXR0ci5maWVsZHMucyB8fAorICAgICAgICAgKHNyZWcuYXR0ci5m aWVsZHMudHlwZSAmIChfU0VHTUVOVF9DT0RFID4+IDgpKSB8fAorICAgICAgICAgIShzcmVnLmF0 dHIuZmllbGRzLnR5cGUgJiAoX1NFR01FTlRfV1IgPj4gOCkpICkKKyAgICB7CisgICAgICAgIHg4 Nl9lbXVsX2h3X2V4Y2VwdGlvbihUUkFQX2dwX2ZhdWx0LCAwLCBjdHh0KTsKKyAgICAgICAgcmV0 dXJuIFg4NkVNVUxfRVhDRVBUSU9OOworICAgIH0KKworICAgIHBvYy0+YnBtYXRjaCA9IGNoZWNr X2d1ZXN0X2lvX2JyZWFrcG9pbnQoY3VyciwgcG9ydCwgYnl0ZXNfcGVyX3JlcCk7CisKKyAgICB3 aGlsZSAoICpyZXBzIDwgZ29hbCApCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgZGF0YSA9 IGd1ZXN0X2lvX3JlYWQocG9ydCwgYnl0ZXNfcGVyX3JlcCwgY3VycmQpOworICAgICAgICB1bnNp Z25lZCBsb25nIGFkZHI7CisKKyAgICAgICAgcmMgPSBwdl9lbXVsX3ZpcnRfdG9fbGluZWFyKHNy ZWcuYmFzZSwgb2Zmc2V0LCBieXRlc19wZXJfcmVwLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc3JlZy5saW1pdCwgeDg2X3NlZ19lcywgY3R4dCwgJmFkZHIpOworICAgICAg ICBpZiAoIHJjICE9IFg4NkVNVUxfT0tBWSApCisgICAgICAgICAgICByZXR1cm4gcmM7CisKKyAg ICAgICAgaWYgKCAocmMgPSBfX2NvcHlfdG9fdXNlcigodm9pZCAqKWFkZHIsICZkYXRhLCBieXRl c19wZXJfcmVwKSkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHg4Nl9lbXVsX3BhZ2Vm YXVsdChQRkVDX3dyaXRlX2FjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh ZGRyICsgYnl0ZXNfcGVyX3JlcCAtIHJjLCBjdHh0KTsKKyAgICAgICAgICAgIHJldHVybiBYODZF TVVMX0VYQ0VQVElPTjsKKyAgICAgICAgfQorCisgICAgICAgICsrKnJlcHM7CisKKyAgICAgICAg aWYgKCBwb2MtPmJwbWF0Y2ggfHwgaHlwZXJjYWxsX3ByZWVtcHRfY2hlY2soKSApCisgICAgICAg ICAgICBicmVhazsKKworICAgICAgICAvKiB4ODZfZW11bGF0ZSgpIGNsaXBzIHRoZSByZXBldGl0 aW9uIGNvdW50IHRvIGVuc3VyZSB3ZSBkb24ndCB3cmFwLiAqLworICAgICAgICBpZiAoIHVubGlr ZWx5KGN0eHQtPnJlZ3MtPmVmbGFncyAmIFg4Nl9FRkxBR1NfREYpICkKKyAgICAgICAgICAgIG9m ZnNldCAtPSBieXRlc19wZXJfcmVwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvZmZzZXQg Kz0gYnl0ZXNfcGVyX3JlcDsKKyAgICB9CisKKyAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworfQor CitzdGF0aWMgaW50IHByaXZfb3BfcmVwX291dHMoZW51bSB4ODZfc2VnbWVudCBzZWcsIHVuc2ln bmVkIGxvbmcgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBv cnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9y ZXAsIHVuc2lnbmVkIGxvbmcgKnJlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ry dWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisgICAgc3RydWN0IHByaXZfb3BfY3R4dCAq cG9jID0gY29udGFpbmVyX29mKGN0eHQsIHN0cnVjdCBwcml2X29wX2N0eHQsIGN0eHQpOworICAg IHN0cnVjdCB2Y3B1ICpjdXJyID0gY3VycmVudDsKKyAgICBzdHJ1Y3QgZG9tYWluICpjdXJyZCA9 IGN1cnJlbnQtPmRvbWFpbjsKKyAgICB1bnNpZ25lZCBsb25nIGdvYWwgPSAqcmVwczsKKyAgICBz dHJ1Y3Qgc2VnbWVudF9yZWdpc3RlciBzcmVnOworICAgIGludCByYzsKKworICAgICpyZXBzID0g MDsKKworICAgIGlmICggIWd1ZXN0X2lvX29rYXkocG9ydCwgYnl0ZXNfcGVyX3JlcCwgY3Vyciwg Y3R4dC0+cmVncykgKQorICAgICAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisKKyAg ICByYyA9IHByaXZfb3BfcmVhZF9zZWdtZW50KHNlZywgJnNyZWcsIGN0eHQpOworICAgIGlmICgg cmMgIT0gWDg2RU1VTF9PS0FZICkKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgaWYgKCAhc3Jl Zy5hdHRyLmZpZWxkcy5wICkKKyAgICAgICAgcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOwor ICAgIGlmICggIXNyZWcuYXR0ci5maWVsZHMucyB8fAorICAgICAgICAgKChzcmVnLmF0dHIuZmll bGRzLnR5cGUgJiAoX1NFR01FTlRfQ09ERSA+PiA4KSkgJiYKKyAgICAgICAgICAhKHNyZWcuYXR0 ci5maWVsZHMudHlwZSAmIChfU0VHTUVOVF9XUiA+PiA4KSkpICkKKyAgICB7CisgICAgICAgIHg4 Nl9lbXVsX2h3X2V4Y2VwdGlvbihzZWcgIT0geDg2X3NlZ19zcyA/IFRSQVBfZ3BfZmF1bHQKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVFJBUF9zdGFj a19lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGN0eHQpOworICAgICAg ICByZXR1cm4gWDg2RU1VTF9FWENFUFRJT047CisgICAgfQorCisgICAgcG9jLT5icG1hdGNoID0g Y2hlY2tfZ3Vlc3RfaW9fYnJlYWtwb2ludChjdXJyLCBwb3J0LCBieXRlc19wZXJfcmVwKTsKKwor ICAgIHdoaWxlICggKnJlcHMgPCBnb2FsICkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBk YXRhID0gMDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyOworCisgICAgICAgIHJjID0gcHZf ZW11bF92aXJ0X3RvX2xpbmVhcihzcmVnLmJhc2UsIG9mZnNldCwgYnl0ZXNfcGVyX3JlcCwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyZWcubGltaXQsIHNlZywgY3R4dCwg JmFkZHIpOworICAgICAgICBpZiAoIHJjICE9IFg4NkVNVUxfT0tBWSApCisgICAgICAgICAgICBy ZXR1cm4gcmM7CisKKyAgICAgICAgaWYgKCAocmMgPSBfX2NvcHlfZnJvbV91c2VyKCZkYXRhLCAo dm9pZCAqKWFkZHIsIGJ5dGVzX3Blcl9yZXApKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAg ICAgeDg2X2VtdWxfcGFnZWZhdWx0KDAsIGFkZHIgKyBieXRlc19wZXJfcmVwIC0gcmMsIGN0eHQp OworICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxfRVhDRVBUSU9OOworICAgICAgICB9CisKKyAg ICAgICAgZ3Vlc3RfaW9fd3JpdGUocG9ydCwgYnl0ZXNfcGVyX3JlcCwgZGF0YSwgY3VycmQpOwor CisgICAgICAgICsrKnJlcHM7CisKKyAgICAgICAgaWYgKCBwb2MtPmJwbWF0Y2ggfHwgaHlwZXJj YWxsX3ByZWVtcHRfY2hlY2soKSApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiB4 ODZfZW11bGF0ZSgpIGNsaXBzIHRoZSByZXBldGl0aW9uIGNvdW50IHRvIGVuc3VyZSB3ZSBkb24n dCB3cmFwLiAqLworICAgICAgICBpZiAoIHVubGlrZWx5KGN0eHQtPnJlZ3MtPmVmbGFncyAmIFg4 Nl9FRkxBR1NfREYpICkKKyAgICAgICAgICAgIG9mZnNldCAtPSBieXRlc19wZXJfcmVwOworICAg ICAgICBlbHNlCisgICAgICAgICAgICBvZmZzZXQgKz0gYnl0ZXNfcGVyX3JlcDsKKyAgICB9CisK KyAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworfQorCitzdGF0aWMgaW50IHByaXZfb3BfcmVhZF9j cih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nICp2YWwsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3sKKyAgICBjb25zdCBz dHJ1Y3QgdmNwdSAqY3VyciA9IGN1cnJlbnQ7CisKKyAgICBzd2l0Y2ggKCByZWcgKQorICAgIHsK KyAgICBjYXNlIDA6IC8qIFJlYWQgQ1IwICovCisgICAgICAgICp2YWwgPSAocmVhZF9jcjAoKSAm IH5YODZfQ1IwX1RTKSB8IGN1cnItPmFyY2gucHZfdmNwdS5jdHJscmVnWzBdOworICAgICAgICBy ZXR1cm4gWDg2RU1VTF9PS0FZOworCisgICAgY2FzZSAyOiAvKiBSZWFkIENSMiAqLworICAgIGNh c2UgNDogLyogUmVhZCBDUjQgKi8KKyAgICAgICAgKnZhbCA9IGN1cnItPmFyY2gucHZfdmNwdS5j dHJscmVnW3JlZ107CisgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7CisKKyAgICBjYXNlIDM6 IC8qIFJlYWQgQ1IzICovCisgICAgeworICAgICAgICBjb25zdCBzdHJ1Y3QgZG9tYWluICpjdXJy ZCA9IGN1cnItPmRvbWFpbjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBtZm47CisKKyAgICAgICAg aWYgKCAhaXNfcHZfMzJiaXRfZG9tYWluKGN1cnJkKSApCisgICAgICAgIHsKKyAgICAgICAgICAg IG1mbiA9IHBhZ2V0YWJsZV9nZXRfcGZuKGN1cnItPmFyY2guZ3Vlc3RfdGFibGUpOworICAgICAg ICAgICAgKnZhbCA9IHhlbl9wZm5fdG9fY3IzKG1mbl90b19nbWZuKGN1cnJkLCBtZm4pKTsKKyAg ICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGw0X3BnZW50cnlf dCAqcGw0ZSA9CisgICAgICAgICAgICAgICAgbWFwX2RvbWFpbl9wYWdlKF9tZm4ocGFnZXRhYmxl X2dldF9wZm4oY3Vyci0+YXJjaC5ndWVzdF90YWJsZSkpKTsKKworICAgICAgICAgICAgbWZuID0g bDRlX2dldF9wZm4oKnBsNGUpOworICAgICAgICAgICAgdW5tYXBfZG9tYWluX3BhZ2UocGw0ZSk7 CisgICAgICAgICAgICAqdmFsID0gY29tcGF0X3Bmbl90b19jcjMobWZuX3RvX2dtZm4oY3VycmQs IG1mbikpOworICAgICAgICB9CisgICAgICAgIC8qIFBUcyBzaG91bGQgbm90IGJlIHNoYXJlZCAq LworICAgICAgICBCVUdfT04ocGFnZV9nZXRfb3duZXIobWZuX3RvX3BhZ2UobWZuKSkgPT0gZG9t X2Nvdyk7CisgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7CisgICAgfQorICAgIH0KKworICAg IHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKK30KKworc3RhdGljIGludCBwcml2X29wX3dy aXRlX2NyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgdmFsLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworICAgIHN0 cnVjdCB2Y3B1ICpjdXJyID0gY3VycmVudDsKKworICAgIHN3aXRjaCAoIHJlZyApCisgICAgewor ICAgIGNhc2UgMDogLyogV3JpdGUgQ1IwICovCisgICAgICAgIGlmICggKHZhbCBeIHJlYWRfY3Iw KCkpICYgflg4Nl9DUjBfVFMgKQorICAgICAgICB7CisgICAgICAgICAgICBnZHByaW50ayhYRU5M T0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gY2hhbmdlIHVubW9k aWZpYWJsZSBDUjAgZmxhZ3NcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg ICAgICAgZG9fZnB1X3Rhc2tzd2l0Y2goISEodmFsICYgWDg2X0NSMF9UUykpOworICAgICAgICBy ZXR1cm4gWDg2RU1VTF9PS0FZOworCisgICAgY2FzZSAyOiAvKiBXcml0ZSBDUjIgKi8KKyAgICAg ICAgY3Vyci0+YXJjaC5wdl92Y3B1LmN0cmxyZWdbMl0gPSB2YWw7CisgICAgICAgIGFyY2hfc2V0 X2NyMihjdXJyLCB2YWwpOworICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworCisgICAgY2Fz ZSAzOiAvKiBXcml0ZSBDUjMgKi8KKyAgICB7CisgICAgICAgIHN0cnVjdCBkb21haW4gKmN1cnJk ID0gY3Vyci0+ZG9tYWluOworICAgICAgICB1bnNpZ25lZCBsb25nIGdmbjsKKyAgICAgICAgc3Ry dWN0IHBhZ2VfaW5mbyAqcGFnZTsKKyAgICAgICAgaW50IHJjOworCisgICAgICAgIGdmbiA9ICFp c19wdl8zMmJpdF9kb21haW4oY3VycmQpCisgICAgICAgICAgICAgID8geGVuX2NyM190b19wZm4o dmFsKSA6IGNvbXBhdF9jcjNfdG9fcGZuKHZhbCk7CisgICAgICAgIHBhZ2UgPSBnZXRfcGFnZV9m cm9tX2dmbihjdXJyZCwgZ2ZuLCBOVUxMLCBQMk1fQUxMT0MpOworICAgICAgICBpZiAoICFwYWdl ICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICByYyA9IG5ld19ndWVzdF9jcjMocGFnZV90 b19tZm4ocGFnZSkpOworICAgICAgICBwdXRfcGFnZShwYWdlKTsKKworICAgICAgICBzd2l0Y2gg KCByYyApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcmV0dXJuIFg4 NkVNVUxfT0tBWTsKKyAgICAgICAgY2FzZSAtRVJFU1RBUlQ6IC8qIHJldHJ5IGFmdGVyIHByZWVt cHRpb24gKi8KKyAgICAgICAgICAgIHJldHVybiBYODZFTVVMX1JFVFJZOworICAgICAgICB9Cisg ICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgNDogLyogV3JpdGUgQ1I0ICovCisgICAg ICAgIGN1cnItPmFyY2gucHZfdmNwdS5jdHJscmVnWzRdID0gcHZfZ3Vlc3RfY3I0X2ZpeHVwKGN1 cnIsIHZhbCk7CisgICAgICAgIHdyaXRlX2NyNChwdl9ndWVzdF9jcjRfdG9fcmVhbF9jcjQoY3Vy cikpOworICAgICAgICBjdHh0X3N3aXRjaF9sZXZlbGxpbmcoY3Vycik7CisgICAgICAgIHJldHVy biBYODZFTVVMX09LQVk7CisgICAgfQorCisgICAgcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxF OworfQorCitzdGF0aWMgaW50IHByaXZfb3BfcmVhZF9kcih1bnNpZ25lZCBpbnQgcmVnLCB1bnNp Z25lZCBsb25nICp2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgeDg2X2Vt dWxhdGVfY3R4dCAqY3R4dCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHJlcyA9IGRvX2dldF9kZWJ1 Z3JlZyhyZWcpOworCisgICAgaWYgKCBJU19FUlJfVkFMVUUocmVzKSApCisgICAgICAgIHJldHVy biBYODZFTVVMX1VOSEFORExFQUJMRTsKKworICAgICp2YWwgPSByZXM7CisKKyAgICByZXR1cm4g WDg2RU1VTF9PS0FZOworfQorCitzdGF0aWMgaW50IHByaXZfb3Bfd3JpdGVfZHIodW5zaWduZWQg aW50IHJlZywgdW5zaWduZWQgbG9uZyB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisgICAgcmV0dXJuIGRvX3NldF9kZWJ1 Z3JlZyhyZWcsIHZhbCkgPT0gMAorICAgICAgICAgICA/IFg4NkVNVUxfT0tBWSA6IFg4NkVNVUxf VU5IQU5ETEVBQkxFOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGd1ZXN0X21pc2NfZW5h YmxlKHVpbnQ2NF90IHZhbCkKK3sKKyAgICB2YWwgJj0gfihNU1JfSUEzMl9NSVNDX0VOQUJMRV9Q RVJGX0FWQUlMIHwKKyAgICAgICAgICAgICBNU1JfSUEzMl9NSVNDX0VOQUJMRV9NT05JVE9SX0VO QUJMRSk7CisgICAgdmFsIHw9IE1TUl9JQTMyX01JU0NfRU5BQkxFX0JUU19VTkFWQUlMIHwKKyAg ICAgICAgICAgTVNSX0lBMzJfTUlTQ19FTkFCTEVfUEVCU19VTkFWQUlMIHwKKyAgICAgICAgICAg TVNSX0lBMzJfTUlTQ19FTkFCTEVfWFRQUl9ESVNBQkxFOworICAgIHJldHVybiB2YWw7Cit9CisK K3N0YXRpYyBpbmxpbmUgYm9vbCBpc19jcHVmcmVxX2NvbnRyb2xsZXIoY29uc3Qgc3RydWN0IGRv bWFpbiAqZCkKK3sKKyAgICByZXR1cm4gKChjcHVmcmVxX2NvbnRyb2xsZXIgPT0gRlJFUUNUTF9k b20wX2tlcm5lbCkgJiYKKyAgICAgICAgICAgIGlzX2hhcmR3YXJlX2RvbWFpbihkKSk7Cit9CisK K3N0YXRpYyBpbnQgcHJpdl9vcF9yZWFkX21zcih1bnNpZ25lZCBpbnQgcmVnLCB1aW50NjRfdCAq dmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0 ICpjdHh0KQoreworICAgIHN0cnVjdCBwcml2X29wX2N0eHQgKnBvYyA9IGNvbnRhaW5lcl9vZihj dHh0LCBzdHJ1Y3QgcHJpdl9vcF9jdHh0LCBjdHh0KTsKKyAgICBjb25zdCBzdHJ1Y3QgdmNwdSAq Y3VyciA9IGN1cnJlbnQ7CisgICAgY29uc3Qgc3RydWN0IGRvbWFpbiAqY3VycmQgPSBjdXJyLT5k b21haW47CisgICAgYm9vbCB2cG11X21zciA9IGZhbHNlOworCisgICAgc3dpdGNoICggcmVnICkK KyAgICB7CisgICAgICAgIGludCByYzsKKworICAgIGNhc2UgTVNSX0ZTX0JBU0U6CisgICAgICAg IGlmICggaXNfcHZfMzJiaXRfZG9tYWluKGN1cnJkKSApCisgICAgICAgICAgICBicmVhazsKKyAg ICAgICAgKnZhbCA9IGNwdV9oYXNfZnNnc2Jhc2UgPyBfX3JkZnNiYXNlKCkgOiBjdXJyLT5hcmNo LnB2X3ZjcHUuZnNfYmFzZTsKKyAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKKworICAgIGNh c2UgTVNSX0dTX0JBU0U6CisgICAgICAgIGlmICggaXNfcHZfMzJiaXRfZG9tYWluKGN1cnJkKSAp CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKnZhbCA9IGNwdV9oYXNfZnNnc2Jhc2UgPyBf X3JkZ3NiYXNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyLT5hcmNo LnB2X3ZjcHUuZ3NfYmFzZV9rZXJuZWw7CisgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7CisK KyAgICBjYXNlIE1TUl9TSEFET1dfR1NfQkFTRToKKyAgICAgICAgaWYgKCBpc19wdl8zMmJpdF9k b21haW4oY3VycmQpICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAqdmFsID0gY3Vyci0+ YXJjaC5wdl92Y3B1LmdzX2Jhc2VfdXNlcjsKKyAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsK KworICAgIC8qCisgICAgICogSW4gb3JkZXIgdG8gZnVsbHkgcmV0YWluIG9yaWdpbmFsIGJlaGF2 aW9yLCBkZWZlciBjYWxsaW5nCisgICAgICogcHZfc29mdF9yZHRzYygpIHVudGlsIGFmdGVyIGVt dWxhdGlvbi4gVGhpcyBtYXkgd2FudC9uZWVkIHRvIGJlCisgICAgICogcmVjb25zaWRlcmVkLgor ICAgICAqLworICAgIGNhc2UgTVNSX0lBMzJfVFNDOgorICAgICAgICBwb2MtPnRzYyB8PSBUU0Nf QkFTRTsKKyAgICAgICAgZ290byBub3JtYWw7CisKKyAgICBjYXNlIE1TUl9UU0NfQVVYOgorICAg ICAgICBwb2MtPnRzYyB8PSBUU0NfQVVYOworICAgICAgICBpZiAoIGNwdV9oYXNfcmR0c2NwICkK KyAgICAgICAgICAgIGdvdG8gbm9ybWFsOworICAgICAgICAqdmFsID0gMDsKKyAgICAgICAgcmV0 dXJuIFg4NkVNVUxfT0tBWTsKKworICAgIGNhc2UgTVNSX0VGRVI6CisgICAgICAgICp2YWwgPSBy ZWFkX2VmZXIoKTsKKyAgICAgICAgaWYgKCBpc19wdl8zMmJpdF9kb21haW4oY3VycmQpICkKKyAg ICAgICAgICAgICp2YWwgJj0gfihFRkVSX0xNRSB8IEVGRVJfTE1BIHwgRUZFUl9MTVNMRSk7Cisg ICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7CisKKyAgICBjYXNlIE1TUl9LN19GSURfVklEX0NU TDoKKyAgICBjYXNlIE1TUl9LN19GSURfVklEX1NUQVRVUzoKKyAgICBjYXNlIE1TUl9LOF9QU1RB VEVfTElNSVQ6CisgICAgY2FzZSBNU1JfSzhfUFNUQVRFX0NUUkw6CisgICAgY2FzZSBNU1JfSzhf UFNUQVRFX1NUQVRVUzoKKyAgICBjYXNlIE1TUl9LOF9QU1RBVEUwOgorICAgIGNhc2UgTVNSX0s4 X1BTVEFURTE6CisgICAgY2FzZSBNU1JfSzhfUFNUQVRFMjoKKyAgICBjYXNlIE1TUl9LOF9QU1RB VEUzOgorICAgIGNhc2UgTVNSX0s4X1BTVEFURTQ6CisgICAgY2FzZSBNU1JfSzhfUFNUQVRFNToK KyAgICBjYXNlIE1TUl9LOF9QU1RBVEU2OgorICAgIGNhc2UgTVNSX0s4X1BTVEFURTc6CisgICAg ICAgIGlmICggYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EICkKKyAg ICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIHVubGlrZWx5KGlzX2NwdWZyZXFfY29udHJv bGxlcihjdXJyZCkpICkKKyAgICAgICAgICAgIGdvdG8gbm9ybWFsOworICAgICAgICAqdmFsID0g MDsKKyAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKKworICAgIGNhc2UgTVNSX0lBMzJfVUNP REVfUkVWOgorICAgICAgICBCVUlMRF9CVUdfT04oTVNSX0lBMzJfVUNPREVfUkVWICE9IE1TUl9B TURfUEFUQ0hMRVZFTCk7CisgICAgICAgIGlmICggYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09 IFg4Nl9WRU5ET1JfSU5URUwgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHdybXNyX3Nh ZmUoTVNSX0lBMzJfVUNPREVfUkVWLCAwKSApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg ICAgICAgICAvKiBBcyBkb2N1bWVudGVkIGluIHRoZSBTRE06IERvIGEgQ1BVSUQgMSBoZXJlICov CisgICAgICAgICAgICBjcHVpZF9lYXgoMSk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBub3Jt YWw7CisKKyAgICBjYXNlIE1TUl9JQTMyX01JU0NfRU5BQkxFOgorICAgICAgICBpZiAoIHJkbXNy X3NhZmUocmVnLCAqdmFsKSApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKnZhbCA9IGd1 ZXN0X21pc2NfZW5hYmxlKCp2YWwpOworICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworCisg ICAgY2FzZSBNU1JfQU1ENjRfRFIwX0FERFJFU1NfTUFTSzoKKyAgICAgICAgaWYgKCAhYm9vdF9j cHVfaGFzKFg4Nl9GRUFUVVJFX0RCRVhUKSApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg KnZhbCA9IGN1cnItPmFyY2gucHZfdmNwdS5kcl9tYXNrWzBdOworICAgICAgICByZXR1cm4gWDg2 RU1VTF9PS0FZOworCisgICAgY2FzZSBNU1JfQU1ENjRfRFIxX0FERFJFU1NfTUFTSyAuLi4gTVNS X0FNRDY0X0RSM19BRERSRVNTX01BU0s6CisgICAgICAgIGlmICggIWJvb3RfY3B1X2hhcyhYODZf RkVBVFVSRV9EQkVYVCkgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICp2YWwgPSBjdXJy LT5hcmNoLnB2X3ZjcHUuZHJfbWFza1tyZWcgLSBNU1JfQU1ENjRfRFIxX0FERFJFU1NfTUFTSyAr IDFdOworICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworCisgICAgY2FzZSBNU1JfSUEzMl9Q RVJGX0NBUEFCSUxJVElFUzoKKyAgICAgICAgLyogTm8gZXh0cmEgY2FwYWJpbGl0aWVzIGFyZSBz dXBwb3J0ZWQuICovCisgICAgICAgICp2YWwgPSAwOworICAgICAgICByZXR1cm4gWDg2RU1VTF9P S0FZOworCisgICAgY2FzZSBNU1JfSU5URUxfUExBVEZPUk1fSU5GTzoKKyAgICAgICAgaWYgKCBi b290X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fAorICAgICAgICAg ICAgIHJkbXNyX3NhZmUoTVNSX0lOVEVMX1BMQVRGT1JNX0lORk8sICp2YWwpICkKKyAgICAgICAg ICAgIGJyZWFrOworICAgICAgICAqdmFsID0gMDsKKyAgICAgICAgaWYgKCB0aGlzX2NwdShjcHVp ZF9mYXVsdGluZ19lbmFibGVkKSApCisgICAgICAgICAgICAqdmFsIHw9IE1TUl9QTEFURk9STV9J TkZPX0NQVUlEX0ZBVUxUSU5HOworICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworCisgICAg Y2FzZSBNU1JfSU5URUxfTUlTQ19GRUFUVVJFU19FTkFCTEVTOgorICAgICAgICBpZiAoIGJvb3Rf Y3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMIHx8CisgICAgICAgICAgICAg cmRtc3Jfc2FmZShNU1JfSU5URUxfTUlTQ19GRUFUVVJFU19FTkFCTEVTLCAqdmFsKSApCisgICAg ICAgICAgICBicmVhazsKKyAgICAgICAgKnZhbCA9IDA7CisgICAgICAgIGlmICggY3Vyci0+YXJj aC5jcHVpZF9mYXVsdGluZyApCisgICAgICAgICAgICAqdmFsIHw9IE1TUl9NSVNDX0ZFQVRVUkVT X0NQVUlEX0ZBVUxUSU5HOworICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworCisgICAgY2Fz ZSBNU1JfUDZfUEVSRkNUUigwKS4uLk1TUl9QNl9QRVJGQ1RSKDcpOgorICAgIGNhc2UgTVNSX1A2 X0VWTlRTRUwoMCkuLi5NU1JfUDZfRVZOVFNFTCgzKToKKyAgICBjYXNlIE1TUl9DT1JFX1BFUkZf RklYRURfQ1RSMC4uLk1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMjoKKyAgICBjYXNlIE1TUl9DT1JF X1BFUkZfRklYRURfQ1RSX0NUUkwuLi5NU1JfQ09SRV9QRVJGX0dMT0JBTF9PVkZfQ1RSTDoKKyAg ICAgICAgaWYgKCBib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCAp CisgICAgICAgIHsKKyAgICAgICAgICAgIHZwbXVfbXNyID0gdHJ1ZTsKKyAgICAgICAgICAgIC8q IGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgTVNSX0FNRF9GQU0xNUhfRVZOVFNFTDAuLi5NU1Jf QU1EX0ZBTTE1SF9QRVJGQ1RSNToKKyAgICBjYXNlIE1TUl9LN19FVk5UU0VMMC4uLk1TUl9LN19Q RVJGQ1RSMzoKKyAgICAgICAgICAgIGlmICggdnBtdV9tc3IgfHwgKGJvb3RfY3B1X2RhdGEueDg2 X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAg ICAgIGlmICggdnBtdV9kb19yZG1zcihyZWcsIHZhbCkgKQorICAgICAgICAgICAgICAgICAgICBi cmVhazsKKyAgICAgICAgICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworICAgICAgICAgICAg fQorICAgICAgICB9CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6Cisg ICAgICAgIGlmICggcmRtc3JfaHlwZXJ2aXNvcl9yZWdzKHJlZywgdmFsKSApCisgICAgICAgICAg ICByZXR1cm4gWDg2RU1VTF9PS0FZOworCisgICAgICAgIHJjID0gdm1jZV9yZG1zcihyZWcsIHZh bCk7CisgICAgICAgIGlmICggcmMgPCAwICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBp ZiAoIHJjICkKKyAgICAgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7CisgICAgICAgIC8qIGZh bGwgdGhyb3VnaCAqLworICAgIG5vcm1hbDoKKyAgICAgICAgLyogRXZlcnlvbmUgY2FuIHJlYWQg dGhlIE1TUiBzcGFjZS4gKi8KKyAgICAgICAgLyogZ2RwcmludGsoWEVOTE9HX1dBUk5JTkcsICJE b21haW4gYXR0ZW1wdGVkIFJETVNSICUwOHhcbiIsIHJlZyk7ICovCisgICAgICAgIGlmICggcmRt c3Jfc2FmZShyZWcsICp2YWwpICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4g WDg2RU1VTF9PS0FZOworICAgIH0KKworICAgIHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsK K30KKworI2luY2x1ZGUgIi4uL3g4Nl82NC9tbWNvbmZpZy5oIgorCitzdGF0aWMgaW50IHByaXZf b3Bfd3JpdGVfbXNyKHVuc2lnbmVkIGludCByZWcsIHVpbnQ2NF90IHZhbCwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisgICAg c3RydWN0IHZjcHUgKmN1cnIgPSBjdXJyZW50OworICAgIGNvbnN0IHN0cnVjdCBkb21haW4gKmN1 cnJkID0gY3Vyci0+ZG9tYWluOworICAgIGJvb2wgdnBtdV9tc3IgPSBmYWxzZTsKKworICAgIHN3 aXRjaCAoIHJlZyApCisgICAgeworICAgICAgICB1aW50NjRfdCB0ZW1wOworICAgICAgICBpbnQg cmM7CisKKyAgICBjYXNlIE1TUl9GU19CQVNFOgorICAgICAgICBpZiAoIGlzX3B2XzMyYml0X2Rv bWFpbihjdXJyZCkgfHwgIWlzX2Nhbm9uaWNhbF9hZGRyZXNzKHZhbCkgKQorICAgICAgICAgICAg YnJlYWs7CisgICAgICAgIHdyZnNiYXNlKHZhbCk7CisgICAgICAgIGN1cnItPmFyY2gucHZfdmNw dS5mc19iYXNlID0gdmFsOworICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworCisgICAgY2Fz ZSBNU1JfR1NfQkFTRToKKyAgICAgICAgaWYgKCBpc19wdl8zMmJpdF9kb21haW4oY3VycmQpIHx8 ICFpc19jYW5vbmljYWxfYWRkcmVzcyh2YWwpICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg ICB3cmdzYmFzZSh2YWwpOworICAgICAgICBjdXJyLT5hcmNoLnB2X3ZjcHUuZ3NfYmFzZV9rZXJu ZWwgPSB2YWw7CisgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7CisKKyAgICBjYXNlIE1TUl9T SEFET1dfR1NfQkFTRToKKyAgICAgICAgaWYgKCBpc19wdl8zMmJpdF9kb21haW4oY3VycmQpIHx8 ICFpc19jYW5vbmljYWxfYWRkcmVzcyh2YWwpICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg ICB3cm1zcmwoTVNSX1NIQURPV19HU19CQVNFLCB2YWwpOworICAgICAgICBjdXJyLT5hcmNoLnB2 X3ZjcHUuZ3NfYmFzZV91c2VyID0gdmFsOworICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwor CisgICAgY2FzZSBNU1JfSzdfRklEX1ZJRF9TVEFUVVM6CisgICAgY2FzZSBNU1JfSzdfRklEX1ZJ RF9DVEw6CisgICAgY2FzZSBNU1JfSzhfUFNUQVRFX0xJTUlUOgorICAgIGNhc2UgTVNSX0s4X1BT VEFURV9DVFJMOgorICAgIGNhc2UgTVNSX0s4X1BTVEFURV9TVEFUVVM6CisgICAgY2FzZSBNU1Jf SzhfUFNUQVRFMDoKKyAgICBjYXNlIE1TUl9LOF9QU1RBVEUxOgorICAgIGNhc2UgTVNSX0s4X1BT VEFURTI6CisgICAgY2FzZSBNU1JfSzhfUFNUQVRFMzoKKyAgICBjYXNlIE1TUl9LOF9QU1RBVEU0 OgorICAgIGNhc2UgTVNSX0s4X1BTVEFURTU6CisgICAgY2FzZSBNU1JfSzhfUFNUQVRFNjoKKyAg ICBjYXNlIE1TUl9LOF9QU1RBVEU3OgorICAgIGNhc2UgTVNSX0s4X0hXQ1I6CisgICAgICAgIGlm ICggYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EICkKKyAgICAgICAg ICAgIGJyZWFrOworICAgICAgICBpZiAoIGxpa2VseSghaXNfY3B1ZnJlcV9jb250cm9sbGVyKGN1 cnJkKSkgfHwKKyAgICAgICAgICAgICB3cm1zcl9zYWZlKHJlZywgdmFsKSA9PSAwICkKKyAgICAg ICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBN U1JfQU1ENjRfTkJfQ0ZHOgorICAgICAgICBpZiAoIGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciAh PSBYODZfVkVORE9SX0FNRCB8fAorICAgICAgICAgICAgIGJvb3RfY3B1X2RhdGEueDg2IDwgMHgx MCB8fCBib290X2NwdV9kYXRhLng4NiA+IDB4MTcgKQorICAgICAgICAgICAgYnJlYWs7CisgICAg ICAgIGlmICggIWlzX2hhcmR3YXJlX2RvbWFpbihjdXJyZCkgfHwgIWlzX3Bpbm5lZF92Y3B1KGN1 cnIpICkKKyAgICAgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7CisgICAgICAgIGlmICggKHJk bXNyX3NhZmUoTVNSX0FNRDY0X05CX0NGRywgdGVtcCkgIT0gMCkgfHwKKyAgICAgICAgICAgICAo KHZhbCBeIHRlbXApICYgfigxVUxMIDw8IEFNRDY0X05CX0NGR19DRjhfRVhUX0VOQUJMRV9CSVQp KSApCisgICAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgIGlmICggd3Jtc3Jfc2FmZShN U1JfQU1ENjRfTkJfQ0ZHLCB2YWwpID09IDAgKQorICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxf T0tBWTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1TUl9GQU0xMEhfTU1JT19DT05GX0JB U0U6CisgICAgICAgIGlmICggYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1Jf QU1EIHx8CisgICAgICAgICAgICAgYm9vdF9jcHVfZGF0YS54ODYgPCAweDEwIHx8IGJvb3RfY3B1 X2RhdGEueDg2ID4gMHgxNyApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKCAhaXNf aGFyZHdhcmVfZG9tYWluKGN1cnJkKSB8fCAhaXNfcGlubmVkX3ZjcHUoY3VycikgKQorICAgICAg ICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKKyAgICAgICAgaWYgKCByZG1zcl9zYWZlKE1TUl9G QU0xMEhfTU1JT19DT05GX0JBU0UsIHRlbXApICE9IDAgKQorICAgICAgICAgICAgYnJlYWs7Cisg ICAgICAgIGlmICggKHBjaV9wcm9iZSAmIFBDSV9QUk9CRV9NQVNLKSA9PSBQQ0lfUFJPQkVfTU1D T05GID8KKyAgICAgICAgICAgICB0ZW1wICE9IHZhbCA6CisgICAgICAgICAgICAgKCh0ZW1wIF4g dmFsKSAmCisgICAgICAgICAgICAgIH4oRkFNMTBIX01NSU9fQ09ORl9FTkFCTEUgfAorICAgICAg ICAgICAgICAgIChGQU0xMEhfTU1JT19DT05GX0JVU1JBTkdFX01BU0sgPDwKKyAgICAgICAgICAg ICAgICAgRkFNMTBIX01NSU9fQ09ORl9CVVNSQU5HRV9TSElGVCkgfAorICAgICAgICAgICAgICAg ICgodTY0KUZBTTEwSF9NTUlPX0NPTkZfQkFTRV9NQVNLIDw8CisgICAgICAgICAgICAgICAgIEZB TTEwSF9NTUlPX0NPTkZfQkFTRV9TSElGVCkpKSApCisgICAgICAgICAgICBnb3RvIGludmFsaWQ7 CisgICAgICAgIGlmICggd3Jtc3Jfc2FmZShNU1JfRkFNMTBIX01NSU9fQ09ORl9CQVNFLCB2YWwp ID09IDAgKQorICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKKyAgICAgICAgYnJlYWs7 CisKKyAgICBjYXNlIE1TUl9JQTMyX1VDT0RFX1JFVjoKKyAgICAgICAgaWYgKCBib290X2NwdV9k YXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCApCisgICAgICAgICAgICBicmVhazsK KyAgICAgICAgaWYgKCAhaXNfaGFyZHdhcmVfZG9tYWluKGN1cnJkKSB8fCAhaXNfcGlubmVkX3Zj cHUoY3VycikgKQorICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKKyAgICAgICAgaWYg KCByZG1zcl9zYWZlKHJlZywgdGVtcCkgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlm ICggdmFsICkKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgcmV0dXJuIFg4NkVN VUxfT0tBWTsKKworICAgIGNhc2UgTVNSX0lBMzJfTUlTQ19FTkFCTEU6CisgICAgICAgIGlmICgg cmRtc3Jfc2FmZShyZWcsIHRlbXApICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAo IHZhbCAhPSBndWVzdF9taXNjX2VuYWJsZSh0ZW1wKSApCisgICAgICAgICAgICBnb3RvIGludmFs aWQ7CisgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7CisKKyAgICBjYXNlIE1TUl9JQTMyX01Q RVJGOgorICAgIGNhc2UgTVNSX0lBMzJfQVBFUkY6CisgICAgICAgIGlmICggKGJvb3RfY3B1X2Rh dGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMKSAmJgorICAgICAgICAgICAgIChib290 X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQpICkKKyAgICAgICAgICAgIGJy ZWFrOworICAgICAgICBpZiAoIGxpa2VseSghaXNfY3B1ZnJlcV9jb250cm9sbGVyKGN1cnJkKSkg fHwKKyAgICAgICAgICAgICB3cm1zcl9zYWZlKHJlZywgdmFsKSA9PSAwICkKKyAgICAgICAgICAg IHJldHVybiBYODZFTVVMX09LQVk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNU1JfSUEz Ml9QRVJGX0NUTDoKKyAgICAgICAgaWYgKCBib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2 X1ZFTkRPUl9JTlRFTCApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKCBsaWtlbHko IWlzX2NwdWZyZXFfY29udHJvbGxlcihjdXJyZCkpIHx8CisgICAgICAgICAgICAgd3Jtc3Jfc2Fm ZShyZWcsIHZhbCkgPT0gMCApCisgICAgICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworICAg ICAgICBicmVhazsKKworICAgIGNhc2UgTVNSX0lBMzJfVEhFUk1fQ09OVFJPTDoKKyAgICBjYXNl IE1TUl9JQTMyX0VORVJHWV9QRVJGX0JJQVM6CisgICAgICAgIGlmICggYm9vdF9jcHVfZGF0YS54 ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwgKQorICAgICAgICAgICAgYnJlYWs7CisgICAg ICAgIGlmICggIWlzX2hhcmR3YXJlX2RvbWFpbihjdXJyZCkgfHwgIWlzX3Bpbm5lZF92Y3B1KGN1 cnIpIHx8CisgICAgICAgICAgICAgd3Jtc3Jfc2FmZShyZWcsIHZhbCkgPT0gMCApCisgICAgICAg ICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTVNS X0FNRDY0X0RSMF9BRERSRVNTX01BU0s6CisgICAgICAgIGlmICggIWJvb3RfY3B1X2hhcyhYODZf RkVBVFVSRV9EQkVYVCkgfHwgKHZhbCA+PiAzMikgKQorICAgICAgICAgICAgYnJlYWs7CisgICAg ICAgIGN1cnItPmFyY2gucHZfdmNwdS5kcl9tYXNrWzBdID0gdmFsOworICAgICAgICBpZiAoIGN1 cnItPmFyY2guZGVidWdyZWdbN10gJiBEUjdfQUNUSVZFX01BU0sgKQorICAgICAgICAgICAgd3Jt c3JsKE1TUl9BTUQ2NF9EUjBfQUREUkVTU19NQVNLLCB2YWwpOworICAgICAgICByZXR1cm4gWDg2 RU1VTF9PS0FZOworCisgICAgY2FzZSBNU1JfQU1ENjRfRFIxX0FERFJFU1NfTUFTSyAuLi4gTVNS X0FNRDY0X0RSM19BRERSRVNTX01BU0s6CisgICAgICAgIGlmICggIWJvb3RfY3B1X2hhcyhYODZf RkVBVFVSRV9EQkVYVCkgfHwgKHZhbCA+PiAzMikgKQorICAgICAgICAgICAgYnJlYWs7CisgICAg ICAgIGN1cnItPmFyY2gucHZfdmNwdS5kcl9tYXNrW3JlZyAtIE1TUl9BTUQ2NF9EUjFfQUREUkVT U19NQVNLICsgMV0gPSB2YWw7CisgICAgICAgIGlmICggY3Vyci0+YXJjaC5kZWJ1Z3JlZ1s3XSAm IERSN19BQ1RJVkVfTUFTSyApCisgICAgICAgICAgICB3cm1zcmwocmVnLCB2YWwpOworICAgICAg ICByZXR1cm4gWDg2RU1VTF9PS0FZOworCisgICAgY2FzZSBNU1JfSU5URUxfUExBVEZPUk1fSU5G TzoKKyAgICAgICAgaWYgKCBib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9J TlRFTCB8fAorICAgICAgICAgICAgIHZhbCB8fCByZG1zcl9zYWZlKE1TUl9JTlRFTF9QTEFURk9S TV9JTkZPLCB2YWwpICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gWDg2RU1V TF9PS0FZOworCisgICAgY2FzZSBNU1JfSU5URUxfTUlTQ19GRUFUVVJFU19FTkFCTEVTOgorICAg ICAgICBpZiAoIGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMIHx8 CisgICAgICAgICAgICAgKHZhbCAmIH5NU1JfTUlTQ19GRUFUVVJFU19DUFVJRF9GQVVMVElORykg fHwKKyAgICAgICAgICAgICByZG1zcl9zYWZlKE1TUl9JTlRFTF9NSVNDX0ZFQVRVUkVTX0VOQUJM RVMsIHRlbXApICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoICh2YWwgJiBNU1Jf TUlTQ19GRUFUVVJFU19DUFVJRF9GQVVMVElORykgJiYKKyAgICAgICAgICAgICAhdGhpc19jcHUo Y3B1aWRfZmF1bHRpbmdfZW5hYmxlZCkgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGN1 cnItPmFyY2guY3B1aWRfZmF1bHRpbmcgPSAhISh2YWwgJiBNU1JfTUlTQ19GRUFUVVJFU19DUFVJ RF9GQVVMVElORyk7CisgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7CisKKyAgICBjYXNlIE1T Ul9QNl9QRVJGQ1RSKDApLi4uTVNSX1A2X1BFUkZDVFIoNyk6CisgICAgY2FzZSBNU1JfUDZfRVZO VFNFTCgwKS4uLk1TUl9QNl9FVk5UU0VMKDMpOgorICAgIGNhc2UgTVNSX0NPUkVfUEVSRl9GSVhF RF9DVFIwLi4uTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFIyOgorICAgIGNhc2UgTVNSX0NPUkVfUEVS Rl9GSVhFRF9DVFJfQ1RSTC4uLk1TUl9DT1JFX1BFUkZfR0xPQkFMX09WRl9DVFJMOgorICAgICAg ICBpZiAoIGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMICkKKyAg ICAgICAgeworICAgICAgICAgICAgdnBtdV9tc3IgPSB0cnVlOworICAgIGNhc2UgTVNSX0FNRF9G QU0xNUhfRVZOVFNFTDAuLi5NU1JfQU1EX0ZBTTE1SF9QRVJGQ1RSNToKKyAgICBjYXNlIE1TUl9L N19FVk5UU0VMMC4uLk1TUl9LN19QRVJGQ1RSMzoKKyAgICAgICAgICAgIGlmICggdnBtdV9tc3Ig fHwgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkgKQorICAgICAg ICAgICAgeworICAgICAgICAgICAgICAgIGlmICggKHZwbXVfbW9kZSAmIFhFTlBNVV9NT0RFX0FM TCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICFpc19oYXJkd2FyZV9kb21haW4oY3VycmQpICkK KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKKworICAgICAgICAgICAg ICAgIGlmICggdnBtdV9kb193cm1zcihyZWcsIHZhbCwgMCkgKQorICAgICAgICAgICAgICAgICAg ICBicmVhazsKKyAgICAgICAgICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworICAgICAgICAg ICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6 CisgICAgICAgIGlmICggd3Jtc3JfaHlwZXJ2aXNvcl9yZWdzKHJlZywgdmFsKSA9PSAxICkKKyAg ICAgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7CisKKyAgICAgICAgcmMgPSB2bWNlX3dybXNy KHJlZywgdmFsKTsKKyAgICAgICAgaWYgKCByYyA8IDAgKQorICAgICAgICAgICAgYnJlYWs7Cisg ICAgICAgIGlmICggcmMgKQorICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKKworICAg ICAgICBpZiAoIChyZG1zcl9zYWZlKHJlZywgdGVtcCkgIT0gMCkgfHwgKHZhbCAhPSB0ZW1wKSAp CisgICAgaW52YWxpZDoKKyAgICAgICAgICAgIGdkcHJpbnRrKFhFTkxPR19XQVJOSU5HLAorICAg ICAgICAgICAgICAgICAgICAgIkRvbWFpbiBhdHRlbXB0ZWQgV1JNU1IgJTA4eCBmcm9tIDB4JTAx NiJQUkl4NjQiIHRvIDB4JTAxNiJQUkl4NjQiXG4iLAorICAgICAgICAgICAgICAgICAgICAgcmVn LCB0ZW1wLCB2YWwpOworICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworICAgIH0KKworICAg IHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKK30KKworc3RhdGljIGludCBwcml2X29wX3di aW52ZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3sKKyAgICAvKiBJZ25vcmUgdGhl IGluc3RydWN0aW9uIGlmIHVucHJpdmlsZWdlZC4gKi8KKyAgICBpZiAoICFjYWNoZV9mbHVzaF9w ZXJtaXR0ZWQoY3VycmVudC0+ZG9tYWluKSApCisgICAgICAgIC8qCisgICAgICAgICAqIE5vbi1w aHlzZGV2IGRvbWFpbiBhdHRlbXB0ZWQgV0JJTlZEOyBpZ25vcmUgZm9yIG5vdyBzaW5jZQorICAg ICAgICAgKiBuZXdlciBsaW51eCB1c2VzIHRoaXMgaW4gc29tZSBzdGFydC1vZi1kYXkgdGltaW5n IGxvb3BzLgorICAgICAgICAgKi8KKyAgICAgICAgOworICAgIGVsc2UKKyAgICAgICAgd2JpbnZk KCk7CisKKyAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworfQorCitzdGF0aWMgaW50IHByaXZfb3Bf dmFsaWRhdGUoY29uc3Qgc3RydWN0IHg4Nl9lbXVsYXRlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3sKKyAg ICBzd2l0Y2ggKCBjdHh0LT5vcGNvZGUgKQorICAgIHsKKyAgICBjYXNlIDB4NmMgLi4uIDB4NmY6 IC8qIGlucyAvIG91dHMgKi8KKyAgICBjYXNlIDB4ZTQgLi4uIDB4ZTc6IC8qIGluIC8gb3V0IChp bW1lZGlhdGUgcG9ydCkgKi8KKyAgICBjYXNlIDB4ZWMgLi4uIDB4ZWY6IC8qIGluIC8gb3V0IChw b3J0IGluICVkeCkgKi8KKyAgICBjYXNlIFg4NkVNVUxfT1BDKDB4MGYsIDB4MDYpOiAvKiBjbHRz ICovCisgICAgY2FzZSBYODZFTVVMX09QQygweDBmLCAweDA5KTogLyogd2JpbnZkICovCisgICAg Y2FzZSBYODZFTVVMX09QQygweDBmLCAweDIwKSAuLi4KKyAgICAgICAgIFg4NkVNVUxfT1BDKDB4 MGYsIDB4MjMpOiAvKiBtb3YgdG8vZnJvbSBjci9kciAqLworICAgIGNhc2UgWDg2RU1VTF9PUEMo MHgwZiwgMHgzMCk6IC8qIHdybXNyICovCisgICAgY2FzZSBYODZFTVVMX09QQygweDBmLCAweDMx KTogLyogcmR0c2MgKi8KKyAgICBjYXNlIFg4NkVNVUxfT1BDKDB4MGYsIDB4MzIpOiAvKiByZG1z ciAqLworICAgIGNhc2UgWDg2RU1VTF9PUEMoMHgwZiwgMHhhMik6IC8qIGNwdWlkICovCisgICAg ICAgIHJldHVybiBYODZFTVVMX09LQVk7CisKKyAgICBjYXNlIDB4ZmE6IGNhc2UgMHhmYjogLyog Y2xpIC8gc3RpICovCisgICAgICAgIGlmICggIWlvcGxfb2soY3VycmVudCwgY3R4dC0+cmVncykg KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXMgaXMganVz dCB0b28gZGFuZ2Vyb3VzIHRvIGFsbG93LCBpbiBteSBvcGluaW9uLiBDb25zaWRlciBpZiB0aGUK KyAgICAgICAgICogY2FsbGVyIHRoZW4gdHJpZXMgdG8gcmVlbmFibGUgaW50ZXJydXB0cyB1c2lu ZyBQT1BGOiB3ZSBjYW4ndCB0cmFwCisgICAgICAgICAqIHRoYXQgYW5kIHdlJ2xsIGVuZCB1cCB3 aXRoIGhhcmQtdG8tZGVidWcgbG9ja3Vwcy4gRmFzdCAmIGxvb3NlIHdpbGwKKyAgICAgICAgICog ZG8gZm9yIHVzLiA6LSkKKyAgICAgICAgdmNwdV9pbmZvKGN1cnJlbnQsIGV2dGNobl91cGNhbGxf bWFzaykgPSAoY3R4dC0+b3Bjb2RlID09IDB4ZmEpOworICAgICAgICAgKi8KKyAgICAgICAgcmV0 dXJuIFg4NkVNVUxfRE9ORTsKKworICAgIGNhc2UgWDg2RU1VTF9PUEMoMHgwZiwgMHgwMSk6Cisg ICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgbW9kcm1fcm0sIG1vZHJtX3JlZzsKKworICAgICAg ICBpZiAoIHg4Nl9pbnNuX21vZHJtKHN0YXRlLCAmbW9kcm1fcm0sICZtb2RybV9yZWcpICE9IDMg fHwKKyAgICAgICAgICAgICAobW9kcm1fcm0gJiA3KSAhPSAxICkKKyAgICAgICAgICAgIGJyZWFr OworICAgICAgICBzd2l0Y2ggKCBtb2RybV9yZWcgJiA3ICkKKyAgICAgICAgeworICAgICAgICBj YXNlIDI6IC8qIHhzZXRidiAqLworICAgICAgICBjYXNlIDc6IC8qIHJkdHNjcCAqLworICAgICAg ICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAg ICB9CisgICAgfQorCisgICAgcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyBwcml2X29wX29wcyA9IHsKKyAgICAuaW5z bl9mZXRjaCAgICAgICAgICA9IHByaXZfb3BfaW5zbl9mZXRjaCwKKyAgICAucmVhZCAgICAgICAg ICAgICAgICA9IHg4NmVtdWxfdW5oYW5kbGVhYmxlX3J3LAorICAgIC52YWxpZGF0ZSAgICAgICAg ICAgID0gcHJpdl9vcF92YWxpZGF0ZSwKKyAgICAucmVhZF9pbyAgICAgICAgICAgICA9IHByaXZf b3BfcmVhZF9pbywKKyAgICAud3JpdGVfaW8gICAgICAgICAgICA9IHByaXZfb3Bfd3JpdGVfaW8s CisgICAgLnJlcF9pbnMgICAgICAgICAgICAgPSBwcml2X29wX3JlcF9pbnMsCisgICAgLnJlcF9v dXRzICAgICAgICAgICAgPSBwcml2X29wX3JlcF9vdXRzLAorICAgIC5yZWFkX3NlZ21lbnQgICAg ICAgID0gcHJpdl9vcF9yZWFkX3NlZ21lbnQsCisgICAgLnJlYWRfY3IgICAgICAgICAgICAgPSBw cml2X29wX3JlYWRfY3IsCisgICAgLndyaXRlX2NyICAgICAgICAgICAgPSBwcml2X29wX3dyaXRl X2NyLAorICAgIC5yZWFkX2RyICAgICAgICAgICAgID0gcHJpdl9vcF9yZWFkX2RyLAorICAgIC53 cml0ZV9kciAgICAgICAgICAgID0gcHJpdl9vcF93cml0ZV9kciwKKyAgICAucmVhZF9tc3IgICAg ICAgICAgICA9IHByaXZfb3BfcmVhZF9tc3IsCisgICAgLndyaXRlX21zciAgICAgICAgICAgPSBw cml2X29wX3dyaXRlX21zciwKKyAgICAuY3B1aWQgICAgICAgICAgICAgICA9IHB2X2VtdWxfY3B1 aWQsCisgICAgLndiaW52ZCAgICAgICAgICAgICAgPSBwcml2X29wX3diaW52ZCwKK307CisKK2lu dCBlbXVsYXRlX3ByaXZpbGVnZWRfb3Aoc3RydWN0IGNwdV91c2VyX3JlZ3MgKnJlZ3MpCit7Cisg ICAgc3RydWN0IHZjcHUgKmN1cnIgPSBjdXJyZW50OworICAgIHN0cnVjdCBkb21haW4gKmN1cnJk ID0gY3Vyci0+ZG9tYWluOworICAgIHN0cnVjdCBwcml2X29wX2N0eHQgY3R4dCA9IHsKKyAgICAg ICAgLmN0eHQucmVncyA9IHJlZ3MsCisgICAgICAgIC5jdHh0LnZlbmRvciA9IGN1cnJkLT5hcmNo LmNwdWlkLT54ODZfdmVuZG9yLAorICAgICAgICAuY3R4dC5sbWEgPSAhaXNfcHZfMzJiaXRfZG9t YWluKGN1cnJkKSwKKyAgICB9OworICAgIGludCByYzsKKyAgICB1bnNpZ25lZCBpbnQgZWZsYWdz LCBhcjsKKworICAgIGlmICggIXJlYWRfZGVzY3JpcHRvcihyZWdzLT5jcywgY3VyciwgJmN0eHQu Y3MuYmFzZSwgJmN0eHQuY3MubGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhciwg MSkgfHwKKyAgICAgICAgICEoYXIgJiBfU0VHTUVOVF9TKSB8fAorICAgICAgICAgIShhciAmIF9T RUdNRU5UX1ApIHx8CisgICAgICAgICAhKGFyICYgX1NFR01FTlRfQ09ERSkgKQorICAgICAgICBy ZXR1cm4gMDsKKworICAgIC8qIE1pcnJvciB2aXJ0dWFsaXplZCBzdGF0ZSBpbnRvIEVGTEFHUy4g Ki8KKyAgICBBU1NFUlQocmVncy0+ZWZsYWdzICYgWDg2X0VGTEFHU19JRik7CisgICAgaWYgKCB2 Y3B1X2luZm8oY3VyciwgZXZ0Y2huX3VwY2FsbF9tYXNrKSApCisgICAgICAgIHJlZ3MtPmVmbGFn cyAmPSB+WDg2X0VGTEFHU19JRjsKKyAgICBlbHNlCisgICAgICAgIHJlZ3MtPmVmbGFncyB8PSBY ODZfRUZMQUdTX0lGOworICAgIEFTU0VSVCghKHJlZ3MtPmVmbGFncyAmIFg4Nl9FRkxBR1NfSU9Q TCkpOworICAgIHJlZ3MtPmVmbGFncyB8PSBjdXJyLT5hcmNoLnB2X3ZjcHUuaW9wbDsKKyAgICBl ZmxhZ3MgPSByZWdzLT5lZmxhZ3M7CisKKyAgICBjdHh0LmN0eHQuYWRkcl9zaXplID0gYXIgJiBf U0VHTUVOVF9MID8gNjQgOiBhciAmIF9TRUdNRU5UX0RCID8gMzIgOiAxNjsKKyAgICAvKiBMZWF2 ZSB6ZXJvIGluIGN0eHQuY3R4dC5zcF9zaXplLCBhcyBpdCdzIG5vdCBuZWVkZWQuICovCisgICAg cmMgPSB4ODZfZW11bGF0ZSgmY3R4dC5jdHh0LCAmcHJpdl9vcF9vcHMpOworCisgICAgaWYgKCBj dHh0LmlvX2VtdWxfc3R1YiApCisgICAgICAgIHVubWFwX2RvbWFpbl9wYWdlKGN0eHQuaW9fZW11 bF9zdHViKTsKKworICAgIC8qCisgICAgICogVW4tbWlycm9yIHZpcnR1YWxpemVkIHN0YXRlIGZy b20gRUZMQUdTLgorICAgICAqIE5vdGhpbmcgd2UgYWxsb3cgdG8gYmUgZW11bGF0ZWQgY2FuIGNo YW5nZSBhbnl0aGluZyBvdGhlciB0aGFuIHRoZQorICAgICAqIGFyaXRobWV0aWMgYml0cywgYW5k IHRoZSByZXN1bWUgZmxhZy4KKyAgICAgKi8KKyAgICBBU1NFUlQoISgocmVncy0+ZWZsYWdzIF4g ZWZsYWdzKSAmCisgICAgICAgICAgICAgfihYODZfRUZMQUdTX1JGIHwgWDg2X0VGTEFHU19BUklU SF9NQVNLKSkpOworICAgIHJlZ3MtPmVmbGFncyB8PSBYODZfRUZMQUdTX0lGOworICAgIHJlZ3Mt PmVmbGFncyAmPSB+WDg2X0VGTEFHU19JT1BMOworCisgICAgc3dpdGNoICggcmMgKQorICAgIHsK KyAgICBjYXNlIFg4NkVNVUxfT0tBWToKKyAgICAgICAgaWYgKCBjdHh0LnRzYyAmIFRTQ19CQVNF ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBjdHh0LnRzYyAmIFRTQ19BVVggKQorICAg ICAgICAgICAgICAgIHB2X3NvZnRfcmR0c2MoY3VyciwgcmVncywgMSk7CisgICAgICAgICAgICBl bHNlIGlmICggY3VycmQtPmFyY2gudnRzYyApCisgICAgICAgICAgICAgICAgcHZfc29mdF9yZHRz YyhjdXJyLCByZWdzLCAwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtc3Jf c3BsaXQocmVncywgcmR0c2MoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGN0eHQuY3R4 dC5yZXRpcmUuc2luZ2xlc3RlcCApCisgICAgICAgICAgICBjdHh0LmJwbWF0Y2ggfD0gRFJfU1RF UDsKKyAgICAgICAgaWYgKCBjdHh0LmJwbWF0Y2ggKQorICAgICAgICB7CisgICAgICAgICAgICBj dXJyLT5hcmNoLmRlYnVncmVnWzZdIHw9IGN0eHQuYnBtYXRjaCB8IERSX1NUQVRVU19SRVNFUlZF RF9PTkU7CisgICAgICAgICAgICBpZiAoICEoY3Vyci0+YXJjaC5wdl92Y3B1LnRyYXBfYm91bmNl LmZsYWdzICYgVEJGX0VYQ0VQVElPTikgKQorICAgICAgICAgICAgICAgIHB2X2luamVjdF90cmFw KFRSQVBfZGVidWcsIHJlZ3MpOworICAgICAgICB9CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAq LworICAgIGNhc2UgWDg2RU1VTF9SRVRSWToKKyAgICAgICAgcmV0dXJuIEVYQ1JFVF9mYXVsdF9m aXhlZDsKKworICAgIGNhc2UgWDg2RU1VTF9FWENFUFRJT046CisgICAgICAgIHB2X2luamVjdF9l dmVudCgmY3R4dC5jdHh0LmV2ZW50KTsKKyAgICAgICAgcmV0dXJuIEVYQ1JFVF9mYXVsdF9maXhl ZDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RydWN0IGdhdGVfb3BfY3R4dCB7Cisg ICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgY3R4dDsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1 bnNpZ25lZCBsb25nIGJhc2UsIGxpbWl0OworICAgIH0gY3M7CisgICAgYm9vbCBpbnNuX2ZldGNo OworfTsKKworc3RhdGljIGludCBnYXRlX29wX3JlYWQoCisgICAgZW51bSB4ODZfc2VnbWVudCBz ZWcsCisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisgICAgdm9pZCAqcF9kYXRhLAorICAgIHVu c2lnbmVkIGludCBieXRlcywKKyAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3sK KyAgICBjb25zdCBzdHJ1Y3QgZ2F0ZV9vcF9jdHh0ICpnb2MgPQorICAgICAgICBjb250YWluZXJf b2YoY3R4dCwgc3RydWN0IGdhdGVfb3BfY3R4dCwgY3R4dCk7CisgICAgdW5zaWduZWQgaW50IHJj ID0gYnl0ZXMsIHNlbCA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyID0gb2Zmc2V0LCBsaW1p dCA9IDA7CisKKyAgICBzd2l0Y2ggKCBzZWcgKQorICAgIHsKKyAgICBjYXNlIHg4Nl9zZWdfY3M6 CisgICAgICAgIGFkZHIgKz0gZ29jLT5jcy5iYXNlOworICAgICAgICBsaW1pdCA9IGdvYy0+Y3Mu bGltaXQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgeDg2X3NlZ19kczoKKyAgICAgICAgc2Vs ID0gcmVhZF9zcmVnKGRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSB4ODZfc2VnX2VzOgor ICAgICAgICBzZWwgPSByZWFkX3NyZWcoZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIHg4 Nl9zZWdfZnM6CisgICAgICAgIHNlbCA9IHJlYWRfc3JlZyhmcyk7CisgICAgICAgIGJyZWFrOwor ICAgIGNhc2UgeDg2X3NlZ19nczoKKyAgICAgICAgc2VsID0gcmVhZF9zcmVnKGdzKTsKKyAgICAg ICAgYnJlYWs7CisgICAgY2FzZSB4ODZfc2VnX3NzOgorICAgICAgICBzZWwgPSBjdHh0LT5yZWdz LT5zczsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFg4NkVN VUxfVU5IQU5ETEVBQkxFOworICAgIH0KKyAgICBpZiAoIHNlbCApCisgICAgeworICAgICAgICB1 bnNpZ25lZCBpbnQgYXI7CisKKyAgICAgICAgQVNTRVJUKCFnb2MtPmluc25fZmV0Y2gpOworICAg ICAgICBpZiAoICFyZWFkX2Rlc2NyaXB0b3Ioc2VsLCBjdXJyZW50LCAmYWRkciwgJmxpbWl0LCAm YXIsIDApIHx8CisgICAgICAgICAgICAgIShhciAmIF9TRUdNRU5UX1MpIHx8CisgICAgICAgICAg ICAgIShhciAmIF9TRUdNRU5UX1ApIHx8CisgICAgICAgICAgICAgKChhciAmIF9TRUdNRU5UX0NP REUpICYmICEoYXIgJiBfU0VHTUVOVF9XUikpICkKKyAgICAgICAgICAgIHJldHVybiBYODZFTVVM X1VOSEFORExFQUJMRTsKKyAgICAgICAgYWRkciArPSBvZmZzZXQ7CisgICAgfQorICAgIGVsc2Ug aWYgKCBzZWcgIT0geDg2X3NlZ19jcyApCisgICAgICAgIHJldHVybiBYODZFTVVMX1VOSEFORExF QUJMRTsKKworICAgIC8qIFdlIGRvbid0IG1lYW4gdG8gZW11bGF0ZSBhbnkgYnJhbmNoZXMuICov CisgICAgaWYgKCBsaW1pdCA8IGJ5dGVzIC0gMSB8fCBvZmZzZXQgPiBsaW1pdCAtIGJ5dGVzICsg MSApCisgICAgICAgIHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKKworICAgIGFkZHIgPSAo dWludDMyX3QpYWRkcjsKKworICAgIGlmICggKHJjID0gX19jb3B5X2Zyb21fdXNlcihwX2RhdGEs ICh2b2lkICopYWRkciwgYnl0ZXMpKSApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBU T0RPOiBUaGlzIHNob3VsZCByZXBvcnQgUEZFQ19pbnNuX2ZldGNoIHdoZW4gZ29jLT5pbnNuX2Zl dGNoICYmCisgICAgICAgICAqIGNwdV9oYXNfbngsIGJ1dCB3ZSdkIHRoZW4gbmVlZCBhICJmZXRj aCIgdmFyaWFudCBvZgorICAgICAgICAgKiBfX2NvcHlfZnJvbV91c2VyKCkgcmVzcGVjdGluZyBO WCwgU01FUCwgYW5kIHByb3RlY3Rpb24ga2V5cy4KKyAgICAgICAgICovCisgICAgICAgIHg4Nl9l bXVsX3BhZ2VmYXVsdCgwLCBhZGRyICsgYnl0ZXMgLSByYywgY3R4dCk7CisgICAgICAgIHJldHVy biBYODZFTVVMX0VYQ0VQVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwor fQorCitzdGF0aWMgaW50IHJlYWRfZ2F0ZV9kZXNjcmlwdG9yKHVuc2lnbmVkIGludCBnYXRlX3Nl bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHZjcHUgKnYs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc2VsLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpvZmYsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqYXIpCit7CisgICAgc3RydWN0 IGRlc2Nfc3RydWN0IGRlc2M7CisgICAgY29uc3Qgc3RydWN0IGRlc2Nfc3RydWN0ICpwZGVzYzsK KworCisgICAgcGRlc2MgPSAoY29uc3Qgc3RydWN0IGRlc2Nfc3RydWN0ICopCisgICAgICAgICgh KGdhdGVfc2VsICYgNCkgPyBHRFRfVklSVF9TVEFSVCh2KSA6IExEVF9WSVJUX1NUQVJUKHYpKQor ICAgICAgICArIChnYXRlX3NlbCA+PiAzKTsKKyAgICBpZiAoIChnYXRlX3NlbCA8IDQpIHx8Cisg ICAgICAgICAoKGdhdGVfc2VsID49IEZJUlNUX1JFU0VSVkVEX0dEVF9CWVRFKSAmJiAhKGdhdGVf c2VsICYgNCkpIHx8CisgICAgICAgICBfX2dldF91c2VyKGRlc2MsIHBkZXNjKSApCisgICAgICAg IHJldHVybiAwOworCisgICAgKnNlbCA9IChkZXNjLmEgPj4gMTYpICYgMHgwMDAwZmZmYzsKKyAg ICAqb2ZmID0gKGRlc2MuYSAmIDB4MDAwMGZmZmYpIHwgKGRlc2MuYiAmIDB4ZmZmZjAwMDApOwor ICAgICphciA9IGRlc2MuYiAmIDB4MDAwMGZmZmY7CisKKyAgICAvKgorICAgICAqIGNoZWNrX2Rl c2NyaXB0b3IoKSBjbGVhcnMgdGhlIERQTCBmaWVsZCBhbmQgc3RvcmVzIHRoZQorICAgICAqIGd1 ZXN0IHJlcXVlc3RlZCBEUEwgaW4gdGhlIHNlbGVjdG9yJ3MgUlBMIGZpZWxkLgorICAgICAqLwor ICAgIGlmICggKmFyICYgX1NFR01FTlRfRFBMICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgKmFy IHw9IChkZXNjLmEgPj4gKDE2IC0gMTMpKSAmIF9TRUdNRU5UX0RQTDsKKworICAgIGlmICggIWlz X3B2XzMyYml0X3ZjcHUodikgKQorICAgIHsKKyAgICAgICAgaWYgKCAoKmFyICYgMHgxZjAwKSAh PSAweDBjMDAgfHwKKyAgICAgICAgICAgICAoZ2F0ZV9zZWwgPj0gRklSU1RfUkVTRVJWRURfR0RU X0JZVEUgLSA4ICYmICEoZ2F0ZV9zZWwgJiA0KSkgfHwKKyAgICAgICAgICAgICBfX2dldF91c2Vy KGRlc2MsIHBkZXNjICsgMSkgfHwKKyAgICAgICAgICAgICAoZGVzYy5iICYgMHgxZjAwKSApCisg ICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAqb2ZmIHw9ICh1bnNpZ25lZCBsb25nKWRl c2MuYSA8PCAzMjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3dpdGNoICggKmFy ICYgMHgxZjAwICkKKyAgICB7CisgICAgY2FzZSAweDA0MDA6CisgICAgICAgICpvZmYgJj0gMHhm ZmZmOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MGMwMDoKKyAgICAgICAgYnJlYWs7Cisg ICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9 CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3N0YWNrX2xpbWl0KHVuc2lnbmVkIGludCBhciwg dW5zaWduZWQgaW50IGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dW5zaWduZWQgaW50IGVzcCwgdW5zaWduZWQgaW50IGRlY3IpCit7CisgICAgcmV0dXJuICgoKGVz cCAtIGRlY3IpIDwgKGVzcCAtIDEpKSAmJgorICAgICAgICAgICAgKCEoYXIgJiBfU0VHTUVOVF9F QykgPyAoZXNwIC0gMSkgPD0gbGltaXQgOiAoZXNwIC0gZGVjcikgPiBsaW1pdCkpOworfQorCit2 b2lkIGVtdWxhdGVfZ2F0ZV9vcChzdHJ1Y3QgY3B1X3VzZXJfcmVncyAqcmVncykKK3sKKyAgICBz dHJ1Y3QgdmNwdSAqdiA9IGN1cnJlbnQ7CisgICAgdW5zaWduZWQgaW50IHNlbCwgYXIsIGRwbCwg bnBhcm0sIGluc25fbGVuOworICAgIHN0cnVjdCBnYXRlX29wX2N0eHQgY3R4dCA9IHsgLmN0eHQu cmVncyA9IHJlZ3MsIC5pbnNuX2ZldGNoID0gdHJ1ZSB9OworICAgIHN0cnVjdCB4ODZfZW11bGF0 ZV9zdGF0ZSAqc3RhdGU7CisgICAgdW5zaWduZWQgbG9uZyBvZmYsIGJhc2UsIGxpbWl0OworICAg IHVpbnQxNl90IG9wbmRfc2VsID0gMDsKKyAgICBpbnQganVtcCA9IC0xLCByYyA9IFg4NkVNVUxf T0tBWTsKKworICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBmYXVsdCBpcyBkdWUgdG8gdGhlIHVz ZSBvZiBhIGNhbGwgZ2F0ZS4gKi8KKyAgICBpZiAoICFyZWFkX2dhdGVfZGVzY3JpcHRvcihyZWdz LT5lcnJvcl9jb2RlLCB2LCAmc2VsLCAmb2ZmLCAmYXIpIHx8CisgICAgICAgICAoKChhciA+PiAx MykgJiAzKSA8IChyZWdzLT5jcyAmIDMpKSB8fAorICAgICAgICAgKChhciAmIF9TRUdNRU5UX1RZ UEUpICE9IDB4YzAwKSApCisgICAgeworICAgICAgICBwdl9pbmplY3RfdHJhcChUUkFQX2dwX2Zh dWx0LCByZWdzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoICEoYXIgJiBfU0VH TUVOVF9QKSApCisgICAgeworICAgICAgICBwdl9pbmplY3RfdHJhcChUUkFQX25vX3NlZ21lbnQs IHJlZ3MpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRwbCA9IChhciA+PiAxMykgJiAz OworICAgIG5wYXJtID0gYXIgJiAweDFmOworCisgICAgLyoKKyAgICAgKiBEZWNvZGUgaW5zdHJ1 Y3Rpb24gKGFuZCBwZXJoYXBzIG9wZXJhbmQpIHRvIGRldGVybWluZSBSUEwsCisgICAgICogd2hl dGhlciB0aGlzIGlzIGEganVtcCBvciBhIGNhbGwsIGFuZCB0aGUgY2FsbCByZXR1cm4gb2Zmc2V0 LgorICAgICAqLworICAgIGlmICggIXJlYWRfZGVzY3JpcHRvcihyZWdzLT5jcywgdiwgJmN0eHQu Y3MuYmFzZSwgJmN0eHQuY3MubGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhciwg MCkgfHwKKyAgICAgICAgICEoYXIgJiBfU0VHTUVOVF9TKSB8fAorICAgICAgICAgIShhciAmIF9T RUdNRU5UX1ApIHx8CisgICAgICAgICAhKGFyICYgX1NFR01FTlRfQ09ERSkgKQorICAgIHsKKyAg ICAgICAgcHZfaW5qZWN0X3RyYXAoVFJBUF9ncF9mYXVsdCwgcmVncyk7CisgICAgICAgIHJldHVy bjsKKyAgICB9CisKKyAgICBjdHh0LmN0eHQuYWRkcl9zaXplID0gYXIgJiBfU0VHTUVOVF9EQiA/ IDMyIDogMTY7CisgICAgLyogTGVhdmUgemVybyBpbiBjdHh0LmN0eHQuc3Bfc2l6ZSwgYXMgaXQn cyBub3QgbmVlZGVkIGZvciBkZWNvZGluZy4gKi8KKyAgICBzdGF0ZSA9IHg4Nl9kZWNvZGVfaW5z bigmY3R4dC5jdHh0LCBnYXRlX29wX3JlYWQpOworICAgIGN0eHQuaW5zbl9mZXRjaCA9IGZhbHNl OworICAgIGlmICggSVNfRVJSX09SX05VTEwoc3RhdGUpICkKKyAgICB7CisgICAgICAgIGlmICgg UFRSX0VSUihzdGF0ZSkgPT0gLVg4NkVNVUxfRVhDRVBUSU9OICkKKyAgICAgICAgICAgIHB2X2lu amVjdF9ldmVudCgmY3R4dC5jdHh0LmV2ZW50KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg cHZfaW5qZWN0X3RyYXAoVFJBUF9ncF9mYXVsdCwgcmVncyk7CisgICAgICAgIHJldHVybjsKKyAg ICB9CisKKyAgICBzd2l0Y2ggKCBjdHh0LmN0eHQub3Bjb2RlICkKKyAgICB7CisgICAgICAgIHVu c2lnbmVkIGludCBtb2RybV8zNDU7CisKKyAgICBjYXNlIDB4ZWE6CisgICAgICAgICsranVtcDsK KyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSAweDlhOgorICAgICAgICArK2p1 bXA7CisgICAgICAgIG9wbmRfc2VsID0geDg2X2luc25faW1tZWRpYXRlKHN0YXRlLCAxKTsKKyAg ICAgICAgYnJlYWs7CisgICAgY2FzZSAweGZmOgorICAgICAgICBpZiAoIHg4Nl9pbnNuX21vZHJt KHN0YXRlLCBOVUxMLCAmbW9kcm1fMzQ1KSA+PSAzICkKKyAgICAgICAgICAgIGJyZWFrOworICAg ICAgICBzd2l0Y2ggKCBtb2RybV8zNDUgJiA3ICkKKyAgICAgICAgeworICAgICAgICAgICAgZW51 bSB4ODZfc2VnbWVudCBzZWc7CisKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgKytqdW1w OworICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgMzoKKyAgICAg ICAgICAgICsranVtcDsKKyAgICAgICAgICAgIGJhc2UgPSB4ODZfaW5zbl9vcGVyYW5kX2VhKHN0 YXRlLCAmc2VnKTsKKyAgICAgICAgICAgIHJjID0gZ2F0ZV9vcF9yZWFkKHNlZywKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyAoeDg2X2luc25fb3BzaXplKHN0YXRlKSA+PiAz KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcG5kX3NlbCwgc2l6ZW9mKG9wbmRf c2VsKSwgJmN0eHQuY3R4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAg ICBicmVhazsKKyAgICB9CisKKyAgICBpbnNuX2xlbiA9IHg4Nl9pbnNuX2xlbmd0aChzdGF0ZSwg JmN0eHQuY3R4dCk7CisgICAgeDg2X2VtdWxhdGVfZnJlZV9zdGF0ZShzdGF0ZSk7CisKKyAgICBp ZiAoIHJjID09IFg4NkVNVUxfRVhDRVBUSU9OICkKKyAgICB7CisgICAgICAgIHB2X2luamVjdF9l dmVudCgmY3R4dC5jdHh0LmV2ZW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlm ICggcmMgIT0gWDg2RU1VTF9PS0FZIHx8CisgICAgICAgICBqdW1wIDwgMCB8fAorICAgICAgICAg KG9wbmRfc2VsICYgfjMpICE9IHJlZ3MtPmVycm9yX2NvZGUgfHwKKyAgICAgICAgIGRwbCA8IChv cG5kX3NlbCAmIDMpICkKKyAgICB7CisgICAgICAgIHB2X2luamVjdF90cmFwKFRSQVBfZ3BfZmF1 bHQsIHJlZ3MpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCAhcmVhZF9kZXNj cmlwdG9yKHNlbCwgdiwgJmJhc2UsICZsaW1pdCwgJmFyLCAwKSB8fAorICAgICAgICAgIShhciAm IF9TRUdNRU5UX1MpIHx8CisgICAgICAgICAhKGFyICYgX1NFR01FTlRfQ09ERSkgfHwKKyAgICAg ICAgICghanVtcCB8fCAoYXIgJiBfU0VHTUVOVF9FQykgPworICAgICAgICAgICgoYXIgPj4gMTMp ICYgMykgPiAocmVncy0+Y3MgJiAzKSA6CisgICAgICAgICAgKChhciA+PiAxMykgJiAzKSAhPSAo cmVncy0+Y3MgJiAzKSkgKQorICAgIHsKKyAgICAgICAgcHZfaW5qZWN0X2h3X2V4Y2VwdGlvbihU UkFQX2dwX2ZhdWx0LCBzZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICggIShh ciAmIF9TRUdNRU5UX1ApICkKKyAgICB7CisgICAgICAgIHB2X2luamVjdF9od19leGNlcHRpb24o VFJBUF9ub19zZWdtZW50LCBzZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgg b2ZmID4gbGltaXQgKQorICAgIHsKKyAgICAgICAgcHZfaW5qZWN0X2h3X2V4Y2VwdGlvbihUUkFQ X2dwX2ZhdWx0LCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggIWp1bXAg KQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHNzLCBlc3AsICpzdGtwOworICAgICAgICBp bnQgcmM7CisjZGVmaW5lIHB1c2goaXRlbSkgZG8gXAorICAgICAgICB7IFwKKyAgICAgICAgICAg IC0tc3RrcDsgXAorICAgICAgICAgICAgZXNwIC09IDQ7IFwKKyAgICAgICAgICAgIHJjID0gX19w dXRfdXNlcihpdGVtLCBzdGtwKTsgXAorICAgICAgICAgICAgaWYgKCByYyApIFwKKyAgICAgICAg ICAgIHsgXAorICAgICAgICAgICAgICAgIHB2X2luamVjdF9wYWdlX2ZhdWx0KFBGRUNfd3JpdGVf YWNjZXNzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVk IGxvbmcpKHN0a3AgKyAxKSAtIHJjKTsgXAorICAgICAgICAgICAgICAgIHJldHVybjsgXAorICAg ICAgICAgICAgfSBcCisgICAgICAgIH0gd2hpbGUgKCAwICkKKworICAgICAgICBpZiAoICgoYXIg Pj4gMTMpICYgMykgPCAocmVncy0+Y3MgJiAzKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNl bCB8PSAoYXIgPj4gMTMpICYgMzsKKyAgICAgICAgICAgIC8qIElubmVyIHN0YWNrIGtub3duIG9u bHkgZm9yIGtlcm5lbCByaW5nLiAqLworICAgICAgICAgICAgaWYgKCAoc2VsICYgMykgIT0gR1VF U1RfS0VSTkVMX1JQTCh2LT5kb21haW4pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg ICBwdl9pbmplY3RfdHJhcChUUkFQX2dwX2ZhdWx0LCByZWdzKTsKKyAgICAgICAgICAgICAgICBy ZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlc3AgPSB2LT5hcmNoLnB2X3ZjcHUu a2VybmVsX3NwOworICAgICAgICAgICAgc3MgPSB2LT5hcmNoLnB2X3ZjcHUua2VybmVsX3NzOwor ICAgICAgICAgICAgaWYgKCAoc3MgJiAzKSAhPSAoc2VsICYgMykgfHwKKyAgICAgICAgICAgICAg ICAgIXJlYWRfZGVzY3JpcHRvcihzcywgdiwgJmJhc2UsICZsaW1pdCwgJmFyLCAwKSB8fAorICAg ICAgICAgICAgICAgICAoKGFyID4+IDEzKSAmIDMpICE9IChzZWwgJiAzKSB8fAorICAgICAgICAg ICAgICAgICAhKGFyICYgX1NFR01FTlRfUykgfHwKKyAgICAgICAgICAgICAgICAgKGFyICYgX1NF R01FTlRfQ09ERSkgfHwKKyAgICAgICAgICAgICAgICAgIShhciAmIF9TRUdNRU5UX1dSKSApCisg ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHZfaW5qZWN0X2h3X2V4Y2VwdGlvbihUUkFQ X2ludmFsaWRfdHNzLCBzcyAmIH4zKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAg ICAgICB9CisgICAgICAgICAgICBpZiAoICEoYXIgJiBfU0VHTUVOVF9QKSB8fAorICAgICAgICAg ICAgICAgICAhY2hlY2tfc3RhY2tfbGltaXQoYXIsIGxpbWl0LCBlc3AsICg0ICsgbnBhcm0pICog NCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB2X2luamVjdF9od19leGNlcHRp b24oVFJBUF9zdGFja19lcnJvciwgc3MgJiB+Myk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwor ICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RrcCA9ICh1bnNpZ25lZCBpbnQgKikodW5zaWdu ZWQgbG9uZykoKHVuc2lnbmVkIGludCliYXNlICsgZXNwKTsKKyAgICAgICAgICAgIGlmICggIWNv bXBhdF9hY2Nlc3Nfb2soc3RrcCAtIDQgLSBucGFybSwgKDQgKyBucGFybSkgKiA0KSApCisgICAg ICAgICAgICB7CisgICAgICAgICAgICAgICAgcHZfaW5qZWN0X3RyYXAoVFJBUF9ncF9mYXVsdCwg cmVncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAg ICAgcHVzaChyZWdzLT5zcyk7CisgICAgICAgICAgICBwdXNoKHJlZ3MtPnJzcCk7CisgICAgICAg ICAgICBpZiAoIG5wYXJtICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1 bnNpZ25lZCBpbnQgKnVzdGtwOworCisgICAgICAgICAgICAgICAgaWYgKCAhcmVhZF9kZXNjcmlw dG9yKHJlZ3MtPnNzLCB2LCAmYmFzZSwgJmxpbWl0LCAmYXIsIDApIHx8CisgICAgICAgICAgICAg ICAgICAgICAoKGFyID4+IDEzKSAmIDMpICE9IChyZWdzLT5jcyAmIDMpIHx8CisgICAgICAgICAg ICAgICAgICAgICAhKGFyICYgX1NFR01FTlRfUykgfHwKKyAgICAgICAgICAgICAgICAgICAgIChh ciAmIF9TRUdNRU5UX0NPREUpIHx8CisgICAgICAgICAgICAgICAgICAgICAhKGFyICYgX1NFR01F TlRfV1IpIHx8CisgICAgICAgICAgICAgICAgICAgICAhY2hlY2tfc3RhY2tfbGltaXQoYXIsIGxp bWl0LCBlc3AgKyBucGFybSAqIDQsIG5wYXJtICogNCkgKQorICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gcHZfaW5qZWN0X3RyYXAoVFJBUF9ncF9mYXVsdCwgcmVncyk7CisgICAgICAgICAgICAg ICAgdXN0a3AgPSAodW5zaWduZWQgaW50ICopKHVuc2lnbmVkIGxvbmcpCisgICAgICAgICAgICAg ICAgICAgICAgICAoKHVuc2lnbmVkIGludCliYXNlICsgcmVncy0+ZXNwICsgbnBhcm0gKiA0KTsK KyAgICAgICAgICAgICAgICBpZiAoICFjb21wYXRfYWNjZXNzX29rKHVzdGtwIC0gbnBhcm0sIG5w YXJtICogNCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHZfaW5q ZWN0X3RyYXAoVFJBUF9ncF9mYXVsdCwgcmVncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVy bjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAg ICB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwYXJtOworCisgICAgICAgICAg ICAgICAgICAgIC0tdXN0a3A7CisgICAgICAgICAgICAgICAgICAgIHJjID0gX19nZXRfdXNlcihw YXJtLCB1c3RrcCk7CisgICAgICAgICAgICAgICAgICAgIGlmICggcmMgKQorICAgICAgICAgICAg ICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdl9pbmplY3RfcGFnZV9mYXVsdCgw LCAodW5zaWduZWQgbG9uZykodXN0a3AgKyAxKSAtIHJjKTsKKyAgICAgICAgICAgICAgICAgICAg ICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBw dXNoKHBhcm0pOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKCAtLW5wYXJtICk7CisgICAgICAg ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBz ZWwgfD0gKHJlZ3MtPmNzICYgMyk7CisgICAgICAgICAgICBlc3AgPSByZWdzLT5yc3A7CisgICAg ICAgICAgICBzcyA9IHJlZ3MtPnNzOworICAgICAgICAgICAgaWYgKCAhcmVhZF9kZXNjcmlwdG9y KHNzLCB2LCAmYmFzZSwgJmxpbWl0LCAmYXIsIDApIHx8CisgICAgICAgICAgICAgICAgICgoYXIg Pj4gMTMpICYgMykgIT0gKHNlbCAmIDMpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg ICBwdl9pbmplY3RfdHJhcChUUkFQX2dwX2ZhdWx0LCByZWdzKTsKKyAgICAgICAgICAgICAgICBy ZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoICFjaGVja19zdGFja19saW1p dChhciwgbGltaXQsIGVzcCwgMiAqIDQpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg ICBwdl9pbmplY3RfaHdfZXhjZXB0aW9uKFRSQVBfc3RhY2tfZXJyb3IsIDApOworICAgICAgICAg ICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0a3AgPSAodW5zaWdu ZWQgaW50ICopKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBpbnQpYmFzZSArIGVzcCk7CisgICAg ICAgICAgICBpZiAoICFjb21wYXRfYWNjZXNzX29rKHN0a3AgLSAyLCAyICogNCkgKQorICAgICAg ICAgICAgeworICAgICAgICAgICAgICAgIHB2X2luamVjdF90cmFwKFRSQVBfZ3BfZmF1bHQsIHJl Z3MpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor ICAgICAgICBwdXNoKHJlZ3MtPmNzKTsKKyAgICAgICAgcHVzaChyZWdzLT5yaXAgKyBpbnNuX2xl bik7CisjdW5kZWYgcHVzaAorICAgICAgICByZWdzLT5yc3AgPSBlc3A7CisgICAgICAgIHJlZ3Mt PnNzID0gc3M7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc2VsIHw9IChyZWdzLT5jcyAmIDMp OworCisgICAgcmVncy0+Y3MgPSBzZWw7CisgICAgaW5zdHJ1Y3Rpb25fZG9uZShyZWdzLCBvZmYp OworfQorCitpbnQgZW11bGF0ZV9pbnZhbGlkX3JkdHNjcChzdHJ1Y3QgY3B1X3VzZXJfcmVncyAq cmVncykKK3sKKyAgICBjaGFyIG9wY29kZVszXTsKKyAgICB1bnNpZ25lZCBsb25nIGVpcCwgcmM7 CisgICAgc3RydWN0IHZjcHUgKnYgPSBjdXJyZW50OworCisgICAgZWlwID0gcmVncy0+cmlwOwor ICAgIGlmICggKHJjID0gY29weV9mcm9tX3VzZXIob3Bjb2RlLCAoY2hhciAqKWVpcCwgc2l6ZW9m KG9wY29kZSkpKSAhPSAwICkKKyAgICB7CisgICAgICAgIHB2X2luamVjdF9wYWdlX2ZhdWx0KDAs IGVpcCArIHNpemVvZihvcGNvZGUpIC0gcmMpOworICAgICAgICByZXR1cm4gRVhDUkVUX2ZhdWx0 X2ZpeGVkOworICAgIH0KKyAgICBpZiAoIG1lbWNtcChvcGNvZGUsICJceGZceDFceGY5Iiwgc2l6 ZW9mKG9wY29kZSkpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWlwICs9IHNpemVvZihvcGNv ZGUpOworICAgIHB2X3NvZnRfcmR0c2ModiwgcmVncywgMSk7CisgICAgaW5zdHJ1Y3Rpb25fZG9u ZShyZWdzLCBlaXApOworICAgIHJldHVybiBFWENSRVRfZmF1bHRfZml4ZWQ7Cit9CisKK2ludCBl bXVsYXRlX2ZvcmNlZF9pbnZhbGlkX29wKHN0cnVjdCBjcHVfdXNlcl9yZWdzICpyZWdzKQorewor ICAgIGNoYXIgc2lnWzVdLCBpbnN0clsyXTsKKyAgICB1bnNpZ25lZCBsb25nIGVpcCwgcmM7Cisg ICAgc3RydWN0IGNwdWlkX2xlYWYgcmVzOworCisgICAgZWlwID0gcmVncy0+cmlwOworCisgICAg LyogQ2hlY2sgZm9yIGZvcmNlZCBlbXVsYXRpb24gc2lnbmF0dXJlOiB1ZDIgOyAuYXNjaWkgInhl biIuICovCisgICAgaWYgKCAocmMgPSBjb3B5X2Zyb21fdXNlcihzaWcsIChjaGFyICopZWlwLCBz aXplb2Yoc2lnKSkpICE9IDAgKQorICAgIHsKKyAgICAgICAgcHZfaW5qZWN0X3BhZ2VfZmF1bHQo MCwgZWlwICsgc2l6ZW9mKHNpZykgLSByYyk7CisgICAgICAgIHJldHVybiBFWENSRVRfZmF1bHRf Zml4ZWQ7CisgICAgfQorICAgIGlmICggbWVtY21wKHNpZywgIlx4Zlx4YnhlbiIsIHNpemVvZihz aWcpKSApCisgICAgICAgIHJldHVybiAwOworICAgIGVpcCArPSBzaXplb2Yoc2lnKTsKKworICAg IC8qIFdlIG9ubHkgZW11bGF0ZSBDUFVJRC4gKi8KKyAgICBpZiAoICggcmMgPSBjb3B5X2Zyb21f dXNlcihpbnN0ciwgKGNoYXIgKillaXAsIHNpemVvZihpbnN0cikpKSAhPSAwICkKKyAgICB7Cisg ICAgICAgIHB2X2luamVjdF9wYWdlX2ZhdWx0KDAsIGVpcCArIHNpemVvZihpbnN0cikgLSByYyk7 CisgICAgICAgIHJldHVybiBFWENSRVRfZmF1bHRfZml4ZWQ7CisgICAgfQorICAgIGlmICggbWVt Y21wKGluc3RyLCAiXHhmXHhhMiIsIHNpemVvZihpbnN0cikpICkKKyAgICAgICAgcmV0dXJuIDA7 CisKKyAgICAvKiBJZiBjcHVpZCBmYXVsdGluZyBpcyBlbmFibGVkIGFuZCBDUEw+MCBpbmplY3Qg YSAjR1AgaW4gcGxhY2Ugb2YgI1VELiAqLworICAgIGlmICggY3VycmVudC0+YXJjaC5jcHVpZF9m YXVsdGluZyAmJiAhZ3Vlc3Rfa2VybmVsX21vZGUoY3VycmVudCwgcmVncykgKQorICAgIHsKKyAg ICAgICAgcmVncy0+cmlwID0gZWlwOworICAgICAgICBwdl9pbmplY3RfdHJhcChUUkFQX2dwX2Zh dWx0LCByZWdzKTsKKyAgICAgICAgcmV0dXJuIEVYQ1JFVF9mYXVsdF9maXhlZDsKKyAgICB9CisK KyAgICBlaXAgKz0gc2l6ZW9mKGluc3RyKTsKKworICAgIGd1ZXN0X2NwdWlkKGN1cnJlbnQsIHJl Z3MtPmVheCwgcmVncy0+ZWN4LCAmcmVzKTsKKworICAgIHJlZ3MtPnJheCA9IHJlcy5hOworICAg IHJlZ3MtPnJieCA9IHJlcy5iOworICAgIHJlZ3MtPnJjeCA9IHJlcy5jOworICAgIHJlZ3MtPnJk eCA9IHJlcy5kOworCisgICAgaW5zdHJ1Y3Rpb25fZG9uZShyZWdzLCBlaXApOworCisgICAgdHJh Y2VfdHJhcF9vbmVfYWRkcihUUkNfUFZfRk9SQ0VEX0lOVkFMSURfT1AsIHJlZ3MtPnJpcCk7CisK KyAgICByZXR1cm4gRVhDUkVUX2ZhdWx0X2ZpeGVkOworfQorCitpbnQgcHZfZW11bF9jcHVpZCh1 aW50MzJfdCBsZWFmLCB1aW50MzJfdCBzdWJsZWFmLAorICAgICAgICAgICAgICAgICAgc3RydWN0 IGNwdWlkX2xlYWYgKnJlcywgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisgICAg Z3Vlc3RfY3B1aWQoY3VycmVudCwgbGVhZiwgc3VibGVhZiwgcmVzKTsKKworICAgIHJldHVybiBY ODZFTVVMX09LQVk7Cit9CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBtb2RlOiBDCisg KiBjLWZpbGUtc3R5bGU6ICJCU0QiCisgKiBjLWJhc2ljLW9mZnNldDogNAorICogdGFiLXdpZHRo OiA0CisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEv eGVuL2FyY2gveDg2L3RyYXBzLmMgYi94ZW4vYXJjaC94ODYvdHJhcHMuYwppbmRleCAyNjM5YmU3 ODUwLi5hMDc2ZGUyYmU0IDEwMDY0NAotLS0gYS94ZW4vYXJjaC94ODYvdHJhcHMuYworKysgYi94 ZW4vYXJjaC94ODYvdHJhcHMuYwpAQCAtNzcsNiArNzcsNyBAQAogI2luY2x1ZGUgPHB1YmxpYy9h cmNoLXg4Ni9jcHVpZC5oPgogI2luY2x1ZGUgPGFzbS9jcHVpZC5oPgogI2luY2x1ZGUgPHhzbS94 c20uaD4KKyNpbmNsdWRlIDxhc20vcHYvdHJhcHMuaD4KIAogLyoKICAqIG9wdF9ubWk6IG9uZSBv ZiAnaWdub3JlJywgJ2RvbTAnLCBvciAnZmF0YWwnLgpAQCAtNjg0LDUyICs2ODUsNiBAQCB2b2lk IHB2X2luamVjdF9ldmVudChjb25zdCBzdHJ1Y3QgeDg2X2V2ZW50ICpldmVudCkKICAgICB9CiB9 CiAKLXN0YXRpYyB2b2lkIGluc3RydWN0aW9uX2RvbmUoc3RydWN0IGNwdV91c2VyX3JlZ3MgKnJl Z3MsIHVuc2lnbmVkIGxvbmcgcmlwKQotewotICAgIHJlZ3MtPnJpcCA9IHJpcDsKLSAgICByZWdz LT5lZmxhZ3MgJj0gflg4Nl9FRkxBR1NfUkY7Ci0gICAgaWYgKCByZWdzLT5lZmxhZ3MgJiBYODZf RUZMQUdTX1RGICkKLSAgICB7Ci0gICAgICAgIGN1cnJlbnQtPmFyY2guZGVidWdyZWdbNl0gfD0g RFJfU1RFUCB8IERSX1NUQVRVU19SRVNFUlZFRF9PTkU7Ci0gICAgICAgIHB2X2luamVjdF90cmFw KFRSQVBfZGVidWcsIHJlZ3MpOwotICAgIH0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjaGVj a19ndWVzdF9pb19icmVha3BvaW50KHN0cnVjdCB2Y3B1ICp2LAotICAgIHVuc2lnbmVkIGludCBw b3J0LCB1bnNpZ25lZCBpbnQgbGVuKQotewotICAgIHVuc2lnbmVkIGludCB3aWR0aCwgaSwgbWF0 Y2ggPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQ7Ci0KLSAgICBpZiAoICEodi0+YXJjaC5k ZWJ1Z3JlZ1s1XSkgfHwKLSAgICAgICAgICEodi0+YXJjaC5wdl92Y3B1LmN0cmxyZWdbNF0gJiBY ODZfQ1I0X0RFKSApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCA0 OyBpKysgKQotICAgIHsKLSAgICAgICAgaWYgKCAhKHYtPmFyY2guZGVidWdyZWdbNV0gJgotICAg ICAgICAgICAgICAgKDMgPDwgKGkgKiBEUl9FTkFCTEVfU0laRSkpKSApCi0gICAgICAgICAgICBj b250aW51ZTsKLQotICAgICAgICBzdGFydCA9IHYtPmFyY2guZGVidWdyZWdbaV07Ci0gICAgICAg IHdpZHRoID0gMDsKLQotICAgICAgICBzd2l0Y2ggKCAodi0+YXJjaC5kZWJ1Z3JlZ1s3XSA+Pgot ICAgICAgICAgICAgICAgICAgKERSX0NPTlRST0xfU0hJRlQgKyBpICogRFJfQ09OVFJPTF9TSVpF KSkgJiAweGMgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRFJfTEVOXzE6IHdpZHRoID0gMTsg YnJlYWs7Ci0gICAgICAgIGNhc2UgRFJfTEVOXzI6IHdpZHRoID0gMjsgYnJlYWs7Ci0gICAgICAg IGNhc2UgRFJfTEVOXzQ6IHdpZHRoID0gNDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgRFJfTEVOXzg6 IHdpZHRoID0gODsgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIChzdGFydCA8IChw b3J0ICsgbGVuKSkgJiYgKChzdGFydCArIHdpZHRoKSA+IHBvcnQpICkKLSAgICAgICAgICAgIG1h dGNoIHw9IDEgPDwgaTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWF0Y2g7Ci19Ci0KIC8qCiAgKiBD YWxsZWQgZnJvbSBhc20gdG8gc2V0IHVwIHRoZSBNQ0UgdHJhcGJvdW5jZSBpbmZvLgogICogUmV0 dXJucyAwIGlmIG5vIGNhbGxiYWNrIGlzIHNldCB1cCwgZWxzZSAxLgpAQCAtOTk3LDc3ICs5NTIs NiBAQCB2b2lkIGNwdWlkX2h5cGVydmlzb3JfbGVhdmVzKGNvbnN0IHN0cnVjdCB2Y3B1ICp2LCB1 aW50MzJfdCBsZWFmLAogICAgIH0KIH0KIAotc3RhdGljIGludCBlbXVsYXRlX2ludmFsaWRfcmR0 c2NwKHN0cnVjdCBjcHVfdXNlcl9yZWdzICpyZWdzKQotewotICAgIGNoYXIgb3Bjb2RlWzNdOwot ICAgIHVuc2lnbmVkIGxvbmcgZWlwLCByYzsKLSAgICBzdHJ1Y3QgdmNwdSAqdiA9IGN1cnJlbnQ7 Ci0KLSAgICBlaXAgPSByZWdzLT5yaXA7Ci0gICAgaWYgKCAocmMgPSBjb3B5X2Zyb21fdXNlcihv cGNvZGUsIChjaGFyICopZWlwLCBzaXplb2Yob3Bjb2RlKSkpICE9IDAgKQotICAgIHsKLSAgICAg ICAgcHZfaW5qZWN0X3BhZ2VfZmF1bHQoMCwgZWlwICsgc2l6ZW9mKG9wY29kZSkgLSByYyk7Ci0g ICAgICAgIHJldHVybiBFWENSRVRfZmF1bHRfZml4ZWQ7Ci0gICAgfQotICAgIGlmICggbWVtY21w KG9wY29kZSwgIlx4Zlx4MVx4ZjkiLCBzaXplb2Yob3Bjb2RlKSkgKQotICAgICAgICByZXR1cm4g MDsKLSAgICBlaXAgKz0gc2l6ZW9mKG9wY29kZSk7Ci0gICAgcHZfc29mdF9yZHRzYyh2LCByZWdz LCAxKTsKLSAgICBpbnN0cnVjdGlvbl9kb25lKHJlZ3MsIGVpcCk7Ci0gICAgcmV0dXJuIEVYQ1JF VF9mYXVsdF9maXhlZDsKLX0KLQotc3RhdGljIGludCBlbXVsYXRlX2ZvcmNlZF9pbnZhbGlkX29w KHN0cnVjdCBjcHVfdXNlcl9yZWdzICpyZWdzKQotewotICAgIGNoYXIgc2lnWzVdLCBpbnN0clsy XTsKLSAgICB1bnNpZ25lZCBsb25nIGVpcCwgcmM7Ci0gICAgc3RydWN0IGNwdWlkX2xlYWYgcmVz OwotCi0gICAgZWlwID0gcmVncy0+cmlwOwotCi0gICAgLyogQ2hlY2sgZm9yIGZvcmNlZCBlbXVs YXRpb24gc2lnbmF0dXJlOiB1ZDIgOyAuYXNjaWkgInhlbiIuICovCi0gICAgaWYgKCAocmMgPSBj b3B5X2Zyb21fdXNlcihzaWcsIChjaGFyICopZWlwLCBzaXplb2Yoc2lnKSkpICE9IDAgKQotICAg IHsKLSAgICAgICAgcHZfaW5qZWN0X3BhZ2VfZmF1bHQoMCwgZWlwICsgc2l6ZW9mKHNpZykgLSBy Yyk7Ci0gICAgICAgIHJldHVybiBFWENSRVRfZmF1bHRfZml4ZWQ7Ci0gICAgfQotICAgIGlmICgg bWVtY21wKHNpZywgIlx4Zlx4YnhlbiIsIHNpemVvZihzaWcpKSApCi0gICAgICAgIHJldHVybiAw OwotICAgIGVpcCArPSBzaXplb2Yoc2lnKTsKLQotICAgIC8qIFdlIG9ubHkgZW11bGF0ZSBDUFVJ RC4gKi8KLSAgICBpZiAoICggcmMgPSBjb3B5X2Zyb21fdXNlcihpbnN0ciwgKGNoYXIgKillaXAs IHNpemVvZihpbnN0cikpKSAhPSAwICkKLSAgICB7Ci0gICAgICAgIHB2X2luamVjdF9wYWdlX2Zh dWx0KDAsIGVpcCArIHNpemVvZihpbnN0cikgLSByYyk7Ci0gICAgICAgIHJldHVybiBFWENSRVRf ZmF1bHRfZml4ZWQ7Ci0gICAgfQotICAgIGlmICggbWVtY21wKGluc3RyLCAiXHhmXHhhMiIsIHNp emVvZihpbnN0cikpICkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBJZiBjcHVpZCBmYXVs dGluZyBpcyBlbmFibGVkIGFuZCBDUEw+MCBpbmplY3QgYSAjR1AgaW4gcGxhY2Ugb2YgI1VELiAq LwotICAgIGlmICggY3VycmVudC0+YXJjaC5jcHVpZF9mYXVsdGluZyAmJiAhZ3Vlc3Rfa2VybmVs X21vZGUoY3VycmVudCwgcmVncykgKQotICAgIHsKLSAgICAgICAgcmVncy0+cmlwID0gZWlwOwot ICAgICAgICBwdl9pbmplY3RfdHJhcChUUkFQX2dwX2ZhdWx0LCByZWdzKTsKLSAgICAgICAgcmV0 dXJuIEVYQ1JFVF9mYXVsdF9maXhlZDsKLSAgICB9Ci0KLSAgICBlaXAgKz0gc2l6ZW9mKGluc3Ry KTsKLQotICAgIGd1ZXN0X2NwdWlkKGN1cnJlbnQsIHJlZ3MtPmVheCwgcmVncy0+ZWN4LCAmcmVz KTsKLQotICAgIHJlZ3MtPnJheCA9IHJlcy5hOwotICAgIHJlZ3MtPnJieCA9IHJlcy5iOwotICAg IHJlZ3MtPnJjeCA9IHJlcy5jOwotICAgIHJlZ3MtPnJkeCA9IHJlcy5kOwotCi0gICAgaW5zdHJ1 Y3Rpb25fZG9uZShyZWdzLCBlaXApOwotCi0gICAgdHJhY2VfdHJhcF9vbmVfYWRkcihUUkNfUFZf Rk9SQ0VEX0lOVkFMSURfT1AsIHJlZ3MtPnJpcCk7Ci0KLSAgICByZXR1cm4gRVhDUkVUX2ZhdWx0 X2ZpeGVkOwotfQotCiB2b2lkIGRvX2ludmFsaWRfb3Aoc3RydWN0IGNwdV91c2VyX3JlZ3MgKnJl Z3MpCiB7CiAgICAgY29uc3Qgc3RydWN0IGJ1Z19mcmFtZSAqYnVnID0gTlVMTDsKQEAgLTE2MDks MTc2OCArMTQ5Myw2IEBAIGxvbmcgZG9fZnB1X3Rhc2tzd2l0Y2goaW50IHNldCkKICAgICByZXR1 cm4gMDsKIH0KIAotc3RhdGljIGludCByZWFkX2Rlc2NyaXB0b3IodW5zaWduZWQgaW50IHNlbCwK LSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2Y3B1ICp2LAotICAgICAg ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqYmFzZSwKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmxpbWl0LAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgdW5zaWduZWQgaW50ICphciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xf dCBpbnNuX2ZldGNoKQotewotICAgIHN0cnVjdCBkZXNjX3N0cnVjdCBkZXNjOwotCi0gICAgaWYg KCBzZWwgPCA0KQotICAgICAgICBkZXNjLmIgPSBkZXNjLmEgPSAwOwotICAgIGVsc2UgaWYgKCBf X2dldF91c2VyKGRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBk ZXNjX3N0cnVjdCAqKSghKHNlbCAmIDQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA/IEdEVF9WSVJUX1NUQVJUKHYpCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IExEVF9WSVJUX1NUQVJU KHYpKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgKHNlbCA+PiAzKSkgKQotICAgICAgICBy ZXR1cm4gMDsKLSAgICBpZiAoICFpbnNuX2ZldGNoICkKLSAgICAgICAgZGVzYy5iICY9IH5fU0VH TUVOVF9MOwotCi0gICAgKmFyID0gZGVzYy5iICYgMHgwMGYwZmYwMDsKLSAgICBpZiAoICEoZGVz Yy5iICYgX1NFR01FTlRfTCkgKQotICAgIHsKLSAgICAgICAgKmJhc2UgPSAoKGRlc2MuYSA+PiAx NikgKyAoKGRlc2MuYiAmIDB4ZmYpIDw8IDE2KSArCi0gICAgICAgICAgICAgICAgIChkZXNjLmIg JiAweGZmMDAwMDAwKSk7Ci0gICAgICAgICpsaW1pdCA9IChkZXNjLmEgJiAweGZmZmYpIHwgKGRl c2MuYiAmIDB4MDAwZjAwMDApOwotICAgICAgICBpZiAoIGRlc2MuYiAmIF9TRUdNRU5UX0cgKQot ICAgICAgICAgICAgKmxpbWl0ID0gKCgqbGltaXQgKyAxKSA8PCAxMikgLSAxOwotI2lmbmRlZiBO REVCVUcKLSAgICAgICAgaWYgKCBzZWwgPiAzICkKLSAgICAgICAgewotICAgICAgICAgICAgdW5z aWduZWQgaW50IGEsIGw7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHZhbGlkOwotCi0gICAg ICAgICAgICBhc20gdm9sYXRpbGUgKAotICAgICAgICAgICAgICAgICJsYXJsICUyLCUwIDsgc2V0 eiAlMSIKLSAgICAgICAgICAgICAgICA6ICI9ciIgKGEpLCAiPXFtIiAodmFsaWQpIDogInJtIiAo c2VsKSk7Ci0gICAgICAgICAgICBCVUdfT04odmFsaWQgJiYgKChhICYgMHgwMGYwZmYwMCkgIT0g KmFyKSk7Ci0gICAgICAgICAgICBhc20gdm9sYXRpbGUgKAotICAgICAgICAgICAgICAgICJsc2xs ICUyLCUwIDsgc2V0eiAlMSIKLSAgICAgICAgICAgICAgICA6ICI9ciIgKGwpLCAiPXFtIiAodmFs aWQpIDogInJtIiAoc2VsKSk7Ci0gICAgICAgICAgICBCVUdfT04odmFsaWQgJiYgKGwgIT0gKmxp bWl0KSk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAg ICAqYmFzZSA9IDBVTDsKLSAgICAgICAgKmxpbWl0ID0gfjBVTDsKLSAgICB9Ci0KLSAgICByZXR1 cm4gMTsKLX0KLQotc3RhdGljIGludCByZWFkX2dhdGVfZGVzY3JpcHRvcih1bnNpZ25lZCBpbnQg Z2F0ZV9zZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2 Y3B1ICp2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnNl bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqb2ZmLAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmFyKQotewotICAg IHN0cnVjdCBkZXNjX3N0cnVjdCBkZXNjOwotICAgIGNvbnN0IHN0cnVjdCBkZXNjX3N0cnVjdCAq cGRlc2M7Ci0KLQotICAgIHBkZXNjID0gKGNvbnN0IHN0cnVjdCBkZXNjX3N0cnVjdCAqKQotICAg ICAgICAoIShnYXRlX3NlbCAmIDQpID8gR0RUX1ZJUlRfU1RBUlQodikgOiBMRFRfVklSVF9TVEFS VCh2KSkKLSAgICAgICAgKyAoZ2F0ZV9zZWwgPj4gMyk7Ci0gICAgaWYgKCAoZ2F0ZV9zZWwgPCA0 KSB8fAotICAgICAgICAgKChnYXRlX3NlbCA+PSBGSVJTVF9SRVNFUlZFRF9HRFRfQllURSkgJiYg IShnYXRlX3NlbCAmIDQpKSB8fAotICAgICAgICAgX19nZXRfdXNlcihkZXNjLCBwZGVzYykgKQot ICAgICAgICByZXR1cm4gMDsKLQotICAgICpzZWwgPSAoZGVzYy5hID4+IDE2KSAmIDB4MDAwMGZm ZmM7Ci0gICAgKm9mZiA9IChkZXNjLmEgJiAweDAwMDBmZmZmKSB8IChkZXNjLmIgJiAweGZmZmYw MDAwKTsKLSAgICAqYXIgPSBkZXNjLmIgJiAweDAwMDBmZmZmOwotCi0gICAgLyoKLSAgICAgKiBj aGVja19kZXNjcmlwdG9yKCkgY2xlYXJzIHRoZSBEUEwgZmllbGQgYW5kIHN0b3JlcyB0aGUKLSAg ICAgKiBndWVzdCByZXF1ZXN0ZWQgRFBMIGluIHRoZSBzZWxlY3RvcidzIFJQTCBmaWVsZC4KLSAg ICAgKi8KLSAgICBpZiAoICphciAmIF9TRUdNRU5UX0RQTCApCi0gICAgICAgIHJldHVybiAwOwot ICAgICphciB8PSAoZGVzYy5hID4+ICgxNiAtIDEzKSkgJiBfU0VHTUVOVF9EUEw7Ci0KLSAgICBp ZiAoICFpc19wdl8zMmJpdF92Y3B1KHYpICkKLSAgICB7Ci0gICAgICAgIGlmICggKCphciAmIDB4 MWYwMCkgIT0gMHgwYzAwIHx8Ci0gICAgICAgICAgICAgKGdhdGVfc2VsID49IEZJUlNUX1JFU0VS VkVEX0dEVF9CWVRFIC0gOCAmJiAhKGdhdGVfc2VsICYgNCkpIHx8Ci0gICAgICAgICAgICAgX19n ZXRfdXNlcihkZXNjLCBwZGVzYyArIDEpIHx8Ci0gICAgICAgICAgICAgKGRlc2MuYiAmIDB4MWYw MCkgKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgKm9mZiB8PSAodW5zaWduZWQg bG9uZylkZXNjLmEgPDwgMzI7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHN3aXRj aCAoICphciAmIDB4MWYwMCApCi0gICAgewotICAgIGNhc2UgMHgwNDAwOgotICAgICAgICAqb2Zm ICY9IDB4ZmZmZjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDBjMDA6Ci0gICAgICAgIGJy ZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVy biAxOwotfQotCi1zdGF0aWMgaW50IHB2X2VtdWxfdmlydF90b19saW5lYXIodW5zaWduZWQgbG9u ZyBiYXNlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsIHVuc2lnbmVkIGxvbmcgbGltaXQsCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSB4ODZfc2VnbWVudCBzZWcsCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqYWRkcikK LXsKLSAgICBpbnQgcmMgPSBYODZFTVVMX09LQVk7Ci0KLSAgICAqYWRkciA9IGJhc2UgKyBvZmZz ZXQ7Ci0KLSAgICBpZiAoIGN0eHQtPmFkZHJfc2l6ZSA8IDY0ICkKLSAgICB7Ci0gICAgICAgIGlm ICggbGltaXQgPCBieXRlcyAtIDEgfHwgb2Zmc2V0ID4gbGltaXQgLSBieXRlcyArIDEgKQotICAg ICAgICAgICAgcmMgPSBYODZFTVVMX0VYQ0VQVElPTjsKLSAgICAgICAgKmFkZHIgPSAodWludDMy X3QpKmFkZHI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAhX19hZGRyX29rKCphZGRyKSApCi0gICAg ICAgIHJjID0gWDg2RU1VTF9FWENFUFRJT047Ci0KLSAgICBpZiAoIHVubGlrZWx5KHJjID09IFg4 NkVNVUxfRVhDRVBUSU9OKSApCi0gICAgICAgIHg4Nl9lbXVsX2h3X2V4Y2VwdGlvbihzZWcgIT0g eDg2X3NlZ19zcyA/IFRSQVBfZ3BfZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDogVFJBUF9zdGFja19lcnJvciwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDAsIGN0eHQpOwotCi0gICAgcmV0dXJuIHJjOwotfQotCi1zdHJ1Y3QgcHJp dl9vcF9jdHh0IHsKLSAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCBjdHh0OwotICAgIHN0cnVj dCB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwgbGltaXQ7Ci0gICAgfSBjczsKLSAgICBj aGFyICppb19lbXVsX3N0dWI7Ci0gICAgdW5zaWduZWQgaW50IGJwbWF0Y2g7Ci0gICAgdW5zaWdu ZWQgaW50IHRzYzsKLSNkZWZpbmUgVFNDX0JBU0UgMQotI2RlZmluZSBUU0NfQVVYIDIKLX07Ci0K LXN0YXRpYyBpbnQgcHJpdl9vcF9pbnNuX2ZldGNoKGVudW0geDg2X3NlZ21lbnQgc2VnLAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKLXsKLSAgICBjb25zdCBzdHJ1Y3Qg cHJpdl9vcF9jdHh0ICpwb2MgPQotICAgICAgICBjb250YWluZXJfb2YoY3R4dCwgc3RydWN0IHBy aXZfb3BfY3R4dCwgY3R4dCk7Ci0gICAgdW5zaWduZWQgaW50IHJjOwotICAgIHVuc2lnbmVkIGxv bmcgYWRkciA9IHBvYy0+Y3MuYmFzZSArIG9mZnNldDsKLQotICAgIEFTU0VSVChzZWcgPT0geDg2 X3NlZ19jcyk7Ci0KLSAgICAvKiBXZSBkb24ndCBtZWFuIHRvIGVtdWxhdGUgYW55IGJyYW5jaGVz LiAqLwotICAgIGlmICggIWJ5dGVzICkKLSAgICAgICAgcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVB QkxFOwotCi0gICAgcmMgPSBwdl9lbXVsX3ZpcnRfdG9fbGluZWFyKHBvYy0+Y3MuYmFzZSwgb2Zm c2V0LCBieXRlcywgcG9jLT5jcy5saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgeDg2X3NlZ19jcywgY3R4dCwgJmFkZHIpOwotICAgIGlmICggcmMgIT0gWDg2RU1VTF9PS0FZ ICkKLSAgICAgICAgcmV0dXJuIHJjOwotCi0gICAgaWYgKCAocmMgPSBfX2NvcHlfZnJvbV91c2Vy KHBfZGF0YSwgKHZvaWQgKilhZGRyLCBieXRlcykpICE9IDAgKQotICAgIHsKLSAgICAgICAgLyoK LSAgICAgICAgICogVE9ETzogVGhpcyBzaG91bGQgcmVwb3J0IFBGRUNfaW5zbl9mZXRjaCB3aGVu IGdvYy0+aW5zbl9mZXRjaCAmJgotICAgICAgICAgKiBjcHVfaGFzX254LCBidXQgd2UnZCB0aGVu IG5lZWQgYSAiZmV0Y2giIHZhcmlhbnQgb2YKLSAgICAgICAgICogX19jb3B5X2Zyb21fdXNlcigp IHJlc3BlY3RpbmcgTlgsIFNNRVAsIGFuZCBwcm90ZWN0aW9uIGtleXMuCi0gICAgICAgICAqLwot ICAgICAgICB4ODZfZW11bF9wYWdlZmF1bHQoMCwgYWRkciArIGJ5dGVzIC0gcmMsIGN0eHQpOwot ICAgICAgICByZXR1cm4gWDg2RU1VTF9FWENFUFRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIFg4 NkVNVUxfT0tBWTsKLX0KLQotc3RhdGljIGludCBwcml2X29wX3JlYWRfc2VnbWVudChlbnVtIHg4 Nl9zZWdtZW50IHNlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNl Z21lbnRfcmVnaXN0ZXIgKnJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ry dWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCi17Ci0gICAgLyogQ2hlY2sgaWYgdGhpcyBpcyBh biBhdHRlbXB0IHRvIGFjY2VzcyB0aGUgSS9PIGJpdG1hcC4gKi8KLSAgICBpZiAoIHNlZyA9PSB4 ODZfc2VnX3RyICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoIGN0eHQtPm9wY29kZSApCi0gICAg ICAgIHsKLSAgICAgICAgY2FzZSAweDZjIC4uLiAweDZmOiAvKiBpbnMgLyBvdXRzICovCi0gICAg ICAgIGNhc2UgMHhlNCAuLi4gMHhlNzogLyogaW4gLyBvdXQgKGltbWVkaWF0ZSBwb3J0KSAqLwot ICAgICAgICBjYXNlIDB4ZWMgLi4uIDB4ZWY6IC8qIGluIC8gb3V0IChwb3J0IGluICVkeCkgKi8K LSAgICAgICAgICAgIC8qIERlZmVyIHRoZSBjaGVjayB0byBwcml2X29wX3tyZWFkLHdyaXRlfV9p bygpLiAqLwotICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxfRE9ORTsKLSAgICAgICAgfQotICAg IH0KLQotICAgIGlmICggY3R4dC0+YWRkcl9zaXplIDwgNjQgKQotICAgIHsKLSAgICAgICAgdW5z aWduZWQgbG9uZyBsaW1pdDsKLSAgICAgICAgdW5zaWduZWQgaW50IHNlbCwgYXI7Ci0KLSAgICAg ICAgc3dpdGNoICggc2VnICkKLSAgICAgICAgewotICAgICAgICBjYXNlIHg4Nl9zZWdfY3M6IHNl bCA9IGN0eHQtPnJlZ3MtPmNzOyBicmVhazsKLSAgICAgICAgY2FzZSB4ODZfc2VnX2RzOiBzZWwg PSByZWFkX3NyZWcoZHMpOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgeDg2X3NlZ19lczogc2VsID0g cmVhZF9zcmVnKGVzKTsgIGJyZWFrOwotICAgICAgICBjYXNlIHg4Nl9zZWdfZnM6IHNlbCA9IHJl YWRfc3JlZyhmcyk7ICBicmVhazsKLSAgICAgICAgY2FzZSB4ODZfc2VnX2dzOiBzZWwgPSByZWFk X3NyZWcoZ3MpOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgeDg2X3NlZ19zczogc2VsID0gY3R4dC0+ cmVncy0+c3M7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gWDg2RU1VTF9VTkhBTkRM RUFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICFyZWFkX2Rlc2NyaXB0b3Ioc2VsLCBj dXJyZW50LCAmcmVnLT5iYXNlLCAmbGltaXQsICZhciwgMCkgKQotICAgICAgICAgICAgcmV0dXJu IFg4NkVNVUxfVU5IQU5ETEVBQkxFOwotCi0gICAgICAgIHJlZy0+bGltaXQgPSBsaW1pdDsKLSAg ICAgICAgcmVnLT5hdHRyLmJ5dGVzID0gYXIgPj4gODsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsK LSAgICAgICAgc3dpdGNoICggc2VnICkKLSAgICAgICAgewotICAgICAgICBkZWZhdWx0OgotICAg ICAgICAgICAgaWYgKCAhaXNfeDg2X3VzZXJfc2VnbWVudChzZWcpICkKLSAgICAgICAgICAgICAg ICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7Ci0gICAgICAgICAgICByZWctPmJhc2UgPSAw OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgeDg2X3NlZ19mczoKLSAgICAgICAg ICAgIHJlZy0+YmFzZSA9IHJkZnNiYXNlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg Y2FzZSB4ODZfc2VnX2dzOgotICAgICAgICAgICAgcmVnLT5iYXNlID0gcmRnc2Jhc2UoKTsKLSAg ICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVnLT5saW1pdCA9IH4wVTsK LQotICAgICAgICByZWctPmF0dHIuYnl0ZXMgPSAwOwotICAgICAgICByZWctPmF0dHIuZmllbGRz LnR5cGUgPSBfU0VHTUVOVF9XUiA+PiA4OwotICAgICAgICBpZiAoIHNlZyA9PSB4ODZfc2VnX2Nz ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVnLT5hdHRyLmZpZWxkcy50eXBlIHw9IF9TRUdN RU5UX0NPREUgPj4gODsKLSAgICAgICAgICAgIHJlZy0+YXR0ci5maWVsZHMubCA9IDE7Ci0gICAg ICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVnLT5hdHRyLmZpZWxkcy5kYiA9IDE7 Ci0gICAgICAgIHJlZy0+YXR0ci5maWVsZHMucyAgID0gMTsKLSAgICAgICAgcmVnLT5hdHRyLmZp ZWxkcy5kcGwgPSAzOwotICAgICAgICByZWctPmF0dHIuZmllbGRzLnAgICA9IDE7Ci0gICAgICAg IHJlZy0+YXR0ci5maWVsZHMuZyAgID0gMTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEZvciB4 ODZfZW11bGF0ZS5jJ3MgbW9kZV9yaW5nMCgpIHRvIHdvcmssIGZha2UgYSBEUEwgb2YgemVyby4K LSAgICAgKiBBbHNvIGRvIHRoaXMgZm9yIGNvbnNpc3RlbmN5IGZvciBub24tY29uZm9ybWluZyBj b2RlIHNlZ21lbnRzLgotICAgICAqLwotICAgIGlmICggKHNlZyA9PSB4ODZfc2VnX3NzIHx8Ci0g ICAgICAgICAgKHNlZyA9PSB4ODZfc2VnX2NzICYmCi0gICAgICAgICAgICEocmVnLT5hdHRyLmZp ZWxkcy50eXBlICYgKF9TRUdNRU5UX0VDID4+IDgpKSkpICYmCi0gICAgICAgICBndWVzdF9rZXJu ZWxfbW9kZShjdXJyZW50LCBjdHh0LT5yZWdzKSApCi0gICAgICAgIHJlZy0+YXR0ci5maWVsZHMu ZHBsID0gMDsKLQotICAgIHJldHVybiBYODZFTVVMX09LQVk7Ci19Ci0KLS8qIFBlcmZvcm0gSU9Q TCBjaGVjayBiZXR3ZWVuIHRoZSB2Y3B1J3Mgc2hhZG93ZWQgSU9QTCwgYW5kIHRoZSBhc3N1bWVk IGNwbC4gKi8KLXN0YXRpYyBib29sX3QgaW9wbF9vayhjb25zdCBzdHJ1Y3QgdmNwdSAqdiwgY29u c3Qgc3RydWN0IGNwdV91c2VyX3JlZ3MgKnJlZ3MpCi17Ci0gICAgdW5zaWduZWQgaW50IGNwbCA9 IGd1ZXN0X2tlcm5lbF9tb2RlKHYsIHJlZ3MpID8KLSAgICAgICAgKFZNX0FTU0lTVCh2LT5kb21h aW4sIGFyY2hpdGVjdHVyYWxfaW9wbCkgPyAwIDogMSkgOiAzOwotCi0gICAgQVNTRVJUKCh2LT5h cmNoLnB2X3ZjcHUuaW9wbCAmIH5YODZfRUZMQUdTX0lPUEwpID09IDApOwotCi0gICAgcmV0dXJu IElPUEwoY3BsKSA8PSB2LT5hcmNoLnB2X3ZjcHUuaW9wbDsKLX0KLQotLyogSGFzIHRoZSBndWVz dCByZXF1ZXN0ZWQgc3VmZmljaWVudCBwZXJtaXNzaW9uIGZvciB0aGlzIEkvTyBhY2Nlc3M/ICov Ci1zdGF0aWMgaW50IGd1ZXN0X2lvX29rYXkoCi0gICAgdW5zaWduZWQgaW50IHBvcnQsIHVuc2ln bmVkIGludCBieXRlcywKLSAgICBzdHJ1Y3QgdmNwdSAqdiwgc3RydWN0IGNwdV91c2VyX3JlZ3Mg KnJlZ3MpCi17Ci0gICAgLyogSWYgaW4gdXNlciBtb2RlLCBzd2l0Y2ggdG8ga2VybmVsIG1vZGUg anVzdCB0byByZWFkIEkvTyBiaXRtYXAuICovCi0gICAgaW50IHVzZXJfbW9kZSA9ICEodi0+YXJj aC5mbGFncyAmIFRGX2tlcm5lbF9tb2RlKTsKLSNkZWZpbmUgVE9HR0xFX01PREUoKSBpZiAoIHVz ZXJfbW9kZSApIHRvZ2dsZV9ndWVzdF9tb2RlKHYpCi0KLSAgICBpZiAoIGlvcGxfb2sodiwgcmVn cykgKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGlmICggdi0+YXJjaC5wdl92Y3B1LmlvYm1w X2xpbWl0ID4gKHBvcnQgKyBieXRlcykgKQotICAgIHsKLSAgICAgICAgdW5pb24geyB1aW50OF90 IGJ5dGVzWzJdOyB1aW50MTZfdCBtYXNrOyB9IHg7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICog R3JhYiBwZXJtaXNzaW9uIGJ5dGVzIGZyb20gZ3Vlc3Qgc3BhY2UuIEluYWNjZXNzaWJsZSBieXRl cyBhcmUKLSAgICAgICAgICogcmVhZCBhcyAweGZmIChubyBhY2Nlc3MgYWxsb3dlZCkuCi0gICAg ICAgICAqLwotICAgICAgICBUT0dHTEVfTU9ERSgpOwotICAgICAgICBzd2l0Y2ggKCBfX2NvcHlf ZnJvbV9ndWVzdF9vZmZzZXQoeC5ieXRlcywgdi0+YXJjaC5wdl92Y3B1LmlvYm1wLAotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydD4+MywgMikgKQotICAgICAg ICB7Ci0gICAgICAgIGRlZmF1bHQ6IHguYnl0ZXNbMF0gPSB+MDsKLSAgICAgICAgICAgIC8qIGZh bGx0aHJvdWdoICovCi0gICAgICAgIGNhc2UgMTogIHguYnl0ZXNbMV0gPSB+MDsKLSAgICAgICAg ICAgIC8qIGZhbGx0aHJvdWdoICovCi0gICAgICAgIGNhc2UgMDogIGJyZWFrOwotICAgICAgICB9 Ci0gICAgICAgIFRPR0dMRV9NT0RFKCk7Ci0KLSAgICAgICAgaWYgKCAoeC5tYXNrICYgKCgoMTw8 Ynl0ZXMpLTEpIDw8IChwb3J0JjcpKSkgPT0gMCApCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAg ICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogSGFzIHRoZSBhZG1pbmlzdHJhdG9yIGdyYW50 ZWQgc3VmZmljaWVudCBwZXJtaXNzaW9uIGZvciB0aGlzIEkvTyBhY2Nlc3M/ICovCi1zdGF0aWMg Ym9vbF90IGFkbWluX2lvX29rYXkodW5zaWduZWQgaW50IHBvcnQsIHVuc2lnbmVkIGludCBieXRl cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZG9tYWluICpkKQot ewotICAgIC8qCi0gICAgICogUG9ydCAweGNmOCAoQ09ORklHX0FERFJFU1MpIGlzIG9ubHkgdmlz aWJsZSBmb3IgRFdPUkQgYWNjZXNzZXMuCi0gICAgICogV2UgbmV2ZXIgcGVybWl0IGRpcmVjdCBh Y2Nlc3MgdG8gdGhhdCByZWdpc3Rlci4KLSAgICAgKi8KLSAgICBpZiAoIChwb3J0ID09IDB4Y2Y4 KSAmJiAoYnl0ZXMgPT0gNCkgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIFdlIGFsc28g bmV2ZXIgcGVybWl0IGRpcmVjdCBhY2Nlc3MgdG8gdGhlIFJUQy9DTU9TIHJlZ2lzdGVycy4gKi8K LSAgICBpZiAoICgocG9ydCAmIH4xKSA9PSBSVENfUE9SVCgwKSkgKQotICAgICAgICByZXR1cm4g MDsKLQotICAgIHJldHVybiBpb3BvcnRzX2FjY2Vzc19wZXJtaXR0ZWQoZCwgcG9ydCwgcG9ydCAr IGJ5dGVzIC0gMSk7Ci19Ci0KLXN0YXRpYyBib29sX3QgcGNpX2NmZ19vayhzdHJ1Y3QgZG9tYWlu ICpjdXJyZCwgdW5zaWduZWQgaW50IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVu c2lnbmVkIGludCBzaXplLCB1aW50MzJfdCAqd3JpdGUpCi17Ci0gICAgdWludDMyX3QgbWFjaGlu ZV9iZGY7Ci0KLSAgICBpZiAoICFpc19oYXJkd2FyZV9kb21haW4oY3VycmQpICkKLSAgICAgICAg cmV0dXJuIDA7Ci0KLSAgICBpZiAoICFDRjhfRU5BQkxFRChjdXJyZC0+YXJjaC5wY2lfY2Y4KSAp Ci0gICAgICAgIHJldHVybiAxOwotCi0gICAgbWFjaGluZV9iZGYgPSBDRjhfQkRGKGN1cnJkLT5h cmNoLnBjaV9jZjgpOwotICAgIGlmICggd3JpdGUgKQotICAgIHsKLSAgICAgICAgY29uc3QgdW5z aWduZWQgbG9uZyAqcm9fbWFwID0gcGNpX2dldF9yb19tYXAoMCk7Ci0KLSAgICAgICAgaWYgKCBy b19tYXAgJiYgdGVzdF9iaXQobWFjaGluZV9iZGYsIHJvX21hcCkgKQotICAgICAgICAgICAgcmV0 dXJuIDA7Ci0gICAgfQotICAgIHN0YXJ0IHw9IENGOF9BRERSX0xPKGN1cnJkLT5hcmNoLnBjaV9j ZjgpOwotICAgIC8qIEFNRCBleHRlbmRlZCBjb25maWd1cmF0aW9uIHNwYWNlIGFjY2Vzcz8gKi8K LSAgICBpZiAoIENGOF9BRERSX0hJKGN1cnJkLT5hcmNoLnBjaV9jZjgpICYmCi0gICAgICAgICBi b290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQgJiYKLSAgICAgICAgIGJv b3RfY3B1X2RhdGEueDg2ID49IDB4MTAgJiYgYm9vdF9jcHVfZGF0YS54ODYgPD0gMHgxNyApCi0g ICAgewotICAgICAgICB1aW50NjRfdCBtc3JfdmFsOwotCi0gICAgICAgIGlmICggcmRtc3Jfc2Fm ZShNU1JfQU1ENjRfTkJfQ0ZHLCBtc3JfdmFsKSApCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAg ICAgICAgaWYgKCBtc3JfdmFsICYgKDFVTEwgPDwgQU1ENjRfTkJfQ0ZHX0NGOF9FWFRfRU5BQkxF X0JJVCkgKQotICAgICAgICAgICAgc3RhcnQgfD0gQ0Y4X0FERFJfSEkoY3VycmQtPmFyY2gucGNp X2NmOCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICF3cml0ZSA/Ci0gICAgICAgICAgIHhzbV9wY2lf Y29uZmlnX3Blcm1pc3Npb24oWFNNX0hPT0ssIGN1cnJkLCBtYWNoaW5lX2JkZiwKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgc3RhcnQgKyBzaXplIC0gMSwgMCkg PT0gMCA6Ci0gICAgICAgICAgIHBjaV9jb25mX3dyaXRlX2ludGVyY2VwdCgwLCBtYWNoaW5lX2Jk Ziwgc3RhcnQsIHNpemUsIHdyaXRlKSA+PSAwOwotfQotCi11aW50MzJfdCBndWVzdF9pb19yZWFk KHVuc2lnbmVkIGludCBwb3J0LCB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0gICAgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBkb21haW4gKmN1cnJkKQotewotICAgIHVpbnQzMl90IGRhdGEgPSAwOwot ICAgIHVuc2lnbmVkIGludCBzaGlmdCA9IDA7Ci0KLSAgICBpZiAoIGFkbWluX2lvX29rYXkocG9y dCwgYnl0ZXMsIGN1cnJkKSApCi0gICAgewotICAgICAgICBzd2l0Y2ggKCBieXRlcyApCi0gICAg ICAgIHsKLSAgICAgICAgY2FzZSAxOiByZXR1cm4gaW5iKHBvcnQpOwotICAgICAgICBjYXNlIDI6 IHJldHVybiBpbncocG9ydCk7Ci0gICAgICAgIGNhc2UgNDogcmV0dXJuIGlubChwb3J0KTsKLSAg ICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlICggYnl0ZXMgIT0gMCApCi0gICAgewotICAgICAg ICB1bnNpZ25lZCBpbnQgc2l6ZSA9IDE7Ci0gICAgICAgIHVpbnQzMl90IHN1Yl9kYXRhID0gfjA7 Ci0KLSAgICAgICAgaWYgKCAocG9ydCA9PSAweDQyKSB8fCAocG9ydCA9PSAweDQzKSB8fCAocG9y dCA9PSAweDYxKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1Yl9kYXRhID0gcHZfcGl0X2hh bmRsZXIocG9ydCwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHBvcnQgPT0g UlRDX1BPUlQoMCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdWJfZGF0YSA9IGN1cnJkLT5h cmNoLmNtb3NfaWR4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAocG9ydCA9PSBSVENf UE9SVCgxKSkgJiYKLSAgICAgICAgICAgICAgICAgIGlvcG9ydHNfYWNjZXNzX3Blcm1pdHRlZChj dXJyZCwgUlRDX1BPUlQoMCksIFJUQ19QT1JUKDEpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAg IHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZy dGNfbG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgb3V0YihjdXJyZC0+YXJjaC5jbW9zX2lkeCAm IDB4N2YsIFJUQ19QT1JUKDApKTsKLSAgICAgICAgICAgIHN1Yl9kYXRhID0gaW5iKFJUQ19QT1JU KDEpKTsKLSAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFn cyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIChwb3J0ID09IDB4Y2Y4KSAmJiAoYnl0 ZXMgPT0gNCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplID0gNDsKLSAgICAgICAgICAg IHN1Yl9kYXRhID0gY3VycmQtPmFyY2gucGNpX2NmODsKLSAgICAgICAgfQotICAgICAgICBlbHNl IGlmICggKHBvcnQgJiAweGZmZmMpID09IDB4Y2ZjICkKLSAgICAgICAgewotICAgICAgICAgICAg c2l6ZSA9IG1pbihieXRlcywgNCAtIChwb3J0ICYgMykpOwotICAgICAgICAgICAgaWYgKCBzaXpl ID09IDMgKQotICAgICAgICAgICAgICAgIHNpemUgPSAyOwotICAgICAgICAgICAgaWYgKCBwY2lf Y2ZnX29rKGN1cnJkLCBwb3J0ICYgMywgc2l6ZSwgTlVMTCkgKQotICAgICAgICAgICAgICAgIHN1 Yl9kYXRhID0gcGNpX2NvbmZfcmVhZChjdXJyZC0+YXJjaC5wY2lfY2Y4LCBwb3J0ICYgMywgc2l6 ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHNpemUgPT0gNCApCi0gICAgICAgICAgICBy ZXR1cm4gc3ViX2RhdGE7Ci0KLSAgICAgICAgZGF0YSB8PSAoc3ViX2RhdGEgJiAoKDF1IDw8IChz aXplICogOCkpIC0gMSkpIDw8IHNoaWZ0OwotICAgICAgICBzaGlmdCArPSBzaXplICogODsKLSAg ICAgICAgcG9ydCArPSBzaXplOwotICAgICAgICBieXRlcyAtPSBzaXplOwotICAgIH0KLQotICAg IHJldHVybiBkYXRhOwotfQotCi12b2lkIGd1ZXN0X2lvX3dyaXRlKHVuc2lnbmVkIGludCBwb3J0 LCB1bnNpZ25lZCBpbnQgYnl0ZXMsIHVpbnQzMl90IGRhdGEsCi0gICAgICAgICAgICAgICAgICAg IHN0cnVjdCBkb21haW4gKmN1cnJkKQotewotICAgIGlmICggYWRtaW5faW9fb2theShwb3J0LCBi eXRlcywgY3VycmQpICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoIGJ5dGVzICkgewotICAgICAg ICBjYXNlIDE6Ci0gICAgICAgICAgICBvdXRiKCh1aW50OF90KWRhdGEsIHBvcnQpOwotICAgICAg ICAgICAgaWYgKCBwdl9wb3N0X291dGJfaG9vayApCi0gICAgICAgICAgICAgICAgcHZfcG9zdF9v dXRiX2hvb2socG9ydCwgKHVpbnQ4X3QpZGF0YSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg ICAgY2FzZSAyOgotICAgICAgICAgICAgb3V0dygodWludDE2X3QpZGF0YSwgcG9ydCk7Ci0gICAg ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgb3V0bChkYXRhLCBw b3J0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAg ICB9Ci0KLSAgICB3aGlsZSAoIGJ5dGVzICE9IDAgKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQg aW50IHNpemUgPSAxOwotCi0gICAgICAgIGlmICggKHBvcnQgPT0gMHg0MikgfHwgKHBvcnQgPT0g MHg0MykgfHwgKHBvcnQgPT0gMHg2MSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdl9waXRf aGFuZGxlcihwb3J0LCAodWludDhfdClkYXRhLCAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNl IGlmICggcG9ydCA9PSBSVENfUE9SVCgwKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJk LT5hcmNoLmNtb3NfaWR4ID0gZGF0YTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggKHBv cnQgPT0gUlRDX1BPUlQoMSkpICYmCi0gICAgICAgICAgICAgICAgICBpb3BvcnRzX2FjY2Vzc19w ZXJtaXR0ZWQoY3VycmQsIFJUQ19QT1JUKDApLCBSVENfUE9SVCgxKSkgKQotICAgICAgICB7Ci0g ICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gICAgICAgICAgICBpZiAoIHB2X3J0 Y19oYW5kbGVyICkKLSAgICAgICAgICAgICAgICBwdl9ydGNfaGFuZGxlcihjdXJyZC0+YXJjaC5j bW9zX2lkeCAmIDB4N2YsIGRhdGEpOwotICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnJ0 Y19sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICBvdXRiKGN1cnJkLT5hcmNoLmNtb3NfaWR4ICYg MHg3ZiwgUlRDX1BPUlQoMCkpOwotICAgICAgICAgICAgb3V0YihkYXRhLCBSVENfUE9SVCgxKSk7 Ci0gICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOwot ICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAocG9ydCA9PSAweGNmOCkgJiYgKGJ5dGVzID09 IDQpICkKLSAgICAgICAgewotICAgICAgICAgICAgc2l6ZSA9IDQ7Ci0gICAgICAgICAgICBjdXJy ZC0+YXJjaC5wY2lfY2Y4ID0gZGF0YTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggKHBv cnQgJiAweGZmZmMpID09IDB4Y2ZjICkKLSAgICAgICAgewotICAgICAgICAgICAgc2l6ZSA9IG1p bihieXRlcywgNCAtIChwb3J0ICYgMykpOwotICAgICAgICAgICAgaWYgKCBzaXplID09IDMgKQot ICAgICAgICAgICAgICAgIHNpemUgPSAyOwotICAgICAgICAgICAgaWYgKCBwY2lfY2ZnX29rKGN1 cnJkLCBwb3J0ICYgMywgc2l6ZSwgJmRhdGEpICkKLSAgICAgICAgICAgICAgICBwY2lfY29uZl93 cml0ZShjdXJyZC0+YXJjaC5wY2lfY2Y4LCBwb3J0ICYgMywgc2l6ZSwgZGF0YSk7Ci0gICAgICAg IH0KLQotICAgICAgICBpZiAoIHNpemUgPT0gNCApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAg ICAgICAgcG9ydCArPSBzaXplOwotICAgICAgICBieXRlcyAtPSBzaXplOwotICAgICAgICBkYXRh ID4+PSBzaXplICogODsKLSAgICB9Ci19Ci0KLS8qIEkvTyBlbXVsYXRpb24gc3VwcG9ydC4gSGVs cGVyIHJvdXRpbmVzIGZvciwgYW5kIHR5cGUgb2YsIHRoZSBzdGFjayBzdHViLiovCi12b2lkIGhv c3RfdG9fZ3Vlc3RfZ3ByX3N3aXRjaChzdHJ1Y3QgY3B1X3VzZXJfcmVncyAqKTsKLXVuc2lnbmVk IGxvbmcgZ3Vlc3RfdG9faG9zdF9ncHJfc3dpdGNoKHVuc2lnbmVkIGxvbmcpOwotCi12b2lkICgq cHZfcG9zdF9vdXRiX2hvb2spKHVuc2lnbmVkIGludCBwb3J0LCB1OCB2YWx1ZSk7Ci0KLXR5cGVk ZWYgdm9pZCBpb19lbXVsX3N0dWJfdChzdHJ1Y3QgY3B1X3VzZXJfcmVncyAqKTsKLQotc3RhdGlj IGlvX2VtdWxfc3R1Yl90ICppb19lbXVsX3N0dWJfc2V0dXAoc3RydWN0IHByaXZfb3BfY3R4dCAq Y3R4dCwgdTggb3Bjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdW5zaWduZWQgaW50IHBvcnQsIHVuc2lnbmVkIGludCBieXRlcykKLXsKLSAgICBpZiAoICFj dHh0LT5pb19lbXVsX3N0dWIgKQotICAgICAgICBjdHh0LT5pb19lbXVsX3N0dWIgPSBtYXBfZG9t YWluX3BhZ2UoX21mbih0aGlzX2NwdShzdHVicy5tZm4pKSkgKwotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXNfY3B1KHN0dWJzLmFkZHIpICYKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+UEFHRV9NQVNLKSArCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFVCX0JVRl9TSVpF IC8gMjsKLQotICAgIC8qIG1vdnEgJGhvc3RfdG9fZ3Vlc3RfZ3ByX3N3aXRjaCwlcmN4ICovCi0g ICAgY3R4dC0+aW9fZW11bF9zdHViWzBdID0gMHg0ODsKLSAgICBjdHh0LT5pb19lbXVsX3N0dWJb MV0gPSAweGI5OwotICAgICoodm9pZCAqKikmY3R4dC0+aW9fZW11bF9zdHViWzJdID0gKHZvaWQg Kilob3N0X3RvX2d1ZXN0X2dwcl9zd2l0Y2g7Ci0gICAgLyogY2FsbHEgKiVyY3ggKi8KLSAgICBj dHh0LT5pb19lbXVsX3N0dWJbMTBdID0gMHhmZjsKLSAgICBjdHh0LT5pb19lbXVsX3N0dWJbMTFd ID0gMHhkMTsKLSAgICAvKiBkYXRhMTYgb3Igbm9wICovCi0gICAgY3R4dC0+aW9fZW11bF9zdHVi WzEyXSA9IChieXRlcyAhPSAyKSA/IDB4OTAgOiAweDY2OwotICAgIC8qIDxpby1hY2Nlc3Mgb3Bj b2RlPiAqLwotICAgIGN0eHQtPmlvX2VtdWxfc3R1YlsxM10gPSBvcGNvZGU7Ci0gICAgLyogaW1t OCBvciBub3AgKi8KLSAgICBjdHh0LT5pb19lbXVsX3N0dWJbMTRdID0gIShvcGNvZGUgJiA4KSA/ IHBvcnQgOiAweDkwOwotICAgIC8qIHJldCAoanVtcHMgdG8gZ3Vlc3RfdG9faG9zdF9ncHJfc3dp dGNoKSAqLwotICAgIGN0eHQtPmlvX2VtdWxfc3R1YlsxNV0gPSAweGMzOwotICAgIEJVSUxEX0JV R19PTihTVFVCX0JVRl9TSVpFIC8gMiA8IDE2KTsKLQotICAgIGlmICggaW9lbXVsX2hhbmRsZV9x dWlyayApCi0gICAgICAgIGlvZW11bF9oYW5kbGVfcXVpcmsob3Bjb2RlLCAmY3R4dC0+aW9fZW11 bF9zdHViWzEyXSwgY3R4dC0+Y3R4dC5yZWdzKTsKLQotICAgIC8qIEhhbmR5IGZ1bmN0aW9uLXR5 cGVkIHBvaW50ZXIgdG8gdGhlIHN0dWIuICovCi0gICAgcmV0dXJuICh2b2lkICopKHRoaXNfY3B1 KHN0dWJzLmFkZHIpICsgU1RVQl9CVUZfU0laRSAvIDIpOwotfQotCi1zdGF0aWMgaW50IHByaXZf b3BfcmVhZF9pbyh1bnNpZ25lZCBpbnQgcG9ydCwgdW5zaWduZWQgaW50IGJ5dGVzLAotICAgICAg ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqdmFsLCBzdHJ1Y3QgeDg2X2VtdWxh dGVfY3R4dCAqY3R4dCkKLXsKLSAgICBzdHJ1Y3QgcHJpdl9vcF9jdHh0ICpwb2MgPSBjb250YWlu ZXJfb2YoY3R4dCwgc3RydWN0IHByaXZfb3BfY3R4dCwgY3R4dCk7Ci0gICAgc3RydWN0IHZjcHUg KmN1cnIgPSBjdXJyZW50OwotICAgIHN0cnVjdCBkb21haW4gKmN1cnJkID0gY3VycmVudC0+ZG9t YWluOwotCi0gICAgLyogSU5TIG11c3Qgbm90IGNvbWUgaGVyZS4gKi8KLSAgICBBU1NFUlQoKGN0 eHQtPm9wY29kZSAmIH45KSA9PSAweGU0KTsKLQotICAgIGlmICggIWd1ZXN0X2lvX29rYXkocG9y dCwgYnl0ZXMsIGN1cnIsIGN0eHQtPnJlZ3MpICkKLSAgICAgICAgcmV0dXJuIFg4NkVNVUxfVU5I QU5ETEVBQkxFOwotCi0gICAgcG9jLT5icG1hdGNoID0gY2hlY2tfZ3Vlc3RfaW9fYnJlYWtwb2lu dChjdXJyLCBwb3J0LCBieXRlcyk7Ci0KLSAgICBpZiAoIGFkbWluX2lvX29rYXkocG9ydCwgYnl0 ZXMsIGN1cnJkKSApCi0gICAgewotICAgICAgICBpb19lbXVsX3N0dWJfdCAqaW9fZW11bCA9Ci0g ICAgICAgICAgICBpb19lbXVsX3N0dWJfc2V0dXAocG9jLCBjdHh0LT5vcGNvZGUsIHBvcnQsIGJ5 dGVzKTsKLQotICAgICAgICBtYXJrX3JlZ3NfZGlydHkoY3R4dC0+cmVncyk7Ci0gICAgICAgIGlv X2VtdWwoY3R4dC0+cmVncyk7Ci0gICAgICAgIHJldHVybiBYODZFTVVMX0RPTkU7Ci0gICAgfQot Ci0gICAgKnZhbCA9IGd1ZXN0X2lvX3JlYWQocG9ydCwgYnl0ZXMsIGN1cnJkKTsKLQotICAgIHJl dHVybiBYODZFTVVMX09LQVk7Ci19Ci0KLXN0YXRpYyBpbnQgcHJpdl9vcF93cml0ZV9pbyh1bnNp Z25lZCBpbnQgcG9ydCwgdW5zaWduZWQgaW50IGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkK LXsKLSAgICBzdHJ1Y3QgcHJpdl9vcF9jdHh0ICpwb2MgPSBjb250YWluZXJfb2YoY3R4dCwgc3Ry dWN0IHByaXZfb3BfY3R4dCwgY3R4dCk7Ci0gICAgc3RydWN0IHZjcHUgKmN1cnIgPSBjdXJyZW50 OwotICAgIHN0cnVjdCBkb21haW4gKmN1cnJkID0gY3VycmVudC0+ZG9tYWluOwotCi0gICAgLyog T1VUUyBtdXN0IG5vdCBjb21lIGhlcmUuICovCi0gICAgQVNTRVJUKChjdHh0LT5vcGNvZGUgJiB+ OSkgPT0gMHhlNik7Ci0KLSAgICBpZiAoICFndWVzdF9pb19va2F5KHBvcnQsIGJ5dGVzLCBjdXJy LCBjdHh0LT5yZWdzKSApCi0gICAgICAgIHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKLQot ICAgIHBvYy0+YnBtYXRjaCA9IGNoZWNrX2d1ZXN0X2lvX2JyZWFrcG9pbnQoY3VyciwgcG9ydCwg Ynl0ZXMpOwotCi0gICAgaWYgKCBhZG1pbl9pb19va2F5KHBvcnQsIGJ5dGVzLCBjdXJyZCkgKQot ICAgIHsKLSAgICAgICAgaW9fZW11bF9zdHViX3QgKmlvX2VtdWwgPQotICAgICAgICAgICAgaW9f ZW11bF9zdHViX3NldHVwKHBvYywgY3R4dC0+b3Bjb2RlLCBwb3J0LCBieXRlcyk7Ci0KLSAgICAg ICAgbWFya19yZWdzX2RpcnR5KGN0eHQtPnJlZ3MpOwotICAgICAgICBpb19lbXVsKGN0eHQtPnJl Z3MpOwotICAgICAgICBpZiAoIChieXRlcyA9PSAxKSAmJiBwdl9wb3N0X291dGJfaG9vayApCi0g ICAgICAgICAgICBwdl9wb3N0X291dGJfaG9vayhwb3J0LCB2YWwpOwotICAgICAgICByZXR1cm4g WDg2RU1VTF9ET05FOwotICAgIH0KLQotICAgIGd1ZXN0X2lvX3dyaXRlKHBvcnQsIGJ5dGVzLCB2 YWwsIGN1cnJkKTsKLQotICAgIHJldHVybiBYODZFTVVMX09LQVk7Ci19Ci0KLXN0YXRpYyBpbnQg cHJpdl9vcF9yZXBfaW5zKHVpbnQxNl90IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICBlbnVtIHg4Nl9zZWdtZW50IHNlZywgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfcGVyX3JlcCwgdW5zaWduZWQgbG9u ZyAqcmVwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9j dHh0ICpjdHh0KQotewotICAgIHN0cnVjdCBwcml2X29wX2N0eHQgKnBvYyA9IGNvbnRhaW5lcl9v ZihjdHh0LCBzdHJ1Y3QgcHJpdl9vcF9jdHh0LCBjdHh0KTsKLSAgICBzdHJ1Y3QgdmNwdSAqY3Vy ciA9IGN1cnJlbnQ7Ci0gICAgc3RydWN0IGRvbWFpbiAqY3VycmQgPSBjdXJyZW50LT5kb21haW47 Ci0gICAgdW5zaWduZWQgbG9uZyBnb2FsID0gKnJlcHM7Ci0gICAgc3RydWN0IHNlZ21lbnRfcmVn aXN0ZXIgc3JlZzsKLSAgICBpbnQgcmM7Ci0KLSAgICBBU1NFUlQoc2VnID09IHg4Nl9zZWdfZXMp OwotCi0gICAgKnJlcHMgPSAwOwotCi0gICAgaWYgKCAhZ3Vlc3RfaW9fb2theShwb3J0LCBieXRl c19wZXJfcmVwLCBjdXJyLCBjdHh0LT5yZWdzKSApCi0gICAgICAgIHJldHVybiBYODZFTVVMX1VO SEFORExFQUJMRTsKLQotICAgIHJjID0gcHJpdl9vcF9yZWFkX3NlZ21lbnQoeDg2X3NlZ19lcywg JnNyZWcsIGN0eHQpOwotICAgIGlmICggcmMgIT0gWDg2RU1VTF9PS0FZICkKLSAgICAgICAgcmV0 dXJuIHJjOwotCi0gICAgaWYgKCAhc3JlZy5hdHRyLmZpZWxkcy5wICkKLSAgICAgICAgcmV0dXJu IFg4NkVNVUxfVU5IQU5ETEVBQkxFOwotICAgIGlmICggIXNyZWcuYXR0ci5maWVsZHMucyB8fAot ICAgICAgICAgKHNyZWcuYXR0ci5maWVsZHMudHlwZSAmIChfU0VHTUVOVF9DT0RFID4+IDgpKSB8 fAotICAgICAgICAgIShzcmVnLmF0dHIuZmllbGRzLnR5cGUgJiAoX1NFR01FTlRfV1IgPj4gOCkp ICkKLSAgICB7Ci0gICAgICAgIHg4Nl9lbXVsX2h3X2V4Y2VwdGlvbihUUkFQX2dwX2ZhdWx0LCAw LCBjdHh0KTsKLSAgICAgICAgcmV0dXJuIFg4NkVNVUxfRVhDRVBUSU9OOwotICAgIH0KLQotICAg IHBvYy0+YnBtYXRjaCA9IGNoZWNrX2d1ZXN0X2lvX2JyZWFrcG9pbnQoY3VyciwgcG9ydCwgYnl0 ZXNfcGVyX3JlcCk7Ci0KLSAgICB3aGlsZSAoICpyZXBzIDwgZ29hbCApCi0gICAgewotICAgICAg ICB1bnNpZ25lZCBpbnQgZGF0YSA9IGd1ZXN0X2lvX3JlYWQocG9ydCwgYnl0ZXNfcGVyX3JlcCwg Y3VycmQpOwotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHI7Ci0KLSAgICAgICAgcmMgPSBwdl9l bXVsX3ZpcnRfdG9fbGluZWFyKHNyZWcuYmFzZSwgb2Zmc2V0LCBieXRlc19wZXJfcmVwLAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JlZy5saW1pdCwgeDg2X3NlZ19lcywg Y3R4dCwgJmFkZHIpOwotICAgICAgICBpZiAoIHJjICE9IFg4NkVNVUxfT0tBWSApCi0gICAgICAg ICAgICByZXR1cm4gcmM7Ci0KLSAgICAgICAgaWYgKCAocmMgPSBfX2NvcHlfdG9fdXNlcigodm9p ZCAqKWFkZHIsICZkYXRhLCBieXRlc19wZXJfcmVwKSkgIT0gMCApCi0gICAgICAgIHsKLSAgICAg ICAgICAgIHg4Nl9lbXVsX3BhZ2VmYXVsdChQRkVDX3dyaXRlX2FjY2VzcywKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBhZGRyICsgYnl0ZXNfcGVyX3JlcCAtIHJjLCBjdHh0KTsKLSAg ICAgICAgICAgIHJldHVybiBYODZFTVVMX0VYQ0VQVElPTjsKLSAgICAgICAgfQotCi0gICAgICAg ICsrKnJlcHM7Ci0KLSAgICAgICAgaWYgKCBwb2MtPmJwbWF0Y2ggfHwgaHlwZXJjYWxsX3ByZWVt cHRfY2hlY2soKSApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiB4ODZfZW11bGF0 ZSgpIGNsaXBzIHRoZSByZXBldGl0aW9uIGNvdW50IHRvIGVuc3VyZSB3ZSBkb24ndCB3cmFwLiAq LwotICAgICAgICBpZiAoIHVubGlrZWx5KGN0eHQtPnJlZ3MtPmVmbGFncyAmIFg4Nl9FRkxBR1Nf REYpICkKLSAgICAgICAgICAgIG9mZnNldCAtPSBieXRlc19wZXJfcmVwOwotICAgICAgICBlbHNl Ci0gICAgICAgICAgICBvZmZzZXQgKz0gYnl0ZXNfcGVyX3JlcDsKLSAgICB9Ci0KLSAgICByZXR1 cm4gWDg2RU1VTF9PS0FZOwotfQotCi1zdGF0aWMgaW50IHByaXZfb3BfcmVwX291dHMoZW51bSB4 ODZfc2VnbWVudCBzZWcsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHVpbnQxNl90IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5z aWduZWQgaW50IGJ5dGVzX3Blcl9yZXAsIHVuc2lnbmVkIGxvbmcgKnJlcHMsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCi17Ci0gICAg c3RydWN0IHByaXZfb3BfY3R4dCAqcG9jID0gY29udGFpbmVyX29mKGN0eHQsIHN0cnVjdCBwcml2 X29wX2N0eHQsIGN0eHQpOwotICAgIHN0cnVjdCB2Y3B1ICpjdXJyID0gY3VycmVudDsKLSAgICBz dHJ1Y3QgZG9tYWluICpjdXJyZCA9IGN1cnJlbnQtPmRvbWFpbjsKLSAgICB1bnNpZ25lZCBsb25n IGdvYWwgPSAqcmVwczsKLSAgICBzdHJ1Y3Qgc2VnbWVudF9yZWdpc3RlciBzcmVnOwotICAgIGlu dCByYzsKLQotICAgICpyZXBzID0gMDsKLQotICAgIGlmICggIWd1ZXN0X2lvX29rYXkocG9ydCwg Ynl0ZXNfcGVyX3JlcCwgY3VyciwgY3R4dC0+cmVncykgKQotICAgICAgICByZXR1cm4gWDg2RU1V TF9VTkhBTkRMRUFCTEU7Ci0KLSAgICByYyA9IHByaXZfb3BfcmVhZF9zZWdtZW50KHNlZywgJnNy ZWcsIGN0eHQpOwotICAgIGlmICggcmMgIT0gWDg2RU1VTF9PS0FZICkKLSAgICAgICAgcmV0dXJu IHJjOwotCi0gICAgaWYgKCAhc3JlZy5hdHRyLmZpZWxkcy5wICkKLSAgICAgICAgcmV0dXJuIFg4 NkVNVUxfVU5IQU5ETEVBQkxFOwotICAgIGlmICggIXNyZWcuYXR0ci5maWVsZHMucyB8fAotICAg ICAgICAgKChzcmVnLmF0dHIuZmllbGRzLnR5cGUgJiAoX1NFR01FTlRfQ09ERSA+PiA4KSkgJiYK LSAgICAgICAgICAhKHNyZWcuYXR0ci5maWVsZHMudHlwZSAmIChfU0VHTUVOVF9XUiA+PiA4KSkp ICkKLSAgICB7Ci0gICAgICAgIHg4Nl9lbXVsX2h3X2V4Y2VwdGlvbihzZWcgIT0geDg2X3NlZ19z cyA/IFRSQVBfZ3BfZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDogVFJBUF9zdGFja19lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDAsIGN0eHQpOwotICAgICAgICByZXR1cm4gWDg2RU1VTF9FWENFUFRJT047Ci0gICAgfQot Ci0gICAgcG9jLT5icG1hdGNoID0gY2hlY2tfZ3Vlc3RfaW9fYnJlYWtwb2ludChjdXJyLCBwb3J0 LCBieXRlc19wZXJfcmVwKTsKLQotICAgIHdoaWxlICggKnJlcHMgPCBnb2FsICkKLSAgICB7Ci0g ICAgICAgIHVuc2lnbmVkIGludCBkYXRhID0gMDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRy OwotCi0gICAgICAgIHJjID0gcHZfZW11bF92aXJ0X3RvX2xpbmVhcihzcmVnLmJhc2UsIG9mZnNl dCwgYnl0ZXNfcGVyX3JlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNy ZWcubGltaXQsIHNlZywgY3R4dCwgJmFkZHIpOwotICAgICAgICBpZiAoIHJjICE9IFg4NkVNVUxf T0tBWSApCi0gICAgICAgICAgICByZXR1cm4gcmM7Ci0KLSAgICAgICAgaWYgKCAocmMgPSBfX2Nv cHlfZnJvbV91c2VyKCZkYXRhLCAodm9pZCAqKWFkZHIsIGJ5dGVzX3Blcl9yZXApKSAhPSAwICkK LSAgICAgICAgewotICAgICAgICAgICAgeDg2X2VtdWxfcGFnZWZhdWx0KDAsIGFkZHIgKyBieXRl c19wZXJfcmVwIC0gcmMsIGN0eHQpOwotICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxfRVhDRVBU SU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgZ3Vlc3RfaW9fd3JpdGUocG9ydCwgYnl0ZXNfcGVy X3JlcCwgZGF0YSwgY3VycmQpOwotCi0gICAgICAgICsrKnJlcHM7Ci0KLSAgICAgICAgaWYgKCBw b2MtPmJwbWF0Y2ggfHwgaHlwZXJjYWxsX3ByZWVtcHRfY2hlY2soKSApCi0gICAgICAgICAgICBi cmVhazsKLQotICAgICAgICAvKiB4ODZfZW11bGF0ZSgpIGNsaXBzIHRoZSByZXBldGl0aW9uIGNv dW50IHRvIGVuc3VyZSB3ZSBkb24ndCB3cmFwLiAqLwotICAgICAgICBpZiAoIHVubGlrZWx5KGN0 eHQtPnJlZ3MtPmVmbGFncyAmIFg4Nl9FRkxBR1NfREYpICkKLSAgICAgICAgICAgIG9mZnNldCAt PSBieXRlc19wZXJfcmVwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvZmZzZXQgKz0gYnl0 ZXNfcGVyX3JlcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotfQotCi1zdGF0 aWMgaW50IHByaXZfb3BfcmVhZF9jcih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nICp2 YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAq Y3R4dCkKLXsKLSAgICBjb25zdCBzdHJ1Y3QgdmNwdSAqY3VyciA9IGN1cnJlbnQ7Ci0KLSAgICBz d2l0Y2ggKCByZWcgKQotICAgIHsKLSAgICBjYXNlIDA6IC8qIFJlYWQgQ1IwICovCi0gICAgICAg ICp2YWwgPSAocmVhZF9jcjAoKSAmIH5YODZfQ1IwX1RTKSB8IGN1cnItPmFyY2gucHZfdmNwdS5j dHJscmVnWzBdOwotICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotCi0gICAgY2FzZSAyOiAv KiBSZWFkIENSMiAqLwotICAgIGNhc2UgNDogLyogUmVhZCBDUjQgKi8KLSAgICAgICAgKnZhbCA9 IGN1cnItPmFyY2gucHZfdmNwdS5jdHJscmVnW3JlZ107Ci0gICAgICAgIHJldHVybiBYODZFTVVM X09LQVk7Ci0KLSAgICBjYXNlIDM6IC8qIFJlYWQgQ1IzICovCi0gICAgewotICAgICAgICBjb25z dCBzdHJ1Y3QgZG9tYWluICpjdXJyZCA9IGN1cnItPmRvbWFpbjsKLSAgICAgICAgdW5zaWduZWQg bG9uZyBtZm47Ci0KLSAgICAgICAgaWYgKCAhaXNfcHZfMzJiaXRfZG9tYWluKGN1cnJkKSApCi0g ICAgICAgIHsKLSAgICAgICAgICAgIG1mbiA9IHBhZ2V0YWJsZV9nZXRfcGZuKGN1cnItPmFyY2gu Z3Vlc3RfdGFibGUpOwotICAgICAgICAgICAgKnZhbCA9IHhlbl9wZm5fdG9fY3IzKG1mbl90b19n bWZuKGN1cnJkLCBtZm4pKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAg ICAgICAgICAgIGw0X3BnZW50cnlfdCAqcGw0ZSA9Ci0gICAgICAgICAgICAgICAgbWFwX2RvbWFp bl9wYWdlKF9tZm4ocGFnZXRhYmxlX2dldF9wZm4oY3Vyci0+YXJjaC5ndWVzdF90YWJsZSkpKTsK LQotICAgICAgICAgICAgbWZuID0gbDRlX2dldF9wZm4oKnBsNGUpOwotICAgICAgICAgICAgdW5t YXBfZG9tYWluX3BhZ2UocGw0ZSk7Ci0gICAgICAgICAgICAqdmFsID0gY29tcGF0X3Bmbl90b19j cjMobWZuX3RvX2dtZm4oY3VycmQsIG1mbikpOwotICAgICAgICB9Ci0gICAgICAgIC8qIFBUcyBz aG91bGQgbm90IGJlIHNoYXJlZCAqLwotICAgICAgICBCVUdfT04ocGFnZV9nZXRfb3duZXIobWZu X3RvX3BhZ2UobWZuKSkgPT0gZG9tX2Nvdyk7Ci0gICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7 Ci0gICAgfQotICAgIH0KLQotICAgIHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKLX0KLQot c3RhdGljIGludCBwcml2X29wX3dyaXRlX2NyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxv bmcgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9j dHh0ICpjdHh0KQotewotICAgIHN0cnVjdCB2Y3B1ICpjdXJyID0gY3VycmVudDsKLQotICAgIHN3 aXRjaCAoIHJlZyApCi0gICAgewotICAgIGNhc2UgMDogLyogV3JpdGUgQ1IwICovCi0gICAgICAg IGlmICggKHZhbCBeIHJlYWRfY3IwKCkpICYgflg4Nl9DUjBfVFMgKQotICAgICAgICB7Ci0gICAg ICAgICAgICBnZHByaW50ayhYRU5MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgIkF0 dGVtcHQgdG8gY2hhbmdlIHVubW9kaWZpYWJsZSBDUjAgZmxhZ3NcbiIpOwotICAgICAgICAgICAg YnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZG9fZnB1X3Rhc2tzd2l0Y2goISEodmFsICYgWDg2 X0NSMF9UUykpOwotICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotCi0gICAgY2FzZSAyOiAv KiBXcml0ZSBDUjIgKi8KLSAgICAgICAgY3Vyci0+YXJjaC5wdl92Y3B1LmN0cmxyZWdbMl0gPSB2 YWw7Ci0gICAgICAgIGFyY2hfc2V0X2NyMihjdXJyLCB2YWwpOwotICAgICAgICByZXR1cm4gWDg2 RU1VTF9PS0FZOwotCi0gICAgY2FzZSAzOiAvKiBXcml0ZSBDUjMgKi8KLSAgICB7Ci0gICAgICAg IHN0cnVjdCBkb21haW4gKmN1cnJkID0gY3Vyci0+ZG9tYWluOwotICAgICAgICB1bnNpZ25lZCBs b25nIGdmbjsKLSAgICAgICAgc3RydWN0IHBhZ2VfaW5mbyAqcGFnZTsKLSAgICAgICAgaW50IHJj OwotCi0gICAgICAgIGdmbiA9ICFpc19wdl8zMmJpdF9kb21haW4oY3VycmQpCi0gICAgICAgICAg ICAgID8geGVuX2NyM190b19wZm4odmFsKSA6IGNvbXBhdF9jcjNfdG9fcGZuKHZhbCk7Ci0gICAg ICAgIHBhZ2UgPSBnZXRfcGFnZV9mcm9tX2dmbihjdXJyZCwgZ2ZuLCBOVUxMLCBQMk1fQUxMT0Mp OwotICAgICAgICBpZiAoICFwYWdlICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICByYyA9 IG5ld19ndWVzdF9jcjMocGFnZV90b19tZm4ocGFnZSkpOwotICAgICAgICBwdXRfcGFnZShwYWdl KTsKLQotICAgICAgICBzd2l0Y2ggKCByYyApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAwOgot ICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKLSAgICAgICAgY2FzZSAtRVJFU1RBUlQ6 IC8qIHJldHJ5IGFmdGVyIHByZWVtcHRpb24gKi8KLSAgICAgICAgICAgIHJldHVybiBYODZFTVVM X1JFVFJZOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgNDog LyogV3JpdGUgQ1I0ICovCi0gICAgICAgIGN1cnItPmFyY2gucHZfdmNwdS5jdHJscmVnWzRdID0g cHZfZ3Vlc3RfY3I0X2ZpeHVwKGN1cnIsIHZhbCk7Ci0gICAgICAgIHdyaXRlX2NyNChwdl9ndWVz dF9jcjRfdG9fcmVhbF9jcjQoY3VycikpOwotICAgICAgICBjdHh0X3N3aXRjaF9sZXZlbGxpbmco Y3Vycik7Ci0gICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7Ci0gICAgfQotCi0gICAgcmV0dXJu IFg4NkVNVUxfVU5IQU5ETEVBQkxFOwotfQotCi1zdGF0aWMgaW50IHByaXZfb3BfcmVhZF9kcih1 bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nICp2YWwsCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKLXsKLSAgICB1bnNpZ25lZCBs b25nIHJlcyA9IGRvX2dldF9kZWJ1Z3JlZyhyZWcpOwotCi0gICAgaWYgKCBJU19FUlJfVkFMVUUo cmVzKSApCi0gICAgICAgIHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKLQotICAgICp2YWwg PSByZXM7Ci0KLSAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotfQotCi1zdGF0aWMgaW50IHByaXZf b3Bfd3JpdGVfZHIodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyB2YWwsCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCi17Ci0g ICAgcmV0dXJuIGRvX3NldF9kZWJ1Z3JlZyhyZWcsIHZhbCkgPT0gMAotICAgICAgICAgICA/IFg4 NkVNVUxfT0tBWSA6IFg4NkVNVUxfVU5IQU5ETEVBQkxFOwotfQotCi1zdGF0aWMgaW5saW5lIHVp bnQ2NF90IGd1ZXN0X21pc2NfZW5hYmxlKHVpbnQ2NF90IHZhbCkKLXsKLSAgICB2YWwgJj0gfihN U1JfSUEzMl9NSVNDX0VOQUJMRV9QRVJGX0FWQUlMIHwKLSAgICAgICAgICAgICBNU1JfSUEzMl9N SVNDX0VOQUJMRV9NT05JVE9SX0VOQUJMRSk7Ci0gICAgdmFsIHw9IE1TUl9JQTMyX01JU0NfRU5B QkxFX0JUU19VTkFWQUlMIHwKLSAgICAgICAgICAgTVNSX0lBMzJfTUlTQ19FTkFCTEVfUEVCU19V TkFWQUlMIHwKLSAgICAgICAgICAgTVNSX0lBMzJfTUlTQ19FTkFCTEVfWFRQUl9ESVNBQkxFOwot ICAgIHJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc19jcHVmcmVxX2NvbnRy b2xsZXIoY29uc3Qgc3RydWN0IGRvbWFpbiAqZCkKLXsKLSAgICByZXR1cm4gKChjcHVmcmVxX2Nv bnRyb2xsZXIgPT0gRlJFUUNUTF9kb20wX2tlcm5lbCkgJiYKLSAgICAgICAgICAgIGlzX2hhcmR3 YXJlX2RvbWFpbihkKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcHJpdl9vcF9yZWFkX21zcih1bnNpZ25l ZCBpbnQgcmVnLCB1aW50NjRfdCAqdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0 cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQotewotICAgIHN0cnVjdCBwcml2X29wX2N0eHQg KnBvYyA9IGNvbnRhaW5lcl9vZihjdHh0LCBzdHJ1Y3QgcHJpdl9vcF9jdHh0LCBjdHh0KTsKLSAg ICBjb25zdCBzdHJ1Y3QgdmNwdSAqY3VyciA9IGN1cnJlbnQ7Ci0gICAgY29uc3Qgc3RydWN0IGRv bWFpbiAqY3VycmQgPSBjdXJyLT5kb21haW47Ci0gICAgYm9vbCB2cG11X21zciA9IGZhbHNlOwot Ci0gICAgc3dpdGNoICggcmVnICkKLSAgICB7Ci0gICAgICAgIGludCByYzsKLQotICAgIGNhc2Ug TVNSX0ZTX0JBU0U6Ci0gICAgICAgIGlmICggaXNfcHZfMzJiaXRfZG9tYWluKGN1cnJkKSApCi0g ICAgICAgICAgICBicmVhazsKLSAgICAgICAgKnZhbCA9IGNwdV9oYXNfZnNnc2Jhc2UgPyBfX3Jk ZnNiYXNlKCkgOiBjdXJyLT5hcmNoLnB2X3ZjcHUuZnNfYmFzZTsKLSAgICAgICAgcmV0dXJuIFg4 NkVNVUxfT0tBWTsKLQotICAgIGNhc2UgTVNSX0dTX0JBU0U6Ci0gICAgICAgIGlmICggaXNfcHZf MzJiaXRfZG9tYWluKGN1cnJkKSApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgKnZhbCA9 IGNwdV9oYXNfZnNnc2Jhc2UgPyBfX3JkZ3NiYXNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOiBjdXJyLT5hcmNoLnB2X3ZjcHUuZ3NfYmFzZV9rZXJuZWw7Ci0gICAgICAgIHJl dHVybiBYODZFTVVMX09LQVk7Ci0KLSAgICBjYXNlIE1TUl9TSEFET1dfR1NfQkFTRToKLSAgICAg ICAgaWYgKCBpc19wdl8zMmJpdF9kb21haW4oY3VycmQpICkKLSAgICAgICAgICAgIGJyZWFrOwot ICAgICAgICAqdmFsID0gY3Vyci0+YXJjaC5wdl92Y3B1LmdzX2Jhc2VfdXNlcjsKLSAgICAgICAg cmV0dXJuIFg4NkVNVUxfT0tBWTsKLQotICAgIC8qCi0gICAgICogSW4gb3JkZXIgdG8gZnVsbHkg cmV0YWluIG9yaWdpbmFsIGJlaGF2aW9yLCBkZWZlciBjYWxsaW5nCi0gICAgICogcHZfc29mdF9y ZHRzYygpIHVudGlsIGFmdGVyIGVtdWxhdGlvbi4gVGhpcyBtYXkgd2FudC9uZWVkIHRvIGJlCi0g ICAgICogcmVjb25zaWRlcmVkLgotICAgICAqLwotICAgIGNhc2UgTVNSX0lBMzJfVFNDOgotICAg ICAgICBwb2MtPnRzYyB8PSBUU0NfQkFTRTsKLSAgICAgICAgZ290byBub3JtYWw7Ci0KLSAgICBj YXNlIE1TUl9UU0NfQVVYOgotICAgICAgICBwb2MtPnRzYyB8PSBUU0NfQVVYOwotICAgICAgICBp ZiAoIGNwdV9oYXNfcmR0c2NwICkKLSAgICAgICAgICAgIGdvdG8gbm9ybWFsOwotICAgICAgICAq dmFsID0gMDsKLSAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKLQotICAgIGNhc2UgTVNSX0VG RVI6Ci0gICAgICAgICp2YWwgPSByZWFkX2VmZXIoKTsKLSAgICAgICAgaWYgKCBpc19wdl8zMmJp dF9kb21haW4oY3VycmQpICkKLSAgICAgICAgICAgICp2YWwgJj0gfihFRkVSX0xNRSB8IEVGRVJf TE1BIHwgRUZFUl9MTVNMRSk7Ci0gICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7Ci0KLSAgICBj YXNlIE1TUl9LN19GSURfVklEX0NUTDoKLSAgICBjYXNlIE1TUl9LN19GSURfVklEX1NUQVRVUzoK LSAgICBjYXNlIE1TUl9LOF9QU1RBVEVfTElNSVQ6Ci0gICAgY2FzZSBNU1JfSzhfUFNUQVRFX0NU Ukw6Ci0gICAgY2FzZSBNU1JfSzhfUFNUQVRFX1NUQVRVUzoKLSAgICBjYXNlIE1TUl9LOF9QU1RB VEUwOgotICAgIGNhc2UgTVNSX0s4X1BTVEFURTE6Ci0gICAgY2FzZSBNU1JfSzhfUFNUQVRFMjoK LSAgICBjYXNlIE1TUl9LOF9QU1RBVEUzOgotICAgIGNhc2UgTVNSX0s4X1BTVEFURTQ6Ci0gICAg Y2FzZSBNU1JfSzhfUFNUQVRFNToKLSAgICBjYXNlIE1TUl9LOF9QU1RBVEU2OgotICAgIGNhc2Ug TVNSX0s4X1BTVEFURTc6Ci0gICAgICAgIGlmICggYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yICE9 IFg4Nl9WRU5ET1JfQU1EICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoIHVubGlr ZWx5KGlzX2NwdWZyZXFfY29udHJvbGxlcihjdXJyZCkpICkKLSAgICAgICAgICAgIGdvdG8gbm9y bWFsOwotICAgICAgICAqdmFsID0gMDsKLSAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKLQot ICAgIGNhc2UgTVNSX0lBMzJfVUNPREVfUkVWOgotICAgICAgICBCVUlMRF9CVUdfT04oTVNSX0lB MzJfVUNPREVfUkVWICE9IE1TUl9BTURfUEFUQ0hMRVZFTCk7Ci0gICAgICAgIGlmICggYm9vdF9j cHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwgKQotICAgICAgICB7Ci0gICAg ICAgICAgICBpZiAoIHdybXNyX3NhZmUoTVNSX0lBMzJfVUNPREVfUkVWLCAwKSApCi0gICAgICAg ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiBBcyBkb2N1bWVudGVkIGluIHRoZSBTRE06 IERvIGEgQ1BVSUQgMSBoZXJlICovCi0gICAgICAgICAgICBjcHVpZF9lYXgoMSk7Ci0gICAgICAg IH0KLSAgICAgICAgZ290byBub3JtYWw7Ci0KLSAgICBjYXNlIE1TUl9JQTMyX01JU0NfRU5BQkxF OgotICAgICAgICBpZiAoIHJkbXNyX3NhZmUocmVnLCAqdmFsKSApCi0gICAgICAgICAgICBicmVh azsKLSAgICAgICAgKnZhbCA9IGd1ZXN0X21pc2NfZW5hYmxlKCp2YWwpOwotICAgICAgICByZXR1 cm4gWDg2RU1VTF9PS0FZOwotCi0gICAgY2FzZSBNU1JfQU1ENjRfRFIwX0FERFJFU1NfTUFTSzoK LSAgICAgICAgaWYgKCAhYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0RCRVhUKSApCi0gICAgICAg ICAgICBicmVhazsKLSAgICAgICAgKnZhbCA9IGN1cnItPmFyY2gucHZfdmNwdS5kcl9tYXNrWzBd OwotICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotCi0gICAgY2FzZSBNU1JfQU1ENjRfRFIx X0FERFJFU1NfTUFTSyAuLi4gTVNSX0FNRDY0X0RSM19BRERSRVNTX01BU0s6Ci0gICAgICAgIGlm ICggIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9EQkVYVCkgKQotICAgICAgICAgICAgYnJlYWs7 Ci0gICAgICAgICp2YWwgPSBjdXJyLT5hcmNoLnB2X3ZjcHUuZHJfbWFza1tyZWcgLSBNU1JfQU1E NjRfRFIxX0FERFJFU1NfTUFTSyArIDFdOwotICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwot Ci0gICAgY2FzZSBNU1JfSUEzMl9QRVJGX0NBUEFCSUxJVElFUzoKLSAgICAgICAgLyogTm8gZXh0 cmEgY2FwYWJpbGl0aWVzIGFyZSBzdXBwb3J0ZWQuICovCi0gICAgICAgICp2YWwgPSAwOwotICAg ICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotCi0gICAgY2FzZSBNU1JfSU5URUxfUExBVEZPUk1f SU5GTzoKLSAgICAgICAgaWYgKCBib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRP Ul9JTlRFTCB8fAotICAgICAgICAgICAgIHJkbXNyX3NhZmUoTVNSX0lOVEVMX1BMQVRGT1JNX0lO Rk8sICp2YWwpICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAqdmFsID0gMDsKLSAgICAg ICAgaWYgKCB0aGlzX2NwdShjcHVpZF9mYXVsdGluZ19lbmFibGVkKSApCi0gICAgICAgICAgICAq dmFsIHw9IE1TUl9QTEFURk9STV9JTkZPX0NQVUlEX0ZBVUxUSU5HOwotICAgICAgICByZXR1cm4g WDg2RU1VTF9PS0FZOwotCi0gICAgY2FzZSBNU1JfSU5URUxfTUlTQ19GRUFUVVJFU19FTkFCTEVT OgotICAgICAgICBpZiAoIGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lO VEVMIHx8Ci0gICAgICAgICAgICAgcmRtc3Jfc2FmZShNU1JfSU5URUxfTUlTQ19GRUFUVVJFU19F TkFCTEVTLCAqdmFsKSApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgKnZhbCA9IDA7Ci0g ICAgICAgIGlmICggY3Vyci0+YXJjaC5jcHVpZF9mYXVsdGluZyApCi0gICAgICAgICAgICAqdmFs IHw9IE1TUl9NSVNDX0ZFQVRVUkVTX0NQVUlEX0ZBVUxUSU5HOwotICAgICAgICByZXR1cm4gWDg2 RU1VTF9PS0FZOwotCi0gICAgY2FzZSBNU1JfUDZfUEVSRkNUUigwKS4uLk1TUl9QNl9QRVJGQ1RS KDcpOgotICAgIGNhc2UgTVNSX1A2X0VWTlRTRUwoMCkuLi5NU1JfUDZfRVZOVFNFTCgzKToKLSAg ICBjYXNlIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMC4uLk1TUl9DT1JFX1BFUkZfRklYRURfQ1RS MjoKLSAgICBjYXNlIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSX0NUUkwuLi5NU1JfQ09SRV9QRVJG X0dMT0JBTF9PVkZfQ1RSTDoKLSAgICAgICAgaWYgKCBib290X2NwdV9kYXRhLng4Nl92ZW5kb3Ig PT0gWDg2X1ZFTkRPUl9JTlRFTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZwbXVfbXNyID0g dHJ1ZTsKLSAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgIGNhc2UgTVNSX0FNRF9G QU0xNUhfRVZOVFNFTDAuLi5NU1JfQU1EX0ZBTTE1SF9QRVJGQ1RSNToKLSAgICBjYXNlIE1TUl9L N19FVk5UU0VMMC4uLk1TUl9LN19QRVJGQ1RSMzoKLSAgICAgICAgICAgIGlmICggdnBtdV9tc3Ig fHwgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkgKQotICAgICAg ICAgICAgewotICAgICAgICAgICAgICAgIGlmICggdnBtdV9kb19yZG1zcihyZWcsIHZhbCkgKQot ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICByZXR1cm4gWDg2RU1V TF9PS0FZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIGZhbGwgdGhyb3Vn aCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmICggcmRtc3JfaHlwZXJ2aXNvcl9yZWdzKHJl ZywgdmFsKSApCi0gICAgICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotCi0gICAgICAgIHJj ID0gdm1jZV9yZG1zcihyZWcsIHZhbCk7Ci0gICAgICAgIGlmICggcmMgPCAwICkKLSAgICAgICAg ICAgIGJyZWFrOwotICAgICAgICBpZiAoIHJjICkKLSAgICAgICAgICAgIHJldHVybiBYODZFTVVM X09LQVk7Ci0gICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgIG5vcm1hbDoKLSAgICAgICAg LyogRXZlcnlvbmUgY2FuIHJlYWQgdGhlIE1TUiBzcGFjZS4gKi8KLSAgICAgICAgLyogZ2Rwcmlu dGsoWEVOTE9HX1dBUk5JTkcsICJEb21haW4gYXR0ZW1wdGVkIFJETVNSICUwOHhcbiIsIHJlZyk7 ICovCi0gICAgICAgIGlmICggcmRtc3Jfc2FmZShyZWcsICp2YWwpICkKLSAgICAgICAgICAgIGJy ZWFrOwotICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotICAgIH0KLQotICAgIHJldHVybiBY ODZFTVVMX1VOSEFORExFQUJMRTsKLX0KLQotI2luY2x1ZGUgIng4Nl82NC9tbWNvbmZpZy5oIgot Ci1zdGF0aWMgaW50IHByaXZfb3Bfd3JpdGVfbXNyKHVuc2lnbmVkIGludCByZWcsIHVpbnQ2NF90 IHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0 eHQgKmN0eHQpCi17Ci0gICAgc3RydWN0IHZjcHUgKmN1cnIgPSBjdXJyZW50OwotICAgIGNvbnN0 IHN0cnVjdCBkb21haW4gKmN1cnJkID0gY3Vyci0+ZG9tYWluOwotICAgIGJvb2wgdnBtdV9tc3Ig PSBmYWxzZTsKLQotICAgIHN3aXRjaCAoIHJlZyApCi0gICAgewotICAgICAgICB1aW50NjRfdCB0 ZW1wOwotICAgICAgICBpbnQgcmM7Ci0KLSAgICBjYXNlIE1TUl9GU19CQVNFOgotICAgICAgICBp ZiAoIGlzX3B2XzMyYml0X2RvbWFpbihjdXJyZCkgfHwgIWlzX2Nhbm9uaWNhbF9hZGRyZXNzKHZh bCkgKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHdyZnNiYXNlKHZhbCk7Ci0gICAgICAg IGN1cnItPmFyY2gucHZfdmNwdS5mc19iYXNlID0gdmFsOwotICAgICAgICByZXR1cm4gWDg2RU1V TF9PS0FZOwotCi0gICAgY2FzZSBNU1JfR1NfQkFTRToKLSAgICAgICAgaWYgKCBpc19wdl8zMmJp dF9kb21haW4oY3VycmQpIHx8ICFpc19jYW5vbmljYWxfYWRkcmVzcyh2YWwpICkKLSAgICAgICAg ICAgIGJyZWFrOwotICAgICAgICB3cmdzYmFzZSh2YWwpOwotICAgICAgICBjdXJyLT5hcmNoLnB2 X3ZjcHUuZ3NfYmFzZV9rZXJuZWwgPSB2YWw7Ci0gICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7 Ci0KLSAgICBjYXNlIE1TUl9TSEFET1dfR1NfQkFTRToKLSAgICAgICAgaWYgKCBpc19wdl8zMmJp dF9kb21haW4oY3VycmQpIHx8ICFpc19jYW5vbmljYWxfYWRkcmVzcyh2YWwpICkKLSAgICAgICAg ICAgIGJyZWFrOwotICAgICAgICB3cm1zcmwoTVNSX1NIQURPV19HU19CQVNFLCB2YWwpOwotICAg ICAgICBjdXJyLT5hcmNoLnB2X3ZjcHUuZ3NfYmFzZV91c2VyID0gdmFsOwotICAgICAgICByZXR1 cm4gWDg2RU1VTF9PS0FZOwotCi0gICAgY2FzZSBNU1JfSzdfRklEX1ZJRF9TVEFUVVM6Ci0gICAg Y2FzZSBNU1JfSzdfRklEX1ZJRF9DVEw6Ci0gICAgY2FzZSBNU1JfSzhfUFNUQVRFX0xJTUlUOgot ICAgIGNhc2UgTVNSX0s4X1BTVEFURV9DVFJMOgotICAgIGNhc2UgTVNSX0s4X1BTVEFURV9TVEFU VVM6Ci0gICAgY2FzZSBNU1JfSzhfUFNUQVRFMDoKLSAgICBjYXNlIE1TUl9LOF9QU1RBVEUxOgot ICAgIGNhc2UgTVNSX0s4X1BTVEFURTI6Ci0gICAgY2FzZSBNU1JfSzhfUFNUQVRFMzoKLSAgICBj YXNlIE1TUl9LOF9QU1RBVEU0OgotICAgIGNhc2UgTVNSX0s4X1BTVEFURTU6Ci0gICAgY2FzZSBN U1JfSzhfUFNUQVRFNjoKLSAgICBjYXNlIE1TUl9LOF9QU1RBVEU3OgotICAgIGNhc2UgTVNSX0s4 X0hXQ1I6Ci0gICAgICAgIGlmICggYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yICE9IFg4Nl9WRU5E T1JfQU1EICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoIGxpa2VseSghaXNfY3B1 ZnJlcV9jb250cm9sbGVyKGN1cnJkKSkgfHwKLSAgICAgICAgICAgICB3cm1zcl9zYWZlKHJlZywg dmFsKSA9PSAwICkKLSAgICAgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7Ci0gICAgICAgIGJy ZWFrOwotCi0gICAgY2FzZSBNU1JfQU1ENjRfTkJfQ0ZHOgotICAgICAgICBpZiAoIGJvb3RfY3B1 X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCB8fAotICAgICAgICAgICAgIGJvb3Rf Y3B1X2RhdGEueDg2IDwgMHgxMCB8fCBib290X2NwdV9kYXRhLng4NiA+IDB4MTcgKQotICAgICAg ICAgICAgYnJlYWs7Ci0gICAgICAgIGlmICggIWlzX2hhcmR3YXJlX2RvbWFpbihjdXJyZCkgfHwg IWlzX3Bpbm5lZF92Y3B1KGN1cnIpICkKLSAgICAgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7 Ci0gICAgICAgIGlmICggKHJkbXNyX3NhZmUoTVNSX0FNRDY0X05CX0NGRywgdGVtcCkgIT0gMCkg fHwKLSAgICAgICAgICAgICAoKHZhbCBeIHRlbXApICYgfigxVUxMIDw8IEFNRDY0X05CX0NGR19D RjhfRVhUX0VOQUJMRV9CSVQpKSApCi0gICAgICAgICAgICBnb3RvIGludmFsaWQ7Ci0gICAgICAg IGlmICggd3Jtc3Jfc2FmZShNU1JfQU1ENjRfTkJfQ0ZHLCB2YWwpID09IDAgKQotICAgICAgICAg ICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1TUl9G QU0xMEhfTU1JT19DT05GX0JBU0U6Ci0gICAgICAgIGlmICggYm9vdF9jcHVfZGF0YS54ODZfdmVu ZG9yICE9IFg4Nl9WRU5ET1JfQU1EIHx8Ci0gICAgICAgICAgICAgYm9vdF9jcHVfZGF0YS54ODYg PCAweDEwIHx8IGJvb3RfY3B1X2RhdGEueDg2ID4gMHgxNyApCi0gICAgICAgICAgICBicmVhazsK LSAgICAgICAgaWYgKCAhaXNfaGFyZHdhcmVfZG9tYWluKGN1cnJkKSB8fCAhaXNfcGlubmVkX3Zj cHUoY3VycikgKQotICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKLSAgICAgICAgaWYg KCByZG1zcl9zYWZlKE1TUl9GQU0xMEhfTU1JT19DT05GX0JBU0UsIHRlbXApICE9IDAgKQotICAg ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmICggKHBjaV9wcm9iZSAmIFBDSV9QUk9CRV9NQVNL KSA9PSBQQ0lfUFJPQkVfTU1DT05GID8KLSAgICAgICAgICAgICB0ZW1wICE9IHZhbCA6Ci0gICAg ICAgICAgICAgKCh0ZW1wIF4gdmFsKSAmCi0gICAgICAgICAgICAgIH4oRkFNMTBIX01NSU9fQ09O Rl9FTkFCTEUgfAotICAgICAgICAgICAgICAgIChGQU0xMEhfTU1JT19DT05GX0JVU1JBTkdFX01B U0sgPDwKLSAgICAgICAgICAgICAgICAgRkFNMTBIX01NSU9fQ09ORl9CVVNSQU5HRV9TSElGVCkg fAotICAgICAgICAgICAgICAgICgodTY0KUZBTTEwSF9NTUlPX0NPTkZfQkFTRV9NQVNLIDw8Ci0g ICAgICAgICAgICAgICAgIEZBTTEwSF9NTUlPX0NPTkZfQkFTRV9TSElGVCkpKSApCi0gICAgICAg ICAgICBnb3RvIGludmFsaWQ7Ci0gICAgICAgIGlmICggd3Jtc3Jfc2FmZShNU1JfRkFNMTBIX01N SU9fQ09ORl9CQVNFLCB2YWwpID09IDAgKQotICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tB WTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1TUl9JQTMyX1VDT0RFX1JFVjoKLSAgICAg ICAgaWYgKCBib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCApCi0g ICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKCAhaXNfaGFyZHdhcmVfZG9tYWluKGN1cnJk KSB8fCAhaXNfcGlubmVkX3ZjcHUoY3VycikgKQotICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxf T0tBWTsKLSAgICAgICAgaWYgKCByZG1zcl9zYWZlKHJlZywgdGVtcCkgKQotICAgICAgICAgICAg YnJlYWs7Ci0gICAgICAgIGlmICggdmFsICkKLSAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKLSAg ICAgICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKLQotICAgIGNhc2UgTVNSX0lBMzJfTUlTQ19FTkFC TEU6Ci0gICAgICAgIGlmICggcmRtc3Jfc2FmZShyZWcsIHRlbXApICkKLSAgICAgICAgICAgIGJy ZWFrOwotICAgICAgICBpZiAoIHZhbCAhPSBndWVzdF9taXNjX2VuYWJsZSh0ZW1wKSApCi0gICAg ICAgICAgICBnb3RvIGludmFsaWQ7Ci0gICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7Ci0KLSAg ICBjYXNlIE1TUl9JQTMyX01QRVJGOgotICAgIGNhc2UgTVNSX0lBMzJfQVBFUkY6Ci0gICAgICAg IGlmICggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMKSAmJgot ICAgICAgICAgICAgIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQp ICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoIGxpa2VseSghaXNfY3B1ZnJlcV9j b250cm9sbGVyKGN1cnJkKSkgfHwKLSAgICAgICAgICAgICB3cm1zcl9zYWZlKHJlZywgdmFsKSA9 PSAwICkKLSAgICAgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7Ci0gICAgICAgIGJyZWFrOwot Ci0gICAgY2FzZSBNU1JfSUEzMl9QRVJGX0NUTDoKLSAgICAgICAgaWYgKCBib290X2NwdV9kYXRh Lng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCApCi0gICAgICAgICAgICBicmVhazsKLSAg ICAgICAgaWYgKCBsaWtlbHkoIWlzX2NwdWZyZXFfY29udHJvbGxlcihjdXJyZCkpIHx8Ci0gICAg ICAgICAgICAgd3Jtc3Jfc2FmZShyZWcsIHZhbCkgPT0gMCApCi0gICAgICAgICAgICByZXR1cm4g WDg2RU1VTF9PS0FZOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTVNSX0lBMzJfVEhFUk1f Q09OVFJPTDoKLSAgICBjYXNlIE1TUl9JQTMyX0VORVJHWV9QRVJGX0JJQVM6Ci0gICAgICAgIGlm ICggYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwgKQotICAgICAg ICAgICAgYnJlYWs7Ci0gICAgICAgIGlmICggIWlzX2hhcmR3YXJlX2RvbWFpbihjdXJyZCkgfHwg IWlzX3Bpbm5lZF92Y3B1KGN1cnIpIHx8Ci0gICAgICAgICAgICAgd3Jtc3Jfc2FmZShyZWcsIHZh bCkgPT0gMCApCi0gICAgICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotICAgICAgICBicmVh azsKLQotICAgIGNhc2UgTVNSX0FNRDY0X0RSMF9BRERSRVNTX01BU0s6Ci0gICAgICAgIGlmICgg IWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9EQkVYVCkgfHwgKHZhbCA+PiAzMikgKQotICAgICAg ICAgICAgYnJlYWs7Ci0gICAgICAgIGN1cnItPmFyY2gucHZfdmNwdS5kcl9tYXNrWzBdID0gdmFs OwotICAgICAgICBpZiAoIGN1cnItPmFyY2guZGVidWdyZWdbN10gJiBEUjdfQUNUSVZFX01BU0sg KQotICAgICAgICAgICAgd3Jtc3JsKE1TUl9BTUQ2NF9EUjBfQUREUkVTU19NQVNLLCB2YWwpOwot ICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotCi0gICAgY2FzZSBNU1JfQU1ENjRfRFIxX0FE RFJFU1NfTUFTSyAuLi4gTVNSX0FNRDY0X0RSM19BRERSRVNTX01BU0s6Ci0gICAgICAgIGlmICgg IWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9EQkVYVCkgfHwgKHZhbCA+PiAzMikgKQotICAgICAg ICAgICAgYnJlYWs7Ci0gICAgICAgIGN1cnItPmFyY2gucHZfdmNwdS5kcl9tYXNrW3JlZyAtIE1T Ul9BTUQ2NF9EUjFfQUREUkVTU19NQVNLICsgMV0gPSB2YWw7Ci0gICAgICAgIGlmICggY3Vyci0+ YXJjaC5kZWJ1Z3JlZ1s3XSAmIERSN19BQ1RJVkVfTUFTSyApCi0gICAgICAgICAgICB3cm1zcmwo cmVnLCB2YWwpOwotICAgICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotCi0gICAgY2FzZSBNU1Jf SU5URUxfUExBVEZPUk1fSU5GTzoKLSAgICAgICAgaWYgKCBib290X2NwdV9kYXRhLng4Nl92ZW5k b3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fAotICAgICAgICAgICAgIHZhbCB8fCByZG1zcl9zYWZl KE1TUl9JTlRFTF9QTEFURk9STV9JTkZPLCB2YWwpICkKLSAgICAgICAgICAgIGJyZWFrOwotICAg ICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotCi0gICAgY2FzZSBNU1JfSU5URUxfTUlTQ19GRUFU VVJFU19FTkFCTEVTOgotICAgICAgICBpZiAoIGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBY ODZfVkVORE9SX0lOVEVMIHx8Ci0gICAgICAgICAgICAgKHZhbCAmIH5NU1JfTUlTQ19GRUFUVVJF U19DUFVJRF9GQVVMVElORykgfHwKLSAgICAgICAgICAgICByZG1zcl9zYWZlKE1TUl9JTlRFTF9N SVNDX0ZFQVRVUkVTX0VOQUJMRVMsIHRlbXApICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg ICBpZiAoICh2YWwgJiBNU1JfTUlTQ19GRUFUVVJFU19DUFVJRF9GQVVMVElORykgJiYKLSAgICAg ICAgICAgICAhdGhpc19jcHUoY3B1aWRfZmF1bHRpbmdfZW5hYmxlZCkgKQotICAgICAgICAgICAg YnJlYWs7Ci0gICAgICAgIGN1cnItPmFyY2guY3B1aWRfZmF1bHRpbmcgPSAhISh2YWwgJiBNU1Jf TUlTQ19GRUFUVVJFU19DUFVJRF9GQVVMVElORyk7Ci0gICAgICAgIHJldHVybiBYODZFTVVMX09L QVk7Ci0KLSAgICBjYXNlIE1TUl9QNl9QRVJGQ1RSKDApLi4uTVNSX1A2X1BFUkZDVFIoNyk6Ci0g ICAgY2FzZSBNU1JfUDZfRVZOVFNFTCgwKS4uLk1TUl9QNl9FVk5UU0VMKDMpOgotICAgIGNhc2Ug TVNSX0NPUkVfUEVSRl9GSVhFRF9DVFIwLi4uTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFIyOgotICAg IGNhc2UgTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFJfQ1RSTC4uLk1TUl9DT1JFX1BFUkZfR0xPQkFM X09WRl9DVFJMOgotICAgICAgICBpZiAoIGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZf VkVORE9SX0lOVEVMICkKLSAgICAgICAgewotICAgICAgICAgICAgdnBtdV9tc3IgPSB0cnVlOwot ICAgIGNhc2UgTVNSX0FNRF9GQU0xNUhfRVZOVFNFTDAuLi5NU1JfQU1EX0ZBTTE1SF9QRVJGQ1RS NToKLSAgICBjYXNlIE1TUl9LN19FVk5UU0VMMC4uLk1TUl9LN19QRVJGQ1RSMzoKLSAgICAgICAg ICAgIGlmICggdnBtdV9tc3IgfHwgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVO RE9SX0FNRCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggKHZwbXVfbW9k ZSAmIFhFTlBNVV9NT0RFX0FMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICFpc19oYXJkd2Fy ZV9kb21haW4oY3VycmQpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFg4NkVNVUxfT0tB WTsKLQotICAgICAgICAgICAgICAgIGlmICggdnBtdV9kb193cm1zcihyZWcsIHZhbCwgMCkgKQot ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICByZXR1cm4gWDg2RU1V TF9PS0FZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIGZhbGwgdGhyb3Vn aCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmICggd3Jtc3JfaHlwZXJ2aXNvcl9yZWdzKHJl ZywgdmFsKSA9PSAxICkKLSAgICAgICAgICAgIHJldHVybiBYODZFTVVMX09LQVk7Ci0KLSAgICAg ICAgcmMgPSB2bWNlX3dybXNyKHJlZywgdmFsKTsKLSAgICAgICAgaWYgKCByYyA8IDAgKQotICAg ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmICggcmMgKQotICAgICAgICAgICAgcmV0dXJuIFg4 NkVNVUxfT0tBWTsKLQotICAgICAgICBpZiAoIChyZG1zcl9zYWZlKHJlZywgdGVtcCkgIT0gMCkg fHwgKHZhbCAhPSB0ZW1wKSApCi0gICAgaW52YWxpZDoKLSAgICAgICAgICAgIGdkcHJpbnRrKFhF TkxPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgIkRvbWFpbiBhdHRlbXB0ZWQgV1JN U1IgJTA4eCBmcm9tIDB4JTAxNiJQUkl4NjQiIHRvIDB4JTAxNiJQUkl4NjQiXG4iLAotICAgICAg ICAgICAgICAgICAgICAgcmVnLCB0ZW1wLCB2YWwpOwotICAgICAgICByZXR1cm4gWDg2RU1VTF9P S0FZOwotICAgIH0KLQotICAgIHJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKLX0KLQotc3Rh dGljIGludCBwcml2X29wX3diaW52ZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKLXsK LSAgICAvKiBJZ25vcmUgdGhlIGluc3RydWN0aW9uIGlmIHVucHJpdmlsZWdlZC4gKi8KLSAgICBp ZiAoICFjYWNoZV9mbHVzaF9wZXJtaXR0ZWQoY3VycmVudC0+ZG9tYWluKSApCi0gICAgICAgIC8q Ci0gICAgICAgICAqIE5vbi1waHlzZGV2IGRvbWFpbiBhdHRlbXB0ZWQgV0JJTlZEOyBpZ25vcmUg Zm9yIG5vdyBzaW5jZQotICAgICAgICAgKiBuZXdlciBsaW51eCB1c2VzIHRoaXMgaW4gc29tZSBz dGFydC1vZi1kYXkgdGltaW5nIGxvb3BzLgotICAgICAgICAgKi8KLSAgICAgICAgOwotICAgIGVs c2UKLSAgICAgICAgd2JpbnZkKCk7Ci0KLSAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotfQotCi1p bnQgcHZfZW11bF9jcHVpZCh1aW50MzJfdCBsZWFmLCB1aW50MzJfdCBzdWJsZWFmLAotICAgICAg ICAgICAgICAgICAgc3RydWN0IGNwdWlkX2xlYWYgKnJlcywgc3RydWN0IHg4Nl9lbXVsYXRlX2N0 eHQgKmN0eHQpCi17Ci0gICAgZ3Vlc3RfY3B1aWQoY3VycmVudCwgbGVhZiwgc3VibGVhZiwgcmVz KTsKLQotICAgIHJldHVybiBYODZFTVVMX09LQVk7Ci19Ci0KLXN0YXRpYyBpbnQgcHJpdl9vcF92 YWxpZGF0ZShjb25zdCBzdHJ1Y3QgeDg2X2VtdWxhdGVfc3RhdGUgKnN0YXRlLAotICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQotewotICAg IHN3aXRjaCAoIGN0eHQtPm9wY29kZSApCi0gICAgewotICAgIGNhc2UgMHg2YyAuLi4gMHg2Zjog LyogaW5zIC8gb3V0cyAqLwotICAgIGNhc2UgMHhlNCAuLi4gMHhlNzogLyogaW4gLyBvdXQgKGlt bWVkaWF0ZSBwb3J0KSAqLwotICAgIGNhc2UgMHhlYyAuLi4gMHhlZjogLyogaW4gLyBvdXQgKHBv cnQgaW4gJWR4KSAqLwotICAgIGNhc2UgWDg2RU1VTF9PUEMoMHgwZiwgMHgwNik6IC8qIGNsdHMg Ki8KLSAgICBjYXNlIFg4NkVNVUxfT1BDKDB4MGYsIDB4MDkpOiAvKiB3YmludmQgKi8KLSAgICBj YXNlIFg4NkVNVUxfT1BDKDB4MGYsIDB4MjApIC4uLgotICAgICAgICAgWDg2RU1VTF9PUEMoMHgw ZiwgMHgyMyk6IC8qIG1vdiB0by9mcm9tIGNyL2RyICovCi0gICAgY2FzZSBYODZFTVVMX09QQygw eDBmLCAweDMwKTogLyogd3Jtc3IgKi8KLSAgICBjYXNlIFg4NkVNVUxfT1BDKDB4MGYsIDB4MzEp OiAvKiByZHRzYyAqLwotICAgIGNhc2UgWDg2RU1VTF9PUEMoMHgwZiwgMHgzMik6IC8qIHJkbXNy ICovCi0gICAgY2FzZSBYODZFTVVMX09QQygweDBmLCAweGEyKTogLyogY3B1aWQgKi8KLSAgICAg ICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsKLQotICAgIGNhc2UgMHhmYTogY2FzZSAweGZiOiAvKiBj bGkgLyBzdGkgKi8KLSAgICAgICAgaWYgKCAhaW9wbF9vayhjdXJyZW50LCBjdHh0LT5yZWdzKSAp Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoKLSAgICAgICAgICogVGhpcyBpcyBqdXN0 IHRvbyBkYW5nZXJvdXMgdG8gYWxsb3csIGluIG15IG9waW5pb24uIENvbnNpZGVyIGlmIHRoZQot ICAgICAgICAgKiBjYWxsZXIgdGhlbiB0cmllcyB0byByZWVuYWJsZSBpbnRlcnJ1cHRzIHVzaW5n IFBPUEY6IHdlIGNhbid0IHRyYXAKLSAgICAgICAgICogdGhhdCBhbmQgd2UnbGwgZW5kIHVwIHdp dGggaGFyZC10by1kZWJ1ZyBsb2NrdXBzLiBGYXN0ICYgbG9vc2Ugd2lsbAotICAgICAgICAgKiBk byBmb3IgdXMuIDotKQotICAgICAgICB2Y3B1X2luZm8oY3VycmVudCwgZXZ0Y2huX3VwY2FsbF9t YXNrKSA9IChjdHh0LT5vcGNvZGUgPT0gMHhmYSk7Ci0gICAgICAgICAqLwotICAgICAgICByZXR1 cm4gWDg2RU1VTF9ET05FOwotCi0gICAgY2FzZSBYODZFTVVMX09QQygweDBmLCAweDAxKToKLSAg ICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtb2RybV9ybSwgbW9kcm1fcmVnOwotCi0gICAgICAg IGlmICggeDg2X2luc25fbW9kcm0oc3RhdGUsICZtb2RybV9ybSwgJm1vZHJtX3JlZykgIT0gMyB8 fAotICAgICAgICAgICAgIChtb2RybV9ybSAmIDcpICE9IDEgKQotICAgICAgICAgICAgYnJlYWs7 Ci0gICAgICAgIHN3aXRjaCAoIG1vZHJtX3JlZyAmIDcgKQotICAgICAgICB7Ci0gICAgICAgIGNh c2UgMjogLyogeHNldGJ2ICovCi0gICAgICAgIGNhc2UgNzogLyogcmR0c2NwICovCi0gICAgICAg ICAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAg IH0KLSAgICB9Ci0KLSAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7Ci19Ci0KLXN0YXRp YyBjb25zdCBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzIHByaXZfb3Bfb3BzID0gewotICAgIC5pbnNu X2ZldGNoICAgICAgICAgID0gcHJpdl9vcF9pbnNuX2ZldGNoLAotICAgIC5yZWFkICAgICAgICAg ICAgICAgID0geDg2ZW11bF91bmhhbmRsZWFibGVfcncsCi0gICAgLnZhbGlkYXRlICAgICAgICAg ICAgPSBwcml2X29wX3ZhbGlkYXRlLAotICAgIC5yZWFkX2lvICAgICAgICAgICAgID0gcHJpdl9v cF9yZWFkX2lvLAotICAgIC53cml0ZV9pbyAgICAgICAgICAgID0gcHJpdl9vcF93cml0ZV9pbywK LSAgICAucmVwX2lucyAgICAgICAgICAgICA9IHByaXZfb3BfcmVwX2lucywKLSAgICAucmVwX291 dHMgICAgICAgICAgICA9IHByaXZfb3BfcmVwX291dHMsCi0gICAgLnJlYWRfc2VnbWVudCAgICAg ICAgPSBwcml2X29wX3JlYWRfc2VnbWVudCwKLSAgICAucmVhZF9jciAgICAgICAgICAgICA9IHBy aXZfb3BfcmVhZF9jciwKLSAgICAud3JpdGVfY3IgICAgICAgICAgICA9IHByaXZfb3Bfd3JpdGVf Y3IsCi0gICAgLnJlYWRfZHIgICAgICAgICAgICAgPSBwcml2X29wX3JlYWRfZHIsCi0gICAgLndy aXRlX2RyICAgICAgICAgICAgPSBwcml2X29wX3dyaXRlX2RyLAotICAgIC5yZWFkX21zciAgICAg ICAgICAgID0gcHJpdl9vcF9yZWFkX21zciwKLSAgICAud3JpdGVfbXNyICAgICAgICAgICA9IHBy aXZfb3Bfd3JpdGVfbXNyLAotICAgIC5jcHVpZCAgICAgICAgICAgICAgID0gcHZfZW11bF9jcHVp ZCwKLSAgICAud2JpbnZkICAgICAgICAgICAgICA9IHByaXZfb3Bfd2JpbnZkLAotfTsKLQotc3Rh dGljIGludCBlbXVsYXRlX3ByaXZpbGVnZWRfb3Aoc3RydWN0IGNwdV91c2VyX3JlZ3MgKnJlZ3Mp Ci17Ci0gICAgc3RydWN0IHZjcHUgKmN1cnIgPSBjdXJyZW50OwotICAgIHN0cnVjdCBkb21haW4g KmN1cnJkID0gY3Vyci0+ZG9tYWluOwotICAgIHN0cnVjdCBwcml2X29wX2N0eHQgY3R4dCA9IHsK LSAgICAgICAgLmN0eHQucmVncyA9IHJlZ3MsCi0gICAgICAgIC5jdHh0LnZlbmRvciA9IGN1cnJk LT5hcmNoLmNwdWlkLT54ODZfdmVuZG9yLAotICAgICAgICAuY3R4dC5sbWEgPSAhaXNfcHZfMzJi aXRfZG9tYWluKGN1cnJkKSwKLSAgICB9OwotICAgIGludCByYzsKLSAgICB1bnNpZ25lZCBpbnQg ZWZsYWdzLCBhcjsKLQotICAgIGlmICggIXJlYWRfZGVzY3JpcHRvcihyZWdzLT5jcywgY3Vyciwg JmN0eHQuY3MuYmFzZSwgJmN0eHQuY3MubGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICZhciwgMSkgfHwKLSAgICAgICAgICEoYXIgJiBfU0VHTUVOVF9TKSB8fAotICAgICAgICAgIShh ciAmIF9TRUdNRU5UX1ApIHx8Ci0gICAgICAgICAhKGFyICYgX1NFR01FTlRfQ09ERSkgKQotICAg ICAgICByZXR1cm4gMDsKLQotICAgIC8qIE1pcnJvciB2aXJ0dWFsaXplZCBzdGF0ZSBpbnRvIEVG TEFHUy4gKi8KLSAgICBBU1NFUlQocmVncy0+ZWZsYWdzICYgWDg2X0VGTEFHU19JRik7Ci0gICAg aWYgKCB2Y3B1X2luZm8oY3VyciwgZXZ0Y2huX3VwY2FsbF9tYXNrKSApCi0gICAgICAgIHJlZ3Mt PmVmbGFncyAmPSB+WDg2X0VGTEFHU19JRjsKLSAgICBlbHNlCi0gICAgICAgIHJlZ3MtPmVmbGFn cyB8PSBYODZfRUZMQUdTX0lGOwotICAgIEFTU0VSVCghKHJlZ3MtPmVmbGFncyAmIFg4Nl9FRkxB R1NfSU9QTCkpOwotICAgIHJlZ3MtPmVmbGFncyB8PSBjdXJyLT5hcmNoLnB2X3ZjcHUuaW9wbDsK LSAgICBlZmxhZ3MgPSByZWdzLT5lZmxhZ3M7Ci0KLSAgICBjdHh0LmN0eHQuYWRkcl9zaXplID0g YXIgJiBfU0VHTUVOVF9MID8gNjQgOiBhciAmIF9TRUdNRU5UX0RCID8gMzIgOiAxNjsKLSAgICAv KiBMZWF2ZSB6ZXJvIGluIGN0eHQuY3R4dC5zcF9zaXplLCBhcyBpdCdzIG5vdCBuZWVkZWQuICov Ci0gICAgcmMgPSB4ODZfZW11bGF0ZSgmY3R4dC5jdHh0LCAmcHJpdl9vcF9vcHMpOwotCi0gICAg aWYgKCBjdHh0LmlvX2VtdWxfc3R1YiApCi0gICAgICAgIHVubWFwX2RvbWFpbl9wYWdlKGN0eHQu aW9fZW11bF9zdHViKTsKLQotICAgIC8qCi0gICAgICogVW4tbWlycm9yIHZpcnR1YWxpemVkIHN0 YXRlIGZyb20gRUZMQUdTLgotICAgICAqIE5vdGhpbmcgd2UgYWxsb3cgdG8gYmUgZW11bGF0ZWQg Y2FuIGNoYW5nZSBhbnl0aGluZyBvdGhlciB0aGFuIHRoZQotICAgICAqIGFyaXRobWV0aWMgYml0 cywgYW5kIHRoZSByZXN1bWUgZmxhZy4KLSAgICAgKi8KLSAgICBBU1NFUlQoISgocmVncy0+ZWZs YWdzIF4gZWZsYWdzKSAmCi0gICAgICAgICAgICAgfihYODZfRUZMQUdTX1JGIHwgWDg2X0VGTEFH U19BUklUSF9NQVNLKSkpOwotICAgIHJlZ3MtPmVmbGFncyB8PSBYODZfRUZMQUdTX0lGOwotICAg IHJlZ3MtPmVmbGFncyAmPSB+WDg2X0VGTEFHU19JT1BMOwotCi0gICAgc3dpdGNoICggcmMgKQot ICAgIHsKLSAgICBjYXNlIFg4NkVNVUxfT0tBWToKLSAgICAgICAgaWYgKCBjdHh0LnRzYyAmIFRT Q19CQVNFICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBjdHh0LnRzYyAmIFRTQ19BVVgg KQotICAgICAgICAgICAgICAgIHB2X3NvZnRfcmR0c2MoY3VyciwgcmVncywgMSk7Ci0gICAgICAg ICAgICBlbHNlIGlmICggY3VycmQtPmFyY2gudnRzYyApCi0gICAgICAgICAgICAgICAgcHZfc29m dF9yZHRzYyhjdXJyLCByZWdzLCAwKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg ICBtc3Jfc3BsaXQocmVncywgcmR0c2MoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGN0 eHQuY3R4dC5yZXRpcmUuc2luZ2xlc3RlcCApCi0gICAgICAgICAgICBjdHh0LmJwbWF0Y2ggfD0g RFJfU1RFUDsKLSAgICAgICAgaWYgKCBjdHh0LmJwbWF0Y2ggKQotICAgICAgICB7Ci0gICAgICAg ICAgICBjdXJyLT5hcmNoLmRlYnVncmVnWzZdIHw9IGN0eHQuYnBtYXRjaCB8IERSX1NUQVRVU19S RVNFUlZFRF9PTkU7Ci0gICAgICAgICAgICBpZiAoICEoY3Vyci0+YXJjaC5wdl92Y3B1LnRyYXBf Ym91bmNlLmZsYWdzICYgVEJGX0VYQ0VQVElPTikgKQotICAgICAgICAgICAgICAgIHB2X2luamVj dF90cmFwKFRSQVBfZGVidWcsIHJlZ3MpOwotICAgICAgICB9Ci0gICAgICAgIC8qIGZhbGwgdGhy b3VnaCAqLwotICAgIGNhc2UgWDg2RU1VTF9SRVRSWToKLSAgICAgICAgcmV0dXJuIEVYQ1JFVF9m YXVsdF9maXhlZDsKLQotICAgIGNhc2UgWDg2RU1VTF9FWENFUFRJT046Ci0gICAgICAgIHB2X2lu amVjdF9ldmVudCgmY3R4dC5jdHh0LmV2ZW50KTsKLSAgICAgICAgcmV0dXJuIEVYQ1JFVF9mYXVs dF9maXhlZDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQg Y2hlY2tfc3RhY2tfbGltaXQodW5zaWduZWQgaW50IGFyLCB1bnNpZ25lZCBpbnQgbGltaXQsCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZXNwLCB1bnNp Z25lZCBpbnQgZGVjcikKLXsKLSAgICByZXR1cm4gKCgoZXNwIC0gZGVjcikgPCAoZXNwIC0gMSkp ICYmCi0gICAgICAgICAgICAoIShhciAmIF9TRUdNRU5UX0VDKSA/IChlc3AgLSAxKSA8PSBsaW1p dCA6IChlc3AgLSBkZWNyKSA+IGxpbWl0KSk7Ci19Ci0KLXN0cnVjdCBnYXRlX29wX2N0eHQgewot ICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0IGN0eHQ7Ci0gICAgc3RydWN0IHsKLSAgICAgICAg dW5zaWduZWQgbG9uZyBiYXNlLCBsaW1pdDsKLSAgICB9IGNzOwotICAgIGJvb2wgaW5zbl9mZXRj aDsKLX07Ci0KLXN0YXRpYyBpbnQgZ2F0ZV9vcF9yZWFkKAotICAgIGVudW0geDg2X3NlZ21lbnQg c2VnLAotICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgIHZvaWQgKnBfZGF0YSwKLSAgICB1 bnNpZ25lZCBpbnQgYnl0ZXMsCi0gICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCi17 Ci0gICAgY29uc3Qgc3RydWN0IGdhdGVfb3BfY3R4dCAqZ29jID0KLSAgICAgICAgY29udGFpbmVy X29mKGN0eHQsIHN0cnVjdCBnYXRlX29wX2N0eHQsIGN0eHQpOwotICAgIHVuc2lnbmVkIGludCBy YyA9IGJ5dGVzLCBzZWwgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgYWRkciA9IG9mZnNldCwgbGlt aXQgPSAwOwotCi0gICAgc3dpdGNoICggc2VnICkKLSAgICB7Ci0gICAgY2FzZSB4ODZfc2VnX2Nz OgotICAgICAgICBhZGRyICs9IGdvYy0+Y3MuYmFzZTsKLSAgICAgICAgbGltaXQgPSBnb2MtPmNz LmxpbWl0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIHg4Nl9zZWdfZHM6Ci0gICAgICAgIHNl bCA9IHJlYWRfc3JlZyhkcyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgeDg2X3NlZ19lczoK LSAgICAgICAgc2VsID0gcmVhZF9zcmVnKGVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSB4 ODZfc2VnX2ZzOgotICAgICAgICBzZWwgPSByZWFkX3NyZWcoZnMpOwotICAgICAgICBicmVhazsK LSAgICBjYXNlIHg4Nl9zZWdfZ3M6Ci0gICAgICAgIHNlbCA9IHJlYWRfc3JlZyhncyk7Ci0gICAg ICAgIGJyZWFrOwotICAgIGNhc2UgeDg2X3NlZ19zczoKLSAgICAgICAgc2VsID0gY3R4dC0+cmVn cy0+c3M7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBYODZF TVVMX1VOSEFORExFQUJMRTsKLSAgICB9Ci0gICAgaWYgKCBzZWwgKQotICAgIHsKLSAgICAgICAg dW5zaWduZWQgaW50IGFyOwotCi0gICAgICAgIEFTU0VSVCghZ29jLT5pbnNuX2ZldGNoKTsKLSAg ICAgICAgaWYgKCAhcmVhZF9kZXNjcmlwdG9yKHNlbCwgY3VycmVudCwgJmFkZHIsICZsaW1pdCwg JmFyLCAwKSB8fAotICAgICAgICAgICAgICEoYXIgJiBfU0VHTUVOVF9TKSB8fAotICAgICAgICAg ICAgICEoYXIgJiBfU0VHTUVOVF9QKSB8fAotICAgICAgICAgICAgICgoYXIgJiBfU0VHTUVOVF9D T0RFKSAmJiAhKGFyICYgX1NFR01FTlRfV1IpKSApCi0gICAgICAgICAgICByZXR1cm4gWDg2RU1V TF9VTkhBTkRMRUFCTEU7Ci0gICAgICAgIGFkZHIgKz0gb2Zmc2V0OwotICAgIH0KLSAgICBlbHNl IGlmICggc2VnICE9IHg4Nl9zZWdfY3MgKQotICAgICAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRM RUFCTEU7Ci0KLSAgICAvKiBXZSBkb24ndCBtZWFuIHRvIGVtdWxhdGUgYW55IGJyYW5jaGVzLiAq LwotICAgIGlmICggbGltaXQgPCBieXRlcyAtIDEgfHwgb2Zmc2V0ID4gbGltaXQgLSBieXRlcyAr IDEgKQotICAgICAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7Ci0KLSAgICBhZGRyID0g KHVpbnQzMl90KWFkZHI7Ci0KLSAgICBpZiAoIChyYyA9IF9fY29weV9mcm9tX3VzZXIocF9kYXRh LCAodm9pZCAqKWFkZHIsIGJ5dGVzKSkgKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICog VE9ETzogVGhpcyBzaG91bGQgcmVwb3J0IFBGRUNfaW5zbl9mZXRjaCB3aGVuIGdvYy0+aW5zbl9m ZXRjaCAmJgotICAgICAgICAgKiBjcHVfaGFzX254LCBidXQgd2UnZCB0aGVuIG5lZWQgYSAiZmV0 Y2giIHZhcmlhbnQgb2YKLSAgICAgICAgICogX19jb3B5X2Zyb21fdXNlcigpIHJlc3BlY3Rpbmcg TlgsIFNNRVAsIGFuZCBwcm90ZWN0aW9uIGtleXMuCi0gICAgICAgICAqLwotICAgICAgICB4ODZf ZW11bF9wYWdlZmF1bHQoMCwgYWRkciArIGJ5dGVzIC0gcmMsIGN0eHQpOwotICAgICAgICByZXR1 cm4gWDg2RU1VTF9FWENFUFRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIFg4NkVNVUxfT0tBWTsK LX0KLQotc3RhdGljIHZvaWQgZW11bGF0ZV9nYXRlX29wKHN0cnVjdCBjcHVfdXNlcl9yZWdzICpy ZWdzKQotewotICAgIHN0cnVjdCB2Y3B1ICp2ID0gY3VycmVudDsKLSAgICB1bnNpZ25lZCBpbnQg c2VsLCBhciwgZHBsLCBucGFybSwgaW5zbl9sZW47Ci0gICAgc3RydWN0IGdhdGVfb3BfY3R4dCBj dHh0ID0geyAuY3R4dC5yZWdzID0gcmVncywgLmluc25fZmV0Y2ggPSB0cnVlIH07Ci0gICAgc3Ry dWN0IHg4Nl9lbXVsYXRlX3N0YXRlICpzdGF0ZTsKLSAgICB1bnNpZ25lZCBsb25nIG9mZiwgYmFz ZSwgbGltaXQ7Ci0gICAgdWludDE2X3Qgb3BuZF9zZWwgPSAwOwotICAgIGludCBqdW1wID0gLTEs IHJjID0gWDg2RU1VTF9PS0FZOwotCi0gICAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGZhdWx0IGlz IGR1ZSB0byB0aGUgdXNlIG9mIGEgY2FsbCBnYXRlLiAqLwotICAgIGlmICggIXJlYWRfZ2F0ZV9k ZXNjcmlwdG9yKHJlZ3MtPmVycm9yX2NvZGUsIHYsICZzZWwsICZvZmYsICZhcikgfHwKLSAgICAg ICAgICgoKGFyID4+IDEzKSAmIDMpIDwgKHJlZ3MtPmNzICYgMykpIHx8Ci0gICAgICAgICAoKGFy ICYgX1NFR01FTlRfVFlQRSkgIT0gMHhjMDApICkKLSAgICB7Ci0gICAgICAgIHB2X2luamVjdF90 cmFwKFRSQVBfZ3BfZmF1bHQsIHJlZ3MpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlm ICggIShhciAmIF9TRUdNRU5UX1ApICkKLSAgICB7Ci0gICAgICAgIHB2X2luamVjdF90cmFwKFRS QVBfbm9fc2VnbWVudCwgcmVncyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZHBsID0g KGFyID4+IDEzKSAmIDM7Ci0gICAgbnBhcm0gPSBhciAmIDB4MWY7Ci0KLSAgICAvKgotICAgICAq IERlY29kZSBpbnN0cnVjdGlvbiAoYW5kIHBlcmhhcHMgb3BlcmFuZCkgdG8gZGV0ZXJtaW5lIFJQ TCwKLSAgICAgKiB3aGV0aGVyIHRoaXMgaXMgYSBqdW1wIG9yIGEgY2FsbCwgYW5kIHRoZSBjYWxs IHJldHVybiBvZmZzZXQuCi0gICAgICovCi0gICAgaWYgKCAhcmVhZF9kZXNjcmlwdG9yKHJlZ3Mt PmNzLCB2LCAmY3R4dC5jcy5iYXNlLCAmY3R4dC5jcy5saW1pdCwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgJmFyLCAwKSB8fAotICAgICAgICAgIShhciAmIF9TRUdNRU5UX1MpIHx8Ci0gICAg ICAgICAhKGFyICYgX1NFR01FTlRfUCkgfHwKLSAgICAgICAgICEoYXIgJiBfU0VHTUVOVF9DT0RF KSApCi0gICAgewotICAgICAgICBwdl9pbmplY3RfdHJhcChUUkFQX2dwX2ZhdWx0LCByZWdzKTsK LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGN0eHQuY3R4dC5hZGRyX3NpemUgPSBhciAm IF9TRUdNRU5UX0RCID8gMzIgOiAxNjsKLSAgICAvKiBMZWF2ZSB6ZXJvIGluIGN0eHQuY3R4dC5z cF9zaXplLCBhcyBpdCdzIG5vdCBuZWVkZWQgZm9yIGRlY29kaW5nLiAqLwotICAgIHN0YXRlID0g eDg2X2RlY29kZV9pbnNuKCZjdHh0LmN0eHQsIGdhdGVfb3BfcmVhZCk7Ci0gICAgY3R4dC5pbnNu X2ZldGNoID0gZmFsc2U7Ci0gICAgaWYgKCBJU19FUlJfT1JfTlVMTChzdGF0ZSkgKQotICAgIHsK LSAgICAgICAgaWYgKCBQVFJfRVJSKHN0YXRlKSA9PSAtWDg2RU1VTF9FWENFUFRJT04gKQotICAg ICAgICAgICAgcHZfaW5qZWN0X2V2ZW50KCZjdHh0LmN0eHQuZXZlbnQpOwotICAgICAgICBlbHNl Ci0gICAgICAgICAgICBwdl9pbmplY3RfdHJhcChUUkFQX2dwX2ZhdWx0LCByZWdzKTsKLSAgICAg ICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAoIGN0eHQuY3R4dC5vcGNvZGUgKQotICAg IHsKLSAgICAgICAgdW5zaWduZWQgaW50IG1vZHJtXzM0NTsKLQotICAgIGNhc2UgMHhlYToKLSAg ICAgICAgKytqdW1wOwotICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIDB4OWE6 Ci0gICAgICAgICsranVtcDsKLSAgICAgICAgb3BuZF9zZWwgPSB4ODZfaW5zbl9pbW1lZGlhdGUo c3RhdGUsIDEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDB4ZmY6Ci0gICAgICAgIGlmICgg eDg2X2luc25fbW9kcm0oc3RhdGUsIE5VTEwsICZtb2RybV8zNDUpID49IDMgKQotICAgICAgICAg ICAgYnJlYWs7Ci0gICAgICAgIHN3aXRjaCAoIG1vZHJtXzM0NSAmIDcgKQotICAgICAgICB7Ci0g ICAgICAgICAgICBlbnVtIHg4Nl9zZWdtZW50IHNlZzsKLQotICAgICAgICBjYXNlIDU6Ci0gICAg ICAgICAgICArK2p1bXA7Ci0gICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAg Y2FzZSAzOgotICAgICAgICAgICAgKytqdW1wOwotICAgICAgICAgICAgYmFzZSA9IHg4Nl9pbnNu X29wZXJhbmRfZWEoc3RhdGUsICZzZWcpOwotICAgICAgICAgICAgcmMgPSBnYXRlX29wX3JlYWQo c2VnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArICh4ODZfaW5zbl9vcHNp emUoc3RhdGUpID4+IDMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wbmRfc2Vs LCBzaXplb2Yob3BuZF9zZWwpLCAmY3R4dC5jdHh0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg ICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGluc25fbGVuID0geDg2X2luc25f bGVuZ3RoKHN0YXRlLCAmY3R4dC5jdHh0KTsKLSAgICB4ODZfZW11bGF0ZV9mcmVlX3N0YXRlKHN0 YXRlKTsKLQotICAgIGlmICggcmMgPT0gWDg2RU1VTF9FWENFUFRJT04gKQotICAgIHsKLSAgICAg ICAgcHZfaW5qZWN0X2V2ZW50KCZjdHh0LmN0eHQuZXZlbnQpOwotICAgICAgICByZXR1cm47Ci0g ICAgfQotCi0gICAgaWYgKCByYyAhPSBYODZFTVVMX09LQVkgfHwKLSAgICAgICAgIGp1bXAgPCAw IHx8Ci0gICAgICAgICAob3BuZF9zZWwgJiB+MykgIT0gcmVncy0+ZXJyb3JfY29kZSB8fAotICAg ICAgICAgZHBsIDwgKG9wbmRfc2VsICYgMykgKQotICAgIHsKLSAgICAgICAgcHZfaW5qZWN0X3Ry YXAoVFJBUF9ncF9mYXVsdCwgcmVncyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBp ZiAoICFyZWFkX2Rlc2NyaXB0b3Ioc2VsLCB2LCAmYmFzZSwgJmxpbWl0LCAmYXIsIDApIHx8Ci0g ICAgICAgICAhKGFyICYgX1NFR01FTlRfUykgfHwKLSAgICAgICAgICEoYXIgJiBfU0VHTUVOVF9D T0RFKSB8fAotICAgICAgICAgKCFqdW1wIHx8IChhciAmIF9TRUdNRU5UX0VDKSA/Ci0gICAgICAg ICAgKChhciA+PiAxMykgJiAzKSA+IChyZWdzLT5jcyAmIDMpIDoKLSAgICAgICAgICAoKGFyID4+ IDEzKSAmIDMpICE9IChyZWdzLT5jcyAmIDMpKSApCi0gICAgewotICAgICAgICBwdl9pbmplY3Rf aHdfZXhjZXB0aW9uKFRSQVBfZ3BfZmF1bHQsIHNlbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9 Ci0gICAgaWYgKCAhKGFyICYgX1NFR01FTlRfUCkgKQotICAgIHsKLSAgICAgICAgcHZfaW5qZWN0 X2h3X2V4Y2VwdGlvbihUUkFQX25vX3NlZ21lbnQsIHNlbCk7Ci0gICAgICAgIHJldHVybjsKLSAg ICB9Ci0gICAgaWYgKCBvZmYgPiBsaW1pdCApCi0gICAgewotICAgICAgICBwdl9pbmplY3RfaHdf ZXhjZXB0aW9uKFRSQVBfZ3BfZmF1bHQsIDApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g ICAgaWYgKCAhanVtcCApCi0gICAgewotICAgICAgICB1bnNpZ25lZCBpbnQgc3MsIGVzcCwgKnN0 a3A7Ci0gICAgICAgIGludCByYzsKLSNkZWZpbmUgcHVzaChpdGVtKSBkbyBcCi0gICAgICAgIHsg XAotICAgICAgICAgICAgLS1zdGtwOyBcCi0gICAgICAgICAgICBlc3AgLT0gNDsgXAotICAgICAg ICAgICAgcmMgPSBfX3B1dF91c2VyKGl0ZW0sIHN0a3ApOyBcCi0gICAgICAgICAgICBpZiAoIHJj ICkgXAotICAgICAgICAgICAgeyBcCi0gICAgICAgICAgICAgICAgcHZfaW5qZWN0X3BhZ2VfZmF1 bHQoUEZFQ193cml0ZV9hY2Nlc3MsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAodW5zaWduZWQgbG9uZykoc3RrcCArIDEpIC0gcmMpOyBcCi0gICAgICAgICAgICAgICAg cmV0dXJuOyBcCi0gICAgICAgICAgICB9IFwKLSAgICAgICAgfSB3aGlsZSAoIDAgKQotCi0gICAg ICAgIGlmICggKChhciA+PiAxMykgJiAzKSA8IChyZWdzLT5jcyAmIDMpICkKLSAgICAgICAgewot ICAgICAgICAgICAgc2VsIHw9IChhciA+PiAxMykgJiAzOwotICAgICAgICAgICAgLyogSW5uZXIg c3RhY2sga25vd24gb25seSBmb3Iga2VybmVsIHJpbmcuICovCi0gICAgICAgICAgICBpZiAoIChz ZWwgJiAzKSAhPSBHVUVTVF9LRVJORUxfUlBMKHYtPmRvbWFpbikgKQotICAgICAgICAgICAgewot ICAgICAgICAgICAgICAgIHB2X2luamVjdF90cmFwKFRSQVBfZ3BfZmF1bHQsIHJlZ3MpOwotICAg ICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVzcCA9IHYt PmFyY2gucHZfdmNwdS5rZXJuZWxfc3A7Ci0gICAgICAgICAgICBzcyA9IHYtPmFyY2gucHZfdmNw dS5rZXJuZWxfc3M7Ci0gICAgICAgICAgICBpZiAoIChzcyAmIDMpICE9IChzZWwgJiAzKSB8fAot ICAgICAgICAgICAgICAgICAhcmVhZF9kZXNjcmlwdG9yKHNzLCB2LCAmYmFzZSwgJmxpbWl0LCAm YXIsIDApIHx8Ci0gICAgICAgICAgICAgICAgICgoYXIgPj4gMTMpICYgMykgIT0gKHNlbCAmIDMp IHx8Ci0gICAgICAgICAgICAgICAgICEoYXIgJiBfU0VHTUVOVF9TKSB8fAotICAgICAgICAgICAg ICAgICAoYXIgJiBfU0VHTUVOVF9DT0RFKSB8fAotICAgICAgICAgICAgICAgICAhKGFyICYgX1NF R01FTlRfV1IpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdl9pbmplY3RfaHdf ZXhjZXB0aW9uKFRSQVBfaW52YWxpZF90c3MsIHNzICYgfjMpOwotICAgICAgICAgICAgICAgIHJl dHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggIShhciAmIF9TRUdNRU5UX1Ap IHx8Ci0gICAgICAgICAgICAgICAgICFjaGVja19zdGFja19saW1pdChhciwgbGltaXQsIGVzcCwg KDQgKyBucGFybSkgKiA0KSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHZfaW5q ZWN0X2h3X2V4Y2VwdGlvbihUUkFQX3N0YWNrX2Vycm9yLCBzcyAmIH4zKTsKLSAgICAgICAgICAg ICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGtwID0gKHVuc2lnbmVk IGludCAqKSh1bnNpZ25lZCBsb25nKSgodW5zaWduZWQgaW50KWJhc2UgKyBlc3ApOwotICAgICAg ICAgICAgaWYgKCAhY29tcGF0X2FjY2Vzc19vayhzdGtwIC0gNCAtIG5wYXJtLCAoNCArIG5wYXJt KSAqIDQpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdl9pbmplY3RfdHJhcChU UkFQX2dwX2ZhdWx0LCByZWdzKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAg ICB9Ci0gICAgICAgICAgICBwdXNoKHJlZ3MtPnNzKTsKLSAgICAgICAgICAgIHB1c2gocmVncy0+ cnNwKTsKLSAgICAgICAgICAgIGlmICggbnBhcm0gKQotICAgICAgICAgICAgewotICAgICAgICAg ICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqdXN0a3A7Ci0KLSAgICAgICAgICAgICAgICBpZiAo ICFyZWFkX2Rlc2NyaXB0b3IocmVncy0+c3MsIHYsICZiYXNlLCAmbGltaXQsICZhciwgMCkgfHwK LSAgICAgICAgICAgICAgICAgICAgICgoYXIgPj4gMTMpICYgMykgIT0gKHJlZ3MtPmNzICYgMykg fHwKLSAgICAgICAgICAgICAgICAgICAgICEoYXIgJiBfU0VHTUVOVF9TKSB8fAotICAgICAgICAg ICAgICAgICAgICAgKGFyICYgX1NFR01FTlRfQ09ERSkgfHwKLSAgICAgICAgICAgICAgICAgICAg ICEoYXIgJiBfU0VHTUVOVF9XUikgfHwKLSAgICAgICAgICAgICAgICAgICAgICFjaGVja19zdGFj a19saW1pdChhciwgbGltaXQsIGVzcCArIG5wYXJtICogNCwgbnBhcm0gKiA0KSApCi0gICAgICAg ICAgICAgICAgICAgIHJldHVybiBwdl9pbmplY3RfdHJhcChUUkFQX2dwX2ZhdWx0LCByZWdzKTsK LSAgICAgICAgICAgICAgICB1c3RrcCA9ICh1bnNpZ25lZCBpbnQgKikodW5zaWduZWQgbG9uZykK LSAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgaW50KWJhc2UgKyByZWdzLT5lc3Ag KyBucGFybSAqIDQpOwotICAgICAgICAgICAgICAgIGlmICggIWNvbXBhdF9hY2Nlc3Nfb2sodXN0 a3AgLSBucGFybSwgbnBhcm0gKiA0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAg ICAgICAgICBwdl9pbmplY3RfdHJhcChUUkFQX2dwX2ZhdWx0LCByZWdzKTsKLSAgICAgICAgICAg ICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkbwot ICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBhcm07 Ci0KLSAgICAgICAgICAgICAgICAgICAgLS11c3RrcDsKLSAgICAgICAgICAgICAgICAgICAgcmMg PSBfX2dldF91c2VyKHBhcm0sIHVzdGtwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCByYyAp Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB2X2luamVj dF9wYWdlX2ZhdWx0KDAsICh1bnNpZ25lZCBsb25nKSh1c3RrcCArIDEpIC0gcmMpOwotICAgICAg ICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAg ICAgICAgICAgICAgIHB1c2gocGFybSk7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoIC0tbnBh cm0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsK LSAgICAgICAgICAgIHNlbCB8PSAocmVncy0+Y3MgJiAzKTsKLSAgICAgICAgICAgIGVzcCA9IHJl Z3MtPnJzcDsKLSAgICAgICAgICAgIHNzID0gcmVncy0+c3M7Ci0gICAgICAgICAgICBpZiAoICFy ZWFkX2Rlc2NyaXB0b3Ioc3MsIHYsICZiYXNlLCAmbGltaXQsICZhciwgMCkgfHwKLSAgICAgICAg ICAgICAgICAgKChhciA+PiAxMykgJiAzKSAhPSAoc2VsICYgMykgKQotICAgICAgICAgICAgewot ICAgICAgICAgICAgICAgIHB2X2luamVjdF90cmFwKFRSQVBfZ3BfZmF1bHQsIHJlZ3MpOwotICAg ICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggIWNo ZWNrX3N0YWNrX2xpbWl0KGFyLCBsaW1pdCwgZXNwLCAyICogNCkgKQotICAgICAgICAgICAgewot ICAgICAgICAgICAgICAgIHB2X2luamVjdF9od19leGNlcHRpb24oVFJBUF9zdGFja19lcnJvciwg MCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg c3RrcCA9ICh1bnNpZ25lZCBpbnQgKikodW5zaWduZWQgbG9uZykoKHVuc2lnbmVkIGludCliYXNl ICsgZXNwKTsKLSAgICAgICAgICAgIGlmICggIWNvbXBhdF9hY2Nlc3Nfb2soc3RrcCAtIDIsIDIg KiA0KSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHZfaW5qZWN0X3RyYXAoVFJB UF9ncF9mYXVsdCwgcmVncyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAg fQotICAgICAgICB9Ci0gICAgICAgIHB1c2gocmVncy0+Y3MpOwotICAgICAgICBwdXNoKHJlZ3Mt PnJpcCArIGluc25fbGVuKTsKLSN1bmRlZiBwdXNoCi0gICAgICAgIHJlZ3MtPnJzcCA9IGVzcDsK LSAgICAgICAgcmVncy0+c3MgPSBzczsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBzZWwgfD0g KHJlZ3MtPmNzICYgMyk7Ci0KLSAgICByZWdzLT5jcyA9IHNlbDsKLSAgICBpbnN0cnVjdGlvbl9k b25lKHJlZ3MsIG9mZik7Ci19Ci0KIHZvaWQgZG9fZ2VuZXJhbF9wcm90ZWN0aW9uKHN0cnVjdCBj cHVfdXNlcl9yZWdzICpyZWdzKQogewogICAgIHN0cnVjdCB2Y3B1ICp2ID0gY3VycmVudDsKZGlm ZiAtLWdpdCBhL3hlbi9pbmNsdWRlL2FzbS14ODYvcHYvdHJhcHMuaCBiL3hlbi9pbmNsdWRlL2Fz bS14ODYvcHYvdHJhcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5m NDEyODdhZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIveGVuL2luY2x1ZGUvYXNtLXg4Ni9wdi90cmFw cy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBwdi90cmFwcy5oCisgKgorICogUFYgZ3Vlc3Qg dHJhcHMgaW50ZXJmYWNlIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFdl aSBMaXUgPHdlaS5saXUyQGNpdHJpeC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu ZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisg KiBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3Jn L2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX1g4Nl9QVl9UUkFQU19IX18KKyNkZWZpbmUg X19YODZfUFZfVFJBUFNfSF9fCisKKyNpZmRlZiBDT05GSUdfUFYKKworI2luY2x1ZGUgPHB1Ymxp Yy94ZW4uaD4KKworaW50IGVtdWxhdGVfcHJpdmlsZWdlZF9vcChzdHJ1Y3QgY3B1X3VzZXJfcmVn cyAqcmVncyk7Cit2b2lkIGVtdWxhdGVfZ2F0ZV9vcChzdHJ1Y3QgY3B1X3VzZXJfcmVncyAqcmVn cyk7CitpbnQgZW11bGF0ZV9mb3JjZWRfaW52YWxpZF9vcChzdHJ1Y3QgY3B1X3VzZXJfcmVncyAq cmVncyk7CitpbnQgZW11bGF0ZV9pbnZhbGlkX3JkdHNjcChzdHJ1Y3QgY3B1X3VzZXJfcmVncyAq cmVncyk7CisKKyNlbHNlICAvKiAhQ09ORklHX1BWICovCisKKyNpbmNsdWRlIDx4ZW4vZXJybm8u aD4KKworaW50IGVtdWxhdGVfcHJpdmlsZWdlZF9vcChzdHJ1Y3QgY3B1X3VzZXJfcmVncyAqcmVn cykgeyByZXR1cm4gLUVPUE5PVFNVUFA7IH0KK3ZvaWQgZW11bGF0ZV9nYXRlX29wKHN0cnVjdCBj cHVfdXNlcl9yZWdzICpyZWdzKSB7fQoraW50IGVtdWxhdGVfZm9yY2VkX2ludmFsaWRfb3Aoc3Ry dWN0IGNwdV91c2VyX3JlZ3MgKnJlZ3MpIHsgcmV0dXJuIC1FT1BOT1RTVVBQOyB9CitpbnQgZW11 bGF0ZV9pbnZhbGlkX3JkdHNjcChzdHJ1Y3QgY3B1X3VzZXJfcmVncyAqcmVncykgeyByZXR1cm4g LUVPUE5PVFNVUFA7IH0KKworI2VuZGlmCS8qIENPTkZJR19QViAqLworCisjZW5kaWYJLyogX19Y ODZfUFZfVFJBUFNfSF9fICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBtb2RlOiBD CisgKiBjLWZpbGUtc3R5bGU6ICJCU0QiCisgKiBjLWJhc2ljLW9mZnNldDogNAorICogdGFiLXdp ZHRoOiA0CisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIEVuZDoKKyAqLwotLSAKMi4xMS4w CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRl dmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhl bi5vcmcveGVuLWRldmVsCg==