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 1twGpO-00CKGR-9u for pgsql-hackers@arkaria.postgresql.org; Sun, 23 Mar 2025 08:37:06 +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 1twGpM-00CSn5-2a for pgsql-hackers@arkaria.postgresql.org; Sun, 23 Mar 2025 08:37:04 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1twGpL-00CSmu-Jy for pgsql-hackers@lists.postgresql.org; Sun, 23 Mar 2025 08:37:03 +0000 Received: from mail-lj1-x22c.google.com ([2a00:1450:4864:20::22c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1twGpJ-000dzl-09 for pgsql-hackers@postgresql.org; Sun, 23 Mar 2025 08:37:03 +0000 Received: by mail-lj1-x22c.google.com with SMTP id 38308e7fff4ca-30bd11bfec6so37510321fa.0 for ; Sun, 23 Mar 2025 01:37:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742719019; x=1743323819; darn=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=c5XP5+G5RWMSb+MZegPAt+vnRWMLVPYXARPcmIrHrx8=; b=ffjUylLHrtSlBX/uGyrnZVjKqy7UUlk6Rvp2gEzTwWHJzqtFPrn6yGtZRFtowLC5Cl V7yovHVrrgLTIAcrcPIl/XpyOfWdTANHopdNU6pH2MCwKoEkNFVL71l9DVDSIXOzKCLR DVnsDp2swvdPW0lQQY6F0MDEvjkFDqoiaKEv9hwJZ/tWWERq+UKB8xICPHI4he34mGDk 7hs71f5Eekvh2AWxWxPGnVE5jIeneT6zhGLj/X9HPw+yEux3MAfrHWmlmf3yCiFKCrpL axWnr5mpaxcjDuSKMKASQDu//RjHw0TCL8tgl3x+B5t1mzO9gG51lnzuMpoeyd6qkRJs zBMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742719019; x=1743323819; 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=c5XP5+G5RWMSb+MZegPAt+vnRWMLVPYXARPcmIrHrx8=; b=F+nnQD6xaKKe1Nyt/9bBBZU7OjxG5HC7GGLdZN+ZyizSKwFjvF1ElQ0/LcDg8bVXgD VTRUBdMPgdpl0mzTPy3XIqPh/zK2GQZrtRkazMOAQYnI3ywwKiAshLvHp0h7T8+rBwHg 0ogIb2xUmydiWbYbIGBdykYXuKlgvQS0r911RZkUYBxAHOFHnYjgLK8rW6B9TL4dCy31 5F5INqu1xS5Tx8ZL49r+MRZhQvLQZowPJSZ8zz6f9lTicwx7br2/A/R2KKxLMTrTMw6i I+ikA5X0mu5KIOxS4rL3MU4SVECIZHK3OaWBR1RBGEOBpkPmfg1WiqxkTBWUt4WqfOWf JWiA== X-Forwarded-Encrypted: i=1; AJvYcCUjlo3RUakRlmny6n+cJd0LewJZI4faTb7dMgHVebCAUJKJd/VLu/GBGmI2U7eXuS78NY/57WF/OiQs20ni@postgresql.org X-Gm-Message-State: AOJu0Yw/h8HMA1oE/lu8bwJQxFN2te7cyetUF/YMBOQzSTaIA3o10et5 otQcYRL1E+B3oxvWUHBD9KngaIJaU+81xk68uSUDDXkzG6ZiOlxli9hbK3uI5WE2M8DTAbjmeJt /SwDc4vxEA736CfmDHOk5X5a0aKq2ENY+ X-Gm-Gg: ASbGnct0KrS4EUgClhhiYNo5tDZfhV9lQNQ4spN9RjBVSp4k4ECehtUPM2hSuu/Vyog tjeT/PT2uCO9maH6OcCjqiKeStel92OneHii769RS6UpXO7rkTUHf8aJBJhP9886Gpw0QDmUYiv sNErA6OPfyPlhrDSvuuaYNa9qst0VRkxnLQ7MvgKsV9LoUd6S8kjCqzJJVgvw= X-Google-Smtp-Source: AGHT+IFGJRz8r4CokE1rWrdCNOI4Hw2u09REiLEGFVPt6ZNUOHqGc8DASM0ddwz6Xi5FPmB+lC3j64mUf7xQ46TA+3g= X-Received: by 2002:a05:6512:b96:b0:545:a1a:5576 with SMTP id 2adb3069b0e04-54ad648ed55mr3254301e87.22.1742719018826; Sun, 23 Mar 2025 01:36:58 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Rahila Syed Date: Sun, 23 Mar 2025 14:06:47 +0530 X-Gm-Features: AQ5f1JoilYYP4pJH6ww5rFt9vLfG0FdRjBF-SPD7vIxDYljv9Rtt18oSay5iczM Message-ID: Subject: Re: Improve monitoring of shared memory allocations To: Nazir Bilal Yavuz Cc: Andres Freund , PostgreSQL-development Content-Type: multipart/mixed; boundary="0000000000000f9fb40630fe6482" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000000f9fb40630fe6482 Content-Type: multipart/alternative; boundary="0000000000000f9fb10630fe6480" --0000000000000f9fb10630fe6480 Content-Type: text/plain; charset="UTF-8" Hi Bilal, I have a couple of comments, I have only reviewed 0001 so far. > Thank you for reviewing! > > You may need to run pgindent, it makes some changes. > Attached v4-patch has been updated after running pgindent. + * If table is shared, calculate the offset at which to find the > the > + * first partition of elements > + */ > + > + nsegs = compute_buckets_and_segs(nelem, &nbuckets, > hctl->num_partitions, hctl->ssize); > > Blank line between the comment and the code. > Removed this. > /* > * allocate some new elements and link them into the indicated free list > */ > -static bool > -element_alloc(HTAB *hashp, int nelem, int freelist_idx) > +static HASHELEMENT * > +element_alloc(HTAB *hashp, int nelem) > > Comment needs an update. This function no longer links elements into > the free list. > Updated this and few other comments in the attached v4-patch. > > +static int > +compute_buckets_and_segs(long nelem, int *nbuckets, long > num_partitions, long ssize) > +{ > ... > + /* > + * In a partitioned table, nbuckets must be at least equal to > + * num_partitions; were it less, keys with apparently different > partition > + * numbers would map to the same bucket, breaking partition > independence. > + * (Normally nbuckets will be much bigger; this is just a safety > check.) > + */ > + while ((*nbuckets) < num_partitions) > + (*nbuckets) <<= 1; > > I have some worries about this function, I am not sure what I said > below has real life implications as you already said 'Normally > nbuckets will be much bigger; this is just a safety check.'. > > 1- num_partitions is long and nbuckets is int, so could there be any > case where num_partition is bigger than MAX_INT and cause an infinite > loop? > 2- Although we assume both nbuckets and num_partition initialized as > the same type, (*nbuckets) <<= 1 will cause an infinite loop if > num_partition is bigger than MAX_TYPE / 2. > > So I think that the solution is to confirm that num_partition < > MAX_NBUCKETS_TYPE / 2, what do you think? > > Your concern is valid. This has been addressed in the existing code by calling next_pow2_int() on num_partitions before running the function. Additionally, I am not adding any new code to the compute_buckets_and_segs function. I am simply moving part of the init_tab() code into a separate function for reuse. Please find attached the updated and rebased patches. Thank you, Rahila Syed --0000000000000f9fb10630fe6480 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Bilal,


I have a couple of comments, I have only reviewed 0001 so far.

Thank you for reviewing!=C2=A0
=C2=A0

You may need to run pgindent, it makes some changes.
= =C2=A0
Attached v4-patch has been updated after running pgindent.

+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* If table is shared, calculate the offs= et at which to find the the
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* first partition of elements
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*/
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 nsegs =3D compute_buckets_and_segs(nelem, &= ;nbuckets,
hctl->num_partitions, hctl->ssize);

Blank line between the comment and the code.
=C2=A0
Removed this.
=C2=A0
=C2=A0/*
=C2=A0 * allocate some new elements and link them into the indicated free l= ist
=C2=A0 */
-static bool
-element_alloc(HTAB *hashp, int nelem, int freelist_idx)
+static HASHELEMENT *
+element_alloc(HTAB *hashp, int nelem)

Comment needs an update. This function no longer links elements into
the free list.

Updated this and few other comments= in the attached v4-patch.
=C2=A0

+static int
+compute_buckets_and_segs(long nelem, int *nbuckets, long
num_partitions, long ssize)
+{
...
+=C2=A0 =C2=A0 /*
+=C2=A0 =C2=A0 =C2=A0* In a partitioned table, nbuckets must be at least eq= ual to
+=C2=A0 =C2=A0 =C2=A0* num_partitions; were it less, keys with apparently d= ifferent partition
+=C2=A0 =C2=A0 =C2=A0* numbers would map to the same bucket, breaking parti= tion independence.
+=C2=A0 =C2=A0 =C2=A0* (Normally nbuckets will be much bigger; this is just= a safety check.)
+=C2=A0 =C2=A0 =C2=A0*/
+=C2=A0 =C2=A0 while ((*nbuckets) < num_partitions)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*nbuckets) <<=3D 1;

I have some worries about this function, I am not sure what I said
below has real life implications as you already said 'Normally
nbuckets will be much bigger; this is just a safety check.'.

1- num_partitions is long and nbuckets is int, so could there be any
case where num_partition is bigger than MAX_INT and cause an infinite
loop?
2- Although we assume both nbuckets and num_partition initialized as
the same type, (*nbuckets) <<=3D 1 will cause an infinite loop if
num_partition is bigger than MAX_TYPE / 2.

So I think that the solution is to confirm that num_partition <
MAX_NBUCKETS_TYPE / 2, what do you think?

=C2=A0
Your concern is valid. This has been= addressed in the existing code by
calling next_pow2_int() on num_parti= tions before running the function.
Additionally, I am not adding any ne= w code to the compute_buckets_and_segs
function. I am simply moving par= t of the init_tab() code into a separate function
for reuse.

Ple= ase find attached the updated and rebased patches.

Thank you,
Rah= ila Syed
--0000000000000f9fb10630fe6480-- --0000000000000f9fb40630fe6482 Content-Type: application/octet-stream; name="v4-0002-Replace-ShmemAlloc-calls-by-ShmemInitStruct.patch" Content-Disposition: attachment; filename="v4-0002-Replace-ShmemAlloc-calls-by-ShmemInitStruct.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m8ldvd9t0 RnJvbSA1NmMxY2E5NGVmMTA5ZjQ4NGEwMTQ5NmYwOWU5YWJhMmJlZDBhM2E5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSYWhpbGEgU3llZCA8cmFoaWxhc3llZC45MEBnbWFpbC5jb20+ CkRhdGU6IFRodSwgNiBNYXIgMjAyNSAyMDozMjoyNyArMDUzMApTdWJqZWN0OiBbUEFUQ0ggMi8y XSBSZXBsYWNlIFNobWVtQWxsb2MgY2FsbHMgYnkgU2htZW1Jbml0U3RydWN0CgpUaGUgc2hhcmVk IG1lbW9yeSBhbGxvY2F0ZWQgYnkgU2htZW1BbGxvYyBpcyBub3QgdHJhY2tlZApieSBwZ19zaG1l bV9hbGxvY2F0aW9ucy4gVGhpcyBjb21taXQgcmVwbGFjZXMgbW9zdCBvZiB0aGUKY2FsbHMgdG8g U2htZW1BbGxvYyBieSBTaG1lbUluaXRTdHJ1Y3QgdG8gYXNzb2NpYXRlIGEgbmFtZQp3aXRoIHRo ZSBhbGxvY2F0aW9ucyBhbmQgZW5zdXJlIHRoYXQgdGhleSBnZXQgdHJhY2tlZCBieQpwZ19zaG1l bV9hbGxvY2F0aW9ucy4gSXQgYWxzbyBtZXJnZXMgc2V2ZXJhbCBzbWFsbGVyClNobWVtQWxsb2Mg Y2FsbHMgaW50byBsYXJnZXIgU2htZW1Jbml0U3RydWN0IHRvIGFsbG9jYXRlCmFuZCB0cmFjayBh bGwgdGhlIHJlbGF0ZWQgbWVtb3J5IGFsbG9jYXRpb25zIHVuZGVyIHNpbmdsZQotLS0KIHNyYy9i YWNrZW5kL3N0b3JhZ2UvbG1nci9wcmVkaWNhdGUuYyB8IDE3ICsrKysrKystLS0tLS0tCiBzcmMv YmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJvYy5jICAgICAgfCAzMyArKysrKysrKysrKysrKysrKysr KysrKy0tLS0tCiAyIGZpbGVzIGNoYW5nZWQsIDM2IGluc2VydGlvbnMoKyksIDE0IGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9wcmVkaWNhdGUuYyBi L3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9wcmVkaWNhdGUuYwppbmRleCA1YjIxYTA1Mzk4Li5k ZDY2OTkwMzM1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJlZGljYXRl LmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL3ByZWRpY2F0ZS5jCkBAIC0xMjI2LDgg KzEyMjYsMTEgQEAgUHJlZGljYXRlTG9ja1NobWVtSW5pdCh2b2lkKQogCSAqLwogCW1heF90YWJs ZV9zaXplICo9IDEwOwogCisJcmVxdWVzdFNpemUgPSBhZGRfc2l6ZShQcmVkWGFjdExpc3REYXRh U2l6ZSwKKwkJCQkJCSAgIChtdWxfc2l6ZSgoU2l6ZSkgbWF4X3RhYmxlX3NpemUsCisJCQkJCQkJ CQkgc2l6ZW9mKFNFUklBTElaQUJMRVhBQ1QpKSkpOwogCVByZWRYYWN0ID0gU2htZW1Jbml0U3Ry dWN0KCJQcmVkWGFjdExpc3QiLAotCQkJCQkJCSAgIFByZWRYYWN0TGlzdERhdGFTaXplLAorCQkJ CQkJCSAgIHJlcXVlc3RTaXplLAogCQkJCQkJCSAgICZmb3VuZCk7CiAJQXNzZXJ0KGZvdW5kID09 IElzVW5kZXJQb3N0bWFzdGVyKTsKIAlpZiAoIWZvdW5kKQpAQCAtMTI0Miw5ICsxMjQ1LDcgQEAg UHJlZGljYXRlTG9ja1NobWVtSW5pdCh2b2lkKQogCQlQcmVkWGFjdC0+TGFzdFN4YWN0Q29tbWl0 U2VxTm8gPSBGaXJzdE5vcm1hbFNlckNvbW1pdFNlcU5vIC0gMTsKIAkJUHJlZFhhY3QtPkNhblBh cnRpYWxDbGVhclRocm91Z2ggPSAwOwogCQlQcmVkWGFjdC0+SGF2ZVBhcnRpYWxDbGVhcmVkVGhy b3VnaCA9IDA7Ci0JCXJlcXVlc3RTaXplID0gbXVsX3NpemUoKFNpemUpIG1heF90YWJsZV9zaXpl LAotCQkJCQkJCSAgIHNpemVvZihTRVJJQUxJWkFCTEVYQUNUKSk7Ci0JCVByZWRYYWN0LT5lbGVt ZW50ID0gU2htZW1BbGxvYyhyZXF1ZXN0U2l6ZSk7CisJCVByZWRYYWN0LT5lbGVtZW50ID0gKFNF UklBTElaQUJMRVhBQ1QgKikgKChjaGFyICopIFByZWRYYWN0ICsgUHJlZFhhY3RMaXN0RGF0YVNp emUpOwogCQkvKiBBZGQgYWxsIGVsZW1lbnRzIHRvIGF2YWlsYWJsZSBsaXN0LCBjbGVhbi4gKi8K IAkJbWVtc2V0KFByZWRYYWN0LT5lbGVtZW50LCAwLCByZXF1ZXN0U2l6ZSk7CiAJCWZvciAoaSA9 IDA7IGkgPCBtYXhfdGFibGVfc2l6ZTsgaSsrKQpAQCAtMTI5OSw5ICsxMzAwLDExIEBAIFByZWRp Y2F0ZUxvY2tTaG1lbUluaXQodm9pZCkKIAkgKiBwcm9iYWJseSBPSy4KIAkgKi8KIAltYXhfdGFi bGVfc2l6ZSAqPSA1OworCXJlcXVlc3RTaXplID0gbXVsX3NpemUoKFNpemUpIG1heF90YWJsZV9z aXplLAorCQkJCQkJICAgUldDb25mbGljdERhdGFTaXplKTsKIAogCVJXQ29uZmxpY3RQb29sID0g U2htZW1Jbml0U3RydWN0KCJSV0NvbmZsaWN0UG9vbCIsCi0JCQkJCQkJCQkgUldDb25mbGljdFBv b2xIZWFkZXJEYXRhU2l6ZSwKKwkJCQkJCQkJCSBSV0NvbmZsaWN0UG9vbEhlYWRlckRhdGFTaXpl ICsgcmVxdWVzdFNpemUsCiAJCQkJCQkJCQkgJmZvdW5kKTsKIAlBc3NlcnQoZm91bmQgPT0gSXNV bmRlclBvc3RtYXN0ZXIpOwogCWlmICghZm91bmQpCkBAIC0xMzA5LDkgKzEzMTIsNyBAQCBQcmVk aWNhdGVMb2NrU2htZW1Jbml0KHZvaWQpCiAJCWludAkJCWk7CiAKIAkJZGxpc3RfaW5pdCgmUldD b25mbGljdFBvb2wtPmF2YWlsYWJsZUxpc3QpOwotCQlyZXF1ZXN0U2l6ZSA9IG11bF9zaXplKChT aXplKSBtYXhfdGFibGVfc2l6ZSwKLQkJCQkJCQkgICBSV0NvbmZsaWN0RGF0YVNpemUpOwotCQlS V0NvbmZsaWN0UG9vbC0+ZWxlbWVudCA9IFNobWVtQWxsb2MocmVxdWVzdFNpemUpOworCQlSV0Nv bmZsaWN0UG9vbC0+ZWxlbWVudCA9IChSV0NvbmZsaWN0KSAoKGNoYXIgKikgUldDb25mbGljdFBv b2wgKyBSV0NvbmZsaWN0UG9vbEhlYWRlckRhdGFTaXplKTsKIAkJLyogQWRkIGFsbCBlbGVtZW50 cyB0byBhdmFpbGFibGUgbGlzdCwgY2xlYW4uICovCiAJCW1lbXNldChSV0NvbmZsaWN0UG9vbC0+ ZWxlbWVudCwgMCwgcmVxdWVzdFNpemUpOwogCQlmb3IgKGkgPSAwOyBpIDwgbWF4X3RhYmxlX3Np emU7IGkrKykKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9wcm9jLmMgYi9z cmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJvYy5jCmluZGV4IGU0Y2E4NjFhOGUuLjY1MjM5ZDc0 M2QgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9wcm9jLmMKKysrIGIvc3Jj L2JhY2tlbmQvc3RvcmFnZS9sbWdyL3Byb2MuYwpAQCAtODgsNiArODgsNyBAQCBzdGF0aWMgdm9p ZCBSZW1vdmVQcm9jRnJvbUFycmF5KGludCBjb2RlLCBEYXR1bSBhcmcpOwogc3RhdGljIHZvaWQg UHJvY0tpbGwoaW50IGNvZGUsIERhdHVtIGFyZyk7CiBzdGF0aWMgdm9pZCBBdXhpbGlhcnlQcm9j S2lsbChpbnQgY29kZSwgRGF0dW0gYXJnKTsKIHN0YXRpYyB2b2lkIENoZWNrRGVhZExvY2sodm9p ZCk7CitzdGF0aWMgU2l6ZSBQR1Byb2NTaG1lbVNpemUodm9pZCk7CiAKIAogLyoKQEAgLTE3NSw2 ICsxNzYsNyBAQCBJbml0UHJvY0dsb2JhbCh2b2lkKQogCQkJICAgKmZwRW5kUHRyIFBHX1VTRURf Rk9SX0FTU0VSVFNfT05MWTsKIAlTaXplCQlmcExvY2tCaXRzU2l6ZSwKIAkJCQlmcFJlbElkU2l6 ZTsKKwlTaXplCQlyZXF1ZXN0U2l6ZTsKIAogCS8qIENyZWF0ZSB0aGUgUHJvY0dsb2JhbCBzaGFy ZWQgc3RydWN0dXJlICovCiAJUHJvY0dsb2JhbCA9IChQUk9DX0hEUiAqKQpAQCAtMjA0LDcgKzIw NiwxMCBAQCBJbml0UHJvY0dsb2JhbCh2b2lkKQogCSAqIHdpdGggYSBzaW5nbGUgZnJlZWxpc3Qu KSAgRWFjaCBQR1BST0Mgc3RydWN0dXJlIGlzIGRlZGljYXRlZCB0byBleGFjdGx5CiAJICogb25l IG9mIHRoZXNlIHB1cnBvc2VzLCBhbmQgdGhleSBkbyBub3QgbW92ZSBiZXR3ZWVuIGdyb3Vwcy4K IAkgKi8KLQlwcm9jcyA9IChQR1BST0MgKikgU2htZW1BbGxvYyhUb3RhbFByb2NzICogc2l6ZW9m KFBHUFJPQykpOworCXJlcXVlc3RTaXplID0gUEdQcm9jU2htZW1TaXplKCk7CisKKwlwcm9jcyA9 IChQR1BST0MgKikgU2htZW1Jbml0U3RydWN0KCJQR1BST0Mgc3RydWN0dXJlcyIsIHJlcXVlc3RT aXplLCAmZm91bmQpOworCiAJTWVtU2V0KHByb2NzLCAwLCBUb3RhbFByb2NzICogc2l6ZW9mKFBH UFJPQykpOwogCVByb2NHbG9iYWwtPmFsbFByb2NzID0gcHJvY3M7CiAJLyogWFhYIGFsbFByb2ND b3VudCBpc24ndCByZWFsbHkgYWxsIG9mIHRoZW07IGl0IGV4Y2x1ZGVzIHByZXBhcmVkIHhhY3Rz ICovCkBAIC0yMTgsMTEgKzIyMywxMSBAQCBJbml0UHJvY0dsb2JhbCh2b2lkKQogCSAqIGhvdyBo b3RseSB0aGV5IGFyZSBhY2Nlc3NlZC4KIAkgKi8KIAlQcm9jR2xvYmFsLT54aWRzID0KLQkJKFRy YW5zYWN0aW9uSWQgKikgU2htZW1BbGxvYyhUb3RhbFByb2NzICogc2l6ZW9mKCpQcm9jR2xvYmFs LT54aWRzKSk7CisJCShUcmFuc2FjdGlvbklkICopICgoY2hhciAqKSBwcm9jcyArIFRvdGFsUHJv Y3MgKiBzaXplb2YoUEdQUk9DKSk7CiAJTWVtU2V0KFByb2NHbG9iYWwtPnhpZHMsIDAsIFRvdGFs UHJvY3MgKiBzaXplb2YoKlByb2NHbG9iYWwtPnhpZHMpKTsKLQlQcm9jR2xvYmFsLT5zdWJ4aWRT dGF0ZXMgPSAoWGlkQ2FjaGVTdGF0dXMgKikgU2htZW1BbGxvYyhUb3RhbFByb2NzICogc2l6ZW9m KCpQcm9jR2xvYmFsLT5zdWJ4aWRTdGF0ZXMpKTsKKwlQcm9jR2xvYmFsLT5zdWJ4aWRTdGF0ZXMg PSAoWGlkQ2FjaGVTdGF0dXMgKikgKChjaGFyICopIFByb2NHbG9iYWwtPnhpZHMgKyBUb3RhbFBy b2NzICogc2l6ZW9mKCpQcm9jR2xvYmFsLT54aWRzKSArIFBHX0NBQ0hFX0xJTkVfU0laRSk7CiAJ TWVtU2V0KFByb2NHbG9iYWwtPnN1YnhpZFN0YXRlcywgMCwgVG90YWxQcm9jcyAqIHNpemVvZigq UHJvY0dsb2JhbC0+c3VieGlkU3RhdGVzKSk7Ci0JUHJvY0dsb2JhbC0+c3RhdHVzRmxhZ3MgPSAo dWludDggKikgU2htZW1BbGxvYyhUb3RhbFByb2NzICogc2l6ZW9mKCpQcm9jR2xvYmFsLT5zdGF0 dXNGbGFncykpOworCVByb2NHbG9iYWwtPnN0YXR1c0ZsYWdzID0gKHVpbnQ4ICopICgoY2hhciAq KSBQcm9jR2xvYmFsLT5zdWJ4aWRTdGF0ZXMgKyBUb3RhbFByb2NzICogc2l6ZW9mKCpQcm9jR2xv YmFsLT5zdWJ4aWRTdGF0ZXMpICsgUEdfQ0FDSEVfTElORV9TSVpFKTsKIAlNZW1TZXQoUHJvY0ds b2JhbC0+c3RhdHVzRmxhZ3MsIDAsIFRvdGFsUHJvY3MgKiBzaXplb2YoKlByb2NHbG9iYWwtPnN0 YXR1c0ZsYWdzKSk7CiAKIAkvKgpAQCAtMjMzLDcgKzIzOCw3IEBAIEluaXRQcm9jR2xvYmFsKHZv aWQpCiAJZnBMb2NrQml0c1NpemUgPSBNQVhBTElHTihGYXN0UGF0aExvY2tHcm91cHNQZXJCYWNr ZW5kICogc2l6ZW9mKHVpbnQ2NCkpOwogCWZwUmVsSWRTaXplID0gTUFYQUxJR04oRmFzdFBhdGhM b2NrU2xvdHNQZXJCYWNrZW5kKCkgKiBzaXplb2YoT2lkKSk7CiAKLQlmcFB0ciA9IFNobWVtQWxs b2MoVG90YWxQcm9jcyAqIChmcExvY2tCaXRzU2l6ZSArIGZwUmVsSWRTaXplKSk7CisJZnBQdHIg PSBTaG1lbUluaXRTdHJ1Y3QoIkZhc3QgcGF0aCBsb2NrIGFycmF5cyIsIFRvdGFsUHJvY3MgKiAo ZnBMb2NrQml0c1NpemUgKyBmcFJlbElkU2l6ZSksICZmb3VuZCk7CiAJTWVtU2V0KGZwUHRyLCAw LCBUb3RhbFByb2NzICogKGZwTG9ja0JpdHNTaXplICsgZnBSZWxJZFNpemUpKTsKIAogCS8qIEZv ciBhc3NlcnRzIGNoZWNraW5nIHdlIGRpZCBub3Qgb3ZlcmZsb3cuICovCkBAIC0zMzAsMTAgKzMz NSwyNiBAQCBJbml0UHJvY0dsb2JhbCh2b2lkKQogCVByZXBhcmVkWGFjdFByb2NzID0gJnByb2Nz W01heEJhY2tlbmRzICsgTlVNX0FVWElMSUFSWV9QUk9DU107CiAKIAkvKiBDcmVhdGUgUHJvY1N0 cnVjdExvY2sgc3BpbmxvY2ssIHRvbyAqLwotCVByb2NTdHJ1Y3RMb2NrID0gKHNsb2NrX3QgKikg U2htZW1BbGxvYyhzaXplb2Yoc2xvY2tfdCkpOworCVByb2NTdHJ1Y3RMb2NrID0gKHNsb2NrX3Qg KikgU2htZW1Jbml0U3RydWN0KCJQcm9jU3RydWN0TG9jayBzcGlubG9jayIsIHNpemVvZihzbG9j a190KSwgJmZvdW5kKTsKIAlTcGluTG9ja0luaXQoUHJvY1N0cnVjdExvY2spOwogfQogCitzdGF0 aWMgU2l6ZQorUEdQcm9jU2htZW1TaXplKHZvaWQpCit7CisJU2l6ZQkJc2l6ZTsKKwl1aW50MzIJ CVRvdGFsUHJvY3MgPSBNYXhCYWNrZW5kcyArIE5VTV9BVVhJTElBUllfUFJPQ1MgKyBtYXhfcHJl cGFyZWRfeGFjdHM7CisKKwlzaXplID0gVG90YWxQcm9jcyAqIHNpemVvZihQR1BST0MpOworCXNp emUgPSBhZGRfc2l6ZShzaXplLCBUb3RhbFByb2NzICogc2l6ZW9mKCpQcm9jR2xvYmFsLT54aWRz KSk7CisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIFBHX0NBQ0hFX0xJTkVfU0laRSk7CisJc2l6ZSA9 IGFkZF9zaXplKHNpemUsIFRvdGFsUHJvY3MgKiBzaXplb2YoKlByb2NHbG9iYWwtPnN1YnhpZFN0 YXRlcykpOworCXNpemUgPSBhZGRfc2l6ZShzaXplLCBQR19DQUNIRV9MSU5FX1NJWkUpOworCXNp emUgPSBhZGRfc2l6ZShzaXplLCBUb3RhbFByb2NzICogc2l6ZW9mKCpQcm9jR2xvYmFsLT5zdGF0 dXNGbGFncykpOworCXNpemUgPSBhZGRfc2l6ZShzaXplLCBQR19DQUNIRV9MSU5FX1NJWkUpOwor CXJldHVybiBzaXplOworfQorCiAvKgogICogSW5pdFByb2Nlc3MgLS0gaW5pdGlhbGl6ZSBhIHBl ci1wcm9jZXNzIFBHUFJPQyBlbnRyeSBmb3IgdGhpcyBiYWNrZW5kCiAgKi8KLS0gCjIuMzQuMQoK --0000000000000f9fb40630fe6482 Content-Type: application/octet-stream; name="v4-0001-Account-for-initial-shared-memory-allocated-by-hash_.patch" Content-Disposition: attachment; filename="v4-0001-Account-for-initial-shared-memory-allocated-by-hash_.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m8ldvhis1 RnJvbSAyMzUyZDQ5MThmM2M1YjU0ODc5MGRlOGUyYTY3Mzc1OWQ4M2I2Zjk2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSYWhpbGEgU3llZCA8cmFoaWxhc3llZC45MEBnbWFpbC5jb20+ CkRhdGU6IFRodSwgNiBNYXIgMjAyNSAyMDowNjoyMCArMDUzMApTdWJqZWN0OiBbUEFUQ0ggMS8y XSBBY2NvdW50IGZvciBpbml0aWFsIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGVkIGJ5CiBoYXNoX2Ny ZWF0ZQoKcGdfc2htZW1fYWxsb2NhdGlvbnMgdHJhY2tzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5 IFNobWVtSW5pdFN0cnVjdCwKd2hpY2gsIGluIGNhc2Ugb2Ygc2hhcmVkIGhhc2ggdGFibGVzLCBv bmx5IGNvdmVycyBtZW1vcnkgYWxsb2NhdGVkCnRvIHRoZSBoYXNoIGRpcmVjdG9yeSBhbmQgY29u dHJvbCBzdHJ1Y3R1cmUuIFRoZSBoYXNoIHNlZ21lbnRzIGFuZApidWNrZXRzIGFyZSBhbGxvY2F0 ZWQgdXNpbmcgU2htZW1BbGxvY05vRXJyb3Igd2hpY2ggZG9lcyBub3QgYXR0cmlidXRlCnRoZSBh bGxvY2F0aW9ucyB0byB0aGUgaGFzaCB0YWJsZSBuYW1lLiBUaHVzLCB0aGVzZSBhbGxvY2F0aW9u cyBhcmUKbm90IHRyYWNrZWQgaW4gcGdfc2htZW1fYWxsb2NhdGlvbnMuCgpJbmNsdWRlIHRoZSBh bGxvY2F0aW9uIG9mIHNlZ21lbnRzLCBidWNrZXRzIGFuZCBlbGVtZW50cyBpbiB0aGUgaW5pdGlh bAphbGxvY2F0aW9uIG9mIHNoYXJlZCBoYXNoIGRpcmVjdG9yeS4gVGhpcyByZXN1bHRzIGluIHRo ZSBleGlzdGluZyBTaG1lbUluZGV4CmVudHJpZXMgdG8gcmVmbGVjdCBhbGwgdGhlc2UgYWxsb2Nh dGlvbnMuIFRoZSByZXN1bHRpbmcgdHVwbGVzIGluCnBnX3NobWVtX2FsbG9jYXRpb25zIHJlcHJl c2VudCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgaW5pdGlhbCBoYXNoIHRhYmxlCmluY2x1ZGluZyBh bGwgdGhlIGJ1Y2tldHMgYW5kIHRoZSBlbGVtZW50cyB0aGV5IGNvbnRhaW4sIGluc3RlYWQgb2Yg anVzdAp0aGUgZGlyZWN0b3J5IHNpemUuCi0tLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvc2ht ZW0uYyAgIHwgICAzICstCiBzcmMvYmFja2VuZC91dGlscy9oYXNoL2R5bmFoYXNoLmMgfCAyMjAg KysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tCiBzcmMvaW5jbHVkZS91dGlscy9oc2VhcmNo LmggICAgICAgfCAgIDMgKy0KIDMgZmlsZXMgY2hhbmdlZCwgMTY5IGluc2VydGlvbnMoKyksIDU3 IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3NobWVt LmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9zaG1lbS5jCmluZGV4IDg5NWE0M2ZiMzkuLmQ4 YWVkMGJmYWEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3NobWVtLmMKKysr IGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvc2htZW0uYwpAQCAtNzMsNiArNzMsNyBAQAogI2lu Y2x1ZGUgInN0b3JhZ2Uvc2htZW0uaCIKICNpbmNsdWRlICJzdG9yYWdlL3NwaW4uaCIKICNpbmNs dWRlICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxzL2R5bmFoYXNoLmgiCiAKIHN0 YXRpYyB2b2lkICpTaG1lbUFsbG9jUmF3KFNpemUgc2l6ZSwgU2l6ZSAqYWxsb2NhdGVkX3NpemUp OwogCkBAIC0zNDYsNyArMzQ3LDcgQEAgU2htZW1Jbml0SGFzaChjb25zdCBjaGFyICpuYW1lLAkJ LyogdGFibGUgc3RyaW5nIG5hbWUgZm9yIHNobWVtIGluZGV4ICovCiAKIAkvKiBsb29rIGl0IHVw IGluIHRoZSBzaG1lbSBpbmRleCAqLwogCWxvY2F0aW9uID0gU2htZW1Jbml0U3RydWN0KG5hbWUs Ci0JCQkJCQkJICAgaGFzaF9nZXRfc2hhcmVkX3NpemUoaW5mb1AsIGhhc2hfZmxhZ3MpLAorCQkJ CQkJCSAgIGhhc2hfZ2V0X2luaXRfc2l6ZShpbmZvUCwgaGFzaF9mbGFncywgaW5pdF9zaXplLCAw KSwKIAkJCQkJCQkgICAmZm91bmQpOwogCiAJLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0 aWxzL2hhc2gvZHluYWhhc2guYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2hhc2gvZHluYWhhc2guYwpp bmRleCAzZjI1OTI5ZjJkLi41NTBmMDQzNTlhIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGls cy9oYXNoL2R5bmFoYXNoLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvaGFzaC9keW5haGFzaC5j CkBAIC0yNjUsNyArMjY1LDcgQEAgc3RhdGljIGxvbmcgaGFzaF9hY2Nlc3NlcywKICAqLwogc3Rh dGljIHZvaWQgKkR5bmFIYXNoQWxsb2MoU2l6ZSBzaXplKTsKIHN0YXRpYyBIQVNIU0VHTUVOVCBz ZWdfYWxsb2MoSFRBQiAqaGFzaHApOwotc3RhdGljIGJvb2wgZWxlbWVudF9hbGxvYyhIVEFCICpo YXNocCwgaW50IG5lbGVtLCBpbnQgZnJlZWxpc3RfaWR4KTsKK3N0YXRpYyBIQVNIRUxFTUVOVCAq ZWxlbWVudF9hbGxvYyhIVEFCICpoYXNocCwgaW50IG5lbGVtKTsKIHN0YXRpYyBib29sIGRpcl9y ZWFsbG9jKEhUQUIgKmhhc2hwKTsKIHN0YXRpYyBib29sIGV4cGFuZF90YWJsZShIVEFCICpoYXNo cCk7CiBzdGF0aWMgSEFTSEJVQ0tFVCBnZXRfaGFzaF9lbnRyeShIVEFCICpoYXNocCwgaW50IGZy ZWVsaXN0X2lkeCk7CkBAIC0yODEsNiArMjgxLDkgQEAgc3RhdGljIHZvaWQgcmVnaXN0ZXJfc2Vx X3NjYW4oSFRBQiAqaGFzaHApOwogc3RhdGljIHZvaWQgZGVyZWdpc3Rlcl9zZXFfc2NhbihIVEFC ICpoYXNocCk7CiBzdGF0aWMgYm9vbCBoYXNfc2VxX3NjYW5zKEhUQUIgKmhhc2hwKTsKIAorc3Rh dGljIGludAljb21wdXRlX2J1Y2tldHNfYW5kX3NlZ3MobG9uZyBuZWxlbSwgaW50ICpuYnVja2V0 cywKKwkJCQkJCQkJCSBsb25nIG51bV9wYXJ0aXRpb25zLCBsb25nIHNzaXplKTsKK3N0YXRpYyB2 b2lkIGVsZW1lbnRfYWRkKEhUQUIgKmhhc2hwLCBIQVNIRUxFTUVOVCAqZmlyc3RFbGVtZW50LCBp bnQgZnJlZWxpc3RfaWR4LCBpbnQgbmVsZW0pOwogCiAvKgogICogbWVtb3J5IGFsbG9jYXRpb24g c3VwcG9ydApAQCAtMzUzLDYgKzM1Niw3IEBAIGhhc2hfY3JlYXRlKGNvbnN0IGNoYXIgKnRhYm5h bWUsIGxvbmcgbmVsZW0sIGNvbnN0IEhBU0hDVEwgKmluZm8sIGludCBmbGFncykKIHsKIAlIVEFC CSAgICpoYXNocDsKIAlIQVNISERSICAgICpoY3RsOworCWludAkJCW5lbGVtX2JhdGNoOwogCiAJ LyoKIAkgKiBIYXNoIHRhYmxlcyBub3cgYWxsb2NhdGUgc3BhY2UgZm9yIGtleSBhbmQgZGF0YSwg YnV0IHlvdSBoYXZlIHRvIHNheQpAQCAtNTA3LDkgKzUxMSwxOSBAQCBoYXNoX2NyZWF0ZShjb25z dCBjaGFyICp0YWJuYW1lLCBsb25nIG5lbGVtLCBjb25zdCBIQVNIQ1RMICppbmZvLCBpbnQgZmxh Z3MpCiAJCWhhc2hwLT5pc3NoYXJlZCA9IGZhbHNlOwogCX0KIAorCS8qIENob29zZSBudW1iZXIg b2YgZW50cmllcyB0byBhbGxvY2F0ZSBhdCBhIHRpbWUgKi8KKwluZWxlbV9iYXRjaCA9IGNob29z ZV9uZWxlbV9hbGxvYyhpbmZvLT5lbnRyeXNpemUpOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUg bWVtb3J5IG5lZWRlZCBmb3IgaGFzaCBoZWFkZXIsIGRpcmVjdG9yeSwgc2VnbWVudHMgYW5kCisJ ICogZWxlbWVudHMgdG9nZXRoZXIuIFVzZSBwb2ludGVyIGFyaXRobWV0aWMgdG8gYXJyaXZlIGF0 IHRoZSBzdGFydCBvZgorCSAqIGVhY2ggb2YgdGhlc2Ugc3RydWN0dXJlcyBsYXRlci4KKwkgKi8K IAlpZiAoIWhhc2hwLT5oY3RsKQogCXsKLQkJaGFzaHAtPmhjdGwgPSAoSEFTSEhEUiAqKSBoYXNo cC0+YWxsb2Moc2l6ZW9mKEhBU0hIRFIpKTsKKwkJU2l6ZQkJc2l6ZSA9IGhhc2hfZ2V0X2luaXRf c2l6ZShpbmZvLCBmbGFncywgbmVsZW0sIG5lbGVtX2JhdGNoKTsKKworCQloYXNocC0+aGN0bCA9 IChIQVNISERSICopIGhhc2hwLT5hbGxvYyhzaXplKTsKIAkJaWYgKCFoYXNocC0+aGN0bCkKIAkJ CWVyZXBvcnQoRVJST1IsCiAJCQkJCShlcnJjb2RlKEVSUkNPREVfT1VUX09GX01FTU9SWSksCkBA IC01NTgsNiArNTcyLDggQEAgaGFzaF9jcmVhdGUoY29uc3QgY2hhciAqdGFibmFtZSwgbG9uZyBu ZWxlbSwgY29uc3QgSEFTSENUTCAqaW5mbywgaW50IGZsYWdzKQogCWhjdGwtPmtleXNpemUgPSBp bmZvLT5rZXlzaXplOwogCWhjdGwtPmVudHJ5c2l6ZSA9IGluZm8tPmVudHJ5c2l6ZTsKIAorCWhj dGwtPm5lbGVtX2FsbG9jID0gbmVsZW1fYmF0Y2g7CisKIAkvKiBtYWtlIGxvY2FsIGNvcGllcyBv ZiBoZWF2aWx5LXVzZWQgY29uc3RhbnQgZmllbGRzICovCiAJaGFzaHAtPmtleXNpemUgPSBoY3Rs LT5rZXlzaXplOwogCWhhc2hwLT5zc2l6ZSA9IGhjdGwtPnNzaXplOwpAQCAtNTgyLDYgKzU5OCw5 IEBAIGhhc2hfY3JlYXRlKGNvbnN0IGNoYXIgKnRhYm5hbWUsIGxvbmcgbmVsZW0sIGNvbnN0IEhB U0hDVEwgKmluZm8sIGludCBmbGFncykKIAkJCQkJZnJlZWxpc3RfcGFydGl0aW9ucywKIAkJCQkJ bmVsZW1fYWxsb2MsCiAJCQkJCW5lbGVtX2FsbG9jX2ZpcnN0OworCQl2b2lkCSAgICpjdXJyX29m ZnNldCA9IE5VTEw7CisJCWludAkJCW5zZWdzOworCQlpbnQJCQluYnVja2V0czsKIAogCQkvKgog CQkgKiBJZiBoYXNoIHRhYmxlIGlzIHBhcnRpdGlvbmVkLCBnaXZlIGVhY2ggZnJlZWxpc3QgYW4g ZXF1YWwgc2hhcmUgb2YKQEAgLTU5Miw2ICs2MTEsMTQgQEAgaGFzaF9jcmVhdGUoY29uc3QgY2hh ciAqdGFibmFtZSwgbG9uZyBuZWxlbSwgY29uc3QgSEFTSENUTCAqaW5mbywgaW50IGZsYWdzKQog CQllbHNlCiAJCQlmcmVlbGlzdF9wYXJ0aXRpb25zID0gMTsKIAorCQkvKgorCQkgKiBDYWxjdWxh dGUgdGhlIG9mZnNldCBhdCB3aGljaCB0byBmaW5kIHRoZSBmaXJzdCBwYXJ0aXRpb24gb2YKKwkJ ICogZWxlbWVudHMKKwkJICovCisJCW5zZWdzID0gY29tcHV0ZV9idWNrZXRzX2FuZF9zZWdzKG5l bGVtLCAmbmJ1Y2tldHMsIGhjdGwtPm51bV9wYXJ0aXRpb25zLCBoY3RsLT5zc2l6ZSk7CisKKwkJ Y3Vycl9vZmZzZXQgPSAoKChjaGFyICopIGhhc2hwLT5oY3RsKSArIHNpemVvZihIQVNISERSKSAr IChoY3RsLT5kc2l6ZSAqIHNpemVvZihIQVNIU0VHTUVOVCkpICsgKHNpemVvZihIQVNIQlVDS0VU KSAqIGhjdGwtPnNzaXplICogbnNlZ3MpKTsKKwogCQluZWxlbV9hbGxvYyA9IG5lbGVtIC8gZnJl ZWxpc3RfcGFydGl0aW9uczsKIAkJaWYgKG5lbGVtX2FsbG9jIDw9IDApCiAJCQluZWxlbV9hbGxv YyA9IDE7CkBAIC02MDksMTEgKzYzNiwxNiBAQCBoYXNoX2NyZWF0ZShjb25zdCBjaGFyICp0YWJu YW1lLCBsb25nIG5lbGVtLCBjb25zdCBIQVNIQ1RMICppbmZvLCBpbnQgZmxhZ3MpCiAJCWZvciAo aSA9IDA7IGkgPCBmcmVlbGlzdF9wYXJ0aXRpb25zOyBpKyspCiAJCXsKIAkJCWludAkJCXRlbXAg PSAoaSA9PSAwKSA/IG5lbGVtX2FsbG9jX2ZpcnN0IDogbmVsZW1fYWxsb2M7CisJCQlIQVNIRUxF TUVOVCAqZmlyc3RFbGVtZW50OworCQkJU2l6ZQkJZWxlbWVudFNpemUgPSBNQVhBTElHTihzaXpl b2YoSEFTSEVMRU1FTlQpKSArIE1BWEFMSUdOKGhjdGwtPmVudHJ5c2l6ZSk7CiAKLQkJCWlmICgh ZWxlbWVudF9hbGxvYyhoYXNocCwgdGVtcCwgaSkpCi0JCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJ CShlcnJjb2RlKEVSUkNPREVfT1VUX09GX01FTU9SWSksCi0JCQkJCQkgZXJybXNnKCJvdXQgb2Yg bWVtb3J5IikpKTsKKwkJCS8qCisJCQkgKiBNZW1vcnkgaXMgYWxsb2NhdGVkIGFzIHBhcnQgb2Yg aW5pdGlhbCBhbGxvY2F0aW9uIGluCisJCQkgKiBTaG1lbUluaXRIYXNoCisJCQkgKi8KKwkJCWZp cnN0RWxlbWVudCA9IChIQVNIRUxFTUVOVCAqKSBjdXJyX29mZnNldDsKKwkJCWN1cnJfb2Zmc2V0 ID0gKCgoY2hhciAqKSBjdXJyX29mZnNldCkgKyAodGVtcCAqIGVsZW1lbnRTaXplKSk7CisJCQll bGVtZW50X2FkZChoYXNocCwgZmlyc3RFbGVtZW50LCBpLCB0ZW1wKTsKIAkJfQogCX0KIApAQCAt NzAxLDMwICs3MzMsMTEgQEAgaW5pdF9odGFiKEhUQUIgKmhhc2hwLCBsb25nIG5lbGVtKQogCQlm b3IgKGkgPSAwOyBpIDwgTlVNX0ZSRUVMSVNUUzsgaSsrKQogCQkJU3BpbkxvY2tJbml0KCYoaGN0 bC0+ZnJlZUxpc3RbaV0ubXV0ZXgpKTsKIAotCS8qCi0JICogQWxsb2NhdGUgc3BhY2UgZm9yIHRo ZSBuZXh0IGdyZWF0ZXIgcG93ZXIgb2YgdHdvIG51bWJlciBvZiBidWNrZXRzLAotCSAqIGFzc3Vt aW5nIGEgZGVzaXJlZCBtYXhpbXVtIGxvYWQgZmFjdG9yIG9mIDEuCi0JICovCi0JbmJ1Y2tldHMg PSBuZXh0X3BvdzJfaW50KG5lbGVtKTsKLQotCS8qCi0JICogSW4gYSBwYXJ0aXRpb25lZCB0YWJs ZSwgbmJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCBlcXVhbCB0bwotCSAqIG51bV9wYXJ0aXRpb25z OyB3ZXJlIGl0IGxlc3MsIGtleXMgd2l0aCBhcHBhcmVudGx5IGRpZmZlcmVudCBwYXJ0aXRpb24K LQkgKiBudW1iZXJzIHdvdWxkIG1hcCB0byB0aGUgc2FtZSBidWNrZXQsIGJyZWFraW5nIHBhcnRp dGlvbiBpbmRlcGVuZGVuY2UuCi0JICogKE5vcm1hbGx5IG5idWNrZXRzIHdpbGwgYmUgbXVjaCBi aWdnZXI7IHRoaXMgaXMganVzdCBhIHNhZmV0eSBjaGVjay4pCi0JICovCi0Jd2hpbGUgKG5idWNr ZXRzIDwgaGN0bC0+bnVtX3BhcnRpdGlvbnMpCi0JCW5idWNrZXRzIDw8PSAxOworCW5zZWdzID0g Y29tcHV0ZV9idWNrZXRzX2FuZF9zZWdzKG5lbGVtLCAmbmJ1Y2tldHMsIGhjdGwtPm51bV9wYXJ0 aXRpb25zLCBoY3RsLT5zc2l6ZSk7CiAKIAloY3RsLT5tYXhfYnVja2V0ID0gaGN0bC0+bG93X21h c2sgPSBuYnVja2V0cyAtIDE7CiAJaGN0bC0+aGlnaF9tYXNrID0gKG5idWNrZXRzIDw8IDEpIC0g MTsKIAotCS8qCi0JICogRmlndXJlIG51bWJlciBvZiBkaXJlY3Rvcnkgc2VnbWVudHMgbmVlZGVk LCByb3VuZCB1cCB0byBhIHBvd2VyIG9mIDIKLQkgKi8KLQluc2VncyA9IChuYnVja2V0cyAtIDEp IC8gaGN0bC0+c3NpemUgKyAxOwotCW5zZWdzID0gbmV4dF9wb3cyX2ludChuc2Vncyk7Ci0KIAkv KgogCSAqIE1ha2Ugc3VyZSBkaXJlY3RvcnkgaXMgYmlnIGVub3VnaC4gSWYgcHJlLWFsbG9jYXRl ZCBkaXJlY3RvcnkgaXMgdG9vCiAJICogc21hbGwsIGNob2tlIChjYWxsZXIgc2NyZXdlZCB1cCku CkBAIC03MzcsMjYgKzc1MCwyOCBAQCBpbml0X2h0YWIoSFRBQiAqaGFzaHAsIGxvbmcgbmVsZW0p CiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JLyogQWxsb2NhdGUgYSBkaXJlY3RvcnkgKi8KKwkv KgorCSAqIEFzc2lnbiBhIGRpcmVjdG9yeSBieSBtYWtpbmcgaXQgcG9pbnQgdG8gdGhlIGNvcnJl Y3QgbG9jYXRpb24gaW4gdGhlCisJICogcHJlLWFsbG9jYXRlZCBidWZmZXIuCisJICovCiAJaWYg KCEoaGFzaHAtPmRpcikpCiAJewogCQlDdXJyZW50RHluYUhhc2hDeHQgPSBoYXNocC0+aGN4dDsK LQkJaGFzaHAtPmRpciA9IChIQVNIU0VHTUVOVCAqKQotCQkJaGFzaHAtPmFsbG9jKGhjdGwtPmRz aXplICogc2l6ZW9mKEhBU0hTRUdNRU5UKSk7Ci0JCWlmICghaGFzaHAtPmRpcikKLQkJCXJldHVy biBmYWxzZTsKKwkJaGFzaHAtPmRpciA9IChIQVNIU0VHTUVOVCAqKSAoKChjaGFyICopIGhhc2hw LT5oY3RsKSArIHNpemVvZihIQVNISERSKSk7CiAJfQogCi0JLyogQWxsb2NhdGUgaW5pdGlhbCBz ZWdtZW50cyAqLworCS8qIEFzc2lnbiBpbml0aWFsIHNlZ21lbnRzLCB3aGljaCBhcmUgYWxzbyBw cmUtYWxsb2NhdGVkICovCisJaSA9IDA7CiAJZm9yIChzZWdwID0gaGFzaHAtPmRpcjsgaGN0bC0+ bnNlZ3MgPCBuc2VnczsgaGN0bC0+bnNlZ3MrKywgc2VncCsrKQogCXsKLQkJKnNlZ3AgPSBzZWdf YWxsb2MoaGFzaHApOwotCQlpZiAoKnNlZ3AgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQl9 CisJCSpzZWdwID0gKEhBU0hCVUNLRVQgKikgKCgoY2hhciAqKSBoYXNocC0+aGN0bCkKKwkJCQkJ CQkJKyBzaXplb2YoSEFTSEhEUikKKwkJCQkJCQkJKyAoaGFzaHAtPmhjdGwtPmRzaXplICogc2l6 ZW9mKEhBU0hTRUdNRU5UKSkKKwkJCQkJCQkJKyAoaSAqIHNpemVvZihIQVNIQlVDS0VUKSAqIGhh c2hwLT5zc2l6ZSkpOworCQlNZW1TZXQoKnNlZ3AsIDAsIHNpemVvZihIQVNIQlVDS0VUKSAqIGhh c2hwLT5zc2l6ZSk7CiAKLQkvKiBDaG9vc2UgbnVtYmVyIG9mIGVudHJpZXMgdG8gYWxsb2NhdGUg YXQgYSB0aW1lICovCi0JaGN0bC0+bmVsZW1fYWxsb2MgPSBjaG9vc2VfbmVsZW1fYWxsb2MoaGN0 bC0+ZW50cnlzaXplKTsKKwkJaSA9IGkgKyAxOworCX0KIAogI2lmZGVmIEhBU0hfREVCVUcKIAlm cHJpbnRmKHN0ZGVyciwgImluaXRfaHRhYjpcbiVzJXBcbiVzJWxkXG4lcyVsZFxuJXMlZFxuJXMl bGRcbiVzJXVcbiVzJXhcbiVzJXhcbiVzJWxkXG4iLApAQCAtODUxLDExICs4NjYsNjQgQEAgaGFz aF9zZWxlY3RfZGlyc2l6ZShsb25nIG51bV9lbnRyaWVzKQogICogYW5kIGZvciB0aGUgKG5vbiBl eHBhbnNpYmxlKSBkaXJlY3RvcnkuCiAgKi8KIFNpemUKLWhhc2hfZ2V0X3NoYXJlZF9zaXplKEhB U0hDVEwgKmluZm8sIGludCBmbGFncykKK2hhc2hfZ2V0X2luaXRfc2l6ZShjb25zdCBIQVNIQ1RM ICppbmZvLCBpbnQgZmxhZ3MsIGxvbmcgaW5pdF9zaXplLCBpbnQgbmVsZW1fYWxsb2MpCiB7Ci0J QXNzZXJ0KGZsYWdzICYgSEFTSF9ESVJTSVpFKTsKLQlBc3NlcnQoaW5mby0+ZHNpemUgPT0gaW5m by0+bWF4X2RzaXplKTsKLQlyZXR1cm4gc2l6ZW9mKEhBU0hIRFIpICsgaW5mby0+ZHNpemUgKiBz aXplb2YoSEFTSFNFR01FTlQpOworCWludAkJCW5idWNrZXRzOworCWludAkJCW5zZWdzOworCWlu dAkJCW51bV9wYXJ0aXRpb25zOworCWxvbmcJCXNzaXplOworCWxvbmcJCWRzaXplOworCWJvb2wJ CWVsZW1lbnRfYWxsb2MgPSB0cnVlOworCVNpemUJCWVsZW1lbnRTaXplID0gTUFYQUxJR04oc2l6 ZW9mKEhBU0hFTEVNRU5UKSkgKyBNQVhBTElHTihpbmZvLT5lbnRyeXNpemUpOworCisJLyoKKwkg KiBGb3Igbm9uLXNoYXJlZCBoYXNoIHRhYmxlcywgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgZWxl bWVudHMgYXJlCisJICogYWxsb2NhdGVkIG9ubHkgaWYgdGhleSBhcmUgbGVzcyB0aGFuIG5lbGVt X2FsbG9jLiBJbiBhbnkgY2FzZSwgdGhlCisJICogaW5pdF9zaXplIHNob3VsZCBiZSBlcXVhbCB0 byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFkZGVkIHVzaW5nCisJICogZWxlbWVudF9hZGQoKSBp biBoYXNoX2NyZWF0ZS4KKwkgKi8KKwlpZiAoIShmbGFncyAmIEhBU0hfU0hBUkVEX01FTSkpCisJ eworCQlpZiAoaW5pdF9zaXplID4gbmVsZW1fYWxsb2MpCisJCQllbGVtZW50X2FsbG9jID0gZmFs c2U7CisJfQorCWVsc2UKKwl7CisJCUFzc2VydChmbGFncyAmIEhBU0hfRElSU0laRSk7CisJCUFz c2VydChpbmZvLT5kc2l6ZSA9PSBpbmZvLT5tYXhfZHNpemUpOworCX0KKwkvKiBOb24tc2hhcmVk IGhhc2ggdGFibGVzIG1heSBub3Qgc3BlY2lmeSBkaXIgc2l6ZSAqLworCWlmICghKGZsYWdzICYg SEFTSF9ESVJTSVpFKSkKKwl7CisJCWRzaXplID0gREVGX0RJUlNJWkU7CisJfQorCWVsc2UKKwkJ ZHNpemUgPSBpbmZvLT5kc2l6ZTsKKworCWlmIChmbGFncyAmIEhBU0hfUEFSVElUSU9OKQorCXsK KwkJbnVtX3BhcnRpdGlvbnMgPSBpbmZvLT5udW1fcGFydGl0aW9uczsKKworCQkvKiBOdW1iZXIg b2YgZW50cmllcyBzaG91bGQgYmUgYXRsZWFzdCBlcXVhbCB0byB0aGUgZnJlZWxpc3RzICovCisJ CWlmIChpbml0X3NpemUgPCBOVU1fRlJFRUxJU1RTKQorCQkJaW5pdF9zaXplID0gTlVNX0ZSRUVM SVNUUzsKKwl9CisJZWxzZQorCQludW1fcGFydGl0aW9ucyA9IDA7CisKKwlpZiAoZmxhZ3MgJiBI QVNIX1NFR01FTlQpCisJCXNzaXplID0gaW5mby0+c3NpemU7CisJZWxzZQorCQlzc2l6ZSA9IERF Rl9TRUdTSVpFOworCisJbnNlZ3MgPSBjb21wdXRlX2J1Y2tldHNfYW5kX3NlZ3MoaW5pdF9zaXpl LCAmbmJ1Y2tldHMsIG51bV9wYXJ0aXRpb25zLCBzc2l6ZSk7CisKKwlpZiAoIWVsZW1lbnRfYWxs b2MpCisJCWluaXRfc2l6ZSA9IDA7CisKKwlyZXR1cm4gc2l6ZW9mKEhBU0hIRFIpICsgZHNpemUg KiBzaXplb2YoSEFTSFNFR01FTlQpICsKKwkJK3NpemVvZihIQVNIQlVDS0VUKSAqIHNzaXplICog bnNlZ3MKKwkJKyBpbml0X3NpemUgKiBlbGVtZW50U2l6ZTsKIH0KIAogCkBAIC0xMjg1LDcgKzEz NTMsOCBAQCBnZXRfaGFzaF9lbnRyeShIVEFCICpoYXNocCwgaW50IGZyZWVsaXN0X2lkeCkKIAkJ ICogRmFpbGluZyBiZWNhdXNlIHRoZSBuZWVkZWQgZWxlbWVudCBpcyBpbiBhIGRpZmZlcmVudCBm cmVlbGlzdCBpcwogCQkgKiBub3QgYWNjZXB0YWJsZS4KIAkJICovCi0JCWlmICghZWxlbWVudF9h bGxvYyhoYXNocCwgaGN0bC0+bmVsZW1fYWxsb2MsIGZyZWVsaXN0X2lkeCkpCisJCW5ld0VsZW1l bnQgPSBlbGVtZW50X2FsbG9jKGhhc2hwLCBoY3RsLT5uZWxlbV9hbGxvYyk7CisJCWlmIChuZXdF bGVtZW50ID09IE5VTEwpCiAJCXsKIAkJCWludAkJCWJvcnJvd19mcm9tX2lkeDsKIApAQCAtMTMy Miw2ICsxMzkxLDcgQEAgZ2V0X2hhc2hfZW50cnkoSFRBQiAqaGFzaHAsIGludCBmcmVlbGlzdF9p ZHgpCiAJCQkvKiBubyBlbGVtZW50cyBhdmFpbGFibGUgdG8gYm9ycm93IGVpdGhlciwgc28gb3V0 IG9mIG1lbW9yeSAqLwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KKwkJZWxlbWVudF9hZGQoaGFzaHAs IG5ld0VsZW1lbnQsIGZyZWVsaXN0X2lkeCwgaGN0bC0+bmVsZW1fYWxsb2MpOwogCX0KIAogCS8q IHJlbW92ZSBlbnRyeSBmcm9tIGZyZWVsaXN0LCBidW1wIG5lbnRyaWVzICovCkBAIC0xNzAwLDMw ICsxNzcwLDQzIEBAIHNlZ19hbGxvYyhIVEFCICpoYXNocCkKIH0KIAogLyoKLSAqIGFsbG9jYXRl IHNvbWUgbmV3IGVsZW1lbnRzIGFuZCBsaW5rIHRoZW0gaW50byB0aGUgaW5kaWNhdGVkIGZyZWUg bGlzdAorICogYWxsb2NhdGUgc29tZSBuZXcgZWxlbWVudHMKICAqLwotc3RhdGljIGJvb2wKLWVs ZW1lbnRfYWxsb2MoSFRBQiAqaGFzaHAsIGludCBuZWxlbSwgaW50IGZyZWVsaXN0X2lkeCkKK3N0 YXRpYyBIQVNIRUxFTUVOVCAqCitlbGVtZW50X2FsbG9jKEhUQUIgKmhhc2hwLCBpbnQgbmVsZW0p CiB7CiAJSEFTSEhEUiAgICAqaGN0bCA9IGhhc2hwLT5oY3RsOwogCVNpemUJCWVsZW1lbnRTaXpl OwotCUhBU0hFTEVNRU5UICpmaXJzdEVsZW1lbnQ7Ci0JSEFTSEVMRU1FTlQgKnRtcEVsZW1lbnQ7 Ci0JSEFTSEVMRU1FTlQgKnByZXZFbGVtZW50OwotCWludAkJCWk7CisJSEFTSEVMRU1FTlQgKmZp cnN0RWxlbWVudCA9IE5VTEw7CiAKIAlpZiAoaGFzaHAtPmlzZml4ZWQpCi0JCXJldHVybiBmYWxz ZTsKKwkJcmV0dXJuIE5VTEw7CiAKIAkvKiBFYWNoIGVsZW1lbnQgaGFzIGEgSEFTSEVMRU1FTlQg aGVhZGVyIHBsdXMgdXNlciBkYXRhLiAqLwogCWVsZW1lbnRTaXplID0gTUFYQUxJR04oc2l6ZW9m KEhBU0hFTEVNRU5UKSkgKyBNQVhBTElHTihoY3RsLT5lbnRyeXNpemUpOwotCiAJQ3VycmVudER5 bmFIYXNoQ3h0ID0gaGFzaHAtPmhjeHQ7CiAJZmlyc3RFbGVtZW50ID0gKEhBU0hFTEVNRU5UICop IGhhc2hwLT5hbGxvYyhuZWxlbSAqIGVsZW1lbnRTaXplKTsKIAogCWlmICghZmlyc3RFbGVtZW50 KQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGZpcnN0RWxlbWVu dDsKK30KKworLyoKKyAqIExpbmsgdGhlIGVsZW1lbnRzIGFsbG9jYXRlZCBieSBlbGVtZW50X2Fs bG9jIGludG8gdGhlIGluZGljYXRlZCBmcmVlIGxpc3QKKyAqLworc3RhdGljIHZvaWQKK2VsZW1l bnRfYWRkKEhUQUIgKmhhc2hwLCBIQVNIRUxFTUVOVCAqZmlyc3RFbGVtZW50LCBpbnQgZnJlZWxp c3RfaWR4LCBpbnQgbmVsZW0pCit7CisJSEFTSEhEUiAgICAqaGN0bCA9IGhhc2hwLT5oY3RsOwor CVNpemUJCWVsZW1lbnRTaXplOworCUhBU0hFTEVNRU5UICp0bXBFbGVtZW50OworCUhBU0hFTEVN RU5UICpwcmV2RWxlbWVudDsKKwlpbnQJCQlpOwogCisJLyogRWFjaCBlbGVtZW50IGhhcyBhIEhB U0hFTEVNRU5UIGhlYWRlciBwbHVzIHVzZXIgZGF0YS4gKi8KKwllbGVtZW50U2l6ZSA9IE1BWEFM SUdOKHNpemVvZihIQVNIRUxFTUVOVCkpICsgTUFYQUxJR04oaGN0bC0+ZW50cnlzaXplKTsKIAkv KiBwcmVwYXJlIHRvIGxpbmsgYWxsIHRoZSBuZXcgZW50cmllcyBpbnRvIHRoZSBmcmVlbGlzdCAq LwogCXByZXZFbGVtZW50ID0gTlVMTDsKIAl0bXBFbGVtZW50ID0gZmlyc3RFbGVtZW50OwpAQCAt MTc0NCw4ICsxODI3LDYgQEAgZWxlbWVudF9hbGxvYyhIVEFCICpoYXNocCwgaW50IG5lbGVtLCBp bnQgZnJlZWxpc3RfaWR4KQogCiAJaWYgKElTX1BBUlRJVElPTkVEKGhjdGwpKQogCQlTcGluTG9j a1JlbGVhc2UoJmhjdGwtPmZyZWVMaXN0W2ZyZWVsaXN0X2lkeF0ubXV0ZXgpOwotCi0JcmV0dXJu IHRydWU7CiB9CiAKIC8qCkBAIC0xOTU3LDMgKzIwMzgsMzIgQEAgQXRFT1N1YlhhY3RfSGFzaFRh Ymxlcyhib29sIGlzQ29tbWl0LCBpbnQgbmVzdERlcHRoKQogCQl9CiAJfQogfQorCitzdGF0aWMg aW50Citjb21wdXRlX2J1Y2tldHNfYW5kX3NlZ3MobG9uZyBuZWxlbSwgaW50ICpuYnVja2V0cywg bG9uZyBudW1fcGFydGl0aW9ucywgbG9uZyBzc2l6ZSkKK3sKKwlpbnQJCQluc2VnczsKKworCS8q CisJICogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBuZXh0IGdyZWF0ZXIgcG93ZXIgb2YgdHdvIG51 bWJlciBvZiBidWNrZXRzLAorCSAqIGFzc3VtaW5nIGEgZGVzaXJlZCBtYXhpbXVtIGxvYWQgZmFj dG9yIG9mIDEuCisJICovCisJKm5idWNrZXRzID0gbmV4dF9wb3cyX2ludChuZWxlbSk7CisKKwkv KgorCSAqIEluIGEgcGFydGl0aW9uZWQgdGFibGUsIG5idWNrZXRzIG11c3QgYmUgYXQgbGVhc3Qg ZXF1YWwgdG8KKwkgKiBudW1fcGFydGl0aW9uczsgd2VyZSBpdCBsZXNzLCBrZXlzIHdpdGggYXBw YXJlbnRseSBkaWZmZXJlbnQgcGFydGl0aW9uCisJICogbnVtYmVycyB3b3VsZCBtYXAgdG8gdGhl IHNhbWUgYnVja2V0LCBicmVha2luZyBwYXJ0aXRpb24gaW5kZXBlbmRlbmNlLgorCSAqIChOb3Jt YWxseSBuYnVja2V0cyB3aWxsIGJlIG11Y2ggYmlnZ2VyOyB0aGlzIGlzIGp1c3QgYSBzYWZldHkg Y2hlY2suKQorCSAqLworCXdoaWxlICgoKm5idWNrZXRzKSA8IG51bV9wYXJ0aXRpb25zKQorCQko Km5idWNrZXRzKSA8PD0gMTsKKworCisJLyoKKwkgKiBGaWd1cmUgbnVtYmVyIG9mIGRpcmVjdG9y eSBzZWdtZW50cyBuZWVkZWQsIHJvdW5kIHVwIHRvIGEgcG93ZXIgb2YgMgorCSAqLworCW5zZWdz ID0gKCgqbmJ1Y2tldHMpIC0gMSkgLyBzc2l6ZSArIDE7CisJbnNlZ3MgPSBuZXh0X3BvdzJfaW50 KG5zZWdzKTsKKwlyZXR1cm4gbnNlZ3M7Cit9CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGls cy9oc2VhcmNoLmggYi9zcmMvaW5jbHVkZS91dGlscy9oc2VhcmNoLmgKaW5kZXggOTMyY2M0ZjM0 ZC4uNzliOTU5ZmZjMyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRpbHMvaHNlYXJjaC5oCisr KyBiL3NyYy9pbmNsdWRlL3V0aWxzL2hzZWFyY2guaApAQCAtMTUxLDcgKzE1MSw4IEBAIGV4dGVy biB2b2lkIGhhc2hfc2VxX3Rlcm0oSEFTSF9TRVFfU1RBVFVTICpzdGF0dXMpOwogZXh0ZXJuIHZv aWQgaGFzaF9mcmVlemUoSFRBQiAqaGFzaHApOwogZXh0ZXJuIFNpemUgaGFzaF9lc3RpbWF0ZV9z aXplKGxvbmcgbnVtX2VudHJpZXMsIFNpemUgZW50cnlzaXplKTsKIGV4dGVybiBsb25nIGhhc2hf c2VsZWN0X2RpcnNpemUobG9uZyBudW1fZW50cmllcyk7Ci1leHRlcm4gU2l6ZSBoYXNoX2dldF9z aGFyZWRfc2l6ZShIQVNIQ1RMICppbmZvLCBpbnQgZmxhZ3MpOworZXh0ZXJuIFNpemUgaGFzaF9n ZXRfaW5pdF9zaXplKGNvbnN0IEhBU0hDVEwgKmluZm8sIGludCBmbGFncywKKwkJCQkJCQkgICBs b25nIGluaXRfc2l6ZSwgaW50IG5lbGVtX2FsbG9jKTsKIGV4dGVybiB2b2lkIEF0RU9YYWN0X0hh c2hUYWJsZXMoYm9vbCBpc0NvbW1pdCk7CiBleHRlcm4gdm9pZCBBdEVPU3ViWGFjdF9IYXNoVGFi bGVzKGJvb2wgaXNDb21taXQsIGludCBuZXN0RGVwdGgpOwogCi0tIAoyLjM0LjEKCg== --0000000000000f9fb40630fe6482--