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 1uGHo4-00G9dj-TS for pgsql-hackers@arkaria.postgresql.org; Sat, 17 May 2025 13:42:29 +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 1uGHo1-006Y9P-Os for pgsql-hackers@arkaria.postgresql.org; Sat, 17 May 2025 13:42:25 +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 1uGHo1-006Y9H-9u for pgsql-hackers@lists.postgresql.org; Sat, 17 May 2025 13:42:25 +0000 Received: from mail-il1-x12c.google.com ([2607:f8b0:4864:20::12c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1uGHnx-002M39-2r for pgsql-hackers@postgresql.org; Sat, 17 May 2025 13:42:24 +0000 Received: by mail-il1-x12c.google.com with SMTP id e9e14a558f8ab-3d812103686so9634835ab.0 for ; Sat, 17 May 2025 06:42:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747489340; x=1748094140; 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=axpVj5OP3Ufb2kFwMcXE1MTQovEZQV7aci9IKv5Sce0=; b=SB4wONpYSxWKUhg6BMuzmvbYpfkzE6YBny8oB2dSU/U7lPwCYRpj7WjMO8VGAr5xBM P8oD9PT5gZirncfatZ4HbNMQBPapjU7fyzw7PtTH4w2OpRwnEtsjGYjCuE8GiqQO1yqR NaAZIliOyv3QqfoI3nMWRON4z04Chem35jPKSBmD2hgwK/rxU13lqu19opAaV1u/zyoM cg/dvrgn4GjHCfhXXO0CWAJuEprxkZZOYOCz/0dVbepHsIUA70u+Bjsvx/yN2LDTUW64 M8F2L1ir9OQ56Km48MCqsCkVfF0VMicrwb4lI/9ptc99JLYGw/Wt486+B6JLhmgYzxgU NtAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747489340; x=1748094140; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=axpVj5OP3Ufb2kFwMcXE1MTQovEZQV7aci9IKv5Sce0=; b=gRwapS88hdEpuI9M/RYhA6OOU7wj5cAm6+XwDLcr2+/9Dzb/anWA7R33jSKWyRkGcA jbpKtcE3bC85csFFOpK0VphQTZXLDONpBbniKsSYV/eBVucHHWBENCbsgXXK8NeBEL3M J1mnWmN6fTkgcjvQjdLoLf8SEQZVDudpvTxUkP+al6N0at3eO9nMCdKyYnlYFpG76Mj7 8yUUuNyaGHYYFQl36F7HQfQj8EkgGZZP3hQPl33TyEWv0dl0BAoJVAQ8re/5hDqBf62p g1P+0B7ZlGaAtQs5sLeLlxQFPHpIzyPMaFCl/gu/cFoYJhVLzxo1nef4HCjDgHxMe9YC iUvg== X-Forwarded-Encrypted: i=1; AJvYcCVT8sEPExDmVC0NWW8stXSltmclSkBRa5TxNFtChStS6/mrbdJy1vjcGgUUs1ZHTMMr/MLgJNL4TlXpXkM2@postgresql.org X-Gm-Message-State: AOJu0YzOY2N6bjLheyJUG9SmTLVcfkOadnPtI4jiBjvnr+BHiWNvE1ES D9ARbD79bP0bgHtWRzVCs5HwXHwpd7rCWpg3N/muQ4sETEa9FVpVZrDXARSwpxNu8ibvSwhqqoi lk6eqW2002vZQRNXio0Otk/aFSojQU3Q= X-Gm-Gg: ASbGnctj/d5jGhzc9VOZx3pj03kAL5BlJ+NlAhaq5pmtW+lSwOFDKPXGr+Uc8xaBrog 9cIW9oOAJ5xdSpGVaZN++Y7Z+6muyyNW9A9w5GmETxLdYqlt2MWFD0htu1MgCS1Ek2GOs3pmbkd tXoKRFOlw8YZ+ouNqMnhK5/qSiQHBebQG5QlMVOOdOfFE= X-Google-Smtp-Source: AGHT+IEunAZ/J0ll0y2nlU8ifRTbzrRnNHib7sHpHkD6jf0RcPCKnVzoTietJpHDgifQLCxO2WyCyo74BQURgT2Coxk= X-Received: by 2002:a92:d24f:0:b0:3db:86e3:949b with SMTP id e9e14a558f8ab-3db86e39554mr43876675ab.11.1747489340058; Sat, 17 May 2025 06:42:20 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Andrew Jackson Date: Sat, 17 May 2025 08:41:43 -0500 X-Gm-Features: AX0GCFvQKcTbOy7JKANlcfzF8oE9lZmzWSjpqrUCPHJbw19K0vidv_EnA0Wyfy0 Message-ID: Subject: Re: Add Option To Check All Addresses For Matching target_session_attr To: Andrey Borodin Cc: Vladimir Sitnikov , Dave Page , pgsql-hackers Content-Type: multipart/mixed; boundary="0000000000005d0f2e063555112b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000005d0f2e063555112b Content-Type: multipart/alternative; boundary="0000000000005d0f2c0635551129" --0000000000005d0f2c0635551129 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable The attached updated patch fixes the merge conflicts and updates the numbering of the test files. On Mon, Feb 24, 2025 at 12:06=E2=80=AFPM Andrew Jackson wrote: > The previous patch had a mistake in a reference in the documentation. Thi= s > should fix it. > > On Mon, Feb 24, 2025 at 10:07=E2=80=AFAM Andrew Jackson < > andrewjackson947@gmail.com> wrote: > >> Looks like this needed another rebase to account for the oauth commit. >> Rebase attached. >> >> On Mon, Feb 24, 2025 at 9:38=E2=80=AFAM Andrew Jackson < >> andrewjackson947@gmail.com> wrote: >> >>> Hi, >>> >>> Thank you for the review! >>> >>> Review Response >>> >>> - Made a first pass at a real commit message >>> - Fixed the condition on the if statement to use strcmp >>> - Added a test suite in the files `src/interfaces/libpq/t/ >>> 006_target_session_attr_dns.pl` and `src/interfaces/libpq/t/ >>> 007_load_balance_dns_check_all_addrs.pl` which checks the >>> target_session_attrs as when used with and without load balancing. >>> >>> Regarding the name of the variable itself I am definitely open to >>> opinions on this. I didn't put too much thought initially and just chos= e >>> `check_all_addrs`. I feel like given that it modifies the behaviour of >>> `target_session_attrs` ideally it should reference that in the name but >>> that would make that variable name very long: something akin to >>> `target_session_attrs_check_all_addrs`. >>> >>> Context >>> >>> I tested some drivers as well and found that pgx, psycopg, and >>> rust-postgres all traverse every IP address when looking for a matching >>> target_session_attrs. Asyncpg and psycopg2 on the other hand follow lib= pq >>> and terminate additional attempts after the first failure. Given this i= t >>> seems like there is a decent amount of fragmentation in the ecosystem a= s to >>> how exactly to implement this feature. I believe some drivers choose to >>> traverse all addresses because they have users target the same use case >>> outlined above. >>> >>> Thanks again, >>> Andrew Jackson >>> >>> On Sun, Feb 16, 2025 at 6:03=E2=80=AFAM Andrey Borodin >>> wrote: >>> >>>> Hi Andrew! >>>> >>>> cc Jelte, I suspect he might be interested. >>>> >>>> > On 20 Nov 2024, at 20:51, Andrew Jackson >>>> wrote: >>>> > >>>> > Would appreciate any feedback on the applicability/relevancy of the >>>> goal here or the implementation. >>>> >>>> Thank you for raising the issue. Following our discussion in Discord >>>> I'm putting my thoughts to list. >>>> >>>> >>>> Context >>>> >>>> A DNS record might return several IPs. Consider we have a connection >>>> string with "host=3DA,B", A is resolved to 1.1.1.1,2.2.2.2, B to >>>> 3.3.3.3,4.4.4.4. >>>> If we connect with "target_session_attrs=3Dread-write" IPs 1.1.1.1 and >>>> 3.3.3.3 will be probed, but 2.2.2.2 and 4.4.4.4 won't (if 1.1.1.1 and >>>> 3.3.3.3 responded). >>>> >>>> If we enable libpq load balancing some random 2 IPs will be probed. >>>> >>>> IMO it's a bug, at least when load balancing is enabled. Let's conside= r >>>> if we can change default behavior here. I suspect we can't do it for >>>> "load_balance_hosts=3Ddisable". And even for load balancing this might= be too >>>> unexpected change for someone. >>>> >>>> Further I only consider proposal not as a bug fix, but as a feature. >>>> >>>> In Discord we have surveyed some other drivers. >>>> pgx treats all IPs as different servers [1]. npgsql goes through all >>>> IPs one-by-one always [2]. PGJDBC are somewhat in a decision process [= 3] >>>> (cc Dave and Vladimir, if they would like to provide some input). >>>> >>>> >>>> Review >>>> >>>> The patch needs a rebase. It's trivial, so please fine attached. The >>>> patch needs real commit message, it's not trivial :) >>>> >>>> We definitely need to adjust tests [0]. We need to change >>>> 004_load_balance_dns.pl so that it tests target_session_attrs too. >>>> >>>> Some documentation would be nice. >>>> >>>> I do not like how this check is performed >>>> + if >>>> (conn->check_all_addrs && conn->check_all_addrs[0] =3D=3D '1') >>>> Let's make it like load balancing is done [4]. >>>> >>>> Finally, let's think about naming alternatives for "check_all_addrs". >>>> >>>> I think that's enough for a first round of the review. If it's not a >>>> bug, but a feature - it's a very narrow window to get to 18. But we mi= ght >>>> be lucky... >>>> >>>> Thank you! >>>> >>>> >>>> Best regards, Andrey Borodin. >>>> >>>> [0] >>>> https://github.com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4= e644ee9456853e#diff-b05b74d2a97d7f74d4311ba1702d732f0df1b101c6ac99c146b5121= 5174cf3ffR94 >>>> [1] https://github.com/jackc/pgx/blob/master/pgconn/pgconn.go#L177 >>>> [2] >>>> https://github.com/npgsql/npgsql/blob/7f1a59fa8dc1ccc34a70154f49a768e1= abf826ba/src/Npgsql/Internal/NpgsqlConnector.cs#L986 >>>> [3] https://github.com/pgjdbc/pgjdbc/pull/3012#discussion_r1408069450 >>>> [4] >>>> https://github.com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4= e644ee9456853e#diff-8d819454e061b9d4cdae9c8922ded05753a629d70f2ac1de1d4f6d5= a4aeb7f68R1660 >>>> >>> --0000000000005d0f2c0635551129 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
The attached updated patch fixes the merge conflicts and u= pdates the numbering of the test files.

On Mon, Feb 24= , 2025 at 12:06=E2=80=AFPM Andrew Jackson <andrewjackson947@gmail.com> wrote:
The previous pa= tch had a mistake in a reference in the documentation. This should fix it.<= /div>

Hi,

Thank yo= u for the review!

Review Response
=
- Made a first pass at a real commit message
- Fix= ed the condition on the if statement to use strcmp
- Added a test= suite in the files `src/interfaces/libpq/t/006_target_session_attr_dns.pl` an= d `src/interfaces/libpq/t/007_load_balance_dns_check_all_addrs.pl` wh= ich checks the target_session_attrs as when used with and without load bala= ncing.

Regarding the name of the variable itself I= am=C2=A0definitely open to opinions on this. I didn't put too much tho= ught initially and just chose `check_all_addrs`. I feel like given that it = modifies the behaviour of `target_session_attrs` ideally it should referenc= e that in the name but that would make that variable name very long: someth= ing akin to `target_session_attrs_check_all_addrs`.=C2=A0

Context

I tested some drivers as well and = found that pgx, psycopg, and rust-postgres all traverse every IP address wh= en looking for a matching target_session_attrs. Asyncpg and psycopg2 on the= other hand follow libpq and terminate additional attempts after the first = failure. Given this it seems like there is a decent amount of fragmentation= in the ecosystem as to how exactly to implement this feature. I believe so= me drivers choose to traverse all addresses because they have users target = the same use case outlined above.=C2=A0

Thanks aga= in,
Andrew Jackson

On Sun, Feb 16, 2025 at 6:03=E2=80=AFAM A= ndrey Borodin <x4mmm@yandex-team.ru> wrote:
Hi Andrew!

cc Jelte, I suspect he might be interested.

> On 20 Nov 2024, at 20:51, Andrew Jackson <andrewjackson947@gmail.com> w= rote:
>
> Would appreciate any feedback on the applicability/relevancy of the go= al here or the implementation.

Thank you for raising the issue. Following our discussion in Discord I'= m putting my thoughts to list.


Context

A DNS record might return several IPs. Consider we have a connection string= with "host=3DA,B", A is resolved to 1.1.1.1,2.2.2.2, B to 3.3.3.= 3,4.4.4.4.
If we connect with "target_session_attrs=3Dread-write" IPs 1.1.1.= 1 and 3.3.3.3 will be probed, but 2.2.2.2 and 4.4.4.4 won't (if 1.1.1.1= and 3.3.3.3 responded).

If we enable libpq load balancing some random 2 IPs will be probed.

IMO it's a bug, at least when load balancing is enabled. Let's cons= ider if we can change default behavior here. I suspect we can't do it f= or "load_balance_hosts=3Ddisable". And even for load balancing th= is might be too unexpected change for someone.

Further I only consider proposal not as a bug fix, but as a feature.

In Discord we have surveyed some other drivers.
pgx treats all IPs as different servers [1]. npgsql goes through all IPs on= e-by-one always [2]. PGJDBC are somewhat in a decision process [3] (cc Dave= and Vladimir, if they would like to provide some input).


Review

The patch needs a rebase. It's trivial, so please fine attached. The pa= tch needs real commit message, it's not trivial :)

We definitely need to adjust tests [0]. We need to change 004_load_bal= ance_dns.pl so that it tests target_session_attrs too.

Some documentation would be nice.

I do not like how this check is performed
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0if (conn->check_all_addrs && conn->check_= all_addrs[0] =3D=3D '1')
Let's make it like load balancing is done [4].

Finally, let's think about naming alternatives for "check_all_addr= s".

I think that's enough for a first round of the review. If it's not = a bug, but a feature - it's a very narrow window to get to 18. But we m= ight be lucky...

Thank you!


Best regards, Andrey Borodin.

[0] https://github= .com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4e644ee9456853e#diff= -b05b74d2a97d7f74d4311ba1702d732f0df1b101c6ac99c146b51215174cf3ffR94 [1] https://github.com/jackc/pgx/blob/= master/pgconn/pgconn.go#L177
[2] https://github.com/npgsql/npgsql/blob/7f1a59fa8dc= 1ccc34a70154f49a768e1abf826ba/src/Npgsql/Internal/NpgsqlConnector.cs#L986
[3]
https://github.com/pgjdbc/pgjdb= c/pull/3012#discussion_r1408069450
[4] https://gith= ub.com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4e644ee9456853e#di= ff-8d819454e061b9d4cdae9c8922ded05753a629d70f2ac1de1d4f6d5a4aeb7f68R1660
--0000000000005d0f2c0635551129-- --0000000000005d0f2e063555112b Content-Type: text/x-patch; charset="US-ASCII"; name="v6-0001-Add-option-to-check-all-addrs-for-target_session.patch" Content-Disposition: attachment; filename="v6-0001-Add-option-to-check-all-addrs-for-target_session.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mas9xuna0 RnJvbSBiYjY5MWQ5NTA3MzllMmQ2NzkwYmNkMjQ3YzIzMGE1NzdhMTA1YWE5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBDb21tYW5kZXJLZXluZXMgPGFuZHJld2phY2tzb245NDdAZ21h aWwuY29tYT4KRGF0ZTogU2F0LCAxNyBNYXkgMjAyNSAwODoyOTowMSAtMDUwMApTdWJqZWN0OiBb UEFUQ0ggdjZdIEFkZCBvcHRpb24gdG8gY2hlY2sgYWxsIGFkZHJzIGZvciB0YXJnZXRfc2Vzc2lv bi4KClRoZSBjdXJyZW50IGJlaGF2aW91ciBvZiBsaWJwcSB3aXRoIHJlZ2FyZCB0byBzZWFyY2hp bmcKZm9yIGEgbWF0Y2hpbmcgdGFyZ2V0X3Nlc3Npb25fYXR0cnMgaW4gYSBsaXN0IG9mIGFkZHJz IGlzCnRoYXQgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIgaWYgdGhl IHNlcnZlcnMKc2Vzc2lvbl9hdHRyIGRvZXMgbm90IG1hdGNoIHRoZSByZXF1ZXN0IHRhcmdldF9z ZXNzaW9uX2F0dHJzCm5vIGZ1dGhlciBhZGRyZXNzIGlzIGNvbnNpZGVyZWQuIFRoaXMgYmVoYXZp b3VyIGlzIGV4dHJlbWVseQppbmNvbnZlbmllbnQgaW4gZW52aXJvbm1lbnRzIHdoZXJlIHRoZSB1 c2VyIGlzIGF0dGVtcHRpbmcgdG8KaW1wbGVtZW50IGEgaGlnaCBhdmFpbGFiaWxpdHkgc2V0dXAg d2l0aG91dCBoYXZpbmcgdG8gbW9kaWZ5CkROUyByZWNvcmRzIG9yIGEgcHJveHkgc2VydmVyIGNv bmZpZy4KClRoaXMgUFIgYWRkcyBhIGNsaWVudCBzaWRlIG9wdGlvbiBjYWxsZWQgY2hlY2tfYWxs X2FkZHJzLgpXaGVuIHNldCB0byAxIHRoaXMgb3B0aW9uIHdpbGwgdGVsbCBsaWJwcSB0byBjb250 aW51ZSBjaGVja2luZwphbnkgcmVtYWluaW5nIGFkZHJlc3NlcyBldmVuIGlmIHRoZXJlIHdhcyBh IHRhcmdldF9zZXNzaW9uX2F0dHJzCm1pc21hdGNoIG9uIG9uZSBvZiB0aGVtLgoKQXV0aG9yOiBB bmRyZXcgSmFja3NvbgpSZXZpZXdlZC1ieTogQW5kcmV5IEJvcm9kaW4KRGlzY3Vzc2lvbjogaHR0 cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9mbGF0L0NBS0s1QmtFU1NjNjlzcDJU aVRXSHZ2T0hDVWV5MHJEV1hTclI5cGlueVJxeWZhbVVZZyU0MG1haWwuZ21haWwuY29tCi0tLQog ZG9jL3NyYy9zZ21sL2xpYnBxLnNnbWwgICAgICAgICAgICAgICAgICAgICAgIHwgIDMzICsrKysr CiBzcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMgICAgICAgICAgICAgfCAgMjUgKyst LQogc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtaW50LmggICAgICAgICAgICAgIHwgICAxICsK IC4uLi9saWJwcS90LzAwN190YXJnZXRfc2Vzc2lvbl9hdHRyX2Rucy5wbCAgICB8IDEyOSArKysr KysrKysrKysrKysrKysKIC4uLi90LzAwOF9sb2FkX2JhbGFuY2VfZG5zX2NoZWNrX2FsbF9hZGRy cy5wbCB8IDEyOCArKysrKysrKysrKysrKysrKwogNSBmaWxlcyBjaGFuZ2VkLCAzMDYgaW5zZXJ0 aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2ludGVyZmFj ZXMvbGlicHEvdC8wMDdfdGFyZ2V0X3Nlc3Npb25fYXR0cl9kbnMucGwKIGNyZWF0ZSBtb2RlIDEw MDY0NCBzcmMvaW50ZXJmYWNlcy9saWJwcS90LzAwOF9sb2FkX2JhbGFuY2VfZG5zX2NoZWNrX2Fs bF9hZGRycy5wbAoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9saWJwcS5zZ21sIGIvZG9jL3Ny Yy9zZ21sL2xpYnBxLnNnbWwKaW5kZXggNjk1ZmU5NThjM2UuLjZmNDNhMDZlYzYzIDEwMDY0NAot LS0gYS9kb2Mvc3JjL3NnbWwvbGlicHEuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvbGlicHEuc2dt bApAQCAtMjU1NSw2ICsyNTU1LDM5IEBAIHBvc3RncmVzcWw6Ly8lMkZ2YXIlMkZsaWIlMkZwb3N0 Z3Jlc3FsL2RibmFtZQogICAgICAgPC9saXN0aXRlbT4KICAgICAgPC92YXJsaXN0ZW50cnk+CiAK KyAgICAgPHZhcmxpc3RlbnRyeSBpZD0ibGlicHEtY29ubmVjdC1jaGVjay1hbGwtYWRkcnMiIHhy ZWZsYWJlbD0iY2hlY2tfYWxsX2FkZHJzIj4KKyAgICAgIDx0ZXJtPjxsaXRlcmFsPmNoZWNrX2Fs bF9hZGRyczwvbGl0ZXJhbD48L3Rlcm0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+ CisgICAgICAgIENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IGFsbCBhZGRyZXNzZXMgd2l0aGluIGEg aG9zdG5hbWUgYXJlIGNoZWNrZWQgd2hlbiB0cnlpbmcgdG8gbWFrZSBhIGNvbm5lY3Rpb24KKyAg ICAgICAgd2hlbiBhdHRlbXB0aW5nIHRvIGZpbmQgYSBjb25uZWN0aW9uIHdpdGggYSBtYXRjaGlu ZyA8eHJlZiBsaW5rZW5kPSJsaWJwcS1jb25uZWN0LXRhcmdldC1zZXNzaW9uLWF0dHJzIi8+Lgor CisgICAgICAgIFRoZXJlIGFyZSB0d28gbW9kZXM6CisgICAgICAgIDx2YXJpYWJsZWxpc3Q+Cisg ICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxsaXRlcmFsPjA8L2xpdGVy YWw+IChkZWZhdWx0KTwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgIDxw YXJhPgorICAgICAgICAgICAgSWYgYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24gaXMgbWFkZSBhbmQg dGhhdCBjb25uZWN0aW9uIGlzIGZvdW5kIHRvIGhhdmUgYQorICAgICAgICAgICAgbWlzbWF0Y2hp bmcgPHhyZWYgbGlua2VuZD0ibGlicHEtY29ubmVjdC10YXJnZXQtc2Vzc2lvbi1hdHRycyIvPiBk byBub3QgY2hlY2sKKyAgICAgICAgICAgIGFueSBhZGRpdGlvbmFsIGFkZHJlc3NlcyBhbmQgbW92 ZSBvbnRvIHRoZSBuZXh0IGhvc3QgaWYgb25lIHdhcyBwcm92aWRlZC4KKyAgICAgICAgICAgPC9w YXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAg ICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+PGxpdGVyYWw+MTwvbGl0ZXJh bD48L3Rlcm0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICA8cGFyYT4KKyAgICAg ICAgICAgIElmIGEgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uIGlzIG1hZGUgYW5kIHRoYXQgY29ubmVj dGlvbiBpcyBmb3VuZCB0byBoYXZlIGEKKyAgICAgICAgICAgIG1pc21hdGNoaW5nIDx4cmVmIGxp bmtlbmQ9ImxpYnBxLWNvbm5lY3QtdGFyZ2V0LXNlc3Npb24tYXR0cnMiLz4gcHJvY2VlZAorICAg ICAgICAgICAgdG8gY2hlY2sgYW55IGFkZGl0aW9uYWwgYWRkcmVzc2VzLgorICAgICAgICAgICA8 L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgIDwvdmFybGlzdGVudHJ5Pgor ICAgICAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVt PgorICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgIDwvcGFyYT4K ICAgPC9zZWN0Mj4KZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3Qu YyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYwppbmRleCA0MzBjMGZhNDQ0Mi4u NTRlZDgwOWVlN2MgMTAwNjQ0Ci0tLSBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3Qu YworKysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMKQEAgLTM4OSw2ICszODks MTAgQEAgc3RhdGljIGNvbnN0IGludGVybmFsUFFjb25uaW5mb09wdGlvbiBQUWNvbm5pbmZvT3B0 aW9uc1tdID0gewogCiAJeyJzY3JhbV9zZXJ2ZXJfa2V5IiwgTlVMTCwgTlVMTCwgTlVMTCwgIlND UkFNLVNlcnZlci1LZXkiLCAiRCIsIFNDUkFNX01BWF9LRVlfTEVOICogMiwKIAlvZmZzZXRvZihz dHJ1Y3QgcGdfY29ubiwgc2NyYW1fc2VydmVyX2tleSl9LAorCXsiY2hlY2tfYWxsX2FkZHJzIiwg IlBHQ0hFQ0tBTExBRERSUyIsCisJCURlZmF1bHRMb2FkQmFsYW5jZUhvc3RzLCBOVUxMLAorCQki Q2hlY2stQWxsLUFkZHJzIiwgIiIsIDEsCisJb2Zmc2V0b2Yoc3RydWN0IHBnX2Nvbm4sIGNoZWNr X2FsbF9hZGRycyl9LAogCiAJLyogT0F1dGggdjIgKi8KIAl7Im9hdXRoX2lzc3VlciIsIE5VTEws IE5VTEwsIE5VTEwsCkBAIC00NDM0LDExICs0NDM4LDExIEBAIGtlZXBfZ29pbmc6CQkJCQkJLyog V2Ugd2lsbCBjb21lIGJhY2sgdG8gaGVyZSB1bnRpbCB0aGVyZSBpcwogCQkJCQkJY29ubi0+c3Rh dHVzID0gQ09OTkVDVElPTl9PSzsKIAkJCQkJCXNlbmRUZXJtaW5hdGVDb25uKGNvbm4pOwogCi0J CQkJCQkvKgotCQkJCQkJICogVHJ5IG5leHQgaG9zdCBpZiBhbnksIGJ1dCB3ZSBkb24ndCB3YW50 IHRvIGNvbnNpZGVyCi0JCQkJCQkgKiBhZGRpdGlvbmFsIGFkZHJlc3NlcyBmb3IgdGhpcyBob3N0 LgotCQkJCQkJICovCi0JCQkJCQljb25uLT50cnlfbmV4dF9ob3N0ID0gdHJ1ZTsKKwkJCQkJCWlm IChzdHJjbXAoY29ubi0+Y2hlY2tfYWxsX2FkZHJzLCAiMSIpID09IDApCisJCQkJCQkJY29ubi0+ dHJ5X25leHRfYWRkciA9IHRydWU7CisJCQkJCQllbHNlCisJCQkJCQkJY29ubi0+dHJ5X25leHRf aG9zdCA9IHRydWU7CisKIAkJCQkJCWdvdG8ga2VlcF9nb2luZzsKIAkJCQkJfQogCQkJCX0KQEAg LTQ0ODksMTEgKzQ0OTMsMTEgQEAga2VlcF9nb2luZzoJCQkJCQkvKiBXZSB3aWxsIGNvbWUgYmFj ayB0byBoZXJlIHVudGlsIHRoZXJlIGlzCiAJCQkJCQljb25uLT5zdGF0dXMgPSBDT05ORUNUSU9O X09LOwogCQkJCQkJc2VuZFRlcm1pbmF0ZUNvbm4oY29ubik7CiAKLQkJCQkJCS8qCi0JCQkJCQkg KiBUcnkgbmV4dCBob3N0IGlmIGFueSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY29uc2lkZXIKLQkJ CQkJCSAqIGFkZGl0aW9uYWwgYWRkcmVzc2VzIGZvciB0aGlzIGhvc3QuCi0JCQkJCQkgKi8KLQkJ CQkJCWNvbm4tPnRyeV9uZXh0X2hvc3QgPSB0cnVlOworCQkJCQkJaWYgKHN0cmNtcChjb25uLT5j aGVja19hbGxfYWRkcnMsICIxIikgPT0gMCkKKwkJCQkJCQljb25uLT50cnlfbmV4dF9hZGRyID0g dHJ1ZTsKKwkJCQkJCWVsc2UKKwkJCQkJCQljb25uLT50cnlfbmV4dF9ob3N0ID0gdHJ1ZTsKKwog CQkJCQkJZ290byBrZWVwX2dvaW5nOwogCQkJCQl9CiAJCQkJfQpAQCAtNTExOSw2ICs1MTIzLDcg QEAgZnJlZVBHY29ubihQR2Nvbm4gKmNvbm4pCiAJZnJlZShjb25uLT5vYXV0aF9jbGllbnRfaWQp OwogCWZyZWUoY29ubi0+b2F1dGhfY2xpZW50X3NlY3JldCk7CiAJZnJlZShjb25uLT5vYXV0aF9z Y29wZSk7CisJZnJlZShjb25uLT5jaGVja19hbGxfYWRkcnMpOwogCXRlcm1QUUV4cEJ1ZmZlcigm Y29ubi0+ZXJyb3JNZXNzYWdlKTsKIAl0ZXJtUFFFeHBCdWZmZXIoJmNvbm4tPndvcmtCdWZmZXIp OwogCmRpZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1pbnQuaCBiL3NyYy9p bnRlcmZhY2VzL2xpYnBxL2xpYnBxLWludC5oCmluZGV4IGE2Y2ZkN2Y1YzlkLi40NTA4MDczZWZh ZCAxMDA2NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtaW50LmgKKysrIGIvc3Jj L2ludGVyZmFjZXMvbGlicHEvbGlicHEtaW50LmgKQEAgLTQyNyw2ICs0MjcsNyBAQCBzdHJ1Y3Qg cGdfY29ubgogCWNoYXIJICAgKnNjcmFtX2NsaWVudF9rZXk7CS8qIGJhc2U2NC1lbmNvZGVkIFND UkFNIGNsaWVudCBrZXkgKi8KIAljaGFyCSAgICpzY3JhbV9zZXJ2ZXJfa2V5OwkvKiBiYXNlNjQt ZW5jb2RlZCBTQ1JBTSBzZXJ2ZXIga2V5ICovCiAJY2hhcgkgICAqc3Nsa2V5bG9nZmlsZTsJLyog d2hlcmUgc2hvdWxkIHRoZSBjbGllbnQgd3JpdGUgc3NsIGtleWxvZ3MgKi8KKwljaGFyICAgICAg ICpjaGVja19hbGxfYWRkcnM7ICAvKiB3aGV0aGVyIHRvIGNoZWNrIGFsbCBpcHMgd2l0aGluIGEg aG9zdCBvciB0ZXJtaW5hdGUgb24gZmFpbHVyZSAqLwogCiAJYm9vbAkJY2FuY2VsUmVxdWVzdDsJ LyogdHJ1ZSBpZiB0aGlzIGNvbm5lY3Rpb24gaXMgdXNlZCB0byBzZW5kIGEKIAkJCQkJCQkJICog Y2FuY2VsIHJlcXVlc3QsIGluc3RlYWQgb2YgYmVpbmcgYSBub3JtYWwKZGlmZiAtLWdpdCBhL3Ny Yy9pbnRlcmZhY2VzL2xpYnBxL3QvMDA3X3RhcmdldF9zZXNzaW9uX2F0dHJfZG5zLnBsIGIvc3Jj L2ludGVyZmFjZXMvbGlicHEvdC8wMDdfdGFyZ2V0X3Nlc3Npb25fYXR0cl9kbnMucGwKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjkxNGY2YzQ3MmY0Ci0tLSAvZGV2L251 bGwKKysrIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvdC8wMDdfdGFyZ2V0X3Nlc3Npb25fYXR0cl9k bnMucGwKQEAgLTAsMCArMSwxMjkgQEAKKworIyBDb3B5cmlnaHQgKGMpIDIwMjMtMjAyNSwgUG9z dGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKK3VzZSBzdHJpY3Q7Cit1c2Ugd2Fybmlu Z3MgRkFUQUwgPT4gJ2FsbCc7Cit1c2UgQ29uZmlnOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0 aWxzOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXI7Cit1c2UgVGVzdDo6TW9yZTsKKwor aWYgKCEkRU5We1BHX1RFU1RfRVhUUkF9IHx8ICRFTlZ7UEdfVEVTVF9FWFRSQX0gIX4gL1xibG9h ZF9iYWxhbmNlXGIvKQoreworCXBsYW4gc2tpcF9hbGwgPT4KKwkgICdQb3RlbnRpYWxseSB1bnNh ZmUgdGVzdCBsb2FkX2JhbGFuY2Ugbm90IGVuYWJsZWQgaW4gUEdfVEVTVF9FWFRSQSc7Cit9CisK KyMgQ2x1c3RlciBzZXR1cCB3aGljaCBpcyBzaGFyZWQgZm9yIHRlc3RpbmcgYm90aCBsb2FkIGJh bGFuY2luZyBtZXRob2RzCitteSAkY2FuX2JpbmRfdG9fMTI3XzBfMF8yID0KKyAgJENvbmZpZ3tv c25hbWV9IGVxICdsaW51eCcgfHwgJFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOjp3aW5kb3dzX29z OworCisjIENoZWNrcyBmb3IgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGVzdGluZyBsb2FkIGJhbGFu Y2luZyBtZXRob2QgMgoraWYgKCEkY2FuX2JpbmRfdG9fMTI3XzBfMF8yKQoreworCXBsYW4gc2tp cF9hbGwgPT4gJ2xvYWRfYmFsYW5jZSB0ZXN0IG9ubHkgc3VwcG9ydGVkIG9uIExpbnV4IGFuZCBX aW5kb3dzJzsKK30KKworbXkgJGhvc3RzX3BhdGg7CitpZiAoJHdpbmRvd3Nfb3MpCit7CisJJGhv c3RzX3BhdGggPSAnYzpcV2luZG93c1xTeXN0ZW0zMlxEcml2ZXJzXGV0Y1xob3N0cyc7Cit9Citl bHNlCit7CisJJGhvc3RzX3BhdGggPSAnL2V0Yy9ob3N0cyc7Cit9CisKK215ICRob3N0c19jb250 ZW50ID0gUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM6OnNsdXJwX2ZpbGUoJGhvc3RzX3BhdGgpOwor CitteSAkaG9zdHNfY291bnQgPSAoKSA9CisgICRob3N0c19jb250ZW50ID1+IC8xMjdcLjBcLjBc LlsxLTNdIHBnLWxvYWRiYWxhbmNldGVzdC9nOworaWYgKCRob3N0c19jb3VudCAhPSAzKQorewor CSMgSG9zdCBmaWxlIGlzIG5vdCBwcmVwYXJlZCBmb3IgdGhpcyB0ZXN0CisJcGxhbiBza2lwX2Fs bCA9PiAiaG9zdHMgZmlsZSB3YXMgbm90IHByZXBhcmVkIGZvciBETlMgbG9hZCBiYWxhbmNlIHRl c3QiOworfQorCiskUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlcjo6dXNlX3RjcCA9IDE7CiskUG9z dGdyZVNRTDo6VGVzdDo6Q2x1c3Rlcjo6dGVzdF9wZ2hvc3QgPSAnMTI3LjAuMC4xJzsKK215ICRw b3J0ID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlcjo6Z2V0X2ZyZWVfcG9ydCgpOworCitteSAk bm9kZV9wcmltYXJ5MSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygncHJpbWFyeTEn LCBwb3J0ID0+ICRwb3J0KTsKKyRub2RlX3ByaW1hcnkxLT5pbml0KGhhc19hcmNoaXZpbmcgPT4g MSwgYWxsb3dzX3N0cmVhbWluZyA9PiAxKTsKKworIyBTdGFydCBpdAorJG5vZGVfcHJpbWFyeTEt PnN0YXJ0OworCisjIFRha2UgYmFja3VwIGZyb20gd2hpY2ggYWxsIG9wZXJhdGlvbnMgd2lsbCBi ZSBydW4KKyRub2RlX3ByaW1hcnkxLT5iYWNrdXAoJ215X2JhY2t1cCcpOworCitteSAkbm9kZV9z dGFuZGJ5ID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdzdGFuZGJ5JywgcG9ydCA9 PiAkcG9ydCwgb3duX2hvc3QgPT4gMSk7Ciskbm9kZV9zdGFuZGJ5LT5pbml0X2Zyb21fYmFja3Vw KCRub2RlX3ByaW1hcnkxLCAnbXlfYmFja3VwJywKKwloYXNfcmVzdG9yaW5nID0+IDEpOworJG5v ZGVfc3RhbmRieS0+c3RhcnQoKTsKKworbXkgJG5vZGVfcHJpbWFyeTIgPSBQb3N0Z3JlU1FMOjpU ZXN0OjpDbHVzdGVyLT5uZXcoJ25vZGUxJywgcG9ydCA9PiAkcG9ydCwgb3duX2hvc3QgPT4gMSk7 Ciskbm9kZV9wcmltYXJ5MiAtPmluaXQoKTsKKyRub2RlX3ByaW1hcnkyIC0+c3RhcnQoKTsKKwor IyB0YXJnZXRfc2Vzc2lvbl9hdHRycz1wcmltYXJ5IHNob3VsZCBhbHdheXMgY2hvb3NlIHRoZSBm aXJzdCBvbmUuCiskbm9kZV9wcmltYXJ5MS0+Y29ubmVjdF9vaygKKwkiaG9zdD1wZy1sb2FkYmFs YW5jZXRlc3QgcG9ydD0kcG9ydCB0YXJnZXRfc2Vzc2lvbl9hdHRycz1wcmltYXJ5IGNoZWNrX2Fs bF9hZGRycz0xIiwKKwkidGFyZ2V0X3Nlc3Npb25fYXR0cnM9cHJpbWFyeSBjb25uZWN0cyB0byB0 aGUgZmlyc3Qgbm9kZSIsCisJc3FsID0+ICJTRUxFQ1QgJ2Nvbm5lY3QxJyIsCisJbG9nX2xpa2Ug PT4gW3FyL3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0MScvXSk7Ciskbm9kZV9wcmltYXJ5MS0+ Y29ubmVjdF9vaygKKwkiaG9zdD1wZy1sb2FkYmFsYW5jZXRlc3QgcG9ydD0kcG9ydCB0YXJnZXRf c2Vzc2lvbl9hdHRycz1yZWFkLXdyaXRlIGNoZWNrX2FsbF9hZGRycz0xIiwKKwkidGFyZ2V0X3Nl c3Npb25fYXR0cnM9cmVhZC13cml0ZSBjb25uZWN0cyB0byB0aGUgZmlyc3Qgbm9kZSIsCisJc3Fs ID0+ICJTRUxFQ1QgJ2Nvbm5lY3QxJyIsCisJbG9nX2xpa2UgPT4gW3FyL3N0YXRlbWVudDogU0VM RUNUICdjb25uZWN0MScvXSk7Ciskbm9kZV9wcmltYXJ5MS0+Y29ubmVjdF9vaygKKwkiaG9zdD1w Zy1sb2FkYmFsYW5jZXRlc3QgcG9ydD0kcG9ydCB0YXJnZXRfc2Vzc2lvbl9hdHRycz1hbnkgY2hl Y2tfYWxsX2FkZHJzPTEiLAorCSJ0YXJnZXRfc2Vzc2lvbl9hdHRycz1hbnkgY29ubmVjdHMgdG8g dGhlIGZpcnN0IG5vZGUiLAorCXNxbCA9PiAiU0VMRUNUICdjb25uZWN0MSciLAorCWxvZ19saWtl ID0+IFtxci9zdGF0ZW1lbnQ6IFNFTEVDVCAnY29ubmVjdDEnL10pOworJG5vZGVfc3RhbmRieS0+ Y29ubmVjdF9vaygKKwkiaG9zdD1wZy1sb2FkYmFsYW5jZXRlc3QgcG9ydD0kcG9ydCB0YXJnZXRf c2Vzc2lvbl9hdHRycz1zdGFuZGJ5IGNoZWNrX2FsbF9hZGRycz0xIiwKKwkidGFyZ2V0X3Nlc3Np b25fYXR0cnM9c3RhbmRieSBjb25uZWN0cyB0byB0aGUgdGhpcmQgbm9kZSIsCisJc3FsID0+ICJT RUxFQ1QgJ2Nvbm5lY3QxJyIsCisJbG9nX2xpa2UgPT4gW3FyL3N0YXRlbWVudDogU0VMRUNUICdj b25uZWN0MScvXSk7Ciskbm9kZV9zdGFuZGJ5LT5jb25uZWN0X29rKAorCSJob3N0PXBnLWxvYWRi YWxhbmNldGVzdCBwb3J0PSRwb3J0IHRhcmdldF9zZXNzaW9uX2F0dHJzPXJlYWQtb25seSBjaGVj a19hbGxfYWRkcnM9MSIsCisJInRhcmdldF9zZXNzaW9uX2F0dHJzPXJlYWQtb25seSBjb25uZWN0 cyB0byB0aGUgdGhpcmQgbm9kZSIsCisJc3FsID0+ICJTRUxFQ1QgJ2Nvbm5lY3QxJyIsCisJbG9n X2xpa2UgPT4gW3FyL3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0MScvXSk7CisKKworJG5vZGVf cHJpbWFyeTEtPnN0b3AoKTsKKworIyB0YXJnZXRfc2Vzc2lvbl9hdHRycz1wcmltYXJ5IHNob3Vs ZCBhbHdheXMgY2hvb3NlIHRoZSBmaXJzdCBvbmUuCiskbm9kZV9wcmltYXJ5Mi0+Y29ubmVjdF9v aygKKwkiaG9zdD1wZy1sb2FkYmFsYW5jZXRlc3QgcG9ydD0kcG9ydCB0YXJnZXRfc2Vzc2lvbl9h dHRycz1wcmltYXJ5IGNoZWNrX2FsbF9hZGRycz0xIiwKKwkidGFyZ2V0X3Nlc3Npb25fYXR0cnM9 cHJpbWFyeSBjb25uZWN0cyB0byB0aGUgZmlyc3Qgbm9kZSIsCisJc3FsID0+ICJTRUxFQ1QgJ2Nv bm5lY3QxJyIsCisJbG9nX2xpa2UgPT4gW3FyL3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0MScv XSk7Ciskbm9kZV9wcmltYXJ5Mi0+Y29ubmVjdF9vaygKKwkiaG9zdD1wZy1sb2FkYmFsYW5jZXRl c3QgcG9ydD0kcG9ydCB0YXJnZXRfc2Vzc2lvbl9hdHRycz1yZWFkLXdyaXRlIGNoZWNrX2FsbF9h ZGRycz0xIiwKKwkidGFyZ2V0X3Nlc3Npb25fYXR0cnM9cmVhZC13cml0ZSBjb25uZWN0cyB0byB0 aGUgZmlyc3Qgbm9kZSIsCisJc3FsID0+ICJTRUxFQ1QgJ2Nvbm5lY3QxJyIsCisJbG9nX2xpa2Ug PT4gW3FyL3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0MScvXSk7Ciskbm9kZV9zdGFuZGJ5LT5j b25uZWN0X29rKAorCSJob3N0PXBnLWxvYWRiYWxhbmNldGVzdCBwb3J0PSRwb3J0IHRhcmdldF9z ZXNzaW9uX2F0dHJzPWFueSBjaGVja19hbGxfYWRkcnM9MSIsCisJInRhcmdldF9zZXNzaW9uX2F0 dHJzPWFueSBjb25uZWN0cyB0byB0aGUgZmlyc3Qgbm9kZSIsCisJc3FsID0+ICJTRUxFQ1QgJ2Nv bm5lY3QxJyIsCisJbG9nX2xpa2UgPT4gW3FyL3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0MScv XSk7Ciskbm9kZV9zdGFuZGJ5LT5jb25uZWN0X29rKAorCSJob3N0PXBnLWxvYWRiYWxhbmNldGVz dCBwb3J0PSRwb3J0IHRhcmdldF9zZXNzaW9uX2F0dHJzPXN0YW5kYnkgY2hlY2tfYWxsX2FkZHJz PTEiLAorCSJ0YXJnZXRfc2Vzc2lvbl9hdHRycz1zdGFuZGJ5IGNvbm5lY3RzIHRvIHRoZSB0aGly ZCBub2RlIiwKKwlzcWwgPT4gIlNFTEVDVCAnY29ubmVjdDEnIiwKKwlsb2dfbGlrZSA9PiBbcXIv c3RhdGVtZW50OiBTRUxFQ1QgJ2Nvbm5lY3QxJy9dKTsKKyRub2RlX3N0YW5kYnktPmNvbm5lY3Rf b2soCisJImhvc3Q9cGctbG9hZGJhbGFuY2V0ZXN0IHBvcnQ9JHBvcnQgdGFyZ2V0X3Nlc3Npb25f YXR0cnM9cmVhZC1vbmx5IGNoZWNrX2FsbF9hZGRycz0xIiwKKwkidGFyZ2V0X3Nlc3Npb25fYXR0 cnM9cmVhZC1vbmx5IGNvbm5lY3RzIHRvIHRoZSB0aGlyZCBub2RlIiwKKwlzcWwgPT4gIlNFTEVD VCAnY29ubmVjdDEnIiwKKwlsb2dfbGlrZSA9PiBbcXIvc3RhdGVtZW50OiBTRUxFQ1QgJ2Nvbm5l Y3QxJy9dKTsKKworJG5vZGVfcHJpbWFyeTItPnN0b3AoKTsKKyRub2RlX3N0YW5kYnktPnN0b3Ao KTsKKworCitkb25lX3Rlc3RpbmcoKTsKZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBx L3QvMDA4X2xvYWRfYmFsYW5jZV9kbnNfY2hlY2tfYWxsX2FkZHJzLnBsIGIvc3JjL2ludGVyZmFj ZXMvbGlicHEvdC8wMDhfbG9hZF9iYWxhbmNlX2Ruc19jaGVja19hbGxfYWRkcnMucGwKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmQzNDA1NTk4ZTY3Ci0tLSAvZGV2L251 bGwKKysrIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvdC8wMDhfbG9hZF9iYWxhbmNlX2Ruc19jaGVj a19hbGxfYWRkcnMucGwKQEAgLTAsMCArMSwxMjggQEAKKyMgQ29weXJpZ2h0IChjKSAyMDIzLTIw MjUsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCit1c2Ugc3RyaWN0OwordXNl IHdhcm5pbmdzIEZBVEFMID0+ICdhbGwnOwordXNlIENvbmZpZzsKK3VzZSBQb3N0Z3JlU1FMOjpU ZXN0OjpVdGlsczsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOwordXNlIFRlc3Q6Ok1v cmU7CisKK2lmICghJEVOVntQR19URVNUX0VYVFJBfSB8fCAkRU5We1BHX1RFU1RfRVhUUkF9ICF+ IC9cYmxvYWRfYmFsYW5jZVxiLykKK3sKKwlwbGFuIHNraXBfYWxsID0+CisJICAnUG90ZW50aWFs bHkgdW5zYWZlIHRlc3QgbG9hZF9iYWxhbmNlIG5vdCBlbmFibGVkIGluIFBHX1RFU1RfRVhUUkEn OworfQorCitteSAkY2FuX2JpbmRfdG9fMTI3XzBfMF8yID0KKyAgJENvbmZpZ3tvc25hbWV9IGVx ICdsaW51eCcgfHwgJFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOjp3aW5kb3dzX29zOworCisjIENo ZWNrcyBmb3IgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGVzdGluZyBsb2FkIGJhbGFuY2luZyBtZXRo b2QgMgoraWYgKCEkY2FuX2JpbmRfdG9fMTI3XzBfMF8yKQoreworCXBsYW4gc2tpcF9hbGwgPT4g J2xvYWRfYmFsYW5jZSB0ZXN0IG9ubHkgc3VwcG9ydGVkIG9uIExpbnV4IGFuZCBXaW5kb3dzJzsK K30KKworbXkgJGhvc3RzX3BhdGg7CitpZiAoJHdpbmRvd3Nfb3MpCit7CisJJGhvc3RzX3BhdGgg PSAnYzpcV2luZG93c1xTeXN0ZW0zMlxEcml2ZXJzXGV0Y1xob3N0cyc7Cit9CitlbHNlCit7CisJ JGhvc3RzX3BhdGggPSAnL2V0Yy9ob3N0cyc7Cit9CisKK215ICRob3N0c19jb250ZW50ID0gUG9z dGdyZVNRTDo6VGVzdDo6VXRpbHM6OnNsdXJwX2ZpbGUoJGhvc3RzX3BhdGgpOworCitteSAkaG9z dHNfY291bnQgPSAoKSA9CisgICRob3N0c19jb250ZW50ID1+IC8xMjdcLjBcLjBcLlsxLTNdIHBn LWxvYWRiYWxhbmNldGVzdC9nOworaWYgKCRob3N0c19jb3VudCAhPSAzKQoreworCSMgSG9zdCBm aWxlIGlzIG5vdCBwcmVwYXJlZCBmb3IgdGhpcyB0ZXN0CisJcGxhbiBza2lwX2FsbCA9PiAiaG9z dHMgZmlsZSB3YXMgbm90IHByZXBhcmVkIGZvciBETlMgbG9hZCBiYWxhbmNlIHRlc3QiOworfQor CiskUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlcjo6dXNlX3RjcCA9IDE7CiskUG9zdGdyZVNRTDo6 VGVzdDo6Q2x1c3Rlcjo6dGVzdF9wZ2hvc3QgPSAnMTI3LjAuMC4xJzsKKworbXkgJHBvcnQgPSBQ b3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOjpnZXRfZnJlZV9wb3J0KCk7Citsb2NhbCAkVGVzdDo6 QnVpbGRlcjo6TGV2ZWwgPSAkVGVzdDo6QnVpbGRlcjo6TGV2ZWwgKyAxOworbXkgJG5vZGVfcHJp bWFyeTEgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoInByaW1hcnkxIiwgcG9ydCA9 PiAkcG9ydCk7Ciskbm9kZV9wcmltYXJ5MS0+aW5pdChoYXNfYXJjaGl2aW5nID0+IDEsIGFsbG93 c19zdHJlYW1pbmcgPT4gMSk7CisKKyMgU3RhcnQgaXQKKyRub2RlX3ByaW1hcnkxLT5zdGFydCgp OworCisjIFRha2UgYmFja3VwIGZyb20gd2hpY2ggYWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBydW4K KyRub2RlX3ByaW1hcnkxLT5iYWNrdXAoIm15X2JhY2t1cCIpOworCitteSAkbm9kZV9zdGFuZGJ5 ID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCJzdGFuZGJ5IiwgcG9ydCA9PiAkcG9y dCwgb3duX2hvc3QgPT4gMSk7Ciskbm9kZV9zdGFuZGJ5LT5pbml0X2Zyb21fYmFja3VwKCRub2Rl X3ByaW1hcnkxLCAibXlfYmFja3VwIiwKKwloYXNfcmVzdG9yaW5nID0+IDEpOworJG5vZGVfc3Rh bmRieS0+c3RhcnQoKTsKKworbXkgJG5vZGVfcHJpbWFyeTIgPSBQb3N0Z3JlU1FMOjpUZXN0OjpD bHVzdGVyLT5uZXcoIm5vZGUxIiwgcG9ydCA9PiAkcG9ydCwgb3duX2hvc3QgPT4gMSk7Ciskbm9k ZV9wcmltYXJ5Mi0+aW5pdCgpOworJG5vZGVfcHJpbWFyeTItPnN0YXJ0KCk7CitzdWIgdGVzdF90 YXJnZXRfc2Vzc2lvbl9hdHRyIHsKKwlteSAkdGFyZ2V0X3Nlc3Npb25fYXR0cnMgPSBzaGlmdDsK KwlteSAkdGVzdF9udW0gPSBzaGlmdDsKKwlteSAkcHJpbWFyeTFfZXhwZWN0X3RyYWZmaWMgPSBz aGlmdDsKKwlteSAkc3RhbmRieV9leHBlZWN0X3RyYWZmaWMgPSBzaGlmdDsKKwlteSAkcHJpbWFy eTJfZXhwZWN0X3RyYWZmaWMgPSBzaGlmdDsKKwkjIFN0YXRpc3RpY2FsbHkgdGhlIGZvbGxvd2lu ZyBsb29wIHdpdGggbG9hZF9iYWxhbmNlX2hvc3RzPXJhbmRvbSB3aWxsIGFsbW9zdAorCSMgY2Vy dGFpbmx5IGNvbm5lY3QgYXQgbGVhc3Qgb25jZSB0byBlYWNoIG9mIHRoZSBub2Rlcy4gVGhlIGNo YW5jZSBvZiB0aGF0IG5vdAorCSMgaGFwcGVuaW5nIGlzIHNvIHNtYWxsIHRoYXQgaXQncyBuZWds aWdpYmxlOiAoMi8zKV41MCA9IDEuNTY4MzI4NTVlLTkKKwlmb3JlYWNoIG15ICRpICgxIC4uIDUw KQorCXsKKwkJJG5vZGVfcHJpbWFyeTEtPmNvbm5lY3Rfb2soCisJCQkiaG9zdD1wZy1sb2FkYmFs YW5jZXRlc3QgcG9ydD0kcG9ydCBsb2FkX2JhbGFuY2VfaG9zdHM9cmFuZG9tIHRhcmdldF9zZXNz aW9uX2F0dHJzPSR7dGFyZ2V0X3Nlc3Npb25fYXR0cnN9IGNoZWNrX2FsbF9hZGRycz0xIiwKKwkJ CSJyZXBlYXRlZCBjb25uZWN0aW9ucyB3aXRoIHJhbmRvbSBsb2FkIGJhbGFuY2luZyIsCisJCQlz cWwgPT4gIlNFTEVDVCAnY29ubmVjdCR7dGVzdF9udW19JyIpOworCX0KKwlteSAkbm9kZV9wcmlt YXJ5MV9vY2N1cnJlbmNlcyA9ICgpID0KKwkgICRub2RlX3ByaW1hcnkxLT5sb2dfY29udGVudCgp ID1+IC9zdGF0ZW1lbnQ6IFNFTEVDVCAnY29ubmVjdCR7dGVzdF9udW19Jy9nOworCW15ICRub2Rl X3N0YW5kYnlfb2NjdXJyZW5jZXMgPSAoKSA9CisJICAkbm9kZV9zdGFuZGJ5LT5sb2dfY29udGVu dCgpID1+IC9zdGF0ZW1lbnQ6IFNFTEVDVCAnY29ubmVjdCR7dGVzdF9udW19Jy9nOworCW15ICRu b2RlX3ByaW1hcnkyX29jY3VycmVuY2VzID0gKCkgPQorCSAgJG5vZGVfcHJpbWFyeTItPmxvZ19j b250ZW50KCkgPX4gL3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0JHt0ZXN0X251bX0nL2c7CisK KwlteSAkdG90YWxfb2NjdXJyZW5jZXMgPQorCSAgJG5vZGVfcHJpbWFyeTFfb2NjdXJyZW5jZXMg KyAkbm9kZV9zdGFuZGJ5X29jY3VycmVuY2VzICsgJG5vZGVfcHJpbWFyeTJfb2NjdXJyZW5jZXM7 CisKKwlpZiAoJHByaW1hcnkxX2V4cGVjdF90cmFmZmljID09IDEpIHsKKwkJb2soJG5vZGVfcHJp bWFyeTFfb2NjdXJyZW5jZXMgPiAwLCAicmVjZWl2ZWQgYXQgbGVhc3Qgb25lIGNvbm5lY3Rpb24g b24gbm9kZTEiKTsKKwl9ZWxzZXsKKwkJb2soJG5vZGVfcHJpbWFyeTFfb2NjdXJyZW5jZXMgPT0g MCwgInJlY2VpdmVkIGF0IGxlYXN0IG9uZSBjb25uZWN0aW9uIG9uIG5vZGUxIik7CisJfQorCWlm ICgkc3RhbmRieV9leHBlZWN0X3RyYWZmaWMgPT0gMSkgeworCQlvaygkbm9kZV9zdGFuZGJ5X29j Y3VycmVuY2VzID4gMCwgInJlY2VpdmVkIGF0IGxlYXN0IG9uZSBjb25uZWN0aW9uIG9uIG5vZGUx Iik7CisJfWVsc2V7CisJCW9rKCRub2RlX3N0YW5kYnlfb2NjdXJyZW5jZXMgPT0gMCwgInJlY2Vp dmVkIGF0IGxlYXN0IG9uZSBjb25uZWN0aW9uIG9uIG5vZGUxIik7CisJfQorCisJaWYgKCRwcmlt YXJ5Ml9leHBlY3RfdHJhZmZpYyA9PSAxKSB7CisJCW9rKCRub2RlX3ByaW1hcnkyX29jY3VycmVu Y2VzID4gMCwgInJlY2VpdmVkIGF0IGxlYXN0IG9uZSBjb25uZWN0aW9uIG9uIG5vZGUxIik7CisJ fWVsc2V7CisJCW9rKCRub2RlX3ByaW1hcnkyX29jY3VycmVuY2VzID09IDAsICJyZWNlaXZlZCBh dCBsZWFzdCBvbmUgY29ubmVjdGlvbiBvbiBub2RlMSIpOworCX0KKworCW9rKCR0b3RhbF9vY2N1 cnJlbmNlcyA9PSA1MCwgInJlY2VpdmVkIDUwIGNvbm5lY3Rpb25zIGFjcm9zcyBhbGwgbm9kZXMi KTsKK30KKwordGVzdF90YXJnZXRfc2Vzc2lvbl9hdHRyKCdhbnknLAorCTEsIDEsIDEsIDEpOwor dGVzdF90YXJnZXRfc2Vzc2lvbl9hdHRyKCdyZWFkLW9ubHknLAorCTIsIDAsIDEsIDApOwordGVz dF90YXJnZXRfc2Vzc2lvbl9hdHRyKCdyZWFkLXdyaXRlJywKKwkzLCAxLCAwLCAxKTsKK3Rlc3Rf dGFyZ2V0X3Nlc3Npb25fYXR0cigncHJpbWFyeScsCisJNCwgMSwgMCwgMSk7Cit0ZXN0X3Rhcmdl dF9zZXNzaW9uX2F0dHIoJ3N0YW5kYnknLAorCTUsIDAsIDEsIDApOworCisKKyRub2RlX3ByaW1h cnkxLT5zdG9wKCk7Ciskbm9kZV9wcmltYXJ5Mi0+c3RvcCgpOworJG5vZGVfc3RhbmRieS0+c3Rv cCgpOworCitkb25lX3Rlc3RpbmcoKTsKLS0gCjIuNDcuMgoK --0000000000005d0f2e063555112b--