Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pH7Bo-0001Rv-T0 for pgsql-hackers@arkaria.postgresql.org; Sun, 15 Jan 2023 17:53:05 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1pH7Bn-0002vR-3c for pgsql-hackers@arkaria.postgresql.org; Sun, 15 Jan 2023 17:53:03 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pH7Bm-0002vH-B3 for pgsql-hackers@lists.postgresql.org; Sun, 15 Jan 2023 17:53:02 +0000 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1pH7Be-0005xY-Kt for pgsql-hackers@lists.postgresql.org; Sun, 15 Jan 2023 17:53:01 +0000 Received: by mail-pj1-x1029.google.com with SMTP id gz9-20020a17090b0ec900b002290bda1b07so4867051pjb.1 for ; Sun, 15 Jan 2023 09:52:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=PHHhqT3iT1/jOVmh4tP2OmmNlM4Vm/pMhrwc3jRKG/w=; b=eUOfd/z3d/lVOAQtBIL5ELg5UKUKDX07NldAc0a61rMdR4mhBvnU821Yy+blADNNqA XjicbMS7KFbsfRJ25vbfdkoYNZOKExB04xdfVw7nUXZKMCuqDswrjsPhpm+JqUwF7hxv e/X72SnGqB+2bQTe48G/HwQ3jV7b3To5SbsK2AcKcqdLSQymjmaSuZPuP+HH0phEiL85 bQ3Oi3k8EMnC7p8ZczetLbNFsXR15whBVJKZgd0PJRfm3EKFq+JzgMwi2f5VvBANy+HO qZgwkKwtk8c0YlW228u9qh6WWq4TQx5ueO5m6uOFjED9NcmNNnXnJz+mE/IaV282sTda kRDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=PHHhqT3iT1/jOVmh4tP2OmmNlM4Vm/pMhrwc3jRKG/w=; b=UvJgoSgMdOeUyiWYYEvy6Tle6QTczuXQXLhxUzcB8oXGprST4onRSldaNYroL44Evy fURESDzA8K/FefX3fN07YxRxB2aL5MrK0m5gHI5aJJsDARJ31dBHSaD2EHFP32c7psfU zCZfCROyjkNEwRqw7jQBsAeeWjb0y+9/R2dPxI427XSpJBY2TRZIwDyMxgcnEwB+zEOb JK07ES7aLKSiLkfb5wCwYS5yHN/qDp/0/eNDQRodyKRlsuepwSAVWAbeE+GtZr+luwSz OwO7uHzoVUiw5T+Fn4JZPWnLvdPJFJkQKPeBN2S61FiOdOaZrUVbI66u0PMEKtHbqGMW xw9Q== X-Gm-Message-State: AFqh2krG422Uq0HukoXZGfjcyGGGD4/iYWJr9xPYO+mcFc//LGuZbUt6 ixPeAPlSqiw3dVJLii39NrU= X-Google-Smtp-Source: AMrXdXvnHtntmV1cos8gkNrvfWqHXZ46Hq8XjJvUb5/P2bYptC9vP2/BEesQMMpX4XwTlefezE7vhg== X-Received: by 2002:a17:90b:3d0b:b0:229:7d9d:c47f with SMTP id pt11-20020a17090b3d0b00b002297d9dc47fmr296537pjb.41.1673805173323; Sun, 15 Jan 2023 09:52:53 -0800 (PST) Received: from [10.0.2.15] ([110.226.212.117]) by smtp.gmail.com with ESMTPSA id r60-20020a17090a43c200b002271b43e528sm11516916pjg.33.2023.01.15.09.52.51 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 15 Jan 2023 09:52:52 -0800 (PST) Content-Type: multipart/mixed; boundary="------------0wMcE35J1zLwDg2yaJYESCri" Message-ID: <4303947c-c313-ec43-d442-80c4c8e92490@gmail.com> Date: Sun, 15 Jan 2023 23:22:47 +0530 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: Re: Todo: Teach planner to evaluate multiple windows in the optimal order To: David Rowley Cc: pghackers , Vik Fearing References: <83d80853-a45c-d85c-68eb-59acfe7fb5fb@gmail.com> <2040c902-32b1-46c8-0b26-d3f43a16b9bb@gmail.com> <12f6ef19-e06e-8ea9-ad98-3fd92afb7f0b@gmail.com> <8d0b24ce-f8ba-cd63-82ae-be853b4067e8@gmail.com> <4ef7f947-526b-c4ec-f7a0-8b4586e693e4@gmail.com> <2f9f632d-3297-09dd-1d01-af3e0961c446@gmail.com> <7d5e8038-0417-2d5b-3db7-c96106bd4cb0@gmail.com> Content-Language: en-US From: Ankit Kumar Pandey 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. --------------0wMcE35J1zLwDg2yaJYESCri Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit > On 13/01/23 07:48, David Rowley wrote: > It would just care if the > pathkeys were present and return a list of pathkeys not contained so > that an incremental sort could be done only on the returned list and a > Unique on an empty returned list. In create_final_distinct_paths, presorted keys are determined from input_rel->pathlist & needed_pathkeys. Problem with input_rel->pathlist is that, for index node, useful_pathkeys is stored in input_rel->pathlist but this useful_pathkeys is determined from truncate_useless_pathkeys(index_pathkeys) which removes index_keys if ordering is different. Hence, input_rel->pathlist returns null for select distinct b,a from ab where a < 10; even if index is created on a. In order to tackle this, I have added index_pathkeys in indexpath node itself. Although I started this patch from master, I merged changes to window sort optimizations. In patched version: set enable_hashagg=0; set enable_seqscan=0; explain select distinct relname,relkind,count(*) over (partition by relkind) from pg_Class;                                               QUERY PLAN -------------------------------------------------------------------------------------------------------  Unique  (cost=10000000039.49..10000000063.73 rows=415 width=73)    ->  Incremental Sort  (cost=10000000039.49..10000000060.62 rows=415 width=73)          Sort Key: relkind, relname, (count(*) OVER (?))          Presorted Key: relkind          ->  WindowAgg  (cost=10000000034.20..10000000041.46 rows=415 width=73)                ->  Sort  (cost=10000000034.20..10000000035.23 rows=415 width=65)                      Sort Key: relkind                      ->  Seq Scan on pg_class  (cost=10000000000.00..10000000016.15 rows=415 width=65) (8 rows) explain select distinct b,a from ab where a < 10;                                     QUERY PLAN ----------------------------------------------------------------------------------  Unique  (cost=0.71..60.05 rows=611 width=8)    ->  Incremental Sort  (cost=0.71..55.55 rows=900 width=8)          Sort Key: a, b          Presorted Key: a          ->  Index Scan using ab_a_idx on ab  (cost=0.29..28.04 rows=900 width=8)                Index Cond: (a < 10) (6 rows) explain select distinct b,a, count(*) over (partition by a) from abcd order by a,b;                                              QUERY PLAN -----------------------------------------------------------------------------------------------------  Unique  (cost=10000021174.63..10000038095.75 rows=60 width=16)    ->  Incremental Sort  (cost=10000021174.63..10000036745.75 rows=180000 width=16)          Sort Key: a, b, (count(*) OVER (?))          Presorted Key: a, b          ->  WindowAgg  (cost=10000020948.87..10000024098.87 rows=180000 width=16)                ->  Sort  (cost=10000020948.87..10000021398.87 rows=180000 width=8)                      Sort Key: a, b                      ->  Seq Scan on abcd  (cost=10000000000.00..10000002773.00 rows=180000 width=8) (8 rows) explain select distinct a, b, count(*) over (partition by a,b,c) from abcd;                                               QUERY PLAN ------------------------------------------------------------------------------------------------------  Unique  (cost=10000021580.47..10000036629.31 rows=60 width=20)    ->  Incremental Sort  (cost=10000021580.47..10000035279.31 rows=180000 width=20)          Sort Key: a, b, c, (count(*) OVER (?))          Presorted Key: a, b, c          ->  WindowAgg  (cost=10000021561.37..10000025611.37 rows=180000 width=20)                ->  Sort  (cost=10000021561.37..10000022011.37 rows=180000 width=12)                      Sort Key: a, b, c                      ->  Seq Scan on abcd  (cost=10000000000.00..10000002773.00 rows=180000 width=12) (8 rows) explain select distinct a, b, count(*) over (partition by b,a, c) from abcd;                                             QUERY PLAN ---------------------------------------------------------------------------------------------------  Unique  (cost=2041.88..36764.90 rows=60 width=20)    ->  Incremental Sort  (cost=2041.88..35414.90 rows=180000 width=20)          Sort Key: b, a, c, (count(*) OVER (?))          Presorted Key: b, a, c          ->  WindowAgg  (cost=1989.94..25746.96 rows=180000 width=20)                ->  Incremental Sort  (cost=1989.94..22146.96 rows=180000 width=12)                      Sort Key: b, a, c                      Presorted Key: b                      ->  Index Scan using b_idx on abcd  (cost=0.29..7174.62 rows=180000 width=12) (9 rows) In master: explain select distinct relname,relkind,count(*) over (partition by relkind) from pg_Class;                                               QUERY PLAN -------------------------------------------------------------------------------------------------------  Unique  (cost=10000000059.50..10000000063.65 rows=415 width=73)    ->  Sort  (cost=10000000059.50..10000000060.54 rows=415 width=73)          Sort Key: relname, relkind, (count(*) OVER (?))          ->  WindowAgg  (cost=10000000034.20..10000000041.46 rows=415 width=73)                ->  Sort  (cost=10000000034.20..10000000035.23 rows=415 width=65)                      Sort Key: relkind                      ->  Seq Scan on pg_class  (cost=10000000000.00..10000000016.15 rows=415 width=65) (7 rows) explain select distinct b,a from ab where a < 10;                                     QUERY PLAN ----------------------------------------------------------------------------------  Unique  (cost=72.20..78.95 rows=611 width=8)    ->  Sort  (cost=72.20..74.45 rows=900 width=8)          Sort Key: b, a          ->  Index Scan using ab_a_idx on ab  (cost=0.29..28.04 rows=900 width=8)                Index Cond: (a < 10) (5 rows) explain select distinct b,a, count(*) over (partition by a) from abcd order by a,b;                                              QUERY PLAN -----------------------------------------------------------------------------------------------------  Unique  (cost=10000023704.77..10000041084.40 rows=60 width=16)    ->  Incremental Sort  (cost=10000023704.77..10000039734.40 rows=180000 width=16)          Sort Key: a, b, (count(*) OVER (?))          Presorted Key: a          ->  WindowAgg  (cost=10000020948.87..10000024098.87 rows=180000 width=16)                ->  Sort  (cost=10000020948.87..10000021398.87 rows=180000 width=8)                      Sort Key: a                      ->  Seq Scan on abcd  (cost=10000000000.00..10000002773.00 rows=180000 width=8) (8 rows) explain select distinct a, b, count(*) over (partition by b,a, c) from abcd; QUERY PLAN --------------------------------------------------------------------------------------------------- Unique (cost=45151.33..46951.33 rows=60 width=20) -> Sort (cost=45151.33..45601.33 rows=180000 width=20) Sort Key: a, b, (count(*) OVER (?)) -> WindowAgg (cost=1989.94..25746.96 rows=180000 width=20) -> Incremental Sort (cost=1989.94..22146.96 rows=180000 width=12) Sort Key: b, a, c Presorted Key: b -> Index Scan using b_idx on abcd (cost=0.29..7174.62 rows=180000 width=12) (8 rows) Note: Composite keys are also handled. create index xy_idx on xyz(x,y); explain select distinct x,z,y from xyz; QUERY PLAN ---------------------------------------------------------------------------------- Unique (cost=0.86..55.97 rows=60 width=12) -> Incremental Sort (cost=0.86..51.47 rows=600 width=12) Sort Key: x, y, z Presorted Key: x, y -> Index Scan using xy_idx on xyz (cost=0.15..32.80 rows=600 width=12) (5 rows) There are some cases where different kind of scan happens explain select distinct x,y from xyz where y < 10;                                     QUERY PLAN -----------------------------------------------------------------------------------  Unique  (cost=47.59..51.64 rows=60 width=8)    ->  Sort  (cost=47.59..48.94 rows=540 width=8)          Sort Key: x, y          ->  Bitmap Heap Scan on xyz  (cost=12.34..23.09 rows=540 width=8)                Recheck Cond: (y < 10)                ->  Bitmap Index Scan on y_idx (cost=0.00..12.20 rows=540 width=0)                      Index Cond: (y < 10) (7 rows) As code only checks from IndexPath (at the moment), other scan paths are not covered. Is it okay to cover these in same way as I did for IndexPath? (with no limitation on this behaviour on certain path types?) Also, I am assuming distinct pathkeys can be changed without any issues. As changes are limited to modification in distinct path only, I don't see this affecting other nodes. Test cases are green, with a couple of failures in window functions (one which I had added) and one very weird: EXPLAIN (COSTS OFF) SELECT DISTINCT        empno,        enroll_date,        depname,        sum(salary) OVER (PARTITION BY depname order by empno) depsalary,        min(salary) OVER (PARTITION BY depname order by enroll_date) depminsalary FROM empsalary ORDER BY depname, empno;                                              QUERY PLAN -----------------------------------------------------------------------------------------------------  Incremental Sort    Sort Key: depname, empno    Presorted Key: depname    ->  Unique          ->  Incremental Sort                Sort Key: depname, enroll_date, empno, (sum(salary) OVER (?)), (min(salary) OVER (?))                Presorted Key: depname                ->  WindowAgg                      ->  Incremental Sort                            Sort Key: depname, empno                            Presorted Key: depname                            ->  WindowAgg                                  ->  Sort                                        Sort Key: depname, enroll_date                                        ->  Seq Scan on empsalary (15 rows) In above query plan, unique used to come after Incremental sort in the master. Pending: 1. Consider if Pathkey.pk_strategy and pk_nulls_first need to be compared too, this is pending as I have to look these up and understand them. 2. Test cases (failures and new cases) 3. Improve comments Patch v8 attached. Please let me know any review comments, will address these in followup patch with pending items. Thanks, Ankit --------------0wMcE35J1zLwDg2yaJYESCri Content-Type: text/x-patch; charset=UTF-8; name="better_windowclause_sorting_dgr-v8.patch" Content-Disposition: attachment; filename="better_windowclause_sorting_dgr-v8.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMgYi9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jCmluZGV4IGI5ZGE1ODgxMTQu LmUxM2M4ZjE5MTQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2lu ZHhwYXRoLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwpA QCAtMTAxNSw3ICsxMDE1LDYgQEAgYnVpbGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJv b3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJICBvcmRlcmJ5Y2xhdXNlcywKIAkJCQkJ CQkJICBvcmRlcmJ5Y2xhdXNlY29scywKIAkJCQkJCQkJICB1c2VmdWxfcGF0aGtleXMsCi0J CQkJCQkJCSAgaW5kZXhfcGF0aGtleXMsCiAJCQkJCQkJCSAgaW5kZXhfaXNfb3JkZXJlZCA/ CiAJCQkJCQkJCSAgRm9yd2FyZFNjYW5EaXJlY3Rpb24gOgogCQkJCQkJCQkgIE5vTW92ZW1l bnRTY2FuRGlyZWN0aW9uLApAQCAtMTAzOCw3ICsxMDM3LDYgQEAgYnVpbGRfaW5kZXhfcGF0 aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJCSAgb3Jk ZXJieWNsYXVzZXMsCiAJCQkJCQkJCQkgIG9yZGVyYnljbGF1c2Vjb2xzLAogCQkJCQkJCQkJ ICB1c2VmdWxfcGF0aGtleXMsCi0JCQkJCQkJCQkgIGluZGV4X3BhdGhrZXlzLAogCQkJCQkJ CQkJICBpbmRleF9pc19vcmRlcmVkID8KIAkJCQkJCQkJCSAgRm9yd2FyZFNjYW5EaXJlY3Rp b24gOgogCQkJCQkJCQkJICBOb01vdmVtZW50U2NhbkRpcmVjdGlvbiwKQEAgLTEwNzQsNyAr MTA3Miw2IEBAIGJ1aWxkX2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJ bmZvICpyZWwsCiAJCQkJCQkJCQkgIE5JTCwKIAkJCQkJCQkJCSAgTklMLAogCQkJCQkJCQkJ ICB1c2VmdWxfcGF0aGtleXMsCi0JCQkJCQkJCQkgIGluZGV4X3BhdGhrZXlzLAogCQkJCQkJ CQkJICBCYWNrd2FyZFNjYW5EaXJlY3Rpb24sCiAJCQkJCQkJCQkgIGluZGV4X29ubHlfc2Nh biwKIAkJCQkJCQkJCSAgb3V0ZXJfcmVsaWRzLApAQCAtMTA5Miw3ICsxMDg5LDYgQEAgYnVp bGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJ CQkJCQkJCQkgIE5JTCwKIAkJCQkJCQkJCQkgIE5JTCwKIAkJCQkJCQkJCQkgIHVzZWZ1bF9w YXRoa2V5cywKLQkJCQkJCQkJCQkgIGluZGV4X3BhdGhrZXlzLAogCQkJCQkJCQkJCSAgQmFj a3dhcmRTY2FuRGlyZWN0aW9uLAogCQkJCQkJCQkJCSAgaW5kZXhfb25seV9zY2FuLAogCQkJ CQkJCQkJCSAgb3V0ZXJfcmVsaWRzLApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BhdGgvcGF0aGtleXMuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL3BhdGhr ZXlzLmMKaW5kZXggMjhiZTQ5NTM3MC4uNjA5ZGY5M2RjOSAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BhdGgvcGF0aGtleXMuYworKysgYi9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGF0aC9wYXRoa2V5cy5jCkBAIC0xOTY4LDIxICsxOTY4LDMgQEAgaGFzX3VzZWZ1 bF9wYXRoa2V5cyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKQogCQlyZXR1 cm4gdHJ1ZTsJCQkvKiBtaWdodCBiZSBhYmxlIHRvIHVzZSB0aGVtIGZvciBvcmRlcmluZyAq LwogCXJldHVybiBmYWxzZTsJCQkJLyogZGVmaW5pdGVseSB1c2VsZXNzICovCiB9Ci0KLS8q Ci0gKiBSZXR1cm5zIFRydWUgaWYga2V5MSBzdWJzZXQgaXMga2V5MiBpLmUuCi0gKiBhdGxl YXN0IG9uZSBrZXkgZnJvbSBrZXlzMSBpcyBwcmVzZW50IG9uIGtleTIKLSAqLwotYm9vbAot aXNfcGF0aGtleV9zdWJzZXQoTGlzdAkqa2V5czEsIExpc3QqIGtleXMyKQotewotCUxpc3RD ZWxsKiBsOwotCWZvcmVhY2gobCwga2V5czEpCi0JewotCQlQYXRoS2V5ICAgICpwYXRoa2V5 MSA9IChQYXRoS2V5ICopIGxmaXJzdChsKTsKLQkJaWYocGF0aGtleV9pc19yZWR1bmRhbnQo cGF0aGtleTEsIGtleXMyKSl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4g ZmFsc2U7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm5lci5jIGIvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BsYW4vcGxhbm5lci5jCmluZGV4IGVlODgzMDQ4ZTMuLjA0NGZiMjQ2NjYgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5uZXIuYworKysgYi9zcmMv YmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubmVyLmMKQEAgLTQ0MjEsMTQgKzQ0MjEsOCBA QCBjcmVhdGVfb25lX3dpbmRvd19wYXRoKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkgICBM aXN0ICphY3RpdmVXaW5kb3dzKQogewogCVBhdGhUYXJnZXQgKndpbmRvd190YXJnZXQ7Ci0J UXVlcnkJICAgKnBhcnNlID0gcm9vdC0+cGFyc2U7CiAJTGlzdENlbGwgICAqbDsKIAlMaXN0 CSAgICp0b3BxdWFsID0gTklMOwotCUxpc3QJICAgKndpbmRvd19wYXRoa2V5czsKLQlMaXN0 CSAgICpvcmRlcmJ5X3BhdGhrZXlzID0gTklMOwotCWludAkJCXNvcnRfcHVzaGRvd25faWR4 ID0gLTE7Ci0JaW50CQkJcHJlc29ydGVkX2tleXM7Ci0JYm9vbAkJaXNfc29ydGVkOwogCiAJ LyoKIAkgKiBTaW5jZSBlYWNoIHdpbmRvdyBjbGF1c2UgY291bGQgcmVxdWlyZSBhIGRpZmZl cmVudCBzb3J0IG9yZGVyLCB3ZSBzdGFjawpAQCAtNDQ0Nyw5OSArNDQ0MSwxNyBAQCBjcmVh dGVfb25lX3dpbmRvd19wYXRoKFBsYW5uZXJJbmZvICpyb290LAogCSAqLwogCXdpbmRvd190 YXJnZXQgPSBpbnB1dF90YXJnZXQ7CiAKLQkvKgotCSAqIEhlcmUgd2UgYXR0ZW1wdCB0byBt aW5pbWl6ZSB0aGUgbnVtYmVyIG9mIHNvcnRzIHdoaWNoIG11c3QgYmUgcGVyZm9ybWVkCi0J ICogZm9yIHF1ZXJpZXMgd2l0aCBhbiBPUkRFUiBCWSBjbGF1c2UuCi0JICoKLQkgKiBJdCdz IHBvc3NpYmxlIGR1ZSB0byBzZWxlY3RfYWN0aXZlX3dpbmRvd3MoKSBwdXR0aW5nIHRoZSBX aW5kb3dDbGF1c2VzCi0JICogd2l0aCB0aGUgbG93ZXN0IHRsZVNvcnRHcm91cFJlZiBsYXN0 IGluIHRoZSBhY3RpdmVXaW5kb3dzIGxpc3QgdGhhdCB0aGUKLQkgKiBmaW5hbCBXaW5kb3dD bGF1c2UgaGFzIGEgc3Vic2V0IG9mIHRoZSBzb3J0IHJlcXVpcmVtZW50cyB0aGF0IHRoZQot CSAqIHF1ZXJ5J3MgT1JERVIgQlkgY2xhdXNlIGhhcy4gIEJlbG93IHdlIHRyeSB0byBkZXRl Y3QgdGhpcyBjYXNlIGFuZCBpZgotCSAqIHdlIGZpbmQgdGhpcyBpcyB0cnVlLCB3ZSBjb25z aWRlciBhZGp1c3RpbmcgdGhlIHNvcnQgdGhhdCdzIGRvbmUgZm9yCi0JICogV2luZG93QWdn cyBhbmQgaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBjbGF1c2VzIHNvIHRoYXQgbm8gYWRkaXRp b25hbAotCSAqIHNvcnRpbmcgaXMgcmVxdWlyZWQgZm9yIHRoZSBxdWVyeSdzIE9SREVSIEJZ IGNsYXVzZS4KLQkgKgotCSAqIFdlIGRvbid0IHRyeSB0aGlzIG9wdGltaXphdGlvbiBmb3Ig dGhlIGZvbGxvd2luZyBjYXNlczoKLQkgKgotCSAqIDEuCUlmIHRoZSBxdWVyeSBoYXMgYSBE SVNUSU5DVCBjbGF1c2UuICBXZSBuZWVkbid0IHdhc3RlIGFueQotCSAqCQlhZGRpdGlvbmFs IGVmZm9ydCBmb3IgdGhlIG1vcmUgc3RyaWN0IHNvcnQgb3JkZXIgYXMgaWYgRElTVElOQ1QK LQkgKgkJaXMgZG9uZSB2aWEgSGFzaCBBZ2dyZWdhdGUgdGhlbiB0aGF0J3MgZ29pbmcgdG8g dW5kbyB0aGlzIHdvcmsuCi0JICoKLQkgKiAyLglJZiB0aGUgcXVlcnkgaGFzIGEgTElNSVQg Y2xhdXNlLiAgVGhlIHRvcC1sZXZlbCBzb3J0IHdpbGwgYmUKLQkgKgkJYWJsZSB0byB1c2Ug YSB0b3AtbiBzb3J0IHdoaWNoIG1pZ2h0IGJlIG1vcmUgZWZmaWNpZW50IHRoYW4KLQkgKgkJ c29ydGluZwlieSB0aGUgYWRkaXRpb25hbCBjb2x1bW5zLiAgSWYgdGhlIExJTUlUIGRvZXMg bm90IHJlZHVjZQotCSAqCQl0aGUJbnVtYmVyIG9mIHJvd3Mgc2lnbmlmaWNhbnRseSB0aGVu IHRoaXMgbWlnaHQgbm90IGJlIHRydWUsIGJ1dAotCSAqCQl3ZSBkb24ndCB0cnkgdG8gY29u c2lkZXIgdGhhdCBoZXJlLgotCSAqCi0JICogMy4JSWYgdGhlIHRvcC1sZXZlbCBXaW5kb3dD bGF1c2UgaGFzIGEgcnVuQ29uZGl0aW9uIHRoZW4gdGhpcyBjYW4KLQkgKgkJZmlsdGVyIG91 dCB0dXBsZXMgYW5kIG1ha2UgdGhlIGZpbmFsIHNvcnQgY2hlYXBlci4gIElmIHdlIHB1c2hl ZAotCSAqCQl0aGUgc29ydCBkb3duIGJlbG93IHRoZSBXaW5kb3dBZ2cgdGhlbiB3ZSdkIG5l ZWQgdG8gc29ydCBhbGwgcm93cwotCSAqCQlpbmNsdWRpbmcgb25lcyB0aGF0IHRoZSBydW5D b25kaXRpb24gbWlnaHQgZmlsdGVyLiAgVGhpcyBtYXkgd2FzdGUKLQkgKgkJZWZmb3J0IHNv IHdlIGp1c3QgZG9uJ3QgdHJ5IHRvIHB1c2ggZG93biB0aGUgc29ydCBmb3IgdGhpcyBjYXNl LgotCSAqCi0JICogNC4JSWYgdGhlIE9SREVSIEJZIGNvbnRhaW5zIGFueSBleHByZXNzaW9u cyBjb250YWluaW5nIFdpbmRvd0Z1bmNzCi0JICoJCXRoZW4gd2UgY2FuJ3QgcHVzaCBkb3du IHRoZSBzb3J0IGFzIHRoZXNlIG9idmlvdXNseSBtdXN0IGJlCi0JICoJCWV2YWx1YXRlZCBi ZWZvcmUgdGhleSBjYW4gYmUgc29ydGVkLgotCSAqLwotCWlmIChwYXJzZS0+c29ydENsYXVz ZSAhPSBOSUwgJiYKLQkJcGFyc2UtPmxpbWl0Q291bnQgPT0gTlVMTCAmJgotCQlsaW5pdGlh bF9ub2RlKFdpbmRvd0NsYXVzZSwgYWN0aXZlV2luZG93cyktPnJ1bkNvbmRpdGlvbiA9PSBO SUwgJiYKLQkJIWNvbnRhaW5fd2luZG93X2Z1bmN0aW9uKChOb2RlICopIGdldF9zb3J0Z3Jv dXBsaXN0X2V4cHJzKHBhcnNlLT5zb3J0Q2xhdXNlLAotCQkJCQkJCQkgcm9vdC0+cHJvY2Vz c2VkX3RsaXN0KSkpCi0JewotCQlvcmRlcmJ5X3BhdGhrZXlzID0gbWFrZV9wYXRoa2V5c19m b3Jfc29ydGNsYXVzZXMocm9vdCwKLQkJCQkJCQkJCQkJCQkJIHBhcnNlLT5zb3J0Q2xhdXNl LAotCQkJCQkJCQkJCQkJCQkgcm9vdC0+cHJvY2Vzc2VkX3RsaXN0KTsKLQotCQkvKgotCQkg KiBMb29wIGJhY2t3YXJkcyBvdmVyIHRoZSBXaW5kb3dDbGF1c2VzIGxvb2tpbmcgZm9yIHRo ZSBmaXJzdAotCQkgKiBXaW5kb3dDbGF1c2Ugd2hpY2ggaGFzIHBhdGhrZXlzIG5vdCBjb250 YWluZWQgaW4gdGhlCi0JCSAqIG9yZGVyYnlfcGF0aGtleXMuICBXaGF0IHdlJ3JlIGxvb2tp bmcgZm9yIGhlcmUgaXMgdGhlIGxvd2VzdCBsZXZlbAotCQkgKiB0aGF0IHdlIHB1c2ggdGhl IGFkZGl0aW9uYWwgc29ydCByZXF1aXJlbWVudHMgZG93biBpbnRvLiAgSWYgd2UKLQkJICog ZmFpbCBoZXJlIHRoZW4gc29ydF9wdXNoZG93bl9pZHggd2lsbCByZW1haW4gYXQgLTEuCi0J CSAqLwotCQlmb3JlYWNoX3JldmVyc2UobCwgYWN0aXZlV2luZG93cykKLQkJewotCQkJV2lu ZG93Q2xhdXNlICp3YyA9IGxmaXJzdF9ub2RlKFdpbmRvd0NsYXVzZSwgbCk7Ci0KLQkJCXdp bmRvd19wYXRoa2V5cyA9IG1ha2VfcGF0aGtleXNfZm9yX3dpbmRvdyhyb290LAotCQkJCQkJ CQkJCQkJCQl3YywKLQkJCQkJCQkJCQkJCQkJcm9vdC0+cHJvY2Vzc2VkX3RsaXN0KTsKLQot CQkJaWYgKHBhdGhrZXlzX2NvbnRhaW5lZF9pbih3aW5kb3dfcGF0aGtleXMsIG9yZGVyYnlf cGF0aGtleXMpKQotCQkJCXNvcnRfcHVzaGRvd25faWR4ID0gZm9yZWFjaF9jdXJyZW50X2lu ZGV4KGwpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCiAJZm9yZWFjaChsLCBh Y3RpdmVXaW5kb3dzKQogCXsKIAkJV2luZG93Q2xhdXNlICp3YyA9IGxmaXJzdF9ub2RlKFdp bmRvd0NsYXVzZSwgbCk7CisJCUxpc3QJICAgKndpbmRvd19wYXRoa2V5czsKKwkJaW50CQkJ cHJlc29ydGVkX2tleXM7CisJCWJvb2wJCWlzX3NvcnRlZDsKIAkJYm9vbAkJdG9wd2luZG93 OwogCiAJCXdpbmRvd19wYXRoa2V5cyA9IG1ha2VfcGF0aGtleXNfZm9yX3dpbmRvdyhyb290 LAotCQkJCQkJCQkJCQkJCXdjLAotCQkJCQkJCQkJCQkJCXJvb3QtPnByb2Nlc3NlZF90bGlz dCk7Ci0KLQkJLyoKLQkJICogV2hlbiB3ZSBnZXQgdG8gdGhlIHNvcnRfcHVzaGRvd25faWR4 IFdpbmRvd0NsYXVzZSwgaWYgdGhlIHBhdGggaXMKLQkJICogbm90IGFscmVhZHkgY29ycmVj dGx5IHNvcnRlZCwgdGhlbiBqdXN0IHVzZSB0aGUgcGF0aGtleXMgZm9yIHRoZQotCQkgKiBx dWVyeSdzIE9SREVSIEJZIGNsYXVzZSBpbnN0ZWFkIG9mIHRoZSBXaW5kb3dDbGF1c2UncyBw YXRoa2V5cy4KLQkJICogV2hlbiB0aGUgcGF0aCBpcyBhbHJlYWR5IGNvcnJlY3RseSBzb3J0 ZWQgdGhlcmUncyBubyBwb2ludCBpbgotCQkgKiBhZGp1c3RpbmcgdGhlIHBhdGhrZXlzIGFz IHRoaXMganVzdCBtb3ZlcyB0aGUgc29ydCBkb3duIHdpdGhvdXQKLQkJICogYWN0dWFsbHkg cmVkdWNpbmcgdGhlIG51bWJlciBvZiBzb3J0cyB3aGljaCBhcmUgcmVxdWlyZWQgaW4gdGhl Ci0JCSAqIHBsYW4gb3ZlcmFsbC4gIHNvcnRfcHVzaGRvd25faWR4IHdpbGwgYmUgLTEgYW5k IG5ldmVyIG1hdGNoIHdoZW4KLQkJICogdGhpcyBvcHRpbWl6YXRpb24gd2FzIGRpc2FibGVk IGFib3ZlLgotCQkgKi8KLQkJaWYgKGZvcmVhY2hfY3VycmVudF9pbmRleChsKSA9PSBzb3J0 X3B1c2hkb3duX2lkeCAmJgotCQkJIXBhdGhrZXlzX2NvbnRhaW5lZF9pbih3aW5kb3dfcGF0 aGtleXMsIHBhdGgtPnBhdGhrZXlzKSkKLQkJewotCQkJLyogY2hlY2sgdG8gbWFrZSBzdXJl IHNvcnRfcHVzaGRvd25faWR4IHdhcyBzZXQgY29ycmVjdGx5ICovCi0JCQlBc3NlcnQocGF0 aGtleXNfY29udGFpbmVkX2luKHdpbmRvd19wYXRoa2V5cywgb3JkZXJieV9wYXRoa2V5cykp OwotCi0JCQl3aW5kb3dfcGF0aGtleXMgPSBvcmRlcmJ5X3BhdGhrZXlzOwotCQl9CisJCQkJ CQkJCQkJCQkgICB3YywKKwkJCQkJCQkJCQkJCSAgIHJvb3QtPnByb2Nlc3NlZF90bGlzdCk7 CiAKIAkJaXNfc29ydGVkID0gcGF0aGtleXNfY291bnRfY29udGFpbmVkX2luKHdpbmRvd19w YXRoa2V5cywKIAkJCQkJCQkJCQkJCXBhdGgtPnBhdGhrZXlzLApAQCAtNDkzMyw0MyArNDg0 NSw5IEBAIGNyZWF0ZV9maW5hbF9kaXN0aW5jdF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqaW5wdXRfcmVsLAogCQkJYm9vbAkJaXNfc29ydGVkOwogCQkJaW50CQkJ cHJlc29ydGVkX2tleXM7CiAKLQotCQkJLyoKLQkJCSAqIENvbnNpZGVyIGFueSBhbnkgc29y dGluZyB3aGljaCBjYW4gYmUgcmV1dGlsaXplZCBmb3IgZGlzdGluY3QKLQkJCSAqIGV2ZW4g aWYgb3JkZXJpbmcgZGlmZmVycy4KLQkJCSAqLwotCQkJaWYgKElzQShsZmlyc3QobGMpLCBJ bmRleFBhdGgpKQotCQkJewotCQkJCS8qCi0JCQkJICogRmluZCBpZiBpbmRleCBwYXRoa2V5 cyBhcmUgc3Vic2V0IG9mIG5lZWRlZCBwYXRoa2V5cwotCQkJCSAqIGlmIHNvIHRoZW4gcHJl cGVuZCB0aGVzZSBrZXlzIHNvIHRoYXQgc29ydGluZyBpcyBub3QgbmVlZGVkCi0JCQkJICov Ci0JCQkJSW5kZXhQYXRoICppZHhfcGF0aCAgPSAoSW5kZXhQYXRoKikgbGZpcnN0KGxjKTsK LQkJCQlpZiAoaXNfcGF0aGtleV9zdWJzZXQobmVlZGVkX3BhdGhrZXlzLCBpZHhfcGF0aC0+ aW5kZXhwYXRoa2V5cykpCi0JCQkJewotCi0JCQkJCW5lZWRlZF9wYXRoa2V5cyA9IGxpc3Rf Y29uY2F0X3VuaXF1ZShsaXN0X2NvcHkoaWR4X3BhdGgtPmluZGV4cGF0aGtleXMpLCBuZWVk ZWRfcGF0aGtleXMpOwotCQkJCX0KLQkJCQlpc19zb3J0ZWQgPSBwYXRoa2V5c19jb3VudF9j b250YWluZWRfaW4obmVlZGVkX3BhdGhrZXlzLAotCQkJCQkJCQkJCQkJCWlkeF9wYXRoLT5p bmRleHBhdGhrZXlzLAotCQkJCQkJCQkJCQkJCSZwcmVzb3J0ZWRfa2V5cyk7Ci0JCQl9Ci0J CQllbHNlCi0JCQl7Ci0JCQkJLyoKLQkJCQkgKiBJZiBuZWVkZWQgcGF0aGtleXMgYXJlIHN1 YnNldCBvZiBxdWVyeV9wYXRoa2V5cywKLQkJCQkgKiBpZiBzbywgbG93ZXIgbm9kZXMgd2ls bCBoYXZlIHNvcnRlZCBzb21lIGNvbHVtbnMgd2hpY2gKLQkJCQkgKiB3ZSBjYW4gcmV1c2Uu Ci0JCQkJICovCi0JCQkJaWYgKGlzX3BhdGhrZXlfc3Vic2V0KG5lZWRlZF9wYXRoa2V5cywg cm9vdC0+cXVlcnlfcGF0aGtleXMpKQotCQkJCXsKLQkJCQkJbmVlZGVkX3BhdGhrZXlzID0g bGlzdF9jb25jYXRfdW5pcXVlKGxpc3RfY29weShyb290LT5xdWVyeV9wYXRoa2V5cyksIG5l ZWRlZF9wYXRoa2V5cyk7Ci0JCQkJfQotCQkJCWlzX3NvcnRlZCA9IHBhdGhrZXlzX2NvdW50 X2NvbnRhaW5lZF9pbihuZWVkZWRfcGF0aGtleXMsCisJCQlpc19zb3J0ZWQgPSBwYXRoa2V5 c19jb3VudF9jb250YWluZWRfaW4obmVlZGVkX3BhdGhrZXlzLAogCQkJCQkJCQkJCQkJCWlu cHV0X3BhdGgtPnBhdGhrZXlzLAogCQkJCQkJCQkJCQkJCSZwcmVzb3J0ZWRfa2V5cyk7Ci0J CQl9Ci0KIAogCQkJaWYgKGlzX3NvcnRlZCkKIAkJCQlzb3J0ZWRfcGF0aCA9IGlucHV0X3Bh dGg7CkBAIC02NjI2LDcgKzY1MDQsNyBAQCBwbGFuX2NsdXN0ZXJfdXNlX3NvcnQoT2lkIHRh YmxlT2lkLCBPaWQgaW5kZXhPaWQpCiAKIAkvKiBFc3RpbWF0ZSB0aGUgY29zdCBvZiBpbmRl eCBzY2FuICovCiAJaW5kZXhTY2FuUGF0aCA9IGNyZWF0ZV9pbmRleF9wYXRoKHJvb3QsIGlu ZGV4SW5mbywKLQkJCQkJCQkJCSAgTklMLCBOSUwsIE5JTCwgTklMLCBOSUwsCisJCQkJCQkJ CQkgIE5JTCwgTklMLCBOSUwsIE5JTCwKIAkJCQkJCQkJCSAgRm9yd2FyZFNjYW5EaXJlY3Rp b24sIGZhbHNlLAogCQkJCQkJCQkJICBOVUxMLCAxLjAsIGZhbHNlKTsKIApkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGF0aG5vZGUuYyBiL3NyYy9iYWNrZW5k L29wdGltaXplci91dGlsL3BhdGhub2RlLmMKaW5kZXggYzY2NmJlNGY0Zi4uNDQ3ODAzNmJi NiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGF0aG5vZGUuYwor KysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wYXRobm9kZS5jCkBAIC0xMDAwLDcg KzEwMDAsNiBAQCBjcmVhdGVfaW5kZXhfcGF0aChQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkg IExpc3QgKmluZGV4b3JkZXJieXMsCiAJCQkJICBMaXN0ICppbmRleG9yZGVyYnljb2xzLAog CQkJCSAgTGlzdCAqcGF0aGtleXMsCi0JCQkJICBMaXN0ICppbmRleHBhdGhrZXlzLAogCQkJ CSAgU2NhbkRpcmVjdGlvbiBpbmRleHNjYW5kaXIsCiAJCQkJICBib29sIGluZGV4b25seSwK IAkJCQkgIFJlbGlkcyByZXF1aXJlZF9vdXRlciwKQEAgLTEwMjQsOSArMTAyMyw3IEBAIGNy ZWF0ZV9pbmRleF9wYXRoKFBsYW5uZXJJbmZvICpyb290LAogCXBhdGhub2RlLT5pbmRleGNs YXVzZXMgPSBpbmRleGNsYXVzZXM7CiAJcGF0aG5vZGUtPmluZGV4b3JkZXJieXMgPSBpbmRl eG9yZGVyYnlzOwogCXBhdGhub2RlLT5pbmRleG9yZGVyYnljb2xzID0gaW5kZXhvcmRlcmJ5 Y29sczsKLQogCXBhdGhub2RlLT5pbmRleHNjYW5kaXIgPSBpbmRleHNjYW5kaXI7Ci0JcGF0 aG5vZGUtPmluZGV4cGF0aGtleXMgPSBpbmRleHBhdGhrZXlzOwogCiAJY29zdF9pbmRleChw YXRobm9kZSwgcm9vdCwgbG9vcF9jb3VudCwgcGFydGlhbF9wYXRoKTsKIApkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9w YXRobm9kZXMuaAppbmRleCBhMmFiYjQwMzU2Li5jMjBiNzI5OGEzIDEwMDY0NAotLS0gYS9z cmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaAorKysgYi9zcmMvaW5jbHVkZS9ub2Rlcy9w YXRobm9kZXMuaApAQCAtMTYwMSw3ICsxNjAxLDYgQEAgdHlwZWRlZiBzdHJ1Y3QgSW5kZXhQ YXRoCiAJTGlzdAkgICAqaW5kZXhjbGF1c2VzOwogCUxpc3QJICAgKmluZGV4b3JkZXJieXM7 CiAJTGlzdAkgICAqaW5kZXhvcmRlcmJ5Y29sczsKLQlMaXN0CSAgICppbmRleHBhdGhrZXlz OwogCVNjYW5EaXJlY3Rpb24gaW5kZXhzY2FuZGlyOwogCUNvc3QJCWluZGV4dG90YWxjb3N0 OwogCVNlbGVjdGl2aXR5IGluZGV4c2VsZWN0aXZpdHk7CmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9ub2Rlcy9wZ19saXN0LmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9wZ19saXN0LmgKaW5k ZXggMGRlOWQ3M2RhYy4uNTI5YTM4MmQyOCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9k ZXMvcGdfbGlzdC5oCisrKyBiL3NyYy9pbmNsdWRlL25vZGVzL3BnX2xpc3QuaApAQCAtMzc4 LDMwICszNzgsMTQgQEAgbG5leHQoY29uc3QgTGlzdCAqbCwgY29uc3QgTGlzdENlbGwgKmMp CiAJCSAoY2VsbCA9IE5VTEwsIGZhbHNlKTsgXAogCQkgY2VsbCMjX19zdGF0ZS5pKyspCiAK LS8qCi0gKiBmb3JlYWNoX3JldmVyc2UgLQotICoJICBhIGNvbnZlbmllbmNlIG1hY3JvIGZv ciBsb29waW5nIHRocm91Z2ggYSBsaXN0IGluIHJldmVyc2UKLSAqCi0gKiBUaGlzIGlzIGVx dWl2YWxlbnQgdG8gZm9yZWFjaCwgb25seSBpdCBsb29wcyBvdmVyIHRoZSBsaXN0IHN0YXJ0 aW5nIHdpdGgKLSAqIHRoZSBsYXN0IGVsZW1lbnQgYW5kIGVuZHMgb24gdGhlIGZpcnN0IGVs ZW1lbnQuCi0gKi8KLSNkZWZpbmUgZm9yZWFjaF9yZXZlcnNlKGNlbGwsIGxzdCkJXAotCWZv ciAoRm9yRWFjaFN0YXRlIGNlbGwjI19fc3RhdGUgPSB7KGxzdCksIGNlbGwjI19fc3RhdGUu bC0+bGVuZ3RoIC0gMX07IFwKLQkJIChjZWxsIyNfX3N0YXRlLmwgIT0gTklMICYmIFwKLQkJ ICBjZWxsIyNfX3N0YXRlLmkgPj0gMCkgPyBcCi0JCSAoY2VsbCA9ICZjZWxsIyNfX3N0YXRl LmwtPmVsZW1lbnRzW2NlbGwjI19fc3RhdGUuaV0sIHRydWUpIDogXAotCQkgKGNlbGwgPSBO VUxMLCBmYWxzZSk7IFwKLQkJIGNlbGwjI19fc3RhdGUuaS0tKQotCiAvKgogICogZm9yZWFj aF9kZWxldGVfY3VycmVudCAtCiAgKgkgIGRlbGV0ZSB0aGUgY3VycmVudCBsaXN0IGVsZW1l bnQgZnJvbSB0aGUgTGlzdCBhc3NvY2lhdGVkIHdpdGggYQotICoJICBzdXJyb3VuZGluZyBm b3JlYWNoKCkgb3IgZm9yZWFjaF9yZXZlcnNlKCkgbG9vcCwgcmV0dXJuaW5nIHRoZSBuZXcg TGlzdAotKgkgIHBvaW50ZXIuCisgKgkgIHN1cnJvdW5kaW5nIGZvcmVhY2goKSBsb29wLCBy ZXR1cm5pbmcgdGhlIG5ldyBMaXN0IHBvaW50ZXIuCiAgKgogICogVGhpcyBpcyBlcXVpdmFs ZW50IHRvIGxpc3RfZGVsZXRlX2NlbGwoKSwgYnV0IGl0IGFsc28gYWRqdXN0cyB0aGUgZm9y ZWFjaAotICogb3IgZm9yZWFjaF9yZXZlcnNlIGxvb3AncyBzdGF0ZSBzbyB0aGF0IG5vIGxp c3QgZWxlbWVudHMgd2lsbCBiZSBtaXNzZWQuCi0gKiBEbyBub3QgZGVsZXRlIGVsZW1lbnRz IGZyb20gYW4gYWN0aXZlIGZvcmVhY2ggbG9vcCdzIGxpc3QgaW4gYW55IG90aGVyIHdheSEK KyAqIGxvb3AncyBzdGF0ZSBzbyB0aGF0IG5vIGxpc3QgZWxlbWVudHMgd2lsbCBiZSBtaXNz ZWQuICBEbyBub3QgZGVsZXRlCisgKiBlbGVtZW50cyBmcm9tIGFuIGFjdGl2ZSBmb3JlYWNo IGxvb3AncyBsaXN0IGluIGFueSBvdGhlciB3YXkhCiAgKi8KICNkZWZpbmUgZm9yZWFjaF9k ZWxldGVfY3VycmVudChsc3QsIGNlbGwpCVwKIAkoY2VsbCMjX19zdGF0ZS5pLS0sIFwKQEAg LTQwOSw5ICszOTMsOCBAQCBsbmV4dChjb25zdCBMaXN0ICpsLCBjb25zdCBMaXN0Q2VsbCAq YykKIAogLyoKICAqIGZvcmVhY2hfY3VycmVudF9pbmRleCAtCi0gKgkgIGdldCB0aGUgemVy by1iYXNlZCBpbmRleCB3aXRoaW4gdGhlIGxpc3Qgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBp biB0aGUKLSAqCSAgc3Vycm91bmRpbmcgZm9yZWFjaCgpIG9yIGZvcmVhY2hfcmV2ZXJzZSgp IGxvb3A7IHBhc3MgdGhlIG5hbWUgb2YgdGhlCi0gKgkgICJMaXN0Q2VsbCAqIiBpdGVyYXRv ciB2YXJpYWJsZS4KKyAqCSAgZ2V0IHRoZSB6ZXJvLWJhc2VkIGxpc3QgaW5kZXggb2YgYSBz dXJyb3VuZGluZyBmb3JlYWNoKCkgbG9vcCdzCisgKgkgIGN1cnJlbnQgZWxlbWVudDsgcGFz cyB0aGUgbmFtZSBvZiB0aGUgIkxpc3RDZWxsICoiIGl0ZXJhdG9yIHZhcmlhYmxlLgogICoK ICAqIEJld2FyZSBvZiB1c2luZyB0aGlzIGFmdGVyIGZvcmVhY2hfZGVsZXRlX2N1cnJlbnQo KTsgdGhlIHZhbHVlIHdpbGwgYmUKICAqIG91dCBvZiBzeW5jIGZvciB0aGUgcmVzdCBvZiB0 aGUgY3VycmVudCBsb29wIGl0ZXJhdGlvbi4gIEFueXdheSwgc2luY2UKZGlmZiAtLWdpdCBh L3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oIGIvc3JjL2luY2x1ZGUvb3B0aW1p emVyL3BhdGhub2RlLmgKaW5kZXggMTgzMzIxOGVmYy4uMDIzMDVlZjkwMiAxMDA2NDQKLS0t IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhub2RlLmgKKysrIGIvc3JjL2luY2x1ZGUv b3B0aW1pemVyL3BhdGhub2RlLmgKQEAgLTQ0LDcgKzQ0LDYgQEAgZXh0ZXJuIEluZGV4UGF0 aCAqY3JlYXRlX2luZGV4X3BhdGgoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQlMaXN0 ICppbmRleG9yZGVyYnlzLAogCQkJCQkJCQkJTGlzdCAqaW5kZXhvcmRlcmJ5Y29scywKIAkJ CQkJCQkJCUxpc3QgKnBhdGhrZXlzLAotCQkJCQkJCQkJTGlzdCAqaW5kZXhwYXRoa2V5cywK IAkJCQkJCQkJCVNjYW5EaXJlY3Rpb24gaW5kZXhzY2FuZGlyLAogCQkJCQkJCQkJYm9vbCBp bmRleG9ubHksCiAJCQkJCQkJCQlSZWxpZHMgcmVxdWlyZWRfb3V0ZXIsCmRpZmYgLS1naXQg YS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaCBiL3NyYy9pbmNsdWRlL29wdGltaXpl ci9wYXRocy5oCmluZGV4IDEyMDRlOTYyM2YuLjY1YTNjMzU2MTEgMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL29wdGltaXplci9wYXRocy5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGltaXpl ci9wYXRocy5oCkBAIC0yNDgsNyArMjQ4LDYgQEAgZXh0ZXJuIExpc3QgKnRydW5jYXRlX3Vz ZWxlc3NfcGF0aGtleXMoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQkgICBSZWxPcHRJ bmZvICpyZWwsCiAJCQkJCQkJCQkgICBMaXN0ICpwYXRoa2V5cyk7CiBleHRlcm4gYm9vbCBo YXNfdXNlZnVsX3BhdGhrZXlzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwp OwotZXh0ZXJuIGJvb2wgaXNfcGF0aGtleV9zdWJzZXQoTGlzdAkqa2V5czEsIExpc3QqIGtl eXMyKTsKIGV4dGVybiBMaXN0ICphcHBlbmRfcGF0aGtleXMoTGlzdCAqdGFyZ2V0LCBMaXN0 ICpzb3VyY2UpOwogZXh0ZXJuIFBhdGhLZXkgKm1ha2VfY2Fub25pY2FsX3BhdGhrZXkoUGxh bm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQkgICBFcXVpdmFsZW5jZUNsYXNzICplY2xhc3Ms IE9pZCBvcGZhbWlseSwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv d2luZG93Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvd2luZG93Lm91dAppbmRl eCBhYjk0ZjgxMGZjLi5iMmM2NjA1ZTYwIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL3dpbmRvdy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC93 aW5kb3cub3V0CkBAIC0zOTg0LDIxMCArMzk4NCw3IEBAIE9SREVSIEJZIGRlcG5hbWUsIGVt cG5vOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9u IGVtcHNhbGFyeQogKDEyIHJvd3MpCiAKLS0tIERvIG5vdCBwZXJmb3JtIHNvcnQgcHVzaGRv d24gaWYgY29sdW1uIGlzIHByZXNvcnRlZAotQ1JFQVRFIElOREVYIGRlcG5hbWVfaWR4IE9O IGVtcHNhbGFyeShkZXBuYW1lKTsKLVNFVCBlbmFibGVfc2Vxc2Nhbj0wOwotRVhQTEFJTiAo Q09TVFMgT0ZGKQotU0VMRUNUIGVtcG5vLAotICAgICAgICBtaW4oc2FsYXJ5KSBPVkVSIChQ QVJUSVRJT04gQlkgZGVwbmFtZSkgZGVwbWluc2FsYXJ5Ci1GUk9NIGVtcHNhbGFyeQotT1JE RVIgQlkgZGVwbmFtZSwgZW1wbm87Ci0gICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSW5jcmVtZW50YWwgU29ydAotICAgU29y dCBLZXk6IGRlcG5hbWUsIGVtcG5vCi0gICBQcmVzb3J0ZWQgS2V5OiBkZXBuYW1lCi0gICAt PiAgV2luZG93QWdnCi0gICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBkZXBuYW1lX2lk eCBvbiBlbXBzYWxhcnkKLSg1IHJvd3MpCi0KLS0tIERvIHBlcmZvcm0gc29ydCBwdXNoZG93 biBpZiBjb2x1bW5zIGFyZSBvbmx5IHBhcnRpYWxseSBzb3J0ZWQKLUVYUExBSU4gKENPU1RT IE9GRikKLVNFTEVDVCBlbXBubywKLSAgICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFSVElU SU9OIEJZIGRlcG5hbWUsIGVtcG5vKSBkZXBtaW5zYWxhcnkKLUZST00gZW1wc2FsYXJ5Ci1P UkRFUiBCWSBkZXBuYW1lLCBlbXBubywgZW5yb2xsX2RhdGU7Ci0gICAgICAgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gV2luZG93QWdn Ci0gICAtPiAgSW5jcmVtZW50YWwgU29ydAotICAgICAgICAgU29ydCBLZXk6IGRlcG5hbWUs IGVtcG5vLCBlbnJvbGxfZGF0ZQotICAgICAgICAgUHJlc29ydGVkIEtleTogZGVwbmFtZQot ICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgZGVwbmFtZV9pZHggb24gZW1wc2FsYXJ5 Ci0oNSByb3dzKQotCi1EUk9QIElOREVYIGRlcG5hbWVfaWR4OwotUkVTRVQgZW5hYmxlX3Nl cXNjYW47CiBSRVNFVCBlbmFibGVfaGFzaGFnZzsKLS0tIElmIHdpbmRvdyBmdW5jdGlvbidz IE9SREVSIEJZIGlzIHN1YnNldCBvZiBRVUVSWSdzIE9SREVSIEJZLCBzb3J0IGFzIHBlciBh cwotLS0gUVVFUlkncyBPUkRFUiBCWSB0byBzYXZlIGFkZGl0aW9uYWwgc29ydGluZyBpbiB0 aGUgZW5kCi1FWFBMQUlOIChDT1NUUyBPRkYpCi1TRUxFQ1QgZW1wbm8sCi0gICAgICAgZGVw bmFtZSwKLSAgICAgICBtaW4oc2FsYXJ5KSBPVkVSIChPUkRFUiBCWSBkZXBuYW1lKSBkZXBt aW5zYWxhcnkKLUZST00gZW1wc2FsYXJ5Ci1PUkRFUiBCWSBkZXBuYW1lLCBlbXBubzsKLSAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQotIFdpbmRvd0FnZwotICAgLT4gIFNvcnQKLSAgICAgICAgIFNv cnQgS2V5OiBkZXBuYW1lLCBlbXBubwotICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGVtcHNh bGFyeQotKDQgcm93cykKLQotLS0gU2FtZSBhcyBhYm92ZSwgYnV0IFBBUlRJVElPTiBCWSBj bGF1c2UgaXMgaW5jbHVkZWQgYXMgd2VsbAotRVhQTEFJTiAoQ09TVFMgT0ZGKQotU0VMRUNU IGVtcG5vLAotICAgICAgIGRlcG5hbWUsCi0gICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFS VElUSU9OIEJZIGRlcG5hbWUgT1JERVIgQlkgZW1wbm8pIGRlcG1pbnNhbGFyeQotRlJPTSBl bXBzYWxhcnkKLU9SREVSIEJZIGRlcG5hbWUsIGVtcG5vLCBlbnJvbGxfZGF0ZTsKLSAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFdpbmRvd0FnZwotICAg LT4gIFNvcnQKLSAgICAgICAgIFNvcnQgS2V5OiBkZXBuYW1lLCBlbXBubywgZW5yb2xsX2Rh dGUKLSAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlbXBzYWxhcnkKLSg0IHJvd3MpCi0KLS0t IE5lZ2F0aW9uIG9mIGFib3ZlLCB3aGVuIHNvcnQgb3B0aW1pemF0aW9uIGlzIG5vdCBuZWVk ZWQgdG8gYmUgcGVyZm9ybWVkCi1FWFBMQUlOIChDT1NUUyBPRkYpCi1TRUxFQ1QgZW1wbm8s Ci0gICAgICAgZGVwbmFtZSwKLSAgICAgICBtaW4oc2FsYXJ5KSBPVkVSIChQQVJUSVRJT04g QlkgZGVwbmFtZSBPUkRFUiBCWSBlbXBubykgZGVwbWluc2FsYXJ5Ci1GUk9NIGVtcHNhbGFy eQotT1JERVIgQlkgZW1wbm8sIGVucm9sbF9kYXRlOwotICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCi0gU29ydAotICAgU29ydCBLZXk6IGVtcG5vLCBlbnJvbGxfZGF0ZQotICAg LT4gIFdpbmRvd0FnZwotICAgICAgICAgLT4gIFNvcnQKLSAgICAgICAgICAgICAgIFNvcnQg S2V5OiBkZXBuYW1lLCBlbXBubwotICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGVt cHNhbGFyeQotKDYgcm93cykKLQotLS0gT1JERVIgQlkncyBpbiBtdWx0aXBsZSBXaW5kb3cg ZnVuY3Rpb25zIGNhbiBiZSBjb21iaW5lZCBpbnRvIG9uZQotLS0gaWYgdGhleSBhcmUgc3Vi c2V0IG9mIFFVRVJZJ3MgT1JERVIgQlkKLUVYUExBSU4gKENPU1RTIE9GRikKLVNFTEVDVCBl bXBubywKLSAgICAgICBkZXBuYW1lLAotICAgICAgIG1pbihzYWxhcnkpIE9WRVIgKFBBUlRJ VElPTiBCWSBkZXBuYW1lIE9SREVSIEJZIGVtcG5vKSBkZXBtaW5zYWxhcnksCi0gICAgICAg c3VtKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUpIGRlcHNhbGFyeSwKLSAg ICAgICBjb3VudCgqKSBPVkVSIChPUkRFUiBCWSBlbnJvbGxfZGF0ZSBERVNDKSBjCi1GUk9N IGVtcHNhbGFyeQotT1JERVIgQlkgZGVwbmFtZSwgZW1wbm8sIGVucm9sbF9kYXRlOwotICAg ICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K LSBXaW5kb3dBZ2cKLSAgIC0+ICBXaW5kb3dBZ2cKLSAgICAgICAgIC0+ICBTb3J0Ci0gICAg ICAgICAgICAgICBTb3J0IEtleTogZGVwbmFtZSwgZW1wbm8sIGVucm9sbF9kYXRlCi0gICAg ICAgICAgICAgICAtPiAgV2luZG93QWdnCi0gICAgICAgICAgICAgICAgICAgICAtPiAgU29y dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydCBLZXk6IGVucm9sbF9kYXRlIERF U0MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlbXBzYWxh cnkKLSg4IHJvd3MpCi0KLS0tIG9yZGVyIG9mIHdpbmRvdyBmdW5jdGlvbiBzaG91bGRuJ3Qg YWZmZWN0IHF1ZXJ5J3MgT1JERVIgQlkgcHVzaGRvd24KLUVYUExBSU4gKENPU1RTIE9GRikK LVNFTEVDVCBlbXBubywKLSAgICAgICBkZXBuYW1lLAotICAgICAgIGNvdW50KCopIE9WRVIg KE9SREVSIEJZIGVucm9sbF9kYXRlIERFU0MpIGMsCi0gICAgICAgc3VtKHNhbGFyeSkgT1ZF UiAoUEFSVElUSU9OIEJZIGRlcG5hbWUpIGRlcHNhbGFyeSwKLSAgICAgICBtaW4oc2FsYXJ5 KSBPVkVSIChQQVJUSVRJT04gQlkgZGVwbmFtZSBPUkRFUiBCWSBlbXBubykgZGVwbWluc2Fs YXJ5Ci1GUk9NIGVtcHNhbGFyeQotT1JERVIgQlkgZGVwbmFtZSwgZW1wbm8sIGVucm9sbF9k YXRlOwotICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAg ICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KLSBXaW5kb3dBZ2cKLSAgIC0+ICBXaW5kb3dBZ2cKLSAgICAgICAgIC0+ICBT b3J0Ci0gICAgICAgICAgICAgICBTb3J0IEtleTogZGVwbmFtZSwgZW1wbm8sIGVucm9sbF9k YXRlCi0gICAgICAgICAgICAgICAtPiAgV2luZG93QWdnCi0gICAgICAgICAgICAgICAgICAg ICAtPiAgU29ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydCBLZXk6IGVucm9s bF9kYXRlIERFU0MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBv biBlbXBzYWxhcnkKLSg4IHJvd3MpCi0KLS0tIFNPUlQgT1BUSU1JWkFUSU9OIChhcyBpbiBj YXNlcyBhYm92ZSkgaXMgbm90IG5lZWRlZCB0byBiZSBwZXJmb3JtZWQKLS0tIGluIGNhc2Vz LCBhcyBtZW50aW9uZWQgYmVsb3cuCi0tLSBDYXNlICMxOiBXaGVuIGRpc3RpbmN0IGNsYXVz ZSBpcyBpbmNsdWRlZAotRVhQTEFJTiAoQ09TVFMgT0ZGKQotU0VMRUNUIERJU1RJTkNUIGVt cG5vLAotICAgICAgIGRlcG5hbWUsCi0gICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFSVElU SU9OIEJZIGRlcG5hbWUpIGRlcG1pbnNhbGFyeSwKLSAgICAgICBzdW0oc2FsYXJ5KSBPVkVS IChQQVJUSVRJT04gQlkgZGVwbmFtZSkgZGVwc2FsYXJ5LAotICAgICAgIGNvdW50KCopIE9W RVIgKE9SREVSIEJZIGVucm9sbF9kYXRlIERFU0MpIGMKLUZST00gZW1wc2FsYXJ5Ci1PUkRF UiBCWSBkZXBuYW1lLCBlbXBubzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KLSBVbmlxdWUKLSAgIC0+ICBTb3J0Ci0gICAgICAgICBTb3J0IEtl eTogZGVwbmFtZSwgZW1wbm8sIChtaW4oc2FsYXJ5KSBPVkVSICg/KSksIChzdW0oc2FsYXJ5 KSBPVkVSICg/KSksIChjb3VudCgqKSBPVkVSICg/KSkKLSAgICAgICAgIC0+ICBXaW5kb3dB Z2cKLSAgICAgICAgICAgICAgIC0+ICBTb3J0Ci0gICAgICAgICAgICAgICAgICAgICBTb3J0 IEtleTogZGVwbmFtZQotICAgICAgICAgICAgICAgICAgICAgLT4gIFdpbmRvd0FnZwotICAg ICAgICAgICAgICAgICAgICAgICAgICAgLT4gIFNvcnQKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFNvcnQgS2V5OiBlbnJvbGxfZGF0ZSBERVNDCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gZW1wc2FsYXJ5Ci0oMTAgcm93 cykKLQotLS0gQ2FzZSAjMjogV2hlbiBMaW1pdCBjbGF1c2UgaXMgc3BlY2lmaWVkCi1FWFBM QUlOIChDT1NUUyBPRkYpCi1TRUxFQ1QgZW1wbm8sCi0gICAgICAgZGVwbmFtZSwKLSAgICAg ICBtaW4oc2FsYXJ5KSBPVkVSIChQQVJUSVRJT04gQlkgZW1wbm8pIGRlcG1pbnNhbGFyeSwK LSAgICAgICBzdW0oc2FsYXJ5KSBPVkVSIChQQVJUSVRJT04gQlkgZW1wbm8pIGRlcHNhbGFy eQotRlJPTSBlbXBzYWxhcnkKLU9SREVSIEJZIGVtcG5vLCBkZXBuYW1lIExJTUlUIDE7Ci0g ICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgIAotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBMaW1pdAotICAg LT4gIEluY3JlbWVudGFsIFNvcnQKLSAgICAgICAgIFNvcnQgS2V5OiBlbXBubywgZGVwbmFt ZQotICAgICAgICAgUHJlc29ydGVkIEtleTogZW1wbm8KLSAgICAgICAgIC0+ICBXaW5kb3dB Z2cKLSAgICAgICAgICAgICAgIC0+ICBTb3J0Ci0gICAgICAgICAgICAgICAgICAgICBTb3J0 IEtleTogZW1wbm8KLSAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlbXBz YWxhcnkKLSg4IHJvd3MpCi0KLS0tIENhc2UgIzM6IFdoZW4gT1JERVIgQlkgY29udGFpbnMg YW55IFdpbmRvd0Z1bmNzCi1FWFBMQUlOIChDT1NUUyBPRkYpCi1TRUxFQ1QgZW1wbm8sCi0g ICAgICAgcm93X251bWJlcigpIG92ZXIgKFBBUlRJVElPTiBCWSBlbXBubykgZXNhbGFyeQot RlJPTSBlbXBzYWxhcnkKLU9SREVSIEJZIGVtcG5vLCBlc2FsYXJ5OwotICAgICAgICAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSW5jcmVtZW50YWwgU29ydAotICAgU29ydCBL ZXk6IGVtcG5vLCAocm93X251bWJlcigpIE9WRVIgKD8pKQotICAgUHJlc29ydGVkIEtleTog ZW1wbm8KLSAgIC0+ICBXaW5kb3dBZ2cKLSAgICAgICAgIC0+ICBTb3J0Ci0gICAgICAgICAg ICAgICBTb3J0IEtleTogZW1wbm8KLSAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBl bXBzYWxhcnkKLSg3IHJvd3MpCi0KLS0tIENhc2UgIzQ6IFdoZW4gV2luZG93RnVuYyBPUkRF UiBCWSBpcyBzdXBlcnNldCBvZiBRVUVSWSdzIE9SREVSIEJZCi1FWFBMQUlOIChDT1NUUyBP RkYpCi1TRUxFQ1QgZW1wbm8sCi0gICAgICAgc3VtKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9O IEJZIGRlcG5hbWUpIGRlcHNhbGFyeSwKLSAgICAgICBtaW4oc2FsYXJ5KSBPVkVSIChQQVJU SVRJT04gQlkgZGVwbmFtZSBPUkRFUiBCWSBlbXBubykgZGVwbWluc2FsYXJ5Ci1GUk9NIGVt cHNhbGFyeQotT1JERVIgQlkgZGVwbmFtZTsKLSAgICAgICAgICAgICAgIFFVRVJZIFBMQU4g ICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQotIFdpbmRvd0FnZwotICAgLT4gIFdpbmRvd0FnZwotICAgICAgICAgLT4gIFNvcnQK LSAgICAgICAgICAgICAgIFNvcnQgS2V5OiBkZXBuYW1lLCBlbXBubwotICAgICAgICAgICAg ICAgLT4gIFNlcSBTY2FuIG9uIGVtcHNhbGFyeQotKDUgcm93cykKLQogLS0gVGVzdCBTb3J0 IG5vZGUgcmVvcmRlcmluZwogRVhQTEFJTiAoQ09TVFMgT0ZGKQogU0VMRUNUCmRpZmYgLS1n aXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC93aW5kb3cuc3FsIGIvc3JjL3Rlc3QvcmVncmVz cy9zcWwvd2luZG93LnNxbAppbmRleCA2NjVlMTU2OTIwLi5iN2JkMGE4M2RhIDEwMDY0NAot LS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC93aW5kb3cuc3FsCisrKyBiL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL3dpbmRvdy5zcWwKQEAgLTEzMjQsMTEwICsxMzI0LDggQEAgU0VMRUNUIERJ U1RJTkNUCiBGUk9NIGVtcHNhbGFyeQogT1JERVIgQlkgZGVwbmFtZSwgZW1wbm87CiAKLS0t IERvIG5vdCBwZXJmb3JtIHNvcnQgcHVzaGRvd24gaWYgY29sdW1uIGlzIHByZXNvcnRlZAot Q1JFQVRFIElOREVYIGRlcG5hbWVfaWR4IE9OIGVtcHNhbGFyeShkZXBuYW1lKTsKLVNFVCBl bmFibGVfc2Vxc2Nhbj0wOwotCi1FWFBMQUlOIChDT1NUUyBPRkYpCi1TRUxFQ1QgZW1wbm8s Ci0gICAgICAgIG1pbihzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lKSBkZXBt aW5zYWxhcnkKLUZST00gZW1wc2FsYXJ5Ci1PUkRFUiBCWSBkZXBuYW1lLCBlbXBubzsKLQot LS0gRG8gcGVyZm9ybSBzb3J0IHB1c2hkb3duIGlmIGNvbHVtbnMgYXJlIG9ubHkgcGFydGlh bGx5IHNvcnRlZAotRVhQTEFJTiAoQ09TVFMgT0ZGKQotU0VMRUNUIGVtcG5vLAotICAgICAg ICBtaW4oc2FsYXJ5KSBPVkVSIChQQVJUSVRJT04gQlkgZGVwbmFtZSwgZW1wbm8pIGRlcG1p bnNhbGFyeQotRlJPTSBlbXBzYWxhcnkKLU9SREVSIEJZIGRlcG5hbWUsIGVtcG5vLCBlbnJv bGxfZGF0ZTsKLQotRFJPUCBJTkRFWCBkZXBuYW1lX2lkeDsKLVJFU0VUIGVuYWJsZV9zZXFz Y2FuOwogUkVTRVQgZW5hYmxlX2hhc2hhZ2c7CiAKLS0tIElmIHdpbmRvdyBmdW5jdGlvbidz IE9SREVSIEJZIGlzIHN1YnNldCBvZiBRVUVSWSdzIE9SREVSIEJZLCBzb3J0IGFzIHBlciBh cwotLS0gUVVFUlkncyBPUkRFUiBCWSB0byBzYXZlIGFkZGl0aW9uYWwgc29ydGluZyBpbiB0 aGUgZW5kCi1FWFBMQUlOIChDT1NUUyBPRkYpCi1TRUxFQ1QgZW1wbm8sCi0gICAgICAgZGVw bmFtZSwKLSAgICAgICBtaW4oc2FsYXJ5KSBPVkVSIChPUkRFUiBCWSBkZXBuYW1lKSBkZXBt aW5zYWxhcnkKLUZST00gZW1wc2FsYXJ5Ci1PUkRFUiBCWSBkZXBuYW1lLCBlbXBubzsKLQot LS0gU2FtZSBhcyBhYm92ZSwgYnV0IFBBUlRJVElPTiBCWSBjbGF1c2UgaXMgaW5jbHVkZWQg YXMgd2VsbAotRVhQTEFJTiAoQ09TVFMgT0ZGKQotU0VMRUNUIGVtcG5vLAotICAgICAgIGRl cG5hbWUsCi0gICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUg T1JERVIgQlkgZW1wbm8pIGRlcG1pbnNhbGFyeQotRlJPTSBlbXBzYWxhcnkKLU9SREVSIEJZ IGRlcG5hbWUsIGVtcG5vLCBlbnJvbGxfZGF0ZTsKLQotLS0gTmVnYXRpb24gb2YgYWJvdmUs IHdoZW4gc29ydCBvcHRpbWl6YXRpb24gaXMgbm90IG5lZWRlZCB0byBiZSBwZXJmb3JtZWQK LUVYUExBSU4gKENPU1RTIE9GRikKLVNFTEVDVCBlbXBubywKLSAgICAgICBkZXBuYW1lLAot ICAgICAgIG1pbihzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lIE9SREVSIEJZ IGVtcG5vKSBkZXBtaW5zYWxhcnkKLUZST00gZW1wc2FsYXJ5Ci1PUkRFUiBCWSBlbXBubywg ZW5yb2xsX2RhdGU7Ci0KLS0tIE9SREVSIEJZJ3MgaW4gbXVsdGlwbGUgV2luZG93IGZ1bmN0 aW9ucyBjYW4gYmUgY29tYmluZWQgaW50byBvbmUKLS0tIGlmIHRoZXkgYXJlIHN1YnNldCBv ZiBRVUVSWSdzIE9SREVSIEJZCi1FWFBMQUlOIChDT1NUUyBPRkYpCi1TRUxFQ1QgZW1wbm8s Ci0gICAgICAgZGVwbmFtZSwKLSAgICAgICBtaW4oc2FsYXJ5KSBPVkVSIChQQVJUSVRJT04g QlkgZGVwbmFtZSBPUkRFUiBCWSBlbXBubykgZGVwbWluc2FsYXJ5LAotICAgICAgIHN1bShz YWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lKSBkZXBzYWxhcnksCi0gICAgICAg Y291bnQoKikgT1ZFUiAoT1JERVIgQlkgZW5yb2xsX2RhdGUgREVTQykgYwotRlJPTSBlbXBz YWxhcnkKLU9SREVSIEJZIGRlcG5hbWUsIGVtcG5vLCBlbnJvbGxfZGF0ZTsKLQotLS0gb3Jk ZXIgb2Ygd2luZG93IGZ1bmN0aW9uIHNob3VsZG4ndCBhZmZlY3QgcXVlcnkncyBPUkRFUiBC WSBwdXNoZG93bgotRVhQTEFJTiAoQ09TVFMgT0ZGKQotU0VMRUNUIGVtcG5vLAotICAgICAg IGRlcG5hbWUsCi0gICAgICAgY291bnQoKikgT1ZFUiAoT1JERVIgQlkgZW5yb2xsX2RhdGUg REVTQykgYywKLSAgICAgICBzdW0oc2FsYXJ5KSBPVkVSIChQQVJUSVRJT04gQlkgZGVwbmFt ZSkgZGVwc2FsYXJ5LAotICAgICAgIG1pbihzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBk ZXBuYW1lIE9SREVSIEJZIGVtcG5vKSBkZXBtaW5zYWxhcnkKLUZST00gZW1wc2FsYXJ5Ci1P UkRFUiBCWSBkZXBuYW1lLCBlbXBubywgZW5yb2xsX2RhdGU7Ci0KLS0tIFNPUlQgT1BUSU1J WkFUSU9OIChhcyBpbiBjYXNlcyBhYm92ZSkgaXMgbm90IG5lZWRlZCB0byBiZSBwZXJmb3Jt ZWQKLS0tIGluIGNhc2VzLCBhcyBtZW50aW9uZWQgYmVsb3cuCi0KLS0tIENhc2UgIzE6IFdo ZW4gZGlzdGluY3QgY2xhdXNlIGlzIGluY2x1ZGVkCi1FWFBMQUlOIChDT1NUUyBPRkYpCi1T RUxFQ1QgRElTVElOQ1QgZW1wbm8sCi0gICAgICAgZGVwbmFtZSwKLSAgICAgICBtaW4oc2Fs YXJ5KSBPVkVSIChQQVJUSVRJT04gQlkgZGVwbmFtZSkgZGVwbWluc2FsYXJ5LAotICAgICAg IHN1bShzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lKSBkZXBzYWxhcnksCi0g ICAgICAgY291bnQoKikgT1ZFUiAoT1JERVIgQlkgZW5yb2xsX2RhdGUgREVTQykgYwotRlJP TSBlbXBzYWxhcnkKLU9SREVSIEJZIGRlcG5hbWUsIGVtcG5vOwotCi0tLSBDYXNlICMyOiBX aGVuIExpbWl0IGNsYXVzZSBpcyBzcGVjaWZpZWQKLUVYUExBSU4gKENPU1RTIE9GRikKLVNF TEVDVCBlbXBubywKLSAgICAgICBkZXBuYW1lLAotICAgICAgIG1pbihzYWxhcnkpIE9WRVIg KFBBUlRJVElPTiBCWSBlbXBubykgZGVwbWluc2FsYXJ5LAotICAgICAgIHN1bShzYWxhcnkp IE9WRVIgKFBBUlRJVElPTiBCWSBlbXBubykgZGVwc2FsYXJ5Ci1GUk9NIGVtcHNhbGFyeQot T1JERVIgQlkgZW1wbm8sIGRlcG5hbWUgTElNSVQgMTsKLQotLS0gQ2FzZSAjMzogV2hlbiBP UkRFUiBCWSBjb250YWlucyBhbnkgV2luZG93RnVuY3MKLUVYUExBSU4gKENPU1RTIE9GRikK LVNFTEVDVCBlbXBubywKLSAgICAgICByb3dfbnVtYmVyKCkgb3ZlciAoUEFSVElUSU9OIEJZ IGVtcG5vKSBlc2FsYXJ5Ci1GUk9NIGVtcHNhbGFyeQotT1JERVIgQlkgZW1wbm8sIGVzYWxh cnk7Ci0KLS0tIENhc2UgIzQ6IFdoZW4gV2luZG93RnVuYyBPUkRFUiBCWSBpcyBzdXBlcnNl dCBvZiBRVUVSWSdzIE9SREVSIEJZCi1FWFBMQUlOIChDT1NUUyBPRkYpCi1TRUxFQ1QgZW1w bm8sCi0gICAgICAgc3VtKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUpIGRl cHNhbGFyeSwKLSAgICAgICBtaW4oc2FsYXJ5KSBPVkVSIChQQVJUSVRJT04gQlkgZGVwbmFt ZSBPUkRFUiBCWSBlbXBubykgZGVwbWluc2FsYXJ5Ci1GUk9NIGVtcHNhbGFyeQotT1JERVIg QlkgZGVwbmFtZTsKLQogLS0gVGVzdCBTb3J0IG5vZGUgcmVvcmRlcmluZwogRVhQTEFJTiAo Q09TVFMgT0ZGKQogU0VMRUNUCg== --------------0wMcE35J1zLwDg2yaJYESCri--