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 1tXO6R-0062hJ-SF for pgsql-hackers@arkaria.postgresql.org; Mon, 13 Jan 2025 17:19:53 +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 1tXO6Q-00BnjA-IG for pgsql-hackers@arkaria.postgresql.org; Mon, 13 Jan 2025 17:19:51 +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 1tXO6Q-00Bnix-0J for pgsql-hackers@lists.postgresql.org; Mon, 13 Jan 2025 17:19:50 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tXO6K-000D9H-0G for pgsql-hackers@lists.postgresql.org; Mon, 13 Jan 2025 17:19:50 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1736788782; bh=pY/hmd1uWcvrKrKKfoyXnNppLq4KbGRyFRtj+uhvr5Q=; h=Message-ID:Date:User-Agent:Subject:From:To:Cc:References: In-Reply-To:From; b=SzUrx7A7Xi8yQMoap1uo8h/sAKnpq3LYZTABiUKFh3nr4rSgHCfEDgNFxspSGSOL4 JW84Nf1gNVeqK3n0UGSk0kxNfNZ8e7Mzr0qlFwti5oUkKLzXFWd4E90Wdd09hWbaqm iursQGNSdU9EghdtEOVLZQkvI9x0Hg01iw9LhNeilX5OAUGTAMHCakiCykswAeWUJM iox9vowuTlWIVTj8ztvfEXXUNjPN1UN4LL2dNTu5e8mx85rg2QGdNKrCYo4wGXofQ4 cUqig9b9B4eCozYBrIAq+7kp/cqv3lufoaSV7SiTPvlUe7ewTVPml6iBotqbzBqu8L qXoyP4KhwGo0w== Received: from [10.4.12.74] (unknown [93.174.131.141]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: a.rybakina@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 31E32603BD; Mon, 13 Jan 2025 20:19:42 +0300 (MSK) Content-Type: multipart/mixed; boundary="------------PBtjD3Pbfc5Utz6veTecv4Ji" Message-ID: <6078f7e1-4b29-4b31-bd28-b84149e404e4@postgrespro.ru> Date: Mon, 13 Jan 2025 20:19:42 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Exists pull-up application with JoinExpr From: Alena Rybakina To: Ilia Evdokimov Cc: PostgreSQL Hackers , Ranier Vilela References: <0b1f670d-b39d-4966-bf32-f0d502ebc564@postgrespro.ru> <46bc4eaf-58c5-42ab-8041-d3380a0768de@postgrespro.ru> <9b041978-06e3-4a50-8a5d-dacbb054f23e@tantorlabs.com> <8d7cbbf6-ddc0-4696-8af2-a68d740e14f2@postgrespro.ru> Content-Language: en-US In-Reply-To: <8d7cbbf6-ddc0-4696-8af2-a68d740e14f2@postgrespro.ru> X-KSMG-AntiPhishing: NotDetected X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.1.0.7854, bases: 2025/01/13 14:44:00 #26997378 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 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. --------------PBtjD3Pbfc5Utz6veTecv4Ji Content-Type: multipart/alternative; boundary="------------bGl4bJnXOvDc79je5l4G0S0K" --------------bGl4bJnXOvDc79je5l4G0S0K Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi! I have solved it. On 30.12.2024 11:24, Alena Rybakina wrote: > > Hi! Thank you for your interest to this subject! > > On 27.12.2024 15:53, Ilia Evdokimov wrote: >> Hi Alena, >> >> Thank you for your work on subqueries with JOIN. >> >> Have you considered the scenario where in subquery includes a qual >> like (tc.aid = 1)? When I tried executing those queries I receive >> different results. In my opinion, to prevent this, we should add >> filters for such quals within the loop 'foreach (lc, all_clauses)' >> >> EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) SELECT * FROM ta >> WHERE EXISTS (SELECT * FROM tb, tc WHERE ta.id = tb.id AND tc.aid = 1); >>                               QUERY PLAN >> ---------------------------------------------------------------------- >>  Hash Join (actual rows=1 loops=1) >>    Hash Cond: (ta.id = tb.id) >>    Buffers: local hit=3 >>    ->  Seq Scan on ta (actual rows=3 loops=1) >>          Buffers: local hit=1 >>    ->  Hash (actual rows=3 loops=1) >>          Buckets: 4096  Batches: 1  Memory Usage: 33kB >>          Buffers: local hit=2 >>          ->  HashAggregate (actual rows=3 loops=1) >>                Group Key: tb.id >>                Batches: 1  Memory Usage: 121kB >>                Buffers: local hit=2 >>                ->  Nested Loop (actual rows=3 loops=1) >>                      Buffers: local hit=2 >>                      ->  Seq Scan on tb (actual rows=3 loops=1) >>                            Buffers: local hit=1 >>                      ->  Materialize (actual rows=1 loops=3) >>                            Storage: Memory  Maximum Storage: 17kB >>                            Buffers: local hit=1 >>                            ->  Seq Scan on tc (actual rows=1 loops=1) >>                                  Filter: (aid = 1) >>                                  Rows Removed by Filter: 1 >>                                  Buffers: local hit=1 >> (23 rows) >> >> ============================ >> >> EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) >> SELECT * FROM ta WHERE EXISTS (SELECT * FROM tb JOIN tc ON ta.id = >> tb.id WHERE tc.aid = 1); >>                                 QUERY PLAN >> --------------------------------------------------------------------------- >> >>  Seq Scan on ta (actual rows=1 loops=1) >>    Filter: EXISTS(SubPlan 1) >>    Rows Removed by Filter: 2 >>    Buffers: local hit=6 >>    SubPlan 1 >>      ->  Nested Loop (actual rows=0 loops=3) >>            Buffers: local hit=5 >>            ->  Index Only Scan using tb_pkey on tb (actual rows=0 >> loops=3) >>                  Index Cond: (id = ta.id) >>                  Heap Fetches: 1 >>                  Buffers: local hit=4 >>            ->  Seq Scan on tc (actual rows=1 loops=1) >>                  Filter: (aid = 1) >>                  Buffers: local hit=1 >> (14 rows) >> >> > You are right, at the moment the code is not processed if there is a > constant qual in the subquery (like t1.x1=1 in the example below) and > this problem is not only related to the current patch. > > For example you can get such a query plan if you complete this request > to the master: > > create table t (xint); > create table t1 (x1int); > create table t2 (x2int); > EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) > SELECT 1 > FROM t > WHERE EXISTS (SELECT 1 > FROM t1 > where t1.x1 = 1); > QUERY PLAN > ------------------------------------------------ > Result (actual rows=0 loops=1) > One-Time Filter: (InitPlan 1).col1 > InitPlan 1 > -> Seq Scan on t1 (actual rows=0 loops=1) > Filter: (x1 = 1) > -> Seq Scan on t (never executed) > (6 rows) > > It's all because of the check in this function - this qual has > levelsoup = 0, not 1 (see (!contain_vars_of_level(whereClause, 1)), > but I already found out that by changing this, the logic of correction > there is required a little more complicated. At the moment, I'm > working to add this processing to the patch. > > Thanks for the case! > The logic is the same, but extended to constants. I added a few more tests that not only cover this case, but also NOT EXISTS, which will be converted to ANTI JOIN. -- Regards, Alena Rybakina Postgres Professional --------------bGl4bJnXOvDc79je5l4G0S0K Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hi! I have solved it.

On 30.12.2024 11:24, Alena Rybakina wrote:

Hi! Thank you for your interest to this subject!

On 27.12.2024 15:53, Ilia Evdokimov wrote:
Hi Alena,

Thank you for your work on subqueries with JOIN.

Have you considered the scenario where in subquery includes a qual like (tc.aid = 1)? When I tried executing those queries I receive different results. In my opinion, to prevent this, we should add filters for such quals within the loop 'foreach (lc, all_clauses)'

EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF) SELECT * FROM ta
WHERE EXISTS (SELECT * FROM tb, tc WHERE ta.id = tb.id AND tc.aid = 1);
                              QUERY PLAN
----------------------------------------------------------------------
 Hash Join (actual rows=1 loops=1)
   Hash Cond: (ta.id = tb.id)
   Buffers: local hit=3
   ->  Seq Scan on ta (actual rows=3 loops=1)
         Buffers: local hit=1
   ->  Hash (actual rows=3 loops=1)
         Buckets: 4096  Batches: 1  Memory Usage: 33kB
         Buffers: local hit=2
         ->  HashAggregate (actual rows=3 loops=1)
               Group Key: tb.id
               Batches: 1  Memory Usage: 121kB
               Buffers: local hit=2
               ->  Nested Loop (actual rows=3 loops=1)
                     Buffers: local hit=2
                     ->  Seq Scan on tb (actual rows=3 loops=1)
                           Buffers: local hit=1
                     ->  Materialize (actual rows=1 loops=3)
                           Storage: Memory  Maximum Storage: 17kB
                           Buffers: local hit=1
                           ->  Seq Scan on tc (actual rows=1 loops=1)
                                 Filter: (aid = 1)
                                 Rows Removed by Filter: 1
                                 Buffers: local hit=1
(23 rows)

============================

EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
SELECT * FROM ta WHERE EXISTS (SELECT * FROM tb JOIN tc ON ta.id =
tb.id WHERE tc.aid = 1);
                                QUERY PLAN
---------------------------------------------------------------------------
 Seq Scan on ta (actual rows=1 loops=1)
   Filter: EXISTS(SubPlan 1)
   Rows Removed by Filter: 2
   Buffers: local hit=6
   SubPlan 1
     ->  Nested Loop (actual rows=0 loops=3)
           Buffers: local hit=5
           ->  Index Only Scan using tb_pkey on tb (actual rows=0 loops=3)
                 Index Cond: (id = ta.id)
                 Heap Fetches: 1
                 Buffers: local hit=4
           ->  Seq Scan on tc (actual rows=1 loops=1)
                 Filter: (aid = 1)
                 Buffers: local hit=1
(14 rows)


You are right, at the moment the code is not processed if there is a constant qual in the subquery (like t1.x1=1 in the example below) and this problem is not only related to the current patch. 

For example you can get such a query plan if you complete this request to the master:

create table t (x int);
create table t1 (x1 int);
create table t2 (x2 int);
 EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
 SELECT 1
   FROM t
  WHERE EXISTS (SELECT 1
                  FROM t1
                  where t1.x1 = 1);
                   QUERY PLAN                   
------------------------------------------------
 Result (actual rows=0 loops=1)
   One-Time Filter: (InitPlan 1).col1
   InitPlan 1
     ->  Seq Scan on t1 (actual rows=0 loops=1)
           Filter: (x1 = 1)
   ->  Seq Scan on t (never executed)
(6 rows)

It's all because of the check in this function - this qual has levelsoup = 0, not 1 (see (!contain_vars_of_level(whereClause, 1)), but I already found out that by changing this, the logic of correction there is required a little more complicated. At the moment, I'm working to add this processing to the patch. 

Thanks for the case!


    
The logic is the same, but extended to constants. I added a few more tests that not only cover this case, but also NOT EXISTS, which will be converted to ANTI JOIN.
-- 
Regards,
Alena Rybakina
Postgres Professional
--------------bGl4bJnXOvDc79je5l4G0S0K-- --------------PBtjD3Pbfc5Utz6veTecv4Ji Content-Type: text/x-patch; charset=UTF-8; name="v2-0001-Teach-the-planner-to-convert-EXISTS-and-NOT-EXISTS-s.patch" Content-Disposition: attachment; filename*0="v2-0001-Teach-the-planner-to-convert-EXISTS-and-NOT-EXISTS-s"; filename*1=".patch" Content-Transfer-Encoding: base64 RnJvbSBiOTExMzMzMDc4ZmFkNzFkNDUwOWFkYWIxYjA0NzM4Mjg0MDliMDAwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbGVuYSBSeWJha2luYSA8YS5yeWJha2luYUBwb3N0 Z3Jlc3Byby5ydT4KRGF0ZTogVHVlLCAxMiBOb3YgMjAyNCAxMjoxNjo0MiArMDMwMApTdWJq ZWN0OiBbUEFUQ0hdIFRlYWNoIHRoZSBwbGFubmVyIHRvIGNvbnZlcnQgRVhJU1RTIGFuZCBO T1QgRVhJU1RTIHN1YnF1ZXJpZXMKIGludG8gc2VtaSBhbmQgYW50aSBqb2lucywgcmVzcGVj dGl2ZWx5LCBpZiBzdWJxdWVyeSdzIGpvaW4gZXhwcmVzc2lvbnMgYXJlCiBpbmRlcGVuZGVu dCBhbmQgdmFycyBoYXZlIHRoZSBsZXZlbCBubyBtb3JlIHRoYW4gdGhlIHBhcmVudC4gSW4g YWRkdGlvbiB0aGUKIHRyYW5zZm9ybWF0aW9uIHdpbGwgYmUgYWxvd2VkIGlmIHRoZSBleHBy ZXNzaW9ucyBhcmUgY29uc3RhbnQuIFRvIGRvIHRoaXMsIHdlCiBwdXQgYWxsIHBvdGVudGlh bCBleHByZXNzaW9ucyBmcm9tIHRoZSBxdWFsIGxpc3QgYW5kIGpvaW4gbGlzdCBpbnRvIHRo ZQogY29tbW9uIGxpc3QgYW5kIGNoZWNrIGVhY2ggZXhwcmVzc2lvbiBvbmUgYnkgb25lIHRv IHNlZSBpZiB0aGV5IGFyZSBzdWl0YWJsZQogZm9yIHRyYW5zZm9ybWF0aW9uLiBJbiBwYXJ0 aWN1bGFyLCB3ZSBuZWVkIHRvIGluY3JlbWVudCB0aGUgbGV2ZWwgb2YKIGV4cHJlc2lvbnMn cyB2YXJzIHRvIHRoZSBwYXJlbnQgcXVlcnkgbGV2ZWwuIFdlIGNvbmRpZGVyIGV4cHJlc3Np b25zIG9ubHkgZm9yCiBJTk5FUiBKT0lOIHR5cGUgb2Ygam9pbiBpbiBzdWJxdWVyeSwgb3Ro ZXJ3aWNlIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBub3QKIGF2YWlsYWJsZS4KIAogQXV0aG9y czogQWxlbmEgUnliYWtpbmEgPGxlbmEucmliYWNraW5hQHlhbmRleC5ydT4KIFJldmlld2Vk LWJ5OiBSYW5pZXIgVmlsZWxhIDxyYW5pZXIudmZAZ21haWwuY29tPiwgSWxpYSBFdmRva2lt b3YgPGlseWEuZXZkb2tpbW92QHRhbnRvcmxhYnMuY29tPgoKLS0tCiBzcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGxhbi9zdWJzZWxlY3QuYyAgfCAxMzUgKysrKysrKysrKy0tLS0KIHNyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3Vic2VsZWN0Lm91dCB8IDIzMiArKysrKysrKysrKysr KysrKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N1YnNlbGVjdC5zcWwgICAgICB8 ICA5OSArKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDQzMyBpbnNlcnRpb25zKCspLCAz MyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxh bi9zdWJzZWxlY3QuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3N1YnNlbGVjdC5j CmluZGV4IGVhYWY4YzFiNDlhLi45NTdkNmNkMzZiZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BsYW4vc3Vic2VsZWN0LmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BsYW4vc3Vic2VsZWN0LmMKQEAgLTEzNzYsNiArMTM3NiwxOCBAQCBjb252ZXJ0X0VY SVNUU19zdWJsaW5rX3RvX2pvaW4oUGxhbm5lckluZm8gKnJvb3QsIFN1YkxpbmsgKnN1Ymxp bmssCiAJaW50CQkJdmFybm87CiAJUmVsaWRzCQljbGF1c2VfdmFybm9zOwogCVJlbGlkcwkJ dXBwZXJfdmFybm9zOworCUxpc3RDZWxsICpsYzsKKwlMaXN0ICpjbGF1c2VzID0gTklMOwor CUxpc3QgKmFsbF9jbGF1c2VzID0gTklMOworCWludCBmaXJzdF9lbGVtID0gdHJ1ZTsKKwlD b25zdCAqY29uc3RfdmFyID0gbWFrZUNvbnN0KEJPT0xPSUQsCisJCQkJCQkJCQktMSwKKwkJ CQkJCQkJCUludmFsaWRPaWQsCisJCQkJCQkJCQlzaXplb2YoYm9vbCksCisJCQkJCQkJCQko RGF0dW0pIDEsCisJCQkJCQkJCQlmYWxzZSwKKwkJCQkJCQkJCXRydWUpOworCiAKIAlBc3Nl cnQoc3VibGluay0+c3ViTGlua1R5cGUgPT0gRVhJU1RTX1NVQkxJTkspOwogCkBAIC0xNDAz LDQwICsxNDE1LDE1IEBAIGNvbnZlcnRfRVhJU1RTX3N1YmxpbmtfdG9fam9pbihQbGFubmVy SW5mbyAqcm9vdCwgU3ViTGluayAqc3VibGluaywKIAkgKiB3aXRoIG5vcGxhY2UgdG8gZXZh bHVhdGUgdGhlIHRhcmdldGxpc3QuCiAJICovCiAJaWYgKCFzaW1wbGlmeV9FWElTVFNfcXVl cnkocm9vdCwgc3Vic2VsZWN0KSkKLQkJcmV0dXJuIE5VTEw7CisJCQlyZXR1cm4gTlVMTDsK IAotCS8qCi0JICogU2VwYXJhdGUgb3V0IHRoZSBXSEVSRSBjbGF1c2UuICAoV2UgY291bGQg dGhlb3JldGljYWxseSBhbHNvIHJlbW92ZQotCSAqIHRvcC1sZXZlbCBwbGFpbiBKT0lOL09O IGNsYXVzZXMsIGJ1dCBpdCdzIHByb2JhYmx5IG5vdCB3b3J0aCB0aGUKLQkgKiB0cm91Ymxl LikKLQkgKi8KLQl3aGVyZUNsYXVzZSA9IHN1YnNlbGVjdC0+am9pbnRyZWUtPnF1YWxzOwot CXN1YnNlbGVjdC0+am9pbnRyZWUtPnF1YWxzID0gTlVMTDsKKwlpZiAoc3Vic2VsZWN0LT5q b2ludHJlZS0+cXVhbHMpCisJCWFsbF9jbGF1c2VzID0gbGFwcGVuZChhbGxfY2xhdXNlcywg c3Vic2VsZWN0LT5qb2ludHJlZS0+cXVhbHMpOwogCi0JLyoKLQkgKiBUaGUgcmVzdCBvZiB0 aGUgc3ViLXNlbGVjdCBtdXN0IG5vdCByZWZlciB0byBhbnkgVmFycyBvZiB0aGUgcGFyZW50 Ci0JICogcXVlcnkuICAoVmFycyBvZiBoaWdoZXIgbGV2ZWxzIHNob3VsZCBiZSBva2F5LCB0 aG91Z2guKQotCSAqLwotCWlmIChjb250YWluX3ZhcnNfb2ZfbGV2ZWwoKE5vZGUgKikgc3Vi c2VsZWN0LCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKgotCSAqIE9uIHRoZSBvdGhlciBo YW5kLCB0aGUgV0hFUkUgY2xhdXNlIG11c3QgY29udGFpbiBzb21lIFZhcnMgb2YgdGhlCi0J ICogcGFyZW50IHF1ZXJ5LCBlbHNlIGl0J3Mgbm90IGdvbm5hIGJlIGEgam9pbi4KLQkgKi8K LQlpZiAoIWNvbnRhaW5fdmFyc19vZl9sZXZlbCh3aGVyZUNsYXVzZSwgMSkpCi0JCXJldHVy biBOVUxMOwotCi0JLyoKLQkgKiBXZSBkb24ndCByaXNrIG9wdGltaXppbmcgaWYgdGhlIFdI RVJFIGNsYXVzZSBpcyB2b2xhdGlsZSwgZWl0aGVyLgotCSAqLwotCWlmIChjb250YWluX3Zv bGF0aWxlX2Z1bmN0aW9ucyh3aGVyZUNsYXVzZSkpCi0JCXJldHVybiBOVUxMOworCXN1YnNl bGVjdC0+am9pbnRyZWUtPnF1YWxzID0gTlVMTDsKIAotCS8qCi0JICogVGhlIHN1YnF1ZXJ5 IG11c3QgaGF2ZSBhIG5vbmVtcHR5IGpvaW50cmVlLCBidXQgd2UgY2FuIG1ha2UgaXQgc28u Ci0JICovCi0JcmVwbGFjZV9lbXB0eV9qb2ludHJlZShzdWJzZWxlY3QpOworCS8qIEdhdGhl ciBhbGwgY2xhdXNlcyBpbiBtYWluIGxpc3QgZm9yIHRoZSBmdXJ0aGVyIGNvbnNpZGVyYXRp b24gKi8KKwlhbGxfY2xhdXNlcyA9IGxpc3RfY29uY2F0KGFsbF9jbGF1c2VzLCBzdWJzZWxl Y3QtPmpvaW50cmVlLT5mcm9tbGlzdCk7CiAKIAkvKgogCSAqIFByZXBhcmUgdG8gcHVsbCB1 cCB0aGUgc3ViLXNlbGVjdCBpbnRvIHRvcCByYW5nZSB0YWJsZS4KQEAgLTE0NTUsNyArMTQ0 Miw5MCBAQCBjb252ZXJ0X0VYSVNUU19zdWJsaW5rX3RvX2pvaW4oUGxhbm5lckluZm8gKnJv b3QsIFN1YkxpbmsgKnN1YmxpbmssCiAJICovCiAJcnRvZmZzZXQgPSBsaXN0X2xlbmd0aChw YXJzZS0+cnRhYmxlKTsKIAlPZmZzZXRWYXJOb2RlcygoTm9kZSAqKSBzdWJzZWxlY3QsIHJ0 b2Zmc2V0LCAwKTsKLQlPZmZzZXRWYXJOb2Rlcyh3aGVyZUNsYXVzZSwgcnRvZmZzZXQsIDAp OworCisJLyoKKwkgKiBXZSB3aWxsIGFibGUgdG8gcmVtb3ZlIHRvcC1sZXZlbCBwbGFpbiBK T0lOL09OIGNsYXVzZXMgaWYgdGhleSBhcmUgbm90IG91dGVyIGpvaW4uCisJICovCisJZm9y ZWFjaCAobGMsIGFsbF9jbGF1c2VzKQorCXsKKwkJTm9kZSAqamUgPSAoKE5vZGUgKikgbGZp cnN0KGxjKSk7CisJCWJvb2wgY29uc3RfdHlwZV9leHByID0gZmFsc2U7CisKKwkJd2hlcmVD bGF1c2UgPSBqZTsKKworCQlpZiAoSXNBKGplLCBSYW5nZVRibFJlZikpCisJCQlnb3RvIGVu ZDsKKworCQlpZiAoKElzQShqZSwgSm9pbkV4cHIpICYmICgoSm9pbkV4cHIgKilqZSktPmpv aW50eXBlICE9IEpPSU5fSU5ORVIpKQorCQkJZ290byBlbmQ7CisKKwkJaWYgKElzQShqZSwg Sm9pbkV4cHIpICYmICgoSm9pbkV4cHIgKilqZSktPnF1YWxzICE9IE5VTEwpCisJCQl3aGVy ZUNsYXVzZSA9ICgoSm9pbkV4cHIgKilqZSktPnF1YWxzOworCisJCWlmIChJc0Eod2hlcmVD bGF1c2UsIE9wRXhwcikgJiYKKwkJICAgKElzQShnZXRfcmlnaHRvcCh3aGVyZUNsYXVzZSks IENvbnN0KSB8fCBJc0EoZ2V0X2xlZnRvcCh3aGVyZUNsYXVzZSksIENvbnN0KSkpCisJCQlj b25zdF90eXBlX2V4cHIgPSB0cnVlOworCisJCS8qCisJCSogT24gdGhlIG90aGVyIGhhbmQs IHRoZSBXSEVSRSBjbGF1c2UgbXVzdCBjb250YWluIHNvbWUgVmFycyBvZiB0aGUKKwkJKiBw YXJlbnQgcXVlcnksIGVsc2UgaXQncyBub3QgZ29ubmEgYmUgYSBqb2luLgorCQkqLworCQlp ZiAoIWNvbnN0X3R5cGVfZXhwciAmJiAhY29udGFpbl92YXJzX29mX2xldmVsKHdoZXJlQ2xh dXNlLCAxKSkKKwkJCWdvdG8gZW5kOworCisJCS8qCisJCSogV2UgZG9uJ3QgcmlzayBvcHRp bWl6aW5nIGlmIHRoZSBXSEVSRSBjbGF1c2UgaXMgdm9sYXRpbGUsIGVpdGhlci4KKwkJKi8K KwkJaWYgKGNvbnRhaW5fdm9sYXRpbGVfZnVuY3Rpb25zKHdoZXJlQ2xhdXNlKSkKKwkJCWdv dG8gZW5kOworCisJCS8qCisJCSAqIEluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIGF0dGVtcHQs IHJlcGxhY2VzIGl0IHdpdGggdGhlIGNvcnJlY3QgY29uZGl0aW9uCisJCSAqLworCQlpZiAo SXNBKGplLCBKb2luRXhwcikpCisJCQkoKEpvaW5FeHByICopamUpLT5xdWFscyA9IChOb2Rl ICopIGNvbnN0X3ZhcjsKKworCQlpZighY29uc3RfdHlwZV9leHByIHx8IChjb25zdF90eXBl X2V4cHIgJiYgY29udGFpbl92YXJzX29mX2xldmVsKHdoZXJlQ2xhdXNlLCAxKSkpCisJCXsK KwkJCU9mZnNldFZhck5vZGVzKHdoZXJlQ2xhdXNlLCBydG9mZnNldCwgMCk7CisJCQlJbmNy ZW1lbnRWYXJTdWJsZXZlbHNVcCh3aGVyZUNsYXVzZSwgLTEsIDEpOworCQl9CisKKwkJY2xh dXNlcyA9IGxhcHBlbmQoY2xhdXNlcywgd2hlcmVDbGF1c2UpOworCisJCWZpcnN0X2VsZW0g PSBmYWxzZTsKKwkJc3Vic2VsZWN0LT5qb2ludHJlZS0+ZnJvbWxpc3QgPSBsaXN0X2RlbGV0 ZV9wdHIoc3Vic2VsZWN0LT5qb2ludHJlZS0+ZnJvbWxpc3QsIGxjKTsKKworCQllbmQ6CisJ CQlpZiAoZmlyc3RfZWxlbSkKKwkJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsaXN0X2ZyZWUo YWxsX2NsYXVzZXMpOworCisJLyogV2UgZG9uJ3QgaGF2ZSBhbnkgY2x1c2VzIGZvciBwdWxs LXVwIGNyZWF0aW9uICovCisJaWYgKGNsYXVzZXMgPT0gTklMKQorCQlyZXR1cm4gTlVMTDsK KwllbHNlCisJCS8qIFdlIGNhbiBlYXNpbHkgY29tYmluZSBjbGF1c2VzIHRocm91Z2ggQU5E IG9wZXJhdG9yIGJlY2F1c2UgdGhleSBhcmUgaW5kZXBlbmRlbnQgKi8KKwkJd2hlcmVDbGF1 c2UgPSBsaXN0X2xlbmd0aChjbGF1c2VzKSA+IDEgPworCQkJCQkJCShOb2RlICopIG1ha2VC b29sRXhwcihBTkRfRVhQUiwgY2xhdXNlcywgLTEpIDoKKwkJCQkJCQkoTm9kZSAqKSBsaW5p dGlhbChjbGF1c2VzKTsKKworCisJc3Vic2VsZWN0LT5qb2ludHJlZS0+cXVhbHMgPSBOVUxM OworCisJLyoKKwkgKiBUaGUgcmVzdCBvZiB0aGUgc3ViLXNlbGVjdCBtdXN0IG5vdCByZWZl ciB0byBhbnkgVmFycyBvZiB0aGUgcGFyZW50CisJICogcXVlcnkuICAoVmFycyBvZiBoaWdo ZXIgbGV2ZWxzIHNob3VsZCBiZSBva2F5LCB0aG91Z2guKQorCSAqLworCWlmIChjb250YWlu X3ZhcnNfb2ZfbGV2ZWwoKE5vZGUgKikgc3Vic2VsZWN0LCAxKSkKKwkJcmV0dXJuIE5VTEw7 CisKKwkvKgorCSAqIFRoZSBzdWJxdWVyeSBtdXN0IGhhdmUgYSBub25lbXB0eSBqb2ludHJl ZSwgYnV0IHdlIGNhbiBtYWtlIGl0IHNvLgorCSAqLworCXJlcGxhY2VfZW1wdHlfam9pbnRy ZWUoc3Vic2VsZWN0KTsKIAogCS8qCiAJICogVXBwZXItbGV2ZWwgdmFycyBpbiBzdWJxdWVy eSB3aWxsIG5vdyBiZSBvbmUgbGV2ZWwgY2xvc2VyIHRvIHRoZWlyCkBAIC0xNDYzLDcgKzE1 MzMsNiBAQCBjb252ZXJ0X0VYSVNUU19zdWJsaW5rX3RvX2pvaW4oUGxhbm5lckluZm8gKnJv b3QsIFN1YkxpbmsgKnN1YmxpbmssCiAJICogYmVjb21lcyBsZXZlbCB6ZXJvLgogCSAqLwog CUluY3JlbWVudFZhclN1YmxldmVsc1VwKChOb2RlICopIHN1YnNlbGVjdCwgLTEsIDEpOwot CUluY3JlbWVudFZhclN1YmxldmVsc1VwKHdoZXJlQ2xhdXNlLCAtMSwgMSk7CiAKIAkvKgog CSAqIE5vdyB0aGF0IHRoZSBXSEVSRSBjbGF1c2UgaXMgYWRqdXN0ZWQgdG8gbWF0Y2ggdGhl IHBhcmVudCBxdWVyeQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9z dWJzZWxlY3Qub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdWJzZWxlY3Qub3V0 CmluZGV4IGViYzU0NWUyNDYxLi5mNmRiZTk5ZGY5MCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9zdWJzZWxlY3Qub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvc3Vic2VsZWN0Lm91dApAQCAtODEyLDYgKzgxMiwyMzggQEAgd2hlcmUgZXhp c3RzICgKICAgICAgIGZyb20gdGV4dF90YmwgKSBzcwogICB3aGVyZSByb2FkLm5hbWUgPSBz cy5mMSApOwogcm9sbGJhY2s7CistLSBUZXN0IGNhc2UgZm9yIGV4aXN0IHN1Ymxpbmsgd2hl cmUgd2UgY2FuIGNvbnNpZGVyIHNvbWUgdW5kZXBlbmRlbnQgZXhwcmVzc2lvbgorLS0gd2l0 aCBvdXRlciBsaW5rCistLQorRVhQTEFJTiAoQU5BTFlaRSwgQ09TVFMgT0ZGLCBTVU1NQVJZ IE9GRiwgVElNSU5HIE9GRiwgQlVGRkVSUyBPRkYpCisgU0VMRUNUIDEKKyAgIEZST00gdGEK KyAgV0hFUkUgRVhJU1RTIChTRUxFQ1QgMQorICAgICAgICAgICAgICAgICAgRlJPTSB0Ygor ICAgICAgICAgICAgICAgICAgSk9JTiB0YworICAgICAgICAgICAgICAgICAgICBPTiB0YS5p ZCA9IHRiLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBOZXN0ZWQgTG9vcCBTZW1pIEpvaW4gKGFjdHVhbCByb3dzPTIgbG9vcHM9MSkKKyAgIC0+ ICBTZXEgU2NhbiBvbiB0YSAoYWN0dWFsIHJvd3M9MiBsb29wcz0xKQorICAgLT4gIE5lc3Rl ZCBMb29wIChhY3R1YWwgcm93cz0xIGxvb3BzPTIpCisgICAgICAgICAtPiAgSW5kZXggT25s eSBTY2FuIHVzaW5nIHRjX3BrZXkgb24gdGMgKGFjdHVhbCByb3dzPTEgbG9vcHM9MikKKyAg ICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHRhLmlkKQorICAgICAgICAgICAgICAg SGVhcCBGZXRjaGVzOiAyCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGIgKGFjdHVhbCBy b3dzPTEgbG9vcHM9MikKKyg3IHJvd3MpCisKK0VYUExBSU4gKEFOQUxZWkUsIENPU1RTIE9G RiwgU1VNTUFSWSBPRkYsIFRJTUlORyBPRkYsIEJVRkZFUlMgT0ZGKQorIFNFTEVDVCAxCisg ICBGUk9NIHRhCisgIFdIRVJFIE5PVCBFWElTVFMgKFNFTEVDVCAxCisgICAgICAgICAgICAg ICAgICBGUk9NIHRiCisgICAgICAgICAgICAgICAgICBKT0lOIHRjCisgICAgICAgICAgICAg ICAgICAgIE9OIHRhLmlkID0gdGIuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIEFudGkgSm9pbiAoYWN0dWFsIHJvd3M9MCBs b29wcz0xKQorICAgLT4gIFNlcSBTY2FuIG9uIHRhIChhY3R1YWwgcm93cz0yIGxvb3BzPTEp CisgICAtPiAgTmVzdGVkIExvb3AgKGFjdHVhbCByb3dzPTEgbG9vcHM9MikKKyAgICAgICAg IC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgdGNfcGtleSBvbiB0YyAoYWN0dWFsIHJvd3M9 MSBsb29wcz0yKQorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGlkID0gdGEuaWQpCisg ICAgICAgICAgICAgICBIZWFwIEZldGNoZXM6IDIKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBv biB0YiAoYWN0dWFsIHJvd3M9MSBsb29wcz0yKQorKDcgcm93cykKKworRVhQTEFJTiAoQU5B TFlaRSwgQ09TVFMgT0ZGLCBTVU1NQVJZIE9GRiwgVElNSU5HIE9GRiwgQlVGRkVSUyBPRkYp CisgU0VMRUNUIDEKKyAgIEZST00gdGEKKyAgV0hFUkUgRVhJU1RTIChTRUxFQ1QgMQorICAg ICAgICAgICAgICAgICAgRlJPTSB0YgorICAgICAgICAgICAgICAgICAgSk9JTiB0YworICAg ICAgICAgICAgICAgICAgICBPTiB0YS5pZCA9IHRjLmlkKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBTZW1pIEpvaW4gKGFjdHVh bCByb3dzPTIgbG9vcHM9MSkKKyAgIC0+ICBTZXEgU2NhbiBvbiB0YSAoYWN0dWFsIHJvd3M9 MiBsb29wcz0xKQorICAgLT4gIE5lc3RlZCBMb29wIChhY3R1YWwgcm93cz0xIGxvb3BzPTIp CisgICAgICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHRiX3BrZXkgb24gdGIgKGFj dHVhbCByb3dzPTEgbG9vcHM9MikKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9 IHRhLmlkKQorICAgICAgICAgICAgICAgSGVhcCBGZXRjaGVzOiAyCisgICAgICAgICAtPiAg U2VxIFNjYW4gb24gdGMgKGFjdHVhbCByb3dzPTEgbG9vcHM9MikKKyg3IHJvd3MpCisKK0VY UExBSU4gKEFOQUxZWkUsIENPU1RTIE9GRiwgU1VNTUFSWSBPRkYsIFRJTUlORyBPRkYsIEJV RkZFUlMgT0ZGKQorIFNFTEVDVCAxCisgICBGUk9NIHRhCisgIFdIRVJFIE5PVCBFWElTVFMg KFNFTEVDVCAxCisgICAgICAgICAgICAgICAgICBGUk9NIHRiCisgICAgICAgICAgICAgICAg ICBKT0lOIHRjCisgICAgICAgICAgICAgICAgICAgIE9OIHRhLmlkID0gdGIuaWQpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIEFu dGkgSm9pbiAoYWN0dWFsIHJvd3M9MCBsb29wcz0xKQorICAgLT4gIFNlcSBTY2FuIG9uIHRh IChhY3R1YWwgcm93cz0yIGxvb3BzPTEpCisgICAtPiAgTmVzdGVkIExvb3AgKGFjdHVhbCBy b3dzPTEgbG9vcHM9MikKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgdGNf cGtleSBvbiB0YyAoYWN0dWFsIHJvd3M9MSBsb29wcz0yKQorICAgICAgICAgICAgICAgSW5k ZXggQ29uZDogKGlkID0gdGEuaWQpCisgICAgICAgICAgICAgICBIZWFwIEZldGNoZXM6IDIK KyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YiAoYWN0dWFsIHJvd3M9MSBsb29wcz0yKQor KDcgcm93cykKKworLS0gSm9pbiBjb21wb3VuZCBleHByZXNzaW9uCitFWFBMQUlOIChBTkFM WVpFLCBDT1NUUyBPRkYsIFNVTU1BUlkgT0ZGLCBUSU1JTkcgT0ZGLCBCVUZGRVJTIE9GRikK KyBTRUxFQ1QgMQorICAgRlJPTSB0YQorICBXSEVSRSBFWElTVFMgKFNFTEVDVCAxCisgICAg ICAgICAgICAgICAgICBGUk9NIHRiCisgICAgICAgICAgICAgICAgICBKT0lOIHRjCisgICAg ICAgICAgICAgICAgICAgIE9OIHRhLmlkID0gdGMuaWQgYW5kCisgICAgICAgICAgICAgICAg ICAgICAgIHRhLmlkID0gdGIuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggUmlnaHQg U2VtaSBKb2luIChhY3R1YWwgcm93cz0yIGxvb3BzPTEpCisgICBIYXNoIENvbmQ6ICh0Yi5p ZCA9IHRhLmlkKQorICAgLT4gIEhhc2ggSm9pbiAoYWN0dWFsIHJvd3M9MiBsb29wcz0xKQor ICAgICAgICAgSGFzaCBDb25kOiAodGIuaWQgPSB0Yy5pZCkKKyAgICAgICAgIC0+ICBTZXEg U2NhbiBvbiB0YiAoYWN0dWFsIHJvd3M9NCBsb29wcz0xKQorICAgICAgICAgLT4gIEhhc2gg KGFjdHVhbCByb3dzPTIgbG9vcHM9MSkKKyAgICAgICAgICAgICAgIEJ1Y2tldHM6IDQwOTYg IEJhdGNoZXM6IDEgIE1lbW9yeSBVc2FnZTogMzNrQgorICAgICAgICAgICAgICAgLT4gIFNl cSBTY2FuIG9uIHRjIChhY3R1YWwgcm93cz0yIGxvb3BzPTEpCisgICAtPiAgSGFzaCAoYWN0 dWFsIHJvd3M9MiBsb29wcz0xKQorICAgICAgICAgQnVja2V0czogNDA5NiAgQmF0Y2hlczog MSAgTWVtb3J5IFVzYWdlOiAzM2tCCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGEgKGFj dHVhbCByb3dzPTIgbG9vcHM9MSkKKygxMSByb3dzKQorCitFWFBMQUlOIChBTkFMWVpFLCBD T1NUUyBPRkYsIFNVTU1BUlkgT0ZGLCBUSU1JTkcgT0ZGLCBCVUZGRVJTIE9GRikKKyBTRUxF Q1QgMQorICAgRlJPTSB0YQorICBXSEVSRSBOT1QgRVhJU1RTIChTRUxFQ1QgMQorICAgICAg ICAgICAgICAgICAgRlJPTSB0YgorICAgICAgICAgICAgICAgICAgSk9JTiB0YworICAgICAg ICAgICAgICAgICAgICBPTiB0YS5pZCA9IHRjLmlkIGFuZAorICAgICAgICAgICAgICAgICAg ICAgICB0YS5pZCA9IHRiLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBR VUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBBbnRpIEpvaW4gKGFjdHVhbCByb3dzPTAgbG9vcHM9 MSkKKyAgIC0+ICBTZXEgU2NhbiBvbiB0YSAoYWN0dWFsIHJvd3M9MiBsb29wcz0xKQorICAg LT4gIE5lc3RlZCBMb29wIChhY3R1YWwgcm93cz0xIGxvb3BzPTIpCisgICAgICAgICAtPiAg SW5kZXggT25seSBTY2FuIHVzaW5nIHRiX3BrZXkgb24gdGIgKGFjdHVhbCByb3dzPTEgbG9v cHM9MikKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHRhLmlkKQorICAgICAg ICAgICAgICAgSGVhcCBGZXRjaGVzOiAyCisgICAgICAgICAtPiAgSW5kZXggT25seSBTY2Fu IHVzaW5nIHRjX3BrZXkgb24gdGMgKGFjdHVhbCByb3dzPTEgbG9vcHM9MikKKyAgICAgICAg ICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHRhLmlkKQorICAgICAgICAgICAgICAgSGVhcCBG ZXRjaGVzOiAyCisoOSByb3dzKQorCitFWFBMQUlOIChBTkFMWVpFLCBDT1NUUyBPRkYsIFNV TU1BUlkgT0ZGLCBUSU1JTkcgT0ZGLCBCVUZGRVJTIE9GRikKKyBTRUxFQ1QgMQorICAgRlJP TSB0YQorICBXSEVSRSBFWElTVFMgKFNFTEVDVCAxCisgICAgICAgICAgICAgICAgICBGUk9N IHRiCisgICAgICAgICAgICAgICAgICBKT0lOIHRjCisgICAgICAgICAgICAgICAgICAgIE9O IHRhLmlkID0gdGMuaWQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgIHRhLmlkID0gdGIu aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggUmlnaHQgU2VtaSBKb2luIChhY3R1YWwg cm93cz0yIGxvb3BzPTEpCisgICBIYXNoIENvbmQ6ICh0Yi5pZCA9IHRhLmlkKQorICAgLT4g IEhhc2ggSm9pbiAoYWN0dWFsIHJvd3M9MiBsb29wcz0xKQorICAgICAgICAgSGFzaCBDb25k OiAodGIuaWQgPSB0Yy5pZCkKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YiAoYWN0dWFs IHJvd3M9NCBsb29wcz0xKQorICAgICAgICAgLT4gIEhhc2ggKGFjdHVhbCByb3dzPTIgbG9v cHM9MSkKKyAgICAgICAgICAgICAgIEJ1Y2tldHM6IDQwOTYgIEJhdGNoZXM6IDEgIE1lbW9y eSBVc2FnZTogMzNrQgorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRjIChhY3R1 YWwgcm93cz0yIGxvb3BzPTEpCisgICAtPiAgSGFzaCAoYWN0dWFsIHJvd3M9MiBsb29wcz0x KQorICAgICAgICAgQnVja2V0czogNDA5NiAgQmF0Y2hlczogMSAgTWVtb3J5IFVzYWdlOiAz M2tCCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGEgKGFjdHVhbCByb3dzPTIgbG9vcHM9 MSkKKygxMSByb3dzKQorCistLSBDb21wb3VuZCBleHByZXNzaW9uIHdpdGggY29uc3QgdHlw ZQorRVhQTEFJTiAoQU5BTFlaRSwgQ09TVFMgT0ZGLCBTVU1NQVJZIE9GRiwgVElNSU5HIE9G RiwgQlVGRkVSUyBPRkYpCisgU0VMRUNUIDEKKyAgIEZST00gdGEKKyAgV0hFUkUgRVhJU1RT IChTRUxFQ1QgMQorICAgICAgICAgICAgICAgICAgRlJPTSB0YgorICAgICAgICAgICAgICAg ICAgSk9JTiB0YworICAgICAgICAgICAgICAgICAgICBPTiB0YS5pZCA9IHRjLmlkIGFuZAor ICAgICAgICAgICAgICAgICAgICAgICB0YS5pZCA9IDEpOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIFNlbWkgSm9pbiAoYWN0dWFs IHJvd3M9MSBsb29wcz0xKQorICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0YV9wa2V5 IG9uIHRhIChhY3R1YWwgcm93cz0xIGxvb3BzPTEpCisgICAgICAgICBJbmRleCBDb25kOiAo aWQgPSAxKQorICAgICAgICAgSGVhcCBGZXRjaGVzOiAxCisgICAtPiAgTmVzdGVkIExvb3Ag KGFjdHVhbCByb3dzPTEgbG9vcHM9MSkKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4g dXNpbmcgdGJfcGtleSBvbiB0YiAoYWN0dWFsIHJvd3M9MSBsb29wcz0xKQorICAgICAgICAg ICAgICAgSW5kZXggQ29uZDogKGlkID0gMSkKKyAgICAgICAgICAgICAgIEhlYXAgRmV0Y2hl czogMQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRjIChhY3R1YWwgcm93cz0xIGxvb3Bz PTEpCisoOSByb3dzKQorCitFWFBMQUlOIChBTkFMWVpFLCBDT1NUUyBPRkYsIFNVTU1BUlkg T0ZGLCBUSU1JTkcgT0ZGLCBCVUZGRVJTIE9GRikKKyBTRUxFQ1QgMQorICAgRlJPTSB0YQor ICBXSEVSRSBOT1QgRVhJU1RTIChTRUxFQ1QgMQorICAgICAgICAgICAgICAgICAgRlJPTSB0 YgorICAgICAgICAgICAgICAgICAgSk9JTiB0YworICAgICAgICAgICAgICAgICAgICBPTiB0 YS5pZCA9IHRjLmlkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICB0YS5pZCA9IDEpOwor ICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIEhhc2ggUmlnaHQgQW50aSBKb2luIChhY3R1YWwgcm93cz0xIGxvb3Bz PTEpCisgICBIYXNoIENvbmQ6ICh0Yi5pZCA9IHRhLmlkKQorICAgSm9pbiBGaWx0ZXI6ICh0 YS5pZCA9IDEpCisgICBSb3dzIFJlbW92ZWQgYnkgSm9pbiBGaWx0ZXI6IDIKKyAgIC0+ICBO ZXN0ZWQgTG9vcCAoYWN0dWFsIHJvd3M9OCBsb29wcz0xKQorICAgICAgICAgLT4gIFNlcSBT Y2FuIG9uIHRiIChhY3R1YWwgcm93cz00IGxvb3BzPTEpCisgICAgICAgICAtPiAgTWF0ZXJp YWxpemUgKGFjdHVhbCByb3dzPTIgbG9vcHM9NCkKKyAgICAgICAgICAgICAgIFN0b3JhZ2U6 IE1lbW9yeSAgTWF4aW11bSBTdG9yYWdlOiAxN2tCCisgICAgICAgICAgICAgICAtPiAgU2Vx IFNjYW4gb24gdGMgKGFjdHVhbCByb3dzPTIgbG9vcHM9MSkKKyAgIC0+ICBIYXNoIChhY3R1 YWwgcm93cz0yIGxvb3BzPTEpCisgICAgICAgICBCdWNrZXRzOiA0MDk2ICBCYXRjaGVzOiAx ICBNZW1vcnkgVXNhZ2U6IDMza0IKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YSAoYWN0 dWFsIHJvd3M9MiBsb29wcz0xKQorKDEyIHJvd3MpCisKK0VYUExBSU4gKEFOQUxZWkUsIENP U1RTIE9GRiwgU1VNTUFSWSBPRkYsIFRJTUlORyBPRkYsIEJVRkZFUlMgT0ZGKQorIFNFTEVD VCAxCisgICBGUk9NIHRhCisgIFdIRVJFIEVYSVNUUyAoU0VMRUNUIDEKKyAgICAgICAgICAg ICAgICAgIEZST00gdGIKKyAgICAgICAgICAgICAgICAgIEpPSU4gdGMKKyAgICAgICAgICAg ICAgICAgICAgT04gdGIuaWQgPSAxIGFuZAorICAgICAgICAgICAgICAgICAgICAgICB0YS5p ZCA9IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5l c3RlZCBMb29wIFNlbWkgSm9pbiAoYWN0dWFsIHJvd3M9MSBsb29wcz0xKQorICAgLT4gIElu ZGV4IE9ubHkgU2NhbiB1c2luZyB0YV9wa2V5IG9uIHRhIChhY3R1YWwgcm93cz0xIGxvb3Bz PTEpCisgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSAxKQorICAgICAgICAgSGVhcCBGZXRj aGVzOiAxCisgICAtPiAgTmVzdGVkIExvb3AgKGFjdHVhbCByb3dzPTEgbG9vcHM9MSkKKyAg ICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgdGNfcGtleSBvbiB0YyAoYWN0dWFs IHJvd3M9MSBsb29wcz0xKQorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGlkID0gMSkK KyAgICAgICAgICAgICAgIEhlYXAgRmV0Y2hlczogMQorICAgICAgICAgLT4gIFNlcSBTY2Fu IG9uIHRiIChhY3R1YWwgcm93cz0xIGxvb3BzPTEpCisoOSByb3dzKQorCistLSBEaXNhYmxl ZCBwdWxsIHVwIGJlY2F1c2UgaXQgaXMgYXBwbGNhcGFibGUgZm9yIElOTkVSIEpPSU4gY29u bmVjdGlvbgorRVhQTEFJTiAoQU5BTFlaRSwgQ09TVFMgT0ZGLCBTVU1NQVJZIE9GRiwgVElN SU5HIE9GRiwgQlVGRkVSUyBPRkYpCisgU0VMRUNUIDEKKyAgIEZST00gdGEKKyAgV0hFUkUg RVhJU1RTIChTRUxFQ1QgMQorICAgICAgICAgICAgICAgICAgRlJPTSB0YgorICAgICAgICAg ICAgICAgICAgUklHSFQgSk9JTiB0YworICAgICAgICAgICAgICAgICAgICBPTiB0YS5pZCA9 IHRjLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gdGEgKGFjdHVhbCByb3dz PTIgbG9vcHM9MSkKKyAgIEZpbHRlcjogRVhJU1RTKFN1YlBsYW4gMSkKKyAgIFN1YlBsYW4g MQorICAgICAtPiAgTmVzdGVkIExvb3AgTGVmdCBKb2luIChhY3R1YWwgcm93cz0xIGxvb3Bz PTIpCisgICAgICAgICAgIEpvaW4gRmlsdGVyOiAodGEuaWQgPSB0Yy5pZCkKKyAgICAgICAg ICAgUm93cyBSZW1vdmVkIGJ5IEpvaW4gRmlsdGVyOiAyCisgICAgICAgICAgIC0+ICBTZXEg U2NhbiBvbiB0YyAoYWN0dWFsIHJvd3M9MSBsb29wcz0yKQorICAgICAgICAgICAtPiAgTWF0 ZXJpYWxpemUgKGFjdHVhbCByb3dzPTIgbG9vcHM9MikKKyAgICAgICAgICAgICAgICAgU3Rv cmFnZTogTWVtb3J5ICBNYXhpbXVtIFN0b3JhZ2U6IDE3a0IKKyAgICAgICAgICAgICAgICAg LT4gIFNlcSBTY2FuIG9uIHRiIChhY3R1YWwgcm93cz00IGxvb3BzPTEpCisoMTAgcm93cykK KwogLS0KIC0tIFRlc3QgY2FzZSBmb3Igc3VibGlua3MgcHVzaGVkIGRvd24gaW50byBzdWJz ZWxlY3RzIHZpYSBqb2luIGFsaWFzIGV4cGFuc2lvbgogLS0KZGlmZiAtLWdpdCBhL3NyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL3N1YnNlbGVjdC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9z dWJzZWxlY3Quc3FsCmluZGV4IDZlZDM2MzZhOWU0Li4xM2Q3MDY2YTgyMyAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3Vic2VsZWN0LnNxbAorKysgYi9zcmMvdGVzdC9y ZWdyZXNzL3NxbC9zdWJzZWxlY3Quc3FsCkBAIC00MzksNiArNDM5LDEwNSBAQCB3aGVyZSBl eGlzdHMgKAogCiByb2xsYmFjazsKIAorLS0gVGVzdCBjYXNlIGZvciBleGlzdCBzdWJsaW5r IHdoZXJlIHdlIGNhbiBjb25zaWRlciBzb21lIHVuZGVwZW5kZW50IGV4cHJlc3Npb24KKy0t IHdpdGggb3V0ZXIgbGluaworLS0KK0VYUExBSU4gKEFOQUxZWkUsIENPU1RTIE9GRiwgU1VN TUFSWSBPRkYsIFRJTUlORyBPRkYsIEJVRkZFUlMgT0ZGKQorIFNFTEVDVCAxCisgICBGUk9N IHRhCisgIFdIRVJFIEVYSVNUUyAoU0VMRUNUIDEKKyAgICAgICAgICAgICAgICAgIEZST00g dGIKKyAgICAgICAgICAgICAgICAgIEpPSU4gdGMKKyAgICAgICAgICAgICAgICAgICAgT04g dGEuaWQgPSB0Yi5pZCk7CisKK0VYUExBSU4gKEFOQUxZWkUsIENPU1RTIE9GRiwgU1VNTUFS WSBPRkYsIFRJTUlORyBPRkYsIEJVRkZFUlMgT0ZGKQorIFNFTEVDVCAxCisgICBGUk9NIHRh CisgIFdIRVJFIE5PVCBFWElTVFMgKFNFTEVDVCAxCisgICAgICAgICAgICAgICAgICBGUk9N IHRiCisgICAgICAgICAgICAgICAgICBKT0lOIHRjCisgICAgICAgICAgICAgICAgICAgIE9O IHRhLmlkID0gdGIuaWQpOworCitFWFBMQUlOIChBTkFMWVpFLCBDT1NUUyBPRkYsIFNVTU1B UlkgT0ZGLCBUSU1JTkcgT0ZGLCBCVUZGRVJTIE9GRikKKyBTRUxFQ1QgMQorICAgRlJPTSB0 YQorICBXSEVSRSBFWElTVFMgKFNFTEVDVCAxCisgICAgICAgICAgICAgICAgICBGUk9NIHRi CisgICAgICAgICAgICAgICAgICBKT0lOIHRjCisgICAgICAgICAgICAgICAgICAgIE9OIHRh LmlkID0gdGMuaWQpOworCitFWFBMQUlOIChBTkFMWVpFLCBDT1NUUyBPRkYsIFNVTU1BUlkg T0ZGLCBUSU1JTkcgT0ZGLCBCVUZGRVJTIE9GRikKKyBTRUxFQ1QgMQorICAgRlJPTSB0YQor ICBXSEVSRSBOT1QgRVhJU1RTIChTRUxFQ1QgMQorICAgICAgICAgICAgICAgICAgRlJPTSB0 YgorICAgICAgICAgICAgICAgICAgSk9JTiB0YworICAgICAgICAgICAgICAgICAgICBPTiB0 YS5pZCA9IHRiLmlkKTsKKworLS0gSm9pbiBjb21wb3VuZCBleHByZXNzaW9uCitFWFBMQUlO IChBTkFMWVpFLCBDT1NUUyBPRkYsIFNVTU1BUlkgT0ZGLCBUSU1JTkcgT0ZGLCBCVUZGRVJT IE9GRikKKyBTRUxFQ1QgMQorICAgRlJPTSB0YQorICBXSEVSRSBFWElTVFMgKFNFTEVDVCAx CisgICAgICAgICAgICAgICAgICBGUk9NIHRiCisgICAgICAgICAgICAgICAgICBKT0lOIHRj CisgICAgICAgICAgICAgICAgICAgIE9OIHRhLmlkID0gdGMuaWQgYW5kCisgICAgICAgICAg ICAgICAgICAgICAgIHRhLmlkID0gdGIuaWQpOworCitFWFBMQUlOIChBTkFMWVpFLCBDT1NU UyBPRkYsIFNVTU1BUlkgT0ZGLCBUSU1JTkcgT0ZGLCBCVUZGRVJTIE9GRikKKyBTRUxFQ1Qg MQorICAgRlJPTSB0YQorICBXSEVSRSBOT1QgRVhJU1RTIChTRUxFQ1QgMQorICAgICAgICAg ICAgICAgICAgRlJPTSB0YgorICAgICAgICAgICAgICAgICAgSk9JTiB0YworICAgICAgICAg ICAgICAgICAgICBPTiB0YS5pZCA9IHRjLmlkIGFuZAorICAgICAgICAgICAgICAgICAgICAg ICB0YS5pZCA9IHRiLmlkKTsKKworRVhQTEFJTiAoQU5BTFlaRSwgQ09TVFMgT0ZGLCBTVU1N QVJZIE9GRiwgVElNSU5HIE9GRiwgQlVGRkVSUyBPRkYpCisgU0VMRUNUIDEKKyAgIEZST00g dGEKKyAgV0hFUkUgRVhJU1RTIChTRUxFQ1QgMQorICAgICAgICAgICAgICAgICAgRlJPTSB0 YgorICAgICAgICAgICAgICAgICAgSk9JTiB0YworICAgICAgICAgICAgICAgICAgICBPTiB0 YS5pZCA9IHRjLmlkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICB0YS5pZCA9IHRiLmlk KTsKKworLS0gQ29tcG91bmQgZXhwcmVzc2lvbiB3aXRoIGNvbnN0IHR5cGUKK0VYUExBSU4g KEFOQUxZWkUsIENPU1RTIE9GRiwgU1VNTUFSWSBPRkYsIFRJTUlORyBPRkYsIEJVRkZFUlMg T0ZGKQorIFNFTEVDVCAxCisgICBGUk9NIHRhCisgIFdIRVJFIEVYSVNUUyAoU0VMRUNUIDEK KyAgICAgICAgICAgICAgICAgIEZST00gdGIKKyAgICAgICAgICAgICAgICAgIEpPSU4gdGMK KyAgICAgICAgICAgICAgICAgICAgT04gdGEuaWQgPSB0Yy5pZCBhbmQKKyAgICAgICAgICAg ICAgICAgICAgICAgdGEuaWQgPSAxKTsKKworRVhQTEFJTiAoQU5BTFlaRSwgQ09TVFMgT0ZG LCBTVU1NQVJZIE9GRiwgVElNSU5HIE9GRiwgQlVGRkVSUyBPRkYpCisgU0VMRUNUIDEKKyAg IEZST00gdGEKKyAgV0hFUkUgTk9UIEVYSVNUUyAoU0VMRUNUIDEKKyAgICAgICAgICAgICAg ICAgIEZST00gdGIKKyAgICAgICAgICAgICAgICAgIEpPSU4gdGMKKyAgICAgICAgICAgICAg ICAgICAgT04gdGEuaWQgPSB0Yy5pZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgdGEu aWQgPSAxKTsKKworRVhQTEFJTiAoQU5BTFlaRSwgQ09TVFMgT0ZGLCBTVU1NQVJZIE9GRiwg VElNSU5HIE9GRiwgQlVGRkVSUyBPRkYpCisgU0VMRUNUIDEKKyAgIEZST00gdGEKKyAgV0hF UkUgRVhJU1RTIChTRUxFQ1QgMQorICAgICAgICAgICAgICAgICAgRlJPTSB0YgorICAgICAg ICAgICAgICAgICAgSk9JTiB0YworICAgICAgICAgICAgICAgICAgICBPTiB0Yi5pZCA9IDEg YW5kCisgICAgICAgICAgICAgICAgICAgICAgIHRhLmlkID0gMSk7CistLSBEaXNhYmxlZCBw dWxsIHVwIGJlY2F1c2UgaXQgaXMgYXBwbGNhcGFibGUgZm9yIElOTkVSIEpPSU4gY29ubmVj dGlvbgorRVhQTEFJTiAoQU5BTFlaRSwgQ09TVFMgT0ZGLCBTVU1NQVJZIE9GRiwgVElNSU5H IE9GRiwgQlVGRkVSUyBPRkYpCisgU0VMRUNUIDEKKyAgIEZST00gdGEKKyAgV0hFUkUgRVhJ U1RTIChTRUxFQ1QgMQorICAgICAgICAgICAgICAgICAgRlJPTSB0YgorICAgICAgICAgICAg ICAgICAgUklHSFQgSk9JTiB0YworICAgICAgICAgICAgICAgICAgICBPTiB0YS5pZCA9IHRj LmlkKTsKKwogLS0KIC0tIFRlc3QgY2FzZSBmb3Igc3VibGlua3MgcHVzaGVkIGRvd24gaW50 byBzdWJzZWxlY3RzIHZpYSBqb2luIGFsaWFzIGV4cGFuc2lvbgogLS0KLS0gCjIuMzQuMQoK --------------PBtjD3Pbfc5Utz6veTecv4Ji--