From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Geoffrey D. Bennett" Subject: [PATCH V4] ALSA: usb-audio: Scarlett Gen 2 mixer interface Date: Tue, 9 Jul 2019 22:56:05 +0930 Message-ID: <20190709132605.GA25293@b4.vu> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from b4.vu (b4.vu [203.16.231.147]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id E7E05F800E2 for ; Tue, 9 Jul 2019 15:26:10 +0200 (CEST) Content-Disposition: inline List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" To: alsa-devel@alsa-project.org Cc: Takashi Iwai List-Id: alsa-devel@alsa-project.org QWRkIG1peGVyIHF1aXJrIGZvciB0aGUgRm9jdXNyaXRlIFNjYXJsZXR0IDZpNiwgMThpOCwgYW5k IDE4aTIwIEdlbiAyCmF1ZGlvIGludGVyZmFjZXMuIEFsdGhvdWdoIHRoZSBpbnRlcmZhY2VzIGFy ZSBVU0IgY29tcGxpYW50LAphZGRpdGlvbmFsIGlucHV0L291dHB1dCBsZXZlbCBjb250cm9scyBh bmQgaGFyZHdhcmUgcm91dGluZy9taXhpbmcKZnVuY3Rpb25hbGl0eSBhcmUgYXZhaWxhYmxlIHVz aW5nIHByb3ByaWV0YXJ5IFVTQiByZXF1ZXN0cy4KClNpZ25lZC1vZmYtYnk6IEdlb2ZmcmV5IEQu IEJlbm5ldHQgPGdAYjQudnU+Ci0tLQpIaSBhbGwsCgpUaGlzIHBhdGNoIGFkZHMgdGhlIGZvbGxv d2luZyBjb250cm9scyBmb3IgdGhlIFNjYXJsZXR0IDZpNiwgMThpOCwgYW5kCjE4aTIwIEdlbiAy OgotIE1hc3RlciB2b2x1bWUga25vYiBpbmRpY2F0b3IgKDE4aTIwIG9ubHkpCi0gTXV0ZSBhbmQg ZGltIHN3aXRjaGVzICgxOGkyMCBvbmx5KQotIFZvbHVtZSBjb250cm9scyBmb3IgdGhlIGFuYWxv Z3VlIEhXIG91dHB1dHMKLSBIVy9TVyB2b2x1bWUgc3dpdGNoZXMgZm9yIHRoZSAxMCBhbmFsb2d1 ZSBIVyBvdXRwdXRzICgxOGkyMCBvbmx5KQotIExpbmUgTGV2ZWwvSW5zdHJ1bWVudCBMZXZlbCBh bmQgUGFkIGNvbnRyb2xzICg2aTYgYW5kIDE4aTggb25seSkKLSBPdXRwdXQgbXV4ICh3aGVyZSB0 aGUgc291bmQgZm9yIHRoZSBIVyBvdXRwdXRzIGNvbWVzIGZyb207IGRlZmF1bHRzCiAgdG8gUENN IG91dHB1dHMpCi0gQ2FwdHVyZSBtdXggKHdoZXJlIHRoZSBzb3VuZCBmb3IgUENNIHJlY29yZGlu ZyBjb21lcyBmcm9tOyBkZWZhdWx0cwogIHRvIEhXIGlucHV0cykKLSBNYXRyaXggbXV4ICh3aGVy ZSB0aGUgc291bmQgZ29pbmcgaW50byB0aGUgbWl4ZXIgY29tZXMgZnJvbTsgMTgKICBpbnB1dHMg ZGVmYXVsdCBvZmYpCi0gTWl4ZXIgbWF0cml4ICgxOCBpbnB1dHMgKiAxMCBvdXRwdXRzID0gMTgw IGNvbnRyb2xzKQotIExldmVsIG1ldGVycwoKQ2hhbmdlcyBzaW5jZSB2MToKLSBBZGQgc3VwcG9y dCBmb3IgdGhlIFNjYXJsZXR0IDE4aTggR2VuIDIKLSBTYXZlIGNvbmZpZ3VyYXRpb24gcGFyYW1l dGVycyB0byBOVlJBTQotIEltcGxlbWVudGVkIGZlZWRiYWNrIGZyb20gVGFrYXNoaSdzIGVtYWls IDI0L0Fwci8yMDE5Ci0gTW92ZWQgcHJpdmF0ZSBmaWVsZCBmcm9tIHN0cnVjdCBzbmRfdXNiX2F1 ZGlvIHRvIHN0cnVjdAogIHVzYl9taXhlcl9pbnRlcmZhY2UKLSBBZGRlZCB0aW1lciBhbmQgYnVm ZmVyIGZpZWxkcyB0byBzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZQotIE90aGVyIHNtYWxsIGNv ZGUgZml4ZXMvY2xlYW51cHMvaW1wcm92ZW1lbnRzCgpDaGFuZ2VzIHNpbmNlIHYyOgotIEFkZCBz dXBwb3J0IGZvciB0aGUgU2NhcmxldHQgNmk2IEdlbiAyCi0gQWRkIHN1cHBvcnQgZm9yIGNvbnRy b2xsaW5nIHRoZSBtdXRlL2RpbSBzd2l0Y2hlcyAoMThpMjAgb25seSkKLSBJbXBsZW1lbnRlZCBm ZWVkYmFjayBmcm9tIFRha2FzaGkncyBlbWFpbCAyOS9BcHIvMjAxOTogT25lIHBvaW50ZXIKICBm aWVsZCBwcml2YXRlX2RhdGEgYW5kIG9uZSBmdW5jdGlvbiBwb2ludGVyIHByaXZhdGVfZnJlZS4g UmVwbGFjZWQKICB0aW1lciB3aXRoIGRlbGF5ZWQgd29yayAodGhhbmtzIGZvciB0aGF0IHN1Z2dl c3Rpb247IGl0IG1ha2VzIHRoZQogIGNvZGUgYSAqbG90KiBzaW1wbGVyISkuCi0gVGhlIG5ldyBm dW5jdGlvbmFsaXR5IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYXMgdGhlcmUgd2VyZSByZXBvcnRz CiAgb2Ygc29tZSBHZW4gMiBkZXZpY2VzIG5vdCByZXNwb25kaW5nIHRvIHRoZSBpbml0aWFsaXNh dGlvbiBzZXF1ZW5jZQogIGFuZCBoYW5naW5nLiBBZGRlZCBtb2R1bGUgcGFyYW1ldGVyICJzY2Fy bGV0dF9nZW4yX21peGVyX2VuYWJsZSIuCiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHNldCwg bG9ncyBhIG1lc3NhZ2UgIkZvY3Vzcml0ZSBTY2FybGV0dCBHZW4KICAyIE1peGVyIERyaXZlciBk aXNhYmxlZDsgdXNlIG9wdGlvbnMgc25kX3VzYl9hdWRpbwogIHNjYXJsZXR0X2dlbjJfbWl4ZXJf ZW5hYmxlPTEgdG8gZW5hYmxlIGFuZCByZXBvcnQgYW55IGlzc3VlcyB0bwogIGdAYjQudnUiLgoK Q2hhbmdlcyBzaW5jZSB2MzoKLSBObyBmdW5jdGlvbmFsIGNoYW5nZXM7IGZpeCBjaGVja3BhdGNo LnBsIGVycm9yIGFuZCB0eXBvIGluCiAgZGVjbGFyYXRpb24uCgpPbmx5IG91dHN0YW5kaW5nIHF1 ZXN0aW9uIEkgYmVsaWV2ZToKCi0gVGFrYXNoaSwgeW91IHdyb3RlIGxhc3QgdGltZSAiQWxzbywg dGhlIGRlbGF5ZWQgd29yayBuZWVkcyB0byBiZQogIGNhbmNlbGVkIG9yIGZsdXNoZWQgYXQgUE0g c3VzcGVuZCBjYWxsYmFjayBhcyB3ZWxsIGFzCiAgZGlzY29ubmVjdGluZy4iIEknbSBub3Qgc3Vy ZSB3aHkgaXQgc2hvdWxkIGJlIGNhbmNlbGxlZDsgaXMgaXQgbm90CiAgb2theSB0byBkbyBvbiBy ZXN1bWU/IEJ1dCBJIHRlc3RlZCBzdXNwZW5kaW5nIHdoaWxlIHRoZSBkZWxheWVkIHdvcmsKICB3 YXMgd2FpdGluZyBhbmQgaXQgc2VlbWVkIGxpa2UgdGhlIGRlbGF5ZWQgd29yayB3YXMgY2FuY2Vs bGVkCiAgYW55d2F5LiBQcm9iYWJseSBiZXR0ZXIgdG8gZG8gYSBmbHVzaCBvbiBzdXNwZW5kIHRo b3VnaDsgc2hvdWxkIHRoaXMKICBiZSBkb25lIHRocm91Z2ggYSBob29rIGxpa2U6CgogIGRpZmYg LS1naXQgYS9zb3VuZC91c2IvbWl4ZXIuYyBiL3NvdW5kL3VzYi9taXhlci5jCiAgaW5kZXggMjQ0 NDczN2ExNGIyLi4xNTcyYTg5MjY3YzYgMTAwNjQ0CiAgLS0tIGEvc291bmQvdXNiL21peGVyLmMK ICArKysgYi9zb3VuZC91c2IvbWl4ZXIuYwogIEBAIC0zNTQ3LDYgKzM1NDcsOCBAQCBzdGF0aWMg aW50IHNuZF91c2JfbWl4ZXJfYWN0aXZhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1p eGVyKQogICBpbnQgc25kX3VzYl9taXhlcl9zdXNwZW5kKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJm YWNlICptaXhlcikKICAgewogICAgICAgICAgc25kX3VzYl9taXhlcl9pbmFjdGl2YXRlKG1peGVy KTsKICArICAgICAgIGlmIChtaXhlci0+cHJpdmF0ZV9zdXNwZW5kKQogICsgICAgICAgICAgICAg ICBtaXhlci0+cHJpdmF0ZV9zdXNwZW5kKG1peGVyKTsKICAgICAgICAgIHJldHVybiAwOwogICB9 CiAgIAogIGRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXIuaCBiL3NvdW5kL3VzYi9taXhlci5o CiAgaW5kZXggZmE2ZTIxNmEwNmYwLi5kOTRjNjg4YzY1ZjcgMTAwNjQ0CiAgLS0tIGEvc291bmQv dXNiL21peGVyLmgKICArKysgYi9zb3VuZC91c2IvbWl4ZXIuaAogIEBAIC0yOCw2ICsyOCw3IEBA IHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlIHsKICAgCiAgICAgICAgICB2b2lkICpwcml2YXRl X2RhdGE7CiAgICAgICAgICB2b2lkICgqcHJpdmF0ZV9mcmVlKShzdHJ1Y3QgdXNiX21peGVyX2lu dGVyZmFjZSAqcHJpdmF0ZV9kYXRhKTsKICArICAgICAgIHZvaWQgKCpwcml2YXRlX3N1c3BlbmQp KHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICopOwogICB9OwogICAKICAgI2RlZmluZSBNQVhf Q0hBTk5FTFMgICAxNiAgICAgIC8qIG1heCBsb2dpY2FsIGNoYW5uZWxzICovCgogIC4uLm9yIGp1 c3Qga2VlcCB0aGUgZXhpc3RpbmcgYmVoYXZpb3VyIHdoZXJlIGl0IHNlZW1zIHRvIGdldAogIGNh bmNlbGxlZD8KClRoYW5rcywKR2VvZmZyZXkuCgpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL01ha2Vm aWxlIGIvc291bmQvdXNiL01ha2VmaWxlCmluZGV4IGUxY2UyNTdhYjcwNS4uZjRiNzM4NGNhYTlk IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvTWFrZWZpbGUKKysrIGIvc291bmQvdXNiL01ha2VmaWxl CkBAIC0xMSw2ICsxMSw3IEBAIHNuZC11c2ItYXVkaW8tb2JqcyA6PSAJY2FyZC5vIFwKIAkJCW1p eGVyLm8gXAogCQkJbWl4ZXJfcXVpcmtzLm8gXAogCQkJbWl4ZXJfc2NhcmxldHQubyBcCisJCQlt aXhlcl9zY2FybGV0dF9nZW4yLm8gXAogCQkJbWl4ZXJfdXMxNngwOC5vIFwKIAkJCXBjbS5vIFwK IAkJCXBvd2VyLm8gXApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyLmMgYi9zb3VuZC91c2Iv bWl4ZXIuYwppbmRleCBjNzAzZjg1MzRiMDcuLjA3OWViYjg1ODA1ZiAxMDA2NDQKLS0tIGEvc291 bmQvdXNiL21peGVyLmMKKysrIGIvc291bmQvdXNiL21peGVyLmMKQEAgLTM1MDUsNiArMzUwNSw4 IEBAIHZvaWQgc25kX3VzYl9taXhlcl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJm YWNlICptaXhlcikKIAkJdXNiX2tpbGxfdXJiKG1peGVyLT51cmIpOwogCWlmIChtaXhlci0+cmNf dXJiKQogCQl1c2Jfa2lsbF91cmIobWl4ZXItPnJjX3VyYik7CisJaWYgKG1peGVyLT5wcml2YXRl X2ZyZWUpCisJCW1peGVyLT5wcml2YXRlX2ZyZWUobWl4ZXIpOwogCW1peGVyLT5kaXNjb25uZWN0 ZWQgPSB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXIuaCBiL3NvdW5kL3Vz Yi9taXhlci5oCmluZGV4IDM5NGNkOTEwNzUwNy4uNDFlOGJlNjcxYjczIDEwMDY0NAotLS0gYS9z b3VuZC91c2IvbWl4ZXIuaAorKysgYi9zb3VuZC91c2IvbWl4ZXIuaApAQCAtMjgsNiArMjgsOSBA QCBzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSB7CiAJc3RydWN0IG1lZGlhX21peGVyX2N0bCAq bWVkaWFfbWl4ZXJfY3RsOwogCiAJYm9vbCBkaXNjb25uZWN0ZWQ7CisKKwl2b2lkICpwcml2YXRl X2RhdGE7CisJdm9pZCAoKnByaXZhdGVfZnJlZSkoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2Ug Km1peGVyKTsKIH07CiAKICNkZWZpbmUgTUFYX0NIQU5ORUxTCTE2CS8qIG1heCBsb2dpY2FsIGNo YW5uZWxzICovCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMgYi9zb3VuZC91 c2IvbWl4ZXJfcXVpcmtzLmMKaW5kZXggMTk5ZmExNTdhNDExLi43MDgwNWMxNWIwYjUgMTAwNjQ0 Ci0tLSBhL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYworKysgYi9zb3VuZC91c2IvbWl4ZXJfcXVp cmtzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJtaXhlci5oIgogI2luY2x1ZGUgIm1p eGVyX3F1aXJrcy5oIgogI2luY2x1ZGUgIm1peGVyX3NjYXJsZXR0LmgiCisjaW5jbHVkZSAibWl4 ZXJfc2NhcmxldHRfZ2VuMi5oIgogI2luY2x1ZGUgIm1peGVyX3VzMTZ4MDguaCIKICNpbmNsdWRl ICJoZWxwZXIuaCIKIApAQCAtMjI1OCw2ICsyMjU5LDEyIEBAIGludCBzbmRfdXNiX21peGVyX2Fw cGx5X2NyZWF0ZV9xdWlyayhzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCiAJCWVy ciA9IHNuZF9zY2FybGV0dF9jb250cm9sc19jcmVhdGUobWl4ZXIpOwogCQlicmVhazsKIAorCWNh c2UgVVNCX0lEKDB4MTIzNSwgMHg4MjAzKTogLyogRm9jdXNyaXRlIFNjYXJsZXR0IDZpNiAybmQg R2VuICovCisJY2FzZSBVU0JfSUQoMHgxMjM1LCAweDgyMDQpOiAvKiBGb2N1c3JpdGUgU2Nhcmxl dHQgMThpOCAybmQgR2VuICovCisJY2FzZSBVU0JfSUQoMHgxMjM1LCAweDgyMDEpOiAvKiBGb2N1 c3JpdGUgU2NhcmxldHQgMThpMjAgMm5kIEdlbiAqLworCQllcnIgPSBzbmRfc2NhcmxldHRfZ2Vu Ml9jb250cm9sc19jcmVhdGUobWl4ZXIpOworCQlicmVhazsKKwogCWNhc2UgVVNCX0lEKDB4MDQx ZSwgMHgzMjNiKTogLyogQ3JlYXRpdmUgU291bmQgQmxhc3RlciBFMSAqLwogCQllcnIgPSBzbmRf c291bmRibGFzdGVyX2UxX3N3aXRjaF9jcmVhdGUobWl4ZXIpOwogCQlicmVhazsKZGlmZiAtLWdp dCBhL3NvdW5kL3VzYi9taXhlcl9zY2FybGV0dF9nZW4yLmMgYi9zb3VuZC91c2IvbWl4ZXJfc2Nh cmxldHRfZ2VuMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMDJi YWI2YWU1OWU4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL21peGVyX3NjYXJsZXR0X2dl bjIuYwpAQCAtMCwwICsxLDIwNzggQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wCisvKgorICogICBGb2N1c3JpdGUgU2NhcmxldHQgNmk2LzE4aTgvMThpMjAgR2VuIDIgRHJp dmVyIGZvciBBTFNBCisgKgorICogICBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBieSBHZW9mZnJl eSBELiBCZW5uZXR0IDxnIGF0IGI0LnZ1PgorICoKKyAqICAgQmFzZWQgb24gdGhlIFNjYXJsZXR0 IChHZW4gMSkgRHJpdmVyIGZvciBBTFNBOgorICoKKyAqICAgQ29weXJpZ2h0IChjKSAyMDEzIGJ5 IFRvYmlhcyBIb2ZmbWFubgorICogICBDb3B5cmlnaHQgKGMpIDIwMTMgYnkgUm9iaW4gR2FyZXVz IDxyb2JpbiBhdCBnYXJldXMub3JnPgorICogICBDb3B5cmlnaHQgKGMpIDIwMDIgYnkgVGFrYXNo aSBJd2FpIDx0aXdhaSBhdCBzdXNlLmRlPgorICogICBDb3B5cmlnaHQgKGMpIDIwMTQgYnkgQ2hy aXMgSiBBcmdlcyA8Y2hyaXMuai5hcmdlcyBhdCBjYW5vbmljYWwuY29tPgorICoKKyAqICAgTWFu eSBjb2RlcyBib3Jyb3dlZCBmcm9tIGF1ZGlvLmMgYnkKKyAqICAgICBBbGFuIENveCAoYWxhbiBh dCBseG9yZ3VrLnVrdXUub3JnLnVrKQorICogICAgIFRob21hcyBTYWlsZXIgKHNhaWxlciBhdCBp ZmUuZWUuZXRoei5jaCkKKyAqCisgKiAgIENvZGUgY2xlYW51cDoKKyAqICAgRGF2aWQgSGVubmlu Z3Nzb24gPGRhdmlkLmhlbm5pbmdzc29uIGF0IGNhbm9uaWNhbC5jb20+CisgKgorICogICBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRI T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg KiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls cy4KKyAqCisgKi8KKworLyogTWl4ZXIgSW50ZXJmYWNlIGZvciB0aGUgRm9jdXNyaXRlIFNjYXJs ZXR0IDZpNi8xOGk4LzE4aTIwIEdlbiAyIGF1ZGlvCisgKiBpbnRlcmZhY2UuIEJhc2VkIG9uIHRo ZSBHZW4gMSBkcml2ZXIgYW5kIHJld3JpdHRlbi4KKyAqLworCisvKiBUaGUgcHJvdG9jb2wgd2Fz IHJldmVyc2UgZW5naW5lZXJlZCBieSBsb29raW5nIGF0IHRoZSBjb21tdW5pY2F0aW9uCisgKiBi ZXR3ZWVuIEZvY3Vzcml0ZSBDb250cm9sIDIuMy40IGFuZCB0aGUgRm9jdXNyaXRlKFIpIFNjYXJs ZXR0IDE4aTIwCisgKiAoZmlybXdhcmUgMTA4MykgdXNpbmcgdXNibW9uIGluIEp1bHktQXVndXN0 IDIwMTguCisgKgorICogU2NhcmxldHQgMThpOCBzdXBwb3J0IGFkZGVkIGluIEFwcmlsIDIwMTku CisgKgorICogU2NhcmxldHQgNmk2IHN1cHBvcnQgYWRkZWQgaW4gSnVuZSAyMDE5ICh0aGFua3Mg dG8gTWFydGluIFdpdHRtYW5uCisgKiBmb3IgcHJvdmlkaW5nIHVzYm1vbiBvdXRwdXQgYW5kIHRl c3RpbmcpLgorICoKKyAqIFRoaXMgQUxTQSBtaXhlciBnaXZlcyBhY2Nlc3MgdG86CisgKiAgLSBp bnB1dCwgb3V0cHV0LCBtaXhlci1tYXRyaXggbXV4ZXMKKyAqICAtIDE4eDEwIG1peGVyLW1hdHJp eCBnYWluIHN0YWdlcworICogIC0gZ2Fpbi92b2x1bWUgY29udHJvbHMKKyAqICAtIGxldmVsIG1l dGVycworICogIC0gbGluZS9pbnN0IGxldmVsIGFuZCBwYWQgY29udHJvbHMKKyAqCisgKiA8ZGl0 YWE+CisgKiAgICAvLS0tLS0tLS0tLS0tLS1cICAgIDE4Y2huICAgICAgICAgICAgMjBjaG4gICAg IC8tLS0tLS0tLS0tLS0tLVwKKyAqICAgIHwgSGFyZHdhcmUgIGluICstLSstLS0tLS1cICAgIC8t LS0tLS0tLS0tLS0tKy0tKyBBTFNBIFBDTSBvdXQgfAorICogICAgXC0tLS0tLS0tLS0tLS0tLyAg fCAgICAgIHwgICAgfCAgICAgICAgICAgICB8ICBcLS0tLS0tLS0tLS0tLS0vCisgKiAgICAgICAg ICAgICAgICAgICAgICB8ICAgICAgfCAgICB8ICAgIC8tLS0tLVwgIHwKKyAqICAgICAgICAgICAg ICAgICAgICAgIHwgICAgICB8ICAgIHwgICAgfCAgICAgfCAgfAorICogICAgICAgICAgICAgICAg ICAgICAgfCAgICAgIHYgICAgdiAgICB2ICAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAg ICB8ICAgKy0tLS0tLS0tLS0tLS0tLSsgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwg ICAgXCBNYXRyaXggIE11eCAvICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAg Ky0tLS0tKy0tLS0tKyAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAg ICB8ICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwx OGNobiAgICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAg ICAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAxMGNo bnwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHYgICAgICAgICAgfCAg fAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tLSsgICB8ICB8Cisg KiAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IE1peGVyICAgICAgfCAgIHwgIHwKKyAqICAg ICAgICAgICAgICAgICAgICAgIHwgICAgIHwgICAgIE1hdHJpeCB8ICAgfCAgfAorICogICAgICAg ICAgICAgICAgICAgICAgfCAgICAgfCAgICAgICAgICAgIHwgICB8ICB8CisgKiAgICAgICAgICAg ICAgICAgICAgICB8ICAgICB8IDE4eDEwIEdhaW4gfCAgIHwgIHwKKyAqICAgICAgICAgICAgICAg ICAgICAgIHwgICAgIHwgICBzdGFnZXMgICB8ICAgfCAgfAorICogICAgICAgICAgICAgICAgICAg ICAgfCAgICAgKy0tLS0tKy0tLS0tLSsgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8 ICAgICAgICAgICB8ICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwxOGNo biAgICAgIHwxMGNobiAgICAgfCAgfDIwY2huCisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAg ICAgICAgICB8ICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAg ICAgICstLS0tLS0tLS0tLyAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAg fCAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB2ICAgICAgICAgICB2ICAg ICAgICAgICAgIHYKKyAqICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09 PT09PT09PQorICogICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICArLS3igJQt LS0tLS0tLS0tLS0rCisgKiAgICAgICAgICAgICAgICBcIE91dHB1dCAgTXV4IC8gICAgICAgICBc IENhcHR1cmUgTXV4IC8KKyAqICAgICAgICAgICAgICAgICArLS0tKy0tLSstLS0rICAgICAgICAg ICArLS0tLS0rLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICAgICAgICAg ICAgICAgICAgfAorICogICAgICAgICAgICAgICAgMTBjaG58ICAgfCAgICAgICAgICAgICAgICAg ICAgIHwxOGNobgorICogICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgICAgICAgICAgICAg ICAgIHwKKyAqICAvLS0tLS0tLS0tLS0tLS1cICAgfCAgIHwgICAgICAgICAgICAgICAgICAgICB8 ICAgLy0tLS0tLS0tLS0tLS0tXAorICogIHwgUy9QRElGLCBBREFUIHw8LS0vICAgfDEwY2huICAg ICAgICAgICAgICAgIFwtLT58IEFMU0EgUENNIGluICB8CisgKiAgfCBIYXJkd2FyZSBvdXQgfCAg ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFwtLS0tLS0tLS0tLS0tLS8KKyAqICBcLS0t LS0tLS0tLS0tLS0vICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHYKKyAqICAg ICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0rICAgIFNvZnR3YXJlIGdhaW4gcGVyIGNoYW5u ZWwuCisgKiAgICAgICAgICAgICAgICAgIHwgTWFzdGVyIEdhaW4gfDwtLSAxOGkyMCBvbmx5OiBT d2l0Y2ggcGVyIGNoYW5uZWwKKyAqICAgICAgICAgICAgICAgICAgKy0tLS0tLSstLS0tLS0rICAg IHRvIHNlbGVjdCBIVyBvciBTVyBnYWluIGNvbnRyb2wuCisgKiAgICAgICAgICAgICAgICAgICAg ICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICB8MTBjaG4KKyAqICAvLS0tLS0tLS0t LS0tLS1cICAgICAgIHwKKyAqICB8IEFuYWxvZ3VlICAgICB8PC0tLS0tLS8KKyAqICB8IEhhcmR3 YXJlIG91dCB8CisgKiAgXC0tLS0tLS0tLS0tLS0tLworICogPC9kaXRhYT4KKyAqCisgKi8KKwor I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRl IDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2lu Y2x1ZGUgPHNvdW5kL3Rsdi5oPgorCisjaW5jbHVkZSAidXNiYXVkaW8uaCIKKyNpbmNsdWRlICJt aXhlci5oIgorI2luY2x1ZGUgImhlbHBlci5oIgorCisjaW5jbHVkZSAibWl4ZXJfc2NhcmxldHRf Z2VuMi5oIgorCitzdGF0aWMgaW50IHNjYXJsZXR0X2dlbjJfbWl4ZXJfZW5hYmxlOworbW9kdWxl X3BhcmFtKHNjYXJsZXR0X2dlbjJfbWl4ZXJfZW5hYmxlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BB Uk1fREVTQyhzY2FybGV0dF9nZW4yX21peGVyX2VuYWJsZSwKKwkJICJGb2N1c3JpdGUgU2Nhcmxl dHQgR2VuIDIgTWl4ZXIgRHJpdmVyIEVuYWJsZSIpOworCisvKiBzb21lIGd1aSBtaXhlcnMgY2Fu J3QgaGFuZGxlIG5lZ2F0aXZlIGN0bCB2YWx1ZXMgKi8KKyNkZWZpbmUgU0NBUkxFVFRfVk9MVU1F X0JJQVMgMTI3CisKKy8qIG1peGVyIHJhbmdlIGZyb20gLTgwZEIgdG8gKzZkQiBpbiAwLjVkQiBz dGVwcyAqLworI2RlZmluZSBTQ0FSTEVUVF9NSVhFUl9NSU5fREIgLTgwCisjZGVmaW5lIFNDQVJM RVRUX01JWEVSX0JJQVMgKC1TQ0FSTEVUVF9NSVhFUl9NSU5fREIgKiAyKQorI2RlZmluZSBTQ0FS TEVUVF9NSVhFUl9NQVhfREIgNgorI2RlZmluZSBTQ0FSTEVUVF9NSVhFUl9NQVhfVkFMVUUgXAor CSgoU0NBUkxFVFRfTUlYRVJfTUFYX0RCIC0gU0NBUkxFVFRfTUlYRVJfTUlOX0RCKSAqIDIpCisK Ky8qIG1hcCBmcm9tIChkQiArIDgwKSAqIDIgdG8gbWl4ZXIgdmFsdWUKKyAqIGZvciBkQiBpbiAw IC4uIDE3MjogaW50KDgxOTIgKiBwb3coMTAsICgoZEIgLSAxNjApIC8gMiAvIDIwKSkpCisgKi8K K3N0YXRpYyBjb25zdCB1MTYgc2NhcmxldHQyX21peGVyX3ZhbHVlc1sxNzNdID0geworCTAsIDAs IDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIs CisJMiwgMiwgMywgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNiwgNiwgNiwgNywg NywgOCwgOCwKKwk5LCA5LCAxMCwgMTAsIDExLCAxMiwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywg MTgsIDE5LCAyMCwgMjEsCisJMjMsIDI0LCAyNSwgMjcsIDI5LCAzMCwgMzIsIDM0LCAzNiwgMzgs IDQxLCA0MywgNDYsIDQ4LCA1MSwKKwk1NCwgNTcsIDYxLCA2NSwgNjgsIDczLCA3NywgODEsIDg2 LCA5MSwgOTcsIDEwMywgMTA5LCAxMTUsCisJMTIyLCAxMjksIDEzNywgMTQ1LCAxNTQsIDE2Mywg MTczLCAxODMsIDE5NCwgMjA1LCAyMTcsIDIzMCwKKwkyNDQsIDI1OSwgMjc0LCAyOTAsIDMwNywg MzI2LCAzNDUsIDM2NSwgMzg3LCA0MTAsIDQzNCwgNDYwLAorCTQ4NywgNTE2LCA1NDcsIDU3OSwg NjE0LCA2NTAsIDY4OSwgNzMwLCA3NzMsIDgxOSwgODY3LCA5MTksCisJOTczLCAxMDMxLCAxMDky LCAxMTU3LCAxMjI1LCAxMjk4LCAxMzc1LCAxNDU2LCAxNTQzLCAxNjM0LAorCTE3MzEsIDE4MzMs IDE5NDIsIDIwNTcsIDIxNzksIDIzMDgsIDI0NDUsIDI1OTAsIDI3NDQsIDI5MDYsCisJMzA3OCwg MzI2MSwgMzQ1NCwgMzY1OSwgMzg3NiwgNDEwNSwgNDM0OSwgNDYwNiwgNDg3OSwgNTE2OCwKKwk1 NDc1LCA1Nzk5LCA2MTQzLCA2NTA3LCA2ODkyLCA3MzAxLCA3NzMzLCA4MTkyLCA4Njc3LCA5MTkx LAorCTk3MzYsIDEwMzEzLCAxMDkyNCwgMTE1NzEsIDEyMjU3LCAxMjk4MywgMTM3NTIsIDE0NTY3 LCAxNTQzMCwKKwkxNjM0NQorfTsKKworLyogTWF4aW11bSBudW1iZXIgb2YgYW5hbG9ndWUgb3V0 cHV0cyAqLworI2RlZmluZSBTQ0FSTEVUVDJfQU5BTE9HVUVfTUFYIDEwCisKKy8qIE1heGltdW0g bnVtYmVyIG9mIGxldmVsIGFuZCBwYWQgc3dpdGNoZXMgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX0xF VkVMX1NXSVRDSF9NQVggMgorI2RlZmluZSBTQ0FSTEVUVDJfUEFEX1NXSVRDSF9NQVggNAorCisv KiBNYXhpbXVtIG51bWJlciBvZiBpbnB1dHMgdG8gdGhlIG1peGVyICovCisjZGVmaW5lIFNDQVJM RVRUMl9JTlBVVF9NSVhfTUFYIDE4CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG91dHB1dHMgZnJv bSB0aGUgbWl4ZXIgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX09VVFBVVF9NSVhfTUFYIDEwCisKKy8q IE1heGltdW0gc2l6ZSBvZiB0aGUgZGF0YSBpbiB0aGUgVVNCIG11eCBhc3NpZ25tZW50IG1lc3Nh Z2U6CisgKiAxOCBpbnB1dHMsIDIwIG91dHB1dHMsIDE4IG1hdHJpeCBpbnB1dHMsIDggc3BhcmUK KyAqLworI2RlZmluZSBTQ0FSTEVUVDJfTVVYX01BWCA2NAorCisvKiBOdW1iZXIgb2YgbWV0ZXJz OgorICogMTggaW5wdXRzLCAyMCBvdXRwdXRzLCAxOCBtYXRyaXggaW5wdXRzCisgKi8KKyNkZWZp bmUgU0NBUkxFVFQyX05VTV9NRVRFUlMgNTYKKworLyogSGFyZHdhcmUgcG9ydCB0eXBlczoKKyAq IC0gTm9uZSAobm8gaW5wdXQgdG8gbXV4KQorICogLSBBbmFsb2d1ZSBJL08KKyAqIC0gUy9QRElG IEkvTworICogLSBBREFUIEkvTworICogLSBNaXhlciBJL08KKyAqIC0gUENNIEkvTworICovCitl bnVtIHsKKwlTQ0FSTEVUVDJfUE9SVF9UWVBFX05PTkUgPSAwLAorCVNDQVJMRVRUMl9QT1JUX1RZ UEVfQU5BTE9HVUUgPSAxLAorCVNDQVJMRVRUMl9QT1JUX1RZUEVfU1BESUYgPSAyLAorCVNDQVJM RVRUMl9QT1JUX1RZUEVfQURBVCA9IDMsCisJU0NBUkxFVFQyX1BPUlRfVFlQRV9NSVggPSA0LAor CVNDQVJMRVRUMl9QT1JUX1RZUEVfUENNID0gNSwKKwlTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5U ID0gNiwKK307CisKKy8qIENvdW50IG9mIHRvdGFsIEkvTyBhbmQgbnVtYmVyIGF2YWlsYWJsZSBh dCBlYWNoIHNhbXBsZSByYXRlICovCitlbnVtIHsKKwlTQ0FSTEVUVDJfUE9SVF9JTiA9IDAsCisJ U0NBUkxFVFQyX1BPUlRfT1VUID0gMSwKKwlTQ0FSTEVUVDJfUE9SVF9PVVRfNDQgPSAyLAorCVND QVJMRVRUMl9QT1JUX09VVF84OCA9IDMsCisJU0NBUkxFVFQyX1BPUlRfT1VUXzE3NiA9IDQsCisJ U0NBUkxFVFQyX1BPUlRfRElSRUNUSU9OUyA9IDUsCit9OworCisvKiBIYXJkd2FyZSBidXR0b25z IG9uIHRoZSAxOGkyMCAqLworI2RlZmluZSBTQ0FSTEVUVDJfQlVUVE9OX01BWCAyCisKK3N0YXRp YyBjb25zdCBjaGFyICpjb25zdCBzY2FybGV0dDJfYnV0dG9uX25hbWVzW1NDQVJMRVRUMl9CVVRU T05fTUFYXSA9IHsKKwkiTXV0ZSIsICJEaW0iCit9OworCisvKiBEZXNjcmlwdGlvbiBvZiBlYWNo IGhhcmR3YXJlIHBvcnQgdHlwZToKKyAqIC0gaWQ6IGhhcmR3YXJlIElEIGZvciB0aGlzIHBvcnQg dHlwZQorICogLSBudW06IG51bWJlciBvZiBzb3VyY2VzL2Rlc3RpbmF0aW9ucyBvZiB0aGlzIHBv cnQgdHlwZQorICogLSBzcmNfZGVzY3I6IHByaW50ZiBmb3JtYXQgc3RyaW5nIGZvciBtdXggaW5w dXQgc2VsZWN0aW9ucworICogLSBzcmNfbnVtX29mZnNldDogYWRkZWQgdG8gY2hhbm5lbCBudW1i ZXIgZm9yIHRoZSBmcHJpbnRmCisgKiAtIGRzdF9kZXNjcjogcHJpbnRmIGZvcm1hdCBzdHJpbmcg Zm9yIG1peGVyIGNvbnRyb2xzCisgKi8KK3N0cnVjdCBzY2FybGV0dDJfcG9ydHMgeworCXUxNiBp ZDsKKwlpbnQgbnVtW1NDQVJMRVRUMl9QT1JUX0RJUkVDVElPTlNdOworCWNvbnN0IGNoYXIgKiBj b25zdCBzcmNfZGVzY3I7CisJaW50IHNyY19udW1fb2Zmc2V0OworCWNvbnN0IGNoYXIgKiBjb25z dCBkc3RfZGVzY3I7Cit9OworCitzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvIHsKKwl1OCBs aW5lX291dF9od192b2w7IC8qIGxpbmUgb3V0IGh3IHZvbHVtZSBpcyBzdyBjb250cm9sbGVkICov CisJdTggYnV0dG9uX2NvdW50OyAvKiBudW1iZXIgb2YgYnV0dG9ucyAqLworCXU4IGxldmVsX2lu cHV0X2NvdW50OyAvKiBpbnB1dHMgd2l0aCBsZXZlbCBzZWxlY3RhYmxlICovCisJdTggcGFkX2lu cHV0X2NvdW50OyAvKiBpbnB1dHMgd2l0aCBwYWQgc2VsZWN0YWJsZSAqLworCWNvbnN0IGNoYXIg KiBjb25zdCBsaW5lX291dF9kZXNjcnNbU0NBUkxFVFQyX0FOQUxPR1VFX01BWF07CisJc3RydWN0 IHNjYXJsZXR0Ml9wb3J0cyBwb3J0c1tTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UXTsKK307CisK K3N0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSB7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZh Y2UgKm1peGVyOworCXN0cnVjdCBtdXRleCB1c2JfbXV0ZXg7IC8qIHByZXZlbnQgc2VuZGluZyBj b25jdXJyZW50IFVTQiByZXF1ZXN0cyAqLworCXN0cnVjdCBtdXRleCBkYXRhX211dGV4OyAvKiBs b2NrIGFjY2VzcyB0byB0aGlzIGRhdGEgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CisJ Y29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyAqaW5mbzsKKwlpbnQgbnVtX211eF9z cmNzOworCXUxNiBzY2FybGV0dDJfc2VxOworCXU4IHZvbF91cGRhdGVkOworCXU4IG1hc3Rlcl92 b2w7CisJdTggdm9sW1NDQVJMRVRUMl9BTkFMT0dVRV9NQVhdOworCXU4IHZvbF9zd19od19zd2l0 Y2hbU0NBUkxFVFQyX0FOQUxPR1VFX01BWF07CisJdTggbGV2ZWxfc3dpdGNoW1NDQVJMRVRUMl9M RVZFTF9TV0lUQ0hfTUFYXTsKKwl1OCBwYWRfc3dpdGNoW1NDQVJMRVRUMl9QQURfU1dJVENIX01B WF07CisJdTggYnV0dG9uc1tTQ0FSTEVUVDJfQlVUVE9OX01BWF07CisJc3RydWN0IHNuZF9rY29u dHJvbCAqbWFzdGVyX3ZvbF9jdGw7CisJc3RydWN0IHNuZF9rY29udHJvbCAqdm9sX2N0bHNbU0NB UkxFVFQyX0FOQUxPR1VFX01BWF07CisJc3RydWN0IHNuZF9rY29udHJvbCAqYnV0dG9uX2N0bHNb U0NBUkxFVFQyX0JVVFRPTl9NQVhdOworCXU4IG11eFtTQ0FSTEVUVDJfTVVYX01BWF07CisJdTgg bWl4W1NDQVJMRVRUMl9JTlBVVF9NSVhfTUFYICogU0NBUkxFVFQyX09VVFBVVF9NSVhfTUFYXTsK K307CisKK3N0YXRpYyB2b2lkIHNuZF9zY2FybGV0dF9nZW4yX3ByaXZhdGVfZnJlZShzdHJ1Y3Qg dXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpOworCisvKioqIE1vZGVsLXNwZWNpZmljIGRhdGEg KioqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyBzNmk2X2dl bjJfaW5mbyA9IHsKKwkvKiBUaGUgZmlyc3QgdHdvIGFuYWxvZ3VlIGlucHV0cyBjYW4gYmUgc3dp dGNoZWQgYmV0d2VlbiBsaW5lCisJICogYW5kIGluc3RydW1lbnQgbGV2ZWxzLgorCSAqLworCS5s ZXZlbF9pbnB1dF9jb3VudCA9IDIsCisKKwkvKiBUaGUgZmlyc3QgdHdvIGFuYWxvZ3VlIGlucHV0 cyBoYXZlIGFuIG9wdGlvbmFsIHBhZC4gKi8KKwkucGFkX2lucHV0X2NvdW50ID0gMiwKKworCS5s aW5lX291dF9kZXNjcnMgPSB7CisJCSJNb25pdG9yIEwiLAorCQkiTW9uaXRvciBSIiwKKwkJIkhl YWRwaG9uZXMgTCIsCisJCSJIZWFkcGhvbmVzIFIiLAorCX0sCisKKwkucG9ydHMgPSB7CisJCXsK KwkJCS5pZCA9IDB4MDAwLAorCQkJLm51bSA9IHsgMSwgMCwgOCwgOCwgOCB9LAorCQkJLnNyY19k ZXNjciA9ICJPZmYiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gMCwKKwkJfSwKKwkJeworCQkJLmlk ID0gMHgwODAsCisJCQkubnVtID0geyA0LCA0LCA0LCA0LCA0IH0sCisJCQkuc3JjX2Rlc2NyID0g IkFuYWxvZ3VlICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDEsCisJCQkuZHN0X2Rlc2NyID0g IkFuYWxvZ3VlIE91dHB1dCAlMDJkIFBsYXliYWNrIgorCQl9LAorCQl7CisJCQkuaWQgPSAweDE4 MCwKKwkJCS5udW0gPSB7IDIsIDIsIDIsIDIsIDIgfSwKKwkJCS5zcmNfZGVzY3IgPSAiUy9QRElG ICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDEsCisJCQkuZHN0X2Rlc2NyID0gIlMvUERJRiBP dXRwdXQgJWQgUGxheWJhY2siCisJCX0sCisJCXsKKwkJCS5pZCA9IDB4MzAwLAorCQkJLm51bSA9 IHsgMTAsIDE4LCAxOCwgMTgsIDE4IH0sCisJCQkuc3JjX2Rlc2NyID0gIk1peCAlYyIsCisJCQku c3JjX251bV9vZmZzZXQgPSA2NSwKKwkJCS5kc3RfZGVzY3IgPSAiTWl4ZXIgSW5wdXQgJTAyZCBD YXB0dXJlIgorCQl9LAorCQl7CisJCQkuaWQgPSAweDYwMCwKKwkJCS5udW0gPSB7IDYsIDYsIDYs IDYsIDYgfSwKKwkJCS5zcmNfZGVzY3IgPSAiUENNICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9 IDEsCisJCQkuZHN0X2Rlc2NyID0gIlBDTSAlMDJkIENhcHR1cmUiCisJCX0sCisJfSwKK307CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvIHMxOGk4X2dlbjJfaW5m byA9IHsKKwkvKiBUaGUgZmlyc3QgdHdvIGFuYWxvZ3VlIGlucHV0cyBjYW4gYmUgc3dpdGNoZWQg YmV0d2VlbiBsaW5lCisJICogYW5kIGluc3RydW1lbnQgbGV2ZWxzLgorCSAqLworCS5sZXZlbF9p bnB1dF9jb3VudCA9IDIsCisKKwkvKiBUaGUgZmlyc3QgZm91ciBhbmFsb2d1ZSBpbnB1dHMgaGF2 ZSBhbiBvcHRpb25hbCBwYWQuICovCisJLnBhZF9pbnB1dF9jb3VudCA9IDQsCisKKwkubGluZV9v dXRfZGVzY3JzID0geworCQkiTW9uaXRvciBMIiwKKwkJIk1vbml0b3IgUiIsCisJCSJIZWFkcGhv bmVzIDEgTCIsCisJCSJIZWFkcGhvbmVzIDEgUiIsCisJCSJIZWFkcGhvbmVzIDIgTCIsCisJCSJI ZWFkcGhvbmVzIDIgUiIsCisJfSwKKworCS5wb3J0cyA9IHsKKwkJeworCQkJLmlkID0gMHgwMDAs CisJCQkubnVtID0geyAxLCAwLCA4LCA4LCA0IH0sCisJCQkuc3JjX2Rlc2NyID0gIk9mZiIsCisJ CQkuc3JjX251bV9vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSAweDA4MCwKKwkJCS5u dW0gPSB7IDgsIDYsIDYsIDYsIDYgfSwKKwkJCS5zcmNfZGVzY3IgPSAiQW5hbG9ndWUgJWQiLAor CQkJLnNyY19udW1fb2Zmc2V0ID0gMSwKKwkJCS5kc3RfZGVzY3IgPSAiQW5hbG9ndWUgT3V0cHV0 ICUwMmQgUGxheWJhY2siCisJCX0sCisJCXsKKwkJCS8qIFMvUERJRiBvdXRwdXRzIGFyZW4ndCBh dmFpbGFibGUgYXQgMTkyS0h6CisJCQkgKiBidXQgYXJlIGluY2x1ZGVkIGluIHRoZSBVU0IgbXV4 IEkvTworCQkJICogYXNzaWdubWVudCBtZXNzYWdlIGFueXdheQorCQkJICovCisJCQkuaWQgPSAw eDE4MCwKKwkJCS5udW0gPSB7IDIsIDIsIDIsIDIsIDIgfSwKKwkJCS5zcmNfZGVzY3IgPSAiUy9Q RElGICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDEsCisJCQkuZHN0X2Rlc2NyID0gIlMvUERJ RiBPdXRwdXQgJWQgUGxheWJhY2siCisJCX0sCisJCXsKKwkJCS5pZCA9IDB4MjAwLAorCQkJLm51 bSA9IHsgOCwgMCwgMCwgMCwgMCB9LAorCQkJLnNyY19kZXNjciA9ICJBREFUICVkIiwKKwkJCS5z cmNfbnVtX29mZnNldCA9IDEsCisJCX0sCisJCXsKKwkJCS5pZCA9IDB4MzAwLAorCQkJLm51bSA9 IHsgMTAsIDE4LCAxOCwgMTgsIDE4IH0sCisJCQkuc3JjX2Rlc2NyID0gIk1peCAlYyIsCisJCQku c3JjX251bV9vZmZzZXQgPSA2NSwKKwkJCS5kc3RfZGVzY3IgPSAiTWl4ZXIgSW5wdXQgJTAyZCBD YXB0dXJlIgorCQl9LAorCQl7CisJCQkuaWQgPSAweDYwMCwKKwkJCS5udW0gPSB7IDIwLCAxOCwg MTgsIDE0LCAxMCB9LAorCQkJLnNyY19kZXNjciA9ICJQQ00gJWQiLAorCQkJLnNyY19udW1fb2Zm c2V0ID0gMSwKKwkJCS5kc3RfZGVzY3IgPSAiUENNICUwMmQgQ2FwdHVyZSIKKwkJfSwKKwl9LAor fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gczE4aTIwX2dl bjJfaW5mbyA9IHsKKwkvKiBUaGUgYW5hbG9ndWUgbGluZSBvdXRwdXRzIG9uIHRoZSAxOGkyMCBj YW4gYmUgc3dpdGNoZWQKKwkgKiBiZXR3ZWVuIHNvZnR3YXJlIGFuZCBoYXJkd2FyZSB2b2x1bWUg Y29udHJvbAorCSAqLworCS5saW5lX291dF9od192b2wgPSAxLAorCisJLyogTXV0ZSBhbmQgZGlt IGJ1dHRvbnMgKi8KKwkuYnV0dG9uX2NvdW50ID0gMiwKKworCS5saW5lX291dF9kZXNjcnMgPSB7 CisJCSJNb25pdG9yIEwiLAorCQkiTW9uaXRvciBSIiwKKwkJTlVMTCwKKwkJTlVMTCwKKwkJTlVM TCwKKwkJTlVMTCwKKwkJIkhlYWRwaG9uZXMgMSBMIiwKKwkJIkhlYWRwaG9uZXMgMSBSIiwKKwkJ IkhlYWRwaG9uZXMgMiBMIiwKKwkJIkhlYWRwaG9uZXMgMiBSIiwKKwl9LAorCisJLnBvcnRzID0g eworCQl7CisJCQkuaWQgPSAweDAwMCwKKwkJCS5udW0gPSB7IDEsIDAsIDgsIDgsIDYgfSwKKwkJ CS5zcmNfZGVzY3IgPSAiT2ZmIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDAsCisJCX0sCisJCXsK KwkJCS5pZCA9IDB4MDgwLAorCQkJLm51bSA9IHsgOCwgMTAsIDEwLCAxMCwgMTAgfSwKKwkJCS5z cmNfZGVzY3IgPSAiQW5hbG9ndWUgJWQiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gMSwKKwkJCS5k c3RfZGVzY3IgPSAiQW5hbG9ndWUgT3V0cHV0ICUwMmQgUGxheWJhY2siCisJCX0sCisJCXsKKwkJ CS8qIFMvUERJRiBvdXRwdXRzIGFyZW4ndCBhdmFpbGFibGUgYXQgMTkyS0h6CisJCQkgKiBidXQg YXJlIGluY2x1ZGVkIGluIHRoZSBVU0IgbXV4IEkvTworCQkJICogYXNzaWdubWVudCBtZXNzYWdl IGFueXdheQorCQkJICovCisJCQkuaWQgPSAweDE4MCwKKwkJCS5udW0gPSB7IDIsIDIsIDIsIDIs IDIgfSwKKwkJCS5zcmNfZGVzY3IgPSAiUy9QRElGICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9 IDEsCisJCQkuZHN0X2Rlc2NyID0gIlMvUERJRiBPdXRwdXQgJWQgUGxheWJhY2siCisJCX0sCisJ CXsKKwkJCS5pZCA9IDB4MjAwLAorCQkJLm51bSA9IHsgOCwgOCwgOCwgNCwgMCB9LAorCQkJLnNy Y19kZXNjciA9ICJBREFUICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDEsCisJCQkuZHN0X2Rl c2NyID0gIkFEQVQgT3V0cHV0ICVkIFBsYXliYWNrIgorCQl9LAorCQl7CisJCQkuaWQgPSAweDMw MCwKKwkJCS5udW0gPSB7IDEwLCAxOCwgMTgsIDE4LCAxOCB9LAorCQkJLnNyY19kZXNjciA9ICJN aXggJWMiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gNjUsCisJCQkuZHN0X2Rlc2NyID0gIk1peGVy IElucHV0ICUwMmQgQ2FwdHVyZSIKKwkJfSwKKwkJeworCQkJLmlkID0gMHg2MDAsCisJCQkubnVt ID0geyAyMCwgMTgsIDE4LCAxNCwgMTAgfSwKKwkJCS5zcmNfZGVzY3IgPSAiUENNICVkIiwKKwkJ CS5zcmNfbnVtX29mZnNldCA9IDEsCisJCQkuZHN0X2Rlc2NyID0gIlBDTSAlMDJkIENhcHR1cmUi CisJCX0sCisJfSwKK307CisKKy8qIGdldCB0aGUgc3RhcnRpbmcgcG9ydCBpbmRleCBudW1iZXIg Zm9yIGEgZ2l2ZW4gcG9ydCB0eXBlL2RpcmVjdGlvbiAqLworc3RhdGljIGludCBzY2FybGV0dDJf Z2V0X3BvcnRfc3RhcnRfbnVtKGNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzLAor CQkJCQlpbnQgZGlyZWN0aW9uLCBpbnQgcG9ydF90eXBlKQoreworCWludCBpLCBudW0gPSAwOwor CisJZm9yIChpID0gMDsgaSA8IHBvcnRfdHlwZTsgaSsrKQorCQludW0gKz0gcG9ydHNbaV0ubnVt W2RpcmVjdGlvbl07CisKKwlyZXR1cm4gbnVtOworfQorCisvKioqIFVTQiBJbnRlcmFjdGlvbnMg KioqLworCisvKiBWZW5kb3ItU3BlY2lmaWMgSW50ZXJmYWNlLCBFbmRwb2ludCwgTWF4UGFja2V0 U2l6ZSwgSW50ZXJ2YWwgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9WRU5ET1JfU1BFQ0lGSUNf SU5URVJGQUNFIDUKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9JTlRFUlJVUFRfRU5EUE9JTlQgNAor I2RlZmluZSBTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9NQVhfREFUQSA2NAorI2RlZmluZSBTQ0FS TEVUVDJfVVNCX0lOVEVSUlVQVF9JTlRFUlZBTCAzCisKKy8qIEludGVycnVwdCBmbGFncyBmb3Ig dm9sdW1lIGFuZCBtdXRlL2RpbSBidXR0b24gY2hhbmdlcyAqLworI2RlZmluZSBTQ0FSTEVUVDJf VVNCX0lOVEVSUlVQVF9WT0xfQ0hBTkdFIDB4NDAwMDAwCisjZGVmaW5lIFNDQVJMRVRUMl9VU0Jf SU5URVJSVVBUX0JVVFRPTl9DSEFOR0UgMHgyMDAwMDAKKworLyogQ29tbWFuZHMgZm9yIHNlbmRp bmcvcmVjZWl2aW5nIHJlcXVlc3RzL3Jlc3BvbnNlcyAqLworI2RlZmluZSBTQ0FSTEVUVDJfVVNC X1ZFTkRPUl9TUEVDSUZJQ19DTURfUkVRIDIKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9WRU5ET1Jf U1BFQ0lGSUNfQ01EX1JFU1AgMworCisjZGVmaW5lIFNDQVJMRVRUMl9VU0JfSU5JVF9TRVEgMHgw MDAwMDAwMAorI2RlZmluZSBTQ0FSTEVUVDJfVVNCX0dFVF9NRVRFUl9MRVZFTFMgMHgwMDAwMTAw MQorI2RlZmluZSBTQ0FSTEVUVDJfVVNCX1NFVF9NSVggMHgwMDAwMjAwMgorI2RlZmluZSBTQ0FS TEVUVDJfVVNCX1NFVF9NVVggMHgwMDAwMzAwMgorI2RlZmluZSBTQ0FSTEVUVDJfVVNCX0dFVF9E QVRBIDB4MDA4MDAwMDAKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9TRVRfREFUQSAweDAwODAwMDAx CisjZGVmaW5lIFNDQVJMRVRUMl9VU0JfREFUQV9DTUQgMHgwMDgwMDAwMgorI2RlZmluZSBTQ0FS TEVUVDJfVVNCX0NPTkZJR19TQVZFIDYKKworI2RlZmluZSBTQ0FSTEVUVDJfVVNCX1ZPTFVNRV9T VEFUVVNfT0ZGU0VUIDB4MzEKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9NRVRFUl9MRVZFTFNfR0VU X01BR0lDIDEKKworLyogdm9sdW1lIHN0YXR1cyBpcyByZWFkIHRvZ2V0aGVyIChtYXRjaGVzIHNj YXJsZXR0Ml9jb25maWdfaXRlbXNbXSkgKi8KK3N0cnVjdCBzY2FybGV0dDJfdXNiX3ZvbHVtZV9z dGF0dXMgeworCS8qIG11dGUgJiBkaW0gYnV0dG9ucyAqLworCXU4IGJ1dHRvbnNbU0NBUkxFVFQy X0JVVFRPTl9NQVhdOworCisJdTggcGFkMTsKKworCS8qIHNvZnR3YXJlIHZvbHVtZSBzZXR0aW5n ICovCisJczE2IHN3X3ZvbFtTQ0FSTEVUVDJfQU5BTE9HVUVfTUFYXTsKKworCS8qIGFjdHVhbCB2 b2x1bWUgb2Ygb3V0cHV0IGluYy4gZGltICgtMThkQikgKi8KKwlzMTYgaHdfdm9sW1NDQVJMRVRU Ml9BTkFMT0dVRV9NQVhdOworCisJdTggcGFkMltTQ0FSTEVUVDJfQU5BTE9HVUVfTUFYXTsKKwor CS8qIHN3ICgwKSBvciBodyAoMSkgY29udHJvbGxlZCAqLworCXU4IHN3X2h3X3N3aXRjaFtTQ0FS TEVUVDJfQU5BTE9HVUVfTUFYXTsKKworCXU4IHBhZDNbNl07CisKKwkvKiBmcm9udCBwYW5lbCB2 b2x1bWUga25vYiAqLworCXMxNiBtYXN0ZXJfdm9sOworfSBfX3BhY2tlZDsKKworLyogQ29uZmln dXJhdGlvbiBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4gKi8KK2VudW0g eworCVNDQVJMRVRUMl9DT05GSUdfQlVUVE9OUyA9IDAsCisJU0NBUkxFVFQyX0NPTkZJR19MSU5F X09VVF9WT0xVTUUgPSAxLAorCVNDQVJMRVRUMl9DT05GSUdfU1dfSFdfU1dJVENIID0gMiwKKwlT Q0FSTEVUVDJfQ09ORklHX0xFVkVMX1NXSVRDSCA9IDMsCisJU0NBUkxFVFQyX0NPTkZJR19QQURf U1dJVENIID0gNCwKKwlTQ0FSTEVUVDJfQ09ORklHX0NPVU5UID0gNQorfTsKKworLyogTG9jYXRp b24sIHNpemUsIGFuZCBhY3RpdmF0aW9uIGNvbW1hbmQgbnVtYmVyIGZvciB0aGUgY29uZmlndXJh dGlvbgorICogcGFyYW1ldGVycworICovCitzdHJ1Y3Qgc2NhcmxldHQyX2NvbmZpZyB7CisJdTgg b2Zmc2V0OworCXU4IHNpemU7CisJdTggYWN0aXZhdGU7Cit9OworCitzdGF0aWMgY29uc3Qgc3Ry dWN0IHNjYXJsZXR0Ml9jb25maWcKKwkJc2NhcmxldHQyX2NvbmZpZ19pdGVtc1tTQ0FSTEVUVDJf Q09ORklHX0NPVU5UXSA9IHsKKwkvKiBNdXRlL0RpbSBCdXR0b25zICovCisJeworCQkub2Zmc2V0 ID0gMHgzMSwKKwkJLnNpemUgPSAxLAorCQkuYWN0aXZhdGUgPSAyCisJfSwKKworCS8qIExpbmUg T3V0IFZvbHVtZSAqLworCXsKKwkJLm9mZnNldCA9IDB4MzQsCisJCS5zaXplID0gMiwKKwkJLmFj dGl2YXRlID0gMQorCX0sCisKKwkvKiBTVy9IVyBWb2x1bWUgU3dpdGNoICovCisJeworCQkub2Zm c2V0ID0gMHg2NiwKKwkJLnNpemUgPSAxLAorCQkuYWN0aXZhdGUgPSAzCisJfSwKKworCS8qIExl dmVsIFN3aXRjaCAqLworCXsKKwkJLm9mZnNldCA9IDB4N2MsCisJCS5zaXplID0gMSwKKwkJLmFj dGl2YXRlID0gNworCX0sCisKKwkvKiBQYWQgU3dpdGNoICovCisJeworCQkub2Zmc2V0ID0gMHg4 NCwKKwkJLnNpemUgPSAxLAorCQkuYWN0aXZhdGUgPSA4CisJfQorfTsKKworLyogcHJvcHJpZXRh cnkgcmVxdWVzdC9yZXNwb25zZSBmb3JtYXQgKi8KK3N0cnVjdCBzY2FybGV0dDJfdXNiX3BhY2tl dCB7CisJdTMyIGNtZDsKKwl1MTYgc2l6ZTsKKwl1MTYgc2VxOworCXUzMiBlcnJvcjsKKwl1MzIg cGFkOworCXU4IGRhdGFbXTsKK307CisKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9QQUNLRVRfTEVO IChzaXplb2Yoc3RydWN0IHNjYXJsZXR0Ml91c2JfcGFja2V0KSkKKworc3RhdGljIHZvaWQgc2Nh cmxldHQyX2ZpbGxfcmVxdWVzdF9oZWFkZXIoc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpw cml2YXRlLAorCQkJCQkgIHN0cnVjdCBzY2FybGV0dDJfdXNiX3BhY2tldCAqcmVxLAorCQkJCQkg IHUzMiBjbWQsIHUxNiByZXFfc2l6ZSkKK3sKKwkvKiBzZXF1ZW5jZSBtdXN0IGdvIHVwIGJ5IDEg Zm9yIGVhY2ggcmVxdWVzdCAqLworCXUxNiBzZXEgPSBwcml2YXRlLT5zY2FybGV0dDJfc2VxKys7 CisKKwlyZXEtPmNtZCA9IGNwdV90b19sZTMyKGNtZCk7CisJcmVxLT5zaXplID0gY3B1X3RvX2xl MTYocmVxX3NpemUpOworCXJlcS0+c2VxID0gY3B1X3RvX2xlMTYoc2VxKTsKKwlyZXEtPmVycm9y ID0gMDsKKwlyZXEtPnBhZCA9IDA7Cit9CisKKy8qIFNlbmQgYSBwcm9wcmlldGFyeSBmb3JtYXQg cmVxdWVzdCB0byB0aGUgU2NhcmxldHQgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IHNjYXJsZXR0 Ml91c2IoCisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLCB1MzIgY21kLAorCXZv aWQgKnJlcV9kYXRhLCB1MTYgcmVxX3NpemUsIHZvaWQgKnJlc3BfZGF0YSwgdTE2IHJlc3Bfc2l6 ZSkKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJp dmF0ZV9kYXRhOworCisJdTE2IHJlcV9idWZfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NhcmxldHQy X3VzYl9wYWNrZXQpICsgcmVxX3NpemU7CisJdTE2IHJlc3BfYnVmX3NpemUgPSBzaXplb2Yoc3Ry dWN0IHNjYXJsZXR0Ml91c2JfcGFja2V0KSArIHJlc3Bfc2l6ZTsKKworCXN0cnVjdCBzY2FybGV0 dDJfdXNiX3BhY2tldCAqcmVxID0gMCwgKnJlc3AgPSAwOworCisJaW50IGVyciA9IDA7CisKKwlt dXRleF9sb2NrKCZwcml2YXRlLT51c2JfbXV0ZXgpOworCisJLyogYnVpbGQgcmVxdWVzdCBtZXNz YWdlIGFuZCBzZW5kIGl0ICovCisKKwlyZXEgPSBrbWFsbG9jKHJlcV9idWZfc2l6ZSwgR0ZQX0tF Uk5FTCk7CisJaWYgKCFyZXEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byB1bmxvY2s7CisJ fQorCisJc2NhcmxldHQyX2ZpbGxfcmVxdWVzdF9oZWFkZXIocHJpdmF0ZSwgcmVxLCBjbWQsIHJl cV9zaXplKTsKKworCWlmIChyZXFfc2l6ZSkKKwkJbWVtY3B5KHJlcS0+ZGF0YSwgcmVxX2RhdGEs IHJlcV9zaXplKTsKKworCWVyciA9IHNuZF91c2JfY3RsX21zZyhtaXhlci0+Y2hpcC0+ZGV2LAor CQkJdXNiX3NuZGN0cmxwaXBlKG1peGVyLT5jaGlwLT5kZXYsIDApLAorCQkJU0NBUkxFVFQyX1VT Ql9WRU5ET1JfU1BFQ0lGSUNfQ01EX1JFUSwKKwkJCVVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0Jf VFlQRV9DTEFTUyB8IFVTQl9ESVJfT1VULAorCQkJMCwKKwkJCVNDQVJMRVRUMl9VU0JfVkVORE9S X1NQRUNJRklDX0lOVEVSRkFDRSwKKwkJCXJlcSwKKwkJCXJlcV9idWZfc2l6ZSk7CisKKwlpZiAo ZXJyICE9IHJlcV9idWZfc2l6ZSkgeworCQl1c2JfYXVkaW9fZXJyKAorCQkJbWl4ZXItPmNoaXAs CisJCQkiU2NhcmxldHQgR2VuIDIgVVNCIHJlcXVlc3QgcmVzdWx0IGNtZCAleCB3YXMgJWRcbiIs CisJCQljbWQsIGVycik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKwor CS8qIHNlbmQgYSBzZWNvbmQgbWVzc2FnZSB0byBnZXQgdGhlIHJlc3BvbnNlICovCisKKwlyZXNw ID0ga21hbGxvYyhyZXNwX2J1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc3ApIHsKKwkJ ZXJyID0gLUVOT01FTTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJZXJyID0gc25kX3VzYl9jdGxf bXNnKG1peGVyLT5jaGlwLT5kZXYsCisJCQl1c2Jfc25kY3RybHBpcGUobWl4ZXItPmNoaXAtPmRl diwgMCksCisJCQlTQ0FSTEVUVDJfVVNCX1ZFTkRPUl9TUEVDSUZJQ19DTURfUkVTUCwKKwkJCVVT Ql9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9ESVJfSU4sCisJCQkwLAor CQkJU0NBUkxFVFQyX1VTQl9WRU5ET1JfU1BFQ0lGSUNfSU5URVJGQUNFLAorCQkJcmVzcCwKKwkJ CXJlc3BfYnVmX3NpemUpOworCisJLyogdmFsaWRhdGUgdGhlIHJlc3BvbnNlICovCisKKwlpZiAo ZXJyICE9IHJlc3BfYnVmX3NpemUpIHsKKwkJdXNiX2F1ZGlvX2VycigKKwkJCW1peGVyLT5jaGlw LAorCQkJIlNjYXJsZXR0IEdlbiAyIFVTQiByZXNwb25zZSByZXN1bHQgY21kICV4IHdhcyAlZFxu IiwKKwkJCWNtZCwgZXJyKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQor CisJaWYgKHJlc3AtPmNtZCAhPSByZXEtPmNtZCB8fAorCSAgICByZXNwLT5zZXEgIT0gcmVxLT5z ZXEgfHwKKwkgICAgcmVzcF9zaXplICE9IGxlMTZfdG9fY3B1KHJlc3AtPnNpemUpIHx8CisJICAg IHJlc3AtPmVycm9yIHx8CisJICAgIHJlc3AtPnBhZCkgeworCQl1c2JfYXVkaW9fZXJyKAorCQkJ bWl4ZXItPmNoaXAsCisJCQkiU2NhcmxldHQgR2VuIDIgVVNCIGludmFsaWQgcmVzcG9uc2U7ICIK KwkJCSAgICJjbWQgdHgvcnggJWQvJWQgc2VxICVkLyVkIHNpemUgJWQvJWQgIgorCQkJICAgImVy cm9yICVkIHBhZCAlZFxuIiwKKwkJCWxlMTZfdG9fY3B1KHJlcS0+Y21kKSwgbGUxNl90b19jcHUo cmVzcC0+Y21kKSwKKwkJCWxlMTZfdG9fY3B1KHJlcS0+c2VxKSwgbGUxNl90b19jcHUocmVzcC0+ c2VxKSwKKwkJCXJlc3Bfc2l6ZSwgbGUxNl90b19jcHUocmVzcC0+c2l6ZSksCisJCQlsZTE2X3Rv X2NwdShyZXNwLT5lcnJvciksCisJCQlsZTE2X3RvX2NwdShyZXNwLT5wYWQpKTsKKwkJZXJyID0g LUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKHJlc3Bfc2l6ZSA+IDApCisJCW1l bWNweShyZXNwX2RhdGEsIHJlc3AtPmRhdGEsIHJlc3Bfc2l6ZSk7CisKK3VubG9jazoKKwlrZnJl ZShyZXEpOworCWtmcmVlKHJlc3ApOworCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+dXNiX211dGV4 KTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBTZW5kIFNDQVJMRVRUMl9VU0JfREFUQV9DTUQgU0NB UkxFVFQyX1VTQl9DT05GSUdfU0FWRSAqLworc3RhdGljIHZvaWQgc2NhcmxldHQyX2NvbmZpZ19z YXZlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVy X2RhdGEgKnByaXZhdGUgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNjYXJsZXR0Ml9t aXhlcl9kYXRhLCB3b3JrLndvcmspOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhl ciA9IHByaXZhdGUtPm1peGVyOworCXUzMiByZXEgPSBjcHVfdG9fbGUzMihTQ0FSTEVUVDJfVVNC X0NPTkZJR19TQVZFKTsKKworCXNjYXJsZXR0Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9VU0JfREFU QV9DTUQsCisJCSAgICAgICZyZXEsIHNpemVvZih1MzIpLAorCQkgICAgICBOVUxMLCAwKTsKK30K KworLyogU2VuZCBhIFVTQiBtZXNzYWdlIHRvIHNldCBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVy ICh2b2x1bWUgbGV2ZWwsCisgKiBzdy9odyB2b2x1bWUgc3dpdGNoLCBsaW5lL2luc3QgbGV2ZWwg c3dpdGNoLCBvciBwYWQgc3dpdGNoKQorICovCitzdGF0aWMgaW50IHNjYXJsZXR0Ml91c2Jfc2V0 X2NvbmZpZygKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJaW50IGNvbmZp Z19pdGVtX251bSwgaW50IGluZGV4LCBpbnQgdmFsdWUpCit7CisJY29uc3Qgc3RydWN0IHNjYXJs ZXR0Ml9jb25maWcgY29uZmlnX2l0ZW0gPQorCSAgICAgICBzY2FybGV0dDJfY29uZmlnX2l0ZW1z W2NvbmZpZ19pdGVtX251bV07CisJc3RydWN0IHsKKwkJdTMyIG9mZnNldDsKKwkJdTMyIGJ5dGVz OworCQlzMzIgdmFsdWU7CisJfSBfX3BhY2tlZCByZXE7CisJdTMyIHJlcTI7CisJaW50IGVycjsK KwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9k YXRhOworCisJLyogU2VuZCB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZGF0YSAqLworCXJl cS5vZmZzZXQgPSBjcHVfdG9fbGUzMihjb25maWdfaXRlbS5vZmZzZXQgKyBpbmRleCAqIGNvbmZp Z19pdGVtLnNpemUpOworCXJlcS5ieXRlcyA9IGNwdV90b19sZTMyKGNvbmZpZ19pdGVtLnNpemUp OworCXJlcS52YWx1ZSA9IGNwdV90b19sZTMyKHZhbHVlKTsKKwllcnIgPSBzY2FybGV0dDJfdXNi KG1peGVyLCBTQ0FSTEVUVDJfVVNCX1NFVF9EQVRBLAorCQkJICAgICZyZXEsIHNpemVvZih1MzIp ICogMiArIGNvbmZpZ19pdGVtLnNpemUsCisJCQkgICAgTlVMTCwgMCk7CisJaWYgKGVyciA8IDAp CisJCXJldHVybiBlcnI7CisKKwkvKiBBY3RpdmF0ZSB0aGUgY2hhbmdlICovCisJcmVxMiA9IGNw dV90b19sZTMyKGNvbmZpZ19pdGVtLmFjdGl2YXRlKTsKKwllcnIgPSBzY2FybGV0dDJfdXNiKG1p eGVyLCBTQ0FSTEVUVDJfVVNCX0RBVEFfQ01ELAorCQkJICAgICZyZXEyLCBzaXplb2YocmVxMiks IE5VTEwsIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogU2NoZWR1bGUg dGhlIGNoYW5nZSB0byBiZSB3cml0dGVuIHRvIE5WUkFNICovCisJc2NoZWR1bGVfZGVsYXllZF93 b3JrKCZwcml2YXRlLT53b3JrLCBtc2Vjc190b19qaWZmaWVzKDIwMDApKTsKKworCXJldHVybiAw OworfQorCisvKiBTZW5kIGEgVVNCIG1lc3NhZ2UgdG8gZ2V0IGRhdGE7IHJlc3VsdCBwbGFjZWQg aW4gKmJ1ZiAqLworc3RhdGljIGludCBzY2FybGV0dDJfdXNiX2dldCgKKwlzdHJ1Y3QgdXNiX21p eGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJaW50IG9mZnNldCwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkK K3sKKwlzdHJ1Y3QgeworCQl1MzIgb2Zmc2V0OworCQl1MzIgc2l6ZTsKKwl9IF9fcGFja2VkIHJl cTsKKworCXJlcS5vZmZzZXQgPSBjcHVfdG9fbGUzMihvZmZzZXQpOworCXJlcS5zaXplID0gY3B1 X3RvX2xlMzIoc2l6ZSk7CisJcmV0dXJuIHNjYXJsZXR0Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9V U0JfR0VUX0RBVEEsCisJCQkgICAgICZyZXEsIHNpemVvZihyZXEpLCBidWYsIHNpemUpOworfQor CisvKiBTZW5kIGEgVVNCIG1lc3NhZ2UgdG8gZ2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczsg cmVzdWx0IHBsYWNlZCBpbiAqYnVmICovCitzdGF0aWMgaW50IHNjYXJsZXR0Ml91c2JfZ2V0X2Nv bmZpZygKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJaW50IGNvbmZpZ19p dGVtX251bSwgaW50IGNvdW50LCB2b2lkICpidWYpCit7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0 Ml9jb25maWcgY29uZmlnX2l0ZW0gPQorCSAgICAgICBzY2FybGV0dDJfY29uZmlnX2l0ZW1zW2Nv bmZpZ19pdGVtX251bV07CisJaW50IHNpemUgPSBjb25maWdfaXRlbS5zaXplICogY291bnQ7CisK KwlyZXR1cm4gc2NhcmxldHQyX3VzYl9nZXQobWl4ZXIsIGNvbmZpZ19pdGVtLm9mZnNldCwgYnVm LCBzaXplKTsKK30KKworLyogU2VuZCBhIFVTQiBtZXNzYWdlIHRvIGdldCB2b2x1bWUgc3RhdHVz OyByZXN1bHQgcGxhY2VkIGluICpidWYgKi8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX3VzYl9nZXRf dm9sdW1lX3N0YXR1cygKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJc3Ry dWN0IHNjYXJsZXR0Ml91c2Jfdm9sdW1lX3N0YXR1cyAqYnVmKQoreworCXJldHVybiBzY2FybGV0 dDJfdXNiX2dldChtaXhlciwgU0NBUkxFVFQyX1VTQl9WT0xVTUVfU1RBVFVTX09GRlNFVCwKKwkJ CQkgYnVmLCBzaXplb2YoKmJ1ZikpOworfQorCisvKiBTZW5kIGEgVVNCIG1lc3NhZ2UgdG8gc2V0 IHRoZSB2b2x1bWVzIGZvciBhbGwgaW5wdXRzIG9mIG9uZSBtaXgKKyAqICh2YWx1ZXMgb2J0YWlu ZWQgZnJvbSBwcml2YXRlLT5taXhbXSkKKyAqLworc3RhdGljIGludCBzY2FybGV0dDJfdXNiX3Nl dF9taXgoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAorCQkJCSAgICAgaW50IG1p eF9udW0pCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXIt PnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvICppbmZv ID0gcHJpdmF0ZS0+aW5mbzsKKworCXN0cnVjdCB7CisJCXUxNiBtaXhfbnVtOworCQl1MTYgZGF0 YVtTQ0FSTEVUVDJfSU5QVVRfTUlYX01BWF07CisJfSBfX3BhY2tlZCByZXE7CisKKwlpbnQgaSwg ajsKKwlpbnQgbnVtX21peGVyX2luID0KKwkJaW5mby0+cG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQ RV9NSVhdLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOworCisJcmVxLm1peF9udW0gPSBjcHVfdG9f bGUxNihtaXhfbnVtKTsKKworCWZvciAoaSA9IDAsIGogPSBtaXhfbnVtICogbnVtX21peGVyX2lu OyBpIDwgbnVtX21peGVyX2luOyBpKyssIGorKykKKwkJcmVxLmRhdGFbaV0gPSBjcHVfdG9fbGUx NigKKwkJCXNjYXJsZXR0Ml9taXhlcl92YWx1ZXNbcHJpdmF0ZS0+bWl4W2pdXQorCQkpOworCisJ cmV0dXJuIHNjYXJsZXR0Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9VU0JfU0VUX01JWCwKKwkJCSAg ICAgJnJlcSwgKG51bV9taXhlcl9pbiArIDEpICogc2l6ZW9mKHUxNiksCisJCQkgICAgIE5VTEws IDApOworfQorCisvKiBDb252ZXJ0IGEgcG9ydCBudW1iZXIgaW5kZXggKHBlciBpbmZvLT5wb3J0 cykgdG8gYSBoYXJkd2FyZSBJRCAqLworc3RhdGljIHUzMiBzY2FybGV0dDJfbXV4X3NyY19udW1f dG9faWQoY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMsCisJCQkJICAgICAgIGlu dCBudW0pCit7CisJaW50IHBvcnRfdHlwZTsKKworCWZvciAocG9ydF90eXBlID0gMDsKKwkgICAg IHBvcnRfdHlwZSA8IFNDQVJMRVRUMl9QT1JUX1RZUEVfQ09VTlQ7CisJICAgICBwb3J0X3R5cGUr KykgeworCQlpZiAobnVtIDwgcG9ydHNbcG9ydF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5d KQorCQkJcmV0dXJuIHBvcnRzW3BvcnRfdHlwZV0uaWQgfCBudW07CisJCW51bSAtPSBwb3J0c1tw b3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9JTl07CisJfQorCisJLyogT29wcyAqLworCXJl dHVybiAwOworfQorCisvKiBTZW5kIFVTQiBtZXNzYWdlcyB0byBzZXQgbXV4IGlucHV0cyAqLwor c3RhdGljIGludCBzY2FybGV0dDJfdXNiX3NldF9tdXgoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZh Y2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1p eGVyLT5wcml2YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyAq aW5mbyA9IHByaXZhdGUtPmluZm87CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9y dHMgPSBpbmZvLT5wb3J0czsKKwlpbnQgcmF0ZSwgcG9ydF9kaXJfcmF0ZTsKKworCXN0YXRpYyBj b25zdCBpbnQgYXNzaWdubWVudF9vcmRlcltTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UXSA9IHsK KwkJU0NBUkxFVFQyX1BPUlRfVFlQRV9QQ00sCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9H VUUsCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfU1BESUYsCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVf QURBVCwKKwkJU0NBUkxFVFQyX1BPUlRfVFlQRV9NSVgsCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVf Tk9ORSwKKwl9OworCisJc3RydWN0IHsKKwkJdTE2IHBhZDsKKwkJdTE2IG51bTsKKwkJdTMyIGRh dGFbU0NBUkxFVFQyX01VWF9NQVhdOworCX0gX19wYWNrZWQgcmVxOworCisJcmVxLnBhZCA9IDA7 CisKKwkvKiBtdXggc2V0dGluZ3MgZm9yIGVhY2ggcmF0ZSAqLworCWZvciAocmF0ZSA9IDAsIHBv cnRfZGlyX3JhdGUgPSBTQ0FSTEVUVDJfUE9SVF9PVVRfNDQ7CisJICAgICBwb3J0X2Rpcl9yYXRl IDw9IFNDQVJMRVRUMl9QT1JUX09VVF8xNzY7CisJICAgICByYXRlKyssIHBvcnRfZGlyX3JhdGUr KykgeworCQlpbnQgb3JkZXJfbnVtLCBpLCBlcnI7CisKKwkJcmVxLm51bSA9IGNwdV90b19sZTE2 KHJhdGUpOworCisJCWZvciAob3JkZXJfbnVtID0gMCwgaSA9IDA7CisJCSAgICAgb3JkZXJfbnVt IDwgU0NBUkxFVFQyX1BPUlRfVFlQRV9DT1VOVDsKKwkJICAgICBvcmRlcl9udW0rKykgeworCQkJ aW50IHBvcnRfdHlwZSA9IGFzc2lnbm1lbnRfb3JkZXJbb3JkZXJfbnVtXTsKKwkJCWludCBqID0g c2NhcmxldHQyX2dldF9wb3J0X3N0YXJ0X251bShwb3J0cywKKwkJCQkJCQkgICAgIFNDQVJMRVRU Ml9QT1JUX09VVCwKKwkJCQkJCQkgICAgIHBvcnRfdHlwZSk7CisJCQlpbnQgcG9ydF9pZCA9IHBv cnRzW3BvcnRfdHlwZV0uaWQ7CisJCQlpbnQgY2hhbm5lbDsKKworCQkJZm9yIChjaGFubmVsID0g MDsKKwkJCSAgICAgY2hhbm5lbCA8IHBvcnRzW3BvcnRfdHlwZV0ubnVtW3BvcnRfZGlyX3JhdGVd OworCQkJICAgICBjaGFubmVsKyssIGkrKywgaisrKQorCQkJCS8qIGxvd2VyIDEyIGJpdHMgZm9y IHRoZSBkZXN0aW5hdGlvbiBhbmQKKwkJCQkgKiBuZXh0IDEyIGJpdHMgZm9yIHRoZSBzb3VyY2UK KwkJCQkgKi8KKwkJCQlyZXEuZGF0YVtpXSA9ICFwb3J0X2lkCisJCQkJCT8gMAorCQkJCQk6IGNw dV90b19sZTMyKAorCQkJCQkJcG9ydF9pZCB8CisJCQkJCQljaGFubmVsIHwKKwkJCQkJCXNjYXJs ZXR0Ml9tdXhfc3JjX251bV90b19pZCgKKwkJCQkJCQlwb3J0cywgcHJpdmF0ZS0+bXV4W2pdCisJ CQkJCQkpIDw8IDEyCisJCQkJCSAgKTsKKworCQkJLyogc2tpcCBwcml2YXRlLT5tdXhbal0gZW50 cmllcyBub3Qgb3V0cHV0ICovCisJCQlqICs9IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJMRVRU Ml9QT1JUX09VVF0gLQorCQkJICAgICBwb3J0c1twb3J0X3R5cGVdLm51bVtwb3J0X2Rpcl9yYXRl XTsKKwkJfQorCisJCWVyciA9IHNjYXJsZXR0Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9VU0JfU0VU X01VWCwKKwkJCQkgICAgJnJlcSwgKGkgKyAxKSAqIHNpemVvZih1MzIpLAorCQkJCSAgICBOVUxM LCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOwor fQorCisvKiBTZW5kIFVTQiBtZXNzYWdlIHRvIGdldCBtZXRlciBsZXZlbHMgKi8KK3N0YXRpYyBp bnQgc2NhcmxldHQyX3VzYl9nZXRfbWV0ZXJfbGV2ZWxzKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJm YWNlICptaXhlciwKKwkJCQkJICB1MTYgKmxldmVscykKK3sKKwlzdHJ1Y3QgeworCQl1MTYgcGFk OworCQl1MTYgbnVtX21ldGVyczsKKwkJdTMyIG1hZ2ljOworCX0gX19wYWNrZWQgcmVxOworCXUz MiByZXNwW1NDQVJMRVRUMl9OVU1fTUVURVJTXTsKKwlpbnQgaSwgZXJyOworCisJcmVxLnBhZCA9 IDA7CisJcmVxLm51bV9tZXRlcnMgPSBjcHVfdG9fbGUxNihTQ0FSTEVUVDJfTlVNX01FVEVSUyk7 CisJcmVxLm1hZ2ljID0gY3B1X3RvX2xlMzIoU0NBUkxFVFQyX1VTQl9NRVRFUl9MRVZFTFNfR0VU X01BR0lDKTsKKwllcnIgPSBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX0dFVF9N RVRFUl9MRVZFTFMsCisJCQkgICAgJnJlcSwgc2l6ZW9mKHJlcSksIHJlc3AsIHNpemVvZihyZXNw KSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBjb3B5LCBjb252ZXJ0IHRv IHUxNiAqLworCWZvciAoaSA9IDA7IGkgPCBTQ0FSTEVUVDJfTlVNX01FVEVSUzsgaSsrKQorCQls ZXZlbHNbaV0gPSByZXNwW2ldOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiogQ29udHJvbCBGdW5j dGlvbnMgKioqLworCisvKiBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGNvbnRyb2wg Ki8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX2FkZF9uZXdfY3RsKHN0cnVjdCB1c2JfbWl4ZXJfaW50 ZXJmYWNlICptaXhlciwKKwkJCQkgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKm5jb250 cm9sLAorCQkJCSBpbnQgaW5kZXgsIGludCBjaGFubmVscywgY29uc3QgY2hhciAqbmFtZSwKKwkJ CQkgc3RydWN0IHNuZF9rY29udHJvbCAqKmtjdGxfcmV0dXJuKQoreworCXN0cnVjdCBzbmRfa2Nv bnRyb2wgKmtjdGw7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW07CisJaW50IGVy cjsKKworCWVsZW0gPSBremFsbG9jKHNpemVvZigqZWxlbSksIEdGUF9LRVJORUwpOworCWlmICgh ZWxlbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbGVtLT5oZWFkLm1peGVyID0gbWl4ZXI7CisJ ZWxlbS0+Y29udHJvbCA9IGluZGV4OworCWVsZW0tPmhlYWQuaWQgPSBpbmRleDsKKwllbGVtLT5j aGFubmVscyA9IGNoYW5uZWxzOworCisJa2N0bCA9IHNuZF9jdGxfbmV3MShuY29udHJvbCwgZWxl bSk7CisJaWYgKCFrY3RsKSB7CisJCWtmcmVlKGVsZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9 CisJa2N0bC0+cHJpdmF0ZV9mcmVlID0gc25kX3VzYl9taXhlcl9lbGVtX2ZyZWU7CisKKwlzdHJs Y3B5KGtjdGwtPmlkLm5hbWUsIG5hbWUsIHNpemVvZihrY3RsLT5pZC5uYW1lKSk7CisKKwllcnIg PSBzbmRfdXNiX21peGVyX2FkZF9jb250cm9sKCZlbGVtLT5oZWFkLCBrY3RsKTsKKwlpZiAoZXJy IDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChrY3RsX3JldHVybikKKwkJKmtjdGxfcmV0dXJu ID0ga2N0bDsKKworCXJldHVybiAwOworfQorCisvKioqIEFuYWxvZ3VlIExpbmUgT3V0IFZvbHVt ZSBDb250cm9scyAqKiovCisKKy8qIFVwZGF0ZSBoYXJkd2FyZSB2b2x1bWUgY29udHJvbHMgYWZ0 ZXIgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbiB0aGF0CisgKiB0aGV5IGhhdmUgY2hhbmdlZAorICov CitzdGF0aWMgaW50IHNjYXJsZXR0Ml91cGRhdGVfdm9sdW1lcyhzdHJ1Y3QgdXNiX21peGVyX2lu dGVyZmFjZSAqbWl4ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRl ID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpw b3J0cyA9IHByaXZhdGUtPmluZm8tPnBvcnRzOworCXN0cnVjdCBzY2FybGV0dDJfdXNiX3ZvbHVt ZV9zdGF0dXMgdm9sdW1lX3N0YXR1czsKKwlpbnQgbnVtX2xpbmVfb3V0ID0KKwkJcG9ydHNbU0NB UkxFVFQyX1BPUlRfVFlQRV9BTkFMT0dVRV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50 IGVyciwgaTsKKworCXByaXZhdGUtPnZvbF91cGRhdGVkID0gMDsKKworCWVyciA9IHNjYXJsZXR0 Ml91c2JfZ2V0X3ZvbHVtZV9zdGF0dXMobWl4ZXIsICZ2b2x1bWVfc3RhdHVzKTsKKwlpZiAoZXJy IDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXByaXZhdGUtPm1hc3Rlcl92b2wgPSBjbGFtcCgKKwkJ dm9sdW1lX3N0YXR1cy5tYXN0ZXJfdm9sICsgU0NBUkxFVFRfVk9MVU1FX0JJQVMsCisJCTAsIFND QVJMRVRUX1ZPTFVNRV9CSUFTKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbGluZV9vdXQ7IGkr KykgeworCQlpZiAocHJpdmF0ZS0+dm9sX3N3X2h3X3N3aXRjaFtpXSkKKwkJCXByaXZhdGUtPnZv bFtpXSA9IHByaXZhdGUtPm1hc3Rlcl92b2w7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHByaXZh dGUtPmluZm8tPmJ1dHRvbl9jb3VudDsgaSsrKQorCQlwcml2YXRlLT5idXR0b25zW2ldID0gISF2 b2x1bWVfc3RhdHVzLmJ1dHRvbnNbaV07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBz Y2FybGV0dDJfdm9sdW1lX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJ ICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCB1c2JfbWl4 ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCisJdWluZm8tPnR5cGUg PSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gZWxlbS0+Y2hh bm5lbHM7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50 ZWdlci5tYXggPSBTQ0FSTEVUVF9WT0xVTUVfQklBUzsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5z dGVwID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbWFzdGVyX3Zv bHVtZV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCSAgIHN0cnVjdCBz bmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9p bmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJm YWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9k YXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWlmIChwcml2YXRlLT52b2xf dXBkYXRlZCkgeworCQltdXRleF9sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwkJc2Nhcmxl dHQyX3VwZGF0ZV92b2x1bWVzKG1peGVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRh X211dGV4KTsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHByaXZh dGUtPm1hc3Rlcl92b2w7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3Zv bHVtZV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJICAgIHN0cnVjdCBz bmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9p bmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJm YWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9k YXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwlpbnQgaW5kZXggPSBlbGVtLT5j b250cm9sOworCisJaWYgKHByaXZhdGUtPnZvbF91cGRhdGVkKSB7CisJCW11dGV4X2xvY2soJnBy aXZhdGUtPmRhdGFfbXV0ZXgpOworCQlzY2FybGV0dDJfdXBkYXRlX3ZvbHVtZXMobWl4ZXIpOwor CQltdXRleF91bmxvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCX0KKworCXVjb250cm9sLT52 YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcHJpdmF0ZS0+dm9sW2luZGV4XTsKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBzY2FybGV0dDJfdm9sdW1lX2N0bF9wdXQoc3RydWN0IHNuZF9rY29u dHJvbCAqa2N0bCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wp Cit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2Rh dGE7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhl cjsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0 ZV9kYXRhOworCWludCBpbmRleCA9IGVsZW0tPmNvbnRyb2w7CisJaW50IG92YWwsIHZhbCwgZXJy ID0gMDsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdmF0ZS0+d29yayk7CisJbXV0 ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisKKwlvdmFsID0gcHJpdmF0ZS0+dm9sW2lu ZGV4XTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWlmIChv dmFsID09IHZhbCkKKwkJZ290byB1bmxvY2s7CisKKwlwcml2YXRlLT52b2xbaW5kZXhdID0gdmFs OworCWVyciA9IHNjYXJsZXR0Ml91c2Jfc2V0X2NvbmZpZyhtaXhlciwgU0NBUkxFVFQyX0NPTkZJ R19MSU5FX09VVF9WT0xVTUUsCisJCQkJICAgICAgIGluZGV4LCB2YWwgLSBTQ0FSTEVUVF9WT0xV TUVfQklBUyk7CisJaWYgKGVyciA9PSAwKQorCQllcnIgPSAxOworCit1bmxvY2s6CisJbXV0ZXhf dW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMg Y29uc3QgREVDTEFSRV9UTFZfREJfTUlOTUFYKAorCWRiX3NjYWxlX3NjYXJsZXR0X2dhaW4sIC1T Q0FSTEVUVF9WT0xVTUVfQklBUyAqIDEwMCwgMAorKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBz bmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9tYXN0ZXJfdm9sdW1lX2N0bCA9IHsKKwkuaWZhY2Ug PSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1f QUNDRVNTX1JFQUQgfAorCQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCwKKwkubmFt ZSA9ICIiLAorCS5pbmZvID0gc2NhcmxldHQyX3ZvbHVtZV9jdGxfaW5mbywKKwkuZ2V0ICA9IHNj YXJsZXR0Ml9tYXN0ZXJfdm9sdW1lX2N0bF9nZXQsCisJLnByaXZhdGVfdmFsdWUgPSAwLCAvKiBt YXggdmFsdWUgKi8KKwkudGx2ID0geyAucCA9IGRiX3NjYWxlX3NjYXJsZXR0X2dhaW4gfQorfTsK Kworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9saW5lX291 dF92b2x1bWVfY3RsID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAor CS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKKwkJICBTTkRSVl9D VExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCisJLm5hbWUgPSAiIiwKKwkuaW5mbyA9IHNjYXJsZXR0 Ml92b2x1bWVfY3RsX2luZm8sCisJLmdldCAgPSBzY2FybGV0dDJfdm9sdW1lX2N0bF9nZXQsCisJ LnB1dCAgPSBzY2FybGV0dDJfdm9sdW1lX2N0bF9wdXQsCisJLnByaXZhdGVfdmFsdWUgPSAwLCAv KiBtYXggdmFsdWUgKi8KKwkudGx2ID0geyAucCA9IGRiX3NjYWxlX3NjYXJsZXR0X2dhaW4gfQor fTsKKworLyoqKiBIVy9TVyBWb2x1bWUgU3dpdGNoIENvbnRyb2xzICoqKi8KKworc3RhdGljIGlu dCBzY2FybGV0dDJfc3dfaHdfZW51bV9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY3Rs LAorCQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY29u c3QgY2hhciAqY29uc3QgdmFsdWVzWzJdID0geworCQkiU1ciLCAiSFciCisJfTsKKworCXJldHVy biBzbmRfY3RsX2VudW1faW5mbyh1aW5mbywgMSwgMiwgdmFsdWVzKTsKK30KKworc3RhdGljIGlu dCBzY2FybGV0dDJfc3dfaHdfZW51bV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGws CisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1 c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBz Y2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhlYWQubWl4ZXItPnByaXZhdGVf ZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQlwcml2YXRl LT52b2xfc3dfaHdfc3dpdGNoW2VsZW0tPmNvbnRyb2xdOworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IHNjYXJsZXR0Ml9zd19od19lbnVtX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAq a2N0bCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3Ry dWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3Ry dWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsKKwlzdHJ1 Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOwor CisJaW50IGluZGV4ID0gZWxlbS0+Y29udHJvbDsKKwlpbnQgb3ZhbCwgdmFsLCBlcnIgPSAwOwor CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2YXRlLT53b3JrKTsKKwltdXRleF9sb2Nr KCZwcml2YXRlLT5kYXRhX211dGV4KTsKKworCW92YWwgPSBwcml2YXRlLT52b2xfc3dfaHdfc3dp dGNoW2luZGV4XTsKKwl2YWwgPSAhIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwor CisJaWYgKG92YWwgPT0gdmFsKQorCQlnb3RvIHVubG9jazsKKworCXByaXZhdGUtPnZvbF9zd19o d19zd2l0Y2hbaW5kZXhdID0gdmFsOworCisJLyogQ2hhbmdlIGFjY2VzcyBtb2RlIHRvIFJPICho YXJkd2FyZSBjb250cm9sbGVkIHZvbHVtZSkKKwkgKiBvciBSVyAoc29mdHdhcmUgY29udHJvbGxl ZCB2b2x1bWUpCisJICovCisJaWYgKHZhbCkKKwkJcHJpdmF0ZS0+dm9sX2N0bHNbaW5kZXhdLT52 ZFswXS5hY2Nlc3MgJj0KKwkJCX5TTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEU7CisJZWxzZQor CQlwcml2YXRlLT52b2xfY3Rsc1tpbmRleF0tPnZkWzBdLmFjY2VzcyB8PQorCQkJU05EUlZfQ1RM X0VMRU1fQUNDRVNTX1dSSVRFOworCisJLyogUmVzZXQgdm9sdW1lIHRvIG1hc3RlciB2b2x1bWUg Ki8KKwlwcml2YXRlLT52b2xbaW5kZXhdID0gcHJpdmF0ZS0+bWFzdGVyX3ZvbDsKKworCS8qIFNl dCBTVyB2b2x1bWUgdG8gY3VycmVudCBIVyB2b2x1bWUgKi8KKwllcnIgPSBzY2FybGV0dDJfdXNi X3NldF9jb25maWcoCisJCW1peGVyLCBTQ0FSTEVUVDJfQ09ORklHX0xJTkVfT1VUX1ZPTFVNRSwK KwkJaW5kZXgsIHByaXZhdGUtPm1hc3Rlcl92b2wgLSBTQ0FSTEVUVF9WT0xVTUVfQklBUyk7CisJ aWYgKGVyciA8IDApCisJCWdvdG8gdW5sb2NrOworCisJLyogTm90aWZ5IG9mIFJPL1JXIGNoYW5n ZSAqLworCXNuZF9jdGxfbm90aWZ5KG1peGVyLT5jaGlwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRf TUFTS19JTkZPLAorCQkgICAgICAgJnByaXZhdGUtPnZvbF9jdGxzW2luZGV4XS0+aWQpOworCisJ LyogU2VuZCBTVy9IVyBzd2l0Y2ggY2hhbmdlIHRvIHRoZSBkZXZpY2UgKi8KKwllcnIgPSBzY2Fy bGV0dDJfdXNiX3NldF9jb25maWcobWl4ZXIsIFNDQVJMRVRUMl9DT05GSUdfU1dfSFdfU1dJVENI LAorCQkJCSAgICAgICBpbmRleCwgdmFsKTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJp dmF0ZS0+ZGF0YV9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVj dCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9zd19od19lbnVtX2N0bCA9IHsKKwkuaWZhY2Ug PSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICIiLAorCS5pbmZvID0gc2Nh cmxldHQyX3N3X2h3X2VudW1fY3RsX2luZm8sCisJLmdldCAgPSBzY2FybGV0dDJfc3dfaHdfZW51 bV9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX3N3X2h3X2VudW1fY3RsX3B1dCwKK307CisK Ky8qKiogTGluZSBMZXZlbC9JbnN0cnVtZW50IExldmVsIFN3aXRjaCBDb250cm9scyAqKiovCisK K3N0YXRpYyBpbnQgc2NhcmxldHQyX2xldmVsX2VudW1fY3RsX2luZm8oc3RydWN0IHNuZF9rY29u dHJvbCAqa2N0bCwKKwkJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJ c3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhbHVlc1syXSA9IHsKKwkJIkxpbmUiLCAiSW5zdCIK Kwl9OworCisJcmV0dXJuIHNuZF9jdGxfZW51bV9pbmZvKHVpbmZvLCAxLCAyLCB2YWx1ZXMpOwor fQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9sZXZlbF9lbnVtX2N0bF9nZXQoc3RydWN0IHNuZF9r Y29udHJvbCAqa2N0bCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wp Cit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2Rh dGE7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gZWxlbS0+aGVhZC5t aXhlci0+cHJpdmF0ZV9kYXRhOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsw XSA9CisJCXByaXZhdGUtPmxldmVsX3N3aXRjaFtlbGVtLT5jb250cm9sXTsKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBzY2FybGV0dDJfbGV2ZWxfZW51bV9jdGxfcHV0KHN0cnVjdCBzbmRf a2NvbnRyb2wgKmtjdGwsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9s KQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9k YXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4 ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZh dGVfZGF0YTsKKworCWludCBpbmRleCA9IGVsZW0tPmNvbnRyb2w7CisJaW50IG92YWwsIHZhbCwg ZXJyID0gMDsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdmF0ZS0+d29yayk7CisJ bXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisKKwlvdmFsID0gcHJpdmF0ZS0+bGV2 ZWxfc3dpdGNoW2luZGV4XTsKKwl2YWwgPSAhIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVl WzBdOworCisJaWYgKG92YWwgPT0gdmFsKQorCQlnb3RvIHVubG9jazsKKworCXByaXZhdGUtPmxl dmVsX3N3aXRjaFtpbmRleF0gPSB2YWw7CisKKwkvKiBTZW5kIHN3aXRjaCBjaGFuZ2UgdG8gdGhl IGRldmljZSAqLworCWVyciA9IHNjYXJsZXR0Ml91c2Jfc2V0X2NvbmZpZyhtaXhlciwgU0NBUkxF VFQyX0NPTkZJR19MRVZFTF9TV0lUQ0gsCisJCQkJICAgICAgIGluZGV4LCB2YWwpOworCit1bmxv Y2s6CisJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJyOwor fQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX2xldmVs X2VudW1fY3RsID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5u YW1lID0gIiIsCisJLmluZm8gPSBzY2FybGV0dDJfbGV2ZWxfZW51bV9jdGxfaW5mbywKKwkuZ2V0 ICA9IHNjYXJsZXR0Ml9sZXZlbF9lbnVtX2N0bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0dDJfbGV2 ZWxfZW51bV9jdGxfcHV0LAorfTsKKworLyoqKiBQYWQgU3dpdGNoIENvbnRyb2xzICoqKi8KKwor c3RhdGljIGludCBzY2FybGV0dDJfcGFkX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0 bCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0 IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0 IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gZWxlbS0+aGVhZC5taXhlci0+cHJpdmF0 ZV9kYXRhOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCXByaXZh dGUtPnBhZF9zd2l0Y2hbZWxlbS0+Y29udHJvbF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgc2NhcmxldHQyX3BhZF9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJ IHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4 ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4 ZXJfaW50ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0 Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWludCBpbmRl eCA9IGVsZW0tPmNvbnRyb2w7CisJaW50IG92YWwsIHZhbCwgZXJyID0gMDsKKworCWNhbmNlbF9k ZWxheWVkX3dvcmtfc3luYygmcHJpdmF0ZS0+d29yayk7CisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ ZGF0YV9tdXRleCk7CisKKwlvdmFsID0gcHJpdmF0ZS0+cGFkX3N3aXRjaFtpbmRleF07CisJdmFs ID0gISF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWlmIChvdmFsID09IHZh bCkKKwkJZ290byB1bmxvY2s7CisKKwlwcml2YXRlLT5wYWRfc3dpdGNoW2luZGV4XSA9IHZhbDsK KworCS8qIFNlbmQgc3dpdGNoIGNoYW5nZSB0byB0aGUgZGV2aWNlICovCisJZXJyID0gc2Nhcmxl dHQyX3VzYl9zZXRfY29uZmlnKG1peGVyLCBTQ0FSTEVUVDJfQ09ORklHX1BBRF9TV0lUQ0gsCisJ CQkJICAgICAgIGluZGV4LCB2YWwpOworCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZwcml2YXRl LT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNu ZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX3BhZF9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RM X0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiIiwKKwkuaW5mbyA9IHNuZF9jdGxfYm9vbGVh bl9tb25vX2luZm8sCisJLmdldCAgPSBzY2FybGV0dDJfcGFkX2N0bF9nZXQsCisJLnB1dCAgPSBz Y2FybGV0dDJfcGFkX2N0bF9wdXQsCit9OworCisvKioqIE11dGUvRGltIENvbnRyb2xzICoqKi8K Kworc3RhdGljIGludCBzY2FybGV0dDJfYnV0dG9uX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJv bCAqa2N0bCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7 CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7 CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsK KwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9k YXRhOworCisJaWYgKHByaXZhdGUtPnZvbF91cGRhdGVkKSB7CisJCW11dGV4X2xvY2soJnByaXZh dGUtPmRhdGFfbXV0ZXgpOworCQlzY2FybGV0dDJfdXBkYXRlX3ZvbHVtZXMobWl4ZXIpOworCQlt dXRleF91bmxvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCX0KKworCXVjb250cm9sLT52YWx1 ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBwcml2YXRlLT5idXR0b25zW2VsZW0tPmNvbnRyb2xdOwor CXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9idXR0b25fY3RsX3B1dChzdHJ1 Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVl ICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwt PnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBlbGVt LT5oZWFkLm1peGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1p eGVyLT5wcml2YXRlX2RhdGE7CisKKwlpbnQgaW5kZXggPSBlbGVtLT5jb250cm9sOworCWludCBv dmFsLCB2YWwsIGVyciA9IDA7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXZhdGUt PndvcmspOworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCisJb3ZhbCA9IHBy aXZhdGUtPmJ1dHRvbnNbaW5kZXhdOworCXZhbCA9ICEhdWNvbnRyb2wtPnZhbHVlLmludGVnZXIu dmFsdWVbMF07CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJCWdvdG8gdW5sb2NrOworCisJcHJpdmF0 ZS0+YnV0dG9uc1tpbmRleF0gPSB2YWw7CisKKwkvKiBTZW5kIHN3aXRjaCBjaGFuZ2UgdG8gdGhl IGRldmljZSAqLworCWVyciA9IHNjYXJsZXR0Ml91c2Jfc2V0X2NvbmZpZyhtaXhlciwgU0NBUkxF VFQyX0NPTkZJR19CVVRUT05TLAorCQkJCSAgICAgICBpbmRleCwgdmFsKTsKKwordW5sb2NrOgor CW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKwor c3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9idXR0b25fY3Rs ID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIiIs CisJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAorCS5nZXQgID0gc2NhcmxldHQy X2J1dHRvbl9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX2J1dHRvbl9jdGxfcHV0Cit9Owor CisvKioqIENyZWF0ZSB0aGUgYW5hbG9ndWUgb3V0cHV0IGNvbnRyb2xzICoqKi8KKworc3RhdGlj IGludCBzY2FybGV0dDJfYWRkX2xpbmVfb3V0X2N0bHMoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZh Y2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1p eGVyLT5wcml2YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyAq aW5mbyA9IHByaXZhdGUtPmluZm87CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9y dHMgPSBpbmZvLT5wb3J0czsKKwlpbnQgbnVtX2xpbmVfb3V0ID0KKwkJcG9ydHNbU0NBUkxFVFQy X1BPUlRfVFlQRV9BTkFMT0dVRV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50IGVyciwg aTsKKwljaGFyIHNbU05EUlZfQ1RMX0VMRU1fSURfTkFNRV9NQVhMRU5dOworCisJLyogQWRkIFIv TyBIVyB2b2x1bWUgY29udHJvbCAqLworCWlmIChpbmZvLT5saW5lX291dF9od192b2wpIHsKKwkJ c25wcmludGYocywgc2l6ZW9mKHMpLCAiTWFzdGVyIEhXIFBsYXliYWNrIFZvbHVtZSIpOworCQll cnIgPSBzY2FybGV0dDJfYWRkX25ld19jdGwobWl4ZXIsCisJCQkJCSAgICAmc2NhcmxldHQyX21h c3Rlcl92b2x1bWVfY3RsLAorCQkJCQkgICAgMCwgMSwgcywgJnByaXZhdGUtPm1hc3Rlcl92b2xf Y3RsKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIEFkZCB2b2x1 bWUgY29udHJvbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2xpbmVfb3V0OyBpKyspIHsKKwor CQkvKiBGYWRlciAqLworCQlpZiAoaW5mby0+bGluZV9vdXRfZGVzY3JzW2ldKQorCQkJc25wcmlu dGYocywgc2l6ZW9mKHMpLAorCQkJCSAiTGluZSAlMDJkICglcykgUGxheWJhY2sgVm9sdW1lIiwK KwkJCQkgaSArIDEsIGluZm8tPmxpbmVfb3V0X2Rlc2Nyc1tpXSk7CisJCWVsc2UKKwkJCXNucHJp bnRmKHMsIHNpemVvZihzKSwKKwkJCQkgIkxpbmUgJTAyZCBQbGF5YmFjayBWb2x1bWUiLAorCQkJ CSBpICsgMSk7CisJCWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwKKwkJCQkJICAg ICZzY2FybGV0dDJfbGluZV9vdXRfdm9sdW1lX2N0bCwKKwkJCQkJICAgIGksIDEsIHMsICZwcml2 YXRlLT52b2xfY3Rsc1tpXSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQkv KiBNYWtlIHRoZSBmYWRlciByZWFkLW9ubHkgaWYgdGhlIFNXL0hXIHN3aXRjaCBpcyBzZXQgdG8g SFcgKi8KKwkJaWYgKHByaXZhdGUtPnZvbF9zd19od19zd2l0Y2hbaV0pCisJCQlwcml2YXRlLT52 b2xfY3Rsc1tpXS0+dmRbMF0uYWNjZXNzICY9CisJCQkJflNORFJWX0NUTF9FTEVNX0FDQ0VTU19X UklURTsKKworCQkvKiBTVy9IVyBTd2l0Y2ggKi8KKwkJaWYgKGluZm8tPmxpbmVfb3V0X2h3X3Zv bCkgeworCQkJc25wcmludGYocywgc2l6ZW9mKHMpLAorCQkJCSAiTGluZSBPdXQgJTAyZCBWb2x1 bWUgQ29udHJvbCBQbGF5YmFjayBFbnVtIiwKKwkJCQkgaSArIDEpOworCQkJZXJyID0gc2Nhcmxl dHQyX2FkZF9uZXdfY3RsKG1peGVyLAorCQkJCQkJICAgICZzY2FybGV0dDJfc3dfaHdfZW51bV9j dGwsCisJCQkJCQkgICAgaSwgMSwgcywgTlVMTCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1 cm4gZXJyOworCQl9CisJfQorCisJLyogQWRkIEhXIGJ1dHRvbiBjb250cm9scyAqLworCWZvciAo aSA9IDA7IGkgPCBwcml2YXRlLT5pbmZvLT5idXR0b25fY291bnQ7IGkrKykgeworCQllcnIgPSBz Y2FybGV0dDJfYWRkX25ld19jdGwobWl4ZXIsICZzY2FybGV0dDJfYnV0dG9uX2N0bCwKKwkJCQkJ ICAgIGksIDEsIHNjYXJsZXR0Ml9idXR0b25fbmFtZXNbaV0sCisJCQkJCSAgICAmcHJpdmF0ZS0+ YnV0dG9uX2N0bHNbaV0pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJ cmV0dXJuIDA7Cit9CisKKy8qKiogQ3JlYXRlIHRoZSBhbmFsb2d1ZSBpbnB1dCBjb250cm9scyAq KiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX2FkZF9saW5lX2luX2N0bHMoc3RydWN0IHVzYl9t aXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAq cHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9k ZXZpY2VfaW5mbyAqaW5mbyA9IHByaXZhdGUtPmluZm87CisJaW50IGVyciwgaTsKKwljaGFyIHNb U05EUlZfQ1RMX0VMRU1fSURfTkFNRV9NQVhMRU5dOworCisJLyogQWRkIGlucHV0IGxldmVsIChs aW5lL2luc3QpIGNvbnRyb2xzICovCisJZm9yIChpID0gMDsgaSA8IGluZm8tPmxldmVsX2lucHV0 X2NvdW50OyBpKyspIHsKKwkJc25wcmludGYocywgc2l6ZW9mKHMpLCAiTGluZSBJbiAlZCBMZXZl bCBDYXB0dXJlIEVudW0iLCBpICsgMSk7CisJCWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bCht aXhlciwgJnNjYXJsZXR0Ml9sZXZlbF9lbnVtX2N0bCwKKwkJCQkJICAgIGksIDEsIHMsIE5VTEwp OworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogQWRkIGlucHV0IHBh ZCBjb250cm9scyAqLworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5wYWRfaW5wdXRfY291bnQ7IGkr KykgeworCQlzbnByaW50ZihzLCBzaXplb2YocyksICJMaW5lIEluICVkIFBhZCBDYXB0dXJlIFN3 aXRjaCIsIGkgKyAxKTsKKwkJZXJyID0gc2NhcmxldHQyX2FkZF9uZXdfY3RsKG1peGVyLCAmc2Nh cmxldHQyX3BhZF9jdGwsCisJCQkJCSAgICBpLCAxLCBzLCBOVUxMKTsKKwkJaWYgKGVyciA8IDAp CisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCisvKioqIE1peGVyIFZvbHVt ZSBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX21peGVyX2N0bF9pbmZvKHN0 cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5m byAqdWluZm8pCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5w cml2YXRlX2RhdGE7CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdF UjsKKwl1aW5mby0+Y291bnQgPSBlbGVtLT5jaGFubmVsczsKKwl1aW5mby0+dmFsdWUuaW50ZWdl ci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IFNDQVJMRVRUX01JWEVSX01B WF9WQUxVRTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5zdGVwID0gMTsKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBzY2FybGV0dDJfbWl4ZXJfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9s ICprY3RsLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorewor CXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOwor CXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhlYWQubWl4ZXIt PnByaXZhdGVfZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcHJp dmF0ZS0+bWl4W2VsZW0tPmNvbnRyb2xdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNj YXJsZXR0Ml9taXhlcl9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJICAg c3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVzYl9taXhl cl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9taXhl cl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsKKwlzdHJ1Y3Qgc2NhcmxldHQy X21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0cnVj dCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm8gPSBwcml2YXRlLT5pbmZvOworCWNvbnN0IHN0 cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0gaW5mby0+cG9ydHM7CisJaW50IG92YWwsIHZh bCwgbnVtX21peGVyX2luLCBtaXhfbnVtLCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdmF0 ZS0+ZGF0YV9tdXRleCk7CisKKwlvdmFsID0gcHJpdmF0ZS0+bWl4W2VsZW0tPmNvbnRyb2xdOwor CXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCW51bV9taXhlcl9pbiA9 IHBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfTUlYXS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXTsK KwltaXhfbnVtID0gZWxlbS0+Y29udHJvbCAvIG51bV9taXhlcl9pbjsKKworCWlmIChvdmFsID09 IHZhbCkKKwkJZ290byB1bmxvY2s7CisKKwlwcml2YXRlLT5taXhbZWxlbS0+Y29udHJvbF0gPSB2 YWw7CisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfbWl4KG1peGVyLCBtaXhfbnVtKTsKKwlpZiAo ZXJyID09IDApCisJCWVyciA9IDE7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnByaXZhdGUt PmRhdGFfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RM Vl9EQl9NSU5NQVgoCisJZGJfc2NhbGVfc2NhcmxldHRfbWl4ZXIsCisJU0NBUkxFVFRfTUlYRVJf TUlOX0RCICogMTAwLAorCVNDQVJMRVRUX01JWEVSX01BWF9EQiAqIDEwMAorKTsKKworc3RhdGlj IGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9taXhlcl9jdGwgPSB7CisJ LmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJWX0NU TF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAorCQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZf UkVBRCwKKwkubmFtZSA9ICIiLAorCS5pbmZvID0gc2NhcmxldHQyX21peGVyX2N0bF9pbmZvLAor CS5nZXQgID0gc2NhcmxldHQyX21peGVyX2N0bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0dDJfbWl4 ZXJfY3RsX3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9IFNDQVJMRVRUX01JWEVSX01BWF9EQiwgLyog bWF4IHZhbHVlICovCisJLnRsdiA9IHsgLnAgPSBkYl9zY2FsZV9zY2FybGV0dF9taXhlciB9Cit9 OworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9hZGRfbWl4ZXJfY3RscyhzdHJ1Y3QgdXNiX21peGVy X2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2 YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX3BvcnRz ICpwb3J0cyA9IHByaXZhdGUtPmluZm8tPnBvcnRzOworCWludCBlcnIsIGksIGo7CisJaW50IGlu ZGV4OworCWNoYXIgc1tTTkRSVl9DVExfRUxFTV9JRF9OQU1FX01BWExFTl07CisKKwlpbnQgbnVt X2lucHV0cyA9IHBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfTUlYXS5udW1bU0NBUkxFVFQyX1BP UlRfT1VUXTsKKwlpbnQgbnVtX291dHB1dHMgPSBwb3J0c1tTQ0FSTEVUVDJfUE9SVF9UWVBFX01J WF0ubnVtW1NDQVJMRVRUMl9QT1JUX0lOXTsKKworCWZvciAoaSA9IDAsIGluZGV4ID0gMDsgaSA8 IG51bV9vdXRwdXRzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IG51bV9pbnB1dHM7IGorKywg aW5kZXgrKykgeworCQkJc25wcmludGYocywgc2l6ZW9mKHMpLAorCQkJCSAiTWl4ICVjIElucHV0 ICUwMmQgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkgJ0EnICsgaSwgaiArIDEpOworCQkJZXJyID0g c2NhcmxldHQyX2FkZF9uZXdfY3RsKG1peGVyLCAmc2NhcmxldHQyX21peGVyX2N0bCwKKwkJCQkJ CSAgICBpbmRleCwgMSwgcywgTlVMTCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJy OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKiogTXV4IFNvdXJjZSBTZWxlY3Rpb24g Q29udHJvbHMgKioqLworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsX2lu Zm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxl bV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtj dGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUg PSBlbGVtLT5oZWFkLm1peGVyLT5wcml2YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0 Ml9wb3J0cyAqcG9ydHMgPSBwcml2YXRlLT5pbmZvLT5wb3J0czsKKwl1bnNpZ25lZCBpbnQgaXRl bSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW07CisJaW50IGl0ZW1zID0gcHJpdmF0ZS0+ bnVtX211eF9zcmNzOworCWludCBwb3J0X3R5cGU7CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NU TF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSBlbGVtLT5jaGFubmVsczsK Kwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGl0ZW1zOworCisJaWYgKGl0ZW0gPj0g aXRlbXMpCisJCWl0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gaXRlbXMgLSAx OworCisJZm9yIChwb3J0X3R5cGUgPSAwOworCSAgICAgcG9ydF90eXBlIDwgU0NBUkxFVFQyX1BP UlRfVFlQRV9DT1VOVDsKKwkgICAgIHBvcnRfdHlwZSsrKSB7CisJCWlmIChpdGVtIDwgcG9ydHNb cG9ydF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dKSB7CisJCQlzcHJpbnRmKHVpbmZvLT52 YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCisJCQkJcG9ydHNbcG9ydF90eXBlXS5zcmNfZGVzY3IsCisJ CQkJaXRlbSArIHBvcnRzW3BvcnRfdHlwZV0uc3JjX251bV9vZmZzZXQpOworCQkJcmV0dXJuIDA7 CisJCX0KKwkJaXRlbSAtPSBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9JTl07 CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX211eF9z cmNfZW51bV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCSAgc3RydWN0 IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVt X2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhl cl9kYXRhICpwcml2YXRlID0gZWxlbS0+aGVhZC5taXhlci0+cHJpdmF0ZV9kYXRhOworCisJdWNv bnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHByaXZhdGUtPm11eFtlbGVtLT5jb250 cm9sXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbXV4X3NyY19lbnVt X2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkJICBzdHJ1Y3Qgc25kX2N0 bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAq ZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAq bWl4ZXIgPSBlbGVtLT5oZWFkLm1peGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAq cHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisJaW50IGluZGV4ID0gZWxlbS0+Y29udHJv bDsKKwlpbnQgb3ZhbCwgdmFsLCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0 YV9tdXRleCk7CisKKwlvdmFsID0gcHJpdmF0ZS0+bXV4W2luZGV4XTsKKwl2YWwgPSBjbGFtcCh1 Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwKKwkJICAgIDBMLCBwcml2YXRlLT5udW1f bXV4X3NyY3MgLSAxTCk7CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJCWdvdG8gdW5sb2NrOworCisJ cHJpdmF0ZS0+bXV4W2luZGV4XSA9IHZhbDsKKwllcnIgPSBzY2FybGV0dDJfdXNiX3NldF9tdXgo bWl4ZXIpOworCWlmIChlcnIgPT0gMCkKKwkJZXJyID0gMTsKKwordW5sb2NrOgorCW11dGV4X3Vu bG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNv bnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsID0g eworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIiIsCisJ LmluZm8gPSBzY2FybGV0dDJfbXV4X3NyY19lbnVtX2N0bF9pbmZvLAorCS5nZXQgID0gc2Nhcmxl dHQyX211eF9zcmNfZW51bV9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX211eF9zcmNfZW51 bV9jdGxfcHV0LAorfTsKKworc3RhdGljIGludCBzY2FybGV0dDJfYWRkX211eF9lbnVtcyhzdHJ1 Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhl cl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2Nh cmxldHQyX3BvcnRzICpwb3J0cyA9IHByaXZhdGUtPmluZm8tPnBvcnRzOworCWludCBwb3J0X3R5 cGUsIGNoYW5uZWwsIGk7CisKKwlmb3IgKGkgPSAwLCBwb3J0X3R5cGUgPSAwOworCSAgICAgcG9y dF90eXBlIDwgU0NBUkxFVFQyX1BPUlRfVFlQRV9DT1VOVDsKKwkgICAgIHBvcnRfdHlwZSsrKSB7 CisJCWZvciAoY2hhbm5lbCA9IDA7CisJCSAgICAgY2hhbm5lbCA8IHBvcnRzW3BvcnRfdHlwZV0u bnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJCSAgICAgY2hhbm5lbCsrLCBpKyspIHsKKwkJCWlu dCBlcnI7CisJCQljaGFyIHNbU05EUlZfQ1RMX0VMRU1fSURfTkFNRV9NQVhMRU5dOworCQkJY29u c3QgY2hhciAqY29uc3QgZGVzY3IgPSBwb3J0c1twb3J0X3R5cGVdLmRzdF9kZXNjcjsKKworCQkJ c25wcmludGYocywgc2l6ZW9mKHMpIC0gNSwgZGVzY3IsIGNoYW5uZWwgKyAxKTsKKwkJCXN0cmNh dChzLCAiIEVudW0iKTsKKworCQkJZXJyID0gc2NhcmxldHQyX2FkZF9uZXdfY3RsKG1peGVyLAor CQkJCQkJICAgICZzY2FybGV0dDJfbXV4X3NyY19lbnVtX2N0bCwKKwkJCQkJCSAgICBpLCAxLCBz LCBOVUxMKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwly ZXR1cm4gMDsKK30KKworLyoqKiBNZXRlciBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2Nh cmxldHQyX21ldGVyX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJICAg IHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IHVzYl9taXhlcl9l bGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisKKwl1aW5mby0+dHlwZSA9IFNO RFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSBlbGVtLT5jaGFubmVs czsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2Vy Lm1heCA9IDQwOTU7CisJdWluZm8tPnZhbHVlLmludGVnZXIuc3RlcCA9IDE7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX21ldGVyX2N0bF9nZXQoc3RydWN0IHNuZF9rY29u dHJvbCAqa2N0bCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkK K3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0 YTsKKwl1MTYgbWV0ZXJfbGV2ZWxzW1NDQVJMRVRUMl9OVU1fTUVURVJTXTsKKwlpbnQgaSwgZXJy OworCisJZXJyID0gc2NhcmxldHQyX3VzYl9nZXRfbWV0ZXJfbGV2ZWxzKGVsZW0tPmhlYWQubWl4 ZXIsIG1ldGVyX2xldmVscyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlmb3Ig KGkgPSAwOyBpIDwgZWxlbS0+Y2hhbm5lbHM7IGkrKykKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVn ZXIudmFsdWVbaV0gPSBtZXRlcl9sZXZlbHNbaV07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9tZXRlcl9jdGwgPSB7CisJ LmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExf RUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwKKwkubmFt ZSA9ICIiLAorCS5pbmZvID0gc2NhcmxldHQyX21ldGVyX2N0bF9pbmZvLAorCS5nZXQgID0gc2Nh cmxldHQyX21ldGVyX2N0bF9nZXQKK307CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX2FkZF9tZXRl cl9jdGwoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXJldHVybiBzY2Fy bGV0dDJfYWRkX25ld19jdGwobWl4ZXIsICZzY2FybGV0dDJfbWV0ZXJfY3RsLAorCQkJCSAgICAg MCwgU0NBUkxFVFQyX05VTV9NRVRFUlMsCisJCQkJICAgICAiTGV2ZWwgTWV0ZXIiLCBOVUxMKTsK K30KKworLyoqKiBJbml0aWFsaXNhdGlvbiAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX2Nv dW50X211eF9zcmNzKGNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzKQoreworCWlu dCBwb3J0X3R5cGUsIGNvdW50ID0gMDsKKworCWZvciAocG9ydF90eXBlID0gMDsKKwkgICAgIHBv cnRfdHlwZSA8IFNDQVJMRVRUMl9QT1JUX1RZUEVfQ09VTlQ7CisJICAgICBwb3J0X3R5cGUrKykK KwkJY291bnQgKz0gcG9ydHNbcG9ydF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dOworCisJ cmV0dXJuIGNvdW50OworfQorCisvKiBEZWZhdWx0IHJvdXRpbmcgY29ubmVjdHMgUENNIG91dHB1 dHMgYW5kIGlucHV0cyB0byBBbmFsb2d1ZSwKKyAqIFMvUERJRiwgdGhlbiBBREFUCisgKi8KK3N0 YXRpYyB2b2lkIHNjYXJsZXR0Ml9pbml0X3JvdXRpbmcodTggKm11eCwKKwkJCQkgICBjb25zdCBz dHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpwb3J0cykKK3sKKwlpbnQgaSwgaW5wdXRfbnVtLCBpbnB1 dF9jb3VudCwgcG9ydF90eXBlOworCWludCBvdXRwdXRfbnVtLCBvdXRwdXRfY291bnQsIHBvcnRf dHlwZV9jb25uZWN0X251bTsKKworCXN0YXRpYyBjb25zdCBpbnQgY29ubmVjdF9vcmRlcltdID0g eworCQlTQ0FSTEVUVDJfUE9SVF9UWVBFX0FOQUxPR1VFLAorCQlTQ0FSTEVUVDJfUE9SVF9UWVBF X1NQRElGLAorCQlTQ0FSTEVUVDJfUE9SVF9UWVBFX0FEQVQsCisJCS0xCisJfTsKKworCS8qIEFz c2lnbiBQQ00gaW5wdXRzIChyb3V0aW5nIG91dHB1dHMpICovCisJb3V0cHV0X251bSA9IHNjYXJs ZXR0Ml9nZXRfcG9ydF9zdGFydF9udW0ocG9ydHMsCisJCQkJCQkgIFNDQVJMRVRUMl9QT1JUX09V VCwKKwkJCQkJCSAgU0NBUkxFVFQyX1BPUlRfVFlQRV9QQ00pOworCW91dHB1dF9jb3VudCA9IHBv cnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfUENNXS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXTsKKwor CWZvciAocG9ydF90eXBlID0gY29ubmVjdF9vcmRlcltwb3J0X3R5cGVfY29ubmVjdF9udW0gPSAw XTsKKwkgICAgIHBvcnRfdHlwZSA+PSAwOworCSAgICAgcG9ydF90eXBlID0gY29ubmVjdF9vcmRl clsrK3BvcnRfdHlwZV9jb25uZWN0X251bV0pIHsKKwkJaW5wdXRfbnVtID0gc2NhcmxldHQyX2dl dF9wb3J0X3N0YXJ0X251bSgKKwkJCXBvcnRzLCBTQ0FSTEVUVDJfUE9SVF9JTiwgcG9ydF90eXBl KTsKKwkJaW5wdXRfY291bnQgPSBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9J Tl07CisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IGlucHV0X2NvdW50ICYmIG91dHB1dF9jb3Vu dDsKKwkJICAgICBpKyssIG91dHB1dF9jb3VudC0tKQorCQkJbXV4W291dHB1dF9udW0rK10gPSBp bnB1dF9udW0rKzsKKwl9CisKKwkvKiBBc3NpZ24gUENNIG91dHB1dHMgKHJvdXRpbmcgaW5wdXRz KSAqLworCWlucHV0X251bSA9IHNjYXJsZXR0Ml9nZXRfcG9ydF9zdGFydF9udW0ocG9ydHMsCisJ CQkJCQkgU0NBUkxFVFQyX1BPUlRfSU4sCisJCQkJCQkgU0NBUkxFVFQyX1BPUlRfVFlQRV9QQ00p OworCWlucHV0X2NvdW50ID0gcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9QQ01dLm51bVtTQ0FS TEVUVDJfUE9SVF9JTl07CisKKwlmb3IgKHBvcnRfdHlwZSA9IGNvbm5lY3Rfb3JkZXJbcG9ydF90 eXBlX2Nvbm5lY3RfbnVtID0gMF07CisJICAgICBwb3J0X3R5cGUgPj0gMDsKKwkgICAgIHBvcnRf dHlwZSA9IGNvbm5lY3Rfb3JkZXJbKytwb3J0X3R5cGVfY29ubmVjdF9udW1dKSB7CisJCW91dHB1 dF9udW0gPSBzY2FybGV0dDJfZ2V0X3BvcnRfc3RhcnRfbnVtKAorCQkJcG9ydHMsIFNDQVJMRVRU Ml9QT1JUX09VVCwgcG9ydF90eXBlKTsKKwkJb3V0cHV0X2NvdW50ID0gcG9ydHNbcG9ydF90eXBl XS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXTsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgb3V0 cHV0X2NvdW50ICYmIGlucHV0X2NvdW50OworCQkgICAgIGkrKywgaW5wdXRfY291bnQtLSkKKwkJ CW11eFtvdXRwdXRfbnVtKytdID0gaW5wdXRfbnVtKys7CisJfQorfQorCisvKiBJbml0aWFsaXNl IHByaXZhdGUgZGF0YSwgcm91dGluZywgc2VxdWVuY2UgbnVtYmVyICovCitzdGF0aWMgaW50IHNj YXJsZXR0Ml9pbml0X3ByaXZhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAor CQkJCSAgY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyAqaW5mbykKK3sKKwlzdHJ1 Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPQorCQlremFsbG9jKHNpemVvZihzdHJ1 Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcHJpdmF0ZSkK KwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZwcml2YXRlLT51c2JfbXV0ZXgpOwor CW11dGV4X2luaXQoJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCUlOSVRfREVMQVlFRF9XT1JLKCZw cml2YXRlLT53b3JrLCBzY2FybGV0dDJfY29uZmlnX3NhdmUpOworCXByaXZhdGUtPmluZm8gPSBp bmZvOworCXByaXZhdGUtPm51bV9tdXhfc3JjcyA9IHNjYXJsZXR0Ml9jb3VudF9tdXhfc3Jjcyhp bmZvLT5wb3J0cyk7CisJcHJpdmF0ZS0+c2NhcmxldHQyX3NlcSA9IDA7CisJcHJpdmF0ZS0+bWl4 ZXIgPSBtaXhlcjsKKwltaXhlci0+cHJpdmF0ZV9kYXRhID0gcHJpdmF0ZTsKKwltaXhlci0+cHJp dmF0ZV9mcmVlID0gc25kX3NjYXJsZXR0X2dlbjJfcHJpdmF0ZV9mcmVlOworCisJLyogU2V0dXAg ZGVmYXVsdCByb3V0aW5nICovCisJc2NhcmxldHQyX2luaXRfcm91dGluZyhwcml2YXRlLT5tdXgs IGluZm8tPnBvcnRzKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIHNlcXVlbmNlIG51bWJlciB1c2Vk IGZvciB0aGUgcHJvcHJpZXRhcnkgY29tbWFuZHMgKi8KKwlyZXR1cm4gc2NhcmxldHQyX3VzYiht aXhlciwgU0NBUkxFVFQyX1VTQl9JTklUX1NFUSwKKwkJCSAgICAgTlVMTCwgMCwgTlVMTCwgMCk7 Cit9CisKKy8qIFJlYWQgbGluZS1pbiBjb25maWcgYW5kIGxpbmUtb3V0IHZvbHVtZSBzZXR0aW5n cyBvbiBzdGFydCAqLworc3RhdGljIGludCBzY2FybGV0dDJfcmVhZF9jb25maWdzKHN0cnVjdCB1 c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2Rh dGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0cnVjdCBzY2FybGV0 dDJfZGV2aWNlX2luZm8gKmluZm8gPSBwcml2YXRlLT5pbmZvOworCWNvbnN0IHN0cnVjdCBzY2Fy bGV0dDJfcG9ydHMgKnBvcnRzID0gaW5mby0+cG9ydHM7CisJaW50IG51bV9saW5lX291dCA9CisJ CXBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUVdLm51bVtTQ0FSTEVUVDJfUE9SVF9P VVRdOworCXU4IGxldmVsX3N3aXRjaGVzW1NDQVJMRVRUMl9MRVZFTF9TV0lUQ0hfTUFYXTsKKwl1 OCBwYWRfc3dpdGNoZXNbU0NBUkxFVFQyX1BBRF9TV0lUQ0hfTUFYXTsKKwlzdHJ1Y3Qgc2Nhcmxl dHQyX3VzYl92b2x1bWVfc3RhdHVzIHZvbHVtZV9zdGF0dXM7CisJaW50IGVyciwgaTsKKworCWlm IChpbmZvLT5sZXZlbF9pbnB1dF9jb3VudCkgeworCQllcnIgPSBzY2FybGV0dDJfdXNiX2dldF9j b25maWcoCisJCQltaXhlciwKKwkJCVNDQVJMRVRUMl9DT05GSUdfTEVWRUxfU1dJVENILAorCQkJ aW5mby0+bGV2ZWxfaW5wdXRfY291bnQsCisJCQlsZXZlbF9zd2l0Y2hlcyk7CisJCWlmIChlcnIg PCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZm9yIChpID0gMDsgaSA8IGluZm8tPmxldmVsX2lucHV0 X2NvdW50OyBpKyspCisJCQlwcml2YXRlLT5sZXZlbF9zd2l0Y2hbaV0gPSBsZXZlbF9zd2l0Y2hl c1tpXTsKKwl9CisKKwlpZiAoaW5mby0+cGFkX2lucHV0X2NvdW50KSB7CisJCWVyciA9IHNjYXJs ZXR0Ml91c2JfZ2V0X2NvbmZpZygKKwkJCW1peGVyLAorCQkJU0NBUkxFVFQyX0NPTkZJR19QQURf U1dJVENILAorCQkJaW5mby0+cGFkX2lucHV0X2NvdW50LAorCQkJcGFkX3N3aXRjaGVzKTsKKwkJ aWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+cGFk X2lucHV0X2NvdW50OyBpKyspCisJCQlwcml2YXRlLT5wYWRfc3dpdGNoW2ldID0gcGFkX3N3aXRj aGVzW2ldOworCX0KKworCWVyciA9IHNjYXJsZXR0Ml91c2JfZ2V0X3ZvbHVtZV9zdGF0dXMobWl4 ZXIsICZ2b2x1bWVfc3RhdHVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXBy aXZhdGUtPm1hc3Rlcl92b2wgPSBjbGFtcCgKKwkJdm9sdW1lX3N0YXR1cy5tYXN0ZXJfdm9sICsg U0NBUkxFVFRfVk9MVU1FX0JJQVMsCisJCTAsIFNDQVJMRVRUX1ZPTFVNRV9CSUFTKTsKKworCWZv ciAoaSA9IDA7IGkgPCBudW1fbGluZV9vdXQ7IGkrKykgeworCQlpbnQgdm9sdW1lOworCisJCXBy aXZhdGUtPnZvbF9zd19od19zd2l0Y2hbaV0gPQorCQkJaW5mby0+bGluZV9vdXRfaHdfdm9sCisJ CQkJJiYgdm9sdW1lX3N0YXR1cy5zd19od19zd2l0Y2hbaV07CisKKwkJdm9sdW1lID0gcHJpdmF0 ZS0+dm9sX3N3X2h3X3N3aXRjaFtpXQorCQkJICAgPyB2b2x1bWVfc3RhdHVzLm1hc3Rlcl92b2wK KwkJCSAgIDogdm9sdW1lX3N0YXR1cy5zd192b2xbaV07CisJCXZvbHVtZSA9IGNsYW1wKHZvbHVt ZSArIFNDQVJMRVRUX1ZPTFVNRV9CSUFTLAorCQkJICAgICAgIDAsIFNDQVJMRVRUX1ZPTFVNRV9C SUFTKTsKKwkJcHJpdmF0ZS0+dm9sW2ldID0gdm9sdW1lOworCX0KKworCWZvciAoaSA9IDA7IGkg PCBpbmZvLT5idXR0b25fY291bnQ7IGkrKykKKwkJcHJpdmF0ZS0+YnV0dG9uc1tpXSA9ICEhdm9s dW1lX3N0YXR1cy5idXR0b25zW2ldOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE5vdGlmeSBvbiB2 b2x1bWUgY2hhbmdlICovCitzdGF0aWMgdm9pZCBzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X3Zv bF9jaGFuZ2UoCisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVj dCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisJ Y29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBwcml2YXRlLT5pbmZvLT5wb3J0 czsKKwlpbnQgbnVtX2xpbmVfb3V0ID0KKwkJcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9BTkFM T0dVRV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50IGk7CisKKwlwcml2YXRlLT52b2xf dXBkYXRlZCA9IDE7CisKKwlzbmRfY3RsX25vdGlmeShtaXhlci0+Y2hpcC0+Y2FyZCwgU05EUlZf Q1RMX0VWRU5UX01BU0tfVkFMVUUsCisJCSAgICAgICAmcHJpdmF0ZS0+bWFzdGVyX3ZvbF9jdGwt PmlkKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbGluZV9vdXQ7IGkrKykgeworCQlpZiAoIXBy aXZhdGUtPnZvbF9zd19od19zd2l0Y2hbaV0pCisJCQljb250aW51ZTsKKwkJc25kX2N0bF9ub3Rp ZnkobWl4ZXItPmNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAg ICAgICZwcml2YXRlLT52b2xfY3Rsc1tpXS0+aWQpOworCX0KK30KKworLyogTm90aWZ5IG9uIGJ1 dHRvbiBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9taXhlcl9pbnRlcnJ1cHRfYnV0 dG9uX2NoYW5nZSgKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3Ry dWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsK KwlpbnQgaTsKKworCXByaXZhdGUtPnZvbF91cGRhdGVkID0gMTsKKworCWZvciAoaSA9IDA7IGkg PCBwcml2YXRlLT5pbmZvLT5idXR0b25fY291bnQ7IGkrKykKKwkJc25kX2N0bF9ub3RpZnkobWl4 ZXItPmNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAgICAgICZw cml2YXRlLT5idXR0b25fY3Rsc1tpXS0+aWQpOworfQorCisvKiBJbnRlcnJ1cHQgY2FsbGJhY2sg Ki8KK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9taXhlcl9pbnRlcnJ1cHQoc3RydWN0IHVyYiAqdXJi KQoreworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IHVyYi0+Y29udGV4dDsK KwlpbnQgbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCWludCB1c3RhdHVzID0gdXJiLT5zdGF0 dXM7CisJdTMyIGRhdGE7CisKKwlpZiAodXN0YXR1cyAhPSAwKQorCQlnb3RvIHJlcXVldWU7CisK KwlpZiAobGVuID09IDgpIHsKKwkJZGF0YSA9IGxlMzJfdG9fY3B1KCoodTMyICopdXJiLT50cmFu c2Zlcl9idWZmZXIpOworCQlpZiAoZGF0YSAmIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX1ZPTF9D SEFOR0UpCisJCQlzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X3ZvbF9jaGFuZ2UobWl4ZXIpOwor CQlpZiAoZGF0YSAmIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX0JVVFRPTl9DSEFOR0UpCisJCQlz Y2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X2J1dHRvbl9jaGFuZ2UobWl4ZXIpOworCX0gZWxzZSB7 CisJCXVzYl9hdWRpb19lcnIobWl4ZXItPmNoaXAsCisJCQkgICAgICAic2NhcmxldHQgbWl4ZXIg aW50ZXJydXB0IGxlbmd0aCAlZFxuIiwgbGVuKTsKKwl9CisKK3JlcXVldWU6CisJaWYgKHVzdGF0 dXMgIT0gLUVOT0VOVCAmJgorCSAgICB1c3RhdHVzICE9IC1FQ09OTlJFU0VUICYmCisJICAgIHVz dGF0dXMgIT0gLUVTSFVURE9XTikgeworCQl1cmItPmRldiA9IG1peGVyLT5jaGlwLT5kZXY7CisJ CXVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJfQorfQorCitzdGF0aWMgaW50IHNj YXJsZXR0Ml9taXhlcl9zdGF0dXNfY3JlYXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICpt aXhlcikKK3sKKwl2b2lkICp0cmFuc2Zlcl9idWZmZXI7CisKKwlpZiAobWl4ZXItPnVyYikgewor CQl1c2JfYXVkaW9fZXJyKG1peGVyLT5jaGlwLAorCQkJICAgICAgIiVzOiBtaXhlciB1cmIgYWxy ZWFkeSBpbiB1c2UhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCW1peGVyLT51 cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghbWl4ZXItPnVyYikKKwkJ cmV0dXJuIC1FTk9NRU07CisKKwl0cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKFNDQVJMRVRUMl9V U0JfSU5URVJSVVBUX01BWF9EQVRBLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRyYW5zZmVyX2J1ZmZl cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl1c2JfZmlsbF9pbnRfdXJiKAorCQltaXhlci0+dXJi LAorCQltaXhlci0+Y2hpcC0+ZGV2LAorCQl1c2JfcmN2aW50cGlwZShtaXhlci0+Y2hpcC0+ZGV2 LAorCQkJICAgICAgIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX0VORFBPSU5UKSwKKwkJdHJhbnNm ZXJfYnVmZmVyLAorCQlTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9NQVhfREFUQSwKKwkJc2Nhcmxl dHQyX21peGVyX2ludGVycnVwdCwKKwkJbWl4ZXIsCisJCVNDQVJMRVRUMl9VU0JfSU5URVJSVVBU X0lOVEVSVkFMKTsKKworCXJldHVybiB1c2Jfc3VibWl0X3VyYihtaXhlci0+dXJiLCBHRlBfS0VS TkVMKTsKK30KKworLyogRW50cnkgcG9pbnQgKi8KK2ludCBzbmRfc2NhcmxldHRfZ2VuMl9jb250 cm9sc19jcmVhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCWNvbnN0 IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm87CisJaW50IGVycjsKKworCS8qIG9u bHkgdXNlIFVBQ19WRVJTSU9OXzIgKi8KKwlpZiAoIW1peGVyLT5wcm90b2NvbCkKKwkJcmV0dXJu IDA7CisKKwlzd2l0Y2ggKG1peGVyLT5jaGlwLT51c2JfaWQpIHsKKwljYXNlIFVTQl9JRCgweDEy MzUsIDB4ODIwMyk6CisJCWluZm8gPSAmczZpNl9nZW4yX2luZm87CisJCWJyZWFrOworCWNhc2Ug VVNCX0lEKDB4MTIzNSwgMHg4MjA0KToKKwkJaW5mbyA9ICZzMThpOF9nZW4yX2luZm87CisJCWJy ZWFrOworCWNhc2UgVVNCX0lEKDB4MTIzNSwgMHg4MjAxKToKKwkJaW5mbyA9ICZzMThpMjBfZ2Vu Ml9pbmZvOworCQlicmVhazsKKwlkZWZhdWx0OiAvKiBkZXZpY2Ugbm90ICh5ZXQpIHN1cHBvcnRl ZCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXNjYXJsZXR0X2dlbjJfbWl4ZXJf ZW5hYmxlKSB7CisJCXVzYl9hdWRpb19lcnIobWl4ZXItPmNoaXAsCisJCQkiRm9jdXNyaXRlIFNj YXJsZXR0IEdlbiAyIE1peGVyIERyaXZlciBkaXNhYmxlZDsgdXNlICIKKwkJCSJvcHRpb25zIHNu ZF91c2JfYXVkaW8gc2NhcmxldHRfZ2VuMl9taXhlcl9lbmFibGU9MSAiCisJCQkidG8gZW5hYmxl IGFuZCByZXBvcnQgYW55IGlzc3VlcyB0byBnQGI0LnZ1Iik7CisJCXJldHVybiAwOworCX0KKwor CS8qIEluaXRpYWxpc2UgcHJpdmF0ZSBkYXRhLCByb3V0aW5nLCBzZXF1ZW5jZSBudW1iZXIgKi8K KwllcnIgPSBzY2FybGV0dDJfaW5pdF9wcml2YXRlKG1peGVyLCBpbmZvKTsKKwlpZiAoZXJyIDwg MCkKKwkJcmV0dXJuIGVycjsKKworCS8qIFJlYWQgdm9sdW1lIGxldmVscyBhbmQgY29udHJvbHMg ZnJvbSB0aGUgaW50ZXJmYWNlICovCisJZXJyID0gc2NhcmxldHQyX3JlYWRfY29uZmlncyhtaXhl cik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBDcmVhdGUgdGhlIGFuYWxv Z3VlIG91dHB1dCBjb250cm9scyAqLworCWVyciA9IHNjYXJsZXR0Ml9hZGRfbGluZV9vdXRfY3Rs cyhtaXhlcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBDcmVhdGUgdGhl IGFuYWxvZ3VlIGlucHV0IGNvbnRyb2xzICovCisJZXJyID0gc2NhcmxldHQyX2FkZF9saW5lX2lu X2N0bHMobWl4ZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogQ3JlYXRl IHRoZSBpbnB1dCwgb3V0cHV0LCBhbmQgbWl4ZXIgbXV4IGlucHV0IHNlbGVjdGlvbnMgKi8KKwll cnIgPSBzY2FybGV0dDJfYWRkX211eF9lbnVtcyhtaXhlcik7CisJaWYgKGVyciA8IDApCisJCXJl dHVybiBlcnI7CisKKwkvKiBDcmVhdGUgdGhlIG1hdHJpeCBtaXhlciBjb250cm9scyAqLworCWVy ciA9IHNjYXJsZXR0Ml9hZGRfbWl4ZXJfY3RscyhtaXhlcik7CisJaWYgKGVyciA8IDApCisJCXJl dHVybiBlcnI7CisKKwkvKiBDcmVhdGUgdGhlIGxldmVsIG1ldGVyIGNvbnRyb2xzICovCisJZXJy ID0gc2NhcmxldHQyX2FkZF9tZXRlcl9jdGwobWl4ZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1 cm4gZXJyOworCisJLyogU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcG9sbGluZyBpZiB0aGVyZSBhcmUg aGFyZHdhcmUgYnV0dG9ucyAqLworCWlmIChpbmZvLT5idXR0b25fY291bnQpIHsKKwkJZXJyID0g c2NhcmxldHQyX21peGVyX3N0YXR1c19jcmVhdGUobWl4ZXIpOworCQlpZiAoZXJyIDwgMCkKKwkJ CXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9zY2Fy bGV0dF9nZW4yX3ByaXZhdGVfZnJlZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIp Cit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZh dGVfZGF0YTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdmF0ZS0+d29yayk7CisJ a2ZyZWUocHJpdmF0ZSk7CisJbWl4ZXItPnByaXZhdGVfZGF0YSA9IE5VTEw7Cit9CmRpZmYgLS1n aXQgYS9zb3VuZC91c2IvbWl4ZXJfc2NhcmxldHRfZ2VuMi5oIGIvc291bmQvdXNiL21peGVyX3Nj YXJsZXR0X2dlbjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjUy ZTFkYWQ3N2FmZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3VzYi9taXhlcl9zY2FybGV0dF9n ZW4yLmgKQEAgLTAsMCArMSw3IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MCAqLworI2lmbmRlZiBfX1VTQl9NSVhFUl9TQ0FSTEVUVF9HRU4yX0gKKyNkZWZpbmUgX19VU0Jf TUlYRVJfU0NBUkxFVFRfR0VOMl9ICisKK2ludCBzbmRfc2NhcmxldHRfZ2VuMl9jb250cm9sc19j cmVhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKTsKKworI2VuZGlmIC8qIF9f VVNCX01JWEVSX1NDQVJMRVRUX0dFTjJfSCAqLwpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpBbHNhLWRldmVsIG1haWxpbmcgbGlzdApBbHNhLWRldmVsQGFs c2EtcHJvamVjdC5vcmcKaHR0cHM6Ly9tYWlsbWFuLmFsc2EtcHJvamVjdC5vcmcvbWFpbG1hbi9s aXN0aW5mby9hbHNhLWRldmVsCg==