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 1v9egy-004hn6-IU for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Oct 2025 07:16:00 +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 1v9egx-000PjK-DK for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Oct 2025 07:15:58 +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 1v9egw-000PjC-SE for pgsql-hackers@lists.postgresql.org; Fri, 17 Oct 2025 07:15:58 +0000 Received: from mail-ed1-x52a.google.com ([2a00:1450:4864:20::52a]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1v9egu-002Eig-05 for pgsql-hackers@lists.postgresql.org; Fri, 17 Oct 2025 07:15:56 +0000 Received: by mail-ed1-x52a.google.com with SMTP id 4fb4d7f45d1cf-633b4861b79so241732a12.1 for ; Fri, 17 Oct 2025 00:15:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760685353; x=1761290153; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=51VUxmLSN91i2HgV7f1qwOrQjCAtrma/nyMPCLKZ+zQ=; b=RU/3Zq9G5sSUf8+g7VqjKTQzIqWAgx6+wIRzKew6LgyKVq+/JTBwptAkqefdSWJZdy 3wVj18zefPrv2I17veXvb5VtpQC1M4HsSh9vWl3Z1Msq0Gbs4NH/Sj9LtNmZYxS1a5+x de0S2JwNKaqrGElgW4Fx2q0dCIt7d3cfNYitcL0synwqiRkZ+EHAsH/7ShH7PZfBevTs i+bLb67rON7FmpGXIkPjmxH3RujsI48y/PUetZliZG0fffKTSeukAjxs1NGusDWkS4WQ qvWiStib/FL5/ZM2ne2TwnuQg5Zs/q16IGJ1oNOHbz6tZVYaerri2J9e+wNrCYQ/Vwi2 eVRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760685353; x=1761290153; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=51VUxmLSN91i2HgV7f1qwOrQjCAtrma/nyMPCLKZ+zQ=; b=nviUHWmbOBxrj3bhzjrcbCtQNWgQUmPFztntW1pyHEN7RA9NYOebszaswYQbp5O6zG /gcsD3kMN8/yy+wtg/QvCZIZw4wQDtSlJPJt9hgJQ4KAbjofzBlquOY/kAC7QZG662rm mTC9xcQDnHNrcv90ksQjDAjXBMPYExMLB/O8dO3g20OuGhs1retkkInoylUvTiTB6aJQ ygsAiY9OH5rtDgsunMA+jmxEo4UmhnSD3b1Nf9H8Vmnq9EPCqKm4ksimO4pu61u4ogNI y4Y1TZLLmqOlThE5TyypZ6Qr+UQKlhMd41/Wh7LdS278biGb4av+rQtmeiskIrk1zTOz Gn4g== X-Gm-Message-State: AOJu0YxisZY3lowGFMC0ecM24bWSblD2xVWOKjHs4Lc2+utAj6a6p8NU HVDJH6Cm0nZLT6dMu6PceX6U2gAFl9XkXMmvxpjdbBVR5plckne/1Xg0MancIAJPrjSwzHaNrw3 Om4t3ud1w7V2UbzwMDDeZFSN2U5elS/0= X-Gm-Gg: ASbGncuaYIcFX1ho0fup64+TT07feBmkNwurT3ZKTYenzv2sobXVwrj7Uy3IsH8P1ea nYCYdQQYpH77nrQ1bj0rvpcLW7UEfKrV8tkPLojm+Ic/j6BtWyLD/KOFoHmaLUQg+0p4+o58sAs DxcBBxACpYhyAUCyc9QRoXzZ9HmuAuDVdX8nplCTOVlrSgz9OV3brxQ9FLIskNRJ7dmw02cF7o2 Vz4psUU6M1nuDaQ3Qs8+TY1IyJJumTnyxfMy8mg1DKoEdk1PozLPu7VjsBtWWqOD3BBmoxX X-Google-Smtp-Source: AGHT+IEab4VbwUSnkCImaBgHFBUnC2lskD2x19wD7PQ0cyrL+crUcY/SLWgOLjgZY9jR+jCOId9nvrUFO8j/GVuMVoA= X-Received: by 2002:a05:6402:510f:b0:637:e361:f449 with SMTP id 4fb4d7f45d1cf-63c1f6213bamr1261239a12.1.1760685352794; Fri, 17 Oct 2025 00:15:52 -0700 (PDT) MIME-Version: 1.0 References: <20250911054220.3784-1-root@ip-172-31-36-228.ec2.internal> In-Reply-To: From: Andrew Kim Date: Fri, 17 Oct 2025 00:15:40 -0700 X-Gm-Features: AS18NWDV-UyxGFtw3pYl1vF2ga2jJciRykuouLh3ubXUUVVe6JApPM611bkh3z4 Message-ID: Subject: Re: Proposal for enabling auto-vectorization for checksum calculations To: John Naylor Cc: pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="00000000000003f3f706415581d1" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000003f3f706415581d1 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi John, Thank you for your detailed and constructive feedback on the checksum AVX2 optimization patch. I've carefully addressed all of your concerns and am pleased to share the updated V6 implementation. V6 Implementation adds SIMD-optimized checksum calculation using AVX2 instructions with automatic fallback to portable implementation, incorporating all of your recommended improvements: 1. Code Organization Consolidated architecture: Moved all checksum logic into a single checksum.c file, eliminating the complexity of separate dispatch files Simplified build integration: Streamlined both autoconf and meson build configurations 2. Safety & Robustness Eliminated dangerous runtime patching: Replaced direct function pointer manipulation with safe dispatch through static function pointers Thread-safe design: All operations are now inherently thread-safe without requiring locks or synchronization 3. Code Readability Removed macro complexity: Replaced PG_DECLARE_CHECKSUM_ISA macros with explicit, clear function declarations PostgreSQL coding compliance: Follows established PostgreSQL conventions throughout Simplified conditional compilation: Removed redundant __x86_64__ guards, relying on configure script's platform detection 4. Compiler Detection & Compatibility Preserved robust testing: Maintained the comprehensive avx2_test function that validates both __attribute__((target("avx2"))) support and AVX2 intrinsics functionality Runtime feature detection: Uses __builtin_cpu_supports("avx2") for reliable CPU capability detection Build cleanly across all library variants (static, shared, server) Compile without warnings under strict compiler flags I believe this V6 implementation fully addresses your concerns while delivering the performance benefits of AVX2 optimization. Please find the V6 patch attached. I welcome any additional feedback you may have. Best regards, Andrew Kim On Wed, Oct 1, 2025 at 10:26=E2=80=AFPM John Naylor wrote: > > On Thu, Sep 25, 2025 at 4:50=E2=80=AFAM Andrew Kim wrote: > > > > Thanks, John. I see the issue now =E2=80=94 I=E2=80=99ll attach the ent= ire patch > > series in a single email so it shows up properly in the commitfest and > > gets CI coverage. > > It's still picking up v4, and the archive link doesn't show any > further replies. Something must have happened with the email > threading, since you weren't on the thread at first. Please create an > account and edit the entry to point to a more recent message ID: > > https://commitfest.postgresql.org/patch/5726/ > > > Please find attached v6 of the patchset, updated per your feedback. > > Thanks. (BTW, we discourage top-posting and prefer to cut to size and > use inline responses) > > This is not a complete review, but some architectural thoughts and > some things I've noticed. > > The top of the checksum_impl.h has this: > > * This file exists for the benefit of external programs that may wish to > * check Postgres page checksums. They can #include this to get the code > * referenced by storage/checksum.h. (Note: you may need to redefine > * Assert() as empty to compile this successfully externally.) > > It's going to be a bit tricky to preserve this ability while allowing > the core server and client programs to dispatch to a specialized > implementation, but we should at least try. That means keeping > pg_checksum_block() and pg_checksum_page() where they live now. > > I think a good first refactoring patch would be to move > src/backend/storage/checksum.c (which your patch doesn't even touch) > to src/port (and src/include/storage/checksum.h to src/include/port) > and have all callers use that. With that, I imagine only that > checksum.c file would include checksum_impl.h. > > If that poses a problem, let us know -- we may have to further juggle > things. If that works without issue, we can proceed with the > specialization. On that, just a few things to note here, although the > next patch doesn't need to worry about any of this yet: > > + #if defined(__has_attribute) && __has_attribute (target) > + __attribute__((target("avx2"))) > + #endif > + static int avx2_test(void) > + { > + const char buf@<:@sizeof(__m256i)@:>@; > + __m256i accum =3D _mm256_loadu_si256((const __m256i *) buf); > + accum =3D _mm256_add_epi32(accum, accum); > + int result =3D _mm256_extract_epi32(accum, 0); > + return (int) result; > + }], > > If we're just testing if the target works, we can just use an empty > function, right? > > +#define PG_DECLARE_CHECKSUM_ISA(ISANAME) \ > +uint32 \ > +pg_checksum_block_##ISANAME(const PGChecksummablePage *page); > + > +#define PG_DEFINE_CHECKSUM_ISA(ISANAME) \ > +pg_attribute_target(#ISANAME) \ > +uint32 pg_checksum_block_##ISANAME(const PGChecksummablePage *page) \ > > I find this hard to read compared to just using the actual name. > > +avx2_available(void) > +{ > +#if defined (USE_AVX2_WITH_RUNTIME_CHECK) && defined(__x86_64__) > > Why guard on __x86_64__? > > +PG_DEFINE_CHECKSUM_ISA(default) > +{ > + uint32 sums[N_SUMS], result =3D 0; > + uint32 i, j; > [...] > > +#ifdef USE_AVX2_WITH_RUNTIME_CHECK > +PG_DEFINE_CHECKSUM_ISA(avx2) > +{ > + uint32 sums[N_SUMS], result =3D 0; > + uint32 i, j; > [...] > > With the single src/port file idea above, these would just do "return > pg_checksum_block()" (or pg_checksum_page, whichever makes more > sense). > > + if (avx2_available()) > + { > + /* optional: patch pointer so next call goes directly */ > + pg_checksum_block =3D pg_checksum_block_avx2; > + return pg_checksum_block_avx2(page); > + } > > Not sure what your referring to here by "patching" the pointer, but it > sounds dangerous. Besides, the cost of indirection is basically zero > for multi-kilobyte inputs, so there is not even any motivation to > consider doing differently. > > -- > John Naylor > Amazon Web Services --00000000000003f3f706415581d1 Content-Type: application/octet-stream; name="v6-0001-Enable-autovectorizing-pg_checksum_block-with-AVX2-runtime-detection.patch" Content-Disposition: attachment; filename="v6-0001-Enable-autovectorizing-pg_checksum_block-with-AVX2-runtime-detection.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mguiks7k0 RnJvbSA1YWMwZThjZTBjM2NkYjk3MzA0NGI3MGE3YjdmODgzODk4MWFjOTc0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXcgS2ltIDxhbmRyZXcua2ltQGludGVsLmNvbT4KRGF0 ZTogVGh1LCAxNiBPY3QgMjAyNSAxOTozOTo0OCAtMDcwMApTdWJqZWN0OiBbUEFUQ0hdIEVuYWJs ZSBhdXRvdmVjdG9yaXppbmcgcGdfY2hlY2tzdW1fYmxvY2sgd2l0aCBBVlgyIHJ1bnRpbWUKIGRl dGVjdGlvbgoKQWRkIFNJTUQtb3B0aW1pemVkIGNoZWNrc3VtIGNhbGN1bGF0aW9uIHVzaW5nIEFW WDIgaW5zdHJ1Y3Rpb25zIHdoZW4KYXZhaWxhYmxlLCB3aXRoIGF1dG9tYXRpYyBmYWxsYmFjayB0 byBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbi4gVXNlcwpfX2J1aWx0aW5fY3B1X3N1cHBvcnRzKCkg Zm9yIHJ1bnRpbWUgQ1BVIGZlYXR1cmUgZGV0ZWN0aW9uLgoKS2V5IGltcHJvdmVtZW50czoKLSBD b25zb2xpZGF0ZSBjaGVja3N1bSBsb2dpYyBpbnRvIHNpbmdsZSBzcmMvcG9ydC9jaGVja3N1bS5j IGZpbGUKLSBJbXBsZW1lbnQgc2FmZSBmdW5jdGlvbiBwb2ludGVyIGRpc3BhdGNoIGluc3RlYWQg b2YgcnVudGltZSBwYXRjaGluZwotIFJlbW92ZSBjb21wbGV4IG1hY3JvcyBpbiBmYXZvciBvZiBl eHBsaWNpdCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLSBBZGQgY29tcHJlaGVuc2l2ZSBBVlgyIGNv bXBpbGVyIHN1cHBvcnQgZGV0ZWN0aW9uIGluIGNvbmZpZ3VyZQotIE1haW50YWluIGZ1bGwgYmFj a3dhcmQgY29tcGF0aWJpbGl0eSBvbiBub24tQVZYMiBzeXN0ZW1zCgpQZXJmb3JtYW5jZSB0ZXN0 aW5nIHNob3dzIHNpZ25pZmljYW50IGltcHJvdmVtZW50IGluIGNoZWNrc3VtIGNhbGN1bGF0aW9u CnRocm91Z2hwdXQgb24gQVZYMi1jYXBhYmxlIHByb2Nlc3NvcnMgd2hpbGUgbWFpbnRhaW5pbmcg Y29kZSBzYWZldHkKYW5kIFBvc3RncmVTUUwgY29kaW5nIHN0YW5kYXJkcyBjb21wbGlhbmNlLgoK QWRkcmVzc2VzIHJldmlld2VyIGZlZWRiYWNrIG9uIGNvZGUgb3JnYW5pemF0aW9uLCBzYWZldHks IGFuZCBtYWludGFpbmFiaWxpdHkuCi0tLQogY29uZmlnL2MtY29tcGlsZXIubTQgICAgICAgICAg ICAgICAgfCAgMzEgKysrKysKIGNvbmZpZ3VyZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg IDUyICsrKysrKysKIGNvbmZpZ3VyZS5hYyAgICAgICAgICAgICAgICAgICAgICAgIHwgICA5ICsr CiBtZXNvbi5idWlsZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyOCArKysrCiBzcmMvYmFj a2VuZC9zdG9yYWdlL3BhZ2UvY2hlY2tzdW0uYyB8ICAgNiArLQogc3JjL2luY2x1ZGUvcGdfY29u ZmlnLmguaW4gICAgICAgICAgfCAgIDMgKwogc3JjL2luY2x1ZGUvc3RvcmFnZS9jaGVja3N1bV9p bXBsLmggfCAgODIgKystLS0tLS0tLS0KIHNyYy9wb3J0L01ha2VmaWxlICAgICAgICAgICAgICAg ICAgIHwgICAxICsKIHNyYy9wb3J0L2NoZWNrc3VtLmMgICAgICAgICAgICAgICAgIHwgMjAzICsr KysrKysrKysrKysrKysrKysrKysrKysrKysKIHNyYy9wb3J0L21lc29uLmJ1aWxkICAgICAgICAg ICAgICAgIHwgICAxICsKIDEwIGZpbGVzIGNoYW5nZWQsIDM0MiBpbnNlcnRpb25zKCspLCA3NCBk ZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvcG9ydC9jaGVja3N1bS5jCgpkaWZm IC0tZ2l0IGEvY29uZmlnL2MtY29tcGlsZXIubTQgYi9jb25maWcvYy1jb21waWxlci5tNAppbmRl eCAyMzZhNTllODUzNi4uYmNjMTM5OGQ1MWEgMTAwNjQ0Ci0tLSBhL2NvbmZpZy9jLWNvbXBpbGVy Lm00CisrKyBiL2NvbmZpZy9jLWNvbXBpbGVyLm00CkBAIC03MTEsNiArNzExLDM3IEBAIGZpCiB1 bmRlZmluZShbQWNfY2FjaGV2YXJdKWRubAogXSkjIFBHQUNfWFNBVkVfSU5UUklOU0lDUwogCisj IFBHQUNfQVZYMl9TVVBQT1JUCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENo ZWNrIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBBVlgyIGluIGF0dHJpYnV0ZSgodGFyZ2V0KSkK KyMgYW5kIHVzaW5nIEFWWDIgaW50cmluc2ljcyBpbiB0aG9zZSBmdW5jdGlvbnMKKyMKKyMgSWYg dGhlIGludHJpbnNpY3MgYXJlIHN1cHBvcnRlZCwgc2V0cyBwZ2FjX2F2eDJfc3VwcG9ydC4KK0FD X0RFRlVOKFtQR0FDX0FWWDJfU1VQUE9SVF0sCitbZGVmaW5lKFtBY19jYWNoZXZhcl0sIFtBU19U Ul9TSChbcGdhY19jdl9hdngyX3N1cHBvcnRdKV0pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIEFW WDIgc3VwcG9ydF0sIFtBY19jYWNoZXZhcl0sCitbQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJP R1JBTShbI2luY2x1ZGUgPGltbWludHJpbi5oPgorICAgICNpbmNsdWRlIDxzdGRpbnQuaD4KKyAg ICAjaWYgZGVmaW5lZChfX2hhc19hdHRyaWJ1dGUpICYmIF9faGFzX2F0dHJpYnV0ZSAodGFyZ2V0 KQorICAgIF9fYXR0cmlidXRlX18oKHRhcmdldCgiYXZ4MiIpKSkKKyAgICAjZW5kaWYKKyAgICBz dGF0aWMgaW50IGF2eDJfdGVzdCh2b2lkKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgYnVmQDw6 QHNpemVvZihfX20yNTZpKUA6PkA7CisgICAgICBfX20yNTZpIGFjY3VtID0gX21tMjU2X2xvYWR1 X3NpMjU2KChjb25zdCBfX20yNTZpICopIGJ1Zik7CisJICBhY2N1bSA9IF9tbTI1Nl9hZGRfZXBp MzIoYWNjdW0sIGFjY3VtKTsKKyAgICAgIGludCByZXN1bHQgPSBfbW0yNTZfZXh0cmFjdF9lcGkz MihhY2N1bSwgMCk7CisgICAgICByZXR1cm4gKGludCkgcmVzdWx0OworICAgIH1dLAorICBbcmV0 dXJuIGF2eDJfdGVzdCgpO10pXSwKKyAgW0FjX2NhY2hldmFyPXllc10sCisgIFtBY19jYWNoZXZh cj1ub10pXSkKK2lmIHRlc3QgeCIkQWNfY2FjaGV2YXIiID0geCJ5ZXMiOyB0aGVuCisgIHBnYWNf YXZ4Ml9zdXBwb3J0PXllcworZmkKK3VuZGVmaW5lKFtBY19jYWNoZXZhcl0pZG5sCitdKSMgUEdB Q19BVlgyX1NVUFBPUlQKKwogIyBQR0FDX0FWWDUxMl9QT1BDTlRfSU5UUklOU0lDUwogIyAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBDaGVjayBpZiB0aGUgY29tcGlsZXIgc3VwcG9y dHMgdGhlIEFWWC01MTIgcG9wY291bnQgaW5zdHJ1Y3Rpb25zIHVzaW5nIHRoZQpkaWZmIC0tZ2l0 IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDIyY2Q4NjYxNDdiLi4yMDk4NDljNzczYyAx MDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMTc1NjIsNiArMTc1NjIs NTggQEAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9YU0FWRV9JTlRSSU5TSUNTIDEiID4+Y29uZmRl ZnMuaAogCiBmaQogCisjIENoZWNrIGZvciBBVlgyIHRhcmdldCBhbmQgaW50cmluc2ljIHN1cHBv cnQKKyMKK2lmIHRlc3QgeCIkaG9zdF9jcHUiID0geCJ4ODZfNjQiOyB0aGVuCisgIHsgJGFzX2Vj aG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFWWDIgc3VwcG9y dCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQVZYMiBzdXBwb3J0Li4uICIgPiY2OyB9 CitpZiAke3BnYWNfY3ZfYXZ4Ml9zdXBwb3J0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9f biAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29u ZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGltbWludHJp bi5oPgorICAgICNpbmNsdWRlIDxzdGRpbnQuaD4KKyAgICAjaWYgZGVmaW5lZChfX2hhc19hdHRy aWJ1dGUpICYmIF9faGFzX2F0dHJpYnV0ZSAodGFyZ2V0KQorICAgIF9fYXR0cmlidXRlX18oKHRh cmdldCgiYXZ4MiIpKSkKKyAgICAjZW5kaWYKKyAgICBzdGF0aWMgaW50IGF2eDJfdGVzdCh2b2lk KQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgYnVmW3NpemVvZihfX20yNTZpKV07CisgICAgICBf X20yNTZpIGFjY3VtID0gX21tMjU2X2xvYWR1X3NpMjU2KChjb25zdCBfX20yNTZpICopIGJ1Zik7 CisJICBhY2N1bSA9IF9tbTI1Nl9hZGRfZXBpMzIoYWNjdW0sIGFjY3VtKTsKKyAgICAgIGludCBy ZXN1bHQgPSBfbW0yNTZfZXh0cmFjdF9lcGkzMihhY2N1bSwgMCk7CisgICAgICByZXR1cm4gKGlu dCkgcmVzdWx0OworICAgIH0KK2ludAorbWFpbiAoKQoreworcmV0dXJuIGF2eDJfdGVzdCgpOwor ICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5P IjsgdGhlbiA6CisgIHBnYWNfY3ZfYXZ4Ml9zdXBwb3J0PXllcworZWxzZQorICBwZ2FjX2N2X2F2 eDJfc3VwcG9ydD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19v YmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAk YXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRwZ2FjX2N2X2F2 eDJfc3VwcG9ydCIgPiY1CiskYXNfZWNobyAiJHBnYWNfY3ZfYXZ4Ml9zdXBwb3J0IiA+JjY7IH0K K2lmIHRlc3QgeCIkcGdhY19jdl9hdngyX3N1cHBvcnQiID0geCJ5ZXMiOyB0aGVuCisgIHBnYWNf YXZ4Ml9zdXBwb3J0PXllcworZmkKKworICBpZiB0ZXN0IHgiJHBnYWNfYXZ4Ml9zdXBwb3J0IiA9 IHgieWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBVU0VfQVZYMl9XSVRIX1JVTlRJTUVf Q0hFQ0sgMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKK2ZpCisKICMgQ2hlY2sgZm9yIEFWWC01MTIg cG9wY291bnQgaW50cmluc2ljcwogIwogaWYgdGVzdCB4IiRob3N0X2NwdSIgPSB4Ing4Nl82NCI7 IHRoZW4KZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCBlNDQ5 NDNhYTZmZS4uYzA2MWIxYTg1NGMgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25m aWd1cmUuYWMKQEAgLTIwOTEsNiArMjA5MSwxNSBAQCBpZiB0ZXN0IHgiJHBnYWNfeHNhdmVfaW50 cmluc2ljcyIgPSB4InllcyI7IHRoZW4KICAgQUNfREVGSU5FKEhBVkVfWFNBVkVfSU5UUklOU0lD UywgMSwgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIFhTQVZFIGludHJpbnNpY3MuXSkKIGZpCiAK KyMgQ2hlY2sgZm9yIEFWWDIgdGFyZ2V0IGFuZCBpbnRyaW5zaWMgc3VwcG9ydAorIworaWYgdGVz dCB4IiRob3N0X2NwdSIgPSB4Ing4Nl82NCI7IHRoZW4KKyAgUEdBQ19BVlgyX1NVUFBPUlQoKQor ICBpZiB0ZXN0IHgiJHBnYWNfYXZ4Ml9zdXBwb3J0IiA9IHgieWVzIjsgdGhlbgorICAgIEFDX0RF RklORShVU0VfQVZYMl9XSVRIX1JVTlRJTUVfQ0hFQ0ssIDEsIFtEZWZpbmUgdG8gMSB0byB1c2Ug QVZYMiBpbnN0cnVjdGlvbnMgd2l0aCBhIHJ1bnRpbWUgY2hlY2suXSkKKyAgZmkKK2ZpCisKICMg Q2hlY2sgZm9yIEFWWC01MTIgcG9wY291bnQgaW50cmluc2ljcwogIwogaWYgdGVzdCB4IiRob3N0 X2NwdSIgPSB4Ing4Nl82NCI7IHRoZW4KZGlmZiAtLWdpdCBhL21lc29uLmJ1aWxkIGIvbWVzb24u YnVpbGQKaW5kZXggMzk1NDE2YTYwNjAuLmEzN2VmODhiZjE2IDEwMDY0NAotLS0gYS9tZXNvbi5i dWlsZAorKysgYi9tZXNvbi5idWlsZApAQCAtMjI5Miw2ICsyMjkyLDM0IEBAIGludCBtYWluKHZv aWQpCiAKIGVuZGlmCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBB VlgyIHN1cHBvcnQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiBob3N0X2NwdSA9PSAneDg2XzY0JworCisgIHByb2cg PSAnJycKKyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZiBk ZWZpbmVkKF9faGFzX2F0dHJpYnV0ZSkgJiYgX19oYXNfYXR0cmlidXRlICh0YXJnZXQpCitfX2F0 dHJpYnV0ZV9fKCh0YXJnZXQoImF2eDIiKSkpCisjZW5kaWYKK2ludCBtYWluKHZvaWQpCit7Cisg IGNvbnN0IGNoYXIgYnVmW3NpemVvZihfX20yNTZpKV07CisgIF9fbTI1NmkgYWNjdW0gPSBfbW0y NTZfbG9hZHVfc2kyNTYoKGNvbnN0IF9fbTI1NmkgKikgYnVmKTsKKyAgYWNjdW0gPSBfbW0yNTZf YWRkX2VwaTMyKGFjY3VtLCBhY2N1bSk7CisgIGludCByZXN1bHQgPSBfbW0yNTZfZXh0cmFjdF9l cGkzMihhY2N1bSwgMCk7CisgIHJldHVybiAoaW50KSByZXN1bHQ7Cit9CisnJycKKworICBpZiBj Yy5saW5rcyhwcm9nLCBuYW1lOiAnQVZYMiBzdXBwb3J0JywgYXJnczogdGVzdF9jX2FyZ3MpCisg ICAgY2RhdGEuc2V0KCdVU0VfQVZYMl9XSVRIX1JVTlRJTUVfQ0hFQ0snLCAxKQorICBlbmRpZgor CitlbmRpZgorCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIwogIyBDaGVjayBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBBVlgt NTEyIHBvcGNvdW50IGludHJpbnNpY3MuCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdl L3BhZ2UvY2hlY2tzdW0uYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvcGFnZS9jaGVja3N1bS5jCmlu ZGV4IGM5MTM0NTliNWEzLi45ZWMxMTA2OGI5MyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3Rv cmFnZS9wYWdlL2NoZWNrc3VtLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9wYWdlL2NoZWNr c3VtLmMKQEAgLTE1LDggKzE1LDggQEAKIAogI2luY2x1ZGUgInN0b3JhZ2UvY2hlY2tzdW0uaCIK IC8qCi0gKiBUaGUgYWN0dWFsIGNvZGUgaXMgaW4gc3RvcmFnZS9jaGVja3N1bV9pbXBsLmguICBU aGlzIGlzIGRvbmUgc28gdGhhdAotICogZXh0ZXJuYWwgcHJvZ3JhbXMgY2FuIGluY29ycG9yYXRl IHRoZSBjaGVja3N1bSBjb2RlIGJ5ICNpbmNsdWRlJ2luZwotICogdGhhdCBmaWxlIGZyb20gdGhl IGV4cG9ydGVkIFBvc3RncmVzIGhlYWRlcnMuICAoQ29tcGFyZSBvdXIgQ1JDIGNvZGUuKQorICog VGhlIGFjdHVhbCBjaGVja3N1bSBpbXBsZW1lbnRhdGlvbiBpcyBub3cgaW4gc3JjL3BvcnQvY2hl Y2tzdW0uYworICogZm9yIGJldHRlciBtb2R1bGFyaXR5IGFuZCB0byBzdXBwb3J0IEFWWDIgb3B0 aW1pemF0aW9ucy4KKyAqIFdlIG9ubHkgbmVlZCB0byBpbmNsdWRlIHRoZSBoZWFkZXIgZm9yIGZ1 bmN0aW9uIGRlY2xhcmF0aW9ucy4KICAqLwogI2luY2x1ZGUgInN0b3JhZ2UvY2hlY2tzdW1faW1w bC5oIgkvKiBJV1lVIHByYWdtYToga2VlcCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvcGdf Y29uZmlnLmguaW4gYi9zcmMvaW5jbHVkZS9wZ19jb25maWcuaC5pbgppbmRleCBjNGRjNWQ3MmJk Yi4uOTg3ZjliNWM3N2MgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3BnX2NvbmZpZy5oLmluCisr KyBiL3NyYy9pbmNsdWRlL3BnX2NvbmZpZy5oLmluCkBAIC02NzUsNiArNjc1LDkgQEAKIC8qIERl ZmluZSB0byAxIHRvIHVzZSBBVlgtNTEyIENSQyBhbGdvcml0aG1zIHdpdGggYSBydW50aW1lIGNo ZWNrLiAqLwogI3VuZGVmIFVTRV9BVlg1MTJfQ1JDMzJDX1dJVEhfUlVOVElNRV9DSEVDSwogCisv KiBEZWZpbmUgdG8gMSB0byB1c2UgQVZYMiBpbnN0cnVjdGlvbnMgd2l0aCBhIHJ1bnRpbWUgY2hl Y2suICovCisjdW5kZWYgVVNFX0FWWDJfV0lUSF9SVU5USU1FX0NIRUNLCisKIC8qIERlZmluZSB0 byAxIHRvIHVzZSBBVlgtNTEyIHBvcGNvdW50IGluc3RydWN0aW9ucyB3aXRoIGEgcnVudGltZSBj aGVjay4gKi8KICN1bmRlZiBVU0VfQVZYNTEyX1BPUENOVF9XSVRIX1JVTlRJTUVfQ0hFQ0sKIApk aWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9jaGVja3N1bV9pbXBsLmggYi9zcmMvaW5j bHVkZS9zdG9yYWdlL2NoZWNrc3VtX2ltcGwuaAppbmRleCBkYTg3ZDYxYmE1Mi4uMTc0NDMzM2U3 ZWIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvY2hlY2tzdW1faW1wbC5oCisrKyBi L3NyYy9pbmNsdWRlL3N0b3JhZ2UvY2hlY2tzdW1faW1wbC5oCkBAIC0xMDEsMTIgKzEwMSwxNCBA QAogICovCiAKICNpbmNsdWRlICJzdG9yYWdlL2J1ZnBhZ2UuaCIKKyNpbmNsdWRlICJwZ19jb25m aWcuaCIKIAogLyogbnVtYmVyIG9mIGNoZWNrc3VtcyB0byBjYWxjdWxhdGUgaW4gcGFyYWxsZWwg Ki8KICNkZWZpbmUgTl9TVU1TIDMyCiAvKiBwcmltZSBtdWx0aXBsaWVyIG9mIEZOVi0xYSBoYXNo ICovCiAjZGVmaW5lIEZOVl9QUklNRSAxNjc3NzYxOQogCisKIC8qIFVzZSBhIHVuaW9uIHNvIHRo YXQgdGhpcyBjb2RlIGlzIHZhbGlkIHVuZGVyIHN0cmljdCBhbGlhc2luZyAqLwogdHlwZWRlZiB1 bmlvbgogewpAQCAtMTQyLDc0ICsxNDQsMTIgQEAgZG8geyBcCiAgKiBCbG9jayBjaGVja3N1bSBh bGdvcml0aG0uICBUaGUgcGFnZSBtdXN0IGJlIGFkZXF1YXRlbHkgYWxpZ25lZAogICogKGF0IGxl YXN0IG9uIDQtYnl0ZSBib3VuZGFyeSkuCiAgKi8KLXN0YXRpYyB1aW50MzIKLXBnX2NoZWNrc3Vt X2Jsb2NrKGNvbnN0IFBHQ2hlY2tzdW1tYWJsZVBhZ2UgKnBhZ2UpCi17Ci0JdWludDMyCQlzdW1z W05fU1VNU107Ci0JdWludDMyCQlyZXN1bHQgPSAwOwotCXVpbnQzMgkJaSwKLQkJCQlqOwotCi0J LyogZW5zdXJlIHRoYXQgdGhlIHNpemUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBhbGdvcml0aG0g Ki8KLQlBc3NlcnQoc2l6ZW9mKFBHQ2hlY2tzdW1tYWJsZVBhZ2UpID09IEJMQ0tTWik7Ci0KLQkv KiBpbml0aWFsaXplIHBhcnRpYWwgY2hlY2tzdW1zIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgb2Zm c2V0cyAqLwotCW1lbWNweShzdW1zLCBjaGVja3N1bUJhc2VPZmZzZXRzLCBzaXplb2YoY2hlY2tz dW1CYXNlT2Zmc2V0cykpOwotCi0JLyogbWFpbiBjaGVja3N1bSBjYWxjdWxhdGlvbiAqLwotCWZv ciAoaSA9IDA7IGkgPCAodWludDMyKSAoQkxDS1NaIC8gKHNpemVvZih1aW50MzIpICogTl9TVU1T KSk7IGkrKykKLQkJZm9yIChqID0gMDsgaiA8IE5fU1VNUzsgaisrKQotCQkJQ0hFQ0tTVU1fQ09N UChzdW1zW2pdLCBwYWdlLT5kYXRhW2ldW2pdKTsKLQotCS8qIGZpbmFsbHkgYWRkIGluIHR3byBy b3VuZHMgb2YgemVyb2VzIGZvciBhZGRpdGlvbmFsIG1peGluZyAqLwotCWZvciAoaSA9IDA7IGkg PCAyOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCBOX1NVTVM7IGorKykKLQkJCUNIRUNLU1VNX0NP TVAoc3Vtc1tqXSwgMCk7Ci0KLQkvKiB4b3IgZm9sZCBwYXJ0aWFsIGNoZWNrc3VtcyB0b2dldGhl ciAqLwotCWZvciAoaSA9IDA7IGkgPCBOX1NVTVM7IGkrKykKLQkJcmVzdWx0IF49IHN1bXNbaV07 Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogQ29tcHV0ZSB0aGUgY2hlY2tzdW0gZm9y IGEgUG9zdGdyZXMgcGFnZS4KLSAqCi0gKiBUaGUgcGFnZSBtdXN0IGJlIGFkZXF1YXRlbHkgYWxp Z25lZCAoYXQgbGVhc3Qgb24gYSA0LWJ5dGUgYm91bmRhcnkpLgotICogQmV3YXJlIGFsc28gdGhh dCB0aGUgY2hlY2tzdW0gZmllbGQgb2YgdGhlIHBhZ2UgaXMgdHJhbnNpZW50bHkgemVyb2VkLgot ICoKLSAqIFRoZSBjaGVja3N1bSBpbmNsdWRlcyB0aGUgYmxvY2sgbnVtYmVyICh0byBkZXRlY3Qg dGhlIGNhc2Ugd2hlcmUgYSBwYWdlIGlzCi0gKiBzb21laG93IG1vdmVkIHRvIGEgZGlmZmVyZW50 IGxvY2F0aW9uKSwgdGhlIHBhZ2UgaGVhZGVyIChleGNsdWRpbmcgdGhlCi0gKiBjaGVja3N1bSBp dHNlbGYpLCBhbmQgdGhlIHBhZ2UgZGF0YS4KLSAqLwotdWludDE2Ci1wZ19jaGVja3N1bV9wYWdl KGNoYXIgKnBhZ2UsIEJsb2NrTnVtYmVyIGJsa25vKQotewotCVBHQ2hlY2tzdW1tYWJsZVBhZ2Ug KmNwYWdlID0gKFBHQ2hlY2tzdW1tYWJsZVBhZ2UgKikgcGFnZTsKLQl1aW50MTYJCXNhdmVfY2hl Y2tzdW07Ci0JdWludDMyCQljaGVja3N1bTsKLQotCS8qIFdlIG9ubHkgY2FsY3VsYXRlIHRoZSBj aGVja3N1bSBmb3IgcHJvcGVybHktaW5pdGlhbGl6ZWQgcGFnZXMgKi8KLQlBc3NlcnQoIVBhZ2VJ c05ldygoUGFnZSkgcGFnZSkpOwotCi0JLyoKLQkgKiBTYXZlIHBkX2NoZWNrc3VtIGFuZCB0ZW1w b3JhcmlseSBzZXQgaXQgdG8gemVybywgc28gdGhhdCB0aGUgY2hlY2tzdW0KLQkgKiBjYWxjdWxh dGlvbiBpc24ndCBhZmZlY3RlZCBieSB0aGUgb2xkIGNoZWNrc3VtIHN0b3JlZCBvbiB0aGUgcGFn ZS4KLQkgKiBSZXN0b3JlIGl0IGFmdGVyLCBiZWNhdXNlIGFjdHVhbGx5IHVwZGF0aW5nIHRoZSBj aGVja3N1bSBpcyBOT1QgcGFydCBvZgotCSAqIHRoZSBBUEkgb2YgdGhpcyBmdW5jdGlvbi4KLQkg Ki8KLQlzYXZlX2NoZWNrc3VtID0gY3BhZ2UtPnBoZHIucGRfY2hlY2tzdW07Ci0JY3BhZ2UtPnBo ZHIucGRfY2hlY2tzdW0gPSAwOwotCWNoZWNrc3VtID0gcGdfY2hlY2tzdW1fYmxvY2soY3BhZ2Up OwotCWNwYWdlLT5waGRyLnBkX2NoZWNrc3VtID0gc2F2ZV9jaGVja3N1bTsKLQotCS8qIE1peCBp biB0aGUgYmxvY2sgbnVtYmVyIHRvIGRldGVjdCB0cmFuc3Bvc2VkIHBhZ2VzICovCi0JY2hlY2tz dW0gXj0gYmxrbm87Ci0KLQkvKgotCSAqIFJlZHVjZSB0byBhIHVpbnQxNiAodG8gZml0IGluIHRo ZSBwZF9jaGVja3N1bSBmaWVsZCkgd2l0aCBhbiBvZmZzZXQgb2YKLQkgKiBvbmUuIFRoYXQgYXZv aWRzIGNoZWNrc3VtcyBvZiB6ZXJvLCB3aGljaCBzZWVtcyBsaWtlIGEgZ29vZCBpZGVhLgotCSAq LwotCXJldHVybiAodWludDE2KSAoKGNoZWNrc3VtICUgNjU1MzUpICsgMSk7Ci19CisvKiBGdW5j dGlvbiBkZWNsYXJhdGlvbnMgZm9yIElTQS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgKi8KK3Vp bnQzMiBwZ19jaGVja3N1bV9ibG9ja19kZWZhdWx0KGNvbnN0IFBHQ2hlY2tzdW1tYWJsZVBhZ2Ug KnBhZ2UpOworI2lmZGVmIFVTRV9BVlgyX1dJVEhfUlVOVElNRV9DSEVDSwordWludDMyIHBnX2No ZWNrc3VtX2Jsb2NrX2F2eDIoY29uc3QgUEdDaGVja3N1bW1hYmxlUGFnZSAqcGFnZSk7CisjZW5k aWYKKwordWludDMyIHBnX2NoZWNrc3VtX2Jsb2NrX2Rpc3BhdGNoKGNvbnN0IFBHQ2hlY2tzdW1t YWJsZVBhZ2UgKnBhZ2UpOworZXh0ZXJuIHVpbnQzMiAoKnBnX2NoZWNrc3VtX2Jsb2NrKShjb25z dCBQR0NoZWNrc3VtbWFibGVQYWdlICpwYWdlKTsKK2V4dGVybiB1aW50MTYgcGdfY2hlY2tzdW1f cGFnZShjaGFyICpwYWdlLCBCbG9ja051bWJlciBibGtubyk7CmRpZmYgLS1naXQgYS9zcmMvcG9y dC9NYWtlZmlsZSBiL3NyYy9wb3J0L01ha2VmaWxlCmluZGV4IDQyNzQ5NDlkZmE0Li5hMjExZGRi ZGQ4MyAxMDA2NDQKLS0tIGEvc3JjL3BvcnQvTWFrZWZpbGUKKysrIGIvc3JjL3BvcnQvTWFrZWZp bGUKQEAgLTQ4LDYgKzQ4LDcgQEAgT0JKUyA9IFwKIAlwZ19udW1hLm8gXAogCXBnX3BvcGNvdW50 X2FhcmNoNjQubyBcCiAJcGdfcG9wY291bnRfYXZ4NTEyLm8gXAorCWNoZWNrc3VtLm8gXAogCXBn X3N0cm9uZ19yYW5kb20ubyBcCiAJcGdjaGVja2Rpci5vIFwKIAlwZ21rZGlycC5vIFwKZGlmZiAt LWdpdCBhL3NyYy9wb3J0L2NoZWNrc3VtLmMgYi9zcmMvcG9ydC9jaGVja3N1bS5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5iMmNiNjFmNThhMAotLS0gL2Rldi9udWxs CisrKyBiL3NyYy9wb3J0L2NoZWNrc3VtLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICoKKyAqIGNoZWNrc3VtLmMKKyAqCSAgQ2hlY2tzdW0gaW1wbGVtZW50YXRpb24g Zm9yIGRhdGEgcGFnZXMgd2l0aCBBVlgyIG9wdGltaXphdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUg Y29uc29saWRhdGVzIGFsbCBjaGVja3N1bS1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgaW5jbHVkaW5n OgorICogLSBSdW50aW1lIENQVSBmZWF0dXJlIGRldGVjdGlvbgorICogLSBEZWZhdWx0IGFuZCBB VlgyLW9wdGltaXplZCBpbXBsZW1lbnRhdGlvbnMKKyAqIC0gRnVuY3Rpb24gZGlzcGF0Y2ggbG9n aWMKKyAqIC0gUGFnZSBjaGVja3N1bSBjYWxjdWxhdGlvbgorICoKKyAqIFBvcnRpb25zIENvcHly aWdodCAoYykgMTk5Ni0yMDI1LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAor ICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5 IG9mIENhbGlmb3JuaWEKKyAqCisgKiBJREVOVElGSUNBVElPTgorICoJICBzcmMvcG9ydC9jaGVj a3N1bS5jCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJjLmgiCisjaW5j bHVkZSAic3RvcmFnZS9jaGVja3N1bV9pbXBsLmgiCisKKyNpZiBkZWZpbmVkKEhBVkVfX0dFVF9D UFVJRCkgfHwgZGVmaW5lZChIQVZFX19HRVRfQ1BVSURfQ09VTlQpCisjaW5jbHVkZSA8Y3B1aWQu aD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9YU0FWRV9JTlRSSU5TSUNTCisjaW5jbHVkZSA8aW1t aW50cmluLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9fQ1BVSUQpIHx8IGRlZmluZWQo SEFWRV9fQ1BVSURFWCkKKyNpbmNsdWRlIDxpbnRyaW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAi cG9ydC9wZ19iaXR1dGlscy5oIgorCisvKgorICogRG9lcyBDUFVJRCBzYXkgdGhlcmUncyBzdXBw b3J0IGZvciBYU0FWRSBpbnN0cnVjdGlvbnM/CisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbAoreHNh dmVfYXZhaWxhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGV4eFs0XSA9IHswLCAwLCAwLCAw fTsKKworI2lmIGRlZmluZWQoSEFWRV9fR0VUX0NQVUlEKQorCV9fZ2V0X2NwdWlkKDEsICZleHhb MF0sICZleHhbMV0sICZleHhbMl0sICZleHhbM10pOworI2VsaWYgZGVmaW5lZChIQVZFX19DUFVJ RCkKKwlfX2NwdWlkKGV4eCwgMSk7CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisjZXJyb3Ig Y3B1aWQgaW5zdHJ1Y3Rpb24gbm90IGF2YWlsYWJsZQorI2VuZGlmCisJcmV0dXJuIChleHhbMl0g JiAoMSA8PCAyNykpICE9IDA7ICAgICAgIC8qIG9zeHNhdmUgKi8KK30KKworLyoKKyAqIERvZXMg WEdFVEJWIHNheSB0aGUgWU1NIHJlZ2lzdGVycyBhcmUgZW5hYmxlZD8KKyAqCisgKiBOQjogQ2Fs bGVyIGlzIHJlc3BvbnNpYmxlIGZvciB2ZXJpZnlpbmcgdGhhdCB4c2F2ZV9hdmFpbGFibGUoKSBy ZXR1cm5zIHRydWUKKyAqIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKi8KKyNpZmRlZiBIQVZFX1hT QVZFX0lOVFJJTlNJQ1MKK3BnX2F0dHJpYnV0ZV90YXJnZXQoInhzYXZlIikKKyNlbmRpZgorc3Rh dGljIGlubGluZSBib29sCit5bW1fcmVnc19hdmFpbGFibGUodm9pZCkKK3sKKyNpZmRlZiBIQVZF X1hTQVZFX0lOVFJJTlNJQ1MKKwlyZXR1cm4gKF94Z2V0YnYoMCkgJiAweDA2KSA9PSAweDA2Owor I2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworLyoKKyAqIERvZXMgQ1BVSUQgc2F5 IHRoZXJlJ3Mgc3VwcG9ydCBmb3IgQVZYLTIKKyAqLworc3RhdGljIGlubGluZSBib29sCithdngy X2F2YWlsYWJsZSh2b2lkKQoreworI2lmIGRlZmluZWQgKFVTRV9BVlgyX1dJVEhfUlVOVElNRV9D SEVDSykKKwl1bnNpZ25lZCBpbnQgZXh4WzRdID0gezAsIDAsIDAsIDB9OworCWlmICgheHNhdmVf YXZhaWxhYmxlKCkgfHwgIXltbV9yZWdzX2F2YWlsYWJsZSgpKSByZXR1cm4gZmFsc2U7CisKKyNp ZiBkZWZpbmVkKEhBVkVfX0dFVF9DUFVJRF9DT1VOVCkKKwlfX2dldF9jcHVpZF9jb3VudCg3LCAw LCAmZXh4WzBdLCAmZXh4WzFdLCAmZXh4WzJdLCAmZXh4WzNdKTsKKyNlbGlmIGRlZmluZWQoSEFW RV9fQ1BVSURFWCkKKwlfX2NwdWlkZXgoZXh4LCA3LCAwKTsKKyNlbHNlCisjZXJyb3IgY3B1aWQg aW5zdHJ1Y3Rpb24gbm90IGF2YWlsYWJsZQorI2VuZGlmCisJcmV0dXJuIChleHhbMV0gJiAoMSA8 PCA1KSkgIT0gMDsgLyogYXZ4MiAqLworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CisjZW5kaWYKK30K KworLyogZGVmYXVsdCBjaGVja3N1bSBpbXBsZW1lbnRhdGlvbiAqLwordWludDMyCitwZ19jaGVj a3N1bV9ibG9ja19kZWZhdWx0KGNvbnN0IFBHQ2hlY2tzdW1tYWJsZVBhZ2UgKnBhZ2UpCit7CisJ dWludDMyIHN1bXNbTl9TVU1TXSwgcmVzdWx0ID0gMDsKKwl1aW50MzIgaSwgajsKKworCUFzc2Vy dChzaXplb2YoUEdDaGVja3N1bW1hYmxlUGFnZSkgPT0gQkxDS1NaKTsKKwltZW1jcHkoc3Vtcywg Y2hlY2tzdW1CYXNlT2Zmc2V0cywgc2l6ZW9mKGNoZWNrc3VtQmFzZU9mZnNldHMpKTsKKworCWZv ciAoaSA9IDA7IGkgPCAodWludDMyKShCTENLU1ogLyAoc2l6ZW9mKHVpbnQzMikgKiBOX1NVTVMp KTsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgTl9TVU1TOyBqKyspCisJCQlDSEVDS1NVTV9DT01Q KHN1bXNbal0sIHBhZ2UtPmRhdGFbaV1bal0pOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykK KwkJZm9yIChqID0gMDsgaiA8IE5fU1VNUzsgaisrKQorCQkJQ0hFQ0tTVU1fQ09NUChzdW1zW2pd LCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBOX1NVTVM7IGkrKykKKwkJcmVzdWx0IF49IHN1bXNb aV07CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgVVNFX0FWWDJfV0lUSF9SVU5USU1F X0NIRUNLCitwZ19hdHRyaWJ1dGVfdGFyZ2V0KCJhdngyIikKK3VpbnQzMgorcGdfY2hlY2tzdW1f YmxvY2tfYXZ4Mihjb25zdCBQR0NoZWNrc3VtbWFibGVQYWdlICpwYWdlKQoreworCXVpbnQzMiBz dW1zW05fU1VNU10sIHJlc3VsdCA9IDA7CisJdWludDMyIGksIGo7CisKKwlBc3NlcnQoc2l6ZW9m KFBHQ2hlY2tzdW1tYWJsZVBhZ2UpID09IEJMQ0tTWik7CisJbWVtY3B5KHN1bXMsIGNoZWNrc3Vt QmFzZU9mZnNldHMsIHNpemVvZihjaGVja3N1bUJhc2VPZmZzZXRzKSk7CisKKwlmb3IgKGkgPSAw OyBpIDwgKHVpbnQzMikoQkxDS1NaIC8gKHNpemVvZih1aW50MzIpICogTl9TVU1TKSk7IGkrKykK KwkJZm9yIChqID0gMDsgaiA8IE5fU1VNUzsgaisrKQorCQkJQ0hFQ0tTVU1fQ09NUChzdW1zW2pd LCBwYWdlLT5kYXRhW2ldW2pdKTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCWZvciAo aiA9IDA7IGogPCBOX1NVTVM7IGorKykKKwkJCUNIRUNLU1VNX0NPTVAoc3Vtc1tqXSwgMCk7CisK Kwlmb3IgKGkgPSAwOyBpIDwgTl9TVU1TOyBpKyspCisJCXJlc3VsdCBePSBzdW1zW2ldOworCisJ cmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisvKiBGdW5jdGlvbiBwb2ludGVyIC0gZXh0ZXJu YWwgbGlua2FnZSAoZGVjbGFyZWQgZXh0ZXJuIGluIGhlYWRlcikgKi8KK3VpbnQzMiAoKnBnX2No ZWNrc3VtX2Jsb2NrKShjb25zdCBQR0NoZWNrc3VtbWFibGVQYWdlICpwYWdlKSA9IHBnX2NoZWNr c3VtX2Jsb2NrX2Rpc3BhdGNoOworCisvKiBEaXNwYXRjaCBmdW5jdGlvbjogc2ltcGxlLCBzYWZl ICovCit1aW50MzIgcGdfY2hlY2tzdW1fYmxvY2tfZGlzcGF0Y2goY29uc3QgUEdDaGVja3N1bW1h YmxlUGFnZSAqcGFnZSkKK3sKKyNpZmRlZiBVU0VfQVZYMl9XSVRIX1JVTlRJTUVfQ0hFQ0sKKwlp ZiAoYXZ4Ml9hdmFpbGFibGUoKSkKKwl7CisJCXBnX2NoZWNrc3VtX2Jsb2NrID0gcGdfY2hlY2tz dW1fYmxvY2tfYXZ4MjsKKwkJcmV0dXJuIHBnX2NoZWNrc3VtX2Jsb2NrKHBhZ2UpOworCX0KKyNl bmRpZgorCS8qIGZhbGxiYWNrICovCisJcGdfY2hlY2tzdW1fYmxvY2sgPSBwZ19jaGVja3N1bV9i bG9ja19kZWZhdWx0OworCXJldHVybiBwZ19jaGVja3N1bV9ibG9jayhwYWdlKTsKK30KKworLyoK KyAqIENvbXB1dGUgdGhlIGNoZWNrc3VtIGZvciBhIFBvc3RncmVzIHBhZ2UuCisgKgorICogVGhl IHBhZ2UgbXVzdCBiZSBhZGVxdWF0ZWx5IGFsaWduZWQgKGF0IGxlYXN0IG9uIGEgNC1ieXRlIGJv dW5kYXJ5KS4KKyAqIEJld2FyZSBhbHNvIHRoYXQgdGhlIGNoZWNrc3VtIGZpZWxkIG9mIHRoZSBw YWdlIGlzIHRyYW5zaWVudGx5IHplcm9lZC4KKyAqCisgKiBUaGUgY2hlY2tzdW0gaW5jbHVkZXMg dGhlIGJsb2NrIG51bWJlciAodG8gZGV0ZWN0IHRoZSBjYXNlIHdoZXJlIGEgcGFnZSBpcworICog c29tZWhvdyBtb3ZlZCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiksIHRoZSBwYWdlIGhlYWRlciAo ZXhjbHVkaW5nIHRoZQorICogY2hlY2tzdW0gaXRzZWxmKSwgYW5kIHRoZSBwYWdlIGRhdGEuCisg Ki8KK3VpbnQxNiBwZ19jaGVja3N1bV9wYWdlKGNoYXIgKnBhZ2UsIEJsb2NrTnVtYmVyIGJsa25v KQoreworCVBHQ2hlY2tzdW1tYWJsZVBhZ2UgKmNwYWdlID0gKFBHQ2hlY2tzdW1tYWJsZVBhZ2Ug KikgcGFnZTsKKwl1aW50MTYgc2F2ZV9jaGVja3N1bTsKKwl1aW50MzIgY2hlY2tzdW07CisKKwkv KiBXZSBvbmx5IGNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gZm9yIHByb3Blcmx5LWluaXRpYWxpemVk IHBhZ2VzICovCisJQXNzZXJ0KCFQYWdlSXNOZXcoKFBhZ2UpIHBhZ2UpKTsKKworCS8qCisJICog U2F2ZSBwZF9jaGVja3N1bSBhbmQgdGVtcG9yYXJpbHkgc2V0IGl0IHRvIHplcm8sIHNvIHRoYXQg dGhlIGNoZWNrc3VtCisJICogY2FsY3VsYXRpb24gaXNuJ3QgYWZmZWN0ZWQgYnkgdGhlIG9sZCBj aGVja3N1bSBzdG9yZWQgb24gdGhlIHBhZ2UuCisJICogUmVzdG9yZSBpdCBhZnRlciwgYmVjYXVz ZSBhY3R1YWxseSB1cGRhdGluZyB0aGUgY2hlY2tzdW0gaXMgTk9UIHBhcnQgb2YKKwkgKiB0aGUg QVBJIG9mIHRoaXMgZnVuY3Rpb24uCisJICovCisJc2F2ZV9jaGVja3N1bSA9IGNwYWdlLT5waGRy LnBkX2NoZWNrc3VtOworCWNwYWdlLT5waGRyLnBkX2NoZWNrc3VtID0gMDsKKwljaGVja3N1bSA9 IHBnX2NoZWNrc3VtX2Jsb2NrKGNwYWdlKTsKKwljcGFnZS0+cGhkci5wZF9jaGVja3N1bSA9IHNh dmVfY2hlY2tzdW07CisKKwkvKiBNaXggaW4gdGhlIGJsb2NrIG51bWJlciB0byBkZXRlY3QgdHJh bnNwb3NlZCBwYWdlcyAqLworCWNoZWNrc3VtIF49IGJsa25vOworCisJLyoKKwkgKiBSZWR1Y2Ug dG8gYSB1aW50MTYgKHRvIGZpdCBpbiB0aGUgcGRfY2hlY2tzdW0gZmllbGQpIHdpdGggYW4gb2Zm c2V0IG9mCisJICogb25lLiBUaGF0IGF2b2lkcyBjaGVja3N1bXMgb2YgemVybywgd2hpY2ggc2Vl bXMgbGlrZSBhIGdvb2QgaWRlYS4KKwkgKi8KKwlyZXR1cm4gKHVpbnQxNikoKGNoZWNrc3VtICUg NjU1MzUpICsgMSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEv c3JjL3BvcnQvbWVzb24uYnVpbGQgYi9zcmMvcG9ydC9tZXNvbi5idWlsZAppbmRleCBmYzdiMDU5 ZmVlNS4uZmIyZmI1NWM2MWIgMTAwNjQ0Ci0tLSBhL3NyYy9wb3J0L21lc29uLmJ1aWxkCisrKyBi L3NyYy9wb3J0L21lc29uLmJ1aWxkCkBAIC0xMSw2ICsxMSw3IEBAIHBncG9ydF9zb3VyY2VzID0g WwogICAncGdfbnVtYS5jJywKICAgJ3BnX3BvcGNvdW50X2FhcmNoNjQuYycsCiAgICdwZ19wb3Bj b3VudF9hdng1MTIuYycsCisgICdjaGVja3N1bS5jJywKICAgJ3BnX3N0cm9uZ19yYW5kb20uYycs CiAgICdwZ2NoZWNrZGlyLmMnLAogICAncGdta2RpcnAuYycsCi0tIAoyLjQzLjAKCg== --00000000000003f3f706415581d1--