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 1wRmtG-002hR4-0Z for pgsql-hackers@arkaria.postgresql.org; Tue, 26 May 2026 08:11:54 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wRmtE-003tsB-06 for pgsql-hackers@arkaria.postgresql.org; Tue, 26 May 2026 08:11:52 +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 1wRmtD-003ts2-1e for pgsql-hackers@lists.postgresql.org; Tue, 26 May 2026 08:11:52 +0000 Received: from mail-vk1-xa2c.google.com ([2607:f8b0:4864:20::a2c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wRmtC-00000001UEA-1Q6E for pgsql-hackers@lists.postgresql.org; Tue, 26 May 2026 08:11:52 +0000 Received: by mail-vk1-xa2c.google.com with SMTP id 71dfb90a1353d-575267e3398so8530070e0c.1 for ; Tue, 26 May 2026 01:11:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779783108; cv=none; d=google.com; s=arc-20240605; b=h2iL43nW4lvgRIhf7zl5z9N5E0erlN9qiirF52Gp+Gkj3sul+iPPaKIm1LOBzGw78u tB3Df4mRuqXrkZDTn/LUl/7dk9m0inIfnGnD9RcNqoa9e/Q90sovgh127U9VEmM3K1VP Fb9jtn7jJxnZGGmZbRyG2lTka3NnKdcufkX7UIYaRIgNIUZBbIB+5KJ1Jn8ehkosECry fTNnBNNQEo6yVnKFlLk10apWIwKCNFbB+NqB3x3pQu1940lRIV6ScB8bU6twKbWT4yf7 5Lo7s+X9U8Cnlx5ccYPsBMWT5Uq6zaGBilA2SM+V6ngn2Cki8Yyu+0fNCOraZEHbKuNC 7TJQ== 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=0ZCMMs3olcW1c9AD9FiDnyXPO2rmjXAAHhvwiW/J4QQ=; fh=X2Npd8u+oriIuRZPJMz97e6HlZCLjr4cnEI7fwebWK0=; b=bSM8CciRcKwvJwMN/0zU87M9M00RpK8EV76jHBOeBAKTDaEy55DBH60HeRKImTLf1U lxoFHg9yO8F53i6ZAlPfuUQvHf+yh/FHw9ZX76tQqYaYV0WgcOqjBDVsLzSUCtwXeqUz +4xHO6rUizWl5vpLj6jygGdg/DBEibZKO5DilpPiJHOIgyJBUX/UwH9MLqCr6jVe6exr xuXUZbNhiYoBmYc39uhvdHC36yb6Zci6O3mb8syqoahiAxluSIaxXbd2o6FllnnllU7B itqdEZNt6oWbQTJcVMXw3GJHbvuzEKa/KM8dIbms+2hhWuvI/3qRvw0nnPiuv+TonRG3 0SJw==; darn=lists.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=1779783108; x=1780387908; darn=lists.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=0ZCMMs3olcW1c9AD9FiDnyXPO2rmjXAAHhvwiW/J4QQ=; b=VaqMnWxsUXqgroObvsPOJxfbgFgNjdALkEMDmOa3uoTpDnKxhtwGsQigYZmAAt6kPF OgxJhvI+VjEM8o3Pn/dXN7/LHsPOh50bDiJnwI3gdn7zsveFl1qokI+MaXehD1SS5tfs zo/JfASicfjT5Q9GLIADU2CJxxQu9uUX2DfljlX59d+kj9ay/EpYrx6ipAiy6rm7VYHW E/79yNhTtAXuazyST92nBBSXlcjKSaggnnNRWvgTs8DmqMel2f0x7U3EuAU0A2lK+3rF NiwdDXF5WoID+B9TFsn4sr4u1VoXuSOsAEN6BXX8/IuwFykpH6/tjv/JHjFqBK7uNCJ5 w2Gw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779783108; x=1780387908; 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=0ZCMMs3olcW1c9AD9FiDnyXPO2rmjXAAHhvwiW/J4QQ=; b=mbfh1Oql4TUE+sYbXmcCGAdrPw26w4w8rv+yJB/7IVsbXSNMaJ65eoLyC8yBDLwO4G Ig8/VlfhQbQ0o1yF2Jo2O7ywpnsh7JxUuBK5b0T/s0xcAZzWrTwlHKyAZnuzO9e4QEDi V0u80Kjtz+ybrtbB4VeC/7qfL4o2R3Hsm6HyQ+qoqr0U63/5K8McagE6drg0fw9YNJyl TB32tNDM+7ktzS6Asr6sDC7XdQfFbvOdDmyKHp7XcbLSyjbf1zI5XvB8Iw11snioXiJg fBc8BKJE4lOr1+rr/M+v/EN7F7nKC3FjZibt8258V6RWx7ONA0jtW6UBphJ9g8wXmGig n0FQ== X-Forwarded-Encrypted: i=1; AFNElJ9g3HzlwKmRVcD63SHPtO3LJ+pF/bdG2/1dlxY743V2nqZidjNG5eOhxzxQN39aGFxDuQOn21+Vz+JelhBZ@lists.postgresql.org X-Gm-Message-State: AOJu0YzagQOsLzpD8EoxO/YFsyderSfDzqqqfGAoL5SbSaQ/DF73zjHX 6rgtY5WeWygLRWAu+CNGJcsDajnLU+Gu2vzPTO70+XKYYnrrKmw4CnDi6U9fVHBFMxdRzj2q9UV zaYNPaUTlKASDF43QV/TpE0Fu1eQ9mbY= X-Gm-Gg: Acq92OGgt6+zNE+byA0dkQDqp4g0IuvoP69VquzhEgOK+vLcdCTnydugSVCR1ReOCaW NwVBz7qyCs9r4QaDr8QmHscfO7ygfUoEBpN5fpn4E43u38M6+fJAjxEnHJZ4L2xJzpqWsvyTKy4 rg53bvucYo9Haaaaj1V2NxY0BEY/XgHRd5jLFTHN7D6LDxaVD7khH/SO2/st6K92sMd5BkQsA+k i1KbsCJ4Pva1v84Emk4d3o5/xDNFZrM+AJHA6/HjwkGCR9nHyjnSpao3Oe0WnQwtydABZdDMSZp IytG7GY= X-Received: by 2002:a05:6122:da5:b0:56a:fcbf:8aa4 with SMTP id 71dfb90a1353d-5865ea8bfe4mr9637134e0c.2.1779783107955; Tue, 26 May 2026 01:11:47 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: SATYANARAYANA NARLAPURAM Date: Tue, 26 May 2026 01:11:36 -0700 X-Gm-Features: AVHnY4IAuApi8I-3RwSWpFg7DuzCuILaxhk53XCPFc2Da8O1R2L5krd1Ldo7YB8 Message-ID: Subject: Re: [PATCH] Release replication slot on error in SQL-callable slot functions To: shveta malik Cc: vignesh C , Fujii Masao , PostgreSQL Hackers , shveta malik Content-Type: multipart/mixed; boundary="000000000000ed6c8a0652b40b4d" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000ed6c8a0652b40b4d Content-Type: multipart/alternative; boundary="000000000000ed6c880652b40b4b" --000000000000ed6c880652b40b4b Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, On Mon, May 25, 2026 at 10:50=E2=80=AFPM shveta malik wrote: > On Tue, May 26, 2026 at 10:06=E2=80=AFAM shveta malik > wrote: > > > > On Tue, May 26, 2026 at 12:31=E2=80=AFAM SATYANARAYANA NARLAPURAM > > wrote: > > > > > > Hi, > > > > > > On Mon, May 25, 2026 at 2:58=E2=80=AFAM shveta malik > wrote: > > >> > > >> On Mon, May 25, 2026 at 12:42=E2=80=AFPM SATYANARAYANA NARLAPURAM > > >> wrote: > > >> > > > >> > Hi > > >> > > > >> > On Fri, May 22, 2026 at 2:16=E2=80=AFAM shveta malik < > shveta.malik@gmail.com> wrote: > > >> >> > > >> >> Thanks for reporting the issue. I could reproduce the same issue > with > > >> >> all these as well: > > >> >> > > >> >> pg_logical_slot_peek_changes > > >> >> pg_logical_slot_get_binary_changes > > >> >> pg_logical_slot_peek_binary_changes > > >> > > > >> > > > >> > Please find the attached v2 patch that addressed these three cases > as well. > > >> > > > >> > > >> Thank You for addressuing these cases. A few comments: > > >> > > >> 1) > > >> > > >> +-- Test 2: session remains usable after the error (MyReplicationSlo= t > cleared) > > >> > > >> It shoudl be part of 'Test 1' itself and thus should not be named as > 'Test 2' > > >> > > >> 2) > > >> -------- > > >> +-- Test 4: copy_replication_slot with max_replication_slots exceede= d. > > >> +-- We reduce max_replication_slots artificially by filling all > remaining slots. > > >> +-- Instead, trigger an error by copying to an already-existing name= . > > >> +DO $$ > > >> +BEGIN > > >> + PERFORM pg_copy_logical_replication_slot('regression_slot_t3', > > >> 'regression_slot_t3'); > > >> +EXCEPTION WHEN OTHERS THEN > > >> + RAISE NOTICE 'caught: %', SQLERRM; > > >> +END; > > >> +$$; > > >> +-- The original slot must still exist and be usable > > >> +SELECT count(*) =3D 1 AS orig_slot_ok FROM pg_replication_slots > > >> + WHERE slot_name =3D 'regression_slot_t3'; > > >> ----------- > > >> > > >> I don't think we can hit the Assert with above test (at-least I coul= d > > >> not). Since creation of slot itself will fail as the slot with > > >> same-name already exists, MyReplicationSlot will never be set and th= us > > >> Assert will not be hit. A better testcase will be below which fails > > >> during LoadOutputPlugin() after slot-creation and MyReplicationSlot = is > > >> set already. > > >> > > >> SELECT pg_create_logical_replication_slot('src_slot', > 'test_decoding'); > > >> > > >> DO $$ > > >> BEGIN > > >> PERFORM pg_copy_logical_replication_slot('src_slot', 'dst_slot', > > >> false, 'nonexistent_plugin'); > > >> EXCEPTION WHEN others THEN > > >> RAISE NOTICE 'caught: %', SQLERRM; > > >> END $$; > > >> > > >> SELECT count(*) FROM pg_logical_slot_get_changes('src_slot', NULL, > NULL); > > >> > > >> 3) > > >> So overall these are the problematic APIs: > > >> > > >> pg_create_logical_replication_slot > > >> pg_replication_slot_advance > > >> pg_copy_logical_replication_slot > > >> pg_logical_slot_peek_binary_changes > > >> pg_logical_slot_peek_changes > > >> pg_logical_slot_get_changes > > >> pg_logical_slot_get_binary_changes > > >> > > >> First 3 are are mutually exclusive fixes fow which we have added > > >> testcases. Last 4 are addressed by fixing common function > > >> pg_logical_slot_get_changes_guts(). I think we should add a test cas= e > > >> for at-least any one of these APIs to cover > > >> pg_logical_slot_get_changes_guts(). > > > > > > > > > Thanks for reviewing. Please review the attached v3 patch. > > > > > > > A few trivial things: > > > > 1) > > pg_replication_slot_advance: > > + PG_TRY(); > > + { > > + /* Acquire the slot so we "own" it */ > > + ReplicationSlotAcquire(NameStr(*slotname), true, true); > > + /* A slot whose restart_lsn has never been reserved cannot be advance= d > */ > > + if (!XLogRecPtrIsValid(MyReplicationSlot->data.restart_lsn)) > > > > > > We can have a blank line after ReplicationSlotAcquire for better > readability. > > > > 2) > > > > +SELECT 'init' FROM > > pg_create_logical_replication_slot('regression_slot_t3', > > 'test_decoding', true); > > +SELECT count(*) =3D 1 AS slot_exists FROM pg_replication_slots > > + WHERE slot_name =3D 'regression_slot_t3'; > > > > The intent is not clear why are we checking existence of > > regression_slot_t3? I think we can skip it (or else add a comment if > > really needed). The success of previous > > pg_create_logical_replication_slot is enough to confirm that session > > is healthy to run other slot related queries. > > > > 3) > > +SELECT pg_drop_replication_slot('regression_slot_phy'); > > + > > +-- cleanup > > +SELECT pg_drop_replication_slot('regression_slot_t3'); > > > > We can move drop of 'regression_slot_phy' too under '-- cleanup' > > > > ~~ > > > > I have no further comments other than the trivial things mentioned abov= e. > > > > Missed to inform this earlier, I am not able to apply any version of > the patches shared so far with 'git am'. It gives error, 'patch -p1' > works. > > git am > v3-0001-Release-replication-slot-on-error-in-slot-SQL-functions.patch > Patch format detection failed. > Thanks , Shveta! Please find the attached v4 patch that addressed your comments. Thanks, Satya --000000000000ed6c880652b40b4b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

On Mon, May 25, = 2026 at 10:50=E2=80=AFPM shveta malik <shveta.malik@gmail.com> wrote:
On Tue, May 26, 2026 at 10:06=E2=80=AFAM s= hveta malik <shveta.malik@gmail.com> wrote:
>
> On Tue, May 26, 2026 at 12:31=E2=80=AFAM SATYANARAYANA NARLAPURAM
> <sat= yanarlapuram@gmail.com> wrote:
> >
> > Hi,
> >
> > On Mon, May 25, 2026 at 2:58=E2=80=AFAM shveta malik <shveta.malik@gmail.com= > wrote:
> >>
> >> On Mon, May 25, 2026 at 12:42=E2=80=AFPM SATYANARAYANA NARLAP= URAM
> >> <satyanarlapuram@gmail.com> wrote:
> >> >
> >> > Hi
> >> >
> >> > On Fri, May 22, 2026 at 2:16=E2=80=AFAM shveta malik <= ;shveta.malik@g= mail.com> wrote:
> >> >>
> >> >> Thanks for reporting the issue. I could reproduce th= e same issue with
> >> >> all these as well:
> >> >>
> >> >> pg_logical_slot_peek_changes
> >> >> pg_logical_slot_get_binary_changes
> >> >> pg_logical_slot_peek_binary_changes
> >> >
> >> >
> >> > Please find the attached v2 patch that addressed these t= hree cases as well.
> >> >
> >>
> >> Thank You for addressuing these cases. A few comments:
> >>
> >> 1)
> >>
> >> +-- Test 2: session remains usable after the error (MyReplica= tionSlot cleared)
> >>
> >> It shoudl be part of 'Test 1' itself and thus should = not be named as 'Test 2'
> >>
> >> 2)
> >> --------
> >> +-- Test 4: copy_replication_slot with max_replication_slots = exceeded.
> >> +-- We reduce max_replication_slots artificially by filling a= ll remaining slots.
> >> +-- Instead, trigger an error by copying to an already-existi= ng name.
> >> +DO $$
> >> +BEGIN
> >> +=C2=A0 =C2=A0 PERFORM pg_copy_logical_replication_slot('= regression_slot_t3',
> >> 'regression_slot_t3');
> >> +EXCEPTION WHEN OTHERS THEN
> >> +=C2=A0 =C2=A0 RAISE NOTICE 'caught: %', SQLERRM;
> >> +END;
> >> +$$;
> >> +-- The original slot must still exist and be usable
> >> +SELECT count(*) =3D 1 AS orig_slot_ok FROM pg_replication_sl= ots
> >> +=C2=A0 =C2=A0 WHERE slot_name =3D 'regression_slot_t3= 9;;
> >> -----------
> >>
> >> I don't think we can hit the Assert with above test (at-l= east I could
> >> not). Since creation of slot itself will fail as the slot wit= h
> >> same-name already exists, MyReplicationSlot will never be set= and thus
> >> Assert will not be hit.=C2=A0 A better testcase will be below= which fails
> >> during LoadOutputPlugin() after slot-creation and MyReplicati= onSlot is
> >> set already.
> >>
> >> SELECT pg_create_logical_replication_slot('src_slot',= 'test_decoding');
> >>
> >> DO $$
> >> BEGIN
> >> PERFORM pg_copy_logical_replication_slot('src_slot', = 'dst_slot',
> >> false, 'nonexistent_plugin');
> >> EXCEPTION WHEN others THEN
> >> RAISE NOTICE 'caught: %', SQLERRM;
> >> END $$;
> >>
> >> SELECT count(*) FROM pg_logical_slot_get_changes('src_slo= t', NULL, NULL);
> >>
> >> 3)
> >> So overall these are the problematic APIs:
> >>
> >> pg_create_logical_replication_slot
> >> pg_replication_slot_advance
> >> pg_copy_logical_replication_slot
> >> pg_logical_slot_peek_binary_changes
> >> pg_logical_slot_peek_changes
> >> pg_logical_slot_get_changes
> >> pg_logical_slot_get_binary_changes
> >>
> >> First 3 are are mutually exclusive fixes fow which we have ad= ded
> >> testcases. Last 4 are addressed by fixing common function
> >> pg_logical_slot_get_changes_guts(). I think we should add a t= est case
> >> for at-least any one of these APIs to cover
> >> pg_logical_slot_get_changes_guts().
> >
> >
> > Thanks for reviewing. Please review the attached v3 patch.
> >
>
> A few trivial things:
>
> 1)
> pg_replication_slot_advance:
> + PG_TRY();
> + {
> + /* Acquire the slot so we "own" it */
> + ReplicationSlotAcquire(NameStr(*slotname), true, true);
> + /* A slot whose restart_lsn has never been reserved cannot be advanc= ed */
> + if (!XLogRecPtrIsValid(MyReplicationSlot->data.restart_lsn))
>
>
> We can have a blank line after ReplicationSlotAcquire for better reada= bility.
>
> 2)
>
> +SELECT 'init' FROM
> pg_create_logical_replication_slot('regression_slot_t3',
> 'test_decoding', true);
> +SELECT count(*) =3D 1 AS slot_exists FROM pg_replication_slots
> +=C2=A0 =C2=A0 WHERE slot_name =3D 'regression_slot_t3';
>
> The intent is not clear why are we checking existence of
> regression_slot_t3? I think we can skip it (or else add a comment if > really needed). The success of previous
> pg_create_logical_replication_slot is enough to confirm that session > is healthy to run other slot related queries.
>
> 3)
> +SELECT pg_drop_replication_slot('regression_slot_phy');
> +
> +-- cleanup
> +SELECT pg_drop_replication_slot('regression_slot_t3');
>
> We can move drop of 'regression_slot_phy' too under '-- cl= eanup'
>
> ~~
>
> I have no further comments other than the trivial things mentioned abo= ve.
>

Missed to inform this earlier, I am not able to apply any version of
the patches shared so far with 'git am'. It gives error, 'patch= -p1'
works.

git am v3-0001-Release-replication-slot-on-error-in-slot-SQL-functions.patc= h
Patch format detection failed.
Thanks , Shveta! Please= find the attached v4 patch that addressed your comments.

Thanks,
Satya
--000000000000ed6c880652b40b4b-- --000000000000ed6c8a0652b40b4d Content-Type: application/octet-stream; name="v4-0001-Release-replication-slot-on-error-in-slot-SQL-functions.patch" Content-Disposition: attachment; filename="v4-0001-Release-replication-slot-on-error-in-slot-SQL-functions.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpmcv6hg0 RnJvbSBkMmJlMzE5OGEwMzc0MDcyZTdkOGM0YTJkYzk0Y2M5YmI2MTU1ZGRhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTYXR5YSBOYXJsYXB1cmFtIDxzYXR5YW5hcmxhcHVyYW1AZ21h aWwuY29tPgpEYXRlOiBUdWUsIDI2IE1heSAyMDI2IDA4OjAwOjUxICswMDAwClN1YmplY3Q6IFtQ QVRDSCB2NF0gUmVsZWFzZSByZXBsaWNhdGlvbiBzbG90IG9uIGVycm9yIGluIHNsb3QgU1FMIGZ1 bmN0aW9ucwoKRW5zdXJlIHJlcGxpY2F0aW9uIHNsb3RzIGFyZSBwcm9wZXJseSByZWxlYXNlZCBv ciBkcm9wcGVkIHdoZW4gYW4gZXJyb3IKb2NjdXJzIGluIFNRTC1jYWxsYWJsZSByZXBsaWNhdGlv biBzbG90IGZ1bmN0aW9ucywgcGFydGljdWxhcmx5IHdoZW4gdGhlCmVycm9yIGlzIGNhdWdodCBi eSBhIFBML3BnU1FMIEVYQ0VQVElPTiBoYW5kbGVyIHRoYXQgZG9lcyBub3QgdGVybWluYXRlCnRo ZSBzZXNzaW9uLgoKUHJldmlvdXNseSwgZnVuY3Rpb25zIGxpa2UgcGdfY3JlYXRlX2xvZ2ljYWxf cmVwbGljYXRpb25fc2xvdCgpLApwZ19yZXBsaWNhdGlvbl9zbG90X2FkdmFuY2UoKSwgcGdfY29w eV9sb2dpY2FsX3JlcGxpY2F0aW9uX3Nsb3QoKSwgYW5kCnBnX2xvZ2ljYWxfc2xvdF9nZXRfY2hh bmdlcygpIGNvdWxkIGxlYXZlIHNsb3RzIGFjcXVpcmVkIG9yIHBhcnRpYWxseQpjcmVhdGVkIHdo ZW4gYW4gZXJyb3Igb2NjdXJyZWQgbWlkLW9wZXJhdGlvbi4gIElmIHRoZSBlcnJvciB3YXMgY2F1 Z2h0IGJ5CmEgUEwvcGdTUUwgRVhDRVBUSU9OIGhhbmRsZXIgKHdoaWNoIHVzZXMgc3VidHJhbnNh Y3Rpb25zKSwgdGhlIHNsb3Qgd291bGQKcmVtYWluIGxvY2tlZCBmb3IgdGhlIHJlc3Qgb2YgdGhl IHNlc3Npb24sIGNhdXNpbmcgc3Vic2VxdWVudCBvcGVyYXRpb25zCnRvIGZhaWwuCgpGaXggYnkg d3JhcHBpbmcgdGhlIGNyaXRpY2FsIHNlY3Rpb25zIGluIFBHX1RSWS9QR19DQVRDSCBibG9ja3Mu Ci0tLQogY29udHJpYi90ZXN0X2RlY29kaW5nL2V4cGVjdGVkL3Nsb3Qub3V0ICAgICAgIHwgMTEy ICsrKysrKysrKysrCiBjb250cmliL3Rlc3RfZGVjb2Rpbmcvc3FsL3Nsb3Quc3FsICAgICAgICAg ICAgfCAgNjUgKysrKysrKwogLi4uL3JlcGxpY2F0aW9uL2xvZ2ljYWwvbG9naWNhbGZ1bmNzLmMg ICAgICAgIHwgICA3ICstCiBzcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9zbG90ZnVuY3MuYyAgICAg ICAgICAgfCAxODAgKysrKysrKysrKystLS0tLS0tCiA0IGZpbGVzIGNoYW5nZWQsIDI5MyBpbnNl cnRpb25zKCspLCA3MSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3Rlc3RfZGVj b2RpbmcvZXhwZWN0ZWQvc2xvdC5vdXQgYi9jb250cmliL3Rlc3RfZGVjb2RpbmcvZXhwZWN0ZWQv c2xvdC5vdXQKaW5kZXggN2RlMDNjNzlmNmYuLmY0Y2IyMzQwMjhiIDEwMDY0NAotLS0gYS9jb250 cmliL3Rlc3RfZGVjb2RpbmcvZXhwZWN0ZWQvc2xvdC5vdXQKKysrIGIvY29udHJpYi90ZXN0X2Rl Y29kaW5nL2V4cGVjdGVkL3Nsb3Qub3V0CkBAIC00NjYsMyArNDY2LDExNSBAQCBTRUxFQ1QgcGdf ZHJvcF9yZXBsaWNhdGlvbl9zbG90KCdwaHlzaWNhbF9zbG90Jyk7CiAgCiAoMSByb3cpCiAKKy0t CistLSBUZXN0IHRoYXQgcmVwbGljYXRpb24gc2xvdHMgYXJlIHByb3Blcmx5IHJlbGVhc2VkIG9y IGRyb3BwZWQgb24gZXJyb3IsCistLSBldmVuIHdoZW4gdGhlIGVycm9yIGlzIGNhdWdodCBieSBh IFBML3BnU1FMIEVYQ0VQVElPTiBoYW5kbGVyICh3aGljaAorLS0gZG9lc24ndCB0ZXJtaW5hdGUg dGhlIHNlc3Npb24pLgorLS0KKy0tIHBnX2NyZWF0ZV9sb2dpY2FsX3JlcGxpY2F0aW9uX3Nsb3Q6 IGVycm9yIGR1cmluZyBzbG90IGNyZWF0aW9uIHNob3VsZAorLS0gZHJvcCB0aGUgc2xvdC4KK0RP ICQkCitCRUdJTgorICAgIFBFUkZPUk0gcGdfY3JlYXRlX2xvZ2ljYWxfcmVwbGljYXRpb25fc2xv dCgncmVncmVzc2lvbl9zbG90X2Vycm9yJywgJ25vbmV4aXN0ZW50X3BsdWdpbl94eXonLCB0cnVl KTsKK0VYQ0VQVElPTiBXSEVOIE9USEVSUyBUSEVOCisgICAgUkFJU0UgTk9USUNFICdjYXVnaHQ6 ICUnLCBTUUxFUlJNOworRU5EOworJCQ7CitOT1RJQ0U6ICBjYXVnaHQ6IGNvdWxkIG5vdCBhY2Nl c3MgZmlsZSAibm9uZXhpc3RlbnRfcGx1Z2luX3h5eiI6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3Rv cnkKK1NFTEVDVCBjb3VudCgqKSA9IDAgQVMgc2xvdF93YXNfZHJvcHBlZCBGUk9NIHBnX3JlcGxp Y2F0aW9uX3Nsb3RzCisgICAgV0hFUkUgc2xvdF9uYW1lID0gJ3JlZ3Jlc3Npb25fc2xvdF9lcnJv cic7Cisgc2xvdF93YXNfZHJvcHBlZCAKKy0tLS0tLS0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykK KworU0VMRUNUICdpbml0JyBGUk9NIHBnX2NyZWF0ZV9sb2dpY2FsX3JlcGxpY2F0aW9uX3Nsb3Qo J3JlZ3Jlc3Npb25fc2xvdF90MycsICd0ZXN0X2RlY29kaW5nJywgdHJ1ZSk7CisgP2NvbHVtbj8g CistLS0tLS0tLS0tCisgaW5pdAorKDEgcm93KQorCistLSBwZ19yZXBsaWNhdGlvbl9zbG90X2Fk dmFuY2U6IGVycm9yIGFmdGVyIGFjcXVpcmluZyB0aGUgc2xvdCBzaG91bGQKKy0tIHJlbGVhc2Ug aXQgc28gdGhlIHNlc3Npb24gc3RheXMgdXNhYmxlLgorU0VMRUNUIHNsb3RfbmFtZSBGUk9NIHBn X3JlcGxpY2F0aW9uX3Nsb3RfYWR2YW5jZSgncmVncmVzc2lvbl9zbG90X3QzJywgcGdfY3VycmVu dF93YWxfbHNuKCkpOworICAgICBzbG90X25hbWUgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t CisgcmVncmVzc2lvbl9zbG90X3QzCisoMSByb3cpCisKK0RPICQkCitCRUdJTgorICAgIFBFUkZP Uk0gcGdfcmVwbGljYXRpb25fc2xvdF9hZHZhbmNlKCdyZWdyZXNzaW9uX3Nsb3RfdDMnLCAnMC8x Jyk7CitFWENFUFRJT04gV0hFTiBPVEhFUlMgVEhFTgorICAgIFJBSVNFIE5PVElDRSAnY2F1Z2h0 IGV4cGVjdGVkIGVycm9yJzsKK0VORDsKKyQkOworTk9USUNFOiAgY2F1Z2h0IGV4cGVjdGVkIGVy cm9yCistLSB0aGUgc2Vzc2lvbiBpcyBzdGlsbCBoZWFsdGh5CitTRUxFQ1Qgc2xvdF9uYW1lIEZS T00gcGdfcmVwbGljYXRpb25fc2xvdF9hZHZhbmNlKCdyZWdyZXNzaW9uX3Nsb3RfdDMnLCBwZ19j dXJyZW50X3dhbF9sc24oKSk7CisgICAgIHNsb3RfbmFtZSAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyByZWdyZXNzaW9uX3Nsb3RfdDMKKygxIHJvdykKKworLS0gcGdfY29weV9sb2dpY2Fs X3JlcGxpY2F0aW9uX3Nsb3Q6IGVycm9yIGFmdGVyIGNyZWF0aW5nIHRoZSBkZXN0aW5hdGlvbgor LS0gc2xvdCBzaG91bGQgZHJvcCBpdC4KK0RPICQkCitCRUdJTgorICAgIFBFUkZPUk0gcGdfY29w eV9sb2dpY2FsX3JlcGxpY2F0aW9uX3Nsb3QoJ3JlZ3Jlc3Npb25fc2xvdF90MycsICdyZWdyZXNz aW9uX3Nsb3RfZHN0JywgZmFsc2UsICdub25leGlzdGVudF9wbHVnaW5feHl6Jyk7CitFWENFUFRJ T04gV0hFTiBPVEhFUlMgVEhFTgorICAgIFJBSVNFIE5PVElDRSAnY2F1Z2h0OiAlJywgU1FMRVJS TTsKK0VORDsKKyQkOworTk9USUNFOiAgY2F1Z2h0OiBjb3VsZCBub3QgYWNjZXNzIGZpbGUgIm5v bmV4aXN0ZW50X3BsdWdpbl94eXoiOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CistLSB0aGUg ZGVzdGluYXRpb24gc2xvdCBtdXN0IG5vdCBleGlzdCAoaXQgd2FzIGRyb3BwZWQgb24gZXJyb3Ip CitTRUxFQ1QgY291bnQoKikgPSAwIEFTIGRzdF9zbG90X2Ryb3BwZWQgRlJPTSBwZ19yZXBsaWNh dGlvbl9zbG90cworICAgIFdIRVJFIHNsb3RfbmFtZSA9ICdyZWdyZXNzaW9uX3Nsb3RfZHN0JzsK KyBkc3Rfc2xvdF9kcm9wcGVkIAorLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQorCist LSB0aGUgc2Vzc2lvbiBpcyBzdGlsbCB1c2FibGUKK1NFTEVDVCBjb3VudCgqKSA+PSAwIEFTIGNo YW5nZXNfb2sgRlJPTSBwZ19sb2dpY2FsX3Nsb3RfZ2V0X2NoYW5nZXMoJ3JlZ3Jlc3Npb25fc2xv dF90MycsIE5VTEwsIE5VTEwpOworIGNoYW5nZXNfb2sgCistLS0tLS0tLS0tLS0KKyB0CisoMSBy b3cpCisKKy0tIHBnX2xvZ2ljYWxfc2xvdF9nZXRfY2hhbmdlczogZXJyb3IgYWZ0ZXIgYWNxdWly aW5nIHRoZSBzbG90IHNob3VsZAorLS0gcmVsZWFzZSBpdC4KK1NFTEVDVCAnaW5pdCcgRlJPTSBw Z19jcmVhdGVfcGh5c2ljYWxfcmVwbGljYXRpb25fc2xvdCgncmVncmVzc2lvbl9zbG90X3BoeScs IHRydWUpOworID9jb2x1bW4/IAorLS0tLS0tLS0tLQorIGluaXQKKygxIHJvdykKKworRE8gJCQK K0JFR0lOCisgICAgUEVSRk9STSBwZ19sb2dpY2FsX3Nsb3RfZ2V0X2NoYW5nZXMoJ3JlZ3Jlc3Np b25fc2xvdF9waHknLCBOVUxMLCBOVUxMKTsKK0VYQ0VQVElPTiBXSEVOIE9USEVSUyBUSEVOCisg ICAgUkFJU0UgTk9USUNFICdjYXVnaHQ6ICUnLCBTUUxFUlJNOworRU5EOworJCQ7CitOT1RJQ0U6 ICBjYXVnaHQ6IGNhbm5vdCB1c2UgcGh5c2ljYWwgcmVwbGljYXRpb24gc2xvdCBmb3IgbG9naWNh bCBkZWNvZGluZworLS0gdGhlIHNlc3Npb24gaXMgc3RpbGwgdXNhYmxlCitTRUxFQ1Qgc2xvdF9u YW1lIEZST00gcGdfcmVwbGljYXRpb25fc2xvdF9hZHZhbmNlKCdyZWdyZXNzaW9uX3Nsb3RfdDMn LCBwZ19jdXJyZW50X3dhbF9sc24oKSk7CisgICAgIHNsb3RfbmFtZSAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyByZWdyZXNzaW9uX3Nsb3RfdDMKKygxIHJvdykKKworLS0gY2xlYW51cAor U0VMRUNUIHBnX2Ryb3BfcmVwbGljYXRpb25fc2xvdCgncmVncmVzc2lvbl9zbG90X3BoeScpOwor IHBnX2Ryb3BfcmVwbGljYXRpb25fc2xvdCAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg CisoMSByb3cpCisKK1NFTEVDVCBwZ19kcm9wX3JlcGxpY2F0aW9uX3Nsb3QoJ3JlZ3Jlc3Npb25f c2xvdF90MycpOworIHBnX2Ryb3BfcmVwbGljYXRpb25fc2xvdCAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgCisoMSByb3cpCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGVzdF9kZWNvZGlu Zy9zcWwvc2xvdC5zcWwgYi9jb250cmliL3Rlc3RfZGVjb2Rpbmcvc3FsL3Nsb3Quc3FsCmluZGV4 IDU4MGUzYWUzYmVmLi5lYWJiZTA1Y2M5MCAxMDA2NDQKLS0tIGEvY29udHJpYi90ZXN0X2RlY29k aW5nL3NxbC9zbG90LnNxbAorKysgYi9jb250cmliL3Rlc3RfZGVjb2Rpbmcvc3FsL3Nsb3Quc3Fs CkBAIC0xOTAsMyArMTkwLDY4IEBAIFNFTEVDVCBwZ19kcm9wX3JlcGxpY2F0aW9uX3Nsb3QoJ2Zh aWxvdmVyX3RydWVfc2xvdCcpOwogU0VMRUNUIHBnX2Ryb3BfcmVwbGljYXRpb25fc2xvdCgnZmFp bG92ZXJfZmFsc2Vfc2xvdCcpOwogU0VMRUNUIHBnX2Ryb3BfcmVwbGljYXRpb25fc2xvdCgnZmFp bG92ZXJfZGVmYXVsdF9zbG90Jyk7CiBTRUxFQ1QgcGdfZHJvcF9yZXBsaWNhdGlvbl9zbG90KCdw aHlzaWNhbF9zbG90Jyk7CisKKy0tCistLSBUZXN0IHRoYXQgcmVwbGljYXRpb24gc2xvdHMgYXJl IHByb3Blcmx5IHJlbGVhc2VkIG9yIGRyb3BwZWQgb24gZXJyb3IsCistLSBldmVuIHdoZW4gdGhl IGVycm9yIGlzIGNhdWdodCBieSBhIFBML3BnU1FMIEVYQ0VQVElPTiBoYW5kbGVyICh3aGljaAor LS0gZG9lc24ndCB0ZXJtaW5hdGUgdGhlIHNlc3Npb24pLgorLS0KKworLS0gcGdfY3JlYXRlX2xv Z2ljYWxfcmVwbGljYXRpb25fc2xvdDogZXJyb3IgZHVyaW5nIHNsb3QgY3JlYXRpb24gc2hvdWxk CistLSBkcm9wIHRoZSBzbG90LgorRE8gJCQKK0JFR0lOCisgICAgUEVSRk9STSBwZ19jcmVhdGVf bG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KCdyZWdyZXNzaW9uX3Nsb3RfZXJyb3InLCAnbm9uZXhp c3RlbnRfcGx1Z2luX3h5eicsIHRydWUpOworRVhDRVBUSU9OIFdIRU4gT1RIRVJTIFRIRU4KKyAg ICBSQUlTRSBOT1RJQ0UgJ2NhdWdodDogJScsIFNRTEVSUk07CitFTkQ7CiskJDsKK1NFTEVDVCBj b3VudCgqKSA9IDAgQVMgc2xvdF93YXNfZHJvcHBlZCBGUk9NIHBnX3JlcGxpY2F0aW9uX3Nsb3Rz CisgICAgV0hFUkUgc2xvdF9uYW1lID0gJ3JlZ3Jlc3Npb25fc2xvdF9lcnJvcic7CisKK1NFTEVD VCAnaW5pdCcgRlJPTSBwZ19jcmVhdGVfbG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KCdyZWdyZXNz aW9uX3Nsb3RfdDMnLCAndGVzdF9kZWNvZGluZycsIHRydWUpOworCistLSBwZ19yZXBsaWNhdGlv bl9zbG90X2FkdmFuY2U6IGVycm9yIGFmdGVyIGFjcXVpcmluZyB0aGUgc2xvdCBzaG91bGQKKy0t IHJlbGVhc2UgaXQgc28gdGhlIHNlc3Npb24gc3RheXMgdXNhYmxlLgorU0VMRUNUIHNsb3RfbmFt ZSBGUk9NIHBnX3JlcGxpY2F0aW9uX3Nsb3RfYWR2YW5jZSgncmVncmVzc2lvbl9zbG90X3QzJywg cGdfY3VycmVudF93YWxfbHNuKCkpOworRE8gJCQKK0JFR0lOCisgICAgUEVSRk9STSBwZ19yZXBs aWNhdGlvbl9zbG90X2FkdmFuY2UoJ3JlZ3Jlc3Npb25fc2xvdF90MycsICcwLzEnKTsKK0VYQ0VQ VElPTiBXSEVOIE9USEVSUyBUSEVOCisgICAgUkFJU0UgTk9USUNFICdjYXVnaHQgZXhwZWN0ZWQg ZXJyb3InOworRU5EOworJCQ7CistLSB0aGUgc2Vzc2lvbiBpcyBzdGlsbCBoZWFsdGh5CitTRUxF Q1Qgc2xvdF9uYW1lIEZST00gcGdfcmVwbGljYXRpb25fc2xvdF9hZHZhbmNlKCdyZWdyZXNzaW9u X3Nsb3RfdDMnLCBwZ19jdXJyZW50X3dhbF9sc24oKSk7CisKKy0tIHBnX2NvcHlfbG9naWNhbF9y ZXBsaWNhdGlvbl9zbG90OiBlcnJvciBhZnRlciBjcmVhdGluZyB0aGUgZGVzdGluYXRpb24KKy0t IHNsb3Qgc2hvdWxkIGRyb3AgaXQuCitETyAkJAorQkVHSU4KKyAgICBQRVJGT1JNIHBnX2NvcHlf bG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KCdyZWdyZXNzaW9uX3Nsb3RfdDMnLCAncmVncmVzc2lv bl9zbG90X2RzdCcsIGZhbHNlLCAnbm9uZXhpc3RlbnRfcGx1Z2luX3h5eicpOworRVhDRVBUSU9O IFdIRU4gT1RIRVJTIFRIRU4KKyAgICBSQUlTRSBOT1RJQ0UgJ2NhdWdodDogJScsIFNRTEVSUk07 CitFTkQ7CiskJDsKKy0tIHRoZSBkZXN0aW5hdGlvbiBzbG90IG11c3Qgbm90IGV4aXN0IChpdCB3 YXMgZHJvcHBlZCBvbiBlcnJvcikKK1NFTEVDVCBjb3VudCgqKSA9IDAgQVMgZHN0X3Nsb3RfZHJv cHBlZCBGUk9NIHBnX3JlcGxpY2F0aW9uX3Nsb3RzCisgICAgV0hFUkUgc2xvdF9uYW1lID0gJ3Jl Z3Jlc3Npb25fc2xvdF9kc3QnOworLS0gdGhlIHNlc3Npb24gaXMgc3RpbGwgdXNhYmxlCitTRUxF Q1QgY291bnQoKikgPj0gMCBBUyBjaGFuZ2VzX29rIEZST00gcGdfbG9naWNhbF9zbG90X2dldF9j aGFuZ2VzKCdyZWdyZXNzaW9uX3Nsb3RfdDMnLCBOVUxMLCBOVUxMKTsKKworLS0gcGdfbG9naWNh bF9zbG90X2dldF9jaGFuZ2VzOiBlcnJvciBhZnRlciBhY3F1aXJpbmcgdGhlIHNsb3Qgc2hvdWxk CistLSByZWxlYXNlIGl0LgorU0VMRUNUICdpbml0JyBGUk9NIHBnX2NyZWF0ZV9waHlzaWNhbF9y ZXBsaWNhdGlvbl9zbG90KCdyZWdyZXNzaW9uX3Nsb3RfcGh5JywgdHJ1ZSk7CitETyAkJAorQkVH SU4KKyAgICBQRVJGT1JNIHBnX2xvZ2ljYWxfc2xvdF9nZXRfY2hhbmdlcygncmVncmVzc2lvbl9z bG90X3BoeScsIE5VTEwsIE5VTEwpOworRVhDRVBUSU9OIFdIRU4gT1RIRVJTIFRIRU4KKyAgICBS QUlTRSBOT1RJQ0UgJ2NhdWdodDogJScsIFNRTEVSUk07CitFTkQ7CiskJDsKKy0tIHRoZSBzZXNz aW9uIGlzIHN0aWxsIHVzYWJsZQorU0VMRUNUIHNsb3RfbmFtZSBGUk9NIHBnX3JlcGxpY2F0aW9u X3Nsb3RfYWR2YW5jZSgncmVncmVzc2lvbl9zbG90X3QzJywgcGdfY3VycmVudF93YWxfbHNuKCkp OworCistLSBjbGVhbnVwCitTRUxFQ1QgcGdfZHJvcF9yZXBsaWNhdGlvbl9zbG90KCdyZWdyZXNz aW9uX3Nsb3RfcGh5Jyk7CitTRUxFQ1QgcGdfZHJvcF9yZXBsaWNhdGlvbl9zbG90KCdyZWdyZXNz aW9uX3Nsb3RfdDMnKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2lj YWwvbG9naWNhbGZ1bmNzLmMgYi9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL2xvZ2lj YWxmdW5jcy5jCmluZGV4IDcxZmJhZjcyMjY5Li5hYTU2ZTkwYmZhYiAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvcmVwbGljYXRpb24vbG9naWNhbC9sb2dpY2FsZnVuY3MuYworKysgYi9zcmMvYmFj a2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL2xvZ2ljYWxmdW5jcy5jCkBAIC0xOTcsMTAgKzE5Nywx MCBAQCBwZ19sb2dpY2FsX3Nsb3RfZ2V0X2NoYW5nZXNfZ3V0cyhGdW5jdGlvbkNhbGxJbmZvIGZj aW5mbywgYm9vbCBjb25maXJtLCBib29sIGJpbgogCWVsc2UKIAkJZW5kX29mX3dhbCA9IEdldFhM b2dSZXBsYXlSZWNQdHIoTlVMTCk7CiAKLQlSZXBsaWNhdGlvblNsb3RBY3F1aXJlKE5hbWVTdHIo Km5hbWUpLCB0cnVlLCB0cnVlKTsKLQogCVBHX1RSWSgpOwogCXsKKwkJUmVwbGljYXRpb25TbG90 QWNxdWlyZShOYW1lU3RyKCpuYW1lKSwgdHJ1ZSwgdHJ1ZSk7CisKIAkJLyogcmVzdGFydCBhdCBz bG90J3MgY29uZmlybWVkX2ZsdXNoICovCiAJCWN0eCA9IENyZWF0ZURlY29kaW5nQ29udGV4dChJ bnZhbGlkWExvZ1JlY1B0ciwKIAkJCQkJCQkJCW9wdGlvbnMsCkBAIC0zMjAsNiArMzIwLDkgQEAg cGdfbG9naWNhbF9zbG90X2dldF9jaGFuZ2VzX2d1dHMoRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8s IGJvb2wgY29uZmlybSwgYm9vbCBiaW4KIAkJLyogY2xlYXIgYWxsIHRpbWV0cmF2ZWwgZW50cmll cyAqLwogCQlJbnZhbGlkYXRlU3lzdGVtQ2FjaGVzKCk7CiAKKwkJaWYgKE15UmVwbGljYXRpb25T bG90ICE9IE5VTEwpCisJCQlSZXBsaWNhdGlvblNsb3RSZWxlYXNlKCk7CisKIAkJUEdfUkVfVEhS T1coKTsKIAl9CiAJUEdfRU5EX1RSWSgpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcmVwbGlj YXRpb24vc2xvdGZ1bmNzLmMgYi9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9zbG90ZnVuY3MuYwpp bmRleCAxNmZiZDM4MzczNS4uOWJhOWJkODkyZTYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3Jl cGxpY2F0aW9uL3Nsb3RmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Nsb3Rm dW5jcy5jCkBAIC0xNDgsMzggKzE0OCw1NSBAQCBjcmVhdGVfbG9naWNhbF9yZXBsaWNhdGlvbl9z bG90KGNoYXIgKm5hbWUsIGNoYXIgKnBsdWdpbiwKIAkJCQkJCSAgdGVtcG9yYXJ5ID8gUlNfVEVN UE9SQVJZIDogUlNfRVBIRU1FUkFMLCB0d29fcGhhc2UsCiAJCQkJCQkgIGZhbHNlLCBmYWlsb3Zl ciwgZmFsc2UpOwogCi0JLyoKLQkgKiBFbnN1cmUgdGhlIGxvZ2ljYWwgZGVjb2RpbmcgaXMgZW5h YmxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBsb2dpY2FsCi0JICogZGVjb2RpbmcgY29udGV4 dC4KLQkgKi8KLQlFbnN1cmVMb2dpY2FsRGVjb2RpbmdFbmFibGVkKCk7Ci0JQXNzZXJ0KElzTG9n aWNhbERlY29kaW5nRW5hYmxlZCgpKTsKKwlQR19UUlkoKTsKKwl7CisJCS8qCisJCSAqIEVuc3Vy ZSB0aGUgbG9naWNhbCBkZWNvZGluZyBpcyBlbmFibGVkIGJlZm9yZSBpbml0aWFsaXppbmcgdGhl IGxvZ2ljYWwKKwkJICogZGVjb2RpbmcgY29udGV4dC4KKwkJICovCisJCUVuc3VyZUxvZ2ljYWxE ZWNvZGluZ0VuYWJsZWQoKTsKKwkJQXNzZXJ0KElzTG9naWNhbERlY29kaW5nRW5hYmxlZCgpKTsK IAotCS8qCi0JICogQ3JlYXRlIGxvZ2ljYWwgZGVjb2RpbmcgY29udGV4dCB0byBmaW5kIHN0YXJ0 IHBvaW50IG9yLCBpZiB3ZSBkb24ndAotCSAqIG5lZWQgaXQsIHRvIDEpIGJ1bXAgc2xvdCdzIHJl c3RhcnRfbHNuIGFuZCB4bWluIDIpIGNoZWNrIHBsdWdpbiBzYW5pdHkuCi0JICoKLQkgKiBOb3Rl OiB3aGVuICFmaW5kX3N0YXJ0cG9pbnQgdGhpcyBpcyBzdGlsbCBpbXBvcnRhbnQsIGJlY2F1c2Ug aXQncyBhdAotCSAqIHRoaXMgcG9pbnQgdGhhdCB0aGUgb3V0cHV0IHBsdWdpbiBpcyB2YWxpZGF0 ZWQuCi0JICovCi0JY3R4ID0gQ3JlYXRlSW5pdERlY29kaW5nQ29udGV4dChwbHVnaW4sIE5JTCwK LQkJCQkJCQkJCWZhbHNlLAkvKiBqdXN0IGNhdGFsb2dzIGlzIE9LICovCi0JCQkJCQkJCQlmYWxz ZSwJLyogbm90IHJlcGFjayAqLwotCQkJCQkJCQkJcmVzdGFydF9sc24sCi0JCQkJCQkJCQlYTF9S T1VUSU5FKC5wYWdlX3JlYWQgPSByZWFkX2xvY2FsX3hsb2dfcGFnZSwKLQkJCQkJCQkJCQkJICAg LnNlZ21lbnRfb3BlbiA9IHdhbF9zZWdtZW50X29wZW4sCi0JCQkJCQkJCQkJCSAgIC5zZWdtZW50 X2Nsb3NlID0gd2FsX3NlZ21lbnRfY2xvc2UpLAotCQkJCQkJCQkJTlVMTCwgTlVMTCwgTlVMTCk7 CisJCS8qCisJCSAqIENyZWF0ZSBsb2dpY2FsIGRlY29kaW5nIGNvbnRleHQgdG8gZmluZCBzdGFy dCBwb2ludCBvciwgaWYgd2UgZG9uJ3QKKwkJICogbmVlZCBpdCwgdG8gMSkgYnVtcCBzbG90J3Mg cmVzdGFydF9sc24gYW5kIHhtaW4gMikgY2hlY2sgcGx1Z2luIHNhbml0eS4KKwkJICoKKwkJICog Tm90ZTogd2hlbiAhZmluZF9zdGFydHBvaW50IHRoaXMgaXMgc3RpbGwgaW1wb3J0YW50LCBiZWNh dXNlIGl0J3MgYXQKKwkJICogdGhpcyBwb2ludCB0aGF0IHRoZSBvdXRwdXQgcGx1Z2luIGlzIHZh bGlkYXRlZC4KKwkJICovCisJCWN0eCA9IENyZWF0ZUluaXREZWNvZGluZ0NvbnRleHQocGx1Z2lu LCBOSUwsCisJCQkJCQkJCQkJZmFsc2UsCS8qIGp1c3QgY2F0YWxvZ3MgaXMgT0sgKi8KKwkJCQkJ CQkJCQlmYWxzZSwJLyogbm90IHJlcGFjayAqLworCQkJCQkJCQkJCXJlc3RhcnRfbHNuLAorCQkJ CQkJCQkJCVhMX1JPVVRJTkUoLnBhZ2VfcmVhZCA9IHJlYWRfbG9jYWxfeGxvZ19wYWdlLAorCQkJ CQkJCQkJCQkJICAgLnNlZ21lbnRfb3BlbiA9IHdhbF9zZWdtZW50X29wZW4sCisJCQkJCQkJCQkJ CQkgICAuc2VnbWVudF9jbG9zZSA9IHdhbF9zZWdtZW50X2Nsb3NlKSwKKwkJCQkJCQkJCQlOVUxM LCBOVUxMLCBOVUxMKTsKIAotCS8qCi0JICogSWYgY2FsbGVyIG5lZWRzIHVzIHRvIGRldGVybWlu ZSB0aGUgZGVjb2Rpbmcgc3RhcnQgcG9pbnQsIGRvIHNvIG5vdy4KLQkgKiBUaGlzIG1pZ2h0IHRh a2UgYSB3aGlsZS4KLQkgKi8KLQlpZiAoZmluZF9zdGFydHBvaW50KQotCQlEZWNvZGluZ0NvbnRl eHRGaW5kU3RhcnRwb2ludChjdHgpOworCQkvKgorCQkgKiBJZiBjYWxsZXIgbmVlZHMgdXMgdG8g ZGV0ZXJtaW5lIHRoZSBkZWNvZGluZyBzdGFydCBwb2ludCwgZG8gc28gbm93LgorCQkgKiBUaGlz IG1pZ2h0IHRha2UgYSB3aGlsZS4KKwkJICovCisJCWlmIChmaW5kX3N0YXJ0cG9pbnQpCisJCQlE ZWNvZGluZ0NvbnRleHRGaW5kU3RhcnRwb2ludChjdHgpOwogCi0JLyogZG9uJ3QgbmVlZCB0aGUg ZGVjb2RpbmcgY29udGV4dCBhbnltb3JlICovCi0JRnJlZURlY29kaW5nQ29udGV4dChjdHgpOwor CQkvKiBkb24ndCBuZWVkIHRoZSBkZWNvZGluZyBjb250ZXh0IGFueW1vcmUgKi8KKwkJRnJlZURl Y29kaW5nQ29udGV4dChjdHgpOworCX0KKwlQR19DQVRDSCgpOworCXsKKwkJLyoKKwkJICogRHJv cCB0aGUgc2xvdCBvbiBlcnJvci4gIFJlcGxpY2F0aW9uU2xvdFJlbGVhc2UoKSBvbmx5IGRyb3Bz CisJCSAqIFJTX0VQSEVNRVJBTCBzbG90cywgc28gZm9yIFJTX1RFTVBPUkFSWSBzbG90cyB3ZSBt dXN0IGV4cGxpY2l0bHkKKwkJICogY2FsbCBSZXBsaWNhdGlvblNsb3REcm9wQWNxdWlyZWQoKSB0 byBhdm9pZCBsZWF2aW5nIHRoZSBzbG90CisJCSAqIGJlaGluZCAoZS5nLiB3aGVuIHRoZSBlcnJv ciBpcyBjYXVnaHQgYnkgYSBQTC9wZ1NRTCBFWENFUFRJT04KKwkJICogaGFuZGxlciB0aGF0IGRv ZXNuJ3QgdGVybWluYXRlIHRoZSBzZXNzaW9uKS4KKwkJICovCisJCWlmIChNeVJlcGxpY2F0aW9u U2xvdCAhPSBOVUxMKQorCQkJUmVwbGljYXRpb25TbG90RHJvcEFjcXVpcmVkKCk7CisJCVBHX1JF X1RIUk9XKCk7CisJfQorCVBHX0VORF9UUlkoKTsKIH0KIAogLyoKQEAgLTU2Niw0OSArNTgzLDU5 IEBAIHBnX3JlcGxpY2F0aW9uX3Nsb3RfYWR2YW5jZShQR19GVU5DVElPTl9BUkdTKQogCWVsc2UK IAkJbW92ZXRvID0gTWluKG1vdmV0bywgR2V0WExvZ1JlcGxheVJlY1B0cihOVUxMKSk7CiAKLQkv KiBBY3F1aXJlIHRoZSBzbG90IHNvIHdlICJvd24iIGl0ICovCi0JUmVwbGljYXRpb25TbG90QWNx dWlyZShOYW1lU3RyKCpzbG90bmFtZSksIHRydWUsIHRydWUpOworCVBHX1RSWSgpOworCXsKKwkJ LyogQWNxdWlyZSB0aGUgc2xvdCBzbyB3ZSAib3duIiBpdCAqLworCQlSZXBsaWNhdGlvblNsb3RB Y3F1aXJlKE5hbWVTdHIoKnNsb3RuYW1lKSwgdHJ1ZSwgdHJ1ZSk7CiAKLQkvKiBBIHNsb3Qgd2hv c2UgcmVzdGFydF9sc24gaGFzIG5ldmVyIGJlZW4gcmVzZXJ2ZWQgY2Fubm90IGJlIGFkdmFuY2Vk ICovCi0JaWYgKCFYTG9nUmVjUHRySXNWYWxpZChNeVJlcGxpY2F0aW9uU2xvdC0+ZGF0YS5yZXN0 YXJ0X2xzbikpCi0JCWVyZXBvcnQoRVJST1IsCi0JCQkJKGVycmNvZGUoRVJSQ09ERV9PQkpFQ1Rf Tk9UX0lOX1BSRVJFUVVJU0lURV9TVEFURSksCi0JCQkJIGVycm1zZygicmVwbGljYXRpb24gc2xv dCBcIiVzXCIgY2Fubm90IGJlIGFkdmFuY2VkIiwKLQkJCQkJCU5hbWVTdHIoKnNsb3RuYW1lKSks Ci0JCQkJIGVycmRldGFpbCgiVGhpcyBzbG90IGhhcyBuZXZlciBwcmV2aW91c2x5IHJlc2VydmVk IFdBTCwgb3IgaXQgaGFzIGJlZW4gaW52YWxpZGF0ZWQuIikpKTsKKwkJLyogQSBzbG90IHdob3Nl IHJlc3RhcnRfbHNuIGhhcyBuZXZlciBiZWVuIHJlc2VydmVkIGNhbm5vdCBiZSBhZHZhbmNlZCAq LworCQlpZiAoIVhMb2dSZWNQdHJJc1ZhbGlkKE15UmVwbGljYXRpb25TbG90LT5kYXRhLnJlc3Rh cnRfbHNuKSkKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNU X05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCQkgZXJybXNnKCJyZXBsaWNhdGlvbiBz bG90IFwiJXNcIiBjYW5ub3QgYmUgYWR2YW5jZWQiLAorCQkJCQkJCU5hbWVTdHIoKnNsb3RuYW1l KSksCisJCQkJCSBlcnJkZXRhaWwoIlRoaXMgc2xvdCBoYXMgbmV2ZXIgcHJldmlvdXNseSByZXNl cnZlZCBXQUwsIG9yIGl0IGhhcyBiZWVuIGludmFsaWRhdGVkLiIpKSk7CiAKLQkvKgotCSAqIENo ZWNrIGlmIHRoZSBzbG90IGlzIG5vdCBtb3ZpbmcgYmFja3dhcmRzLiAgUGh5c2ljYWwgc2xvdHMg cmVseSBzaW1wbHkKLQkgKiBvbiByZXN0YXJ0X2xzbiBhcyBhIG1pbmltdW0gcG9pbnQsIHdoaWxl IGxvZ2ljYWwgc2xvdHMgaGF2ZSBjb25maXJtZWQKLQkgKiBjb25zdW1wdGlvbiB1cCB0byBjb25m aXJtZWRfZmx1c2gsIG1lYW5pbmcgdGhhdCBpbiBib3RoIGNhc2VzIGRhdGEKLQkgKiBvbGRlciB0 aGFuIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBhbnltb3JlLgotCSAqLwotCWlmIChPaWRJc1ZhbGlk KE15UmVwbGljYXRpb25TbG90LT5kYXRhLmRhdGFiYXNlKSkKLQkJbWlubHNuID0gTXlSZXBsaWNh dGlvblNsb3QtPmRhdGEuY29uZmlybWVkX2ZsdXNoOwotCWVsc2UKLQkJbWlubHNuID0gTXlSZXBs aWNhdGlvblNsb3QtPmRhdGEucmVzdGFydF9sc247CisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSBz bG90IGlzIG5vdCBtb3ZpbmcgYmFja3dhcmRzLiAgUGh5c2ljYWwgc2xvdHMgcmVseSBzaW1wbHkK KwkJICogb24gcmVzdGFydF9sc24gYXMgYSBtaW5pbXVtIHBvaW50LCB3aGlsZSBsb2dpY2FsIHNs b3RzIGhhdmUgY29uZmlybWVkCisJCSAqIGNvbnN1bXB0aW9uIHVwIHRvIGNvbmZpcm1lZF9mbHVz aCwgbWVhbmluZyB0aGF0IGluIGJvdGggY2FzZXMgZGF0YQorCQkgKiBvbGRlciB0aGFuIHRoYXQg aXMgbm90IGF2YWlsYWJsZSBhbnltb3JlLgorCQkgKi8KKwkJaWYgKE9pZElzVmFsaWQoTXlSZXBs aWNhdGlvblNsb3QtPmRhdGEuZGF0YWJhc2UpKQorCQkJbWlubHNuID0gTXlSZXBsaWNhdGlvblNs b3QtPmRhdGEuY29uZmlybWVkX2ZsdXNoOworCQllbHNlCisJCQltaW5sc24gPSBNeVJlcGxpY2F0 aW9uU2xvdC0+ZGF0YS5yZXN0YXJ0X2xzbjsKIAotCWlmIChtb3ZldG8gPCBtaW5sc24pCi0JCWVy ZXBvcnQoRVJST1IsCi0JCQkJKGVycmNvZGUoRVJSQ09ERV9PQkpFQ1RfTk9UX0lOX1BSRVJFUVVJ U0lURV9TVEFURSksCi0JCQkJIGVycm1zZygiY2Fubm90IGFkdmFuY2UgcmVwbGljYXRpb24gc2xv dCB0byAlWC8lMDhYLCBtaW5pbXVtIGlzICVYLyUwOFgiLAotCQkJCQkJTFNOX0ZPUk1BVF9BUkdT KG1vdmV0byksIExTTl9GT1JNQVRfQVJHUyhtaW5sc24pKSkpOworCQlpZiAobW92ZXRvIDwgbWlu bHNuKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycmNvZGUoRVJSQ09ERV9PQkpFQ1RfTk9U X0lOX1BSRVJFUVVJU0lURV9TVEFURSksCisJCQkJCSBlcnJtc2coImNhbm5vdCBhZHZhbmNlIHJl cGxpY2F0aW9uIHNsb3QgdG8gJVgvJTA4WCwgbWluaW11bSBpcyAlWC8lMDhYIiwKKwkJCQkJCQlM U05fRk9STUFUX0FSR1MobW92ZXRvKSwgTFNOX0ZPUk1BVF9BUkdTKG1pbmxzbikpKSk7CiAKLQkv KiBEbyB0aGUgYWN0dWFsIHNsb3QgdXBkYXRlLCBkZXBlbmRpbmcgb24gdGhlIHNsb3QgdHlwZSAq LwotCWlmIChPaWRJc1ZhbGlkKE15UmVwbGljYXRpb25TbG90LT5kYXRhLmRhdGFiYXNlKSkKLQkJ ZW5kbHNuID0gcGdfbG9naWNhbF9yZXBsaWNhdGlvbl9zbG90X2FkdmFuY2UobW92ZXRvKTsKLQll bHNlCi0JCWVuZGxzbiA9IHBnX3BoeXNpY2FsX3JlcGxpY2F0aW9uX3Nsb3RfYWR2YW5jZShtb3Zl dG8pOworCQkvKiBEbyB0aGUgYWN0dWFsIHNsb3QgdXBkYXRlLCBkZXBlbmRpbmcgb24gdGhlIHNs b3QgdHlwZSAqLworCQlpZiAoT2lkSXNWYWxpZChNeVJlcGxpY2F0aW9uU2xvdC0+ZGF0YS5kYXRh YmFzZSkpCisJCQllbmRsc24gPSBwZ19sb2dpY2FsX3JlcGxpY2F0aW9uX3Nsb3RfYWR2YW5jZSht b3ZldG8pOworCQllbHNlCisJCQllbmRsc24gPSBwZ19waHlzaWNhbF9yZXBsaWNhdGlvbl9zbG90 X2FkdmFuY2UobW92ZXRvKTsKIAotCXZhbHVlc1swXSA9IE5hbWVHZXREYXR1bSgmTXlSZXBsaWNh dGlvblNsb3QtPmRhdGEubmFtZSk7Ci0JbnVsbHNbMF0gPSBmYWxzZTsKKwkJdmFsdWVzWzBdID0g TmFtZUdldERhdHVtKCZNeVJlcGxpY2F0aW9uU2xvdC0+ZGF0YS5uYW1lKTsKKwkJbnVsbHNbMF0g PSBmYWxzZTsKIAotCS8qCi0JICogUmVjb21wdXRlIHRoZSBtaW5pbXVtIExTTiBhbmQgeG1pbiBh Y3Jvc3MgYWxsIHNsb3RzIHRvIGFkanVzdCB3aXRoIHRoZQotCSAqIGFkdmFuY2luZyBwb3RlbnRp YWxseSBkb25lLgotCSAqLwotCVJlcGxpY2F0aW9uU2xvdHNDb21wdXRlUmVxdWlyZWRYbWluKGZh bHNlKTsKLQlSZXBsaWNhdGlvblNsb3RzQ29tcHV0ZVJlcXVpcmVkTFNOKCk7CisJCS8qCisJCSAq IFJlY29tcHV0ZSB0aGUgbWluaW11bSBMU04gYW5kIHhtaW4gYWNyb3NzIGFsbCBzbG90cyB0byBh ZGp1c3Qgd2l0aCB0aGUKKwkJICogYWR2YW5jaW5nIHBvdGVudGlhbGx5IGRvbmUuCisJCSAqLwor CQlSZXBsaWNhdGlvblNsb3RzQ29tcHV0ZVJlcXVpcmVkWG1pbihmYWxzZSk7CisJCVJlcGxpY2F0 aW9uU2xvdHNDb21wdXRlUmVxdWlyZWRMU04oKTsKKwl9CisJUEdfQ0FUQ0goKTsKKwl7CisJCWlm IChNeVJlcGxpY2F0aW9uU2xvdCAhPSBOVUxMKQorCQkJUmVwbGljYXRpb25TbG90UmVsZWFzZSgp OworCQlQR19SRV9USFJPVygpOworCX0KKwlQR19FTkRfVFJZKCk7CiAKIAlSZXBsaWNhdGlvblNs b3RSZWxlYXNlKCk7CiAKQEAgLTc2Myw3ICs3OTAsMTMgQEAgY29weV9yZXBsaWNhdGlvbl9zbG90 KEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvLCBib29sIGxvZ2ljYWxfc2xvdCkKIAkvKgogCSAqIFVw ZGF0ZSB0aGUgZGVzdGluYXRpb24gc2xvdCB0byBjdXJyZW50IHZhbHVlcyBvZiB0aGUgc291cmNl IHNsb3Q7CiAJICogcmVjaGVjayB0aGF0IHRoZSBzb3VyY2Ugc2xvdCBpcyBzdGlsbCB0aGUgb25l IHdlIHNhdyBwcmV2aW91c2x5LgorCSAqCisJICogVXNlIFBHX1RSWSB0byBlbnN1cmUgd2UgZHJv cCB0aGUgZGVzdGluYXRpb24gc2xvdCBpZiBhbnkgdmFsaWRhdGlvbgorCSAqIGVycm9yIG9jY3Vy cy4gIFdpdGhvdXQgdGhpcywgYW4gZXJyb3IgY2F1Z2h0IGJ5IGEgUEwvcGdTUUwgRVhDRVBUSU9O CisJICogaGFuZGxlciB3b3VsZCBsZWF2ZSBNeVJlcGxpY2F0aW9uU2xvdCBzZXQsIGNyYXNoaW5n IG9uIHRoZSBuZXh0IHNsb3QKKwkgKiBvcGVyYXRpb24uCiAJICovCisJUEdfVFJZKCk7CiAJewog CQlUcmFuc2FjdGlvbklkIGNvcHlfZWZmZWN0aXZlX3htaW47CiAJCVRyYW5zYWN0aW9uSWQgY29w eV9lZmZlY3RpdmVfY2F0YWxvZ194bWluOwpAQCAtNzk3LDkgKzgzMCw2IEBAIGNvcHlfcmVwbGlj YXRpb25fc2xvdChGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbywgYm9vbCBsb2dpY2FsX3Nsb3QpCiAJ CSAqIG9yIHRoZSByZXN0YXJ0X2xzbiBlaXRoZXIgaXMgaW52YWxpZCBvciBoYXMgZ29uZSBiYWNr d2FyZC4gKFRoZQogCQkgKiByZXN0YXJ0X2xzbiBjb3VsZCBnbyBiYWNrd2FyZHMgaWYgdGhlIHNv dXJjZSBzbG90IGlzIGRyb3BwZWQgYW5kCiAJCSAqIGNvcGllZCBmcm9tIGFuIG9sZGVyIHNsb3Qg ZHVyaW5nIGluc3RhbGxhdGlvbi4pCi0JCSAqCi0JCSAqIFNpbmNlIGVycm9yaW5nIG91dCB3aWxs IHJlbGVhc2UgYW5kIGRyb3AgdGhlIGRlc3RpbmF0aW9uIHNsb3Qgd2UKLQkJICogZG9uJ3QgbmVl ZCB0byByZWxlYXNlIGl0IGhlcmUuCiAJCSAqLwogCQlpZiAoY29weV9yZXN0YXJ0X2xzbiA8IHNy Y19yZXN0YXJ0X2xzbiB8fAogCQkJc3JjX2lzbG9naWNhbCAhPSBjb3B5X2lzbG9naWNhbCB8fApA QCAtODU3LDYgKzg4NywxOCBAQCBjb3B5X3JlcGxpY2F0aW9uX3Nsb3QoRnVuY3Rpb25DYWxsSW5m byBmY2luZm8sIGJvb2wgbG9naWNhbF9zbG90KQogCQl9CiAjZW5kaWYKIAl9CisJUEdfQ0FUQ0go KTsKKwl7CisJCS8qCisJCSAqIERyb3AgdGhlIG5ld2x5LWNyZWF0ZWQgZGVzdGluYXRpb24gc2xv dCBvbiBlcnJvci4gU2FtZSBhcyBpbgorCQkgKiBjcmVhdGVfbG9naWNhbF9yZXBsaWNhdGlvbl9z bG90KCk6IHVzZSBSZXBsaWNhdGlvblNsb3REcm9wQWNxdWlyZWQoKQorCQkgKiB0byBoYW5kbGUg Ym90aCBSU19FUEhFTUVSQUwgYW5kIFJTX1RFTVBPUkFSWSBzbG90cy4KKwkJICovCisJCWlmIChN eVJlcGxpY2F0aW9uU2xvdCAhPSBOVUxMKQorCQkJUmVwbGljYXRpb25TbG90RHJvcEFjcXVpcmVk KCk7CisJCVBHX1JFX1RIUk9XKCk7CisJfQorCVBHX0VORF9UUlkoKTsKIAogCS8qIHRhcmdldCBz bG90IGZ1bGx5IGNyZWF0ZWQsIG1hcmsgYXMgcGVyc2lzdGVudCBpZiBuZWVkZWQgKi8KIAlpZiAo bG9naWNhbF9zbG90ICYmICF0ZW1wb3JhcnkpCi0tIAoyLjQzLjAKCg== --000000000000ed6c8a0652b40b4d--