From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 3E2D93858C3A for ; Mon, 10 Jan 2022 14:09:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3E2D93858C3A Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id BFAD12B; Mon, 10 Jan 2022 06:09:19 -0800 (PST) Received: from [10.57.5.126] (unknown [10.57.5.126]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 0FF413F766; Mon, 10 Jan 2022 06:09:18 -0800 (PST) Content-Type: multipart/mixed; boundary="------------6m50e0NM0J0FxZvWJsFSmz8i" Message-ID: <5d7bb7af-b09e-cb91-b457-c6148f65028e@arm.com> Date: Mon, 10 Jan 2022 14:09:04 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.4.1 Subject: Re: [AArch64] Enable generation of FRINTNZ instructions Content-Language: en-US To: Richard Biener Cc: "Andre Vieira (lists) via Gcc-patches" , richard.sandiford@arm.com References: <8225375c-eb9e-f9b3-6bcd-9fbccf2fc87b@arm.com> <70s9nn94-452-5rrr-4458-q6n3qp563652@fhfr.qr> <36e3469a-3922-d49e-4006-0088eac29157@arm.com> <653o8886-3p5n-sr82-9n83-71q33o8824@fhfr.qr> <6c730f35-10b1-2843-cffc-4ed0851380be@arm.com> <85sr96q-o3s-602o-3436-40713n68pp84@fhfr.qr> <8d593d5f-41a0-6051-0ce0-d72834ecfa25@arm.com> <9d3755df-6c41-20e4-31fb-811e5cd9182a@arm.com> <231396s0-2756-q51s-q55-o8npqo91on32@fhfr.qr> From: "Andre Vieira (lists)" In-Reply-To: <231396s0-2756-q51s-q55-o8npqo91on32@fhfr.qr> X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, BODY_8BITS, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LOTSOFHASH, KAM_SHORT, NICE_REPLY_A, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Jan 2022 14:09:24 -0000 This is a multi-part message in MIME format. --------------6m50e0NM0J0FxZvWJsFSmz8i Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Yeah seems I forgot to send the latest version, my bad. Bootstrapped on aarch64-none-linux. OK for trunk? gcc/ChangeLog:         * config/aarch64/aarch64.md (ftrunc2): New pattern.         * config/aarch64/iterators.md (FRINTNZ): New iterator.         (frintnz_mode): New int attribute.         (VSFDF): Make iterator conditional.         * internal-fn.def (FTRUNC_INT): New IFN.         * internal-fn.c (ftrunc_int_direct): New define.         (expand_ftrunc_int_optab_fn): New custom expander.         (direct_ftrunc_int_optab_supported_p): New supported_p.         * match.pd: Add to the existing TRUNC pattern match.         * optabs.def (ftrunc_int): New entry.         * stor-layout.h (element_precision): Moved from here...         * tree.h (element_precision): ... to here.         (element_type): New declaration.         * tree.c (element_type): New function.         (element_precision): Changed to use element_type.         * tree-vect-stmts.c (vectorizable_internal_function): Add support for         IFNs with different input types.         (vectorizable_call): Teach to handle IFN_FTRUNC_INT.         * doc/md.texi: New entry for ftrunc pattern name.         * doc/sourcebuild.texi (aarch64_frintzx_ok): New target. gcc/testsuite/ChangeLog:         * gcc.target/aarch64/merge_trunc1.c: Adapted to skip if frintNz instruction available.         * lib/target-supports.exp: Added arm_v8_5a_frintnzx_ok target.         * gcc.target/aarch64/frintnz.c: New test.         * gcc.target/aarch64/frintnz_vec.c: New test. On 03/01/2022 12:18, Richard Biener wrote: > On Wed, 29 Dec 2021, Andre Vieira (lists) wrote: > >> Hi Richard, >> >> Thank you for the review, I've adopted all above suggestions downstream, I am >> still surprised how many style things I still miss after years of gcc >> development :( >> >> On 17/12/2021 12:44, Richard Sandiford wrote: >>>> @@ -3252,16 +3257,31 @@ vectorizable_call (vec_info *vinfo, >>>> rhs_type = unsigned_type_node; >>>> } >>>> - int mask_opno = -1; >>>> + /* The argument that is not of the same type as the others. */ >>>> + int diff_opno = -1; >>>> + bool masked = false; >>>> if (internal_fn_p (cfn)) >>>> - mask_opno = internal_fn_mask_index (as_internal_fn (cfn)); >>>> + { >>>> + if (cfn == CFN_FTRUNC_INT) >>>> + /* For FTRUNC this represents the argument that carries the type of >>>> the >>>> + intermediate signed integer. */ >>>> + diff_opno = 1; >>>> + else >>>> + { >>>> + /* For masked operations this represents the argument that carries >>>> the >>>> + mask. */ >>>> + diff_opno = internal_fn_mask_index (as_internal_fn (cfn)); >>>> + masked = diff_opno >= 0; >>>> + } >>>> + } >>> I think it would be cleaner not to process argument 1 at all for >>> CFN_FTRUNC_INT. There's no particular need to vectorise it. >> I agree with this,  will change the loop to continue for argument 1 when >> dealing with non-masked CFN's. >> >>>> } >>>> […] >>>> diff --git a/gcc/tree.c b/gcc/tree.c >>>> index >>>> 845228a055b2cfac0c9ca8c0cda1b9df4b0095c6..f1e9a1eb48769cb11aa69730e2480ed5522f78c1 >>>> 100644 >>>> --- a/gcc/tree.c >>>> +++ b/gcc/tree.c >>>> @@ -6645,11 +6645,11 @@ valid_constant_size_p (const_tree size, >>>> cst_size_error *perr /* = NULL */) >>>> return true; >>>> } >>>> >>>> -/* Return the precision of the type, or for a complex or vector type the >>>> - precision of the type of its elements. */ >>>> +/* Return the type, or for a complex or vector type the type of its >>>> + elements. */ >>>> -unsigned int >>>> -element_precision (const_tree type) >>>> +tree >>>> +element_type (const_tree type) >>>> { >>>> if (!TYPE_P (type)) >>>> type = TREE_TYPE (type); >>>> @@ -6657,7 +6657,16 @@ element_precision (const_tree type) >>>> if (code == COMPLEX_TYPE || code == VECTOR_TYPE) >>>> type = TREE_TYPE (type); >>>> - return TYPE_PRECISION (type); >>>> + return (tree) type; >>> I think we should stick a const_cast in element_precision and make >>> element_type take a plain “type”. As it stands element_type is an >>> implicit const_cast for many cases. >>> >>> Thanks, >> Was just curious about something here, I thought the purpose of having >> element_precision (before) and element_type (now) take a const_tree as an >> argument was to make it clear we aren't changing the input type. I understand >> that as it stands element_type could be an implicit const_cast (which I should >> be using rather than the '(tree)' cast), but that's only if 'type' is a type >> that isn't complex/vector, either way, we are conforming to the promise that >> we aren't changing the incoming type, what the caller then does with the >> result is up to them no? >> >> I don't mind making the changes, just trying to understand the reasoning >> behind it. >> >> I'll send in a new patch with all the changes after the review on the match.pd >> stuff. > I'm missing an updated patch after my initial review of the match.pd > stuff so not sure what to review. Can you re-post and updated patch? > > Thanks, > Richard. --------------6m50e0NM0J0FxZvWJsFSmz8i Content-Type: text/plain; charset=UTF-8; name="frintnz4.patch" Content-Disposition: attachment; filename="frintnz4.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0Lm1kIGIvZ2NjL2NvbmZp Zy9hYXJjaDY0L2FhcmNoNjQubWQKaW5kZXggM2M3MmJkYWQwMWJmYWI0OWVlNGFlNmZiN2Ix MzkyMDJlODljOGQzNC4uOWQwNGEyZTA4OGNkN2QwMzk2M2I1OGVkMzcwOGMzMzliODQxODAx YyAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQubWQKKysrIGIvZ2Nj L2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQubWQKQEAgLTc0MjMsMTIgKzc0MjMsMTggQEAgKGRl ZmluZV9pbnNuICJkZXNwZWN1bGF0ZV9zaW1wbGV0aSIKICAgIChzZXRfYXR0ciAic3BlY3Vs YXRpb25fYmFycmllciIgInRydWUiKV0KICkKIAorKGRlZmluZV9leHBhbmQgImZ0cnVuYzxt b2RlPjxmcmludG56X21vZGU+MiIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VlNGREYgMCAi cmVnaXN0ZXJfb3BlcmFuZCIgIj13IikKKyAgICAgICAgKHVuc3BlYzpWU0ZERiBbKG1hdGNo X29wZXJhbmQ6VlNGREYgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInciKV0KKwkJICAgICAgRlJJ TlROWikpXQorICAiVEFSR0VUX0ZSSU5UIgorKQorCiAoZGVmaW5lX2luc24gImFhcmNoNjRf PGZyaW50bnpzX29wPjxtb2RlPiIKICAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VlNGREYgMCAi cmVnaXN0ZXJfb3BlcmFuZCIgIj13IikKIAkodW5zcGVjOlZTRkRGIFsobWF0Y2hfb3BlcmFu ZDpWU0ZERiAxICJyZWdpc3Rlcl9vcGVyYW5kIiAidyIpXQogCQkgICAgICBGUklOVE5aWCkp XQotICAiVEFSR0VUX0ZSSU5UICYmIFRBUkdFVF9GTE9BVAotICAgJiYgIShWRUNUT1JfTU9E RV9QICg8TU9ERT5tb2RlKSAmJiAhVEFSR0VUX1NJTUQpIgorICAiVEFSR0VUX0ZSSU5UIgog ICAiPGZyaW50bnpzX29wPlxcdCU8dj4wPFZtdHlwZT4sICU8dj4xPFZtdHlwZT4iCiAgIFso c2V0X2F0dHIgInR5cGUiICJmX3JpbnQ8c3R5cGU+IildCiApCmRpZmYgLS1naXQgYS9nY2Mv Y29uZmlnL2FhcmNoNjQvaXRlcmF0b3JzLm1kIGIvZ2NjL2NvbmZpZy9hYXJjaDY0L2l0ZXJh dG9ycy5tZAppbmRleCA5MTYwY2UzZTY5YzJjNmIxYjc1ZTQ2ZjdhYWJkMjdlNzk0OWEyNjlh Li43OTYyYjE1YTg3ZGIyZjFlZGUzODM2ZWZiYjgyN2I4ZmI5NTI2NmRhIDEwMDY0NAotLS0g YS9nY2MvY29uZmlnL2FhcmNoNjQvaXRlcmF0b3JzLm1kCisrKyBiL2djYy9jb25maWcvYWFy Y2g2NC9pdGVyYXRvcnMubWQKQEAgLTE2Myw3ICsxNjMsMTEgQEAgKGRlZmluZV9tb2RlX2l0 ZXJhdG9yIFZIU0RGX0hTREYgWyhWNEhGICJUQVJHRVRfU0lNRF9GMTZJTlNUIikKIAkJCQkg IFNGIERGXSkKIAogOzsgU2NhbGFyIGFuZCB2ZXRvciBtb2RlcyBmb3IgU0YsIERGLgotKGRl ZmluZV9tb2RlX2l0ZXJhdG9yIFZTRkRGIFtWMlNGIFY0U0YgVjJERiBERiBTRl0pCisoZGVm aW5lX21vZGVfaXRlcmF0b3IgVlNGREYgWyhWMlNGICJUQVJHRVRfU0lNRCIpCisJCQkgICAg IChWNFNGICJUQVJHRVRfU0lNRCIpCisJCQkgICAgIChWMkRGICJUQVJHRVRfU0lNRCIpCisJ CQkgICAgIChERiAiVEFSR0VUX0ZMT0FUIikKKwkJCSAgICAgKFNGICJUQVJHRVRfRkxPQVQi KV0pCiAKIDs7IEFkdmFuY2VkIFNJTUQgc2luZ2xlIEZsb2F0IG1vZGVzLgogKGRlZmluZV9t b2RlX2l0ZXJhdG9yIFZEUVNGIFtWMlNGIFY0U0ZdKQpAQCAtMzA3OCw2ICszMDgyLDggQEAg KGRlZmluZV9pbnRfaXRlcmF0b3IgRkNNTEEgW1VOU1BFQ19GQ01MQQogKGRlZmluZV9pbnRf aXRlcmF0b3IgRlJJTlROWlggW1VOU1BFQ19GUklOVDMyWiBVTlNQRUNfRlJJTlQzMlgKIAkJ CSAgICAgICBVTlNQRUNfRlJJTlQ2NFogVU5TUEVDX0ZSSU5UNjRYXSkKIAorKGRlZmluZV9p bnRfaXRlcmF0b3IgRlJJTlROWiBbVU5TUEVDX0ZSSU5UMzJaIFVOU1BFQ19GUklOVDY0Wl0p CisKIChkZWZpbmVfaW50X2l0ZXJhdG9yIFNWRV9CUktfVU5BUlkgW1VOU1BFQ19CUktBIFVO U1BFQ19CUktCXSkKIAogKGRlZmluZV9pbnRfaXRlcmF0b3IgU1ZFX0JSS19CSU5BUlkgW1VO U1BFQ19CUktOIFVOU1BFQ19CUktQQSBVTlNQRUNfQlJLUEJdKQpAQCAtMzQ4NSw2ICszNDkx LDggQEAgKGRlZmluZV9pbnRfYXR0ciBmMTZtYWMxIFsoVU5TUEVDX0ZNTEFMICJhIikgKFVO U1BFQ19GTUxTTCAicyIpCiAoZGVmaW5lX2ludF9hdHRyIGZyaW50bnpzX29wIFsoVU5TUEVD X0ZSSU5UMzJaICJmcmludDMyeiIpIChVTlNQRUNfRlJJTlQzMlggImZyaW50MzJ4IikKIAkJ CSAgICAgIChVTlNQRUNfRlJJTlQ2NFogImZyaW50NjR6IikgKFVOU1BFQ19GUklOVDY0WCAi ZnJpbnQ2NHgiKV0pCiAKKyhkZWZpbmVfaW50X2F0dHIgZnJpbnRuel9tb2RlIFsoVU5TUEVD X0ZSSU5UMzJaICJzaSIpIChVTlNQRUNfRlJJTlQ2NFogImRpIildKQorCiA7OyBUaGUgY29u ZGl0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBVTlNQRUNfQ09ORF88eHg+LgogKGRlZmluZV9p bnRfYXR0ciBjbXBfb3AgWyhVTlNQRUNfQ09ORF9DTVBFUV9XSURFICJlcSIpCiAJCQkgKFVO U1BFQ19DT05EX0NNUEdFX1dJREUgImdlIikKZGlmZiAtLWdpdCBhL2djYy9kb2MvbWQudGV4 aSBiL2djYy9kb2MvbWQudGV4aQppbmRleCAxOWU4OWFlNTAyYmMyZjUxZGI2NDY2N2IyMzZj MWNiNjY5NzE4YjAyLi4zYjBlNGUwODc1YjQzOTJhYjY4MzM1NjhiMjA3NTgwZWY1OTdhOThm IDEwMDY0NAotLS0gYS9nY2MvZG9jL21kLnRleGkKKysrIGIvZ2NjL2RvYy9tZC50ZXhpCkBA IC02MTkxLDYgKzYxOTEsMTUgQEAgb3BlcmFuZHM7IG90aGVyd2lzZSwgaXQgbWF5IG5vdC4K IAogVGhpcyBwYXR0ZXJuIGlzIG5vdCBhbGxvd2VkIHRvIEBjb2Rle0ZBSUx9LgogCitAY2lu ZGV4IEBjb2Rle2Z0cnVuY0B2YXJ7bX1AdmFye259Mn0gaW5zdHJ1Y3Rpb24gcGF0dGVybgor QGl0ZW0gQHNhbXB7ZnRydW5jQHZhcnttfUB2YXJ7bn0yfQorVHJ1bmNhdGUgb3BlcmFuZCAx IHRvIGEgQHZhcntufSBtb2RlIHNpZ25lZCBpbnRlZ2VyLCB0b3dhcmRzIHplcm8sIGFuZCBz dG9yZQordGhlIHJlc3VsdCBpbiBvcGVyYW5kIDAuIEJvdGggb3BlcmFuZHMgaGF2ZSBtb2Rl IEB2YXJ7bX0sIHdoaWNoIGlzIGEgc2NhbGFyIG9yCit2ZWN0b3IgZmxvYXRpbmctcG9pbnQg bW9kZS4gIEFuIGV4Y2VwdGlvbiBtdXN0IGJlIHJhaXNlZCBpZiBvcGVyYW5kIDEgZG9lcyBu b3QKK2ZpdCBpbiBhIEB2YXJ7bn0gbW9kZSBzaWduZWQgaW50ZWdlciBhcyBpdCB3b3VsZCBo YXZlIGlmIHRoZSB0cnVuY2F0aW9uCitoYXBwZW5lZCB0aHJvdWdoIHNlcGFyYXRlIGZsb2F0 aW5nIHBvaW50IHRvIGludGVnZXIgY29udmVyc2lvbi4KKworCiBAY2luZGV4IEBjb2Rle3Jv dW5kQHZhcnttfTJ9IGluc3RydWN0aW9uIHBhdHRlcm4KIEBpdGVtIEBzYW1we3JvdW5kQHZh cnttfTJ9CiBSb3VuZCBvcGVyYW5kIDEgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciwgcm91bmRp bmcgYXdheSBmcm9tIHplcm8gaW4gdGhlCmRpZmYgLS1naXQgYS9nY2MvZG9jL3NvdXJjZWJ1 aWxkLnRleGkgYi9nY2MvZG9jL3NvdXJjZWJ1aWxkLnRleGkKaW5kZXggNjA5NWEzNWNkNDU2 NWZkYjdkNzU4MTA0ZTgwZmU2NDExMjMwZjc1OC4uYTU2YmJiNzc1NTcyZmE3MjM3OTg1NGY5 MGEwMWFkNTQzNTU3ZTI5YSAxMDA2NDQKLS0tIGEvZ2NjL2RvYy9zb3VyY2VidWlsZC50ZXhp CisrKyBiL2djYy9kb2Mvc291cmNlYnVpbGQudGV4aQpAQCAtMjI4Niw2ICsyMjg2LDEwIEBA IExpa2UgQGNvZGV7YWFyY2g2NF9zdmVfaHd9LCBidXQgYWxzbyB0ZXN0IGZvciBhbiBleGFj dCBoYXJkd2FyZSB2ZWN0b3IgbGVuZ3RoLgogQGl0ZW0gYWFyY2g2NF9mamN2dHpzX2h3CiBB QXJjaDY0IHRhcmdldCB0aGF0IGlzIGFibGUgdG8gZ2VuZXJhdGUgYW5kIGV4ZWN1dGUgYXJt djguMy1hIEZKQ1ZUWlMKIGluc3RydWN0aW9uLgorCitAaXRlbSBhYXJjaDY0X2ZyaW50enhf b2sKK0FBcmNoNjQgdGFyZ2V0IHRoYXQgaXMgYWJsZSB0byBnZW5lcmF0ZSB0aGUgQXJtdjgu NS1hIEZSSU5UMzJaLCBGUklOVDY0WiwKK0ZSSU5UMzJYIGFuZCBGUklOVDY0WCBpbnN0cnVj dGlvbnMuCiBAZW5kIHRhYmxlCiAKIEBzdWJzdWJzZWN0aW9uIE1JUFMtc3BlY2lmaWMgYXR0 cmlidXRlcwpkaWZmIC0tZ2l0IGEvZ2NjL2ludGVybmFsLWZuLmMgYi9nY2MvaW50ZXJuYWwt Zm4uYwppbmRleCBiMjQxMDJhNTk5MGJlYTRjYmIxMDIwNjlmN2E2ZGY0OTdmYzgxZWJmLi45 MDQ3YjQ4NmY0MTk0ODA1OWE3YTdmMWNjYzQwMzI0MTBhMzY5MTM5IDEwMDY0NAotLS0gYS9n Y2MvaW50ZXJuYWwtZm4uYworKysgYi9nY2MvaW50ZXJuYWwtZm4uYwpAQCAtMTMwLDYgKzEz MCw3IEBAIGluaXRfaW50ZXJuYWxfZm5zICgpCiAjZGVmaW5lIGZvbGRfbGVmdF9kaXJlY3Qg eyAxLCAxLCBmYWxzZSB9CiAjZGVmaW5lIG1hc2tfZm9sZF9sZWZ0X2RpcmVjdCB7IDEsIDEs IGZhbHNlIH0KICNkZWZpbmUgY2hlY2tfcHRyc19kaXJlY3QgeyAwLCAwLCBmYWxzZSB9Cisj ZGVmaW5lIGZ0cnVuY19pbnRfZGlyZWN0IHsgMCwgMSwgdHJ1ZSB9CiAKIGNvbnN0IGRpcmVj dF9pbnRlcm5hbF9mbl9pbmZvIGRpcmVjdF9pbnRlcm5hbF9mbl9hcnJheVtJRk5fTEFTVCAr IDFdID0gewogI2RlZmluZSBERUZfSU5URVJOQUxfRk4oQ09ERSwgRkxBR1MsIEZOU1BFQykg bm90X2RpcmVjdCwKQEAgLTE1Niw2ICsxNTcsMjkgQEAgZ2V0X211bHRpX3ZlY3Rvcl9tb3Zl ICh0cmVlIGFycmF5X3R5cGUsIGNvbnZlcnRfb3B0YWIgb3B0YWIpCiAgIHJldHVybiBjb252 ZXJ0X29wdGFiX2hhbmRsZXIgKG9wdGFiLCBpbW9kZSwgdm1vZGUpOwogfQogCisvKiBFeHBh bmQgRlRSVU5DX0lOVCBjYWxsIFNUTVQgdXNpbmcgb3B0YWIgT1BUQUIuICAqLworCitzdGF0 aWMgdm9pZAorZXhwYW5kX2Z0cnVuY19pbnRfb3B0YWJfZm4gKGludGVybmFsX2ZuLCBnY2Fs bCAqc3RtdCwgY29udmVydF9vcHRhYiBvcHRhYikKK3sKKyAgY2xhc3MgZXhwYW5kX29wZXJh bmQgb3BzWzJdOworICB0cmVlIGxocywgZmxvYXRfdHlwZSwgaW50X3R5cGU7CisgIHJ0eCB0 YXJnZXQsIG9wOworCisgIGxocyA9IGdpbXBsZV9jYWxsX2xocyAoc3RtdCk7CisgIHRhcmdl dCA9IGV4cGFuZF9ub3JtYWwgKGxocyk7CisgIG9wID0gZXhwYW5kX25vcm1hbCAoZ2ltcGxl X2NhbGxfYXJnIChzdG10LCAwKSk7CisKKyAgZmxvYXRfdHlwZSA9IFRSRUVfVFlQRSAobGhz KTsKKyAgaW50X3R5cGUgPSBlbGVtZW50X3R5cGUgKGdpbXBsZV9jYWxsX2FyZyAoc3RtdCwg MSkpOworCisgIGNyZWF0ZV9vdXRwdXRfb3BlcmFuZCAoJm9wc1swXSwgdGFyZ2V0LCBUWVBF X01PREUgKGZsb2F0X3R5cGUpKTsKKyAgY3JlYXRlX2lucHV0X29wZXJhbmQgKCZvcHNbMV0s IG9wLCBUWVBFX01PREUgKGZsb2F0X3R5cGUpKTsKKworICBleHBhbmRfaW5zbiAoY29udmVy dF9vcHRhYl9oYW5kbGVyIChvcHRhYiwgVFlQRV9NT0RFIChmbG9hdF90eXBlKSwKKwkJCQkg ICAgICBUWVBFX01PREUgKGludF90eXBlKSksIDIsIG9wcyk7Cit9CisKIC8qIEV4cGFuZCBM T0FEX0xBTkVTIGNhbGwgU1RNVCB1c2luZyBvcHRhYiBPUFRBQi4gICovCiAKIHN0YXRpYyB2 b2lkCkBAIC0zNzQ3LDYgKzM3NzEsMTUgQEAgbXVsdGlfdmVjdG9yX29wdGFiX3N1cHBvcnRl ZF9wIChjb252ZXJ0X29wdGFiIG9wdGFiLCB0cmVlX3BhaXIgdHlwZXMsCiAJICAhPSBDT0RF X0ZPUl9ub3RoaW5nKTsKIH0KIAorc3RhdGljIGJvb2wKK2RpcmVjdF9mdHJ1bmNfaW50X29w dGFiX3N1cHBvcnRlZF9wIChjb252ZXJ0X29wdGFiIG9wdGFiLCB0cmVlX3BhaXIgdHlwZXMs CisJCQkJICAgICBvcHRpbWl6YXRpb25fdHlwZSBvcHRfdHlwZSkKK3sKKyAgcmV0dXJuIChj b252ZXJ0X29wdGFiX2hhbmRsZXIgKG9wdGFiLCBUWVBFX01PREUgKHR5cGVzLmZpcnN0KSwK KwkJCQlUWVBFX01PREUgKGVsZW1lbnRfdHlwZSAodHlwZXMuc2Vjb25kKSksCisJCQkJb3B0 X3R5cGUpICE9IENPREVfRk9SX25vdGhpbmcpOworfQorCiAjZGVmaW5lIGRpcmVjdF91bmFy eV9vcHRhYl9zdXBwb3J0ZWRfcCBkaXJlY3Rfb3B0YWJfc3VwcG9ydGVkX3AKICNkZWZpbmUg ZGlyZWN0X2JpbmFyeV9vcHRhYl9zdXBwb3J0ZWRfcCBkaXJlY3Rfb3B0YWJfc3VwcG9ydGVk X3AKICNkZWZpbmUgZGlyZWN0X3Rlcm5hcnlfb3B0YWJfc3VwcG9ydGVkX3AgZGlyZWN0X29w dGFiX3N1cHBvcnRlZF9wCmRpZmYgLS1naXQgYS9nY2MvaW50ZXJuYWwtZm4uZGVmIGIvZ2Nj L2ludGVybmFsLWZuLmRlZgppbmRleCA4ODkxMDcxYTZhMzYwOTYxNjQzNzMxMDk0Mzc5YjYw N2YzMTdhZjE3Li5hMGZkNzU4MjllOTQyZjUyOWM4NzljNjY5ZTU4YzA5OGI2MmIyNmJhIDEw MDY0NAotLS0gYS9nY2MvaW50ZXJuYWwtZm4uZGVmCisrKyBiL2djYy9pbnRlcm5hbC1mbi5k ZWYKQEAgLTY2LDYgKzY2LDkgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZ SU5HMy4gIElmIG5vdCBzZWUKIAogICAgLSBmb2xkX2xlZnQ6IGZvciBzY2FsYXIgPSBGTiAo c2NhbGFyLCB2ZWN0b3IpLCBrZXllZCBvZmYgdGhlIHZlY3RvciBtb2RlCiAgICAtIGNoZWNr X3B0cnM6IHVzZWQgZm9yIGNoZWNrX3tyYXcsd2FyfV9wdHJzCisgICAtIGZ0cnVuY19pbnQ6 IGEgdW5hcnkgY29udmVyc2lvbiBvcHRhYiB0aGF0IHRha2VzIGFuZCByZXR1cm5zIHZhbHVl cyBvZiB0aGUKKyAgIHNhbWUgbW9kZSwgYnV0IGludGVybmFsbHkgY29udmVydHMgdmlhIGFu b3RoZXIgbW9kZS4gIFRoaXMgc2Vjb25kIG1vZGUgaXMKKyAgIHNwZWNpZmllZCB1c2luZyBh IGR1bW15IGZpbmFsIGZ1bmN0aW9uIGFyZ3VtZW50LgogCiAgICBERUZfSU5URVJOQUxfU0lH TkVEX09QVEFCX0ZOIGRlZmluZXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdGhhdAogICAgbWFw cyB0byBvbmUgb2YgdHdvIG9wdGFicywgZGVwZW5kaW5nIG9uIHRoZSBzaWduZWRuZXNzIG9m IGFuIGlucHV0LgpAQCAtMjc1LDYgKzI3OCw3IEBAIERFRl9JTlRFUk5BTF9GTFRfRkxPQVRO X0ZOIChSSU5ULCBFQ0ZfQ09OU1QsIHJpbnQsIHVuYXJ5KQogREVGX0lOVEVSTkFMX0ZMVF9G TE9BVE5fRk4gKFJPVU5ELCBFQ0ZfQ09OU1QsIHJvdW5kLCB1bmFyeSkKIERFRl9JTlRFUk5B TF9GTFRfRkxPQVROX0ZOIChST1VOREVWRU4sIEVDRl9DT05TVCwgcm91bmRldmVuLCB1bmFy eSkKIERFRl9JTlRFUk5BTF9GTFRfRkxPQVROX0ZOIChUUlVOQywgRUNGX0NPTlNULCBidHJ1 bmMsIHVuYXJ5KQorREVGX0lOVEVSTkFMX09QVEFCX0ZOIChGVFJVTkNfSU5ULCBFQ0ZfQ09O U1QsIGZ0cnVuY2ludCwgZnRydW5jX2ludCkKIAogLyogQmluYXJ5IG1hdGggZnVuY3Rpb25z LiAgKi8KIERFRl9JTlRFUk5BTF9GTFRfRk4gKEFUQU4yLCBFQ0ZfQ09OU1QsIGF0YW4yLCBi aW5hcnkpCmRpZmYgLS1naXQgYS9nY2MvbWF0Y2gucGQgYi9nY2MvbWF0Y2gucGQKaW5kZXgg ODRjOWI5MTgwNDFlZWYzNDA5YmRiMGZiZTA0NTY1YjkwYjI1ZDZlOS4uYTVkODkyYWMxZWJm YWE3YjVkNWZhOTcwYmFhMDRjOGU1YjhhY2IyOCAxMDA2NDQKLS0tIGEvZ2NjL21hdGNoLnBk CisrKyBiL2djYy9tYXRjaC5wZApAQCAtMzc1MSwxMiArMzc1MSwyMSBAQCBERUZJTkVfSU5U X0FORF9GTE9BVF9ST1VORF9GTiAoUklOVCkKICAgIHRyYXBwaW5nIGJlaGF2aW91ciwgc28g cmVxdWlyZSAhZmxhZ190cmFwcGluZ19tYXRoLiAqLwogI2lmIEdJTVBMRQogKHNpbXBsaWZ5 Ci0gICAoZmxvYXQgKGZpeF90cnVuYyBAMCkpCi0gICAoaWYgKCFmbGFnX3RyYXBwaW5nX21h dGgKLQkmJiB0eXBlc19tYXRjaCAodHlwZSwgVFJFRV9UWVBFIChAMCkpCi0JJiYgZGlyZWN0 X2ludGVybmFsX2ZuX3N1cHBvcnRlZF9wIChJRk5fVFJVTkMsIHR5cGUsCi0JCQkJCSAgT1BU SU1JWkVfRk9SX0JPVEgpKQotICAgICAgKElGTl9UUlVOQyBAMCkpKQorICAgKGZsb2F0IChm aXhfdHJ1bmNAMSBAMCkpCisgICAoaWYgKHR5cGVzX21hdGNoICh0eXBlLCBUUkVFX1RZUEUg KEAwKSkpCisgICAgKHdpdGggeworICAgICAgdHJlZSBpbnRfdHlwZSA9IGVsZW1lbnRfdHlw ZSAoQDEpOworICAgICB9CisgICAgIChpZiAoVFlQRV9TSUdOIChUUkVFX1RZUEUgKEAxKSkg PT0gU0lHTkVECisJICAmJiBkaXJlY3RfaW50ZXJuYWxfZm5fc3VwcG9ydGVkX3AgKElGTl9G VFJVTkNfSU5ULCB0eXBlLCBpbnRfdHlwZSwKKwkJCQkJICAgICBPUFRJTUlaRV9GT1JfQk9U SCkpCisgICAgICAoSUZOX0ZUUlVOQ19JTlQgQDAgeworICAgICAgIHdpZGVfaW50X3RvX3Ry ZWUgKGludF90eXBlLCB3aTo6bWF4X3ZhbHVlIChUWVBFX1BSRUNJU0lPTiAoaW50X3R5cGUp LAorCQkJCQkJICBTSUdORUQpKTsgfSkKKyAgICAgIChpZiAoIWZsYWdfdHJhcHBpbmdfbWF0 aAorCSAgICYmIGRpcmVjdF9pbnRlcm5hbF9mbl9zdXBwb3J0ZWRfcCAoSUZOX1RSVU5DLCB0 eXBlLAorCQkJCQkgICAgICBPUFRJTUlaRV9GT1JfQk9USCkpCisgICAgICAgKElGTl9UUlVO QyBAMCkpKSkpKQogI2VuZGlmCiAKIC8qIElmIHdlIGhhdmUgYSBuYXJyb3dpbmcgY29udmVy c2lvbiB0byBhbiBpbnRlZ3JhbCB0eXBlIHRoYXQgaXMgZmVkIGJ5IGEKZGlmZiAtLWdpdCBh L2djYy9vcHRhYnMuZGVmIGIvZ2NjL29wdGFicy5kZWYKaW5kZXggNWZjZjUzODZhMGIzMTEy ZWY5MDA0MDU1YzgyZTE1ZmU0NzY2ODk3MC4uMDRhNGVlODJlMTVmZTdiNTJlNzI2ZjJlZTBi ZjcwNGMzMGFjNDUwZCAxMDA2NDQKLS0tIGEvZ2NjL29wdGFicy5kZWYKKysrIGIvZ2NjL29w dGFicy5kZWYKQEAgLTYzLDYgKzYzLDcgQEAgT1BUQUJfQ1goZnJhY3R1bnNfb3B0YWIsICJm cmFjdHVucyRRJGIkSSRhMiIpCiBPUFRBQl9DTChzYXRmcmFjdF9vcHRhYiwgInNhdGZyYWN0 JGIkUSRhMiIsIFNBVF9GUkFDVCwgInNhdGZyYWN0IiwgZ2VuX3NhdGZyYWN0X2NvbnZfbGli ZnVuYykKIE9QVEFCX0NMKHNhdGZyYWN0dW5zX29wdGFiLCAic2F0ZnJhY3R1bnMkSSRiJFEk YTIiLCBVTlNJR05FRF9TQVRfRlJBQ1QsICJzYXRmcmFjdHVucyIsIGdlbl9zYXRmcmFjdHVu c19jb252X2xpYmZ1bmMpCiAKK09QVEFCX0NEKGZ0cnVuY2ludF9vcHRhYiwgImZ0cnVuYyRh JGIyIikKIE9QVEFCX0NEKHNmaXh0cnVuY19vcHRhYiwgImZpeF90cnVuYyRGJGIkSSRhMiIp CiBPUFRBQl9DRCh1Zml4dHJ1bmNfb3B0YWIsICJmaXh1bnNfdHJ1bmMkRiRiJEkkYTIiKQog CmRpZmYgLS1naXQgYS9nY2Mvc3Rvci1sYXlvdXQuaCBiL2djYy9zdG9yLWxheW91dC5oCmlu ZGV4IGI2N2FiZWJjMDA5NjExMzI3MmJmYjEyMjFlYWJhYWJkMDg2NTdhNTguLmUwMjE5Yzhh ZjQ4NDZlYTBmOTQ3NTg2YjE5MTVkOWQwNmNiNmMxMDcgMTAwNjQ0Ci0tLSBhL2djYy9zdG9y LWxheW91dC5oCisrKyBiL2djYy9zdG9yLWxheW91dC5oCkBAIC0zNiw3ICszNiw2IEBAIGV4 dGVybiB2b2lkIHBsYWNlX2ZpZWxkIChyZWNvcmRfbGF5b3V0X2luZm8sIHRyZWUpOwogZXh0 ZXJuIHZvaWQgY29tcHV0ZV9yZWNvcmRfbW9kZSAodHJlZSk7CiBleHRlcm4gdm9pZCBmaW5p c2hfYml0ZmllbGRfbGF5b3V0ICh0cmVlKTsKIGV4dGVybiB2b2lkIGZpbmlzaF9yZWNvcmRf bGF5b3V0IChyZWNvcmRfbGF5b3V0X2luZm8sIGludCk7Ci1leHRlcm4gdW5zaWduZWQgaW50 IGVsZW1lbnRfcHJlY2lzaW9uIChjb25zdF90cmVlKTsKIGV4dGVybiB2b2lkIGZpbmFsaXpl X3NpemVfZnVuY3Rpb25zICh2b2lkKTsKIGV4dGVybiB2b2lkIGZpeHVwX3Vuc2lnbmVkX3R5 cGUgKHRyZWUpOwogZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9zaXpldHlwZXMgKHZvaWQpOwpk aWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQvZnJpbnRuei5j IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FhcmNoNjQvZnJpbnRuei5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAuLjAwOGUxY2Y5ZjRhMWIwMTQ4MTI4YzY1YzllYTBkMWJiMTExNDY3YjcKLS0tIC9k ZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYWFyY2g2NC9mcmludG56 LmMKQEAgLTAsMCArMSw5MSBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGct b3B0aW9ucyAiLU8yIC1tYXJjaD1hcm12OC41LWEiIH0gKi8KKy8qIHsgZGctcmVxdWlyZS1l ZmZlY3RpdmUtdGFyZ2V0IGFhcmNoNjRfZnJpbnRuenhfb2sgfSAqLworLyogeyBkZy1maW5h bCB7IGNoZWNrLWZ1bmN0aW9uLWJvZGllcyAiKioiICIiIH0gfSAqLworCisvKgorKiogZjE6 CisqKglmcmludDMyeglzMCwgczAKKyoqCXJldAorKi8KK2Zsb2F0CitmMSAoZmxvYXQgeCkK K3sKKyAgaW50IHkgPSB4OworICByZXR1cm4gKGZsb2F0KSB5OworfQorCisvKgorKiogZjI6 CisqKglmcmludDY0eglzMCwgczAKKyoqCXJldAorKi8KK2Zsb2F0CitmMiAoZmxvYXQgeCkK K3sKKyAgbG9uZyBsb25nIGludCB5ID0geDsKKyAgcmV0dXJuIChmbG9hdCkgeTsKK30KKwor LyoKKyoqIGYzOgorKioJZnJpbnQzMnoJZDAsIGQwCisqKglyZXQKKyovCitkb3VibGUKK2Yz IChkb3VibGUgeCkKK3sKKyAgaW50IHkgPSB4OworICByZXR1cm4gKGRvdWJsZSkgeTsKK30K KworLyoKKyoqIGY0OgorKioJZnJpbnQ2NHoJZDAsIGQwCisqKglyZXQKKyovCitkb3VibGUK K2Y0IChkb3VibGUgeCkKK3sKKyAgbG9uZyBsb25nIGludCB5ID0geDsKKyAgcmV0dXJuIChk b3VibGUpIHk7Cit9CisKK2Zsb2F0CitmMV9kb250IChmbG9hdCB4KQoreworICB1bnNpZ25l ZCBpbnQgeSA9IHg7CisgIHJldHVybiAoZmxvYXQpIHk7Cit9CisKK2Zsb2F0CitmMl9kb250 IChmbG9hdCB4KQoreworICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHkgPSB4OworICByZXR1 cm4gKGZsb2F0KSB5OworfQorCitkb3VibGUKK2YzX2RvbnQgKGRvdWJsZSB4KQoreworICB1 bnNpZ25lZCBpbnQgeSA9IHg7CisgIHJldHVybiAoZG91YmxlKSB5OworfQorCitkb3VibGUK K2Y0X2RvbnQgKGRvdWJsZSB4KQoreworICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHkgPSB4 OworICByZXR1cm4gKGRvdWJsZSkgeTsKK30KKworZG91YmxlCitmNV9kb250IChkb3VibGUg eCkKK3sKKyAgc2lnbmVkIHNob3J0IHkgPSB4OworICByZXR1cm4gKGRvdWJsZSkgeTsKK30K KworLyogTWFrZSBzdXJlIHRoZSAnZG9udCdzIGRvbid0IGdlbmVyYXRlIGFueSBmcmludE56 LiAgKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7ZnJpbnQzMnp9 IDIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge2ZyaW50 NjR6fSAyIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2Fh cmNoNjQvZnJpbnRuel92ZWMuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hYXJjaDY0 L2ZyaW50bnpfdmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODAxZDY1ZWE4MzI1Y2I2ODA2OTEyODZh YWI0Mjc0N2Y0M2I5MDY4NwotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9hYXJjaDY0L2ZyaW50bnpfdmVjLmMKQEAgLTAsMCArMSw0NyBAQAorLyogeyBk Zy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8zIC1tYXJjaD1hcm12OC41 LWEiIH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFhcmNoNjRfZnJp bnRuenhfb2sgfSAqLworLyogeyBkZy1maW5hbCB7IGNoZWNrLWZ1bmN0aW9uLWJvZGllcyAi KioiICIiIH0gfSAqLworCisjZGVmaW5lIFRFU1QobmFtZSxmbG9hdF90eXBlLGludF90eXBl KQkJCQkJXAordm9pZAkJCQkJCQkJCVwKK25hbWUgKGZsb2F0X3R5cGUgKiBfX3Jlc3RyaWN0 X18geCwgZmxvYXRfdHlwZSAqIF9fcmVzdHJpY3RfXyB5LCBpbnQgbikgIFwKK3sJCQkJCQkJ CQlcCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQkJCQkJICAgICAgXAorICAgIHsJ CQkJCQkJCSAgICAgIFwKKyAgICAgIGludF90eXBlIHhfaSA9IHhbaV07CQkJCQkgICAgICBc CisgICAgICB5W2ldID0gKGZsb2F0X3R5cGUpIHhfaTsJCQkJCSAgICAgIFwKKyAgICB9CQkJ CQkJCQkgICAgICBcCit9CisKKy8qCisqKiBmMToKKyoqCS4uLgorKioJZnJpbnQzMnoJdlsw LTldK1wuNHMsIHZbMC05XStcLjRzCisqKgkuLi4KKyovCitURVNUKGYxLCBmbG9hdCwgaW50 KQorCisvKgorKiogZjI6CisqKgkuLi4KKyoqCWZyaW50NjR6CXZbMC05XStcLjRzLCB2WzAt OV0rXC40cworKioJLi4uCisqLworVEVTVChmMiwgZmxvYXQsIGxvbmcgbG9uZykKKworLyoK KyoqIGYzOgorKioJLi4uCisqKglmcmludDMyegl2WzAtOV0rXC4yZCwgdlswLTldK1wuMmQK KyoqCS4uLgorKi8KK1RFU1QoZjMsIGRvdWJsZSwgaW50KQorCisvKgorKiogZjQ6CisqKgku Li4KKyoqCWZyaW50NjR6CXZbMC05XStcLjJkLCB2WzAtOV0rXC4yZAorKioJLi4uCisqLwor VEVTVChmNCwgZG91YmxlLCBsb25nIGxvbmcpCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvYWFyY2g2NC9tZXJnZV90cnVuYzEuYyBiL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9hYXJjaDY0L21lcmdlX3RydW5jMS5jCmluZGV4IDA3MjE3MDY0ZTJiYTU0ZmNm NGY1ZWRjNDQwZTZlYzE5ZGRhZTY2ZTEuLjNkODA4NzFjNGNlYmQ1ZmI1Y2FjMDcxNGIzZmVl ZTI3MDM4ZjA1ZmQgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hYXJj aDY0L21lcmdlX3RydW5jMS5jCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hYXJj aDY0L21lcmdlX3RydW5jMS5jCkBAIC0xLDUgKzEsNiBAQAogLyogeyBkZy1kbyBjb21waWxl IH0gKi8KIC8qIHsgZGctb3B0aW9ucyAiLU8yIC1mZmFzdC1tYXRoIiB9ICovCisvKiB7IGRn LXNraXAtaWYgIiIgeyBhYXJjaDY0X2ZyaW50bnp4X29rIH0gfSAqLwogCiBmbG9hdAogZjEg KGZsb2F0IHgpCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2xpYi90YXJnZXQtc3VwcG9y dHMuZXhwIGIvZ2NjL3Rlc3RzdWl0ZS9saWIvdGFyZ2V0LXN1cHBvcnRzLmV4cAppbmRleCBj MWFkOTdjNmJkMjBkNmU5NzBlZGIyNGExMjU0NTE1ODBmMDE0ZDU1Li41NzU4ZTljZWU0NDE2 YjYwYjY3NjZlY2IzN2NiZjNiMzdhYzk4NTIyIDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRl L2xpYi90YXJnZXQtc3VwcG9ydHMuZXhwCisrKyBiL2djYy90ZXN0c3VpdGUvbGliL3Rhcmdl dC1zdXBwb3J0cy5leHAKQEAgLTExMzk5LDYgKzExMzk5LDMyIEBAIHByb2MgY2hlY2tfZWZm ZWN0aXZlX3RhcmdldF9hcm1fdjhfM2FfYmtleV9kaXJlY3RpdmUgeyB9IHsKIAl9XQogfQog CisjIFJldHVybiAxIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgQXJtdjguNS1BIHNjYWxhciBh bmQgQWR2YW5jZWQgU0lNRAorIyBGUklOVDMyW1pYXSBhbmRkIEZSSU5UNjRbWlhdIGluc3Ry dWN0aW9ucywgMCBvdGhlcndpc2UuIFRoZSB0ZXN0IGlzIHZhbGlkIGZvcgorIyBBQXJjaDY0 LgorcHJvYyBjaGVja19lZmZlY3RpdmVfdGFyZ2V0X2FhcmNoNjRfZnJpbnRuenhfb2tfbm9j YWNoZSB7IH0geworCisgICAgaWYgeyAhW2lzdGFyZ2V0IGFhcmNoNjQqLSotKl0gfSB7Cisg ICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIHsgW2NoZWNrX25vX2NvbXBpbGVy X21lc3NhZ2VzX25vY2FjaGUgXAorCSAgICAgIGFhcmNoNjRfZnJpbnRuenhfb2sgYXNzZW1i bHkgeworCSNpZiAhZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9GUklOVCkKKwkjZXJyb3IgIl9f QVJNX0ZFQVRVUkVfRlJJTlQgbm90IGRlZmluZWQiCisJI2VuZGlmCisgICAgfSBbY3VycmVu dF9jb21waWxlcl9mbGFnc11dIH0geworCXJldHVybiAxOworICAgIH0KKworICAgIHJldHVy biAwOworfQorCitwcm9jIGNoZWNrX2VmZmVjdGl2ZV90YXJnZXRfYWFyY2g2NF9mcmludG56 eF9vayB7IH0geworICAgIHJldHVybiBbY2hlY2tfY2FjaGVkX2VmZmVjdGl2ZV90YXJnZXQg YWFyY2g2NF9mcmludG56eF9vayBcCisgICAgICAgICAgICAgICAgY2hlY2tfZWZmZWN0aXZl X3RhcmdldF9hYXJjaDY0X2ZyaW50bnp4X29rX25vY2FjaGVdIAorfQorCiAjIFJldHVybiAx IGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgZXhlY3V0aW5nIHRoZSBBcm12OC4xLU0gTWFpbmxp bmUgTG93CiAjIE92ZXJoZWFkIExvb3AsIDAgb3RoZXJ3aXNlLiAgVGhlIHRlc3QgaXMgdmFs aWQgZm9yIEFSTS4KIApkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUtdmVjdC1zdG10cy5jIGIvZ2Nj L3RyZWUtdmVjdC1zdG10cy5jCmluZGV4IGYyNjI1YTJmZjQwODk3MzkzMjZjZTExNzg1ZjFi Njg2NzhjMDdmMGUuLjQzNWYyZjRmNWFlYjJlZDRjNTAzYzdiNmE5N2QzNzU2MzRhZTQ1MTQg MTAwNjQ0Ci0tLSBhL2djYy90cmVlLXZlY3Qtc3RtdHMuYworKysgYi9nY2MvdHJlZS12ZWN0 LXN0bXRzLmMKQEAgLTE2MjUsNyArMTYyNSw4IEBAIHZlY3RfZmluaXNoX3N0bXRfZ2VuZXJh dGlvbiAodmVjX2luZm8gKnZpbmZvLAogCiBzdGF0aWMgaW50ZXJuYWxfZm4KIHZlY3Rvcml6 YWJsZV9pbnRlcm5hbF9mdW5jdGlvbiAoY29tYmluZWRfZm4gY2ZuLCB0cmVlIGZuZGVjbCwK LQkJCQl0cmVlIHZlY3R5cGVfb3V0LCB0cmVlIHZlY3R5cGVfaW4pCisJCQkJdHJlZSB2ZWN0 eXBlX291dCwgdHJlZSB2ZWN0eXBlX2luLAorCQkJCXRyZWUgKnZlY3R5cGVzKQogewogICBp bnRlcm5hbF9mbiBpZm47CiAgIGlmIChpbnRlcm5hbF9mbl9wIChjZm4pKQpAQCAtMTYzNyw4 ICsxNjM4LDEyIEBAIHZlY3Rvcml6YWJsZV9pbnRlcm5hbF9mdW5jdGlvbiAoY29tYmluZWRf Zm4gY2ZuLCB0cmVlIGZuZGVjbCwKICAgICAgIGNvbnN0IGRpcmVjdF9pbnRlcm5hbF9mbl9p bmZvICZpbmZvID0gZGlyZWN0X2ludGVybmFsX2ZuIChpZm4pOwogICAgICAgaWYgKGluZm8u dmVjdG9yaXphYmxlKQogCXsKLQkgIHRyZWUgdHlwZTAgPSAoaW5mby50eXBlMCA8IDAgPyB2 ZWN0eXBlX291dCA6IHZlY3R5cGVfaW4pOwotCSAgdHJlZSB0eXBlMSA9IChpbmZvLnR5cGUx IDwgMCA/IHZlY3R5cGVfb3V0IDogdmVjdHlwZV9pbik7CisJICB0cmVlIHR5cGUwID0gKGlu Zm8udHlwZTAgPCAwID8gdmVjdHlwZV9vdXQgOiB2ZWN0eXBlc1tpbmZvLnR5cGUwXSk7CisJ ICBpZiAoIXR5cGUwKQorCSAgICB0eXBlMCA9IHZlY3R5cGVfaW47CisJICB0cmVlIHR5cGUx ID0gKGluZm8udHlwZTEgPCAwID8gdmVjdHlwZV9vdXQgOiB2ZWN0eXBlc1tpbmZvLnR5cGUx XSk7CisJICBpZiAoIXR5cGUxKQorCSAgICB0eXBlMSA9IHZlY3R5cGVfaW47CiAJICBpZiAo ZGlyZWN0X2ludGVybmFsX2ZuX3N1cHBvcnRlZF9wIChpZm4sIHRyZWVfcGFpciAodHlwZTAs IHR5cGUxKSwKIAkJCQkJICAgICAgT1BUSU1JWkVfRk9SX1NQRUVEKSkKIAkgICAgcmV0dXJu IGlmbjsKQEAgLTMyNjMsMTggKzMyNjgsNDAgQEAgdmVjdG9yaXphYmxlX2NhbGwgKHZlY19p bmZvICp2aW5mbywKICAgICAgIHJoc190eXBlID0gdW5zaWduZWRfdHlwZV9ub2RlOwogICAg IH0KIAotICBpbnQgbWFza19vcG5vID0gLTE7CisgIC8qIFRoZSBhcmd1bWVudCB0aGF0IGlz IG5vdCBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvdGhlcnMuICAqLworICBpbnQgZGlmZl9v cG5vID0gLTE7CisgIGJvb2wgbWFza2VkID0gZmFsc2U7CiAgIGlmIChpbnRlcm5hbF9mbl9w IChjZm4pKQotICAgIG1hc2tfb3BubyA9IGludGVybmFsX2ZuX21hc2tfaW5kZXggKGFzX2lu dGVybmFsX2ZuIChjZm4pKTsKKyAgICB7CisgICAgICBpZiAoY2ZuID09IENGTl9GVFJVTkNf SU5UKQorCS8qIEZvciBGVFJVTkMgdGhpcyByZXByZXNlbnRzIHRoZSBhcmd1bWVudCB0aGF0 IGNhcnJpZXMgdGhlIHR5cGUgb2YgdGhlCisJICAgaW50ZXJtZWRpYXRlIHNpZ25lZCBpbnRl Z2VyLiAgKi8KKwlkaWZmX29wbm8gPSAxOworICAgICAgZWxzZQorCXsKKwkgIC8qIEZvciBt YXNrZWQgb3BlcmF0aW9ucyB0aGlzIHJlcHJlc2VudHMgdGhlIGFyZ3VtZW50IHRoYXQgY2Fy cmllcyB0aGUKKwkgICAgIG1hc2suICAqLworCSAgZGlmZl9vcG5vID0gaW50ZXJuYWxfZm5f bWFza19pbmRleCAoYXNfaW50ZXJuYWxfZm4gKGNmbikpOworCSAgbWFza2VkID0gZGlmZl9v cG5vID49ICAwOworCX0KKyAgICB9CiAKICAgZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKysp CiAgICAgewotICAgICAgaWYgKChpbnQpIGkgPT0gbWFza19vcG5vKQorICAgICAgaWYgKChp bnQpIGkgPT0gZGlmZl9vcG5vKQogCXsKLQkgIGlmICghdmVjdF9jaGVja19zY2FsYXJfbWFz ayAodmluZm8sIHN0bXRfaW5mbywgc2xwX25vZGUsIG1hc2tfb3BubywKLQkJCQkgICAgICAg Jm9wLCAmc2xwX29wW2ldLCAmZHRbaV0sICZ2ZWN0eXBlc1tpXSkpCi0JICAgIHJldHVybiBm YWxzZTsKLQkgIGNvbnRpbnVlOworCSAgaWYgKG1hc2tlZCkKKwkgICAgeworCSAgICAgIGlm ICghdmVjdF9jaGVja19zY2FsYXJfbWFzayAodmluZm8sIHN0bXRfaW5mbywgc2xwX25vZGUs CisJCQkJCSAgIGRpZmZfb3BubywgJm9wLCAmc2xwX29wW2ldLCAmZHRbaV0sCisJCQkJCSAg ICZ2ZWN0eXBlc1tpXSkpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgZWxzZQorCSAg ICB7CisJICAgICAgdmVjdHlwZXNbaV0gPSBUUkVFX1RZUEUgKGdpbXBsZV9jYWxsX2FyZyAo c3RtdCwgaSkpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CiAJfQogCiAgICAgICBpZiAo IXZlY3RfaXNfc2ltcGxlX3VzZSAodmluZm8sIHN0bXRfaW5mbywgc2xwX25vZGUsCkBAIC0z Mjg2LDI3ICszMzEzLDMwIEBAIHZlY3Rvcml6YWJsZV9jYWxsICh2ZWNfaW5mbyAqdmluZm8s CiAJICByZXR1cm4gZmFsc2U7CiAJfQogCi0gICAgICAvKiBXZSBjYW4gb25seSBoYW5kbGUg Y2FsbHMgd2l0aCBhcmd1bWVudHMgb2YgdGhlIHNhbWUgdHlwZS4gICovCi0gICAgICBpZiAo cmhzX3R5cGUKLQkgICYmICF0eXBlc19jb21wYXRpYmxlX3AgKHJoc190eXBlLCBUUkVFX1RZ UEUgKG9wKSkpCisgICAgICBpZiAoKGludCkgaSAhPSBkaWZmX29wbm8pCiAJewotCSAgaWYg KGR1bXBfZW5hYmxlZF9wICgpKQotCSAgICBkdW1wX3ByaW50Zl9sb2MgKE1TR19NSVNTRURf T1BUSU1JWkFUSU9OLCB2ZWN0X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAiYXJndW1lbnQgdHlwZXMgZGlmZmVyLlxuIik7Ci0JICByZXR1cm4gZmFsc2U7Ci0J fQotICAgICAgaWYgKCFyaHNfdHlwZSkKLQlyaHNfdHlwZSA9IFRSRUVfVFlQRSAob3ApOwor CSAgLyogV2UgY2FuIG9ubHkgaGFuZGxlIGNhbGxzIHdpdGggYXJndW1lbnRzIG9mIHRoZSBz YW1lIHR5cGUuICAqLworCSAgaWYgKHJoc190eXBlCisJICAgICAgJiYgIXR5cGVzX2NvbXBh dGlibGVfcCAocmhzX3R5cGUsIFRSRUVfVFlQRSAob3ApKSkKKwkgICAgeworCSAgICAgIGlm IChkdW1wX2VuYWJsZWRfcCAoKSkKKwkJZHVtcF9wcmludGZfbG9jIChNU0dfTUlTU0VEX09Q VElNSVpBVElPTiwgdmVjdF9sb2NhdGlvbiwKKwkJCQkgImFyZ3VtZW50IHR5cGVzIGRpZmZl ci5cbiIpOworCSAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgaWYgKCFyaHNfdHlw ZSkKKwkgICAgcmhzX3R5cGUgPSBUUkVFX1RZUEUgKG9wKTsKIAotICAgICAgaWYgKCF2ZWN0 eXBlX2luKQotCXZlY3R5cGVfaW4gPSB2ZWN0eXBlc1tpXTsKLSAgICAgIGVsc2UgaWYgKHZl Y3R5cGVzW2ldCi0JICAgICAgICYmICF0eXBlc19jb21wYXRpYmxlX3AgKHZlY3R5cGVzW2ld LCB2ZWN0eXBlX2luKSkKLQl7Ci0JICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCi0JICAgIGR1 bXBfcHJpbnRmX2xvYyAoTVNHX01JU1NFRF9PUFRJTUlaQVRJT04sIHZlY3RfbG9jYXRpb24s Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCB2ZWN0b3IgdHlwZXMg ZGlmZmVyLlxuIik7Ci0JICByZXR1cm4gZmFsc2U7CisJICBpZiAoIXZlY3R5cGVfaW4pCisJ ICAgIHZlY3R5cGVfaW4gPSB2ZWN0eXBlc1tpXTsKKwkgIGVsc2UgaWYgKHZlY3R5cGVzW2ld CisJCSAgICYmICF0eXBlc19jb21wYXRpYmxlX3AgKHZlY3R5cGVzW2ldLCB2ZWN0eXBlX2lu KSkKKwkgICAgeworCSAgICAgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKKwkJZHVtcF9wcmlu dGZfbG9jIChNU0dfTUlTU0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2NhdGlvbiwKKwkJCQkg ImFyZ3VtZW50IHZlY3RvciB0eXBlcyBkaWZmZXIuXG4iKTsKKwkgICAgICByZXR1cm4gZmFs c2U7CisJICAgIH0KIAl9CiAgICAgfQogICAvKiBJZiBhbGwgYXJndW1lbnRzIGFyZSBleHRl cm5hbCBvciBjb25zdGFudCBkZWZzLCBpbmZlciB0aGUgdmVjdG9yIHR5cGUKQEAgLTMzODIs OCArMzQxMiw4IEBAIHZlY3Rvcml6YWJsZV9jYWxsICh2ZWNfaW5mbyAqdmluZm8sCiAJICB8 fCAobW9kaWZpZXIgPT0gTkFSUk9XCiAJICAgICAgJiYgc2ltcGxlX2ludGVnZXJfbmFycm93 aW5nICh2ZWN0eXBlX291dCwgdmVjdHlwZV9pbiwKIAkJCQkJICAgJmNvbnZlcnRfY29kZSkp KSkKLSAgICBpZm4gPSB2ZWN0b3JpemFibGVfaW50ZXJuYWxfZnVuY3Rpb24gKGNmbiwgY2Fs bGVlLCB2ZWN0eXBlX291dCwKLQkJCQkJICB2ZWN0eXBlX2luKTsKKyAgICBpZm4gPSB2ZWN0 b3JpemFibGVfaW50ZXJuYWxfZnVuY3Rpb24gKGNmbiwgY2FsbGVlLCB2ZWN0eXBlX291dCwg dmVjdHlwZV9pbiwKKwkJCQkJICAmdmVjdHlwZXNbMF0pOwogCiAgIC8qIElmIHRoYXQgZmFp bHMsIHRyeSBhc2tpbmcgZm9yIGEgdGFyZ2V0LXNwZWNpZmljIGJ1aWx0LWluIGZ1bmN0aW9u LiAgKi8KICAgaWYgKGlmbiA9PSBJRk5fTEFTVCkKQEAgLTM0NjEsNyArMzQ5MSw3IEBAIHZl Y3Rvcml6YWJsZV9jYWxsICh2ZWNfaW5mbyAqdmluZm8sCiAKICAgICAgIGlmIChsb29wX3Zp bmZvCiAJICAmJiBMT09QX1ZJTkZPX0NBTl9VU0VfUEFSVElBTF9WRUNUT1JTX1AgKGxvb3Bf dmluZm8pCi0JICAmJiAocmVkdWNfaWR4ID49IDAgfHwgbWFza19vcG5vID49IDApKQorCSAg JiYgKHJlZHVjX2lkeCA+PSAwIHx8IG1hc2tlZCkpCiAJewogCSAgaWYgKHJlZHVjX2lkeCA+ PSAwCiAJICAgICAgJiYgKGNvbmRfZm4gPT0gSUZOX0xBU1QKQEAgLTM0ODEsOCArMzUxMSw4 IEBAIHZlY3Rvcml6YWJsZV9jYWxsICh2ZWNfaW5mbyAqdmluZm8sCiAJCSAgID8gU0xQX1RS RUVfTlVNQkVSX09GX1ZFQ19TVE1UUyAoc2xwX25vZGUpCiAJCSAgIDogbmNvcGllcyk7CiAJ ICAgICAgdHJlZSBzY2FsYXJfbWFzayA9IE5VTExfVFJFRTsKLQkgICAgICBpZiAobWFza19v cG5vID49IDApCi0JCXNjYWxhcl9tYXNrID0gZ2ltcGxlX2NhbGxfYXJnIChzdG10X2luZm8t PnN0bXQsIG1hc2tfb3Bubyk7CisJICAgICAgaWYgKG1hc2tlZCkKKwkJc2NhbGFyX21hc2sg PSBnaW1wbGVfY2FsbF9hcmcgKHN0bXRfaW5mby0+c3RtdCwgZGlmZl9vcG5vKTsKIAkgICAg ICB2ZWN0X3JlY29yZF9sb29wX21hc2sgKGxvb3BfdmluZm8sIG1hc2tzLCBudmVjdG9ycywK IAkJCQkgICAgIHZlY3R5cGVfb3V0LCBzY2FsYXJfbWFzayk7CiAJICAgIH0KQEAgLTM1NDcs NyArMzU3Nyw3IEBAIHZlY3Rvcml6YWJsZV9jYWxsICh2ZWNfaW5mbyAqdmluZm8sCiAJCSAg ICB7CiAJCSAgICAgIC8qIFdlIGRvbid0IGRlZmluZSBhbnkgbmFycm93aW5nIGNvbmRpdGlv bmFsIGZ1bmN0aW9ucwogCQkJIGF0IHByZXNlbnQuICAqLwotCQkgICAgICBnY2NfYXNzZXJ0 IChtYXNrX29wbm8gPCAwKTsKKwkJICAgICAgZ2NjX2Fzc2VydCAoIW1hc2tlZCk7CiAJCSAg ICAgIHRyZWUgaGFsZl9yZXMgPSBtYWtlX3NzYV9uYW1lICh2ZWN0eXBlX2luKTsKIAkJICAg ICAgZ2NhbGwgKmNhbGwKIAkJCT0gZ2ltcGxlX2J1aWxkX2NhbGxfaW50ZXJuYWxfdmVjIChp Zm4sIHZhcmdzKTsKQEAgLTM1NjcsMTYgKzM1OTcsMTYgQEAgdmVjdG9yaXphYmxlX2NhbGwg KHZlY19pbmZvICp2aW5mbywKIAkJICAgIH0KIAkJICBlbHNlCiAJCSAgICB7Ci0JCSAgICAg IGlmIChtYXNrX29wbm8gPj0gMCAmJiBtYXNrZWRfbG9vcF9wKQorCQkgICAgICBpZiAobWFz a2VkICYmIG1hc2tlZF9sb29wX3ApCiAJCQl7CiAJCQkgIHVuc2lnbmVkIGludCB2ZWNfbnVt ID0gdmVjX29wcm5kczAubGVuZ3RoICgpOwogCQkJICAvKiBBbHdheXMgdHJ1ZSBmb3IgU0xQ LiAgKi8KIAkJCSAgZ2NjX2Fzc2VydCAobmNvcGllcyA9PSAxKTsKIAkJCSAgdHJlZSBtYXNr ID0gdmVjdF9nZXRfbG9vcF9tYXNrIChnc2ksIG1hc2tzLCB2ZWNfbnVtLAogCQkJCQkJCSAg dmVjdHlwZV9vdXQsIGkpOwotCQkJICB2YXJnc1ttYXNrX29wbm9dID0gcHJlcGFyZV92ZWNf bWFzaworCQkJICB2YXJnc1tkaWZmX29wbm9dID0gcHJlcGFyZV92ZWNfbWFzawogCQkJICAg IChsb29wX3ZpbmZvLCBUUkVFX1RZUEUgKG1hc2spLCBtYXNrLAotCQkJICAgICB2YXJnc1tt YXNrX29wbm9dLCBnc2kpOworCQkJICAgICB2YXJnc1tkaWZmX29wbm9dLCBnc2kpOwogCQkJ fQogCiAJCSAgICAgIGdjYWxsICpjYWxsOwpAQCAtMzYxNCwxMyArMzY0NCwxMyBAQCB2ZWN0 b3JpemFibGVfY2FsbCAodmVjX2luZm8gKnZpbmZvLAogCSAgaWYgKG1hc2tlZF9sb29wX3Ag JiYgcmVkdWNfaWR4ID49IDApCiAJICAgIHZhcmdzW3ZhcmcrK10gPSB2YXJnc1tyZWR1Y19p ZHggKyAxXTsKIAotCSAgaWYgKG1hc2tfb3BubyA+PSAwICYmIG1hc2tlZF9sb29wX3ApCisJ ICBpZiAobWFza2VkICYmIG1hc2tlZF9sb29wX3ApCiAJICAgIHsKIAkgICAgICB0cmVlIG1h c2sgPSB2ZWN0X2dldF9sb29wX21hc2sgKGdzaSwgbWFza3MsIG5jb3BpZXMsCiAJCQkJCSAg ICAgIHZlY3R5cGVfb3V0LCBqKTsKLQkgICAgICB2YXJnc1ttYXNrX29wbm9dCisJICAgICAg dmFyZ3NbZGlmZl9vcG5vXQogCQk9IHByZXBhcmVfdmVjX21hc2sgKGxvb3BfdmluZm8sIFRS RUVfVFlQRSAobWFzayksIG1hc2ssCi0JCQkJICAgIHZhcmdzW21hc2tfb3Bub10sIGdzaSk7 CisJCQkJICAgIHZhcmdzW2RpZmZfb3Bub10sIGdzaSk7CiAJICAgIH0KIAogCSAgZ2ltcGxl ICpuZXdfc3RtdDsKQEAgLTM2MzksNyArMzY2OSw3IEBAIHZlY3Rvcml6YWJsZV9jYWxsICh2 ZWNfaW5mbyAqdmluZm8sCiAJICAgIHsKIAkgICAgICAvKiBXZSBkb24ndCBkZWZpbmUgYW55 IG5hcnJvd2luZyBjb25kaXRpb25hbCBmdW5jdGlvbnMgYXQKIAkJIHByZXNlbnQuICAqLwot CSAgICAgIGdjY19hc3NlcnQgKG1hc2tfb3BubyA8IDApOworCSAgICAgIGdjY19hc3NlcnQg KCFtYXNrZWQpOwogCSAgICAgIHRyZWUgaGFsZl9yZXMgPSBtYWtlX3NzYV9uYW1lICh2ZWN0 eXBlX2luKTsKIAkgICAgICBnY2FsbCAqY2FsbCA9IGdpbXBsZV9idWlsZF9jYWxsX2ludGVy bmFsX3ZlYyAoaWZuLCB2YXJncyk7CiAJICAgICAgZ2ltcGxlX2NhbGxfc2V0X2xocyAoY2Fs bCwgaGFsZl9yZXMpOwpAQCAtMzY4Myw3ICszNzEzLDcgQEAgdmVjdG9yaXphYmxlX2NhbGwg KHZlY19pbmZvICp2aW5mbywKICAgICB7CiAgICAgICBhdXRvX3ZlYzx2ZWM8dHJlZT4gPiB2 ZWNfZGVmcyAobmFyZ3MpOwogICAgICAgLyogV2UgZG9uJ3QgZGVmaW5lIGFueSBuYXJyb3dp bmcgY29uZGl0aW9uYWwgZnVuY3Rpb25zIGF0IHByZXNlbnQuICAqLwotICAgICAgZ2NjX2Fz c2VydCAobWFza19vcG5vIDwgMCk7CisgICAgICBnY2NfYXNzZXJ0ICghbWFza2VkKTsKICAg ICAgIGZvciAoaiA9IDA7IGogPCBuY29waWVzOyArK2opCiAJewogCSAgLyogQnVpbGQgYXJn dW1lbnQgbGlzdCBmb3IgdGhlIHZlY3Rvcml6ZWQgY2FsbC4gICovCmRpZmYgLS1naXQgYS9n Y2MvdHJlZS5oIGIvZ2NjL3RyZWUuaAppbmRleCAzMTgwMTljNGRjNTM3MzI3MTU1MWY1ZDlh NDhkYWRiNTdhMjlkNGE3Li43NzBkMGRkZmNjOWE3YWNkYTAxZWQyZmFmYTYxZWFiMGYxYmE0 Y2ZhIDEwMDY0NAotLS0gYS9nY2MvdHJlZS5oCisrKyBiL2djYy90cmVlLmgKQEAgLTY1NTgs NCArNjU1OCwxMiBAQCBleHRlcm4gdW5zaWduZWQgZm5kZWNsX2RlYWxsb2NfYXJnbm8gKHRy ZWUpOwogICAgb2JqZWN0IG9yIHBvaW50ZXIuICBPdGhlcndpc2UgcmV0dXJuIG51bGwuICAq LwogZXh0ZXJuIHRyZWUgZ2V0X2F0dHJfbm9uc3RyaW5nX2RlY2wgKHRyZWUsIHRyZWUgKiA9 IE5VTEwpOwogCisvKiBSZXR1cm4gdGhlIHR5cGUsIG9yIGZvciBhIGNvbXBsZXggb3IgdmVj dG9yIHR5cGUgdGhlIHR5cGUgb2YgaXRzCisgICBlbGVtZW50cy4gICovCitleHRlcm4gdHJl ZSBlbGVtZW50X3R5cGUgKHRyZWUpOworCisvKiBSZXR1cm4gdGhlIHByZWNpc2lvbiBvZiB0 aGUgdHlwZSwgb3IgZm9yIGEgY29tcGxleCBvciB2ZWN0b3IgdHlwZSB0aGUKKyAgIHByZWNp c2lvbiBvZiB0aGUgdHlwZSBvZiBpdHMgZWxlbWVudHMuICAqLworZXh0ZXJuIHVuc2lnbmVk IGludCBlbGVtZW50X3ByZWNpc2lvbiAoY29uc3RfdHJlZSk7CisKICNlbmRpZiAgLyogR0ND X1RSRUVfSCAgKi8KZGlmZiAtLWdpdCBhL2djYy90cmVlLmMgYi9nY2MvdHJlZS5jCmluZGV4 IGQ5OGI3N2RiNTBiMjliMjJkYzlhZjFmOThjZDg2MDQ0ZjYyYWYwMTkuLjgxZTY2ZGQ3MTBj ZTZiYzIzN2Y1MDg2NTVjZmI0MzdiNDBlYzBiZmEgMTAwNjQ0Ci0tLSBhL2djYy90cmVlLmMK KysrIGIvZ2NjL3RyZWUuYwpAQCAtNjY0NiwxMSArNjY0NiwxMSBAQCB2YWxpZF9jb25zdGFu dF9zaXplX3AgKGNvbnN0X3RyZWUgc2l6ZSwgY3N0X3NpemVfZXJyb3IgKnBlcnIgLyogPSBO VUxMICovKQogICByZXR1cm4gdHJ1ZTsKIH0KIAotLyogUmV0dXJuIHRoZSBwcmVjaXNpb24g b2YgdGhlIHR5cGUsIG9yIGZvciBhIGNvbXBsZXggb3IgdmVjdG9yIHR5cGUgdGhlCi0gICBw cmVjaXNpb24gb2YgdGhlIHR5cGUgb2YgaXRzIGVsZW1lbnRzLiAgKi8KKy8qIFJldHVybiB0 aGUgdHlwZSwgb3IgZm9yIGEgY29tcGxleCBvciB2ZWN0b3IgdHlwZSB0aGUgdHlwZSBvZiBp dHMKKyAgIGVsZW1lbnRzLiAgKi8KIAotdW5zaWduZWQgaW50Ci1lbGVtZW50X3ByZWNpc2lv biAoY29uc3RfdHJlZSB0eXBlKQordHJlZQorZWxlbWVudF90eXBlICh0cmVlIHR5cGUpCiB7 CiAgIGlmICghVFlQRV9QICh0eXBlKSkKICAgICB0eXBlID0gVFJFRV9UWVBFICh0eXBlKTsK QEAgLTY2NTgsNyArNjY1OCwxNiBAQCBlbGVtZW50X3ByZWNpc2lvbiAoY29uc3RfdHJlZSB0 eXBlKQogICBpZiAoY29kZSA9PSBDT01QTEVYX1RZUEUgfHwgY29kZSA9PSBWRUNUT1JfVFlQ RSkKICAgICB0eXBlID0gVFJFRV9UWVBFICh0eXBlKTsKIAotICByZXR1cm4gVFlQRV9QUkVD SVNJT04gKHR5cGUpOworICByZXR1cm4gY29uc3RfY2FzdDx0cmVlPiAodHlwZSk7Cit9CisK Ky8qIFJldHVybiB0aGUgcHJlY2lzaW9uIG9mIHRoZSB0eXBlLCBvciBmb3IgYSBjb21wbGV4 IG9yIHZlY3RvciB0eXBlIHRoZQorICAgcHJlY2lzaW9uIG9mIHRoZSB0eXBlIG9mIGl0cyBl bGVtZW50cy4gICovCisKK3Vuc2lnbmVkIGludAorZWxlbWVudF9wcmVjaXNpb24gKGNvbnN0 X3RyZWUgdHlwZSkKK3sKKyAgcmV0dXJuIFRZUEVfUFJFQ0lTSU9OIChlbGVtZW50X3R5cGUg KGNvbnN0X2Nhc3Q8dHJlZT4gKHR5cGUpKSk7CiB9CiAKIC8qIFJldHVybiB0cnVlIGlmIENP REUgcmVwcmVzZW50cyBhbiBhc3NvY2lhdGl2ZSB0cmVlIGNvZGUuICBPdGhlcndpc2UK --------------6m50e0NM0J0FxZvWJsFSmz8i--