From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9363 invoked by alias); 16 Jul 2019 06:35:26 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 9349 invoked by uid 89); 16 Jul 2019 06:35:26 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.4 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.1 spammy=transitional, Middle, jia, Jia X-HELO: mx0a-001b2d01.pphosted.com Received: from mx0a-001b2d01.pphosted.com (HELO mx0a-001b2d01.pphosted.com) (148.163.156.1) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 16 Jul 2019 06:35:21 +0000 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x6G6WfGk092796 for ; Tue, 16 Jul 2019 02:35:18 -0400 Received: from e06smtp05.uk.ibm.com (e06smtp05.uk.ibm.com [195.75.94.101]) by mx0a-001b2d01.pphosted.com with ESMTP id 2ts5t787ks-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 16 Jul 2019 02:35:18 -0400 Received: from localhost by e06smtp05.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 16 Jul 2019 07:35:16 +0100 Received: from b06avi18878370.portsmouth.uk.ibm.com (9.149.26.194) by e06smtp05.uk.ibm.com (192.168.101.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Tue, 16 Jul 2019 07:35:13 +0100 Received: from d06av24.portsmouth.uk.ibm.com (d06av24.portsmouth.uk.ibm.com [9.149.105.60]) by b06avi18878370.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id x6G6ZCqX33030466 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 16 Jul 2019 06:35:12 GMT Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 455A942045; Tue, 16 Jul 2019 06:35:12 +0000 (GMT) Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DF13642047; Tue, 16 Jul 2019 06:35:08 +0000 (GMT) Received: from hljs-mbp.cn.ibm.com (unknown [9.200.157.132]) by d06av24.portsmouth.uk.ibm.com (Postfix) with ESMTP; Tue, 16 Jul 2019 06:35:08 +0000 (GMT) Subject: Re: [PATCH][middle-end/88784] Middle end is missing some optimizations about unsigned To: Richard Biener Cc: Andrew Pinski , Jeff Law , GCC Patches , Segher Boessenkool , wschmidt@linux.ibm.com References: <1561615913-22109-1-git-send-email-helijia@linux.ibm.com> <6fb28248-5134-cec5-5045-45253e4d2eb0@redhat.com> <6d333ccf-9905-e929-c2dc-fc611ff929f1@linux.ibm.com> From: Li Jia He Date: Tue, 16 Jul 2019 06:54:00 -0000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Thunderbird/60.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------A02EBFEF83A8DCAF1C263DB5" x-cbid: 19071606-0020-0000-0000-00000353F0BF X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 19071606-0021-0000-0000-000021A7BB23 Message-Id: <845bc280-7bd6-509b-3830-4ebde50f1b20@linux.ibm.com> X-IsSubscribed: yes X-SW-Source: 2019-07/txt/msg01082.txt.bz2 This is a multi-part message in MIME format. --------------A02EBFEF83A8DCAF1C263DB5 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-length: 8719 On 2019/7/2 4:51 PM, Richard Biener wrote: > On Tue, 2 Jul 2019, Richard Biener wrote: > >> On Tue, 2 Jul 2019, Li Jia He wrote: >> >>> >>> >>> On 2019/7/1 3:30 PM, Richard Biener wrote: >>>> On Fri, 28 Jun 2019, Andrew Pinski wrote: >>>> >>>>> On Thu, Jun 27, 2019 at 9:55 PM Li Jia He wrote: >>>>>> >>>>>> >>>>>> >>>>>> On 2019/6/27 11:48 PM, Jeff Law wrote: >>>>>>> On 6/27/19 12:11 AM, Li Jia He wrote: >>>>>>>> Hi, >>>>>>>> >>>>>>>> According to the optimizable case described by Qi Feng on >>>>>>>> issue 88784, we can combine the cases into the following: >>>>>>>> >>>>>>>> 1. x > y && x != XXX_MIN --> x > y >>>>>>>> 2. x > y && x == XXX_MIN --> false >>>>>>>> 3. x <= y && x == XXX_MIN --> x == XXX_MIN >>>>>>>> >>>>>>>> 4. x < y && x != XXX_MAX --> x < y >>>>>>>> 5. x < y && x == XXX_MAX --> false >>>>>>>> 6. x >= y && x == XXX_MAX --> x == XXX_MAX >>>>>>>> >>>>>>>> 7. x > y || x != XXX_MIN --> x != XXX_MIN >>>>>>>> 8. x <= y || x != XXX_MIN --> true >>>>>>>> 9. x <= y || x == XXX_MIN --> x <= y >>>>>>>> >>>>>>>> 10. x < y || x != XXX_MAX --> x != UXXX_MAX >>>>>>>> 11. x >= y || x != XXX_MAX --> true >>>>>>>> 12. x >= y || x == XXX_MAX --> x >= y >>>>>>>> >>>>>>>> Note: XXX_MIN represents the minimum value of type x. >>>>>>>> XXX_MAX represents the maximum value of type x. >>>>>>>> >>>>>>>> Here we don't need to care about whether the operation is >>>>>>>> signed or unsigned. For example, in the below equation: >>>>>>>> >>>>>>>> 'x > y && x != XXX_MIN --> x > y' >>>>>>>> >>>>>>>> If the x type is signed int and XXX_MIN is INT_MIN, we can >>>>>>>> optimize it to 'x > y'. However, if the type of x is unsigned >>>>>>>> int and XXX_MIN is 0, we can still optimize it to 'x > y'. >>>>>>>> >>>>>>>> The regression testing for the patch was done on GCC mainline on >>>>>>>> >>>>>>>> powerpc64le-unknown-linux-gnu (Power 9 LE) >>>>>>>> >>>>>>>> with no regressions. Is it OK for trunk ? >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Lijia He >>>>>>>> >>>>>>>> gcc/ChangeLog >>>>>>>> >>>>>>>> 2019-06-27 Li Jia He >>>>>>>> Qi Feng >>>>>>>> >>>>>>>> PR middle-end/88784 >>>>>>>> * gimple-fold.c (and_comparisons_contain_equal_operands): New >>>>>>>> function. >>>>>>>> (and_comparisons_1): Use >>>>>>>> and_comparisons_contain_equal_operands. >>>>>>>> (or_comparisons_contain_equal_operands): New function. >>>>>>>> (or_comparisons_1): Use or_comparisons_contain_equal_operands. >>>>>>> Would this be better done via match.pd? ISTM this transformation >>>>>>> would >>>>>>> be well suited for that framework. >>>>>> >>>>>> Hi, Jeff >>>>>> >>>>>> I did this because of the following test case: >>>>>> ` >>>>>> _Bool comp(unsigned x, unsigned y) >>>>>> { >>>>>> return x > y && x != 0; >>>>>> } >>>>>> ` >>>>>> The gimple file dumped on the power platform is: >>>>>> ` >>>>>> comp (unsigned int x, unsigned int y) >>>>>> { >>>>>> _Bool D.2837; >>>>>> int iftmp.0; >>>>>> >>>>>> if (x > y) goto ; else goto ; >>>>>> : >>>>>> if (x != 0) goto ; else goto ; >>>>>> : >>>>>> iftmp.0 = 1; >>>>>> goto ; >>>>>> : >>>>>> iftmp.0 = 0; >>>>>> : >>>>>> D.2837 = (_Bool) iftmp.0; >>>>>> return D.2837; >>>>>> } >>>>>> ` >>>>>> However, the gimple file dumped on x86 is >>>>>> ` >>>>>> comp (unsigned int x, unsigned int y) >>>>>> { >>>>>> _Bool D.2837; >>>>>> >>>>>> _1 = x > y; >>>>>> _2 = x != 0; >>>>>> _3 = _1 & _2; >>>>>> _4 = (int) _3; >>>>>> D.2837 = (_Bool) _4; >>>>>> return D.2837; >>>>>> } >>>>>> ` >>>>>> >>>>>> The reason for the inconsistency between these two behaviors is param >>>>>> logical-op-non-short-circuit. If we add the pattern to the match.pd >>>>>> file, we can only optimize the situation in which the statement is in >>>>>> the same basic block (logical-op-non-short-circuit=1, x86). But for >>>>>> a cross-basic block (logical-op-non-short-circuit=0, power), match.pd >>>>>> can't handle this situation. >>>>>> >>>>>> Another reason is that I found out maybe_fold_and_comparisons and >>>>>> maybe_fold_or_comparisons are not only called by ifcombine pass but >>>>>> also by reassoc pass. Using this method can basically unify param >>>>>> logical-op-non-short-circuit=0 or 1. >>>>> >>>>> >>>>> As mentioned before ifcombine pass should be using gimple-match >>>>> instead of fold_build. Try converting ifcombine over to gimple-match >>>>> infrastructure and add these to match.pd. >>>> >>>> Yes, I mentioned that in the PR. The issue is that at the moment >>>> to combine x > y with x <= y you'd have to build GENERIC trees >>>> for both or temporary GIMPLE assign with a SSA def (and then feed >>>> that into the GENERIC or GIMPLE match.pd path). >>> >>> Hi, >>> >>> I did some experimentation using ‘temporary GIMPLE with a SSA def (and then >>> feed that into the GIMPLE match.pd path’. Could we consider the code in the >>> attachment(I did a test and the code took effect)? >> >> No, that's excessive overhead IMHO - the whole point of these functions >> originally was to avoid build2 (...) on both conditionals. If we >> now create two SSA names and two GIMPLE statements that's too much. >> >> As said it shouldn't be rocket science to teach genmatch to >> auto-generate those functions from match.pd patterns but it certainly >> is some work (less so for somebody with genmatch knowledge). >> I'll give it a poke... > > OK, it's not so easy. I guess we could lower the cost of building > SSA names / gimple stmts significantly if we allocated them on the > stack like via > > gimple *stmt1 = XALLOCAVEC (char, gimple_size (GIMPLE_ASSIGN) + 2 * > sizeof (tree)); > memset (stmt1, 0, ...); > gimple_set_code (stmt1, GIMPLE_ASSIGN); > gimple_set_num_ops (stmt1, 3); > gimple_init_singleton (stmt1); > > gimple_stmt_iterator gsi = gsi_for_stmt (stmt1); > gimple_assign_set_rhs_with_ops (&gsi, actual operation...); > > tree lhs1 = XALLOCA (tree_ssa_name); > memset (lhs1, 0, sizeof (tree_ssa_name)); > TREE_SET_CODE (lhs1, SSA_NAME); > TREE_TYPE (lhs1) = ...; > > gimple_assing_set_lhs (stmt1, lhs1); > > it's all a bit ugly and some factoring in the generic gimple machinery > might easen this kind of hacks, but well... > > With the above you could then use > > gimple_match_op op (gimple_match_cond::UNCOND, BIT_AND_EXPR /* or OR */, > boolean_type_node, lhs1, lhs2); > if (gimple_resimplify2 (NULL, &op, follow_all_ssa_edges)) > ... successfully simplified into 'op' ... > > with the simplification path then extracting the simplified result > from 'op'. Note this deliberately leaves out passing a gimple_seq > as storage for more complex simplification results to match > existing behavior. > > Your patch has the GC allocation and SSA name (and namespace!) > allocation overhead and most definitely misses releasing the > SSA names you allocated. > > Note with the above hack the simplified result has to be checked > for mentions of lhs1 or lhs2 - a case we have to reject because > their definitions are transitional. > Hi, I made some changes based on the recommendations. Would you like to help me to see it again ? Sorry, it took so long time to provide the patch. Note: 1. I keep the code for and_comparisons_1 and or_comparisons_1. The reason is that I did not found a good way to handle the optimization of '((x CODE1 y) AND (x CODE2 y))' in match.pd. Maybe I missing some important information about match.pd. 2. The gimple_resimplify2 function is not used. Since stmt1, stmt2, lhs1 and lhs2 are allocated on the stack, Is there a question with the value on the stack as the return value ? I may have misunderstood Richard's intention. Thanks, Lijia He > Richard. > >> Richard. >> >>> Thanks, >>> Lijia He >>> >>>> >>>> maybe_fold_and/or_comparisons handle two exploded binary expressions >>>> while the current match.pd entries handle at most one exploded one >>>> (the outermost then, either AND or OR). But it would be definitely >>>> doable to auto-generate maybe_fold_and/or_comparisons from match.pd >>>> patterns which is what I'd ultimatively suggest to do (in some more >>>> generalized form maybe). Either with a separate genmatch invocation >>>> or as part of the --gimple processing (not sure what is more feasible >>>> here). >>>> >>>> I told Li Jia He that I don't expect him to do this work. >>>> >>>> Note I didn't review the actual patch yet. >>>> >>>> Thanks, >>>> Richard. >>>> >>> >> >> > --------------A02EBFEF83A8DCAF1C263DB5 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="0001-Auto-generate-maybe_fold_and-or_comparisons-from-mat.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*0="0001-Auto-generate-maybe_fold_and-or_comparisons-from-mat.pa"; filename*1="tch" Content-length: 10480 RnJvbSAyNjk5NTE2MDAwYWJkZWY2MGIwNmIyMDNkNzAzZjgwYjg5MDVjZjA5 IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBMaSBKaWEgSGUgPGhl bGlqaWFAbGludXguaWJtLmNvbT4KRGF0ZTogTW9uLCAxNSBKdWwgMjAxOSAw MDozMDoyNSAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggMS8yXSBBdXRvLWdlbmVy YXRlIG1heWJlX2ZvbGRfYW5kL29yX2NvbXBhcmlzb25zIGZyb20gbWF0Y2gu cGQKCkhpLAoKVGhpcyBwYXRjaCB0cnkgdG8gYXV0by1nZW5lcmF0ZSBtYXli ZV9mb2xkX2FuZC9vcl9jb21wYXJpc29ucyBmcm9tIG1hdGNoLnBkLgpXZSB0 cnkgdG8gYnVpbGQgdGVtcG9yeSBhc3NpZ24gd2l0aCBTU0EgZGVmIGFuZCB0 aGVuIGZlZWQgdGhhdCBpbnRvIHRoZSBHSU1QTEUKbWF0Y2gucGQgcGF0aC4K CkluIG9yZGVyIHRvIGxvd2VyIHRoZSBjb3N0IG9mIGJ1aWxkaW5nIFNTQSBu YW1lcyAvIGdpbXBsZSBzdG10cyBzaWduaWZpY2FudGx5LAp3ZSBuZWVkIHRv IGFsbG9jYXRlZCB0aGVtIG9uIHRoZSBzdGFjay4gIFRoaXMgd2lsbCBjYXVz ZSB0aGUgY29kZSBhIGJpdCB1Z2x5LgoKVGhlIHJlZ3Jlc3Npb24gdGVzdGlu ZyBmb3IgdGhlIHBhdGNoIHdhcyBkb25lIG9uIEdDQyBtYWlubGluZSBvbgoK CXBvd2VycGM2NGxlLXVua25vd24tbGludXgtZ251IChQb3dlciA5IExFKQoK d2l0aCBubyByZWdyZXNzaW9ucy4gIElzIGl0IE9LIGZvciB0cnVuayA/CgpU aGFua3MsCkxpamlhIEhlCgpnY2MvQ2hhbmdlTG9nCgoyMDE5LTA3LTE2ICBM aSBKaWEgSGUgIDxoZWxpamlhQGxpbnV4LmlibS5jb20+CgoJKiBnaW1wbGUu aCAoZ2ltcGxlX3NldF9jb2RlKTogRGVjbGFyZS4KCShnaW1wbGVfc2l6ZSk6 IExpa2V3aXNlLgoJKiBnaW1wbGUuYyAoZ2ltcGxlX3NldF9jb2RlKTogUmVt b3ZlIHN0YXRpYyBhbmQgaW5saW5lIHJlc3RyaWN0aW9ucy4KCShnaW1wbGVf c2l6ZSk6IExpa2V3aXNlLgoJKiBnaW1wbGUtZm9sZC5jIChtYXliZV9mb2xk X2NvbXBhcmlzb25zX2Zyb21fbWF0Y2hfcGQpOiBOZXcgZnVuY3Rpb24uCgko bWF5YmVfZm9sZF9hbmRfY29tcGFyaXNvbnMpOiBNb2RpZnkgYW5kX2NvbXBh cmlzb25zXzEgaW52b2NhdGlvbiBhbmQKCWNhbGwgbWF5YmVfZm9sZF9jb21w YXJpc29uc19mcm9tX21hdGNoX3BkLgoJKG1heWJlX2ZvbGRfb3JfY29tcGFy aXNvbnMpOiBNb2RpZnkgb3JfY29tcGFyaXNvbnNfMSBpbnZvY2F0aW9uIGFu ZAoJY2FsbCBtYXliZV9mb2xkX2NvbXBhcmlzb25zX2Zyb21fbWF0Y2hfcGQu Ci0tLQogZ2NjL2dpbXBsZS1mb2xkLmMgfCAxMjIgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLQogZ2NjL2dpbXBsZS5j ICAgICAgfCAgIDQgKy0KIGdjYy9naW1wbGUuaCAgICAgIHwgICAyICsKIDMg ZmlsZXMgY2hhbmdlZCwgMTE3IGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL2djYy9naW1wbGUtZm9sZC5jIGIvZ2NjL2dp bXBsZS1mb2xkLmMKaW5kZXggZGZiMzFhMDIwNzguLmE1YzI3OTAzNjFmIDEw MDY0NAotLS0gYS9nY2MvZ2ltcGxlLWZvbGQuYworKysgYi9nY2MvZ2ltcGxl LWZvbGQuYwpAQCAtNTc4OSw2ICs1Nzg5LDkxIEBAIGFuZF9jb21wYXJpc29u c18xIChlbnVtIHRyZWVfY29kZSBjb2RlMSwgdHJlZSBvcDFhLCB0cmVlIG9w MWIsCiAgIHJldHVybiBOVUxMX1RSRUU7CiB9CiAKKy8qIEhlbHBlciBmdW5j dGlvbiBmb3IgbWF5YmVfZm9sZF9hbmRfY29tcGFyaXNvbnMgYW5kIG1heWJl X2ZvbGRfb3JfY29tcGFyaXNvbnMKKyAgIDogdHJ5IHRvIHNpbXBsaWZ5IHRo ZSBBTkQvT1Igb2YgdGhlIHNzYSB2YXJpYWJsZSBWQVIgd2l0aCB0aGUgY29t cGFyaXNvbgorICAgc3BlY2lmaWVkIGJ5IChPUDJBIENPREUyIE9QMkIpIGZy b20gbWF0Y2gucGQuICBSZXR1cm4gTlVMTF9FWFBSIGlmIHdlIGNhbid0Cisg ICBzaW1wbGlmeSB0aGlzIHRvIGEgc2luZ2xlIGV4cHJlc3Npb24uICBBcyB3 ZSBhcmUgZ29pbmcgdG8gbG93ZXIgdGhlIGNvc3QKKyAgIG9mIGJ1aWxkaW5n IFNTQSBuYW1lcyAvIGdpbXBsZSBzdG10cyBzaWduaWZpY2FudGx5LCB3ZSBu ZWVkIHRvIGFsbG9jYXRlCisgICB0aGVtIG9udCB0aGUgc3RhY2suICBUaGlz IHdpbGwgY2F1c2UgdGhlIGNvZGUgdG8gYmUgYSBiaXQgdWdseS4gICovCisK K3N0YXRpYyB0cmVlCittYXliZV9mb2xkX2NvbXBhcmlzb25zX2Zyb21fbWF0 Y2hfcGQgKGVudW0gdHJlZV9jb2RlIGNvZGUsIGVudW0gdHJlZV9jb2RlIGNv ZGUxLAorCQkJCSAgICAgIHRyZWUgb3AxYSwgdHJlZSBvcDFiLAorCQkJCSAg ICAgIGVudW0gdHJlZV9jb2RlIGNvZGUyLCB0cmVlIG9wMmEsCisJCQkJICAg ICAgdHJlZSBvcDJiKQoreworICAvKiBBbGxvY2F0ZSBnaW1wbGUgc3RtdDEg b24gdGhlIHN0YWNrLiAgKi8KKyAgZ2ltcGxlICpzdG10MSA9IChnaW1wbGUg KikgKFhBTExPQ0FWRUMgKGNoYXIsIGdpbXBsZV9zaXplIChHSU1QTEVfQVNT SUdOKQorCQkJCQkJICArIDIgKiBzaXplb2YgKHRyZWUpKSk7CisgIG1lbXNl dCAoc3RtdDEsIDAsIGdpbXBsZV9zaXplIChHSU1QTEVfQVNTSUdOKSArIDIg KiBzaXplb2YgKHRyZWUpKTsKKyAgZ2ltcGxlX3NldF9jb2RlIChzdG10MSwg R0lNUExFX0FTU0lHTik7CisgIGdpbXBsZV9zZXRfbnVtX29wcyAoc3RtdDEs IDMpOworICBnaW1wbGVfaW5pdF9zaW5nbGV0b24gKHN0bXQxKTsKKworICAv KiBBbGxvY2F0ZSBnaW1wbGUgc3RtdDIgb24gdGhlIHN0YWNrLiAgKi8KKyAg Z2ltcGxlICpzdG10MiA9IChnaW1wbGUgKikgKFhBTExPQ0FWRUMgKGNoYXIs IGdpbXBsZV9zaXplIChHSU1QTEVfQVNTSUdOKQorCQkJCQkJICArIDIgKiBz aXplb2YgKHRyZWUpKSk7CisgIG1lbXNldCAoc3RtdDIsIDAsIGdpbXBsZV9z aXplIChHSU1QTEVfQVNTSUdOKSArIDIgKiBzaXplb2YgKHRyZWUpKTsKKyAg Z2ltcGxlX3NldF9jb2RlIChzdG10MiwgR0lNUExFX0FTU0lHTik7CisgIGdp bXBsZV9zZXRfbnVtX29wcyAoc3RtdDIsIDMpOworICBnaW1wbGVfaW5pdF9z aW5nbGV0b24gKHN0bXQyKTsKKworICBnaW1wbGVfYXNzaWduX3NldF9yaHNf Y29kZSAoc3RtdDEsIGNvZGUxKTsKKyAgZ2ltcGxlX2Fzc2lnbl9zZXRfcmhz MSAoc3RtdDEsIG9wMWEpOworICBnaW1wbGVfYXNzaWduX3NldF9yaHMyIChz dG10MSwgb3AxYik7CisKKyAgZ2ltcGxlX2Fzc2lnbl9zZXRfcmhzX2NvZGUg KHN0bXQyLCBjb2RlMik7CisgIGdpbXBsZV9hc3NpZ25fc2V0X3JoczEgKHN0 bXQyLCBvcDJhKTsKKyAgZ2ltcGxlX2Fzc2lnbl9zZXRfcmhzMiAoc3RtdDIs IG9wMmIpOworCisgIC8qIEFsbG9jYXRlIFNTQSBuYW1lcyhsaHMxKSBvbiB0 aGUgc3RhY2suICAqLworICB0cmVlIGxoczEgPSBYQUxMT0NBICh0cmVlX25v ZGUpOworICBtZW1zZXQgKGxoczEsIDAsIHNpemVvZiAodHJlZV9ub2RlKSk7 CisgIFRSRUVfU0VUX0NPREUgKGxoczEsIFNTQV9OQU1FKTsKKyAgVFJFRV9U WVBFIChsaHMxKSA9IGJvb2xlYW5fdHlwZV9ub2RlOworCisgIC8qIEFsbG9j YXRlIFNTQSBuYW1lcyhsaHMyKSBvbiB0aGUgc3RhY2suICAqLworICB0cmVl IGxoczIgPSBYQUxMT0NBICh0cmVlX25vZGUpOworICBtZW1zZXQgKGxoczIs IDAsIHNpemVvZiAodHJlZV9ub2RlKSk7CisgIFRSRUVfU0VUX0NPREUgKGxo czIsIFNTQV9OQU1FKTsKKyAgVFJFRV9UWVBFIChsaHMyKSA9IGJvb2xlYW5f dHlwZV9ub2RlOworCisgIGdpbXBsZV9hc3NpZ25fc2V0X2xocyAoc3RtdDEs IGxoczEpOworICBnaW1wbGVfYXNzaWduX3NldF9saHMgKHN0bXQyLCBsaHMy KTsKKworICAvKiBDYWxsIHRoZSBpbnRlcmZhY2UgZnVuY3Rpb24gb2YgbWF0 Y2gucGQgdG8gc2ltcGxpZnkgdGhlIGV4cHJlc3Npb24uICAqLworICB0cmVl IHQgPSBnaW1wbGVfc2ltcGxpZnkgKGNvZGUsIGJvb2xlYW5fdHlwZV9ub2Rl LCBnaW1wbGVfYXNzaWduX2xocyAoc3RtdDEpLAorCQkJICAgIGdpbXBsZV9h c3NpZ25fbGhzIChzdG10MiksIE5VTEwsCisJCQkgICAgZm9sbG93X2FsbF9z c2FfZWRnZXMpOworCisgIGlmICh0KQorICAgIHsKKyAgICAgIHN3aXRjaCAo VFJFRV9DT0RFICh0KSkKKwl7CisJICBjYXNlIFNTQV9OQU1FOgorCSAgICB7 CisJICAgICAgZ2ltcGxlICpkZWYgPSBTU0FfTkFNRV9ERUZfU1RNVCAodCk7 CisKKwkgICAgICBpZiAoIWlzX2dpbXBsZV9hc3NpZ24gKGRlZikKKwkJICB8 fCBUUkVFX0NPREVfQ0xBU1MgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKGRl ZikpCisJCSAgICAhPSB0Y2NfY29tcGFyaXNvbikKKwkJcmV0dXJuIE5VTExf VFJFRTsKKworCSAgICAgIHJldHVybiBmb2xkX2J1aWxkMiAoZ2ltcGxlX2Fz c2lnbl9yaHNfY29kZSAoZGVmKSwKKwkJCQkgIGJvb2xlYW5fdHlwZV9ub2Rl LCBnaW1wbGVfYXNzaWduX3JoczEgKGRlZiksCisJCQkJICBnaW1wbGVfYXNz aWduX3JoczIgKGRlZikpOworCSAgfQorCWNhc2UgSU5URUdFUl9DU1Q6CisJ ICAvKiBGb2xkIGV4cHJlc3Npb24gdG8gYm9vbGVhbl90cnVlX25vZGUgb3Ig Ym9vbGVhbl9mYWxzZV9ub2RlLiAgKi8KKwkgIHJldHVybiB0OworCWRlZmF1 bHQ6CisJICByZXR1cm4gTlVMTF9UUkVFOworCX0KKyAgICB9CisKKyAgcmV0 dXJuIE5VTExfVFJFRTsKK30KKwogLyogVHJ5IHRvIHNpbXBsaWZ5IHRoZSBB TkQgb2YgdHdvIGNvbXBhcmlzb25zLCBzcGVjaWZpZWQgYnkKICAgIChPUDFB IENPREUxIE9QMUIpIGFuZCAoT1AyQiBDT0RFMiBPUDJCKSwgcmVzcGVjdGl2 ZWx5LgogICAgSWYgdGhpcyBjYW4gYmUgc2ltcGxpZmllZCB0byBhIHNpbmds ZSBleHByZXNzaW9uICh3aXRob3V0IHJlcXVpcmluZwpAQCAtNTgwMCwxMSAr NTg4NSwyMSBAQCB0cmVlCiBtYXliZV9mb2xkX2FuZF9jb21wYXJpc29ucyAo ZW51bSB0cmVlX2NvZGUgY29kZTEsIHRyZWUgb3AxYSwgdHJlZSBvcDFiLAog CQkJICAgIGVudW0gdHJlZV9jb2RlIGNvZGUyLCB0cmVlIG9wMmEsIHRyZWUg b3AyYikKIHsKLSAgdHJlZSB0ID0gYW5kX2NvbXBhcmlzb25zXzEgKGNvZGUx LCBvcDFhLCBvcDFiLCBjb2RlMiwgb3AyYSwgb3AyYik7Ci0gIGlmICh0KQor ICBpZiAodHJlZSB0ID0gYW5kX2NvbXBhcmlzb25zXzEgKGNvZGUxLCBvcDFh LCBvcDFiLCBjb2RlMiwgb3AyYSwgb3AyYikpCiAgICAgcmV0dXJuIHQ7Ci0g IGVsc2UKLSAgICByZXR1cm4gYW5kX2NvbXBhcmlzb25zXzEgKGNvZGUyLCBv cDJhLCBvcDJiLCBjb2RlMSwgb3AxYSwgb3AxYik7CisKKyAgaWYgKHRyZWUg dCA9IGFuZF9jb21wYXJpc29uc18xIChjb2RlMiwgb3AyYSwgb3AyYiwgY29k ZTEsIG9wMWEsIG9wMWIpKQorICAgIHJldHVybiB0OworCisgIGlmICh0cmVl IHQgPSBtYXliZV9mb2xkX2NvbXBhcmlzb25zX2Zyb21fbWF0Y2hfcGQgKEJJ VF9BTkRfRVhQUiwgY29kZTEsIG9wMWEsCisJCQkJCQkgICAgIG9wMWIsIGNv ZGUyLCBvcDJhLCBvcDJiKSkKKyAgICByZXR1cm4gdDsKKworICBpZiAodHJl ZSB0ID0gbWF5YmVfZm9sZF9jb21wYXJpc29uc19mcm9tX21hdGNoX3BkIChC SVRfQU5EX0VYUFIsIGNvZGUyLCBvcDJhLAorCQkJCQkJICAgICBvcDJiLCBj b2RlMSwgb3AxYSwgb3AxYikpCisgICAgcmV0dXJuIHQ7CisKKyAgcmV0dXJu IE5VTExfVFJFRTsKIH0KIAogLyogSGVscGVyIGZ1bmN0aW9uIGZvciBvcl9j b21wYXJpc29uc18xOiAgdHJ5IHRvIHNpbXBsaWZ5IHRoZSBPUiBvZiB0aGUK QEAgLTYyNjQsMTMgKzYzNTksMjIgQEAgdHJlZQogbWF5YmVfZm9sZF9vcl9j b21wYXJpc29ucyAoZW51bSB0cmVlX2NvZGUgY29kZTEsIHRyZWUgb3AxYSwg dHJlZSBvcDFiLAogCQkJICAgZW51bSB0cmVlX2NvZGUgY29kZTIsIHRyZWUg b3AyYSwgdHJlZSBvcDJiKQogewotICB0cmVlIHQgPSBvcl9jb21wYXJpc29u c18xIChjb2RlMSwgb3AxYSwgb3AxYiwgY29kZTIsIG9wMmEsIG9wMmIpOwot ICBpZiAodCkKKyAgaWYgKHRyZWUgdCA9IG9yX2NvbXBhcmlzb25zXzEgKGNv ZGUxLCBvcDFhLCBvcDFiLCBjb2RlMiwgb3AyYSwgb3AyYikpCisgICAgcmV0 dXJuIHQ7CisKKyAgaWYgKHRyZWUgdCA9IG9yX2NvbXBhcmlzb25zXzEgKGNv ZGUyLCBvcDJhLCBvcDJiLCBjb2RlMSwgb3AxYSwgb3AxYikpCisgICAgcmV0 dXJuIHQ7CisKKyAgaWYgKHRyZWUgdCA9IG1heWJlX2ZvbGRfY29tcGFyaXNv bnNfZnJvbV9tYXRjaF9wZCAoQklUX0lPUl9FWFBSLCBjb2RlMSwgb3AxYSwK KwkJCQkJCSAgICAgb3AxYiwgY29kZTIsIG9wMmEsIG9wMmIpKQorICAgIHJl dHVybiB0OworCisgIGlmICh0cmVlIHQgPSBtYXliZV9mb2xkX2NvbXBhcmlz b25zX2Zyb21fbWF0Y2hfcGQgKEJJVF9JT1JfRVhQUiwgY29kZTIsIG9wMmEs CisJCQkJCQkgICAgIG9wMmIsIGNvZGUxLCBvcDFhLCBvcDFiKSkKICAgICBy ZXR1cm4gdDsKLSAgZWxzZQotICAgIHJldHVybiBvcl9jb21wYXJpc29uc18x IChjb2RlMiwgb3AyYSwgb3AyYiwgY29kZTEsIG9wMWEsIG9wMWIpOwotfQog CisgIHJldHVybiBOVUxMX1RSRUU7Cit9CiAKIC8qIEZvbGQgU1RNVCB0byBh IGNvbnN0YW50IHVzaW5nIFZBTFVFSVpFIHRvIHZhbHVlaXplIFNTQSBuYW1l cy4KIApkaWZmIC0tZ2l0IGEvZ2NjL2dpbXBsZS5jIGIvZ2NjL2dpbXBsZS5j CmluZGV4IDYzYzhkNWU4NWFlLi42NzY5YmQ5ZWRlYyAxMDA2NDQKLS0tIGEv Z2NjL2dpbXBsZS5jCisrKyBiL2djYy9naW1wbGUuYwpAQCAtMTAxLDcgKzEw MSw3IEBAIGNvbnN0IGVudW0gZ2ltcGxlX2NvZGUgZ2NvbmQ6OmNvZGVfOwog CiAvKiBTZXQgdGhlIGNvZGUgZm9yIHN0YXRlbWVudCBHIHRvIENPREUuICAq LwogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3ZvaWQKIGdpbXBsZV9zZXRfY29k ZSAoZ2ltcGxlICpnLCBlbnVtIGdpbXBsZV9jb2RlIGNvZGUpCiB7CiAgIGct PmNvZGUgPSBjb2RlOwpAQCAtMTEwLDcgKzExMCw3IEBAIGdpbXBsZV9zZXRf Y29kZSAoZ2ltcGxlICpnLCBlbnVtIGdpbXBsZV9jb2RlIGNvZGUpCiAvKiBS ZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gaG9sZCBhIEdJ TVBMRSBzdGF0ZW1lbnQgd2l0aAogICAgY29kZSBDT0RFLiAgKi8KIAotc3Rh dGljIGlubGluZSBzaXplX3QKK3NpemVfdAogZ2ltcGxlX3NpemUgKGVudW0g Z2ltcGxlX2NvZGUgY29kZSkKIHsKICAgcmV0dXJuIGdzc3RydWN0X2NvZGVf c2l6ZVtnc3NfZm9yX2NvZGUgKGNvZGUpXTsKZGlmZiAtLWdpdCBhL2djYy9n aW1wbGUuaCBiL2djYy9naW1wbGUuaAppbmRleCA0NzA3MGU3ZjQwOS4uYTMy NzA4YWQzNDkgMTAwNjQ0Ci0tLSBhL2djYy9naW1wbGUuaAorKysgYi9nY2Mv Z2ltcGxlLmgKQEAgLTE0NDcsNiArMTQ0Nyw4IEBAIGV4dGVybiBlbnVtIGdp bXBsZV9zdGF0ZW1lbnRfc3RydWN0dXJlX2VudW0gY29uc3QgZ3NzX2Zvcl9j b2RlX1tdOwogICAgb2YgY29tbWludWNhdGluZyB0aGUgcHJvZmlsZSBpbmZv IHRvIHRoZSBidWlsdGluIGV4cGFuZGVycy4gICovCiBleHRlcm4gZ2ltcGxl ICpjdXJyZW50bHlfZXhwYW5kaW5nX2dpbXBsZV9zdG10OwogCit2b2lkIGdp bXBsZV9zZXRfY29kZSAoZ2ltcGxlICpnLCBlbnVtIGdpbXBsZV9jb2RlIGNv ZGUpOworc2l6ZV90IGdpbXBsZV9zaXplIChlbnVtIGdpbXBsZV9jb2RlIGNv ZGUpOwogZ2ltcGxlICpnaW1wbGVfYWxsb2MgKGVudW0gZ2ltcGxlX2NvZGUs IHVuc2lnbmVkIENYWF9NRU1fU1RBVF9JTkZPKTsKIGdyZXR1cm4gKmdpbXBs ZV9idWlsZF9yZXR1cm4gKHRyZWUpOwogdm9pZCBnaW1wbGVfY2FsbF9yZXNl dF9hbGlhc19pbmZvIChnY2FsbCAqKTsKLS0gCjIuMTcuMQoK --------------A02EBFEF83A8DCAF1C263DB5 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="0002-Fix-PR88784-middle-end-is-missing-some-optimizations.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*0="0002-Fix-PR88784-middle-end-is-missing-some-optimizations.pa"; filename*1="tch" Content-length: 26279 RnJvbSA3NTdiYWU1YThmMzk4NWY4NzA0ZDg0NmYxNzAxYmYzNDVhYjBmZTQz IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBMaSBKaWEgSGUgPGhl bGlqaWFAbGludXguaWJtLmNvbT4KRGF0ZTogTW9uLCAxNSBKdWwgMjAxOSAw Mzo1MDozNCAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggMi8yXSBGaXggUFI4ODc4 NCwgbWlkZGxlIGVuZCBpcyBtaXNzaW5nIHNvbWUgb3B0aW1pemF0aW9ucwog YWJvdXQgdW5zaWduZWQKCkhpLAoKQWNjb3JkaW5nIHRvIHRoZSBvcHRpbWl6 YWJsZSBjYXNlIGRlc2NyaWJlZCBieSBRaSBGZW5nIG9uCmlzc3VlIDg4Nzg0 LCB3ZSBjYW4gY29tYmluZSB0aGUgY2FzZXMgaW50byB0aGUgZm9sbG93aW5n OgoKMS4geCA+ICB5ICAmJiAgeCAhPSBYWFhfTUlOICAtLT4gICB4ID4geQoy LiB4ID4gIHkgICYmICB4ID09IFhYWF9NSU4gIC0tPiAgIGZhbHNlCjMuIHgg PD0geSAgJiYgIHggPT0gWFhYX01JTiAgLS0+ICAgeCA9PSBYWFhfTUlOCgo0 LiB4IDwgIHkgICYmICB4ICE9IFhYWF9NQVggIC0tPiAgIHggPCB5CjUuIHgg PCAgeSAgJiYgIHggPT0gWFhYX01BWCAgLS0+ICAgZmFsc2UKNi4geCA+PSB5 ICAmJiAgeCA9PSBYWFhfTUFYICAtLT4gICB4ID09IFhYWF9NQVgKCjcuIHgg PiAgeSAgfHwgIHggIT0gWFhYX01JTiAgLS0+ICAgeCAhPSBYWFhfTUlOCjgu IHggPD0geSAgfHwgIHggIT0gWFhYX01JTiAgLS0+ICAgdHJ1ZQo5LiB4IDw9 IHkgIHx8ICB4ID09IFhYWF9NSU4gIC0tPiAgIHggPD0geQoKMTAuIHggPCAg eSAgfHwgIHggIT0gWFhYX01BWCAgLS0+ICAgeCAhPSBVWFhYX01BWAoxMS4g eCA+PSB5ICB8fCAgeCAhPSBYWFhfTUFYICAtLT4gICB0cnVlCjEyLiB4ID49 IHkgIHx8ICB4ID09IFhYWF9NQVggIC0tPiAgIHggPj0geQoKTm90ZTogWFhY X01JTiByZXByZXNlbnRzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHR5cGUgeC4K ICAgICAgWFhYX01BWCByZXByZXNlbnRzIHRoZSBtYXhpbXVtIHZhbHVlIG9m IHR5cGUgeC4KCkhlcmUgd2UgZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IHdo ZXRoZXIgdGhlIG9wZXJhdGlvbiBpcwpzaWduZWQgb3IgdW5zaWduZWQuICBG b3IgZXhhbXBsZSwgaW4gdGhlIGJlbG93IGVxdWF0aW9uOgoKJ3ggPiAgeSAg JiYgIHggIT0gWFhYX01JTiAgLS0+ICAgeCA+IHknCgpJZiB0aGUgeCB0eXBl IGlzIHNpZ25lZCBpbnQgYW5kIFhYWF9NSU4gaXMgSU5UX01JTiwgd2UgY2Fu Cm9wdGltaXplIGl0IHRvICd4ID4geScuICBIb3dldmVyLCBpZiB0aGUgdHlw ZSBvZiB4IGlzIHVuc2lnbmVkCmludCBhbmQgWFhYX01JTiBpcyAwLCB3ZSBj YW4gc3RpbGwgb3B0aW1pemUgaXQgdG8gJ3ggPiB5Jy4KClRoZSByZWdyZXNz aW9uIHRlc3RpbmcgZm9yIHRoZSBwYXRjaCB3YXMgZG9uZSBvbiBHQ0MgbWFp bmxpbmUgb24KCiAgICBwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LWdudSAo UG93ZXIgOSBMRSkKCndpdGggbm8gcmVncmVzc2lvbnMuICBJcyBpdCBPSyBm b3IgdHJ1bmsgPwoKVGhhbmtzLApMaWppYSBIZQoKZ2NjL0NoYW5nZUxvZwoK MjAxOS0wNy0xNiAgTGkgSmlhIEhlICA8aGVsaWppYUBsaW51eC5pYm0uY29t PgoJICAgIFFpIEZlbmcgIDxmZmVuZ3FpQGxpbnV4LmlibS5jb20+CgoJUFIg bWlkZGxlLWVuZC84ODc4NAoJKiBtYXRjaC5wZCAoeCA+ICB5ICAmJiAgeCAh PSBYWFhfTUlOKTogT3B0aW1pemUgaW50byAneCA+IHknLgoJKHggPiAgeSAg JiYgIHggPT0gWFhYX01JTik6IE9wdGltaXplIGludG8gJ2ZhbHNlJy4KCSh4 IDw9IHkgICYmICB4ID09IFhYWF9NSU4pOiBPcHRpbWl6ZSBpbnRvICd4ID09 IFhYWF9NSU4nLgoJKHggPCAgeSAgJiYgIHggIT0gWFhYX01BWCk6IE9wdGlt aXplIGludG8gJ3ggPCB5Jy4KCSh4IDwgIHkgICYmICB4ID09IFhYWF9NQVgp OiBPcHRpbWl6ZSBpbnRvICdmYWxzZScuCgkoeCA+PSB5ICAmJiAgeCA9PSBY WFhfTUFYKTogT3B0aW1pemUgaW50byAneCA9PSBYWFhfTUFYJy4KCSh4ID4g IHkgIHx8ICB4ICE9IFhYWF9NSU4pOiBPcHRpbWl6ZSBpbnRvICd4ICE9IFhY WF9NSU4nLgoJKHggPD0geSAgfHwgIHggIT0gWFhYX01JTik6IE9wdGltaXpl IGludG8gJ3RydWUnLgoJKHggPD0geSAgfHwgIHggPT0gWFhYX01JTik6IE9w dGltaXplIGludG8gJ3ggPD0geScuCgkoeCA8ICB5ICB8fCAgeCAhPSBYWFhf TUFYKTogT3B0aW1pemUgaW50byAneCAhPSBYWFhfTUFYJy4KCSh4ID49IHkg IHx8ICB4ICE9IFhYWF9NQVgpOiBPcHRpbWl6ZSBpbnRvICd0cnVlJy4KCSh4 ID49IHkgIHx8ICB4ID09IFhYWF9NQVgpOiBPcHRpbWl6ZSBpbnRvICd4ID49 IHknLgoKZ2NjL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKCjIwMTktMDctMTYgIExp IEppYSBIZSAgPGhlbGlqaWFAbGludXguaWJtLmNvbT4KCSAgICBRaSBGZW5n ICA8ZmZlbmdxaUBsaW51eC5pYm0uY29tPgoKCVBSIG1pZGRsZS1lbmQvODg3 ODQKCSogZ2NjLmRnL3ByODg3ODQtMS5jOiBOZXcgdGVzdGNhc2UuCgkqIGdj Yy5kZy9wcjg4Nzg0LTIuYzogTmV3IHRlc3RjYXNlLgoJKiBnY2MuZGcvcHI4 ODc4NC0zLmM6IE5ldyB0ZXN0Y2FzZS4KCSogZ2NjLmRnL3ByODg3ODQtNC5j OiBOZXcgdGVzdGNhc2UuCgkqIGdjYy5kZy9wcjg4Nzg0LTUuYzogTmV3IHRl c3RjYXNlLgoJKiBnY2MuZGcvcHI4ODc4NC02LmM6IE5ldyB0ZXN0Y2FzZS4K CSogZ2NjLmRnL3ByODg3ODQtNy5jOiBOZXcgdGVzdGNhc2UuCgkqIGdjYy5k Zy9wcjg4Nzg0LTguYzogTmV3IHRlc3RjYXNlLgoJKiBnY2MuZGcvcHI4ODc4 NC05LmM6IE5ldyB0ZXN0Y2FzZS4KCSogZ2NjLmRnL3ByODg3ODQtMTAuYzog TmV3IHRlc3RjYXNlLgoJKiBnY2MuZGcvcHI4ODc4NC0xMS5jOiBOZXcgdGVz dGNhc2UuCgkqIGdjYy5kZy9wcjg4Nzg0LTEyLmM6IE5ldyB0ZXN0Y2FzZS4K LS0tCiBnY2MvbWF0Y2gucGQgICAgICAgICAgICAgICAgICAgICAgfCA5NSAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBnY2MvdGVzdHN1aXRl L2djYy5kZy9wcjg4Nzg0LTEuYyAgfCAzMCArKysrKysrKysrCiBnY2MvdGVz dHN1aXRlL2djYy5kZy9wcjg4Nzg0LTEwLmMgfCAzMiArKysrKysrKysrKwog Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHI4ODc4NC0xMS5jIHwgMzAgKysrKysr KysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHI4ODc4NC0xMi5jIHwgMzAg KysrKysrKysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHI4ODc4NC0yLmMg IHwgMzAgKysrKysrKysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHI4ODc4 NC0zLmMgIHwgMzIgKysrKysrKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLmRn L3ByODg3ODQtNC5jICB8IDMyICsrKysrKysrKysrCiBnY2MvdGVzdHN1aXRl L2djYy5kZy9wcjg4Nzg0LTUuYyAgfCAzMSArKysrKysrKysrCiBnY2MvdGVz dHN1aXRlL2djYy5kZy9wcjg4Nzg0LTYuYyAgfCAzMSArKysrKysrKysrCiBn Y2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0LTcuYyAgfCAzMSArKysrKysr KysrCiBnY2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0LTguYyAgfCAzMSAr KysrKysrKysrCiBnY2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0LTkuYyAg fCAzMiArKysrKysrKysrKwogMTMgZmlsZXMgY2hhbmdlZCwgNDY3IGluc2Vy dGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2dj Yy5kZy9wcjg4Nzg0LTEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0 c3VpdGUvZ2NjLmRnL3ByODg3ODQtMTAuYwogY3JlYXRlIG1vZGUgMTAwNjQ0 IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtMTEuYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtMTIuYwog Y3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3 ODQtMi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2Mu ZGcvcHI4ODc4NC0zLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1 aXRlL2djYy5kZy9wcjg4Nzg0LTQuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdj Yy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtNS5jCiBjcmVhdGUgbW9kZSAx MDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHI4ODc4NC02LmMKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0LTcu YwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL3By ODg3ODQtOC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvcHI4ODc4NC05LmMKCmRpZmYgLS1naXQgYS9nY2MvbWF0Y2gucGQg Yi9nY2MvbWF0Y2gucGQKaW5kZXggZjhlMzVlOTZkMjIuLjIxYTE0N2QwZmYx IDEwMDY0NAotLS0gYS9nY2MvbWF0Y2gucGQKKysrIGIvZ2NjL21hdGNoLnBk CkBAIC0xODU5LDYgKzE4NTksMTAxIEBAIERFRklORV9JTlRfQU5EX0ZMT0FU X1JPVU5EX0ZOIChSSU5UKQogICAgIHsgd2lkZV9pbnRfdG9fdHJlZSAodHlw ZSwgKHdpOjp0b193aWRlIChAMSkKIAkJCSAgICAgICAmIChiaXRwb3MgLyBC SVRTX1BFUl9VTklUKSkpOyB9KSkpKQogCisvKiB4ID4gIHkgICYmICB4ICE9 IFhYWF9NSU4gIC0tPiAgeCA+IHkgICovCisoZm9yIGFuZCAodHJ1dGhfYW5k IGJpdF9hbmQpCisgKHNpbXBsaWZ5CisgIChhbmQ6YyAoZ3Q6Y0AzIEAwIEAx KSAobmUgQDAgSU5URUdFUl9DU1RAMikpCisgIChpZiAoSU5URUdSQUxfVFlQ RV9QIChUUkVFX1RZUEUgKEAwKSkgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVF X1RZUEUoQDEpKQorICAgICAgICYmICh3aTo6ZXFfcCAod2k6OnRvX3dpZGUg KEAyKSwgd2k6Om1pbl92YWx1ZSAoVFJFRV9UWVBFIChAMikpKSkpCisgICAg QDMpKSkKKworLyogeCA+ICB5ICAmJiAgeCA9PSBYWFhfTUlOICAtLT4gIGZh bHNlICAqLworKGZvciBhbmQgKHRydXRoX2FuZCBiaXRfYW5kKQorIChzaW1w bGlmeQorICAoYW5kOmMgKGd0OmMgQDAgQDEpIChlcSBAMCBJTlRFR0VSX0NT VEAyKSkKKyAgKGlmIChJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAoQDAp KSAmJiBJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRShAMSkpCisgICAgICAg JiYgKHdpOjplcV9wICh3aTo6dG9fd2lkZSAoQDIpLCB3aTo6bWluX3ZhbHVl IChUUkVFX1RZUEUgKEAyKSkpKSkKKyAgICB7IGJvb2xlYW5fZmFsc2Vfbm9k ZTsgfSkpKQorCisvKiB4IDw9ICB5ICAmJiAgeCA9PSBYWFhfTUlOICAtLT4g IHggPT0gWFhYX01JTiAgKi8KKyhmb3IgYW5kICh0cnV0aF9hbmQgYml0X2Fu ZCkKKyAoc2ltcGxpZnkKKyAgKGFuZDpjIChsZTpjIEAwIEAxKSAoZXFAMyBA MCBJTlRFR0VSX0NTVEAyKSkKKyAgKGlmIChJTlRFR1JBTF9UWVBFX1AgKFRS RUVfVFlQRSAoQDApKSAmJiBJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRShA MSkpCisgICAgICAgJiYgKHdpOjplcV9wICh3aTo6dG9fd2lkZSAoQDIpLCB3 aTo6bWluX3ZhbHVlIChUUkVFX1RZUEUgKEAyKSkpKSkKKyAgICBAMykpKQor CisvKiB4IDwgIHkgICYmICB4ICE9IFhYWF9NQVggIC0tPiAgeCA8IHkgICov CisoZm9yIGFuZCAodHJ1dGhfYW5kIGJpdF9hbmQpCisgKHNpbXBsaWZ5Cisg IChhbmQ6YyAobHQ6Y0AzIEAwIEAxKSAobmUgQDAgSU5URUdFUl9DU1RAMikp CisgIChpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKEAwKSkgJiYg SU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUoQDEpKQorICAgICAgICYmICh3 aTo6ZXFfcCAod2k6OnRvX3dpZGUgKEAyKSwgd2k6Om1heF92YWx1ZSAoVFJF RV9UWVBFIChAMikpKSkpCisgICAgQDMpKSkKKworLyogeCA8ICB5ICAmJiAg eCA9PSBYWFhfTUFYICAtLT4gIGZhbHNlICAqLworKGZvciBhbmQgKHRydXRo X2FuZCBiaXRfYW5kKQorIChzaW1wbGlmeQorICAoYW5kOmMgKGx0OmMgQDAg QDEpIChlcSBAMCBJTlRFR0VSX0NTVEAyKSkKKyAgKGlmIChJTlRFR1JBTF9U WVBFX1AgKFRSRUVfVFlQRSAoQDApKSAmJiBJTlRFR1JBTF9UWVBFX1AgKFRS RUVfVFlQRShAMSkpCisgICAgICAgJiYgKHdpOjplcV9wICh3aTo6dG9fd2lk ZSAoQDIpLCB3aTo6bWF4X3ZhbHVlIChUUkVFX1RZUEUgKEAyKSkpKSkKKyAg ICB7IGJvb2xlYW5fZmFsc2Vfbm9kZTsgfSkpKQorCisvKiB4ID49ICB5ICAm JiAgeCA9PSBYWFhfTUFYICAtLT4gIHggPT0gWFhYX01BWCAgKi8KKyhmb3Ig YW5kICh0cnV0aF9hbmQgYml0X2FuZCkKKyAoc2ltcGxpZnkKKyAgKGFuZDpj IChnZTpjIEAwIEAxKSAoZXFAMyBAMCBJTlRFR0VSX0NTVEAyKSkKKyAgKGlm IChJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAoQDApKSAmJiBJTlRFR1JB TF9UWVBFX1AgKFRSRUVfVFlQRShAMSkpCisgICAgICAgJiYgKHdpOjplcV9w ICh3aTo6dG9fd2lkZSAoQDIpLCB3aTo6bWF4X3ZhbHVlIChUUkVFX1RZUEUg KEAyKSkpKSkKKyAgICBAMykpKQorCisvKiB4ID4gIHkgIHx8ICB4ICE9IFhY WF9NSU4gICAtLT4gIHggIT0gWFhYX01JTiAgKi8KKyhmb3Igb3IgKHRydXRo X29yIGJpdF9pb3IpCisgKHNpbXBsaWZ5CisgIChvcjpjIChndDpjIEAwIEAx KSAobmVAMyBAMCBJTlRFR0VSX0NTVEAyKSkKKyAgKGlmIChJTlRFR1JBTF9U WVBFX1AgKFRSRUVfVFlQRSAoQDApKSAmJiBJTlRFR1JBTF9UWVBFX1AgKFRS RUVfVFlQRShAMSkpCisgICAgICAgJiYgd2k6OmVxX3AgKHdpOjp0b193aWRl IChAMiksIHdpOjptaW5fdmFsdWUgKFRSRUVfVFlQRSAoQDIpKSkpCisgICAg QDMpKSkKKworLyogeCA8PSAgeSAgfHwgIHggIT0gWFhYX01JTiAgIC0tPiAg dHJ1ZSAgKi8KKyhmb3Igb3IgKHRydXRoX29yIGJpdF9pb3IpCisgKHNpbXBs aWZ5CisgIChvcjpjIChsZTpjIEAwIEAxKSAobmUgQDAgSU5URUdFUl9DU1RA MikpCisgIChpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKEAwKSkg JiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUoQDEpKQorICAgICAgICYm IHdpOjplcV9wICh3aTo6dG9fd2lkZSAoQDIpLCB3aTo6bWluX3ZhbHVlIChU UkVFX1RZUEUgKEAyKSkpKQorICAgIHsgYm9vbGVhbl90cnVlX25vZGU7IH0p KSkKKworLyogeCA8PSAgeSAgfHwgIHggPT0gWFhYX01JTiAgIC0tPiAgeCA8 PSB5ICAqLworKGZvciBvciAodHJ1dGhfb3IgYml0X2lvcikKKyAoc2ltcGxp ZnkKKyAgKG9yOmMgKGxlOmNAMyBAMCBAMSkgKGVxIEAwIElOVEVHRVJfQ1NU QDIpKQorICAoaWYgKElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChAMCkp ICYmIElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFKEAxKSkKKyAgICAgICAm JiB3aTo6ZXFfcCAod2k6OnRvX3dpZGUgKEAyKSwgd2k6Om1pbl92YWx1ZSAo VFJFRV9UWVBFIChAMikpKSkKKyAgICBAMykpKQorCisvKiB4IDwgIHkgIHx8 ICB4ICE9IFhYWF9NQVggICAtLT4gIHggIT0gWFhYX01BWCAgKi8KKyhmb3Ig b3IgKHRydXRoX29yIGJpdF9pb3IpCisgKHNpbXBsaWZ5CisgIChvcjpjIChs dDpjIEAwIEAxKSAobmVAMyBAMCBJTlRFR0VSX0NTVEAyKSkKKyAgKGlmIChJ TlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAoQDApKSAmJiBJTlRFR1JBTF9U WVBFX1AgKFRSRUVfVFlQRShAMSkpCisgICAgICAgJiYgd2k6OmVxX3AgKHdp Ojp0b193aWRlIChAMiksIHdpOjptYXhfdmFsdWUgKFRSRUVfVFlQRSAoQDIp KSkpCisgICAgQDMpKSkKKworLyogeCA+PSAgeSAgfHwgIHggIT0gWFhYX01B WCAgIC0tPiAgdHJ1ZSAgKi8KKyhmb3Igb3IgKHRydXRoX29yIGJpdF9pb3Ip CisgKHNpbXBsaWZ5CisgIChvcjpjIChnZTpjIEAwIEAxKSAobmUgQDAgSU5U RUdFUl9DU1RAMikpCisgIChpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZ UEUgKEAwKSkgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUoQDEpKQor ICAgICAgICYmIHdpOjplcV9wICh3aTo6dG9fd2lkZSAoQDIpLCB3aTo6bWF4 X3ZhbHVlIChUUkVFX1RZUEUgKEAyKSkpKQorICAgIHsgYm9vbGVhbl90cnVl X25vZGU7IH0pKSkKKworLyogeCA+PSAgeSAgfHwgIHggPT0gWFhYX01BWCAg IC0tPiAgeCA+PSB5ICAqLworKGZvciBvciAodHJ1dGhfb3IgYml0X2lvcikK KyAoc2ltcGxpZnkKKyAgKG9yOmMgKGdlOmNAMyBAMCBAMSkgKGVxIEAwIElO VEVHRVJfQ1NUQDIpKQorICAoaWYgKElOVEVHUkFMX1RZUEVfUCAoVFJFRV9U WVBFIChAMCkpICYmIElOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFKEAxKSkK KyAgICAgICAmJiB3aTo6ZXFfcCAod2k6OnRvX3dpZGUgKEAyKSwgd2k6Om1h eF92YWx1ZSAoVFJFRV9UWVBFIChAMikpKSkKKyAgICBAMykpKQogCiAvKiBX ZSBjYW4ndCByZWFzc29jaWF0ZSBhdCBhbGwgZm9yIHNhdHVyYXRpbmcgdHlw ZXMuICAqLwogKGlmICghVFlQRV9TQVRVUkFUSU5HICh0eXBlKSkKZGlmZiAt LWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtMS5jIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvcHI4ODc4NC0xLmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjA2N2Q0MGQwNzM5Ci0tLSAvZGV2 L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHI4ODc4NC0xLmMK QEAgLTAsMCArMSwzMCBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8q IHsgZGctb3B0aW9ucyAiLU8yIC1mZHVtcC10cmVlLWlmY29tYmluZSAtLXBh cmFtIGxvZ2ljYWwtb3Atbm9uLXNob3J0LWNpcmN1aXQ9MCIgfSAqLworCisj aW5jbHVkZSA8bGltaXRzLmg+CisKK19Cb29sIGFuZDEodW5zaWduZWQgeCwg dW5zaWduZWQgeSkKK3sKKyAgLyogeCA+IHkgJiYgeCAhPSAwIC0tPiB4ID4g eSAqLworICByZXR1cm4geCA+IHkgJiYgeCAhPSAwOworfQorCitfQm9vbCBh bmQyKHVuc2lnbmVkIHgsIHVuc2lnbmVkIHkpCit7CisgIC8qIHggPCB5ICYm IHggIT0gVUlOVF9NQVggLS0+IHggPCB5ICovCisgIHJldHVybiB4IDwgeSAm JiB4ICE9IFVJTlRfTUFYOworfQorCitfQm9vbCBhbmQzKHNpZ25lZCB4LCBz aWduZWQgeSkKK3sKKyAgLyogeCA+IHkgJiYgeCAhPSBJTlRfTUlOIC0tPiB4 ID4geSAqLworICByZXR1cm4geCA+IHkgJiYgeCAhPSBJTlRfTUlOOworfQor CitfQm9vbCBhbmQ0KHNpZ25lZCB4LCBzaWduZWQgeSkKK3sKKyAgLyogeCA8 IHkgJiYgeCAhPSBJTlRfTUFYIC0tPiB4IDwgeSAqLworICByZXR1cm4geCA8 IHkgJiYgeCAhPSBJTlRfTUFYOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi10cmVlLWR1bXAtbm90ICIgIT0gIiAiaWZjb21iaW5lIiB9IH0gKi8KZGlm ZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtMTAuYyBi L2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtMTAuYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMjIxOGZhYTNiN2MKLS0t IC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0 LTEwLmMKQEAgLTAsMCArMSwzMiBAQAorLyogeyBkZy1kbyBjb21waWxlIH0g Ki8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mZHVtcC10cmVlLWdpbXBsZSAt LXBhcmFtIGxvZ2ljYWwtb3Atbm9uLXNob3J0LWNpcmN1aXQ9MSIgfSAqLwor CisjaW5jbHVkZSA8bGltaXRzLmg+CisKK19Cb29sIG9yMSh1bnNpZ25lZCB4 LCB1bnNpZ25lZCB5KQoreworICAvKiB4IDw9IHkgfHwgeCAhPSAwIC0tPiB0 cnVlICovCisgIHJldHVybiB4IDw9IHkgfHwgeCAhPSAwOworfQorCitfQm9v bCBvcjIodW5zaWduZWQgeCwgdW5zaWduZWQgeSkKK3sKKyAgLyogeCA+PSB5 IHx8IHggIT0gVUlOVF9NQVggLS0+IHRydWUgKi8KKyAgcmV0dXJuIHggPj0g eSB8fCB4ICE9IFVJTlRfTUFYOworfQorCitfQm9vbCBvcjMoc2lnbmVkIHgs IHNpZ25lZCB5KQoreworICAvKiB4IDw9IHkgfHwgeCAhPSBJTlRfTUlOIC0t PiB0cnVlICovCisgIHJldHVybiB4IDw9IHkgfHwgeCAhPSBJTlRfTUlOOwor fQorCitfQm9vbCBvcjQoc2lnbmVkIHgsIHNpZ25lZCB5KQoreworICAvKiB4 ID49IHkgfHwgeCAhPSBJTlRfTUFYIC0tPiB0cnVlICovCisgIHJldHVybiB4 ID49IHkgfHwgeCAhPSBJTlRfTUFYOworfQorCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAtbm90ICIgIT0gIiAiZ2ltcGxlIiB9IH0gKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3QgIiA8PSAiICJnaW1w bGUiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLW5v dCAiID49ICIgImdpbXBsZSIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVz dHN1aXRlL2djYy5kZy9wcjg4Nzg0LTExLmMgYi9nY2MvdGVzdHN1aXRlL2dj Yy5kZy9wcjg4Nzg0LTExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAuLjQ0NjU5MTBlZmJiCi0tLSAvZGV2L251bGwKKysrIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHI4ODc4NC0xMS5jCkBAIC0wLDAgKzEs MzAgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlv bnMgIi1PMiAtZmR1bXAtdHJlZS1pZmNvbWJpbmUgLS1wYXJhbSBsb2dpY2Fs LW9wLW5vbi1zaG9ydC1jaXJjdWl0PTAiIH0gKi8KKworI2luY2x1ZGUgPGxp bWl0cy5oPgorCitfQm9vbCBvcjEodW5zaWduZWQgeCwgdW5zaWduZWQgeSkK K3sKKyAgLyogeCA8PSB5IHx8IHggPT0gMCAtLT4geCA8PSB5ICovCisgIHJl dHVybiB4IDw9IHkgfHwgeCA9PSAwOworfQorCitfQm9vbCBvcjIodW5zaWdu ZWQgeCwgdW5zaWduZWQgeSkKK3sKKyAgLyogeCA+PSB5IHx8IHggPT0gVUlO VF9NQVggLS0+IHggPj0geSAqLworICByZXR1cm4geCA+PSB5IHx8IHggPT0g VUlOVF9NQVg7Cit9CisKK19Cb29sIG9yMyhzaWduZWQgeCwgc2lnbmVkIHkp Cit7CisgIC8qIHggPD0geSB8fCB4ID09IElOVF9NSU4gLS0+IHggPD0geSAq LworICByZXR1cm4geCA8PSB5IHx8IHggPT0gSU5UX01JTjsKK30KKworX0Jv b2wgb3I0KHNpZ25lZCB4LCBzaWduZWQgeSkKK3sKKyAgLyogeCA+PSB5IHx8 IHggPT0gSU5UX01BWCAtLT4geCA+PSB5ICovCisgIHJldHVybiB4ID49IHkg fHwgeCA9PSBJTlRfTUFYOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10 cmVlLWR1bXAtbm90ICIgPT0gIiAiaWZjb21iaW5lIiB9IH0gKi8KZGlmZiAt LWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtMTIuYyBiL2dj Yy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtMTIuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNDc3YmJhMDc4MjEKLS0tIC9k ZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0LTEy LmMKQEAgLTAsMCArMSwzMCBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8K Ky8qIHsgZGctb3B0aW9ucyAiLU8yIC1mZHVtcC10cmVlLWRjZTMgLS1wYXJh bSBsb2dpY2FsLW9wLW5vbi1zaG9ydC1jaXJjdWl0PTEiIH0gKi8KKworI2lu Y2x1ZGUgPGxpbWl0cy5oPgorCitfQm9vbCBvcjEodW5zaWduZWQgeCwgdW5z aWduZWQgeSkKK3sKKyAgLyogeCA8PSB5IHx8IHggPT0gMCAtLT4geCA8PSB5 ICovCisgIHJldHVybiB4IDw9IHkgfHwgeCA9PSAwOworfQorCitfQm9vbCBv cjIodW5zaWduZWQgeCwgdW5zaWduZWQgeSkKK3sKKyAgLyogeCA+PSB5IHx8 IHggPT0gVUlOVF9NQVggLS0+IHggPj0geSAqLworICByZXR1cm4geCA+PSB5 IHx8IHggPT0gVUlOVF9NQVg7Cit9CisKK19Cb29sIG9yMyhzaWduZWQgeCwg c2lnbmVkIHkpCit7CisgIC8qIHggPD0geSB8fCB4ID09IElOVF9NSU4gLS0+ IHggPD0geSAqLworICByZXR1cm4geCA8PSB5IHx8IHggPT0gSU5UX01JTjsK K30KKworX0Jvb2wgb3I0KHNpZ25lZCB4LCBzaWduZWQgeSkKK3sKKyAgLyog eCA+PSB5IHx8IHggPT0gSU5UX01BWCAtLT4geCA+PSB5ICovCisgIHJldHVy biB4ID49IHkgfHwgeCA9PSBJTlRfTUFYOworfQorCisvKiB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAtbm90ICIgPT0gIiAiZGNlMyIgfSB9ICovCmRp ZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0LTIuYyBi L2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtMi5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4wMjY0NzIwNDcyNgotLS0g L2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQt Mi5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICov CisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtZmR1bXAtdHJlZS1naW1wbGUgLS1w YXJhbSBsb2dpY2FsLW9wLW5vbi1zaG9ydC1jaXJjdWl0PTEiIH0gKi8KKwor I2luY2x1ZGUgPGxpbWl0cy5oPgorCitfQm9vbCBhbmQxKHVuc2lnbmVkIHgs IHVuc2lnbmVkIHkpCit7CisgIC8qIHggPiB5ICYmIHggIT0gMCAtLT4geCA+ IHkgKi8KKyAgcmV0dXJuIHggPiB5ICYmIHggIT0gMDsKK30KKworX0Jvb2wg YW5kMih1bnNpZ25lZCB4LCB1bnNpZ25lZCB5KQoreworICAvKiB4IDwgeSAm JiB4ICE9IFVJTlRfTUFYIC0tPiB4IDwgeSAqLworICByZXR1cm4geCA8IHkg JiYgeCAhPSBVSU5UX01BWDsKK30KKworX0Jvb2wgYW5kMyhzaWduZWQgeCwg c2lnbmVkIHkpCit7CisgIC8qIHggPiB5ICYmIHggIT0gSU5UX01JTiAtLT4g eCA+IHkgKi8KKyAgcmV0dXJuIHggPiB5ICYmIHggIT0gSU5UX01JTjsKK30K KworX0Jvb2wgYW5kNChzaWduZWQgeCwgc2lnbmVkIHkpCit7CisgIC8qIHgg PCB5ICYmIHggIT0gSU5UX01BWCAtLT4geCA8IHkgKi8KKyAgcmV0dXJuIHgg PCB5ICYmIHggIT0gSU5UX01BWDsKK30KKworLyogeyBkZy1maW5hbCB7IHNj YW4tdHJlZS1kdW1wLW5vdCAiICE9ICIgImdpbXBsZSIgfSB9ICovCmRpZmYg LS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0LTMuYyBiL2dj Yy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtMy5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5iZTJjZTMxNWU2MAotLS0gL2Rl di9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtMy5j CkBAIC0wLDAgKzEsMzIgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisv KiB7IGRnLW9wdGlvbnMgIi1PMiAtZmR1bXAtdHJlZS1pZmNvbWJpbmUgLS1w YXJhbSBsb2dpY2FsLW9wLW5vbi1zaG9ydC1jaXJjdWl0PTAiIH0gKi8KKwor I2luY2x1ZGUgPGxpbWl0cy5oPgorCitfQm9vbCBhbmQxKHVuc2lnbmVkIHgs IHVuc2lnbmVkIHkpCit7CisgIC8qIHggPiB5ICYmIHggPT0gMCAtLT4gZmFs c2UgKi8KKyAgcmV0dXJuIHggPiB5ICYmIHggPT0gMDsKK30KKworX0Jvb2wg YW5kMih1bnNpZ25lZCB4LCB1bnNpZ25lZCB5KQoreworICAvKiB4IDwgeSAm JiB4ID09IFVJTlRfTUFYIC0tPiBmYWxzZSAqLworICByZXR1cm4geCA8IHkg JiYgeCA9PSBVSU5UX01BWDsKK30KKworX0Jvb2wgYW5kMyhzaWduZWQgeCwg c2lnbmVkIHkpCit7CisgIC8qIHggPiB5ICYmIHggPT0gSU5UX01JTiAtLT4g ZmFsc2UgKi8KKyAgcmV0dXJuIHggPiB5ICYmIHggPT0gSU5UX01JTjsKK30K KworX0Jvb2wgYW5kNChzaWduZWQgeCwgc2lnbmVkIHkpCit7CisgIC8qIHgg PCB5ICYmIHggPT0gSU5UX01BWCAtLT4gZmFsc2UgKi8KKyAgcmV0dXJuIHgg PCB5ICYmIHggPT0gSU5UX01BWDsKK30KKworLyogeyBkZy1maW5hbCB7IHNj YW4tdHJlZS1kdW1wLW5vdCAiID09ICIgImlmY29tYmluZSIgfSB9ICovCisv KiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtbm90ICIgPiAiICJpZmNv bWJpbmUiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1w LW5vdCAiIDwgIiAiaWZjb21iaW5lIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2dj Yy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtNC5jIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvcHI4ODc4NC00LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAuLmQxMzYzNjU5ZjQwCi0tLSAvZGV2L251bGwKKysr IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHI4ODc4NC00LmMKQEAgLTAsMCAr MSwzMiBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0 aW9ucyAiLU8yIC1mZHVtcC10cmVlLWdpbXBsZSAtLXBhcmFtIGxvZ2ljYWwt b3Atbm9uLXNob3J0LWNpcmN1aXQ9MSIgfSAqLworCisjaW5jbHVkZSA8bGlt aXRzLmg+CisKK19Cb29sIGFuZDEodW5zaWduZWQgeCwgdW5zaWduZWQgeSkK K3sKKyAgLyogeCA+IHkgJiYgeCA9PSAwIC0tPiBmYWxzZSAqLworICByZXR1 cm4geCA+IHkgJiYgeCA9PSAwOworfQorCitfQm9vbCBhbmQyKHVuc2lnbmVk IHgsIHVuc2lnbmVkIHkpCit7CisgIC8qIHggPCB5ICYmIHggPT0gVUlOVF9N QVggLS0+IGZhbHNlICovCisgIHJldHVybiB4IDwgeSAmJiB4ID09IFVJTlRf TUFYOworfQorCitfQm9vbCBhbmQzKHNpZ25lZCB4LCBzaWduZWQgeSkKK3sK KyAgLyogeCA+IHkgJiYgeCA9PSBJTlRfTUlOIC0tPiBmYWxzZSAqLworICBy ZXR1cm4geCA+IHkgJiYgeCA9PSBJTlRfTUlOOworfQorCitfQm9vbCBhbmQ0 KHNpZ25lZCB4LCBzaWduZWQgeSkKK3sKKyAgLyogeCA8IHkgJiYgeCA9PSBJ TlRfTUFYIC0tPiBmYWxzZSAqLworICByZXR1cm4geCA8IHkgJiYgeCA9PSBJ TlRfTUFYOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAt bm90ICIgPT0gIiAiZ2ltcGxlIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBz Y2FuLXRyZWUtZHVtcC1ub3QgIiA+ICIgImdpbXBsZSIgfSB9ICovCisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtbm90ICIgPCAiICJnaW1wbGUi IH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHI4 ODc4NC01LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0LTUuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYzZhMzQ5 ZDdjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5k Zy9wcjg4Nzg0LTUuYwpAQCAtMCwwICsxLDMxIEBACisvKiB7IGRnLWRvIGNv bXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLWZkdW1wLXRyZWUt aWZjb21iaW5lIC0tcGFyYW0gbG9naWNhbC1vcC1ub24tc2hvcnQtY2lyY3Vp dD0wIiB9ICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworX0Jvb2wgYW5k MSh1bnNpZ25lZCB4LCB1bnNpZ25lZCB5KQoreworICAvKiB4IDw9IHkgJiYg eCA9PSAwIC0tPiB4ID09IDAgKi8KKyAgcmV0dXJuIHggPD0geSAmJiB4ID09 IDA7Cit9CisKK19Cb29sIGFuZDIodW5zaWduZWQgeCwgdW5zaWduZWQgeSkK K3sKKyAgLyogeCA+PSB5ICYmIHggPT0gVUlOVF9NQVggLS0+IHggPT0gVUlO VF9NQVggKi8KKyAgcmV0dXJuIHggPj0geSAmJiB4ID09IFVJTlRfTUFYOwor fQorCitfQm9vbCBhbmQzKHNpZ25lZCB4LCBzaWduZWQgeSkKK3sKKyAgLyog eCA8PSB5ICYmIHggPT0gSU5UX01JTiAtLT4geCA9PSBJTlRfTUlOICovCisg IHJldHVybiB4IDw9IHkgJiYgeCA9PSBJTlRfTUlOOworfQorCitfQm9vbCBh bmQ0KHNpZ25lZCB4LCBzaWduZWQgeSkKK3sKKyAgLyogeCA+PSB5ICYmIHgg PT0gSU5UX01BWCAtLT4geCA9PSBJTlRfTUFYICovCisgIHJldHVybiB4ID49 IHkgJiYgeCA9PSBJTlRfTUFYOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi10cmVlLWR1bXAtbm90ICIgPD0gIiAiaWZjb21iaW5lIiB9IH0gKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3QgIiA+PSAiICJpZmNv bWJpbmUiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2Mu ZGcvcHI4ODc4NC02LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0 LTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u YjBlODFlMDE2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRl L2djYy5kZy9wcjg4Nzg0LTYuYwpAQCAtMCwwICsxLDMxIEBACisvKiB7IGRn LWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLWZkdW1w LXRyZWUtZ2ltcGxlIC0tcGFyYW0gbG9naWNhbC1vcC1ub24tc2hvcnQtY2ly Y3VpdD0xIiB9ICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworX0Jvb2wg YW5kMSh1bnNpZ25lZCB4LCB1bnNpZ25lZCB5KQoreworICAvKiB4IDw9IHkg JiYgeCA9PSAwIC0tPiB4ID09IDAgKi8KKyAgcmV0dXJuIHggPD0geSAmJiB4 ID09IDA7Cit9CisKK19Cb29sIGFuZDIodW5zaWduZWQgeCwgdW5zaWduZWQg eSkKK3sKKyAgLyogeCA+PSB5ICYmIHggPT0gVUlOVF9NQVggLS0+IHggPT0g VUlOVF9NQVggKi8KKyAgcmV0dXJuIHggPj0geSAmJiB4ID09IFVJTlRfTUFY OworfQorCitfQm9vbCBhbmQzKHNpZ25lZCB4LCBzaWduZWQgeSkKK3sKKyAg LyogeCA8PSB5ICYmIHggPT0gSU5UX01JTiAtLT4geCA9PSBJTlRfTUlOICov CisgIHJldHVybiB4IDw9IHkgJiYgeCA9PSBJTlRfTUlOOworfQorCitfQm9v bCBhbmQ0KHNpZ25lZCB4LCBzaWduZWQgeSkKK3sKKyAgLyogeCA+PSB5ICYm IHggPT0gSU5UX01BWCAtLT4geCA9PSBJTlRfTUFYICovCisgIHJldHVybiB4 ID49IHkgJiYgeCA9PSBJTlRfTUFYOworfQorCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAtbm90ICIgPD0gIiAiZ2ltcGxlIiB9IH0gKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3QgIiA+PSAiICJnaW1w bGUiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcv cHI4ODc4NC03LmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0LTcu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOTM3 ZDJkMjY1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2dj Yy5kZy9wcjg4Nzg0LTcuYwpAQCAtMCwwICsxLDMxIEBACisvKiB7IGRnLWRv IGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLWZkdW1wLXRy ZWUtaWZjb21iaW5lIC0tcGFyYW0gbG9naWNhbC1vcC1ub24tc2hvcnQtY2ly Y3VpdD0wIiB9ICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworX0Jvb2wg b3IxKHVuc2lnbmVkIHgsIHVuc2lnbmVkIHkpCit7CisgIC8qIHggPiB5IHx8 IHggIT0gMCAtLT4geCAhPSAwICovCisgIHJldHVybiB4ID4geSB8fCB4ICE9 IDA7Cit9CisKK19Cb29sIG9yMih1bnNpZ25lZCB4LCB1bnNpZ25lZCB5KQor eworICAvKiB4IDwgeSB8fCB4ICE9IFVJTlRfTUFYIC0tPiB4ICE9IFVJTlRf TUFYICovCisgIHJldHVybiB4IDwgeSB8fCB4ICE9IFVJTlRfTUFYOworfQor CitfQm9vbCBvcjMoc2lnbmVkIHgsIHNpZ25lZCB5KQoreworICAvKiB4ID4g eSB8fCB4ICE9IElOVF9NSU4gLS0+IHggIT0gSU5UX01JTiAqLworICByZXR1 cm4geCA+IHkgfHwgeCAhPSBJTlRfTUlOOworfQorCitfQm9vbCBvcjQoc2ln bmVkIHgsIHNpZ25lZCB5KQoreworICAvKiB4IDwgeSB8fCB4ICE9IElOVF9N QVggLS0+IHggIT0gSU5UX01BWCAqLworICByZXR1cm4geCA8IHkgfHwgeCAh PSBJTlRfTUFYOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1 bXAtbm90ICIgPiAiICJpZmNvbWJpbmUiIH0gfSAqLworLyogeyBkZy1maW5h bCB7IHNjYW4tdHJlZS1kdW1wLW5vdCAiIDwgIiAiaWZjb21iaW5lIiB9IH0g Ki8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQt OC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHI4ODc4NC04LmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmFhMzg0YzMwNWIx Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvcHI4 ODc4NC04LmMKQEAgLTAsMCArMSwzMSBAQAorLyogeyBkZy1kbyBjb21waWxl IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mZHVtcC10cmVlLWdpbXBs ZSAtLXBhcmFtIGxvZ2ljYWwtb3Atbm9uLXNob3J0LWNpcmN1aXQ9MSIgfSAq LworCisjaW5jbHVkZSA8bGltaXRzLmg+CisKK19Cb29sIG9yMSh1bnNpZ25l ZCB4LCB1bnNpZ25lZCB5KQoreworICAvKiB4ID4geSB8fCB4ICE9IDAgLS0+ IHggIT0gMCAqLworICByZXR1cm4geCA+IHkgfHwgeCAhPSAwOworfQorCitf Qm9vbCBvcjIodW5zaWduZWQgeCwgdW5zaWduZWQgeSkKK3sKKyAgLyogeCA8 IHkgfHwgeCAhPSBVSU5UX01BWCAtLT4geCAhPSBVSU5UX01BWCAqLworICBy ZXR1cm4geCA8IHkgfHwgeCAhPSBVSU5UX01BWDsKK30KKworX0Jvb2wgb3Iz KHNpZ25lZCB4LCBzaWduZWQgeSkKK3sKKyAgLyogeCA+IHkgfHwgeCAhPSBJ TlRfTUlOIC0tPiB4ICE9IElOVF9NSU4gKi8KKyAgcmV0dXJuIHggPiB5IHx8 IHggIT0gSU5UX01JTjsKK30KKworX0Jvb2wgb3I0KHNpZ25lZCB4LCBzaWdu ZWQgeSkKK3sKKyAgLyogeCA8IHkgfHwgeCAhPSBJTlRfTUFYIC0tPiB4ICE9 IElOVF9NQVggKi8KKyAgcmV0dXJuIHggPCB5IHx8IHggIT0gSU5UX01BWDsK K30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLW5vdCAiID4g IiAiZ2ltcGxlIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcC1ub3QgIiA8ICIgImdpbXBsZSIgfSB9ICovCmRpZmYgLS1naXQgYS9n Y2MvdGVzdHN1aXRlL2djYy5kZy9wcjg4Nzg0LTkuYyBiL2djYy90ZXN0c3Vp dGUvZ2NjLmRnL3ByODg3ODQtOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwLi45NGY2MmQ5NGVkZQotLS0gL2Rldi9udWxsCisr KyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ByODg3ODQtOS5jCkBAIC0wLDAg KzEsMzIgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9w dGlvbnMgIi1PMiAtZmR1bXAtdHJlZS1pZmNvbWJpbmUgLS1wYXJhbSBsb2dp Y2FsLW9wLW5vbi1zaG9ydC1jaXJjdWl0PTAiIH0gKi8KKworI2luY2x1ZGUg PGxpbWl0cy5oPgorCitfQm9vbCBvcjEodW5zaWduZWQgeCwgdW5zaWduZWQg eSkKK3sKKyAgLyogeCA8PSB5IHx8IHggIT0gMCAtLT4gdHJ1ZSAqLworICBy ZXR1cm4geCA8PSB5IHx8IHggIT0gMDsKK30KKworX0Jvb2wgb3IyKHVuc2ln bmVkIHgsIHVuc2lnbmVkIHkpCit7CisgIC8qIHggPj0geSB8fCB4ICE9IFVJ TlRfTUFYIC0tPiB0cnVlICovCisgIHJldHVybiB4ID49IHkgfHwgeCAhPSBV SU5UX01BWDsKK30KKworX0Jvb2wgb3IzKHNpZ25lZCB4LCBzaWduZWQgeSkK K3sKKyAgLyogeCA8PSB5IHx8IHggIT0gSU5UX01JTiAtLT4gdHJ1ZSAqLwor ICByZXR1cm4geCA8PSB5IHx8IHggIT0gSU5UX01JTjsKK30KKworX0Jvb2wg b3I0KHNpZ25lZCB4LCBzaWduZWQgeSkKK3sKKyAgLyogeCA+PSB5IHx8IHgg IT0gSU5UX01BWCAtLT4gdHJ1ZSAqLworICByZXR1cm4geCA+PSB5IHx8IHgg IT0gSU5UX01BWDsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1k dW1wLW5vdCAiICE9ICIgImlmY29tYmluZSIgfSB9ICovCisvKiB7IGRnLWZp bmFsIHsgc2Nhbi10cmVlLWR1bXAtbm90ICIgPD0gIiAiaWZjb21iaW5lIiB9 IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3QgIiA+ PSAiICJpZmNvbWJpbmUiIH0gfSAqLwotLSAKMi4xNy4xCgo= --------------A02EBFEF83A8DCAF1C263DB5--