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 1qqgLx-000YZq-QD for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Oct 2023 21:02:50 +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 1qqgKx-000hKS-01 for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Oct 2023 21:01:47 +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 1qqgKw-000hKJ-Gk for pgsql-hackers@lists.postgresql.org; Wed, 11 Oct 2023 21:01:47 +0000 Received: from forward500b.mail.yandex.net ([178.154.239.144]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qqgKr-0003Tp-1v for pgsql-hackers@postgresql.org; Wed, 11 Oct 2023 21:01:46 +0000 Received: from mail-nwsmtp-smtp-production-main-19.sas.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-19.sas.yp-c.yandex.net [IPv6:2a02:6b8:c14:4081:0:640:557:0]) by forward500b.mail.yandex.net (Yandex) with ESMTP id 76D9661134; Thu, 12 Oct 2023 00:01:39 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-19.sas.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id c1mo3GeDcmI0-s8idFntD; Thu, 12 Oct 2023 00:01:38 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1697058099; bh=HWmPQzx8FCiRb6xoRpab1cgTFhqHOikgEsXdV9GBCGw=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=nZSpXM55WlhcAXMAAhIVzzVLi+Eb4aBKhNWVmLbT9AyHeUlZBtgnHhKT3V4GGB9k8 Inauw5rGAVmrEPcs/zqIAS0RFA0obv86aP5yeV5g6e7+xrGtLvCCe5fFALKT2hk6Q2 ZiVh7ns0lkWVR+OLFEQdM9NI7oJXI+Kr+xgne5gw= Authentication-Results: mail-nwsmtp-smtp-production-main-19.sas.yp-c.yandex.net; dkim=pass header.i=@yandex.ru Content-Type: multipart/mixed; boundary="------------tKB0E3ud2iUXVjYXku0t0Am0" Message-ID: Date: Thu, 12 Oct 2023 00:01:37 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: A new strategy for pull-up correlated ANY_SUBLINK To: Andy Fan Cc: pgsql-hackers , Tom Lane , vignesh C , Richard Guo , Andrey Lepikhov References: <247851.1668293143@sss.pgh.pa.us> Content-Language: en-US From: Alena Rybakina In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------tKB0E3ud2iUXVjYXku0t0Am0 Content-Type: multipart/alternative; boundary="------------0xfuT0opCT4d0IGU0LO2Rb00" --------------0xfuT0opCT4d0IGU0LO2Rb00 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi! I reviewed your patch and it was interesting for me! Thank you for the explanation. It was really informative for me! > > I think we need the restriction and that should be enough for this feature > . Given the query Richard provided before: > > explain > select * from tenk1 A where exists > (select 1 from tenk2 B > where A.hundred in (select C.hundred FROM tenk2 C > WHERE c.odd = b.odd)); > > It first can be converted to the below format without any issue. > > SELECT * FROM tenk1 A SEMI JOIN tenk2 B > on A.hundred in (select C.hundred FROM tenk2 C > WHERE c.odd = b.odd); > > Then without the restriction, since we only pull the varnos from > sublink->testexpr, then it is {A}, so it convert to > > SELECT * FROM > (tenk1 A SEMI JOIN LATERAL (SELECT c.hundred FROM tenk2 C) > ON c.odd = b.odd AND a.hundred = v.hundred) > SEMI JOIN on tenk2 B ON TRUE; > > then the above query is NOT A VALID QUERY since: > 1. The above query is *not* same as > > SELECT * FROM (tenk1 A SEMI JOIN tenk2 B) on true > SEMI JOIN LATERAL (SELECT c.hundred FROM tenk2 C) v > ON v.odd = b.odd; > > 2. The above query requires b.odd when B is not available. So it is > right that an optimizer can't generate a plan for it. The fix would > be to do the restriction before applying this optimization. > > I'm not sure pull-up-subquery can play any role here, IIUC, the bad thing > happens before pull-up-subquery. > > I also write & analyze more test and found no issue by me > > 1. SELECT * FROM tenk1 A LEFT JOIN tenk2 B > ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd); > ==> should not be pull-up to rarg of the left join since A.hundred is not > available. > > 2.  SELECT * FROM tenk1 A LEFT JOIN tenk2 B > ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = a.odd); > ==> should not be pull-up to rarg of the left join since A.odd is not > available. > > 3. SELECT * FROM tenk1 A LEFT JOIN tenk2 B > ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd); > ==> should be pull-up to rarg of left join. > > 4. SELECT * FROM tenk1 A INNER JOIN tenk2 B > ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd); > ==> pull-up as expected. > > 5. SELECT * FROM tenk1 A RIGHT JOIN tenk2 B > ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd); > ==> should not be pull-up into larg of left join since b.odd is not > available. > > After reviewing, I want to suggest some changes related to the code and tests. First of all, I think, it would be better to "treat" change to "consider" and rewrite the pull-up check condition in two lines: /*  * If the sub-select refers to any Vars of the parent query, we so let's  * considering it as LATERAL.  (Vars of higher levels don't matter here.)  */ use_lateral = !bms_is_empty(sub_ref_outer_relids) && bms_is_subset(sub_ref_outer_relids, available_rels); if (!use_lateral && !bms_is_empty(sub_ref_outer_relids))     return NULL; Secondly, I noticed another interesting feature in your patch and I think it could be added to the test. If we get only one row from the aggregated subquery, we can pull-up it in the subquery scan filter. postgres=# explain (costs off) SELECT * FROM tenk1 A LEFT JOIN tenk2 B ON B.hundred in (SELECT min(c.hundred) FROM tenk2 C WHERE c.odd = b.odd);                           QUERY PLAN --------------------------------------------------------------  Nested Loop Left Join    ->  Seq Scan on tenk1 a    ->  Materialize          ->  Nested Loop                ->  Seq Scan on tenk2 b *->  Subquery Scan on "ANY_subquery"                      Filter: (b.hundred = "ANY_subquery".min)*                      ->  Aggregate                            ->  Seq Scan on tenk2 c                                  Filter: (odd = b.odd) (10 rows) It was impossible without your patch: postgres=# explain (costs off) SELECT * FROM tenk1 A LEFT JOIN tenk2 B ON B.hundred in (SELECT min(c.hundred) FROM tenk2 C WHERE c.odd = b.odd);                     QUERY PLAN ---------------------------------------------------  Nested Loop Left Join    ->  Seq Scan on tenk1 a    ->  Materialize          ->  Seq Scan on tenk2 b                Filter: (SubPlan 1)                SubPlan 1                  ->  Aggregate                        ->  Seq Scan on tenk2 c                              Filter: (odd = b.odd) (9 rows) And I found an alternative query, when aggregated sublink will pull-up into JoinExpr condition. explain (costs off) SELECT * FROM tenk1 A LEFT JOIN tenk2 B ON B.hundred in (SELECT count(c.hundred) FROM tenk2 C group by (c.odd));                          QUERY PLAN -------------------------------------------------------------  Nested Loop Left Join    ->  Seq Scan on tenk1 a    ->  Materialize          ->  Hash Semi Join *Hash Cond: (b.hundred = "ANY_subquery".count)*                ->  Seq Scan on tenk2 b                ->  Hash                      ->  Subquery Scan on "ANY_subquery"                            ->  HashAggregate                                  Group Key: c.odd                                  ->  Seq Scan on tenk2 c (11 rows) Unfortunately, I found a request when sublink did not pull-up, as in the examples above. I couldn't quite figure out why. create table a (x int, y int, z int, t int); create table b (x int, t int); create unique index on a (t, x); create index on b (t,x); insert into a select id, id, id, id FROM generate_series(1,100000) As id; insert into b select id, id FROM generate_series(1,1000) As id; explain (analyze, costs off, buffers) select b.x, b.x, a.y from b     left join a         on b.x=a.x and *b.t in             (select max(a0.t) *              from a a0              where a0.x = b.x and                    a0.t = b.t); QUERY PLAN ------------------------------------------------------------------------------------------------------------  Hash Right Join (actual time=1.150..58.512 rows=1000 loops=1)    Hash Cond: (a.x = b.x) *Join Filter: (SubPlan 2)*    Buffers: shared hit=3546    ->  Seq Scan on a (actual time=0.023..15.798 rows=100000 loops=1)          Buffers: shared hit=541    ->  Hash (actual time=1.038..1.042 rows=1000 loops=1)          Buckets: 4096  Batches: 1  Memory Usage: 72kB          Buffers: shared hit=5          ->  Seq Scan on b (actual time=0.047..0.399 rows=1000 loops=1)                Buffers: shared hit=5    SubPlan 2      ->  Result (actual time=0.018..0.018 rows=1 loops=1000)            Buffers: shared hit=3000            InitPlan 1 (returns $2)              ->  Limit (actual time=0.015..0.016 rows=1 loops=1000)                    Buffers: shared hit=3000                    ->  Index Only Scan using a_t_x_idx on a a0 (actual time=0.014..0.014 rows=1 loops=1000)                          Index Cond: ((t IS NOT NULL) AND (t = b.t) AND (x = b.x))                          Heap Fetches: 1000                          Buffers: shared hit=3000  Planning Time: 0.630 ms  Execution Time: 58.941 ms (23 rows) I thought it would be: explain (analyze, costs off, buffers) select b.x, b.x, a.y from b     left join a on         b.x=a.x and *b.t =             (select max(a0.t) *              from a a0              where a0.x = b.x and                    a0.t <= b.t); QUERY PLAN ---------------------------------------------------------------------------------------------------------------------  Hash Right Join (actual time=1.181..67.927 rows=1000 loops=1)    Hash Cond: (a.x = b.x) *Join Filter: (b.t = (SubPlan 2))*    Buffers: shared hit=3546    ->  Seq Scan on a (actual time=0.022..17.109 rows=100000 loops=1)          Buffers: shared hit=541    ->  Hash (actual time=1.065..1.068 rows=1000 loops=1)          Buckets: 4096  Batches: 1  Memory Usage: 72kB          Buffers: shared hit=5          ->  Seq Scan on b (actual time=0.049..0.401 rows=1000 loops=1)                Buffers: shared hit=5    SubPlan 2      ->  Result (actual time=0.025..0.025 rows=1 loops=1000)            Buffers: shared hit=3000            InitPlan 1 (returns $2)              ->  Limit (actual time=0.024..0.024 rows=1 loops=1000)                    Buffers: shared hit=3000                    ->  Index Only Scan Backward using a_t_x_idx on a a0 (actual time=0.023..0.023 rows=1 loops=1000)                          Index Cond: ((t IS NOT NULL) AND (t <= b.t) AND (x = b.x))                          Heap Fetches: 1000                          Buffers: shared hit=3000  Planning Time: 0.689 ms  Execution Time: 68.220 ms (23 rows) If you noticed, it became possible after replacing the "in" operator with "=". I took the liberty of adding this to your patch and added myself as reviewer, if you don't mind. -- Regards, Alena Rybakina --------------0xfuT0opCT4d0IGU0LO2Rb00 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hi!

I reviewed your patch and it was interesting for me!

Thank you for the explanation. It was really informative for me!


I think we need the restriction and that should be enough for this feature
. Given the query Richard provided before:

explain
select * from tenk1 A where exists
(select 1 from tenk2 B
where A.hundred in (select C.hundred FROM tenk2 C
WHERE c.odd = b.odd));

It first can be converted to the below format without any issue.

SELECT * FROM tenk1 A SEMI JOIN tenk2 B
on A.hundred in (select C.hundred FROM tenk2 C
WHERE c.odd = b.odd);

Then without the restriction, since we only pull the varnos from
sublink->testexpr, then it is {A}, so it convert to

SELECT * FROM 
(tenk1 A SEMI JOIN LATERAL (SELECT c.hundred FROM tenk2 C)
ON c.odd = b.odd AND a.hundred = v.hundred) 
SEMI JOIN on tenk2 B ON TRUE;

then the above query is NOT A VALID QUERY since:
1. The above query is *not* same as

SELECT * FROM (tenk1 A SEMI JOIN tenk2 B) on true
SEMI JOIN LATERAL (SELECT c.hundred FROM tenk2 C) v 
ON v.odd = b.odd;

2. The above query requires b.odd when B is not available. So it is
right that an optimizer can't generate a plan for it. The fix would
be to do the restriction before applying this optimization.

I'm not sure pull-up-subquery can play any role here, IIUC, the bad thing
happens before pull-up-subquery.

I also write & analyze more test and found no issue by me

1. SELECT * FROM tenk1 A LEFT JOIN tenk2 B
ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
==> should not be pull-up to rarg of the left join since A.hundred is not
available.

2.  SELECT * FROM tenk1 A LEFT JOIN tenk2 B
ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = a.odd);
==> should not be pull-up to rarg of the left join since A.odd is not
available.

3. SELECT * FROM tenk1 A LEFT JOIN tenk2 B
ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
==> should be pull-up to rarg of left join.

4. SELECT * FROM tenk1 A INNER JOIN tenk2 B
ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
==> pull-up as expected.

5. SELECT * FROM tenk1 A RIGHT JOIN tenk2 B
ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd);
==> should not be pull-up into larg of left join since b.odd is not
available.


After reviewing, I want to suggest some changes related to the code and tests.


First of all, I think, it would be better to "treat" change to "consider" and rewrite the pull-up check condition in two lines:

/*
 * If the sub-select refers to any Vars of the parent query, we so let's
 * considering it as LATERAL.  (Vars of higher levels don't matter here.)
 */

use_lateral = !bms_is_empty(sub_ref_outer_relids) &&
               bms_is_subset(sub_ref_outer_relids, available_rels);

if (!use_lateral && !bms_is_empty(sub_ref_outer_relids))
    return NULL;


Secondly, I noticed another interesting feature in your patch and I think it could be added to the test.

If we get only one row from the aggregated subquery, we can pull-up it in the subquery scan filter.

postgres=# explain (costs off)
SELECT * FROM tenk1 A LEFT JOIN tenk2 B
ON B.hundred in (SELECT min(c.hundred) FROM tenk2 C WHERE c.odd = b.odd);

                          QUERY PLAN                          
--------------------------------------------------------------
 Nested Loop Left Join
   ->  Seq Scan on tenk1 a
   ->  Materialize
         ->  Nested Loop
               ->  Seq Scan on tenk2 b
               ->  Subquery Scan on "ANY_subquery"
                     Filter: (b.hundred = "ANY_subquery".min)

                     ->  Aggregate
                           ->  Seq Scan on tenk2 c
                                 Filter: (odd = b.odd)
(10 rows)

It was impossible without your patch:

postgres=# explain (costs off)
SELECT * FROM tenk1 A LEFT JOIN tenk2 B
ON B.hundred in (SELECT min(c.hundred) FROM tenk2 C WHERE c.odd = b.odd);
                    QUERY PLAN                     
---------------------------------------------------
 Nested Loop Left Join
   ->  Seq Scan on tenk1 a
   ->  Materialize
         ->  Seq Scan on tenk2 b
               Filter: (SubPlan 1)
               SubPlan 1
                 ->  Aggregate
                       ->  Seq Scan on tenk2 c
                             Filter: (odd = b.odd)
(9 rows)


And I found an alternative query, when aggregated sublink will pull-up into JoinExpr condition.

explain (costs off)
SELECT * FROM tenk1 A LEFT JOIN tenk2 B
ON B.hundred in (SELECT count(c.hundred) FROM tenk2 C group by (c.odd));
                         QUERY PLAN                          
-------------------------------------------------------------
 Nested Loop Left Join
   ->  Seq Scan on tenk1 a
   ->  Materialize
         ->  Hash Semi Join
               Hash Cond: (b.hundred = "ANY_subquery".count)
               ->  Seq Scan on tenk2 b
               ->  Hash
                     ->  Subquery Scan on "ANY_subquery"
                           ->  HashAggregate
                                 Group Key: c.odd
                                 ->  Seq Scan on tenk2 c
(11 rows)


Unfortunately, I found a request when sublink did not pull-up, as in the examples above. I couldn't quite figure out why.

create table a (x int, y int, z int, t int);
create table b (x int, t int);
create unique index on a (t, x);
create index on b (t,x);
insert into a select id, id, id, id FROM generate_series(1,100000) As id;
insert into b select id, id FROM generate_series(1,1000) As id;

explain (analyze, costs off, buffers)
select b.x, b.x, a.y
from b
    left join a
        on b.x=a.x and
           b.t in
            (select max(a0.t)

             from a a0
             where a0.x = b.x and
                   a0.t = b.t);

                                                 QUERY PLAN                                                 
------------------------------------------------------------------------------------------------------------
 Hash Right Join (actual time=1.150..58.512 rows=1000 loops=1)
   Hash Cond: (a.x = b.x)
   Join Filter: (SubPlan 2)
   Buffers: shared hit=3546
   ->  Seq Scan on a (actual time=0.023..15.798 rows=100000 loops=1)
         Buffers: shared hit=541
   ->  Hash (actual time=1.038..1.042 rows=1000 loops=1)
         Buckets: 4096  Batches: 1  Memory Usage: 72kB
         Buffers: shared hit=5
         ->  Seq Scan on b (actual time=0.047..0.399 rows=1000 loops=1)
               Buffers: shared hit=5
   SubPlan 2
     ->  Result (actual time=0.018..0.018 rows=1 loops=1000)
           Buffers: shared hit=3000
           InitPlan 1 (returns $2)
             ->  Limit (actual time=0.015..0.016 rows=1 loops=1000)
                   Buffers: shared hit=3000
                   ->  Index Only Scan using a_t_x_idx on a a0 (actual time=0.014..0.014 rows=1 loops=1000)
                         Index Cond: ((t IS NOT NULL) AND (t = b.t) AND (x = b.x))
                         Heap Fetches: 1000
                         Buffers: shared hit=3000
 Planning Time: 0.630 ms
 Execution Time: 58.941 ms
(23 rows)

I thought it would be:

explain (analyze, costs off, buffers)
select b.x, b.x, a.y
from b
    left join a on
        b.x=a.x and
        b.t =
            (select max(a0.t)

             from a a0
             where a0.x = b.x and
                   a0.t <= b.t);

                                                     QUERY PLAN                                                      
---------------------------------------------------------------------------------------------------------------------
 Hash Right Join (actual time=1.181..67.927 rows=1000 loops=1)
   Hash Cond: (a.x = b.x)
   Join Filter: (b.t = (SubPlan 2))
   Buffers: shared hit=3546
   ->  Seq Scan on a (actual time=0.022..17.109 rows=100000 loops=1)
         Buffers: shared hit=541
   ->  Hash (actual time=1.065..1.068 rows=1000 loops=1)
         Buckets: 4096  Batches: 1  Memory Usage: 72kB
         Buffers: shared hit=5
         ->  Seq Scan on b (actual time=0.049..0.401 rows=1000 loops=1)
               Buffers: shared hit=5
   SubPlan 2
     ->  Result (actual time=0.025..0.025 rows=1 loops=1000)
           Buffers: shared hit=3000
           InitPlan 1 (returns $2)
             ->  Limit (actual time=0.024..0.024 rows=1 loops=1000)
                   Buffers: shared hit=3000
                   ->  Index Only Scan Backward using a_t_x_idx on a a0 (actual time=0.023..0.023 rows=1 loops=1000)
                         Index Cond: ((t IS NOT NULL) AND (t <= b.t) AND (x = b.x))
                         Heap Fetches: 1000
                         Buffers: shared hit=3000
 Planning Time: 0.689 ms
 Execution Time: 68.220 ms
(23 rows)

If you noticed, it became possible after replacing the "in" operator with "=".


I took the liberty of adding this to your patch and added myself as reviewer, if you don't mind.


-- 
Regards,
Alena Rybakina
--------------0xfuT0opCT4d0IGU0LO2Rb00-- --------------tKB0E3ud2iUXVjYXku0t0Am0 Content-Type: text/x-patch; charset=UTF-8; name="pull-up.diff" Content-Disposition: attachment; filename="pull-up.diff" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3N1YnNlbGVjdC5jIGIv c3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vc3Vic2VsZWN0LmMKaW5kZXggNmFmNGEzMTgz YWMuLmY0NmVjM2QxODI2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxh bi9zdWJzZWxlY3QuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9zdWJzZWxl Y3QuYwpAQCAtMTI4NCwxOCArMTI4NCwxNiBAQCBjb252ZXJ0X0FOWV9zdWJsaW5rX3RvX2pv aW4oUGxhbm5lckluZm8gKnJvb3QsIFN1YkxpbmsgKnN1YmxpbmssCiAJQXNzZXJ0KHN1Ymxp bmstPnN1YkxpbmtUeXBlID09IEFOWV9TVUJMSU5LKTsKIAogCS8qCi0JICogSWYgdGhlIHN1 Yi1zZWxlY3QgcmVmZXJzIHRvIGFueSBWYXJzIG9mIHRoZSBwYXJlbnQgcXVlcnksIHdlIGhh dmUgdG8KLQkgKiB0cmVhdCBpdCBhcyBMQVRFUkFMLiAgKFZhcnMgb2YgaGlnaGVyIGxldmVs cyBkb24ndCBtYXR0ZXIgaGVyZS4pCisJICogSWYgdGhlIHN1Yi1zZWxlY3QgcmVmZXJzIHRv IGFueSBWYXJzIG9mIHRoZSBwYXJlbnQgcXVlcnksIHdlIHNvIGxldCdzCisJICogY29uc2lk ZXJpbmcgaXQgYXMgTEFURVJBTC4gIChWYXJzIG9mIGhpZ2hlciBsZXZlbHMgZG9uJ3QgbWF0 dGVyIGhlcmUuKQogCSAqLwogCXN1Yl9yZWZfb3V0ZXJfcmVsaWRzID0gcHVsbF92YXJub3Nf b2ZfbGV2ZWwoTlVMTCwgKE5vZGUgKikgc3Vic2VsZWN0LCAxKTsKIAotCWlmICghYm1zX2lz X2VtcHR5KHN1Yl9yZWZfb3V0ZXJfcmVsaWRzKSkKLQl7Ci0JCWlmIChibXNfaXNfc3Vic2V0 KHN1Yl9yZWZfb3V0ZXJfcmVsaWRzLCBhdmFpbGFibGVfcmVscykpCi0JCQl1c2VfbGF0ZXJh bCA9IHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBOVUxMOwotCX0KKwl1c2VfbGF0ZXJhbCA9 ICFibXNfaXNfZW1wdHkoc3ViX3JlZl9vdXRlcl9yZWxpZHMpICYmCisJCQkJCQkgYm1zX2lz X3N1YnNldChzdWJfcmVmX291dGVyX3JlbGlkcywgYXZhaWxhYmxlX3JlbHMpOworCisJaWYg KCF1c2VfbGF0ZXJhbCAmJiAhYm1zX2lzX2VtcHR5KHN1Yl9yZWZfb3V0ZXJfcmVsaWRzKSkK KwkJcmV0dXJuIE5VTEw7CiAKIAkvKgogCSAqIFRoZSB0ZXN0IGV4cHJlc3Npb24gbXVzdCBj b250YWluIHNvbWUgVmFycyBvZiB0aGUgcGFyZW50IHF1ZXJ5LCBlbHNlCmRpZmYgLS1naXQg YS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N1YnNlbGVjdC5vdXQgYi9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3N1YnNlbGVjdC5vdXQKaW5kZXggMTdkZjZiNWRjOWMuLmI3MGIz NDY2OTZkIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N1YnNlbGVj dC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdWJzZWxlY3Qub3V0CkBA IC0yMDI4LDMgKzIwMjgsNDYgQEAgT04gQS5odW5kcmVkIGluIChTRUxFQ1QgYy5odW5kcmVk IEZST00gdGVuazIgQyBXSEVSRSBjLm9kZCA9IGIub2RkKTsKICAgICAgICAgIC0+ICBTZXEg U2NhbiBvbiB0ZW5rMiBiCiAoMTEgcm93cykKIAorLS0gd2UgY2FuIHB1bGwgdXAgdGhlIGFn Z3JlZ2F0ZSBzdWJsaW5rIGludG8gdGhlIHN1YnF1ZXJ5IHNjYW4gYmVjYXVzZSBvZiBnb3Qg b25lIHJvdy4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCAqIEZST00gdGVuazEgQSBM RUZUIEpPSU4gdGVuazIgQgorT04gQi5odW5kcmVkIGluIChTRUxFQ1QgbWluKGMuaHVuZHJl ZCkgRlJPTSB0ZW5rMiBDIFdIRVJFIGMub2RkID0gYi5vZGQpOworICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIC0+ICBTZXEgU2NhbiBvbiB0ZW5rMSBhCisg ICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAg ICAgICAgLT4gIFNlcSBTY2FuIG9uIHRlbmsyIGIKKyAgICAgICAgICAgICAgIC0+ICBNZW1v aXplCisgICAgICAgICAgICAgICAgICAgICBDYWNoZSBLZXk6IGIuaHVuZHJlZCwgYi5vZGQK KyAgICAgICAgICAgICAgICAgICAgIENhY2hlIE1vZGU6IGJpbmFyeQorICAgICAgICAgICAg ICAgICAgICAgLT4gIFN1YnF1ZXJ5IFNjYW4gb24gIkFOWV9zdWJxdWVyeSIKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgIEZpbHRlcjogKGIuaHVuZHJlZCA9ICJBTllfc3VicXVlcnki Lm1pbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBSZXN1bHQKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRQbGFuIDEgKHJldHVybnMgJDEpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBMaW1pdAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyB0ZW5r Ml9odW5kcmVkIG9uIHRlbmsyIGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGh1bmRyZWQgSVMgTk9UIE5VTEwpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlcjogKG9k ZCA9IGIub2RkKQorKDE2IHJvd3MpCisKKy0tIHdlIGNhbiBwdWxsIHVwIHRoZSBhZ2dyZWdh dGUgc3VibGluayBpbnRvIHRoZSBKb2luRXhwci4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NF TEVDVCAqIEZST00gdGVuazEgQSBMRUZUIEpPSU4gdGVuazIgQgorT04gQi5odW5kcmVkIGlu IChTRUxFQ1QgY291bnQoYy5odW5kcmVkKSBGUk9NIHRlbmsyIEMgZ3JvdXAgYnkgKGMub2Rk KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICAtPiAg U2VxIFNjYW4gb24gdGVuazEgYQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAg SGFzaCBTZW1pIEpvaW4KKyAgICAgICAgICAgICAgIEhhc2ggQ29uZDogKGIuaHVuZHJlZCA9 ICJBTllfc3VicXVlcnkiLmNvdW50KQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9u IHRlbmsyIGIKKyAgICAgICAgICAgICAgIC0+ICBIYXNoCisgICAgICAgICAgICAgICAgICAg ICAtPiAgU3VicXVlcnkgU2NhbiBvbiAiQU5ZX3N1YnF1ZXJ5IgorICAgICAgICAgICAgICAg ICAgICAgICAgICAgLT4gIEhhc2hBZ2dyZWdhdGUKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIEdyb3VwIEtleTogYy5vZGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0ZW5rMiBjCisoMTEgcm93cykKKwpkaWZmIC0tZ2l0 IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3Vic2VsZWN0LnNxbCBiL3NyYy90ZXN0L3JlZ3Jl c3Mvc3FsL3N1YnNlbGVjdC5zcWwKaW5kZXggNDljZTVmYzk5YTguLjVkMzNlYjM5YmFhIDEw MDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zdWJzZWxlY3Quc3FsCisrKyBiL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL3N1YnNlbGVjdC5zcWwKQEAgLTEwMDAsMyArMTAwMCwxMyBA QCBPTiBCLmh1bmRyZWQgaW4gKFNFTEVDVCBjLmh1bmRyZWQgRlJPTSB0ZW5rMiBDIFdIRVJF IGMub2RkID0gYi5vZGQpOwogZXhwbGFpbiAoY29zdHMgb2ZmKQogU0VMRUNUICogRlJPTSB0 ZW5rMSBBIElOTkVSIEpPSU4gdGVuazIgQgogT04gQS5odW5kcmVkIGluIChTRUxFQ1QgYy5o dW5kcmVkIEZST00gdGVuazIgQyBXSEVSRSBjLm9kZCA9IGIub2RkKTsKKworLS0gd2UgY2Fu IHB1bGwgdXAgdGhlIGFnZ3JlZ2F0ZSBzdWJsaW5rIGludG8gdGhlIHN1YnF1ZXJ5IHNjYW4g YmVjYXVzZSBvZiBnb3Qgb25lIHJvdy4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCAq IEZST00gdGVuazEgQSBMRUZUIEpPSU4gdGVuazIgQgorT04gQi5odW5kcmVkIGluIChTRUxF Q1QgbWluKGMuaHVuZHJlZCkgRlJPTSB0ZW5rMiBDIFdIRVJFIGMub2RkID0gYi5vZGQpOwor CistLSB3ZSBjYW4gcHVsbCB1cCB0aGUgYWdncmVnYXRlIHN1YmxpbmsgaW50byB0aGUgSm9p bkV4cHIuCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIHRlbmsxIEEgTEVG VCBKT0lOIHRlbmsyIEIKK09OIEIuaHVuZHJlZCBpbiAoU0VMRUNUIGNvdW50KGMuaHVuZHJl ZCkgRlJPTSB0ZW5rMiBDIGdyb3VwIGJ5IChjLm9kZCkpOwpcIE5vIG5ld2xpbmUgYXQgZW5k IG9mIGZpbGUK --------------tKB0E3ud2iUXVjYXku0t0Am0 Content-Type: text/x-patch; charset=UTF-8; name="v4-Pull-up-direct-correlated-ANY_SUBLINK-using-lateral-.patch" Content-Disposition: attachment; filename*0="v4-Pull-up-direct-correlated-ANY_SUBLINK-using-lateral-.patc"; filename*1="h" Content-Transfer-Encoding: base64 RnJvbSAzMzljNmEwZmZkMWY4MGUyM2JkMjkyNGU0NjI1NjgxNDJlOGE2MDgwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmR5IEZhbiA8emhpaHVpLmZhbjEyMTNAZ21haWwu Y29tPgpEYXRlOiBXZWQsIDExIE9jdCAyMDIzIDIzOjQxOjEyICswMzAwClN1YmplY3Q6IFtQ QVRDSF0gUHVsbCB1cCBkaXJlY3QtY29ycmVsYXRlZCBBTllfU1VCTElOSyB1c2luZyBsYXRl cmFsIGpvaW4uCiBSZXZpZXdlZC1ieTogQWxlbmEgUnliYWtpbmEgPGxlbmEucmliYWNraW5h QHlhbmRleC5ydT4KCi0tLQogLi4uL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19m ZHcub3V0ICAgIHwgICA2ICstCiBjb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNf ZmR3LnNxbCAgICAgfCAgIDQgKy0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3N1YnNl bGVjdC5jICAgICAgICB8ICAxNSArLQogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2lu Lm91dCAgICAgICAgICAgIHwgIDE0ICstCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N1 YnNlbGVjdC5vdXQgICAgICAgfCAxNDUgKysrKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9y ZWdyZXNzL3NxbC9qb2luLnNxbCAgICAgICAgICAgICAgICAgfCAgIDggKy0KIHNyYy90ZXN0 L3JlZ3Jlc3Mvc3FsL3N1YnNlbGVjdC5zcWwgICAgICAgICAgICB8ICA0MiArKysrKwogNyBm aWxlcyBjaGFuZ2VkLCAyMTQgaW5zZXJ0aW9ucygrKSwgMjAgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91 dCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKaW5k ZXggMTQ0YzExNGQwZmUuLjkzMmExODYyNGE4IDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3Rn cmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0CisrKyBiL2NvbnRyaWIvcG9zdGdy ZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKQEAgLTExNjMzLDcgKzExNjMzLDcg QEAgQ1JFQVRFIEZPUkVJR04gVEFCTEUgZm9yZWlnbl90YmwgKGIgaW50KQogQ1JFQVRFIEZP UkVJR04gVEFCTEUgZm9yZWlnbl90YmwyICgpIElOSEVSSVRTIChmb3JlaWduX3RibCkKICAg U0VSVkVSIGxvb3BiYWNrIE9QVElPTlMgKHRhYmxlX25hbWUgJ2Jhc2VfdGJsJyk7CiBFWFBM QUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCi1TRUxFQ1QgYSBGUk9NIGJhc2VfdGJsIFdIRVJF IGEgSU4gKFNFTEVDVCBhIEZST00gZm9yZWlnbl90YmwpOworU0VMRUNUIGEgRlJPTSBiYXNl X3RibCBXSEVSRSAoYSwgcmFuZG9tKCkgPiAwKSBJTiAoU0VMRUNUIGEsIHJhbmRvbSgpID4g MCBGUk9NIGZvcmVpZ25fdGJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQogIFNlcSBTY2FuIG9uIHB1YmxpYy5iYXNlX3RibApAQCAtMTE2 NDEsNyArMTE2NDEsNyBAQCBTRUxFQ1QgYSBGUk9NIGJhc2VfdGJsIFdIRVJFIGEgSU4gKFNF TEVDVCBhIEZST00gZm9yZWlnbl90YmwpOwogICAgRmlsdGVyOiAoU3ViUGxhbiAxKQogICAg U3ViUGxhbiAxCiAgICAgIC0+ICBSZXN1bHQKLSAgICAgICAgICAgT3V0cHV0OiBiYXNlX3Ri bC5hCisgICAgICAgICAgIE91dHB1dDogYmFzZV90YmwuYSwgKHJhbmRvbSgpID4gJzAnOjpk b3VibGUgcHJlY2lzaW9uKQogICAgICAgICAgICAtPiAgQXBwZW5kCiAgICAgICAgICAgICAg ICAgIC0+ICBBc3luYyBGb3JlaWduIFNjYW4gb24gcHVibGljLmZvcmVpZ25fdGJsIGZvcmVp Z25fdGJsXzEKICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIE5V TEwgRlJPTSBwdWJsaWMuYmFzZV90YmwKQEAgLTExNjQ5LDcgKzExNjQ5LDcgQEAgU0VMRUNU IGEgRlJPTSBiYXNlX3RibCBXSEVSRSBhIElOIChTRUxFQ1QgYSBGUk9NIGZvcmVpZ25fdGJs KTsKICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIE5VTEwgRlJP TSBwdWJsaWMuYmFzZV90YmwKICgxMSByb3dzKQogCi1TRUxFQ1QgYSBGUk9NIGJhc2VfdGJs IFdIRVJFIGEgSU4gKFNFTEVDVCBhIEZST00gZm9yZWlnbl90YmwpOworU0VMRUNUIGEgRlJP TSBiYXNlX3RibCBXSEVSRSAoYSwgcmFuZG9tKCkgPiAwKSBJTiAoU0VMRUNUIGEsIHJhbmRv bSgpID4gMCBGUk9NIGZvcmVpZ25fdGJsKTsKICBhIAogLS0tCiAgMQpkaWZmIC0tZ2l0IGEv Y29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwgYi9jb250cmliL3Bv c3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbAppbmRleCBhMzAzYmZiMzIyZC4uMDMz YjViODE1ZGEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jl c19mZHcuc3FsCisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcu c3FsCkBAIC0zODU0LDggKzM4NTQsOCBAQCBDUkVBVEUgRk9SRUlHTiBUQUJMRSBmb3JlaWdu X3RibDIgKCkgSU5IRVJJVFMgKGZvcmVpZ25fdGJsKQogICBTRVJWRVIgbG9vcGJhY2sgT1BU SU9OUyAodGFibGVfbmFtZSAnYmFzZV90YmwnKTsKIAogRVhQTEFJTiAoVkVSQk9TRSwgQ09T VFMgT0ZGKQotU0VMRUNUIGEgRlJPTSBiYXNlX3RibCBXSEVSRSBhIElOIChTRUxFQ1QgYSBG Uk9NIGZvcmVpZ25fdGJsKTsKLVNFTEVDVCBhIEZST00gYmFzZV90YmwgV0hFUkUgYSBJTiAo U0VMRUNUIGEgRlJPTSBmb3JlaWduX3RibCk7CitTRUxFQ1QgYSBGUk9NIGJhc2VfdGJsIFdI RVJFIChhLCByYW5kb20oKSA+IDApIElOIChTRUxFQ1QgYSwgcmFuZG9tKCkgPiAwIEZST00g Zm9yZWlnbl90YmwpOworU0VMRUNUIGEgRlJPTSBiYXNlX3RibCBXSEVSRSAoYSwgcmFuZG9t KCkgPiAwKSBJTiAoU0VMRUNUIGEsIHJhbmRvbSgpID4gMCBGUk9NIGZvcmVpZ25fdGJsKTsK IAogLS0gQ2xlYW4gdXAKIERST1AgRk9SRUlHTiBUQUJMRSBmb3JlaWduX3RibCBDQVNDQURF OwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vc3Vic2VsZWN0LmMg Yi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9zdWJzZWxlY3QuYwppbmRleCA3YTlmZTg4 ZmVjMy4uZjQ2ZWMzZDE4MjYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9w bGFuL3N1YnNlbGVjdC5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3N1YnNl bGVjdC5jCkBAIC0xMjc4LDE0ICsxMjc4LDIxIEBAIGNvbnZlcnRfQU5ZX3N1YmxpbmtfdG9f am9pbihQbGFubmVySW5mbyAqcm9vdCwgU3ViTGluayAqc3VibGluaywKIAlMaXN0CSAgICpz dWJxdWVyeV92YXJzOwogCU5vZGUJICAgKnF1YWxzOwogCVBhcnNlU3RhdGUgKnBzdGF0ZTsK KwlSZWxpZHMgc3ViX3JlZl9vdXRlcl9yZWxpZHMgPSBOVUxMOworCWJvb2wgdXNlX2xhdGVy YWwgPSBmYWxzZTsKIAogCUFzc2VydChzdWJsaW5rLT5zdWJMaW5rVHlwZSA9PSBBTllfU1VC TElOSyk7CiAKIAkvKgotCSAqIFRoZSBzdWItc2VsZWN0IG11c3Qgbm90IHJlZmVyIHRvIGFu eSBWYXJzIG9mIHRoZSBwYXJlbnQgcXVlcnkuIChWYXJzIG9mCi0JICogaGlnaGVyIGxldmVs cyBzaG91bGQgYmUgb2theSwgdGhvdWdoLikKKwkgKiBJZiB0aGUgc3ViLXNlbGVjdCByZWZl cnMgdG8gYW55IFZhcnMgb2YgdGhlIHBhcmVudCBxdWVyeSwgd2Ugc28gbGV0J3MKKwkgKiBj b25zaWRlcmluZyBpdCBhcyBMQVRFUkFMLiAgKFZhcnMgb2YgaGlnaGVyIGxldmVscyBkb24n dCBtYXR0ZXIgaGVyZS4pCiAJICovCi0JaWYgKGNvbnRhaW5fdmFyc19vZl9sZXZlbCgoTm9k ZSAqKSBzdWJzZWxlY3QsIDEpKQorCXN1Yl9yZWZfb3V0ZXJfcmVsaWRzID0gcHVsbF92YXJu b3Nfb2ZfbGV2ZWwoTlVMTCwgKE5vZGUgKikgc3Vic2VsZWN0LCAxKTsKKworCXVzZV9sYXRl cmFsID0gIWJtc19pc19lbXB0eShzdWJfcmVmX291dGVyX3JlbGlkcykgJiYKKwkJCQkJCSBi bXNfaXNfc3Vic2V0KHN1Yl9yZWZfb3V0ZXJfcmVsaWRzLCBhdmFpbGFibGVfcmVscyk7CisK KwlpZiAoIXVzZV9sYXRlcmFsICYmICFibXNfaXNfZW1wdHkoc3ViX3JlZl9vdXRlcl9yZWxp ZHMpKQogCQlyZXR1cm4gTlVMTDsKIAogCS8qCkBAIC0xMzIzLDcgKzEzMzAsNyBAQCBjb252 ZXJ0X0FOWV9zdWJsaW5rX3RvX2pvaW4oUGxhbm5lckluZm8gKnJvb3QsIFN1YkxpbmsgKnN1 YmxpbmssCiAJbnNpdGVtID0gYWRkUmFuZ2VUYWJsZUVudHJ5Rm9yU3VicXVlcnkocHN0YXRl LAogCQkJCQkJCQkJCSAgIHN1YnNlbGVjdCwKIAkJCQkJCQkJCQkgICBtYWtlQWxpYXMoIkFO WV9zdWJxdWVyeSIsIE5JTCksCi0JCQkJCQkJCQkJICAgZmFsc2UsCisJCQkJCQkJCQkJICAg dXNlX2xhdGVyYWwsCiAJCQkJCQkJCQkJICAgZmFsc2UpOwogCXJ0ZSA9IG5zaXRlbS0+cF9y dGU7CiAJcGFyc2UtPnJ0YWJsZSA9IGxhcHBlbmQocGFyc2UtPnJ0YWJsZSwgcnRlKTsKZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgYi9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CmluZGV4IGI5NWQzMGY2NTg2Li4xNTZhY2Ex MjhhYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CkBAIC01MjUxLDcgKzUy NTEsNyBAQCByZXNldCBlbmFibGVfbmVzdGxvb3A7CiBleHBsYWluIChjb3N0cyBvZmYpCiBz ZWxlY3QgYS51bmlxdWUxLCBiLnVuaXF1ZTIKICAgZnJvbSBvbmVrIGEgbGVmdCBqb2luIG9u ZWsgYiBvbiBhLnVuaXF1ZTEgPSBiLnVuaXF1ZTIKLSAgd2hlcmUgYi51bmlxdWUyID0gYW55 IChzZWxlY3QgcTEgZnJvbSBpbnQ4X3RibCBjIHdoZXJlIGMucTEgPCBiLnVuaXF1ZTEpOwor ICB3aGVyZSAoYi51bmlxdWUyLCByYW5kb20oKSA+IDApID0gYW55IChzZWxlY3QgcTEsIHJh bmRvbSgpID4gMCBmcm9tIGludDhfdGJsIGMgd2hlcmUgYy5xMSA8IGIudW5pcXVlMSk7CiAg ICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiAgSGFzaCBKb2luCkBAIC01MjY3LDcgKzUyNjcsNyBAQCBzZWxlY3QgYS51 bmlxdWUxLCBiLnVuaXF1ZTIKIAogc2VsZWN0IGEudW5pcXVlMSwgYi51bmlxdWUyCiAgIGZy b20gb25layBhIGxlZnQgam9pbiBvbmVrIGIgb24gYS51bmlxdWUxID0gYi51bmlxdWUyCi0g IHdoZXJlIGIudW5pcXVlMiA9IGFueSAoc2VsZWN0IHExIGZyb20gaW50OF90YmwgYyB3aGVy ZSBjLnExIDwgYi51bmlxdWUxKTsKKyAgd2hlcmUgKGIudW5pcXVlMiwgcmFuZG9tKCkgPiAw KSA9IGFueSAoc2VsZWN0IHExLCByYW5kb20oKSA+IDAgZnJvbSBpbnQ4X3RibCBjIHdoZXJl IGMucTEgPCBiLnVuaXF1ZTEpOwogIHVuaXF1ZTEgfCB1bmlxdWUyIAogLS0tLS0tLS0tKy0t LS0tLS0tLQogICAgICAxMjMgfCAgICAgMTIzCkBAIC03MTczLDEyICs3MTczLDEyIEBAIHNl bGVjdCAqIGZyb20gKHZhbHVlcyAoMCksICgxKSkgdihpZCksCiBsYXRlcmFsIChzZWxlY3Qg KiBmcm9tIGludDhfdGJsIHQxLAogICAgICAgICAgbGF0ZXJhbCAoc2VsZWN0ICogZnJvbQog ICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ICogZnJvbSBpbnQ4X3RibCB0MgotICAgICAg ICAgICAgICAgICAgICAgd2hlcmUgcTEgPSBhbnkgKHNlbGVjdCBxMiBmcm9tIGludDhfdGJs IHQzCisgICAgICAgICAgICAgICAgICAgICB3aGVyZSAocTEsIHJhbmRvbSgpID4gMCkgPSBh bnkgKHNlbGVjdCBxMiwgcmFuZG9tKCkgPiAwIGZyb20gaW50OF90YmwgdDMKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBxMiA9IChzZWxlY3QgZ3JlYXRl c3QodDEucTEsdDIucTIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgYW5kIChzZWxlY3Qgdi5pZD0wKSkgb2Zmc2V0IDApIHNzMikgc3MKICAgICAgICAgIHdo ZXJlIHQxLnExID0gc3MucTIpIHNzMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KICBOZXN0ZWQgTG9vcAogICAgT3V0cHV0OiAiKlZBTFVFUyoiLmNvbHVtbjEsIHQx LnExLCB0MS5xMiwgc3MyLnExLCBzczIucTIKICAgIC0+ICBTZXEgU2NhbiBvbiBwdWJsaWMu aW50OF90YmwgdDEKQEAgLTcxOTUsNyArNzE5NSw3IEBAIGxhdGVyYWwgKHNlbGVjdCAqIGZy b20gaW50OF90YmwgdDEsCiAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXI6IChTdWJQbGFu IDMpCiAgICAgICAgICAgICAgICAgICAgICBTdWJQbGFuIDMKICAgICAgICAgICAgICAgICAg ICAgICAgLT4gIFJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQ6 IHQzLnEyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dDogdDMucTIsIChy YW5kb20oKSA+ICcwJzo6ZG91YmxlIHByZWNpc2lvbikKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgT25lLVRpbWUgRmlsdGVyOiAkNAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBJbml0UGxhbiAxIChyZXR1cm5zICQyKQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIC0+ICBSZXN1bHQKQEAgLTcyMTIsNyArNzIxMiw3IEBAIHNlbGVjdCAqIGZyb20g KHZhbHVlcyAoMCksICgxKSkgdihpZCksCiBsYXRlcmFsIChzZWxlY3QgKiBmcm9tIGludDhf dGJsIHQxLAogICAgICAgICAgbGF0ZXJhbCAoc2VsZWN0ICogZnJvbQogICAgICAgICAgICAg ICAgICAgICAoc2VsZWN0ICogZnJvbSBpbnQ4X3RibCB0MgotICAgICAgICAgICAgICAgICAg ICAgd2hlcmUgcTEgPSBhbnkgKHNlbGVjdCBxMiBmcm9tIGludDhfdGJsIHQzCisgICAgICAg ICAgICAgICAgICAgICB3aGVyZSAocTEsIHJhbmRvbSgpID4gMCkgPSBhbnkgKHNlbGVjdCBx MiwgcmFuZG9tKCkgPiAwIGZyb20gaW50OF90YmwgdDMKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB3aGVyZSBxMiA9IChzZWxlY3QgZ3JlYXRlc3QodDEucTEsdDIu cTIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIChzZWxl Y3Qgdi5pZD0wKSkgb2Zmc2V0IDApIHNzMikgc3MKICAgICAgICAgIHdoZXJlIHQxLnExID0g c3MucTIpIHNzMDsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3Vi c2VsZWN0Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3Vic2VsZWN0Lm91dApp bmRleCBhM2E0ZDAzZDEwNC4uYjcwYjM0NjY5NmQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvc3Vic2VsZWN0Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL3N1YnNlbGVjdC5vdXQKQEAgLTE5MjYsMyArMTkyNiwxNDggQEAgc2VsZWN0ICog ZnJvbSB4IGZvciB1cGRhdGU7CiAgICBPdXRwdXQ6IHN1YnNlbGVjdF90YmwuZjEsIHN1YnNl bGVjdF90YmwuZjIsIHN1YnNlbGVjdF90YmwuZjMKICgyIHJvd3MpCiAKKy0tIFB1bGwtdXAg dGhlIGRpcmVjdC1jb3JyZWxhdGVkIEFOWV9TVUJMSU5LCitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgKiBmcm9tIHRlbmsxIEEgd2hlcmUgaHVuZHJlZCBpbiAoc2VsZWN0IGh1bmRy ZWQgZnJvbSB0ZW5rMiBCIHdoZXJlIEIub2RkID0gQS5vZGQpOworICAgICAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBIYXNoIEpvaW4KKyAgIEhhc2ggQ29uZDogKChhLm9kZCA9IGIub2RkKSBBTkQgKGEuaHVu ZHJlZCA9IGIuaHVuZHJlZCkpCisgICAtPiAgU2VxIFNjYW4gb24gdGVuazEgYQorICAgLT4g IEhhc2gKKyAgICAgICAgIC0+ICBIYXNoQWdncmVnYXRlCisgICAgICAgICAgICAgICBHcm91 cCBLZXk6IGIub2RkLCBiLmh1bmRyZWQKKyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBv biB0ZW5rMiBiCisoNyByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBm cm9tIHRlbmsxIEEgd2hlcmUgZXhpc3RzCisoc2VsZWN0IDEgZnJvbSB0ZW5rMiBCCit3aGVy ZSBBLmh1bmRyZWQgaW4gKHNlbGVjdCBDLmh1bmRyZWQgRlJPTSB0ZW5rMiBDCitXSEVSRSBj Lm9kZCA9IGIub2RkKSk7CisgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIFNlbWkgSm9p bgorICAgSm9pbiBGaWx0ZXI6IChTdWJQbGFuIDEpCisgICAtPiAgU2VxIFNjYW4gb24gdGVu azEgYQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGVu azIgYgorICAgU3ViUGxhbiAxCisgICAgIC0+ICBTZXEgU2NhbiBvbiB0ZW5rMiBjCisgICAg ICAgICAgIEZpbHRlcjogKG9kZCA9IGIub2RkKQorKDggcm93cykKKworLS0gd2Ugc2hvdWxk IG9ubHkgdHJ5IHRvIHB1bGwgdXAgdGhlIHN1YmxpbmsgaW50byBSSFMgb2YgYSBsZWZ0IGpv aW4KKy0tIGJ1dCBhLmh1bmRyZWQgaXMgbm90IGF2YWlhYmxlLgorZXhwbGFpbiAoY29zdHMg b2ZmKQorU0VMRUNUICogRlJPTSB0ZW5rMSBBIExFRlQgSk9JTiB0ZW5rMiBCCitPTiBBLmh1 bmRyZWQgaW4gKFNFTEVDVCBjLmh1bmRyZWQgRlJPTSB0ZW5rMiBDIFdIRVJFIGMub2RkID0g Yi5vZGQpOworICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpv aW4gRmlsdGVyOiAoU3ViUGxhbiAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHRlbmsxIGEKKyAg IC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRlbmsyIGIKKyAg IFN1YlBsYW4gMQorICAgICAtPiAgU2VxIFNjYW4gb24gdGVuazIgYworICAgICAgICAgICBG aWx0ZXI6IChvZGQgPSBiLm9kZCkKKyg4IHJvd3MpCisKKy0tIHdlIHNob3VsZCBvbmx5IHRy eSB0byBwdWxsIHVwIHRoZSBzdWJsaW5rIGludG8gUkhTIG9mIGEgbGVmdCBqb2luCistLSBi dXQgYS5vZGQgaXMgbm90IGF2YWlhYmxlIGZvciB0aGlzLgorZXhwbGFpbiAoY29zdHMgb2Zm KQorU0VMRUNUICogRlJPTSB0ZW5rMSBBIExFRlQgSk9JTiB0ZW5rMiBCCitPTiBCLmh1bmRy ZWQgaW4gKFNFTEVDVCBjLmh1bmRyZWQgRlJPTSB0ZW5rMiBDIFdIRVJFIGMub2RkID0gYS5v ZGQpOworICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpvaW4g RmlsdGVyOiAoU3ViUGxhbiAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHRlbmsxIGEKKyAgIC0+ ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRlbmsyIGIKKyAgIFN1 YlBsYW4gMQorICAgICAtPiAgU2VxIFNjYW4gb24gdGVuazIgYworICAgICAgICAgICBGaWx0 ZXI6IChvZGQgPSBhLm9kZCkKKyg4IHJvd3MpCisKKy0tIHNob3VsZCBiZSBhYmxlIHRvIHB1 bGwgdXAgc2luY2UgYWxsIHRoZSByZWZlcmVuY2VzIGlzIGF2YWlsYWJsZQorZXhwbGFpbiAo Y29zdHMgb2ZmKQorU0VMRUNUICogRlJPTSB0ZW5rMSBBIExFRlQgSk9JTiB0ZW5rMiBCCitP TiBCLmh1bmRyZWQgaW4gKFNFTEVDVCBjLmh1bmRyZWQgRlJPTSB0ZW5rMiBDIFdIRVJFIGMu b2RkID0gYi5vZGQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIC0+ICBTZXEgU2NhbiBvbiB0ZW5rMSBhCisg ICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBIYXNoIEpvaW4KKyAgICAgICAgICAg ICAgIEhhc2ggQ29uZDogKChiLm9kZCA9IGMub2RkKSBBTkQgKGIuaHVuZHJlZCA9IGMuaHVu ZHJlZCkpCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGVuazIgYgorICAgICAg ICAgICAgICAgLT4gIEhhc2gKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBIYXNoQWdncmVn YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCBLZXk6IGMub2RkLCBjLmh1 bmRyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0ZW5r MiBjCisoMTAgcm93cykKKworLS0gd2UgY2FuIHB1bGwgdXAgdGhlIHN1YmxpbmsgaW50byB0 aGUgaW5uZXIgSm9pbkV4cHIuCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9N IHRlbmsxIEEgSU5ORVIgSk9JTiB0ZW5rMiBCCitPTiBBLmh1bmRyZWQgaW4gKFNFTEVDVCBj Lmh1bmRyZWQgRlJPTSB0ZW5rMiBDIFdIRVJFIGMub2RkID0gYi5vZGQpOworICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggSm9pbgorICAg SGFzaCBDb25kOiAoYy5vZGQgPSBiLm9kZCkKKyAgIC0+ICBIYXNoIEpvaW4KKyAgICAgICAg IEhhc2ggQ29uZDogKGEuaHVuZHJlZCA9IGMuaHVuZHJlZCkKKyAgICAgICAgIC0+ICBTZXEg U2NhbiBvbiB0ZW5rMSBhCisgICAgICAgICAtPiAgSGFzaAorICAgICAgICAgICAgICAgLT4g IEhhc2hBZ2dyZWdhdGUKKyAgICAgICAgICAgICAgICAgICAgIEdyb3VwIEtleTogYy5vZGQs IGMuaHVuZHJlZAorICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRlbmsy IGMKKyAgIC0+ICBIYXNoCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGVuazIgYgorKDEx IHJvd3MpCisKKy0tIHdlIGNhbiBwdWxsIHVwIHRoZSBhZ2dyZWdhdGUgc3VibGluayBpbnRv IHRoZSBzdWJxdWVyeSBzY2FuIGJlY2F1c2Ugb2YgZ290IG9uZSByb3cuCitleHBsYWluIChj b3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIHRlbmsxIEEgTEVGVCBKT0lOIHRlbmsyIEIKK09O IEIuaHVuZHJlZCBpbiAoU0VMRUNUIG1pbihjLmh1bmRyZWQpIEZST00gdGVuazIgQyBXSEVS RSBjLm9kZCA9IGIub2RkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AgTGVmdCBK b2luCisgICAtPiAgU2VxIFNjYW4gb24gdGVuazEgYQorICAgLT4gIE1hdGVyaWFsaXplCisg ICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBv biB0ZW5rMiBiCisgICAgICAgICAgICAgICAtPiAgTWVtb2l6ZQorICAgICAgICAgICAgICAg ICAgICAgQ2FjaGUgS2V5OiBiLmh1bmRyZWQsIGIub2RkCisgICAgICAgICAgICAgICAgICAg ICBDYWNoZSBNb2RlOiBiaW5hcnkKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBTdWJxdWVy eSBTY2FuIG9uICJBTllfc3VicXVlcnkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBG aWx0ZXI6IChiLmh1bmRyZWQgPSAiQU5ZX3N1YnF1ZXJ5Ii5taW4pCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAtPiAgUmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBJbml0UGxhbiAxIChyZXR1cm5zICQxKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAtPiAgTGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdGVuazJfaHVuZHJlZCBvbiB0ZW5rMiBj CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4 IENvbmQ6IChodW5kcmVkIElTIE5PVCBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXI6IChvZGQgPSBiLm9kZCkKKygxNiByb3dz KQorCistLSB3ZSBjYW4gcHVsbCB1cCB0aGUgYWdncmVnYXRlIHN1YmxpbmsgaW50byB0aGUg Sm9pbkV4cHIuCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIHRlbmsxIEEg TEVGVCBKT0lOIHRlbmsyIEIKK09OIEIuaHVuZHJlZCBpbiAoU0VMRUNUIGNvdW50KGMuaHVu ZHJlZCkgRlJPTSB0ZW5rMiBDIGdyb3VwIGJ5IChjLm9kZCkpOworICAgICAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgLT4gIFNlcSBTY2FuIG9uIHRlbmsxIGEK KyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIEhhc2ggU2VtaSBKb2luCisgICAg ICAgICAgICAgICBIYXNoIENvbmQ6IChiLmh1bmRyZWQgPSAiQU5ZX3N1YnF1ZXJ5Ii5jb3Vu dCkKKyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0ZW5rMiBiCisgICAgICAgICAg ICAgICAtPiAgSGFzaAorICAgICAgICAgICAgICAgICAgICAgLT4gIFN1YnF1ZXJ5IFNjYW4g b24gIkFOWV9zdWJxdWVyeSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBIYXNo QWdncmVnYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCBLZXk6 IGMub2RkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4g b24gdGVuazIgYworKDExIHJvd3MpCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL2pvaW4uc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwKaW5kZXggM2U1 MDMyYjA0ZGQuLjIxMjFjYWY3ZTNlIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9qb2luLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbApAQCAtMTg1 MiwxMSArMTg1MiwxMSBAQCByZXNldCBlbmFibGVfbmVzdGxvb3A7CiBleHBsYWluIChjb3N0 cyBvZmYpCiBzZWxlY3QgYS51bmlxdWUxLCBiLnVuaXF1ZTIKICAgZnJvbSBvbmVrIGEgbGVm dCBqb2luIG9uZWsgYiBvbiBhLnVuaXF1ZTEgPSBiLnVuaXF1ZTIKLSAgd2hlcmUgYi51bmlx dWUyID0gYW55IChzZWxlY3QgcTEgZnJvbSBpbnQ4X3RibCBjIHdoZXJlIGMucTEgPCBiLnVu aXF1ZTEpOworICB3aGVyZSAoYi51bmlxdWUyLCByYW5kb20oKSA+IDApID0gYW55IChzZWxl Y3QgcTEsIHJhbmRvbSgpID4gMCBmcm9tIGludDhfdGJsIGMgd2hlcmUgYy5xMSA8IGIudW5p cXVlMSk7CiAKIHNlbGVjdCBhLnVuaXF1ZTEsIGIudW5pcXVlMgogICBmcm9tIG9uZWsgYSBs ZWZ0IGpvaW4gb25layBiIG9uIGEudW5pcXVlMSA9IGIudW5pcXVlMgotICB3aGVyZSBiLnVu aXF1ZTIgPSBhbnkgKHNlbGVjdCBxMSBmcm9tIGludDhfdGJsIGMgd2hlcmUgYy5xMSA8IGIu dW5pcXVlMSk7CisgIHdoZXJlIChiLnVuaXF1ZTIsIHJhbmRvbSgpID4gMCkgPSBhbnkgKHNl bGVjdCBxMSwgcmFuZG9tKCkgPiAwIGZyb20gaW50OF90YmwgYyB3aGVyZSBjLnExIDwgYi51 bmlxdWUxKTsKIAogLS0KIC0tIHRlc3QgZnVsbC1qb2luIHN0cmVuZ3RoIHJlZHVjdGlvbgpA QCAtMjU3OCw3ICsyNTc4LDcgQEAgc2VsZWN0ICogZnJvbSAodmFsdWVzICgwKSwgKDEpKSB2 KGlkKSwKIGxhdGVyYWwgKHNlbGVjdCAqIGZyb20gaW50OF90YmwgdDEsCiAgICAgICAgICBs YXRlcmFsIChzZWxlY3QgKiBmcm9tCiAgICAgICAgICAgICAgICAgICAgIChzZWxlY3QgKiBm cm9tIGludDhfdGJsIHQyCi0gICAgICAgICAgICAgICAgICAgICB3aGVyZSBxMSA9IGFueSAo c2VsZWN0IHEyIGZyb20gaW50OF90YmwgdDMKKyAgICAgICAgICAgICAgICAgICAgIHdoZXJl IChxMSwgcmFuZG9tKCkgPiAwKSA9IGFueSAoc2VsZWN0IHEyLCByYW5kb20oKSA+IDAgZnJv bSBpbnQ4X3RibCB0MwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdo ZXJlIHEyID0gKHNlbGVjdCBncmVhdGVzdCh0MS5xMSx0Mi5xMikpCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgKHNlbGVjdCB2LmlkPTApKSBvZmZzZXQg MCkgc3MyKSBzcwogICAgICAgICAgd2hlcmUgdDEucTEgPSBzcy5xMikgc3MwOwpAQCAtMjU4 Nyw3ICsyNTg3LDcgQEAgc2VsZWN0ICogZnJvbSAodmFsdWVzICgwKSwgKDEpKSB2KGlkKSwK IGxhdGVyYWwgKHNlbGVjdCAqIGZyb20gaW50OF90YmwgdDEsCiAgICAgICAgICBsYXRlcmFs IChzZWxlY3QgKiBmcm9tCiAgICAgICAgICAgICAgICAgICAgIChzZWxlY3QgKiBmcm9tIGlu dDhfdGJsIHQyCi0gICAgICAgICAgICAgICAgICAgICB3aGVyZSBxMSA9IGFueSAoc2VsZWN0 IHEyIGZyb20gaW50OF90YmwgdDMKKyAgICAgICAgICAgICAgICAgICAgIHdoZXJlIChxMSwg cmFuZG9tKCkgPiAwKSA9IGFueSAoc2VsZWN0IHEyLCByYW5kb20oKSA+IDAgZnJvbSBpbnQ4 X3RibCB0MwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHEy ID0gKHNlbGVjdCBncmVhdGVzdCh0MS5xMSx0Mi5xMikpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBhbmQgKHNlbGVjdCB2LmlkPTApKSBvZmZzZXQgMCkgc3My KSBzcwogICAgICAgICAgd2hlcmUgdDEucTEgPSBzcy5xMikgc3MwOwpkaWZmIC0tZ2l0IGEv c3JjL3Rlc3QvcmVncmVzcy9zcWwvc3Vic2VsZWN0LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL3N1YnNlbGVjdC5zcWwKaW5kZXggYmQyZTM5ZWZkNDguLjVkMzNlYjM5YmFhIDEwMDY0 NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zdWJzZWxlY3Quc3FsCisrKyBiL3NyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL3N1YnNlbGVjdC5zcWwKQEAgLTk2OCwzICs5NjgsNDUgQEAgc2Vs ZWN0ICogZnJvbSAod2l0aCB4IGFzIChzZWxlY3QgMiBhcyB5KSBzZWxlY3QgKiBmcm9tIHgp IHNzOwogZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQogd2l0aCB4IGFzIChzZWxlY3Qg KiBmcm9tIHN1YnNlbGVjdF90YmwpCiBzZWxlY3QgKiBmcm9tIHggZm9yIHVwZGF0ZTsKKwor LS0gUHVsbC11cCB0aGUgZGlyZWN0LWNvcnJlbGF0ZWQgQU5ZX1NVQkxJTksKK2V4cGxhaW4g KGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gdGVuazEgQSB3aGVyZSBodW5kcmVkIGluIChz ZWxlY3QgaHVuZHJlZCBmcm9tIHRlbmsyIEIgd2hlcmUgQi5vZGQgPSBBLm9kZCk7CisKK2V4 cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gdGVuazEgQSB3aGVyZSBleGlzdHMK KyhzZWxlY3QgMSBmcm9tIHRlbmsyIEIKK3doZXJlIEEuaHVuZHJlZCBpbiAoc2VsZWN0IEMu aHVuZHJlZCBGUk9NIHRlbmsyIEMKK1dIRVJFIGMub2RkID0gYi5vZGQpKTsKKworLS0gd2Ug c2hvdWxkIG9ubHkgdHJ5IHRvIHB1bGwgdXAgdGhlIHN1YmxpbmsgaW50byBSSFMgb2YgYSBs ZWZ0IGpvaW4KKy0tIGJ1dCBhLmh1bmRyZWQgaXMgbm90IGF2YWlhYmxlLgorZXhwbGFpbiAo Y29zdHMgb2ZmKQorU0VMRUNUICogRlJPTSB0ZW5rMSBBIExFRlQgSk9JTiB0ZW5rMiBCCitP TiBBLmh1bmRyZWQgaW4gKFNFTEVDVCBjLmh1bmRyZWQgRlJPTSB0ZW5rMiBDIFdIRVJFIGMu b2RkID0gYi5vZGQpOworCistLSB3ZSBzaG91bGQgb25seSB0cnkgdG8gcHVsbCB1cCB0aGUg c3VibGluayBpbnRvIFJIUyBvZiBhIGxlZnQgam9pbgorLS0gYnV0IGEub2RkIGlzIG5vdCBh dmFpYWJsZSBmb3IgdGhpcy4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCAqIEZST00g dGVuazEgQSBMRUZUIEpPSU4gdGVuazIgQgorT04gQi5odW5kcmVkIGluIChTRUxFQ1QgYy5o dW5kcmVkIEZST00gdGVuazIgQyBXSEVSRSBjLm9kZCA9IGEub2RkKTsKKworLS0gc2hvdWxk IGJlIGFibGUgdG8gcHVsbCB1cCBzaW5jZSBhbGwgdGhlIHJlZmVyZW5jZXMgaXMgYXZhaWxh YmxlCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIHRlbmsxIEEgTEVGVCBK T0lOIHRlbmsyIEIKK09OIEIuaHVuZHJlZCBpbiAoU0VMRUNUIGMuaHVuZHJlZCBGUk9NIHRl bmsyIEMgV0hFUkUgYy5vZGQgPSBiLm9kZCk7CisKKy0tIHdlIGNhbiBwdWxsIHVwIHRoZSBz dWJsaW5rIGludG8gdGhlIGlubmVyIEpvaW5FeHByLgorZXhwbGFpbiAoY29zdHMgb2ZmKQor U0VMRUNUICogRlJPTSB0ZW5rMSBBIElOTkVSIEpPSU4gdGVuazIgQgorT04gQS5odW5kcmVk IGluIChTRUxFQ1QgYy5odW5kcmVkIEZST00gdGVuazIgQyBXSEVSRSBjLm9kZCA9IGIub2Rk KTsKKworLS0gd2UgY2FuIHB1bGwgdXAgdGhlIGFnZ3JlZ2F0ZSBzdWJsaW5rIGludG8gdGhl IHN1YnF1ZXJ5IHNjYW4gYmVjYXVzZSBvZiBnb3Qgb25lIHJvdy4KK2V4cGxhaW4gKGNvc3Rz IG9mZikKK1NFTEVDVCAqIEZST00gdGVuazEgQSBMRUZUIEpPSU4gdGVuazIgQgorT04gQi5o dW5kcmVkIGluIChTRUxFQ1QgbWluKGMuaHVuZHJlZCkgRlJPTSB0ZW5rMiBDIFdIRVJFIGMu b2RkID0gYi5vZGQpOworCistLSB3ZSBjYW4gcHVsbCB1cCB0aGUgYWdncmVnYXRlIHN1Ymxp bmsgaW50byB0aGUgSm9pbkV4cHIuCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgKiBG Uk9NIHRlbmsxIEEgTEVGVCBKT0lOIHRlbmsyIEIKK09OIEIuaHVuZHJlZCBpbiAoU0VMRUNU IGNvdW50KGMuaHVuZHJlZCkgRlJPTSB0ZW5rMiBDIGdyb3VwIGJ5IChjLm9kZCkpOwpcIE5v IG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKLS0gCjIuMzQuMQoK --------------tKB0E3ud2iUXVjYXku0t0Am0--