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 1sOidZ-000ibG-GY for pgsql-hackers@arkaria.postgresql.org; Tue, 02 Jul 2024 18:53:58 +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 1sOidX-003haZ-8Z for pgsql-hackers@arkaria.postgresql.org; Tue, 02 Jul 2024 18:53:55 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sOidV-003haQ-8Q for pgsql-hackers@lists.postgresql.org; Tue, 02 Jul 2024 18:53:55 +0000 Received: from fhigh1-smtp.messagingengine.com ([103.168.172.152]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sOidN-0004yV-TP for pgsql-hackers@postgresql.org; Tue, 02 Jul 2024 18:53:52 +0000 Received: from compute6.internal (compute6.nyi.internal [10.202.2.47]) by mailfhigh.nyi.internal (Postfix) with ESMTP id 4F1461140155; Tue, 2 Jul 2024 14:53:44 -0400 (EDT) Received: from imap48 ([10.202.2.98]) by compute6.internal (MEProxy); Tue, 02 Jul 2024 14:53:44 -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=1719946424; x=1720032824; bh=sBVHMzxhuz V4b0cJf8eTbyvOfP7YWOYGiK5qXYE7jX4=; b=FQ8ZS3SeAWkWXhnTUqoVIJCpIy ylORQVd6/fLNHrKhs1LaU0wBNzLUWg6HqaiRm5aQ5yy6Z94usmeO6C0AeTrqPdjk 0cwcB7BupAF7OHAO52X4lKP5Cb03Tzn/bO1VoWG79NKSwvvocoEy/xyffIHy3Dsw UFqxOTI7mVJaTiVtYkmEqj2aFOa1tQ3iu+RWIL04BXu+VHPiL8G3CCF/ST4BFBib aaU6EVNhm8bhR7cFtbXtOlonPiRc+SQPNDhqryqGfSb/C4QSLUaYWC7WS2jb4qow IrTOGxhxa2EE6aulTcLe97s/xVrki403Ywn6gODEzBvi4fr5Ikbblr0uB2Kw== 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=1719946424; x=1720032824; bh=sBVHMzxhuzV4b0cJf8eTbyvOfP7Y WOYGiK5qXYE7jX4=; b=mq8yYI4OyycksMkYpJPKhJSaH7IQhZajNOC/0KdEcH0p ULYOCrSM5jd8361RITZ5HTiTiZj5ew+ugix/bU1LxnHstqIHjHsc1c3bTwA63PuK Gq7jqutrtbimRBIGPi+S5GbQaa/m3DAbXVgeqTj8aojhUHZ3z3WMnfMuLgyaauF/ mM3r8hL4QWmCPxoBRnOzrW4e7g1PsnQxA+wV0d1yvdLlrb3n65YBjzz8XGis1q6e QRJNQ/hE7O45PoXDl9TGS9D0TJ7a641OenZCN+a0ZhaK4Xlg0BTObb1Tjx254VFH yN/a1aY2kSCWAiXxv5KLhrL41CoQR8GBfviL+gNzJg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeftddrudehgdduvdejucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepofgfggfkjghffffhvfevufgtsehmtderreerredtnecuhfhrohhmpedflfho vghlucflrggtohgsshhonhdfuceojhhovghlsegtohhmphhilhgvrhdrohhrgheqnecugg ftrfgrthhtvghrnheptefgjedvffeuudejkedtgfejheefffeguefhgeetueejvddtieef fedvvdevueeunecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrh homhepjhhovghlsegtohhmphhilhgvrhdrohhrgh X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id 140A931A0065; Tue, 2 Jul 2024 14:53:44 -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: In-Reply-To: <4e54bf4f-59fe-4c9a-b446-a2b64cbfd584@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> <81348268-b9fd-4308-bf52-056070aa7c2a@app.fastmail.com> <8e909218-1965-4515-99e3-4bb5b625e004@app.fastmail.com> <0459ded5-6daf-4bf0-9ab0-e1f11ab15ec6@app.fastmail.com> <4e54bf4f-59fe-4c9a-b446-a2b64cbfd584@app.fastmail.com> Date: Tue, 02 Jul 2024 20:53:23 +0200 From: "Joel Jacobson" To: "Dean Rasheed" Cc: =?UTF-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= , pgsql-hackers Subject: Re: Optimize numeric multiplication for one and two base-NBASE digit multiplicands. Content-Type: multipart/mixed; boundary=84d683e9ac184bad811253c2e5f6040a List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --84d683e9ac184bad811253c2e5f6040a Content-Type: text/plain On Tue, Jul 2, 2024, at 18:20, Joel Jacobson wrote: > * v3-optimize-numeric-mul_var-small-var1-arbitrary-var2.patch Hmm, v3 contains a bug which I haven't been able to solve yet. Reporting now to avoid time waste reviewing it since it's buggy. The attached patch is how I tested and found the bug. It contains a file test-mul-var.sql, which tests mul_var() with varying rscale, using the SQL-callable numeric_mul_patched(), which third argument is the rscale_adjustment. Out of 2481600 random tests, all passed except 4: SELECT result = numeric_mul_patched(var1,var2,rscale_adjustment), COUNT(*) FROM test_numeric_mul_patched GROUP BY 1 ORDER BY 1; ?column? | count ----------+--------- f | 4 t | 2481596 (2 rows) SELECT var1, var2, var1*var2 AS full_resolution, rscale_adjustment, result AS expected, numeric_mul_patched(var1,var2,rscale_adjustment) AS actual FROM test_numeric_mul_patched WHERE result <> numeric_mul_patched(var1,var2,rscale_adjustment); var1 | var2 | full_resolution | rscale_adjustment | expected | actual -------------------+----------------+---------------------------+-------------------+----------+-------- 676.797214075 | 0.308068877759 | 208.500158210502929257925 | -21 | 209 | 208 555.07029 | 0.381033094735 | 211.50015039415392315 | -17 | 212 | 211 0.476637718921 | 66.088276 | 31.500165120061470196 | -18 | 32 | 31 0.060569165063082 | 998.85933 | 60.50007563356949425506 | -20 | 61 | 60 (4 rows) Trying to wrap my head around what could cause this. It's rounding down instead of up, and these cases all end with decimal .500XXXX. Regards, Joel --84d683e9ac184bad811253c2e5f6040a Content-Disposition: attachment; filename="numeric_mul_patched.txt" Content-Type: text/plain; name="numeric_mul_patched.txt" Content-Transfer-Encoding: BASE64 RnJvbSAwNzRhZWIyMjNhYjQ5NmYyM2MyMDc1ZWFiZDM1ZTZlNzYyNDFkMWQ4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEpha29ic3NvbiA8Z2l0aHViQGNvbXBpbGVy Lm9yZz4KRGF0ZTogTW9uLCAxIEp1bCAyMDI0IDA3OjE3OjUwICswMjAwClN1YmplY3Q6IFtQ QVRDSF0gQWRkIFNRTC1jYWxsYWJsZSBudW1lcmljX211bF9wYXRjaGVkKCkgdG8gYmVuY2gg U2ltcGxpZmllZAogZmFzdC1wYXRoIGNvbXB1dGF0aW9uCgotLS0KIHNyYy9iYWNrZW5kL3V0 aWxzL2FkdC9udW1lcmljLmMgfCA0MzggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysKIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgfCAgIDMgKwogc3JjL2luY2x1 ZGUvdXRpbHMvbnVtZXJpYy5oICAgICB8ICAgMiArCiB0ZXN0LW11bC12YXIuc3FsICAgICAg ICAgICAgICAgIHwgIDQ4ICsrKysKIDQgZmlsZXMgY2hhbmdlZCwgNDkxIGluc2VydGlvbnMo KykKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0LW11bC12YXIuc3FsCgpkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvdXRpbHMvYWR0L251bWVyaWMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9udW1lcmljLmMKaW5kZXggNTUxMGEyMDNiMC4uOGY1ZDU1M2YxNSAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvdXRpbHMvYWR0L251bWVyaWMuYworKysgYi9zcmMvYmFja2VuZC91dGls cy9hZHQvbnVtZXJpYy5jCkBAIC01NTEsNiArNTUxLDkgQEAgc3RhdGljIHZvaWQgc3ViX3Zh cihjb25zdCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAogc3Rh dGljIHZvaWQgbXVsX3Zhcihjb25zdCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmlj VmFyICp2YXIyLAogCQkJCQlOdW1lcmljVmFyICpyZXN1bHQsCiAJCQkJCWludCByc2NhbGUp Oworc3RhdGljIHZvaWQgbXVsX3Zhcl9wYXRjaGVkKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEs IGNvbnN0IE51bWVyaWNWYXIgKnZhcjIsCisJCQkJCU51bWVyaWNWYXIgKnJlc3VsdCwKKwkJ CQkJaW50IHJzY2FsZSk7CiBzdGF0aWMgdm9pZCBkaXZfdmFyKGNvbnN0IE51bWVyaWNWYXIg KnZhcjEsIGNvbnN0IE51bWVyaWNWYXIgKnZhcjIsCiAJCQkJCU51bWVyaWNWYXIgKnJlc3Vs dCwKIAkJCQkJaW50IHJzY2FsZSwgYm9vbCByb3VuZCk7CkBAIC0zMTE1LDYgKzMxMTgsMTMx IEBAIG51bWVyaWNfbXVsX29wdF9lcnJvcihOdW1lcmljIG51bTEsIE51bWVyaWMgbnVtMiwg Ym9vbCAqaGF2ZV9lcnJvcikKIH0KIAogCisvKgorICogbnVtZXJpY19tdWxfcGF0Y2hlZCgp IC0KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11bHRpcGxpZXMgdHdvIG51bWVyaWMgdmFsdWVz IHVzaW5nIHRoZSBwYXRjaGVkIGFsZ29yaXRobSwKKyAqIGRlc2lnbmVkIGZvciBlZmZpY2ll bnQgaGFuZGxpbmcgb2YgbGFyZ2UgbnVtYmVycy4gSXQncyBpbnRyb2R1Y2VkIHRvIGFsbG93 CisgKiBkaXJlY3QgYmVuY2htYXJrIGNvbXBhcmlzb25zIHdpdGggdGhlIHN0YW5kYXJkIG51 bWVyaWNfbXVsKCkgZnVuY3Rpb24uCisgKi8KK0RhdHVtCitudW1lcmljX211bF9wYXRjaGVk KFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJTnVtZXJpYwkJbnVtMSA9IFBHX0dFVEFSR19OVU1F UklDKDApOworCU51bWVyaWMJCW51bTIgPSBQR19HRVRBUkdfTlVNRVJJQygxKTsKKwlpbnQz MgkJcnNjYWxlX2FkanVzdG1lbnQgPSBQR19HRVRBUkdfSU5UMzIoMik7CisJTnVtZXJpYwkJ cmVzOworCisJcmVzID0gbnVtZXJpY19tdWxfcGF0Y2hlZF9vcHRfZXJyb3IobnVtMSwgbnVt MiwgcnNjYWxlX2FkanVzdG1lbnQsIE5VTEwpOworCisJUEdfUkVUVVJOX05VTUVSSUMocmVz KTsKK30KKworCisvKgorICogbnVtZXJpY19tdWxfcGF0Y2hlZF9vcHRfZXJyb3IoKSAtCisg KgorICoJSW50ZXJuYWwgdmVyc2lvbiBvZiBudW1lcmljX211bF9wYXRjaGVkKCkuCisgKglJ ZiAiKmhhdmVfZXJyb3IiIGZsYWcgaXMgcHJvdmlkZWQsIG9uIGVycm9yIGl0J3Mgc2V0IHRv IHRydWUsIE5VTEwgcmV0dXJuZWQuCisgKglUaGlzIGlzIGhlbHBmdWwgd2hlbiBjYWxsZXIg bmVlZCB0byBoYW5kbGUgZXJyb3JzIGJ5IGl0c2VsZi4KKyAqLworTnVtZXJpYworbnVtZXJp Y19tdWxfcGF0Y2hlZF9vcHRfZXJyb3IoTnVtZXJpYyBudW0xLCBOdW1lcmljIG51bTIsIGlu dDMyIHJzY2FsZV9hZGp1c3RtZW50LCBib29sICpoYXZlX2Vycm9yKQoreworCU51bWVyaWNW 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 LmRzY2FsZSArIGFyZzIuZHNjYWxlICsgcnNjYWxlX2FkanVzdG1lbnQpOworCisJaWYgKHJl c3VsdC5kc2NhbGUgPiBOVU1FUklDX0RTQ0FMRV9NQVgpCisJCXJvdW5kX3ZhcigmcmVzdWx0 LCBOVU1FUklDX0RTQ0FMRV9NQVgpOworCisJcmVzID0gbWFrZV9yZXN1bHRfb3B0X2Vycm9y KCZyZXN1bHQsIGhhdmVfZXJyb3IpOworCisJZnJlZV92YXIoJnJlc3VsdCk7CisKKwlyZXR1 cm4gcmVzOworfQorCisKIC8qCiAgKiBudW1lcmljX2RpdigpIC0KICAqCkBAIC04ODY0LDYg Kzg5OTIsMzE2IEBAIG11bF92YXIoY29uc3QgTnVtZXJpY1ZhciAqdmFyMSwgY29uc3QgTnVt ZXJpY1ZhciAqdmFyMiwgTnVtZXJpY1ZhciAqcmVzdWx0LAogCXN0cmlwX3ZhcihyZXN1bHQp OwogfQogCisvKgorICogbXVsX3Zhcl9wYXRjaGVkKCkgLQorICoKKyAqIEltcGxlbWVudHMg cGF0Y2hlZCBtdWx0aXBsaWNhdGlvbiBmb3IgbGFyZ2UgbnVtYmVycywgaW50cm9kdWNlZAor ICogYWxvbmdzaWRlIHRoZSB1bmNoYW5nZWQgb3JpZ2luYWwgbXVsX3ZhcigpLiBUaGlzIGZ1 bmN0aW9uIGlzIHBhcnQgb2YKKyAqIGFuIG9wdGltaXphdGlvbiBlZmZvcnQsIGFsbG93aW5n IGRpcmVjdCBiZW5jaG1hcmsgY29tcGFyaXNvbnMgd2l0aAorICogbXVsX3ZhcigpLiBJdCBz ZWxlY3RzIGZ1bGwgb3IgaGFsZiBwYXRjaGVkIGJhc2VkIG9uIGlucHV0IHNpemUuCisgKiBU aGlzIGlzIGEgdGVtcG9yYXJ5IG1lYXN1cmUgYmVmb3JlIGNvbnNpZGVyaW5nIGl0cyByZXBs YWNlbWVudCBvZgorICogbXVsX3ZhcigpIGJhc2VkIG9uIGJlbmNobWFyayBvdXRjb21lcy4K KyAqLworc3RhdGljIHZvaWQKK211bF92YXJfcGF0Y2hlZChjb25zdCBOdW1lcmljVmFyICp2 YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAorCQlOdW1lcmljVmFyICpyZXN1bHQsIGlu dCByc2NhbGUpCit7CisJaW50CQkJcmVzX25kaWdpdHM7CisJaW50CQkJcmVzX3NpZ247CisJ aW50CQkJcmVzX3dlaWdodDsKKwlpbnQJCQltYXhkaWdpdHM7CisJaW50CQkgICAqZGlnOwor CWludAkJCWNhcnJ5OworCWludAkJCW1heGRpZzsKKwlpbnQJCQluZXdkaWc7CisJaW50CQkJ dmFyMW5kaWdpdHM7CisJaW50CQkJdmFyMm5kaWdpdHM7CisJTnVtZXJpY0RpZ2l0ICp2YXIx ZGlnaXRzOworCU51bWVyaWNEaWdpdCAqdmFyMmRpZ2l0czsKKwlOdW1lcmljRGlnaXQgKnJl c19kaWdpdHM7CisJaW50CQkJaSwKKwkJCQlpMSwKKwkJCQlpMjsKKworCS8qCisJICogQXJy YW5nZSBmb3IgdmFyMSB0byBiZSB0aGUgc2hvcnRlciBvZiB0aGUgdHdvIG51bWJlcnMuICBU aGlzIGltcHJvdmVzCisJICogcGVyZm9ybWFuY2UgYmVjYXVzZSB0aGUgaW5uZXIgbXVsdGlw bGljYXRpb24gbG9vcCBpcyBtdWNoIHNpbXBsZXIgdGhhbgorCSAqIHRoZSBvdXRlciBsb29w LCBzbyBpdCdzIGJldHRlciB0byBoYXZlIGEgc21hbGxlciBudW1iZXIgb2YgaXRlcmF0aW9u cworCSAqIG9mIHRoZSBvdXRlciBsb29wLiAgVGhpcyBhbHNvIHJlZHVjZXMgdGhlIG51bWJl ciBvZiB0aW1lcyB0aGF0IHRoZQorCSAqIGFjY3VtdWxhdG9yIGFycmF5IG5lZWRzIHRvIGJl IG5vcm1hbGl6ZWQuCisJICovCisJaWYgKHZhcjEtPm5kaWdpdHMgPiB2YXIyLT5uZGlnaXRz KQorCXsKKwkJY29uc3QgTnVtZXJpY1ZhciAqdG1wID0gdmFyMTsKKworCQl2YXIxID0gdmFy MjsKKwkJdmFyMiA9IHRtcDsKKwl9CisKKwkvKiBjb3B5IHRoZXNlIHZhbHVlcyBpbnRvIGxv Y2FsIHZhcnMgZm9yIHNwZWVkIGluIGlubmVyIGxvb3AgKi8KKwl2YXIxbmRpZ2l0cyA9IHZh cjEtPm5kaWdpdHM7CisJdmFyMm5kaWdpdHMgPSB2YXIyLT5uZGlnaXRzOworCXZhcjFkaWdp dHMgPSB2YXIxLT5kaWdpdHM7CisJdmFyMmRpZ2l0cyA9IHZhcjItPmRpZ2l0czsKKworCWlm ICh2YXIxbmRpZ2l0cyA9PSAwIHx8IHZhcjJuZGlnaXRzID09IDApCisJeworCQkvKiBvbmUg b3IgYm90aCBpbnB1dHMgaXMgemVybzsgc28gaXMgcmVzdWx0ICovCisJCXplcm9fdmFyKHJl c3VsdCk7CisJCXJlc3VsdC0+ZHNjYWxlID0gcnNjYWxlOworCQlyZXR1cm47CisJfQorCisJ LyogRGV0ZXJtaW5lIHJlc3VsdCBzaWduIGFuZCAobWF4aW11bSBwb3NzaWJsZSkgd2VpZ2h0 ICovCisJaWYgKHZhcjEtPnNpZ24gPT0gdmFyMi0+c2lnbikKKwkJcmVzX3NpZ24gPSBOVU1F UklDX1BPUzsKKwllbHNlCisJCXJlc19zaWduID0gTlVNRVJJQ19ORUc7CisJcmVzX3dlaWdo dCA9IHZhcjEtPndlaWdodCArIHZhcjItPndlaWdodCArIDI7CisKKwkvKgorCSAqIERldGVy bWluZSB0aGUgbnVtYmVyIG9mIHJlc3VsdCBkaWdpdHMgdG8gY29tcHV0ZS4gIElmIHRoZSBl eGFjdCByZXN1bHQKKwkgKiB3b3VsZCBoYXZlIG1vcmUgdGhhbiByc2NhbGUgZnJhY3Rpb25h bCBkaWdpdHMsIHRydW5jYXRlIHRoZSBjb21wdXRhdGlvbgorCSAqIHdpdGggTVVMX0dVQVJE X0RJR0lUUyBndWFyZCBkaWdpdHMsIGkuZS4sIGlnbm9yZSBpbnB1dCBkaWdpdHMgdGhhdAor CSAqIHdvdWxkIG9ubHkgY29udHJpYnV0ZSB0byB0aGUgcmlnaHQgb2YgdGhhdC4gIChUaGlz IHdpbGwgZ2l2ZSB0aGUgZXhhY3QKKwkgKiByb3VuZGVkLXRvLXJzY2FsZSBhbnN3ZXIgdW5s ZXNzIGNhcnJpZXMgb3V0IG9mIHRoZSBpZ25vcmVkIHBvc2l0aW9ucworCSAqIHdvdWxkIGhh dmUgcHJvcGFnYXRlZCB0aHJvdWdoIG1vcmUgdGhhbiBNVUxfR1VBUkRfRElHSVRTIGRpZ2l0 cy4pCisJICoKKwkgKiBOb3RlOiBhbiBleGFjdCBjb21wdXRhdGlvbiBjb3VsZCBub3QgcHJv ZHVjZSBtb3JlIHRoYW4gdmFyMW5kaWdpdHMgKworCSAqIHZhcjJuZGlnaXRzIGRpZ2l0cywg YnV0IHdlIGFsbG9jYXRlIG9uZSBleHRyYSBvdXRwdXQgZGlnaXQgaW4gY2FzZQorCSAqIHJz Y2FsZS1kcml2ZW4gcm91bmRpbmcgcHJvZHVjZXMgYSBjYXJyeSBvdXQgb2YgdGhlIGhpZ2hl c3QgZXhhY3QgZGlnaXQuCisJICovCisJcmVzX25kaWdpdHMgPSB2YXIxbmRpZ2l0cyArIHZh cjJuZGlnaXRzICsgMTsKKwltYXhkaWdpdHMgPSByZXNfd2VpZ2h0ICsgMSArIChyc2NhbGUg KyBERUNfRElHSVRTIC0gMSkgLyBERUNfRElHSVRTICsKKwkJTVVMX0dVQVJEX0RJR0lUUzsK KwlyZXNfbmRpZ2l0cyA9IE1pbihyZXNfbmRpZ2l0cywgbWF4ZGlnaXRzKTsKKworCWlmIChy ZXNfbmRpZ2l0cyA8IDMpCisJeworCQkvKiBBbGwgaW5wdXQgZGlnaXRzIHdpbGwgYmUgaWdu b3JlZDsgc28gcmVzdWx0IGlzIHplcm8gKi8KKwkJemVyb192YXIocmVzdWx0KTsKKwkJcmVz dWx0LT5kc2NhbGUgPSByc2NhbGU7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNpbXBs aWZpZWQgZmFzdC1wYXRoIGNvbXB1dGF0aW9uLCBpZiB2YXIxIGhhcyBqdXN0IG9uZSBvciB0 d28gZGlnaXRzLgorCSAqIFRoaXMgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIsIHNpbmNlIGl0 IGF2b2lkcyBhbGxvY2F0aW5nIGEgc2VwYXJhdGUKKwkgKiBkaWdpdCBhcnJheSwgbWFraW5n IG11bHRpcGxlIHBhc3NlcyBvdmVyIHZhcjIsIGFuZCBoYXZpbmcgc2VwYXJhdGUKKwkgKiBj YXJyeS1wcm9wYWdhdGlvbiBwYXNzZXMuCisJICovCisJaWYgKHZhcjFuZGlnaXRzIDw9IDMp CisJeworCQlOdW1lcmljRGlnaXQgKnJlc19idWY7CisKKwkJLyogQWxsb2NhdGUgcmVzdWx0 IGRpZ2l0IGFycmF5ICovCisJCXJlc19idWYgPSBkaWdpdGJ1Zl9hbGxvYyhyZXNfbmRpZ2l0 cyk7CisJCXJlc19idWZbMF0gPSAwOwkJCQkvKiBzcGFyZSBkaWdpdCBmb3IgbGF0ZXIgcm91 bmRpbmcgKi8KKwkJcmVzX2RpZ2l0cyA9IHJlc19idWYgKyAxOworCisJCS8qCisJCSAqIENv bXB1dGUgdGhlIHJlc3VsdCBkaWdpdHMgZGlyZWN0bHksIGluIG9uZSBwYXNzLCBwcm9wYWdh dGluZyB0aGUKKwkJICogY2FycnkgdXAgYXMgd2UgZ28uCisJCSAqLworCQlzd2l0Y2ggKHZh cjFuZGlnaXRzKQorCQl7CisJCQljYXNlIDE6CisJCQkJY2FycnkgPSAwOworCQkJCWZvciAo aSA9IHJlc19uZGlnaXRzIC0gMzsgaSA+PSAwOyBpLS0pCisJCQkJeworCQkJCQluZXdkaWcg PSAoaW50KSB2YXIxZGlnaXRzWzBdICogdmFyMmRpZ2l0c1tpXSArIGNhcnJ5OworCQkJCQly ZXNfZGlnaXRzW2kgKyAxXSA9IChOdW1lcmljRGlnaXQpIChuZXdkaWcgJSBOQkFTRSk7CisJ CQkJCWNhcnJ5ID0gbmV3ZGlnIC8gTkJBU0U7CisJCQkJfQorCQkJCXJlc19kaWdpdHNbMF0g PSAoTnVtZXJpY0RpZ2l0KSBjYXJyeTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOgorCQkJ CW5ld2RpZyA9IChpbnQpIHZhcjFkaWdpdHNbMV0gKiB2YXIyZGlnaXRzW3Jlc19uZGlnaXRz IC0gNF07CisJCQkJaWYgKHJlc19uZGlnaXRzIC0gMyA8IHZhcjJuZGlnaXRzKQorCQkJCQlu ZXdkaWcgKz0gKGludCkgdmFyMWRpZ2l0c1swXSAqIHZhcjJkaWdpdHNbcmVzX25kaWdpdHMg LSAzXTsKKwkJCQlyZXNfZGlnaXRzW3Jlc19uZGlnaXRzIC0gMl0gPSAoTnVtZXJpY0RpZ2l0 KSAobmV3ZGlnICUgTkJBU0UpOworCQkJCWNhcnJ5ID0gbmV3ZGlnIC8gTkJBU0U7CisJCQkJ Zm9yIChpID0gcmVzX25kaWdpdHMgLSA0OyBpID49IDE7IGktLSkKKwkJCQl7CisJCQkJCW5l d2RpZyA9IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2YXIyZGlnaXRzW2ldICsKKwkJCQkJCShp bnQpIHZhcjFkaWdpdHNbMV0gKiB2YXIyZGlnaXRzW2kgLSAxXSArIGNhcnJ5OworCQkJCQly ZXNfZGlnaXRzW2kgKyAxXSA9IChOdW1lcmljRGlnaXQpIChuZXdkaWcgJSBOQkFTRSk7CisJ CQkJCWNhcnJ5ID0gbmV3ZGlnIC8gTkJBU0U7CisJCQkJfQorCQkJCW5ld2RpZyA9IChpbnQp IHZhcjFkaWdpdHNbMF0gKiB2YXIyZGlnaXRzWzBdICsgY2Fycnk7CisJCQkJcmVzX2RpZ2l0 c1sxXSA9IChOdW1lcmljRGlnaXQpIChuZXdkaWcgJSBOQkFTRSk7CisJCQkJcmVzX2RpZ2l0 c1swXSA9IChOdW1lcmljRGlnaXQpIChuZXdkaWcgLyBOQkFTRSk7CisJCQkJYnJlYWs7CisK KwkJCWNhc2UgMzoKKwkJCQluZXdkaWcgPSAoaW50KSB2YXIxZGlnaXRzWzJdICogdmFyMmRp Z2l0c1tyZXNfbmRpZ2l0cyAtIDVdOworCQkJCWlmIChyZXNfbmRpZ2l0cyAtIDQgPCB2YXIy bmRpZ2l0cykKKwkJCQkJbmV3ZGlnICs9IChpbnQpIHZhcjFkaWdpdHNbMV0gKiB2YXIyZGln aXRzW3Jlc19uZGlnaXRzIC0gNF07CisJCQkJaWYgKHJlc19uZGlnaXRzIC0gMyA8IHZhcjJu ZGlnaXRzKQorCQkJCQluZXdkaWcgKz0gKGludCkgdmFyMWRpZ2l0c1swXSAqIHZhcjJkaWdp dHNbcmVzX25kaWdpdHMgLSAzXTsKKwkJCQlyZXNfZGlnaXRzW3Jlc19uZGlnaXRzIC0gMl0g PSAoTnVtZXJpY0RpZ2l0KSAobmV3ZGlnICUgTkJBU0UpOworCQkJCWNhcnJ5ID0gbmV3ZGln IC8gTkJBU0U7CisJCQkJZm9yIChpID0gcmVzX25kaWdpdHMgLSA0OyBpID49IDI7IGktLSkK KwkJCQl7CisJCQkJCW5ld2RpZyA9IGNhcnJ5OworCQkJCQlpZiAoaSA8IHZhcjJuZGlnaXRz KQorCQkJCQkJbmV3ZGlnICs9IChpbnQpIHZhcjFkaWdpdHNbMF0gKiB2YXIyZGlnaXRzW2ld OworCQkJCQlpZiAoaSAtIDEgPj0gMCAmJiBpIC0gMSA8IHZhcjJuZGlnaXRzKQorCQkJCQkJ bmV3ZGlnICs9IChpbnQpIHZhcjFkaWdpdHNbMV0gKiB2YXIyZGlnaXRzW2kgLSAxXTsKKwkJ CQkJaWYgKGkgLSAyID49IDAgJiYgaSAtIDIgPCB2YXIybmRpZ2l0cykKKwkJCQkJCW5ld2Rp ZyArPSAoaW50KSB2YXIxZGlnaXRzWzJdICogdmFyMmRpZ2l0c1tpIC0gMl07CisJCQkJCXJl c19kaWdpdHNbaSArIDFdID0gKE51bWVyaWNEaWdpdCkgKG5ld2RpZyAlIE5CQVNFKTsKKwkJ CQkJY2FycnkgPSBuZXdkaWcgLyBOQkFTRTsKKwkJCQl9CisJCQkJbmV3ZGlnID0gY2Fycnk7 CisJCQkJaWYgKHZhcjJuZGlnaXRzID4gMSkKKwkJCQkJbmV3ZGlnICs9IChpbnQpIHZhcjFk aWdpdHNbMF0gKiB2YXIyZGlnaXRzWzFdOworCQkJCWlmICh2YXIybmRpZ2l0cyA+IDApCisJ CQkJCW5ld2RpZyArPSAoaW50KSB2YXIxZGlnaXRzWzFdICogdmFyMmRpZ2l0c1swXTsKKwkJ CQlyZXNfZGlnaXRzWzJdID0gKE51bWVyaWNEaWdpdCkgKG5ld2RpZyAlIE5CQVNFKTsKKwkJ CQljYXJyeSA9IG5ld2RpZyAvIE5CQVNFOworCQkJCW5ld2RpZyA9IChpbnQpIHZhcjFkaWdp dHNbMF0gKiB2YXIyZGlnaXRzWzBdICsgY2Fycnk7CisJCQkJcmVzX2RpZ2l0c1sxXSA9IChO dW1lcmljRGlnaXQpIChuZXdkaWcgJSBOQkFTRSk7CisJCQkJcmVzX2RpZ2l0c1swXSA9IChO dW1lcmljRGlnaXQpIChuZXdkaWcgLyBOQkFTRSk7CisJCQkJYnJlYWs7CisJCX0KKworCQkv KiBTdG9yZSB0aGUgcHJvZHVjdCBpbiByZXN1bHQgKG1pbnVzIGV4dHJhIHJvdW5kaW5nIGRp Z2l0KSAqLworCQlkaWdpdGJ1Zl9mcmVlKHJlc3VsdC0+YnVmKTsKKwkJcmVzdWx0LT5uZGln aXRzID0gcmVzX25kaWdpdHMgLSAxOworCQlyZXN1bHQtPmJ1ZiA9IHJlc19idWY7CisJCXJl c3VsdC0+ZGlnaXRzID0gcmVzX2RpZ2l0czsKKwkJcmVzdWx0LT53ZWlnaHQgPSByZXNfd2Vp Z2h0IC0gMTsKKwkJcmVzdWx0LT5zaWduID0gcmVzX3NpZ247CisKKwkJLyogUm91bmQgdG8g dGFyZ2V0IHJzY2FsZSAoYW5kIHNldCByZXN1bHQtPmRzY2FsZSkgKi8KKwkJcm91bmRfdmFy KHJlc3VsdCwgcnNjYWxlKTsKKworCQkvKiBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB6 ZXJvZXMgKi8KKwkJc3RyaXBfdmFyKHJlc3VsdCk7CisKKwkJcmV0dXJuOworCX0KKworCS8q CisJICogV2UgZG8gdGhlIGFyaXRobWV0aWMgaW4gYW4gYXJyYXkgImRpZ1tdIiBvZiBzaWdu ZWQgaW50J3MuICBTaW5jZQorCSAqIElOVF9NQVggaXMgbm90aWNlYWJseSBsYXJnZXIgdGhh biBOQkFTRSpOQkFTRSwgdGhpcyBnaXZlcyB1cyBoZWFkcm9vbQorCSAqIHRvIGF2b2lkIG5v cm1hbGl6aW5nIGNhcnJpZXMgaW1tZWRpYXRlbHkuCisJICoKKwkgKiBtYXhkaWcgdHJhY2tz IHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlIG9mIGFueSBkaWdbXSBlbnRyeTsgd2hlbiB0 aGlzCisJICogdGhyZWF0ZW5zIHRvIGV4Y2VlZCBJTlRfTUFYLCB3ZSB0YWtlIHRoZSB0aW1l IHRvIHByb3BhZ2F0ZSBjYXJyaWVzLgorCSAqIEZ1cnRoZXJtb3JlLCB3ZSBuZWVkIHRvIGVu c3VyZSB0aGF0IG92ZXJmbG93IGRvZXNuJ3Qgb2NjdXIgZHVyaW5nIHRoZQorCSAqIGNhcnJ5 IHByb3BhZ2F0aW9uIHBhc3NlcyBlaXRoZXIuICBUaGUgY2FycnkgdmFsdWVzIGNvdWxkIGJl IGFzIG11Y2ggYXMKKwkgKiBJTlRfTUFYL05CQVNFLCBzbyByZWFsbHkgd2UgbXVzdCBub3Jt YWxpemUgd2hlbiBkaWdpdHMgdGhyZWF0ZW4gdG8KKwkgKiBleGNlZWQgSU5UX01BWCAtIElO VF9NQVgvTkJBU0UuCisJICoKKwkgKiBUbyBhdm9pZCBvdmVyZmxvdyBpbiBtYXhkaWcgaXRz ZWxmLCBpdCBhY3R1YWxseSByZXByZXNlbnRzIHRoZSBtYXgKKwkgKiBwb3NzaWJsZSB2YWx1 ZSBkaXZpZGVkIGJ5IE5CQVNFLTEsIGllLCBhdCB0aGUgdG9wIG9mIHRoZSBsb29wIGl0IGlz CisJICoga25vd24gdGhhdCBubyBkaWdbXSBlbnRyeSBleGNlZWRzIG1heGRpZyAqIChOQkFT RS0xKS4KKwkgKi8KKwlkaWcgPSAoaW50ICopIHBhbGxvYzAocmVzX25kaWdpdHMgKiBzaXpl b2YoaW50KSk7CisJbWF4ZGlnID0gMDsKKworCS8qCisJICogVGhlIGxlYXN0IHNpZ25pZmlj YW50IGRpZ2l0cyBvZiB2YXIxIHNob3VsZCBiZSBpZ25vcmVkIGlmIHRoZXkgZG9uJ3QKKwkg KiBjb250cmlidXRlIGRpcmVjdGx5IHRvIHRoZSBmaXJzdCByZXNfbmRpZ2l0cyBkaWdpdHMg b2YgdGhlIHJlc3VsdCB0aGF0CisJICogd2UgYXJlIGNvbXB1dGluZy4KKwkgKgorCSAqIERp Z2l0IGkxIG9mIHZhcjEgYW5kIGRpZ2l0IGkyIG9mIHZhcjIgYXJlIG11bHRpcGxpZWQgYW5k IGFkZGVkIHRvIGRpZ2l0CisJICogaTEraTIrMiBvZiB0aGUgYWNjdW11bGF0b3IgYXJyYXks IHNvIHdlIG5lZWQgb25seSBjb25zaWRlciBkaWdpdHMgb2YKKwkgKiB2YXIxIGZvciB3aGlj aCBpMSA8PSByZXNfbmRpZ2l0cyAtIDMuCisJICovCisJZm9yIChpMSA9IE1pbih2YXIxbmRp Z2l0cyAtIDEsIHJlc19uZGlnaXRzIC0gMyk7IGkxID49IDA7IGkxLS0pCisJeworCQlOdW1l cmljRGlnaXQgdmFyMWRpZ2l0ID0gdmFyMWRpZ2l0c1tpMV07CisKKwkJaWYgKHZhcjFkaWdp dCA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogVGltZSB0byBub3JtYWxpemU/ICovCisJ CW1heGRpZyArPSB2YXIxZGlnaXQ7CisJCWlmIChtYXhkaWcgPiAoSU5UX01BWCAtIElOVF9N QVggLyBOQkFTRSkgLyAoTkJBU0UgLSAxKSkKKwkJeworCQkJLyogWWVzLCBkbyBpdCAqLwor CQkJY2FycnkgPSAwOworCQkJZm9yIChpID0gcmVzX25kaWdpdHMgLSAxOyBpID49IDA7IGkt LSkKKwkJCXsKKwkJCQluZXdkaWcgPSBkaWdbaV0gKyBjYXJyeTsKKwkJCQlpZiAobmV3ZGln ID49IE5CQVNFKQorCQkJCXsKKwkJCQkJY2FycnkgPSBuZXdkaWcgLyBOQkFTRTsKKwkJCQkJ bmV3ZGlnIC09IGNhcnJ5ICogTkJBU0U7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJY2Fycnkg PSAwOworCQkJCWRpZ1tpXSA9IG5ld2RpZzsKKwkJCX0KKwkJCUFzc2VydChjYXJyeSA9PSAw KTsKKwkJCS8qIFJlc2V0IG1heGRpZyB0byBpbmRpY2F0ZSBuZXcgd29yc3QtY2FzZSAqLwor CQkJbWF4ZGlnID0gMSArIHZhcjFkaWdpdDsKKwkJfQorCisJCS8qCisJCSAqIEFkZCB0aGUg YXBwcm9wcmlhdGUgbXVsdGlwbGUgb2YgdmFyMiBpbnRvIHRoZSBhY2N1bXVsYXRvci4KKwkJ ICoKKwkJICogQXMgYWJvdmUsIGRpZ2l0cyBvZiB2YXIyIGNhbiBiZSBpZ25vcmVkIGlmIHRo ZXkgZG9uJ3QgY29udHJpYnV0ZSwKKwkJICogc28gd2Ugb25seSBpbmNsdWRlIGRpZ2l0cyBm b3Igd2hpY2ggaTEraTIrMiA8IHJlc19uZGlnaXRzLgorCQkgKgorCQkgKiBUaGlzIGlubmVy IGxvb3AgaXMgdGhlIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2sgZm9yIG11bHRpcGxpY2F0aW9u LAorCQkgKiBzbyB3ZSB3YW50IHRvIGtlZXAgaXQgc2ltcGxlIGVub3VnaCBzbyB0aGF0IGl0 IGNhbiBiZQorCQkgKiBhdXRvLXZlY3Rvcml6ZWQuICBBY2NvcmRpbmdseSwgcHJvY2VzcyB0 aGUgZGlnaXRzIGxlZnQtdG8tcmlnaHQKKwkJICogZXZlbiB0aG91Z2ggc2Nob29sYm9vayBt dWx0aXBsaWNhdGlvbiB3b3VsZCBzdWdnZXN0IHJpZ2h0LXRvLWxlZnQuCisJCSAqIFNpbmNl IHdlIGFyZW4ndCBwcm9wYWdhdGluZyBjYXJyaWVzIGluIHRoaXMgbG9vcCwgdGhlIG9yZGVy IGRvZXMKKwkJICogbm90IG1hdHRlci4KKwkJICovCisJCXsKKwkJCWludAkJCWkybGltaXQg PSBNaW4odmFyMm5kaWdpdHMsIHJlc19uZGlnaXRzIC0gaTEgLSAyKTsKKwkJCWludAkJICAg KmRpZ19pMV8yID0gJmRpZ1tpMSArIDJdOworCisJCQlmb3IgKGkyID0gMDsgaTIgPCBpMmxp bWl0OyBpMisrKQorCQkJCWRpZ19pMV8yW2kyXSArPSB2YXIxZGlnaXQgKiB2YXIyZGlnaXRz W2kyXTsKKwkJfQorCX0KKworCS8qCisJICogTm93IHdlIGRvIGEgZmluYWwgY2FycnkgcHJv cGFnYXRpb24gcGFzcyB0byBub3JtYWxpemUgdGhlIHJlc3VsdCwgd2hpY2gKKwkgKiB3ZSBj b21iaW5lIHdpdGggc3RvcmluZyB0aGUgcmVzdWx0IGRpZ2l0cyBpbnRvIHRoZSBvdXRwdXQu IE5vdGUgdGhhdAorCSAqIHRoaXMgaXMgc3RpbGwgZG9uZSBhdCBmdWxsIHByZWNpc2lvbiB3 L2d1YXJkIGRpZ2l0cy4KKwkgKi8KKwlhbGxvY192YXIocmVzdWx0LCByZXNfbmRpZ2l0cyk7 CisJcmVzX2RpZ2l0cyA9IHJlc3VsdC0+ZGlnaXRzOworCWNhcnJ5ID0gMDsKKwlmb3IgKGkg PSByZXNfbmRpZ2l0cyAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkJbmV3ZGlnID0gZGlnW2ld ICsgY2Fycnk7CisJCWlmIChuZXdkaWcgPj0gTkJBU0UpCisJCXsKKwkJCWNhcnJ5ID0gbmV3 ZGlnIC8gTkJBU0U7CisJCQluZXdkaWcgLT0gY2FycnkgKiBOQkFTRTsKKwkJfQorCQllbHNl CisJCQljYXJyeSA9IDA7CisJCXJlc19kaWdpdHNbaV0gPSBuZXdkaWc7CisJfQorCUFzc2Vy dChjYXJyeSA9PSAwKTsKKworCXBmcmVlKGRpZyk7CisKKwkvKgorCSAqIEZpbmFsbHksIHJv dW5kIHRoZSByZXN1bHQgdG8gdGhlIHJlcXVlc3RlZCBwcmVjaXNpb24uCisJICovCisJcmVz dWx0LT53ZWlnaHQgPSByZXNfd2VpZ2h0OworCXJlc3VsdC0+c2lnbiA9IHJlc19zaWduOwor CisJLyogUm91bmQgdG8gdGFyZ2V0IHJzY2FsZSAoYW5kIHNldCByZXN1bHQtPmRzY2FsZSkg Ki8KKwlyb3VuZF92YXIocmVzdWx0LCByc2NhbGUpOworCisJLyogU3RyaXAgbGVhZGluZyBh bmQgdHJhaWxpbmcgemVyb2VzICovCisJc3RyaXBfdmFyKHJlc3VsdCk7CisKK30KKwogCiAv KgogICogZGl2X3ZhcigpIC0KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdf cHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CmluZGV4IGQ0YWM1 NzhhZTYuLjViMzAyNGNiNmQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdf cHJvYy5kYXQKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtNDQ2 NSw2ICs0NDY1LDkgQEAKIHsgb2lkID0+ICcxNzI2JywKICAgcHJvbmFtZSA9PiAnbnVtZXJp Y19tdWwnLCBwcm9yZXR0eXBlID0+ICdudW1lcmljJywKICAgcHJvYXJndHlwZXMgPT4gJ251 bWVyaWMgbnVtZXJpYycsIHByb3NyYyA9PiAnbnVtZXJpY19tdWwnIH0sCit7IG9pZCA9PiAn NjM0NycsCisgIHByb25hbWUgPT4gJ251bWVyaWNfbXVsX3BhdGNoZWQnLCBwcm9yZXR0eXBl ID0+ICdudW1lcmljJywKKyAgcHJvYXJndHlwZXMgPT4gJ251bWVyaWMgbnVtZXJpYyBpbnQ0 JywgcHJvc3JjID0+ICdudW1lcmljX211bF9wYXRjaGVkJyB9LAogeyBvaWQgPT4gJzE3Mjcn LAogICBwcm9uYW1lID0+ICdudW1lcmljX2RpdicsIHByb3JldHR5cGUgPT4gJ251bWVyaWMn LAogICBwcm9hcmd0eXBlcyA9PiAnbnVtZXJpYyBudW1lcmljJywgcHJvc3JjID0+ICdudW1l cmljX2RpdicgfSwKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL251bWVyaWMuaCBi L3NyYy9pbmNsdWRlL3V0aWxzL251bWVyaWMuaAppbmRleCA0M2M3NWM0MzZmLi40NTRhNTZk YTlhIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9udW1lcmljLmgKKysrIGIvc3Jj L2luY2x1ZGUvdXRpbHMvbnVtZXJpYy5oCkBAIC05Nyw2ICs5Nyw4IEBAIGV4dGVybiBOdW1l cmljIG51bWVyaWNfc3ViX29wdF9lcnJvcihOdW1lcmljIG51bTEsIE51bWVyaWMgbnVtMiwK IAkJCQkJCQkJCSBib29sICpoYXZlX2Vycm9yKTsKIGV4dGVybiBOdW1lcmljIG51bWVyaWNf bXVsX29wdF9lcnJvcihOdW1lcmljIG51bTEsIE51bWVyaWMgbnVtMiwKIAkJCQkJCQkJCSBi b29sICpoYXZlX2Vycm9yKTsKK2V4dGVybiBOdW1lcmljIG51bWVyaWNfbXVsX3BhdGNoZWRf b3B0X2Vycm9yKE51bWVyaWMgbnVtMSwgTnVtZXJpYyBudW0yLAorCQkJCQkJCQkJIGludDMy IHJzY2FsZV9hZGp1c3RtZW50LCBib29sICpoYXZlX2Vycm9yKTsKIGV4dGVybiBOdW1lcmlj IG51bWVyaWNfZGl2X29wdF9lcnJvcihOdW1lcmljIG51bTEsIE51bWVyaWMgbnVtMiwKIAkJ CQkJCQkJCSBib29sICpoYXZlX2Vycm9yKTsKIGV4dGVybiBOdW1lcmljIG51bWVyaWNfbW9k X29wdF9lcnJvcihOdW1lcmljIG51bTEsIE51bWVyaWMgbnVtMiwKZGlmZiAtLWdpdCBhL3Rl c3QtbXVsLXZhci5zcWwgYi90ZXN0LW11bC12YXIuc3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAuLmVlN2UzODU1YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0 LW11bC12YXIuc3FsCkBAIC0wLDAgKzEsNDggQEAKK0NSRUFURSBUQUJMRSB0ZXN0X251bWVy aWNfbXVsX3BhdGNoZWQgKAorICB2YXIxIG51bWVyaWMsCisgIHZhcjIgbnVtZXJpYywKKyAg cnNjYWxlX2FkanVzdG1lbnQgaW50LAorICByZXN1bHQgbnVtZXJpYworKTsKKworRE8gJCQK K0RFQ0xBUkUKK3ZhcjEgbnVtZXJpYzsKK3ZhcjIgbnVtZXJpYzsKK0JFR0lOCisgIEZPUiBp IElOIDEuLjEwMCBMT09QCisgICAgUkFJU0UgTk9USUNFICclJywgaTsKKyAgICBGT1IgdmFy MW5kaWdpdHMgSU4gMS4uNCBMT09QCisgICAgICBGT1IgdmFyMm5kaWdpdHMgSU4gMS4uNCBM T09QCisgICAgICAgIEZPUiB2YXIxZHNjYWxlIElOIDAuLih2YXIxbmRpZ2l0cyo0KSBMT09Q CisgICAgICAgICAgRk9SIHZhcjJkc2NhbGUgSU4gMC4uKHZhcjJuZGlnaXRzKjQpIExPT1AK KyAgICAgICAgICAgIEZPUiByc2NhbGVfYWRqdXN0bWVudCBJTiAwLi4odmFyMWRzY2FsZSt2 YXIyZHNjYWxlKSBMT09QCisgICAgICAgICAgICAgIHZhcjEgOj0gcm91bmQocmFuZG9tKAor ICAgICAgICAgICAgICAgIGZvcm1hdCgnMSVzJyxyZXBlYXQoJzAnLCh2YXIxbmRpZ2l0cy0x KSo0LTEpKTo6bnVtZXJpYywKKyAgICAgICAgICAgICAgICBmb3JtYXQoJyVzJyxyZXBlYXQo JzknLHZhcjFuZGlnaXRzKjQpKTo6bnVtZXJpYworICAgICAgICAgICAgICApIC8gMTA6Om51 bWVyaWNedmFyMWRzY2FsZSwgdmFyMWRzY2FsZSk7CisgICAgICAgICAgICAgIHZhcjIgOj0g cm91bmQocmFuZG9tKAorICAgICAgICAgICAgICAgIGZvcm1hdCgnMSVzJyxyZXBlYXQoJzAn LCh2YXIybmRpZ2l0cy0xKSo0LTEpKTo6bnVtZXJpYywKKyAgICAgICAgICAgICAgICBmb3Jt YXQoJyVzJyxyZXBlYXQoJzknLHZhcjJuZGlnaXRzKjQpKTo6bnVtZXJpYworICAgICAgICAg ICAgICApIC8gMTA6Om51bWVyaWNedmFyMmRzY2FsZSwgdmFyMmRzY2FsZSk7CisgICAgICAg ICAgICAgIElOU0VSVCBJTlRPIHRlc3RfbnVtZXJpY19tdWxfcGF0Y2hlZAorICAgICAgICAg ICAgICAgICh2YXIxLCB2YXIyLCByc2NhbGVfYWRqdXN0bWVudCkKKyAgICAgICAgICAgICAg VkFMVUVTCisgICAgICAgICAgICAgICAgKHZhcjEsIHZhcjIsIC1yc2NhbGVfYWRqdXN0bWVu dCk7CisgICAgICAgICAgICBFTkQgTE9PUDsKKyAgICAgICAgICBFTkQgTE9PUDsKKyAgICAg ICAgRU5EIExPT1A7CisgICAgICBFTkQgTE9PUDsKKyAgICBFTkQgTE9PUDsKKyAgRU5EIExP T1A7CitFTkQgJCQ7CisKKy0tIEZpcnN0LCBzZXQgcmVzdWx0IHdpdGggYSBudW1lcmljX211 bF9wYXRjaGVkKCkgdmVyc2lvbiB3aGVyZQorLS0gdGhlIFNpbXBsaWZpZWQgZmFzdC1wYXRo IGNvbXB1dGF0aW9uIGNvZGUgaGFzIGJlZW4gY29tbWVudGVkIG91dC4KK1VQREFURSB0ZXN0 X251bWVyaWNfbXVsX3BhdGNoZWQgU0VUIHJlc3VsdCA9IG51bWVyaWNfbXVsX3BhdGNoZWQo dmFyMSwgdmFyMiwgcnNjYWxlX2FkanVzdG1lbnQpOworCistLSBUaGVuLCByZWNvbXBpbGUg d2l0aCB0aGUgU2ltcGxpZmllZCBmYXN0LXBhdGggY29tcHV0YXRpb24gY29kZSwKKy0tIGFu ZCBjaGVjayBpZiBhbnkgZGlmZmVyZW5jZXMgY2FuIGJlIGZvdW5kOgorU0VMRUNUICosIG51 bWVyaWNfbXVsX3BhdGNoZWQodmFyMSx2YXIyLHJzY2FsZV9hZGp1c3RtZW50KQorRlJPTSB0 ZXN0X251bWVyaWNfbXVsX3BhdGNoZWQKK1dIRVJFIHJlc3VsdCBJUyBESVNUSU5DVCBGUk9N IG51bWVyaWNfbXVsX3BhdGNoZWQodmFyMSx2YXIyLHJzY2FsZV9hZGp1c3RtZW50KTsKLS0g CjIuNDUuMQoK --84d683e9ac184bad811253c2e5f6040a--