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 1w5bRi-003Psb-21 for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Mar 2026 03:31:47 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w5bRg-000nKr-2j for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Mar 2026 03:31:45 +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 1w5bRg-000nKg-1O for pgsql-hackers@lists.postgresql.org; Thu, 26 Mar 2026 03:31:44 +0000 Received: from mail-ed1-x536.google.com ([2a00:1450:4864:20::536]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w5bRd-00000001Dld-30il for pgsql-hackers@postgresql.org; Thu, 26 Mar 2026 03:31:44 +0000 Received: by mail-ed1-x536.google.com with SMTP id 4fb4d7f45d1cf-66970715adbso966455a12.3 for ; Wed, 25 Mar 2026 20:31:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774495901; cv=none; d=google.com; s=arc-20240605; b=hPnnuD1NjWqUOE+3eivFZCL71sIge3zgNWF4OgrDJnaVFTL+wRio7E9voyA3bgGrYD LE2/4nmg+KM/D3voOsUVcHg+QwMwT9z60oYMrEXjuVIMn2NcgtBTNqyEMN/hLJkxy14x xUfWjEQ5zrD7GgJU2U4zQozPoNHC340QjGrkvwA0y1y3qnAeowiEgs5SC+5rTp+rVYc4 jD2axcN7aKWQMZacfXvZrPLudD++fH/SRw93BtAyJTkmJbL9I9uDBYuHxdHzpmze1hA/ qGroGqqnST4jwGd8MCwhU4sNsSG0CfGtzOsuJ8y4H3c6yGA5oDUASfcgYC/rR1rKfvss Q3+Q== 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=/r9IEfX/gzRnctSdMlTSzjNsfPMabM9ns0gmAzetzkY=; fh=DuH7LSQ0ZCSE7KAyUJzpP5wBYn0O4Vz9dNx1tn+shww=; b=X9IyIc9Xx2tsZi7mJZ64WTMqtkYy07WmjVohwdq39ZOrVfu09LJ1Xi712E41Fqsw1Q DDjrnhYr+XtnMb0bKLxnGEtZErkB/B0FRKTwogwRmJ560hrS7RJt61HkJJkwJgyXj9sY 59gk6QBsnFByKZQoWd7wFK5k2G6fb/SQRZ8eYrmmI8sUmN9vU+0BOfQg9VOjcTgMzNyd h3AjGAI9Lj+ZdIsFTpJcCMXsUEvQdlEpC0agxyG+D6aCD6yZnhB1kZeAXjxPI5syD8wq OWkrepahzrBAWafLz5dhMlDQb1xM8q0EdoBmSX4Lk998A5iWwf0/gZGJvf6mBt3pgkMm AdIA==; darn=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=20251104; t=1774495901; x=1775100701; 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=/r9IEfX/gzRnctSdMlTSzjNsfPMabM9ns0gmAzetzkY=; b=EkR16qpap3KPNhBR/jb9HjQcNjGS9y9g3B4EWyDDCFxj6jH3QXChUEtThCr3RjKjFG 9t+u2KXg+XKXKd7rZ0hDRm1MED6unC/mFGPKPRG6LbwkmoRIbEVcjtNxypbuVrTP5HEj QyFQFpS0qVVAMQxE4x1i+kB3gHKSXizgLQa24Qe59YcFtgUaegFHHZhRFNU8vFleKdqJ hj0l0Vkbpzd8dX288yuewDKlRPcNOnF5f7kN0VAMvqKhlUt1Rjwwozp5O4eBOb6BRpWB F/HORTIuDAPQOI+jkMr/TVUvBkesHKXia2IevojOWtH5Uzfe2XWqiW1IfsxJ5Z67Pmgu k3dg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774495901; x=1775100701; 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=/r9IEfX/gzRnctSdMlTSzjNsfPMabM9ns0gmAzetzkY=; b=nqELGR+UHV05V/55qzZt4MUj3Mpl+pqzzz3hOTAckcubrhgncHHDg41D8Hj5Db2IBx KClBZ2HsIOm7GE7f6bnJtIB1b+sp6us6f7bPRjw+BhXK2EhpB6K3a+ssSNE+bVBDOGC1 uAxMrG0AdJpzs3AVZKDzKcvGUxmTdYTi7Hbhn/xzprP4I3yB7/H59spBr5x7zTtAotQa /VqQZFSpNUDpCeg2IJ2kbSIId8rnVeS83LJOnEeWmLnCa6FiyYowM7I2KKxrMah7G7gf uX8F1/0ap+f3LEaGaAami7c7mHB922MqGyryJBXREF3Zrzra+EbrFKbNyU4WUVtzJmXI c0LQ== X-Forwarded-Encrypted: i=1; AJvYcCV6Hh7/R2Qx3hb9sOk+M0WJVRZh1/bXiIslsX90FSKd50j0cTcf3cRzhgsLET80nJdNBtRPYedN9yvcnrMV@postgresql.org X-Gm-Message-State: AOJu0Yw61xg5UTiCPw8b6XyhNgASfYMUVhwuoLhErriu1UQM75+YbuVD rxRzooO0+QRFruLGh0geqm+u3de5PUlH89cW6OMoqXNvapWbRPqnXNW7cAZcDd/zHt3KSwIaAfL oniJu68W9FrZ4O9Y7MScH0TcPYSOxLC4++/751Zs= X-Gm-Gg: ATEYQzxh90vEd2S4fkaZ6ph10XaFkrtO1s3ICjORMKLIHBA8ca9T9aqFM3xwTjg8DLe 75x4Xr/nlvCL+ekZKJFkpROeo4lE9jtxc3NfAuQ/NzPlcrTlMSZYTgVTyvwoDChqWMnjxlw8WhK 4E5knx6iwIFylr0THmGJX7ZO/fZ22rdWHf0ZpvzZ9axfkj7lEWh7UadOq9wSF23iaaV1ht7MEmL 2qzqVykNLPviKHEi+F+1V+LHSn+MC4cVA5qddu+/5yI7WAHkeRdtQ6mjXkWPOWtUc7Nj3nQghMS 7Qj8VQ== X-Received: by 2002:a17:907:1c87:b0:b93:6ae4:aa83 with SMTP id a640c23a62f3a-b9a3f1aef56mr414175766b.18.1774495900749; Wed, 25 Mar 2026 20:31:40 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Sami Imseih Date: Wed, 25 Mar 2026 22:31:28 -0500 X-Gm-Features: AQROBzDy_w_QSv0i66dZiakytcHJ8R3QRjy47SY4FNjKU1w5BeQ-orOjs6Xmf7g Message-ID: Subject: Re: Refactor query normalization into core query jumbling To: Lukas Fittl Cc: Michael Paquier , zengman , pgsql-hackers , Julien Rouhaud Content-Type: multipart/mixed; boundary="000000000000d28c37064de50530" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000d28c37064de50530 Content-Type: text/plain; charset="UTF-8" Thanks for looking! > I don't think this is needed anymore, as of > 45762084545ec14dbbe66ace1d69d7e89f8978ac. Correct. That showed up after my last rebase. > > +/* > > + * Callback to generate a normalized version of the query string that will be used to > > + * represent all similar queries. > > + * > > I don't think the term "Callback" makes sense here - I think you could > just keep the original wording. This was a remnant of my earlier experimentation. I removed. A few notes on the comments: - * Note that the normalized representation may well vary depending on - * just which "equivalent" query is used to create the hashtable entry. - * We assume this is OK. This was in the original generate_normalize_query and since it mentions hashtable entry, I moved the comment (in-spirit) to where pg_stat_statements calls GenerateNormailzeQuery * If query_loc > 0, then "query" has been advanced by that much compared to * the original string start, as is the case with multi-statement strings, so * we need to translate the provided locations to compensate. (This lets us * avoid re-scanning statements before the one of interest, so it's worth doing.) * This comment was originally duplicated in both SetConstantLengths, so I just kept it as-is in SetConstantLengths and added a shorter reference in GenerateNormalizeQuery Also, this comment "It is the caller's job to ensure that the string is a valid SQL statement..." made more sense in GenerateNormalizeQuery rather than SetConstantLengths, since GenerateNormalizeQuery is the public function. > In 0002: > You could use palloc_array for locs here. done. > I think we should update the comment here to reflect the fact that > we're no longer modifying JumbleState. done. > Otherwise these patches look good - it'd be nice to still get this > into 19 so we have less code duplication across the different > extensions working with normalized query text. I agree! v6 addresses the comments. -- Sami Imseih Amazon Web Services (AWS) --000000000000d28c37064de50530 Content-Type: application/octet-stream; name="v6-0002-Make-JumbleState-const-in-post_parse_analyze-hook.patch" Content-Disposition: attachment; filename="v6-0002-Make-JumbleState-const-in-post_parse_analyze-hook.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn6x14to0 RnJvbSA1MjhmMTYxMDJlY2I0N2ZiNDQ3ZTQ3MmI0M2I5MDZlM2YzN2IwOWZjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBVYnVudHUgPHVidW50dUBpcC0xNzItMzEtNDYtMjMwLmVjMi5p bnRlcm5hbD4KRGF0ZTogVHVlLCA2IEphbiAyMDI2IDE5OjI5OjAxICswMDAwClN1YmplY3Q6IFtQ QVRDSCB2NiAyLzJdIE1ha2UgSnVtYmxlU3RhdGUgY29uc3QgaW4gcG9zdF9wYXJzZV9hbmFseXpl IGhvb2sKCkNoYW5nZSB0aGUgcG9zdF9wYXJzZV9hbmFseXplX2hvb2tfdHlwZSBzaWduYXR1cmUg dG8gdGFrZSBhIGNvbnN0Ckp1bWJsZVN0YXRlIHBhcmFtZXRlciwgcHJldmVudGluZyBob29rcyBm cm9tIG1vZGlmeWluZyB0aGUganVtYmxlCnN0YXRlIGR1cmluZyBxdWVyeSBhbmFseXNpcy4gVGhp cyBpbXByb3ZlcyBBUEkgc2FmZXR5IGJ5IG1ha2luZyBpdApjbGVhciB0aGF0IGhvb2tzIHNob3Vs ZCBvbmx5IHJlYWQgZnJvbSB0aGUganVtYmxlIHN0YXRlLCBub3QgbW9kaWZ5Cml0LgoKVXBkYXRl IHBnX3N0YXRfc3RhdGVtZW50cyBhbmQgcmVsYXRlZCBmdW5jdGlvbnMgdG8gbWF0Y2ggdGhlIG5l dyBjb25zdApzaWduYXR1cmUuIFJlZmFjdG9yIFNldENvbnN0YW50TGVuZ3RocygpIHRvIHJldHVy biBhIG5ld2x5IGFsbG9jYXRlZApMb2NhdGlvbkxlbiBhcnJheSBpbnN0ZWFkIG9mIG1vZGlmeWlu ZyB0aGUgSnVtYmxlU3RhdGUsIGFuZCB1cGRhdGUKR2VuZXJhdGVOb3JtYWxpemVkUXVlcnkoKSB0 byB3b3JrIHdpdGggdGhlIGNvbnN0IEp1bWJsZVN0YXRlIGFuZAptYW5hZ2UgdGhlIHJldHVybmVk IGFycmF5IHByb3Blcmx5LgoKRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS9DQUE1Ulow dFpwNXFVMGlrWkVFcUpueHZkU05HaDFEV3Y4MHNiLWs0UUFVbWlNb09wX1FAbWFpbC5nbWFpbC5j b20KLS0tCiAuLi4vcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jICAgfCAg OCArKy0tCiBzcmMvYmFja2VuZC9ub2Rlcy9xdWVyeWp1bWJsZWZ1bmNzLmMgICAgICAgICAgfCA0 NCArKysrKysrKysrKysrLS0tLS0tCiBzcmMvaW5jbHVkZS9ub2Rlcy9xdWVyeWp1bWJsZS5oICAg ICAgICAgICAgICAgfCAgMiArLQogc3JjL2luY2x1ZGUvcGFyc2VyL2FuYWx5emUuaCAgICAgICAg ICAgICAgICAgIHwgIDIgKy0KIDQgZmlsZXMgY2hhbmdlZCwgMzYgaW5zZXJ0aW9ucygrKSwgMjAg ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdf c3RhdF9zdGF0ZW1lbnRzLmMgYi9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0 YXRlbWVudHMuYwppbmRleCBjOTMzODQ0MmQ5Ni4uMzg2YTE0MTkyMzIgMTAwNjQ0Ci0tLSBhL2Nv bnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCisrKyBiL2NvbnRy aWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCkBAIC0zMzMsNyArMzMz LDcgQEAgc3RhdGljIHZvaWQgcGdzc19zaG1lbV9yZXF1ZXN0KHZvaWQpOwogc3RhdGljIHZvaWQg cGdzc19zaG1lbV9zdGFydHVwKHZvaWQpOwogc3RhdGljIHZvaWQgcGdzc19zaG1lbV9zaHV0ZG93 bihpbnQgY29kZSwgRGF0dW0gYXJnKTsKIHN0YXRpYyB2b2lkIHBnc3NfcG9zdF9wYXJzZV9hbmFs eXplKFBhcnNlU3RhdGUgKnBzdGF0ZSwgUXVlcnkgKnF1ZXJ5LAotCQkJCQkJCQkJSnVtYmxlU3Rh dGUgKmpzdGF0ZSk7CisJCQkJCQkJCQljb25zdCBKdW1ibGVTdGF0ZSAqanN0YXRlKTsKIHN0YXRp YyBQbGFubmVkU3RtdCAqcGdzc19wbGFubmVyKFF1ZXJ5ICpwYXJzZSwKIAkJCQkJCQkJIGNvbnN0 IGNoYXIgKnF1ZXJ5X3N0cmluZywKIAkJCQkJCQkJIGludCBjdXJzb3JPcHRpb25zLApAQCAtMzU3 LDcgKzM1Nyw3IEBAIHN0YXRpYyB2b2lkIHBnc3Nfc3RvcmUoY29uc3QgY2hhciAqcXVlcnksIGlu dDY0IHF1ZXJ5SWQsCiAJCQkJCSAgIGNvbnN0IEJ1ZmZlclVzYWdlICpidWZ1c2FnZSwKIAkJCQkJ ICAgY29uc3QgV2FsVXNhZ2UgKndhbHVzYWdlLAogCQkJCQkgICBjb25zdCBzdHJ1Y3QgSml0SW5z dHJ1bWVudGF0aW9uICpqaXR1c2FnZSwKLQkJCQkJICAgSnVtYmxlU3RhdGUgKmpzdGF0ZSwKKwkJ CQkJICAgY29uc3QgSnVtYmxlU3RhdGUgKmpzdGF0ZSwKIAkJCQkJICAgaW50IHBhcmFsbGVsX3dv cmtlcnNfdG9fbGF1bmNoLAogCQkJCQkgICBpbnQgcGFyYWxsZWxfd29ya2Vyc19sYXVuY2hlZCwK IAkJCQkJICAgUGxhbm5lZFN0bXRPcmlnaW4gcGxhbk9yaWdpbik7CkBAIC04MzMsNyArODMzLDcg QEAgZXJyb3I6CiAgKiBQb3N0LXBhcnNlLWFuYWx5c2lzIGhvb2s6IG1hcmsgcXVlcnkgd2l0aCBh IHF1ZXJ5SWQKICAqLwogc3RhdGljIHZvaWQKLXBnc3NfcG9zdF9wYXJzZV9hbmFseXplKFBhcnNl U3RhdGUgKnBzdGF0ZSwgUXVlcnkgKnF1ZXJ5LCBKdW1ibGVTdGF0ZSAqanN0YXRlKQorcGdzc19w b3N0X3BhcnNlX2FuYWx5emUoUGFyc2VTdGF0ZSAqcHN0YXRlLCBRdWVyeSAqcXVlcnksIGNvbnN0 IEp1bWJsZVN0YXRlICpqc3RhdGUpCiB7CiAJaWYgKHByZXZfcG9zdF9wYXJzZV9hbmFseXplX2hv b2spCiAJCXByZXZfcG9zdF9wYXJzZV9hbmFseXplX2hvb2socHN0YXRlLCBxdWVyeSwganN0YXRl KTsKQEAgLTEyOTAsNyArMTI5MCw3IEBAIHBnc3Nfc3RvcmUoY29uc3QgY2hhciAqcXVlcnksIGlu dDY0IHF1ZXJ5SWQsCiAJCSAgIGNvbnN0IEJ1ZmZlclVzYWdlICpidWZ1c2FnZSwKIAkJICAgY29u c3QgV2FsVXNhZ2UgKndhbHVzYWdlLAogCQkgICBjb25zdCBzdHJ1Y3QgSml0SW5zdHJ1bWVudGF0 aW9uICpqaXR1c2FnZSwKLQkJICAgSnVtYmxlU3RhdGUgKmpzdGF0ZSwKKwkJICAgY29uc3QgSnVt YmxlU3RhdGUgKmpzdGF0ZSwKIAkJICAgaW50IHBhcmFsbGVsX3dvcmtlcnNfdG9fbGF1bmNoLAog CQkgICBpbnQgcGFyYWxsZWxfd29ya2Vyc19sYXVuY2hlZCwKIAkJICAgUGxhbm5lZFN0bXRPcmln aW4gcGxhbk9yaWdpbikKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL25vZGVzL3F1ZXJ5anVtYmxl ZnVuY3MuYyBiL3NyYy9iYWNrZW5kL25vZGVzL3F1ZXJ5anVtYmxlZnVuY3MuYwppbmRleCBjOTk3 YTFlZjYwOS4uMGE0MGJjODllMGEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL25vZGVzL3F1ZXJ5 anVtYmxlZnVuY3MuYworKysgYi9zcmMvYmFja2VuZC9ub2Rlcy9xdWVyeWp1bWJsZWZ1bmNzLmMK QEAgLTc4OSw4ICs3ODksMTAgQEAgQ29tcExvY2F0aW9uKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZv aWQgKmIpCiB9CiAKIC8qCi0gKiBHaXZlbiBhIHZhbGlkIFNRTCBzdHJpbmcgYW5kIGFuIGFycmF5 IG9mIGNvbnN0YW50LWxvY2F0aW9uIHJlY29yZHMsCi0gKiBmaWxsIGluIHRoZSB0ZXh0dWFsIGxl bmd0aHMgb2YgdGhvc2UgY29uc3RhbnRzIGluIEp1bWJsZVN0YXRlLgorICogR2l2ZW4gYSB2YWxp ZCBTUUwgc3RyaW5nIGFuZCBhbiBhcnJheSBvZiBjb25zdGFudC1sb2NhdGlvbiByZWNvcmRzLCBy ZXR1cm4KKyAqIHRoZSB0ZXh0dWFsIGxlbmd0aHMgb2YgdGhvc2UgY29uc3RhbnRzIGluIGEgbmV3 bHkgYWxsb2NhdGVkIExvY2F0aW9uTGVuCisgKiBhcnJheSwgb3IgTlVMTCBpZiB0aGVyZSBhcmUg bm8gY29uc3RhbnRzLiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkKKyAqIHRvIHBm cmVlIHRoZSByZXN1bHQsIGlmIG5lY2Vzc2FyeS4KICAqCiAgKiBUaGUgY29uc3RhbnRzIG1heSB1 c2UgYW55IGFsbG93ZWQgY29uc3RhbnQgc3ludGF4LCBzdWNoIGFzIGZsb2F0IGxpdGVyYWxzLAog ICogYml0LXN0cmluZ3MsIHNpbmdsZS1xdW90ZWQgc3RyaW5ncyBhbmQgZG9sbGFyLXF1b3RlZCBz dHJpbmdzLiAgVGhpcyBpcwpAQCAtODA4LDggKzgxMCw4IEBAIENvbXBMb2NhdGlvbihjb25zdCB2 b2lkICphLCBjb25zdCB2b2lkICpiKQogICogYSBuZWdhdGl2ZSBudW1lcmljIGNvbnN0YW50LiAg VGhpcyBwcmVjbHVkZXMgdGhlcmUgZXZlciBiZWluZyBhbm90aGVyCiAgKiByZWFzb24gZm9yIGEg Y29uc3RhbnQgdG8gc3RhcnQgd2l0aCBhICctJy4KICAqLwotc3RhdGljIHZvaWQKLVNldENvbnN0 YW50TGVuZ3RocyhKdW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKK3N0YXRp YyBMb2NhdGlvbkxlbiAqCitTZXRDb25zdGFudExlbmd0aHMoY29uc3QgSnVtYmxlU3RhdGUgKmpz dGF0ZSwgY29uc3QgY2hhciAqcXVlcnksCiAJCQkJICAgaW50IHF1ZXJ5X2xvYykKIHsKIAlMb2Nh dGlvbkxlbiAqbG9jczsKQEAgLTgxOCwxNCArODIwLDIwIEBAIFNldENvbnN0YW50TGVuZ3RocyhK dW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKIAljb3JlX1lZU1RZUEUgeXls dmFsOwogCVlZTFRZUEUJCXl5bGxvYzsKIAorCWlmIChqc3RhdGUtPmNsb2NhdGlvbnNfY291bnQg PT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBDb3B5IGNvbnN0YW50IGxvY2F0aW9ucyB0byBh dm9pZCBtb2RpZnlpbmcganN0YXRlICovCisJbG9jcyA9IHBhbGxvY19hcnJheShMb2NhdGlvbkxl biwganN0YXRlLT5jbG9jYXRpb25zX2NvdW50KTsKKwltZW1jcHkobG9jcywganN0YXRlLT5jbG9j YXRpb25zLCBqc3RhdGUtPmNsb2NhdGlvbnNfY291bnQgKiBzaXplb2YoTG9jYXRpb25MZW4pKTsK KwogCS8qCiAJICogU29ydCB0aGUgcmVjb3JkcyBieSBsb2NhdGlvbiBzbyB0aGF0IHdlIGNhbiBw cm9jZXNzIHRoZW0gaW4gb3JkZXIgd2hpbGUKIAkgKiBzY2FubmluZyB0aGUgcXVlcnkgdGV4dC4K IAkgKi8KIAlpZiAoanN0YXRlLT5jbG9jYXRpb25zX2NvdW50ID4gMSkKLQkJcXNvcnQoanN0YXRl LT5jbG9jYXRpb25zLCBqc3RhdGUtPmNsb2NhdGlvbnNfY291bnQsCisJCXFzb3J0KGxvY3MsIGpz dGF0ZS0+Y2xvY2F0aW9uc19jb3VudCwKIAkJCSAgc2l6ZW9mKExvY2F0aW9uTGVuKSwgQ29tcExv Y2F0aW9uKTsKLQlsb2NzID0ganN0YXRlLT5jbG9jYXRpb25zOwogCiAJLyogaW5pdGlhbGl6ZSB0 aGUgZmxleCBzY2FubmVyIC0tLSBzaG91bGQgbWF0Y2ggcmF3X3BhcnNlcigpICovCiAJeXlzY2Fu bmVyID0gc2Nhbm5lcl9pbml0KHF1ZXJ5LApAQCAtOTEwLDYgKzkxOCw4IEBAIFNldENvbnN0YW50 TGVuZ3RocyhKdW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKIAl9CiAKIAlz Y2FubmVyX2ZpbmlzaCh5eXNjYW5uZXIpOworCisJcmV0dXJuIGxvY3M7CiB9CiAKIC8qCkBAIC05 MzEsNyArOTQxLDcgQEAgU2V0Q29uc3RhbnRMZW5ndGhzKEp1bWJsZVN0YXRlICpqc3RhdGUsIGNv bnN0IGNoYXIgKnF1ZXJ5LAogICogUmV0dXJucyBhIHBhbGxvYydkIHN0cmluZy4KICAqLwogY2hh ciAqCi1HZW5lcmF0ZU5vcm1hbGl6ZWRRdWVyeShKdW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBj aGFyICpxdWVyeSwKK0dlbmVyYXRlTm9ybWFsaXplZFF1ZXJ5KGNvbnN0IEp1bWJsZVN0YXRlICpq c3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAogCQkJCQkJaW50IHF1ZXJ5X2xvYywgaW50ICpxdWVy eV9sZW5fcCkKIHsKIAljaGFyCSAgICpub3JtX3F1ZXJ5OwpAQCAtOTQzLDEyICs5NTMsMTQgQEAg R2VuZXJhdGVOb3JtYWxpemVkUXVlcnkoSnVtYmxlU3RhdGUgKmpzdGF0ZSwgY29uc3QgY2hhciAq cXVlcnksCiAJCQkJbGFzdF9vZmYgPSAwLAkvKiBPZmZzZXQgZnJvbSBzdGFydCBmb3IgcHJldmlv dXMgdG9rICovCiAJCQkJbGFzdF90b2tfbGVuID0gMDsJLyogTGVuZ3RoIChpbiBieXRlcykgb2Yg dGhhdCB0b2sgKi8KIAlpbnQJCQludW1fY29uc3RhbnRzX3JlcGxhY2VkID0gMDsKKwlMb2NhdGlv bkxlbiAqbG9jcyA9IE5VTEw7CiAKIAkvKgotCSAqIFNldCBjb25zdGFudHMnIGxlbmd0aHMgaW4g SnVtYmxlU3RhdGUsIGFzIG9ubHkgbG9jYXRpb25zIGFyZSBzZXQgZHVyaW5nCi0JICogRG9KdW1i bGUoKS4gTm90ZSB0aGlzIGFsc28gZW5zdXJlcyB0aGUgaXRlbXMgYXJlIHNvcnRlZCBieSBsb2Nh dGlvbi4KKwkgKiBEZXRlcm1pbmUgY29uc3RhbnRzJyBsZW5ndGhzLCB3aGljaCBhcmUgbm90IHNl dCBkdXJpbmcgRG9KdW1ibGUoKSwgYW5kCisJICogcmV0dXJuIGEgc29ydGVkIGNvcHkgb2YganN0 YXRlJ3MgTG9jYXRpb25MZW4gZGF0YSB3aXRoIGxlbmd0aHMgZmlsbGVkCisJICogaW4uCiAJICov Ci0JU2V0Q29uc3RhbnRMZW5ndGhzKGpzdGF0ZSwgcXVlcnksIHF1ZXJ5X2xvYyk7CisJbG9jcyA9 IFNldENvbnN0YW50TGVuZ3Rocyhqc3RhdGUsIHF1ZXJ5LCBxdWVyeV9sb2MpOwogCiAJLyoKIAkg KiBBbGxvdyBmb3IgJG4gc3ltYm9scyB0byBiZSBsb25nZXIgdGhhbiB0aGUgY29uc3RhbnRzIHRo ZXkgcmVwbGFjZS4KQEAgLTk3NCwxNSArOTg2LDE1IEBAIEdlbmVyYXRlTm9ybWFsaXplZFF1ZXJ5 KEp1bWJsZVN0YXRlICpqc3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAogCQkgKiB0aGUgcGFyYW1l dGVyIGluIHRoZSBuZXh0IGl0ZXJhdGlvbiAob3IgYWZ0ZXIgdGhlIGxvb3AgaXMgZG9uZSksCiAJ CSAqIHdoaWNoIGlzIGEgYml0IG9kZCBidXQgc2VlbXMgdG8gd29yayBva2F5IGluIG1vc3QgY2Fz ZXMuCiAJCSAqLwotCQlpZiAoanN0YXRlLT5jbG9jYXRpb25zW2ldLmV4dGVybl9wYXJhbSAmJiAh anN0YXRlLT5oYXNfc3F1YXNoZWRfbGlzdHMpCisJCWlmIChsb2NzW2ldLmV4dGVybl9wYXJhbSAm JiAhanN0YXRlLT5oYXNfc3F1YXNoZWRfbGlzdHMpCiAJCQljb250aW51ZTsKIAotCQlvZmYgPSBq c3RhdGUtPmNsb2NhdGlvbnNbaV0ubG9jYXRpb247CisJCW9mZiA9IGxvY3NbaV0ubG9jYXRpb247 CiAKIAkJLyogQWRqdXN0IHRoZSBjb25zdGFudCdzIGxvY2F0aW9uIChzZWUgU2V0Q29uc3RhbnRM ZW5ndGhzKSAqLwogCQlvZmYgLT0gcXVlcnlfbG9jOwogCi0JCXRva19sZW4gPSBqc3RhdGUtPmNs b2NhdGlvbnNbaV0ubGVuZ3RoOworCQl0b2tfbGVuID0gbG9jc1tpXS5sZW5ndGg7CiAKIAkJaWYg KHRva19sZW4gPCAwKQogCQkJY29udGludWU7CQkJLyogaWdub3JlIGFueSBkdXBsaWNhdGVzICov CkBAIC0xMDAxLDcgKzEwMTMsNyBAQCBHZW5lcmF0ZU5vcm1hbGl6ZWRRdWVyeShKdW1ibGVTdGF0 ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwKIAkJICovCiAJCW5fcXVlcl9sb2MgKz0gc3By aW50Zihub3JtX3F1ZXJ5ICsgbl9xdWVyX2xvYywgIiQlZCVzIiwKIAkJCQkJCQkgIG51bV9jb25z dGFudHNfcmVwbGFjZWQgKyAxICsganN0YXRlLT5oaWdoZXN0X2V4dGVybl9wYXJhbV9pZCwKLQkJ CQkJCQkgIGpzdGF0ZS0+Y2xvY2F0aW9uc1tpXS5zcXVhc2hlZCA/ICIgLyosIC4uLiAqLyIgOiAi Iik7CisJCQkJCQkJICBsb2NzW2ldLnNxdWFzaGVkID8gIiAvKiwgLi4uICovIiA6ICIiKTsKIAkJ bnVtX2NvbnN0YW50c19yZXBsYWNlZCsrOwogCiAJCS8qIG1vdmUgZm9yd2FyZCAqLwpAQCAtMTAx MCw2ICsxMDIyLDEwIEBAIEdlbmVyYXRlTm9ybWFsaXplZFF1ZXJ5KEp1bWJsZVN0YXRlICpqc3Rh dGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAogCQlsYXN0X3Rva19sZW4gPSB0b2tfbGVuOwogCX0KIAor CS8qIENsZWFuIHVwIHRlbXBvcmFyeSBsb2NhdGlvbiBhcnJheSBiZWZvcmUgYW55IGFzc2VydGlv bnMgKi8KKwlpZiAobG9jcykKKwkJcGZyZWUobG9jcyk7CisKIAkvKgogCSAqIFdlJ3ZlIGNvcGll ZCB1cCB1bnRpbCB0aGUgbGFzdCBpZ25vcmFibGUgY29uc3RhbnQuICBDb3B5IG92ZXIgdGhlCiAJ ICogcmVtYWluaW5nIGJ5dGVzIG9mIHRoZSBvcmlnaW5hbCBxdWVyeSBzdHJpbmcuCmRpZmYgLS1n aXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9xdWVyeWp1bWJsZS5oIGIvc3JjL2luY2x1ZGUvbm9kZXMv cXVlcnlqdW1ibGUuaAppbmRleCBlMzU0Zjg1N2MzNy4uYjcwOTAzM2NlMjcgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL25vZGVzL3F1ZXJ5anVtYmxlLmgKKysrIGIvc3JjL2luY2x1ZGUvbm9kZXMv cXVlcnlqdW1ibGUuaApAQCAtOTEsNyArOTEsNyBAQCBleHRlcm4gUEdETExJTVBPUlQgaW50IGNv bXB1dGVfcXVlcnlfaWQ7CiAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKkNsZWFuUXVlcnl0ZXh0KGNv bnN0IGNoYXIgKnF1ZXJ5LCBpbnQgKmxvY2F0aW9uLCBpbnQgKmxlbik7Ci1leHRlcm4gY2hhciAq R2VuZXJhdGVOb3JtYWxpemVkUXVlcnkoSnVtYmxlU3RhdGUgKmpzdGF0ZSwgY29uc3QgY2hhciAq cXVlcnksCitleHRlcm4gY2hhciAqR2VuZXJhdGVOb3JtYWxpemVkUXVlcnkoY29uc3QgSnVtYmxl U3RhdGUgKmpzdGF0ZSwgY29uc3QgY2hhciAqcXVlcnksCiAJCQkJCQkJCQkgaW50IHF1ZXJ5X2xv YywgaW50ICpxdWVyeV9sZW5fcCk7CiBleHRlcm4gSnVtYmxlU3RhdGUgKkp1bWJsZVF1ZXJ5KFF1 ZXJ5ICpxdWVyeSk7CiBleHRlcm4gdm9pZCBFbmFibGVRdWVyeUlkKHZvaWQpOwpkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvcGFyc2VyL2FuYWx5emUuaCBiL3NyYy9pbmNsdWRlL3BhcnNlci9hbmFs eXplLmgKaW5kZXggZTEwMjcwZmYwZmYuLmIyZGI2ZmE0ZThjIDEwMDY0NAotLS0gYS9zcmMvaW5j bHVkZS9wYXJzZXIvYW5hbHl6ZS5oCisrKyBiL3NyYy9pbmNsdWRlL3BhcnNlci9hbmFseXplLmgK QEAgLTIxLDcgKzIxLDcgQEAKIC8qIEhvb2sgZm9yIHBsdWdpbnMgdG8gZ2V0IGNvbnRyb2wgYXQg ZW5kIG9mIHBhcnNlIGFuYWx5c2lzICovCiB0eXBlZGVmIHZvaWQgKCpwb3N0X3BhcnNlX2FuYWx5 emVfaG9va190eXBlKSAoUGFyc2VTdGF0ZSAqcHN0YXRlLAogCQkJCQkJCQkJCQkgIFF1ZXJ5ICpx dWVyeSwKLQkJCQkJCQkJCQkJICBKdW1ibGVTdGF0ZSAqanN0YXRlKTsKKwkJCQkJCQkJCQkJICBj b25zdCBKdW1ibGVTdGF0ZSAqanN0YXRlKTsKIGV4dGVybiBQR0RMTElNUE9SVCBwb3N0X3BhcnNl X2FuYWx5emVfaG9va190eXBlIHBvc3RfcGFyc2VfYW5hbHl6ZV9ob29rOwogCiAKLS0gCjIuNDcu MwoK --000000000000d28c37064de50530 Content-Type: application/octet-stream; name="v6-0001-pg_stat_statements-Move-query-normalization-to-co.patch" Content-Disposition: attachment; filename="v6-0001-pg_stat_statements-Move-query-normalization-to-co.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn6x14uh1 RnJvbSA3OWU5NDM0M2Q0NmFkMWU4ZjE2ZjMwNDQ5NDkyZWJlMDFlNDQxOWEwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBVYnVudHUgPHVidW50dUBpcC0xNzItMzEtNDYtMjMwLmVjMi5p bnRlcm5hbD4KRGF0ZTogVGh1LCAxOCBEZWMgMjAyNSAxODo1OTozMSArMDAwMApTdWJqZWN0OiBb UEFUQ0ggdjYgMS8yXSBwZ19zdGF0X3N0YXRlbWVudHM6IE1vdmUgcXVlcnkgbm9ybWFsaXphdGlv biB0byBjb3JlCgpwZ19zdGF0X3N0YXRlbWVudHMgd2FzIG1vZGlmeWluZyBjb3JlIGdlbmVyYXRl ZCBKdW1ibGVTdGF0ZSBpbnN0YW5jZXMKYnkgY2FsbGluZyBmaWxsX2luX2NvbnN0YW50X2xlbmd0 aHMoKSB2aWEgZ2VuZXJhdGVfbm9ybWFsaXplZF9xdWVyeSgpCnRvIHBvcHVsYXRlIGNvbnN0YW50 IGxlbmd0aHMuIFRoaXMgY3JlYXRlcyBwcm9ibGVtcyBzaW5jZSBleHRlbnNpb25zCnNob3VsZCBu b3QgbW9kaWZ5IHNoYXJlZCBjb3JlIGRhdGEgc3RydWN0dXJlcyB0aGF0IG1heSBiZSB1c2VkIGJ5 Cm90aGVyIGV4dGVuc2lvbnMsIGFuZCB0aGlzIGNvdWxkIGJlIGNvbnNpZGVyZWQgYSBsYXllcmlu ZyB2aW9sYXRpb24uCgpNb3ZlIHF1ZXJ5IG5vcm1hbGl6YXRpb24gZnVuY3Rpb25zIHRvIGNvcmUg YXMgYSBnbG9iYWwgZnVuY3Rpb24gdG8KZml4IHRoaXMuIEV4dGVuc2lvbnMgbm93IGNhbGwgR2Vu ZXJhdGVOb3JtYWxpemVkUXVlcnkoKSBpbnN0ZWFkIG9mCmRpcmVjdGx5IG1vZGlmeWluZyBKdW1i bGVTdGF0ZS4KClRoaXMgY2hhbmdlIGFsc28gYWRkcmVzc2VzIGNvZGUgZHVwbGljYXRpb24sIGFz IHNldmVyYWwgZXh0ZW5zaW9ucwpoYXZlIGJlZW4gY29weWluZyBnZW5lcmF0ZV9ub3JtYWxpemVk X3F1ZXJ5KCkgdG8gaW1wbGVtZW50IHRoZWlyIG93bgpub3JtYWxpemF0aW9uLiBUaGUgbmV3IGNv cmUgQVBJIHByb3ZpZGVzIGEgc2luZ2xlLCBjb25zaXN0ZW50CmltcGxlbWVudGF0aW9uIGZvciBh bGwgZXh0ZW5zaW9ucyB0byB1c2UuCgpGdW5jdGlvbnMgYXJlIHJlbmFtZWQgdG8gbWF0Y2ggY29y ZSBuYW1pbmcgY29udmVudGlvbnMgYW5kIGNvbW1lbnRzCmFyZSB1cGRhdGVkIGZvciBjbGFyaXR5 LgoKRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS9DQUE1UlowdFpwNXFVMGlrWkVFcUpu eHZkU05HaDFEV3Y4MHNiLWs0UUFVbWlNb09wX1FAbWFpbC5nbWFpbC5jb20KLS0tCiAuLi4vcGdf c3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jICAgfCAyNzMgKy0tLS0tLS0tLS0t LS0tLS0tCiBzcmMvYmFja2VuZC9ub2Rlcy9xdWVyeWp1bWJsZWZ1bmNzLmMgICAgICAgICAgfCAy NTMgKysrKysrKysrKysrKysrKwogc3JjL2luY2x1ZGUvbm9kZXMvcXVlcnlqdW1ibGUuaCAgICAg ICAgICAgICAgIHwgICAyICsKIDMgZmlsZXMgY2hhbmdlZCwgMjY1IGluc2VydGlvbnMoKyksIDI2 MyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9w Z19zdGF0X3N0YXRlbWVudHMuYyBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRf c3RhdGVtZW50cy5jCmluZGV4IDZjYjE0ODI0ZWMzLi5jOTMzODQ0MmQ5NiAxMDA2NDQKLS0tIGEv Y29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMKKysrIGIvY29u dHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMKQEAgLTUwLDcgKzUw LDYgQEAKICNpbmNsdWRlICJhY2Nlc3MvaHR1cF9kZXRhaWxzLmgiCiAjaW5jbHVkZSAiYWNjZXNz L3BhcmFsbGVsLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19hdXRoaWQuaCIKLSNpbmNsdWRlICJj b21tb24vaW50LmgiCiAjaW5jbHVkZSAiZXhlY3V0b3IvaW5zdHJ1bWVudC5oIgogI2luY2x1ZGUg ImZ1bmNhcGkuaCIKICNpbmNsdWRlICJqaXQvaml0LmgiCkBAIC01OSw3ICs1OCw2IEBACiAjaW5j bHVkZSAibm9kZXMvcXVlcnlqdW1ibGUuaCIKICNpbmNsdWRlICJvcHRpbWl6ZXIvcGxhbm5lci5o IgogI2luY2x1ZGUgInBhcnNlci9hbmFseXplLmgiCi0jaW5jbHVkZSAicGFyc2VyL3NjYW5uZXIu aCIKICNpbmNsdWRlICJwZ3N0YXQuaCIKICNpbmNsdWRlICJzdG9yYWdlL2ZkLmgiCiAjaW5jbHVk ZSAic3RvcmFnZS9pcGMuaCIKQEAgLTM3OCwxMSArMzc2LDYgQEAgc3RhdGljIGNoYXIgKnF0ZXh0 X2ZldGNoKFNpemUgcXVlcnlfb2Zmc2V0LCBpbnQgcXVlcnlfbGVuLAogc3RhdGljIGJvb2wgbmVl ZF9nY19xdGV4dHModm9pZCk7CiBzdGF0aWMgdm9pZCBnY19xdGV4dHModm9pZCk7CiBzdGF0aWMg VGltZXN0YW1wVHogZW50cnlfcmVzZXQoT2lkIHVzZXJpZCwgT2lkIGRiaWQsIGludDY0IHF1ZXJ5 aWQsIGJvb2wgbWlubWF4X29ubHkpOwotc3RhdGljIGNoYXIgKmdlbmVyYXRlX25vcm1hbGl6ZWRf cXVlcnkoSnVtYmxlU3RhdGUgKmpzdGF0ZSwgY29uc3QgY2hhciAqcXVlcnksCi0JCQkJCQkJCQkg ICBpbnQgcXVlcnlfbG9jLCBpbnQgKnF1ZXJ5X2xlbl9wKTsKLXN0YXRpYyB2b2lkIGZpbGxfaW5f Y29uc3RhbnRfbGVuZ3RocyhKdW1ibGVTdGF0ZSAqanN0YXRlLCBjb25zdCBjaGFyICpxdWVyeSwK LQkJCQkJCQkJCSBpbnQgcXVlcnlfbG9jKTsKLXN0YXRpYyBpbnQJY29tcF9sb2NhdGlvbihjb25z dCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKIAogCiAvKgpAQCAtMTM2MCw5ICsxMzUzLDE2IEBA IHBnc3Nfc3RvcmUoY29uc3QgY2hhciAqcXVlcnksIGludDY0IHF1ZXJ5SWQsCiAJCWlmIChqc3Rh dGUpCiAJCXsKIAkJCUxXTG9ja1JlbGVhc2UocGdzcy0+bG9jayk7Ci0JCQlub3JtX3F1ZXJ5ID0g Z2VuZXJhdGVfbm9ybWFsaXplZF9xdWVyeShqc3RhdGUsIHF1ZXJ5LAotCQkJCQkJCQkJCQkJICAg cXVlcnlfbG9jYXRpb24sCi0JCQkJCQkJCQkJCQkgICAmcXVlcnlfbGVuKTsKKworCQkJLyoKKwkJ CSAqIGdlbmVyYXRlIHRoZSBub3JtYWxpemVkIHF1ZXJ5LiBOb3RlIHRoYXQgdGhlIG5vcm1hbGl6 ZWQKKwkJCSAqIHJlcHJlc2VudGF0aW9uIG1heSB3ZWxsIHZhcnkgZGVwZW5kaW5nIG9uIGp1c3Qg d2hpY2gKKwkJCSAqICJlcXVpdmFsZW50IiBxdWVyeSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgaGFz aHRhYmxlIGVudHJ5LiBXZQorCQkJICogYXNzdW1lIHRoaXMgaXMgT0suCisJCQkgKi8KKwkJCW5v cm1fcXVlcnkgPSBHZW5lcmF0ZU5vcm1hbGl6ZWRRdWVyeShqc3RhdGUsIHF1ZXJ5LAorCQkJCQkJ CQkJCQkJIHF1ZXJ5X2xvY2F0aW9uLAorCQkJCQkJCQkJCQkJICZxdWVyeV9sZW4pOwogCQkJTFdM b2NrQWNxdWlyZShwZ3NzLT5sb2NrLCBMV19TSEFSRUQpOwogCQl9CiAKQEAgLTI4MjQsMjU2ICsy ODI0LDMgQEAgcmVsZWFzZV9sb2NrOgogCiAJcmV0dXJuIHN0YXRzX3Jlc2V0OwogfQotCi0vKgot ICogR2VuZXJhdGUgYSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIHF1ZXJ5IHN0cmluZyB0aGF0 IHdpbGwgYmUgdXNlZCB0bwotICogcmVwcmVzZW50IGFsbCBzaW1pbGFyIHF1ZXJpZXMuCi0gKgot ICogTm90ZSB0aGF0IHRoZSBub3JtYWxpemVkIHJlcHJlc2VudGF0aW9uIG1heSB3ZWxsIHZhcnkg ZGVwZW5kaW5nIG9uCi0gKiBqdXN0IHdoaWNoICJlcXVpdmFsZW50IiBxdWVyeSBpcyB1c2VkIHRv IGNyZWF0ZSB0aGUgaGFzaHRhYmxlIGVudHJ5LgotICogV2UgYXNzdW1lIHRoaXMgaXMgT0suCi0g KgotICogSWYgcXVlcnlfbG9jID4gMCwgdGhlbiAicXVlcnkiIGhhcyBiZWVuIGFkdmFuY2VkIGJ5 IHRoYXQgbXVjaCBjb21wYXJlZCB0bwotICogdGhlIG9yaWdpbmFsIHN0cmluZyBzdGFydCwgc28g d2UgbmVlZCB0byB0cmFuc2xhdGUgdGhlIHByb3ZpZGVkIGxvY2F0aW9ucwotICogdG8gY29tcGVu c2F0ZS4gIChUaGlzIGxldHMgdXMgYXZvaWQgcmUtc2Nhbm5pbmcgc3RhdGVtZW50cyBiZWZvcmUg dGhlIG9uZQotICogb2YgaW50ZXJlc3QsIHNvIGl0J3Mgd29ydGggZG9pbmcuKQotICoKLSAqICpx dWVyeV9sZW5fcCBjb250YWlucyB0aGUgaW5wdXQgc3RyaW5nIGxlbmd0aCwgYW5kIGlzIHVwZGF0 ZWQgd2l0aAotICogdGhlIHJlc3VsdCBzdHJpbmcgbGVuZ3RoIG9uIGV4aXQuICBUaGUgcmVzdWx0 aW5nIHN0cmluZyBtaWdodCBiZSBsb25nZXIKLSAqIG9yIHNob3J0ZXIgZGVwZW5kaW5nIG9uIHdo YXQgaGFwcGVucyB3aXRoIHJlcGxhY2VtZW50IG9mIGNvbnN0YW50cy4KLSAqCi0gKiBSZXR1cm5z IGEgcGFsbG9jJ2Qgc3RyaW5nLgotICovCi1zdGF0aWMgY2hhciAqCi1nZW5lcmF0ZV9ub3JtYWxp emVkX3F1ZXJ5KEp1bWJsZVN0YXRlICpqc3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAotCQkJCQkJ ICBpbnQgcXVlcnlfbG9jLCBpbnQgKnF1ZXJ5X2xlbl9wKQotewotCWNoYXIJICAgKm5vcm1fcXVl cnk7Ci0JaW50CQkJcXVlcnlfbGVuID0gKnF1ZXJ5X2xlbl9wOwotCWludAkJCW5vcm1fcXVlcnlf YnVmbGVuLAkvKiBTcGFjZSBhbGxvd2VkIGZvciBub3JtX3F1ZXJ5ICovCi0JCQkJbGVuX3RvX3dy dCwJCS8qIExlbmd0aCAoaW4gYnl0ZXMpIHRvIHdyaXRlICovCi0JCQkJcXVlcl9sb2MgPSAwLAkv KiBTb3VyY2UgcXVlcnkgYnl0ZSBsb2NhdGlvbiAqLwotCQkJCW5fcXVlcl9sb2MgPSAwLCAvKiBO b3JtYWxpemVkIHF1ZXJ5IGJ5dGUgbG9jYXRpb24gKi8KLQkJCQlsYXN0X29mZiA9IDAsCS8qIE9m ZnNldCBmcm9tIHN0YXJ0IGZvciBwcmV2aW91cyB0b2sgKi8KLQkJCQlsYXN0X3Rva19sZW4gPSAw OwkvKiBMZW5ndGggKGluIGJ5dGVzKSBvZiB0aGF0IHRvayAqLwotCWludAkJCW51bV9jb25zdGFu dHNfcmVwbGFjZWQgPSAwOwotCi0JLyoKLQkgKiBHZXQgY29uc3RhbnRzJyBsZW5ndGhzIChjb3Jl IHN5c3RlbSBvbmx5IGdpdmVzIHVzIGxvY2F0aW9ucykuICBOb3RlCi0JICogdGhpcyBhbHNvIGVu c3VyZXMgdGhlIGl0ZW1zIGFyZSBzb3J0ZWQgYnkgbG9jYXRpb24uCi0JICovCi0JZmlsbF9pbl9j b25zdGFudF9sZW5ndGhzKGpzdGF0ZSwgcXVlcnksIHF1ZXJ5X2xvYyk7Ci0KLQkvKgotCSAqIEFs bG93IGZvciAkbiBzeW1ib2xzIHRvIGJlIGxvbmdlciB0aGFuIHRoZSBjb25zdGFudHMgdGhleSBy ZXBsYWNlLgotCSAqIENvbnN0YW50cyBtdXN0IHRha2UgYXQgbGVhc3Qgb25lIGJ5dGUgaW4gdGV4 dCBmb3JtLCB3aGlsZSBhICRuIHN5bWJvbAotCSAqIGNlcnRhaW5seSBpc24ndCBtb3JlIHRoYW4g MTEgYnl0ZXMsIGV2ZW4gaWYgbiByZWFjaGVzIElOVF9NQVguICBXZQotCSAqIGNvdWxkIHJlZmlu ZSB0aGF0IGxpbWl0IGJhc2VkIG9uIHRoZSBtYXggdmFsdWUgb2YgbiBmb3IgdGhlIGN1cnJlbnQK LQkgKiBxdWVyeSwgYnV0IGl0IGhhcmRseSBzZWVtcyB3b3J0aCBhbnkgZXh0cmEgZWZmb3J0IHRv IGRvIHNvLgotCSAqLwotCW5vcm1fcXVlcnlfYnVmbGVuID0gcXVlcnlfbGVuICsganN0YXRlLT5j bG9jYXRpb25zX2NvdW50ICogMTA7Ci0KLQkvKiBBbGxvY2F0ZSByZXN1bHQgYnVmZmVyICovCi0J bm9ybV9xdWVyeSA9IHBhbGxvYyhub3JtX3F1ZXJ5X2J1ZmxlbiArIDEpOwotCi0JZm9yIChpbnQg aSA9IDA7IGkgPCBqc3RhdGUtPmNsb2NhdGlvbnNfY291bnQ7IGkrKykKLQl7Ci0JCWludAkJCW9m ZiwJCS8qIE9mZnNldCBmcm9tIHN0YXJ0IGZvciBjdXIgdG9rICovCi0JCQkJCXRva19sZW47CS8q IExlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoYXQgdG9rICovCi0KLQkJLyoKLQkJICogSWYgd2UgaGF2 ZSBhbiBleHRlcm5hbCBwYXJhbSBhdCB0aGlzIGxvY2F0aW9uLCBidXQgbm8gbGlzdHMgYXJlCi0J CSAqIGJlaW5nIHNxdWFzaGVkIGFjcm9zcyB0aGUgcXVlcnksIHRoZW4gd2Ugc2tpcCBoZXJlOyB0 aGlzIHdpbGwgbWFrZQotCQkgKiB1cyBwcmludCB0aGUgY2hhcmFjdGVycyBmb3VuZCBpbiB0aGUg b3JpZ2luYWwgcXVlcnkgdGhhdCByZXByZXNlbnQKLQkJICogdGhlIHBhcmFtZXRlciBpbiB0aGUg bmV4dCBpdGVyYXRpb24gKG9yIGFmdGVyIHRoZSBsb29wIGlzIGRvbmUpLAotCQkgKiB3aGljaCBp cyBhIGJpdCBvZGQgYnV0IHNlZW1zIHRvIHdvcmsgb2theSBpbiBtb3N0IGNhc2VzLgotCQkgKi8K LQkJaWYgKGpzdGF0ZS0+Y2xvY2F0aW9uc1tpXS5leHRlcm5fcGFyYW0gJiYgIWpzdGF0ZS0+aGFz X3NxdWFzaGVkX2xpc3RzKQotCQkJY29udGludWU7Ci0KLQkJb2ZmID0ganN0YXRlLT5jbG9jYXRp b25zW2ldLmxvY2F0aW9uOwotCi0JCS8qIEFkanVzdCByZWNvcmRlZCBsb2NhdGlvbiBpZiB3ZSdy ZSBkZWFsaW5nIHdpdGggcGFydGlhbCBzdHJpbmcgKi8KLQkJb2ZmIC09IHF1ZXJ5X2xvYzsKLQot CQl0b2tfbGVuID0ganN0YXRlLT5jbG9jYXRpb25zW2ldLmxlbmd0aDsKLQotCQlpZiAodG9rX2xl biA8IDApCi0JCQljb250aW51ZTsJCQkvKiBpZ25vcmUgYW55IGR1cGxpY2F0ZXMgKi8KLQotCQkv KiBDb3B5IG5leHQgY2h1bmsgKHdoYXQgcHJlY2VkZXMgdGhlIG5leHQgY29uc3RhbnQpICovCi0J CWxlbl90b193cnQgPSBvZmYgLSBsYXN0X29mZjsKLQkJbGVuX3RvX3dydCAtPSBsYXN0X3Rva19s ZW47Ci0JCUFzc2VydChsZW5fdG9fd3J0ID49IDApOwotCQltZW1jcHkobm9ybV9xdWVyeSArIG5f cXVlcl9sb2MsIHF1ZXJ5ICsgcXVlcl9sb2MsIGxlbl90b193cnQpOwotCQluX3F1ZXJfbG9jICs9 IGxlbl90b193cnQ7Ci0KLQkJLyoKLQkJICogQW5kIGluc2VydCBhIHBhcmFtIHN5bWJvbCBpbiBw bGFjZSBvZiB0aGUgY29uc3RhbnQgdG9rZW47IGFuZCwgaWYKLQkJICogd2UgaGF2ZSBhIHNxdWFz aGFibGUgbGlzdCwgaW5zZXJ0IGEgcGxhY2Vob2xkZXIgY29tbWVudCBzdGFydGluZwotCQkgKiBm cm9tIHRoZSBsaXN0J3Mgc2Vjb25kIHZhbHVlLgotCQkgKi8KLQkJbl9xdWVyX2xvYyArPSBzcHJp bnRmKG5vcm1fcXVlcnkgKyBuX3F1ZXJfbG9jLCAiJCVkJXMiLAotCQkJCQkJCSAgbnVtX2NvbnN0 YW50c19yZXBsYWNlZCArIDEgKyBqc3RhdGUtPmhpZ2hlc3RfZXh0ZXJuX3BhcmFtX2lkLAotCQkJ CQkJCSAganN0YXRlLT5jbG9jYXRpb25zW2ldLnNxdWFzaGVkID8gIiAvKiwgLi4uICovIiA6ICIi KTsKLQkJbnVtX2NvbnN0YW50c19yZXBsYWNlZCsrOwotCi0JCS8qIG1vdmUgZm9yd2FyZCAqLwot CQlxdWVyX2xvYyA9IG9mZiArIHRva19sZW47Ci0JCWxhc3Rfb2ZmID0gb2ZmOwotCQlsYXN0X3Rv a19sZW4gPSB0b2tfbGVuOwotCX0KLQotCS8qCi0JICogV2UndmUgY29waWVkIHVwIHVudGlsIHRo ZSBsYXN0IGlnbm9yYWJsZSBjb25zdGFudC4gIENvcHkgb3ZlciB0aGUKLQkgKiByZW1haW5pbmcg Ynl0ZXMgb2YgdGhlIG9yaWdpbmFsIHF1ZXJ5IHN0cmluZy4KLQkgKi8KLQlsZW5fdG9fd3J0ID0g cXVlcnlfbGVuIC0gcXVlcl9sb2M7Ci0KLQlBc3NlcnQobGVuX3RvX3dydCA+PSAwKTsKLQltZW1j cHkobm9ybV9xdWVyeSArIG5fcXVlcl9sb2MsIHF1ZXJ5ICsgcXVlcl9sb2MsIGxlbl90b193cnQp OwotCW5fcXVlcl9sb2MgKz0gbGVuX3RvX3dydDsKLQotCUFzc2VydChuX3F1ZXJfbG9jIDw9IG5v cm1fcXVlcnlfYnVmbGVuKTsKLQlub3JtX3F1ZXJ5W25fcXVlcl9sb2NdID0gJ1wwJzsKLQotCSpx dWVyeV9sZW5fcCA9IG5fcXVlcl9sb2M7Ci0JcmV0dXJuIG5vcm1fcXVlcnk7Ci19Ci0KLS8qCi0g KiBHaXZlbiBhIHZhbGlkIFNRTCBzdHJpbmcgYW5kIGFuIGFycmF5IG9mIGNvbnN0YW50LWxvY2F0 aW9uIHJlY29yZHMsCi0gKiBmaWxsIGluIHRoZSB0ZXh0dWFsIGxlbmd0aHMgb2YgdGhvc2UgY29u c3RhbnRzLgotICoKLSAqIFRoZSBjb25zdGFudHMgbWF5IHVzZSBhbnkgYWxsb3dlZCBjb25zdGFu dCBzeW50YXgsIHN1Y2ggYXMgZmxvYXQgbGl0ZXJhbHMsCi0gKiBiaXQtc3RyaW5ncywgc2luZ2xl LXF1b3RlZCBzdHJpbmdzIGFuZCBkb2xsYXItcXVvdGVkIHN0cmluZ3MuICBUaGlzIGlzCi0gKiBh Y2NvbXBsaXNoZWQgYnkgdXNpbmcgdGhlIHB1YmxpYyBBUEkgZm9yIHRoZSBjb3JlIHNjYW5uZXIu Ci0gKgotICogSXQgaXMgdGhlIGNhbGxlcidzIGpvYiB0byBlbnN1cmUgdGhhdCB0aGUgc3RyaW5n IGlzIGEgdmFsaWQgU1FMIHN0YXRlbWVudAotICogd2l0aCBjb25zdGFudHMgYXQgdGhlIGluZGlj YXRlZCBsb2NhdGlvbnMuICBTaW5jZSBpbiBwcmFjdGljZSB0aGUgc3RyaW5nCi0gKiBoYXMgYWxy ZWFkeSBiZWVuIHBhcnNlZCwgYW5kIHRoZSBsb2NhdGlvbnMgdGhhdCB0aGUgY2FsbGVyIHByb3Zp ZGVzIHdpbGwKLSAqIGhhdmUgb3JpZ2luYXRlZCBmcm9tIHdpdGhpbiB0aGUgYXV0aG9yaXRhdGl2 ZSBwYXJzZXIsIHRoaXMgc2hvdWxkIG5vdCBiZQotICogYSBwcm9ibGVtLgotICoKLSAqIE11bHRp cGxlIGNvbnN0YW50cyBjYW4gaGF2ZSB0aGUgc2FtZSBsb2NhdGlvbi4gIFdlIHJlc2V0IGxlbmd0 aHMgb2YgdGhvc2UKLSAqIHBhc3QgdGhlIGZpcnN0IHRvIC0xIHNvIHRoYXQgdGhleSBjYW4gbGF0 ZXIgYmUgaWdub3JlZC4KLSAqCi0gKiBJZiBxdWVyeV9sb2MgPiAwLCB0aGVuICJxdWVyeSIgaGFz IGJlZW4gYWR2YW5jZWQgYnkgdGhhdCBtdWNoIGNvbXBhcmVkIHRvCi0gKiB0aGUgb3JpZ2luYWwg c3RyaW5nIHN0YXJ0LCBzbyB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSB0aGUgcHJvdmlkZWQgbG9jYXRp b25zCi0gKiB0byBjb21wZW5zYXRlLiAgKFRoaXMgbGV0cyB1cyBhdm9pZCByZS1zY2FubmluZyBz dGF0ZW1lbnRzIGJlZm9yZSB0aGUgb25lCi0gKiBvZiBpbnRlcmVzdCwgc28gaXQncyB3b3J0aCBk b2luZy4pCi0gKgotICogTi5CLiBUaGVyZSBpcyBhbiBhc3N1bXB0aW9uIHRoYXQgYSAnLScgY2hh cmFjdGVyIGF0IGEgQ29uc3QgbG9jYXRpb24gYmVnaW5zCi0gKiBhIG5lZ2F0aXZlIG51bWVyaWMg Y29uc3RhbnQuICBUaGlzIHByZWNsdWRlcyB0aGVyZSBldmVyIGJlaW5nIGFub3RoZXIKLSAqIHJl YXNvbiBmb3IgYSBjb25zdGFudCB0byBzdGFydCB3aXRoIGEgJy0nLgotICovCi1zdGF0aWMgdm9p ZAotZmlsbF9pbl9jb25zdGFudF9sZW5ndGhzKEp1bWJsZVN0YXRlICpqc3RhdGUsIGNvbnN0IGNo YXIgKnF1ZXJ5LAotCQkJCQkJIGludCBxdWVyeV9sb2MpCi17Ci0JTG9jYXRpb25MZW4gKmxvY3M7 Ci0JY29yZV95eXNjYW5fdCB5eXNjYW5uZXI7Ci0JY29yZV95eV9leHRyYV90eXBlIHl5ZXh0cmE7 Ci0JY29yZV9ZWVNUWVBFIHl5bHZhbDsKLQlZWUxUWVBFCQl5eWxsb2M7Ci0KLQkvKgotCSAqIFNv cnQgdGhlIHJlY29yZHMgYnkgbG9jYXRpb24gc28gdGhhdCB3ZSBjYW4gcHJvY2VzcyB0aGVtIGlu IG9yZGVyIHdoaWxlCi0JICogc2Nhbm5pbmcgdGhlIHF1ZXJ5IHRleHQuCi0JICovCi0JaWYgKGpz dGF0ZS0+Y2xvY2F0aW9uc19jb3VudCA+IDEpCi0JCXFzb3J0KGpzdGF0ZS0+Y2xvY2F0aW9ucywg anN0YXRlLT5jbG9jYXRpb25zX2NvdW50LAotCQkJICBzaXplb2YoTG9jYXRpb25MZW4pLCBjb21w X2xvY2F0aW9uKTsKLQlsb2NzID0ganN0YXRlLT5jbG9jYXRpb25zOwotCi0JLyogaW5pdGlhbGl6 ZSB0aGUgZmxleCBzY2FubmVyIC0tLSBzaG91bGQgbWF0Y2ggcmF3X3BhcnNlcigpICovCi0JeXlz Y2FubmVyID0gc2Nhbm5lcl9pbml0KHF1ZXJ5LAotCQkJCQkJCSAmeXlleHRyYSwKLQkJCQkJCQkg JlNjYW5LZXl3b3JkcywKLQkJCQkJCQkgU2NhbktleXdvcmRUb2tlbnMpOwotCi0JLyogU2VhcmNo IGZvciBlYWNoIGNvbnN0YW50LCBpbiBzZXF1ZW5jZSAqLwotCWZvciAoaW50IGkgPSAwOyBpIDwg anN0YXRlLT5jbG9jYXRpb25zX2NvdW50OyBpKyspCi0JewotCQlpbnQJCQlsb2M7Ci0JCWludAkJ CXRvazsKLQotCQkvKiBJZ25vcmUgY29uc3RhbnRzIGFmdGVyIHRoZSBmaXJzdCBvbmUgaW4gdGhl IHNhbWUgbG9jYXRpb24gKi8KLQkJaWYgKGkgPiAwICYmIGxvY3NbaV0ubG9jYXRpb24gPT0gbG9j c1tpIC0gMV0ubG9jYXRpb24pCi0JCXsKLQkJCWxvY3NbaV0ubGVuZ3RoID0gLTE7Ci0JCQljb250 aW51ZTsKLQkJfQotCi0JCWlmIChsb2NzW2ldLnNxdWFzaGVkKQotCQkJY29udGludWU7CQkJLyog c3F1YXNoYWJsZSBsaXN0LCBpZ25vcmUgKi8KLQotCQkvKiBBZGp1c3QgcmVjb3JkZWQgbG9jYXRp b24gaWYgd2UncmUgZGVhbGluZyB3aXRoIHBhcnRpYWwgc3RyaW5nICovCi0JCWxvYyA9IGxvY3Nb aV0ubG9jYXRpb24gLSBxdWVyeV9sb2M7Ci0JCUFzc2VydChsb2MgPj0gMCk7Ci0KLQkJLyoKLQkJ ICogV2UgaGF2ZSBhIHZhbGlkIGxvY2F0aW9uIGZvciBhIGNvbnN0YW50IHRoYXQncyBub3QgYSBk dXBlLiBMZXgKLQkJICogdG9rZW5zIHVudGlsIHdlIGZpbmQgdGhlIGRlc2lyZWQgY29uc3RhbnQu Ci0JCSAqLwotCQlmb3IgKDs7KQotCQl7Ci0JCQl0b2sgPSBjb3JlX3l5bGV4KCZ5eWx2YWwsICZ5 eWxsb2MsIHl5c2Nhbm5lcik7Ci0KLQkJCS8qIFdlIHNob3VsZCBub3QgaGl0IGVuZC1vZi1zdHJp bmcsIGJ1dCBpZiB3ZSBkbywgYmVoYXZlIHNhbmVseSAqLwotCQkJaWYgKHRvayA9PSAwKQotCQkJ CWJyZWFrOwkJCS8qIG91dCBvZiBpbm5lciBmb3ItbG9vcCAqLwotCi0JCQkvKgotCQkJICogV2Ug c2hvdWxkIGZpbmQgdGhlIHRva2VuIHBvc2l0aW9uIGV4YWN0bHksIGJ1dCBpZiB3ZSBzb21laG93 Ci0JCQkgKiBydW4gcGFzdCBpdCwgd29yayB3aXRoIHRoYXQuCi0JCQkgKi8KLQkJCWlmICh5eWxs b2MgPj0gbG9jKQotCQkJewotCQkJCWlmIChxdWVyeVtsb2NdID09ICctJykKLQkJCQl7Ci0JCQkJ CS8qCi0JCQkJCSAqIEl0J3MgYSBuZWdhdGl2ZSB2YWx1ZSAtIHRoaXMgaXMgdGhlIG9uZSBhbmQg b25seSBjYXNlCi0JCQkJCSAqIHdoZXJlIHdlIHJlcGxhY2UgbW9yZSB0aGFuIGEgc2luZ2xlIHRv a2VuLgotCQkJCQkgKgotCQkJCQkgKiBEbyBub3QgY29tcGVuc2F0ZSBmb3IgdGhlIGNvcmUgc3lz dGVtJ3Mgc3BlY2lhbC1jYXNlCi0JCQkJCSAqIGFkanVzdG1lbnQgb2YgbG9jYXRpb24gdG8gdGhh dCBvZiB0aGUgbGVhZGluZyAnLScKLQkJCQkJICogb3BlcmF0b3IgaW4gdGhlIGV2ZW50IG9mIGEg bmVnYXRpdmUgY29uc3RhbnQuICBJdCBpcwotCQkJCQkgKiBhbHNvIHVzZWZ1bCBmb3Igb3VyIHB1 cnBvc2VzIHRvIHN0YXJ0IGZyb20gdGhlIG1pbnVzCi0JCQkJCSAqIHN5bWJvbC4gIEluIHRoaXMg d2F5LCBxdWVyaWVzIGxpa2UgInNlbGVjdCAqIGZyb20gZm9vCi0JCQkJCSAqIHdoZXJlIGJhciA9 IDEiIGFuZCAic2VsZWN0ICogZnJvbSBmb28gd2hlcmUgYmFyID0gLTIiCi0JCQkJCSAqIHdpbGwg aGF2ZSBpZGVudGljYWwgbm9ybWFsaXplZCBxdWVyeSBzdHJpbmdzLgotCQkJCQkgKi8KLQkJCQkJ dG9rID0gY29yZV95eWxleCgmeXlsdmFsLCAmeXlsbG9jLCB5eXNjYW5uZXIpOwotCQkJCQlpZiAo dG9rID09IDApCi0JCQkJCQlicmVhazsJLyogb3V0IG9mIGlubmVyIGZvci1sb29wICovCi0JCQkJ fQotCi0JCQkJLyoKLQkJCQkgKiBXZSBub3cgcmVseSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGZs ZXggaGFzIHBsYWNlZCBhIHplcm8KLQkJCQkgKiBieXRlIGFmdGVyIHRoZSB0ZXh0IG9mIHRoZSBj dXJyZW50IHRva2VuIGluIHNjYW5idWYuCi0JCQkJICovCi0JCQkJbG9jc1tpXS5sZW5ndGggPSBz dHJsZW4oeXlleHRyYS5zY2FuYnVmICsgbG9jKTsKLQkJCQlicmVhazsJCQkvKiBvdXQgb2YgaW5u ZXIgZm9yLWxvb3AgKi8KLQkJCX0KLQkJfQotCi0JCS8qIElmIHdlIGhpdCBlbmQtb2Ytc3RyaW5n LCBnaXZlIHVwLCBsZWF2aW5nIHJlbWFpbmluZyBsZW5ndGhzIC0xICovCi0JCWlmICh0b2sgPT0g MCkKLQkJCWJyZWFrOwotCX0KLQotCXNjYW5uZXJfZmluaXNoKHl5c2Nhbm5lcik7Ci19Ci0KLS8q Ci0gKiBjb21wX2xvY2F0aW9uOiBjb21wYXJhdG9yIGZvciBxc29ydGluZyBMb2NhdGlvbkxlbiBz dHJ1Y3RzIGJ5IGxvY2F0aW9uCi0gKi8KLXN0YXRpYyBpbnQKLWNvbXBfbG9jYXRpb24oY29uc3Qg dm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsKLQlpbnQJCQlsID0gKChjb25zdCBMb2NhdGlvbkxl biAqKSBhKS0+bG9jYXRpb247Ci0JaW50CQkJciA9ICgoY29uc3QgTG9jYXRpb25MZW4gKikgYikt PmxvY2F0aW9uOwotCi0JcmV0dXJuIHBnX2NtcF9zMzIobCwgcik7Ci19CmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9ub2Rlcy9xdWVyeWp1bWJsZWZ1bmNzLmMgYi9zcmMvYmFja2VuZC9ub2Rlcy9x dWVyeWp1bWJsZWZ1bmNzLmMKaW5kZXggODdkYjhkYzFhMzIuLmM5OTdhMWVmNjA5IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9ub2Rlcy9xdWVyeWp1bWJsZWZ1bmNzLmMKKysrIGIvc3JjL2JhY2tl bmQvbm9kZXMvcXVlcnlqdW1ibGVmdW5jcy5jCkBAIC00MCwxMCArNDAsMTIgQEAKICNpbmNsdWRl ICJhY2Nlc3MvdHJhbnNhbS5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfcHJvYy5oIgogI2luY2x1 ZGUgImNvbW1vbi9oYXNoZm4uaCIKKyNpbmNsdWRlICJjb21tb24vaW50LmgiCiAjaW5jbHVkZSAi bWlzY2FkbWluLmgiCiAjaW5jbHVkZSAibm9kZXMvbm9kZUZ1bmNzLmgiCiAjaW5jbHVkZSAibm9k ZXMvcXVlcnlqdW1ibGUuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKKyNpbmNsdWRl ICJwYXJzZXIvc2Nhbm5lci5oIgogI2luY2x1ZGUgInBhcnNlci9zY2Fuc3VwLmgiCiAKICNkZWZp bmUgSlVNQkxFX1NJWkUJCQkJMTAyNAkvKiBxdWVyeSBzZXJpYWxpemF0aW9uIGJ1ZmZlciBzaXpl ICovCkBAIC03NzMsMyArNzc1LDI1NCBAQCBfanVtYmxlUmFuZ2VUYmxFbnRyeV9lcmVmKEp1bWJs ZVN0YXRlICpqc3RhdGUsCiAJICovCiAJSlVNQkxFX1NUUklORyhhbGlhc25hbWUpOwogfQorCisv KgorICogQ29tcExvY2F0aW9uOiBjb21wYXJhdG9yIGZvciBxc29ydGluZyBMb2NhdGlvbkxlbiBz dHJ1Y3RzIGJ5IGxvY2F0aW9uCisgKi8KK3N0YXRpYyBpbnQKK0NvbXBMb2NhdGlvbihjb25zdCB2 b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWludAkJCWwgPSAoKGNvbnN0IExvY2F0aW9uTGVu ICopIGEpLT5sb2NhdGlvbjsKKwlpbnQJCQlyID0gKChjb25zdCBMb2NhdGlvbkxlbiAqKSBiKS0+ bG9jYXRpb247CisKKwlyZXR1cm4gcGdfY21wX3MzMihsLCByKTsKK30KKworLyoKKyAqIEdpdmVu IGEgdmFsaWQgU1FMIHN0cmluZyBhbmQgYW4gYXJyYXkgb2YgY29uc3RhbnQtbG9jYXRpb24gcmVj b3JkcywKKyAqIGZpbGwgaW4gdGhlIHRleHR1YWwgbGVuZ3RocyBvZiB0aG9zZSBjb25zdGFudHMg aW4gSnVtYmxlU3RhdGUuCisgKgorICogVGhlIGNvbnN0YW50cyBtYXkgdXNlIGFueSBhbGxvd2Vk IGNvbnN0YW50IHN5bnRheCwgc3VjaCBhcyBmbG9hdCBsaXRlcmFscywKKyAqIGJpdC1zdHJpbmdz LCBzaW5nbGUtcXVvdGVkIHN0cmluZ3MgYW5kIGRvbGxhci1xdW90ZWQgc3RyaW5ncy4gIFRoaXMg aXMKKyAqIGFjY29tcGxpc2hlZCBieSB1c2luZyB0aGUgcHVibGljIEFQSSBmb3IgdGhlIGNvcmUg c2Nhbm5lci4KKyAqCisgKiBNdWx0aXBsZSBjb25zdGFudHMgY2FuIGhhdmUgdGhlIHNhbWUgbG9j YXRpb24uICBXZSByZXNldCBsZW5ndGhzIG9mIHRob3NlCisgKiBwYXN0IHRoZSBmaXJzdCB0byAt MSBzbyB0aGF0IHRoZXkgY2FuIGxhdGVyIGJlIGlnbm9yZWQuCisgKgorICogSWYgcXVlcnlfbG9j ID4gMCwgdGhlbiAicXVlcnkiIGhhcyBiZWVuIGFkdmFuY2VkIGJ5IHRoYXQgbXVjaCBjb21wYXJl ZCB0bworICogdGhlIG9yaWdpbmFsIHN0cmluZyBzdGFydCwgYXMgaXMgdGhlIGNhc2Ugd2l0aCBt dWx0aS1zdGF0ZW1lbnQgc3RyaW5ncywgc28KKyAqIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoZSBw cm92aWRlZCBsb2NhdGlvbnMgdG8gY29tcGVuc2F0ZS4gIChUaGlzIGxldHMgdXMKKyAqIGF2b2lk IHJlLXNjYW5uaW5nIHN0YXRlbWVudHMgYmVmb3JlIHRoZSBvbmUgb2YgaW50ZXJlc3QsIHNvIGl0 J3Mgd29ydGggZG9pbmcuKQorICoKKyAqIE4uQi4gVGhlcmUgaXMgYW4gYXNzdW1wdGlvbiB0aGF0 IGEgJy0nIGNoYXJhY3RlciBhdCBhIENvbnN0IGxvY2F0aW9uIGJlZ2lucworICogYSBuZWdhdGl2 ZSBudW1lcmljIGNvbnN0YW50LiAgVGhpcyBwcmVjbHVkZXMgdGhlcmUgZXZlciBiZWluZyBhbm90 aGVyCisgKiByZWFzb24gZm9yIGEgY29uc3RhbnQgdG8gc3RhcnQgd2l0aCBhICctJy4KKyAqLwor c3RhdGljIHZvaWQKK1NldENvbnN0YW50TGVuZ3RocyhKdW1ibGVTdGF0ZSAqanN0YXRlLCBjb25z dCBjaGFyICpxdWVyeSwKKwkJCQkgICBpbnQgcXVlcnlfbG9jKQoreworCUxvY2F0aW9uTGVuICps b2NzOworCWNvcmVfeXlzY2FuX3QgeXlzY2FubmVyOworCWNvcmVfeXlfZXh0cmFfdHlwZSB5eWV4 dHJhOworCWNvcmVfWVlTVFlQRSB5eWx2YWw7CisJWVlMVFlQRQkJeXlsbG9jOworCisJLyoKKwkg KiBTb3J0IHRoZSByZWNvcmRzIGJ5IGxvY2F0aW9uIHNvIHRoYXQgd2UgY2FuIHByb2Nlc3MgdGhl bSBpbiBvcmRlciB3aGlsZQorCSAqIHNjYW5uaW5nIHRoZSBxdWVyeSB0ZXh0LgorCSAqLworCWlm IChqc3RhdGUtPmNsb2NhdGlvbnNfY291bnQgPiAxKQorCQlxc29ydChqc3RhdGUtPmNsb2NhdGlv bnMsIGpzdGF0ZS0+Y2xvY2F0aW9uc19jb3VudCwKKwkJCSAgc2l6ZW9mKExvY2F0aW9uTGVuKSwg Q29tcExvY2F0aW9uKTsKKwlsb2NzID0ganN0YXRlLT5jbG9jYXRpb25zOworCisJLyogaW5pdGlh bGl6ZSB0aGUgZmxleCBzY2FubmVyIC0tLSBzaG91bGQgbWF0Y2ggcmF3X3BhcnNlcigpICovCisJ eXlzY2FubmVyID0gc2Nhbm5lcl9pbml0KHF1ZXJ5LAorCQkJCQkJCSAmeXlleHRyYSwKKwkJCQkJ CQkgJlNjYW5LZXl3b3JkcywKKwkJCQkJCQkgU2NhbktleXdvcmRUb2tlbnMpOworCisJLyogU2Vh cmNoIGZvciBlYWNoIGNvbnN0YW50LCBpbiBzZXF1ZW5jZSAqLworCWZvciAoaW50IGkgPSAwOyBp IDwganN0YXRlLT5jbG9jYXRpb25zX2NvdW50OyBpKyspCisJeworCQlpbnQJCQlsb2M7CisJCWlu dAkJCXRvazsKKworCQkvKiBJZ25vcmUgY29uc3RhbnRzIGFmdGVyIHRoZSBmaXJzdCBvbmUgaW4g dGhlIHNhbWUgbG9jYXRpb24gKi8KKwkJaWYgKGkgPiAwICYmIGxvY3NbaV0ubG9jYXRpb24gPT0g bG9jc1tpIC0gMV0ubG9jYXRpb24pCisJCXsKKwkJCWxvY3NbaV0ubGVuZ3RoID0gLTE7CisJCQlj b250aW51ZTsKKwkJfQorCisJCWlmIChsb2NzW2ldLnNxdWFzaGVkKQorCQkJY29udGludWU7CQkJ Lyogc3F1YXNoYWJsZSBsaXN0LCBpZ25vcmUgKi8KKworCQkvKgorCQkgKiBBZGp1c3QgdGhlIGNv bnN0YW50J3MgbG9jYXRpb24gdXNpbmcgdGhlIHByb3ZpZGVkIHN0YXJ0aW5nIGxvY2F0aW9uCisJ CSAqIG9mIHRoZSBjdXJyZW50IHN0YXRlbWVudC4gVGhpcyBhbGxvd3MgdXMgdG8gYXZvaWQgc2Nh bm5pbmcgYQorCQkgKiBtdWx0aS1zdGF0ZW1lbnQgc3RyaW5nIGZyb20gdGhlIGJlZ2lubmluZy4K KwkJICovCisJCWxvYyA9IGxvY3NbaV0ubG9jYXRpb24gLSBxdWVyeV9sb2M7CisJCUFzc2VydChs b2MgPj0gMCk7CisKKwkJLyoKKwkJICogV2UgaGF2ZSBhIHZhbGlkIGxvY2F0aW9uIGZvciBhIGNv bnN0YW50IHRoYXQncyBub3QgYSBkdXBlLiBMZXgKKwkJICogdG9rZW5zIHVudGlsIHdlIGZpbmQg dGhlIGRlc2lyZWQgY29uc3RhbnQuCisJCSAqLworCQlmb3IgKDs7KQorCQl7CisJCQl0b2sgPSBj b3JlX3l5bGV4KCZ5eWx2YWwsICZ5eWxsb2MsIHl5c2Nhbm5lcik7CisKKwkJCS8qIFdlIHNob3Vs ZCBub3QgaGl0IGVuZC1vZi1zdHJpbmcsIGJ1dCBpZiB3ZSBkbywgYmVoYXZlIHNhbmVseSAqLwor CQkJaWYgKHRvayA9PSAwKQorCQkJCWJyZWFrOwkJCS8qIG91dCBvZiBpbm5lciBmb3ItbG9vcCAq LworCisJCQkvKgorCQkJICogV2Ugc2hvdWxkIGZpbmQgdGhlIHRva2VuIHBvc2l0aW9uIGV4YWN0 bHksIGJ1dCBpZiB3ZSBzb21laG93CisJCQkgKiBydW4gcGFzdCBpdCwgd29yayB3aXRoIHRoYXQu CisJCQkgKi8KKwkJCWlmICh5eWxsb2MgPj0gbG9jKQorCQkJeworCQkJCWlmIChxdWVyeVtsb2Nd ID09ICctJykKKwkJCQl7CisJCQkJCS8qCisJCQkJCSAqIEl0J3MgYSBuZWdhdGl2ZSB2YWx1ZSAt IHRoaXMgaXMgdGhlIG9uZSBhbmQgb25seSBjYXNlCisJCQkJCSAqIHdoZXJlIHdlIHJlcGxhY2Ug bW9yZSB0aGFuIGEgc2luZ2xlIHRva2VuLgorCQkJCQkgKgorCQkJCQkgKiBEbyBub3QgY29tcGVu c2F0ZSBmb3IgdGhlIHNwZWNpYWwtY2FzZSBhZGp1c3RtZW50IG9mCisJCQkJCSAqIGxvY2F0aW9u IHRvIHRoYXQgb2YgdGhlIGxlYWRpbmcgJy0nIG9wZXJhdG9yIGluIHRoZQorCQkJCQkgKiBldmVu dCBvZiBhIG5lZ2F0aXZlIGNvbnN0YW50IChzZWUgZG9OZWdhdGUoKSBpbgorCQkJCQkgKiBncmFt LnkpLiAgSXQgaXMgYWxzbyB1c2VmdWwgZm9yIG91ciBwdXJwb3NlcyB0byBzdGFydAorCQkJCQkg KiBmcm9tIHRoZSBtaW51cyBzeW1ib2wuICBJbiB0aGlzIHdheSwgcXVlcmllcyBsaWtlCisJCQkJ CSAqICJzZWxlY3QgKiBmcm9tIGZvbyB3aGVyZSBiYXIgPSAxIiBhbmQgInNlbGVjdCAqIGZyb20K KwkJCQkJICogZm9vIHdoZXJlIGJhciA9IC0yIiB3aWxsIGhhdmUgaWRlbnRpY2FsIG5vcm1hbGl6 ZWQKKwkJCQkJICogcXVlcnkgc3RyaW5ncy4KKwkJCQkJICovCisJCQkJCXRvayA9IGNvcmVfeXls ZXgoJnl5bHZhbCwgJnl5bGxvYywgeXlzY2FubmVyKTsKKwkJCQkJaWYgKHRvayA9PSAwKQorCQkJ CQkJYnJlYWs7CS8qIG91dCBvZiBpbm5lciBmb3ItbG9vcCAqLworCQkJCX0KKworCQkJCS8qCisJ CQkJICogV2Ugbm93IHJlbHkgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBmbGV4IGhhcyBwbGFjZWQg YSB6ZXJvCisJCQkJICogYnl0ZSBhZnRlciB0aGUgdGV4dCBvZiB0aGUgY3VycmVudCB0b2tlbiBp biBzY2FuYnVmLgorCQkJCSAqLworCQkJCWxvY3NbaV0ubGVuZ3RoID0gc3RybGVuKHl5ZXh0cmEu c2NhbmJ1ZiArIGxvYyk7CisJCQkJYnJlYWs7CQkJLyogb3V0IG9mIGlubmVyIGZvci1sb29wICov CisJCQl9CisJCX0KKworCQkvKiBJZiB3ZSBoaXQgZW5kLW9mLXN0cmluZywgZ2l2ZSB1cCwgbGVh dmluZyByZW1haW5pbmcgbGVuZ3RocyAtMSAqLworCQlpZiAodG9rID09IDApCisJCQlicmVhazsK Kwl9CisKKwlzY2FubmVyX2ZpbmlzaCh5eXNjYW5uZXIpOworfQorCisvKgorICogR2VuZXJhdGUg YSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIHF1ZXJ5IHN0cmluZyB0aGF0IHdpbGwgYmUgdXNl ZCB0bworICogcmVwcmVzZW50IGFsbCBzaW1pbGFyIHF1ZXJpZXMuCisgKgorICogKnF1ZXJ5X2xl bl9wIGNvbnRhaW5zIHRoZSBpbnB1dCBzdHJpbmcgbGVuZ3RoLCBhbmQgaXMgdXBkYXRlZCB3aXRo CisgKiB0aGUgcmVzdWx0IHN0cmluZyBsZW5ndGggb24gZXhpdC4gIFRoZSByZXN1bHRpbmcgc3Ry aW5nIG1pZ2h0IGJlIGxvbmdlcgorICogb3Igc2hvcnRlciBkZXBlbmRpbmcgb24gd2hhdCBoYXBw ZW5zIHdpdGggcmVwbGFjZW1lbnQgb2YgY29uc3RhbnRzLgorICoKKyAqIFNpbWlsYXIgdG8gU2V0 Q29uc3RhbnRMZW5ndGhzLCB3ZSBtdXN0IGFsc28gdHJhbnNsYXRlIHRoZSBwcm92aWRlZCBsb2Nh dGlvbgorICogdG8gY29tcGVuc2F0ZSBmb3IgbXVsdGktc3RhdGVtZW50IHN0cmluZ3MuCisgKgor ICogSXQgaXMgdGhlIGNhbGxlcidzIGpvYiB0byBlbnN1cmUgdGhhdCB0aGUgc3RyaW5nIGlzIGEg dmFsaWQgU1FMIHN0YXRlbWVudAorICogd2l0aCB0aGUgY29ycmVjdCBjb25zdGFudCBsb2NhdGlv bnMgaW4ganN0YXRlLT5jbG9jYXRpb25zLiBTaW5jZSBpbgorICogcHJhY3RpY2UgdGhlIHN0cmlu ZyBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCB1c2luZyB0aGUgYXV0aG9yaXRhdGl2ZSBwYXJzZXIK KyAqIGFuZCB0aGUgbG9jYXRpb25zIGFyZSBzZXQgYnkgY29yZSBxdWVyeSBqdW1ibGluZywgdGhp cyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbS4KKyAqCisgKiBSZXR1cm5zIGEgcGFsbG9jJ2Qgc3Ry aW5nLgorICovCitjaGFyICoKK0dlbmVyYXRlTm9ybWFsaXplZFF1ZXJ5KEp1bWJsZVN0YXRlICpq c3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAorCQkJCQkJaW50IHF1ZXJ5X2xvYywgaW50ICpxdWVy eV9sZW5fcCkKK3sKKwljaGFyCSAgICpub3JtX3F1ZXJ5OworCWludAkJCXF1ZXJ5X2xlbiA9ICpx dWVyeV9sZW5fcDsKKwlpbnQJCQlub3JtX3F1ZXJ5X2J1ZmxlbiwJLyogU3BhY2UgYWxsb3dlZCBm b3Igbm9ybV9xdWVyeSAqLworCQkJCWxlbl90b193cnQsCQkvKiBMZW5ndGggKGluIGJ5dGVzKSB0 byB3cml0ZSAqLworCQkJCXF1ZXJfbG9jID0gMCwJLyogU291cmNlIHF1ZXJ5IGJ5dGUgbG9jYXRp b24gKi8KKwkJCQluX3F1ZXJfbG9jID0gMCwgLyogTm9ybWFsaXplZCBxdWVyeSBieXRlIGxvY2F0 aW9uICovCisJCQkJbGFzdF9vZmYgPSAwLAkvKiBPZmZzZXQgZnJvbSBzdGFydCBmb3IgcHJldmlv dXMgdG9rICovCisJCQkJbGFzdF90b2tfbGVuID0gMDsJLyogTGVuZ3RoIChpbiBieXRlcykgb2Yg dGhhdCB0b2sgKi8KKwlpbnQJCQludW1fY29uc3RhbnRzX3JlcGxhY2VkID0gMDsKKworCS8qCisJ ICogU2V0IGNvbnN0YW50cycgbGVuZ3RocyBpbiBKdW1ibGVTdGF0ZSwgYXMgb25seSBsb2NhdGlv bnMgYXJlIHNldCBkdXJpbmcKKwkgKiBEb0p1bWJsZSgpLiBOb3RlIHRoaXMgYWxzbyBlbnN1cmVz IHRoZSBpdGVtcyBhcmUgc29ydGVkIGJ5IGxvY2F0aW9uLgorCSAqLworCVNldENvbnN0YW50TGVu Z3Rocyhqc3RhdGUsIHF1ZXJ5LCBxdWVyeV9sb2MpOworCisJLyoKKwkgKiBBbGxvdyBmb3IgJG4g c3ltYm9scyB0byBiZSBsb25nZXIgdGhhbiB0aGUgY29uc3RhbnRzIHRoZXkgcmVwbGFjZS4KKwkg KiBDb25zdGFudHMgbXVzdCB0YWtlIGF0IGxlYXN0IG9uZSBieXRlIGluIHRleHQgZm9ybSwgd2hp bGUgYSAkbiBzeW1ib2wKKwkgKiBjZXJ0YWlubHkgaXNuJ3QgbW9yZSB0aGFuIDExIGJ5dGVzLCBl dmVuIGlmIG4gcmVhY2hlcyBJTlRfTUFYLiAgV2UKKwkgKiBjb3VsZCByZWZpbmUgdGhhdCBsaW1p dCBiYXNlZCBvbiB0aGUgbWF4IHZhbHVlIG9mIG4gZm9yIHRoZSBjdXJyZW50CisJICogcXVlcnks IGJ1dCBpdCBoYXJkbHkgc2VlbXMgd29ydGggYW55IGV4dHJhIGVmZm9ydCB0byBkbyBzby4KKwkg Ki8KKwlub3JtX3F1ZXJ5X2J1ZmxlbiA9IHF1ZXJ5X2xlbiArIGpzdGF0ZS0+Y2xvY2F0aW9uc19j b3VudCAqIDEwOworCisJLyogQWxsb2NhdGUgcmVzdWx0IGJ1ZmZlciAqLworCW5vcm1fcXVlcnkg PSBwYWxsb2Mobm9ybV9xdWVyeV9idWZsZW4gKyAxKTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwg anN0YXRlLT5jbG9jYXRpb25zX2NvdW50OyBpKyspCisJeworCQlpbnQJCQlvZmYsCQkvKiBPZmZz ZXQgZnJvbSBzdGFydCBmb3IgY3VyIHRvayAqLworCQkJCQl0b2tfbGVuOwkvKiBMZW5ndGggKGlu IGJ5dGVzKSBvZiB0aGF0IHRvayAqLworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgYW4gZXh0ZXJu YWwgcGFyYW0gYXQgdGhpcyBsb2NhdGlvbiwgYnV0IG5vIGxpc3RzIGFyZQorCQkgKiBiZWluZyBz cXVhc2hlZCBhY3Jvc3MgdGhlIHF1ZXJ5LCB0aGVuIHdlIHNraXAgaGVyZTsgdGhpcyB3aWxsIG1h a2UKKwkJICogdXMgcHJpbnQgdGhlIGNoYXJhY3RlcnMgZm91bmQgaW4gdGhlIG9yaWdpbmFsIHF1 ZXJ5IHRoYXQgcmVwcmVzZW50CisJCSAqIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgaXRlcmF0 aW9uIChvciBhZnRlciB0aGUgbG9vcCBpcyBkb25lKSwKKwkJICogd2hpY2ggaXMgYSBiaXQgb2Rk IGJ1dCBzZWVtcyB0byB3b3JrIG9rYXkgaW4gbW9zdCBjYXNlcy4KKwkJICovCisJCWlmIChqc3Rh dGUtPmNsb2NhdGlvbnNbaV0uZXh0ZXJuX3BhcmFtICYmICFqc3RhdGUtPmhhc19zcXVhc2hlZF9s aXN0cykKKwkJCWNvbnRpbnVlOworCisJCW9mZiA9IGpzdGF0ZS0+Y2xvY2F0aW9uc1tpXS5sb2Nh dGlvbjsKKworCQkvKiBBZGp1c3QgdGhlIGNvbnN0YW50J3MgbG9jYXRpb24gKHNlZSBTZXRDb25z dGFudExlbmd0aHMpICovCisJCW9mZiAtPSBxdWVyeV9sb2M7CisKKwkJdG9rX2xlbiA9IGpzdGF0 ZS0+Y2xvY2F0aW9uc1tpXS5sZW5ndGg7CisKKwkJaWYgKHRva19sZW4gPCAwKQorCQkJY29udGlu dWU7CQkJLyogaWdub3JlIGFueSBkdXBsaWNhdGVzICovCisKKwkJLyogQ29weSBuZXh0IGNodW5r ICh3aGF0IHByZWNlZGVzIHRoZSBuZXh0IGNvbnN0YW50KSAqLworCQlsZW5fdG9fd3J0ID0gb2Zm IC0gbGFzdF9vZmY7CisJCWxlbl90b193cnQgLT0gbGFzdF90b2tfbGVuOworCQlBc3NlcnQobGVu X3RvX3dydCA+PSAwKTsKKwkJbWVtY3B5KG5vcm1fcXVlcnkgKyBuX3F1ZXJfbG9jLCBxdWVyeSAr IHF1ZXJfbG9jLCBsZW5fdG9fd3J0KTsKKwkJbl9xdWVyX2xvYyArPSBsZW5fdG9fd3J0OworCisJ CS8qCisJCSAqIEFuZCBpbnNlcnQgYSBwYXJhbSBzeW1ib2wgaW4gcGxhY2Ugb2YgdGhlIGNvbnN0 YW50IHRva2VuOyBhbmQsIGlmCisJCSAqIHdlIGhhdmUgYSBzcXVhc2hhYmxlIGxpc3QsIGluc2Vy dCBhIHBsYWNlaG9sZGVyIGNvbW1lbnQgc3RhcnRpbmcKKwkJICogZnJvbSB0aGUgbGlzdCdzIHNl Y29uZCB2YWx1ZS4KKwkJICovCisJCW5fcXVlcl9sb2MgKz0gc3ByaW50Zihub3JtX3F1ZXJ5ICsg bl9xdWVyX2xvYywgIiQlZCVzIiwKKwkJCQkJCQkgIG51bV9jb25zdGFudHNfcmVwbGFjZWQgKyAx ICsganN0YXRlLT5oaWdoZXN0X2V4dGVybl9wYXJhbV9pZCwKKwkJCQkJCQkgIGpzdGF0ZS0+Y2xv Y2F0aW9uc1tpXS5zcXVhc2hlZCA/ICIgLyosIC4uLiAqLyIgOiAiIik7CisJCW51bV9jb25zdGFu dHNfcmVwbGFjZWQrKzsKKworCQkvKiBtb3ZlIGZvcndhcmQgKi8KKwkJcXVlcl9sb2MgPSBvZmYg KyB0b2tfbGVuOworCQlsYXN0X29mZiA9IG9mZjsKKwkJbGFzdF90b2tfbGVuID0gdG9rX2xlbjsK Kwl9CisKKwkvKgorCSAqIFdlJ3ZlIGNvcGllZCB1cCB1bnRpbCB0aGUgbGFzdCBpZ25vcmFibGUg Y29uc3RhbnQuICBDb3B5IG92ZXIgdGhlCisJICogcmVtYWluaW5nIGJ5dGVzIG9mIHRoZSBvcmln aW5hbCBxdWVyeSBzdHJpbmcuCisJICovCisJbGVuX3RvX3dydCA9IHF1ZXJ5X2xlbiAtIHF1ZXJf bG9jOworCisJQXNzZXJ0KGxlbl90b193cnQgPj0gMCk7CisJbWVtY3B5KG5vcm1fcXVlcnkgKyBu X3F1ZXJfbG9jLCBxdWVyeSArIHF1ZXJfbG9jLCBsZW5fdG9fd3J0KTsKKwluX3F1ZXJfbG9jICs9 IGxlbl90b193cnQ7CisKKwlBc3NlcnQobl9xdWVyX2xvYyA8PSBub3JtX3F1ZXJ5X2J1Zmxlbik7 CisJbm9ybV9xdWVyeVtuX3F1ZXJfbG9jXSA9ICdcMCc7CisKKwkqcXVlcnlfbGVuX3AgPSBuX3F1 ZXJfbG9jOworCXJldHVybiBub3JtX3F1ZXJ5OworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUv bm9kZXMvcXVlcnlqdW1ibGUuaCBiL3NyYy9pbmNsdWRlL25vZGVzL3F1ZXJ5anVtYmxlLmgKaW5k ZXggOWY4MTg5MzAwM2MuLmUzNTRmODU3YzM3IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rl cy9xdWVyeWp1bWJsZS5oCisrKyBiL3NyYy9pbmNsdWRlL25vZGVzL3F1ZXJ5anVtYmxlLmgKQEAg LTkxLDYgKzkxLDggQEAgZXh0ZXJuIFBHRExMSU1QT1JUIGludCBjb21wdXRlX3F1ZXJ5X2lkOwog CiAKIGV4dGVybiBjb25zdCBjaGFyICpDbGVhblF1ZXJ5dGV4dChjb25zdCBjaGFyICpxdWVyeSwg aW50ICpsb2NhdGlvbiwgaW50ICpsZW4pOworZXh0ZXJuIGNoYXIgKkdlbmVyYXRlTm9ybWFsaXpl ZFF1ZXJ5KEp1bWJsZVN0YXRlICpqc3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAorCQkJCQkJCQkJ IGludCBxdWVyeV9sb2MsIGludCAqcXVlcnlfbGVuX3ApOwogZXh0ZXJuIEp1bWJsZVN0YXRlICpK dW1ibGVRdWVyeShRdWVyeSAqcXVlcnkpOwogZXh0ZXJuIHZvaWQgRW5hYmxlUXVlcnlJZCh2b2lk KTsKIAotLSAKMi40Ny4zCgo= --000000000000d28c37064de50530--