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 1uf5jq-00208d-U5 for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Jul 2025 23:52:39 +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 1uf5jo-00Cbtv-UO for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Jul 2025 23:52:37 +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 1uf5jo-00Cbtm-7J for pgsql-hackers@lists.postgresql.org; Thu, 24 Jul 2025 23:52:36 +0000 Received: from relay15.mail.gandi.net ([217.70.178.235]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1uf5ji-000gdj-2K for pgsql-hackers@lists.postgresql.org; Thu, 24 Jul 2025 23:52:34 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id AF3BC43136; Thu, 24 Jul 2025 23:52:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vondra.me; s=gm1; t=1753401149; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=zOtgvk2q6Hgmk1DLerKfLHUPf+uvvGvgAwk/8h2dI7E=; b=WejR7XjofFcCu4BH0vuKxMV1NfG9MfD05DWwxpOjUHJtjhOyIiTGWi6LwMC7Pya/jDxJrD zyZSAthoCJOHP8NwtF93brtHM/gWQID2ZfZaR0gzs4pjPL/5JM0zEiNVCFsUJJZdDjJI2L Y03eOHpLcFnIBZ9bGG/nGNRXNeGkwIgVB9ZFSzPPhPqcSXc0nT2pyYYKzjwKuwbQIUhrSC 6sIFOjeYZwpRMSXq4qNskQY4/MEwCfL3pzC58Qci6hvS1RUrXLeJGvD8yQ8iNocnQ8tvbY Fztw6zS1FvLHJUzBQZyaKW9XeiHU80x9VIp38T6E5H4+EfIiQ5xi1+mbLuQtTQ== Content-Type: multipart/mixed; boundary="------------L88IUdLR2ztfLgRvq2LgWyMh" Message-ID: <306fc8c0-c882-4602-86f5-a106b9ace603@vondra.me> Date: Fri, 25 Jul 2025 01:52:22 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: index prefetching To: Peter Geoghegan Cc: Nazir Bilal Yavuz , Thomas Munro , Andres Freund , Robert Haas , Melanie Plageman , PostgreSQL Hackers , Georgios , Konstantin Knizhnik , Dilip Kumar References: <03dcc1a9-c5d0-4965-889c-684dc0a7580c@vondra.me> <23f490f4-8325-408c-91a0-a6757ab2441c@vondra.me> <1bebfd1b-aea5-4d41-80a6-eae64b8f9eaf@vondra.me> <8ed1d326-5c6e-476e-b3fd-30d3da210546@vondra.me> <38b865bd-2ae9-4a94-a788-6e3dc99ccd70@vondra.me> Content-Language: en-US From: Tomas Vondra In-Reply-To: X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdekvddtvdcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfitefpfffkpdcuggftfghnshhusghstghrihgsvgenuceurghilhhouhhtmecufedtudenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurheptgfkffggfgfuvfevfhfhjgesmhdtreertddvjeenucfhrhhomhepvfhomhgrshcugghonhgurhgruceothhomhgrshesvhhonhgurhgrrdhmvgeqnecuggftrfgrthhtvghrnhepkeduhffgleeghfejtdehlefhgfdugeejudefffetuddtheelhfejfedtveeifeeinecukfhppeekiedrgeelrddvfedtrddvtdeinecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepkeeirdegledrvdeftddrvddtiedphhgvlhhopegluddtrddufeejrddtrddvngdpmhgrihhlfhhrohhmpehtohhmrghssehvohhnughrrgdrmhgvpdhnsggprhgtphhtthhopedutddprhgtphhtthhopehpghessghofihtrdhivgdprhgtphhtthhopegshigrvhhuiiekudesghhmrghilhdrtghomhdprhgtphhtthhopehthhhomhgrshdrmhhunhhrohesghhmrghilhdrtghomhdprhgtphhtthhopegrnhgurhgvshesrghnrghrrgiivghlrdguvgdprhgtphhtthhopehrohgsvghrthhmhhgrrghssehgmhgrihhlrdgtohhmpdhrtghpthhtohepmhgvlhgrnhhivghplhgrghgvmhgrnhesghhmrghilhdrtghomhdprhgtphhtthhop ehpghhsqhhlqdhhrggtkhgvrhhssehlihhsthhsrdhpohhsthhgrhgvshhqlhdrohhrghdprhgtphhtthhopehgkhhokhholhgrthhoshesphhrohhtohhnmhgrihhlrdgtohhm 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. --------------L88IUdLR2ztfLgRvq2LgWyMh Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 7/24/25 16:40, Peter Geoghegan wrote: > On Thu, Jul 24, 2025 at 7:19 AM Tomas Vondra wrote: >> I got a bit bored yesterday, so I gave this a try and whipped up a patch >> that adds two pgstattuple functins that I think could be useful for >> analyzing index metrics that matter for prefetching. > > This seems quite useful. > > I notice that you're not accounting for posting lists. That'll lead to > miscounts of the number of heap blocks in many cases. I think that > that's worth fixing, even given that this patch is experimental. > Yeah, I forgot about that. Should be fixed in the v2. Admittedly I don't know that much about nbtree internals, so this is mostly copy pasting from verify_nbtree. >> It's trivial to summarize this into a per-index statistic (of course, >> there may be some inaccuracies when the run spans multiple ranges), but >> it also seems useful to be able to look at parts of the index. > > FWIW in my experience, the per-leaf-page "nhtids:nhblks" tends to be > fairly consistent across all leaf pages from a given index. There are > no doubt some exceptions, but they're probably pretty rare. > Yeah, probably. And we'll probably test on such uniform data sets, or at least we we'll start with those. But at some point I'd like to test with some of these "weird" indexes too, if only to test how well the prefetch heuristics adjusts the distance. >> Second, the index is walked sequentially in physical order, from block 0 >> to the last block. But that's not really what the index prefetch sees. >> To make it "more accurate" it'd be better to just scan the leaf pages as >> if during a "full index scan". > > Why not just do it that way to begin with? It wouldn't be complicated > to make the function follow a chain of right sibling links. > I have a very good reason why I didn't do it that way. I was lazy. But v2 should be doing that, I think. > I suggest an interface that takes a block number, and an nblocks int8 > argument that must be >= 1. The function would start from the block > number arg leaf page. If it's not a non-ignorable leaf page, throw an > error. Otherwise, count the number of distinct heap blocks on the leaf > page, and count the number of heap blocks on each additional leaf page > to the right -- until we've counted the heap blocks from nblocks-many > leaf pages (or until we reach the rightmost leaf page). > Yeah, this interface seems useful. I suppose it'll be handy when looking at an index scan, to get stats from the currently loaded batches. In principle you get that from v3 by filtering, but it might be slow on large indexes. I'll try doing that in v3. > I suggest that a P_IGNORE() page shouldn't have its heap blocks > counted, and shouldn't count towards our nblocks tally of leaf pages > whose heap blocks are to be counted. Upon encountering a P_IGNORE() > page, just move to the right without doing anything. Note that the > rightmost page cannot be P_IGNORE(). > I think v2 does all of this. > This scheme will always succeed, no matter the nblocks argument, > provided the initial leaf page is a valid leaf page (and provided the > nblocks arg is >= 1). > > I get that this is just a prototype that might not go anywhere, but > the scheme I've described requires few changes. > Yep, thanks. -- Tomas Vondra --------------L88IUdLR2ztfLgRvq2LgWyMh Content-Type: text/x-patch; charset=UTF-8; name="v2-0001-pgstattuple-analyze-TIDs-on-btree-leaf-pages.patch" Content-Disposition: attachment; filename*0="v2-0001-pgstattuple-analyze-TIDs-on-btree-leaf-pages.patch" Content-Transfer-Encoding: base64 RnJvbSAwOTU3NmU1MTlhZGZlM2I4ZGI0N2RlM2I0YjAzZjFmOTM3NGUzZWNmIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogVGh1LCAyNCBKdWwgMjAyNSAxMzowMDoyNCArMDIwMApTdWJqZWN0OiBbUEFUQ0gg djJdIHBnc3RhdHR1cGxlOiBhbmFseXplIFRJRHMgb24gYnRyZWUgbGVhZiBwYWdlcwoKVGhl IHBhdGNoIGFkZHMgdHdvIGZ1bmN0aW9ucywgdGhhdCBhcmUgbWVhbnQgdG8gcHJvdmlkZSBk YXRhIGZvcgphZGRpdGlvbmFsIGFuYWx5c2lzIHJhdGhlciB0aGFuIGNvbXB1dGluZyBzb21l dGhpbmcgZmluYWwuIEVhY2ggZnVuY3Rpb24Kc3BsaXRzIHRoZSBpbmRleCBpbnRvIGEgc2Vx dWVuY2Ugb2YgYmxvY2sgcmFuZ2VzIChvZiBnaXZlbiBsZW5ndGgpLCBhbmQKY2FsY3VsYXRl cyBzb21lIG1ldHJpY3Mgb24gdGhhdC4KCnBnc3RhdGluZGV4X25oZWFwCiAgLSBudW1iZXIg b2YgbGVhZnMgaW4gdGhlIHJhbmdlCiAgLSBudW1iZXIgb2YgYmxvY2sgbnVtYmVycwogIC0g bnVtYmVyIG9mIGRpc3RpbmN0IGJsb2NrIG51bWJlcnMKICAtIG51bWJlciBvZiBydW5zIChv ZiB0aGUgc2FtZSBibG9jaykKCnBnc3RhdGluZGV4X3J1bnMKICAtIG51bWJlciBvZiBsZWFm cyBpbiB0aGUgcmFuZ2UKICAtIHJ1biBsZW5ndGgKICAtIG51bWJlciBvZiBydW5zIHdpdGgg dGhlIGxlbmd0aAoKSXQncyB0cml2aWFsIHRvIHN1bW1hcml6ZSB0aGlzIGludG8gYSBwZXIt aW5kZXggc3RhdGlzdGljIChvZiBjb3Vyc2UsCnRoZXJlIG1heSBiZSBzb21lIGluYWNjdXJh Y2llcyB3aGVuIHRoZSBydW4gc3BhbnMgbXVsdGlwbGUgcmFuZ2VzKSwgYnV0Cml0IGFsc28g c2VlbXMgdXNlZnVsIHRvIGJlIGFibGUgdG8gbG9vayBhdCBwYXJ0cyBvZiB0aGUgaW5kZXgu CgpUaGlzIGlzIG1lYW50IGFzIGEgcXVpY2sgZXhwZXJpbWVudGFsIHBhdGNoLCB0byBoZWxw IHdpdGggZ2VuZXJhdGluZwpiZXR0ZXIgZGF0YXNldHMgZm9yIHRoZSBldmFsdWF0aW9uLiBB bmQgSSB0aGluayBpdCB3b3JrcyBmb3IgdGhhdCwgYW5kIEkKZG9uJ3QgaGF2ZSBpbW1lZGlh dGUgcGxhbnMgdG8gd29yayBvbiB0aGlzIG91dHNpZGUgdGhhdCBjb250ZXh0LgotLS0KIGNv bnRyaWIvcGdzdGF0dHVwbGUvTWFrZWZpbGUgICAgICAgICAgICAgICAgICB8ICAgMyArLQog Y29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXRpbmRleC5jICAgICAgICAgICAgIHwgNDgxICsr KysrKysrKysrKysrKysrKwogY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXR0dXBsZS0tMS41 LS0xLjYuc3FsIHwgIDMxICsrCiBjb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdHR1cGxlLmNv bnRyb2wgICAgICAgfCAgIDIgKy0KIDQgZmlsZXMgY2hhbmdlZCwgNTE1IGluc2VydGlvbnMo KyksIDIgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgY29udHJpYi9wZ3N0YXR0 dXBsZS9wZ3N0YXR0dXBsZS0tMS41LS0xLjYuc3FsCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9w Z3N0YXR0dXBsZS9NYWtlZmlsZSBiL2NvbnRyaWIvcGdzdGF0dHVwbGUvTWFrZWZpbGUKaW5k ZXggYzViMTdmYzcwM2UuLmQ1YzYyYmEzNmY5IDEwMDY0NAotLS0gYS9jb250cmliL3Bnc3Rh dHR1cGxlL01ha2VmaWxlCisrKyBiL2NvbnRyaWIvcGdzdGF0dHVwbGUvTWFrZWZpbGUKQEAg LTEwLDcgKzEwLDggQEAgT0JKUyA9IFwKIEVYVEVOU0lPTiA9IHBnc3RhdHR1cGxlCiBEQVRB ID0gcGdzdGF0dHVwbGUtLTEuNC5zcWwgcGdzdGF0dHVwbGUtLTEuNC0tMS41LnNxbCBcCiAJ cGdzdGF0dHVwbGUtLTEuMy0tMS40LnNxbCBwZ3N0YXR0dXBsZS0tMS4yLS0xLjMuc3FsIFwK LQlwZ3N0YXR0dXBsZS0tMS4xLS0xLjIuc3FsIHBnc3RhdHR1cGxlLS0xLjAtLTEuMS5zcWwK KwlwZ3N0YXR0dXBsZS0tMS4xLS0xLjIuc3FsIHBnc3RhdHR1cGxlLS0xLjAtLTEuMS5zcWwg XAorCXBnc3RhdHR1cGxlLS0xLjUtLTEuNi5zcWwKIFBHRklMRURFU0MgPSAicGdzdGF0dHVw bGUgLSB0dXBsZS1sZXZlbCBzdGF0aXN0aWNzIgogCiBSRUdSRVNTID0gcGdzdGF0dHVwbGUK ZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdzdGF0dHVwbGUvcGdzdGF0aW5kZXguYyBiL2NvbnRy aWIvcGdzdGF0dHVwbGUvcGdzdGF0aW5kZXguYwppbmRleCA0YjlkNzZlYzRlNC4uZDg4YjQ3 NTk1YWMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdzdGF0dHVwbGUvcGdzdGF0aW5kZXguYwor KysgYi9jb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdGluZGV4LmMKQEAgLTYyLDYgKzYyLDkg QEAgUEdfRlVOQ1RJT05fSU5GT19WMShwZ19yZWxwYWdlc192MV81KTsKIFBHX0ZVTkNUSU9O X0lORk9fVjEocGdfcmVscGFnZXNieWlkX3YxXzUpOwogUEdfRlVOQ1RJT05fSU5GT19WMShw Z3N0YXRnaW5pbmRleF92MV81KTsKIAorUEdfRlVOQ1RJT05fSU5GT19WMShwZ3N0YXRpbmRl eF9uaGVhcF92MV82KTsKK1BHX0ZVTkNUSU9OX0lORk9fVjEocGdzdGF0aW5kZXhfcnVuc192 MV82KTsKKwogRGF0dW0JCXBnc3RhdGdpbmluZGV4X2ludGVybmFsKE9pZCByZWxpZCwgRnVu Y3Rpb25DYWxsSW5mbyBmY2luZm8pOwogCiAjZGVmaW5lIElTX0lOREVYKHIpICgociktPnJk X3JlbC0+cmVsa2luZCA9PSBSRUxLSU5EX0lOREVYKQpAQCAtMTI4LDYgKzEzMSw5IEBAIHN0 YXRpYyBEYXR1bSBwZ3N0YXRpbmRleF9pbXBsKFJlbGF0aW9uIHJlbCwgRnVuY3Rpb25DYWxs SW5mbyBmY2luZm8pOwogc3RhdGljIGludDY0IHBnX3JlbHBhZ2VzX2ltcGwoUmVsYXRpb24g cmVsKTsKIHN0YXRpYyB2b2lkIEdldEhhc2hQYWdlU3RhdHMoUGFnZSBwYWdlLCBIYXNoSW5k ZXhTdGF0ICpzdGF0cyk7CiAKK3N0YXRpYyBEYXR1bSBwZ3N0YXRpbmRleF9uaGVhcF9pbXBs KFJlbGF0aW9uIHJlbCwgaW50NjQgbmJsb2NrcywgRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8p Oworc3RhdGljIERhdHVtIHBnc3RhdGluZGV4X3J1bnNfaW1wbChSZWxhdGlvbiByZWwsIGlu dDY0IG5ibG9ja3MsIEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvKTsKKwogLyogLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBwZ3N0 YXRpbmRleCgpCiAgKgpAQCAtNzU2LDMgKzc2Miw0NzggQEAgR2V0SGFzaFBhZ2VTdGF0cyhQ YWdlIHBhZ2UsIEhhc2hJbmRleFN0YXQgKnN0YXRzKQogCX0KIAlzdGF0cy0+ZnJlZV9zcGFj ZSArPSBQYWdlR2V0RXhhY3RGcmVlU3BhY2UocGFnZSk7CiB9CisKKy8qCisgKi8KK0RhdHVt CitwZ3N0YXRpbmRleF9uaGVhcF92MV82KFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJdGV4dAkg ICAqcmVsbmFtZSA9IFBHX0dFVEFSR19URVhUX1BQKDApOworCWludDY0CQluYmxvY2tzID0g UEdfR0VUQVJHX0lOVDY0KDEpOworCVJlbGF0aW9uCXJlbDsKKwlSYW5nZVZhciAgICpyZWxy djsKKworCXJlbHJ2ID0gbWFrZVJhbmdlVmFyRnJvbU5hbWVMaXN0KHRleHRUb1F1YWxpZmll ZE5hbWVMaXN0KHJlbG5hbWUpKTsKKwlyZWwgPSByZWxhdGlvbl9vcGVucnYocmVscnYsIEFj Y2Vzc1NoYXJlTG9jayk7CisKKwlQR19SRVRVUk5fREFUVU0ocGdzdGF0aW5kZXhfbmhlYXBf aW1wbChyZWwsIG5ibG9ja3MsIGZjaW5mbykpOworfQorCisvKgorICovCitEYXR1bQorcGdz dGF0aW5kZXhfcnVuc192MV82KFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJdGV4dAkgICAqcmVs bmFtZSA9IFBHX0dFVEFSR19URVhUX1BQKDApOworCWludDY0CQluYmxvY2tzID0gUEdfR0VU QVJHX0lOVDY0KDEpOworCVJlbGF0aW9uCXJlbDsKKwlSYW5nZVZhciAgICpyZWxydjsKKwor CXJlbHJ2ID0gbWFrZVJhbmdlVmFyRnJvbU5hbWVMaXN0KHRleHRUb1F1YWxpZmllZE5hbWVM aXN0KHJlbG5hbWUpKTsKKwlyZWwgPSByZWxhdGlvbl9vcGVucnYocmVscnYsIEFjY2Vzc1No YXJlTG9jayk7CisKKwlQR19SRVRVUk5fREFUVU0ocGdzdGF0aW5kZXhfcnVuc19pbXBsKHJl bCwgbmJsb2NrcywgZmNpbmZvKSk7Cit9CisKK3R5cGVkZWYgc3RydWN0IEJsb2NrQnVmZmVy Cit7CisJaW50CQkJbml0ZW1zOworCWludAkJCW1heGl0ZW1zOworCUJsb2NrTnVtYmVyICpp dGVtczsKK30gQmxvY2tCdWZmZXI7CisKK3N0YXRpYyBpbnQKK2Jsb2NrbnVtX2NtcChjb25z dCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCXJldHVybiBtZW1jbXAoYSwgYiwgc2l6 ZW9mKEJsb2NrTnVtYmVyKSk7Cit9CisKK3N0YXRpYyBpbnQKK2NvdW50X2Jsb2NrX3J1bnMo QmxvY2tCdWZmZXIgYmxvY2tzKQoreworCWludAkJCW5ydW5zID0gMTsKKworCWZvciAoaW50 IGkgPSAxOyBpIDwgYmxvY2tzLm5pdGVtczsgaSsrKQorCXsKKwkJaWYgKGJsb2Nrcy5pdGVt c1tpXSAhPSBibG9ja3MuaXRlbXNbaS0xXSkKKwkJCW5ydW5zKys7CisJfQorCisJcmV0dXJu IG5ydW5zOworfQorCitzdGF0aWMgaW50Citjb3VudF9ibG9ja3NfZGlzdGluY3QoQmxvY2tC dWZmZXIgYmxvY2tzKQoreworCXBnX3Fzb3J0KGJsb2Nrcy5pdGVtcywgYmxvY2tzLm5pdGVt cywgc2l6ZW9mKEJsb2NrTnVtYmVyKSwgYmxvY2tudW1fY21wKTsKKworCXJldHVybiBjb3Vu dF9ibG9ja19ydW5zKGJsb2Nrcyk7Cit9CisKK3N0YXRpYyB2b2lkCitidWZmZXJfaW5pdChC bG9ja0J1ZmZlciAqYmxvY2tzKQoreworCWJsb2Nrcy0+bml0ZW1zID0gMDsKKwlibG9ja3Mt Pm1heGl0ZW1zID0gMDsKKwlibG9ja3MtPml0ZW1zID0gTlVMTDsKK30KKworc3RhdGljIHZv aWQKK2J1ZmZlcl9hZGRfYmxvY2soQmxvY2tCdWZmZXIgKmJsb2NrcywgQmxvY2tOdW1iZXIg YmxvY2spCit7CisJaWYgKGJsb2Nrcy0+bml0ZW1zID09IGJsb2Nrcy0+bWF4aXRlbXMpCisJ eworCQlpZiAoYmxvY2tzLT5tYXhpdGVtcyA9PSAwKQorCQl7CisJCQlibG9ja3MtPm1heGl0 ZW1zID0gNjQ7CisJCQlibG9ja3MtPml0ZW1zID0gcGFsbG9jX2FycmF5KEJsb2NrTnVtYmVy LCBibG9ja3MtPm1heGl0ZW1zKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJsb2Nrcy0+bWF4 aXRlbXMgKj0gMjsKKwkJCWJsb2Nrcy0+aXRlbXMgPSByZXBhbGxvY19hcnJheShibG9ja3Mt Pml0ZW1zLCBCbG9ja051bWJlciwKKwkJCQkJCQkJCQkgICBibG9ja3MtPm1heGl0ZW1zKTsK KwkJfQorCX0KKworCWJsb2Nrcy0+aXRlbXNbYmxvY2tzLT5uaXRlbXMrK10gPSBibG9jazsK K30KKworc3RhdGljIERhdHVtCitwZ3N0YXRpbmRleF9uaGVhcF9pbXBsKFJlbGF0aW9uIHJl bCwgaW50NjQgcmFuZ2VfbGVuLCBGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbykKK3sKKwlSZXR1 cm5TZXRJbmZvICpyc2luZm8gPSAoUmV0dXJuU2V0SW5mbyAqKSBmY2luZm8tPnJlc3VsdGlu Zm87CisKKwlUdXBsZURlc2MJdHVwZGVzYzsKKwlUdXBsZXN0b3Jlc3RhdGUgKnR1cHN0b3Jl OworCisJRGF0dW0JCXZhbHVlc1s1XTsKKwlib29sCQludWxsc1s1XTsKKworCUJsb2NrQnVm ZmVyCWJsb2NrczsJLyogYnVmZmVyIHdpdGggYmxvY2tzIGZyb20gdGhlIHJhbmdlICovCisJ QmxvY2tOdW1iZXIJYmxrbm87CS8qIGJsb2NrIG51bWJlciBvZiB0aGUgKGZpcnN0KSBsZWFm IGluIHRoZSByYW5nZSAqLworCWludDY0CQluYmxvY2tzOworCUJ1ZmZlcgkJYnVmOworCWlu dDY0CQlzZXEgPSAwOworCisJLyogbm8gTlVMTHMgKi8KKwltZW1zZXQobnVsbHMsIDAsIHNp emVvZihudWxscykpOworCisJaWYgKHJhbmdlX2xlbiA8IDEpCisJCWVyZXBvcnQoRVJST1Is CisJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCisJCQkJ IGVycm1zZygicmFuZ2UgbGVuZ3RoIGhhcyB0byBiZSBhdCBsZWFzdCAxIikpKTsKKworCWlm ICghSVNfSU5ERVgocmVsKSB8fCAhSVNfQlRSRUUocmVsKSkKKwkJZXJlcG9ydChFUlJPUiwK KwkJCQkoZXJyY29kZShFUlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKKwkJCQkgZXJybXNn KCJyZWxhdGlvbiBcIiVzXCIgaXMgbm90IGEgYnRyZWUgaW5kZXgiLAorCQkJCQkJUmVsYXRp b25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsKKworCS8qCisJICogUmVqZWN0IGF0dGVtcHRz IHRvIHJlYWQgbm9uLWxvY2FsIHRlbXBvcmFyeSByZWxhdGlvbnM7IHdlIHdvdWxkIGJlCisJ ICogbGlrZWx5IHRvIGdldCB3cm9uZyBkYXRhIHNpbmNlIHdlIGhhdmUgbm8gdmlzaWJpbGl0 eSBpbnRvIHRoZSBvd25pbmcKKwkgKiBzZXNzaW9uJ3MgbG9jYWwgYnVmZmVycy4KKwkgKi8K KwlpZiAoUkVMQVRJT05fSVNfT1RIRVJfVEVNUChyZWwpKQorCQllcmVwb3J0KEVSUk9SLAor CQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkgZXJy bXNnKCJjYW5ub3QgYWNjZXNzIHRlbXBvcmFyeSB0YWJsZXMgb2Ygb3RoZXIgc2Vzc2lvbnMi KSkpOworCisJLyoKKwkgKiBBICFpbmRpc3JlYWR5IGluZGV4IGNvdWxkIGxlYWQgdG8gRVJS Q09ERV9EQVRBX0NPUlJVUFRFRCBsYXRlciwgc28gZXhpdAorCSAqIGVhcmx5LiAgV2UncmUg Y2FwYWJsZSBvZiBhc3Nlc3NpbmcgYW4gaW5kaXNyZWFkeSYmIWluZGlzdmFsaWQgaW5kZXgs CisJICogYnV0IHRoZSByZXN1bHRzIGNvdWxkIGJlIGNvbmZ1c2luZy4gIEZvciBleGFtcGxl LCB0aGUgaW5kZXgncyBzaXplCisJICogY291bGQgYmUgdG9vIGxvdyBmb3IgYSB2YWxpZCBp bmRleCBvZiB0aGUgdGFibGUuCisJICovCisJaWYgKCFyZWwtPnJkX2luZGV4LT5pbmRpc3Zh bGlkKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNUX05P VF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCSBlcnJtc2coImluZGV4IFwiJXNcIiBp cyBub3QgdmFsaWQiLAorCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsK KworCUluaXRNYXRlcmlhbGl6ZWRTUkYoZmNpbmZvLCAwKTsKKwl0dXBkZXNjID0gcnNpbmZv LT5zZXREZXNjOworCXR1cHN0b3JlID0gcnNpbmZvLT5zZXRSZXN1bHQ7CisKKwkvKiBwcmUt YWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBUSURzIHdlIG1pZ2h0 IHNlZQorCSAqIG9uIHJhbmdlX2xlbiBwYWdlcyAqLworCWJ1ZmZlcl9pbml0KCZibG9ja3Mp OworCisJLyogZmluZCB0aGUgbGVmdC1tb3N0IGxlYWYgcGFnZSAqLworCWJ1ZiA9IF9idF9n ZXRfZW5kcG9pbnQocmVsLCAwLCBmYWxzZSk7CisJYmxrbm8gPSBJbnZhbGlkQmxvY2tOdW1i ZXI7CisJbmJsb2NrcyA9IDA7CS8qIGp1c3QgYSBjb3VudGVyIG9mIGJsb2NrcyB3ZSd2ZSBz ZWVuIHNvIGZhciAqLworCisJd2hpbGUgKEJ1ZmZlcklzVmFsaWQoYnVmKSkKKwl7CisJCVBh Z2UJCXBhZ2U7CisJCUJUUGFnZU9wYXF1ZSBvcGFxdWU7CisKKwkJLyogcmVtZW1iZXIgZmly c3QgYmxvY2sgb2YgdGhlIG5ldyByYW5nZSAqLworCQlpZiAoIUJsb2NrTnVtYmVySXNWYWxp ZChibGtubykpCisJCQlibGtubyA9IEJ1ZmZlckdldEJsb2NrTnVtYmVyKGJ1Zik7CisKKwkJ Q0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKKworCQkvKiBSZWFkIGFuZCBsb2NrIGJ1ZmZlciAq LworCQlwYWdlID0gQnVmZmVyR2V0UGFnZShidWYpOworCQlvcGFxdWUgPSBCVFBhZ2VHZXRP cGFxdWUocGFnZSk7CisKKwkJLyoKKwkJICogSWdub3JlIGRlbGV0ZWQvZGVhZCBwYWdlcywg YW5kIGludGVybmFsIChub24tbGVhZikgcGFnZXMuCisJCSAqLworCQlpZiAoIVBfSVNERUxF VEVEKG9wYXF1ZSkgJiYgIVBfSUdOT1JFKG9wYXF1ZSkgJiYgUF9JU0xFQUYob3BhcXVlKSkK KwkJeworCQkJT2Zmc2V0TnVtYmVyCW9mZnNldCA9IEZpcnN0T2Zmc2V0TnVtYmVyOworCQkJ T2Zmc2V0TnVtYmVyCW1heG9mZnNldCA9IFBhZ2VHZXRNYXhPZmZzZXROdW1iZXIocGFnZSk7 CisJCQlib29sCQkJcmlnaHRtb3N0ID0gUF9SSUdIVE1PU1Qob3BhcXVlKTsKKworCQkJd2hp bGUgKG9mZnNldCA8IG1heG9mZnNldCkKKwkJCXsKKwkJCQlJdGVtSWQJCWlkID0gUGFnZUdl dEl0ZW1JZChwYWdlLCBvZmZzZXQpOworCQkJCUluZGV4VHVwbGUJaXR1cCA9IChJbmRleFR1 cGxlKSBQYWdlR2V0SXRlbShwYWdlLCBpZCk7CisJCQkJYm9vbAkJaXNwaXZvdCA9ICghcmln aHRtb3N0ICYmIG9mZnNldCA9PSBQX0hJS0VZKTsKKworCQkJCW9mZnNldCsrOworCisJCQkJ LyogaWdub3JlIHBpdm90IHR1cGxlcyAqLworCQkJCWlmIChpc3Bpdm90KQorCQkJCQljb250 aW51ZTsKKworCQkJCWlmIChCVHJlZVR1cGxlSXNQb3N0aW5nKGl0dXApKQorCQkJCXsKKwkJ CQkJZm9yIChpbnQgaSA9IDA7IGkgPCBCVHJlZVR1cGxlR2V0TlBvc3RpbmcoaXR1cCk7IGkr KykKKwkJCQkJeworCQkJCQkJSXRlbVBvaW50ZXIgdGlkID0gQlRyZWVUdXBsZUdldFBvc3Rp bmdOKGl0dXAsIGkpOworCQkJCQkJQmxvY2tOdW1iZXIJYmxvY2sgPSBJdGVtUG9pbnRlckdl dEJsb2NrTnVtYmVyKHRpZCk7CisKKwkJCQkJCWJ1ZmZlcl9hZGRfYmxvY2soJmJsb2Nrcywg YmxvY2spOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJsb2NrTnVt YmVyCWJsb2NrID0gSXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcigmaXR1cC0+dF90aWQpOwor CisJCQkJCWJ1ZmZlcl9hZGRfYmxvY2soJmJsb2NrcywgYmxvY2spOworCQkJCX0KKwkJCX0K KworCQkJLyogd2UndmUgYWRkZWQgYSBibG9jayB0byB0aGUgcmFuZ2UgKi8KKwkJCW5ibG9j a3MrKzsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoaXMgd2FzIHRoZSBsYXN0IGJsb2NrIGlu IHRoZSByYW5nZSwgb3IgaWYgdGhpcyBpcyB0aGUgbGFzdAorCQkgKiBsZWFmIHBhZ2UgaW4g Z2VuZXJhbCwgZ2VuZXJhdGUgdGhlIHR1cGxlLiBDb3VudCB0aGUgZGlzdGluY3QKKwkJICog YmxvY2tzIGFuZCBhZGQgYSB0dXBsZSBpbnRvIHRoZSByZXN1bHQgc2V0IChpZiB0aGVyZSBh cmUgYW55IFRJRHMpLgorCQkgKi8KKwkJaWYgKChuYmxvY2tzID09IHJhbmdlX2xlbikgfHwg KG9wYXF1ZS0+YnRwb19uZXh0ID09IFBfTk9ORSkpCisJCXsKKwkJCWlmIChibG9ja3Mubml0 ZW1zID4gMCkKKwkJCXsKKwkJCQlIZWFwVHVwbGUJdHVwbGU7CisJCQkJaW50CQkJbmRpc3Rp bmN0OworCQkJCWludAkJCW5ydW5zOworCisJCQkJbnJ1bnMgPSBjb3VudF9ibG9ja19ydW5z KGJsb2Nrcyk7CisKKwkJCQkvKiB0aGlzIG1vZGlmaWVzIHRoZSBhcnJheSwgc28gZG8gb25j ZSAqLworCQkJCW5kaXN0aW5jdCA9IGNvdW50X2Jsb2Nrc19kaXN0aW5jdChibG9ja3MpOwor CisJCQkJdmFsdWVzWzBdID0gSW50NjRHZXREYXR1bSgrK3NlcSk7CisJCQkJdmFsdWVzWzFd ID0gSW50NjRHZXREYXR1bShibGtubyk7CisJCQkJdmFsdWVzWzJdID0gSW50NjRHZXREYXR1 bShibG9ja3Mubml0ZW1zKTsKKwkJCQl2YWx1ZXNbM10gPSBJbnQ2NEdldERhdHVtKG5kaXN0 aW5jdCk7CisJCQkJdmFsdWVzWzRdID0gSW50NjRHZXREYXR1bShucnVucyk7CisKKwkJCQkv KiBCdWlsZCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgdHVwbGUgKi8KKwkJCQl0dXBsZSA9IGhl YXBfZm9ybV90dXBsZSh0dXBkZXNjLCB2YWx1ZXMsIG51bGxzKTsKKworCQkJCXR1cGxlc3Rv cmVfcHV0dHVwbGUodHVwc3RvcmUsIHR1cGxlKTsKKworCQkJCWJsb2Nrcy5uaXRlbXMgPSAw OworCisJCQkJLyogcmVzZXQgdGhlIGJsb2NrLCB3aWxsIGJlIHNldCBhdCB0aGUgbmV3IGxv b3AgKi8KKwkJCQlibGtubyA9IEludmFsaWRCbG9ja051bWJlcjsKKwkJCQluYmxvY2tzID0g MDsKKwkJCX0KKwkJfQorCisJCS8qIG5vIG1vcmUgbGVhZnMsIHdlJ3JlIGRvbmUgKi8KKwkJ aWYgKG9wYXF1ZS0+YnRwb19uZXh0ID09IFBfTk9ORSkKKwkJeworCQkJX2J0X3JlbGJ1Zihy ZWwsIGJ1Zik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHN0ZXAgcmlnaHQgb25lIHBhZ2Ug Ki8KKwkJYnVmID0gX2J0X3JlbGFuZGdldGJ1ZihyZWwsIGJ1Ziwgb3BhcXVlLT5idHBvX25l eHQsIEJUX1JFQUQpOworCX0KKworCXJlbGF0aW9uX2Nsb3NlKHJlbCwgQWNjZXNzU2hhcmVM b2NrKTsKKworCVBHX1JFVFVSTl9OVUxMKCk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3VudF9y dW5fbGVuZ3RocyhCbG9ja0J1ZmZlciBibG9ja3MsIGludCAqbGVuZ3RocykKK3sKKwlpbnQJ CQlsZW4gPSAxOworCUJsb2NrTnVtYmVyCWN1cnIgPSBibG9ja3MuaXRlbXNbMF07CisKKwlm b3IgKGludCBpID0gMDsgaSA8IGJsb2Nrcy5uaXRlbXM7IGkrKykKKwl7CisJCWlmIChibG9j a3MuaXRlbXNbaV0gIT0gY3VycikKKwkJeworCQkJbGVuZ3Roc1tsZW5dKys7CisJCQlsZW4g PSAxOworCQkJY3VyciA9IGJsb2Nrcy5pdGVtc1tpXTsKKwkJCWNvbnRpbnVlOworCQl9CisK KwkJbGVuKys7CisJfQorCisJbGVuZ3Roc1tsZW5dKys7Cit9CisKK3N0YXRpYyBEYXR1bQor cGdzdGF0aW5kZXhfcnVuc19pbXBsKFJlbGF0aW9uIHJlbCwgaW50NjQgcmFuZ2VfbGVuLCBG dW5jdGlvbkNhbGxJbmZvIGZjaW5mbykKK3sKKwlSZXR1cm5TZXRJbmZvICpyc2luZm8gPSAo UmV0dXJuU2V0SW5mbyAqKSBmY2luZm8tPnJlc3VsdGluZm87CisKKwlpbnQJCQkqcnVuX2xl bmd0aHMgPSBOVUxMOworCVR1cGxlRGVzYwl0dXBkZXNjOworCVR1cGxlc3RvcmVzdGF0ZSAq dHVwc3RvcmU7CisKKwlEYXR1bQkJdmFsdWVzWzRdOworCWJvb2wJCW51bGxzWzRdOworCisJ QmxvY2tCdWZmZXIJYmxvY2tzOwkvKiBidWZmZXIgd2l0aCBibG9ja3MgZnJvbSB0aGUgcmFu Z2UgKi8KKwlCbG9ja051bWJlcglibGtubzsJLyogYmxvY2sgbnVtYmVyIG9mIHRoZSAoZmly c3QpIGxlYWYgaW4gdGhlIHJhbmdlICovCisJaW50NjQJCW5ibG9ja3M7CisJQnVmZmVyCQli dWY7CisJaW50NjQJCXNlcSA9IDA7CisKKwkvKiBubyBOVUxMcyAqLworCW1lbXNldChudWxs cywgMCwgc2l6ZW9mKG51bGxzKSk7CisKKwlpZiAocmFuZ2VfbGVuIDwgMSkKKwkJZXJlcG9y dChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVF KSwKKwkJCQkgZXJybXNnKCJyYW5nZSBsZW5ndGggaGFzIHRvIGJlIGF0IGxlYXN0IDEiKSkp OworCisJaWYgKCFJU19JTkRFWChyZWwpIHx8ICFJU19CVFJFRShyZWwpKQorCQllcmVwb3J0 KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfV1JPTkdfT0JKRUNUX1RZUEUpLAorCQkJ CSBlcnJtc2coInJlbGF0aW9uIFwiJXNcIiBpcyBub3QgYSBidHJlZSBpbmRleCIsCisJCQkJ CQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKSkpOworCisJLyoKKwkgKiBSZWplY3Qg YXR0ZW1wdHMgdG8gcmVhZCBub24tbG9jYWwgdGVtcG9yYXJ5IHJlbGF0aW9uczsgd2Ugd291 bGQgYmUKKwkgKiBsaWtlbHkgdG8gZ2V0IHdyb25nIGRhdGEgc2luY2Ugd2UgaGF2ZSBubyB2 aXNpYmlsaXR5IGludG8gdGhlIG93bmluZworCSAqIHNlc3Npb24ncyBsb2NhbCBidWZmZXJz LgorCSAqLworCWlmIChSRUxBVElPTl9JU19PVEhFUl9URU1QKHJlbCkpCisJCWVyZXBvcnQo RVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAor CQkJCSBlcnJtc2coImNhbm5vdCBhY2Nlc3MgdGVtcG9yYXJ5IHRhYmxlcyBvZiBvdGhlciBz ZXNzaW9ucyIpKSk7CisKKwkvKgorCSAqIEEgIWluZGlzcmVhZHkgaW5kZXggY291bGQgbGVh ZCB0byBFUlJDT0RFX0RBVEFfQ09SUlVQVEVEIGxhdGVyLCBzbyBleGl0CisJICogZWFybHku ICBXZSdyZSBjYXBhYmxlIG9mIGFzc2Vzc2luZyBhbiBpbmRpc3JlYWR5JiYhaW5kaXN2YWxp ZCBpbmRleCwKKwkgKiBidXQgdGhlIHJlc3VsdHMgY291bGQgYmUgY29uZnVzaW5nLiAgRm9y IGV4YW1wbGUsIHRoZSBpbmRleCdzIHNpemUKKwkgKiBjb3VsZCBiZSB0b28gbG93IGZvciBh IHZhbGlkIGluZGV4IG9mIHRoZSB0YWJsZS4KKwkgKi8KKwlpZiAoIXJlbC0+cmRfaW5kZXgt PmluZGlzdmFsaWQpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9P QkpFQ1RfTk9UX0lOX1BSRVJFUVVJU0lURV9TVEFURSksCisJCQkJIGVycm1zZygiaW5kZXgg XCIlc1wiIGlzIG5vdCB2YWxpZCIsCisJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShy ZWwpKSkpOworCisJSW5pdE1hdGVyaWFsaXplZFNSRihmY2luZm8sIDApOworCXR1cGRlc2Mg PSByc2luZm8tPnNldERlc2M7CisJdHVwc3RvcmUgPSByc2luZm8tPnNldFJlc3VsdDsKKwor CS8qIHByZS1hbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIFRJRHMg d2UgbWlnaHQgc2VlCisJICogb24gcmFuZ2VfbGVuIHBhZ2VzICovCisJYnVmZmVyX2luaXQo JmJsb2Nrcyk7CisKKwkvKiBsZW5ndGhzIG9mIHJ1bnMgKHRoZSByYW5nZSBjb3VsZCBiZSBv bmUgbG9uZyBydW4pICovCisJcnVuX2xlbmd0aHMgPSBwYWxsb2NfYXJyYXkoaW50LCAocmFu Z2VfbGVuICogTWF4VElEc1BlckJUcmVlUGFnZSArIDEpKTsKKworCS8qIGZpbmQgdGhlIGxl ZnQtbW9zdCBsZWFmIHBhZ2UgKi8KKwlidWYgPSBfYnRfZ2V0X2VuZHBvaW50KHJlbCwgMCwg ZmFsc2UpOworCWJsa25vID0gSW52YWxpZEJsb2NrTnVtYmVyOworCW5ibG9ja3MgPSAwOwkv KiBqdXN0IGEgY291bnRlciBvZiBibG9ja3Mgd2UndmUgc2VlbiBzbyBmYXIgKi8KKworCXdo aWxlIChCdWZmZXJJc1ZhbGlkKGJ1ZikpCisJeworCQlQYWdlCQlwYWdlOworCQlCVFBhZ2VP cGFxdWUgb3BhcXVlOworCisJCWlmICghQmxvY2tOdW1iZXJJc1ZhbGlkKGJsa25vKSkKKwkJ CWJsa25vID0gQnVmZmVyR2V0QmxvY2tOdW1iZXIoYnVmKTsKKworCQlDSEVDS19GT1JfSU5U RVJSVVBUUygpOworCisJCXBhZ2UgPSBCdWZmZXJHZXRQYWdlKGJ1Zik7CisJCW9wYXF1ZSA9 IEJUUGFnZUdldE9wYXF1ZShwYWdlKTsKKworCQkvKgorCQkgKiBJZ25vcmUgZGVsZXRlZC9k ZWFkIHBhZ2VzLCBhbmQgaW50ZXJuYWwgKG5vbi1sZWFmKSBwYWdlcy4KKwkJICovCisJCWlm ICghUF9JU0RFTEVURUQob3BhcXVlKSAmJiAhUF9JR05PUkUob3BhcXVlKSAmJiBQX0lTTEVB RihvcGFxdWUpKQorCQl7CisJCQlPZmZzZXROdW1iZXIJb2Zmc2V0ID0gRmlyc3RPZmZzZXRO dW1iZXI7CisJCQlPZmZzZXROdW1iZXIJbWF4b2Zmc2V0ID0gUGFnZUdldE1heE9mZnNldE51 bWJlcihwYWdlKTsKKwkJCWJvb2wJCQlyaWdodG1vc3QgPSBQX1JJR0hUTU9TVChvcGFxdWUp OworCisJCQl3aGlsZSAob2Zmc2V0IDwgbWF4b2Zmc2V0KQorCQkJeworCQkJCUl0ZW1JZAkJ aWQgPSBQYWdlR2V0SXRlbUlkKHBhZ2UsIG9mZnNldCk7CisJCQkJSW5kZXhUdXBsZQlpdHVw ID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVtKHBhZ2UsIGlkKTsKKwkJCQlib29sCQlpc3Bp dm90ID0gKCFyaWdodG1vc3QgJiYgb2Zmc2V0ID09IFBfSElLRVkpOworCisJCQkJb2Zmc2V0 Kys7CisKKwkJCQkvKiBpZ25vcmUgcGl2b3QgdHVwbGVzICovCisJCQkJaWYgKGlzcGl2b3Qp CisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKEJUcmVlVHVwbGVJc1Bvc3RpbmcoaXR1cCkp CisJCQkJeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IEJUcmVlVHVwbGVHZXROUG9zdGlu ZyhpdHVwKTsgaSsrKQorCQkJCQl7CisJCQkJCQlJdGVtUG9pbnRlciB0aWQgPSBCVHJlZVR1 cGxlR2V0UG9zdGluZ04oaXR1cCwgaSk7CisJCQkJCQlCbG9ja051bWJlcglibG9jayA9IEl0 ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIodGlkKTsKKworCQkJCQkJYnVmZmVyX2FkZF9ibG9j aygmYmxvY2tzLCBibG9jayk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJ CQkJQmxvY2tOdW1iZXIJYmxvY2sgPSBJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKCZpdHVw LT50X3RpZCk7CisKKwkJCQkJYnVmZmVyX2FkZF9ibG9jaygmYmxvY2tzLCBibG9jayk7CisJ CQkJfQorCQkJfQorCisJCQkvKiB3ZSd2ZSBhZGRlZCBibG9jayB0byB0aGUgcmFuZ2UgKi8K KwkJCW5ibG9ja3MrKzsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoaXMgd2FzIHRoZSBsYXN0 IGJsb2NrIGluIHRoZSByYW5nZSwgb3IgaWYgdGhpcyBpcyB0aGUgbGFzdAorCQkgKiBsZWFm IHBhZ2UgaW4gZ2VuZXJhbCwgZ2VuZXJhdGUgdGhlIHR1cGxlLiBDb3VudCB0aGUgZGlzdGlu Y3QKKwkJICogYmxvY2tzIGFuZCBhZGQgYSB0dXBsZSBpbnRvIHRoZSByZXN1bHQgc2V0IChp ZiB0aGVyZSBhcmUgYW55IFRJRHMpLgorCQkgKi8KKwkJaWYgKChuYmxvY2tzID09IHJhbmdl X2xlbikgfHwgKG9wYXF1ZS0+YnRwb19uZXh0ID09IFBfTk9ORSkpCisKKwkJeworCQkJaWYg KGJsb2Nrcy5uaXRlbXMgPiAwKQorCQkJeworCQkJCUhlYXBUdXBsZQl0dXBsZTsKKworCQkJ CW1lbXNldChydW5fbGVuZ3RocywgMCwgc2l6ZW9mKGludCkgKiAocmFuZ2VfbGVuICogTWF4 VElEc1BlckJUcmVlUGFnZSArIDEpKTsKKwkJCQljb3VudF9ydW5fbGVuZ3RocyhibG9ja3Ms IHJ1bl9sZW5ndGhzKTsKKworCQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IChyYW5nZV9sZW4g KiBNYXhUSURzUGVyQlRyZWVQYWdlKTsgaSsrKQorCQkJCXsKKwkJCQkJaWYgKHJ1bl9sZW5n dGhzW2ldID4gMCkKKwkJCQkJeworCQkJCQkJdmFsdWVzWzBdID0gSW50NjRHZXREYXR1bSgr K3NlcSk7CisJCQkJCQl2YWx1ZXNbMV0gPSBJbnQ2NEdldERhdHVtKGJsa25vKTsKKwkJCQkJ CXZhbHVlc1syXSA9IEludDMyR2V0RGF0dW0oaSk7CisJCQkJCQl2YWx1ZXNbM10gPSBJbnQz MkdldERhdHVtKHJ1bl9sZW5ndGhzW2ldKTsKKworCQkJCQkJLyogQnVpbGQgYW5kIHJldHVy biB0aGUgcmVzdWx0IHR1cGxlICovCisJCQkJCQl0dXBsZSA9IGhlYXBfZm9ybV90dXBsZSh0 dXBkZXNjLCB2YWx1ZXMsIG51bGxzKTsKKworCQkJCQkJdHVwbGVzdG9yZV9wdXR0dXBsZSh0 dXBzdG9yZSwgdHVwbGUpOworCQkJCQl9CisJCQkJfQorCisJCQkJYmxvY2tzLm5pdGVtcyA9 IDA7CisKKwkJCQkvKiByZXNldCB0aGUgYmxvY2ssIHdpbGwgYmUgc2V0IGF0IHRoZSBuZXcg bG9vcCAqLworCQkJCWJsa25vID0gSW52YWxpZEJsb2NrTnVtYmVyOworCQkJCW5ibG9ja3Mg PSAwOworCQkJfQorCQl9CisKKwkJaWYgKG9wYXF1ZS0+YnRwb19uZXh0ID09IFBfTk9ORSkK KwkJeworCQkJX2J0X3JlbGJ1ZihyZWwsIGJ1Zik7CisJCQlicmVhazsKKwkJfQorCisJCS8q IHN0ZXAgcmlnaHQgb25lIHBhZ2UgKi8KKwkJYnVmID0gX2J0X3JlbGFuZGdldGJ1ZihyZWws IGJ1Ziwgb3BhcXVlLT5idHBvX25leHQsIEJUX1JFQUQpOworCX0KKworCXJlbGF0aW9uX2Ns b3NlKHJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCVBHX1JFVFVSTl9OVUxMKCk7Cit9CmRp ZmYgLS1naXQgYS9jb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdHR1cGxlLS0xLjUtLTEuNi5z cWwgYi9jb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdHR1cGxlLS0xLjUtLTEuNi5zcWwKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjM4NDFjNzE2MDZhCi0tLSAv ZGV2L251bGwKKysrIGIvY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXR0dXBsZS0tMS41LS0x LjYuc3FsCkBAIC0wLDAgKzEsMzEgQEAKKy8qIGNvbnRyaWIvcGdzdGF0dHVwbGUvcGdzdGF0 dHVwbGUtLTEuNS0tMS42LnNxbCAqLworCistLSBjb21wbGFpbiBpZiBzY3JpcHQgaXMgc291 cmNlZCBpbiBwc3FsLCByYXRoZXIgdGhhbiB2aWEgQUxURVIgRVhURU5TSU9OCitcZWNobyBV c2UgIkFMVEVSIEVYVEVOU0lPTiBwZ3N0YXR0dXBsZSBVUERBVEUgVE8gJzEuNiciIHRvIGxv YWQgdGhpcyBmaWxlLiBccXVpdAorCitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBwZ3N0 YXRpbmRleF9uaGVhcChJTiByZWxuYW1lIHRleHQsCisgICAgSU4gYmxvY2tzIEJJR0lOVCwJ CQktLSBsZW5ndGggb2YgcmFuZ2VzIHRvIGFuYWx5emUKKyAgICBPVVQgc2VxIEJJR0lOVCwJ CQkJLS0gc2VxdWVudGlhbCBJRCBvZiB0dXBsZS9yYW5nZQorICAgIE9VVCBibG9jayBCSUdJ TlQsCQkJLS0gZmlyc3QgYmxvY2sgb2YgYSByYW5nZQorICAgIE9VVCBudW1faXRlbXMgQklH SU5ULAkJLS0gbnVtYmVyIG9mIGhlYXAgVElEcworICAgIE9VVCBudW1fYmxvY2tzIEJJR0lO VCwJCS0tIG51bWJlciBvZiBkaXN0aW5jdCBibG9ja3MKKyAgICBPVVQgbnVtX3J1bnMgQklH SU5UKQkJLS0gbnVtYmVyIG9mIGNvbnRpbnVvdXMgcnVucworUkVUVVJOUyBTRVRPRiByZWNv cmQKK0FTICdNT0RVTEVfUEFUSE5BTUUnLCAncGdzdGF0aW5kZXhfbmhlYXBfdjFfNicKK0xB TkdVQUdFIEMgU1RSSUNUIFBBUkFMTEVMIFNBRkU7CisKK1JFVk9LRSBFWEVDVVRFIE9OIEZV TkNUSU9OIHBnc3RhdGluZGV4X25oZWFwKHRleHQsIGJpZ2ludCkgRlJPTSBQVUJMSUM7CitH UkFOVCBFWEVDVVRFIE9OIEZVTkNUSU9OIHBnc3RhdGluZGV4X25oZWFwKHRleHQsIGJpZ2lu dCkgVE8gcGdfc3RhdF9zY2FuX3RhYmxlczsKKworQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJ T04gcGdzdGF0aW5kZXhfcnVucyhJTiByZWxuYW1lIHRleHQsCisgICAgSU4gYmxvY2tzIEJJ R0lOVCwJCQktLSBsZW5ndGggb2YgcmFuZ2VzIHRvIGFuYWx5emUKKyAgICBPVVQgc2VxIEJJ R0lOVCwJCQkJLS0gc2VxdWVudGlhbCBJRCBvZiB0dXBsZS9yYW5nZQorICAgIE9VVCBibG9j ayBCSUdJTlQsCQkJLS0gZmlyc3QgYmxvY2sgb2YgYSByYW5nZQorICAgIE9VVCBydW5fbGVu Z3RoIElOVCwJCQktLSBudW1iZXIgb2YgbGVhZiBwYWdlcworICAgIE9VVCBydW5fY291bnQg SU5UKQkJLS0gbnVtYmVyIG9mIGhlYXAgVElEcworUkVUVVJOUyBTRVRPRiByZWNvcmQKK0FT ICdNT0RVTEVfUEFUSE5BTUUnLCAncGdzdGF0aW5kZXhfcnVuc192MV82JworTEFOR1VBR0Ug QyBTVFJJQ1QgUEFSQUxMRUwgU0FGRTsKKworUkVWT0tFIEVYRUNVVEUgT04gRlVOQ1RJT04g cGdzdGF0aW5kZXhfcnVucyh0ZXh0LCBiaWdpbnQpIEZST00gUFVCTElDOworR1JBTlQgRVhF Q1VURSBPTiBGVU5DVElPTiBwZ3N0YXRpbmRleF9ydW5zKHRleHQsIGJpZ2ludCkgVE8gcGdf c3RhdF9zY2FuX3RhYmxlczsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdzdGF0dHVwbGUvcGdz dGF0dHVwbGUuY29udHJvbCBiL2NvbnRyaWIvcGdzdGF0dHVwbGUvcGdzdGF0dHVwbGUuY29u dHJvbAppbmRleCA2YWY0MDc1N2IyNy4uODBkMDY5NThlOTAgMTAwNjQ0Ci0tLSBhL2NvbnRy aWIvcGdzdGF0dHVwbGUvcGdzdGF0dHVwbGUuY29udHJvbAorKysgYi9jb250cmliL3Bnc3Rh dHR1cGxlL3Bnc3RhdHR1cGxlLmNvbnRyb2wKQEAgLTEsNSArMSw1IEBACiAjIHBnc3RhdHR1 cGxlIGV4dGVuc2lvbgogY29tbWVudCA9ICdzaG93IHR1cGxlLWxldmVsIHN0YXRpc3RpY3Mn Ci1kZWZhdWx0X3ZlcnNpb24gPSAnMS41JworZGVmYXVsdF92ZXJzaW9uID0gJzEuNicKIG1v ZHVsZV9wYXRobmFtZSA9ICckbGliZGlyL3Bnc3RhdHR1cGxlJwogcmVsb2NhdGFibGUgPSB0 cnVlCi0tIAoyLjUwLjEKCg== --------------L88IUdLR2ztfLgRvq2LgWyMh--