Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1q27Si-0005L9-R2 for pgsql-hackers@arkaria.postgresql.org; Thu, 25 May 2023 09:40:49 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1q27Sg-0002sx-Qb for pgsql-hackers@arkaria.postgresql.org; Thu, 25 May 2023 09:40:46 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1q27Sg-0002sm-5z for pgsql-hackers@lists.postgresql.org; Thu, 25 May 2023 09:40:46 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1q27SX-0022wj-1t for pgsql-hackers@lists.postgresql.org; Thu, 25 May 2023 09:40:45 +0000 Received: from [192.168.28.53] (unknown [192.168.28.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: a.lepikhov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 2D6C1E21052; Thu, 25 May 2023 12:41:47 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1685007707; bh=WqsXSllm4NFhSwYbFkrUIjhBcqEUM/AINyjroT7q01w=; h=Message-ID:Date:User-Agent:Subject:To:Cc:References:From: In-Reply-To:From; b=GhhifPMgaLkjGYKVj0w7BfiDsrXYDpCE/mwQsJI4GhKX4eCXldwqERHkcq+R/uf8n 7xVjnwThoJegogSTTYykflRXZF/CHWVOooupaV0guznrhoszwL1G+aUPUqa+H2XDx/ SOF7vAUBiNejYpOggl5gSm0S+r9NIHvmEAMf8yIBNqliW30MAqfblTxvUeKE5s2mBJ 5WJnAUCakBQ7UXMxglhG1D5tF6SKiYJp0Jn8MPzOOeFT+APq1HT2gFqqlHHwXTsa4H 3O7brfpJv3zk6IsLgFkU8WjYSI+LR6E50EV9ICdHDM4tShA38lgjVyIh9PP80VOcLZ lw/OuDYuEBdGA== Content-Type: multipart/mixed; boundary="------------XRM4TFJuv9jcvMliRpSKYRD6" Message-ID: Date: Thu, 25 May 2023 14:40:35 +0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.10.1 Subject: Re: Removing unneeded self joins To: "Gregory Stark (as CFM)" , =?UTF-8?Q?Micha=c5=82_K=c5=82eczek?= Cc: PostgreSQL Hackers References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <13021914.uLZWGnKmhe@aivenronan> <2375492.jE0xQCEvom@aivenronan> <0fd15c10-eaa5-51bd-b5c7-e635fe03a94d@postgrespro.ru> <20221206184643.zya44h5auv6f45zp@awork3.anarazel.de> <36579124-f9d9-a51e-38b3-af3511921c7e@postgrespro.ru> <88079CBD-B5BB-4C61-A68B-A8C67599E1C7@kleczek.org> Content-Language: en-US From: Andrey Lepikhov Organization: Postgres Professional In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------XRM4TFJuv9jcvMliRpSKYRD6 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 3/6/23 10:30, Michał Kłeczek wrote: > Hi All, > > I just wanted to ask about the status and plans for this patch. > I can see it being stuck at “Waiting for Author” status in several > commit tests. > > I think this patch would be really beneficial for us as we heavily use > views to structure out code. > Each view is responsible for providing some calculated values and they > are joined in a query to retrieve the full set of information. > > Not sure how the process works and how I could help (I am absolutely > not capable of helping with coding I am afraid - but could sponsor a > (small :) ) bounty to speed things up). Yes, I am still working on this feature. Because of significant changes in the optimizer code which Tom & Richard had been doing last months, I didn't touch it for a while. But now this work can be continued. Current patch is rebased on current master. Because of the nullable_rels logic, introduced recently, ojrelids were highly spreaded across planner bitmapsets. So, JE logic was changed. But now, I'm less happy with the code. It seems we need to refactor it: 1. According to reports of some performance engineers, the feature can cause overhead ~0.5% on trivial queries without joins at all. We should discover the patch and find the way for quick and cheap return, if the statement contains no one join or, maybe stronger, no one self join. 2. During join elimination we replace clauses like 'x=x' with 'x IS NOT NULL'. It is a weak point because we change clause semantic (mergejoinable to non-mergejoinable, in this example) and could forget consistently change some RestrictInfo fields. 3. In the previous versions we changed the remove_rel_from_query routine trying to use it in both 'Useless outer join' and 'Self join' elimination optimizations. Now, because of the 'ojrelid' field it looks too complicated. Do we need to split this routine again? -- Regards Andrey Lepikhov Postgres Professional --------------XRM4TFJuv9jcvMliRpSKYRD6 Content-Type: text/x-patch; charset=UTF-8; name="v40-0001-Remove-self-joins.patch" Content-Disposition: attachment; filename="v40-0001-Remove-self-joins.patch" Content-Transfer-Encoding: base64 RnJvbSBjYjQzNDA1NzdkYWIwZThjZjU1MzFlOTkzNGY1NzM0ZmRhMTc4NDkwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXkgTGVwaWtob3YgPGEubGVwaWtob3ZAcG9z dGdyZXNwcm8ucnU+CkRhdGU6IE1vbiwgMTUgTWF5IDIwMjMgMDk6MDQ6NTEgKzA1MDAKU3Vi amVjdDogW1BBVENIXSBSZW1vdmUgc2VsZi1qb2lucy4KCkEgU2VsZiBKb2luIEVsaW1pbmF0 aW9uIChTSkUpIGZlYXR1cmUgcmVtb3ZlcyBpbm5lciBqb2luIG9mIHBsYWluIHRhYmxlIHRv IGl0c2VsZgppbiBhIHF1ZXJ5IHRyZWUgaWYgY2FuIGJlIHByb3ZlZCB0aGF0IHRoZSBqb2lu IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgc2Nhbi4KVGhlIHByb29mIGJhc2VkIG9uIGlubmVy cmVsX2lzX3VuaXF1ZSBtYWNoaW5lcnkuCgpXZSBjYW4gcmVtb3ZlIGEgc2VsZi1qb2luIHdo ZW4gZm9yIGVhY2ggb3V0ZXIgcm93OgoxLiBBdCBtb3N0IG9uZSBpbm5lciByb3cgbWF0Y2hl cyB0aGUgam9pbiBjbGF1c2UuCjIuIElmIHRoZSBqb2luIHRhcmdldCBsaXN0IGNvbnRhaW5z IGFueSBpbm5lciB2YXJzLCBhbiBpbm5lciByb3cKbXVzdCBiZSAocGh5c2ljYWxseSkgdGhl IHNhbWUgcm93IGFzIHRoZSBvdXRlciBvbmUuCgpJbiB0aGlzIHBhdGNoIHdlIHVzZSB0aGUg bmV4dCBhcHByb2FjaCB0byBpZGVudGlmeSBhIHNlbGYtam9pbjoKMS4gQ29sbGVjdCBhbGwg bWVyZ2Vqb2luYWJsZSBqb2luIHF1YWxzIHdoaWNoIGxvb2sgbGlrZSBhLnggPSBiLngKMi4g Q2hlY2sgaW5uZXJyZWxfaXNfdW5pcXVlKCkgZm9yIHRoZSBxdWFsIGxpc3QgZnJvbSAoMSku IElmIGl0CnJldHVybnMgdHJ1ZSwgdGhlbiBvdXRlciByb3cgbWF0Y2hlcyBvbmx5IHRoZSBz YW1lIHJvdyBmcm9tIHRoZSBpbm5lcgpyZWxhdGlvbi4KMy4gSWYgdW5pcXVlbmVzcyBvZiBv dXRlciByZWxhdGlvbiBpcyBkZWR1Y2VkIGZyb20gYmFzZXJlc3RyaWN0aW5mbyBjbGF1c2Ug bGlrZQoneD1jb25zdCcgb24gdW5pcXVlIGZpZWxkKHMpLCBjaGVjayB3aGF0IHRoZSBpbm5l ciBoYXMgdGhlIHNhbWUgY2xhdXNlIHdpdGggdGhlCnNhbWUgY29uc3RhbnQocykuCjQuIENv bXBhcmUgUm93TWFya3Mgb2YgaW5uZXIgYW5kIG91dGVyIHJlbGF0aW9ucy4gVGhleSBtdXN0 IGhhdmUgdGhlIHNhbWUKc3RyZW5ndGguCgpTb21lIHJlZ3Jlc3Npb24gdGVzdHMgY2hhbmdl ZCBkdWUgdG8gc2VsZi1qb2luIHJlbW92YWwgbG9naWMuCi0tLQogZG9jL3NyYy9zZ21sL2Nv bmZpZy5zZ21sICAgICAgICAgICAgICAgICAgfCAgIDE2ICsKIHNyYy9iYWNrZW5kL29wdGlt aXplci9wYXRoL2luZHhwYXRoLmMgICAgIHwgICAzOCArCiBzcmMvYmFja2VuZC9vcHRpbWl6 ZXIvcGxhbi9hbmFseXplam9pbnMuYyB8IDEwOTMgKysrKysrKysrKysrKysrKysrKystCiBz cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubWFpbi5jICAgICB8ICAgIDUgKwogc3Jj L2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMgICAgICAgfCAgIDIyICsKIHNyYy9p bmNsdWRlL29wdGltaXplci9wYXRocy5oICAgICAgICAgICAgIHwgICAgMyArCiBzcmMvaW5j bHVkZS9vcHRpbWl6ZXIvcGxhbm1haW4uaCAgICAgICAgICB8ICAgIDcgKwogc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dCAgfCAgIDMyICsKIHNyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgICAgICAgIHwgIDc3NCArKysrKysrKysrKysrKysK IHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0ICAgIHwgICAgMyArLQog c3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwgICAgICAgfCAgIDE2ICsKIHNy Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsICAgICAgICAgICAgIHwgIDM0MCArKysrKysr CiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCAgICAgICAgICB8ICAgIDIgKwog MTMgZmlsZXMgY2hhbmdlZCwgMjMxMyBpbnNlcnRpb25zKCspLCAzOCBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwgYi9kb2Mvc3JjL3NnbWwv Y29uZmlnLnNnbWwKaW5kZXggNWRhNzRiM2M0MC4uYjQ3ZDExNzU5ZSAxMDA2NDQKLS0tIGEv ZG9jL3NyYy9zZ21sL2NvbmZpZy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9jb25maWcuc2dt bApAQCAtNTQzNyw2ICs1NDM3LDIyIEBAIEFOWSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFt ZXRlciI+bnVtX3N5bmM8L3JlcGxhY2VhYmxlPiAoIDxyZXBsYWNlYWJsZSBjbGFzcz0iCiAg ICAgICA8L2xpc3RpdGVtPgogICAgICA8L3Zhcmxpc3RlbnRyeT4KIAorICAgICA8dmFybGlz dGVudHJ5IGlkPSJndWMtZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsIiB4cmVmbGFiZWw9ImVu YWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCI+CisgICAgICA8dGVybT48dmFybmFtZT5lbmFibGVf c2VsZl9qb2luX3JlbW92YWw8L3Zhcm5hbWU+ICg8dHlwZT5ib29sZWFuPC90eXBlPikKKyAg ICAgIDxpbmRleHRlcm0+CisgICAgICAgPHByaW1hcnk+PHZhcm5hbWU+ZW5hYmxlX3NlbGZf am9pbl9yZW1vdmFsPC92YXJuYW1lPiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcjwvcHJpbWFy eT4KKyAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgPC90ZXJtPgorICAgICAgPGxpc3RpdGVt PgorICAgICAgIDxwYXJhPgorICAgICAgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHF1ZXJ5 IHBsYW5uZXIncyBvcHRpbWl6YXRpb24gd2hpY2ggYW5hbHlzZXMKKyAgICAgICAgcXVlcnkg dHJlZSBhbmQgcmVwbGFjZXMgc2VsZiBqb2lucyB3aXRoIHNlbWFudGljYWxseSBlcXVpdmFs ZW50IHNpbmdsZQorICAgICAgICBzY2Fucy4gVGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gb25s eSBwbGFpbiB0YWJsZXMuCisgICAgICAgIFRoZSBkZWZhdWx0IGlzIDxsaXRlcmFsPm9uPC9s aXRlcmFsPi4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8L3Zh cmxpc3RlbnRyeT4KKwogICAgICA8dmFybGlzdGVudHJ5IGlkPSJndWMtZW5hYmxlLXNlcXNj YW4iIHhyZWZsYWJlbD0iZW5hYmxlX3NlcXNjYW4iPgogICAgICAgPHRlcm0+PHZhcm5hbWU+ ZW5hYmxlX3NlcXNjYW48L3Zhcm5hbWU+ICg8dHlwZT5ib29sZWFuPC90eXBlPikKICAgICAg IDxpbmRleHRlcm0+CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9p bmR4cGF0aC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwppbmRl eCAxNDM2ZGJjMmYyLi4xYjFhYTkwODNjIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGF0aC9pbmR4cGF0aC5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRo L2luZHhwYXRoLmMKQEAgLTM0OTEsNiArMzQ5MSwyMSBAQCBib29sCiByZWxhdGlvbl9oYXNf dW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAog CQkJCQkJCSAgTGlzdCAqcmVzdHJpY3RsaXN0LAogCQkJCQkJCSAgTGlzdCAqZXhwcmxpc3Qs IExpc3QgKm9wcmxpc3QpCit7CisJcmV0dXJuIHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhf ZXh0KHJvb3QsIHJlbCwgcmVzdHJpY3RsaXN0LAorCQkJCQkJCQkJCSBleHBybGlzdCwgb3By bGlzdCwgTlVMTCk7Cit9CisKKy8qCisgKiByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4 dAorICogaWYgZXh0cmFfY2xhdXNlcyBpc24ndCBOVUxMLCByZXR1cm4gYmFzZXJlc3RyaWN0 aW5mbyBjbGF1c2VzIHdoaWNoIHdlcmUKKyAqIHVzZWQgdG8gZGVyaXZlIHVuaXF1ZW5lc3Mu CisgKi8KK2Jvb2wKK3JlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZXh0KFBsYW5uZXJJbmZv ICpyb290LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkJICBMaXN0ICpyZXN0cmljdGxpc3Qs CisJCQkJCQkJICBMaXN0ICpleHBybGlzdCwgTGlzdCAqb3BybGlzdCwKKwkJCQkJCQkgIExp c3QgKipleHRyYV9jbGF1c2VzKQogewogCUxpc3RDZWxsICAgKmljOwogCkBAIC0zNTQ2LDYg KzM1NjEsNyBAQCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAq cm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCXsKIAkJSW5kZXhPcHRJbmZvICppbmQgPSAoSW5k ZXhPcHRJbmZvICopIGxmaXJzdChpYyk7CiAJCWludAkJCWM7CisJCUxpc3QJICAgKmV4cHJz ID0gTklMOwogCiAJCS8qCiAJCSAqIElmIHRoZSBpbmRleCBpcyBub3QgdW5pcXVlLCBvciBu b3QgaW1tZWRpYXRlbHkgZW5mb3JjZWQsIG9yIGlmIGl0J3MKQEAgLTM1OTQsNiArMzYxMCwy NCBAQCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqcmVsLAogCQkJCWlmIChtYXRjaF9pbmRleF90b19vcGVyYW5kKHJleHBy LCBjLCBpbmQpKQogCQkJCXsKIAkJCQkJbWF0Y2hlZCA9IHRydWU7IC8qIGNvbHVtbiBpcyB1 bmlxdWUgKi8KKworCQkJCQlpZiAoYm1zX21lbWJlcnNoaXAocmluZm8tPmNsYXVzZV9yZWxp ZHMpID09IEJNU19TSU5HTEVUT04pCisJCQkJCXsKKwkJCQkJCU1lbW9yeUNvbnRleHQgb2xk TWVtQ3R4ID0KKwkJCQkJCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhyb290LT5wbGFubmVy X2N4dCk7CisKKwkJCQkJCS8qCisJCQkJCQkgKiBBZGQgZmlsdGVyIGNsYXVzZSBpbnRvIGEg bGlzdCBhbGxvd2luZyBjYWxsZXIgdG8KKwkJCQkJCSAqIGtub3cgaWYgdW5pcXVpbmVzcyBo YXZlIG1hZGUgbm90IG9ubHkgYnkgam9pbgorCQkJCQkJICogY2xhdXNlcy4KKwkJCQkJCSAq LworCQkJCQkJQXNzZXJ0KGJtc19pc19lbXB0eShyaW5mby0+bGVmdF9yZWxpZHMpIHx8CisJ CQkJCQkJICAgYm1zX2lzX2VtcHR5KHJpbmZvLT5yaWdodF9yZWxpZHMpKTsKKwkJCQkJCWlm IChleHRyYV9jbGF1c2VzKQorCQkJCQkJCWV4cHJzID0gbGFwcGVuZChleHBycywgcmluZm8p OworCQkJCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZE1lbUN0eCk7CisJCQkJCX0KKwog CQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0zNjM2LDcgKzM2NzAsMTEgQEAgcmVsYXRp b25faGFzX3VuaXF1ZV9pbmRleF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KnJlbCwKIAogCQkvKiBNYXRjaGVkIGFsbCBrZXkgY29sdW1ucyBvZiB0aGlzIGluZGV4PyAq LwogCQlpZiAoYyA9PSBpbmQtPm5rZXljb2x1bW5zKQorCQl7CisJCQlpZiAoZXh0cmFfY2xh dXNlcykKKwkJCQkqZXh0cmFfY2xhdXNlcyA9IGV4cHJzOwogCQkJcmV0dXJuIHRydWU7CisJ CX0KIAl9CiAKIAlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGxhbi9hbmFseXplam9pbnMuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFu L2FuYWx5emVqb2lucy5jCmluZGV4IGE2MWUzNWY5MmQuLmI1OWVlNjViNWYgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCisrKyBiL3Ny Yy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCkBAIC0yMiw2ICsyMiw3 IEBACiAgKi8KICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCisjaW5jbHVkZSAiY2F0YWxvZy9w Z19jbGFzcy5oIgogI2luY2x1ZGUgIm5vZGVzL25vZGVGdW5jcy5oIgogI2luY2x1ZGUgIm9w dGltaXplci9jbGF1c2VzLmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL2pvaW5pbmZvLmgiCkBA IC0zMywyMyArMzQsNDMgQEAKICNpbmNsdWRlICJvcHRpbWl6ZXIvdGxpc3QuaCIKICNpbmNs dWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKIAorLyoKKyAqIFVuaXF1ZVJlbEluZm8gY2FjaGVz IGEgZmFjdCB0aGF0IGEgcmVsYXRpb24gaXMgdW5pcXVlIHdoZW4gYmVpbmcgam9pbmVkCisg KiB0byBvdGhlciByZWxhdGlvbihzKSBzcGVjaWZpZWQgYnkgb3V0ZXJyZWxpZHMuCisgKiBl eHRyYV9jbGF1c2VzIGNvbnRhaW5zIGFkZGl0aW9uYWwgY2xhdXNlcyBmcm9tIGEgYmFzZXJl c3RyaWN0aW5mbyBsaXN0IHRoYXQKKyAqIHdlcmUgdXNlZCB0byBwcm92ZSB1bmlxdWVuZXNz LiBXZSBjYWNoZSBpdCBmb3IgU0ogY2hlY2tpbmcgcHJvY2VkdXJlOiBTSiBjYW4KKyAqIGJl IHJlbW92ZWQgaWYgb3V0ZXIgcmVsYXRpb24gY29udGFpbnMgc3RyaWN0bHkgdGhlIHNhbWUg c2V0IG9mIGNsYXVzZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IFVuaXF1ZVJlbEluZm8KK3sK KwlSZWxpZHMJCW91dGVycmVsaWRzOworCUxpc3QJICAgKmV4dHJhX2NsYXVzZXM7Cit9IFVu aXF1ZVJlbEluZm87CisKK2Jvb2wJCWVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbDsKK2ludAkJ CXNlbGZfam9pbl9zZWFyY2hfbGltaXQ7CisKIC8qIGxvY2FsIGZ1bmN0aW9ucyAqLwogc3Rh dGljIGJvb2wgam9pbl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJvb3QsIFNwZWNpYWxK b2luSW5mbyAqc2ppbmZvKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQ bGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBpbnQgb2pyZWxpZCwKLQkJCQkJCQkJICBS ZWxpZHMgam9pbnJlbGlkcyk7CisJCQkJCSAgUmVsaWRzIGpvaW5yZWxpZHMsIGludCBzdWJz dF9yZWxpZCk7CiBzdGF0aWMgdm9pZCByZW1vdmVfcmVsX2Zyb21fcmVzdHJpY3RpbmZvKFJl c3RyaWN0SW5mbyAqcmluZm8sCi0JCQkJCQkJCQkJIGludCByZWxpZCwgaW50IG9qcmVsaWQp OworCQkJCQkJCQkJCSBpbnQgcmVsaWQsIGludCBvanJlbGlkLCBpbnQgc3Vic3RfcmVsaWQp Owogc3RhdGljIExpc3QgKnJlbW92ZV9yZWxfZnJvbV9qb2lubGlzdChMaXN0ICpqb2lubGlz dCwgaW50IHJlbGlkLCBpbnQgKm5yZW1vdmVkKTsKIHN0YXRpYyBib29sIHJlbF9zdXBwb3J0 c19kaXN0aW5jdG5lc3MoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCk7CiBz dGF0aWMgYm9vbCByZWxfaXNfZGlzdGluY3RfZm9yKFBsYW5uZXJJbmZvICpyb290LCBSZWxP cHRJbmZvICpyZWwsCi0JCQkJCQkJCUxpc3QgKmNsYXVzZV9saXN0KTsKKwkJCQkJCQkJTGlz dCAqY2xhdXNlX2xpc3QsIExpc3QgKipleHRyYV9jbGF1c2VzKTsKIHN0YXRpYyBPaWQJZGlz dGluY3RfY29sX3NlYXJjaChpbnQgY29sbm8sIExpc3QgKmNvbG5vcywgTGlzdCAqb3BpZHMp Owogc3RhdGljIGJvb2wgaXNfaW5uZXJyZWxfdW5pcXVlX2ZvcihQbGFubmVySW5mbyAqcm9v dCwKIAkJCQkJCQkJICAgUmVsaWRzIGpvaW5yZWxpZHMsCiAJCQkJCQkJCSAgIFJlbGlkcyBv dXRlcnJlbGlkcywKIAkJCQkJCQkJICAgUmVsT3B0SW5mbyAqaW5uZXJyZWwsCiAJCQkJCQkJ CSAgIEpvaW5UeXBlIGpvaW50eXBlLAotCQkJCQkJCQkgICBMaXN0ICpyZXN0cmljdGxpc3Qp OworCQkJCQkJCQkgICBMaXN0ICpyZXN0cmljdGxpc3QsCisJCQkJCQkJCSAgIExpc3QgKipl eHRyYV9jbGF1c2VzKTsKK3N0YXRpYyB2b2lkIGNoYW5nZV9yaW5mbyhSZXN0cmljdEluZm8g KnJpbmZvLCBJbmRleCBmcm9tLCBJbmRleCB0byk7CitzdGF0aWMgQml0bWFwc2V0ICpjaGFu Z2VfcmVsaWQoUmVsaWRzIHJlbGlkcywgSW5kZXggb2xkSWQsIEluZGV4IG5ld0lkKTsKK3N0 YXRpYyB2b2lkIGNoYW5nZV92YXJubyhFeHByICpleHByLCBJbmRleCBvbGRSZWxpZCwgSW5k ZXggbmV3UmVsaWQpOwogCiAKIC8qCkBAIC05Myw3ICsxMTQsNyBAQCByZXN0YXJ0OgogCQlp ZiAoc2ppbmZvLT5vanJlbGlkICE9IDApCiAJCQlqb2lucmVsaWRzID0gYm1zX2FkZF9tZW1i ZXIoam9pbnJlbGlkcywgc2ppbmZvLT5vanJlbGlkKTsKIAotCQlyZW1vdmVfcmVsX2Zyb21f cXVlcnkocm9vdCwgaW5uZXJyZWxpZCwgc2ppbmZvLT5vanJlbGlkLCBqb2lucmVsaWRzKTsK KwkJcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KHJvb3QsIGlubmVycmVsaWQsIHNqaW5mby0+b2py ZWxpZCwgam9pbnJlbGlkcywgMCk7CiAKIAkJLyogV2UgdmVyaWZ5IHRoYXQgZXhhY3RseSBv bmUgcmVmZXJlbmNlIGdldHMgcmVtb3ZlZCBmcm9tIGpvaW5saXN0ICovCiAJCW5yZW1vdmVk ID0gMDsKQEAgLTMxMiw3ICszMzMsNyBAQCBqb2luX2lzX3JlbW92YWJsZShQbGFubmVySW5m byAqcm9vdCwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8pCiAJICogTm93IHRoYXQgd2UgaGF2 ZSB0aGUgcmVsZXZhbnQgZXF1YWxpdHkgam9pbiBjbGF1c2VzLCB0cnkgdG8gcHJvdmUgdGhl CiAJICogaW5uZXJyZWwgZGlzdGluY3QuCiAJICovCi0JaWYgKHJlbF9pc19kaXN0aW5jdF9m b3Iocm9vdCwgaW5uZXJyZWwsIGNsYXVzZV9saXN0KSkKKwlpZiAocmVsX2lzX2Rpc3RpbmN0 X2Zvcihyb290LCBpbm5lcnJlbCwgY2xhdXNlX2xpc3QsIE5VTEwpKQogCQlyZXR1cm4gdHJ1 ZTsKIAogCS8qCkBAIC0zMjUsMjAgKzM0NiwyNiBAQCBqb2luX2lzX3JlbW92YWJsZShQbGFu bmVySW5mbyAqcm9vdCwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8pCiAKIC8qCiAgKiBSZW1v dmUgdGhlIHRhcmdldCByZWxpZCBmcm9tIHRoZSBwbGFubmVyJ3MgZGF0YSBzdHJ1Y3R1cmVz LCBoYXZpbmcKLSAqIGRldGVybWluZWQgdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY2x1 ZGUgaXQgaW4gdGhlIHF1ZXJ5LgorICogZGV0ZXJtaW5lZCB0aGF0IHRoZXJlIGlzIG5vIG5l ZWQgdG8gaW5jbHVkZSBpdCBpbiB0aGUgcXVlcnkuIE9yIHJlcGxhY2UKKyAqIHdpdGggYW5v dGhlciByZWxpZC4KKyAqIFRvIHJldXNhYmlsaXR5LCB0aGlzIHJvdXRpbmUgY2FuIHdvcmsg aW4gdHdvIG1vZGVzOiBkZWxldGUgcmVsaWQgZnJvbSBhIHBsYW4KKyAqIG9yIHJlcGxhY2Ug aXQuIEl0IGlzIHVzZWQgaW4gcmVwbGFjZSBtb2RlIGluIGEgc2VsZi1qb2luIHJlbW92aW5n IHByb2Nlc3MuCiAgKgogICogV2UgYXJlIG5vdCB0ZXJyaWJseSB0aG9yb3VnaCBoZXJlLiAg V2Ugb25seSBib3RoZXIgdG8gdXBkYXRlIHBhcnRzIG9mCiAgKiB0aGUgcGxhbm5lcidzIGRh dGEgc3RydWN0dXJlcyB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgY29uc3VsdGVkIGxhdGVyLgog ICovCiBzdGF0aWMgdm9pZAogcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpy b290LCBpbnQgcmVsaWQsIGludCBvanJlbGlkLAotCQkJCQkgIFJlbGlkcyBqb2lucmVsaWRz KQorCQkJCQkgIFJlbGlkcyBqb2lucmVsaWRzLCBpbnQgc3Vic3RfcmVsaWQpCiB7CiAJUmVs T3B0SW5mbyAqcmVsID0gZmluZF9iYXNlX3JlbChyb290LCByZWxpZCk7CiAJTGlzdAkgICAq am9pbmluZm9zOwogCUluZGV4CQlydGk7CiAJTGlzdENlbGwgICAqbDsKIAorCS8qIFRlc3Qg b24gaW1wb3NzaWJsZSBjb21iaW5hdGlvbiAqLworCUFzc2VydCgoc3Vic3RfcmVsaWQgPT0g MCkgXiAob2pyZWxpZCA9PSAwKSk7CisKIAkvKgogCSAqIFJlbW92ZSByZWZlcmVuY2VzIHRv IHRoZSByZWwgZnJvbSBvdGhlciBiYXNlcmVscycgYXR0cl9uZWVkZWQgYXJyYXlzLgogCSAq LwpAQCAtMzYyLDE4ICszODksMzAgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJ bmZvICpyb290LCBpbnQgcmVsaWQsIGludCBvanJlbGlkLAogCQkJIGF0dHJvZmYtLSkKIAkJ ewogCQkJb3RoZXJyZWwtPmF0dHJfbmVlZGVkW2F0dHJvZmZdID0KLQkJCQlibXNfZGVsX21l bWJlcihvdGhlcnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0sIHJlbGlkKTsKKwkJCQljaGFu Z2VfcmVsaWQob3RoZXJyZWwtPmF0dHJfbmVlZGVkW2F0dHJvZmZdLCByZWxpZCwgc3Vic3Rf cmVsaWQpOworCisJCQkvKgorCQkJICogYXR0cl9uZWVkZWQgY291bGQgY29udGFpbiAiMCIg YW5kIHdlIGRvbid0IHdhbnQgdG8gZGVsZXRlIGl0LAorCQkJICogZHVlIHRvIHRoZSBsb2dp YyBvZiBTSlIgcmVwbGFjZW1lbnQ6IGl0IGlzIGltcG9zc2libGUgdG8gZGV0ZWN0CisJCQkg KiBTSlIgZm9yIE9VVEVSIGpvaW4sIHNvIGhlcmUgb2pyZWxpZCA9PT0gMCBlYWNoIHRpbWUu CisJCQkqLworCQkJaWYgKHN1YnN0X3JlbGlkICE9IDApCisJCQkJY29udGludWU7CisKIAkJ CW90aGVycmVsLT5hdHRyX25lZWRlZFthdHRyb2ZmXSA9CiAJCQkJYm1zX2RlbF9tZW1iZXIo b3RoZXJyZWwtPmF0dHJfbmVlZGVkW2F0dHJvZmZdLCBvanJlbGlkKTsKIAkJfQorCisJCS8q IFVwZGF0ZSBsYXRlcmFsIHJlZmVyZW5jZXMuICovCisJCWNoYW5nZV92YXJubygoRXhwciAq KSBvdGhlcnJlbC0+bGF0ZXJhbF92YXJzLCByZWxpZCwgc3Vic3RfcmVsaWQpOwogCX0KIAog CS8qCiAJICogVXBkYXRlIGFsbF9iYXNlcmVscyBhbmQgcmVsYXRlZCByZWxpZCBzZXRzLgog CSAqLwotCXJvb3QtPmFsbF9iYXNlcmVscyA9IGJtc19kZWxfbWVtYmVyKHJvb3QtPmFsbF9i YXNlcmVscywgcmVsaWQpOworCXJvb3QtPmFsbF9iYXNlcmVscyA9IGNoYW5nZV9yZWxpZChy b290LT5hbGxfYmFzZXJlbHMsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CiAJcm9vdC0+b3V0ZXJf am9pbl9yZWxzID0gYm1zX2RlbF9tZW1iZXIocm9vdC0+b3V0ZXJfam9pbl9yZWxzLCBvanJl bGlkKTsKLQlyb290LT5hbGxfcXVlcnlfcmVscyA9IGJtc19kZWxfbWVtYmVyKHJvb3QtPmFs bF9xdWVyeV9yZWxzLCByZWxpZCk7CisJcm9vdC0+YWxsX3F1ZXJ5X3JlbHMgPSBjaGFuZ2Vf cmVsaWQocm9vdC0+YWxsX3F1ZXJ5X3JlbHMsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CiAJcm9v dC0+YWxsX3F1ZXJ5X3JlbHMgPSBibXNfZGVsX21lbWJlcihyb290LT5hbGxfcXVlcnlfcmVs cywgb2pyZWxpZCk7CiAKIAkvKgpAQCAtMzg4LDEwICs0MjcsMTAgQEAgcmVtb3ZlX3JlbF9m cm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIGludCBvanJlbGlkLAog CXsKIAkJU3BlY2lhbEpvaW5JbmZvICpzamluZm8gPSAoU3BlY2lhbEpvaW5JbmZvICopIGxm aXJzdChsKTsKIAotCQlzamluZm8tPm1pbl9sZWZ0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNq aW5mby0+bWluX2xlZnRoYW5kLCByZWxpZCk7Ci0JCXNqaW5mby0+bWluX3JpZ2h0aGFuZCA9 IGJtc19kZWxfbWVtYmVyKHNqaW5mby0+bWluX3JpZ2h0aGFuZCwgcmVsaWQpOwotCQlzamlu Zm8tPnN5bl9sZWZ0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mby0+c3luX2xlZnRoYW5k LCByZWxpZCk7Ci0JCXNqaW5mby0+c3luX3JpZ2h0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNq aW5mby0+c3luX3JpZ2h0aGFuZCwgcmVsaWQpOworCQlzamluZm8tPm1pbl9sZWZ0aGFuZCA9 IGNoYW5nZV9yZWxpZChzamluZm8tPm1pbl9sZWZ0aGFuZCwgcmVsaWQsIHN1YnN0X3JlbGlk KTsKKwkJc2ppbmZvLT5taW5fcmlnaHRoYW5kID0gY2hhbmdlX3JlbGlkKHNqaW5mby0+bWlu X3JpZ2h0aGFuZCwgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJc2ppbmZvLT5zeW5fbGVmdGhh bmQgPSBjaGFuZ2VfcmVsaWQoc2ppbmZvLT5zeW5fbGVmdGhhbmQsIHJlbGlkLCBzdWJzdF9y ZWxpZCk7CisJCXNqaW5mby0+c3luX3JpZ2h0aGFuZCA9IGNoYW5nZV9yZWxpZChzamluZm8t PnN5bl9yaWdodGhhbmQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CiAJCXNqaW5mby0+bWluX2xl ZnRoYW5kID0gYm1zX2RlbF9tZW1iZXIoc2ppbmZvLT5taW5fbGVmdGhhbmQsIG9qcmVsaWQp OwogCQlzamluZm8tPm1pbl9yaWdodGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZm8tPm1p bl9yaWdodGhhbmQsIG9qcmVsaWQpOwogCQlzamluZm8tPnN5bl9sZWZ0aGFuZCA9IGJtc19k ZWxfbWVtYmVyKHNqaW5mby0+c3luX2xlZnRoYW5kLCBvanJlbGlkKTsKQEAgLTQwMSw2ICs0 NDAsOCBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGludCBy ZWxpZCwgaW50IG9qcmVsaWQsCiAJCXNqaW5mby0+Y29tbXV0ZV9hYm92ZV9yID0gYm1zX2Rl bF9tZW1iZXIoc2ppbmZvLT5jb21tdXRlX2Fib3ZlX3IsIG9qcmVsaWQpOwogCQlzamluZm8t PmNvbW11dGVfYmVsb3dfbCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mby0+Y29tbXV0ZV9iZWxv d19sLCBvanJlbGlkKTsKIAkJc2ppbmZvLT5jb21tdXRlX2JlbG93X3IgPSBibXNfZGVsX21l bWJlcihzamluZm8tPmNvbW11dGVfYmVsb3dfciwgb2pyZWxpZCk7CisKKwkJY2hhbmdlX3Zh cm5vKChFeHByICopIHNqaW5mby0+c2VtaV9yaHNfZXhwcnMsIHJlbGlkLCBzdWJzdF9yZWxp ZCk7CiAJfQogCiAJLyoKQEAgLTQyMSw4ICs0NjIsOCBAQCByZW1vdmVfcmVsX2Zyb21fcXVl cnkoUGxhbm5lckluZm8gKnJvb3QsIGludCByZWxpZCwgaW50IG9qcmVsaWQsCiAJewogCQlQ bGFjZUhvbGRlckluZm8gKnBoaW5mbyA9IChQbGFjZUhvbGRlckluZm8gKikgbGZpcnN0KGwp OwogCi0JCUFzc2VydCghYm1zX2lzX21lbWJlcihyZWxpZCwgcGhpbmZvLT5waF9sYXRlcmFs KSk7Ci0JCWlmIChibXNfaXNfc3Vic2V0KHBoaW5mby0+cGhfbmVlZGVkLCBqb2lucmVsaWRz KSAmJgorCQlpZiAoc3Vic3RfcmVsaWQgPT0gMCAmJgorCQkJYm1zX2lzX3N1YnNldChwaGlu Zm8tPnBoX25lZWRlZCwgam9pbnJlbGlkcykgJiYKIAkJCWJtc19pc19tZW1iZXIocmVsaWQs IHBoaW5mby0+cGhfZXZhbF9hdCkpCiAJCXsKIAkJCXJvb3QtPnBsYWNlaG9sZGVyX2xpc3Qg PSBmb3JlYWNoX2RlbGV0ZV9jdXJyZW50KHJvb3QtPnBsYWNlaG9sZGVyX2xpc3QsCkBAIC00 MzMsMTkgKzQ3NCwzNiBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJv b3QsIGludCByZWxpZCwgaW50IG9qcmVsaWQsCiAJCXsKIAkJCVBsYWNlSG9sZGVyVmFyICpw aHYgPSBwaGluZm8tPnBoX3ZhcjsKIAotCQkJcGhpbmZvLT5waF9ldmFsX2F0ID0gYm1zX2Rl bF9tZW1iZXIocGhpbmZvLT5waF9ldmFsX2F0LCByZWxpZCk7CisJCQlwaGluZm8tPnBoX2V2 YWxfYXQgPSBjaGFuZ2VfcmVsaWQocGhpbmZvLT5waF9ldmFsX2F0LCByZWxpZCwgc3Vic3Rf cmVsaWQpOwogCQkJcGhpbmZvLT5waF9ldmFsX2F0ID0gYm1zX2RlbF9tZW1iZXIocGhpbmZv LT5waF9ldmFsX2F0LCBvanJlbGlkKTsKIAkJCUFzc2VydCghYm1zX2lzX2VtcHR5KHBoaW5m by0+cGhfZXZhbF9hdCkpOwkvKiBjaGVja2VkIHByZXZpb3VzbHkgKi8KLQkJCXBoaW5mby0+ cGhfbmVlZGVkID0gYm1zX2RlbF9tZW1iZXIocGhpbmZvLT5waF9uZWVkZWQsIHJlbGlkKTsK LQkJCXBoaW5mby0+cGhfbmVlZGVkID0gYm1zX2RlbF9tZW1iZXIocGhpbmZvLT5waF9uZWVk ZWQsIG9qcmVsaWQpOworCQkJcGhpbmZvLT5waF9uZWVkZWQgPSBjaGFuZ2VfcmVsaWQocGhp bmZvLT5waF9uZWVkZWQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CisKKwkJCWlmIChzdWJzdF9y ZWxpZCA9PSAwKQorCQkJCS8qIFNlZSBjb21tZW50IGFib3ZlIG9uIG90aGVycmVsLT5hdHRy X25lZWRlZCBhcnJhbmdlbWVudCAqLworCQkJCXBoaW5mby0+cGhfbmVlZGVkID0gYm1zX2Rl bF9tZW1iZXIocGhpbmZvLT5waF9uZWVkZWQsIG9qcmVsaWQpOworCiAJCQkvKiBwaF9uZWVk ZWQgbWlnaHQgb3IgbWlnaHQgbm90IGJlY29tZSBlbXB0eSAqLwotCQkJcGh2LT5waHJlbHMg PSBibXNfZGVsX21lbWJlcihwaHYtPnBocmVscywgcmVsaWQpOworCQkJQXNzZXJ0KHN1YnN0 X3JlbGlkICE9IDAgfHwgIWJtc19pc19tZW1iZXIocmVsaWQsIHBoaW5mby0+cGhfbGF0ZXJh bCkpOworCQkJcGhpbmZvLT5waF9sYXRlcmFsID0gY2hhbmdlX3JlbGlkKHBoaW5mby0+cGhf bGF0ZXJhbCwgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJCXBodi0+cGhyZWxzID0gY2hhbmdl X3JlbGlkKHBodi0+cGhyZWxzLCByZWxpZCwgc3Vic3RfcmVsaWQpOwogCQkJcGh2LT5waHJl bHMgPSBibXNfZGVsX21lbWJlcihwaHYtPnBocmVscywgb2pyZWxpZCk7CiAJCQlBc3NlcnQo IWJtc19pc19lbXB0eShwaHYtPnBocmVscykpOwogCQkJQXNzZXJ0KHBodi0+cGhudWxsaW5n cmVscyA9PSBOVUxMKTsgLyogbm8gbmVlZCB0byBhZGp1c3QgKi8KIAkJfQogCX0KIAorCWlm IChzdWJzdF9yZWxpZCAhPSAwKQorCXsKKwkJZm9yZWFjaChsLCByZWwtPmJhc2VyZXN0cmlj dGluZm8pCisJCXsKKwkJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZvICop IGxmaXJzdChsKTsKKworCQkJY2hhbmdlX3JpbmZvKHJpbmZvLCByZWxpZCwgc3Vic3RfcmVs aWQpOworCQkJZGlzdHJpYnV0ZV9yZXN0cmljdGluZm9fdG9fcmVscyhyb290LCByaW5mbyk7 CisJCX0KKwl9CisKIAkvKgogCSAqIFJlbW92ZSBhbnkgam9pbnF1YWxzIHJlZmVyZW5jaW5n IHRoZSByZWwgZnJvbSB0aGUgam9pbmluZm8gbGlzdHMuCiAJICoKQEAgLTQ2Niw2ICs1MjQs NyBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGludCByZWxp ZCwgaW50IG9qcmVsaWQsCiAJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZv ICopIGxmaXJzdChsKTsKIAogCQlyZW1vdmVfam9pbl9jbGF1c2VfZnJvbV9yZWxzKHJvb3Qs IHJpbmZvLCByaW5mby0+cmVxdWlyZWRfcmVsaWRzKTsKKwkJY2hhbmdlX3JpbmZvKHJpbmZv LCByZWxpZCwgc3Vic3RfcmVsaWQpOwogCiAJCWlmIChSSU5GT19JU19QVVNIRURfRE9XTihy aW5mbywgam9pbnJlbGlkcykpCiAJCXsKQEAgLTQ3NSwxMCArNTM0LDEyIEBAIHJlbW92ZV9y ZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBpbnQgb2pyZWxp ZCwKIAkJCSAqIHRoYXQgaW5jbHVkZSB0aG9zZS4gIFdlIGFscmVhZHkgY2hlY2tlZCBhYm92 ZSB0aGF0IGFueSBzdWNoIFBIVgogCQkJICogaXMgc2FmZSwgc28gd2UgY2FuIGp1c3QgZHJv cCB0aG9zZSByZWZlcmVuY2VzLgogCQkJICovCi0JCQlyZW1vdmVfcmVsX2Zyb21fcmVzdHJp Y3RpbmZvKHJpbmZvLCByZWxpZCwgb2pyZWxpZCk7CisJCQlyZW1vdmVfcmVsX2Zyb21fcmVz dHJpY3RpbmZvKHJpbmZvLCByZWxpZCwgb2pyZWxpZCwgc3Vic3RfcmVsaWQpOwogCQkJLyog Tm93IHRocm93IGl0IGJhY2sgaW50byB0aGUgam9pbmluZm8gbGlzdHMgKi8KIAkJCWRpc3Ry aWJ1dGVfcmVzdHJpY3RpbmZvX3RvX3JlbHMocm9vdCwgcmluZm8pOwogCQl9CisJCWVsc2Ug aWYgKHN1YnN0X3JlbGlkICE9IDApCisJCQlkaXN0cmlidXRlX3Jlc3RyaWN0aW5mb190b19y ZWxzKHJvb3QsIHJpbmZvKTsKIAl9CiAKIAkvKgpAQCAtNDk0LDcgKzU1NSwxMyBAQCByZW1v dmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGludCByZWxpZCwgaW50IG9q cmVsaWQsCiAJcm9vdC0+c2ltcGxlX3JlbF9hcnJheVtyZWxpZF0gPSBOVUxMOwogCiAJLyog QW5kIG51a2UgdGhlIFJlbE9wdEluZm8sIGp1c3QgaW4gY2FzZSB0aGVyZSdzIGFub3RoZXIg YWNjZXNzIHBhdGggKi8KLQlwZnJlZShyZWwpOworCWlmIChzdWJzdF9yZWxpZCA9PSAwKQor CQkvKgorCQkgKiBUcmFkZS1vZmY6IGNhbid0IGZyZWUgdGhpcyBzdHJ1Y3QgaW4gdGhlIGNh c2Ugb2YgU0pSLCBidXQgZG9uJ3Qgd2FudAorCQkgKiB0b3RhbGx5IGNoYW5nZSB0aGUgY29y ZSBsb2dpYy4KKwkJICogWFhYOiBhIHJlZGVzaWduIG9mIFNKUiBjb2RlIGhhcyBiZWVuIHJl cXVpcmVkLgorCQkgKi8KKwkJcGZyZWUocmVsKTsKIH0KIAogLyoKQEAgLTUwNiwxOCArNTcz LDE4IEBAIHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJl bGlkLCBpbnQgb2pyZWxpZCwKICAqIHdlIGhhdmUgdG8gYWxzbyBjbGVhbiB1cCB0aGUgc3Vi LWNsYXVzZXMuCiAgKi8KIHN0YXRpYyB2b2lkCi1yZW1vdmVfcmVsX2Zyb21fcmVzdHJpY3Rp bmZvKFJlc3RyaWN0SW5mbyAqcmluZm8sIGludCByZWxpZCwgaW50IG9qcmVsaWQpCityZW1v dmVfcmVsX2Zyb21fcmVzdHJpY3RpbmZvKFJlc3RyaWN0SW5mbyAqcmluZm8sIGludCByZWxp ZCwgaW50IG9qcmVsaWQsIGludCBzdWJzdF9yZWxpZCkKIHsKIAkvKgogCSAqIFRoZSBjbGF1 c2VfcmVsaWRzIHByb2JhYmx5IGFyZW4ndCBzaGFyZWQgd2l0aCBhbnl0aGluZyBlbHNlLCBi dXQgbGV0J3MKIAkgKiBjb3B5IHRoZW0ganVzdCB0byBiZSBzdXJlLgogCSAqLwogCXJpbmZv LT5jbGF1c2VfcmVsaWRzID0gYm1zX2NvcHkocmluZm8tPmNsYXVzZV9yZWxpZHMpOwotCXJp bmZvLT5jbGF1c2VfcmVsaWRzID0gYm1zX2RlbF9tZW1iZXIocmluZm8tPmNsYXVzZV9yZWxp ZHMsIHJlbGlkKTsKKwlyaW5mby0+Y2xhdXNlX3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5m by0+Y2xhdXNlX3JlbGlkcywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKIAlyaW5mby0+Y2xhdXNl X3JlbGlkcyA9IGJtc19kZWxfbWVtYmVyKHJpbmZvLT5jbGF1c2VfcmVsaWRzLCBvanJlbGlk KTsKIAkvKiBMaWtld2lzZSBmb3IgcmVxdWlyZWRfcmVsaWRzICovCiAJcmluZm8tPnJlcXVp cmVkX3JlbGlkcyA9IGJtc19jb3B5KHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMpOwotCXJpbmZv LT5yZXF1aXJlZF9yZWxpZHMgPSBibXNfZGVsX21lbWJlcihyaW5mby0+cmVxdWlyZWRfcmVs aWRzLCByZWxpZCk7CisJcmluZm8tPnJlcXVpcmVkX3JlbGlkcyA9IGNoYW5nZV9yZWxpZChy aW5mby0+cmVxdWlyZWRfcmVsaWRzLCByZWxpZCwgc3Vic3RfcmVsaWQpOwogCXJpbmZvLT5y ZXF1aXJlZF9yZWxpZHMgPSBibXNfZGVsX21lbWJlcihyaW5mby0+cmVxdWlyZWRfcmVsaWRz LCBvanJlbGlkKTsKIAogCS8qIElmIGl0J3MgYW4gT1IsIHJlY3Vyc2UgdG8gY2xlYW4gdXAg c3ViLWNsYXVzZXMgKi8KQEAgLTU0MCwxNCArNjA3LDE0IEBAIHJlbW92ZV9yZWxfZnJvbV9y ZXN0cmljdGluZm8oUmVzdHJpY3RJbmZvICpyaW5mbywgaW50IHJlbGlkLCBpbnQgb2pyZWxp ZCkKIAkJCQl7CiAJCQkJCVJlc3RyaWN0SW5mbyAqcmluZm8yID0gbGZpcnN0X25vZGUoUmVz dHJpY3RJbmZvLCBsYzIpOwogCi0JCQkJCXJlbW92ZV9yZWxfZnJvbV9yZXN0cmljdGluZm8o cmluZm8yLCByZWxpZCwgb2pyZWxpZCk7CisJCQkJCXJlbW92ZV9yZWxfZnJvbV9yZXN0cmlj dGluZm8ocmluZm8yLCByZWxpZCwgb2pyZWxpZCwgc3Vic3RfcmVsaWQpOwogCQkJCX0KIAkJ CX0KIAkJCWVsc2UKIAkJCXsKIAkJCQlSZXN0cmljdEluZm8gKnJpbmZvMiA9IGNhc3ROb2Rl KFJlc3RyaWN0SW5mbywgb3JhcmcpOwogCi0JCQkJcmVtb3ZlX3JlbF9mcm9tX3Jlc3RyaWN0 aW5mbyhyaW5mbzIsIHJlbGlkLCBvanJlbGlkKTsKKwkJCQlyZW1vdmVfcmVsX2Zyb21fcmVz dHJpY3RpbmZvKHJpbmZvMiwgcmVsaWQsIG9qcmVsaWQsIHN1YnN0X3JlbGlkKTsKIAkJCX0K IAkJfQogCX0KQEAgLTc0Nyw5ICs4MTQsMTQgQEAgcmVsX3N1cHBvcnRzX2Rpc3RpbmN0bmVz cyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKQogICogTm90ZSB0aGF0IHRo ZSBwYXNzZWQtaW4gY2xhdXNlX2xpc3QgbWF5IGJlIGRlc3RydWN0aXZlbHkgbW9kaWZpZWQh ICBUaGlzCiAgKiBpcyBPSyBmb3IgY3VycmVudCB1c2VzLCBiZWNhdXNlIHRoZSBjbGF1c2Vf bGlzdCBpcyBidWlsdCBieSB0aGUgY2FsbGVyIGZvcgogICogdGhlIHNvbGUgcHVycG9zZSBv ZiBwYXNzaW5nIHRvIHRoaXMgZnVuY3Rpb24uCisgKgorICogb3V0ZXJfZXhwcnMgY29udGFp bnMgcmlnaHQgc2lkZXMgb2YgYmFzZXJlc3RyaWN0aW5mbyBjbGF1c2VzIGxvb2tzIGxpa2UK KyAqIHggPSBjb25zdCBpZiBkaXN0aW5jdG5lc3MgaXMgZGVyaXZlZCBmcm9tIHN1Y2ggY2xh dXNlcywgbm90IGpvaW5pbmZvIGNsYXVzZS4KKyAqIFBhc3MgTlVMTCBmb3IgdGhlIHBhcmFt IHZhbHVlLCBpZiBpdCBpcyBub3QgaW50ZXJlc3RlZC4KICAqLwogc3RhdGljIGJvb2wKLXJl bF9pc19kaXN0aW5jdF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwg TGlzdCAqY2xhdXNlX2xpc3QpCityZWxfaXNfZGlzdGluY3RfZm9yKFBsYW5uZXJJbmZvICpy b290LCBSZWxPcHRJbmZvICpyZWwsIExpc3QgKmNsYXVzZV9saXN0LAorCQkJCQlMaXN0ICoq ZXh0cmFfY2xhdXNlcykKIHsKIAkvKgogCSAqIFdlIGNvdWxkIHNraXAgYSBjb3VwbGUgb2Yg dGVzdHMgaGVyZSBpZiB3ZSBhc3N1bWUgYWxsIGNhbGxlcnMgY2hlY2tlZApAQCAtNzYyLDEw ICs4MzQsMTEgQEAgcmVsX2lzX2Rpc3RpbmN0X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVs T3B0SW5mbyAqcmVsLCBMaXN0ICpjbGF1c2VfbGlzdCkKIAl7CiAJCS8qCiAJCSAqIEV4YW1p bmUgdGhlIGluZGV4ZXMgdG8gc2VlIGlmIHdlIGhhdmUgYSBtYXRjaGluZyB1bmlxdWUgaW5k ZXguCi0JCSAqIHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZm9yIGF1dG9tYXRpY2FsbHkg YWRkcyBhbnkgdXNhYmxlCisJCSAqIHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZXh0IGF1 dG9tYXRpY2FsbHkgYWRkcyBhbnkgdXNhYmxlCiAJCSAqIHJlc3RyaWN0aW9uIGNsYXVzZXMg Zm9yIHRoZSByZWwsIHNvIHdlIG5lZWRuJ3QgZG8gdGhhdCBoZXJlLgogCQkgKi8KLQkJaWYg KHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZm9yKHJvb3QsIHJlbCwgY2xhdXNlX2xpc3Qs IE5JTCwgTklMKSkKKwkJaWYgKHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZXh0KHJvb3Qs IHJlbCwgY2xhdXNlX2xpc3QsIE5JTCwgTklMLAorCQkJCQkJCQkJCSAgZXh0cmFfY2xhdXNl cykpCiAJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAJZWxzZSBpZiAocmVsLT5ydGVraW5kID09IFJU RV9TVUJRVUVSWSkKQEAgLTEwNzksOSArMTE1MiwyMSBAQCBpbm5lcnJlbF9pc191bmlxdWUo UGxhbm5lckluZm8gKnJvb3QsCiAJCQkJICAgSm9pblR5cGUgam9pbnR5cGUsCiAJCQkJICAg TGlzdCAqcmVzdHJpY3RsaXN0LAogCQkJCSAgIGJvb2wgZm9yY2VfY2FjaGUpCit7CisJcmV0 dXJuIGlubmVycmVsX2lzX3VuaXF1ZV9leHQocm9vdCwgam9pbnJlbGlkcywgb3V0ZXJyZWxp ZHMsIGlubmVycmVsLAorCQkJCQkJCQkgIGpvaW50eXBlLCByZXN0cmljdGxpc3QsIGZvcmNl X2NhY2hlLCBOVUxMKTsKK30KKworYm9vbAoraW5uZXJyZWxfaXNfdW5pcXVlX2V4dChQbGFu bmVySW5mbyAqcm9vdCwgUmVsaWRzIGpvaW5yZWxpZHMsIFJlbGlkcyBvdXRlcnJlbGlkcywK KwkJCQkJICAgUmVsT3B0SW5mbyAqaW5uZXJyZWwsIEpvaW5UeXBlIGpvaW50eXBlLAorCQkJ CQkgICBMaXN0ICpyZXN0cmljdGxpc3QsIGJvb2wgZm9yY2VfY2FjaGUsCisJCQkJCSAgIExp c3QgKipleHRyYV9jbGF1c2VzKQogewogCU1lbW9yeUNvbnRleHQgb2xkX2NvbnRleHQ7CiAJ TGlzdENlbGwgICAqbGM7CisJVW5pcXVlUmVsSW5mbyAqdW5pcXVlUmVsSW5mbzsKKwlMaXN0 CSAgICpvdXRlcl9leHBycyA9IE5JTDsKIAogCS8qIENlcnRhaW5seSBjYW4ndCBwcm92ZSB1 bmlxdWVuZXNzIHdoZW4gdGhlcmUgYXJlIG5vIGpvaW5jbGF1c2VzICovCiAJaWYgKHJlc3Ry aWN0bGlzdCA9PSBOSUwpCkBAIC0xMTAzLDEwICsxMTg4LDE0IEBAIGlubmVycmVsX2lzX3Vu aXF1ZShQbGFubmVySW5mbyAqcm9vdCwKIAkgKi8KIAlmb3JlYWNoKGxjLCBpbm5lcnJlbC0+ dW5pcXVlX2Zvcl9yZWxzKQogCXsKLQkJUmVsaWRzCQl1bmlxdWVfZm9yX3JlbHMgPSAoUmVs aWRzKSBsZmlyc3QobGMpOworCQl1bmlxdWVSZWxJbmZvID0gKFVuaXF1ZVJlbEluZm8gKikg bGZpcnN0KGxjKTsKIAotCQlpZiAoYm1zX2lzX3N1YnNldCh1bmlxdWVfZm9yX3JlbHMsIG91 dGVycmVsaWRzKSkKKwkJaWYgKGJtc19pc19zdWJzZXQodW5pcXVlUmVsSW5mby0+b3V0ZXJy ZWxpZHMsIG91dGVycmVsaWRzKSkKKwkJeworCQkJaWYgKGV4dHJhX2NsYXVzZXMpCisJCQkJ KmV4dHJhX2NsYXVzZXMgPSB1bmlxdWVSZWxJbmZvLT5leHRyYV9jbGF1c2VzOwogCQkJcmV0 dXJuIHRydWU7CQkvKiBTdWNjZXNzISAqLworCQl9CiAJfQogCiAJLyoKQEAgLTExMjMsNyAr MTIxMiw3IEBAIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9vdCwKIAogCS8q IE5vIGNhY2hlZCBpbmZvcm1hdGlvbiwgc28gdHJ5IHRvIG1ha2UgdGhlIHByb29mLiAqLwog CWlmIChpc19pbm5lcnJlbF91bmlxdWVfZm9yKHJvb3QsIGpvaW5yZWxpZHMsIG91dGVycmVs aWRzLCBpbm5lcnJlbCwKLQkJCQkJCQkgICBqb2ludHlwZSwgcmVzdHJpY3RsaXN0KSkKKwkJ CQkJCQkgICBqb2ludHlwZSwgcmVzdHJpY3RsaXN0LCAmb3V0ZXJfZXhwcnMpKQogCXsKIAkJ LyoKIAkJICogQ2FjaGUgdGhlIHBvc2l0aXZlIHJlc3VsdCBmb3IgZnV0dXJlIHByb2Jlcywg YmVpbmcgc3VyZSB0byBrZWVwIGl0CkBAIC0xMTM2LDEwICsxMjI1LDE1IEBAIGlubmVycmVs X2lzX3VuaXF1ZShQbGFubmVySW5mbyAqcm9vdCwKIAkJICogc3VwZXJzZXRzIG9mIHRoZW0g YW55d2F5LgogCQkgKi8KIAkJb2xkX2NvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8o cm9vdC0+cGxhbm5lcl9jeHQpOworCQl1bmlxdWVSZWxJbmZvID0gcGFsbG9jKHNpemVvZihV bmlxdWVSZWxJbmZvKSk7CisJCXVuaXF1ZVJlbEluZm8tPmV4dHJhX2NsYXVzZXMgPSBvdXRl cl9leHByczsKKwkJdW5pcXVlUmVsSW5mby0+b3V0ZXJyZWxpZHMgPSBibXNfY29weShvdXRl cnJlbGlkcyk7CiAJCWlubmVycmVsLT51bmlxdWVfZm9yX3JlbHMgPSBsYXBwZW5kKGlubmVy cmVsLT51bmlxdWVfZm9yX3JlbHMsCi0JCQkJCQkJCQkJCWJtc19jb3B5KG91dGVycmVsaWRz KSk7CisJCQkJCQkJCQkJCXVuaXF1ZVJlbEluZm8pOwogCQlNZW1vcnlDb250ZXh0U3dpdGNo VG8ob2xkX2NvbnRleHQpOwogCisJCWlmIChleHRyYV9jbGF1c2VzKQorCQkJKmV4dHJhX2Ns YXVzZXMgPSBvdXRlcl9leHByczsKIAkJcmV0dXJuIHRydWU7CQkJLyogU3VjY2VzcyEgKi8K IAl9CiAJZWxzZQpAQCAtMTE4NSw3ICsxMjc5LDggQEAgaXNfaW5uZXJyZWxfdW5pcXVlX2Zv cihQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJICAgUmVsaWRzIG91dGVycmVsaWRzLAogCQkJ CQkgICBSZWxPcHRJbmZvICppbm5lcnJlbCwKIAkJCQkJICAgSm9pblR5cGUgam9pbnR5cGUs Ci0JCQkJCSAgIExpc3QgKnJlc3RyaWN0bGlzdCkKKwkJCQkJICAgTGlzdCAqcmVzdHJpY3Rs aXN0LAorCQkJCQkgICBMaXN0ICoqZXh0cmFfY2xhdXNlcykKIHsKIAlMaXN0CSAgICpjbGF1 c2VfbGlzdCA9IE5JTDsKIAlMaXN0Q2VsbCAgICpsYzsKQEAgLTEyMjcsNSArMTMyMiw5Mjkg QEAgaXNfaW5uZXJyZWxfdW5pcXVlX2ZvcihQbGFubmVySW5mbyAqcm9vdCwKIAl9CiAKIAkv KiBMZXQgcmVsX2lzX2Rpc3RpbmN0X2ZvcigpIGRvIHRoZSBoYXJkIHdvcmsgKi8KLQlyZXR1 cm4gcmVsX2lzX2Rpc3RpbmN0X2Zvcihyb290LCBpbm5lcnJlbCwgY2xhdXNlX2xpc3QpOwor CXJldHVybiByZWxfaXNfZGlzdGluY3RfZm9yKHJvb3QsIGlubmVycmVsLCBjbGF1c2VfbGlz dCwgZXh0cmFfY2xhdXNlcyk7Cit9CisKK3R5cGVkZWYgc3RydWN0IENoYW5nZVZhcm5vQ29u dGV4dAoreworCUluZGV4CQlvbGRSZWxpZDsKKwlJbmRleAkJbmV3UmVsaWQ7Cit9IENoYW5n ZVZhcm5vQ29udGV4dDsKKworCitzdGF0aWMgYm9vbAorY2hhbmdlX3Zhcm5vX3dhbGtlcihO b2RlICpub2RlLCBDaGFuZ2VWYXJub0NvbnRleHQgKmNvbnRleHQpCit7CisJaWYgKG5vZGUg PT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKElzQShub2RlLCBWYXIpKQorCXsK KwkJVmFyCQkgICAqdmFyID0gKFZhciAqKSBub2RlOworCisJCWlmICh2YXItPnZhcm5vID09 IGNvbnRleHQtPm9sZFJlbGlkKQorCQl7CisJCQl2YXItPnZhcm5vID0gY29udGV4dC0+bmV3 UmVsaWQ7CisJCQl2YXItPnZhcm5vc3luID0gY29udGV4dC0+bmV3UmVsaWQ7CisJCQl2YXIt PmxvY2F0aW9uID0gLTE7CisJCX0KKwkJZWxzZSBpZiAodmFyLT52YXJubyA9PSBjb250ZXh0 LT5uZXdSZWxpZCkKKwkJCXZhci0+bG9jYXRpb24gPSAtMTsKKworCQlyZXR1cm4gZmFsc2U7 CisJfQorCWlmIChJc0Eobm9kZSwgUmVzdHJpY3RJbmZvKSkKKwl7CisJCWNoYW5nZV9yaW5m bygoUmVzdHJpY3RJbmZvICopIG5vZGUsIGNvbnRleHQtPm9sZFJlbGlkLCBjb250ZXh0LT5u ZXdSZWxpZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIGV4cHJlc3Npb25fdHJl ZV93YWxrZXIobm9kZSwgY2hhbmdlX3Zhcm5vX3dhbGtlciwgY29udGV4dCk7Cit9CisKKy8q CisgKiBGb3IgYWxsIFZhcnMgaW4gdGhlIGV4cHJlc3Npb24gdGhhdCBoYXZlIHZhcm5vID0g b2xkUmVsaWQsIHNldAorICogdmFybm8gPSBuZXdSZWxpZC4KKyAqLworc3RhdGljIHZvaWQK K2NoYW5nZV92YXJubyhFeHByICpleHByLCBJbmRleCBvbGRSZWxpZCwgSW5kZXggbmV3UmVs aWQpCit7CisJQ2hhbmdlVmFybm9Db250ZXh0IGNvbnRleHQ7CisKKwlpZiAobmV3UmVsaWQg PT0gMCkKKwkJcmV0dXJuOworCisJY29udGV4dC5vbGRSZWxpZCA9IG9sZFJlbGlkOworCWNv bnRleHQubmV3UmVsaWQgPSBuZXdSZWxpZDsKKwljaGFuZ2VfdmFybm9fd2Fsa2VyKChOb2Rl ICopIGV4cHIsICZjb250ZXh0KTsKK30KKworLyoKKyAqIFN1YnN0aXR1dGUgbmV3SWQgZm9y IG9sZElkIGluIHJlbGlkcy4KKyAqLworc3RhdGljIEJpdG1hcHNldCAqCitjaGFuZ2VfcmVs aWQoUmVsaWRzIHJlbGlkcywgSW5kZXggb2xkSWQsIEluZGV4IG5ld0lkKQoreworCWlmIChu ZXdJZCA9PSAwKQorCQkvKiBEZWxldGUgcmVsaWQgd2l0aG91dCBzdWJzdGl0dXRpb24uICov CisJCXJldHVybiBibXNfZGVsX21lbWJlcihyZWxpZHMsIG9sZElkKTsKKworCWlmIChibXNf aXNfbWVtYmVyKG9sZElkLCByZWxpZHMpKQorCQlyZXR1cm4gYm1zX2FkZF9tZW1iZXIoYm1z X2RlbF9tZW1iZXIoYm1zX2NvcHkocmVsaWRzKSwgb2xkSWQpLCBuZXdJZCk7CisKKwlyZXR1 cm4gcmVsaWRzOworfQorCitzdGF0aWMgdm9pZAorY2hhbmdlX3JpbmZvKFJlc3RyaWN0SW5m byAqcmluZm8sIEluZGV4IGZyb20sIEluZGV4IHRvKQoreworCWJvb2wJCWlzX3JlcV9lcXVh bDsKKworCWlmICh0byA9PSAwKQorCQlyZXR1cm47CisKKwlpc19yZXFfZXF1YWwgPSAocmlu Zm8tPnJlcXVpcmVkX3JlbGlkcyA9PSByaW5mby0+Y2xhdXNlX3JlbGlkcyk7CisKKwljaGFu Z2VfdmFybm8ocmluZm8tPmNsYXVzZSwgZnJvbSwgdG8pOworCWNoYW5nZV92YXJubyhyaW5m by0+b3JjbGF1c2UsIGZyb20sIHRvKTsKKwlyaW5mby0+Y2xhdXNlX3JlbGlkcyA9IGNoYW5n ZV9yZWxpZChyaW5mby0+Y2xhdXNlX3JlbGlkcywgZnJvbSwgdG8pOworCWlmIChpc19yZXFf ZXF1YWwpCisJCXJpbmZvLT5yZXF1aXJlZF9yZWxpZHMgPSByaW5mby0+Y2xhdXNlX3JlbGlk czsKKwllbHNlCisJCXJpbmZvLT5yZXF1aXJlZF9yZWxpZHMgPSBjaGFuZ2VfcmVsaWQocmlu Zm8tPnJlcXVpcmVkX3JlbGlkcywgZnJvbSwgdG8pOworCXJpbmZvLT5sZWZ0X3JlbGlkcyA9 IGNoYW5nZV9yZWxpZChyaW5mby0+bGVmdF9yZWxpZHMsIGZyb20sIHRvKTsKKwlyaW5mby0+ cmlnaHRfcmVsaWRzID0gY2hhbmdlX3JlbGlkKHJpbmZvLT5yaWdodF9yZWxpZHMsIGZyb20s IHRvKTsKKwlyaW5mby0+b3V0ZXJfcmVsaWRzID0gY2hhbmdlX3JlbGlkKHJpbmZvLT5vdXRl cl9yZWxpZHMsIGZyb20sIHRvKTsKK30KKworLyoKKyAqIFVwZGF0ZSBFQyBtZW1iZXJzIHRv IHBvaW50IHRvIHRoZSByZW1haW5pbmcgcmVsYXRpb24gaW5zdGVhZCBvZiB0aGUgcmVtb3Zl ZAorICogb25lLCByZW1vdmluZyBkdXBsaWNhdGVzLgorICovCitzdGF0aWMgdm9pZAordXBk YXRlX2VjX21lbWJlcnMoRXF1aXZhbGVuY2VDbGFzcyAqZWMsIEluZGV4IHRvUmVtb3ZlLCBJ bmRleCB0b0tlZXApCit7CisJaW50CQkJY291bnRlcjsKKworCWZvciAoY291bnRlciA9IDA7 IGNvdW50ZXIgPCBsaXN0X2xlbmd0aChlYy0+ZWNfbWVtYmVycyk7KQorCXsKKwkJTGlzdENl bGwgICAqY2VsbCA9IGxpc3RfbnRoX2NlbGwoZWMtPmVjX21lbWJlcnMsIGNvdW50ZXIpOwor CQlFcXVpdmFsZW5jZU1lbWJlciAqZW0gPSBsZmlyc3QoY2VsbCk7CisJCWludAkJCWNvdW50 ZXIxOworCisJCWlmICghYm1zX2lzX21lbWJlcih0b1JlbW92ZSwgZW0tPmVtX3JlbGlkcykp CisJCXsKKwkJCWNvdW50ZXIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZW0tPmVtX3Jl bGlkcyA9IGNoYW5nZV9yZWxpZChlbS0+ZW1fcmVsaWRzLCB0b1JlbW92ZSwgdG9LZWVwKTsK KwkJLyogV2Ugb25seSBwcm9jZXNzIGlubmVyIGpvaW5zICovCisJCWNoYW5nZV92YXJubyhl bS0+ZW1fZXhwciwgdG9SZW1vdmUsIHRvS2VlcCk7CisKKwkJLyoKKwkJICogQWZ0ZXIgd2Ug c3dpdGNoZWQgdGhlIGVxdWl2YWxlbmNlIG1lbWJlciB0byB0aGUgcmVtYWluaW5nIHJlbGF0 aW9uLAorCQkgKiBjaGVjayB0aGF0IGl0IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgZXhpc3Rp bmcgbWVtYmVyLCBhbmQgaWYgaXQgaXMsCisJCSAqIGRlbGV0ZSBpdC4KKwkJICovCisJCWZv ciAoY291bnRlcjEgPSAwOyBjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKGVjLT5lY19tZW1iZXJz KTsgY291bnRlcjErKykKKwkJeworCQkJRXF1aXZhbGVuY2VNZW1iZXIgKm90aGVyOworCisJ CQlpZiAoY291bnRlcjEgPT0gY291bnRlcikKKwkJCQljb250aW51ZTsKKworCQkJb3RoZXIg PSBjYXN0Tm9kZShFcXVpdmFsZW5jZU1lbWJlciwgbGlzdF9udGgoZWMtPmVjX21lbWJlcnMs IGNvdW50ZXIxKSk7CisKKwkJCWlmIChlcXVhbChvdGhlci0+ZW1fZXhwciwgZW0tPmVtX2V4 cHIpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNvdW50ZXIxIDwgbGlzdF9sZW5ndGgo ZWMtPmVjX21lbWJlcnMpKQorCQkJZWMtPmVjX21lbWJlcnMgPSBsaXN0X2RlbGV0ZV9jZWxs KGVjLT5lY19tZW1iZXJzLCBjZWxsKTsKKwkJZWxzZQorCQkJY291bnRlcisrOworCX0KK30K KworLyoKKyAqIFVwZGF0ZSBFQyBzb3VyY2VzIHRvIHBvaW50IHRvIHRoZSByZW1haW5pbmcg cmVsYXRpb24gaW5zdGVhZCBvZiB0aGUKKyAqIHJlbW92ZWQgb25lLgorICovCitzdGF0aWMg dm9pZAordXBkYXRlX2VjX3NvdXJjZXMoTGlzdCAqKnNvdXJjZXMsIEluZGV4IHRvUmVtb3Zl LCBJbmRleCB0b0tlZXApCit7CisJaW50CQkJY291bnRlcjsKKworCWZvciAoY291bnRlciA9 IDA7IGNvdW50ZXIgPCBsaXN0X2xlbmd0aCgqc291cmNlcyk7KQorCXsKKwkJTGlzdENlbGwg ICAqY2VsbCA9IGxpc3RfbnRoX2NlbGwoKnNvdXJjZXMsIGNvdW50ZXIpOworCQlSZXN0cmlj dEluZm8gKnJpbmZvID0gY2FzdE5vZGUoUmVzdHJpY3RJbmZvLCBsZmlyc3QoY2VsbCkpOwor CQlpbnQJCQljb3VudGVyMTsKKworCQlpZiAoIWJtc19pc19tZW1iZXIodG9SZW1vdmUsIHJp bmZvLT5yZXF1aXJlZF9yZWxpZHMpKQorCQl7CisJCQljb3VudGVyKys7CisJCQljb250aW51 ZTsKKwkJfQorCisJCWNoYW5nZV92YXJubyhyaW5mby0+Y2xhdXNlLCB0b1JlbW92ZSwgdG9L ZWVwKTsKKworCQkvKgorCQkgKiBBZnRlciBzd2l0Y2hpbmcgdGhlIGNsYXVzZSB0byB0aGUg cmVtYWluaW5nIHJlbGF0aW9uLCBjaGVjayBpdCBmb3IKKwkJICogcmVkdW5kYW5jeSB3aXRo IGV4aXN0aW5nIG9uZXMuIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgZm9yCisJCSAqIHJlZHVu ZGFuY3kgd2l0aCBkZXJpdmVkIGNsYXVzZXMsIGJlY2F1c2Ugd2UndmUganVzdCBkZWxldGVk IHRoZW0uCisJCSAqLworCQlmb3IgKGNvdW50ZXIxID0gMDsgY291bnRlcjEgPCBsaXN0X2xl bmd0aCgqc291cmNlcyk7IGNvdW50ZXIxKyspCisJCXsKKwkJCVJlc3RyaWN0SW5mbyAqb3Ro ZXI7CisKKwkJCWlmIChjb3VudGVyMSA9PSBjb3VudGVyKQorCQkJCWNvbnRpbnVlOworCisJ CQlvdGhlciA9IGNhc3ROb2RlKFJlc3RyaWN0SW5mbywgbGlzdF9udGgoKnNvdXJjZXMsIGNv dW50ZXIxKSk7CisJCQlpZiAoZXF1YWwocmluZm8tPmNsYXVzZSwgb3RoZXItPmNsYXVzZSkp CisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY291bnRlcjEgPCBsaXN0X2xlbmd0aCgqc291 cmNlcykpCisJCQkqc291cmNlcyA9IGxpc3RfZGVsZXRlX2NlbGwoKnNvdXJjZXMsIGNlbGwp OworCQllbHNlCisJCXsKKwkJCWNvdW50ZXIrKzsKKworCQkJLyogV2Ugd2lsbCBrZWVwIHRo aXMgUmVzdHJpY3RJbmZvLCBjb3JyZWN0IGl0cyByZWxpZHMuICovCisJCQljaGFuZ2Vfcmlu Zm8ocmluZm8sIHRvUmVtb3ZlLCB0b0tlZXApOworCQl9CisJfQorfQorCisvKgorICogUmVt b3ZlIGEgcmVsYXRpb24gYWZ0ZXIgd2UgaGF2ZSBwcm92ZW4gdGhhdCBpdCBwYXJ0aWNpcGF0 ZXMgb25seSBpbiBhbgorICogdW5uZWVkZWQgdW5pcXVlIHNlbGYgam9pbi4KKyAqCisgKiBU aGUgam9pbmNsYXVzZXMgbGlzdCBpcyBkZXN0cnVjdGl2ZWx5IGNoYW5nZWQuCisgKi8KK3N0 YXRpYyB2b2lkCityZW1vdmVfc2VsZl9qb2luX3JlbChQbGFubmVySW5mbyAqcm9vdCwgUGxh blJvd01hcmsgKmttYXJrLCBQbGFuUm93TWFyayAqcm1hcmssCisJCQkJCSBSZWxPcHRJbmZv ICp0b0tlZXAsIFJlbE9wdEluZm8gKnRvUmVtb3ZlKQoreworCUxpc3RDZWxsICAgKmNlbGw7 CisJaW50CQkJaTsKKwlMaXN0CSAgICp0YXJnZXQgPSBOSUw7CisKKwkvKgorCSAqIEluY2x1 ZGUgYWxsIGVjbGFzcyBtZW50aW9ucyBvZiByZW1vdmVkIHJlbGF0aW9uIGludG8gdGhlIGVj bGFzcworCSAqIG1lbnRpb25zIG9mIGtlcHQgcmVsYXRpb24uCisJICovCisJdG9LZWVwLT5l Y2xhc3NfaW5kZXhlcyA9IGJtc19hZGRfbWVtYmVycyh0b1JlbW92ZS0+ZWNsYXNzX2luZGV4 ZXMsCisJCQkJCQkJCQkJCSB0b0tlZXAtPmVjbGFzc19pbmRleGVzKTsKKworCS8qCisJICog Tm93LCBiYXNlcmVzdHJpY3RpbmZvIHJlcGxlbmlzaGVkIHdpdGggcmVzdHJpY3Rpb25zIGZy b20gcmVtb3ZpbmcKKwkgKiByZWxhdGlvbi4gSXQgaXMgbmVlZGVkIHRvIHJlbW92ZSBkdXBs aWNhdGVzIGFuZCByZXBsYWNlIGRlZ2VuZXJhdGVkCisJICogY2xhdXNlcyB3aXRoIGEgTnVs bFRlc3QuCisJICovCisJZm9yZWFjaChjZWxsLCB0b0tlZXAtPmJhc2VyZXN0cmljdGluZm8p CisJeworCQlSZXN0cmljdEluZm8gKnJpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZv LCBjZWxsKTsKKwkJTGlzdENlbGwgICAqb3RoZXJDZWxsID0gTlVMTDsKKworCQlBc3NlcnQo IWJtc19pc19tZW1iZXIodG9SZW1vdmUtPnJlbGlkLCByaW5mby0+Y2xhdXNlX3JlbGlkcykp OworCisJCS8qCisJCSAqIElmIHRoaXMgY2xhdXNlIGlzIGEgbWVyZ2Vqb2luYWJsZSBlcXVh bGl0eSBjbGF1c2UgdGhhdCBjb21wYXJlcyBhCisJCSAqIHZhcmlhYmxlIHRvIGl0c2VsZiwg aS5lLiwgaGFzIHRoZSBmb3JtIG9mICJYPVgiLCByZXBsYWNlIGl0IHdpdGgKKwkJICogbnVs bCB0ZXN0LgorCQkgKi8KKwkJaWYgKHJpbmZvLT5tZXJnZW9wZmFtaWxpZXMgJiYgSXNBKHJp bmZvLT5jbGF1c2UsIE9wRXhwcikpCisJCXsKKwkJCUV4cHIJICAgKmxlZnRPcDsKKwkJCUV4 cHIJICAgKnJpZ2h0T3A7CisKKwkJCWxlZnRPcCA9IChFeHByICopIGdldF9sZWZ0b3Aocmlu Zm8tPmNsYXVzZSk7CisJCQlyaWdodE9wID0gKEV4cHIgKikgZ2V0X3JpZ2h0b3AocmluZm8t PmNsYXVzZSk7CisKKwkJCWlmIChsZWZ0T3AgIT0gTlVMTCAmJiBlcXVhbChsZWZ0T3AsIHJp Z2h0T3ApKQorCQkJeworCQkJCU51bGxUZXN0ICAgKm51bGxUZXN0ID0gbWFrZU5vZGUoTnVs bFRlc3QpOworCisJCQkJbnVsbFRlc3QtPmFyZyA9IGxlZnRPcDsKKwkJCQludWxsVGVzdC0+ bnVsbHRlc3R0eXBlID0gSVNfTk9UX05VTEw7CisJCQkJbnVsbFRlc3QtPmFyZ2lzcm93ID0g ZmFsc2U7CisJCQkJbnVsbFRlc3QtPmxvY2F0aW9uID0gLTE7CisJCQkJcmluZm8tPmNsYXVz ZSA9IChFeHByICopIG51bGxUZXN0OworCQkJfQorCQl9CisKKwkJLyogU2VhcmNoIGZvciBk dXBsaWNhdGVzLiAqLworCQlmb3JlYWNoKG90aGVyQ2VsbCwgdGFyZ2V0KQorCQl7CisJCQlS ZXN0cmljdEluZm8gKm90aGVyID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBvdGhlckNl bGwpOworCisJCQlpZiAob3RoZXIgPT0gcmluZm8gfHwKKwkJCQkocmluZm8tPnBhcmVudF9l YyAhPSBOVUxMCisJCQkJICYmIG90aGVyLT5wYXJlbnRfZWMgPT0gcmluZm8tPnBhcmVudF9l YykKKwkJCQl8fCBlcXVhbChyaW5mby0+Y2xhdXNlLCBvdGhlci0+Y2xhdXNlKSkKKwkJCXsK KwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChvdGhlckNlbGwgIT0gTlVMTCkKKwkJ CS8qIER1cGxpY2F0ZSBmb3VuZCAqLworCQkJY29udGludWU7CisKKwkJdGFyZ2V0ID0gbGFw cGVuZCh0YXJnZXQsIHJpbmZvKTsKKwl9CisKKwlsaXN0X2ZyZWUodG9LZWVwLT5iYXNlcmVz dHJpY3RpbmZvKTsKKwl0b0tlZXAtPmJhc2VyZXN0cmljdGluZm8gPSB0YXJnZXQ7CisKKwkv KgorCSAqIFVwZGF0ZSB0aGUgZXF1aXZhbGVuY2UgY2xhc3NlcyB0aGF0IHJlZmVyZW5jZSB0 aGUgcmVtb3ZlZCByZWxhdGlvbnMuCisJICovCisJZm9yZWFjaChjZWxsLCByb290LT5lcV9j bGFzc2VzKQorCXsKKwkJRXF1aXZhbGVuY2VDbGFzcyAqZWMgPSBsZmlyc3QoY2VsbCk7CisK KwkJaWYgKCFibXNfaXNfbWVtYmVyKHRvUmVtb3ZlLT5yZWxpZCwgZWMtPmVjX3JlbGlkcykp CisJCXsKKwkJCS8qCisJCQkgKiBUaGlzIEVDIGRvZXNuJ3QgcmVmZXJlbmNlIHRoZSByZW1v dmVkIHJlbGF0aW9uLCBub3RoaW5nIHRvIGJlCisJCQkgKiBkb25lIGZvciBpdC4KKwkJCSAq LworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBVcGRhdGUgdGhlIEVDIG1lbWJl cnMgdG8gcmVmZXJlbmNlIHRoZSByZW1haW5pbmcgcmVsYXRpb24gaW5zdGVhZAorCQkgKiBv ZiB0aGUgcmVtb3ZlZCBvbmUuCisJCSAqLworCQl1cGRhdGVfZWNfbWVtYmVycyhlYywgdG9S ZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJZWMtPmVjX3JlbGlkcyA9IGNoYW5n ZV9yZWxpZChlYy0+ZWNfcmVsaWRzLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQp OworCisJCS8qCisJCSAqIFdlIHdpbGwgbm93IHVwZGF0ZSBzb3VyY2UgYW5kIGRlcml2ZWQg Y2xhdXNlcyBvZiB0aGUgRUMuCisJCSAqCisJCSAqIFJlc3RyaWN0aW9uIGNsYXVzZXMgZm9y IGJhc2UgcmVsYXRpb25zIGFyZSBhbHJlYWR5IGRpc3RyaWJ1dGVkIHRvCisJCSAqIHRoZSBy ZXNwZWN0aXZlIGJhc2VyZXN0cmljdGluZm8gbGlzdHMgKHNlZQorCQkgKiBnZW5lcmF0ZV9p bXBsaWVkX2VxdWFsaXRpZXMpLiBUaGUgYWJvdmUgY29kZSBoYXMgYWxyZWFkeSBwcm9jZXNz ZWQKKwkJICogdGhpcyBsaXN0LCBhbmQgdXBkYXRlZCB0aGVzZSBjbGF1c2VzIHRvIHJlZmVy ZW5jZSB0aGUgcmVtYWluaW5nCisJCSAqIHJlbGF0aW9uLCBzbyB3ZSBjYW4gc2tpcCB0aGVt IGhlcmUgYmFzZWQgb24gdGhlaXIgcmVsaWRzLgorCQkgKgorCQkgKiBMaWtld2lzZSwgd2Ug aGF2ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGUgam9pbiBjbGF1c2VzIHRoYXQgam9pbiB0aGUK KwkJICogcmVtb3ZlZCByZWxhdGlvbiB0byB0aGUgcmVtYWluaW5nIG9uZS4KKwkJICoKKwkJ ICogRmluYWxseSwgdGhlcmUgYXJlIGpvaW4gY2xhdXNlcyB0aGF0IGpvaW4gdGhlIHJlbW92 ZWQgcmVsYXRpb24gdG8KKwkJICogc29tZSB0aGlyZCByZWxhdGlvbi4gV2UgY2FuJ3QganVz dCBkZWxldGUgdGhlIHNvdXJjZSBjbGF1c2VzIGFuZAorCQkgKiByZWdlbmVyYXRlIHRoZW0g ZnJvbSB0aGUgRUMsIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgZXF1YWxpdHkKKwkJICog b3BlcmF0b3JzIG1pZ2h0IGJlIG1pc3NpbmcgKHNlZSB0aGUgaGFuZGxpbmcgb2YgZWNfYnJv a2VuKS4KKwkJICogVGhlcmVmb3JlLCB3ZSB3aWxsIHVwZGF0ZSB0aGUgcmVmZXJlbmNlcyBp biB0aGUgc291cmNlIGNsYXVzZXMuCisJCSAqCisJCSAqIERlcml2ZWQgY2xhdXNlcyBjYW4g YmUgZ2VuZXJhdGVkIGFnYWluLCBzbyBpdCBpcyBzaW1wbGVyIHRvIGp1c3QKKwkJICogZGVs ZXRlIHRoZW0uCisJCSAqLworCQlsaXN0X2ZyZWUoZWMtPmVjX2Rlcml2ZXMpOworCQllYy0+ ZWNfZGVyaXZlcyA9IE5VTEw7CisJCXVwZGF0ZV9lY19zb3VyY2VzKCZlYy0+ZWNfc291cmNl cywgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwl9CisKKwkvKgorCSAqIFRy YW5zZmVyIHRoZSB0YXJnZXRsaXN0IGFuZCBhdHRyX25lZWRlZCBmbGFncy4KKwkgKi8KKwlB c3NlcnQodG9SZW1vdmUtPnJlbHRhcmdldC0+c29ydGdyb3VwcmVmcyA9PSAwKTsKKworCWZv cmVhY2goY2VsbCwgdG9SZW1vdmUtPnJlbHRhcmdldC0+ZXhwcnMpCisJeworCQlFeHByCSAg ICpub2RlID0gbGZpcnN0KGNlbGwpOworCisJCWNoYW5nZV92YXJubyhub2RlLCB0b1JlbW92 ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQlpZiAoIWxpc3RfbWVtYmVyKHRvS2VlcC0+ cmVsdGFyZ2V0LT5leHBycywgbm9kZSkpCisJCQl0b0tlZXAtPnJlbHRhcmdldC0+ZXhwcnMg PSBsYXBwZW5kKHRvS2VlcC0+cmVsdGFyZ2V0LT5leHBycywgbm9kZSk7CisJfQorCisJZm9y IChpID0gdG9LZWVwLT5taW5fYXR0cjsgaSA8PSB0b0tlZXAtPm1heF9hdHRyOyBpKyspCisJ eworCQlpbnQJCQlhdHRubyA9IGkgLSB0b0tlZXAtPm1pbl9hdHRyOworCisJCS8qIFdlIGRp ZG4ndCBjaGFuZ2UgdG9SZW1vdmUgZHVyaW5nIHRoZSByZW1vdmVfcmVsX2Zyb21fcXVlcnkg ZXhlY3V0aW9uICovCisJCXRvUmVtb3ZlLT5hdHRyX25lZWRlZFthdHRub10gPSBjaGFuZ2Vf cmVsaWQoCisJCQkJCQkJCQkJCXRvUmVtb3ZlLT5hdHRyX25lZWRlZFthdHRub10sCisJCQkJ CQkJCQkJCXRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCXRvS2VlcC0+YXR0 cl9uZWVkZWRbYXR0bm9dID0gYm1zX2FkZF9tZW1iZXJzKHRvS2VlcC0+YXR0cl9uZWVkZWRb YXR0bm9dLAorCQkJCQkJCQkJCQkJCSB0b1JlbW92ZS0+YXR0cl9uZWVkZWRbYXR0bm9dKTsK Kwl9CisKKwkvKgorCSAqIElmIHRoZSByZW1vdmVkIHJlbGF0aW9uIGhhcyBhIHJvdyBtYXJr LCB0cmFuc2ZlciBpdCB0byB0aGUgcmVtYWluaW5nCisJICogb25lLgorCSAqCisJICogSWYg Ym90aCByZWxzIGhhdmUgcm93IG1hcmtzLCBqdXN0IGtlZXAgdGhlIG9uZSBjb3JyZXNwb25k aW5nIHRvIHRoZQorCSAqIHJlbWFpbmluZyByZWxhdGlvbiwgYmVjYXVzZSB3ZSB2ZXJpZmll ZCBlYXJsaWVyIHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lCisJICogc3RyZW5ndGguCisJICoK KwkgKiBBbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzY3JhdGNoLT5yb3dfbWFya3MgY2FjaGUg aXMgdXAgdG8gZGF0ZSwgYmVjYXVzZQorCSAqIHdlIGFyZSBnb2luZyB0byB1c2UgaXQgZm9y IGZ1cnRoZXIgam9pbiByZW1vdmFscy4KKwkgKi8KKwlpZiAocm1hcmspCisJeworCQlpZiAo a21hcmspCisJCXsKKwkJCUFzc2VydChrbWFyay0+bWFya1R5cGUgPT0gcm1hcmstPm1hcmtU eXBlKTsKKworCQkJLyoKKwkJCSAqIFhYWDogV2h5IGhlcmUgd2UgaGF2ZW4ndCBhbnkgZGlm ZmVyZW5jZXMgaW4gcmVtb3Zpbmcgcm1hcmsgb3IKKwkJCSAqIGttYXJrPworCQkJICovCisJ CQlyb290LT5yb3dNYXJrcyA9IGxpc3RfZGVsZXRlX3B0cihyb290LT5yb3dNYXJrcywgcm1h cmspOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogU2hvdWxkbid0IGhhdmUgaW5oZXJpdGFu Y2UgY2hpbGRyZW4gaGVyZS4gKi8KKwkJCUFzc2VydChybWFyay0+cnRpID09IHJtYXJrLT5w cnRpKTsKKworCQkJcm1hcmstPnJ0aSA9IHJtYXJrLT5wcnRpID0gdG9LZWVwLT5yZWxpZDsK KwkJfQorCX0KKworCS8qCisJICogQ2hhbmdlIHZhcm5vIGluIHNvbWUgc3BlY2lhbCBjYXNl cyB3aXRoIG5vbi10cml2aWFsIFJhbmdlVGJsRW50cnkKKwkgKi8KKwlmb3JlYWNoKGNlbGws IHJvb3QtPnBhcnNlLT5ydGFibGUpCisJeworCQlSYW5nZVRibEVudHJ5ICpydGUgPSBsZmly c3QoY2VsbCk7CisKKwkJc3dpdGNoIChydGUtPnJ0ZWtpbmQpCisJCXsKKwkJCWNhc2UgUlRF X0ZVTkNUSU9OOgorCQkJCWNoYW5nZV92YXJubygoRXhwciAqKSBydGUtPmZ1bmN0aW9ucywg dG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJCQlicmVhazsKKwkJCWNhc2Ug UlRFX1RBQkxFRlVOQzoKKwkJCQljaGFuZ2VfdmFybm8oKEV4cHIgKikgcnRlLT50YWJsZWZ1 bmMsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCQkJYnJlYWs7CisJCQlj YXNlIFJURV9WQUxVRVM6CisJCQkJY2hhbmdlX3Zhcm5vKChFeHByICopIHJ0ZS0+dmFsdWVz X2xpc3RzLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQkJCWJyZWFrOwor CQkJZGVmYXVsdDoKKwkJCQkvKiBubyBvcCAqLworCQkJCWJyZWFrOworCQl9CisJfQorCisJ LyoKKwkgKiBSZXBsYWNlIHZhcm5vIGluIHJvb3QgdGFyZ2V0bGlzdCBhbmQgSEFWSU5HIGNs YXVzZS4KKwkgKi8KKwljaGFuZ2VfdmFybm8oKEV4cHIgKikgcm9vdC0+cHJvY2Vzc2VkX3Rs aXN0LCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCWNoYW5nZV92YXJubygo RXhwciAqKSByb290LT5wYXJzZS0+aGF2aW5nUXVhbCwgdG9SZW1vdmUtPnJlbGlkLCB0b0tl ZXAtPnJlbGlkKTsKKworCS8qCisJICogVHJhbnNmZXIgam9pbiBhbmQgcmVzdHJpY3Rpb24g Y2xhdXNlcyBmcm9tIHRoZSByZW1vdmVkIHJlbGF0aW9uIHRvIHRoZQorCSAqIHJlbWFpbmlu ZyBvbmUuIFdlIGNoYW5nZSB0aGUgVmFycyBvZiB0aGUgY2xhdXNlIHRvIHBvaW50IHRvIHRo ZQorCSAqIHJlbWFpbmluZyByZWxhdGlvbiBpbnN0ZWFkIG9mIHRoZSByZW1vdmVkIG9uZS4g VGhlIGNsYXVzZXMgdGhhdCByZXF1aXJlCisJICogYSBzdWJzZXQgb2Ygam9pbnJlbGlkcyBi ZWNvbWUgcmVzdHJpY3Rpb24gY2xhdXNlcyBvZiB0aGUgcmVtYWluaW5nCisJICogcmVsYXRp b24sIGFuZCBvdGhlcnMgcmVtYWluIGpvaW4gY2xhdXNlcy4gV2UgYXBwZW5kIHRoZW0gdG8K KwkgKiBiYXNlcmVzdHJpY3RpbmZvIGFuZCBqb2luaW5mbyByZXNwZWN0aXZlbHksIHRyeWlu ZyBub3QgdG8gaW50cm9kdWNlCisJICogZHVwbGljYXRlcy4KKwkgKgorCSAqIFdlIGFsc28g aGF2ZSB0byBwcm9jZXNzIHRoZSAnam9pbmNsYXVzZXMnIGxpc3QgaGVyZSwgYmVjYXVzZSBp dAorCSAqIGNvbnRhaW5zIEVDLWRlcml2ZWQgam9pbiBjbGF1c2VzIHdoaWNoIG11c3QgYmVj b21lIGZpbHRlciBjbGF1c2VzLiBJdAorCSAqIGlzIG5vdCBlbm91Z2ggdG8ganVzdCBjb3Jy ZWN0IHRoZSBFQ3MsIGJlY2F1c2UgdGhlIEVDLWRlcml2ZWQKKwkgKiByZXN0cmljdGlvbnMg YXJlIGdlbmVyYXRlZCBiZWZvcmUgam9pbiByZW1vdmFsIChzZWUKKwkgKiBnZW5lcmF0ZV9i YXNlX2ltcGxpZWRfZXF1YWxpdGllcykuCisJICovCit9CisKKy8qCisgKiBzcGxpdF9zZWxm am9pbl9xdWFscworICoJCVByb2Nlc3NlcyAnam9pbnF1YWxzJyBidWlsZGluZyB0d28gbGlz dHMsIG9uZSB3aXRoIGEgbGlzdCBvZiBxdWFscworICoJCXdoZXJlIHRoZSBjb2x1bW5zL2V4 cHJzIG9uIGVpdGhlciBzaWRlIG9mIHRoZSBqb2luIG1hdGNoIGFuZCBhbm90aGVyCisgKgkJ bGlzdCBjb250YWluaW5nIHRoZSByZW1haW5pbmcgcXVhbHMuCisgKgorICogJ2pvaW5xdWFs cycgbXVzdCBvbmx5IGNvbnRhaW4gcXVhbHMgZm9yIGEgUlRFX1JFTEFUSU9OIGJlaW5nIGpv aW5lZCB0bworICogaXRzZWxmLgorICovCitzdGF0aWMgdm9pZAorc3BsaXRfc2VsZmpvaW5f cXVhbHMoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpvaW5xdWFscywgTGlzdCAqKnNlbGZq b2lucXVhbHMsCisJCQkJCSBMaXN0ICoqb3RoZXJqb2lucXVhbHMpCit7CisJTGlzdENlbGwg ICAqbGM7CisJTGlzdAkgICAqc2pvaW5xdWFscyA9IE5JTDsKKwlMaXN0CSAgICpvam9pbnF1 YWxzID0gTklMOworCisJZm9yZWFjaChsYywgam9pbnF1YWxzKQorCXsKKwkJUmVzdHJpY3RJ bmZvICpyaW5mbyA9IGxmaXJzdF9ub2RlKFJlc3RyaWN0SW5mbywgbGMpOworCQlPcEV4cHIJ ICAgKmV4cHI7CisJCUV4cHIJICAgKmxlZnRleHByOworCQlFeHByCSAgICpyaWdodGV4cHI7 CisKKwkJLyogSW4gZ2VuZXJhbCwgY2xhdXNlIGxvb2tzIGxpa2UgRihhcmcxKSA9IEcoYXJn MikgPyAqLworCQlpZiAoIXJpbmZvLT5tZXJnZW9wZmFtaWxpZXMgfHwKKwkJCWJtc19udW1f bWVtYmVycyhyaW5mby0+Y2xhdXNlX3JlbGlkcykgIT0gMiB8fAorCQkJYm1zX251bV9tZW1i ZXJzKHJpbmZvLT5sZWZ0X3JlbGlkcykgIT0gMSB8fAorCQkJYm1zX251bV9tZW1iZXJzKHJp bmZvLT5yaWdodF9yZWxpZHMpICE9IDEpCisJCXsKKwkJCW9qb2lucXVhbHMgPSBsYXBwZW5k KG9qb2lucXVhbHMsIHJpbmZvKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZXhwciA9IChP cEV4cHIgKikgcmluZm8tPmNsYXVzZTsKKworCQlpZiAoIUlzQShleHByLCBPcEV4cHIpIHx8 IGxpc3RfbGVuZ3RoKGV4cHItPmFyZ3MpICE9IDIpCisJCXsKKwkJCW9qb2lucXVhbHMgPSBs YXBwZW5kKG9qb2lucXVhbHMsIHJpbmZvKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbGVm dGV4cHIgPSAoRXhwciAqKSBjb3B5T2JqZWN0KGdldF9sZWZ0b3AocmluZm8tPmNsYXVzZSkp OworCQlyaWdodGV4cHIgPSAoRXhwciAqKSBjb3B5T2JqZWN0KGdldF9yaWdodG9wKHJpbmZv LT5jbGF1c2UpKTsKKworCQkvKiBDYW4ndCBtYXRjaCBvZiB0aGUgZXhwcnMgYXJlIG5vdCBv ZiB0aGUgc2FtZSB0eXBlICovCisJCWlmIChsZWZ0ZXhwci0+dHlwZSAhPSByaWdodGV4cHIt PnR5cGUpCisJCXsKKwkJCW9qb2lucXVhbHMgPSBsYXBwZW5kKG9qb2lucXVhbHMsIHJpbmZv KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY2hhbmdlX3Zhcm5vKHJpZ2h0ZXhwciwKKwkJ CQkJIGJtc19uZXh0X21lbWJlcihyaW5mby0+cmlnaHRfcmVsaWRzLCAtMSksCisJCQkJCSBi bXNfbmV4dF9tZW1iZXIocmluZm8tPmxlZnRfcmVsaWRzLCAtMSkpOworCisJCWlmIChlcXVh bChsZWZ0ZXhwciwgcmlnaHRleHByKSkKKwkJCXNqb2lucXVhbHMgPSBsYXBwZW5kKHNqb2lu cXVhbHMsIHJpbmZvKTsKKwkJZWxzZQorCQkJb2pvaW5xdWFscyA9IGxhcHBlbmQob2pvaW5x dWFscywgcmluZm8pOworCX0KKworCSpzZWxmam9pbnF1YWxzID0gc2pvaW5xdWFsczsKKwkq b3RoZXJqb2lucXVhbHMgPSBvam9pbnF1YWxzOworfQorCisvKgorICogQ2hlY2sgZm9yIGEg Y2FzZSB3aGVuIHVuaXF1ZW5lc3MgW3BhcnRseV0gZGVyaXZlZCBmcm9tIGEgYmFzZXJlc3Ry aWN0aW5mbworICogY2xhdXNlLiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSBhIGNoYW5jZSB0byBy ZXR1cm4gb25seSBvbmUgcm93IChpZiBzdWNoCisgKiBjbGF1c2VzIG9uIGJvdGggc2lkZXMg b2YgU0ogaXMgZXF1YWwpIG9yIG5vdGhpbmcgLSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCisg Ki8KK3N0YXRpYyBib29sCittYXRjaF91bmlxdWVfY2xhdXNlcyhSZWxPcHRJbmZvICpvdXRl ciwgTGlzdCAqdWNsYXVzZXMsIEluZGV4IHJlbGlkKQoreworCUxpc3RDZWxsICAgKmxjOwor CisJZm9yZWFjaChsYywgdWNsYXVzZXMpCisJeworCQlSZXN0cmljdEluZm8gICAqcmluZm8g PSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGxjKTsKKwkJRXhwcgkJICAgKmNsYXVzZTsK KwkJTm9kZQkJICAgKmljbGF1c2U7CisJCU5vZGUJCSAgICpjMTsKKwkJYm9vbAkJCW1hdGNo ZWQgPSBmYWxzZTsKKwkJTGlzdENlbGwJICAgKm9sYzsKKworCQlBc3NlcnQob3V0ZXItPnJl bGlkID4gMCAmJiByZWxpZCA+IDApOworCisJCS8qIE9ubHkgZmlsdGVycyBsaWtlIGYoUi54 MSwuLi4sUi54TikgPT0gZXhwciB3ZSBzaG91bGQgY29uc2lkZXIuICovCisJCUFzc2VydChi bXNfaXNfZW1wdHkocmluZm8tPmxlZnRfcmVsaWRzKSB8fAorCQkJICAgYm1zX2lzX2VtcHR5 KHJpbmZvLT5yaWdodF9yZWxpZHMpKTsKKworCQljbGF1c2UgPSAoRXhwciAqKSBjb3B5T2Jq ZWN0KHJpbmZvLT5jbGF1c2UpOworCQljaGFuZ2VfdmFybm8oY2xhdXNlLCByZWxpZCwgb3V0 ZXItPnJlbGlkKTsKKworCQljMSA9IChyaW5mby0+b3V0ZXJfaXNfbGVmdCA/IGdldF9sZWZ0 b3AoY2xhdXNlKSA6IGdldF9yaWdodG9wKGNsYXVzZSkpOworCQlpY2xhdXNlID0gKHJpbmZv LT5vdXRlcl9pc19sZWZ0ID8KKwkJCQkJCQkJCWdldF9yaWdodG9wKGNsYXVzZSkgOiBnZXRf bGVmdG9wKGNsYXVzZSkpOworCisJCS8qCisJCSAqIENvbXBhcmUgdGhlc2UgbGVmdCBhbmQg cmlnaHQgc2lkZXMgd2l0aCBjb3JyZXNwb25kaW5nIHNpZGVzIG9mIHRoZQorCQkgKiBvdXRl cidzIGZpbHRlcnMuIElmIG5vIG9uZSBkZXRlY3RlZCAtIHJldHVybiBpbW1lZGlhdGVseS4K KwkJICovCisJCWZvcmVhY2gob2xjLCBvdXRlci0+YmFzZXJlc3RyaWN0aW5mbykKKwkJewor CQkJUmVzdHJpY3RJbmZvICpvcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIG9s Yyk7CisJCQlOb2RlCQkgKm9jbGF1c2U7CisJCQlOb2RlCQkgKmMyOworCisJCQlpZiAob3Jp bmZvLT5tZXJnZW9wZmFtaWxpZXMgPT0gTklMKQorCQkJCS8qIERvbid0IGNvbnNpZGVyIGNs YXVzZXMgd2hpY2ggYXJlbid0IHNpbWlsYXIgdG8gJ0YoWCk9RyhZKScgKi8KKwkJCQljb250 aW51ZTsKKworCQkJb2NsYXVzZSA9IChibXNfaXNfZW1wdHkob3JpbmZvLT5sZWZ0X3JlbGlk cykgPworCQkJCQlnZXRfcmlnaHRvcChvcmluZm8tPmNsYXVzZSkgOiBnZXRfbGVmdG9wKG9y aW5mby0+Y2xhdXNlKSk7CisJCQljMiA9IChibXNfaXNfZW1wdHkob3JpbmZvLT5sZWZ0X3Jl bGlkcykgPworCQkJCSAgIGdldF9sZWZ0b3Aob3JpbmZvLT5jbGF1c2UpIDogZ2V0X3JpZ2h0 b3Aob3JpbmZvLT5jbGF1c2UpKTsKKworCQkJaWYgKGVxdWFsKGljbGF1c2UsIG9jbGF1c2Up ICYmIGVxdWFsKGMxLCBjMikpCisJCQl7CisJCQkJbWF0Y2hlZCA9IHRydWU7CisJCQkJYnJl YWs7CisJCQl9CisJCX0KKworCQlpZiAoIW1hdGNoZWQpCisJCQlyZXR1cm4gZmFsc2U7CisJ fQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBGaW5kIGFuZCByZW1vdmUgdW5pcXVl IHNlbGYgam9pbnMgaW4gYSBncm91cCBvZiBiYXNlIHJlbGF0aW9ucyB0aGF0IGhhdmUKKyAq IHRoZSBzYW1lIE9pZC4KKyAqCisgKiBSZXR1cm5zIGEgc2V0IG9mIHJlbGlkcyB0aGF0IHdl cmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIFJlbGlkcworcmVtb3ZlX3NlbGZfam9pbnNfb25l X2dyb3VwKFBsYW5uZXJJbmZvICpyb290LCBSZWxpZHMgcmVsaWRzKQoreworCVJlbGlkcwkJ am9pbnJlbGlkcyA9IE5VTEw7CisJUmVsaWRzCQlyZXN1bHQgPSBOVUxMOworCWludAkJCWs7 CQkJCS8qIEluZGV4IG9mIGtlcHQgcmVsYXRpb24gKi8KKwlpbnQJCQlyID0gLTE7CQkJLyog SW5kZXggb2YgcmVtb3ZlZCByZWxhdGlvbiAqLworCisJaWYgKGJtc19udW1fbWVtYmVycyhy ZWxpZHMpIDwgMikKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAoKHIgPSBibXNfbmV4dF9t ZW1iZXIocmVsaWRzLCByKSkgPiAwKQorCXsKKwkJUmVsT3B0SW5mbyAqb3V0ZXIgPSByb290 LT5zaW1wbGVfcmVsX2FycmF5W3JdOworCisJCWsgPSByOworCisJCXdoaWxlICgoayA9IGJt c19uZXh0X21lbWJlcihyZWxpZHMsIGspKSA+IDApCisJCXsKKwkJCVJlbE9wdEluZm8gKmlu bmVyID0gcm9vdC0+c2ltcGxlX3JlbF9hcnJheVtrXTsKKwkJCUxpc3QJICAgKnJlc3RyaWN0 bGlzdDsKKwkJCUxpc3QJICAgKnNlbGZqb2lucXVhbHM7CisJCQlMaXN0CSAgICpvdGhlcmpv aW5xdWFsczsKKwkJCUxpc3RDZWxsICAgKmxjOworCQkJYm9vbAkJamluZm9fY2hlY2sgPSB0 cnVlOworCQkJUGxhblJvd01hcmsgKm9tYXJrID0gTlVMTDsKKwkJCVBsYW5Sb3dNYXJrICpp bWFyayA9IE5VTEw7CisJCQlMaXN0CSAgICAqdWNsYXVzZXMgPSBOSUw7CisKKwkJCS8qIEEg c2FuaXR5IGNoZWNrOiB0aGUgcmVsYXRpb25zIGhhdmUgdGhlIHNhbWUgT2lkLiAqLworCQkJ QXNzZXJ0KHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlba10tPnJlbGlkID09CisJCQkJICAgcm9v dC0+c2ltcGxlX3J0ZV9hcnJheVtyXS0+cmVsaWQpOworCisJCQkvKgorCQkJICogSXQgaXMg aW1wb3NzaWJsZSB0byBvcHRpbWl6ZSB0d28gcmVsYXRpb25zIGlmIHRoZXkgYmVsb25nIHRv CisJCQkgKiBkaWZmZXJlbnQgcnVsZXMgb2Ygb3JkZXIgcmVzdHJpY3Rpb24uIE90aGVyd2lz ZSBwbGFubmVyIGNhbid0CisJCQkgKiBiZSBhYmxlIHRvIGZpbmQgYW55IHZhcmlhbnRzIG9m IGNvcnJlY3QgcXVlcnkgcGxhbi4KKwkJCSAqLworCQkJZm9yZWFjaChsYywgcm9vdC0+am9p bl9pbmZvX2xpc3QpCisJCQl7CisJCQkJU3BlY2lhbEpvaW5JbmZvICppbmZvID0gKFNwZWNp YWxKb2luSW5mbyAqKSBsZmlyc3QobGMpOworCisJCQkJaWYgKChibXNfaXNfbWVtYmVyKGss IGluZm8tPnN5bl9sZWZ0aGFuZCkgXgorCQkJCQkgYm1zX2lzX21lbWJlcihyLCBpbmZvLT5z eW5fbGVmdGhhbmQpKSB8fAorCQkJCQkoYm1zX2lzX21lbWJlcihrLCBpbmZvLT5zeW5fcmln aHRoYW5kKSBeCisJCQkJCSBibXNfaXNfbWVtYmVyKHIsIGluZm8tPnN5bl9yaWdodGhhbmQp KSkKKwkJCQl7CisJCQkJCWppbmZvX2NoZWNrID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJ CX0KKwkJCX0KKworCQkJaWYgKCFqaW5mb19jaGVjaykKKwkJCQljb250aW51ZTsKKworCQkJ LyogUmV1c2Ugam9pbnJlbGlkcyBiaXRzZXQgdG8gYXZvaWQgcmVhbGxvY2F0aW9uLiAqLwor CQkJam9pbnJlbGlkcyA9IGJtc19kZWxfbWVtYmVycyhqb2lucmVsaWRzLCBqb2lucmVsaWRz KTsKKworCQkJLyoKKwkJCSAqIFdlIG9ubHkgZGVhbCB3aXRoIGJhc2UgcmVscyBoZXJlLCBz byB0aGVpciByZWxpZHMgYml0c2V0CisJCQkgKiBjb250YWlucyBvbmx5IG9uZSBtZW1iZXIg LS0gdGhlaXIgcmVsaWQuCisJCQkgKi8KKwkJCWpvaW5yZWxpZHMgPSBibXNfYWRkX21lbWJl cihqb2lucmVsaWRzLCByKTsKKwkJCWpvaW5yZWxpZHMgPSBibXNfYWRkX21lbWJlcihqb2lu cmVsaWRzLCBrKTsKKworCQkJLyoKKwkJCSAqIEF0IHRoaXMgc3RhZ2Ugam9pbmluZm8gbGlz dHMgb2YgaW5uZXIgYW5kIG91dGVyIGNhbiBjb250YWluCisJCQkgKiBvbmx5IGNsYXVzZXMs IHJlcXVpcmVkIGZvciBhIHN1cGVyaW9yIG91dGVyIGpvaW4gdGhhdCBjYW4ndAorCQkJICog aW5mbHVlbmNlIG9uIHRoaXMgb3B0aW1pemF0aW9uLiBTbywgd2UgY2FuIGF2b2lkIHRvIGNh bGwgdGhlCisJCQkgKiBidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdCgpIHJvdXRpbmUuCisJ CQkgKi8KKwkJCXJlc3RyaWN0bGlzdCA9IGdlbmVyYXRlX2pvaW5faW1wbGllZF9lcXVhbGl0 aWVzKHJvb3QsIGpvaW5yZWxpZHMsCisJCQkJCQkJCQkJCQkJCQlvdXRlci0+cmVsaWRzLAor CQkJCQkJCQkJCQkJCQkJaW5uZXIsIDApOworCisJCQkvKgorCQkJICogUHJvY2VzcyByZXN0 cmljdGxpc3QgdG8gc2VwZXJhdGUgb3V0IHRoZSBzZWxmIGpvaW4gcXVhbHMgZnJvbQorCQkJ ICogdGhlIG90aGVyIHF1YWxzLiBlLmcgeCA9IHggZ29lcyB0byBzZWxmam9pbnF1YWxzIGFu ZCBhID0gYiB0bworCQkJICogb3RoZXJqb2lucXVhbHMuCisJCQkgKi8KKwkJCXNwbGl0X3Nl bGZqb2luX3F1YWxzKHJvb3QsIHJlc3RyaWN0bGlzdCwgJnNlbGZqb2lucXVhbHMsCisJCQkJ CQkJCSZvdGhlcmpvaW5xdWFscyk7CisKKwkJCS8qIElzIGl0IGFuIHVuaXF1ZSBzZWxmIGpv aW4/ICovCisKKwkJCWlmIChsaXN0X2xlbmd0aChzZWxmam9pbnF1YWxzKSA9PSAwKQorCQkJ eworCQkJCS8qCisJCQkJICogWFhYOiB3ZSB3b3VsZCBkZXRlY3Qgc2VsZi1qb2luIHdpdGhv dXQgcXVhbHMgbGlrZSAneD09eCcgaWYKKwkJCQkgKiB3ZSBoYWQgYW4gZm9yZWlnbiBrZXkg Y29uc3RyYWludCBvbiBzb21lIG9mIG90aGVyIHF1YWxzIGFuZAorCQkJCSAqIHRoaXMgam9p biBoYXZlbid0IGFueSBjb2x1bW5zIGZyb20gdGhlIG91dGVyIGluIHRoZSB0YXJnZXQKKwkJ CQkgKiBsaXN0LiBCdXQgaXQgaXMgc3RpbGwgY29tcGxleCB0YXNrLgorCQkJCSAqLworCQkJ CWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogRGV0ZXJtaW5lIGlmIHRoZSBpbm5l ciB0YWJsZSBjYW4gZHVwbGljYXRlIG91dGVyIHJvd3MuICBXZSBtdXN0CisJCQkgKiBieXBh c3MgdGhlIHVuaXF1ZSByZWwgY2FjaGUgaGVyZSBzaW5jZSB3ZSdyZSBwb3NzaWJseSB1c2lu ZyBhCisJCQkgKiBzdWJzZXQgb2Ygam9pbiBxdWFscy4gV2UgY2FuIHVzZSAnZm9yY2VfY2Fj aGUnID0gdHJ1ZSB3aGVuIGFsbAorCQkJICogam9pbiBxdWFscyBhcmUgc2VsZmpvaW4gcXVh bHMuICBPdGhlcndpc2Ugd2UgY291bGQgZW5kIHVwCisJCQkgKiBwdXR0aW5nIGZhbHNlIG5l Z2F0aXZlcyBpbiB0aGUgY2FjaGUuCisJCQkgKi8KKwkJCWlmICghaW5uZXJyZWxfaXNfdW5p cXVlX2V4dChyb290LCBqb2lucmVsaWRzLCBvdXRlci0+cmVsaWRzLAorCQkJCQkJCQkJCWlu bmVyLCBKT0lOX0lOTkVSLCBzZWxmam9pbnF1YWxzLAorCQkJCQkJCQkJCWxpc3RfbGVuZ3Ro KG90aGVyam9pbnF1YWxzKSA9PSAwLAorCQkJCQkJCQkJCSZ1Y2xhdXNlcykpCisJCQkJY29u dGludWU7CisKKwkJCS8qCisJCQkgKiBXZSBoYXZlIHByb3ZlbiB0aGF0IGZvciBib3RoIHJl bGF0aW9ucywgdGhlIHNhbWUgdW5pcXVlIGluZGV4CisJCQkgKiBndWFyYW50ZWVzIHRoYXQg dGhlcmUgaXMgYXQgbW9zdCBvbmUgcm93IHdoZXJlIGNvbHVtbnMgZXF1YWwKKwkJCSAqIGdp dmVuIHZhbHVlcy4gVGhlc2UgdmFsdWVzIG11c3QgYmUgdGhlIHNhbWUgZm9yIGJvdGggcmVs YXRpb25zLAorCQkJICogb3IgZWxzZSB3ZSB3b24ndCBtYXRjaCB0aGUgc2FtZSByb3cgb24g ZWFjaCBzaWRlIG9mIGpvaW4uCisJCQkgKi8KKwkJCWlmICghbWF0Y2hfdW5pcXVlX2NsYXVz ZXMob3V0ZXIsIHVjbGF1c2VzLCBpbm5lci0+cmVsaWQpKQorCQkJCWNvbnRpbnVlOworCisJ CQkvKiBTZWUgZm9yIHJvdyBtYXJrcy4gKi8KKwkJCWZvcmVhY2gobGMsIHJvb3QtPnJvd01h cmtzKQorCQkJeworCQkJCVBsYW5Sb3dNYXJrICpyb3dNYXJrID0gKFBsYW5Sb3dNYXJrICop IGxmaXJzdChsYyk7CisKKwkJCQlpZiAocm93TWFyay0+cnRpID09IGspCisJCQkJeworCQkJ CQlBc3NlcnQoaW1hcmsgPT0gTlVMTCk7CisJCQkJCWltYXJrID0gcm93TWFyazsKKwkJCQl9 CisJCQkJZWxzZSBpZiAocm93TWFyay0+cnRpID09IHIpCisJCQkJeworCQkJCQlBc3NlcnQo b21hcmsgPT0gTlVMTCk7CisJCQkJCW9tYXJrID0gcm93TWFyazsKKwkJCQl9CisKKwkJCQlp ZiAob21hcmsgJiYgaW1hcmspCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICog V2UgY2FuJ3QgcmVtb3ZlIHRoZSBqb2luIGlmIHRoZSByZWxhdGlvbnMgaGF2ZSByb3cgbWFy a3Mgb2YKKwkJCSAqIGRpZmZlcmVudCBzdHJlbmd0aCAoZS5nLiBvbmUgaXMgbG9ja2VkIEZP UiBVUERBVEUgYW5kIGFub3RoZXIKKwkJCSAqIGp1c3QgaGFzIFJPV19NQVJLX1JFRkVSRU5D RSBmb3IgRXZhbFBsYW5RdWFsIHJlY2hlY2tpbmcpLgorCQkJICovCisJCQlpZiAob21hcmsg JiYgaW1hcmsgJiYgb21hcmstPm1hcmtUeXBlICE9IGltYXJrLT5tYXJrVHlwZSkKKwkJCQlj b250aW51ZTsKKworCQkJLyoKKwkJCSAqIEJlIHNhZmUgdG8gZG8gbm90IHJlbW92ZSB0YWJs ZSBwYXJ0aWNpcGF0ZWQgaW4gY29tcGxpY2F0ZWQgUEgKKwkJCSAqLworCQkJZm9yZWFjaChs Yywgcm9vdC0+cGxhY2Vob2xkZXJfbGlzdCkKKwkJCXsKKwkJCQlQbGFjZUhvbGRlckluZm8g KnBoaW5mbyA9IChQbGFjZUhvbGRlckluZm8gKikgbGZpcnN0KGxjKTsKKworCQkJCS8qIHRo ZXJlIGlzbid0IGFueSBvdGhlciBwbGFjZSB0byBldmFsIFBIViAqLworCQkJCWlmIChibXNf aXNfc3Vic2V0KHBoaW5mby0+cGhfZXZhbF9hdCwgam9pbnJlbGlkcykgfHwKKwkJCQkJYm1z X2lzX3N1YnNldChwaGluZm8tPnBoX25lZWRlZCwgam9pbnJlbGlkcykpCisJCQkJCWJyZWFr OworCQkJfQorCisJCQlpZiAobGMpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBX ZSBjYW4gcmVtb3ZlIGVpdGhlciByZWxhdGlvbiwgc28gcmVtb3ZlIHRoZSBvdXRlciBvbmUs IHRvCisJCQkgKiBzaW1wbGlmeSB0aGlzIGxvb3AuCisJCQkgKi8KKworCQkJLyoKKwkJCSAq IEF0dGFjaCB0aGUgcmVzdHJpY3Rpb25zIHRvIHJlbW92aW5nIHJlbGF0aW9uIHRvIHNpbXBs aWZ5IHJlbGlkcworCQkJICogcmVwbGFjaW5nIHByb2NlZHVyZS4gam9pbmluZm8gY2xhdXNl cyBvZiByZW1vdmluZyByZWxhdGlvbiB3aWxsCisJCQkgKiBiZSBtb3ZlZCB0byB0aGUga2Vl cGluZyBvbmUgYnkgdGhlIHJlbW92ZV9yZWxfZnJvbV9xdWVyeSgpLgorCQkJICovCisJCQlv dXRlci0+YmFzZXJlc3RyaWN0aW5mbyA9IGxpc3RfY29uY2F0KG91dGVyLT5iYXNlcmVzdHJp Y3RpbmZvLAorCQkJCQkJCQkJCQkJcmVzdHJpY3RsaXN0KTsKKworCQkJLyogRmlyc3RseSwg cmVwbGFjZSBpbmRleCBvZiBleGNsdWRpbmcgcmVsYXRpb24gd2l0aCB0aGUga2VlcGluZyBv bmUuICovCisJCQlyZW1vdmVfcmVsX2Zyb21fcXVlcnkocm9vdCwgb3V0ZXItPnJlbGlkLCAw LCBqb2lucmVsaWRzLCBpbm5lci0+cmVsaWQpOworCisJCQkvKiBTZWNvbmRseSwgZml4IHJl c3RyaWN0aW9ucyBvZiBrZWVwaW5nIHJlbGF0aW9uICovCisJCQlyZW1vdmVfc2VsZl9qb2lu X3JlbChyb290LCBpbWFyaywgb21hcmssIGlubmVyLCBvdXRlcik7CisKKwkJCXJlc3VsdCA9 IGJtc19hZGRfbWVtYmVyKHJlc3VsdCwgcik7CisKKwkJCS8qIFdlIHJlbW92ZWQgdGhlIG91 dGVyIHJlbGF0aW9uLCB0cnkgdGhlIG5leHQgb25lLiAqLworCQkJYnJlYWs7CisJCX0KKwl9 CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogSXRlcmF0aXZlbHkgZm9ybSBhIGdy b3VwIG9mIHJlbGF0aW9uIGluZGV4ZXMgd2l0aCB0aGUgc2FtZSBvaWQgYW5kIGxhdW5jaAor ICogdGhlIHJvdXRpbmUgdGhhdCBkZXRlY3RzIHNlbGYtam9pbnMgaW4gdGhpcyBncm91cCBh bmQgcmVtb3ZlcyBleGNlc3NpdmUKKyAqIHJhbmdlIHRhYmxlIGVudHJpZXMuCisgKgorICog QXQgdGhlIGVuZCBvZiBpdGVyYXRpb24sIGV4Y2x1ZGUgdGhlIGdyb3VwIGZyb20gdGhlIG92 ZXJhbGwgcmVsaWRzIGxpc3QuCisgKiBTbyBlYWNoIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBj eWNsZSB3aWxsIGludm9sdmUgbGVzcyBhbmQgbGVzcyB2YWx1ZSBvZgorICogcmVsaWRzLgor ICovCitzdGF0aWMgUmVsaWRzCityZW1vdmVfc2VsZl9qb2luc19vbmVfbGV2ZWwoUGxhbm5l ckluZm8gKnJvb3QsIFJlbGlkcyByZWxpZHMsIFJlbGlkcyBUb1JlbW92ZSkKK3sKKwlpbnQg aSA9IC0xOworCisJd2hpbGUgKChpID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgaSkpID49 IDApCisJeworCQlSZWxpZHMJCWdyb3VwID0gTlVMTDsKKwkJT2lkCQkJZ3JvdXBPaWQ7CisJ CWludAkJCWogPSBpOworCisJCWdyb3VwT2lkID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtp XS0+cmVsaWQ7CisJCUFzc2VydChPaWRJc1ZhbGlkKGdyb3VwT2lkKSk7CisJCWdyb3VwID0g Ym1zX2FkZF9tZW1iZXIoZ3JvdXAsIGkpOworCisJCS8qIENyZWF0ZSBncm91cCBvZiByZWxh dGlvbiBpbmRleGVzIHdpdGggdGhlIHNhbWUgb2lkLiAqLworCQl3aGlsZSAoKGogPSBibXNf bmV4dF9tZW1iZXIocmVsaWRzLCBqKSkgPj0gMCkKKwkJeworCQkJUmFuZ2VUYmxFbnRyeSAq cnRlID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtqXTsKKworCQkJQXNzZXJ0KE9pZElzVmFs aWQocnRlLT5yZWxpZCkpOworCisJCQlpZiAocnRlLT5yZWxpZCA9PSBncm91cE9pZCkKKwkJ CQlncm91cCA9IGJtc19hZGRfbWVtYmVyKGdyb3VwLCBqKTsKKwkJfQorCisJCXJlbGlkcyA9 IGJtc19kZWxfbWVtYmVycyhyZWxpZHMsIGdyb3VwKTsKKwkJVG9SZW1vdmUgPSBibXNfYWRk X21lbWJlcnMoVG9SZW1vdmUsCisJCQkJCQkJCSAgIHJlbW92ZV9zZWxmX2pvaW5zX29uZV9n cm91cChyb290LCBncm91cCkpOworCQlibXNfZnJlZShncm91cCk7CisJfQorCisJQXNzZXJ0 KGJtc19pc19lbXB0eShyZWxpZHMpKTsKKwlyZXR1cm4gVG9SZW1vdmU7Cit9CisKKy8qCisg KiBGb3IgZWFjaCBsZXZlbCBvZiBqb2lubGlzdCBmb3JtIGEgc2V0IG9mIGJhc2UgcmVsYXRp b25zIGFuZCBsYXVuY2ggdGhlCisgKiByb3V0aW5lIG9mIHRoZSBzZWxmLWpvaW4gcmVtb3Zh bCBvcHRpbWl6YXRpb24uIFJlY3Vyc2UgaW50byBzdWItam9pbmxpc3RzIHRvCisgKiBoYW5k bGUgZGVlcGVyIGxldmVscy4KKyAqLworc3RhdGljIFJlbGlkcworcmVtb3ZlX3NlbGZfam9p bnNfcmVjdXJzZShQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqam9pbmxpc3QsIFJlbGlkcyBU b1JlbW92ZSkKK3sKKwlMaXN0Q2VsbCAgICpqbDsKKwlSZWxpZHMJCXJlbGlkcyA9IE5VTEw7 CisKKwkvKiBDb2xsZWN0IHRoZSBpZHMgb2YgYmFzZSByZWxhdGlvbnMgYXQgb25lIGxldmVs IG9mIHRoZSBqb2luIHRyZWUuICovCisJZm9yZWFjaChqbCwgam9pbmxpc3QpCisJeworCQlO b2RlICAgKmpsbm9kZSA9IChOb2RlICopIGxmaXJzdChqbCk7CisKKwkJaWYgKElzQShqbG5v ZGUsIFJhbmdlVGJsUmVmKSkKKwkJeworCQkJUmFuZ2VUYmxSZWYJICAgKnJlZiA9IChSYW5n ZVRibFJlZiAqKSBqbG5vZGU7CisJCQlSYW5nZVRibEVudHJ5ICAqcnRlID0gcm9vdC0+c2lt cGxlX3J0ZV9hcnJheVtyZWYtPnJ0aW5kZXhdOworCisJCQkvKgorCQkJICogV2Ugb25seSBj YXJlIGFib3V0IGJhc2UgcmVsYXRpb25zIGZyb20gd2hpY2ggd2Ugc2VsZWN0CisJCQkgKiBz b21ldGhpbmcuCisJCQkgKi8KKwkJCWlmIChydGUtPnJ0ZWtpbmQgPT0gUlRFX1JFTEFUSU9O ICYmCisJCQkJcnRlLT5yZWxraW5kID09IFJFTEtJTkRfUkVMQVRJT04gJiYKKwkJCQlyb290 LT5zaW1wbGVfcmVsX2FycmF5W3JlZi0+cnRpbmRleF0gIT0gTlVMTCkKKwkJCXsKKwkJCQlB c3NlcnQoIWJtc19pc19tZW1iZXIocmVmLT5ydGluZGV4LCByZWxpZHMpKTsKKwkJCQlyZWxp ZHMgPSBibXNfYWRkX21lbWJlcihyZWxpZHMsIHJlZi0+cnRpbmRleCk7CisJCQl9CisJCX0K KwkJZWxzZSBpZiAoSXNBKGpsbm9kZSwgTGlzdCkpCisJCQkvKiBSZWN1cnNpdmVseSBnbyBp bnNpZGUgdGhlIHN1Yi1qb2lubGlzdCAqLworCQkJVG9SZW1vdmUgPSByZW1vdmVfc2VsZl9q b2luc19yZWN1cnNlKHJvb3QsIChMaXN0ICopIGpsbm9kZSwKKwkJCQkJCQkJCQkJCSBUb1Jl bW92ZSk7CisJCWVsc2UKKwkJCWVsb2coRVJST1IsICJ1bnJlY29nbml6ZWQgam9pbmxpc3Qg bm9kZSB0eXBlOiAlZCIsCisJCQkJIChpbnQpIG5vZGVUYWcoamxub2RlKSk7CisKKwkJLyoK KwkJICogTGltaXQgdGhlIG51bWJlciBvZiBqb2lucyB3ZSBwcm9jZXNzIHRvIGNvbnRyb2wg dGhlCisJCSAqIHF1YWRyYXRpYyBiZWhhdmlvci4KKwkJICovCisJCWlmIChibXNfbnVtX21l bWJlcnMocmVsaWRzKSA+PSBzZWxmX2pvaW5fc2VhcmNoX2xpbWl0KQorCQkJYnJlYWs7CisJ fQorCisJLyoKKwkgKiByZW1vdmVfc2VsZl9qb2luc19vbmVfbGV2ZWwgY2xlYW5zIHRoZSBy ZWxpZHMgYml0bWFwc2V0IGJ5IGl0c2VsZiwgc28gd2UKKwkgKiBzaG91bGQgZnJlZSBpdCBv bmx5IGlmIG5vIGFueSBvcHRpbWl6YXRpb24gaGFzIGJlZW4gbWFkZS4KKwkgKi8KKwlpZiAo Ym1zX251bV9tZW1iZXJzKHJlbGlkcykgPj0gMikKKwkJVG9SZW1vdmUgPSByZW1vdmVfc2Vs Zl9qb2luc19vbmVfbGV2ZWwocm9vdCwgcmVsaWRzLCBUb1JlbW92ZSk7CisJZWxzZQorCQli bXNfZnJlZShyZWxpZHMpOworCisJcmV0dXJuIFRvUmVtb3ZlOworfQorCisvKgorICogRmlu ZCBhbmQgcmVtb3ZlIHVzZWxlc3Mgc2VsZiBqb2lucy4KKyAqCisgKiBXZSBzZWFyY2ggZm9y IGpvaW5zIHdoZXJlIHRoZSBzYW1lIHJlbGF0aW9uIGlzIGpvaW5lZCB0byBpdHNlbGYgb24g YWxsCisgKiBjb2x1bW5zIG9mIHNvbWUgdW5pcXVlIGluZGV4LiBJZiB0aGlzIGNvbmRpdGlv biBob2xkcywgdGhlbiwgZm9yCisgKiBlYWNoIG91dGVyIHJvdywgb25seSBvbmUgaW5uZXIg cm93IG1hdGNoZXMsIGFuZCBpdCBpcyB0aGUgc2FtZSByb3cKKyAqIG9mIHRoZSBzYW1lIHJl bGF0aW9uLiBUaGlzIGFsbG93cyB1cyB0byByZW1vdmUgdGhlIGpvaW4gYW5kIHJlcGxhY2UK KyAqIGl0IHdpdGggYSBzY2FuIHRoYXQgY29tYmluZXMgV0hFUkUgY2xhdXNlcyBmcm9tIGJv dGggc2lkZXMuIFRoZSBqb2luCisgKiBjbGF1c2VzIHRoZW1zZWx2ZXMgYXNzdW1lIHRoZSBm b3JtIG9mIFggPSBYIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aAorICogTk9UIE5VTEwgY2xh dXNlcy4KKyAqCisgKiBGb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSwgd2UgZG9uJ3QgYXBw bHkgdGhpcyBvcHRpbWl6YXRpb24gdG8gc3BlY2lhbAorICogam9pbnMuIEhlcmUgaXMgYSBs aXN0IG9mIHdoYXQgd2UgY291bGQgZG8gaW4gc29tZSBwYXJ0aWN1bGFyIGNhc2VzOgorICog J2EgYTEgc2VtaSBqb2luIGEgYTInOiBpcyByZWR1Y2VkIHRvIGlubmVyIGJ5IHJlZHVjZV91 bmlxdWVfc2VtaWpvaW5zLAorICogYW5kIHRoZW4gcmVtb3ZlZCBub3JtYWxseS4KKyAqICdh IGExIGFudGkgam9pbiBhIGEyJzogY291bGQgc2ltcGxpZnkgdG8gYSBzY2FuIHdpdGggJ291 dGVyIHF1YWxzIEFORAorICogKElTIE5VTEwgb24gam9pbiBjb2x1bW5zIE9SIE5PVCBpbm5l ciBxdWFscyknLgorICogJ2EgYTEgbGVmdCBqb2luIGEgYTInOiBjb3VsZCBzaW1wbGlmeSB0 byBhIHNjYW4gbGlrZSBpbm5lciwgYnV0IHdpdGhvdXQKKyAqIE5PVCBOVUxMIGNvbmRpdGlv bnMgb24gam9pbiBjb2x1bW5zLgorICogJ2EgYTEgbGVmdCBqb2luIChhIGEyIGpvaW4gYikn OiBjYW4ndCBzaW1wbGlmeSB0aGlzLCBiZWNhdXNlIGpvaW4gdG8gYgorICogY2FuIGJvdGgg cmVtb3ZlIHJvd3MgYW5kIGludHJvZHVjZSBkdXBsaWNhdGVzLgorICoKKyAqIFRvIHNlYXJj aCBmb3IgcmVtb3ZhYmxlIGpvaW5zLCB3ZSBvcmRlciBhbGwgdGhlIHJlbGF0aW9ucyBvbiB0 aGVpciBPaWQsCisgKiBnbyBvdmVyIGVhY2ggc2V0IHdpdGggdGhlIHNhbWUgT2lkLCBhbmQg Y29uc2lkZXIgZWFjaCBwYWlyIG9mIHJlbGF0aW9ucworICogaW4gdGhpcyBzZXQuIFdlIGNo ZWNrIHRoYXQgYm90aCByZWxhdGlvbiBhcmUgbWFkZSB1bmlxdWUgYnkgdGhlIHNhbWUKKyAq IHVuaXF1ZSBpbmRleCB3aXRoIHRoZSBzYW1lIGNsYXVzZXMuCisgKgorICogVG8gcmVtb3Zl IHRoZSBqb2luLCB3ZSBtYXJrIG9uZSBvZiB0aGUgcGFydGljaXBhdGluZyByZWxhdGlvbnMg YXMKKyAqIGRlYWQsIGFuZCByZXdyaXRlIGFsbCByZWZlcmVuY2VzIHRvIGl0IHRvIHBvaW50 IHRvIHRoZSByZW1haW5pbmcKKyAqIHJlbGF0aW9uLiBUaGlzIGluY2x1ZGVzIG1vZGlmeWlu ZyBSZXN0cmljdEluZm9zLCBFcXVpdmFsZW5jZUNsYXNzZXMgYW5kCisgKiBFcXVpdmFsZW5j ZU1lbWJlcnMuIFdlIGFsc28gaGF2ZSB0byBtb2RpZnkgdGhlIHJvdyBtYXJrcy4gVGhlIGpv aW4gY2xhdXNlcworICogb2YgdGhlIHJlbW92ZWQgcmVsYXRpb24gYmVjb21lIGVpdGhlciBy ZXN0cmljdGlvbiBvciBqb2luIGNsYXVzZXMsIGJhc2VkIG9uCisgKiB3aGV0aGVyIHRoZXkg cmVmZXJlbmNlIGFueSByZWxhdGlvbnMgbm90IHBhcnRpY2lwYXRpbmcgaW4gdGhlIHJlbW92 ZWQgam9pbi4KKyAqCisgKiAndGFyZ2V0bGlzdCcgaXMgdGhlIHRvcC1sZXZlbCB0YXJnZXRs aXN0IG9mIHF1ZXJ5LiBJZiBpdCBoYXMgYW55IHJlZmVyZW5jZXMKKyAqIHRvIHRoZSByZW1v dmVkIHJlbGF0aW9ucywgd2UgdXBkYXRlIHRoZW0gdG8gcG9pbnQgdG8gdGhlIHJlbWFpbmlu ZyBvbmVzLgorICovCitMaXN0ICoKK3JlbW92ZV91c2VsZXNzX3NlbGZfam9pbnMoUGxhbm5l ckluZm8gKnJvb3QsIExpc3QgKmpvaW5saXN0KQoreworCVJlbGlkcwkJVG9SZW1vdmUgPSBO VUxMOworCWludAkJCXJlbGlkID0gLTE7CisKKwlpZiAoIWVuYWJsZV9zZWxmX2pvaW5fcmVt b3ZhbCB8fCBsaXN0X2xlbmd0aChqb2lubGlzdCkgPD0gMSkKKwkJcmV0dXJuIGpvaW5saXN0 OworCisJLyoKKwkgKiBNZXJnZSBwYWlycyBvZiByZWxhdGlvbnMgcGFydGljaXBhdGVkIGlu IHNlbGYtam9pbi4gUmVtb3ZlIHVubmVjZXNzYXJ5CisJICogcmFuZ2UgdGFibGUgZW50cmll cy4KKwkgKi8KKwlUb1JlbW92ZSA9IHJlbW92ZV9zZWxmX2pvaW5zX3JlY3Vyc2Uocm9vdCwg am9pbmxpc3QsIFRvUmVtb3ZlKTsKKwl3aGlsZSAoKHJlbGlkID0gYm1zX25leHRfbWVtYmVy KFRvUmVtb3ZlLCByZWxpZCkpID49IDApCisJeworCQlpbnQJCQlucmVtb3ZlZCA9IDA7CisK KwkJam9pbmxpc3QgPSByZW1vdmVfcmVsX2Zyb21fam9pbmxpc3Qoam9pbmxpc3QsIHJlbGlk LCAmbnJlbW92ZWQpOworCX0KKworCXJldHVybiBqb2lubGlzdDsKIH0KZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5tYWluLmMgYi9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGxhbi9wbGFubWFpbi5jCmluZGV4IDdhZmQ0MzRjNjAuLjc0OGUyYTNlYzgg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5tYWluLmMKKysr IGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYwpAQCAtMjI4LDYgKzIy OCwxMSBAQCBxdWVyeV9wbGFubmVyKFBsYW5uZXJJbmZvICpyb290LAogCSAqLwogCXJlZHVj ZV91bmlxdWVfc2VtaWpvaW5zKHJvb3QpOwogCisJLyoKKwkgKiBSZW1vdmUgc2VsZiBqb2lu cyBvbiBhIHVuaXF1ZSBjb2x1bW4uCisJICovCisJam9pbmxpc3QgPSByZW1vdmVfdXNlbGVz c19zZWxmX2pvaW5zKHJvb3QsIGpvaW5saXN0KTsKKwogCS8qCiAJICogTm93IGRpc3RyaWJ1 dGUgInBsYWNlaG9sZGVycyIgdG8gYmFzZSByZWxzIGFzIG5lZWRlZC4gIFRoaXMgaGFzIHRv IGJlCiAJICogZG9uZSBhZnRlciBqb2luIHJlbW92YWwgYmVjYXVzZSByZW1vdmFsIGNvdWxk IGNoYW5nZSB3aGV0aGVyIGEKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2Mv Z3VjX3RhYmxlcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKaW5k ZXggNjhhZWNhZDY2Zi4uZGQwMTlkZmQ3OCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRp bHMvbWlzYy9ndWNfdGFibGVzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNf dGFibGVzLmMKQEAgLTEwMjIsNiArMTAyMiwxNiBAQCBzdHJ1Y3QgY29uZmlnX2Jvb2wgQ29u ZmlndXJlTmFtZXNCb29sW10gPQogCQl0cnVlLAogCQlOVUxMLCBOVUxMLCBOVUxMCiAJfSwK Kwl7CisJCXsiZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsIiwgUEdDX1VTRVJTRVQsIFFVRVJZ X1RVTklOR19NRVRIT0QsCisJCQlnZXR0ZXh0X25vb3AoIkVuYWJsZSByZW1vdmFsIG9mIHVu aXF1ZSBzZWxmLWpvaW5zLiIpLAorCQkJTlVMTCwKKwkJCUdVQ19FWFBMQUlOIHwgR1VDX05P VF9JTl9TQU1QTEUKKwkJfSwKKwkJJmVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCwKKwkJdHJ1 ZSwKKwkJTlVMTCwgTlVMTCwgTlVMTAorCX0sCiAJewogCQl7ImdlcW8iLCBQR0NfVVNFUlNF VCwgUVVFUllfVFVOSU5HX0dFUU8sCiAJCQlnZXR0ZXh0X25vb3AoIkVuYWJsZXMgZ2VuZXRp YyBxdWVyeSBvcHRpbWl6YXRpb24uIiksCkBAIC0yMDY5LDYgKzIwNzksMTggQEAgc3RydWN0 IGNvbmZpZ19pbnQgQ29uZmlndXJlTmFtZXNJbnRbXSA9CiAJCTgsIDEsIElOVF9NQVgsCiAJ CU5VTEwsIE5VTEwsIE5VTEwKIAl9LAorCXsKKwkJeyJzZWxmX2pvaW5fc2VhcmNoX2xpbWl0 IiwgUEdDX1VTRVJTRVQsIFFVRVJZX1RVTklOR19PVEhFUiwKKwkJCWdldHRleHRfbm9vcCgi TWF4IHNpemUgb2YgYSBncm91cCBvZiBwbGFpbiB0YWJsZXMgd2hlcmUgcGxhbm5lciAiCisJ CQkJCQkgIndpbGwgbG9va3VwIGZvciBzZWxmIGpvaW5zLiIpLAorCQkJZ2V0dGV4dF9ub29w KCJJZiBhIG51bWJlciBvZiB0YWJsZXMgaW4gRlJPTS1saXN0IGlzIGV4Y2VlZGVkIHRoaXMg IgorCQkJCQkJICJsaW1pdCwgdGhlIHBsYW5uZXIgd2lsbCBpZ25vcmUgdGFibGVzIGJleW9u ZCBpdC4iKSwKKwkJCUdVQ19FWFBMQUlOIHwgR1VDX05PVF9JTl9TQU1QTEUKKwkJfSwKKwkJ JnNlbGZfam9pbl9zZWFyY2hfbGltaXQsCisJCTMyLCAxLCBJTlRfTUFYLAorCQlOVUxMLCBO VUxMLCBOVUxMCisJfSwKIAl7CiAJCXsiZ2Vxb190aHJlc2hvbGQiLCBQR0NfVVNFUlNFVCwg UVVFUllfVFVOSU5HX0dFUU8sCiAJCQlnZXR0ZXh0X25vb3AoIlNldHMgdGhlIHRocmVzaG9s ZCBvZiBGUk9NIGl0ZW1zIGJleW9uZCB3aGljaCBHRVFPIGlzIHVzZWQuIiksCmRpZmYgLS1n aXQgYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaCBiL3NyYy9pbmNsdWRlL29wdGlt aXplci9wYXRocy5oCmluZGV4IDUwYmMzYjUwM2EuLjM3ZjU3N2U5YjAgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRocy5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGlt aXplci9wYXRocy5oCkBAIC03NSw2ICs3NSw5IEBAIGV4dGVybiB2b2lkIGNyZWF0ZV9pbmRl eF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKTsKIGV4dGVybiBi b29sIHJlbGF0aW9uX2hhc191bmlxdWVfaW5kZXhfZm9yKFBsYW5uZXJJbmZvICpyb290LCBS ZWxPcHRJbmZvICpyZWwsCiAJCQkJCQkJCQkJICBMaXN0ICpyZXN0cmljdGxpc3QsCiAJCQkJ CQkJCQkJICBMaXN0ICpleHBybGlzdCwgTGlzdCAqb3BybGlzdCk7CitleHRlcm4gYm9vbCBy ZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4dChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqcmVsLAorCQkJCQkJCQkJCSAgTGlzdCAqcmVzdHJpY3RsaXN0LCBMaXN0ICpleHBy bGlzdCwKKwkJCQkJCQkJCQkgIExpc3QgKm9wcmxpc3QsIExpc3QgKipleHRyYV9jbGF1c2Vz KTsKIGV4dGVybiBib29sIGluZGV4Y29sX2lzX2Jvb2xfY29uc3RhbnRfZm9yX3F1ZXJ5KFBs YW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJCQkJSW5kZXhPcHRJbmZvICppbmRleCwKIAkJ CQkJCQkJCQkJCWludCBpbmRleGNvbCk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcHRp bWl6ZXIvcGxhbm1haW4uaCBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oCmlu ZGV4IDVmYzkwMDczN2QuLmQyNmMwZDNlYTUgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29w dGltaXplci9wbGFubWFpbi5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFp bi5oCkBAIC0yMCw2ICsyMCw4IEBACiAvKiBHVUMgcGFyYW1ldGVycyAqLwogI2RlZmluZSBE RUZBVUxUX0NVUlNPUl9UVVBMRV9GUkFDVElPTiAwLjEKIGV4dGVybiBQR0RMTElNUE9SVCBk b3VibGUgY3Vyc29yX3R1cGxlX2ZyYWN0aW9uOworZXh0ZXJuIFBHRExMSU1QT1JUIGJvb2wg ZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsOworZXh0ZXJuIFBHRExMSU1QT1JUIGludCBzZWxm X2pvaW5fc2VhcmNoX2xpbWl0OwogCiAvKiBxdWVyeV9wbGFubmVyIGNhbGxiYWNrIHRvIGNv bXB1dGUgcXVlcnlfcGF0aGtleXMgKi8KIHR5cGVkZWYgdm9pZCAoKnF1ZXJ5X3BhdGhrZXlz X2NhbGxiYWNrKSAoUGxhbm5lckluZm8gKnJvb3QsIHZvaWQgKmV4dHJhKTsKQEAgLTEwNCw2 ICsxMDYsMTEgQEAgZXh0ZXJuIGJvb2wgcXVlcnlfaXNfZGlzdGluY3RfZm9yKFF1ZXJ5ICpx dWVyeSwgTGlzdCAqY29sbm9zLCBMaXN0ICpvcGlkcyk7CiBleHRlcm4gYm9vbCBpbm5lcnJl bF9pc191bmlxdWUoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJICAgUmVsaWRzIGpvaW5y ZWxpZHMsIFJlbGlkcyBvdXRlcnJlbGlkcywgUmVsT3B0SW5mbyAqaW5uZXJyZWwsCiAJCQkJ CQkJICAgSm9pblR5cGUgam9pbnR5cGUsIExpc3QgKnJlc3RyaWN0bGlzdCwgYm9vbCBmb3Jj ZV9jYWNoZSk7CitleHRlcm4gYm9vbCBpbm5lcnJlbF9pc191bmlxdWVfZXh0KFBsYW5uZXJJ bmZvICpyb290LCBSZWxpZHMgam9pbnJlbGlkcywKKwkJCQkJCQkJICAgUmVsaWRzIG91dGVy cmVsaWRzLCBSZWxPcHRJbmZvICppbm5lcnJlbCwKKwkJCQkJCQkJICAgSm9pblR5cGUgam9p bnR5cGUsIExpc3QgKnJlc3RyaWN0bGlzdCwKKwkJCQkJCQkJICAgYm9vbCBmb3JjZV9jYWNo ZSwgTGlzdCAqKnVjbGF1c2VzKTsKK2V4dGVybiBMaXN0ICpyZW1vdmVfdXNlbGVzc19zZWxm X2pvaW5zKFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpqb2ludHJlZSk7CiAKIC8qCiAgKiBw cm90b3R5cGVzIGZvciBwbGFuL3NldHJlZnMuYwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvZXF1aXZjbGFzcy5vdXQKaW5kZXggMTI2ZjcwNDdmZS4uZGU3MTQ0MTA1MiAxMDA2NDQK LS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dAorKysgYi9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0CkBAIC00MzAsNiArNDMw LDM4IEBAIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgIEZpbHRlcjogKCh1bmlxdWUxIElTIE5P VCBOVUxMKSBBTkQgKHVuaXF1ZTIgSVMgTk9UIE5VTEwpKQogKDIgcm93cykKIAorLS0gVGVz dCB0aGF0IGJyb2tlbiBFQ3MgYXJlIHByb2Nlc3NlZCBjb3JyZWN0bHkgZHVyaW5nIHNlbGYg am9pbiByZW1vdmFsLgorLS0gRGlzYWJsZSBtZXJnZSBqb2lucyBzbyB0aGF0IHdlIGRvbid0 IGdldCBhbiBlcnJvciBhYm91dCBtaXNzaW5nIGNvbW11dGF0b3IuCistLSBUZXN0IGJvdGgg b3JpZW50YXRpb25zIG9mIHRoZSBqb2luIGNsYXVzZSwgYmVjYXVzZSBvbmx5IG9uZSBvZiB0 aGVtIGJyZWFrcworLS0gdGhlIEVDLgorc2V0IGVuYWJsZV9tZXJnZWpvaW4gdG8gb2ZmOwor ZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpvaW4gZWMwIG4g b24gbS5mZiA9IG4uZmYKKyAgam9pbiBlYzEgcCBvbiBtLmZmICsgbi5mZiA9IHAuZjE7Cisg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmls dGVyOiAoKG4uZmYgKyBuLmZmKSA9IHAuZjEpCisgICAtPiAgU2VxIFNjYW4gb24gZWMxIHAK KyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGVjMCBuCisg ICAgICAgICAgICAgICBGaWx0ZXI6IChmZiBJUyBOT1QgTlVMTCkKKyg2IHJvd3MpCisKK2V4 cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9u IG0uZmYgPSBuLmZmCisgIGpvaW4gZWMxIHAgb24gcC5mMTo6aW50OCA9IChtLmZmICsgbi5m Zik6OmludDhhbGlhczE7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4g ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisg ICBKb2luIEZpbHRlcjogKChwLmYxKTo6YmlnaW50ID0gKChuLmZmICsgbi5mZikpOjppbnQ4 YWxpYXMxKQorICAgLT4gIFNlcSBTY2FuIG9uIGVjMSBwCisgICAtPiAgTWF0ZXJpYWxpemUK KyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlYzAgbgorICAgICAgICAgICAgICAgRmlsdGVy OiAoZmYgSVMgTk9UIE5VTEwpCisoNiByb3dzKQorCityZXNldCBlbmFibGVfbWVyZ2Vqb2lu OwogLS0gdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQsIGJ1dCBpc24ndCBhdCBwcmVzZW50CiBl eHBsYWluIChjb3N0cyBvZmYpCiAgIHNlbGVjdCAqIGZyb20gdGVuazEgd2hlcmUgdW5pcXVl MSA9IHVuaXF1ZTEgb3IgdW5pcXVlMiA9IHVuaXF1ZTI7CmRpZmYgLS1naXQgYS9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9qb2luLm91dAppbmRleCAxZmQ3NWM4ZjU4Li4yNjc4Zjc1YmQ5IDEwMDY0NAotLS0gYS9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jl c3MvZXhwZWN0ZWQvam9pbi5vdXQKQEAgLTU4ODgsNiArNTg4OCw3ODAgQEAgc2VsZWN0ICog ZnJvbQogLS0tLSstLS0tKy0tLS0rLS0tLQogKDAgcm93cykKIAorLS0KKy0tIHRlc3QgdGhh dCBzZW1pLSBvciBpbm5lciBzZWxmLWpvaW5zIG9uIGEgdW5pcXVlIGNvbHVtbiBhcmUgcmVt b3ZlZAorLS0KKy0tIGVuYWJsZSBvbmx5IG5lc3Rsb29wIHRvIGdldCBtb3JlIHByZWRpY3Rh YmxlIHBsYW5zCitzZXQgZW5hYmxlX2hhc2hqb2luIHRvIG9mZjsKK3NldCBlbmFibGVfbWVy Z2Vqb2luIHRvIG9mZjsKK2NyZWF0ZSB0YWJsZSBzaiAoYSBpbnQgdW5pcXVlLCBiIGludCwg YyBpbnQgdW5pcXVlKTsKK2luc2VydCBpbnRvIHNqIHZhbHVlcyAoMSwgbnVsbCwgMiksIChu dWxsLCAyLCBudWxsKSwgKDIsIDEsIDEpOworYW5hbHl6ZSBzajsKKy0tIFRyaXZpYWwgc2Vs Zi1qb2luIGNhc2UuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgcC4qIGZyb20gc2og cCwgc2ogcSB3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA9IHEuYSAtIDE7CisgICAgICAgICAg ICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBxCisg ICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChiID0gKGEgLSAxKSkpCisoMiByb3dz KQorCitzZWxlY3QgcC4qIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBxLmEgPSBwLmEgYW5kIHEu YiA9IHEuYSAtIDE7CisgYSB8IGIgfCBjIAorLS0tKy0tLSstLS0KKyAyIHwgMSB8IDEKKygx IHJvdykKKworLS0gU2VsZi1qb2luIHJlbW92YWwgcGVyZm9ybXMgYWZ0ZXIgYSBzdWJxdWVy eSBwdWxsLXVwIHByb2Nlc3MgYW5kIGNvdWxkIHJlbW92ZQorLS0gc3VjaCBraW5kIG9mIHNl bGYtam9pbiB0b28uIENoZWNrIHRoaXMgb3B0aW9uLgorZXhwbGFpbiAoY29zdHMgb2ZmKQor c2VsZWN0ICogZnJvbSBzaiBwCit3aGVyZSBleGlzdHMgKHNlbGVjdCAqIGZyb20gc2ogcQor CQkJCXdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iIDwgMTApOworICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBxCisgICBGaWx0ZXI6ICgoYSBJUyBO T1QgTlVMTCkgQU5EIChiIDwgMTApKQorKDIgcm93cykKKworc2VsZWN0ICogZnJvbSBzaiBw IHdoZXJlIGV4aXN0cyAoc2VsZWN0ICogZnJvbSBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQg cS5iIDwgMTApOworIGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tCisgMiB8IDEgfCAxCisoMSBy b3cpCisKKy0tIERvbid0IHJlbW92ZSBzZWxmLWpvaW4gZm9yIHRoZSBjYXNlIG9mIGVxdWFs aXR5IG9mIHR3byBkaWZmZXJlbnQgdW5pcXVlIGNvbHVtbnMuCitleHBsYWluIChjb3N0cyBv ZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0MiB3aGVyZSB0MS5hID0gdDIuYyBhbmQg dDEuYiBpcyBub3QgbnVsbDsKKyAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVk IExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYSA9IHQyLmMpCisgICAtPiAgU2VxIFNjYW4g b24gc2ogdDIKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9u IHNqIHQxCisgICAgICAgICAgICAgICBGaWx0ZXI6IChiIElTIE5PVCBOVUxMKQorKDYgcm93 cykKKworLS0gRGVnZW5lcmF0ZWQgY2FzZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVj dCAqIGZyb20KKwkoc2VsZWN0IGEgYXMgeCBmcm9tIHNqIHdoZXJlIGZhbHNlKSBhcyBxMSwK Kwkoc2VsZWN0IGEgYXMgeSBmcm9tIHNqIHdoZXJlIGZhbHNlKSBhcyBxMgord2hlcmUgcTEu eCA9IHEyLnk7CisgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJlc3VsdAorICAgT25lLVRpbWUgRmlsdGVy OiBmYWxzZQorICAgLT4gIFNlcSBTY2FuIG9uIHNqCisgICAgICAgICBGaWx0ZXI6IChhIElT IE5PVCBOVUxMKQorKDQgcm93cykKKworLS0gV2UgY2FuJ3QgdXNlIGEgY3Jvc3MtRUMgZ2Vu ZXJhdGVkIHNlbGYgam9pbiBxdWFsIGJlY2F1c2Ugb2YgY3VycmVudCBsb2dpYyBvZgorLS0g dGhlIGdlbmVyYXRlX2pvaW5faW1wbGllZF9lcXVhbGl0aWVzIHJvdXRpbmUuCitleHBsYWlu IChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0MiB3aGVyZSB0MS5hID0g dDEuYiBhbmQgdDEuYiA9IHQyLmIgYW5kIHQyLmIgPSB0Mi5hOworICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0 ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIuYikKKyAgIC0+ICBTZXEgU2Nh biBvbiBzaiB0MQorICAgICAgICAgRmlsdGVyOiAoYSA9IGIpCisgICAtPiAgU2VxIFNjYW4g b24gc2ogdDIKKyAgICAgICAgIEZpbHRlcjogKGIgPSBhKQorKDYgcm93cykKKworZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIsIHNqIHQzCit3aGVy ZSB0MS5hID0gdDEuYiBhbmQgdDEuYiA9IHQyLmIgYW5kIHQyLmIgPSB0Mi5hCisJYW5kIHQx LmIgPSB0My5iIGFuZCB0My5iID0gdDMuYTsKKyAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVz dGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYSA9IHQzLmIpCisgICAtPiAgTmVzdGVk IExvb3AKKyAgICAgICAgIEpvaW4gRmlsdGVyOiAodDEuYSA9IHQyLmIpCisgICAgICAgICAt PiAgU2VxIFNjYW4gb24gc2ogdDEKKyAgICAgICAgICAgICAgIEZpbHRlcjogKGEgPSBiKQor ICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQyCisgICAgICAgICAgICAgICBGaWx0ZXI6 IChiID0gYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MworICAgICAgICAgRmlsdGVyOiAo YiA9IGEpCisoMTAgcm93cykKKworLS0gRG91YmxlIHNlbGYtam9pbiByZW1vdmFsLgorLS0g VXNlIGEgY29uZGl0aW9uIG9uICJiICsgMSIsIG5vdCBvbiAiYiIsIGZvciB0aGUgc2Vjb25k IGpvaW4sIHNvIHRoYXQKKy0tIHRoZSBlcXVpdmFsZW5jZSBjbGFzcyBpcyBkaWZmZXJlbnQg ZnJvbSB0aGUgZmlyc3Qgb25lLCBhbmQgd2UgY2FuCistLSB0ZXN0IHRoZSBub24tZWMgY29k ZSBwYXRoLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSBqb2lu IHNqIHQyIG9uIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gdDIuYgorCWpvaW4gc2ogdDMgb24g dDIuYSA9IHQzLmEgYW5kIHQyLmIgKyAxID0gdDMuYiArIDE7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIHQzCisgICBG aWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChiIElTIE5PVCBOVUxMKSBBTkQgKChiICsg MSkgSVMgTk9UIE5VTEwpKQorKDIgcm93cykKKworLS0gc3Vic2VsZWN0IHRoYXQgcmVmZXJl bmNlcyB0aGUgcmVtb3ZlZCByZWxhdGlvbgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0 IHQxLmEsIChzZWxlY3QgYSBmcm9tIHNqIHdoZXJlIGEgPSB0Mi5hIGFuZCBhID0gdDEuYSkK K2Zyb20gc2ogdDEsIHNqIHQyCit3aGVyZSB0MS5hID0gdDIuYTsKKyAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogdDIKKyAgIEZpbHRlcjogKGEg SVMgTk9UIE5VTEwpCisgICBTdWJQbGFuIDEKKyAgICAgLT4gIFJlc3VsdAorICAgICAgICAg ICBPbmUtVGltZSBGaWx0ZXI6ICh0Mi5hID0gdDIuYSkKKyAgICAgICAgICAgLT4gIFNlcSBT Y2FuIG9uIHNqCisgICAgICAgICAgICAgICAgIEZpbHRlcjogKGEgPSB0Mi5hKQorKDcgcm93 cykKKworLS0gc2VsZi1qb2luIHVuZGVyIG91dGVyIGpvaW4KK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCAqIGZyb20gc2ogeCBqb2luIHNqIHkgb24geC5hID0geS5hCitsZWZ0IGpv aW4gaW50OF90YmwgeiBvbiB4LmEgPSB6LnExOworICAgICAgICAgICAgIFFVRVJZIFBMQU4g ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBO ZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpvaW4gRmlsdGVyOiAoeS5hID0gei5xMSkKKyAg IC0+ICBTZXEgU2NhbiBvbiBzaiB5CisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxM KQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gaW50OF90 YmwgegorKDYgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBz aiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5LmEKK2xlZnQgam9pbiBpbnQ4X3RibCB6IG9uIHku YSA9IHoucTE7CisgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9p bgorICAgSm9pbiBGaWx0ZXI6ICh5LmEgPSB6LnExKQorICAgLT4gIFNlcSBTY2FuIG9uIHNq IHkKKyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisgICAtPiAgTWF0ZXJpYWxp emUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBpbnQ4X3RibCB6CisoNiByb3dzKQorCitl eHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NICgKKyAgU0VMRUNUIHQxLiosIHQy LmEgQVMgYXggRlJPTSBzaiB0MSBKT0lOIHNqIHQyCisgIE9OICh0MS5hID0gdDIuYSBBTkQg dDEuYyp0MS5jID0gdDIuYysyIEFORCB0Mi5iIElTIE5VTEwpCispIEFTIHExCitMRUZUIEpP SU4KKyAgKFNFTEVDVCB0My4qIEZST00gc2ogdDMsIHNqIHQ0IFdIRVJFIHQzLmMgPSB0NC5j KSBBUyBxMgorT04gcTEuYXggPSBxMi5hOworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpvaW4gRmls dGVyOiAodDIuYSA9IHQ0LmEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogdDIKKyAgICAgICAg IEZpbHRlcjogKChiIElTIE5VTEwpIEFORCAoYSBJUyBOT1QgTlVMTCkgQU5EICgoYyAqIGMp ID0gKGMgKyAyKSkpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogdDQKKyAgICAgICAgIEZpbHRl cjogKGMgSVMgTk9UIE5VTEwpCisoNiByb3dzKQorCistLSBUZXN0IHRoYXQgcGxhY2Vob2xk ZXJzIGFyZSB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBqb2luIHJlbW92YWwKK2V4cGxhaW4g KGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gKHZhbHVlcyAoMSkpIHgKK2xlZnQgam9pbiAo c2VsZWN0IGNvYWxlc2NlKHkucTEsIDEpIGZyb20gaW50OF90YmwgeQorCXJpZ2h0IGpvaW4g c2ogajEgaW5uZXIgam9pbiBzaiBqMiBvbiBqMS5hID0gajIuYQorCW9uIHRydWUpIHoKK29u IHRydWU7CisgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29w IExlZnQgSm9pbgorICAgLT4gIFJlc3VsdAorICAgLT4gIE5lc3RlZCBMb29wIExlZnQgSm9p bgorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisgICAgICAgICAgICAgICBGaWx0 ZXI6IChhIElTIE5PVCBOVUxMKQorICAgICAgICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAg ICAgICAgICAtPiAgU2VxIFNjYW4gb24gaW50OF90YmwgeQorKDcgcm93cykKKworLS0KKy0t IFNKUiBjb3JuZXIgY2FzZTogdW5pcXVlbmVzcyBvZiBhbiBpbm5lciBpcyBbcGFydGlhbGx5 XSBkZXJpdmVkIGZyb20KKy0tIGJhc2VyZXN0cmljdGluZm8gY2xhdXNlcy4KKy0tIFhYWDog V2UgcmVhbGx5IHNob3VsZCBhbGxvdyBTSlIgZm9yIHRoZXNlIGNvcm5lciBjYXNlcz8KKy0t CitJTlNFUlQgSU5UTyBzaiBWQUxVRVMgKDMsIDEsIDMpOworZXhwbGFpbiAoY29zdHMgb2Zm KSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVS RSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAzOworICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBO ZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChqMS5iID0gajIuYikKKyAgIC0+ICBTZXEg U2NhbiBvbiBzaiBqMQorICAgICAgICAgRmlsdGVyOiAoYSA9IDIpCisgICAtPiAgU2VxIFNj YW4gb24gc2ogajIKKyAgICAgICAgIEZpbHRlcjogKGEgPSAzKQorKDYgcm93cykKKworU0VM RUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0g MiBBTkQgajIuYSA9IDM7IC0tIFJldHVybiBvbmUgcm93CisgYSB8IGIgfCBjIHwgYSB8IGIg fCBjIAorLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KKyAyIHwgMSB8IDEgfCAzIHwgMSB8IDMK KygxIHJvdykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBSZW1vdmUgU0osIGRlZmluZSB1 bmlxdWVuZXNzIGJ5IGEgY29uc3RhbnQKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBX SEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAyOworICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogajIKKyAgIEZpbHRlcjog KChiIElTIE5PVCBOVUxMKSBBTkQgKGEgPSAyKSkKKygyIHJvd3MpCisKK1NFTEVDVCAqIEZS T00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoy LmEgPSAyOyAtLSBSZXR1cm4gb25lIHJvdworIGEgfCBiIHwgYyB8IGEgfCBiIHwgYyAKKy0t LSstLS0rLS0tKy0tLSstLS0rLS0tCisgMiB8IDEgfCAxIHwgMiB8IDEgfCAxCisoMSByb3cp CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitX SEVSRSBqMS5iID0gajIuYgorICBBTkQgajEuYSA9IChFWFRSQUNUKERPVyBGUk9NIGN1cnJl bnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQKKyAgQU5EIChFWFRSQUNUKERPVyBGUk9N IGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQgPSBqMi5hCis7IC0tIFJlbW92 ZSBTSiwgZGVmaW5lIHVuaXF1ZW5lc3MgYnkgYSBjb25zdGFudCBleHByZXNzaW9uCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBR VUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogajIKKyAg IEZpbHRlcjogKChiIElTIE5PVCBOVUxMKSBBTkQgKGEgPSAoKChFWFRSQUNUKGRvdyBGUk9N IENVUlJFTlRfVElNRVNUQU1QKDApKSAvICcxNSc6Om51bWVyaWMpICsgJzMnOjpudW1lcmlj KSk6OmludGVnZXIpKQorKDIgcm93cykKKworU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIK K1dIRVJFIGoxLmIgPSBqMi5iCisgIEFORCBqMS5hID0gKEVYVFJBQ1QoRE9XIEZST00gY3Vy cmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludAorICBBTkQgKEVYVFJBQ1QoRE9XIEZS T00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludCA9IGoyLmEKKzsgLS0gUmV0 dXJuIG9uZSByb3cKKyBhIHwgYiB8IGMgfCBhIHwgYiB8IGMgCistLS0rLS0tKy0tLSstLS0r LS0tKy0tLQorIDMgfCAxIHwgMyB8IDMgfCAxIHwgMworKDEgcm93KQorCitleHBsYWluIChj b3N0cyBvZmYpIC0tIFJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdI RVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMSBBTkQgajIuYSA9IDE7CisgICAgICAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBqMgorICAgRmlsdGVyOiAo KGIgSVMgTk9UIE5VTEwpIEFORCAoYSA9IDEpKQorKDIgcm93cykKKworU0VMRUNUICogRlJP TSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMSBBTkQgajIu YSA9IDE7IC0tIFJldHVybiBubyByb3dzCisgYSB8IGIgfCBjIHwgYSB8IGIgfCBjIAorLS0t Ky0tLSstLS0rLS0tKy0tLSstLS0KKygwIHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikg LS0gU2h1ZmZsZSBhIGNsYXVzZS4gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwg c2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIDEgPSBqMS5hIEFORCBqMi5hID0gMTsKKyAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGoyCisgICBG aWx0ZXI6ICgoYiBJUyBOT1QgTlVMTCkgQU5EIChhID0gMSkpCisoMiByb3dzKQorCitTRUxF Q1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIgQU5EIDEgPSBqMS5h IEFORCBqMi5hID0gMTsgLS0gUmV0dXJuIG5vIHJvd3MKKyBhIHwgYiB8IGMgfCBhIHwgYiB8 IGMgCistLS0rLS0tKy0tLSstLS0rLS0tKy0tLQorKDAgcm93cykKKworLS0gRnVuY3Rpb25h bCBpbmRleAorQ1JFQVRFIFVOSVFVRSBJTkRFWCBzal9mbl9pZHggT04gc2ooKGEgKiBhKSk7 CitleHBsYWluIChjb3N0cyBvZmYpIC0tIFJlbW92ZSBTSgorCVNFTEVDVCAqIEZST00gc2og ajEsIHNqIGoyCisJV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEqajEuYSA9IDEgQU5EIGoy LmEqajIuYSA9IDE7CisgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBTZXEgU2NhbiBvbiBzaiBqMgorICAgRmlsdGVyOiAoKGIgSVMgTk9UIE5VTEwpIEFO RCAoKGEgKiBhKSA9IDEpKQorKDIgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBE b24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorCVdIRVJFIGox LmIgPSBqMi5iIEFORCBqMS5hKmoxLmEgPSAxIEFORCBqMi5hKmoyLmEgPSAyOworICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGoxLmIgPSBqMi5iKQorICAg LT4gIFNlcSBTY2FuIG9uIHNqIGoxCisgICAgICAgICBGaWx0ZXI6ICgoYSAqIGEpID0gMSkK KyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMgorICAgICAgICAgRmlsdGVyOiAoKGEgKiBhKSA9 IDIpCisoNiByb3dzKQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHNq IGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIKKyAgQU5EIChqMS5hKmoxLmEpID0gKEVY VFJBQ1QoRE9XIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludAorICBB TkQgKEVYVFJBQ1QoRE9XIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6Omlu dCA9IChqMi5hKmoyLmEpCis7IC0tIFJlc3RyaWN0aW9uIGNvbnRhaW5zIGV4cHJlc3Npb25z IGluIGJvdGggc2lkZXMsIFJlbW92ZSBTSi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBqMgorICAgRmlsdGVyOiAo KGIgSVMgTk9UIE5VTEwpIEFORCAoKGEgKiBhKSA9ICgoKEVYVFJBQ1QoZG93IEZST00gQ1VS UkVOVF9USU1FU1RBTVAoMCkpIC8gJzE1Jzo6bnVtZXJpYykgKyAnMyc6Om51bWVyaWMpKTo6 aW50ZWdlcikpCisoMiByb3dzKQorCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hF UkUgajEuYiA9IGoyLmIKKyAgQU5EIChqMS5hKmoxLmEpID0gKEVYVFJBQ1QoRE9XIEZST00g Y3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludAorICBBTkQgKEVYVFJBQ1QoRE9X IEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludCA9IChqMi5hKmoyLmEp Cis7IC0tIEVtcHR5IHNldCBvZiByb3dzIHNob3VsZCBiZSByZXR1cm5lZAorIGEgfCBiIHwg YyB8IGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCisoMCByb3dzKQorCitF WFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUg ajEuYiA9IGoyLmIKKyAgQU5EIChqMS5hKmoxLmEpID0gKHJhbmRvbSgpLzMgKyAzKTo6aW50 CisgIEFORCAocmFuZG9tKCkvMyArIDMpOjppbnQgPSAoajIuYSpqMi5hKQorOyAtLSBSZXN0 cmljdGlvbiBjb250YWlucyB2b2xhdGlsZSBmdW5jdGlvbiAtIGRpc2FibGUgU0pSIGZlYXR1 cmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0 ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChqMS5iID0gajIuYikKKyAgIC0+ICBTZXEgU2Nh biBvbiBzaiBqMQorICAgICAgICAgRmlsdGVyOiAoKGEgKiBhKSA9ICgoKHJhbmRvbSgpIC8g JzMnOjpkb3VibGUgcHJlY2lzaW9uKSArICczJzo6ZG91YmxlIHByZWNpc2lvbikpOjppbnRl Z2VyKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisgICAgICAgICBGaWx0ZXI6ICgoKChy YW5kb20oKSAvICczJzo6ZG91YmxlIHByZWNpc2lvbikgKyAnMyc6OmRvdWJsZSBwcmVjaXNp b24pKTo6aW50ZWdlciA9IChhICogYSkpCisoNiByb3dzKQorCitTRUxFQ1QgKiBGUk9NIHNq IGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIKKyAgQU5EIChqMS5hKmoxLmMvMykgPSAo cmFuZG9tKCkvMyArIDMpOjppbnQKKyAgQU5EIChyYW5kb20oKS8zICsgMyk6OmludCA9IChq Mi5hKmoyLmMvMykKKzsgLS0gUmV0dXJuIG9uZSByb3cKKyBhIHwgYiB8IGMgfCBhIHwgYiB8 IGMgCistLS0rLS0tKy0tLSstLS0rLS0tKy0tLQorIDMgfCAxIHwgMyB8IDMgfCAxIHwgMwor KDEgcm93KQorCistLSBNdWx0aXBsZSBmaWx0ZXJzCitDUkVBVEUgVU5JUVVFIElOREVYIHNq X3RlbXBfaWR4MSBPTiBzaihhLGIsYyk7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIFJlbW92 ZSBTSgorCVNFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCisJV0hFUkUgajEuYiA9IGoyLmIg QU5EIGoxLmEgPSAyIEFORCBqMS5jID0gMyBBTkQgajIuYSA9IDIgQU5EIDMgPSBqMi5jOwor ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgU2VxIFNjYW4gb24gc2ogajIKKyAgIEZpbHRlcjogKChiIElTIE5PVCBOVUxMKSBBTkQg KGEgPSAyKSBBTkQgKGMgPSAzKSkKKygyIHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikg LS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVS RSBqMS5iID0gajIuYiBBTkQgMiA9IGoxLmEgQU5EIGoxLmMgPSAzIEFORCBqMi5hID0gMSBB TkQgMyA9IGoyLmM7CisgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29w CisgICBKb2luIEZpbHRlcjogKGoxLmIgPSBqMi5iKQorICAgLT4gIFNlcSBTY2FuIG9uIHNq IGoxCisgICAgICAgICBGaWx0ZXI6ICgoMiA9IGEpIEFORCAoYyA9IDMpKQorICAgLT4gIFNl cSBTY2FuIG9uIHNqIGoyCisgICAgICAgICBGaWx0ZXI6ICgoYyA9IDMpIEFORCAoYSA9IDEp KQorKDYgcm93cykKKworQ1JFQVRFIFVOSVFVRSBJTkRFWCBzal90ZW1wX2lkeCBPTiBzaihh LGIpOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1Qg KiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDI7Cisg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGoxLmIgPSBqMi5iKQor ICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoxCisgICAgICAgICBGaWx0ZXI6IChhID0gMikKKyAg IC0+ICBTZXEgU2NhbiBvbiBzaiBqMgorKDUgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2Zm KSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVS RSBqMS5iID0gajIuYiBBTkQgMiA9IGoyLmE7CisgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisg ICBKb2luIEZpbHRlcjogKGoxLmIgPSBqMi5iKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoy CisgICAgICAgICBGaWx0ZXI6ICgyID0gYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMQor KDUgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlT RUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgKGoxLmEg PSAxIE9SIGoyLmEgPSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AK KyAgIEpvaW4gRmlsdGVyOiAoKGoxLmIgPSBqMi5iKSBBTkQgKChqMS5hID0gMSkgT1IgKGoy LmEgPSAxKSkpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajEKKyAgIC0+ICBNYXRlcmlhbGl6 ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisoNSByb3dzKQorCitEUk9QIElO REVYIHNqX2ZuX2lkeCwgc2pfdGVtcF9pZHgxLCBzal90ZW1wX2lkeDsKKy0tIFRlc3QgdGhh dCBPUiBwcmVkaWNhdGVkIGFyZSB1cGRhdGVkIGNvcnJlY3RseSBhZnRlciBqb2luIHJlbW92 YWwKK0NSRUFURSBUQUJMRSB0YWJfd2l0aF9mbGFnICggaWQgSU5UIFBSSU1BUlkgS0VZLCBp c19mbGFnIFNNQUxMSU5UKTsKK0NSRUFURSBJTkRFWCBpZHhfdGVzdF9pc19mbGFnIE9OIHRh Yl93aXRoX2ZsYWcgKGlzX2ZsYWcpOworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIENP VU5UKCopIEZST00gdGFiX3dpdGhfZmxhZworV0hFUkUKKwkoaXNfZmxhZyBJUyBOVUxMIE9S IGlzX2ZsYWcgPSAwKQorCUFORCBpZCBJTiAoU0VMRUNUIGlkIEZST00gdGFiX3dpdGhfZmxh ZyBXSEVSRSBpZCBJTiAoMiwgMykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIEJpdG1h cCBIZWFwIFNjYW4gb24gdGFiX3dpdGhfZmxhZworICAgICAgICAgUmVjaGVjayBDb25kOiAo KGlkID0gQU5ZICgnezIsM30nOjppbnRlZ2VyW10pKSBBTkQgKGlkIElTIE5PVCBOVUxMKSkK KyAgICAgICAgIEZpbHRlcjogKChpc19mbGFnIElTIE5VTEwpIE9SIChpc19mbGFnID0gMCkp CisgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGFiX3dpdGhfZmxhZ19wa2V5 CisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoKGlkID0gQU5ZICgnezIsM30nOjppbnRl Z2VyW10pKSBBTkQgKGlkIElTIE5PVCBOVUxMKSkKKyg2IHJvd3MpCisKK0RST1AgVEFCTEUg dGFiX3dpdGhfZmxhZzsKKy0tIEhBVklORyBjbGF1c2UKK2V4cGxhaW4gKGNvc3RzIG9mZikK K3NlbGVjdCBwLmIgZnJvbSBzaiBwIGpvaW4gc2ogcSBvbiBwLmEgPSBxLmEgZ3JvdXAgYnkg cC5iIGhhdmluZyBzdW0ocC5hKSA9IDE7CisgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2hBZ2dyZWdh dGUKKyAgIEdyb3VwIEtleTogcS5iCisgICBGaWx0ZXI6IChzdW0ocS5hKSA9IDEpCisgICAt PiAgU2VxIFNjYW4gb24gc2ogcQorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkK Kyg1IHJvd3MpCisKKy0tIHVwZGF0ZSBsYXRlcmFsIHJlZmVyZW5jZXMgYW5kIHJhbmdlIHRh YmxlIGVudHJ5IHJlZmVyZW5jZQorZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2Vs ZWN0IDEgZnJvbSAoc2VsZWN0IHguKiBmcm9tIHNqIHgsIHNqIHkgd2hlcmUgeC5hID0geS5h KSBxLAorICBsYXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLCBxLmEpIGdzKGkpOworICAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBO ZXN0ZWQgTG9vcAorICAgT3V0cHV0OiAxCisgICAtPiAgU2VxIFNjYW4gb24gcHVibGljLnNq IHkKKyAgICAgICAgIE91dHB1dDogeS5hLCB5LmIsIHkuYworICAgICAgICAgRmlsdGVyOiAo eS5hIElTIE5PVCBOVUxMKQorICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy5n ZW5lcmF0ZV9zZXJpZXMgZ3MKKyAgICAgICAgIE91dHB1dDogZ3MuaQorICAgICAgICAgRnVu Y3Rpb24gQ2FsbDogZ2VuZXJhdGVfc2VyaWVzKDEsIHkuYSkKKyg4IHJvd3MpCisKK2V4cGxh aW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB5LiogZnJv bSBzaiB4LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0ZV9z ZXJpZXMoMSwgcS5hKSBncyhpKTsKKyAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIE91dHB1dDogMQor ICAgLT4gIFNlcSBTY2FuIG9uIHB1YmxpYy5zaiB5CisgICAgICAgICBPdXRwdXQ6IHkuYSwg eS5iLCB5LmMKKyAgICAgICAgIEZpbHRlcjogKHkuYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBG dW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cuZ2VuZXJhdGVfc2VyaWVzIGdzCisgICAgICAg ICBPdXRwdXQ6IGdzLmkKKyAgICAgICAgIEZ1bmN0aW9uIENhbGw6IGdlbmVyYXRlX3Nlcmll cygxLCB5LmEpCisoOCByb3dzKQorCistLSBUZXN0IHRoYXQgYSBub24tRUMtZGVyaXZlZCBq b2luIGNsYXVzZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LiBVc2UgYW4KKy0tIG91dGVyIGpv aW4gc28gdGhhdCB3ZSBjYW4ndCBmb3JtIGFuIEVDLgorZXhwbGFpbiAoY29zdHMgb2ZmKSBz ZWxlY3QgKiBmcm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEuYQorICBsZWZ0IGpvaW4g c2ogciBvbiBwLmEgKyBxLmEgPSByLmE7CisgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3Rl ZCBMb29wIExlZnQgSm9pbgorICAgSm9pbiBGaWx0ZXI6ICgocS5hICsgcS5hKSA9IHIuYSkK KyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBxCisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBO VUxMKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2og cgorKDYgcm93cykKKworLS0gRklYTUUgdGhpcyBjb25zdGFudCBmYWxzZSBmaWx0ZXIgZG9l c24ndCBsb29rIGdvb2QuIFNob3VsZCB3ZSBtZXJnZQorLS0gZXF1aXZhbGVuY2UgY2xhc3Nl cz8KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogcCwgc2ogcSB3aGVy ZSBwLmEgPSBxLmEgYW5kIHAuYiA9IDEgYW5kIHEuYiA9IDI7CisgICAgICAgICAgICAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBz aiBxCisgICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChiID0gMikgQU5EIChiID0g MSkpCisoMiByb3dzKQorCistLSBDaGVjayB0aGF0IGF0dHJfbmVlZGVkIGlzIHVwZGF0ZWQg Y29ycmVjdGx5IGFmdGVyIHNlbGYtam9pbiByZW1vdmFsLiBJbiB0aGlzCistLSB0ZXN0LCB0 aGUgam9pbiBvZiBqMSB3aXRoIGoyIGlzIHJlbW92ZWQuIGsxLmIgaXMgcmVxdWlyZWQgYXQg ZWl0aGVyIGoxIG9yIGoyLgorLS0gSWYgdGhpcyBpbmZvIGlzIGxvc3QsIGpvaW4gdGFyZ2V0 bGlzdCBmb3IgKGsxLCBrMikgd2lsbCBub3QgY29udGFpbiBrMS5iLgorLS0gVXNlIGluZGV4 IHNjYW4gZm9yIGsxIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0ICdiJyBmcm9tIHBoeXNpY2FsIHRs aXN0IHVzZWQgZm9yCistLSBzZXFzY2FuLiBBbHNvIGRpc2FibGUgcmVvcmRlcmluZyBvZiBq b2lucyBiZWNhdXNlIHRoaXMgdGVzdCBkZXBlbmRzIG9uIGEKKy0tIHBhcnRpY3VsYXIgam9p biB0cmVlLgorY3JlYXRlIHRhYmxlIHNrIChhIGludCwgYiBpbnQpOworY3JlYXRlIGluZGV4 IG9uIHNrKGEpOworc2V0IGpvaW5fY29sbGFwc2VfbGltaXQgdG8gMTsKK3NldCBlbmFibGVf c2Vxc2NhbiB0byBvZmY7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwko c2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNq IGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMS5iID0gazEuYjsKKyAgICAgICAgICAgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisg ICBKb2luIEZpbHRlcjogKGsxLmIgPSBqMi5iKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAg ICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMQorICAgICAgICAg LT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMgorICAgICAgICAg ICAgICAgSW5kZXggQ29uZDogKGEgPSBrMS5hKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAg ICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBzal9hX2tleSBvbiBzaiBqMgorICAgICAgICAg ICAgICAgSW5kZXggQ29uZDogKGEgSVMgTk9UIE5VTEwpCisoOSByb3dzKQorCitleHBsYWlu IChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5h ID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBq Mi5iID0gazEuYjsKKyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGsxLmIgPSBq Mi5iKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2lu ZyBza19hX2lkeCBvbiBzayBrMQorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2lu ZyBza19hX2lkeCBvbiBzayBrMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgPSBr MS5hKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2lu ZyBzal9hX2tleSBvbiBzaiBqMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgSVMg Tk9UIE5VTEwpCisoOSByb3dzKQorCityZXNldCBqb2luX2NvbGxhcHNlX2xpbWl0OworcmVz ZXQgZW5hYmxlX3NlcXNjYW47CitzZXQgc2VsZl9qb2luX3NlYXJjaF9saW1pdCB0byAxOwor ZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBObyBvbmUgc2VsZiBqb2luIHNob3VsZCBiZSBjb2xs YXBzZWQKKyAgc2VsZWN0IGoxLiogZnJvbSBzaiBqMSwgc2ogajIsIHNqIGozIHdoZXJlIChq MS5hID0gajIuYSkgYW5kIChqMi5hID0gajMuYSk7CisgICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoajEuYSA9IGoz LmEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajMKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAg ICAgICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAgICAgICBKb2luIEZpbHRlcjogKGox LmEgPSBqMi5hKQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoxCisgICAg ICAgICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBT ZXEgU2NhbiBvbiBzaiBqMgorKDkgcm93cykKKworc2V0IHNlbGZfam9pbl9zZWFyY2hfbGlt aXQgdG8gMjsKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gQ29sbGFwc2Ugb25lIHNlbGYgam9p bgorICBzZWxlY3QgajEuKiBmcm9tIHNqIGoxLCBzaiBqMiwgc2ogajMgd2hlcmUgKGoxLmEg PSBqMi5hKSBhbmQgKGoyLmEgPSBqMy5hKTsKKyAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoajIuYSA9IGozLmEpCisgICAtPiAg U2VxIFNjYW4gb24gc2ogajMKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNl cSBTY2FuIG9uIHNqIGoyCisgICAgICAgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxM KQorKDYgcm93cykKKworc2V0IHNlbGZfam9pbl9zZWFyY2hfbGltaXQgdG8gMzsKK2V4cGxh aW4gKGNvc3RzIG9mZikgLS0gQ29sbGFwc2UgYm90aCBzZWxmIGpvaW5zCisgIHNlbGVjdCBq MS4qIGZyb20gc2ogajEsIHNqIGoyLCBzaiBqMyB3aGVyZSAoajEuYSA9IGoyLmEpIGFuZCAo ajIuYSA9IGozLmEpOworICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBqMworICAgRmlsdGVyOiAoYSBJ UyBOT1QgTlVMTCkKKygyIHJvd3MpCisKK3Jlc2V0IHNlbGZfam9pbl9zZWFyY2hfbGltaXQ7 CistLSBDaGVjayB0aGF0IGNsYXVzZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIgbGlzdCBpcyBu b3QgbG9zdCBvbiB0aGUgc2VsZi1qb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSBlbXAxICgg aWQgU0VSSUFMIFBSSU1BUlkgS0VZIE5PVCBOVUxMLCBjb2RlIGludCk7CitleHBsYWluICh2 ZXJib3NlLCBjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIGVtcDEgZTEsIGVtcDEgZTIgV0hF UkUgZTEuaWQgPSBlMi5pZCBBTkQgZTIuY29kZSA8PiBlMS5jb2RlOworICAgICAgICAgICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IFNlcSBTY2FuIG9uIHB1YmxpYy5lbXAxIGUyCisgICBPdXRwdXQ6IGUyLmlkLCBlMi5jb2Rl LCBlMi5pZCwgZTIuY29kZQorICAgRmlsdGVyOiAoKGUyLmlkIElTIE5PVCBOVUxMKSBBTkQg KGUyLmNvZGUgPD4gZTIuY29kZSkpCisoMyByb3dzKQorCistLSBXZSBjYW4gcmVtb3ZlIHRo ZSBqb2luIGV2ZW4gaWYgd2UgZmluZCB0aGUgam9pbiBjYW4ndCBkdXBsaWNhdGUgcm93cyBh bmQKKy0tIHRoZSBiYXNlIHF1YWxzIG9mIGVhY2ggc2lkZSBhcmUgZGlmZmVyZW50LiAgSW4g dGhlIGZvbGxvd2luZyBjYXNlIHdlIGVuZCB1cAorLS0gbW92aW5nIHF1YWxzIG92ZXIgdG8g czEgdG8gbWFrZSBpdCBzbyBpdCBjYW4ndCBtYXRjaCBhbnkgcm93cy4KK2NyZWF0ZSB0YWJs ZSBzbChhIGludCwgYiBpbnQsIGMgaW50KTsKK2NyZWF0ZSB1bmlxdWUgaW5kZXggb24gc2wo YSwgYik7Cit2YWN1dW0gYW5hbHl6ZSBzbDsKKy0tIEJvdGggc2lkZXMgYXJlIHVuaXF1ZSwg YnV0IGJhc2UgcXVhbHMgYXJlIGRpZmZlcmVudAorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2Vs ZWN0ICogZnJvbSBzbCB0MSwgc2wgdDIgd2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSAx IGFuZCB0Mi5iID0gMjsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVy OiAodDEuYSA9IHQyLmEpCisgICAtPiAgU2VxIFNjYW4gb24gc2wgdDEKKyAgICAgICAgIEZp bHRlcjogKGIgPSAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHNsIHQyCisgICAgICAgICBGaWx0 ZXI6IChiID0gMikKKyg2IHJvd3MpCisKKy0tIENoZWNrIE51bGxUZXN0IGluIGJhc2VyZXN0 cmljdGluZm8gbGlzdAorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzbCB0 MSwgc2wgdDIKK3doZXJlIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gMSBhbmQgdDIuYiA9IDIK KyAgYW5kIHQxLmMgSVMgTk9UIE5VTEwgYW5kIHQyLmMgSVMgTk9UIE5VTEwKKyAgYW5kIHQy LmIgSVMgTk9UIE5VTEwgYW5kIHQxLmIgSVMgTk9UIE5VTEwKKyAgYW5kIHQxLmEgSVMgTk9U IE5VTEwgYW5kIHQyLmEgSVMgTk9UIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBM b29wCisgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0Mi5hKQorICAgLT4gIFNlcSBTY2FuIG9u IHNsIHQxCisgICAgICAgICBGaWx0ZXI6ICgoYyBJUyBOT1QgTlVMTCkgQU5EIChiIElTIE5P VCBOVUxMKSBBTkQgKGEgSVMgTk9UIE5VTEwpIEFORCAoYiA9IDEpKQorICAgLT4gIFNlcSBT Y2FuIG9uIHNsIHQyCisgICAgICAgICBGaWx0ZXI6ICgoYyBJUyBOT1QgTlVMTCkgQU5EIChi IElTIE5PVCBOVUxMKSBBTkQgKGEgSVMgTk9UIE5VTEwpIEFORCAoYiA9IDIpKQorKDYgcm93 cykKKworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzbCB0 MSwgc2wgdDIKK3doZXJlIHQxLmIgPSB0Mi5iIGFuZCB0Mi5hID0gMyBhbmQgdDEuYSA9IDMK KyAgYW5kIHQxLmMgSVMgTk9UIE5VTEwgYW5kIHQyLmMgSVMgTk9UIE5VTEwKKyAgYW5kIHQy LmIgSVMgTk9UIE5VTEwgYW5kIHQxLmIgSVMgTk9UIE5VTEwKKyAgYW5kIHQxLmEgSVMgTk9U IE5VTEwgYW5kIHQyLmEgSVMgTk9UIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIFNlcSBTY2FuIG9uIHB1YmxpYy5zbCB0MgorICAgT3V0cHV0OiB0Mi5hLCB0Mi5iLCB0 Mi5jLCB0Mi5hLCB0Mi5iLCB0Mi5jCisgICBGaWx0ZXI6ICgodDIuYyBJUyBOT1QgTlVMTCkg QU5EICh0Mi5iIElTIE5PVCBOVUxMKSBBTkQgKHQyLmEgSVMgTk9UIE5VTEwpIEFORCAodDIu YSA9IDMpKQorKDMgcm93cykKKworLS0gSm9pbiBxdWFsIGlzbid0IG1lcmdlam9pbmFibGUs IGJ1dCBpbm5lciBpcyB1bmlxdWUuCitleHBsYWluIChDT1NUUyBPRkYpCitTRUxFQ1QgbjIu YSBGUk9NIHNqIG4xLCBzaiBuMiBXSEVSRSBuMS5hIDw+IG4yLmEgQU5EIG4yLmEgPSAxOwor ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKG4xLmEgPD4gbjIu YSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBuMgorICAgICAgICAgRmlsdGVyOiAoYSA9IDEp CisgICAtPiAgU2VxIFNjYW4gb24gc2ogbjEKKyg1IHJvd3MpCisKK2V4cGxhaW4gKENPU1RT IE9GRikKK1NFTEVDVCAqIEZST00KKwkoU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIg V0hFUkUgbjEuYSA8PiBuMi5hKSBxMCwgc2wKK1dIRVJFIHEwLmEgPSAxOworICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKG4xLmEgPD4gbjIuYSkKKyAgIC0+ ICBOZXN0ZWQgTG9vcAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNsCisgICAgICAgICAt PiAgU2VxIFNjYW4gb24gc2ogbjIKKyAgICAgICAgICAgICAgIEZpbHRlcjogKGEgPSAxKQor ICAgLT4gIFNlcSBTY2FuIG9uIHNqIG4xCisoNyByb3dzKQorCistLQorLS0tLSBPbmx5IG9u ZSBzaWRlIGlzIHVucWl1ZQorLS1zZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0 MS5hID0gdDIuYSBhbmQgdDEuYiA9IDE7CistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQy IHdoZXJlIHQxLmEgPSB0Mi5hIGFuZCB0Mi5iID0gMTsKKy0tCistLS0tIFNldmVyYWwgdW5p cXVlcyBpbmRleGVzIG1hdGNoLCBhbmQgd2Ugc2VsZWN0IGEgZGlmZmVyZW50IG9uZQorLS0t LSBmb3IgZWFjaCBzaWRlLCBzbyB0aGUgam9pbiBpcyBub3QgcmVtb3ZlZAorLS1jcmVhdGUg dGFibGUgc20oYSBpbnQgdW5pcXVlLCBiIGludCB1bmlxdWUsIGMgaW50IHVuaXF1ZSk7Cist LWV4cGxhaW4gKGNvc3RzIG9mZikKKy0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJl IG0uYSA9IG4uYiBhbmQgbS5jID0gbi5jOworLS1leHBsYWluIChjb3N0cyBvZmYpCistLXNl bGVjdCAqIGZyb20gc20gbSwgc20gbiB3aGVyZSBtLmEgPSBuLmMgYW5kIG0uYiA9IG4uYjsK Ky0tZXhwbGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4gd2hl cmUgbS5jID0gbi5iIGFuZCBtLmEgPSBuLmE7CistLSBDaGVjayBvcHRpbWl6YXRpb24gZGlz YWJsaW5nIGlmIGl0IHdpbGwgdmlvbGF0ZSBzcGVjaWFsIGpvaW4gY29uZGl0aW9ucy4KKy0t IFR3byBpZGVudGljYWwgam9pbmVkIHJlbGF0aW9ucyBzYXRpc2ZpZXMgc2VsZiBqb2luIHJl bW92YWwgY29uZGl0aW9ucyBidXQKKy0tIHN0YXkgaW4gZGlmZmVyZW50IHNwZWNpYWwgam9p biBpbmZvcy4KK0NSRUFURSBUQUJMRSBzal90MSAoaWQgc2VyaWFsLCBhIGludCk7CitDUkVB VEUgVEFCTEUgc2pfdDIgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3Qz IChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90NCAoaWQgc2VyaWFsLCBh IGludCk7CitDUkVBVEUgVU5JUVVFIElOREVYIE9OIHNqX3QzIFVTSU5HIGJ0cmVlIChhLGlk KTsKK0NSRUFURSBVTklRVUUgSU5ERVggT04gc2pfdDIgVVNJTkcgYnRyZWUgKGlkKTsKK0VY UExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2pfdDEKK0pPSU4gKAorCVNFTEVD VCBzal90Mi5pZCBBUyBpZCBGUk9NIHNqX3QyCisJV0hFUkUgRVhJU1RTCisJCSgKKwkJU0VM RUNUIFRSVUUgRlJPTSBzal90Myxzal90NCBXSEVSRSBzal90My5hID0gMSBBTkQgc2pfdDMu aWQgPSBzal90Mi5pZAorCQkpCisJKSB0MnQzdDQKK09OIHNqX3QxLmlkID0gdDJ0M3Q0Lmlk CitKT0lOICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBzal90MgorCVdIRVJFIEVY SVNUUworCQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pfdDQgV0hFUkUgc2pfdDMu YSA9IDEgQU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkgX3QydDN0NAorT04gc2pf dDEuaWQgPSBfdDJ0M3Q0LmlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2lu IEZpbHRlcjogKHNqX3QzLmlkID0gc2pfdDEuaWQpCisgICAtPiAgTmVzdGVkIExvb3AKKyAg ICAgICAgIEpvaW4gRmlsdGVyOiAoc2pfdDIuaWQgPSBzal90My5pZCkKKyAgICAgICAgIC0+ ICBOZXN0ZWQgTG9vcCBTZW1pIEpvaW4KKyAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9v cAorICAgICAgICAgICAgICAgICAgICAgLT4gIEhhc2hBZ2dyZWdhdGUKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgIEdyb3VwIEtleTogc2pfdDMuaWQKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqX3Q0CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHNqX3QzCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNoZWNrIENvbmQ6IChhID0gMSkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBCaXRt YXAgSW5kZXggU2NhbiBvbiBzal90M19hX2lkX2lkeAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgPSAxKQorICAg ICAgICAgICAgICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBzal90Ml9pZF9p ZHggb24gc2pfdDIgc2pfdDJfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgg Q29uZDogKGlkID0gc2pfdDMuaWQpCisgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExvb3AK KyAgICAgICAgICAgICAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgc2pfdDNf YV9pZF9pZHggb24gc2pfdDMgc2pfdDNfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAg SW5kZXggQ29uZDogKChhID0gMSkgQU5EIChpZCA9IHNqX3QzLmlkKSkKKyAgICAgICAgICAg ICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzal90NCBzal90NF8xCisgICAgICAgICAtPiAg SW5kZXggT25seSBTY2FuIHVzaW5nIHNqX3QyX2lkX2lkeCBvbiBzal90MgorICAgICAgICAg ICAgICAgSW5kZXggQ29uZDogKGlkID0gc2pfdDJfMS5pZCkKKyAgIC0+ICBTZXEgU2NhbiBv biBzal90MQorKDI0IHJvd3MpCisKKy0tCistLSBUZXN0IFJvd01hcmtzLXJlbGF0ZWQgY29k ZQorLS0KKy0tIFRPRE86IFdoeSB0aGlzIHNlbGVjdCByZXR1cm5zIHR3byBjb2llcyBvZiBj dGlkIGZpZWxkPyBTaG91bGQgd2UgZml4IGl0PworRVhQTEFJTiAoQ09TVFMgT0ZGKSAtLSBC b3RoIHNpZGVzIGhhdmUgZXhwbGljaXQgTG9ja1Jvd3MgbWFya3MKK1NFTEVDVCBhMS5hIEZS T00gc2ogYTEsc2ogYTIgV0hFUkUgKGExLmE9YTIuYSkgRk9SIFVQREFURTsKKyAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgTG9ja1Jvd3MKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBhMgorICAgICAgICAg RmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKygzIHJvd3MpCisKK0VYUExBSU4gKENPU1RTIE9G RikgLS0gQSBSb3dNYXJrIGV4aXN0cyBmb3IgdGhlIHRhYmxlIGJlaW5nIGtlcHQKK1VQREFU RSBzaiBzcSBTRVQgYiA9IDEgRlJPTSBzaiBhcyBzeiBXSEVSRSBzcS5hID0gc3ouYTsKKyAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgVXBkYXRlIG9uIHNqIHNxCisgICAtPiAgU2VxIFNjYW4gb24gc2og c3oKKyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisoMyByb3dzKQorCitDUkVB VEUgUlVMRSBzal9kZWxfcnVsZSBBUyBPTiBERUxFVEUgVE8gc2oKKyAgRE8gSU5TVEVBRAor ICAgIFVQREFURSBzaiBTRVQgYSA9IDEgV0hFUkUgYSA9IG9sZC5hOworRVhQTEFJTiAoQ09T VFMgT0ZGKSBERUxFVEUgRlJPTSBzajsgLS0gQSBSb3dNYXJrIGV4aXN0cyBmb3IgdGhlIHRh YmxlIGJlaW5nIGRyb3BwZWQKKyAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgVXBkYXRlIG9uIHNqCisgICAt PiAgU2VxIFNjYW4gb24gc2oKKyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCiso MyByb3dzKQorCitEUk9QIFJVTEUgc2pfZGVsX3J1bGUgT04gc2ogQ0FTQ0FERTsKK3Jlc2V0 IGVuYWJsZV9oYXNoam9pbjsKK3Jlc2V0IGVuYWJsZV9tZXJnZWpvaW47CiAtLQogLS0gVGVz dCBoaW50cyBnaXZlbiBvbiBpbmNvcnJlY3QgY29sdW1uIHJlZmVyZW5jZXMgYXJlIHVzZWZ1 bAogLS0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mu b3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQKaW5kZXggMDAx YzZlN2ViOS4uMzA2MjY4NjYxNiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9zeXN2aWV3cy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2 aWV3cy5vdXQKQEAgLTEyOSwxMCArMTI5LDExIEBAIHNlbGVjdCBuYW1lLCBzZXR0aW5nIGZy b20gcGdfc2V0dGluZ3Mgd2hlcmUgbmFtZSBsaWtlICdlbmFibGUlJzsKICBlbmFibGVfcGFy dGl0aW9ud2lzZV9hZ2dyZWdhdGUgfCBvZmYKICBlbmFibGVfcGFydGl0aW9ud2lzZV9qb2lu ICAgICAgfCBvZmYKICBlbmFibGVfcHJlc29ydGVkX2FnZ3JlZ2F0ZSAgICAgfCBvbgorIGVu YWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCAgICAgICB8IG9uCiAgZW5hYmxlX3NlcXNjYW4gICAg ICAgICAgICAgICAgIHwgb24KICBlbmFibGVfc29ydCAgICAgICAgICAgICAgICAgICAgfCBv bgogIGVuYWJsZV90aWRzY2FuICAgICAgICAgICAgICAgICB8IG9uCi0oMjEgcm93cykKKygy MiByb3dzKQogCiAtLSBUZXN0IHRoYXQgdGhlIHBnX3RpbWV6b25lX25hbWVzIGFuZCBwZ190 aW1lem9uZV9hYmJyZXZzIHZpZXdzIGFyZQogLS0gbW9yZS1vci1sZXNzIHdvcmtpbmcuICBX ZSBjYW4ndCB0ZXN0IHRoZWlyIGNvbnRlbnRzIGluIGFueSBncmVhdCBkZXRhaWwKZGlmZiAt LWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2VxdWl2Y2xhc3Muc3FsIGIvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwKaW5kZXggMjQ3YjBhMzEwNS4uNzdkZDk2NGVi ZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwKKysr IGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwKQEAgLTI1OSw2ICsyNTks MjIgQEAgZHJvcCB1c2VyIHJlZ3Jlc3NfdXNlcl9lY3Rlc3Q7CiBleHBsYWluIChjb3N0cyBv ZmYpCiAgIHNlbGVjdCAqIGZyb20gdGVuazEgd2hlcmUgdW5pcXVlMSA9IHVuaXF1ZTEgYW5k IHVuaXF1ZTIgPSB1bmlxdWUyOwogCistLSBUZXN0IHRoYXQgYnJva2VuIEVDcyBhcmUgcHJv Y2Vzc2VkIGNvcnJlY3RseSBkdXJpbmcgc2VsZiBqb2luIHJlbW92YWwuCistLSBEaXNhYmxl IG1lcmdlIGpvaW5zIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGFuIGVycm9yIGFib3V0IG1pc3Np bmcgY29tbXV0YXRvci4KKy0tIFRlc3QgYm90aCBvcmllbnRhdGlvbnMgb2YgdGhlIGpvaW4g Y2xhdXNlLCBiZWNhdXNlIG9ubHkgb25lIG9mIHRoZW0gYnJlYWtzCistLSB0aGUgRUMuCitz ZXQgZW5hYmxlX21lcmdlam9pbiB0byBvZmY7CisKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAg c2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBuLmZmCisgIGpvaW4g ZWMxIHAgb24gbS5mZiArIG4uZmYgPSBwLmYxOworCitleHBsYWluIChjb3N0cyBvZmYpCisg IHNlbGVjdCAqIGZyb20gZWMwIG0gam9pbiBlYzAgbiBvbiBtLmZmID0gbi5mZgorICBqb2lu IGVjMSBwIG9uIHAuZjE6OmludDggPSAobS5mZiArIG4uZmYpOjppbnQ4YWxpYXMxOworCity ZXNldCBlbmFibGVfbWVyZ2Vqb2luOworCiAtLSB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCwg YnV0IGlzbid0IGF0IHByZXNlbnQKIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgc2VsZWN0ICog ZnJvbSB0ZW5rMSB3aGVyZSB1bmlxdWUxID0gdW5pcXVlMSBvciB1bmlxdWUyID0gdW5pcXVl MjsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsIGIvc3JjL3Rl c3QvcmVncmVzcy9zcWwvam9pbi5zcWwKaW5kZXggODQ1NDdjN2RmZi4uNTEzZmQ3OTFjYSAx MDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwKKysrIGIvc3JjL3Rl c3QvcmVncmVzcy9zcWwvam9pbi5zcWwKQEAgLTIxODIsNiArMjE4MiwzNDYgQEAgc2VsZWN0 ICogZnJvbQogc2VsZWN0ICogZnJvbQogICBpbnQ4X3RibCB4IGpvaW4gKGludDRfdGJsIHgg Y3Jvc3Mgam9pbiBpbnQ0X3RibCB5KGZmKSkgaiBvbiBxMSA9IGYxOyAtLSBvawogCistLQor LS0gdGVzdCB0aGF0IHNlbWktIG9yIGlubmVyIHNlbGYtam9pbnMgb24gYSB1bmlxdWUgY29s dW1uIGFyZSByZW1vdmVkCistLQorCistLSBlbmFibGUgb25seSBuZXN0bG9vcCB0byBnZXQg bW9yZSBwcmVkaWN0YWJsZSBwbGFucworc2V0IGVuYWJsZV9oYXNoam9pbiB0byBvZmY7Citz ZXQgZW5hYmxlX21lcmdlam9pbiB0byBvZmY7CisKK2NyZWF0ZSB0YWJsZSBzaiAoYSBpbnQg dW5pcXVlLCBiIGludCwgYyBpbnQgdW5pcXVlKTsKK2luc2VydCBpbnRvIHNqIHZhbHVlcyAo MSwgbnVsbCwgMiksIChudWxsLCAyLCBudWxsKSwgKDIsIDEsIDEpOworYW5hbHl6ZSBzajsK KworLS0gVHJpdmlhbCBzZWxmLWpvaW4gY2FzZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3Nl bGVjdCBwLiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iID0gcS5h IC0gMTsKK3NlbGVjdCBwLiogZnJvbSBzaiBwLCBzaiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQg cS5iID0gcS5hIC0gMTsKKworLS0gU2VsZi1qb2luIHJlbW92YWwgcGVyZm9ybXMgYWZ0ZXIg YSBzdWJxdWVyeSBwdWxsLXVwIHByb2Nlc3MgYW5kIGNvdWxkIHJlbW92ZQorLS0gc3VjaCBr aW5kIG9mIHNlbGYtam9pbiB0b28uIENoZWNrIHRoaXMgb3B0aW9uLgorZXhwbGFpbiAoY29z dHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiBwCit3aGVyZSBleGlzdHMgKHNlbGVjdCAqIGZy b20gc2ogcQorCQkJCXdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iIDwgMTApOworc2VsZWN0ICog ZnJvbSBzaiBwIHdoZXJlIGV4aXN0cyAoc2VsZWN0ICogZnJvbSBzaiBxIHdoZXJlIHEuYSA9 IHAuYSBhbmQgcS5iIDwgMTApOworCistLSBEb24ndCByZW1vdmUgc2VsZi1qb2luIGZvciB0 aGUgY2FzZSBvZiBlcXVhbGl0eSBvZiB0d28gZGlmZmVyZW50IHVuaXF1ZSBjb2x1bW5zLgor ZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2ogdDIgd2hlcmUg dDEuYSA9IHQyLmMgYW5kIHQxLmIgaXMgbm90IG51bGw7CisKKy0tIERlZ2VuZXJhdGVkIGNh c2UuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tCisJKHNlbGVjdCBhIGFz IHggZnJvbSBzaiB3aGVyZSBmYWxzZSkgYXMgcTEsCisJKHNlbGVjdCBhIGFzIHkgZnJvbSBz aiB3aGVyZSBmYWxzZSkgYXMgcTIKK3doZXJlIHExLnggPSBxMi55OworCistLSBXZSBjYW4n dCB1c2UgYSBjcm9zcy1FQyBnZW5lcmF0ZWQgc2VsZiBqb2luIHF1YWwgYmVjYXVzZSBvZiBj dXJyZW50IGxvZ2ljIG9mCistLSB0aGUgZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2VxdWFsaXRp ZXMgcm91dGluZS4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEs IHNqIHQyIHdoZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQy LmE7CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0Miwg c2ogdDMKK3doZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQy LmEKKwlhbmQgdDEuYiA9IHQzLmIgYW5kIHQzLmIgPSB0My5hOworCistLSBEb3VibGUgc2Vs Zi1qb2luIHJlbW92YWwuCistLSBVc2UgYSBjb25kaXRpb24gb24gImIgKyAxIiwgbm90IG9u ICJiIiwgZm9yIHRoZSBzZWNvbmQgam9pbiwgc28gdGhhdAorLS0gdGhlIGVxdWl2YWxlbmNl IGNsYXNzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBvbmUsIGFuZCB3ZSBjYW4KKy0t IHRlc3QgdGhlIG5vbi1lYyBjb2RlIHBhdGguCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxl Y3QgKiBmcm9tIHNqIHQxIGpvaW4gc2ogdDIgb24gdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSB0 Mi5iCisJam9pbiBzaiB0MyBvbiB0Mi5hID0gdDMuYSBhbmQgdDIuYiArIDEgPSB0My5iICsg MTsKKworLS0gc3Vic2VsZWN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVtb3ZlZCByZWxhdGlv bgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IHQxLmEsIChzZWxlY3QgYSBmcm9tIHNq IHdoZXJlIGEgPSB0Mi5hIGFuZCBhID0gdDEuYSkKK2Zyb20gc2ogdDEsIHNqIHQyCit3aGVy ZSB0MS5hID0gdDIuYTsKKworLS0gc2VsZi1qb2luIHVuZGVyIG91dGVyIGpvaW4KK2V4cGxh aW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogeCBqb2luIHNqIHkgb24geC5hID0g eS5hCitsZWZ0IGpvaW4gaW50OF90YmwgeiBvbiB4LmEgPSB6LnExOworCitleHBsYWluIChj b3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHggam9pbiBzaiB5IG9uIHguYSA9IHkuYQor bGVmdCBqb2luIGludDhfdGJsIHogb24geS5hID0gei5xMTsKKworZXhwbGFpbiAoY29zdHMg b2ZmKQorU0VMRUNUICogRlJPTSAoCisgIFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGF4IEZST00g c2ogdDEgSk9JTiBzaiB0MgorICBPTiAodDEuYSA9IHQyLmEgQU5EIHQxLmMqdDEuYyA9IHQy LmMrMiBBTkQgdDIuYiBJUyBOVUxMKQorKSBBUyBxMQorTEVGVCBKT0lOCisgIChTRUxFQ1Qg dDMuKiBGUk9NIHNqIHQzLCBzaiB0NCBXSEVSRSB0My5jID0gdDQuYykgQVMgcTIKK09OIHEx LmF4ID0gcTIuYTsKKworLS0gVGVzdCB0aGF0IHBsYWNlaG9sZGVycyBhcmUgdXBkYXRlZCBj b3JyZWN0bHkgYWZ0ZXIgam9pbiByZW1vdmFsCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxl Y3QgKiBmcm9tICh2YWx1ZXMgKDEpKSB4CitsZWZ0IGpvaW4gKHNlbGVjdCBjb2FsZXNjZSh5 LnExLCAxKSBmcm9tIGludDhfdGJsIHkKKwlyaWdodCBqb2luIHNqIGoxIGlubmVyIGpvaW4g c2ogajIgb24gajEuYSA9IGoyLmEKKwlvbiB0cnVlKSB6CitvbiB0cnVlOworCistLQorLS0g U0pSIGNvcm5lciBjYXNlOiB1bmlxdWVuZXNzIG9mIGFuIGlubmVyIGlzIFtwYXJ0aWFsbHld IGRlcml2ZWQgZnJvbQorLS0gYmFzZXJlc3RyaWN0aW5mbyBjbGF1c2VzLgorLS0gWFhYOiBX ZSByZWFsbHkgc2hvdWxkIGFsbG93IFNKUiBmb3IgdGhlc2UgY29ybmVyIGNhc2VzPworLS0K KworSU5TRVJUIElOVE8gc2ogVkFMVUVTICgzLCAxLCAzKTsKKworZXhwbGFpbiAoY29zdHMg b2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBX SEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAzOworU0VMRUNUICog RlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMiBBTkQg ajIuYSA9IDM7IC0tIFJldHVybiBvbmUgcm93CisKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0g UmVtb3ZlIFNKLCBkZWZpbmUgdW5pcXVlbmVzcyBieSBhIGNvbnN0YW50CisJU0VMRUNUICog RlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyIEFORCBq Mi5hID0gMjsKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIu YiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAyOyAtLSBSZXR1cm4gb25lIHJvdworCitFWFBM QUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEu YiA9IGoyLmIKKyAgQU5EIGoxLmEgPSAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVz dGFtcCgwKSkvMTUgKyAzKTo6aW50CisgIEFORCAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50 X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50ID0gajIuYQorOyAtLSBSZW1vdmUgU0osIGRl ZmluZSB1bmlxdWVuZXNzIGJ5IGEgY29uc3RhbnQgZXhwcmVzc2lvbgorU0VMRUNUICogRlJP TSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisgIEFORCBqMS5hID0gKEVYVFJB Q1QoRE9XIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludAorICBBTkQg KEVYVFJBQ1QoRE9XIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6OmludCA9 IGoyLmEKKzsgLS0gUmV0dXJuIG9uZSByb3cKKworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBS ZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIu YiBBTkQgajEuYSA9IDEgQU5EIGoyLmEgPSAxOworU0VMRUNUICogRlJPTSBzaiBqMSwgc2og ajIKK1dIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMSBBTkQgajIuYSA9IDE7IC0tIFJl dHVybiBubyByb3dzCisKK2V4cGxhaW4gKGNvc3RzIG9mZikgLS0gU2h1ZmZsZSBhIGNsYXVz ZS4gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9 IGoyLmIgQU5EIDEgPSBqMS5hIEFORCBqMi5hID0gMTsKK1NFTEVDVCAqIEZST00gc2ogajEs IHNqIGoyCitXSEVSRSBqMS5iID0gajIuYiBBTkQgMSA9IGoxLmEgQU5EIGoyLmEgPSAxOyAt LSBSZXR1cm4gbm8gcm93cworCistLSBGdW5jdGlvbmFsIGluZGV4CitDUkVBVEUgVU5JUVVF IElOREVYIHNqX2ZuX2lkeCBPTiBzaigoYSAqIGEpKTsKK2V4cGxhaW4gKGNvc3RzIG9mZikg LS0gUmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5i ID0gajIuYiBBTkQgajEuYSpqMS5hID0gMSBBTkQgajIuYSpqMi5hID0gMTsKK2V4cGxhaW4g KGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBqMSwg c2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSpqMS5hID0gMSBBTkQgajIuYSpq Mi5hID0gMjsKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNq IGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEqajEuYSkgPSAoRVhUUkFDVChE T1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50CisgIEFORCAoRVhU UkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50ID0gKGoy LmEqajIuYSkKKzsgLS0gUmVzdHJpY3Rpb24gY29udGFpbnMgZXhwcmVzc2lvbnMgaW4gYm90 aCBzaWRlcywgUmVtb3ZlIFNKLgorU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJF IGoxLmIgPSBqMi5iCisgIEFORCAoajEuYSpqMS5hKSA9IChFWFRSQUNUKERPVyBGUk9NIGN1 cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQKKyAgQU5EIChFWFRSQUNUKERPVyBG Uk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQgPSAoajIuYSpqMi5hKQor OyAtLSBFbXB0eSBzZXQgb2Ygcm93cyBzaG91bGQgYmUgcmV0dXJuZWQKK0VYUExBSU4gKENP U1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIu YgorICBBTkQgKGoxLmEqajEuYSkgPSAocmFuZG9tKCkvMyArIDMpOjppbnQKKyAgQU5EIChy YW5kb20oKS8zICsgMyk6OmludCA9IChqMi5hKmoyLmEpCis7IC0tIFJlc3RyaWN0aW9uIGNv bnRhaW5zIHZvbGF0aWxlIGZ1bmN0aW9uIC0gZGlzYWJsZSBTSlIgZmVhdHVyZS4KK1NFTEVD VCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEq ajEuYy8zKSA9IChyYW5kb20oKS8zICsgMyk6OmludAorICBBTkQgKHJhbmRvbSgpLzMgKyAz KTo6aW50ID0gKGoyLmEqajIuYy8zKQorOyAtLSBSZXR1cm4gb25lIHJvdworCistLSBNdWx0 aXBsZSBmaWx0ZXJzCitDUkVBVEUgVU5JUVVFIElOREVYIHNqX3RlbXBfaWR4MSBPTiBzaihh LGIsYyk7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIFJlbW92ZSBTSgorCVNFTEVDVCAqIEZS T00gc2ogajEsIHNqIGoyCisJV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyIEFORCBq MS5jID0gMyBBTkQgajIuYSA9IDIgQU5EIDMgPSBqMi5jOworZXhwbGFpbiAoY29zdHMgb2Zm KSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorCVdI RVJFIGoxLmIgPSBqMi5iIEFORCAyID0gajEuYSBBTkQgajEuYyA9IDMgQU5EIGoyLmEgPSAx IEFORCAzID0gajIuYzsKKworQ1JFQVRFIFVOSVFVRSBJTkRFWCBzal90ZW1wX2lkeCBPTiBz aihhLGIpOworZXhwbGFpbiAoY29zdHMgb2ZmKSAtLSBEb24ndCByZW1vdmUgU0oKKwlTRUxF Q1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDI7 CitleHBsYWluIChjb3N0cyBvZmYpIC0tIERvbid0IHJlbW92ZSBTSgorCVNFTEVDVCAqIEZS T00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCAyID0gajIuYTsKK2V4cGxh aW4gKGNvc3RzIG9mZikgLS0gRG9uJ3QgcmVtb3ZlIFNKCisJU0VMRUNUICogRlJPTSBzaiBq MSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIChqMS5hID0gMSBPUiBqMi5hID0gMSk7 CitEUk9QIElOREVYIHNqX2ZuX2lkeCwgc2pfdGVtcF9pZHgxLCBzal90ZW1wX2lkeDsKKwor LS0gVGVzdCB0aGF0IE9SIHByZWRpY2F0ZWQgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVy IGpvaW4gcmVtb3ZhbAorQ1JFQVRFIFRBQkxFIHRhYl93aXRoX2ZsYWcgKCBpZCBJTlQgUFJJ TUFSWSBLRVksIGlzX2ZsYWcgU01BTExJTlQpOworQ1JFQVRFIElOREVYIGlkeF90ZXN0X2lz X2ZsYWcgT04gdGFiX3dpdGhfZmxhZyAoaXNfZmxhZyk7CitleHBsYWluIChjb3N0cyBvZmYp CitTRUxFQ1QgQ09VTlQoKikgRlJPTSB0YWJfd2l0aF9mbGFnCitXSEVSRQorCShpc19mbGFn IElTIE5VTEwgT1IgaXNfZmxhZyA9IDApCisJQU5EIGlkIElOIChTRUxFQ1QgaWQgRlJPTSB0 YWJfd2l0aF9mbGFnIFdIRVJFIGlkIElOICgyLCAzKSk7CitEUk9QIFRBQkxFIHRhYl93aXRo X2ZsYWc7CisKKy0tIEhBVklORyBjbGF1c2UKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVj dCBwLmIgZnJvbSBzaiBwIGpvaW4gc2ogcSBvbiBwLmEgPSBxLmEgZ3JvdXAgYnkgcC5iIGhh dmluZyBzdW0ocC5hKSA9IDE7CisKKy0tIHVwZGF0ZSBsYXRlcmFsIHJlZmVyZW5jZXMgYW5k IHJhbmdlIHRhYmxlIGVudHJ5IHJlZmVyZW5jZQorZXhwbGFpbiAodmVyYm9zZSwgY29zdHMg b2ZmKQorc2VsZWN0IDEgZnJvbSAoc2VsZWN0IHguKiBmcm9tIHNqIHgsIHNqIHkgd2hlcmUg eC5hID0geS5hKSBxLAorICBsYXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLCBxLmEpIGdzKGkp OworCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitzZWxlY3QgMSBmcm9tIChzZWxl Y3QgeS4qIGZyb20gc2ogeCwgc2ogeSB3aGVyZSB4LmEgPSB5LmEpIHEsCisgIGxhdGVyYWwg Z2VuZXJhdGVfc2VyaWVzKDEsIHEuYSkgZ3MoaSk7CisKKy0tIFRlc3QgdGhhdCBhIG5vbi1F Qy1kZXJpdmVkIGpvaW4gY2xhdXNlIGlzIHByb2Nlc3NlZCBjb3JyZWN0bHkuIFVzZSBhbgor LS0gb3V0ZXIgam9pbiBzbyB0aGF0IHdlIGNhbid0IGZvcm0gYW4gRUMuCitleHBsYWluIChj b3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gc2ogcCBqb2luIHNqIHEgb24gcC5hID0gcS5hCisg IGxlZnQgam9pbiBzaiByIG9uIHAuYSArIHEuYSA9IHIuYTsKKworLS0gRklYTUUgdGhpcyBj b25zdGFudCBmYWxzZSBmaWx0ZXIgZG9lc24ndCBsb29rIGdvb2QuIFNob3VsZCB3ZSBtZXJn ZQorLS0gZXF1aXZhbGVuY2UgY2xhc3Nlcz8KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVj dCAqIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBwLmEgPSBxLmEgYW5kIHAuYiA9IDEgYW5kIHEu YiA9IDI7CisKKy0tIENoZWNrIHRoYXQgYXR0cl9uZWVkZWQgaXMgdXBkYXRlZCBjb3JyZWN0 bHkgYWZ0ZXIgc2VsZi1qb2luIHJlbW92YWwuIEluIHRoaXMKKy0tIHRlc3QsIHRoZSBqb2lu IG9mIGoxIHdpdGggajIgaXMgcmVtb3ZlZC4gazEuYiBpcyByZXF1aXJlZCBhdCBlaXRoZXIg ajEgb3IgajIuCistLSBJZiB0aGlzIGluZm8gaXMgbG9zdCwgam9pbiB0YXJnZXRsaXN0IGZv ciAoazEsIGsyKSB3aWxsIG5vdCBjb250YWluIGsxLmIuCistLSBVc2UgaW5kZXggc2NhbiBm b3IgazEgc28gdGhhdCB3ZSBkb24ndCBnZXQgJ2InIGZyb20gcGh5c2ljYWwgdGxpc3QgdXNl ZCBmb3IKKy0tIHNlcXNjYW4uIEFsc28gZGlzYWJsZSByZW9yZGVyaW5nIG9mIGpvaW5zIGJl Y2F1c2UgdGhpcyB0ZXN0IGRlcGVuZHMgb24gYQorLS0gcGFydGljdWxhciBqb2luIHRyZWUu CitjcmVhdGUgdGFibGUgc2sgKGEgaW50LCBiIGludCk7CitjcmVhdGUgaW5kZXggb24gc2so YSk7CitzZXQgam9pbl9jb2xsYXBzZV9saW1pdCB0byAxOworc2V0IGVuYWJsZV9zZXFzY2Fu IHRvIG9mZjsKK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0IDEgZnJvbQorCShzayBrMSBq b2luIHNrIGsyIG9uIGsxLmEgPSBrMi5hKQorCWpvaW4gKHNqIGoxIGpvaW4gc2ogajIgb24g ajEuYSA9IGoyLmEpIG9uIGoxLmIgPSBrMS5iOworZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxl Y3QgMSBmcm9tCisJKHNrIGsxIGpvaW4gc2sgazIgb24gazEuYSA9IGsyLmEpCisJam9pbiAo c2ogajEgam9pbiBzaiBqMiBvbiBqMS5hID0gajIuYSkgb24gajIuYiA9IGsxLmI7CityZXNl dCBqb2luX2NvbGxhcHNlX2xpbWl0OworcmVzZXQgZW5hYmxlX3NlcXNjYW47CisKK3NldCBz ZWxmX2pvaW5fc2VhcmNoX2xpbWl0IHRvIDE7CitleHBsYWluIChjb3N0cyBvZmYpIC0tIE5v IG9uZSBzZWxmIGpvaW4gc2hvdWxkIGJlIGNvbGxhcHNlZAorICBzZWxlY3QgajEuKiBmcm9t IHNqIGoxLCBzaiBqMiwgc2ogajMgd2hlcmUgKGoxLmEgPSBqMi5hKSBhbmQgKGoyLmEgPSBq My5hKTsKK3NldCBzZWxmX2pvaW5fc2VhcmNoX2xpbWl0IHRvIDI7CitleHBsYWluIChjb3N0 cyBvZmYpIC0tIENvbGxhcHNlIG9uZSBzZWxmIGpvaW4KKyAgc2VsZWN0IGoxLiogZnJvbSBz aiBqMSwgc2ogajIsIHNqIGozIHdoZXJlIChqMS5hID0gajIuYSkgYW5kIChqMi5hID0gajMu YSk7CitzZXQgc2VsZl9qb2luX3NlYXJjaF9saW1pdCB0byAzOworZXhwbGFpbiAoY29zdHMg b2ZmKSAtLSBDb2xsYXBzZSBib3RoIHNlbGYgam9pbnMKKyAgc2VsZWN0IGoxLiogZnJvbSBz aiBqMSwgc2ogajIsIHNqIGozIHdoZXJlIChqMS5hID0gajIuYSkgYW5kIChqMi5hID0gajMu YSk7CityZXNldCBzZWxmX2pvaW5fc2VhcmNoX2xpbWl0OworCistLSBDaGVjayB0aGF0IGNs YXVzZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIgbGlzdCBpcyBub3QgbG9zdCBvbiB0aGUgc2Vs Zi1qb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSBlbXAxICggaWQgU0VSSUFMIFBSSU1BUlkg S0VZIE5PVCBOVUxMLCBjb2RlIGludCk7CitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYp CitTRUxFQ1QgKiBGUk9NIGVtcDEgZTEsIGVtcDEgZTIgV0hFUkUgZTEuaWQgPSBlMi5pZCBB TkQgZTIuY29kZSA8PiBlMS5jb2RlOworCistLSBXZSBjYW4gcmVtb3ZlIHRoZSBqb2luIGV2 ZW4gaWYgd2UgZmluZCB0aGUgam9pbiBjYW4ndCBkdXBsaWNhdGUgcm93cyBhbmQKKy0tIHRo ZSBiYXNlIHF1YWxzIG9mIGVhY2ggc2lkZSBhcmUgZGlmZmVyZW50LiAgSW4gdGhlIGZvbGxv d2luZyBjYXNlIHdlIGVuZCB1cAorLS0gbW92aW5nIHF1YWxzIG92ZXIgdG8gczEgdG8gbWFr ZSBpdCBzbyBpdCBjYW4ndCBtYXRjaCBhbnkgcm93cy4KK2NyZWF0ZSB0YWJsZSBzbChhIGlu dCwgYiBpbnQsIGMgaW50KTsKK2NyZWF0ZSB1bmlxdWUgaW5kZXggb24gc2woYSwgYik7Cit2 YWN1dW0gYW5hbHl6ZSBzbDsKKworLS0gQm90aCBzaWRlcyBhcmUgdW5pcXVlLCBidXQgYmFz ZSBxdWFscyBhcmUgZGlmZmVyZW50CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBm cm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQy LmIgPSAyOworCistLSBDaGVjayBOdWxsVGVzdCBpbiBiYXNlcmVzdHJpY3RpbmZvIGxpc3QK K2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyCit3aGVy ZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQyLmIgPSAyCisgIGFuZCB0MS5jIElT IE5PVCBOVUxMIGFuZCB0Mi5jIElTIE5PVCBOVUxMCisgIGFuZCB0Mi5iIElTIE5PVCBOVUxM IGFuZCB0MS5iIElTIE5PVCBOVUxMCisgIGFuZCB0MS5hIElTIE5PVCBOVUxMIGFuZCB0Mi5h IElTIE5PVCBOVUxMOworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0ICog ZnJvbSBzbCB0MSwgc2wgdDIKK3doZXJlIHQxLmIgPSB0Mi5iIGFuZCB0Mi5hID0gMyBhbmQg dDEuYSA9IDMKKyAgYW5kIHQxLmMgSVMgTk9UIE5VTEwgYW5kIHQyLmMgSVMgTk9UIE5VTEwK KyAgYW5kIHQyLmIgSVMgTk9UIE5VTEwgYW5kIHQxLmIgSVMgTk9UIE5VTEwKKyAgYW5kIHQx LmEgSVMgTk9UIE5VTEwgYW5kIHQyLmEgSVMgTk9UIE5VTEw7CisKKy0tIEpvaW4gcXVhbCBp c24ndCBtZXJnZWpvaW5hYmxlLCBidXQgaW5uZXIgaXMgdW5pcXVlLgorZXhwbGFpbiAoQ09T VFMgT0ZGKQorU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIgV0hFUkUgbjEuYSA8PiBu Mi5hIEFORCBuMi5hID0gMTsKK2V4cGxhaW4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00K KwkoU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIgV0hFUkUgbjEuYSA8PiBuMi5hKSBx MCwgc2wKK1dIRVJFIHEwLmEgPSAxOworCistLQorLS0tLSBPbmx5IG9uZSBzaWRlIGlzIHVu cWl1ZQorLS1zZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBh bmQgdDEuYiA9IDE7CistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEg PSB0Mi5hIGFuZCB0Mi5iID0gMTsKKy0tCistLS0tIFNldmVyYWwgdW5pcXVlcyBpbmRleGVz IG1hdGNoLCBhbmQgd2Ugc2VsZWN0IGEgZGlmZmVyZW50IG9uZQorLS0tLSBmb3IgZWFjaCBz aWRlLCBzbyB0aGUgam9pbiBpcyBub3QgcmVtb3ZlZAorLS1jcmVhdGUgdGFibGUgc20oYSBp bnQgdW5pcXVlLCBiIGludCB1bmlxdWUsIGMgaW50IHVuaXF1ZSk7CistLWV4cGxhaW4gKGNv c3RzIG9mZikKKy0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0uYSA9IG4uYiBh bmQgbS5jID0gbi5jOworLS1leHBsYWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAqIGZyb20g c20gbSwgc20gbiB3aGVyZSBtLmEgPSBuLmMgYW5kIG0uYiA9IG4uYjsKKy0tZXhwbGFpbiAo Y29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4gd2hlcmUgbS5jID0gbi5i IGFuZCBtLmEgPSBuLmE7CisKKy0tIENoZWNrIG9wdGltaXphdGlvbiBkaXNhYmxpbmcgaWYg aXQgd2lsbCB2aW9sYXRlIHNwZWNpYWwgam9pbiBjb25kaXRpb25zLgorLS0gVHdvIGlkZW50 aWNhbCBqb2luZWQgcmVsYXRpb25zIHNhdGlzZmllcyBzZWxmIGpvaW4gcmVtb3ZhbCBjb25k aXRpb25zIGJ1dAorLS0gc3RheSBpbiBkaWZmZXJlbnQgc3BlY2lhbCBqb2luIGluZm9zLgor Q1JFQVRFIFRBQkxFIHNqX3QxIChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBz al90MiAoaWQgc2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUgc2pfdDMgKGlkIHNlcmlh bCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3Q0IChpZCBzZXJpYWwsIGEgaW50KTsKKwor Q1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBzal90MyBVU0lORyBidHJlZSAoYSxpZCk7CitDUkVB VEUgVU5JUVVFIElOREVYIE9OIHNqX3QyIFVTSU5HIGJ0cmVlIChpZCk7CisKK0VYUExBSU4g KENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2pfdDEKK0pPSU4gKAorCVNFTEVDVCBzal90 Mi5pZCBBUyBpZCBGUk9NIHNqX3QyCisJV0hFUkUgRVhJU1RTCisJCSgKKwkJU0VMRUNUIFRS VUUgRlJPTSBzal90Myxzal90NCBXSEVSRSBzal90My5hID0gMSBBTkQgc2pfdDMuaWQgPSBz al90Mi5pZAorCQkpCisJKSB0MnQzdDQKK09OIHNqX3QxLmlkID0gdDJ0M3Q0LmlkCitKT0lO ICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBzal90MgorCVdIRVJFIEVYSVNUUwor CQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pfdDQgV0hFUkUgc2pfdDMuYSA9IDEg QU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkgX3QydDN0NAorT04gc2pfdDEuaWQg PSBfdDJ0M3Q0LmlkOworCistLQorLS0gVGVzdCBSb3dNYXJrcy1yZWxhdGVkIGNvZGUKKy0t CisKKy0tIFRPRE86IFdoeSB0aGlzIHNlbGVjdCByZXR1cm5zIHR3byBjb2llcyBvZiBjdGlk IGZpZWxkPyBTaG91bGQgd2UgZml4IGl0PworRVhQTEFJTiAoQ09TVFMgT0ZGKSAtLSBCb3Ro IHNpZGVzIGhhdmUgZXhwbGljaXQgTG9ja1Jvd3MgbWFya3MKK1NFTEVDVCBhMS5hIEZST00g c2ogYTEsc2ogYTIgV0hFUkUgKGExLmE9YTIuYSkgRk9SIFVQREFURTsKKworRVhQTEFJTiAo Q09TVFMgT0ZGKSAtLSBBIFJvd01hcmsgZXhpc3RzIGZvciB0aGUgdGFibGUgYmVpbmcga2Vw dAorVVBEQVRFIHNqIHNxIFNFVCBiID0gMSBGUk9NIHNqIGFzIHN6IFdIRVJFIHNxLmEgPSBz ei5hOworCitDUkVBVEUgUlVMRSBzal9kZWxfcnVsZSBBUyBPTiBERUxFVEUgVE8gc2oKKyAg RE8gSU5TVEVBRAorICAgIFVQREFURSBzaiBTRVQgYSA9IDEgV0hFUkUgYSA9IG9sZC5hOwor RVhQTEFJTiAoQ09TVFMgT0ZGKSBERUxFVEUgRlJPTSBzajsgLS0gQSBSb3dNYXJrIGV4aXN0 cyBmb3IgdGhlIHRhYmxlIGJlaW5nIGRyb3BwZWQKK0RST1AgUlVMRSBzal9kZWxfcnVsZSBP TiBzaiBDQVNDQURFOworCityZXNldCBlbmFibGVfaGFzaGpvaW47CityZXNldCBlbmFibGVf bWVyZ2Vqb2luOworCiAtLQogLS0gVGVzdCBoaW50cyBnaXZlbiBvbiBpbmNvcnJlY3QgY29s dW1uIHJlZmVyZW5jZXMgYXJlIHVzZWZ1bAogLS0KZGlmZiAtLWdpdCBhL3NyYy90b29scy9w Z2luZGVudC90eXBlZGVmcy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QKaW5kZXggMjYwODU0NzQ3Yi4uZmU2OWU5ZGJlNCAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xz L3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVk ZWZzLmxpc3QKQEAgLTM2Niw2ICszNjYsNyBAQCBDYXRhbG9nSWQKIENhdGFsb2dJZE1hcEVu dHJ5CiBDYXRhbG9nSW5kZXhTdGF0ZQogQ2hhbmdlVmFyTm9kZXNfY29udGV4dAorQ2hhbmdl VmFybm9Db250ZXh0CiBDaGVja1BvaW50CiBDaGVja1BvaW50U3RtdAogQ2hlY2twb2ludFN0 YXRzRGF0YQpAQCAtMzgyMiw2ICszODIzLDcgQEAgdW5pY29kZVN0eWxlQ29sdW1uRm9ybWF0 CiB1bmljb2RlU3R5bGVGb3JtYXQKIHVuaWNvZGVTdHlsZVJvd0Zvcm1hdAogdW5pY29kZV9s aW5lc3R5bGUKK1VuaXF1ZVJlbEluZm8KIHVuaXRfY29udmVyc2lvbgogdW5sb2dnZWRfcmVs YXRpb25fZW50cnkKIHV0Zl9sb2NhbF9jb252ZXJzaW9uX2Z1bmMKLS0gCjIuMzQuMQoK --------------XRM4TFJuv9jcvMliRpSKYRD6--