Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v60Qa-00FLkj-KO for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Oct 2025 05:40:01 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1v60QY-00Di8O-Bh for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Oct 2025 05:39:59 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v60QX-00Di7q-G7 for pgsql-hackers@lists.postgresql.org; Tue, 07 Oct 2025 05:39:58 +0000 Received: from flow-b2-smtp.messagingengine.com ([202.12.124.137]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1v60QV-000nlW-0S for pgsql-hackers@postgresql.org; Tue, 07 Oct 2025 05:39:58 +0000 Received: from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44]) by mailflow.stl.internal (Postfix) with ESMTP id AC01A1300305; Tue, 7 Oct 2025 01:39:51 -0400 (EDT) Received: from phl-imap-03 ([10.202.2.93]) by phl-compute-04.internal (MEProxy); Tue, 07 Oct 2025 01:39:51 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1759815591; x=1759822791; bh=cvmhKx4+cF LIdUuPupvAxgrpbFduTaqfQGkaXQ+vk/E=; b=OwX9RSxzh7OoISnPxxlvIH6HXs IR4dBW0MU42OOf4dMVizVrO//hZLZXcs116e2eRQpeODjd7ID7j8mcKVB/Cahqxt YXW8ZC5VIh9552DEhUpe40nqWakB934pkgkpJE6xvqBnF+td5uUOUBP4u2el6x6G uSb4YfK/jTEC4/5JtJQw4Ey3nBgOf7tYx/dHxf4OgXy7Nwy6u3bfpVXT+CDrUZ70 M+mWJSpuV88Up670BPB309CdOaXxp6oeXqGh8S0ko5EmFZwvPm4kKDMUh4B37K9V iDsXCfCov76gT6WTWC+pk63oYfDr+iyzRZWnpQFSz5ybvf6ozy6X1C1jBkzg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t= 1759815591; x=1759822791; bh=cvmhKx4+cFLIdUuPupvAxgrpbFduTaqfQGk aXQ+vk/E=; b=SjPuIFfKmcmDQakw5ZxH8636IuRBgaAeX/i29vTmbLPAFo9M9Zq XhUVRuIHyKjWUWAFqhtjMYVwq1qQlaITyn8WKsltk9etqa7eLZWq5bLPhBQe3cQp 9wefWwbFO4AjcLVSuMbNuITpnyKfy7baguaiP+Xda6wRH91ypRSKHGyHButeygA0 SUCycJtShJy1WM2Ev37CWsL7odanw6Jd03KW3GX1hm0yCptQp/cl2pYoVqbVfeSv XcWLR+jSqYAgN7DILk4oKlmsGZFuzt3G+Ip2H7LE6zNj3lkBbvnv4rfOhxeLdNrb myv7V8WnXiHwzwMn9Kiz1aKAOyeYIH/jcpQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdelleeitdcutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecunecujfgurhepofggfffhvfevkfgjfhfutgesmhdtreerre dttdenucfhrhhomhepfdflohgvlhculfgrtghosghsohhnfdcuoehjohgvlhestghomhhp ihhlvghrrdhorhhgqeenucggtffrrghtthgvrhhnpeffgfelffffvdehhfeigeefieejud ejvdeiueevueeggfevueekveeiteehhfetieenucevlhhushhtvghrufhiiigvpedtnecu rfgrrhgrmhepmhgrihhlfhhrohhmpehjohgvlhestghomhhpihhlvghrrdhorhhgpdhnsg gprhgtphhtthhopedvpdhmohguvgepshhmthhpohhuthdprhgtphhtthhopehpghhsqhhl qdhhrggtkhgvrhhssehpohhsthhgrhgvshhqlhdrohhrghdprhgtphhtthhopehtghhlse hsshhsrdhpghhhrdhprgdruhhs X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id 173FF18E0054; Tue, 7 Oct 2025 01:39:51 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: AZ7XRsRLdGms Date: Tue, 07 Oct 2025 07:39:08 +0200 From: "Joel Jacobson" To: "Tom Lane" Cc: pgsql-hackers Message-Id: In-Reply-To: References: <6899c044-4a82-49be-8117-e6f669765f7e@app.fastmail.com> <165530.1752362320@sss.pgh.pa.us> <02a7cd37-e2fc-4212-8b19-f8c239c95fb8@app.fastmail.com> <96f00bf1-cc9d-4520-9d02-9e14e7767c88@app.fastmail.com> <30c2aa7d-dd6c-4b68-a2e4-f217a1a34acf@app.fastmail.com> <0b4d402a-9ac2-4aa8-acf8-8231dbe579ea@app.fastmail.com> <3095599.1758644879@sss.pgh.pa.us> <0dc6a2cc-5216-4dc1-9dd2-430cafc6095b@app.fastmail.com> <52CC167F-763B-4ECA-B0B4-DAB381816828@gmail.com> <9186C6D0-F7A9-482A-9183-89E530B57E36@gmail.com> <1073593.1759423179@sss.pgh.pa.us> <4bd5e6c4-6fa7-44bb-869d-59a32a331fa8@app.fastmail.com> Subject: Re: Optimize LISTEN/NOTIFY Content-Type: multipart/mixed; boundary=b0c8f941d6074315ac18ff943060fc31 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --b0c8f941d6074315ac18ff943060fc31 Content-Type: text/plain Content-Transfer-Encoding: 7bit On Mon, Oct 6, 2025, at 22:22, Joel Jacobson wrote: > On Mon, Oct 6, 2025, at 22:11, Joel Jacobson wrote: >> The patch is now using dshash. I've been looking at code in launcher.c >> when implementing it. The function init_channel_hash() ended up being >> very similar to launcher.c's logicalrep_launcher_attach_dshmem(). > > Noticed a mistake on one line just after pressing send. > Sorry about that, new version attached. Trying to fix the NetBSD failure. I don't understand why 001_constraint_validation, test 'list_parted2_def scanned' and test 'part_5 verified by existing constraints' should be affected by this patch. I guess I could have gotten something wrong with the locking with dshash, that might somehow affect other tests? I've changed the dshash_find() in SignalBackends from dshash_find(..., false) to dshash_find(..., true), that is, to take an exclusive lock instead. Not sure if this is necessary, since we're not modifying the entry, but we're already holding an exclusive lock on NotifyQueueLock here, so I don't think it should affect concurrency. Any help on looking specifically at the dshash code would be much appreciated, since I'm new to this interface. /Joel --b0c8f941d6074315ac18ff943060fc31 Content-Disposition: attachment; filename="optimize_listen_notify-v9.patch" Content-Type: application/octet-stream; name="optimize_listen_notify-v9.patch" Content-Transfer-Encoding: base64 RnJvbSAwYmM0MjgzMTIxNDQxYTgwYzU1YTkyYzViMjlmZThkYTllZDY1Y2E4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogU3VuLCAyOCBTZXAgMjAyNSAxNDo1Mzo1NyArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIE9wdGltaXplIExJU1RFTi9OT1RJRlkgd2l0aCBjaGFubmVsLXNwZWNpZmljIGxpc3Rl bmVyCiB0cmFja2luZwoKQ3VycmVudGx5LCBpZGxlIGxpc3RlbmluZyBiYWNrZW5kcyBjYXVz ZSBhIGRyYW1hdGljIHNsb3dkb3duIGR1ZSB0bwpjb250ZXh0IHN3aXRjaGluZyB3aGVuIHRo ZXkgYXJlIHNpZ25hbGVkIGFuZCB3YWtlIHVwLiBUaGlzIGlzIHdhc3RlZnVsCndoZW4gdGhl eSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY2hhbm5lbCBiZWluZyBub3RpZmllZC4KCkp1 c3QgMTAgZXh0cmEgaWRsZSBsaXN0ZW5pbmcgY29ubmVjdGlvbnMgY2F1c2UgYSBzbG93ZG93 biBmcm9tIDg3MDAgVFBTCnRvIDYxMDAgVFBTLCAxMDAgZXh0cmEgY2F1c2UgaXQgdG8gZHJv cCB0byAyMDAwIFRQUywgYW5kIGF0IDEwMDAgZXh0cmEKaXQgZmFsbHMgdG8gMjUwIFRQUy4K ClRoaXMgcGF0Y2ggaW50cm9kdWNlcyB0YXJnZXRlZCBzaWduYWxpbmcgZm9yIExJU1RFTi9O T1RJRlksIGltcHJvdmluZwpzY2FsYWJpbGl0eSBpbiB3b3JrbG9hZHMgd2l0aCBtYW55IGlk bGUgbGlzdGVuZXJzLgoKQSBkeW5hbWljIHNoYXJlZCBoYXNoIHRhYmxlIG5vdyB0cmFja3Mg d2hpY2ggYmFja2VuZHMgbGlzdGVuIG9uIGVhY2gKKGRhdGFiYXNlLCBjaGFubmVsKSBwYWly LCB3aGljaCBTaWduYWxCYWNrZW5kcygpIHVzZXMgdG8gcGVyZm9ybQp0YXJnZXRlZCBzaWdu YWxpbmcuICBJbiBhZGRpdGlvbiwgaXQgc3RhZ2dlcnMgd2FrZXVwcyBieSBzaWduYWxpbmcg b25lCmJhY2tlbmQgYXQgdGhlIGdsb2JhbCB0YWlsIHRvIGhlbHAgaXQgYWR2YW5jZSBncmFk dWFsbHksIGFuZCBmb3JjZXMgYW55CmV4Y2Vzc2l2ZWx5IGxhZ2dpbmcgYmFja2VuZHMgdG8g Y2F0Y2ggdXAuICBBIHBlci1iYWNrZW5kIHdha2V1cF9wZW5kaW5nCmZsYWcgYXZvaWRzIHJl ZHVuZGFudCBzaWduYWxzLgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMgICAg ICAgICAgICAgICAgICB8IDQ4MSArKysrKysrKysrKysrKysrLS0KIC4uLi91dGlscy9hY3Rp dml0eS93YWl0X2V2ZW50X25hbWVzLnR4dCAgICAgICB8ICAgMSArCiBzcmMvaW5jbHVkZS9z dG9yYWdlL2x3bG9ja2xpc3QuaCAgICAgICAgICAgICAgfCAgIDEgKwogMyBmaWxlcyBjaGFu Z2VkLCA0NDUgaW5zZXJ0aW9ucygrKSwgMzggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2Fz eW5jLmMKaW5kZXggNGJkMzdkNWJlYjUuLmI2MTliMDFkYTYyIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9jb21tYW5kcy9hc3luYy5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2Fz eW5jLmMKQEAgLTI0LDggKzI0LDEwIEBACiAgKgkgIEFsbCBub3RpZmljYXRpb24gbWVzc2Fn ZXMgYXJlIHBsYWNlZCBpbiB0aGUgcXVldWUgYW5kIGxhdGVyIHJlYWQgb3V0CiAgKgkgIGJ5 IGxpc3RlbmluZyBiYWNrZW5kcy4KICAqCi0gKgkgIFRoZXJlIGlzIG5vIGNlbnRyYWwga25v d2xlZGdlIG9mIHdoaWNoIGJhY2tlbmQgbGlzdGVucyBvbiB3aGljaCBjaGFubmVsOwotICoJ ICBldmVyeSBiYWNrZW5kIGhhcyBpdHMgb3duIGxpc3Qgb2YgaW50ZXJlc3RpbmcgY2hhbm5l bHMuCisgKgkgIFdlIGFsc28gbWFpbnRhaW4gYSBkeW5hbWljIHNoYXJlZCBoYXNoIHRhYmxl IChkc2hhc2gpIHRoYXQgbWFwcyBjaGFubmVsCisgKgkgIG5hbWVzIHRvIHRoZSBzZXQgb2Yg YmFja2VuZHMgbGlzdGVuaW5nIG9uIGVhY2ggY2hhbm5lbC4gVGhpcyB0YWJsZSBpcworICoJ ICBjcmVhdGVkIGxhemlseSBvbiB0aGUgZmlyc3QgTElTVEVOIGNvbW1hbmQgYW5kIGdyb3dz IGR5bmFtaWNhbGx5IGFzCisgKgkgIG5lZWRlZC4KICAqCiAgKgkgIEFsdGhvdWdoIHRoZXJl IGlzIG9ubHkgb25lIHF1ZXVlLCBub3RpZmljYXRpb25zIGFyZSB0cmVhdGVkIGFzIGJlaW5n CiAgKgkgIGRhdGFiYXNlLWxvY2FsOyB0aGlzIGlzIGRvbmUgYnkgaW5jbHVkaW5nIHRoZSBz ZW5kZXIncyBkYXRhYmFzZSBPSUQKQEAgLTcxLDEzICs3MywxNyBAQAogICoJICBtYWtlIGFu eSBhY3R1YWwgdXBkYXRlcyB0byB0aGUgZWZmZWN0aXZlIGxpc3RlbiBzdGF0ZSAobGlzdGVu Q2hhbm5lbHMpLgogICoJICBUaGVuIHdlIHNpZ25hbCBhbnkgYmFja2VuZHMgdGhhdCBtYXkg YmUgaW50ZXJlc3RlZCBpbiBvdXIgbWVzc2FnZXMKICAqCSAgKGluY2x1ZGluZyBvdXIgb3du IGJhY2tlbmQsIGlmIGxpc3RlbmluZykuICBUaGlzIGlzIGRvbmUgYnkKLSAqCSAgU2lnbmFs QmFja2VuZHMoKSwgd2hpY2ggc2NhbnMgdGhlIGxpc3Qgb2YgbGlzdGVuaW5nIGJhY2tlbmRz IGFuZCBzZW5kcyBhCi0gKgkgIFBST0NTSUdfTk9USUZZX0lOVEVSUlVQVCBzaWduYWwgdG8g ZXZlcnkgbGlzdGVuaW5nIGJhY2tlbmQgKHdlIGRvbid0Ci0gKgkgIGtub3cgd2hpY2ggYmFj a2VuZCBpcyBsaXN0ZW5pbmcgb24gd2hpY2ggY2hhbm5lbCBzbyB3ZSBtdXN0IHNpZ25hbCB0 aGVtCi0gKgkgIGFsbCkuICBXZSBjYW4gZXhjbHVkZSBiYWNrZW5kcyB0aGF0IGFyZSBhbHJl YWR5IHVwIHRvIGRhdGUsIHRob3VnaCwgYW5kCi0gKgkgIHdlIGNhbiBhbHNvIGV4Y2x1ZGUg YmFja2VuZHMgdGhhdCBhcmUgaW4gb3RoZXIgZGF0YWJhc2VzICh1bmxlc3MgdGhleQotICoJ ICBhcmUgd2F5IGJlaGluZCBhbmQgc2hvdWxkIGJlIGtpY2tlZCB0byBtYWtlIHRoZW0gYWR2 YW5jZSB0aGVpcgotICoJICBwb2ludGVycykuCisgKgkgIFNpZ25hbEJhY2tlbmRzKCksIHdo aWNoIGNvbnN1bHRzIHRoZSBzaGFyZWQgY2hhbm5lbCBoYXNoIHRhYmxlIHRvCisgKgkgIGlk ZW50aWZ5IGxpc3RlbmVycyBmb3IgdGhlIGNoYW5uZWxzIHRoYXQgaGF2ZSBwZW5kaW5nIG5v dGlmaWNhdGlvbnMKKyAqCSAgaW4gdGhlIGN1cnJlbnQgZGF0YWJhc2UuICBFYWNoIHNlbGVj dGVkIGJhY2tlbmQgaXMgbWFya2VkIGFzIGhhdmluZyBhCisgKgkgIHdha2V1cCBwZW5kaW5n IHRvIGF2b2lkIGR1cGxpY2F0ZSBzaWduYWxzLCBhbmQgYSBQUk9DU0lHX05PVElGWV9JTlRF UlJVUFQKKyAqCSAgc2lnbmFsIGlzIHNlbnQgdG8gaXQuCisgKgorICoJICBUbyBtYWludGFp biBxdWV1ZSBoZWFsdGgsIFNpZ25hbEJhY2tlbmRzKCkgYWxzbyB3YWtlcyBvbmUgYmFja2Vu ZAorICoJICBwb3NpdGlvbmVkIGF0IHRoZSBnbG9iYWwgcXVldWUgdGFpbCB0byBoZWxwIGFk dmFuY2UgaXQsIGFuZCBzaWduYWxzCisgKgkgIGFueSBiYWNrZW5kIHRoYXQgaGFzIGZhbGxl biB0b28gZmFyIGJlaGluZCB0byBjYXRjaCB1cC4gIFRoZXNlIG1lYXN1cmVzCisgKgkgIHBy ZXZlbnQgdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZSBmcm9tIGdyb3dpbmcgaW5kZWZpbml0ZWx5 LCB3aGlsZSBtb3N0bHkKKyAqCSAgbGltaXRpbmcgd2FrZXVwcyB0byB0aGUgYmFja2VuZHMg dGhhdCBhY3R1YWxseSBuZWVkIHRoZW0uCiAgKgogICoJICBGaW5hbGx5LCBhZnRlciB3ZSBh cmUgb3V0IG9mIHRoZSB0cmFuc2FjdGlvbiBhbHRvZ2V0aGVyIGFuZCBhYm91dCB0byBnbwog ICoJICBpZGxlLCB3ZSBzY2FuIHRoZSBxdWV1ZSBmb3IgbWVzc2FnZXMgdGhhdCBuZWVkIHRv IGJlIHNlbnQgdG8gb3VyCkBAIC0xMjgsNiArMTM0LDcgQEAKICNpbmNsdWRlIDxsaW1pdHMu aD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRl IDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImFjY2Vzcy9wYXJhbGxlbC5oIgogI2luY2x1ZGUg ImFjY2Vzcy9zbHJ1LmgiCkBAIC0xMzcsMTQgKzE0NCwxNyBAQAogI2luY2x1ZGUgImNvbW1h bmRzL2FzeW5jLmgiCiAjaW5jbHVkZSAiY29tbW9uL2hhc2hmbi5oIgogI2luY2x1ZGUgImZ1 bmNhcGkuaCIKKyNpbmNsdWRlICJsaWIvZHNoYXNoLmgiCiAjaW5jbHVkZSAibGlicHEvbGli cHEuaCIKICNpbmNsdWRlICJsaWJwcS9wcWZvcm1hdC5oIgogI2luY2x1ZGUgIm1pc2NhZG1p bi5oIgorI2luY2x1ZGUgInN0b3JhZ2UvZHNtX3JlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAic3Rv cmFnZS9pcGMuaCIKICNpbmNsdWRlICJzdG9yYWdlL2xtZ3IuaCIKICNpbmNsdWRlICJzdG9y YWdlL3Byb2NzaWduYWwuaCIKICNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCiAjaW5jbHVk ZSAidXRpbHMvYnVpbHRpbnMuaCIKKyNpbmNsdWRlICJ1dGlscy9kc2EuaCIKICNpbmNsdWRl ICJ1dGlscy9ndWNfaG9va3MuaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2lu Y2x1ZGUgInV0aWxzL3BzX3N0YXR1cy5oIgpAQCAtMTYyLDYgKzE3MiwyOSBAQAogICovCiAj ZGVmaW5lIE5PVElGWV9QQVlMT0FEX01BWF9MRU5HVEgJKEJMQ0tTWiAtIE5BTUVEQVRBTEVO IC0gMTI4KQogCisvKgorICogQ2hhbm5lbCBoYXNoIHRhYmxlIGRlZmluaXRpb25zCisgKgor ICogVGhpcyBoYXNoIHRhYmxlIG1hcHMgKGRhdGFiYXNlIE9JRCwgY2hhbm5lbCBuYW1lKSBr ZXlzIHRvIGFycmF5cyBvZgorICogUHJvY051bWJlcnMgcmVwcmVzZW50aW5nIHRoZSBiYWNr ZW5kcyBsaXN0ZW5pbmcgb24gZWFjaCBjaGFubmVsLgorICovCisKKyNkZWZpbmUgSU5JVElB TF9MSVNURU5FUlNfQVJSQVlfU0laRSA0CisKK3R5cGVkZWYgc3RydWN0IENoYW5uZWxIYXNo S2V5Cit7CisJT2lkCQkJZGJvaWQ7CisJY2hhcgkJY2hhbm5lbFtOQU1FREFUQUxFTl07Cit9 CQkJQ2hhbm5lbEhhc2hLZXk7CisKK3R5cGVkZWYgc3RydWN0IENoYW5uZWxFbnRyeQorewor CUNoYW5uZWxIYXNoS2V5IGtleTsKKwlkc2FfcG9pbnRlciBsaXN0ZW5lcnNfYXJyYXk7CS8q IERTQSBwb2ludGVyIHRvIFByb2NOdW1iZXIgYXJyYXkgKi8KKwlpbnQJCQludW1fbGlzdGVu ZXJzOwkvKiBOdW1iZXIgb2YgbGlzdGVuZXJzIGN1cnJlbnRseSBzdG9yZWQgKi8KKwlpbnQJ CQlhbGxvY2F0ZWRfbGlzdGVuZXJzOwkvKiBBbGxvY2F0ZWQgc2l6ZSBvZiBhcnJheSAqLwor fQkJCUNoYW5uZWxFbnRyeTsKKwogLyoKICAqIFN0cnVjdCByZXByZXNlbnRpbmcgYW4gZW50 cnkgaW4gdGhlIGdsb2JhbCBub3RpZnkgcXVldWUKICAqCkBAIC0yMjcsOCArMjYwLDggQEAg dHlwZWRlZiBzdHJ1Y3QgUXVldWVQb3NpdGlvbgogLyoKICAqIFBhcmFtZXRlciBkZXRlcm1p bmluZyBob3cgb2Z0ZW4gd2UgdHJ5IHRvIGFkdmFuY2UgdGhlIHRhaWwgcG9pbnRlcjoKICAq IHdlIGRvIHRoYXQgYWZ0ZXIgZXZlcnkgUVVFVUVfQ0xFQU5VUF9ERUxBWSBwYWdlcyBvZiBO T1RJRlkgZGF0YS4gIFRoaXMgaXMKLSAqIGFsc28gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIGEg YmFja2VuZCBpbiBhbm90aGVyIGRhdGFiYXNlIG5lZWRzIHRvIGJlCi0gKiBiZWhpbmQgYmVm b3JlIHdlJ2xsIGRlY2lkZSB3ZSBuZWVkIHRvIHdha2UgaXQgdXAgdG8gYWR2YW5jZSBpdHMg cG9pbnRlci4KKyAqIGFsc28gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIGEgYmFja2VuZCBuZWVk cyB0byBiZSBiZWhpbmQgYmVmb3JlIHdlJ2xsCisgKiBkZWNpZGUgd2UgbmVlZCB0byB3YWtl IGl0IHVwIHRvIGFkdmFuY2UgaXRzIHBvaW50ZXIuCiAgKgogICogUmVzaXN0IHRoZSB0ZW1w dGF0aW9uIHRvIG1ha2UgdGhpcyByZWFsbHkgbGFyZ2UuICBXaGlsZSB0aGF0IHdvdWxkIHNh dmUKICAqIHdvcmsgaW4gc29tZSBwbGFjZXMsIGl0IHdvdWxkIGFkZCBjb3N0IGluIG90aGVy cy4gIEluIHBhcnRpY3VsYXIsIHRoaXMKQEAgLTI0Niw2ICsyNzksNyBAQCB0eXBlZGVmIHN0 cnVjdCBRdWV1ZUJhY2tlbmRTdGF0dXMKIAlPaWQJCQlkYm9pZDsJCQkvKiBiYWNrZW5kJ3Mg ZGF0YWJhc2UgT0lELCBvciBJbnZhbGlkT2lkICovCiAJUHJvY051bWJlcgluZXh0TGlzdGVu ZXI7CS8qIGlkIG9mIG5leHQgbGlzdGVuZXIsIG9yIElOVkFMSURfUFJPQ19OVU1CRVIgKi8K IAlRdWV1ZVBvc2l0aW9uIHBvczsJCQkvKiBiYWNrZW5kIGhhcyByZWFkIHF1ZXVlIHVwIHRv IGhlcmUgKi8KKwlib29sCQl3YWtldXBfcGVuZGluZzsgLyogc2lnbmFsIHNlbnQgYnV0IG5v dCB5ZXQgcHJvY2Vzc2VkICovCiB9IFF1ZXVlQmFja2VuZFN0YXR1czsKIAogLyoKQEAgLTI4 OCwxMSArMzIyLDkxIEBAIHR5cGVkZWYgc3RydWN0IEFzeW5jUXVldWVDb250cm9sCiAJUHJv Y051bWJlcglmaXJzdExpc3RlbmVyOwkvKiBpZCBvZiBmaXJzdCBsaXN0ZW5lciwgb3IKIAkJ CQkJCQkJICogSU5WQUxJRF9QUk9DX05VTUJFUiAqLwogCVRpbWVzdGFtcFR6IGxhc3RRdWV1 ZUZpbGxXYXJuOwkvKiB0aW1lIG9mIGxhc3QgcXVldWUtZnVsbCBtc2cgKi8KKwlkc2FfaGFu ZGxlCWNoYW5uZWxfaGFzaF9kc2E7CisJZHNoYXNoX3RhYmxlX2hhbmRsZSBjaGFubmVsX2hh c2hfZHNoOwogCVF1ZXVlQmFja2VuZFN0YXR1cyBiYWNrZW5kW0ZMRVhJQkxFX0FSUkFZX01F TUJFUl07CiB9IEFzeW5jUXVldWVDb250cm9sOwogCiBzdGF0aWMgQXN5bmNRdWV1ZUNvbnRy b2wgKmFzeW5jUXVldWVDb250cm9sOwogCitzdGF0aWMgZHNhX2FyZWEgKmNoYW5uZWxfZHNh ID0gTlVMTDsKK3N0YXRpYyBkc2hhc2hfdGFibGUgKmNoYW5uZWxfaGFzaCA9IE5VTEw7Citz dGF0aWMgZHNoYXNoX2hhc2ggY2hhbm5lbF9oYXNoX2Z1bmMoY29uc3Qgdm9pZCAqa2V5LCBz aXplX3Qgc2l6ZSwgdm9pZCAqYXJnKTsKKworLyogcGFyYW1ldGVycyBmb3IgdGhlIGNoYW5u ZWwgaGFzaCB0YWJsZSAqLworc3RhdGljIGNvbnN0IGRzaGFzaF9wYXJhbWV0ZXJzIGNoYW5u ZWxfZHNoX3BhcmFtcyA9IHsKKwlzaXplb2YoQ2hhbm5lbEhhc2hLZXkpLAorCXNpemVvZihD aGFubmVsRW50cnkpLAorCWRzaGFzaF9tZW1jbXAsCisJY2hhbm5lbF9oYXNoX2Z1bmMsCisJ ZHNoYXNoX21lbWNweSwKKwlMV1RSQU5DSEVfTk9USUZZX0NIQU5ORUxfSEFTSAorfTsKKwor LyoKKyAqIGNoYW5uZWxfaGFzaF9mdW5jCisgKgkJSGFzaCBmdW5jdGlvbiBmb3IgY2hhbm5l bCBrZXlzLgorICovCitzdGF0aWMgZHNoYXNoX2hhc2gKK2NoYW5uZWxfaGFzaF9mdW5jKGNv bnN0IHZvaWQgKmtleSwgc2l6ZV90IHNpemUsIHZvaWQgKmFyZykKK3sKKwljb25zdAkJQ2hh bm5lbEhhc2hLZXkgKmsgPSAoY29uc3QgQ2hhbm5lbEhhc2hLZXkgKikga2V5OworCWRzaGFz aF9oYXNoIGg7CisKKwloID0gRGF0dW1HZXRVSW50MzIoaGFzaF91aW50MzIoay0+ZGJvaWQp KTsKKwloIF49IERhdHVtR2V0VUludDMyKGhhc2hfYW55KChjb25zdCB1bnNpZ25lZCBjaGFy ICopIGstPmNoYW5uZWwsCisJCQkJCQkJCSBzdHJubGVuKGstPmNoYW5uZWwsIE5BTUVEQVRB TEVOKSkpOworCisJcmV0dXJuIGg7Cit9CisKKy8qCisgKiBpbml0X2NoYW5uZWxfaGFzaAor ICoJCUxhenkgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNoYW5uZWwgaGFzaCB0YWJsZS4KKyAq Lworc3RhdGljIHZvaWQKK2luaXRfY2hhbm5lbF9oYXNoKHZvaWQpCit7CisJTWVtb3J5Q29u dGV4dCBvbGRjb250ZXh0OworCisJLyogUXVpY2sgZXhpdCBpZiB3ZSBhbHJlYWR5IGRpZCB0 aGlzICovCisJaWYgKGFzeW5jUXVldWVDb250cm9sLT5jaGFubmVsX2hhc2hfZHNoICE9IERT SEFTSF9IQU5ETEVfSU5WQUxJRCAmJgorCQljaGFubmVsX2hhc2ggIT0gTlVMTCkKKwkJcmV0 dXJuOworCisJLyogT3RoZXJ3aXNlLCB1c2UgYSBsb2NrIHRvIGVuc3VyZSBvbmx5IG9uZSBw cm9jZXNzIGNyZWF0ZXMgdGhlIHRhYmxlICovCisJTFdMb2NrQWNxdWlyZShOb3RpZnlRdWV1 ZUxvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwkvKiBCZSBzdXJlIGFueSBsb2NhbCBtZW1vcnkg YWxsb2NhdGVkIGJ5IERTQSByb3V0aW5lcyBpcyBwZXJzaXN0ZW50ICovCisJb2xkY29udGV4 dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhUb3BNZW1vcnlDb250ZXh0KTsKKworCWlmIChh c3luY1F1ZXVlQ29udHJvbC0+Y2hhbm5lbF9oYXNoX2RzaCA9PSBEU0hBU0hfSEFORExFX0lO VkFMSUQpCisJeworCQkvKiBJbml0aWFsaXplIGR5bmFtaWMgc2hhcmVkIGhhc2ggdGFibGUg Zm9yIGNoYW5uZWwgaGFzaCAqLworCQljaGFubmVsX2RzYSA9IGRzYV9jcmVhdGUoTFdUUkFO Q0hFX05PVElGWV9DSEFOTkVMX0hBU0gpOworCQlkc2FfcGluKGNoYW5uZWxfZHNhKTsKKwkJ ZHNhX3Bpbl9tYXBwaW5nKGNoYW5uZWxfZHNhKTsKKwkJY2hhbm5lbF9oYXNoID0gZHNoYXNo X2NyZWF0ZShjaGFubmVsX2RzYSwgJmNoYW5uZWxfZHNoX3BhcmFtcywgTlVMTCk7CisKKwkJ LyogU3RvcmUgaGFuZGxlcyBpbiBzaGFyZWQgbWVtb3J5IGZvciBvdGhlciBiYWNrZW5kcyB0 byB1c2UgKi8KKwkJYXN5bmNRdWV1ZUNvbnRyb2wtPmNoYW5uZWxfaGFzaF9kc2EgPSBkc2Ff Z2V0X2hhbmRsZShjaGFubmVsX2RzYSk7CisJCWFzeW5jUXVldWVDb250cm9sLT5jaGFubmVs X2hhc2hfZHNoID0KKwkJCWRzaGFzaF9nZXRfaGFzaF90YWJsZV9oYW5kbGUoY2hhbm5lbF9o YXNoKTsKKwl9CisJZWxzZSBpZiAoIWNoYW5uZWxfaGFzaCkKKwl7CisJCS8qIEF0dGFjaCB0 byBleGlzdGluZyBkeW5hbWljIHNoYXJlZCBoYXNoIHRhYmxlICovCisJCWNoYW5uZWxfZHNh ID0gZHNhX2F0dGFjaChhc3luY1F1ZXVlQ29udHJvbC0+Y2hhbm5lbF9oYXNoX2RzYSk7CisJ CWRzYV9waW5fbWFwcGluZyhjaGFubmVsX2RzYSk7CisJCWNoYW5uZWxfaGFzaCA9IGRzaGFz aF9hdHRhY2goY2hhbm5lbF9kc2EsICZjaGFubmVsX2RzaF9wYXJhbXMsCisJCQkJCQkJCQkg YXN5bmNRdWV1ZUNvbnRyb2wtPmNoYW5uZWxfaGFzaF9kc2gsCisJCQkJCQkJCQkgTlVMTCk7 CisJfQorCisJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworCUxXTG9ja1Jl bGVhc2UoTm90aWZ5UXVldWVMb2NrKTsKK30KKwogI2RlZmluZSBRVUVVRV9IRUFECQkJCQko YXN5bmNRdWV1ZUNvbnRyb2wtPmhlYWQpCiAjZGVmaW5lIFFVRVVFX1RBSUwJCQkJCShhc3lu Y1F1ZXVlQ29udHJvbC0+dGFpbCkKICNkZWZpbmUgUVVFVUVfU1RPUF9QQUdFCQkJCShhc3lu Y1F1ZXVlQ29udHJvbC0+c3RvcFBhZ2UpCkBAIC0zMDEsNiArNDE1LDcgQEAgc3RhdGljIEFz eW5jUXVldWVDb250cm9sICphc3luY1F1ZXVlQ29udHJvbDsKICNkZWZpbmUgUVVFVUVfQkFD S0VORF9EQk9JRChpKQkJKGFzeW5jUXVldWVDb250cm9sLT5iYWNrZW5kW2ldLmRib2lkKQog I2RlZmluZSBRVUVVRV9ORVhUX0xJU1RFTkVSKGkpCQkoYXN5bmNRdWV1ZUNvbnRyb2wtPmJh Y2tlbmRbaV0ubmV4dExpc3RlbmVyKQogI2RlZmluZSBRVUVVRV9CQUNLRU5EX1BPUyhpKQkJ KGFzeW5jUXVldWVDb250cm9sLT5iYWNrZW5kW2ldLnBvcykKKyNkZWZpbmUgUVVFVUVfQkFD S0VORF9XQUtFVVBfUEVORElORyhpKQkoYXN5bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0u d2FrZXVwX3BlbmRpbmcpCiAKIC8qCiAgKiBUaGUgU0xSVSBidWZmZXIgYXJlYSB0aHJvdWdo IHdoaWNoIHdlIGFjY2VzcyB0aGUgbm90aWZpY2F0aW9uIHF1ZXVlCkBAIC00NTcsNiArNTcy LDEwIEBAIHN0YXRpYyB2b2lkIEFkZEV2ZW50VG9QZW5kaW5nTm90aWZpZXMoTm90aWZpY2F0 aW9uICpuKTsKIHN0YXRpYyB1aW50MzIgbm90aWZpY2F0aW9uX2hhc2goY29uc3Qgdm9pZCAq a2V5LCBTaXplIGtleXNpemUpOwogc3RhdGljIGludAlub3RpZmljYXRpb25fbWF0Y2goY29u c3Qgdm9pZCAqa2V5MSwgY29uc3Qgdm9pZCAqa2V5MiwgU2l6ZSBrZXlzaXplKTsKIHN0YXRp YyB2b2lkIENsZWFyUGVuZGluZ0FjdGlvbnNBbmROb3RpZmllcyh2b2lkKTsKK3N0YXRpYyBp bmxpbmUgdm9pZCBDaGFubmVsSGFzaFByZXBhcmVLZXkoQ2hhbm5lbEhhc2hLZXkgKiBrZXks IE9pZCBkYm9pZCwgY29uc3QgY2hhciAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZCBDaGFubmVs SGFzaEFkZExpc3RlbmVyKGNvbnN0IGNoYXIgKmNoYW5uZWwpOworc3RhdGljIHZvaWQgQ2hh bm5lbEhhc2hSZW1vdmVMaXN0ZW5lcihjb25zdCBjaGFyICpjaGFubmVsKTsKK3N0YXRpYyBM aXN0ICpHZXRQZW5kaW5nTm90aWZ5Q2hhbm5lbHModm9pZCk7CiAKIC8qCiAgKiBDb21wdXRl IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHF1ZXVlIHBhZ2UgbnVtYmVycy4KQEAgLTUy MSwxMiArNjQwLDE2IEBAIEFzeW5jU2htZW1Jbml0KHZvaWQpCiAJCVFVRVVFX1NUT1BfUEFH RSA9IDA7CiAJCVFVRVVFX0ZJUlNUX0xJU1RFTkVSID0gSU5WQUxJRF9QUk9DX05VTUJFUjsK IAkJYXN5bmNRdWV1ZUNvbnRyb2wtPmxhc3RRdWV1ZUZpbGxXYXJuID0gMDsKKwkJYXN5bmNR dWV1ZUNvbnRyb2wtPmNoYW5uZWxfaGFzaF9kc2EgPSBEU0FfSEFORExFX0lOVkFMSUQ7CisJ CWFzeW5jUXVldWVDb250cm9sLT5jaGFubmVsX2hhc2hfZHNoID0gRFNIQVNIX0hBTkRMRV9J TlZBTElEOworCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgTWF4QmFja2VuZHM7IGkrKykKIAkJ ewogCQkJUVVFVUVfQkFDS0VORF9QSUQoaSkgPSBJbnZhbGlkUGlkOwogCQkJUVVFVUVfQkFD S0VORF9EQk9JRChpKSA9IEludmFsaWRPaWQ7CiAJCQlRVUVVRV9ORVhUX0xJU1RFTkVSKGkp ID0gSU5WQUxJRF9QUk9DX05VTUJFUjsKIAkJCVNFVF9RVUVVRV9QT1MoUVVFVUVfQkFDS0VO RF9QT1MoaSksIDAsIDApOworCQkJUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSA9 IGZhbHNlOwogCQl9CiAJfQogCkBAIC0xMTUyLDYgKzEyNzUsNyBAQCBFeGVjX0xpc3RlbkNv bW1pdChjb25zdCBjaGFyICpjaGFubmVsKQogCW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0 U3dpdGNoVG8oVG9wTWVtb3J5Q29udGV4dCk7CiAJbGlzdGVuQ2hhbm5lbHMgPSBsYXBwZW5k KGxpc3RlbkNoYW5uZWxzLCBwc3RyZHVwKGNoYW5uZWwpKTsKIAlNZW1vcnlDb250ZXh0U3dp dGNoVG8ob2xkY29udGV4dCk7CisJQ2hhbm5lbEhhc2hBZGRMaXN0ZW5lcihjaGFubmVsKTsK IH0KIAogLyoKQEAgLTExNzUsNiArMTI5OSw3IEBAIEV4ZWNfVW5saXN0ZW5Db21taXQoY29u c3QgY2hhciAqY2hhbm5lbCkKIAkJewogCQkJbGlzdGVuQ2hhbm5lbHMgPSBmb3JlYWNoX2Rl bGV0ZV9jdXJyZW50KGxpc3RlbkNoYW5uZWxzLCBxKTsKIAkJCXBmcmVlKGxjaGFuKTsKKwkJ CUNoYW5uZWxIYXNoUmVtb3ZlTGlzdGVuZXIoY2hhbm5lbCk7CiAJCQlicmVhazsKIAkJfQog CX0KQEAgLTExOTMsOSArMTMxOCwxOCBAQCBFeGVjX1VubGlzdGVuQ29tbWl0KGNvbnN0IGNo YXIgKmNoYW5uZWwpCiBzdGF0aWMgdm9pZAogRXhlY19Vbmxpc3RlbkFsbENvbW1pdCh2b2lk KQogeworCUxpc3RDZWxsICAgKnA7CisKIAlpZiAoVHJhY2Vfbm90aWZ5KQogCQllbG9nKERF QlVHMSwgIkV4ZWNfVW5saXN0ZW5BbGxDb21taXQoJWQpIiwgTXlQcm9jUGlkKTsKIAorCWZv cmVhY2gocCwgbGlzdGVuQ2hhbm5lbHMpCisJeworCQljaGFyCSAgICpjaGFubmVsID0gKGNo YXIgKikgbGZpcnN0KHApOworCisJCUNoYW5uZWxIYXNoUmVtb3ZlTGlzdGVuZXIoY2hhbm5l bCk7CisJfQorCiAJbGlzdF9mcmVlX2RlZXAobGlzdGVuQ2hhbm5lbHMpOwogCWxpc3RlbkNo YW5uZWxzID0gTklMOwogfQpAQCAtMTU2NSwxMiArMTY5OSwxNiBAQCBhc3luY1F1ZXVlRmls bFdhcm5pbmcodm9pZCkKIC8qCiAgKiBTZW5kIHNpZ25hbHMgdG8gbGlzdGVuaW5nIGJhY2tl bmRzLgogICoKLSAqIE5vcm1hbGx5IHdlIHNpZ25hbCBvbmx5IGJhY2tlbmRzIGluIG91ciBv d24gZGF0YWJhc2UsIHNpbmNlIG9ubHkgdGhvc2UKLSAqIGJhY2tlbmRzIGNvdWxkIGJlIGlu dGVyZXN0ZWQgaW4gbm90aWZpZXMgd2Ugc2VuZC4gIEhvd2V2ZXIsIGlmIHRoZXJlJ3MKLSAq IG5vdGlmeSB0cmFmZmljIGluIG91ciBkYXRhYmFzZSBidXQgbm8gdHJhZmZpYyBpbiBhbm90 aGVyIGRhdGFiYXNlIHRoYXQKLSAqIGRvZXMgaGF2ZSBsaXN0ZW5lcihzKSwgdGhvc2UgbGlz dGVuZXJzIHdpbGwgZmFsbCBmdXJ0aGVyIGFuZCBmdXJ0aGVyCi0gKiBiZWhpbmQuICBXYWtl biB0aGVtIGFueXdheSBpZiB0aGV5J3JlIGZhciBlbm91Z2ggYmVoaW5kLCBzbyB0aGF0IHRo ZXknbGwKLSAqIGFkdmFuY2UgdGhlaXIgcXVldWUgcG9zaXRpb24gcG9pbnRlcnMsIGFsbG93 aW5nIHRoZSBnbG9iYWwgdGFpbCB0byBhZHZhbmNlLgorICogTm9ybWFsbHkgd2Ugc2lnbmFs IG9ubHkgYmFja2VuZHMgcmVnaXN0ZXJlZCBhcyBsaXN0ZW5lcnMgZm9yIGNoYW5uZWxzCisg KiB3aXRoIHBlbmRpbmcgbm90aWZpY2F0aW9ucy4gIEhvd2V2ZXIsIHdoZW4gdGhlcmUgaXMg bm8gdHJhZmZpYyBvbiBzb21lCisgKiBjaGFubmVscywgbGlzdGVuZXJzIG9uIHN1Y2ggY2hh bm5lbHMgd2lsbCBmYWxsIGZ1cnRoZXIgYW5kIGZ1cnRoZXIKKyAqIGJlaGluZC4gIFdha2Vu IHRoZW0gaWYgdGhleSBhcmUgdG9vIGZhciBiZWhpbmQsIHNvIHRoYXQgdGhleSdsbAorICog YWR2YW5jZSB0aGVpciBxdWV1ZSBwb3NpdGlvbiBwb2ludGVycywgYWxsb3dpbmcgdGhlIGds b2JhbCB0YWlsIHRvCisgKiBhZHZhbmNlLgorICoKKyAqIFRvIHN0YWdnZXIgd2FrZXVwcyBv ZiBsYWdnaW5nIGJhY2tlbmRzLCB3YWtlIHRoZSBiYWNrZW5kIGZ1cnRoZXN0CisgKiBiZWhp bmQgKGF0IHRoZSB0YWlsKSwgYW1vcnRpemluZyB0aGUgY29udGV4dC1zd2l0Y2hpbmcgY29z dCBhY3Jvc3MKKyAqIHN1Y2Nlc3NpdmUgbm90aWZpY2F0aW9ucyBpbnN0ZWFkIG9mIHBheWlu ZyBpdCBhbGwgYXQgb25jZS4KICAqCiAgKiBTaW5jZSB3ZSBrbm93IHRoZSBQcm9jTnVtYmVy IGFuZCB0aGUgUGlkIHRoZSBzaWduYWxpbmcgaXMgcXVpdGUgY2hlYXAuCiAgKgpAQCAtMTU4 Myw2ICsxNzIxLDEwIEBAIFNpZ25hbEJhY2tlbmRzKHZvaWQpCiAJaW50MzIJICAgKnBpZHM7 CiAJUHJvY051bWJlciAqcHJvY25vczsKIAlpbnQJCQljb3VudDsKKwlMaXN0CSAgICpjaGFu bmVsczsKKwlMaXN0Q2VsbCAgICpwOworCWJvb2wJICAgKnNpZ25hbGVkOworCWludDY0CQlx dWV1ZV9sZW5ndGg7CiAKIAkvKgogCSAqIElkZW50aWZ5IGJhY2tlbmRzIHRoYXQgd2UgbmVl ZCB0byBzaWduYWwuICBXZSBkb24ndCB3YW50IHRvIHNlbmQKQEAgLTE1OTQsMzkgKzE3MzYs MTE4IEBAIFNpZ25hbEJhY2tlbmRzKHZvaWQpCiAJICovCiAJcGlkcyA9IChpbnQzMiAqKSBw YWxsb2MoTWF4QmFja2VuZHMgKiBzaXplb2YoaW50MzIpKTsKIAlwcm9jbm9zID0gKFByb2NO dW1iZXIgKikgcGFsbG9jKE1heEJhY2tlbmRzICogc2l6ZW9mKFByb2NOdW1iZXIpKTsKKwlz aWduYWxlZCA9IChib29sICopIHBhbGxvYzAoTWF4QmFja2VuZHMgKiBzaXplb2YoYm9vbCkp OwogCWNvdW50ID0gMDsKIAorCWNoYW5uZWxzID0gR2V0UGVuZGluZ05vdGlmeUNoYW5uZWxz KCk7CisKIAlMV0xvY2tBY3F1aXJlKE5vdGlmeVF1ZXVlTG9jaywgTFdfRVhDTFVTSVZFKTsK LQlmb3IgKFByb2NOdW1iZXIgaSA9IFFVRVVFX0ZJUlNUX0xJU1RFTkVSOyBpICE9IElOVkFM SURfUFJPQ19OVU1CRVI7IGkgPSBRVUVVRV9ORVhUX0xJU1RFTkVSKGkpKQorCWZvcmVhY2go cCwgY2hhbm5lbHMpCiAJewotCQlpbnQzMgkJcGlkID0gUVVFVUVfQkFDS0VORF9QSUQoaSk7 Ci0JCVF1ZXVlUG9zaXRpb24gcG9zOworCQljaGFyCSAgICpjaGFubmVsID0gKGNoYXIgKikg bGZpcnN0KHApOworCQlDaGFubmVsRW50cnkgKmVudHJ5OworCQlQcm9jTnVtYmVyICpsaXN0 ZW5lcnM7CisJCUNoYW5uZWxIYXNoS2V5IGtleTsKIAotCQlBc3NlcnQocGlkICE9IEludmFs aWRQaWQpOwotCQlwb3MgPSBRVUVVRV9CQUNLRU5EX1BPUyhpKTsKLQkJaWYgKFFVRVVFX0JB Q0tFTkRfREJPSUQoaSkgPT0gTXlEYXRhYmFzZUlkKQorCQlpZiAoY2hhbm5lbF9oYXNoID09 IE5VTEwpCisJCQllbnRyeSA9IE5VTEw7CisJCWVsc2UKIAkJewotCQkJLyoKLQkJCSAqIEFs d2F5cyBzaWduYWwgbGlzdGVuZXJzIGluIG91ciBvd24gZGF0YWJhc2UsIHVubGVzcyB0aGV5 J3JlCi0JCQkgKiBhbHJlYWR5IGNhdWdodCB1cCAodW5saWtlbHksIGJ1dCBwb3NzaWJsZSku Ci0JCQkgKi8KKwkJCWluaXRfY2hhbm5lbF9oYXNoKCk7CisJCQlDaGFubmVsSGFzaFByZXBh cmVLZXkoJmtleSwgTXlEYXRhYmFzZUlkLCBjaGFubmVsKTsKKwkJCWVudHJ5ID0gZHNoYXNo X2ZpbmQoY2hhbm5lbF9oYXNoLCAma2V5LCB0cnVlKTsKKwkJfQorCisJCWlmIChlbnRyeSA9 PSBOVUxMKQorCQkJY29udGludWU7CQkJLyogTm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9y IHRoaXMgY2hhbm5lbCAqLworCisJCWxpc3RlbmVycyA9IChQcm9jTnVtYmVyICopIGRzYV9n ZXRfYWRkcmVzcyhjaGFubmVsX2RzYSwKKwkJCQkJCQkJCQkJCSAgIGVudHJ5LT5saXN0ZW5l cnNfYXJyYXkpOworCisJCWZvciAoaW50IGogPSAwOyBqIDwgZW50cnktPm51bV9saXN0ZW5l cnM7IGorKykKKwkJeworCQkJUHJvY051bWJlcglpID0gbGlzdGVuZXJzW2pdOworCQkJaW50 MzIJCXBpZDsKKwkJCVF1ZXVlUG9zaXRpb24gcG9zOworCisJCQlpZiAoc2lnbmFsZWRbaV0g fHwgUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSkKKwkJCQljb250aW51ZTsKKwor CQkJcG9zID0gUVVFVUVfQkFDS0VORF9QT1MoaSk7CisJCQlwaWQgPSBRVUVVRV9CQUNLRU5E X1BJRChpKTsKKworCQkJLyogU2tpcCBpZiBjYXVnaHQgdXAgb3Igd3JvbmcgZGF0YWJhc2Ug Ki8KIAkJCWlmIChRVUVVRV9QT1NfRVFVQUwocG9zLCBRVUVVRV9IRUFEKSkKIAkJCQljb250 aW51ZTsKKwkJCWlmIChRVUVVRV9CQUNLRU5EX0RCT0lEKGkpICE9IE15RGF0YWJhc2VJZCkK KwkJCQljb250aW51ZTsKKworCQkJQXNzZXJ0KHBpZCAhPSBJbnZhbGlkUGlkKTsKKworCQkJ UVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSA9IHRydWU7CisKKwkJCXBpZHNbY291 bnRdID0gcGlkOworCQkJcHJvY25vc1tjb3VudF0gPSBpOworCQkJc2lnbmFsZWRbaV0gPSB0 cnVlOworCQkJY291bnQrKzsKIAkJfQotCQllbHNlCisKKwkJZHNoYXNoX3JlbGVhc2VfbG9j ayhjaGFubmVsX2hhc2gsIGVudHJ5KTsKKwl9CisKKwlxdWV1ZV9sZW5ndGggPSBhc3luY1F1 ZXVlUGFnZURpZmYoUVVFVUVfUE9TX1BBR0UoUVVFVUVfSEVBRCksCisJCQkJCQkJCQkgIFFV RVVFX1BPU19QQUdFKFFVRVVFX1RBSUwpKTsKKworCS8qIENoZWNrIGZvciBsYWdnaW5nIGJh Y2tlbmRzIHdoZW4gdGhlIHF1ZXVlIHNwYW5zIG11bHRpcGxlIHBhZ2VzICovCisJaWYgKHF1 ZXVlX2xlbmd0aCA+IDApCisJeworCQlib29sCQl0YWlsX3dva2VuID0gZmFsc2U7CisKKwkJ Zm9yIChQcm9jTnVtYmVyIGkgPSBRVUVVRV9GSVJTVF9MSVNURU5FUjsKKwkJCSBpICE9IElO VkFMSURfUFJPQ19OVU1CRVI7CisJCQkgaSA9IFFVRVVFX05FWFRfTElTVEVORVIoaSkpCiAJ CXsKLQkJCS8qCi0JCQkgKiBMaXN0ZW5lcnMgaW4gb3RoZXIgZGF0YWJhc2VzIHNob3VsZCBi ZSBzaWduYWxlZCBvbmx5IGlmIHRoZXkKLQkJCSAqIGFyZSBmYXIgYmVoaW5kLgotCQkJICov Ci0JCQlpZiAoYXN5bmNRdWV1ZVBhZ2VEaWZmKFFVRVVFX1BPU19QQUdFKFFVRVVFX0hFQUQp LAotCQkJCQkJCQkgICBRVUVVRV9QT1NfUEFHRShwb3MpKSA8IFFVRVVFX0NMRUFOVVBfREVM QVkpCisJCQlRdWV1ZVBvc2l0aW9uIHBvczsKKwkJCWludDY0CQlsYWc7CisJCQlpbnQzMgkJ cGlkOworCisJCQlpZiAoc2lnbmFsZWRbaV0gfHwgUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVO RElORyhpKSkKIAkJCQljb250aW51ZTsKKworCQkJcG9zID0gUVVFVUVfQkFDS0VORF9QT1Mo aSk7CisKKwkJCS8qIFNpZ25hbCBvbmUgYmFja2VuZCBwb3NpdGlvbmVkIGF0IHRoZSBnbG9i YWwgdGFpbCAqLworCQkJaWYgKCF0YWlsX3dva2VuICYmIGFzeW5jUXVldWVQYWdlRGlmZihR VUVVRV9QT1NfUEFHRShRVUVVRV9UQUlMKSwKKwkJCQkJCQkJCQkJCSAgUVVFVUVfUE9TX1BB R0UocG9zKSkgPT0gMCkKKwkJCXsKKwkJCQlwaWQgPSBRVUVVRV9CQUNLRU5EX1BJRChpKTsK KwkJCQlBc3NlcnQocGlkICE9IEludmFsaWRQaWQpOworCisJCQkJUVVFVUVfQkFDS0VORF9X QUtFVVBfUEVORElORyhpKSA9IHRydWU7CisJCQkJcGlkc1tjb3VudF0gPSBwaWQ7CisJCQkJ cHJvY25vc1tjb3VudF0gPSBpOworCQkJCXNpZ25hbGVkW2ldID0gdHJ1ZTsKKwkJCQljb3Vu dCsrOworCQkJCXRhaWxfd29rZW4gPSB0cnVlOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJ CQlsYWcgPSBhc3luY1F1ZXVlUGFnZURpZmYoUVVFVUVfUE9TX1BBR0UoUVVFVUVfSEVBRCks CisJCQkJCQkJCQkgUVVFVUVfUE9TX1BBR0UocG9zKSk7CisKKwkJCS8qIE5lZWQgdG8gc2ln bmFsIGlmIGEgYmFja2VuZCBoYXMgZmFsbGVuIHRvbyBmYXIgYmVpbmQgKi8KKwkJCWlmIChs YWcgPj0gUVVFVUVfQ0xFQU5VUF9ERUxBWSkKKwkJCXsKKwkJCQlwaWQgPSBRVUVVRV9CQUNL RU5EX1BJRChpKTsKKwkJCQlBc3NlcnQocGlkICE9IEludmFsaWRQaWQpOworCisJCQkJUVVF VUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSA9IHRydWU7CisJCQkJcGlkc1tjb3VudF0g PSBwaWQ7CisJCQkJcHJvY25vc1tjb3VudF0gPSBpOworCQkJCXNpZ25hbGVkW2ldID0gdHJ1 ZTsKKwkJCQljb3VudCsrOworCQkJfQogCQl9Ci0JCS8qIE9LLCBuZWVkIHRvIHNpZ25hbCB0 aGlzIG9uZSAqLwotCQlwaWRzW2NvdW50XSA9IHBpZDsKLQkJcHJvY25vc1tjb3VudF0gPSBp OwotCQljb3VudCsrOwogCX0KIAlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1ZXVlTG9jayk7CiAK QEAgLTE2NTcsNiArMTg3OCw3IEBAIFNpZ25hbEJhY2tlbmRzKHZvaWQpCiAKIAlwZnJlZShw aWRzKTsKIAlwZnJlZShwcm9jbm9zKTsKKwlwZnJlZShzaWduYWxlZCk7CiB9CiAKIC8qCkBA IC0xODY1LDYgKzIwODcsNyBAQCBhc3luY1F1ZXVlUmVhZEFsbE5vdGlmaWNhdGlvbnModm9p ZCkKIAlMV0xvY2tBY3F1aXJlKE5vdGlmeVF1ZXVlTG9jaywgTFdfU0hBUkVEKTsKIAkvKiBB c3NlcnQgY2hlY2tzIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIHN0YXRlIGVudHJ5ICovCiAJQXNz ZXJ0KE15UHJvY1BpZCA9PSBRVUVVRV9CQUNLRU5EX1BJRChNeVByb2NOdW1iZXIpKTsKKwlR VUVVRV9CQUNLRU5EX1dBS0VVUF9QRU5ESU5HKE15UHJvY051bWJlcikgPSBmYWxzZTsKIAlw b3MgPSBRVUVVRV9CQUNLRU5EX1BPUyhNeVByb2NOdW1iZXIpOwogCWhlYWQgPSBRVUVVRV9I RUFEOwogCUxXTG9ja1JlbGVhc2UoTm90aWZ5UXVldWVMb2NrKTsKQEAgLTIzOTUsMyArMjYx OCwxODUgQEAgY2hlY2tfbm90aWZ5X2J1ZmZlcnMoaW50ICpuZXd2YWwsIHZvaWQgKipleHRy YSwgR3VjU291cmNlIHNvdXJjZSkKIHsKIAlyZXR1cm4gY2hlY2tfc2xydV9idWZmZXJzKCJu b3RpZnlfYnVmZmVycyIsIG5ld3ZhbCk7CiB9CisKKworLyoKKyAqIENoYW5uZWxIYXNoUHJl cGFyZUtleQorICoJCVByZXBhcmUgYSBjaGFubmVsIGtleSBmb3IgdXNlIGFzIGEgaGFzaCBr ZXkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorQ2hhbm5lbEhhc2hQcmVwYXJlS2V5KENo YW5uZWxIYXNoS2V5ICoga2V5LCBPaWQgZGJvaWQsIGNvbnN0IGNoYXIgKmNoYW5uZWwpCit7 CisJbWVtc2V0KGtleSwgMCwgc2l6ZW9mKENoYW5uZWxIYXNoS2V5KSk7CisJa2V5LT5kYm9p ZCA9IGRib2lkOworCXN0cmxjcHkoa2V5LT5jaGFubmVsLCBjaGFubmVsLCBOQU1FREFUQUxF Tik7Cit9CisKKy8qCisgKiBDaGFubmVsSGFzaEFkZExpc3RlbmVyCisgKiAgICAgUmVnaXN0 ZXIgYXMgYSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBjaGFubmVsLgorICovCitzdGF0 aWMgdm9pZAorQ2hhbm5lbEhhc2hBZGRMaXN0ZW5lcihjb25zdCBjaGFyICpjaGFubmVsKQor eworCUNoYW5uZWxIYXNoS2V5IGtleTsKKwlDaGFubmVsRW50cnkgKmVudHJ5OworCWJvb2wJ CWZvdW5kOworCVByb2NOdW1iZXIgKmxpc3RlbmVyczsKKworCWluaXRfY2hhbm5lbF9oYXNo KCk7CisKKwlDaGFubmVsSGFzaFByZXBhcmVLZXkoJmtleSwgTXlEYXRhYmFzZUlkLCBjaGFu bmVsKTsKKworCS8qCisJICogRm9yIG5ldyBlbnRyaWVzLCB3ZSBpbml0aWFsaXplIGxpc3Rl bmVyc19hcnJheSB0byBJbnZhbGlkRHNhUG9pbnRlciBhcworCSAqIGEgbWFya2VyLiBUaGlz IGhhbmRsZXMgYm90aCB0aGUgaW5pdGlhbCBjcmVhdGlvbiBhbmQgcG90ZW50aWFsIHJldHJ5 CisJICogYWZ0ZXIgT09NLgorCSAqLworCWVudHJ5ID0gZHNoYXNoX2ZpbmRfb3JfaW5zZXJ0 KGNoYW5uZWxfaGFzaCwgJmtleSwgJmZvdW5kKTsKKworCWlmICghZm91bmQpCisJCWVudHJ5 LT5saXN0ZW5lcnNfYXJyYXkgPSBJbnZhbGlkRHNhUG9pbnRlcjsKKworCWlmICghRHNhUG9p bnRlcklzVmFsaWQoZW50cnktPmxpc3RlbmVyc19hcnJheSkpCisJeworCQkvKiBGaXJzdCBs aXN0ZW5lciBmb3IgdGhpcyBjaGFubmVsICovCisJCWVudHJ5LT5saXN0ZW5lcnNfYXJyYXkg PSBkc2FfYWxsb2NhdGUoY2hhbm5lbF9kc2EsCisJCQkJCQkJCQkJCSAgc2l6ZW9mKFByb2NO dW1iZXIpICogSU5JVElBTF9MSVNURU5FUlNfQVJSQVlfU0laRSk7CisJCWVudHJ5LT5udW1f bGlzdGVuZXJzID0gMDsKKwkJZW50cnktPmFsbG9jYXRlZF9saXN0ZW5lcnMgPSBJTklUSUFM X0xJU1RFTkVSU19BUlJBWV9TSVpFOworCX0KKworCWxpc3RlbmVycyA9IChQcm9jTnVtYmVy ICopIGRzYV9nZXRfYWRkcmVzcyhjaGFubmVsX2RzYSwKKwkJCQkJCQkJCQkJICAgZW50cnkt Pmxpc3RlbmVyc19hcnJheSk7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5LT5udW1f bGlzdGVuZXJzOyBpKyspCisJeworCQlpZiAobGlzdGVuZXJzW2ldID09IE15UHJvY051bWJl cikKKwkJeworCQkJZHNoYXNoX3JlbGVhc2VfbG9jayhjaGFubmVsX2hhc2gsIGVudHJ5KTsK KwkJCXJldHVybjsJCQkJLyogQWxyZWFkeSByZWdpc3RlcmVkICovCisJCX0KKwl9CisKKwkv KiBOZWVkIHRvIGFkZCB0aGlzIGxpc3RlbmVyICovCisJaWYgKGVudHJ5LT5udW1fbGlzdGVu ZXJzID49IGVudHJ5LT5hbGxvY2F0ZWRfbGlzdGVuZXJzKQorCXsKKwkJLyogR3JvdyB0aGUg YXJyYXkgKGRvdWJsZSB0aGUgc2l6ZSkgKi8KKwkJaW50CQkJbmV3X3NpemUgPSBlbnRyeS0+ YWxsb2NhdGVkX2xpc3RlbmVycyAqIDI7CisJCWRzYV9wb2ludGVyIG5ld19hcnJheSA9IGRz YV9hbGxvY2F0ZShjaGFubmVsX2RzYSwKKwkJCQkJCQkJCQkJIHNpemVvZihQcm9jTnVtYmVy KSAqIG5ld19zaXplKTsKKwkJUHJvY051bWJlciAqbmV3X2xpc3RlbmVycyA9IChQcm9jTnVt YmVyICopIGRzYV9nZXRfYWRkcmVzcyhjaGFubmVsX2RzYSwKKwkJCQkJCQkJCQkJCQkJCQkg ICBuZXdfYXJyYXkpOworCisJCS8qIENvcHkgZXhpc3RpbmcgbGlzdGVuZXJzICovCisJCW1l bWNweShuZXdfbGlzdGVuZXJzLCBsaXN0ZW5lcnMsCisJCQkgICBzaXplb2YoUHJvY051bWJl cikgKiBlbnRyeS0+bnVtX2xpc3RlbmVycyk7CisKKwkJLyogRnJlZSBvbGQgYXJyYXkgYW5k IHVwZGF0ZSBlbnRyeSAqLworCQlkc2FfZnJlZShjaGFubmVsX2RzYSwgZW50cnktPmxpc3Rl bmVyc19hcnJheSk7CisJCWVudHJ5LT5saXN0ZW5lcnNfYXJyYXkgPSBuZXdfYXJyYXk7CisJ CWVudHJ5LT5hbGxvY2F0ZWRfbGlzdGVuZXJzID0gbmV3X3NpemU7CisJCWxpc3RlbmVycyA9 IG5ld19saXN0ZW5lcnM7CisJfQorCisJLyogQWRkIHRoZSBuZXcgbGlzdGVuZXIgKi8KKwls aXN0ZW5lcnNbZW50cnktPm51bV9saXN0ZW5lcnNdID0gTXlQcm9jTnVtYmVyOworCWVudHJ5 LT5udW1fbGlzdGVuZXJzKys7CisKKwlkc2hhc2hfcmVsZWFzZV9sb2NrKGNoYW5uZWxfaGFz aCwgZW50cnkpOworfQorCisvKgorICogQ2hhbm5lbEhhc2hSZW1vdmVMaXN0ZW5lcgorICoJ CVVucmVnaXN0ZXIgYXMgYSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBjaGFubmVsLgor ICovCitzdGF0aWMgdm9pZAorQ2hhbm5lbEhhc2hSZW1vdmVMaXN0ZW5lcihjb25zdCBjaGFy ICpjaGFubmVsKQoreworCUNoYW5uZWxIYXNoS2V5IGtleTsKKwlDaGFubmVsRW50cnkgKmVu dHJ5OworCVByb2NOdW1iZXIgKmxpc3RlbmVyczsKKwlpbnQJCQlpOworCisJaWYgKGNoYW5u ZWxfaGFzaCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpbml0X2NoYW5uZWxfaGFzaCgpOwor CisJQ2hhbm5lbEhhc2hQcmVwYXJlS2V5KCZrZXksIE15RGF0YWJhc2VJZCwgY2hhbm5lbCk7 CisKKwllbnRyeSA9IGRzaGFzaF9maW5kKGNoYW5uZWxfaGFzaCwgJmtleSwgdHJ1ZSk7CisJ aWYgKGVudHJ5ID09IE5VTEwpCisJCXJldHVybjsKKworCWxpc3RlbmVycyA9IChQcm9jTnVt YmVyICopIGRzYV9nZXRfYWRkcmVzcyhjaGFubmVsX2RzYSwKKwkJCQkJCQkJCQkJICAgZW50 cnktPmxpc3RlbmVyc19hcnJheSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cnktPm51bV9s aXN0ZW5lcnM7IGkrKykKKwl7CisJCWlmIChsaXN0ZW5lcnNbaV0gPT0gTXlQcm9jTnVtYmVy KQorCQl7CisJCQkvKiBGb3VuZCBpdCwgcmVtb3ZlIGJ5IHNoaWZ0aW5nIHJlbWFpbmluZyBl bGVtZW50cyAqLworCQkJZW50cnktPm51bV9saXN0ZW5lcnMtLTsKKwkJCWlmIChpIDwgZW50 cnktPm51bV9saXN0ZW5lcnMpCisJCQl7CisJCQkJbWVtbW92ZSgmbGlzdGVuZXJzW2ldLCAm bGlzdGVuZXJzW2kgKyAxXSwKKwkJCQkJCXNpemVvZihQcm9jTnVtYmVyKSAqIChlbnRyeS0+ bnVtX2xpc3RlbmVycyAtIGkpKTsKKwkJCX0KKworCQkJaWYgKGVudHJ5LT5udW1fbGlzdGVu ZXJzID09IDApCisJCQl7CisJCQkJZHNhX2ZyZWUoY2hhbm5lbF9kc2EsIGVudHJ5LT5saXN0 ZW5lcnNfYXJyYXkpOworCQkJCWRzaGFzaF9kZWxldGVfZW50cnkoY2hhbm5lbF9oYXNoLCBl bnRyeSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZHNoYXNoX3JlbGVhc2VfbG9jayhj aGFubmVsX2hhc2gsIGVudHJ5KTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8q IE5vdCBmb3VuZCBpbiBsaXN0ICovCisJZHNoYXNoX3JlbGVhc2VfbG9jayhjaGFubmVsX2hh c2gsIGVudHJ5KTsKK30KKworLyoKKyAqIEdldFBlbmRpbmdOb3RpZnlDaGFubmVscworICoJ CUdldCBsaXN0IG9mIHVuaXF1ZSBjaGFubmVsIG5hbWVzIGZyb20gcGVuZGluZyBub3RpZmlj YXRpb25zLgorICovCitzdGF0aWMgTGlzdCAqCitHZXRQZW5kaW5nTm90aWZ5Q2hhbm5lbHMo dm9pZCkKK3sKKwlMaXN0CSAgICpjaGFubmVscyA9IE5JTDsKKwlMaXN0Q2VsbCAgICpwOwor CUxpc3RDZWxsICAgKnE7CisJYm9vbAkJZm91bmQ7CisKKwlpZiAoIXBlbmRpbmdOb3RpZmll cykKKwkJcmV0dXJuIE5JTDsKKworCWZvcmVhY2gocCwgcGVuZGluZ05vdGlmaWVzLT5ldmVu dHMpCisJeworCQlOb3RpZmljYXRpb24gKm4gPSAoTm90aWZpY2F0aW9uICopIGxmaXJzdChw KTsKKwkJY2hhcgkgICAqY2hhbm5lbCA9IG4tPmRhdGE7CisKKwkJZm91bmQgPSBmYWxzZTsK KwkJZm9yZWFjaChxLCBjaGFubmVscykKKwkJeworCQkJY2hhcgkgICAqZXhpc3RpbmcgPSAo Y2hhciAqKSBsZmlyc3QocSk7CisKKwkJCWlmIChzdHJjbXAoZXhpc3RpbmcsIGNoYW5uZWwp ID09IDApCisJCQl7CisJCQkJZm91bmQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9 CisKKwkJaWYgKCFmb3VuZCkKKwkJCWNoYW5uZWxzID0gbGFwcGVuZChjaGFubmVscywgY2hh bm5lbCk7CisJfQorCisJcmV0dXJuIGNoYW5uZWxzOworfQpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQgYi9zcmMvYmFja2Vu ZC91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25hbWVzLnR4dAppbmRleCA3NTUzZjZlYWNl Zi4uYTRmYWRiZDA3NjcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5 L3dhaXRfZXZlbnRfbmFtZXMudHh0CisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5 L3dhaXRfZXZlbnRfbmFtZXMudHh0CkBAIC0zNjYsNiArMzY2LDcgQEAgU3VidHJhbnNCdWZm ZXIJIldhaXRpbmcgZm9yIEkvTyBvbiBhIHN1Yi10cmFuc2FjdGlvbiBTTFJVIGJ1ZmZlci4i CiBNdWx0aVhhY3RPZmZzZXRCdWZmZXIJIldhaXRpbmcgZm9yIEkvTyBvbiBhIG11bHRpeGFj dCBvZmZzZXQgU0xSVSBidWZmZXIuIgogTXVsdGlYYWN0TWVtYmVyQnVmZmVyCSJXYWl0aW5n IGZvciBJL08gb24gYSBtdWx0aXhhY3QgbWVtYmVyIFNMUlUgYnVmZmVyLiIKIE5vdGlmeUJ1 ZmZlcgkiV2FpdGluZyBmb3IgSS9PIG9uIGEgPGNvbW1hbmQ+Tk9USUZZPC9jb21tYW5kPiBt ZXNzYWdlIFNMUlUgYnVmZmVyLiIKK05vdGlmeUNoYW5uZWxIYXNoCSJXYWl0aW5nIHRvIGFj Y2VzcyB0aGUgPGNvbW1hbmQ+Tk9USUZZPC9jb21tYW5kPiBjaGFubmVsIGhhc2ggdGFibGUu IgogU2VyaWFsQnVmZmVyCSJXYWl0aW5nIGZvciBJL08gb24gYSBzZXJpYWxpemFibGUgdHJh bnNhY3Rpb24gY29uZmxpY3QgU0xSVSBidWZmZXIuIgogV0FMSW5zZXJ0CSJXYWl0aW5nIHRv IGluc2VydCBXQUwgZGF0YSBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4iCiBCdWZmZXJDb250ZW50 CSJXYWl0aW5nIHRvIGFjY2VzcyBhIGRhdGEgcGFnZSBpbiBtZW1vcnkuIgpkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2tsaXN0LmggYi9zcmMvaW5jbHVkZS9zdG9y YWdlL2x3bG9ja2xpc3QuaAppbmRleCAwNmExZmZkNGIwOC4uMjc2OGRkZjQ0MTQgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbHdsb2NrbGlzdC5oCisrKyBiL3NyYy9pbmNs dWRlL3N0b3JhZ2UvbHdsb2NrbGlzdC5oCkBAIC0xMDAsNiArMTAwLDcgQEAgUEdfTFdMT0NL VFJBTkNIRShTVUJUUkFOU19CVUZGRVIsIFN1YnRyYW5zQnVmZmVyKQogUEdfTFdMT0NLVFJB TkNIRShNVUxUSVhBQ1RPRkZTRVRfQlVGRkVSLCBNdWx0aVhhY3RPZmZzZXRCdWZmZXIpCiBQ R19MV0xPQ0tUUkFOQ0hFKE1VTFRJWEFDVE1FTUJFUl9CVUZGRVIsIE11bHRpWGFjdE1lbWJl ckJ1ZmZlcikKIFBHX0xXTE9DS1RSQU5DSEUoTk9USUZZX0JVRkZFUiwgTm90aWZ5QnVmZmVy KQorUEdfTFdMT0NLVFJBTkNIRShOT1RJRllfQ0hBTk5FTF9IQVNILCBOb3RpZnlDaGFubmVs SGFzaCkKIFBHX0xXTE9DS1RSQU5DSEUoU0VSSUFMX0JVRkZFUiwgU2VyaWFsQnVmZmVyKQog UEdfTFdMT0NLVFJBTkNIRShXQUxfSU5TRVJULCBXQUxJbnNlcnQpCiBQR19MV0xPQ0tUUkFO Q0hFKEJVRkZFUl9DT05URU5ULCBCdWZmZXJDb250ZW50KQotLSAKMi41MC4xCgo= --b0c8f941d6074315ac18ff943060fc31--