Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hnQiK-00040t-Pg for pgsql-hackers@arkaria.postgresql.org; Tue, 16 Jul 2019 16:54:05 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1hnQiI-0006oA-Kg for pgsql-hackers@arkaria.postgresql.org; Tue, 16 Jul 2019 16:54:02 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hnQiI-0006o3-BC for pgsql-hackers@lists.postgresql.org; Tue, 16 Jul 2019 16:54:02 +0000 Received: from mail-qt1-f194.google.com ([209.85.160.194]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hnQiE-0005CH-Es for pgsql-hackers@postgresql.org; Tue, 16 Jul 2019 16:54:01 +0000 Received: by mail-qt1-f194.google.com with SMTP id n11so20295400qtl.5 for ; Tue, 16 Jul 2019 09:53:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:reply-to:subject:to:cc:references:from :organization:message-id:date:user-agent:mime-version:in-reply-to :content-language; bh=hGzPycqiPOUNDZUrXBmrMgbYHTHMd+tQ7Ei+hH9xfAk=; b=PnFRW6saFNYvORvcysF82vuYhzYGq3CGNx0v5lUFT576AnUnO2Y5D5H9xq/HXgH6zt APWdEyFANH9z0Tu2XpSI996LiShfZJFF04oFQ8XUPk8zeAoqBKJSDKOpIUwdvldLlA3L iWvLRXVdqba80DA+bBoFHgAUe439is9kJej6jiXo8RX9jtCSaE5Aqvs/j9BYvc5YS1Wx ZdJu80wrjC2OWqa+nJHsJDl5TFZkrdLUEfkRs9z6MoykVVmu9vJ7OXBUnSl4avzuMh1O fMj9L2rdaJGQtO5mcHCyQ9PkJTdExRe684esAu2xC0OaLV/QUvlkP5OfSk2+3ijNUUM1 lmAA== X-Gm-Message-State: APjAAAUfXqc0+ve3pOKEMErnC9uo0o4HiW8vBtld4djF6OqV6X1Z5wIz rPfSqzhTcERRjIEThEvCgYFEPw== X-Google-Smtp-Source: APXvYqx/ceviw9E/p2ele5JPFXsCgrV0yeauHXUL//FZo2WaaW5VfWh5ZfFvrbeLvFwjb1M1pL0aUg== X-Received: by 2002:ac8:16a2:: with SMTP id r31mr23609311qtj.302.1563296036062; Tue, 16 Jul 2019 09:53:56 -0700 (PDT) Received: from localhost.localdomain (c-24-61-8-151.hsd1.ma.comcast.net. [24.61.8.151]) by smtp.gmail.com with ESMTPSA id g54sm12767433qtc.61.2019.07.16.09.53.53 (version=TLS1_3 cipher=AEAD-AES128-GCM-SHA256 bits=128/128); Tue, 16 Jul 2019 09:53:54 -0700 (PDT) Reply-To: jesper.pedersen@redhat.com Subject: Re: Index Skip Scan To: David Rowley Cc: Dmitry Dolgov <9erthalion6@gmail.com>, Floris Van Nee , Thomas Munro , James Coleman , Rafia Sabih , Jeff Janes , Peter Geoghegan , Tomas Vondra , Thomas Munro , Bhushan Uparkar , PostgreSQL-development , Alexander Korotkov References: <2685f020-f302-9bf6-1b5c-ebc2bcebc635@2ndquadrant.com> <1559763453006.85615@Optiver.com> <1559763570329.85227@Optiver.com> <4d469bf2-49ff-bc3d-a428-6c7b5d87d526@redhat.com> <1562769595280.16860@Optiver.com> From: Jesper Pedersen Organization: Red Hat Message-ID: <5e8f78fe-fcd5-b0e8-628b-4ab2bbcba5ab@redhat.com> Date: Tue, 16 Jul 2019 12:53:53 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------076FABCFD5D773A69CB68568" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------076FABCFD5D773A69CB68568 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Hi David, On 7/11/19 7:38 AM, David Rowley wrote: > The UniqueKeys idea is quite separate from pathkeys. Currently, a > Path can have a List of PathKeys which define the order that the > tuples will be read from the Plan node that's created from that Path. > The idea with UniqueKeys is that a Path can also have a non-empty List > of UniqueKeys to define that there will be no more than 1 row with the > same value for the Paths UniqueKey column/exprs. > > As of now, if you look at standard_qp_callback() sets > root->query_pathkeys, the idea here would be that the callback would > also set a new List field named "query_uniquekeys" based on the > group_pathkeys when non-empty and !root->query->hasAggs, or by using > the distinct clause if it's non-empty. Then in build_index_paths() > around the call to match_pathkeys_to_index() we'll probably also want > to check if the index can support UniqueKeys that would suit the > query_uniquekeys that were set during standard_qp_callback(). > > As for setting query_uniquekeys in standard_qp_callback(), this should > be simply a matter of looping over either group_pathkeys or > distinct_pathkeys and grabbing the pk_eclass from each key and making > a canonical UniqueKey from that. To have these canonical you'll need > to have a new field in PlannerInfo named canon_uniquekeys which will > do for UniqueKeys what canon_pathkeys does for PathKeys. So you'll > need an equivalent of make_canonical_pathkey() in uniquekey.c > > With this implementation, the code that the patch adds in > create_distinct_paths() can mostly disappear. You'd only need to look > for a path that uniquekeys_contained_in() matches the > root->query_uniquekeys and then just leave it to > set_cheapest(distinct_rel); to pick the cheapest path. > > It would be wasted effort to create paths with UniqueKeys if there's > multiple non-dead base rels in the query as the final rel in > create_distinct_paths would be a join rel, so it might be worth > checking that before creating such index paths in build_index_paths(). > However, down the line, we could carry the uniquekeys forward into the > join paths if the join does not duplicate rows from the other side of > the join... That's future stuff though, not for this patch, I don't > think. > > I think a UniqueKey can just be a struct similar to PathKey, e.g be > located in pathnodes.h around where PathKey is defined. Likely we'll > need a uniquekeys.c file that has the equivalent to > pathkeys_contained_in() ... uniquekeys_contained_in(), which return > true if arg1 is a superset of arg2 rather than check for one set being > a prefix of another. As you mention above: UniqueKeys { x, y } == > UniqueKeys { y, x }. That superset check could perhaps be optimized > by sorting UniqueKey lists in memory address order, that'll save > having a nested loop, but likely that's not going to be required for a > first cut version. This would work since you'd want UniqueKeys to be > canonical the same as PathKeys are (Notice that compare_pathkeys() > only checks memory addresses of pathkeys and not equals()). > > I think the UniqueKey struct would only need to contain an > EquivalenceClass field. I think all the other stuff that's in PathKey > is irrelevant to UniqueKey. > Here is a patch more in that direction. Some questions: 1) Do we really need the UniqueKey struct ? If it only contains the EquivalenceClass field then we could just have a list of those instead. That would make the patch simpler. 2) Do we need both canon_uniquekeys and query_uniquekeys ? Currently the patch only uses canon_uniquekeys because the we attach the list directly on the Path node. I'll clean the patch up based on your feedback, and then start to rebase v21 on it. Thanks in advance ! Best regards, Jesper --------------076FABCFD5D773A69CB68568 Content-Type: text/plain; charset=UTF-8; name="v2_uniquekey.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="v2_uniquekey.txt" RnJvbSAxNzRhNjQyNTAzNmUyZDRjYTdkM2Q2OGM2MzVjZDU1YTU4YTliOWU2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBqZXNwZXJwZWRlcnNlbiA8amVzcGVyLnBlZGVyc2Vu QHJlZGhhdC5jb20+CkRhdGU6IFR1ZSwgOSBKdWwgMjAxOSAwNjo0NDo1NyAtMDQwMApTdWJq ZWN0OiBbUEFUQ0hdIFVuaXF1ZUtleQoKLS0tCiBzcmMvYmFja2VuZC9ub2Rlcy9wcmludC5j ICAgICAgICAgICAgICB8ICAzOSArKysrKysrCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0 aC9NYWtlZmlsZSAgICB8ICAgMiArLQogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvYWxs cGF0aHMuYyAgfCAgIDggKysKIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXpl LmMgIHwgICA1ICsKIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMgIHwg IDM5ICsrKysrKysKIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL3VuaXF1ZWtleS5jIHwg MTQ5ICsrKysrKysrKysrKysrKysrKysrKysrKysKIHNyYy9iYWNrZW5kL29wdGltaXplci9w bGFuL3BsYW5uZXIuYyAgIHwgIDEyICstCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9w YXRobm9kZS5jICB8ICAxMiArKwogc3JjL2luY2x1ZGUvbm9kZXMvbm9kZXMuaCAgICAgICAg ICAgICAgfCAgIDEgKwogc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmggICAgICAgICAg fCAgMTggKysrCiBzcmMvaW5jbHVkZS9ub2Rlcy9wcmludC5oICAgICAgICAgICAgICB8ICAg MiArLQogc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhub2RlLmggICAgICAgfCAgIDEgKwog c3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhzLmggICAgICAgICAgfCAgIDggKysKIDEzIGZp bGVzIGNoYW5nZWQsIDI5MyBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL3VuaXF1ZWtleS5jCgpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvbm9kZXMvcHJpbnQuYyBiL3NyYy9iYWNrZW5kL25v ZGVzL3ByaW50LmMKaW5kZXggNGVjZGU2YjQyMS4uZWQ1Njg0YmYxOSAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvbm9kZXMvcHJpbnQuYworKysgYi9zcmMvYmFja2VuZC9ub2Rlcy9wcmlu dC5jCkBAIC00NTksNiArNDU5LDQ1IEBAIHByaW50X3BhdGhrZXlzKGNvbnN0IExpc3QgKnBh dGhrZXlzLCBjb25zdCBMaXN0ICpydGFibGUpCiAJcHJpbnRmKCIpXG4iKTsKIH0KIAorLyoK KyAqIHByaW50X3VuaXF1ZV9rZXlzIC0KKyAqCSAgdW5pcXVlX2tleSBhbiBVbmlxdWVLZXkK KyAqLwordm9pZAorcHJpbnRfdW5pcXVlX2tleXMoY29uc3QgTGlzdCAqdW5pcXVlX2tleXMs IGNvbnN0IExpc3QgKnJ0YWJsZSkKK3sKKwlMaXN0Q2VsbCAgICpsOworCisJcHJpbnRmKCIo Iik7CisJZm9yZWFjaChsLCB1bmlxdWVfa2V5cykKKwl7CisJCVVuaXF1ZUtleSAqdW5pcXVl X2tleSA9IChVbmlxdWVLZXkgKikgbGZpcnN0KGwpOworCQlFcXVpdmFsZW5jZUNsYXNzICpl Y2xhc3MgPSAoRXF1aXZhbGVuY2VDbGFzcyAqKSB1bmlxdWVfa2V5LT5lcV9jbGF1c2U7CisJ CUxpc3RDZWxsICAgKms7CisJCWJvb2wJCWZpcnN0ID0gdHJ1ZTsKKworCQkvKiBjaGFzZSB1 cCAqLworCQl3aGlsZSAoZWNsYXNzLT5lY19tZXJnZWQpCisJCQllY2xhc3MgPSBlY2xhc3Mt PmVjX21lcmdlZDsKKworCQlwcmludGYoIigiKTsKKwkJZm9yZWFjaChrLCBlY2xhc3MtPmVj X21lbWJlcnMpCisJCXsKKwkJCUVxdWl2YWxlbmNlTWVtYmVyICptZW0gPSAoRXF1aXZhbGVu Y2VNZW1iZXIgKikgbGZpcnN0KGspOworCisJCQlpZiAoZmlyc3QpCisJCQkJZmlyc3QgPSBm YWxzZTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiwgIik7CisJCQlwcmludF9leHByKChOb2Rl ICopIG1lbS0+ZW1fZXhwciwgcnRhYmxlKTsKKwkJfQorCQlwcmludGYoIikiKTsKKwkJaWYg KGxuZXh0KHVuaXF1ZV9rZXlzLCBsKSkKKwkJCXByaW50ZigiLCAiKTsKKwl9CisJcHJpbnRm KCIpXG4iKTsKK30KKwogLyoKICAqIHByaW50X3RsCiAgKgkgIHByaW50IHRhcmdldGxpc3Qg aW4gYSBtb3JlIGxlZ2libGUgd2F5LgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BhdGgvTWFrZWZpbGUgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9NYWtlZmls ZQppbmRleCA2ODY0YTYyMTMyLi44MjQ5YTZiNmRiIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9vcHRpbWl6ZXIvcGF0aC9NYWtlZmlsZQorKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGF0aC9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNiBAQCB0b3BfYnVpbGRkaXIgPSAuLi8uLi8u Li8uLgogaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvc3JjL01ha2VmaWxlLmdsb2JhbAogCiBP QkpTID0gYWxscGF0aHMubyBjbGF1c2VzZWwubyBjb3N0c2l6ZS5vIGVxdWl2Y2xhc3MubyBp bmR4cGF0aC5vIFwKLSAgICAgICBqb2lucGF0aC5vIGpvaW5yZWxzLm8gcGF0aGtleXMubyB0 aWRwYXRoLm8KKyAgICAgICBqb2lucGF0aC5vIGpvaW5yZWxzLm8gcGF0aGtleXMubyB0aWRw YXRoLm8gdW5pcXVla2V5Lm8KIAogaW5jbHVkZSAkKHRvcF9zcmNkaXIpL3NyYy9iYWNrZW5k L2NvbW1vbi5tawpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvYWxs cGF0aHMuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2FsbHBhdGhzLmMKaW5kZXgg ZTllZTMyYjdmNC4uYWNkMjI2NTNjMiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BhdGgvYWxscGF0aHMuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9h bGxwYXRocy5jCkBAIC0zOTU3LDYgKzM5NTcsMTQgQEAgcHJpbnRfcGF0aChQbGFubmVySW5m byAqcm9vdCwgUGF0aCAqcGF0aCwgaW50IGluZGVudCkKIAkJcHJpbnRfcGF0aGtleXMocGF0 aC0+cGF0aGtleXMsIHJvb3QtPnBhcnNlLT5ydGFibGUpOwogCX0KIAorCWlmIChwYXRoLT51 bmlxdWVfa2V5cykKKwl7CisJCWZvciAoaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKKwkJCXBy aW50ZigiXHQiKTsKKwkJcHJpbnRmKCIgIHVuaXF1ZV9rZXlzOiAiKTsKKwkJcHJpbnRfdW5p cXVlX2tleXMocGF0aC0+dW5pcXVlX2tleXMsIHJvb3QtPnBhcnNlLT5ydGFibGUpOworCX0K KwogCWlmIChqb2luKQogCXsKIAkJSm9pblBhdGggICAqanAgPSAoSm9pblBhdGggKikgcGF0 aDsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMg Yi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jCmluZGV4IDNhOWE5OTQ3 MzMuLjYyZDc4MTVhNzYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRo L2Nvc3RzaXplLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY29zdHNpemUu YwpAQCAtNzA1LDYgKzcwNSwxMSBAQCBjb3N0X2luZGV4KEluZGV4UGF0aCAqcGF0aCwgUGxh bm5lckluZm8gKnJvb3QsIGRvdWJsZSBsb29wX2NvdW50LAogCQlwYXRoLT5wYXRoLnBhcmFs bGVsX2F3YXJlID0gdHJ1ZTsKIAl9CiAKKwkvKiBDb25zaWRlciBjb3N0IGJhc2VkIG9uIHVu aXF1ZSBrZXkgKi8KKwlpZiAocGF0aC0+cGF0aC51bmlxdWVfa2V5cykKKwl7CisJfQorCiAJ LyoKIAkgKiBOb3cgaW50ZXJwb2xhdGUgYmFzZWQgb24gZXN0aW1hdGVkIGluZGV4IG9yZGVy IGNvcnJlbGF0aW9uIHRvIGdldCB0b3RhbAogCSAqIGRpc2sgSS9PIGNvc3QgZm9yIG1haW4g dGFibGUgYWNjZXNzZXMuCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0 aC9pbmR4cGF0aC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwpp bmRleCA1ZjMzOWZkZmRlLi5mMDUzZWU2Nzk0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9w YXRoL2luZHhwYXRoLmMKQEAgLTE4OSw2ICsxODksNyBAQCBzdGF0aWMgRXhwciAqbWF0Y2hf Y2xhdXNlX3RvX29yZGVyaW5nX29wKEluZGV4T3B0SW5mbyAqaW5kZXgsCiBzdGF0aWMgYm9v bCBlY19tZW1iZXJfbWF0Y2hlc19pbmRleGNvbChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqcmVsLAogCQkJCQkJCQkJICAgRXF1aXZhbGVuY2VDbGFzcyAqZWMsIEVxdWl2YWxl bmNlTWVtYmVyICplbSwKIAkJCQkJCQkJCSAgIHZvaWQgKmFyZyk7CitzdGF0aWMgTGlzdCAq Z2V0X3VuaXF1ZWtleXNfZm9yX2luZGV4KFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpwYXRo a2V5cyk7CiAKIAogLyoKQEAgLTg3NCw2ICs4NzUsNyBAQCBidWlsZF9pbmRleF9wYXRocyhQ bGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCUxpc3QJICAgKm9yZGVyYnlj bGF1c2Vjb2xzOwogCUxpc3QJICAgKmluZGV4X3BhdGhrZXlzOwogCUxpc3QJICAgKnVzZWZ1 bF9wYXRoa2V5czsKKwlMaXN0CSAgICp1c2VmdWxfdW5pcXVla2V5czsKIAlib29sCQlmb3Vu ZF9sb3dlcl9zYW9wX2NsYXVzZTsKIAlib29sCQlwYXRoa2V5c19wb3NzaWJseV91c2VmdWw7 CiAJYm9vbAkJaW5kZXhfaXNfb3JkZXJlZDsKQEAgLTEwMzYsMTEgKzEwMzgsMTQgQEAgYnVp bGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAlp ZiAoaW5kZXhfY2xhdXNlcyAhPSBOSUwgfHwgdXNlZnVsX3BhdGhrZXlzICE9IE5JTCB8fCB1 c2VmdWxfcHJlZGljYXRlIHx8CiAJCWluZGV4X29ubHlfc2NhbikKIAl7CisJCXVzZWZ1bF91 bmlxdWVrZXlzID0gZ2V0X3VuaXF1ZWtleXNfZm9yX2luZGV4KHJvb3QsIHVzZWZ1bF9wYXRo a2V5cyk7CisKIAkJaXBhdGggPSBjcmVhdGVfaW5kZXhfcGF0aChyb290LCBpbmRleCwKIAkJ CQkJCQkJICBpbmRleF9jbGF1c2VzLAogCQkJCQkJCQkgIG9yZGVyYnljbGF1c2VzLAogCQkJ CQkJCQkgIG9yZGVyYnljbGF1c2Vjb2xzLAogCQkJCQkJCQkgIHVzZWZ1bF9wYXRoa2V5cywK KwkJCQkJCQkJICB1c2VmdWxfdW5pcXVla2V5cywKIAkJCQkJCQkJICBpbmRleF9pc19vcmRl cmVkID8KIAkJCQkJCQkJICBGb3J3YXJkU2NhbkRpcmVjdGlvbiA6CiAJCQkJCQkJCSAgTm9N b3ZlbWVudFNjYW5EaXJlY3Rpb24sCkBAIC0xMDYzLDYgKzEwNjgsNyBAQCBidWlsZF9pbmRl eF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkJ ICBvcmRlcmJ5Y2xhdXNlcywKIAkJCQkJCQkJCSAgb3JkZXJieWNsYXVzZWNvbHMsCiAJCQkJ CQkJCQkgIHVzZWZ1bF9wYXRoa2V5cywKKwkJCQkJCQkJCSAgdXNlZnVsX3VuaXF1ZWtleXMs CiAJCQkJCQkJCQkgIGluZGV4X2lzX29yZGVyZWQgPwogCQkJCQkJCQkJICBGb3J3YXJkU2Nh bkRpcmVjdGlvbiA6CiAJCQkJCQkJCQkgIE5vTW92ZW1lbnRTY2FuRGlyZWN0aW9uLApAQCAt MTA5MywxMSArMTA5OSwxNCBAQCBidWlsZF9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkJCQkJCWluZGV4X3BhdGhrZXlzKTsKIAkJ aWYgKHVzZWZ1bF9wYXRoa2V5cyAhPSBOSUwpCiAJCXsKKwkJCXVzZWZ1bF91bmlxdWVrZXlz ID0gZ2V0X3VuaXF1ZWtleXNfZm9yX2luZGV4KHJvb3QsIHVzZWZ1bF9wYXRoa2V5cyk7CisK IAkJCWlwYXRoID0gY3JlYXRlX2luZGV4X3BhdGgocm9vdCwgaW5kZXgsCiAJCQkJCQkJCQkg IGluZGV4X2NsYXVzZXMsCiAJCQkJCQkJCQkgIE5JTCwKIAkJCQkJCQkJCSAgTklMLAogCQkJ CQkJCQkJICB1c2VmdWxfcGF0aGtleXMsCisJCQkJCQkJCQkgIHVzZWZ1bF91bmlxdWVrZXlz LAogCQkJCQkJCQkJICBCYWNrd2FyZFNjYW5EaXJlY3Rpb24sCiAJCQkJCQkJCQkgIGluZGV4 X29ubHlfc2NhbiwKIAkJCQkJCQkJCSAgb3V0ZXJfcmVsaWRzLApAQCAtMTExNSw2ICsxMTI0 LDcgQEAgYnVpbGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KnJlbCwKIAkJCQkJCQkJCQkgIE5JTCwKIAkJCQkJCQkJCQkgIE5JTCwKIAkJCQkJCQkJCQkg IHVzZWZ1bF9wYXRoa2V5cywKKwkJCQkJCQkJCQkgIHVzZWZ1bF91bmlxdWVrZXlzLAogCQkJ CQkJCQkJCSAgQmFja3dhcmRTY2FuRGlyZWN0aW9uLAogCQkJCQkJCQkJCSAgaW5kZXhfb25s eV9zY2FuLAogCQkJCQkJCQkJCSAgb3V0ZXJfcmVsaWRzLApAQCAtMzM2OSw2ICszMzc5LDM1 IEBAIG1hdGNoX2NsYXVzZV90b19vcmRlcmluZ19vcChJbmRleE9wdEluZm8gKmluZGV4LAog CXJldHVybiBjbGF1c2U7CiB9CiAKKy8qCisgKiBnZXRfdW5pcXVla2V5c19mb3JfaW5kZXgK KyAqLworc3RhdGljIExpc3QgKgorZ2V0X3VuaXF1ZWtleXNfZm9yX2luZGV4KFBsYW5uZXJJ bmZvICpyb290LCBMaXN0ICpwYXRoa2V5cykKK3sKKwlMaXN0Q2VsbCAqbGM7CisKKwlpZiAo cGF0aGtleXMpCisJeworCQlMaXN0ICp1bmlxdWVrZXlzID0gTklMOworCQlmb3JlYWNoKGxj LCBwYXRoa2V5cykKKwkJeworCQkJVW5pcXVlS2V5ICp1bmlxdWVfa2V5OworCQkJUGF0aEtl eSAqcGsgPSAoUGF0aEtleSAqKSBsZmlyc3QobGMpOworCQkJRXF1aXZhbGVuY2VDbGFzcyAq ZWMgPSAoRXF1aXZhbGVuY2VDbGFzcyAqKSBway0+cGtfZWNsYXNzOworCisJCQl1bmlxdWVf a2V5ID0gbWFrZU5vZGUoVW5pcXVlS2V5KTsKKwkJCXVuaXF1ZV9rZXktPmVxX2NsYXVzZSA9 IGVjOworCQkJCisJCQlsYXBwZW5kKHVuaXF1ZWtleXMsIHVuaXF1ZV9rZXkpOworCQl9CisK KwkJaWYgKHVuaXF1ZWtleXNfY29udGFpbmVkX2luKHJvb3QtPmNhbm9uX3VuaXF1ZWtleXMs IHVuaXF1ZWtleXMpKQorCQkJcmV0dXJuIHVuaXF1ZWtleXM7CisJfQorCisJcmV0dXJuIE5J TDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCS0tLS0gIFJPVVRJTkVT IFRPIERPIFBBUlRJQUwgSU5ERVggUFJFRElDQVRFIFRFU1RTCS0tLS0KZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL3VuaXF1ZWtleS5jIGIvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BhdGgvdW5pcXVla2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMC4uOWVlY2FlZjU2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYWNrZW5k L29wdGltaXplci9wYXRoL3VuaXF1ZWtleS5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAqCisgKiB1bmlxdWVrZXkuYworICoJICBVdGlsaXRpZXMgZm9y IG1hdGNoaW5nIGFuZCBidWlsZGluZyB1bmlxdWUga2V5cworICoKKyAqIFBvcnRpb25zIENv cHlyaWdodCAoYykgMTk5Ni0yMDE5LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBH cm91cAorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBV bml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKKyAqCisgKiBJREVOVElGSUNBVElPTgorICoJICBz cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC91bmlxdWVrZXkuYworICoKKyAqLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAicG9zdGdyZXMuaCIKKworI2luY2x1ZGUgIm9w dGltaXplci9wYXRobm9kZS5oIgorI2luY2x1ZGUgIm9wdGltaXplci9wYXRocy5oIgorI2lu Y2x1ZGUgIm5vZGVzL3BnX2xpc3QuaCIKKworc3RhdGljIFVuaXF1ZUtleSAqbWFrZV9jYW5v bmljYWxfdW5pcXVla2V5KFBsYW5uZXJJbmZvICpyb290LCBFcXVpdmFsZW5jZUNsYXNzICpl Y2xhc3MpOworc3RhdGljIExpc3QqIGJ1aWxkX3VuaXF1ZWtleXMoUGxhbm5lckluZm8gKnJv b3QsIExpc3QgKnBhdGhrZXlzKTsKKworLyoKKyAqIEJ1aWxkIHVuaXF1ZSBrZXlzIGZvciBH Uk9VUCBCWQorICovCitMaXN0KgorYnVpbGRfZ3JvdXBfdW5pcXVla2V5cyhQbGFubmVySW5m byAqcm9vdCkKK3sKKwlyZXR1cm4gYnVpbGRfdW5pcXVla2V5cyhyb290LCByb290LT5ncm91 cF9wYXRoa2V5cyk7Cit9CisKKy8qCisgKiBCdWlsZCB1bmlxdWUga2V5cyBmb3IgRElTVElO Q1QKKyAqLworTGlzdCoKK2J1aWxkX2Rpc3RpbmN0X3VuaXF1ZWtleXMoUGxhbm5lckluZm8g KnJvb3QpCit7CisJcmV0dXJuIGJ1aWxkX3VuaXF1ZWtleXMocm9vdCwgcm9vdC0+ZGlzdGlu Y3RfcGF0aGtleXMpOworfQorCisvKgorICogdW5pcXVla2V5c19jb250YWluZWRfaW4KKyAq CSAgQXJlIHRoZSBrZXlzMiBpbmNsdWRlZCBpbiB0aGUga2V5czEgc3VwZXJzZXQKKyAqLwor Ym9vbAordW5pcXVla2V5c19jb250YWluZWRfaW4oTGlzdCAqa2V5czEsIExpc3QgKmtleXMy KQoreworCUxpc3RDZWxsICAgKmtleTEsCisJCQkgICAqa2V5MjsKKworCS8qCisJICogRmFs bCBvdXQgcXVpY2tseSBpZiB3ZSBhcmUgcGFzc2VkIHR3byBpZGVudGljYWwgbGlzdHMuICBU aGlzIG1vc3RseQorCSAqIGNhdGNoZXMgdGhlIGNhc2Ugd2hlcmUgYm90aCBhcmUgTklMLCBi dXQgdGhhdCdzIGNvbW1vbiBlbm91Z2ggdG8KKwkgKiB3YXJyYW50IHRoZSB0ZXN0LgorCSAq LworCWlmIChrZXlzMSA9PSBrZXlzMikKKwkJcmV0dXJuIHRydWU7CisKKwlmb3JlYWNoKGtl eTIsIGtleXMyKQorCXsKKwkJYm9vbCBmb3VuZCA9IGZhbHNlOworCQlVbmlxdWVLZXkgICp1 bmlxdWVrZXkyID0gKFVuaXF1ZUtleSAqKSBsZmlyc3Qoa2V5Mik7CisKKwkJZm9yZWFjaChr ZXkxLCBrZXlzMSkKKwkJeworCQkJVW5pcXVlS2V5ICAqdW5pcXVla2V5MSA9IChVbmlxdWVL ZXkgKikgbGZpcnN0KGtleTEpOworCisJCQlpZiAodW5pcXVla2V5MS0+ZXFfY2xhdXNlID09 IHVuaXF1ZWtleTItPmVxX2NsYXVzZSkKKwkJCXsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJ YnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKQorCQkJcmV0dXJuIGZhbHNlOwor CX0KKworCXJldHVybiB0cnVlOworfQorCisvKgorICogbWFrZV9jYW5vbmljYWxfdW5pcXVl a2V5CisgKgkgIEdpdmVuIHRoZSBwYXJhbWV0ZXJzIGZvciBhIFVuaXF1ZUtleSwgZmluZCBh bnkgcHJlLWV4aXN0aW5nIG1hdGNoaW5nCisgKgkgIHVuaXF1ZWtleSBpbiB0aGUgcXVlcnkn cyBsaXN0IG9mICJjYW5vbmljYWwiIHVuaXF1ZWtleXMuICBNYWtlIGEgbmV3CisgKgkgIGVu dHJ5IGlmIHRoZXJlJ3Mgbm90IG9uZSBhbHJlYWR5LgorICoKKyAqIE5vdGUgdGhhdCB0aGlz IGZ1bmN0aW9uIG11c3Qgbm90IGJlIHVzZWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZSBjb21wbGV0 ZWQKKyAqIG1lcmdpbmcgRXF1aXZhbGVuY2VDbGFzc2VzLiAgKFdlIGRvbid0IHRyeSB0byBl bmZvcmNlIHRoYXQgaGVyZTsgaW5zdGVhZCwKKyAqIGVxdWl2Y2xhc3MuYyB3aWxsIGNvbXBs YWluIGlmIGEgbWVyZ2Ugb2NjdXJzIGFmdGVyIHJvb3QtPmNhbm9uX3VuaXF1ZWtleXMKKyAq IGhhcyBiZWNvbWUgbm9uZW1wdHkuKQorICovCitzdGF0aWMgVW5pcXVlS2V5ICoKK21ha2Vf Y2Fub25pY2FsX3VuaXF1ZWtleShQbGFubmVySW5mbyAqcm9vdCwKKwkJCQkJCSBFcXVpdmFs ZW5jZUNsYXNzICplY2xhc3MpCit7CisJVW5pcXVlS2V5ICAqdWs7CisJTGlzdENlbGwgICAq bGM7CisJTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0OworCisJLyogVGhlIHBhc3NlZCBlY2xh c3MgbWlnaHQgYmUgbm9uLWNhbm9uaWNhbCwgc28gY2hhc2UgdXAgdG8gdGhlIHRvcCAqLwor CXdoaWxlIChlY2xhc3MtPmVjX21lcmdlZCkKKwkJZWNsYXNzID0gZWNsYXNzLT5lY19tZXJn ZWQ7CisKKwlmb3JlYWNoKGxjLCByb290LT5jYW5vbl91bmlxdWVrZXlzKQorCXsKKwkJdWsg PSAoVW5pcXVlS2V5ICopIGxmaXJzdChsYyk7CisJCWlmIChlY2xhc3MgPT0gdWstPmVxX2Ns YXVzZSkKKwkJCXJldHVybiB1azsKKwl9CisKKwkvKgorCSAqIEJlIHN1cmUgY2Fub25pY2Fs IHVuaXF1ZWtleXMgYXJlIGFsbG9jYXRlZCBpbiB0aGUgbWFpbiBwbGFubmluZyBjb250ZXh0 LgorCSAqIE5vdCBhbiBpc3N1ZSBpbiBub3JtYWwgcGxhbm5pbmcsIGJ1dCBpdCBpcyBmb3Ig R0VRTy4KKwkgKi8KKwlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKHJvb3Qt PnBsYW5uZXJfY3h0KTsKKworCXVrID0gbWFrZU5vZGUoVW5pcXVlS2V5KTsKKwl1ay0+ZXFf Y2xhdXNlID0gZWNsYXNzOworCisJcm9vdC0+Y2Fub25fdW5pcXVla2V5cyA9IGxhcHBlbmQo cm9vdC0+Y2Fub25fdW5pcXVla2V5cywgdWspOworCisJTWVtb3J5Q29udGV4dFN3aXRjaFRv KG9sZGNvbnRleHQpOworCisJcmV0dXJuIHVrOworfQorCisvKgorICogQnVpbGQgYSBsaXN0 IG9mIHVuaXF1ZSBrZXlzCisgKi8KK3N0YXRpYyBMaXN0KgorYnVpbGRfdW5pcXVla2V5cyhQ bGFubmVySW5mbyAqcm9vdCwgTGlzdCAqcGF0aGtleXMpCit7CisJTGlzdCAqcmVzdWx0ID0g TklMOworCUxpc3RDZWxsICpsOworCisJLyogQ3JlYXRlIGEgdW5pcXVla2V5IGFuZCBhZGQg aXQgdG8gdGhlIGxpc3QgKi8KKwlmb3JlYWNoKGwsIHBhdGhrZXlzKQorCXsKKwkJVW5pcXVl S2V5ICp1bmlxdWVfa2V5OworCQlQYXRoS2V5ICpwayA9IChQYXRoS2V5ICopIGxmaXJzdChs KTsKKwkJRXF1aXZhbGVuY2VDbGFzcyAqZWMgPSAoRXF1aXZhbGVuY2VDbGFzcyAqKSBway0+ cGtfZWNsYXNzOworCisJCXVuaXF1ZV9rZXkgPSBtYWtlX2Nhbm9uaWNhbF91bmlxdWVrZXko cm9vdCwgZWMpOworCQlyZXN1bHQgPSBsYXBwZW5kKHJlc3VsdCwgdW5pcXVlX2tleSk7CisJ fQorCisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGlt aXplci9wbGFuL3BsYW5uZXIuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5u ZXIuYwppbmRleCBjYTNiN2YyOWUxLi5kYWIzMTQyZTUxIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubmVyLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BsYW4vcGxhbm5lci5jCkBAIC0zNjUwLDEzICszNjUwLDIzIEBAIHN0YW5kYXJkX3Fw X2NhbGxiYWNrKFBsYW5uZXJJbmZvICpyb290LCB2b2lkICpleHRyYSkKIAkgKiBtdWNoIGVh c2llciwgc2luY2Ugd2Uga25vdyB0aGF0IHRoZSBwYXJzZXIgZW5zdXJlZCB0aGF0IG9uZSBp cyBhCiAJICogc3VwZXJzZXQgb2YgdGhlIG90aGVyLgogCSAqLworCXJvb3QtPnF1ZXJ5X3Vu aXF1ZWtleXMgPSBOSUw7CisKIAlpZiAocm9vdC0+Z3JvdXBfcGF0aGtleXMpCisJewogCQly b290LT5xdWVyeV9wYXRoa2V5cyA9IHJvb3QtPmdyb3VwX3BhdGhrZXlzOworCisJCWlmICgh cm9vdC0+cGFyc2UtPmhhc0FnZ3MpCisJCQlyb290LT5xdWVyeV91bmlxdWVrZXlzID0gYnVp bGRfZ3JvdXBfdW5pcXVla2V5cyhyb290KTsKKwl9CiAJZWxzZSBpZiAocm9vdC0+d2luZG93 X3BhdGhrZXlzKQogCQlyb290LT5xdWVyeV9wYXRoa2V5cyA9IHJvb3QtPndpbmRvd19wYXRo a2V5czsKIAllbHNlIGlmIChsaXN0X2xlbmd0aChyb290LT5kaXN0aW5jdF9wYXRoa2V5cykg PgogCQkJIGxpc3RfbGVuZ3RoKHJvb3QtPnNvcnRfcGF0aGtleXMpKQorCXsKIAkJcm9vdC0+ cXVlcnlfcGF0aGtleXMgPSByb290LT5kaXN0aW5jdF9wYXRoa2V5czsKKwkJcm9vdC0+cXVl cnlfdW5pcXVla2V5cyA9IGJ1aWxkX2Rpc3RpbmN0X3VuaXF1ZWtleXMocm9vdCk7CisJfQog CWVsc2UgaWYgKHJvb3QtPnNvcnRfcGF0aGtleXMpCiAJCXJvb3QtPnF1ZXJ5X3BhdGhrZXlz ID0gcm9vdC0+c29ydF9wYXRoa2V5czsKIAllbHNlCkBAIC02MjE2LDcgKzYyMjYsNyBAQCBw bGFuX2NsdXN0ZXJfdXNlX3NvcnQoT2lkIHRhYmxlT2lkLCBPaWQgaW5kZXhPaWQpCiAKIAkv KiBFc3RpbWF0ZSB0aGUgY29zdCBvZiBpbmRleCBzY2FuICovCiAJaW5kZXhTY2FuUGF0aCA9 IGNyZWF0ZV9pbmRleF9wYXRoKHJvb3QsIGluZGV4SW5mbywKLQkJCQkJCQkJCSAgTklMLCBO SUwsIE5JTCwgTklMLAorCQkJCQkJCQkJICBOSUwsIE5JTCwgTklMLCBOSUwsIE5JTCwKIAkJ CQkJCQkJCSAgRm9yd2FyZFNjYW5EaXJlY3Rpb24sIGZhbHNlLAogCQkJCQkJCQkJICBOVUxM LCAxLjAsIGZhbHNlKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0 aWwvcGF0aG5vZGUuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3BhdGhub2RlLmMK aW5kZXggMGFjNzM5ODRkMi4uMTM3NjZlMGJkMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3V0aWwvcGF0aG5vZGUuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv dXRpbC9wYXRobm9kZS5jCkBAIC05NDEsNiArOTQxLDcgQEAgY3JlYXRlX3NlcXNjYW5fcGF0 aChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCXBhdGhub2RlLT5wYXJh bGxlbF9zYWZlID0gcmVsLT5jb25zaWRlcl9wYXJhbGxlbDsKIAlwYXRobm9kZS0+cGFyYWxs ZWxfd29ya2VycyA9IHBhcmFsbGVsX3dvcmtlcnM7CiAJcGF0aG5vZGUtPnBhdGhrZXlzID0g TklMOwkvKiBzZXFzY2FuIGhhcyB1bm9yZGVyZWQgcmVzdWx0ICovCisJcGF0aG5vZGUtPnVu aXF1ZV9rZXlzID0gTklMOwogCiAJY29zdF9zZXFzY2FuKHBhdGhub2RlLCByb290LCByZWws IHBhdGhub2RlLT5wYXJhbV9pbmZvKTsKIApAQCAtOTY1LDYgKzk2Niw3IEBAIGNyZWF0ZV9z YW1wbGVzY2FuX3BhdGgoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwgUmVs aWRzIHJlcXVpcmVkX291dGVyCiAJcGF0aG5vZGUtPnBhcmFsbGVsX3NhZmUgPSByZWwtPmNv bnNpZGVyX3BhcmFsbGVsOwogCXBhdGhub2RlLT5wYXJhbGxlbF93b3JrZXJzID0gMDsKIAlw YXRobm9kZS0+cGF0aGtleXMgPSBOSUw7CS8qIHNhbXBsZXNjYW4gaGFzIHVub3JkZXJlZCBy ZXN1bHQgKi8KKwlwYXRobm9kZS0+dW5pcXVlX2tleXMgPSBOSUw7CiAKIAljb3N0X3NhbXBs ZXNjYW4ocGF0aG5vZGUsIHJvb3QsIHJlbCwgcGF0aG5vZGUtPnBhcmFtX2luZm8pOwogCkBA IC0xMDAxLDYgKzEwMDMsNyBAQCBjcmVhdGVfaW5kZXhfcGF0aChQbGFubmVySW5mbyAqcm9v dCwKIAkJCQkgIExpc3QgKmluZGV4b3JkZXJieXMsCiAJCQkJICBMaXN0ICppbmRleG9yZGVy Ynljb2xzLAogCQkJCSAgTGlzdCAqcGF0aGtleXMsCisJCQkJICBMaXN0ICp1bmlxdWVrZXlz LAogCQkJCSAgU2NhbkRpcmVjdGlvbiBpbmRleHNjYW5kaXIsCiAJCQkJICBib29sIGluZGV4 b25seSwKIAkJCQkgIFJlbGlkcyByZXF1aXJlZF9vdXRlciwKQEAgLTEwMTksNiArMTAyMiw3 IEBAIGNyZWF0ZV9pbmRleF9wYXRoKFBsYW5uZXJJbmZvICpyb290LAogCXBhdGhub2RlLT5w YXRoLnBhcmFsbGVsX3NhZmUgPSByZWwtPmNvbnNpZGVyX3BhcmFsbGVsOwogCXBhdGhub2Rl LT5wYXRoLnBhcmFsbGVsX3dvcmtlcnMgPSAwOwogCXBhdGhub2RlLT5wYXRoLnBhdGhrZXlz ID0gcGF0aGtleXM7CisJcGF0aG5vZGUtPnBhdGgudW5pcXVlX2tleXMgPSB1bmlxdWVrZXlz OwogCiAJcGF0aG5vZGUtPmluZGV4aW5mbyA9IGluZGV4OwogCXBhdGhub2RlLT5pbmRleGNs YXVzZXMgPSBpbmRleGNsYXVzZXM7CkBAIC0xMDYyLDYgKzEwNjYsNyBAQCBjcmVhdGVfYml0 bWFwX2hlYXBfcGF0aChQbGFubmVySW5mbyAqcm9vdCwKIAlwYXRobm9kZS0+cGF0aC5wYXJh bGxlbF9zYWZlID0gcmVsLT5jb25zaWRlcl9wYXJhbGxlbDsKIAlwYXRobm9kZS0+cGF0aC5w YXJhbGxlbF93b3JrZXJzID0gcGFyYWxsZWxfZGVncmVlOwogCXBhdGhub2RlLT5wYXRoLnBh dGhrZXlzID0gTklMOwkvKiBhbHdheXMgdW5vcmRlcmVkICovCisJcGF0aG5vZGUtPnBhdGgu dW5pcXVlX2tleXMgPSBOSUw7CiAKIAlwYXRobm9kZS0+Yml0bWFwcXVhbCA9IGJpdG1hcHF1 YWw7CiAKQEAgLTE5MjMsNiArMTkyOCw3IEBAIGNyZWF0ZV9mdW5jdGlvbnNjYW5fcGF0aChQ bGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCXBhdGhub2RlLT5wYXJhbGxl bF9zYWZlID0gcmVsLT5jb25zaWRlcl9wYXJhbGxlbDsKIAlwYXRobm9kZS0+cGFyYWxsZWxf d29ya2VycyA9IDA7CiAJcGF0aG5vZGUtPnBhdGhrZXlzID0gcGF0aGtleXM7CisJcGF0aG5v ZGUtPnVuaXF1ZV9rZXlzID0gTklMOwogCiAJY29zdF9mdW5jdGlvbnNjYW4ocGF0aG5vZGUs IHJvb3QsIHJlbCwgcGF0aG5vZGUtPnBhcmFtX2luZm8pOwogCkBAIC0xOTQ5LDYgKzE5NTUs NyBAQCBjcmVhdGVfdGFibGVmdW5jc2Nhbl9wYXRoKFBsYW5uZXJJbmZvICpyb290LCBSZWxP cHRJbmZvICpyZWwsCiAJcGF0aG5vZGUtPnBhcmFsbGVsX3NhZmUgPSByZWwtPmNvbnNpZGVy X3BhcmFsbGVsOwogCXBhdGhub2RlLT5wYXJhbGxlbF93b3JrZXJzID0gMDsKIAlwYXRobm9k ZS0+cGF0aGtleXMgPSBOSUw7CS8qIHJlc3VsdCBpcyBhbHdheXMgdW5vcmRlcmVkICovCisJ cGF0aG5vZGUtPnVuaXF1ZV9rZXlzID0gTklMOwogCiAJY29zdF90YWJsZWZ1bmNzY2FuKHBh dGhub2RlLCByb290LCByZWwsIHBhdGhub2RlLT5wYXJhbV9pbmZvKTsKIApAQCAtMTk3NSw2 ICsxOTgyLDcgQEAgY3JlYXRlX3ZhbHVlc3NjYW5fcGF0aChQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqcmVsLAogCXBhdGhub2RlLT5wYXJhbGxlbF9zYWZlID0gcmVsLT5jb25z aWRlcl9wYXJhbGxlbDsKIAlwYXRobm9kZS0+cGFyYWxsZWxfd29ya2VycyA9IDA7CiAJcGF0 aG5vZGUtPnBhdGhrZXlzID0gTklMOwkvKiByZXN1bHQgaXMgYWx3YXlzIHVub3JkZXJlZCAq LworCXBhdGhub2RlLT51bmlxdWVfa2V5cyA9IE5JTDsKIAogCWNvc3RfdmFsdWVzc2Nhbihw YXRobm9kZSwgcm9vdCwgcmVsLCBwYXRobm9kZS0+cGFyYW1faW5mbyk7CiAKQEAgLTIwMDAs NiArMjAwOCw3IEBAIGNyZWF0ZV9jdGVzY2FuX3BhdGgoUGxhbm5lckluZm8gKnJvb3QsIFJl bE9wdEluZm8gKnJlbCwgUmVsaWRzIHJlcXVpcmVkX291dGVyKQogCXBhdGhub2RlLT5wYXJh bGxlbF9zYWZlID0gcmVsLT5jb25zaWRlcl9wYXJhbGxlbDsKIAlwYXRobm9kZS0+cGFyYWxs ZWxfd29ya2VycyA9IDA7CiAJcGF0aG5vZGUtPnBhdGhrZXlzID0gTklMOwkvKiBYWFggZm9y IG5vdywgcmVzdWx0IGlzIGFsd2F5cyB1bm9yZGVyZWQgKi8KKwlwYXRobm9kZS0+dW5pcXVl X2tleXMgPSBOSUw7CiAKIAljb3N0X2N0ZXNjYW4ocGF0aG5vZGUsIHJvb3QsIHJlbCwgcGF0 aG5vZGUtPnBhcmFtX2luZm8pOwogCkBAIC0yMDI2LDYgKzIwMzUsNyBAQCBjcmVhdGVfbmFt ZWR0dXBsZXN0b3Jlc2Nhbl9wYXRoKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpy ZWwsCiAJcGF0aG5vZGUtPnBhcmFsbGVsX3NhZmUgPSByZWwtPmNvbnNpZGVyX3BhcmFsbGVs OwogCXBhdGhub2RlLT5wYXJhbGxlbF93b3JrZXJzID0gMDsKIAlwYXRobm9kZS0+cGF0aGtl eXMgPSBOSUw7CS8qIHJlc3VsdCBpcyBhbHdheXMgdW5vcmRlcmVkICovCisJcGF0aG5vZGUt PnVuaXF1ZV9rZXlzID0gTklMOwogCiAJY29zdF9uYW1lZHR1cGxlc3RvcmVzY2FuKHBhdGhu b2RlLCByb290LCByZWwsIHBhdGhub2RlLT5wYXJhbV9pbmZvKTsKIApAQCAtMjA1Miw2ICsy MDYyLDcgQEAgY3JlYXRlX3Jlc3VsdHNjYW5fcGF0aChQbGFubmVySW5mbyAqcm9vdCwgUmVs T3B0SW5mbyAqcmVsLAogCXBhdGhub2RlLT5wYXJhbGxlbF9zYWZlID0gcmVsLT5jb25zaWRl cl9wYXJhbGxlbDsKIAlwYXRobm9kZS0+cGFyYWxsZWxfd29ya2VycyA9IDA7CiAJcGF0aG5v ZGUtPnBhdGhrZXlzID0gTklMOwkvKiByZXN1bHQgaXMgYWx3YXlzIHVub3JkZXJlZCAqLwor CXBhdGhub2RlLT51bmlxdWVfa2V5cyA9IE5JTDsKIAogCWNvc3RfcmVzdWx0c2NhbihwYXRo bm9kZSwgcm9vdCwgcmVsLCBwYXRobm9kZS0+cGFyYW1faW5mbyk7CiAKQEAgLTIwNzgsNiAr MjA4OSw3IEBAIGNyZWF0ZV93b3JrdGFibGVzY2FuX3BhdGgoUGxhbm5lckluZm8gKnJvb3Qs IFJlbE9wdEluZm8gKnJlbCwKIAlwYXRobm9kZS0+cGFyYWxsZWxfc2FmZSA9IHJlbC0+Y29u c2lkZXJfcGFyYWxsZWw7CiAJcGF0aG5vZGUtPnBhcmFsbGVsX3dvcmtlcnMgPSAwOwogCXBh dGhub2RlLT5wYXRoa2V5cyA9IE5JTDsJLyogcmVzdWx0IGlzIGFsd2F5cyB1bm9yZGVyZWQg Ki8KKwlwYXRobm9kZS0+dW5pcXVlX2tleXMgPSBOSUw7CiAKIAkvKiBDb3N0IGlzIHRoZSBz YW1lIGFzIGZvciBhIHJlZ3VsYXIgQ1RFIHNjYW4gKi8KIAljb3N0X2N0ZXNjYW4ocGF0aG5v ZGUsIHJvb3QsIHJlbCwgcGF0aG5vZGUtPnBhcmFtX2luZm8pOwpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvbm9kZXMvbm9kZXMuaCBiL3NyYy9pbmNsdWRlL25vZGVzL25vZGVzLmgKaW5k ZXggNGUyZmIzOTEwNS4uYTliNjdjNjRmOCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9k ZXMvbm9kZXMuaAorKysgYi9zcmMvaW5jbHVkZS9ub2Rlcy9ub2Rlcy5oCkBAIC0yNjEsNiAr MjYxLDcgQEAgdHlwZWRlZiBlbnVtIE5vZGVUYWcKIAlUX0VxdWl2YWxlbmNlTWVtYmVyLAog CVRfUGF0aEtleSwKIAlUX1BhdGhUYXJnZXQsCisJVF9VbmlxdWVLZXksCiAJVF9SZXN0cmlj dEluZm8sCiAJVF9JbmRleENsYXVzZSwKIAlUX1BsYWNlSG9sZGVyVmFyLApkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9w YXRobm9kZXMuaAppbmRleCA0NDFlNjRlY2E5Li40ODU5ODZhNjFhIDEwMDY0NAotLS0gYS9z cmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaAorKysgYi9zcmMvaW5jbHVkZS9ub2Rlcy9w YXRobm9kZXMuaApAQCAtMjY3LDYgKzI2Nyw4IEBAIHN0cnVjdCBQbGFubmVySW5mbwogCiAJ TGlzdAkgICAqY2Fub25fcGF0aGtleXM7IC8qIGxpc3Qgb2YgImNhbm9uaWNhbCIgUGF0aEtl eXMgKi8KIAorCUxpc3QJICAgKmNhbm9uX3VuaXF1ZWtleXM7IC8qIGxpc3Qgb2YgImNhbm9u aWNhbCIgVW5pcXVlS2V5cyAqLworCiAJTGlzdAkgICAqbGVmdF9qb2luX2NsYXVzZXM7CS8q IGxpc3Qgb2YgUmVzdHJpY3RJbmZvcyBmb3IgbWVyZ2Vqb2luYWJsZQogCQkJCQkJCQkJICog b3V0ZXIgam9pbiBjbGF1c2VzIHcvbm9ubnVsbGFibGUgdmFyIG9uCiAJCQkJCQkJCQkgKiBs ZWZ0ICovCkBAIC0yOTUsNiArMjk3LDggQEAgc3RydWN0IFBsYW5uZXJJbmZvCiAKIAlMaXN0 CSAgICpxdWVyeV9wYXRoa2V5czsgLyogZGVzaXJlZCBwYXRoa2V5cyBmb3IgcXVlcnlfcGxh bm5lcigpICovCiAKKwlMaXN0CSAgICpxdWVyeV91bmlxdWVrZXlzOyAvKiAqLworCiAJTGlz dAkgICAqZ3JvdXBfcGF0aGtleXM7IC8qIGdyb3VwQ2xhdXNlIHBhdGhrZXlzLCBpZiBhbnkg Ki8KIAlMaXN0CSAgICp3aW5kb3dfcGF0aGtleXM7CS8qIHBhdGhrZXlzIG9mIGJvdHRvbSB3 aW5kb3csIGlmIGFueSAqLwogCUxpc3QJICAgKmRpc3RpbmN0X3BhdGhrZXlzOwkvKiBkaXN0 aW5jdENsYXVzZSBwYXRoa2V5cywgaWYgYW55ICovCkBAIC0xMDcxLDYgKzEwNzUsMTUgQEAg dHlwZWRlZiBzdHJ1Y3QgUGFyYW1QYXRoSW5mbwogCUxpc3QJICAgKnBwaV9jbGF1c2VzOwkv KiBqb2luIGNsYXVzZXMgYXZhaWxhYmxlIGZyb20gb3V0ZXIgcmVscyAqLwogfSBQYXJhbVBh dGhJbmZvOwogCisvKgorICogVW5pcXVlS2V5CisgKi8KK3R5cGVkZWYgc3RydWN0IFVuaXF1 ZUtleQoreworCU5vZGVUYWcJCXR5cGU7CisKKwlFcXVpdmFsZW5jZUNsYXNzICplcV9jbGF1 c2U7CS8qIGVxdWl2YWxlbmNlIGNsYXNzICovCit9IFVuaXF1ZUtleTsKIAogLyoKICAqIFR5 cGUgIlBhdGgiIGlzIHVzZWQgYXMtaXMgZm9yIHNlcXVlbnRpYWwtc2NhbiBwYXRocywgYXMg d2VsbCBhcyBzb21lIG90aGVyCkBAIC0xMTAwLDYgKzExMTMsOSBAQCB0eXBlZGVmIHN0cnVj dCBQYXJhbVBhdGhJbmZvCiAgKgogICogInBhdGhrZXlzIiBpcyBhIExpc3Qgb2YgUGF0aEtl eSBub2RlcyAoc2VlIGFib3ZlKSwgZGVzY3JpYmluZyB0aGUgc29ydAogICogb3JkZXJpbmcg b2YgdGhlIHBhdGgncyBvdXRwdXQgcm93cy4KKyAqCisgKiAidW5pcXVlX2tleXMiLCBpZiBu b3QgTklMLCBpcyBhIGxpc3Qgb2YgVW5pcXVlS2V5IG5vZGVzIChzZWUgYWJvdmUpLAorICog ZGVzY3JpYmluZyB0aGUgWFhYLgogICovCiB0eXBlZGVmIHN0cnVjdCBQYXRoCiB7CkBAIC0x MTIzLDYgKzExMzksOCBAQCB0eXBlZGVmIHN0cnVjdCBQYXRoCiAKIAlMaXN0CSAgICpwYXRo a2V5czsJCS8qIHNvcnQgb3JkZXJpbmcgb2YgcGF0aCdzIG91dHB1dCAqLwogCS8qIHBhdGhr ZXlzIGlzIGEgTGlzdCBvZiBQYXRoS2V5IG5vZGVzOyBzZWUgYWJvdmUgKi8KKworCUxpc3QJ ICAgKnVuaXF1ZV9rZXlzOwkvKiB0aGUgdW5pcXVlIGtleXMsIG9yIE5JTCBpZiBub25lICov CiB9IFBhdGg7CiAKIC8qIE1hY3JvIGZvciBleHRyYWN0aW5nIGEgcGF0aCdzIHBhcmFtZXRl cml6YXRpb24gcmVsaWRzOyBiZXdhcmUgZG91YmxlIGV2YWwgKi8KZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL25vZGVzL3ByaW50LmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9wcmludC5oCmlu ZGV4IGNiZmY1NmE3MjQuLjE5NmQzYTA3ODMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL25v ZGVzL3ByaW50LmgKKysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvcHJpbnQuaApAQCAtMTYsNyAr MTYsNiBAQAogCiAjaW5jbHVkZSAiZXhlY3V0b3IvdHVwdGFibGUuaCIKIAotCiAjZGVmaW5l IG5vZGVEaXNwbGF5KHgpCQlwcHJpbnQoeCkKIAogZXh0ZXJuIHZvaWQgcHJpbnQoY29uc3Qg dm9pZCAqb2JqKTsKQEAgLTI4LDYgKzI3LDcgQEAgZXh0ZXJuIGNoYXIgKnByZXR0eV9mb3Jt YXRfbm9kZV9kdW1wKGNvbnN0IGNoYXIgKmR1bXApOwogZXh0ZXJuIHZvaWQgcHJpbnRfcnQo Y29uc3QgTGlzdCAqcnRhYmxlKTsKIGV4dGVybiB2b2lkIHByaW50X2V4cHIoY29uc3QgTm9k ZSAqZXhwciwgY29uc3QgTGlzdCAqcnRhYmxlKTsKIGV4dGVybiB2b2lkIHByaW50X3BhdGhr ZXlzKGNvbnN0IExpc3QgKnBhdGhrZXlzLCBjb25zdCBMaXN0ICpydGFibGUpOworZXh0ZXJu IHZvaWQgcHJpbnRfdW5pcXVlX2tleXMoY29uc3QgTGlzdCAqdW5pcXVlX2tleXMsIGNvbnN0 IExpc3QgKnJ0YWJsZSk7CiBleHRlcm4gdm9pZCBwcmludF90bChjb25zdCBMaXN0ICp0bGlz dCwgY29uc3QgTGlzdCAqcnRhYmxlKTsKIGV4dGVybiB2b2lkIHByaW50X3Nsb3QoVHVwbGVU YWJsZVNsb3QgKnNsb3QpOwogCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIv cGF0aG5vZGUuaCBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oCmluZGV4IDE4 MmZmZWVmNGIuLjM3NGNhYzE1N2IgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wdGltaXpl ci9wYXRobm9kZS5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oCkBA IC00NCw2ICs0NCw3IEBAIGV4dGVybiBJbmRleFBhdGggKmNyZWF0ZV9pbmRleF9wYXRoKFBs YW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJTGlzdCAqaW5kZXhvcmRlcmJ5cywKIAkJCQkJ CQkJCUxpc3QgKmluZGV4b3JkZXJieWNvbHMsCiAJCQkJCQkJCQlMaXN0ICpwYXRoa2V5cywK KwkJCQkJCQkJCUxpc3QgKnVuaXF1ZWtleXMsCiAJCQkJCQkJCQlTY2FuRGlyZWN0aW9uIGlu ZGV4c2NhbmRpciwKIAkJCQkJCQkJCWJvb2wgaW5kZXhvbmx5LAogCQkJCQkJCQkJUmVsaWRz IHJlcXVpcmVkX291dGVyLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3Bh dGhzLmggYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaAppbmRleCA3MzQ1MTM3ZDFk Li4xMGI2ZDJhOGM3IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMu aAorKysgYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaApAQCAtMjM1LDQgKzIzNSwx MiBAQCBleHRlcm4gUGF0aEtleSAqbWFrZV9jYW5vbmljYWxfcGF0aGtleShQbGFubmVySW5m byAqcm9vdCwKIGV4dGVybiB2b2lkIGFkZF9wYXRoc190b19hcHBlbmRfcmVsKFBsYW5uZXJJ bmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQkJCQkJCQlMaXN0ICpsaXZlX2NoaWxk cmVscyk7CiAKKy8qCisgKiB1bmlxdWVrZXkuYworICoJICBVdGlsaXRpZXMgZm9yIG1hdGNo aW5nIGFuZCBidWlsZGluZyB1bmlxdWUga2V5cworICovCitleHRlcm4gTGlzdCAqYnVpbGRf Z3JvdXBfdW5pcXVla2V5cyhQbGFubmVySW5mbyAqcm9vdCk7CitleHRlcm4gTGlzdCAqYnVp bGRfZGlzdGluY3RfdW5pcXVla2V5cyhQbGFubmVySW5mbyAqcm9vdCk7CitleHRlcm4gYm9v bCB1bmlxdWVrZXlzX2NvbnRhaW5lZF9pbihMaXN0ICprZXlzMSwgTGlzdCAqa2V5czIpOwor CiAjZW5kaWYJCQkJCQkJLyogUEFUSFNfSCAqLwotLSAKMi4yMS4wCgo= --------------076FABCFD5D773A69CB68568--