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.96) (envelope-from ) id 1vayJR-00GhIz-0s for pgsql-hackers@arkaria.postgresql.org; Wed, 31 Dec 2025 15:40:38 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vayJQ-006j33-0c for pgsql-hackers@arkaria.postgresql.org; Wed, 31 Dec 2025 15:40:36 +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.96) (envelope-from ) id 1vayJP-006j2u-2K for pgsql-hackers@lists.postgresql.org; Wed, 31 Dec 2025 15:40:36 +0000 Received: from smtp.outgoing.loopia.se ([93.188.3.37]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vayJN-003nD5-3C for pgsql-hackers@postgresql.org; Wed, 31 Dec 2025 15:40:36 +0000 Received: from s807.loopia.se (localhost [127.0.0.1]) by s807.loopia.se (Postfix) with ESMTP id C3D93507372 for ; Wed, 31 Dec 2025 16:40:32 +0100 (CET) Received: from s979.loopia.se (unknown [172.22.191.5]) by s807.loopia.se (Postfix) with ESMTP id AF153507BDD; Wed, 31 Dec 2025 16:40:32 +0100 (CET) Received: from s473.loopia.se (unknown [172.22.191.5]) by s979.loopia.se (Postfix) with ESMTP id AD3BF10BC466; Wed, 31 Dec 2025 16:40:32 +0100 (CET) X-Virus-Scanned: amavisd-new at amavis.loopia.se X-Spam-Flag: NO X-Spam-Score: -1.2 X-Spam-Level: X-Spam-Status: No, score=-1.2 tagged_above=-999 required=6.2 tests=[ALL_TRUSTED=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1] autolearn=disabled Authentication-Results: s473.loopia.se (amavisd-new); dkim=pass (2048-bit key) header.d=proxel.se Received: from s899.loopia.se ([172.22.191.5]) by s473.loopia.se (s473.loopia.se [172.22.190.13]) (amavisd-new, port 10024) with LMTP id vinaDxMLDDKh; Wed, 31 Dec 2025 16:40:32 +0100 (CET) X-Loopia-Auth: user X-Loopia-User: andreas@proxel.se X-Loopia-Originating-IP: 147.28.75.140 Received: from [192.168.0.121] (customer-147-28-75-140.stosn.net [147.28.75.140]) (Authenticated sender: andreas@proxel.se) by s899.loopia.se (Postfix) with ESMTPSA id DBA3C2C8BA64; Wed, 31 Dec 2025 16:40:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proxel.se; s=loopiadkim1707418970; t=1767195631; bh=TO2MgIeOk01yOMHsgqi6wqLUk7a41eLcTXW8/LlzMq4=; h=Date:Subject:To:References:From:In-Reply-To; b=FNGERyJfGD+nVDAYO/hv4rImPtTAx5SSbMj+mugr8nwLh+BhPhx0OC/X9sYdAoPOX FdUWSzjyYLWPTEHN09SJglDEwtfW+qgu5LCh3/42fuAzXvsbK1DD9jdmYLz6zqxmp3 DqFiDJXYdnUMOM+4BzUr/ayFDStKG+QUDV99Ka0XcQJAqmtkO84UL2COG1SKmFe8fC WDT9Z0sPljyvdGTBVRV9HtmfB0gc7CRjtZN3yAxCTz6WDJa7EIsKQrSbEtLrRIgq8W lp/lA593ki2NDrkB7fccSU3l5yDywpT+agZvUi+UlpQ+X4WCFewViJ6z9mVPQW8lPd hlLvhFqgfHdJQ== Content-Type: multipart/mixed; boundary="------------P15xe4Go810hjUv7aKl7WbYp" Message-ID: <4cfde442-25dd-495f-8d76-a23502ce17b8@proxel.se> Date: Wed, 31 Dec 2025 16:40:31 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Speed up ICU case conversion by using ucasemap_utf8To*() To: zengman , Jeff Davis , pgsql-hackers References: <167986ff-afcf-4542-94c6-61ee8474e138@proxel.se> <72c7c2b5848da44caddfe0f20f6c7ebc7c0c6e60.camel@j-davis.com> From: Andreas Karlsson Content-Language: en-US In-Reply-To: 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. --------------P15xe4Go810hjUv7aKl7WbYp Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 12/31/25 3:36 AM, zengman wrote: > On the mailing list, I've noticed this patch. I tested its functionality and it works really well. I have a few minor, non-critical comments to share. Thanks for trying it out! > In the `pg_ucasemap_open` function, the error message `casemap lookup failed:` doesn't seem ideal. This is because we're opening the `UCaseMap` here, rather than performing a "lookup" operation. Fixed. > In the comment `Additional makes sure we get the right options for case folding.`, the word Additional seems inappropriate — `Additionally` would be a better replacement. Fixed. Andreas --------------P15xe4Go810hjUv7aKl7WbYp Content-Type: text/x-patch; charset=UTF-8; name="v3-0001-Use-optimized-versions-of-ICU-case-conversion-for.patch" Content-Disposition: attachment; filename*0="v3-0001-Use-optimized-versions-of-ICU-case-conversion-for.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBkMWE5YmM0YzFjYzE1MzMzY2M0NGU3ZmMyMTM2NGM3Mjg5YzhiYjQ5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZWFzIEthcmxzc29uIDxhbmRyZWFzQHByb3hl bC5zZT4KRGF0ZTogVHVlLCAxNyBEZWMgMjAyNCAyMjo0NzowMCArMDEwMApTdWJqZWN0OiBb UEFUQ0ggdjNdIFVzZSBvcHRpbWl6ZWQgdmVyc2lvbnMgb2YgSUNVIGNhc2UgY29udmVyc2lv biBmb3IgVVRGLTgKCkluc3RlYWQgb2YgY29udmVydGluZyB0byBhbmQgZnJvbSBVQ2hhciB3 aGVuIGRvaW5nIGNhc2UgY29udmVyc2lvbnMgd2UKdXNlIHRoZSBVVEYtOCB2ZXJzaW9ucyBv ZiB0aGUgZnVuY3Rpb25zLiBUaGlzIGNhbiBnaXZlIGEgc2lnbmZpY2FudApzcGVlZHVwLCAz MC00MCUsIG9uIHNob3J0IHRvIG1lZGl1bSBsZW5ndGggc3RyaW5ncy4KClRoZSBvbmx5IGNv c3Qgd2UgaW5jdXIgaXMgdGhhdCB3ZSBoYXZlIHRvIGFsbG9jYXRlIGEgY2FzZW1hcCBvYmpl Y3Qgb24KbG9jYWxlIGluaXRpYWxpemF0aW9uIGZvciBVVEYtOCBkYXRhYmFzZXMgYnV0IHRo ZSBvYmplY3QgaXMgcmVhbHRpdmVseQpzbWFsbCBhbmQgdGhlIGFzc3VtcHRpb24gaXMgdGhh dCBtb3N0IHVzZXJzIHdpbGwgYXQgc29tZSBwb2ludCB3YW50IHRvCnJ1biBjYXNlIGNvbnZl cnNpb24gZnVuY3Rpb25zLgoKV2hpbGUgYXQgaXQgd2UgYWxzbyByZW1vdmUgc29tZSBkdXBs aWNhdGlvbiBpbiB0aGUgbm9uLVVURi04IGNvZGUuCi0tLQogc3JjL2JhY2tlbmQvdXRpbHMv YWR0L3BnX2xvY2FsZV9pY3UuYyB8IDI1NiArKysrKysrKysrKysrKysrKy0tLS0tLS0tLQog c3JjL2luY2x1ZGUvdXRpbHMvcGdfbG9jYWxlLmggICAgICAgICB8ICAgMiArCiAyIGZpbGVz IGNoYW5nZWQsIDE2NyBpbnNlcnRpb25zKCspLCA5MSBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlX2ljdS5jIGIvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9pY3UuYwppbmRleCA0M2Q0NGZlNDNiZC4uMjc5NDI5 YzZjNjcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGVfaWN1 LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9pY3UuYwpAQCAtNTIs NiArNTIsNyBAQCBleHRlcm4gcGdfbG9jYWxlX3QgY3JlYXRlX3BnX2xvY2FsZV9pY3UoT2lk IGNvbGxpZCwgTWVtb3J5Q29udGV4dCBjb250ZXh0KTsKICNpZmRlZiBVU0VfSUNVCiAKIGV4 dGVybiBVQ29sbGF0b3IgKnBnX3Vjb2xfb3Blbihjb25zdCBjaGFyICpsb2Nfc3RyKTsKK3N0 YXRpYyBVQ2FzZU1hcCAqcGdfdWNhc2VtYXBfb3Blbihjb25zdCBjaGFyICpsb2Nfc3RyKTsK IAogc3RhdGljIHNpemVfdCBzdHJsb3dlcl9pY3UoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3Rz aXplLCBjb25zdCBjaGFyICpzcmMsCiAJCQkJCQkgICBzc2l6ZV90IHNyY2xlbiwgcGdfbG9j YWxlX3QgbG9jYWxlKTsKQEAgLTExMSw5ICsxMTIsMTIgQEAgc3RhdGljIHNpemVfdCBpY3Vf ZnJvbV91Y2hhcihjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsCiAJCQkJCQkJIGNvbnN0 IFVDaGFyICpidWZmX3VjaGFyLCBpbnQzMl90IGxlbl91Y2hhcik7CiBzdGF0aWMgdm9pZCBp Y3Vfc2V0X2NvbGxhdGlvbl9hdHRyaWJ1dGVzKFVDb2xsYXRvciAqY29sbGF0b3IsIGNvbnN0 IGNoYXIgKmxvYywKIAkJCQkJCQkJCQkgVUVycm9yQ29kZSAqc3RhdHVzKTsKLXN0YXRpYyBp bnQzMl90IGljdV9jb252ZXJ0X2Nhc2UoSUNVX0NvbnZlcnRfRnVuYyBmdW5jLCBwZ19sb2Nh bGVfdCBteWxvY2FsZSwKLQkJCQkJCQkJVUNoYXIgKipidWZmX2Rlc3QsIFVDaGFyICpidWZm X3NvdXJjZSwKLQkJCQkJCQkJaW50MzJfdCBsZW5fc291cmNlKTsKK3N0YXRpYyBpbnQzMl90 IGljdV9jb252ZXJ0X2Nhc2Vfbm9fdXRmOChJQ1VfQ29udmVydF9GdW5jIGZ1bmMsIGNoYXIg KmRlc3QsCisJCQkJCQkJCQkJc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsCisJ CQkJCQkJCQkJc3NpemVfdCBzcmNsZW4sIHBnX2xvY2FsZV90IGxvY2FsZSk7CitzdGF0aWMg aW50MzJfdCBpY3VfY29udmVydF9jYXNlX3VjaGFyKElDVV9Db252ZXJ0X0Z1bmMgZnVuYywg cGdfbG9jYWxlX3QgbXlsb2NhbGUsCisJCQkJCQkJCQkgIFVDaGFyICoqYnVmZl9kZXN0LCBV Q2hhciAqYnVmZl9zb3VyY2UsCisJCQkJCQkJCQkgIGludDMyX3QgbGVuX3NvdXJjZSk7CiBz dGF0aWMgaW50MzJfdCB1X3N0clRvVGl0bGVfZGVmYXVsdF9CSShVQ2hhciAqZGVzdCwgaW50 MzJfdCBkZXN0Q2FwYWNpdHksCiAJCQkJCQkJCQkgICBjb25zdCBVQ2hhciAqc3JjLCBpbnQz Ml90IHNyY0xlbmd0aCwKIAkJCQkJCQkJCSAgIGNvbnN0IGNoYXIgKmxvY2FsZSwKQEAgLTE0 MCw2ICsxNDQsOCBAQCB0b2xvd2VyX2ljdShwZ193Y2hhciB3YywgcGdfbG9jYWxlX3QgbG9j YWxlKQogCXJldHVybiB1X3RvbG93ZXIod2MpOwogfQogCitzdGF0aWMgaW50MzJfdCBpY3Vf Zm9sZGNhc2Vfb3B0aW9ucyhjb25zdCBjaGFyICpsb2NhbGUpOworCiBzdGF0aWMgY29uc3Qg c3RydWN0IGNvbGxhdGVfbWV0aG9kcyBjb2xsYXRlX21ldGhvZHNfaWN1ID0gewogCS5zdHJu Y29sbCA9IHN0cm5jb2xsX2ljdSwKIAkuc3Rybnhmcm0gPSBzdHJueGZybV9pY3UsCkBAIC0y NzgsNiArMjg0LDcgQEAgY3JlYXRlX3BnX2xvY2FsZV9pY3UoT2lkIGNvbGxpZCwgTWVtb3J5 Q29udGV4dCBjb250ZXh0KQogCWNvbnN0IGNoYXIgKmljdXJ1bGVzID0gTlVMTDsKIAlVQ29s bGF0b3IgICpjb2xsYXRvcjsKIAlsb2NhbGVfdAlsb2MgPSAobG9jYWxlX3QpIDA7CisJVUNh c2VNYXAgICAqY2FzZW1hcCA9IE5VTEw7CiAJcGdfbG9jYWxlX3QgcmVzdWx0OwogCiAJaWYg KGNvbGxpZCA9PSBERUZBVUxUX0NPTExBVElPTl9PSUQpCkBAIC0zMzksMTAgKzM0NiwxNCBA QCBjcmVhdGVfcGdfbG9jYWxlX2ljdShPaWQgY29sbGlkLCBNZW1vcnlDb250ZXh0IGNvbnRl eHQpCiAKIAljb2xsYXRvciA9IG1ha2VfaWN1X2NvbGxhdG9yKGljdWxvY3N0ciwgaWN1cnVs ZXMpOwogCisJaWYgKEdldERhdGFiYXNlRW5jb2RpbmcoKSA9PSBQR19VVEY4KQorCQljYXNl bWFwID0gcGdfdWNhc2VtYXBfb3BlbihpY3Vsb2NzdHIpOworCiAJcmVzdWx0ID0gTWVtb3J5 Q29udGV4dEFsbG9jWmVybyhjb250ZXh0LCBzaXplb2Yoc3RydWN0IHBnX2xvY2FsZV9zdHJ1 Y3QpKTsKIAlyZXN1bHQtPmljdS5sb2NhbGUgPSBNZW1vcnlDb250ZXh0U3RyZHVwKGNvbnRl eHQsIGljdWxvY3N0cik7CiAJcmVzdWx0LT5pY3UudWNvbCA9IGNvbGxhdG9yOwogCXJlc3Vs dC0+aWN1Lmx0ID0gbG9jOworCXJlc3VsdC0+aWN1LnVjYXNlbWFwID0gY2FzZW1hcDsKIAly ZXN1bHQtPmRldGVybWluaXN0aWMgPSBkZXRlcm1pbmlzdGljOwogCXJlc3VsdC0+Y29sbGF0 ZV9pc19jID0gZmFsc2U7CiAJcmVzdWx0LT5jdHlwZV9pc19jID0gZmFsc2U7CkBAIC0zNjYs NDEgKzM3NywxOCBAQCBjcmVhdGVfcGdfbG9jYWxlX2ljdShPaWQgY29sbGlkLCBNZW1vcnlD b250ZXh0IGNvbnRleHQpCiAjaWZkZWYgVVNFX0lDVQogCiAvKgotICogV3JhcHBlciBhcm91 bmQgdWNvbF9vcGVuKCkgdG8gaGFuZGxlIEFQSSBkaWZmZXJlbmNlcyBmb3Igb2xkZXIgSUNV Ci0gKiB2ZXJzaW9ucy4KLSAqCi0gKiBFbnN1cmUgdGhhdCBubyBwYXRoIGxlYWtzIGEgVUNv bGxhdG9yLgorICogSW4gSUNVIHZlcnNpb25zIDU0IGFuZCBlYXJsaWVyLCAidW5kIiBpcyBu b3QgYSByZWNvZ25pemVkIHNwZWxsaW5nIG9mIHRoZQorICogcm9vdCBsb2NhbGUuIElmIHRo ZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIGxvY2FsZSBpcyAidW5kIiwgcmVwbGFjZSB3aXRo CisgKiAicm9vdCIgYmVmb3JlIG9wZW5pbmcuCiAgKi8KLVVDb2xsYXRvciAqCi1wZ191Y29s X29wZW4oY29uc3QgY2hhciAqbG9jX3N0cikKK3N0YXRpYyBjaGFyICoKK2ZpeF9pY3VfbG9j YWxlX3N0cihjb25zdCBjaGFyICpsb2Nfc3RyKQogewotCVVDb2xsYXRvciAgKmNvbGxhdG9y OwotCVVFcnJvckNvZGUJc3RhdHVzOwotCWNvbnN0IGNoYXIgKm9yaWdfc3RyID0gbG9jX3N0 cjsKLQljaGFyCSAgICpmaXhlZF9zdHIgPSBOVUxMOwotCi0JLyoKLQkgKiBNdXN0IG5ldmVy IG9wZW4gZGVmYXVsdCBjb2xsYXRvciwgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBlbnZp cm9ubWVudAotCSAqIGFuZCBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLiBTaG91bGQgbm90IGhh cHBlbiwgYnV0IGNoZWNrIGhlcmUgdG8gY2F0Y2gKLQkgKiBidWdzIHRoYXQgbWlnaHQgYmUg aGFyZCB0byBjYXRjaCBvdGhlcndpc2UuCi0JICoKLQkgKiBOQjogdGhlIGRlZmF1bHQgY29s bGF0b3IgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjb2xsYXRvciBmb3IgdGhlIHJvb3QKLQkg KiBsb2NhbGUuIFRoZSByb290IGxvY2FsZSBtYXkgYmUgc3BlY2lmaWVkIGFzIHRoZSBlbXB0 eSBzdHJpbmcsICJ1bmQiLCBvcgotCSAqICJyb290Ii4gVGhlIGRlZmF1bHQgY29sbGF0b3Ig aXMgb3BlbmVkIGJ5IHBhc3NpbmcgTlVMTCB0byB1Y29sX29wZW4oKS4KLQkgKi8KLQlpZiAo bG9jX3N0ciA9PSBOVUxMKQotCQllbG9nKEVSUk9SLCAib3BlbmluZyBkZWZhdWx0IGNvbGxh dG9yIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQotCS8qCi0JICogSW4gSUNVIHZlcnNpb25zIDU0 IGFuZCBlYXJsaWVyLCAidW5kIiBpcyBub3QgYSByZWNvZ25pemVkIHNwZWxsaW5nIG9mCi0J ICogdGhlIHJvb3QgbG9jYWxlLiBJZiB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBsb2Nh bGUgaXMgInVuZCIsIHJlcGxhY2UKLQkgKiB3aXRoICJyb290IiBiZWZvcmUgb3BlbmluZy4K LQkgKi8KIAlpZiAoVV9JQ1VfVkVSU0lPTl9NQUpPUl9OVU0gPCA1NSkKIAl7CiAJCWNoYXIJ CWxhbmdbVUxPQ19MQU5HX0NBUEFDSVRZXTsKKwkJVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pF Uk9fRVJST1I7CiAKLQkJc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogCQl1bG9jX2dldExhbmd1 YWdlKGxvY19zdHIsIGxhbmcsIFVMT0NfTEFOR19DQVBBQ0lUWSwgJnN0YXR1cyk7CiAJCWlm IChVX0ZBSUxVUkUoc3RhdHVzKSB8fCBzdGF0dXMgPT0gVV9TVFJJTkdfTk9UX1RFUk1JTkFU RURfV0FSTklORykKIAkJewpAQCAtNDEzLDE1ICs0MDEsNDkgQEAgcGdfdWNvbF9vcGVuKGNv bnN0IGNoYXIgKmxvY19zdHIpCiAJCWlmIChzdHJjbXAobGFuZywgInVuZCIpID09IDApCiAJ CXsKIAkJCWNvbnN0IGNoYXIgKnJlbWFpbmRlciA9IGxvY19zdHIgKyBzdHJsZW4oInVuZCIp OworCQkJY2hhcgkgICAqZml4ZWRfc3RyOwogCiAJCQlmaXhlZF9zdHIgPSBwYWxsb2Moc3Ry bGVuKCJyb290IikgKyBzdHJsZW4ocmVtYWluZGVyKSArIDEpOwogCQkJc3RyY3B5KGZpeGVk X3N0ciwgInJvb3QiKTsKIAkJCXN0cmNhdChmaXhlZF9zdHIsIHJlbWFpbmRlcik7CiAKLQkJ CWxvY19zdHIgPSBmaXhlZF9zdHI7CisJCQlyZXR1cm4gZml4ZWRfc3RyOwogCQl9CiAJfQog CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBXcmFwcGVyIGFyb3VuZCB1Y29sX29wZW4o KSB0byBoYW5kbGUgQVBJIGRpZmZlcmVuY2VzIGZvciBvbGRlciBJQ1UKKyAqIHZlcnNpb25z LgorICoKKyAqIEVuc3VyZSB0aGF0IG5vIHBhdGggbGVha3MgYSBVQ29sbGF0b3IuCisgKi8K K1VDb2xsYXRvciAqCitwZ191Y29sX29wZW4oY29uc3QgY2hhciAqbG9jX3N0cikKK3sKKwlV Q29sbGF0b3IgICpjb2xsYXRvcjsKKwlVRXJyb3JDb2RlCXN0YXR1czsKKwljb25zdCBjaGFy ICpvcmlnX3N0ciA9IGxvY19zdHI7CisJY2hhcgkgICAqZml4ZWRfc3RyOworCisJLyoKKwkg KiBNdXN0IG5ldmVyIG9wZW4gZGVmYXVsdCBjb2xsYXRvciwgYmVjYXVzZSBpdCBkZXBlbmRz IG9uIHRoZSBlbnZpcm9ubWVudAorCSAqIGFuZCBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLiBT aG91bGQgbm90IGhhcHBlbiwgYnV0IGNoZWNrIGhlcmUgdG8gY2F0Y2gKKwkgKiBidWdzIHRo YXQgbWlnaHQgYmUgaGFyZCB0byBjYXRjaCBvdGhlcndpc2UuCisJICoKKwkgKiBOQjogdGhl IGRlZmF1bHQgY29sbGF0b3IgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjb2xsYXRvciBmb3Ig dGhlIHJvb3QKKwkgKiBsb2NhbGUuIFRoZSByb290IGxvY2FsZSBtYXkgYmUgc3BlY2lmaWVk IGFzIHRoZSBlbXB0eSBzdHJpbmcsICJ1bmQiLCBvcgorCSAqICJyb290Ii4gVGhlIGRlZmF1 bHQgY29sbGF0b3IgaXMgb3BlbmVkIGJ5IHBhc3NpbmcgTlVMTCB0byB1Y29sX29wZW4oKS4K KwkgKi8KKwlpZiAobG9jX3N0ciA9PSBOVUxMKQorCQllbG9nKEVSUk9SLCAib3BlbmluZyBk ZWZhdWx0IGNvbGxhdG9yIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKworCWZpeGVkX3N0ciA9IGZp eF9pY3VfbG9jYWxlX3N0cihsb2Nfc3RyKTsKKwlpZiAoZml4ZWRfc3RyKQorCQlsb2Nfc3Ry ID0gZml4ZWRfc3RyOworCiAJc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogCWNvbGxhdG9yID0g dWNvbF9vcGVuKGxvY19zdHIsICZzdGF0dXMpOwogCWlmIChVX0ZBSUxVUkUoc3RhdHVzKSkK QEAgLTQ1Niw2ICs0NzgsMzcgQEAgcGdfdWNvbF9vcGVuKGNvbnN0IGNoYXIgKmxvY19zdHIp CiAJcmV0dXJuIGNvbGxhdG9yOwogfQogCisvKgorICogV3JhcHBlciBhcm91bmQgdWNhc2Vt YXBfb3BlbigpIHRvIGhhbmRsZSBBUEkgZGlmZmVyZW5jZXMgZm9yIG9sZGVyIElDVQorICog dmVyc2lvbnMuCisgKgorICogQWRkaXRpb25hbGx5IG1ha2VzIHN1cmUgd2UgZ2V0IHRoZSBy aWdodCBvcHRpb25zIGZvciBjYXNlIGZvbGRpbmcuCisgKi8KK3N0YXRpYyBVQ2FzZU1hcCAq CitwZ191Y2FzZW1hcF9vcGVuKGNvbnN0IGNoYXIgKmxvY19zdHIpCit7CisJVUVycm9yQ29k ZQlzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisJVUNhc2VNYXAgICAqY2FzZW1hcDsKKwljb25z dCBjaGFyICpvcmlnX3N0ciA9IGxvY19zdHI7CisJY2hhcgkgICAqZml4ZWRfc3RyOworCisJ Zml4ZWRfc3RyID0gZml4X2ljdV9sb2NhbGVfc3RyKGxvY19zdHIpOworCWlmIChmaXhlZF9z dHIpCisJCWxvY19zdHIgPSBmaXhlZF9zdHI7CisKKwljYXNlbWFwID0gdWNhc2VtYXBfb3Bl bihsb2Nfc3RyLCBpY3VfZm9sZGNhc2Vfb3B0aW9ucyhsb2Nfc3RyKSwgJnN0YXR1cyk7CisJ aWYgKFVfRkFJTFVSRShzdGF0dXMpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCWVycmNvZGUo RVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCisJCQkJZXJybXNnKCJjb3VsZCBu b3Qgb3BlbiBjYXNlbWFwIGZvciBsb2NhbGUgXCIlc1wiOiAlcyIsCisJCQkJCQlvcmlnX3N0 ciwgdV9lcnJvck5hbWUoc3RhdHVzKSkpOworCisJaWYgKGZpeGVkX3N0ciAhPSBOVUxMKQor CQlwZnJlZShmaXhlZF9zdHIpOworCisJcmV0dXJuIGNhc2VtYXA7Cit9CisKIC8qCiAgKiBD cmVhdGUgYSBVQ29sbGF0b3Igd2l0aCB0aGUgZ2l2ZW4gbG9jYWxlIHN0cmluZyBhbmQgcnVs ZXMuCiAgKgpAQCAtNTI4LDgwICs1ODEsNzYgQEAgc3RhdGljIHNpemVfdAogc3RybG93ZXJf aWN1KGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzc2l6 ZV90IHNyY2xlbiwKIAkJCSBwZ19sb2NhbGVfdCBsb2NhbGUpCiB7Ci0JaW50MzJfdAkJbGVu X3VjaGFyOwotCWludDMyX3QJCWxlbl9jb252OwotCVVDaGFyCSAgICpidWZmX3VjaGFyOwot CVVDaGFyCSAgICpidWZmX2NvbnY7Ci0Jc2l6ZV90CQlyZXN1bHRfbGVuOwotCi0JbGVuX3Vj aGFyID0gaWN1X3RvX3VjaGFyKCZidWZmX3VjaGFyLCBzcmMsIHNyY2xlbik7Ci0JbGVuX2Nv bnYgPSBpY3VfY29udmVydF9jYXNlKHVfc3RyVG9Mb3dlciwgbG9jYWxlLAotCQkJCQkJCQkm YnVmZl9jb252LCBidWZmX3VjaGFyLCBsZW5fdWNoYXIpOwotCXJlc3VsdF9sZW4gPSBpY3Vf ZnJvbV91Y2hhcihkZXN0LCBkZXN0c2l6ZSwgYnVmZl9jb252LCBsZW5fY29udik7Ci0JcGZy ZWUoYnVmZl91Y2hhcik7Ci0JcGZyZWUoYnVmZl9jb252KTsKKwlpZiAoR2V0RGF0YWJhc2VF bmNvZGluZygpID09IFBHX1VURjgpCisJeworCQlVRXJyb3JDb2RlCXN0YXR1cyA9IFVfWkVS T19FUlJPUjsKKwkJaW50MzJfdAkJbmVlZGVkOwogCi0JcmV0dXJuIHJlc3VsdF9sZW47CisJ CW5lZWRlZCA9IHVjYXNlbWFwX3V0ZjhUb0xvd2VyKGxvY2FsZS0+aWN1LnVjYXNlbWFwLCBk ZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sICZzdGF0dXMpOworCQlpZiAoc3RhdHVzICE9 IFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SICYmIFVfRkFJTFVSRShzdGF0dXMpKQorCQkJZXJl cG9ydChFUlJPUiwKKwkJCQkJKGVycm1zZygiY2FzZSBjb252ZXJzaW9uIGZhaWxlZDogJXMi LCB1X2Vycm9yTmFtZShzdGF0dXMpKSkpOworCQlyZXR1cm4gbmVlZGVkOworCX0KKwllbHNl CisJCXJldHVybiBpY3VfY29udmVydF9jYXNlX25vX3V0ZjgodV9zdHJUb0xvd2VyLCBkZXN0 LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sIGxvY2FsZSk7CiB9CiAKIHN0YXRpYyBzaXplX3QK IHN0cnRpdGxlX2ljdShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIg KnNyYywgc3NpemVfdCBzcmNsZW4sCiAJCQkgcGdfbG9jYWxlX3QgbG9jYWxlKQogewotCWlu dDMyX3QJCWxlbl91Y2hhcjsKLQlpbnQzMl90CQlsZW5fY29udjsKLQlVQ2hhcgkgICAqYnVm Zl91Y2hhcjsKLQlVQ2hhcgkgICAqYnVmZl9jb252OwotCXNpemVfdAkJcmVzdWx0X2xlbjsK LQotCWxlbl91Y2hhciA9IGljdV90b191Y2hhcigmYnVmZl91Y2hhciwgc3JjLCBzcmNsZW4p OwotCWxlbl9jb252ID0gaWN1X2NvbnZlcnRfY2FzZSh1X3N0clRvVGl0bGVfZGVmYXVsdF9C SSwgbG9jYWxlLAotCQkJCQkJCQkmYnVmZl9jb252LCBidWZmX3VjaGFyLCBsZW5fdWNoYXIp OwotCXJlc3VsdF9sZW4gPSBpY3VfZnJvbV91Y2hhcihkZXN0LCBkZXN0c2l6ZSwgYnVmZl9j b252LCBsZW5fY29udik7Ci0JcGZyZWUoYnVmZl91Y2hhcik7Ci0JcGZyZWUoYnVmZl9jb252 KTsKKwlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VURjgpCisJeworCQlVRXJy b3JDb2RlCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKKwkJaW50MzJfdAkJbmVlZGVkOwogCi0J cmV0dXJuIHJlc3VsdF9sZW47CisJCW5lZWRlZCA9IHVjYXNlbWFwX3V0ZjhUb1RpdGxlKGxv Y2FsZS0+aWN1LnVjYXNlbWFwLCBkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sICZzdGF0 dXMpOworCQlpZiAoc3RhdHVzICE9IFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SICYmIFVfRkFJ TFVSRShzdGF0dXMpKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycm1zZygiY2FzZSBj b252ZXJzaW9uIGZhaWxlZDogJXMiLCB1X2Vycm9yTmFtZShzdGF0dXMpKSkpOworCQlyZXR1 cm4gbmVlZGVkOworCX0KKwllbHNlCisJCXJldHVybiBpY3VfY29udmVydF9jYXNlX25vX3V0 ZjgodV9zdHJUb1RpdGxlX2RlZmF1bHRfQkksIGRlc3QsIGRlc3RzaXplLCBzcmMsIHNyY2xl biwgbG9jYWxlKTsKIH0KIAogc3RhdGljIHNpemVfdAogc3RydXBwZXJfaWN1KGNoYXIgKmRl c3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzc2l6ZV90IHNyY2xlbiwK IAkJCSBwZ19sb2NhbGVfdCBsb2NhbGUpCiB7Ci0JaW50MzJfdAkJbGVuX3VjaGFyOwotCWlu dDMyX3QJCWxlbl9jb252OwotCVVDaGFyCSAgICpidWZmX3VjaGFyOwotCVVDaGFyCSAgICpi dWZmX2NvbnY7Ci0Jc2l6ZV90CQlyZXN1bHRfbGVuOwotCi0JbGVuX3VjaGFyID0gaWN1X3Rv X3VjaGFyKCZidWZmX3VjaGFyLCBzcmMsIHNyY2xlbik7Ci0JbGVuX2NvbnYgPSBpY3VfY29u dmVydF9jYXNlKHVfc3RyVG9VcHBlciwgbG9jYWxlLAotCQkJCQkJCQkmYnVmZl9jb252LCBi dWZmX3VjaGFyLCBsZW5fdWNoYXIpOwotCXJlc3VsdF9sZW4gPSBpY3VfZnJvbV91Y2hhcihk ZXN0LCBkZXN0c2l6ZSwgYnVmZl9jb252LCBsZW5fY29udik7Ci0JcGZyZWUoYnVmZl91Y2hh cik7Ci0JcGZyZWUoYnVmZl9jb252KTsKKwlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09 IFBHX1VURjgpCisJeworCQlVRXJyb3JDb2RlCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKKwkJ aW50MzJfdAkJbmVlZGVkOwogCi0JcmV0dXJuIHJlc3VsdF9sZW47CisJCW5lZWRlZCA9IHVj YXNlbWFwX3V0ZjhUb1VwcGVyKGxvY2FsZS0+aWN1LnVjYXNlbWFwLCBkZXN0LCBkZXN0c2l6 ZSwgc3JjLCBzcmNsZW4sICZzdGF0dXMpOworCQlpZiAoc3RhdHVzICE9IFVfQlVGRkVSX09W RVJGTE9XX0VSUk9SICYmIFVfRkFJTFVSRShzdGF0dXMpKQorCQkJZXJlcG9ydChFUlJPUiwK KwkJCQkJKGVycm1zZygiY2FzZSBjb252ZXJzaW9uIGZhaWxlZDogJXMiLCB1X2Vycm9yTmFt ZShzdGF0dXMpKSkpOworCQlyZXR1cm4gbmVlZGVkOworCX0KKwllbHNlCisJCXJldHVybiBp Y3VfY29udmVydF9jYXNlX25vX3V0ZjgodV9zdHJUb1VwcGVyLCBkZXN0LCBkZXN0c2l6ZSwg c3JjLCBzcmNsZW4sIGxvY2FsZSk7CiB9CiAKIHN0YXRpYyBzaXplX3QKIHN0cmZvbGRfaWN1 KGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzc2l6ZV90 IHNyY2xlbiwKIAkJCXBnX2xvY2FsZV90IGxvY2FsZSkKIHsKLQlpbnQzMl90CQlsZW5fdWNo YXI7Ci0JaW50MzJfdAkJbGVuX2NvbnY7Ci0JVUNoYXIJICAgKmJ1ZmZfdWNoYXI7Ci0JVUNo YXIJICAgKmJ1ZmZfY29udjsKLQlzaXplX3QJCXJlc3VsdF9sZW47Ci0KLQlsZW5fdWNoYXIg PSBpY3VfdG9fdWNoYXIoJmJ1ZmZfdWNoYXIsIHNyYywgc3JjbGVuKTsKLQlsZW5fY29udiA9 IGljdV9jb252ZXJ0X2Nhc2UodV9zdHJGb2xkQ2FzZV9kZWZhdWx0LCBsb2NhbGUsCi0JCQkJ CQkJCSZidWZmX2NvbnYsIGJ1ZmZfdWNoYXIsIGxlbl91Y2hhcik7Ci0JcmVzdWx0X2xlbiA9 IGljdV9mcm9tX3VjaGFyKGRlc3QsIGRlc3RzaXplLCBidWZmX2NvbnYsIGxlbl9jb252KTsK LQlwZnJlZShidWZmX3VjaGFyKTsKLQlwZnJlZShidWZmX2NvbnYpOworCWlmIChHZXREYXRh YmFzZUVuY29kaW5nKCkgPT0gUEdfVVRGOCkKKwl7CisJCVVFcnJvckNvZGUJc3RhdHVzID0g VV9aRVJPX0VSUk9SOworCQlpbnQzMl90CQluZWVkZWQ7CiAKLQlyZXR1cm4gcmVzdWx0X2xl bjsKKwkJbmVlZGVkID0gdWNhc2VtYXBfdXRmOEZvbGRDYXNlKGxvY2FsZS0+aWN1LnVjYXNl bWFwLCBkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sICZzdGF0dXMpOworCQlpZiAoc3Rh dHVzICE9IFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SICYmIFVfRkFJTFVSRShzdGF0dXMpKQor CQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycm1zZygiY2FzZSBjb252ZXJzaW9uIGZhaWxl ZDogJXMiLCB1X2Vycm9yTmFtZShzdGF0dXMpKSkpOworCQlyZXR1cm4gbmVlZGVkOworCX0K KwllbHNlCisJCXJldHVybiBpY3VfY29udmVydF9jYXNlX25vX3V0ZjgodV9zdHJGb2xkQ2Fz ZV9kZWZhdWx0LCBkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sIGxvY2FsZSk7CiB9CiAK IC8qCkBAIC04MjksOCArODc4LDI4IEBAIGljdV9mcm9tX3VjaGFyKGNoYXIgKmRlc3QsIHNp emVfdCBkZXN0c2l6ZSwgY29uc3QgVUNoYXIgKmJ1ZmZfdWNoYXIsIGludDMyX3QgbGVuCiB9 CiAKIHN0YXRpYyBpbnQzMl90Ci1pY3VfY29udmVydF9jYXNlKElDVV9Db252ZXJ0X0Z1bmMg ZnVuYywgcGdfbG9jYWxlX3QgbXlsb2NhbGUsCi0JCQkJIFVDaGFyICoqYnVmZl9kZXN0LCBV Q2hhciAqYnVmZl9zb3VyY2UsIGludDMyX3QgbGVuX3NvdXJjZSkKK2ljdV9jb252ZXJ0X2Nh c2Vfbm9fdXRmOChJQ1VfQ29udmVydF9GdW5jIGZ1bmMsIGNoYXIgKmRlc3QsIHNpemVfdCBk ZXN0c2l6ZSwKKwkJCQkJCSBjb25zdCBjaGFyICpzcmMsIHNzaXplX3Qgc3JjbGVuLCBwZ19s b2NhbGVfdCBsb2NhbGUpCit7CisJaW50MzJfdAkJbGVuX3VjaGFyOworCWludDMyX3QJCWxl bl9jb252OworCVVDaGFyCSAgICpidWZmX3VjaGFyOworCVVDaGFyCSAgICpidWZmX2NvbnY7 CisJc2l6ZV90CQlyZXN1bHRfbGVuOworCisJbGVuX3VjaGFyID0gaWN1X3RvX3VjaGFyKCZi dWZmX3VjaGFyLCBzcmMsIHNyY2xlbik7CisJbGVuX2NvbnYgPSBpY3VfY29udmVydF9jYXNl X3VjaGFyKGZ1bmMsIGxvY2FsZSwgJmJ1ZmZfY29udiwKKwkJCQkJCQkJCSAgYnVmZl91Y2hh ciwgbGVuX3VjaGFyKTsKKwlyZXN1bHRfbGVuID0gaWN1X2Zyb21fdWNoYXIoZGVzdCwgZGVz dHNpemUsIGJ1ZmZfY29udiwgbGVuX2NvbnYpOworCXBmcmVlKGJ1ZmZfdWNoYXIpOworCXBm cmVlKGJ1ZmZfY29udik7CisKKwlyZXR1cm4gcmVzdWx0X2xlbjsKK30KKworc3RhdGljIGlu dDMyX3QKK2ljdV9jb252ZXJ0X2Nhc2VfdWNoYXIoSUNVX0NvbnZlcnRfRnVuYyBmdW5jLCBw Z19sb2NhbGVfdCBteWxvY2FsZSwKKwkJCQkJICAgVUNoYXIgKipidWZmX2Rlc3QsIFVDaGFy ICpidWZmX3NvdXJjZSwgaW50MzJfdCBsZW5fc291cmNlKQogewogCVVFcnJvckNvZGUJc3Rh dHVzOwogCWludDMyX3QJCWxlbl9kZXN0OwpAQCAtODcwLDEwICs5MzksMTcgQEAgdV9zdHJG b2xkQ2FzZV9kZWZhdWx0KFVDaGFyICpkZXN0LCBpbnQzMl90IGRlc3RDYXBhY2l0eSwKIAkJ CQkJICBjb25zdCBVQ2hhciAqc3JjLCBpbnQzMl90IHNyY0xlbmd0aCwKIAkJCQkJICBjb25z dCBjaGFyICpsb2NhbGUsCiAJCQkJCSAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkKK3sKKwly ZXR1cm4gdV9zdHJGb2xkQ2FzZShkZXN0LCBkZXN0Q2FwYWNpdHksIHNyYywgc3JjTGVuZ3Ro LAorCQkJCQkJIGljdV9mb2xkY2FzZV9vcHRpb25zKGxvY2FsZSksIHBFcnJvckNvZGUpOwor fQorCitzdGF0aWMgaW50MzJfdAoraWN1X2ZvbGRjYXNlX29wdGlvbnMoY29uc3QgY2hhciAq bG9jYWxlKQogewogCXVpbnQzMgkJb3B0aW9ucyA9IFVfRk9MRF9DQVNFX0RFRkFVTFQ7CiAJ Y2hhcgkJbGFuZ1szXTsKLQlVRXJyb3JDb2RlCXN0YXR1czsKKwlVRXJyb3JDb2RlCXN0YXR1 cyA9IFVfWkVST19FUlJPUjsKIAogCS8qCiAJICogVW5saWtlIHRoZSBJQ1UgQVBJcyBmb3Ig bG93ZXJjYXNpbmcsIHRpdGxlY2FzaW5nLCBhbmQgdXBwZXJjYXNpbmcsIGNhc2UKQEAgLTg4 MSw3ICs5NTcsNiBAQCB1X3N0ckZvbGRDYXNlX2RlZmF1bHQoVUNoYXIgKmRlc3QsIGludDMy X3QgZGVzdENhcGFjaXR5LAogCSAqIG9wdGlvbiByZWxldmFudCB0byBUdXJraWMgbGFuZ3Vh Z2VzICdheicgYW5kICd0cic7IGNoZWNrIGZvciB0aG9zZQogCSAqIGxhbmd1YWdlcyB0byBl bmFibGUgdGhlIG9wdGlvbi4KIAkgKi8KLQlzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAJdWxv Y19nZXRMYW5ndWFnZShsb2NhbGUsIGxhbmcsIDMsICZzdGF0dXMpOwogCWlmIChVX1NVQ0NF U1Moc3RhdHVzKSkKIAl7CkBAIC04OTMsOCArOTY4LDcgQEAgdV9zdHJGb2xkQ2FzZV9kZWZh dWx0KFVDaGFyICpkZXN0LCBpbnQzMl90IGRlc3RDYXBhY2l0eSwKIAkJCW9wdGlvbnMgPSBV X0ZPTERfQ0FTRV9FWENMVURFX1NQRUNJQUxfSTsKIAl9CiAKLQlyZXR1cm4gdV9zdHJGb2xk Q2FzZShkZXN0LCBkZXN0Q2FwYWNpdHksIHNyYywgc3JjTGVuZ3RoLAotCQkJCQkJIG9wdGlv bnMsIHBFcnJvckNvZGUpOworCXJldHVybiBvcHRpb25zOwogfQogCiAvKgpkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvdXRpbHMvcGdfbG9jYWxlLmggYi9zcmMvaW5jbHVkZS91dGlscy9w Z19sb2NhbGUuaAppbmRleCA4NjAxNmI5MzQ0ZS4uYTQ5OTVlMDQ2YWEgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL3V0aWxzL3BnX2xvY2FsZS5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxz L3BnX2xvY2FsZS5oCkBAIC0yMSw2ICsyMSw3IEBACiAjdW5kZWYgVV9TSE9XX0NQTFVTUExV U19IRUFERVJfQVBJCiAjZGVmaW5lIFVfU0hPV19DUExVU1BMVVNfSEVBREVSX0FQSSAwCiAj aW5jbHVkZSA8dW5pY29kZS91Y29sLmg+CisjaW5jbHVkZSA8dW5pY29kZS91Y2FzZW1hcC5o PgogI2VuZGlmCiAKIC8qIHVzZSBmb3IgbGliYyBsb2NhbGUgbmFtZXMgKi8KQEAgLTE2OCw2 ICsxNjksNyBAQCBzdHJ1Y3QgcGdfbG9jYWxlX3N0cnVjdAogCQkJY29uc3QgY2hhciAqbG9j YWxlOwogCQkJVUNvbGxhdG9yICAqdWNvbDsKIAkJCWxvY2FsZV90CWx0OworCQkJVUNhc2VN YXAgICAqdWNhc2VtYXA7CiAJCX0JCQlpY3U7CiAjZW5kaWYKIAl9OwotLSAKMi40Ny4zCgo= --------------P15xe4Go810hjUv7aKl7WbYp--