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 1vxlAU-00H6kj-0R for pgsql-hackers@arkaria.postgresql.org; Wed, 04 Mar 2026 12:17:34 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vxlAR-00CaR2-1a for pgsql-hackers@arkaria.postgresql.org; Wed, 04 Mar 2026 12:17:31 +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 1vxlAR-00CaQs-02 for pgsql-hackers@lists.postgresql.org; Wed, 04 Mar 2026 12:17:31 +0000 Received: from mail-dl1-x122c.google.com ([2607:f8b0:4864:20::122c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vxlAO-00000000Wem-3YvY for pgsql-hackers@postgresql.org; Wed, 04 Mar 2026 12:17:31 +0000 Received: by mail-dl1-x122c.google.com with SMTP id a92af1059eb24-1275750cfc7so369700c88.0 for ; Wed, 04 Mar 2026 04:17:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772626647; x=1773231447; darn=postgresql.org; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=r7e7fLOcZx2dBtBXAyrzSsP1rv3vSkfDOEfNH1RVvjw=; b=IYqVESMpUpiYXspcYB1pAiGDabL4sqtrievxcV9lnCw2GNqtwISP2dwO10/X6sldFY KV5Lw57Jb59e5BPzK0J3gy9bYLRysEf+7J/2Mz98xx09TXfl5WGyFMqeRtsso5TO1fBa 9hkpZXZ9YXdABma/4Wq1LwzVMrj3zCtuuGQkr1vWQMfqVypBG6bsJhbngdofZXg23/tF d5RIA2rU3QC+axivBVw5onMxl9n/srNT60eTFP6NUhOF0MYerQVjCCYaurs8gbNEap5B d+ZoCEPtbtQxEQ2PRbmC9T16H1Eh2eF3I/IYHNiJeaOXrcvn2qf4ZXQAE/+RIJM/FeHd 3u1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772626647; x=1773231447; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-gg:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=r7e7fLOcZx2dBtBXAyrzSsP1rv3vSkfDOEfNH1RVvjw=; b=t18kWwn+2pwlsFlCAeQgjUvdC2v5VxpnuRoT/O1WJKAp6ZsB0S2gfNqTygu+Ah5o2k hrgCbf1zH27HMFPAZSK6mYDWQvQfX6IdiNtjW/ugvNVsQy4ZQ0X5KI6B4l/HeKltK+iq tkdTcZ831S1jth47RvUL2tUbP9eizx0Tw9KIkLZKAno06RDUVT1/nn+Gz3ufTD7RiA2r lqdz3RCwAfIPi6BgjsGvebbA/uozd2heL64NbPqOEEfjMS+j16055HrUFQGHEE/uKEXB fXgGlLBtnqRNl5zPrOZec6Z+lQ3Nx+fawiWQYvaovFaBLSUM6FfvK0P/IYjCt8MImbLM JVPg== X-Forwarded-Encrypted: i=1; AJvYcCVitW2wOylBnQPfLj57/QGbYsRUWsA0xxRkLcHD+P9ZpzITsFubwAfQMhCIuMzHlambepHVp7iNsWh7h04f@postgresql.org X-Gm-Message-State: AOJu0YwF2pkYcmlhEXmDqdffnqlBTMQP8VaMesEVVbu6n8jkh/SIjVS9 UuAyvwVAtHMTxskcDoDZUQ0q5hGi0dwrooKh3x0cDwarqzke3nPHexMR X-Gm-Gg: ATEYQzyvfsDFKSfokJaIMJYbLA3VZN9eZ+NB2qal+aesHkNtJ5GfvssXNeAQdy+114F H0PS694iEBDdbF3qP5g9mlRW0bH/bhqT8IE3KWkaiXlMLytoKT8SPSz+5jCZzq8YnZkw6RV/OoE NkrLT2OzWJToHkOsfR/BHzZ527fZH0xpWE/OElUmHY76Mm0GuhmKA33rxmFZVZlSFOQw9MEDCn1 D2cFpfR7v9/j6pJJ1LRLelhXiiwht7cFv299NNcb4uF8ZQmmm+mw7QwtdqdAraQ8VQ2bh96skqa ckoECCD2Q6+BtdcvjDQ/qg3sC3ZPgTMPrAaupN/9WRyGzNEHSkvVFBF6kVM0RH25K0HOtr9KdiL 6mcqx3ErT0wnbjAm7w9DL6gTV4v2k91A0TuBnOsrZV32VTjxDPnJ1KDjxkVi88gyIjI5rz8e0YW 2dcMaoJovorPTL6XnPIy31GisSPCqhzpMbGn1/jFIgfQtUGRXryFYwEdg7P/z9r3dxxaL5mcHuH QM0Kke4Mg== X-Received: by 2002:a05:7022:628e:b0:11b:c1ab:bdd4 with SMTP id a92af1059eb24-128b70e9575mr687864c88.38.1772626646851; Wed, 04 Mar 2026 04:17:26 -0800 (PST) Received: from [192.168.4.100] (163.116.230.145.netskope-rdns.com. [163.116.230.145]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12789a32dabsm21414402c88.11.2026.03.04.04.17.24 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 04 Mar 2026 04:17:25 -0800 (PST) Content-Type: multipart/mixed; boundary="------------I8Ps49nwRSBdir7Cm1044Xz9" Message-ID: <72ec1708-0c02-4ae9-b4f5-ee2bac5fd2f3@gmail.com> Date: Wed, 4 Mar 2026 09:17:21 -0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: postgres_fdw: Use COPY to speed up batch inserts To: Masahiko Sawada Cc: Andrew Dunstan , jian he , Tomas Vondra , pgsql-hackers@postgresql.org References: <5c52f4c7-74fa-4594-8378-53fd49f39329@dunslane.net> Content-Language: en-US From: Matheus Alcantara In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------I8Ps49nwRSBdir7Cm1044Xz9 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Thank you for the review. On 03/03/26 16:47, Masahiko Sawada wrote: > Thank you for updating the patch! Here are some review comments: > > + Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1); > + > + if (attr->attgenerated) > + continue; > + > + if (!first) > + appendStringInfoString(buf, ", "); > + > + first = false; > + > + appendStringInfoString(buf, > quote_identifier(NameStr(attr->attname))); > > We need to take care of the 'column_name' option here. If it's set we > should not use attr->attname as it is. > Fixed > -- > + } > + if (nattrs > 0) > + appendStringInfoString(buf, ") FROM STDIN"); > + else > + appendStringInfoString(buf, " FROM STDIN"); > +} > > It might be better to explicitly specify the format 'text'. > Fixed > --- > + if (useCopy) > + { > + deparseCopySql(&sql, rel, targetAttrs); > + values_end_len = 0; /* Keep compiler quiet */ > + } > + else > + deparseInsertSql(&sql, rte, resultRelation, rel, > targetAttrs, doNothing, > + > resultRelInfo->ri_WithCheckOptions, > + > resultRelInfo->ri_returningList, > + &retrieved_attrs, > &values_end_len); > > I think we should consider whether it's okay to use the COPY command > even if resultRelInfo->ri_WithCheckOptions is non-NULL. As far as I > researched, it's okay as we currently don't support COPY to a view but > please consider it as well. We might want to explain it too in the > comment. > Good point, fixed. > How about initializing values_end_len with 0 at its declaration? > Fixed > --- > +-- test that fdw also use COPY FROM as a remote sql > +set client_min_messages to 'log'; > + > +create function insert_or_copy() returns trigger as $$ > +declare query text; > +begin > + query := current_query(); > + if query ~* '^COPY' then > + raise notice 'COPY command'; > + elsif query ~* '^INSERT' then > + raise notice 'INSERT command'; > + end if; > +return new; > +end; > +$$ language plpgsql; > > On second thoughts, it might be okay to output the current_query() as it is. > Fixed > --- > +copy grem1 from stdin; > +3 > +\. > > I think it would be good to have more tests, for example, checking if > the COPY command method can work properly with batch_size and > column_name options. > I've added new test cases for these cases. To test the batch_size case I've added an elog(DEBUG1) because using the trigger with current_query() log an entry for each row that we send for the foreign server, with the elog(DEBUG1) we can expect one log message for each batch operation. Please let me know if there is better ways to do this. Please see the new attached version. -- Matheus Alcantara EDB: https://www.enterprisedb.com --------------I8Ps49nwRSBdir7Cm1044Xz9 Content-Type: text/plain; charset=UTF-8; name="v12-0001-postgres_fdw-Use-COPY-as-remote-SQL-when-possibl.patch" Content-Disposition: attachment; filename*0="v12-0001-postgres_fdw-Use-COPY-as-remote-SQL-when-possibl.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBlYmVmZmY0ZmFlMzQ0ZTRjYTkyZWJkMGFlZmQ1NGE5MDlmN2U4NWMyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0u bWU+CkRhdGU6IFdlZCwgMjggSmFuIDIwMjYgMTk6NTU6NDggLTAzMDAKU3ViamVjdDogW1BB VENIIHYxMl0gcG9zdGdyZXNfZmR3OiBVc2UgQ09QWSBhcyByZW1vdGUgU1FMIHdoZW4gcG9z c2libGUKClByZXZpb3VzbHkgd2hlbiBhbiB1c2VyIGV4ZWN1dGUgYSBDT1BZIG9uIGEgZm9y ZWlnbiB0YWJsZSwgcG9zdGdyZXNfZmR3CnNlbmQgYSBJTlNFUlQgYXMgYSByZW1vdGUgU1FM IHRvIHRoZSBmb3JlaWduIHNlcnZlci4gVGhpcyBjb21taXQKaW50cm9kdWNlIHRoZSBhYmls aXR5IHRvIHVzZSB0aGUgQ09QWSBjb21tYW5kIGluc3RlYWQuCgpUaGUgQ09QWSBjb21tYW5k IHdpbGwgb25seSBiZSB1c2VkIHdoZW4gYW4gdXNlciBleGVjdXRlIGEgQ09QWSBvbiBhCmZv cmVpZ24gdGFibGUgYW5kIGFsc28gdGhlIGZvcmVpZ24gdGFibGUgc2hvdWxkIG5vdCBoYXZl IHRyaWdnZXJzCmJlY2F1c2UgcmVtb3RlIHRyaWdnZXJzIG1pZ2h0IG1vZGlmeSB0aGUgaW5z ZXJ0ZWQgcm93IGFuZCBzaW5jZSBDT1BZCmRvZXMgbm90IHN1cHBvcnQgYSBSRVRVUk5JTkcg Y2xhdXNlLCB3ZSBjYW5ub3Qgc3luY2hyb25pemUgdGhlIGxvY2FsClR1cGxlVGFibGVTbG90 IHdpdGggdGhvc2UgY2hhbmdlcyBmb3IgdXNlIGluIGxvY2FsIEFGVEVSIHRyaWdnZXJzLCBz byBpZgp0aGUgZm9yZWlnbiB0YWJsZSBoYXMgYW55IHRyaWdnZXIgSU5TRVJUIHdpbGwgYmUg dXNlZC4KCkF1dGhvcjogTWF0aGV1cyBBbGNhbnRhcmEgPG10aHMuZGV2QHBtLm1lPgpSZXZp ZXdlZC1CeTogVG9tYXMgVm9uZHJhIDx0b21hc0B2b25kcmEubWU+ClJldmlld2VkLUJ5OiBK YWt1YiBXYXJ0YWsgPGpha3ViLndhcnRha0BlbnRlcnByaXNlZGIuY29tPgpSZXZpZXdlZC1C eTogamlhbiBoZSA8amlhbi51bml2ZXJzYWxpdHlAZ21haWwuY29tPgpSZXZpZXdlZC1CeTog RGV3ZWkgRGFpIDxkYWlkZXdlaTE5NzBAMTYzLmNvbT4KUmV2aWV3ZWQtQnk6IE1hc2FoaWtv IFNhd2FkYSA8c2F3YWRhLm1zaGtAZ21haWwuY29tPgoKRGlzY3Vzc2lvbjogaHR0cHM6Ly93 d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9mbGF0L0RESVpKMjE3T1VESy4yUjVXRTRP R0w1UFRZJTQwZ21haWwuY29tCi0tLQogY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5j ICAgICAgICAgICAgICAgIHwgIDU2ICsrKysrKwogLi4uL3Bvc3RncmVzX2Zkdy9leHBlY3Rl ZC9wb3N0Z3Jlc19mZHcub3V0ICAgIHwgIDQwICsrKy0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3 L3Bvc3RncmVzX2Zkdy5jICAgICAgICAgICB8IDE4NSArKysrKysrKysrKysrKysrKy0KIGNv bnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oICAgICAgICAgICB8ICAgMSArCiBj b250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbCAgICAgfCAgNDkgKysr KysKIDUgZmlsZXMgY2hhbmdlZCwgMzIyIGluc2VydGlvbnMoKyksIDkgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jIGIvY29udHJp Yi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jCmluZGV4IGViZTJjM2E1OTZhLi5jN2Q1M2E5ODUy NSAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jCisrKyBiL2Nv bnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2UuYwpAQCAtMjE3Nyw2ICsyMTc3LDYyIEBAIGRl cGFyc2VJbnNlcnRTcWwoU3RyaW5nSW5mbyBidWYsIFJhbmdlVGJsRW50cnkgKnJ0ZSwKIAkJ CQkJCSB3aXRoQ2hlY2tPcHRpb25MaXN0LCByZXR1cm5pbmdMaXN0LCByZXRyaWV2ZWRfYXR0 cnMpOwogfQogCisvKgorICogIEJ1aWxkIGEgQ09QWSBGUk9NIFNURElOIHN0YXRlbWVudCB1 c2luZyB0aGUgVEVYVCBmb3JtYXQKKyAqLwordm9pZAorZGVwYXJzZUNvcHlTcWwoU3RyaW5n SW5mbyBidWYsIFJlbGF0aW9uIHJlbCwgTGlzdCAqdGFyZ2V0X2F0dHJzKQoreworCU9pZAkJ CXJlbGlkID0gUmVsYXRpb25HZXRSZWxpZChyZWwpOworCVR1cGxlRGVzYwl0dXBkZXNjID0g UmVsYXRpb25HZXREZXNjcihyZWwpOworCWJvb2wJCWZpcnN0ID0gdHJ1ZTsKKwlpbnQJCQlu YXR0cnMgPSBsaXN0X2xlbmd0aCh0YXJnZXRfYXR0cnMpOworCisJYXBwZW5kU3RyaW5nSW5m byhidWYsICJDT1BZICIpOworCWRlcGFyc2VSZWxhdGlvbihidWYsIHJlbCk7CisJaWYgKG5h dHRycyA+IDApCisJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiKCIpOworCisJZm9yZWFjaF9p bnQoYXR0bnVtLCB0YXJnZXRfYXR0cnMpCisJeworCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHRy ID0gVHVwbGVEZXNjQXR0cih0dXBkZXNjLCBhdHRudW0gLSAxKTsKKwkJY2hhcgkgICAqY29s bmFtZTsKKwkJTGlzdAkgICAqb3B0aW9uczsKKwkJTGlzdENlbGwgICAqbGM7CisKKwkJaWYg KGF0dHItPmF0dGdlbmVyYXRlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZmlyc3QpCisJ CQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIiwgIik7CisKKwkJZmlyc3QgPSBmYWxz ZTsKKworCQkvKiBVc2UgYXR0cmlidXRlIG5hbWUgb3IgY29sdW1uX25hbWUgb3B0aW9uLiAq LworCQljb2xuYW1lID0gTmFtZVN0cihhdHRyLT5hdHRuYW1lKTsKKwkJb3B0aW9ucyA9IEdl dEZvcmVpZ25Db2x1bW5PcHRpb25zKHJlbGlkLCBhdHRudW0pOworCQlmb3JlYWNoKGxjLCBv cHRpb25zKQorCQl7CisJCQlEZWZFbGVtICAgICpkZWYgPSAoRGVmRWxlbSAqKSBsZmlyc3Qo bGMpOworCisJCQlpZiAoc3RyY21wKGRlZi0+ZGVmbmFtZSwgImNvbHVtbl9uYW1lIikgPT0g MCkKKwkJCXsKKwkJCQljb2xuYW1lID0gZGVmR2V0U3RyaW5nKGRlZik7CisJCQkJYnJlYWs7 CisJCQl9CisJCX0KKworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgcXVvdGVfaWRl bnRpZmllcihjb2xuYW1lKSk7CisJfQorCWlmIChuYXR0cnMgPiAwKQorCQlhcHBlbmRTdHJp bmdJbmZvU3RyaW5nKGJ1ZiwgIikgRlJPTSBTVERJTiIpOworCWVsc2UKKwkJYXBwZW5kU3Ry aW5nSW5mb1N0cmluZyhidWYsICIgRlJPTSBTVERJTiIpOworCisJYXBwZW5kU3RyaW5nSW5m b1N0cmluZyhidWYsICIgKEZPUk1BVCBURVhUKSIpOworfQorCisKIC8qCiAgKiByZWJ1aWxk IHJlbW90ZSBJTlNFUlQgc3RhdGVtZW50CiAgKgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0 Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dCBiL2NvbnRyaWIvcG9zdGdyZXNf ZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKaW5kZXggMmNjYjcyYzUzOWEuLjRhOTQ2 YTc2YWZlIDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0 Z3Jlc19mZHcub3V0CisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3Rn cmVzX2Zkdy5vdXQKQEAgLTc2MDMsNiArNzYwMywyOCBAQCBzZWxlY3QgKiBmcm9tIGdyZW0x OwogKDIgcm93cykKIAogZGVsZXRlIGZyb20gZ3JlbTE7CistLSB0ZXN0IHRoYXQgZmR3IGFs c28gdXNlIENPUFkgRlJPTSBhcyBhIHJlbW90ZSBzcWwKK3NldCBjbGllbnRfbWluX21lc3Nh Z2VzIHRvICdsb2cnOworY3JlYXRlIGZ1bmN0aW9uIGluc2VydF9vcl9jb3B5KCkgcmV0dXJu cyB0cmlnZ2VyIGFzICQkCitkZWNsYXJlIHF1ZXJ5IHRleHQ7CitiZWdpbgorICAgIHF1ZXJ5 IDo9IGN1cnJlbnRfcXVlcnkoKTsKKyAgICByYWlzZSBub3RpY2UgJyUnLCBxdWVyeTsKK3Jl dHVybiBuZXc7CitlbmQ7CiskJCBsYW5ndWFnZSBwbHBnc3FsOworQ1JFQVRFIFRSSUdHRVIg dHJpZ19yb3dfYmVmb3JlCitCRUZPUkUgSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUgT04g Z2xvYzEKK0ZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSBpbnNlcnRfb3JfY29weSgp OworY29weSBncmVtMSBmcm9tIHN0ZGluOworTE9HOiAgcmVjZWl2ZWQgbWVzc2FnZSB2aWEg cmVtb3RlIGNvbm5lY3Rpb246IE5PVElDRTogIENPUFkgcHVibGljLmdsb2MxKGEpIEZST00g U1RESU4gKEZPUk1BVCBURVhUKQorZHJvcCB0cmlnZ2VyIHRyaWdfcm93X2JlZm9yZSBvbiBn bG9jMTsKK3Jlc2V0IGNsaWVudF9taW5fbWVzc2FnZXM7CistLSB0ZXN0IHRoYXQgY29weSBk b2VzIG5vdCBmYWlsIHdpdGggY29sdW1uX25hbWUgYWxpYXMKK2NyZWF0ZSB0YWJsZSBnbG9j Mih4eHggaW50KTsKK2NyZWF0ZSBmb3JlaWduIHRhYmxlIGdyZW0yKGEgaW50KSBzZXJ2ZXIg bG9vcGJhY2sgb3B0aW9ucyh0YWJsZV9uYW1lICdnbG9jMicpOworYWx0ZXIgZm9yZWlnbiB0 YWJsZSBncmVtMiBhbHRlciBjb2x1bW4gYSBvcHRpb25zIChjb2x1bW5fbmFtZSAneHh4Jyk7 Citjb3B5IGdyZW0yIGZyb20gc3RkaW47CiAtLSB0ZXN0IGJhdGNoIGluc2VydAogYWx0ZXIg c2VydmVyIGxvb3BiYWNrIG9wdGlvbnMgKGFkZCBiYXRjaF9zaXplICcxMCcpOwogZXhwbGFp biAodmVyYm9zZSwgY29zdHMgb2ZmKQpAQCAtNzYyMCwxNiArNzY0MiwxOCBAQCBpbnNlcnQg aW50byBncmVtMSAoYSkgdmFsdWVzICgxKSwgKDIpOwogc2VsZWN0ICogZnJvbSBnbG9jMTsK ICBhIHwgYiB8IGMgCiAtLS0rLS0tKy0tLQorIDMgfCA2IHwgIAogIDEgfCAyIHwgIAogIDIg fCA0IHwgIAotKDIgcm93cykKKygzIHJvd3MpCiAKIHNlbGVjdCAqIGZyb20gZ3JlbTE7CiAg YSB8IGIgfCBjIAogLS0tKy0tLSstLS0KKyAzIHwgNiB8IDkKICAxIHwgMiB8IDMKICAyIHwg NCB8IDYKLSgyIHJvd3MpCisoMyByb3dzKQogCiBkZWxldGUgZnJvbSBncmVtMTsKIC0tIGJh dGNoIGluc2VydCB3aXRoIGZvcmVpZ24gcGFydGl0aW9ucy4KQEAgLTc2NTQsNiArNzY3OCwx MiBAQCBzZWxlY3QgY291bnQoKikgZnJvbSB0YWJfYmF0Y2hfc2hhcmRlZDsKIGRyb3AgdGFi bGUgdGFiX2JhdGNoX2xvY2FsOwogZHJvcCB0YWJsZSB0YWJfYmF0Y2hfc2hhcmRlZDsKIGRy b3AgdGFibGUgdGFiX2JhdGNoX3NoYXJkZWRfcDFfcmVtb3RlOworLS0gdGVzdCBiYXRjaCBp bnNlcnQgdXNpbmcgY29weQorc2V0IGNsaWVudF9taW5fbWVzc2FnZXMgdG8gJ2RlYnVnMSc7 Citjb3B5IGdyZW0xIGZyb20gc3RkaW47CitERUJVRzogIGZvcmVpZ24gbW9kaWZ5IHdpdGgg Q09QWSBiYXRjaF9zaXplOiAxMAorREVCVUc6ICBmb3JlaWduIG1vZGlmeSB3aXRoIENPUFkg YmF0Y2hfc2l6ZTogMTAKK3Jlc2V0IGNsaWVudF9taW5fbWVzc2FnZXM7CiBhbHRlciBzZXJ2 ZXIgbG9vcGJhY2sgb3B0aW9ucyAoZHJvcCBiYXRjaF9zaXplKTsKIC0tID09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KIC0tIHRlc3QgbG9jYWwgdHJpZ2dlcnMKQEAgLTk1NDQsNyArOTU3NCw4IEBAIGNvcHkg cmVtMiBmcm9tIHN0ZGluOwogY29weSByZW0yIGZyb20gc3RkaW47IC0tIEVSUk9SCiBFUlJP UjogIG5ldyByb3cgZm9yIHJlbGF0aW9uICJsb2MyIiB2aW9sYXRlcyBjaGVjayBjb25zdHJh aW50ICJsb2MyX2YxcG9zaXRpdmUiCiBERVRBSUw6ICBGYWlsaW5nIHJvdyBjb250YWlucyAo LTEsIHh5enp5KS4KLUNPTlRFWFQ6ICByZW1vdGUgU1FMIGNvbW1hbmQ6IElOU0VSVCBJTlRP IHB1YmxpYy5sb2MyKGYxLCBmMikgVkFMVUVTICgkMSwgJDIpCitDT05URVhUOiAgQ09QWSBs b2MyLCBsaW5lIDE6ICItMQl4eXp6eSIKK3JlbW90ZSBTUUwgY29tbWFuZDogQ09QWSBwdWJs aWMubG9jMihmMSwgZjIpIEZST00gU1RESU4gKEZPUk1BVCBURVhUKQogQ09QWSByZW0yLCBs aW5lIDE6ICItMQl4eXp6eSIKIHNlbGVjdCAqIGZyb20gcmVtMjsKICBmMSB8IGYyICAKQEAg LTk3MDEsNyArOTczMiw4IEBAIGNvcHkgcmVtMiBmcm9tIHN0ZGluOwogY29weSByZW0yIGZy b20gc3RkaW47IC0tIEVSUk9SCiBFUlJPUjogIG5ldyByb3cgZm9yIHJlbGF0aW9uICJsb2My IiB2aW9sYXRlcyBjaGVjayBjb25zdHJhaW50ICJsb2MyX2YxcG9zaXRpdmUiCiBERVRBSUw6 ICBGYWlsaW5nIHJvdyBjb250YWlucyAoLTEsIHh5enp5KS4KLUNPTlRFWFQ6ICByZW1vdGUg U1FMIGNvbW1hbmQ6IElOU0VSVCBJTlRPIHB1YmxpYy5sb2MyKGYxLCBmMikgVkFMVUVTICgk MSwgJDIpCitDT05URVhUOiAgQ09QWSBsb2MyLCBsaW5lIDE6ICItMQl4eXp6eSIKK3JlbW90 ZSBTUUwgY29tbWFuZDogQ09QWSBwdWJsaWMubG9jMihmMSwgZjIpIEZST00gU1RESU4gKEZP Uk1BVCBURVhUKQogQ09QWSByZW0yCiBzZWxlY3QgKiBmcm9tIHJlbTI7CiAgZjEgfCBmMiAg CmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYyBiL2Nv bnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCmluZGV4IDYwZDkwMzI5YTY1Li44 NjAyZjY3YjdkYyAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNf ZmR3LmMKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKQEAgLTYz LDYgKzYzLDkgQEAgUEdfTU9EVUxFX01BR0lDX0VYVCgKIC8qIElmIG5vIHJlbW90ZSBlc3Rp bWF0ZXMsIGFzc3VtZSBhIHNvcnQgY29zdHMgMjAlIGV4dHJhICovCiAjZGVmaW5lIERFRkFV TFRfRkRXX1NPUlRfTVVMVElQTElFUiAxLjIKIAorLyogQnVmZmVyIHNpemUgdG8gc2VuZCBD T1BZIElOIGRhdGEqLworI2RlZmluZSBDT1BZQlVGU0laIDgxOTIKKwogLyoKICAqIEluZGV4 ZXMgb2YgRkRXLXByaXZhdGUgaW5mb3JtYXRpb24gc3RvcmVkIGluIGZkd19wcml2YXRlIGxp c3RzLgogICoKQEAgLTE5OCw2ICsyMDEsOCBAQCB0eXBlZGVmIHN0cnVjdCBQZ0Zkd01vZGlm eVN0YXRlCiAJYm9vbAkJaGFzX3JldHVybmluZzsJLyogaXMgdGhlcmUgYSBSRVRVUk5JTkcg Y2xhdXNlPyAqLwogCUxpc3QJICAgKnJldHJpZXZlZF9hdHRyczsJLyogYXR0ciBudW1iZXJz IHJldHJpZXZlZCBieSBSRVRVUk5JTkcgKi8KIAorCWJvb2wJCXVzZV9jb3B5OworCiAJLyog aW5mbyBhYm91dCBwYXJhbWV0ZXJzIGZvciBwcmVwYXJlZCBzdGF0ZW1lbnQgKi8KIAlBdHRy TnVtYmVyCWN0aWRBdHRubzsJCS8qIGF0dG51bSBvZiBpbnB1dCByZXNqdW5rIGN0aWQgY29s dW1uICovCiAJaW50CQkJcF9udW1zOwkJCS8qIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRvIHRy YW5zbWl0ICovCkBAIC01NDUsNiArNTUwLDEyIEBAIHN0YXRpYyB2b2lkIG1lcmdlX2Zkd19v cHRpb25zKFBnRmR3UmVsYXRpb25JbmZvICpmcGluZm8sCiAJCQkJCQkJICBjb25zdCBQZ0Zk d1JlbGF0aW9uSW5mbyAqZnBpbmZvX28sCiAJCQkJCQkJICBjb25zdCBQZ0Zkd1JlbGF0aW9u SW5mbyAqZnBpbmZvX2kpOwogc3RhdGljIGludAlnZXRfYmF0Y2hfc2l6ZV9vcHRpb24oUmVs YXRpb24gcmVsKTsKK3N0YXRpYyBUdXBsZVRhYmxlU2xvdCAqKmV4ZWN1dGVfZm9yZWlnbl9t b2RpZnlfdXNpbmdfY29weShQZ0Zkd01vZGlmeVN0YXRlICpmbXN0YXRlLAorCQkJCQkJCQkJ CQkJCQkgIFR1cGxlVGFibGVTbG90ICoqc2xvdHMsCisJCQkJCQkJCQkJCQkJCSAgaW50ICpu dW1TbG90cyk7CitzdGF0aWMgdm9pZCBjb252ZXJ0X3Nsb3RfdG9fY29weV90ZXh0KFN0cmlu Z0luZm8gYnVmLAorCQkJCQkJCQkJICBQZ0Zkd01vZGlmeVN0YXRlICpmbXN0YXRlLAorCQkJ CQkJCQkJICBUdXBsZVRhYmxlU2xvdCAqc2xvdCk7CiAKIAogLyoKQEAgLTIxNjUsMTEgKzIx NzYsMTIgQEAgcG9zdGdyZXNCZWdpbkZvcmVpZ25JbnNlcnQoTW9kaWZ5VGFibGVTdGF0ZSAq bXRzdGF0ZSwKIAlSYW5nZVRibEVudHJ5ICpydGU7CiAJVHVwbGVEZXNjCXR1cGRlc2MgPSBS ZWxhdGlvbkdldERlc2NyKHJlbCk7CiAJaW50CQkJYXR0bnVtOwotCWludAkJCXZhbHVlc19l bmRfbGVuOworCWludAkJCXZhbHVlc19lbmRfbGVuID0gMDsKIAlTdHJpbmdJbmZvRGF0YSBz cWw7CiAJTGlzdAkgICAqdGFyZ2V0QXR0cnMgPSBOSUw7CiAJTGlzdAkgICAqcmV0cmlldmVk X2F0dHJzID0gTklMOwogCWJvb2wJCWRvTm90aGluZyA9IGZhbHNlOworCWJvb2wJCXVzZUNv cHkgPSBmYWxzZTsKIAogCS8qCiAJICogSWYgdGhlIGZvcmVpZ24gdGFibGUgd2UgYXJlIGFi b3V0IHRvIGluc2VydCByb3V0ZWQgcm93cyBpbnRvIGlzIGFsc28gYW4KQEAgLTIyNDcsMTEg KzIyNTksNDMgQEAgcG9zdGdyZXNCZWdpbkZvcmVpZ25JbnNlcnQoTW9kaWZ5VGFibGVTdGF0 ZSAqbXRzdGF0ZSwKIAkJcnRlID0gZXhlY19ydF9mZXRjaChyZXN1bHRSZWxhdGlvbiwgZXN0 YXRlKTsKIAl9CiAKKwkvKgorCSAqIFdlIGNhbiB1c2UgQ09QWSBmb3IgcmVtb3RlIGluc2Vy dHMgb25seSBpZiBhbGwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisJICogYXJlIG1ldDoK KwkgKgorCSAqIERpcmVjdCBFeGVjdXRpb246IFRoZSBjb21tYW5kIGlzIGEgQ09QWSBGUk9N IG9uIHRoZSBmb3JlaWduIHRhYmxlCisJICogaXRzZWxmLCBub3QgcGFydCBvZiBhIHBhcnRp dGlvbmVkIHRhYmxlJ3MgdHVwbGUgcm91dGluZy4gKAorCSAqIHJlc3VsdFJlbEluZm8tPnJp X1Jvb3RSZXN1bHRSZWxJbmZvID09IE5VTEwpCisJICoKKwkgKiBObyBDaGVjayBPcHRpb25z OiBUaGVyZSBhcmUgbm8gV0lUSCBDSEVDSyBPUFRJT04gY29uc3RyYWludHMgb3IKKwkgKiBS b3ctTGV2ZWwgU2VjdXJpdHkgcG9saWNpZXMgdGhhdCBuZWVkIHRvIGJlIGVuZm9yY2VkIGxv Y2FsbHkKKwkgKiAocmVzdWx0UmVsSW5mby0+cmlfV2l0aENoZWNrT3B0aW9ucyA9PSBOSUwp LgorCSAqCisJICogTm8gTG9jYWwgQUZURVIgVHJpZ2dlcnM6IFRoZXJlIGFyZSBubyBBRlRF UiBST1cgdHJpZ2dlcnMgZGVmaW5lZAorCSAqIGxvY2FsbHkgb24gdGhlIGZvcmVpZ24gdGFi bGUuCisJICoKKwkgKiBSZW1vdGUgdHJpZ2dlcnMgbWlnaHQgbW9kaWZ5IHRoZSBpbnNlcnRl ZCByb3cuIEJlY2F1c2UgdGhlIENPUFkKKwkgKiBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0 IGEgUkVUVVJOSU5HIGNsYXVzZSwgd2UgY2Fubm90IHJldHJpZXZlIHRob3NlCisJICogY2hh bmdlcyB0byBzeW5jaHJvbml6ZSB0aGUgbG9jYWwgVHVwbGVUYWJsZVNsb3QgcmVxdWlyZWQg YnkgbG9jYWwgQUZURVIKKwkgKiB0cmlnZ2Vycy4KKwkgKi8KKwlpZiAocmVzdWx0UmVsSW5m by0+cmlfUm9vdFJlc3VsdFJlbEluZm8gPT0gTlVMTCAmJiByZXN1bHRSZWxJbmZvLT5yaV9X aXRoQ2hlY2tPcHRpb25zID09IE5JTCkKKwl7CisJCS8qIFRoZXJlIGlzIG5vIFJFVFVSTklO RyBjbGF1c2Ugb24gQ09QWSAqLworCQlBc3NlcnQocmVzdWx0UmVsSW5mby0+cmlfcmV0dXJu aW5nTGlzdCA9PSBOSUwpOworCisJCXVzZUNvcHkgPSAocmVzdWx0UmVsSW5mby0+cmlfVHJp Z0Rlc2MgPT0gTlVMTCB8fAorCQkJCSAgICFyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVzYy0+ dHJpZ19pbnNlcnRfYWZ0ZXJfcm93KTsKKwl9CisKIAkvKiBDb25zdHJ1Y3QgdGhlIFNRTCBj b21tYW5kIHN0cmluZy4gKi8KLQlkZXBhcnNlSW5zZXJ0U3FsKCZzcWwsIHJ0ZSwgcmVzdWx0 UmVsYXRpb24sIHJlbCwgdGFyZ2V0QXR0cnMsIGRvTm90aGluZywKLQkJCQkJIHJlc3VsdFJl bEluZm8tPnJpX1dpdGhDaGVja09wdGlvbnMsCi0JCQkJCSByZXN1bHRSZWxJbmZvLT5yaV9y ZXR1cm5pbmdMaXN0LAotCQkJCQkgJnJldHJpZXZlZF9hdHRycywgJnZhbHVlc19lbmRfbGVu KTsKKwlpZiAodXNlQ29weSkKKwkJZGVwYXJzZUNvcHlTcWwoJnNxbCwgcmVsLCB0YXJnZXRB dHRycyk7CisJZWxzZQorCQlkZXBhcnNlSW5zZXJ0U3FsKCZzcWwsIHJ0ZSwgcmVzdWx0UmVs YXRpb24sIHJlbCwgdGFyZ2V0QXR0cnMsIGRvTm90aGluZywKKwkJCQkJCSByZXN1bHRSZWxJ bmZvLT5yaV9XaXRoQ2hlY2tPcHRpb25zLAorCQkJCQkJIHJlc3VsdFJlbEluZm8tPnJpX3Jl dHVybmluZ0xpc3QsCisJCQkJCQkgJnJldHJpZXZlZF9hdHRycywgJnZhbHVlc19lbmRfbGVu KTsKIAogCS8qIENvbnN0cnVjdCBhbiBleGVjdXRpb24gc3RhdGUuICovCiAJZm1zdGF0ZSA9 IGNyZWF0ZV9mb3JlaWduX21vZGlmeShtdHN0YXRlLT5wcy5zdGF0ZSwKQEAgLTIyNjQsNiAr MjMwOCw3IEBAIHBvc3RncmVzQmVnaW5Gb3JlaWduSW5zZXJ0KE1vZGlmeVRhYmxlU3RhdGUg Km10c3RhdGUsCiAJCQkJCQkJCQl2YWx1ZXNfZW5kX2xlbiwKIAkJCQkJCQkJCXJldHJpZXZl ZF9hdHRycyAhPSBOSUwsCiAJCQkJCQkJCQlyZXRyaWV2ZWRfYXR0cnMpOworCWZtc3RhdGUt PnVzZV9jb3B5ID0gdXNlQ29weTsKIAogCS8qCiAJICogSWYgdGhlIGdpdmVuIHJlc3VsdFJl bEluZm8gYWxyZWFkeSBoYXMgUGdGZHdNb2RpZnlTdGF0ZSBzZXQsIGl0IG1lYW5zCkBAIC00 MDkzLDYgKzQxMzgsOSBAQCBleGVjdXRlX2ZvcmVpZ25fbW9kaWZ5KEVTdGF0ZSAqZXN0YXRl LAogCQkgICBvcGVyYXRpb24gPT0gQ01EX1VQREFURSB8fAogCQkgICBvcGVyYXRpb24gPT0g Q01EX0RFTEVURSk7CiAKKwlpZiAoZm1zdGF0ZS0+dXNlX2NvcHkpCisJCXJldHVybiBleGVj dXRlX2ZvcmVpZ25fbW9kaWZ5X3VzaW5nX2NvcHkoZm1zdGF0ZSwgc2xvdHMsIG51bVNsb3Rz KTsKKwogCS8qIEZpcnN0LCBwcm9jZXNzIGEgcGVuZGluZyBhc3luY2hyb25vdXMgcmVxdWVz dCwgaWYgYW55LiAqLwogCWlmIChmbXN0YXRlLT5jb25uX3N0YXRlLT5wZW5kaW5nQXJlcSkK IAkJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3QoZm1zdGF0ZS0+Y29ubl9zdGF0ZS0+cGVuZGlu Z0FyZXEpOwpAQCAtNzg4NiwzICs3OTM0LDEzMCBAQCBnZXRfYmF0Y2hfc2l6ZV9vcHRpb24o UmVsYXRpb24gcmVsKQogCiAJcmV0dXJuIGJhdGNoX3NpemU7CiB9CisKKy8qCisgKiBleGVj dXRlX2ZvcmVpZ25fbW9kaWZ5X3VzaW5nX2NvcHkKKyAqCQlQZXJmb3JtIGZvcmVpZ24tdGFi bGUgbW9kaWZpY2F0aW9uIHVzaW5nIHRoZSBDT1BZIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBU dXBsZVRhYmxlU2xvdCAqKgorZXhlY3V0ZV9mb3JlaWduX21vZGlmeV91c2luZ19jb3B5KFBn RmR3TW9kaWZ5U3RhdGUgKmZtc3RhdGUsCisJCQkJCQkJCSAgVHVwbGVUYWJsZVNsb3QgKipz bG90cywKKwkJCQkJCQkJICBpbnQgKm51bVNsb3RzKQoreworCVBHcmVzdWx0ICAgKnJlczsK KwlTdHJpbmdJbmZvRGF0YSBjb3B5X2RhdGE7CisJaW50CQkJbl9yb3dzOworCWludAkJCWk7 CisKKwlBc3NlcnQoZm1zdGF0ZS0+dXNlX2NvcHkgPT0gdHJ1ZSk7CisKKwllbG9nKERFQlVH MSwgImZvcmVpZ24gbW9kaWZ5IHdpdGggQ09QWSBiYXRjaF9zaXplOiAlZCIsIGZtc3RhdGUt PmJhdGNoX3NpemUpOworCisJLyogU2VuZCBDT1BZIGNvbW1hbmQgKi8KKwlpZiAoIVBRc2Vu ZFF1ZXJ5KGZtc3RhdGUtPmNvbm4sIGZtc3RhdGUtPnF1ZXJ5KSkKKwkJcGdmZHdfcmVwb3J0 X2Vycm9yKE5VTEwsIGZtc3RhdGUtPmNvbm4sIGZtc3RhdGUtPnF1ZXJ5KTsKKworCS8qIGdl dCB0aGUgQ09QWSByZXN1bHQgKi8KKwlyZXMgPSBwZ2Zkd19nZXRfcmVzdWx0KGZtc3RhdGUt PmNvbm4pOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPUFlfSU4pCisJ CXBnZmR3X3JlcG9ydF9lcnJvcihyZXMsIGZtc3RhdGUtPmNvbm4sIGZtc3RhdGUtPnF1ZXJ5 KTsKKworCS8qIENsZWFuIHVwIHRoZSBDT1BZIGNvbW1hbmQgcmVzdWx0ICovCisJUFFjbGVh cihyZXMpOworCisJLyogQ29udmVydCB0aGUgVHVwbGVUYWJsZVNsb3QgZGF0YSBpbnRvIGEg VEVYVC1mb3JtYXR0ZWQgbGluZSAqLworCWluaXRTdHJpbmdJbmZvKCZjb3B5X2RhdGEpOwor CWZvciAoaSA9IDA7IGkgPCAqbnVtU2xvdHM7IGkrKykKKwl7CisJCWNvbnZlcnRfc2xvdF90 b19jb3B5X3RleHQoJmNvcHlfZGF0YSwgZm1zdGF0ZSwgc2xvdHNbaV0pOworCisJCS8qCisJ CSAqIFNlbmQgaW5pdGlhbCBDT1BZIGRhdGEgaWYgdGhlIGJ1ZmZlciByZWFjaGVzIHRoZSBs aW1pdCB0byBhdm9pZAorCQkgKiBsYXJnZSBtZW1vcnkgdXNhZ2UuCisJCSAqLworCQlpZiAo Y29weV9kYXRhLmxlbiA+PSBDT1BZQlVGU0laKQorCQl7CisJCQlpZiAoUFFwdXRDb3B5RGF0 YShmbXN0YXRlLT5jb25uLCBjb3B5X2RhdGEuZGF0YSwgY29weV9kYXRhLmxlbikgPD0gMCkK KwkJCQlwZ2Zkd19yZXBvcnRfZXJyb3IoTlVMTCwgZm1zdGF0ZS0+Y29ubiwgZm1zdGF0ZS0+ cXVlcnkpOworCQkJcmVzZXRTdHJpbmdJbmZvKCZjb3B5X2RhdGEpOworCQl9CisJfQorCisJ LyogU2VuZCB0aGUgcmVtYWluaW5nIENPUFkgZGF0YSAqLworCWlmIChjb3B5X2RhdGEubGVu ID4gMCkKKwl7CisJCWlmIChQUXB1dENvcHlEYXRhKGZtc3RhdGUtPmNvbm4sIGNvcHlfZGF0 YS5kYXRhLCBjb3B5X2RhdGEubGVuKSA8PSAwKQorCQkJcGdmZHdfcmVwb3J0X2Vycm9yKE5V TEwsIGZtc3RhdGUtPmNvbm4sIGZtc3RhdGUtPnF1ZXJ5KTsKKwl9CisKKwlwZnJlZShjb3B5 X2RhdGEuZGF0YSk7CisKKwkvKiBFbmQgdGhlIENPUFkgb3BlcmF0aW9uICovCisJaWYgKFBR cHV0Q29weUVuZChmbXN0YXRlLT5jb25uLCBOVUxMKSA8IDAgfHwgUFFmbHVzaChmbXN0YXRl LT5jb25uKSkKKwkJcGdmZHdfcmVwb3J0X2Vycm9yKE5VTEwsIGZtc3RhdGUtPmNvbm4sIGZt c3RhdGUtPnF1ZXJ5KTsKKworCS8qCisJICogR2V0IHRoZSByZXN1bHQsIGFuZCBjaGVjayBm b3Igc3VjY2Vzcy4KKwkgKi8KKwlyZXMgPSBwZ2Zkd19nZXRfcmVzdWx0KGZtc3RhdGUtPmNv bm4pOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0spCisJ CXBnZmR3X3JlcG9ydF9lcnJvcihyZXMsIGZtc3RhdGUtPmNvbm4sIGZtc3RhdGUtPnF1ZXJ5 KTsKKworCW5fcm93cyA9IGF0b2koUFFjbWRUdXBsZXMocmVzKSk7CisKKwkvKiBBbmQgY2xl YW4gdXAgKi8KKwlQUWNsZWFyKHJlcyk7CisKKwlNZW1vcnlDb250ZXh0UmVzZXQoZm1zdGF0 ZS0+dGVtcF9jeHQpOworCisJKm51bVNsb3RzID0gbl9yb3dzOworCisJLyoKKwkgKiBSZXR1 cm4gTlVMTCBpZiBub3RoaW5nIHdhcyBpbnNlcnRlZCBvbiB0aGUgcmVtb3RlIGVuZAorCSAq LworCXJldHVybiAobl9yb3dzID4gMCkgPyBzbG90cyA6IE5VTEw7Cit9CisKKy8qCisgKiAg V3JpdGUgdGFyZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBmbXN0YXRlIGludG8gYnVmIGJ1 ZmZlciB0byBiZSBzZW50IGFzCisgKiAgQ09QWSBGUk9NIFNURElOIGRhdGEKKyAqLworc3Rh dGljIHZvaWQKK2NvbnZlcnRfc2xvdF90b19jb3B5X3RleHQoU3RyaW5nSW5mbyBidWYsCisJ CQkJCQkgIFBnRmR3TW9kaWZ5U3RhdGUgKmZtc3RhdGUsCisJCQkJCQkgIFR1cGxlVGFibGVT bG90ICpzbG90KQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihm bXN0YXRlLT5yZWwpOworCWJvb2wJCWZpcnN0ID0gdHJ1ZTsKKwlpbnQJCQlpID0gMDsKKwor CWZvcmVhY2hfaW50KGF0dG51bSwgZm1zdGF0ZS0+dGFyZ2V0X2F0dHJzKQorCXsKKwkJQ29t cGFjdEF0dHJpYnV0ZSAqYXR0ciA9IFR1cGxlRGVzY0NvbXBhY3RBdHRyKHR1cGRlc2MsIGF0 dG51bSAtIDEpOworCQlEYXR1bQkJZGF0dW07CisJCWJvb2wJCWlzbnVsbDsKKworCQkvKiBJ Z25vcmUgZ2VuZXJhdGVkIGNvbHVtbnM7IHRoZXkgYXJlIHNldCB0byBERUZBVUxUICovCisJ CWlmIChhdHRyLT5hdHRnZW5lcmF0ZWQpCisJCQljb250aW51ZTsKKworCQlpZiAoIWZpcnN0 KQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybyhidWYsICdcdCcpOworCQlmaXJzdCA9 IGZhbHNlOworCisJCWRhdHVtID0gc2xvdF9nZXRhdHRyKHNsb3QsIGF0dG51bSwgJmlzbnVs bCk7CisKKwkJaWYgKGlzbnVsbCkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAi XFxOIik7CisJCWVsc2UKKwkJeworCQkJY29uc3QgY2hhciAqdmFsdWUgPSBPdXRwdXRGdW5j dGlvbkNhbGwoJmZtc3RhdGUtPnBfZmxpbmZvW2ldLAorCQkJCQkJCQkJCQkJICAgZGF0dW0p OworCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgdmFsdWUpOworCQl9CisJCWkr KzsKKwl9CisKKwlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3JvKGJ1ZiwgJ1xuJyk7Cit9CmRp ZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaCBiL2NvbnRy aWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oCmluZGV4IGEyYmIxZmYzNTJjLi5mYzY5 MjJkZGQ0ZiAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3 LmgKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmgKQEAgLTIwNCw2 ICsyMDQsNyBAQCBleHRlcm4gdm9pZCByZWJ1aWxkSW5zZXJ0U3FsKFN0cmluZ0luZm8gYnVm LCBSZWxhdGlvbiByZWwsCiAJCQkJCQkJIGNoYXIgKm9yaWdfcXVlcnksIExpc3QgKnRhcmdl dF9hdHRycywKIAkJCQkJCQkgaW50IHZhbHVlc19lbmRfbGVuLCBpbnQgbnVtX3BhcmFtcywK IAkJCQkJCQkgaW50IG51bV9yb3dzKTsKK2V4dGVybiB2b2lkIGRlcGFyc2VDb3B5U3FsKFN0 cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIExpc3QgKnRhcmdldF9hdHRycyk7CiBleHRl cm4gdm9pZCBkZXBhcnNlVXBkYXRlU3FsKFN0cmluZ0luZm8gYnVmLCBSYW5nZVRibEVudHJ5 ICpydGUsCiAJCQkJCQkJIEluZGV4IHJ0aW5kZXgsIFJlbGF0aW9uIHJlbCwKIAkJCQkJCQkg TGlzdCAqdGFyZ2V0QXR0cnMsCmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9z cWwvcG9zdGdyZXNfZmR3LnNxbCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jl c19mZHcuc3FsCmluZGV4IDcyZDJkOWMzMTFiLi4xYTFlY2IwNDNiZiAxMDA2NDQKLS0tIGEv Y29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKKysrIGIvY29udHJp Yi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKQEAgLTE5MjksNiArMTkyOSwz NyBAQCBzZWxlY3QgKiBmcm9tIGdsb2MxOwogc2VsZWN0ICogZnJvbSBncmVtMTsKIGRlbGV0 ZSBmcm9tIGdyZW0xOwogCistLSB0ZXN0IHRoYXQgZmR3IGFsc28gdXNlIENPUFkgRlJPTSBh cyBhIHJlbW90ZSBzcWwKK3NldCBjbGllbnRfbWluX21lc3NhZ2VzIHRvICdsb2cnOworCitj cmVhdGUgZnVuY3Rpb24gaW5zZXJ0X29yX2NvcHkoKSByZXR1cm5zIHRyaWdnZXIgYXMgJCQK K2RlY2xhcmUgcXVlcnkgdGV4dDsKK2JlZ2luCisgICAgcXVlcnkgOj0gY3VycmVudF9xdWVy eSgpOworICAgIHJhaXNlIG5vdGljZSAnJScsIHF1ZXJ5OworcmV0dXJuIG5ldzsKK2VuZDsK KyQkIGxhbmd1YWdlIHBscGdzcWw7CisKK0NSRUFURSBUUklHR0VSIHRyaWdfcm93X2JlZm9y ZQorQkVGT1JFIElOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIE9OIGdsb2MxCitGT1IgRUFD SCBST1cgRVhFQ1VURSBQUk9DRURVUkUgaW5zZXJ0X29yX2NvcHkoKTsKKworY29weSBncmVt MSBmcm9tIHN0ZGluOworMworXC4KKworZHJvcCB0cmlnZ2VyIHRyaWdfcm93X2JlZm9yZSBv biBnbG9jMTsKK3Jlc2V0IGNsaWVudF9taW5fbWVzc2FnZXM7CisKKy0tIHRlc3QgdGhhdCBj b3B5IGRvZXMgbm90IGZhaWwgd2l0aCBjb2x1bW5fbmFtZSBhbGlhcworY3JlYXRlIHRhYmxl IGdsb2MyKHh4eCBpbnQpOworY3JlYXRlIGZvcmVpZ24gdGFibGUgZ3JlbTIoYSBpbnQpIHNl cnZlciBsb29wYmFjayBvcHRpb25zKHRhYmxlX25hbWUgJ2dsb2MyJyk7CithbHRlciBmb3Jl aWduIHRhYmxlIGdyZW0yIGFsdGVyIGNvbHVtbiBhIG9wdGlvbnMgKGNvbHVtbl9uYW1lICd4 eHgnKTsKK2NvcHkgZ3JlbTIgZnJvbSBzdGRpbjsKKzEKK1wuCisKIC0tIHRlc3QgYmF0Y2gg aW5zZXJ0CiBhbHRlciBzZXJ2ZXIgbG9vcGJhY2sgb3B0aW9ucyAoYWRkIGJhdGNoX3NpemUg JzEwJyk7CiBleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCkBAIC0xOTU1LDYgKzE5ODYs MjQgQEAgZHJvcCB0YWJsZSB0YWJfYmF0Y2hfbG9jYWw7CiBkcm9wIHRhYmxlIHRhYl9iYXRj aF9zaGFyZGVkOwogZHJvcCB0YWJsZSB0YWJfYmF0Y2hfc2hhcmRlZF9wMV9yZW1vdGU7CiAK Ky0tIHRlc3QgYmF0Y2ggaW5zZXJ0IHVzaW5nIGNvcHkKK3NldCBjbGllbnRfbWluX21lc3Nh Z2VzIHRvICdkZWJ1ZzEnOworY29weSBncmVtMSBmcm9tIHN0ZGluOworMQorMgorMworNAor NQorNgorNworOAorOQorMTAKKzExCisxMgorXC4KK3Jlc2V0IGNsaWVudF9taW5fbWVzc2Fn ZXM7CisKIGFsdGVyIHNlcnZlciBsb29wYmFjayBvcHRpb25zIChkcm9wIGJhdGNoX3NpemUp OwogCiAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Ci0tIAoyLjUyLjAKCg== --------------I8Ps49nwRSBdir7Cm1044Xz9--