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 1w1GML-0009EU-1x for pgsql-hackers@arkaria.postgresql.org; Sat, 14 Mar 2026 04:12:18 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w1GLJ-000p7x-0y for pgsql-hackers@arkaria.postgresql.org; Sat, 14 Mar 2026 04:11:14 +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 1w1GLI-000p7p-2r for pgsql-hackers@lists.postgresql.org; Sat, 14 Mar 2026 04:11:13 +0000 Received: from mail-lf1-x130.google.com ([2a00:1450:4864:20::130]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w1GLG-000000004Lc-1luX for pgsql-hackers@postgresql.org; Sat, 14 Mar 2026 04:11:13 +0000 Received: by mail-lf1-x130.google.com with SMTP id 2adb3069b0e04-5a1322af04fso3397930e87.2 for ; Fri, 13 Mar 2026 21:11:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773461469; cv=none; d=google.com; s=arc-20240605; b=ghmvR/DXBe0tOZaY7bCANBhu/DzMzHkD6o82GtOUvpqWD0FpSuPRigJ7CG2oU+oFBQ ApNL+LqlIYEtdt+yAwUYTjMqjmyKUVbFCvpsDZVMsfF2uXhsvoDg26WLSdh1doVygGMB FLuO7COGAoN9Znp3c7wVVlBUPfOJvefFKdmSkoGO0XchMxkKzaiaVbV7ztb4jzkSpdhq FobjiW9SGp1PcdDPMVmO+4yVumabhcVEJJQx8ycgpdGCUaevFuqvCZ+DTQvOAstUTrUf VUP2EYV0gGbCPCdb3vlCFbMmiuQAQv7VyO1ghFa4gJ3vk86zgLbDK1pVrmnsgQWToMrT GdZw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=D3KvurkHOH05ba7fDvfEKxNYEtrlsxZMdztcMTcAhw0=; fh=CxfoJStH4fCSlq3yKEGqrExzAXOoVwKLmwCt3bqZcw8=; b=bGvxAufGSZDnukFqZFtinmEgQPYXYzwwpQSuZ7lxW0KYxxmHL5Ct9z9FWRGVIcISy7 14fumtVDAKwPq0lU8l1Q82E0GmdaRn02lVqkern8eVAfOOK8D1jhNqBTKiJ9GpydJkI2 ergqVmz05NonvtZsI/2FYROK6jKXO7HD5kcr3Q97gB9D4yhYbiR2vJRkBH8acAowPH/o TNf4kITmSBKf+zBe+v2ApgtkF7Ttc7fC78b/jG8KUpAAzmTfI8bKIG2Raie9s61d50O/ eorsagKluNARhEA1yZbpruWVsTVIJ2amTJPjRQioU86bAayYcL+tJEzsXwsc6TwhEyE1 i/3A==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773461469; x=1774066269; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=D3KvurkHOH05ba7fDvfEKxNYEtrlsxZMdztcMTcAhw0=; b=JoVJsspJrrtCdB6adt2jCzo+4DpfM3bm9nLxZkrOQ+xqaRZsX8Y5LzLuOHOEaJOFoP wxvoBXf7AtLCEqwf0UZmWKSC5KNtJDyP6LyKaJcdxOrAQLHZvYE12LkS9t7TJXQxv36c 1Wd36ZHBjAWt9kFvcvP8VhdQLeegxWEbFuODBCfqbZ3s/Q6Js/tit6eI7DtjUElAFFdy 2fiNSYKlTDIOXSfv0DGoIVwwqojunAKf8J6/k7oNEJfRjl5kkK/ImMwxFG3R//h0MTQA BGOEaAuNePxBk4o5olNhdgtSV05016rNmOZk+92BJ3DLk/nZaj34T7nUIJ5bw2HsReqM RFkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773461469; x=1774066269; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=D3KvurkHOH05ba7fDvfEKxNYEtrlsxZMdztcMTcAhw0=; b=r+XqiVdvo1KrLlyBKw8Ojuqdk6wCwYxqMODStr/8+J7OVXGPvYhIQwVHptvvadcT2F 4q5soa3p2QkuCrLaMkdPJwiadpJwgUNMpeREA7wJSQkVQNYujC+lmbKgvEASAZoLbKrm ke05ZHqSuvtOjDpwc8rZanxH3P2fgzbWRzQ5zrFeji8fp0lLdegQuBehLgmcrB7QiZsM m7BCpU7iVfqdyMrfbcCWDWSASbjZ6ZSqfbG26AWCvQm+5d47z7WEUJAYG13qW8o/O9gO wwHULhDMKLZV/9szt5YoI+TdxC77SQh/pFQQ5VgfPoQ0HqVRW34bvY1ZL+u8pyA/1m57 Wx4Q== X-Gm-Message-State: AOJu0YzR3jTeyHlbQ5Gg10cAM4qnT+WUtj2eLPFBMq5X/eWTFHQtcv7H L8z6IvHMBUYo7G8uvRDj0bAzUWfptC/wI02Gje+4PcH94rGjjdHkA3ZcFo2saUT7sg/kpqWJCoI p4EGxZ7MsFb92MRIRnZjDxlVhG0hDTtc= X-Gm-Gg: ATEYQzyofqbbNFiTUWqNKk1Eln71YfnzIx9fdFSofrb0bJEuaBdDsxfuJpgnsmsd5Lb emPjHuBvk2aJJBntMWprI1miDwslNHOCQoADJuuEnd3sRFqkcwICowlz7Se1V8fW/P/2gXZWiJx LTjW/f3JAmTuQPbhFi9uJDFs2M661UitvypGp+Cku3VKtii/SlWTHjqOnWF13bWBwhrR3VTdr/6 wlgBMJuIb6uLfdH5mBVDwx3YK7H+Idp/yM5oLB048W4ENcCP8wlwIcJ4VysfjYS5x1fgPr1TZcs khCTcee8 X-Received: by 2002:ac2:5047:0:b0:5a1:19eb:d4c0 with SMTP id 2adb3069b0e04-5a16270b5a6mr1748652e87.18.1773461468610; Fri, 13 Mar 2026 21:11:08 -0700 (PDT) MIME-Version: 1.0 References: <1791665551.452444.1761209220211.ref@mail.yahoo.com> <18022523-0F8F-4C07-AFF5-57DC9086D78E@yandex-team.ru> <1895971769.8343.1761240853939@mail.yahoo.com> <574624399.175025.1761290201491@mail.yahoo.com> <953203149.383019.1761345585325@mail.yahoo.com> <6F76FA61-E2DC-44EF-9504-889D9BDB4EBD@yandex-team.ru> <1154454839.957923.1761604611424@mail.yahoo.com> <87ldkv8cog.fsf@wibble.ilmari.org> <87ikfz7zcu.fsf@wibble.ilmari.org> <9CB824CC-70DC-4165-AC6A-9664F47209EE@yandex-team.ru> In-Reply-To: From: Masahiko Sawada Date: Fri, 13 Mar 2026 21:10:31 -0700 X-Gm-Features: AaiRm51FOx-z8ywEy-RfY1uBGDRSjMlljj0myKywChDwGTnnQ3NPx-CGkoDYHPo Message-ID: Subject: Re: Add uuid_to_base32hex() and base32hex_to_uuid() built-in functions To: Aleksander Alekseev Cc: pgsql-hackers , Andrey Borodin , =?UTF-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= Content-Type: multipart/mixed; boundary="000000000000dc1de3064cf42c6c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000dc1de3064cf42c6c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Feb 18, 2026 at 6:58=E2=80=AFAM Aleksander Alekseev wrote: > > Hi, > > > I only rebased v3 and improved the commit messages, but I didn't > > account for Masahiko Sawada's feedback for 0002. Andrey, are you still > > working on this or others can pick it up? > > > > The patch is not on the commitfest, so I'm about to add it. > > Here is patch v5 where I accounted for the previous feedback from > Masahiko Sawada and also made some other changes, see below. > > > How about the error message like "invalid input length for type uuid"? > > I think "uuid" should be lower case as it indicates PostgreSQL uuid > > data type, and it's better to use %s format instead of directly > > writing "uuid" (see string_to_uuid() for example). > > Makes sense. Fixed. > > > As for the errdetail message, should we add "bytea" also after "got %d"= ? > > You probably meant "got %d bytes", not "got %d bytea". I believe the > current message is fine, but maybe native speakers will correct us. > > > We already have tests for casting bytes to integer data types in > > strings.sql. I suggest moving the casting tests from bytea to uuid > > into therel. > > I disagree on the grounds that there are zero tests related to UUID in > strings.sql; uuid.sql is a more appropriate place for these tests IMO. > However if someone seconds the idea we can easily move the tests at > any time. > > > For the uuid.sql file, we could add a test to verify that > > a UUID value remains unchanged when it's cast to bytea and back to > > UUID. For example, > > > > SELECT v =3D v::bytea::uuid as matched FROM gen_random_uuid() v; > > Good point. Added. > > > base32hex_encode() doesn't seem to add '=3D' paddings, but is it > > intentional? I don't see any description in RFC 4648 that we can omit > > '=3D' paddings. > > You are right, both base32 and base32hex should add paddings; > substring() can be used if necessary. Fixed. > > > I think the patch should add tests not only for uuid data type but > > also for general cases like other encodings. > > Yes, and the good place for these tests would be closer to other tests > for encode() and decode() i.e. strings.sql. Fixed. > > While working on it I noticed some inconsistencies between base32hex > implementation and our current implementation of base64. As an > example, we don't allow `=3D` input: > > ``` > =3D# SELECT decode('=3D', 'base64'); > ERROR: unexpected "=3D" while decoding base64 sequence > ``` > > ... while base32hex did. I fixed such inconsistencies too. > > > In uuid.sql tests, how about adding some tests to check if base32hex > > maintains the sortability of UUIDv7 data? > > Agree. Added. > > > I think we should update the documentation in the uuid section about > > casting data between bytea and uuid. For references, we have a similar > > description for bytea and integer[1]. > > Fair point. Fixed. > Thank you for updating the patch! I've reviewed both patches and have some comments. * 0001 patch + ereport(ERROR, + (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), + errmsg("invalid input length for type %s", "uuid"), + errdetail("Expected %d bytes, got %d.", UUID_LEN, len))); I think we need to handle plural and singular forms depending on the value. Or we can change it to "Expected size %d, got %d". * 0002 patch: errhint("Valid encodings are \"%s\", \"%s\", \"%s\", and \"%s\".", "base64", "base64url", "escape", "hex"))); We need to add 'base32hex' here. --- + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unexpected \"=3D\" while decoding %s sequence", + "base32hex"))); I think we can directly write 'base32hex' in the error message. --- + /* Verify no extra bits remain (padding bits should be zero) */ + if (bits_in_buffer > 0 && (bits_buffer & ((1ULL << bits_in_buffer) - 1)) !=3D 0) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid base32hex end sequence"), + errhint("Input data has non-zero padding bits."))); This code checks if the remaining bits of the input data are all zero. IIUC we don't have a similar check for base64 and base64url. For instance, the following input data is accepted: =3D# select decode('AB', 'base64'); decode -------- \x00 (1 row) I think it's better to have consistent behavior across our encoding. I've attached a patch for the 0002 patch part that fixes the above points (except for the last point) and has some minor fixes as well. Regards, --=20 Masahiko Sawada Amazon Web Services: https://aws.amazon.com --000000000000dc1de3064cf42c6c Content-Type: text/x-patch; charset="US-ASCII"; name="fix_0002_masahiko.patch" Content-Disposition: attachment; filename="fix_0002_masahiko.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmpt4bwn0 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtYmluYXJ5c3RyaW5nLnNnbWwgYi9k b2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWJpbmFyeXN0cmluZy5zZ21sCmluZGV4IDUxYmUwNDYzZWVj Li43YWEzODA1ZjFlYyAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1iaW5hcnlz dHJpbmcuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWJpbmFyeXN0cmluZy5zZ21s CkBAIC04MTUsMTQgKzgxNSwxNiBAQAogICAgICAgIFRoZSA8bGl0ZXJhbD5iYXNlMzJoZXg8L2xp dGVyYWw+IGZvcm1hdCBpcyB0aGF0IG9mCiAgICAgICAgPHVsaW5rIHVybD0iaHR0cHM6Ly9kYXRh dHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM0NjQ4I3NlY3Rpb24tNyI+CiAgICAgICAgUkZD IDQ2NDggU2VjdGlvbiA3PC91bGluaz4uICBJdCB1c2VzIHRoZSBleHRlbmRlZCBoZXggYWxwaGFi ZXQKLSAgICAgICAoMC05LCBBLVYpIHdoaWNoIHByZXNlcnZlcyBzb3J0IG9yZGVyIHdoZW4gZW5j b2RpbmcgYmluYXJ5IGRhdGEuCi0gICAgICAgVGhlIDxmdW5jdGlvbj5lbmNvZGU8L2Z1bmN0aW9u PiBmdW5jdGlvbiBwcm9kdWNlcyBwYWRkZWQgb3V0cHV0LAotICAgICAgIHdoaWxlIDxmdW5jdGlv bj5kZWNvZGU8L2Z1bmN0aW9uPiBhY2NlcHRzIGJvdGggcGFkZGVkIGFuZCB1bnBhZGRlZAotICAg ICAgIGlucHV0LiBEZWNvZGluZyBpcyBjYXNlLWluc2Vuc2l0aXZlIGFuZCBpZ25vcmVzIHdoaXRl c3BhY2UgY2hhcmFjdGVycy4KKyAgICAgICAoPGxpdGVyYWw+MDwvbGl0ZXJhbD4tPGxpdGVyYWw+ OTwvbGl0ZXJhbD4gYW5kCisgICAgICAgPGxpdGVyYWw+QTwvbGl0ZXJhbD4tPGxpdGVyYWw+Vjwv bGl0ZXJhbD4pIHdoaWNoIHByZXNlcnZlcyBzb3J0IG9yZGVyCisgICAgICAgd2hlbiBlbmNvZGlu ZyBiaW5hcnkgZGF0YS4gVGhlIDxmdW5jdGlvbj5lbmNvZGU8L2Z1bmN0aW9uPiBmdW5jdGlvbgor ICAgICAgIHByb2R1Y2VzIHBhZGRlZCBvdXRwdXQsIHdoaWxlIDxmdW5jdGlvbj5kZWNvZGU8L2Z1 bmN0aW9uPiBhY2NlcHRzIGJvdGgKKyAgICAgICBwYWRkZWQgYW5kIHVucGFkZGVkIGlucHV0LiBE ZWNvZGluZyBpcyBjYXNlLWluc2Vuc2l0aXZlIGFuZCBpZ25vcmVzCisgICAgICAgd2hpdGVzcGFj ZSBjaGFyYWN0ZXJzLgogICAgICAgPC9wYXJhPgogICAgICAgPHBhcmE+CiAgICAgICAgVGhpcyBm b3JtYXQgY2FuIGJlIHVzZWQgZm9yIGVuY29kaW5nIFVVSURzIGluIGEgY29tcGFjdCwgc29ydGFi bGUgZm9ybWF0OgotICAgICAgIDxsaXRlcmFsPnN1YnN0cmluZyhlbmNvZGUodXVpZF92YWx1ZSA6 OiBieXRlYSwgJ2Jhc2UzMmhleCcpIGZyb20gMSBmb3IgMjYpPC9saXRlcmFsPgorICAgICAgIDxs aXRlcmFsPnN1YnN0cmluZyhlbmNvZGUodXVpZF92YWx1ZTo6Ynl0ZWEsICdiYXNlMzJoZXgnKSBG Uk9NIDEgRk9SIDI2KTwvbGl0ZXJhbD4KICAgICAgICBwcm9kdWNlcyBhIDI2LWNoYXJhY3RlciBz dHJpbmcgY29tcGFyZWQgdG8gdGhlIHN0YW5kYXJkIDM2LWNoYXJhY3RlcgogICAgICAgIFVVSUQg cmVwcmVzZW50YXRpb24uCiAgICAgICA8L3BhcmE+CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91 dGlscy9hZHQvZW5jb2RlLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvZW5jb2RlLmMKaW5kZXgg NjE1M2E1Y2I1ZjIuLmVhMTFiYzNmM2I1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9h ZHQvZW5jb2RlLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2VuY29kZS5jCkBAIC02NSw4 ICs2NSw4IEBAIGJpbmFyeV9lbmNvZGUoUEdfRlVOQ1RJT05fQVJHUykKIAkJZXJlcG9ydChFUlJP UiwKIAkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwKIAkJCQkg ZXJybXNnKCJ1bnJlY29nbml6ZWQgZW5jb2Rpbmc6IFwiJXNcIiIsIG5hbWVidWYpLAotCQkJCSBl cnJoaW50KCJWYWxpZCBlbmNvZGluZ3MgYXJlIFwiJXNcIiwgXCIlc1wiLCBcIiVzXCIsIGFuZCBc IiVzXCIuIiwKLQkJCQkJCSAiYmFzZTY0IiwgImJhc2U2NHVybCIsICJlc2NhcGUiLCAiaGV4Iikp KTsKKwkJCQkgZXJyaGludCgiVmFsaWQgZW5jb2RpbmdzIGFyZSBcIiVzXCIsIFwiJXNcIiwgXCIl c1wiLCBcIiVzXCIsIGFuZCBcIiVzXCIuIiwKKwkJCQkJCSAiYmFzZTY0IiwgImJhc2U2NHVybCIs ICJiYXNlMzJoZXgiLCAiZXNjYXBlIiwgImhleCIpKSk7CiAKIAlkYXRhcHRyID0gVkFSREFUQV9B TlkoZGF0YSk7CiAJZGF0YWxlbiA9IFZBUlNJWkVfQU5ZX0VYSERSKGRhdGEpOwpAQCAtMTE1LDgg KzExNSw4IEBAIGJpbmFyeV9kZWNvZGUoUEdfRlVOQ1RJT05fQVJHUykKIAkJZXJlcG9ydChFUlJP UiwKIAkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwKIAkJCQkg ZXJybXNnKCJ1bnJlY29nbml6ZWQgZW5jb2Rpbmc6IFwiJXNcIiIsIG5hbWVidWYpLAotCQkJCSBl cnJoaW50KCJWYWxpZCBlbmNvZGluZ3MgYXJlIFwiJXNcIiwgXCIlc1wiLCBcIiVzXCIsIGFuZCBc IiVzXCIuIiwKLQkJCQkJCSAiYmFzZTY0IiwgImJhc2U2NHVybCIsICJlc2NhcGUiLCAiaGV4Iikp KTsKKwkJCQkgZXJyaGludCgiVmFsaWQgZW5jb2RpbmdzIGFyZSBcIiVzXCIsIFwiJXNcIiwgXCIl c1wiLCBcIiVzXCIsIGFuZCBcIiVzXCIuIiwKKwkJCQkJCSAiYmFzZTY0IiwgImJhc2U2NHVybCIs ICJiYXNlMzJoZXgiLCAiZXNjYXBlIiwgImhleCIpKSk7CiAKIAlkYXRhcHRyID0gVkFSREFUQV9B TlkoZGF0YSk7CiAJZGF0YWxlbiA9IFZBUlNJWkVfQU5ZX0VYSERSKGRhdGEpOwpAQCAtODczLDE1 ICs4NzMsMTEgQEAgYmFzZTMyaGV4X2VuY29kZShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNs ZW4sIGNoYXIgKmRzdCkKIAogCS8qIEhhbmRsZSByZW1haW5pbmcgYml0cyAoaWYgYW55KSAqLwog CWlmIChiaXRzX2luX2J1ZmZlciA+IDApCi0JewogCQlkc3Rbb3V0cHV0X3BvcysrXSA9IGJhc2Uz MmhleF90YWJsZVsoYml0c19idWZmZXIgPDwgKDUgLSBiaXRzX2luX2J1ZmZlcikpICYgMHgxRl07 Ci0JfQogCiAJLyogQWRkIHBhZGRpbmcgdG8gbWFrZSBsZW5ndGggYSBtdWx0aXBsZSBvZiA4IChw ZXIgUkZDIDQ2NDgpICovCiAJd2hpbGUgKG91dHB1dF9wb3MgJSA4ICE9IDApCi0JewogCQlkc3Rb b3V0cHV0X3BvcysrXSA9ICc9JzsKLQl9CiAKIAlyZXR1cm4gb3V0cHV0X3BvczsKIH0KQEAgLTkw OSw4ICs5MDUsOCBAQCBiYXNlMzJoZXhfZGVjb2RlKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNy Y2xlbiwgY2hhciAqZHN0KQogCQlpZiAoYyA9PSAnPScpCiAJCXsKIAkJCS8qCi0JCQkgKiBQYWRk aW5nIGlzIG9ubHkgdmFsaWQgYXQgcG9zaXRpb25zIDIsIDQsIDUsIG9yIDcgd2l0aGluIGFuCi0J CQkgKiA4LWNoYXJhY3RlciBncm91cCAoY29ycmVzcG9uZGluZyB0byAxLCAyLCAzLCBvciA0IGlu cHV0IGJ5dGVzKS4KKwkJCSAqIFRoZSBmaXJzdCBwYWRkaW5nIGlzIG9ubHkgdmFsaWQgYXQgcG9z aXRpb25zIDIsIDQsIDUsIG9yIDcgd2l0aGluCisJCQkgKiBhbiA4LWNoYXJhY3RlciBncm91cCAo Y29ycmVzcG9uZGluZyB0byAxLCAyLCAzLCBvciA0IGlucHV0IGJ5dGVzKS4KIAkJCSAqIFdlIG9u bHkgY2hlY2sgdGhlIHBvc2l0aW9uIGZvciB0aGUgZmlyc3QgJz0nIGNoYXJhY3Rlci4KIAkJCSAq LwogCQkJaWYgKCFlbmQpCkBAIC05MTgsOCArOTE0LDcgQEAgYmFzZTMyaGV4X2RlY29kZShjb25z dCBjaGFyICpzcmMsIHNpemVfdCBzcmNsZW4sIGNoYXIgKmRzdCkKIAkJCQlpZiAocG9zICE9IDIg JiYgcG9zICE9IDQgJiYgcG9zICE9IDUgJiYgcG9zICE9IDcpCiAJCQkJCWVyZXBvcnQoRVJST1Is CiAJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCi0JCQkJ CQkJIGVycm1zZygidW5leHBlY3RlZCBcIj1cIiB3aGlsZSBkZWNvZGluZyAlcyBzZXF1ZW5jZSIs Ci0JCQkJCQkJCQkiYmFzZTMyaGV4IikpKTsKKwkJCQkJCQkgZXJybXNnKCJ1bmV4cGVjdGVkIFwi PVwiIHdoaWxlIGRlY29kaW5nIGJhc2UzMmhleCBzZXF1ZW5jZSIpKSk7CiAJCQkJZW5kID0gdHJ1 ZTsKIAkJCX0KIAkJCXBvcysrOwpAQCAtOTMwLDkgKzkyNSw4IEBAIGJhc2UzMmhleF9kZWNvZGUo Y29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc3JjbGVuLCBjaGFyICpkc3QpCiAJCWlmIChlbmQpCiAJ CQllcmVwb3J0KEVSUk9SLAogCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVS X1ZBTFVFKSwKLQkJCQkJIGVycm1zZygiaW52YWxpZCBzeW1ib2wgXCIlLipzXCIgZm91bmQgd2hp bGUgZGVjb2RpbmcgJXMgc2VxdWVuY2UiLAotCQkJCQkJCXBnX21ibGVuKChjb25zdCBjaGFyICop ICZjKSwgKGNvbnN0IGNoYXIgKikgJmMsCi0JCQkJCQkJImJhc2UzMmhleCIpKSk7CisJCQkJCSBl cnJtc2coImludmFsaWQgc3ltYm9sIFwiJS4qc1wiIGZvdW5kIHdoaWxlIGRlY29kaW5nIGJhc2Uz MmhleCBzZXF1ZW5jZSIsCisJCQkJCQkJcGdfbWJsZW4oKGNvbnN0IGNoYXIgKikgJmMpLCAoY29u c3QgY2hhciAqKSAmYykpKTsKIAogCQkvKiBEZWNvZGUgYmFzZTMyaGV4IGNoYXJhY3RlciAoMC05 LCBBLVYsIGNhc2UtaW5zZW5zaXRpdmUpICovCiAJCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykK QEAgLTk0NCw5ICs5MzgsOCBAQCBiYXNlMzJoZXhfZGVjb2RlKGNvbnN0IGNoYXIgKnNyYywgc2l6 ZV90IHNyY2xlbiwgY2hhciAqZHN0KQogCQllbHNlCiAJCQllcmVwb3J0KEVSUk9SLAogCQkJCQko ZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwKLQkJCQkJIGVycm1zZygi aW52YWxpZCBzeW1ib2wgXCIlLipzXCIgZm91bmQgd2hpbGUgZGVjb2RpbmcgJXMgc2VxdWVuY2Ui LAotCQkJCQkJCXBnX21ibGVuKChjb25zdCBjaGFyICopICZjKSwgKGNvbnN0IGNoYXIgKikgJmMs Ci0JCQkJCQkJImJhc2UzMmhleCIpKSk7CisJCQkJCSBlcnJtc2coImludmFsaWQgc3ltYm9sIFwi JS4qc1wiIGZvdW5kIHdoaWxlIGRlY29kaW5nIGJhc2UzMmhleCBzZXF1ZW5jZSIsCisJCQkJCQkJ cGdfbWJsZW4oKGNvbnN0IGNoYXIgKikgJmMpLCAoY29uc3QgY2hhciAqKSAmYykpKTsKIAogCQkv KiBBZGQgNSBiaXRzIHRvIGJ1ZmZlciAqLwogCQliaXRzX2J1ZmZlciA9IChiaXRzX2J1ZmZlciA8 PCA1KSB8IHZhbDsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3RyaW5n cy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N0cmluZ3Mub3V0CmluZGV4IDkxMDc1 NzUzN2U3Li41M2IxYTE0Yzg5NSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9zdHJpbmdzLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N0cmluZ3Mub3V0 CkBAIC0yNjAwLDEwICsyNjAwLDEwIEBAIFNFTEVDVCBkZWNvZGUoZW5jb2RlKCdceDEyMzQ1Njc4 OTBhYmNkZWYwMCcsICdlc2NhcGUnKSwgJ2VzY2FwZScpOwogLS0gcmVwb3J0IGFuIGVycm9yIHdp dGggYSBoaW50IGxpc3RpbmcgdmFsaWQgZW5jb2RpbmdzIHdoZW4gYW4gaW52YWxpZCBlbmNvZGlu ZyBpcyBzcGVjaWZpZWQKIFNFTEVDVCBlbmNvZGUoJ1x4MDEnOjpieXRlYSwgJ2ludmFsaWQnKTsg IC0tIGVycm9yCiBFUlJPUjogIHVucmVjb2duaXplZCBlbmNvZGluZzogImludmFsaWQiCi1ISU5U OiAgVmFsaWQgZW5jb2RpbmdzIGFyZSAiYmFzZTY0IiwgImJhc2U2NHVybCIsICJlc2NhcGUiLCBh bmQgImhleCIuCitISU5UOiAgVmFsaWQgZW5jb2RpbmdzIGFyZSAiYmFzZTY0IiwgImJhc2U2NHVy bCIsICJiYXNlMzJoZXgiLCAiZXNjYXBlIiwgYW5kICJoZXgiLgogU0VMRUNUIGRlY29kZSgnMDAn LCAnaW52YWxpZCcpOyAgICAgICAgICAgLS0gZXJyb3IKIEVSUk9SOiAgdW5yZWNvZ25pemVkIGVu Y29kaW5nOiAiaW52YWxpZCIKLUhJTlQ6ICBWYWxpZCBlbmNvZGluZ3MgYXJlICJiYXNlNjQiLCAi YmFzZTY0dXJsIiwgImVzY2FwZSIsIGFuZCAiaGV4Ii4KK0hJTlQ6ICBWYWxpZCBlbmNvZGluZ3Mg YXJlICJiYXNlNjQiLCAiYmFzZTY0dXJsIiwgImJhc2UzMmhleCIsICJlc2NhcGUiLCBhbmQgImhl eCIuCiAtLQogLS0gYmFzZTMyaGV4IGVuY29kaW5nL2RlY29kaW5nCiAtLQpAQCAtMjY5OCw2ICsy Njk4LDEyIEBAIFNFTEVDVCBkZWNvZGUoJzI0JywgJ2Jhc2UzMmhleCcpOyAgLS0gT0ssIHBhZGRp bmcgYD1gIGFyZSBvcHRpb25hbAogIFx4MTEKICgxIHJvdykKIAorU0VMRUNUIGRlY29kZSgnMjQ9 PT09PT09JywgJ2Jhc2UzMmhleCcpOyAgLS0gT0sKKyBkZWNvZGUgCistLS0tLS0tLQorIFx4MTEK KygxIHJvdykKKwogU0VMRUNUIGRlY29kZSgnMjRoMzZoMmxjbycsICdiYXNlMzJoZXgnKTsgIC0t IE9LLCB0aGUgZW5jb2RpbmcgaXMgY2FzZS1pbnNlbnNpdGl2ZQogICAgICBkZWNvZGUgICAgIAog LS0tLS0tLS0tLS0tLS0tLQpAQCAtMjcxMCw2ICsyNzE2LDkgQEAgU0VMRUNUIGRlY29kZSgnVycs ICdiYXNlMzJoZXgnKTsgIC0tIGVycm9yCiBFUlJPUjogIGludmFsaWQgc3ltYm9sICJXIiBmb3Vu ZCB3aGlsZSBkZWNvZGluZyBiYXNlMzJoZXggc2VxdWVuY2UKIFNFTEVDVCBkZWNvZGUoJzI0SDM2 SDA9MjQnLCAnYmFzZTMyaGV4Jyk7IC0tIGVycm9yCiBFUlJPUjogIGludmFsaWQgc3ltYm9sICIy IiBmb3VuZCB3aGlsZSBkZWNvZGluZyBiYXNlMzJoZXggc2VxdWVuY2UKK1NFTEVDVCBkZWNvZGUo JzExPScsICdiYXNlMzJoZXgnKTsgLS0gZXJyb3IKK0VSUk9SOiAgaW52YWxpZCBiYXNlMzJoZXgg ZW5kIHNlcXVlbmNlCitISU5UOiAgSW5wdXQgZGF0YSBoYXMgbm9uLXplcm8gcGFkZGluZyBiaXRz LgogLS0KIC0tIGJhc2U2NHVybCBlbmNvZGluZy9kZWNvZGluZwogLS0KZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL3N0cmluZ3Muc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3Ry aW5ncy5zcWwKaW5kZXggYjUyMzdlODUxNzIuLjZlYmMxOTJhOWIxIDEwMDY0NAotLS0gYS9zcmMv dGVzdC9yZWdyZXNzL3NxbC9zdHJpbmdzLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9z dHJpbmdzLnNxbApAQCAtODU2LDEwICs4NTYsMTIgQEAgU0VMRUNUIGRlY29kZSgnMjRIMzZIMkwn LCAnYmFzZTMyaGV4Jyk7ICAtLSBceDExMjIzMzQ0NTUKIFNFTEVDVCBkZWNvZGUoJzI0SDM2SDJM Q089PT09PT0nLCAnYmFzZTMyaGV4Jyk7ICAtLSBceDExMjIzMzQ0NTU2NgogCiBTRUxFQ1QgZGVj b2RlKCcyNCcsICdiYXNlMzJoZXgnKTsgIC0tIE9LLCBwYWRkaW5nIGA9YCBhcmUgb3B0aW9uYWwK K1NFTEVDVCBkZWNvZGUoJzI0PT09PT09PScsICdiYXNlMzJoZXgnKTsgIC0tIE9LCiBTRUxFQ1Qg ZGVjb2RlKCcyNGgzNmgybGNvJywgJ2Jhc2UzMmhleCcpOyAgLS0gT0ssIHRoZSBlbmNvZGluZyBp cyBjYXNlLWluc2Vuc2l0aXZlCiBTRUxFQ1QgZGVjb2RlKCc9JywgJ2Jhc2UzMmhleCcpOyAgLS0g ZXJyb3IKIFNFTEVDVCBkZWNvZGUoJ1cnLCAnYmFzZTMyaGV4Jyk7ICAtLSBlcnJvcgogU0VMRUNU IGRlY29kZSgnMjRIMzZIMD0yNCcsICdiYXNlMzJoZXgnKTsgLS0gZXJyb3IKK1NFTEVDVCBkZWNv ZGUoJzExPScsICdiYXNlMzJoZXgnKTsgLS0gZXJyb3IKIAogCiAtLQo= --000000000000dc1de3064cf42c6c--