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.96) (envelope-from ) id 1vpnwY-00GNyn-2o for pgsql-hackers@arkaria.postgresql.org; Tue, 10 Feb 2026 13:38:19 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vpnwX-00FTx6-2Y for pgsql-hackers@arkaria.postgresql.org; Tue, 10 Feb 2026 13:38:17 +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.96) (envelope-from ) id 1vpnwX-00FTwy-1E for pgsql-hackers@lists.postgresql.org; Tue, 10 Feb 2026 13:38:17 +0000 Received: from mail-qv1-xf43.google.com ([2607:f8b0:4864:20::f43]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vpnwU-000000020kt-2Kwz for pgsql-hackers@lists.postgresql.org; Tue, 10 Feb 2026 13:38:16 +0000 Received: by mail-qv1-xf43.google.com with SMTP id 6a1803df08f44-8947404b367so61871096d6.3 for ; Tue, 10 Feb 2026 05:38:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1770730692; cv=none; d=google.com; s=arc-20240605; b=R7im0FEtjHCdB/R2Y2CId45ysXmVQQWEoZb/FsNrY4QsT5Sh1KanFDxSvV1946Dcxt Yoy3LAi3HFr3YbAjvTzmF1ruFBBYmX3XxRv3PvAjmMANIsMGnRvw5MStlk8sSK/bpMe4 hW7SAPX942WSqEN0U9UZKb11MUQW8jBYeCsdLbCsfFkhGkjZongy+GZQ02Akmb23d6iV iSifkz+tMzJ3soNoSmhJqKZp9vkoCdWRNL2I2l4xGNYfhC3TGGUhIZEXvqwP+qxJiKcQ gfzqAFbUvdFr03jx9gypmv6NhEn1A17D4f4mOh6/Lc1yIXO3njqOzThiSbuEXrgUP1OF SdFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=r3AUozAiKdSKJ8lt5VksfVsGdTOiVf4OlHZZ8OUXWeQ=; fh=LfEcHOmnbYPNiWD9UJ1cAfLFIuSng3ngY6U6hZE5yVY=; b=ennSeDNEiXll2JNgiIO3IU9pg3owGzhNmqo3RYPpOLaSeQ+E+1ra5nTTuUXU/tiCFy Yid/QIJZ7IJiez032+/6Ck8KGx1CO9DQjhGSA412oOvsRwfWshZobtuhrapbqZfXvNC+ FNnlaGp3Hhr+nfDZITIeVIDGzynk+Q/CH88I85tZYMhOVdlgTl4wyPnbx2tk7/csEUjx AhQiIm8UCOVgIQtzlOkrhsH0OmFFOghFm5CJApB2lPcScX/PGtjPuwAlfz8rrf9Wz9AB mX6agbMypUGGtTW9az7bisT1LindCbtDjXuEJPI8NQIzs4F77SRIkrUf4sxziHSxi1tX 5VRQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770730692; x=1771335492; 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=r3AUozAiKdSKJ8lt5VksfVsGdTOiVf4OlHZZ8OUXWeQ=; b=Viqybb+PMAJhOqmbyJxytd2ULm6GkeNYf9xekqo3ARvxODZXcEJ6k/uuvR68IczBX/ DCl38PXKm0YyUBTgrjyot2LI0HEg2uTXOz1aTgNvmPftqP3npRfWmpE1Q9eqDeXPD0Vy FV9eM9XlgJJbdtgAE+glF5jRRMAljPPosbjWwrDKI0SCfNLm1G6S9gtt7GUh/KTz2nAo WhYD/TGOAwsA7IPq3E3D4pUn2G5oTTkMXh9FIahSnyKRRf/bM9nFldqxetCNKsiZWBj2 BOYwU3vThUCc0fkcXh6c6BOlSiII5SbKQzdM7x2NDRIt2n9jyyhN9vnhzpB+E5q9cD1C XufQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770730692; x=1771335492; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=r3AUozAiKdSKJ8lt5VksfVsGdTOiVf4OlHZZ8OUXWeQ=; b=fHWJjr94qIASXrYB6ARIPb6h0LB2vWW3JJUmg8gsi89jlAAKJi6aegyarzNi+xZzko noKD15YPaM97NgO82MQkaX9CcNJ+d6T7onjFgYXzWkN+BQoq7mODkdHc+zFzp9DLOogS QzTJCLuTUBawdXqB2cA5RcFDG/Nivbx65l1hG8DjjVU125vn+EgzFiNSwbKxfFHAOngC TKlhTJ5UDTeAogqmaNe8wqgnrCt/0ed32ukGa5P7VFpuGyH2Qt1Qd46sCSHi3+vP+v/6 aZ7tr8ZuD4ss/9Uw2gWjV3P4j3Kt0YjsTse/dbazXUk6HrbQx28/xqQlOjyorYv/HReV WV+A== X-Gm-Message-State: AOJu0YyeJaFcoWZNhJSlDkw2Fd/f96fQVpJxUHSqNgam77PHZoup+5KS jFywbsgdhk+shSMgmEZWe0rEZ8c6SCsJQAF+VjXXkvqA4xn8emLRHlp2UJ1BMASFDiXRRyMNcwu /tZCM0uZx7zteHnJogAR63PqfA9zEu2BR+PsfnBg= X-Gm-Gg: AZuq6aJLhQ60q/F56SAifvLWgBWPg6Ae5sPW/mycjRtdBBnbNmM0AaL6FYE0R9aPSyI N5aAbDWxjBtVdSbvdgJfiOsfOZswhvRJezFNIINxKp9LAR3Qo4+VrIFyvhxQAgkRua9dtm+jjuO oHA3PX9rNNcWa76/wy8FT54Bb9q56GgCFrOCvW4Skl8HHPkhLM1xiVd8IiA8Oy/ORHVHZNAoIWT wns6Eu7OiOX2KMVrSV+RAXjfUPv5VAEIlpctL7/bs3F9OQgxfJEV9Dr0ljNNNFOsVvWb3zjAMBy BUxa6bXZDLHHnBiJot7KrUju6cSIsimYCpjv4gCtrR1cBsddpfN5ZIZikjqK5ZKzivp7u+qc3lc YFo/eYHdEjwUskFKYfvs5HKyZoRo= X-Received: by 2002:ad4:5f0d:0:b0:894:78e4:27cc with SMTP id 6a1803df08f44-8953c870ba1mr237381606d6.38.1770730691997; Tue, 10 Feb 2026 05:38:11 -0800 (PST) MIME-Version: 1.0 References: <269A8FB9-6D43-43CF-A6FE-52D28CBDB8A9@Outlook.com> <606C775A-4C1A-482B-BE7D-2E7A46AE14B9@gmail.com> <9D3D4647-868B-4562-B382-D201478AD67B@gmail.com> <54659731-2232-4E74-9533-D136D01B153F@gmail.com> In-Reply-To: From: John Naylor Date: Tue, 10 Feb 2026 20:37:59 +0700 X-Gm-Features: AZwV_Qgt7gsHOJWKYmruMA1oayrKusMWgQr2mZop1IefqN51GLpnPruBnqAKJ-4 Message-ID: Subject: Re: tuple radix sort To: zengman Cc: pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000e4290c064a785df6" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e4290c064a785df6 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Jan 21, 2026 at 1:40=E2=80=AFPM John Naylor wrote: > Attached is v6, which seems pretty close to committable. The temporary > GUC is gone, as are all the integer-like qsort specializations. There > are a few cosmetic rearrangements, but the algorithm is pretty much > the same as v5. The only visible behavior difference should be the > addition of a presorted check just like qsort has. I did some more self-review after a couple weeks and made some more minor cosmetic adjustments for v7. I will commit 0001 and 0002 in a few days unless there are objections. > * The only things I have doubts about are the user-visible messages > mentioning "qsort". For trace_sort, it seemed logical to re-use the > term "internal sort" from other such messages, so I've done that for > v6. EXPLAIN ANALYZE is a bit harder: Do we want to even change > anything here? When things like this come up, there is the question of > tools that parse the output. It doesn't seem particularly important to > try to display exact info here, especially since radix sort must > divert to qsort for multiple keys etc. I decided to split this out to a separate patch, 0003. It doesn't seem important, and may not be desirable after all. There is also a 0004 which is just verifying sort order in assert builds on the existing qsort calls and not just the new sort. Looks better this way. > Speaking of the NULL partitioning step, I've tried to add some > comments that make sense, but the pictures in the linked blog are more > helpful than any words I can come up with. It's easier to understand > than to describe. I tried to improve readability here and added missing CHECK_FOR_INTERRUPTS(= ). Also ran UB sanitizer and Valgrind. On Wed, Jan 21, 2026 at 3:12=E2=80=AFPM zengman wr= ote: > I wanted to point out a small detail: the line `extern PGDLLIMPORT bool w= ip_radix_sort;` > in v6-0001 appears to not have been fully cleaned up =E2=80=94 I suspect= it might have been overlooked. Fixed as well. -- John Naylor Amazon Web Services --000000000000e4290c064a785df6 Content-Type: text/x-patch; charset="US-ASCII"; name="v7-0002-Detect-common-prefix-to-avoid-wasted-work-during-.patch" Content-Disposition: attachment; filename="v7-0002-Detect-common-prefix-to-avoid-wasted-work-during-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlgn3crm1 RnJvbSBkZmVmZmY5ZDJlMjg5NzlkZWU5MmYzYjYxZTk1NGMzYzhiMWVlMjM2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKb2huIE5heWxvciA8am9obi5uYXlsb3JAcG9zdGdyZXNxbC5v cmc+CkRhdGU6IFdlZCwgMTIgTm92IDIwMjUgMTQ6MzE6MjQgKzA3MDAKU3ViamVjdDogW1BBVENI IHY3IDIvNF0gRGV0ZWN0IGNvbW1vbiBwcmVmaXggdG8gYXZvaWQgd2FzdGVkIHdvcmsgZHVyaW5n IHJhZGl4CiBzb3J0CgpTdGFydCByYWRpeCBzb3J0IGF0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5 dGUgcG9zaXRpb24gdGhhdCBoYXMgbW9yZQp0aGFuIG9uZSBkaXN0aW5jdCBieXRlIGluIHRoZSBp bnB1dC4gVGhpcyBza2lwcyBwYXNzZXMgd2hlcmUgcmFkaXgKc29ydCB3b3VsZCBjb3VudCB0aGUg ZGlzdGluY3QgYnl0ZXMganVzdCB0byBmaW5kIG9ubHkgYSBzaW5nbGUgb25lLAppbiB3aGljaCBj YXNlIHRoZXJlIGlzIG5vdGhpbmcgZnVydGhlciB0byBkbyBmb3IgdGhhdCBwYXNzLiBUaGlzIGNh bgpnaXZlIGEgZmV3IHBlcmNlbnQgc3BlZWR1cCBmb3IgaW50ZWdlcnMgdGhhdCBoYXZlIHNvbWUg emVybyB1cHBlcgpieXRlcywgd2hpY2ggaXMgY29tbW9uIGZvciB0aG9zZSB0aGF0IGRpZG4ndCBh cnJpdmUgdmlhIGFiYnJldmlhdGlvbi4KClJldmlld2VkLWJ5OiBDaGVuZ3BlbmcgWWFuIDxjaGVu Z3BlbmdfeWFuQG91dGxvb2suY29tPgpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5lcy9tL0NB TldDQVpZcEdNRFNTd0FhMThmT3hKR1hhUHpWZHlQc1dwT2tmQ1gzMkRXaDNRem56d0BtYWlsLmdt YWlsLmNvbQotLS0KIHNyYy9iYWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzb3J0LmMgfCA2NiArKysr KysrKysrKysrKysrKysrKysrKysrKysrLS0KIDEgZmlsZSBjaGFuZ2VkLCA2MiBpbnNlcnRpb25z KCspLCA0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQv dHVwbGVzb3J0LmMgYi9zcmMvYmFja2VuZC91dGlscy9zb3J0L3R1cGxlc29ydC5jCmluZGV4IDA3 ZmE4M2M3OTQ0Li43YjIyNTQ2YTgxMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvc29y dC90dXBsZXNvcnQuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9zb3J0L3R1cGxlc29ydC5jCkBA IC0xMDQsNiArMTA0LDcgQEAKICNpbmNsdWRlICJjb21tYW5kcy90YWJsZXNwYWNlLmgiCiAjaW5j bHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAicGdfdHJhY2UuaCIKKyNpbmNsdWRlICJwb3J0 L3BnX2JpdHV0aWxzLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9zaG1lbS5oIgogI2luY2x1ZGUgInV0 aWxzL2d1Yy5oIgogI2luY2x1ZGUgInV0aWxzL21lbXV0aWxzLmgiCkBAIC0yOTI4LDEwICsyOTI5 LDY3IEBAIHNvcnRfYnl2YWx1ZV9kYXR1bShTb3J0VHVwbGUgKmRhdGEsIHNpemVfdCBuLCBUdXBs ZXNvcnRzdGF0ZSAqc3RhdGUpCiAJfQogCWVsc2UKIAl7Ci0JCXJhZGl4X3NvcnRfdHVwbGUobm90 X251bGxfc3RhcnQsCi0JCQkJCQkgbm90X251bGxfY291bnQsCi0JCQkJCQkgMCwKLQkJCQkJCSBz dGF0ZSk7CisJCWludAkJCWNvbW1vbl9wcmVmaXg7CisJCURhdHVtCQlmaXJzdF9kYXR1bSA9IDA7 CisJCURhdHVtCQljb21tb25fdXBwZXJfYml0cyA9IDA7CisKKwkJLyoKKwkJICogQ29tcHV0ZSB0 aGUgY29tbW9uIHByZWZpeCB0byBza2lwIHVucHJvZHVjdGl2ZSByZWN1cnNpb24gc3RlcHMKKwkJ ICogZHVyaW5nIHJhZGl4IHNvcnQuCisJCSAqLworCQlmb3IgKFNvcnRUdXBsZSAqc3QgPSBub3Rf bnVsbF9zdGFydDsKKwkJCSBzdCA8IG5vdF9udWxsX3N0YXJ0ICsgbm90X251bGxfY291bnQ7CisJ CQkgc3QrKykKKwkJeworCQkJRGF0dW0JCXRoaXNfZGF0dW0gPSBzdC0+ZGF0dW0xOworCisJCQlp ZiAoc3QgPT0gbm90X251bGxfc3RhcnQpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBOZWVkIHRvIHN0 YXJ0IHdpdGggc29tZSB2YWx1ZSwgbWF5IGFzIHdlbGwgYmUgdGhlIGZpcnN0CisJCQkJICogb25l LgorCQkJCSAqLworCQkJCWZpcnN0X2RhdHVtID0gdGhpc19kYXR1bTsKKwkJCX0KKwkJCWVsc2UK KwkJCXsKKwkJCQkvKgorCQkJCSAqIEFjY3VtdWxhdGUgYml0cyB0aGF0IHJlcHJlc2VudCBhIGRp ZmZlcmVuY2UgZnJvbSB0aGUKKwkJCQkgKiByZWZlcmVuY2UgZGF0dW0uCisJCQkJICovCisJCQkJ Y29tbW9uX3VwcGVyX2JpdHMgfD0gZmlyc3RfZGF0dW0gXiB0aGlzX2RhdHVtOworCQkJfQorCQl9 CisKKwkJaWYgKGNvbW1vbl91cHBlcl9iaXRzID09IDApCisJCXsKKwkJCS8qCisJCQkgKiBBbGwg Tk9UIE5VTEwgdHVwbGVzIGhhdmUgdGhlIHNhbWUgZGF0dW0sIHNvIHdlIGNhbiBza2lwIHJhZGl4 CisJCQkgKiBzb3J0LiBTb3J0IHVzaW5nIHRoZSB0aWVicmVhayBjb21wYXJhdG9yIGlmIG5lY2Vz c2FyeS4KKwkJCSAqLworCQkJaWYgKHN0YXRlLT5iYXNlLm9ubHlLZXkgPT0gTlVMTCkKKwkJCXsK KwkJCQlxc29ydF90dXBsZShub3RfbnVsbF9zdGFydCwKKwkJCQkJCQlub3RfbnVsbF9jb3VudCwK KwkJCQkJCQlzdGF0ZS0+YmFzZS5jb21wYXJldHVwX3RpZWJyZWFrLAorCQkJCQkJCXN0YXRlKTsK KwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8qCisJCQkgKiBUaGUgdXBwZXIgYml0cyBvZiBj b21tb25fdXBwZXJfYml0cyBhcmUgemVybyB3aGVyZSBhbGwgZGF0dW1zCisJCQkgKiBoYXZlIHRo ZSBzYW1lIGJpdHMuIFRoZSBieXRlIHBvc2l0aW9uIG9mIHRoZSBsZWZ0bW9zdCBvbmUgYml0CisJ CQkgKiBpcyB0aGUgYnl0ZSB3aGVyZSByYWRpeCBzb3J0IHNob3VsZCBzdGFydC4KKwkJCSAqLwor CQkJY29tbW9uX3ByZWZpeCA9IFNJWkVPRl9EQVRVTSAtIDEgLQorCQkJCShwZ19sZWZ0bW9zdF9v bmVfcG9zNjQoY29tbW9uX3VwcGVyX2JpdHMpIC8gQklUU19QRVJfQllURSk7CisKKwkJCXJhZGl4 X3NvcnRfdHVwbGUobm90X251bGxfc3RhcnQsCisJCQkJCQkJIG5vdF9udWxsX2NvdW50LAorCQkJ CQkJCSBjb21tb25fcHJlZml4LAorCQkJCQkJCSBzdGF0ZSk7CisJCX0KIAl9CiB9CiAKLS0gCjIu NTMuMAoK --000000000000e4290c064a785df6 Content-Type: text/x-patch; charset="UTF-8"; name="v7-0001-Perform-radix-sort-on-SortTuples-with-pass-by-val.patch" Content-Disposition: attachment; filename="v7-0001-Perform-radix-sort-on-SortTuples-with-pass-by-val.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlgn3cr60 RnJvbSA4MWJlNzJlNjkyMDhiMTU1ZjU2MTk2MzAwNDM2OTAxNTc4NzFhNzU1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKb2huIE5heWxvciA8am9obi5uYXlsb3JAcG9zdGdyZXNxbC5v cmc+CkRhdGU6IEZyaSwgMTcgT2N0IDIwMjUgMDk6NTc6NDMgKzA3MDAKU3ViamVjdDogW1BBVENI IHY3IDEvNF0gUGVyZm9ybSByYWRpeCBzb3J0IG9uIFNvcnRUdXBsZXMgd2l0aCBwYXNzLWJ5LXZh bHVlCiBEYXR1bXMKTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBj aGFyc2V0PVVURi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKClJhZGl4IHNvcnQg Y2FuIGJlIG11Y2ggZmFzdGVyIHRoYW4gcXVpY2tzb3J0LCBidXQgZm9yIG91ciBwdXJwb3NlcyBp dAppcyBsaW1pdGVkIHRvIHNlcXVlbmNlcyBvZiB1bnNpZ25lZCBieXRlcy4gVG8gbWFrZSB0dXBs ZXMgd2l0aCBvdGhlcgp0eXBlcyBhbWVuYWJsZSB0byB0aGlzIHRlY2huaXF1ZSwgc2V2ZXJhbCBm ZWF0dXJlcyBvZiB0dXBsZSBjb21wYXJpc29uCm11c3QgYmUgYWNjb3VudGVkIGZvciwgaS5lLiB0 aGUgc29ydCBrZXlzIG11c3QgYmUgIm5vcm1hbGl6ZWQiOgoKMS4gU2lnbmVkbmVzcyAtLSBJdCdz IHBvc3NpYmxlIHRvIG1vZGlmeSBhIHNpZ25lZCBpbnRlZ2VyIHN1Y2ggdGhhdAppdCBjYW4gYmUg Y29tcGFyZWQgYXMgdW5zaWduZWQuIEZvciBleGFtcGxlLCBhIHNpZ25lZCBjaGFyIGhhcyByYW5n ZQotMTI4IHRvIDEyNy4gSWYgd2UgY2FzdCB0aGF0IHRvIHVuc2lnbmVkIGNoYXIgYW5kIGFkZCAx MjgsIHRoZSByYW5nZQpvZiB2YWx1ZXMgYmVjb21lcyAwIHRvIDI1NSB3aGlsZSBwcmVzZXJ2aW5n IG9yZGVyLgoKMi4gRGlyZWN0aW9uIC0tIFNRTCBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiBBU0Mg b3IgREVTQy4gVGhlCmRlc2NlbmRpbmcgY2FzZSBpcyBlYXNpbHkgaGFuZGxlZCBieSB0YWtpbmcg dGhlIGNvbXBsZW1lbnQgb2YgdGhlCnVuc2lnbmVkIHJlcHJlc2VudGF0aW9uLgoKMy4gTlVMTCB2 YWx1ZXMgLS0gTlVMTFMgRklSU1QgYW5kIE5VTExTIExBU1QgbXVzdCB3b3JrIGNvcnJlY3RseS4K ClRoaXMgY29tbW1pdCBvbmx5IGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgZGF0dW0xIGlzIHBhc3Mt YnktdmFsdWUKRGF0dW0gKHBvc3NpYmx5IGFiYnJldmlhdGVkKSB0aGF0IGNvbXBhcmVzIGxpa2Ug YW4gb3JkaW5hcnkKaW50ZWdlci4gKEFiYnJldmlhdGlvbnMgb2YgdmFsdWVzIG9mIHR5cGUgIm51 bWVyaWMiIGFyZSBhIGNvbnZlbmllbnQKY291bnRlcmV4YW1wbGUuKSBGaXJzdCwgdHVwbGVzIGFy ZSBwYXJ0aXRpb25lZCBieSBudWxsbmVzcyBpbiB0aGUKY29ycmVjdCBOVUxMIG9yZGVyaW5nLiBU aGVuIHRoZSBOT1QgTlVMTCB0dXBsZXMgYXJlIHNvcnRlZCB3aXRoIHJhZGl4CnNvcnQgb24gZGF0 dW0xLiBGb3IgdGllYnJlYWtzIG9uIHN1YnNlcXVlbnQgc29ydGtleXMgKGluY2x1ZGluZyB0aGUK Zmlyc3Qgc29ydCBrZXkgaWYgYWJicmV2aWF0ZWQpLCB3ZSBkaXZlcnQgdG8gdGhlIHVzdWFsIHFz b3J0LgoKT1JERVIgQlkgcXVlcmllcyBvbiBwcmUtd2FybWVkIGJ1ZmZlcnMgYXJlIHVwIHRvIDJ4 IGZhc3RlciBvbiBoaWdoCmNhcmRpbmFsaXR5IGlucHV0cyB3aXRoIHJhZGl4IHNvcnQgdGhhbiB0 aGUgc29ydCBzcGVjaWFsaXphdGlvbnMgYWRkZWQKYnkgY29tbWl0IDY5NzQ5MjQzNCwgc28gZ2V0 IHJpZCBvZiB0aGVtLiBJdCdzIHN1ZmZpY2llbnQgdG8gZmFsbCBiYWNrCnRvIHFzb3J0X3R1cGxl KCkgZm9yIHNtYWxsIGFycmF5cy4gTW9kZXJhdGVseSBsb3cgY2FyZGluYWxpdHkgaW5wdXRzCnNo b3cgbW9yZSBtb2Rlc3QgaW1wcm92ZW50cy4gT3VyIHFzb3J0IGlzIHN0cm9uZ2x5IG9wdGltaXpl ZCBmb3IgdmVyeQpsb3cgY2FyZGluYWxpdHkgaW5wdXRzLCBidXQgcmFkaXggc29ydCBpcyB1c3Vh bGx5IGNvbXBhcmFibGUgdGhlcmUuCgpUaGUgY2hhbmdlcyB0byB0aGUgcmVncmVzc2lvbiB0ZXN0 cyBhcmUgY2F1c2VkIGJ5IHVuZGVyLXNwZWNpZmllZCBzb3J0Cm9yZGVycywgZS5nLiAiU0VMRUNU IGEsIGIgZnJvbSBteXRhYmxlIG9yZGVyIGJ5IGE7Ii4gRm9yIHVuc3RhYmxlCnNvcnRzLCBzdWNo IGFzIG91ciBxc29ydCBhbmQgdGhpcyBpbi1wbGFjZSByYWRpeCBzb3J0LCB0aGVyZSBpcyBubwpn dWFyYW50ZWUgb2YgdGhlIG9yZGVyIG9mICJiIiB3aXRoaW4gZWFjaCBncm91cCBvZiAiYSIuCgpU aGUgaW1wbGVtZW50YXRpb24gaXMgdGFrZW4gZnJvbSBza2FfYnl0ZV9zb3J0KCkgKEJvb3N0IGxp Y2Vuc2VkKSwKd2hpY2ggaXMgc2ltaWxhciB0byBBbWVyaWNhbiBmbGFnIHNvcnQgKGFuIGluLXBs YWNlIHJhZGl4IHNvcnQpIHdpdGgKbW9kaWZpY2F0aW9ucyB0byBtYWtlIGl0IGJldHRlciBzdWl0 ZWQgZm9yIG1vZGVybiBwaXBlbGluZWQgQ1BVcy4KClRoZSB0ZWNobmlxdWUgb2Ygbm9ybWFsaXph dGlvbiBkZXNjcmliZWQgYWJvdmUgY2FuIGFsc28gYmUgZXh0ZW5kZWQKdG8gdGhlIGNhc2Ugb2Yg bXVsdGlwbGUga2V5cy4gVGhhdCBpcyBsZWZ0IGZvciBmdXR1cmUgd29yayAoVGhhbmtzCnRvIFBl dGVyIEdlb2doZWdhbiBmb3IgdGhlIHN1Z2dlc3Rpb24gdG8gbG9vayBpbnRvIHRoaXMgYXJlYSku CgpSZXZpZXdlZC1ieTogQ2hlbmdwZW5nIFlhbiA8Y2hlbmdwZW5nX3lhbkBvdXRsb29rLmNvbT4K UmV2aWV3ZWQtYnk6IMOBbHZhcm8gSGVycmVyYSA8YWx2aGVycmVAa3VyaWxlbXUuZGU+ClJldmll d2VkLWJ5OiB6ZW5nbWFuIDx6ZW5nbWFuQGhhbG9kYnRlY2guY29tPgpSZXZpZXdlZC1ieTogQ2hh byBMaSA8bGkuZXZhbi5jaGFvQGdtYWlsLmNvbT4gKGVhcmxpZXIgdmVyc2lvbikKRGlzY3Vzc2lv bjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS9DQU5XQ0FaWXp4N2E3RTlBWTE2SnRfVTMrR1ZLREFEZmdB cFotNDJTWU5paWc4ZFRuRkFAbWFpbC5nbWFpbC5jb20KLS0tCiBzcmMvYmFja2VuZC91dGlscy9z b3J0L3R1cGxlc29ydC5jICAgICAgfCA1NTYgKysrKysrKysrKysrKysrKysrLS0tLS0tCiBzcmMv aW5jbHVkZS91dGlscy9zb3J0c3VwcG9ydC5oICAgICAgICAgfCAxMDEgLS0tLS0KIHNyYy9pbmNs dWRlL3V0aWxzL3R1cGxlc29ydC5oICAgICAgICAgICB8ICAgMSArCiBzcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL3R1cGxlc29ydC5vdXQgfCAgIDYgKy0KIHNyYy90b29scy9wZ2luZGVudC90eXBl ZGVmcy5saXN0ICAgICAgICB8ICAgMSArCiA1IGZpbGVzIGNoYW5nZWQsIDQyNyBpbnNlcnRpb25z KCspLCAyMzggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvc29y dC90dXBsZXNvcnQuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzb3J0LmMKaW5kZXgg MWVkY2FkODljODguLjA3ZmE4M2M3OTQ0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9z b3J0L3R1cGxlc29ydC5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzb3J0LmMK QEAgLTcsOCArNyw4IEBACiAgKiBhcHBsaWVkIHRvIGRpZmZlcmVudCBraW5kcyBvZiBzb3J0YWJs ZSBvYmplY3RzLiAgSW1wbGVtZW50YXRpb24gb2YKICAqIHRoZSBwYXJ0aWN1bGFyIHNvcnRpbmcg dmFyaWFudHMgaXMgZ2l2ZW4gaW4gdHVwbGVzb3J0dmFyaWFudHMuYy4KICAqIFRoaXMgbW9kdWxl IHdvcmtzIGVmZmljaWVudGx5IGZvciBib3RoIHNtYWxsIGFuZCBsYXJnZSBhbW91bnRzCi0gKiBv ZiBkYXRhLiAgU21hbGwgYW1vdW50cyBhcmUgc29ydGVkIGluLW1lbW9yeSB1c2luZyBxc29ydCgp LiAgTGFyZ2UKLSAqIGFtb3VudHMgYXJlIHNvcnRlZCB1c2luZyB0ZW1wb3JhcnkgZmlsZXMgYW5k IGEgc3RhbmRhcmQgZXh0ZXJuYWwgc29ydAorICogb2YgZGF0YS4gIFNtYWxsIGFtb3VudHMgYXJl IHNvcnRlZCBpbi1tZW1vcnkuICBMYXJnZSBhbW91bnRzIGFyZQorICogc29ydGVkIHVzaW5nIHRl bXBvcmFyeSBmaWxlcyBhbmQgYSBzdGFuZGFyZCBleHRlcm5hbCBzb3J0CiAgKiBhbGdvcml0aG0u CiAgKgogICogU2VlIEtudXRoLCB2b2x1bWUgMywgZm9yIG1vcmUgdGhhbiB5b3Ugd2FudCB0byBr bm93IGFib3V0IGV4dGVybmFsCkBAIC0yNiwxNiArMjYsMTYgQEAKICAqIEhpc3RvcmljYWxseSwg d2UgZGl2aWRlZCB0aGUgaW5wdXQgaW50byBzb3J0ZWQgcnVucyB1c2luZyByZXBsYWNlbWVudAog ICogc2VsZWN0aW9uLCBpbiB0aGUgZm9ybSBvZiBhIHByaW9yaXR5IHRyZWUgaW1wbGVtZW50ZWQg YXMgYSBoZWFwCiAgKiAoZXNzZW50aWFsbHkgS251dGgncyBBbGdvcml0aG0gNS4yLjNIKSwgYnV0 IG5vdyB3ZSBhbHdheXMgdXNlIHF1aWNrc29ydAotICogZm9yIHJ1biBnZW5lcmF0aW9uLgorICog b3IgcmFkaXggc29ydCBmb3IgcnVuIGdlbmVyYXRpb24uCiAgKgogICogVGhlIGFwcHJveGltYXRl IGFtb3VudCBvZiBtZW1vcnkgYWxsb3dlZCBmb3IgYW55IG9uZSBzb3J0IG9wZXJhdGlvbgogICog aXMgc3BlY2lmaWVkIGluIGtpbG9ieXRlcyBieSB0aGUgY2FsbGVyIChtb3N0IHBhc3Mgd29ya19t ZW0pLiAgSW5pdGlhbGx5LAogICogd2UgYWJzb3JiIHR1cGxlcyBhbmQgc2ltcGx5IHN0b3JlIHRo ZW0gaW4gYW4gdW5zb3J0ZWQgYXJyYXkgYXMgbG9uZyBhcwogICogd2UgaGF2ZW4ndCBleGNlZWRl ZCB3b3JrTWVtLiAgSWYgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgaW5wdXQgd2l0aG91dAotICog ZXhjZWVkaW5nIHdvcmtNZW0sIHdlIHNvcnQgdGhlIGFycmF5IHVzaW5nIHFzb3J0KCkgYW5kIHN1 YnNlcXVlbnRseSByZXR1cm4KKyAqIGV4Y2VlZGluZyB3b3JrTWVtLCB3ZSBzb3J0IHRoZSBhcnJh eSBpbiBtZW1vcnkgYW5kIHN1YnNlcXVlbnRseSByZXR1cm4KICAqIHR1cGxlcyBqdXN0IGJ5IHNj YW5uaW5nIHRoZSB0dXBsZSBhcnJheSBzZXF1ZW50aWFsbHkuICBJZiB3ZSBkbyBleGNlZWQKICAq IHdvcmtNZW0sIHdlIGJlZ2luIHRvIGVtaXQgdHVwbGVzIGludG8gc29ydGVkIHJ1bnMgaW4gdGVt cG9yYXJ5IHRhcGVzLgotICogV2hlbiB0dXBsZXMgYXJlIGR1bXBlZCBpbiBiYXRjaCBhZnRlciBx dWlja3NvcnRpbmcsIHdlIGJlZ2luIGEgbmV3IHJ1bgorICogV2hlbiB0dXBsZXMgYXJlIGR1bXBl ZCBpbiBiYXRjaCBhZnRlciBpbi1tZW1vcnkgc29ydGluZywgd2UgYmVnaW4gYSBuZXcgcnVuCiAg KiB3aXRoIGEgbmV3IG91dHB1dCB0YXBlLiAgSWYgd2UgcmVhY2ggdGhlIG1heCBudW1iZXIgb2Yg dGFwZXMsIHdlIHdyaXRlCiAgKiBzdWJzZXF1ZW50IHJ1bnMgb24gdGhlIGV4aXN0aW5nIHRhcGVz IGluIGEgcm91bmQtcm9iaW4gZmFzaGlvbi4gIFdlIHdpbGwKICAqIG5lZWQgbXVsdGlwbGUgbWVy Z2UgcGFzc2VzIHRvIGZpbmlzaCB0aGUgbWVyZ2UgaW4gdGhhdCBjYXNlLiAgQWZ0ZXIgdGhlCkBA IC00NzYsMTIxICs0NzYsMTUgQEAgc3RhdGljIHZvaWQgZnJlZV9zb3J0X3R1cGxlKFR1cGxlc29y dHN0YXRlICpzdGF0ZSwgU29ydFR1cGxlICpzdHVwKTsKIHN0YXRpYyB2b2lkIHR1cGxlc29ydF9m cmVlKFR1cGxlc29ydHN0YXRlICpzdGF0ZSk7CiBzdGF0aWMgdm9pZCB0dXBsZXNvcnRfdXBkYXRl bWF4KFR1cGxlc29ydHN0YXRlICpzdGF0ZSk7CiAKLS8qCi0gKiBTcGVjaWFsaXplZCBjb21wYXJh dG9ycyB0aGF0IHdlIGNhbiBpbmxpbmUgaW50byBzcGVjaWFsaXplZCBzb3J0cy4gIFRoZSBnb2Fs Ci0gKiBpcyB0byB0cnkgdG8gc29ydCB0d28gdHVwbGVzIHdpdGhvdXQgaGF2aW5nIHRvIGZvbGxv dyB0aGUgcG9pbnRlcnMgdG8gdGhlCi0gKiBjb21wYXJhdG9yIG9yIHRoZSB0dXBsZS4KLSAqCi0g KiBYWFg6IEZvciBub3csIHRoZXJlIGlzIG5vIHNwZWNpYWxpemF0aW9uIGZvciBjYXNlcyB3aGVy ZSBkYXR1bTEgaXMKLSAqIGF1dGhvcml0YXRpdmUgYW5kIHdlIGRvbid0IGV2ZW4gbmVlZCB0byBm YWxsIGJhY2sgdG8gYSBjYWxsYmFjayBhdCBhbGwgKHRoYXQKLSAqIHdvdWxkIGJlIHRydWUgZm9y IHR5cGVzIGxpa2UgaW50NC9pbnQ4L3RpbWVzdGFtcC9kYXRlLCBidXQgbm90IHRydWUgZm9yCi0g KiBhYmJyZXZpYXRpb25zIG9mIHRleHQgb3IgbXVsdGkta2V5IHNvcnRzLiAgVGhlcmUgY291bGQg YmUhICBJcyBpdCB3b3J0aCBpdD8KLSAqLwotCi0vKiBVc2VkIGlmIGZpcnN0IGtleSdzIGNvbXBh cmF0b3IgaXMgc3N1cF9kYXR1bV91bnNpZ25lZF9jbXAgKi8KLXN0YXRpYyBwZ19hdHRyaWJ1dGVf YWx3YXlzX2lubGluZSBpbnQKLXFzb3J0X3R1cGxlX3Vuc2lnbmVkX2NvbXBhcmUoU29ydFR1cGxl ICphLCBTb3J0VHVwbGUgKmIsIFR1cGxlc29ydHN0YXRlICpzdGF0ZSkKLXsKLQlpbnQJCQljb21w YXJlOwotCi0JY29tcGFyZSA9IEFwcGx5VW5zaWduZWRTb3J0Q29tcGFyYXRvcihhLT5kYXR1bTEs IGEtPmlzbnVsbDEsCi0JCQkJCQkJCQkJICBiLT5kYXR1bTEsIGItPmlzbnVsbDEsCi0JCQkJCQkJ CQkJICAmc3RhdGUtPmJhc2Uuc29ydEtleXNbMF0pOwotCWlmIChjb21wYXJlICE9IDApCi0JCXJl dHVybiBjb21wYXJlOwotCi0JLyoKLQkgKiBObyBuZWVkIHRvIHdhc3RlIGVmZm9ydCBjYWxsaW5n IHRoZSB0aWVicmVhayBmdW5jdGlvbiB3aGVuIHRoZXJlIGFyZSBubwotCSAqIG90aGVyIGtleXMg dG8gc29ydCBvbi4KLQkgKi8KLQlpZiAoc3RhdGUtPmJhc2Uub25seUtleSAhPSBOVUxMKQotCQly ZXR1cm4gMDsKLQotCXJldHVybiBzdGF0ZS0+YmFzZS5jb21wYXJldHVwX3RpZWJyZWFrKGEsIGIs IHN0YXRlKTsKLX0KLQotLyogVXNlZCBpZiBmaXJzdCBrZXkncyBjb21wYXJhdG9yIGlzIHNzdXBf ZGF0dW1fc2lnbmVkX2NtcCAqLwotc3RhdGljIHBnX2F0dHJpYnV0ZV9hbHdheXNfaW5saW5lIGlu dAotcXNvcnRfdHVwbGVfc2lnbmVkX2NvbXBhcmUoU29ydFR1cGxlICphLCBTb3J0VHVwbGUgKmIs IFR1cGxlc29ydHN0YXRlICpzdGF0ZSkKLXsKLQlpbnQJCQljb21wYXJlOwotCi0JY29tcGFyZSA9 IEFwcGx5U2lnbmVkU29ydENvbXBhcmF0b3IoYS0+ZGF0dW0xLCBhLT5pc251bGwxLAotCQkJCQkJ CQkJCWItPmRhdHVtMSwgYi0+aXNudWxsMSwKLQkJCQkJCQkJCQkmc3RhdGUtPmJhc2Uuc29ydEtl eXNbMF0pOwotCi0JaWYgKGNvbXBhcmUgIT0gMCkKLQkJcmV0dXJuIGNvbXBhcmU7Ci0KLQkvKgot CSAqIE5vIG5lZWQgdG8gd2FzdGUgZWZmb3J0IGNhbGxpbmcgdGhlIHRpZWJyZWFrIGZ1bmN0aW9u IHdoZW4gdGhlcmUgYXJlIG5vCi0JICogb3RoZXIga2V5cyB0byBzb3J0IG9uLgotCSAqLwotCWlm IChzdGF0ZS0+YmFzZS5vbmx5S2V5ICE9IE5VTEwpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHN0 YXRlLT5iYXNlLmNvbXBhcmV0dXBfdGllYnJlYWsoYSwgYiwgc3RhdGUpOwotfQotCi0vKiBVc2Vk IGlmIGZpcnN0IGtleSdzIGNvbXBhcmF0b3IgaXMgc3N1cF9kYXR1bV9pbnQzMl9jbXAgKi8KLXN0 YXRpYyBwZ19hdHRyaWJ1dGVfYWx3YXlzX2lubGluZSBpbnQKLXFzb3J0X3R1cGxlX2ludDMyX2Nv bXBhcmUoU29ydFR1cGxlICphLCBTb3J0VHVwbGUgKmIsIFR1cGxlc29ydHN0YXRlICpzdGF0ZSkK LXsKLQlpbnQJCQljb21wYXJlOwotCi0JY29tcGFyZSA9IEFwcGx5SW50MzJTb3J0Q29tcGFyYXRv cihhLT5kYXR1bTEsIGEtPmlzbnVsbDEsCi0JCQkJCQkJCQkgICBiLT5kYXR1bTEsIGItPmlzbnVs bDEsCi0JCQkJCQkJCQkgICAmc3RhdGUtPmJhc2Uuc29ydEtleXNbMF0pOwotCi0JaWYgKGNvbXBh cmUgIT0gMCkKLQkJcmV0dXJuIGNvbXBhcmU7Ci0KLQkvKgotCSAqIE5vIG5lZWQgdG8gd2FzdGUg ZWZmb3J0IGNhbGxpbmcgdGhlIHRpZWJyZWFrIGZ1bmN0aW9uIHdoZW4gdGhlcmUgYXJlIG5vCi0J ICogb3RoZXIga2V5cyB0byBzb3J0IG9uLgotCSAqLwotCWlmIChzdGF0ZS0+YmFzZS5vbmx5S2V5 ICE9IE5VTEwpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHN0YXRlLT5iYXNlLmNvbXBhcmV0dXBf dGllYnJlYWsoYSwgYiwgc3RhdGUpOwotfQogCiAvKgogICogU3BlY2lhbCB2ZXJzaW9ucyBvZiBx c29ydCBqdXN0IGZvciBTb3J0VHVwbGUgb2JqZWN0cy4gIHFzb3J0X3R1cGxlKCkgc29ydHMKICAq IGFueSB2YXJpYW50IG9mIFNvcnRUdXBsZXMsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBjb21wYXJl dHVwIGZ1bmN0aW9uLgogICogcXNvcnRfc3N1cCgpIGlzIHNwZWNpYWxpemVkIGZvciB0aGUgY2Fz ZSB3aGVyZSB0aGUgY29tcGFyZXR1cCBmdW5jdGlvbgogICogcmVkdWNlcyB0byBBcHBseVNvcnRD b21wYXJhdG9yKCksIHRoYXQgaXMgc2luZ2xlLWtleSBNaW5pbWFsVHVwbGUgc29ydHMKLSAqIGFu ZCBEYXR1bSBzb3J0cy4gIHFzb3J0X3R1cGxlX3t1bnNpZ25lZCxzaWduZWQsaW50MzJ9IGFyZSBz cGVjaWFsaXplZCBmb3IKLSAqIGNvbW1vbiBjb21wYXJpc29uIGZ1bmN0aW9ucyBvbiBwYXNzLWJ5 LXZhbHVlIGxlYWRpbmcgZGF0dW1zLgorICogYW5kIERhdHVtIHNvcnRzLgogICovCiAKLSNkZWZp bmUgU1RfU09SVCBxc29ydF90dXBsZV91bnNpZ25lZAotI2RlZmluZSBTVF9FTEVNRU5UX1RZUEUg U29ydFR1cGxlCi0jZGVmaW5lIFNUX0NPTVBBUkUoYSwgYiwgc3RhdGUpIHFzb3J0X3R1cGxlX3Vu c2lnbmVkX2NvbXBhcmUoYSwgYiwgc3RhdGUpCi0jZGVmaW5lIFNUX0NPTVBBUkVfQVJHX1RZUEUg VHVwbGVzb3J0c3RhdGUKLSNkZWZpbmUgU1RfQ0hFQ0tfRk9SX0lOVEVSUlVQVFMKLSNkZWZpbmUg U1RfU0NPUEUgc3RhdGljCi0jZGVmaW5lIFNUX0RFRklORQotI2luY2x1ZGUgImxpYi9zb3J0X3Rl bXBsYXRlLmgiCi0KLSNkZWZpbmUgU1RfU09SVCBxc29ydF90dXBsZV9zaWduZWQKLSNkZWZpbmUg U1RfRUxFTUVOVF9UWVBFIFNvcnRUdXBsZQotI2RlZmluZSBTVF9DT01QQVJFKGEsIGIsIHN0YXRl KSBxc29ydF90dXBsZV9zaWduZWRfY29tcGFyZShhLCBiLCBzdGF0ZSkKLSNkZWZpbmUgU1RfQ09N UEFSRV9BUkdfVFlQRSBUdXBsZXNvcnRzdGF0ZQotI2RlZmluZSBTVF9DSEVDS19GT1JfSU5URVJS VVBUUwotI2RlZmluZSBTVF9TQ09QRSBzdGF0aWMKLSNkZWZpbmUgU1RfREVGSU5FCi0jaW5jbHVk ZSAibGliL3NvcnRfdGVtcGxhdGUuaCIKLQotI2RlZmluZSBTVF9TT1JUIHFzb3J0X3R1cGxlX2lu dDMyCi0jZGVmaW5lIFNUX0VMRU1FTlRfVFlQRSBTb3J0VHVwbGUKLSNkZWZpbmUgU1RfQ09NUEFS RShhLCBiLCBzdGF0ZSkgcXNvcnRfdHVwbGVfaW50MzJfY29tcGFyZShhLCBiLCBzdGF0ZSkKLSNk ZWZpbmUgU1RfQ09NUEFSRV9BUkdfVFlQRSBUdXBsZXNvcnRzdGF0ZQotI2RlZmluZSBTVF9DSEVD S19GT1JfSU5URVJSVVBUUwotI2RlZmluZSBTVF9TQ09QRSBzdGF0aWMKLSNkZWZpbmUgU1RfREVG SU5FCi0jaW5jbHVkZSAibGliL3NvcnRfdGVtcGxhdGUuaCIKLQogI2RlZmluZSBTVF9TT1JUIHFz b3J0X3R1cGxlCiAjZGVmaW5lIFNUX0VMRU1FTlRfVFlQRSBTb3J0VHVwbGUKICNkZWZpbmUgU1Rf Q09NUEFSRV9SVU5USU1FX1BPSU5URVIKQEAgLTYxMiw2ICs1MDYsMjMgQEAgcXNvcnRfdHVwbGVf aW50MzJfY29tcGFyZShTb3J0VHVwbGUgKmEsIFNvcnRUdXBsZSAqYiwgVHVwbGVzb3J0c3RhdGUg KnN0YXRlKQogI2RlZmluZSBTVF9ERUZJTkUKICNpbmNsdWRlICJsaWIvc29ydF90ZW1wbGF0ZS5o IgogCisvKiBzdGF0ZSBmb3IgcmFkaXggc29ydCAqLwordHlwZWRlZiBzdHJ1Y3QgUmFkaXhTb3J0 SW5mbworeworCXVuaW9uCisJeworCQlzaXplX3QJCWNvdW50OworCQlzaXplX3QJCW9mZnNldDsK Kwl9OworCXNpemVfdAkJbmV4dF9vZmZzZXQ7Cit9IFJhZGl4U29ydEluZm87CisKKy8qCisgKiBU aHJlc2hvbGQgYmVsb3cgd2hpY2ggcXNvcnRfdHVwbGUoKSBpcyBnZW5lcmFsbHkgZmFzdGVyIHRo YW4gYSByYWRpeCBzb3J0LgorICovCisjZGVmaW5lIFFTT1JUX1RIUkVTSE9MRCA0MAorCisKIC8q CiAgKgkJdHVwbGVzb3J0X2JlZ2luX3h4eAogICoKQEAgLTEzNjMsNyArMTI3NCw3IEBAIHR1cGxl c29ydF9wZXJmb3Jtc29ydChUdXBsZXNvcnRzdGF0ZSAqc3RhdGUpCiAJCQkgKi8KIAkJCWlmIChT RVJJQUwoc3RhdGUpKQogCQkJewotCQkJCS8qIEp1c3QgcXNvcnQgJ2VtIGFuZCB3ZSdyZSBkb25l ICovCisJCQkJLyogU29ydCBpbiBtZW1vcnkgYW5kIHdlJ3JlIGRvbmUgKi8KIAkJCQl0dXBsZXNv cnRfc29ydF9tZW10dXBsZXMoc3RhdGUpOwogCQkJCXN0YXRlLT5zdGF0dXMgPSBUU1NfU09SVEVE SU5NRU07CiAJCQl9CkBAIC0yMzM3LDcgKzIyNDgsNyBAQCBkdW1wdHVwbGVzKFR1cGxlc29ydHN0 YXRlICpzdGF0ZSwgYm9vbCBhbGx0dXBsZXMpCiAKIAkvKgogCSAqIFNvcnQgYWxsIHR1cGxlcyBh Y2N1bXVsYXRlZCB3aXRoaW4gdGhlIGFsbG93ZWQgYW1vdW50IG9mIG1lbW9yeSBmb3IKLQkgKiB0 aGlzIHJ1biB1c2luZyBxdWlja3NvcnQKKwkgKiB0aGlzIHJ1bi4KIAkgKi8KIAl0dXBsZXNvcnRf c29ydF9tZW10dXBsZXMoc3RhdGUpOwogCkBAIC0yNjUyLDEwICsyNTYzLDM5NSBAQCBzb3J0X2Jv dW5kZWRfaGVhcChUdXBsZXNvcnRzdGF0ZSAqc3RhdGUpCiAJc3RhdGUtPmJvdW5kVXNlZCA9IHRy dWU7CiB9CiAKKworLyogcmFkaXggc29ydCByb3V0aW5lcyAqLworCisvKgorICogUmV0cmlldmUg Ynl0ZSBmcm9tIGRhdHVtLCBpbmRleGVkIGJ5ICdsZXZlbCc6IDAgZm9yIExTQiwgNyBmb3IgTVNC CisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDgKK2N1cnJlbnRfYnl0ZShEYXR1bSBrZXksIGludCBs ZXZlbCkKK3sKKwlpbnQJCQlzaGlmdCA9IChTSVpFT0ZfREFUVU0gLSAxIC0gbGV2ZWwpICogQklU U19QRVJfQllURTsKKworCXJldHVybiAoa2V5ID4+IHNoaWZ0KSAmIDB4RkY7Cit9CisKIC8qCi0g KiBTb3J0IGFsbCBtZW10dXBsZXMgdXNpbmcgc3BlY2lhbGl6ZWQgcXNvcnQoKSByb3V0aW5lcy4K KyAqIE5vcm1hbGl6ZSBkYXR1bSBzdWNoIHRoYXQgdW5zaWduZWQgY29tcGFyaXNvbiBpcyBvcmRl ci1wcmVzZXJ2aW5nLAorICogdGFraW5nIEFTQy9ERVNDIGludG8gYWNjb3VudCBhcyB3ZWxsLgor ICovCitzdGF0aWMgaW5saW5lIERhdHVtCitub3JtYWxpemVfZGF0dW0oRGF0dW0gb3JpZywgU29y dFN1cHBvcnQgc3N1cCkKK3sKKwlEYXR1bQkJbm9ybV9kYXR1bTE7CisKKwlpZiAoc3N1cC0+Y29t cGFyYXRvciA9PSBzc3VwX2RhdHVtX3NpZ25lZF9jbXApCisJeworCQlub3JtX2RhdHVtMSA9IG9y aWcgKyAoKHVpbnQ2NCkgUEdfSU5UNjRfTUFYKSArIDE7CisJfQorCWVsc2UgaWYgKHNzdXAtPmNv bXBhcmF0b3IgPT0gc3N1cF9kYXR1bV9pbnQzMl9jbXApCisJeworCQkvKgorCQkgKiBGaXJzdCB0 cnVuY2F0ZSB0byB1aW50MzIuIFRlY2huaWNhbGx5LCB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoaXMs CisJCSAqIGJ1dCBpdCBmb3JjZXMgdGhlIHVwcGVyIGhhbGYgb2YgdGhlIGRhdHVtIHRvIGJlIHpl cm8gcmVnYXJkbGVzcyBvZgorCQkgKiBzaWduLgorCQkgKi8KKwkJdWludDMyCQl1MzIgPSBEYXR1 bUdldFVJbnQzMihvcmlnKSArICgodWludDMyKSBQR19JTlQzMl9NQVgpICsgMTsKKworCQlub3Jt X2RhdHVtMSA9IFVJbnQzMkdldERhdHVtKHUzMik7CisJfQorCWVsc2UKKwl7CisJCUFzc2VydChz c3VwLT5jb21wYXJhdG9yID09IHNzdXBfZGF0dW1fdW5zaWduZWRfY21wKTsKKwkJbm9ybV9kYXR1 bTEgPSBvcmlnOworCX0KKworCWlmIChzc3VwLT5zc3VwX3JldmVyc2UpCisJCW5vcm1fZGF0dW0x ID0gfm5vcm1fZGF0dW0xOworCisJcmV0dXJuIG5vcm1fZGF0dW0xOworfQorCisvKgorICogcmFk aXhfc29ydF90dXBsZQorICoKKyAqIFJhZGl4IHNvcnQgYnkgdGhlIHBhc3MtYnktdmFsdWUgZGF0 dW0gaW4gZGF0dW0xLiBUaGlzIGlzIGEgbW9kaWZpY2F0aW9uIG9mCisgKiBza2FfYnl0ZV9zb3J0 KCkgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2thcnVwa2Uvc2thX3NvcnQKKyAqIFRoZSBvcmln aW5hbCBjb3B5cmlnaHQgbm90aWNlIGZvbGxvd3M6CisgKgorICogQ29weXJpZ2h0IE1hbHRlIFNr YXJ1cGtlIDIwMTYuCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGlj ZW5zZSwgVmVyc2lvbiAxLjAuCisgKgorICogQm9vc3QgU29mdHdhcmUgTGljZW5zZSAtIFZlcnNp b24gMS4wIC0gQXVndXN0IDE3dGgsIDIwMDMKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24KKyAq IG9idGFpbmluZyBhIGNvcHkgb2YgdGhlIHNvZnR3YXJlIGFuZCBhY2NvbXBhbnlpbmcgZG9jdW1l bnRhdGlvbiBjb3ZlcmVkIGJ5CisgKiB0aGlzIGxpY2Vuc2UgKHRoZSAiU29mdHdhcmUiKSB0byB1 c2UsIHJlcHJvZHVjZSwgZGlzcGxheSwgZGlzdHJpYnV0ZSwKKyAqIGV4ZWN1dGUsIGFuZCB0cmFu c21pdCB0aGUgU29mdHdhcmUsIGFuZCB0byBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhl CisgKiBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCB0aGlyZC1wYXJ0aWVzIHRvIHdob20gdGhlIFNv ZnR3YXJlIGlzIGZ1cm5pc2hlZCB0bworICogZG8gc28sIGFsbCBzdWJqZWN0IHRvIHRoZSBmb2xs b3dpbmc6CisgKgorICogVGhlIGNvcHlyaWdodCBub3RpY2VzIGluIHRoZSBTb2Z0d2FyZSBhbmQg dGhpcyBlbnRpcmUgc3RhdGVtZW50LCBpbmNsdWRpbmcKKyAqIHRoZSBhYm92ZSBsaWNlbnNlIGdy YW50LCB0aGlzIHJlc3RyaWN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiBt dXN0IGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBpbiB3aG9sZSBv ciBpbiBwYXJ0LCBhbmQKKyAqIGFsbCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTb2Z0d2FyZSwg dW5sZXNzIHN1Y2ggY29waWVzIG9yIGRlcml2YXRpdmUKKyAqIHdvcmtzIGFyZSBzb2xlbHkgaW4g dGhlIGZvcm0gb2YgbWFjaGluZS1leGVjdXRhYmxlIG9iamVjdCBjb2RlIGdlbmVyYXRlZCBieQor ICogYSBzb3VyY2UgbGFuZ3VhZ2UgcHJvY2Vzc29yLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQ Uk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9S CisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVT IE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LCBUSVRMRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBD T1BZUklHSFQgSE9MREVSUyBPUiBBTllPTkUgRElTVFJJQlVUSU5HIFRIRSBTT0ZUV0FSRSBCRSBM SUFCTEUKKyAqIEZPUiBBTlkgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g Q09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1Ig SU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBE RUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KK3N0YXRpYyB2b2lkCityYWRpeF9zb3J0X3R1 cGxlKFNvcnRUdXBsZSAqYmVnaW4sIHNpemVfdCBuX2VsZW1zLCBpbnQgbGV2ZWwsIFR1cGxlc29y dHN0YXRlICpzdGF0ZSkKK3sKKwlSYWRpeFNvcnRJbmZvIHBhcnRpdGlvbnNbMjU2XSA9IHswfTsK Kwl1aW50OAkJcmVtYWluaW5nX3BhcnRpdGlvbnNbMjU2XTsKKwlzaXplX3QJCXRvdGFsID0gMDsK KwlpbnQJCQludW1fcGFydGl0aW9ucyA9IDA7CisJaW50CQkJbnVtX3JlbWFpbmluZzsKKwlTb3J0 U3VwcG9ydCBzc3VwID0gJnN0YXRlLT5iYXNlLnNvcnRLZXlzWzBdOworCXNpemVfdAkJc3RhcnRf b2Zmc2V0ID0gMDsKKwlTb3J0VHVwbGUgICpwYXJ0aXRpb25fYmVnaW4gPSBiZWdpbjsKKworCS8q IGNvdW50IG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBlYWNoIGJ5dGUgKi8KKwlmb3IgKFNvcnRU dXBsZSAqc3QgPSBiZWdpbjsgc3QgPCBiZWdpbiArIG5fZWxlbXM7IHN0KyspCisJeworCQl1aW50 OAkJdGhpc19wYXJ0aXRpb247CisKKwkJLyogZXh0cmFjdCB0aGUgYnl0ZSBmb3IgdGhpcyBsZXZl bCBmcm9tIHRoZSBub3JtYWxpemVkIGRhdHVtICovCisJCXRoaXNfcGFydGl0aW9uID0gY3VycmVu dF9ieXRlKG5vcm1hbGl6ZV9kYXR1bShzdC0+ZGF0dW0xLCBzc3VwKSwKKwkJCQkJCQkJCSAgbGV2 ZWwpOworCisJCS8qIHNhdmUgaXQgZm9yIHRoZSBwZXJtdXRhdGlvbiBzdGVwICovCisJCXN0LT5j dXJieXRlID0gdGhpc19wYXJ0aXRpb247CisKKwkJcGFydGl0aW9uc1t0aGlzX3BhcnRpdGlvbl0u Y291bnQrKzsKKworCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOworCX0KKworCS8qIGNvbXB1dGUg cGFydGl0aW9uIG9mZnNldHMgKi8KKwlmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQorCXsK KwkJc2l6ZV90CQljb3VudCA9IHBhcnRpdGlvbnNbaV0uY291bnQ7CisKKwkJaWYgKGNvdW50ICE9 IDApCisJCXsKKwkJCXBhcnRpdGlvbnNbaV0ub2Zmc2V0ID0gdG90YWw7CisJCQl0b3RhbCArPSBj b3VudDsKKwkJCXJlbWFpbmluZ19wYXJ0aXRpb25zW251bV9wYXJ0aXRpb25zXSA9IGk7CisJCQlu dW1fcGFydGl0aW9ucysrOworCQl9CisJCXBhcnRpdGlvbnNbaV0ubmV4dF9vZmZzZXQgPSB0b3Rh bDsKKwl9CisKKwkvKgorCSAqIFN3YXAgdHVwbGVzIHRvIGNvcnJlY3QgcGFydGl0aW9uLgorCSAq CisJICogSW4gdHJhZGl0aW9uYWwgQW1lcmljYW4gZmxhZyBzb3J0LCBhIHN3YXAgc2VuZHMgdGhl IGN1cnJlbnQgZWxlbWVudCB0bworCSAqIHRoZSBjb3JyZWN0IHBhcnRpdGlvbiwgYnV0IHRoZSBh cnJheSBwb2ludGVyIG9ubHkgYWR2YW5jZXMgaWYgdGhlCisJICogcGFydG5lciBvZiB0aGUgc3dh cCBoYXBwZW5zIHRvIGJlIGFuIGVsZW1lbnQgdGhhdCBiZWxvbmdzIGluIHRoZQorCSAqIGN1cnJl bnQgcGFydGl0aW9uLiBUaGF0IG9ubHkgcmVxdWlyZXMgb25lIHBhc3MgdGhyb3VnaCB0aGUgYXJy YXksIGJ1dAorCSAqIHRoZSBkaXNhZHZhbnRhZ2UgaXMgd2UgZG9uJ3Qga25vdyBpZiB0aGUgcG9p bnRlciBjYW4gYWR2YW5jZSB1bnRpbCB0aGUKKwkgKiBzd2FwIGNvbXBsZXRlcy4gSGVyZSBsaWVz IHRoZSBtb3N0IGludGVyZXN0aW5nIGlubm92YXRpb24gZnJvbSB0aGUKKwkgKiB1cHN0cmVhbSBz a2FfYnl0ZV9zb3J0OiBBZnRlciBpbml0aWF0aW5nIHRoZSBzd2FwLCB3ZSBpbW1lZGlhdGVseQor CSAqIHByb2NlZWQgdG8gdGhlIG5leHQgZWxlbWVudC4gVGhpcyBtYWtlcyBiZXR0ZXIgdXNlIG9m IENQVSBwaXBlbGluaW5nLAorCSAqIGJ1dCBhbHNvIG1lYW5zIHRoYXQgd2Ugd2lsbCBvZnRlbiBu ZWVkIG11bHRpcGxlIGl0ZXJhdGlvbnMgb2YgdGhpcworCSAqIGxvb3AuIHNrYV9ieXRlX3NvcnQo KSBtYWludGFpbnMgYSBzZXBhcmF0ZSBsaXN0IG9mIHdoaWNoIHBhcnRpdGlvbnMKKwkgKiBoYXZl bid0IGZpbmlzaGVkLCB3aGljaCBpcyB1cGRhdGVkIGV2ZXJ5IGxvb3AgaXRlcmF0aW9uLiBIZXJl IHdlIHNpbXBseQorCSAqIGNoZWNrIGVhY2ggcGFydGl0aW9uIGR1cmluZyBldmVyeSBpdGVyYXRp b24uCisJICoKKwkgKiBJZiB3ZSBzdGFydGVkIHdpdGggYSBzaW5nbGUgcGFydGl0aW9uLCB0aGVy ZSBpcyBub3RoaW5nIHRvIGRvLiBJZiBhCisJICogcHJldmlvdXMgbG9vcCBpdGVyYXRpb24gcmVz dWx0cyBpbiBvbmx5IG9uZSBwYXJ0aXRpb24gdGhhdCBoYXNuJ3QgYmVlbgorCSAqIGNvdW50ZWQg YXMgc29ydGVkLCB3ZSBrbm93IGl0J3MgYWN0dWFsbHkgc29ydGVkIGFuZCBjYW4gZXhpdCB0aGUg bG9vcC4KKwkgKi8KKwludW1fcmVtYWluaW5nID0gbnVtX3BhcnRpdGlvbnM7CisJd2hpbGUgKG51 bV9yZW1haW5pbmcgPiAxKQorCXsKKwkJLyogc3RhcnQgdGhlIGNvdW50IG92ZXIgKi8KKwkJbnVt X3JlbWFpbmluZyA9IG51bV9wYXJ0aXRpb25zOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVt X3BhcnRpdGlvbnM7IGkrKykKKwkJeworCQkJdWludDgJCWlkeCA9IHJlbWFpbmluZ19wYXJ0aXRp b25zW2ldOworCisJCQlmb3IgKFNvcnRUdXBsZSAqc3QgPSBiZWdpbiArIHBhcnRpdGlvbnNbaWR4 XS5vZmZzZXQ7CisJCQkJIHN0IDwgYmVnaW4gKyBwYXJ0aXRpb25zW2lkeF0ubmV4dF9vZmZzZXQ7 CisJCQkJIHN0KyspCisJCQl7CisJCQkJc2l6ZV90CQlvZmZzZXQgPSBwYXJ0aXRpb25zW3N0LT5j dXJieXRlXS5vZmZzZXQrKzsKKwkJCQlTb3J0VHVwbGUJdG1wOworCisJCQkJLyogc3dhcCBjdXJy ZW50IHR1cGxlIHdpdGggZGVzdGluYXRpb24gcG9zaXRpb24gKi8KKwkJCQlBc3NlcnQob2Zmc2V0 IDwgbl9lbGVtcyk7CisJCQkJdG1wID0gKnN0OworCQkJCSpzdCA9IGJlZ2luW29mZnNldF07CisJ CQkJYmVnaW5bb2Zmc2V0XSA9IHRtcDsKKworCQkJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CisJ CQl9OworCisJCQkvKiBJcyB0aGlzIHBhcnRpdGlvbiBzb3J0ZWQ/ICovCisJCQlpZiAocGFydGl0 aW9uc1tpZHhdLm9mZnNldCA9PSBwYXJ0aXRpb25zW2lkeF0ubmV4dF9vZmZzZXQpCisJCQkJbnVt X3JlbWFpbmluZy0tOworCQl9CisJfQorCisJLyogcmVjdXJzZSAqLworCWZvciAodWludDggKnJw ID0gcmVtYWluaW5nX3BhcnRpdGlvbnM7CisJCSBycCA8IHJlbWFpbmluZ19wYXJ0aXRpb25zICsg bnVtX3BhcnRpdGlvbnM7CisJCSBycCsrKQorCXsKKwkJc2l6ZV90CQllbmRfb2Zmc2V0ID0gcGFy dGl0aW9uc1sqcnBdLm5leHRfb2Zmc2V0OworCQlTb3J0VHVwbGUgICpwYXJ0aXRpb25fZW5kID0g YmVnaW4gKyBlbmRfb2Zmc2V0OworCQlwdHJkaWZmX3QJbnVtX2VsZW1lbnRzID0gZW5kX29mZnNl dCAtIHN0YXJ0X29mZnNldDsKKworCQlpZiAobnVtX2VsZW1lbnRzID4gMSkKKwkJeworCQkJaWYg KGxldmVsIDwgU0laRU9GX0RBVFVNIC0gMSkKKwkJCXsKKwkJCQlpZiAobnVtX2VsZW1lbnRzIDwg UVNPUlRfVEhSRVNIT0xEKQorCQkJCXsKKwkJCQkJcXNvcnRfdHVwbGUocGFydGl0aW9uX2JlZ2lu LAorCQkJCQkJCQludW1fZWxlbWVudHMsCisJCQkJCQkJCXN0YXRlLT5iYXNlLmNvbXBhcmV0dXAs CisJCQkJCQkJCXN0YXRlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmFkaXhfc29y dF90dXBsZShwYXJ0aXRpb25fYmVnaW4sCisJCQkJCQkJCQkgbnVtX2VsZW1lbnRzLAorCQkJCQkJ CQkJIGxldmVsICsgMSwKKwkJCQkJCQkJCSBzdGF0ZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBp ZiAoc3RhdGUtPmJhc2Uub25seUtleSA9PSBOVUxMKQorCQkJeworCQkJCS8qCisJCQkJICogV2Un dmUgZmluaXNoZWQgcmFkaXggc29ydCBvbiBhbGwgYnl0ZXMgb2YgdGhlIHBhc3MtYnktdmFsdWUK KwkJCQkgKiBkYXR1bSAocG9zc2libHkgYWJicmV2aWF0ZWQpLCBub3cgc29ydCB1c2luZyB0aGUg dGllYnJlYWsKKwkJCQkgKiBjb21wYXJhdG9yLgorCQkJCSAqLworCQkJCXFzb3J0X3R1cGxlKHBh cnRpdGlvbl9iZWdpbiwKKwkJCQkJCQludW1fZWxlbWVudHMsCisJCQkJCQkJc3RhdGUtPmJhc2Uu Y29tcGFyZXR1cF90aWVicmVhaywKKwkJCQkJCQlzdGF0ZSk7CisJCQl9CisJCX0KKworCQlzdGFy dF9vZmZzZXQgPSBlbmRfb2Zmc2V0OworCQlwYXJ0aXRpb25fYmVnaW4gPSBwYXJ0aXRpb25fZW5k OworCX0KK30KKworLyoKKyAqIFNvcnQgdHVwbGVzIGhhdmluZyBhIHBhc3MtYnktdmFsdWUgRGF0 dW0gaW4gZGF0dW0xCisgKgorICogUGFydGl0aW9uIHR1cGxlcyBieSBOVUxMIGFuZCBOT1QgTlVM TCBmaXJzdCBzb3J0IGtleS4KKyAqIFRoZW4gZGlzcGF0Y2ggdG8gZWl0aGVyIHJhZGl4IHNvcnQg b3IgcXVpY2tzb3J0LgorICovCitzdGF0aWMgdm9pZAorc29ydF9ieXZhbHVlX2RhdHVtKFNvcnRU dXBsZSAqZGF0YSwgc2l6ZV90IG4sIFR1cGxlc29ydHN0YXRlICpzdGF0ZSkKK3sKKwlib29sCQlu dWxsc19maXJzdCA9IHN0YXRlLT5iYXNlLnNvcnRLZXlzWzBdLnNzdXBfbnVsbHNfZmlyc3Q7CisJ U29ydFR1cGxlICAqbnVsbF9zdGFydDsKKwlTb3J0VHVwbGUgICpub3RfbnVsbF9zdGFydDsKKwlz aXplX3QJCWQxID0gMCwKKwkJCQlkMiwKKwkJCQludWxsX2NvdW50LAorCQkJCW5vdF9udWxsX2Nv dW50OworCWJvb2wJCXByZXNvcnRlZCA9IHRydWU7CisKKwkvKiBwcmVzb3J0ZWQgY2hlY2sgKi8K Kwlmb3IgKFNvcnRUdXBsZSAqc3QgPSBkYXRhICsgMTsgc3QgPCBkYXRhICsgbjsgc3QrKykKKwl7 CisJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CisKKwkJaWYgKENPTVBBUkVUVVAoc3RhdGUsIHN0 IC0gMSwgc3QpID4gMCkKKwkJeworCQkJcHJlc29ydGVkID0gZmFsc2U7CisJCQlicmVhazsKKwkJ fQorCX0KKwlpZiAocHJlc29ydGVkKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFBhcnRpdGlvbiBi eSBOVUxMLW5lc3Mgb2YgdGhlIGxlYWRpbmcgc29ydCBrZXksIHNpbmNlIHdlIGNhbiBvbmx5IHJh ZGl4CisJICogc29ydCBvbiBOT1QgTlVMTCBwYXNzLWJ5LXZhbHVlIGRhdHVtcy4KKwkgKi8KKwor CS8qCisJICogRmluZCB0aGUgZmlyc3QgTk9UIE5VTEwgaWYgTlVMTFMgRklSU1QsIG9yIGZpcnN0 IE5VTEwgaWYgTlVMTFMgTEFTVC4KKwkgKiBUaGlzIGFsc28gc2VydmVzIGFzIGEgcXVpY2sgY2hl Y2sgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBhbGwgdHVwbGVzCisJICogYXJlIE5PVCBOVUxM IGluIHRoZSBmaXJzdCBzb3J0IGtleS4KKwkgKi8KKwl3aGlsZSAoZDEgPCBuICYmIGRhdGFbZDFd LmlzbnVsbDEgPT0gbnVsbHNfZmlyc3QpCisJeworCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOwor CQlkMSsrOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBtb3JlIHRoYW4gb25lIHR1cGxlIGxl ZnQgYWZ0ZXIgdGhlIHF1aWNrIGNoZWNrLCBwYXJ0aXRpb24KKwkgKiB0aGUgcmVtYWluZGVyIHVz aW5nIGJyYW5jaGxlc3MgY3ljbGljIHBlcm11dGF0aW9uLCBiYXNlZCBvbgorCSAqIGh0dHBzOi8v b3JscC5uZXQvYmxvZy9icmFuY2hsZXNzLWxvbXV0by1wYXJ0aXRpb25pbmcvCisJICovCisJQXNz ZXJ0KG4gPiAwKTsKKwlpZiAoZDEgPCBuIC0gMSkKKwl7CisJCXNpemVfdAkJaSA9IGQxLAorCQkJ CQlqID0gZDE7CisJCVNvcnRUdXBsZQl0bXAgPSBkYXRhW2QxXTsgLyogY3JlYXRlIGdhcCBhdCBm cm9udCAqLworCisJCXdoaWxlIChqIDwgbiAtIDEpCisJCXsKKwkJCUNIRUNLX0ZPUl9JTlRFUlJV UFRTKCk7CisKKwkJCS8qIGdhcCBpcyBhdCBqLCBtb3ZlIGkncyBlbGVtZW50IHRvIGdhcCAqLwor CQkJZGF0YVtqXSA9IGRhdGFbaV07CisJCQkvKiBhZHZhbmNlIGogdG8gdGhlIGZpcnN0IHVua25v d24gZWxlbWVudCAqLworCQkJaiArPSAxOworCQkJLyogbW92ZSB0aGUgZmlyc3QgdW5rbm93biBl bGVtZW50IGJhY2sgdG8gaSAqLworCQkJZGF0YVtpXSA9IGRhdGFbal07CisJCQkvKiBhZHZhbmNl IGkgaWYgdGhpcyBlbGVtZW50IGJlbG9uZ3MgaW4gdGhlIGxlZnQgcGFydGl0aW9uICovCisJCQlp ICs9IChkYXRhW2ldLmlzbnVsbDEgPT0gbnVsbHNfZmlyc3QpOworCQl9CisKKwkJLyogcGxhY2Ug Z2FwIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQgcGFydGl0aW9ucyAqLworCQlkYXRhW2pdID0gZGF0 YVtpXTsKKwkJLyogcmVzdG9yZSB0aGUgc2F2ZWQgZWxlbWVudCAqLworCQlkYXRhW2ldID0gdG1w OworCQkvKiBhc3NpZ24gaXQgdG8gdGhlIGNvcnJlY3QgcGFydGl0aW9uICovCisJCWkgKz0gKGRh dGFbaV0uaXNudWxsMSA9PSBudWxsc19maXJzdCk7CisKKwkJLyogZDEgaXMgbm93IHRoZSBudW1i ZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxlZnQgcGFydGl0aW9uICovCisJCWQxID0gaTsKKwl9CisK KwlkMiA9IG4gLSBkMTsKKworCS8qIHNldCBwb2ludGVycyBhbmQgY291bnRzIGZvciBlYWNoIHBh cnRpdGlvbiAqLworCWlmIChudWxsc19maXJzdCkKKwl7CisJCW51bGxfc3RhcnQgPSBzdGF0ZS0+ bWVtdHVwbGVzOworCQludWxsX2NvdW50ID0gZDE7CisJCW5vdF9udWxsX3N0YXJ0ID0gc3RhdGUt Pm1lbXR1cGxlcyArIGQxOworCQlub3RfbnVsbF9jb3VudCA9IGQyOworCX0KKwllbHNlCisJewor CQlub3RfbnVsbF9zdGFydCA9IHN0YXRlLT5tZW10dXBsZXM7CisJCW5vdF9udWxsX2NvdW50ID0g ZDE7CisJCW51bGxfc3RhcnQgPSBzdGF0ZS0+bWVtdHVwbGVzICsgZDE7CisJCW51bGxfY291bnQg PSBkMjsKKwl9CisKKwlmb3IgKFNvcnRUdXBsZSAqc3QgPSBudWxsX3N0YXJ0OworCQkgc3QgPCBu dWxsX3N0YXJ0ICsgbnVsbF9jb3VudDsKKwkJIHN0KyspCisJCUFzc2VydChzdC0+aXNudWxsMSA9 PSB0cnVlKTsKKwlmb3IgKFNvcnRUdXBsZSAqc3QgPSBub3RfbnVsbF9zdGFydDsKKwkJIHN0IDwg bm90X251bGxfc3RhcnQgKyBub3RfbnVsbF9jb3VudDsKKwkJIHN0KyspCisJCUFzc2VydChzdC0+ aXNudWxsMSA9PSBmYWxzZSk7CisKKwkvKgorCSAqIFNvcnQgdGhlIE5VTEwgcGFydGl0aW9uIHVz aW5nIHRpZWJyZWFrIGNvbXBhcmF0b3IsIGlmIG5lY2Vzc2FyeS4gVGhpcworCSAqIHdpbGwgcmVw ZWF0IHRoZSBjb21wYXJpc29uIG9uIGlzbnVsbDEgaWYgdGhlIGZpcnN0IHNvcnQga2V5IHdhcwor CSAqIGFiYnJldmlhdGVkLCBidXQgaXQncyBub3Qgd29ydGggYWRkaW5nIGNvbXBsZXhpdHkgdG8g YXZvaWQgdGhhdC4KKwkgKi8KKwlpZiAoc3RhdGUtPmJhc2Uub25seUtleSA9PSBOVUxMICYmIG51 bGxfY291bnQgPiAxKQorCXsKKwkJcXNvcnRfdHVwbGUobnVsbF9zdGFydCwKKwkJCQkJbnVsbF9j b3VudCwKKwkJCQkJc3RhdGUtPmJhc2UuY29tcGFyZXR1cF90aWVicmVhaywKKwkJCQkJc3RhdGUp OworCX0KKworCS8qCisJICogU29ydCB0aGUgTk9UIE5VTEwgcGFydGl0aW9uLCB1c2luZyByYWRp eCBzb3J0IGlmIGxhcmdlIGVub3VnaCwKKwkgKiBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHF1aWNr c29ydC4KKwkgKi8KKwlpZiAobm90X251bGxfY291bnQgPCBRU09SVF9USFJFU0hPTEQpCisJewor CQlxc29ydF90dXBsZShub3RfbnVsbF9zdGFydCwKKwkJCQkJbm90X251bGxfY291bnQsCisJCQkJ CXN0YXRlLT5iYXNlLmNvbXBhcmV0dXAsCisJCQkJCXN0YXRlKTsKKwl9CisJZWxzZQorCXsKKwkJ cmFkaXhfc29ydF90dXBsZShub3RfbnVsbF9zdGFydCwKKwkJCQkJCSBub3RfbnVsbF9jb3VudCwK KwkJCQkJCSAwLAorCQkJCQkJIHN0YXRlKTsKKwl9Cit9CisKKy8qIFZlcmlmeSBpbi1tZW1vcnkg c29ydCB1c2luZyBzdGFuZGFyZCBjb21wYXJhdG9yLiAqLworc3RhdGljIHZvaWQKK3ZlcmlmeV9t ZW10dXBsZXNfc29ydGVkKFR1cGxlc29ydHN0YXRlICpzdGF0ZSkKK3sKKyNpZmRlZiBVU0VfQVNT RVJUX0NIRUNLSU5HCisJZm9yIChTb3J0VHVwbGUgKnN0ID0gc3RhdGUtPm1lbXR1cGxlcyArIDE7 CisJCSBzdCA8IHN0YXRlLT5tZW10dXBsZXMgKyBzdGF0ZS0+bWVtdHVwY291bnQ7CisJCSBzdCsr KQorCQlBc3NlcnQoQ09NUEFSRVRVUChzdGF0ZSwgc3QgLSAxLCBzdCkgPD0gMCk7CisjZW5kaWYK K30KKworLyoKKyAqIFNvcnQgYWxsIG1lbXR1cGxlcyB1c2luZyBzcGVjaWFsaXplZCByb3V0aW5l cy4KICAqCi0gKiBRdWlja3NvcnQgaXMgdXNlZCBmb3Igc21hbGwgaW4tbWVtb3J5IHNvcnRzLCBh bmQgZXh0ZXJuYWwgc29ydCBydW5zLgorICogUXVpY2tzb3J0IG9yIHJhZGl4IHNvcnQgaXMgdXNl ZCBmb3Igc21hbGwgaW4tbWVtb3J5IHNvcnRzLAorICogYW5kIGV4dGVybmFsIHNvcnQgcnVucy4K ICAqLwogc3RhdGljIHZvaWQKIHR1cGxlc29ydF9zb3J0X21lbXR1cGxlcyhUdXBsZXNvcnRzdGF0 ZSAqc3RhdGUpCkBAIC0yNjY1LDMwICsyOTYxLDIyIEBAIHR1cGxlc29ydF9zb3J0X21lbXR1cGxl cyhUdXBsZXNvcnRzdGF0ZSAqc3RhdGUpCiAJaWYgKHN0YXRlLT5tZW10dXBjb3VudCA+IDEpCiAJ ewogCQkvKgotCQkgKiBEbyB3ZSBoYXZlIHRoZSBsZWFkaW5nIGNvbHVtbidzIHZhbHVlIG9yIGFi YnJldmlhdGlvbiBpbiBkYXR1bTEsCi0JCSAqIGFuZCBpcyB0aGVyZSBhIHNwZWNpYWxpemF0aW9u IGZvciBpdHMgY29tcGFyYXRvcj8KKwkJICogRG8gd2UgaGF2ZSB0aGUgbGVhZGluZyBjb2x1bW4n cyB2YWx1ZSBvciBhYmJyZXZpYXRpb24gaW4gZGF0dW0xPwogCQkgKi8KIAkJaWYgKHN0YXRlLT5i YXNlLmhhdmVEYXR1bTEgJiYgc3RhdGUtPmJhc2Uuc29ydEtleXMpCiAJCXsKLQkJCWlmIChzdGF0 ZS0+YmFzZS5zb3J0S2V5c1swXS5jb21wYXJhdG9yID09IHNzdXBfZGF0dW1fdW5zaWduZWRfY21w KQotCQkJewotCQkJCXFzb3J0X3R1cGxlX3Vuc2lnbmVkKHN0YXRlLT5tZW10dXBsZXMsCi0JCQkJ CQkJCQkgc3RhdGUtPm1lbXR1cGNvdW50LAotCQkJCQkJCQkJIHN0YXRlKTsKLQkJCQlyZXR1cm47 Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZS0+YmFzZS5zb3J0S2V5c1swXS5jb21wYXJhdG9yID09 IHNzdXBfZGF0dW1fc2lnbmVkX2NtcCkKKwkJCVNvcnRTdXBwb3J0RGF0YSBzc3VwID0gc3RhdGUt PmJhc2Uuc29ydEtleXNbMF07CisKKwkJCS8qIERvZXMgaXQgY29tcGFyZSBhcyBhbiBpbnRlZ2Vy PyAqLworCQkJaWYgKHN0YXRlLT5tZW10dXBjb3VudCA+PSBRU09SVF9USFJFU0hPTEQgJiYKKwkJ CQkoc3N1cC5jb21wYXJhdG9yID09IHNzdXBfZGF0dW1fdW5zaWduZWRfY21wIHx8CisJCQkJIHNz dXAuY29tcGFyYXRvciA9PSBzc3VwX2RhdHVtX3NpZ25lZF9jbXAgfHwKKwkJCQkgc3N1cC5jb21w YXJhdG9yID09IHNzdXBfZGF0dW1faW50MzJfY21wKSkKIAkJCXsKLQkJCQlxc29ydF90dXBsZV9z aWduZWQoc3RhdGUtPm1lbXR1cGxlcywKKwkJCQlzb3J0X2J5dmFsdWVfZGF0dW0oc3RhdGUtPm1l bXR1cGxlcywKIAkJCQkJCQkJICAgc3RhdGUtPm1lbXR1cGNvdW50LAogCQkJCQkJCQkgICBzdGF0 ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSBpZiAoc3RhdGUtPmJhc2Uuc29ydEtleXNb MF0uY29tcGFyYXRvciA9PSBzc3VwX2RhdHVtX2ludDMyX2NtcCkKLQkJCXsKLQkJCQlxc29ydF90 dXBsZV9pbnQzMihzdGF0ZS0+bWVtdHVwbGVzLAotCQkJCQkJCQkgIHN0YXRlLT5tZW10dXBjb3Vu dCwKLQkJCQkJCQkJICBzdGF0ZSk7CisJCQkJdmVyaWZ5X21lbXR1cGxlc19zb3J0ZWQoc3RhdGUp OwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMv c29ydHN1cHBvcnQuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL3NvcnRzdXBwb3J0LmgKaW5kZXggMDA4 Mzc1NmJiZGIuLmE4ZjhmOWYwMjZhIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9zb3J0 c3VwcG9ydC5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL3NvcnRzdXBwb3J0LmgKQEAgLTIyOSwx MDcgKzIyOSw2IEBAIEFwcGx5U29ydENvbXBhcmF0b3IoRGF0dW0gZGF0dW0xLCBib29sIGlzTnVs bDEsCiAJcmV0dXJuIGNvbXBhcmU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1BcHBseVVuc2ln bmVkU29ydENvbXBhcmF0b3IoRGF0dW0gZGF0dW0xLCBib29sIGlzTnVsbDEsCi0JCQkJCQkJRGF0 dW0gZGF0dW0yLCBib29sIGlzTnVsbDIsCi0JCQkJCQkJU29ydFN1cHBvcnQgc3N1cCkKLXsKLQlp bnQJCQljb21wYXJlOwotCi0JaWYgKGlzTnVsbDEpCi0JewotCQlpZiAoaXNOdWxsMikKLQkJCWNv bXBhcmUgPSAwOwkJLyogTlVMTCAiPSIgTlVMTCAqLwotCQllbHNlIGlmIChzc3VwLT5zc3VwX251 bGxzX2ZpcnN0KQotCQkJY29tcGFyZSA9IC0xOwkJLyogTlVMTCAiPCIgTk9UX05VTEwgKi8KLQkJ ZWxzZQotCQkJY29tcGFyZSA9IDE7CQkvKiBOVUxMICI+IiBOT1RfTlVMTCAqLwotCX0KLQllbHNl IGlmIChpc051bGwyKQotCXsKLQkJaWYgKHNzdXAtPnNzdXBfbnVsbHNfZmlyc3QpCi0JCQljb21w YXJlID0gMTsJCS8qIE5PVF9OVUxMICI+IiBOVUxMICovCi0JCWVsc2UKLQkJCWNvbXBhcmUgPSAt MTsJCS8qIE5PVF9OVUxMICI8IiBOVUxMICovCi0JfQotCWVsc2UKLQl7Ci0JCWNvbXBhcmUgPSBk YXR1bTEgPCBkYXR1bTIgPyAtMSA6IGRhdHVtMSA+IGRhdHVtMiA/IDEgOiAwOwotCQlpZiAoc3N1 cC0+c3N1cF9yZXZlcnNlKQotCQkJSU5WRVJUX0NPTVBBUkVfUkVTVUxUKGNvbXBhcmUpOwotCX0K LQotCXJldHVybiBjb21wYXJlOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotQXBwbHlTaWduZWRT b3J0Q29tcGFyYXRvcihEYXR1bSBkYXR1bTEsIGJvb2wgaXNOdWxsMSwKLQkJCQkJCSAgRGF0dW0g ZGF0dW0yLCBib29sIGlzTnVsbDIsCi0JCQkJCQkgIFNvcnRTdXBwb3J0IHNzdXApCi17Ci0JaW50 CQkJY29tcGFyZTsKLQotCWlmIChpc051bGwxKQotCXsKLQkJaWYgKGlzTnVsbDIpCi0JCQljb21w YXJlID0gMDsJCS8qIE5VTEwgIj0iIE5VTEwgKi8KLQkJZWxzZSBpZiAoc3N1cC0+c3N1cF9udWxs c19maXJzdCkKLQkJCWNvbXBhcmUgPSAtMTsJCS8qIE5VTEwgIjwiIE5PVF9OVUxMICovCi0JCWVs c2UKLQkJCWNvbXBhcmUgPSAxOwkJLyogTlVMTCAiPiIgTk9UX05VTEwgKi8KLQl9Ci0JZWxzZSBp ZiAoaXNOdWxsMikKLQl7Ci0JCWlmIChzc3VwLT5zc3VwX251bGxzX2ZpcnN0KQotCQkJY29tcGFy ZSA9IDE7CQkvKiBOT1RfTlVMTCAiPiIgTlVMTCAqLwotCQllbHNlCi0JCQljb21wYXJlID0gLTE7 CQkvKiBOT1RfTlVMTCAiPCIgTlVMTCAqLwotCX0KLQllbHNlCi0JewotCQljb21wYXJlID0gRGF0 dW1HZXRJbnQ2NChkYXR1bTEpIDwgRGF0dW1HZXRJbnQ2NChkYXR1bTIpID8gLTEgOgotCQkJRGF0 dW1HZXRJbnQ2NChkYXR1bTEpID4gRGF0dW1HZXRJbnQ2NChkYXR1bTIpID8gMSA6IDA7Ci0JCWlm IChzc3VwLT5zc3VwX3JldmVyc2UpCi0JCQlJTlZFUlRfQ09NUEFSRV9SRVNVTFQoY29tcGFyZSk7 Ci0JfQotCi0JcmV0dXJuIGNvbXBhcmU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1BcHBseUlu dDMyU29ydENvbXBhcmF0b3IoRGF0dW0gZGF0dW0xLCBib29sIGlzTnVsbDEsCi0JCQkJCQkgRGF0 dW0gZGF0dW0yLCBib29sIGlzTnVsbDIsCi0JCQkJCQkgU29ydFN1cHBvcnQgc3N1cCkKLXsKLQlp bnQJCQljb21wYXJlOwotCi0JaWYgKGlzTnVsbDEpCi0JewotCQlpZiAoaXNOdWxsMikKLQkJCWNv bXBhcmUgPSAwOwkJLyogTlVMTCAiPSIgTlVMTCAqLwotCQllbHNlIGlmIChzc3VwLT5zc3VwX251 bGxzX2ZpcnN0KQotCQkJY29tcGFyZSA9IC0xOwkJLyogTlVMTCAiPCIgTk9UX05VTEwgKi8KLQkJ ZWxzZQotCQkJY29tcGFyZSA9IDE7CQkvKiBOVUxMICI+IiBOT1RfTlVMTCAqLwotCX0KLQllbHNl IGlmIChpc051bGwyKQotCXsKLQkJaWYgKHNzdXAtPnNzdXBfbnVsbHNfZmlyc3QpCi0JCQljb21w YXJlID0gMTsJCS8qIE5PVF9OVUxMICI+IiBOVUxMICovCi0JCWVsc2UKLQkJCWNvbXBhcmUgPSAt MTsJCS8qIE5PVF9OVUxMICI8IiBOVUxMICovCi0JfQotCWVsc2UKLQl7Ci0JCWNvbXBhcmUgPSBE YXR1bUdldEludDMyKGRhdHVtMSkgPCBEYXR1bUdldEludDMyKGRhdHVtMikgPyAtMSA6Ci0JCQlE YXR1bUdldEludDMyKGRhdHVtMSkgPiBEYXR1bUdldEludDMyKGRhdHVtMikgPyAxIDogMDsKLQkJ aWYgKHNzdXAtPnNzdXBfcmV2ZXJzZSkKLQkJCUlOVkVSVF9DT01QQVJFX1JFU1VMVChjb21wYXJl KTsKLQl9Ci0KLQlyZXR1cm4gY29tcGFyZTsKLX0KLQogLyoKICAqIEFwcGx5IGEgc29ydCBjb21w YXJhdG9yIGZ1bmN0aW9uIGFuZCByZXR1cm4gYSAzLXdheSBjb21wYXJpc29uIHVzaW5nIGZ1bGws CiAgKiBhdXRob3JpdGF0aXZlIGNvbXBhcmF0b3IuICBUaGlzIHRha2VzIGNhcmUgb2YgaGFuZGxp bmcgcmV2ZXJzZS1zb3J0IGFuZApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMvdHVwbGVz b3J0LmggYi9zcmMvaW5jbHVkZS91dGlscy90dXBsZXNvcnQuaAppbmRleCA1ZmUyMjllMjExYi4u ZGE2OGY0NWFjZjIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL3R1cGxlc29ydC5oCisr KyBiL3NyYy9pbmNsdWRlL3V0aWxzL3R1cGxlc29ydC5oCkBAIC0xMTYsNiArMTE2LDcgQEAgdHlw ZWRlZiBzdHJ1Y3QKIAl2b2lkCSAgICp0dXBsZTsJCQkvKiB0aGUgdHVwbGUgaXRzZWxmICovCiAJ RGF0dW0JCWRhdHVtMTsJCQkvKiB2YWx1ZSBvZiBmaXJzdCBrZXkgY29sdW1uICovCiAJYm9vbAkJ aXNudWxsMTsJCS8qIGlzIGZpcnN0IGtleSBjb2x1bW4gTlVMTD8gKi8KKwl1aW50OAkJY3VyYnl0 ZTsJCS8qIGNodW5rIG9mIGRhdHVtMSBmb3IgY3VycmVudCByYWRpeCBzb3J0IHBhc3MgKi8KIAlp bnQJCQlzcmN0YXBlOwkJLyogc291cmNlIHRhcGUgbnVtYmVyICovCiB9IFNvcnRUdXBsZTsKIApk aWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC90dXBsZXNvcnQub3V0IGIvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC90dXBsZXNvcnQub3V0CmluZGV4IDZkZDk3ZTc0MjdhLi5m YzEzMjFiZjQ0MyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC90dXBsZXNv cnQub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdHVwbGVzb3J0Lm91dApAQCAt MzA0LDkgKzMwNCw5IEBAIEZST00gYWJicmV2X2Fib3J0X3V1aWRzCiBPUkRFUiBCWSBjdGlkIERF U0MgTElNSVQgNTsKICAgaWQgICB8ICAgICAgICAgICBhYm9ydF9pbmNyZWFzaW5nICAgICAgICAg ICB8ICAgICAgICAgICBhYm9ydF9kZWNyZWFzaW5nICAgICAgICAgICB8ICAgICAgICAgIG5vYWJv cnRfaW5jcmVhc2luZyAgICAgICAgICB8ICAgICAgICAgIG5vYWJvcnRfZGVjcmVhc2luZyAgICAg ICAgICAKIC0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K LSAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8IAogIDIwMDAyIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgCiAgMjAwMDMgfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAKKyAgICAgMCB8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IAog IDEwMDA5IHwgMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDEwMDA4IHwgMDAwMDAwMDAt MDAwMC0wMDAwLTAwMDAtMDAwMDAwMDA5OTkyIHwgMDAwMTAwMDgtMDAwMC0wMDAwLTAwMDAtMDAw MDAwMDEwMDA4IHwgMDAwMDk5OTItMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDA5OTkyCiAgMTAwMDgg fCAwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMTAwMDcgfCAwMDAwMDAwMC0wMDAwLTAw MDAtMDAwMC0wMDAwMDAwMDk5OTMgfCAwMDAxMDAwNy0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMTAw MDcgfCAwMDAwOTk5My0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDk5OTMKICg1IHJvd3MpCkBAIC0z MzUsOSArMzM1LDkgQEAgRlJPTSBhYmJyZXZfYWJvcnRfdXVpZHMKIE9SREVSIEJZIGN0aWQgREVT QyBMSU1JVCA1OwogICBpZCAgIHwgICAgICAgICAgIGFib3J0X2luY3JlYXNpbmcgICAgICAgICAg IHwgICAgICAgICAgIGFib3J0X2RlY3JlYXNpbmcgICAgICAgICAgIHwgICAgICAgICAgbm9hYm9y dF9pbmNyZWFzaW5nICAgICAgICAgIHwgICAgICAgICAgbm9hYm9ydF9kZWNyZWFzaW5nICAgICAg ICAgIAogLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot ICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgCi0gMjAwMDMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAKICAyMDAwMiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IAorIDIwMDAzIHwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgCisg ICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAKICAgOTk5MyB8IDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwOTk5 MiB8IDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAxMDAwOCB8IDAwMDA5OTkyLTAwMDAt MDAwMC0wMDAwLTAwMDAwMDAwOTk5MiB8IDAwMDEwMDA4LTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAx MDAwOAogICA5OTk0IHwgMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDA5OTkzIHwgMDAw MDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDEwMDA3IHwgMDAwMDk5OTMtMDAwMC0wMDAwLTAw MDAtMDAwMDAwMDA5OTkzIHwgMDAwMTAwMDctMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDEwMDA3CiAo NSByb3dzKQpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgYi9z cmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdAppbmRleCA5ZjVlZThmZDQ4Mi4uNGU0OTRi ZGM4NjAgMTAwNjQ0Ci0tLSBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBi L3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CkBAIC00MDU4LDYgKzQwNTgsNyBAQCBx c29ydF9jb21wYXJhdG9yCiBxdWVyeV9wYXRoa2V5c19jYWxsYmFjawogcmFkaXVzX2F0dHJpYnV0 ZQogcmFkaXVzX3BhY2tldAorUmFkaXhTb3J0SW5mbwogcmFuZ2VUYWJsZUVudHJ5X3VzZWRfY29u dGV4dAogcmFua19jb250ZXh0CiByYnRfYWxsb2NmdW5jCi0tIAoyLjUzLjAKCg== --000000000000e4290c064a785df6 Content-Type: text/x-patch; charset="US-ASCII"; name="v7-0004-WIP-Call-verify_memtuples_sorted-after-qsort-for-.patch" Content-Disposition: attachment; filename="v7-0004-WIP-Call-verify_memtuples_sorted-after-qsort-for-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlgn3cs33 RnJvbSA4NzI4MTk2NzNjZmQ4NTE1M2NjNWUzYjg0ODIzMjFhNmRmYjk4ZjMyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKb2huIE5heWxvciA8am9obi5uYXlsb3JAcG9zdGdyZXNxbC5v cmc+CkRhdGU6IFR1ZSwgMTAgRmViIDIwMjYgMTk6MTA6MjAgKzA3MDAKU3ViamVjdDogW1BBVENI IHY3IDQvNF0gV0lQIENhbGwgdmVyaWZ5X21lbXR1cGxlc19zb3J0ZWQoKSBhZnRlciBxc29ydCBm b3IKIGNvbnNpc3RlbmN5CgpUaGUgcmVncmVzc2lvbiB0ZXN0IGNoYW5nZXMgYXJlIGZyb20gYSB1 c2VyIGRlZmluZWQgZnVuY3Rpb24gdGhhdAppcyBub3cgY2FsbGVkIGEgY291cGxlIG1vcmUgdGlt ZXMuCi0tLQogc3JjL2JhY2tlbmQvdXRpbHMvc29ydC90dXBsZXNvcnQuYyAgICAgIHwgMSArCiBz cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL25hbWVzcGFjZS5vdXQgfCAyICsrCiAyIGZpbGVzIGNo YW5nZWQsIDMgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL3Nv cnQvdHVwbGVzb3J0LmMgYi9zcmMvYmFja2VuZC91dGlscy9zb3J0L3R1cGxlc29ydC5jCmluZGV4 IGRlYjAyZWI1ZWU1Li40YmI3YmNmNzgxNCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMv c29ydC90dXBsZXNvcnQuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9zb3J0L3R1cGxlc29ydC5j CkBAIC0zMDUyLDYgKzMwNTIsNyBAQCB0dXBsZXNvcnRfc29ydF9tZW10dXBsZXMoVHVwbGVzb3J0 c3RhdGUgKnN0YXRlKQogCQkJCQkJc3RhdGUtPmJhc2UuY29tcGFyZXR1cCwKIAkJCQkJCXN0YXRl KTsKIAkJfQorCQl2ZXJpZnlfbWVtdHVwbGVzX3NvcnRlZChzdGF0ZSk7CiAJfQogfQogCmRpZmYg LS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL25hbWVzcGFjZS5vdXQgYi9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL25hbWVzcGFjZS5vdXQKaW5kZXggZGJiZGE3MmQzOTUuLmI3OGFi ZGYyMWVhIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL25hbWVzcGFjZS5v dXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9uYW1lc3BhY2Uub3V0CkBAIC0xNDks NiArMTQ5LDggQEAgTk9USUNFOiAgY3VycmVudCBzZWFyY2hfcGF0aDogcGdfY2F0YWxvZywgcGdf dGVtcAogTk9USUNFOiAgY3VycmVudCBzZWFyY2hfcGF0aDogcGdfY2F0YWxvZywgcGdfdGVtcAog Tk9USUNFOiAgY3VycmVudCBzZWFyY2hfcGF0aDogcGdfY2F0YWxvZywgcGdfdGVtcAogTk9USUNF OiAgY3VycmVudCBzZWFyY2hfcGF0aDogcGdfY2F0YWxvZywgcGdfdGVtcAorTk9USUNFOiAgY3Vy cmVudCBzZWFyY2hfcGF0aDogcGdfY2F0YWxvZywgcGdfdGVtcAorTk9USUNFOiAgY3VycmVudCBz ZWFyY2hfcGF0aDogcGdfY2F0YWxvZywgcGdfdGVtcAogUkVGUkVTSCBNQVRFUklBTElaRUQgVklF VyB0ZXN0X21haW50X3NlYXJjaF9wYXRoLnRlc3RfbWFpbnRfbXY7CiBOT1RJQ0U6ICBjdXJyZW50 IHNlYXJjaF9wYXRoOiBwZ19jYXRhbG9nLCBwZ190ZW1wCiBOT1RJQ0U6ICBjdXJyZW50IHNlYXJj aF9wYXRoOiBwZ19jYXRhbG9nLCBwZ190ZW1wCi0tIAoyLjUzLjAKCg== --000000000000e4290c064a785df6 Content-Type: text/x-patch; charset="US-ASCII"; name="v7-0003-WIP-Add-possible-message-changes.patch" Content-Disposition: attachment; filename="v7-0003-WIP-Add-possible-message-changes.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlgn3crv2 RnJvbSA3ZjJlOTVjYTQ4M2NlMzRlMjZmMjJkOWJmNDY2Y2NmOWY0MTgyMjQxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKb2huIE5heWxvciA8am9obi5uYXlsb3JAcG9zdGdyZXNxbC5v cmc+CkRhdGU6IFR1ZSwgMTAgRmViIDIwMjYgMjA6MDI6MTkgKzA3MDAKU3ViamVjdDogW1BBVENI IHY3IDMvNF0gV0lQIEFkZCBwb3NzaWJsZSBtZXNzYWdlIGNoYW5nZXMKCk5vdCBzdXJlIGlmIG5l Y2Vzc2FyeSBzbyBrZXB0IG91dCBvZiBtYWluIGNvbW1pdAotLS0KIHNyYy9iYWNrZW5kL3V0aWxz L3NvcnQvdHVwbGVzb3J0LmMgfCA0ICsrLS0KIDEgZmlsZSBjaGFuZ2VkLCAyIGluc2VydGlvbnMo KyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvc29ydC90 dXBsZXNvcnQuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzb3J0LmMKaW5kZXggN2Iy MjU0NmE4MTEuLmRlYjAyZWI1ZWU1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9zb3J0 L3R1cGxlc29ydC5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzb3J0LmMKQEAg LTIyNDMsNyArMjI0Myw3IEBAIGR1bXB0dXBsZXMoVHVwbGVzb3J0c3RhdGUgKnN0YXRlLCBib29s IGFsbHR1cGxlcykKIAlzdGF0ZS0+Y3VycmVudFJ1bisrOwogCiAJaWYgKHRyYWNlX3NvcnQpCi0J CWVsb2coTE9HLCAid29ya2VyICVkIHN0YXJ0aW5nIHF1aWNrc29ydCBvZiBydW4gJWQ6ICVzIiwK KwkJZWxvZyhMT0csICJ3b3JrZXIgJWQgc3RhcnRpbmcgaW50ZXJuYWwgc29ydCBvZiBydW4gJWQ6 ICVzIiwKIAkJCSBzdGF0ZS0+d29ya2VyLCBzdGF0ZS0+Y3VycmVudFJ1biwKIAkJCSBwZ19ydXNh Z2Vfc2hvdygmc3RhdGUtPnJ1X3N0YXJ0KSk7CiAKQEAgLTIyNTQsNyArMjI1NCw3IEBAIGR1bXB0 dXBsZXMoVHVwbGVzb3J0c3RhdGUgKnN0YXRlLCBib29sIGFsbHR1cGxlcykKIAl0dXBsZXNvcnRf c29ydF9tZW10dXBsZXMoc3RhdGUpOwogCiAJaWYgKHRyYWNlX3NvcnQpCi0JCWVsb2coTE9HLCAi d29ya2VyICVkIGZpbmlzaGVkIHF1aWNrc29ydCBvZiBydW4gJWQ6ICVzIiwKKwkJZWxvZyhMT0cs ICJ3b3JrZXIgJWQgZmluaXNoZWQgaW50ZXJuYWwgc29ydCBvZiBydW4gJWQ6ICVzIiwKIAkJCSBz dGF0ZS0+d29ya2VyLCBzdGF0ZS0+Y3VycmVudFJ1biwKIAkJCSBwZ19ydXNhZ2Vfc2hvdygmc3Rh dGUtPnJ1X3N0YXJ0KSk7CiAKLS0gCjIuNTMuMAoK --000000000000e4290c064a785df6--