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 1vGvRW-0088w6-Lp for pgsql-hackers@arkaria.postgresql.org; Thu, 06 Nov 2025 08:34:06 +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 1vGvRV-006PUZ-Jv for pgsql-hackers@arkaria.postgresql.org; Thu, 06 Nov 2025 08:34:04 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vGvRU-006PUP-PI for pgsql-hackers@lists.postgresql.org; Thu, 06 Nov 2025 08:34:04 +0000 Received: from fout-b5-smtp.messagingengine.com ([202.12.124.148]) by makus.postgresql.org with smtp (Exim 4.96) (envelope-from ) id 1vGvRR-005gkh-1Y for pgsql-hackers@postgresql.org; Thu, 06 Nov 2025 08:34:02 +0000 Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailfout.stl.internal (Postfix) with ESMTP id 8297E1D000C0; Thu, 6 Nov 2025 03:34:00 -0500 (EST) Received: from phl-imap-16 ([10.202.2.88]) by phl-compute-05.internal (MEProxy); Thu, 06 Nov 2025 03:34:00 -0500 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=fm3; t=1762418040; x=1762504440; bh=aMfyK1p5Uf N9wZpgzggkQCn8a0uAIVSSxoRJNWYCbf0=; b=mZPR4bJDmyU7x52PKBqnij7Epc gpDHexTFqEoNET7TM1M5J4FHPIlqONyohd+Yi9P50TF2GrR/eChJqAgl+elyEPAp hzLObuZi02rRl/dF8Zshqso3ah9a+H3sevkLIV+Ynfs/sq5f06jFDIOnoItVPMY1 Vfjeg+MPxG42yuPl4PF6xH8ZtyHP4Z9XX6ceY6W6Gfc+hZy8R5Qj/Q1+2LCuFJ2h u23W53COJklkLVS/wUI1+c5lLLf50aL448pdUFdREn7kHMzmbbsM057RwOs8XdO1 6xjOVeySb3mh8UCJA0Mew4G7o6eTRYgTnITVycj1F1ftWgw0r0Q21hgv0jEA== 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=fm3; t= 1762418040; x=1762504440; bh=aMfyK1p5UfN9wZpgzggkQCn8a0uAIVSSxoR JNWYCbf0=; b=I0plh6LnK/SjRTwKj1SdFMr7heYGrq8qVZtGI8UAaMx0NDChkXV MmwDYNAvY0OtE9d3MHW7lbztwQKiS/ERgf5npM+twYVSCiILpH4pNa/TqMRTRgcH f/ys5XeEEyfQQOk9yisX6AxRjlPy+Mbhi2boufQWH3bORDR7f+3kDFpIeWhvKbV5 ZHm/vqJjfrbrWlm8T/r7fpyjhkjWx896y19IzI8yR1ieeqpOJD2mFHAjmq2oPxBQ qFpAX5/zjAb7AQ5opO8myLJaTCeK2Y1jfYDx0x5Zx4eD5vbd5zpNGxlqUDch2UIF kS96/WIsgDoFa1M3EEgDl+JDzkchCCx/hRg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggddukeeifeduucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucenucfjughrpefoggffhffvvefkjghfufgtsehmtderre ertdejnecuhfhrohhmpedflfhovghlucflrggtohgsshhonhdfuceojhhovghlsegtohhm phhilhgvrhdrohhrgheqnecuggftrfgrthhtvghrnhepleeiueefveeljeelkeeguedvtd fggeeftdeguedtjeejkedvvedtvdeuteekvdelnecuvehluhhsthgvrhfuihiivgeptden ucfrrghrrghmpehmrghilhhfrhhomhepjhhovghlsegtohhmphhilhgvrhdrohhrghdpnh gspghrtghpthhtohepfedpmhhouggvpehsmhhtphhouhhtpdhrtghpthhtoheprghrshgv nhhihidrmhhukhhhihhnrdguvghvsehgmhgrihhlrdgtohhmpdhrtghpthhtoheplhhird gvvhgrnhdrtghhrghosehgmhgrihhlrdgtohhmpdhrtghpthhtohepphhgshhqlhdqhhgr tghkvghrshesphhoshhtghhrvghsqhhlrdhorhhg X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id E54DE2CC008C; Thu, 6 Nov 2025 03:33:59 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: AE1r89ybsZ1g Date: Thu, 06 Nov 2025 09:33:18 +0100 From: "Joel Jacobson" To: "Chao Li" , "Arseniy Mukhin" Cc: pgsql-hackers Message-Id: In-Reply-To: <4605CAD6-69D5-4082-B96C-91FC0DE5399D@gmail.com> 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> <85828f29-e72e-4400-94f3-9a69bc8dc239@app.fastmail.com> <2495353.1759860890@sss.pgh.pa.us> <8aeae418-92a6-4bbd-9c06-9574c79e59f7@app.fastmail.com> <2531672.1759868124@sss.pgh.pa.us> <474efa78-337c-41cd-a73a-f845a0115109@app.fastmail.com> <2749343.1759949176@sss.pgh.pa.us> <8bfca2be-1ec0-4e15-aafb-0b7b661fe936@app.fastmail.com> <9eba307f-f2fb-48f0-9507-2e197f39ef9e@app.fastmail.com> <8c71183a-0d28-4bcf-a806-78446ff95404@app.fastmail.com> <1009807.1760476747@sss.pgh.pa.us> <1F7227F5-C33D-4E2C-8511-33F1468590D0@gmail.com> <0a5a20d3-4621-46b3-b2ab-903f63a20dea@app.fastmail.com> <6F913129-ABEF-4004-AAF3-F22FC34!29AE8@gmail.com> <1547585.1760645808@sss.pgh.pa.us> <14865EB6-0BF4-462B-9072-10BDAC10C052@gmail.com> <0BCA1C2D-B92C-459E-B1A6-6D06BA4C62CF@gmail.com> <55d24cbb-e9ef-491f-a99b-b3dbd7cecdf9@app.fastmail.com> <38574cad-e90d-47b7-a015-753bb6bbc360@app.fastmail.com> <66631FB7-5BEA-4ED5-A694-9AD8B9CCFEE8@gmail.com> <4b7b49a5-5e1a-44a8-93e0-60457d15cb1d@app.fastmail.com> <82DEA2B6-6FC5-4A79-BDE3-1FD72F104A6E@gmail.com> <38de1036-d8cf-420c-b845-edb5a946b191@app.fastmail.com> <87E40BF8-8877-4DBD-9040-99AF8A4E6358@gmail.com> <7556f0d4-03fd-451a-bd34-5f62b424319a@app.fastmail.com> <290910DE-9A03-4AE6-B348-073D5DA96ACC@gmail.com> <4B243750-12BE-4C16-A769-A803268F40E3@gmail.com> <4605CAD6-69D5-4082-B96C-91FC0DE5399D@gmail.com> Subject: Re: Optimize LISTEN/NOTIFY Content-Type: multipart/mixed; boundary=66fec88f66d248cf9926460e5094cf46 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --66fec88f66d248cf9926460e5094cf46 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On Thu, Nov 6, 2025, at 00:21, Chao Li wrote: > That=E2=80=99s what we don=E2=80=99t know. We now lack a performance t= est for=20 > evaluating how =E2=80=9Cdirect advancement=E2=80=9D efficiently helps = if it only=20 > handles sleeping listeners. So what I was suggesting is that we should=20 > first create some tests, maybe also add a few more statistics, so that=20 > we can evaluate different solutions. If a simple implementation that=20 > only handles sleeping listeners would have performed good enough, of=20 > course we can take it; otherwise we may need to either pursue a better=20 > solution. Just for the sake of evaluating this patch, I've added instrumentation of async.c that increments counters for the different branches in asyncQueueReadAllNotifications and SignalBackends. (I'm just using atomics without any locking, but should be fine since this is just statistics.) pg_get_async_wakeup_stats-patch.txt adds the SQL-callable catalog functions pg_reset_async_wakeup_stats() and=20 pg_get_async_wakeup_stats(), which should not be included in the patch, they are just for evaluating. It can be applied on top of the v23 patch. Below is just an example of how to compile and an arbitrary mix of command line options. I've tired a lot of combinations, and we seem to be holding up fine in all cases I've tried. async-notify-test-5.c will detect if the pg_*_async_wakeup_stats() funct= ions exists, and only show the extra histograms if so. % gcc -Wall -Wextra -O2 -pthread -I/Users/joel/pg19/include/postgresql/s= erver -I/Users/joel/pg19/include -o async-notify-test-5 async-notify-tes= t-5.c -L/Users/joel/pg19/lib -lpq -pthread -lm % ./async-notify-test-5 --listeners 10 --notifiers 10 --channels 10 --sl= eep 0.1 --sleep-exp 2.0 --batch 10 10 s: 38100 sent (3690/s), 381000 received (36900/s) Notification Latency Distribution: 0.00-0.01ms 0 (0.0%) avg: 0.000ms 0.01-0.10ms # 23 (0.0%) avg: 0.092ms 0.10-1.00ms ####### 298002 (78.2%) avg: 0.563ms 1.00-10.00ms ## 82975 (21.8%) avg: 1.506ms 10.00-100.00ms 0 (0.0%) avg: 0.000ms >100.00ms 0 (0.0%) avg: 0.000ms asyncQueueReadAllNotifications Statistics: necessary_wakeups ######## 35469 (88.2%) unnecessary_wakeups # 4762 (11.8%) SignalBackends Statistics: signaled_needed # 34983 (9.5%) avoided_wakeups ######## 325874 (88.9%) already_advancing # 3 (0.0%) signaled_uncertain # 5347 (1.5%) already_ahead # 375 (0.1%) Thoughts on how to interpret results: - Is the notification latency distribution good enough, for the given workload? Naturally, if the workload is too high, we cannot expect to ever achieve sub millisecond latency anyway, so it's a judgement. - Even if the "unnecessary_wakeups" is high relative to "necessary_wakeups", it's not necessarily a problem, if the latency distribution still is good enough. We should also think about the ratio between "unnecessary_wakeups" and "avoided_wakeups", since even if "unnecessary_wakeups" is high in absolute numbers, if the "avoided_wakeups" is magnitudes larger, that means the cost of the context switching has been dramatically reduced already. I think there is always a risk when optimizing to forget what problem one was trying to solve initially, usually a bottleneck. When the bottleneck is gone and is somewhere else instead, then the efforts should IMO usually be spent elsewhere, especially if more optimizations would need a insignificant increase of code complexity. - It's the "signaled_uncertain" that primarily contribute to "unnecessary_wakeups". /Joel --66fec88f66d248cf9926460e5094cf46 Content-Disposition: attachment; filename="async-notify-test-5.c" Content-Type: application/octet-stream; name="async-notify-test-5.c" Content-Transfer-Encoding: base64 LyoKICogUGxhdGZvcm0gZGV0ZWN0aW9uIGZvciBJL08gbXVsdGlwbGV4aW5nLgogKgogKiBU byBtYW51YWxseSBvdmVycmlkZSwgYWRkIG9uZSBvZiB0aGVzZSBhdCB0aGUgdmVyeSB0b3Ag b2YgdGhpcyBmaWxlOgogKiAgICNkZWZpbmUgVVNFX0tRVUVVRSAgICAocmVxdWlyZXMga3F1 ZXVlIHN1cHBvcnQ6IG1hY09TLCBGcmVlQlNELCBldGMuKQogKiAgICNkZWZpbmUgVVNFX1BQ T0xMICAgICAocmVxdWlyZXMgcHBvbGwgc3VwcG9ydDogTGludXgsIGV0Yy4pCiAqCiAqIE5v dGU6IEVuc3VyZSB0aGUgY2hvc2VuIG1ldGhvZCBpcyBhdmFpbGFibGUgb24geW91ciBwbGF0 Zm9ybSwgb3IgeW91J2xsCiAqIGdldCBjb21waWxhdGlvbiBlcnJvcnMuCiAqLwojaWYgIWRl ZmluZWQoVVNFX0tRVUVVRSkgJiYgIWRlZmluZWQoVVNFX1BQT0xMKQojIGlmIGRlZmluZWQo X19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJT RF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiMgIGRlZmluZSBVU0VfS1FVRVVFCiMgZWxz ZQojICBkZWZpbmUgVVNFX1BQT0xMCiMgZW5kaWYKI2VuZGlmCgojaW5jbHVkZSA8c3RkaW8u aD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxl cnJuby5oPgojaWZkZWYgVVNFX0tRVUVVRQojaW5jbHVkZSA8c3lzL2V2ZW50Lmg+CiNlbmRp ZgojaWZkZWYgVVNFX1BQT0xMCiNpbmNsdWRlIDxwb2xsLmg+CiNlbmRpZgojaW5jbHVkZSA8 c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8dGltZS5oPgoj aW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPGdldG9w dC5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8bWF0aC5oPgoKI2luY2x1ZGUg ImxpYnBxLWZlLmgiCgojZGVmaW5lIFBHX1RJTUVfR0VUX0RPVUJMRSh0KSAoMC4wMDAwMDEg KiAodCkpCiNkZWZpbmUgQ09OTkVDVElPTl9TVFJJTkcgInBvc3RncmVzcWw6Ly8vcG9zdGdy ZXMiCiNkZWZpbmUgTUFYX05PVElGSUVSUyAyNTYgIC8qIE1heGltdW0gbm90aWZpZXJzIHBl ciBjaGFubmVsIGZvciBzZXF1ZW5jZSB0cmFja2luZyAqLwoKLyogTGF0ZW5jeSBoaXN0b2dy YW0gYnVja2V0cyAqLwojZGVmaW5lIE5VTV9CVUNLRVRTIDYKc3RhdGljIHVpbnQ2NF90IGJ1 Y2tldF9jb3VudHNbTlVNX0JVQ0tFVFNdOwpzdGF0aWMgdWludDY0X3QgYnVja2V0X3RvdGFs c1tOVU1fQlVDS0VUU107ICAvKiBUb3RhbCBsYXRlbmN5IGluIG1pY3Jvc2Vjb25kcyAqLwpz dGF0aWMgcHRocmVhZF9tdXRleF90IGhpc3RvZ3JhbV9tdXRleCA9IFBUSFJFQURfTVVURVhf SU5JVElBTElaRVI7CgpzdGF0aWMgdWludDMyX3QgbnVtX25vdGlmaWVzX3NlbnQ7CnN0YXRp YyB1aW50MzJfdCBudW1fbm90aWZpZXNfcmVjZWl2ZWQ7CnN0YXRpYyB2b2xhdGlsZSBpbnQg c3RhcnRfbm90aWZ5aW5nID0gMDsgIC8qIFNpZ25hbCBmb3Igbm90aWZpZXJzIHRvIHN0YXJ0 ICovCgovKiBTeW5jaHJvbml6YXRpb24gZm9yIGxpc3RlbmVyIExJU1RFTiBzZXR1cCAqLwpz dGF0aWMgaW50IGxpc3RlbmVyc19yZWFkeSA9IDA7CnN0YXRpYyBwdGhyZWFkX211dGV4X3Qg c3RhcnR1cF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CnN0YXRpYyBwdGhy ZWFkX2NvbmRfdCBzdGFydHVwX2NvbmQgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7Cgov KiAtLWV4dHJhLWNoYW5uZWxzIGFyZ3VtZW50ICovCnN0YXRpYyBpbnQJCQludW1fZXh0cmFf Y2hhbm5lbHMgPSAwOwoKLyogLS1zbGVlcCBhcmd1bWVudCAqLwpzdGF0aWMgZG91YmxlCQlt YXhfc2xlZXBfc2Vjb25kcyA9IDAuMDsKCi8qIC0tc2xlZXAtZXhwIGFyZ3VtZW50ICovCnN0 YXRpYyBkb3VibGUJCXNsZWVwX2V4cG9uZW50aWFsX2ZhY3RvciA9IDEuMDsKCi8qIC0tYmF0 Y2ggYXJndW1lbnQgKi8Kc3RhdGljIGludAkJCWJhdGNoX3NpemUgPSAxOwoKLyogcGdfZ2V0 X2FzeW5jX3dha2V1cF9zdGF0cyBhdmFpbGFiaWxpdHkgYW5kIGRhdGEgKi8Kc3RhdGljIGlu dCBoYXNfYXN5bmNfd2FrZXVwX3N0YXRzID0gMDsgIC8qIERldGVjdGVkIGZ1bmN0aW9uIGF2 YWlsYWJpbGl0eSAqLwpzdGF0aWMgdWludDY0X3QgYXN5bmNfd2FrZXVwX3N0YXRzWzddID0g ezB9OyAgLyogTGF0ZXN0IHN0YXRzIHNuYXBzaG90ICovCnN0YXRpYyBwdGhyZWFkX211dGV4 X3Qgd2FrZXVwX3N0YXRzX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKCi8q IFRocmVhZCBhcmd1bWVudHMgc3RydWN0dXJlICovCnN0cnVjdCB0aHJlYWRfYXJncyB7Cglp bnQgY2hhbm5lbF9pZDsKCWludCBub3RpZmllcl9pZDsgIC8qIElEIG9mIG5vdGlmaWVyIHdp dGhpbiBjaGFubmVsICgwIHRvIG51bV9ub3RpZnlfdGhyZWFkcy0xKSAqLwoJaW50IG51bV9u b3RpZmllcnM7ICAvKiBUb3RhbCBudW1iZXIgb2Ygbm90aWZpZXJzIHBlciBjaGFubmVsICov CglpbnQgdG90YWxfbGlzdGVuZXJzOyAgLyogVG90YWwgbnVtYmVyIG9mIGxpc3RlbmVyIHRo cmVhZHMgKGFsbCBjaGFubmVscykgKi8KCXVpbnQ2NF90ICpzZXFfY291bnRlcjsgIC8qIFBv aW50ZXIgdG8gdGhpcyBub3RpZmllcidzIHNlcXVlbmNlIGNvdW50ZXIgKi8KfTsKCnR5cGVk ZWYgaW50NjRfdCBwZ190aW1lX3VzZWNfdDsKCnN0YXRpYyBpbmxpbmUgcGdfdGltZV91c2Vj X3QKcGdfdGltZV9ub3codm9pZCkKewoJc3RydWN0IHRpbWV2YWwgdHY7CgoJZ2V0dGltZW9m ZGF5KCZ0diwgTlVMTCk7CgoJcmV0dXJuIChwZ190aW1lX3VzZWNfdCkgKHR2LnR2X3NlYyAq IDEwMDAwMDAgKyB0di50dl91c2VjKTsKfQoKc3RhdGljIHZvaWQKZXhpdF9uaWNlbHkoUEdj b25uICpjb25uKQp7CglQUWZpbmlzaChjb25uKTsKCWV4aXQoMSk7Cn0KCnN0YXRpYyBpbnQK Z2V0X2xhdGVuY3lfYnVja2V0KGRvdWJsZSBsYXRlbmN5X21zKQp7CgkvKiBCdWNrZXRzOiAw LTAuMDFtcywgMC4wMS0wLjFtcywgMC4xLTFtcywgMS0xMG1zLCAxMC0xMDBtcywgPjEwMG1z ICovCglpZiAobGF0ZW5jeV9tcyA8IDAuMDEpCgkJcmV0dXJuIDA7CgllbHNlIGlmIChsYXRl bmN5X21zIDwgMC4xKQoJCXJldHVybiAxOwoJZWxzZSBpZiAobGF0ZW5jeV9tcyA8IDEuMCkK CQlyZXR1cm4gMjsKCWVsc2UgaWYgKGxhdGVuY3lfbXMgPCAxMC4wKQoJCXJldHVybiAzOwoJ ZWxzZSBpZiAobGF0ZW5jeV9tcyA8IDEwMC4wKQoJCXJldHVybiA0OwoJZWxzZQoJCXJldHVy biA1Owp9CgpzdGF0aWMgdm9pZAp1cGRhdGVfaGlzdG9ncmFtKHVpbnQ2NF90IGxhdGVuY3lf dXNlYykKewoJZG91YmxlIGxhdGVuY3lfbXMgPSBsYXRlbmN5X3VzZWMgLyAxMDAwLjA7Cglp bnQgYnVja2V0ID0gZ2V0X2xhdGVuY3lfYnVja2V0KGxhdGVuY3lfbXMpOwoKCXB0aHJlYWRf bXV0ZXhfbG9jaygmaGlzdG9ncmFtX211dGV4KTsKCWJ1Y2tldF9jb3VudHNbYnVja2V0XSsr OwoJYnVja2V0X3RvdGFsc1tidWNrZXRdICs9IGxhdGVuY3lfdXNlYzsKCXB0aHJlYWRfbXV0 ZXhfdW5sb2NrKCZoaXN0b2dyYW1fbXV0ZXgpOwp9CgpzdGF0aWMgaW50CmNoZWNrX2FzeW5j X3dha2V1cF9zdGF0c19hdmFpbGFibGUodm9pZCkKewoJUEdjb25uICpjb25uOwoJUEdyZXN1 bHQgKnJlczsKCWludCBhdmFpbGFibGUgPSAwOwoKCS8qIE1ha2UgYSB0ZW1wb3JhcnkgY29u bmVjdGlvbiB0byBjaGVjayBmdW5jdGlvbiBhdmFpbGFiaWxpdHkgKi8KCWNvbm4gPSBQUWNv bm5lY3RkYihDT05ORUNUSU9OX1NUUklORyk7CgoJaWYgKFBRc3RhdHVzKGNvbm4pICE9IENP Tk5FQ1RJT05fT0spCgl7CgkJZnByaW50ZihzdGRlcnIsICIlcyIsIFBRZXJyb3JNZXNzYWdl KGNvbm4pKTsKCQlleGl0X25pY2VseShjb25uKTsKCX0KCgkvKiBRdWVyeSBwZ19wcm9jIHRv IHNlZSBpZiB0aGUgZnVuY3Rpb24gZXhpc3RzIGluIHBnX2NhdGFsb2cgKi8KCXJlcyA9IFBR ZXhlYyhjb25uLAoJCQkJICJTRUxFQ1QgMSBGUk9NIHBnX3Byb2MgcCAiCgkJCQkgIkpPSU4g cGdfbmFtZXNwYWNlIG4gT04gcC5wcm9uYW1lc3BhY2UgPSBuLm9pZCAiCgkJCQkgIldIRVJF IHAucHJvbmFtZSA9ICdwZ19nZXRfYXN5bmNfd2FrZXVwX3N0YXRzJyAiCgkJCQkgIkFORCBu Lm5zcG5hbWUgPSAncGdfY2F0YWxvZyciKTsKCglpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSA9 PSBQR1JFU19UVVBMRVNfT0sgJiYgUFFudHVwbGVzKHJlcykgPiAwKQoJCWF2YWlsYWJsZSA9 IDE7CgoJUFFjbGVhcihyZXMpOwoJUFFmaW5pc2goY29ubik7CgoJcmV0dXJuIGF2YWlsYWJs ZTsKfQoKc3RhdGljIHZvaWQKZmV0Y2hfYXN5bmNfd2FrZXVwX3N0YXRzKHZvaWQpCnsKCVBH Y29ubiAqY29ubjsKCVBHcmVzdWx0ICpyZXM7CgoJaWYgKCFoYXNfYXN5bmNfd2FrZXVwX3N0 YXRzKQoJCXJldHVybjsKCgljb25uID0gUFFjb25uZWN0ZGIoQ09OTkVDVElPTl9TVFJJTkcp OwoKCWlmIChQUXN0YXR1cyhjb25uKSAhPSBDT05ORUNUSU9OX09LKQoJewoJCWZwcmludGYo c3RkZXJyLCAiJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CgkJZXhpdF9uaWNlbHkoY29u bik7Cgl9CgoJcmVzID0gUFFleGVjKGNvbm4sCgkJCQkgIlNFTEVDVCBzaWduYWxlZF9uZWVk ZWQsIGF2b2lkZWRfd2FrZXVwcywgYWxyZWFkeV9hZHZhbmNpbmcsICIKCQkJCSAic2lnbmFs ZWRfdW5jZXJ0YWluLCBhbHJlYWR5X2FoZWFkLCBuZWNlc3Nhcnlfd2FrZXVwcywgdW5uZWNl c3Nhcnlfd2FrZXVwcyAiCgkJCQkgIkZST00gcGdfY2F0YWxvZy5wZ19nZXRfYXN5bmNfd2Fr ZXVwX3N0YXRzKCkiKTsKCglpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSA9PSBQR1JFU19UVVBM RVNfT0sgJiYgUFFudHVwbGVzKHJlcykgPiAwKQoJewoJCXB0aHJlYWRfbXV0ZXhfbG9jaygm d2FrZXVwX3N0YXRzX211dGV4KTsKCQlmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykKCQl7 CgkJCWFzeW5jX3dha2V1cF9zdGF0c1tpXSA9IHN0cnRvdWxsKFBRZ2V0dmFsdWUocmVzLCAw LCBpKSwgTlVMTCwgMTApOwoJCX0KCQlwdGhyZWFkX211dGV4X3VubG9jaygmd2FrZXVwX3N0 YXRzX211dGV4KTsKCX0KCglQUWNsZWFyKHJlcyk7CglQUWZpbmlzaChjb25uKTsKfQoKc3Rh dGljIHZvaWQKcmVzZXRfYXN5bmNfd2FrZXVwX3N0YXRzKHZvaWQpCnsKCVBHY29ubiAqY29u bjsKCVBHcmVzdWx0ICpyZXM7CgoJY29ubiA9IFBRY29ubmVjdGRiKENPTk5FQ1RJT05fU1RS SU5HKTsKCglpZiAoUFFzdGF0dXMoY29ubikgIT0gQ09OTkVDVElPTl9PSykKCXsKCQlmcHJp bnRmKHN0ZGVyciwgIiVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOwoJCWV4aXRfbmljZWx5 KGNvbm4pOwoJfQoKCXJlcyA9IFBRZXhlYyhjb25uLCAiU0VMRUNUIHBnX2NhdGFsb2cucGdf cmVzZXRfYXN5bmNfd2FrZXVwX3N0YXRzKCkiKTsKCglpZiAoUFFyZXN1bHRTdGF0dXMocmVz KSAhPSBQR1JFU19UVVBMRVNfT0spCgl7CgkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8g cmVzZXQgYXN5bmMgd2FrZXVwIHN0YXRzOiAlcyIsCgkJCQlQUWVycm9yTWVzc2FnZShjb25u KSk7Cgl9CgoJUFFjbGVhcihyZXMpOwoJUFFmaW5pc2goY29ubik7Cn0KCnN0YXRpYyB2b2lk ICoKbm90aWZ5X3RocmVhZF9tYWluKHZvaWQgKmFyZykKewoJc3RydWN0IHRocmVhZF9hcmdz ICphcmdzID0gKHN0cnVjdCB0aHJlYWRfYXJncyAqKWFyZzsKCWludCBjaGFubmVsX2lkID0g YXJncy0+Y2hhbm5lbF9pZDsKCWludCBub3RpZmllcl9pZCA9IGFyZ3MtPm5vdGlmaWVyX2lk OwoJdWludDY0X3QgKnNlcV9jb3VudGVyID0gYXJncy0+c2VxX2NvdW50ZXI7CglQR2Nvbm4J ICAgKmNvbm47CglQR3Jlc3VsdCAgICpyZXM7CgljaGFyCQljaGFubmVsX25hbWVbMzJdOwoK CS8qIEdlbmVyYXRlIGNoYW5uZWwgbmFtZSBmcm9tIGNoYW5uZWxfaWQgKi8KCXNucHJpbnRm KGNoYW5uZWxfbmFtZSwgc2l6ZW9mKGNoYW5uZWxfbmFtZSksICIlZCIsIGNoYW5uZWxfaWQp OwoKCS8qIE1ha2UgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSAqLwoJY29ubiA9IFBR Y29ubmVjdGRiKENPTk5FQ1RJT05fU1RSSU5HKTsKCgkvKiBDaGVjayB0byBzZWUgdGhhdCB0 aGUgYmFja2VuZCBjb25uZWN0aW9uIHdhcyBzdWNjZXNzZnVsbHkgbWFkZSAqLwoJaWYgKFBR c3RhdHVzKGNvbm4pICE9IENPTk5FQ1RJT05fT0spCgl7CgkJZnByaW50ZihzdGRlcnIsICIl cyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKCQlleGl0X25pY2VseShjb25uKTsKCX0KCgkv KiBXYWl0IGZvciBzaWduYWwgdG8gc3RhcnQgbm90aWZ5aW5nICovCgl3aGlsZSAoIXN0YXJ0 X25vdGlmeWluZykKCQl1c2xlZXAoMTAwMDApOyAgLyogU2xlZXAgMTBtcyAqLwoKCWZvcig7 OykKCXsKCQkvKiBTbGVlcCByYW5kb20gYW1vdW50IGlmIC0tc2xlZXAgd2FzIHNwZWNpZmll ZCAqLwoJCWlmIChtYXhfc2xlZXBfc2Vjb25kcyA+IDAuMCkKCQl7CgkJCS8qIENhbGN1bGF0 ZSBwZXItY2hhbm5lbCBtYXggc2xlZXAgdXNpbmcgZXhwb25lbnRpYWwgZmFjdG9yICovCgkJ CWRvdWJsZSBwZXJfY2hhbm5lbF9tYXggPSBtYXhfc2xlZXBfc2Vjb25kcyAqIHBvdyhzbGVl cF9leHBvbmVudGlhbF9mYWN0b3IsIGNoYW5uZWxfaWQpOwoKCQkJZG91YmxlIHJhbmRvbV9z bGVlcCA9ICgoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYKSAqIHBlcl9jaGFubmVsX21heDsK CQkJc3RydWN0IHRpbWVzcGVjIHRzOwoJCQl0cy50dl9zZWMgPSAodGltZV90KXJhbmRvbV9z bGVlcDsKCQkJdHMudHZfbnNlYyA9IChsb25nKSgocmFuZG9tX3NsZWVwIC0gdHMudHZfc2Vj KSAqIDEwMDAwMDAwMDAuMCk7CgoJCQlpZiAobmFub3NsZWVwKCZ0cywgTlVMTCkgPT0gLTEp CgkJCXsKCQkJCWZwcmludGYoc3RkZXJyLCAiQ2hhbm5lbCAlZCBub3RpZmllciAlZDogbmFu b3NsZWVwIGZhaWxlZDogIiwKCQkJCQkJY2hhbm5lbF9pZCwgbm90aWZpZXJfaWQpOwoJCQkJ c3dpdGNoIChlcnJubykKCQkJCXsKCQkJCQljYXNlIEVJTlZBTDoKCQkJCQkJZnByaW50Zihz dGRlcnIsICJFSU5WQUwgLSBpbnZhbGlkIHRpbWVzcGVjICh0dl9zZWM9JWxkLCB0dl9uc2Vj PSVsZClcbiIsCgkJCQkJCQkJKGxvbmcpdHMudHZfc2VjLCB0cy50dl9uc2VjKTsKCQkJCQkJ ZnByaW50ZihzdGRlcnIsICIgIHJhbmRvbV9zbGVlcCB2YWx1ZSB3YXM6ICUuNmYgc2Vjb25k c1xuIiwgcmFuZG9tX3NsZWVwKTsKCQkJCQkJZnByaW50ZihzdGRlcnIsICIgIFRoaXMgbGlr ZWx5IGluZGljYXRlcyBvdmVyZmxvdyBpbiBzbGVlcCBjYWxjdWxhdGlvbi5cbiIpOwoJCQkJ CQlicmVhazsKCQkJCQljYXNlIEVJTlRSOgoJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkVJTlRS IC0gaW50ZXJydXB0ZWQgYnkgc2lnbmFsXG4iKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBF RkFVTFQ6CgkJCQkJCWZwcmludGYoc3RkZXJyLCAiRUZBVUxUIC0gcHJvYmxlbSBjb3B5aW5n IGZyb20gdXNlciBzcGFjZVxuIik7CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJ CWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBlcnJvciAoZXJybm89JWQpXG4iLCBlcnJubyk7 CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQkJZXhpdF9uaWNlbHkoY29ubik7CgkJCX0KCQl9CgoJ CS8qIFN0YXJ0IHRyYW5zYWN0aW9uIGlmIGJhdGNoaW5nICovCgkJaWYgKGJhdGNoX3NpemUg PiAxKQoJCXsKCQkJcmVzID0gUFFleGVjKGNvbm4sICJCRUdJTiIpOwoJCQlpZiAoUFFyZXN1 bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQoJCQl7CgkJCQlmcHJpbnRmKHN0 ZGVyciwgIkJFR0lOIGNvbW1hbmQgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4p KTsKCQkJCVBRY2xlYXIocmVzKTsKCQkJCWV4aXRfbmljZWx5KGNvbm4pOwoJCQl9CgkJCVBR Y2xlYXIocmVzKTsKCQl9CgoJCS8qIFNlbmQgYmF0Y2hfc2l6ZSBub3RpZmljYXRpb25zICov CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXRjaF9zaXplOyBpKyspCgkJewoJCQljaGFyIGJ1 ZlsxMjhdOwoJCQlwZ190aW1lX3VzZWNfdCBzZW5kX3RpbWU7CgkJCXVpbnQ2NF90IHNlcTsK CgkJCS8qIEdldCB0aW1lc3RhbXAgYmVmb3JlIHNlbmRpbmcgKi8KCQkJc2VuZF90aW1lID0g cGdfdGltZV9ub3coKTsKCgkJCS8qIEF0b21pY2FsbHkgZ2V0IGFuZCBpbmNyZW1lbnQgdGhp cyBub3RpZmllcidzIHNlcXVlbmNlIGNvdW50ZXIgKi8KCQkJc2VxID0gX19zeW5jX2ZldGNo X2FuZF9hZGQoc2VxX2NvdW50ZXIsIDEpOwoKCQkJLyogU2VuZCBub3RpZmljYXRpb24gd2l0 aCBub3RpZmllcl9pZCwgc2VxdWVuY2UgbnVtYmVyLCBhbmQgdGltZXN0YW1wICovCgkJCXNu cHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJOT1RJRlkgXCIlc1wiLCAnJWQgJWxsZCAlbGxk JyIsCgkJCQkJIGNoYW5uZWxfbmFtZSwgbm90aWZpZXJfaWQsIChsb25nIGxvbmcpc2VxLCAo bG9uZyBsb25nKXNlbmRfdGltZSk7CgkJCXJlcyA9IFBRZXhlYyhjb25uLCBidWYpOwoJCQlp ZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQoJCQl7CgkJCQlm cHJpbnRmKHN0ZGVyciwgIk5PVElGWSBjb21tYW5kIGZhaWxlZDogJXMiLCBQUWVycm9yTWVz c2FnZShjb25uKSk7CgkJCQlQUWNsZWFyKHJlcyk7CgkJCQlleGl0X25pY2VseShjb25uKTsK CQkJfQoJCQlQUWNsZWFyKHJlcyk7CgoJCQlfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmbnVtX25v dGlmaWVzX3NlbnQsIDEpOwoJCX0KCgkJLyogQ29tbWl0IHRyYW5zYWN0aW9uIGlmIGJhdGNo aW5nICovCgkJaWYgKGJhdGNoX3NpemUgPiAxKQoJCXsKCQkJcmVzID0gUFFleGVjKGNvbm4s ICJDT01NSVQiKTsKCQkJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfQ09NTUFO RF9PSykKCQkJewoJCQkJZnByaW50ZihzdGRlcnIsICJDT01NSVQgY29tbWFuZCBmYWlsZWQ6 ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOwoJCQkJUFFjbGVhcihyZXMpOwoJCQkJZXhp dF9uaWNlbHkoY29ubik7CgkJCX0KCQkJUFFjbGVhcihyZXMpOwoJCX0KCX0KfQoKc3RhdGlj IHZvaWQgKgpsaXN0ZW5fdGhyZWFkX21haW4odm9pZCAqYXJnKQp7CglzdHJ1Y3QgdGhyZWFk X2FyZ3MgKmFyZ3MgPSAoc3RydWN0IHRocmVhZF9hcmdzICopYXJnOwoJaW50IGNoYW5uZWxf aWQgPSBhcmdzLT5jaGFubmVsX2lkOwoJaW50IG51bV9ub3RpZmllcnMgPSBhcmdzLT5udW1f bm90aWZpZXJzOwoJUEdjb25uCSAgICpjb25uOwoJUEdyZXN1bHQgICAqcmVzOwoJUEdub3Rp ZnkgICAqbm90aWZ5OwoJdWludDY0X3QJZXhwZWN0ZWRfc2VxW01BWF9OT1RJRklFUlNdOwoJ Y2hhcgkJY2hhbm5lbF9uYW1lWzMyXTsKCWNoYXIJCWxpc3Rlbl9jbWRbNjRdOwoKCS8qIElu aXRpYWxpemUgZXhwZWN0ZWQgc2VxdWVuY2UgZm9yIGVhY2ggbm90aWZpZXIgKi8KCWZvciAo aW50IGkgPSAwOyBpIDwgTUFYX05PVElGSUVSUzsgaSsrKQoJCWV4cGVjdGVkX3NlcVtpXSA9 IDA7CgoJLyogR2VuZXJhdGUgY2hhbm5lbCBuYW1lIGZyb20gY2hhbm5lbF9pZCAqLwoJc25w cmludGYoY2hhbm5lbF9uYW1lLCBzaXplb2YoY2hhbm5lbF9uYW1lKSwgIiVkIiwgY2hhbm5l bF9pZCk7CgoJLyogTWFrZSBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlICovCgljb25u ID0gUFFjb25uZWN0ZGIoQ09OTkVDVElPTl9TVFJJTkcpOwoKCS8qIENoZWNrIHRvIHNlZSB0 aGF0IHRoZSBiYWNrZW5kIGNvbm5lY3Rpb24gd2FzIHN1Y2Nlc3NmdWxseSBtYWRlICovCglp ZiAoUFFzdGF0dXMoY29ubikgIT0gQ09OTkVDVElPTl9PSykKCXsKCQlmcHJpbnRmKHN0ZGVy ciwgIiVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOwoJCWV4aXRfbmljZWx5KGNvbm4pOwoJ fQoKCgkvKgoJICogSXNzdWUgTElTVEVOIGNvbW1hbmQgZm9yICJleHRyYSIgY2hhbm5lbHMu IFRoZSBleHRyYSBjaGFubmVscyBhcmUgbmV2ZXIKCSAqIG5vdGlmaWVkLCB0aGV5J3JlIHVz ZWQganVzdCB0byBibG9hdCB0aGUgbGlzdCBvZiBjaGFubmVscyB0aGF0IG5vdGlmeQoJICog cHJvY2Vzc2luZyBuZWVkcyB0byB0cmF2ZXJzZS4KCSAqLwoJZm9yIChpbnQgaSA9IDA7IGkg PCBudW1fZXh0cmFfY2hhbm5lbHM7IGkrKykKCXsKCQlzbnByaW50ZihsaXN0ZW5fY21kLCBz aXplb2YobGlzdGVuX2NtZCksICJMSVNURU4gXCJleHRyYSVkXCIiLCBpKTsKCQlyZXMgPSBQ UWV4ZWMoY29ubiwgbGlzdGVuX2NtZCk7CgkJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0g UEdSRVNfQ09NTUFORF9PSykKCQl7CgkJCWZwcmludGYoc3RkZXJyLCAiTElTVEVOIGNvbW1h bmQgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKCQkJUFFjbGVhcihyZXMp OwoJCQlleGl0X25pY2VseShjb25uKTsKCQl9CgkJUFFjbGVhcihyZXMpOwoJfQoKCS8qCgkg KiBJc3N1ZSBMSVNURU4gY29tbWFuZCB0byBlbmFibGUgbm90aWZpY2F0aW9ucyBmcm9tIHRo ZSBydWxlJ3MgTk9USUZZLgoJICovCglzbnByaW50ZihsaXN0ZW5fY21kLCBzaXplb2YobGlz dGVuX2NtZCksICJMSVNURU4gXCIlc1wiIiwgY2hhbm5lbF9uYW1lKTsKCXJlcyA9IFBRZXhl Yyhjb25uLCBsaXN0ZW5fY21kKTsKCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVT X0NPTU1BTkRfT0spCgl7CgkJZnByaW50ZihzdGRlcnIsICJMSVNURU4gY29tbWFuZCBmYWls ZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOwoJCVBRY2xlYXIocmVzKTsKCQlleGl0 X25pY2VseShjb25uKTsKCX0KCVBRY2xlYXIocmVzKTsKCgkvKiBTaWduYWwgdGhhdCB0aGlz IGxpc3RlbmVyIGlzIHJlYWR5ICovCglwdGhyZWFkX211dGV4X2xvY2soJnN0YXJ0dXBfbXV0 ZXgpOwoJbGlzdGVuZXJzX3JlYWR5Kys7CglpZiAobGlzdGVuZXJzX3JlYWR5ID09IGFyZ3Mt PnRvdGFsX2xpc3RlbmVycykKCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZzdGFydHVwX2NvbmQp OyAgLyogV2FrZSBtYWluIHRocmVhZCBpZiB3ZSdyZSB0aGUgbGFzdCAqLwoJcHRocmVhZF9t dXRleF91bmxvY2soJnN0YXJ0dXBfbXV0ZXgpOwoKCWZvciAoOzspCgl7CgkJLyoKCQkgKiBT bGVlcCB1bnRpbCBzb21ldGhpbmcgaGFwcGVucyBvbiB0aGUgY29ubmVjdGlvbi4gIFdlIHVz ZSBrcXVldWUoMikKCQkgKiBvbiBtYWNPUy9CU0QgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBh bmQgc2NhbGFiaWxpdHksIG9yIHBwb2xsKDIpIG9uCgkJICogb3RoZXIgcGxhdGZvcm1zLiBC b3RoIGF2b2lkIHRoZSBGRF9TRVRTSVpFIGxpbWl0YXRpb24gb2Ygc2VsZWN0KCkuCgkJICov CgkJaW50CQkJc29jazsKCgkJc29jayA9IFBRc29ja2V0KGNvbm4pOwoKCQlpZiAoc29jayA8 IDApCgkJCWJyZWFrOwkJCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCgojaWZkZWYgVVNFX0tR VUVVRQoJCS8qIFVzZSBrcXVldWUgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgc2NhbGFi aWxpdHkgKi8KCQlpbnQga3E7CgkJc3RydWN0IGtldmVudCBrZXY7CgkJc3RydWN0IGtldmVu dCBldmVudDsKCgkJa3EgPSBrcXVldWUoKTsKCQlpZiAoa3EgPCAwKQoJCXsKCQkJZnByaW50 ZihzdGRlcnIsICJrcXVldWUoKSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwoJ CQlleGl0X25pY2VseShjb25uKTsKCQl9CgoJCS8qIE1vbml0b3IgdGhlIHNvY2tldCBmb3Ig cmVhZCBldmVudHMgKi8KCQlFVl9TRVQoJmtldiwgc29jaywgRVZGSUxUX1JFQUQsIEVWX0FE RCB8IEVWX09ORVNIT1QsIDAsIDAsIE5VTEwpOwoKCQkvKiBXYWl0IGluZGVmaW5pdGVseSBm b3IgYW4gZXZlbnQgKi8KCQlpZiAoa2V2ZW50KGtxLCAma2V2LCAxLCAmZXZlbnQsIDEsIE5V TEwpIDwgMCkKCQl7CgkJCWZwcmludGYoc3RkZXJyLCAia2V2ZW50KCkgZmFpbGVkOiAlc1xu Iiwgc3RyZXJyb3IoZXJybm8pKTsKCQkJY2xvc2Uoa3EpOwoJCQlleGl0X25pY2VseShjb25u KTsKCQl9CgoJCWNsb3NlKGtxKTsKI2VsaWYgZGVmaW5lZChVU0VfUFBPTEwpCgkJLyogVXNl IHBwb2xsIChuYW5vc2Vjb25kIHJlc29sdXRpb24pICovCgkJc3RydWN0IHBvbGxmZCBwZmQ7 CgoJCXBmZC5mZCA9IHNvY2s7CgkJcGZkLmV2ZW50cyA9IFBPTExJTjsKCQlwZmQucmV2ZW50 cyA9IDA7CgoJCWlmIChwcG9sbCgmcGZkLCAxLCBOVUxMLCBOVUxMKSA8IDApCgkJewoJCQlm cHJpbnRmKHN0ZGVyciwgInBwb2xsKCkgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8p KTsKCQkJZXhpdF9uaWNlbHkoY29ubik7CgkJfQojZWxzZQojIGVycm9yICJObyBJL08gbXVs dGlwbGV4aW5nIG1ldGhvZCBkZWZpbmVkLiBEZWZpbmUgVVNFX0tRVUVVRSBvciBVU0VfUFBP TEwuIgojZW5kaWYKCgkJLyogTm93IGNoZWNrIGZvciBpbnB1dCAqLwoJCVBRY29uc3VtZUlu cHV0KGNvbm4pOwoJCXdoaWxlICgobm90aWZ5ID0gUFFub3RpZmllcyhjb25uKSkgIT0gTlVM TCkKCQl7CgkJCXBnX3RpbWVfdXNlY190IHJlY3ZfdGltZTsKCQkJcGdfdGltZV91c2VjX3Qg c2VuZF90aW1lOwoJCQlpbnQgbm90aWZpZXJfaWQ7CgkJCXVpbnQ2NF90IHNlcTsKCQkJdWlu dDY0X3QgbGF0ZW5jeV91c2VjOwoKCQkJLyogR2V0IHJlY2VpdmUgdGltZXN0YW1wICovCgkJ CXJlY3ZfdGltZSA9IHBnX3RpbWVfbm93KCk7CgoJCQkvKiBQYXJzZSBub3RpZmllcl9pZCwg c2VxdWVuY2UgbnVtYmVyLCBhbmQgc2VuZCB0aW1lc3RhbXAgZnJvbSBwYXlsb2FkICovCgkJ CWlmIChub3RpZnktPmV4dHJhICYmIG5vdGlmeS0+ZXh0cmFbMF0pCgkJCXsKCQkJCWlmIChz c2NhbmYobm90aWZ5LT5leHRyYSwgIiVkICVsbGQgJWxsZCIsICZub3RpZmllcl9pZCwgKGxv bmcgbG9uZyAqKSZzZXEsIChsb25nIGxvbmcgKikmc2VuZF90aW1lKSA9PSAzKQoJCQkJewoJ CQkJCS8qIFZhbGlkYXRlIG5vdGlmaWVyX2lkICovCgkJCQkJaWYgKG5vdGlmaWVyX2lkIDwg MCB8fCBub3RpZmllcl9pZCA+PSBudW1fbm90aWZpZXJzKQoJCQkJCXsKCQkJCQkJZnByaW50 ZihzdGRlcnIsICJcbkVSUk9SOiBDaGFubmVsICVkIHJlY2VpdmVkIGludmFsaWQgbm90aWZp ZXJfaWQgJWQgKGV4cGVjdGVkIDAtJWQpXG4iLAoJCQkJCQkJCWNoYW5uZWxfaWQsIG5vdGlm aWVyX2lkLCBudW1fbm90aWZpZXJzIC0gMSk7CgkJCQkJCWFib3J0KCk7CgkJCQkJfQoKCQkJ CQkvKiBWZXJpZnkgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGlzIG5vdGlmaWVyICovCgkJCQkJ aWYgKHNlcSAhPSBleHBlY3RlZF9zZXFbbm90aWZpZXJfaWRdKQoJCQkJCXsKCQkJCQkJZnBy aW50ZihzdGRlcnIsICJcbkVSUk9SOiBDaGFubmVsICVkIG5vdGlmaWVyICVkIHNlcXVlbmNl IGdhcCEgRXhwZWN0ZWQgJWxsZCwgcmVjZWl2ZWQgJWxsZFxuIiwKCQkJCQkJCQljaGFubmVs X2lkLCBub3RpZmllcl9pZCwgKGxvbmcgbG9uZylleHBlY3RlZF9zZXFbbm90aWZpZXJfaWRd LCAobG9uZyBsb25nKXNlcSk7CgkJCQkJCWFib3J0KCk7CgkJCQkJfQoJCQkJCWV4cGVjdGVk X3NlcVtub3RpZmllcl9pZF0rKzsKCgkJCQkJbGF0ZW5jeV91c2VjID0gcmVjdl90aW1lIC0g c2VuZF90aW1lOwoKCQkJCQkvKiBVcGRhdGUgaGlzdG9ncmFtICovCgkJCQkJdXBkYXRlX2hp c3RvZ3JhbShsYXRlbmN5X3VzZWMpOwoJCQkJfQoJCQl9CgoJCQlQUWZyZWVtZW0obm90aWZ5 KTsKCQkJUFFjb25zdW1lSW5wdXQoY29ubik7CgoJCQlfX3N5bmNfZmV0Y2hfYW5kX2FkZCgm bnVtX25vdGlmaWVzX3JlY2VpdmVkLCAxKTsKCQl9Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCnN0 YXRpYyB2b2lkCnByaW50X3VzYWdlKGNvbnN0IGNoYXIgKnByb2duYW1lKQp7CglwcmludGYo IlVzYWdlOiAlcyBbT1BUSU9OU11cblxuIiwgcHJvZ25hbWUpOwoJcHJpbnRmKCJQb3N0Z3Jl U1FMIEFzeW5jIE5vdGlmeSBQZXJmb3JtYW5jZSBUZXN0XG5cbiIpOwoJcHJpbnRmKCJUZXN0 cyBQb3N0Z3JlU1FMIExJU1RFTi9OT1RJRlkgcGVyZm9ybWFuY2Ugd2l0aCBjb25maWd1cmFi bGUgdGhyZWFkcyBhbmQgY2hhbm5lbHMuXG4iKTsKCXByaW50ZigiQ29ubmVjdHMgdG86ICVz XG5cbiIsIENPTk5FQ1RJT05fU1RSSU5HKTsKCXByaW50ZigiT3B0aW9uczpcbiIpOwoJcHJp bnRmKCIgIC0tbGlzdGVuZXJzIFRIUkVBRFMgICAgICAgTnVtYmVyIG9mIGxpc3RlbmVyIHRo cmVhZHMgcGVyIGNoYW5uZWxcbiIpOwoJcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAg ICAgICAoZGVmYXVsdDogMSwgbWluaW11bTogMSlcblxuIik7CglwcmludGYoIiAgLS1ub3Rp ZmllcnMgVEhSRUFEUyAgICAgICBOdW1iZXIgb2Ygbm90aWZpZXIgdGhyZWFkcyBwZXIgY2hh bm5lbFxuIik7CglwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0 OiAxLCBtaW5pbXVtOiAxKVxuXG4iKTsKCXByaW50ZigiICAtLWNoYW5uZWxzIENPVU5UICAg ICAgICAgIE51bWJlciBvZiBjaGFubmVscyB0byBjcmVhdGUgYW5kIHRlc3RcbiIpOwoJcHJp bnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogMSwgbWluaW11bTog MSlcblxuIik7CglwcmludGYoIiAgLS1leHRyYS1jaGFubmVscyBDT1VOVCAgICBBZGRpdGlv bmFsIGNoYW5uZWxzIHRvIGxpc3RlbiBvbiBmb3IgbG9hZCB0ZXN0aW5nXG4iKTsKCXByaW50 ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IDAsIG1pbmltdW06IDAp XG4iKTsKCXByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogZXh0cmEg Y2hhbm5lbHMgYXJlIG5vdCBub3RpZmllZFxuXG4iKTsKCXByaW50ZigiICAtLXNsZWVwIFNF Q09ORFMgICAgICAgICAgTWF4aW11bSByYW5kb20gc2xlZXAgYmVmb3JlIGVhY2ggbm90aWZ5 XG4iKTsKCXByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IDAu MCwgbWluaW11bTogMC4wKVxuIik7CglwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAg ICAgIFN1cHBvcnRzIGZyYWN0aW9uYWwgdmFsdWVzIChlLmcuLCAwLjEgZm9yIDEwMG1zKVxu XG4iKTsKCXByaW50ZigiICAtLXNsZWVwLWV4cCBGQUNUT1IgICAgICAgRXhwb25lbnRpYWwg c2NhbGluZyBmYWN0b3IgZm9yIHBlci1jaGFubmVsIHNsZWVwXG4iKTsKCXByaW50ZigiICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IDEuMCwgbXVzdCBiZSA+IDAuMClc biIpOwoJcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsIE4gZ2V0 czogLS1zbGVlcCAqIEZBQ1RPUl5OXG4iKTsKCXByaW50ZigiICAgICAgICAgICAgICAgICAg ICAgICAgICAgVXNlIDwxLjAgdG8gZGVjcmVhc2Ugc2xlZXAgZm9yIGhpZ2hlciBjaGFubmVs c1xuIik7CglwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSA+MS4wIHRv IGluY3JlYXNlIHNsZWVwIGZvciBoaWdoZXIgY2hhbm5lbHNcblxuIik7CglwcmludGYoIiAg LS1iYXRjaCBDT1VOVCAgICAgICAgICAgIE51bWJlciBvZiBOT1RJRllzIHRvIHNlbmQgaW4g YSBzaW5nbGUgdHJhbnNhY3Rpb25cbiIpOwoJcHJpbnRmKCIgICAgICAgICAgICAgICAgICAg ICAgICAgICAoZGVmYXVsdDogMSwgbWluaW11bTogMSlcbiIpOwoJcHJpbnRmKCIgICAgICAg ICAgICAgICAgICAgICAgICAgICBFYWNoIE5PVElGWSBoYXMgaXRzIG93biBzZXEgYW5kIHNl bmRfdGltZVxuIik7CglwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lO L0NPTU1JVCBvbmx5IHVzZWQgd2hlbiBDT1VOVCA+IDFcblxuIik7CglwcmludGYoIiAgLS1o ZWxwICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4 aXRcblxuIik7CglleGl0KDApOwp9CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3Yp CnsKCWludAkJCW51bV90aHJlYWRzID0gMDsKCXB0aHJlYWRfdCAgKnRocmVhZHM7CglwZ190 aW1lX3VzZWNfdCBzdGFydDsKCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1td ID0gewoJCS8qIHN5c3RlbWF0aWMgbG9uZy9zaG9ydCBuYW1lZCBvcHRpb25zICovCgkJeyJs aXN0ZW5lcnMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgMX0sCgkJeyJub3RpZmllcnMi LCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgMn0sCgkJeyJjaGFubmVscyIsIHJlcXVpcmVk X2FyZ3VtZW50LCBOVUxMLCAzfSwKCQl7ImV4dHJhLWNoYW5uZWxzIiwgcmVxdWlyZWRfYXJn dW1lbnQsIE5VTEwsIDR9LAoJCXsic2xlZXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwg NX0sCgkJeyJzbGVlcC1leHAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgN30sCgkJeyJi YXRjaCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCA2fSwKCQl7ImhlbHAiLCBub19hcmd1 bWVudCwgTlVMTCwgJ2gnfSwKCQl7TlVMTCwgMCwgTlVMTCwgMH0KCX07CglpbnQJCQludW1f bGlzdGVuX3RocmVhZHMgPSAxOwoJaW50CQkJbnVtX25vdGlmeV90aHJlYWRzID0gMTsKCWlu dAkJCW51bV9jaGFubmVscyA9IDE7CglpbnQJCQlvcHRpbmRleDsKCWludAkJCWM7CgoJd2hp bGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIiIsIGxvbmdfb3B0aW9ucywgJm9w dGluZGV4KSkgIT0gLTEpCgl7CgkJc3dpdGNoIChjKQoJCXsKCQkJY2FzZSAxOgkJCQkvKiBs aXN0ZW5lcnMgKi8KCQkJCW51bV9saXN0ZW5fdGhyZWFkcyA9IGF0b2kob3B0YXJnKTsKCQkJ CWlmIChudW1fbGlzdGVuX3RocmVhZHMgPCAxKQoJCQkJewoJCQkJCWZwcmludGYoc3RkZXJy LCAiaW52YWxpZCAtLWxpc3RlbmVycyBhcmd1bWVudFxuIik7CgkJCQkJZXhpdCgxKTsKCQkJ CX0KCQkJCWJyZWFrOwoKCQkJY2FzZSAyOgkJCQkvKiBub3RpZmllcnMgKi8KCQkJCW51bV9u b3RpZnlfdGhyZWFkcyA9IGF0b2kob3B0YXJnKTsKCQkJCWlmIChudW1fbm90aWZ5X3RocmVh ZHMgPCAxKQoJCQkJewoJCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCAtLW5vdGlmaWVy cyBhcmd1bWVudFxuIik7CgkJCQkJZXhpdCgxKTsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJY2Fz ZSAzOgkJCQkvKiBjaGFubmVscyAqLwoJCQkJbnVtX2NoYW5uZWxzID0gYXRvaShvcHRhcmcp OwoJCQkJaWYgKG51bV9jaGFubmVscyA8IDEpCgkJCQl7CgkJCQkJZnByaW50ZihzdGRlcnIs ICJpbnZhbGlkIC0tY2hhbm5lbHMgYXJndW1lbnRcbiIpOwoJCQkJCWV4aXQoMSk7CgkJCQl9 CgkJCQlicmVhazsKCgkJCWNhc2UgNDoJCQkJLyogZXh0cmEtY2hhbm5lbHMgKi8KCQkJCW51 bV9leHRyYV9jaGFubmVscyA9IGF0b2kob3B0YXJnKTsKCQkJCWlmIChudW1fZXh0cmFfY2hh bm5lbHMgPCAwKQoJCQkJewoJCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCAtLWV4dHJh LWNoYW5uZWxzIGFyZ3VtZW50XG4iKTsKCQkJCQlleGl0KDEpOwoJCQkJfQoJCQkJYnJlYWs7 CgoJCQljYXNlIDU6CQkJCS8qIHNsZWVwICovCgkJCQltYXhfc2xlZXBfc2Vjb25kcyA9IGF0 b2Yob3B0YXJnKTsKCQkJCWlmIChtYXhfc2xlZXBfc2Vjb25kcyA8IDAuMCkKCQkJCXsKCQkJ CQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgLS1zbGVlcCBhcmd1bWVudFxuIik7CgkJCQkJ ZXhpdCgxKTsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJY2FzZSA2OgkJCQkvKiBiYXRjaCAqLwoJ CQkJYmF0Y2hfc2l6ZSA9IGF0b2kob3B0YXJnKTsKCQkJCWlmIChiYXRjaF9zaXplIDwgMSkK CQkJCXsKCQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgLS1iYXRjaCBhcmd1bWVudCAo bWluaW11bTogMSlcbiIpOwoJCQkJCWV4aXQoMSk7CgkJCQl9CgkJCQlicmVhazsKCgkJCWNh c2UgNzoJCQkJLyogc2xlZXAtZXhwICovCgkJCQlzbGVlcF9leHBvbmVudGlhbF9mYWN0b3Ig PSBhdG9mKG9wdGFyZyk7CgkJCQlpZiAoc2xlZXBfZXhwb25lbnRpYWxfZmFjdG9yIDw9IDAu MCkKCQkJCXsKCQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgLS1zbGVlcC1leHAgYXJn dW1lbnQgKG11c3QgYmUgPiAwLjApXG4iKTsKCQkJCQlleGl0KDEpOwoJCQkJfQoJCQkJYnJl YWs7CgoJCQljYXNlICdoJzoJCQkJLyogaGVscCAqLwoJCQkJcHJpbnRfdXNhZ2UoYXJndlsw XSk7CgkJCQlicmVhazsKCgkJCWNhc2UgJz8nOgkJCQkvKiB1bmtub3duIG9wdGlvbiBvciBt aXNzaW5nIGFyZ3VtZW50ICovCgkJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBVbmtub3du IG9wdGlvbiBvciBtaXNzaW5nIGFyZ3VtZW50XG5cbiIpOwoJCQkJcHJpbnRfdXNhZ2UoYXJn dlswXSk7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlmcHJpbnRmKHN0ZGVyciwgIkVy cm9yOiBVbmV4cGVjdGVkIGdldG9wdF9sb25nIHJldHVybiB2YWx1ZVxuIik7CgkJCQlleGl0 KDEpOwoJCX0KCX0KCgkvKiBDaGVjayBmb3IgZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMg Ki8KCWlmIChvcHRpbmQgPCBhcmdjKQoJewoJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IFVu ZXhwZWN0ZWQgYXJndW1lbnQgJyVzJ1xuXG4iLCBhcmd2W29wdGluZF0pOwoJCXByaW50X3Vz YWdlKGFyZ3ZbMF0pOwoJfQoKCS8qIENoZWNrIGlmIHBnX2dldF9hc3luY193YWtldXBfc3Rh dHMgaXMgYXZhaWxhYmxlICovCgloYXNfYXN5bmNfd2FrZXVwX3N0YXRzID0gY2hlY2tfYXN5 bmNfd2FrZXVwX3N0YXRzX2F2YWlsYWJsZSgpOwoJaWYgKGhhc19hc3luY193YWtldXBfc3Rh dHMpCgkJcmVzZXRfYXN5bmNfd2FrZXVwX3N0YXRzKCk7CgoJaW50IHRvdGFsX3RocmVhZHMg PSBudW1fY2hhbm5lbHMgKiAobnVtX25vdGlmeV90aHJlYWRzICsgbnVtX2xpc3Rlbl90aHJl YWRzKTsKCXRocmVhZHMgPSBtYWxsb2ModG90YWxfdGhyZWFkcyAqIHNpemVvZihwdGhyZWFk X3QpKTsKCXN0cnVjdCB0aHJlYWRfYXJncyAqdGhyZWFkX2FyZ3NfYXJyYXkgPSBtYWxsb2Mo dG90YWxfdGhyZWFkcyAqIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2FyZ3MpKTsKCgkvKiBBbGxv Y2F0ZSBzZXF1ZW5jZSBjb3VudGVycyBmb3IgZWFjaCBub3RpZmllciB0aHJlYWQgKGluaXRp YWxpemVkIHRvIDApICovCgl1aW50NjRfdCAqbm90aWZpZXJfc2VxcyA9IGNhbGxvYyhudW1f Y2hhbm5lbHMgKiBudW1fbm90aWZ5X3RocmVhZHMsIHNpemVvZih1aW50NjRfdCkpOwoKCS8q IFNwYXduIHRocmVhZHMgZm9yIGVhY2ggY2hhbm5lbCAqLwoJZm9yIChpbnQgY2hhbm5lbF9p ZCA9IDA7IGNoYW5uZWxfaWQgPCBudW1fY2hhbm5lbHM7IGNoYW5uZWxfaWQrKykKCXsKCQkv KiBTcGF3biBub3RpZmllciB0aHJlYWRzIGZvciB0aGlzIGNoYW5uZWwgKi8KCQlmb3IgKGlu dCBpID0gMDsgaSA8IG51bV9ub3RpZnlfdGhyZWFkczsgaSsrKQoJCXsKCQkJaW50CQkJczsK CQkJaW50CQkJbm90aWZpZXJfaW5kZXggPSBjaGFubmVsX2lkICogbnVtX25vdGlmeV90aHJl YWRzICsgaTsKCgkJCXRocmVhZF9hcmdzX2FycmF5W251bV90aHJlYWRzXS5jaGFubmVsX2lk ID0gY2hhbm5lbF9pZDsKCQkJdGhyZWFkX2FyZ3NfYXJyYXlbbnVtX3RocmVhZHNdLm5vdGlm aWVyX2lkID0gaTsKCQkJdGhyZWFkX2FyZ3NfYXJyYXlbbnVtX3RocmVhZHNdLm51bV9ub3Rp ZmllcnMgPSBudW1fbm90aWZ5X3RocmVhZHM7CgkJCXRocmVhZF9hcmdzX2FycmF5W251bV90 aHJlYWRzXS50b3RhbF9saXN0ZW5lcnMgPSBudW1fY2hhbm5lbHMgKiBudW1fbGlzdGVuX3Ro cmVhZHM7CgkJCXRocmVhZF9hcmdzX2FycmF5W251bV90aHJlYWRzXS5zZXFfY291bnRlciA9 ICZub3RpZmllcl9zZXFzW25vdGlmaWVyX2luZGV4XTsKCQkJcyA9IHB0aHJlYWRfY3JlYXRl KCZ0aHJlYWRzW251bV90aHJlYWRzXSwgTlVMTCwKCQkJCQkJCSAgICZub3RpZnlfdGhyZWFk X21haW4sICZ0aHJlYWRfYXJnc19hcnJheVtudW1fdGhyZWFkc10pOwoJCQlpZiAocyAhPSAw KQoJCQl7CgkJCQlmcHJpbnRmKHN0ZGVyciwgInB0aHJlYWRfY3JlYXRlIGZhaWxlZFxuIik7 CgkJCQlleGl0KDEpOwoJCQl9CgkJCW51bV90aHJlYWRzKys7CgkJfQoKCQkvKiBTcGF3biBs aXN0ZW5lciB0aHJlYWRzIGZvciB0aGlzIGNoYW5uZWwgKi8KCQlmb3IgKGludCBpID0gMDsg aSA8IG51bV9saXN0ZW5fdGhyZWFkczsgaSsrKQoJCXsKCQkJaW50CQkJczsKCgkJCXRocmVh ZF9hcmdzX2FycmF5W251bV90aHJlYWRzXS5jaGFubmVsX2lkID0gY2hhbm5lbF9pZDsKCQkJ dGhyZWFkX2FyZ3NfYXJyYXlbbnVtX3RocmVhZHNdLm5vdGlmaWVyX2lkID0gLTE7ICAvKiBO b3QgdXNlZCBmb3IgbGlzdGVuZXJzICovCgkJCXRocmVhZF9hcmdzX2FycmF5W251bV90aHJl YWRzXS5udW1fbm90aWZpZXJzID0gbnVtX25vdGlmeV90aHJlYWRzOwoJCQl0aHJlYWRfYXJn c19hcnJheVtudW1fdGhyZWFkc10udG90YWxfbGlzdGVuZXJzID0gbnVtX2NoYW5uZWxzICog bnVtX2xpc3Rlbl90aHJlYWRzOwoJCQl0aHJlYWRfYXJnc19hcnJheVtudW1fdGhyZWFkc10u c2VxX2NvdW50ZXIgPSBOVUxMOyAgLyogTm90IHVzZWQgZm9yIGxpc3RlbmVycyAqLwoJCQlz ID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZHNbbnVtX3RocmVhZHNdLCBOVUxMLAoJCQkJCQkJ ICAgJmxpc3Rlbl90aHJlYWRfbWFpbiwgJnRocmVhZF9hcmdzX2FycmF5W251bV90aHJlYWRz XSk7CgkJCWlmIChzICE9IDApCgkJCXsKCQkJCWZwcmludGYoc3RkZXJyLCAicHRocmVhZF9j cmVhdGUgZmFpbGVkXG4iKTsKCQkJCWV4aXQoMSk7CgkJCX0KCQkJbnVtX3RocmVhZHMrKzsK CQl9Cgl9CgoJLyogV2FpdCBmb3IgYWxsIGxpc3RlbmVycyB0byBlc3RhYmxpc2ggTElTVEVO IGJlZm9yZSBub3RpZmllcnMgc3RhcnQgc2VuZGluZyAqLwoJcHRocmVhZF9tdXRleF9sb2Nr KCZzdGFydHVwX211dGV4KTsKCXdoaWxlIChsaXN0ZW5lcnNfcmVhZHkgPCBudW1fY2hhbm5l bHMgKiBudW1fbGlzdGVuX3RocmVhZHMpCgkJcHRocmVhZF9jb25kX3dhaXQoJnN0YXJ0dXBf Y29uZCwgJnN0YXJ0dXBfbXV0ZXgpOwoJcHRocmVhZF9tdXRleF91bmxvY2soJnN0YXJ0dXBf bXV0ZXgpOwoKCS8qIFNpZ25hbCBub3RpZmllcnMgdG8gc3RhcnQgKi8KCXN0YXJ0X25vdGlm eWluZyA9IDE7CgoJc3RhcnQgPSBwZ190aW1lX25vdygpOwoKCXVpbnQzMl90IHByZXZfc2Vu dCA9IDA7Cgl1aW50MzJfdCBwcmV2X3JlY2VpdmVkID0gMDsKCWludCBmaXJzdF9pdGVyYXRp b24gPSAxOwoKCWZvciAoOzspCgl7CgkJZG91YmxlCQllbGFwc2VkX3NlYzsKCQl1aW50MzJf dAljdXJyX3NlbnQ7CgkJdWludDMyX3QJY3Vycl9yZWNlaXZlZDsKCQl1aW50MzJfdAlzZW50 X3Blcl9zZWM7CgkJdWludDMyX3QJcmVjZWl2ZWRfcGVyX3NlYzsKCgkJc2xlZXAoMSk7CgoJ CS8qIEZldGNoIGFzeW5jIHdha2V1cCBzdGF0cyBpZiBhdmFpbGFibGUgKi8KCQlmZXRjaF9h c3luY193YWtldXBfc3RhdHMoKTsKCgkJLyogTW92ZSBjdXJzb3IgYmFjayB1cCBiZWZvcmUg cHJpbnRpbmcgKGV4Y2VwdCBmaXJzdCB0aW1lKSAqLwoJCWlmICghZmlyc3RfaXRlcmF0aW9u KQoJCXsKCQkJaW50IGxpbmVzID0gTlVNX0JVQ0tFVFMgKyAxOyAgLyogTGF0ZW5jeSBkaXN0 cmlidXRpb24gKi8KCQkJaWYgKGhhc19hc3luY193YWtldXBfc3RhdHMpCgkJCQlsaW5lcyAr PSAxMjsgIC8qIGFzeW5jUXVldWUgKDQgbGluZXMpICsgU2lnbmFsQmFja2VuZHMgKDcgbGlu ZXMpICovCgkJCWZwcmludGYoc3RkZXJyLCAiXDAzM1slZEFcciIsIGxpbmVzKTsKCQl9CgkJ Zmlyc3RfaXRlcmF0aW9uID0gMDsKCgkJZWxhcHNlZF9zZWMgPSBQR19USU1FX0dFVF9ET1VC TEUocGdfdGltZV9ub3coKSAtIHN0YXJ0KTsKCgkJY3Vycl9zZW50ID0gbnVtX25vdGlmaWVz X3NlbnQ7CgkJY3Vycl9yZWNlaXZlZCA9IG51bV9ub3RpZmllc19yZWNlaXZlZDsKCQlzZW50 X3Blcl9zZWMgPSBjdXJyX3NlbnQgLSBwcmV2X3NlbnQ7CgkJcmVjZWl2ZWRfcGVyX3NlYyA9 IGN1cnJfcmVjZWl2ZWQgLSBwcmV2X3JlY2VpdmVkOwoKCQkvKiBQcmludCBzdGF0cyBvbiBz YW1lIGxpbmUgKi8KCQlmcHJpbnRmKHN0ZGVyciwgIlxyJS4wZiBzOiAldSBzZW50ICgldS9z KSwgJXUgcmVjZWl2ZWQgKCV1L3MpICAgICIsCgkJCQllbGFwc2VkX3NlYywgY3Vycl9zZW50 LCBzZW50X3Blcl9zZWMsIGN1cnJfcmVjZWl2ZWQsIHJlY2VpdmVkX3Blcl9zZWMpOwoKCQkv KiBQcmludCBoaXN0b2dyYW0gKi8KCQlwdGhyZWFkX211dGV4X2xvY2soJmhpc3RvZ3JhbV9t dXRleCk7CgoJCXVpbnQ2NF90IHRvdGFsX21lYXN1cmVkID0gMDsKCQlmb3IgKGludCBpID0g MDsgaSA8IE5VTV9CVUNLRVRTOyBpKyspCgkJCXRvdGFsX21lYXN1cmVkICs9IGJ1Y2tldF9j b3VudHNbaV07CgoJCWlmICh0b3RhbF9tZWFzdXJlZCA+IDApCgkJewoJCQljb25zdCBjaGFy ICpidWNrZXRfbGFiZWxzW10gPSB7CgkJCQkiIDAuMDAtMC4wMW1zICAgIiwKCQkJCSIgMC4w MS0wLjEwbXMgICAiLAoJCQkJIiAwLjEwLTEuMDBtcyAgICIsCgkJCQkiIDEuMDAtMTAuMDBt cyAgIiwKCQkJCSIgMTAuMDAtMTAwLjAwbXMiLAoJCQkJIj4xMDAuMDBtcyAgICAgIgoJCQl9 OwoKCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwoJCQlmcHJpbnRmKHN0ZGVyciwgIk5vdGlm aWNhdGlvbiBMYXRlbmN5IERpc3RyaWJ1dGlvbjpcbiIpOwoJCQlmb3IgKGludCBpID0gMDsg aSA8IE5VTV9CVUNLRVRTOyBpKyspCgkJCXsKCQkJCXVpbnQ2NF90IGNvdW50ID0gYnVja2V0 X2NvdW50c1tpXTsKCQkJCWRvdWJsZSBwZXJjZW50YWdlID0gKGNvdW50ICogMTAwLjApIC8g dG90YWxfbWVhc3VyZWQ7CgkJCQlkb3VibGUgYXZnX2xhdGVuY3lfbXMgPSAwLjA7CgoJCQkJ aWYgKGNvdW50ID4gMCkKCQkJCQlhdmdfbGF0ZW5jeV9tcyA9IChidWNrZXRfdG90YWxzW2ld IC8gMTAwMC4wKSAvIGNvdW50OwoKCQkJCS8qIERyYXcgYmFyIGNoYXJ0IChtYXggMTAgY2hh cnMpICovCgkJCQlpbnQgYmFyX2xlbmd0aCA9IChpbnQpKChjb3VudCAqIDEwKSAvIHRvdGFs X21lYXN1cmVkKTsKCQkJCWlmIChiYXJfbGVuZ3RoID09IDAgJiYgY291bnQgPiAwKQoJCQkJ CWJhcl9sZW5ndGggPSAxOwoKCQkJCWZwcmludGYoc3RkZXJyLCAiJXMgICIsIGJ1Y2tldF9s YWJlbHNbaV0pOwoJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBiYXJfbGVuZ3RoOyBqKyspCgkJ CQkJZnByaW50ZihzdGRlcnIsICIjIik7CgkJCQlmb3IgKGludCBqID0gYmFyX2xlbmd0aDsg aiA8IDEwOyBqKyspCgkJCQkJZnByaW50ZihzdGRlcnIsICIgIik7CgoJCQkJZnByaW50Zihz dGRlcnIsICIgJWxsdSAoJS4xZiUlKSBhdmc6ICUuM2Ztc1xuIiwKCQkJCQkJKHVuc2lnbmVk IGxvbmcgbG9uZyljb3VudCwgcGVyY2VudGFnZSwgYXZnX2xhdGVuY3lfbXMpOwoJCQl9CgkJ fQoKCQlwdGhyZWFkX211dGV4X3VubG9jaygmaGlzdG9ncmFtX211dGV4KTsKCgkJLyogRGlz cGxheSBhc3luYyB3YWtldXAgc3RhdHMgaWYgYXZhaWxhYmxlICovCgkJaWYgKGhhc19hc3lu Y193YWtldXBfc3RhdHMpCgkJewoJCQlwdGhyZWFkX211dGV4X2xvY2soJndha2V1cF9zdGF0 c19tdXRleCk7CgoJCQl1aW50NjRfdCBzdGF0c1s3XTsKCQkJbWVtY3B5KHN0YXRzLCBhc3lu Y193YWtldXBfc3RhdHMsIHNpemVvZihzdGF0cykpOwoKCQkJcHRocmVhZF9tdXRleF91bmxv Y2soJndha2V1cF9zdGF0c19tdXRleCk7CgoJCQkvKiBGaXJzdCBoaXN0b2dyYW06IGFzeW5j UXVldWVSZWFkQWxsTm90aWZpY2F0aW9ucyBTdGF0aXN0aWNzICovCgkJCXVpbnQ2NF90IGFz eW5jcV90b3RhbCA9IHN0YXRzWzVdICsgc3RhdHNbNl07CgoJCQlpZiAoYXN5bmNxX3RvdGFs ID4gMCkKCQkJewoJCQkJY29uc3QgY2hhciAqYXN5bmNxX2xhYmVsc1tdID0gewoJCQkJCSJu ZWNlc3Nhcnlfd2FrZXVwcyAgIiwKCQkJCQkidW5uZWNlc3Nhcnlfd2FrZXVwcyIKCQkJCX07 CgkJCQlpbnQgYXN5bmNxX2luZGljZXNbXSA9IHs1LCA2fTsKCgkJCQlmcHJpbnRmKHN0ZGVy ciwgIlxuIik7CgkJCQlmcHJpbnRmKHN0ZGVyciwgImFzeW5jUXVldWVSZWFkQWxsTm90aWZp Y2F0aW9ucyBTdGF0aXN0aWNzOlxuIik7CgkJCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkr KykKCQkJCXsKCQkJCQlpbnQgaWR4ID0gYXN5bmNxX2luZGljZXNbaV07CgkJCQkJZG91Ymxl IHBlcmNlbnRhZ2UgPSAoc3RhdHNbaWR4XSAqIDEwMC4wKSAvIGFzeW5jcV90b3RhbDsKCgkJ CQkJLyogRHJhdyBiYXIgY2hhcnQgKG1heCAxMCBjaGFycykgKi8KCQkJCQlpbnQgYmFyX2xl bmd0aCA9IChpbnQpKChzdGF0c1tpZHhdICogMTApIC8gYXN5bmNxX3RvdGFsKTsKCQkJCQlp ZiAoYmFyX2xlbmd0aCA9PSAwICYmIHN0YXRzW2lkeF0gPiAwKQoJCQkJCQliYXJfbGVuZ3Ro ID0gMTsKCgkJCQkJZnByaW50ZihzdGRlcnIsICIlcyAgIiwgYXN5bmNxX2xhYmVsc1tpXSk7 CgkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBiYXJfbGVuZ3RoOyBqKyspCgkJCQkJCWZwcmlu dGYoc3RkZXJyLCAiIyIpOwoJCQkJCWZvciAoaW50IGogPSBiYXJfbGVuZ3RoOyBqIDwgMTA7 IGorKykKCQkJCQkJZnByaW50ZihzdGRlcnIsICIgIik7CgoJCQkJCWZwcmludGYoc3RkZXJy LCAiICVsbHUgKCUuMWYlJSlcbiIsCgkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXN0YXRz W2lkeF0sIHBlcmNlbnRhZ2UpOwoJCQkJfQoJCQl9CgoJCQkvKiBTZWNvbmQgaGlzdG9ncmFt OiBTaWduYWxCYWNrZW5kcyBTdGF0aXN0aWNzICovCgkJCXVpbnQ2NF90IHNpZ25hbF90b3Rh bCA9IHN0YXRzWzBdICsgc3RhdHNbMV0gKyBzdGF0c1syXSArIHN0YXRzWzNdICsgc3RhdHNb NF07CgoJCQlpZiAoc2lnbmFsX3RvdGFsID4gMCkKCQkJewoJCQkJY29uc3QgY2hhciAqc2ln bmFsX2xhYmVsc1tdID0gewoJCQkJCSJzaWduYWxlZF9uZWVkZWQgICAiLAoJCQkJCSJhdm9p ZGVkX3dha2V1cHMgICAiLAoJCQkJCSJhbHJlYWR5X2FkdmFuY2luZyAiLAoJCQkJCSJzaWdu YWxlZF91bmNlcnRhaW4iLAoJCQkJCSJhbHJlYWR5X2FoZWFkICAgICAiCgkJCQl9OwoJCQkJ aW50IHNpZ25hbF9pbmRpY2VzW10gPSB7MCwgMSwgMiwgMywgNH07CgoJCQkJZnByaW50Zihz dGRlcnIsICJcbiIpOwoJCQkJZnByaW50ZihzdGRlcnIsICJTaWduYWxCYWNrZW5kcyBTdGF0 aXN0aWNzOlxuIik7CgkJCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykKCQkJCXsKCQkJ CQlpbnQgaWR4ID0gc2lnbmFsX2luZGljZXNbaV07CgkJCQkJZG91YmxlIHBlcmNlbnRhZ2Ug PSAoc3RhdHNbaWR4XSAqIDEwMC4wKSAvIHNpZ25hbF90b3RhbDsKCgkJCQkJLyogRHJhdyBi YXIgY2hhcnQgKG1heCAxMCBjaGFycykgKi8KCQkJCQlpbnQgYmFyX2xlbmd0aCA9IChpbnQp KChzdGF0c1tpZHhdICogMTApIC8gc2lnbmFsX3RvdGFsKTsKCQkJCQlpZiAoYmFyX2xlbmd0 aCA9PSAwICYmIHN0YXRzW2lkeF0gPiAwKQoJCQkJCQliYXJfbGVuZ3RoID0gMTsKCgkJCQkJ ZnByaW50ZihzdGRlcnIsICIlcyAgIiwgc2lnbmFsX2xhYmVsc1tpXSk7CgkJCQkJZm9yIChp bnQgaiA9IDA7IGogPCBiYXJfbGVuZ3RoOyBqKyspCgkJCQkJCWZwcmludGYoc3RkZXJyLCAi IyIpOwoJCQkJCWZvciAoaW50IGogPSBiYXJfbGVuZ3RoOyBqIDwgMTA7IGorKykKCQkJCQkJ ZnByaW50ZihzdGRlcnIsICIgIik7CgoJCQkJCWZwcmludGYoc3RkZXJyLCAiICVsbHUgKCUu MWYlJSlcbiIsCgkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXN0YXRzW2lkeF0sIHBlcmNl bnRhZ2UpOwoJCQkJfQoJCQl9CgkJfQoKCQlmZmx1c2goc3RkZXJyKTsKCgkJcHJldl9zZW50 ID0gY3Vycl9zZW50OwoJCXByZXZfcmVjZWl2ZWQgPSBjdXJyX3JlY2VpdmVkOwoJfQoKCXJl dHVybiAwOwp9Cg== --66fec88f66d248cf9926460e5094cf46 Content-Disposition: attachment; filename*0="pg_get_async_wakeup_stats-patch.txt" Content-Type: text/plain; name="pg_get_async_wakeup_stats-patch.txt" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMgYi9zcmMvYmFja2Vu ZC9jb21tYW5kcy9hc3luYy5jCmluZGV4IDhkYWMxMmY4MTI0Li43ZThlMGIxNGY0MiAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYworKysgYi9zcmMvYmFja2Vu ZC9jb21tYW5kcy9hc3luYy5jCkBAIC0xMzcsNiArMTM3LDcgQEAKICNpbmNsdWRlIDxzaWdu YWwuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgImFjY2Vzcy9odHVwX2Rl dGFpbHMuaCIKICNpbmNsdWRlICJhY2Nlc3MvcGFyYWxsZWwuaCIKICNpbmNsdWRlICJhY2Nl c3Mvc2xydS5oIgogI2luY2x1ZGUgImFjY2Vzcy90cmFuc2FtLmgiCkBAIC0zMzIsNiArMzMz LDEzIEBAIHR5cGVkZWYgc3RydWN0IEFzeW5jUXVldWVDb250cm9sCiAJVGltZXN0YW1wVHog bGFzdFF1ZXVlRmlsbFdhcm47CS8qIHRpbWUgb2YgbGFzdCBxdWV1ZS1mdWxsIG1zZyAqLwog CWRzYV9oYW5kbGUJY2hhbm5lbEhhc2hEU0E7CiAJZHNoYXNoX3RhYmxlX2hhbmRsZSBjaGFu bmVsSGFzaERTSDsKKwlwZ19hdG9taWNfdWludDMyIHNpZ25hbGVkTmVlZGVkOwkvKiBsaXN0 ZW5pbmcgdG8gc29tZSBvZiB0aGUgY2hhbm5lbHM7IHNpZ25hbCBuZWVkZWQgKi8KKwlwZ19h dG9taWNfdWludDMyIGF2b2lkZWRXYWtldXBzOwkvKiBkaXJlY3RseSBhZHZhbmNlZCAqLwor CXBnX2F0b21pY191aW50MzIgYWxyZWFkeUFkdmFuY2luZzsJLyogYWxyZWFkeSBhZHZhbmNp bmcgaXRzIHBvc2l0aW9uICovCisJcGdfYXRvbWljX3VpbnQzMiBzaWduYWxlZFVuY2VydGFp bjsJLyogc2lnbmFsZWQgZHVlIHRvIHVuY2VydGFpbiBuZWVkICovCisJcGdfYXRvbWljX3Vp bnQzMiBhbHJlYWR5QWhlYWQ7CS8qIGFscmVhZHkgYWhlYWQsIG5vIGFjdGlvbiBuZWVkZWQg Ki8KKwlwZ19hdG9taWNfdWludDMyIG5lY2Vzc2FyeVdha2V1cHM7CQkvKiB3YWtldXBzIHdo ZXJlIGF0IGxlYXN0IG9uZSBtZXNzYWdlIHdhcyBpbnRlcmVzdGluZyAqLworCXBnX2F0b21p Y191aW50MzIgdW5uZWNlc3NhcnlXYWtldXBzOwkvKiB3YWtldXBzIHdoZXJlIG5vIG1lc3Nh Z2VzIHdlcmUgaW50ZXJlc3RpbmcgKi8KIAlRdWV1ZUJhY2tlbmRTdGF0dXMgYmFja2VuZFtG TEVYSUJMRV9BUlJBWV9NRU1CRVJdOwogfSBBc3luY1F1ZXVlQ29udHJvbDsKIApAQCAtNTE3 LDcgKzUyNSw4IEBAIHN0YXRpYyB2b2lkIGFzeW5jUXVldWVSZWFkQWxsTm90aWZpY2F0aW9u cyh2b2lkKTsKIHN0YXRpYyBib29sIGFzeW5jUXVldWVQcm9jZXNzUGFnZUVudHJpZXModm9s YXRpbGUgUXVldWVQb3NpdGlvbiAqY3VycmVudCwKIAkJCQkJCQkJCQkgUXVldWVQb3NpdGlv biBzdG9wLAogCQkJCQkJCQkJCSBjaGFyICpwYWdlX2J1ZmZlciwKLQkJCQkJCQkJCQkgU25h cHNob3Qgc25hcHNob3QpOworCQkJCQkJCQkJCSBTbmFwc2hvdCBzbmFwc2hvdCwKKwkJCQkJ CQkJCQkgYm9vbCAqaW50ZXJlc3RlZCk7CiBzdGF0aWMgdm9pZCBhc3luY1F1ZXVlQWR2YW5j ZVRhaWwodm9pZCk7CiBzdGF0aWMgdm9pZCBQcm9jZXNzSW5jb21pbmdOb3RpZnkoYm9vbCBm bHVzaCk7CiBzdGF0aWMgYm9vbCBBc3luY0V4aXN0c1BlbmRpbmdOb3RpZnkoTm90aWZpY2F0 aW9uICpuKTsKQEAgLTY4Myw2ICs2OTIsMTMgQEAgQXN5bmNTaG1lbUluaXQodm9pZCkKIAkJ YXN5bmNRdWV1ZUNvbnRyb2wtPmxhc3RRdWV1ZUZpbGxXYXJuID0gMDsKIAkJYXN5bmNRdWV1 ZUNvbnRyb2wtPmNoYW5uZWxIYXNoRFNBID0gRFNBX0hBTkRMRV9JTlZBTElEOwogCQlhc3lu Y1F1ZXVlQ29udHJvbC0+Y2hhbm5lbEhhc2hEU0ggPSBEU0hBU0hfSEFORExFX0lOVkFMSUQ7 CisJCXBnX2F0b21pY19pbml0X3UzMigmYXN5bmNRdWV1ZUNvbnRyb2wtPnNpZ25hbGVkTmVl ZGVkLCAwKTsKKwkJcGdfYXRvbWljX2luaXRfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+YXZv aWRlZFdha2V1cHMsIDApOworCQlwZ19hdG9taWNfaW5pdF91MzIoJmFzeW5jUXVldWVDb250 cm9sLT5hbHJlYWR5QWR2YW5jaW5nLCAwKTsKKwkJcGdfYXRvbWljX2luaXRfdTMyKCZhc3lu Y1F1ZXVlQ29udHJvbC0+c2lnbmFsZWRVbmNlcnRhaW4sIDApOworCQlwZ19hdG9taWNfaW5p dF91MzIoJmFzeW5jUXVldWVDb250cm9sLT5hbHJlYWR5QWhlYWQsIDApOworCQlwZ19hdG9t aWNfaW5pdF91MzIoJmFzeW5jUXVldWVDb250cm9sLT5uZWNlc3NhcnlXYWtldXBzLCAwKTsK KwkJcGdfYXRvbWljX2luaXRfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+dW5uZWNlc3NhcnlX YWtldXBzLCAwKTsKIAogCQlmb3IgKGludCBpID0gMDsgaSA8IE1heEJhY2tlbmRzOyBpKysp CiAJCXsKQEAgLTk5Nyw2ICsxMDEzLDgxIEBAIHBnX2xpc3RlbmluZ19jaGFubmVscyhQR19G VU5DVElPTl9BUkdTKQogCVNSRl9SRVRVUk5fRE9ORShmdW5jY3R4KTsKIH0KIAorLyoKKyAq IFNRTCBmdW5jdGlvbjogcmV0dXJuIHN0YXRpc3RpY3MgYWJvdXQgTk9USUZZIHdha2V1cHMK KyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzaW5nbGUgcm93IHdpdGg6CisgKiAt IG5lY2Vzc2FyeV93YWtldXBzOiB3YWtldXBzIHdoZXJlIGF0IGxlYXN0IG9uZSBtZXNzYWdl IHdhcyBpbnRlcmVzdGluZworICogLSB1bm5lY2Vzc2FyeV93YWtldXBzOiB3YWtldXBzIHdo ZXJlIG5vIG1lc3NhZ2VzIHdlcmUgaW50ZXJlc3RpbmcKKyAqIC0gZGlyZWN0X2FkdmFuY2Vt ZW50c19zdWNjZXNzOiBkaXJlY3RseSBhZHZhbmNlZAorICogLSBhbHJlYWR5X2FkdmFuY2lu ZzogYWxyZWFkeSBhZHZhbmNpbmcgaXRzIHBvc2l0aW9uCisgKiAtIHNpZ25hbGVkX3VuY2Vy dGFpbjogc2lnbmFsZWQgZHVlIHRvIHVuY2VydGFpbiBuZWVkCisgKiAtIGFscmVhZHlfYWhl YWQ6IGFscmVhZHkgYWhlYWQsIG5vIGFjdGlvbiBuZWVkZWQKKyAqLworRGF0dW0KK3BnX2dl dF9hc3luY193YWtldXBfc3RhdHMoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlUdXBsZURlc2MJ dHVwZGVzYzsKKwlEYXR1bQkJdmFsdWVzWzddOworCWJvb2wJCW51bGxzWzddOworCUhlYXBU dXBsZQl0dXBsZTsKKwl1aW50MzIJCXNpZ25hbGVkX25lZWRlZDsKKwl1aW50MzIJCWRpcmVj dF9hZHZhbmNlbWVudHNfc3VjY2VzczsKKwl1aW50MzIJCWFscmVhZHlfYWR2YW5jaW5nOwor CXVpbnQzMgkJc2lnbmFsZWRfdW5jZXJ0YWluOworCXVpbnQzMgkJYWxyZWFkeV9haGVhZDsK Kwl1aW50MzIJCW5lY2Vzc2FyeV93YWtldXBzOworCXVpbnQzMgkJdW5uZWNlc3Nhcnlfd2Fr ZXVwczsKKworCS8qIEJ1aWxkIGEgdHVwbGUgZGVzY3JpcHRvciBmb3Igb3VyIHJlc3VsdCB0 eXBlICovCisJaWYgKGdldF9jYWxsX3Jlc3VsdF90eXBlKGZjaW5mbywgTlVMTCwgJnR1cGRl c2MpICE9IFRZUEVGVU5DX0NPTVBPU0lURSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJy Y29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJIGVycm1zZygiZnVu Y3Rpb24gcmV0dXJuaW5nIHJlY29yZCBjYWxsZWQgaW4gY29udGV4dCB0aGF0IGNhbm5vdCBh Y2NlcHQgdHlwZSByZWNvcmQiKSkpOworCisJLyogUmVhZCB0aGUgYXRvbWljIGNvdW50ZXJz ICovCisJc2lnbmFsZWRfbmVlZGVkID0gcGdfYXRvbWljX3JlYWRfdTMyKCZhc3luY1F1ZXVl Q29udHJvbC0+c2lnbmFsZWROZWVkZWQpOworCWRpcmVjdF9hZHZhbmNlbWVudHNfc3VjY2Vz cyA9IHBnX2F0b21pY19yZWFkX3UzMigmYXN5bmNRdWV1ZUNvbnRyb2wtPmF2b2lkZWRXYWtl dXBzKTsKKwlhbHJlYWR5X2FkdmFuY2luZyA9IHBnX2F0b21pY19yZWFkX3UzMigmYXN5bmNR dWV1ZUNvbnRyb2wtPmFscmVhZHlBZHZhbmNpbmcpOworCXNpZ25hbGVkX3VuY2VydGFpbiA9 IHBnX2F0b21pY19yZWFkX3UzMigmYXN5bmNRdWV1ZUNvbnRyb2wtPnNpZ25hbGVkVW5jZXJ0 YWluKTsKKwlhbHJlYWR5X2FoZWFkID0gcGdfYXRvbWljX3JlYWRfdTMyKCZhc3luY1F1ZXVl Q29udHJvbC0+YWxyZWFkeUFoZWFkKTsKKwluZWNlc3Nhcnlfd2FrZXVwcyA9IHBnX2F0b21p Y19yZWFkX3UzMigmYXN5bmNRdWV1ZUNvbnRyb2wtPm5lY2Vzc2FyeVdha2V1cHMpOworCXVu bmVjZXNzYXJ5X3dha2V1cHMgPSBwZ19hdG9taWNfcmVhZF91MzIoJmFzeW5jUXVldWVDb250 cm9sLT51bm5lY2Vzc2FyeVdha2V1cHMpOworCisJLyogRmlsbCBpbiB0aGUgdmFsdWVzICov CisJbWVtc2V0KG51bGxzLCAwLCBzaXplb2YobnVsbHMpKTsKKwl2YWx1ZXNbMF0gPSBJbnQ2 NEdldERhdHVtKChpbnQ2NCkgc2lnbmFsZWRfbmVlZGVkKTsKKwl2YWx1ZXNbMV0gPSBJbnQ2 NEdldERhdHVtKChpbnQ2NCkgZGlyZWN0X2FkdmFuY2VtZW50c19zdWNjZXNzKTsKKwl2YWx1 ZXNbMl0gPSBJbnQ2NEdldERhdHVtKChpbnQ2NCkgYWxyZWFkeV9hZHZhbmNpbmcpOworCXZh bHVlc1szXSA9IEludDY0R2V0RGF0dW0oKGludDY0KSBzaWduYWxlZF91bmNlcnRhaW4pOwor CXZhbHVlc1s0XSA9IEludDY0R2V0RGF0dW0oKGludDY0KSBhbHJlYWR5X2FoZWFkKTsKKwl2 YWx1ZXNbNV0gPSBJbnQ2NEdldERhdHVtKChpbnQ2NCkgbmVjZXNzYXJ5X3dha2V1cHMpOwor CXZhbHVlc1s2XSA9IEludDY0R2V0RGF0dW0oKGludDY0KSB1bm5lY2Vzc2FyeV93YWtldXBz KTsKKworCXR1cGxlID0gaGVhcF9mb3JtX3R1cGxlKHR1cGRlc2MsIHZhbHVlcywgbnVsbHMp OworCVBHX1JFVFVSTl9EQVRVTShIZWFwVHVwbGVHZXREYXR1bSh0dXBsZSkpOworfQorCisv KgorICogU1FMIGZ1bmN0aW9uOiByZXNldCBOT1RJRlkgd2FrZXVwIHN0YXRpc3RpY3MKKyAq CisgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBhbGwgdGhlIGFzeW5jIHdha2V1cCBjb3VudGVy cyB0byB6ZXJvLgorICovCitEYXR1bQorcGdfcmVzZXRfYXN5bmNfd2FrZXVwX3N0YXRzKFBH X0ZVTkNUSU9OX0FSR1MpCit7CisJLyogUmVzZXQgYWxsIHRoZSBhdG9taWMgY291bnRlcnMg dG8gemVybyAqLworCXBnX2F0b21pY193cml0ZV91MzIoJmFzeW5jUXVldWVDb250cm9sLT5z aWduYWxlZE5lZWRlZCwgMCk7CisJcGdfYXRvbWljX3dyaXRlX3UzMigmYXN5bmNRdWV1ZUNv bnRyb2wtPmF2b2lkZWRXYWtldXBzLCAwKTsKKwlwZ19hdG9taWNfd3JpdGVfdTMyKCZhc3lu Y1F1ZXVlQ29udHJvbC0+YWxyZWFkeUFkdmFuY2luZywgMCk7CisJcGdfYXRvbWljX3dyaXRl X3UzMigmYXN5bmNRdWV1ZUNvbnRyb2wtPnNpZ25hbGVkVW5jZXJ0YWluLCAwKTsKKwlwZ19h dG9taWNfd3JpdGVfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+YWxyZWFkeUFoZWFkLCAwKTsK KwlwZ19hdG9taWNfd3JpdGVfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+bmVjZXNzYXJ5V2Fr ZXVwcywgMCk7CisJcGdfYXRvbWljX3dyaXRlX3UzMigmYXN5bmNRdWV1ZUNvbnRyb2wtPnVu bmVjZXNzYXJ5V2FrZXVwcywgMCk7CisKKwlQR19SRVRVUk5fVk9JRCgpOworfQorCiAvKgog ICogQXN5bmNfVW5saXN0ZW5PbkV4aXQKICAqCkBAIC0yMDE0LDYgKzIxMDUsNyBAQCBTaWdu YWxCYWNrZW5kcyh2b2lkKQogCiAJCQlBc3NlcnQocGlkICE9IEludmFsaWRQaWQpOwogCisJ CQlwZ19hdG9taWNfZmV0Y2hfYWRkX3UzMigmYXN5bmNRdWV1ZUNvbnRyb2wtPnNpZ25hbGVk TmVlZGVkLCAxKTsKIAkJCVFVRVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJTkcoaSkgPSB0cnVl OwogCQkJcGlkc1tjb3VudF0gPSBwaWQ7CiAJCQlwcm9jbm9zW2NvdW50XSA9IGk7CkBAIC0y MDQ5LDcgKzIxNDEsMTQgQEAgU2lnbmFsQmFja2VuZHModm9pZCkKIAkJCQkgKiBjdXJyZW50 bHkgYWR2YW5jaW5nIGl0cyBwb3NpdGlvbi4KIAkJCQkgKi8KIAkJCQlpZiAoIVFVRVVFX0JB Q0tFTkRfQURWQU5DSU5HX1BPUyhpKSkKKwkJCQl7CiAJCQkJCVFVRVVFX0JBQ0tFTkRfUE9T KGkpID0gcXVldWVIZWFkQWZ0ZXJXcml0ZTsKKwkJCQkJcGdfYXRvbWljX2ZldGNoX2FkZF91 MzIoJmFzeW5jUXVldWVDb250cm9sLT5hdm9pZGVkV2FrZXVwcywgMSk7CisJCQkJfQorCQkJ CWVsc2UKKwkJCQl7CisJCQkJCXBnX2F0b21pY19mZXRjaF9hZGRfdTMyKCZhc3luY1F1ZXVl Q29udHJvbC0+YWxyZWFkeUFkdmFuY2luZywgMSk7CisJCQkJfQogCQkJfQogCQkJZWxzZSBp ZiAoUVVFVUVfUE9TX1BSRUNFREVTKHBvcywgcXVldWVIZWFkQmVmb3JlV3JpdGUpKQogCQkJ ewpAQCAtMjA2MCw2ICsyMTU5LDcgQEAgU2lnbmFsQmFja2VuZHModm9pZCkKIAkJCQkgKi8K IAkJCQlBc3NlcnQocGlkICE9IEludmFsaWRQaWQpOwogCisJCQkJcGdfYXRvbWljX2ZldGNo X2FkZF91MzIoJmFzeW5jUXVldWVDb250cm9sLT5zaWduYWxlZFVuY2VydGFpbiwgMSk7CiAJ CQkJUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSA9IHRydWU7CiAJCQkJcGlkc1tj b3VudF0gPSBwaWQ7CiAJCQkJcHJvY25vc1tjb3VudF0gPSBpOwpAQCAtMjA3MSw2ICsyMTcx LDcgQEAgU2lnbmFsQmFja2VuZHModm9pZCkKIAkJCQkgKiBUaGUgYmFja2VuZCBpcyBhbHJl YWR5IGFoZWFkIG9mIHRoZSBub3RpZmljYXRpb25zIHdlIHdyb3RlLgogCQkJCSAqIE5vIG5l ZWQgdG8gZG8gYW55dGhpbmcuCiAJCQkJICovCisJCQkJcGdfYXRvbWljX2ZldGNoX2FkZF91 MzIoJmFzeW5jUXVldWVDb250cm9sLT5hbHJlYWR5QWhlYWQsIDEpOwogCQkJCUFzc2VydChR VUVVRV9QT1NfUFJFQ0VERVMocXVldWVIZWFkQmVmb3JlV3JpdGUsIHBvcykpOwogCQkJfQog CQl9CkBAIC0yMzAxLDYgKzI0MDIsNyBAQCBhc3luY1F1ZXVlUmVhZEFsbE5vdGlmaWNhdGlv bnModm9pZCkKIAl2b2xhdGlsZSBRdWV1ZVBvc2l0aW9uIHBvczsKIAlRdWV1ZVBvc2l0aW9u IGhlYWQ7CiAJU25hcHNob3QJc25hcHNob3Q7CisJYm9vbAkJaW50ZXJlc3RlZCA9IGZhbHNl OwogCiAJLyogcGFnZV9idWZmZXIgbXVzdCBiZSBhZGVxdWF0ZWx5IGFsaWduZWQsIHNvIHVz ZSBhIHVuaW9uICovCiAJdW5pb24KQEAgLTI0MzUsNyArMjUzNyw4IEBAIGFzeW5jUXVldWVS ZWFkQWxsTm90aWZpY2F0aW9ucyh2b2lkKQogCQkJICovCiAJCQlyZWFjaGVkU3RvcCA9IGFz eW5jUXVldWVQcm9jZXNzUGFnZUVudHJpZXMoJnBvcywgaGVhZCwKIAkJCQkJCQkJCQkJCQkg ICBwYWdlX2J1ZmZlci5idWYsCi0JCQkJCQkJCQkJCQkJICAgc25hcHNob3QpOworCQkJCQkJ CQkJCQkJCSAgIHNuYXBzaG90LAorCQkJCQkJCQkJCQkJCSAgICZpbnRlcmVzdGVkKTsKIAkJ fSB3aGlsZSAoIXJlYWNoZWRTdG9wKTsKIAl9CiAJUEdfRklOQUxMWSgpOwpAQCAtMjQ1MCw2 ICsyNTUzLDExIEBAIGFzeW5jUXVldWVSZWFkQWxsTm90aWZpY2F0aW9ucyh2b2lkKQogCX0K IAlQR19FTkRfVFJZKCk7CiAKKwlpZiAoaW50ZXJlc3RlZCkKKwkJcGdfYXRvbWljX2ZldGNo X2FkZF91MzIoJmFzeW5jUXVldWVDb250cm9sLT5uZWNlc3NhcnlXYWtldXBzLCAxKTsKKwll bHNlCisJCXBnX2F0b21pY19mZXRjaF9hZGRfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+dW5u ZWNlc3NhcnlXYWtldXBzLCAxKTsKKwogCS8qIERvbmUgd2l0aCBzbmFwc2hvdCAqLwogCVVu cmVnaXN0ZXJTbmFwc2hvdChzbmFwc2hvdCk7CiB9CkBAIC0yNDc0LDcgKzI1ODIsOCBAQCBz dGF0aWMgYm9vbAogYXN5bmNRdWV1ZVByb2Nlc3NQYWdlRW50cmllcyh2b2xhdGlsZSBRdWV1 ZVBvc2l0aW9uICpjdXJyZW50LAogCQkJCQkJCSBRdWV1ZVBvc2l0aW9uIHN0b3AsCiAJCQkJ CQkJIGNoYXIgKnBhZ2VfYnVmZmVyLAotCQkJCQkJCSBTbmFwc2hvdCBzbmFwc2hvdCkKKwkJ CQkJCQkgU25hcHNob3Qgc25hcHNob3QsCisJCQkJCQkJIGJvb2wgKmludGVyZXN0ZWQpCiB7 CiAJYm9vbAkJcmVhY2hlZFN0b3AgPSBmYWxzZTsKIAlib29sCQlyZWFjaGVkRW5kT2ZQYWdl OwpAQCAtMjUzNSw2ICsyNjQ0LDkgQEAgYXN5bmNRdWV1ZVByb2Nlc3NQYWdlRW50cmllcyh2 b2xhdGlsZSBRdWV1ZVBvc2l0aW9uICpjdXJyZW50LAogCQkJCQljaGFyCSAgICpwYXlsb2Fk ID0gcWUtPmRhdGEgKyBzdHJsZW4oY2hhbm5lbCkgKyAxOwogCiAJCQkJCU5vdGlmeU15RnJv bnRFbmQoY2hhbm5lbCwgcGF5bG9hZCwgcWUtPnNyY1BpZCk7CisKKwkJCQkJLyogTWFyayB3 ZXJlIGludGVyZXN0ZWQgaW4gYXQgbGVhc3Qgb25lIG1lc3NhZ2UgKi8KKwkJCQkJKmludGVy ZXN0ZWQgPSB0cnVlOwogCQkJCX0KIAkJCX0KIAkJCWVsc2UKZGlmZiAtLWdpdCBhL3NyYy9p bmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3By b2MuZGF0CmluZGV4IDkxMjFhMzgyZjc2Li4wYmJkN2RiMzljNyAxMDA2NDQKLS0tIGEvc3Jj L2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9n L3BnX3Byb2MuZGF0CkBAIC04NTcxLDcgKzg1NzEsMTggQEAKICAgcHJvbmFtZSA9PiAncGdf bm90aWZpY2F0aW9uX3F1ZXVlX3VzYWdlJywgcHJvdm9sYXRpbGUgPT4gJ3YnLAogICBwcm9w YXJhbGxlbCA9PiAncicsIHByb3JldHR5cGUgPT4gJ2Zsb2F0OCcsIHByb2FyZ3R5cGVzID0+ ICcnLAogICBwcm9zcmMgPT4gJ3BnX25vdGlmaWNhdGlvbl9xdWV1ZV91c2FnZScgfSwKLQor eyBvaWQgPT4gJzkzMTUnLAorICBkZXNjciA9PiAnZ2V0IHN0YXRpc3RpY3MgYWJvdXQgTk9U SUZZIHdha2V1cHMnLAorICBwcm9uYW1lID0+ICdwZ19nZXRfYXN5bmNfd2FrZXVwX3N0YXRz JywgcHJvdm9sYXRpbGUgPT4gJ3YnLAorICBwcm9wYXJhbGxlbCA9PiAncicsIHByb3JldHR5 cGUgPT4gJ3JlY29yZCcsIHByb2FyZ3R5cGVzID0+ICcnLAorICBwcm9hbGxhcmd0eXBlcyA9 PiAne2ludDgsaW50OCxpbnQ4LGludDgsaW50OCxpbnQ4LGludDh9JywgcHJvYXJnbW9kZXMg PT4gJ3tvLG8sbyxvLG8sbyxvfScsCisgIHByb2FyZ25hbWVzID0+ICd7c2lnbmFsZWRfbmVl ZGVkLGF2b2lkZWRfd2FrZXVwcyxhbHJlYWR5X2FkdmFuY2luZyxzaWduYWxlZF91bmNlcnRh aW4sYWxyZWFkeV9haGVhZCxuZWNlc3Nhcnlfd2FrZXVwcyx1bm5lY2Vzc2FyeV93YWtldXBz fScsCisgIHByb3NyYyA9PiAncGdfZ2V0X2FzeW5jX3dha2V1cF9zdGF0cycgfSwKK3sgb2lk ID0+ICc5MzE2JywKKyAgZGVzY3IgPT4gJ3Jlc2V0IHN0YXRpc3RpY3MgYWJvdXQgTk9USUZZ IHdha2V1cHMnLAorICBwcm9uYW1lID0+ICdwZ19yZXNldF9hc3luY193YWtldXBfc3RhdHMn LCBwcm92b2xhdGlsZSA9PiAndicsCisgIHByb3BhcmFsbGVsID0+ICdyJywgcHJvcmV0dHlw ZSA9PiAndm9pZCcsIHByb2FyZ3R5cGVzID0+ICcnLAorICBwcm9zcmMgPT4gJ3BnX3Jlc2V0 X2FzeW5jX3dha2V1cF9zdGF0cycgfSwKICMgc2hhcmVkIG1lbW9yeSB1c2FnZQogeyBvaWQg PT4gJzUwNTInLCBkZXNjciA9PiAnYWxsb2NhdGlvbnMgZnJvbSB0aGUgbWFpbiBzaGFyZWQg bWVtb3J5IHNlZ21lbnQnLAogICBwcm9uYW1lID0+ICdwZ19nZXRfc2htZW1fYWxsb2NhdGlv bnMnLCBwcm9yb3dzID0+ICc1MCcsIHByb3JldHNldCA9PiAndCcsCg== --66fec88f66d248cf9926460e5094cf46--