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 1thOna-001yjB-9r for pgsql-hackers@arkaria.postgresql.org; Mon, 10 Feb 2025 08:05:46 +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 1thOnY-003bEJ-FC for pgsql-hackers@arkaria.postgresql.org; Mon, 10 Feb 2025 08:05:44 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1thOnX-003bEA-Sc for pgsql-hackers@lists.postgresql.org; Mon, 10 Feb 2025 08:05:44 +0000 Received: from forward101a.mail.yandex.net ([2a02:6b8:c0e:500:1:45:d181:d101]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1thOnT-004I5J-1T for pgsql-hackers@postgresql.org; Mon, 10 Feb 2025 08:05:42 +0000 Received: from mail-nwsmtp-smtp-production-main-55.vla.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-55.vla.yp-c.yandex.net [IPv6:2a02:6b8:c0d:20a:0:640:1f30:0]) by forward101a.mail.yandex.net (Yandex) with ESMTPS id 9486E60EB1; Mon, 10 Feb 2025 11:05:34 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-55.vla.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id U5lGdk0Oi4Y0-yMihe74S; Mon, 10 Feb 2025 11:05:33 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1739174733; bh=O6rmWNnU3sY+XHp8pbg302asB5OXRVDY4NcdZx9kQHM=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=HUmhcdBOHFwQZd398QuhUvdJF9QQuq8JUYNADg0dX08NSw5sZEbHEOKQznHnU2m4L 2/hUQ9LxM95l+oXYqgtu2I2Pcf3az13kELPwHueFFCIEgmbKARJ5yKqRx+7w47O5Au OOMAtA5puBuhRMrIBHSiXcMyaIY4RVU/9+PKijrA= Authentication-Results: mail-nwsmtp-smtp-production-main-55.vla.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------5A1EOYBs1isLWH0SMAZDnoGA" Message-ID: <3546e2a7-5831-4c0a-996b-358d4ec483a6@tantorlabs.com> Date: Mon, 10 Feb 2025 11:05:29 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Sample rate added to pg_stat_statements From: Ilia Evdokimov To: Sami Imseih , Alexander Korotkov , Michael Paquier , Greg Sabino Mullane , Andrey Borodin , Alena Rybakina Cc: pgsql-hackers References: <6cf6270b-e8fa-4d99-b74a-17e781cdf309@tantorlabs.com> <3a27c830-b81f-4560-9774-a87d9b922fbd@tantorlabs.com> <7AD765EF-14DE-4B3E-8282-E82A9B44DBAA@yandex-team.ru> <0c7770bd-9750-4200-a472-bdb262583c2f@tantorlabs.com> <18631d46-1741-4edc-b116-8d9631cdf919@tantorlabs.com> <4f98ec33-c627-4eb4-84f3-9994a0982277@tantorlabs.com> <623db69f-b40a-4d50-b1bd-bb073fcc4336@tantorlabs.com> Content-Language: en-US In-Reply-To: <623db69f-b40a-4d50-b1bd-bb073fcc4336@tantorlabs.com> 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. --------------5A1EOYBs1isLWH0SMAZDnoGA Content-Type: multipart/alternative; boundary="------------lzyosQTpEPnz8nyRjErIjQn9" --------------lzyosQTpEPnz8nyRjErIjQn9 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi hackers, Since current patch is in the commitfest with the status 'Ready for committer', I’d like to summarize what it does, the problems it addresses, and answer the key questions raised in the discussion thread. Enabling pg_stat_statements can cause a performance drop due to two main reasons: * Contention on the exclusive lock, which blocks the hash table when allocating or deallocating an entry. * Contention on the spinlock, which blocks access to an existing entry. The exclusive lock issue can be mitigated by normalizing similar queries to the same queryid. There is an ongoing thread discussing this approach for IN and ARRAY queries: [0]. Another solution is integrating pg_stat_statements into central pgstats with the custom APIs, without pushing the module into core [1]. However, even if we do all that, the spinlock contention problem will persist for very frequent queries. This is exactly what I aim to solve with sampling. Other approaches, such as replacing the spinlock with atomic variables or an lwlock, have not yielded good results [2]. Even track_planning was disabled by default to reduce contention, but on high-core systems, the issue still remains.So far, I see no alternative solution to this problem. The benchmark results on different number of CPUs demonstrating the impact of this patch can be found here: pgbench -c{CPUs} -j20 -S -Mprepared -T120   CPUs | sample_rate |   tps | CPU waits | ClientRead wait | SpinDelay wait    192 |         1.0 | 484338|      9568 |             929 | 11107    192 |        0.75 | 909547|     12079 |            2100 | 4781    192 |         0.5 |1028594|     13253 |            3378 | 174    192 |        0.25 |1019507|     13397 |            3423 | -    192 |         0.0 |1015425|     13106 |            3502 | -     48 |         1.0 | 643251|       911 |             932 | 44     48 |        0.75 | 653946|       939 |             939 |  3     48 |         0.5 | 651654|       841 |             932 | -     48 |        0.25 | 652668|       860 |             910 | -     48 |         0.0 | 659111|       849 |             882 | -     32 |         1.0 | 620667|      1782 |             560 | -     32 |        0.75 | 620663|      1736 |             554 | -     32 |         0.5 | 624094|      1741 |             648 | -     32 |        0.25 | 628638|      1702 |             576 | -     32 |         0.0 | 630483|      1638 |             574 | - Some suggested sampling based on execution time instead of a random generator. While this is a good idea, it has a critical limitation. Execution time can only be checked in pgss_ExecutorEnd. However, pgss_planner already interacts with the spinlock, and we can not sample based on execution time at that stage. Finding a criterion that works for both pgss_planner and pgss_ExecutorEnd is difficult. This is why random sampling remains the most viable option. BTW, Instead of using a bool flag to check if we are inside pgss_post_parse_analyze, we now pass a pgssStoreKind to pgss_enabled. This makes the logic clearer and more readable, explicitly indicating where we need to check whether a query should be sampled. I made it in new v15 patch. Are there any remaining concerns or alternative suggestions regarding this approach? I'm happy to discuss further. [0]: https://commitfest.postgresql.org/51/2837/ [1]: https://www.postgresql.org/message-id/Zz0MFPq1s4WFxxpL%40paquier.xyz [2]: https://commitfest.postgresql.org/29/2634/ -- Best regards, Ilia Evdokimov, Tantor Labs LLC. --------------lzyosQTpEPnz8nyRjErIjQn9 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hi hackers,

Since current patch is in the commitfest with the status 'Ready for committer', I’d like to summarize what it does, the problems it addresses, and answer the key questions raised in the discussion thread.

Enabling pg_stat_statements can cause a performance drop due to two main reasons:

  • Contention on the exclusive lock, which blocks the hash table when allocating or deallocating an entry.
  • Contention on the spinlock, which blocks access to an existing entry.

The exclusive lock issue can be mitigated by normalizing similar queries to the same queryid. There is an ongoing thread discussing this approach for IN and ARRAY queries: [0]. Another solution is integrating pg_stat_statements into central pgstats with the custom APIs, without pushing the module into core [1].

However, even if we do all that, the spinlock contention problem will persist for very frequent queries. This is exactly what I aim to solve with sampling. Other approaches, such as replacing the spinlock with atomic variables or an lwlock, have not yielded good results [2]. Even track_planning was disabled by default to reduce contention, but on high-core systems, the issue still remains.So far, I see no alternative solution to this problem.

The benchmark results on different number of CPUs demonstrating the impact of this patch can be found here:

pgbench -c{CPUs} -j20 -S -Mprepared -T120
  CPUs | sample_rate |   tps | CPU waits | ClientRead wait | SpinDelay wait
   192 |         1.0 | 484338|      9568 |             929 | 11107
   192 |        0.75 | 909547|     12079 |            2100 | 4781
   192 |         0.5 |1028594|     13253 |            3378 | 174
   192 |        0.25 |1019507|     13397 |            3423 | -
   192 |         0.0 |1015425|     13106 |            3502 | -

    48 |         1.0 | 643251|       911 |             932 | 44
    48 |        0.75 | 653946|       939 |             939 |  3
    48 |         0.5 | 651654|       841 |             932 | -
    48 |        0.25 | 652668|       860 |             910 | -
    48 |         0.0 | 659111|       849 |             882 | -

    32 |         1.0 | 620667|      1782 |             560 | -
    32 |        0.75 | 620663|      1736 |             554 | -
    32 |         0.5 | 624094|      1741 |             648 | -
    32 |        0.25 | 628638|      1702 |             576 | -
    32 |         0.0 | 630483|      1638 |             574 | -

Some suggested sampling based on execution time instead of a random generator. While this is a good idea, it has a critical limitation. Execution time can only be checked in pgss_ExecutorEnd. However, pgss_planner already interacts with the spinlock, and we can not sample based on execution time at that stage. Finding a criterion that works for both pgss_planner and pgss_ExecutorEnd is difficult. This is why random sampling remains the most viable option.

BTW, Instead of using a bool flag to check if we are inside pgss_post_parse_analyze, we now pass a pgssStoreKind to pgss_enabled. This makes the logic clearer and more readable, explicitly indicating where we need to check whether a query should be sampled. I made it in new v15 patch.

Are there any remaining concerns or alternative suggestions regarding this approach? I'm happy to discuss further.

[0]: https://commitfest.postgresql.org/51/2837/
[1]: https://www.postgresql.org/message-id/Zz0MFPq1s4WFxxpL%40paquier.xyz
[2]: https://commitfest.postgresql.org/29/2634/

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC.

--------------lzyosQTpEPnz8nyRjErIjQn9-- --------------5A1EOYBs1isLWH0SMAZDnoGA Content-Type: text/x-patch; charset=UTF-8; name="v15-0001-Allow-setting-sample-rate-for-pg_stat_statements.patch" Content-Disposition: attachment; filename*0="v15-0001-Allow-setting-sample-rate-for-pg_stat_statements.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBjOTU0MGZhYzlmNmQ2YWQ2ZDE1YWNkYWFkODQ0Y2E2YzRlY2JhNDU1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5ydT4KRGF0ZTogTW9uLCAxMCBGZWIgMjAyNSAxMTowMDo0NiArMDMwMApT dWJqZWN0OiBbUEFUQ0hdIEFsbG93IHNldHRpbmcgc2FtcGxlIHJhdGUgZm9yIHBnX3N0YXRf c3RhdGVtZW50cwoKTmV3IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHBnX3N0YXRfc3RhdGVt ZW50cy5zYW1wbGVfcmF0ZSBtYWtlcyBpdApwb3NzaWJsZSB0byB0cmFjayBqdXN0IGEgZnJh Y3Rpb24gb2YgdGhlIHF1ZXJpZXMgbWVldGluZyB0aGUgY29uZmlndXJlZAp0aHJlc2hvbGQs IHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIHRyYWNraW5nLgotLS0KIGNvbnRyaWIvcGdfc3Rh dF9zdGF0ZW1lbnRzL01ha2VmaWxlICAgICAgICAgICB8ICAgMiArLQogLi4uL3BnX3N0YXRf c3RhdGVtZW50cy9leHBlY3RlZC9zYW1wbGluZy5vdXQgIHwgMTc0ICsrKysrKysrKysrKysr KysrKwogY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvbWVzb24uYnVpbGQgICAgICAgIHwg ICAxICsKIC4uLi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMgICB8 ICA1MyArKysrKy0KIGNvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3NxbC9zYW1wbGluZy5z cWwgICB8ICA1MCArKysrKwogZG9jL3NyYy9zZ21sL3Bnc3RhdHN0YXRlbWVudHMuc2dtbCAg ICAgICAgICAgIHwgIDE5ICsrCiA2IGZpbGVzIGNoYW5nZWQsIDI5MSBpbnNlcnRpb25zKCsp LCA4IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGNvbnRyaWIvcGdfc3RhdF9z dGF0ZW1lbnRzL2V4cGVjdGVkL3NhbXBsaW5nLm91dAogY3JlYXRlIG1vZGUgMTAwNjQ0IGNv bnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3NxbC9zYW1wbGluZy5zcWwKCmRpZmYgLS1naXQg YS9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9NYWtlZmlsZSBiL2NvbnRyaWIvcGdfc3Rh dF9zdGF0ZW1lbnRzL01ha2VmaWxlCmluZGV4IDI0MWMwMjU4N2IuLmI3MGJkZmFmMmQgMTAw NjQ0Ci0tLSBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL01ha2VmaWxlCisrKyBiL2Nv bnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL01ha2VmaWxlCkBAIC0yMCw3ICsyMCw3IEBAIExE RkxBR1NfU0wgKz0gJChmaWx0ZXIgLWxtLCAkKExJQlMpKQogUkVHUkVTU19PUFRTID0gLS10 ZW1wLWNvbmZpZyAkKHRvcF9zcmNkaXIpL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3Bn X3N0YXRfc3RhdGVtZW50cy5jb25mCiBSRUdSRVNTID0gc2VsZWN0IGRtbCBjdXJzb3JzIHV0 aWxpdHkgbGV2ZWxfdHJhY2tpbmcgcGxhbm5pbmcgXAogCXVzZXJfYWN0aXZpdHkgd2FsIGVu dHJ5X3RpbWVzdGFtcCBwcml2aWxlZ2VzIGV4dGVuZGVkIFwKLQlwYXJhbGxlbCBjbGVhbnVw IG9sZGV4dHZlcnNpb25zCisJcGFyYWxsZWwgc2FtcGxpbmcgY2xlYW51cCBvbGRleHR2ZXJz aW9ucwogIyBEaXNhYmxlZCBiZWNhdXNlIHRoZXNlIHRlc3RzIHJlcXVpcmUgInNoYXJlZF9w cmVsb2FkX2xpYnJhcmllcz1wZ19zdGF0X3N0YXRlbWVudHMiLAogIyB3aGljaCB0eXBpY2Fs IGluc3RhbGxjaGVjayB1c2VycyBkbyBub3QgaGF2ZSAoZS5nLiBidWlsZGZhcm0gY2xpZW50 cykuCiBOT19JTlNUQUxMQ0hFQ0sgPSAxCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0YXRf c3RhdGVtZW50cy9leHBlY3RlZC9zYW1wbGluZy5vdXQgYi9jb250cmliL3BnX3N0YXRfc3Rh dGVtZW50cy9leHBlY3RlZC9zYW1wbGluZy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMC4uMjIwNDIxNWY2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIv cGdfc3RhdF9zdGF0ZW1lbnRzL2V4cGVjdGVkL3NhbXBsaW5nLm91dApAQCAtMCwwICsxLDE3 NCBAQAorLS0KKy0tIHNhbXBsZSBzdGF0ZW1lbnRzCistLQorLS0gdG9wLWxldmVsIHRyYWNr aW5nIC0gc2ltcGxlIHF1ZXJ5IHByb3RvY29sCitTSE9XIHBnX3N0YXRfc3RhdGVtZW50cy50 cmFjazsKKyBwZ19zdGF0X3N0YXRlbWVudHMudHJhY2sgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIHRvcAorKDEgcm93KQorCitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBs ZV9yYXRlID0gMC4wOworU0VMRUNUIHBnX3N0YXRfc3RhdGVtZW50c19yZXNldCgpIElTIE5P VCBOVUxMIEFTIHQ7CisgdCAKKy0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIDEgQVMgImlu dCI7CisgaW50IAorLS0tLS0KKyAgIDEKKygxIHJvdykKKworU0VMRUNUIHF1ZXJ5LCBjYWxs cyBGUk9NIHBnX3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVyeSBDT0xMQVRFICJDIjsK KyBxdWVyeSB8IGNhbGxzIAorLS0tLS0tLSstLS0tLS0tCisoMCByb3dzKQorCitTRVQgcGdf c3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0gMS4wOworU0VMRUNUIDEgQVMgImludCI7 CisgaW50IAorLS0tLS0KKyAgIDEKKygxIHJvdykKKworU0VMRUNUIHF1ZXJ5LCBjYWxscyBG Uk9NIHBnX3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVyeSBDT0xMQVRFICJDIjsKKyAg ICAgICBxdWVyeSAgICAgICAgfCBjYWxscyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0KKyBTRUxFQ1QgJDEgQVMgImludCIgfCAgICAgMQorKDEgcm93KQorCistLSB0b3AtbGV2 ZWwgdHJhY2tpbmcgLSBleHRlbmRlZCBxdWVyeSBwcm90b2NvbAorU0VUIHBnX3N0YXRfc3Rh dGVtZW50cy5zYW1wbGVfcmF0ZSA9IDAuMDsKK1NFTEVDVCBwZ19zdGF0X3N0YXRlbWVudHNf cmVzZXQoKSBJUyBOT1QgTlVMTCBBUyB0OworIHQgCistLS0KKyB0CisoMSByb3cpCisKK1NF TEVDVCAxIFxwYXJzZSBzdG10CitcYmluZF9uYW1lZCBzdG10IFxnCisgP2NvbHVtbj8gCist LS0tLS0tLS0tCisgICAgICAgIDEKKygxIHJvdykKKworU0VMRUNUIHF1ZXJ5LCBjYWxscyBG Uk9NIHBnX3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVyeSBDT0xMQVRFICJDIjsKKyBx dWVyeSB8IGNhbGxzIAorLS0tLS0tLSstLS0tLS0tCisoMCByb3dzKQorCitTRVQgcGdfc3Rh dF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0gMS4wOworXGJpbmRfbmFtZWQgc3RtdCBcZwor ID9jb2x1bW4/IAorLS0tLS0tLS0tLQorICAgICAgICAxCisoMSByb3cpCisKK1NFTEVDVCBx dWVyeSwgY2FsbHMgRlJPTSBwZ19zdGF0X3N0YXRlbWVudHMgT1JERVIgQlkgcXVlcnkgQ09M TEFURSAiQyI7CisgICBxdWVyeSAgIHwgY2FsbHMgCistLS0tLS0tLS0tLSstLS0tLS0tCisg U0VMRUNUICQxIHwgICAgIDEKKygxIHJvdykKKworU0VMRUNUIHBnX3N0YXRfc3RhdGVtZW50 c19yZXNldCgpIElTIE5PVCBOVUxMIEFTIHQ7CisgdCAKKy0tLQorIHQKKygxIHJvdykKKwor REVBTExPQ0FURSBzdG10OworLS0gbmVzdGVkIHRyYWNraW5nIC0gc2ltcGxlIHF1ZXJ5IHBy b3RvY29sCitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnRyYWNrID0gImFsbCI7CitTRUxFQ1Qg cGdfc3RhdF9zdGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5VTEwgQVMgdDsKKyB0IAorLS0t CisgdAorKDEgcm93KQorCitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0g MTsKK0VYUExBSU4gKENPU1RTIE9GRikgU0VMRUNUIDE7CisgUVVFUlkgUExBTiAKKy0tLS0t LS0tLS0tLQorIFJlc3VsdAorKDEgcm93KQorCitFWFBMQUlOIChDT1NUUyBPRkYpIFNFTEVD VCAxOworIFFVRVJZIFBMQU4gCistLS0tLS0tLS0tLS0KKyBSZXN1bHQKKygxIHJvdykKKwor U0VUIHBnX3N0YXRfc3RhdGVtZW50cy5zYW1wbGVfcmF0ZSA9IDA7CitFWFBMQUlOIChDT1NU UyBPRkYpIFNFTEVDVCAxOworIFFVRVJZIFBMQU4gCistLS0tLS0tLS0tLS0KKyBSZXN1bHQK KygxIHJvdykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKSBTRUxFQ1QgMTsKKyBRVUVSWSBQTEFO IAorLS0tLS0tLS0tLS0tCisgUmVzdWx0CisoMSByb3cpCisKK1NFTEVDVCB0b3BsZXZlbCwg Y2FsbHMsIHF1ZXJ5IEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzCisgIE9SREVSIEJZIHF1ZXJ5 IENPTExBVEUgIkMiOworIHRvcGxldmVsIHwgY2FsbHMgfCAgICAgICAgICAgICAgICAgICAg ICAgcXVlcnkgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0rLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg dCAgICAgICAgfCAgICAgMiB8IEVYUExBSU4gKENPU1RTIE9GRikgU0VMRUNUICQxCisgZiAg ICAgICAgfCAgICAgMiB8IFNFTEVDVCAkMQorIHQgICAgICAgIHwgICAgIDEgfCBTRUxFQ1Qg cGdfc3RhdF9zdGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5VTEwgQVMgdAorIHQgICAgICAg IHwgICAgIDIgfCBTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0gJDEKKyg0 IHJvd3MpCisKKy0tIG5lc3RlZCB0cmFja2luZyAtIGV4dGVuZGVkIHF1ZXJ5IHByb3RvY29s CitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnRyYWNrID0gImFsbCI7CitTRUxFQ1QgcGdfc3Rh dF9zdGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5VTEwgQVMgdDsKKyB0IAorLS0tCisgdAor KDEgcm93KQorCitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0gMTsKK0VY UExBSU4gKENPU1RTIE9GRikgU0VMRUNUIDE7IFxwYXJzZSBzdG10CisgUVVFUlkgUExBTiAK Ky0tLS0tLS0tLS0tLQorIFJlc3VsdAorKDEgcm93KQorCitcYmluZF9uYW1lZCBzdG10IFxn CisgUVVFUlkgUExBTiAKKy0tLS0tLS0tLS0tLQorIFJlc3VsdAorKDEgcm93KQorCitcYmlu ZF9uYW1lZCBzdG10IFxnCisgUVVFUlkgUExBTiAKKy0tLS0tLS0tLS0tLQorIFJlc3VsdAor KDEgcm93KQorCitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0gMDsKK1xi aW5kX25hbWVkIHN0bXQgXGcKKyBRVUVSWSBQTEFOIAorLS0tLS0tLS0tLS0tCisgUmVzdWx0 CisoMSByb3cpCisKK1xiaW5kX25hbWVkIHN0bXQgXGcKKyBRVUVSWSBQTEFOIAorLS0tLS0t LS0tLS0tCisgUmVzdWx0CisoMSByb3cpCisKK1NFTEVDVCB0b3BsZXZlbCwgY2FsbHMsIHF1 ZXJ5IEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzCisgIE9SREVSIEJZIHF1ZXJ5IENPTExBVEUg IkMiOworIHRvcGxldmVsIHwgY2FsbHMgfCAgICAgICAgICAgICAgICAgIHF1ZXJ5ICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0ICAgICAgICB8ICAgICAyIHwgRVhQTEFJTiAoQ09T VFMgT0ZGKSBTRUxFQ1QgJDEKKyBmICAgICAgICB8ICAgICAzIHwgU0VMRUNUICQxCisgdCAg ICAgICAgfCAgICAgMSB8IFNFVCBwZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUgPSAk MQorKDMgcm93cykKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMv bWVzb24uYnVpbGQgYi9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9tZXNvbi5idWlsZApp bmRleCA0NDQ2YWY1OGM1Li4zNTEzNTRhNmE1IDEwMDY0NAotLS0gYS9jb250cmliL3BnX3N0 YXRfc3RhdGVtZW50cy9tZXNvbi5idWlsZAorKysgYi9jb250cmliL3BnX3N0YXRfc3RhdGVt ZW50cy9tZXNvbi5idWlsZApAQCAtNTQsNiArNTQsNyBAQCB0ZXN0cyArPSB7CiAgICAgICAn cHJpdmlsZWdlcycsCiAgICAgICAnZXh0ZW5kZWQnLAogICAgICAgJ3BhcmFsbGVsJywKKyAg ICAgICdzYW1wbGluZycsCiAgICAgICAnY2xlYW51cCcsCiAgICAgICAnb2xkZXh0dmVyc2lv bnMnLAogICAgIF0sCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9w Z19zdGF0X3N0YXRlbWVudHMuYyBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0 YXRfc3RhdGVtZW50cy5jCmluZGV4IGJlYmY4MTM0ZWIuLjllNzllNmFjMzMgMTAwNjQ0Ci0t LSBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCisr KyBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCkBA IC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSAiYWNjZXNzL3BhcmFsbGVsLmgiCiAjaW5jbHVk ZSAiY2F0YWxvZy9wZ19hdXRoaWQuaCIKICNpbmNsdWRlICJjb21tb24vaW50LmgiCisjaW5j bHVkZSAiY29tbW9uL3BnX3BybmcuaCIKICNpbmNsdWRlICJleGVjdXRvci9pbnN0cnVtZW50 LmgiCiAjaW5jbHVkZSAiZnVuY2FwaS5oIgogI2luY2x1ZGUgImppdC9qaXQuaCIKQEAgLTI1 Niw2ICsyNTcsOSBAQCB0eXBlZGVmIHN0cnVjdCBwZ3NzU2hhcmVkU3RhdGUKIC8qIEN1cnJl bnQgbmVzdGluZyBkZXB0aCBvZiBwbGFubmVyL0V4ZWN1dG9yUnVuL1Byb2Nlc3NVdGlsaXR5 IGNhbGxzICovCiBzdGF0aWMgaW50CW5lc3RpbmdfbGV2ZWwgPSAwOwogCisvKiBJcyB0aGUg Y3VycmVudCB0b3AtbGV2ZWwgcXVlcnkgdG8gYmUgc2FtcGxlZD8gKi8KK3N0YXRpYyBib29s IGlzX3F1ZXJ5X3NhbXBsZWQgPSBmYWxzZTsKKwogLyogU2F2ZWQgaG9vayB2YWx1ZXMgKi8K IHN0YXRpYyBzaG1lbV9yZXF1ZXN0X2hvb2tfdHlwZSBwcmV2X3NobWVtX3JlcXVlc3RfaG9v ayA9IE5VTEw7CiBzdGF0aWMgc2htZW1fc3RhcnR1cF9ob29rX3R5cGUgcHJldl9zaG1lbV9z dGFydHVwX2hvb2sgPSBOVUxMOwpAQCAtMjk0LDEyICsyOTgsMTQgQEAgc3RhdGljIGJvb2wg cGdzc190cmFja191dGlsaXR5ID0gdHJ1ZTsJLyogd2hldGhlciB0byB0cmFjayB1dGlsaXR5 IGNvbW1hbmRzICovCiBzdGF0aWMgYm9vbCBwZ3NzX3RyYWNrX3BsYW5uaW5nID0gZmFsc2U7 CS8qIHdoZXRoZXIgdG8gdHJhY2sgcGxhbm5pbmcKIAkJCQkJCQkJCQkJICogZHVyYXRpb24g Ki8KIHN0YXRpYyBib29sIHBnc3Nfc2F2ZSA9IHRydWU7CS8qIHdoZXRoZXIgdG8gc2F2ZSBz dGF0cyBhY3Jvc3Mgc2h1dGRvd24gKi8KK3N0YXRpYyBkb3VibGUgcGdzc19zYW1wbGVfcmF0 ZSA9IDEuMDsgLyogZnJhY3Rpb24gb2Ygc3RhdGVtZW50cyB0byB0cmFjayAqLwogCiAKLSNk ZWZpbmUgcGdzc19lbmFibGVkKGxldmVsKSBcCisjZGVmaW5lIHBnc3NfZW5hYmxlZChsZXZl bCwgc2tpcF9zYW1wbGluZ19jaGVjaykgXAogCSghSXNQYXJhbGxlbFdvcmtlcigpICYmIFwK IAkocGdzc190cmFjayA9PSBQR1NTX1RSQUNLX0FMTCB8fCBcCi0JKHBnc3NfdHJhY2sgPT0g UEdTU19UUkFDS19UT1AgJiYgKGxldmVsKSA9PSAwKSkpCisJKHBnc3NfdHJhY2sgPT0gUEdT U19UUkFDS19UT1AgJiYgKGxldmVsKSA9PSAwKSkgJiYgXAorCShza2lwX3NhbXBsaW5nX2No ZWNrID09IFBHU1NfSU5WQUxJRCB8fCBjdXJyZW50X3F1ZXJ5X3NhbXBsZWQoKSkpCiAKICNk ZWZpbmUgcmVjb3JkX2djX3F0ZXh0cygpIFwKIAlkbyB7IFwKQEAgLTM3Myw2ICszNzksNyBA QCBzdGF0aWMgY2hhciAqZ2VuZXJhdGVfbm9ybWFsaXplZF9xdWVyeShKdW1ibGVTdGF0ZSAq anN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKIHN0YXRpYyB2b2lkIGZpbGxfaW5fY29uc3Rh bnRfbGVuZ3RocyhKdW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKIAkJ CQkJCQkJCSBpbnQgcXVlcnlfbG9jKTsKIHN0YXRpYyBpbnQJY29tcF9sb2NhdGlvbihjb25z dCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKK3N0YXRpYyBib29sCWN1cnJlbnRfcXVlcnlf c2FtcGxlZCh2b2lkKTsKIAogCiAvKgpAQCAtNDE0LDYgKzQyMSwxOSBAQCBfUEdfaW5pdCh2 b2lkKQogCQkJCQkJCU5VTEwsCiAJCQkJCQkJTlVMTCk7CiAKKwlEZWZpbmVDdXN0b21SZWFs VmFyaWFibGUoInBnX3N0YXRfc3RhdGVtZW50cy5zYW1wbGVfcmF0ZSIsCisJCQkJCQkJICJG cmFjdGlvbiBvZiBxdWVyaWVzIHRvIHRyYWNrLiIsCisJCQkJCQkJIE5VTEwsCisJCQkJCQkJ ICZwZ3NzX3NhbXBsZV9yYXRlLAorCQkJCQkJCSAxLjAsCisJCQkJCQkJIDAuMCwKKwkJCQkJ CQkgMS4wLAorCQkJCQkJCSBQR0NfU1VTRVQsCisJCQkJCQkJIDAsCisJCQkJCQkJIE5VTEws CisJCQkJCQkJIE5VTEwsCisJCQkJCQkJIE5VTEwpOworCiAJRGVmaW5lQ3VzdG9tRW51bVZh cmlhYmxlKCJwZ19zdGF0X3N0YXRlbWVudHMudHJhY2siLAogCQkJCQkJCSAiU2VsZWN0cyB3 aGljaCBzdGF0ZW1lbnRzIGFyZSB0cmFja2VkIGJ5IHBnX3N0YXRfc3RhdGVtZW50cy4iLAog CQkJCQkJCSBOVUxMLApAQCAtODM2LDcgKzg1Niw3IEBAIHBnc3NfcG9zdF9wYXJzZV9hbmFs eXplKFBhcnNlU3RhdGUgKnBzdGF0ZSwgUXVlcnkgKnF1ZXJ5LCBKdW1ibGVTdGF0ZSAqanN0 YXRlKQogCQlwcmV2X3Bvc3RfcGFyc2VfYW5hbHl6ZV9ob29rKHBzdGF0ZSwgcXVlcnksIGpz dGF0ZSk7CiAKIAkvKiBTYWZldHkgY2hlY2suLi4gKi8KLQlpZiAoIXBnc3MgfHwgIXBnc3Nf aGFzaCB8fCAhcGdzc19lbmFibGVkKG5lc3RpbmdfbGV2ZWwpKQorCWlmICghcGdzcyB8fCAh cGdzc19oYXNoIHx8ICFwZ3NzX2VuYWJsZWQobmVzdGluZ19sZXZlbCwgUEdTU19JTlZBTElE KSkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTg5NCw3ICs5MTQsNyBAQCBwZ3NzX3BsYW5uZXIo UXVlcnkgKnBhcnNlLAogCSAqIHBnc3Nfc3RvcmUgbmVlZHMgaXQuICBXZSBhbHNvIGlnbm9y ZSBxdWVyeSB3aXRob3V0IHF1ZXJ5aWQsIGFzIGl0IHdvdWxkCiAJICogYmUgdHJlYXRlZCBh cyBhIHV0aWxpdHkgc3RhdGVtZW50LCB3aGljaCBtYXkgbm90IGJlIHRoZSBjYXNlLgogCSAq LwotCWlmIChwZ3NzX2VuYWJsZWQobmVzdGluZ19sZXZlbCkKKwlpZiAocGdzc19lbmFibGVk KG5lc3RpbmdfbGV2ZWwsIFBHU1NfUExBTikKIAkJJiYgcGdzc190cmFja19wbGFubmluZyAm JiBxdWVyeV9zdHJpbmcKIAkJJiYgcGFyc2UtPnF1ZXJ5SWQgIT0gVUlOVDY0Q09OU1QoMCkp CiAJewpAQCAtOTk5LDcgKzEwMTksOCBAQCBwZ3NzX0V4ZWN1dG9yU3RhcnQoUXVlcnlEZXNj ICpxdWVyeURlc2MsIGludCBlZmxhZ3MpCiAJICogY291bnRpbmcgb2Ygb3B0aW1pemFibGUg c3RhdGVtZW50cyB0aGF0IGFyZSBkaXJlY3RseSBjb250YWluZWQgaW4KIAkgKiB1dGlsaXR5 IHN0YXRlbWVudHMuCiAJICovCi0JaWYgKHBnc3NfZW5hYmxlZChuZXN0aW5nX2xldmVsKSAm JiBxdWVyeURlc2MtPnBsYW5uZWRzdG10LT5xdWVyeUlkICE9IFVJTlQ2NENPTlNUKDApKQor CWlmIChwZ3NzX2VuYWJsZWQobmVzdGluZ19sZXZlbCwgUEdTU19FWEVDKSAmJgorCQlxdWVy eURlc2MtPnBsYW5uZWRzdG10LT5xdWVyeUlkICE9IFVJTlQ2NENPTlNUKDApKQogCXsKIAkJ LyoKIAkJICogU2V0IHVwIHRvIHRyYWNrIHRvdGFsIGVsYXBzZWQgdGltZSBpbiBFeGVjdXRv clJ1bi4gIE1ha2Ugc3VyZSB0aGUKQEAgLTEwNjgsNyArMTA4OSw3IEBAIHBnc3NfRXhlY3V0 b3JFbmQoUXVlcnlEZXNjICpxdWVyeURlc2MpCiAJdWludDY0CQlxdWVyeUlkID0gcXVlcnlE ZXNjLT5wbGFubmVkc3RtdC0+cXVlcnlJZDsKIAogCWlmIChxdWVyeUlkICE9IFVJTlQ2NENP TlNUKDApICYmIHF1ZXJ5RGVzYy0+dG90YWx0aW1lICYmCi0JCXBnc3NfZW5hYmxlZChuZXN0 aW5nX2xldmVsKSkKKwkJcGdzc19lbmFibGVkKG5lc3RpbmdfbGV2ZWwsIFBHU1NfRVhFQykp CiAJewogCQkvKgogCQkgKiBNYWtlIHN1cmUgc3RhdHMgYWNjdW11bGF0aW9uIGlzIGRvbmUu ICAoTm90ZTogaXQncyBva2F5IGlmIHNldmVyYWwKQEAgLTExMTEsNyArMTEzMiw3IEBAIHBn c3NfUHJvY2Vzc1V0aWxpdHkoUGxhbm5lZFN0bXQgKnBzdG10LCBjb25zdCBjaGFyICpxdWVy eVN0cmluZywKIAl1aW50NjQJCXNhdmVkX3F1ZXJ5SWQgPSBwc3RtdC0+cXVlcnlJZDsKIAlp bnQJCQlzYXZlZF9zdG10X2xvY2F0aW9uID0gcHN0bXQtPnN0bXRfbG9jYXRpb247CiAJaW50 CQkJc2F2ZWRfc3RtdF9sZW4gPSBwc3RtdC0+c3RtdF9sZW47Ci0JYm9vbAkJZW5hYmxlZCA9 IHBnc3NfdHJhY2tfdXRpbGl0eSAmJiBwZ3NzX2VuYWJsZWQobmVzdGluZ19sZXZlbCk7CisJ Ym9vbAkJZW5hYmxlZCA9IHBnc3NfdHJhY2tfdXRpbGl0eSAmJiBwZ3NzX2VuYWJsZWQobmVz dGluZ19sZXZlbCwgUEdTU19FWEVDKTsKIAogCS8qCiAJICogRm9yY2UgdXRpbGl0eSBzdGF0 ZW1lbnRzIHRvIGdldCBxdWVyeUlkIHplcm8uICBXZSBkbyB0aGlzIGV2ZW4gaW4gY2FzZXMK QEAgLTMwMTEsMyArMzAzMiwyMSBAQCBjb21wX2xvY2F0aW9uKGNvbnN0IHZvaWQgKmEsIGNv bnN0IHZvaWQgKmIpCiAKIAlyZXR1cm4gcGdfY21wX3MzMihsLCByKTsKIH0KKworLyoKKyAq IERldGVybWluZSB3aGV0aGVyIHRoZSBjdXJyZW50IHF1ZXJ5IHNob3VsZCBiZSBzYW1wbGVk LgorICoKKyAqIEF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCB0b3AtbGV2ZWwgc3RhdGVtZW50 LCBkZWNpZGUgd2hldGhlciB3ZSdsbAorICogc2FtcGxlIHRoaXMgc3RhdGVtZW50LiBJZiBu ZXN0ZWQtc3RhdGVtZW50IHRyYWNraW5nIGlzIGVuYWJsZWQsCisgKiBlaXRoZXIgYWxsIG5l c3RlZCBzdGF0ZW1lbnRzIHdpbGwgYmUgdHJhY2tlZCBvciBub25lIHdpbGwuCisgKi8KK3N0 YXRpYyBib29sCitjdXJyZW50X3F1ZXJ5X3NhbXBsZWQodm9pZCkKK3sKKwlpZiAobmVzdGlu Z19sZXZlbCA9PSAwKQorCQlpc19xdWVyeV9zYW1wbGVkID0gcGdzc19zYW1wbGVfcmF0ZSAh PSAwLjAgJiYKKwkJCShwZ3NzX3NhbXBsZV9yYXRlID09IDEuMCB8fAorCQkJcGdfcHJuZ19k b3VibGUoJnBnX2dsb2JhbF9wcm5nX3N0YXRlKSA8PSBwZ3NzX3NhbXBsZV9yYXRlKTsKKwor CXJldHVybiBpc19xdWVyeV9zYW1wbGVkOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZp bGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3NxbC9zYW1wbGlu Zy5zcWwgYi9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9zcWwvc2FtcGxpbmcuc3FsCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLmIwOWY0NTk5MWIKLS0tIC9k ZXYvbnVsbAorKysgYi9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9zcWwvc2FtcGxpbmcu c3FsCkBAIC0wLDAgKzEsNTAgQEAKKy0tCistLSBzYW1wbGUgc3RhdGVtZW50cworLS0KKwor LS0gdG9wLWxldmVsIHRyYWNraW5nIC0gc2ltcGxlIHF1ZXJ5IHByb3RvY29sCitTSE9XIHBn X3N0YXRfc3RhdGVtZW50cy50cmFjazsKK1NFVCBwZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxl X3JhdGUgPSAwLjA7CitTRUxFQ1QgcGdfc3RhdF9zdGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9U IE5VTEwgQVMgdDsKK1NFTEVDVCAxIEFTICJpbnQiOworU0VMRUNUIHF1ZXJ5LCBjYWxscyBG Uk9NIHBnX3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVyeSBDT0xMQVRFICJDIjsKK1NF VCBwZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUgPSAxLjA7CitTRUxFQ1QgMSBBUyAi aW50IjsKK1NFTEVDVCBxdWVyeSwgY2FsbHMgRlJPTSBwZ19zdGF0X3N0YXRlbWVudHMgT1JE RVIgQlkgcXVlcnkgQ09MTEFURSAiQyI7CisKKy0tIHRvcC1sZXZlbCB0cmFja2luZyAtIGV4 dGVuZGVkIHF1ZXJ5IHByb3RvY29sCitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9y YXRlID0gMC4wOworU0VMRUNUIHBnX3N0YXRfc3RhdGVtZW50c19yZXNldCgpIElTIE5PVCBO VUxMIEFTIHQ7CitTRUxFQ1QgMSBccGFyc2Ugc3RtdAorXGJpbmRfbmFtZWQgc3RtdCBcZwor U0VMRUNUIHF1ZXJ5LCBjYWxscyBGUk9NIHBnX3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBx dWVyeSBDT0xMQVRFICJDIjsKK1NFVCBwZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUg PSAxLjA7CitcYmluZF9uYW1lZCBzdG10IFxnCitTRUxFQ1QgcXVlcnksIGNhbGxzIEZST00g cGdfc3RhdF9zdGF0ZW1lbnRzIE9SREVSIEJZIHF1ZXJ5IENPTExBVEUgIkMiOworU0VMRUNU IHBnX3N0YXRfc3RhdGVtZW50c19yZXNldCgpIElTIE5PVCBOVUxMIEFTIHQ7CitERUFMTE9D QVRFIHN0bXQ7CisKKy0tIG5lc3RlZCB0cmFja2luZyAtIHNpbXBsZSBxdWVyeSBwcm90b2Nv bAorU0VUIHBnX3N0YXRfc3RhdGVtZW50cy50cmFjayA9ICJhbGwiOworU0VMRUNUIHBnX3N0 YXRfc3RhdGVtZW50c19yZXNldCgpIElTIE5PVCBOVUxMIEFTIHQ7CitTRVQgcGdfc3RhdF9z dGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0gMTsKK0VYUExBSU4gKENPU1RTIE9GRikgU0VMRUNU IDE7CitFWFBMQUlOIChDT1NUUyBPRkYpIFNFTEVDVCAxOworU0VUIHBnX3N0YXRfc3RhdGVt ZW50cy5zYW1wbGVfcmF0ZSA9IDA7CitFWFBMQUlOIChDT1NUUyBPRkYpIFNFTEVDVCAxOwor RVhQTEFJTiAoQ09TVFMgT0ZGKSBTRUxFQ1QgMTsKK1NFTEVDVCB0b3BsZXZlbCwgY2FsbHMs IHF1ZXJ5IEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzCisgIE9SREVSIEJZIHF1ZXJ5IENPTExB VEUgIkMiOworCistLSBuZXN0ZWQgdHJhY2tpbmcgLSBleHRlbmRlZCBxdWVyeSBwcm90b2Nv bAorU0VUIHBnX3N0YXRfc3RhdGVtZW50cy50cmFjayA9ICJhbGwiOworU0VMRUNUIHBnX3N0 YXRfc3RhdGVtZW50c19yZXNldCgpIElTIE5PVCBOVUxMIEFTIHQ7CitTRVQgcGdfc3RhdF9z dGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0gMTsKK0VYUExBSU4gKENPU1RTIE9GRikgU0VMRUNU IDE7IFxwYXJzZSBzdG10CitcYmluZF9uYW1lZCBzdG10IFxnCitcYmluZF9uYW1lZCBzdG10 IFxnCitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0gMDsKK1xiaW5kX25h bWVkIHN0bXQgXGcKK1xiaW5kX25hbWVkIHN0bXQgXGcKK1NFTEVDVCB0b3BsZXZlbCwgY2Fs bHMsIHF1ZXJ5IEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzCisgIE9SREVSIEJZIHF1ZXJ5IENP TExBVEUgIkMiOwpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3Bnc3RhdHN0YXRlbWVudHMu c2dtbCBiL2RvYy9zcmMvc2dtbC9wZ3N0YXRzdGF0ZW1lbnRzLnNnbWwKaW5kZXggNTAxYjQ2 OGU5YS4uY2QzZmRhZWZmZSAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL3Bnc3RhdHN0YXRl bWVudHMuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvcGdzdGF0c3RhdGVtZW50cy5zZ21sCkBA IC05MzYsNiArOTM2LDI1IEBACiAgICAgPC9saXN0aXRlbT4KICAgIDwvdmFybGlzdGVudHJ5 PgogCisgICA8dmFybGlzdGVudHJ5PgorICAgIDx0ZXJtPgorICAgICA8dmFybmFtZT5wZ19z dGF0X3N0YXRlbWVudHMuc2FtcGxlX3JhdGU8L3Zhcm5hbWU+ICg8dHlwZT5yZWFsPC90eXBl PikKKyAgICAgPGluZGV4dGVybT4KKyAgICAgIDxwcmltYXJ5Pjx2YXJuYW1lPnBnX3N0YXRf c3RhdGVtZW50cy5zYW1wbGVfcmF0ZTwvdmFybmFtZT4gY29uZmlndXJhdGlvbiBwYXJhbWV0 ZXI8L3ByaW1hcnk+CisgICAgIDwvaW5kZXh0ZXJtPgorICAgIDwvdGVybT4KKworICAgIDxs aXN0aXRlbT4KKyAgICAgPHBhcmE+CisgICAgICA8dmFybmFtZT5wZ19zdGF0X3N0YXRlbWVu dHMuc2FtcGxlX3JhdGU8L3Zhcm5hbWU+IGNhdXNlcyBwZ19zdGF0X3N0YXRlbWVudHMgdG8g b25seQorICAgICAgdHJhY2sgYSBmcmFjdGlvbiBvZiB0aGUgc3RhdGVtZW50cyBpbiBlYWNo IHNlc3Npb24uIFRoZSBkZWZhdWx0IGlzIDxsaXRlcmFsPjE8L2xpdGVyYWw+LAorICAgICAg bWVhbmluZyB0cmFjayBhbGwgdGhlIHF1ZXJpZXMuIFNldHRpbmcgdGhpcyB0byA8bGl0ZXJh bD4wPC9saXRlcmFsPiBkaXNhYmxlcyBzYW1wbGVkIHN0YXRlbWVudHMKKyAgICAgIHRyYWNr aW5nLCB0aGUgc2FtZSBhcyBzZXR0aW5nIDx2YXJuYW1lPnBnX3N0YXRfc3RhdGVtZW50cy50 cmFjazwvdmFybmFtZT4gdG8gPGxpdGVyYWw+bm9uZTwvbGl0ZXJhbD4uCisgICAgICBJbiBj YXNlIG9mIG5lc3RlZCBzdGF0ZW1lbnRzLCBlaXRoZXIgYWxsIHdpbGwgYmUgdHJhY2tlZCBv ciBub25lLiBPbmx5IHN1cGVydXNlcnMgY2FuIGNoYW5nZSB0aGlzIHNldHRpbmcuCisgICAg IDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAgPC92YXJsaXN0ZW50cnk+CisKICAgIDx2 YXJsaXN0ZW50cnk+CiAgICAgPHRlcm0+CiAgICAgIDx2YXJuYW1lPnBnX3N0YXRfc3RhdGVt ZW50cy5zYXZlPC92YXJuYW1lPiAoPHR5cGU+Ym9vbGVhbjwvdHlwZT4pCi0tIAoyLjM0LjEK Cg== --------------5A1EOYBs1isLWH0SMAZDnoGA--