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=-4.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=no 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 0361FC4708F for ; Mon, 31 May 2021 08:35:21 +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 B740A61186 for ; Mon, 31 May 2021 08:35:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B740A61186 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=puri.sm Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+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.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:List-Subscribe:List-Help: List-Post:List-Archive:List-Unsubscribe:List-Id:References:In-Reply-To:Date: Cc:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=3I8SCGXzR2A3bFSYdSWUZd3IduwIRkdl9UbfXe9DjTY=; b=xgRIovCQS9Ouvf G2TRBRbiGAAyfInUK/zqnOgTe5vkTi5odPCVVNF0/rNU06Ck+woHbslkYDmecg1L2K/ipaV5Fuj+K p9Y6liGWb9DOMPwBjb6eEoloP910S0obW/9or766ZYJnZJYHhMisbz9QzUnQfb2a31q4O/CQcSdMp qkIbmlwnVmCvy1hp4iNr6c2njWzawtXq03AIcbAUtnId1zab8D6MiWvH/jclEMLad9nDU2pjXE3H8 84GbXuSZc/+ZsdBaTMh2V2ImWkumuKeyKfFL0e0NbaF+/f4L3T4mmV9rOI2n8lba7XvZbJjl2SssB qK24JxBnabJDDorkBpwg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lndMc-00BTD4-JQ; Mon, 31 May 2021 08:33:35 +0000 Received: from comms.puri.sm ([159.203.221.185]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lndMV-00BTBm-C7 for linux-arm-kernel@lists.infradead.org; Mon, 31 May 2021 08:33:30 +0000 Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id E86CDE2133; Mon, 31 May 2021 01:32:53 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 0QM9fHHuZXeW; Mon, 31 May 2021 01:32:49 -0700 (PDT) Message-ID: Subject: Re: [PATCH v1 2/3] media: imx: add a driver for i.MX8MQ mipi csi rx phy and controller From: Martin Kepplinger To: Dan Carpenter Cc: laurent.pinchart@ideasonboard.com, mchehab@kernel.org, robh@kernel.org, shawnguo@kernel.org, kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, slongerbeam@gmail.com, kernel@puri.sm, krzk@kernel.org, linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Date: Mon, 31 May 2021 10:32:43 +0200 In-Reply-To: <20210527102005.GR1955@kadam> References: <20210527075407.3180744-1-martin.kepplinger@puri.sm> <20210527075407.3180744-3-martin.kepplinger@puri.sm> <20210527102005.GR1955@kadam> User-Agent: Evolution 3.38.3-1 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210531_013327_467333_1B086D39 X-CRM114-Status: GOOD ( 27.42 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org QW0gRG9ubmVyc3RhZywgZGVtIDI3LjA1LjIwMjEgdW0gMTM6MjAgKzAzMDAgc2NocmllYiBEYW4g Q2FycGVudGVyOgo+IE9uIFRodSwgTWF5IDI3LCAyMDIxIGF0IDA5OjU0OjA2QU0gKzAyMDAsIE1h cnRpbiBLZXBwbGluZ2VyIHdyb3RlOgo+ID4gK3N0YXRpYyB2b2lkIG1pcGlfY3NpMl9zd19yZXNl dChzdHJ1Y3QgY3NpX3N0YXRlICpzdGF0ZSkKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1 Y3QgZGV2aWNlICpkZXYgPSBzdGF0ZS0+ZGV2Owo+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGRl dmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBk ZXZpY2Vfbm9kZSAqbm9kZTsKPiA+ICvCoMKgwqDCoMKgwqDCoHBoYW5kbGUgcGhhbmRsZTsKPiA+ ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBkZXZfZGJn KGRldiwgIiVzOiBzdGFydGluZ1xuIiwgX19mdW5jX18pOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDC oMKgcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJwaHktcmVzZXQiLCAmcGhhbmRsZSk7 Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0KSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgZGV2X2luZm8oZGV2LCAibm8gY3Npcy1ody1yZXNldCBwcm9wZXJ0eSBmb3VuZDoK PiA+ICVkXG4iLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVy bjsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoG5vZGUgPSBv Zl9maW5kX25vZGVfYnlfcGhhbmRsZShwaGFuZGxlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmICgh bm9kZSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IFBUUl9FUlIo bm9kZSk7Cj4gCj4gTm9kZSBpcyBOVUxMLCBub3QgYW4gZXJyb3IgcG9pbnRlci4KPiAKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkZXZfZGJnKGRldiwgIm5vdCBmaW5kIHNyYyBu b2RlIGJ5IHBoYW5kbGU6ICVkXG4iLAo+ID4gcmV0KTsKPiAKPiBQcm9iYWJseSBjaGFuZ2UgdGhp cyB0byAiZXJyb3IgZmluZGluZyBub2RlIGJ5IHBoYW5kbGVcbiIuCj4gVGhpcyBzaG91bGQganVz dCByZXR1cm4gYWZ0ZXIgcHJpbnRpbmcgdGhlIGVycm9yLsKgCj4gc3lzY29uX25vZGVfdG9fcmVn bWFwKCkKPiBpcyBub3QgZ29pbmcgdG8gc3VjY2VlZCB3aXRoIGEgTlVMTCBub2RlLgo+IAo+ID4g K8KgwqDCoMKgwqDCoMKgfQo+ID4gK8KgwqDCoMKgwqDCoMKgc3RhdGUtPmh3X3Jlc2V0ID0gc3lz Y29uX25vZGVfdG9fcmVnbWFwKG5vZGUpOwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKElTX0VSUihz dGF0ZS0+aHdfcmVzZXQpKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 ID0gUFRSX0VSUihzdGF0ZS0+aHdfcmVzZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBzcmMgcmVnbWFwOiAlZFxuIiwKPiA+ IHJldCk7Cj4gCj4gVGhlcmUgaXMgYSBuZXcgY29vbCAlcGUgd2hpY2ggcHJpbnRzICJmYWlsZWQg dG8gZ2V0IHNyYyByZWdtYXA6IC0KPiBFTk9ERVZcbiIuCj4gCj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgc3JjIHJlZ21hcDogJXBl XG4iLAo+IHN0YXRlLT5od19yZXNldCk7Cj4gCj4gCj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiAr wqDCoMKgwqDCoMKgwqBvZl9ub2RlX3B1dChub2RlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChy ZXQgPCAwKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybjsKPiA+ICsK PiA+ICvCoMKgwqDCoMKgwqDCoC8qIHJlc2V0IGlteDhtcSBtaXBpIHBoeSAqLwo+ID4gK8KgwqDC oMKgwqDCoMKgcmVnbWFwX3VwZGF0ZV9iaXRzKHN0YXRlLT5od19yZXNldCwgc3RhdGUtPmh3X3Jl c2V0X3JlZywgNywKPiA+IDcpOwo+ID4gK8KgwqDCoMKgwqDCoMKgbXNsZWVwKDIwKTsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgbWlwaV9jc2kyX3N5c3RlbV9lbmFibGUoc3RydWN0IGNz aV9zdGF0ZSAqc3RhdGUsIGludAo+ID4gb24pCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgc3Ry dWN0IGRldmljZSAqZGV2ID0gc3RhdGUtPmRldjsKPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBk ZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qg ZGV2aWNlX25vZGUgKm5vZGU7Cj4gPiArwqDCoMKgwqDCoMKgwqBwaGFuZGxlIHBoYW5kbGU7Cj4g PiArwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKCFv bikgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIERpc2FibGUgRGF0YSBs YW5lcyAqLwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1pcGlfY3NpMl93cml0 ZShzdGF0ZSwKPiA+IENTSTJSWF9DRkdfRElTQUJMRV9EQVRBX0xBTkVTLCAweGYpOwo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybjsKPiA+ICvCoMKgwqDCoMKgwqDCoH0K PiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAi cGh5LWdwciIsICZwaGFuZGxlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChyZXQpIHsKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkZXZfaW5mbyhkZXYsICJubyBwaHktZ3ByIHBy b3BlcnR5IGZvdW5kXG4iKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1 cm47Cj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBub2RlID0g b2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUocGhhbmRsZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAo IW5vZGUpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkZXZfZGJnKGRldiwg Im5vdCBmaW5kIGdwciBub2RlIGJ5IHBoYW5kbGVcbiIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldCA9IFBUUl9FUlIobm9kZSk7Cj4gCj4gTm90IGFuIGVycm9yIHBvaW50 ZXIuCj4gCj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiArwqDCoMKgwqDCoMKgwqBzdGF0ZS0+cGh5 X2dwciA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChub2RlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGlm IChJU19FUlIoc3RhdGUtPnBoeV9ncHIpKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGdwciByZWdtYXBcbiIpOwo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IFBUUl9FUlIoc3RhdGUtPnBoeV9ncHIp Owo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gK8KgwqDCoMKgwqDCoMKgb2Zfbm9kZV9wdXQobm9k ZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0IDwgMCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqByZXR1cm47Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqByZWdtYXBfdXBk YXRlX2JpdHMoc3RhdGUtPnBoeV9ncHIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RhdGUtPnBoeV9ncHJfcmVnLAo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDB4M0ZGRiwKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBHUFJfQ1NJ Ml8xX1JYX0VOQUJMRSB8Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgR1BSX0NTSTJfMV9WSURfSU5URkNfRU5CIHwKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBHUFJfQ1NJMl8xX0hTRUwg fAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IEdQUl9DU0kyXzFfQ09OVF9DTEtfTU9ERSB8Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgR1BSX0NTSTJfMV9TX1BSR19SWEhTX1NFVFRMRShz dGF0ZS0KPiA+ID5oc19zZXR0bGUpKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGRldl9kYmco ZGV2LCAiJXM6IGhzX3NldHRsZTogMHglWFxuIiwgX19mdW5jX18sIHN0YXRlLQo+ID4gPmhzX3Nl dHRsZSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIG1pcGlfY3NpMl9zZXRfcGFyYW1z KHN0cnVjdCBjc2lfc3RhdGUgKnN0YXRlKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoGludCBs YW5lcyA9IHN0YXRlLT5idXMubnVtX2RhdGFfbGFuZXM7Cj4gPiArwqDCoMKgwqDCoMKgwqB1MzIg dmFsID0gMDsKPiA+ICvCoMKgwqDCoMKgwqDCoGludCBpOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDC oMKgLyogTGFuZXMgKi8KPiA+ICvCoMKgwqDCoMKgwqDCoG1pcGlfY3NpMl93cml0ZShzdGF0ZSwg Q1NJMlJYX0NGR19OVU1fTEFORVMsIGxhbmVzIC0gMSk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg wqBmb3IgKGkgPSAwOyBpIDwgbGFuZXM7IGkrKykKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqB2YWwgfD0gKDEgPDwgaSk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqB2YWwgPSAw eEYgJiB+dmFsOwo+ID4gK8KgwqDCoMKgwqDCoMKgbWlwaV9jc2kyX3dyaXRlKHN0YXRlLCBDU0ky UlhfQ0ZHX0RJU0FCTEVfREFUQV9MQU5FUywgdmFsKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDC oGRldl9kYmcoc3RhdGUtPmRldiwgImlteDhtcTogQ1NJMlJYX0NGR19ESVNBQkxFX0RBVEFfTEFO RVM6Cj4gPiAweCVYXG4iLCB2YWwpOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgLyogTWFzayBp bnRlcnJ1cHQgKi8KPiA+ICvCoMKgwqDCoMKgwqDCoC8vIERvbid0IGxldCBVTFBTICh1bHRyYS1s b3cgcG93ZXIgc3RhdHVzKSBpbnRlcnJ1cHRzIGZsb29kCj4gPiArwqDCoMKgwqDCoMKgwqBtaXBp X2NzaTJfd3JpdGUoc3RhdGUsIENTSTJSWF9JUlFfTUFTSywgMHgxZmYpOwo+ID4gKwo+ID4gK8Kg wqDCoMKgwqDCoMKgbWlwaV9jc2kyX3dyaXRlKHN0YXRlLCAweDE4MCwgMSk7Cj4gPiArwqDCoMKg wqDCoMKgwqAvKiB2aWRfdmMgKi8KPiA+ICvCoMKgwqDCoMKgwqDCoG1pcGlfY3NpMl93cml0ZShz dGF0ZSwgMHgxODQsIDEpOwo+ID4gK8KgwqDCoMKgwqDCoMKgbWlwaV9jc2kyX3dyaXRlKHN0YXRl LCAweDE4OCwgc3RhdGUtPnNlbmRfbGV2ZWwpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50 IG1pcGlfY3NpMl9jbGtfZW5hYmxlKHN0cnVjdCBjc2lfc3RhdGUgKnN0YXRlKQo+ID4gK3sKPiA+ ICvCoMKgwqDCoMKgwqDCoHJldHVybgo+ID4gY2xrX2J1bGtfcHJlcGFyZV9lbmFibGUoQVJSQVlf U0laRShtaXBpX2NzaTJfY2xrX2lkKSwgc3RhdGUtPmNsa3MpOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgdm9pZCBtaXBpX2NzaTJfY2xrX2Rpc2FibGUoc3RydWN0IGNzaV9zdGF0ZSAqc3RhdGUp Cj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgY2xrX2J1bGtfZGlzYWJsZV91bnByZXBhcmUoQVJS QVlfU0laRShtaXBpX2NzaTJfY2xrX2lkKSwKPiA+IHN0YXRlLT5jbGtzKTsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIGludCBtaXBpX2NzaTJfY2xrX2dldChzdHJ1Y3QgY3NpX3N0YXRlICpzdGF0 ZSkKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQgaTsKPiA+ICvCoMKgwqDC oMKgwqDCoGludCByZXQ7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBzdGF0ZS0+Y2xrcyA9IGRl dm1fa2NhbGxvYyhzdGF0ZS0+ZGV2LAo+ID4gQVJSQVlfU0laRShtaXBpX2NzaTJfY2xrX2lkKSwK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgc2l6ZW9mKCpzdGF0ZS0+Y2xrcyksCj4gPiBHRlBfS0VSTkVMKTsKPiA+ ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmICghc3RhdGUtPmNsa3MpCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FTk9NRU07Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg wqBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtaXBpX2NzaTJfY2xrX2lkKTsgaSsrKQo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0YXRlLT5jbGtzW2ldLmlkID0gbWlwaV9j c2kyX2Nsa19pZFtpXTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldCA9IGRldm1fY2xrX2J1 bGtfZ2V0KHN0YXRlLT5kZXYsCj4gPiBBUlJBWV9TSVpFKG1pcGlfY3NpMl9jbGtfaWQpLAo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgc3RhdGUtPmNsa3MpOwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIHJldDsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgbWlwaV9jc2kyX3N0YXJ0X3N0cmVhbShzdHJ1Y3QgY3Np X3N0YXRlICpzdGF0ZSkKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBtaXBpX2NzaTJfc3dfcmVz ZXQoc3RhdGUpOwo+ID4gK8KgwqDCoMKgwqDCoMKgbWlwaV9jc2kyX3NldF9wYXJhbXMoc3RhdGUp Owo+ID4gK8KgwqDCoMKgwqDCoMKgbWlwaV9jc2kyX3N5c3RlbV9lbmFibGUoc3RhdGUsIHRydWUp Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBtaXBpX2NzaTJfc3RvcF9zdHJlYW0oc3Ry dWN0IGNzaV9zdGF0ZSAqc3RhdGUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgbWlwaV9jc2ky X3N5c3RlbV9lbmFibGUoc3RhdGUsIGZhbHNlKTsKPiA+ICt9Cj4gPiArCj4gPiArLyogLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Cj4gPiAtLS0tLS0tLS0tLS0tLQo+ID4gKyAqIFY0TDIgc3ViZGV2IG9wZXJhdGlvbnMKPiA+ICsg Ki8KPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IGNzaV9zdGF0ZSAqbWlwaV9zZF90b19jc2kyX3N0 YXRlKHN0cnVjdCB2NGwyX3N1YmRldgo+ID4gKnNkZXYpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDC oMKgcmV0dXJuIGNvbnRhaW5lcl9vZihzZGV2LCBzdHJ1Y3QgY3NpX3N0YXRlLCBzZCk7Cj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbWlwaV9jc2kyX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1 YmRldiAqc2QsIGludCBlbmFibGUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGNz aV9zdGF0ZSAqc3RhdGUgPSBtaXBpX3NkX3RvX2NzaTJfc3RhdGUoc2QpOwo+ID4gK8KgwqDCoMKg wqDCoMKgaW50IHJldDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoG1pcGlfY3NpMl93cml0ZShz dGF0ZSwgQ1NJMlJYX0lSUV9NQVNLLCAweDAwOCk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBk ZXZfZGJnKHN0YXRlLT5kZXYsICIlczogZW5hYmxlOiAlZFxuIiwgX19mdW5jX18sIGVuYWJsZSk7 Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoZW5hYmxlKSB7Cj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhzdGF0ZS0+ZGV2KTsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0IDwgMCkgewo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwbV9ydW50aW1lX3B1 dF9ub2lkbGUoc3RhdGUtPmRldik7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgfQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IHY0bDJfc3Vi ZGV2X2NhbGwoc3RhdGUtPnNyY19zZCwgY29yZSwKPiA+IHNfcG93ZXIsIDEpOwo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQgPCAwICYmIHJldCAhPSAtRU5PSU9DVExD TUQpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGdv dG8gZG9uZTsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoG11 dGV4X2xvY2soJnN0YXRlLT5sb2NrKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChlbmFi bGUpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoc3RhdGUtPnN0YXRl ICYgU1RfU1VTUEVOREVEKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldCA9IC1FQlVTWTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290byB1bmxvY2s7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1p cGlfY3NpMl9zdGFydF9zdHJlYW0oc3RhdGUpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc3RhdGUtPnNyY19zZCwgdmlkZW8sCj4gPiBz X3N0cmVhbSwgMSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHJldCA8 IDApCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGdv dG8gdW5sb2NrOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0YXRl LT5zdGF0ZSB8PSBTVF9TVFJFQU1JTkc7Cj4gPiArwqDCoMKgwqDCoMKgwqB9IGVsc2Ugewo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHY0bDJfc3ViZGV2X2NhbGwoc3RhdGUtPnNy Y19zZCwgdmlkZW8sIHNfc3RyZWFtLAo+ID4gMCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzdGF0ZS0+c3JjX3NkLCBjb3JlLAo+ID4g c19wb3dlciwgMCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHJldCA9 PSAtRU5PSU9DVExDTUQpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHJldCA9IDA7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbWlw aV9jc2kyX3N0b3Bfc3RyZWFtKHN0YXRlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBzdGF0ZS0+c3RhdGUgJj0gflNUX1NUUkVBTUlORzsKPiA+ICvCoMKgwqDCoMKgwqDCoH0K PiA+ICsKPiA+ICt1bmxvY2s6Cj4gPiArwqDCoMKgwqDCoMKgwqBtdXRleF91bmxvY2soJnN0YXRl LT5sb2NrKTsKPiA+ICsKPiA+ICtkb25lOgo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKCFlbmFibGUg fHwgcmV0IDwgMCkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwbV9ydW50aW1l X3B1dChzdGF0ZS0+ZGV2KTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4g PiArfQo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICoKPiA+ICtt aXBpX2NzaTJfZ2V0X2Zvcm1hdChzdHJ1Y3QgY3NpX3N0YXRlICpzdGF0ZSwKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX2Nv bmZpZyAqY2ZnLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVu dW0gdjRsMl9zdWJkZXZfZm9ybWF0X3doZW5jZSB3aGljaCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQgcGFkKQo+ID4gK3sKPiA+ICvCoMKg wqDCoMKgwqDCoGlmICh3aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKQo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1h dCgmc3RhdGUtPnNkLCBjZmcsCj4gPiBwYWQpOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0 dXJuICZzdGF0ZS0+Zm9ybWF0X21idXM7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbWlw aV9jc2kyX2luaXRfY2ZnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHY0bDJf c3ViZGV2X3BhZF9jb25maWcgKmNmZykKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qg Y3NpX3N0YXRlICpzdGF0ZSA9IG1pcGlfc2RfdG9fY3NpMl9zdGF0ZShzZCk7Cj4gPiArwqDCoMKg wqDCoMKgwqBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmbXRfc2luazsKPiA+ICvCoMKgwqDC oMKgwqDCoHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZtdF9zb3VyY2U7Cj4gPiArwqDCoMKg wqDCoMKgwqBlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2Ugd2hpY2g7Cj4gPiArCj4gPiAr wqDCoMKgwqDCoMKgwqB3aGljaCA9IGNmZyA/IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkgOgo+ID4g VjRMMl9TVUJERVZfRk9STUFUX0FDVElWRTsKPiA+ICvCoMKgwqDCoMKgwqDCoGZtdF9zaW5rID0g bWlwaV9jc2kyX2dldF9mb3JtYXQoc3RhdGUsIGNmZywgd2hpY2gsCj4gPiBNSVBJX0NTSTJfUEFE X1NJTkspOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgZm10X3NpbmstPmNvZGUgPSBNRURJQV9C VVNfRk1UX1NHQlJHMTBfMVgxMDsKPiA+ICvCoMKgwqDCoMKgwqDCoGZtdF9zaW5rLT53aWR0aCA9 IE1JUElfQ1NJMl9ERUZfUElYX1dJRFRIOwo+ID4gK8KgwqDCoMKgwqDCoMKgZm10X3NpbmstPmhl aWdodCA9IE1JUElfQ1NJMl9ERUZfUElYX0hFSUdIVDsKPiA+ICvCoMKgwqDCoMKgwqDCoGZtdF9z aW5rLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGZt dF9zaW5rLT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1JBVzsKPiA+ICvCoMKgwqDCoMKg wqDCoGZtdF9zaW5rLT54ZmVyX2Z1bmMgPSBWNEwyX01BUF9YRkVSX0ZVTkNfREVGQVVMVChmbXRf c2luay0KPiA+ID5jb2xvcnNwYWNlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGZtdF9zaW5rLT55Y2Jj cl9lbmMgPSBWNEwyX01BUF9ZQ0JDUl9FTkNfREVGQVVMVChmbXRfc2luay0KPiA+ID5jb2xvcnNw YWNlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGZtdF9zaW5rLT5xdWFudGl6YXRpb24gPQo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFY0TDJfTUFQX1FVQU5USVpBVElPTl9ERUZBVUxU KGZhbHNlLCBmbXRfc2luay0KPiA+ID5jb2xvcnNwYWNlLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgZm10X3NpbmstPnljYmNyX2VuYyk7Cj4gPiArCj4gPiArwqDCoMKgwqDC oMKgwqAvKgo+ID4gK8KgwqDCoMKgwqDCoMKgICogV2hlbiBjYWxsZWQgZnJvbSBtaXBpX2NzaTJf c3ViZGV2X2luaXQoKSB0byBpbml0aWFsaXplCj4gPiB0aGUgYWN0aXZlCj4gPiArwqDCoMKgwqDC oMKgwqAgKiBjb25maWd1cmF0aW9uLCBjZmcgaXMgTlVMTCwgd2hpY2ggaW5kaWNhdGVzIHRoZXJl J3Mgbm8KPiA+IHNvdXJjZSBwYWQKPiA+ICvCoMKgwqDCoMKgwqDCoCAqIGNvbmZpZ3VyYXRpb24g dG8gc2V0Lgo+ID4gK8KgwqDCoMKgwqDCoMKgICovCj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoIWNm ZykKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsKPiA+ICsKPiA+ ICvCoMKgwqDCoMKgwqDCoGZtdF9zb3VyY2UgPSBtaXBpX2NzaTJfZ2V0X2Zvcm1hdChzdGF0ZSwg Y2ZnLCB3aGljaCwKPiA+IE1JUElfQ1NJMl9QQURfU09VUkNFKTsKPiA+ICvCoMKgwqDCoMKgwqDC oCpmbXRfc291cmNlID0gKmZtdF9zaW5rOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJu IDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbWlwaV9jc2kyX2dldF9mbXQoc3RydWN0 IHY0bDJfc3ViZGV2ICpzZCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9jb25maWcgKmNmZywK PiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqc2Rmb3JtYXQpCj4gPiArewo+ID4gK8KgwqDC oMKgwqDCoMKgc3RydWN0IGNzaV9zdGF0ZSAqc3RhdGUgPSBtaXBpX3NkX3RvX2NzaTJfc3RhdGUo c2QpOwo+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm10Owo+ ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgZm10ID0gbWlwaV9jc2kyX2dldF9mb3JtYXQoc3RhdGUs IGNmZywgc2Rmb3JtYXQtPndoaWNoLAo+ID4gc2Rmb3JtYXQtPnBhZCk7Cj4gPiArCj4gPiArwqDC oMKgwqDCoMKgwqBtdXRleF9sb2NrKCZzdGF0ZS0+bG9jayk7Cj4gPiArwqDCoMKgwqDCoMKgwqBz ZGZvcm1hdC0+Zm9ybWF0ID0gKmZtdDsKPiA+ICvCoMKgwqDCoMKgwqDCoG11dGV4X3VubG9jaygm c3RhdGUtPmxvY2spOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgbWlwaV9jc2kyX2VudW1fbWJ1c19jb2RlKHN0cnVjdCB2NGwy X3N1YmRldiAqc2QsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9jb25m aWcKPiA+ICpjZmcsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0Cj4gPiB2NGwyX3N1YmRldl9tYnVz X2NvZGVfZW51bSAqY29kZSkKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgY3NpX3N0 YXRlICpzdGF0ZSA9IG1pcGlfc2RfdG9fY3NpMl9zdGF0ZShzZCk7Cj4gPiArCj4gPiArwqDCoMKg wqDCoMKgwqAvKgo+ID4gK8KgwqDCoMKgwqDCoMKgICogV2UgY2FuJ3QgdHJhbnNjb2RlIGluIGFu eSB3YXksIHRoZSBzb3VyY2UgZm9ybWF0IGlzCj4gPiBpZGVudGljYWwKPiA+ICvCoMKgwqDCoMKg wqDCoCAqIHRvIHRoZSBzaW5rIGZvcm1hdC4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqLwo+ID4gK8Kg wqDCoMKgwqDCoMKgaWYgKGNvZGUtPnBhZCA9PSBNSVBJX0NTSTJfUEFEX1NPVVJDRSkgewo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQg KmZtdDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoY29kZS0+ aW5kZXggPiAwKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqByZXR1cm4gLUVJTlZBTDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBmbXQgPSBtaXBpX2NzaTJfZ2V0X2Zvcm1hdChzdGF0ZSwgY2ZnLCBjb2RlLT53aGljaCwK PiA+IGNvZGUtPnBhZCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY29kZS0+ Y29kZSA9IGZtdC0+Y29kZTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1 cm4gMDsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChj b2RlLT5wYWQgIT0gTUlQSV9DU0kyX1BBRF9TSU5LKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHJldHVybiAtRUlOVkFMOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKGNv ZGUtPmluZGV4ID49IEFSUkFZX1NJWkUobWlwaV9jc2kyX2Zvcm1hdHMpKQo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUlOVkFMOwo+ID4gKwo+ID4gK8KgwqDCoMKg wqDCoMKgY29kZS0+Y29kZSA9IG1pcGlfY3NpMl9mb3JtYXRzW2NvZGUtPmluZGV4XS5jb2RlOwo+ ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgbWlwaV9jc2kyX3NldF9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0 IHY0bDJfc3ViZGV2X3BhZF9jb25maWcgKmNmZywKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1h dCAqc2Rmb3JtYXQpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGNzaV9zdGF0ZSAq c3RhdGUgPSBtaXBpX3NkX3RvX2NzaTJfc3RhdGUoc2QpOwo+ID4gK8KgwqDCoMKgwqDCoMKgc3Ry dWN0IGNzaTJfcGl4X2Zvcm1hdCBjb25zdCAqY3NpMl9mbXQ7Cj4gPiArwqDCoMKgwqDCoMKgwqBz dHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmbXQ7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqAv Kgo+ID4gK8KgwqDCoMKgwqDCoMKgICogVGhlIGRldmljZSBjYW4ndCB0cmFuc2NvZGUgaW4gYW55 IHdheSwgdGhlIHNvdXJjZSBmb3JtYXQKPiA+IGNhbid0IGJlCj4gPiArwqDCoMKgwqDCoMKgwqAg KiBtb2RpZmllZC4KPiA+ICvCoMKgwqDCoMKgwqDCoCAqLwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYg KHNkZm9ybWF0LT5wYWQgPT0gTUlQSV9DU0kyX1BBRF9TT1VSQ0UpCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIG1pcGlfY3NpMl9nZXRfZm10KHNkLCBjZmcsIHNkZm9y bWF0KTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChzZGZvcm1hdC0+cGFkICE9IE1JUElf Q1NJMl9QQURfU0lOSykKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4g LUVJTlZBTDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGNzaTJfZm10ID0gZmluZF9jc2kyX2Zv cm1hdChzZGZvcm1hdC0+Zm9ybWF0LmNvZGUpOwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKCFjc2ky X2ZtdCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRldl9lcnIoc3RhdGUt PmRldiwgIm5vIGZvcm1hdCBmb3VuZCBiYXNlZCBvbiBjb2RlCj4gPiAlZFxuIiwKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2Rmb3JtYXQtPmZvcm1h dC5jb2RlKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjc2kyX2ZtdCA9ICZt aXBpX2NzaTJfZm9ybWF0c1swXTsKPiA+ICvCoMKgwqDCoMKgwqDCoH0KPiA+ICsKPiA+ICvCoMKg wqDCoMKgwqDCoGZtdCA9IG1pcGlfY3NpMl9nZXRfZm9ybWF0KHN0YXRlLCBjZmcsIHNkZm9ybWF0 LT53aGljaCwKPiA+IHNkZm9ybWF0LT5wYWQpOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgbXV0 ZXhfbG9jaygmc3RhdGUtPmxvY2spOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgZm10LT5jb2Rl ID0gY3NpMl9mbXQtPmNvZGU7Cj4gPiArwqDCoMKgwqDCoMKgwqBmbXQtPndpZHRoID0gc2Rmb3Jt YXQtPmZvcm1hdC53aWR0aDsKPiA+ICvCoMKgwqDCoMKgwqDCoGZtdC0+aGVpZ2h0ID0gc2Rmb3Jt YXQtPmZvcm1hdC5oZWlnaHQ7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBzZGZvcm1hdC0+Zm9y bWF0ID0gKmZtdDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoC8qIFByb3BhZ2F0ZSB0aGUgZm9y bWF0IGZyb20gc2luayB0byBzb3VyY2UuICovCj4gPiArwqDCoMKgwqDCoMKgwqBmbXQgPSBtaXBp X2NzaTJfZ2V0X2Zvcm1hdChzdGF0ZSwgY2ZnLCBzZGZvcm1hdC0+d2hpY2gsCj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIE1JUElfQ1NJMl9QQURfU09VUkNFKTsKPiA+ICvCoMKgwqDCoMKgwqDCoCpmbXQgPSBzZGZv cm1hdC0+Zm9ybWF0Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgLyogU3RvcmUgdGhlIENTSTIg Zm9ybWF0IGRlc2NyaXB0b3IgZm9yIGFjdGl2ZSBmb3JtYXRzLiAqLwo+ID4gK8KgwqDCoMKgwqDC oMKgaWYgKHNkZm9ybWF0LT53aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFKQo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0YXRlLT5jc2kyX2ZtdCA9IGNzaTJfZm10 Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bG9jayk7Cj4g PiArCj4gPiArwqDCoMKgwqDCoMKgwqAvKgo+ID4gaHR0cHM6Ly9jb21tdW5pdHkubnhwLmNvbS90 NS9pLU1YLVByb2Nlc3NvcnMvRXhwbGVuYXRpb24tZm9yLUhTLVNFVFRMRS1wYXJhbWV0ZXItaW4t TUlQSS1DU0ktRC1QSFktcmVnaXN0ZXJzL20tcC83NjQyNzUvaGlnaGxpZ2h0L3RydWUjTTExODc0 NAo+ID4gwqAqLwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKHNkZm9ybWF0LT5mb3JtYXQud2lkdGgg KiBzZGZvcm1hdC0+Zm9ybWF0LmhlaWdodCA+IDcyMAo+ID4gKiA0ODApCj4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgc3RhdGUtPmhzX3NldHRsZSA9IDB4OTsKPiA+ICvCoMKgwqDC oMKgwqDCoGVsc2UKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdGF0ZS0+aHNf c2V0dGxlID0gMHgxNDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHN0YXRlLT5zZW5kX2xldmVs ID0gNjQ7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBkZXZfZGJnKHN0YXRlLT5kZXYsCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIiVzOiBmb3JtYXQgJWR4JWQgc2VuZF9sZXZl bCAlZCBoc19zZXR0bGUgMHglWFxuIiwKPiA+IF9fZnVuY19fLAo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHNkZm9ybWF0LT5mb3JtYXQud2lkdGgsIHNkZm9ybWF0LT5mb3JtYXQu aGVpZ2h0LAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0YXRlLT5zZW5kX2xl dmVsLCBzdGF0ZS0+aHNfc2V0dGxlKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAw Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG1pcGlfY3NpMl9sb2dfc3RhdHVzKHN0cnVj dCB2NGwyX3N1YmRldiAqc2QpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGNzaV9z dGF0ZSAqc3RhdGUgPSBtaXBpX3NkX3RvX2NzaTJfc3RhdGUoc2QpOwo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoMKgbXV0ZXhfbG9jaygmc3RhdGUtPmxvY2spOwo+ID4gK8KgwqDCoMKgwqDCoMKgbXV0 ZXhfdW5sb2NrKCZzdGF0ZS0+bG9jayk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4g MDsKPiAKPiBQbGVhc2UgZG9uJ3QgcHVzaCBzdHViIGNvZGUgdXBzdHJlYW0uCj4gCj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbWlwaV9j c2kyX2NvcmVfb3BzID0gewo+ID4gK8KgwqDCoMKgwqDCoMKgLmxvZ19zdGF0dXPCoMKgwqDCoMKg PSBtaXBpX2NzaTJfbG9nX3N0YXR1cywKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBz dHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG1pcGlfY3NpMl92aWRlb19vcHMgPSB7Cj4gPiAr wqDCoMKgwqDCoMKgwqAuc19zdHJlYW3CoMKgwqDCoMKgwqDCoD0gbWlwaV9jc2kyX3Nfc3RyZWFt LAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9wYWRf b3BzIG1pcGlfY3NpMl9wYWRfb3BzID0gewo+ID4gK8KgwqDCoMKgwqDCoMKgLmluaXRfY2ZnwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPSBtaXBpX2NzaTJfaW5pdF9jZmcsCj4gPiArwqDC oMKgwqDCoMKgwqAuZW51bV9tYnVzX2NvZGXCoMKgwqDCoMKgwqDCoMKgwqA9IG1pcGlfY3NpMl9l bnVtX21idXNfY29kZSwKPiA+ICvCoMKgwqDCoMKgwqDCoC5nZXRfZm10wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqA9IG1pcGlfY3NpMl9nZXRfZm10LAo+ID4gK8KgwqDCoMKgwqDCoMKg LnNldF9mbXTCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoD0gbWlwaV9jc2kyX3NldF9m bXQsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29w cyBtaXBpX2NzaTJfc3ViZGV2X29wcyA9IHsKPiA+ICvCoMKgwqDCoMKgwqDCoC5jb3JlwqDCoMKg PSAmbWlwaV9jc2kyX2NvcmVfb3BzLAo+ID4gK8KgwqDCoMKgwqDCoMKgLnZpZGVvwqDCoD0gJm1p cGlfY3NpMl92aWRlb19vcHMsCj4gPiArwqDCoMKgwqDCoMKgwqAucGFkwqDCoMKgwqA9ICZtaXBp X2NzaTJfcGFkX29wcywKPiA+ICt9Owo+ID4gKwo+ID4gKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ID4gLS0tLS0tLS0t LS0tLS0KPiA+ICsgKiBNZWRpYSBlbnRpdHkgb3BlcmF0aW9ucwo+ID4gKyAqLwo+ID4gKwo+ID4g K3N0YXRpYyBpbnQgbWlwaV9jc2kyX2xpbmtfc2V0dXAoc3RydWN0IG1lZGlhX2VudGl0eSAqZW50 aXR5LAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgY29uc3Qgc3RydWN0IG1lZGlhX3BhZCAqbG9jYWxfcGFkLAo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgY29uc3Qgc3RydWN0IG1lZGlhX3BhZCAqcmVtb3RlX3BhZCwKPiA+IHUzMiBmbGFncykKPiA+ ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0KPiA+IG1lZGlh X2VudGl0eV90b192NGwyX3N1YmRldihlbnRpdHkpOwo+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0 IGNzaV9zdGF0ZSAqc3RhdGUgPSBtaXBpX3NkX3RvX2NzaTJfc3RhdGUoc2QpOwo+ID4gK8KgwqDC oMKgwqDCoMKgc3RydWN0IHY0bDJfc3ViZGV2ICpyZW1vdGVfc2Q7Cj4gPiArCj4gPiArwqDCoMKg wqDCoMKgwqBkZXZfZGJnKHN0YXRlLT5kZXYsICJsaW5rIHNldHVwICVzIC0+ICVzIiwgcmVtb3Rl X3BhZC0KPiA+ID5lbnRpdHktPm5hbWUsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgbG9jYWxfcGFkLT5lbnRpdHktPm5hbWUpOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgLyog V2Ugb25seSBjYXJlIGFib3V0IHRoZSBsaW5rIHRvIHRoZSBzb3VyY2UuICovCj4gPiArwqDCoMKg wqDCoMKgwqBpZiAoIShsb2NhbF9wYWQtPmZsYWdzICYgTUVESUFfUEFEX0ZMX1NJTkspKQo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoMKgcmVtb3RlX3NkID0gbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KHJlbW90ZV9w YWQtCj4gPiA+ZW50aXR5KTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoGlmIChmbGFncyAmIE1F RElBX0xOS19GTF9FTkFCTEVEKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWYgKHN0YXRlLT5zcmNfc2QpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiAtRUJVU1k7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgc3RhdGUtPnNyY19zZCA9IHJlbW90ZV9zZDsKPiA+ICvCoMKgwqDCoMKgwqDC oH0gZWxzZSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3RhdGUtPnNyY19z ZCA9IE5VTEw7Cj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBy ZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBtZWRpYV9lbnRp dHlfb3BlcmF0aW9ucyBtaXBpX2NzaTJfZW50aXR5X29wcyA9Cj4gPiB7Cj4gPiArwqDCoMKgwqDC oMKgwqAubGlua19zZXR1cMKgwqDCoMKgwqA9IG1pcGlfY3NpMl9saW5rX3NldHVwLAo+ID4gK8Kg wqDCoMKgwqDCoMKgLmxpbmtfdmFsaWRhdGXCoMKgPSB2NGwyX3N1YmRldl9saW5rX3ZhbGlkYXRl LAo+ID4gK8KgwqDCoMKgwqDCoMKgLmdldF9md25vZGVfcGFkID0gdjRsMl9zdWJkZXZfZ2V0X2Z3 bm9kZV9wYWRfMV90b18xLAo+ID4gK307Cj4gPiArCj4gPiArLyogLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gPiAtLS0tLS0t LS0tLS0tLQo+ID4gKyAqIEFzeW5jIHN1YmRldiBub3RpZmllcgo+ID4gKyAqLwo+ID4gKwo+ID4g K3N0YXRpYyBzdHJ1Y3QgY3NpX3N0YXRlICoKPiA+ICttaXBpX25vdGlmaWVyX3RvX2NzaTJfc3Rh dGUoc3RydWN0IHY0bDJfYXN5bmNfbm90aWZpZXIgKm4pCj4gPiArewo+ID4gK8KgwqDCoMKgwqDC oMKgcmV0dXJuIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgY3NpX3N0YXRlLCBub3RpZmllcik7Cj4g PiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbWlwaV9jc2kyX25vdGlmeV9ib3VuZChzdHJ1Y3Qg djRsMl9hc3luY19ub3RpZmllcgo+ID4gKm5vdGlmaWVyLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHY0 bDJfc3ViZGV2ICpzZCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCB2NGwyX2FzeW5jX3N1YmRldiAqYXNk KQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBjc2lfc3RhdGUgKnN0YXRlID0KPiA+ IG1pcGlfbm90aWZpZXJfdG9fY3NpMl9zdGF0ZShub3RpZmllcik7Cj4gPiArwqDCoMKgwqDCoMKg wqBzdHJ1Y3QgbWVkaWFfcGFkICpzaW5rID0gJnN0YXRlLQo+ID4gPnNkLmVudGl0eS5wYWRzW01J UElfQ1NJMl9QQURfU0lOS107Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gdjRsMl9j cmVhdGVfZndub2RlX2xpbmtzX3RvX3BhZChzZCwgc2luaywgMCk7Cj4gPiArfQo+ID4gKwo+ID4g K3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9hc3luY19ub3RpZmllcl9vcGVyYXRpb25zCj4gPiBt aXBpX2NzaTJfbm90aWZ5X29wcyA9IHsKPiA+ICvCoMKgwqDCoMKgwqDCoC5ib3VuZCA9IG1pcGlf Y3NpMl9ub3RpZnlfYm91bmQsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgaW50IG1pcGlfY3Np Ml9hc3luY19yZWdpc3RlcihzdHJ1Y3QgY3NpX3N0YXRlICpzdGF0ZSkKPiA+ICt7Cj4gPiArwqDC oMKgwqDCoMKgwqBzdHJ1Y3QgdjRsMl9md25vZGVfZW5kcG9pbnQgdmVwID0gewo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5idXNfdHlwZSA9IFY0TDJfTUJVU19DU0kyX0RQSFks Cj4gPiArwqDCoMKgwqDCoMKgwqB9Owo+ID4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IHY0bDJfYXN5 bmNfc3ViZGV2ICphc2Q7Cj4gPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZndub2RlX2hhbmRsZSAq ZXA7Cj4gPiArwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQgaTsKPiA+ICvCoMKgwqDCoMKgwqDC oGludCByZXQ7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqB2NGwyX2FzeW5jX25vdGlmaWVyX2lu aXQoJnN0YXRlLT5ub3RpZmllcik7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBlcCA9IGZ3bm9k ZV9ncmFwaF9nZXRfZW5kcG9pbnRfYnlfaWQoZGV2X2Z3bm9kZShzdGF0ZS0KPiA+ID5kZXYpLCAw LCAwLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4gPiBGV05PREVfR1JBUEhf RU5EUE9JTlRfTkVYVCk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoIWVwKQo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PVENPTk47Cj4gPiArCj4gPiArwqDCoMKg wqDCoMKgwqByZXQgPSB2NGwyX2Z3bm9kZV9lbmRwb2ludF9wYXJzZShlcCwgJnZlcCk7Cj4gPiAr wqDCoMKgwqDCoMKgwqBpZiAocmV0KQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGdvdG8gZXJyX3BhcnNlOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgZm9yIChpID0gMDsgaSA8 IHZlcC5idXMubWlwaV9jc2kyLm51bV9kYXRhX2xhbmVzOyArK2kpIHsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAodmVwLmJ1cy5taXBpX2NzaTIuZGF0YV9sYW5lc1tpXSAh PSBpICsgMSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBkZXZfZXJyKHN0YXRlLT5kZXYsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAiZGF0YSBsYW5lcyByZW9yZGVyaW5n IGlzIG5vdAo+ID4gc3VwcG9ydGVkIik7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGdvdG8gZXJyX3BhcnNlOwo+IAo+IE1pc3NpbmcgZXJyb3IgY29k ZS4KPiAKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gPiArwqDCoMKgwqDC oMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBzdGF0ZS0+YnVzID0gdmVwLmJ1cy5taXBp X2NzaTI7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBkZXZfZGJnKHN0YXRlLT5kZXYsICJkYXRh IGxhbmVzOiAlZFxuIiwgc3RhdGUtCj4gPiA+YnVzLm51bV9kYXRhX2xhbmVzKTsKPiA+ICvCoMKg wqDCoMKgwqDCoGRldl9kYmcoc3RhdGUtPmRldiwgImZsYWdzOiAweCUwOHhcbiIsIHN0YXRlLT5i dXMuZmxhZ3MpOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgYXNkID0gdjRsMl9hc3luY19ub3Rp Zmllcl9hZGRfZndub2RlX3JlbW90ZV9zdWJkZXYoJnN0YXRlLQo+ID4gPm5vdGlmaWVyLAo+ID4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBlcCwKPiA+IHN0cnVjdCB2NGwyX2FzeW5jX3N1YmRldik7Cj4gPiArwqDCoMKgwqDCoMKgwqBp ZiAoSVNfRVJSKGFzZCkpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQg PSBQVFJfRVJSKGFzZCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290byBl cnJfcGFyc2U7Cj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBm d25vZGVfaGFuZGxlX3B1dChlcCk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBzdGF0ZS0+bm90 aWZpZXIub3BzID0gJm1pcGlfY3NpMl9ub3RpZnlfb3BzOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDC oMKgcmV0ID0gdjRsMl9hc3luY19zdWJkZXZfbm90aWZpZXJfcmVnaXN0ZXIoJnN0YXRlLT5zZCwK PiA+ICZzdGF0ZS0+bm90aWZpZXIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKHJldCkKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+ID4gKwo+ID4gK8KgwqDC oMKgwqDCoMKgcmV0dXJuIHY0bDJfYXN5bmNfcmVnaXN0ZXJfc3ViZGV2KCZzdGF0ZS0+c2QpOwo+ ID4gKwo+ID4gK2Vycl9wYXJzZToKPiA+ICvCoMKgwqDCoMKgwqDCoGZ3bm9kZV9oYW5kbGVfcHV0 KGVwKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gPiArfQo+ID4gKwo+ ID4gKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQo+ID4gLS0tLS0tLS0tLS0tLS0KPiA+ICsgKiBTdXNwZW5kL3Jlc3VtZQo+ ID4gKyAqLwo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbWlwaV9jc2kyX3BtX3N1c3BlbmQoc3RydWN0 IGRldmljZSAqZGV2LCBib29sIHJ1bnRpbWUpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgc3Ry dWN0IHY0bDJfc3ViZGV2ICpzZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ID4gK8KgwqDCoMKg wqDCoMKgc3RydWN0IGNzaV9zdGF0ZSAqc3RhdGUgPSBtaXBpX3NkX3RvX2NzaTJfc3RhdGUoc2Qp Owo+ID4gK8KgwqDCoMKgwqDCoMKgaW50IHJldCA9IDA7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKg wqBtdXRleF9sb2NrKCZzdGF0ZS0+bG9jayk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoc3RhdGUt PnN0YXRlICYgU1RfUE9XRVJFRCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oG1pcGlfY3NpMl9zdG9wX3N0cmVhbShzdGF0ZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgbWlwaV9jc2kyX2Nsa19kaXNhYmxlKHN0YXRlKTsKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBzdGF0ZS0+c3RhdGUgJj0gflNUX1BPV0VSRUQ7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKCFydW50aW1lKQo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdGF0ZS0+c3RhdGUgfD0gU1RfU1VTUEVO REVEOwo+ID4gK8KgwqDCoMKgwqDCoMKgfQo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgbXV0ZXhf dW5sb2NrKCZzdGF0ZS0+bG9jayk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqByZXQgPSBpY2Nf c2V0X2J3KHN0YXRlLT5pY2NfcGF0aCwgMCwgMCk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0 KQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRldl9lcnIoZGV2LCAiaWNjX3Nl dF9idyBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHJl dHVybiByZXQgPyAtRUFHQUlOIDogMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtaXBp X2NzaTJfcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBydW50aW1lKQo+ID4gK3sK PiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBkZXZfZ2V0X2RydmRh dGEoZGV2KTsKPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBjc2lfc3RhdGUgKnN0YXRlID0gbWlw aV9zZF90b19jc2kyX3N0YXRlKHNkKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGludCByZXQgPSAwOwo+ ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gaWNjX3NldF9idyhzdGF0ZS0+aWNjX3BhdGgs IDAsIHN0YXRlLT5pY2NfcGF0aF9idyk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAocmV0KSB7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZGV2X2VycihkZXYsICJpY2Nfc2V0X2J3 IGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHVybiByZXQ7Cj4gPiArwqDCoMKgwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqDC oMKgwqBtdXRleF9sb2NrKCZzdGF0ZS0+bG9jayk7Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoIXJ1 bnRpbWUgJiYgIShzdGF0ZS0+c3RhdGUgJiBTVF9TVVNQRU5ERUQpKQo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGdvdG8gdW5sb2NrOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKg aWYgKCEoc3RhdGUtPnN0YXRlICYgU1RfUE9XRVJFRCkpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBzdGF0ZS0+c3RhdGUgfD0gU1RfUE9XRVJFRDsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBtaXBpX2NzaTJfY2xrX2VuYWJsZShzdGF0ZSk7Cj4g PiArwqDCoMKgwqDCoMKgwqB9Cj4gPiArwqDCoMKgwqDCoMKgwqBpZiAoc3RhdGUtPnN0YXRlICYg U1RfU1RSRUFNSU5HKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1pcGlfY3Np Ml9zdGFydF9zdHJlYW0oc3RhdGUpOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgc3RhdGUtPnN0 YXRlICY9IH5TVF9TVVNQRU5ERUQ7Cj4gPiArCj4gPiArdW5sb2NrOgo+ID4gK8KgwqDCoMKgwqDC oMKgbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bG9jayk7Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBy ZXR1cm4gcmV0ID8gLUVBR0FJTiA6IDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgX19t YXliZV91bnVzZWQgbWlwaV9jc2kyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ID4gK3sK PiA+ICvCoMKgwqDCoMKgwqDCoHJldHVybiBtaXBpX2NzaTJfcG1fc3VzcGVuZChkZXYsIGZhbHNl KTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBfX21heWJlX3VudXNlZCBtaXBpX2NzaTJf cmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiA+ICt7Cj4gPiArwqDCoMKgwqDCoMKgwqByZXR1 cm4gbWlwaV9jc2kyX3BtX3Jlc3VtZShkZXYsIGZhbHNlKTsKPiA+ICt9Cj4gPiArCj4gPiArc3Rh dGljIGludCBfX21heWJlX3VudXNlZCBtaXBpX2NzaTJfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBk ZXZpY2UKPiA+ICpkZXYpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIG1pcGlfY3Np Ml9wbV9zdXNwZW5kKGRldiwgdHJ1ZSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgX19t YXliZV91bnVzZWQgbWlwaV9jc2kyX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UKPiA+ICpk ZXYpCj4gPiArewo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIG1pcGlfY3NpMl9wbV9yZXN1bWUo ZGV2LCB0cnVlKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1f b3BzIG1pcGlfY3NpMl9wbV9vcHMgPSB7Cj4gPiArwqDCoMKgwqDCoMKgwqBTRVRfUlVOVElNRV9Q TV9PUFMobWlwaV9jc2kyX3J1bnRpbWVfc3VzcGVuZCwKPiA+IG1pcGlfY3NpMl9ydW50aW1lX3Jl c3VtZSwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBOVUxMKQo+ID4gK8KgwqDCoMKgwqDCoMKgU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMobWlw aV9jc2kyX3N1c3BlbmQsCj4gPiBtaXBpX2NzaTJfcmVzdW1lKQo+ID4gK307Cj4gPiArCj4gPiAr LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCj4gPiAtLS0tLS0tLS0tLS0tLQo+ID4gKyAqIFByb2JlL3JlbW92ZSAmIHBsYXRm b3JtIGRyaXZlcgo+ID4gKyAqLwo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbWlwaV9jc2kyX3N1YmRl dl9pbml0KHN0cnVjdCBjc2lfc3RhdGUgKnN0YXRlKQo+ID4gK3sKPiA+ICvCoMKgwqDCoMKgwqDC oHN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSAmc3RhdGUtPnNkOwo+ID4gKwo+ID4gK8KgwqDCoMKg wqDCoMKgdjRsMl9zdWJkZXZfaW5pdChzZCwgJm1pcGlfY3NpMl9zdWJkZXZfb3BzKTsKPiA+ICvC oMKgwqDCoMKgwqDCoHNkLT5vd25lciA9IFRISVNfTU9EVUxFOwo+ID4gK8KgwqDCoMKgwqDCoMKg c25wcmludGYoc2QtPm5hbWUsIHNpemVvZihzZC0+bmFtZSksICIlcy4lZCIsCj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIE1JUElfQ1NJMl9TVUJERVZfTkFNRSwgc3RhdGUtPmlu ZGV4KTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHNkLT5mbGFncyB8PSBWNEwyX1NVQkRFVl9G TF9IQVNfREVWTk9ERTsKPiA+ICvCoMKgwqDCoMKgwqDCoHNkLT5jdHJsX2hhbmRsZXIgPSBOVUxM Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgc2QtPmVudGl0eS5mdW5jdGlvbiA9IE1FRElBX0VO VF9GX1ZJRF9JRl9CUklER0U7Cj4gPiArwqDCoMKgwqDCoMKgwqBzZC0+ZW50aXR5Lm9wcyA9ICZt aXBpX2NzaTJfZW50aXR5X29wczsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHNkLT5kZXYgPSBz dGF0ZS0+ZGV2Owo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgc3RhdGUtPmNzaTJfZm10ID0gJm1p cGlfY3NpMl9mb3JtYXRzWzBdOwo+ID4gK8KgwqDCoMKgwqDCoMKgbWlwaV9jc2kyX2luaXRfY2Zn KHNkLCBOVUxMKTsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoHN0YXRlLT5wYWRzW01JUElfQ1NJ Ml9QQURfU0lOS10uZmxhZ3MgPSBNRURJQV9QQURfRkxfU0lOSwo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB8Cj4gPiBNRURJQV9QQURfRkxfTVVTVF9DT05ORUNUOwo+ID4gK8KgwqDCoMKgwqDC oMKgc3RhdGUtPnBhZHNbTUlQSV9DU0kyX1BBRF9TT1VSQ0VdLmZsYWdzID0KPiA+IE1FRElBX1BB RF9GTF9TT1VSQ0UKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwKPiA+IE1FRElBX1BB RF9GTF9NVVNUX0NPTk5FQ1Q7Cj4gPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gbWVkaWFfZW50aXR5 X3BhZHNfaW5pdCgmc2QtPmVudGl0eSwKPiA+IE1JUElfQ1NJMl9QQURTX05VTSwKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgc3RhdGUtPnBhZHMpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IGlu aXRfaWNjKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiArewo+ID4gK8KgwqDCoMKg wqDCoMKgc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2 KTsKPiA+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBjc2lfc3RhdGUgKnN0YXRlID0gbWlwaV9zZF90 b19jc2kyX3N0YXRlKHNkKTsKPiA+ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gPiArCj4gPiAr wqDCoMKgwqDCoMKgwqAvKiBPcHRpb25hbCBpbnRlcmNvbm5lY3QgcmVxdWVzdCAqLwo+ID4gK8Kg wqDCoMKgwqDCoMKgc3RhdGUtPmljY19wYXRoID0gb2ZfaWNjX2dldCgmcGRldi0+ZGV2LCAiZHJh bSIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgaWYgKElTX0VSUihzdGF0ZS0+aWNjX3BhdGgpKSB7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gUFRSX0VSUihzdGF0ZS0+aWNj X3BhdGgpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQgPT0gLUVQ Uk9CRV9ERUZFUikKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgcmV0dXJuIHJldDsKPiA+ICsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBzdGF0ZS0+aWNjX3BhdGggPSBOVUxMOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHVybiAwOwo+IAo+IE5vcm1hbGx5IGlmIGEgZmVhdHVyZSBpcyBvcHRpb25hbCBmZWF0 dXJlIHRoZW4gaXQgd2lsbCByZXR1cm4gTlVMTCBpZgo+IHRoZSBvcHRpb24gaXMgZGlzYWJsZWQg YW5kIGVycm9yIHBvaW50ZXJzIGlmIHRoZXJlIGlzIGFuIGVycm9yLsKgIEFuZAo+IHRoYXQncyB0 cnVlIGhlcmUgdG9vIGJlY2F1c2Ugb2ZfaWNjX2dldCgpIHdpbGwgcmV0dXJuIE5VTEwgaWYgaXQn cwo+IGRpc2FibGVkLgo+IAo+IEFuZCBub3JtYWxseSBpZiB0aGVyZSBpcyBhbiBlcnJvciB0aGVu IHdlIHRyZWF0IGl0IGxpa2UgYW4gZXJyb3IKPiBpbnN0ZWFkCj4gb2YganVzdCBkaXNhYmxpbmcg aXQuwqAgVGhlIHVzZXIgY2FuIHRoZW4gZml4IHRoZSBlcnJvciBvciBkaXNhYmxlIHRoZQo+IGZl YXR1cmUgYW5kIHRyeSBhZ2Fpbi7CoCBJdCdzIGxpa2UgYXQgYSByZXN0YXVyYW50IGlmIHlvdSBv cmRlcgo+IHBhbmNha2VzCj4gYnV0IHRoZXkgZG9uJ3QgaGF2ZSBhbnksIHRoZXkgZG9uJ3Qgc2ls ZW50bHkgcmVwbGFjZSBpdCB3aXRoIGZyaWVkCj4gZWdnCj4gYmVjYXVzZSBwYW5jYWtlcyBhcmUg bm90IGEgcmVxdWlyZW1lbnQgZm9yIGxpZmUuCj4gCj4gU28gbXkgaW5zdGluY3QgaXMgdGhhdCB0 aGlzIHNob3VsZCBiZSB3cml0dGVuIGFzOgo+IAo+IMKgwqDCoMKgwqDCoMKgwqBzdGF0ZS0+aWNj X3BhdGggPSBvZl9pY2NfZ2V0KCZwZGV2LT5kZXYsICJkcmFtIik7Cj4gwqDCoMKgwqDCoMKgwqDC oGlmIChQVFJfRVJSX09SX05VTEwoc3RhdGUtPmljY19wYXRoKSkKPiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybiBQVFJfRVJSKHN0YXRlLT5pY2NfcGF0aCk7Cj4gCj4gPiAr wqDCoMKgwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqDCoMKgwqBzdGF0ZS0+aWNjX3BhdGhf YncgPSBNQnBzX3RvX2ljYyg3MDApOwo+ID4gKwo+ID4gK8KgwqDCoMKgwqDCoMKgcmV0ID0gaWNj X3NldF9idyhzdGF0ZS0+aWNjX3BhdGgsIDAsIHN0YXRlLT5pY2NfcGF0aF9idyk7Cj4gPiArwqDC oMKgwqDCoMKgwqBpZiAocmV0KSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ZGV2X2VycigmcGRldi0+ZGV2LCAiaWNjX3NldF9idyBmYWlsZWQgd2l0aCAlZFxuIiwKPiA+IHJl dCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJldDsKPiAKPiBQ cm9iYWJseSB3ZSBuZWVkIHRvIGNhbGwgaWNjX3B1dChzdGF0ZS0+aWNjX3BhdGgpIGJlZm9yZSBy ZXR1cm5pbmc/Cj4gSSB3aXNoIHRoZXJlIHdlcmUgYSBvZl9pY2NfcHV0KCkgZnVuY3Rpb24gZXZl biBpZiBpdCB3ZXJlIHZlcnkKPiBzaW1wbGU6Cj4gCj4gdm9pZCBvZl9pY2NfcHV0KHN0cnVjdCBp Y2NfcGF0aCAqcGF0aCkKPiB7Cj4gwqDCoMKgwqDCoMKgwqDCoGljY19wdXQocGF0aCk7Cj4gfQo+ IAo+IFRoZXJlIG5lZWRzIHRvIGJlIGEgZnJlZSBmdW5jdGlvbiBmb3IgaW5pdF9pY2MoKSBhcyB3 ZWxsOgo+IAo+IHZvaWQgcmVsZWFzZV9pY2Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikK PiB7Cj4gwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBkZXZfZ2V0X2Ry dmRhdGEoJnBkZXYtPmRldik7Cj4gwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCBjc2lfc3RhdGUgKnN0 YXRlID0gbWlwaV9zZF90b19jc2kyX3N0YXRlKHNkKTsKPiAKPiDCoMKgwqDCoMKgwqDCoMKgaWNj X3B1dChzdGF0ZS0+cGF0aCk7Cj4gfQo+IAo+IFdlIGNvdWxkIGNhbGwgaXQgZnJvbSBwcm9iZSBp ZiBtaXBpX2NzaTJfcG1fcmVzdW1lKCkgZmFpbHMuwqAKPiBDdXJyZW50bHkKPiB0aGF0IGxlYWtz LsKgIEFsc28gd2UgY291bGQgY2FsbCBpdCBmcm9tIHRoZSByZW1vdmUgZnVuY3Rpb24gaW5zdGVh ZAo+IG9mCj4gY2FsbGluZyBpY2NfcHV0KCkgZGlyZWN0bHkuCj4gCj4gCj4gcmVnYXJkcywKPiBk YW4gY2FycGVudGVyCgoKVGhhbmsgeW91IHZlcnkgbXVjaCBEYW4gZm9yIHRha2luZyB0aGUgdGlt ZSEgSSdsbCBhZGp1c3QgYW5kIGZpeApldmVyeXRoaW5nIHlvdSBwb2ludCBvdXQgZm9yIHRoZSBu ZXh0IHJldmlzaW9uLgoKcmVnYXJkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bWFydGluCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5m cmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xp bnV4LWFybS1rZXJuZWwK