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 1s1Klb-00BNjI-DS for pgsql-hackers@arkaria.postgresql.org; Mon, 29 Apr 2024 06:45:36 +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 1s1KlY-00FYdQ-WD for pgsql-hackers@arkaria.postgresql.org; Mon, 29 Apr 2024 06:45:33 +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 1s1KlY-00FYdI-JZ for pgsql-hackers@lists.postgresql.org; Mon, 29 Apr 2024 06:45:33 +0000 Received: from fhigh4-smtp.messagingengine.com ([103.168.172.155]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1s1KlW-000dB0-8b for pgsql-hackers@postgresql.org; Mon, 29 Apr 2024 06:45:32 +0000 Received: from compute6.internal (compute6.nyi.internal [10.202.2.47]) by mailfhigh.nyi.internal (Postfix) with ESMTP id 25DC3114010D for ; Mon, 29 Apr 2024 02:45:28 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute6.internal (MEProxy); Mon, 29 Apr 2024 02:45:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=eisentraut.org; h=cc:content-type:content-type:date:date:from:from:in-reply-to :message-id:mime-version:reply-to:subject:subject:to:to; s=fm2; t=1714373128; x=1714459528; bh=NKRRG1/M2IVdWk6PTlZAJbtfxrO9f1cN APZW6AQP0sc=; b=rtuXlQrJKbTdGn8PZumqulkktwh3qBkLrG9WB9K5ec3xknGw wbrjZFbaHnPZrjgxGxb6UdJKa2toy1Ff+SUle9r7/8gBU1FoB7LF5LBnfpWk497S ckGXh+IwOZQa5S3gjOm6gPApzVAXphWX2XslD1Ov3AaIUxZhPxIczTMY1mS7AIyx /4iEGjKLRVbKquICVAcph5SdoA3UX4vEmN4zkbzjnxI4vNSJOcMlbrEtKTHz+rFc CHWExT3V3QUf/IhbMBiD/CS+fO4FRZL2vB5md8anIKHMhuUkD2+SrCWIyVran2kR EuFRzRwUpl7RfBjMklpXj/ODAesF4EydGWBFuw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:message-id :mime-version:reply-to:subject:subject:to:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t= 1714373128; x=1714459528; bh=NKRRG1/M2IVdWk6PTlZAJbtfxrO9f1cNAPZ W6AQP0sc=; b=bHDOWHveRO+NaF5gvNlyTS2XN1JRnTXevH5SDpVxjCqGRXlwQsp fzjObIOXoCg2WUs0LK4MjJem+bflWkDNO46skhUjYtNHA0YsK1duu+ibRewEGdh6 SGqPFU5bgg/6A5rbgjYjT5vhkv7zS2EfWl1/8UZ8x67Se4OtYfumIc8Bwt5k0Ovx KlRcDPOhrdqNJY3Xz8BMCKjU5YGvrI7KwDiJb4G+D0CbcL693cGha75GV3mKTP9B IuflqMgE5Q4q5T4JCr2xz5psceS82+6W0lnJav39bPlX2Ltmrh0J3fbBGhrfenkh 7RdPSApi/uM2QzOpTzJTsWyEatHuxyK5ZKA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvledrvddutddgtdejucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpegtkfffgggfhffuvfesmhdtreertd dvjeenucfhrhhomheprfgvthgvrhcugfhishgvnhhtrhgruhhtuceophgvthgvrhesvghi shgvnhhtrhgruhhtrdhorhhgqeenucggtffrrghtthgvrhhnpeehteekudegtdehtedtte fhudekjefgudeiheeiteffuedtteffkeekgfelvdffleenucevlhhushhtvghrufhiiigv pedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehpvghtvghrsegvihhsvghnthhrrghuth drohhrgh X-ME-Proxy: Feedback-ID: ie0a040ee:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Mon, 29 Apr 2024 02:45:27 -0400 (EDT) Content-Type: multipart/mixed; boundary="------------s3jhLUeQPf13dDsI6l5Xje7Z" Message-ID: <700d2e86-bf75-4607-9cf2-f5b7802f6e88@eisentraut.org> Date: Mon, 29 Apr 2024 08:45:26 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Peter Eisentraut Subject: Support LIKE with nondeterministic collations To: pgsql-hackers List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------s3jhLUeQPf13dDsI6l5Xje7Z Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit This patch adds support for using LIKE with nondeterministic collations. So you can do things such as col LIKE 'foo%' COLLATE case_insensitive This currently results in a "not supported" error. The reason for that is that when I first developed support for nondeterministic collations, I didn't know what the semantics of that should be, especially since with nondeterministic collations, strings of different lengths could be equal, and then dropped the issue for a while. After further research, the SQL standard's definition of the LIKE predicate actually provides a clear definition of the semantics: The pattern is partitioned into substrings at wildcard characters (so 'foo%bar' is partitioned into 'foo', '%', 'bar') and then then whole predicate matches if a match can be found for each partition under the applicable collation (so for 'foo%bar' we look to partition the input string into s1 || s2 || s3 such that s1 = 'foo', s2 is anything, and s3 = 'bar'.) The only difference to deterministic collations is that for deterministic collations we can optimize this by matching by character, but for nondeterministic collations we have to go by substring. --------------s3jhLUeQPf13dDsI6l5Xje7Z Content-Type: text/plain; charset=UTF-8; name="v1-0001-Support-LIKE-with-nondeterministic-collations.patch" Content-Disposition: attachment; filename*0="v1-0001-Support-LIKE-with-nondeterministic-collations.patch" Content-Transfer-Encoding: base64 RnJvbSAzZjZiNTg0YTBmMzRjYWJlY2FjNjlmM2NmZDY2M2RhZGZkMzRmNDY0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogTW9uLCAyOSBBcHIgMjAyNCAwNzo1ODoyMCArMDIwMApTdWJqZWN0 OiBbUEFUQ0ggdjFdIFN1cHBvcnQgTElLRSB3aXRoIG5vbmRldGVybWluaXN0aWMgY29sbGF0 aW9ucwoKVGhpcyBhbGxvd3MgZm9yIGV4YW1wbGUgdXNpbmcgTElLRSB3aXRoIGNhc2UtaW5z ZW5zaXRpdmUgY29sbGF0aW9ucy4KVGhlcmUgd2FzIHByZXZpb3VzbHkgbm8gaW50ZXJuYWwg aW1wbGVtZW50YXRpb24gb2YgdGhpcywgc28gaXQgd2FzIG1ldAp3aXRoIGEgbm90LXN1cHBv cnRlZCBlcnJvci4gIFRoaXMgYWRkcyB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gYW5k CnJlbW92ZXMgdGhlIGVycm9yLgoKVW5saWtlIHdpdGggZGV0ZXJtaW5pc3RpYyBjb2xsYXRp b25zLCB0aGUgTElLRSBtYXRjaGluZyBjYW5ub3QgZ28KY2hhcmFjdGVyIGJ5IGNoYXJhY3Rl ciBidXQgaGFzIHRvIGdvIHN1YnN0cmluZyBieSBzdWJzdHJpbmcuICBGb3IKZXhhbXBsZSwg aWYgd2UgYXJlIG1hdGNoaW5nIGFnYWluc3QgTElLRSAnZm9vJWJhcicsIHdlIGNhbid0IHN0 YXJ0IGJ5Cmxvb2tpbmcgZm9yIGFuICdmJywgdGhlbiBhbiAnbycsIGJ1dCBpbnN0ZWFkIHdp dGggaGF2ZSB0byBmaW5kCnNvbWV0aGluZyB0aGF0IG1hdGNoZXMgJ2ZvbycuICBUaGlzIGlz IGJlY2F1c2UgdGhlIGNvbGxhdGlvbiBjb3VsZApjb25zaWRlciBzdWJzdHJpbmdzIG9mIGRp ZmZlcmVudCBsZW5ndGhzIHRvIGJlIGVxdWFsLiAgVGhpcyBpcyBhbGwKaW50ZXJuYWwgdG8g TWF0Y2hUZXh0KCkgaW4gbGlrZV9tYXRjaC5jLgoKVGhlIGNoYW5nZXMgaW4gR2VuZXJpY01h dGNoVGV4dCgpIGluIGxpa2UuYyBqdXN0IHBhc3MgdGhyb3VnaCB0aGUKbG9jYWxlIGluZm9y bWF0aW9uIHRvIE1hdGNoVGV4dCgpLCB3aGljaCB3YXMgcHJldmlvdXNseSBub3QgbmVlZGVk LgpUaGlzIG1hdGNoZXMgZXhhY3RseSBHZW5lcmljX1RleHRfSUNfbGlrZSgpIGJlbG93LgoK Tm90ZSB0aGF0IElMSUtFIGlzIG5vdCBhZmZlY3RlZC4gIEl0J3MgdW5jbGVhciB3aGV0aGVy IElMSUtFIG1ha2VzCnNlbnNlIHVuZGVyIG5vbmRldGVybWluaXN0aWMgY29sbGF0aW9ucy4K ClRoaXMgYWxzbyB1cGRhdGVzIG1hdGNoX3BhdHRlcm5fcHJlZml4KCkgaW4gbGlrZV9zdXBw b3J0LmMgdG8gc3VwcG9ydApvcHRpbWl6aW5nIHRoZSBjYXNlIG9mIGFuIGV4YWN0IHBhdHRl cm4gd2l0aCBub25kZXRlcm1pbmlzdGljCmNvbGxhdGlvbnMuICBUaGlzIHdhcyBhbHJlYWR5 IGFsbHVkZWQgdG8gaW4gdGhlIHByZXZpb3VzIGNvZGUuCi0tLQogZG9jL3NyYy9zZ21sL2No YXJzZXQuc2dtbCAgICAgICAgICAgICAgICAgICAgIHwgICAyICstCiBkb2Mvc3JjL3NnbWwv ZnVuYy5zZ21sICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDcgKy0KIHNyYy9iYWNrZW5k L3V0aWxzL2FkdC9saWtlLmMgICAgICAgICAgICAgICAgICB8ICAzMCArKystLQogc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L2xpa2VfbWF0Y2guYyAgICAgICAgICAgIHwgMTE4ICsrKysrKysr KysrKysrKysrKwogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2xpa2Vfc3VwcG9ydC5jICAgICAg ICAgIHwgIDI5ICsrLS0tCiAuLi4vcmVncmVzcy9leHBlY3RlZC9jb2xsYXRlLmljdS51dGY4 Lm91dCAgICAgfCAgODEgKysrKysrKysrKy0tCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9jb2xs YXRlLmljdS51dGY4LnNxbCAgICAgfCAgMjMgKysrLQogNyBmaWxlcyBjaGFuZ2VkLCAyNTAg aW5zZXJ0aW9ucygrKSwgNDAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9z Z21sL2NoYXJzZXQuc2dtbCBiL2RvYy9zcmMvc2dtbC9jaGFyc2V0LnNnbWwKaW5kZXggZGFm NjcxZTYyMDUuLmVjN2ZmYjM2MGRkIDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvY2hhcnNl dC5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9jaGFyc2V0LnNnbWwKQEAgLTExOTcsNyArMTE5 Nyw3IEBAIDx0aXRsZT5Ob25kZXRlcm1pbmlzdGljIENvbGxhdGlvbnM8L3RpdGxlPgogICAg ICB0byBhIHBlcmZvcm1hbmNlIHBlbmFsdHkuICBOb3RlLCBpbiBwYXJ0aWN1bGFyLCB0aGF0 IEItdHJlZSBjYW5ub3QgdXNlCiAgICAgIGRlZHVwbGljYXRpb24gd2l0aCBpbmRleGVzIHRo YXQgdXNlIGEgbm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb24uICBBbHNvLAogICAgICBjZXJ0 YWluIG9wZXJhdGlvbnMgYXJlIG5vdCBwb3NzaWJsZSB3aXRoIG5vbmRldGVybWluaXN0aWMg Y29sbGF0aW9ucywKLSAgICAgc3VjaCBhcyBwYXR0ZXJuIG1hdGNoaW5nIG9wZXJhdGlvbnMu ICBUaGVyZWZvcmUsIHRoZXkgc2hvdWxkIGJlIHVzZWQKKyAgICAgc3VjaCBhcyBzb21lIHBh dHRlcm4gbWF0Y2hpbmcgb3BlcmF0aW9ucy4gIFRoZXJlZm9yZSwgdGhleSBzaG91bGQgYmUg dXNlZAogICAgICBvbmx5IGluIGNhc2VzIHdoZXJlIHRoZXkgYXJlIHNwZWNpZmljYWxseSB3 YW50ZWQuCiAgICAgPC9wYXJhPgogCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvZnVuYy5z Z21sIGIvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbAppbmRleCAxOTI4ZGU1NzYyMy4uNjE4MWNj NjQ3MTIgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwKKysrIGIvZG9jL3Ny Yy9zZ21sL2Z1bmMuc2dtbApAQCAtNTM3NCw5ICs1Mzc0LDEwIEBAIDx0aXRsZT5QYXR0ZXJu IE1hdGNoaW5nPC90aXRsZT4KICAgIDwvY2F1dGlvbj4KIAogICAgPHBhcmE+Ci0gICAgVGhl IHBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0b3JzIG9mIGFsbCB0aHJlZSBraW5kcyBkbyBub3Qg c3VwcG9ydAotICAgIG5vbmRldGVybWluaXN0aWMgY29sbGF0aW9ucy4gIElmIHJlcXVpcmVk LCBhcHBseSBhIGRpZmZlcmVudCBjb2xsYXRpb24gdG8KLSAgICB0aGUgZXhwcmVzc2lvbiB0 byB3b3JrIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24uCisgICAgPGZ1bmN0aW9uPlNJTUlMQVIg VE88L2Z1bmN0aW9uPiBhbmQgPGFjcm9ueW0+UE9TSVg8L2Fjcm9ueW0+LXN0eWxlIHJlZ3Vs YXIKKyAgICBleHByZXNzaW9ucyBkbyBub3Qgc3VwcG9ydCBub25kZXRlcm1pbmlzdGljIGNv bGxhdGlvbnMuICBJZiByZXF1aXJlZCwgdXNlCisgICAgPGZ1bmN0aW9uPkxJS0U8L2Z1bmN0 aW9uPiBvciBhcHBseSBhIGRpZmZlcmVudCBjb2xsYXRpb24gdG8gdGhlIGV4cHJlc3Npb24K KyAgICB0byB3b3JrIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24uCiAgICA8L3BhcmE+CiAKICAg PHNlY3QyIGlkPSJmdW5jdGlvbnMtbGlrZSI+CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91 dGlscy9hZHQvbGlrZS5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2xpa2UuYwppbmRleCA1 N2VhZDY2YjVhYS4uYmJiZTZjMDlkMTggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxz L2FkdC9saWtlLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2xpa2UuYwpAQCAtMTQ5 LDIyICsxNDksMzIgQEAgU0JfbG93ZXJfY2hhcih1bnNpZ25lZCBjaGFyIGMsIHBnX2xvY2Fs ZV90IGxvY2FsZSwgYm9vbCBsb2NhbGVfaXNfYykKIHN0YXRpYyBpbmxpbmUgaW50CiBHZW5l cmljTWF0Y2hUZXh0KGNvbnN0IGNoYXIgKnMsIGludCBzbGVuLCBjb25zdCBjaGFyICpwLCBp bnQgcGxlbiwgT2lkIGNvbGxhdGlvbikKIHsKLQlpZiAoY29sbGF0aW9uICYmICFsY19jdHlw ZV9pc19jKGNvbGxhdGlvbikpCi0JewotCQlwZ19sb2NhbGVfdCBsb2NhbGUgPSBwZ19uZXds b2NhbGVfZnJvbV9jb2xsYXRpb24oY29sbGF0aW9uKTsKKwlwZ19sb2NhbGVfdCBsb2NhbGUg PSAwOworCWJvb2wJCWxvY2FsZV9pc19jID0gZmFsc2U7CiAKLQkJaWYgKCFwZ19sb2NhbGVf ZGV0ZXJtaW5pc3RpYyhsb2NhbGUpKQotCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJKGVycmNv ZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAotCQkJCQkgZXJybXNnKCJub25k ZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIExJS0UiKSkp OworCWlmICghT2lkSXNWYWxpZChjb2xsYXRpb24pKQorCXsKKwkJLyoKKwkJICogVGhpcyB0 eXBpY2FsbHkgbWVhbnMgdGhhdCB0aGUgcGFyc2VyIGNvdWxkIG5vdCByZXNvbHZlIGEgY29u ZmxpY3QKKwkJICogb2YgaW1wbGljaXQgY29sbGF0aW9ucywgc28gcmVwb3J0IGl0IHRoYXQg d2F5LgorCQkgKi8KKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0lO REVURVJNSU5BVEVfQ09MTEFUSU9OKSwKKwkJCQkgZXJybXNnKCJjb3VsZCBub3QgZGV0ZXJt aW5lIHdoaWNoIGNvbGxhdGlvbiB0byB1c2UgZm9yIExJS0UiKSwKKwkJCQkgZXJyaGludCgi VXNlIHRoZSBDT0xMQVRFIGNsYXVzZSB0byBzZXQgdGhlIGNvbGxhdGlvbiBleHBsaWNpdGx5 LiIpKSk7CiAJfQogCisJaWYgKGxjX2N0eXBlX2lzX2MoY29sbGF0aW9uKSkKKwkJbG9jYWxl X2lzX2MgPSB0cnVlOworCWVsc2UKKwkJbG9jYWxlID0gcGdfbmV3bG9jYWxlX2Zyb21fY29s bGF0aW9uKGNvbGxhdGlvbik7CisKIAlpZiAocGdfZGF0YWJhc2VfZW5jb2RpbmdfbWF4X2xl bmd0aCgpID09IDEpCi0JCXJldHVybiBTQl9NYXRjaFRleHQocywgc2xlbiwgcCwgcGxlbiwg MCwgdHJ1ZSk7CisJCXJldHVybiBTQl9NYXRjaFRleHQocywgc2xlbiwgcCwgcGxlbiwgbG9j YWxlLCBsb2NhbGVfaXNfYyk7CiAJZWxzZSBpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09 IFBHX1VURjgpCi0JCXJldHVybiBVVEY4X01hdGNoVGV4dChzLCBzbGVuLCBwLCBwbGVuLCAw LCB0cnVlKTsKKwkJcmV0dXJuIFVURjhfTWF0Y2hUZXh0KHMsIHNsZW4sIHAsIHBsZW4sIGxv Y2FsZSwgbG9jYWxlX2lzX2MpOwogCWVsc2UKLQkJcmV0dXJuIE1CX01hdGNoVGV4dChzLCBz bGVuLCBwLCBwbGVuLCAwLCB0cnVlKTsKKwkJcmV0dXJuIE1CX01hdGNoVGV4dChzLCBzbGVu LCBwLCBwbGVuLCBsb2NhbGUsIGxvY2FsZV9pc19jKTsKIH0KIAogc3RhdGljIGlubGluZSBp bnQKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9saWtlX21hdGNoLmMgYi9z cmMvYmFja2VuZC91dGlscy9hZHQvbGlrZV9tYXRjaC5jCmluZGV4IGYyOTkwZWRmZjdlLi5l MjgyYTUwYjNiYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2xpa2VfbWF0 Y2guYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvbGlrZV9tYXRjaC5jCkBAIC0xOTgs NiArMTk4LDEyNCBAQCBNYXRjaFRleHQoY29uc3QgY2hhciAqdCwgaW50IHRsZW4sIGNvbnN0 IGNoYXIgKnAsIGludCBwbGVuLAogCQkJTmV4dEJ5dGUocCwgcGxlbik7CiAJCQljb250aW51 ZTsKIAkJfQorCQllbHNlIGlmIChsb2NhbGUgJiYgIWxvY2FsZS0+ZGV0ZXJtaW5pc3RpYykK KwkJeworCQkJLyoKKwkJCSAqIEZvciBub25kZXRlcm1pbmlzdGljIGxvY2FsZXMsIHdlIGZp bmQgdGhlIG5leHQgc3Vic3RyaW5nIG9mIHRoZQorCQkJICogcGF0dGVybiB0aGF0IGRvZXMg bm90IGNvbnRhaW4gd2lsZGNhcmRzIGFuZCB0cnkgdG8gZmluZCBhCisJCQkgKiBtYXRjaGlu ZyBzdWJzdHJpbmcgaW4gdGhlIHRleHQuICBDcnVjaWFsbHksIHdlIGNhbm5vdCBkbyB0aGlz CisJCQkgKiBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLCBhcyBpbiB0aGUgbm9ybWFsIGNhc2Us IGJ1dCBtdXN0IGRvIGl0CisJCQkgKiBzdWJzdHJpbmcgYnkgc3Vic3RyaW5nLCBwYXJ0aXRp b25lZCBieSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVycy4KKwkJCSAqLworCQkJY29uc3QgY2hh ciAqcDE7CisJCQlzaXplX3QJCXAxbGVuOworCQkJY29uc3QgY2hhciAqdDE7CisJCQlzaXpl X3QJCXQxbGVuOworCQkJYm9vbAkJZm91bmRfZXNjYXBlOworCQkJY29uc3QgY2hhciAqc3Vi cGF0OworCQkJc2l6ZV90CQlzdWJwYXRsZW47CisJCQljaGFyCSAgICpidWYgPSBOVUxMOwor CisJCQkvKgorCQkJICogRGV0ZXJtaW5lIG5leHQgc3Vic3RyaW5nIG9mIHBhdHRlcm4gd2l0 aG91dCB3aWxkY2FyZHMuICBwIGlzCisJCQkgKiB0aGUgc3RhcnQgb2YgdGhlIHN1YnBhdHRl cm4sIHAxIGlzIG9uZSBwYXN0IHRoZSBsYXN0IGJ5dGUuIEFsc28KKwkJCSAqIHRyYWNrIGlm IHdlIGZvdW5kIGFuIGVzY2FwZSBjaGFyYWN0ZXIuCisJCQkgKi8KKwkJCXAxID0gcDsKKwkJ CXAxbGVuID0gcGxlbjsKKwkJCWZvdW5kX2VzY2FwZSA9IGZhbHNlOworCQkJd2hpbGUgKHAx bGVuID4gMCkKKwkJCXsKKwkJCQlpZiAoKnAxID09ICdcXCcpCisJCQkJeworCQkJCQlmb3Vu ZF9lc2NhcGUgPSB0cnVlOworCQkJCQlOZXh0Qnl0ZShwMSwgcDFsZW4pOworCQkJCX0KKwkJ CQllbHNlIGlmICgqcDEgPT0gJ18nIHx8ICpwMSA9PSAnJScpCisJCQkJCWJyZWFrOworCQkJ CU5leHRCeXRlKHAxLCBwMWxlbik7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBmb3Vu ZCBhbiBlc2NhcGUgY2hhcmFjdGVyLCB0aGVuIG1ha2UgYW4gdW5lc2NhcGVkIGNvcHkgb2YK KwkJCSAqIHRoZSBzdWJwYXR0ZXJuLgorCQkJICovCisJCQlpZiAoZm91bmRfZXNjYXBlKQor CQkJeworCQkJCWNoYXIJICAgKmI7CisKKwkJCQliID0gYnVmID0gcGFsbG9jKHAxIC0gcCk7 CisJCQkJZm9yIChjb25zdCBjaGFyICpjID0gcDsgYyA8IHAxOyBjKyspCisJCQkJeworCQkJ CQlpZiAoKmMgPT0gJ1xcJykKKwkJCQkJCTsKKwkJCQkJZWxzZQorCQkJCQkJKihiKyspID0g KmM7CisJCQkJfQorCisJCQkJc3VicGF0ID0gYnVmOworCQkJCXN1YnBhdGxlbiA9IGIgLSBi dWY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3VicGF0ID0gcDsKKwkJCQlzdWJwYXRs ZW4gPSBwMSAtIHA7CisJCQl9CisKKwkJCS8qCisJCQkgKiBOb3cgYnVpbGQgYSBzdWJzdHJp bmcgb2YgdGhlIHRleHQgYW5kIHRyeSB0byBtYXRjaCBpdCBhZ2FpbnN0CisJCQkgKiB0aGUg c3VicGF0dGVybi4gIHQgaXMgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0LCB0MSBpcyBvbmUgcGFz dCB0aGUKKwkJCSAqIGxhc3QgYnl0ZS4gIFdlIHN0YXJ0IHdpdGggYSB6ZXJvLWxlbmd0aCBz dHJpbmcuCisJCQkgKi8KKwkJCXQxID0gdDsKKwkJCXQxbGVuID0gdGxlbjsKKwkJCWZvciAo OzspCisJCQl7CisJCQkJaW50CQkJY21wOworCisJCQkJY21wID0gcGdfc3RybmNvbGwoc3Vi cGF0LCBzdWJwYXRsZW4sIHQsICh0MSAtIHQpLCBsb2NhbGUpOworCisJCQkJLyoKKwkJCQkg KiBJZiB3ZSBmb3VuZCBhIG1hdGNoLCB3ZSBoYXZlIHRvIHRlc3QgaWYgdGhlIHJlc3Qgb2Yg cGF0dGVybgorCQkJCSAqIGNhbiBtYXRjaCBhZ2FpbnN0IHRoZSByZXN0IG9mIHRoZSBzdHJp bmcuICBPdGhlcndpc2Ugd2UKKwkJCQkgKiBoYXZlIHRvIGNvbnRpbnVlIGhlcmUgdHJ5IG1h dGNoaW5nIHdpdGggYSBsb25nZXIgc3Vic3RyaW5nLgorCQkJCSAqIChUaGlzIGlzIHNpbWls YXIgdG8gdGhlIHJlY3Vyc2lvbiBmb3IgdGhlICclJyB3aWxkY2FyZAorCQkJCSAqIGFib3Zl LikKKwkJCQkgKgorCQkJCSAqIE5vdGUgdGhhdCB3ZSBjYW4ndCBqdXN0IHdpbmQgZm9yd2Fy ZCBwIGFuZCB0IGFuZCBjb250aW51ZQorCQkJCSAqIHdpdGggdGhlIG1haW4gbG9vcC4gIFRo aXMgd291bGQgZmFpbCBmb3IgZXhhbXBsZSB3aXRoCisJCQkJICoKKwkJCQkgKiBVJidcMDA2 MVwwMzA4YmMnIExJS0UgVSYnXDAwRTRfYycgQ09MTEFURSBpZ25vcmVfYWNjZW50cworCQkJ CSAqCisJCQkJICogWW91J2QgZmluZCB0aGF0IHQ9XDAwNjEgbWF0Y2hlcyBwPVwwMEU0LCBi dXQgdGhlbiB0aGUgcmVzdAorCQkJCSAqIHdvbid0IG1hdGNoOyBidXQgdD1cMDA2MVwwMzA4 IGFsc28gbWF0Y2hlcyBwPVwwMEU0LCBhbmQKKwkJCQkgKiB0aGVuIHRoZSByZXN0IHdpbGwg bWF0Y2guCisJCQkJICovCisJCQkJaWYgKGNtcCA9PSAwKQorCQkJCXsKKwkJCQkJaW50CQkJ bWF0Y2hlZCA9IE1hdGNoVGV4dCh0MSwgdDFsZW4sIHAxLCBwMWxlbiwgbG9jYWxlLCBsb2Nh bGVfaXNfYyk7CisKKwkJCQkJaWYgKG1hdGNoZWQgIT0gTElLRV9GQUxTRSkKKwkJCQkJewor CQkJCQkJaWYgKGJ1ZikKKwkJCQkJCQlwZnJlZShidWYpOworCQkJCQkJcmV0dXJuIG1hdGNo ZWQ7IC8qIFRSVUUgb3IgQUJPUlQgKi8KKwkJCQkJfQorCQkJCX0KKworCQkJCS8qCisJCQkJ ICogRGlkbid0IG1hdGNoLiAgSWYgd2UgdXNlZCB1cCB0aGUgd2hvbGUgdGV4dCwgdGhlbiB0 aGUgbWF0Y2gKKwkJCQkgKiBmYWlscy4gIE90aGVyd2lzZSwgdHJ5IGFnYWluIHdpdGggYSBs b25nZXIgc3Vic3RyaW5nLgorCQkJCSAqLworCQkJCWlmICh0MWxlbiA9PSAwKQorCQkJCQly ZXR1cm4gTElLRV9GQUxTRTsKKwkJCQllbHNlCisJCQkJCU5leHRDaGFyKHQxLCB0MWxlbik7 CisJCQl9CisJCQlpZiAoYnVmKQorCQkJCXBmcmVlKGJ1Zik7CisJCQljb250aW51ZTsKKwkJ fQogCQllbHNlIGlmIChHRVRDSEFSKCpwKSAhPSBHRVRDSEFSKCp0KSkKIAkJewogCQkJLyog bm9uLXdpbGRjYXJkIHBhdHRlcm4gY2hhciBmYWlscyB0byBtYXRjaCB0ZXh0IGNoYXIgKi8K ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9saWtlX3N1cHBvcnQuYyBiL3Ny Yy9iYWNrZW5kL3V0aWxzL2FkdC9saWtlX3N1cHBvcnQuYwppbmRleCAyNjM1MDUwODYxZi4u M2M2OTFhNWNjOTUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9saWtlX3N1 cHBvcnQuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvbGlrZV9zdXBwb3J0LmMKQEAg LTI3MiwyMiArMjcyLDYgQEAgbWF0Y2hfcGF0dGVybl9wcmVmaXgoTm9kZSAqbGVmdG9wLAog CQlyZXR1cm4gTklMOwogCXBhdHQgPSAoQ29uc3QgKikgcmlnaHRvcDsKIAotCS8qCi0JICog Tm90IHN1cHBvcnRlZCBpZiB0aGUgZXhwcmVzc2lvbiBjb2xsYXRpb24gaXMgbm9uZGV0ZXJt aW5pc3RpYy4gIFRoZQotCSAqIG9wdGltaXplZCBlcXVhbGl0eSBvciBwcmVmaXggdGVzdHMg dXNlIGJ5dGV3aXNlIGNvbXBhcmlzb25zLCB3aGljaCBpcwotCSAqIG5vdCBjb25zaXN0ZW50 IHdpdGggbm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zLiAgVGhlIGFjdHVhbAotCSAqIHBh dHRlcm4tbWF0Y2hpbmcgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zIHdpbGwgbGF0ZXIgZXJy b3Igb3V0IHRoYXQKLQkgKiBwYXR0ZXJuLW1hdGNoaW5nIGlzIG5vdCBzdXBwb3J0ZWQgd2l0 aCBub25kZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMuIChXZQotCSAqIGNvdWxkIGFsc28gZXJy b3Igb3V0IGhlcmUsIGJ1dCBieSBkb2luZyBpdCBsYXRlciB3ZSBnZXQgbW9yZSBwcmVjaXNl Ci0JICogZXJyb3IgbWVzc2FnZXMuKSAgKEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBzdXBw b3J0IGF0IGxlYXN0Ci0JICogUGF0dGVybl9QcmVmaXhfRXhhY3QsIGJ1dCBubyBwb2ludCBh cyBsb25nIGFzIHRoZSBhY3R1YWwKLQkgKiBwYXR0ZXJuLW1hdGNoaW5nIGltcGxlbWVudGF0 aW9ucyBkb24ndCBzdXBwb3J0IGl0LikKLQkgKgotCSAqIGV4cHJfY29sbCBpcyBub3Qgc2V0 IGZvciBhIG5vbi1jb2xsYXRpb24tYXdhcmUgZGF0YSB0eXBlIHN1Y2ggYXMgYnl0ZWEuCi0J ICovCi0JaWYgKGV4cHJfY29sbCAmJiAhZ2V0X2NvbGxhdGlvbl9pc2RldGVybWluaXN0aWMo ZXhwcl9jb2xsKSkKLQkJcmV0dXJuIE5JTDsKLQogCS8qCiAJICogVHJ5IHRvIGV4dHJhY3Qg YSBmaXhlZCBwcmVmaXggZnJvbSB0aGUgcGF0dGVybi4KIAkgKi8KQEAgLTQwNCw2ICszODgs OCBAQCBtYXRjaF9wYXR0ZXJuX3ByZWZpeChOb2RlICpsZWZ0b3AsCiAJewogCQlpZiAoIW9w X2luX29wZmFtaWx5KGVxb3ByLCBvcGZhbWlseSkpCiAJCQlyZXR1cm4gTklMOworCQlpZiAo aW5kZXhjb2xsYXRpb24gIT0gZXhwcl9jb2xsKQorCQkJcmV0dXJuIE5JTDsKIAkJZXhwciA9 IG1ha2Vfb3BjbGF1c2UoZXFvcHIsIEJPT0xPSUQsIGZhbHNlLAogCQkJCQkJCSAoRXhwciAq KSBsZWZ0b3AsIChFeHByICopIHByZWZpeCwKIAkJCQkJCQkgSW52YWxpZE9pZCwgaW5kZXhj b2xsYXRpb24pOwpAQCAtNDExLDYgKzM5NywxNyBAQCBtYXRjaF9wYXR0ZXJuX3ByZWZpeChO b2RlICpsZWZ0b3AsCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCisJLyoKKwkgKiBBbnl0aGlu ZyBvdGhlciB0aGFuIFBhdHRlcm5fUHJlZml4X0V4YWN0IGlzIG5vdCBzdXBwb3J0ZWQgaWYg dGhlCisJICogZXhwcmVzc2lvbiBjb2xsYXRpb24gaXMgbm9uZGV0ZXJtaW5pc3RpYy4gIFRo ZSBvcHRpbWl6ZWQgZXF1YWxpdHkgb3IKKwkgKiBwcmVmaXggdGVzdHMgdXNlIGJ5dGV3aXNl IGNvbXBhcmlzb25zLCB3aGljaCBpcyBub3QgY29uc2lzdGVudCB3aXRoCisJICogbm9uZGV0 ZXJtaW5pc3RpYyBjb2xsYXRpb25zLgorCSAqCisJICogZXhwcl9jb2xsIGlzIG5vdCBzZXQg Zm9yIGEgbm9uLWNvbGxhdGlvbi1hd2FyZSBkYXRhIHR5cGUgc3VjaCBhcyBieXRlYS4KKwkg Ki8KKwlpZiAoZXhwcl9jb2xsICYmICFnZXRfY29sbGF0aW9uX2lzZGV0ZXJtaW5pc3RpYyhl eHByX2NvbGwpKQorCQlyZXR1cm4gTklMOworCiAJLyoKIAkgKiBPdGhlcndpc2UsIHdlIGhh dmUgYSBub25lbXB0eSByZXF1aXJlZCBwcmVmaXggb2YgdGhlIHZhbHVlcy4gIFNvbWUKIAkg KiBvcGNsYXNzZXMgc3VwcG9ydCBwcmVmaXggY2hlY2tzIGRpcmVjdGx5LCBvdGhlcndpc2Ug d2UnbGwgdHJ5IHRvCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2Nv bGxhdGUuaWN1LnV0Zjgub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jb2xsYXRl LmljdS51dGY4Lm91dAppbmRleCA0YjhjOGYxNDNmMy4uNmE0NTA5YWViNDYgMTAwNjQ0Ci0t LSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY29sbGF0ZS5pY3UudXRmOC5vdXQKKysr IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jb2xsYXRlLmljdS51dGY4Lm91dApAQCAt MTI3Miw2ICsxMjcyLDMwIEBAIENSRUFURSBDT0xMQVRJT04gY3Rlc3RfZGV0IChwcm92aWRl ciA9IGljdSwgbG9jYWxlID0gJycsIGRldGVybWluaXN0aWMgPSB0cnVlKTsKIE5PVElDRTog IHVzaW5nIHN0YW5kYXJkIGZvcm0gInVuZCIgZm9yIElDVSBsb2NhbGUgIiIKIENSRUFURSBD T0xMQVRJT04gY3Rlc3Rfbm9uZGV0IChwcm92aWRlciA9IGljdSwgbG9jYWxlID0gJycsIGRl dGVybWluaXN0aWMgPSBmYWxzZSk7CiBOT1RJQ0U6ICB1c2luZyBzdGFuZGFyZCBmb3JtICJ1 bmQiIGZvciBJQ1UgbG9jYWxlICIiCitTRUxFQ1QgJ2FiYycgTElLRSAnYWJjJyBDT0xMQVRF IGN0ZXN0X2RldDsKKyA/Y29sdW1uPyAKKy0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NF TEVDVCAnYWJjJyBMSUtFICdhXGJjJyBDT0xMQVRFIGN0ZXN0X2RldDsKKyA/Y29sdW1uPyAK Ky0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCAnYWJjJyBMSUtFICdhYmMnIENP TExBVEUgY3Rlc3Rfbm9uZGV0OworID9jb2x1bW4/IAorLS0tLS0tLS0tLQorIHQKKygxIHJv dykKKworU0VMRUNUICdhYmMnIExJS0UgJ2FcYmMnIENPTExBVEUgY3Rlc3Rfbm9uZGV0Owor ID9jb2x1bW4/IAorLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKwogQ1JFQVRFIFRBQkxFIHRl c3Q2IChhIGludCwgYiB0ZXh0KTsKIC0tIHNhbWUgc3RyaW5nIGluIGRpZmZlcmVudCBub3Jt YWwgZm9ybXMKIElOU0VSVCBJTlRPIHRlc3Q2IFZBTFVFUyAoMSwgVSYnXDAwRTRiYycpOwpA QCAtMTI5Niw2ICsxMzIwLDE5IEBAIFNFTEVDVCAqIEZST00gdGVzdDYgV0hFUkUgYiA9ICfD pGJjJyBDT0xMQVRFIGN0ZXN0X25vbmRldDsKICAyIHwgYcyIYmMKICgyIHJvd3MpCiAKK1NF TEVDVCAqIEZST00gdGVzdDYgV0hFUkUgYiBMSUtFICfDpGJjJyBDT0xMQVRFIGN0ZXN0X2Rl dDsKKyBhIHwgIGIgIAorLS0tKy0tLS0tCisgMSB8IMOkYmMKKygxIHJvdykKKworU0VMRUNU ICogRlJPTSB0ZXN0NiBXSEVSRSBiIExJS0UgJ8OkYmMnIENPTExBVEUgY3Rlc3Rfbm9uZGV0 OworIGEgfCAgYiAgCistLS0rLS0tLS0KKyAxIHwgw6RiYworIDIgfCBhzIhiYworKDIgcm93 cykKKwogLS0gc2FtZSB3aXRoIGFycmF5cwogQ1JFQVRFIFRBQkxFIHRlc3Q2YSAoYSBpbnQs IGIgdGV4dFtdKTsKIElOU0VSVCBJTlRPIHRlc3Q2YSBWQUxVRVMgKDEsIEFSUkFZW1UmJ1ww MEU0YmMnXSk7CkBAIC0xNTEyLDcgKzE1NDksMTIgQEAgU0VMRUNUIHggRlJPTSB0ZXN0M2Np IFdIRVJFIHggPD4gJ2FiYyc7CiAoMiByb3dzKQogCiBTRUxFQ1QgeCBGUk9NIHRlc3QzY2kg V0hFUkUgeCBMSUtFICdhJSc7Ci1FUlJPUjogIG5vbmRldGVybWluaXN0aWMgY29sbGF0aW9u cyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgTElLRQorICB4ICAKKy0tLS0tCisgYWJjCisgQUJD CisoMiByb3dzKQorCiBTRUxFQ1QgeCBGUk9NIHRlc3QzY2kgV0hFUkUgeCBJTElLRSAnYSUn OwogRVJST1I6ICBub25kZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMgYXJlIG5vdCBzdXBwb3J0 ZWQgZm9yIElMSUtFCiBTRUxFQ1QgeCBGUk9NIHRlc3QzY2kgV0hFUkUgeCBTSU1JTEFSIFRP ICdhJSc7CkBAIC0xNjMwLDcgKzE2NzIsMTIgQEAgU0VMRUNUIHggRlJPTSB0ZXN0M2JwY2kg V0hFUkUgeCA8PiAnYWJjJzsKICgyIHJvd3MpCiAKIFNFTEVDVCB4IEZST00gdGVzdDNicGNp IFdIRVJFIHggTElLRSAnYSUnOwotRVJST1I6ICBub25kZXRlcm1pbmlzdGljIGNvbGxhdGlv bnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIExJS0UKKyAgeCAgCistLS0tLQorIGFiYworIEFC QworKDIgcm93cykKKwogU0VMRUNUIHggRlJPTSB0ZXN0M2JwY2kgV0hFUkUgeCBJTElLRSAn YSUnOwogRVJST1I6ICBub25kZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMgYXJlIG5vdCBzdXBw b3J0ZWQgZm9yIElMSUtFCiBTRUxFQ1QgeCBGUk9NIHRlc3QzYnBjaSBXSEVSRSB4IFNJTUlM QVIgVE8gJ2ElJzsKQEAgLTE3MjcsNyArMTc3NCw3IEBAIFNFTEVDVCBzdHJpbmdfdG9fYXJy YXkoJ0FCQ0RFRkdISSc6OmNoYXIoOSkgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZlLCBOVUxM LCAnYicpCiAtLSBUaGlzIHRlc3RzIHRoZSBpc3N1ZSBkZXNjcmliZWQgaW4gbWF0Y2hfcGF0 dGVybl9wcmVmaXgoKS4gIEluIHRoZQogLS0gYWJzZW5jZSBvZiB0aGF0IGNoZWNrLCB0aGUg Y2FzZV9pbnNlbnNpdGl2ZSB0ZXN0cyBiZWxvdyB3b3VsZAogLS0gcmV0dXJuIG5vIHJvd3Mg d2hlcmUgdGhleSBzaG91bGQgbG9naWNhbGx5IHJldHVybiBvbmUuCi1DUkVBVEUgVEFCTEUg dGVzdDRjICh4IHRleHQgQ09MTEFURSAiQyIpOworQ1JFQVRFIFRBQkxFIHRlc3Q0YyAoeCB0 ZXh0IENPTExBVEUgY2FzZV9pbnNlbnNpdGl2ZSk7CiBJTlNFUlQgSU5UTyB0ZXN0NGMgVkFM VUVTICgnYWJjJyk7CiBDUkVBVEUgSU5ERVggT04gdGVzdDRjICh4KTsKIFNFVCBlbmFibGVf c2Vxc2NhbiA9IG9mZjsKQEAgLTE3NDEsMTAgKzE3ODgsMTggQEAgU0VMRUNUIHggRlJPTSB0 ZXN0NGMgV0hFUkUgeCBMSUtFICdBQkMlJyBDT0xMQVRFIGNhc2Vfc2Vuc2l0aXZlOyAgLS0g b2ssIG5vIHJvd3MKIC0tLQogKDAgcm93cykKIAotU0VMRUNUIHggRlJPTSB0ZXN0NGMgV0hF UkUgeCBMSUtFICdBQkMnIENPTExBVEUgY2FzZV9pbnNlbnNpdGl2ZTsgIC0tIGVycm9yCi1F UlJPUjogIG5vbmRldGVybWluaXN0aWMgY29sbGF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBm b3IgTElLRQotU0VMRUNUIHggRlJPTSB0ZXN0NGMgV0hFUkUgeCBMSUtFICdBQkMlJyBDT0xM QVRFIGNhc2VfaW5zZW5zaXRpdmU7ICAtLSBlcnJvcgotRVJST1I6ICBub25kZXRlcm1pbmlz dGljIGNvbGxhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIExJS0UKK1NFTEVDVCB4IEZS T00gdGVzdDRjIFdIRVJFIHggTElLRSAnQUJDJyBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmU7 ICAtLSBvaworICB4ICAKKy0tLS0tCisgYWJjCisoMSByb3cpCisKK1NFTEVDVCB4IEZST00g dGVzdDRjIFdIRVJFIHggTElLRSAnQUJDJScgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZlOyAg LS0gb2sKKyAgeCAgCistLS0tLQorIGFiYworKDEgcm93KQorCiBSRVNFVCBlbmFibGVfc2Vx c2NhbjsKIC0tIFVuaWNvZGUgc3BlY2lhbCBjYXNlOiBkaWZmZXJlbnQgdmFyaWFudHMgb2Yg R3JlZWsgbG93ZXIgY2FzZSBzaWdtYS4KIC0tIEEgbmFpdmUgaW1wbGVtZW50YXRpb24gbGlr ZSBjaXRleHQgdGhhdCBqdXN0IGRvZXMgbG93ZXIoeCkgPQpAQCAtMTgzOCw2ICsxODkzLDE4 IEBAIFNFTEVDVCAqIEZST00gdGVzdDQgV0hFUkUgYiA9ICdDb3RlJyBDT0xMQVRFIGNhc2Vf aW5zZW5zaXRpdmU7CiAgMSB8IGNvdGUKICgxIHJvdykKIAorLS0gVGhpcyBpcyBhIHRyaWNr eSBvbmUuICBBIG5haXZlIGltcGxlbWVudGF0aW9uIHdvdWxkIGZpcnN0IHRlc3QKKy0tIFww MEU0IG1hdGNoZXMgXDAwNjEsIHdoaWNoIGlzIHRydWUgdW5kZXIgaWdub3JlX2FjY2VudHMs IGJ1dCB0aGVuCistLSB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHdvbid0IG1hdGNoIGFueW1v cmUuICBUaGVyZWZvcmUsIHRoZQorLS0gYWxnb3JpdGhtIGhhcyB0byB0ZXN0IHdoZXRoZXIg dGhlIHJlc3Qgb2YgdGhlIHN0cmluZyBtYXRjaGVzLCBhbmQKKy0tIGlmIG5vdCB0cnkgbWF0 Y2hpbmcgXDAwRTQgYWdhaW5zdCBhIGxvbmdlciBzdWJzdHJpbmcgbGlrZQorLS0gXDAwNjFc MDMwOCwgd2hpY2ggd2lsbCB0aGVuIHdvcmsgb3V0LgorU0VMRUNUIFUmJ1wwMDYxXDAzMDhi YycgTElLRSBVJidcMDBFNF9jJyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOworID9jb2x1bW4/ IAorLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKwogLS0gZm9yZWlnbiBrZXlzIChzaG91bGQg dXNlIGNvbGxhdGlvbiBvZiBwcmltYXJ5IGtleSkKIC0tIFBLIGlzIGNhc2Utc2Vuc2l0aXZl LCBGSyBpcyBjYXNlLWluc2Vuc2l0aXZlCiBDUkVBVEUgVEFCTEUgdGVzdDEwcGsgKHggdGV4 dCBDT0xMQVRFIGNhc2Vfc2Vuc2l0aXZlIFBSSU1BUlkgS0VZKTsKZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2NvbGxhdGUuaWN1LnV0Zjguc3FsIGIvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvY29sbGF0ZS5pY3UudXRmOC5zcWwKaW5kZXggODBmMjhhOTdkNzguLjQ4MWE5 OTVjOTk4IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jb2xsYXRlLmljdS51 dGY4LnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jb2xsYXRlLmljdS51dGY4LnNx bApAQCAtNTE0LDYgKzUxNCwxMiBAQCBDUkVBVEUgQ09MTEFUSU9OIHRlc3Rjb2xsX3J1bGVz eCAocHJvdmlkZXIgPSBpY3UsIGxvY2FsZSA9ICcnLCBydWxlcyA9ICchIXdyb25nIQogQ1JF QVRFIENPTExBVElPTiBjdGVzdF9kZXQgKHByb3ZpZGVyID0gaWN1LCBsb2NhbGUgPSAnJywg ZGV0ZXJtaW5pc3RpYyA9IHRydWUpOwogQ1JFQVRFIENPTExBVElPTiBjdGVzdF9ub25kZXQg KHByb3ZpZGVyID0gaWN1LCBsb2NhbGUgPSAnJywgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlKTsK IAorU0VMRUNUICdhYmMnIExJS0UgJ2FiYycgQ09MTEFURSBjdGVzdF9kZXQ7CitTRUxFQ1Qg J2FiYycgTElLRSAnYVxiYycgQ09MTEFURSBjdGVzdF9kZXQ7CisKK1NFTEVDVCAnYWJjJyBM SUtFICdhYmMnIENPTExBVEUgY3Rlc3Rfbm9uZGV0OworU0VMRUNUICdhYmMnIExJS0UgJ2Fc YmMnIENPTExBVEUgY3Rlc3Rfbm9uZGV0OworCiBDUkVBVEUgVEFCTEUgdGVzdDYgKGEgaW50 LCBiIHRleHQpOwogLS0gc2FtZSBzdHJpbmcgaW4gZGlmZmVyZW50IG5vcm1hbCBmb3Jtcwog SU5TRVJUIElOVE8gdGVzdDYgVkFMVUVTICgxLCBVJidcMDBFNGJjJyk7CkBAIC01MjIsNiAr NTI4LDkgQEAgQ1JFQVRFIFRBQkxFIHRlc3Q2IChhIGludCwgYiB0ZXh0KTsKIFNFTEVDVCAq IEZST00gdGVzdDYgV0hFUkUgYiA9ICfDpGJjJyBDT0xMQVRFIGN0ZXN0X2RldDsKIFNFTEVD VCAqIEZST00gdGVzdDYgV0hFUkUgYiA9ICfDpGJjJyBDT0xMQVRFIGN0ZXN0X25vbmRldDsK IAorU0VMRUNUICogRlJPTSB0ZXN0NiBXSEVSRSBiIExJS0UgJ8OkYmMnIENPTExBVEUgY3Rl c3RfZGV0OworU0VMRUNUICogRlJPTSB0ZXN0NiBXSEVSRSBiIExJS0UgJ8OkYmMnIENPTExB VEUgY3Rlc3Rfbm9uZGV0OworCiAtLSBzYW1lIHdpdGggYXJyYXlzCiBDUkVBVEUgVEFCTEUg dGVzdDZhIChhIGludCwgYiB0ZXh0W10pOwogSU5TRVJUIElOVE8gdGVzdDZhIFZBTFVFUyAo MSwgQVJSQVlbVSYnXDAwRTRiYyddKTsKQEAgLTYzNywxNCArNjQ2LDE0IEBAIENSRUFURSBV TklRVUUgSU5ERVggT04gdGVzdDNicGNpICh4KTsgIC0tIGVycm9yCiAtLSBUaGlzIHRlc3Rz IHRoZSBpc3N1ZSBkZXNjcmliZWQgaW4gbWF0Y2hfcGF0dGVybl9wcmVmaXgoKS4gIEluIHRo ZQogLS0gYWJzZW5jZSBvZiB0aGF0IGNoZWNrLCB0aGUgY2FzZV9pbnNlbnNpdGl2ZSB0ZXN0 cyBiZWxvdyB3b3VsZAogLS0gcmV0dXJuIG5vIHJvd3Mgd2hlcmUgdGhleSBzaG91bGQgbG9n aWNhbGx5IHJldHVybiBvbmUuCi1DUkVBVEUgVEFCTEUgdGVzdDRjICh4IHRleHQgQ09MTEFU RSAiQyIpOworQ1JFQVRFIFRBQkxFIHRlc3Q0YyAoeCB0ZXh0IENPTExBVEUgY2FzZV9pbnNl bnNpdGl2ZSk7CiBJTlNFUlQgSU5UTyB0ZXN0NGMgVkFMVUVTICgnYWJjJyk7CiBDUkVBVEUg SU5ERVggT04gdGVzdDRjICh4KTsKIFNFVCBlbmFibGVfc2Vxc2NhbiA9IG9mZjsKIFNFTEVD VCB4IEZST00gdGVzdDRjIFdIRVJFIHggTElLRSAnQUJDJyBDT0xMQVRFIGNhc2Vfc2Vuc2l0 aXZlOyAgLS0gb2ssIG5vIHJvd3MKIFNFTEVDVCB4IEZST00gdGVzdDRjIFdIRVJFIHggTElL RSAnQUJDJScgQ09MTEFURSBjYXNlX3NlbnNpdGl2ZTsgIC0tIG9rLCBubyByb3dzCi1TRUxF Q1QgeCBGUk9NIHRlc3Q0YyBXSEVSRSB4IExJS0UgJ0FCQycgQ09MTEFURSBjYXNlX2luc2Vu c2l0aXZlOyAgLS0gZXJyb3IKLVNFTEVDVCB4IEZST00gdGVzdDRjIFdIRVJFIHggTElLRSAn QUJDJScgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZlOyAgLS0gZXJyb3IKK1NFTEVDVCB4IEZS T00gdGVzdDRjIFdIRVJFIHggTElLRSAnQUJDJyBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmU7 ICAtLSBvaworU0VMRUNUIHggRlJPTSB0ZXN0NGMgV0hFUkUgeCBMSUtFICdBQkMlJyBDT0xM QVRFIGNhc2VfaW5zZW5zaXRpdmU7ICAtLSBvawogUkVTRVQgZW5hYmxlX3NlcXNjYW47CiAK IC0tIFVuaWNvZGUgc3BlY2lhbCBjYXNlOiBkaWZmZXJlbnQgdmFyaWFudHMgb2YgR3JlZWsg bG93ZXIgY2FzZSBzaWdtYS4KQEAgLTY4Nyw2ICs2OTYsMTQgQEAgQ1JFQVRFIFRBQkxFIHRl c3Q0IChhIGludCwgYiB0ZXh0KTsKIFNFTEVDVCAqIEZST00gdGVzdDQgV0hFUkUgYiA9ICdD b3RlJyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOyAgLS0gc3RpbGwgY2FzZS1zZW5zaXRpdmUK IFNFTEVDVCAqIEZST00gdGVzdDQgV0hFUkUgYiA9ICdDb3RlJyBDT0xMQVRFIGNhc2VfaW5z ZW5zaXRpdmU7CiAKKy0tIFRoaXMgaXMgYSB0cmlja3kgb25lLiAgQSBuYWl2ZSBpbXBsZW1l bnRhdGlvbiB3b3VsZCBmaXJzdCB0ZXN0CistLSBcMDBFNCBtYXRjaGVzIFwwMDYxLCB3aGlj aCBpcyB0cnVlIHVuZGVyIGlnbm9yZV9hY2NlbnRzLCBidXQgdGhlbgorLS0gdGhlIHJlc3Qg b2YgdGhlIHN0cmluZyB3b24ndCBtYXRjaCBhbnltb3JlLiAgVGhlcmVmb3JlLCB0aGUKKy0t IGFsZ29yaXRobSBoYXMgdG8gdGVzdCB3aGV0aGVyIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcg bWF0Y2hlcywgYW5kCistLSBpZiBub3QgdHJ5IG1hdGNoaW5nIFwwMEU0IGFnYWluc3QgYSBs b25nZXIgc3Vic3RyaW5nIGxpa2UKKy0tIFwwMDYxXDAzMDgsIHdoaWNoIHdpbGwgdGhlbiB3 b3JrIG91dC4KK1NFTEVDVCBVJidcMDA2MVwwMzA4YmMnIExJS0UgVSYnXDAwRTRfYycgQ09M TEFURSBpZ25vcmVfYWNjZW50czsKKwogLS0gZm9yZWlnbiBrZXlzIChzaG91bGQgdXNlIGNv bGxhdGlvbiBvZiBwcmltYXJ5IGtleSkKIAogLS0gUEsgaXMgY2FzZS1zZW5zaXRpdmUsIEZL IGlzIGNhc2UtaW5zZW5zaXRpdmUKCmJhc2UtY29tbWl0OiA1YzlmMzVmYzQ4ZWE5OWU1OTMw MGEyNjdlMDkwZTNlYWZkMWIzYjBlCi0tIAoyLjQ0LjAKCg== --------------s3jhLUeQPf13dDsI6l5Xje7Z--