From owner-freebsd-net@FreeBSD.ORG Sat Oct 30 02:22:44 2010 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1FB84106566C for ; Sat, 30 Oct 2010 02:22:44 +0000 (UTC) (envelope-from RCharlet@adaranet.com) Received: from barracuda.adaranet.com (smtp.adaranet.com [72.5.229.2]) by mx1.freebsd.org (Postfix) with ESMTP id E1F058FC0A for ; Sat, 30 Oct 2010 02:22:43 +0000 (UTC) X-ASG-Debug-ID: 1288405362-0d0f055d0001-QdxwpM Received: from SJ-EXCH-1.adaranet.com ([10.10.1.29]) by barracuda.adaranet.com with ESMTP id FBxPF3EfyouHni7r; Fri, 29 Oct 2010 19:22:42 -0700 (PDT) X-Barracuda-Envelope-From: RCharlet@adaranet.com Received: from SJ-EXCH-1.adaranet.com ([fe80::7042:d8c2:5973:c523]) by SJ-EXCH-1.adaranet.com ([fe80::7042:d8c2:5973:c523%14]) with mapi; Fri, 29 Oct 2010 19:22:42 -0700 From: "Ricky Charlet" X-Barracuda-BBL-IP: fe80::7042:d8c2:5973:c523 X-Barracuda-RBL-IP: fe80::7042:d8c2:5973:c523 To: Jack Vogel Date: Fri, 29 Oct 2010 19:22:41 -0700 X-ASG-Orig-Subj: RE: em driver problem on vmware Thread-Topic: em driver problem on vmware Thread-Index: Act31/DPHrONVwRPSea7Uf3+y7JnjgAADD/w Message-ID: <32AB5C9615CC494997D9ABB1DB12783C024CA4A7E3@SJ-EXCH-1.adaranet.com> References: <32AB5C9615CC494997D9ABB1DB12783C024CA4A7BF@SJ-EXCH-1.adaranet.com> <32AB5C9615CC494997D9ABB1DB12783C024CA4A7DF@SJ-EXCH-1.adaranet.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: multipart/mixed; boundary="_004_32AB5C9615CC494997D9ABB1DB12783C024CA4A7E3SJEXCH1adaran_" MIME-Version: 1.0 X-Barracuda-Connect: UNKNOWN[10.10.1.29] X-Barracuda-Start-Time: 1288405362 X-Barracuda-URL: http://172.16.10.203:8000/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at adaranet.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using global scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.5 X-Mailman-Approved-At: Sat, 30 Oct 2010 02:55:51 +0000 X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Cc: "freebsd-net@freebsd.org" Subject: RE: em driver problem on vmware X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 30 Oct 2010 02:22:44 -0000 --_004_32AB5C9615CC494997D9ABB1DB12783C024CA4A7E3SJEXCH1adaran_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Thanks Jack, The failure is that ifconfig is unaware of em0. My em0 is = not configured, so link partners are also unaware of it. ifconfig em0 ifconfig: interface em0 does not exist and you already have my dmes stuff on em0 (which I am now up to agreeing lo= oks positive and would not indicate a problem) My amalgamated file is a private combination of some 8.1, some 9.0, some st= uff a cohort did. We have been motivated to 'upgrade' from e1000 in 8.0 to= a newer/modified e1000 because of our desire to incorporate the altq patch= es. For the curious and the diligent, the e1000/if_em.c file I = am using is attached. Ricky From: Jack Vogel [mailto:jfvogel@gmail.com] Sent: Friday, October 29, 2010 7:13 PM To: Ricky Charlet Cc: freebsd-net@freebsd.org Subject: Re: em driver problem on vmware I remember seeing the same thing when running a FreeBSD guest on Linux/KVM, its informational, the code will enable said bits right after it says that. So, the focus should be on the data, you are saying the delivered driver in 8.0 out of the box works and which driver exactly are you trying to use, my last checked in? More on the failure, does it ping, does its link partner see anything, etc, etc.. Jack On Fri, Oct 29, 2010 at 6:27 PM, Ricky Charlet > wrote: FYI, That dmesg output I get from my franken-driver on vmware is exactly the sam= e output I get from the *working* bsd80Release on vmware: ------------cut-------------------- [root@npx7511 /usr/src/sys/dev/e1000]# dmesg | grep em0 em0: port 0x2000-0x203f mem 0= xd8940000-0xd895ffff,0xd8900000-0xd890ffff irq 18 at device 0.0 on pci2 em0: Memory Access and/or Bus Master bits were not set! em0: [FILTER] em0: Ethernet address: 00:0c:29:57:d7:7f -----------paste------------------- So I don't think the clue is hiding in dmesg. --- Ricky Charlet Adara Networks USA 408-433-4942 -----Original Message----- From: owner-freebsd-net@freebsd.org [= mailto:owner-freebsd-net@freebsd.org]= On Behalf Of Ricky Charlet Sent: Friday, October 29, 2010 5:07 PM To: freebsd-net@freebsd.org Subject: em driver problem on vmware Howdy, I have freebsd80-release with an upgraded em0 driver from freebsd8.1= (and an appropriate touch of if_var.h). I'm running an amd64 on a vmware = vm. And I see this in dmesg: ------------cut------------- em0: port 0x2000-203f mem 0xd= 8940000-0xd895ffff, 0xd8900000-0xd890ffff irq 18 at device 0.0 on pci2 em0: Memory Access and/or Bus Master bits were not set em0: [FILTER] em0: Ethernet address: 00:0c:29:57:d7:7f ------------paste------------ Now, I certainly may have done something wrong with my code switch (= just copied over the sys/dev/e1000 directory from 8.1 and defined drbr_need= s_enqueue in if_var.h). I'll start double checking. But, on the other hand, has anyone seen the new em driver working/fa= iling on a vmware vm? Thanks --- Ricky Charlet Adara Networks USA 408-433-4942 _______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org" _______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org" --_004_32AB5C9615CC494997D9ABB1DB12783C024CA4A7E3SJEXCH1adaran_ Content-Type: text/plain; name="if_em.c" Content-Description: if_em.c Content-Disposition: attachment; filename="if_em.c"; size=152527; creation-date="Fri, 29 Oct 2010 19:18:38 GMT"; modification-date="Sun, 03 Oct 2010 11:39:16 GMT" Content-Transfer-Encoding: base64 LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgoKICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAxMCwgSW50ZWwg Q29ycG9yYXRpb24gCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAKICBSZWRpc3RyaWJ1dGlvbiBh bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCiAgbW9k aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k aXRpb25zIGFyZSBtZXQ6CiAgCiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgCiAgICAgIHRoaXMgbGlzdCBv ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgCiAgIDIuIFJlZGlz dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp Z2h0IAogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93 aW5nIGRpc2NsYWltZXIgaW4gdGhlIAogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogIAogICAzLiBOZWl0aGVy IHRoZSBuYW1lIG9mIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyAK ICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k dWN0cyBkZXJpdmVkIGZyb20gCiAgICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAgCiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCiAgQU5EIEFO WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU RUQgVE8sIFRIRSAKICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g RVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgCiAgTElB QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM QVJZLCBPUiAKICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgCiAgSU5URVJSVVBUSU9O KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg SU4gCiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM SUdFTkNFIE9SIE9USEVSV0lTRSkgCiAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICBQT1NTSUJJTElUWSBP RiBTVUNIIERBTUFHRS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyokRnJlZUJTRCQqLwoKI2lm ZGVmIEhBVkVfS0VSTkVMX09QVElPTl9IRUFERVJTCiNpbmNsdWRlICJvcHRfZGV2aWNlX3BvbGxp bmcuaCIKI2luY2x1ZGUgIm9wdF9pbmV0LmgiCiNlbmRpZgoKI2luY2x1ZGUgPHN5cy9wYXJhbS5o PgojaW5jbHVkZSA8c3lzL3N5c3RtLmg+CiNpZiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA4MDAwMDAK I2luY2x1ZGUgPHN5cy9idWZfcmluZy5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy9idXMuaD4KI2lu Y2x1ZGUgPHN5cy9lbmRpYW4uaD4KI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KI2luY2x1ZGUgPHN5 cy9rdGhyZWFkLmg+CiNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CiNpbmNsdWRlIDxzeXMvbWJ1Zi5o PgojaW5jbHVkZSA8c3lzL21vZHVsZS5oPgojaW5jbHVkZSA8c3lzL3JtYW4uaD4KI2luY2x1ZGUg PHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KI2luY2x1ZGUgPHN5cy9zeXNj dGwuaD4KI2luY2x1ZGUgPHN5cy90YXNrcXVldWUuaD4KI2luY2x1ZGUgPHN5cy9ldmVudGhhbmRs ZXIuaD4KI2luY2x1ZGUgPG1hY2hpbmUvYnVzLmg+CiNpbmNsdWRlIDxtYWNoaW5lL3Jlc291cmNl Lmg+CgojaW5jbHVkZSA8bmV0L2JwZi5oPgojaW5jbHVkZSA8bmV0L2V0aGVybmV0Lmg+CiNpbmNs dWRlIDxuZXQvaWYuaD4KI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KI2luY2x1ZGUgPG5ldC9pZl9k bC5oPgojaW5jbHVkZSA8bmV0L2lmX21lZGlhLmg+CgojaW5jbHVkZSA8bmV0L2lmX3R5cGVzLmg+ CiNpbmNsdWRlIDxuZXQvaWZfdmxhbl92YXIuaD4KCiNpbmNsdWRlIDxuZXRpbmV0L2luX3N5c3Rt Lmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+ CiNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CiNpbmNsdWRlIDxuZXRpbmV0L2lwNi5oPgojaW5jbHVk ZSA8bmV0aW5ldC90Y3AuaD4KI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CgojaW5jbHVkZSA8bWFj aGluZS9pbl9ja3N1bS5oPgojaW5jbHVkZSA8ZGV2L2xlZC9sZWQuaD4KI2luY2x1ZGUgPGRldi9w Y2kvcGNpdmFyLmg+CiNpbmNsdWRlIDxkZXYvcGNpL3BjaXJlZy5oPgoKI2luY2x1ZGUgImUxMDAw X2FwaS5oIgojaW5jbHVkZSAiZTEwMDBfODI1NzEuaCIKI2luY2x1ZGUgImlmX2VtLmgiCgojaW5j bHVkZSA8c3lzL3RpbWVzcGVjLmg+CiNpbmNsdWRlIDxzeXMvc3lzcHJvdG8uaD4KCgovKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqCiAqICBTZXQgdGhpcyB0byBvbmUgdG8gZGlzcGxheSBkZWJ1ZyBzdGF0aXN0aWNzCiAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCmludAllbV9kaXNwbGF5X2RlYnVnX3N0YXRzID0gMDsKCi8qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioKICogIERyaXZlciB2ZXJzaW9uOgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpjaGFyIGVtX2RyaXZlcl92ZXJz aW9uW10gPSAiNy4wLjUiOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFBDSSBEZXZpY2UgSUQgVGFibGUK ICoKICogIFVzZWQgYnkgcHJvYmUgdG8gc2VsZWN0IGRldmljZXMgdG8gbG9hZCBvbgogKiAgTGFz dCBmaWVsZCBzdG9yZXMgYW4gaW5kZXggaW50byBlMTAwMF9zdHJpbmdzCiAqICBMYXN0IGVudHJ5 IG11c3QgYmUgYWxsIDBzCiAqCiAqICB7IFZlbmRvciBJRCwgRGV2aWNlIElELCBTdWJWZW5kb3Ig SUQsIFN1YkRldmljZSBJRCwgU3RyaW5nIEluZGV4IH0KICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBl bV92ZW5kb3JfaW5mb190IGVtX3ZlbmRvcl9pbmZvX2FycmF5W10gPQp7CgkvKiBJbnRlbChSKSBQ Uk8vMTAwMCBOZXR3b3JrIENvbm5lY3Rpb24gKi8KCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1 NzFFQl9DT1BQRVIsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAw X0RFVl9JRF84MjU3MUVCX0ZJQkVSLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4 MDg2LCBFMTAwMF9ERVZfSURfODI1NzFFQl9TRVJERVMsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQs IDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF84MjU3MUVCX1NFUkRFU19EVUFMLAoJCQkJCQlQ Q0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1NzFF Ql9TRVJERVNfUVVBRCwKCQkJCQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4 NiwgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVIsCgkJCQkJCVBDSV9BTllfSUQsIFBD SV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVS X0xQLAoJCQkJCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9E RVZfSURfODI1NzFFQl9RVUFEX0ZJQkVSLAoJCQkJCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAw fSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1NzFQVF9RVUFEX0NPUFBFUiwKCQkJCQkJUENJ X0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEXzgyNTcyRUlf Q09QUEVSLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZf SURfODI1NzJFSV9GSUJFUiwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4Niwg RTEwMDBfREVWX0lEXzgyNTcyRUlfU0VSREVTLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwK CXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1NzJFSSwJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQs IDB9LAoKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1NzNFLAkJUENJX0FOWV9JRCwgUENJX0FO WV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEXzgyNTczRV9JQU1ULAlQQ0lfQU5ZX0lE LCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1NzNMLAkJUENJX0FO WV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEXzgyNTgzViwJCVBD SV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF84MDAwM0VT MkxBTl9DT1BQRVJfU1BULAoJCQkJCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4 MDg2LCBFMTAwMF9ERVZfSURfODAwMDNFUzJMQU5fU0VSREVTX1NQVCwKCQkJCQkJUENJX0FOWV9J RCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEXzgwMDAzRVMyTEFOX0NP UFBFUl9EUFQsCgkJCQkJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUx MDAwX0RFVl9JRF84MDAwM0VTMkxBTl9TRVJERVNfRFBULAoJCQkJCQlQQ0lfQU5ZX0lELCBQQ0lf QU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfSUNIOF9JR1BfTV9BTVQsCVBDSV9B TllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9B TVQsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9J Q0g4X0lHUF9DLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9E RVZfSURfSUNIOF9JRkUsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYsIEUx MDAwX0RFVl9JRF9JQ0g4X0lGRV9HVCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4 ODA4NiwgRTEwMDBfREVWX0lEX0lDSDhfSUZFX0csCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9 LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NLAlQQ0lfQU5ZX0lELCBQQ0lfQU5Z X0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfSUNIOF84MjU2N1ZfMywJUENJX0FOWV9J RCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEX0lDSDlfSUdQX01fQU1U LAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfSUNI OV9JR1BfQU1ULAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9E RVZfSURfSUNIOV9JR1BfQywJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4Niwg RTEwMDBfREVWX0lEX0lDSDlfSUdQX00sCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAw eDgwODYsIEUxMDAwX0RFVl9JRF9JQ0g5X0lHUF9NX1YsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQs IDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9JQ0g5X0lGRSwJUENJX0FOWV9JRCwgUENJX0FO WV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEX0lDSDlfSUZFX0dULAlQQ0lfQU5ZX0lE LCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfSUNIOV9JRkVfRywJUENJ X0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEX0lDSDlfQk0s CQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfODI1 NzRMLAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lE XzgyNTc0TEEsCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9E RVZfSURfSUNIMTBfUl9CTV9MTSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4 NiwgRTEwMDBfREVWX0lEX0lDSDEwX1JfQk1fTEYsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9 LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9JQ0gxMF9SX0JNX1YsCVBDSV9BTllfSUQsIFBDSV9B TllfSUQsIDB9LAoJeyAweDgwODYsIEUxMDAwX0RFVl9JRF9JQ0gxMF9EX0JNX0xNLAlQQ0lfQU5Z X0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9ERVZfSURfSUNIMTBfRF9CTV9M RiwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7IDB4ODA4NiwgRTEwMDBfREVWX0lEX1BD SF9NX0hWX0xNLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwfSwKCXsgMHg4MDg2LCBFMTAwMF9E RVZfSURfUENIX01fSFZfTEMsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB9LAoJeyAweDgwODYs IEUxMDAwX0RFVl9JRF9QQ0hfRF9IVl9ETSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMH0sCgl7 IDB4ODA4NiwgRTEwMDBfREVWX0lEX1BDSF9EX0hWX0RDLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lE LCAwfSwKCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KCXsgMCwgMCwgMCwgMCwgMH0KfTsKCi8q KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioKICogIFRhYmxlIG9mIGJyYW5kaW5nIHN0cmluZ3MgZm9yIGFsbCBzdXBwb3J0 ZWQgTklDcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBjaGFyICplbV9zdHJpbmdzW10gPSB7Cgki SW50ZWwoUikgUFJPLzEwMDAgTmV0d29yayBDb25uZWN0aW9uIgp9OwoKLyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgog KiAgRnVuY3Rpb24gcHJvdG90eXBlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CWVtX3Byb2Jl KGRldmljZV90KTsKc3RhdGljIGludAllbV9hdHRhY2goZGV2aWNlX3QpOwpzdGF0aWMgaW50CWVt X2RldGFjaChkZXZpY2VfdCk7CnN0YXRpYyBpbnQJZW1fc2h1dGRvd24oZGV2aWNlX3QpOwpzdGF0 aWMgaW50CWVtX3N1c3BlbmQoZGV2aWNlX3QpOwpzdGF0aWMgaW50CWVtX3Jlc3VtZShkZXZpY2Vf dCk7CnN0YXRpYyB2b2lkCWVtX3N0YXJ0KHN0cnVjdCBpZm5ldCAqKTsKc3RhdGljIHZvaWQJZW1f c3RhcnRfbG9ja2VkKHN0cnVjdCBpZm5ldCAqLCBzdHJ1Y3QgdHhfcmluZyAqKTsKI2lmZGVmIEVN X01VTFRJUVVFVUUKc3RhdGljIGludAllbV9tcV9zdGFydChzdHJ1Y3QgaWZuZXQgKiwgc3RydWN0 IG1idWYgKik7CnN0YXRpYyBpbnQJZW1fbXFfc3RhcnRfbG9ja2VkKHN0cnVjdCBpZm5ldCAqLAoJ CSAgICBzdHJ1Y3QgdHhfcmluZyAqLCBzdHJ1Y3QgbWJ1ZiAqKTsKc3RhdGljIHZvaWQJZW1fcWZs dXNoKHN0cnVjdCBpZm5ldCAqKTsKI2VuZGlmCnN0YXRpYyBpbnQJZW1faW9jdGwoc3RydWN0IGlm bmV0ICosIHVfbG9uZywgY2FkZHJfdCk7CnN0YXRpYyB2b2lkCWVtX2luaXQodm9pZCAqKTsKc3Rh dGljIHZvaWQJZW1faW5pdF9sb2NrZWQoc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2b2lkCWVt X3N0b3Aodm9pZCAqKTsKc3RhdGljIHZvaWQJZW1fbWVkaWFfc3RhdHVzKHN0cnVjdCBpZm5ldCAq LCBzdHJ1Y3QgaWZtZWRpYXJlcSAqKTsKc3RhdGljIGludAllbV9tZWRpYV9jaGFuZ2Uoc3RydWN0 IGlmbmV0ICopOwpzdGF0aWMgdm9pZAllbV9pZGVudGlmeV9oYXJkd2FyZShzdHJ1Y3QgYWRhcHRl ciAqKTsKc3RhdGljIGludAllbV9hbGxvY2F0ZV9wY2lfcmVzb3VyY2VzKHN0cnVjdCBhZGFwdGVy ICopOwpzdGF0aWMgaW50CWVtX2FsbG9jYXRlX2xlZ2FjeShzdHJ1Y3QgYWRhcHRlciAqKTsKc3Rh dGljIGludAllbV9hbGxvY2F0ZV9tc2l4KHN0cnVjdCBhZGFwdGVyICopOwpzdGF0aWMgaW50CWVt X2FsbG9jYXRlX3F1ZXVlcyhzdHJ1Y3QgYWRhcHRlciAqKTsKc3RhdGljIGludAllbV9zZXR1cF9t c2l4KHN0cnVjdCBhZGFwdGVyICopOwpzdGF0aWMgdm9pZAllbV9mcmVlX3BjaV9yZXNvdXJjZXMo c3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2b2lkCWVtX2xvY2FsX3RpbWVyKHZvaWQgKik7CnN0 YXRpYyB2b2lkCWVtX3Jlc2V0KHN0cnVjdCBhZGFwdGVyICopOwpzdGF0aWMgdm9pZAllbV9zZXR1 cF9pbnRlcmZhY2UoZGV2aWNlX3QsIHN0cnVjdCBhZGFwdGVyICopOwoKc3RhdGljIHZvaWQJZW1f c2V0dXBfdHJhbnNtaXRfc3RydWN0dXJlcyhzdHJ1Y3QgYWRhcHRlciAqKTsKc3RhdGljIHZvaWQJ ZW1faW5pdGlhbGl6ZV90cmFuc21pdF91bml0KHN0cnVjdCBhZGFwdGVyICopOwpzdGF0aWMgaW50 CWVtX2FsbG9jYXRlX3RyYW5zbWl0X2J1ZmZlcnMoc3RydWN0IHR4X3JpbmcgKik7CnN0YXRpYyB2 b2lkCWVtX2ZyZWVfdHJhbnNtaXRfc3RydWN0dXJlcyhzdHJ1Y3QgYWRhcHRlciAqKTsKc3RhdGlj IHZvaWQJZW1fZnJlZV90cmFuc21pdF9idWZmZXJzKHN0cnVjdCB0eF9yaW5nICopOwoKc3RhdGlj IGludAllbV9zZXR1cF9yZWNlaXZlX3N0cnVjdHVyZXMoc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRp YyBpbnQJZW1fYWxsb2NhdGVfcmVjZWl2ZV9idWZmZXJzKHN0cnVjdCByeF9yaW5nICopOwpzdGF0 aWMgdm9pZAllbV9pbml0aWFsaXplX3JlY2VpdmVfdW5pdChzdHJ1Y3QgYWRhcHRlciAqKTsKc3Rh dGljIHZvaWQJZW1fZnJlZV9yZWNlaXZlX3N0cnVjdHVyZXMoc3RydWN0IGFkYXB0ZXIgKik7CnN0 YXRpYyB2b2lkCWVtX2ZyZWVfcmVjZWl2ZV9idWZmZXJzKHN0cnVjdCByeF9yaW5nICopOwoKc3Rh dGljIHZvaWQJZW1fZW5hYmxlX2ludHIoc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2b2lkCWVt X2Rpc2FibGVfaW50cihzdHJ1Y3QgYWRhcHRlciAqKTsKc3RhdGljIHZvaWQJZW1fdXBkYXRlX3N0 YXRzX2NvdW50ZXJzKHN0cnVjdCBhZGFwdGVyICopOwpzdGF0aWMgdm9pZAllbV9hZGRfaHdfc3Rh dHMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwpzdGF0aWMgYm9vbAllbV90eGVvZihzdHJ1Y3Qg dHhfcmluZyAqKTsKc3RhdGljIGJvb2wJZW1fcnhlb2Yoc3RydWN0IHJ4X3JpbmcgKiwgaW50LCBp bnQgKik7CiNpZm5kZWYgX19OT19TVFJJQ1RfQUxJR05NRU5UCnN0YXRpYyBpbnQJZW1fZml4dXBf cngoc3RydWN0IHJ4X3JpbmcgKik7CiNlbmRpZgpzdGF0aWMgdm9pZAllbV9yZWNlaXZlX2NoZWNr c3VtKHN0cnVjdCBlMTAwMF9yeF9kZXNjICosIHN0cnVjdCBtYnVmICopOwpzdGF0aWMgdm9pZAll bV90cmFuc21pdF9jaGVja3N1bV9zZXR1cChzdHJ1Y3QgdHhfcmluZyAqLCBzdHJ1Y3QgbWJ1ZiAq LAoJCSAgICB1MzIgKiwgdTMyICopOwpzdGF0aWMgYm9vbAllbV90c29fc2V0dXAoc3RydWN0IHR4 X3JpbmcgKiwgc3RydWN0IG1idWYgKiwgdTMyICosIHUzMiAqKTsKc3RhdGljIHZvaWQJZW1fc2V0 X3Byb21pc2Moc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2b2lkCWVtX2Rpc2FibGVfcHJvbWlz YyhzdHJ1Y3QgYWRhcHRlciAqKTsKc3RhdGljIHZvaWQJZW1fc2V0X211bHRpKHN0cnVjdCBhZGFw dGVyICopOwpzdGF0aWMgdm9pZAllbV91cGRhdGVfbGlua19zdGF0dXMoc3RydWN0IGFkYXB0ZXIg Kik7CnN0YXRpYyB2b2lkCWVtX3JlZnJlc2hfbWJ1ZnMoc3RydWN0IHJ4X3JpbmcgKiwgaW50KTsK c3RhdGljIHZvaWQJZW1fcmVnaXN0ZXJfdmxhbih2b2lkICosIHN0cnVjdCBpZm5ldCAqLCB1MTYp OwpzdGF0aWMgdm9pZAllbV91bnJlZ2lzdGVyX3ZsYW4odm9pZCAqLCBzdHJ1Y3QgaWZuZXQgKiwg dTE2KTsKc3RhdGljIHZvaWQJZW1fc2V0dXBfdmxhbl9od19zdXBwb3J0KHN0cnVjdCBhZGFwdGVy ICopOwpzdGF0aWMgaW50CWVtX3htaXQoc3RydWN0IHR4X3JpbmcgKiwgc3RydWN0IG1idWYgKiop OwpzdGF0aWMgaW50CWVtX2RtYV9tYWxsb2Moc3RydWN0IGFkYXB0ZXIgKiwgYnVzX3NpemVfdCwK CQkgICAgc3RydWN0IGVtX2RtYV9hbGxvYyAqLCBpbnQpOwpzdGF0aWMgdm9pZAllbV9kbWFfZnJl ZShzdHJ1Y3QgYWRhcHRlciAqLCBzdHJ1Y3QgZW1fZG1hX2FsbG9jICopOwpzdGF0aWMgaW50CWVt X3N5c2N0bF9udm1faW5mbyhTWVNDVExfSEFORExFUl9BUkdTKTsKc3RhdGljIHZvaWQJZW1fcHJp bnRfbnZtX2luZm8oc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyBpbnQgCWVtX2lzX3ZhbGlkX2V0 aGVyX2FkZHIodTggKik7CnN0YXRpYyBpbnQJZW1fc3lzY3RsX2ludF9kZWxheShTWVNDVExfSEFO RExFUl9BUkdTKTsKc3RhdGljIHZvaWQJZW1fYWRkX2ludF9kZWxheV9zeXNjdGwoc3RydWN0IGFk YXB0ZXIgKiwgY29uc3QgY2hhciAqLAoJCSAgICBjb25zdCBjaGFyICosIHN0cnVjdCBlbV9pbnRf ZGVsYXlfaW5mbyAqLCBpbnQsIGludCk7Ci8qIE1hbmFnZW1lbnQgYW5kIFdPTCBTdXBwb3J0ICov CnN0YXRpYyB2b2lkCWVtX2luaXRfbWFuYWdlYWJpbGl0eShzdHJ1Y3QgYWRhcHRlciAqKTsKc3Rh dGljIHZvaWQJZW1fcmVsZWFzZV9tYW5hZ2VhYmlsaXR5KHN0cnVjdCBhZGFwdGVyICopOwpzdGF0 aWMgdm9pZCAgICAgZW1fZ2V0X2h3X2NvbnRyb2woc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2 b2lkICAgICBlbV9yZWxlYXNlX2h3X2NvbnRyb2woc3RydWN0IGFkYXB0ZXIgKik7CnN0YXRpYyB2 b2lkCWVtX2dldF93YWtldXAoZGV2aWNlX3QpOwpzdGF0aWMgdm9pZCAgICAgZW1fZW5hYmxlX3dh a2V1cChkZXZpY2VfdCk7CnN0YXRpYyBpbnQJZW1fZW5hYmxlX3BoeV93YWtldXAoc3RydWN0IGFk YXB0ZXIgKik7CnN0YXRpYyB2b2lkCWVtX2xlZF9mdW5jKHZvaWQgKiwgaW50KTsKCnN0YXRpYyBp bnQJZW1faXJxX2Zhc3Qodm9pZCAqKTsKCi8qIE1TSVggaGFuZGxlcnMgKi8Kc3RhdGljIHZvaWQJ ZW1fbXNpeF90eCh2b2lkICopOwpzdGF0aWMgdm9pZAllbV9tc2l4X3J4KHZvaWQgKik7CnN0YXRp YyB2b2lkCWVtX21zaXhfbGluayh2b2lkICopOwpzdGF0aWMgdm9pZAllbV9oYW5kbGVfdHgodm9p ZCAqY29udGV4dCwgaW50IHBlbmRpbmcpOwpzdGF0aWMgdm9pZAllbV9oYW5kbGVfcngodm9pZCAq Y29udGV4dCwgaW50IHBlbmRpbmcpOwpzdGF0aWMgdm9pZAllbV9oYW5kbGVfbGluayh2b2lkICpj b250ZXh0LCBpbnQgcGVuZGluZyk7CgpzdGF0aWMgdm9pZAllbV9hZGRfcnhfcHJvY2Vzc19saW1p dChzdHJ1Y3QgYWRhcHRlciAqLCBjb25zdCBjaGFyICosCgkJICAgIGNvbnN0IGNoYXIgKiwgaW50 ICosIGludCk7CgojaWZkZWYgREVWSUNFX1BPTExJTkcKc3RhdGljIHBvbGxfaGFuZGxlcl90IGVt X3BvbGw7CiNlbmRpZiAvKiBQT0xMSU5HICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBGcmVlQlNEIERl dmljZSBJbnRlcmZhY2UgRW50cnkgUG9pbnRzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgZGV2aWNl X21ldGhvZF90IGVtX21ldGhvZHNbXSA9IHsKCS8qIERldmljZSBpbnRlcmZhY2UgKi8KCURFVk1F VEhPRChkZXZpY2VfcHJvYmUsIGVtX3Byb2JlKSwKCURFVk1FVEhPRChkZXZpY2VfYXR0YWNoLCBl bV9hdHRhY2gpLAoJREVWTUVUSE9EKGRldmljZV9kZXRhY2gsIGVtX2RldGFjaCksCglERVZNRVRI T0QoZGV2aWNlX3NodXRkb3duLCBlbV9zaHV0ZG93biksCglERVZNRVRIT0QoZGV2aWNlX3N1c3Bl bmQsIGVtX3N1c3BlbmQpLAoJREVWTUVUSE9EKGRldmljZV9yZXN1bWUsIGVtX3Jlc3VtZSksCgl7 MCwgMH0KfTsKCnN0YXRpYyBkcml2ZXJfdCBlbV9kcml2ZXIgPSB7CgkiZW0iLCBlbV9tZXRob2Rz LCBzaXplb2Yoc3RydWN0IGFkYXB0ZXIpLAp9OwoKZGV2Y2xhc3NfdCBlbV9kZXZjbGFzczsKRFJJ VkVSX01PRFVMRShlbSwgcGNpLCBlbV9kcml2ZXIsIGVtX2RldmNsYXNzLCAwLCAwKTsKTU9EVUxF X0RFUEVORChlbSwgcGNpLCAxLCAxLCAxKTsKTU9EVUxFX0RFUEVORChlbSwgZXRoZXIsIDEsIDEs IDEpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKgogKiAgVHVuYWJsZSBkZWZhdWx0IHZhbHVlcy4KICoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KCiNkZWZpbmUgRU1fVElDS1NfVE9fVVNFQ1ModGlja3MpCSgoMTAyNCAqICh0aWNrcykg KyA1MDApIC8gMTAwMCkKI2RlZmluZSBFTV9VU0VDU19UT19USUNLUyh1c2VjcykJKCgxMDAwICog KHVzZWNzKSArIDUxMikgLyAxMDI0KQojZGVmaW5lIE1fVFNPX0xFTgkJCTY2CgovKiBBbGxvdyBj b21tb24gY29kZSB3aXRob3V0IFRTTyAqLwojaWZuZGVmIENTVU1fVFNPCiNkZWZpbmUgQ1NVTV9U U08JMAojZW5kaWYKCnN0YXRpYyBpbnQgZW1fdHhfaW50X2RlbGF5X2RmbHQgPSBFTV9USUNLU19U T19VU0VDUyhFTV9USURWKTsKc3RhdGljIGludCBlbV9yeF9pbnRfZGVsYXlfZGZsdCA9IEVNX1RJ Q0tTX1RPX1VTRUNTKEVNX1JEVFIpOwpUVU5BQkxFX0lOVCgiaHcuZW0udHhfaW50X2RlbGF5Iiwg JmVtX3R4X2ludF9kZWxheV9kZmx0KTsKVFVOQUJMRV9JTlQoImh3LmVtLnJ4X2ludF9kZWxheSIs ICZlbV9yeF9pbnRfZGVsYXlfZGZsdCk7CgpzdGF0aWMgaW50IGVtX3R4X2Fic19pbnRfZGVsYXlf ZGZsdCA9IEVNX1RJQ0tTX1RPX1VTRUNTKEVNX1RBRFYpOwpzdGF0aWMgaW50IGVtX3J4X2Fic19p bnRfZGVsYXlfZGZsdCA9IEVNX1RJQ0tTX1RPX1VTRUNTKEVNX1JBRFYpOwpUVU5BQkxFX0lOVCgi aHcuZW0udHhfYWJzX2ludF9kZWxheSIsICZlbV90eF9hYnNfaW50X2RlbGF5X2RmbHQpOwpUVU5B QkxFX0lOVCgiaHcuZW0ucnhfYWJzX2ludF9kZWxheSIsICZlbV9yeF9hYnNfaW50X2RlbGF5X2Rm bHQpOwoKc3RhdGljIGludCBlbV9yeGQgPSBFTV9ERUZBVUxUX1JYRDsKc3RhdGljIGludCBlbV90 eGQgPSBFTV9ERUZBVUxUX1RYRDsKVFVOQUJMRV9JTlQoImh3LmVtLnJ4ZCIsICZlbV9yeGQpOwpU VU5BQkxFX0lOVCgiaHcuZW0udHhkIiwgJmVtX3R4ZCk7CgpzdGF0aWMgaW50IGVtX3NtYXJ0X3B3 cl9kb3duID0gRkFMU0U7ClRVTkFCTEVfSU5UKCJody5lbS5zbWFydF9wd3JfZG93biIsICZlbV9z bWFydF9wd3JfZG93bik7CgovKiBDb250cm9scyB3aGV0aGVyIHByb21pc2N1b3VzIGFsc28gc2hv d3MgYmFkIHBhY2tldHMgKi8Kc3RhdGljIGludCBlbV9kZWJ1Z19zYnAgPSBGQUxTRTsKVFVOQUJM RV9JTlQoImh3LmVtLnNicCIsICZlbV9kZWJ1Z19zYnApOwoKLyogTG9jYWwgY29udHJvbHMgZm9y IE1TSS9NU0lYICovCiNpZmRlZiBFTV9NVUxUSVFVRVVFCnN0YXRpYyBpbnQgZW1fZW5hYmxlX21z aXggPSBUUlVFOwpzdGF0aWMgaW50IGVtX21zaXhfcXVldWVzID0gMjsgLyogZm9yIDgyNTc0LCBj YW4gYmUgMSBvciAyICovCiNlbHNlCnN0YXRpYyBpbnQgZW1fZW5hYmxlX21zaXggPSBGQUxTRTsK c3RhdGljIGludCBlbV9tc2l4X3F1ZXVlcyA9IDA7IC8qIGRpc2FibGUgKi8KI2VuZGlmClRVTkFC TEVfSU5UKCJody5lbS5lbmFibGVfbXNpeCIsICZlbV9lbmFibGVfbXNpeCk7ClRVTkFCTEVfSU5U KCJody5lbS5tc2l4X3F1ZXVlcyIsICZlbV9tc2l4X3F1ZXVlcyk7CgovKiBIb3cgbWFueSBwYWNr ZXRzIHJ4ZW9mIHRyaWVzIHRvIGNsZWFuIGF0IGEgdGltZSAqLwpzdGF0aWMgaW50IGVtX3J4X3By b2Nlc3NfbGltaXQgPSAxMDA7ClRVTkFCTEVfSU5UKCJody5lbS5yeF9wcm9jZXNzX2xpbWl0Iiwg JmVtX3J4X3Byb2Nlc3NfbGltaXQpOwoKLyogRmxvdyBjb250cm9sIHNldHRpbmcgLSBkZWZhdWx0 IHRvIEZVTEwgKi8Kc3RhdGljIGludCBlbV9mY19zZXR0aW5nID0gZTEwMDBfZmNfZnVsbDsKVFVO QUJMRV9JTlQoImh3LmVtLmZjX3NldHRpbmciLCAmZW1fZmNfc2V0dGluZyk7CgovKgoqKiBTaGFk b3cgVkZUQSB0YWJsZSwgdGhpcyBpcyBuZWVkZWQgYmVjYXVzZQoqKiB0aGUgcmVhbCB2bGFuIGZp bHRlciB0YWJsZSBnZXRzIGNsZWFyZWQgZHVyaW5nCioqIGEgc29mdCByZXNldCBhbmQgdGhlIGRy aXZlciBuZWVkcyB0byBiZSBhYmxlCioqIHRvIHJlcG9wdWxhdGUgaXQuCiovCnN0YXRpYyB1MzIg ZW1fc2hhZG93X3ZmdGFbRU1fVkZUQV9TSVpFXTsKCi8qIEdsb2JhbCB1c2VkIGluIFdPTCBzZXR1 cCB3aXRoIG11bHRpcG9ydCBjYXJkcyAqLwpzdGF0aWMgaW50IGdsb2JhbF9xdWFkX3BvcnRfYSA9 IDA7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqCiAqICBEZXZpY2UgaWRlbnRpZmljYXRpb24gcm91dGluZQogKgog KiAgZW1fcHJvYmUgZGV0ZXJtaW5lcyBpZiB0aGUgZHJpdmVyIHNob3VsZCBiZSBsb2FkZWQgb24K ICogIGFkYXB0ZXIgYmFzZWQgb24gUENJIHZlbmRvci9kZXZpY2UgaWQgb2YgdGhlIGFkYXB0ZXIu CiAqCiAqICByZXR1cm4gQlVTX1BST0JFX0RFRkFVTFQgb24gc3VjY2VzcywgcG9zaXRpdmUgb24g ZmFpbHVyZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludAplbV9wcm9iZShkZXZpY2VfdCBkZXYp CnsKCWNoYXIJCWFkYXB0ZXJfbmFtZVs2MF07Cgl1MTYJCXBjaV92ZW5kb3JfaWQgPSAwOwoJdTE2 CQlwY2lfZGV2aWNlX2lkID0gMDsKCXUxNgkJcGNpX3N1YnZlbmRvcl9pZCA9IDA7Cgl1MTYJCXBj aV9zdWJkZXZpY2VfaWQgPSAwOwoJZW1fdmVuZG9yX2luZm9fdCAqZW50OwoKCUlOSVRfREVCVUdP VVQoImVtX3Byb2JlOiBiZWdpbiIpOwoKCXBjaV92ZW5kb3JfaWQgPSBwY2lfZ2V0X3ZlbmRvcihk ZXYpOwoJaWYgKHBjaV92ZW5kb3JfaWQgIT0gRU1fVkVORE9SX0lEKQoJCXJldHVybiAoRU5YSU8p OwoKCXBjaV9kZXZpY2VfaWQgPSBwY2lfZ2V0X2RldmljZShkZXYpOwoJcGNpX3N1YnZlbmRvcl9p ZCA9IHBjaV9nZXRfc3VidmVuZG9yKGRldik7CglwY2lfc3ViZGV2aWNlX2lkID0gcGNpX2dldF9z dWJkZXZpY2UoZGV2KTsKCgllbnQgPSBlbV92ZW5kb3JfaW5mb19hcnJheTsKCXdoaWxlIChlbnQt PnZlbmRvcl9pZCAhPSAwKSB7CgkJaWYgKChwY2lfdmVuZG9yX2lkID09IGVudC0+dmVuZG9yX2lk KSAmJgoJCSAgICAocGNpX2RldmljZV9pZCA9PSBlbnQtPmRldmljZV9pZCkgJiYKCgkJICAgICgo cGNpX3N1YnZlbmRvcl9pZCA9PSBlbnQtPnN1YnZlbmRvcl9pZCkgfHwKCQkgICAgKGVudC0+c3Vi dmVuZG9yX2lkID09IFBDSV9BTllfSUQpKSAmJgoKCQkgICAgKChwY2lfc3ViZGV2aWNlX2lkID09 IGVudC0+c3ViZGV2aWNlX2lkKSB8fAoJCSAgICAoZW50LT5zdWJkZXZpY2VfaWQgPT0gUENJX0FO WV9JRCkpKSB7CgkJCXNwcmludGYoYWRhcHRlcl9uYW1lLCAiJXMgJXMiLAoJCQkJZW1fc3RyaW5n c1tlbnQtPmluZGV4XSwKCQkJCWVtX2RyaXZlcl92ZXJzaW9uKTsKCQkJZGV2aWNlX3NldF9kZXNj X2NvcHkoZGV2LCBhZGFwdGVyX25hbWUpOwoJCQlyZXR1cm4gKEJVU19QUk9CRV9ERUZBVUxUKTsK CQl9CgkJZW50Kys7Cgl9CgoJcmV0dXJuIChFTlhJTyk7Cn0KCi8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIERl dmljZSBpbml0aWFsaXphdGlvbiByb3V0aW5lCiAqCiAqICBUaGUgYXR0YWNoIGVudHJ5IHBvaW50 IGlzIGNhbGxlZCB3aGVuIHRoZSBkcml2ZXIgaXMgYmVpbmcgbG9hZGVkLgogKiAgVGhpcyByb3V0 aW5lIGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgaGFyZHdhcmUsIGFsbG9jYXRlcyBhbGwgcmVzb3Vy Y2VzCiAqICBhbmQgaW5pdGlhbGl6ZXMgdGhlIGhhcmR3YXJlLgogKgogKiAgcmV0dXJuIDAgb24g c3VjY2VzcywgcG9zaXRpdmUgb24gZmFpbHVyZQogKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludApl bV9hdHRhY2goZGV2aWNlX3QgZGV2KQp7CglzdHJ1Y3QgYWRhcHRlcgkqYWRhcHRlcjsKCWludAkJ ZXJyb3IgPSAwOwoKCUlOSVRfREVCVUdPVVQoImVtX2F0dGFjaDogYmVnaW4iKTsKCglhZGFwdGVy ID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOwoJYWRhcHRlci0+ZGV2ID0gYWRhcHRlci0+b3NkZXAu ZGV2ID0gZGV2OwoJRU1fQ09SRV9MT0NLX0lOSVQoYWRhcHRlciwgZGV2aWNlX2dldF9uYW1ldW5p dChkZXYpKTsKCgkvKiBTWVNDVEwgc3R1ZmYgKi8KCVNZU0NUTF9BRERfUFJPQyhkZXZpY2VfZ2V0 X3N5c2N0bF9jdHgoZGV2KSwKCSAgICBTWVNDVExfQ0hJTERSRU4oZGV2aWNlX2dldF9zeXNjdGxf dHJlZShkZXYpKSwKCSAgICBPSURfQVVUTywgIm52bSIsIENUTFRZUEVfSU5UfENUTEZMQUdfUlcs IGFkYXB0ZXIsIDAsCgkgICAgZW1fc3lzY3RsX252bV9pbmZvLCAiSSIsICJOVk0gSW5mb3JtYXRp b24iKTsKCgljYWxsb3V0X2luaXRfbXR4KCZhZGFwdGVyLT50aW1lciwgJmFkYXB0ZXItPmNvcmVf bXR4LCAwKTsKCgkvKiBEZXRlcm1pbmUgaGFyZHdhcmUgYW5kIG1hYyBpbmZvICovCgllbV9pZGVu dGlmeV9oYXJkd2FyZShhZGFwdGVyKTsKCgkvKiBTZXR1cCBQQ0kgcmVzb3VyY2VzICovCglpZiAo ZW1fYWxsb2NhdGVfcGNpX3Jlc291cmNlcyhhZGFwdGVyKSkgewoJCWRldmljZV9wcmludGYoZGV2 LCAiQWxsb2NhdGlvbiBvZiBQQ0kgcmVzb3VyY2VzIGZhaWxlZFxuIik7CgkJZXJyb3IgPSBFTlhJ TzsKCQlnb3RvIGVycl9wY2k7Cgl9CgoJLyoKCSoqIEZvciBJQ0g4IGFuZCBmYW1pbHkgd2UgbmVl ZCB0bwoJKiogbWFwIHRoZSBmbGFzaCBtZW1vcnksIGFuZCB0aGlzCgkqKiBtdXN0IGhhcHBlbiBh ZnRlciB0aGUgTUFDIGlzIAoJKiogaWRlbnRpZmllZAoJKi8KCWlmICgoYWRhcHRlci0+aHcubWFj LnR5cGUgPT0gZTEwMDBfaWNoOGxhbikgfHwKCSAgICAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0g ZTEwMDBfcGNobGFuKSB8fAoJICAgIChhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF9pY2g5 bGFuKSB8fAoJICAgIChhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF9pY2gxMGxhbikpIHsK CQlpbnQgcmlkID0gRU1fQkFSX1RZUEVfRkxBU0g7CgkJYWRhcHRlci0+Zmxhc2ggPSBidXNfYWxs b2NfcmVzb3VyY2VfYW55KGRldiwKCQkgICAgU1lTX1JFU19NRU1PUlksICZyaWQsIFJGX0FDVElW RSk7CgkJaWYgKGFkYXB0ZXItPmZsYXNoID09IE5VTEwpIHsKCQkJZGV2aWNlX3ByaW50ZihkZXYs ICJNYXBwaW5nIG9mIEZsYXNoIGZhaWxlZFxuIik7CgkJCWVycm9yID0gRU5YSU87CgkJCWdvdG8g ZXJyX3BjaTsKCQl9CgkJLyogVGhpcyBpcyB1c2VkIGluIHRoZSBzaGFyZWQgY29kZSAqLwoJCWFk YXB0ZXItPmh3LmZsYXNoX2FkZHJlc3MgPSAodTggKilhZGFwdGVyLT5mbGFzaDsKCQlhZGFwdGVy LT5vc2RlcC5mbGFzaF9idXNfc3BhY2VfdGFnID0KCQkgICAgcm1hbl9nZXRfYnVzdGFnKGFkYXB0 ZXItPmZsYXNoKTsKCQlhZGFwdGVyLT5vc2RlcC5mbGFzaF9idXNfc3BhY2VfaGFuZGxlID0KCQkg ICAgcm1hbl9nZXRfYnVzaGFuZGxlKGFkYXB0ZXItPmZsYXNoKTsKCX0KCgkvKiBEbyBTaGFyZWQg Q29kZSBpbml0aWFsaXphdGlvbiAqLwoJaWYgKGUxMDAwX3NldHVwX2luaXRfZnVuY3MoJmFkYXB0 ZXItPmh3LCBUUlVFKSkgewoJCWRldmljZV9wcmludGYoZGV2LCAiU2V0dXAgb2YgU2hhcmVkIGNv ZGUgZmFpbGVkXG4iKTsKCQllcnJvciA9IEVOWElPOwoJCWdvdG8gZXJyX3BjaTsKCX0KCgllMTAw MF9nZXRfYnVzX2luZm8oJmFkYXB0ZXItPmh3KTsKCgkvKiBTZXQgdXAgc29tZSBzeXNjdGxzIGZv ciB0aGUgdHVuYWJsZSBpbnRlcnJ1cHQgZGVsYXlzICovCgllbV9hZGRfaW50X2RlbGF5X3N5c2N0 bChhZGFwdGVyLCAicnhfaW50X2RlbGF5IiwKCSAgICAicmVjZWl2ZSBpbnRlcnJ1cHQgZGVsYXkg aW4gdXNlY3MiLCAmYWRhcHRlci0+cnhfaW50X2RlbGF5LAoJICAgIEUxMDAwX1JFR0lTVEVSKCZh ZGFwdGVyLT5odywgRTEwMDBfUkRUUiksIGVtX3J4X2ludF9kZWxheV9kZmx0KTsKCWVtX2FkZF9p bnRfZGVsYXlfc3lzY3RsKGFkYXB0ZXIsICJ0eF9pbnRfZGVsYXkiLAoJICAgICJ0cmFuc21pdCBp bnRlcnJ1cHQgZGVsYXkgaW4gdXNlY3MiLCAmYWRhcHRlci0+dHhfaW50X2RlbGF5LAoJICAgIEUx MDAwX1JFR0lTVEVSKCZhZGFwdGVyLT5odywgRTEwMDBfVElEViksIGVtX3R4X2ludF9kZWxheV9k Zmx0KTsKCWVtX2FkZF9pbnRfZGVsYXlfc3lzY3RsKGFkYXB0ZXIsICJyeF9hYnNfaW50X2RlbGF5 IiwKCSAgICAicmVjZWl2ZSBpbnRlcnJ1cHQgZGVsYXkgbGltaXQgaW4gdXNlY3MiLAoJICAgICZh ZGFwdGVyLT5yeF9hYnNfaW50X2RlbGF5LAoJICAgIEUxMDAwX1JFR0lTVEVSKCZhZGFwdGVyLT5o dywgRTEwMDBfUkFEViksCgkgICAgZW1fcnhfYWJzX2ludF9kZWxheV9kZmx0KTsKCWVtX2FkZF9p bnRfZGVsYXlfc3lzY3RsKGFkYXB0ZXIsICJ0eF9hYnNfaW50X2RlbGF5IiwKCSAgICAidHJhbnNt aXQgaW50ZXJydXB0IGRlbGF5IGxpbWl0IGluIHVzZWNzIiwKCSAgICAmYWRhcHRlci0+dHhfYWJz X2ludF9kZWxheSwKCSAgICBFMTAwMF9SRUdJU1RFUigmYWRhcHRlci0+aHcsIEUxMDAwX1RBRFYp LAoJICAgIGVtX3R4X2Fic19pbnRfZGVsYXlfZGZsdCk7CgoJLyogU3lzY3RscyBmb3IgbGltaXRp bmcgdGhlIGFtb3VudCBvZiB3b3JrIGRvbmUgaW4gdGhlIHRhc2txdWV1ZSAqLwoJZW1fYWRkX3J4 X3Byb2Nlc3NfbGltaXQoYWRhcHRlciwgInJ4X3Byb2Nlc3NpbmdfbGltaXQiLAoJICAgICJtYXgg bnVtYmVyIG9mIHJ4IHBhY2tldHMgdG8gcHJvY2VzcyIsICZhZGFwdGVyLT5yeF9wcm9jZXNzX2xp bWl0LAoJICAgIGVtX3J4X3Byb2Nlc3NfbGltaXQpOwoKCS8qCgkgKiBWYWxpZGF0ZSBudW1iZXIg b2YgdHJhbnNtaXQgYW5kIHJlY2VpdmUgZGVzY3JpcHRvcnMuIEl0CgkgKiBtdXN0IG5vdCBleGNl ZWQgaGFyZHdhcmUgbWF4aW11bSwgYW5kIG11c3QgYmUgbXVsdGlwbGUKCSAqIG9mIEUxMDAwX0RC QV9BTElHTi4KCSAqLwoJaWYgKCgoZW1fdHhkICogc2l6ZW9mKHN0cnVjdCBlMTAwMF90eF9kZXNj KSkgJSBFTV9EQkFfQUxJR04pICE9IDAgfHwKCSAgICAoZW1fdHhkID4gRU1fTUFYX1RYRCkgfHwg KGVtX3R4ZCA8IEVNX01JTl9UWEQpKSB7CgkJZGV2aWNlX3ByaW50ZihkZXYsICJVc2luZyAlZCBU WCBkZXNjcmlwdG9ycyBpbnN0ZWFkIG9mICVkIVxuIiwKCQkgICAgRU1fREVGQVVMVF9UWEQsIGVt X3R4ZCk7CgkJYWRhcHRlci0+bnVtX3R4X2Rlc2MgPSBFTV9ERUZBVUxUX1RYRDsKCX0gZWxzZQoJ CWFkYXB0ZXItPm51bV90eF9kZXNjID0gZW1fdHhkOwoKCWlmICgoKGVtX3J4ZCAqIHNpemVvZihz dHJ1Y3QgZTEwMDBfcnhfZGVzYykpICUgRU1fREJBX0FMSUdOKSAhPSAwIHx8CgkgICAgKGVtX3J4 ZCA+IEVNX01BWF9SWEQpIHx8IChlbV9yeGQgPCBFTV9NSU5fUlhEKSkgewoJCWRldmljZV9wcmlu dGYoZGV2LCAiVXNpbmcgJWQgUlggZGVzY3JpcHRvcnMgaW5zdGVhZCBvZiAlZCFcbiIsCgkJICAg IEVNX0RFRkFVTFRfUlhELCBlbV9yeGQpOwoJCWFkYXB0ZXItPm51bV9yeF9kZXNjID0gRU1fREVG QVVMVF9SWEQ7Cgl9IGVsc2UKCQlhZGFwdGVyLT5udW1fcnhfZGVzYyA9IGVtX3J4ZDsKCglhZGFw dGVyLT5ody5tYWMuYXV0b25lZyA9IERPX0FVVE9fTkVHOwoJYWRhcHRlci0+aHcucGh5LmF1dG9u ZWdfd2FpdF90b19jb21wbGV0ZSA9IEZBTFNFOwoJYWRhcHRlci0+aHcucGh5LmF1dG9uZWdfYWR2 ZXJ0aXNlZCA9IEFVVE9ORUdfQURWX0RFRkFVTFQ7CgoJLyogQ29wcGVyIG9wdGlvbnMgKi8KCWlm IChhZGFwdGVyLT5ody5waHkubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikg ewoJCWFkYXB0ZXItPmh3LnBoeS5tZGl4ID0gQVVUT19BTExfTU9ERVM7CgkJYWRhcHRlci0+aHcu cGh5LmRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbiA9IEZBTFNFOwoJCWFkYXB0ZXItPmh3LnBo eS5tc190eXBlID0gRU1fTUFTVEVSX1NMQVZFOwoJfQoKCS8qCgkgKiBTZXQgdGhlIGZyYW1lIGxp bWl0cyBhc3N1bWluZwoJICogc3RhbmRhcmQgZXRoZXJuZXQgc2l6ZWQgZnJhbWVzLgoJICovCglh ZGFwdGVyLT5tYXhfZnJhbWVfc2l6ZSA9IEVUSEVSTVRVICsgRVRIRVJfSERSX0xFTiArIEVUSEVS TkVUX0ZDU19TSVpFOwoJYWRhcHRlci0+bWluX2ZyYW1lX3NpemUgPSBFVEhfWkxFTiArIEVUSEVS TkVUX0ZDU19TSVpFOwoKCS8qCgkgKiBUaGlzIGNvbnRyb2xzIHdoZW4gaGFyZHdhcmUgcmVwb3J0 cyB0cmFuc21pdCBjb21wbGV0aW9uCgkgKiBzdGF0dXMuCgkgKi8KCWFkYXB0ZXItPmh3Lm1hYy5y ZXBvcnRfdHhfZWFybHkgPSAxOwoKCS8qIAoJKiogR2V0IHF1ZXVlL3JpbmcgbWVtb3J5CgkqLwoJ aWYgKGVtX2FsbG9jYXRlX3F1ZXVlcyhhZGFwdGVyKSkgewoJCWVycm9yID0gRU5PTUVNOwoJCWdv dG8gZXJyX3BjaTsKCX0KCgkvKgoJKiogU3RhcnQgZnJvbSBhIGtub3duIHN0YXRlLCB0aGlzIGlz CgkqKiBpbXBvcnRhbnQgaW4gcmVhZGluZyB0aGUgbnZtIGFuZAoJKiogbWFjIGZyb20gdGhhdC4K CSovCgllMTAwMF9yZXNldF9odygmYWRhcHRlci0+aHcpOwoKCS8qIE1ha2Ugc3VyZSB3ZSBoYXZl IGEgZ29vZCBFRVBST00gYmVmb3JlIHdlIHJlYWQgZnJvbSBpdCAqLwoJaWYgKGUxMDAwX3ZhbGlk YXRlX252bV9jaGVja3N1bSgmYWRhcHRlci0+aHcpIDwgMCkgewoJCS8qCgkJKiogU29tZSBQQ0kt RSBwYXJ0cyBmYWlsIHRoZSBmaXJzdCBjaGVjayBkdWUgdG8KCQkqKiB0aGUgbGluayBiZWluZyBp biBzbGVlcCBzdGF0ZSwgY2FsbCBpdCBhZ2FpbiwKCQkqKiBpZiBpdCBmYWlscyBhIHNlY29uZCB0 aW1lIGl0cyBhIHJlYWwgaXNzdWUuCgkJKi8KCQlpZiAoZTEwMDBfdmFsaWRhdGVfbnZtX2NoZWNr c3VtKCZhZGFwdGVyLT5odykgPCAwKSB7CgkJCWRldmljZV9wcmludGYoZGV2LAoJCQkgICAgIlRo ZSBFRVBST00gQ2hlY2tzdW0gSXMgTm90IFZhbGlkXG4iKTsKCQkJZXJyb3IgPSBFSU87CgkJCWdv dG8gZXJyX2xhdGU7CgkJfQoJfQoKCS8qIENvcHkgdGhlIHBlcm1hbmVudCBNQUMgYWRkcmVzcyBv dXQgb2YgdGhlIEVFUFJPTSAqLwoJaWYgKGUxMDAwX3JlYWRfbWFjX2FkZHIoJmFkYXB0ZXItPmh3 KSA8IDApIHsKCQlkZXZpY2VfcHJpbnRmKGRldiwgIkVFUFJPTSByZWFkIGVycm9yIHdoaWxlIHJl YWRpbmcgTUFDIgoJCSAgICAiIGFkZHJlc3NcbiIpOwoJCWVycm9yID0gRUlPOwoJCWdvdG8gZXJy X2xhdGU7Cgl9CgoJaWYgKCFlbV9pc192YWxpZF9ldGhlcl9hZGRyKGFkYXB0ZXItPmh3Lm1hYy5h ZGRyKSkgewoJCWRldmljZV9wcmludGYoZGV2LCAiSW52YWxpZCBNQUMgYWRkcmVzc1xuIik7CgkJ ZXJyb3IgPSBFSU87CgkJZ290byBlcnJfbGF0ZTsKCX0KCgkvKgoJKiogIERvIGludGVycnVwdCBj b25maWd1cmF0aW9uCgkqLwoJaWYgKGFkYXB0ZXItPm1zaXggPiAxKSAvKiBEbyBNU0lYICovCgkJ ZXJyb3IgPSBlbV9hbGxvY2F0ZV9tc2l4KGFkYXB0ZXIpOwoJZWxzZSAgLyogTVNJIG9yIExlZ2Fj eSAqLwoJCWVycm9yID0gZW1fYWxsb2NhdGVfbGVnYWN5KGFkYXB0ZXIpOwoJaWYgKGVycm9yKQoJ CWdvdG8gZXJyX2xhdGU7CgoJLyoKCSAqIEdldCBXYWtlLW9uLUxhbiBhbmQgTWFuYWdlbWVudCBp bmZvIGZvciBsYXRlciB1c2UKCSAqLwoJZW1fZ2V0X3dha2V1cChkZXYpOwoKCS8qIFNldHVwIE9T IHNwZWNpZmljIG5ldHdvcmsgaW50ZXJmYWNlICovCgllbV9zZXR1cF9pbnRlcmZhY2UoZGV2LCBh ZGFwdGVyKTsKCgllbV9yZXNldChhZGFwdGVyKTsKCgkvKiBJbml0aWFsaXplIHN0YXRpc3RpY3Mg Ki8KCWVtX3VwZGF0ZV9zdGF0c19jb3VudGVycyhhZGFwdGVyKTsKCglhZGFwdGVyLT5ody5tYWMu Z2V0X2xpbmtfc3RhdHVzID0gMTsKCWVtX3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKCgkv KiBJbmRpY2F0ZSBTT0wvSURFUiB1c2FnZSAqLwoJaWYgKGUxMDAwX2NoZWNrX3Jlc2V0X2Jsb2Nr KCZhZGFwdGVyLT5odykpCgkJZGV2aWNlX3ByaW50ZihkZXYsCgkJICAgICJQSFkgcmVzZXQgaXMg YmxvY2tlZCBkdWUgdG8gU09ML0lERVIgc2Vzc2lvbi5cbiIpOwoKCS8qIFJlZ2lzdGVyIGZvciBW TEFOIGV2ZW50cyAqLwoJYWRhcHRlci0+dmxhbl9hdHRhY2ggPSBFVkVOVEhBTkRMRVJfUkVHSVNU RVIodmxhbl9jb25maWcsCgkgICAgZW1fcmVnaXN0ZXJfdmxhbiwgYWRhcHRlciwgRVZFTlRIQU5E TEVSX1BSSV9GSVJTVCk7CglhZGFwdGVyLT52bGFuX2RldGFjaCA9IEVWRU5USEFORExFUl9SRUdJ U1RFUih2bGFuX3VuY29uZmlnLAoJICAgIGVtX3VucmVnaXN0ZXJfdmxhbiwgYWRhcHRlciwgRVZF TlRIQU5ETEVSX1BSSV9GSVJTVCk7IAoKCWVtX2FkZF9od19zdGF0cyhhZGFwdGVyKTsKCgkvKiBO b24tQU1UIGJhc2VkIGhhcmR3YXJlIGNhbiBub3cgdGFrZSBjb250cm9sIGZyb20gZmlybXdhcmUg Ki8KCWlmIChhZGFwdGVyLT5oYXNfbWFuYWdlICYmICFhZGFwdGVyLT5oYXNfYW10KQoJCWVtX2dl dF9od19jb250cm9sKGFkYXB0ZXIpOwoKCS8qIFRlbGwgdGhlIHN0YWNrIHRoYXQgdGhlIGludGVy ZmFjZSBpcyBub3QgYWN0aXZlICovCglhZGFwdGVyLT5pZnAtPmlmX2Rydl9mbGFncyAmPSB+KElG Rl9EUlZfUlVOTklORyB8IElGRl9EUlZfT0FDVElWRSk7CgoJYWRhcHRlci0+bGVkX2RldiA9IGxl ZF9jcmVhdGUoZW1fbGVkX2Z1bmMsIGFkYXB0ZXIsCgkgICAgZGV2aWNlX2dldF9uYW1ldW5pdChk ZXYpKTsKCglJTklUX0RFQlVHT1VUKCJlbV9hdHRhY2g6IGVuZCIpOwoKCXJldHVybiAoMCk7Cgpl cnJfbGF0ZToKCWVtX2ZyZWVfdHJhbnNtaXRfc3RydWN0dXJlcyhhZGFwdGVyKTsKCWVtX2ZyZWVf cmVjZWl2ZV9zdHJ1Y3R1cmVzKGFkYXB0ZXIpOwoJZW1fcmVsZWFzZV9od19jb250cm9sKGFkYXB0 ZXIpOwplcnJfcGNpOgoJZW1fZnJlZV9wY2lfcmVzb3VyY2VzKGFkYXB0ZXIpOwoJRU1fQ09SRV9M T0NLX0RFU1RST1koYWRhcHRlcik7CgoJcmV0dXJuIChlcnJvcik7Cn0KCi8qKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK ICogIERldmljZSByZW1vdmFsIHJvdXRpbmUKICoKICogIFRoZSBkZXRhY2ggZW50cnkgcG9pbnQg aXMgY2FsbGVkIHdoZW4gdGhlIGRyaXZlciBpcyBiZWluZyByZW1vdmVkLgogKiAgVGhpcyByb3V0 aW5lIHN0b3BzIHRoZSBhZGFwdGVyIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIHJlc291cmNlcwog KiAgdGhhdCB3ZXJlIGFsbG9jYXRlZCBmb3IgZHJpdmVyIG9wZXJhdGlvbi4KICoKICogIHJldHVy biAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIG9uIGZhaWx1cmUKICoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRp YyBpbnQKZW1fZGV0YWNoKGRldmljZV90IGRldikKewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIg PSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CglzdHJ1Y3QgaWZuZXQJKmlmcCA9IGFkYXB0ZXItPmlm cDsKCglJTklUX0RFQlVHT1VUKCJlbV9kZXRhY2g6IGJlZ2luIik7CgoJLyogTWFrZSBzdXJlIFZM QU5TIGFyZSBub3QgdXNpbmcgZHJpdmVyICovCglpZiAoYWRhcHRlci0+aWZwLT5pZl92bGFudHJ1 bmsgIT0gTlVMTCkgewoJCWRldmljZV9wcmludGYoZGV2LCJWbGFuIGluIHVzZSwgZGV0YWNoIGZp cnN0XG4iKTsKCQlyZXR1cm4gKEVCVVNZKTsKCX0KCiNpZmRlZiBERVZJQ0VfUE9MTElORwoJaWYg KGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfUE9MTElORykKCQlldGhlcl9wb2xsX2RlcmVnaXN0 ZXIoaWZwKTsKI2VuZGlmCgoJaWYgKGFkYXB0ZXItPmxlZF9kZXYgIT0gTlVMTCkKCQlsZWRfZGVz dHJveShhZGFwdGVyLT5sZWRfZGV2KTsKCglFTV9DT1JFX0xPQ0soYWRhcHRlcik7CglhZGFwdGVy LT5pbl9kZXRhY2ggPSAxOwoJZW1fc3RvcChhZGFwdGVyKTsKCUVNX0NPUkVfVU5MT0NLKGFkYXB0 ZXIpOwoJRU1fQ09SRV9MT0NLX0RFU1RST1koYWRhcHRlcik7CgoJZTEwMDBfcGh5X2h3X3Jlc2V0 KCZhZGFwdGVyLT5odyk7CgoJZW1fcmVsZWFzZV9tYW5hZ2VhYmlsaXR5KGFkYXB0ZXIpOwoJZW1f cmVsZWFzZV9od19jb250cm9sKGFkYXB0ZXIpOwoKCS8qIFVucmVnaXN0ZXIgVkxBTiBldmVudHMg Ki8KCWlmIChhZGFwdGVyLT52bGFuX2F0dGFjaCAhPSBOVUxMKQoJCUVWRU5USEFORExFUl9ERVJF R0lTVEVSKHZsYW5fY29uZmlnLCBhZGFwdGVyLT52bGFuX2F0dGFjaCk7CglpZiAoYWRhcHRlci0+ dmxhbl9kZXRhY2ggIT0gTlVMTCkKCQlFVkVOVEhBTkRMRVJfREVSRUdJU1RFUih2bGFuX3VuY29u ZmlnLCBhZGFwdGVyLT52bGFuX2RldGFjaCk7IAoKCWV0aGVyX2lmZGV0YWNoKGFkYXB0ZXItPmlm cCk7CgljYWxsb3V0X2RyYWluKCZhZGFwdGVyLT50aW1lcik7CgoJZW1fZnJlZV9wY2lfcmVzb3Vy Y2VzKGFkYXB0ZXIpOwoJYnVzX2dlbmVyaWNfZGV0YWNoKGRldik7CglpZl9mcmVlKGlmcCk7CgoJ ZW1fZnJlZV90cmFuc21pdF9zdHJ1Y3R1cmVzKGFkYXB0ZXIpOwoJZW1fZnJlZV9yZWNlaXZlX3N0 cnVjdHVyZXMoYWRhcHRlcik7CgoJZW1fcmVsZWFzZV9od19jb250cm9sKGFkYXB0ZXIpOwoKCXJl dHVybiAoMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIFNodXRkb3duIGVudHJ5IHBvaW50CiAq CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLwoKc3RhdGljIGludAplbV9zaHV0ZG93bihkZXZpY2VfdCBkZXYpCnsK CXJldHVybiBlbV9zdXNwZW5kKGRldik7Cn0KCi8qCiAqIFN1c3BlbmQvcmVzdW1lIGRldmljZSBt ZXRob2RzLgogKi8Kc3RhdGljIGludAplbV9zdXNwZW5kKGRldmljZV90IGRldikKewoJc3RydWN0 IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CgoJRU1fQ09SRV9MT0NL KGFkYXB0ZXIpOwoKICAgICAgICBlbV9yZWxlYXNlX21hbmFnZWFiaWxpdHkoYWRhcHRlcik7Cgll bV9yZWxlYXNlX2h3X2NvbnRyb2woYWRhcHRlcik7CgllbV9lbmFibGVfd2FrZXVwKGRldik7CgoJ RU1fQ09SRV9VTkxPQ0soYWRhcHRlcik7CgoJcmV0dXJuIGJ1c19nZW5lcmljX3N1c3BlbmQoZGV2 KTsKfQoKc3RhdGljIGludAplbV9yZXN1bWUoZGV2aWNlX3QgZGV2KQp7CglzdHJ1Y3QgYWRhcHRl ciAqYWRhcHRlciA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKCXN0cnVjdCBpZm5ldCAqaWZwID0g YWRhcHRlci0+aWZwOwoKCUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCWVtX2luaXRfbG9ja2VkKGFk YXB0ZXIpOwoJZW1faW5pdF9tYW5hZ2VhYmlsaXR5KGFkYXB0ZXIpOwoJRU1fQ09SRV9VTkxPQ0so YWRhcHRlcik7CgllbV9zdGFydChpZnApOwoKCXJldHVybiBidXNfZ2VuZXJpY19yZXN1bWUoZGV2 KTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioKICogIFRyYW5zbWl0IGVudHJ5IHBvaW50CiAqCiAqICBlbV9z dGFydCBpcyBjYWxsZWQgYnkgdGhlIHN0YWNrIHRvIGluaXRpYXRlIGEgdHJhbnNtaXQuCiAqICBU aGUgZHJpdmVyIHdpbGwgcmVtYWluIGluIHRoaXMgcm91dGluZSBhcyBsb25nIGFzIHRoZXJlIGFy ZQogKiAgcGFja2V0cyB0byB0cmFuc21pdCBhbmQgdHJhbnNtaXQgcmVzb3VyY2VzIGFyZSBhdmFp bGFibGUuCiAqICBJbiBjYXNlIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSBzdGFjayBpcyBu b3RpZmllZCBhbmQKICogIHRoZSBwYWNrZXQgaXMgcmVxdWV1ZWQuCiAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoK I2lmZGVmIEVNX01VTFRJUVVFVUUKc3RhdGljIGludAplbV9tcV9zdGFydF9sb2NrZWQoc3RydWN0 IGlmbmV0ICppZnAsIHN0cnVjdCB0eF9yaW5nICp0eHIsIHN0cnVjdCBtYnVmICptKQp7CglzdHJ1 Y3QgYWRhcHRlciAgKmFkYXB0ZXIgPSB0eHItPmFkYXB0ZXI7CiAgICAgICAgc3RydWN0IG1idWYg ICAgICpuZXh0OwogICAgICAgIGludCAgICAgICAgICAgICBlcnIgPSAwLCBlbnEgPSAwOwoKCWlm ICgoaWZwLT5pZl9kcnZfZmxhZ3MgJiAoSUZGX0RSVl9SVU5OSU5HIHwgSUZGX0RSVl9PQUNUSVZF KSkgIT0KCSAgICBJRkZfRFJWX1JVTk5JTkcgfHwgYWRhcHRlci0+bGlua19hY3RpdmUgPT0gMCkg ewoJCWlmIChtICE9IE5VTEwpCgkJCWVyciA9IGRyYnJfZW5xdWV1ZShpZnAsIHR4ci0+YnIsIG0p OwoJCXJldHVybiAoZXJyKTsKCX0KCiAgICAgICAgLyogQ2FsbCBjbGVhbnVwIGlmIG51bWJlciBv ZiBUWCBkZXNjcmlwdG9ycyBsb3cgKi8KCWlmICh0eHItPnR4X2F2YWlsIDw9IEVNX1RYX0NMRUFO VVBfVEhSRVNIT0xEKQoJCWVtX3R4ZW9mKHR4cik7CgoJZW5xID0gMDsKCWlmIChtID09IE5VTEwp IHsKCQluZXh0ID0gZHJicl9kZXF1ZXVlKGlmcCwgdHhyLT5icik7Cgl9IGVsc2UgaWYgKGRyYnJf bmVlZHNfZW5xdWV1ZShpZnAsIHR4ci0+YnIpKSB7CgkJaWYgKChlcnIgPSBkcmJyX2VucXVldWUo aWZwLCB0eHItPmJyLCBtKSkgIT0gMCkKCQkJcmV0dXJuIChlcnIpOwoJCW5leHQgPSBkcmJyX2Rl cXVldWUoaWZwLCB0eHItPmJyKTsKCX0gZWxzZQoJCW5leHQgPSBtOwoKCS8qIFByb2Nlc3MgdGhl IHF1ZXVlICovCgl3aGlsZSAobmV4dCAhPSBOVUxMKSB7CgkJaWYgKChlcnIgPSBlbV94bWl0KHR4 ciwgJm5leHQpKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9IE5V TEwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZHJicl9lbnF1ZXVlKGlm cCwgdHhyLT5iciwgbmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoJCX0KCQll bnErKzsKCQlkcmJyX3N0YXRzX3VwZGF0ZShpZnAsIG5leHQtPm1fcGt0aGRyLmxlbiwgbmV4dC0+ bV9mbGFncyk7CgkJRVRIRVJfQlBGX01UQVAoaWZwLCBuZXh0KTsKCQlpZiAoKGlmcC0+aWZfZHJ2 X2ZsYWdzICYgSUZGX0RSVl9SVU5OSU5HKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICBi cmVhazsKCQlpZiAodHhyLT50eF9hdmFpbCA8IEVNX01BWF9TQ0FUVEVSKSB7CgkJCWlmcC0+aWZf ZHJ2X2ZsYWdzIHw9IElGRl9EUlZfT0FDVElWRTsKCQkJYnJlYWs7CgkJfQoJCW5leHQgPSBkcmJy X2RlcXVldWUoaWZwLCB0eHItPmJyKTsKCX0KCglpZiAoZW5xID4gMCkgewogICAgICAgICAgICAg ICAgLyogU2V0IHRoZSB3YXRjaGRvZyAqLwogICAgICAgICAgICAgICAgdHhyLT53YXRjaGRvZ19j aGVjayA9IFRSVUU7CgkJdHhyLT53YXRjaGRvZ190aW1lID0gdGlja3M7Cgl9CglyZXR1cm4gKGVy cik7Cn0KCi8qCioqIE11bHRpcXVldWUgY2FwYWJsZSBzdGFjayBpbnRlcmZhY2UsIHRoaXMgaXMg bm90CioqIHlldCB0cnVlbHkgbXVsdGlxdWV1ZSwgYnV0IHRoYXQgaXMgY29taW5nLi4uCiovCnN0 YXRpYyBpbnQKZW1fbXFfc3RhcnQoc3RydWN0IGlmbmV0ICppZnAsIHN0cnVjdCBtYnVmICptKQp7 CglzdHJ1Y3QgYWRhcHRlcgkqYWRhcHRlciA9IGlmcC0+aWZfc29mdGM7CglzdHJ1Y3QgdHhfcmlu ZwkqdHhyOwoJaW50IAkJaSwgZXJyb3IgPSAwOwoKCS8qIFdoaWNoIHF1ZXVlIHRvIHVzZSAqLwoJ aWYgKChtLT5tX2ZsYWdzICYgTV9GTE9XSUQpICE9IDApCiAgICAgICAgICAgICAgICBpID0gbS0+ bV9wa3RoZHIuZmxvd2lkICUgYWRhcHRlci0+bnVtX3F1ZXVlczsKCWVsc2UKCQlpID0gY3VyY3B1 ICUgYWRhcHRlci0+bnVtX3F1ZXVlczsKCgl0eHIgPSAmYWRhcHRlci0+dHhfcmluZ3NbaV07CgoJ aWYgKEVNX1RYX1RSWUxPQ0sodHhyKSkgewoJCWVycm9yID0gZW1fbXFfc3RhcnRfbG9ja2VkKGlm cCwgdHhyLCBtKTsKCQlFTV9UWF9VTkxPQ0sodHhyKTsKCX0gZWxzZSAKCQllcnJvciA9IGRyYnJf ZW5xdWV1ZShpZnAsIHR4ci0+YnIsIG0pOwoKCXJldHVybiAoZXJyb3IpOwp9CgovKgoqKiBGbHVz aCBhbGwgcmluZyBidWZmZXJzCiovCnN0YXRpYyB2b2lkCmVtX3FmbHVzaChzdHJ1Y3QgaWZuZXQg KmlmcCkKewoJc3RydWN0IGFkYXB0ZXIgICphZGFwdGVyID0gaWZwLT5pZl9zb2Z0YzsKCXN0cnVj dCB0eF9yaW5nICAqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7CglzdHJ1Y3QgbWJ1ZiAgICAgKm07 CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyssIHR4cisrKSB7 CgkJRU1fVFhfTE9DSyh0eHIpOwoJCXdoaWxlICgobSA9IGJ1Zl9yaW5nX2RlcXVldWVfc2ModHhy LT5icikpICE9IE5VTEwpCgkJCW1fZnJlZW0obSk7CgkJRU1fVFhfVU5MT0NLKHR4cik7Cgl9Cglp Zl9xZmx1c2goaWZwKTsKfQoKI2VuZGlmIC8qIEVNX01VTFRJUVVFVUUgKi8KCnN0YXRpYyB2b2lk CmVtX3N0YXJ0X2xvY2tlZChzdHJ1Y3QgaWZuZXQgKmlmcCwgc3RydWN0IHR4X3JpbmcgKnR4cikK ewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSBpZnAtPmlmX3NvZnRjOwoJc3RydWN0IG1idWYJ Km1faGVhZDsKCglFTV9UWF9MT0NLX0FTU0VSVCh0eHIpOwoKCWlmICgoaWZwLT5pZl9kcnZfZmxh Z3MgJiAoSUZGX0RSVl9SVU5OSU5HfElGRl9EUlZfT0FDVElWRSkpICE9CgkgICAgSUZGX0RSVl9S VU5OSU5HKQoJCXJldHVybjsKCglpZiAoIWFkYXB0ZXItPmxpbmtfYWN0aXZlKQoJCXJldHVybjsK CiAgICAgICAgLyogQ2FsbCBjbGVhbnVwIGlmIG51bWJlciBvZiBUWCBkZXNjcmlwdG9ycyBsb3cg Ki8KCWlmICh0eHItPnR4X2F2YWlsIDw9IEVNX1RYX0NMRUFOVVBfVEhSRVNIT0xEKQoJCWVtX3R4 ZW9mKHR4cik7CgoJd2hpbGUgKCFJRlFfRFJWX0lTX0VNUFRZKCZpZnAtPmlmX3NuZCkpIHsKCQlp ZiAodHhyLT50eF9hdmFpbCA8IEVNX01BWF9TQ0FUVEVSKSB7CgkJCWlmcC0+aWZfZHJ2X2ZsYWdz IHw9IElGRl9EUlZfT0FDVElWRTsKCQkJYnJlYWs7CgkJfQogICAgICAgICAgICAgICAgSUZRX0RS Vl9ERVFVRVVFKCZpZnAtPmlmX3NuZCwgbV9oZWFkKTsKCQlpZiAobV9oZWFkID09IE5VTEwpCgkJ CWJyZWFrOwoJCS8qCgkJICogIEVuY2Fwc3VsYXRpb24gY2FuIG1vZGlmeSBvdXIgcG9pbnRlciwg YW5kIG9yIG1ha2UgaXQKCQkgKiAgTlVMTCBvbiBmYWlsdXJlLiAgSW4gdGhhdCBldmVudCwgd2Ug Y2FuJ3QgcmVxdWV1ZS4KCQkgKi8KCQlpZihtX2hlYWQtPm1fZmxhZ3MgJiBNX0JZUEFTU19IRUFE KSB7CgkJCXN0cnVjdCB0aW1lc3BlYyB0bSA7CgkJCXVuc2lnbmVkIGNoYXIgYnVmWzEyOF07CgoJ CQluYW5vdXB0aW1lKCAmdG0gKTsKCQkJc3ByaW50ZiggYnVmLCAiJWxkLiUwNmxkIiwgdG0udHZf c2VjLCB0bS50dl9uc2VjICkgOwoJCQlpZiAoYWx0cV9kZWJ1ZyAmIDB4MTApCgkJCQlwcmludGYo IiVzIG1idWYgJXBcbiIsX19GVU5DVElPTl9fLG1faGVhZCk7CgkJCWRldmN0bF9ub3RpZnkoIlNZ U1RFTSIsICJCWVBBU1MiLCAiVElNRSIsIGJ1ZiApIDsKCgoJCX0KCgkJaWYgKGVtX3htaXQodHhy LCAmbV9oZWFkKSkgewoJCQlpZiAobV9oZWFkID09IE5VTEwpCgkJCQlicmVhazsKCQkJaWZwLT5p Zl9kcnZfZmxhZ3MgfD0gSUZGX0RSVl9PQUNUSVZFOwoJCQlJRlFfRFJWX1BSRVBFTkQoJmlmcC0+ aWZfc25kLCBtX2hlYWQpOwoJCQlicmVhazsKCQl9CgoJCS8qIFNlbmQgYSBjb3B5IG9mIHRoZSBm cmFtZSB0byB0aGUgQlBGIGxpc3RlbmVyICovCgkJRVRIRVJfQlBGX01UQVAoaWZwLCBtX2hlYWQp OwoKCQkvKiBTZXQgdGltZW91dCBpbiBjYXNlIGhhcmR3YXJlIGhhcyBwcm9ibGVtcyB0cmFuc21p dHRpbmcuICovCgkJdHhyLT53YXRjaGRvZ190aW1lID0gdGlja3M7CgkJdHhyLT53YXRjaGRvZ19j aGVjayA9IFRSVUU7Cgl9CgoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZAplbV9zdGFydChzdHJ1Y3Qg aWZuZXQgKmlmcCkKewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSBpZnAtPmlmX3NvZnRjOwoJ c3RydWN0IHR4X3JpbmcJKnR4ciA9IGFkYXB0ZXItPnR4X3JpbmdzOwoKCWlmIChpZnAtPmlmX2Ry dl9mbGFncyAmIElGRl9EUlZfUlVOTklORykgewoJCUVNX1RYX0xPQ0sodHhyKTsKCQllbV9zdGFy dF9sb2NrZWQoaWZwLCB0eHIpOwoJCUVNX1RYX1VOTE9DSyh0eHIpOwoJfQoJcmV0dXJuOwp9Cgov KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqCiAqICBJb2N0bCBlbnRyeSBwb2ludAogKgogKiAgZW1faW9jdGwgaXMgY2Fs bGVkIHdoZW4gdGhlIHVzZXIgd2FudHMgdG8gY29uZmlndXJlIHRoZQogKiAgaW50ZXJmYWNlLgog KgogKiAgcmV0dXJuIDAgb24gc3VjY2VzcywgcG9zaXRpdmUgb24gZmFpbHVyZQogKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KCnN0YXRpYyBpbnQKZW1faW9jdGwoc3RydWN0IGlmbmV0ICppZnAsIHVfbG9uZyBjb21t YW5kLCBjYWRkcl90IGRhdGEpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFwdGVyID0gaWZwLT5pZl9z b2Z0YzsKCXN0cnVjdCBpZnJlcSAqaWZyID0gKHN0cnVjdCBpZnJlcSAqKWRhdGE7CiNpZmRlZiBJ TkVUCglzdHJ1Y3QgaWZhZGRyICppZmEgPSAoc3RydWN0IGlmYWRkciAqKWRhdGE7CiNlbmRpZgoJ aW50IGVycm9yID0gMDsKCglpZiAoYWRhcHRlci0+aW5fZGV0YWNoKQoJCXJldHVybiAoZXJyb3Ip OwoKCXN3aXRjaCAoY29tbWFuZCkgewoJY2FzZSBTSU9DU0lGQUREUjoKI2lmZGVmIElORVQKCQlp ZiAoaWZhLT5pZmFfYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKCQkJLyoKCQkJICogWFhY CgkJCSAqIFNpbmNlIHJlc2V0dGluZyBoYXJkd2FyZSB0YWtlcyBhIHZlcnkgbG9uZyB0aW1lCgkJ CSAqIGFuZCByZXN1bHRzIGluIGxpbmsgcmVuZWdvdGlhdGlvbiB3ZSBvbmx5CgkJCSAqIGluaXRp YWxpemUgdGhlIGhhcmR3YXJlIG9ubHkgd2hlbiBpdCBpcyBhYnNvbHV0ZWx5CgkJCSAqIHJlcXVp cmVkLgoJCQkgKi8KCQkJaWZwLT5pZl9mbGFncyB8PSBJRkZfVVA7CgkJCWlmICghKGlmcC0+aWZf ZHJ2X2ZsYWdzICYgSUZGX0RSVl9SVU5OSU5HKSkgewoJCQkJRU1fQ09SRV9MT0NLKGFkYXB0ZXIp OwoJCQkJZW1faW5pdF9sb2NrZWQoYWRhcHRlcik7CgkJCQlFTV9DT1JFX1VOTE9DSyhhZGFwdGVy KTsKCQkJfQoJCQlhcnBfaWZpbml0KGlmcCwgaWZhKTsKCQl9IGVsc2UKI2VuZGlmCgkJCWVycm9y ID0gZXRoZXJfaW9jdGwoaWZwLCBjb21tYW5kLCBkYXRhKTsKCQlicmVhazsKCWNhc2UgU0lPQ1NJ Rk1UVToKCSAgICB7CgkJaW50IG1heF9mcmFtZV9zaXplOwoKCQlJT0NUTF9ERUJVR09VVCgiaW9j dGwgcmN2J2Q6IFNJT0NTSUZNVFUgKFNldCBJbnRlcmZhY2UgTVRVKSIpOwoKCQlFTV9DT1JFX0xP Q0soYWRhcHRlcik7CgkJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewoJCWNhc2UgZTEw MDBfODI1NzE6CgkJY2FzZSBlMTAwMF84MjU3MjoKCQljYXNlIGUxMDAwX2ljaDlsYW46CgkJY2Fz ZSBlMTAwMF9pY2gxMGxhbjoKCQljYXNlIGUxMDAwXzgyNTc0OgoJCWNhc2UgZTEwMDBfODAwMDNl czJsYW46CS8qIDlLIEp1bWJvIEZyYW1lIHNpemUgKi8KCQkJbWF4X2ZyYW1lX3NpemUgPSA5MjM0 OwoJCQlicmVhazsKCQljYXNlIGUxMDAwX3BjaGxhbjoKCQkJbWF4X2ZyYW1lX3NpemUgPSA0MDk2 OwoJCQlicmVhazsKCQkJLyogQWRhcHRlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBqdW1ibyBmcmFt ZXMgKi8KCQljYXNlIGUxMDAwXzgyNTgzOgoJCWNhc2UgZTEwMDBfaWNoOGxhbjoKCQkJbWF4X2Zy YW1lX3NpemUgPSBFVEhFUl9NQVhfTEVOOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQltYXhfZnJh bWVfc2l6ZSA9IE1BWF9KVU1CT19GUkFNRV9TSVpFOwoJCX0KCQlpZiAoaWZyLT5pZnJfbXR1ID4g bWF4X2ZyYW1lX3NpemUgLSBFVEhFUl9IRFJfTEVOIC0KCQkgICAgRVRIRVJfQ1JDX0xFTikgewoJ CQlFTV9DT1JFX1VOTE9DSyhhZGFwdGVyKTsKCQkJZXJyb3IgPSBFSU5WQUw7CgkJCWJyZWFrOwoJ CX0KCgkJaWZwLT5pZl9tdHUgPSBpZnItPmlmcl9tdHU7CgkJYWRhcHRlci0+bWF4X2ZyYW1lX3Np emUgPQoJCSAgICBpZnAtPmlmX210dSArIEVUSEVSX0hEUl9MRU4gKyBFVEhFUl9DUkNfTEVOOwoJ CWVtX2luaXRfbG9ja2VkKGFkYXB0ZXIpOwoJCUVNX0NPUkVfVU5MT0NLKGFkYXB0ZXIpOwoJCWJy ZWFrOwoJICAgIH0KCWNhc2UgU0lPQ1NJRkZMQUdTOgoJCUlPQ1RMX0RFQlVHT1VUKCJpb2N0bCBy Y3YnZDpcCgkJICAgIFNJT0NTSUZGTEFHUyAoU2V0IEludGVyZmFjZSBGbGFncykiKTsKCQlFTV9D T1JFX0xPQ0soYWRhcHRlcik7CgkJaWYgKGlmcC0+aWZfZmxhZ3MgJiBJRkZfVVApIHsKCQkJaWYg KChpZnAtPmlmX2Rydl9mbGFncyAmIElGRl9EUlZfUlVOTklORykpIHsKCQkJCWlmICgoaWZwLT5p Zl9mbGFncyBeIGFkYXB0ZXItPmlmX2ZsYWdzKSAmCgkJCQkgICAgKElGRl9QUk9NSVNDIHwgSUZG X0FMTE1VTFRJKSkgewoJCQkJCWVtX2Rpc2FibGVfcHJvbWlzYyhhZGFwdGVyKTsKCQkJCQllbV9z ZXRfcHJvbWlzYyhhZGFwdGVyKTsKCQkJCX0KCQkJfSBlbHNlCgkJCQllbV9pbml0X2xvY2tlZChh ZGFwdGVyKTsKCQl9IGVsc2UKCQkJaWYgKGlmcC0+aWZfZHJ2X2ZsYWdzICYgSUZGX0RSVl9SVU5O SU5HKQoJCQkJZW1fc3RvcChhZGFwdGVyKTsKCQlhZGFwdGVyLT5pZl9mbGFncyA9IGlmcC0+aWZf ZmxhZ3M7CgkJRU1fQ09SRV9VTkxPQ0soYWRhcHRlcik7CgkJYnJlYWs7CgljYXNlIFNJT0NBRERN VUxUSToKCWNhc2UgU0lPQ0RFTE1VTFRJOgoJCUlPQ1RMX0RFQlVHT1VUKCJpb2N0bCByY3YnZDog U0lPQyhBRER8REVMKU1VTFRJIik7CgkJaWYgKGlmcC0+aWZfZHJ2X2ZsYWdzICYgSUZGX0RSVl9S VU5OSU5HKSB7CgkJCUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCQkJZW1fZGlzYWJsZV9pbnRyKGFk YXB0ZXIpOwoJCQllbV9zZXRfbXVsdGkoYWRhcHRlcik7CiNpZmRlZiBERVZJQ0VfUE9MTElORwoJ CQlpZiAoIShpZnAtPmlmX2NhcGVuYWJsZSAmIElGQ0FQX1BPTExJTkcpKQojZW5kaWYKCQkJCWVt X2VuYWJsZV9pbnRyKGFkYXB0ZXIpOwoJCQlFTV9DT1JFX1VOTE9DSyhhZGFwdGVyKTsKCQl9CgkJ YnJlYWs7CgljYXNlIFNJT0NTSUZNRURJQToKCQkvKiBDaGVjayBTT0wvSURFUiB1c2FnZSAqLwoJ CUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCQlpZiAoZTEwMDBfY2hlY2tfcmVzZXRfYmxvY2soJmFk YXB0ZXItPmh3KSkgewoJCQlFTV9DT1JFX1VOTE9DSyhhZGFwdGVyKTsKCQkJZGV2aWNlX3ByaW50 ZihhZGFwdGVyLT5kZXYsICJNZWRpYSBjaGFuZ2UgaXMiCgkJCSAgICAiIGJsb2NrZWQgZHVlIHRv IFNPTC9JREVSIHNlc3Npb24uXG4iKTsKCQkJYnJlYWs7CgkJfQoJCUVNX0NPUkVfVU5MT0NLKGFk YXB0ZXIpOwoJY2FzZSBTSU9DR0lGTUVESUE6CgkJSU9DVExfREVCVUdPVVQoImlvY3RsIHJjdidk OiBcCgkJICAgIFNJT0N4SUZNRURJQSAoR2V0L1NldCBJbnRlcmZhY2UgTWVkaWEpIik7CgkJZXJy b3IgPSBpZm1lZGlhX2lvY3RsKGlmcCwgaWZyLCAmYWRhcHRlci0+bWVkaWEsIGNvbW1hbmQpOwoJ CWJyZWFrOwoJY2FzZSBTSU9DU0lGQ0FQOgoJICAgIHsKCQlpbnQgbWFzaywgcmVpbml0OwoKCQlJ T0NUTF9ERUJVR09VVCgiaW9jdGwgcmN2J2Q6IFNJT0NTSUZDQVAgKFNldCBDYXBhYmlsaXRpZXMp Iik7CgkJcmVpbml0ID0gMDsKCQltYXNrID0gaWZyLT5pZnJfcmVxY2FwIF4gaWZwLT5pZl9jYXBl bmFibGU7CiNpZmRlZiBERVZJQ0VfUE9MTElORwoJCWlmIChtYXNrICYgSUZDQVBfUE9MTElORykg ewoJCQlpZiAoaWZyLT5pZnJfcmVxY2FwICYgSUZDQVBfUE9MTElORykgewoJCQkJZXJyb3IgPSBl dGhlcl9wb2xsX3JlZ2lzdGVyKGVtX3BvbGwsIGlmcCk7CgkJCQlpZiAoZXJyb3IpCgkJCQkJcmV0 dXJuIChlcnJvcik7CgkJCQlFTV9DT1JFX0xPQ0soYWRhcHRlcik7CgkJCQllbV9kaXNhYmxlX2lu dHIoYWRhcHRlcik7CgkJCQlpZnAtPmlmX2NhcGVuYWJsZSB8PSBJRkNBUF9QT0xMSU5HOwoJCQkJ RU1fQ09SRV9VTkxPQ0soYWRhcHRlcik7CgkJCX0gZWxzZSB7CgkJCQllcnJvciA9IGV0aGVyX3Bv bGxfZGVyZWdpc3RlcihpZnApOwoJCQkJLyogRW5hYmxlIGludGVycnVwdCBldmVuIGluIGVycm9y IGNhc2UgKi8KCQkJCUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCQkJCWVtX2VuYWJsZV9pbnRyKGFk YXB0ZXIpOwoJCQkJaWZwLT5pZl9jYXBlbmFibGUgJj0gfklGQ0FQX1BPTExJTkc7CgkJCQlFTV9D T1JFX1VOTE9DSyhhZGFwdGVyKTsKCQkJfQoJCX0KI2VuZGlmCgkJaWYgKG1hc2sgJiBJRkNBUF9I V0NTVU0pIHsKCQkJaWZwLT5pZl9jYXBlbmFibGUgXj0gSUZDQVBfSFdDU1VNOwoJCQlyZWluaXQg PSAxOwoJCX0KCQlpZiAobWFzayAmIElGQ0FQX1RTTzQpIHsKCQkJaWZwLT5pZl9jYXBlbmFibGUg Xj0gSUZDQVBfVFNPNDsKCQkJcmVpbml0ID0gMTsKCQl9CgkJaWYgKG1hc2sgJiBJRkNBUF9WTEFO X0hXVEFHR0lORykgewoJCQlpZnAtPmlmX2NhcGVuYWJsZSBePSBJRkNBUF9WTEFOX0hXVEFHR0lO RzsKCQkJcmVpbml0ID0gMTsKCQl9CgkJaWYgKG1hc2sgJiBJRkNBUF9WTEFOX0hXRklMVEVSKSB7 CgkJCWlmcC0+aWZfY2FwZW5hYmxlIF49IElGQ0FQX1ZMQU5fSFdGSUxURVI7CgkJCXJlaW5pdCA9 IDE7CgkJfQoJCWlmICgobWFzayAmIElGQ0FQX1dPTCkgJiYKCQkgICAgKGlmcC0+aWZfY2FwYWJp bGl0aWVzICYgSUZDQVBfV09MKSAhPSAwKSB7CgkJCWlmIChtYXNrICYgSUZDQVBfV09MX01DQVNU KQoJCQkJaWZwLT5pZl9jYXBlbmFibGUgXj0gSUZDQVBfV09MX01DQVNUOwoJCQlpZiAobWFzayAm IElGQ0FQX1dPTF9NQUdJQykKCQkJCWlmcC0+aWZfY2FwZW5hYmxlIF49IElGQ0FQX1dPTF9NQUdJ QzsKCQl9CgkJaWYgKHJlaW5pdCAmJiAoaWZwLT5pZl9kcnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5J TkcpKQoJCQllbV9pbml0KGFkYXB0ZXIpOwoJCVZMQU5fQ0FQQUJJTElUSUVTKGlmcCk7CgkJYnJl YWs7CgkgICAgfQoKCWRlZmF1bHQ6CgkJZXJyb3IgPSBldGhlcl9pb2N0bChpZnAsIGNvbW1hbmQs IGRhdGEpOwoJCWJyZWFrOwoJfQoKCXJldHVybiAoZXJyb3IpOwp9CgoKLyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgog KiAgSW5pdCBlbnRyeSBwb2ludAogKgogKiAgVGhpcyByb3V0aW5lIGlzIHVzZWQgaW4gdHdvIHdh eXMuIEl0IGlzIHVzZWQgYnkgdGhlIHN0YWNrIGFzCiAqICBpbml0IGVudHJ5IHBvaW50IGluIG5l dHdvcmsgaW50ZXJmYWNlIHN0cnVjdHVyZS4gSXQgaXMgYWxzbyB1c2VkCiAqICBieSB0aGUgZHJp dmVyIGFzIGEgaHcvc3cgaW5pdGlhbGl6YXRpb24gcm91dGluZSB0byBnZXQgdG8gYQogKiAgY29u c2lzdGVudCBzdGF0ZS4KICoKICogIHJldHVybiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIG9uIGZh aWx1cmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZAplbV9pbml0X2xvY2tlZChzdHJ1Y3Qg YWRhcHRlciAqYWRhcHRlcikKewoJc3RydWN0IGlmbmV0CSppZnAgPSBhZGFwdGVyLT5pZnA7Cglk ZXZpY2VfdAlkZXYgPSBhZGFwdGVyLT5kZXY7Cgl1MzIJCXBiYTsKCglJTklUX0RFQlVHT1VUKCJl bV9pbml0OiBiZWdpbiIpOwoKCUVNX0NPUkVfTE9DS19BU1NFUlQoYWRhcHRlcik7CgoJZW1fZGlz YWJsZV9pbnRyKGFkYXB0ZXIpOwoJY2FsbG91dF9zdG9wKCZhZGFwdGVyLT50aW1lcik7CgoJLyoK CSAqIFBhY2tldCBCdWZmZXIgQWxsb2NhdGlvbiAoUEJBKQoJICogV3JpdGluZyBQQkEgc2V0cyB0 aGUgcmVjZWl2ZSBwb3J0aW9uIG9mIHRoZSBidWZmZXIKCSAqIHRoZSByZW1haW5kZXIgaXMgdXNl ZCBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlci4KCSAqLwoJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMu dHlwZSkgewoJLyogVG90YWwgUGFja2V0IEJ1ZmZlciBvbiB0aGVzZSBpcyA0OEsgKi8KCWNhc2Ug ZTEwMDBfODI1NzE6CgljYXNlIGUxMDAwXzgyNTcyOgoJY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoK CQkJcGJhID0gRTEwMDBfUEJBXzMySzsgLyogMzJLIGZvciBSeCwgMTZLIGZvciBUeCAqLwoJCWJy ZWFrOwoJY2FzZSBlMTAwMF84MjU3MzogLyogODI1NzM6IFRvdGFsIFBhY2tldCBCdWZmZXIgaXMg MzJLICovCgkJCXBiYSA9IEUxMDAwX1BCQV8xMks7IC8qIDEySyBmb3IgUngsIDIwSyBmb3IgVHgg Ki8KCQlicmVhazsKCWNhc2UgZTEwMDBfODI1NzQ6CgljYXNlIGUxMDAwXzgyNTgzOgoJCQlwYmEg PSBFMTAwMF9QQkFfMjBLOyAvKiAyMEsgZm9yIFJ4LCAyMEsgZm9yIFR4ICovCgkJYnJlYWs7Cglj YXNlIGUxMDAwX2ljaDlsYW46CgljYXNlIGUxMDAwX2ljaDEwbGFuOgoJY2FzZSBlMTAwMF9wY2hs YW46CgkJcGJhID0gRTEwMDBfUEJBXzEwSzsKCQlicmVhazsKCWNhc2UgZTEwMDBfaWNoOGxhbjoK CQlwYmEgPSBFMTAwMF9QQkFfOEs7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWlmIChhZGFwdGVyLT5t YXhfZnJhbWVfc2l6ZSA+IDgxOTIpCgkJCXBiYSA9IEUxMDAwX1BCQV80MEs7IC8qIDQwSyBmb3Ig UngsIDI0SyBmb3IgVHggKi8KCQllbHNlCgkJCXBiYSA9IEUxMDAwX1BCQV80OEs7IC8qIDQ4SyBm b3IgUngsIDE2SyBmb3IgVHggKi8KCX0KCglJTklUX0RFQlVHT1VUMSgiZW1faW5pdDogcGJhPSVk SyIscGJhKTsKCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1BCQSwgcGJhKTsK CQoJLyogR2V0IHRoZSBsYXRlc3QgbWFjIGFkZHJlc3MsIFVzZXIgY2FuIHVzZSBhIExBQSAqLwog ICAgICAgIGJjb3B5KElGX0xMQUREUihhZGFwdGVyLT5pZnApLCBhZGFwdGVyLT5ody5tYWMuYWRk ciwKICAgICAgICAgICAgICBFVEhFUl9BRERSX0xFTik7CgoJLyogUHV0IHRoZSBhZGRyZXNzIGlu dG8gdGhlIFJlY2VpdmUgQWRkcmVzcyBBcnJheSAqLwoJZTEwMDBfcmFyX3NldCgmYWRhcHRlci0+ aHcsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyLCAwKTsKCgkvKgoJICogV2l0aCB0aGUgODI1NzEgYWRh cHRlciwgUkFSWzBdIG1heSBiZSBvdmVyd3JpdHRlbgoJICogd2hlbiB0aGUgb3RoZXIgcG9ydCBp cyByZXNldCwgd2UgbWFrZSBhIGR1cGxpY2F0ZQoJICogaW4gUkFSWzE0XSBmb3IgdGhhdCBldmVu dHVhbGl0eSwgdGhpcyBhc3N1cmVzCgkgKiB0aGUgaW50ZXJmYWNlIGNvbnRpbnVlcyB0byBmdW5j dGlvbi4KCSAqLwoJaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID09IGUxMDAwXzgyNTcxKSB7CgkJ ZTEwMDBfc2V0X2xhYV9zdGF0ZV84MjU3MSgmYWRhcHRlci0+aHcsIFRSVUUpOwoJCWUxMDAwX3Jh cl9zZXQoJmFkYXB0ZXItPmh3LCBhZGFwdGVyLT5ody5tYWMuYWRkciwKCQkgICAgRTEwMDBfUkFS X0VOVFJJRVMgLSAxKTsKCX0KCgkvKiBJbml0aWFsaXplIHRoZSBoYXJkd2FyZSAqLwoJZW1fcmVz ZXQoYWRhcHRlcik7CgllbV91cGRhdGVfbGlua19zdGF0dXMoYWRhcHRlcik7CgoJLyogU2V0dXAg VkxBTiBzdXBwb3J0LCBiYXNpYyBhbmQgb2ZmbG9hZCBpZiBhdmFpbGFibGUgKi8KCUUxMDAwX1dS SVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1ZFVCwgRVRIRVJUWVBFX1ZMQU4pOwoKCS8qIFVz ZSByZWFsIFZMQU4gRmlsdGVyIHN1cHBvcnQ/ICovCglpZiAoaWZwLT5pZl9jYXBlbmFibGUgJiBJ RkNBUF9WTEFOX0hXVEFHR0lORykgewoJCWlmIChpZnAtPmlmX2NhcGVuYWJsZSAmIElGQ0FQX1ZM QU5fSFdGSUxURVIpCgkJCS8qIFVzZSByZWFsIFZMQU4gRmlsdGVyIHN1cHBvcnQgKi8KCQkJZW1f c2V0dXBfdmxhbl9od19zdXBwb3J0KGFkYXB0ZXIpOwoJCWVsc2UgewoJCQl1MzIgY3RybDsKCQkJ Y3RybCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfQ1RSTCk7CgkJCWN0cmwg fD0gRTEwMDBfQ1RSTF9WTUU7CgkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAw X0NUUkwsIGN0cmwpOwoJCX0KCX0KCgkvKiBTZXQgaGFyZHdhcmUgb2ZmbG9hZCBhYmlsaXRpZXMg Ki8KCWlmcC0+aWZfaHdhc3Npc3QgPSAwOwoJaWYgKGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBf VFhDU1VNKQoJCWlmcC0+aWZfaHdhc3Npc3QgfD0gKENTVU1fVENQIHwgQ1NVTV9VRFApOwoJaWYg KGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfVFNPNCkKCQlpZnAtPmlmX2h3YXNzaXN0IHw9IENT VU1fVFNPOwoKCS8qIENvbmZpZ3VyZSBmb3IgT1MgcHJlc2VuY2UgKi8KCWVtX2luaXRfbWFuYWdl YWJpbGl0eShhZGFwdGVyKTsKCgkvKiBQcmVwYXJlIHRyYW5zbWl0IGRlc2NyaXB0b3JzIGFuZCBi dWZmZXJzICovCgllbV9zZXR1cF90cmFuc21pdF9zdHJ1Y3R1cmVzKGFkYXB0ZXIpOwoJZW1faW5p dGlhbGl6ZV90cmFuc21pdF91bml0KGFkYXB0ZXIpOwoKCS8qIFNldHVwIE11bHRpY2FzdCB0YWJs ZSAqLwoJZW1fc2V0X211bHRpKGFkYXB0ZXIpOwoKCS8qIFByZXBhcmUgcmVjZWl2ZSBkZXNjcmlw dG9ycyBhbmQgYnVmZmVycyAqLwoJaWYgKGVtX3NldHVwX3JlY2VpdmVfc3RydWN0dXJlcyhhZGFw dGVyKSkgewoJCWRldmljZV9wcmludGYoZGV2LCAiQ291bGQgbm90IHNldHVwIHJlY2VpdmUgc3Ry dWN0dXJlc1xuIik7CgkJZW1fc3RvcChhZGFwdGVyKTsKCQlyZXR1cm47Cgl9CgllbV9pbml0aWFs aXplX3JlY2VpdmVfdW5pdChhZGFwdGVyKTsKCgkvKiBEb24ndCBsb3NlIHByb21pc2N1b3VzIHNl dHRpbmdzICovCgllbV9zZXRfcHJvbWlzYyhhZGFwdGVyKTsKCglpZnAtPmlmX2Rydl9mbGFncyB8 PSBJRkZfRFJWX1JVTk5JTkc7CglpZnAtPmlmX2Rydl9mbGFncyAmPSB+SUZGX0RSVl9PQUNUSVZF OwoKCWNhbGxvdXRfcmVzZXQoJmFkYXB0ZXItPnRpbWVyLCBoeiwgZW1fbG9jYWxfdGltZXIsIGFk YXB0ZXIpOwoJZTEwMDBfY2xlYXJfaHdfY250cnNfYmFzZV9nZW5lcmljKCZhZGFwdGVyLT5odyk7 CgoJLyogTVNJL1ggY29uZmlndXJhdGlvbiBmb3IgODI1NzQgKi8KCWlmIChhZGFwdGVyLT5ody5t YWMudHlwZSA9PSBlMTAwMF84MjU3NCkgewoJCWludCB0bXA7CgkJdG1wID0gRTEwMDBfUkVBRF9S RUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9DVFJMX0VYVCk7CgkJdG1wIHw9IEUxMDAwX0NUUkxfRVhU X1BCQV9DTFI7CgkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfQ1RSTF9FWFQs IHRtcCk7CgkJLyogU2V0IHRoZSBJVkFSIC0gaW50ZXJydXB0IHZlY3RvciByb3V0aW5nLiAqLwoJ CUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0lWQVIsIGFkYXB0ZXItPml2YXJz KTsKCX0KCiNpZmRlZiBERVZJQ0VfUE9MTElORwoJLyoKCSAqIE9ubHkgZW5hYmxlIGludGVycnVw dHMgaWYgd2UgYXJlIG5vdCBwb2xsaW5nLCBtYWtlIHN1cmUKCSAqIHRoZXkgYXJlIG9mZiBvdGhl cndpc2UuCgkgKi8KCWlmIChpZnAtPmlmX2NhcGVuYWJsZSAmIElGQ0FQX1BPTExJTkcpCgkJZW1f ZGlzYWJsZV9pbnRyKGFkYXB0ZXIpOwoJZWxzZQojZW5kaWYgLyogREVWSUNFX1BPTExJTkcgKi8K CQllbV9lbmFibGVfaW50cihhZGFwdGVyKTsKCgkvKiBBTVQgYmFzZWQgaGFyZHdhcmUgY2FuIG5v dyB0YWtlIGNvbnRyb2wgZnJvbSBmaXJtd2FyZSAqLwoJaWYgKGFkYXB0ZXItPmhhc19tYW5hZ2Ug JiYgYWRhcHRlci0+aGFzX2FtdCkKCQllbV9nZXRfaHdfY29udHJvbChhZGFwdGVyKTsKCgkvKiBE b24ndCByZXNldCB0aGUgcGh5IG5leHQgdGltZSBpbml0IGdldHMgY2FsbGVkICovCglhZGFwdGVy LT5ody5waHkucmVzZXRfZGlzYWJsZSA9IFRSVUU7Cn0KCnN0YXRpYyB2b2lkCmVtX2luaXQodm9p ZCAqYXJnKQp7CglzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGFyZzsKCglFTV9DT1JFX0xPQ0so YWRhcHRlcik7CgllbV9pbml0X2xvY2tlZChhZGFwdGVyKTsKCUVNX0NPUkVfVU5MT0NLKGFkYXB0 ZXIpOwp9CgoKI2lmZGVmIERFVklDRV9QT0xMSU5HCi8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIExlZ2Fj eSBwb2xsaW5nIHJvdXRpbmU6IG5vdGUgdGhpcyBvbmx5IHdvcmtzIHdpdGggc2luZ2xlIHF1ZXVl CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKZW1fcG9sbChzdHJ1Y3QgaWZuZXQgKmlmcCwg ZW51bSBwb2xsX2NtZCBjbWQsIGludCBjb3VudCkKewoJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIg PSBpZnAtPmlmX3NvZnRjOwoJc3RydWN0IHR4X3JpbmcJKnR4ciA9IGFkYXB0ZXItPnR4X3Jpbmdz OwoJc3RydWN0IHJ4X3JpbmcJKnJ4ciA9IGFkYXB0ZXItPnJ4X3JpbmdzOwoJdTMyCQlyZWdfaWNy OwoJaW50CQlyeF9kb25lOwoKCUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCWlmICgoaWZwLT5pZl9k cnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5JTkcpID09IDApIHsKCQlFTV9DT1JFX1VOTE9DSyhhZGFw dGVyKTsKCQlyZXR1cm4gKDApOwoJfQoKCWlmIChjbWQgPT0gUE9MTF9BTkRfQ0hFQ0tfU1RBVFVT KSB7CgkJcmVnX2ljciA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfSUNSKTsK CQlpZiAocmVnX2ljciAmIChFMTAwMF9JQ1JfUlhTRVEgfCBFMTAwMF9JQ1JfTFNDKSkgewoJCQlj YWxsb3V0X3N0b3AoJmFkYXB0ZXItPnRpbWVyKTsKCQkJYWRhcHRlci0+aHcubWFjLmdldF9saW5r X3N0YXR1cyA9IDE7CgkJCWVtX3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKCQkJY2FsbG91 dF9yZXNldCgmYWRhcHRlci0+dGltZXIsIGh6LAoJCQkgICAgZW1fbG9jYWxfdGltZXIsIGFkYXB0 ZXIpOwoJCX0KCX0KCUVNX0NPUkVfVU5MT0NLKGFkYXB0ZXIpOwoKCWVtX3J4ZW9mKHJ4ciwgY291 bnQsICZyeF9kb25lKTsKCglFTV9UWF9MT0NLKHR4cik7CgllbV90eGVvZih0eHIpOwojaWZkZWYg RU1fTVVMVElRVUVVRQoJaWYgKCFkcmJyX2VtcHR5KGlmcCwgdHhyLT5icikpCgkJZW1fbXFfc3Rh cnRfbG9ja2VkKGlmcCwgdHhyLCBOVUxMKTsKI2Vsc2UKCWlmICghSUZRX0RSVl9JU19FTVBUWSgm aWZwLT5pZl9zbmQpKQoJCWVtX3N0YXJ0X2xvY2tlZChpZnAsIHR4cik7CiNlbmRpZgoJRU1fVFhf VU5MT0NLKHR4cik7CgoJcmV0dXJuIChyeF9kb25lKTsKfQojZW5kaWYgLyogREVWSUNFX1BPTExJ TkcgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBGYXN0IExlZ2FjeS9NU0kgQ29tYmluZWQgSW50 ZXJydXB0IFNlcnZpY2Ugcm91dGluZSAgCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKZW1f aXJxX2Zhc3Qodm9pZCAqYXJnKQp7CglzdHJ1Y3QgYWRhcHRlcgkqYWRhcHRlciA9IGFyZzsKCXN0 cnVjdCBpZm5ldAkqaWZwOwoJdTMyCQlyZWdfaWNyOwoKCWlmcCA9IGFkYXB0ZXItPmlmcDsKCgly ZWdfaWNyID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9JQ1IpOwoKCS8qIEhv dCBlamVjdD8gICovCglpZiAocmVnX2ljciA9PSAweGZmZmZmZmZmKQoJCXJldHVybiBGSUxURVJf U1RSQVk7CgoJLyogRGVmaW5pdGVseSBub3Qgb3VyIGludGVycnVwdC4gICovCglpZiAocmVnX2lj ciA9PSAweDApCgkJcmV0dXJuIEZJTFRFUl9TVFJBWTsKCgkvKgoJICogU3RhcnRpbmcgd2l0aCB0 aGUgODI1NzEgY2hpcCwgYml0IDMxIHNob3VsZCBiZSB1c2VkIHRvCgkgKiBkZXRlcm1pbmUgd2hl dGhlciB0aGUgaW50ZXJydXB0IGJlbG9uZ3MgdG8gdXMuCgkgKi8KCWlmIChhZGFwdGVyLT5ody5t YWMudHlwZSA+PSBlMTAwMF84MjU3MSAmJgoJICAgIChyZWdfaWNyICYgRTEwMDBfSUNSX0lOVF9B U1NFUlRFRCkgPT0gMCkKCQlyZXR1cm4gRklMVEVSX1NUUkFZOwoKCWVtX2Rpc2FibGVfaW50cihh ZGFwdGVyKTsKCXRhc2txdWV1ZV9lbnF1ZXVlKGFkYXB0ZXItPnRxLCAmYWRhcHRlci0+cXVlX3Rh c2spOwoKCS8qIExpbmsgc3RhdHVzIGNoYW5nZSAqLwoJaWYgKHJlZ19pY3IgJiAoRTEwMDBfSUNS X1JYU0VRIHwgRTEwMDBfSUNSX0xTQykpIHsKCQlhZGFwdGVyLT5ody5tYWMuZ2V0X2xpbmtfc3Rh dHVzID0gMTsKCQl0YXNrcXVldWVfZW5xdWV1ZSh0YXNrcXVldWVfZmFzdCwgJmFkYXB0ZXItPmxp bmtfdGFzayk7Cgl9CgoJaWYgKHJlZ19pY3IgJiBFMTAwMF9JQ1JfUlhPKQoJCWFkYXB0ZXItPnJ4 X292ZXJydW5zKys7CglyZXR1cm4gRklMVEVSX0hBTkRMRUQ7Cn0KCi8qIENvbWJpbmVkIFJYL1RY IGhhbmRsZXIsIHVzZWQgYnkgTGVnYWN5IGFuZCBNU0kgKi8Kc3RhdGljIHZvaWQKZW1faGFuZGxl X3F1ZSh2b2lkICpjb250ZXh0LCBpbnQgcGVuZGluZykKewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0 ZXIgPSBjb250ZXh0OwoJc3RydWN0IGlmbmV0CSppZnAgPSBhZGFwdGVyLT5pZnA7CglzdHJ1Y3Qg dHhfcmluZwkqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7CglzdHJ1Y3QgcnhfcmluZwkqcnhyID0g YWRhcHRlci0+cnhfcmluZ3M7Cglib29sCQltb3JlOwoKCglpZiAoaWZwLT5pZl9kcnZfZmxhZ3Mg JiBJRkZfRFJWX1JVTk5JTkcpIHsKCQltb3JlID0gZW1fcnhlb2YocnhyLCBhZGFwdGVyLT5yeF9w cm9jZXNzX2xpbWl0LCBOVUxMKTsKCgkJRU1fVFhfTE9DSyh0eHIpOwoJCWlmIChlbV90eGVvZih0 eHIpKQoJCQltb3JlID0gVFJVRTsKI2lmZGVmIEVNX01VTFRJUVVFVUUKCQlpZiAoIWRyYnJfZW1w dHkoaWZwLCB0eHItPmJyKSkKCQkJZW1fbXFfc3RhcnRfbG9ja2VkKGlmcCwgdHhyLCBOVUxMKTsK I2Vsc2UKCQlpZiAoIUlGUV9EUlZfSVNfRU1QVFkoJmlmcC0+aWZfc25kKSkKCQkJZW1fc3RhcnRf bG9ja2VkKGlmcCwgdHhyKTsKI2VuZGlmCgkJRU1fVFhfVU5MT0NLKHR4cik7CgkJaWYgKG1vcmUp IHsKCQkJdGFza3F1ZXVlX2VucXVldWUoYWRhcHRlci0+dHEsICZhZGFwdGVyLT5xdWVfdGFzayk7 CgkJCXJldHVybjsKCQl9Cgl9CgoJZW1fZW5hYmxlX2ludHIoYWRhcHRlcik7CglyZXR1cm47Cn0K CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqCiAqCiAqICBNU0lYIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmVzCiAq CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZAplbV9tc2l4X3R4KHZvaWQgKmFyZykKewoJc3Ry dWN0IHR4X3JpbmcgKnR4ciA9IGFyZzsKCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gdHhyLT5h ZGFwdGVyOwoJYm9vbAkJbW9yZTsKCgkrK3R4ci0+dHhfaXJxOwoJRU1fVFhfTE9DSyh0eHIpOwoJ bW9yZSA9IGVtX3R4ZW9mKHR4cik7CglFTV9UWF9VTkxPQ0sodHhyKTsKCWlmIChtb3JlKQoJCXRh c2txdWV1ZV9lbnF1ZXVlKHR4ci0+dHEsICZ0eHItPnR4X3Rhc2spOwoJZWxzZQoJCS8qIFJlZW5h YmxlIHRoaXMgaW50ZXJydXB0ICovCgkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEw MDBfSU1TLCB0eHItPmltcyk7CglyZXR1cm47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIE1TSVgg UlggSW50ZXJydXB0IFNlcnZpY2Ugcm91dGluZQogKgogKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2 b2lkCmVtX21zaXhfcngodm9pZCAqYXJnKQp7CglzdHJ1Y3QgcnhfcmluZwkqcnhyID0gYXJnOwoJ c3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSByeHItPmFkYXB0ZXI7Cglib29sCQltb3JlOwoKCSsr cnhyLT5yeF9pcnE7Cgltb3JlID0gZW1fcnhlb2YocnhyLCBhZGFwdGVyLT5yeF9wcm9jZXNzX2xp bWl0LCBOVUxMKTsKCWlmIChtb3JlKQoJCXRhc2txdWV1ZV9lbnF1ZXVlKHJ4ci0+dHEsICZyeHIt PnJ4X3Rhc2spOwoJZWxzZQoJCS8qIFJlZW5hYmxlIHRoaXMgaW50ZXJydXB0ICovCgkJRTEwMDBf V1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfSU1TLCByeHItPmltcyk7CglyZXR1cm47Cn0K Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKICoKICogIE1TSVggTGluayBGYXN0IEludGVycnVwdCBTZXJ2aWNlIHJv dXRpbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmVtX21zaXhfbGluayh2b2lkICph cmcpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFwdGVyID0gYXJnOwoJdTMyCQlyZWdfaWNyOwoKCSsr YWRhcHRlci0+bGlua19pcnE7CglyZWdfaWNyID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3 LCBFMTAwMF9JQ1IpOwoKCWlmIChyZWdfaWNyICYgKEUxMDAwX0lDUl9SWFNFUSB8IEUxMDAwX0lD Ul9MU0MpKSB7CgkJYWRhcHRlci0+aHcubWFjLmdldF9saW5rX3N0YXR1cyA9IDE7CgkJZW1faGFu ZGxlX2xpbmsoYWRhcHRlciwgMCk7Cgl9IGVsc2UKCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXIt Pmh3LCBFMTAwMF9JTVMsCgkJICAgIEVNX01TSVhfTElOSyB8IEUxMDAwX0lNU19MU0MpOwoJcmV0 dXJuOwp9CgpzdGF0aWMgdm9pZAplbV9oYW5kbGVfcngodm9pZCAqY29udGV4dCwgaW50IHBlbmRp bmcpCnsKCXN0cnVjdCByeF9yaW5nCSpyeHIgPSBjb250ZXh0OwoJc3RydWN0IGFkYXB0ZXIJKmFk YXB0ZXIgPSByeHItPmFkYXB0ZXI7CiAgICAgICAgYm9vbCAgICAgICAgICAgIG1vcmU7CgoJbW9y ZSA9IGVtX3J4ZW9mKHJ4ciwgYWRhcHRlci0+cnhfcHJvY2Vzc19saW1pdCwgTlVMTCk7CglpZiAo bW9yZSkKCQl0YXNrcXVldWVfZW5xdWV1ZShyeHItPnRxLCAmcnhyLT5yeF90YXNrKTsKCWVsc2UK CQkvKiBSZWVuYWJsZSB0aGlzIGludGVycnVwdCAqLwoJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRl ci0+aHcsIEUxMDAwX0lNUywgcnhyLT5pbXMpOwp9CgpzdGF0aWMgdm9pZAplbV9oYW5kbGVfdHgo dm9pZCAqY29udGV4dCwgaW50IHBlbmRpbmcpCnsKCXN0cnVjdCB0eF9yaW5nCSp0eHIgPSBjb250 ZXh0OwoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSB0eHItPmFkYXB0ZXI7CglzdHJ1Y3QgaWZu ZXQJKmlmcCA9IGFkYXB0ZXItPmlmcDsKCglpZiAoIUVNX1RYX1RSWUxPQ0sodHhyKSkKCQlyZXR1 cm47CgoJZW1fdHhlb2YodHhyKTsKCiNpZmRlZiBFTV9NVUxUSVFVRVVFCglpZiAoIWRyYnJfZW1w dHkoaWZwLCB0eHItPmJyKSkKCQllbV9tcV9zdGFydF9sb2NrZWQoaWZwLCB0eHIsIE5VTEwpOwoj ZWxzZQoJaWYgKCFJRlFfRFJWX0lTX0VNUFRZKCZpZnAtPmlmX3NuZCkpCgkJZW1fc3RhcnRfbG9j a2VkKGlmcCwgdHhyKTsKI2VuZGlmCglFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAw MF9JTVMsIHR4ci0+aW1zKTsKCUVNX1RYX1VOTE9DSyh0eHIpOwp9CgpzdGF0aWMgdm9pZAplbV9o YW5kbGVfbGluayh2b2lkICpjb250ZXh0LCBpbnQgcGVuZGluZykKewoJc3RydWN0IGFkYXB0ZXIJ KmFkYXB0ZXIgPSBjb250ZXh0OwoJc3RydWN0IGlmbmV0ICppZnAgPSBhZGFwdGVyLT5pZnA7CgoJ aWYgKCEoaWZwLT5pZl9kcnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5JTkcpKQoJCXJldHVybjsKCglF TV9DT1JFX0xPQ0soYWRhcHRlcik7CgljYWxsb3V0X3N0b3AoJmFkYXB0ZXItPnRpbWVyKTsKCWVt X3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKCWNhbGxvdXRfcmVzZXQoJmFkYXB0ZXItPnRp bWVyLCBoeiwgZW1fbG9jYWxfdGltZXIsIGFkYXB0ZXIpOwoJRTEwMDBfV1JJVEVfUkVHKCZhZGFw dGVyLT5odywgRTEwMDBfSU1TLAoJICAgIEVNX01TSVhfTElOSyB8IEUxMDAwX0lNU19MU0MpOwoJ RU1fQ09SRV9VTkxPQ0soYWRhcHRlcik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBNZWRpYSBJ b2N0bCBjYWxsYmFjawogKgogKiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUg dXNlciBxdWVyaWVzIHRoZSBzdGF0dXMgb2YKICogIHRoZSBpbnRlcmZhY2UgdXNpbmcgaWZjb25m aWcuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZAplbV9tZWRpYV9zdGF0dXMoc3RydWN0 IGlmbmV0ICppZnAsIHN0cnVjdCBpZm1lZGlhcmVxICppZm1yKQp7CglzdHJ1Y3QgYWRhcHRlciAq YWRhcHRlciA9IGlmcC0+aWZfc29mdGM7Cgl1X2NoYXIgZmliZXJfdHlwZSA9IElGTV8xMDAwX1NY OwoKCUlOSVRfREVCVUdPVVQoImVtX21lZGlhX3N0YXR1czogYmVnaW4iKTsKCglFTV9DT1JFX0xP Q0soYWRhcHRlcik7CgllbV91cGRhdGVfbGlua19zdGF0dXMoYWRhcHRlcik7CgoJaWZtci0+aWZt X3N0YXR1cyA9IElGTV9BVkFMSUQ7CglpZm1yLT5pZm1fYWN0aXZlID0gSUZNX0VUSEVSOwoKCWlm ICghYWRhcHRlci0+bGlua19hY3RpdmUpIHsKCQlFTV9DT1JFX1VOTE9DSyhhZGFwdGVyKTsKCQly ZXR1cm47Cgl9CgoJaWZtci0+aWZtX3N0YXR1cyB8PSBJRk1fQUNUSVZFOwoKCWlmICgoYWRhcHRl ci0+aHcucGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKCSAgICAo YWRhcHRlci0+aHcucGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9z ZXJkZXMpKSB7CgkJaWZtci0+aWZtX2FjdGl2ZSB8PSBmaWJlcl90eXBlIHwgSUZNX0ZEWDsKCX0g ZWxzZSB7CgkJc3dpdGNoIChhZGFwdGVyLT5saW5rX3NwZWVkKSB7CgkJY2FzZSAxMDoKCQkJaWZt ci0+aWZtX2FjdGl2ZSB8PSBJRk1fMTBfVDsKCQkJYnJlYWs7CgkJY2FzZSAxMDA6CgkJCWlmbXIt PmlmbV9hY3RpdmUgfD0gSUZNXzEwMF9UWDsKCQkJYnJlYWs7CgkJY2FzZSAxMDAwOgoJCQlpZm1y LT5pZm1fYWN0aXZlIHw9IElGTV8xMDAwX1Q7CgkJCWJyZWFrOwoJCX0KCQlpZiAoYWRhcHRlci0+ bGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVgpCgkJCWlmbXItPmlmbV9hY3RpdmUgfD0gSUZNX0ZE WDsKCQllbHNlCgkJCWlmbXItPmlmbV9hY3RpdmUgfD0gSUZNX0hEWDsKCX0KCUVNX0NPUkVfVU5M T0NLKGFkYXB0ZXIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBNZWRpYSBJb2N0bCBjYWxsYmFj awogKgogKiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgc3Bl ZWQvZHVwbGV4IHVzaW5nCiAqICBtZWRpYS9tZWRpb3B0IG9wdGlvbiB3aXRoIGlmY29uZmlnLgog KgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8Kc3RhdGljIGludAplbV9tZWRpYV9jaGFuZ2Uoc3RydWN0IGlmbmV0 ICppZnApCnsKCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gaWZwLT5pZl9zb2Z0YzsKCXN0cnVj dCBpZm1lZGlhICAqaWZtID0gJmFkYXB0ZXItPm1lZGlhOwoKCUlOSVRfREVCVUdPVVQoImVtX21l ZGlhX2NoYW5nZTogYmVnaW4iKTsKCglpZiAoSUZNX1RZUEUoaWZtLT5pZm1fbWVkaWEpICE9IElG TV9FVEhFUikKCQlyZXR1cm4gKEVJTlZBTCk7CgoJRU1fQ09SRV9MT0NLKGFkYXB0ZXIpOwoJc3dp dGNoIChJRk1fU1VCVFlQRShpZm0tPmlmbV9tZWRpYSkpIHsKCWNhc2UgSUZNX0FVVE86CgkJYWRh cHRlci0+aHcubWFjLmF1dG9uZWcgPSBET19BVVRPX05FRzsKCQlhZGFwdGVyLT5ody5waHkuYXV0 b25lZ19hZHZlcnRpc2VkID0gQVVUT05FR19BRFZfREVGQVVMVDsKCQlicmVhazsKCWNhc2UgSUZN XzEwMDBfTFg6CgljYXNlIElGTV8xMDAwX1NYOgoJY2FzZSBJRk1fMTAwMF9UOgoJCWFkYXB0ZXIt Pmh3Lm1hYy5hdXRvbmVnID0gRE9fQVVUT19ORUc7CgkJYWRhcHRlci0+aHcucGh5LmF1dG9uZWdf YWR2ZXJ0aXNlZCA9IEFEVkVSVElTRV8xMDAwX0ZVTEw7CgkJYnJlYWs7CgljYXNlIElGTV8xMDBf VFg6CgkJYWRhcHRlci0+aHcubWFjLmF1dG9uZWcgPSBGQUxTRTsKCQlhZGFwdGVyLT5ody5waHku YXV0b25lZ19hZHZlcnRpc2VkID0gMDsKCQlpZiAoKGlmbS0+aWZtX21lZGlhICYgSUZNX0dNQVNL KSA9PSBJRk1fRkRYKQoJCQlhZGFwdGVyLT5ody5tYWMuZm9yY2VkX3NwZWVkX2R1cGxleCA9IEFE VkVSVElTRV8xMDBfRlVMTDsKCQllbHNlCgkJCWFkYXB0ZXItPmh3Lm1hYy5mb3JjZWRfc3BlZWRf ZHVwbGV4ID0gQURWRVJUSVNFXzEwMF9IQUxGOwoJCWJyZWFrOwoJY2FzZSBJRk1fMTBfVDoKCQlh ZGFwdGVyLT5ody5tYWMuYXV0b25lZyA9IEZBTFNFOwoJCWFkYXB0ZXItPmh3LnBoeS5hdXRvbmVn X2FkdmVydGlzZWQgPSAwOwoJCWlmICgoaWZtLT5pZm1fbWVkaWEgJiBJRk1fR01BU0spID09IElG TV9GRFgpCgkJCWFkYXB0ZXItPmh3Lm1hYy5mb3JjZWRfc3BlZWRfZHVwbGV4ID0gQURWRVJUSVNF XzEwX0ZVTEw7CgkJZWxzZQoJCQlhZGFwdGVyLT5ody5tYWMuZm9yY2VkX3NwZWVkX2R1cGxleCA9 IEFEVkVSVElTRV8xMF9IQUxGOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlkZXZpY2VfcHJpbnRmKGFk YXB0ZXItPmRldiwgIlVuc3VwcG9ydGVkIG1lZGlhIHR5cGVcbiIpOwoJfQoKCS8qIEFzIHRoZSBz cGVlZC9kdXBsZXggc2V0dGluZ3MgbXkgaGF2ZSBjaGFuZ2VkIHdlIG5lZWQgdG8KCSAqIHJlc2V0 IHRoZSBQSFkuCgkgKi8KCWFkYXB0ZXItPmh3LnBoeS5yZXNldF9kaXNhYmxlID0gRkFMU0U7CgoJ ZW1faW5pdF9sb2NrZWQoYWRhcHRlcik7CglFTV9DT1JFX1VOTE9DSyhhZGFwdGVyKTsKCglyZXR1 cm4gKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBUaGlzIHJvdXRpbmUgbWFwcyB0aGUgbWJ1 ZnMgdG8gdHggZGVzY3JpcHRvcnMuCiAqCiAqICByZXR1cm4gMCBvbiBzdWNjZXNzLCBwb3NpdGl2 ZSBvbiBmYWlsdXJlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludAplbV94bWl0KHN0cnVjdCB0 eF9yaW5nICp0eHIsIHN0cnVjdCBtYnVmICoqbV9oZWFkcCkKewoJc3RydWN0IGFkYXB0ZXIJCSph ZGFwdGVyID0gdHhyLT5hZGFwdGVyOwoJYnVzX2RtYV9zZWdtZW50X3QJc2Vnc1tFTV9NQVhfU0NB VFRFUl07CglidXNfZG1hbWFwX3QJCW1hcDsKCXN0cnVjdCBlbV9idWZmZXIJKnR4X2J1ZmZlciwg KnR4X2J1ZmZlcl9tYXBwZWQ7CglzdHJ1Y3QgZTEwMDBfdHhfZGVzYwkqY3R4ZCA9IE5VTEw7Cglz dHJ1Y3QgbWJ1ZgkJKm1faGVhZDsKCXUzMgkJCXR4ZF91cHBlciwgdHhkX2xvd2VyLCB0eGRfdXNl ZCwgdHhkX3NhdmVkOwoJaW50CQkJbnNlZ3MsIGksIGosIGZpcnN0LCBsYXN0ID0gMDsKCWludAkJ CWVycm9yLCBkb190c28sIHRzb19kZXNjID0gMDsKCgltX2hlYWQgPSAqbV9oZWFkcDsKCXR4ZF91 cHBlciA9IHR4ZF9sb3dlciA9IHR4ZF91c2VkID0gdHhkX3NhdmVkID0gMDsKCWRvX3RzbyA9ICgo bV9oZWFkLT5tX3BrdGhkci5jc3VtX2ZsYWdzICYgQ1NVTV9UU08pICE9IDApOwoKCS8qCgkgKiBU U08gd29ya2Fyb3VuZDogCgkgKiAgSWYgYW4gbWJ1ZiBpcyBvbmx5IGhlYWRlciB3ZSBuZWVkICAK CSAqICAgICB0byBwdWxsIDQgYnl0ZXMgb2YgZGF0YSBpbnRvIGl0LiAKCSAqLwoJaWYgKGRvX3Rz byAmJiAobV9oZWFkLT5tX2xlbiA8PSBNX1RTT19MRU4pKSB7CgkJbV9oZWFkID0gbV9wdWxsdXAo bV9oZWFkLCBNX1RTT19MRU4gKyA0KTsKCQkqbV9oZWFkcCA9IG1faGVhZDsKCQlpZiAobV9oZWFk ID09IE5VTEwpCgkJCXJldHVybiAoRU5PQlVGUyk7Cgl9CgoJLyoKCSAqIE1hcCB0aGUgcGFja2V0 IGZvciBETUEKCSAqCgkgKiBDYXB0dXJlIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGluZGV4LAoJICog dGhpcyBkZXNjcmlwdG9yIHdpbGwgaGF2ZSB0aGUgaW5kZXgKCSAqIG9mIHRoZSBFT1Agd2hpY2gg aXMgdGhlIG9ubHkgb25lIHRoYXQKCSAqIG5vdyBnZXRzIGEgRE9ORSBiaXQgd3JpdGViYWNrLgoJ ICovCglmaXJzdCA9IHR4ci0+bmV4dF9hdmFpbF9kZXNjOwoJdHhfYnVmZmVyID0gJnR4ci0+dHhf YnVmZmVyc1tmaXJzdF07Cgl0eF9idWZmZXJfbWFwcGVkID0gdHhfYnVmZmVyOwoJbWFwID0gdHhf YnVmZmVyLT5tYXA7CgoJZXJyb3IgPSBidXNfZG1hbWFwX2xvYWRfbWJ1Zl9zZyh0eHItPnR4dGFn LCBtYXAsCgkgICAgKm1faGVhZHAsIHNlZ3MsICZuc2VncywgQlVTX0RNQV9OT1dBSVQpOwoKCS8q CgkgKiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGVycm9ycyB3ZSBjYW4gKHRyeSkgdG8gaGFuZGxl OgoJICogLSBFRkJJRyBtZWFucyB0aGUgbWJ1ZiBjaGFpbiB3YXMgdG9vIGxvbmcgYW5kIGJ1c19k bWEgcmFuCgkgKiAgIG91dCBvZiBzZWdtZW50cy4gIERlZnJhZ21lbnQgdGhlIG1idWYgY2hhaW4g YW5kIHRyeSBhZ2Fpbi4KCSAqIC0gRU5PTUVNIG1lYW5zIGJ1c19kbWEgY291bGQgbm90IG9idGFp biBlbm91Z2ggYm91bmNlIGJ1ZmZlcnMKCSAqICAgYXQgdGhpcyBwb2ludCBpbiB0aW1lLiAgRGVm ZXIgc2VuZGluZyBhbmQgdHJ5IGFnYWluIGxhdGVyLgoJICogQWxsIG90aGVyIGVycm9ycywgaW4g cGFydGljdWxhciBFSU5WQUwsIGFyZSBmYXRhbCBhbmQgcHJldmVudCB0aGUKCSAqIG1idWYgY2hh aW4gZnJvbSBldmVyIGdvaW5nIHRocm91Z2guICBEcm9wIGl0IGFuZCByZXBvcnQgZXJyb3IuCgkg Ki8KCWlmIChlcnJvciA9PSBFRkJJRykgewoJCXN0cnVjdCBtYnVmICptOwoKCQltID0gbV9kZWZy YWcoKm1faGVhZHAsIE1fRE9OVFdBSVQpOwoJCWlmIChtID09IE5VTEwpIHsKCQkJYWRhcHRlci0+ bWJ1Zl9hbGxvY19mYWlsZWQrKzsKCQkJbV9mcmVlbSgqbV9oZWFkcCk7CgkJCSptX2hlYWRwID0g TlVMTDsKCQkJcmV0dXJuIChFTk9CVUZTKTsKCQl9CgkJKm1faGVhZHAgPSBtOwoKCQkvKiBUcnkg aXQgYWdhaW4gKi8KCQllcnJvciA9IGJ1c19kbWFtYXBfbG9hZF9tYnVmX3NnKHR4ci0+dHh0YWcs IG1hcCwKCQkgICAgKm1faGVhZHAsIHNlZ3MsICZuc2VncywgQlVTX0RNQV9OT1dBSVQpOwoKCQlp ZiAoZXJyb3IpIHsKCQkJYWRhcHRlci0+bm9fdHhfZG1hX3NldHVwKys7CgkJCW1fZnJlZW0oKm1f aGVhZHApOwoJCQkqbV9oZWFkcCA9IE5VTEw7CgkJCXJldHVybiAoZXJyb3IpOwoJCX0KCX0gZWxz ZSBpZiAoZXJyb3IgIT0gMCkgewoJCWFkYXB0ZXItPm5vX3R4X2RtYV9zZXR1cCsrOwoJCXJldHVy biAoZXJyb3IpOwoJfQoKCS8qCgkgKiBUU08gSGFyZHdhcmUgd29ya2Fyb3VuZCwgaWYgdGhpcyBw YWNrZXQgaXMgbm90CgkgKiBUU08sIGFuZCBpcyBvbmx5IGEgc2luZ2xlIGRlc2NyaXB0b3IgbG9u ZywgYW5kCgkgKiBpdCBmb2xsb3dzIGEgVFNPIGJ1cnN0LCB0aGVuIHdlIG5lZWQgdG8gYWRkIGEK CSAqIHNlbnRpbmVsIGRlc2NyaXB0b3IgdG8gcHJldmVudCBwcmVtYXR1cmUgd3JpdGViYWNrLgoJ ICovCglpZiAoKGRvX3RzbyA9PSAwKSAmJiAodHhyLT50eF90c28gPT0gVFJVRSkpIHsKCQlpZiAo bnNlZ3MgPT0gMSkKCQkJdHNvX2Rlc2MgPSBUUlVFOwoJCXR4ci0+dHhfdHNvID0gRkFMU0U7Cgl9 CgogICAgICAgIGlmIChuc2VncyA+ICh0eHItPnR4X2F2YWlsIC0gMikpIHsKICAgICAgICAgICAg ICAgIHR4ci0+bm9fZGVzY19hdmFpbCsrOwoJCWJ1c19kbWFtYXBfdW5sb2FkKHR4ci0+dHh0YWcs IG1hcCk7CgkJcmV0dXJuIChFTk9CVUZTKTsKICAgICAgICB9CgltX2hlYWQgPSAqbV9oZWFkcDsK CgkvKiBEbyBoYXJkd2FyZSBhc3Npc3RzICovCiNpZiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA3MDAw MDAKCWlmIChtX2hlYWQtPm1fcGt0aGRyLmNzdW1fZmxhZ3MgJiBDU1VNX1RTTykgewoJCWVycm9y ID0gZW1fdHNvX3NldHVwKHR4ciwgbV9oZWFkLCAmdHhkX3VwcGVyLCAmdHhkX2xvd2VyKTsKCQlp ZiAoZXJyb3IgIT0gVFJVRSkKCQkJcmV0dXJuIChFTlhJTyk7IC8qIHNvbWV0aGluZyBmb29iYXIg Ki8KCQkvKiB3ZSBuZWVkIHRvIG1ha2UgYSBmaW5hbCBzZW50aW5lbCB0cmFuc21pdCBkZXNjICov CgkJdHNvX2Rlc2MgPSBUUlVFOwoJfSBlbHNlCiNlbmRpZgoJaWYgKG1faGVhZC0+bV9wa3RoZHIu Y3N1bV9mbGFncyAmIENTVU1fT0ZGTE9BRCkKCQllbV90cmFuc21pdF9jaGVja3N1bV9zZXR1cCh0 eHIsICBtX2hlYWQsCgkJICAgICZ0eGRfdXBwZXIsICZ0eGRfbG93ZXIpOwoKCWkgPSB0eHItPm5l eHRfYXZhaWxfZGVzYzsKCgkvKiBTZXQgdXAgb3VyIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCglm b3IgKGogPSAwOyBqIDwgbnNlZ3M7IGorKykgewoJCWJ1c19zaXplX3Qgc2VnX2xlbjsKCQlidXNf YWRkcl90IHNlZ19hZGRyOwoKCQl0eF9idWZmZXIgPSAmdHhyLT50eF9idWZmZXJzW2ldOwoJCWN0 eGQgPSAmdHhyLT50eF9iYXNlW2ldOwoJCXNlZ19hZGRyID0gc2Vnc1tqXS5kc19hZGRyOwoJCXNl Z19sZW4gID0gc2Vnc1tqXS5kc19sZW47CgkJLyoKCQkqKiBUU08gV29ya2Fyb3VuZDoKCQkqKiBJ ZiB0aGlzIGlzIHRoZSBsYXN0IGRlc2NyaXB0b3IsIHdlIHdhbnQgdG8KCQkqKiBzcGxpdCBpdCBz byB3ZSBoYXZlIGEgc21hbGwgZmluYWwgc2VudGluZWwKCQkqLwoJCWlmICh0c29fZGVzYyAmJiAo aiA9PSAobnNlZ3MgLTEpKSAmJiAoc2VnX2xlbiA+IDgpKSB7CgkJCXNlZ19sZW4gLT0gNDsKCQkJ Y3R4ZC0+YnVmZmVyX2FkZHIgPSBodG9sZTY0KHNlZ19hZGRyKTsKCQkJY3R4ZC0+bG93ZXIuZGF0 YSA9IGh0b2xlMzIoCgkJCWFkYXB0ZXItPnR4ZF9jbWQgfCB0eGRfbG93ZXIgfCBzZWdfbGVuKTsK CQkJY3R4ZC0+dXBwZXIuZGF0YSA9CgkJCSAgICBodG9sZTMyKHR4ZF91cHBlcik7CgkJCWlmICgr K2kgPT0gYWRhcHRlci0+bnVtX3R4X2Rlc2MpCgkJCQlpID0gMDsKCQkJLyogTm93IG1ha2UgdGhl IHNlbnRpbmVsICovCQoJCQkrK3R4ZF91c2VkOyAvKiB1c2luZyBhbiBleHRyYSB0eGQgKi8KCQkJ Y3R4ZCA9ICZ0eHItPnR4X2Jhc2VbaV07CgkJCXR4X2J1ZmZlciA9ICZ0eHItPnR4X2J1ZmZlcnNb aV07CgkJCWN0eGQtPmJ1ZmZlcl9hZGRyID0KCQkJICAgIGh0b2xlNjQoc2VnX2FkZHIgKyBzZWdf bGVuKTsKCQkJY3R4ZC0+bG93ZXIuZGF0YSA9IGh0b2xlMzIoCgkJCWFkYXB0ZXItPnR4ZF9jbWQg fCB0eGRfbG93ZXIgfCA0KTsKCQkJY3R4ZC0+dXBwZXIuZGF0YSA9CgkJCSAgICBodG9sZTMyKHR4 ZF91cHBlcik7CgkJCWxhc3QgPSBpOwoJCQlpZiAoKytpID09IGFkYXB0ZXItPm51bV90eF9kZXNj KQoJCQkJaSA9IDA7CgkJfSBlbHNlIHsKCQkJY3R4ZC0+YnVmZmVyX2FkZHIgPSBodG9sZTY0KHNl Z19hZGRyKTsKCQkJY3R4ZC0+bG93ZXIuZGF0YSA9IGh0b2xlMzIoCgkJCWFkYXB0ZXItPnR4ZF9j bWQgfCB0eGRfbG93ZXIgfCBzZWdfbGVuKTsKCQkJY3R4ZC0+dXBwZXIuZGF0YSA9CgkJCSAgICBo dG9sZTMyKHR4ZF91cHBlcik7CgkJCWxhc3QgPSBpOwoJCQlpZiAoKytpID09IGFkYXB0ZXItPm51 bV90eF9kZXNjKQoJCQkJaSA9IDA7CgkJfQoJCXR4X2J1ZmZlci0+bV9oZWFkID0gTlVMTDsKCQl0 eF9idWZmZXItPm5leHRfZW9wID0gLTE7Cgl9CgoJdHhyLT5uZXh0X2F2YWlsX2Rlc2MgPSBpOwoJ dHhyLT50eF9hdmFpbCAtPSBuc2VnczsKCWlmICh0c29fZGVzYykgLyogVFNPIHVzZWQgYW4gZXh0 cmEgZm9yIHNlbnRpbmVsICovCgkJdHhyLT50eF9hdmFpbCAtPSB0eGRfdXNlZDsKCglpZiAobV9o ZWFkLT5tX2ZsYWdzICYgTV9WTEFOVEFHKSB7CgkJLyogU2V0IHRoZSB2bGFuIGlkLiAqLwoJCWN0 eGQtPnVwcGVyLmZpZWxkcy5zcGVjaWFsID0KCQkgICAgaHRvbGUxNihtX2hlYWQtPm1fcGt0aGRy LmV0aGVyX3Z0YWcpOwogICAgICAgICAgICAgICAgLyogVGVsbCBoYXJkd2FyZSB0byBhZGQgdGFn ICovCiAgICAgICAgICAgICAgICBjdHhkLT5sb3dlci5kYXRhIHw9IGh0b2xlMzIoRTEwMDBfVFhE X0NNRF9WTEUpOwogICAgICAgIH0KCiAgICAgICAgdHhfYnVmZmVyLT5tX2hlYWQgPSBtX2hlYWQ7 Cgl0eF9idWZmZXJfbWFwcGVkLT5tYXAgPSB0eF9idWZmZXItPm1hcDsKCXR4X2J1ZmZlci0+bWFw ID0gbWFwOwogICAgICAgIGJ1c19kbWFtYXBfc3luYyh0eHItPnR4dGFnLCBtYXAsIEJVU19ETUFT WU5DX1BSRVdSSVRFKTsKCiAgICAgICAgLyoKICAgICAgICAgKiBMYXN0IERlc2NyaXB0b3Igb2Yg UGFja2V0CgkgKiBuZWVkcyBFbmQgT2YgUGFja2V0IChFT1ApCgkgKiBhbmQgUmVwb3J0IFN0YXR1 cyAoUlMpCiAgICAgICAgICovCiAgICAgICAgY3R4ZC0+bG93ZXIuZGF0YSB8PQoJICAgIGh0b2xl MzIoRTEwMDBfVFhEX0NNRF9FT1AgfCBFMTAwMF9UWERfQ01EX1JTKTsKCS8qCgkgKiBLZWVwIHRy YWNrIGluIHRoZSBmaXJzdCBidWZmZXIgd2hpY2gKCSAqIGRlc2NyaXB0b3Igd2lsbCBiZSB3cml0 dGVuIGJhY2sKCSAqLwoJdHhfYnVmZmVyID0gJnR4ci0+dHhfYnVmZmVyc1tmaXJzdF07Cgl0eF9i dWZmZXItPm5leHRfZW9wID0gbGFzdDsKCgkvKgoJICogQWR2YW5jZSB0aGUgVHJhbnNtaXQgRGVz Y3JpcHRvciBUYWlsIChURFQpLCB0aGlzIHRlbGxzIHRoZSBFMTAwMAoJICogdGhhdCB0aGlzIGZy YW1lIGlzIGF2YWlsYWJsZSB0byB0cmFuc21pdC4KCSAqLwoJYnVzX2RtYW1hcF9zeW5jKHR4ci0+ dHhkbWEuZG1hX3RhZywgdHhyLT50eGRtYS5kbWFfbWFwLAoJICAgIEJVU19ETUFTWU5DX1BSRVJF QUQgfCBCVVNfRE1BU1lOQ19QUkVXUklURSk7CglFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3 LCBFMTAwMF9URFQodHhyLT5tZSksIGkpOwoKCXJldHVybiAoMCk7Cn0KCnN0YXRpYyB2b2lkCmVt X3NldF9wcm9taXNjKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7CglzdHJ1Y3QgaWZuZXQJKmlm cCA9IGFkYXB0ZXItPmlmcDsKCXUzMgkJcmVnX3JjdGw7CgoJcmVnX3JjdGwgPSBFMTAwMF9SRUFE X1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JDVEwpOwoKCWlmIChpZnAtPmlmX2ZsYWdzICYgSUZG X1BST01JU0MpIHsKCQlyZWdfcmN0bCB8PSAoRTEwMDBfUkNUTF9VUEUgfCBFMTAwMF9SQ1RMX01Q RSk7CgkJLyogVHVybiB0aGlzIG9uIGlmIHlvdSB3YW50IHRvIHNlZSBiYWQgcGFja2V0cyAqLwoJ CWlmIChlbV9kZWJ1Z19zYnApCgkJCXJlZ19yY3RsIHw9IEUxMDAwX1JDVExfU0JQOwoJCUUxMDAw X1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JDVEwsIHJlZ19yY3RsKTsKCX0gZWxzZSBp ZiAoaWZwLT5pZl9mbGFncyAmIElGRl9BTExNVUxUSSkgewoJCXJlZ19yY3RsIHw9IEUxMDAwX1JD VExfTVBFOwoJCXJlZ19yY3RsICY9IH5FMTAwMF9SQ1RMX1VQRTsKCQlFMTAwMF9XUklURV9SRUco JmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMLCByZWdfcmN0bCk7Cgl9Cn0KCnN0YXRpYyB2b2lkCmVt X2Rpc2FibGVfcHJvbWlzYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJdTMyCXJlZ19yY3Rs OwoKCXJlZ19yY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMKTsK CglyZWdfcmN0bCAmPSAgKH5FMTAwMF9SQ1RMX1VQRSk7CglyZWdfcmN0bCAmPSAgKH5FMTAwMF9S Q1RMX01QRSk7CglyZWdfcmN0bCAmPSAgKH5FMTAwMF9SQ1RMX1NCUCk7CglFMTAwMF9XUklURV9S RUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMLCByZWdfcmN0bCk7Cn0KCgovKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq CiAqICBNdWx0aWNhc3QgVXBkYXRlCiAqCiAqICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5l dmVyIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QgaXMgdXBkYXRlZC4KICoKICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov CgpzdGF0aWMgdm9pZAplbV9zZXRfbXVsdGkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCXN0 cnVjdCBpZm5ldAkqaWZwID0gYWRhcHRlci0+aWZwOwoJc3RydWN0IGlmbXVsdGlhZGRyICppZm1h OwoJdTMyIHJlZ19yY3RsID0gMDsKCXU4ICAqbXRhOyAvKiBNdWx0aWNhc3QgYXJyYXkgbWVtb3J5 ICovCglpbnQgbWNudCA9IDA7CgoJSU9DVExfREVCVUdPVVQoImVtX3NldF9tdWx0aTogYmVnaW4i KTsKCglpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gZTEwMDBfODI1NDIgJiYgCgkgICAgYWRh cHRlci0+aHcucmV2aXNpb25faWQgPT0gRTEwMDBfUkVWSVNJT05fMikgewoJCXJlZ19yY3RsID0g RTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMKTsKCQlpZiAoYWRhcHRlci0+ aHcuYnVzLnBjaV9jbWRfd29yZCAmIENNRF9NRU1fV1JUX0lOVkFMSURBVEUpCgkJCWUxMDAwX3Bj aV9jbGVhcl9td2koJmFkYXB0ZXItPmh3KTsKCQlyZWdfcmN0bCB8PSBFMTAwMF9SQ1RMX1JTVDsK CQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMLCByZWdfcmN0bCk7CgkJ bXNlY19kZWxheSg1KTsKCX0KCgkvKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgbWVtb3J5IHRvIHNldHVw IGFycmF5ICovCgltdGEgPSBtYWxsb2Moc2l6ZW9mKHU4KSAqCgkgICAgKEVUSF9BRERSX0xFTiAq IE1BWF9OVU1fTVVMVElDQVNUX0FERFJFU1NFUyksCgkgICAgTV9ERVZCVUYsIE1fTk9XQUlUIHwg TV9aRVJPKTsKCWlmIChtdGEgPT0gTlVMTCkKCQlwYW5pYygiZW1fc2V0X211bHRpIG1lbW9yeSBm YWlsdXJlXG4iKTsKCiNpZiBfX0ZyZWVCU0RfdmVyc2lvbiA8IDgwMDAwMAoJSUZfQUREUl9MT0NL KGlmcCk7CiNlbHNlCglpZl9tYWRkcl9ybG9jayhpZnApOwojZW5kaWYKCVRBSUxRX0ZPUkVBQ0go aWZtYSwgJmlmcC0+aWZfbXVsdGlhZGRycywgaWZtYV9saW5rKSB7CgkJaWYgKGlmbWEtPmlmbWFf YWRkci0+c2FfZmFtaWx5ICE9IEFGX0xJTkspCgkJCWNvbnRpbnVlOwoKCQlpZiAobWNudCA9PSBN QVhfTlVNX01VTFRJQ0FTVF9BRERSRVNTRVMpCgkJCWJyZWFrOwoKCQliY29weShMTEFERFIoKHN0 cnVjdCBzb2NrYWRkcl9kbCAqKWlmbWEtPmlmbWFfYWRkciksCgkJICAgICZtdGFbbWNudCAqIEVU SF9BRERSX0xFTl0sIEVUSF9BRERSX0xFTik7CgkJbWNudCsrOwoJfQojaWYgX19GcmVlQlNEX3Zl cnNpb24gPCA4MDAwMDAKCUlGX0FERFJfVU5MT0NLKGlmcCk7CiNlbHNlCglpZl9tYWRkcl9ydW5s b2NrKGlmcCk7CiNlbmRpZgoJaWYgKG1jbnQgPj0gTUFYX05VTV9NVUxUSUNBU1RfQUREUkVTU0VT KSB7CgkJcmVnX3JjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JDVEwp OwoJCXJlZ19yY3RsIHw9IEUxMDAwX1JDVExfTVBFOwoJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRl ci0+aHcsIEUxMDAwX1JDVEwsIHJlZ19yY3RsKTsKCX0gZWxzZQoJCWUxMDAwX3VwZGF0ZV9tY19h ZGRyX2xpc3QoJmFkYXB0ZXItPmh3LCBtdGEsIG1jbnQpOwoKCWlmIChhZGFwdGVyLT5ody5tYWMu dHlwZSA9PSBlMTAwMF84MjU0MiAmJiAKCSAgICBhZGFwdGVyLT5ody5yZXZpc2lvbl9pZCA9PSBF MTAwMF9SRVZJU0lPTl8yKSB7CgkJcmVnX3JjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+ aHcsIEUxMDAwX1JDVEwpOwoJCXJlZ19yY3RsICY9IH5FMTAwMF9SQ1RMX1JTVDsKCQlFMTAwMF9X UklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9SQ1RMLCByZWdfcmN0bCk7CgkJbXNlY19kZWxh eSg1KTsKCQlpZiAoYWRhcHRlci0+aHcuYnVzLnBjaV9jbWRfd29yZCAmIENNRF9NRU1fV1JUX0lO VkFMSURBVEUpCgkJCWUxMDAwX3BjaV9zZXRfbXdpKCZhZGFwdGVyLT5odyk7Cgl9CglmcmVlKG10 YSwgTV9ERVZCVUYpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgVGltZXIgcm91dGluZQogKgogKiAg VGhpcyByb3V0aW5lIGNoZWNrcyBmb3IgbGluayBzdGF0dXMgYW5kIHVwZGF0ZXMgc3RhdGlzdGlj cy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZAplbV9sb2NhbF90aW1lcih2b2lkICph cmcpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFwdGVyID0gYXJnOwoJc3RydWN0IGlmbmV0CSppZnAg PSBhZGFwdGVyLT5pZnA7CglzdHJ1Y3QgdHhfcmluZwkqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7 CgoJRU1fQ09SRV9MT0NLX0FTU0VSVChhZGFwdGVyKTsKCgllbV91cGRhdGVfbGlua19zdGF0dXMo YWRhcHRlcik7CgllbV91cGRhdGVfc3RhdHNfY291bnRlcnMoYWRhcHRlcik7CgoJLyogUmVzZXQg TEFBIGludG8gUkFSWzBdIG9uIDgyNTcxICovCglpZiAoZTEwMDBfZ2V0X2xhYV9zdGF0ZV84MjU3 MSgmYWRhcHRlci0+aHcpID09IFRSVUUpCgkJZTEwMDBfcmFyX3NldCgmYWRhcHRlci0+aHcsIGFk YXB0ZXItPmh3Lm1hYy5hZGRyLCAwKTsKCgkvKgoJKiogQ2hlY2sgZm9yIHRpbWUgc2luY2UgYW55 IGRlc2NyaXB0b3Igd2FzIGNsZWFuZWQKCSovCglmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXIt Pm51bV9xdWV1ZXM7IGkrKywgdHhyKyspIHsKCQlFTV9UWF9MT0NLKHR4cik7CgkJaWYgKHR4ci0+ d2F0Y2hkb2dfY2hlY2sgPT0gRkFMU0UpIHsKCQkJRU1fVFhfVU5MT0NLKHR4cik7CgkJCWNvbnRp bnVlOwoJCX0KCQlpZiAoKHRpY2tzIC0gdHhyLT53YXRjaGRvZ190aW1lKSA+IEVNX1dBVENIRE9H KQoJCQlnb3RvIGh1bmc7CgkJRU1fVFhfVU5MT0NLKHR4cik7Cgl9CgoJY2FsbG91dF9yZXNldCgm YWRhcHRlci0+dGltZXIsIGh6LCBlbV9sb2NhbF90aW1lciwgYWRhcHRlcik7CglyZXR1cm47Cmh1 bmc6CglkZXZpY2VfcHJpbnRmKGFkYXB0ZXItPmRldiwgIldhdGNoZG9nIHRpbWVvdXQgLS0gcmVz ZXR0aW5nXG4iKTsKCWlmcC0+aWZfZHJ2X2ZsYWdzICY9IH5JRkZfRFJWX1JVTk5JTkc7CglhZGFw dGVyLT53YXRjaGRvZ19ldmVudHMrKzsKCUVNX1RYX1VOTE9DSyh0eHIpOwoJZW1faW5pdF9sb2Nr ZWQoYWRhcHRlcik7Cn0KCgpzdGF0aWMgdm9pZAplbV91cGRhdGVfbGlua19zdGF0dXMoc3RydWN0 IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7 CglzdHJ1Y3QgaWZuZXQgKmlmcCA9IGFkYXB0ZXItPmlmcDsKCWRldmljZV90IGRldiA9IGFkYXB0 ZXItPmRldjsKCXUzMiBsaW5rX2NoZWNrID0gMDsKCgkvKiBHZXQgdGhlIGNhY2hlZCBsaW5rIHZh bHVlIG9yIHJlYWQgcGh5IGZvciByZWFsICovCglzd2l0Y2ggKGh3LT5waHkubWVkaWFfdHlwZSkg ewoJY2FzZSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcjoKCQlpZiAoaHctPm1hYy5nZXRfbGlua19z dGF0dXMpIHsKCQkJLyogRG8gdGhlIHdvcmsgdG8gcmVhZCBwaHkgKi8KCQkJZTEwMDBfY2hlY2tf Zm9yX2xpbmsoaHcpOwoJCQlsaW5rX2NoZWNrID0gIWh3LT5tYWMuZ2V0X2xpbmtfc3RhdHVzOwoJ CQlpZiAobGlua19jaGVjaykgLyogRVNCMiBmaXggKi8KCQkJCWUxMDAwX2NmZ19vbl9saW5rX3Vw KGh3KTsKCQl9IGVsc2UKCQkJbGlua19jaGVjayA9IFRSVUU7CgkJYnJlYWs7CgljYXNlIGUxMDAw X21lZGlhX3R5cGVfZmliZXI6CgkJZTEwMDBfY2hlY2tfZm9yX2xpbmsoaHcpOwoJCWxpbmtfY2hl Y2sgPSAoRTEwMDBfUkVBRF9SRUcoaHcsIEUxMDAwX1NUQVRVUykgJgogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBFMTAwMF9TVEFUVVNfTFUpOwoJCWJyZWFrOwoJY2FzZSBlMTAwMF9t ZWRpYV90eXBlX2ludGVybmFsX3NlcmRlczoKCQllMTAwMF9jaGVja19mb3JfbGluayhodyk7CgkJ bGlua19jaGVjayA9IGFkYXB0ZXItPmh3Lm1hYy5zZXJkZXNfaGFzX2xpbms7CgkJYnJlYWs7Cglk ZWZhdWx0OgoJY2FzZSBlMTAwMF9tZWRpYV90eXBlX3Vua25vd246CgkJYnJlYWs7Cgl9CgoJLyog Tm93IGNoZWNrIGZvciBhIHRyYW5zaXRpb24gKi8KCWlmIChsaW5rX2NoZWNrICYmIChhZGFwdGVy LT5saW5rX2FjdGl2ZSA9PSAwKSkgewoJCWUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAm YWRhcHRlci0+bGlua19zcGVlZCwKCQkgICAgJmFkYXB0ZXItPmxpbmtfZHVwbGV4KTsKCQkvKiBD aGVjayBpZiB3ZSBtdXN0IGRpc2FibGUgU1BFRURfTU9ERSBiaXQgb24gUENJLUUgKi8KCQlpZiAo KGFkYXB0ZXItPmxpbmtfc3BlZWQgIT0gU1BFRURfMTAwMCkgJiYKCQkgICAgKChody0+bWFjLnR5 cGUgPT0gZTEwMDBfODI1NzEpIHx8CgkJICAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzIp KSkgewoJCQlpbnQgdGFyYzA7CgkJCXRhcmMwID0gRTEwMDBfUkVBRF9SRUcoaHcsIEUxMDAwX1RB UkMoMCkpOwoJCQl0YXJjMCAmPSB+U1BFRURfTU9ERV9CSVQ7CgkJCUUxMDAwX1dSSVRFX1JFRyho dywgRTEwMDBfVEFSQygwKSwgdGFyYzApOwoJCX0KCQlpZiAoYm9vdHZlcmJvc2UpCgkJCWRldmlj ZV9wcmludGYoZGV2LCAiTGluayBpcyB1cCAlZCBNYnBzICVzXG4iLAoJCQkgICAgYWRhcHRlci0+ bGlua19zcGVlZCwKCQkJICAgICgoYWRhcHRlci0+bGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVgp ID8KCQkJICAgICJGdWxsIER1cGxleCIgOiAiSGFsZiBEdXBsZXgiKSk7CgkJYWRhcHRlci0+bGlu a19hY3RpdmUgPSAxOwoJCWFkYXB0ZXItPnNtYXJ0c3BlZWQgPSAwOwoJCWlmcC0+aWZfYmF1ZHJh dGUgPSBhZGFwdGVyLT5saW5rX3NwZWVkICogMTAwMDAwMDsKCQlpZl9saW5rX3N0YXRlX2NoYW5n ZShpZnAsIExJTktfU1RBVEVfVVApOwoJfSBlbHNlIGlmICghbGlua19jaGVjayAmJiAoYWRhcHRl ci0+bGlua19hY3RpdmUgPT0gMSkpIHsKCQlpZnAtPmlmX2JhdWRyYXRlID0gYWRhcHRlci0+bGlu a19zcGVlZCA9IDA7CgkJYWRhcHRlci0+bGlua19kdXBsZXggPSAwOwoJCWlmIChib290dmVyYm9z ZSkKCQkJZGV2aWNlX3ByaW50ZihkZXYsICJMaW5rIGlzIERvd25cbiIpOwoJCWFkYXB0ZXItPmxp bmtfYWN0aXZlID0gMDsKCQkvKiBMaW5rIGRvd24sIGRpc2FibGUgd2F0Y2hkb2cgKi8KCQkvLyBK RlYgY2hhbmdlIGxhdGVyCgkJLy9hZGFwdGVyLT53YXRjaGRvZ19jaGVjayA9IEZBTFNFOwoJCWlm X2xpbmtfc3RhdGVfY2hhbmdlKGlmcCwgTElOS19TVEFURV9ET1dOKTsKCX0KfQoKLyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKgogKgogKiAgVGhpcyByb3V0aW5lIGRpc2FibGVzIGFsbCB0cmFmZmljIG9uIHRoZSBhZGFw dGVyIGJ5IGlzc3VpbmcgYQogKiAgZ2xvYmFsIHJlc2V0IG9uIHRoZSBNQUMgYW5kIGRlYWxsb2Nh dGVzIFRYL1JYIGJ1ZmZlcnMuCiAqCiAqICBUaGlzIHJvdXRpbmUgc2hvdWxkIGFsd2F5cyBiZSBj YWxsZWQgd2l0aCBCT1RIIHRoZSBDT1JFCiAqICBhbmQgVFggbG9ja3MuCiAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq LwoKc3RhdGljIHZvaWQKZW1fc3RvcCh2b2lkICphcmcpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFw dGVyID0gYXJnOwoJc3RydWN0IGlmbmV0CSppZnAgPSBhZGFwdGVyLT5pZnA7CglzdHJ1Y3QgdHhf cmluZwkqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7CgoJRU1fQ09SRV9MT0NLX0FTU0VSVChhZGFw dGVyKTsKCglJTklUX0RFQlVHT1VUKCJlbV9zdG9wOiBiZWdpbiIpOwoKCWVtX2Rpc2FibGVfaW50 cihhZGFwdGVyKTsKCWNhbGxvdXRfc3RvcCgmYWRhcHRlci0+dGltZXIpOwoKCS8qIFRlbGwgdGhl IHN0YWNrIHRoYXQgdGhlIGludGVyZmFjZSBpcyBubyBsb25nZXIgYWN0aXZlICovCglpZnAtPmlm X2Rydl9mbGFncyAmPSB+KElGRl9EUlZfUlVOTklORyB8IElGRl9EUlZfT0FDVElWRSk7CgogICAg ICAgIC8qIFVuYXJtIHdhdGNoZG9nIHRpbWVyLiAqLwoJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFw dGVyLT5udW1fcXVldWVzOyBpKyssIHR4cisrKSB7CgkJRU1fVFhfTE9DSyh0eHIpOwoJCXR4ci0+ d2F0Y2hkb2dfY2hlY2sgPSBGQUxTRTsKCQlFTV9UWF9VTkxPQ0sodHhyKTsKCX0KCgllMTAwMF9y ZXNldF9odygmYWRhcHRlci0+aHcpOwoJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEw MDBfV1VDLCAwKTsKCgllMTAwMF9sZWRfb2ZmKCZhZGFwdGVyLT5odyk7CgllMTAwMF9jbGVhbnVw X2xlZCgmYWRhcHRlci0+aHcpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgRGV0ZXJtaW5lIGhh cmR3YXJlIHJldmlzaW9uLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZW1faWRlbnRp ZnlfaGFyZHdhcmUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCWRldmljZV90IGRldiA9IGFk YXB0ZXItPmRldjsKCgkvKiBNYWtlIHN1cmUgb3VyIFBDSSBjb25maWcgc3BhY2UgaGFzIHRoZSBu ZWNlc3Nhcnkgc3R1ZmYgc2V0ICovCglhZGFwdGVyLT5ody5idXMucGNpX2NtZF93b3JkID0gcGNp X3JlYWRfY29uZmlnKGRldiwgUENJUl9DT01NQU5ELCAyKTsKCWlmICghKChhZGFwdGVyLT5ody5i dXMucGNpX2NtZF93b3JkICYgUENJTV9DTURfQlVTTUFTVEVSRU4pICYmCgkgICAgKGFkYXB0ZXIt Pmh3LmJ1cy5wY2lfY21kX3dvcmQgJiBQQ0lNX0NNRF9NRU1FTikpKSB7CgkJZGV2aWNlX3ByaW50 ZihkZXYsICJNZW1vcnkgQWNjZXNzIGFuZC9vciBCdXMgTWFzdGVyIGJpdHMgIgoJCSAgICAid2Vy ZSBub3Qgc2V0IVxuIik7CgkJYWRhcHRlci0+aHcuYnVzLnBjaV9jbWRfd29yZCB8PQoJCShQQ0lN X0NNRF9CVVNNQVNURVJFTiB8IFBDSU1fQ01EX01FTUVOKTsKCQlwY2lfd3JpdGVfY29uZmlnKGRl diwgUENJUl9DT01NQU5ELAoJCSAgICBhZGFwdGVyLT5ody5idXMucGNpX2NtZF93b3JkLCAyKTsK CX0KCgkvKiBTYXZlIG9mZiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBib2FyZCAqLwoJYWRh cHRlci0+aHcudmVuZG9yX2lkID0gcGNpX2dldF92ZW5kb3IoZGV2KTsKCWFkYXB0ZXItPmh3LmRl dmljZV9pZCA9IHBjaV9nZXRfZGV2aWNlKGRldik7CglhZGFwdGVyLT5ody5yZXZpc2lvbl9pZCA9 IHBjaV9yZWFkX2NvbmZpZyhkZXYsIFBDSVJfUkVWSUQsIDEpOwoJYWRhcHRlci0+aHcuc3Vic3lz dGVtX3ZlbmRvcl9pZCA9CgkgICAgcGNpX3JlYWRfY29uZmlnKGRldiwgUENJUl9TVUJWRU5EXzAs IDIpOwoJYWRhcHRlci0+aHcuc3Vic3lzdGVtX2RldmljZV9pZCA9CgkgICAgcGNpX3JlYWRfY29u ZmlnKGRldiwgUENJUl9TVUJERVZfMCwgMik7CgoJLyogRG8gU2hhcmVkIENvZGUgSW5pdCBhbmQg U2V0dXAgKi8KCWlmIChlMTAwMF9zZXRfbWFjX3R5cGUoJmFkYXB0ZXItPmh3KSkgewoJCWRldmlj ZV9wcmludGYoZGV2LCAiU2V0dXAgaW5pdCBmYWlsdXJlXG4iKTsKCQlyZXR1cm47Cgl9Cn0KCnN0 YXRpYyBpbnQKZW1fYWxsb2NhdGVfcGNpX3Jlc291cmNlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRl cikKewoJZGV2aWNlX3QJZGV2ID0gYWRhcHRlci0+ZGV2OwoJaW50CQlyaWQ7CgoJcmlkID0gUENJ Ul9CQVIoMCk7CglhZGFwdGVyLT5tZW1vcnkgPSBidXNfYWxsb2NfcmVzb3VyY2VfYW55KGRldiwg U1lTX1JFU19NRU1PUlksCgkgICAgJnJpZCwgUkZfQUNUSVZFKTsKCWlmIChhZGFwdGVyLT5tZW1v cnkgPT0gTlVMTCkgewoJCWRldmljZV9wcmludGYoZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1 cyByZXNvdXJjZTogbWVtb3J5XG4iKTsKCQlyZXR1cm4gKEVOWElPKTsKCX0KCWFkYXB0ZXItPm9z ZGVwLm1lbV9idXNfc3BhY2VfdGFnID0KCSAgICBybWFuX2dldF9idXN0YWcoYWRhcHRlci0+bWVt b3J5KTsKCWFkYXB0ZXItPm9zZGVwLm1lbV9idXNfc3BhY2VfaGFuZGxlID0KCSAgICBybWFuX2dl dF9idXNoYW5kbGUoYWRhcHRlci0+bWVtb3J5KTsKCWFkYXB0ZXItPmh3Lmh3X2FkZHIgPSAodTgg KikmYWRhcHRlci0+b3NkZXAubWVtX2J1c19zcGFjZV9oYW5kbGU7CgoJLyogRGVmYXVsdCB0byBh IHNpbmdsZSBxdWV1ZSAqLwoJYWRhcHRlci0+bnVtX3F1ZXVlcyA9IDE7CgoJLyoKCSAqIFNldHVw IE1TSS9YIG9yIE1TSSBpZiBQQ0kgRXhwcmVzcwoJICovCglhZGFwdGVyLT5tc2l4ID0gZW1fc2V0 dXBfbXNpeChhZGFwdGVyKTsKCglhZGFwdGVyLT5ody5iYWNrID0gJmFkYXB0ZXItPm9zZGVwOwoK CXJldHVybiAoMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIFNldHVwIHRoZSBMZWdhY3kgb3Ig TVNJIEludGVycnVwdCBoYW5kbGVyCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKZW1fYWxsb2NhdGVf bGVnYWN5KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7CglkZXZpY2VfdCBkZXYgPSBhZGFwdGVy LT5kZXY7CglpbnQgZXJyb3IsIHJpZCA9IDA7CgoJLyogTWFudWFsbHkgdHVybiBvZmYgYWxsIGlu dGVycnVwdHMgKi8KCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0lNQywgMHhm ZmZmZmZmZik7CgoJaWYgKGFkYXB0ZXItPm1zaXggPT0gMSkgLyogdXNpbmcgTVNJICovCgkJcmlk ID0gMTsKCS8qIFdlIGFsbG9jYXRlIGEgc2luZ2xlIGludGVycnVwdCByZXNvdXJjZSAqLwoJYWRh cHRlci0+cmVzID0gYnVzX2FsbG9jX3Jlc291cmNlX2FueShkZXYsCgkgICAgU1lTX1JFU19JUlEs ICZyaWQsIFJGX1NIQVJFQUJMRSB8IFJGX0FDVElWRSk7CglpZiAoYWRhcHRlci0+cmVzID09IE5V TEwpIHsKCQlkZXZpY2VfcHJpbnRmKGRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBidXMgcmVzb3Vy Y2U6ICIKCQkgICAgImludGVycnVwdFxuIik7CgkJcmV0dXJuIChFTlhJTyk7Cgl9CgoJLyoKCSAq IEFsbG9jYXRlIGEgZmFzdCBpbnRlcnJ1cHQgYW5kIHRoZSBhc3NvY2lhdGVkCgkgKiBkZWZlcnJl ZCBwcm9jZXNzaW5nIGNvbnRleHRzLgoJICovCglUQVNLX0lOSVQoJmFkYXB0ZXItPnF1ZV90YXNr LCAwLCBlbV9oYW5kbGVfcXVlLCBhZGFwdGVyKTsKCVRBU0tfSU5JVCgmYWRhcHRlci0+bGlua190 YXNrLCAwLCBlbV9oYW5kbGVfbGluaywgYWRhcHRlcik7CglhZGFwdGVyLT50cSA9IHRhc2txdWV1 ZV9jcmVhdGVfZmFzdCgiZW1fdGFza3EiLCBNX05PV0FJVCwKCSAgICB0YXNrcXVldWVfdGhyZWFk X2VucXVldWUsICZhZGFwdGVyLT50cSk7Cgl0YXNrcXVldWVfc3RhcnRfdGhyZWFkcygmYWRhcHRl ci0+dHEsIDEsIFBJX05FVCwgIiVzIHRhc2txIiwKCSAgICBkZXZpY2VfZ2V0X25hbWV1bml0KGFk YXB0ZXItPmRldikpOwoJaWYgKChlcnJvciA9IGJ1c19zZXR1cF9pbnRyKGRldiwgYWRhcHRlci0+ cmVzLCBJTlRSX1RZUEVfTkVULAoJICAgIGVtX2lycV9mYXN0LCBOVUxMLCBhZGFwdGVyLCAmYWRh cHRlci0+dGFnKSkgIT0gMCkgewoJCWRldmljZV9wcmludGYoZGV2LCAiRmFpbGVkIHRvIHJlZ2lz dGVyIGZhc3QgaW50ZXJydXB0ICIKCQkJICAgICJoYW5kbGVyOiAlZFxuIiwgZXJyb3IpOwoJCXRh c2txdWV1ZV9mcmVlKGFkYXB0ZXItPnRxKTsKCQlhZGFwdGVyLT50cSA9IE5VTEw7CgkJcmV0dXJu IChlcnJvcik7Cgl9CgkKCXJldHVybiAoMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIFNldHVw IHRoZSBNU0lYIEludGVycnVwdCBoYW5kbGVycwogKiAgIFRoaXMgaXMgbm90IHJlYWxseSBNdWx0 aXF1ZXVlLCByYXRoZXIKICogICBpdHMganVzdCBtdWx0aXBsZSBpbnRlcnJ1cHQgdmVjdG9ycy4K ICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovCmludAplbV9hbGxvY2F0ZV9tc2l4KHN0cnVjdCBhZGFwdGVyICph ZGFwdGVyKQp7CglkZXZpY2VfdAlkZXYgPSBhZGFwdGVyLT5kZXY7CglzdHJ1Y3QJCXR4X3Jpbmcg KnR4ciA9IGFkYXB0ZXItPnR4X3JpbmdzOwoJc3RydWN0CQlyeF9yaW5nICpyeHIgPSBhZGFwdGVy LT5yeF9yaW5nczsKCWludAkJZXJyb3IsIHJpZCwgdmVjdG9yID0gMDsKCgoJLyogTWFrZSBzdXJl IGFsbCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAqLwoJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVy LT5odywgRTEwMDBfSU1DLCAweGZmZmZmZmZmKTsKCgkvKiBGaXJzdCBzZXQgdXAgcmluZyByZXNv dXJjZXMgKi8KCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrLCB0 eHIrKywgcnhyKyspIHsKCgkJLyogUlggcmluZyAqLwoJCXJpZCA9IHZlY3RvciArIDE7CgoJCXJ4 ci0+cmVzID0gYnVzX2FsbG9jX3Jlc291cmNlX2FueShkZXYsCgkJICAgIFNZU19SRVNfSVJRLCAm cmlkLCBSRl9BQ1RJVkUpOwoJCWlmIChyeHItPnJlcyA9PSBOVUxMKSB7CgkJCWRldmljZV9wcmlu dGYoZGV2LAoJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBidXMgcmVzb3VyY2U6ICIKCQkJICAg ICJSWCBNU0lYIEludGVycnVwdCAlZFxuIiwgaSk7CgkJCXJldHVybiAoRU5YSU8pOwoJCX0KCQlp ZiAoKGVycm9yID0gYnVzX3NldHVwX2ludHIoZGV2LCByeHItPnJlcywKCQkgICAgSU5UUl9UWVBF X05FVCB8IElOVFJfTVBTQUZFLCBOVUxMLCBlbV9tc2l4X3J4LAoJCSAgICByeHIsICZyeHItPnRh ZykpICE9IDApIHsKCQkJZGV2aWNlX3ByaW50ZihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgUlgg aGFuZGxlciIpOwoJCQlyZXR1cm4gKGVycm9yKTsKCQl9CgkJcnhyLT5tc2l4ID0gdmVjdG9yKys7 IC8qIE5PVEUgaW5jcmVtZW50IHZlY3RvciBmb3IgVFggKi8KCQlUQVNLX0lOSVQoJnJ4ci0+cnhf dGFzaywgMCwgZW1faGFuZGxlX3J4LCByeHIpOwoJCXJ4ci0+dHEgPSB0YXNrcXVldWVfY3JlYXRl X2Zhc3QoImVtX3J4cSIsIE1fTk9XQUlULAoJCSAgICB0YXNrcXVldWVfdGhyZWFkX2VucXVldWUs ICZyeHItPnRxKTsKCQl0YXNrcXVldWVfc3RhcnRfdGhyZWFkcygmcnhyLT50cSwgMSwgUElfTkVU LCAiJXMgcnhxIiwKCQkgICAgZGV2aWNlX2dldF9uYW1ldW5pdChhZGFwdGVyLT5kZXYpKTsKCQkv KgoJCSoqIFNldCB0aGUgYml0IHRvIGVuYWJsZSBpbnRlcnJ1cHQKCQkqKiBpbiBFMTAwMF9JTVMg LS0gYml0cyAyMCBhbmQgMjEKCQkqKiBhcmUgZm9yIFJYMCBhbmQgUlgxLCBub3RlIHRoaXMgaGFz CgkJKiogTk9USElORyB0byBkbyB3aXRoIHRoZSBNU0lYIHZlY3RvcgoJCSovCgkJcnhyLT5pbXMg PSAxIDw8ICgyMCArIGkpOwoJCWFkYXB0ZXItPml2YXJzIHw9ICg4IHwgcnhyLT5tc2l4KSA8PCAo aSAqIDQpOwoKCQkvKiBUWCByaW5nICovCgkJcmlkID0gdmVjdG9yICsgMTsKCQl0eHItPnJlcyA9 IGJ1c19hbGxvY19yZXNvdXJjZV9hbnkoZGV2LAoJCSAgICBTWVNfUkVTX0lSUSwgJnJpZCwgUkZf QUNUSVZFKTsKCQlpZiAodHhyLT5yZXMgPT0gTlVMTCkgewoJCQlkZXZpY2VfcHJpbnRmKGRldiwK CQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgYnVzIHJlc291cmNlOiAiCgkJCSAgICAiVFggTVNJ WCBJbnRlcnJ1cHQgJWRcbiIsIGkpOwoJCQlyZXR1cm4gKEVOWElPKTsKCQl9CgkJaWYgKChlcnJv ciA9IGJ1c19zZXR1cF9pbnRyKGRldiwgdHhyLT5yZXMsCgkJICAgIElOVFJfVFlQRV9ORVQgfCBJ TlRSX01QU0FGRSwgTlVMTCwgZW1fbXNpeF90eCwKCQkgICAgdHhyLCAmdHhyLT50YWcpKSAhPSAw KSB7CgkJCWRldmljZV9wcmludGYoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFRYIGhhbmRsZXIi KTsKCQkJcmV0dXJuIChlcnJvcik7CgkJfQoJCXR4ci0+bXNpeCA9IHZlY3RvcisrOyAvKiBJbmNy ZW1lbnQgdmVjdG9yIGZvciBuZXh0IHBhc3MgKi8KCQlUQVNLX0lOSVQoJnR4ci0+dHhfdGFzaywg MCwgZW1faGFuZGxlX3R4LCB0eHIpOwoJCXR4ci0+dHEgPSB0YXNrcXVldWVfY3JlYXRlX2Zhc3Qo ImVtX3R4cSIsIE1fTk9XQUlULAoJCSAgICB0YXNrcXVldWVfdGhyZWFkX2VucXVldWUsICZ0eHIt PnRxKTsKCQl0YXNrcXVldWVfc3RhcnRfdGhyZWFkcygmdHhyLT50cSwgMSwgUElfTkVULCAiJXMg dHhxIiwKCQkgICAgZGV2aWNlX2dldF9uYW1ldW5pdChhZGFwdGVyLT5kZXYpKTsKCQkvKgoJCSoq IFNldCB0aGUgYml0IHRvIGVuYWJsZSBpbnRlcnJ1cHQKCQkqKiBpbiBFMTAwMF9JTVMgLS0gYml0 cyAyMiBhbmQgMjMKCQkqKiBhcmUgZm9yIFRYMCBhbmQgVFgxLCBub3RlIHRoaXMgaGFzCgkJKiog Tk9USElORyB0byBkbyB3aXRoIHRoZSBNU0lYIHZlY3RvcgoJCSovCgkJdHhyLT5pbXMgPSAxIDw8 ICgyMiArIGkpOwoJCWFkYXB0ZXItPml2YXJzIHw9ICg4IHwgdHhyLT5tc2l4KSA8PCAoOCArIChp ICogNCkpOwoJfQoKCS8qIExpbmsgaW50ZXJydXB0ICovCgkrK3JpZDsKCWFkYXB0ZXItPnJlcyA9 IGJ1c19hbGxvY19yZXNvdXJjZV9hbnkoZGV2LAoJICAgIFNZU19SRVNfSVJRLCAmcmlkLCBSRl9B Q1RJVkUpOwoJaWYgKCFhZGFwdGVyLT5yZXMpIHsKCQlkZXZpY2VfcHJpbnRmKGRldiwiVW5hYmxl IHRvIGFsbG9jYXRlICIKCQkgICAgImJ1cyByZXNvdXJjZTogTGluayBpbnRlcnJ1cHQgWyVkXVxu IiwgcmlkKTsKCQlyZXR1cm4gKEVOWElPKTsKICAgICAgICB9CgkvKiBTZXQgdGhlIGxpbmsgaGFu ZGxlciBmdW5jdGlvbiAqLwoJZXJyb3IgPSBidXNfc2V0dXBfaW50cihkZXYsIGFkYXB0ZXItPnJl cywKCSAgICBJTlRSX1RZUEVfTkVUIHwgSU5UUl9NUFNBRkUsIE5VTEwsCgkgICAgZW1fbXNpeF9s aW5rLCBhZGFwdGVyLCAmYWRhcHRlci0+dGFnKTsKCWlmIChlcnJvcikgewoJCWFkYXB0ZXItPnJl cyA9IE5VTEw7CgkJZGV2aWNlX3ByaW50ZihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgTElOSyBo YW5kbGVyIik7CgkJcmV0dXJuIChlcnJvcik7Cgl9CglhZGFwdGVyLT5saW5rdmVjID0gdmVjdG9y OwoJYWRhcHRlci0+aXZhcnMgfD0gICg4IHwgdmVjdG9yKSA8PCAxNjsKCWFkYXB0ZXItPml2YXJz IHw9IDB4ODAwMDAwMDA7CgoJcmV0dXJuICgwKTsKfQoKCnN0YXRpYyB2b2lkCmVtX2ZyZWVfcGNp X3Jlc291cmNlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJZGV2aWNlX3QJZGV2ID0gYWRh cHRlci0+ZGV2OwoJc3RydWN0IHR4X3JpbmcJKnR4cjsKCXN0cnVjdCByeF9yaW5nCSpyeHI7Cglp bnQJCXJpZDsKCgoJLyoKCSoqIFJlbGVhc2UgYWxsIHRoZSBxdWV1ZSBpbnRlcnJ1cHQgcmVzb3Vy Y2VzOgoJKi8KCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7 CgkJdHhyID0gJmFkYXB0ZXItPnR4X3JpbmdzW2ldOwoJCXJ4ciA9ICZhZGFwdGVyLT5yeF9yaW5n c1tpXTsKCQlyaWQgPSB0eHItPm1zaXggKzE7CgkJaWYgKHR4ci0+dGFnICE9IE5VTEwpIHsKCQkJ YnVzX3RlYXJkb3duX2ludHIoZGV2LCB0eHItPnJlcywgdHhyLT50YWcpOwoJCQl0eHItPnRhZyA9 IE5VTEw7CgkJfQoJCWlmICh0eHItPnJlcyAhPSBOVUxMKQoJCQlidXNfcmVsZWFzZV9yZXNvdXJj ZShkZXYsIFNZU19SRVNfSVJRLAoJCQkgICAgcmlkLCB0eHItPnJlcyk7CgkJcmlkID0gcnhyLT5t c2l4ICsxOwoJCWlmIChyeHItPnRhZyAhPSBOVUxMKSB7CgkJCWJ1c190ZWFyZG93bl9pbnRyKGRl diwgcnhyLT5yZXMsIHJ4ci0+dGFnKTsKCQkJcnhyLT50YWcgPSBOVUxMOwoJCX0KCQlpZiAocnhy LT5yZXMgIT0gTlVMTCkKCQkJYnVzX3JlbGVhc2VfcmVzb3VyY2UoZGV2LCBTWVNfUkVTX0lSUSwK CQkJICAgIHJpZCwgcnhyLT5yZXMpOwoJfQoKICAgICAgICBpZiAoYWRhcHRlci0+bGlua3ZlYykg Lyogd2UgYXJlIGRvaW5nIE1TSVggKi8KICAgICAgICAgICAgICAgIHJpZCA9IGFkYXB0ZXItPmxp bmt2ZWMgKyAxOwogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIChhZGFwdGVyLT5tc2l4ICE9 IDApID8gKHJpZCA9IDEpOihyaWQgPSAwKTsKCglpZiAoYWRhcHRlci0+dGFnICE9IE5VTEwpIHsK CQlidXNfdGVhcmRvd25faW50cihkZXYsIGFkYXB0ZXItPnJlcywgYWRhcHRlci0+dGFnKTsKCQlh ZGFwdGVyLT50YWcgPSBOVUxMOwoJfQoKCWlmIChhZGFwdGVyLT5yZXMgIT0gTlVMTCkKCQlidXNf cmVsZWFzZV9yZXNvdXJjZShkZXYsIFNZU19SRVNfSVJRLCByaWQsIGFkYXB0ZXItPnJlcyk7CgoK CWlmIChhZGFwdGVyLT5tc2l4KQoJCXBjaV9yZWxlYXNlX21zaShkZXYpOwoKCWlmIChhZGFwdGVy LT5tc2l4X21lbSAhPSBOVUxMKQoJCWJ1c19yZWxlYXNlX3Jlc291cmNlKGRldiwgU1lTX1JFU19N RU1PUlksCgkJICAgIFBDSVJfQkFSKEVNX01TSVhfQkFSKSwgYWRhcHRlci0+bXNpeF9tZW0pOwoK CWlmIChhZGFwdGVyLT5tZW1vcnkgIT0gTlVMTCkKCQlidXNfcmVsZWFzZV9yZXNvdXJjZShkZXYs IFNZU19SRVNfTUVNT1JZLAoJCSAgICBQQ0lSX0JBUigwKSwgYWRhcHRlci0+bWVtb3J5KTsKCglp ZiAoYWRhcHRlci0+Zmxhc2ggIT0gTlVMTCkKCQlidXNfcmVsZWFzZV9yZXNvdXJjZShkZXYsIFNZ U19SRVNfTUVNT1JZLAoJCSAgICBFTV9GTEFTSCwgYWRhcHRlci0+Zmxhc2gpOwp9CgovKgogKiBT ZXR1cCBNU0kgb3IgTVNJL1gKICovCnN0YXRpYyBpbnQKZW1fc2V0dXBfbXNpeChzdHJ1Y3QgYWRh cHRlciAqYWRhcHRlcikKewoJZGV2aWNlX3QgZGV2ID0gYWRhcHRlci0+ZGV2OwoJaW50IHZhbCA9 IDA7CgoKCS8qIFNldHVwIE1TSS9YIGZvciBIYXJ0d2VsbCAqLwoJaWYgKChhZGFwdGVyLT5ody5t YWMudHlwZSA9PSBlMTAwMF84MjU3NCkgJiYKCSAgICAoZW1fZW5hYmxlX21zaXggPT0gVFJVRSkp IHsKCQkvKiBNYXAgdGhlIE1TSVggQkFSICovCgkJaW50IHJpZCA9IFBDSVJfQkFSKEVNX01TSVhf QkFSKTsKCQlhZGFwdGVyLT5tc2l4X21lbSA9IGJ1c19hbGxvY19yZXNvdXJjZV9hbnkoZGV2LAoJ CSAgICBTWVNfUkVTX01FTU9SWSwgJnJpZCwgUkZfQUNUSVZFKTsKICAgICAgIAkJaWYgKCFhZGFw dGVyLT5tc2l4X21lbSkgewoJCQkvKiBNYXkgbm90IGJlIGVuYWJsZWQgKi8KICAgICAgICAgICAg ICAgCQlkZXZpY2VfcHJpbnRmKGFkYXB0ZXItPmRldiwKCQkJICAgICJVbmFibGUgdG8gbWFwIE1T SVggdGFibGUgXG4iKTsKCQkJZ290byBtc2k7CiAgICAgICAJCX0KCQl2YWwgPSBwY2lfbXNpeF9j b3VudChkZXYpOyAKCQlpZiAodmFsICE9IDUpIHsKCQkJYnVzX3JlbGVhc2VfcmVzb3VyY2UoZGV2 LCBTWVNfUkVTX01FTU9SWSwKCQkJICAgIFBDSVJfQkFSKEVNX01TSVhfQkFSKSwgYWRhcHRlci0+ bXNpeF9tZW0pOwoJCQlhZGFwdGVyLT5tc2l4X21lbSA9IE5VTEw7CiAgICAgICAgICAgICAgIAkJ ZGV2aWNlX3ByaW50ZihhZGFwdGVyLT5kZXYsCgkJCSAgICAiTVNJWCB2ZWN0b3JzIHdyb25nLCB1 c2luZyBNU0kgXG4iKTsKCQkJZ290byBtc2k7CgkJfQoJCWlmIChlbV9tc2l4X3F1ZXVlcyA9PSAy KSB7CgkJCXZhbCA9IDU7CgkJCWFkYXB0ZXItPm51bV9xdWV1ZXMgPSAyOwoJCX0gZWxzZSB7CgkJ CXZhbCA9IDM7CgkJCWFkYXB0ZXItPm51bV9xdWV1ZXMgPSAxOwoJCX0KCQlpZiAocGNpX2FsbG9j X21zaXgoZGV2LCAmdmFsKSA9PSAwKSB7CgkJCWRldmljZV9wcmludGYoYWRhcHRlci0+ZGV2LAoJ CQkgICAgIlVzaW5nIE1TSVggaW50ZXJydXB0cyAiCgkJCSAgICAid2l0aCAlZCB2ZWN0b3JzXG4i LCB2YWwpOwoJCX0KCgkJcmV0dXJuICh2YWwpOwoJfQptc2k6CiAgICAgICAJdmFsID0gcGNpX21z aV9jb3VudChkZXYpOwogICAgICAgCWlmICh2YWwgPT0gMSAmJiBwY2lfYWxsb2NfbXNpKGRldiwg JnZhbCkgPT0gMCkgewogICAgICAgICAgICAgICAJYWRhcHRlci0+bXNpeCA9IDE7CiAgICAgICAg ICAgICAgIAlkZXZpY2VfcHJpbnRmKGFkYXB0ZXItPmRldiwiVXNpbmcgTVNJIGludGVycnVwdFxu Iik7CgkJcmV0dXJuICh2YWwpOwoJfSAKCS8qIFNob3VsZCBvbmx5IGhhcHBlbiBkdWUgdG8gbWFu dWFsIGludmVudGlvbiAqLwoJZGV2aWNlX3ByaW50ZihhZGFwdGVyLT5kZXYsIlNldHVwIE1TSVgg ZmFpbHVyZVxuIik7CglyZXR1cm4gKDApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgSW5pdGlh bGl6ZSB0aGUgaGFyZHdhcmUgdG8gYSBjb25maWd1cmF0aW9uCiAqICBhcyBzcGVjaWZpZWQgYnkg dGhlIGFkYXB0ZXIgc3RydWN0dXJlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZW1f cmVzZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCWRldmljZV90CWRldiA9IGFkYXB0ZXIt PmRldjsKCXN0cnVjdCBlMTAwMF9odwkqaHcgPSAmYWRhcHRlci0+aHc7Cgl1MTYJCXJ4X2J1ZmZl cl9zaXplOwoKCUlOSVRfREVCVUdPVVQoImVtX3Jlc2V0OiBiZWdpbiIpOwoKCS8qIFNldCB1cCBz bWFydCBwb3dlciBkb3duIGFzIGRlZmF1bHQgb2ZmIG9uIG5ld2VyIGFkYXB0ZXJzLiAqLwoJaWYg KCFlbV9zbWFydF9wd3JfZG93biAmJiAoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTcxIHx8Cgkg ICAgaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTcyKSkgewoJCXUxNiBwaHlfdG1wID0gMDsKCgkJ LyogU3BlZWQgdXAgdGltZSB0byBsaW5rIGJ5IGRpc2FibGluZyBzbWFydCBwb3dlciBkb3duLiAq LwoJCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDJFMTAwMF9QSFlfUE9XRVJfTUdNVCwgJnBo eV90bXApOwoJCXBoeV90bXAgJj0gfklHUDAyRTEwMDBfUE1fU1BEOwoJCWUxMDAwX3dyaXRlX3Bo eV9yZWcoaHcsIElHUDAyRTEwMDBfUEhZX1BPV0VSX01HTVQsIHBoeV90bXApOwoJfQoKCS8qCgkg KiBUaGVzZSBwYXJhbWV0ZXJzIGNvbnRyb2wgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIChUeCkg YW5kCgkgKiByZXNwb25zZSAoUngpIHRvIEV0aGVybmV0IFBBVVNFIGZyYW1lcy4KCSAqIC0gSGln aCB3YXRlciBtYXJrIHNob3VsZCBhbGxvdyBmb3IgYXQgbGVhc3QgdHdvIGZyYW1lcyB0byBiZQoJ ICogICByZWNlaXZlZCBhZnRlciBzZW5kaW5nIGFuIFhPRkYuCgkgKiAtIExvdyB3YXRlciBtYXJr IHdvcmtzIGJlc3Qgd2hlbiBpdCBpcyB2ZXJ5IG5lYXIgdGhlIGhpZ2ggd2F0ZXIgbWFyay4KCSAq ICAgVGhpcyBhbGxvd3MgdGhlIHJlY2VpdmVyIHRvIHJlc3RhcnQgYnkgc2VuZGluZyBYT04gd2hl biBpdCBoYXMKCSAqICAgZHJhaW5lZCBhIGJpdC4gSGVyZSB3ZSB1c2UgYW4gYXJiaXRhcnkgdmFs dWUgb2YgMTUwMCB3aGljaCB3aWxsCgkgKiAgIHJlc3RhcnQgYWZ0ZXIgb25lIGZ1bGwgZnJhbWUg aXMgcHVsbGVkIGZyb20gdGhlIGJ1ZmZlci4gVGhlcmUKCSAqICAgY291bGQgYmUgc2V2ZXJhbCBz bWFsbGVyIGZyYW1lcyBpbiB0aGUgYnVmZmVyIGFuZCBpZiBzbyB0aGV5IHdpbGwKCSAqICAgbm90 IHRyaWdnZXIgdGhlIFhPTiB1bnRpbCB0aGVpciB0b3RhbCBudW1iZXIgcmVkdWNlcyB0aGUgYnVm ZmVyCgkgKiAgIGJ5IDE1MDAuCgkgKiAtIFRoZSBwYXVzZSB0aW1lIGlzIGZhaXJseSBsYXJnZSBh dCAxMDAwIHggNTEybnMgPSA1MTIgdXNlYy4KCSAqLwoJcnhfYnVmZmVyX3NpemUgPSAoKEUxMDAw X1JFQURfUkVHKGh3LCBFMTAwMF9QQkEpICYgMHhmZmZmKSA8PCAxMCApOwoKCWh3LT5mYy5oaWdo X3dhdGVyID0gcnhfYnVmZmVyX3NpemUgLQoJICAgIHJvdW5kdXAyKGFkYXB0ZXItPm1heF9mcmFt ZV9zaXplLCAxMDI0KTsKCWh3LT5mYy5sb3dfd2F0ZXIgPSBody0+ZmMuaGlnaF93YXRlciAtIDE1 MDA7CgoJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikKCQlody0+ZmMucGF1 c2VfdGltZSA9IDB4RkZGRjsKCWVsc2UKCQlody0+ZmMucGF1c2VfdGltZSA9IEVNX0ZDX1BBVVNF X1RJTUU7CgoJaHctPmZjLnNlbmRfeG9uID0gVFJVRTsKCiAgICAgICAgLyogU2V0IEZsb3cgY29u dHJvbCwgdXNlIHRoZSB0dW5hYmxlIGxvY2F0aW9uIGlmIHNhbmUgKi8KICAgICAgICBpZiAoKGVt X2ZjX3NldHRpbmcgPj0gMCkgfHwgKGVtX2ZjX3NldHRpbmcgPCA0KSkKCQlody0+ZmMucmVxdWVz dGVkX21vZGUgPSBlbV9mY19zZXR0aW5nOwoJZWxzZQoJCWh3LT5mYy5yZXF1ZXN0ZWRfbW9kZSA9 IGUxMDAwX2ZjX25vbmU7CgoJLyogT3ZlcnJpZGUgLSB3b3JrYXJvdW5kIGZvciBQQ0hMQU4gaXNz dWUgKi8KCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKQogICAgICAgICAgICAgICAg aHctPmZjLnJlcXVlc3RlZF9tb2RlID0gZTEwMDBfZmNfcnhfcGF1c2U7CgoJLyogSXNzdWUgYSBn bG9iYWwgcmVzZXQgKi8KCWUxMDAwX3Jlc2V0X2h3KGh3KTsKCUUxMDAwX1dSSVRFX1JFRyhodywg RTEwMDBfV1VDLCAwKTsKCglpZiAoZTEwMDBfaW5pdF9odyhodykgPCAwKSB7CgkJZGV2aWNlX3By aW50ZihkZXYsICJIYXJkd2FyZSBJbml0aWFsaXphdGlvbiBGYWlsZWRcbiIpOwoJCXJldHVybjsK CX0KCglFMTAwMF9XUklURV9SRUcoaHcsIEUxMDAwX1ZFVCwgRVRIRVJUWVBFX1ZMQU4pOwoJZTEw MDBfZ2V0X3BoeV9pbmZvKGh3KTsKCWUxMDAwX2NoZWNrX2Zvcl9saW5rKGh3KTsKCXJldHVybjsK fQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgogKgogKiAgU2V0dXAgbmV0d29ya2luZyBkZXZpY2Ugc3RydWN0dXJl IGFuZCByZWdpc3RlciBhbiBpbnRlcmZhY2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9p ZAplbV9zZXR1cF9pbnRlcmZhY2UoZGV2aWNlX3QgZGV2LCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRl cikKewoJc3RydWN0IGlmbmV0ICAgKmlmcDsKCglJTklUX0RFQlVHT1VUKCJlbV9zZXR1cF9pbnRl cmZhY2U6IGJlZ2luIik7CgoJaWZwID0gYWRhcHRlci0+aWZwID0gaWZfYWxsb2MoSUZUX0VUSEVS KTsKCWlmIChpZnAgPT0gTlVMTCkKCQlwYW5pYygiJXM6IGNhbiBub3QgaWZfYWxsb2MoKSIsIGRl dmljZV9nZXRfbmFtZXVuaXQoZGV2KSk7CglpZl9pbml0bmFtZShpZnAsIGRldmljZV9nZXRfbmFt ZShkZXYpLCBkZXZpY2VfZ2V0X3VuaXQoZGV2KSk7CglpZnAtPmlmX210dSA9IEVUSEVSTVRVOwoJ aWZwLT5pZl9pbml0ID0gIGVtX2luaXQ7CglpZnAtPmlmX3NvZnRjID0gYWRhcHRlcjsKCWlmcC0+ aWZfZmxhZ3MgPSBJRkZfQlJPQURDQVNUIHwgSUZGX1NJTVBMRVggfCBJRkZfTVVMVElDQVNUOwoJ aWZwLT5pZl9pb2N0bCA9IGVtX2lvY3RsOwoJaWZwLT5pZl9zdGFydCA9IGVtX3N0YXJ0OwoJSUZR X1NFVF9NQVhMRU4oJmlmcC0+aWZfc25kLCBhZGFwdGVyLT5udW1fdHhfZGVzYyAtIDEpOwoJaWZw LT5pZl9zbmQuaWZxX2Rydl9tYXhsZW4gPSBhZGFwdGVyLT5udW1fdHhfZGVzYyAtIDE7CglJRlFf U0VUX1JFQURZKCZpZnAtPmlmX3NuZCk7CgoJZXRoZXJfaWZhdHRhY2goaWZwLCBhZGFwdGVyLT5o dy5tYWMuYWRkcik7CgoJaWZwLT5pZl9jYXBhYmlsaXRpZXMgPSBpZnAtPmlmX2NhcGVuYWJsZSA9 IDA7CgojaWZkZWYgRU1fTVVMVElRVUVVRQoJLyogTXVsdGlxdWV1ZSB0eCBmdW5jdGlvbnMgKi8K CWlmcC0+aWZfdHJhbnNtaXQgPSBlbV9tcV9zdGFydDsKCWlmcC0+aWZfcWZsdXNoID0gZW1fcWZs dXNoOwojZW5kaWYJCgoJaWZwLT5pZl9jYXBhYmlsaXRpZXMgfD0gSUZDQVBfSFdDU1VNIHwgSUZD QVBfVkxBTl9IV0NTVU07CglpZnAtPmlmX2NhcGVuYWJsZSB8PSBJRkNBUF9IV0NTVU0gfCBJRkNB UF9WTEFOX0hXQ1NVTTsKCgkvKiBFbmFibGUgVFNPIGJ5IGRlZmF1bHQsIGNhbiBkaXNhYmxlIHdp dGggaWZjb25maWcgKi8KCWlmcC0+aWZfY2FwYWJpbGl0aWVzIHw9IElGQ0FQX1RTTzQ7CglpZnAt PmlmX2NhcGVuYWJsZSB8PSBJRkNBUF9UU080OwoKCS8qCgkgKiBUZWxsIHRoZSB1cHBlciBsYXll cihzKSB3ZQoJICogc3VwcG9ydCBmdWxsIFZMQU4gY2FwYWJpbGl0eQoJICovCglpZnAtPmlmX2Rh dGEuaWZpX2hkcmxlbiA9IHNpemVvZihzdHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIpOwoJaWZwLT5p Zl9jYXBhYmlsaXRpZXMgfD0gSUZDQVBfVkxBTl9IV1RBR0dJTkcgfCBJRkNBUF9WTEFOX01UVTsK CWlmcC0+aWZfY2FwZW5hYmxlIHw9IElGQ0FQX1ZMQU5fSFdUQUdHSU5HIHwgSUZDQVBfVkxBTl9N VFU7CgoJLyoKCSoqIERvbnQgdHVybiB0aGlzIG9uIGJ5IGRlZmF1bHQsIGlmIHZsYW5zIGFyZQoJ KiogY3JlYXRlZCBvbiBhbm90aGVyIHBzZXVkbyBkZXZpY2UgKGVnLiBsYWdnKQoJKiogdGhlbiB2 bGFuIGV2ZW50cyBhcmUgbm90IHBhc3NlZCB0aHJ1LCBicmVha2luZwoJKiogb3BlcmF0aW9uLCBi dXQgd2l0aCBIVyBGSUxURVIgb2ZmIGl0IHdvcmtzLiBJZgoJKiogdXNpbmcgdmxhbnMgZGlyZWN0 bHkgb24gdGhlIGVtIGRyaXZlciB5b3UgY2FuCgkqKiBlbmFibGUgdGhpcyBhbmQgZ2V0IGZ1bGwg aGFyZHdhcmUgdGFnIGZpbHRlcmluZy4KCSovCglpZnAtPmlmX2NhcGFiaWxpdGllcyB8PSBJRkNB UF9WTEFOX0hXRklMVEVSOwoKI2lmZGVmIERFVklDRV9QT0xMSU5HCglpZnAtPmlmX2NhcGFiaWxp dGllcyB8PSBJRkNBUF9QT0xMSU5HOwojZW5kaWYKCgkvKiBFbmFibGUgb25seSBXT0wgTUFHSUMg YnkgZGVmYXVsdCAqLwoJaWYgKGFkYXB0ZXItPndvbCkgewoJCWlmcC0+aWZfY2FwYWJpbGl0aWVz IHw9IElGQ0FQX1dPTDsKCQlpZnAtPmlmX2NhcGVuYWJsZSB8PSBJRkNBUF9XT0xfTUFHSUM7Cgl9 CgkJCgkvKgoJICogU3BlY2lmeSB0aGUgbWVkaWEgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoaXMgYWRh cHRlciBhbmQgcmVnaXN0ZXIKCSAqIGNhbGxiYWNrcyB0byB1cGRhdGUgbWVkaWEgYW5kIGxpbmsg aW5mb3JtYXRpb24KCSAqLwoJaWZtZWRpYV9pbml0KCZhZGFwdGVyLT5tZWRpYSwgSUZNX0lNQVNL LAoJICAgIGVtX21lZGlhX2NoYW5nZSwgZW1fbWVkaWFfc3RhdHVzKTsKCWlmICgoYWRhcHRlci0+ aHcucGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKCSAgICAoYWRh cHRlci0+aHcucGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJk ZXMpKSB7CgkJdV9jaGFyIGZpYmVyX3R5cGUgPSBJRk1fMTAwMF9TWDsJLyogZGVmYXVsdCB0eXBl ICovCgoJCWlmbWVkaWFfYWRkKCZhZGFwdGVyLT5tZWRpYSwgSUZNX0VUSEVSIHwgZmliZXJfdHlw ZSB8IElGTV9GRFgsIAoJCQkgICAgMCwgTlVMTCk7CgkJaWZtZWRpYV9hZGQoJmFkYXB0ZXItPm1l ZGlhLCBJRk1fRVRIRVIgfCBmaWJlcl90eXBlLCAwLCBOVUxMKTsKCX0gZWxzZSB7CgkJaWZtZWRp YV9hZGQoJmFkYXB0ZXItPm1lZGlhLCBJRk1fRVRIRVIgfCBJRk1fMTBfVCwgMCwgTlVMTCk7CgkJ aWZtZWRpYV9hZGQoJmFkYXB0ZXItPm1lZGlhLCBJRk1fRVRIRVIgfCBJRk1fMTBfVCB8IElGTV9G RFgsCgkJCSAgICAwLCBOVUxMKTsKCQlpZm1lZGlhX2FkZCgmYWRhcHRlci0+bWVkaWEsIElGTV9F VEhFUiB8IElGTV8xMDBfVFgsCgkJCSAgICAwLCBOVUxMKTsKCQlpZm1lZGlhX2FkZCgmYWRhcHRl ci0+bWVkaWEsIElGTV9FVEhFUiB8IElGTV8xMDBfVFggfCBJRk1fRkRYLAoJCQkgICAgMCwgTlVM TCk7CgkJaWYgKGFkYXB0ZXItPmh3LnBoeS50eXBlICE9IGUxMDAwX3BoeV9pZmUpIHsKCQkJaWZt ZWRpYV9hZGQoJmFkYXB0ZXItPm1lZGlhLAoJCQkJSUZNX0VUSEVSIHwgSUZNXzEwMDBfVCB8IElG TV9GRFgsIDAsIE5VTEwpOwoJCQlpZm1lZGlhX2FkZCgmYWRhcHRlci0+bWVkaWEsCgkJCQlJRk1f RVRIRVIgfCBJRk1fMTAwMF9ULCAwLCBOVUxMKTsKCQl9Cgl9CglpZm1lZGlhX2FkZCgmYWRhcHRl ci0+bWVkaWEsIElGTV9FVEhFUiB8IElGTV9BVVRPLCAwLCBOVUxMKTsKCWlmbWVkaWFfc2V0KCZh ZGFwdGVyLT5tZWRpYSwgSUZNX0VUSEVSIHwgSUZNX0FVVE8pOwp9CgoKLyoKICogTWFuYWdlIERN QSdhYmxlIG1lbW9yeS4KICovCnN0YXRpYyB2b2lkCmVtX2RtYW1hcF9jYih2b2lkICphcmcsIGJ1 c19kbWFfc2VnbWVudF90ICpzZWdzLCBpbnQgbnNlZywgaW50IGVycm9yKQp7CglpZiAoZXJyb3Ip CgkJcmV0dXJuOwoJKihidXNfYWRkcl90ICopIGFyZyA9IHNlZ3NbMF0uZHNfYWRkcjsKfQoKc3Rh dGljIGludAplbV9kbWFfbWFsbG9jKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBidXNfc2l6ZV90 IHNpemUsCiAgICAgICAgc3RydWN0IGVtX2RtYV9hbGxvYyAqZG1hLCBpbnQgbWFwZmxhZ3MpCnsK CWludCBlcnJvcjsKCgllcnJvciA9IGJ1c19kbWFfdGFnX2NyZWF0ZShidXNfZ2V0X2RtYV90YWco YWRhcHRlci0+ZGV2KSwgLyogcGFyZW50ICovCgkJCQlFTV9EQkFfQUxJR04sIDAsCS8qIGFsaWdu bWVudCwgYm91bmRzICovCgkJCQlCVVNfU1BBQ0VfTUFYQUREUiwJLyogbG93YWRkciAqLwoJCQkJ QlVTX1NQQUNFX01BWEFERFIsCS8qIGhpZ2hhZGRyICovCgkJCQlOVUxMLCBOVUxMLAkJLyogZmls dGVyLCBmaWx0ZXJhcmcgKi8KCQkJCXNpemUsCQkJLyogbWF4c2l6ZSAqLwoJCQkJMSwJCQkvKiBu c2VnbWVudHMgKi8KCQkJCXNpemUsCQkJLyogbWF4c2Vnc2l6ZSAqLwoJCQkJMCwJCQkvKiBmbGFn cyAqLwoJCQkJTlVMTCwJCQkvKiBsb2NrZnVuYyAqLwoJCQkJTlVMTCwJCQkvKiBsb2NrYXJnICov CgkJCQkmZG1hLT5kbWFfdGFnKTsKCWlmIChlcnJvcikgewoJCWRldmljZV9wcmludGYoYWRhcHRl ci0+ZGV2LAoJCSAgICAiJXM6IGJ1c19kbWFfdGFnX2NyZWF0ZSBmYWlsZWQ6ICVkXG4iLAoJCSAg ICBfX2Z1bmNfXywgZXJyb3IpOwoJCWdvdG8gZmFpbF8wOwoJfQoKCWVycm9yID0gYnVzX2RtYW1l bV9hbGxvYyhkbWEtPmRtYV90YWcsICh2b2lkKiopICZkbWEtPmRtYV92YWRkciwKCSAgICBCVVNf RE1BX05PV0FJVCB8IEJVU19ETUFfQ09IRVJFTlQsICZkbWEtPmRtYV9tYXApOwoJaWYgKGVycm9y KSB7CgkJZGV2aWNlX3ByaW50ZihhZGFwdGVyLT5kZXYsCgkJICAgICIlczogYnVzX2RtYW1lbV9h bGxvYyglanUpIGZhaWxlZDogJWRcbiIsCgkJICAgIF9fZnVuY19fLCAodWludG1heF90KXNpemUs IGVycm9yKTsKCQlnb3RvIGZhaWxfMjsKCX0KCglkbWEtPmRtYV9wYWRkciA9IDA7CgllcnJvciA9 IGJ1c19kbWFtYXBfbG9hZChkbWEtPmRtYV90YWcsIGRtYS0+ZG1hX21hcCwgZG1hLT5kbWFfdmFk ZHIsCgkgICAgc2l6ZSwgZW1fZG1hbWFwX2NiLCAmZG1hLT5kbWFfcGFkZHIsIG1hcGZsYWdzIHwg QlVTX0RNQV9OT1dBSVQpOwoJaWYgKGVycm9yIHx8IGRtYS0+ZG1hX3BhZGRyID09IDApIHsKCQlk ZXZpY2VfcHJpbnRmKGFkYXB0ZXItPmRldiwKCQkgICAgIiVzOiBidXNfZG1hbWFwX2xvYWQgZmFp bGVkOiAlZFxuIiwKCQkgICAgX19mdW5jX18sIGVycm9yKTsKCQlnb3RvIGZhaWxfMzsKCX0KCgly ZXR1cm4gKDApOwoKZmFpbF8zOgoJYnVzX2RtYW1hcF91bmxvYWQoZG1hLT5kbWFfdGFnLCBkbWEt PmRtYV9tYXApOwpmYWlsXzI6CglidXNfZG1hbWVtX2ZyZWUoZG1hLT5kbWFfdGFnLCBkbWEtPmRt YV92YWRkciwgZG1hLT5kbWFfbWFwKTsKCWJ1c19kbWFfdGFnX2Rlc3Ryb3koZG1hLT5kbWFfdGFn KTsKZmFpbF8wOgoJZG1hLT5kbWFfbWFwID0gTlVMTDsKCWRtYS0+ZG1hX3RhZyA9IE5VTEw7CgoJ cmV0dXJuIChlcnJvcik7Cn0KCnN0YXRpYyB2b2lkCmVtX2RtYV9mcmVlKHN0cnVjdCBhZGFwdGVy ICphZGFwdGVyLCBzdHJ1Y3QgZW1fZG1hX2FsbG9jICpkbWEpCnsKCWlmIChkbWEtPmRtYV90YWcg PT0gTlVMTCkKCQlyZXR1cm47CglpZiAoZG1hLT5kbWFfbWFwICE9IE5VTEwpIHsKCQlidXNfZG1h bWFwX3N5bmMoZG1hLT5kbWFfdGFnLCBkbWEtPmRtYV9tYXAsCgkJICAgIEJVU19ETUFTWU5DX1BP U1RSRUFEIHwgQlVTX0RNQVNZTkNfUE9TVFdSSVRFKTsKCQlidXNfZG1hbWFwX3VubG9hZChkbWEt PmRtYV90YWcsIGRtYS0+ZG1hX21hcCk7CgkJYnVzX2RtYW1lbV9mcmVlKGRtYS0+ZG1hX3RhZywg ZG1hLT5kbWFfdmFkZHIsIGRtYS0+ZG1hX21hcCk7CgkJZG1hLT5kbWFfbWFwID0gTlVMTDsKCX0K CWJ1c19kbWFfdGFnX2Rlc3Ryb3koZG1hLT5kbWFfdGFnKTsKCWRtYS0+ZG1hX3RhZyA9IE5VTEw7 Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqCiAqCiAqICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc21p dCBhbmQgcmVjZWl2ZSByaW5ncywgYW5kIHRoZW4KICogIHRoZSBkZXNjcmlwdG9ycyBhc3NvY2lh dGVkIHdpdGggZWFjaCwgY2FsbGVkIG9ubHkgb25jZSBhdCBhdHRhY2guCiAqCiAqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqLwpzdGF0aWMgaW50CmVtX2FsbG9jYXRlX3F1ZXVlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRl cikKewoJZGV2aWNlX3QJCWRldiA9IGFkYXB0ZXItPmRldjsKCXN0cnVjdCB0eF9yaW5nCQkqdHhy ID0gTlVMTDsKCXN0cnVjdCByeF9yaW5nCQkqcnhyID0gTlVMTDsKCWludCByc2l6ZSwgdHNpemUs IGVycm9yID0gRTEwMDBfU1VDQ0VTUzsKCWludCB0eGNvbmYgPSAwLCByeGNvbmYgPSAwOwoKCgkv KiBBbGxvY2F0ZSB0aGUgVFggcmluZyBzdHJ1Y3QgbWVtb3J5ICovCglpZiAoIShhZGFwdGVyLT50 eF9yaW5ncyA9CgkgICAgKHN0cnVjdCB0eF9yaW5nICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHR4 X3JpbmcpICoKCSAgICBhZGFwdGVyLT5udW1fcXVldWVzLCBNX0RFVkJVRiwgTV9OT1dBSVQgfCBN X1pFUk8pKSkgewoJCWRldmljZV9wcmludGYoZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIFRYIHJp bmcgbWVtb3J5XG4iKTsKCQllcnJvciA9IEVOT01FTTsKCQlnb3RvIGZhaWw7Cgl9CgoJLyogTm93 IGFsbG9jYXRlIHRoZSBSWCAqLwoJaWYgKCEoYWRhcHRlci0+cnhfcmluZ3MgPQoJICAgIChzdHJ1 Y3QgcnhfcmluZyAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCByeF9yaW5nKSAqCgkgICAgYWRhcHRl ci0+bnVtX3F1ZXVlcywgTV9ERVZCVUYsIE1fTk9XQUlUIHwgTV9aRVJPKSkpIHsKCQlkZXZpY2Vf cHJpbnRmKGRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBSWCByaW5nIG1lbW9yeVxuIik7CgkJZXJy b3IgPSBFTk9NRU07CgkJZ290byByeF9mYWlsOwoJfQoKCXRzaXplID0gcm91bmR1cDIoYWRhcHRl ci0+bnVtX3R4X2Rlc2MgKgoJICAgIHNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfZGVzYyksIEVNX0RC QV9BTElHTik7CgkvKgoJICogTm93IHNldCB1cCB0aGUgVFggcXVldWVzLCB0eGNvbmYgaXMgbmVl ZGVkIHRvIGhhbmRsZSB0aGUKCSAqIHBvc3NpYmlsaXR5IHRoYXQgdGhpbmdzIGZhaWwgbWlkY291 cnNlIGFuZCB3ZSBuZWVkIHRvCgkgKiB1bmRvIG1lbW9yeSBncmFjZWZ1bGx5CgkgKi8gCglmb3Ig KGludCBpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKywgdHhjb25mKyspIHsKCQkv KiBTZXQgdXAgc29tZSBiYXNpY3MgKi8KCQl0eHIgPSAmYWRhcHRlci0+dHhfcmluZ3NbaV07CgkJ dHhyLT5hZGFwdGVyID0gYWRhcHRlcjsKCQl0eHItPm1lID0gaTsKCgkJLyogSW5pdGlhbGl6ZSB0 aGUgVFggbG9jayAqLwoJCXNucHJpbnRmKHR4ci0+bXR4X25hbWUsIHNpemVvZih0eHItPm10eF9u YW1lKSwgIiVzOnR4KCVkKSIsCgkJICAgIGRldmljZV9nZXRfbmFtZXVuaXQoZGV2KSwgdHhyLT5t ZSk7CgkJbXR4X2luaXQoJnR4ci0+dHhfbXR4LCB0eHItPm10eF9uYW1lLCBOVUxMLCBNVFhfREVG KTsKCgkJaWYgKGVtX2RtYV9tYWxsb2MoYWRhcHRlciwgdHNpemUsCgkJCSZ0eHItPnR4ZG1hLCBC VVNfRE1BX05PV0FJVCkpIHsKCQkJZGV2aWNlX3ByaW50ZihkZXYsCgkJCSAgICAiVW5hYmxlIHRv IGFsbG9jYXRlIFRYIERlc2NyaXB0b3IgbWVtb3J5XG4iKTsKCQkJZXJyb3IgPSBFTk9NRU07CgkJ CWdvdG8gZXJyX3R4X2Rlc2M7CgkJfQoJCXR4ci0+dHhfYmFzZSA9IChzdHJ1Y3QgZTEwMDBfdHhf ZGVzYyAqKXR4ci0+dHhkbWEuZG1hX3ZhZGRyOwoJCWJ6ZXJvKCh2b2lkICopdHhyLT50eF9iYXNl LCB0c2l6ZSk7CgogICAgICAgIAlpZiAoZW1fYWxsb2NhdGVfdHJhbnNtaXRfYnVmZmVycyh0eHIp KSB7CgkJCWRldmljZV9wcmludGYoZGV2LAoJCQkgICAgIkNyaXRpY2FsIEZhaWx1cmUgc2V0dGlu ZyB1cCB0cmFuc21pdCBidWZmZXJzXG4iKTsKCQkJZXJyb3IgPSBFTk9NRU07CgkJCWdvdG8gZXJy X3R4X2Rlc2M7CiAgICAgICAgCX0KI2lmIF9fRnJlZUJTRF92ZXJzaW9uID49IDgwMDAwMAoJCS8q IEFsbG9jYXRlIGEgYnVmIHJpbmcgKi8KCQl0eHItPmJyID0gYnVmX3JpbmdfYWxsb2MoNDA5Niwg TV9ERVZCVUYsCgkJICAgIE1fV0FJVE9LLCAmdHhyLT50eF9tdHgpOwojZW5kaWYKCX0KCgkvKgoJ ICogTmV4dCB0aGUgUlggcXVldWVzLi4uCgkgKi8gCglyc2l6ZSA9IHJvdW5kdXAyKGFkYXB0ZXIt Pm51bV9yeF9kZXNjICoKCSAgICBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X2Rlc2MpLCBFTV9EQkFf QUxJR04pOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyssIHJ4 Y29uZisrKSB7CgkJcnhyID0gJmFkYXB0ZXItPnJ4X3JpbmdzW2ldOwoJCXJ4ci0+YWRhcHRlciA9 IGFkYXB0ZXI7CgkJcnhyLT5tZSA9IGk7CgoJCS8qIEluaXRpYWxpemUgdGhlIFJYIGxvY2sgKi8K CQlzbnByaW50ZihyeHItPm10eF9uYW1lLCBzaXplb2YocnhyLT5tdHhfbmFtZSksICIlczpyeCgl ZCkiLAoJCSAgICBkZXZpY2VfZ2V0X25hbWV1bml0KGRldiksIHR4ci0+bWUpOwoJCW10eF9pbml0 KCZyeHItPnJ4X210eCwgcnhyLT5tdHhfbmFtZSwgTlVMTCwgTVRYX0RFRik7CgoJCWlmIChlbV9k bWFfbWFsbG9jKGFkYXB0ZXIsIHJzaXplLAoJCQkmcnhyLT5yeGRtYSwgQlVTX0RNQV9OT1dBSVQp KSB7CgkJCWRldmljZV9wcmludGYoZGV2LAoJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBSeERl c2NyaXB0b3IgbWVtb3J5XG4iKTsKCQkJZXJyb3IgPSBFTk9NRU07CgkJCWdvdG8gZXJyX3J4X2Rl c2M7CgkJfQoJCXJ4ci0+cnhfYmFzZSA9IChzdHJ1Y3QgZTEwMDBfcnhfZGVzYyAqKXJ4ci0+cnhk bWEuZG1hX3ZhZGRyOwoJCWJ6ZXJvKCh2b2lkICopcnhyLT5yeF9iYXNlLCByc2l6ZSk7CgogICAg ICAgIAkvKiBBbGxvY2F0ZSByZWNlaXZlIGJ1ZmZlcnMgZm9yIHRoZSByaW5nKi8KCQlpZiAoZW1f YWxsb2NhdGVfcmVjZWl2ZV9idWZmZXJzKHJ4cikpIHsKCQkJZGV2aWNlX3ByaW50ZihkZXYsCgkJ CSAgICAiQ3JpdGljYWwgRmFpbHVyZSBzZXR0aW5nIHVwIHJlY2VpdmUgYnVmZmVyc1xuIik7CgkJ CWVycm9yID0gRU5PTUVNOwoJCQlnb3RvIGVycl9yeF9kZXNjOwoJCX0KCX0KCglyZXR1cm4gKDAp OwoKZXJyX3J4X2Rlc2M6Cglmb3IgKHJ4ciA9IGFkYXB0ZXItPnJ4X3JpbmdzOyByeGNvbmYgPiAw OyByeHIrKywgcnhjb25mLS0pCgkJZW1fZG1hX2ZyZWUoYWRhcHRlciwgJnJ4ci0+cnhkbWEpOwpl cnJfdHhfZGVzYzoKCWZvciAodHhyID0gYWRhcHRlci0+dHhfcmluZ3M7IHR4Y29uZiA+IDA7IHR4 cisrLCB0eGNvbmYtLSkKCQllbV9kbWFfZnJlZShhZGFwdGVyLCAmdHhyLT50eGRtYSk7CglmcmVl KGFkYXB0ZXItPnJ4X3JpbmdzLCBNX0RFVkJVRik7CnJ4X2ZhaWw6CiNpZiBfX0ZyZWVCU0RfdmVy c2lvbiA+PSA4MDAwMDAKCWJ1Zl9yaW5nX2ZyZWUodHhyLT5iciwgTV9ERVZCVUYpOwojZW5kaWYK CWZyZWUoYWRhcHRlci0+dHhfcmluZ3MsIE1fREVWQlVGKTsKZmFpbDoKCXJldHVybiAoZXJyb3Ip Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKgogKgogKiAgQWxsb2NhdGUgbWVtb3J5IGZvciB0eF9idWZmZXIg c3RydWN0dXJlcy4gVGhlIHR4X2J1ZmZlciBzdG9yZXMgYWxsCiAqICB0aGUgaW5mb3JtYXRpb24g bmVlZGVkIHRvIHRyYW5zbWl0IGEgcGFja2V0IG9uIHRoZSB3aXJlLiBUaGlzIGlzCiAqICBjYWxs ZWQgb25seSBvbmNlIGF0IGF0dGFjaCwgc2V0dXAgaXMgZG9uZSBldmVyeSByZXNldC4KICoKICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCnN0YXRpYyBpbnQKZW1fYWxsb2NhdGVfdHJhbnNtaXRfYnVmZmVycyhzdHJ1 Y3QgdHhfcmluZyAqdHhyKQp7CglzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHR4ci0+YWRhcHRl cjsKCWRldmljZV90IGRldiA9IGFkYXB0ZXItPmRldjsKCXN0cnVjdCBlbV9idWZmZXIgKnR4YnVm OwoJaW50IGVycm9yLCBpOwoKCS8qCgkgKiBTZXR1cCBETUEgZGVzY3JpcHRvciBhcmVhcy4KCSAq LwoJaWYgKChlcnJvciA9IGJ1c19kbWFfdGFnX2NyZWF0ZShidXNfZ2V0X2RtYV90YWcoZGV2KSwK CQkJICAgICAgIDEsIDAsCQkJLyogYWxpZ25tZW50LCBib3VuZHMgKi8KCQkJICAgICAgIEJVU19T UEFDRV9NQVhBRERSLAkvKiBsb3dhZGRyICovCgkJCSAgICAgICBCVVNfU1BBQ0VfTUFYQUREUiwJ LyogaGlnaGFkZHIgKi8KCQkJICAgICAgIE5VTEwsIE5VTEwsCQkvKiBmaWx0ZXIsIGZpbHRlcmFy ZyAqLwoJCQkgICAgICAgRU1fVFNPX1NJWkUsCQkvKiBtYXhzaXplICovCgkJCSAgICAgICBFTV9N QVhfU0NBVFRFUiwJCS8qIG5zZWdtZW50cyAqLwoJCQkgICAgICAgUEFHRV9TSVpFLAkJLyogbWF4 c2Vnc2l6ZSAqLwoJCQkgICAgICAgMCwJCQkvKiBmbGFncyAqLwoJCQkgICAgICAgTlVMTCwJCQkv KiBsb2NrZnVuYyAqLwoJCQkgICAgICAgTlVMTCwJCQkvKiBsb2NrZnVuY2FyZyAqLwoJCQkgICAg ICAgJnR4ci0+dHh0YWcpKSkgewoJCWRldmljZV9wcmludGYoZGV2LCJVbmFibGUgdG8gYWxsb2Nh dGUgVFggRE1BIHRhZ1xuIik7CgkJZ290byBmYWlsOwoJfQoKCWlmICghKHR4ci0+dHhfYnVmZmVy cyA9CgkgICAgKHN0cnVjdCBlbV9idWZmZXIgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW1fYnVm ZmVyKSAqCgkgICAgYWRhcHRlci0+bnVtX3R4X2Rlc2MsIE1fREVWQlVGLCBNX05PV0FJVCB8IE1f WkVSTykpKSB7CgkJZGV2aWNlX3ByaW50ZihkZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgdHhfYnVm ZmVyIG1lbW9yeVxuIik7CgkJZXJyb3IgPSBFTk9NRU07CgkJZ290byBmYWlsOwoJfQoKICAgICAg ICAvKiBDcmVhdGUgdGhlIGRlc2NyaXB0b3IgYnVmZmVyIGRtYSBtYXBzICovCgl0eGJ1ZiA9IHR4 ci0+dHhfYnVmZmVyczsKCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdHhfZGVzYzsgaSsr LCB0eGJ1ZisrKSB7CgkJZXJyb3IgPSBidXNfZG1hbWFwX2NyZWF0ZSh0eHItPnR4dGFnLCAwLCAm dHhidWYtPm1hcCk7CgkJaWYgKGVycm9yICE9IDApIHsKCQkJZGV2aWNlX3ByaW50ZihkZXYsICJV bmFibGUgdG8gY3JlYXRlIFRYIERNQSBtYXBcbiIpOwoJCQlnb3RvIGZhaWw7CgkJfQoJfQoKCXJl dHVybiAwOwpmYWlsOgoJLyogV2UgZnJlZSBhbGwsIGl0IGhhbmRsZXMgY2FzZSB3aGVyZSB3ZSBh cmUgaW4gdGhlIG1pZGRsZSAqLwoJZW1fZnJlZV90cmFuc21pdF9zdHJ1Y3R1cmVzKGFkYXB0ZXIp OwoJcmV0dXJuIChlcnJvcik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIEluaXRpYWxpemUgYSB0 cmFuc21pdCByaW5nLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZW1fc2V0dXBfdHJh bnNtaXRfcmluZyhzdHJ1Y3QgdHhfcmluZyAqdHhyKQp7CglzdHJ1Y3QgYWRhcHRlciAqYWRhcHRl ciA9IHR4ci0+YWRhcHRlcjsKCXN0cnVjdCBlbV9idWZmZXIgKnR4YnVmOwoJaW50IGk7CgoJLyog Q2xlYXIgdGhlIG9sZCBkZXNjcmlwdG9yIGNvbnRlbnRzICovCglFTV9UWF9MT0NLKHR4cik7Cgli emVybygodm9pZCAqKXR4ci0+dHhfYmFzZSwKCSAgICAgIChzaXplb2Yoc3RydWN0IGUxMDAwX3R4 X2Rlc2MpKSAqIGFkYXB0ZXItPm51bV90eF9kZXNjKTsKCS8qIFJlc2V0IGluZGljZXMgKi8KCXR4 ci0+bmV4dF9hdmFpbF9kZXNjID0gMDsKCXR4ci0+bmV4dF90b19jbGVhbiA9IDA7CgoJLyogRnJl ZSBhbnkgZXhpc3RpbmcgdHggYnVmZmVycy4gKi8KICAgICAgICB0eGJ1ZiA9IHR4ci0+dHhfYnVm ZmVyczsKCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdHhfZGVzYzsgaSsrLCB0eGJ1Zisr KSB7CgkJaWYgKHR4YnVmLT5tX2hlYWQgIT0gTlVMTCkgewoJCQlidXNfZG1hbWFwX3N5bmModHhy LT50eHRhZywgdHhidWYtPm1hcCwKCQkJICAgIEJVU19ETUFTWU5DX1BPU1RXUklURSk7CgkJCWJ1 c19kbWFtYXBfdW5sb2FkKHR4ci0+dHh0YWcsIHR4YnVmLT5tYXApOwoJCQltX2ZyZWVtKHR4YnVm LT5tX2hlYWQpOwoJCQl0eGJ1Zi0+bV9oZWFkID0gTlVMTDsKCQl9CgkJLyogY2xlYXIgdGhlIHdh dGNoIGluZGV4ICovCgkJdHhidWYtPm5leHRfZW9wID0gLTE7CiAgICAgICAgfQoKCS8qIFNldCBu dW1iZXIgb2YgZGVzY3JpcHRvcnMgYXZhaWxhYmxlICovCgl0eHItPnR4X2F2YWlsID0gYWRhcHRl ci0+bnVtX3R4X2Rlc2M7CgoJYnVzX2RtYW1hcF9zeW5jKHR4ci0+dHhkbWEuZG1hX3RhZywgdHhy LT50eGRtYS5kbWFfbWFwLAoJICAgIEJVU19ETUFTWU5DX1BSRVJFQUQgfCBCVVNfRE1BU1lOQ19Q UkVXUklURSk7CglFTV9UWF9VTkxPQ0sodHhyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgSW5p dGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmluZ3MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9p ZAplbV9zZXR1cF90cmFuc21pdF9zdHJ1Y3R1cmVzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7 CglzdHJ1Y3QgdHhfcmluZyAqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7CgoJZm9yIChpbnQgaSA9 IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyssIHR4cisrKQoJCWVtX3NldHVwX3RyYW5z bWl0X3JpbmcodHhyKTsKCglyZXR1cm47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIEVuYWJsZSB0 cmFuc21pdCB1bml0LgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZW1faW5pdGlhbGl6 ZV90cmFuc21pdF91bml0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7CglzdHJ1Y3QgdHhfcmlu ZwkqdHhyID0gYWRhcHRlci0+dHhfcmluZ3M7CglzdHJ1Y3QgZTEwMDBfaHcJKmh3ID0gJmFkYXB0 ZXItPmh3OwoJdTMyCXRjdGwsIHRhcmMsIHRpcGcgPSAwOwoKCSBJTklUX0RFQlVHT1VUKCJlbV9p bml0aWFsaXplX3RyYW5zbWl0X3VuaXQ6IGJlZ2luIik7CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBh ZGFwdGVyLT5udW1fcXVldWVzOyBpKyssIHR4cisrKSB7CgkJdTY0IGJ1c19hZGRyID0gdHhyLT50 eGRtYS5kbWFfcGFkZHI7CgkJLyogQmFzZSBhbmQgTGVuIG9mIFRYIFJpbmcgKi8KCQlFMTAwMF9X UklURV9SRUcoaHcsIEUxMDAwX1RETEVOKGkpLAoJICAgIAkgICAgYWRhcHRlci0+bnVtX3R4X2Rl c2MgKiBzaXplb2Yoc3RydWN0IGUxMDAwX3R4X2Rlc2MpKTsKCQlFMTAwMF9XUklURV9SRUcoaHcs IEUxMDAwX1REQkFIKGkpLAoJICAgIAkgICAgKHUzMikoYnVzX2FkZHIgPj4gMzIpKTsKCQlFMTAw MF9XUklURV9SRUcoaHcsIEUxMDAwX1REQkFMKGkpLAoJICAgIAkgICAgKHUzMilidXNfYWRkcik7 CgkJLyogSW5pdCB0aGUgSEVBRC9UQUlMIGluZGljZXMgKi8KCQlFMTAwMF9XUklURV9SRUcoaHcs IEUxMDAwX1REVChpKSwgMCk7CgkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFMTAwMF9UREgoaSksIDAp OwoKCQlIV19ERUJVR09VVDIoIkJhc2UgPSAleCwgTGVuZ3RoID0gJXhcbiIsCgkJICAgIEUxMDAw X1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfVERCQUwoaSkpLAoJCSAgICBFMTAwMF9SRUFE X1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1RETEVOKGkpKSk7CgoJCXR4ci0+d2F0Y2hkb2dfY2hl Y2sgPSBGQUxTRTsKCX0KCgkvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgVHggSW50 ZXIgUGFja2V0IEdhcCB0aW1lciAqLwoJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewoJ Y2FzZSBlMTAwMF84MjU0MjoKCQl0aXBnID0gREVGQVVMVF84MjU0Ml9USVBHX0lQR1Q7CgkJdGlw ZyB8PSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHUjEgPDwgRTEwMDBfVElQR19JUEdSMV9TSElGVDsK CQl0aXBnIHw9IERFRkFVTFRfODI1NDJfVElQR19JUEdSMiA8PCBFMTAwMF9USVBHX0lQR1IyX1NI SUZUOwoJCWJyZWFrOwoJY2FzZSBlMTAwMF84MDAwM2VzMmxhbjoKCQl0aXBnID0gREVGQVVMVF84 MjU0M19USVBHX0lQR1IxOwoJCXRpcGcgfD0gREVGQVVMVF84MDAwM0VTMkxBTl9USVBHX0lQR1Iy IDw8CgkJICAgIEUxMDAwX1RJUEdfSVBHUjJfU0hJRlQ7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWlm ICgoYWRhcHRlci0+aHcucGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikg fHwKCQkgICAgKGFkYXB0ZXItPmh3LnBoeS5tZWRpYV90eXBlID09CgkJICAgIGUxMDAwX21lZGlh X3R5cGVfaW50ZXJuYWxfc2VyZGVzKSkKCQkJdGlwZyA9IERFRkFVTFRfODI1NDNfVElQR19JUEdU X0ZJQkVSOwoJCWVsc2UKCQkJdGlwZyA9IERFRkFVTFRfODI1NDNfVElQR19JUEdUX0NPUFBFUjsK CQl0aXBnIHw9IERFRkFVTFRfODI1NDNfVElQR19JUEdSMSA8PCBFMTAwMF9USVBHX0lQR1IxX1NI SUZUOwoJCXRpcGcgfD0gREVGQVVMVF84MjU0M19USVBHX0lQR1IyIDw8IEUxMDAwX1RJUEdfSVBH UjJfU0hJRlQ7Cgl9CgoJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfVElQRywg dGlwZyk7CglFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9USURWLCBhZGFwdGVy LT50eF9pbnRfZGVsYXkudmFsdWUpOwoKCWlmKGFkYXB0ZXItPmh3Lm1hYy50eXBlID49IGUxMDAw XzgyNTQwKQoJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1RBRFYsCgkJICAg IGFkYXB0ZXItPnR4X2Fic19pbnRfZGVsYXkudmFsdWUpOwoKCWlmICgoYWRhcHRlci0+aHcubWFj LnR5cGUgPT0gZTEwMDBfODI1NzEpIHx8CgkgICAgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID09IGUx MDAwXzgyNTcyKSkgewoJCXRhcmMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAw X1RBUkMoMCkpOwoJCXRhcmMgfD0gU1BFRURfTU9ERV9CSVQ7CgkJRTEwMDBfV1JJVEVfUkVHKCZh ZGFwdGVyLT5odywgRTEwMDBfVEFSQygwKSwgdGFyYyk7Cgl9IGVsc2UgaWYgKGFkYXB0ZXItPmh3 Lm1hYy50eXBlID09IGUxMDAwXzgwMDAzZXMybGFuKSB7CgkJdGFyYyA9IEUxMDAwX1JFQURfUkVH KCZhZGFwdGVyLT5odywgRTEwMDBfVEFSQygwKSk7CgkJdGFyYyB8PSAxOwoJCUUxMDAwX1dSSVRF X1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1RBUkMoMCksIHRhcmMpOwoJCXRhcmMgPSBFMTAwMF9S RUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1RBUkMoMSkpOwoJCXRhcmMgfD0gMTsKCQlFMTAw MF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9UQVJDKDEpLCB0YXJjKTsKCX0KCglhZGFw dGVyLT50eGRfY21kID0gRTEwMDBfVFhEX0NNRF9JRkNTOwoJaWYgKGFkYXB0ZXItPnR4X2ludF9k ZWxheS52YWx1ZSA+IDApCgkJYWRhcHRlci0+dHhkX2NtZCB8PSBFMTAwMF9UWERfQ01EX0lERTsK CgkvKiBQcm9ncmFtIHRoZSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyICovCgl0Y3RsID0gRTEw MDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9UQ1RMKTsKCXRjdGwgJj0gfkUxMDAwX1RD VExfQ1Q7Cgl0Y3RsIHw9IChFMTAwMF9UQ1RMX1BTUCB8IEUxMDAwX1RDVExfUlRMQyB8IEUxMDAw X1RDVExfRU4gfAoJCSAgIChFMTAwMF9DT0xMSVNJT05fVEhSRVNIT0xEIDw8IEUxMDAwX0NUX1NI SUZUKSk7CgoJaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID49IGUxMDAwXzgyNTcxKQoJCXRjdGwg fD0gRTEwMDBfVENUTF9NVUxSOwoKCS8qIFRoaXMgd3JpdGUgd2lsbCBlZmZlY3RpdmVseSB0dXJu IG9uIHRoZSB0cmFuc21pdCB1bml0LiAqLwoJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywg RTEwMDBfVENUTCwgdGN0bCk7Cgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgRnJlZSBhbGwgdHJh bnNtaXQgcmluZ3MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZAplbV9mcmVlX3RyYW5z bWl0X3N0cnVjdHVyZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCXN0cnVjdCB0eF9yaW5n ICp0eHIgPSBhZGFwdGVyLT50eF9yaW5nczsKCglmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXIt Pm51bV9xdWV1ZXM7IGkrKywgdHhyKyspIHsKCQlFTV9UWF9MT0NLKHR4cik7CgkJZW1fZnJlZV90 cmFuc21pdF9idWZmZXJzKHR4cik7CgkJZW1fZG1hX2ZyZWUoYWRhcHRlciwgJnR4ci0+dHhkbWEp OwoJCUVNX1RYX1VOTE9DSyh0eHIpOwoJCUVNX1RYX0xPQ0tfREVTVFJPWSh0eHIpOwoJfQoKCWZy ZWUoYWRhcHRlci0+dHhfcmluZ3MsIE1fREVWQlVGKTsKfQoKLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAg RnJlZSB0cmFuc21pdCByaW5nIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLgogKgogKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8Kc3RhdGljIHZvaWQKZW1fZnJlZV90cmFuc21pdF9idWZmZXJzKHN0cnVjdCB0eF9yaW5n ICp0eHIpCnsKCXN0cnVjdCBhZGFwdGVyCQkqYWRhcHRlciA9IHR4ci0+YWRhcHRlcjsKCXN0cnVj dCBlbV9idWZmZXIJKnR4YnVmOwoKCUlOSVRfREVCVUdPVVQoImZyZWVfdHJhbnNtaXRfcmluZzog YmVnaW4iKTsKCglpZiAodHhyLT50eF9idWZmZXJzID09IE5VTEwpCgkJcmV0dXJuOwoKCWZvciAo aW50IGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3R4X2Rlc2M7IGkrKykgewoJCXR4YnVmID0gJnR4 ci0+dHhfYnVmZmVyc1tpXTsKCQlpZiAodHhidWYtPm1faGVhZCAhPSBOVUxMKSB7CgkJCWJ1c19k bWFtYXBfc3luYyh0eHItPnR4dGFnLCB0eGJ1Zi0+bWFwLAoJCQkgICAgQlVTX0RNQVNZTkNfUE9T VFdSSVRFKTsKCQkJYnVzX2RtYW1hcF91bmxvYWQodHhyLT50eHRhZywKCQkJICAgIHR4YnVmLT5t YXApOwoJCQltX2ZyZWVtKHR4YnVmLT5tX2hlYWQpOwoJCQl0eGJ1Zi0+bV9oZWFkID0gTlVMTDsK CQkJaWYgKHR4YnVmLT5tYXAgIT0gTlVMTCkgewoJCQkJYnVzX2RtYW1hcF9kZXN0cm95KHR4ci0+ dHh0YWcsCgkJCQkgICAgdHhidWYtPm1hcCk7CgkJCQl0eGJ1Zi0+bWFwID0gTlVMTDsKCQkJfQoJ CX0gZWxzZSBpZiAodHhidWYtPm1hcCAhPSBOVUxMKSB7CgkJCWJ1c19kbWFtYXBfdW5sb2FkKHR4 ci0+dHh0YWcsCgkJCSAgICB0eGJ1Zi0+bWFwKTsKCQkJYnVzX2RtYW1hcF9kZXN0cm95KHR4ci0+ dHh0YWcsCgkJCSAgICB0eGJ1Zi0+bWFwKTsKCQkJdHhidWYtPm1hcCA9IE5VTEw7CgkJfQoJfQoj aWYgX19GcmVlQlNEX3ZlcnNpb24gPj0gODAwMDAwCglpZiAodHhyLT5iciAhPSBOVUxMKQoJCWJ1 Zl9yaW5nX2ZyZWUodHhyLT5iciwgTV9ERVZCVUYpOwojZW5kaWYKCWlmICh0eHItPnR4X2J1ZmZl cnMgIT0gTlVMTCkgewoJCWZyZWUodHhyLT50eF9idWZmZXJzLCBNX0RFVkJVRik7CgkJdHhyLT50 eF9idWZmZXJzID0gTlVMTDsKCX0KCWlmICh0eHItPnR4dGFnICE9IE5VTEwpIHsKCQlidXNfZG1h X3RhZ19kZXN0cm95KHR4ci0+dHh0YWcpOwoJCXR4ci0+dHh0YWcgPSBOVUxMOwoJfQoJcmV0dXJu Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKgogKgogKiAgVGhlIG9mZmxvYWQgY29udGV4dCBuZWVkcyB0byBi ZSBzZXQgd2hlbiB3ZSB0cmFuc2ZlciB0aGUgZmlyc3QKICogIHBhY2tldCBvZiBhIHBhcnRpY3Vs YXIgcHJvdG9jb2wgKFRDUC9VRFApLiBUaGlzIHJvdXRpbmUgaGFzIGJlZW4KICogIGVuaGFuY2Vk IHRvIGRlYWwgd2l0aCBpbnNlcnRlZCBWTEFOIGhlYWRlcnMsIGFuZCBJUFY2IChub3QgY29tcGxl dGUpCiAqCiAqICBBZGRlZCBiYWNrIHRoZSBvbGQgbWV0aG9kIG9mIGtlZXBpbmcgdGhlIGN1cnJl bnQgY29udGV4dCB0eXBlCiAqICBhbmQgbm90IHNldHRpbmcgaWYgdW5uZWNlc3NhcnksIGFzIHRo aXMgaXMgcmVwb3J0ZWQgdG8gYmUgYQogKiAgYmlnIHBlcmZvcm1hbmNlIHdpbi4gIC1qZnYKICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCnN0YXRpYyB2b2lkCmVtX3RyYW5zbWl0X2NoZWNrc3VtX3NldHVwKHN0cnVj dCB0eF9yaW5nICp0eHIsIHN0cnVjdCBtYnVmICptcCwKICAgIHUzMiAqdHhkX3VwcGVyLCB1MzIg KnR4ZF9sb3dlcikKewoJc3RydWN0IGFkYXB0ZXIJCQkqYWRhcHRlciA9IHR4ci0+YWRhcHRlcjsK CXN0cnVjdCBlMTAwMF9jb250ZXh0X2Rlc2MJKlRYRCA9IE5VTEw7CglzdHJ1Y3QgZW1fYnVmZmVy ICp0eF9idWZmZXI7CglzdHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIgKmVoOwoJc3RydWN0IGlwICpp cCA9IE5VTEw7CglzdHJ1Y3QgaXA2X2hkciAqaXA2OwoJaW50IGN1ciwgZWhkcmxlbjsKCXUzMiBj bWQsIGhkcl9sZW4sIGlwX2hsZW47Cgl1MTYgZXR5cGU7Cgl1OCBpcHByb3RvOwoKCgljbWQgPSBo ZHJfbGVuID0gaXBwcm90byA9IDA7CgljdXIgPSB0eHItPm5leHRfYXZhaWxfZGVzYzsKCgkvKgoJ ICogRGV0ZXJtaW5lIHdoZXJlIGZyYW1lIHBheWxvYWQgc3RhcnRzLgoJICogSnVtcCBvdmVyIHZs YW4gaGVhZGVycyBpZiBhbHJlYWR5IHByZXNlbnQsCgkgKiBoZWxwZnVsIGZvciBRaW5RIHRvby4K CSAqLwoJZWggPSBtdG9kKG1wLCBzdHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIgKik7CglpZiAoZWgt PmV2bF9lbmNhcF9wcm90byA9PSBodG9ucyhFVEhFUlRZUEVfVkxBTikpIHsKCQlldHlwZSA9IG50 b2hzKGVoLT5ldmxfcHJvdG8pOwoJCWVoZHJsZW4gPSBFVEhFUl9IRFJfTEVOICsgRVRIRVJfVkxB Tl9FTkNBUF9MRU47Cgl9IGVsc2UgewoJCWV0eXBlID0gbnRvaHMoZWgtPmV2bF9lbmNhcF9wcm90 byk7CgkJZWhkcmxlbiA9IEVUSEVSX0hEUl9MRU47Cgl9CgoJLyoKCSAqIFdlIG9ubHkgc3VwcG9y dCBUQ1AvVURQIGZvciBJUHY0IGFuZCBJUHY2IGZvciB0aGUgbW9tZW50LgoJICogVE9ETzogU3Vw cG9ydCBTQ1RQIHRvbyB3aGVuIGl0IGhpdHMgdGhlIHRyZWUuCgkgKi8KCXN3aXRjaCAoZXR5cGUp IHsKCWNhc2UgRVRIRVJUWVBFX0lQOgoJCWlwID0gKHN0cnVjdCBpcCAqKShtcC0+bV9kYXRhICsg ZWhkcmxlbik7CgkJaXBfaGxlbiA9IGlwLT5pcF9obCA8PCAyOwoKCQkvKiBTZXR1cCBvZiBJUCBo ZWFkZXIgY2hlY2tzdW0uICovCgkJaWYgKG1wLT5tX3BrdGhkci5jc3VtX2ZsYWdzICYgQ1NVTV9J UCkgewoJCQkvKgoJCQkgKiBTdGFydCBvZmZzZXQgZm9yIGhlYWRlciBjaGVja3N1bSBjYWxjdWxh dGlvbi4KCQkJICogRW5kIG9mZnNldCBmb3IgaGVhZGVyIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgoJ CQkgKiBPZmZzZXQgb2YgcGxhY2UgdG8gcHV0IHRoZSBjaGVja3N1bS4KCQkJICovCgkJCVRYRCA9 IChzdHJ1Y3QgZTEwMDBfY29udGV4dF9kZXNjICopCgkJCSAgICAmdHhyLT50eF9iYXNlW2N1cl07 CgkJCVRYRC0+bG93ZXJfc2V0dXAuaXBfZmllbGRzLmlwY3NzID0gZWhkcmxlbjsKCQkJVFhELT5s b3dlcl9zZXR1cC5pcF9maWVsZHMuaXBjc2UgPQoJCQkgICAgaHRvbGUxNihlaGRybGVuICsgaXBf aGxlbik7CgkJCVRYRC0+bG93ZXJfc2V0dXAuaXBfZmllbGRzLmlwY3NvID0KCQkJICAgIGVoZHJs ZW4gKyBvZmZzZXRvZihzdHJ1Y3QgaXAsIGlwX3N1bSk7CgkJCWNtZCB8PSBFMTAwMF9UWERfQ01E X0lQOwoJCQkqdHhkX3VwcGVyIHw9IEUxMDAwX1RYRF9QT1BUU19JWFNNIDw8IDg7CgkJfQoKCQlp ZiAobXAtPm1fbGVuIDwgZWhkcmxlbiArIGlwX2hsZW4pCgkJCXJldHVybjsJLyogZmFpbHVyZSAq LwoKCQloZHJfbGVuID0gZWhkcmxlbiArIGlwX2hsZW47CgkJaXBwcm90byA9IGlwLT5pcF9wOwoK CQlicmVhazsKCWNhc2UgRVRIRVJUWVBFX0lQVjY6CgkJaXA2ID0gKHN0cnVjdCBpcDZfaGRyICop KG1wLT5tX2RhdGEgKyBlaGRybGVuKTsKCQlpcF9obGVuID0gc2l6ZW9mKHN0cnVjdCBpcDZfaGRy KTsgLyogWFhYOiBObyBoZWFkZXIgc3RhY2tpbmcuICovCgoJCWlmIChtcC0+bV9sZW4gPCBlaGRy bGVuICsgaXBfaGxlbikKCQkJcmV0dXJuOwkvKiBmYWlsdXJlICovCgoJCS8qIElQdjYgZG9lc24n dCBoYXZlIGEgaGVhZGVyIGNoZWNrc3VtLiAqLwoKCQloZHJfbGVuID0gZWhkcmxlbiArIGlwX2hs ZW47CgkJaXBwcm90byA9IGlwNi0+aXA2X254dDsKCgkJYnJlYWs7CglkZWZhdWx0OgoJCSp0eGRf dXBwZXIgPSAwOwoJCSp0eGRfbG93ZXIgPSAwOwoJCXJldHVybjsKCX0KCglzd2l0Y2ggKGlwcHJv dG8pIHsKCWNhc2UgSVBQUk9UT19UQ1A6CgkJaWYgKG1wLT5tX3BrdGhkci5jc3VtX2ZsYWdzICYg Q1NVTV9UQ1ApIHsKCQkJKnR4ZF9sb3dlciA9IEUxMDAwX1RYRF9DTURfREVYVCB8IEUxMDAwX1RY RF9EVFlQX0Q7CgkJCSp0eGRfdXBwZXIgfD0gRTEwMDBfVFhEX1BPUFRTX1RYU00gPDwgODsKCQkJ Lyogbm8gbmVlZCBmb3IgY29udGV4dCBpZiBhbHJlYWR5IHNldCAqLwoJCQlpZiAodHhyLT5sYXN0 X2h3X29mZmxvYWQgPT0gQ1NVTV9UQ1ApCgkJCQlyZXR1cm47CgkJCXR4ci0+bGFzdF9od19vZmZs b2FkID0gQ1NVTV9UQ1A7CgkJCS8qCgkJCSAqIFN0YXJ0IG9mZnNldCBmb3IgcGF5bG9hZCBjaGVj a3N1bSBjYWxjdWxhdGlvbi4KCQkJICogRW5kIG9mZnNldCBmb3IgcGF5bG9hZCBjaGVja3N1bSBj YWxjdWxhdGlvbi4KCQkJICogT2Zmc2V0IG9mIHBsYWNlIHRvIHB1dCB0aGUgY2hlY2tzdW0uCgkJ CSAqLwoJCQlUWEQgPSAoc3RydWN0IGUxMDAwX2NvbnRleHRfZGVzYyAqKQoJCQkgICAgJnR4ci0+ dHhfYmFzZVtjdXJdOwoJCQlUWEQtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc3MgPSBoZHJf bGVuOwoJCQlUWEQtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc2UgPSBodG9sZTE2KDApOwoJ CQlUWEQtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc28gPQoJCQkgICAgaGRyX2xlbiArIG9m ZnNldG9mKHN0cnVjdCB0Y3BoZHIsIHRoX3N1bSk7CgkJCWNtZCB8PSBFMTAwMF9UWERfQ01EX1RD UDsKCQl9CgkJYnJlYWs7CgljYXNlIElQUFJPVE9fVURQOgoJewoJCWlmIChtcC0+bV9wa3RoZHIu Y3N1bV9mbGFncyAmIENTVU1fVURQKSB7CgkJCSp0eGRfbG93ZXIgPSBFMTAwMF9UWERfQ01EX0RF WFQgfCBFMTAwMF9UWERfRFRZUF9EOwoJCQkqdHhkX3VwcGVyIHw9IEUxMDAwX1RYRF9QT1BUU19U WFNNIDw8IDg7CgkJCS8qIG5vIG5lZWQgZm9yIGNvbnRleHQgaWYgYWxyZWFkeSBzZXQgKi8KCQkJ aWYgKHR4ci0+bGFzdF9od19vZmZsb2FkID09IENTVU1fVURQKQoJCQkJcmV0dXJuOwoJCQl0eHIt Pmxhc3RfaHdfb2ZmbG9hZCA9IENTVU1fVURQOwoJCQkvKgoJCQkgKiBTdGFydCBvZmZzZXQgZm9y IGhlYWRlciBjaGVja3N1bSBjYWxjdWxhdGlvbi4KCQkJICogRW5kIG9mZnNldCBmb3IgaGVhZGVy IGNoZWNrc3VtIGNhbGN1bGF0aW9uLgoJCQkgKiBPZmZzZXQgb2YgcGxhY2UgdG8gcHV0IHRoZSBj aGVja3N1bS4KCQkJICovCgkJCVRYRCA9IChzdHJ1Y3QgZTEwMDBfY29udGV4dF9kZXNjICopCgkJ CSAgICAmdHhyLT50eF9iYXNlW2N1cl07CgkJCVRYRC0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50 dWNzcyA9IGhkcl9sZW47CgkJCVRYRC0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzZSA9IGh0 b2xlMTYoMCk7CgkJCVRYRC0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzbyA9CgkJCSAgICBo ZHJfbGVuICsgb2Zmc2V0b2Yoc3RydWN0IHVkcGhkciwgdWhfc3VtKTsKCQl9CgkJLyogRmFsbCBU aHJ1ICovCgl9CglkZWZhdWx0OgoJCWJyZWFrOwoJfQoKCVRYRC0+dGNwX3NlZ19zZXR1cC5kYXRh ID0gaHRvbGUzMigwKTsKCVRYRC0+Y21kX2FuZF9sZW5ndGggPQoJICAgIGh0b2xlMzIoYWRhcHRl ci0+dHhkX2NtZCB8IEUxMDAwX1RYRF9DTURfREVYVCB8IGNtZCk7Cgl0eF9idWZmZXIgPSAmdHhy LT50eF9idWZmZXJzW2N1cl07Cgl0eF9idWZmZXItPm1faGVhZCA9IE5VTEw7Cgl0eF9idWZmZXIt Pm5leHRfZW9wID0gLTE7CgoJaWYgKCsrY3VyID09IGFkYXB0ZXItPm51bV90eF9kZXNjKQoJCWN1 ciA9IDA7CgoJdHhyLT50eF9hdmFpbC0tOwoJdHhyLT5uZXh0X2F2YWlsX2Rlc2MgPSBjdXI7Cn0K CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgogKgogKiAgU2V0dXAgd29yayBmb3IgaGFyZHdhcmUgc2VnbWVudGF0 aW9uIG9mZmxvYWQgKFRTTykKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBib29sCmVtX3Rzb19z ZXR1cChzdHJ1Y3QgdHhfcmluZyAqdHhyLCBzdHJ1Y3QgbWJ1ZiAqbXAsIHUzMiAqdHhkX3VwcGVy LAogICB1MzIgKnR4ZF9sb3dlcikKewoJc3RydWN0IGFkYXB0ZXIJCQkqYWRhcHRlciA9IHR4ci0+ YWRhcHRlcjsKCXN0cnVjdCBlMTAwMF9jb250ZXh0X2Rlc2MJKlRYRDsKCXN0cnVjdCBlbV9idWZm ZXIJCSp0eF9idWZmZXI7CglzdHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIJKmVoOwoJc3RydWN0IGlw CQkJKmlwOwoJc3RydWN0IGlwNl9oZHIJCQkqaXA2OwoJc3RydWN0IHRjcGhkcgkJCSp0aDsKCWlu dCBjdXIsIGVoZHJsZW4sIGhkcl9sZW4sIGlwX2hsZW4sIGlzaXA2OwoJdTE2IGV0eXBlOwoKCS8q CgkgKiBUaGlzIGZ1bmN0aW9uIGNvdWxkL3Nob3VsZCBiZSBleHRlbmRlZCB0byBzdXBwb3J0IElQ L0lQdjYKCSAqIGZyYWdtZW50YXRpb24gYXMgd2VsbC4gIEJ1dCBhcyB0aGV5IHNheSwgb25lIHN0 ZXAgYXQgYSB0aW1lLgoJICovCgoJLyoKCSAqIERldGVybWluZSB3aGVyZSBmcmFtZSBwYXlsb2Fk IHN0YXJ0cy4KCSAqIEp1bXAgb3ZlciB2bGFuIGhlYWRlcnMgaWYgYWxyZWFkeSBwcmVzZW50LAoJ ICogaGVscGZ1bCBmb3IgUWluUSB0b28uCgkgKi8KCWVoID0gbXRvZChtcCwgc3RydWN0IGV0aGVy X3ZsYW5faGVhZGVyICopOwoJaWYgKGVoLT5ldmxfZW5jYXBfcHJvdG8gPT0gaHRvbnMoRVRIRVJU WVBFX1ZMQU4pKSB7CgkJZXR5cGUgPSBudG9ocyhlaC0+ZXZsX3Byb3RvKTsKCQllaGRybGVuID0g RVRIRVJfSERSX0xFTiArIEVUSEVSX1ZMQU5fRU5DQVBfTEVOOwoJfSBlbHNlIHsKCQlldHlwZSA9 IG50b2hzKGVoLT5ldmxfZW5jYXBfcHJvdG8pOwoJCWVoZHJsZW4gPSBFVEhFUl9IRFJfTEVOOwoJ fQoKCS8qIEVuc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IHRoZSBJUCtUQ1AgaGVhZGVyIGluIHRoZSBm aXJzdCBtYnVmLiAqLwoJaWYgKG1wLT5tX2xlbiA8IGVoZHJsZW4gKyBzaXplb2Yoc3RydWN0IGlw KSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkKCQlyZXR1cm4gRkFMU0U7CS8qIC0xICovCgoJLyoK CSAqIFdlIG9ubHkgc3VwcG9ydCBUQ1AgZm9yIElQdjQgYW5kIElQdjYgKG5vdHlldCkgZm9yIHRo ZSBtb21lbnQuCgkgKiBUT0RPOiBTdXBwb3J0IFNDVFAgdG9vIHdoZW4gaXQgaGl0cyB0aGUgdHJl ZS4KCSAqLwoJc3dpdGNoIChldHlwZSkgewoJY2FzZSBFVEhFUlRZUEVfSVA6CgkJaXNpcDYgPSAw OwoJCWlwID0gKHN0cnVjdCBpcCAqKShtcC0+bV9kYXRhICsgZWhkcmxlbik7CgkJaWYgKGlwLT5p cF9wICE9IElQUFJPVE9fVENQKQoJCQlyZXR1cm4gRkFMU0U7CS8qIDAgKi8KCQlpcC0+aXBfbGVu ID0gMDsKCQlpcC0+aXBfc3VtID0gMDsKCQlpcF9obGVuID0gaXAtPmlwX2hsIDw8IDI7CgkJaWYg KG1wLT5tX2xlbiA8IGVoZHJsZW4gKyBpcF9obGVuICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKQoJ CQlyZXR1cm4gRkFMU0U7CS8qIC0xICovCgkJdGggPSAoc3RydWN0IHRjcGhkciAqKSgoY2FkZHJf dClpcCArIGlwX2hsZW4pOwojaWYgMQoJCXRoLT50aF9zdW0gPSBpbl9wc2V1ZG8oaXAtPmlwX3Ny Yy5zX2FkZHIsCgkJICAgIGlwLT5pcF9kc3Quc19hZGRyLCBodG9ucyhJUFBST1RPX1RDUCkpOwoj ZWxzZQoJCXRoLT50aF9zdW0gPSBtcC0+bV9wa3RoZHIuY3N1bV9kYXRhOwojZW5kaWYKCQlicmVh azsKCWNhc2UgRVRIRVJUWVBFX0lQVjY6CgkJaXNpcDYgPSAxOwoJCXJldHVybiBGQUxTRTsJCQkv KiBOb3Qgc3VwcG9ydGVkIHlldC4gKi8KCQlpcDYgPSAoc3RydWN0IGlwNl9oZHIgKikobXAtPm1f ZGF0YSArIGVoZHJsZW4pOwoJCWlmIChpcDYtPmlwNl9ueHQgIT0gSVBQUk9UT19UQ1ApCgkJCXJl dHVybiBGQUxTRTsJLyogMCAqLwoJCWlwNi0+aXA2X3BsZW4gPSAwOwoJCWlwX2hsZW4gPSBzaXpl b2Yoc3RydWN0IGlwNl9oZHIpOyAvKiBYWFg6IG5vIGhlYWRlciBzdGFja2luZy4gKi8KCQlpZiAo bXAtPm1fbGVuIDwgZWhkcmxlbiArIGlwX2hsZW4gKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpCgkJ CXJldHVybiBGQUxTRTsJLyogLTEgKi8KCQl0aCA9IChzdHJ1Y3QgdGNwaGRyICopKChjYWRkcl90 KWlwNiArIGlwX2hsZW4pOwojaWYgMAoJCXRoLT50aF9zdW0gPSBpbjZfcHNldWRvKGlwNi0+aXA2 X3NyYywgaXAtPmlwNl9kc3QsCgkJICAgIGh0b25zKElQUFJPVE9fVENQKSk7CS8qIFhYWDogZnVu Y3Rpb24gbm90eWV0LiAqLwojZWxzZQoJCXRoLT50aF9zdW0gPSBtcC0+bV9wa3RoZHIuY3N1bV9k YXRhOwojZW5kaWYKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIEZBTFNFOwoJfQoJaGRyX2xl biA9IGVoZHJsZW4gKyBpcF9obGVuICsgKHRoLT50aF9vZmYgPDwgMik7CgoJKnR4ZF9sb3dlciA9 IChFMTAwMF9UWERfQ01EX0RFWFQgfAkvKiBFeHRlbmRlZCBkZXNjciB0eXBlICovCgkJICAgICAg RTEwMDBfVFhEX0RUWVBfRCB8CS8qIERhdGEgZGVzY3IgdHlwZSAqLwoJCSAgICAgIEUxMDAwX1RY RF9DTURfVFNFKTsJLyogRG8gVFNFIG9uIHRoaXMgcGFja2V0ICovCgoJLyogSVAgYW5kL29yIFRD UCBoZWFkZXIgY2hlY2tzdW0gY2FsY3VsYXRpb24gYW5kIGluc2VydGlvbi4gKi8KCSp0eGRfdXBw ZXIgPSAoKGlzaXA2ID8gMCA6IEUxMDAwX1RYRF9QT1BUU19JWFNNKSB8CgkJICAgICAgRTEwMDBf VFhEX1BPUFRTX1RYU00pIDw8IDg7CgoJY3VyID0gdHhyLT5uZXh0X2F2YWlsX2Rlc2M7Cgl0eF9i dWZmZXIgPSAmdHhyLT50eF9idWZmZXJzW2N1cl07CglUWEQgPSAoc3RydWN0IGUxMDAwX2NvbnRl eHRfZGVzYyAqKSAmdHhyLT50eF9iYXNlW2N1cl07CgoJLyogSVB2NiBkb2Vzbid0IGhhdmUgYSBo ZWFkZXIgY2hlY2tzdW0uICovCglpZiAoIWlzaXA2KSB7CgkJLyoKCQkgKiBTdGFydCBvZmZzZXQg Zm9yIGhlYWRlciBjaGVja3N1bSBjYWxjdWxhdGlvbi4KCQkgKiBFbmQgb2Zmc2V0IGZvciBoZWFk ZXIgY2hlY2tzdW0gY2FsY3VsYXRpb24uCgkJICogT2Zmc2V0IG9mIHBsYWNlIHB1dCB0aGUgY2hl Y2tzdW0uCgkJICovCgkJVFhELT5sb3dlcl9zZXR1cC5pcF9maWVsZHMuaXBjc3MgPSBlaGRybGVu OwoJCVRYRC0+bG93ZXJfc2V0dXAuaXBfZmllbGRzLmlwY3NlID0KCQkgICAgaHRvbGUxNihlaGRy bGVuICsgaXBfaGxlbiAtIDEpOwoJCVRYRC0+bG93ZXJfc2V0dXAuaXBfZmllbGRzLmlwY3NvID0K CQkgICAgZWhkcmxlbiArIG9mZnNldG9mKHN0cnVjdCBpcCwgaXBfc3VtKTsKCX0KCS8qCgkgKiBT dGFydCBvZmZzZXQgZm9yIHBheWxvYWQgY2hlY2tzdW0gY2FsY3VsYXRpb24uCgkgKiBFbmQgb2Zm c2V0IGZvciBwYXlsb2FkIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgoJICogT2Zmc2V0IG9mIHBsYWNl IHRvIHB1dCB0aGUgY2hlY2tzdW0uCgkgKi8KCVRYRC0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50 dWNzcyA9CgkgICAgZWhkcmxlbiArIGlwX2hsZW47CglUWEQtPnVwcGVyX3NldHVwLnRjcF9maWVs ZHMudHVjc2UgPSAwOwoJVFhELT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NvID0KCSAgICBl aGRybGVuICsgaXBfaGxlbiArIG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIHRoX3N1bSk7CgkvKgoJ ICogUGF5bG9hZCBzaXplIHBlciBwYWNrZXQgdy9vIGFueSBoZWFkZXJzLgoJICogTGVuZ3RoIG9m IGFsbCBoZWFkZXJzIHVwIHRvIHBheWxvYWQuCgkgKi8KCVRYRC0+dGNwX3NlZ19zZXR1cC5maWVs ZHMubXNzID0gaHRvbGUxNihtcC0+bV9wa3RoZHIudHNvX3NlZ3N6KTsKCVRYRC0+dGNwX3NlZ19z ZXR1cC5maWVsZHMuaGRyX2xlbiA9IGhkcl9sZW47CgoJVFhELT5jbWRfYW5kX2xlbmd0aCA9IGh0 b2xlMzIoYWRhcHRlci0+dHhkX2NtZCB8CgkJCQlFMTAwMF9UWERfQ01EX0RFWFQgfAkvKiBFeHRl bmRlZCBkZXNjciAqLwoJCQkJRTEwMDBfVFhEX0NNRF9UU0UgfAkvKiBUU0UgY29udGV4dCAqLwoJ CQkJKGlzaXA2ID8gMCA6IEUxMDAwX1RYRF9DTURfSVApIHwgCgkJCQlFMTAwMF9UWERfQ01EX1RD UCB8CS8qIERvIFRDUCBjaGVja3N1bSAqLwoJCQkJKG1wLT5tX3BrdGhkci5sZW4gLSAoaGRyX2xl bikpKTsgLyogVG90YWwgbGVuICovCgoJdHhfYnVmZmVyLT5tX2hlYWQgPSBOVUxMOwoJdHhfYnVm ZmVyLT5uZXh0X2VvcCA9IC0xOwoKCWlmICgrK2N1ciA9PSBhZGFwdGVyLT5udW1fdHhfZGVzYykK CQljdXIgPSAwOwoKCXR4ci0+dHhfYXZhaWwtLTsKCXR4ci0+bmV4dF9hdmFpbF9kZXNjID0gY3Vy OwoJdHhyLT50eF90c28gPSBUUlVFOwoKCXJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK ICoKICogIEV4YW1pbmUgZWFjaCB0eF9idWZmZXIgaW4gdGhlIHVzZWQgcXVldWUuIElmIHRoZSBo YXJkd2FyZSBpcyBkb25lCiAqICBwcm9jZXNzaW5nIHRoZSBwYWNrZXQgdGhlbiBmcmVlIGFzc29j aWF0ZWQgcmVzb3VyY2VzLiBUaGUKICogIHR4X2J1ZmZlciBpcyBwdXQgYmFjayBvbiB0aGUgZnJl ZSBxdWV1ZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBib29sCmVtX3R4ZW9mKHN0cnVjdCB0 eF9yaW5nICp0eHIpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFwdGVyID0gdHhyLT5hZGFwdGVyOwog ICAgICAgIGludCBmaXJzdCwgbGFzdCwgZG9uZSwgbnVtX2F2YWlsOwogICAgICAgIHN0cnVjdCBl bV9idWZmZXIgKnR4X2J1ZmZlcjsKICAgICAgICBzdHJ1Y3QgZTEwMDBfdHhfZGVzYyAgICp0eF9k ZXNjLCAqZW9wX2Rlc2M7CglzdHJ1Y3QgaWZuZXQgICAqaWZwID0gYWRhcHRlci0+aWZwOwoKCUVN X1RYX0xPQ0tfQVNTRVJUKHR4cik7CgogICAgICAgIGlmICh0eHItPnR4X2F2YWlsID09IGFkYXB0 ZXItPm51bV90eF9kZXNjKQogICAgICAgICAgICAgICAgcmV0dXJuIChGQUxTRSk7CgogICAgICAg IG51bV9hdmFpbCA9IHR4ci0+dHhfYXZhaWw7CiAgICAgICAgZmlyc3QgPSB0eHItPm5leHRfdG9f Y2xlYW47CiAgICAgICAgdHhfZGVzYyA9ICZ0eHItPnR4X2Jhc2VbZmlyc3RdOwogICAgICAgIHR4 X2J1ZmZlciA9ICZ0eHItPnR4X2J1ZmZlcnNbZmlyc3RdOwoJbGFzdCA9IHR4X2J1ZmZlci0+bmV4 dF9lb3A7CiAgICAgICAgZW9wX2Rlc2MgPSAmdHhyLT50eF9iYXNlW2xhc3RdOwoKCS8qCgkgKiBX aGF0IHRoaXMgZG9lcyBpcyBnZXQgdGhlIGluZGV4IG9mIHRoZQoJICogZmlyc3QgZGVzY3JpcHRv ciBBRlRFUiB0aGUgRU9QIG9mIHRoZSAKCSAqIGZpcnN0IHBhY2tldCwgdGhhdCB3YXkgd2UgY2Fu IGRvIHRoZQoJICogc2ltcGxlIGNvbXBhcmlzb24gb24gdGhlIGlubmVyIHdoaWxlIGxvb3AuCgkg Ki8KCWlmICgrK2xhc3QgPT0gYWRhcHRlci0+bnVtX3R4X2Rlc2MpCiAJCWxhc3QgPSAwOwoJZG9u ZSA9IGxhc3Q7CgogICAgICAgIGJ1c19kbWFtYXBfc3luYyh0eHItPnR4ZG1hLmRtYV90YWcsIHR4 ci0+dHhkbWEuZG1hX21hcCwKICAgICAgICAgICAgQlVTX0RNQVNZTkNfUE9TVFJFQUQpOwoKICAg ICAgICB3aGlsZSAoZW9wX2Rlc2MtPnVwcGVyLmZpZWxkcy5zdGF0dXMgJiBFMTAwMF9UWERfU1RB VF9ERCkgewoJCS8qIFdlIGNsZWFuIHRoZSByYW5nZSBvZiB0aGUgcGFja2V0ICovCgkJd2hpbGUg KGZpcnN0ICE9IGRvbmUpIHsKICAgICAgICAgICAgICAgIAl0eF9kZXNjLT51cHBlci5kYXRhID0g MDsKICAgICAgICAgICAgICAgIAl0eF9kZXNjLT5sb3dlci5kYXRhID0gMDsKICAgICAgICAgICAg ICAgIAl0eF9kZXNjLT5idWZmZXJfYWRkciA9IDA7CiAgICAgICAgICAgICAgICAJKytudW1fYXZh aWw7CgoJCQlpZiAodHhfYnVmZmVyLT5tX2hlYWQpIHsKCQkJCWlmcC0+aWZfb3BhY2tldHMrKzsK CQkJCWJ1c19kbWFtYXBfc3luYyh0eHItPnR4dGFnLAoJCQkJICAgIHR4X2J1ZmZlci0+bWFwLAoJ CQkJICAgIEJVU19ETUFTWU5DX1BPU1RXUklURSk7CgkJCQlidXNfZG1hbWFwX3VubG9hZCh0eHIt PnR4dGFnLAoJCQkJICAgIHR4X2J1ZmZlci0+bWFwKTsKCiAgICAgICAgICAgICAgICAgICAgICAg IAltX2ZyZWVtKHR4X2J1ZmZlci0+bV9oZWFkKTsKICAgICAgICAgICAgICAgICAgICAgICAgCXR4 X2J1ZmZlci0+bV9oZWFkID0gTlVMTDsKICAgICAgICAgICAgICAgIAl9CgkJCXR4X2J1ZmZlci0+ bmV4dF9lb3AgPSAtMTsKCQkJdHhyLT53YXRjaGRvZ190aW1lID0gdGlja3M7CgoJICAgICAgICAg ICAgICAgIGlmICgrK2ZpcnN0ID09IGFkYXB0ZXItPm51bV90eF9kZXNjKQoJCQkJZmlyc3QgPSAw OwoKCSAgICAgICAgICAgICAgICB0eF9idWZmZXIgPSAmdHhyLT50eF9idWZmZXJzW2ZpcnN0XTsK CQkJdHhfZGVzYyA9ICZ0eHItPnR4X2Jhc2VbZmlyc3RdOwoJCX0KCQkvKiBTZWUgaWYgd2UgY2Fu IGNvbnRpbnVlIHRvIHRoZSBuZXh0IHBhY2tldCAqLwoJCWxhc3QgPSB0eF9idWZmZXItPm5leHRf ZW9wOwoJCWlmIChsYXN0ICE9IC0xKSB7CiAgICAgICAgCQllb3BfZGVzYyA9ICZ0eHItPnR4X2Jh c2VbbGFzdF07CgkJCS8qIEdldCBuZXcgZG9uZSBwb2ludCAqLwoJCQlpZiAoKytsYXN0ID09IGFk YXB0ZXItPm51bV90eF9kZXNjKSBsYXN0ID0gMDsKCQkJZG9uZSA9IGxhc3Q7CgkJfSBlbHNlCgkJ CWJyZWFrOwogICAgICAgIH0KICAgICAgICBidXNfZG1hbWFwX3N5bmModHhyLT50eGRtYS5kbWFf dGFnLCB0eHItPnR4ZG1hLmRtYV9tYXAsCiAgICAgICAgICAgIEJVU19ETUFTWU5DX1BSRVJFQUQg fCBCVVNfRE1BU1lOQ19QUkVXUklURSk7CgogICAgICAgIHR4ci0+bmV4dF90b19jbGVhbiA9IGZp cnN0OwoKICAgICAgICAvKgogICAgICAgICAqIElmIHdlIGhhdmUgZW5vdWdoIHJvb20sIGNsZWFy IElGRl9EUlZfT0FDVElWRSB0bwogICAgICAgICAqIHRlbGwgdGhlIHN0YWNrIHRoYXQgaXQgaXMg T0sgdG8gc2VuZCBwYWNrZXRzLgogICAgICAgICAqIElmIHRoZXJlIGFyZSBubyBwZW5kaW5nIGRl c2NyaXB0b3JzLCBjbGVhciB0aGUgd2F0Y2hkb2cuCiAgICAgICAgICovCiAgICAgICAgaWYgKG51 bV9hdmFpbCA+IEVNX1RYX0NMRUFOVVBfVEhSRVNIT0xEKSB7ICAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgaWZwLT5pZl9kcnZfZmxhZ3MgJj0gfklGRl9EUlZfT0FDVElWRTsKICAgICAg ICAgICAgICAgIGlmIChudW1fYXZhaWwgPT0gYWRhcHRlci0+bnVtX3R4X2Rlc2MpIHsKCQkJdHhy LT53YXRjaGRvZ19jaGVjayA9IEZBTFNFOwogICAgICAgIAkJdHhyLT50eF9hdmFpbCA9IG51bV9h dmFpbDsKCQkJcmV0dXJuIChGQUxTRSk7CgkJfSAKICAgICAgICB9CgogICAgICAgIHR4ci0+dHhf YXZhaWwgPSBudW1fYXZhaWw7CglyZXR1cm4gKFRSVUUpOwp9CgoKLyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgog KiAgUmVmcmVzaCBSWCBkZXNjcmlwdG9yIG1idWZzIGZyb20gc3lzdGVtIG1idWYgYnVmZmVyIHBv b2wuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZAplbV9yZWZyZXNoX21idWZzKHN0cnVj dCByeF9yaW5nICpyeHIsIGludCBsaW1pdCkKewoJc3RydWN0IGFkYXB0ZXIJCSphZGFwdGVyID0g cnhyLT5hZGFwdGVyOwoJc3RydWN0IG1idWYJCSptOwoJYnVzX2RtYV9zZWdtZW50X3QJc2Vnc1sx XTsKCWJ1c19kbWFtYXBfdAkJbWFwOwoJc3RydWN0IGVtX2J1ZmZlcgkqcnhidWY7CglpbnQJCQlp LCBlcnJvciwgbnNlZ3MsIGNsZWFuZWQ7CgoJaSA9IHJ4ci0+bmV4dF90b19yZWZyZXNoOwoJY2xl YW5lZCA9IC0xOwoJd2hpbGUgKGkgIT0gbGltaXQpIHsKCQltID0gbV9nZXRjbChNX0RPTlRXQUlU LCBNVF9EQVRBLCBNX1BLVEhEUik7CgkJaWYgKG0gPT0gTlVMTCkKCQkJZ290byB1cGRhdGU7CgkJ bS0+bV9sZW4gPSBtLT5tX3BrdGhkci5sZW4gPSBNQ0xCWVRFUzsKCgkJaWYgKGFkYXB0ZXItPm1h eF9mcmFtZV9zaXplIDw9IChNQ0xCWVRFUyAtIEVUSEVSX0FMSUdOKSkKCQkJbV9hZGoobSwgRVRI RVJfQUxJR04pOwoKCQkvKgoJCSAqIFVzaW5nIG1lbW9yeSBmcm9tIHRoZSBtYnVmIGNsdXN0ZXIg cG9vbCwgaW52b2tlIHRoZQoJCSAqIGJ1c19kbWEgbWFjaGluZXJ5IHRvIGFycmFuZ2UgdGhlIG1l bW9yeSBtYXBwaW5nLgoJCSAqLwoJCWVycm9yID0gYnVzX2RtYW1hcF9sb2FkX21idWZfc2cocnhy LT5yeHRhZywgcnhyLT5yeF9zcGFyZW1hcCwKCQkgICAgbSwgc2VncywgJm5zZWdzLCBCVVNfRE1B X05PV0FJVCk7CgkJaWYgKGVycm9yICE9IDApIHsKCQkJbV9mcmVlKG0pOwoJCQlnb3RvIHVwZGF0 ZTsKCQl9CgoJCS8qIElmIG5zZWdzIGlzIHdyb25nIHRoZW4gdGhlIHN0YWNrIGlzIGNvcnJ1cHQu ICovCgkJS0FTU0VSVChuc2VncyA9PSAxLCAoIlRvbyBtYW55IHNlZ21lbnRzIHJldHVybmVkISIp KTsKCQoJCXJ4YnVmID0gJnJ4ci0+cnhfYnVmZmVyc1tpXTsKCQlpZiAocnhidWYtPm1faGVhZCAh PSBOVUxMKQoJCQlidXNfZG1hbWFwX3VubG9hZChyeHItPnJ4dGFnLCByeGJ1Zi0+bWFwKTsKCQoJ CW1hcCA9IHJ4YnVmLT5tYXA7CgkJcnhidWYtPm1hcCA9IHJ4ci0+cnhfc3BhcmVtYXA7CgkJcnhy LT5yeF9zcGFyZW1hcCA9IG1hcDsKCQlidXNfZG1hbWFwX3N5bmMocnhyLT5yeHRhZywKCQkgICAg cnhidWYtPm1hcCwgQlVTX0RNQVNZTkNfUFJFUkVBRCk7CgkJcnhidWYtPm1faGVhZCA9IG07CgkJ cnhyLT5yeF9iYXNlW2ldLmJ1ZmZlcl9hZGRyID0gaHRvbGU2NChzZWdzWzBdLmRzX2FkZHIpOwoK CQljbGVhbmVkID0gaTsKCQkvKiBDYWxjdWxhdGUgbmV4dCBpbmRleCAqLwoJCWlmICgrK2kgPT0g YWRhcHRlci0+bnVtX3J4X2Rlc2MpCgkJCWkgPSAwOwoJCS8qIFRoaXMgaXMgdGhlIHdvcmsgbWFy a2VyIGZvciByZWZyZXNoICovCgkJcnhyLT5uZXh0X3RvX3JlZnJlc2ggPSBpOwoJfQp1cGRhdGU6 CglidXNfZG1hbWFwX3N5bmMocnhyLT5yeGRtYS5kbWFfdGFnLCByeHItPnJ4ZG1hLmRtYV9tYXAs CgkgICAgQlVTX0RNQVNZTkNfUFJFUkVBRCB8IEJVU19ETUFTWU5DX1BSRVdSSVRFKTsKCWlmIChj bGVhbmVkICE9IC0xKSAvKiBVcGRhdGUgdGFpbCBpbmRleCAqLwoJCUUxMDAwX1dSSVRFX1JFRygm YWRhcHRlci0+aHcsCgkJICAgIEUxMDAwX1JEVChyeHItPm1lKSwgY2xlYW5lZCk7CgoJcmV0dXJu Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKgogKgogKiAgQWxsb2NhdGUgbWVtb3J5IGZvciByeF9idWZmZXIg c3RydWN0dXJlcy4gU2luY2Ugd2UgdXNlIG9uZQogKiAgcnhfYnVmZmVyIHBlciByZWNlaXZlZCBw YWNrZXQsIHRoZSBtYXhpbXVtIG51bWJlciBvZiByeF9idWZmZXIncwogKiAgdGhhdCB3ZSdsbCBu ZWVkIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycwogKiAgdGhh dCB3ZSd2ZSBhbGxvY2F0ZWQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CmVtX2FsbG9j YXRlX3JlY2VpdmVfYnVmZmVycyhzdHJ1Y3QgcnhfcmluZyAqcnhyKQp7CglzdHJ1Y3QgYWRhcHRl cgkJKmFkYXB0ZXIgPSByeHItPmFkYXB0ZXI7CglkZXZpY2VfdAkJZGV2ID0gYWRhcHRlci0+ZGV2 OwoJc3RydWN0IGVtX2J1ZmZlcgkqcnhidWY7CglpbnQJCQllcnJvcjsKCglyeHItPnJ4X2J1ZmZl cnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbV9idWZmZXIpICoKCSAgICBhZGFwdGVyLT5udW1f cnhfZGVzYywgTV9ERVZCVUYsIE1fTk9XQUlUIHwgTV9aRVJPKTsKCWlmIChyeHItPnJ4X2J1ZmZl cnMgPT0gTlVMTCkgewoJCWRldmljZV9wcmludGYoZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIHJ4 X2J1ZmZlciBtZW1vcnlcbiIpOwoJCXJldHVybiAoRU5PTUVNKTsKCX0KCgllcnJvciA9IGJ1c19k bWFfdGFnX2NyZWF0ZShidXNfZ2V0X2RtYV90YWcoZGV2KSwgLyogcGFyZW50ICovCgkJCQkxLCAw LAkJCS8qIGFsaWdubWVudCwgYm91bmRzICovCgkJCQlCVVNfU1BBQ0VfTUFYQUREUiwJLyogbG93 YWRkciAqLwoJCQkJQlVTX1NQQUNFX01BWEFERFIsCS8qIGhpZ2hhZGRyICovCgkJCQlOVUxMLCBO VUxMLAkJLyogZmlsdGVyLCBmaWx0ZXJhcmcgKi8KCQkJCU1DTEJZVEVTLAkJLyogbWF4c2l6ZSAq LwoJCQkJMSwJCQkvKiBuc2VnbWVudHMgKi8KCQkJCU1DTEJZVEVTLAkJLyogbWF4c2Vnc2l6ZSAq LwoJCQkJMCwJCQkvKiBmbGFncyAqLwoJCQkJTlVMTCwJCQkvKiBsb2NrZnVuYyAqLwoJCQkJTlVM TCwJCQkvKiBsb2NrYXJnICovCgkJCQkmcnhyLT5yeHRhZyk7CglpZiAoZXJyb3IpIHsKCQlkZXZp Y2VfcHJpbnRmKGRldiwgIiVzOiBidXNfZG1hX3RhZ19jcmVhdGUgZmFpbGVkICVkXG4iLAoJCSAg ICBfX2Z1bmNfXywgZXJyb3IpOwoJCWdvdG8gZmFpbDsKCX0KCgkvKiBDcmVhdGUgdGhlIHNwYXJl IG1hcCAodXNlZCBieSBnZXRidWYpICovCgllcnJvciA9IGJ1c19kbWFtYXBfY3JlYXRlKHJ4ci0+ cnh0YWcsIEJVU19ETUFfTk9XQUlULAoJICAgICAmcnhyLT5yeF9zcGFyZW1hcCk7CglpZiAoZXJy b3IpIHsKCQlkZXZpY2VfcHJpbnRmKGRldiwgIiVzOiBidXNfZG1hbWFwX2NyZWF0ZSBmYWlsZWQ6 ICVkXG4iLAoJCSAgICBfX2Z1bmNfXywgZXJyb3IpOwoJCWdvdG8gZmFpbDsKCX0KCglyeGJ1ZiA9 IHJ4ci0+cnhfYnVmZmVyczsKCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X2Rl c2M7IGkrKywgcnhidWYrKykgewoJCXJ4YnVmID0gJnJ4ci0+cnhfYnVmZmVyc1tpXTsKCQllcnJv ciA9IGJ1c19kbWFtYXBfY3JlYXRlKHJ4ci0+cnh0YWcsIEJVU19ETUFfTk9XQUlULAoJCSAgICAm cnhidWYtPm1hcCk7CgkJaWYgKGVycm9yKSB7CgkJCWRldmljZV9wcmludGYoZGV2LCAiJXM6IGJ1 c19kbWFtYXBfY3JlYXRlIGZhaWxlZDogJWRcbiIsCgkJCSAgICBfX2Z1bmNfXywgZXJyb3IpOwoJ CQlnb3RvIGZhaWw7CgkJfQoJfQoKCXJldHVybiAoMCk7CgpmYWlsOgoJZW1fZnJlZV9yZWNlaXZl X3N0cnVjdHVyZXMoYWRhcHRlcik7CglyZXR1cm4gKGVycm9yKTsKfQoKCi8qKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK ICoKICogIEluaXRpYWxpemUgYSByZWNlaXZlIHJpbmcgYW5kIGl0cyBidWZmZXJzLgogKgogKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8Kc3RhdGljIGludAplbV9zZXR1cF9yZWNlaXZlX3Jpbmcoc3RydWN0IHJ4X3Jp bmcgKnJ4cikKewoJc3RydWN0CWFkYXB0ZXIgCSphZGFwdGVyID0gcnhyLT5hZGFwdGVyOwoJc3Ry dWN0IGVtX2J1ZmZlcgkqcnhidWY7CglidXNfZG1hX3NlZ21lbnRfdAlzZWdbMV07CglpbnQJCQly c2l6ZSwgbnNlZ3MsIGVycm9yOwoKCgkvKiBDbGVhciB0aGUgcmluZyBjb250ZW50cyAqLwoJRU1f UlhfTE9DSyhyeHIpOwoJcnNpemUgPSByb3VuZHVwMihhZGFwdGVyLT5udW1fcnhfZGVzYyAqCgkg ICAgc2l6ZW9mKHN0cnVjdCBlMTAwMF9yeF9kZXNjKSwgRU1fREJBX0FMSUdOKTsKCWJ6ZXJvKCh2 b2lkICopcnhyLT5yeF9iYXNlLCByc2l6ZSk7CgoJLyoKCSoqIEZyZWUgY3VycmVudCBSWCBidWZm ZXIgc3RydWN0cyBhbmQgdGhlaXIgbWJ1ZnMKCSovCglmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0 ZXItPm51bV9yeF9kZXNjOyBpKyspIHsKCQlyeGJ1ZiA9ICZyeHItPnJ4X2J1ZmZlcnNbaV07CgkJ aWYgKHJ4YnVmLT5tX2hlYWQgIT0gTlVMTCkgewoJCQlidXNfZG1hbWFwX3N5bmMocnhyLT5yeHRh ZywgcnhidWYtPm1hcCwKCQkJICAgIEJVU19ETUFTWU5DX1BPU1RSRUFEKTsKCQkJYnVzX2RtYW1h cF91bmxvYWQocnhyLT5yeHRhZywgcnhidWYtPm1hcCk7CgkJCW1fZnJlZW0ocnhidWYtPm1faGVh ZCk7CgkJfQoJfQoKCS8qIE5vdyByZXBsZW5pc2ggdGhlIG1idWZzICovCglmb3IgKGludCBqID0g MDsgaiAhPSBhZGFwdGVyLT5udW1fcnhfZGVzYzsgKytqKSB7CgoJCXJ4YnVmID0gJnJ4ci0+cnhf YnVmZmVyc1tqXTsKCQlyeGJ1Zi0+bV9oZWFkID0gbV9nZXRjbChNX0RPTlRXQUlULCBNVF9EQVRB LCBNX1BLVEhEUik7CgkJaWYgKHJ4YnVmLT5tX2hlYWQgPT0gTlVMTCkKCQkJcGFuaWMoIlJYIHJp bmcgaGRyIGluaXRpYWxpemF0aW9uIGZhaWxlZCFcbiIpOwoJCXJ4YnVmLT5tX2hlYWQtPm1fbGVu ID0gTUNMQllURVM7CgkJcnhidWYtPm1faGVhZC0+bV9mbGFncyAmPSB+TV9IQVNGQ1M7IC8qIHdl IHN0cmlwIGl0ICovCgkJcnhidWYtPm1faGVhZC0+bV9wa3RoZHIubGVuID0gTUNMQllURVM7CgoJ CS8qIEdldCB0aGUgbWVtb3J5IG1hcHBpbmcgKi8KCQllcnJvciA9IGJ1c19kbWFtYXBfbG9hZF9t YnVmX3NnKHJ4ci0+cnh0YWcsCgkJICAgIHJ4YnVmLT5tYXAsIHJ4YnVmLT5tX2hlYWQsIHNlZywK CQkgICAgJm5zZWdzLCBCVVNfRE1BX05PV0FJVCk7CgkJaWYgKGVycm9yICE9IDApCgkJCXBhbmlj KCJSWCByaW5nIGRtYSBpbml0aWFsaXphdGlvbiBmYWlsZWQhXG4iKTsKCQlidXNfZG1hbWFwX3N5 bmMocnhyLT5yeHRhZywKCQkgICAgcnhidWYtPm1hcCwgQlVTX0RNQVNZTkNfUFJFUkVBRCk7CgoJ CS8qIFVwZGF0ZSBkZXNjcmlwdG9yICovCgkJcnhyLT5yeF9iYXNlW2pdLmJ1ZmZlcl9hZGRyID0g aHRvbGU2NChzZWdbMF0uZHNfYWRkcik7Cgl9CgoKCS8qIFNldHVwIG91ciBkZXNjcmlwdG9yIGlu ZGljZXMgKi8KCXJ4ci0+bmV4dF90b19jaGVjayA9IDA7CglyeHItPm5leHRfdG9fcmVmcmVzaCA9 IDA7CgoJYnVzX2RtYW1hcF9zeW5jKHJ4ci0+cnhkbWEuZG1hX3RhZywgcnhyLT5yeGRtYS5kbWFf bWFwLAoJICAgIEJVU19ETUFTWU5DX1BSRVJFQUQgfCBCVVNfRE1BU1lOQ19QUkVXUklURSk7CgoJ RU1fUlhfVU5MT0NLKHJ4cik7CglyZXR1cm4gKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBJ bml0aWFsaXplIGFsbCByZWNlaXZlIHJpbmdzLgogKgogKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGlu dAplbV9zZXR1cF9yZWNlaXZlX3N0cnVjdHVyZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsK CXN0cnVjdCByeF9yaW5nICpyeHIgPSBhZGFwdGVyLT5yeF9yaW5nczsKCWludCBqOwoKCWZvciAo aiA9IDA7IGogPCBhZGFwdGVyLT5udW1fcXVldWVzOyBqKyssIHJ4cisrKQoJCWlmIChlbV9zZXR1 cF9yZWNlaXZlX3JpbmcocnhyKSkKCQkJZ290byBmYWlsOwoKCXJldHVybiAoMCk7CmZhaWw6Cgkv KgoJICogRnJlZSBSWCBidWZmZXJzIGFsbG9jYXRlZCBzbyBmYXIsIHdlIHdpbGwgb25seSBoYW5k bGUKCSAqIHRoZSByaW5ncyB0aGF0IGNvbXBsZXRlZCwgdGhlIGZhaWxpbmcgY2FzZSB3aWxsIGhh dmUKCSAqIGNsZWFuZWQgdXAgZm9yIGl0c2VsZi4gJ2onIGZhaWxlZCwgc28gaXRzIHRoZSB0ZXJt aW51cy4KCSAqLwoJZm9yIChpbnQgaSA9IDA7IGkgPCBqOyArK2kpIHsKCQlyeHIgPSAmYWRhcHRl ci0+cnhfcmluZ3NbaV07CgkJZm9yIChpbnQgbiA9IDA7IG4gPCBhZGFwdGVyLT5udW1fcnhfZGVz YzsgbisrKSB7CgkJCXN0cnVjdCBlbV9idWZmZXIgKnJ4YnVmOwoJCQlyeGJ1ZiA9ICZyeHItPnJ4 X2J1ZmZlcnNbbl07CgkJCWlmIChyeGJ1Zi0+bV9oZWFkICE9IE5VTEwpIHsKCQkJCWJ1c19kbWFt YXBfc3luYyhyeHItPnJ4dGFnLCByeGJ1Zi0+bWFwLAoJCQkgIAkgIEJVU19ETUFTWU5DX1BPU1RS RUFEKTsKCQkJCWJ1c19kbWFtYXBfdW5sb2FkKHJ4ci0+cnh0YWcsIHJ4YnVmLT5tYXApOwoJCQkJ bV9mcmVlbShyeGJ1Zi0+bV9oZWFkKTsKCQkJCXJ4YnVmLT5tX2hlYWQgPSBOVUxMOwoJCQl9CgkJ fQoJfQoKCXJldHVybiAoRU5PQlVGUyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIEZyZWUgYWxs IHJlY2VpdmUgcmluZ3MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZAplbV9mcmVlX3Jl Y2VpdmVfc3RydWN0dXJlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJc3RydWN0IHJ4X3Jp bmcgKnJ4ciA9IGFkYXB0ZXItPnJ4X3JpbmdzOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRl ci0+bnVtX3F1ZXVlczsgaSsrLCByeHIrKykgewoJCWVtX2ZyZWVfcmVjZWl2ZV9idWZmZXJzKHJ4 cik7CgkJLyogRnJlZSB0aGUgcmluZyBtZW1vcnkgYXMgd2VsbCAqLwoJCWVtX2RtYV9mcmVlKGFk YXB0ZXIsICZyeHItPnJ4ZG1hKTsKCQlFTV9SWF9MT0NLX0RFU1RST1kocnhyKTsKCX0KCglmcmVl KGFkYXB0ZXItPnJ4X3JpbmdzLCBNX0RFVkJVRik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBG cmVlIHJlY2VpdmUgcmluZyBkYXRhIHN0cnVjdHVyZXMKICoKICoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRp YyB2b2lkCmVtX2ZyZWVfcmVjZWl2ZV9idWZmZXJzKHN0cnVjdCByeF9yaW5nICpyeHIpCnsKCXN0 cnVjdCBhZGFwdGVyCQkqYWRhcHRlciA9IHJ4ci0+YWRhcHRlcjsKCXN0cnVjdCBlbV9idWZmZXIJ KnJ4YnVmID0gTlVMTDsKCglJTklUX0RFQlVHT1VUKCJmcmVlX3JlY2VpdmVfYnVmZmVyczogYmVn aW4iKTsKCglpZiAocnhyLT5yeF9zcGFyZW1hcCkgewoJCWJ1c19kbWFtYXBfZGVzdHJveShyeHIt PnJ4dGFnLCByeHItPnJ4X3NwYXJlbWFwKTsKCQlyeHItPnJ4X3NwYXJlbWFwID0gTlVMTDsKCX0K CglpZiAocnhyLT5yeF9idWZmZXJzICE9IE5VTEwpIHsKCQlmb3IgKGludCBpID0gMDsgaSA8IGFk YXB0ZXItPm51bV9yeF9kZXNjOyBpKyspIHsKCQkJcnhidWYgPSAmcnhyLT5yeF9idWZmZXJzW2ld OwoJCQlpZiAocnhidWYtPm1hcCAhPSBOVUxMKSB7CgkJCQlidXNfZG1hbWFwX3N5bmMocnhyLT5y eHRhZywgcnhidWYtPm1hcCwKCQkJCSAgICBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7CgkJCQlidXNf ZG1hbWFwX3VubG9hZChyeHItPnJ4dGFnLCByeGJ1Zi0+bWFwKTsKCQkJCWJ1c19kbWFtYXBfZGVz dHJveShyeHItPnJ4dGFnLCByeGJ1Zi0+bWFwKTsKCQkJfQoJCQlpZiAocnhidWYtPm1faGVhZCAh PSBOVUxMKSB7CgkJCQltX2ZyZWVtKHJ4YnVmLT5tX2hlYWQpOwoJCQkJcnhidWYtPm1faGVhZCA9 IE5VTEw7CgkJCX0KCQl9CgkJZnJlZShyeHItPnJ4X2J1ZmZlcnMsIE1fREVWQlVGKTsKCQlyeHIt PnJ4X2J1ZmZlcnMgPSBOVUxMOwoJfQoKCWlmIChyeHItPnJ4dGFnICE9IE5VTEwpIHsKCQlidXNf ZG1hX3RhZ19kZXN0cm95KHJ4ci0+cnh0YWcpOwoJCXJ4ci0+cnh0YWcgPSBOVUxMOwoJfQoKCXJl dHVybjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKICoKICogIEVuYWJsZSByZWNlaXZlIHVuaXQuCiAqCiAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqLwojZGVmaW5lIE1BWF9JTlRTX1BFUl9TRUMJODAwMAojZGVmaW5lIERFRkFV TFRfSVRSCSAgICAgMTAwMDAwMDAwMC8oTUFYX0lOVFNfUEVSX1NFQyAqIDI1NikKCnN0YXRpYyB2 b2lkCmVtX2luaXRpYWxpemVfcmVjZWl2ZV91bml0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7 CglzdHJ1Y3QgcnhfcmluZwkqcnhyID0gYWRhcHRlci0+cnhfcmluZ3M7CglzdHJ1Y3QgaWZuZXQJ KmlmcCA9IGFkYXB0ZXItPmlmcDsKCXN0cnVjdCBlMTAwMF9odwkqaHcgPSAmYWRhcHRlci0+aHc7 Cgl1NjQJYnVzX2FkZHI7Cgl1MzIJcmN0bCwgcnhjc3VtOwoKCUlOSVRfREVCVUdPVVQoImVtX2lu aXRpYWxpemVfcmVjZWl2ZV91bml0czogYmVnaW4iKTsKCgkvKgoJICogTWFrZSBzdXJlIHJlY2Vp dmVzIGFyZSBkaXNhYmxlZCB3aGlsZSBzZXR0aW5nCgkgKiB1cCB0aGUgZGVzY3JpcHRvciByaW5n CgkgKi8KCXJjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgRTEwMDBfUkNUTCk7CglFMTAwMF9XUklU RV9SRUcoaHcsIEUxMDAwX1JDVEwsIHJjdGwgJiB+RTEwMDBfUkNUTF9FTik7CgoJRTEwMDBfV1JJ VEVfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfUkFEViwKCSAgICBhZGFwdGVyLT5yeF9hYnNfaW50 X2RlbGF5LnZhbHVlKTsKCS8qCgkgKiBTZXQgdGhlIGludGVycnVwdCB0aHJvdHRsaW5nIHJhdGUu IFZhbHVlIGlzIGNhbGN1bGF0ZWQKCSAqIGFzIERFRkFVTFRfSVRSID0gMS8oTUFYX0lOVFNfUEVS X1NFQyAqIDI1Nm5zKQoJICovCglFMTAwMF9XUklURV9SRUcoaHcsIEUxMDAwX0lUUiwgREVGQVVM VF9JVFIpOwoKCS8qCgkqKiBXaGVuIHVzaW5nIE1TSVggaW50ZXJydXB0cyB3ZSBuZWVkIHRvIHRo cm90dGxlCgkqKiB1c2luZyB0aGUgRUlUUiByZWdpc3RlciAoODI1NzQgb25seSkKCSovCglpZiAo aHctPm1hYy50eXBlID09IGUxMDAwXzgyNTc0KQoJCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsr KQoJCQlFMTAwMF9XUklURV9SRUcoaHcsIEUxMDAwX0VJVFJfODI1NzQoaSksCgkJCSAgICBERUZB VUxUX0lUUik7CgoJLyogRGlzYWJsZSBhY2NlbGVyYXRlZCBhY2trbm93bGVkZ2UgKi8KCWlmIChh ZGFwdGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF84MjU3NCkKCQlFMTAwMF9XUklURV9SRUcoaHcs IEUxMDAwX1JGQ1RMLCBFMTAwMF9SRkNUTF9BQ0tfRElTKTsKCglpZiAoaWZwLT5pZl9jYXBlbmFi bGUgJiBJRkNBUF9SWENTVU0pIHsKCQlyeGNzdW0gPSBFMTAwMF9SRUFEX1JFRyhodywgRTEwMDBf UlhDU1VNKTsKCQlyeGNzdW0gfD0gKEUxMDAwX1JYQ1NVTV9JUE9GTCB8IEUxMDAwX1JYQ1NVTV9U VU9GTCk7CgkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFMTAwMF9SWENTVU0sIHJ4Y3N1bSk7Cgl9CgoJ LyoKCSoqIFhYWCBURU1QT1JBUlkgV09SS0FST1VORDogb24gc29tZSBzeXN0ZW1zIHdpdGggODI1 NzMKCSoqIGxvbmcgbGF0ZW5jaWVzIGFyZSBvYnNlcnZlZCwgbGlrZSBMZW5vdm8gWDYwLiBUaGlz CgkqKiBjaGFuZ2UgZWxpbWluYXRlcyB0aGUgcHJvYmxlbSwgYnV0IHNpbmNlIGhhdmluZyBwb3Np dGl2ZQoJKiogdmFsdWVzIGluIFJEVFIgaXMgYSBrbm93biBzb3VyY2Ugb2YgcHJvYmxlbXMgb24g b3RoZXIKCSoqIHBsYXRmb3JtcyBhbm90aGVyIHNvbHV0aW9uIGlzIGJlaW5nIHNvdWdodC4KCSov CglpZiAoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTczKQoJCUUxMDAwX1dSSVRFX1JFRyhodywg RTEwMDBfUkRUUiwgMHgyMCk7CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVl dWVzOyBpKyssIHJ4cisrKSB7CgkJLyogU2V0dXAgdGhlIEJhc2UgYW5kIExlbmd0aCBvZiB0aGUg UnggRGVzY3JpcHRvciBSaW5nICovCgkJYnVzX2FkZHIgPSByeHItPnJ4ZG1hLmRtYV9wYWRkcjsK CQlFMTAwMF9XUklURV9SRUcoaHcsIEUxMDAwX1JETEVOKGkpLAoJCSAgICBhZGFwdGVyLT5udW1f cnhfZGVzYyAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfZGVzYykpOwoJCUUxMDAwX1dSSVRFX1JF RyhodywgRTEwMDBfUkRCQUgoaSksICh1MzIpKGJ1c19hZGRyID4+IDMyKSk7CgkJRTEwMDBfV1JJ VEVfUkVHKGh3LCBFMTAwMF9SREJBTChpKSwgKHUzMilidXNfYWRkcik7CgkJLyogU2V0dXAgdGhl IEhlYWQgYW5kIFRhaWwgRGVzY3JpcHRvciBQb2ludGVycyAqLwoJCUUxMDAwX1dSSVRFX1JFRyho dywgRTEwMDBfUkRIKGkpLCAwKTsKCQlFMTAwMF9XUklURV9SRUcoaHcsIEUxMDAwX1JEVChpKSwg YWRhcHRlci0+bnVtX3J4X2Rlc2MgLSAxKTsKCX0KCgkvKiBTZXR1cCB0aGUgUmVjZWl2ZSBDb250 cm9sIFJlZ2lzdGVyICovCglyY3RsICY9IH4oMyA8PCBFMTAwMF9SQ1RMX01PX1NISUZUKTsKCXJj dGwgfD0gRTEwMDBfUkNUTF9FTiB8IEUxMDAwX1JDVExfQkFNIHwKCSAgICBFMTAwMF9SQ1RMX0xC TV9OTyB8IEUxMDAwX1JDVExfUkRNVFNfSEFMRiB8CgkgICAgKGh3LT5tYWMubWNfZmlsdGVyX3R5 cGUgPDwgRTEwMDBfUkNUTF9NT19TSElGVCk7CgogICAgICAgIC8qIFN0cmlwIHRoZSBDUkMgKi8K ICAgICAgICByY3RsIHw9IEUxMDAwX1JDVExfU0VDUkM7CgogICAgICAgIC8qIE1ha2Ugc3VyZSBW TEFOIEZpbHRlcnMgYXJlIG9mZiAqLwogICAgICAgIHJjdGwgJj0gfkUxMDAwX1JDVExfVkZFOwoJ cmN0bCAmPSB+RTEwMDBfUkNUTF9TQlA7CglyY3RsIHw9IEUxMDAwX1JDVExfU1pfMjA0ODsKCWlm IChpZnAtPmlmX210dSA+IEVUSEVSTVRVKQoJCXJjdGwgfD0gRTEwMDBfUkNUTF9MUEU7CgllbHNl CgkJcmN0bCAmPSB+RTEwMDBfUkNUTF9MUEU7CgoJLyogV3JpdGUgb3V0IHRoZSBzZXR0aW5ncyAq LwoJRTEwMDBfV1JJVEVfUkVHKGh3LCBFMTAwMF9SQ1RMLCByY3RsKTsKCglyZXR1cm47Cn0KCgov KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqCiAqCiAqICBUaGlzIHJvdXRpbmUgZXhlY3V0ZXMgaW4gaW50ZXJydXB0IGNv bnRleHQuIEl0IHJlcGxlbmlzaGVzCiAqICB0aGUgbWJ1ZnMgaW4gdGhlIGRlc2NyaXB0b3IgYW5k IHNlbmRzIGRhdGEgd2hpY2ggaGFzIGJlZW4KICogIGRtYSdlZCBpbnRvIGhvc3QgbWVtb3J5IHRv IHVwcGVyIGxheWVyLgogKgogKiAgV2UgbG9vcCBhdCBtb3N0IGNvdW50IHRpbWVzIGlmIGNvdW50 IGlzID4gMCwgb3IgdW50aWwgZG9uZSBpZgogKiAgY291bnQgPCAwLgogKiAgCiAqICBGb3IgcG9s bGluZyB3ZSBhbHNvIG5vdyByZXR1cm4gdGhlIG51bWJlciBvZiBjbGVhbmVkIHBhY2tldHMKICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8Kc3RhdGljIGJvb2wKZW1fcnhlb2Yoc3RydWN0IHJ4X3JpbmcgKnJ4ciwgaW50 IGNvdW50LCBpbnQgKmRvbmUpCnsKCXN0cnVjdCBhZGFwdGVyCQkqYWRhcHRlciA9IHJ4ci0+YWRh cHRlcjsKCXN0cnVjdCBpZm5ldAkJKmlmcCA9IGFkYXB0ZXItPmlmcDsKCXN0cnVjdCBtYnVmCQkq bXAsICpzZW5kbXA7Cgl1OAkJCXN0YXR1cyA9IDA7Cgl1MTYgCQkJbGVuOwoJaW50CQkJaSwgcHJv Y2Vzc2VkLCByeGRvbmUgPSAwOwoJYm9vbAkJCWVvcDsKCXN0cnVjdCBlMTAwMF9yeF9kZXNjCSpj dXI7CgoJRU1fUlhfTE9DSyhyeHIpOwoKCWZvciAoaSA9IHJ4ci0+bmV4dF90b19jaGVjaywgcHJv Y2Vzc2VkID0gMDsgY291bnQgIT0gMDspIHsKCgkJaWYgKChpZnAtPmlmX2Rydl9mbGFncyAmIElG Rl9EUlZfUlVOTklORykgPT0gMCkKCQkJYnJlYWs7CgoJCWJ1c19kbWFtYXBfc3luYyhyeHItPnJ4 ZG1hLmRtYV90YWcsIHJ4ci0+cnhkbWEuZG1hX21hcCwKCQkgICAgQlVTX0RNQVNZTkNfUE9TVFJF QUQgfCBCVVNfRE1BU1lOQ19QT1NUV1JJVEUpOwoKCQljdXIgPSAmcnhyLT5yeF9iYXNlW2ldOwoJ CXN0YXR1cyA9IGN1ci0+c3RhdHVzOwoJCW1wID0gc2VuZG1wID0gTlVMTDsKCgkJaWYgKChzdGF0 dXMgJiBFMTAwMF9SWERfU1RBVF9ERCkgPT0gMCkKCQkJYnJlYWs7CgoJCWxlbiA9IGxlMTZ0b2go Y3VyLT5sZW5ndGgpOwoJCWVvcCA9IChzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9FT1ApICE9IDA7 CgkJY291bnQtLTsKCgkJaWYgKChjdXItPmVycm9ycyAmIEUxMDAwX1JYRF9FUlJfRlJBTUVfRVJS X01BU0spID09IDApIHsKCgkJCS8qIEFzc2lnbiBjb3JyZWN0IGxlbmd0aCB0byB0aGUgY3VycmVu dCBmcmFnbWVudCAqLwoJCQltcCA9IHJ4ci0+cnhfYnVmZmVyc1tpXS5tX2hlYWQ7CgkJCW1wLT5t X2xlbiA9IGxlbjsKCgkJCWlmIChyeHItPmZtcCA9PSBOVUxMKSB7CgkJCQltcC0+bV9wa3RoZHIu bGVuID0gbGVuOwoJCQkJcnhyLT5mbXAgPSBtcDsgLyogU3RvcmUgdGhlIGZpcnN0IG1idWYgKi8K CQkJCXJ4ci0+bG1wID0gbXA7CgkJCX0gZWxzZSB7CgkJCQkvKiBDaGFpbiBtYnVmJ3MgdG9nZXRo ZXIgKi8KCQkJCW1wLT5tX2ZsYWdzICY9IH5NX1BLVEhEUjsKCQkJCXJ4ci0+bG1wLT5tX25leHQg PSBtcDsKCQkJCXJ4ci0+bG1wID0gcnhyLT5sbXAtPm1fbmV4dDsKCQkJCXJ4ci0+Zm1wLT5tX3Br dGhkci5sZW4gKz0gbGVuOwoJCQl9CgoJCQlpZiAoZW9wKSB7CgkJCQlyeHItPmZtcC0+bV9wa3Ro ZHIucmN2aWYgPSBpZnA7CgkJCQlpZnAtPmlmX2lwYWNrZXRzKys7CgkJCQllbV9yZWNlaXZlX2No ZWNrc3VtKGN1ciwgcnhyLT5mbXApOwojaWZuZGVmIF9fTk9fU1RSSUNUX0FMSUdOTUVOVAoJCQkJ aWYgKGFkYXB0ZXItPm1heF9mcmFtZV9zaXplID4KCQkJCSAgICAoTUNMQllURVMgLSBFVEhFUl9B TElHTikgJiYKCQkJCSAgICBlbV9maXh1cF9yeChyeHIpICE9IDApCgkJCQkJZ290byBza2lwOwoj ZW5kaWYKCQkJCWlmIChzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9WUCkgewoJCQkJCXJ4ci0+Zm1w LT5tX3BrdGhkci5ldGhlcl92dGFnID0KCQkJCQkgICAgKGxlMTZ0b2goY3VyLT5zcGVjaWFsKSAm CgkJCQkJICAgIEUxMDAwX1JYRF9TUENfVkxBTl9NQVNLKTsKCQkJCQlyeHItPmZtcC0+bV9mbGFn cyB8PSBNX1ZMQU5UQUc7CgkJCQl9CiNpZmRlZiBFTV9NVUxUSVFVRVVFCgkJCQlyeHItPmZtcC0+ bV9wa3RoZHIuZmxvd2lkID0gY3VyY3B1OwoJCQkJcnhyLT5mbXAtPm1fZmxhZ3MgfD0gTV9GTE9X SUQ7CiNlbmRpZgojaWZuZGVmIF9fTk9fU1RSSUNUX0FMSUdOTUVOVApza2lwOgojZW5kaWYKCQkJ CXNlbmRtcCA9IHJ4ci0+Zm1wOwoJCQkJcnhyLT5mbXAgPSBOVUxMOwoJCQkJcnhyLT5sbXAgPSBO VUxMOwoJCQl9CgkJfSBlbHNlIHsKCQkJaWZwLT5pZl9pZXJyb3JzKys7CgkJCS8qIFJldXNlIGxv YWRlZCBETUEgbWFwIGFuZCBqdXN0IHVwZGF0ZSBtYnVmIGNoYWluICovCgkJCW1wID0gcnhyLT5y eF9idWZmZXJzW2ldLm1faGVhZDsKCQkJbXAtPm1fbGVuID0gbXAtPm1fcGt0aGRyLmxlbiA9IE1D TEJZVEVTOwoJCQltcC0+bV9kYXRhID0gbXAtPm1fZXh0LmV4dF9idWY7CgkJCW1wLT5tX25leHQg PSBOVUxMOwoJCQlpZiAoYWRhcHRlci0+bWF4X2ZyYW1lX3NpemUgPD0KCQkJICAgIChNQ0xCWVRF UyAtIEVUSEVSX0FMSUdOKSkKCQkJCW1fYWRqKG1wLCBFVEhFUl9BTElHTik7CgkJCWlmIChyeHIt PmZtcCAhPSBOVUxMKSB7CgkJCQltX2ZyZWVtKHJ4ci0+Zm1wKTsKCQkJCXJ4ci0+Zm1wID0gTlVM TDsKCQkJCXJ4ci0+bG1wID0gTlVMTDsKCQkJfQoJCQlzZW5kbXAgPSBOVUxMOwoJCX0KCgkJLyog WmVybyBvdXQgdGhlIHJlY2VpdmUgZGVzY3JpcHRvcnMgc3RhdHVzLiAqLwoJCWN1ci0+c3RhdHVz ID0gMDsKCQkrK3J4ZG9uZTsJLyogY3VtdWxhdGl2ZSBmb3IgUE9MTCAqLwoJCSsrcHJvY2Vzc2Vk OwoKCQkvKiBBZHZhbmNlIG91ciBwb2ludGVycyB0byB0aGUgbmV4dCBkZXNjcmlwdG9yLiAqLwoJ CWlmICgrK2kgPT0gYWRhcHRlci0+bnVtX3J4X2Rlc2MpCgkJCWkgPSAwOwoKCQkvKiBTZW5kIHRv IHRoZSBzdGFjayAqLwoJCWlmIChzZW5kbXAgIT0gTlVMTCkgewoJCQlyeHItPm5leHRfdG9fY2hl Y2sgPSBpOwoJCQlFTV9SWF9VTkxPQ0socnhyKTsKCQkJKCppZnAtPmlmX2lucHV0KShpZnAsIHNl bmRtcCk7CgkJCUVNX1JYX0xPQ0socnhyKTsKCQkJaSA9IHJ4ci0+bmV4dF90b19jaGVjazsKCQl9 CgoJCS8qIE9ubHkgcmVmcmVzaCBtYnVmcyBldmVyeSA4IGRlc2NyaXB0b3JzICovCgkJaWYgKHBy b2Nlc3NlZCA9PSA4KSB7CgkJCWVtX3JlZnJlc2hfbWJ1ZnMocnhyLCBpKTsKCQkJcHJvY2Vzc2Vk ID0gMDsKCQl9Cgl9CgoJLyogQ2F0Y2ggYW55IHJlbWFpbmluZyByZWZyZXNoIHdvcmsgKi8KCWlm IChwcm9jZXNzZWQgIT0gMCkgewoJCWVtX3JlZnJlc2hfbWJ1ZnMocnhyLCBpKTsKCQlwcm9jZXNz ZWQgPSAwOwoJfQoKCXJ4ci0+bmV4dF90b19jaGVjayA9IGk7CglpZiAoZG9uZSAhPSBOVUxMKQoJ CSpkb25lID0gcnhkb25lOwoJRU1fUlhfVU5MT0NLKHJ4cik7CgoJcmV0dXJuICgoc3RhdHVzICYg RTEwMDBfUlhEX1NUQVRfREQpID8gVFJVRSA6IEZBTFNFKTsKfQoKI2lmbmRlZiBfX05PX1NUUklD VF9BTElHTk1FTlQKLyoKICogV2hlbiBqdW1ibyBmcmFtZXMgYXJlIGVuYWJsZWQgd2Ugc2hvdWxk IHJlYWxpZ24gZW50aXJlIHBheWxvYWQgb24KICogYXJjaGl0ZWN1cmVzIHdpdGggc3RyaWN0IGFs aWdubWVudC4gVGhpcyBpcyBzZXJpb3VzIGRlc2lnbiBtaXN0YWtlIG9mIDgyNTR4CiAqIGFzIGl0 IG51bGxpZmllcyBETUEgb3BlcmF0aW9ucy4gODI1NHgganVzdCBhbGxvd3MgUlggYnVmZmVyIHNp emUgdG8gYmUKICogMjA0OC80MDk2LzgxOTIvMTYzODQuIFdoYXQgd2UgcmVhbGx5IHdhbnQgaXMg MjA0OCAtIEVUSEVSX0FMSUdOIHRvIGFsaWduIGl0cwogKiBwYXlsb2FkLiBPbiBhcmNoaXRlY3Vy ZXMgd2l0aG91dCBzdHJpY3QgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyA4MjU0eCBzdGlsbAogKiBw ZXJmb3JtcyB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyB3aGljaCB3b3VsZCByZWR1Y2UgdGhlIHBl cmZvcm1hbmNlIHRvby4KICogVG8gYXZvaWQgY29weWluZyBvdmVyIGFuIGVudGlyZSBmcmFtZSB0 byBhbGlnbiwgd2UgYWxsb2NhdGUgYSBuZXcgbWJ1ZiBhbmQKICogY29weSBldGhlcm5ldCBoZWFk ZXIgdG8gdGhlIG5ldyBtYnVmLiBUaGUgbmV3IG1idWYgaXMgcHJlcGVuZGVkIGludG8gdGhlCiAq IGV4aXN0aW5nIG1idWYgY2hhaW4uCiAqCiAqIEJlIGF3YXJlLCBiZXN0IHBlcmZvcm1hbmNlIG9m IHRoZSA4MjU0eCBpcyBhY2hpdmVkIG9ubHkgd2hlbiBqdW1ibyBmcmFtZSBpcwogKiBub3QgdXNl ZCBhdCBhbGwgb24gYXJjaGl0ZWN0dXJlcyB3aXRoIHN0cmljdCBhbGlnbm1lbnQuCiAqLwpzdGF0 aWMgaW50CmVtX2ZpeHVwX3J4KHN0cnVjdCByeF9yaW5nICpyeHIpCnsKCXN0cnVjdCBhZGFwdGVy ICphZGFwdGVyID0gcnhyLT5hZGFwdGVyOwoJc3RydWN0IG1idWYgKm0sICpuOwoJaW50IGVycm9y OwoKCWVycm9yID0gMDsKCW0gPSByeHItPmZtcDsKCWlmIChtLT5tX2xlbiA8PSAoTUNMQllURVMg LSBFVEhFUl9IRFJfTEVOKSkgewoJCWJjb3B5KG0tPm1fZGF0YSwgbS0+bV9kYXRhICsgRVRIRVJf SERSX0xFTiwgbS0+bV9sZW4pOwoJCW0tPm1fZGF0YSArPSBFVEhFUl9IRFJfTEVOOwoJfSBlbHNl IHsKCQlNR0VUSERSKG4sIE1fRE9OVFdBSVQsIE1UX0RBVEEpOwoJCWlmIChuICE9IE5VTEwpIHsK CQkJYmNvcHkobS0+bV9kYXRhLCBuLT5tX2RhdGEsIEVUSEVSX0hEUl9MRU4pOwoJCQltLT5tX2Rh dGEgKz0gRVRIRVJfSERSX0xFTjsKCQkJbS0+bV9sZW4gLT0gRVRIRVJfSERSX0xFTjsKCQkJbi0+ bV9sZW4gPSBFVEhFUl9IRFJfTEVOOwoJCQlNX01PVkVfUEtUSERSKG4sIG0pOwoJCQluLT5tX25l eHQgPSBtOwoJCQlyeHItPmZtcCA9IG47CgkJfSBlbHNlIHsKCQkJYWRhcHRlci0+ZHJvcHBlZF9w a3RzKys7CgkJCW1fZnJlZW0ocnhyLT5mbXApOwoJCQlyeHItPmZtcCA9IE5VTEw7CgkJCWVycm9y ID0gRU5PTUVNOwoJCX0KCX0KCglyZXR1cm4gKGVycm9yKTsKfQojZW5kaWYKCi8qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioKICoKICogIFZlcmlmeSB0aGF0IHRoZSBoYXJkd2FyZSBpbmRpY2F0ZWQgdGhhdCB0aGUgY2hl Y2tzdW0gaXMgdmFsaWQuCiAqICBJbmZvcm0gdGhlIHN0YWNrIGFib3V0IHRoZSBzdGF0dXMgb2Yg Y2hlY2tzdW0gc28gdGhhdCBzdGFjawogKiAgZG9lc24ndCBzcGVuZCB0aW1lIHZlcmlmeWluZyB0 aGUgY2hlY2tzdW0uCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmVtX3JlY2VpdmVfY2hl Y2tzdW0oc3RydWN0IGUxMDAwX3J4X2Rlc2MgKnJ4X2Rlc2MsIHN0cnVjdCBtYnVmICptcCkKewoJ LyogSWdub3JlIENoZWNrc3VtIGJpdCBpcyBzZXQgKi8KCWlmIChyeF9kZXNjLT5zdGF0dXMgJiBF MTAwMF9SWERfU1RBVF9JWFNNKSB7CgkJbXAtPm1fcGt0aGRyLmNzdW1fZmxhZ3MgPSAwOwoJCXJl dHVybjsKCX0KCglpZiAocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfSVBDUykgewoJ CS8qIERpZCBpdCBwYXNzPyAqLwoJCWlmICghKHJ4X2Rlc2MtPmVycm9ycyAmIEUxMDAwX1JYRF9F UlJfSVBFKSkgewoJCQkvKiBJUCBDaGVja3N1bSBHb29kICovCgkJCW1wLT5tX3BrdGhkci5jc3Vt X2ZsYWdzID0gQ1NVTV9JUF9DSEVDS0VEOwoJCQltcC0+bV9wa3RoZHIuY3N1bV9mbGFncyB8PSBD U1VNX0lQX1ZBTElEOwoKCQl9IGVsc2UgewoJCQltcC0+bV9wa3RoZHIuY3N1bV9mbGFncyA9IDA7 CgkJfQoJfQoKCWlmIChyeF9kZXNjLT5zdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9UQ1BDUykgewoJ CS8qIERpZCBpdCBwYXNzPyAqLwoJCWlmICghKHJ4X2Rlc2MtPmVycm9ycyAmIEUxMDAwX1JYRF9F UlJfVENQRSkpIHsKCQkJbXAtPm1fcGt0aGRyLmNzdW1fZmxhZ3MgfD0KCQkJKENTVU1fREFUQV9W QUxJRCB8IENTVU1fUFNFVURPX0hEUik7CgkJCW1wLT5tX3BrdGhkci5jc3VtX2RhdGEgPSBodG9u cygweGZmZmYpOwoJCX0KCX0KfQoKLyoKICogVGhpcyByb3V0aW5lIGlzIHJ1biB2aWEgYW4gdmxh bgogKiBjb25maWcgRVZFTlQKICovCnN0YXRpYyB2b2lkCmVtX3JlZ2lzdGVyX3ZsYW4odm9pZCAq YXJnLCBzdHJ1Y3QgaWZuZXQgKmlmcCwgdTE2IHZ0YWcpCnsKCXN0cnVjdCBhZGFwdGVyCSphZGFw dGVyID0gaWZwLT5pZl9zb2Z0YzsKCXUzMgkJaW5kZXgsIGJpdDsKCglpZiAoaWZwLT5pZl9zb2Z0 YyAhPSAgYXJnKSAgIC8qIE5vdCBvdXIgZXZlbnQgKi8KCQlyZXR1cm47CgoJaWYgKCh2dGFnID09 IDApIHx8ICh2dGFnID4gNDA5NSkpICAgICAgIC8qIEludmFsaWQgSUQgKi8KICAgICAgICAgICAg ICAgIHJldHVybjsKCglpbmRleCA9ICh2dGFnID4+IDUpICYgMHg3RjsKCWJpdCA9IHZ0YWcgJiAw eDFGOwoJZW1fc2hhZG93X3ZmdGFbaW5kZXhdIHw9ICgxIDw8IGJpdCk7CgkrK2FkYXB0ZXItPm51 bV92bGFuczsKCS8qIFJlLWluaXQgdG8gbG9hZCB0aGUgY2hhbmdlcyAqLwoJZW1faW5pdChhZGFw dGVyKTsKfQoKLyoKICogVGhpcyByb3V0aW5lIGlzIHJ1biB2aWEgYW4gdmxhbgogKiB1bmNvbmZp ZyBFVkVOVAogKi8Kc3RhdGljIHZvaWQKZW1fdW5yZWdpc3Rlcl92bGFuKHZvaWQgKmFyZywgc3Ry dWN0IGlmbmV0ICppZnAsIHUxNiB2dGFnKQp7CglzdHJ1Y3QgYWRhcHRlcgkqYWRhcHRlciA9IGlm cC0+aWZfc29mdGM7Cgl1MzIJCWluZGV4LCBiaXQ7CgoJaWYgKGlmcC0+aWZfc29mdGMgIT0gIGFy ZykKCQlyZXR1cm47CgoJaWYgKCh2dGFnID09IDApIHx8ICh2dGFnID4gNDA5NSkpICAgICAgIC8q IEludmFsaWQgKi8KICAgICAgICAgICAgICAgIHJldHVybjsKCglpbmRleCA9ICh2dGFnID4+IDUp ICYgMHg3RjsKCWJpdCA9IHZ0YWcgJiAweDFGOwoJZW1fc2hhZG93X3ZmdGFbaW5kZXhdICY9IH4o MSA8PCBiaXQpOwoJLS1hZGFwdGVyLT5udW1fdmxhbnM7CgkvKiBSZS1pbml0IHRvIGxvYWQgdGhl IGNoYW5nZXMgKi8KCWVtX2luaXQoYWRhcHRlcik7Cn0KCnN0YXRpYyB2b2lkCmVtX3NldHVwX3Zs YW5faHdfc3VwcG9ydChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJc3RydWN0IGUxMDAwX2h3 ICpodyA9ICZhZGFwdGVyLT5odzsKCXUzMiAgICAgICAgICAgICByZWc7CgoJLyoKCSoqIFdlIGdl dCBoZXJlIHRocnUgaW5pdF9sb2NrZWQsIG1lYW5pbmcKCSoqIGEgc29mdCByZXNldCwgdGhpcyBo YXMgYWxyZWFkeSBjbGVhcmVkCgkqKiB0aGUgVkZUQSBhbmQgb3RoZXIgc3RhdGUsIHNvIGlmIHRo ZXJlCgkqKiBoYXZlIGJlZW4gbm8gdmxhbidzIHJlZ2lzdGVyZWQgZG8gbm90aGluZy4KCSovCglp ZiAoYWRhcHRlci0+bnVtX3ZsYW5zID09IDApCiAgICAgICAgICAgICAgICByZXR1cm47CgoJLyoK CSoqIEEgc29mdCByZXNldCB6ZXJvJ3Mgb3V0IHRoZSBWRlRBLCBzbwoJKiogd2UgbmVlZCB0byBy ZXBvcHVsYXRlIGl0IG5vdy4KCSovCglmb3IgKGludCBpID0gMDsgaSA8IEVNX1ZGVEFfU0laRTsg aSsrKQogICAgICAgICAgICAgICAgaWYgKGVtX3NoYWRvd192ZnRhW2ldICE9IDApCgkJCUUxMDAw X1dSSVRFX1JFR19BUlJBWShodywgRTEwMDBfVkZUQSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGksIGVtX3NoYWRvd192ZnRhW2ldKTsKCglyZWcgPSBFMTAwMF9SRUFEX1JFRyhodywgRTEw MDBfQ1RSTCk7CglyZWcgfD0gRTEwMDBfQ1RSTF9WTUU7CglFMTAwMF9XUklURV9SRUcoaHcsIEUx MDAwX0NUUkwsIHJlZyk7CgoJLyogRW5hYmxlIHRoZSBGaWx0ZXIgVGFibGUgKi8KCXJlZyA9IEUx MDAwX1JFQURfUkVHKGh3LCBFMTAwMF9SQ1RMKTsKCXJlZyAmPSB+RTEwMDBfUkNUTF9DRklFTjsK CXJlZyB8PSBFMTAwMF9SQ1RMX1ZGRTsKCUUxMDAwX1dSSVRFX1JFRyhodywgRTEwMDBfUkNUTCwg cmVnKTsKCgkvKiBVcGRhdGUgdGhlIGZyYW1lIHNpemUgKi8KCUUxMDAwX1dSSVRFX1JFRygmYWRh cHRlci0+aHcsIEUxMDAwX1JMUE1MLAoJICAgIGFkYXB0ZXItPm1heF9mcmFtZV9zaXplICsgVkxB Tl9UQUdfU0laRSk7Cn0KCnN0YXRpYyB2b2lkCmVtX2VuYWJsZV9pbnRyKHN0cnVjdCBhZGFwdGVy ICphZGFwdGVyKQp7CglzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwoJdTMyIGlt c19tYXNrID0gSU1TX0VOQUJMRV9NQVNLOwoKCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1 NzQpIHsKCQlFMTAwMF9XUklURV9SRUcoaHcsIEVNX0VJQUMsIEVNX01TSVhfTUFTSyk7CgkJaW1z X21hc2sgfD0gRU1fTVNJWF9NQVNLOwoJfSAKCUUxMDAwX1dSSVRFX1JFRyhodywgRTEwMDBfSU1T LCBpbXNfbWFzayk7Cn0KCnN0YXRpYyB2b2lkCmVtX2Rpc2FibGVfaW50cihzdHJ1Y3QgYWRhcHRl ciAqYWRhcHRlcikKewoJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKCglpZiAo aHctPm1hYy50eXBlID09IGUxMDAwXzgyNTc0KQoJCUUxMDAwX1dSSVRFX1JFRyhodywgRU1fRUlB QywgMCk7CglFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9JTUMsIDB4ZmZmZmZm ZmYpOwp9CgovKgogKiBCaXQgb2YgYSBtaXNub21lciwgd2hhdCB0aGlzIHJlYWxseSBtZWFucyBp cwogKiB0byBlbmFibGUgT1MgbWFuYWdlbWVudCBvZiB0aGUgc3lzdGVtLi4uIGFrYQogKiB0byBk aXNhYmxlIHNwZWNpYWwgaGFyZHdhcmUgbWFuYWdlbWVudCBmZWF0dXJlcyAKICovCnN0YXRpYyB2 b2lkCmVtX2luaXRfbWFuYWdlYWJpbGl0eShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJLyog QSBzaGFyZWQgY29kZSB3b3JrYXJvdW5kICovCiNkZWZpbmUgRTEwMDBfODI1NDJfTUFOQzJIIEUx MDAwX01BTkMySAoJaWYgKGFkYXB0ZXItPmhhc19tYW5hZ2UpIHsKCQlpbnQgbWFuYzJoID0gRTEw MDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9NQU5DMkgpOwoJCWludCBtYW5jID0gRTEw MDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9NQU5DKTsKCgkJLyogZGlzYWJsZSBoYXJk d2FyZSBpbnRlcmNlcHRpb24gb2YgQVJQICovCgkJbWFuYyAmPSB+KEUxMDAwX01BTkNfQVJQX0VO KTsKCiAgICAgICAgICAgICAgICAvKiBlbmFibGUgcmVjZWl2aW5nIG1hbmFnZW1lbnQgcGFja2V0 cyB0byB0aGUgaG9zdCAqLwoJCW1hbmMgfD0gRTEwMDBfTUFOQ19FTl9NTkcySE9TVDsKI2RlZmlu ZSBFMTAwMF9NTkcySE9TVF9QT1JUXzYyMyAoMSA8PCA1KQojZGVmaW5lIEUxMDAwX01ORzJIT1NU X1BPUlRfNjY0ICgxIDw8IDYpCgkJbWFuYzJoIHw9IEUxMDAwX01ORzJIT1NUX1BPUlRfNjIzOwoJ CW1hbmMyaCB8PSBFMTAwMF9NTkcySE9TVF9QT1JUXzY2NDsKCQlFMTAwMF9XUklURV9SRUcoJmFk YXB0ZXItPmh3LCBFMTAwMF9NQU5DMkgsIG1hbmMyaCk7CgkJRTEwMDBfV1JJVEVfUkVHKCZhZGFw dGVyLT5odywgRTEwMDBfTUFOQywgbWFuYyk7Cgl9Cn0KCi8qCiAqIEdpdmUgY29udHJvbCBiYWNr IHRvIGhhcmR3YXJlIG1hbmFnZW1lbnQKICogY29udHJvbGxlciBpZiB0aGVyZSBpcyBvbmUuCiAq LwpzdGF0aWMgdm9pZAplbV9yZWxlYXNlX21hbmFnZWFiaWxpdHkoc3RydWN0IGFkYXB0ZXIgKmFk YXB0ZXIpCnsKCWlmIChhZGFwdGVyLT5oYXNfbWFuYWdlKSB7CgkJaW50IG1hbmMgPSBFMTAwMF9S RUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX01BTkMpOwoKCQkvKiByZS1lbmFibGUgaGFyZHdh cmUgaW50ZXJjZXB0aW9uIG9mIEFSUCAqLwoJCW1hbmMgfD0gRTEwMDBfTUFOQ19BUlBfRU47CgkJ bWFuYyAmPSB+RTEwMDBfTUFOQ19FTl9NTkcySE9TVDsKCgkJRTEwMDBfV1JJVEVfUkVHKCZhZGFw dGVyLT5odywgRTEwMDBfTUFOQywgbWFuYyk7Cgl9Cn0KCi8qCiAqIGVtX2dldF9od19jb250cm9s IHNldHMgdGhlIHtDVFJMX0VYVHxGV1NNfTpEUlZfTE9BRCBiaXQuCiAqIEZvciBBU0YgYW5kIFBh c3MgVGhyb3VnaCB2ZXJzaW9ucyBvZiBmL3cgdGhpcyBtZWFucwogKiB0aGF0IHRoZSBkcml2ZXIg aXMgbG9hZGVkLiBGb3IgQU1UIHZlcnNpb24gdHlwZSBmL3cKICogdGhpcyBtZWFucyB0aGF0IHRo ZSBuZXR3b3JrIGkvZiBpcyBvcGVuLgogKi8Kc3RhdGljIHZvaWQKZW1fZ2V0X2h3X2NvbnRyb2wo c3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCnsKCXUzMiBjdHJsX2V4dCwgc3dzbTsKCglpZiAoYWRh cHRlci0+aHcubWFjLnR5cGUgPT0gZTEwMDBfODI1NzMpIHsKCQlzd3NtID0gRTEwMDBfUkVBRF9S RUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9TV1NNKTsKCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXIt Pmh3LCBFMTAwMF9TV1NNLAoJCSAgICBzd3NtIHwgRTEwMDBfU1dTTV9EUlZfTE9BRCk7CgkJcmV0 dXJuOwoJfQoJLyogZWxzZSAqLwoJY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+ aHcsIEUxMDAwX0NUUkxfRVhUKTsKCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEUxMDAw X0NUUkxfRVhULAoJICAgIGN0cmxfZXh0IHwgRTEwMDBfQ1RSTF9FWFRfRFJWX0xPQUQpOwoJcmV0 dXJuOwp9CgovKgogKiBlbV9yZWxlYXNlX2h3X2NvbnRyb2wgcmVzZXRzIHtDVFJMX0VYVHxGV1NN fTpEUlZfTE9BRCBiaXQuCiAqIEZvciBBU0YgYW5kIFBhc3MgVGhyb3VnaCB2ZXJzaW9ucyBvZiBm L3cgdGhpcyBtZWFucyB0aGF0CiAqIHRoZSBkcml2ZXIgaXMgbm8gbG9uZ2VyIGxvYWRlZC4gRm9y IEFNVCB2ZXJzaW9ucyBvZiB0aGUKICogZi93IHRoaXMgbWVhbnMgdGhhdCB0aGUgbmV0d29yayBp L2YgaXMgY2xvc2VkLgogKi8Kc3RhdGljIHZvaWQKZW1fcmVsZWFzZV9od19jb250cm9sKHN0cnVj dCBhZGFwdGVyICphZGFwdGVyKQp7Cgl1MzIgY3RybF9leHQsIHN3c207CgoJaWYgKCFhZGFwdGVy LT5oYXNfbWFuYWdlKQoJCXJldHVybjsKCglpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gZTEw MDBfODI1NzMpIHsKCQlzd3NtID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9T V1NNKTsKCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9TV1NNLAoJCSAgICBz d3NtICYgfkUxMDAwX1NXU01fRFJWX0xPQUQpOwoJCXJldHVybjsKCX0KCS8qIGVsc2UgKi8KCWN0 cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9DVFJMX0VYVCk7CglF MTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9DVFJMX0VYVCwKCSAgICBjdHJsX2V4 dCAmIH5FMTAwMF9DVFJMX0VYVF9EUlZfTE9BRCk7CglyZXR1cm47Cn0KCnN0YXRpYyBpbnQKZW1f aXNfdmFsaWRfZXRoZXJfYWRkcih1OCAqYWRkcikKewoJY2hhciB6ZXJvX2FkZHJbNl0gPSB7IDAs IDAsIDAsIDAsIDAsIDAgfTsKCglpZiAoKGFkZHJbMF0gJiAxKSB8fCAoIWJjbXAoYWRkciwgemVy b19hZGRyLCBFVEhFUl9BRERSX0xFTikpKSB7CgkJcmV0dXJuIChGQUxTRSk7Cgl9CgoJcmV0dXJu IChUUlVFKTsKfQoKLyoKKiogUGFyc2UgdGhlIGludGVyZmFjZSBjYXBhYmlsaXRpZXMgd2l0aCBy ZWdhcmQKKiogdG8gYm90aCBzeXN0ZW0gbWFuYWdlbWVudCBhbmQgd2FrZS1vbi1sYW4gZm9yCioq IGxhdGVyIHVzZS4KKi8Kc3RhdGljIHZvaWQKZW1fZ2V0X3dha2V1cChkZXZpY2VfdCBkZXYpCnsK CXN0cnVjdCBhZGFwdGVyCSphZGFwdGVyID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOwoJdTE2CQll ZXByb21fZGF0YSA9IDAsIGRldmljZV9pZCwgYXBtZV9tYXNrOwoKCWFkYXB0ZXItPmhhc19tYW5h Z2UgPSBlMTAwMF9lbmFibGVfbW5nX3Bhc3NfdGhydSgmYWRhcHRlci0+aHcpOwoJYXBtZV9tYXNr ID0gRU1fRUVQUk9NX0FQTUU7CgoJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewoJY2Fz ZSBlMTAwMF84MjU3MzoKCWNhc2UgZTEwMDBfODI1ODM6CgkJYWRhcHRlci0+aGFzX2FtdCA9IFRS VUU7CgkJLyogRmFsbHMgdGhydSAqLwoJY2FzZSBlMTAwMF84MjU3MToKCWNhc2UgZTEwMDBfODI1 NzI6CgljYXNlIGUxMDAwXzgwMDAzZXMybGFuOgoJCWlmIChhZGFwdGVyLT5ody5idXMuZnVuYyA9 PSAxKSB7CgkJCWUxMDAwX3JlYWRfbnZtKCZhZGFwdGVyLT5odywKCQkJICAgIE5WTV9JTklUX0NP TlRST0wzX1BPUlRfQiwgMSwgJmVlcHJvbV9kYXRhKTsKCQkJYnJlYWs7CgkJfSBlbHNlCgkJCWUx MDAwX3JlYWRfbnZtKCZhZGFwdGVyLT5odywKCQkJICAgIE5WTV9JTklUX0NPTlRST0wzX1BPUlRf QSwgMSwgJmVlcHJvbV9kYXRhKTsKCQlicmVhazsKCWNhc2UgZTEwMDBfaWNoOGxhbjoKCWNhc2Ug ZTEwMDBfaWNoOWxhbjoKCWNhc2UgZTEwMDBfaWNoMTBsYW46CgljYXNlIGUxMDAwX3BjaGxhbjoK CQlhcG1lX21hc2sgPSBFMTAwMF9XVUNfQVBNRTsKCQlhZGFwdGVyLT5oYXNfYW10ID0gVFJVRTsK CQllZXByb21fZGF0YSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfV1VDKTsK CQlicmVhazsKCWRlZmF1bHQ6CgkJZTEwMDBfcmVhZF9udm0oJmFkYXB0ZXItPmh3LAoJCSAgICBO Vk1fSU5JVF9DT05UUk9MM19QT1JUX0EsIDEsICZlZXByb21fZGF0YSk7CgkJYnJlYWs7Cgl9Cglp ZiAoZWVwcm9tX2RhdGEgJiBhcG1lX21hc2spCgkJYWRhcHRlci0+d29sID0gKEUxMDAwX1dVRkNf TUFHIHwgRTEwMDBfV1VGQ19NQyk7CgkvKgogICAgICAgICAqIFdlIGhhdmUgdGhlIGVlcHJvbSBz ZXR0aW5ncywgbm93IGFwcGx5IHRoZSBzcGVjaWFsIGNhc2VzCiAgICAgICAgICogd2hlcmUgdGhl IGVlcHJvbSBtYXkgYmUgd3Jvbmcgb3IgdGhlIGJvYXJkIHdvbid0IHN1cHBvcnQKICAgICAgICAg KiB3YWtlIG9uIGxhbiBvbiBhIHBhcnRpY3VsYXIgcG9ydAoJICovCglkZXZpY2VfaWQgPSBwY2lf Z2V0X2RldmljZShkZXYpOwogICAgICAgIHN3aXRjaCAoZGV2aWNlX2lkKSB7CgljYXNlIEUxMDAw X0RFVl9JRF84MjU3MUVCX0ZJQkVSOgoJCS8qIFdha2UgZXZlbnRzIG9ubHkgc3VwcG9ydGVkIG9u IHBvcnQgQSBmb3IgZHVhbCBmaWJlcgoJCSAqIHJlZ2FyZGxlc3Mgb2YgZWVwcm9tIHNldHRpbmcg Ki8KCQlpZiAoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9TVEFUVVMpICYKCQkg ICAgRTEwMDBfU1RBVFVTX0ZVTkNfMSkKCQkJYWRhcHRlci0+d29sID0gMDsKCQlicmVhazsKCWNh c2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVI6CgljYXNlIEUxMDAwX0RFVl9JRF84 MjU3MUVCX1FVQURfRklCRVI6CgljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVS X0xQOgogICAgICAgICAgICAgICAgLyogaWYgcXVhZCBwb3J0IGFkYXB0ZXIsIGRpc2FibGUgV29M IG9uIGFsbCBidXQgcG9ydCBBICovCgkJaWYgKGdsb2JhbF9xdWFkX3BvcnRfYSAhPSAwKQoJCQlh ZGFwdGVyLT53b2wgPSAwOwoJCS8qIFJlc2V0IGZvciBtdWx0aXBsZSBxdWFkIHBvcnQgYWRhcHRl cnMgKi8KCQlpZiAoKytnbG9iYWxfcXVhZF9wb3J0X2EgPT0gNCkKCQkJZ2xvYmFsX3F1YWRfcG9y dF9hID0gMDsKICAgICAgICAgICAgICAgIGJyZWFrOwoJfQoJcmV0dXJuOwp9CgoKLyoKICogRW5h YmxlIFBDSSBXYWtlIE9uIExhbiBjYXBhYmlsaXR5CiAqLwpzdGF0aWMgdm9pZAplbV9lbmFibGVf d2FrZXVwKGRldmljZV90IGRldikKewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSBkZXZpY2Vf Z2V0X3NvZnRjKGRldik7CglzdHJ1Y3QgaWZuZXQJKmlmcCA9IGFkYXB0ZXItPmlmcDsKCXUzMgkJ cG1jLCBjdHJsLCBjdHJsX2V4dCwgcmN0bDsKCXUxNiAgICAgCXN0YXR1czsKCglpZiAoKHBjaV9m aW5kX2V4dGNhcChkZXYsIFBDSVlfUE1HLCAmcG1jKSAhPSAwKSkKCQlyZXR1cm47CgoJLyogQWR2 ZXJ0aXNlIHRoZSB3YWtldXAgY2FwYWJpbGl0eSAqLwoJY3RybCA9IEUxMDAwX1JFQURfUkVHKCZh ZGFwdGVyLT5odywgRTEwMDBfQ1RSTCk7CgljdHJsIHw9IChFMTAwMF9DVFJMX1NXRFBJTjIgfCBF MTAwMF9DVFJMX1NXRFBJTjMpOwoJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBf Q1RSTCwgY3RybCk7CglFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9XVUMsIEUx MDAwX1dVQ19QTUVfRU4pOwoKCWlmICgoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gZTEwMDBfaWNo OGxhbikgfHwKCSAgICAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gZTEwMDBfcGNobGFuKSB8fAoJ ICAgIChhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF9pY2g5bGFuKSB8fAoJICAgIChhZGFw dGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF9pY2gxMGxhbikpIHsKCQllMTAwMF9kaXNhYmxlX2dp Z193b2xfaWNoOGxhbigmYWRhcHRlci0+aHcpOwoJCWUxMDAwX2h2X3BoeV9wb3dlcmRvd25fd29y a2Fyb3VuZF9pY2g4bGFuKCZhZGFwdGVyLT5odyk7Cgl9CgoJLyogS2VlcCB0aGUgbGFzZXIgcnVu bmluZyBvbiBGaWJlciBhZGFwdGVycyAqLwoJaWYgKGFkYXB0ZXItPmh3LnBoeS5tZWRpYV90eXBl ID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIgfHwKCSAgICBhZGFwdGVyLT5ody5waHkubWVkaWFf dHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgewoJCWN0cmxfZXh0ID0g RTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9DVFJMX0VYVCk7CgkJY3RybF9leHQg fD0gRTEwMDBfQ1RSTF9FWFRfU0RQM19EQVRBOwoJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+ aHcsIEUxMDAwX0NUUkxfRVhULCBjdHJsX2V4dCk7Cgl9CgoJLyoKCSoqIERldGVybWluZSB0eXBl IG9mIFdha2V1cDogbm90ZSB0aGF0IHdvbAoJKiogaXMgc2V0IHdpdGggYWxsIGJpdHMgb24gYnkg ZGVmYXVsdC4KCSovCglpZiAoKGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfV09MX01BR0lDKSA9 PSAwKQoJCWFkYXB0ZXItPndvbCAmPSB+RTEwMDBfV1VGQ19NQUc7CgoJaWYgKChpZnAtPmlmX2Nh cGVuYWJsZSAmIElGQ0FQX1dPTF9NQ0FTVCkgPT0gMCkKCQlhZGFwdGVyLT53b2wgJj0gfkUxMDAw X1dVRkNfTUM7CgllbHNlIHsKCQlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBF MTAwMF9SQ1RMKTsKCQlyY3RsIHw9IEUxMDAwX1JDVExfTVBFOwoJCUUxMDAwX1dSSVRFX1JFRygm YWRhcHRlci0+aHcsIEUxMDAwX1JDVEwsIHJjdGwpOwoJfQoKCWlmIChhZGFwdGVyLT5ody5tYWMu dHlwZSA9PSBlMTAwMF9wY2hsYW4pIHsKCQlpZiAoZW1fZW5hYmxlX3BoeV93YWtldXAoYWRhcHRl cikpCgkJCXJldHVybjsKCX0gZWxzZSB7CgkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywg RTEwMDBfV1VDLCBFMTAwMF9XVUNfUE1FX0VOKTsKCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXIt Pmh3LCBFMTAwMF9XVUZDLCBhZGFwdGVyLT53b2wpOwoJfQoKCWlmIChhZGFwdGVyLT5ody5waHku dHlwZSA9PSBlMTAwMF9waHlfaWdwXzMpCgkJZTEwMDBfaWdwM19waHlfcG93ZXJkb3duX3dvcmth cm91bmRfaWNoOGxhbigmYWRhcHRlci0+aHcpOwoKICAgICAgICAvKiBSZXF1ZXN0IFBNRSAqLwog ICAgICAgIHN0YXR1cyA9IHBjaV9yZWFkX2NvbmZpZyhkZXYsIHBtYyArIFBDSVJfUE9XRVJfU1RB VFVTLCAyKTsKCXN0YXR1cyAmPSB+KFBDSU1fUFNUQVRfUE1FIHwgUENJTV9QU1RBVF9QTUVFTkFC TEUpOwoJaWYgKGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfV09MKQoJCXN0YXR1cyB8PSBQQ0lN X1BTVEFUX1BNRSB8IFBDSU1fUFNUQVRfUE1FRU5BQkxFOwogICAgICAgIHBjaV93cml0ZV9jb25m aWcoZGV2LCBwbWMgKyBQQ0lSX1BPV0VSX1NUQVRVUywgc3RhdHVzLCAyKTsKCglyZXR1cm47Cn0K Ci8qCioqIFdPTCBpbiB0aGUgbmV3ZXIgY2hpcHNldCBpbnRlcmZhY2VzIChwY2hsYW4pCioqIHJl cXVpcmUgdGhpbmcgdG8gYmUgY29waWVkIGludG8gdGhlIHBoeQoqLwpzdGF0aWMgaW50CmVtX2Vu YWJsZV9waHlfd2FrZXVwKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7CglzdHJ1Y3QgZTEwMDBf aHcgKmh3ID0gJmFkYXB0ZXItPmh3OwoJdTMyIG1yZWcsIHJldCA9IDA7Cgl1MTYgcHJlZzsKCgkv KiBjb3B5IE1BQyBSQVJzIHRvIFBIWSBSQVJzICovCglmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0 ZXItPmh3Lm1hYy5yYXJfZW50cnlfY291bnQ7IGkrKykgewoJCW1yZWcgPSBFMTAwMF9SRUFEX1JF RyhodywgRTEwMDBfUkFMKGkpKTsKCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCBCTV9SQVJfTChp KSwgKHUxNikobXJlZyAmIDB4RkZGRikpOwoJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIEJNX1JB Ul9NKGkpLAoJCSAgICAodTE2KSgobXJlZyA+PiAxNikgJiAweEZGRkYpKTsKCQltcmVnID0gRTEw MDBfUkVBRF9SRUcoaHcsIEUxMDAwX1JBSChpKSk7CgkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywg Qk1fUkFSX0goaSksICh1MTYpKG1yZWcgJiAweEZGRkYpKTsKCQllMTAwMF93cml0ZV9waHlfcmVn KGh3LCBCTV9SQVJfQ1RSTChpKSwKCQkgICAgKHUxNikoKG1yZWcgPj4gMTYpICYgMHhGRkZGKSk7 Cgl9CgoJLyogY29weSBNQUMgTVRBIHRvIFBIWSBNVEEgKi8KCWZvciAoaW50IGkgPSAwOyBpIDwg YWRhcHRlci0+aHcubWFjLm10YV9yZWdfY291bnQ7IGkrKykgewoJCW1yZWcgPSBFMTAwMF9SRUFE X1JFR19BUlJBWShodywgRTEwMDBfTVRBLCBpKTsKCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCBC TV9NVEEoaSksICh1MTYpKG1yZWcgJiAweEZGRkYpKTsKCQllMTAwMF93cml0ZV9waHlfcmVnKGh3 LCBCTV9NVEEoaSkgKyAxLAoJCSAgICAodTE2KSgobXJlZyA+PiAxNikgJiAweEZGRkYpKTsKCX0K CgkvKiBjb25maWd1cmUgUEhZIFJ4IENvbnRyb2wgcmVnaXN0ZXIgKi8KCWUxMDAwX3JlYWRfcGh5 X3JlZygmYWRhcHRlci0+aHcsIEJNX1JDVEwsICZwcmVnKTsKCW1yZWcgPSBFMTAwMF9SRUFEX1JF RyhodywgRTEwMDBfUkNUTCk7CglpZiAobXJlZyAmIEUxMDAwX1JDVExfVVBFKQoJCXByZWcgfD0g Qk1fUkNUTF9VUEU7CglpZiAobXJlZyAmIEUxMDAwX1JDVExfTVBFKQoJCXByZWcgfD0gQk1fUkNU TF9NUEU7CglwcmVnICY9IH4oQk1fUkNUTF9NT19NQVNLKTsKCWlmIChtcmVnICYgRTEwMDBfUkNU TF9NT18zKQoJCXByZWcgfD0gKCgobXJlZyAmIEUxMDAwX1JDVExfTU9fMykgPj4gRTEwMDBfUkNU TF9NT19TSElGVCkKCQkJCTw8IEJNX1JDVExfTU9fU0hJRlQpOwoJaWYgKG1yZWcgJiBFMTAwMF9S Q1RMX0JBTSkKCQlwcmVnIHw9IEJNX1JDVExfQkFNOwoJaWYgKG1yZWcgJiBFMTAwMF9SQ1RMX1BN Q0YpCgkJcHJlZyB8PSBCTV9SQ1RMX1BNQ0Y7CgltcmVnID0gRTEwMDBfUkVBRF9SRUcoaHcsIEUx MDAwX0NUUkwpOwoJaWYgKG1yZWcgJiBFMTAwMF9DVFJMX1JGQ0UpCgkJcHJlZyB8PSBCTV9SQ1RM X1JGQ0U7CgllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgQk1fUkNUTCwgcHJlZyk7 CgoJLyogZW5hYmxlIFBIWSB3YWtldXAgaW4gTUFDIHJlZ2lzdGVyICovCglFMTAwMF9XUklURV9S RUcoaHcsIEUxMDAwX1dVQywKCSAgICBFMTAwMF9XVUNfUEhZX1dBS0UgfCBFMTAwMF9XVUNfUE1F X0VOKTsKCUUxMDAwX1dSSVRFX1JFRyhodywgRTEwMDBfV1VGQywgYWRhcHRlci0+d29sKTsKCgkv KiBjb25maWd1cmUgYW5kIGVuYWJsZSBQSFkgd2FrZXVwIGluIFBIWSByZWdpc3RlcnMgKi8KCWUx MDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBCTV9XVUZDLCBhZGFwdGVyLT53b2wpOwoJ ZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIEJNX1dVQywgRTEwMDBfV1VDX1BNRV9F Tik7CgoJLyogYWN0aXZhdGUgUEhZIHdha2V1cCAqLwoJcmV0ID0gaHctPnBoeS5vcHMuYWNxdWly ZShodyk7CglpZiAocmV0KSB7CgkJcHJpbnRmKCJDb3VsZCBub3QgYWNxdWlyZSBQSFlcbiIpOwoJ CXJldHVybiByZXQ7Cgl9CgllMTAwMF93cml0ZV9waHlfcmVnX21kaWMoaHcsIElHUDAxRTEwMDBf UEhZX1BBR0VfU0VMRUNULAoJICAgICAgICAgICAgICAgICAgICAgICAgIChCTV9XVUNfRU5BQkxF X1BBR0UgPDwgSUdQX1BBR0VfU0hJRlQpKTsKCXJldCA9IGUxMDAwX3JlYWRfcGh5X3JlZ19tZGlj KGh3LCBCTV9XVUNfRU5BQkxFX1JFRywgJnByZWcpOwoJaWYgKHJldCkgewoJCXByaW50ZigiQ291 bGQgbm90IHJlYWQgUEhZIHBhZ2UgNzY5XG4iKTsKCQlnb3RvIG91dDsKCX0KCXByZWcgfD0gQk1f V1VDX0VOQUJMRV9CSVQgfCBCTV9XVUNfSE9TVF9XVV9CSVQ7CglyZXQgPSBlMTAwMF93cml0ZV9w aHlfcmVnX21kaWMoaHcsIEJNX1dVQ19FTkFCTEVfUkVHLCBwcmVnKTsKCWlmIChyZXQpCgkJcHJp bnRmKCJDb3VsZCBub3Qgc2V0IFBIWSBIb3N0IFdha2V1cCBiaXRcbiIpOwpvdXQ6Cglody0+cGh5 Lm9wcy5yZWxlYXNlKGh3KTsKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZAplbV9sZWRfZnVu Yyh2b2lkICphcmcsIGludCBvbm9mZikKewoJc3RydWN0IGFkYXB0ZXIJKmFkYXB0ZXIgPSBhcmc7 CiAKCUVNX0NPUkVfTE9DSyhhZGFwdGVyKTsKCWlmIChvbm9mZikgewoJCWUxMDAwX3NldHVwX2xl ZCgmYWRhcHRlci0+aHcpOwoJCWUxMDAwX2xlZF9vbigmYWRhcHRlci0+aHcpOwoJfSBlbHNlIHsK CQllMTAwMF9sZWRfb2ZmKCZhZGFwdGVyLT5odyk7CgkJZTEwMDBfY2xlYW51cF9sZWQoJmFkYXB0 ZXItPmh3KTsKCX0KCUVNX0NPUkVfVU5MT0NLKGFkYXB0ZXIpOwp9CgovKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgog KgogKiAgVXBkYXRlIHRoZSBib2FyZCBzdGF0aXN0aWNzIGNvdW50ZXJzLgogKgogKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8Kc3RhdGljIHZvaWQKZW1fdXBkYXRlX3N0YXRzX2NvdW50ZXJzKHN0cnVjdCBhZGFwdGVy ICphZGFwdGVyKQp7CglzdHJ1Y3QgaWZuZXQgICAqaWZwOwoKCWlmKGFkYXB0ZXItPmh3LnBoeS5t ZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyIHx8CgkgICAoRTEwMDBfUkVBRF9S RUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9TVEFUVVMpICYgRTEwMDBfU1RBVFVTX0xVKSkgewoJCWFk YXB0ZXItPnN0YXRzLnN5bWVycnMgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAw MF9TWU1FUlJTKTsKCQlhZGFwdGVyLT5zdGF0cy5zZWMgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0 ZXItPmh3LCBFMTAwMF9TRUMpOwoJfQoJYWRhcHRlci0+c3RhdHMuY3JjZXJycyArPSBFMTAwMF9S RUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0NSQ0VSUlMpOwoJYWRhcHRlci0+c3RhdHMubXBj ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfTVBDKTsKCWFkYXB0ZXItPnN0 YXRzLnNjYyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1NDQyk7CglhZGFw dGVyLT5zdGF0cy5lY29sICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfRUNP TCk7CgoJYWRhcHRlci0+c3RhdHMubWNjICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywg RTEwMDBfTUNDKTsKCWFkYXB0ZXItPnN0YXRzLmxhdGVjb2wgKz0gRTEwMDBfUkVBRF9SRUcoJmFk YXB0ZXItPmh3LCBFMTAwMF9MQVRFQ09MKTsKCWFkYXB0ZXItPnN0YXRzLmNvbGMgKz0gRTEwMDBf UkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9DT0xDKTsKCWFkYXB0ZXItPnN0YXRzLmRjICs9 IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfREMpOwoJYWRhcHRlci0+c3RhdHMu cmxlYyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JMRUMpOwoJYWRhcHRl ci0+c3RhdHMueG9ucnhjICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfWE9O UlhDKTsKCWFkYXB0ZXItPnN0YXRzLnhvbnR4YyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+ aHcsIEUxMDAwX1hPTlRYQyk7CglhZGFwdGVyLT5zdGF0cy54b2ZmcnhjICs9IEUxMDAwX1JFQURf UkVHKCZhZGFwdGVyLT5odywgRTEwMDBfWE9GRlJYQyk7CglhZGFwdGVyLT5zdGF0cy54b2ZmdHhj ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfWE9GRlRYQyk7CglhZGFwdGVy LT5zdGF0cy5mY3J1YyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0ZDUlVD KTsKCWFkYXB0ZXItPnN0YXRzLnByYzY0ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywg RTEwMDBfUFJDNjQpOwoJYWRhcHRlci0+c3RhdHMucHJjMTI3ICs9IEUxMDAwX1JFQURfUkVHKCZh ZGFwdGVyLT5odywgRTEwMDBfUFJDMTI3KTsKCWFkYXB0ZXItPnN0YXRzLnByYzI1NSArPSBFMTAw MF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1BSQzI1NSk7CglhZGFwdGVyLT5zdGF0cy5w cmM1MTEgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9QUkM1MTEpOwoJYWRh cHRlci0+c3RhdHMucHJjMTAyMyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAw X1BSQzEwMjMpOwoJYWRhcHRlci0+c3RhdHMucHJjMTUyMiArPSBFMTAwMF9SRUFEX1JFRygmYWRh cHRlci0+aHcsIEUxMDAwX1BSQzE1MjIpOwoJYWRhcHRlci0+c3RhdHMuZ3ByYyArPSBFMTAwMF9S RUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0dQUkMpOwoJYWRhcHRlci0+c3RhdHMuYnByYyAr PSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0JQUkMpOwoJYWRhcHRlci0+c3Rh dHMubXByYyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX01QUkMpOwoJYWRh cHRlci0+c3RhdHMuZ3B0YyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0dQ VEMpOwoKCS8qIEZvciB0aGUgNjQtYml0IGJ5dGUgY291bnRlcnMgdGhlIGxvdyBkd29yZCBtdXN0 IGJlIHJlYWQgZmlyc3QuICovCgkvKiBCb3RoIHJlZ2lzdGVycyBjbGVhciBvbiB0aGUgcmVhZCBv ZiB0aGUgaGlnaCBkd29yZCAqLwoKCWFkYXB0ZXItPnN0YXRzLmdvcmMgKz0gRTEwMDBfUkVBRF9S RUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9HT1JDSCk7CglhZGFwdGVyLT5zdGF0cy5nb3RjICs9IEUx MDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfR09UQ0gpOwoKCWFkYXB0ZXItPnN0YXRz LnJuYmMgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9STkJDKTsKCWFkYXB0 ZXItPnN0YXRzLnJ1YyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JVQyk7 CglhZGFwdGVyLT5zdGF0cy5yZmMgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAw MF9SRkMpOwoJYWRhcHRlci0+c3RhdHMucm9jICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5o dywgRTEwMDBfUk9DKTsKCWFkYXB0ZXItPnN0YXRzLnJqYyArPSBFMTAwMF9SRUFEX1JFRygmYWRh cHRlci0+aHcsIEUxMDAwX1JKQyk7CgoJYWRhcHRlci0+c3RhdHMudG9yICs9IEUxMDAwX1JFQURf UkVHKCZhZGFwdGVyLT5odywgRTEwMDBfVE9SSCk7CglhZGFwdGVyLT5zdGF0cy50b3QgKz0gRTEw MDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9UT1RIKTsKCglhZGFwdGVyLT5zdGF0cy50 cHIgKz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9UUFIpOwoJYWRhcHRlci0+ c3RhdHMudHB0ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfVFBUKTsKCWFk YXB0ZXItPnN0YXRzLnB0YzY0ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBf UFRDNjQpOwoJYWRhcHRlci0+c3RhdHMucHRjMTI3ICs9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVy LT5odywgRTEwMDBfUFRDMTI3KTsKCWFkYXB0ZXItPnN0YXRzLnB0YzI1NSArPSBFMTAwMF9SRUFE X1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1BUQzI1NSk7CglhZGFwdGVyLT5zdGF0cy5wdGM1MTEg Kz0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFMTAwMF9QVEM1MTEpOwoJYWRhcHRlci0+ c3RhdHMucHRjMTAyMyArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1BUQzEw MjMpOwoJYWRhcHRlci0+c3RhdHMucHRjMTUyMiArPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+ aHcsIEUxMDAwX1BUQzE1MjIpOwoJYWRhcHRlci0+c3RhdHMubXB0YyArPSBFMTAwMF9SRUFEX1JF RygmYWRhcHRlci0+aHcsIEUxMDAwX01QVEMpOwoJYWRhcHRlci0+c3RhdHMuYnB0YyArPSBFMTAw MF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0JQVEMpOwoKCWlmIChhZGFwdGVyLT5ody5t YWMudHlwZSA+PSBlMTAwMF84MjU0MykgewoJCWFkYXB0ZXItPnN0YXRzLmFsZ25lcnJjICs9IAoJ CUUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfQUxHTkVSUkMpOwoJCWFkYXB0ZXIt PnN0YXRzLnJ4ZXJyYyArPSAKCQlFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX1JY RVJSQyk7CgkJYWRhcHRlci0+c3RhdHMudG5jcnMgKz0gCgkJRTEwMDBfUkVBRF9SRUcoJmFkYXB0 ZXItPmh3LCBFMTAwMF9UTkNSUyk7CgkJYWRhcHRlci0+c3RhdHMuY2V4dGVyciArPSAKCQlFMTAw MF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEUxMDAwX0NFWFRFUlIpOwoJCWFkYXB0ZXItPnN0YXRz LnRzY3RjICs9IAoJCUUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRTEwMDBfVFNDVEMpOwoJ CWFkYXB0ZXItPnN0YXRzLnRzY3RmYyArPSAKCQlFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcs IEUxMDAwX1RTQ1RGQyk7Cgl9CglpZnAgPSBhZGFwdGVyLT5pZnA7CgoJaWZwLT5pZl9jb2xsaXNp b25zID0gYWRhcHRlci0+c3RhdHMuY29sYzsKCgkvKiBSeCBFcnJvcnMgKi8KCWlmcC0+aWZfaWVy cm9ycyA9IGFkYXB0ZXItPmRyb3BwZWRfcGt0cyArIGFkYXB0ZXItPnN0YXRzLnJ4ZXJyYyArCgkg ICAgYWRhcHRlci0+c3RhdHMuY3JjZXJycyArIGFkYXB0ZXItPnN0YXRzLmFsZ25lcnJjICsKCSAg ICBhZGFwdGVyLT5zdGF0cy5ydWMgKyBhZGFwdGVyLT5zdGF0cy5yb2MgKwoJICAgIGFkYXB0ZXIt PnN0YXRzLm1wYyArIGFkYXB0ZXItPnN0YXRzLmNleHRlcnI7CgoJLyogVHggRXJyb3JzICovCglp ZnAtPmlmX29lcnJvcnMgPSBhZGFwdGVyLT5zdGF0cy5lY29sICsKCSAgICBhZGFwdGVyLT5zdGF0 cy5sYXRlY29sICsgYWRhcHRlci0+d2F0Y2hkb2dfZXZlbnRzOwp9CgoKLyoKICogQWRkIHN5c2N0 bCB2YXJpYWJsZXMsIG9uZSBwZXIgc3RhdGlzdGljLCB0byB0aGUgc3lzdGVtLgogKi8Kc3RhdGlj IHZvaWQKZW1fYWRkX2h3X3N0YXRzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQp7CgoJZGV2aWNl X3QgZGV2ID0gYWRhcHRlci0+ZGV2OwoKCXN0cnVjdCBzeXNjdGxfY3R4X2xpc3QgKmN0eCA9IGRl dmljZV9nZXRfc3lzY3RsX2N0eChkZXYpOwoJc3RydWN0IHN5c2N0bF9vaWQgKnRyZWUgPSBkZXZp Y2VfZ2V0X3N5c2N0bF90cmVlKGRldik7CglzdHJ1Y3Qgc3lzY3RsX29pZF9saXN0ICpjaGlsZCA9 IFNZU0NUTF9DSElMRFJFTih0cmVlKTsKCXN0cnVjdCBlMTAwMF9od19zdGF0cyAqc3RhdHMgPSAm YWRhcHRlci0+c3RhdHM7CgoJc3RydWN0IHN5c2N0bF9vaWQgKnN0YXRfbm9kZSwgKmludF9ub2Rl LCAqaG9zdF9ub2RlOwoJc3RydWN0IHN5c2N0bF9vaWRfbGlzdCAqc3RhdF9saXN0LCAqaW50X2xp c3QsICpob3N0X2xpc3Q7CgoJLyogRHJpdmVyIFN0YXRpc3RpY3MgKi8KCVNZU0NUTF9BRERfVUlO VChjdHgsIGNoaWxkLCBPSURfQVVUTywgImxpbmtfaXJxIiwgCgkJCUNUTEZMQUdfUkQsICZhZGFw dGVyLT5saW5rX2lycSwgMCwKCQkJIkxpbmsgTVNJWCBJUlEgSGFuZGxlZCIpOwoJU1lTQ1RMX0FE RF9VTE9ORyhjdHgsIGNoaWxkLCBPSURfQVVUTywgIm1idWZfYWxsb2NfZmFpbCIsIAoJCQkgQ1RM RkxBR19SRCwgJmFkYXB0ZXItPm1idWZfYWxsb2NfZmFpbGVkLAoJCQkgIlN0ZCBtYnVmIGZhaWxl ZCIpOwoJU1lTQ1RMX0FERF9VTE9ORyhjdHgsIGNoaWxkLCBPSURfQVVUTywgImNsdXN0ZXJfYWxs b2NfZmFpbCIsIAoJCQkgQ1RMRkxBR19SRCwgJmFkYXB0ZXItPm1idWZfY2x1c3Rlcl9mYWlsZWQs CgkJCSAiU3RkIG1idWYgY2x1c3RlciBmYWlsZWQiKTsKCVNZU0NUTF9BRERfVUxPTkcoY3R4LCBj aGlsZCwgT0lEX0FVVE8sICJkcm9wcGVkIiwgCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5kcm9w cGVkX3BrdHMsCgkJCSJEcml2ZXIgZHJvcHBlZCBwYWNrZXRzIik7CglTWVNDVExfQUREX1VMT05H KGN0eCwgY2hpbGQsIE9JRF9BVVRPLCAidHhfZG1hX2ZhaWwiLCAKCQkJQ1RMRkxBR19SRCwgJmFk YXB0ZXItPm5vX3R4X2RtYV9zZXR1cCwKCQkJIkRyaXZlciB0eCBkbWEgZmFpbHVyZSBpbiB4bWl0 Iik7CgoJU1lTQ1RMX0FERF9VSU5UKGN0eCwgY2hpbGQsIE9JRF9BVVRPLCAiZmNfaGlnaF93YXRl ciIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5ody5mYy5oaWdoX3dhdGVyLCAwLAoJCQkiRmxv dyBDb250cm9sIEhpZ2ggV2F0ZXJtYXJrIik7CglTWVNDVExfQUREX1VJTlQoY3R4LCBjaGlsZCwg T0lEX0FVVE8sICJmY19sb3dfd2F0ZXIiLCAKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPmh3LmZj Lmxvd193YXRlciwgMCwKCQkJIkZsb3cgQ29udHJvbCBMb3cgV2F0ZXJtYXJrIik7CgoJLyogTUFD IHN0YXRzIGdldCB0aGUgb3duIHN1YiBub2RlICovCgoJc3RhdF9ub2RlID0gU1lTQ1RMX0FERF9O T0RFKGN0eCwgY2hpbGQsIE9JRF9BVVRPLCAibWFjX3N0YXRzIiwgCgkJCQkgICAgQ1RMRkxBR19S RCwgTlVMTCwgIlN0YXRpc3RpY3MiKTsKCXN0YXRfbGlzdCA9IFNZU0NUTF9DSElMRFJFTihzdGF0 X25vZGUpOwoKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJleGNl c3NfY29sbCIsIAoJCQlDVExGTEFHX1JELCAmc3RhdHMtPmVjb2wsCgkJCSJFeGNlc3NpdmUgY29s bGlzaW9ucyIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0LCBPSURfQVVUTywgInN5 bWJvbF9lcnJvcnMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuc3ltZXJycywKCQkJ IlN5bWJvbCBFcnJvcnMiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FV VE8sICJzZXF1ZW5jZV9lcnJvcnMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuc2Vj LAoJCQkiU2VxdWVuY2UgRXJyb3JzIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3Qs IE9JRF9BVVRPLCAiZGVmZXJfY291bnQiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMu ZGMsCgkJCSJEZWZlciBDb3VudCIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0LCBP SURfQVVUTywgIm1pc3NlZF9wYWNrZXRzIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRz Lm1wYywKCQkJIk1pc3NlZCBQYWNrZXRzIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xp c3QsIE9JRF9BVVRPLCAicmVjdl9ub19idWZmIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0 YXRzLnJuYmMsCgkJCSJSZWNlaXZlIE5vIEJ1ZmZlcnMiKTsKCS8qIFJMRUMgaXMgaW5hY2N1cmF0 ZSBvbiBzb21lIGhhcmR3YXJlLCBjYWxjdWxhdGUgb3VyIG93bi4gKi8KLyogCVNZU0NUTF9BRERf UVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJyZWN2X2xlbl9lcnJzIiwgKi8KLyogCQkJ Q1RMRkxBR19SRCwgYWRhcHRlci0+c3RhdHMucm9jICsgYWRhcHRlci0+c3RhdHMucnVjLCAqLwov KiAJCQkiUmVjZWl2ZSBMZW5ndGggRXJyb3JzIik7ICovCgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwg c3RhdF9saXN0LCBPSURfQVVUTywgInJlY3ZfZXJycyIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVy LT5zdGF0cy5yeGVycmMsCgkJCSJSZWNlaXZlIEVycm9ycyIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0 eCwgc3RhdF9saXN0LCBPSURfQVVUTywgImNyY19lcnJzIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0 ZXItPnN0YXRzLmNyY2VycnMsCgkJCSJDUkMgZXJyb3JzIik7CglTWVNDVExfQUREX1FVQUQoY3R4 LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAiYWxpZ25tZW50X2VycnMiLAoJCQlDVExGTEFHX1JELCAm YWRhcHRlci0+c3RhdHMuYWxnbmVycmMsCgkJCSJBbGlnbm1lbnQgRXJyb3JzIik7CgkvKiBPbiA4 MjU3NSB0aGVzZSBhcmUgY29sbGlzaW9uIGNvdW50cyAqLwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwg c3RhdF9saXN0LCBPSURfQVVUTywgImNvbGxfZXh0X2VycnMiLAoJCQlDVExGTEFHX1JELCAmYWRh cHRlci0+c3RhdHMuY2V4dGVyciwKCQkJIkNvbGxpc2lvbi9DYXJyaWVyIGV4dGVuc2lvbiBlcnJv cnMiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJyeF9vdmVy cnVucyIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5yeF9vdmVycnVucywKCQkJIlJYIG92ZXJy dW5zIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAid2F0Y2hk b2dfdGltZW91dHMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+d2F0Y2hkb2dfZXZlbnRzLAoJ CQkiV2F0Y2hkb2cgdGltZW91dHMiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwg T0lEX0FVVE8sICJ4b25fcmVjdmQiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMueG9u cnhjLAoJCQkiWE9OIFJlY2VpdmVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3Qs IE9JRF9BVVRPLCAieG9uX3R4ZCIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy54b250 eGMsCgkJCSJYT04gVHJhbnNtaXR0ZWQiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlz dCwgT0lEX0FVVE8sICJ4b2ZmX3JlY3ZkIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRz LnhvZmZyeGMsCgkJCSJYT0ZGIFJlY2VpdmVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0 X2xpc3QsIE9JRF9BVVRPLCAieG9mZl90eGQiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3Rh dHMueG9mZnR4YywKCQkJIlhPRkYgVHJhbnNtaXR0ZWQiKTsKCgkvKiBQYWNrZXQgUmVjZXB0aW9u IFN0YXRzICovCglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAidG90 YWxfcGt0c19yZWN2ZCIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy50cHIsCgkJCSJU b3RhbCBQYWNrZXRzIFJlY2VpdmVkICIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0 LCBPSURfQVVUTywgImdvb2RfcGt0c19yZWN2ZCIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5z dGF0cy5ncHJjLAoJCQkiR29vZCBQYWNrZXRzIFJlY2VpdmVkIik7CglTWVNDVExfQUREX1FVQUQo Y3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAiYmNhc3RfcGt0c19yZWN2ZCIsCgkJCUNUTEZMQUdf UkQsICZhZGFwdGVyLT5zdGF0cy5icHJjLAoJCQkiQnJvYWRjYXN0IFBhY2tldHMgUmVjZWl2ZWQi KTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJtY2FzdF9wa3Rz X3JlY3ZkIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLm1wcmMsCgkJCSJNdWx0aWNh c3QgUGFja2V0cyBSZWNlaXZlZCIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0LCBP SURfQVVUTywgInJ4X2ZyYW1lc182NCIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy5w cmM2NCwKCQkJIjY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkICIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0 eCwgc3RhdF9saXN0LCBPSURfQVVUTywgInJ4X2ZyYW1lc182NV8xMjciLAoJCQlDVExGTEFHX1JE LCAmYWRhcHRlci0+c3RhdHMucHJjMTI3LAoJCQkiNjUtMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVk Iik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAicnhfZnJhbWVz XzEyOF8yNTUiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMucHJjMjU1LAoJCQkiMTI4 LTI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9s aXN0LCBPSURfQVVUTywgInJ4X2ZyYW1lc18yNTZfNTExIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0 ZXItPnN0YXRzLnByYzUxMSwKCQkJIjI1Ni01MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQiKTsKCVNZ U0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJyeF9mcmFtZXNfNTEyXzEw MjMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMucHJjMTAyMywKCQkJIjUxMi0xMDIz IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3Qs IE9JRF9BVVRPLCAicnhfZnJhbWVzXzEwMjRfMTUyMiIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVy LT5zdGF0cy5wcmMxNTIyLAoJCQkiMTAyMy0xNTIyIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIik7CiAJ U1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0LCBPSURfQVVUTywgImdvb2Rfb2N0ZXRzX3Jl Y3ZkIiwgCiAJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuZ29yYywgCiAJCQkiR29vZCBP Y3RldHMgUmVjZWl2ZWQiKTsgCgoJLyogUGFja2V0IFRyYW5zbWlzc2lvbiBTdGF0cyAqLwogCVNZ U0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJnb29kX29jdGVzdF90eGQi LCAKIAkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy5nb3RjLCAKIAkJCSJHb29kIE9jdGVz dCBUcmFuc21pdHRlZCIpOyAKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FV VE8sICJ0b3RhbF9wa3RzX3R4ZCIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy50cHQs CgkJCSJUb3RhbCBQYWNrZXRzIFRyYW5zbWl0dGVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBz dGF0X2xpc3QsIE9JRF9BVVRPLCAiZ29vZF9wa3RzX3R4ZCIsCgkJCUNUTEZMQUdfUkQsICZhZGFw dGVyLT5zdGF0cy5ncHRjLAoJCQkiR29vZCBQYWNrZXRzIFRyYW5zbWl0dGVkIik7CglTWVNDVExf QUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAiYmNhc3RfcGt0c190eGQiLAoJCQlD VExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuYnB0YywKCQkJIkJyb2FkY2FzdCBQYWNrZXRzIFRy YW5zbWl0dGVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAi bWNhc3RfcGt0c190eGQiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMubXB0YywKCQkJ Ik11bHRpY2FzdCBQYWNrZXRzIFRyYW5zbWl0dGVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4LCBz dGF0X2xpc3QsIE9JRF9BVVRPLCAidHhfZnJhbWVzXzY0IiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0 ZXItPnN0YXRzLnB0YzY0LAoJCQkiNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgIik7CglTWVND VExfQUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAidHhfZnJhbWVzXzY1XzEyNyIs CgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy5wdGMxMjcsCgkJCSI2NS0xMjcgYnl0ZSBm cmFtZXMgdHJhbnNtaXR0ZWQiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lE X0FVVE8sICJ0eF9mcmFtZXNfMTI4XzI1NSIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0 cy5wdGMyNTUsCgkJCSIxMjgtMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIik7CglTWVNDVExf QUREX1FVQUQoY3R4LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAidHhfZnJhbWVzXzI1Nl81MTEiLAoJ CQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMucHRjNTExLAoJCQkiMjU2LTUxMSBieXRlIGZy YW1lcyB0cmFuc21pdHRlZCIpOwoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgc3RhdF9saXN0LCBPSURf QVVUTywgInR4X2ZyYW1lc181MTJfMTAyMyIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0 cy5wdGMxMDIzLAoJCQkiNTEyLTEwMjMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQiKTsKCVNZU0NU TF9BRERfUVVBRChjdHgsIHN0YXRfbGlzdCwgT0lEX0FVVE8sICJ0eF9mcmFtZXNfMTAyNF8xNTIy IiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLnB0YzE1MjIsCgkJCSIxMDI0LTE1MjIg Ynl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQiKTsKCVNZU0NUTF9BRERfUVVBRChjdHgsIHN0YXRfbGlz dCwgT0lEX0FVVE8sICJ0c29fdHhkIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLnRz Y3RjLAoJCQkiVFNPIENvbnRleHRzIFRyYW5zbWl0dGVkIik7CglTWVNDVExfQUREX1FVQUQoY3R4 LCBzdGF0X2xpc3QsIE9JRF9BVVRPLCAidHNvX2N0eF9mYWlsIiwKCQkJQ1RMRkxBR19SRCwgJmFk YXB0ZXItPnN0YXRzLnRzY3RmYywKCQkJIlRTTyBDb250ZXh0cyBGYWlsZWQiKTsKCgoJLyogSW50 ZXJydXB0IFN0YXRzICovCgoJaW50X25vZGUgPSBTWVNDVExfQUREX05PREUoY3R4LCBjaGlsZCwg T0lEX0FVVE8sICJpbnRlcnJ1cHRzIiwgCgkJCQkgICAgQ1RMRkxBR19SRCwgTlVMTCwgIkludGVy cnVwdCBTdGF0aXN0aWNzIik7CglpbnRfbGlzdCA9IFNZU0NUTF9DSElMRFJFTihpbnRfbm9kZSk7 CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaW50X2xpc3QsIE9JRF9BVVRPLCAiYXNzZXJ0cyIsCgkJ CUNUTEZMQUdfUkQsICZhZGFwdGVyLT5zdGF0cy5pYWMsCgkJCSJJbnRlcnJ1cHQgQXNzZXJ0aW9u IENvdW50Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaW50X2xpc3QsIE9JRF9BVVRPLCAicnhf cGt0X3RpbWVyIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLmljcnhwdGMsCgkJCSJJ bnRlcnJ1cHQgQ2F1c2UgUnggUGt0IFRpbWVyIEV4cGlyZSBDb3VudCIpOwoKCVNZU0NUTF9BRERf UVVBRChjdHgsIGludF9saXN0LCBPSURfQVVUTywgInJ4X2Fic190aW1lciIsCgkJCUNUTEZMQUdf UkQsICZhZGFwdGVyLT5zdGF0cy5pY3J4YXRjLAoJCQkiSW50ZXJydXB0IENhdXNlIFJ4IEFicyBU aW1lciBFeHBpcmUgQ291bnQiKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBpbnRfbGlzdCwgT0lE X0FVVE8sICJ0eF9wa3RfdGltZXIiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuaWN0 eHB0YywKCQkJIkludGVycnVwdCBDYXVzZSBUeCBQa3QgVGltZXIgRXhwaXJlIENvdW50Iik7CgoJ U1lTQ1RMX0FERF9RVUFEKGN0eCwgaW50X2xpc3QsIE9JRF9BVVRPLCAidHhfYWJzX3RpbWVyIiwK CQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLmljdHhhdGMsCgkJCSJJbnRlcnJ1cHQgQ2F1 c2UgVHggQWJzIFRpbWVyIEV4cGlyZSBDb3VudCIpOwoKCVNZU0NUTF9BRERfUVVBRChjdHgsIGlu dF9saXN0LCBPSURfQVVUTywgInR4X3F1ZXVlX2VtcHR5IiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0 ZXItPnN0YXRzLmljdHhxZWMsCgkJCSJJbnRlcnJ1cHQgQ2F1c2UgVHggUXVldWUgRW1wdHkgQ291 bnQiKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBpbnRfbGlzdCwgT0lEX0FVVE8sICJ0eF9xdWV1 ZV9taW5fdGhyZXNoIiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLmljdHhxbXRjLAoJ CQkiSW50ZXJydXB0IENhdXNlIFR4IFF1ZXVlIE1pbiBUaHJlc2ggQ291bnQiKTsKCglTWVNDVExf QUREX1FVQUQoY3R4LCBpbnRfbGlzdCwgT0lEX0FVVE8sICJyeF9kZXNjX21pbl90aHJlc2giLAoJ CQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuaWNyeGRtdGMsCgkJCSJJbnRlcnJ1cHQgQ2F1 c2UgUnggRGVzYyBNaW4gVGhyZXNoIENvdW50Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaW50 X2xpc3QsIE9JRF9BVVRPLCAicnhfb3ZlcnJ1biIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVyLT5z dGF0cy5pY3J4b2MsCgkJCSJJbnRlcnJ1cHQgQ2F1c2UgUmVjZWl2ZXIgT3ZlcnJ1biBDb3VudCIp OwoKCS8qIEhvc3QgdG8gQ2FyZCBTdGF0cyAqLwoKCWhvc3Rfbm9kZSA9IFNZU0NUTF9BRERfTk9E RShjdHgsIGNoaWxkLCBPSURfQVVUTywgImhvc3QiLCAKCQkJCSAgICBDVExGTEFHX1JELCBOVUxM LCAKCQkJCSAgICAiSG9zdCB0byBDYXJkIFN0YXRpc3RpY3MiKTsKCglob3N0X2xpc3QgPSBTWVND VExfQ0hJTERSRU4oaG9zdF9ub2RlKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBob3N0X2xpc3Qs IE9JRF9BVVRPLCAiYnJlYWtlcl90eF9wa3QiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3Rh dHMuY2J0bXBjLAoJCQkiQ2lyY3VpdCBCcmVha2VyIFR4IFBhY2tldCBDb3VudCIpOwoKCVNZU0NU TF9BRERfUVVBRChjdHgsIGhvc3RfbGlzdCwgT0lEX0FVVE8sICJob3N0X3R4X3BrdF9kaXNjYXJk IiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLmh0ZHBtYywKCQkJIkhvc3QgVHJhbnNt aXQgRGlzY2FyZGVkIFBhY2tldHMiKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBob3N0X2xpc3Qs IE9JRF9BVVRPLCAicnhfcGt0IiwKCQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLnJwdGhj LAoJCQkiUnggUGFja2V0cyBUbyBIb3N0Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaG9zdF9s aXN0LCBPSURfQVVUTywgImJyZWFrZXJfcnhfcGt0cyIsCgkJCUNUTEZMQUdfUkQsICZhZGFwdGVy LT5zdGF0cy5jYnJtcGMsCgkJCSJDaXJjdWl0IEJyZWFrZXIgUnggUGFja2V0IENvdW50Iik7CgoJ U1lTQ1RMX0FERF9RVUFEKGN0eCwgaG9zdF9saXN0LCBPSURfQVVUTywgImJyZWFrZXJfcnhfcGt0 X2Ryb3AiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuY2JyZHBjLAoJCQkiQ2lyY3Vp dCBCcmVha2VyIFJ4IERyb3BwZWQgQ291bnQiKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBob3N0 X2xpc3QsIE9JRF9BVVRPLCAidHhfZ29vZF9wa3QiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+ c3RhdHMuaGdwdGMsCgkJCSJIb3N0IEdvb2QgUGFja2V0cyBUeCBDb3VudCIpOwoKCVNZU0NUTF9B RERfUVVBRChjdHgsIGhvc3RfbGlzdCwgT0lEX0FVVE8sICJicmVha2VyX3R4X3BrdF9kcm9wIiwK CQkJQ1RMRkxBR19SRCwgJmFkYXB0ZXItPnN0YXRzLmh0Y2JkcGMsCgkJCSJIb3N0IFR4IENpcmN1 aXQgQnJlYWtlciBEcm9wcGVkIENvdW50Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaG9zdF9s aXN0LCBPSURfQVVUTywgInJ4X2dvb2RfYnl0ZXMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+ c3RhdHMuaGdvcmMsCgkJCSJIb3N0IEdvb2QgT2N0ZXRzIFJlY2VpdmVkIENvdW50Iik7CgoJU1lT Q1RMX0FERF9RVUFEKGN0eCwgaG9zdF9saXN0LCBPSURfQVVUTywgInR4X2dvb2RfYnl0ZXMiLAoJ CQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuaGdvdGMsCgkJCSJIb3N0IEdvb2QgT2N0ZXRz IFRyYW5zbWl0IENvdW50Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaG9zdF9saXN0LCBPSURf QVVUTywgImxlbmd0aF9lcnJvcnMiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMubGVu ZXJycywKCQkJIkxlbmd0aCBFcnJvcnMiKTsKCglTWVNDVExfQUREX1FVQUQoY3R4LCBob3N0X2xp c3QsIE9JRF9BVVRPLCAic2VyZGVzX3Zpb2xhdGlvbl9wa3QiLAoJCQlDVExGTEFHX1JELCAmYWRh cHRlci0+c3RhdHMuc2N2cGMsCgkJCSJTZXJEZXMvU0dNSUkgQ29kZSBWaW9sYXRpb24gUGt0IENv dW50Iik7CgoJU1lTQ1RMX0FERF9RVUFEKGN0eCwgaG9zdF9saXN0LCBPSURfQVVUTywgImhlYWRl cl9yZWRpcl9taXNzZWQiLAoJCQlDVExGTEFHX1JELCAmYWRhcHRlci0+c3RhdHMuaHJtcGMsCgkJ CSJIZWFkZXIgUmVkaXJlY3Rpb24gTWlzc2VkIFBhY2tldCBDb3VudCIpOwoKCgp9CgovKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKgogKgogKiAgVGhpcyByb3V0aW5lIHByb3ZpZGVzIGEgd2F5IHRvIGR1bXAgb3V0IHRo ZSBhZGFwdGVyIGVlcHJvbSwKICogIG9mdGVuIGEgdXNlZnVsIGRlYnVnL3NlcnZpY2UgdG9vbC4g VGhpcyBvbmx5IGR1bXBzIHRoZSBmaXJzdAogKiAgMzIgd29yZHMsIHN0dWZmIHRoYXQgbWF0dGVy cyBpcyBpbiB0aGF0IGV4dGVudC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgaW50CmVtX3N5 c2N0bF9udm1faW5mbyhTWVNDVExfSEFORExFUl9BUkdTKQp7CglzdHJ1Y3QgYWRhcHRlciAqYWRh cHRlcjsKCWludCBlcnJvcjsKCWludCByZXN1bHQ7CgoJcmVzdWx0ID0gLTE7CgllcnJvciA9IHN5 c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyZXN1bHQsIDAsIHJlcSk7CgoJaWYgKGVycm9yIHx8ICFy ZXEtPm5ld3B0cikKCQlyZXR1cm4gKGVycm9yKTsKCgkvKgoJICogVGhpcyB2YWx1ZSB3aWxsIGNh dXNlIGEgaGV4IGR1bXAgb2YgdGhlCgkgKiBmaXJzdCAzMiAxNi1iaXQgd29yZHMgb2YgdGhlIEVF UFJPTSB0bwoJICogdGhlIHNjcmVlbi4KCSAqLwoJaWYgKHJlc3VsdCA9PSAxKSB7CgkJYWRhcHRl ciA9IChzdHJ1Y3QgYWRhcHRlciAqKWFyZzE7CgkJZW1fcHJpbnRfbnZtX2luZm8oYWRhcHRlcik7 CiAgICAgICAgfQoKCXJldHVybiAoZXJyb3IpOwp9CgpzdGF0aWMgdm9pZAplbV9wcmludF9udm1f aW5mbyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKewoJdTE2CWVlcHJvbV9kYXRhOwoJaW50CWks IGosIHJvdyA9IDA7CgoJLyogSXRzIGEgYml0IGNydWRlLCBidXQgaXQgZ2V0cyB0aGUgam9iIGRv bmUgKi8KCXByaW50ZigiXG5JbnRlcmZhY2UgRUVQUk9NIER1bXA6XG4iKTsKCXByaW50ZigiT2Zm c2V0XG4weDAwMDAgICIpOwoJZm9yIChpID0gMCwgaiA9IDA7IGkgPCAzMjsgaSsrLCBqKyspIHsK CQlpZiAoaiA9PSA4KSB7IC8qIE1ha2UgdGhlIG9mZnNldCBibG9jayAqLwoJCQlqID0gMDsgKyty b3c7CgkJCXByaW50ZigiXG4weDAwJXgwICAiLHJvdyk7CgkJfQoJCWUxMDAwX3JlYWRfbnZtKCZh ZGFwdGVyLT5odywgaSwgMSwgJmVlcHJvbV9kYXRhKTsKCQlwcmludGYoIiUwNHggIiwgZWVwcm9t X2RhdGEpOwoJfQoJcHJpbnRmKCJcbiIpOwp9CgpzdGF0aWMgaW50CmVtX3N5c2N0bF9pbnRfZGVs YXkoU1lTQ1RMX0hBTkRMRVJfQVJHUykKewoJc3RydWN0IGVtX2ludF9kZWxheV9pbmZvICppbmZv OwoJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXI7Cgl1MzIgcmVndmFsOwoJaW50IGVycm9yLCB1c2Vj cywgdGlja3M7CgoJaW5mbyA9IChzdHJ1Y3QgZW1faW50X2RlbGF5X2luZm8gKilhcmcxOwoJdXNl Y3MgPSBpbmZvLT52YWx1ZTsKCWVycm9yID0gc3lzY3RsX2hhbmRsZV9pbnQob2lkcCwgJnVzZWNz LCAwLCByZXEpOwoJaWYgKGVycm9yICE9IDAgfHwgcmVxLT5uZXdwdHIgPT0gTlVMTCkKCQlyZXR1 cm4gKGVycm9yKTsKCWlmICh1c2VjcyA8IDAgfHwgdXNlY3MgPiBFTV9USUNLU19UT19VU0VDUyg2 NTUzNSkpCgkJcmV0dXJuIChFSU5WQUwpOwoJaW5mby0+dmFsdWUgPSB1c2VjczsKCXRpY2tzID0g RU1fVVNFQ1NfVE9fVElDS1ModXNlY3MpOwoKCWFkYXB0ZXIgPSBpbmZvLT5hZGFwdGVyOwoJCglF TV9DT1JFX0xPQ0soYWRhcHRlcik7CglyZWd2YWwgPSBFMTAwMF9SRUFEX09GRlNFVCgmYWRhcHRl ci0+aHcsIGluZm8tPm9mZnNldCk7CglyZWd2YWwgPSAocmVndmFsICYgfjB4ZmZmZikgfCAodGlj a3MgJiAweGZmZmYpOwoJLyogSGFuZGxlIGEgZmV3IHNwZWNpYWwgY2FzZXMuICovCglzd2l0Y2gg KGluZm8tPm9mZnNldCkgewoJY2FzZSBFMTAwMF9SRFRSOgoJCWJyZWFrOwoJY2FzZSBFMTAwMF9U SURWOgoJCWlmICh0aWNrcyA9PSAwKSB7CgkJCWFkYXB0ZXItPnR4ZF9jbWQgJj0gfkUxMDAwX1RY RF9DTURfSURFOwoJCQkvKiBEb24ndCB3cml0ZSAwIGludG8gdGhlIFRJRFYgcmVnaXN0ZXIuICov CgkJCXJlZ3ZhbCsrOwoJCX0gZWxzZQoJCQlhZGFwdGVyLT50eGRfY21kIHw9IEUxMDAwX1RYRF9D TURfSURFOwoJCWJyZWFrOwoJfQoJRTEwMDBfV1JJVEVfT0ZGU0VUKCZhZGFwdGVyLT5odywgaW5m by0+b2Zmc2V0LCByZWd2YWwpOwoJRU1fQ09SRV9VTkxPQ0soYWRhcHRlcik7CglyZXR1cm4gKDAp Owp9CgpzdGF0aWMgdm9pZAplbV9hZGRfaW50X2RlbGF5X3N5c2N0bChzdHJ1Y3QgYWRhcHRlciAq YWRhcHRlciwgY29uc3QgY2hhciAqbmFtZSwKCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uLCBzdHJ1 Y3QgZW1faW50X2RlbGF5X2luZm8gKmluZm8sCglpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCnsKCWlu Zm8tPmFkYXB0ZXIgPSBhZGFwdGVyOwoJaW5mby0+b2Zmc2V0ID0gb2Zmc2V0OwoJaW5mby0+dmFs dWUgPSB2YWx1ZTsKCVNZU0NUTF9BRERfUFJPQyhkZXZpY2VfZ2V0X3N5c2N0bF9jdHgoYWRhcHRl ci0+ZGV2KSwKCSAgICBTWVNDVExfQ0hJTERSRU4oZGV2aWNlX2dldF9zeXNjdGxfdHJlZShhZGFw dGVyLT5kZXYpKSwKCSAgICBPSURfQVVUTywgbmFtZSwgQ1RMVFlQRV9JTlR8Q1RMRkxBR19SVywK CSAgICBpbmZvLCAwLCBlbV9zeXNjdGxfaW50X2RlbGF5LCAiSSIsIGRlc2NyaXB0aW9uKTsKfQoK c3RhdGljIHZvaWQKZW1fYWRkX3J4X3Byb2Nlc3NfbGltaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0 ZXIsIGNvbnN0IGNoYXIgKm5hbWUsCgljb25zdCBjaGFyICpkZXNjcmlwdGlvbiwgaW50ICpsaW1p dCwgaW50IHZhbHVlKQp7CgkqbGltaXQgPSB2YWx1ZTsKCVNZU0NUTF9BRERfSU5UKGRldmljZV9n ZXRfc3lzY3RsX2N0eChhZGFwdGVyLT5kZXYpLAoJICAgIFNZU0NUTF9DSElMRFJFTihkZXZpY2Vf Z2V0X3N5c2N0bF90cmVlKGFkYXB0ZXItPmRldikpLAoJICAgIE9JRF9BVVRPLCBuYW1lLCBDVExU WVBFX0lOVHxDVExGTEFHX1JXLCBsaW1pdCwgdmFsdWUsIGRlc2NyaXB0aW9uKTsKfQoKCg== --_004_32AB5C9615CC494997D9ABB1DB12783C024CA4A7E3SJEXCH1adaran_--