From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3FC72C33CAD for ; Mon, 13 Jan 2020 14:16:24 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 05BF420661 for ; Mon, 13 Jan 2020 14:16:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="U7uT4rjM"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="bxwqALCx" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 05BF420661 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=9fXhmGr8tUK0sxA+XZ5Yys/aSZA4ey6DmRqFP+mzRlw=; b=U7uT4rjMs1RY68 Rn9tLNxRTM22YcncT6D0KcsMsPwIGOW/ZGUVnXWKA87VXG+OHvMc49jREQ0TbSd0PftvA8cUILAV0 BQFHWOYA4mCxaeuiQm1lF89asjY9+M2Z7BELmKkhEnrLn2etWoMy4+BZ8qgkFszZv8D41mfKJ3+E3 IPvK4oQUI5+KhmSZGpAnlKVeBgJqInCa4e3sYoypiy8noQcG78Ngm6ZlwVySBAnOlot3uaIMaU8jw 1cr6t/9mzagCGNMhXgK+eYNuUN91YRMAvNPcWjTlx9gjFCJNg4rlLSmsHIShfKvEgy7AWrhretQnj 5yzc5HK2tV3ledBSLnhA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ir0Vt-0003HR-4C; Mon, 13 Jan 2020 14:16:17 +0000 Received: from merlin.infradead.org ([2001:8b0:10b:1231::1]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ir0Vq-0003HB-Cy; Mon, 13 Jan 2020 14:16:15 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=Content-Transfer-Encoding:Content-Type: MIME-Version:References:In-Reply-To:Message-ID:Subject:Cc:To:From:Date:Sender :Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=KcGu/db24kGYodcRgxPPq4DsT/2e9G7RP7nlC1xb5Aw=; b=bxwqALCxPRInFkQTRXocHuzPRd kio3bvQAB545/vFljWhpFWbPXLRueu7Ix4B6Wt5pXJUlbDXaqrH8sGDntwP1cqkxdN0ws47Y342ya mCptG0O3YHsGt1iMRghJHADe0Xhcfl1L1M8cXcU/gsDD9800P4tysMlP4rAuAcCeXNjT0mUYD5KRd gc/vfVAfvd7qv83XHJFSFIwXeUEbbvg1LnDdPInZ2tkvKpgVtcdXLvAabpZkyGDdWrcT+JE5VtZqt dKO643nXfMqs398ARLymdWuwai6W4bRasbybR6ZiH/vjlBCeBvglAYJh4nFAAtus1arWu07xS3YZ/ TuCx7NtA==; Received: from relay8-d.mail.gandi.net ([217.70.183.201]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ir0Vl-0006UN-GP; Mon, 13 Jan 2020 14:16:12 +0000 X-Originating-IP: 90.76.211.102 Received: from xps13 (lfbn-tou-1-1151-102.w90-76.abo.wanadoo.fr [90.76.211.102]) (Authenticated sender: miquel.raynal@bootlin.com) by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 5D4F31BF20B; Mon, 13 Jan 2020 14:15:30 +0000 (UTC) Date: Mon, 13 Jan 2020 15:15:29 +0100 From: Miquel Raynal To: Johan Jonker Subject: Re: [RFC PATCH v1 02/10] mtd: nand: raw: add rockchip nand controller driver Message-ID: <20200113151529.1ecba50e@xps13> In-Reply-To: <7a477af0-1448-4f26-4004-9331978e824c@gmail.com> References: <20200108205338.11369-1-jbx6244@gmail.com> <20200108205338.11369-3-jbx6244@gmail.com> <20200110120534.1b4026b0@xps13> <7a477af0-1448-4f26-4004-9331978e824c@gmail.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, devicetree@vger.kernel.org, vigneshr@ti.com, richard@nod.at, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, robh+dt@kernel.org, linux-mtd@lists.infradead.org, linux-arm-kernel@lists.infradead.org, heiko@sntech.de Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgSm9oYW4sCgpKb2hhbiBKb25rZXIgPGpieDYyNDRAZ21haWwuY29tPiB3cm90ZSBvbiBTdW4s IDEyIEphbiAyMDIwIDE4OjI2OjIwCiswMTAwOgoKPiBIaSBNaXF1ZWwsCj4gCj4gVGhhbmsgeW91 IGZvciB5b3VyIGRldGFpbGVkIGFuZCB1c2VmdWwgcmV2aWV3Lgo+IAo+IFdpdGhvdXQgbWFudWZh Y3R1cmVyIHN1cHBvcnQgSSBtdXN0IHNjcmFwZSBteSBpbmZvcm1hdGlvbgo+IGZyb20gYWxsIG92 ZXIgdGhlIGludGVybmV0LCB0b2dldGhlciB3aXRoIHNsb3cgaW50ZXJwcmV0YXRpb24gb2YKPiBS b2NrY2hpcCBkcml2ZXJzLgo+IFNvIHBsZWFzZSBoYXZlIHNvbWUgcGF0aWVuY2Ugd2l0aCBteSB1 cGRhdGVzIGFuZCBuZXcgdmVyc2lvbnMuCgpUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIGh1cnJ5LCBp dCBpcyBncmVhdCB0aGF0IHlvdSB3b3JrIG9uIHRoaXMhCgo+IAo+IEJlbG93IGFyZSBzb21lIGNv bW1lbnRzIGFuZCBxdWVzdGlvbnMgaW4gcmFuZG9tIG9yZGVyLgo+IAo+IC8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vCj4gCj4gVG8gcHJldmVudCBndWVzc2luZyBnYW1lcyBjb3VsZCB5b3Ug Y29uZmlybSB0aGUgZm9sbG93aW5nIG5hbWVzOgo+IAo+IGRyaXZlciBmaWxlIG5hbWU6ICAgcm9j a2NoaXAtbmFuZC1jb250cm9sbGVyLmMKCkZpbmUKCj4gZG9jdW1lbnQgZmlsZSBuYW1lOiByb2Nr Y2hpcC1uYW5kLWNvbnRyb2xsZXIueWFtbAoKSSB0aGluayByb2NrY2hpcCxuYW5kLWNvbnRyb2xs ZXIueWFtbCBpcyBwcmVmZXJyZWQuCgo+IAo+IGNvbXBhdGlibGU6ICJyb2NrY2hpcCxuYW5kYy12 NiIKCnJvY2tjaGlwLG5hbmQtY29udHJvbGxlci12NgoKPiBjb21wYXRpYmxlOiAicm9ja2NoaXAs bmFuZGMtdjkiCgpzYW1lIGFzIGFib3ZlIHdpdGggLXY5IGFzIHN1ZmZpeC4KCgpbLi4uXQoKPiBK YW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDUzMzg4XSBuYW5kOiA4MTkyIE1p QiwgTUxDLAplcmFzZQoKSnVzdCB0byBiZSBjbGVhciwgTUxDIGlzIG5vdCB5ZXQgc3VwcG9ydGVk IGluIG1haW5saW5lLiBUaGVyZSBpcyBhCnBhdGNoIHNlcmllcyB0aGF0IGFpbXMgYXQgc3VwcG9y dGluZyBNTEMgaW4gcHNldWRvLVNMQyBtb2RlIGJ1dCBkbyBub3QKdXNlIE1MQyBhcyBhIHJlbGlh YmxlIHN0b3JhZ2UgbWVkaXVtLgoKPiBzaXplOiAyMDQ4IEtpQiwgcGFnZSBzaXplOiA4MTkyLCBP T0Igc2l6ZTogNjQwCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1NDA1 MF0gcm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPm51bWNo aXBzID0gMQo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTQ3NDBdIHJv Y2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5jaGlwc2l6ZSA9 IDg1ODk5MzQ1OTIKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU1Mzgw XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+cGFnZW1h c2sgPSAgICBmZmZmZgo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTU5 OTRdIHJvY2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5iYWRi bG9ja3BvcyA9IDAKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU2NTkx XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+Y2hpcF9z aGlmdCA9IDMzCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1NzE3NF0g cm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPnBhZ2Vfc2hp ZnQgPSAxMwo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTc3NTFdIHJv Y2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5waHlzX2VyYXNl X3NoaWZ0ID0gMjEKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU4MzY2 XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLm1v ZGUgPSAzCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1ODkyMF0gcm9j a2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPmVjYy5zdGVwcyA9 IDgKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU5NDgxXSByb2NrY2hp cC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLmJ5dGVzID0gNzAK PiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYwMDQ5XSByb2NrY2hpcC1u YW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLnRvdGFsID0gMAo+IEph biAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjA2MDddIHJvY2tjaGlwLW5hbmRj Cj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5lY2MucHJlcGFkID0gNAo+IEphbiAg MSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjExNzVdIHJvY2tjaGlwLW5hbmRjCj4g MTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5lY2Muc2l6ZSA9IDEwMjQKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYxNzQ4XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLnN0cmVuZ3RoID0gNDAKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYyMzQxXSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT5vb2JsYXlvdXQgPSA5MWNlOWNlMgo+IEphbiAg MSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjI5NDNdIHJvY2tjaGlwLW5hbmRjCj4g MTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBtdGQtPmZsYWdzID0gMDAwMDAwMDAKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYzNTE4XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT5zaXplID0gODU4OTkzNDU5Mgo+IEphbiAgMSAw MDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjQwOThdIHJvY2tjaGlwLW5hbmRjCj4gMTA1 MDAwMDAubmFuZC1jb250cm9sbGVyOiBtdGQtPmVyYXNlc2l6ZSA9IDIwOTcxNTIKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDY0ODE1XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT53cml0ZXNpemUgPSA4MTkyCj4gSmFuICAxIDAw OjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA2NTQxM10gcm9ja2NoaXAtbmFuZGMKPiAxMDUw MDAwMC5uYW5kLWNvbnRyb2xsZXI6IG10ZC0+b29ic2l6ZSA9IDY0MAo+IEphbiAgMSAwMDowMjoy NyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjg5ODVdIDEgZml4ZWQtcGFydGl0aW9ucwo+IHBhcnRp dGlvbnMgZm91bmQgb24gTVREIGRldmljZSAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXIuMAo+IEph biAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjkxOTBdIENyZWF0aW5nIDEgTVRE IHBhcnRpdGlvbnMKPiBvbiAiMTA1MDAwMDAubmFuZC1jb250cm9sbGVyLjAiOgo+IEphbiAgMSAw MDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNzIzNzVdCj4gMHgwMDAwMDAwMDAwMDAtMHgw MDAwMDA0MDAwMDAgOiAicGFyYW1ldGVyIgo+IAo+IAo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBr ZXJuZWw6IFsgIDE0Ny4wNzU2NDldIHJvY2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250 cm9sbGVyOiBSOjB4MDBmZiBjczowCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAg MTQ3LjA3OTQyM10gcm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IFI6 MHgwMWZmIGNzOjAKPiAKPiAKPiBEZXNwaXRlIG5hbmQtPm9wdGlvbnMgPSBOQU5EX1NLSVBfQkJU U0NBTi4KPiAKPiBXaGF0IGlzIHRoZSByZWFzb24gZm9yIHRoZXNlIDIgcmtfbmFuZGNfaHdfc3lu ZHJvbWVfZWNjX3JlYWRfcGFnZSgpCj4gY29tbWFuZHMgYXQgcGFnZSBSOjB4MDBmZiBhbmQgUjow eDAxZmYgcmlnaHQgYWZ0ZXIgY3JlYXRpbmcKPiBwYXJ0aXRpb25zLgo+IAo+IFdoZW4gZW5hYmxl ZCBCQlRTQ0FOIE1URCBzdGFydHMgdG8gc3RvcmUgYXQgYWxsIGtpbmQgb2YgcGxhY2VzLiBDYW4K PiB5b3Ugc3RhdGUKClBsZWFzZSBkbyBub3QgbWl4IHRoZSB0d28gY29uY2VwdHM6Ci0gb24gY2hp cCBiYnQ6IHRoZSBsYXN0IGJsb2NrcyB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdGhlIEJCLCB3aXRo b3V0LAogIHRoZSBCQlQgbXVzdCBiZSByZWNvbnN0cnVjdGVkIGJ5IHJlYWRpbmcgYWxsIHRoZSBi bG9ja3MuCi0gU0tJUF9CQlRfU0NBTjogZG8gbm90IGNvbnN0cnVjdCB0aGUgQkJUIGluIFJBTS4K ClBsZWFzZSB0cmFjZSB0aGUgY2FsbHMgKGR1bXBfc3RhY2soKSBtaWdodCBoZWxwIHlvdSkgdG8g c2VlIHdoYXQKZnVuY3Rpb24gYWN0dWFsbHkgY2FsbHMgdGhlIC0+cmVhZF9wYWdlKCkgaGVscGVy cy4KCj4gdGhlcmUgcGFnZSBhZGRyZXNzIGxvZ2ljLCBpZS4gV291bGQgdGhhdCBkYW1hZ2UgdGhl IGV4Y2lzdGluZyBSb2NrY2hpcAo+IGxheW91dD8KCkkgZG9uJ3Qga25vdyBhYm91dCB0aGUgZXhp c3RpbmcgUm9ja2NoaXAgbGF5b3V0LgoKPiAKPiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Lwo+IAo+IE5vIGJhZCBibG9jayBzdXBwb3J0Cj4gCj4gQmFzZWQgb246Cj4gZHJpdmVyczogbXRk OiBuYW5kOiByb2NrY2hpcCBuYW5kYyBhZGQgYmFkIGJsb2NrIGRldGVjdCBhcGkKPiBodHRwczov L2dpdGh1Yi5jb20vcm9ja2NoaXAtbGludXgvdS1ib290L2NvbW1pdC8KPiA3YWVjNzA0YTRlOWQ5 MzIyZjExMDJiY2Y2MWVlNWMzY2Y2ZWM3OTRkCj4gCj4gcm9ja2NoaXA6IGRyaXZlcnM6IG10ZDog bmFuZDogbW9kaWZ5IHRoZSBiYWQgYmxvY2sgZGV0ZWN0aW9uIHByb2Nlc3MKPiBodHRwczovL2dp dGh1Yi5jb20vcm9ja2NoaXAtbGludXgvdS1ib290L2NvbW1pdC8KPiBkNmQ3MDhkMWEzMjlhNjM2 OTE0M2U4ZGQzNGNmNGUyYzgxZDVkOTJmCj4gCj4gQkNIICAgICAgfCAgICAgIG9vYiBzaXplCj4g LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gMTY6IGJ5dGVzOiAyOCArIDQgPSAzMgo+IDI0OiBi eXRlczogNDIgKyA0ID0gNDYKPiA0MDogYnl0ZXM6IDcwICsgNCA9IDc0Cj4gNjA6IGJ5dGVzOiAx MDYgKyA0ID0gMTEwCj4gCj4gVGhlIGRhdGEgbGF5b3V0IHRoYXQgaXMgd3JpdHRlbiBieSBhbiBp bnRlcm5hbCBSb2NrY2hpcCBuYW5kYyBkbWEgaXM6Cj4gICAgIDEwMjQgYnl0ZXMgZGF0YSArIDMy IG9iYiArIDEwMjQgZGF0YSArIDMyIG9iYiAuLi4KPiAKPiBUaGUgTVREIHN5c3RlbSBob3dldmVy IHRyaWVzIHRvIGRldGVjdCBiYWQgYmxvY2sgZmxhZ3MgbG9jYXRlZCBhdDoKPiAgICAgMjA0OCwg NDA5NiwgODE5Mi4uLgoKQmFkIGJsb2NrIGZsYWdzIChzbyBjYWxsZWQgYmFkIGJsb2NrIG1hcmtl cnMsIGFicmV2aWF0ZWQgQkJNKSBhcmUgdGhlCmZpcnN0IHR3byBieXRlcyBvZiB0aGUgT09CLiBB IHBhZ2UgaXMgYWx3YXlzOgoKCTxYIGluLWJhbmQgYnl0ZXMgKGRhdGEpPjxZIG91dC1vZi1iYW5k IGJ5dGVzIChPT0IpPgoKTm8gbWF0dGVyIHRoZSB3YXkgdGhpcyBpcyBzdG9yZWQgb24gdGhlIE5B TkQgY2hpcCwgdGhlIHVzZXIgaXMKZXhwZWN0aW5nIGFsbCB0aGUgZGF0YSBieXRlcyB0b2dldGhl ciBhbmQgYWxsIHRoZSBPT0IgYnl0ZXMgdG9nZXRoZXIuCllvdSBtdXN0IHJlY29uc3RydWN0IHRo aXMuCgo+IFRoZSBzeXN0ZW0gY2hlY2tzIGZvciBiYWQgYmxvY2tzIGFuZCBsb29rcyBhdCB0aGUg d3JvbmcgYmFkIGJsb2NrCj4gbWFya2VyIGxvY2F0aW9uLgo+IFlpZmVuZyBaaGFvIHByb3Bvc2Vz IHRvIGFkZCBhIGJhZCBibG9jayBkZXRlY3Rpbmcgc3RyYXRlZ3kgYnkgZG9pbmcKPiBhIHJlYWQg d2l0aCBya19uYW5kY19od19zeW5kcm9tZV9lY2NfcmVhZF9wYWdlKCkgZmlyc3QsCj4gaWYgZmFp bHVyZSB0aGVuIGFzc3VtZSBpdCdzIHN0aWxsIHJhdyB1bndyaXR0ZW4gTkFORCBhbmQgdGVzdCBi eXRlcwo+IGFyZSBhdCB0aGUgcG9zaXRpb24gTVREIG5vcm1hbHkgd291bGQgY2hlY2sgZm9yIHJp Z2h0IGZyb20gdGhlCj4gZmFjdG9yeS4gV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgb24gYSBG VEwgY29udHJvbGxlZCBOQU5EIGl0Cj4gY3JlYXRlcyBhbiBhd2Z1bCBsb3Qgb2YgZXJyb3JzIGlu IHRoZSBrZXJuZWwgbG9nLCBiZWNhdXNlIGl0IHVzZXMgdGhlCj4gQkIgbWFya2VyIGZvciBkaXJ0 eSB0YWcgdHJpY2tzIGZvciB0aGVyZSBkYXRhIHN0b3JhZ2UuCj4gU28gd2hhdCBpcyBnb29kIGZv ciBhIHJhdyBlbXB0eSBOQU5EIHdpdGhvdXQgRlRMCj4gZG9lcyBub3Qgd29yayBmb3IgdGhlIG1h am9yaXR5IG9mIFJvY2tjaGlwIGRldmljZXMgSSB0aGluay4KPiAKPiBQbGVhc2UgYWR2aXNlIGZv ciBvdGhlciBvcHRpb25zLgoKVGhhdCdzIHNhZCB0aGF0IFJvY2tjaGlwIEJTUCBkb2VzIG5vdCBm b2xsb3cgc3RhbmRhcmQgcnVsZXMsIGJ1dCBJTUhPCnRoaXMga2luZCBvZiByZXNlYXJjaCBsb2dp YyBpcyB3YXkgdG9vIG11Y2ggZXJyb3IgcHJvbmUgYW5kIHRoaXMgaXMgbm90CnNvbWVodGluZyB3 ZSB3YW50IHRvIHBsYXkgd2l0aDogaWYgeW91IHN0YXJ0IGEgbWFpbmxpbmUga2VybmVsIHdpdGgg YQp3cm9uZyBsb2dpYywgdGhlbiBsYXRlciB5b3UgZml4IHRoZSBsb2dpYyBpbiBtYWlubGluZSwg eW91IG11c3Qgc3VwcG9ydAp0aGUgYnJva2VuIGxvZ2ljIGZvcmV2ZXIuCgpUaGlzIG1lYW5zIHlv dSBjYW5ub3QgYm9vdCBhIHZlbmRvciBrZXJuZWwgYW5kIGEgbWFpbmxpbmUga2VybmVsIG9uIHRo ZQpzYW1lIHBsYXRmb3JtIGFueW1vcmUuIFRoaXMgaXMgc2FkIGJ1dCB3ZSBjYW5ub3QgZmlnaHQg YWdhaW5zdCBpdC4KVW5sZXNzLCBhcyBJIGFtIHBvaW50aW5nIGl0IG91dCBhYm92ZSwgeW91IGNh biBzaW1wbHkgcmVjb25zdHJ1Y3QgdGhlCnBhZ2UgdG8gb2ZmZXIgYSBsaW5lYXIgZGF0YStPT0Ig bGF5b3V0LgoKPiBzdGF0aWMgdWludDhfdCBya19uYW5kX3JlYWRfYnl0ZShzdHJ1Y3QgbmFuZF9j aGlwICpuYW5kKQo+IHsKPiAJdWludDhfdCByZXQ7Cj4gCj4gCXJrX25hbmRfcmVhZF9idWYobmFu ZCwgJnJldCwgMSk7Cj4gCj4gCXJldHVybiByZXQ7Cj4gfQo+IAo+IHN0YXRpYyBpbnQgcmtfbmFu ZF9ibG9ja19iYWQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgbG9mZl90IG9mcykKPiB7Cj4gCXN0 cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQobmFuZCk7Cj4gCWludCBwYWdlLCByZXMg PSAwOwo+IAl1MTYgYmFkID0gMHhmZjsKPiAJdTggKmJ1ZiA9IG5hbmRfZ2V0X2RhdGFfYnVmKG5h bmQpOwo+IAlpbnQgY2hpcG5yID0gKGludCkob2ZzID4+IG5hbmQtPmNoaXBfc2hpZnQpOwo+IAo+ IAlwYWdlID0gKGludCkob2ZzID4+IG5hbmQtPnBhZ2Vfc2hpZnQpICYgbmFuZC0+cGFnZW1hc2s7 Cj4gCXJrX25hbmRfc2VsZWN0X2NoaXAobmFuZCwgY2hpcG5yKTsKPiAJaWYgKHJrX25hbmRfaHdf c3luZHJvbWVfZWNjX3JlYWRfcGFnZShuYW5kLCBidWYsIGZhbHNlLCBwYWdlKQo+ID09IC0xKSB7 IC8qIGZpcnN0IHBhZ2Ugb2YgYSBibG9jayovCj4gCQluYW5kX3JlYWRfcGFnZV9vcChuYW5kLCBw YWdlLCBuYW5kLT5iYWRibG9ja3BvcywKPiBOVUxMLCAwKTsgYmFkID0gcmtfbmFuZF9yZWFkX2J5 dGUobmFuZCk7Cj4gCQlpZiAoYmFkICE9IDB4RkYpCj4gCQkJcmVzID0gMTsKPiAJCS8qIHNlY29u ZCBwYWdlIG9mIGEgYmxvY2sqLwo+IAkJbmFuZF9yZWFkX3BhZ2Vfb3AobmFuZCwgcGFnZSArIDEs IG5hbmQtPmJhZGJsb2NrcG9zLAo+IE5VTEwsIDApOyBiYWQgPSBya19uYW5kX3JlYWRfYnl0ZShu YW5kKTsKPiAJCWlmIChiYWQgIT0gMHhGRikKPiAJCQlyZXMgPSAxOwo+IAkJLyogbGFzdCBwYWdl IG9mIGEgYmxvY2sgKi8KPiAJCXBhZ2UgKz0gKChtdGQtPmVyYXNlc2l6ZSAtIG10ZC0+d3JpdGVz aXplKSA+Pgo+IG5hbmQtPmNoaXBfc2hpZnQpOyBwYWdlLS07Cj4gCQluYW5kX3JlYWRfcGFnZV9v cChuYW5kLCBwYWdlLCBuYW5kLT5iYWRibG9ja3BvcywKPiBOVUxMLCAwKTsgYmFkID0gcmtfbmFu ZF9yZWFkX2J5dGUobmFuZCk7Cj4gCQlpZiAoYmFkICE9IDB4RkYpCj4gCQkJcmVzID0gMTsKPiAJ fQo+IAlya19uYW5kX3NlbGVjdF9jaGlwKG5hbmQsIC0xKTsKPiAJcmV0dXJuIHJlczsKPiB9Cj4g Cj4gVGhpcyBhbHNvIHJlcXVpcmVzIGEgcGF0Y2ggZm9yIG5hbmRfYmJ0LmMKPiBBcyBJIHRyeSB0 byBnZXQgdG8gZ2V0IHNvbWUgc2hhcGUgaW4gdGhlIHJlc3Qgb2YgdGhpcyBkcml2ZXIsCj4gSSBo YXZlIGxlZnQgaXQgb3V0IGZvciB2ZXJzaW9uIDEgYW5kIGFzIEkgd2FpdCBmb3Igb3VyIHJlc3Bv bnMgZmlyc3QuCj4gCj4gZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JidC5jCj4gQEAgLTQ4Nyw4ICs0 ODcsMTAgQEAgc3RhdGljIGludCBjcmVhdGVfYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAo+IHVp bnQ4X3QgKmJ1ZiwKPiAJCWludCByZXQ7Cj4gCj4gCQlCVUdfT04oYmQtPm9wdGlvbnMgJiBOQU5E X0JCVF9OT19PT0IpOwo+IAo+IAkJcmV0ID0gc2Nhbl9ibG9ja19mYXN0KG10ZCwgYmQsIGZyb20s IGJ1ZiwgbnVtcGFnZXMpOwo+IAkJaWYgKHRoaXMtPmJsb2NrX2JhZCkKPiAJCQlyZXQgPSB0aGlz LT5ibG9ja19iYWQobXRkLCBmcm9tKTsKPiAJCWVsc2UKPiAJCQlyZXQgPSBzY2FuX2Jsb2NrX2Zh c3QobXRkLCBiZCwgZnJvbSwgYnVmLAo+IG51bXBhZ2VzKTsKPiAKPiAvLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLwo+IAo+IERhdGEgc3RydWN0dXJlcy9QYXJ0aXRpb25zCj4gCj4gVGhlIG1h am9yaXR5IG9mIFJvY2tjaGlwIGRldmljZXMgdXNlIGEgY2xvc2VkIHNvdXJjZSBGVEwgZHJpdmVy LAo+IHNvIHdoZW4gd2Ugd2FudCB0byByZWFkIG9yIHdyaXRlIHdlIG11c3QgZGVhbCB3aXRoIGl0 Lgo+IAo+IEV4YW1wbGUgTVREIHN0cmluZzoKPiBtdGRwYXJ0cz1yazI5eHhuYW5kOgo+IDB4MDAw MDIwMDBAMHgwMDAwMjAwMChtaXNjKSwKPiAweDAwMDA4MDAwQDB4MDAwMDQwMDAoa2VybmVsKSwK PiAweDAwMDA4MDAwQDB4MDAwMEMwMDAoYm9vdCksCj4gMHgwMDAwODAwMEAweDAwMDE0MDAwKHJl Y292ZXJ5KSwKPiAweDAwMEMwMDAwQDB4MDAwMUMwMDAoYmFja3VwKSwKPiAweDAwMDQwMDAwQDB4 MDAwREMwMDAoY2FjaGUpLAo+IDB4MDAzMDAwMDBAMHgwMDExQzAwMCh1c2VyZGF0YSksCj4gMHgw MDAwMjAwMEAweDAwNDFDMDAwKGtwYW5pYyksCj4gMHgwMDIwMDAwMEAweDAwNDFFMDAwKHN5c3Rl bSksCj4gLUAweDAwNjNFMDAwKHVzZXIpIgo+IAo+IFdoZW4gUm9ja2NoaXAgbWVudGlvbnMgYSBz dHJpbmcgbGlrZSB0aGlzIGl0IGhhcyBub3RoaW5nIHRvIGRvCj4gd2l0aCB0aGUgcmVhbCBwb3Np dGlvbiBvbiBOQU5ELiBGVEwgd3JpdGUgd2hlcmUgd2FudHMsCj4gc28gcmVhZGluZyB0aGVyZSBp cyBub3QgdXNlZnVsLgo+IEFsbCBzaXplcyBoYXZlIHRvIGJlIG11bHRpcGxpZWQgYnkgNTEyIGFu ZCBjYXN0ZWQgdG8gKHU2NCkhCj4gQWxsIHBhcnRpdGlvbnMgbmVlZCB0byBjb250YWluIGF0IGxl YXN0IDIgZXJhc2UgYmxvY2tzLgo+IE9uZSBmb3Igbm9ybWFsIHVzZSBhbmQgb25lIHNwYXJlLgoK SSBkb24ndCB0aGluayB0cnlpbmcgdG8gbWltaWMgUm9ja2NoaXAgRlRMIGlzIHdpc2UuIFdlIHdp bGwgbm90IHVzZSB0aGUKRlRMIGluIGEgbWFpbmxpbmUga2VybmVsIGJ1dCB2ZXJ5IGxpa2VseTog VUJJL1VCSUZTLgoKPiAtLS0tLS0tLS0tLS0tLS0tLS0tLQo+IEZsYXNoU2F2ZVBoeUluZm8KPiBS YXdJZGJEYXRhCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAuLi4KPiBGVEwgZGF0YQo+IC4uLgo+ IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gTWFwIGJsb2NrczoKPiArIEwycE1hcEluZm8KPiArIFZl bmRvckJsa0luZm8KPiAKPiBTeXMgaW5mbzoKPiArIHN5c19zYXZlX2RhdGEKPiAKPiBWZW5kb3Ig cGFydGl0aW9uOgo+ICsgc3lzX2V4dF9kYXRhICAgIDAKPiArIGVjdF90YmxfaW5mbyAgIDY0Cj4g KyB2ZW5kb3IgICAgICAgIDI1NiArID8KPiArIEJvb3RDb25maWcgICAgNTEyICsgMAo+ICsgRHJt S2V5SW5mbyAgICA1MTIgKyAxCj4gKyBWZW5kb3IwSW5mbyAgIDUxMiArIDIKPiArIFZlbmRvcjFJ bmZvICAgNTEyICsgMwo+ICsgc3lzICAgICAgICAgICA1MTIgKyA/Cj4gKyBwdWJsaWMga2V5ICAg IDUyMAo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gQmFkIEJsb2NrIE1hcCBUYmwobm90IGNvbXBh dGlibGUgd2l0aCBNVEQpCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiByZXNlcnZlZDogbGFzdCBO QU5EIGJsb2NrIC0gbgo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gCj4gRnJvbSB0aGUgYWJvdmUg ZGlhZ3JhbSBvbmx5IFJhd0lkYkRhdGEgaGFzIHRvIGJlIGxvY2F0ZWQgaW4gdGhlIGZpcnN0Cj4g ZXJhc2UgYmxvY2suCj4gQm9vdCBST00gc2VhcmNoZXMgZm9yIHRoZSB0YWcgSURfSURSVyA9IDB4 RkNEQzhDM0IuCj4gT25seSB0aGUgZmlyc3QgNCBzZWN0aW9ucyAoNCoxMDI0KSBvZiBhIHBhZ2Ug YXJlIHVzZWQuCj4gV2hlbiB3cml0aW5nIG11bHRpcGxlIHBhZ2VzIGV4dHJhIHNwYWNlcyBpbiB0 aGUgZGF0YQo+IGZvciBiZXR3ZWVuIHRoZSBzZWN0aW9ucyBhcmUgcmVxdWlyZWQuCj4gT2xkZXIg Y3B1J3MgKFJLMzA2NikgbWlnaHQgbmVlZCBleHRyYSBSQzQgY29kaW5nLgo+IAo+IEZUTCB1c2Vz IHRoYXQgUmF3SWRiRGF0YSBhcmVhIHVuZm9ydHVuYXRlbHkgYWxzbyB0byBzYXZlIHN0cnVjdAo+ IEZsYXNoU2F2ZVBoeUluZm8uCj4gRm9yIGEgYmFyZSBiYXNpYyBhcHBsaWNhdGlvbiBvbmx5IFJh d0lkYkRhdGEgaXMgbmVlZGVkLgo+IAo+IEZvciB1c2VycyB0aGF0IG1pZ2h0IGNvbnNpZGVyIE1U RCBhcyBhIG9wdGlvbiB0byBkbyBzb21ldGhpbmcgb24gYQo+IFJvY2tjaGlwIE5BTkQKPiBzZWUg dGhlIHNvdXJjZSBjb2RlIGJlbG93IHRvIGdldCBhbiBpbmRpY2F0aW9uIG9mIHdoYXQgaXMgbmVl ZGVkIGZvciBhCj4gdXNlZnVsCj4gc2V0dXAgdG8ganVzdCByZWFkIGFuZCB3cml0ZSBhIGJvb3Rs b2FkZXIgYWxvbmUuIFdyaXRpbmcgb2YgYW55IHVzZXIKPiBwYXJ0aXRpb24KPiBpcyBub3QgZXZl biBpbmNsdWRlZC4KPiBIYXZpbmcgYSBiYXNpYyBNVEQgZHJpdmVyIGlzIGp1c3Qgbm90IGVub3Vn aC4KPiBQbGVhc2UgYWR2aXNlIGlmIHN1Y2ggYSBvdmVyaGVhZCBjYW4gaW50ZXJmYWNlIHdpdGgg TVREPwo+IEhhdmUgZnVuIQo+IAo+IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCj4gCgpb Li4uXQoKPiA+PiArI2RlZmluZSBOQU5EQ19JRF9WNjAwCQkJMHg1NjM2MzAzMAo+ID4+ICsjZGVm aW5lIE5BTkRDX0lEX1Y2MjIJCQkweDU2MzYzMjMyCj4gPj4gKyNkZWZpbmUgTkFORENfSURfVjcw MQkJCTB4NzAxCj4gPj4gKyNkZWZpbmUgTkFORENfSURfVjgwMAkJCTB4NTYzODMwMzAKPiA+PiAr I2RlZmluZSBOQU5EQ19JRF9WODAxCQkJMHg4MDEKPiA+PiArI2RlZmluZSBOQU5EQ19JRF9WOTAw CQkJMHg1NjM5MzAzMCAgCj4gPiAgCj4gCj4gPiBJIHdvdWxkIHByZWZlciBwcmVmaXhpbmcgZXZl cnl0aGluZyBSS19OQU5EQ18gb3IgUktfICAKPiAKPiBXaWxsIGNoYW5nZSBkZWZpbmUgbGlzdCBh Ym92ZSBhbmQgYmVsb3cgdG8gUktfTkFORENfCj4gSXQgdGFrZXMgbW9yZSBzcGFjZSB0aG91Z2gu IEFscmVhZHkgZGlmZmljdWx0IHRvIHN0YXkgYmVsb3cgODAKPiBjaGFyL2xpbmUuCgpEbyB5b3Vy IGJlc3QsIGlmIGl0IGh1cnRzIHJlYWRhYmlsaXR5IHlvdSBtYXkgYnJlYWsgdGhlIDgwIGNoYXJz IHJ1bGUuCk9yIHRyeSB0byB3cml0ZSBpdCBkb3duIGRpZmZlcmVudGx5LgoKClsuLi5dCgo+ID4+ ICtzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyIHsKPiA+PiArCXZvaWQgX19pb21lbSAqcmVnczsK PiA+PiArCWludCBpcnE7Cj4gPj4gKwlzdHJ1Y3QgY2xrICpoY2xrOwo+ID4+ICsJc3RydWN0IGNs ayAqY2xrOwo+ID4+ICsJc3RydWN0IGxpc3RfaGVhZCBjaGlwczsKPiA+PiArCXN0cnVjdCBjb21w bGV0aW9uIGNvbXBsZXRlOwo+ID4+ICsJc3RydWN0IG5hbmRfY29udHJvbGxlciBjb250cm9sbGVy Owo+ID4+ICsJaW50IGJhbmtzW05BTkRDX05VTV9CQU5LU107ICAKPiA+ICAKPiA+PiArCWJvb2wg Ym9vdHJvbWJsb2NrczsKPiA+PiArCWludCBlY2NfbW9kZTsKPiA+PiArCXVpbnQzMl90IGVjY19z dHJlbmd0aDsKPiA+PiArCWludCBtYXhfZWNjX3N0cmVuZ3RoOyAgCj4gPiAgCj4gCj4gPiBJIGhh dmUgbm90IHJlYWQgeWV0IHRoZSBlbnRpcmUgZHJpdmVyIGJ1dCBJIGJlbGlldmUgdGhlIGFib3Zl IDQKPiA+IHBhcmFtZXRlcnMgc2hvdWxkIHByb2JhYmx5IGJlIG1vdmVkIGluIHJrX25hbmRfY2hp cCwgcmlnaHQ/IEFueXRoaW5nCj4gPiB0aGF0IGlzIE5BTkQgY2hpcCByZWxhdGVkIHNob3VsZCBu b3QgYmUgaW4gdGhlIGNvbnRyb2xsZXIKPiA+IHN0cnVjdHVyZS4gSXQgZGVwZW5kcyBpZiB5b3Ug Y2FuIGNoYW5nZSBFQ0MgcmVxdWlyZW1lbnRzIG9uIHRoZSBmbHkKPiA+IG9yIG5vdC4gIAo+IAo+ IFNob3J0IGFuc3dlcjoKPiBUaGUgcmVhc29uIHRoYXQgaXQgaXMgdGhlIG1vc3QgY29udmVuaWVu Y2UgcGxhY2UgdG8gaGF2ZSB0aGVtIGZvciBub3cuCj4gV2l0aCBvbmUgcG9pbnRlciBmcm9tIG5h bmRfZ2V0X2NvbnRyb2xsZXJfZGF0YSgpIEkgaGF2ZSBhbGwgZGF0YQo+IGF2YWlsYWJsZS4KPiAK PiBzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyICpjdHJsID0gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKG5hbmQpOwo+IAo+IFRoZSBFQ0MgaXMgbm93IHNvcnQgb2YgZml4ZWQgdG8gMjQgYW5kIDQw IGZvciBsZWdhY3kgcmVhc29ucy4KPiBUaGUgb2xkZXIgcmszMDY2IGJvb3Ryb20gYXBwYXJlbnRs eSBvbmx5IHdvcmtzIGZvciBlY2MgMjQuCj4gU2VlIGluZm8gYmFzZWQgb24gb2xkZXIgd29yayBi eSBQYXdlxYIgSmFyb3N6IGZvciBVYm9vdC4KPiAKPiBJJ20gbm90IHRvbyBmYW1pbGlhciB3aXRo IGFsbCBpbm5lciB3b3JraW5nIG9mIE1URCwgc28gcGxlYXNlIGFkdmlzZS4KPiBDYW4gdGhlIHVz ZXJzIGdldCBhY2Nlc3MgdG8gc3RydWN0IHJrX25hbmRfY2hpcD8KPiBXb3VsZCB5b3UgbGlrZSB0 byBnaXZlIHVzZXJzIGNvbnRyb2wgb3ZlciB3aGF0IGVjYyB0byB1c2U/CgpJdCBpcyBhbHJlYWR5 IHRoZSBjYXNlOiBEVCBwcm9wZXJ0aWVzIGluIHRoZSBOQU5EIG5vZGUgKHNlZSB0aGUKYmluZGlu Z3MpLiBCdXQgdGhpcyBpcyBhIHN0YXRpYyBpbmZvcm1hdGlvbiwgeW91IGNhbm5vdCBjaGFuZ2Ug aXQgYXQKcnVuIHRpbWUgb2YgY291cnNlLgoKPiBXaGF0IHByb2dyYW0gY2FuIHdlIHVzZSBmb3Ig dGhhdD8gQ2FuJ3QgdXNlIGRkIHRoZW4gYW55IG1vcmUuCgpZb3Ugc2hvdWxkIG5vdCB1c2UgZGQg YXQgYWxsLiBkZCBpcyBmb3IgYmxvY2sgZGV2aWNlcyBvciBjaGFyIGRldmljZXMsCm5vdCBNVEQg ZGV2aWNlcy4gVGhlcmUgaXMgYW4gbXRkLXV0aWxzIHBhY2thZ2Ugb3V0IHRoZXJlIHRoYXQgY292 ZXJzCnByZXR0eSBtdWNoIGFsbCB0aGUgYWN0aW9ucyB5b3Ugd2FudCB0by4KCj4gSG93IGRvIHdl IHJlZ2FpbiBlY2MgY29udHJvbCBpZiB3ZSByZWFsbHkgaGF2ZSB0byBmb3IgZXhhbXBsZSByazMw NjY/Cj4gT3IgcmVtb3ZlIHRoYXQgYm9vdHJvbSBjaGVjayBhbmQgYWx3YXlzIHNldCBFQ0Mgd2l0 aCBldmVyeQo+IHJrX25hbmRjX2h3X3N5bmRyb21lX2VjY19yZWFkX3BhZ2UgYW5kCj4gcmtfbmFu ZGNfaHdfc3luZHJvbWVfZWNjX3dyaXRlX3BhZ2Ugd2l0aCB3aGF0ZXZlciBwYXNzZWQgYWxvbmc/ CgpJIGRvbid0IHVuZGVyc3RhbmQgeW91ciBxdWVzdGlvbi4KCgpbLi4uXQoKPiA+PiArc3RhdGlj IGludCBya19uYW5kY19od19lY2Nfc2V0dXAoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwKPiA+PiAr CQkJCSB1aW50MzJfdCBzdHJlbmd0aCkKPiA+PiArewo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29u dHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ ICsJdWludDMyX3QgcmVnOwo+ID4+ICsKPiA+PiArCW5hbmQtPmVjYy5zdHJlbmd0aCA9IHN0cmVu Z3RoOyAgCj4gCj4gU2hvdWxkIEkgYWRkIHRoaXMgY29tbWVudCBiZWxvdz8KPiAKPiAvKiBIVyBF Q0MgYWx3YXlzIHJlcXVlc3QgRUNDIGJ5dGVzIGZvciAxMDI0IGJ5dGVzIGJsb2NrcyAqLwo+IAo+ ID4+ICsJbmFuZC0+ZWNjLmJ5dGVzID0gRElWX1JPVU5EX1VQKG5hbmQtPmVjYy5zdHJlbmd0aCAq IDE0LAo+ID4+IDgpOyAgCj4gPiAgCj4gCj4gPiBXaGF0IGRvIDE0IGFuZCA4IG1lYW4/ICAKPiAK PiBmbHMgLSBmaW5kIGxhc3QgKG1vc3Qtc2lnbmlmaWNhbnQpIGJpdCBzZXQKPiAKPiBpbnQgZmxz KHVuc2lnbmVkIGludCB4KQo+IHsKPiAJaW50IHIgPSAzMjsKPiAKPiAJaWYgKCF4KQo+IAkJcmV0 dXJuIDA7Cj4gCWlmICghKHggJiAweGZmZmYwMDAwdSkpIHsKPiAJCXggPDw9IDE2Owo+IAkJciAt PSAxNjsKPiAJfQo+IAlpZiAoISh4ICYgMHhmZjAwMDAwMHUpKSB7Cj4gCQl4IDw8PSA4Owo+IAkJ ciAtPSA4Owo+IAl9Cj4gCWlmICghKHggJiAweGYwMDAwMDAwdSkpIHsKPiAJCXggPDw9IDQ7Cj4g CQlyIC09IDQ7Cj4gCX0KPiAJaWYgKCEoeCAmIDB4YzAwMDAwMDB1KSkgewo+IAkJeCA8PD0gMjsK PiAJCXIgLT0gMjsKPiAJfQo+IAlpZiAoISh4ICYgMHg4MDAwMDAwMHUpKSB7Cj4gCQl4IDw8PSAx Owo+IAkJciAtPSAxOwo+IAl9Cj4gCXJldHVybiByOwo+IH0KPiAKPiAJbmFuZC0+ZWNjLmJ5dGVz ID0gRElWX1JPVU5EX1VQKGVjYy0+c3RyZW5ndGggKiBmbHMoOCAqIDEwMjQpLAo+IDgpOwo+IAo+ IGZvcm11bGUgaXMgdXNlZCB0byB0cmFuc2xhdGUgc3RyZW5ndGggaW4gYml0LzEwMjQgQkNIL0VD Qwo+IHRvIE1URCBFQ0MgYnl0ZXMgZm9yIDEwMjQgYnl0ZXMgYmxvY2tzIGluIG5hbmQtPmVjYy5i eXRlcwo+IAo+IDE0IGlzIHJlcGxhY2VtZW50IGZvciBmbHMoOCAqIDEwMjQpCgpUaGlzIGlzIGFi c29sdXRlbHkgZm9yYmlkZGVuIDopIFlvdSBzaG91bGQgbmV2ZXIgaGlkZSB5b3VyIGZpcnN0Cmlu dGVudGlvbiwgMTQgaGVyZSBpcyBhIHZlcnkgYmFkIHBsYWNlaG9sZGVyIGJlY2F1c2Ugd2UgY2Fu bm90IGtub3cKd2hhdCBpdCBtZWFucy4gSSBzdXBwb3NlIHlvdXIgaW50ZW50aW9uIHdhcyB0byBv cHRpbWl6ZSB0aGluZ3MuIGZscygpCmFscmVhZHkgZXhpc3QgaW4gdGhlIGtlcm5lbCwgOCBhbmQg MTAyNCBhcmUgY29uc3RhbnRzIHNvIEdDQyAob3IKd2hhdGV2ZXIgY29tcGlsZXIgeW91IHVzZSkg d2lsbCBvcHRpbWl6ZSB0aGluZ3MgYXMgbXVjaCBhcyBpdCBjYW4uClBsdXMsIGl0IGlzIHJ1biBv bmx5IG9uY2UgaW4gYSBsaWZldGltZSBzbyB0aGVyZSBpcyBub3Qgc28gbXVjaCBnYWluCmFueXdh eS4KCj4gOCBiaXRzIGluIGEgYnl0ZQoKSSB0aGluayB0aGVyZSBpcyBhIG1hY3JvIGZvciB0aGF0 IChvdGhlcndpc2UgaXQgaXMgbm90IGltcG9ydGFudCkKCj4gCj4gPiAgCj4gPj4gKwkvKiBIVyBF Q0Mgb25seSB3b3JrcyB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mIEVDQyBieXRlcyAqLwo+ID4+ICsJ bmFuZC0+ZWNjLmJ5dGVzID0gQUxJR04obmFuZC0+ZWNjLmJ5dGVzLCAyKTsKPiA+PiArCj4gPj4g KwlpZiAoY3RybC0+dmVyc2lvbiA9PSBWRVJTSU9OXzkpIHsKPiA+PiArCQlzd2l0Y2ggKG5hbmQt PmVjYy5zdHJlbmd0aCkgewo+ID4+ICsJCWNhc2UgNzA6Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y5 X0VDQ183MDsKPiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSA2MDoKPiA+PiArCQkJcmVnID0g TkFORENfVjlfRUNDXzYwOwo+ID4+ICsJCQlicmVhazsKPiA+PiArCQljYXNlIDQwOgo+ID4+ICsJ CQlyZWcgPSBOQU5EQ19WOV9FQ0NfNDA7Cj4gPj4gKwkJCWJyZWFrOwo+ID4+ICsJCWNhc2UgMTY6 Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y5X0VDQ18xNjsKPiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJ ZGVmYXVsdDoKPiA+PiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4gPj4gKwkJfQo+ID4+ICsJCXdyaXRl bChyZWcsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjlfQkNIQ1RMKTsKPiA+PiArCX0gZWxzZSB7 Cj4gPj4gKwkJc3dpdGNoIChuYW5kLT5lY2Muc3RyZW5ndGgpIHsKPiA+PiArCQljYXNlIDYwOgo+ ID4+ICsJCQlyZWcgPSBOQU5EQ19WNl9FQ0NfNjA7Cj4gPj4gKwkJCWJyZWFrOwo+ID4+ICsJCWNh c2UgNDA6Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y2X0VDQ180MDsKPiA+PiArCQkJYnJlYWs7Cj4g Pj4gKwkJY2FzZSAyNDoKPiA+PiArCQkJcmVnID0gTkFORENfVjZfRUNDXzI0Owo+ID4+ICsJCQli cmVhazsKPiA+PiArCQljYXNlIDE2Ogo+ID4+ICsJCQlyZWcgPSBOQU5EQ19WNl9FQ0NfMTY7Cj4g Pj4gKwkJCWJyZWFrOwo+ID4+ICsJCWRlZmF1bHQ6Cj4gPj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ ID4+ICsJCX0KPiA+PiArCQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2X0JD SENUTCk7Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4g Pj4gK3N0YXRpYyB2b2lkIHJrX25hbmRjX3hmZXJfc3RhcnQoc3RydWN0IHJrX25hbmRfY29udHJv bGxlciAqY3RybCwKPiA+PiArCQkJCXVpbnQ4X3QgZGlyLCB1aW50OF90IG5fS0IsCj4gPj4gKwkJ CQlkbWFfYWRkcl90IGRtYV9kYXRhLCBkbWFfYWRkcl90Cj4gPj4gZG1hX29vYikgK3sKPiA+PiAr CXVpbnQzMl90IHJlZzsKPiA+PiArCj4gPj4gKwlpZiAoY3RybC0+dmVyc2lvbiA9PSBWRVJTSU9O XzkpIHsKPiA+PiArCQlyZWcgPSBOQU5EQ19WOV9ETUFfQ0ZHX1dSX1NUIHwKPiA+PiArCQkgICAg ICBOQU5EQ19WOV9ETUFfQ0ZHX1dSKGRpcikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9D RkdfQlVTX01PREUgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9DRkdfSFNJWkVfMzIgfAo+ ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9DRkdfQlVSU1RfMTYgfAo+ID4+ICsJCSAgICAgIE5B TkRDX1Y5X0RNQV9DRkdfSU5DUl9OVU0oMTYpOwo+ID4+ICsJCXdyaXRlbChyZWcsIGN0cmwtPnJl Z3MgKyBOQU5EQ19SRUdfVjlfRE1BX0NGRyk7Cj4gPj4gKwkJd3JpdGVsKCh1aW50MzJfdClkbWFf ZGF0YSwgY3RybC0+cmVncyArCj4gPj4gTkFORENfUkVHX1Y5X0RNQV9CVUYwKTsKPiA+PiArCQl3 cml0ZWwoKHVpbnQzMl90KWRtYV9vb2IsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WOV9E TUFfQlVGMSk7ICAKPiA+Cj4gPiBJJ20gcHJldHR5IHN1cmUgbW9zdCBvZiB0aGVzZSB3cml0ZWwg Y291bGQgYmUgdHVybmVkIGludG8KPiA+IHdyaXRlbF9yZWxheGVkLiAgCj4gCj4gd3JpdGVsKCkg ICAgICAgLS0gd3JpdGUgdG8gdGhlIGxpdHRsZS1lbmRpYW4gaGFyZHdhcmUgcmVnaXN0ZXIgd2l0 aAo+IGNvbXBpbGVyIG1lbW9yeSBiYXJyaWVyLAo+IHdyaXRlbF9yZWxheGVkIC0tIGFzIGFib3Zl LCB3aXRob3V0IGJhcnJpZXIsCj4gX19yYXdfd3JpdGVsKCkgLS0gYXMgYWJvdmUgKHdyaXRlbF9y ZWxheGVkKCkpIHdpdGhvdXQgZW5kaWFuZXNzCj4gY29udmVyc2lvbiAoQ1BVIG9yZGVyaW5nIHdp bGwgYmUgdXNlZCkuCj4gQXJjaGl0ZWN0dXJlLWRlcGVuZGVudC4KPiBJIGRvbid0IGtub3cuCgpJ biBtb3N0IG9mIHRoZSBjYXNlcyB5b3UgZG9uJ3QgbmVlZCBhbiBleHBsaWNpdCBiYXJyaWVyICh1 bmxlc3MsIGZvcgppbnN0YW5jZSwgeW91IGFyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gaGFw cGVuIHdpdGggYSBzaG9ydCB0aW1lb3V0KS4KClBsZWFzZSB0cnkgd2l0aCB3cml0ZWxfcmVsYXhl ZCBpbiBtb3N0IG9mIHRoZSBjYXNlcy4KCj4gCj4gPgo+ID4gQWxzbyBJIGFtIG5vdCBhIGJpZyBm YW4gb2YgdGhlc2UgY2FzdHMsIG1heWJlIHlvdSBzaG91bGQgY2hhbmdlCj4gPiBkbWFfZGF0YSBh bmQgZG1hX29vYiB0eXBlcyAoYmUgY2FyZWZ1bDogeW91IGVuYWJsZWQgQ09NUElMRV9URVNUIGlu Cj4gPiBLY29uZmlnLCB5b3UgbXVzdCBzdXBwb3J0IDMyLWJpdCBhbmQgNjQtYml0IHBvaW50ZXJz LCBwbGVhc2UgdHJ5IHRvCj4gPiBjb21waWxlIHRoaXMgZHJpdmVyIHdpdGggZGlmZmVyZW50IHRv b2xjaGFpbnMpLiAgCj4gCj4gRHJpdmVyIGlzIHVzZWQgZm9yIGJvdGggQVJNIGFzIGFybTY0Lgo+ IFRoZXNlIHJlZ2lzdGVycyBhcmUgMzIgYml0LiBQbGVhc2UgYWR2aXNlIHdoYXQgaGFwcGVucwo+ IHdoZW4gd3JpdGVsIGdldHMgZG1hX2FkZHJfdCBhbmQgZG1hX2RhdGEgYXMgNjQgYml0Lgo+IERv bid0IGhhdmUgdGhlIGhhcmR3YXJlIHRvIGZpbmQgb3V0LgoKWW91IGRvbid0IG5lZWQgaGFyZHdh cmUsIGp1c3QgYSAzMi1iaXQgYW5kIGEgNjQtYml0IHRvb2xjaGFpbi4gV2UganVzdAp3YW50IHRv IGF2b2lkIGNhc3RzIGFuZCBidWlsZCB3YXJuaW5ncy4KCj4gCj4gPiAgCj4gPj4gKwo+ID4+ICsJ CXJlZyA9IE5BTkRDX1Y5X0ZMX0RJUihkaXIpIHwKPiA+PiArCQkgICAgICBOQU5EQ19WOV9GTF9Y RkVSX0VOIHwKPiA+PiArCQkgICAgICBOQU5EQ19WOV9GTF9YRkVSX0NPVU5UIHwKPiA+PiArCQkg ICAgICBOQU5EQ19WOV9GTF9BQ09SUkVDVCB8Cj4gPj4gKwkJICAgICAgTkFORENfVjlfRkxfUEFH RV9OVU0obl9LQikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0ZMX0FTWU5DX1RPR19NSVg7Cj4g Pj4gKwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WOV9GTENUTCk7Cj4gPj4g KwkJcmVnIHw9IE5BTkRDX1Y5X0ZMX1hGRVJfU1RBUlQ7Cj4gPj4gKwkJd3JpdGVsKHJlZywgY3Ry bC0+cmVncyArIE5BTkRDX1JFR19WOV9GTENUTCk7Cj4gPj4gKwl9IGVsc2Ugewo+ID4+ICsJCXJl ZyA9IHJlYWRsKGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjZfQkNIQ1RMKTsKPiA+PiArCQlyZWcg PSAocmVnICYgKH4oTkFORF9WNl9CQ0hfUkVHSU9OX00gPDwKPiA+PiArCQkJCU5BTkRfVjZfQkNI X1JFR0lPTl9TKSkpIHwKPiA+PiArCQkgICAgICAoY3RybC0+c2VsZWN0ZWRfYmFuayA8PAo+ID4+ IE5BTkRfVjZfQkNIX1JFR0lPTl9TKTsKPiA+PiArCQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsg TkFORENfUkVHX1Y2X0JDSENUTCk7Cj4gPj4gKwo+ID4+ICsJCXJlZyA9IE5BTkRDX1Y2X0RNQV9D RkdfV1JfU1QgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y2X0RNQV9DRkdfV1IoZGlyKSB8Cj4gPj4g KwkJICAgICAgTkFORENfVjZfRE1BX0NGR19CVVNfTU9ERSB8Cj4gPj4gKwkJICAgICAgTkFORENf VjZfRE1BX0NGR19IU0laRV8zMiB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRE1BX0NGR19CVVJT VF8xNiB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRE1BX0NGR19JTkNSX05VTSgxNik7Cj4gPj4g KwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9ETUFfQ0ZHKTsKPiA+PiAr CQl3cml0ZWwoZG1hX2RhdGEsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WNl9ETUFfQlVG MCk7Cj4gPj4gKwkJd3JpdGVsKGRtYV9vb2IsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19W Nl9ETUFfQlVGMSk7ICAKPiAKPiBTYW1lIGhlcmUuCj4gCj4gPj4gKwo+ID4+ICsJCXJlZyA9IE5B TkRDX1Y2X0ZMX0RJUihkaXIpIHwKPiA+PiArCQkgICAgICBOQU5EQ19WNl9GTF9YRkVSX0VOIHwK PiA+PiArCQkgICAgICBOQU5EQ19WNl9GTF9YRkVSX0NPVU5UIHwKPiA+PiArCQkgICAgICBOQU5E Q19WNl9GTF9BQ09SUkVDVCB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRkxfUEFHRV9OVU0obl9L QikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y2X0ZMX0FTWU5DX1RPR19NSVg7Cj4gPj4gKwkJd3Jp dGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9GTENUTCk7Cj4gPj4gKwkJcmVnIHw9 IE5BTkRDX1Y2X0ZMX1hGRVJfU1RBUlQ7Cj4gPj4gKwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyAr IE5BTkRDX1JFR19WNl9GTENUTCk7Cj4gPj4gKwl9Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRp YyBpbnQgcmtfbmFuZGNfd2FpdF9mb3JfeGZlcl9kb25lKHN0cnVjdCBya19uYW5kX2NvbnRyb2xs ZXIKPiA+PiAqY3RybCkgK3sKPiA+PiArCXVpbnQzMl90IHJlZzsKPiA+PiArCWludCByZXQ7Cj4g Pj4gKwo+ID4+ICsJaWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJdm9p ZCBfX2lvbWVtICpwdHIgPSBjdHJsLT5yZWdzICsKPiA+PiBOQU5EQ19SRUdfVjlfRkxDVEw7ICsK PiA+PiArCQlyZXQgPSByZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljKHB0ciwgcmVnLAo+ID4+ICsJ CQkJCQlyZWcgJgo+ID4+IE5BTkRDX1Y5X0ZMX1hGRVJfUkVBRFksCj4gPj4gKwkJCQkJCTEsCj4g Pj4gTkFORENfREVGX1RJTUVPVVQpOwo+ID4+ICsJfSBlbHNlIHsKPiA+PiArCQl2b2lkIF9faW9t ZW0gKnB0ciA9IGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WNl9GTENUTDsgKwo+ID4+ICsJ CXJldCA9IHJlYWRsX3BvbGxfdGltZW91dF9hdG9taWMocHRyLCByZWcsCj4gPj4gKwkJCQkJCXJl ZyAmCj4gPj4gTkFORENfVjZfRkxfWEZFUl9SRUFEWSwKPiA+PiArCQkJCQkJMSwKPiA+PiBOQU5E Q19ERUZfVElNRU9VVCk7Cj4gPj4gKwl9ICAKPiA+Cj4gPiBTcGFjZQo+ID4gIAo+ID4+ICsJaWYg KHJldCkKPiA+PiArCQlwcl9lcnIoInRpbWVvdXQgcmVnPSV4XG4iLCByZWcpOwo+ID4+ICsKPiA+ PiArCXJldHVybiByZXQ7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB1bnNpZ25lZCBsb25n IHJrX25hbmRjX2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+PiArCQl2b2lk ICpwdHIsIGludCBzaXplLCBpbnQgZGlyKSAgCj4gPiAgCj4gCj4gPiBVbmFsaWduZWQgcGFyYW1l dGVycyAgCj4gCj4gVG8gcmVzdHlsZSBJIHVzZToKPiBhc3R5bGUgLVQ4IC0tbWF4LWNvZGUtbGVu Z3RoPTgwIC0tc3R5bGU9bGludXggcm9ja2NoaXBfbmFuZGMuYwo+IAo+IFBsZWFzZSBhZHZpc2Ug Zm9yIGEgYmV0dGVyIHNvbHV0aW9uLgoKSSBkb24ndCBrbm93IGFzdHlsZSwgYnV0IHRoaXMgd291 bGQgY2VydGFpbmx5IHRyaWdnZXIgYSBjaGVja3BhdGNoLnBsCndhcm5pbmcuIEp1c3QgY2hlY2sg dGhlbSBhbmQgY29ycmVjdCB0aGVtIGJ5IGhhbmQuCgo+IAo+ID4gIAo+ID4+ICt7Cj4gPj4gKyNp ZmRlZiBDT05GSUdfQVJNNjQKPiA+PiArCV9fZG1hX21hcF9hcmVhKCh2b2lkICopcHRyLCBzaXpl LCBkaXIpOwo+ID4+ICsJcmV0dXJuICgodW5zaWduZWQgbG9uZyl2aXJ0X3RvX3BoeXMoKHZvaWQg KilwdHIpKTsKPiA+PiArI2Vsc2UKPiA+PiArCXJldHVybiBkbWFfbWFwX3NpbmdsZShkZXYsICh2 b2lkICopcHRyLCBzaXplLCBkaXIpOwo+ID4+ICsjZW5kaWYgIAo+ID4gIAo+IAo+ID4gUGxlYXNl IHRyeSB0byByZW1vdmUgdGhlc2UgI2lmZGVmcywgSSBkb24ndCBrbm93IHdoeSB3b3VsZCB5b3Ug bmVlZAo+ID4gdGhlIGZvcm1lciBibG9jaz8gIAo+IAo+IFRoaXMgZHJpdmVyIGlzIHVzZWQgYm90 aCBmb3IgQVJNIGFzIGFybTY0Lgo+IE9yaWdpbmFsIGZyb20gUm9ja2NoaXA6IGFybTY0IGRvZXNu J3QgaGF2ZSBkbWFfbWFwX3NpbmdsZSgpIGFzIEkKPiByZW1lbWJlci4gRG9uJ3Qga25vdyB3aGF0 IHRvIHVzZSBpbnN0ZWFkLgo+IFBsZWFzZSBhZHZpc2UuCgpJIGFtIG5vdCBhd2FyZSBvZiBzdWNo IGEgbGltaXRhdGlvbi4gUGxlYXNlIGNoZWNrIGFnYWluLgoKPiAKPiA+ICAKPiA+PiArfQo+ID4+ ICsKPiA+PiArc3RhdGljIHZvaWQgcmtfbmFuZGNfZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2 aWNlICpkZXYsCj4gPj4gKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHB0ciwgaW50Cj4gPj4gc2l6 ZSwgaW50IGRpcikgK3sKPiA+PiArI2lmZGVmIENPTkZJR19BUk02NAo+ID4+ICsJX19kbWFfdW5t YXBfYXJlYShwaHlzX3RvX3ZpcnQocHRyKSwgc2l6ZSwgZGlyKTsKPiA+PiArI2Vsc2UKPiA+PiAr CWRtYV91bm1hcF9zaW5nbGUoZGV2LCAoZG1hX2FkZHJfdClwdHIsIHNpemUsIGRpcik7Cj4gPj4g KyNlbmRpZiAgCj4gPgo+ID4gU2FtZQo+ID4gIAo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMg aW50IHJrX25hbmRjX2h3X3N5bmRyb21lX2VjY19yZWFkX3BhZ2Uoc3RydWN0IG5hbmRfY2hpcAo+ ID4+ICpuYW5kLAo+ID4+ICsJCXVpbnQ4X3QgKmJ1ZiwKPiA+PiArCQlpbnQgb29iX3JlcXVpcmVk LCBpbnQgcGFnZSkgIAo+ID4gIAo+IAo+ID4gVW5hbGlnbmVkIHBhcmFtZXRlcnMgKHBsZWFzZSBj aGVjayBhbGwgb2YgdGhlbSkuICAKPiAKPiBBZ2FpbiBibGFtZSBhc3R5bGUgLi4uCj4gQWZ0ZXIg Y29ycmVjdGluZyBpdCBtYW51YWxseSBhIGZldyB0aW1lIEkganVzdCBsZWZ0IGl0IGFzIGl0IGlz Lgo+IAo+ID4gIAo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9f bXRkKG5hbmQpOwo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ICsJc3RydWN0IG5hbmRfZWNjX2N0 cmwgKmVjYyA9ICZuYW5kLT5lY2M7Cj4gPj4gKwlpbnQgbWF4X2JpdGZsaXBzID0gMDsKPiA+PiAr CWRtYV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9vb2I7Cj4gPj4gKwlpbnQgcmV0LCBpOwo+ID4+ICsJ aW50IGJjaF9zdDsKPiA+PiArCWludCBkbWFfb29iX3NpemUgPSBlY2MtPnN0ZXBzICogMTI4Owo+ ID4+ICsJaW50IHBhZ2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXpl Owo+ID4+ICsKPiA+PiArCXJrX25hbmRjX3NlbGVjdF9jaGlwKG5hbmQsIGN0cmwtPnNlbGVjdGVk X2JhbmspOwo+ID4+ICsKPiA+PiArCWlmICgocGFnZSA8IHBhZ2VzX3Blcl9ibGsgKiBOQU5EQ19J REJSZXNCbGtOdW0pICYmICAKPiA+ICAKPiAKPiA+IENhbWVsIGNhc2UgaXMgdXN1YWxseSBub3Qg d2VsY29tZSAgCj4gCj4gQW55IHN1Z2dlc3Rpb25zIGZvciBhIGJldGVyIHJlcGxhY2UgZm9yIE5B TkRDX0lEQlJlc0Jsa051bSBhcmUKPiB3ZWxjb21lLgoKU09NRVRISU5HX0xpa2VUaGlzIC0+IFNP TUVUSElOR19MSUtFX1RISVMKCj4gCj4gPiAgCj4gPj4gKwkgICAgY3RybC0+Ym9vdHJvbWJsb2Nr cykgIAo+ID4KPiA+IFRoaXMgd291bGQgcHJvYmFibHkgZGVzZXJ2ZSBhIGhlbHBlcgo+ID4gIAo+ ID4+ICsJCXJrX25hbmRjX2h3X2VjY19zZXR1cChuYW5kLCBOQU5EQ19JREJFY2NCaXRzKTsKPiA+ PiArCj4gPj4gKwluYW5kX3JlYWRfcGFnZV9vcChuYW5kLCBwYWdlLCAwLCBOVUxMLCAwKTsKPiA+ PiArCj4gPj4gKwlkbWFfZGF0YSA9IHJrX25hbmRjX2RtYV9tYXBfc2luZ2xlKG10ZC0+ZGV2LnBh cmVudCwKPiA+PiArCQkJCQkgICBjdHJsLT5wYWdlX2J1ZiwKPiA+PiBtdGQtPndyaXRlc2l6ZSwK PiA+PiArCQkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsJZG1hX29vYiA9IHJrX25hbmRj X2RtYV9tYXBfc2luZ2xlKG10ZC0+ZGV2LnBhcmVudCwKPiA+PiArCQkJCQkgIGN0cmwtPm9vYl9i dWYsCj4gPj4gZG1hX29vYl9zaXplLAo+ID4+ICsJCQkJCSAgRE1BX0ZST01fREVWSUNFKTsKPiA+ PiArCj4gPj4gKwlpbml0X2NvbXBsZXRpb24oJmN0cmwtPmNvbXBsZXRlKTsgIAo+ID4gIAo+IAo+ ID4gT25lIGluaXRfY29tcGxldGlvbiBpcyBuZWVkZWQgKGluIHRoZSBwcm9iZSwgcHJvYmFibHkp IHRoZW4gcGxlYXNlCj4gPiB1c2UgcmVpbml0X2NvbXBsZXRpb24oKS4gIAo+IAo+IE11c3Qgc3R1 ZHkgdGhpcyBsYXRlci4KPiAKPiA+ICAKPiA+PiArCWlmIChjdHJsLT52ZXJzaW9uID09IFZFUlNJ T05fOSkKPiA+PiArCQl3cml0ZWwoTkFORENfVjlfSU5UX0RNQSwgY3RybC0+cmVncyArCj4gPj4g TkFORENfUkVHX1Y5X0lOVEVOKTsKPiA+PiArCWVsc2UKPiA+PiArCQl3cml0ZWwoTkFORENfVjZf SU5UX0RNQSwgY3RybC0+cmVncyArCj4gPj4gTkFORENfUkVHX1Y2X0lOVEVOKTsKPiA+PiArCXJr X25hbmRjX3hmZXJfc3RhcnQoY3RybCwgMCwgZWNjLT5zdGVwcywgZG1hX2RhdGEsCj4gPj4gZG1h X29vYik7ICAKPiAKPiA+PiArCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY3RybC0+Y29t cGxldGUsCj4gPj4gbXNlY3NfdG9famlmZmllcyg1KSk7Cj4gPj4gKwlya19uYW5kY193YWl0X2Zv cl94ZmVyX2RvbmUoY3RybCk7ICAKPiA+Cj4gPiBZb3VzIHNob3VsZCBjaGVjayB0aGUgcmV0dXJu IHN0YXR1cyBvZiBhbG1vc3QgYWxsIHRoZSBmdW5jdGlvbnMKPiA+IGhlcmUuICAKPiAKPiBQbGVh c2UgYWR2aXNlIHdoYXQgRVJST1IgY29kZSBzaG91bGQgYmUgcmV0dXJuZWQgaGVyZQo+IHRoYXQg aXMgY29tcGF0aWJsZSB3aXRoIE1URC4KCkFzIGEgZ2VuZXJhbCBydWxlLCBwbGVhc2UgY2hlY2sg dGhlIGRyaXZlcnMgd2hpY2ggaGF2ZSBiZWVuIHVwZGF0ZWQKcmVjZW50bHkgd2l0aCBnaXQgbG9n IC0tb25lLWxpbmUgLS0gZHJpdmVycy9tdGQvbmFuZC9yYXcvCgotPiBtYXJ2ZWxsLCBhdG1lbCwg ZnNtYywgc3VueGksIHN0bSwgY2FkZW5jZSwgZXRjCgpJbiB0aGlzIGNhc2UsIHlvdSBjYW4gcmV0 dXJuIHRoZSBlcnJvciBjb2RlIG9mIHRoZSBmYWlsaW5nIGZ1bmN0aW9uCndpdGggYSBzaW1wbGU6 CgoJcmV0ID0gZnVuYygpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoKSSBleHBlY3QgdGhlIHJr X25hbmRjX3dpYXRfZm9yX3hmZXJfZG9uZSgpIGhlbHBlciB0byByZXR1cm4gLUVUSU1FRE9VVApp biBjYXNlIG9mIHRpbWVvdXQuCgo+IAo+ID4gIAo+ID4+ICsJcmtfbmFuZGNfZG1hX3VubWFwX3Np bmdsZShtdGQtPmRldi5wYXJlbnQsIGRtYV9kYXRhLAo+ID4+IG10ZC0+d3JpdGVzaXplLAo+ID4+ ICsJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsJcmtfbmFuZGNfZG1hX3VubWFwX3Npbmds ZShtdGQtPmRldi5wYXJlbnQsIGRtYV9vb2IsCj4gPj4gZG1hX29vYl9zaXplLAo+ID4+ICsJCQkJ ICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsKPiA+PiArCW1lbWNweShidWYsIGN0cmwtPnBhZ2Vf YnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gPj4gKwo+ID4+ICsJaWYgKG9vYl9yZXF1aXJlZCkgewo+ ID4+ICsJCXVpbnQ4X3QgKm9vYjsKPiA+PiArCQl1aW50MzJfdCB0bXA7ICAKPiA+ICAKPiAKPiA+ IFBsZWFzZSB1c2UgdTgsIHUxNiBhbmQgdTMyIHR5cGVzLiAgCj4gCj4gU2hvdWxkIHRoaXMgYmUg Y2hhbmdlZCBmb3IgdGhlIGVudGlyZSBzb3VyY2U/CgpZZXMsIGNoZWNrcGF0Y2gucGwgd2lsbCB3 YXJuIHlvdSBhYm91dCB0aGlzIHRvby4gdWludDx4Pl90IHR5cGVzIGFyZQpkZXByZWNhdGVkLgoK PiAKPiA+ICAKPiA+PiArCj4gPj4gKwkJZm9yIChpID0gMDsgaSA8IGVjYy0+c3RlcHM7IGkrKykg ewo+ID4+ICsJCQlvb2IgPSBuYW5kLT5vb2JfcG9pICsKPiA+PiArCQkJICAgICAgaSAqIChlY2Mt PmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCk7Cj4gPj4gKwkJCWlmIChjdHJsLT52ZXJzaW9uID09 IFZFUlNJT05fOSkgewo+ID4+ICsJCQkJdG1wID0gY3RybC0+b29iX2J1ZltpXTsKPiA+PiArCQkJ fSBlbHNlIHsKPiA+PiArCQkJCXVpbnQ4X3Qgb29iX3N0ZXAgPQo+ID4+IChjdHJsLT5lY2NfbW9k ZSA8PSAyNCkgPwo+ID4+ICsJCQkJCQkgICA2NCA6IDEyODsKPiA+PiArCQkJCXRtcCA9IGN0cmwt Pm9vYl9idWZbaSAqIG9vYl9zdGVwCj4gPj4gLyA0XTsKPiA+PiArCQkJfQo+ID4+ICsJCQkqb29i KysgPSAodWludDhfdCl0bXA7Cj4gPj4gKwkJCSpvb2IrKyA9ICh1aW50OF90KSh0bXAgPj4gOCk7 Cj4gPj4gKwkJCSpvb2IrKyA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwo+ID4+ICsJCQkqb29iKysg PSAodWludDhfdCkodG1wID4+IDI0KTsKPiA+PiArCQl9Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJ aWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJZm9yIChpID0gMDsgaSA8 IGVjYy0+c3RlcHMgLyAyOyBpKyspIHsKPiA+PiArCQkJYmNoX3N0ID0gcmVhZGwoY3RybC0+cmVn cyArCj4gPj4gTkFORENfUkVHX1Y5X0JDSFNUICsgaSAqIDQpOwo+ID4+ICsJCQlpZiAoYmNoX3N0 ICYgTkFORENfVjlfQkNIMF9TVF9FUlIgfHwKPiA+PiArCQkJICAgIGJjaF9zdCAmIE5BTkRDX1Y5 X0JDSDFfU1RfRVJSKSB7Cj4gPj4gKwkJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiA+PiAr CQkJCW1heF9iaXRmbGlwcyA9IC0xOwo+ID4+ICsJCQl9IGVsc2Ugewo+ID4+ICsJCQkJcmV0ID0K PiA+PiBOQU5EQ19WOV9FQ0NfRVJSX0NOVDAoYmNoX3N0KTsKPiA+PiArCQkJCW10ZC0+ZWNjX3N0 YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gPj4gKwkJCQltYXhfYml0ZmxpcHMgPSBtYXhfdCh1bnNp Z25lZCBpbnQsCj4gPj4gKwo+ID4+IG1heF9iaXRmbGlwcywgcmV0KTsgKwo+ID4+ICsJCQkJcmV0 ID0KPiA+PiBOQU5EQ19WOV9FQ0NfRVJSX0NOVDEoYmNoX3N0KTsKPiA+PiArCQkJCW10ZC0+ZWNj X3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gPj4gKwkJCQltYXhfYml0ZmxpcHMgPSBtYXhfdCh1 bnNpZ25lZCBpbnQsCj4gPj4gKwo+ID4+IG1heF9iaXRmbGlwcywgcmV0KTsKPiA+PiArCQkJfQo+ ID4+ICsJCX0KPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwkJZm9yIChpID0gMDsgaSA8IGVjYy0+c3Rl cHMgLyAyOyBpKyspIHsKPiA+PiArCQkJYmNoX3N0ID0gcmVhZGwoY3RybC0+cmVncyArCj4gPj4g TkFORENfUkVHX1Y2X0JDSFNUICsgaSAqIDQpOwo+ID4+ICsJCQlpZiAoYmNoX3N0ICYgTkFORENf VjZfQkNIMF9TVF9FUlIgfHwKPiA+PiArCQkJICAgIGJjaF9zdCAmIE5BTkRDX1Y2X0JDSDFfU1Rf RVJSKSB7Cj4gPj4gKwkJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiA+PiArCQkJCW1heF9i aXRmbGlwcyA9IC0xOyAgCj4gPiAgCj4gCj4gPiBXaHkgbm90IHVzaW5nIHJldCA9ICQocmVhbCBl cnJvcikgaW5zdGVhZCBvZiB1c2luZyBtYXhfYml0ZmxpcHMKPiA+IGhlcmU/Cj4gPgo+ID4gVGhl bjoKPiA+Cj4gPiAJaWYgKHJldCkgeyAgCj4gCj4gPiAJCWRldl9lcnIoKTsgIAo+IAo+IERvIHlv dSByZWFsbHkgd2FudCB0byBsaXR0ZXIgdGhlIGtlcm5lbCBsb2cgd2l0aCBlYWNoIHRpbWUgeW91 IGhpdCBhCj4gYmFkIGJsb2NrLAo+IGluIGNhc2UgeW91IHVzZSB0aGlzIGZ1bmN0aW9uIGluIGEg c2VhcmNoIGJhZCBibG9jayBsb29wPwo+IERvbid0IHRoaW5rcyBzbyAuLi4KPiBQbGVhc2UgYWR2 aXNlLgoKQWN0dWFsbHkgSSB0aGluayB0aGF0IEkgd2FzIHNpbXBsaWZ5aW5nIHlvdXIgY29kZSBi dXQgeW91IGFyZSByaWdodCB0aGF0CnRoaXMgZGV2X2VyciBoYXMgdG8gYmUgcmVtb3ZlZC4KCj4g Cj4gPiAJCXJldHVybiByZXQ7Cj4gPiAJfQo+ID4KPiA+IAlyZXR1cm4gbWF4X2JpdGZsaXBzOyAg Cj4gCj4gcmtfbmFuZGNfaHdfc3luZHJvbWVfZWNjX3JlYWRfcGFnZSgpIGlzIHVzZWQgaW4gYSBi YWQgYmxvY2sgc2VhcmNoCj4gc3RyYXRlZ3kuIEkgdGhpbmsgbWF4X2JpdGZsaXBzID0gLTEgd2Fz IGNob3NlbiBhcyBhIHNhdmVyIHZhbHVlIHRvCj4gcmV0dXJuLiBQbGVhc2UgYWR2aXNlIHdoYXQg bnVtYmVyIHJhbmdlIE1URCBpbnRlcnByZXRzIGFzCj4gbWF4X2JpdGZsaXBzIG9yIGFzIGZhdWx0 LiBBbHNvIGNvbnNpZGVyIHNvbWUgdW5jb250cm9sbGVkIHN0YXR1cwo+IHJldHVybiB2YWx1ZSwg aXQgd291bGQgYmUgYmV0dGVyIGlmIHdlCj4gYXJlIGluIGNvbnRyb2wgb2Ygd2hhdCBnb2VzIHJl dHVybi4KCm1heF9iaXRmbGlwIGlzIGEgbG9jYWwgdmFyaWFibGUsIEknbSBqdXN0IHNheWluZyB0 aGF0IHVzaW5nIG1heF9iaXRmbGlwCnRvIHNhdmUgYW4gZXJyb3IgY29kZSBpcyBiYWQuCgpZb3Ug Y2FuIGNoZWNrIHdoYXQgb3RoZXIgZHJpdmVycyBkby4KCj4gCj4gPiAgCj4gPj4gKwkJCX0gZWxz ZSB7Cj4gPj4gKwkJCQlyZXQgPQo+ID4+IE5BTkRDX1Y2X0VDQ19FUlJfQ05UMChiY2hfc3QpOwo+ ID4+ICsJCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHJldDsKPiA+PiArCQkJCW1heF9i aXRmbGlwcyA9IG1heF90KHVuc2lnbmVkIGludCwKPiA+PiArCj4gPj4gbWF4X2JpdGZsaXBzLCBy ZXQpOyArCj4gPj4gKwkJCQlyZXQgPQo+ID4+IE5BTkRDX1Y2X0VDQ19FUlJfQ05UMShiY2hfc3Qp Owo+ID4+ICsJCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHJldDsKPiA+PiArCQkJCW1h eF9iaXRmbGlwcyA9IG1heF90KHVuc2lnbmVkIGludCwKPiA+PiArCj4gPj4gbWF4X2JpdGZsaXBz LCByZXQpOwo+ID4+ICsJCQl9Cj4gPj4gKwkJfQo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWlmICht YXhfYml0ZmxpcHMgPT0gLTEpIHsKPiA+PiArCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwKPiA+ PiArCQkJInJlYWRfcGFnZSAleCAleCAleCAleCAleCAlcCAleFxuIiwKPiA+PiArCQkJcGFnZSwK PiA+PiArCQkJbWF4X2JpdGZsaXBzLAo+ID4+ICsJCQliY2hfc3QsCj4gPj4gKwkJCSgodWludDMy X3QgKilidWYpWzBdLAo+ID4+ICsJCQkoKHVpbnQzMl90ICopYnVmKVsxXSwKPiA+PiArCQkJYnVm LAo+ID4+ICsJCQkodWludDMyX3QpZG1hX2RhdGEpOyAgCj4gPiAgCgpbLi4uXQoKPiA+PiArCj4g Pj4gKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgbGVuOyBvZmZzKyspCj4gPj4gKwkJYnVmW29mZnNd ID0gcmVhZGIoYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHZvaWQgcmtf bmFuZGNfd3JpdGVfYnVmKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsCj4gPj4gKwkJCSAgICAgICBj b25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBya19uYW5k X2NvbnRyb2xsZXIgKmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsK PiA+PiArCWludCBvZmZzID0gMDsKPiA+PiArCXZvaWQgX19pb21lbSAqYmFua19iYXNlID0gY3Ry bC0+cmVncyArIE5BTkRDX1JFR19CQU5LMCArCj4gPj4gKwkJCQkgIGN0cmwtPnNlbGVjdGVkX2Jh bmsgKiAweDEwMDsKPiA+PiArCj4gPj4gKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgbGVuOyBvZmZz KyspCj4gPj4gKwkJd3JpdGViKGJ1ZltvZmZzXSwgYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsK PiA+PiArc3RhdGljIHZvaWQgcmtfbmFuZGNfd3JpdGVfY21kKHN0cnVjdCBuYW5kX2NoaXAgKm5h bmQsIHVpbnQ4X3QKPiA+PiBjbWQpICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVy ICpjdHJsID0KPiA+PiBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEobmFuZCk7ICsKPiA+PiArCXZv aWQgX19pb21lbSAqYmFua19iYXNlID0gY3RybC0+cmVncyArIE5BTkRDX1JFR19CQU5LMCArCj4g Pj4gKwkJCQkgIGN0cmwtPnNlbGVjdGVkX2JhbmsgKiAweDEwMCArCj4gPj4gKwkJCQkgIE5BTkRD X1JFR19DTUQ7ICAKPiA+ICAKPiAKPiA+IFlvdSBtaWdodCB3YW50IHRvIHdyaXRlIGFuIGhlbHBl ciB0byBjYWxjdWxhdGUgYmFua19iYXNlLCB0byBhdm9pZAo+ID4gcmVwZWF0aW5nIHRoZXNlIGxp bmVzLiAgCj4gCj4gRXZlbiB3aXRoIGEgc2VwYXJhdGUgZGVmaW5lIG9yIGhlbHBlciBmdW5jdGlv biBJIHN0aWxsIGhhdmUgdG8gc3VwcGx5Cj4gbXkgcmVnLCBzZWxlY3RlZF9iYW5rIGFuZCBvZmZz ZXQuIEl0IGRvZXNuJ3QgbWFrZSB0aGluZ3MgY2xlYW5lcgo+IHB1bXBpbmcgZGF0ZQo+IHRvIGFu ZCBmcm9tIGEgaGVscGVyIG9yIG5laXRoZXIgZG9lc24ndCBpdCBzaG9ydGVuIG15IHNvdXJjZSB3 aXRoIGEKPiBkZWZpbmUuIFRlbmQgdG8ga2VlcCBpdCBhcyBpdCBpcyBmb3Igbm93LiBJZiB5b3Ug YWdyZWUgb2YgY291cnNlLgoKI2RlZmluZSBSS19SRUcoY3RybCwgb2ZmKSBcCgkoY3RybCktPnJl Z3MgKyBcCglOQU5EQ19SRUdfQkFOSzAgKyBcCgkoY3RybCktPnNlbGVjdGVkX2JhbmsgKiBCQU5L X1NJWkUgKyBcCgkob2ZmKQoKI2RlZmluZSBSS19SRUdfQ01EKGN0cmwpIFJLX1JFRyhjdHJsLCBO QU5EQ19SRUdfQ01EKQoKPiAKPiA+ICAKPiA+PiArCj4gPj4gKwl3cml0ZWIoY21kLCBiYW5rX2Jh c2UpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCBya19uYW5kY193cml0ZV9hZGRy KHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsIHVpbnQ4X3QKPiA+PiBhZGRyKSArewo+ID4+ICsJc3Ry dWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKG5hbmQpOyArCj4gPj4gKwl2b2lkIF9faW9tZW0gKmJhbmtfYmFzZSA9IGN0cmwtPnJlZ3Mg KyBOQU5EQ19SRUdfQkFOSzAgKwo+ID4+ICsJCQkJICBjdHJsLT5zZWxlY3RlZF9iYW5rICogMHgx MDAgKwo+ID4+ICsJCQkJICBOQU5EQ19SRUdfQUREUjsKPiA+PiArCj4gPj4gKwl3cml0ZWIoYWRk ciwgYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19k ZXZfcmVhZHkoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKPiA+PiArewo+ID4+ICsJc3RydWN0IHJr X25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5h bmQpOyArCj4gPj4gKwlpZiAocmVhZGwoY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9GTUNUTCkg Jgo+ID4+IE5BTkRDX1Y2X0ZNX0ZSRUFEWSkKPiA+PiArCQlyZXR1cm4gMTsKPiA+PiArCj4gPj4g KwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19vb2Js YXlvdXRfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQKPiA+PiBzZWN0aW9uLAo+ID4+ICsJ CQkJICBzdHJ1Y3QgbXRkX29vYl9yZWdpb24KPiA+PiAqb29icmVnaW9uKSArewo+ID4+ICsJc3Ry dWN0IG5hbmRfY2hpcCAqbmFuZCA9IG10ZF90b19uYW5kKG10ZCk7Cj4gPj4gKwo+ID4+ICsJaWYg KHNlY3Rpb24gPj0gbmFuZC0+ZWNjLnN0ZXBzKQo+ID4+ICsJCXJldHVybiAtRVJBTkdFOwo+ID4+ ICsKPiA+PiArCW9vYnJlZ2lvbi0+b2Zmc2V0ID0gKG5hbmQtPmVjYy5ieXRlcyArIG5hbmQtPmVj Yy5wcmVwYWQpCj4gPj4gKiBzZWN0aW9uICsKPiA+PiArCQkJICAgIG5hbmQtPmVjYy5wcmVwYWQ7 Cj4gPj4gKwlvb2JyZWdpb24tPmxlbmd0aCA9IG5hbmQtPmVjYy5zdGVwcyAqIG5hbmQtPmVjYy5i eXRlczsKPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGlj IGludCBya19uYW5kY19vb2JsYXlvdXRfZnJlZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50Cj4g Pj4gc2VjdGlvbiwKPiA+PiArCQkJCSAgIHN0cnVjdCBtdGRfb29iX3JlZ2lvbgo+ID4+ICpvb2Jy ZWdpb24pICt7Cj4gPj4gKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kID0gbXRkX3RvX25hbmQobXRk KTsKPiA+PiArCj4gPj4gKwlpZiAoc2VjdGlvbiA+PSBuYW5kLT5lY2Muc3RlcHMpCj4gPj4gKwkJ cmV0dXJuIC1FUkFOR0U7Cj4gPj4gKwo+ID4+ICsJb29icmVnaW9uLT5vZmZzZXQgPSAobmFuZC0+ ZWNjLmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCkKPiA+PiAqIHNlY3Rpb247Cj4gPj4gKwlvb2Jy ZWdpb24tPmxlbmd0aCA9IG5hbmQtPmVjYy5zdGVwcyAqIG5hbmQtPmVjYy5wcmVwYWQ7Cj4gPj4g Kwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgbXRkX29vYmxheW91dF9vcHMgcmtfbmFuZGNfb29iX29wcyA9IHsKPiA+PiArCS5lY2MgPSBy a19uYW5kY19vb2JsYXlvdXRfZWNjLAo+ID4+ICsJLmZyZWUgPSBya19uYW5kY19vb2JsYXlvdXRf ZnJlZSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIHJrX25hbmRjX2ZyZWVfYnVm ZmVyKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQpCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBya19uYW5k X2NvbnRyb2xsZXIgKmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsg Kwo+ID4+ICsJa2ZyZWUoY3RybC0+cGFnZV9idWYpOwo+ID4+ICsJa2ZyZWUoY3RybC0+b29iX2J1 Zik7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmFuZGNfYnVmZmVyX2luaXQo c3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKPiA+PiArewo+ID4+ICsJc3RydWN0IG10ZF9pbmZvICpt dGQgPSBuYW5kX3RvX210ZChuYW5kKTsKPiA+PiArCXN0cnVjdCBya19uYW5kX2NvbnRyb2xsZXIg KmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsgKwo+ID4+ICsJY3Ry bC0+cGFnZV9idWYgPSBrbWFsbG9jKG10ZC0+d3JpdGVzaXplLCBHRlBfS0VSTkVMIHwKPiA+PiBH RlBfRE1BKTsgIAo+ID4gIAo+IAo+ID4gZGV2aWNlIG1hbmFnZWQgYWxsb2NhdGlvbnMgKGRldm1f Li4uKSB3b3VsZCBiZSBuaWNlICAKPiAKPiBkZXZtX2t6YWxsb2MoKSBuZWVkcyBhbiBleHRyYSBz dHJ1Y3QgZGV2aWNlLgo+IERvZXMgTVREIHNhZmUtZ2FyZCB0aGUgY29ycmVjdCBvcmRlciB0byBk ZXRhY2ggZnJvbSBzdHJ1Y3QKPiBya19uYW5kX2NvbnRyb2xsZXIKPiB3aXRob3V0IHJrX25hbmRj X2ZyZWVfYnVmZmVyKCk/CgomcGRldi0+ZGV2IGlzIGZpbmUsIHlvdSBjYW4gc2F2ZSBpdCB5b3Vy IG93biBuYW5kIGNvbnRyb2xsZXIgc3RydWN0dXJlLgoKSSB0aGluayBhY2Nlc3NpbmcgbXRkLT5k ZXYgaXMgbm90IGFsbG93ZWQgYmVmb3JlIHRoZSByZWdpc3RyYXRpb24gb2YKdGhlIE1URCBkZXZp Y2UgdGhvdWdoLgoKPiAKPiA+ICAKPiA+PiArCWlmICghY3RybC0+cGFnZV9idWYpCj4gPj4gKwkJ cmV0dXJuIC1FTk9NRU07Cj4gPj4gKwo+ID4+ICsJY3RybC0+b29iX2J1ZiA9IGttYWxsb2MobmFu ZC0+ZWNjLnN0ZXBzICogMTI4LCBHRlBfS0VSTkVMCj4gPj4gfCBHRlBfRE1BKTsKPiA+PiArCWlm ICghY3RybC0+b29iX2J1Zikgewo+ID4+ICsJCWtmcmVlKGN0cmwtPnBhZ2VfYnVmKTsKPiA+PiAr CQlyZXR1cm4gLUVOT01FTTsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiAr fQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19od19lY2NfY3RybF9pbml0KHN0cnVj dCBuYW5kX2NoaXAgKm5hbmQpCj4gPj4gK3sKPiA+PiArCXVpbnQ4X3Qgc3RyZW5ndGhzX3Y2W10g PSB7NjAsIDQwLCAyNCwgMTZ9Owo+ID4+ICsJdWludDhfdCBzdHJlbmd0aHNfdjlbXSA9IHs3MCwg NjAsIDQwLCAxNn07Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKG5h bmQpOwo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9n ZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ICsJaW50IG1heF9zdHJlbmd0aDsKPiA+PiAr CXVpbnQzMl90IGksIHZlcjsKPiA+PiArCj4gPj4gKwlpZiAobmFuZC0+b3B0aW9ucyAmIE5BTkRf SVNfQk9PVF9NRURJVU0pCj4gPj4gKwkJY3RybC0+Ym9vdHJvbWJsb2NrcyA9IHRydWU7Cj4gPj4g KwllbHNlCj4gPj4gKwkJY3RybC0+Ym9vdHJvbWJsb2NrcyA9IGZhbHNlOwo+ID4+ICsKPiA+PiAr CW5hbmQtPmVjYy5wcmVwYWQgPSA0Owo+ID4+ICsJbmFuZC0+ZWNjLnN0ZXBzID0gbXRkLT53cml0 ZXNpemUgLyBuYW5kLT5lY2Muc2l6ZTsKPiA+PiArCj4gPj4gKwltYXhfc3RyZW5ndGggPSAoKG10 ZC0+b29ic2l6ZSAvIG5hbmQtPmVjYy5zdGVwcykgLSA0KSAqIDgKPiA+PiAvIDE0Owo+ID4+ICsJ aWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJY3RybC0+bWF4X2VjY19z dHJlbmd0aCA9IDcwOwo+ID4+ICsJCXZlciA9IHJlYWRsKGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdf VjlfVkVSKTsKPiA+PiArCQlpZiAodmVyICE9IE5BTkRDX0lEX1Y5MDApCj4gPj4gKwkJCWRldl9l cnIobXRkLT5kZXYucGFyZW50LAo+ID4+ICsJCQkJInVuc3VwcG9ydGVkIG5hbmRjIHZlcnNpb24g JXhcbiIsCj4gPj4gdmVyKTsgKwo+ID4+ICsJCWlmIChtYXhfc3RyZW5ndGggPiBjdHJsLT5tYXhf ZWNjX3N0cmVuZ3RoKQo+ID4+ICsJCQltYXhfc3RyZW5ndGggPSBjdHJsLT5tYXhfZWNjX3N0cmVu Z3RoOwo+ID4+ICsKPiA+PiArCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdHJlbmd0aHNf djkpOyBpKyspIHsKPiA+PiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNfdjlbaV0p Cj4gPj4gKwkJCQlicmVhazsKPiA+PiArCQl9Cj4gPj4gKwo+ID4+ICsJCWlmIChpID49IEFSUkFZ X1NJWkUoc3RyZW5ndGhzX3Y5KSkgewo+ID4+ICsJCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwK PiA+PiArCQkJCSJ1bnN1cHBvcnRlZCBzdHJlbmd0aFxuIik7Cj4gPj4gKwkJCXJldHVybiAtRU5P VFNVUFA7Cj4gPj4gKwkJfQo+ID4+ICsKPiA+PiArCQljdHJsLT5lY2NfbW9kZSA9IHN0cmVuZ3Ro c192OVtpXTsKPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwkJY3RybC0+bWF4X2VjY19zdHJlbmd0aCA9 IDYwOwo+ID4+ICsKPiA+PiArCQl2ZXIgPSByZWFkbChjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2 X1ZFUik7Cj4gPj4gKwkJaWYgKHZlciA9PSBOQU5EQ19JRF9WODAxKQo+ID4+ICsJCQljdHJsLT5t YXhfZWNjX3N0cmVuZ3RoID0gMTY7Cj4gPj4gKwkJZWxzZSBpZiAodmVyID09IE5BTkRDX0lEX1Y2 MDAgfHwKPiA+PiArCQkJIHZlciA9PSBOQU5EQ19JRF9WNjIyIHx8ICAKPiAKPiA+PiArCQkJIHZl ciA9PSBOQU5EQ19JRF9WNzAxIHx8ICAKPiAKPiBBZGRlZCB2ZXJzaW9uIDcgZm9yIFJLMzIyOEEv UkszMjI4Qi4gQ2FuIHNvbWVvbmUgd2l0aCBpbnNpZGVyIGluZm8KPiBjb25maXJtIGlmIHRoaXMg d29ya3Mgb3Igbm90Lgo+IAo+ID4+ICsJCQkgdmVyID09IE5BTkRDX0lEX1Y4MDApCj4gPj4gKwkJ CWN0cmwtPm1heF9lY2Nfc3RyZW5ndGggPSA2MDsKPiA+PiArCQllbHNlCj4gPj4gKwkJCWRldl9l cnIobXRkLT5kZXYucGFyZW50LAo+ID4+ICsJCQkJInVuc3VwcG9ydGVkIG5hbmRjIHZlcnNpb24g JXhcbiIsCj4gPj4gdmVyKTsgKwo+ID4+ICsJCWlmIChtYXhfc3RyZW5ndGggPiBjdHJsLT5tYXhf ZWNjX3N0cmVuZ3RoKQo+ID4+ICsJCQltYXhfc3RyZW5ndGggPSBjdHJsLT5tYXhfZWNjX3N0cmVu Z3RoOwo+ID4+ICsKPiA+PiArCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdHJlbmd0aHNf djYpOyBpKyspIHsKPiA+PiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNfdjZbaV0p Cj4gPj4gKwkJCQlicmVhazsKPiA+PiArCQl9Cj4gPj4gKwo+ID4+ICsJCWlmIChpID49IEFSUkFZ X1NJWkUoc3RyZW5ndGhzX3Y2KSkgewo+ID4+ICsJCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwK PiA+PiArCQkJCSJ1bnN1cHBvcnRlZCBzdHJlbmd0aFxuIik7Cj4gPj4gKwkJCXJldHVybiAtRU5P VFNVUFA7Cj4gPj4gKwkJfQo+ID4+ICsKPiA+PiArCQljdHJsLT5lY2NfbW9kZSA9IHN0cmVuZ3Ro c192NltpXTsKPiA+PiArCX0KPiA+PiArCXJrX25hbmRjX2h3X2VjY19zZXR1cChuYW5kLCBjdHJs LT5lY2NfbW9kZSk7Cj4gPj4gKwo+ID4+ICsJbXRkX3NldF9vb2JsYXlvdXQobXRkLCAmcmtfbmFu ZGNfb29iX29wcyk7Cj4gPj4gKwo+ID4+ICsJaWYgKG10ZC0+b29ic2l6ZSA8ICgobmFuZC0+ZWNj LmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCkgKgo+ID4+ICsJCQkgICAgbmFuZC0+ZWNjLnN0ZXBz KSkgewo+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCXJldHVy biAwOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCBya19uYW5kY19kZXRhY2hfY2hp cChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQo+ID4+ICt7Cj4gPj4gKwlzd2l0Y2ggKG5hbmQtPmVj Yy5tb2RlKSB7Cj4gPj4gKwljYXNlIE5BTkRfRUNDX0hXX1NZTkRST01FOgo+ID4+ICsJCXJrX25h bmRjX2ZyZWVfYnVmZmVyKG5hbmQpOwo+ID4+ICsJCWJyZWFrOwo+ID4+ICsJZGVmYXVsdDoKPiA+ PiArCQlicmVhazsKPiA+PiArCX0KPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19u YW5kY19hdHRhY2hfY2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQo+ID4+ICt7Cj4gPj4gKwlz dHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKG5hbmQpOwo+ID4+ICsJaW50IHJldDsK PiA+PiArCj4gPj4gKwlzd2l0Y2ggKG5hbmQtPmVjYy5tb2RlKSB7Cj4gPj4gKwljYXNlIE5BTkRf RUNDX0hXX1NZTkRST01FOgo+ID4+ICsJCXJldCA9IHJrX25hbmRjX2h3X2VjY19jdHJsX2luaXQo bmFuZCk7Cj4gPj4gKwkJaWYgKHJldCkKPiA+PiArCQkJcmV0dXJuIHJldDsKPiA+PiArCQlyZXQg PSBya19uYW5kY19idWZmZXJfaW5pdChuYW5kKTsKPiA+PiArCQlpZiAocmV0KQo+ID4+ICsJCQly ZXR1cm4gLUVOT01FTTsKPiA+PiArCQluYW5kLT5lY2MucmVhZF9wYWdlID0KPiA+PiBya19uYW5k Y19od19zeW5kcm9tZV9lY2NfcmVhZF9wYWdlOwo+ID4+ICsJCW5hbmQtPmVjYy53cml0ZV9wYWdl ID0KPiA+PiBya19uYW5kY19od19zeW5kcm9tZV9lY2Nfd3JpdGVfcGFnZTsKPiA+PiArCQluYW5k LT5lY2MucmVhZF9vb2IgPSBya19uYW5kY19od19lY2NfcmVhZF9vb2I7Cj4gPj4gKwkJbmFuZC0+ ZWNjLndyaXRlX29vYiA9IHJrX25hbmRjX2h3X2VjY193cml0ZV9vb2I7Cj4gPj4gKwkJYnJlYWs7 Cj4gPj4gKwljYXNlIE5BTkRfRUNDX0hXOiAgCj4gPgo+ID4gSSB3b3VsZCBlaXRoZXIgcmVmdXNl IEVDQ19IVyBvciBwdXQgaXQgYmVzaWRlcyBIV19TWU5EUk9NRS4gIAo+IAo+IElzIHRoZXJlIGEg ZnVuZGFtZW50YWwgZGlmZmVyZW5jZSBpbiBoYW5kbGluZyBFQ0NfSFcgYW5kIEhXX1NZTkRST01F Cj4gZnJvbSB0aGUgTVREIHBvaW50IG9mIHZpZXc/IE90aGVyIHRoZW4gYSBpbmRpY2F0aW9uIGhv dyBpdCdzIGRvbmUgb24KPiB0aGUgZHJpdmVyIHNpZGU/CgpJIGRvbid0IHRoaW5rIHNvLi4KCj4g V2lsbCBkcm9wIGl0Lgo+IAo+ID4gIAo+ID4+ICsJY2FzZSBOQU5EX0VDQ19OT05FOgo+ID4+ICsJ Y2FzZSBOQU5EX0VDQ19TT0ZUOiAgCj4gPiAgCj4gCj4gPiBIYXZlIHlvdSB0ZXN0ZWQgd2l0aCBT VyBCQ0g/ICAKPiAKPiBTaG9ydCBhbnN3ZXI6IE5vCj4gSnVzdCBjb3BpZWQgaXQgZnJvbSB0aGUg b3JpZ2luYWwuCj4gUGxlYXNlIGFkdmlzZSBhIHRvb2wgdG8gZG8gYSB0ZXN0IGJldHdlZW4gdGhl IGluZGl2aWR1YWwgZWNjIHJlYWQKPiBvcHRpb25zLiBPciBkbyBJIGhhdmUgdG8gd3JpdGUgdGhl IHRvb2wgbXkgc2VsZiB3aXRoIG10ZC11dGlscz8KCkFsbCB0aGUgdG9vbHMgYXJlIGFscmVhZHkg YXZhaWxhYmxlLiBuYW5kX3Rlc3QsIGZsYXNoX3NwZWVkLApuYW5kYml0ZXJycyAtaSwgZXRjCgo+ IAo+ID4gIAo+ID4+ICsJCWJyZWFrOwo+ID4+ICsJZGVmYXVsdDoKPiA+PiArCQlyZXR1cm4gLUVJ TlZBTDsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+ PiArc3RhdGljIGludCBya19uYW5kY19leGVjX29wKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsCj4g Pj4gKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmFuZF9vcGVyYXRpb24gKm9wLAo+ID4+ICsJCQkgICAg Ym9vbCBjaGVja19vbmx5KQo+ID4+ICt7Cj4gPj4gKwlpbnQgaTsKPiA+PiArCXVuc2lnbmVkIGlu dCBvcF9pZDsKPiA+PiArCWNvbnN0IHN0cnVjdCBuYW5kX29wX2luc3RyICppbnN0ciA9IE5VTEw7 Cj4gPj4gKwo+ID4+ICsJcmtfbmFuZGNfc2VsZWN0X2NoaXAobmFuZCwgb3AtPmNzKTsKPiA+PiAr Cj4gPj4gKwlpZiAoY2hlY2tfb25seSkKPiA+PiArCQlyZXR1cm4gMDsKPiA+PiArCj4gPj4gKwlm b3IgKG9wX2lkID0gMDsgb3BfaWQgPCBvcC0+bmluc3Ryczsgb3BfaWQrKykgewo+ID4+ICsJCWlu c3RyID0gJm9wLT5pbnN0cnNbb3BfaWRdOwo+ID4+ICsKPiA+PiArCQlzd2l0Y2ggKGluc3RyLT50 eXBlKSB7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0NNRF9JTlNUUjoKPiA+PiArCQkJcmtfbmFuZGNf d3JpdGVfY21kKG5hbmQsCj4gPj4gaW5zdHItPmN0eC5jbWQub3Bjb2RlKTsKPiA+PiArCQkJYnJl YWs7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0FERFJfSU5TVFI6Cj4gPj4gKwkJCWZvciAoaSA9IDA7 IGkgPCBpbnN0ci0+Y3R4LmFkZHIubmFkZHJzOwo+ID4+IGkrKykKPiA+PiArCQkJCXJrX25hbmRj X3dyaXRlX2FkZHIobmFuZCwKPiA+PiArCj4gPj4gaW5zdHItPmN0eC5hZGRyLmFkZHJzW2ldKTsK PiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0RBVEFfSU5fSU5TVFI6Cj4gPj4g KwkJCXJrX25hbmRjX3JlYWRfYnVmKG5hbmQsCj4gPj4gaW5zdHItPmN0eC5kYXRhLmJ1Zi5pbiwK PiA+PiArCQkJCQkgIGluc3RyLT5jdHguZGF0YS5sZW4pOwo+ID4+ICsJCQlicmVhazsKPiA+PiAr CQljYXNlIE5BTkRfT1BfREFUQV9PVVRfSU5TVFI6Cj4gPj4gKwkJCXJrX25hbmRjX3dyaXRlX2J1 ZihuYW5kLAo+ID4+IGluc3RyLT5jdHguZGF0YS5idWYub3V0LAo+ID4+ICsJCQkJCSAgIGluc3Ry LT5jdHguZGF0YS5sZW4pOwo+ID4+ICsJCQlicmVhazsKPiA+PiArCQljYXNlIE5BTkRfT1BfV0FJ VFJEWV9JTlNUUjoKPiA+PiArCQkJcmtfbmFuZGNfZGV2X3JlYWR5KG5hbmQpOwo+ID4+ICsJCQli cmVhazsKPiA+PiArCQl9Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30K PiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmFuZF9jb250cm9sbGVyX29wcyBya19u YW5kX2NvbnRyb2xsZXJfb3BzID0gewo+ID4+ICsJLmF0dGFjaF9jaGlwID0gcmtfbmFuZGNfYXR0 YWNoX2NoaXAsCj4gPj4gKwkuZGV0YWNoX2NoaXAgPSBya19uYW5kY19kZXRhY2hfY2hpcCwKPiA+ PiArCS5leGVjX29wID0gcmtfbmFuZGNfZXhlY19vcCwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0 YXRpYyBpbnQgcmtfbmFuZGNfY2hpcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+PiArCQkJ ICAgICAgc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCwKPiA+PiArCQkJICAgICAgc3Ry dWN0IGRldmljZV9ub2RlICpucCwgdW5zaWduZWQKPiA+PiBpbnQgY2hpcG5yKSArewo+ID4+ICsJ c3RydWN0IHJrX25hbmRfY2hpcCAqbm9kZTsKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmQ7 Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKPiA+PiArCWNvbnN0IF9fYmUzMiAqcmVnOwo+ ID4+ICsJaW50IHJldDsKPiA+PiArCj4gPj4gKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJy ZWciLCBOVUxMKTsKPiA+PiArCWlmICghcmVnKQo+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+ ICsKPiA+PiArCWN0cmwtPmJhbmtzW2NoaXBucl0gPSBiZTMyX3RvX2NwdSgqcmVnKTsKPiA+PiAr Cj4gPj4gKwlpZiAoY3RybC0+YmFua3NbY2hpcG5yXSA8IDApCj4gPj4gKwkJcmV0dXJuIC1FSU5W QUw7Cj4gPj4gKwo+ID4+ICsJbm9kZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbm9kZSks IEdGUF9LRVJORUwpOwo+ID4+ICsJaWYgKCFub2RlKQo+ID4+ICsJCXJldHVybiAtRU5PTUVNOwo+ ID4+ICsKPiA+PiArCW5hbmQgPSAmbm9kZS0+bmFuZDsKPiA+PiArCj4gPj4gKwluYW5kX3NldF9m bGFzaF9ub2RlKG5hbmQsIG5wKTsKPiA+PiArCW5hbmRfc2V0X2NvbnRyb2xsZXJfZGF0YShuYW5k LCBjdHJsKTsKPiA+PiArCj4gPj4gKwluYW5kLT5jb250cm9sbGVyID0gJmN0cmwtPmNvbnRyb2xs ZXI7Cj4gPj4gKwluYW5kLT5jb250cm9sbGVyLT5vcHMgPSAmcmtfbmFuZF9jb250cm9sbGVyX29w czsKPiA+PiArCj4gPj4gKwluYW5kLT5lY2MubW9kZSA9IE5BTkRfRUNDX0hXX1NZTkRST01FOwo+ ID4+ICsJbmFuZC0+ZWNjLnNpemUgPSAxMDI0Owo+ID4+ICsJbmFuZC0+ZWNjLnN0cmVuZ3RoID0g NDA7Cj4gPj4gKwo+ID4+ICsJbmFuZC0+b3B0aW9ucyA9IE5BTkRfU0tJUF9CQlRTQ0FOIHwgTkFO RF9OT19TVUJQQUdFX1dSSVRFOwo+ID4+ICsKPiA+PiArCW10ZCA9IG5hbmRfdG9fbXRkKG5hbmQp Owo+ID4+ICsJbXRkLT5kZXYucGFyZW50ID0gZGV2Owo+ID4+ICsJbXRkLT5uYW1lID0gZGV2bV9r YXNwcmludGYoZGV2LCBHRlBfS0VSTkVMLCAiJXMuJWQiLAo+ID4+IGRldl9uYW1lKGRldiksCj4g Pj4gKwkJCQkgICBjdHJsLT5iYW5rc1tjaGlwbnJdKTsKPiA+PiArCj4gPj4gKwlyZXQgPSBuYW5k X3NjYW4obmFuZCwgMSk7ICAKPiA+Cj4gPiBXaHkgMSBoZXJlPyAgCj4gCj4gVE9ETyBmb3IgdmVy c2lvbiAyLgo+IEEgbGl0dGxlIG1pc3VuZGVyc3RhbmRpbmcgb24gaG93IGZvcl9lYWNoX2NoaWxk X29mX25vZGUgd29ya3MuCj4gQWxsIGNoaXBzIHNob3VsZCBiZSBzY2FubmVkLgo+IC8vLy8vCj4g RGVyaXZlIGNoaXBucgo+IEV4YW1wbGUgZnJvbSBzdW54aV9uYW5kLmMKPiAKPiAJaWYgKCFvZl9n ZXRfcHJvcGVydHkobnAsICJyZWciLCAmbnNlbHMpKQo+IAkJcmV0dXJuIC1FSU5WQUw7Cj4gCj4g CW5zZWxzIC89IHNpemVvZih1MzIpOwo+IAlpZiAoIW5zZWxzKSB7Cj4gCQlkZXZfZXJyKGRldiwg ImludmFsaWQgcmVnIHByb3BlcnR5IHNpemVcbiIpOwo+IAkJcmV0dXJuIC1FSU5WQUw7Cj4gCX0K PiAvLy8vLwo+IEZyb20gcmtfbmFuZGNfY2hpcHNfaW5pdCgpCj4gCj4gCWZvcl9lYWNoX2NoaWxk X29mX25vZGUobnAsIG5hbmRfbnApIHsKPiAJCXJldCA9IHJrX25hbmRjX2NoaXBfaW5pdChkZXYs IGN0cmwsIG5hbmRfbnAsIGkpOwo+IAo+IFdoeSBkb2VzIHN1bnhpX25hbmQuYyBuZWVkIHRoaXMg ZXh0cmEgZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZT8KCmZvcl9lYWNoX2NoaWxkX29mX25vZGUgd2ls bCBsb29wIG92ZXIgYWxsIHRoZSBOQU5EIGNoaXBzIHRoYXQgYXJlCmNvbm5lY3RlZCB0byB0aGUg TkFORCBjb250cm9sbGVyLgoKWW91IG1heSBoYXZlIC1kZXBlbmRpbmcgb24gdGhlIE5BTkQgY29u dHJvbGxlci0gbW9yZSB0aGFuIG9uZSBDUyBwZXIKY2hpcC4KCgpbLi4uXQoKPiA+PiArCW5vZGUg PSBwZGV2LT5kZXYub2Zfbm9kZTsKPiA+PiArCj4gPj4gKwlpZCA9IG9mX2FsaWFzX2dldF9pZChu b2RlLCAibmFuZGMiKTsKPiA+PiArCWlmIChpZCA8IDApCj4gPj4gKwkJaWQgPSBnX2lkX2NvdW50 ZXI7Cj4gPj4gKwlpZiAoKGlkID49IEFSUkFZX1NJWkUoZ19uYW5kY19pbmZvKSB8fAo+ID4+IGdf bmFuZGNfaW5mb1tpZF0ucmVncykpIHsKPiA+PiArCQlkZXZfZXJyKAo+ID4+ICsJCQkmcGRldi0+ ZGV2LAo+ID4+ICsJCQkiZmFpbGVkIHRvIGdldCBpZCBmb3IgbmFuZGMgbm9kZQo+ID4+ICclcE9G bidcbiIsCj4gPj4gKwkJCW5vZGUpOwo+ID4+ICsJCW9mX25vZGVfcHV0KG5vZGUpOwo+ID4+ICsJ CXJldHVybiAtRU5PREVWOwo+ID4+ICsJfQo+ID4+ICsJKytnX2lkX2NvdW50ZXI7ICAKPiAKPiBT ZWUgY29tbWVudHMgYWJvdmUgYWJvdXQgUmszMjg4LiBLZWVwaW5nIHRyYWNrIG5vZGUgYWxpYXMg Zm9yIG5hbmRjMC4KPiBUbyByZW1vdmUgb3Igbm90PwoKWW91IG1heSBrZWVwIGEgc3RhdGljIHZh cmlhYmxlIHRvIHBvaW50IHRvIGFuIGFycmF5IG9yIGhhdmUgYSBzdGF0aWMKY291bnRlciB0aGF0 IHlvdSBpbmNyZW1lbnQsIGJ1dCBkZWZpbml0ZWx5IG5vdCBzdGF0aWMgc3RydWN0dXJlcyB0aGF0 CndvdWxkIGJlIHNoYXJlZC4gSWYgdGhlcmUgYXJlIHR3byBkaXN0aW5jdCBOQU5EIGNvbnRyb2xs ZXJzLCB5b3UgbXVzdApoYXZlIGRpc3RpbmN0IHBhdGgvc3RydWN0dXJlcy4KCi0+cHJvYmUoKSB3 aWxsIGJlIHJ1biBvbmNlIGZvciBlYWNoIE5BTkQgY29udHJvbGxlci4KCgpUaGFua3MsCk1pcXXD qGwKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4 LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFy bS1rZXJuZWwK