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 1wPoIM-0012sL-2m for pgsql-hackers@arkaria.postgresql.org; Wed, 20 May 2026 21:17:39 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wPoIJ-008Zub-1y for pgsql-hackers@arkaria.postgresql.org; Wed, 20 May 2026 21:17: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 1wPoIJ-008ZuS-0q for pgsql-hackers@lists.postgresql.org; Wed, 20 May 2026 21:17:36 +0000 Received: from mail-oi1-x232.google.com ([2607:f8b0:4864:20::232]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wPoIH-00000000bwG-43MS for pgsql-hackers@postgresql.org; Wed, 20 May 2026 21:17:35 +0000 Received: by mail-oi1-x232.google.com with SMTP id 5614622812f47-479e4835e26so3486481b6e.3 for ; Wed, 20 May 2026 14:17:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779311852; cv=none; d=google.com; s=arc-20240605; b=iY41SdpMpG/yPJ8PSv1n2muPBBMgtn8h4DxbRg5LYGVTA1qBBndH988J8FjrQbQ+56 3KreTElBqdp/ZofQ1283qu2BKTz9kfg8jXskIIS3xdyp2LxoX1UExLT2f6aDcYpFhjJb DCv4eQr5BYISic3PN53dCVTPzCu9CG1kKJtnLnatFwb71WIuPJkG1dh2ICjutbcw1Y3z 5x9a9u0ZrlZ6NOrBzaiGYIGIw34ABoTaUmSicDZCpQ+go5JWgYEdDHMppRa7F7gQ00Ut kY3JOO7jUr6au1ZFJ/5hWzvIQ3HjcJLNl/GPkJlVXiNlUvN8IH7EHkdo8pRE8qTKofp4 6Oew== 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=ls66+Fvp1fv4IyfEMY/Ve7+dXv/+HghATMTzgAKrqdo=; fh=hYfqLVZ6zFdAE3OZ/2HDTLodLy8C5U8ptmkfK2j/wEU=; b=Wm2Rm1hTUkgB5r4B605ryvQvoZt6Zl3YFoOAg/tMp5/Ukgrh0o1nnwFYDFy5/x5bop SVcJUxPJADt38mtFcIuAocyxVUuptkwhkess44RNgZMJqaXguHm7A6s7pqUpI+YqdKdQ aAO+MBpFvQL/hPEwHqFgFQU4G8k+luJMk4F5BYGpsD8Zc3oA87oug0mtoNWaY1ljwoG4 icTX7xCCIF7Cl4ShMYjczjKCGlift3e5qDgE1Cg1/qukVaBZwABHnippGQ1s0Nq7GGji 5SffNYIt+Nqs9Ow8CICvD+eFMNIxytOJ6HYALJMzT4+CF0X+NIPZz8mT1S+TK3D5XJ/Q IXsg==; 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=20251104; t=1779311852; x=1779916652; 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=ls66+Fvp1fv4IyfEMY/Ve7+dXv/+HghATMTzgAKrqdo=; b=R+RfAxkEOzVq3TN/LH2ZofICbR8WCbYQqX25ndLDx1ymicvdOH4Oka1JuDfZb7OCE2 jAxX+gZl3avo5uTuMRlkQ7r7QrxqAdq7yvPlZtjv8ZSXvWCrdc/VUsp3OyWzN2BFLopM kckb2jV4lovorqWDP+4VvPlVEVq4928aYM/Rm59JtI1vwSpOg2VY3CUWZuOhJizlBuQM /MyiBQ/9IopOd72b/echJvhS4/tBX/Mu6HbvGOEgrvkM/ECL02xHWxH7SsgCINddQ1nt az94hObzY+3HC6f8juYWnwHb9H8BcUlgl1iSTWGYwLdXZrYGCA3O78+sQR0Wa6CY/pW+ uCYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779311852; x=1779916652; 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=ls66+Fvp1fv4IyfEMY/Ve7+dXv/+HghATMTzgAKrqdo=; b=DCyHmVjH3GYwf38jhqCODDyUK8baK1dPB6vBBIMnUR3nsjr3vq7vguOIP4qytDCwju Q3DApX2RcS/W4JI7rtBTMr8sItA52uX58yV8HAWgSaeFNFSNxXP0Fvu1VbcrscBtrRZB OxsFfjOCsgHdaDidmjihKAVtoZZb8lS6fgVST4xP/9cSb2Vo+UXmh1oXw+DA3Qh9nx2t 8FKwFuaDxmCeT1Xv694fRiObhIe+rlfQt1rfmO3UbBqdSkp/4ubIkbHwb8Lu6k7cnuzt qaGUH/4Gs7ACRp4wSPvToxOAzALe11li52G57jW7Lkt7KCXu2xbR+R/s7UUS7hv9CjW/ BxwA== X-Forwarded-Encrypted: i=1; AFNElJ//gvQMLtXisdo/SdJY42XyoD/Idoe1Bt+ooWUoV4VtS/nVauzgTQGtNlvWE6gzYWXASVzyrB9LTVqlecpr@postgresql.org X-Gm-Message-State: AOJu0YyUvhY8WwBFVv/DHKk2oZYozWOfgt6nZDKjFrp1gGVxkc7Zj7pq va/sK1m5LvRd/JpsEs0OU3fPn2KUPyAND3tv5W03C7eFpmp+9bsqnLAi13vAjpngZijbHWFm3Kv 0UX4Icvw7WOzt0Axkg9QKDz2XMsxYX3A= X-Gm-Gg: Acq92OELRevcSo/BkViVwOeM5mYceT8L6MQwmMk8XPhS4C9uxarG5QI5PboWMJOWcKW srn5zbx8dqWY4RiJLaOCOZqbCc3uKYljoXe1hC/LBBnxfBtuqoquqIQVhIZKZFKZBWGfECehkwG UA7cfE2FMM3vgStPO0Vewj93SeGevLF978L5o/0ZlzLvayX1sKs6J52Rs8/krGvvPAe/Owg451T C+B13gv00xbqvRSQUgHge78ytXtJc1Fg5SCOyIfvKTTo8i5C1w27QLiWSKlATtY19yJ4+yxE3u3 1/58qhtTCJ1/RPCHwh4Grtlk6XzhNDi8gTI7L1ekggnGqxVjkC8ARp4QCZ/2M+p0LfORIVcOkjq DG3DB4Doz93AZyjguI+LZgNXrfbsHZRY+yj1FG5HA X-Received: by 2002:a05:6820:1893:b0:696:77e2:a88 with SMTP id 006d021491bc7-69c9bfe9f01mr16133232eaf.54.1779311851982; Wed, 20 May 2026 14:17:31 -0700 (PDT) MIME-Version: 1.0 References: <4df20e70-a083-4334-9548-5f8b9025847c@postgrespro.ru> <4B04275C-E044-4EEE-BE64-6FEEE73DCBB0@gmail.com> <09307DC2-64A1-4D6A-9EAF-9A86A173A7FC@gmail.com> <8204A871-4650-4B3F-8260-8D5FD40908B3@gmail.com> <4AEA11EB-0439-401B-996E-F1835F510E8D@gmail.com> In-Reply-To: From: Alexander Korotkov Date: Thu, 21 May 2026 00:17:20 +0300 X-Gm-Features: AVHnY4J7eArVHfFpNQAaWctbYw-U-6PvRYqkYSvkxp5pl8Qwd-OGi9yaXVk6GIE Message-ID: Subject: Re: Fix SPLIT PARTITION bound-overlap bug and other improvements To: Chao Li Cc: Dmitry Koval , PostgreSQL-development Content-Type: multipart/mixed; boundary="000000000000e1ea7e0652465268" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e1ea7e0652465268 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, May 20, 2026 at 11:29=E2=80=AFPM Alexander Korotkov wrote: > On Wed, May 20, 2026 at 2:46=E2=80=AFPM Alexander Korotkov wrote: > > On Wed, May 20, 2026 at 9:29=E2=80=AFAM Chao Li wrote: > > > > On May 20, 2026, at 14:19, Alexander Korotkov wrote: > > > > On Wed, May 20, 2026 at 2:37=E2=80=AFAM Chao Li wrote: > > > >>> On May 19, 2026, at 19:00, Alexander Korotkov wrote: > > > >>> On Tue, May 19, 2026 at 5:50=E2=80=AFAM Chao Li wrote: > > > >>>>> On May 18, 2026, at 20:04, Alexander Korotkov wrote: > > > >>>>> > > > >>>>> On Mon, May 18, 2026 at 2:57=E2=80=AFPM Chao Li wrote: > > > >>>>>>> > > > >>>>>> > > > >>>>>> v3-0001 through v3-0003 look good to me. > > > >>>>>> > > > >>>>>> For v3-0004, I have a suspicion, but it's late here and my bra= in is getting slow, so I would like to study it more tomorrow. > > > >>>>> > > > >>>>> Sure, take your time. > > > >>>>> > > > >>>>> ------ > > > >>>>> Regards, > > > >>>>> Alexander Korotkov > > > >>>>> Supabase > > > >>>> > > > >>>> My suspicion was that check_split_partition_not_same_bound() now= has two paths. The RANGE path honors collation, while the LIST path does n= ot. So I spent some time creating a test that uses a case-insensitive colla= tion: > > > >>>> ``` > > > >>>> evantest=3D# create collation case_insensitive (provider=3Dicu, = locale=3D'und-u-ks-level2', deterministic =3D false); > > > >>>> CREATE COLLATION > > > >>>> evantest=3D# create table t (b text collate case_insensitive) pa= rtition by list (b); > > > >>>> CREATE TABLE > > > >>>> evantest=3D# create table tp_ab partition of t for values in ('a= ', 'b'); > > > >>>> CREATE TABLE > > > >>>> evantest=3D# alter table t split partition tp_ab into > > > >>>> evantest-# (partition tp_a for values in ('a', 'A'), > > > >>>> evantest(# partition tp_default default); > > > >>>> ERROR: cannot split partition "tp_ab" only to add a DEFAULT par= tition > > > >>>> LINE 2: (partition tp_a for values in ('a', 'A'), > > > >>>> ^ > > > >>>> DETAIL: The non-DEFAULT partition would keep the same partition= bound. > > > >>>> HINT: Use CREATE TABLE ... PARTITION OF ... DEFAULT to add a DE= FAULT partition. > > > >>>> ``` > > > >>>> > > > >>>> In this test, the split partition=E2=80=99s bound is ('a', 'b'),= and the new partition=E2=80=99s bound is ('a', 'A'). Their list lengths ar= e both 2, but the two bounds are actually different, because 'a' and 'A' ar= e considered equal by the collation. > > > >>>> > > > >>>> So, in the LIST path, since check_partition_bounds_for_split_lis= t() has already ensured that the new partition=E2=80=99s bound is contained= within the split partition=E2=80=99s bound, we need to check the reverse d= irection as well. Whether the split partition=E2=80=99s bound is also conta= ined in the new partition=E2=80=99s bound. If yes, the two bounds are ident= ical. > > > >>>> > > > >>>> See the attached v4 for my changes for 0004. 0001-0003 are uncha= nged. Since 0001 and 0003 are independent of 0004, maybe they can be pushed= first. > > > >>> > > > >>> I've pushed 0001-0003. > > > >> > > > >> Thanks for pushing them. > > > >> > > > >>> Thank you for discovering the collation issue > > > >>> in 0004. Note that original approach of using > > > >>> partition_bounds_equal() can't handle different collations too (a= s it > > > >>> internally uses datumIsEqual()). > > > >> > > > >> Yes, I realized that while reviewing v3. That=E2=80=99s reason I d= idn=E2=80=99t get back v2 and only worked again based on v3. > > > >> > > > >>> I've revised the remaining patch: > > > >>> made function header comment a bit more detailed > > > >> > > > >> This part looks good to me. > > > >> > > > >>> and added additional > > > >>> regression tests. Please, check. > > > >>> > > > >> > > > >> But I don=E2=80=99t see any change for regression test between v4 = and v5. Maybe you forgot to save your changes? > > > > > > > > Sorry, I just mess up, no changes in tests. > > > > I'm going to push this if no objection. > > > > > > > > > > No worries. Then v5 looks good to me. > > > > Thank you, pushed. > > Uhhh, most of buildfarm animals don't support locales used in our > tests. I've to revert that, The another attempt is attached. Now use -0.0 and 0.0 as binary different but logically equivalent values, no locale dependence. ------ Regards, Alexander Korotkov Supabase --000000000000e1ea7e0652465268 Content-Type: application/octet-stream; name="v6-0001-Reject-degenerate-SPLIT-PARTITION-with-DEFAULT-pa.patch" Content-Disposition: attachment; filename="v6-0001-Reject-degenerate-SPLIT-PARTITION-with-DEFAULT-pa.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpekaqmr0 RnJvbSA3ZDhkM2UyZmU1MTUwODM3ZGIzYWYxYjU5YmI3ZTY5MjJjYTMwNjE4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jl c3FsLm9yZz4KRGF0ZTogTW9uLCAxOCBNYXkgMjAyNiAwMDozNzo1MiArMDMwMApTdWJqZWN0OiBb UEFUQ0ggdjZdIFJlamVjdCBkZWdlbmVyYXRlIFNQTElUIFBBUlRJVElPTiB3aXRoIERFRkFVTFQg cGFydGl0aW9uCgpBTFRFUiBUQUJMRSAuLi4gU1BMSVQgUEFSVElUSU9OIGFsbG93cyBhIERFRkFV TFQgcGFydGl0aW9uIHRvIGJlIGNyZWF0ZWQKYXMgb25lIG9mIHRoZSByZXBsYWNlbWVudCBwYXJ0 aXRpb25zIHdoZW4gdGhlIHBhcmVudCB0YWJsZSBkb2VzIG5vdAphbHJlYWR5IGhhdmUgb25lLiAg SG93ZXZlciwgaXQgc2hvdWxkIG5vdCBhbGxvdyB0aGUgZGVnZW5lcmF0ZSBjYXNlIHdoZXJlCmEg bm9uLURFRkFVTFQgcGFydGl0aW9uIGtlZXBzIGV4YWN0bHkgdGhlIHNhbWUgYm91bmQgYXMgdGhl IHNwbGl0CnBhcnRpdGlvbiBhbmQgdGhlIGNvbW1hbmQgbWVyZWx5IGFkZHMgYSBERUZBVUxUIHBh cnRpdGlvbiB0aHJvdWdoIHRoZQpTUExJVCBQQVJUSVRJT04gcGF0aC4KCkRldGVjdCB0aGF0IGNh c2UgYnkgY29tcGFyaW5nIHRoZSBib3VuZCBvZiB0aGUgc3BsaXQgcGFydGl0aW9uIHdpdGggdGhl CmJvdW5kIG9mIHRoZSBvbmx5IG5vbi1ERUZBVUxUIHJlcGxhY2VtZW50IHBhcnRpdGlvbiwgYW5k IHJhaXNlIGFuIGVycm9yCndoZW4gdGhleSBhcmUgdGhlIHNhbWUuICBVc2VycyBzaG91bGQgYWRk IGEgREVGQVVMVCBwYXJ0aXRpb24gZGlyZWN0bHkKd2l0aCBDUkVBVEUgVEFCTEUgLi4uIFBBUlRJ VElPTiBPRiAuLi4gREVGQVVMVCBvciBBTFRFUiBUQUJMRSAuLi4gQVRUQUNIClBBUlRJVElPTiAu Li4gREVGQVVMVCBpbnN0ZWFkLgoKVGhlIGNvbXBhcmlzb24gZ29lcyB0aHJvdWdoIHRoZSBwYXJ0 aXRpb24gb3BlcmF0b3IgZmFtaWx5IHJhdGhlciB0aGFuCmJ5dGUgZXF1YWxpdHkgc28gdGhhdCB2 YWx1ZXMgd2hpY2ggYXJlIGJpbmFyeS1kaWZmZXJlbnQgYnV0IGNvbXBhcmUKZXF1YWwgdW5kZXIg dGhlIHBhcnRpdGlvbiBrZXkncyBjb21wYXJhdG9yIGFyZSB0cmVhdGVkIGFzIHRoZSBzYW1lCmJv dW5kLiAgVGhlIGNvcnJlc3BvbmRpbmcgcmVncmVzc2lvbiB0ZXN0IHVzZXMgYSBmbG9hdDggTElT VCBwYXJ0aXRpb24Kd2l0aCAtMC4wIGFuZCAwLjAgLS0gdGhleSBoYXZlIGRpZmZlcmVudCBiaXQg cGF0dGVybnMgYnV0IGFyZSBlcXVhbAp1bmRlciBmbG9hdDggLS0gdG8gdmVyaWZ5IHRoYXQgYSBk YXR1bUlzRXF1YWwoKS1iYXNlZCBjaGVjayB3b3VsZCBsZXQKdGhlIGRlZ2VuZXJhdGUgc3BsaXQg dGhyb3VnaCB3aGlsZSB0aGUgcGFydHN1cGZ1bmMtYmFzZWQgY2hlY2sKY29ycmVjdGx5IHJlamVj dHMgaXQuCgpBdXRob3I6IENoYW8gTGkgPGxpY0BoaWdoZ28uY29tPgpSZXZpZXdlZC1ieTogQWxl eGFuZGVyIEtvcm90a292IDxhZWtvcm90a292QGdtYWlsLmNvbT4KRGlzY3Vzc2lvbjogaHR0cHM6 Ly9wb3N0Z3IuZXMvbS9DMTg4NzhBQi1ERUIyLTRBNjEtOTk5NS1BMDM1REQ2NDRCODFAZ21haWwu Y29tCi0tLQogc3JjL2JhY2tlbmQvcGFydGl0aW9uaW5nL3BhcnRib3VuZHMuYyAgICAgICAgIHwg MTUwICsrKysrKysrKysrKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wYXJ0aXRp b25fc3BsaXQub3V0IHwgIDU4ICsrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BhcnRpdGlv bl9zcGxpdC5zcWwgICAgICB8ICA1MSArKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgMjU5IGluc2Vy dGlvbnMoKykKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wYXJ0aXRpb25pbmcvcGFydGJvdW5k cy5jIGIvc3JjL2JhY2tlbmQvcGFydGl0aW9uaW5nL3BhcnRib3VuZHMuYwppbmRleCA3ZDM1ODBj YmMxMC4uNmZiMTUwYTg3NjMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3BhcnRpdGlvbmluZy9w YXJ0Ym91bmRzLmMKKysrIGIvc3JjL2JhY2tlbmQvcGFydGl0aW9uaW5nL3BhcnRib3VuZHMuYwpA QCAtNTcwMCw2ICs1NzAwLDE0NiBAQCBjaGVja19wYXJlbnRfdmFsdWVzX2luX25ld19wYXJ0aXRp b25zKFJlbGF0aW9uIHBhcmVudCwKIAl9CiB9CiAKKy8qCisgKiBzcGxpdF9wYXJ0aXRpb25fdmFs dWVzX2NvbnRhaW5lZF9pbl9uZXdfcGFydAorICoKKyAqIChmdW5jdGlvbiBmb3IgQlkgTElTVCBw YXJ0aXRpb25pbmcpCisgKgorICogUmV0dXJucyB0cnVlIGlmIGFsbCB2YWx1ZXMgaW4gdGhlIExJ U1QgYm91bmQgb2YgdGhlIHBhcnRpdGlvbiBiZWluZyBzcGxpdAorICogYXJlIGNvbnRhaW5lZCBp biB0aGUgc3BlY2lmaWVkIG5vbi1ERUZBVUxUIHJlcGxhY2VtZW50IHBhcnRpdGlvbidzIGJvdW5k LgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBhbHJlYWR5IGhhdmUgdmVyaWZpZWQgY29udGFpbm1l bnQgaW4gdGhlIG90aGVyIGRpcmVjdGlvbiwKKyAqIHNvIHRoaXMgY2hlY2sgaXMgc3VmZmljaWVu dCB0byBwcm92ZSB0aGF0IHRoZSB0d28gTElTVCBib3VuZHMgYXJlIGVxdWFsLgorICovCitzdGF0 aWMgYm9vbAorc3BsaXRfcGFydGl0aW9uX3ZhbHVlc19jb250YWluZWRfaW5fbmV3X3BhcnQoUmVs YXRpb24gcGFyZW50LAorCQkJCQkJCQkJCQkgT2lkIHNwbGl0UGFydE9pZCwKKwkJCQkJCQkJCQkJ IFNpbmdsZVBhcnRpdGlvblNwZWMgKnBhcnQpCit7CisJUGFydGl0aW9uS2V5IGtleSA9IFJlbGF0 aW9uR2V0UGFydGl0aW9uS2V5KHBhcmVudCk7CisJUGFydGl0aW9uRGVzYyBwYXJ0ZGVzYyA9IFJl bGF0aW9uR2V0UGFydGl0aW9uRGVzYyhwYXJlbnQsIGZhbHNlKTsKKwlQYXJ0aXRpb25Cb3VuZElu Zm8gYm91bmRpbmZvID0gcGFydGRlc2MtPmJvdW5kaW5mbzsKKwlTaW5nbGVQYXJ0aXRpb25TcGVj ICpwYXJ0c1sxXTsKKwlEYXR1bQkJZGF0dW0gPSBQb2ludGVyR2V0RGF0dW0oTlVMTCk7CisKKwlB c3NlcnQoa2V5LT5zdHJhdGVneSA9PSBQQVJUSVRJT05fU1RSQVRFR1lfTElTVCk7CisKKwlwYXJ0 c1swXSA9IHBhcnQ7CisKKwkvKgorCSAqIFNwZWNpYWwgcHJvY2Vzc2luZyBmb3IgTlVMTCB2YWx1 ZS4gIFNlYXJjaCBmb3IgYSBOVUxMIHZhbHVlIGlmIHRoZQorCSAqIHNwbGl0IHBhcnRpdGlvbiBj b250YWlucyBpdC4KKwkgKi8KKwlpZiAocGFydGl0aW9uX2JvdW5kX2FjY2VwdHNfbnVsbHMoYm91 bmRpbmZvKSAmJgorCQlwYXJ0ZGVzYy0+b2lkc1tib3VuZGluZm8tPm51bGxfaW5kZXhdID09IHNw bGl0UGFydE9pZCkKKwl7CisJCWlmICghZmluZF92YWx1ZV9pbl9uZXdfcGFydGl0aW9uc19saXN0 KCZrZXktPnBhcnRzdXBmdW5jWzBdLAorCQkJCQkJCQkJCQkgICBrZXktPnBhcnRjb2xsYXRpb24s IHBhcnRzLCAxLAorCQkJCQkJCQkJCQkgICBkYXR1bSwgdHJ1ZSkpCisJCQlyZXR1cm4gZmFsc2U7 CisJfQorCisJLyoKKwkgKiBTZWFyY2ggYWxsIHZhbHVlcyBvZiB0aGUgc3BsaXQgcGFydGl0aW9u IGluIHRoZSBzaW5nbGUgbm9uLURFRkFVTFQKKwkgKiByZXBsYWNlbWVudCBwYXJ0aXRpb24uCisJ ICovCisJZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZGluZm8tPm5kYXR1bXM7IGkrKykKKwl7CisJ CWlmIChwYXJ0ZGVzYy0+b2lkc1tib3VuZGluZm8tPmluZGV4ZXNbaV1dID09IHNwbGl0UGFydE9p ZCkKKwkJeworCQkJZGF0dW0gPSBib3VuZGluZm8tPmRhdHVtc1tpXVswXTsKKworCQkJaWYgKCFm aW5kX3ZhbHVlX2luX25ld19wYXJ0aXRpb25zX2xpc3QoJmtleS0+cGFydHN1cGZ1bmNbMF0sCisJ CQkJCQkJCQkJCQkgICBrZXktPnBhcnRjb2xsYXRpb24sIHBhcnRzLCAxLAorCQkJCQkJCQkJCQkJ ICAgZGF0dW0sIGZhbHNlKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlyZXR1cm4g dHJ1ZTsKK30KKworLyoKKyAqIGNoZWNrX3NwbGl0X3BhcnRpdGlvbl9ub3Rfc2FtZV9ib3VuZAor ICoKKyAqIFJlamVjdCBzcGxpdHRpbmcgYSBub24tREVGQVVMVCBwYXJ0aXRpb24gaW50byBvbmUg bm9uLURFRkFVTFQgcGFydGl0aW9uCisgKiB3aXRoIHRoZSBvcmlnaW5hbCBib3VuZCBwbHVzIGEg REVGQVVMVCBwYXJ0aXRpb24uICBUaGF0IGZvcm0gZG9lcyBub3QKKyAqIHBlcmZvcm0gYSByZWFs IHNwbGl0OyBpdCBtZXJlbHkgYWRkcyBhIERFRkFVTFQgcGFydGl0aW9uIHRvIHRoZSBwYXJlbnQK KyAqIHRhYmxlIHRocm91Z2ggdGhlIHNwbGl0LXBhcnRpdGlvbiBwYXRoLiAgVXNlcnMgc2hvdWxk IHVzZQorICogQ1JFQVRFIFRBQkxFIC4uLiBQQVJUSVRJT04gT0YgLi4uIERFRkFVTFQgb3IgQUxU RVIgVEFCTEUgLi4uIEFUVEFDSAorICogUEFSVElUSU9OIC4uLiBERUZBVUxUIGZvciB0aGF0Lgor ICoKKyAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBwZXItcGFydGl0aW9uIGJvdW5kIHZhbGlk YXRpb24gaW4KKyAqIGNoZWNrX3BhcnRpdGlvbnNfZm9yX3NwbGl0KCkgc28gdGhhdCBjb250YWlu bWVudCBvZiBuZXcgYm91bmRzIHdpdGhpbiB0aGUKKyAqIHNwbGl0IHBhcnRpdGlvbiBpcyBhbHJl YWR5IGVzdGFibGlzaGVkLiAgR2l2ZW4gY29udGFpbm1lbnQsIFJBTkdFIGJvdW5kcworICogYXJl IGVxdWFsIGlmZiB0aGVpciBsb3dlciBhbmQgdXBwZXIgcmJvdW5kcyBtYXRjaDsgTElTVCBib3Vu ZCBzZXRzIGFyZQorICogZXF1YWwgaWZmIHRoZSBzcGxpdCBwYXJ0aXRpb24ncyB2YWx1ZXMgYXJl IGFsc28gY29udGFpbmVkIGluIHRoZSBuZXcKKyAqIHBhcnRpdGlvbiAodGhlIGNvbnRhaW5tZW50 IGlzIHRoZW4gYmlkaXJlY3Rpb25hbCkuICBCb3RoIGNoZWNrcyBnbworICogdGhyb3VnaCB0aGUg cGFydGl0aW9uIG9wZXJhdG9yIGZhbWlseSAocGFydGl0aW9uX3Jib3VuZF9jbXAgLworICogZmlu ZF92YWx1ZV9pbl9uZXdfcGFydGl0aW9uc19saXN0KSByYXRoZXIgdGhhbiBieXRlIGVxdWFsaXR5 LCBzbyBlLmcuCisgKiAtMC4wIGFuZCAwLjAgLS0gd2hpY2ggaGF2ZSBkaWZmZXJlbnQgYml0IHBh dHRlcm5zIGJ1dCBjb21wYXJlIGVxdWFsCisgKiB1bmRlciBmbG9hdDggLS0gYXJlIGNvcnJlY3Rs eSByZWNvZ25pc2VkIGFzIHRoZSBzYW1lIGJvdW5kLgorICovCitzdGF0aWMgdm9pZAorY2hlY2tf c3BsaXRfcGFydGl0aW9uX25vdF9zYW1lX2JvdW5kKFJlbGF0aW9uIHBhcmVudCwKKwkJCQkJCQkJ CSBPaWQgc3BsaXRQYXJ0T2lkLAorCQkJCQkJCQkJIFNpbmdsZVBhcnRpdGlvblNwZWMgKipwYXJ0 cywKKwkJCQkJCQkJCSBpbnQgbnBhcnRzLAorCQkJCQkJCQkJIFBhcnNlU3RhdGUgKnBzdGF0ZSkK K3sKKwlQYXJ0aXRpb25LZXkga2V5ID0gUmVsYXRpb25HZXRQYXJ0aXRpb25LZXkocGFyZW50KTsK KwlQYXJ0aXRpb25Cb3VuZFNwZWMgKm5ld19zcGVjOworCVBhcnRpdGlvbkJvdW5kU3BlYyAqc3Bs aXRfc3BlYzsKKworCWlmIChucGFydHMgIT0gMSkKKwkJcmV0dXJuOworCisJbmV3X3NwZWMgPSBw YXJ0c1swXS0+Ym91bmQ7CisJc3BsaXRfc3BlYyA9IGdldF9wYXJ0aXRpb25fYm91bmRfc3BlYyhz cGxpdFBhcnRPaWQpOworCisJQXNzZXJ0KG5ld19zcGVjLT5zdHJhdGVneSA9PSBzcGxpdF9zcGVj LT5zdHJhdGVneSk7CisKKwlpZiAoa2V5LT5zdHJhdGVneSA9PSBQQVJUSVRJT05fU1RSQVRFR1lf UkFOR0UpCisJeworCQlQYXJ0aXRpb25SYW5nZUJvdW5kICpuZXdfbG93ZXI7CisJCVBhcnRpdGlv blJhbmdlQm91bmQgKm5ld191cHBlcjsKKwkJUGFydGl0aW9uUmFuZ2VCb3VuZCAqc3BsaXRfbG93 ZXI7CisJCVBhcnRpdGlvblJhbmdlQm91bmQgKnNwbGl0X3VwcGVyOworCisJCW5ld19sb3dlciA9 IG1ha2Vfb25lX3BhcnRpdGlvbl9yYm91bmQoa2V5LCAtMSwgbmV3X3NwZWMtPmxvd2VyZGF0dW1z LCB0cnVlKTsKKwkJbmV3X3VwcGVyID0gbWFrZV9vbmVfcGFydGl0aW9uX3Jib3VuZChrZXksIC0x LCBuZXdfc3BlYy0+dXBwZXJkYXR1bXMsIGZhbHNlKTsKKwkJc3BsaXRfbG93ZXIgPSBtYWtlX29u ZV9wYXJ0aXRpb25fcmJvdW5kKGtleSwgLTEsIHNwbGl0X3NwZWMtPmxvd2VyZGF0dW1zLCB0cnVl KTsKKwkJc3BsaXRfdXBwZXIgPSBtYWtlX29uZV9wYXJ0aXRpb25fcmJvdW5kKGtleSwgLTEsIHNw bGl0X3NwZWMtPnVwcGVyZGF0dW1zLCBmYWxzZSk7CisKKwkJaWYgKHBhcnRpdGlvbl9yYm91bmRf Y21wKGtleS0+cGFydG5hdHRzLCBrZXktPnBhcnRzdXBmdW5jLAorCQkJCQkJCQkga2V5LT5wYXJ0 Y29sbGF0aW9uLAorCQkJCQkJCQkgbmV3X2xvd2VyLT5kYXR1bXMsIG5ld19sb3dlci0+a2luZCwg dHJ1ZSwKKwkJCQkJCQkJIHNwbGl0X2xvd2VyKSAhPSAwKQorCQkJcmV0dXJuOworCQlpZiAocGFy dGl0aW9uX3Jib3VuZF9jbXAoa2V5LT5wYXJ0bmF0dHMsIGtleS0+cGFydHN1cGZ1bmMsCisJCQkJ CQkJCSBrZXktPnBhcnRjb2xsYXRpb24sCisJCQkJCQkJCSBuZXdfdXBwZXItPmRhdHVtcywgbmV3 X3VwcGVyLT5raW5kLCBmYWxzZSwKKwkJCQkJCQkJIHNwbGl0X3VwcGVyKSAhPSAwKQorCQkJcmV0 dXJuOworCX0KKwllbHNlCisJeworCQlBc3NlcnQoa2V5LT5zdHJhdGVneSA9PSBQQVJUSVRJT05f U1RSQVRFR1lfTElTVCk7CisKKwkJaWYgKCFzcGxpdF9wYXJ0aXRpb25fdmFsdWVzX2NvbnRhaW5l ZF9pbl9uZXdfcGFydChwYXJlbnQsIHNwbGl0UGFydE9pZCwKKwkJCQkJCQkJCQkJCQkJICBwYXJ0 c1swXSkpCisJCQlyZXR1cm47CisJfQorCisJZXJlcG9ydChFUlJPUiwKKwkJCWVycmNvZGUoRVJS Q09ERV9JTlZBTElEX09CSkVDVF9ERUZJTklUSU9OKSwKKwkJCWVycm1zZygiY2Fubm90IHNwbGl0 IHBhcnRpdGlvbiBcIiVzXCIgb25seSB0byBhZGQgYSBERUZBVUxUIHBhcnRpdGlvbiIsCisJCQkJ ICAgZ2V0X3JlbF9uYW1lKHNwbGl0UGFydE9pZCkpLAorCQkJZXJyZGV0YWlsKCJUaGUgbm9uLURF RkFVTFQgcGFydGl0aW9uIHdvdWxkIGtlZXAgdGhlIHNhbWUgcGFydGl0aW9uIGJvdW5kLiIpLAor CQkJZXJyaGludCgiVXNlIENSRUFURSBUQUJMRSAuLi4gUEFSVElUSU9OIE9GIC4uLiBERUZBVUxU IHRvIGFkZCBhIERFRkFVTFQgcGFydGl0aW9uLiIpLAorCQkJcGFyc2VyX2VycnBvc2l0aW9uKHBz dGF0ZSwgcGFydHNbMF0tPm5hbWUtPmxvY2F0aW9uKSk7Cit9CisKIC8qCiAgKiBjaGVja19wYXJ0 aXRpb25zX2Zvcl9zcGxpdAogICoKQEAgLTU4NzEsNSArNjAxMSwxNSBAQCBjaGVja19wYXJ0aXRp b25zX2Zvcl9zcGxpdChSZWxhdGlvbiBwYXJlbnQsCiAJCQkJCQkJCQkJCQkgIG5ld19wYXJ0cywg bnBhcnRzLCBwc3RhdGUpOwogCX0KIAorCS8qCisJICogUmVqZWN0IHRoZSBkZWdlbmVyYXRlIGZv cm0gd2hlcmUgdGhlIHNpbmdsZSBub24tREVGQVVMVCByZXBsYWNlbWVudAorCSAqIHBhcnRpdGlv biBrZWVwcyB0aGUgYm91bmQgb2YgdGhlIHNwbGl0IHBhcnRpdGlvbjsgdGhlIGNvbW1hbmQgdGhl biBkb2VzCisJICogbm90aGluZyBiZXlvbmQgYWRkaW5nIGEgREVGQVVMVCBwYXJ0aXRpb24uICBD b250YWlubWVudCB3YXMgZXN0YWJsaXNoZWQKKwkgKiBieSB0aGUgcGVyLXBhcnRpdGlvbiB2YWxp ZGF0aW9uIGFib3ZlLCBzbyBhbiBlcXVhbGl0eSBjaGVjayBpcyBlbm91Z2guCisJICovCisJaWYg KCFpc1NwbGl0UGFydERlZmF1bHQgJiYgY3JlYXRlRGVmYXVsdFBhcnQpCisJCWNoZWNrX3NwbGl0 X3BhcnRpdGlvbl9ub3Rfc2FtZV9ib3VuZChwYXJlbnQsIHNwbGl0UGFydE9pZCwgbmV3X3BhcnRz LAorCQkJCQkJCQkJCQkgbnBhcnRzLCBwc3RhdGUpOworCiAJcGZyZWUobmV3X3BhcnRzKTsKIH0K ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcGFydGl0aW9uX3NwbGl0Lm91 dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcGFydGl0aW9uX3NwbGl0Lm91dAppbmRleCAy YjlhNmFhNTBlZC4uZmY2MDI3YWY2NTggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvcGFydGl0aW9uX3NwbGl0Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3BhcnRpdGlvbl9zcGxpdC5vdXQKQEAgLTExODgsNiArMTE4OCw2NCBAQCBTRUxFQ1QgdGFibGVv aWQ6OnJlZ2NsYXNzLCAqIEZST00gc2FsZXNfcmFuZ2UgT1JERVIgQlkgdGFibGVvaWQ6OnJlZ2Ns YXNzOjp0ZXh0CiAKIERST1AgVEFCTEUgc2FsZXNfcmFuZ2U7CiAtLQorLS0gVGVzdCB0aGF0IFNQ TElUIFBBUlRJVElPTiByZWplY3RzIHRoZSBkZWdlbmVyYXRlIGNhc2Ugd2hlcmUgdGhlIG9ubHkK Ky0tIG5vbi1ERUZBVUxUIHJlcGxhY2VtZW50IHBhcnRpdGlvbiBrZWVwcyB0aGUgb3JpZ2luYWwg Ym91bmQgYW5kIHRoZSBjb21tYW5kCistLSBtZXJlbHkgYWRkcyBhIERFRkFVTFQgcGFydGl0aW9u LgorLS0KK0NSRUFURSBUQUJMRSB0IChpIGludCkgUEFSVElUSU9OIEJZIFJBTkdFIChpKTsKK0NS RUFURSBUQUJMRSB0cF8wXzUwIFBBUlRJVElPTiBPRiB0IEZPUiBWQUxVRVMgRlJPTSAoMCkgVE8g KDUwKTsKK0lOU0VSVCBJTlRPIHQgVkFMVUVTICgxKTsKKy0tIEVSUk9SCitBTFRFUiBUQUJMRSB0 IFNQTElUIFBBUlRJVElPTiB0cF8wXzUwIElOVE8KKyAgKFBBUlRJVElPTiB0cF8wXzUwIEZPUiBW QUxVRVMgRlJPTSAoMCkgVE8gKDUwKSwKKyAgIFBBUlRJVElPTiB0cF9kZWZhdWx0IERFRkFVTFQp OworRVJST1I6ICBjYW5ub3Qgc3BsaXQgcGFydGl0aW9uICJ0cF8wXzUwIiBvbmx5IHRvIGFkZCBh IERFRkFVTFQgcGFydGl0aW9uCitMSU5FIDI6ICAgKFBBUlRJVElPTiB0cF8wXzUwIEZPUiBWQUxV RVMgRlJPTSAoMCkgVE8gKDUwKSwKKyAgICAgICAgICAgICAgICAgICAgIF4KK0RFVEFJTDogIFRo ZSBub24tREVGQVVMVCBwYXJ0aXRpb24gd291bGQga2VlcCB0aGUgc2FtZSBwYXJ0aXRpb24gYm91 bmQuCitISU5UOiAgVXNlIENSRUFURSBUQUJMRSAuLi4gUEFSVElUSU9OIE9GIC4uLiBERUZBVUxU IHRvIGFkZCBhIERFRkFVTFQgcGFydGl0aW9uLgorRFJPUCBUQUJMRSB0OworLS0KKy0tIFRlc3Qg dGhhdCBhIExJU1Qgc3BsaXQgd2l0aCBERUZBVUxUIGlzIG5vdCBjb25zaWRlcmVkIGRlZ2VuZXJh dGUgd2hlbgorLS0gb25seSBOVUxMIGlzIHJlbW92ZWQgZnJvbSB0aGUgZXhwbGljaXQgcmVwbGFj ZW1lbnQgcGFydGl0aW9uLgorLS0KK0NSRUFURSBUQUJMRSB0IChpIGludCkgUEFSVElUSU9OIEJZ IExJU1QgKGkpOworQ1JFQVRFIFRBQkxFIHRwX251bGxfMSBQQVJUSVRJT04gT0YgdCBGT1IgVkFM VUVTIElOIChOVUxMLCAxKTsKK0FMVEVSIFRBQkxFIHQgU1BMSVQgUEFSVElUSU9OIHRwX251bGxf MSBJTlRPCisgIChQQVJUSVRJT04gdHBfMSBGT1IgVkFMVUVTIElOICgxKSwKKyAgIFBBUlRJVElP TiB0cF9kZWZhdWx0IERFRkFVTFQpOworSU5TRVJUIElOVE8gdCBWQUxVRVMgKE5VTEwpLCAoMSks ICgyKTsKK1NFTEVDVCB0YWJsZW9pZDo6cmVnY2xhc3MsIGkgRlJPTSB0IE9SREVSIEJZIHRhYmxl b2lkOjpyZWdjbGFzczo6dGV4dCBDT0xMQVRFICJDIiwgaSBOVUxMUyBGSVJTVDsKKyAgdGFibGVv aWQgIHwgaSAKKy0tLS0tLS0tLS0tLSstLS0KKyB0cF8xICAgICAgIHwgMQorIHRwX2RlZmF1bHQg fCAgCisgdHBfZGVmYXVsdCB8IDIKKygzIHJvd3MpCisKK0RST1AgVEFCTEUgdDsKKy0tCistLSBU ZXN0IHRoYXQgdGhlIHNhbWUtYm91bmQgY2hlY2sgZm9yIExJU1QgcGFydGl0aW9uaW5nIHVzZXMg dGhlCistLSBwYXJ0aXRpb24gb3BlcmF0b3IgZmFtaWx5LCBub3QgYnl0ZSBlcXVhbGl0eS4gIC0w LjAgYW5kIDAuMCBoYXZlCistLSBkaWZmZXJlbnQgYml0IHBhdHRlcm5zIGJ1dCBjb21wYXJlIGVx dWFsIHVuZGVyIGZsb2F0OCwgc28gdGhlCistLSByZXBsYWNlbWVudCBib3VuZCAoLTAuMCwgMS4w KSBpcyB0aGUgc2FtZSBzZXQgYXMgdGhlIG9yaWdpbmFsCistLSAoMC4wLCAxLjApIGFuZCB0aGUg U1BMSVQgaXMgZGVnZW5lcmF0ZS4gIEEgZGF0dW1Jc0VxdWFsKCktYmFzZWQKKy0tIGNoZWNrIHdv dWxkIGxldCB0aGlzIHRocm91Z2g7IHRoZSBwYXJ0c3VwZnVuYy1iYXNlZCBjaGVjayBjb3JyZWN0 bHkKKy0tIHJlamVjdHMgaXQuCistLQorQ1JFQVRFIFRBQkxFIHQgKHYgZmxvYXQ4KSBQQVJUSVRJ T04gQlkgTElTVCAodik7CitDUkVBVEUgVEFCTEUgdHBfemVyb19vbmUgUEFSVElUSU9OIE9GIHQg Rk9SIFZBTFVFUyBJTiAoMC4wLCAxLjApOworLS0gRVJST1IKK0FMVEVSIFRBQkxFIHQgU1BMSVQg UEFSVElUSU9OIHRwX3plcm9fb25lIElOVE8KKyAgKFBBUlRJVElPTiB0cF96ZXJvX29uZSBGT1Ig VkFMVUVTIElOICgtMC4wLCAxLjApLAorICAgUEFSVElUSU9OIHRwX2RlZmF1bHQgREVGQVVMVCk7 CitFUlJPUjogIGNhbm5vdCBzcGxpdCBwYXJ0aXRpb24gInRwX3plcm9fb25lIiBvbmx5IHRvIGFk ZCBhIERFRkFVTFQgcGFydGl0aW9uCitMSU5FIDI6ICAgKFBBUlRJVElPTiB0cF96ZXJvX29uZSBG T1IgVkFMVUVTIElOICgtMC4wLCAxLjApLAorICAgICAgICAgICAgICAgICAgICAgXgorREVUQUlM OiAgVGhlIG5vbi1ERUZBVUxUIHBhcnRpdGlvbiB3b3VsZCBrZWVwIHRoZSBzYW1lIHBhcnRpdGlv biBib3VuZC4KK0hJTlQ6ICBVc2UgQ1JFQVRFIFRBQkxFIC4uLiBQQVJUSVRJT04gT0YgLi4uIERF RkFVTFQgdG8gYWRkIGEgREVGQVVMVCBwYXJ0aXRpb24uCitEUk9QIFRBQkxFIHQ7CistLQogLS0g VGVzdCB0aGF0IHRoZSBleHBsaWNpdCBwYXJ0aXRpb24gYm91bmQgY2Fubm90IGV4dGVuZCBvdXRz aWRlIHRoZSBzcGxpdAogLS0gcGFydGl0aW9uJ3MgYm91bmQgd2hlbiBhIERFRkFVTFQgcGFydGl0 aW9uIGlzIHNwZWNpZmllZC4KIC0tCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9w YXJ0aXRpb25fc3BsaXQuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX3NwbGl0 LnNxbAppbmRleCBkOTgyMWM1ZTJhMy4uMDVkZTI0MTUyZDEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0 L3JlZ3Jlc3Mvc3FsL3BhcnRpdGlvbl9zcGxpdC5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9z cWwvcGFydGl0aW9uX3NwbGl0LnNxbApAQCAtODM0LDYgKzgzNCw1NyBAQCBTRUxFQ1QgdGFibGVv aWQ6OnJlZ2NsYXNzLCAqIEZST00gc2FsZXNfcmFuZ2UgT1JERVIgQlkgdGFibGVvaWQ6OnJlZ2Ns YXNzOjp0ZXh0CiAKIERST1AgVEFCTEUgc2FsZXNfcmFuZ2U7CiAKKy0tCistLSBUZXN0IHRoYXQg U1BMSVQgUEFSVElUSU9OIHJlamVjdHMgdGhlIGRlZ2VuZXJhdGUgY2FzZSB3aGVyZSB0aGUgb25s eQorLS0gbm9uLURFRkFVTFQgcmVwbGFjZW1lbnQgcGFydGl0aW9uIGtlZXBzIHRoZSBvcmlnaW5h bCBib3VuZCBhbmQgdGhlIGNvbW1hbmQKKy0tIG1lcmVseSBhZGRzIGEgREVGQVVMVCBwYXJ0aXRp b24uCistLQorQ1JFQVRFIFRBQkxFIHQgKGkgaW50KSBQQVJUSVRJT04gQlkgUkFOR0UgKGkpOwor Q1JFQVRFIFRBQkxFIHRwXzBfNTAgUEFSVElUSU9OIE9GIHQgRk9SIFZBTFVFUyBGUk9NICgwKSBU TyAoNTApOworSU5TRVJUIElOVE8gdCBWQUxVRVMgKDEpOworCistLSBFUlJPUgorQUxURVIgVEFC TEUgdCBTUExJVCBQQVJUSVRJT04gdHBfMF81MCBJTlRPCisgIChQQVJUSVRJT04gdHBfMF81MCBG T1IgVkFMVUVTIEZST00gKDApIFRPICg1MCksCisgICBQQVJUSVRJT04gdHBfZGVmYXVsdCBERUZB VUxUKTsKKworRFJPUCBUQUJMRSB0OworCistLQorLS0gVGVzdCB0aGF0IGEgTElTVCBzcGxpdCB3 aXRoIERFRkFVTFQgaXMgbm90IGNvbnNpZGVyZWQgZGVnZW5lcmF0ZSB3aGVuCistLSBvbmx5IE5V TEwgaXMgcmVtb3ZlZCBmcm9tIHRoZSBleHBsaWNpdCByZXBsYWNlbWVudCBwYXJ0aXRpb24uCist LQorQ1JFQVRFIFRBQkxFIHQgKGkgaW50KSBQQVJUSVRJT04gQlkgTElTVCAoaSk7CitDUkVBVEUg VEFCTEUgdHBfbnVsbF8xIFBBUlRJVElPTiBPRiB0IEZPUiBWQUxVRVMgSU4gKE5VTEwsIDEpOwor CitBTFRFUiBUQUJMRSB0IFNQTElUIFBBUlRJVElPTiB0cF9udWxsXzEgSU5UTworICAoUEFSVElU SU9OIHRwXzEgRk9SIFZBTFVFUyBJTiAoMSksCisgICBQQVJUSVRJT04gdHBfZGVmYXVsdCBERUZB VUxUKTsKKworSU5TRVJUIElOVE8gdCBWQUxVRVMgKE5VTEwpLCAoMSksICgyKTsKK1NFTEVDVCB0 YWJsZW9pZDo6cmVnY2xhc3MsIGkgRlJPTSB0IE9SREVSIEJZIHRhYmxlb2lkOjpyZWdjbGFzczo6 dGV4dCBDT0xMQVRFICJDIiwgaSBOVUxMUyBGSVJTVDsKKworRFJPUCBUQUJMRSB0OworCistLQor LS0gVGVzdCB0aGF0IHRoZSBzYW1lLWJvdW5kIGNoZWNrIGZvciBMSVNUIHBhcnRpdGlvbmluZyB1 c2VzIHRoZQorLS0gcGFydGl0aW9uIG9wZXJhdG9yIGZhbWlseSwgbm90IGJ5dGUgZXF1YWxpdHku ICAtMC4wIGFuZCAwLjAgaGF2ZQorLS0gZGlmZmVyZW50IGJpdCBwYXR0ZXJucyBidXQgY29tcGFy ZSBlcXVhbCB1bmRlciBmbG9hdDgsIHNvIHRoZQorLS0gcmVwbGFjZW1lbnQgYm91bmQgKC0wLjAs IDEuMCkgaXMgdGhlIHNhbWUgc2V0IGFzIHRoZSBvcmlnaW5hbAorLS0gKDAuMCwgMS4wKSBhbmQg dGhlIFNQTElUIGlzIGRlZ2VuZXJhdGUuICBBIGRhdHVtSXNFcXVhbCgpLWJhc2VkCistLSBjaGVj ayB3b3VsZCBsZXQgdGhpcyB0aHJvdWdoOyB0aGUgcGFydHN1cGZ1bmMtYmFzZWQgY2hlY2sgY29y cmVjdGx5CistLSByZWplY3RzIGl0LgorLS0KK0NSRUFURSBUQUJMRSB0ICh2IGZsb2F0OCkgUEFS VElUSU9OIEJZIExJU1QgKHYpOworQ1JFQVRFIFRBQkxFIHRwX3plcm9fb25lIFBBUlRJVElPTiBP RiB0IEZPUiBWQUxVRVMgSU4gKDAuMCwgMS4wKTsKKworLS0gRVJST1IKK0FMVEVSIFRBQkxFIHQg U1BMSVQgUEFSVElUSU9OIHRwX3plcm9fb25lIElOVE8KKyAgKFBBUlRJVElPTiB0cF96ZXJvX29u ZSBGT1IgVkFMVUVTIElOICgtMC4wLCAxLjApLAorICAgUEFSVElUSU9OIHRwX2RlZmF1bHQgREVG QVVMVCk7CisKK0RST1AgVEFCTEUgdDsKKwogLS0KIC0tIFRlc3QgdGhhdCB0aGUgZXhwbGljaXQg cGFydGl0aW9uIGJvdW5kIGNhbm5vdCBleHRlbmQgb3V0c2lkZSB0aGUgc3BsaXQKIC0tIHBhcnRp dGlvbidzIGJvdW5kIHdoZW4gYSBERUZBVUxUIHBhcnRpdGlvbiBpcyBzcGVjaWZpZWQuCi0tIAoy LjM5LjUgKEFwcGxlIEdpdC0xNTQpCgo= --000000000000e1ea7e0652465268--