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=-8.4 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=unavailable 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 D439DC433DF for ; Wed, 10 Jun 2020 20:36:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9E563206A4 for ; Wed, 10 Jun 2020 20:36:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=amazon.com header.i=@amazon.com header.b="I/DrW8SM" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726868AbgFJUg5 (ORCPT ); Wed, 10 Jun 2020 16:36:57 -0400 Received: from smtp-fw-9101.amazon.com ([207.171.184.25]:24613 "EHLO smtp-fw-9101.amazon.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726134AbgFJUgz (ORCPT ); Wed, 10 Jun 2020 16:36:55 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.com; i=@amazon.com; q=dns/txt; s=amazon201209; t=1591821411; x=1623357411; h=subject:to:cc:references:from:message-id:date: mime-version:in-reply-to:content-transfer-encoding; bh=liN5JyApF816eig8jyVWFWX64ihEA24InHG8G0A0itM=; b=I/DrW8SMyQ7toxLvnPyXd2TF1xr2EdmyOkNFNmtOTrKJdbe1Yd/wEWhg O2aMPaiH9Lbmdz1/oGtHuAiX0UiSFSq1K25qvuf0vtyV8WNTet5rVoY6i R9RbE8toDoonusT2SE0HZeK7UFMvzb/I05nL+g+ElDWfqzAC6McuWjaOH 8=; IronPort-SDR: myVHALjUDmmzFKOhBSaH0tEyovPT/K4nBY2QiudAG1DuWiPCvUJC5G/hyHFs7lGNgyg3gGoU9L 9u8a1bu9Cvbg== X-IronPort-AV: E=Sophos;i="5.73,497,1583193600"; d="scan'208";a="43119066" Received: from sea32-co-svc-lb4-vlan3.sea.corp.amazon.com (HELO email-inbound-relay-1a-e34f1ddc.us-east-1.amazon.com) ([10.47.23.38]) by smtp-border-fw-out-9101.sea19.amazon.com with ESMTP; 10 Jun 2020 20:36:48 +0000 Received: from EX13MTAUEA002.ant.amazon.com (iad55-ws-svc-p15-lb9-vlan2.iad.amazon.com [10.40.159.162]) by email-inbound-relay-1a-e34f1ddc.us-east-1.amazon.com (Postfix) with ESMTPS id ED84DA2702; Wed, 10 Jun 2020 20:36:36 +0000 (UTC) Received: from EX13D07EUA004.ant.amazon.com (10.43.165.172) by EX13MTAUEA002.ant.amazon.com (10.43.61.77) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 10 Jun 2020 20:36:11 +0000 Received: from EX13MTAUEA002.ant.amazon.com (10.43.61.77) by EX13D07EUA004.ant.amazon.com (10.43.165.172) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 10 Jun 2020 20:36:10 +0000 Received: from u908889d5e8f057.ant.amazon.com (10.1.212.33) by mail-relay.amazon.com (10.43.61.169) with Microsoft SMTP Server (TLS) id 15.0.1497.2 via Frontend Transport; Wed, 10 Jun 2020 20:36:01 +0000 Subject: Re: [PATCH v15 03/14] mm/damon: Implement region based sampling To: SeongJae Park , CC: SeongJae Park , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , References: <20200608114047.26589-1-sjpark@amazon.com> <20200608114047.26589-4-sjpark@amazon.com> From: Message-ID: Date: Wed, 10 Jun 2020 22:36:00 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 MIME-Version: 1.0 In-Reply-To: <20200608114047.26589-4-sjpark@amazon.com> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: base64 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org T24gNi84LzIwIDE6NDAgUE0sIFNlb25nSmFlIFBhcmsgd3JvdGU6Cj4gRnJvbTogU2VvbmdKYWUg UGFyayA8c2pwYXJrQGFtYXpvbi5kZT4KPiAKPiBUaGlzIGNvbW1pdCBpbXBsZW1lbnRzIERBTU9O J3MgYmFzaWMgYWNjZXNzIGNoZWNrIGFuZCByZWdpb24gYmFzZWQKPiBzYW1wbGluZyBtZWNoYW5p c21zLiAgVGhpcyBjaGFuZ2Ugd291bGQgc2VlbXMgbWFrZSBubyBzZW5zZSwgbWFpbmx5Cj4gYmVj YXVzZSBpdCBpcyBvbmx5IGEgcGFydCBvZiB0aGUgREFNT04ncyBsb2dpY3MuICBGb2xsb3dpbmcg dHdvIGNvbW1pdHMKPiB3aWxsIG1ha2UgbW9yZSBzZW5zZS4KPiAKPiBCYXNpYyBBY2Nlc3MgQ2hl Y2sKPiAtLS0tLS0tLS0tLS0tLS0tLS0KPiAKPiBEQU1PTiBiYXNpY2FsbHkgcmVwb3J0cyB3aGF0 IHBhZ2VzIGFyZSBob3cgZnJlcXVlbnRseSBhY2Nlc3NlZC4gIE5vdGUKPiB0aGF0IHRoZSBmcmVx dWVuY3kgaXMgbm90IGFuIGFic29sdXRlIG51bWJlciBvZiBhY2Nlc3NlcywgYnV0IGEgcmVsYXRp dmUKPiBmcmVxdWVuY3kgYW1vbmcgdGhlIHBhZ2VzIG9mIHRoZSB0YXJnZXQgd29ya2xvYWRzLgo+ IAo+IFVzZXJzIGNhbiBjb250cm9sIHRoZSByZXNvbHV0aW9uIG9mIHRoZSByZXBvcnRzIGJ5IHNl dHRpbmcgdHdvIHRpbWUKPiBpbnRlcnZhbHMsIGBgc2FtcGxpbmcgaW50ZXJ2YWxgYCBhbmQgYGBh Z2dyZWdhdGlvbiBpbnRlcnZhbGBgLiAgSW4KPiBkZXRhaWwsIERBTU9OIGNoZWNrcyBhY2Nlc3Mg dG8gZWFjaCBwYWdlIHBlciBgYHNhbXBsaW5nIGludGVydmFsYGAsCj4gYWdncmVnYXRlcyB0aGUg cmVzdWx0cyAoY291bnRzIHRoZSBudW1iZXIgb2YgdGhlIGFjY2Vzc2VzIHRvIGVhY2ggcGFnZSks Cj4gYW5kIHJlcG9ydHMgdGhlIGFnZ3JlZ2F0ZWQgcmVzdWx0cyBwZXIgYGBhZ2dyZWdhdGlvbiBp bnRlcnZhbGBgLiAgRm9yCj4gdGhlIGFjY2VzcyBjaGVjayBvZiBlYWNoIHBhZ2UsIERBTU9OIHVz ZXMgdGhlIEFjY2Vzc2VkIGJpdHMgb2YgUFRFcy4KPiAKPiBUaGlzIGlzIHRodXMgc2ltaWxhciB0 byBjb21tb24gcGVyaW9kaWMgYWNjZXNzIGNoZWNrcyBiYXNlZCBhY2Nlc3MKPiB0cmFja2luZyBt ZWNoYW5pc21zLCB3aGljaCBvdmVyaGVhZCBpcyBpbmNyZWFzaW5nIGFzIHRoZSBzaXplIG9mIHRo ZQo+IHRhcmdldCBwcm9jZXNzIGdyb3dzLgo+IAo+IFJlZ2lvbiBCYXNlZCBTYW1wbGluZwo+IC0t LS0tLS0tLS0tLS0tLS0tLS0tLQo+IAo+IFRvIGF2b2lkIHRoZSB1bmJvdW5kZWQgaW5jcmVhc2Ug b2YgdGhlIG92ZXJoZWFkLCBEQU1PTiBncm91cHMgYSBudW1iZXIKPiBvZiBhZGphY2VudCBwYWdl cyB0aGF0IGFzc3VtZWQgdG8gaGF2ZSBzYW1lIGFjY2VzcyBmcmVxdWVuY2llcyBpbnRvIGEKPiBy ZWdpb24uICBBcyBsb25nIGFzIHRoZSBhc3N1bXB0aW9uIChwYWdlcyBpbiBhIHJlZ2lvbiBoYXZl IHNhbWUgYWNjZXNzCj4gZnJlcXVlbmNpZXMpIGlzIGtlcHQsIG9ubHkgb25lIHBhZ2UgaW4gdGhl IHJlZ2lvbiBpcyByZXF1aXJlZCB0byBiZQo+IGNoZWNrZWQuICBUaHVzLCBmb3IgZWFjaCBgYHNh bXBsaW5nIGludGVydmFsYGAsIERBTU9OIHJhbmRvbWx5IHBpY2tzIG9uZQo+IHBhZ2UgaW4gZWFj aCByZWdpb24gYW5kIGNsZWFycyBpdHMgQWNjZXNzZWQgYml0LiAgQWZ0ZXIgb25lIG1vcmUKPiBg YHNhbXBsaW5nIGludGVydmFsYGAsIERBTU9OIHJlYWRzIHRoZSBBY2Nlc3NlZCBiaXQgb2YgdGhl IHBhZ2UgYW5kCj4gaW5jcmVhc2VzIHRoZSBhY2Nlc3MgZnJlcXVlbmN5IG9mIHRoZSByZWdpb24g aWYgdGhlIGJpdCBoYXMgc2V0Cj4gbWVhbndoaWxlLiAgVGhlcmVmb3JlLCB0aGUgbW9uaXRvcmlu ZyBvdmVyaGVhZCBpcyBjb250cm9sbGFibGUgYnkKPiBzZXR0aW5nIHRoZSBudW1iZXIgb2YgcmVn aW9ucy4KPiAKPiBOb25ldGhlbGVzcywgdGhpcyBzY2hlbWUgY2Fubm90IHByZXNlcnZlIHRoZSBx dWFsaXR5IG9mIHRoZSBvdXRwdXQgaWYKPiB0aGUgYXNzdW1wdGlvbiBpcyBub3Qga2VwdC4gIEZv bGxvd2luZyBjb21taXQgd2lsbCBpbnRyb2R1Y2UgaG93IHdlIGNhbgo+IG1ha2UgdGhlIGd1YXJh bnRlZSB3aXRoIGJlc3QgZWZmb3J0Lgo+IAo+IFNpZ25lZC1vZmYtYnk6IFNlb25nSmFlIFBhcmsg PHNqcGFya0BhbWF6b24uZGU+Cj4gUmV2aWV3ZWQtYnk6IExlb25hcmQgRm9lcnN0ZXIgPGZvZXJz bGVvQGFtYXpvbi5kZT4KPiAtLS0KPiAgaW5jbHVkZS9saW51eC9kYW1vbi5oIHwgIDQ4ICsrKy0K PiAgbW0vZGFtb24uYyAgICAgICAgICAgIHwgNjE1ICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrLQo+ICAyIGZpbGVzIGNoYW5nZWQsIDY2MCBpbnNlcnRpb25zKCspLCAz IGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RhbW9uLmggYi9p bmNsdWRlL2xpbnV4L2RhbW9uLmgKPiBpbmRleCAxMzU2MzMzMzQ5MjkuLmYwZmU0NTIwYTRlOSAx MDA2NDQKPiAtLS0gYS9pbmNsdWRlL2xpbnV4L2RhbW9uLmgKPiArKysgYi9pbmNsdWRlL2xpbnV4 L2RhbW9uLmgKPiBAQCAtMTEsNiArMTEsOCBAQAo+ICAjZGVmaW5lIF9EQU1PTl9IXwo+ICAKPiAg I2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgo+ICsjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KPiAr I2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgo+ICAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KPiAg Cj4gIC8qKgo+IEBAIC00NCwxMSArNDYsNTUgQEAgc3RydWN0IGRhbW9uX3Rhc2sgewo+ICB9Owo+ ICAKPiAgLyoqCj4gLSAqIHN0cnVjdCBkYW1vbl9jdHggLSBSZXByZXNlbnRzIGEgY29udGV4dCBm b3IgZWFjaCBtb25pdG9yaW5nLgo+ICsgKiBzdHJ1Y3QgZGFtb25fY3R4IC0gUmVwcmVzZW50cyBh IGNvbnRleHQgZm9yIGVhY2ggbW9uaXRvcmluZy4gIFRoaXMgaXMgdGhlCj4gKyAqIG1haW4gaW50 ZXJmYWNlIHRoYXQgYWxsb3dzIHVzZXJzIHRvIHNldCB0aGUgYXR0cmlidXRlcyBhbmQgZ2V0IHRo ZSByZXN1bHRzCj4gKyAqIG9mIHRoZSBtb25pdG9yaW5nLgo+ICsgKgo+ICsgKiBGb3IgZWFjaCBt b25pdG9yaW5nIHJlcXVlc3QgKGRhbW9uX3N0YXJ0KCkpLCBhIGtlcm5lbCB0aHJlYWQgZm9yIHRo ZQo+ICsgKiBtb25pdG9yaW5nIGlzIGNyZWF0ZWQuICBUaGUgcG9pbnRlciB0byB0aGUgdGhyZWFk IGlzIHN0b3JlZCBpbiBAa2RhbW9uZC4KPiArICoKPiArICogQHNhbXBsZV9pbnRlcnZhbDoJCVRo ZSB0aW1lIGJldHdlZW4gYWNjZXNzIHNhbXBsaW5ncy4KPiArICogQGFnZ3JfaW50ZXJ2YWw6CQlU aGUgdGltZSBiZXR3ZWVuIG1vbml0b3IgcmVzdWx0cyBhZ2dyZWdhdGlvbnMuCj4gKyAqIEBtaW5f bnJfcmVnaW9uczoJCVRoZSBudW1iZXIgb2YgaW5pdGlhbCBtb25pdG9yaW5nIHJlZ2lvbnMuCj4g KyAqCj4gKyAqIEZvciBlYWNoIEBzYW1wbGVfaW50ZXJ2YWwsIERBTU9OIGNoZWNrcyB3aGV0aGVy IGVhY2ggcmVnaW9uIGlzIGFjY2Vzc2VkIG9yCj4gKyAqIG5vdC4gIEl0IGFnZ3JlZ2F0ZXMgYW5k IGtlZXBzIHRoZSBhY2Nlc3MgaW5mb3JtYXRpb24gKG51bWJlciBvZiBhY2Nlc3NlcyB0bwo+ICsg KiBlYWNoIHJlZ2lvbikgZm9yIEBhZ2dyX2ludGVydmFsIHRpbWUuICBBbGwgdGltZSBpbnRlcnZh bHMgYXJlIGluCj4gKyAqIG1pY3JvLXNlY29uZHMuCj4gKyAqCj4gKyAqIEBrZGFtb25kOgkJS2Vy bmVsIHRocmVhZCB3aG8gZG9lcyB0aGUgbW9uaXRvcmluZy4KPiArICogQGtkYW1vbmRfc3RvcDoJ Tm90aWZpZXMgd2hldGhlciBrZGFtb25kIHNob3VsZCBzdG9wLgo+ICsgKiBAa2RhbW9uZF9sb2Nr OglNdXRleCBmb3IgdGhlIHN5bmNocm9uaXphdGlvbnMgd2l0aCBAa2RhbW9uZC4KPiArICoKPiAr ICogVGhlIG1vbml0b3JpbmcgdGhyZWFkIHNldHMgQGtkYW1vbmQgdG8gTlVMTCB3aGVuIGl0IHRl cm1pbmF0ZXMuICBUaGVyZWZvcmUsCj4gKyAqIHVzZXJzIGNhbiBrbm93IHdoZXRoZXIgdGhlIG1v bml0b3JpbmcgaXMgb25nb2luZyBvciB0ZXJtaW5hdGVkIGJ5IHJlYWRpbmcKPiArICogQGtkYW1v bmQuICBBbHNvLCB1c2VycyBjYW4gYXNrIEBrZGFtb25kIHRvIGJlIHRlcm1pbmF0ZWQgYnkgd3Jp dGluZyBub24temVybwo+ICsgKiB0byBAa2RhbW9uZF9zdG9wLiAgUmVhZHMgYW5kIHdyaXRlcyB0 byBAa2RhbW9uZCBhbmQgQGtkYW1vbmRfc3RvcCBmcm9tCj4gKyAqIG91dHNpZGUgb2YgdGhlIG1v bml0b3JpbmcgdGhyZWFkIG11c3QgYmUgcHJvdGVjdGVkIGJ5IEBrZGFtb25kX2xvY2suCj4gKyAq Cj4gKyAqIE5vdGUgdGhhdCB0aGUgbW9uaXRvcmluZyB0aHJlYWQgcHJvdGVjdHMgb25seSBAa2Rh bW9uZCBhbmQgQGtkYW1vbmRfc3RvcCB2aWEKPiArICogQGtkYW1vbmRfbG9jay4gIEFjY2Vzc2Vz IHRvIG90aGVyIGZpZWxkcyBtdXN0IGJlIHByb3RlY3RlZCBieSB0aGVtc2VsdmVzLgo+ICsgKgo+ ICAgKiBAdGFza3NfbGlzdDoJCUhlYWQgb2YgbW9uaXRvcmluZyB0YXJnZXQgdGFza3MgKCZkYW1v bl90YXNrKSBsaXN0Lgo+ICAgKi8KPiAgc3RydWN0IGRhbW9uX2N0eCB7Cj4gKwl1bnNpZ25lZCBs b25nIHNhbXBsZV9pbnRlcnZhbDsKPiArCXVuc2lnbmVkIGxvbmcgYWdncl9pbnRlcnZhbDsKPiAr CXVuc2lnbmVkIGxvbmcgbWluX25yX3JlZ2lvbnM7Cj4gKwo+ICsJc3RydWN0IHRpbWVzcGVjNjQg bGFzdF9hZ2dyZWdhdGlvbjsKPiArCj4gKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmtkYW1vbmQ7Cj4g Kwlib29sIGtkYW1vbmRfc3RvcDsKPiArCXN0cnVjdCBtdXRleCBrZGFtb25kX2xvY2s7Cj4gKwo+ ICAJc3RydWN0IGxpc3RfaGVhZCB0YXNrc19saXN0OwkvKiAnZGFtb25fdGFzaycgb2JqZWN0cyAq Lwo+ICB9Owo+ICAKPiAraW50IGRhbW9uX3NldF9waWRzKHN0cnVjdCBkYW1vbl9jdHggKmN0eCwg aW50ICpwaWRzLCBzc2l6ZV90IG5yX3BpZHMpOwo+ICtpbnQgZGFtb25fc2V0X2F0dHJzKHN0cnVj dCBkYW1vbl9jdHggKmN0eCwgdW5zaWduZWQgbG9uZyBzYW1wbGVfaW50LAo+ICsJCXVuc2lnbmVk IGxvbmcgYWdncl9pbnQsIHVuc2lnbmVkIGxvbmcgbWluX25yX3JlZyk7Cj4gK2ludCBkYW1vbl9z dGFydChzdHJ1Y3QgZGFtb25fY3R4ICpjdHgpOwo+ICtpbnQgZGFtb25fc3RvcChzdHJ1Y3QgZGFt b25fY3R4ICpjdHgpOwo+ICsKPiAgI2VuZGlmCj4gZGlmZiAtLWdpdCBhL21tL2RhbW9uLmMgYi9t bS9kYW1vbi5jCj4gaW5kZXggMTcwZThhNjk0ZGJlLi5mYTE0ZmY3ZGQzMWEgMTAwNjQ0Cj4gLS0t IGEvbW0vZGFtb24uYwo+ICsrKyBiL21tL2RhbW9uLmMKPiBAQCAtOSwxOCArOSwyOSBAQAo+ICAg KiBUaGlzIGZpbGUgaXMgY29uc3RydWN0ZWQgaW4gYmVsb3cgcGFydHMuCj4gICAqCj4gICAqIC0g RnVuY3Rpb25zIGFuZCBtYWNyb3MgZm9yIERBTU9OIGRhdGEgc3RydWN0dXJlcwo+ICsgKiAtIEZ1 bmN0aW9ucyBmb3IgdGhlIGluaXRpYWwgbW9uaXRvcmluZyB0YXJnZXQgcmVnaW9ucyBjb25zdHJ1 Y3Rpb24KPiArICogLSBGdW5jdGlvbnMgZm9yIHRoZSBhY2Nlc3MgY2hlY2tpbmcgb2YgdGhlIHJl Z2lvbnMKPiArICogLSBGdW5jdGlvbnMgZm9yIERBTU9OIGNvcmUgbG9naWNzIGFuZCBmZWF0dXJl cwo+ICsgKiAtIEZ1bmN0aW9ucyBmb3IgdGhlIERBTU9OIHByb2dyYW1taW5nIGludGVyZmFjZQo+ ICAgKiAtIEZ1bmN0aW9ucyBmb3IgdGhlIG1vZHVsZSBsb2FkaW5nL3VubG9hZGluZwo+IC0gKgo+ IC0gKiBUaGUgY29yZSBwYXJ0cyBhcmUgbm90IGltcGxlbWVudGVkIHlldC4KPiAgICovCj4gIAo+ ICAjZGVmaW5lIHByX2ZtdChmbXQpICJkYW1vbjogIiBmbXQKPiAgCj4gICNpbmNsdWRlIDxsaW51 eC9kYW1vbi5oPgo+ICsjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KPiArI2luY2x1ZGUgPGxpbnV4 L2t0aHJlYWQuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L21tLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9t b2R1bGUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3BhZ2VfaWRsZS5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvcmFuZG9tLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9tbS5oPgo+ICsjaW5jbHVkZSA8 bGludXgvc2NoZWQvdGFzay5oPgo+ICAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ICAKPiArLyog TWluaW1hbCByZWdpb24gc2l6ZS4gIEV2ZXJ5IGRhbW9uX3JlZ2lvbiBpcyBhbGlnbmVkIGJ5IHRo aXMuICovCj4gKyNkZWZpbmUgTUlOX1JFR0lPTiBQQUdFX1NJWkUKPiArCj4gIC8qCj4gICAqIEZ1 bmN0aW9ucyBhbmQgbWFjcm9zIGZvciBEQU1PTiBkYXRhIHN0cnVjdHVyZXMKPiAgICovCj4gQEAg LTE2Nyw2ICsxNzgsNjA2IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnJfZGFtb25fcmVnaW9ucyhz dHJ1Y3QgZGFtb25fdGFzayAqdCkKPiAgCXJldHVybiBucl9yZWdpb25zOwo+ICB9Cj4gIAo+ICsv Kgo+ICsgKiBHZXQgdGhlIG1tX3N0cnVjdCBvZiB0aGUgZ2l2ZW4gdGFzawo+ICsgKgo+ICsgKiBD YWxsZXIgX211c3RfIHB1dCB0aGUgbW1fc3RydWN0IGFmdGVyIHVzZSwgdW5sZXNzIGl0IGlzIE5V TEwuCj4gKyAqCj4gKyAqIFJldHVybnMgdGhlIG1tX3N0cnVjdCBvZiB0aGUgdGFzayBvbiBzdWNj ZXNzLCBOVUxMIG9uIGZhaWx1cmUKPiArICovCj4gK3N0YXRpYyBzdHJ1Y3QgbW1fc3RydWN0ICpk YW1vbl9nZXRfbW0oc3RydWN0IGRhbW9uX3Rhc2sgKnQpCj4gK3sKPiArCXN0cnVjdCB0YXNrX3N0 cnVjdCAqdGFzazsKPiArCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwo+ICsKPiArCXRhc2sgPSBkYW1v bl9nZXRfdGFza19zdHJ1Y3QodCk7Cj4gKwlpZiAoIXRhc2spCj4gKwkJcmV0dXJuIE5VTEw7Cj4g Kwo+ICsJbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKPiArCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsK PiArCXJldHVybiBtbTsKPiArfQo+ICsKPiArLyoKPiArICogRnVuY3Rpb25zIGZvciB0aGUgaW5p dGlhbCBtb25pdG9yaW5nIHRhcmdldCByZWdpb25zIGNvbnN0cnVjdGlvbgo+ICsgKi8KPiArCj4g Ky8qCj4gKyAqIFNpemUtZXZlbmx5IHNwbGl0IGEgcmVnaW9uIGludG8gJ25yX3BpZWNlcycgc21h bGwgcmVnaW9ucwo+ICsgKgo+ICsgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUg ZXJyb3IgY29kZSBvdGhlcndpc2UuCj4gKyAqLwo+ICtzdGF0aWMgaW50IGRhbW9uX3NwbGl0X3Jl Z2lvbl9ldmVubHkoc3RydWN0IGRhbW9uX2N0eCAqY3R4LAo+ICsJCXN0cnVjdCBkYW1vbl9yZWdp b24gKnIsIHVuc2lnbmVkIGludCBucl9waWVjZXMpCj4gK3sKPiArCXVuc2lnbmVkIGxvbmcgc3pf b3JpZywgc3pfcGllY2UsIG9yaWdfZW5kOwo+ICsJc3RydWN0IGRhbW9uX3JlZ2lvbiAqbiA9IE5V TEwsICpuZXh0Owo+ICsJdW5zaWduZWQgbG9uZyBzdGFydDsKPiArCj4gKwlpZiAoIXIgfHwgIW5y X3BpZWNlcykKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlvcmlnX2VuZCA9IHItPnZtX2Vu ZDsKPiArCXN6X29yaWcgPSByLT52bV9lbmQgLSByLT52bV9zdGFydDsKPiArCXN6X3BpZWNlID0g QUxJR05fRE9XTihzel9vcmlnIC8gbnJfcGllY2VzLCBNSU5fUkVHSU9OKTsKPiArCj4gKwlpZiAo IXN6X3BpZWNlKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCXItPnZtX2VuZCA9IHItPnZt X3N0YXJ0ICsgc3pfcGllY2U7Cj4gKwluZXh0ID0gZGFtb25fbmV4dF9yZWdpb24ocik7Cj4gKwlm b3IgKHN0YXJ0ID0gci0+dm1fZW5kOyBzdGFydCArIHN6X3BpZWNlIDw9IG9yaWdfZW5kOwo+ICsJ CQlzdGFydCArPSBzel9waWVjZSkgewo+ICsJCW4gPSBkYW1vbl9uZXdfcmVnaW9uKGN0eCwgc3Rh cnQsIHN0YXJ0ICsgc3pfcGllY2UpOwo+ICsJCWlmICghbikKPiArCQkJcmV0dXJuIC1FTk9NRU07 Cj4gKwkJZGFtb25faW5zZXJ0X3JlZ2lvbihuLCByLCBuZXh0KTsKPiArCQlyID0gbjsKPiArCX0K PiArCS8qIGNvbXBsZW1lbnQgbGFzdCByZWdpb24gZm9yIHBvc3NpYmxlIHJvdW5kaW5nIGVycm9y ICovCj4gKwlpZiAobikKPiArCQluLT52bV9lbmQgPSBvcmlnX2VuZDsKPiArCj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiArc3RydWN0IHJlZ2lvbiB7Cj4gKwl1bnNpZ25lZCBsb25nIHN0YXJ0Owo+ ICsJdW5zaWduZWQgbG9uZyBlbmQ7Cj4gK307Cj4gKwo+ICtzdGF0aWMgdW5zaWduZWQgbG9uZyBz el9yZWdpb24oc3RydWN0IHJlZ2lvbiAqcikKPiArewo+ICsJcmV0dXJuIHItPmVuZCAtIHItPnN0 YXJ0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBzd2FwX3JlZ2lvbnMoc3RydWN0IHJlZ2lvbiAq cjEsIHN0cnVjdCByZWdpb24gKnIyKQo+ICt7Cj4gKwlzdHJ1Y3QgcmVnaW9uIHRtcDsKPiArCj4g Kwl0bXAgPSAqcjE7Cj4gKwkqcjEgPSAqcjI7Cj4gKwkqcjIgPSB0bXA7Cj4gK30KPiArCj4gKy8q Cj4gKyAqIEZpbmQgdGhyZWUgcmVnaW9ucyBzZXBhcmF0ZWQgYnkgdHdvIGJpZ2dlc3QgdW5tYXBw ZWQgcmVnaW9ucwo+ICsgKgo+ICsgKiB2bWEJCXRoZSBoZWFkIHZtYSBvZiB0aGUgdGFyZ2V0IGFk ZHJlc3Mgc3BhY2UKPiArICogcmVnaW9ucwlhbiBhcnJheSBvZiB0aHJlZSAnc3RydWN0IHJlZ2lv bidzIHRoYXQgcmVzdWx0cyB3aWxsIGJlIHNhdmVkCj4gKyAqCj4gKyAqIFRoaXMgZnVuY3Rpb24g cmVjZWl2ZXMgYW4gYWRkcmVzcyBzcGFjZSBhbmQgZmluZHMgdGhyZWUgcmVnaW9ucyBpbiBpdCB3 aGljaAo+ICsgKiBzZXBhcmF0ZWQgYnkgdGhlIHR3byBiaWdnZXN0IHVubWFwcGVkIHJlZ2lvbnMg aW4gdGhlIHNwYWNlLiAgUGxlYXNlIHJlZmVyIHRvCj4gKyAqIGJlbG93IGNvbW1lbnRzIG9mICdk YW1vbl9pbml0X3JlZ2lvbnNfb2YoKScgZnVuY3Rpb24gdG8ga25vdyB3aHkgdGhpcyBpcwo+ICsg KiBuZWNlc3NhcnkuCj4gKyAqCj4gKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzLCBvciBuZWdhdGl2 ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KPiArICovCj4gK3N0YXRpYyBpbnQgZGFtb25fdGhyZWVf cmVnaW9uc19pbl92bWFzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAo+ICsJCXN0cnVjdCBy ZWdpb24gcmVnaW9uc1szXSkKPiArewo+ICsJc3RydWN0IHJlZ2lvbiBnYXAgPSB7MH0sIGZpcnN0 X2dhcCA9IHswfSwgc2Vjb25kX2dhcCA9IHswfTsKPiArCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAq bGFzdF92bWEgPSBOVUxMOwo+ICsJdW5zaWduZWQgbG9uZyBzdGFydCA9IDA7Cj4gKwo+ICsJLyog RmluZCB0d28gYmlnZ2VzdCBnYXBzIHNvIHRoYXQgZmlyc3RfZ2FwID4gc2Vjb25kX2dhcCA+IG90 aGVycyAqLwo+ICsJZm9yICg7IHZtYTsgdm1hID0gdm1hLT52bV9uZXh0KSB7CgpTaW5jZSB2bV9h cmVhX3N0cnVjdCBhbHJlYWR5IG1haW50YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFyZ2Vz dCBnYXAgYmVsb3cgdGhpcyB2bWEKaW4gdGhlIG1tX3JiIHJidHJlZSwgd2Fsa2luZyB0aGUgdm1h IHZpYSBtbV9yYiBpbnN0ZWFkIG9mIHRoZSBsaW5rZWQgbGlzdCwgYW5kIHNraXBwaW5nCnRoZSBv bmVzIHdpdGggZG9uJ3QgZml0IHRoZSBnYXAgcmVxdWlyZW1lbnQgdmlhIHZtYS0+cmJfc3VidHJl ZV9nYXAgaGVscHMgYXZvaWQgdGhlCmV4dHJhIGNvbXBhcmlzb25zIGluIHRoaXMgZnVuY3Rpb24u CgpJIG1lYXN1cmVkIHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gdG8gYmUgY29uc2lkZXJh Ymx5IGZhc3RlciBhcyB0aGUgbnVtYmVyIG9mCnZtYXMgZ3Jvd3MgZm9yIGEgcHJvY2VzcyBkYW1v biB3b3VsZCBhdHRhY2ggdG86Cgotc3RhdGljIGludCBkYW1vbl90aHJlZV9yZWdpb25zX2luX3Zt YXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCitzdGF0aWMgaW50IGRhbW9uX3RocmVlX3Jl Z2lvbnNfaW5fdm1hcyhzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwKIAkJc3RydWN0IHJlZ2lvbiByZWdp b25zWzNdKQogeworCXN0cnVjdCByYl9ub2RlICpuZCA9IE5VTEw7CiAJc3RydWN0IHJlZ2lvbiBn YXAgPSB7MH0sIGZpcnN0X2dhcCA9IHswfSwgc2Vjb25kX2dhcCA9IHswfTsKLQlzdHJ1Y3Qgdm1f YXJlYV9zdHJ1Y3QgKmxhc3Rfdm1hID0gTlVMTDsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZt YSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBzdGFydCA9IDA7CiAKIAkvKiBGaW5kIHR3byBiaWdn ZXN0IGdhcHMgc28gdGhhdCBmaXJzdF9nYXAgPiBzZWNvbmRfZ2FwID4gb3RoZXJzICovCi0JZm9y ICg7IHZtYTsgdm1hID0gdm1hLT52bV9uZXh0KSB7Ci0JCWlmICghbGFzdF92bWEpIHsKLQkJCXN0 YXJ0ID0gdm1hLT52bV9zdGFydDsKLQkJCWxhc3Rfdm1hID0gdm1hOworCWZvciAobmQgPSByYl9m aXJzdChyb290KTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJdm1hID0gcmJfZW50cnkobmQs IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCwgdm1fcmIpOworCisJCWlmICh2bWEtPnJiX3N1YnRyZWVf Z2FwIDwgc3pfcmVnaW9uKCZzZWNvbmRfZ2FwKSkgeworCQkJLyoKKwkJCSAqIFNraXAgdGhpcyB2 bWEgaWYgdGhlIGxhcmdlc3QgZ2FwIGF0IHRoaXMgdm1hIGlzIHN0aWxsCisJCQkgKiBzbWFsbGVy IHRoYW4gd2hhdCB3ZSBoYXZlIGVuY291bnRlcmVkIHNvIGZhci4KKwkJCSAqLwogCQkJY29udGlu dWU7CiAJCX0KLQkJZ2FwLnN0YXJ0ID0gbGFzdF92bWEtPnZtX2VuZDsKKwkJaWYgKCF2bWEtPnZt X3ByZXYpIHsKKwkJCS8qIFRoaXMgaXMgdGhlIGZpcnN0IHZtYS4gKi8KKwkJCXN0YXJ0ID0gdm1h LT52bV9zdGFydDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWdhcC5zdGFydCA9IHZtYS0+dm1fcHJl di0+dm1fZW5kOwogCQlnYXAuZW5kID0gdm1hLT52bV9zdGFydDsKIAkJaWYgKHN6X3JlZ2lvbigm Z2FwKSA+IHN6X3JlZ2lvbigmc2Vjb25kX2dhcCkpIHsKIAkJCXN3YXBfcmVnaW9ucygmZ2FwLCAm c2Vjb25kX2dhcCk7CiAJCQlpZiAoc3pfcmVnaW9uKCZzZWNvbmRfZ2FwKSA+IHN6X3JlZ2lvbigm Zmlyc3RfZ2FwKSkKIAkJCQlzd2FwX3JlZ2lvbnMoJnNlY29uZF9nYXAsICZmaXJzdF9nYXApOwog CQl9Ci0JCWxhc3Rfdm1hID0gdm1hOwogCX0KIAogCWlmICghc3pfcmVnaW9uKCZzZWNvbmRfZ2Fw KSB8fCAhc3pfcmVnaW9uKCZmaXJzdF9nYXApKQpAQCAtMzUsNyArNDQsNyBAQAogCXJlZ2lvbnNb MV0uc3RhcnQgPSBBTElHTihmaXJzdF9nYXAuZW5kLCBNSU5fUkVHSU9OKTsKIAlyZWdpb25zWzFd LmVuZCA9IEFMSUdOKHNlY29uZF9nYXAuc3RhcnQsIE1JTl9SRUdJT04pOwogCXJlZ2lvbnNbMl0u c3RhcnQgPSBBTElHTihzZWNvbmRfZ2FwLmVuZCwgTUlOX1JFR0lPTik7Ci0JcmVnaW9uc1syXS5l bmQgPSBBTElHTihsYXN0X3ZtYS0+dm1fZW5kLCBNSU5fUkVHSU9OKTsKKwlyZWdpb25zWzJdLmVu ZCA9IEFMSUdOKHZtYS0+dm1fZW5kLCBNSU5fUkVHSU9OKTsKIAogCXJldHVybiAwOwogfQoKCj4g KwkJaWYgKCFsYXN0X3ZtYSkgewo+ICsJCQlzdGFydCA9IHZtYS0+dm1fc3RhcnQ7Cj4gKwkJCWxh c3Rfdm1hID0gdm1hOwo+ICsJCQljb250aW51ZTsKPiArCQl9Cj4gKwkJZ2FwLnN0YXJ0ID0gbGFz dF92bWEtPnZtX2VuZDsKPiArCQlnYXAuZW5kID0gdm1hLT52bV9zdGFydDsKPiArCQlpZiAoc3pf cmVnaW9uKCZnYXApID4gc3pfcmVnaW9uKCZzZWNvbmRfZ2FwKSkgewo+ICsJCQlzd2FwX3JlZ2lv bnMoJmdhcCwgJnNlY29uZF9nYXApOwo+ICsJCQlpZiAoc3pfcmVnaW9uKCZzZWNvbmRfZ2FwKSA+ IHN6X3JlZ2lvbigmZmlyc3RfZ2FwKSkKPiArCQkJCXN3YXBfcmVnaW9ucygmc2Vjb25kX2dhcCwg JmZpcnN0X2dhcCk7Cj4gKwkJfQo+ICsJCWxhc3Rfdm1hID0gdm1hOwo+ICsJfQo+ICsKPiArCWlm ICghc3pfcmVnaW9uKCZzZWNvbmRfZ2FwKSB8fCAhc3pfcmVnaW9uKCZmaXJzdF9nYXApKQo+ICsJ CXJldHVybiAtRUlOVkFMOwo+ICsKPiArCS8qIFNvcnQgdGhlIHR3byBiaWdnZXN0IGdhcHMgYnkg YWRkcmVzcyAqLwo+ICsJaWYgKGZpcnN0X2dhcC5zdGFydCA+IHNlY29uZF9nYXAuc3RhcnQpCj4g KwkJc3dhcF9yZWdpb25zKCZmaXJzdF9nYXAsICZzZWNvbmRfZ2FwKTsKPiArCj4gKwkvKiBTdG9y ZSB0aGUgcmVzdWx0ICovCj4gKwlyZWdpb25zWzBdLnN0YXJ0ID0gQUxJR04oc3RhcnQsIE1JTl9S RUdJT04pOwo+ICsJcmVnaW9uc1swXS5lbmQgPSBBTElHTihmaXJzdF9nYXAuc3RhcnQsIE1JTl9S RUdJT04pOwo+ICsJcmVnaW9uc1sxXS5zdGFydCA9IEFMSUdOKGZpcnN0X2dhcC5lbmQsIE1JTl9S RUdJT04pOwo+ICsJcmVnaW9uc1sxXS5lbmQgPSBBTElHTihzZWNvbmRfZ2FwLnN0YXJ0LCBNSU5f UkVHSU9OKTsKPiArCXJlZ2lvbnNbMl0uc3RhcnQgPSBBTElHTihzZWNvbmRfZ2FwLmVuZCwgTUlO X1JFR0lPTik7Cj4gKwlyZWdpb25zWzJdLmVuZCA9IEFMSUdOKGxhc3Rfdm1hLT52bV9lbmQsIE1J Tl9SRUdJT04pOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBHZXQgdGhl IHRocmVlIHJlZ2lvbnMgaW4gdGhlIGdpdmVuIHRhc2sKPiArICoKPiArICogUmV0dXJucyAwIG9u IHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgo+ICsgKi8KPiArc3RhdGlj IGludCBkYW1vbl90aHJlZV9yZWdpb25zX29mKHN0cnVjdCBkYW1vbl90YXNrICp0LAo+ICsJCQkJ c3RydWN0IHJlZ2lvbiByZWdpb25zWzNdKQo+ICt7Cj4gKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsK PiArCWludCByYzsKPiArCj4gKwltbSA9IGRhbW9uX2dldF9tbSh0KTsKPiArCWlmICghbW0pCj4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwo+ICsJ cmMgPSBkYW1vbl90aHJlZV9yZWdpb25zX2luX3ZtYXMobW0tPm1tYXAsIHJlZ2lvbnMpOwo+ICsJ dXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKPiArCj4gKwltbXB1dChtbSk7Cj4gKwlyZXR1cm4gcmM7 Cj4gK30KPiArCj4gKy8qCj4gKyAqIEluaXRpYWxpemUgdGhlIG1vbml0b3JpbmcgdGFyZ2V0IHJl Z2lvbnMgZm9yIHRoZSBnaXZlbiB0YXNrCj4gKyAqCj4gKyAqIHQJdGhlIGdpdmVuIHRhcmdldCB0 YXNrCj4gKyAqCj4gKyAqIEJlY2F1c2Ugb25seSBhIG51bWJlciBvZiBzbWFsbCBwb3J0aW9ucyBv ZiB0aGUgZW50aXJlIGFkZHJlc3Mgc3BhY2UKPiArICogaXMgYWN0dWFsbHkgbWFwcGVkIHRvIHRo ZSBtZW1vcnkgYW5kIGFjY2Vzc2VkLCBtb25pdG9yaW5nIHRoZSB1bm1hcHBlZAo+ICsgKiByZWdp b25zIGlzIHdhc3RlZnVsLiAgVGhhdCBzYWlkLCBiZWNhdXNlIHdlIGNhbiBkZWFsIHdpdGggc21h bGwgbm9pc2VzLAo+ICsgKiB0cmFja2luZyBldmVyeSBtYXBwaW5nIGlzIG5vdCBzdHJpY3RseSBy ZXF1aXJlZCBidXQgY291bGQgZXZlbiBpbmN1ciBhIGhpZ2gKPiArICogb3ZlcmhlYWQgaWYgdGhl IG1hcHBpbmcgZnJlcXVlbnRseSBjaGFuZ2VzIG9yIHRoZSBudW1iZXIgb2YgbWFwcGluZ3MgaXMK PiArICogaGlnaC4gIE5vbmV0aGVsZXNzLCB0aGlzIG1heSBzZWVtcyB2ZXJ5IHdlaXJkLiAgREFN T04ncyBkeW5hbWljIHJlZ2lvbnMKPiArICogYWRqdXN0bWVudCBtZWNoYW5pc20sIHdoaWNoIHdp bGwgYmUgaW1wbGVtZW50ZWQgd2l0aCBmb2xsb3dpbmcgY29tbWl0IHdpbGwKPiArICogbWFrZSB0 aGlzIG1vcmUgc2Vuc2UuCj4gKyAqCj4gKyAqIEZvciB0aGUgcmVhc29uLCB3ZSBjb252ZXJ0IHRo ZSBjb21wbGV4IG1hcHBpbmdzIHRvIHRocmVlIGRpc3RpbmN0IHJlZ2lvbnMKPiArICogdGhhdCBj b3ZlciBldmVyeSBtYXBwZWQgYXJlYSBvZiB0aGUgYWRkcmVzcyBzcGFjZS4gIEFsc28gdGhlIHR3 byBnYXBzCj4gKyAqIGJldHdlZW4gdGhlIHRocmVlIHJlZ2lvbnMgYXJlIHRoZSB0d28gYmlnZ2Vz dCB1bm1hcHBlZCBhcmVhcyBpbiB0aGUgZ2l2ZW4KPiArICogYWRkcmVzcyBzcGFjZS4gIEluIGRl dGFpbCwgdGhpcyBmdW5jdGlvbiBmaXJzdCBpZGVudGlmaWVzIHRoZSBzdGFydCBhbmQgdGhlCj4g KyAqIGVuZCBvZiB0aGUgbWFwcGluZ3MgYW5kIHRoZSB0d28gYmlnZ2VzdCB1bm1hcHBlZCBhcmVh cyBvZiB0aGUgYWRkcmVzcyBzcGFjZS4KPiArICogVGhlbiwgaXQgY29uc3RydWN0cyB0aGUgdGhy ZWUgcmVnaW9ucyBhcyBiZWxvdzoKPiArICoKPiArICogICAgIFttYXBwaW5nc1swXS0+c3RhcnQs IGJpZ190d29fdW5tYXBwZWRfYXJlYXNbMF0tPnN0YXJ0KQo+ICsgKiAgICAgW2JpZ190d29fdW5t YXBwZWRfYXJlYXNbMF0tPmVuZCwgYmlnX3R3b191bm1hcHBlZF9hcmVhc1sxXS0+c3RhcnQpCj4g KyAqICAgICBbYmlnX3R3b191bm1hcHBlZF9hcmVhc1sxXS0+ZW5kLCBtYXBwaW5nc1tucl9tYXBw aW5ncyAtIDFdLT5lbmQpCj4gKyAqCj4gKyAqIEFzIHVzdWFsIG1lbW9yeSBtYXAgb2YgcHJvY2Vz c2VzIGlzIGFzIGJlbG93LCB0aGUgZ2FwIGJldHdlZW4gdGhlIGhlYXAgYW5kCj4gKyAqIHRoZSB1 cHBlcm1vc3QgbW1hcCgpLWVkIHJlZ2lvbiwgYW5kIHRoZSBnYXAgYmV0d2VlbiB0aGUgbG93ZXJt b3N0IG1tYXAoKS1lZAo+ICsgKiByZWdpb24gYW5kIHRoZSBzdGFjayB3aWxsIGJlIHR3byBiaWdn ZXN0IHVubWFwcGVkIHJlZ2lvbnMuICBCZWNhdXNlIHRoZXNlCj4gKyAqIGdhcHMgYXJlIGV4Y2Vw dGlvbmFsbHkgaHVnZSBhcmVhcyBpbiB1c3VhbCBhZGRyZXNzIHNwYWNlLCBleGNsdWRpbmcgdGhl c2UKPiArICogdHdvIGJpZ2dlc3QgdW5tYXBwZWQgcmVnaW9ucyB3aWxsIGJlIHN1ZmZpY2llbnQg dG8gbWFrZSBhIHRyYWRlLW9mZi4KPiArICoKPiArICogICA8aGVhcD4KPiArICogICA8QklHIFVO TUFQUEVEIFJFR0lPTiAxPgo+ICsgKiAgIDx1cHBlcm1vc3QgbW1hcCgpLWVkIHJlZ2lvbj4KPiAr ICogICAob3RoZXIgbW1hcCgpLWVkIHJlZ2lvbnMgYW5kIHNtYWxsIHVubWFwcGVkIHJlZ2lvbnMp Cj4gKyAqICAgPGxvd2VybW9zdCBtbWFwKCktZWQgcmVnaW9uPgo+ICsgKiAgIDxCSUcgVU5NQVBQ RUQgUkVHSU9OIDI+Cj4gKyAqICAgPHN0YWNrPgo+ICsgKi8KPiArc3RhdGljIHZvaWQgZGFtb25f aW5pdF9yZWdpb25zX29mKHN0cnVjdCBkYW1vbl9jdHggKmMsIHN0cnVjdCBkYW1vbl90YXNrICp0 KQo+ICt7Cj4gKwlzdHJ1Y3QgZGFtb25fcmVnaW9uICpyLCAqbSA9IE5VTEw7Cj4gKwlzdHJ1Y3Qg cmVnaW9uIHJlZ2lvbnNbM107Cj4gKwlpbnQgaTsKPiArCj4gKwlpZiAoZGFtb25fdGhyZWVfcmVn aW9uc19vZih0LCByZWdpb25zKSkgewo+ICsJCXByX2VycigiRmFpbGVkIHRvIGdldCB0aHJlZSBy ZWdpb25zIG9mIHRhc2sgJWRcbiIsIHQtPnBpZCk7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiAr CS8qIFNldCB0aGUgaW5pdGlhbCB0aHJlZSByZWdpb25zIG9mIHRoZSB0YXNrICovCj4gKwlmb3Ig KGkgPSAwOyBpIDwgMzsgaSsrKSB7Cj4gKwkJciA9IGRhbW9uX25ld19yZWdpb24oYywgcmVnaW9u c1tpXS5zdGFydCwgcmVnaW9uc1tpXS5lbmQpOwo+ICsJCWlmICghcikgewo+ICsJCQlwcl9lcnIo IiVkJ3RoIGluaXQgcmVnaW9uIGNyZWF0aW9uIGZhaWxlZFxuIiwgaSk7Cj4gKwkJCXJldHVybjsK PiArCQl9Cj4gKwkJZGFtb25fYWRkX3JlZ2lvbihyLCB0KTsKPiArCQlpZiAoaSA9PSAxKQo+ICsJ CQltID0gcjsKPiArCX0KPiArCj4gKwkvKiBTcGxpdCB0aGUgbWlkZGxlIHJlZ2lvbiBpbnRvICdt aW5fbnJfcmVnaW9ucyAtIDInIHJlZ2lvbnMgKi8KPiArCWlmIChkYW1vbl9zcGxpdF9yZWdpb25f ZXZlbmx5KGMsIG0sIGMtPm1pbl9ucl9yZWdpb25zIC0gMikpCj4gKwkJcHJfd2FybigiSW5pdCBt aWRkbGUgcmVnaW9uIGZhaWxlZCB0byBiZSBzcGxpdFxuIik7Cj4gK30KPiArCj4gKy8qIEluaXRp YWxpemUgJy0+cmVnaW9uc19saXN0JyBvZiBldmVyeSB0YXNrICovCj4gK3N0YXRpYyB2b2lkIGtk YW1vbmRfaW5pdF9yZWdpb25zKHN0cnVjdCBkYW1vbl9jdHggKmN0eCkKPiArewo+ICsJc3RydWN0 IGRhbW9uX3Rhc2sgKnQ7Cj4gKwo+ICsJZGFtb25fZm9yX2VhY2hfdGFzayh0LCBjdHgpCj4gKwkJ ZGFtb25faW5pdF9yZWdpb25zX29mKGN0eCwgdCk7Cj4gK30KPiArCj4gKy8qCj4gKyAqIEZ1bmN0 aW9ucyBmb3IgdGhlIGFjY2VzcyBjaGVja2luZyBvZiB0aGUgcmVnaW9ucwo+ICsgKi8KPiArCj4g K3N0YXRpYyB2b2lkIGRhbW9uX21rb2xkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBs b25nIGFkZHIpCj4gK3sKPiArCXB0ZV90ICpwdGUgPSBOVUxMOwo+ICsJcG1kX3QgKnBtZCA9IE5V TEw7Cj4gKwlzcGlubG9ja190ICpwdGw7Cj4gKwo+ICsJaWYgKGZvbGxvd19wdGVfcG1kKG1tLCBh ZGRyLCBOVUxMLCAmcHRlLCAmcG1kLCAmcHRsKSkKPiArCQlyZXR1cm47Cj4gKwo+ICsJaWYgKHB0 ZSkgewo+ICsJCWlmIChwdGVfeW91bmcoKnB0ZSkpIHsKPiArCQkJY2xlYXJfcGFnZV9pZGxlKHB0 ZV9wYWdlKCpwdGUpKTsKPiArCQkJc2V0X3BhZ2VfeW91bmcocHRlX3BhZ2UoKnB0ZSkpOwo+ICsJ CX0KPiArCQkqcHRlID0gcHRlX21rb2xkKCpwdGUpOwo+ICsJCXB0ZV91bm1hcF91bmxvY2socHRl LCBwdGwpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJF TlRfSFVHRVBBR0UKPiArCWlmIChwbWRfeW91bmcoKnBtZCkpIHsKPiArCQljbGVhcl9wYWdlX2lk bGUocG1kX3BhZ2UoKnBtZCkpOwo+ICsJCXNldF9wYWdlX3lvdW5nKHBtZF9wYWdlKCpwbWQpKTsK PiArCX0KPiArCSpwbWQgPSBwbWRfbWtvbGQoKnBtZCk7Cj4gKwlzcGluX3VubG9jayhwdGwpOwo+ ICsjZW5kaWYgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIGRhbW9uX3ByZXBhcmVfYWNjZXNzX2NoZWNrKHN0cnVjdCBkYW1vbl9jdHggKmN0 eCwKPiArCQkJc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBkYW1vbl9yZWdpb24gKnIpCj4g K3sKPiArCXItPnNhbXBsaW5nX2FkZHIgPSBkYW1vbl9yYW5kKHItPnZtX3N0YXJ0LCByLT52bV9l bmQpOwo+ICsKPiArCWRhbW9uX21rb2xkKG1tLCByLT5zYW1wbGluZ19hZGRyKTsKPiArfQo+ICsK PiArc3RhdGljIHZvaWQga2RhbW9uZF9wcmVwYXJlX2FjY2Vzc19jaGVja3Moc3RydWN0IGRhbW9u X2N0eCAqY3R4KQo+ICt7Cj4gKwlzdHJ1Y3QgZGFtb25fdGFzayAqdDsKPiArCXN0cnVjdCBtbV9z dHJ1Y3QgKm1tOwo+ICsJc3RydWN0IGRhbW9uX3JlZ2lvbiAqcjsKPiArCj4gKwlkYW1vbl9mb3Jf ZWFjaF90YXNrKHQsIGN0eCkgewo+ICsJCW1tID0gZGFtb25fZ2V0X21tKHQpOwo+ICsJCWlmICgh bW0pCj4gKwkJCWNvbnRpbnVlOwo+ICsJCWRhbW9uX2Zvcl9lYWNoX3JlZ2lvbihyLCB0KQo+ICsJ CQlkYW1vbl9wcmVwYXJlX2FjY2Vzc19jaGVjayhjdHgsIG1tLCByKTsKPiArCQltbXB1dChtbSk7 Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGRhbW9uX3lvdW5nKHN0cnVjdCBtbV9zdHJ1 Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4gKwkJCXVuc2lnbmVkIGxvbmcgKnBhZ2Vfc3op Cj4gK3sKPiArCXB0ZV90ICpwdGUgPSBOVUxMOwo+ICsJcG1kX3QgKnBtZCA9IE5VTEw7Cj4gKwlz cGlubG9ja190ICpwdGw7Cj4gKwlib29sIHlvdW5nID0gZmFsc2U7Cj4gKwo+ICsJaWYgKGZvbGxv d19wdGVfcG1kKG1tLCBhZGRyLCBOVUxMLCAmcHRlLCAmcG1kLCAmcHRsKSkKPiArCQlyZXR1cm4g ZmFsc2U7Cj4gKwo+ICsJKnBhZ2Vfc3ogPSBQQUdFX1NJWkU7Cj4gKwlpZiAocHRlKSB7Cj4gKwkJ eW91bmcgPSBwdGVfeW91bmcoKnB0ZSk7Cj4gKwkJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7 Cj4gKwkJcmV0dXJuIHlvdW5nOwo+ICsJfQo+ICsKPiArI2lmZGVmIENPTkZJR19UUkFOU1BBUkVO VF9IVUdFUEFHRQo+ICsJeW91bmcgPSBwbWRfeW91bmcoKnBtZCk7Cj4gKwlzcGluX3VubG9jayhw dGwpOwo+ICsJKnBhZ2Vfc3ogPSAoKDFVTCkgPDwgSFBBR0VfUE1EX1NISUZUKTsKPiArI2VuZGlm CS8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICsKPiArCXJldHVybiB5b3VuZzsK PiArfQo+ICsKPiArLyoKPiArICogQ2hlY2sgd2hldGhlciB0aGUgcmVnaW9uIHdhcyBhY2Nlc3Nl ZCBhZnRlciB0aGUgbGFzdCBwcmVwYXJhdGlvbgo+ICsgKgo+ICsgKiBtbQknbW1fc3RydWN0JyBm b3IgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVzcyBzcGFjZQo+ICsgKiByCXRoZSByZWdpb24gdG8g YmUgY2hlY2tlZAo+ICsgKi8KPiArc3RhdGljIHZvaWQgZGFtb25fY2hlY2tfYWNjZXNzKHN0cnVj dCBkYW1vbl9jdHggKmN0eCwKPiArCQkJICAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1 Y3QgZGFtb25fcmVnaW9uICpyKQo+ICt7Cj4gKwlzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqbGFz dF9tbTsKPiArCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfYWRkcjsKPiArCXN0YXRpYyB1bnNp Z25lZCBsb25nIGxhc3RfcGFnZV9zeiA9IFBBR0VfU0laRTsKPiArCXN0YXRpYyBib29sIGxhc3Rf YWNjZXNzZWQ7Cj4gKwo+ICsJLyogSWYgdGhlIHJlZ2lvbiBpcyBpbiB0aGUgbGFzdCBjaGVja2Vk IHBhZ2UsIHJldXNlIHRoZSByZXN1bHQgKi8KPiArCWlmIChtbSA9PSBsYXN0X21tICYmIChBTElH Tl9ET1dOKGxhc3RfYWRkciwgbGFzdF9wYWdlX3N6KSA9PQo+ICsJCQkJQUxJR05fRE9XTihyLT5z YW1wbGluZ19hZGRyLCBsYXN0X3BhZ2Vfc3opKSkgewo+ICsJCWlmIChsYXN0X2FjY2Vzc2VkKQo+ ICsJCQlyLT5ucl9hY2Nlc3NlcysrOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlsYXN0X2Fj Y2Vzc2VkID0gZGFtb25feW91bmcobW0sIHItPnNhbXBsaW5nX2FkZHIsICZsYXN0X3BhZ2Vfc3op Owo+ICsJaWYgKGxhc3RfYWNjZXNzZWQpCj4gKwkJci0+bnJfYWNjZXNzZXMrKzsKPiArCj4gKwls YXN0X21tID0gbW07Cj4gKwlsYXN0X2FkZHIgPSByLT5zYW1wbGluZ19hZGRyOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBrZGFtb25kX2NoZWNrX2FjY2Vzc2VzKHN0cnVjdCBkYW1vbl9jdHggKmN0 eCkKPiArewo+ICsJc3RydWN0IGRhbW9uX3Rhc2sgKnQ7Cj4gKwlzdHJ1Y3QgbW1fc3RydWN0ICpt bTsKPiArCXN0cnVjdCBkYW1vbl9yZWdpb24gKnI7Cj4gKwo+ICsJZGFtb25fZm9yX2VhY2hfdGFz ayh0LCBjdHgpIHsKPiArCQltbSA9IGRhbW9uX2dldF9tbSh0KTsKPiArCQlpZiAoIW1tKQo+ICsJ CQljb250aW51ZTsKPiArCQlkYW1vbl9mb3JfZWFjaF9yZWdpb24ociwgdCkKPiArCQkJZGFtb25f Y2hlY2tfYWNjZXNzKGN0eCwgbW0sIHIpOwo+ICsJCW1tcHV0KG1tKTsKPiArCX0KPiArfQo+ICsK PiArLyoKPiArICogRnVuY3Rpb25zIGZvciBEQU1PTiBjb3JlIGxvZ2ljcyBhbmQgZmVhdHVyZXMK PiArICovCj4gKwo+ICsvKgo+ICsgKiBkYW1vbl9jaGVja19yZXNldF90aW1lX2ludGVydmFsKCkg LSBDaGVjayBpZiBhIHRpbWUgaW50ZXJ2YWwgaXMgZWxhcHNlZC4KPiArICogQGJhc2VsaW5lOgl0 aGUgdGltZSB0byBjaGVjayB3aGV0aGVyIHRoZSBpbnRlcnZhbCBoYXMgZWxhcHNlZCBzaW5jZQo+ ICsgKiBAaW50ZXJ2YWw6CXRoZSB0aW1lIGludGVydmFsIChtaWNyb3NlY29uZHMpCj4gKyAqCj4g KyAqIFNlZSB3aGV0aGVyIHRoZSBnaXZlbiB0aW1lIGludGVydmFsIGhhcyBwYXNzZWQgc2luY2Ug dGhlIGdpdmVuIGJhc2VsaW5lCj4gKyAqIHRpbWUuICBJZiBzbywgaXQgYWxzbyB1cGRhdGVzIHRo ZSBiYXNlbGluZSB0byBjdXJyZW50IHRpbWUgZm9yIG5leHQgY2hlY2suCj4gKyAqCj4gKyAqIFJl dHVybjoJdHJ1ZSBpZiB0aGUgdGltZSBpbnRlcnZhbCBoYXMgcGFzc2VkLCBvciBmYWxzZSBvdGhl cndpc2UuCj4gKyAqLwo+ICtzdGF0aWMgYm9vbCBkYW1vbl9jaGVja19yZXNldF90aW1lX2ludGVy dmFsKHN0cnVjdCB0aW1lc3BlYzY0ICpiYXNlbGluZSwKPiArCQl1bnNpZ25lZCBsb25nIGludGVy dmFsKQo+ICt7Cj4gKwlzdHJ1Y3QgdGltZXNwZWM2NCBub3c7Cj4gKwo+ICsJa3RpbWVfZ2V0X2Nv YXJzZV90czY0KCZub3cpOwo+ICsJaWYgKCh0aW1lc3BlYzY0X3RvX25zKCZub3cpIC0gdGltZXNw ZWM2NF90b19ucyhiYXNlbGluZSkpIDwKPiArCQkJaW50ZXJ2YWwgKiAxMDAwKQo+ICsJCXJldHVy biBmYWxzZTsKPiArCSpiYXNlbGluZSA9IG5vdzsKPiArCXJldHVybiB0cnVlOwo+ICt9Cj4gKwo+ ICsvKgo+ICsgKiBDaGVjayB3aGV0aGVyIGl0IGlzIHRpbWUgdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0 ZWQgaW5mb3JtYXRpb24KPiArICovCj4gK3N0YXRpYyBib29sIGtkYW1vbmRfYWdncmVnYXRlX2lu dGVydmFsX3Bhc3NlZChzdHJ1Y3QgZGFtb25fY3R4ICpjdHgpCj4gK3sKPiArCXJldHVybiBkYW1v bl9jaGVja19yZXNldF90aW1lX2ludGVydmFsKCZjdHgtPmxhc3RfYWdncmVnYXRpb24sCj4gKwkJ CWN0eC0+YWdncl9pbnRlcnZhbCk7Cj4gK30KPiArCj4gKy8qCj4gKyAqIFJlc2V0IHRoZSBhZ2dy ZWdhdGVkIG1vbml0b3JpbmcgcmVzdWx0cwo+ICsgKi8KPiArc3RhdGljIHZvaWQga2RhbW9uZF9y ZXNldF9hZ2dyZWdhdGVkKHN0cnVjdCBkYW1vbl9jdHggKmMpCj4gK3sKPiArCXN0cnVjdCBkYW1v bl90YXNrICp0Owo+ICsJc3RydWN0IGRhbW9uX3JlZ2lvbiAqcjsKPiArCj4gKwlkYW1vbl9mb3Jf ZWFjaF90YXNrKHQsIGMpIHsKPiArCQlkYW1vbl9mb3JfZWFjaF9yZWdpb24ociwgdCkKPiArCQkJ ci0+bnJfYWNjZXNzZXMgPSAwOwo+ICsJfQo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBDaGVjayB3aGV0 aGVyIGN1cnJlbnQgbW9uaXRvcmluZyBzaG91bGQgYmUgc3RvcHBlZAo+ICsgKgo+ICsgKiBUaGUg bW9uaXRvcmluZyBpcyBzdG9wcGVkIHdoZW4gZWl0aGVyIHRoZSB1c2VyIHJlcXVlc3RlZCB0byBz dG9wLCBvciBhbGwKPiArICogbW9uaXRvcmluZyB0YXJnZXQgdGFza3MgYXJlIGRlYWQuCj4gKyAq Cj4gKyAqIFJldHVybnMgdHJ1ZSBpZiBuZWVkIHRvIHN0b3AgY3VycmVudCBtb25pdG9yaW5nLgo+ ICsgKi8KPiArc3RhdGljIGJvb2wga2RhbW9uZF9uZWVkX3N0b3Aoc3RydWN0IGRhbW9uX2N0eCAq Y3R4KQo+ICt7Cj4gKwlzdHJ1Y3QgZGFtb25fdGFzayAqdDsKPiArCXN0cnVjdCB0YXNrX3N0cnVj dCAqdGFzazsKPiArCWJvb2wgc3RvcDsKPiArCj4gKwltdXRleF9sb2NrKCZjdHgtPmtkYW1vbmRf bG9jayk7Cj4gKwlzdG9wID0gY3R4LT5rZGFtb25kX3N0b3A7Cj4gKwltdXRleF91bmxvY2soJmN0 eC0+a2RhbW9uZF9sb2NrKTsKPiArCWlmIChzdG9wKQo+ICsJCXJldHVybiB0cnVlOwo+ICsKPiAr CWRhbW9uX2Zvcl9lYWNoX3Rhc2sodCwgY3R4KSB7Cj4gKwkJdGFzayA9IGRhbW9uX2dldF90YXNr X3N0cnVjdCh0KTsKPiArCQlpZiAodGFzaykgewo+ICsJCQlwdXRfdGFza19zdHJ1Y3QodGFzayk7 Cj4gKwkJCXJldHVybiBmYWxzZTsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHRydWU7Cj4g K30KPiArCj4gKy8qCj4gKyAqIFRoZSBtb25pdG9yaW5nIGRhZW1vbiB0aGF0IHJ1bnMgYXMgYSBr ZXJuZWwgdGhyZWFkCj4gKyAqLwo+ICtzdGF0aWMgaW50IGtkYW1vbmRfZm4odm9pZCAqZGF0YSkK PiArewo+ICsJc3RydWN0IGRhbW9uX2N0eCAqY3R4ID0gKHN0cnVjdCBkYW1vbl9jdHggKilkYXRh Owo+ICsJc3RydWN0IGRhbW9uX3Rhc2sgKnQ7Cj4gKwlzdHJ1Y3QgZGFtb25fcmVnaW9uICpyLCAq bmV4dDsKPiArCj4gKwlwcl9pbmZvKCJrZGFtb25kICglZCkgc3RhcnRzXG4iLCBjdHgtPmtkYW1v bmQtPnBpZCk7Cj4gKwlrZGFtb25kX2luaXRfcmVnaW9ucyhjdHgpOwo+ICsJd2hpbGUgKCFrZGFt b25kX25lZWRfc3RvcChjdHgpKSB7Cj4gKwkJa2RhbW9uZF9wcmVwYXJlX2FjY2Vzc19jaGVja3Mo Y3R4KTsKPiArCj4gKwkJdXNsZWVwX3JhbmdlKGN0eC0+c2FtcGxlX2ludGVydmFsLCBjdHgtPnNh bXBsZV9pbnRlcnZhbCArIDEpOwo+ICsKPiArCQlrZGFtb25kX2NoZWNrX2FjY2Vzc2VzKGN0eCk7 Cj4gKwo+ICsJCWlmIChrZGFtb25kX2FnZ3JlZ2F0ZV9pbnRlcnZhbF9wYXNzZWQoY3R4KSkKPiAr CQkJa2RhbW9uZF9yZXNldF9hZ2dyZWdhdGVkKGN0eCk7Cj4gKwo+ICsJfQo+ICsJZGFtb25fZm9y X2VhY2hfdGFzayh0LCBjdHgpIHsKPiArCQlkYW1vbl9mb3JfZWFjaF9yZWdpb25fc2FmZShyLCBu ZXh0LCB0KQo+ICsJCQlkYW1vbl9kZXN0cm95X3JlZ2lvbihyKTsKPiArCX0KPiArCXByX2RlYnVn KCJrZGFtb25kICglZCkgZmluaXNoZXNcbiIsIGN0eC0+a2RhbW9uZC0+cGlkKTsKPiArCW11dGV4 X2xvY2soJmN0eC0+a2RhbW9uZF9sb2NrKTsKPiArCWN0eC0+a2RhbW9uZCA9IE5VTEw7Cj4gKwlt dXRleF91bmxvY2soJmN0eC0+a2RhbW9uZF9sb2NrKTsKPiArCj4gKwlkb19leGl0KDApOwo+ICt9 Cj4gKwo+ICsvKgo+ICsgKiBGdW5jdGlvbnMgZm9yIHRoZSBEQU1PTiBwcm9ncmFtbWluZyBpbnRl cmZhY2UKPiArICovCj4gKwo+ICtzdGF0aWMgYm9vbCBkYW1vbl9rZGFtb25kX3J1bm5pbmcoc3Ry dWN0IGRhbW9uX2N0eCAqY3R4KQo+ICt7Cj4gKwlib29sIHJ1bm5pbmc7Cj4gKwo+ICsJbXV0ZXhf bG9jaygmY3R4LT5rZGFtb25kX2xvY2spOwo+ICsJcnVubmluZyA9IGN0eC0+a2RhbW9uZCAhPSBO VUxMOwo+ICsJbXV0ZXhfdW5sb2NrKCZjdHgtPmtkYW1vbmRfbG9jayk7Cj4gKwo+ICsJcmV0dXJu IHJ1bm5pbmc7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBkYW1vbl9zdGFydCgpIC0gU3RhcnRzIG1v bml0b3Jpbmcgd2l0aCBnaXZlbiBjb250ZXh0Lgo+ICsgKiBAY3R4Ogltb25pdG9yaW5nIGNvbnRl eHQKPiArICoKPiArICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUg b3RoZXJ3aXNlLgo+ICsgKi8KPiAraW50IGRhbW9uX3N0YXJ0KHN0cnVjdCBkYW1vbl9jdHggKmN0 eCkKPiArewo+ICsJaW50IGVyciA9IC1FQlVTWTsKPiArCj4gKwltdXRleF9sb2NrKCZjdHgtPmtk YW1vbmRfbG9jayk7Cj4gKwlpZiAoIWN0eC0+a2RhbW9uZCkgewo+ICsJCWVyciA9IDA7Cj4gKwkJ Y3R4LT5rZGFtb25kX3N0b3AgPSBmYWxzZTsKPiArCQljdHgtPmtkYW1vbmQgPSBrdGhyZWFkX3J1 bihrZGFtb25kX2ZuLCBjdHgsICJrZGFtb25kIik7Cj4gKwkJaWYgKElTX0VSUihjdHgtPmtkYW1v bmQpKQo+ICsJCQllcnIgPSBQVFJfRVJSKGN0eC0+a2RhbW9uZCk7Cj4gKwl9Cj4gKwltdXRleF91 bmxvY2soJmN0eC0+a2RhbW9uZF9sb2NrKTsKPiArCj4gKwlyZXR1cm4gZXJyOwo+ICt9Cj4gKwo+ ICsvKioKPiArICogZGFtb25fc3RvcCgpIC0gU3RvcHMgbW9uaXRvcmluZyBvZiBnaXZlbiBjb250 ZXh0Lgo+ICsgKiBAY3R4Ogltb25pdG9yaW5nIGNvbnRleHQKPiArICoKPiArICogUmV0dXJuOiAw IG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgo+ICsgKi8KPiAraW50 IGRhbW9uX3N0b3Aoc3RydWN0IGRhbW9uX2N0eCAqY3R4KQo+ICt7Cj4gKwltdXRleF9sb2NrKCZj dHgtPmtkYW1vbmRfbG9jayk7Cj4gKwlpZiAoY3R4LT5rZGFtb25kKSB7Cj4gKwkJY3R4LT5rZGFt b25kX3N0b3AgPSB0cnVlOwo+ICsJCW11dGV4X3VubG9jaygmY3R4LT5rZGFtb25kX2xvY2spOwo+ ICsJCXdoaWxlIChkYW1vbl9rZGFtb25kX3J1bm5pbmcoY3R4KSkKPiArCQkJdXNsZWVwX3Jhbmdl KGN0eC0+c2FtcGxlX2ludGVydmFsLAo+ICsJCQkJCWN0eC0+c2FtcGxlX2ludGVydmFsICogMik7 Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwltdXRleF91bmxvY2soJmN0eC0+a2RhbW9uZF9sb2Nr KTsKPiArCj4gKwlyZXR1cm4gLUVQRVJNOwo+ICt9Cj4gKwo+ICsvKioKPiArICogZGFtb25fc2V0 X3BpZHMoKSAtIFNldCBtb25pdG9yaW5nIHRhcmdldCBwcm9jZXNzZXMuCj4gKyAqIEBjdHg6CW1v bml0b3JpbmcgY29udGV4dAo+ICsgKiBAcGlkczoJYXJyYXkgb2YgdGFyZ2V0IHByb2Nlc3NlcyBw aWRzCj4gKyAqIEBucl9waWRzOgludW1iZXIgb2YgZW50cmllcyBpbiBAcGlkcwo+ICsgKgo+ICsg KiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoaWxlIHRoZSBrZGFtb25kIGlz IHJ1bm5pbmcuCj4gKyAqCj4gKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJv ciBjb2RlIG90aGVyd2lzZS4KPiArICovCj4gK2ludCBkYW1vbl9zZXRfcGlkcyhzdHJ1Y3QgZGFt b25fY3R4ICpjdHgsIGludCAqcGlkcywgc3NpemVfdCBucl9waWRzKQo+ICt7Cj4gKwlzc2l6ZV90 IGk7Cj4gKwlzdHJ1Y3QgZGFtb25fdGFzayAqdCwgKm5leHQ7Cj4gKwo+ICsJZGFtb25fZm9yX2Vh Y2hfdGFza19zYWZlKHQsIG5leHQsIGN0eCkKPiArCQlkYW1vbl9kZXN0cm95X3Rhc2sodCk7Cj4g Kwo+ICsJZm9yIChpID0gMDsgaSA8IG5yX3BpZHM7IGkrKykgewo+ICsJCXQgPSBkYW1vbl9uZXdf dGFzayhwaWRzW2ldKTsKPiArCQlpZiAoIXQpIHsKPiArCQkJcHJfZXJyKCJGYWlsZWQgdG8gYWxs b2MgZGFtb25fdGFza1xuIik7Cj4gKwkJCXJldHVybiAtRU5PTUVNOwo+ICsJCX0KPiArCQlkYW1v bl9hZGRfdGFzayhjdHgsIHQpOwo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICsv KioKPiArICogZGFtb25fc2V0X2F0dHJzKCkgLSBTZXQgYXR0cmlidXRlcyBmb3IgdGhlIG1vbml0 b3JpbmcuCj4gKyAqIEBjdHg6CQltb25pdG9yaW5nIGNvbnRleHQKPiArICogQHNhbXBsZV9pbnQ6 CQl0aW1lIGludGVydmFsIGJldHdlZW4gc2FtcGxpbmdzCj4gKyAqIEBhZ2dyX2ludDoJCXRpbWUg aW50ZXJ2YWwgYmV0d2VlbiBhZ2dyZWdhdGlvbnMKPiArICogQG1pbl9ucl9yZWc6CQltaW5pbWFs IG51bWJlciBvZiByZWdpb25zCj4gKyAqCj4gKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBi ZSBjYWxsZWQgd2hpbGUgdGhlIGtkYW1vbmQgaXMgcnVubmluZy4KPiArICogRXZlcnkgdGltZSBp bnRlcnZhbCBpcyBpbiBtaWNyby1zZWNvbmRzLgo+ICsgKgo+ICsgKiBSZXR1cm46IDAgb24gc3Vj Y2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCj4gKyAqLwo+ICtpbnQgZGFtb25f c2V0X2F0dHJzKHN0cnVjdCBkYW1vbl9jdHggKmN0eCwgdW5zaWduZWQgbG9uZyBzYW1wbGVfaW50 LAo+ICsJCXVuc2lnbmVkIGxvbmcgYWdncl9pbnQsIHVuc2lnbmVkIGxvbmcgbWluX25yX3JlZykK PiArewo+ICsJaWYgKG1pbl9ucl9yZWcgPCAzKSB7Cj4gKwkJcHJfZXJyKCJtaW5fbnJfcmVnaW9u cyAoJWx1KSBtdXN0IGJlIGF0IGxlYXN0IDNcbiIsCj4gKwkJCQltaW5fbnJfcmVnKTsKPiArCQly ZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwljdHgtPnNhbXBsZV9pbnRlcnZhbCA9IHNhbXBs ZV9pbnQ7Cj4gKwljdHgtPmFnZ3JfaW50ZXJ2YWwgPSBhZ2dyX2ludDsKPiArCWN0eC0+bWluX25y X3JlZ2lvbnMgPSBtaW5fbnJfcmVnOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICAvKgo+ ICAgKiBGdW5jdGlvbnMgZm9yIHRoZSBtb2R1bGUgbG9hZGluZy91bmxvYWRpbmcKPiAgICovCj4g CgoKCgpBbWF6b24gRGV2ZWxvcG1lbnQgQ2VudGVyIEdlcm1hbnkgR21iSApLcmF1c2Vuc3RyLiAz OAoxMDExNyBCZXJsaW4KR2VzY2hhZWZ0c2Z1ZWhydW5nOiBDaHJpc3RpYW4gU2NobGFlZ2VyLCBK b25hdGhhbiBXZWlzcwpFaW5nZXRyYWdlbiBhbSBBbXRzZ2VyaWNodCBDaGFybG90dGVuYnVyZyB1 bnRlciBIUkIgMTQ5MTczIEIKU2l0ejogQmVybGluClVzdC1JRDogREUgMjg5IDIzNyA4NzkKCgo=