From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id F04A33858D35 for ; Mon, 7 Nov 2022 22:49:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org F04A33858D35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1667861344; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=TsifDu6OrP9Txwe1UcTyNCScrYfEDRom7g5Bu8m+GY4=; b=Pr3fAU3VYjadwNvNejMyfLVsVof+wCLNHzmaANtsN46sIe9axC0/1dSpV7/o80bJ7bCqTm hpj7Y5aO1LiUhFx+0+HUuRHMa2KSCRhkz8Pn6FQjAh5DZZghbDATP6p826hQiocgWx1JtX NvMI8OeJlD2YqlHtPNNL4VBow7jy4tw= Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-115-J_QnnxDANa2ibx_rRJzF4Q-1; Mon, 07 Nov 2022 17:49:03 -0500 X-MC-Unique: J_QnnxDANa2ibx_rRJzF4Q-1 Received: by mail-qt1-f200.google.com with SMTP id fz10-20020a05622a5a8a00b003a4f466998cso9111648qtb.16 for ; Mon, 07 Nov 2022 14:49:03 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=CZbNIVW6wdGUtH3ndCiCuYkxkJKvASvt0em7nmuxsVQ=; b=QD/qCJe3WHStjBxqVdcZpVQEJqfmHRriDLRD5dDp3Xv9YmRppcMsHRUVP6nLlm0QQ7 vdaPjVogyaEfXleir8mMdXWdS0I8HJcO0k1J5ddCflms39/pQRs1gDWS7Edxr2WUZ82W FuFG3oFUr8pDbbGaLn0zYjU/DTv745AN3XCrFpUl0YbtgGCIW9pHRmFsQBh71hxMIF5J aZeAU4Cnh41NpqSIYs+Kyd84piQbFcLMg9k0KX079Bxnw3pAN8tOQ2ue2Cg+Ecp6rUTl MZJ84yUJ6CEEgEJfZoD4qrnHMpotw2WfdgIFtHc0N1oBkcUb5nlYGEk7snYFNK3IWGK1 C4UQ== X-Gm-Message-State: ACrzQf1bHpJJFHls94GAT0zx+fDwwr2atDN9SJKzatMHf8TTCI6zW7zd wS5h2RMQe33rR9Bu2ejwC5vTI/kFvKzMm+y0JfZkaPd/X2qVX/+o/2s3+Rx5det4nwZBFuwWlgk Z++J0vn553RwHwQ3wlw== X-Received: by 2002:a05:620a:190c:b0:6fa:aa58:b29c with SMTP id bj12-20020a05620a190c00b006faaa58b29cmr10340460qkb.627.1667861341827; Mon, 07 Nov 2022 14:49:01 -0800 (PST) X-Google-Smtp-Source: AMsMyM4Lny8y1Fi2Q6R+o85QhjNPSW3kL6jDAT9zUJ6LV3+smC+HZlvePuPN1HG78SzFztr+N4tzdg== X-Received: by 2002:a05:620a:190c:b0:6fa:aa58:b29c with SMTP id bj12-20020a05620a190c00b006faaa58b29cmr10340444qkb.627.1667861341466; Mon, 07 Nov 2022 14:49:01 -0800 (PST) Received: from [172.22.36.61] (rrcs-24-43-233-8.west.biz.rr.com. [24.43.233.8]) by smtp.gmail.com with ESMTPSA id bi24-20020a05620a319800b006cf9084f7d0sm7884357qkb.4.2022.11.07.14.48.59 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 07 Nov 2022 14:49:00 -0800 (PST) Message-ID: Date: Mon, 7 Nov 2022 12:48:58 -1000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: Re: [PATCH RFC(libstdc++)] c++: implement P2468R2, the equality operator you are looking for To: Jonathan Wakely Cc: gcc-patches@gcc.gnu.org, Jakub Jelinek References: <20221107205752.2735464-1-jason@redhat.com> From: Jason Merrill In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="------------8hFv0l6loIRoW9mh3O44bXOp" Content-Language: en-US X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. --------------8hFv0l6loIRoW9mh3O44bXOp Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 11/7/22 12:04, Jonathan Wakely wrote: > On Mon, 7 Nov 2022 at 21:56, Jonathan Wakely wrote: >> >> On Mon, 7 Nov 2022 at 20:58, Jason Merrill wrote: >>> >>> Tested x86_64-pc-linux-gnu. Jonathan, what do you want to do about the library >>> test failure? >>> >>> -- >8 -- >>> >>> This paper is resolving the problem of well-formed C++17 code becoming >>> ambiguous in C++20 due to asymmetrical operator== being compared with itself >>> in reverse. I had previously implemented a tiebreaker such that if the two >>> candidates were functions with the same parameter types, we would prefer the >>> non-reversed candidate. But the committee went with a different approach: >>> if there's an operator!= with the same parameter types as the operator==, >>> don't consider the reversed form of the ==. >>> >>> So this patch implements that, and changes my old tiebreaker to give a >>> pedwarn if it is used. I also noticed that we were giving duplicate errors >>> for some testcases, and fixed the tourney logic to avoid that. >>> >>> As a result, a lot of tests of the form >>> >>> struct A { bool operator==(const A&); }; >>> >>> need to be fixed to add a const function-cv-qualifier, e.g. >>> >>> struct A { bool operator==(const A&) const; }; >>> >>> The committee thought such code ought to be fixed, so breaking it was fine. >>> >>> 18_support/comparisons/algorithms/fallback.cc also breaks with this patch, >>> because of the similarly asymmetrical >>> >>> bool operator==(const S&, S&) { return true; } >>> >>> I assume this was written this way deliberately, so I'm not sure what to do >>> about it. >> >> Yes, that was deliberate. The compare_strong_order_fallback function >> has these constraints: >> >> template _Up> >> requires __strongly_ordered<_Tp, _Up> || __op_eq_lt<_Tp, _Up> >> constexpr strong_ordering >> operator() [[nodiscard]] (_Tp&& __e, _Up&& __f) const >> >> And similarly for the other fallbacks. So I wanted to check that two >> types that decay to the same type (like S and const S) can be compared >> with == and <, and therefore can be used with this function. >> >> But if such asymmetry is no longer allowed, maybe the library function >> is no longer usable with pathological cases like the test, and so the >> test should be changed. We can't just replace the decayed_same_as >> constraint with same_as because the std::strong_order customization >> point still supports similar types, but we could do: >> >> --- a/libstdc++-v3/libsupc++/compare >> +++ b/libstdc++-v3/libsupc++/compare >> @@ -1057,11 +1057,11 @@ namespace std _GLIBCXX_VISIBILITY(default) >> }; >> >> template >> - concept __op_eq_lt = requires(_Tp&& __t, _Up&& __u) >> + concept __op_eq_lt = same_as<_Tp, _Up> && requires(_Tp&& __t) >> { >> - { static_cast<_Tp&&>(__t) == static_cast<_Up&&>(__u) } >> + { static_cast<_Tp&&>(__t) == static_cast<_Tp&&>(__t) } >> -> convertible_to; >> - { static_cast<_Tp&&>(__t) < static_cast<_Up&&>(__u) } >> + { static_cast<_Tp&&>(__t) < static_cast<_Tp&&>(__t) } >> -> convertible_to; >> }; > > No wait, that's nonsense. We can still try to compare similar types, > it's just that they won't be comparable unless their comparison ops > have two parameters of the same type. Basically, though in this case the problem is that the arguments are the same type and the parameters are different. >> And then adjust the test accordingly. If those fallbacks can no longer >> support mixed types, does the resolution of >> https://cplusplus.github.io/LWG/issue3465 even make sense now? If E >> and F must be the same type now, then E < F already implies F < E. I >> think we need some library changes to sync with P2468R2. > > I think this bit was right though. E and F might be different types, > but E < F implies F < E. Is that right? The P2468 changes only affect ==/!=, not <, so LWG3465 should be unaffected. I think the only problem is the test itself: the asserts need to be inverted because S and S cannot be compared for equality with the asymmetrical op== due to the normal candidate being better for arg 2 and the reversed candidate being better for arg 1. The asserts are fine because the arguments match the asymmetry, so the normal candidate is better for both args. So, the below fixes the test, does it make sense to you? Jason --------------8hFv0l6loIRoW9mh3O44bXOp Content-Type: text/x-patch; charset=UTF-8; name="0001-c-implement-P2468R2-the-equality-operator-you-are-lo.patch" Content-Disposition: attachment; filename*0="0001-c-implement-P2468R2-the-equality-operator-you-are-lo.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAxNzkzNmI1NGI4ZWYwMmFmOThjOTQwYTFjZDBmOWJkMTg3MWY1ODE4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKYXNvbiBNZXJyaWxsIDxqYXNvbkByZWRoYXQuY29tPgpEYXRl OiBGcmksIDQgTm92IDIwMjIgMTU6MjI6NDUgLTA0MDAKU3ViamVjdDogW1BBVENIXSBjKys6IGlt cGxlbWVudCBQMjQ2OFIyLCB0aGUgZXF1YWxpdHkgb3BlcmF0b3IgeW91IGFyZSBsb29raW5nCiBm b3IKVG86IGdjYy1wYXRjaGVzQGdjYy5nbnUub3JnCgpUaGlzIHBhcGVyIGlzIHJlc29sdmluZyB0 aGUgcHJvYmxlbSBvZiB3ZWxsLWZvcm1lZCBDKysxNyBjb2RlIGJlY29taW5nCmFtYmlndW91cyBp biBDKysyMCBkdWUgdG8gYXN5bW1ldHJpY2FsIG9wZXJhdG9yPT0gYmVpbmcgY29tcGFyZWQgd2l0 aCBpdHNlbGYKaW4gcmV2ZXJzZS4gIEkgaGFkIHByZXZpb3VzbHkgaW1wbGVtZW50ZWQgYSB0aWVi cmVha2VyIHN1Y2ggdGhhdCBpZiB0aGUgdHdvCmNhbmRpZGF0ZXMgd2VyZSBmdW5jdGlvbnMgd2l0 aCB0aGUgc2FtZSBwYXJhbWV0ZXIgdHlwZXMsIHdlIHdvdWxkIHByZWZlciB0aGUKbm9uLXJldmVy c2VkIGNhbmRpZGF0ZS4gIEJ1dCB0aGUgY29tbWl0dGVlIHdlbnQgd2l0aCBhIGRpZmZlcmVudCBh cHByb2FjaDoKaWYgdGhlcmUncyBhbiBvcGVyYXRvciE9IHdpdGggdGhlIHNhbWUgcGFyYW1ldGVy IHR5cGVzIGFzIHRoZSBvcGVyYXRvcj09LApkb24ndCBjb25zaWRlciB0aGUgcmV2ZXJzZWQgZm9y bSBvZiB0aGUgPT0uCgpTbyB0aGlzIHBhdGNoIGltcGxlbWVudHMgdGhhdCwgYW5kIGNoYW5nZXMg bXkgb2xkIHRpZWJyZWFrZXIgdG8gZ2l2ZSBhCnBlZHdhcm4gaWYgaXQgaXMgdXNlZC4gIEkgYWxz byBub3RpY2VkIHRoYXQgd2Ugd2VyZSBnaXZpbmcgZHVwbGljYXRlIGVycm9ycwpmb3Igc29tZSB0 ZXN0Y2FzZXMsIGFuZCBmaXhlZCB0aGUgdG91cm5leSBsb2dpYyB0byBhdm9pZCB0aGF0LgoKQXMg YSByZXN1bHQsIGEgbG90IG9mIHRlc3RzIG9mIHRoZSBmb3JtCgogIHN0cnVjdCBBIHsgYm9vbCBv cGVyYXRvcj09KGNvbnN0IEEmKTsgfTsKCm5lZWQgdG8gYmUgZml4ZWQgdG8gYWRkIGEgY29uc3Qg ZnVuY3Rpb24tY3YtcXVhbGlmaWVyLCBlLmcuCgogIHN0cnVjdCBBIHsgYm9vbCBvcGVyYXRvcj09 KGNvbnN0IEEmKSBjb25zdDsgfTsKClRoZSBjb21taXR0ZWUgdGhvdWdodCBzdWNoIGNvZGUgb3Vn aHQgdG8gYmUgZml4ZWQsIHNvIGJyZWFraW5nIGl0IHdhcyBmaW5lLgoKMThfc3VwcG9ydC9jb21w YXJpc29ucy9hbGdvcml0aG1zL2ZhbGxiYWNrLmNjIGFsc28gYnJlYWtzIHdpdGggdGhpcyBwYXRj aCwKYmVjYXVzZSBvZiB0aGUgc2ltaWxhcmx5IGFzeW1tZXRyaWNhbAoKICBib29sIG9wZXJhdG9y PT0oY29uc3QgUyYsIFMmKSB7IHJldHVybiB0cnVlOyB9CgpBcyBhIHJlc3VsdCwgc29tZSBvZiB0 aGUgYXNzZXJ0cyBuZWVkIHRvIGJlIHJldmVyc2VkLgoKVGhlIEggdGVzdCBpbiBzcGFjZXNoaXAt ZXExNS5DIGlzIHNwZWNpZmllZCBpbiB0aGUgc3RhbmRhcmQgdG8gYmUKd2VsbC1mb3JtZWQgYmVj YXVzZSB0aGUgb3AhPSBpbiB0aGUgaW5saW5lIG5hbWVzcGFjZSBpcyBub3QgZm91bmQgYnkgdGhl CnNlYXJjaCwgYnV0IHRoYXQgc2VlbXMgd3JvbmcgdG8gbWUuICBJJ3ZlIGltcGxlbWVudGVkIHRo YXQgYmVoYXZpb3IsIGJ1dApkaXNhYmxlZCBpdCBmb3Igbm93OyBpZiB3ZSBkZWNpZGUgdGhhdCBp cyB0aGUgd2F5IHdlIHdhbnQgdG8gZ28sIHdlIGNhbiBqdXN0CnJlbW92ZSB0aGUgIjAgJiYiIGlu IGFkZF9jYW5kaWRhdGVzIHRvIGVuYWJsZSBpdC4KCkNvLWF1dGhvcmVkLWJ5OiBKYWt1YiBKZWxp bmVrIDxqYWt1YkByZWRoYXQuY29tPgoKZ2NjL2NwL0NoYW5nZUxvZzoKCgkqIGNwLXRyZWUuaCAo Zm5zX2NvcnJlc3BvbmQpOiBEZWNsYXJlLgoJKiBkZWNsLmNjIChmbnNfY29ycmVzcG9uZCk6IE5l dy4KCSogY2FsbC5jYyAoYWRkX2NhbmRpZGF0ZXMpOiBMb29rIGZvciBvcCE9IG1hdGNoaW5nIG9w PT0uCgkoam91c3QpOiBDb21wbGFpbiBhYm91dCBub24tc3RhbmRhcmQgcmV2ZXJzZWQgdGllYnJl YWtlci4KCSh0b3VybmV5KTogRml4IGNoYW1wX2NvbXBhcmVkX3RvX3ByZWRlY2Vzc29yIGxvZ2lj LgoJKGJ1aWxkX25ld19vcCk6IERvbid0IGNvbXBsYWluIGFib3V0IGVycm9yX21hcmtfbm9kZSBu b3QgaGF2aW5nCgknYm9vbCcgdHlwZS4KCSogcHQuY2MgKHRzdWJzdF9jb3B5X2FuZF9idWlsZCk6 IERvbid0IHRyeSB0byBiZSBwZXJtaXNzaXZlCgl3aGVuIHNlZW5fZXJyb3IoKS4KCmdjYy90ZXN0 c3VpdGUvQ2hhbmdlTG9nOgoKCSogZysrLmRnL2NwcDJhL3NwYWNlc2hpcC1lcTE1LkM6IE5ldyB0 ZXN0LgoJKiBnKysuZGcvY3BwMHgvZGVmYXVsdGVkMy5DOiBBZGQgY29uc3QuCgkqIGcrKy5kZy9j cHAyYS9iaXQtY2FzdDcuQzogQWRkIGNvbnN0LgoJKiBnKysuZGcvY3BwMmEvc3BhY2VzaGlwLXJl d3JpdGUxLkM6IEV4cGVjdCBlcnJvci4KCSogZysrLmRnL2NwcDJhL3NwYWNlc2hpcC1yZXdyaXRl NS5DOiBFeHBlY3QgZXJyb3IuCgkqIGcrKy5vbGQtZGVqYS9nKysuamFzb24vYnl2YWwyLkM6IEV4 cGVjdCBlcnJvci4KCSogZysrLm9sZC1kZWphL2crKy5vdGhlci9vdmVybG9hZDEzLkM6IEFkZCBj b25zdC4KCmxpYnN0ZGMrKy12My9DaGFuZ2VMb2c6CgoJKiB0ZXN0c3VpdGUvMThfc3VwcG9ydC9j b21wYXJpc29ucy9hbGdvcml0aG1zL2ZhbGxiYWNrLmNjOiBBZGp1c3QKCWFzc2VydHMuCi0tLQog Z2NjL2NwL2NwLXRyZWUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKIGdj Yy9jcC9jYWxsLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEwOSArKysrKysr Ky0KIGdjYy9jcC9kZWNsLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2NiAr KysrKysKIGdjYy9jcC9wdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg NSArLQogZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMHgvZGVmYXVsdGVkMy5DICAgICAgIHwgICAy ICstCiBnY2MvdGVzdHN1aXRlL2crKy5kZy9jcHAyYS9iaXQtY2FzdDcuQyAgICAgICAgfCAgIDQg Ky0KIGdjYy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL3NwYWNlc2hpcC1lcTE1LkMgICB8IDIwOCAr KysrKysrKysrKysrKysrKysKIC4uLi9nKysuZGcvY3BwMmEvc3BhY2VzaGlwLXJld3JpdGUxLkMg ICAgICAgICB8ICAgMiArLQogLi4uL2crKy5kZy9jcHAyYS9zcGFjZXNoaXAtcmV3cml0ZTUuQyAg ICAgICAgIHwgICAyICstCiBnY2MvdGVzdHN1aXRlL2crKy5vbGQtZGVqYS9nKysuamFzb24vYnl2 YWwyLkMgfCAgIDIgKy0KIC4uLi9nKysub2xkLWRlamEvZysrLm90aGVyL292ZXJsb2FkMTMuQyAg ICAgICB8ICAgMiArLQogLi4uL2NvbXBhcmlzb25zL2FsZ29yaXRobXMvZmFsbGJhY2suY2MgICAg ICAgIHwgICA2ICstCiAxMiBmaWxlcyBjaGFuZ2VkLCAzODkgaW5zZXJ0aW9ucygrKSwgMjAgZGVs ZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEv c3BhY2VzaGlwLWVxMTUuQwoKZGlmZiAtLWdpdCBhL2djYy9jcC9jcC10cmVlLmggYi9nY2MvY3Av Y3AtdHJlZS5oCmluZGV4IGQxM2JiM2Q0YzBlLi5iYmM4YmUyMTkwMCAxMDA2NDQKLS0tIGEvZ2Nj L2NwL2NwLXRyZWUuaAorKysgYi9nY2MvY3AvY3AtdHJlZS5oCkBAIC02ODIwLDYgKzY4MjAsNyBA QCBleHRlcm4gdm9pZCBub3RlX2JyZWFrX3N0bXQJCQkodm9pZCk7CiBleHRlcm4gYm9vbCBub3Rl X2l0ZXJhdGlvbl9zdG10X2JvZHlfc3RhcnQJKHZvaWQpOwogZXh0ZXJuIHZvaWQgbm90ZV9pdGVy YXRpb25fc3RtdF9ib2R5X2VuZAkoYm9vbCk7CiBleHRlcm4gdm9pZCBkZXRlcm1pbmVfbG9jYWxf ZGlzY3JpbWluYXRvcgkodHJlZSk7CitleHRlcm4gYm9vbCBmbnNfY29ycmVzcG9uZAkJCSh0cmVl LCB0cmVlKTsKIGV4dGVybiBpbnQgZGVjbHNfbWF0Y2gJCQkJKHRyZWUsIHRyZWUsIGJvb2wgPSB0 cnVlKTsKIGV4dGVybiBib29sIG1heWJlX3ZlcnNpb25fZnVuY3Rpb25zCQkodHJlZSwgdHJlZSwg Ym9vbCk7CiBleHRlcm4gYm9vbCBtZXJnZV9kZWZhdWx0X3RlbXBsYXRlX2FyZ3MJCSh0cmVlLCB0 cmVlLCBib29sKTsKZGlmZiAtLWdpdCBhL2djYy9jcC9jYWxsLmNjIGIvZ2NjL2NwL2NhbGwuY2MK aW5kZXggMmMwZmEzN2Y1M2EuLjQ5MmRiOWI1OWFkIDEwMDY0NAotLS0gYS9nY2MvY3AvY2FsbC5j YworKysgYi9nY2MvY3AvY2FsbC5jYwpAQCAtNjIzMiw2ICs2MjMyLDcgQEAgYWRkX2NhbmRpZGF0 ZXMgKHRyZWUgZm5zLCB0cmVlIGZpcnN0X2FyZywgY29uc3QgdmVjPHRyZWUsIHZhX2djPiAqYXJn cywKICAgYm9vbCBjaGVja19saXN0X2N0b3IgPSBmYWxzZTsKICAgYm9vbCBjaGVja19jb252ZXJ0 aW5nID0gZmFsc2U7CiAgIHVuaWZpY2F0aW9uX2tpbmRfdCBzdHJpY3Q7CisgIHRyZWUgbmVfZm5z ID0gTlVMTF9UUkVFOwogCiAgIGlmICghZm5zKQogICAgIHJldHVybjsKQEAgLTYyNjksNiArNjI3 MCwzMiBAQCBhZGRfY2FuZGlkYXRlcyAodHJlZSBmbnMsIHRyZWUgZmlyc3RfYXJnLCBjb25zdCB2 ZWM8dHJlZSwgdmFfZ2M+ICphcmdzLAogICAgICAgY3R5cGUgPSBjb252ZXJzaW9uX3BhdGggPyBC SU5GT19UWVBFIChjb252ZXJzaW9uX3BhdGgpIDogTlVMTF9UUkVFOwogICAgIH0KIAorICAvKiBQ MjQ2ODogQ2hlY2sgaWYgb3BlcmF0b3I9PSBpcyBhIHJld3JpdGUgdGFyZ2V0IHdpdGggZmlyc3Qg b3BlcmFuZAorICAgICAoKmFyZ3MpWzBdOyBmb3Igbm93IGp1c3QgZG8gdGhlIGxvb2t1cHMuICAq LworICBpZiAoKGZsYWdzICYgKExPT0tVUF9SRVdSSVRURU4gfCBMT09LVVBfUkVWRVJTRUQpKQor ICAgICAgJiYgREVDTF9PVkVSTE9BREVEX09QRVJBVE9SX0lTIChmbiwgRVFfRVhQUikpCisgICAg eworICAgICAgdHJlZSBuZV9uYW1lID0gb3ZsX29wX2lkZW50aWZpZXIgKGZhbHNlLCBORV9FWFBS KTsKKyAgICAgIGlmIChERUNMX0NMQVNTX1NDT1BFX1AgKGZuKSkKKwl7CisJICBuZV9mbnMgPSBs b29rdXBfZm5maWVsZHMgKFRSRUVfVFlQRSAoKCphcmdzKVswXSksIG5lX25hbWUsCisJCQkJICAg IDEsIHRmX25vbmUpOworCSAgaWYgKG5lX2ZucyA9PSBlcnJvcl9tYXJrX25vZGUgfHwgbmVfZm5z ID09IE5VTExfVFJFRSkKKwkgICAgbmVfZm5zID0gTlVMTF9UUkVFOworCSAgZWxzZQorCSAgICBu ZV9mbnMgPSBCQVNFTElOS19GVU5DVElPTlMgKG5lX2Zucyk7CisJfQorICAgICAgZWxzZQorCXsK KwkgIHRyZWUgY29udGV4dCA9IGRlY2xfbmFtZXNwYWNlX2NvbnRleHQgKGZuKTsKKwkgIG5lX2Zu cyA9IGxvb2t1cF9xdWFsaWZpZWRfbmFtZSAoY29udGV4dCwgbmVfbmFtZSwgTE9PS193YW50OjpO T1JNQUwsCisJCQkJCSAgLypjb21wbGFpbiovZmFsc2UpOworCSAgaWYgKG5lX2ZucyA9PSBlcnJv cl9tYXJrX25vZGUKKwkgICAgICB8fCAhaXNfb3ZlcmxvYWRlZF9mbiAobmVfZm5zKSkKKwkgICAg bmVfZm5zID0gTlVMTF9UUkVFOworCX0KKyAgICB9CisKICAgaWYgKGZpcnN0X2FyZykKICAgICBu b25fc3RhdGljX2FyZ3MgPSBhcmdzOwogICBlbHNlCkBAIC02MzQ1LDYgKzYzNzIsMjcgQEAgYWRk X2NhbmRpZGF0ZXMgKHRyZWUgZm5zLCB0cmVlIGZpcnN0X2FyZywgY29uc3QgdmVjPHRyZWUsIHZh X2djPiAqYXJncywKIAkgICAgY29udGludWU7CiAJfQogCisgICAgICAvKiBXaGVuIGNvbnNpZGVy aW5nIHJldmVyc2VkIG9wZXJhdG9yPT0sIGlmIHRoZXJlJ3MgYSBjb3JyZXNwb25kaW5nCisJIG9w ZXJhdG9yIT0gaW4gdGhlIHNhbWUgc2NvcGUsIGl0J3Mgbm90IGEgcmV3cml0ZSB0YXJnZXQuICAq LworICAgICAgaWYgKG5lX2ZucykKKwl7CisJICBib29sIGZvdW5kID0gZmFsc2U7CisJICBmb3Ig KGxrcF9pdGVyYXRvciBuZSAobmVfZm5zKTsgIWZvdW5kICYmIG5lOyArK25lKQorCSAgICBpZiAo MCAmJiAhbmUudXNpbmdfcCAoKQorCQkmJiBERUNMX05BTUVTUEFDRV9TQ09QRV9QIChmbikKKwkJ JiYgREVDTF9DT05URVhUICgqbmUpICE9IERFQ0xfQ09OVEVYVCAoZm4pKQorCSAgICAgIC8qID8/ PyBUaGlzIGtsdWRnZSBleGNsdWRlcyBpbmxpbmUgbmFtZXNwYWNlIG1lbWJlcnMgZm9yIHRoZSBI CisJCSB0ZXN0IGluIHNwYWNlc2hpcC1lcTE1LkMsIGJ1dCBJIGRvbid0IHNlZSB3aHkgd2Ugd291 bGQgd2FudAorCQkgdGhhdCBiZWhhdmlvci4gIEFza2VkIENvcmUgMjAyMi0xMS0wNC4gIERpc2Fi bGluZyBmb3Igbm93LiAgKi87CisJICAgIGVsc2UgaWYgKGZuc19jb3JyZXNwb25kIChmbiwgKm5l KSkKKwkgICAgICB7CisJCWZvdW5kID0gdHJ1ZTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgaWYg KGZvdW5kKQorCSAgICBjb250aW51ZTsKKwl9CisKICAgICAgIGlmIChUUkVFX0NPREUgKGZuKSA9 PSBURU1QTEFURV9ERUNMKQogCXsKIAkgIGlmICghYWRkX3RlbXBsYXRlX2NhbmRpZGF0ZSAoY2Fu ZGlkYXRlcywKQEAgLTY5MTcsMTAgKzY5NjUsMTIgQEAgYnVpbGRfbmV3X29wIChjb25zdCBvcF9s b2NhdGlvbl90ICZsb2MsIGVudW0gdHJlZV9jb2RlIGNvZGUsIGludCBmbGFncywKIAkJICBnY2Nf Y2hlY2tpbmdfYXNzZXJ0IChjYW5kLT5yZXZlcnNlZCAoKSk7CiAJCSAgZ2NjX2ZhbGx0aHJvdWdo ICgpOwogCQljYXNlIE5FX0VYUFI6CisJCSAgaWYgKHJlc3VsdCA9PSBlcnJvcl9tYXJrX25vZGUp CisJCSAgICA7CiAJCSAgLyogSWYgYSByZXdyaXR0ZW4gb3BlcmF0b3I9PSBjYW5kaWRhdGUgaXMg c2VsZWN0ZWQgYnkKIAkJICAgICBvdmVybG9hZCByZXNvbHV0aW9uIGZvciBhbiBvcGVyYXRvciBA LCBpdHMgcmV0dXJuIHR5cGUKIAkJICAgICBzaGFsbCBiZSBjdiBib29sLi4uLiAqLwotCQkgIGlm IChUUkVFX0NPREUgKFRSRUVfVFlQRSAocmVzdWx0KSkgIT0gQk9PTEVBTl9UWVBFKQorCQkgIGVs c2UgaWYgKFRSRUVfQ09ERSAoVFJFRV9UWVBFIChyZXN1bHQpKSAhPSBCT09MRUFOX1RZUEUpCiAJ CSAgICB7CiAJCSAgICAgIGlmIChjb21wbGFpbiAmIHRmX2Vycm9yKQogCQkJewpAQCAtMTI0ODgs MTAgKzEyNTM4LDUzIEBAIGpvdXN0IChzdHJ1Y3Qgel9jYW5kaWRhdGUgKmNhbmQxLCBzdHJ1Y3Qg el9jYW5kaWRhdGUgKmNhbmQyLCBib29sIHdhcm4sCiAJICBpZiAod2lubmVyICYmIGNvbXAgIT0g d2lubmVyKQogCSAgICB7CiAJICAgICAgLyogQW1iaWd1aXR5IGJldHdlZW4gbm9ybWFsIGFuZCBy ZXZlcnNlZCBjb21wYXJpc29uIG9wZXJhdG9ycwotCQkgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXIg dHlwZXM7IHByZWZlciB0aGUgbm9ybWFsIG9uZS4gICovCi0JICAgICAgaWYgKChjYW5kMS0+cmV2 ZXJzZWQgKCkgIT0gY2FuZDItPnJldmVyc2VkICgpKQorCQkgd2l0aCB0aGUgc2FtZSBwYXJhbWV0 ZXIgdHlwZXMuICBQMjQ2OCBkZWNpZGVkIG5vdCB0byBnbyB3aXRoCisJCSB0aGlzIGFwcHJvYWNo IHRvIHJlc29sdmluZyB0aGUgYW1iaWd1aXR5LCBzbyBwZWR3YXJuLiAgKi8KKwkgICAgICBpZiAo KGNvbXBsYWluICYgdGZfd2FybmluZ19vcl9lcnJvcikKKwkJICAmJiAoY2FuZDEtPnJldmVyc2Vk ICgpICE9IGNhbmQyLT5yZXZlcnNlZCAoKSkKIAkJICAmJiBjYW5kX3Bhcm1zX21hdGNoIChjYW5k MSwgY2FuZDIpKQotCQlyZXR1cm4gY2FuZDEtPnJldmVyc2VkICgpID8gLTEgOiAxOworCQl7CisJ CSAgc3RydWN0IHpfY2FuZGlkYXRlICp3LCAqbDsKKwkJICBpZiAoY2FuZDItPnJldmVyc2VkICgp KQorCQkgICAgd2lubmVyID0gMSwgdyA9IGNhbmQxLCBsID0gY2FuZDI7CisJCSAgZWxzZQorCQkg ICAgd2lubmVyID0gLTEsIHcgPSBjYW5kMiwgbCA9IGNhbmQxOworCQkgIGlmICh3YXJuKQorCQkg ICAgeworCQkgICAgICBhdXRvX2RpYWdub3N0aWNfZ3JvdXAgZDsKKwkJICAgICAgaWYgKHBlZHdh cm4gKGlucHV0X2xvY2F0aW9uLCAwLAorCQkJCSAgICJDKysyMCBzYXlzIHRoYXQgdGhlc2UgYXJl IGFtYmlndW91cywgIgorCQkJCSAgICJldmVuIHRob3VnaCB0aGUgc2Vjb25kIGlzIHJldmVyc2Vk OiIpKQorCQkJeworCQkJICBwcmludF96X2NhbmRpZGF0ZSAoaW5wdXRfbG9jYXRpb24sCisJCQkJ CSAgICAgTl8oImNhbmRpZGF0ZSAxOiIpLCB3KTsKKwkJCSAgcHJpbnRfel9jYW5kaWRhdGUgKGlu cHV0X2xvY2F0aW9uLAorCQkJCQkgICAgIE5fKCJjYW5kaWRhdGUgMjoiKSwgbCk7CisJCQkgIGlm ICh3LT5mbiA9PSBsLT5mbgorCQkJICAgICAgJiYgREVDTF9OT05TVEFUSUNfTUVNQkVSX0ZVTkNU SU9OX1AgKHctPmZuKQorCQkJICAgICAgJiYgKHR5cGVfbWVtZm5fcXVhbHMgKFRSRUVfVFlQRSAo dy0+Zm4pKQorCQkJCSAgJiBUWVBFX1FVQUxfQ09OU1QpID09IDApCisJCQkgICAgeworCQkJICAg ICAgLyogU3VnZ2VzdCBhZGRpbmcgY29uc3QgdG8KKwkJCQkgc3RydWN0IEEgeyBib29sIG9wZXJh dG9yPT0oY29uc3QgQSYpOyB9OyAqLworCQkJICAgICAgdHJlZSBwYXJtdHlwZQorCQkJCT0gRlVO Q1RJT05fRklSU1RfVVNFUl9QQVJNVFlQRSAody0+Zm4pOworCQkJICAgICAgcGFybXR5cGUgPSBU UkVFX1ZBTFVFIChwYXJtdHlwZSk7CisJCQkgICAgICBpZiAoVFlQRV9SRUZfUCAocGFybXR5cGUp CisJCQkJICAmJiBUWVBFX1JFQURPTkxZIChUUkVFX1RZUEUgKHBhcm10eXBlKSkKKwkJCQkgICYm IChzYW1lX3R5cGVfaWdub3JpbmdfdG9wX2xldmVsX3F1YWxpZmllcnNfcAorCQkJCSAgICAgIChU UkVFX1RZUEUgKHBhcm10eXBlKSwKKwkJCQkgICAgICAgREVDTF9DT05URVhUICh3LT5mbikpKSkK KwkJCQlpbmZvcm0gKERFQ0xfU09VUkNFX0xPQ0FUSU9OICh3LT5mbiksCisJCQkJCSJ0cnkgbWFr aW5nIHRoZSBvcGVyYXRvciBhICU8Y29uc3QlPiAiCisJCQkJCSJtZW1iZXIgZnVuY3Rpb24iKTsK KwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgYWRkX3dhcm5pbmcgKHcs IGwpOworCQkgIHJldHVybiB3aW5uZXI7CisJCX0KIAogCSAgICAgIHdpbm5lciA9IDA7CiAJICAg ICAgZ290byB0d2VhazsKQEAgLTEyODgwLDcgKzEyOTczLDcgQEAgdG91cm5leSAoc3RydWN0IHpf Y2FuZGlkYXRlICpjYW5kaWRhdGVzLCB0c3Vic3RfZmxhZ3NfdCBjb21wbGFpbikKIHsKICAgc3Ry dWN0IHpfY2FuZGlkYXRlICpjaGFtcCA9IGNhbmRpZGF0ZXMsICpjaGFsbGVuZ2VyOwogICBpbnQg ZmF0ZTsKLSAgaW50IGNoYW1wX2NvbXBhcmVkX3RvX3ByZWRlY2Vzc29yID0gMDsKKyAgc3RydWN0 IHpfY2FuZGlkYXRlICpjaGFtcF9jb21wYXJlZF90b19wcmVkZWNlc3NvciA9IG51bGxwdHI7CiAK ICAgLyogV2FsayB0aHJvdWdoIHRoZSBsaXN0IG9uY2UsIGNvbXBhcmluZyBlYWNoIGN1cnJlbnQg Y2hhbXAgdG8gdGhlIG5leHQKICAgICAgY2FuZGlkYXRlLCBrbm9ja2luZyBvdXQgYSBjYW5kaWRh dGUgb3IgdHdvIHdpdGggZWFjaCBjb21wYXJpc29uLiAgKi8KQEAgLTEyODk3LDEyICsxMjk5MCwx MiBAQCB0b3VybmV5IChzdHJ1Y3Qgel9jYW5kaWRhdGUgKmNhbmRpZGF0ZXMsIHRzdWJzdF9mbGFn c190IGNvbXBsYWluKQogCSAgICAgIGNoYW1wID0gY2hhbGxlbmdlci0+bmV4dDsKIAkgICAgICBp ZiAoY2hhbXAgPT0gMCkKIAkJcmV0dXJuIE5VTEw7Ci0JICAgICAgY2hhbXBfY29tcGFyZWRfdG9f cHJlZGVjZXNzb3IgPSAwOworCSAgICAgIGNoYW1wX2NvbXBhcmVkX3RvX3ByZWRlY2Vzc29yID0g bnVsbHB0cjsKIAkgICAgfQogCSAgZWxzZQogCSAgICB7CisJICAgICAgY2hhbXBfY29tcGFyZWRf dG9fcHJlZGVjZXNzb3IgPSBjaGFtcDsKIAkgICAgICBjaGFtcCA9IGNoYWxsZW5nZXI7Ci0JICAg ICAgY2hhbXBfY29tcGFyZWRfdG9fcHJlZGVjZXNzb3IgPSAxOwogCSAgICB9CiAKIAkgIGNoYWxs ZW5nZXIgPSBjaGFtcC0+bmV4dDsKQEAgLTEyOTE0LDcgKzEzMDA3LDcgQEAgdG91cm5leSAoc3Ry dWN0IHpfY2FuZGlkYXRlICpjYW5kaWRhdGVzLCB0c3Vic3RfZmxhZ3NfdCBjb21wbGFpbikKIAog ICBmb3IgKGNoYWxsZW5nZXIgPSBjYW5kaWRhdGVzOwogICAgICAgIGNoYWxsZW5nZXIgIT0gY2hh bXAKLQkgJiYgIShjaGFtcF9jb21wYXJlZF90b19wcmVkZWNlc3NvciAmJiBjaGFsbGVuZ2VyLT5u ZXh0ID09IGNoYW1wKTsKKwkgJiYgY2hhbGxlbmdlciAhPSBjaGFtcF9jb21wYXJlZF90b19wcmVk ZWNlc3NvcjsKICAgICAgICBjaGFsbGVuZ2VyID0gY2hhbGxlbmdlci0+bmV4dCkKICAgICB7CiAg ICAgICBmYXRlID0gam91c3QgKGNoYW1wLCBjaGFsbGVuZ2VyLCAwLCBjb21wbGFpbik7CmRpZmYg LS1naXQgYS9nY2MvY3AvZGVjbC5jYyBiL2djYy9jcC9kZWNsLmNjCmluZGV4IDZlOThlYTM1YTM5 Li44OTBjZmNhYmQzNSAxMDA2NDQKLS0tIGEvZ2NjL2NwL2RlY2wuY2MKKysrIGIvZ2NjL2NwL2Rl Y2wuY2MKQEAgLTk4MCw2ICs5ODAsNzIgQEAgZnVuY3Rpb25fcmVxdWlyZW1lbnRzX2VxdWl2YWxl bnRfcCAodHJlZSBuZXdmbiwgdHJlZSBvbGRmbikKICAgcmV0dXJuIGNwX3RyZWVfZXF1YWwgKHJl cXMxLCByZXFzMik7CiB9CiAKKy8qIFR3byBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBjb3Jy ZXNwb25kIFtiYXNpYy5zY29wZS5zY29wZV0gaWYKKworICAgKyBib3RoIGRlY2xhcmUgZnVuY3Rp b25zIHdpdGggdGhlIHNhbWUgbm9uLW9iamVjdC1wYXJhbWV0ZXItdHlwZS1saXN0LAorICAgZXF1 aXZhbGVudCAoW3RlbXAub3Zlci5saW5rXSkgdHJhaWxpbmcgcmVxdWlyZXMtY2xhdXNlcyAoaWYg YW55LCBleGNlcHQgYXMKKyAgIHNwZWNpZmllZCBpbiBbdGVtcC5mcmllbmRdKSwgYW5kLCBpZiBi b3RoIGFyZSBub24tc3RhdGljIG1lbWJlcnMsIHRoZXkgaGF2ZQorICAgY29ycmVzcG9uZGluZyBv YmplY3QgcGFyYW1ldGVycywgb3IKKworICAgKyBib3RoIGRlY2xhcmUgZnVuY3Rpb24gdGVtcGxh dGVzIHdpdGggZXF1aXZhbGVudAorICAgbm9uLW9iamVjdC1wYXJhbWV0ZXItdHlwZS1saXN0cywg cmV0dXJuIHR5cGVzIChpZiBhbnkpLCB0ZW1wbGF0ZS1oZWFkcywgYW5kCisgICB0cmFpbGluZyBy ZXF1aXJlcy1jbGF1c2VzIChpZiBhbnkpLCBhbmQsIGlmIGJvdGggYXJlIG5vbi1zdGF0aWMgbWVt YmVycywKKyAgIHRoZXkgaGF2ZSBjb3JyZXNwb25kaW5nIG9iamVjdCBwYXJhbWV0ZXJzLgorCisg ICBUaGlzIGlzIGEgc3Vic2V0IG9mIGRlY2xzX21hdGNoOiBpdCBpZGVudGlmaWVzIGRlY2xhcmF0 aW9ucyB0aGF0IGNhbm5vdCBiZQorICAgb3ZlcmxvYWRlZCB3aXRoIG9uZSBhbm90aGVyLiAgVGhp cyBmdW5jdGlvbiBkb2VzIG5vdCBjb25zaWRlciBERUNMX05BTUUuICAqLworCitib29sCitmbnNf Y29ycmVzcG9uZCAodHJlZSBuZXdkZWNsLCB0cmVlIG9sZGRlY2wpCit7CisgIGlmIChUUkVFX0NP REUgKG5ld2RlY2wpICE9IFRSRUVfQ09ERSAob2xkZGVjbCkpCisgICAgcmV0dXJuIGZhbHNlOwor CisgIGlmIChUUkVFX0NPREUgKG5ld2RlY2wpID09IFRFTVBMQVRFX0RFQ0wpCisgICAgeworICAg ICAgaWYgKCF0ZW1wbGF0ZV9oZWFkc19lcXVpdmFsZW50X3AgKG5ld2RlY2wsIG9sZGRlY2wpKQor CXJldHVybiAwOworICAgICAgbmV3ZGVjbCA9IERFQ0xfVEVNUExBVEVfUkVTVUxUIChuZXdkZWNs KTsKKyAgICAgIG9sZGRlY2wgPSBERUNMX1RFTVBMQVRFX1JFU1VMVCAob2xkZGVjbCk7CisgICAg fQorCisgIHRyZWUgZjEgPSBUUkVFX1RZUEUgKG5ld2RlY2wpOworICB0cmVlIGYyID0gVFJFRV9U WVBFIChvbGRkZWNsKTsKKworICBpbnQgcnExID0gdHlwZV9tZW1mbl9ycXVhbCAoZjEpOworICBp bnQgcnEyID0gdHlwZV9tZW1mbl9ycXVhbCAoZjIpOworCisgIC8qIElmIG9ubHkgb25lIGlzIGEg bm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24sIGlnbm9yZSByZWYtcXVhbHMuICAqLworICBpZiAo VFJFRV9DT0RFIChmMSkgIT0gVFJFRV9DT0RFIChmMikpCisgICAgcnExID0gcnEyOworICAvKiBU d28gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIGhhdmUgY29ycmVzcG9uZGluZyBvYmplY3Qg cGFyYW1ldGVycyBpZjoKKyAgICAgKyBleGFjdGx5IG9uZSBpcyBhbiBpbXBsaWNpdCBvYmplY3Qg bWVtYmVyIGZ1bmN0aW9uIHdpdGggbm8gcmVmLXF1YWxpZmllcgorICAgICBhbmQgdGhlIHR5cGVz IG9mIHRoZWlyIG9iamVjdCBwYXJhbWV0ZXJzIChbZGNsLmZjdF0pLCBhZnRlciByZW1vdmluZwor ICAgICB0b3AtbGV2ZWwgcmVmZXJlbmNlcywgYXJlIHRoZSBzYW1lLCBvcgorICAgICArIHRoZWly IG9iamVjdCBwYXJhbWV0ZXJzIGhhdmUgdGhlIHNhbWUgdHlwZS4gICovCisgIC8qID8/PyBXZSB0 cmVhdCBtZW1iZXIgZnVuY3Rpb25zIG9mIGRpZmZlcmVudCBjbGFzc2VzIGFzIGNvcnJlc3BvbmRp bmcgZXZlbgorICAgICB0aG91Z2ggdGhhdCBtZWFucyB0aGUgb2JqZWN0IHBhcmFtZXRlcnMgaGF2 ZSBkaWZmZXJlbnQgdHlwZXMuICAqLworICBlbHNlIGlmICgocnExID09IFJFRl9RVUFMX05PTkUp ICE9IChycTIgPT0gUkVGX1FVQUxfTk9ORSkpCisgICAgcnExID0gcnEyOworCisgIGJvb2wgdHlw ZXNfbWF0Y2ggPSBycTEgPT0gcnEyOworCisgIGlmICh0eXBlc19tYXRjaCkKKyAgICB7CisgICAg ICB0cmVlIHAxID0gRlVOQ1RJT05fRklSU1RfVVNFUl9QQVJNVFlQRSAobmV3ZGVjbCk7CisgICAg ICB0cmVlIHAyID0gRlVOQ1RJT05fRklSU1RfVVNFUl9QQVJNVFlQRSAob2xkZGVjbCk7CisgICAg ICB0eXBlc19tYXRjaCA9IGNvbXBwYXJtcyAocDEsIHAyKTsKKyAgICB9CisKKyAgLyogVHdvIGZ1 bmN0aW9uIGRlY2xhcmF0aW9ucyBtYXRjaCBpZiBlaXRoZXIgaGFzIGEgcmVxdWlyZXMtY2xhdXNl CisgICAgIHRoZW4gYm90aCBoYXZlIGEgcmVxdWlyZXMtY2xhdXNlIGFuZCB0aGVpciBjb25zdHJh aW50cy1leHByZXNzaW9ucworICAgICBhcmUgZXF1aXZhbGVudC4gICovCisgIGlmICh0eXBlc19t YXRjaCAmJiBmbGFnX2NvbmNlcHRzKQorICAgIHR5cGVzX21hdGNoID0gZnVuY3Rpb25fcmVxdWly ZW1lbnRzX2VxdWl2YWxlbnRfcCAobmV3ZGVjbCwgb2xkZGVjbCk7CisKKyAgcmV0dXJuIHR5cGVz X21hdGNoOworfQorCiAvKiBTdWJyb3V0aW5lIG9mIGR1cGxpY2F0ZV9kZWNsczogcmV0dXJuIHRy dXRodmFsdWUgb2Ygd2hldGhlcgogICAgb3Igbm90IHR5cGVzIG9mIHRoZXNlIGRlY2xzIG1hdGNo LgogCmRpZmYgLS1naXQgYS9nY2MvY3AvcHQuY2MgYi9nY2MvY3AvcHQuY2MKaW5kZXggYzNmYzU2 YTEzZmYuLjU3OTE3ZGUzMjFmIDEwMDY0NAotLS0gYS9nY2MvY3AvcHQuY2MKKysrIGIvZ2NjL2Nw L3B0LmNjCkBAIC0yMDkzNyw4ICsyMDkzNyw5IEBAIHRzdWJzdF9jb3B5X2FuZF9idWlsZCAodHJl ZSB0LAogCQkgICAgLyogSW4gYSBsYW1iZGEgZm4sIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBu b3QKIAkJICAgICAgIGludHJvZHVjZSBuZXcgdGhpcyBjYXB0dXJlcy4gIExlZ2FjeSBjb2RlIGNh bid0CiAJCSAgICAgICBiZSB1c2luZyBsYW1iZGFzIGFueXdheSwgc28gaXQncyBvayB0byBiZQot CQkgICAgICAgc3RyaWN0ZXIuICBCZSBzdHJpY3Qgd2l0aCBDKysyMCB0ZW1wbGF0ZS1pZCBBREwg dG9vLiAgKi8KLQkJICAgIGJvb2wgc3RyaWN0ID0gaW5fbGFtYmRhIHx8IHRlbXBsYXRlX2lkX3A7 CisJCSAgICAgICBzdHJpY3Rlci4gIEJlIHN0cmljdCB3aXRoIEMrKzIwIHRlbXBsYXRlLWlkIEFE TCB0b28uCisJCSAgICAgICBBbmQgYmUgc3RyaWN0IGlmIHdlJ3JlIGFscmVhZHkgZmFpbGluZyBh bnl3YXkuICAqLworCQkgICAgYm9vbCBzdHJpY3QgPSBpbl9sYW1iZGEgfHwgdGVtcGxhdGVfaWRf cCB8fCBzZWVuX2Vycm9yKCk7CiAJCSAgICBib29sIGRpYWcgPSB0cnVlOwogCQkgICAgaWYgKHN0 cmljdCkKIAkJICAgICAgZXJyb3JfYXQgKGNwX2V4cHJfbG9jX29yX2lucHV0X2xvYyAodCksCmRp ZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2crKy5kZy9jcHAweC9kZWZhdWx0ZWQzLkMgYi9nY2Mv dGVzdHN1aXRlL2crKy5kZy9jcHAweC9kZWZhdWx0ZWQzLkMKaW5kZXggNzVlODljOGZmMGMuLjMz ZGU5NzNhMWZhIDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2crKy5kZy9jcHAweC9kZWZhdWx0 ZWQzLkMKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMHgvZGVmYXVsdGVkMy5DCkBAIC00 LDcgKzQsNyBAQAogdGVtcGxhdGU8Y2xhc3MgVD4KIHN0cnVjdCBBIHsKICAgdGVtcGxhdGU8Y2xh c3MgVT4KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEE8VT4mKSA9IGRlbGV0ZTsgLy8geyBkZy1t ZXNzYWdlICJkZWNsYXJlZCIgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgQTxVPiYpIGNvbnN0 ID0gZGVsZXRlOyAvLyB7IGRnLW1lc3NhZ2UgImRlY2xhcmVkIiB9CiAgIG9wZXJhdG9yIGJvb2wg KCkgeyByZXR1cm4gdHJ1ZTsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nKysu ZGcvY3BwMmEvYml0LWNhc3Q3LkMgYi9nY2MvdGVzdHN1aXRlL2crKy5kZy9jcHAyYS9iaXQtY2Fz dDcuQwppbmRleCA0YTNjNjgyMDA3MC4uNjkyN2RiM2M5NjEgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0 c3VpdGUvZysrLmRnL2NwcDJhL2JpdC1jYXN0Ny5DCisrKyBiL2djYy90ZXN0c3VpdGUvZysrLmRn L2NwcDJhL2JpdC1jYXN0Ny5DCkBAIC0xNiw3ICsxNiw3IEBAIHN0cnVjdCBKCiBzdHJ1Y3QgSwog ewogICBsb25nIGludCBhLCBiIDogMTEsIGM7Ci0gIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yID09 IChjb25zdCBLICZ4KQorICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgSyAmeCkg Y29uc3QKICAgewogICAgIHJldHVybiBhID09IHguYSAmJiBiID09IHguYiAmJiBjID09IHguYzsK ICAgfQpAQCAtMjksNyArMjksNyBAQCBzdHJ1Y3QgTAogc3RydWN0IE0KIHsKICAgbG9uZyBsb25n IGludCBhLCBiIDogMTEsIGM7Ci0gIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yID09IChjb25zdCBN ICZ4KQorICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgTSAmeCkgY29uc3QKICAg ewogICAgIHJldHVybiBhID09IHguYSAmJiBiID09IHguYiAmJiBjID09IHguYzsKICAgfQpkaWZm IC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEvc3BhY2VzaGlwLWVxMTUuQyBiL2dj Yy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL3NwYWNlc2hpcC1lcTE1LkMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmRjNTA5NTYzMTQwCi0tLSAvZGV2L251bGwKKysrIGIv Z2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEvc3BhY2VzaGlwLWVxMTUuQwpAQCAtMCwwICsxLDIw OCBAQAorLy8gUDI0NjhSMiAtIFRoZSBFcXVhbGl0eSBPcGVyYXRvciBZb3UgQXJlIExvb2tpbmcg Rm9yCisvLyB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgYysrMjAgfSB9CisKK3N0cnVjdCBBIHsK KyAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBBICYpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBv cGVyYXRvciE9IChjb25zdCBBICYpIHsgcmV0dXJuIGZhbHNlOyB9Cit9OworYm9vbCBhID0gQXt9 ICE9IEF7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQiB7CisgIGJvb2wgb3Bl cmF0b3I9PSAoY29uc3QgVCAmKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9IChjb25zdCBUICYp IGNvbnN0OworfTsKK3N0cnVjdCBCMSA6IEI8QjE+IHsgfTsKK2Jvb2wgYjEgPSBCMXt9ID09IEIx e307Citib29sIGIyID0gQjF7fSAhPSBCMXt9OworCit0ZW1wbGF0ZSA8Ym9vbD4KK3N0cnVjdCBD IHsKKyAgdXNpbmcgQzEgPSBDPHRydWU+OworICB1c2luZyBDMiA9IEM8ZmFsc2U+OworICBDICgp ID0gZGVmYXVsdDsKKyAgQyAoY29uc3QgQzIgJik7CisgIGJvb2wgb3BlcmF0b3I9PSAoQzEpIGNv bnN0OworICBib29sIG9wZXJhdG9yIT0gKEMxKSBjb25zdDsKK307Cit1c2luZyBDMyA9IEM8ZmFs c2U+OworYm9vbCBjID0gQzN7fSA9PSBDM3t9OworCitzdHJ1Y3QgRCB7CisgIEQgKCk7CisgIEQg KGludCAqKTsKKyAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBEICYpIGNvbnN0OwkvLyB7IGRnLW1l c3NhZ2UgImNhbmRpZGF0ZTogJ2Jvb2wgRDo6b3BlcmF0b3I9PVxcXChjb25zdCBEJlxcXCkgY29u c3QnIFxcXChyZXZlcnNlZFxcXCkiIH0KKyAgb3BlcmF0b3IgaW50ICogKCkgY29uc3Q7Cit9Owor Ym9vbCBkID0gbnVsbHB0ciAhPSBEe307CS8vIHsgZGctZXJyb3IgImFtYmlndW91cyBvdmVybG9h ZCBmb3IgJ29wZXJhdG9yIT0nIGluICdudWxscHRyICE9IERcXFwoXFxcKScgXFxcKG9wZXJhbmQg dHlwZXMgYXJlICdzdGQ6Om51bGxwdHJfdCcgYW5kICdEJ1xcXCkiIH0KKwkJCQkvLyB7IGRnLW1l c3NhZ2UgImNhbmRpZGF0ZTogJ29wZXJhdG9yIT1cXFwoaW50XFxcKiwgaW50XFxcKlxcXCknIFxc XChidWlsdC1pblxcXCkiICIiIHsgdGFyZ2V0ICotKi0qIH0gLi0xIH0KKwordXNpbmcgdWJvb2wg PSB1bnNpZ25lZCBjaGFyOworCitzdHJ1Y3QgRSB7CisgIG9wZXJhdG9yIGJvb2wgKCkgY29uc3Q7 Cit9OwordW5zaWduZWQgY2hhciBvcGVyYXRvcj09IChFLCBFKTsvLyB7IGRnLW1lc3NhZ2UgImNh bmRpZGF0ZTogJ3Vuc2lnbmVkIGNoYXIgb3BlcmF0b3I9PVxcXChFLCBFXFxcKSciIH0KKwkJCQkv LyB7IGRnLW1lc3NhZ2UgIm5vIGtub3duIGNvbnZlcnNpb24gZm9yIGFyZ3VtZW50IDEgZnJvbSAn aW50JyB0byAnRSciICIiIHsgdGFyZ2V0ICotKi0qIH0gLi0xIH0KK3Vuc2lnbmVkIGNoYXIgZSA9 IEV7fSAhPSBFe307CS8vIHsgZGctZXJyb3IgInJldHVybiB0eXBlIG9mICd1bnNpZ25lZCBjaGFy IG9wZXJhdG9yPT1cXFwoRSwgRVxcXCknIGlzIG5vdCAnYm9vbCciIH0KKwkJCQkvLyB7IGRnLW1l c3NhZ2UgInVzZWQgYXMgcmV3cml0dGVuIGNhbmRpZGF0ZSBmb3IgY29tcGFyaXNvbiBvZiAnRScg YW5kICdFJyIgIiIgeyB0YXJnZXQgKi0qLSogfSAuLTEgfQorCisvLyBGLUggYXJlIHRoZSB0ZXN0 Y2FzZSBmcm9tIFtvdmVyLm1hdGNoLm9wZXJdCitzdHJ1Y3QgRiB7fTsKK3RlbXBsYXRlIDx0eXBl bmFtZSBUPgorYm9vbCBvcGVyYXRvcj09IChGLCBUKTsJCS8vIHsgZGctbWVzc2FnZSAiY2FuZGlk YXRlOiAndGVtcGxhdGU8Y2xhc3MgVD4gYm9vbCBvcGVyYXRvcj09XFxcKEYsIFRcXFwpJyIgfQor CQkJCS8vIHsgZGctbWVzc2FnZSAidGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uL3N1YnN0aXR1 dGlvbiBmYWlsZWQ6IiAiIiB7IHRhcmdldCAqLSotKiB9IC4tMSB9Citib29sIGYxID0gMCA9PSBG ICgpOwkJLy8gT0ssIGNhbGxzIHJldmVyc2VkID09Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jv b2wgb3BlcmF0b3IhPSAoRiwgVCk7Citib29sIGYyID0gMCA9PSBGICgpOwkJLy8geyBkZy1lcnJv ciAibm8gbWF0Y2ggZm9yICdvcGVyYXRvcj09JyBpbiAnMCA9PSBGXFxcKFxcXCknIFxcXChvcGVy YW5kIHR5cGVzIGFyZSAnaW50JyBhbmQgJ0YnXFxcKSIgfQorCQkJCS8vIHsgZGctbWVzc2FnZSAi Y2Fubm90IGNvbnZlcnQgJzAnIFxcXCh0eXBlICdpbnQnXFxcKSB0byB0eXBlICdGJyIgIiIgeyB0 YXJnZXQgKi0qLSogfSAuLTEgfQorCitzdHJ1Y3QgRyB7CisgIGJvb2wgb3BlcmF0b3I9PSAoY29u c3QgRyAmKTsKK307CitzdHJ1Y3QgRzEgOiBHIHsKKyAgRzEgKCk7CisgIEcxIChHKTsKKyAgYm9v bCBvcGVyYXRvciE9IChjb25zdCBHICYpOworfTsKK2Jvb2wgZzEgPSBHICgpID09IEcxICgpOwkv LyBPSywgIT0gcHJldmVudHMgcmV3cml0ZQorYm9vbCBnMiA9IEcxICgpID09IEcgKCk7CS8vIHsg ZGctZXJyb3IgImFtYmlndW91cywgZXZlbiB0aG91Z2ggdGhlIHNlY29uZCBpcyByZXZlcnNlZCIg fQorCitzdHJ1Y3QgSCB7fTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBvcGVyYXRvcj09 IChILCBUKTsKK2lubGluZSBuYW1lc3BhY2UgSDEgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4K KyAgYm9vbCBvcGVyYXRvciE9IChILCBUKTsKK30KKy8vIFtvdmVyLm1hdGNoLm9wZXJdIGN1cnJl bnRseSBzYXlzIHRoYXQgdGhpcyBpcyBPSyBiZWNhdXNlIHRoZSBpbmxpbmUKKy8vIG5hbWVzcGFj ZSBpc24ndCBzZWFyY2hlZCwgYnV0IHRoYXQgc2VlbXMgd3JvbmcgdG8gbWUsIHNvIEknbSBnb2lu ZyB0byBnbworLy8gYWhlYWQgYW5kIHNlYXJjaCBpdCBmb3Igbm93LiAgUmVtb3ZlIHRoZSAiMCAm JiIgaW4gYWRkX2NhbmRpZGF0ZXMgdG8KKy8vIGNoYW5nZSB0aGlzIHRvIHRoZSBjdXJyZW50bHkg c3BlY2lmaWVkIGJlaGF2aW9yLgorLy8geyBkZy1lcnJvciAibm8gbWF0Y2giICIiIHsgdGFyZ2V0 ICotKi0qIH0gLisxIH0KK2Jvb2wgaCA9IDAgPT0gSCAoKTsJCS8vIE9LLCBjYWxscyByZXZlcnNl ZCA9PQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBJIHsKKyAgaW50IG9wZXJhdG9yPT0g KGNvbnN0IGRvdWJsZSAmKSBjb25zdDsKKyAgZnJpZW5kIGlubGluZSBpbnQgb3BlcmF0b3I9PSAo Y29uc3QgZG91YmxlICYsIGNvbnN0IFQgJikgeyByZXR1cm4gMTsgfQorfTsKK3N0cnVjdCBJMSA6 IEk8STE+IHsgfTsKK2Jvb2wgaSA9IEkxe30gPT0gMC47CQkvLyB7IGRnLWVycm9yICJyZXR1cm4g dHlwZSBvZiAnaW50IG9wZXJhdG9yPT1cXFwoY29uc3QgZG91YmxlJiwgY29uc3QgSTEmXFxcKScg aXMgbm90ICdib29sJyIgfQorCQkJCS8vIHsgZGctbWVzc2FnZSAidXNlZCBhcyByZXdyaXR0ZW4g Y2FuZGlkYXRlIGZvciBjb21wYXJpc29uIG9mICdJMScgYW5kICdkb3VibGUnIiAiIiB7IHRhcmdl dCAqLSotKiB9IC4tMSB9CisKK3N0cnVjdCBKIHsKKyAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBK ICYpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IEogJikgY29uc3Q7Cit9Oworc3Ry dWN0IEoxIDogSiB7CisgIEoxIChjb25zdCBKICYpOworICBib29sIG9wZXJhdG9yPT0gKGNvbnN0 IEoxICZ4KSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IEogJj4gKCp0aGlz KSA9PSB4OwkvLyB7IGRnLWVycm9yICJhbWJpZ3VvdXMgb3ZlcmxvYWQgZm9yICdvcGVyYXRvcj09 JyBpbiAnXFxcKlxcXChjb25zdCBKXFxcKlxcXClcXFwoXFxcKGNvbnN0IEoxXFxcKlxcXCl0aGlz XFxcKSA9PSB4JyBcXFwob3BlcmFuZCB0eXBlcyBhcmUgJ2NvbnN0IEonIGFuZCAnY29uc3QgSjEn XFxcKSIgfQorICB9Cit9OworCitzdHJ1Y3QgSyB7CisgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3Qg SyAmKTsKK307Citib29sIGsgPSBLe30gPT0gS3t9OwkJLy8geyBkZy1lcnJvciAiYW1iaWd1b3Vz LCBldmVuIHRob3VnaCB0aGUgc2Vjb25kIGlzIHJldmVyc2VkIiB9CisKK3N0cnVjdCBMIHsKKyAg Ym9vbCBvcGVyYXRvcj09IChjb25zdCBMICYpIGNvbnN0OworfTsKK2Jvb2wgbCA9IEx7fSA9PSBM e307CisKK3N0cnVjdCBNIHsKKyAgYm9vbCBvcGVyYXRvcj09IChNKTsKK307Citib29sIG0gPSBN ICgpID09IE0gKCk7CisKK3N0cnVjdCBOIHsKKyAgdmlydHVhbCBib29sIG9wZXJhdG9yPT0gKGNv bnN0IE4gJikgY29uc3Q7Cit9Oworc3RydWN0IE4xIDogTiB7CisgIGJvb2wgb3BlcmF0b3I9PSAo Y29uc3QgTiAmKSBjb25zdCBvdmVycmlkZTsKK307Citib29sIG4gPSBOMSAoKSA9PSBOMSAoKTsJ Ly8geyBkZy1lcnJvciAiYW1iaWd1b3VzLCBldmVuIHRob3VnaCB0aGUgc2Vjb25kIGlzIHJldmVy c2VkIiB9CisKK3N0cnVjdCBPIHsKKyAgdmlydHVhbCBzaWduZWQgY2hhciBvcGVyYXRvcj09IChj b25zdCBPICYpIGNvbnN0OworICBzaWduZWQgY2hhciBvcGVyYXRvciE9IChjb25zdCBPICZ4KSBj b25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSAoeCk7IH0KK307CitzdHJ1Y3QgTzEgOiBPIHsKKyAg c2lnbmVkIGNoYXIgb3BlcmF0b3I9PSAoY29uc3QgTyAmKSBjb25zdCBvdmVycmlkZTsKK307Citi b29sIG8gPSBPMSAoKSAhPSBPMSAoKTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sCitmb28g KFQgeCwgVCB5KQorcmVxdWlyZXMgcmVxdWlyZXMgeyB4ID09IHk7IH0KK3sKKyAgcmV0dXJuIHgg PT0geTsKK30KK2Jvb2wgYjMgPSBmb28gKEIxICgpLCBCMSAoKSk7CisKK3N0cnVjdCBQIHt9Owor dGVtcGxhdGUgPHR5cGVuYW1lIFQsIGNsYXNzIFUgPSBpbnQ+Citib29sIG9wZXJhdG9yPT0gKFAs IFQpOwordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yIT0gKFAsIFQpOworYm9vbCBw ID0gMCA9PSBQICgpOworCitzdHJ1Y3QgUSB7fTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9v bCBvcGVyYXRvcj09IChRLCBUKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBVPgorYm9vbCBvcGVyYXRv ciE9IChRLCBVKTsKK2Jvb2wgcSA9IDAgPT0gUSAoKTsJCS8vIHsgZGctZXJyb3IgIiIgfQorCitz dHJ1Y3QgUiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIG9wZXJhdG9yPT0gKGNv bnN0IFQgJik7Cit9OworYm9vbCByID0gUiAoKSA9PSBSICgpOwkJLy8geyBkZy1lcnJvciAiYW1i aWd1b3VzLCBldmVuIHRob3VnaCB0aGUgc2Vjb25kIGlzIHJldmVyc2VkIiB9CisKK3N0cnVjdCBT IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgVCAm KSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvciE9IChjb25zdCBTICYpOworfTsKK2Jvb2wgcyA9IFMg KCkgPT0gUyAoKTsKKworc3RydWN0IFQge307Cit0ZW1wbGF0ZSA8Y2xhc3MgVSA9IGludD4KK2Jv b2wgb3BlcmF0b3I9PSAoVCwgaW50KTsKK2Jvb2wgb3BlcmF0b3IhPSAoVCwgaW50KTsKK2Jvb2wg dCA9IDAgPT0gVCAoKTsKKworc3RydWN0IFUge307Citib29sIG9wZXJhdG9yPT0gKFUsIGludCk7 Citib29sIHUxID0gMCA9PSBVICgpOworbmFtZXNwYWNlIFUxIHsgYm9vbCBvcGVyYXRvciE9IChV LCBpbnQpOyB9Citib29sIHUyID0gMCA9PSBVICgpOwordXNpbmcgVTE6Om9wZXJhdG9yIT07Citi b29sIHUzID0gMCA9PSBVICgpOwkJLy8geyBkZy1lcnJvciAiIiB9CisKK3N0cnVjdCBWIHt9Owor dGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIG9wZXJhdG9yPT0gKFYsIFQpOworYm9vbCB2MSA9 IDAgPT0gViAoKTsKK25hbWVzcGFjZSBWMSB7IHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9w ZXJhdG9yIT0gKFYsIFQpOyB9Citib29sIHYyID0gMCA9PSBWICgpOwordXNpbmcgVjE6Om9wZXJh dG9yIT07Citib29sIHYzID0gMCA9PSBWICgpOwkJLy8geyBkZy1lcnJvciAiIiB9CisKK3RlbXBs YXRlIDxpbnQgTj4KK3N0cnVjdCBXIHsKK2Jvb2wgb3BlcmF0b3I9PSAoaW50KSByZXF1aXJlcyAo TiA9PSAxKTsKK2Jvb2wgb3BlcmF0b3IhPSAoaW50KSByZXF1aXJlcyAoTiA9PSAyKTsKK307Citp bnQgdyA9IDAgPT0gVzwxPiAoKTsKKworc3RydWN0IFggeworICBib29sIG9wZXJhdG9yPT0gKFgg Y29uc3QgJik7CisgIHN0YXRpYyBib29sIG9wZXJhdG9yIT0gKFggY29uc3QgJiwgWCBjb25zdCAm KTsJLy8geyBkZy1lcnJvciAiJ3N0YXRpYyBib29sIFg6Om9wZXJhdG9yIT1cXFwoY29uc3QgWCYs IGNvbnN0IFgmXFxcKScgbXVzdCBiZSBlaXRoZXIgYSBub24tc3RhdGljIG1lbWJlciBmdW5jdGlv biBvciBhIG5vbi1tZW1iZXIgZnVuY3Rpb24iIH0KK307Citib29sIHggPSBYICgpID09IFggKCk7 CQkvLyB7IGRnLWVycm9yICJhbWJpZ3VvdXMsIGV2ZW4gdGhvdWdoIHRoZSBzZWNvbmQgaXMgcmV2 ZXJzZWQiIH0KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL3NwYWNlc2hp cC1yZXdyaXRlMS5DIGIvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEvc3BhY2VzaGlwLXJld3Jp dGUxLkMKaW5kZXggYzQwMzBjZDJmNGQuLmViZTgxZTRiNWU5IDEwMDY0NAotLS0gYS9nY2MvdGVz dHN1aXRlL2crKy5kZy9jcHAyYS9zcGFjZXNoaXAtcmV3cml0ZTEuQworKysgYi9nY2MvdGVzdHN1 aXRlL2crKy5kZy9jcHAyYS9zcGFjZXNoaXAtcmV3cml0ZTEuQwpAQCAtMTEsNSArMTEsNSBAQCBp bnQgbWFpbigpCiB7CiAgIEE8aW50PiBhMTsKICAgQTx2b2lkPiBhMjsKLSAgcmV0dXJuIGExID09 IGEyOworICByZXR1cm4gYTEgPT0gYTI7IC8vIHsgZGctZXJyb3IgImFtYmlndW91cywgZXZlbiB0 aG91Z2ggdGhlIHNlY29uZCBpcyByZXZlcnNlZCIgfQogfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3Rz dWl0ZS9nKysuZGcvY3BwMmEvc3BhY2VzaGlwLXJld3JpdGU1LkMgYi9nY2MvdGVzdHN1aXRlL2cr Ky5kZy9jcHAyYS9zcGFjZXNoaXAtcmV3cml0ZTUuQwppbmRleCBkMDQyNDM3N2U4ZS4uNDYwZjYz MzI5MzggMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL3NwYWNlc2hpcC1y ZXdyaXRlNS5DCisrKyBiL2djYy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL3NwYWNlc2hpcC1yZXdy aXRlNS5DCkBAIC0xMiw0ICsxMiw0IEBAIHN0cnVjdCBBIHsKIAogQTxjb25zdCBpbnQ+IGE7CiBB PGludD4gYjsKLWF1dG8gYyA9IChhID09IGIpOworYXV0byBjID0gKGEgPT0gYik7IC8vIHsgZGct ZXJyb3IgImFtYmlndW91cywgZXZlbiB0aG91Z2ggdGhlIHNlY29uZCBpcyByZXZlcnNlZCIgIiIg eyB0YXJnZXQgYysrMjAgfSB9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2crKy5vbGQtZGVq YS9nKysuamFzb24vYnl2YWwyLkMgYi9nY2MvdGVzdHN1aXRlL2crKy5vbGQtZGVqYS9nKysuamFz b24vYnl2YWwyLkMKaW5kZXggNDBiZjJhMzY1MjguLjA1NzUxMDllZDFhIDEwMDY0NAotLS0gYS9n Y2MvdGVzdHN1aXRlL2crKy5vbGQtZGVqYS9nKysuamFzb24vYnl2YWwyLkMKKysrIGIvZ2NjL3Rl c3RzdWl0ZS9nKysub2xkLWRlamEvZysrLmphc29uL2J5dmFsMi5DCkBAIC0xOCw2ICsxOCw2IEBA IGlubGluZSAgY2hhciAgb3BlcmF0b3IgPT0gKGNvbnN0IENoYXIgICAgYSwgY29uc3QgY2hhciBi KSB7IHJldHVybiAwOyB9CiAKIGNoYXIgbXlzdHJjbXAoQ2hhciBzWzMxXSwgQ2hhciB0WzMxXSkK IHsKLSAgZm9yICg7ICpzID09ICp0OyArK3MsICsrdCkgaWYgKCpzID09ICdcMCcpIHJldHVybiAw OworICBmb3IgKDsgKnMgPT0gKnQ7ICsrcywgKyt0KSBpZiAoKnMgPT0gJ1wwJykgcmV0dXJuIDA7 IC8vIHsgZGctZXJyb3IgInJldmVyc2VkIiAiIiB7IHRhcmdldCBjKysyMCB9IH0KICAgcmV0dXJu IGNoYXIoKnMgLSAqdCk7CiB9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2crKy5vbGQtZGVq YS9nKysub3RoZXIvb3ZlcmxvYWQxMy5DIGIvZ2NjL3Rlc3RzdWl0ZS9nKysub2xkLWRlamEvZysr Lm90aGVyL292ZXJsb2FkMTMuQwppbmRleCA1NGFiNDA0YWYxMS4uZjU5YmQ0YTQ5YzMgMTAwNjQ0 Ci0tLSBhL2djYy90ZXN0c3VpdGUvZysrLm9sZC1kZWphL2crKy5vdGhlci9vdmVybG9hZDEzLkMK KysrIGIvZ2NjL3Rlc3RzdWl0ZS9nKysub2xkLWRlamEvZysrLm90aGVyL292ZXJsb2FkMTMuQwpA QCAtMiw3ICsyLDcgQEAKIC8vIE9yaWdpbjogTmF0aGFuIFNpZHdlbGwgPG5hdGhhbkBjb2Rlc291 cmNlcnkuY29tPgogCiBzdHJ1Y3QgQSB7Ci0gIGJvb2wgb3BlcmF0b3I9PSAoQSBjb25zdCAmKTsK KyAgYm9vbCBvcGVyYXRvcj09IChBIGNvbnN0ICYpIGNvbnN0OwogICBvcGVyYXRvciBib29sICgp IGNvbnN0OwogICBvcGVyYXRvciBpbnQgKiAoKSBjb25zdDsKIH07CmRpZmYgLS1naXQgYS9saWJz dGRjKystdjMvdGVzdHN1aXRlLzE4X3N1cHBvcnQvY29tcGFyaXNvbnMvYWxnb3JpdGhtcy9mYWxs YmFjay5jYyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMThfc3VwcG9ydC9jb21wYXJpc29ucy9h bGdvcml0aG1zL2ZhbGxiYWNrLmNjCmluZGV4IDA1ZTFiZjc3NzVlLi44YmY3OGZhZjIzMiAxMDA2 NDQKLS0tIGEvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8xOF9zdXBwb3J0L2NvbXBhcmlzb25zL2Fs Z29yaXRobXMvZmFsbGJhY2suY2MKKysrIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8xOF9zdXBw b3J0L2NvbXBhcmlzb25zL2FsZ29yaXRobXMvZmFsbGJhY2suY2MKQEAgLTMxLDEyICszMSwxMiBA QCB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgogCiB1c2luZyBhZGw6OlM7CiAKLXN0 YXRpY19hc3NlcnQoIGhhc19zdHJvbmdfb3JkZXJfZmFsbGJhY2s8UywgUz4gKTsKK3N0YXRpY19h c3NlcnQoICEgaGFzX3N0cm9uZ19vcmRlcl9mYWxsYmFjazxTLCBTPiApOwogc3RhdGljX2Fzc2Vy dCggaGFzX3N0cm9uZ19vcmRlcl9mYWxsYmFjazxjb25zdCBTLCBTPiApOwogc3RhdGljX2Fzc2Vy dCggISBoYXNfc3Ryb25nX29yZGVyX2ZhbGxiYWNrPGNvbnN0IFMsIGNvbnN0IFM+ICk7Ci1zdGF0 aWNfYXNzZXJ0KCBoYXNfd2Vha19vcmRlcl9mYWxsYmFjazxTLCBTPiApOworc3RhdGljX2Fzc2Vy dCggISBoYXNfd2Vha19vcmRlcl9mYWxsYmFjazxTLCBTPiApOwogc3RhdGljX2Fzc2VydCggaGFz X3dlYWtfb3JkZXJfZmFsbGJhY2s8Y29uc3QgUywgUz4gKTsKIHN0YXRpY19hc3NlcnQoICEgaGFz X3dlYWtfb3JkZXJfZmFsbGJhY2s8Y29uc3QgUywgY29uc3QgUz4gKTsKLXN0YXRpY19hc3NlcnQo IGhhc19wYXJ0aWFsX29yZGVyX2ZhbGxiYWNrPFMsIFM+ICk7CitzdGF0aWNfYXNzZXJ0KCAhIGhh c19wYXJ0aWFsX29yZGVyX2ZhbGxiYWNrPFMsIFM+ICk7CiBzdGF0aWNfYXNzZXJ0KCAhIGhhc19w YXJ0aWFsX29yZGVyX2ZhbGxiYWNrPGNvbnN0IFMsIFM+ICk7IC8vIExXRyAzNDY1CiBzdGF0aWNf YXNzZXJ0KCAhIGhhc19wYXJ0aWFsX29yZGVyX2ZhbGxiYWNrPGNvbnN0IFMsIGNvbnN0IFM+ICk7 Ci0tIAoyLjMxLjEKCg== --------------8hFv0l6loIRoW9mh3O44bXOp--