From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Geoffrey D. Bennett" Subject: [PATCH RFC V2] ALSA: usb-audio: Scarlett Gen 2 mixer interface Date: Mon, 29 Apr 2019 23:26:02 +0930 Message-ID: <20190429135602.GA3872@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 3599AF80641 for ; Mon, 29 Apr 2019 15:56:09 +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 QWRkIG1peGVyIHF1aXJrIGZvciB0aGUgRm9jdXNyaXRlIFNjYXJsZXR0IDE4aTggYW5kIDE4aTIw IEdlbiAyIGF1ZGlvCmludGVyZmFjZXMuIEFsdGhvdWdoIHRoZSBpbnRlcmZhY2VzIGFyZSBVU0Ig Y29tcGxpYW50LCBhZGRpdGlvbmFsCmlucHV0L291dHB1dCBsZXZlbCBjb250cm9scyBhbmQgaGFy ZHdhcmUgcm91dGluZy9taXhpbmcgZnVuY3Rpb25hbGl0eQphcmUgYXZhaWxhYmxlIHVzaW5nIHBy b3ByaWV0YXJ5IFVTQiByZXF1ZXN0cy4KClNpZ25lZC1vZmYtYnk6IEdlb2ZmcmV5IEQuIEJlbm5l dHQgPGdAYjQudnU+Ci0tLQpIaSBhbGwsCgpUaGlzIHBhdGNoIGFkZHMgdGhlIGZvbGxvd2luZyBj b250cm9scyBmb3IgdGhlIFNjYXJsZXR0IDE4aTggYW5kIDE4aTIwCkdlbiAyOgotIE1hc3RlciB2 b2x1bWUga25vYiBpbmRpY2F0b3IgKDE4aTIwIG9ubHkpCi0gVm9sdW1lIGNvbnRyb2xzIGZvciB0 aGUgYW5hbG9ndWUgSFcgb3V0cHV0cwotIEhXL1NXIHZvbHVtZSBzd2l0Y2hlcyBmb3IgdGhlIDEw IGFuYWxvZ3VlIEhXIG91dHB1dHMgKDE4aTIwIG9ubHkpCi0gT3V0cHV0IG11eCAod2hlcmUgdGhl IHNvdW5kIGZvciB0aGUgSFcgb3V0cHV0cyBjb21lcyBmcm9tOyBkZWZhdWx0cwogIHRvIFBDTSBv dXRwdXRzKQotIENhcHR1cmUgbXV4ICh3aGVyZSB0aGUgc291bmQgZm9yIFBDTSByZWNvcmRpbmcg Y29tZXMgZnJvbTsgZGVmYXVsdHMKICB0byBIVyBpbnB1dHMpCi0gTWF0cml4IG11eCAod2hlcmUg dGhlIHNvdW5kIGdvaW5nIGludG8gdGhlIG1peGVyIGNvbWVzIGZyb207IDE4CiAgaW5wdXRzIGRl ZmF1bHQgb2ZmKQotIE1peGVyIG1hdHJpeCAoMTggaW5wdXRzICogMTAgb3V0cHV0cyA9IDE4MCBj b250cm9scykKLSBNdXRlIGFuZCBkaW0gaW5kaWNhdG9ycyAoMThpMjAgb25seSkKLSBMaW5lIExl dmVsL0luc3RydW1lbnQgTGV2ZWwgYW5kIFBhZCBjb250cm9scyAoMThpOCBvbmx5KQotIExldmVs IG1ldGVycwoKQ2hhbmdlcyBzaW5jZSB2MToKLSBBZGQgc3VwcG9ydCBmb3IgdGhlIFNjYXJsZXR0 IDE4aTggR2VuIDIKLSBTYXZlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyB0byBOVlJBTQotIElt cGxlbWVudGVkIGZlZWRiYWNrIGZyb20gVGFrYXNoaSdzIGVtYWlsIDI0L0Fwci8yMDE5Ci0gTW92 ZWQgcHJpdmF0ZSBmaWVsZCBmcm9tIHN0cnVjdCBzbmRfdXNiX2F1ZGlvIHRvIHN0cnVjdAogIHVz Yl9taXhlcl9pbnRlcmZhY2UKLSBBZGRlZCB0aW1lciBhbmQgYnVmZmVyIGZpZWxkcyB0byBzdHJ1 Y3QgdXNiX21peGVyX2ludGVyZmFjZQotIE90aGVyIHNtYWxsIGNvZGUgZml4ZXMvY2xlYW51cHMv aW1wcm92ZW1lbnRzCgpPdXRzdGFuZGluZyBpc3N1ZXMvcXVlc3Rpb25zOgoKLSBBZGRpbmcgZmll bGRzIHRvIHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlIHNlZW1lZCBhIGJldHRlciBwbGFjZQog IHRoYW4gc3RydWN0IHNuZF91c2JfYXVkaW8gYXMgaW4gdmVyc2lvbiAxIG9mIHRoaXMgcGF0Y2gg KEkgdGhpbmsKICB0aGVzZSBuZXcgZmllbGRzIGFyZSB1c2VkIGluIHRoZSBzYW1lIHNvcnQgb2Yg Y29udGV4dCBhcyB0aGUgIlNvdW5kCiAgQmxhc3RlciByZW1vdGUgY29udHJvbCBzdHVmZiIgZmll bGRzLCBhbmQgSSBhbSByZXVzaW5nIHJjX3VyYiBhbmQKICByY19zZXR1cF9wYWNrZXQpLiBJIHdh c24ndCBzdXJlIG9mIHRoZSBuYW1pbmc7IHNob3VsZCB0aGV5IGJlIG5hbWVkCiAgZ2VuZXJpY2Fs bHkgKCJ0aW1lciIsICJwcml2YXRlIikgb3Igc3BlY2lmaWNhbGx5CiAgKCJzY2FybGV0dDJfYnVm ZmVyIik/IFNob3VsZCB0aGUgU291bmQgQmxhc3RlciBSQyBmaWVsZHMgdGhhdCBJJ20KICByZXVz aW5nIGJlIHJlbmFtZWQgdG8gaGF2ZSBnZW5lcmljIG5hbWVzPwoKLSBUaGVyZSBhcmUgc29mdHdh cmUgY29udHJvbGxhYmxlIHBhZHMgb24gdGhlIDE4aTggbGluZS1pbnB1dHMuIEkKICBjYWxsZWQg dGhlIGNvbnRyb2xzICJMaW5lIEluICVkIFBhZCBDYXB0dXJlIFN3aXRjaCIuIFRoZXkgd29yawog IGNvcnJlY3RseSBpbiBhbHNhbWl4ZXIgKHNob3duIGluIHRoZSBjYXB0dXJlIHZpZXcgYXMgZS5n LiAiTGluZSBJbiAxCiAgUGFkIikgYnV0IHRoZSAib24iIHN0YXRlIGlzIGRpc3BsYXllZCBhcyAi TCBSIENBUFRVUkUiIHdoaWNoIGxvb2tzCiAgdW51c3VhbC4gSSBjb3VsZCB1c2UgYW4gRW51bSB3 aXRoIE9mZi9PbiB2YWx1ZXMsIGJ1dCBJIHRob3VnaHQgdGhpcwogIGlzIHdoYXQgIlN3aXRjaCIg aXMgZm9yIChhcyBwZXIgY29udHJvbC1uYW1lcy5yc3QpLiBTaG91bGQgSSBsZWF2ZQogIHRoaXMg YXMtaXMsIG9yIGlzIHRoZXJlIGEgYmV0dGVyIG5hbWUgdGhhdCB3aWxsIG1ha2UgdGhpcyBzaG93 IHVwIGFzCiAgYSByZWd1bGFyIG9uL29mZiBzd2l0Y2g/CgogIGFtaXhlciBjb250ZW50cyBzaG93 czoKCiAgbnVtaWQ9MTUsaWZhY2U9TUlYRVIsbmFtZT0nTGluZSBJbiAxIFBhZCBDYXB0dXJlIFN3 aXRjaCcKICAgIDsgdHlwZT1CT09MRUFOLGFjY2Vzcz1ydy0tLS0tLSx2YWx1ZXM9MQogICAgOiB2 YWx1ZXM9b2ZmCgogIGFtaXhlciBzY29udGVudHMgc2hvd3M6CgogIFNpbXBsZSBtaXhlciBjb250 cm9sICdMaW5lIEluIDEgUGFkJywwCiAgICBDYXBhYmlsaXRpZXM6IGNzd2l0Y2ggY3N3aXRjaC1q b2luZWQKICAgIENhcHR1cmUgY2hhbm5lbHM6IE1vbm8KICAgIE1vbm86IENhcHR1cmUgW29mZl0K ClRoYW5rcywKR2VvZmZyZXkuCgpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL01ha2VmaWxlIGIvc291 bmQvdXNiL01ha2VmaWxlCmluZGV4IGQzMzBmNzRjOTBlNi4uOGNmNzA4MWUxN2NiIDEwMDY0NAot LS0gYS9zb3VuZC91c2IvTWFrZWZpbGUKKysrIGIvc291bmQvdXNiL01ha2VmaWxlCkBAIC0xMSw2 ICsxMSw3IEBAIHNuZC11c2ItYXVkaW8tb2JqcyA6PSAJY2FyZC5vIFwKIAkJCW1peGVyLm8gXAog CQkJbWl4ZXJfcXVpcmtzLm8gXAogCQkJbWl4ZXJfc2NhcmxldHQubyBcCisJCQltaXhlcl9zY2Fy bGV0dF9nZW4yLm8gXAogCQkJbWl4ZXJfdXMxNngwOC5vIFwKIAkJCXBjbS5vIFwKIAkJCXBvd2Vy Lm8gXApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyLmMgYi9zb3VuZC91c2IvbWl4ZXIuYwpp bmRleCBlN2Q0NDFkMGU4MzkuLjhjZDFmYzJmNzU4MCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21p eGVyLmMKKysrIGIvc291bmQvdXNiL21peGVyLmMKQEAgLTM1MjEsNiArMzUyMSw5IEBAIHZvaWQg c25kX3VzYl9taXhlcl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhl cikKIAkJdXNiX2tpbGxfdXJiKG1peGVyLT51cmIpOwogCWlmIChtaXhlci0+cmNfdXJiKQogCQl1 c2Jfa2lsbF91cmIobWl4ZXItPnJjX3VyYik7CisJa2ZyZWUobWl4ZXItPnNjYXJsZXR0Ml9idWZm ZXIpOworCWRlbF90aW1lcl9zeW5jKCZtaXhlci0+dGltZXIpOworCWtmcmVlKG1peGVyLT5wcml2 YXRlKTsKIAltaXhlci0+ZGlzY29ubmVjdGVkID0gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvc291 bmQvdXNiL21peGVyLmggYi9zb3VuZC91c2IvbWl4ZXIuaAppbmRleCAzZDEyYWY4YmYxOTEuLmQw MDlmNmNiNzRiOSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21peGVyLmgKKysrIGIvc291bmQvdXNi L21peGVyLmgKQEAgLTI1LDYgKzI1LDExIEBAIHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlIHsK IAl1OCByY19idWZmZXJbNl07CiAKIAlib29sIGRpc2Nvbm5lY3RlZDsKKworCS8qIFNjYXJsZXR0 IEdlbiAyICovCisJdm9pZCAqc2NhcmxldHQyX2J1ZmZlcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0 aW1lcjsKKwl2b2lkICpwcml2YXRlOwogfTsKIAogI2RlZmluZSBNQVhfQ0hBTk5FTFMJMTYJLyog bWF4IGxvZ2ljYWwgY2hhbm5lbHMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXhlcl9xdWly a3MuYyBiL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYwppbmRleCA4NWFlMGZmMjM4MmEuLmZhYTVl MTQ5ZWYxMCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCisrKyBiL3NvdW5k L3VzYi9taXhlcl9xdWlya3MuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgIm1peGVyLmgi CiAjaW5jbHVkZSAibWl4ZXJfcXVpcmtzLmgiCiAjaW5jbHVkZSAibWl4ZXJfc2NhcmxldHQuaCIK KyNpbmNsdWRlICJtaXhlcl9zY2FybGV0dF9nZW4yLmgiCiAjaW5jbHVkZSAibWl4ZXJfdXMxNngw OC5oIgogI2luY2x1ZGUgImhlbHBlci5oIgogCkBAIC0yMjczLDYgKzIyNzQsMTEgQEAgaW50IHNu ZF91c2JfbWl4ZXJfYXBwbHlfY3JlYXRlX3F1aXJrKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNl ICptaXhlcikKIAkJZXJyID0gc25kX3NjYXJsZXR0X2NvbnRyb2xzX2NyZWF0ZShtaXhlcik7CiAJ CWJyZWFrOwogCisJY2FzZSBVU0JfSUQoMHgxMjM1LCAweDgyMDQpOiAvKiBGb2N1c3JpdGUgU2Nh cmxldHQgMThpOCAybmQgR2VuICovCisJY2FzZSBVU0JfSUQoMHgxMjM1LCAweDgyMDEpOiAvKiBG b2N1c3JpdGUgU2NhcmxldHQgMThpMjAgMm5kIEdlbiAqLworCQllcnIgPSBzbmRfc2NhcmxldHRf Z2VuMl9jb250cm9sc19jcmVhdGUobWl4ZXIpOworCQlicmVhazsKKwogCWNhc2UgVVNCX0lEKDB4 MDQxZSwgMHgzMjNiKTogLyogQ3JlYXRpdmUgU291bmQgQmxhc3RlciBFMSAqLwogCQllcnIgPSBz bmRfc291bmRibGFzdGVyX2UxX3N3aXRjaF9jcmVhdGUobWl4ZXIpOwogCQlicmVhazsKZGlmZiAt LWdpdCBhL3NvdW5kL3VzYi9taXhlcl9zY2FybGV0dF9nZW4yLmMgYi9zb3VuZC91c2IvbWl4ZXJf c2NhcmxldHRfZ2VuMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4u YzE5YTUyMGMwZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL21peGVyX3NjYXJsZXR0 X2dlbjIuYwpAQCAtMCwwICsxLDIwMzIgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wCisvKgorICogICBGb2N1c3JpdGUgU2NhcmxldHQgMThpOC8xOGkyMCBHZW4gMiBEcml2 ZXIgZm9yIEFMU0EKKyAqCisgKiAgIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IGJ5IEdlb2ZmcmV5 IEQuIEJlbm5ldHQgPGcgYXQgYjQudnU+CisgKgorICogICBCYXNlZCBvbiB0aGUgU2NhcmxldHQg KEdlbiAxKSBEcml2ZXIgZm9yIEFMU0E6CisgKgorICogICBDb3B5cmlnaHQgKGMpIDIwMTMgYnkg VG9iaWFzIEhvZmZtYW5uCisgKiAgIENvcHlyaWdodCAoYykgMjAxMyBieSBSb2JpbiBHYXJldXMg PHJvYmluIGF0IGdhcmV1cy5vcmc+CisgKiAgIENvcHlyaWdodCAoYykgMjAwMiBieSBUYWthc2hp IEl3YWkgPHRpd2FpIGF0IHN1c2UuZGU+CisgKiAgIENvcHlyaWdodCAoYykgMjAxNCBieSBDaHJp cyBKIEFyZ2VzIDxjaHJpcy5qLmFyZ2VzIGF0IGNhbm9uaWNhbC5jb20+CisgKgorICogICBNYW55 IGNvZGVzIGJvcnJvd2VkIGZyb20gYXVkaW8uYyBieQorICogICAgIEFsYW4gQ294IChhbGFuIGF0 IGx4b3JndWsudWt1dS5vcmcudWspCisgKiAgICAgVGhvbWFzIFNhaWxlciAoc2FpbGVyIGF0IGlm ZS5lZS5ldGh6LmNoKQorICoKKyAqICAgQ29kZSBjbGVhbnVwOgorICogICBEYXZpZCBIZW5uaW5n c3NvbiA8ZGF2aWQuaGVubmluZ3Nzb24gYXQgY2Fub25pY2FsLmNvbT4KKyAqCisgKiAgIFRoaXMg cHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Ig bW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJp YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhP VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq ICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg U2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorICoKKyAqLworCisvKiBNaXhlciBJbnRlcmZhY2UgZm9yIHRoZSBGb2N1c3JpdGUgU2Nhcmxl dHQgMThpOC8xOGkyMCBHZW4gMiBhdWRpbworICogaW50ZXJmYWNlLiBCYXNlZCBvbiB0aGUgR2Vu IDEgZHJpdmVyIGFuZCByZXdyaXR0ZW4uCisgKi8KKworLyogVGhlIHByb3RvY29sIHdhcyByZXZl cnNlIGVuZ2luZWVyZWQgYnkgbG9va2luZyBhdCB0aGUgY29tbXVuaWNhdGlvbgorICogYmV0d2Vl biBGb2N1c3JpdGUgQ29udHJvbCAyLjMuNCBhbmQgdGhlIEZvY3Vzcml0ZShSKSBTY2FybGV0dCAx OGkyMAorICogKGZpcm13YXJlIDEwODMpIHVzaW5nIHVzYm1vbiBpbiBKdWx5LUF1Z3VzdCAyMDE4 LgorICoKKyAqIFNjYXJsZXR0IDE4aTggc3VwcG9ydCBhZGRlZCBpbiBBcHJpbCAyMDE5LgorICoK KyAqIFRoaXMgQUxTQSBtaXhlciBnaXZlcyBhY2Nlc3MgdG86CisgKiAgLSBpbnB1dCwgb3V0cHV0 LCBtaXhlci1tYXRyaXggbXV4ZXMKKyAqICAtIDE4eDEwIG1peGVyLW1hdHJpeCBnYWluIHN0YWdl cworICogIC0gZ2Fpbi92b2x1bWUgY29udHJvbHMKKyAqICAtIGxldmVsIG1ldGVycworICogIC0g bGluZS9pbnN0IGxldmVsIGFuZCBwYWQgY29udHJvbHMKKyAqCisgKiA8ZGl0YWE+CisgKiAgICAv LS0tLS0tLS0tLS0tLS1cICAgIDE4Y2huICAgICAgICAgICAgMjBjaG4gICAgIC8tLS0tLS0tLS0t LS0tLVwKKyAqICAgIHwgSGFyZHdhcmUgIGluICstLSstLS0tLS1cICAgIC8tLS0tLS0tLS0tLS0t Ky0tKyBBTFNBIFBDTSBvdXQgfAorICogICAgXC0tLS0tLS0tLS0tLS0tLyAgfCAgICAgIHwgICAg fCAgICAgICAgICAgICB8ICBcLS0tLS0tLS0tLS0tLS0vCisgKiAgICAgICAgICAgICAgICAgICAg ICB8ICAgICAgfCAgICB8ICAgIC8tLS0tLVwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwg ICAgICB8ICAgIHwgICAgfCAgICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAg IHYgICAgdiAgICB2ICAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgKy0tLS0t LS0tLS0tLS0tLSsgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgXCBNYXRyaXgg IE11eCAvICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgKy0tLS0tKy0tLS0t KyAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAg IHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwxOGNobiAgICAgfCAg fAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8ICB8Cisg KiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAxMGNobnwgIHwKKyAqICAg ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHYgICAgICAgICAgfCAgfAorICogICAgICAg ICAgICAgICAgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tLSsgICB8ICB8CisgKiAgICAgICAgICAg ICAgICAgICAgICB8ICAgICB8IE1peGVyICAgICAgfCAgIHwgIHwKKyAqICAgICAgICAgICAgICAg ICAgICAgIHwgICAgIHwgICAgIE1hdHJpeCB8ICAgfCAgfAorICogICAgICAgICAgICAgICAgICAg ICAgfCAgICAgfCAgICAgICAgICAgIHwgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8 ICAgICB8IDE4eDEwIEdhaW4gfCAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAg IHwgICBzdGFnZXMgICB8ICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgKy0t LS0tKy0tLS0tLSsgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8 ICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwxOGNobiAgICAgIHwxMGNo biAgICAgfCAgfDIwY2huCisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAg ICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICstLS0tLS0t LS0tLyAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAg ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB2ICAgICAgICAgICB2ICAgICAgICAgICAgIHYK KyAqICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PQorICog ICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICArLS3igJQtLS0tLS0tLS0tLS0r CisgKiAgICAgICAgICAgICAgICBcIE91dHB1dCAgTXV4IC8gICAgICAgICBcIENhcHR1cmUgTXV4 IC8KKyAqICAgICAgICAgICAgICAgICArLS0tKy0tLSstLS0rICAgICAgICAgICArLS0tLS0rLS0t LS0rCisgKiAgICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICAgICAgICAgICAgICAgICAgfAor ICogICAgICAgICAgICAgICAgMTBjaG58ICAgfCAgICAgICAgICAgICAgICAgICAgIHwxOGNobgor ICogICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAv LS0tLS0tLS0tLS0tLS1cICAgfCAgIHwgICAgICAgICAgICAgICAgICAgICB8ICAgLy0tLS0tLS0t LS0tLS0tXAorICogIHwgUy9QRElGLCBBREFUIHw8LS0vICAgfDEwY2huICAgICAgICAgICAgICAg IFwtLT58IEFMU0EgUENNIGluICB8CisgKiAgfCBIYXJkd2FyZSBvdXQgfCAgICAgICB8ICAgICAg ICAgICAgICAgICAgICAgICAgIFwtLS0tLS0tLS0tLS0tLS8KKyAqICBcLS0tLS0tLS0tLS0tLS0v ICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHYKKyAqICAgICAgICAgICAgICAg ICAgKy0tLS0tLS0tLS0tLS0rICAgIHN3aXRjaCBwZXIgY2hhbm5lbCB0byBzZWxlY3QKKyAqICAg ICAgICAgICAgICAgICAgfCBNYXN0ZXIgR2FpbiB8PC0tIGZyb250IHBhbmVsIHZvbHVtZSBrbm9i IG9yCisgKiAgICAgICAgICAgICAgICAgICstLS0tLS0rLS0tLS0tKyAgICBpbmRpdmlkdWFsIHNv ZnR3YXJlIGdhaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICgxOGky MCBvbmx5KQorICogICAgICAgICAgICAgICAgICAgICAgICAgfDEwY2huCisgKiAgLy0tLS0tLS0t LS0tLS0tXCAgICAgICB8CisgKiAgfCBBbmFsb2d1ZSAgICAgfDwtLS0tLS0vCisgKiAgfCBIYXJk d2FyZSBvdXQgfAorICogIFwtLS0tLS0tLS0tLS0tLS8KKyAqIDwvZGl0YWE+CisgKgorICovCisK KyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNs dWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRl ICJ1c2JhdWRpby5oIgorI2luY2x1ZGUgIm1peGVyLmgiCisjaW5jbHVkZSAiaGVscGVyLmgiCisK KyNpbmNsdWRlICJtaXhlcl9zY2FybGV0dF9nZW4yLmgiCisKKy8qIHNvbWUgZ3VpIG1peGVycyBj YW4ndCBoYW5kbGUgbmVnYXRpdmUgY3RsIHZhbHVlcyAqLworI2RlZmluZSBTQ0FSTEVUVF9WT0xV TUVfQklBUyAxMjcKKworLyogbWl4ZXIgcmFuZ2UgZnJvbSAtODBkQiB0byArNmRCIGluIDAuNWRC IHN0ZXBzICovCisjZGVmaW5lIFNDQVJMRVRUX01JWEVSX01JTl9EQiAtODAKKyNkZWZpbmUgU0NB UkxFVFRfTUlYRVJfQklBUyAoLVNDQVJMRVRUX01JWEVSX01JTl9EQiAqIDIpCisjZGVmaW5lIFND QVJMRVRUX01JWEVSX01BWF9EQiA2CisjZGVmaW5lIFNDQVJMRVRUX01JWEVSX01BWF9WQUxVRSBc CisJKChTQ0FSTEVUVF9NSVhFUl9NQVhfREIgLSBTQ0FSTEVUVF9NSVhFUl9NSU5fREIpICogMikK KworLyogbWFwIGZyb20gKGRCICsgODApICogMiB0byBtaXhlciB2YWx1ZQorICogZm9yIGRCIGlu IDAgLi4gMTcyOiBpbnQoODE5MiAqIHBvdygxMCwgKChkQiAtIDE2MCkgLyAyIC8gMjApKSkKKyAq Lworc3RhdGljIGNvbnN0IHUxNiBzY2FybGV0dDJfbWl4ZXJfdmFsdWVzWzE3M10gPSB7CisJMCwg MCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwg MiwKKwkyLCAyLCAzLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA2LCA2LCA2LCA3 LCA3LCA4LCA4LAorCTksIDksIDEwLCAxMCwgMTEsIDEyLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3 LCAxOCwgMTksIDIwLCAyMSwKKwkyMywgMjQsIDI1LCAyNywgMjksIDMwLCAzMiwgMzQsIDM2LCAz OCwgNDEsIDQzLCA0NiwgNDgsIDUxLAorCTU0LCA1NywgNjEsIDY1LCA2OCwgNzMsIDc3LCA4MSwg ODYsIDkxLCA5NywgMTAzLCAxMDksIDExNSwKKwkxMjIsIDEyOSwgMTM3LCAxNDUsIDE1NCwgMTYz LCAxNzMsIDE4MywgMTk0LCAyMDUsIDIxNywgMjMwLAorCTI0NCwgMjU5LCAyNzQsIDI5MCwgMzA3 LCAzMjYsIDM0NSwgMzY1LCAzODcsIDQxMCwgNDM0LCA0NjAsCisJNDg3LCA1MTYsIDU0NywgNTc5 LCA2MTQsIDY1MCwgNjg5LCA3MzAsIDc3MywgODE5LCA4NjcsIDkxOSwKKwk5NzMsIDEwMzEsIDEw OTIsIDExNTcsIDEyMjUsIDEyOTgsIDEzNzUsIDE0NTYsIDE1NDMsIDE2MzQsCisJMTczMSwgMTgz MywgMTk0MiwgMjA1NywgMjE3OSwgMjMwOCwgMjQ0NSwgMjU5MCwgMjc0NCwgMjkwNiwKKwkzMDc4 LCAzMjYxLCAzNDU0LCAzNjU5LCAzODc2LCA0MTA1LCA0MzQ5LCA0NjA2LCA0ODc5LCA1MTY4LAor CTU0NzUsIDU3OTksIDYxNDMsIDY1MDcsIDY4OTIsIDczMDEsIDc3MzMsIDgxOTIsIDg2NzcsIDkx OTEsCisJOTczNiwgMTAzMTMsIDEwOTI0LCAxMTU3MSwgMTIyNTcsIDEyOTgzLCAxMzc1MiwgMTQ1 NjcsIDE1NDMwLAorCTE2MzQ1Cit9OworCisvKiBNYXhpbXVtIG51bWJlciBvZiBhbmFsb2d1ZSBv dXRwdXRzICovCisjZGVmaW5lIFNDQVJMRVRUMl9BTkFMT0dVRV9NQVggMTAKKworLyogTWF4aW11 bSBudW1iZXIgb2YgbGV2ZWwgYW5kIHBhZCBzd2l0Y2hlcyAqLworI2RlZmluZSBTQ0FSTEVUVDJf TEVWRUxfU1dJVENIX01BWCAyCisjZGVmaW5lIFNDQVJMRVRUMl9QQURfU1dJVENIX01BWCA0CisK Ky8qIE1heGltdW0gbnVtYmVyIG9mIGlucHV0cyB0byB0aGUgbWl4ZXIgKi8KKyNkZWZpbmUgU0NB UkxFVFQyX0lOUFVUX01JWF9NQVggMTgKKworLyogTWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0cyBm cm9tIHRoZSBtaXhlciAqLworI2RlZmluZSBTQ0FSTEVUVDJfT1VUUFVUX01JWF9NQVggMTAKKwor LyogTWF4aW11bSBzaXplIG9mIHRoZSBkYXRhIGluIHRoZSBVU0IgbXV4IGFzc2lnbm1lbnQgbWVz c2FnZToKKyAqIDE4IGlucHV0cywgMjAgb3V0cHV0cywgMTggbWF0cml4IGlucHV0cywgOCBzcGFy ZQorICovCisjZGVmaW5lIFNDQVJMRVRUMl9NVVhfTUFYIDY0CisKKy8qIE51bWJlciBvZiBtZXRl cnM6CisgKiAxOCBpbnB1dHMsIDIwIG91dHB1dHMsIDE4IG1hdHJpeCBpbnB1dHMKKyAqLworI2Rl ZmluZSBTQ0FSTEVUVDJfTlVNX01FVEVSUyA1NgorCisvKiBIYXJkd2FyZSBwb3J0IHR5cGVzOgor ICogLSBOb25lIChubyBpbnB1dCB0byBtdXgpCisgKiAtIEFuYWxvZ3VlIEkvTworICogLSBTL1BE SUYgSS9PCisgKiAtIEFEQVQgSS9PCisgKiAtIE1peGVyIEkvTworICogLSBQQ00gSS9PCisgKi8K K2VudW0geworCVNDQVJMRVRUMl9QT1JUX1RZUEVfTk9ORSA9IDAsCisJU0NBUkxFVFQyX1BPUlRf VFlQRV9BTkFMT0dVRSA9IDEsCisJU0NBUkxFVFQyX1BPUlRfVFlQRV9TUERJRiA9IDIsCisJU0NB UkxFVFQyX1BPUlRfVFlQRV9BREFUID0gMywKKwlTQ0FSTEVUVDJfUE9SVF9UWVBFX01JWCA9IDQs CisJU0NBUkxFVFQyX1BPUlRfVFlQRV9QQ00gPSA1LAorCVNDQVJMRVRUMl9QT1JUX1RZUEVfQ09V TlQgPSA2LAorfTsKKworLyogQ291bnQgb2YgdG90YWwgSS9PIGFuZCBudW1iZXIgYXZhaWxhYmxl IGF0IGVhY2ggc2FtcGxlIHJhdGUgKi8KK2VudW0geworCVNDQVJMRVRUMl9QT1JUX0lOID0gMCwK KwlTQ0FSTEVUVDJfUE9SVF9PVVQgPSAxLAorCVNDQVJMRVRUMl9QT1JUX09VVF80NCA9IDIsCisJ U0NBUkxFVFQyX1BPUlRfT1VUXzg4ID0gMywKKwlTQ0FSTEVUVDJfUE9SVF9PVVRfMTc2ID0gNCwK KwlTQ0FSTEVUVDJfUE9SVF9ESVJFQ1RJT05TID0gNSwKK307CisKKy8qIEhhcmR3YXJlIGJ1dHRv bnMgb24gdGhlIDE4aTIwICovCisjZGVmaW5lIFNDQVJMRVRUMl9CVVRUT05fTUFYIDIKKworc3Rh dGljIGNvbnN0IGNoYXIgKmNvbnN0IHNjYXJsZXR0Ml9idXR0b25fbmFtZXNbU0NBUkxFVFQyX0JV VFRPTl9NQVhdID0geworCSJNdXRlIiwgIkRpbSIKK307CisKKy8qIERlc2NyaXB0aW9uIG9mIGVh Y2ggaGFyZHdhcmUgcG9ydCB0eXBlOgorICogLSBpZDogaGFyZHdhcmUgSUQgZm9yIHRoaXMgcG9y dCB0eXBlCisgKiAtIG51bTogbnVtYmVyIG9mIHNvdXJjZXMvZGVzdGluYXRpb25zIG9mIHRoaXMg cG9ydCB0eXBlCisgKiAtIHNyY19kZXNjcjogcHJpbnRmIGZvcm1hdCBzdHJpbmcgZm9yIG11eCBp bnB1dCBzZWxlY3Rpb25zCisgKiAtIHNyY19udW1fb2Zmc2V0OiBhZGRlZCB0byBjaGFubmVsIG51 bWJlciBmb3IgdGhlIGZwcmludGYKKyAqIC0gZHN0X2Rlc2NyOiBwcmludGYgZm9ybWF0IHN0cmlu ZyBmb3IgbWl4ZXIgY29udHJvbHMKKyAqLworc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyB7CisJdTE2 IGlkOworCWludCBudW1bU0NBUkxFVFQyX1BPUlRfRElSRUNUSU9OU107CisJY29uc3QgY2hhciAq IGNvbnN0IHNyY19kZXNjcjsKKwlpbnQgc3JjX251bV9vZmZzZXQ7CisJY29uc3QgY2hhciAqIGNv bnN0IGRzdF9kZXNjcjsKK307CisKK3N0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8geworCXU4 IGxpbmVfb3V0X2h3X3ZvbDsgLyogbGluZSBvdXQgaHcgdm9sdW1lIGlzIHN3IGNvbnRyb2xsZWQg Ki8KKwl1OCBidXR0b25fY291bnQ7IC8qIG51bWJlciBvZiBidXR0b25zICovCisJdTggbGV2ZWxf aW5wdXRfY291bnQ7IC8qIGlucHV0cyB3aXRoIGxldmVsIHNlbGVjdGFibGUgKi8KKwl1OCBwYWRf aW5wdXRfY291bnQ7IC8qIGlucHV0cyB3aXRoIHBhZCBzZWxlY3RhYmxlICovCisJY29uc3QgY2hh ciAqIGNvbnN0IGxpbmVfb3V0X2Rlc2Nyc1tTQ0FSTEVUVDJfQU5BTE9HVUVfTUFYXTsKKwlzdHJ1 Y3Qgc2NhcmxldHQyX3BvcnRzIHBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfQ09VTlRdOworfTsK Kworc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhIHsKKwlzdHJ1Y3QgbXV0ZXggdXNiX211dGV4 OyAvKiBwcmV2ZW50IHNlbmRpbmcgY29uY3VycmVudCBVU0IgcmVxdWVzdHMgKi8KKwlzdHJ1Y3Qg bXV0ZXggZGF0YV9tdXRleDsgLyogbG9jayBhY2Nlc3MgdG8gdGhpcyBkYXRhICovCisJY29uc3Qg c3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyAqaW5mbzsKKwlpbnQgbnVtX211eF9zcmNzOwor CXUxNiBzY2FybGV0dDJfc2VxOworCXU4IHZvbF91cGRhdGVkOworCXU4IG1hc3Rlcl92b2w7CisJ dTggdm9sW1NDQVJMRVRUMl9BTkFMT0dVRV9NQVhdOworCXU4IHZvbF9zd19od19zd2l0Y2hbU0NB UkxFVFQyX0FOQUxPR1VFX01BWF07CisJdTggbGV2ZWxfc3dpdGNoW1NDQVJMRVRUMl9MRVZFTF9T V0lUQ0hfTUFYXTsKKwl1OCBwYWRfc3dpdGNoW1NDQVJMRVRUMl9QQURfU1dJVENIX01BWF07CisJ dTggYnV0dG9uc1tTQ0FSTEVUVDJfQlVUVE9OX01BWF07CisJc3RydWN0IHNuZF9rY29udHJvbCAq bWFzdGVyX3ZvbF9jdGw7CisJc3RydWN0IHNuZF9rY29udHJvbCAqdm9sX2N0bHNbU0NBUkxFVFQy X0FOQUxPR1VFX01BWF07CisJc3RydWN0IHNuZF9rY29udHJvbCAqYnV0dG9uX2N0bHNbU0NBUkxF VFQyX0FOQUxPR1VFX01BWF07CisJdTggbXV4W1NDQVJMRVRUMl9NVVhfTUFYXTsKKwl1OCBtaXhb U0NBUkxFVFQyX0lOUFVUX01JWF9NQVggKiBTQ0FSTEVUVDJfT1VUUFVUX01JWF9NQVhdOworfTsK Kworc3RydWN0IHNjYXJsZXR0Ml91c2Jfdm9sdW1lX3N0YXR1cyB7CisJdTggYnV0dG9uc1tTQ0FS TEVUVDJfQlVUVE9OX01BWF07IC8qIG11dGUgJiBkaW0gYnV0dG9ucyAqLworCXU4IHBhZDE7CisJ czE2IHN3X3ZvbFsxMF07IC8qIHNvZnR3YXJlIHZvbHVtZSBzZXR0aW5nICovCisJczE2IGh3X3Zv bFsxMF07IC8qIGFjdHVhbCB2b2x1bWUgb2Ygb3V0cHV0IGluYy4gZGltICgtMThkQikgKi8KKwl1 OCBwYWQyWzEwXTsKKwl1OCBzd19od19zd2l0Y2hbMTBdOyAvKiBzdyAoMCkgb3IgaHcgKDEpIGNv bnRyb2xsZWQgKi8KKwl1OCBwYWQzWzZdOworCXMxNiBtYXN0ZXJfdm9sOyAvKiBmcm9udCBwYW5l bCB2b2x1bWUga25vYiAqLworfSBfX3BhY2tlZDsKKworLyoqKiBNb2RlbC1zcGVjaWZpYyBkYXRh ICoqKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gczE4aThf Z2VuMl9pbmZvID0geworCS8qIFRoZSBmaXJzdCB0d28gYW5hbG9ndWUgaW5wdXRzIGNhbiBiZSBz d2l0Y2hlZCBiZXR3ZWVuIGxpbmUKKwkgKiBhbmQgaW5zdHJ1bWVudCBsZXZlbHMuCisJICovCisJ LmxldmVsX2lucHV0X2NvdW50ID0gMiwKKworCS8qIFRoZSBmaXJzdCBmb3VyIGFuYWxvZ3VlIGlu cHV0cyBoYXZlIGFuIG9wdGlvbmFsIHBhZC4gKi8KKwkucGFkX2lucHV0X2NvdW50ID0gNCwKKwor CS5saW5lX291dF9kZXNjcnMgPSB7CisJCSJNb25pdG9yIEwiLAorCQkiTW9uaXRvciBSIiwKKwkJ IkhlYWRwaG9uZXMgMSBMIiwKKwkJIkhlYWRwaG9uZXMgMSBSIiwKKwkJIkhlYWRwaG9uZXMgMiBM IiwKKwkJIkhlYWRwaG9uZXMgMiBSIiwKKwl9LAorCisJLnBvcnRzID0geworCQl7CisJCQkuaWQg PSAweDAwMCwKKwkJCS5udW0gPSB7IDEsIDAsIDgsIDgsIDQgfSwKKwkJCS5zcmNfZGVzY3IgPSAi T2ZmIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IDB4MDgw LAorCQkJLm51bSA9IHsgOCwgNiwgNiwgNiwgNiB9LAorCQkJLnNyY19kZXNjciA9ICJBbmFsb2d1 ZSAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJBbmFsb2d1 ZSBPdXRwdXQgJTAyZCBQbGF5YmFjayIKKwkJfSwKKwkJeworCQkJLyogUy9QRElGIG91dHB1dHMg YXJlbid0IGF2YWlsYWJsZSBhdCAxOTJLSHoKKwkJCSAqIGJ1dCBhcmUgaW5jbHVkZWQgaW4gdGhl IFVTQiBtdXggSS9PCisJCQkgKiBhc3NpZ25tZW50IG1lc3NhZ2UgYW55d2F5CisJCQkgKi8KKwkJ CS5pZCA9IDB4MTgwLAorCQkJLm51bSA9IHsgMiwgMiwgMiwgMiwgMiB9LAorCQkJLnNyY19kZXNj ciA9ICJTL1BESUYgJWQiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gMSwKKwkJCS5kc3RfZGVzY3Ig PSAiUy9QRElGIE91dHB1dCAlZCBQbGF5YmFjayIKKwkJfSwKKwkJeworCQkJLmlkID0gMHgyMDAs CisJCQkubnVtID0geyA4LCAwLCAwLCAwLCAwIH0sCisJCQkuc3JjX2Rlc2NyID0gIkFEQVQgJWQi LAorCQkJLnNyY19udW1fb2Zmc2V0ID0gMSwKKwkJfSwKKwkJeworCQkJLmlkID0gMHgzMDAsCisJ CQkubnVtID0geyAxMCwgMTgsIDE4LCAxOCwgMTggfSwKKwkJCS5zcmNfZGVzY3IgPSAiTWl4ICVj IiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDY1LAorCQkJLmRzdF9kZXNjciA9ICJNaXhlciBJbnB1 dCAlMDJkIENhcHR1cmUiCisJCX0sCisJCXsKKwkJCS5pZCA9IDB4NjAwLAorCQkJLm51bSA9IHsg MjAsIDE4LCAxOCwgMTQsIDEwIH0sCisJCQkuc3JjX2Rlc2NyID0gIlBDTSAlZCIsCisJCQkuc3Jj X251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJQQ00gJTAyZCBDYXB0dXJlIgorCQl9 LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyBz MThpMjBfZ2VuMl9pbmZvID0geworCS8qIFRoZSBhbmFsb2d1ZSBsaW5lIG91dHB1dHMgb24gdGhl IDE4aTIwIGNhbiBiZSBzd2l0Y2hlZAorCSAqIGJldHdlZW4gc29mdHdhcmUgYW5kIGhhcmR3YXJl IHZvbHVtZSBjb250cm9sCisJICovCisJLmxpbmVfb3V0X2h3X3ZvbCA9IDEsCisKKwkvKiBNdXRl IGFuZCBkaW0gYnV0dG9ucyAqLworCS5idXR0b25fY291bnQgPSAyLAorCisJLmxpbmVfb3V0X2Rl c2NycyA9IHsKKwkJIk1vbml0b3IgTCIsCisJCSJNb25pdG9yIFIiLAorCQlOVUxMLAorCQlOVUxM LAorCQlOVUxMLAorCQlOVUxMLAorCQkiSGVhZHBob25lcyAxIEwiLAorCQkiSGVhZHBob25lcyAx IFIiLAorCQkiSGVhZHBob25lcyAyIEwiLAorCQkiSGVhZHBob25lcyAyIFIiLAorCX0sCisKKwku cG9ydHMgPSB7CisJCXsKKwkJCS5pZCA9IDB4MDAwLAorCQkJLm51bSA9IHsgMSwgMCwgOCwgOCwg NiB9LAorCQkJLnNyY19kZXNjciA9ICJPZmYiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gMCwKKwkJ fSwKKwkJeworCQkJLmlkID0gMHgwODAsCisJCQkubnVtID0geyA4LCAxMCwgMTAsIDEwLCAxMCB9 LAorCQkJLnNyY19kZXNjciA9ICJBbmFsb2d1ZSAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAx LAorCQkJLmRzdF9kZXNjciA9ICJBbmFsb2d1ZSBPdXRwdXQgJTAyZCBQbGF5YmFjayIKKwkJfSwK KwkJeworCQkJLyogUy9QRElGIG91dHB1dHMgYXJlbid0IGF2YWlsYWJsZSBhdCAxOTJLSHoKKwkJ CSAqIGJ1dCBhcmUgaW5jbHVkZWQgaW4gdGhlIFVTQiBtdXggSS9PCisJCQkgKiBhc3NpZ25tZW50 IG1lc3NhZ2UgYW55d2F5CisJCQkgKi8KKwkJCS5pZCA9IDB4MTgwLAorCQkJLm51bSA9IHsgMiwg MiwgMiwgMiwgMiB9LAorCQkJLnNyY19kZXNjciA9ICJTL1BESUYgJWQiLAorCQkJLnNyY19udW1f b2Zmc2V0ID0gMSwKKwkJCS5kc3RfZGVzY3IgPSAiUy9QRElGIE91dHB1dCAlZCBQbGF5YmFjayIK KwkJfSwKKwkJeworCQkJLmlkID0gMHgyMDAsCisJCQkubnVtID0geyA4LCA4LCA4LCA0LCAwIH0s CisJCQkuc3JjX2Rlc2NyID0gIkFEQVQgJWQiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gMSwKKwkJ CS5kc3RfZGVzY3IgPSAiQURBVCBPdXRwdXQgJWQgUGxheWJhY2siCisJCX0sCisJCXsKKwkJCS5p ZCA9IDB4MzAwLAorCQkJLm51bSA9IHsgMTAsIDE4LCAxOCwgMTgsIDE4IH0sCisJCQkuc3JjX2Rl c2NyID0gIk1peCAlYyIsCisJCQkuc3JjX251bV9vZmZzZXQgPSA2NSwKKwkJCS5kc3RfZGVzY3Ig PSAiTWl4ZXIgSW5wdXQgJTAyZCBDYXB0dXJlIgorCQl9LAorCQl7CisJCQkuaWQgPSAweDYwMCwK KwkJCS5udW0gPSB7IDIwLCAxOCwgMTgsIDE0LCAxMCB9LAorCQkJLnNyY19kZXNjciA9ICJQQ00g JWQiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gMSwKKwkJCS5kc3RfZGVzY3IgPSAiUENNICUwMmQg Q2FwdHVyZSIKKwkJfSwKKwl9LAorfTsKKworLyogZ2V0IHRoZSBzdGFydGluZyBwb3J0IGluZGV4 IG51bWJlciBmb3IgYSBnaXZlbiBwb3J0IHR5cGUvZGlyZWN0aW9uICovCitzdGF0aWMgaW50IHNj YXJsZXR0Ml9nZXRfcG9ydF9zdGFydF9udW0oY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAq cG9ydHMsCisJCQkJCWludCBkaXJlY3Rpb24sIGludCBwb3J0X3R5cGUpCit7CisJaW50IGksIG51 bSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydF90eXBlOyBpKyspCisJCW51bSArPSBwb3J0 c1tpXS5udW1bZGlyZWN0aW9uXTsKKworCXJldHVybiBudW07Cit9CisKKy8qKiogVVNCIEludGVy YWN0aW9ucyAqKiovCisKKy8qIFZlbmRvci1TcGVjaWZpYyBJbnRlcmZhY2UsIEVuZHBvaW50LCBN YXhQYWNrZXRTaXplLCBJbnRlcnZhbCAqLworI2RlZmluZSBTQ0FSTEVUVDJfVVNCX1ZFTkRPUl9T UEVDSUZJQ19JTlRFUkZBQ0UgNQorI2RlZmluZSBTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9FTkRQ T0lOVCA0CisjZGVmaW5lIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX01BWF9EQVRBIDY0CisjZGVm aW5lIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX0lOVEVSVkFMIDMKKworLyogSW50ZXJydXB0IGZs YWdzIGZvciB2b2x1bWUgYW5kIG11dGUvZGltIGJ1dHRvbiBjaGFuZ2VzICovCisjZGVmaW5lIFND QVJMRVRUMl9VU0JfSU5URVJSVVBUX1ZPTF9DSEFOR0UgMHg0MDAwMDAKKyNkZWZpbmUgU0NBUkxF VFQyX1VTQl9JTlRFUlJVUFRfQlVUVE9OX0NIQU5HRSAweDIwMDAwMAorCisvKiBDb21tYW5kcyBm b3Igc2VuZGluZy9yZWNlaXZpbmcgcmVxdWVzdHMvcmVzcG9uc2VzICovCisjZGVmaW5lIFNDQVJM RVRUMl9VU0JfVkVORE9SX1NQRUNJRklDX0NNRF9SRVEgMgorI2RlZmluZSBTQ0FSTEVUVDJfVVNC X1ZFTkRPUl9TUEVDSUZJQ19DTURfUkVTUCAzCisKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9JTklU X1NFUSAweDAwMDAwMDAwCisjZGVmaW5lIFNDQVJMRVRUMl9VU0JfR0VUX01FVEVSX0xFVkVMUyAw eDAwMDAxMDAxCisjZGVmaW5lIFNDQVJMRVRUMl9VU0JfU0VUX01JWCAweDAwMDAyMDAyCisjZGVm aW5lIFNDQVJMRVRUMl9VU0JfU0VUX01VWCAweDAwMDAzMDAyCisjZGVmaW5lIFNDQVJMRVRUMl9V U0JfR0VUX0RBVEEgMHgwMDgwMDAwMAorI2RlZmluZSBTQ0FSTEVUVDJfVVNCX1NFVF9EQVRBIDB4 MDA4MDAwMDEKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9EQVRBX0NNRCAweDAwODAwMDAyCisjZGVm aW5lIFNDQVJMRVRUMl9VU0JfQ09ORklHX1NBVkUgNgorCisjZGVmaW5lIFNDQVJMRVRUMl9VU0Jf Vk9MVU1FX1NUQVRVU19PRkZTRVQgMHgzMQorI2RlZmluZSBTQ0FSTEVUVDJfVVNCX01FVEVSX0xF VkVMU19HRVRfTUFHSUMgMQorCisvKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdGhhdCBjYW4g YmUgcmVhZCBhbmQgd3JpdHRlbiAqLworZW51bSB7CisJU0NBUkxFVFQyX0NPTkZJR19MSU5FX09V VF9WT0xVTUUgPSAwLAorCVNDQVJMRVRUMl9DT05GSUdfU1dfSFdfU1dJVENIID0gMSwKKwlTQ0FS TEVUVDJfQ09ORklHX0xFVkVMX1NXSVRDSCA9IDIsCisJU0NBUkxFVFQyX0NPTkZJR19QQURfU1dJ VENIID0gMywKKwlTQ0FSTEVUVDJfQ09ORklHX0NPVU5UID0gNAorfTsKKworLyogTG9jYXRpb24s IHNpemUsIGFuZCBhY3RpdmF0aW9uIGNvbW1hbmQgbnVtYmVyIGZvciB0aGUgY29uZmlndXJhdGlv bgorICogcGFyYW1ldGVycworICovCitzdHJ1Y3Qgc2NhcmxldHQyX2NvbmZpZyB7CisJdTggb2Zm c2V0OworCXU4IHNpemU7CisJdTggYWN0aXZhdGU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0 IHNjYXJsZXR0Ml9jb25maWcKKwkJc2NhcmxldHQyX2NvbmZpZ19pdGVtc1tTQ0FSTEVUVDJfQ09O RklHX0NPVU5UXSA9IHsKKwkvKiBMaW5lIE91dCBWb2x1bWUgKi8KKwl7CisJCS5vZmZzZXQgPSAw eDM0LAorCQkuc2l6ZSA9IDIsCisJCS5hY3RpdmF0ZSA9IDEKKwl9LAorCisJLyogU1cvSFcgVm9s dW1lIFN3aXRjaCAqLworCXsKKwkJLm9mZnNldCA9IDB4NjYsCisJCS5zaXplID0gMSwKKwkJLmFj dGl2YXRlID0gMworCX0sCisKKwkvKiBMZXZlbCBTd2l0Y2ggKi8KKwl7CisJCS5vZmZzZXQgPSAw eDdjLAorCQkuc2l6ZSA9IDEsCisJCS5hY3RpdmF0ZSA9IDcKKwl9LAorCisJLyogUGFkIFN3aXRj aCAqLworCXsKKwkJLm9mZnNldCA9IDB4ODQsCisJCS5zaXplID0gMSwKKwkJLmFjdGl2YXRlID0g OAorCX0KK307CisKKy8qIHByb3ByaWV0YXJ5IHJlcXVlc3QvcmVzcG9uc2UgZm9ybWF0ICovCitz dHJ1Y3Qgc2NhcmxldHQyX3VzYl9wYWNrZXQgeworCXUzMiBjbWQ7CisJdTE2IHNpemU7CisJdTE2 IHNlcTsKKwl1MzIgZXJyb3I7CisJdTMyIHBhZDsKKwl1OCBkYXRhW107Cit9OworCisjZGVmaW5l IFNDQVJMRVRUMl9VU0JfUEFDS0VUX0xFTiAoc2l6ZW9mKHN0cnVjdCBzY2FybGV0dDJfdXNiX3Bh Y2tldCkpCisKK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9maWxsX3JlcXVlc3RfaGVhZGVyKHN0cnVj dCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSwKKwkJCQkJICBzdHJ1Y3Qgc2NhcmxldHQy X3VzYl9wYWNrZXQgKnJlcSwKKwkJCQkJICB1MzIgY21kLCB1MTYgcmVxX3NpemUpCit7CisJLyog c2VxdWVuY2UgbXVzdCBnbyB1cCBieSAxIGZvciBlYWNoIHJlcXVlc3QgKi8KKwl1MTYgc2VxID0g cHJpdmF0ZS0+c2NhcmxldHQyX3NlcSsrOworCisJcmVxLT5jbWQgPSBjcHVfdG9fbGUzMihjbWQp OworCXJlcS0+c2l6ZSA9IGNwdV90b19sZTE2KHJlcV9zaXplKTsKKwlyZXEtPnNlcSA9IGNwdV90 b19sZTE2KHNlcSk7CisJcmVxLT5lcnJvciA9IDA7CisJcmVxLT5wYWQgPSAwOworfQorCisvKiBT ZW5kIGEgcHJvcHJpZXRhcnkgZm9ybWF0IHJlcXVlc3QgdG8gdGhlIFNjYXJsZXR0IGludGVyZmFj ZSAqLworc3RhdGljIGludCBzY2FybGV0dDJfdXNiKAorCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJm YWNlICptaXhlciwgdTMyIGNtZCwKKwl2b2lkICpyZXFfZGF0YSwgdTE2IHJlcV9zaXplLCB2b2lk ICpyZXNwX2RhdGEsIHUxNiByZXNwX3NpemUpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9k YXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGU7CisKKwl1MTYgcmVxX2J1Zl9zaXplID0gc2l6 ZW9mKHN0cnVjdCBzY2FybGV0dDJfdXNiX3BhY2tldCkgKyByZXFfc2l6ZTsKKwl1MTYgcmVzcF9i dWZfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NhcmxldHQyX3VzYl9wYWNrZXQpICsgcmVzcF9zaXpl OworCisJc3RydWN0IHNjYXJsZXR0Ml91c2JfcGFja2V0ICpyZXEgPSAwLCAqcmVzcCA9IDA7CisK KwlpbnQgZXJyID0gMDsKKworCW11dGV4X2xvY2soJnByaXZhdGUtPnVzYl9tdXRleCk7CisKKwkv KiBidWlsZCByZXF1ZXN0IG1lc3NhZ2UgYW5kIHNlbmQgaXQgKi8KKworCXJlcSA9IGttYWxsb2Mo cmVxX2J1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcSkgeworCQllcnIgPSAtRU5PTUVN OworCQlnb3RvIHVubG9jazsKKwl9CisKKwlzY2FybGV0dDJfZmlsbF9yZXF1ZXN0X2hlYWRlcihw cml2YXRlLCByZXEsIGNtZCwgcmVxX3NpemUpOworCisJaWYgKHJlcV9zaXplKQorCQltZW1jcHko cmVxLT5kYXRhLCByZXFfZGF0YSwgcmVxX3NpemUpOworCisJZXJyID0gc25kX3VzYl9jdGxfbXNn KG1peGVyLT5jaGlwLT5kZXYsCisJCQl1c2Jfc25kY3RybHBpcGUobWl4ZXItPmNoaXAtPmRldiwg MCksCisJCQlTQ0FSTEVUVDJfVVNCX1ZFTkRPUl9TUEVDSUZJQ19DTURfUkVRLAorCQkJVVNCX1JF Q0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQsCisJCQkwLAorCQkJ U0NBUkxFVFQyX1VTQl9WRU5ET1JfU1BFQ0lGSUNfSU5URVJGQUNFLAorCQkJcmVxLAorCQkJcmVx X2J1Zl9zaXplKTsKKworCWlmIChlcnIgIT0gcmVxX2J1Zl9zaXplKSB7CisJCXVzYl9hdWRpb19l cnIoCisJCQltaXhlci0+Y2hpcCwKKwkJCSJTY2FybGV0dCBHZW4gMiBVU0IgcmVxdWVzdCByZXN1 bHQgY21kICV4IHdhcyAlZFxuIiwKKwkJCWNtZCwgZXJyKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJ Z290byB1bmxvY2s7CisJfQorCisJLyogc2VuZCBhIHNlY29uZCBtZXNzYWdlIHRvIGdldCB0aGUg cmVzcG9uc2UgKi8KKworCXJlc3AgPSBrbWFsbG9jKHJlc3BfYnVmX3NpemUsIEdGUF9LRVJORUwp OworCWlmICghcmVzcCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHVubG9jazsKKwl9CisK KwllcnIgPSBzbmRfdXNiX2N0bF9tc2cobWl4ZXItPmNoaXAtPmRldiwKKwkJCXVzYl9zbmRjdHJs cGlwZShtaXhlci0+Y2hpcC0+ZGV2LCAwKSwKKwkJCVNDQVJMRVRUMl9VU0JfVkVORE9SX1NQRUNJ RklDX0NNRF9SRVNQLAorCQkJVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTIHwg VVNCX0RJUl9JTiwKKwkJCTAsCisJCQlTQ0FSTEVUVDJfVVNCX1ZFTkRPUl9TUEVDSUZJQ19JTlRF UkZBQ0UsCisJCQlyZXNwLAorCQkJcmVzcF9idWZfc2l6ZSk7CisKKwkvKiB2YWxpZGF0ZSB0aGUg cmVzcG9uc2UgKi8KKworCWlmIChlcnIgIT0gcmVzcF9idWZfc2l6ZSkgeworCQl1c2JfYXVkaW9f ZXJyKAorCQkJbWl4ZXItPmNoaXAsCisJCQkiU2NhcmxldHQgR2VuIDIgVVNCIHJlc3BvbnNlIHJl c3VsdCBjbWQgJXggd2FzICVkXG4iLAorCQkJY21kLCBlcnIpOworCQllcnIgPSAtRUlOVkFMOwor CQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAocmVzcC0+Y21kICE9IHJlcS0+Y21kIHx8CisJICAg IHJlc3AtPnNlcSAhPSByZXEtPnNlcSB8fAorCSAgICByZXNwX3NpemUgIT0gbGUxNl90b19jcHUo cmVzcC0+c2l6ZSkgfHwKKwkgICAgcmVzcC0+ZXJyb3IgfHwKKwkgICAgcmVzcC0+cGFkKSB7CisJ CXVzYl9hdWRpb19lcnIoCisJCQltaXhlci0+Y2hpcCwKKwkJCSJTY2FybGV0dCBHZW4gMiBVU0Ig aW52YWxpZCByZXNwb25zZTsgIgorCQkJICAgImNtZCB0eC9yeCAlZC8lZCBzZXEgJWQvJWQgc2l6 ZSAlZC8lZCAiCisJCQkgICAiZXJyb3IgJWQgcGFkICVkXG4iLAorCQkJbGUxNl90b19jcHUocmVx LT5jbWQpLCBsZTE2X3RvX2NwdShyZXNwLT5jbWQpLAorCQkJbGUxNl90b19jcHUocmVxLT5zZXEp LCBsZTE2X3RvX2NwdShyZXNwLT5zZXEpLAorCQkJcmVzcF9zaXplLCBsZTE2X3RvX2NwdShyZXNw LT5zaXplKSwKKwkJCWxlMTZfdG9fY3B1KHJlc3AtPmVycm9yKSwKKwkJCWxlMTZfdG9fY3B1KHJl c3AtPnBhZCkpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAo cmVzcF9zaXplID4gMCkKKwkJbWVtY3B5KHJlc3BfZGF0YSwgcmVzcC0+ZGF0YSwgcmVzcF9zaXpl KTsKKwordW5sb2NrOgorCWtmcmVlKHJlcSk7CisJa2ZyZWUocmVzcCk7CisJbXV0ZXhfdW5sb2Nr KCZwcml2YXRlLT51c2JfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKKy8qIENsZWFuIHVwIGFm dGVyIFNDQVJMRVRUMl9VU0JfQ09ORklHX1NBVkUgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgKi8KK3N0 YXRpYyB2b2lkIHNjYXJsZXR0Ml9jb25maWdfc2F2ZV9yZXNwb25zZV9jb21wbGV0ZShzdHJ1Y3Qg dXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gdXJiLT5j b250ZXh0OworCXN0cnVjdCBzY2FybGV0dDJfdXNiX3BhY2tldCAqcmVzcCA9IG1peGVyLT5zY2Fy bGV0dDJfYnVmZmVyOworCisJaWYgKHVyYi0+c3RhdHVzIDwgMCkgeworCQl1c2JfYXVkaW9fZXJy KG1peGVyLT5jaGlwLCAiJXM6IHN0YXR1cyAlZFxuIiwKKwkJCSAgICAgIF9fZnVuY19fLCB1cmIt PnN0YXR1cyk7CisJfSBlbHNlIGlmIChyZXNwLT5lcnJvcikgeworCQl1c2JfYXVkaW9fZXJyKG1p eGVyLT5jaGlwLCAiJXM6IGVycm9yICVkXG4iLAorCQkJICAgICAgX19mdW5jX18sIGxlMTZfdG9f Y3B1KHJlc3AtPmVycm9yKSk7CisJfQorCisJdXNiX2ZyZWVfdXJiKG1peGVyLT5yY191cmIpOwor CW1peGVyLT5yY191cmIgPSAwOworCWtmcmVlKG1peGVyLT5yY19zZXR1cF9wYWNrZXQpOworCW1p eGVyLT5yY19zZXR1cF9wYWNrZXQgPSAwOworfQorCisvKiBGaWxsIG1peGVyLT5yY19zZXR1cF9w YWNrZXQgYW5kIG1peGVyLT51cmIgdGhlbiBzdWJtaXQgaXQgKi8KK3N0YXRpYyB2b2lkIHNjYXJs ZXR0Ml9zZW5kX21peGVyX2NvbnRyb2xfdXJiKAorCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNl ICptaXhlciwgdTggZGlybiwgdTggcmVxLAorCWludCBsZW4sIHVzYl9jb21wbGV0ZV90IGNvbXBs ZXRlX2ZuKQoreworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwgPSBtaXhlci0+cmNfc2V0 dXBfcGFja2V0OworCisJY3RybC0+YlJlcXVlc3RUeXBlID0gVVNCX1JFQ0lQX0lOVEVSRkFDRSB8 IFVTQl9UWVBFX0NMQVNTIHwgZGlybjsKKwljdHJsLT5iUmVxdWVzdCA9IHJlcTsKKwljdHJsLT53 VmFsdWUgPSBjcHVfdG9fbGUxNigwKTsKKwljdHJsLT53SW5kZXggPSBjcHVfdG9fbGUxNihTQ0FS TEVUVDJfVVNCX1ZFTkRPUl9TUEVDSUZJQ19JTlRFUkZBQ0UpOworCWN0cmwtPndMZW5ndGggPSBj cHVfdG9fbGUxNihsZW4pOworCisJdXNiX2ZpbGxfY29udHJvbF91cmIobWl4ZXItPnJjX3VyYiwg bWl4ZXItPmNoaXAtPmRldiwKKwkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKG1peGVyLT5jaGlwLT5k ZXYsIDApLAorCQkJICAgICAodTggKiljdHJsLCBtaXhlci0+c2NhcmxldHQyX2J1ZmZlciwgbGVu LAorCQkJICAgICBjb21wbGV0ZV9mbiwgbWl4ZXIpOworCisJdXNiX3N1Ym1pdF91cmIobWl4ZXIt PnJjX3VyYiwgR0ZQX0FUT01JQyk7Cit9CisKKy8qIFNDQVJMRVRUMl9VU0JfQ09ORklHX1NBVkUg aXMgY29tcGxldGU7IHNlbmQgYSByZXF1ZXN0IGZvciB0aGUgcmVzcG9uc2UgKi8KK3N0YXRpYyB2 b2lkIHNjYXJsZXR0Ml9jb25maWdfc2F2ZV9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJ c3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gdXJiLT5jb250ZXh0OworCWludCBs ZW4gPSBTQ0FSTEVUVDJfVVNCX1BBQ0tFVF9MRU47CisKKwlpZiAodXJiLT5zdGF0dXMgPCAwKSB7 CisJCXVzYl9hdWRpb19lcnIobWl4ZXItPmNoaXAsCisJCQkgICAgICAiJXM6IHN0YXR1cyAlZFxu IiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKworCQl1c2JfZnJlZV91cmIobWl4ZXItPnJjX3Vy Yik7CisJCW1peGVyLT5yY191cmIgPSAwOworCQlrZnJlZShtaXhlci0+cmNfc2V0dXBfcGFja2V0 KTsKKwkJbWl4ZXItPnJjX3NldHVwX3BhY2tldCA9IDA7CisKKwkJcmV0dXJuOworCX0KKworCXNj YXJsZXR0Ml9zZW5kX21peGVyX2NvbnRyb2xfdXJiKAorCQltaXhlciwgVVNCX0RJUl9JTiwgU0NB UkxFVFQyX1VTQl9WRU5ET1JfU1BFQ0lGSUNfQ01EX1JFU1AsCisJCWxlbiwgc2NhcmxldHQyX2Nv bmZpZ19zYXZlX3Jlc3BvbnNlX2NvbXBsZXRlKTsKK30KKworLyogU2VuZCBTQ0FSTEVUVDJfVVNC X0RBVEFfQ01EIFNDQVJMRVRUMl9VU0JfQ09ORklHX1NBVkUgKi8KK3N0YXRpYyB2b2lkIHNjYXJs ZXR0Ml9jb25maWdfc2F2ZShzdHJ1Y3QgdGltZXJfbGlzdCAqdCkKK3sKKwlzdHJ1Y3QgdXNiX21p eGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBmcm9tX3RpbWVyKG1peGVyLCB0LCB0aW1lcik7CisJc3Ry dWN0IHNjYXJsZXR0Ml91c2JfcGFja2V0ICpyZXEgPSBtaXhlci0+c2NhcmxldHQyX2J1ZmZlcjsK KwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZTsK KwlpbnQgbGVuID0gU0NBUkxFVFQyX1VTQl9QQUNLRVRfTEVOICsgc2l6ZW9mKHUzMik7CisKKwlp ZiAobWl4ZXItPnJjX3VyYikgeworCQl1c2JfYXVkaW9fZXJyKG1peGVyLT5jaGlwLAorCQkJICAg ICAgIiVzOiBtaXhlciByY191cmIgYWxyZWFkeSBpbiB1c2UhXG4iLCBfX2Z1bmNfXyk7CisJCXJl dHVybjsKKwl9CisJbWl4ZXItPnJjX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7 CisJaWYgKCFtaXhlci0+cmNfdXJiKSB7CisJCXVzYl9hdWRpb19lcnIobWl4ZXItPmNoaXAsCisJ CQkgICAgICAiJXM6IHVzYl9hbGxvY191cmIoKSBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7CisJCXJl dHVybjsKKwl9CisJbWl4ZXItPnJjX3NldHVwX3BhY2tldCA9CisJCWttYWxsb2Moc2l6ZW9mKCpt aXhlci0+cmNfc2V0dXBfcGFja2V0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtaXhlci0+cmNfc2V0 dXBfcGFja2V0KSB7CisJCXVzYl9mcmVlX3VyYihtaXhlci0+cmNfdXJiKTsKKwkJbWl4ZXItPnJj X3VyYiA9IE5VTEw7CisJCXVzYl9hdWRpb19lcnIobWl4ZXItPmNoaXAsCisJCQkgICAgICAiJXM6 IGttYWxsb2MoKSBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlzY2Fy bGV0dDJfZmlsbF9yZXF1ZXN0X2hlYWRlcihwcml2YXRlLCBtaXhlci0+c2NhcmxldHQyX2J1ZmZl ciwKKwkJCQkgICAgICBTQ0FSTEVUVDJfVVNCX0RBVEFfQ01ELCBzaXplb2YodTMyKSk7CisJKih1 MzIgKikocmVxLT5kYXRhKSA9IGNwdV90b19sZTMyKFNDQVJMRVRUMl9VU0JfQ09ORklHX1NBVkUp OworCisJc2NhcmxldHQyX3NlbmRfbWl4ZXJfY29udHJvbF91cmIoCisJCW1peGVyLCBVU0JfRElS X09VVCwgU0NBUkxFVFQyX1VTQl9WRU5ET1JfU1BFQ0lGSUNfQ01EX1JFUSwKKwkJbGVuLCBzY2Fy bGV0dDJfY29uZmlnX3NhdmVfY29tcGxldGUpOworfQorCisvKiBTZW5kIGEgVVNCIG1lc3NhZ2Ug dG8gc2V0IGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgKHZvbHVtZSBsZXZlbCwKKyAqIHN3L2h3 IHZvbHVtZSBzd2l0Y2gsIGxpbmUvaW5zdCBsZXZlbCBzd2l0Y2gsIG9yIHBhZCBzd2l0Y2gpCisg Ki8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX3VzYl9zZXRfY29uZmlnKAorCXN0cnVjdCB1c2JfbWl4 ZXJfaW50ZXJmYWNlICptaXhlciwKKwlpbnQgY29uZmlnX2l0ZW1fbnVtLCBpbnQgaW5kZXgsIGlu dCB2YWx1ZSkKK3sKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2NvbmZpZyBjb25maWdfaXRlbSA9 CisJICAgICAgIHNjYXJsZXR0Ml9jb25maWdfaXRlbXNbY29uZmlnX2l0ZW1fbnVtXTsKKwlzdHJ1 Y3QgeworCQl1MzIgb2Zmc2V0OworCQl1MzIgYnl0ZXM7CisJCXMzMiB2YWx1ZTsKKwl9IF9fcGFj a2VkIHJlcTsKKwl1MzIgcmVxMjsKKwlpbnQgZXJyOworCisJLyogU2VuZCB0aGUgY29uZmlndXJh dGlvbiBwYXJhbWV0ZXIgZGF0YSAqLworCXJlcS5vZmZzZXQgPSBjcHVfdG9fbGUzMihjb25maWdf aXRlbS5vZmZzZXQgKyBpbmRleCAqIGNvbmZpZ19pdGVtLnNpemUpOworCXJlcS5ieXRlcyA9IGNw dV90b19sZTMyKGNvbmZpZ19pdGVtLnNpemUpOworCXJlcS52YWx1ZSA9IGNwdV90b19sZTMyKHZh bHVlKTsKKwllcnIgPSBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX1NFVF9EQVRB LAorCQkJICAgICZyZXEsIHNpemVvZih1MzIpICogMiArIGNvbmZpZ19pdGVtLnNpemUsCisJCQkg ICAgTlVMTCwgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBBY3RpdmF0 ZSB0aGUgY2hhbmdlICovCisJcmVxMiA9IGNwdV90b19sZTMyKGNvbmZpZ19pdGVtLmFjdGl2YXRl KTsKKwllcnIgPSBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX0RBVEFfQ01ELAor CQkJICAgICZyZXEyLCBzaXplb2YocmVxMiksIE5VTEwsIDApOworCWlmIChlcnIgPCAwKQorCQly ZXR1cm4gZXJyOworCisJLyogU2NoZWR1bGUgdGhlIGNoYW5nZSB0byBiZSB3cml0dGVuIHRvIE5W UkFNICovCisJbW9kX3RpbWVyKCZtaXhlci0+dGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZm aWVzKDIwMDApKTsKKworCXJldHVybiAwOworfQorCisvKiBTZW5kIGEgVVNCIG1lc3NhZ2UgdG8g Z2V0IGRhdGE7IHJlc3VsdCBwbGFjZWQgaW4gKmJ1ZiAqLworc3RhdGljIGludCBzY2FybGV0dDJf dXNiX2dldCgKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJaW50IG9mZnNl dCwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgeworCQl1MzIgb2Zmc2V0OworCQl1 MzIgc2l6ZTsKKwl9IF9fcGFja2VkIHJlcTsKKworCXJlcS5vZmZzZXQgPSBjcHVfdG9fbGUzMihv ZmZzZXQpOworCXJlcS5zaXplID0gY3B1X3RvX2xlMzIoc2l6ZSk7CisJcmV0dXJuIHNjYXJsZXR0 Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9VU0JfR0VUX0RBVEEsCisJCQkgICAgICZyZXEsIHNpemVv ZihyZXEpLCBidWYsIHNpemUpOworfQorCisvKiBTZW5kIGEgVVNCIG1lc3NhZ2UgdG8gZ2V0IGNv bmZpZ3VyYXRpb24gcGFyYW1ldGVyczsgcmVzdWx0IHBsYWNlZCBpbiAqYnVmICovCitzdGF0aWMg aW50IHNjYXJsZXR0Ml91c2JfZ2V0X2NvbmZpZygKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFj ZSAqbWl4ZXIsCisJaW50IGNvbmZpZ19pdGVtX251bSwgaW50IGNvdW50LCB2b2lkICpidWYpCit7 CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9jb25maWcgY29uZmlnX2l0ZW0gPQorCSAgICAgICBz Y2FybGV0dDJfY29uZmlnX2l0ZW1zW2NvbmZpZ19pdGVtX251bV07CisJaW50IHNpemUgPSBjb25m aWdfaXRlbS5zaXplICogY291bnQ7CisKKwlyZXR1cm4gc2NhcmxldHQyX3VzYl9nZXQobWl4ZXIs IGNvbmZpZ19pdGVtLm9mZnNldCwgYnVmLCBzaXplKTsKK30KKworLyogU2VuZCBhIFVTQiBtZXNz YWdlIHRvIGdldCB2b2x1bWUgc3RhdHVzOyByZXN1bHQgcGxhY2VkIGluICpidWYgKi8KK3N0YXRp YyBpbnQgc2NhcmxldHQyX3VzYl9nZXRfdm9sdW1lX3N0YXR1cygKKwlzdHJ1Y3QgdXNiX21peGVy X2ludGVyZmFjZSAqbWl4ZXIsCisJc3RydWN0IHNjYXJsZXR0Ml91c2Jfdm9sdW1lX3N0YXR1cyAq YnVmKQoreworCXJldHVybiBzY2FybGV0dDJfdXNiX2dldChtaXhlciwgU0NBUkxFVFQyX1VTQl9W T0xVTUVfU1RBVFVTX09GRlNFVCwKKwkJCQkgYnVmLCBzaXplb2YoKmJ1ZikpOworfQorCisvKiBT ZW5kIGEgVVNCIG1lc3NhZ2UgdG8gc2V0IHRoZSB2b2x1bWVzIGZvciBhbGwgaW5wdXRzIG9mIG9u ZSBtaXgKKyAqICh2YWx1ZXMgb2J0YWluZWQgZnJvbSBwcml2YXRlLT5taXhbXSkKKyAqLworc3Rh dGljIGludCBzY2FybGV0dDJfdXNiX3NldF9taXgoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2Ug Km1peGVyLAorCQkJCSAgICAgaW50IG1peF9udW0pCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhl cl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGU7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0 Ml9kZXZpY2VfaW5mbyAqaW5mbyA9IHByaXZhdGUtPmluZm87CisKKwlzdHJ1Y3QgeworCQl1MTYg bWl4X251bTsKKwkJdTE2IGRhdGFbU0NBUkxFVFQyX0lOUFVUX01JWF9NQVhdOworCX0gX19wYWNr ZWQgcmVxOworCisJaW50IGksIGo7CisJaW50IG51bV9taXhlcl9pbiA9CisJCWluZm8tPnBvcnRz W1NDQVJMRVRUMl9QT1JUX1RZUEVfTUlYXS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXTsKKworCXJl cS5taXhfbnVtID0gY3B1X3RvX2xlMTYobWl4X251bSk7CisKKwlmb3IgKGkgPSAwLCBqID0gbWl4 X251bSAqIG51bV9taXhlcl9pbjsgaSA8IG51bV9taXhlcl9pbjsgaSsrLCBqKyspCisJCXJlcS5k YXRhW2ldID0gY3B1X3RvX2xlMTYoCisJCQlzY2FybGV0dDJfbWl4ZXJfdmFsdWVzW3ByaXZhdGUt Pm1peFtqXV0KKwkJKTsKKworCXJldHVybiBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJf VVNCX1NFVF9NSVgsCisJCQkgICAgICZyZXEsIChudW1fbWl4ZXJfaW4gKyAxKSAqIHNpemVvZih1 MTYpLAorCQkJICAgICBOVUxMLCAwKTsKK30KKworLyogQ29udmVydCBhIHBvcnQgbnVtYmVyIGlu ZGV4IChwZXIgaW5mby0+cG9ydHMpIHRvIGEgaGFyZHdhcmUgSUQgKi8KK3N0YXRpYyB1MzIgc2Nh cmxldHQyX211eF9zcmNfbnVtX3RvX2lkKGNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBv cnRzLAorCQkJCSAgICAgICBpbnQgbnVtKQoreworCWludCBwb3J0X3R5cGU7CisKKwlmb3IgKHBv cnRfdHlwZSA9IDA7CisJICAgICBwb3J0X3R5cGUgPCBTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5U OworCSAgICAgcG9ydF90eXBlKyspIHsKKwkJaWYgKG51bSA8IHBvcnRzW3BvcnRfdHlwZV0ubnVt W1NDQVJMRVRUMl9QT1JUX0lOXSkKKwkJCXJldHVybiBwb3J0c1twb3J0X3R5cGVdLmlkIHwgbnVt OworCQludW0gLT0gcG9ydHNbcG9ydF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dOworCX0K KworCS8qIE9vcHMgKi8KKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBVU0IgbWVzc2FnZXMgdG8g c2V0IG11eCBpbnB1dHMgKi8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX3VzYl9zZXRfbXV4KHN0cnVj dCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVy X2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQy X2RldmljZV9pbmZvICppbmZvID0gcHJpdmF0ZS0+aW5mbzsKKwljb25zdCBzdHJ1Y3Qgc2Nhcmxl dHQyX3BvcnRzICpwb3J0cyA9IGluZm8tPnBvcnRzOworCWludCByYXRlLCBwb3J0X2Rpcl9yYXRl OworCisJc3RhdGljIGNvbnN0IGludCBhc3NpZ25tZW50X29yZGVyW1NDQVJMRVRUMl9QT1JUX1RZ UEVfQ09VTlRdID0geworCQlTQ0FSTEVUVDJfUE9SVF9UWVBFX1BDTSwKKwkJU0NBUkxFVFQyX1BP UlRfVFlQRV9BTkFMT0dVRSwKKwkJU0NBUkxFVFQyX1BPUlRfVFlQRV9TUERJRiwKKwkJU0NBUkxF VFQyX1BPUlRfVFlQRV9BREFULAorCQlTQ0FSTEVUVDJfUE9SVF9UWVBFX01JWCwKKwkJU0NBUkxF VFQyX1BPUlRfVFlQRV9OT05FLAorCX07CisKKwlzdHJ1Y3QgeworCQl1MTYgcGFkOworCQl1MTYg bnVtOworCQl1MzIgZGF0YVtTQ0FSTEVUVDJfTVVYX01BWF07CisJfSBfX3BhY2tlZCByZXE7CisK KwlyZXEucGFkID0gMDsKKworCS8qIG11eCBzZXR0aW5ncyBmb3IgZWFjaCByYXRlICovCisJZm9y IChyYXRlID0gMCwgcG9ydF9kaXJfcmF0ZSA9IFNDQVJMRVRUMl9QT1JUX09VVF80NDsKKwkgICAg IHBvcnRfZGlyX3JhdGUgPD0gU0NBUkxFVFQyX1BPUlRfT1VUXzE3NjsKKwkgICAgIHJhdGUrKywg cG9ydF9kaXJfcmF0ZSsrKSB7CisJCWludCBvcmRlcl9udW0sIGksIGVycjsKKworCQlyZXEubnVt ID0gY3B1X3RvX2xlMTYocmF0ZSk7CisKKwkJZm9yIChvcmRlcl9udW0gPSAwLCBpID0gMDsKKwkJ ICAgICBvcmRlcl9udW0gPCBTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UOworCQkgICAgIG9yZGVy X251bSsrKSB7CisJCQlpbnQgcG9ydF90eXBlID0gYXNzaWdubWVudF9vcmRlcltvcmRlcl9udW1d OworCQkJaW50IGogPSBzY2FybGV0dDJfZ2V0X3BvcnRfc3RhcnRfbnVtKHBvcnRzLAorCQkJCQkJ CSAgICAgU0NBUkxFVFQyX1BPUlRfT1VULAorCQkJCQkJCSAgICAgcG9ydF90eXBlKTsKKwkJCWlu dCBwb3J0X2lkID0gcG9ydHNbcG9ydF90eXBlXS5pZDsKKwkJCWludCBjaGFubmVsOworCisJCQlm b3IgKGNoYW5uZWwgPSAwOworCQkJICAgICBjaGFubmVsIDwgcG9ydHNbcG9ydF90eXBlXS5udW1b cG9ydF9kaXJfcmF0ZV07CisJCQkgICAgIGNoYW5uZWwrKywgaSsrLCBqKyspCisJCQkJLyogbG93 ZXIgMTIgYml0cyBmb3IgdGhlIGRlc3RpbmF0aW9uIGFuZAorCQkJCSAqIG5leHQgMTIgYml0cyBm b3IgdGhlIHNvdXJjZQorCQkJCSAqLworCQkJCXJlcS5kYXRhW2ldID0gIXBvcnRfaWQKKwkJCQkJ PyAwCisJCQkJCTogY3B1X3RvX2xlMzIoCisJCQkJCQlwb3J0X2lkIHwKKwkJCQkJCWNoYW5uZWwg fAorCQkJCQkJc2NhcmxldHQyX211eF9zcmNfbnVtX3RvX2lkKAorCQkJCQkJCXBvcnRzLCBwcml2 YXRlLT5tdXhbal0KKwkJCQkJCSkgPDwgMTIKKwkJCQkJICApOworCisJCQkvKiBza2lwIHByaXZh dGUtPm11eFtqXSBlbnRyaWVzIG5vdCBvdXRwdXQgKi8KKwkJCWogKz0gcG9ydHNbcG9ydF90eXBl XS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXSAtCisJCQkgICAgIHBvcnRzW3BvcnRfdHlwZV0ubnVt W3BvcnRfZGlyX3JhdGVdOworCQl9CisKKwkJZXJyID0gc2NhcmxldHQyX3VzYihtaXhlciwgU0NB UkxFVFQyX1VTQl9TRVRfTVVYLAorCQkJCSAgICAmcmVxLCAoaSArIDEpICogc2l6ZW9mKHUzMiks CisJCQkJICAgIE5VTEwsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQor CisJcmV0dXJuIDA7Cit9CisKKy8qIFNlbmQgVVNCIG1lc3NhZ2UgdG8gZ2V0IG1ldGVyIGxldmVs cyAqLworc3RhdGljIGludCBzY2FybGV0dDJfdXNiX2dldF9tZXRlcl9sZXZlbHMoc3RydWN0IHVz Yl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAorCQkJCQkgIHUxNiAqbGV2ZWxzKQoreworCXN0cnVj dCB7CisJCXUxNiBwYWQ7CisJCXUxNiBudW1fbWV0ZXJzOworCQl1MzIgbWFnaWM7CisJfSBfX3Bh Y2tlZCByZXE7CisJdTMyIHJlc3BbU0NBUkxFVFQyX05VTV9NRVRFUlNdOworCWludCBpLCBlcnI7 CisKKwlyZXEucGFkID0gMDsKKwlyZXEubnVtX21ldGVycyA9IGNwdV90b19sZTE2KFNDQVJMRVRU Ml9OVU1fTUVURVJTKTsKKwlyZXEubWFnaWMgPSBjcHVfdG9fbGUzMihTQ0FSTEVUVDJfVVNCX01F VEVSX0xFVkVMU19HRVRfTUFHSUMpOworCWVyciA9IHNjYXJsZXR0Ml91c2IobWl4ZXIsIFNDQVJM RVRUMl9VU0JfR0VUX01FVEVSX0xFVkVMUywKKwkJCSAgICAmcmVxLCBzaXplb2YocmVxKSwgcmVz cCwgc2l6ZW9mKHJlc3ApKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIGNv cHksIGNvbnZlcnQgdG8gdTE2ICovCisJZm9yIChpID0gMDsgaSA8IFNDQVJMRVRUMl9OVU1fTUVU RVJTOyBpKyspCisJCWxldmVsc1tpXSA9IHJlc3BbaV07CisKKwlyZXR1cm4gMDsKK30KKworLyoq KiBDb250cm9sIEZ1bmN0aW9ucyAqKiovCisKKy8qIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUg YSBuZXcgY29udHJvbCAqLworc3RhdGljIGludCBzY2FybGV0dDJfYWRkX25ld19jdGwoc3RydWN0 IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAorCQkJCSBjb25zdCBzdHJ1Y3Qgc25kX2tjb250 cm9sX25ldyAqbmNvbnRyb2wsCisJCQkJIGludCBpbmRleCwgaW50IGNoYW5uZWxzLCBjb25zdCBj aGFyICpuYW1lLAorCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICoqa2N0bF9yZXR1cm4pCit7CisJ c3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAq ZWxlbTsKKwlpbnQgZXJyOworCisJZWxlbSA9IGt6YWxsb2Moc2l6ZW9mKCplbGVtKSwgR0ZQX0tF Uk5FTCk7CisJaWYgKCFlbGVtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVsZW0tPmhlYWQubWl4 ZXIgPSBtaXhlcjsKKwllbGVtLT5jb250cm9sID0gaW5kZXg7CisJZWxlbS0+aGVhZC5pZCA9IGlu ZGV4OworCWVsZW0tPmNoYW5uZWxzID0gY2hhbm5lbHM7CisKKwlrY3RsID0gc25kX2N0bF9uZXcx KG5jb250cm9sLCBlbGVtKTsKKwlpZiAoIWtjdGwpIHsKKwkJa2ZyZWUoZWxlbSk7CisJCXJldHVy biAtRU5PTUVNOworCX0KKwlrY3RsLT5wcml2YXRlX2ZyZWUgPSBzbmRfdXNiX21peGVyX2VsZW1f ZnJlZTsKKworCXN0cmxjcHkoa2N0bC0+aWQubmFtZSwgbmFtZSwgc2l6ZW9mKGtjdGwtPmlkLm5h bWUpKTsKKworCWVyciA9IHNuZF91c2JfbWl4ZXJfYWRkX2NvbnRyb2woJmVsZW0tPmhlYWQsIGtj dGwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGtjdGxfcmV0dXJuKQor CQkqa2N0bF9yZXR1cm4gPSBrY3RsOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiogQW5hbG9ndWUg TGluZSBPdXQgVm9sdW1lIENvbnRyb2xzICoqKi8KKworLyogVXBkYXRlIGhhcmR3YXJlIHZvbHVt ZSBjb250cm9scyBhZnRlciByZWNlaXZpbmcgbm90aWZpY2F0aW9uIHRoYXQKKyAqIHRoZXkgaGF2 ZSBjaGFuZ2VkCisgKi8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX3VwZGF0ZV92b2x1bWVzKHN0cnVj dCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVy X2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQy X3BvcnRzICpwb3J0cyA9IHByaXZhdGUtPmluZm8tPnBvcnRzOworCXN0cnVjdCBzY2FybGV0dDJf dXNiX3ZvbHVtZV9zdGF0dXMgdm9sdW1lX3N0YXR1czsKKwlpbnQgbnVtX2xpbmVfb3V0ID0KKwkJ cG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9BTkFMT0dVRV0ubnVtW1NDQVJMRVRUMl9QT1JUX09V VF07CisJaW50IGVyciwgaTsKKworCXByaXZhdGUtPnZvbF91cGRhdGVkID0gMDsKKworCWVyciA9 IHNjYXJsZXR0Ml91c2JfZ2V0X3ZvbHVtZV9zdGF0dXMobWl4ZXIsICZ2b2x1bWVfc3RhdHVzKTsK KwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXByaXZhdGUtPm1hc3Rlcl92b2wgPSBj bGFtcCgKKwkJdm9sdW1lX3N0YXR1cy5tYXN0ZXJfdm9sICsgU0NBUkxFVFRfVk9MVU1FX0JJQVMs CisJCTAsIFNDQVJMRVRUX1ZPTFVNRV9CSUFTKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbGlu ZV9vdXQ7IGkrKykgeworCQlpZiAocHJpdmF0ZS0+dm9sX3N3X2h3X3N3aXRjaFtpXSkKKwkJCXBy aXZhdGUtPnZvbFtpXSA9IHByaXZhdGUtPm1hc3Rlcl92b2w7CisJfQorCisJZm9yIChpID0gMDsg aSA8IHByaXZhdGUtPmluZm8tPmJ1dHRvbl9jb3VudDsgaSsrKQorCQlwcml2YXRlLT5idXR0b25z W2ldID0gISF2b2x1bWVfc3RhdHVzLmJ1dHRvbnNbaV07CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludCBzY2FybGV0dDJfdm9sdW1lX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtj dGwsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVj dCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCisJdWlu Zm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0g ZWxlbS0+Y2hhbm5lbHM7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+ dmFsdWUuaW50ZWdlci5tYXggPSBTQ0FSTEVUVF9WT0xVTUVfQklBUzsKKwl1aW5mby0+dmFsdWUu aW50ZWdlci5zdGVwID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJf bWFzdGVyX3ZvbHVtZV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCSAg IHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4 ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4 ZXJfaW50ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0 Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGU7CisKKwlpZiAocHJpdmF0ZS0+ dm9sX3VwZGF0ZWQpIHsKKwkJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJCXNj YXJsZXR0Ml91cGRhdGVfdm9sdW1lcyhtaXhlcik7CisJCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ ZGF0YV9tdXRleCk7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBw cml2YXRlLT5tYXN0ZXJfdm9sOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0 Ml92b2x1bWVfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSAgICBzdHJ1 Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2Vs ZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2lu dGVyZmFjZSAqbWl4ZXIgPSBlbGVtLT5oZWFkLm1peGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4 ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlOworCWludCBpbmRleCA9IGVsZW0tPmNv bnRyb2w7CisKKwlpZiAocHJpdmF0ZS0+dm9sX3VwZGF0ZWQpIHsKKwkJbXV0ZXhfbG9jaygmcHJp dmF0ZS0+ZGF0YV9tdXRleCk7CisJCXNjYXJsZXR0Ml91cGRhdGVfdm9sdW1lcyhtaXhlcik7CisJ CW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJfQorCisJdWNvbnRyb2wtPnZh bHVlLmludGVnZXIudmFsdWVbMF0gPSBwcml2YXRlLT52b2xbaW5kZXhdOworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml92b2x1bWVfY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250 cm9sICprY3RsLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkK K3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0 YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBlbGVtLT5oZWFkLm1peGVy OworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRl OworCWludCBpbmRleCA9IGVsZW0tPmNvbnRyb2w7CisJaW50IG92YWwsIHZhbCwgZXJyID0gMDsK KworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCWRlbF90aW1lcl9zeW5jKCZt aXhlci0+dGltZXIpOworCisJb3ZhbCA9IHByaXZhdGUtPnZvbFtpbmRleF07CisJdmFsID0gdWNv bnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJCWdv dG8gdW5sb2NrOworCisJcHJpdmF0ZS0+dm9sW2luZGV4XSA9IHZhbDsKKwllcnIgPSBzY2FybGV0 dDJfdXNiX3NldF9jb25maWcobWl4ZXIsIFNDQVJMRVRUMl9DT05GSUdfTElORV9PVVRfVk9MVU1F LAorCQkJCSAgICAgICBpbmRleCwgdmFsIC0gU0NBUkxFVFRfVk9MVU1FX0JJQVMpOworCWlmIChl cnIgPT0gMCkKKwkJZXJyID0gMTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ ZGF0YV9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExW X0RCX01JTk1BWCgKKwlkYl9zY2FsZV9zY2FybGV0dF9nYWluLCAtU0NBUkxFVFRfVk9MVU1FX0JJ QVMgKiAxMDAsIDAKKyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBz Y2FybGV0dDJfbWFzdGVyX3ZvbHVtZV9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1f SUZBQ0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwKKwkJ ICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCisJLm5hbWUgPSAiIiwKKwkuaW5mbyA9 IHNjYXJsZXR0Ml92b2x1bWVfY3RsX2luZm8sCisJLmdldCAgPSBzY2FybGV0dDJfbWFzdGVyX3Zv bHVtZV9jdGxfZ2V0LAorCS5wcml2YXRlX3ZhbHVlID0gMCwgLyogbWF4IHZhbHVlICovCisJLnRs diA9IHsgLnAgPSBkYl9zY2FsZV9zY2FybGV0dF9nYWluIH0KK307CisKK3N0YXRpYyBjb25zdCBz dHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzY2FybGV0dDJfbGluZV9vdXRfdm9sdW1lX2N0bCA9IHsK KwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuYWNjZXNzID0gU05EUlZf Q1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RM Vl9SRUFELAorCS5uYW1lID0gIiIsCisJLmluZm8gPSBzY2FybGV0dDJfdm9sdW1lX2N0bF9pbmZv LAorCS5nZXQgID0gc2NhcmxldHQyX3ZvbHVtZV9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQy X3ZvbHVtZV9jdGxfcHV0LAorCS5wcml2YXRlX3ZhbHVlID0gMCwgLyogbWF4IHZhbHVlICovCisJ LnRsdiA9IHsgLnAgPSBkYl9zY2FsZV9zY2FybGV0dF9nYWluIH0KK307CisKKy8qKiogSFcvU1cg Vm9sdW1lIFN3aXRjaCBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3N3X2h3 X2VudW1fY3RsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkJIHN0cnVjdCBz bmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZh bHVlc1syXSA9IHsKKwkJIlNXIiwgIkhXIgorCX07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2lu Zm8odWluZm8sIDEsIDIsIHZhbHVlcyk7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3N3X2h3 X2VudW1fY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQlzdHJ1Y3Qgc25k X2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5m byAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2Rh dGEgKnByaXZhdGUgPSBlbGVtLT5oZWFkLm1peGVyLT5wcml2YXRlOworCisJdWNvbnRyb2wtPnZh bHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCXByaXZhdGUtPnZvbF9zd19od19zd2l0Y2hbZWxl bS0+Y29udHJvbF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3N3X2h3 X2VudW1fY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQlzdHJ1Y3Qgc25k X2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5m byAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFj ZSAqbWl4ZXIgPSBlbGVtLT5oZWFkLm1peGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0 YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlOworCisJaW50IGluZGV4ID0gZWxlbS0+Y29udHJv bDsKKwlpbnQgb3ZhbCwgdmFsLCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0 YV9tdXRleCk7CisJZGVsX3RpbWVyX3N5bmMoJm1peGVyLT50aW1lcik7CisKKwlvdmFsID0gcHJp dmF0ZS0+dm9sX3N3X2h3X3N3aXRjaFtpbmRleF07CisJdmFsID0gISF1Y29udHJvbC0+dmFsdWUu aW50ZWdlci52YWx1ZVswXTsKKworCWlmIChvdmFsID09IHZhbCkKKwkJZ290byB1bmxvY2s7CisK Kwlwcml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2luZGV4XSA9IHZhbDsKKworCS8qIENoYW5nZSBh Y2Nlc3MgbW9kZSB0byBSTyAoaGFyZHdhcmUgY29udHJvbGxlZCB2b2x1bWUpCisJICogb3IgUlcg KHNvZnR3YXJlIGNvbnRyb2xsZWQgdm9sdW1lKQorCSAqLworCWlmICh2YWwpCisJCXByaXZhdGUt PnZvbF9jdGxzW2luZGV4XS0+dmRbMF0uYWNjZXNzICY9CisJCQl+U05EUlZfQ1RMX0VMRU1fQUND RVNTX1dSSVRFOworCWVsc2UKKwkJcHJpdmF0ZS0+dm9sX2N0bHNbaW5kZXhdLT52ZFswXS5hY2Nl c3MgfD0KKwkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURTsKKworCS8qIFJlc2V0IHZvbHVt ZSB0byBtYXN0ZXIgdm9sdW1lICovCisJcHJpdmF0ZS0+dm9sW2luZGV4XSA9IHByaXZhdGUtPm1h c3Rlcl92b2w7CisKKwkvKiBTZXQgU1cgdm9sdW1lIHRvIGN1cnJlbnQgSFcgdm9sdW1lICovCisJ ZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfY29uZmlnKAorCQltaXhlciwgU0NBUkxFVFQyX0NPTkZJ R19MSU5FX09VVF9WT0xVTUUsCisJCWluZGV4LCBwcml2YXRlLT5tYXN0ZXJfdm9sIC0gU0NBUkxF VFRfVk9MVU1FX0JJQVMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIHVubG9jazsKKworCS8qIE5v dGlmeSBvZiBSTy9SVyBjaGFuZ2UgKi8KKwlzbmRfY3RsX25vdGlmeShtaXhlci0+Y2hpcC0+Y2Fy ZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfSU5GTywKKwkJICAgICAgICZwcml2YXRlLT52b2xfY3Rs c1tpbmRleF0tPmlkKTsKKworCS8qIFNlbmQgU1cvSFcgc3dpdGNoIGNoYW5nZSB0byB0aGUgZGV2 aWNlICovCisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfY29uZmlnKG1peGVyLCBTQ0FSTEVUVDJf Q09ORklHX1NXX0hXX1NXSVRDSCwKKwkJCQkgICAgICAgaW5kZXgsIHZhbCk7CisKK3VubG9jazoK KwltdXRleF91bmxvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzY2FybGV0dDJfc3dfaHdfZW51 bV9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUg PSAiIiwKKwkuaW5mbyA9IHNjYXJsZXR0Ml9zd19od19lbnVtX2N0bF9pbmZvLAorCS5nZXQgID0g c2NhcmxldHQyX3N3X2h3X2VudW1fY3RsX2dldCwKKwkucHV0ICA9IHNjYXJsZXR0Ml9zd19od19l bnVtX2N0bF9wdXQsCit9OworCisvKioqIExpbmUgTGV2ZWwvSW5zdHJ1bWVudCBMZXZlbCBTd2l0 Y2ggQ29udHJvbHMgKioqLworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9sZXZlbF9lbnVtX2N0bF9p bmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVt X2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YWx1ZXNbMl0gPSB7 CisJCSJMaW5lIiwgIkluc3QiCisJfTsKKworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyh1aW5m bywgMSwgMiwgdmFsdWVzKTsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbGV2ZWxfZW51bV9j dGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2Vs ZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVt ID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJp dmF0ZSA9IGVsZW0tPmhlYWQubWl4ZXItPnByaXZhdGU7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51 bWVyYXRlZC5pdGVtWzBdID0KKwkJcHJpdmF0ZS0+bGV2ZWxfc3dpdGNoW2VsZW0tPmNvbnRyb2xd OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9sZXZlbF9lbnVtX2N0bF9w dXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92 YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBr Y3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0g ZWxlbS0+aGVhZC5taXhlcjsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUg PSBtaXhlci0+cHJpdmF0ZTsKKworCWludCBpbmRleCA9IGVsZW0tPmNvbnRyb2w7CisJaW50IG92 YWwsIHZhbCwgZXJyID0gMDsKKworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOwor CWRlbF90aW1lcl9zeW5jKCZtaXhlci0+dGltZXIpOworCisJb3ZhbCA9IHByaXZhdGUtPmxldmVs X3N3aXRjaFtpbmRleF07CisJdmFsID0gISF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsw XTsKKworCWlmIChvdmFsID09IHZhbCkKKwkJZ290byB1bmxvY2s7CisKKwlwcml2YXRlLT5sZXZl bF9zd2l0Y2hbaW5kZXhdID0gdmFsOworCisJLyogU2VuZCBzd2l0Y2ggY2hhbmdlIHRvIHRoZSBk ZXZpY2UgKi8KKwllcnIgPSBzY2FybGV0dDJfdXNiX3NldF9jb25maWcobWl4ZXIsIFNDQVJMRVRU Ml9DT05GSUdfTEVWRUxfU1dJVENILAorCQkJCSAgICAgICBpbmRleCwgdmFsKTsKKwordW5sb2Nr OgorCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJcmV0dXJuIGVycjsKK30K Kworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9sZXZlbF9l bnVtX2N0bCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFt ZSA9ICIiLAorCS5pbmZvID0gc2NhcmxldHQyX2xldmVsX2VudW1fY3RsX2luZm8sCisJLmdldCAg PSBzY2FybGV0dDJfbGV2ZWxfZW51bV9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX2xldmVs X2VudW1fY3RsX3B1dCwKK307CisKKy8qKiogUGFkIFN3aXRjaCBDb250cm9scyAqKiovCisKK3N0 YXRpYyBpbnQgc2NhcmxldHQyX3BhZF9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGws CisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1 c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBz Y2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhlYWQubWl4ZXItPnByaXZhdGU7 CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJcHJpdmF0ZS0+cGFk X3N3aXRjaFtlbGVtLT5jb250cm9sXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2Fy bGV0dDJfcGFkX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkgc3RydWN0 IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVt X2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9taXhlcl9pbnRl cmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVy X2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZTsKKworCWludCBpbmRleCA9IGVsZW0tPmNv bnRyb2w7CisJaW50IG92YWwsIHZhbCwgZXJyID0gMDsKKworCW11dGV4X2xvY2soJnByaXZhdGUt PmRhdGFfbXV0ZXgpOworCWRlbF90aW1lcl9zeW5jKCZtaXhlci0+dGltZXIpOworCisJb3ZhbCA9 IHByaXZhdGUtPnBhZF9zd2l0Y2hbaW5kZXhdOworCXZhbCA9ICEhdWNvbnRyb2wtPnZhbHVlLmlu dGVnZXIudmFsdWVbMF07CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJCWdvdG8gdW5sb2NrOworCisJ cHJpdmF0ZS0+cGFkX3N3aXRjaFtpbmRleF0gPSB2YWw7CisKKwkvKiBTZW5kIHN3aXRjaCBjaGFu Z2UgdG8gdGhlIGRldmljZSAqLworCWVyciA9IHNjYXJsZXR0Ml91c2Jfc2V0X2NvbmZpZyhtaXhl ciwgU0NBUkxFVFQyX0NPTkZJR19QQURfU1dJVENILAorCQkJCSAgICAgICBpbmRleCwgdmFsKTsK KwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJcmV0dXJu IGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0 Ml9wYWRfY3RsID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5u YW1lID0gIiIsCisJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAorCS5nZXQgID0g c2NhcmxldHQyX3BhZF9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX3BhZF9jdGxfcHV0LAor fTsKKworLyoqKiBNdXRlL0RpbSBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQy X2J1dHRvbl9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJICAgIHN0cnVj dCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxl bV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50 ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhl cl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGU7CisKKwlpZiAocHJpdmF0ZS0+dm9sX3Vw ZGF0ZWQpIHsKKwkJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJCXNjYXJsZXR0 Ml91cGRhdGVfdm9sdW1lcyhtaXhlcik7CisJCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0YV9t dXRleCk7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHByaXZh dGUtPmJ1dHRvbnNbZWxlbS0+Y29udHJvbF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25z dCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzY2FybGV0dDJfYnV0dG9uX2N0bCA9IHsKKwkuaWZh Y2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VM RU1fQUNDRVNTX1JFQUQsCisJLm5hbWUgPSAiIiwKKwkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9t b25vX2luZm8sCisJLmdldCAgPSBzY2FybGV0dDJfYnV0dG9uX2N0bF9nZXQKK307CisKKy8qKiog Q3JlYXRlIHRoZSBhbmFsb2d1ZSBvdXRwdXQgY29udHJvbHMgKioqLworCitzdGF0aWMgaW50IHNj YXJsZXR0Ml9hZGRfbGluZV9vdXRfY3RscyhzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4 ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnBy aXZhdGU7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyAqaW5mbyA9IHByaXZh dGUtPmluZm87CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBpbmZvLT5w b3J0czsKKwlpbnQgbnVtX2xpbmVfb3V0ID0KKwkJcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9B TkFMT0dVRV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50IGVyciwgaTsKKwljaGFyIHNb U05EUlZfQ1RMX0VMRU1fSURfTkFNRV9NQVhMRU5dOworCisJLyogQWRkIFIvTyBIVyB2b2x1bWUg Y29udHJvbCAqLworCWlmIChpbmZvLT5saW5lX291dF9od192b2wpIHsKKwkJc25wcmludGYocywg c2l6ZW9mKHMpLCAiTWFzdGVyIEhXIFBsYXliYWNrIFZvbHVtZSIpOworCQllcnIgPSBzY2FybGV0 dDJfYWRkX25ld19jdGwobWl4ZXIsCisJCQkJCSAgICAmc2NhcmxldHQyX21hc3Rlcl92b2x1bWVf Y3RsLAorCQkJCQkgICAgMCwgMSwgcywgJnByaXZhdGUtPm1hc3Rlcl92b2xfY3RsKTsKKwkJaWYg KGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIEFkZCB2b2x1bWUgY29udHJvbHMg Ki8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2xpbmVfb3V0OyBpKyspIHsKKworCQkvKiBGYWRlciAq LworCQlpZiAoaW5mby0+bGluZV9vdXRfZGVzY3JzW2ldKQorCQkJc25wcmludGYocywgc2l6ZW9m KHMpLAorCQkJCSAiTGluZSAlMDJkICglcykgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkgaSArIDEs IGluZm8tPmxpbmVfb3V0X2Rlc2Nyc1tpXSk7CisJCWVsc2UKKwkJCXNucHJpbnRmKHMsIHNpemVv ZihzKSwKKwkJCQkgIkxpbmUgJTAyZCBQbGF5YmFjayBWb2x1bWUiLAorCQkJCSBpICsgMSk7CisJ CWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwKKwkJCQkJICAgICZzY2FybGV0dDJf bGluZV9vdXRfdm9sdW1lX2N0bCwKKwkJCQkJICAgIGksIDEsIHMsICZwcml2YXRlLT52b2xfY3Rs c1tpXSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQkvKiBNYWtlIHRoZSBm YWRlciByZWFkLW9ubHkgaWYgdGhlIFNXL0hXIHN3aXRjaCBpcyBzZXQgdG8gSFcgKi8KKwkJaWYg KHByaXZhdGUtPnZvbF9zd19od19zd2l0Y2hbaV0pCisJCQlwcml2YXRlLT52b2xfY3Rsc1tpXS0+ dmRbMF0uYWNjZXNzICY9CisJCQkJflNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURTsKKworCQkv KiBTVy9IVyBTd2l0Y2ggKi8KKwkJaWYgKGluZm8tPmxpbmVfb3V0X2h3X3ZvbCkgeworCQkJc25w cmludGYocywgc2l6ZW9mKHMpLAorCQkJCSAiTGluZSBPdXQgJTAyZCBWb2x1bWUgQ29udHJvbCBQ bGF5YmFjayBFbnVtIiwKKwkJCQkgaSArIDEpOworCQkJZXJyID0gc2NhcmxldHQyX2FkZF9uZXdf Y3RsKG1peGVyLAorCQkJCQkJICAgICZzY2FybGV0dDJfc3dfaHdfZW51bV9jdGwsCisJCQkJCQkg ICAgaSwgMSwgcywgTlVMTCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9 CisJfQorCisJLyogQWRkIEhXIGJ1dHRvbiBjb250cm9scyAqLworCWZvciAoaSA9IDA7IGkgPCBw cml2YXRlLT5pbmZvLT5idXR0b25fY291bnQ7IGkrKykgeworCQllcnIgPSBzY2FybGV0dDJfYWRk X25ld19jdGwobWl4ZXIsICZzY2FybGV0dDJfYnV0dG9uX2N0bCwKKwkJCQkJICAgIGksIDEsIHNj YXJsZXR0Ml9idXR0b25fbmFtZXNbaV0sCisJCQkJCSAgICAmcHJpdmF0ZS0+YnV0dG9uX2N0bHNb aV0pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9 CisKKy8qKiogQ3JlYXRlIHRoZSBhbmFsb2d1ZSBpbnB1dCBjb250cm9scyAqKiovCisKK3N0YXRp YyBpbnQgc2NhcmxldHQyX2FkZF9saW5lX2luX2N0bHMoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZh Y2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1p eGVyLT5wcml2YXRlOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm8g PSBwcml2YXRlLT5pbmZvOworCWludCBlcnIsIGk7CisJY2hhciBzW1NORFJWX0NUTF9FTEVNX0lE X05BTUVfTUFYTEVOXTsKKworCS8qIEFkZCBpbnB1dCBsZXZlbCAobGluZS9pbnN0KSBjb250cm9s cyAqLworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5sZXZlbF9pbnB1dF9jb3VudDsgaSsrKSB7CisJ CXNucHJpbnRmKHMsIHNpemVvZihzKSwgIkxpbmUgSW4gJWQgTGV2ZWwgQ2FwdHVyZSBFbnVtIiwg aSArIDEpOworCQllcnIgPSBzY2FybGV0dDJfYWRkX25ld19jdGwobWl4ZXIsICZzY2FybGV0dDJf bGV2ZWxfZW51bV9jdGwsCisJCQkJCSAgICBpLCAxLCBzLCBOVUxMKTsKKwkJaWYgKGVyciA8IDAp CisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIEFkZCBpbnB1dCBwYWQgY29udHJvbHMgKi8KKwlm b3IgKGkgPSAwOyBpIDwgaW5mby0+cGFkX2lucHV0X2NvdW50OyBpKyspIHsKKwkJc25wcmludGYo cywgc2l6ZW9mKHMpLCAiTGluZSBJbiAlZCBQYWQgQ2FwdHVyZSBTd2l0Y2giLCBpICsgMSk7CisJ CWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwgJnNjYXJsZXR0Ml9wYWRfY3RsLAor CQkJCQkgICAgaSwgMSwgcywgTlVMTCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsK Kwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKiBNaXhlciBWb2x1bWUgQ29udHJvbHMgKioqLwor CitzdGF0aWMgaW50IHNjYXJsZXR0Ml9taXhlcl9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9s ICprY3RsLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0 cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCisJ dWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50 ID0gZWxlbS0+Y2hhbm5lbHM7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5m by0+dmFsdWUuaW50ZWdlci5tYXggPSBTQ0FSTEVUVF9NSVhFUl9NQVhfVkFMVUU7CisJdWluZm8t PnZhbHVlLmludGVnZXIuc3RlcCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Nh cmxldHQyX21peGVyX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkgICBz dHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVy X2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2NhcmxldHQy X21peGVyX2RhdGEgKnByaXZhdGUgPSBlbGVtLT5oZWFkLm1peGVyLT5wcml2YXRlOworCisJdWNv bnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwcml2YXRlLT5taXhbZWxlbS0+Y29udHJv bF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX21peGVyX2N0bF9wdXQo c3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3Zh bHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtj dGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBl bGVtLT5oZWFkLm1peGVyOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9 IG1peGVyLT5wcml2YXRlOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmlu Zm8gPSBwcml2YXRlLT5pbmZvOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRz ID0gaW5mby0+cG9ydHM7CisJaW50IG92YWwsIHZhbCwgbnVtX21peGVyX2luLCBtaXhfbnVtLCBl cnIgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisKKwlvdmFsID0g cHJpdmF0ZS0+bWl4W2VsZW0tPmNvbnRyb2xdOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRl Z2VyLnZhbHVlWzBdOworCW51bV9taXhlcl9pbiA9IHBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVf TUlYXS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXTsKKwltaXhfbnVtID0gZWxlbS0+Y29udHJvbCAv IG51bV9taXhlcl9pbjsKKworCWlmIChvdmFsID09IHZhbCkKKwkJZ290byB1bmxvY2s7CisKKwlw cml2YXRlLT5taXhbZWxlbS0+Y29udHJvbF0gPSB2YWw7CisJZXJyID0gc2NhcmxldHQyX3VzYl9z ZXRfbWl4KG1peGVyLCBtaXhfbnVtKTsKKwlpZiAoZXJyID09IDApCisJCWVyciA9IDE7CisKK3Vu bG9jazoKKwltdXRleF91bmxvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCXJldHVybiBlcnI7 Cit9CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9NSU5NQVgoCisJZGJfc2NhbGVfc2Nh cmxldHRfbWl4ZXIsCisJU0NBUkxFVFRfTUlYRVJfTUlOX0RCICogMTAwLAorCVNDQVJMRVRUX01J WEVSX01BWF9EQiAqIDEwMAorKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xf bmV3IHNjYXJsZXR0Ml9taXhlcl9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZB Q0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAor CQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCwKKwkubmFtZSA9ICIiLAorCS5pbmZv ID0gc2NhcmxldHQyX21peGVyX2N0bF9pbmZvLAorCS5nZXQgID0gc2NhcmxldHQyX21peGVyX2N0 bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0dDJfbWl4ZXJfY3RsX3B1dCwKKwkucHJpdmF0ZV92YWx1 ZSA9IFNDQVJMRVRUX01JWEVSX01BWF9EQiwgLyogbWF4IHZhbHVlICovCisJLnRsdiA9IHsgLnAg PSBkYl9zY2FsZV9zY2FybGV0dF9taXhlciB9Cit9OworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9h ZGRfbWl4ZXJfY3RscyhzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3Ry dWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGU7CisJY29u c3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBwcml2YXRlLT5pbmZvLT5wb3J0czsK KwlpbnQgZXJyLCBpLCBqOworCWludCBpbmRleDsKKwljaGFyIHNbU05EUlZfQ1RMX0VMRU1fSURf TkFNRV9NQVhMRU5dOworCisJaW50IG51bV9pbnB1dHMgPSBwb3J0c1tTQ0FSTEVUVDJfUE9SVF9U WVBFX01JWF0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50IG51bV9vdXRwdXRzID0gcG9y dHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9NSVhdLm51bVtTQ0FSTEVUVDJfUE9SVF9JTl07CisKKwlm b3IgKGkgPSAwLCBpbmRleCA9IDA7IGkgPCBudW1fb3V0cHV0czsgaSsrKSB7CisJCWZvciAoaiA9 IDA7IGogPCBudW1faW5wdXRzOyBqKyssIGluZGV4KyspIHsKKwkJCXNucHJpbnRmKHMsIHNpemVv ZihzKSwKKwkJCQkgIk1peCAlYyBJbnB1dCAlMDJkIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJICdB JyArIGksIGogKyAxKTsKKwkJCWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwgJnNj YXJsZXR0Ml9taXhlcl9jdGwsCisJCQkJCQkgICAgaW5kZXgsIDEsIHMsIE5VTEwpOworCQkJaWYg KGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisv KioqIE11eCBTb3VyY2UgU2VsZWN0aW9uIENvbnRyb2xzICoqKi8KKworc3RhdGljIGludCBzY2Fy bGV0dDJfbXV4X3NyY19lbnVtX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJ CQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IHVzYl9t aXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNjYXJs ZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gZWxlbS0+aGVhZC5taXhlci0+cHJpdmF0ZTsKKwlj b25zdCBzdHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpwb3J0cyA9IHByaXZhdGUtPmluZm8tPnBvcnRz OworCXVuc2lnbmVkIGludCBpdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbTsKKwlp bnQgaXRlbXMgPSBwcml2YXRlLT5udW1fbXV4X3NyY3M7CisJaW50IHBvcnRfdHlwZTsKKworCXVp bmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3Vu dCA9IGVsZW0tPmNoYW5uZWxzOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gaXRl bXM7CisKKwlpZiAoaXRlbSA+PSBpdGVtcykKKwkJaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJh dGVkLml0ZW0gPSBpdGVtcyAtIDE7CisKKwlmb3IgKHBvcnRfdHlwZSA9IDA7CisJICAgICBwb3J0 X3R5cGUgPCBTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UOworCSAgICAgcG9ydF90eXBlKyspIHsK KwkJaWYgKGl0ZW0gPCBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9JTl0pIHsK KwkJCXNwcmludGYodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkJCQlwb3J0c1twb3J0 X3R5cGVdLnNyY19kZXNjciwKKwkJCQlpdGVtICsgcG9ydHNbcG9ydF90eXBlXS5zcmNfbnVtX29m ZnNldCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpdGVtIC09IHBvcnRzW3BvcnRfdHlwZV0ubnVt W1NDQVJMRVRUMl9QT1JUX0lOXTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGlj IGludCBzY2FybGV0dDJfbXV4X3NyY19lbnVtX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAq a2N0bCwKKwkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlz dHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlz dHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBlbGVtLT5oZWFkLm1peGVyLT5w cml2YXRlOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHByaXZhdGUt Pm11eFtlbGVtLT5jb250cm9sXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0 dDJfbXV4X3NyY19lbnVtX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkJ ICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21p eGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX21p eGVyX2ludGVyZmFjZSAqbWl4ZXIgPSBlbGVtLT5oZWFkLm1peGVyOworCXN0cnVjdCBzY2FybGV0 dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlOworCWludCBpbmRleCA9IGVs ZW0tPmNvbnRyb2w7CisJaW50IG92YWwsIHZhbCwgZXJyID0gMDsKKworCW11dGV4X2xvY2soJnBy aXZhdGUtPmRhdGFfbXV0ZXgpOworCisJb3ZhbCA9IHByaXZhdGUtPm11eFtpbmRleF07CisJdmFs ID0gY2xhbXAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sCisJCSAgICAwTCwgcHJp dmF0ZS0+bnVtX211eF9zcmNzIC0gMUwpOworCisJaWYgKG92YWwgPT0gdmFsKQorCQlnb3RvIHVu bG9jazsKKworCXByaXZhdGUtPm11eFtpbmRleF0gPSB2YWw7CisJZXJyID0gc2NhcmxldHQyX3Vz Yl9zZXRfbXV4KG1peGVyKTsKKwlpZiAoZXJyID09IDApCisJCWVyciA9IDE7CisKK3VubG9jazoK KwltdXRleF91bmxvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzY2FybGV0dDJfbXV4X3NyY19l bnVtX2N0bCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFt ZSA9ICIiLAorCS5pbmZvID0gc2NhcmxldHQyX211eF9zcmNfZW51bV9jdGxfaW5mbywKKwkuZ2V0 ICA9IHNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsX2dldCwKKwkucHV0ICA9IHNjYXJsZXR0Ml9t dXhfc3JjX2VudW1fY3RsX3B1dCwKK307CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX2FkZF9tdXhf ZW51bXMoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVjdCBzY2Fy bGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlOworCWNvbnN0IHN0cnVj dCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0gcHJpdmF0ZS0+aW5mby0+cG9ydHM7CisJaW50IHBv cnRfdHlwZSwgY2hhbm5lbCwgaTsKKworCWZvciAoaSA9IDAsIHBvcnRfdHlwZSA9IDA7CisJICAg ICBwb3J0X3R5cGUgPCBTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UOworCSAgICAgcG9ydF90eXBl KyspIHsKKwkJZm9yIChjaGFubmVsID0gMDsKKwkJICAgICBjaGFubmVsIDwgcG9ydHNbcG9ydF90 eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXTsKKwkJICAgICBjaGFubmVsKyssIGkrKykgewor CQkJaW50IGVycjsKKwkJCWNoYXIgc1tTTkRSVl9DVExfRUxFTV9JRF9OQU1FX01BWExFTl07CisJ CQljb25zdCBjaGFyICpjb25zdCBkZXNjciA9IHBvcnRzW3BvcnRfdHlwZV0uZHN0X2Rlc2NyOwor CisJCQlzbnByaW50ZihzLCBzaXplb2YocykgLSA1LCBkZXNjciwgY2hhbm5lbCArIDEpOworCQkJ c3RyY2F0KHMsICIgRW51bSIpOworCisJCQllcnIgPSBzY2FybGV0dDJfYWRkX25ld19jdGwobWl4 ZXIsCisJCQkJCQkgICAgJnNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsLAorCQkJCQkJICAgIGks IDEsIHMsIE5VTEwpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0K KworCXJldHVybiAwOworfQorCisvKioqIE1ldGVyIENvbnRyb2xzICoqKi8KKworc3RhdGljIGlu dCBzY2FybGV0dDJfbWV0ZXJfY3RsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJ CQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgdXNiX21p eGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKworCXVpbmZvLT50eXBl ID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IGVsZW0tPmNo YW5uZWxzOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmlu dGVnZXIubWF4ID0gNDA5NTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5zdGVwID0gMTsKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbWV0ZXJfY3RsX2dldChzdHJ1Y3Qgc25k X2tjb250cm9sICprY3RsLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250 cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0 ZV9kYXRhOworCXUxNiBtZXRlcl9sZXZlbHNbU0NBUkxFVFQyX05VTV9NRVRFUlNdOworCWludCBp LCBlcnI7CisKKwllcnIgPSBzY2FybGV0dDJfdXNiX2dldF9tZXRlcl9sZXZlbHMoZWxlbS0+aGVh ZC5taXhlciwgbWV0ZXJfbGV2ZWxzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwor CWZvciAoaSA9IDA7IGkgPCBlbGVtLT5jaGFubmVsczsgaSsrKQorCQl1Y29udHJvbC0+dmFsdWUu aW50ZWdlci52YWx1ZVtpXSA9IG1ldGVyX2xldmVsc1tpXTsKKworCXJldHVybiAwOworfQorCitz dGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX21ldGVyX2N0bCA9 IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLmFjY2VzcyA9IFNORFJW X0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLAor CS5uYW1lID0gIiIsCisJLmluZm8gPSBzY2FybGV0dDJfbWV0ZXJfY3RsX2luZm8sCisJLmdldCAg PSBzY2FybGV0dDJfbWV0ZXJfY3RsX2dldAorfTsKKworc3RhdGljIGludCBzY2FybGV0dDJfYWRk X21ldGVyX2N0bChzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJcmV0dXJu IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwgJnNjYXJsZXR0Ml9tZXRlcl9jdGwsCisJCQkJ ICAgICAwLCBTQ0FSTEVUVDJfTlVNX01FVEVSUywKKwkJCQkgICAgICJMZXZlbCBNZXRlciIsIE5V TEwpOworfQorCisvKioqIEluaXRpYWxpc2F0aW9uICoqKi8KKworc3RhdGljIGludCBzY2FybGV0 dDJfY291bnRfbXV4X3NyY3MoY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMpCit7 CisJaW50IHBvcnRfdHlwZSwgY291bnQgPSAwOworCisJZm9yIChwb3J0X3R5cGUgPSAwOworCSAg ICAgcG9ydF90eXBlIDwgU0NBUkxFVFQyX1BPUlRfVFlQRV9DT1VOVDsKKwkgICAgIHBvcnRfdHlw ZSsrKQorCQljb3VudCArPSBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9JTl07 CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIERlZmF1bHQgcm91dGluZyBjb25uZWN0cyBQQ00g b3V0cHV0cyBhbmQgaW5wdXRzIHRvIEFuYWxvZ3VlLAorICogUy9QRElGLCB0aGVuIEFEQVQKKyAq Lworc3RhdGljIHZvaWQgc2NhcmxldHQyX2luaXRfcm91dGluZyh1OCAqbXV4LAorCQkJCSAgIGNv bnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzKQoreworCWludCBpLCBpbnB1dF9udW0s IGlucHV0X2NvdW50LCBwb3J0X3R5cGU7CisJaW50IG91dHB1dF9udW0sIG91dHB1dF9jb3VudCwg cG9ydF90eXBlX2Nvbm5lY3RfbnVtOworCisJc3RhdGljIGNvbnN0IGludCBjb25uZWN0X29yZGVy W10gPSB7CisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUUsCisJCVNDQVJMRVRUMl9QT1JU X1RZUEVfU1BESUYsCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfQURBVCwKKwkJLTEKKwl9OworCisJ LyogQXNzaWduIFBDTSBpbnB1dHMgKHJvdXRpbmcgb3V0cHV0cykgKi8KKwlvdXRwdXRfbnVtID0g c2NhcmxldHQyX2dldF9wb3J0X3N0YXJ0X251bShwb3J0cywKKwkJCQkJCSAgU0NBUkxFVFQyX1BP UlRfT1VULAorCQkJCQkJICBTQ0FSTEVUVDJfUE9SVF9UWVBFX1BDTSk7CisJb3V0cHV0X2NvdW50 ID0gcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9QQ01dLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRd OworCisJZm9yIChwb3J0X3R5cGUgPSBjb25uZWN0X29yZGVyW3BvcnRfdHlwZV9jb25uZWN0X251 bSA9IDBdOworCSAgICAgcG9ydF90eXBlID49IDA7CisJICAgICBwb3J0X3R5cGUgPSBjb25uZWN0 X29yZGVyWysrcG9ydF90eXBlX2Nvbm5lY3RfbnVtXSkgeworCQlpbnB1dF9udW0gPSBzY2FybGV0 dDJfZ2V0X3BvcnRfc3RhcnRfbnVtKAorCQkJcG9ydHMsIFNDQVJMRVRUMl9QT1JUX0lOLCBwb3J0 X3R5cGUpOworCQlpbnB1dF9jb3VudCA9IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJMRVRUMl9Q T1JUX0lOXTsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgaW5wdXRfY291bnQgJiYgb3V0cHV0 X2NvdW50OworCQkgICAgIGkrKywgb3V0cHV0X2NvdW50LS0pCisJCQltdXhbb3V0cHV0X251bSsr XSA9IGlucHV0X251bSsrOworCX0KKworCS8qIEFzc2lnbiBQQ00gb3V0cHV0cyAocm91dGluZyBp bnB1dHMpICovCisJaW5wdXRfbnVtID0gc2NhcmxldHQyX2dldF9wb3J0X3N0YXJ0X251bShwb3J0 cywKKwkJCQkJCSBTQ0FSTEVUVDJfUE9SVF9JTiwKKwkJCQkJCSBTQ0FSTEVUVDJfUE9SVF9UWVBF X1BDTSk7CisJaW5wdXRfY291bnQgPSBwb3J0c1tTQ0FSTEVUVDJfUE9SVF9UWVBFX1BDTV0ubnVt W1NDQVJMRVRUMl9QT1JUX0lOXTsKKworCWZvciAocG9ydF90eXBlID0gY29ubmVjdF9vcmRlcltw b3J0X3R5cGVfY29ubmVjdF9udW0gPSAwXTsKKwkgICAgIHBvcnRfdHlwZSA+PSAwOworCSAgICAg cG9ydF90eXBlID0gY29ubmVjdF9vcmRlclsrK3BvcnRfdHlwZV9jb25uZWN0X251bV0pIHsKKwkJ b3V0cHV0X251bSA9IHNjYXJsZXR0Ml9nZXRfcG9ydF9zdGFydF9udW0oCisJCQlwb3J0cywgU0NB UkxFVFQyX1BPUlRfT1VULCBwb3J0X3R5cGUpOworCQlvdXRwdXRfY291bnQgPSBwb3J0c1twb3J0 X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOworCQlmb3IgKGkgPSAwOworCQkgICAgIGkg PCBvdXRwdXRfY291bnQgJiYgaW5wdXRfY291bnQ7CisJCSAgICAgaSsrLCBpbnB1dF9jb3VudC0t KQorCQkJbXV4W291dHB1dF9udW0rK10gPSBpbnB1dF9udW0rKzsKKwl9Cit9CisKKy8qIEluaXRp YWxpc2UgcHJpdmF0ZSBkYXRhLCByb3V0aW5nLCBzZXF1ZW5jZSBudW1iZXIgKi8KK3N0YXRpYyBp bnQgc2NhcmxldHQyX2luaXRfcHJpdmF0ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4 ZXIsCisJCQkJICBjb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvICppbmZvKQorewor CXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9CisJCWt6YWxsb2Moc2l6ZW9m KHN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSksIEdGUF9LRVJORUwpOworCisJaWYgKCFwcml2 YXRlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJnByaXZhdGUtPnVzYl9tdXRl eCk7CisJbXV0ZXhfaW5pdCgmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJdGltZXJfc2V0dXAoJm1p eGVyLT50aW1lciwgc2NhcmxldHQyX2NvbmZpZ19zYXZlLCAwKTsKKwlwcml2YXRlLT5pbmZvID0g aW5mbzsKKwlwcml2YXRlLT5udW1fbXV4X3NyY3MgPSBzY2FybGV0dDJfY291bnRfbXV4X3NyY3Mo aW5mby0+cG9ydHMpOworCXByaXZhdGUtPnNjYXJsZXR0Ml9zZXEgPSAwOworCW1peGVyLT5wcml2 YXRlID0gcHJpdmF0ZTsKKworCS8qIGVub3VnaCBmb3IgdGhlIFNDQVJMRVRUMl9VU0JfREFUQV9D TUQgcmVxdWVzdCBzZW50IGJ5IHRoZSB0aW1lcgorCSAqIGNhbGxiYWNrCisJICovCisJbWl4ZXIt PnNjYXJsZXR0Ml9idWZmZXIgPSBrbWFsbG9jKAorCQlTQ0FSTEVUVDJfVVNCX1BBQ0tFVF9MRU4g KyBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7CisKKwkvKiBTZXR1cCBkZWZhdWx0IHJvdXRpbmcg Ki8KKwlzY2FybGV0dDJfaW5pdF9yb3V0aW5nKHByaXZhdGUtPm11eCwgaW5mby0+cG9ydHMpOwor CisJLyogSW5pdGlhbGlzZSB0aGUgc2VxdWVuY2UgbnVtYmVyIHVzZWQgZm9yIHRoZSBwcm9wcmll dGFyeSBjb21tYW5kcyAqLworCXJldHVybiBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJf VVNCX0lOSVRfU0VRLAorCQkJICAgICBOVUxMLCAwLCBOVUxMLCAwKTsKK30KKworLyogUmVhZCBs aW5lLWluIGNvbmZpZyBhbmQgbGluZS1vdXQgdm9sdW1lIHNldHRpbmdzIG9uIHN0YXJ0ICovCitz dGF0aWMgaW50IHNjYXJsZXR0Ml9yZWFkX2NvbmZpZ3Moc3RydWN0IHVzYl9taXhlcl9pbnRlcmZh Y2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1p eGVyLT5wcml2YXRlOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm8g PSBwcml2YXRlLT5pbmZvOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0g aW5mby0+cG9ydHM7CisJaW50IG51bV9saW5lX291dCA9CisJCXBvcnRzW1NDQVJMRVRUMl9QT1JU X1RZUEVfQU5BTE9HVUVdLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOworCXU4IGxldmVsX3N3aXRj aGVzW1NDQVJMRVRUMl9MRVZFTF9TV0lUQ0hfTUFYXTsKKwl1OCBwYWRfc3dpdGNoZXNbU0NBUkxF VFQyX1BBRF9TV0lUQ0hfTUFYXTsKKwlzdHJ1Y3Qgc2NhcmxldHQyX3VzYl92b2x1bWVfc3RhdHVz IHZvbHVtZV9zdGF0dXM7CisJaW50IGVyciwgaTsKKworCWlmIChpbmZvLT5sZXZlbF9pbnB1dF9j b3VudCkgeworCQllcnIgPSBzY2FybGV0dDJfdXNiX2dldF9jb25maWcoCisJCQltaXhlciwKKwkJ CVNDQVJMRVRUMl9DT05GSUdfTEVWRUxfU1dJVENILAorCQkJaW5mby0+bGV2ZWxfaW5wdXRfY291 bnQsCisJCQlsZXZlbF9zd2l0Y2hlcyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsK KwkJZm9yIChpID0gMDsgaSA8IGluZm8tPmxldmVsX2lucHV0X2NvdW50OyBpKyspCisJCQlwcml2 YXRlLT5sZXZlbF9zd2l0Y2hbaV0gPSBsZXZlbF9zd2l0Y2hlc1tpXTsKKwl9CisKKwlpZiAoaW5m by0+cGFkX2lucHV0X2NvdW50KSB7CisJCWVyciA9IHNjYXJsZXR0Ml91c2JfZ2V0X2NvbmZpZygK KwkJCW1peGVyLAorCQkJU0NBUkxFVFQyX0NPTkZJR19QQURfU1dJVENILAorCQkJaW5mby0+cGFk X2lucHV0X2NvdW50LAorCQkJcGFkX3N3aXRjaGVzKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1 cm4gZXJyOworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+cGFkX2lucHV0X2NvdW50OyBpKyspCisJ CQlwcml2YXRlLT5wYWRfc3dpdGNoW2ldID0gcGFkX3N3aXRjaGVzW2ldOworCX0KKworCWVyciA9 IHNjYXJsZXR0Ml91c2JfZ2V0X3ZvbHVtZV9zdGF0dXMobWl4ZXIsICZ2b2x1bWVfc3RhdHVzKTsK KwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXByaXZhdGUtPm1hc3Rlcl92b2wgPSBj bGFtcCgKKwkJdm9sdW1lX3N0YXR1cy5tYXN0ZXJfdm9sICsgU0NBUkxFVFRfVk9MVU1FX0JJQVMs CisJCTAsIFNDQVJMRVRUX1ZPTFVNRV9CSUFTKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbGlu ZV9vdXQ7IGkrKykgeworCQlpbnQgdm9sdW1lOworCisJCXByaXZhdGUtPnZvbF9zd19od19zd2l0 Y2hbaV0gPQorCQkJaW5mby0+bGluZV9vdXRfaHdfdm9sCisJCQkJJiYgdm9sdW1lX3N0YXR1cy5z d19od19zd2l0Y2hbaV07CisKKwkJdm9sdW1lID0gcHJpdmF0ZS0+dm9sX3N3X2h3X3N3aXRjaFtp XQorCQkJICAgPyB2b2x1bWVfc3RhdHVzLm1hc3Rlcl92b2wKKwkJCSAgIDogdm9sdW1lX3N0YXR1 cy5zd192b2xbaV07CisJCXZvbHVtZSA9IGNsYW1wKHZvbHVtZSArIFNDQVJMRVRUX1ZPTFVNRV9C SUFTLAorCQkJICAgICAgIDAsIFNDQVJMRVRUX1ZPTFVNRV9CSUFTKTsKKwkJcHJpdmF0ZS0+dm9s W2ldID0gdm9sdW1lOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5idXR0b25fY291bnQ7 IGkrKykKKwkJcHJpdmF0ZS0+YnV0dG9uc1tpXSA9ICEhdm9sdW1lX3N0YXR1cy5idXR0b25zW2ld OworCisJcmV0dXJuIDA7Cit9CisKKy8qIE5vdGlmeSBvbiB2b2x1bWUgY2hhbmdlICovCitzdGF0 aWMgdm9pZCBzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X3ZvbF9jaGFuZ2UoCisJc3RydWN0IHVz Yl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0 YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlOworCWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9y dHMgKnBvcnRzID0gcHJpdmF0ZS0+aW5mby0+cG9ydHM7CisJaW50IG51bV9saW5lX291dCA9CisJ CXBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUVdLm51bVtTQ0FSTEVUVDJfUE9SVF9P VVRdOworCWludCBpOworCisJcHJpdmF0ZS0+dm9sX3VwZGF0ZWQgPSAxOworCisJc25kX2N0bF9u b3RpZnkobWl4ZXItPmNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkg ICAgICAgJnByaXZhdGUtPm1hc3Rlcl92b2xfY3RsLT5pZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwg bnVtX2xpbmVfb3V0OyBpKyspIHsKKwkJaWYgKCFwcml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2ld KQorCQkJY29udGludWU7CisJCXNuZF9jdGxfbm90aWZ5KG1peGVyLT5jaGlwLT5jYXJkLCBTTkRS Vl9DVExfRVZFTlRfTUFTS19WQUxVRSwKKwkJCSAgICAgICAmcHJpdmF0ZS0+dm9sX2N0bHNbaV0t PmlkKTsKKwl9Cit9CisKKy8qIE5vdGlmeSBvbiBidXR0b24gY2hhbmdlICovCitzdGF0aWMgdm9p ZCBzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X2J1dHRvbl9jaGFuZ2UoCisJc3RydWN0IHVzYl9t aXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAq cHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlOworCWludCBpOworCisJcHJpdmF0ZS0+dm9sX3VwZGF0 ZWQgPSAxOworCisJZm9yIChpID0gMDsgaSA8IHByaXZhdGUtPmluZm8tPmJ1dHRvbl9jb3VudDsg aSsrKQorCQlzbmRfY3RsX25vdGlmeShtaXhlci0+Y2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5U X01BU0tfVkFMVUUsCisJCQkgICAgICAgJnByaXZhdGUtPmJ1dHRvbl9jdGxzW2ldLT5pZCk7Cit9 CisKKy8qIEludGVycnVwdCBjYWxsYmFjayAqLworc3RhdGljIHZvaWQgc2NhcmxldHQyX21peGVy X2ludGVycnVwdChzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZh Y2UgKm1peGVyID0gdXJiLT5jb250ZXh0OworCWludCBsZW4gPSB1cmItPmFjdHVhbF9sZW5ndGg7 CisJaW50IHVzdGF0dXMgPSB1cmItPnN0YXR1czsKKwl1MzIgZGF0YTsKKworCWlmICh1c3RhdHVz ICE9IDApCisJCWdvdG8gcmVxdWV1ZTsKKworCWlmIChsZW4gPT0gOCkgeworCQlkYXRhID0gbGUz Ml90b19jcHUoKih1MzIgKil1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCWlmIChkYXRhICYgU0NB UkxFVFQyX1VTQl9JTlRFUlJVUFRfVk9MX0NIQU5HRSkKKwkJCXNjYXJsZXR0Ml9taXhlcl9pbnRl cnJ1cHRfdm9sX2NoYW5nZShtaXhlcik7CisJCWlmIChkYXRhICYgU0NBUkxFVFQyX1VTQl9JTlRF UlJVUFRfQlVUVE9OX0NIQU5HRSkKKwkJCXNjYXJsZXR0Ml9taXhlcl9pbnRlcnJ1cHRfYnV0dG9u X2NoYW5nZShtaXhlcik7CisJfSBlbHNlIHsKKwkJdXNiX2F1ZGlvX2VycihtaXhlci0+Y2hpcCwK KwkJCSAgICAgICJzY2FybGV0dCBtaXhlciBpbnRlcnJ1cHQgbGVuZ3RoICVkXG4iLCBsZW4pOwor CX0KKworcmVxdWV1ZToKKwlpZiAodXN0YXR1cyAhPSAtRU5PRU5UICYmCisJICAgIHVzdGF0dXMg IT0gLUVDT05OUkVTRVQgJiYKKwkgICAgdXN0YXR1cyAhPSAtRVNIVVRET1dOKSB7CisJCXVyYi0+ ZGV2ID0gbWl4ZXItPmNoaXAtPmRldjsKKwkJdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlD KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX21peGVyX3N0YXR1c19jcmVhdGUoc3Ry dWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXZvaWQgKnRyYW5zZmVyX2J1ZmZl cjsKKworCWlmIChtaXhlci0+dXJiKSB7CisJCXVzYl9hdWRpb19lcnIobWl4ZXItPmNoaXAsCisJ CQkgICAgICAiJXM6IG1peGVyIHVyYiBhbHJlYWR5IGluIHVzZSFcbiIsIF9fZnVuY19fKTsKKwkJ cmV0dXJuIDA7CisJfQorCisJbWl4ZXItPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5F TCk7CisJaWYgKCFtaXhlci0+dXJiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRyYW5zZmVyX2J1 ZmZlciA9IGttYWxsb2MoU0NBUkxFVFQyX1VTQl9JTlRFUlJVUFRfTUFYX0RBVEEsIEdGUF9LRVJO RUwpOworCWlmICghdHJhbnNmZXJfYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVzYl9m aWxsX2ludF91cmIoCisJCW1peGVyLT51cmIsCisJCW1peGVyLT5jaGlwLT5kZXYsCisJCXVzYl9y Y3ZpbnRwaXBlKG1peGVyLT5jaGlwLT5kZXYsCisJCQkgICAgICAgU0NBUkxFVFQyX1VTQl9JTlRF UlJVUFRfRU5EUE9JTlQpLAorCQl0cmFuc2Zlcl9idWZmZXIsCisJCVNDQVJMRVRUMl9VU0JfSU5U RVJSVVBUX01BWF9EQVRBLAorCQlzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0LAorCQltaXhlciwK KwkJU0NBUkxFVFQyX1VTQl9JTlRFUlJVUFRfSU5URVJWQUwpOworCisJcmV0dXJuIHVzYl9zdWJt aXRfdXJiKG1peGVyLT51cmIsIEdGUF9LRVJORUwpOworfQorCisvKiBFbnRyeSBwb2ludCAqLwor aW50IHNuZF9zY2FybGV0dF9nZW4yX2NvbnRyb2xzX2NyZWF0ZShzdHJ1Y3QgdXNiX21peGVyX2lu dGVyZmFjZSAqbWl4ZXIpCit7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyAq aW5mbzsKKwlpbnQgZXJyOworCisJLyogb25seSB1c2UgVUFDX1ZFUlNJT05fMiAqLworCWlmICgh bWl4ZXItPnByb3RvY29sKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAobWl4ZXItPmNoaXAtPnVz Yl9pZCkgeworCWNhc2UgVVNCX0lEKDB4MTIzNSwgMHg4MjA0KToKKwkJaW5mbyA9ICZzMThpOF9n ZW4yX2luZm87CisJCWJyZWFrOworCWNhc2UgVVNCX0lEKDB4MTIzNSwgMHg4MjAxKToKKwkJaW5m byA9ICZzMThpMjBfZ2VuMl9pbmZvOworCQlicmVhazsKKwlkZWZhdWx0OiAvKiBkZXZpY2Ugbm90 ICh5ZXQpIHN1cHBvcnRlZCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJbml0aWFs aXNlIHByaXZhdGUgZGF0YSwgcm91dGluZywgc2VxdWVuY2UgbnVtYmVyICovCisJZXJyID0gc2Nh cmxldHQyX2luaXRfcHJpdmF0ZShtaXhlciwgaW5mbyk7CisJaWYgKGVyciA8IDApCisJCXJldHVy biBlcnI7CisKKwkvKiBSZWFkIHZvbHVtZSBsZXZlbHMgYW5kIGNvbnRyb2xzIGZyb20gdGhlIGlu dGVyZmFjZSAqLworCWVyciA9IHNjYXJsZXR0Ml9yZWFkX2NvbmZpZ3MobWl4ZXIpOworCWlmIChl cnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogQ3JlYXRlIHRoZSBhbmFsb2d1ZSBvdXRwdXQg Y29udHJvbHMgKi8KKwllcnIgPSBzY2FybGV0dDJfYWRkX2xpbmVfb3V0X2N0bHMobWl4ZXIpOwor CWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogQ3JlYXRlIHRoZSBhbmFsb2d1ZSBp bnB1dCBjb250cm9scyAqLworCWVyciA9IHNjYXJsZXR0Ml9hZGRfbGluZV9pbl9jdGxzKG1peGVy KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIENyZWF0ZSB0aGUgaW5wdXQs IG91dHB1dCwgYW5kIG1peGVyIG11eCBpbnB1dCBzZWxlY3Rpb25zICovCisJZXJyID0gc2Nhcmxl dHQyX2FkZF9tdXhfZW51bXMobWl4ZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwor CisJLyogQ3JlYXRlIHRoZSBtYXRyaXggbWl4ZXIgY29udHJvbHMgKi8KKwllcnIgPSBzY2FybGV0 dDJfYWRkX21peGVyX2N0bHMobWl4ZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwor CisJLyogQ3JlYXRlIHRoZSBsZXZlbCBtZXRlciBjb250cm9scyAqLworCWVyciA9IHNjYXJsZXR0 Ml9hZGRfbWV0ZXJfY3RsKG1peGVyKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwor CS8qIFNldCB1cCB0aGUgaW50ZXJydXB0IHBvbGxpbmcgaWYgdGhlcmUgYXJlIGhhcmR3YXJlIGJ1 dHRvbnMgKi8KKwlpZiAoaW5mby0+YnV0dG9uX2NvdW50KSB7CisJCWVyciA9IHNjYXJsZXR0Ml9t aXhlcl9zdGF0dXNfY3JlYXRlKG1peGVyKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJy OworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyX3NjYXJs ZXR0X2dlbjIuaCBiL3NvdW5kL3VzYi9taXhlcl9zY2FybGV0dF9nZW4yLmgKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi41MmUxZGFkNzdhZmQKLS0tIC9kZXYvbnVsbAor KysgYi9zb3VuZC91c2IvbWl4ZXJfc2NhcmxldHRfZ2VuMi5oCkBAIC0wLDAgKzEsNyBAQAorLyog U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKyNpZm5kZWYgX19VU0JfTUlYRVJf U0NBUkxFVFRfR0VOMl9ICisjZGVmaW5lIF9fVVNCX01JWEVSX1NDQVJMRVRUX0dFTjJfSAorCitp bnQgc25kX3NjYXJsZXR0X2dlbjJfY29udHJvbHNfY3JlYXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50 ZXJmYWNlICptaXhlcik7CisKKyNlbmRpZiAvKiBfX1VTQl9NSVhFUl9TQ0FSTEVUVF9HRU4yX0gg Ki8KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWxzYS1k ZXZlbCBtYWlsaW5nIGxpc3QKQWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnCmh0dHBzOi8vbWFp bG1hbi5hbHNhLXByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8vYWxzYS1kZXZlbAo=