Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sOGsd-00DNox-W2 for pgsql-hackers@arkaria.postgresql.org; Mon, 01 Jul 2024 13:15:40 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1sOGsc-001lNe-DA for pgsql-hackers@arkaria.postgresql.org; Mon, 01 Jul 2024 13:15:38 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sOGsc-001lNW-1B for pgsql-hackers@lists.postgresql.org; Mon, 01 Jul 2024 13:15:38 +0000 Received: from fhigh6-smtp.messagingengine.com ([103.168.172.157]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sOGsa-004UUG-4b for pgsql-hackers@postgresql.org; Mon, 01 Jul 2024 13:15:37 +0000 Received: from compute6.internal (compute6.nyi.internal [10.202.2.47]) by mailfhigh.nyi.internal (Postfix) with ESMTP id 4E84611401FF; Mon, 1 Jul 2024 09:15:34 -0400 (EDT) Received: from imap48 ([10.202.2.98]) by compute6.internal (MEProxy); Mon, 01 Jul 2024 09:15:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1719839734; x=1719926134; bh=P4Zfw4JPx/ f/a+Xv7eP/c7KgDa0wJz0BjAtetYw99Ws=; b=LvzpU0Ne/4AxnOiXKyJitVIzev iVBQWpoX3x/GWXr7g6mmLH2tV4/Itjcxv4L9baLyfUn5uQ6f5hd50syJylF/LykP 5XKsUheZn9SVcuihLGFg9/NEAyjf7mysEs0bKKRsoMoH3pjZI4i57kqm0UtUY4cS Bh0mebfmhmSEoX2aIYZj4RXuDWv8kk3TKq1bMz8vflhu+X/0/A7ri1hpxai6V1vE rBakbAvaO7c6I+jCBt4tlN1YxdO8VW3YPVehj1f0sw+TKdd8seRa7DbfJC2qB3zo 6rWVLNSBntv9w0dRg/XJ/6gODhTiARch1qfZJjFI1xMpCp/vlP0zXFd23htg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; t=1719839734; x=1719926134; bh=P4Zfw4JPx/f/a+Xv7eP/c7KgDa0w Jz0BjAtetYw99Ws=; b=eSSucWwHOvv5358qnhtQ+YTf2/LBhqgytUW1eR024535 6vsBSkqBlrsQ/FUDGqj42pJnBd4rPdOLdBoJmhJEjc2HfyaWVIB0NpZPWx3MaWGx 3/6hyntkYgHnDdr8iFNEu4dbo/i9dllIXzFcYS10stZr741E3nZizqAvCGtyhy2E xtl4jkPtGeozSr4gGODojB+EjA99YyRvTuxbRZ7AwKHMkSiLbLa0IQmTERXvx75K l9kymzAo9+uW7p0ShASck4V4/mHSZ9P48yVkU76/Xgv/sNZNDlvuByByp/BHC8rp N+/jQj3y6PtpeJa8oztay+MAovHhRPyT1KvGHXtZvA== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeftddrudefgdeiudcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefofgggkfgjfhffhffvvefutgesmhdtreerreertdenucfhrhhomhepfdflohgv lhculfgrtghosghsohhnfdcuoehjohgvlhestghomhhpihhlvghrrdhorhhgqeenucggtf frrghtthgvrhhnpeetgfejvdffuedujeektdfgjeehfeffgeeuhfegteeujedvtdeifeef vddvveeuueenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhroh hmpehjohgvlhestghomhhpihhlvghrrdhorhhg X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id DE0E631A0065; Mon, 1 Jul 2024 09:15:33 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.11.0-alpha0-566-g3812ddbbc-fm-20240627.001-g3812ddbb MIME-Version: 1.0 Message-Id: <81348268-b9fd-4308-bf52-056070aa7c2a@app.fastmail.com> In-Reply-To: <9ff90ff9-5ac1-4529-b2f4-f93b37734b9c@app.fastmail.com> References: <44d2ffca-d560-4919-b85a-4d07060946aa@app.fastmail.com> <87zfr1e1uj.fsf@wibble.ilmari.org> <9ff90ff9-5ac1-4529-b2f4-f93b37734b9c@app.fastmail.com> Date: Mon, 01 Jul 2024 15:14:58 +0200 From: "Joel Jacobson" To: =?UTF-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= Cc: pgsql-hackers Subject: Re: Optimize numeric multiplication for one and two base-NBASE digit multiplicands. Content-Type: multipart/mixed; boundary=707d32be3c9b4c3bb6c4a1e5f1a9ce45 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --707d32be3c9b4c3bb6c4a1e5f1a9ce45 Content-Type: text/plain On Mon, Jul 1, 2024, at 15:11, Joel Jacobson wrote: > Not really sure why. Maybe the code I tried can be optimized further: If anyone want experiment with the int128 version, here is a patch that adds a separate numeric_mul_patched() function, so it's easier to benchmark against the unmodified numeric_mul(). /Joel --707d32be3c9b4c3bb6c4a1e5f1a9ce45 Content-Disposition: attachment; filename*0="0001-Optimize-mul_var-for-var2ndigits-4.patch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0001-Optimize-mul=5Fvar-for-var2ndigits-4.patch?=" Content-Transfer-Encoding: BASE64 RnJvbSBjNDQzZjQ0ZDEzMzhhNjlhMjE2MzJiYTBjZDNmYjA2OWI2Y2JiY2Y1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEpha29ic3NvbiA8Z2l0aHViQGNvbXBpbGVy Lm9yZz4KRGF0ZTogTW9uLCAxIEp1bCAyMDI0IDA3OjE3OjUwICswMjAwClN1YmplY3Q6IFtQ QVRDSF0gT3B0aW1pemUgbXVsX3ZhcigpIGZvciB2YXIybmRpZ2l0cyA8PSA0CgotLS0KIHNy Yy9iYWNrZW5kL3V0aWxzL2FkdC9udW1lcmljLmMgfCA0NTcgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysKIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgfCAgIDMg Kwogc3JjL2luY2x1ZGUvdXRpbHMvbnVtZXJpYy5oICAgICB8ICAgMiArCiAzIGZpbGVzIGNo YW5nZWQsIDQ2MiBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L251bWVyaWMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9udW1lcmljLmMKaW5k ZXggNTUxMGEyMDNiMC4uODc5ODBmYTc3MSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L251bWVyaWMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvbnVtZXJpYy5j CkBAIC01NTEsNiArNTUxLDkgQEAgc3RhdGljIHZvaWQgc3ViX3Zhcihjb25zdCBOdW1lcmlj VmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAogc3RhdGljIHZvaWQgbXVsX3Zh cihjb25zdCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAogCQkJ CQlOdW1lcmljVmFyICpyZXN1bHQsCiAJCQkJCWludCByc2NhbGUpOworc3RhdGljIHZvaWQg bXVsX3Zhcl9wYXRjaGVkKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0IE51bWVyaWNW YXIgKnZhcjIsCisJCQkJCU51bWVyaWNWYXIgKnJlc3VsdCwKKwkJCQkJaW50IHJzY2FsZSk7 CiBzdGF0aWMgdm9pZCBkaXZfdmFyKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0IE51 bWVyaWNWYXIgKnZhcjIsCiAJCQkJCU51bWVyaWNWYXIgKnJlc3VsdCwKIAkJCQkJaW50IHJz Y2FsZSwgYm9vbCByb3VuZCk7CkBAIC0zMTE1LDYgKzMxMTgsMTMwIEBAIG51bWVyaWNfbXVs X29wdF9lcnJvcihOdW1lcmljIG51bTEsIE51bWVyaWMgbnVtMiwgYm9vbCAqaGF2ZV9lcnJv cikKIH0KIAogCisvKgorICogbnVtZXJpY19tdWxfcGF0Y2hlZCgpIC0KKyAqCisgKiBUaGlz IGZ1bmN0aW9uIG11bHRpcGxpZXMgdHdvIG51bWVyaWMgdmFsdWVzIHVzaW5nIHRoZSBwYXRj aGVkIGFsZ29yaXRobSwKKyAqIGRlc2lnbmVkIGZvciBlZmZpY2llbnQgaGFuZGxpbmcgb2Yg bGFyZ2UgbnVtYmVycy4gSXQncyBpbnRyb2R1Y2VkIHRvIGFsbG93CisgKiBkaXJlY3QgYmVu Y2htYXJrIGNvbXBhcmlzb25zIHdpdGggdGhlIHN0YW5kYXJkIG51bWVyaWNfbXVsKCkgZnVu Y3Rpb24uCisgKi8KK0RhdHVtCitudW1lcmljX211bF9wYXRjaGVkKFBHX0ZVTkNUSU9OX0FS R1MpCit7CisJTnVtZXJpYwkJbnVtMSA9IFBHX0dFVEFSR19OVU1FUklDKDApOworCU51bWVy aWMJCW51bTIgPSBQR19HRVRBUkdfTlVNRVJJQygxKTsKKwlOdW1lcmljCQlyZXM7CisKKwly ZXMgPSBudW1lcmljX211bF9wYXRjaGVkX29wdF9lcnJvcihudW0xLCBudW0yLCBOVUxMKTsK KworCVBHX1JFVFVSTl9OVU1FUklDKHJlcyk7Cit9CisKKworLyoKKyAqIG51bWVyaWNfbXVs X3BhdGNoZWRfb3B0X2Vycm9yKCkgLQorICoKKyAqCUludGVybmFsIHZlcnNpb24gb2YgbnVt ZXJpY19tdWxfcGF0Y2hlZCgpLgorICoJSWYgIipoYXZlX2Vycm9yIiBmbGFnIGlzIHByb3Zp ZGVkLCBvbiBlcnJvciBpdCdzIHNldCB0byB0cnVlLCBOVUxMIHJldHVybmVkLgorICoJVGhp cyBpcyBoZWxwZnVsIHdoZW4gY2FsbGVyIG5lZWQgdG8gaGFuZGxlIGVycm9ycyBieSBpdHNl bGYuCisgKi8KK051bWVyaWMKK251bWVyaWNfbXVsX3BhdGNoZWRfb3B0X2Vycm9yKE51bWVy aWMgbnVtMSwgTnVtZXJpYyBudW0yLCBib29sICpoYXZlX2Vycm9yKQoreworCU51bWVyaWNW YXIJYXJnMTsKKwlOdW1lcmljVmFyCWFyZzI7CisJTnVtZXJpY1ZhcglyZXN1bHQ7CisJTnVt ZXJpYwkJcmVzOworCisJLyoKKwkgKiBIYW5kbGUgTmFOIGFuZCBpbmZpbml0aWVzCisJICov CisJaWYgKE5VTUVSSUNfSVNfU1BFQ0lBTChudW0xKSB8fCBOVU1FUklDX0lTX1NQRUNJQUwo bnVtMikpCisJeworCQlpZiAoTlVNRVJJQ19JU19OQU4obnVtMSkgfHwgTlVNRVJJQ19JU19O QU4obnVtMikpCisJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25hbik7CisJCWlmIChO VU1FUklDX0lTX1BJTkYobnVtMSkpCisJCXsKKwkJCXN3aXRjaCAobnVtZXJpY19zaWduX2lu dGVybmFsKG51bTIpKQorCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJuIG1ha2VfcmVz dWx0KCZjb25zdF9uYW4pOyAvKiBJbmYgKiAwICovCisJCQkJY2FzZSAxOgorCQkJCQlyZXR1 cm4gbWFrZV9yZXN1bHQoJmNvbnN0X3BpbmYpOworCQkJCWNhc2UgLTE6CisJCQkJCXJldHVy biBtYWtlX3Jlc3VsdCgmY29uc3RfbmluZik7CisJCQl9CisJCQlBc3NlcnQoZmFsc2UpOwor CQl9CisJCWlmIChOVU1FUklDX0lTX05JTkYobnVtMSkpCisJCXsKKwkJCXN3aXRjaCAobnVt ZXJpY19zaWduX2ludGVybmFsKG51bTIpKQorCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0 dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uYW4pOyAvKiAtSW5mICogMCAqLworCQkJCWNhc2Ug MToKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uaW5mKTsKKwkJCQljYXNlIC0x OgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X3BpbmYpOworCQkJfQorCQkJQXNz ZXJ0KGZhbHNlKTsKKwkJfQorCQkvKiBieSBoZXJlLCBudW0xIG11c3QgYmUgZmluaXRlLCBz byBudW0yIGlzIG5vdCAqLworCQlpZiAoTlVNRVJJQ19JU19QSU5GKG51bTIpKQorCQl7CisJ CQlzd2l0Y2ggKG51bWVyaWNfc2lnbl9pbnRlcm5hbChudW0xKSkKKwkJCXsKKwkJCQljYXNl IDA6CisJCQkJCXJldHVybiBtYWtlX3Jlc3VsdCgmY29uc3RfbmFuKTsgLyogMCAqIEluZiAq LworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9waW5mKTsK KwkJCQljYXNlIC0xOgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25pbmYpOwor CQkJfQorCQkJQXNzZXJ0KGZhbHNlKTsKKwkJfQorCQlBc3NlcnQoTlVNRVJJQ19JU19OSU5G KG51bTIpKTsKKwkJc3dpdGNoIChudW1lcmljX3NpZ25faW50ZXJuYWwobnVtMSkpCisJCXsK KwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25hbik7IC8qIDAg KiAtSW5mICovCisJCQljYXNlIDE6CisJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9u aW5mKTsKKwkJCWNhc2UgLTE6CisJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9waW5m KTsKKwkJfQorCQlBc3NlcnQoZmFsc2UpOworCX0KKworCS8qCisJICogVW5wYWNrIHRoZSB2 YWx1ZXMsIGxldCBtdWxfdmFyKCkgY29tcHV0ZSB0aGUgcmVzdWx0IGFuZCByZXR1cm4gaXQu CisJICogVW5saWtlIGFkZF92YXIoKSBhbmQgc3ViX3ZhcigpLCBtdWxfdmFyKCkgd2lsbCBy b3VuZCBpdHMgcmVzdWx0LiBJbiB0aGUKKwkgKiBjYXNlIG9mIG51bWVyaWNfbXVsKCksIHdo aWNoIGlzIGludm9rZWQgZm9yIHRoZSAqIG9wZXJhdG9yIG9uIG51bWVyaWNzLAorCSAqIHdl IHJlcXVlc3QgZXhhY3QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBwcm9kdWN0IChyc2NhbGUg PSBzdW0oZHNjYWxlIG9mCisJICogYXJnMSwgZHNjYWxlIG9mIGFyZzIpKS4gIElmIHRoZSBl eGFjdCByZXN1bHQgaGFzIG1vcmUgZGlnaXRzIGFmdGVyIHRoZQorCSAqIGRlY2ltYWwgcG9p bnQgdGhhbiBjYW4gYmUgc3RvcmVkIGluIGEgbnVtZXJpYywgd2Ugcm91bmQgaXQuICBSb3Vu ZGluZworCSAqIGFmdGVyIGNvbXB1dGluZyB0aGUgZXhhY3QgcmVzdWx0IGVuc3VyZXMgdGhh dCB0aGUgZmluYWwgcmVzdWx0IGlzCisJICogY29ycmVjdGx5IHJvdW5kZWQgKHJvdW5kaW5n IGluIG11bF92YXIoKSB1c2luZyBhIHRydW5jYXRlZCBwcm9kdWN0CisJICogd291bGQgbm90 IGd1YXJhbnRlZSB0aGlzKS4KKwkgKi8KKwlpbml0X3Zhcl9mcm9tX251bShudW0xLCAmYXJn MSk7CisJaW5pdF92YXJfZnJvbV9udW0obnVtMiwgJmFyZzIpOworCisJaW5pdF92YXIoJnJl c3VsdCk7CisKKwltdWxfdmFyX3BhdGNoZWQoJmFyZzEsICZhcmcyLCAmcmVzdWx0LCBhcmcx LmRzY2FsZSArIGFyZzIuZHNjYWxlKTsKKworCWlmIChyZXN1bHQuZHNjYWxlID4gTlVNRVJJ Q19EU0NBTEVfTUFYKQorCQlyb3VuZF92YXIoJnJlc3VsdCwgTlVNRVJJQ19EU0NBTEVfTUFY KTsKKworCXJlcyA9IG1ha2VfcmVzdWx0X29wdF9lcnJvcigmcmVzdWx0LCBoYXZlX2Vycm9y KTsKKworCWZyZWVfdmFyKCZyZXN1bHQpOworCisJcmV0dXJuIHJlczsKK30KKworCiAvKgog ICogbnVtZXJpY19kaXYoKSAtCiAgKgpAQCAtODg2NCw2ICs4OTkxLDMzNiBAQCBtdWxfdmFy KGNvbnN0IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0IE51bWVyaWNWYXIgKnZhcjIsIE51bWVy aWNWYXIgKnJlc3VsdCwKIAlzdHJpcF92YXIocmVzdWx0KTsKIH0KIAorLyoKKyAqIG11bF92 YXJfcGF0Y2hlZCgpIC0KKyAqCisgKiBJbXBsZW1lbnRzIHBhdGNoZWQgbXVsdGlwbGljYXRp b24gZm9yIGxhcmdlIG51bWJlcnMsIGludHJvZHVjZWQKKyAqIGFsb25nc2lkZSB0aGUgdW5j aGFuZ2VkIG9yaWdpbmFsIG11bF92YXIoKS4gVGhpcyBmdW5jdGlvbiBpcyBwYXJ0IG9mCisg KiBhbiBvcHRpbWl6YXRpb24gZWZmb3J0LCBhbGxvd2luZyBkaXJlY3QgYmVuY2htYXJrIGNv bXBhcmlzb25zIHdpdGgKKyAqIG11bF92YXIoKS4gSXQgc2VsZWN0cyBmdWxsIG9yIGhhbGYg cGF0Y2hlZCBiYXNlZCBvbiBpbnB1dCBzaXplLgorICogVGhpcyBpcyBhIHRlbXBvcmFyeSBt ZWFzdXJlIGJlZm9yZSBjb25zaWRlcmluZyBpdHMgcmVwbGFjZW1lbnQgb2YKKyAqIG11bF92 YXIoKSBiYXNlZCBvbiBiZW5jaG1hcmsgb3V0Y29tZXMuCisgKi8KK3N0YXRpYyB2b2lkCitt dWxfdmFyX3BhdGNoZWQoY29uc3QgTnVtZXJpY1ZhciAqdmFyMSwgY29uc3QgTnVtZXJpY1Zh ciAqdmFyMiwKKwkJTnVtZXJpY1ZhciAqcmVzdWx0LCBpbnQgcnNjYWxlKQoreworCWludAkJ CXJlc19uZGlnaXRzOworCWludAkJCXJlc19zaWduOworCWludAkJCXJlc193ZWlnaHQ7CisJ aW50CQkJbWF4ZGlnaXRzOworCWludAkJICAgKmRpZzsKKwlpbnQJCQljYXJyeTsKKwlpbnQJ CQltYXhkaWc7CisJaW50CQkJbmV3ZGlnOworCWludAkJCXZhcjFuZGlnaXRzOworCWludAkJ CXZhcjJuZGlnaXRzOworCU51bWVyaWNEaWdpdCAqdmFyMWRpZ2l0czsKKwlOdW1lcmljRGln aXQgKnZhcjJkaWdpdHM7CisJTnVtZXJpY0RpZ2l0ICpyZXNfZGlnaXRzOworCWludAkJCWks CisJCQkJaTEsCisJCQkJaTI7CisKKwkvKgorCSAqIEFycmFuZ2UgZm9yIHZhcjEgdG8gYmUg dGhlIHNob3J0ZXIgb2YgdGhlIHR3byBudW1iZXJzLiAgVGhpcyBpbXByb3ZlcworCSAqIHBl cmZvcm1hbmNlIGJlY2F1c2UgdGhlIGlubmVyIG11bHRpcGxpY2F0aW9uIGxvb3AgaXMgbXVj aCBzaW1wbGVyIHRoYW4KKwkgKiB0aGUgb3V0ZXIgbG9vcCwgc28gaXQncyBiZXR0ZXIgdG8g aGF2ZSBhIHNtYWxsZXIgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKwkgKiBvZiB0aGUgb3V0ZXIg bG9vcC4gIFRoaXMgYWxzbyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUK KwkgKiBhY2N1bXVsYXRvciBhcnJheSBuZWVkcyB0byBiZSBub3JtYWxpemVkLgorCSAqLwor CWlmICh2YXIxLT5uZGlnaXRzID4gdmFyMi0+bmRpZ2l0cykKKwl7CisJCWNvbnN0IE51bWVy aWNWYXIgKnRtcCA9IHZhcjE7CisKKwkJdmFyMSA9IHZhcjI7CisJCXZhcjIgPSB0bXA7CisJ fQorCisJLyogY29weSB0aGVzZSB2YWx1ZXMgaW50byBsb2NhbCB2YXJzIGZvciBzcGVlZCBp biBpbm5lciBsb29wICovCisJdmFyMW5kaWdpdHMgPSB2YXIxLT5uZGlnaXRzOworCXZhcjJu ZGlnaXRzID0gdmFyMi0+bmRpZ2l0czsKKwl2YXIxZGlnaXRzID0gdmFyMS0+ZGlnaXRzOwor CXZhcjJkaWdpdHMgPSB2YXIyLT5kaWdpdHM7CisKKwlpZiAodmFyMW5kaWdpdHMgPT0gMCB8 fCB2YXIybmRpZ2l0cyA9PSAwKQorCXsKKwkJLyogb25lIG9yIGJvdGggaW5wdXRzIGlzIHpl cm87IHNvIGlzIHJlc3VsdCAqLworCQl6ZXJvX3ZhcihyZXN1bHQpOworCQlyZXN1bHQtPmRz Y2FsZSA9IHJzY2FsZTsKKwkJcmV0dXJuOworCX0KKworCS8qIERldGVybWluZSByZXN1bHQg c2lnbiBhbmQgKG1heGltdW0gcG9zc2libGUpIHdlaWdodCAqLworCWlmICh2YXIxLT5zaWdu ID09IHZhcjItPnNpZ24pCisJCXJlc19zaWduID0gTlVNRVJJQ19QT1M7CisJZWxzZQorCQly ZXNfc2lnbiA9IE5VTUVSSUNfTkVHOworCXJlc193ZWlnaHQgPSB2YXIxLT53ZWlnaHQgKyB2 YXIyLT53ZWlnaHQgKyAyOworCisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBy ZXN1bHQgZGlnaXRzIHRvIGNvbXB1dGUuICBJZiB0aGUgZXhhY3QgcmVzdWx0CisJICogd291 bGQgaGF2ZSBtb3JlIHRoYW4gcnNjYWxlIGZyYWN0aW9uYWwgZGlnaXRzLCB0cnVuY2F0ZSB0 aGUgY29tcHV0YXRpb24KKwkgKiB3aXRoIE1VTF9HVUFSRF9ESUdJVFMgZ3VhcmQgZGlnaXRz LCBpLmUuLCBpZ25vcmUgaW5wdXQgZGlnaXRzIHRoYXQKKwkgKiB3b3VsZCBvbmx5IGNvbnRy aWJ1dGUgdG8gdGhlIHJpZ2h0IG9mIHRoYXQuICAoVGhpcyB3aWxsIGdpdmUgdGhlIGV4YWN0 CisJICogcm91bmRlZC10by1yc2NhbGUgYW5zd2VyIHVubGVzcyBjYXJyaWVzIG91dCBvZiB0 aGUgaWdub3JlZCBwb3NpdGlvbnMKKwkgKiB3b3VsZCBoYXZlIHByb3BhZ2F0ZWQgdGhyb3Vn aCBtb3JlIHRoYW4gTVVMX0dVQVJEX0RJR0lUUyBkaWdpdHMuKQorCSAqCisJICogTm90ZTog YW4gZXhhY3QgY29tcHV0YXRpb24gY291bGQgbm90IHByb2R1Y2UgbW9yZSB0aGFuIHZhcjFu ZGlnaXRzICsKKwkgKiB2YXIybmRpZ2l0cyBkaWdpdHMsIGJ1dCB3ZSBhbGxvY2F0ZSBvbmUg ZXh0cmEgb3V0cHV0IGRpZ2l0IGluIGNhc2UKKwkgKiByc2NhbGUtZHJpdmVuIHJvdW5kaW5n IHByb2R1Y2VzIGEgY2Fycnkgb3V0IG9mIHRoZSBoaWdoZXN0IGV4YWN0IGRpZ2l0LgorCSAq LworCXJlc19uZGlnaXRzID0gdmFyMW5kaWdpdHMgKyB2YXIybmRpZ2l0cyArIDE7CisJbWF4 ZGlnaXRzID0gcmVzX3dlaWdodCArIDEgKyAocnNjYWxlICsgREVDX0RJR0lUUyAtIDEpIC8g REVDX0RJR0lUUyArCisJCU1VTF9HVUFSRF9ESUdJVFM7CisJcmVzX25kaWdpdHMgPSBNaW4o cmVzX25kaWdpdHMsIG1heGRpZ2l0cyk7CisKKwlpZiAocmVzX25kaWdpdHMgPCAzKQorCXsK KwkJLyogQWxsIGlucHV0IGRpZ2l0cyB3aWxsIGJlIGlnbm9yZWQ7IHNvIHJlc3VsdCBpcyB6 ZXJvICovCisJCXplcm9fdmFyKHJlc3VsdCk7CisJCXJlc3VsdC0+ZHNjYWxlID0gcnNjYWxl OworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB2YXIxIGFuZCB2YXIyIGFyZSBqdXN0 IG9uZSBvciB0d28gTkJBU0UgZGlnaXRzLCB0aGVpciBwcm9kdWN0IHdpbGwKKwkgKiBmaXQg aW4gYW4gaW50NjQgY2FuIGJlIGNvbXB1dGVkIGRpcmVjdGx5LCB3aGljaCBpcyBzaWduaWZp Y2FudGx5IGZhc3Rlci4KKwkgKi8KKwlpZiAodmFyMm5kaWdpdHMgPD0gMikKKwl7CisJCWlu dDY0CQlwcm9kdWN0ID0gMDsKKwkJc3dpdGNoICh2YXIxbmRpZ2l0cykKKwkJeworCQkJY2Fz ZSAxOgorCQkJCXByb2R1Y3QgPSB2YXIxZGlnaXRzWzBdOworCQkJCWJyZWFrOworCQkJY2Fz ZSAyOgorCQkJCXByb2R1Y3QgPSB2YXIxZGlnaXRzWzBdICogTkJBU0UgKyB2YXIxZGlnaXRz WzFdOworCQkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoICh2YXIybmRpZ2l0cykKKwkJewor CQkJY2FzZSAxOgorCQkJCXByb2R1Y3QgKj0gdmFyMmRpZ2l0c1swXTsKKwkJCQlicmVhazsK KwkJCWNhc2UgMjoKKwkJCQlwcm9kdWN0ICo9IHZhcjJkaWdpdHNbMF0gKiBOQkFTRSArIHZh cjJkaWdpdHNbMV07CisJCQkJYnJlYWs7CisJCX0KKworCQlhbGxvY192YXIocmVzdWx0LCBy ZXNfbmRpZ2l0cyk7CisJCXJlc19kaWdpdHMgPSByZXN1bHQtPmRpZ2l0czsKKwkJZm9yIChp ID0gcmVzX25kaWdpdHMgLSAxOyBpID49IDA7IGktLSkKKwkJeworCQkJcmVzX2RpZ2l0c1tp XSA9IHByb2R1Y3QgJSBOQkFTRTsKKwkJCXByb2R1Y3QgLz0gTkJBU0U7CisJCX0KKwkJQXNz ZXJ0KHByb2R1Y3QgPT0gMCk7CisKKwkJLyoKKwkJICogRmluYWxseSwgcm91bmQgdGhlIHJl c3VsdCB0byB0aGUgcmVxdWVzdGVkIHByZWNpc2lvbi4KKwkJICovCisJCXJlc3VsdC0+d2Vp Z2h0ID0gcmVzX3dlaWdodDsKKwkJcmVzdWx0LT5zaWduID0gcmVzX3NpZ247CisKKwkJLyog Um91bmQgdG8gdGFyZ2V0IHJzY2FsZSAoYW5kIHNldCByZXN1bHQtPmRzY2FsZSkgKi8KKwkJ cm91bmRfdmFyKHJlc3VsdCwgcnNjYWxlKTsKKworCQkvKiBTdHJpcCBsZWFkaW5nIGFuZCB0 cmFpbGluZyB6ZXJvZXMgKi8KKwkJc3RyaXBfdmFyKHJlc3VsdCk7CisKKwkJcmV0dXJuOwor CX0KKyNpZmRlZiBIQVZFX0lOVDEyOAorCS8qCisJICogSWYgdmFyMSBhbmQgdmFyMiBhcmUg dXAgdG8gZm91ciBkaWdpdHMsIHRoZWlyIHByb2R1Y3Qgd2lsbCBmaXQgaW4KKwkgKiBhbiBp bnQxMjggY2FuIGJlIGNvbXB1dGVkIGRpcmVjdGx5LCB3aGljaCBpcyBzaWduaWZpY2FudGx5 IGZhc3Rlci4KKwkgKi8KKwlpZiAodmFyMm5kaWdpdHMgPD0gNCkKKwl7CisJCWludDEyOAkJ cHJvZHVjdCA9IDA7CisKKwkJc3dpdGNoICh2YXIxbmRpZ2l0cykKKwkJeworCQkJY2FzZSAx OgorCQkJCXByb2R1Y3QgPSB2YXIxZGlnaXRzWzBdOworCQkJCWJyZWFrOworCQkJY2FzZSAy OgorCQkJCXByb2R1Y3QgPSB2YXIxZGlnaXRzWzBdICogTkJBU0UgKyB2YXIxZGlnaXRzWzFd OworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXByb2R1Y3QgPSAoKGludDEyOCkgdmFy MWRpZ2l0c1swXSAqIE5CQVNFICsgdmFyMWRpZ2l0c1sxXSkKKwkJCQkJCSogTkJBU0UgKyB2 YXIxZGlnaXRzWzJdOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXByb2R1Y3QgPSAo KChpbnQxMjgpIHZhcjFkaWdpdHNbMF0gKiBOQkFTRSArIHZhcjFkaWdpdHNbMV0pCisJCQkJ CQkqIE5CQVNFICsgdmFyMWRpZ2l0c1syXSkgKiBOQkFTRSArIHZhcjFkaWdpdHNbM107CisJ CQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKHZhcjJuZGlnaXRzKQorCQl7CisJCQljYXNl IDE6CisJCQkJcHJvZHVjdCAqPSB2YXIyZGlnaXRzWzBdOworCQkJCWJyZWFrOworCQkJY2Fz ZSAyOgorCQkJCXByb2R1Y3QgKj0gdmFyMmRpZ2l0c1swXSAqIE5CQVNFICsgdmFyMmRpZ2l0 c1sxXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlwcm9kdWN0ID0gKChpbnQxMjgp IHZhcjJkaWdpdHNbMF0gKiBOQkFTRSArIHZhcjJkaWdpdHNbMV0pCisJCQkJCQkqIE5CQVNF ICsgdmFyMmRpZ2l0c1syXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlwcm9kdWN0 ID0gKCgoaW50MTI4KSB2YXIyZGlnaXRzWzBdICogTkJBU0UgKyB2YXIyZGlnaXRzWzFdKQor CQkJCQkJKiBOQkFTRSArIHZhcjJkaWdpdHNbMl0pICogTkJBU0UgKyB2YXIyZGlnaXRzWzNd OworCQkJCWJyZWFrOworCQl9CisKKwkJYWxsb2NfdmFyKHJlc3VsdCwgcmVzX25kaWdpdHMp OworCQlyZXNfZGlnaXRzID0gcmVzdWx0LT5kaWdpdHM7CisJCWZvciAoaSA9IHJlc19uZGln aXRzIC0gMTsgaSA+PSAwOyBpLS0pCisJCXsKKwkJCXJlc19kaWdpdHNbaV0gPSBwcm9kdWN0 ICUgTkJBU0U7CisJCQlwcm9kdWN0IC89IE5CQVNFOworCQl9CisJCUFzc2VydChwcm9kdWN0 ID09IDApOworCisJCS8qCisJCSAqIEZpbmFsbHksIHJvdW5kIHRoZSByZXN1bHQgdG8gdGhl IHJlcXVlc3RlZCBwcmVjaXNpb24uCisJCSAqLworCQlyZXN1bHQtPndlaWdodCA9IHJlc193 ZWlnaHQ7CisJCXJlc3VsdC0+c2lnbiA9IHJlc19zaWduOworCisJCS8qIFJvdW5kIHRvIHRh cmdldCByc2NhbGUgKGFuZCBzZXQgcmVzdWx0LT5kc2NhbGUpICovCisJCXJvdW5kX3Zhcihy ZXN1bHQsIHJzY2FsZSk7CisKKwkJLyogU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgemVy b2VzICovCisJCXN0cmlwX3ZhcihyZXN1bHQpOworCisJCXJldHVybjsKKwl9CisjZW5kaWYK KworCS8qCisJICogV2UgZG8gdGhlIGFyaXRobWV0aWMgaW4gYW4gYXJyYXkgImRpZ1tdIiBv ZiBzaWduZWQgaW50J3MuICBTaW5jZQorCSAqIElOVF9NQVggaXMgbm90aWNlYWJseSBsYXJn ZXIgdGhhbiBOQkFTRSpOQkFTRSwgdGhpcyBnaXZlcyB1cyBoZWFkcm9vbQorCSAqIHRvIGF2 b2lkIG5vcm1hbGl6aW5nIGNhcnJpZXMgaW1tZWRpYXRlbHkuCisJICoKKwkgKiBtYXhkaWcg dHJhY2tzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlIG9mIGFueSBkaWdbXSBlbnRyeTsg d2hlbiB0aGlzCisJICogdGhyZWF0ZW5zIHRvIGV4Y2VlZCBJTlRfTUFYLCB3ZSB0YWtlIHRo ZSB0aW1lIHRvIHByb3BhZ2F0ZSBjYXJyaWVzLgorCSAqIEZ1cnRoZXJtb3JlLCB3ZSBuZWVk IHRvIGVuc3VyZSB0aGF0IG92ZXJmbG93IGRvZXNuJ3Qgb2NjdXIgZHVyaW5nIHRoZQorCSAq IGNhcnJ5IHByb3BhZ2F0aW9uIHBhc3NlcyBlaXRoZXIuICBUaGUgY2FycnkgdmFsdWVzIGNv dWxkIGJlIGFzIG11Y2ggYXMKKwkgKiBJTlRfTUFYL05CQVNFLCBzbyByZWFsbHkgd2UgbXVz dCBub3JtYWxpemUgd2hlbiBkaWdpdHMgdGhyZWF0ZW4gdG8KKwkgKiBleGNlZWQgSU5UX01B WCAtIElOVF9NQVgvTkJBU0UuCisJICoKKwkgKiBUbyBhdm9pZCBvdmVyZmxvdyBpbiBtYXhk aWcgaXRzZWxmLCBpdCBhY3R1YWxseSByZXByZXNlbnRzIHRoZSBtYXgKKwkgKiBwb3NzaWJs ZSB2YWx1ZSBkaXZpZGVkIGJ5IE5CQVNFLTEsIGllLCBhdCB0aGUgdG9wIG9mIHRoZSBsb29w IGl0IGlzCisJICoga25vd24gdGhhdCBubyBkaWdbXSBlbnRyeSBleGNlZWRzIG1heGRpZyAq IChOQkFTRS0xKS4KKwkgKi8KKwlkaWcgPSAoaW50ICopIHBhbGxvYzAocmVzX25kaWdpdHMg KiBzaXplb2YoaW50KSk7CisJbWF4ZGlnID0gMDsKKworCS8qCisJICogVGhlIGxlYXN0IHNp Z25pZmljYW50IGRpZ2l0cyBvZiB2YXIxIHNob3VsZCBiZSBpZ25vcmVkIGlmIHRoZXkgZG9u J3QKKwkgKiBjb250cmlidXRlIGRpcmVjdGx5IHRvIHRoZSBmaXJzdCByZXNfbmRpZ2l0cyBk aWdpdHMgb2YgdGhlIHJlc3VsdCB0aGF0CisJICogd2UgYXJlIGNvbXB1dGluZy4KKwkgKgor CSAqIERpZ2l0IGkxIG9mIHZhcjEgYW5kIGRpZ2l0IGkyIG9mIHZhcjIgYXJlIG11bHRpcGxp ZWQgYW5kIGFkZGVkIHRvIGRpZ2l0CisJICogaTEraTIrMiBvZiB0aGUgYWNjdW11bGF0b3Ig YXJyYXksIHNvIHdlIG5lZWQgb25seSBjb25zaWRlciBkaWdpdHMgb2YKKwkgKiB2YXIxIGZv ciB3aGljaCBpMSA8PSByZXNfbmRpZ2l0cyAtIDMuCisJICovCisJZm9yIChpMSA9IE1pbih2 YXIxbmRpZ2l0cyAtIDEsIHJlc19uZGlnaXRzIC0gMyk7IGkxID49IDA7IGkxLS0pCisJewor CQlOdW1lcmljRGlnaXQgdmFyMWRpZ2l0ID0gdmFyMWRpZ2l0c1tpMV07CisKKwkJaWYgKHZh cjFkaWdpdCA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogVGltZSB0byBub3JtYWxpemU/ ICovCisJCW1heGRpZyArPSB2YXIxZGlnaXQ7CisJCWlmIChtYXhkaWcgPiAoSU5UX01BWCAt IElOVF9NQVggLyBOQkFTRSkgLyAoTkJBU0UgLSAxKSkKKwkJeworCQkJLyogWWVzLCBkbyBp dCAqLworCQkJY2FycnkgPSAwOworCQkJZm9yIChpID0gcmVzX25kaWdpdHMgLSAxOyBpID49 IDA7IGktLSkKKwkJCXsKKwkJCQluZXdkaWcgPSBkaWdbaV0gKyBjYXJyeTsKKwkJCQlpZiAo bmV3ZGlnID49IE5CQVNFKQorCQkJCXsKKwkJCQkJY2FycnkgPSBuZXdkaWcgLyBOQkFTRTsK KwkJCQkJbmV3ZGlnIC09IGNhcnJ5ICogTkJBU0U7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJ Y2FycnkgPSAwOworCQkJCWRpZ1tpXSA9IG5ld2RpZzsKKwkJCX0KKwkJCUFzc2VydChjYXJy eSA9PSAwKTsKKwkJCS8qIFJlc2V0IG1heGRpZyB0byBpbmRpY2F0ZSBuZXcgd29yc3QtY2Fz ZSAqLworCQkJbWF4ZGlnID0gMSArIHZhcjFkaWdpdDsKKwkJfQorCisJCS8qCisJCSAqIEFk ZCB0aGUgYXBwcm9wcmlhdGUgbXVsdGlwbGUgb2YgdmFyMiBpbnRvIHRoZSBhY2N1bXVsYXRv ci4KKwkJICoKKwkJICogQXMgYWJvdmUsIGRpZ2l0cyBvZiB2YXIyIGNhbiBiZSBpZ25vcmVk IGlmIHRoZXkgZG9uJ3QgY29udHJpYnV0ZSwKKwkJICogc28gd2Ugb25seSBpbmNsdWRlIGRp Z2l0cyBmb3Igd2hpY2ggaTEraTIrMiA8IHJlc19uZGlnaXRzLgorCQkgKgorCQkgKiBUaGlz IGlubmVyIGxvb3AgaXMgdGhlIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2sgZm9yIG11bHRpcGxp Y2F0aW9uLAorCQkgKiBzbyB3ZSB3YW50IHRvIGtlZXAgaXQgc2ltcGxlIGVub3VnaCBzbyB0 aGF0IGl0IGNhbiBiZQorCQkgKiBhdXRvLXZlY3Rvcml6ZWQuICBBY2NvcmRpbmdseSwgcHJv Y2VzcyB0aGUgZGlnaXRzIGxlZnQtdG8tcmlnaHQKKwkJICogZXZlbiB0aG91Z2ggc2Nob29s Ym9vayBtdWx0aXBsaWNhdGlvbiB3b3VsZCBzdWdnZXN0IHJpZ2h0LXRvLWxlZnQuCisJCSAq IFNpbmNlIHdlIGFyZW4ndCBwcm9wYWdhdGluZyBjYXJyaWVzIGluIHRoaXMgbG9vcCwgdGhl IG9yZGVyIGRvZXMKKwkJICogbm90IG1hdHRlci4KKwkJICovCisJCXsKKwkJCWludAkJCWky bGltaXQgPSBNaW4odmFyMm5kaWdpdHMsIHJlc19uZGlnaXRzIC0gaTEgLSAyKTsKKwkJCWlu dAkJICAgKmRpZ19pMV8yID0gJmRpZ1tpMSArIDJdOworCisJCQlmb3IgKGkyID0gMDsgaTIg PCBpMmxpbWl0OyBpMisrKQorCQkJCWRpZ19pMV8yW2kyXSArPSB2YXIxZGlnaXQgKiB2YXIy ZGlnaXRzW2kyXTsKKwkJfQorCX0KKworCS8qCisJICogTm93IHdlIGRvIGEgZmluYWwgY2Fy cnkgcHJvcGFnYXRpb24gcGFzcyB0byBub3JtYWxpemUgdGhlIHJlc3VsdCwgd2hpY2gKKwkg KiB3ZSBjb21iaW5lIHdpdGggc3RvcmluZyB0aGUgcmVzdWx0IGRpZ2l0cyBpbnRvIHRoZSBv dXRwdXQuIE5vdGUgdGhhdAorCSAqIHRoaXMgaXMgc3RpbGwgZG9uZSBhdCBmdWxsIHByZWNp c2lvbiB3L2d1YXJkIGRpZ2l0cy4KKwkgKi8KKwlhbGxvY192YXIocmVzdWx0LCByZXNfbmRp Z2l0cyk7CisJcmVzX2RpZ2l0cyA9IHJlc3VsdC0+ZGlnaXRzOworCWNhcnJ5ID0gMDsKKwlm b3IgKGkgPSByZXNfbmRpZ2l0cyAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkJbmV3ZGlnID0g ZGlnW2ldICsgY2Fycnk7CisJCWlmIChuZXdkaWcgPj0gTkJBU0UpCisJCXsKKwkJCWNhcnJ5 ID0gbmV3ZGlnIC8gTkJBU0U7CisJCQluZXdkaWcgLT0gY2FycnkgKiBOQkFTRTsKKwkJfQor CQllbHNlCisJCQljYXJyeSA9IDA7CisJCXJlc19kaWdpdHNbaV0gPSBuZXdkaWc7CisJfQor CUFzc2VydChjYXJyeSA9PSAwKTsKKworCXBmcmVlKGRpZyk7CisKKwkvKgorCSAqIEZpbmFs bHksIHJvdW5kIHRoZSByZXN1bHQgdG8gdGhlIHJlcXVlc3RlZCBwcmVjaXNpb24uCisJICov CisJcmVzdWx0LT53ZWlnaHQgPSByZXNfd2VpZ2h0OworCXJlc3VsdC0+c2lnbiA9IHJlc19z aWduOworCisJLyogUm91bmQgdG8gdGFyZ2V0IHJzY2FsZSAoYW5kIHNldCByZXN1bHQtPmRz Y2FsZSkgKi8KKwlyb3VuZF92YXIocmVzdWx0LCByc2NhbGUpOworCisJLyogU3RyaXAgbGVh ZGluZyBhbmQgdHJhaWxpbmcgemVyb2VzICovCisJc3RyaXBfdmFyKHJlc3VsdCk7CisKK30K KwogCiAvKgogICogZGl2X3ZhcigpIC0KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFs b2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CmluZGV4 IDZhNTQ3NmQzYzQuLjE1ZGRlMGYzYzMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFs b2cvcGdfcHJvYy5kYXQKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdApA QCAtNDQ2NSw2ICs0NDY1LDkgQEAKIHsgb2lkID0+ICcxNzI2JywKICAgcHJvbmFtZSA9PiAn bnVtZXJpY19tdWwnLCBwcm9yZXR0eXBlID0+ICdudW1lcmljJywKICAgcHJvYXJndHlwZXMg PT4gJ251bWVyaWMgbnVtZXJpYycsIHByb3NyYyA9PiAnbnVtZXJpY19tdWwnIH0sCit7IG9p ZCA9PiAnNjM0NycsCisgIHByb25hbWUgPT4gJ251bWVyaWNfbXVsX3BhdGNoZWQnLCBwcm9y ZXR0eXBlID0+ICdudW1lcmljJywKKyAgcHJvYXJndHlwZXMgPT4gJ251bWVyaWMgbnVtZXJp YycsIHByb3NyYyA9PiAnbnVtZXJpY19tdWxfcGF0Y2hlZCcgfSwKIHsgb2lkID0+ICcxNzI3 JywKICAgcHJvbmFtZSA9PiAnbnVtZXJpY19kaXYnLCBwcm9yZXR0eXBlID0+ICdudW1lcmlj JywKICAgcHJvYXJndHlwZXMgPT4gJ251bWVyaWMgbnVtZXJpYycsIHByb3NyYyA9PiAnbnVt ZXJpY19kaXYnIH0sCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy9udW1lcmljLmgg Yi9zcmMvaW5jbHVkZS91dGlscy9udW1lcmljLmgKaW5kZXggNDNjNzVjNDM2Zi4uOTAzNmM5 ZGI1MCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRpbHMvbnVtZXJpYy5oCisrKyBiL3Ny Yy9pbmNsdWRlL3V0aWxzL251bWVyaWMuaApAQCAtOTcsNiArOTcsOCBAQCBleHRlcm4gTnVt ZXJpYyBudW1lcmljX3N1Yl9vcHRfZXJyb3IoTnVtZXJpYyBudW0xLCBOdW1lcmljIG51bTIs CiAJCQkJCQkJCQkgYm9vbCAqaGF2ZV9lcnJvcik7CiBleHRlcm4gTnVtZXJpYyBudW1lcmlj X211bF9vcHRfZXJyb3IoTnVtZXJpYyBudW0xLCBOdW1lcmljIG51bTIsCiAJCQkJCQkJCQkg Ym9vbCAqaGF2ZV9lcnJvcik7CitleHRlcm4gTnVtZXJpYyBudW1lcmljX211bF9wYXRjaGVk X29wdF9lcnJvcihOdW1lcmljIG51bTEsIE51bWVyaWMgbnVtMiwKKwkJCQkJCQkJCSBib29s ICpoYXZlX2Vycm9yKTsKIGV4dGVybiBOdW1lcmljIG51bWVyaWNfZGl2X29wdF9lcnJvcihO dW1lcmljIG51bTEsIE51bWVyaWMgbnVtMiwKIAkJCQkJCQkJCSBib29sICpoYXZlX2Vycm9y KTsKIGV4dGVybiBOdW1lcmljIG51bWVyaWNfbW9kX29wdF9lcnJvcihOdW1lcmljIG51bTEs IE51bWVyaWMgbnVtMiwKLS0gCjIuNDUuMQoK --707d32be3c9b4c3bb6c4a1e5f1a9ce45--