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 B912F3858D33 for ; Fri, 20 Oct 2023 03:23:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B912F3858D33 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org B912F3858D33 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697772248; cv=none; b=dsjFOi5CgZFz8dVHPRvjrBLNtnugSoNCIGWCdGwJ5SjvZ2FNJjARgxx1D1RAFrBtx7nZeTYOkEFCeB3Y7x3ULkGUETo94kM+i0J60KxPiMzM+WfJiHrn8wqcXHt19xkTqO5q93/SuTK8Us6mANvGWdNFjoATEsBMDa5xb1tjebI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697772248; c=relaxed/simple; bh=nBOzzdGezxbtcuAQZ7SPulY/dRKQxa6UkNVzIbHJryg=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From; b=HfR1lp6pnbhJXBY2qts3dbwfXAyNYytXPdDPZjFRDFZbznoK8DyazgPfVuswCPJJo5vIju7GiiHfKZ6CHMwXp7dREu5lZdU61pEef4r+3J6IgeDYfymJ3bu2ou2zgTHvtorB62iXb6Iyqdw1rlX8/fZS7ApCNVdTRrX5aOT+Scg= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1697772237; 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=On8dE0PMrfdxEXlQg5zsNIT2A2ePk4qgUSkb3E7g5tk=; b=LHmmkALMUBavglMDaZQbz/O5qVRoew0cASx4IgHZ5uDuKFHE3G5uNpG097ELIgi0RqHCf4 pb43Re6yBYYBM5/yXx7qiOsusRD37iZWnL/OGlqila7sQ3ZItfpvCnTkCFwkNm/bD6vOAD aKHDnLahIxQ1qQ9Gv01ApTFAOvfD7e4= 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_256_GCM_SHA384) id us-mta-57-tlVVnzaZMo6b9qPZG9f-lQ-1; Thu, 19 Oct 2023 23:23:55 -0400 X-MC-Unique: tlVVnzaZMo6b9qPZG9f-lQ-1 Received: by mail-qt1-f200.google.com with SMTP id d75a77b69052e-4180bc4227bso23738851cf.1 for ; Thu, 19 Oct 2023 20:23:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697772234; x=1698377034; h=in-reply-to:from:references:cc:to:content-language:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=xDOEXgn+u6bRG0jzrjHjkPdLTCNr2cW0C8sQPkPBPRE=; b=hbz0/2cv4KcCDDjs9e0wmo4oLo0EsGf3UxZT4KnO+PFYMD+crkCG+KrTSjSXeiRPBU Nk/FqBSXs5BvI00k9COFeFmFSPwzaIku7LzZZ8G3bcEVWWi9XE7UlnKyryv9/R1irIxV MjBs5DFcGabkdEZ+CzJ62mgaMD/JXEtx+O/QJ3Sfax//rFpLcJdsrY3uUONHTjscTFqo TDJdOusO5GMWmKtL5BgZKw2nKItCSNHvbrxO4hUbzjue8CEqXHqfWgTu/JVFCZ8+EMHd f78qfAFD6xnfLKpiSkrsz6U/jhf4a2i0bPX+ugE1cR3sjW+5Vd6gq/6I/LFBf90QdiY2 JdaA== X-Gm-Message-State: AOJu0YzlYrqquv+/b6MLC3lfhc6VeW3Z1Z4758KJT5oKE88lN/aqK56P cQgfIXktzkAEYZ64a0MJlwML5prDKWqWtJ7vWbnAUvmrfFm+g3rckG885Y6gZgOejGgribwmRa1 lQ2D/VSWRCP/xvnM1XQ== X-Received: by 2002:ac8:7f47:0:b0:418:cec:5e64 with SMTP id g7-20020ac87f47000000b004180cec5e64mr6404906qtk.19.1697772234518; Thu, 19 Oct 2023 20:23:54 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEBCIPwz4ozzzy1ZgEZc/xVRle11J7h9KE+4882ixSL9ULVfUuqWa+Cws9oqzMcYxKBzbIG2w== X-Received: by 2002:ac8:7f47:0:b0:418:cec:5e64 with SMTP id g7-20020ac87f47000000b004180cec5e64mr6404893qtk.19.1697772234075; Thu, 19 Oct 2023 20:23:54 -0700 (PDT) Received: from [192.168.1.108] (130-44-146-16.s12558.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.146.16]) by smtp.gmail.com with ESMTPSA id x9-20020ac85f09000000b004181a8a3e2dsm299719qta.41.2023.10.19.20.23.52 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 19 Oct 2023 20:23:53 -0700 (PDT) Message-ID: <8f1036cd-f9a5-4cbe-8b12-1fd42f013862@redhat.com> Date: Thu, 19 Oct 2023 23:23:52 -0400 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v6] c++: Check for indirect change of active union member in constexpr [PR101631,PR102286] To: Nathaniel Shead Cc: gcc-patches@gcc.gnu.org References: <65235160.170a0220.4cbca.5c7d@mx.google.com> <65255623.620a0220.39bb2.41d9@mx.google.com> <6527b428.170a0220.810bd.457e@mx.google.com> <65286db4.630a0220.196a2.79cb@mx.google.com> From: Jason Merrill In-Reply-To: <65286db4.630a0220.196a2.79cb@mx.google.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="------------FKJNHLqPRoyrvgdH8J0k0isU" Content-Language: en-US X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,PDS_OTHER_BAD_TLD,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,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. --------------FKJNHLqPRoyrvgdH8J0k0isU Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 10/12/23 18:05, Nathaniel Shead wrote: > On Thu, Oct 12, 2023 at 04:24:00PM -0400, Jason Merrill wrote: >> On 10/12/23 04:53, Nathaniel Shead wrote: >>> On Wed, Oct 11, 2023 at 12:48:12AM +1100, Nathaniel Shead wrote: >>>> On Mon, Oct 09, 2023 at 04:46:46PM -0400, Jason Merrill wrote: >>>>> On 10/8/23 21:03, Nathaniel Shead wrote: >>>>>> Ping for https://gcc.gnu.org/pipermail/gcc-patches/2023-September/631203.html >>>>>> >>>>>> + && (TREE_CODE (t) == MODIFY_EXPR >>>>>> + /* Also check if initializations have implicit change of active >>>>>> + member earlier up the access chain. */ >>>>>> + || !refs->is_empty()) >>>>> >>>>> I'm not sure what the cumulative point of these two tests is. TREE_CODE (t) >>>>> will be either MODIFY_EXPR or INIT_EXPR, and either should be OK. >>>>> >>>>> As I understand it, the problematic case is something like >>>>> constexpr-union2.C, where we're also looking at a MODIFY_EXPR. So what is >>>>> this check doing? >>>> >>>> The reasoning was to correctly handle cases like the the following (in >>>> constexpr-union6.C): >>>> >>>> constexpr int test1() { >>>> U u {}; >>>> std::construct_at(&u.s, S{ 1, 2 }); >>>> return u.s.b; >>>> } >>>> static_assert(test1() == 2); >>>> >>>> The initialisation of &u.s here is not a member access expression within >>>> the call to std::construct_at, since it's just a pointer, but this code >>>> is still legal; in general, an INIT_EXPR to initialise a union member >>>> should always be OK (I believe?), hence constraining to just >>>> MODIFY_EXPR. >>>> >>>> However, just that would then (incorrectly) allow all the following >>>> cases in that test to compile, such as >>>> >>>> constexpr int test2() { >>>> U u {}; >>>> int* p = &u.s.b; >>>> std::construct_at(p, 5); >>>> return u.s.b; >>>> } >>>> constexpr int x2 = test2(); >>>> >>>> since the INIT_EXPR is really only initialising 'b', but the implicit >>>> "modification" of active member to 'u.s' is illegal. >>>> >>>> Maybe a better way of expressing this condition would be something like >>>> this? >>>> >>>> /* An INIT_EXPR of the last member in an access chain is always OK, >>>> but still check implicit change of members earlier on; see >>>> cpp2a/constexpr-union6.C. */ >>>> && !(TREE_CODE (t) == INIT_EXPR && refs->is_empty ()) >>>> >>>> Otherwise I'll see if I can rework some of the other conditions instead. >>>> >>>>> Incidentally, I think constexpr-union6.C could use a test where we pass &u.s >>>>> to a function other than construct_at, and then try (and fail) to assign to >>>>> the b member from that function. >>>>> >>>>> Jason >>>>> >>>> >>>> Sounds good; I've added the following test: >>>> >>>> constexpr void foo(S* s) { >>>> s->b = 10; // { dg-error "accessing .U::s. member instead of initialized .U::k." } >>>> } >>>> constexpr int test3() { >>>> U u {}; >>>> foo(&u.s); // { dg-message "in .constexpr. expansion" } >>>> return u.s.b; >>>> } >>>> constexpr int x3 = test3(); // { dg-message "in .constexpr. expansion" } >>>> >>>> Incidentally I found this particular example caused a very unhelpful >>>> error + ICE due to reporting that S could not be value-initialized in >>>> the current version of the patch. The updated version below fixes that >>>> by using 'build_zero_init' instead -- is this an appropriate choice >>>> here? >>>> >>>> A similar (but unrelated) issue is with e.g. >>>> struct S { const int a; int b; }; >>>> union U { int k; S s; }; >>>> >>>> constexpr int test() { >>>> U u {}; >>>> return u.s.b; >>>> } >>>> constexpr int x = test(); >>>> >>>> giving me this pretty unhelpful error message: >>>> >>>> /home/ns/main.cpp:8:23: in ‘constexpr’ expansion of ‘test()’ >>>> /home/ns/main.cpp:6:12: error: use of deleted function ‘S::S()’ >>>> 6 | return u.s.b; >>>> | ~~^ >>>> /home/ns/main.cpp:1:8: note: ‘S::S()’ is implicitly deleted because the default definition would be ill-formed: >>>> 1 | struct S { const int a; int b; }; >>>> | ^ >>>> /home/ns/main.cpp:1:8: error: uninitialised const member in ‘struct S’ >>>> /home/ns/main.cpp:1:22: note: ‘const int S::a’ should be initialised >>>> 1 | struct S { const int a; int b; }; >>>> | ^ >>>> /home/ns/main.cpp:8:23: in ‘constexpr’ expansion of ‘test()’ >>>> /home/ns/main.cpp:6:12: error: use of deleted function ‘S::S()’ >>>> 6 | return u.s.b; >>>> | ~~^ >>>> /home/ns/main.cpp:8:23: in ‘constexpr’ expansion of ‘test()’ >>>> /home/ns/main.cpp:6:12: error: use of deleted function ‘S::S()’ >>>> >>>> but I'll try and fix this separately (it exists on current trunk without >>>> this patch as well). >>> >>> While attempting to fix this I found a much better way of handling >>> value-initialised unions. Here's a new version of the patch which also >>> includes the fix for accessing the wrong member of a value-initialised >>> union as well. >>> >>> Additionally includes an `auto_diagnostic_group` for the `inform` >>> diagnostics as Marek helpfully informed me about in my other patch. >>> >>> Bootstrapped and regtested on x86_64-pc-linux-gnu. >>> >>>> @@ -4496,21 +4491,36 @@ cxx_eval_component_reference (const constexpr_ctx *ctx, tree t, >>> break; >>> } >>> } >>> - if (TREE_CODE (TREE_TYPE (whole)) == UNION_TYPE >>> - && CONSTRUCTOR_NELTS (whole) > 0) >>> + if (TREE_CODE (TREE_TYPE (whole)) == UNION_TYPE) >>> { >>> - /* DR 1188 says we don't have to deal with this. */ >>> - if (!ctx->quiet) >>> + if (CONSTRUCTOR_NELTS (whole) > 0) >>> { >>> - constructor_elt *cep = CONSTRUCTOR_ELT (whole, 0); >>> - if (cep->value == NULL_TREE) >>> - error ("accessing uninitialized member %qD", part); >>> - else >>> - error ("accessing %qD member instead of initialized %qD member in " >>> - "constant expression", part, cep->index); >>> + /* DR 1188 says we don't have to deal with this. */ >>> + if (!ctx->quiet) >>> + { >>> + constructor_elt *cep = CONSTRUCTOR_ELT (whole, 0); >>> + if (cep->value == NULL_TREE) >>> + error ("accessing uninitialized member %qD", part); >>> + else >>> + error ("accessing %qD member instead of initialized %qD member in " >>> + "constant expression", part, cep->index); >>> + } >>> + *non_constant_p = true; >>> + return t; >>> + } >>> + else if (!CONSTRUCTOR_NO_CLEARING (whole)) >>> + { >>> + /* Value-initialized union, check if looking at the first member. */ >>> + tree first = next_aggregate_field (TYPE_FIELDS (TREE_TYPE (whole))); >>> + if (pmf ? DECL_NAME (first) != DECL_NAME (part) : first != part) >> >> You don't need to consider pmf here, since a PMF isn't UNION_TYPE. > > Ah right, thanks. > >>> @@ -6267,23 +6288,74 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t, >>> break; >>> } >>> + /* Process value-initialization of a union. */ >>> + if (code == UNION_TYPE >>> + && !CONSTRUCTOR_NO_CLEARING (*valp) >>> + && CONSTRUCTOR_NELTS (*valp) == 0) >>> + if (tree first = next_aggregate_field (TYPE_FIELDS (type))) >>> + CONSTRUCTOR_APPEND_ELT (CONSTRUCTOR_ELTS (*valp), first, NULL_TREE); >> >> Isn't this adding an uninitialized member instead of value-initialized? > > This is equivalent to what was going to happen at the end of the loop > when 'get_or_insert_ctor_field (*valp, index)' is called regardless. > A value-initialized subobject is then created at the start of the loop > (based on 'no_zero_init') replacing the NULL_TREE here. Ah, indeed. I'm applying this tweaked patch, thanks: --------------FKJNHLqPRoyrvgdH8J0k0isU Content-Type: text/x-patch; charset=UTF-8; name="0001-c-indirect-change-of-active-union-member-in-constexp.patch" Content-Disposition: attachment; filename*0="0001-c-indirect-change-of-active-union-member-in-constexp.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA2N2VhODYwODJlMzI0NzMzNjU1ZjM3OTBkNDQ3NWJhZjNkNjIxOThkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYXRoYW5pZWwgU2hlYWQgPG5hdGhhbmllbG9zaGVhZEBnbWFp bC5jb20+CkRhdGU6IFRodSwgMTIgT2N0IDIwMjMgMTk6NTM6NTUgKzExMDAKU3ViamVjdDogW1BB VENIXSBjKys6IGluZGlyZWN0IGNoYW5nZSBvZiBhY3RpdmUgdW5pb24gbWVtYmVyIGluIGNvbnN0 ZXhwcgogW1BSMTAxNjMxLFBSMTAyMjg2XQpUbzogZ2NjLXBhdGNoZXNAZ2NjLmdudS5vcmcKClRo aXMgcGF0Y2ggYWRkcyBjaGVja3MgZm9yIGF0dGVtcHRpbmcgdG8gY2hhbmdlIHRoZSBhY3RpdmUg bWVtYmVyIG9mIGEKdW5pb24gYnkgbWV0aG9kcyBvdGhlciB0aGFuIGEgbWVtYmVyIGFjY2VzcyBl eHByZXNzaW9uLgoKVG8gYmUgYWJsZSB0byBwcm9wZXJseSBkaXN0aW5ndWlzaCBgKigmdS5hKSA9 IGAgZnJvbSBgdS5hID0gYCwgdGhpcwpwYXRjaCByZWRvZXMgdGhlIHNvbHV0aW9uIGZvciBjKysv NTk5NTAgdG8gYXZvaWQgZXh0cmFubmVvdXMgKiY7IGl0CnNlZW1zIHRoYXQgdGhlIG9ubHkgY2Fz ZSB0aGF0IG5lZWRlZCB0aGUgd29ya2Fyb3VuZCB3YXMgd2hlbiBjb3B5aW5nCmVtcHR5IGNsYXNz ZXMuCgpUaGlzIHBhdGNoIGFsc28gZW5zdXJlcyB0aGF0IGNvbnN0cnVjdG9ycyBmb3IgYSB1bmlv biBmaWVsZCBtYXJrIHRoYXQKZmllbGQgYXMgdGhlIGFjdGl2ZSBtZW1iZXIgYmVmb3JlIGVudGVy aW5nIHRoZSBjYWxsIGl0c2VsZjsgdGhpcyBlbnN1cmVzCnRoYXQgbW9kaWZpY2F0aW9ucyBvZiB0 aGUgZmllbGQgd2l0aGluIHRoZSBjb25zdHJ1Y3RvcidzIGJvZHkgZG9uJ3QKY2F1c2UgZmFsc2Ug cG9zaXRpdmVzIChhcyB0aGVzZSB3aWxsIG5vdCBhcHBlYXIgdG8gYmUgbWVtYmVyIGFjY2Vzcwpl eHByZXNzaW9ucykuIFRoaXMgbWVhbnMgdGhhdCB3ZSBubyBsb25nZXIgbmVlZCB0byBzdGFydCB0 aGUgbGlmZXRpbWUgb2YKZW1wdHkgdW5pb24gbWVtYmVycyBhZnRlciB0aGUgY29uc3RydWN0b3Ig Ym9keSBjb21wbGV0ZXMuCgpBcyBhIGRyaXZlLWJ5IGZpeCwgdGhpcyBwYXRjaCBhbHNvIGVuc3Vy ZXMgdGhhdCB2YWx1ZS1pbml0aWFsaXNlZCB1bmlvbnMKYXJlIGNvbnNpZGVyZWQgdG8gaGF2ZSBh Y3RpdmF0ZWQgdGhlaXIgaW5pdGlhbCBtZW1iZXIgZm9yIHRoZSBwdXJwb3NlIG9mCmNoZWNraW5n IHN0b3JlcyBhbmQgYWNjZXNzZXMsIHdoaWNoIGNhdGNoZXMgc29tZSBhZGRpdGlvbmFsIG1pc3Rh a2VzCnByZS1DKysyMC4KCglQUiBjKysvMTAxNjMxCglQUiBjKysvMTAyMjg2CgpnY2MvY3AvQ2hh bmdlTG9nOgoKCSogY2FsbC5jYyAoYnVpbGRfb3Zlcl9jYWxsKTogRm9sZCBtb3JlIGluZGlyZWN0 IHJlZnMgZm9yIHRyaXZpYWwKCWFzc2lnbm1lbnQgb3AuCgkqIGNsYXNzLmNjICh0eXBlX2hhc19u b25fZGVsZXRlZF90cml2aWFsX2RlZmF1bHRfY3Rvcik6IENyZWF0ZS4KCSogY29uc3RleHByLmNj IChjeHhfZXZhbF9jYWxsX2V4cHJlc3Npb24pOiBTdGFydCBsaWZldGltZSBvZgoJdW5pb24gbWVt YmVyIGJlZm9yZSBlbnRlcmluZyBjb25zdHJ1Y3Rvci4KICAgICAgICAoY3h4X2V2YWxfY29tcG9u ZW50X3JlZmVyZW5jZSk6IENoZWNrIGFnYWluc3QgZmlyc3QgbWVtYmVyIG9mCiAgICAgICAgdmFs dWUtaW5pdGlhbGlzZWQgdW5pb24uCgkoY3h4X2V2YWxfc3RvcmVfZXhwcmVzc2lvbik6IEFjdGl2 YXRlIG1lbWJlciBmb3IKCXZhbHVlLWluaXRpYWxpc2VkIHVuaW9uLiBDaGVjayBmb3IgYWNjZXNz aW5nIGluYWN0aXZlIHVuaW9uCgltZW1iZXIgaW5kaXJlY3RseS4KCSogY3AtdHJlZS5oICh0eXBl X2hhc19ub25fZGVsZXRlZF90cml2aWFsX2RlZmF1bHRfY3Rvcik6CglGb3J3YXJkIGRlY2xhcmUu CgpnY2MvdGVzdHN1aXRlL0NoYW5nZUxvZzoKCgkqIGcrKy5kZy9jcHAxeS9jb25zdGV4cHItODkz MzYtMy5DOiBGaXggdW5pb24gaW5pdGlhbGlzYXRpb24uCgkqIGcrKy5kZy9jcHAxeS9jb25zdGV4 cHItdW5pb242LkM6IE5ldyB0ZXN0LgoJKiBnKysuZGcvY3BwMXkvY29uc3RleHByLXVuaW9uNy5D OiBOZXcgdGVzdC4KCSogZysrLmRnL2NwcDJhL2NvbnN0ZXhwci11bmlvbjIuQzogTmV3IHRlc3Qu CgkqIGcrKy5kZy9jcHAyYS9jb25zdGV4cHItdW5pb24zLkM6IE5ldyB0ZXN0LgoJKiBnKysuZGcv Y3BwMmEvY29uc3RleHByLXVuaW9uNC5DOiBOZXcgdGVzdC4KCSogZysrLmRnL2NwcDJhL2NvbnN0 ZXhwci11bmlvbjUuQzogTmV3IHRlc3QuCgkqIGcrKy5kZy9jcHAyYS9jb25zdGV4cHItdW5pb242 LkM6IE5ldyB0ZXN0LgoKU2lnbmVkLW9mZi1ieTogTmF0aGFuaWVsIFNoZWFkIDxuYXRoYW5pZWxv c2hlYWRAZ21haWwuY29tPgpSZXZpZXdlZC1ieTogSmFzb24gTWVycmlsbCA8amFzb25AcmVkaGF0 LmNvbT4KLS0tCiBnY2MvY3AvY3AtdHJlZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgIDEgKwogZ2NjL2NwL2NhbGwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg IDExICstCiBnY2MvY3AvY2xhc3MuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDggKwogZ2NjL2NwL2NvbnN0ZXhwci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTY2 ICsrKysrKysrKysrKystLS0tLQogLi4uL2crKy5kZy9jcHAxeS9jb25zdGV4cHItODkzMzYtMy5D ICAgICAgICAgIHwgICAyICstCiBnY2MvdGVzdHN1aXRlL2crKy5kZy9jcHAxeS9jb25zdGV4cHIt dW5pb242LkMgfCAgMTMgKysKIGdjYy90ZXN0c3VpdGUvZysrLmRnL2NwcDF5L2NvbnN0ZXhwci11 bmlvbjcuQyB8ICAxOCArKwogZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEvY29uc3RleHByLXVu aW9uMi5DIHwgIDMwICsrKysKIGdjYy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL2NvbnN0ZXhwci11 bmlvbjMuQyB8ICA0NSArKysrKwogZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEvY29uc3RleHBy LXVuaW9uNC5DIHwgIDI5ICsrKwogZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEvY29uc3RleHBy LXVuaW9uNS5DIHwgIDgwICsrKysrKysrKwogZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEvY29u c3RleHByLXVuaW9uNi5DIHwgIDUzICsrKysrKwogMTIgZmlsZXMgY2hhbmdlZCwgNDAzIGluc2Vy dGlvbnMoKyksIDUzIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3Vp dGUvZysrLmRnL2NwcDF5L2NvbnN0ZXhwci11bmlvbjYuQwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdj Yy90ZXN0c3VpdGUvZysrLmRnL2NwcDF5L2NvbnN0ZXhwci11bmlvbjcuQwogY3JlYXRlIG1vZGUg MTAwNjQ0IGdjYy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL2NvbnN0ZXhwci11bmlvbjIuQwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL2NvbnN0ZXhwci11bmlv bjMuQwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL2NvbnN0 ZXhwci11bmlvbjQuQwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZysrLmRnL2Nw cDJhL2NvbnN0ZXhwci11bmlvbjUuQwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUv ZysrLmRnL2NwcDJhL2NvbnN0ZXhwci11bmlvbjYuQwoKZGlmZiAtLWdpdCBhL2djYy9jcC9jcC10 cmVlLmggYi9nY2MvY3AvY3AtdHJlZS5oCmluZGV4IDFkN2RmNjI5NjFlLi44Yzc1ZDAzNjEyZiAx MDA2NDQKLS0tIGEvZ2NjL2NwL2NwLXRyZWUuaAorKysgYi9nY2MvY3AvY3AtdHJlZS5oCkBAIC02 ODE3LDYgKzY4MTcsNyBAQCBleHRlcm4gYm9vbCB0cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3Jf aXNfY29uc3RleHByICh0cmVlKTsKIGV4dGVybiBib29sIHR5cGVfaGFzX2NvbnN0ZXhwcl9kZWZh dWx0X2NvbnN0cnVjdG9yICh0cmVlKTsKIGV4dGVybiBib29sIHR5cGVfaGFzX2NvbnN0ZXhwcl9k ZXN0cnVjdG9yCSh0cmVlKTsKIGV4dGVybiBib29sIHR5cGVfaGFzX3ZpcnR1YWxfZGVzdHJ1Y3Rv cgkJKHRyZWUpOworZXh0ZXJuIGJvb2wgdHlwZV9oYXNfbm9uX2RlbGV0ZWRfdHJpdmlhbF9kZWZh dWx0X2N0b3IgKHRyZWUpOwogZXh0ZXJuIGJvb2wgY2xhc3N0eXBlX2hhc19tb3ZlX2Fzc2lnbl9v cl9tb3ZlX2N0b3JfcCAodHJlZSwgYm9vbCB1c2VyX2RlY2xhcmVkKTsKIGV4dGVybiBib29sIGNs YXNzdHlwZV9oYXNfbm9uX2RlbGV0ZWRfbW92ZV9jdG9yICh0cmVlKTsKIGV4dGVybiB0cmVlIGNs YXNzdHlwZV9oYXNfZGVwcl9pbXBsaWNpdF9jb3B5CSh0cmVlKTsKZGlmZiAtLWdpdCBhL2djYy9j cC9jYWxsLmNjIGIvZ2NjL2NwL2NhbGwuY2MKaW5kZXggZThkYWZiZDhiYTYuLmMxZmI4ODA3ZDNm IDEwMDY0NAotLS0gYS9nY2MvY3AvY2FsbC5jYworKysgYi9nY2MvY3AvY2FsbC5jYwpAQCAtMTAz MzAsMTAgKzEwMzMwLDcgQEAgYnVpbGRfb3Zlcl9jYWxsIChzdHJ1Y3Qgel9jYW5kaWRhdGUgKmNh bmQsIGludCBmbGFncywgdHN1YnN0X2ZsYWdzX3QgY29tcGxhaW4pCiAJICAgJiYgREVDTF9PVkVS TE9BREVEX09QRVJBVE9SX0lTIChmbiwgTk9QX0VYUFIpCiAJICAgJiYgdHJpdmlhbF9mbl9wIChm bikpCiAgICAgewotICAgICAgLyogRG9uJ3QgdXNlIGNwX2J1aWxkX2ZvbGRfaW5kaXJlY3RfcmVm LCBvcD0gcmV0dXJucyBhbiBsdmFsdWUgZXZlbiBpZgotCSB0aGUgb2JqZWN0IGFyZ3VtZW50IGlz bid0IG9uZS4gICovCi0gICAgICB0cmVlIHRvID0gY3BfYnVpbGRfaW5kaXJlY3RfcmVmIChpbnB1 dF9sb2NhdGlvbiwgYXJnYXJyYXlbMF0sCi0JCQkJICAgICAgIFJPX0FSUk9XLCBjb21wbGFpbik7 CisgICAgICB0cmVlIHRvID0gY3BfYnVpbGRfZm9sZF9pbmRpcmVjdF9yZWYgKGFyZ2FycmF5WzBd KTsKICAgICAgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAodG8pOwogICAgICAgdHJlZSBhc19iYXNl ID0gQ0xBU1NUWVBFX0FTX0JBU0UgKHR5cGUpOwogICAgICAgdHJlZSBhcmcgPSBhcmdhcnJheVsx XTsKQEAgLTEwMzQxLDcgKzEwMzM4LDExIEBAIGJ1aWxkX292ZXJfY2FsbCAoc3RydWN0IHpfY2Fu ZGlkYXRlICpjYW5kLCBpbnQgZmxhZ3MsIHRzdWJzdF9mbGFnc190IGNvbXBsYWluKQogCiAgICAg ICBpZiAoaXNfcmVhbGx5X2VtcHR5X2NsYXNzICh0eXBlLCAvKmlnbm9yZV92cHRyKi90cnVlKSkK IAl7Ci0JICAvKiBBdm9pZCBjb3B5aW5nIGVtcHR5IGNsYXNzZXMuICAqLworCSAgLyogQXZvaWQg Y29weWluZyBlbXB0eSBjbGFzc2VzLCBidXQgZW5zdXJlIG9wPSByZXR1cm5zIGFuIGx2YWx1ZSBl dmVuCisJICAgICBpZiB0aGUgb2JqZWN0IGFyZ3VtZW50IGlzbid0IG9uZS4gVGhpcyBpc24ndCBu ZWVkZWQgaW4gb3RoZXIgY2FzZXMKKwkgICAgIHNpbmNlIE1PRElGWV9FWFBSIGlzIGFsd2F5cyBj b25zaWRlcmVkIGFuIGx2YWx1ZS4gICovCisJICB0byA9IGNwX2J1aWxkX2FkZHJfZXhwciAodG8s IHRmX25vbmUpOworCSAgdG8gPSBjcF9idWlsZF9pbmRpcmVjdF9yZWYgKGlucHV0X2xvY2F0aW9u LCB0bywgUk9fQVJST1csIGNvbXBsYWluKTsKIAkgIHZhbCA9IGJ1aWxkMiAoQ09NUE9VTkRfRVhQ UiwgdHlwZSwgYXJnLCB0byk7CiAJICBzdXBwcmVzc193YXJuaW5nICh2YWwsIE9QVF9XdW51c2Vk KTsKIAl9CmRpZmYgLS1naXQgYS9nY2MvY3AvY2xhc3MuY2MgYi9nY2MvY3AvY2xhc3MuY2MKaW5k ZXggYjcxMzMzYWYxZjguLmUzMWFlYjhlNjhiIDEwMDY0NAotLS0gYS9nY2MvY3AvY2xhc3MuY2MK KysrIGIvZ2NjL2NwL2NsYXNzLmNjCkBAIC01Njg4LDYgKzU2ODgsMTQgQEAgdHlwZV9oYXNfdmly dHVhbF9kZXN0cnVjdG9yICh0cmVlIHR5cGUpCiAgIHJldHVybiAoZHRvciAmJiBERUNMX1ZJUlRV QUxfUCAoZHRvcikpOwogfQogCisvKiBUcnVlIGlmZiBjbGFzcyBUWVBFIGhhcyBhIG5vbi1kZWxl dGVkIHRyaXZpYWwgZGVmYXVsdAorICAgY29uc3RydWN0b3IuICAqLworCitib29sIHR5cGVfaGFz X25vbl9kZWxldGVkX3RyaXZpYWxfZGVmYXVsdF9jdG9yICh0cmVlIHR5cGUpCit7CisgIHJldHVy biBUWVBFX0hBU19UUklWSUFMX0RGTFQgKHR5cGUpICYmIGxvY2F0ZV9jdG9yICh0eXBlKTsKK30K KwogLyogUmV0dXJucyB0cnVlIGlmZiBULCBhIGNsYXNzLCBoYXMgYSBtb3ZlLWFzc2lnbm1lbnQg b3IKICAgIG1vdmUtY29uc3RydWN0b3IuICBEb2VzIG5vdCBsYXppbHkgZGVjbGFyZSBlaXRoZXIu CiAgICBJZiBVU0VSX1AgaXMgZmFsc2UsIGFueSBtb3ZlIGZ1bmN0aW9uIHdpbGwgZG8uICBJZiBp dCBpcyB0cnVlLCB0aGUKZGlmZiAtLWdpdCBhL2djYy9jcC9jb25zdGV4cHIuY2MgYi9nY2MvY3Av Y29uc3RleHByLmNjCmluZGV4IDdjOGYyY2MxODlkLi5hYTEyMWIwZWRiYyAxMDA2NDQKLS0tIGEv Z2NjL2NwL2NvbnN0ZXhwci5jYworKysgYi9nY2MvY3AvY29uc3RleHByLmNjCkBAIC0zMTYwLDQw ICszMTYwLDM0IEBAIGN4eF9ldmFsX2NhbGxfZXhwcmVzc2lvbiAoY29uc3QgY29uc3RleHByX2N0 eCAqY3R4LCB0cmVlIHQsCiAJICAgIGN4eF9zZXRfb2JqZWN0X2NvbnN0bmVzcyAoY3R4LCBuZXdf b2JqLCAvKnJlYWRvbmx5X3A9Ki9mYWxzZSwKIAkJCQkgICAgICBub25fY29uc3RhbnRfcCwgb3Zl cmZsb3dfcCk7CiAKKwkgIC8qIElmIHRoaXMgaXMgYSBjb25zdHJ1Y3Rvciwgd2UgYXJlIGJlZ2lu bmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlCisJICAgICBvYmplY3Qgd2UgYXJlIGluaXRpYWxpemlu Zy4gICovCisJICBpZiAobmV3X29iagorCSAgICAgICYmIERFQ0xfQ09OU1RSVUNUT1JfUCAoZnVu KQorCSAgICAgICYmIFRSRUVfQ09ERSAobmV3X29iaikgPT0gQ09NUE9ORU5UX1JFRgorCSAgICAg ICYmIFRSRUVfQ09ERSAoVFJFRV9UWVBFIChUUkVFX09QRVJBTkQgKG5ld19vYmosIDApKSkgPT0g VU5JT05fVFlQRSkKKwkgICAgeworCSAgICAgIHRyZWUgYWN0aXZhdGUgPSBidWlsZDIgKElOSVRf RVhQUiwgVFJFRV9UWVBFIChuZXdfb2JqKSwKKwkJCQkgICAgICBuZXdfb2JqLAorCQkJCSAgICAg IGJ1aWxkX2NvbnN0cnVjdG9yIChUUkVFX1RZUEUgKG5ld19vYmopLAorCQkJCQkJCSBOVUxMKSk7 CisJICAgICAgY3h4X2V2YWxfY29uc3RhbnRfZXhwcmVzc2lvbiAoY3R4LCBhY3RpdmF0ZSwKKwkJ CQkJICAgIGx2YWwsIG5vbl9jb25zdGFudF9wLCBvdmVyZmxvd19wKTsKKwkgICAgICBnZ2NfZnJl ZSAoYWN0aXZhdGUpOworCSAgICB9CisKIAkgIHRyZWUganVtcF90YXJnZXQgPSBOVUxMX1RSRUU7 CiAJICBjeHhfZXZhbF9jb25zdGFudF9leHByZXNzaW9uICgmY2FsbF9jdHgsIGJvZHksCiAJCQkJ CXZjX2Rpc2NhcmQsIG5vbl9jb25zdGFudF9wLCBvdmVyZmxvd19wLAogCQkJCQkmanVtcF90YXJn ZXQpOwogCiAJICBpZiAoREVDTF9DT05TVFJVQ1RPUl9QIChmdW4pKQotCSAgICB7Ci0JICAgICAg LyogVGhpcyBjYW4gYmUgbnVsbCBmb3IgYSBzdWJvYmplY3QgY29uc3RydWN0b3IgY2FsbCwgaW4K LQkJIHdoaWNoIGNhc2Ugd2hhdCB3ZSBjYXJlIGFib3V0IGlzIHRoZSBpbml0aWFsaXphdGlvbgot CQkgc2lkZS1lZmZlY3RzIHJhdGhlciB0aGFuIHRoZSB2YWx1ZS4gIFdlIGNvdWxkIGdldCBhdCB0 aGUKLQkJIHZhbHVlIGJ5IGV2YWx1YXRpbmcgKnRoaXMsIGJ1dCB3ZSBkb24ndCBib3RoZXI7IHRo ZXJlJ3MKLQkJIG5vIG5lZWQgdG8gcHV0IHN1Y2ggYSBjYWxsIGluIHRoZSBoYXNoIHRhYmxlLiAg Ki8KLQkgICAgICByZXN1bHQgPSBsdmFsID8gY3R4LT5vYmplY3QgOiBjdHgtPmN0b3I7Ci0KLQkg ICAgICAvKiBJZiB3ZSd2ZSBqdXN0IGV2YWx1YXRlZCBhIHN1Ym9iamVjdCBjb25zdHJ1Y3RvciBj YWxsIGZvciBhbgotCQkgZW1wdHkgdW5pb24gbWVtYmVyLCBpdCBtaWdodCBub3QgaGF2ZSBwcm9k dWNlZCBhIHNpZGUgZWZmZWN0Ci0JCSB0aGF0IGFjdHVhbGx5IGFjdGl2YXRlZCB0aGUgdW5pb24g bWVtYmVyLiAgU28gcHJvZHVjZSBzdWNoIGEKLQkJIHNpZGUgZWZmZWN0IG5vdyB0byBlbnN1cmUg dGhlIHVuaW9uIGFwcGVhcnMgaW5pdGlhbGl6ZWQuICAqLwotCSAgICAgIGlmICghcmVzdWx0ICYm IG5ld19vYmoKLQkJICAmJiBUUkVFX0NPREUgKG5ld19vYmopID09IENPTVBPTkVOVF9SRUYKLQkJ ICAmJiBUUkVFX0NPREUgKFRSRUVfVFlQRQotCQkJCShUUkVFX09QRVJBTkQgKG5ld19vYmosIDAp KSkgPT0gVU5JT05fVFlQRQotCQkgICYmIGlzX3JlYWxseV9lbXB0eV9jbGFzcyAoVFJFRV9UWVBF IChuZXdfb2JqKSwKLQkJCQkJICAgIC8qaWdub3JlX3ZwdHIqL2ZhbHNlKSkKLQkJewotCQkgIHRy ZWUgYWN0aXZhdGUgPSBidWlsZDIgKE1PRElGWV9FWFBSLCBUUkVFX1RZUEUgKG5ld19vYmopLAot CQkJCQkgIG5ld19vYmosCi0JCQkJCSAgYnVpbGRfY29uc3RydWN0b3IgKFRSRUVfVFlQRSAobmV3 X29iaiksCi0JCQkJCQkJICAgICBOVUxMKSk7Ci0JCSAgY3h4X2V2YWxfY29uc3RhbnRfZXhwcmVz c2lvbiAoY3R4LCBhY3RpdmF0ZSwgbHZhbCwKLQkJCQkJCW5vbl9jb25zdGFudF9wLCBvdmVyZmxv d19wKTsKLQkJICBnZ2NfZnJlZSAoYWN0aXZhdGUpOwotCQl9Ci0JICAgIH0KKwkgICAgLyogVGhp cyBjYW4gYmUgbnVsbCBmb3IgYSBzdWJvYmplY3QgY29uc3RydWN0b3IgY2FsbCwgaW4KKwkgICAg ICAgd2hpY2ggY2FzZSB3aGF0IHdlIGNhcmUgYWJvdXQgaXMgdGhlIGluaXRpYWxpemF0aW9uCisJ ICAgICAgIHNpZGUtZWZmZWN0cyByYXRoZXIgdGhhbiB0aGUgdmFsdWUuICBXZSBjb3VsZCBnZXQg YXQgdGhlCisJICAgICAgIHZhbHVlIGJ5IGV2YWx1YXRpbmcgKnRoaXMsIGJ1dCB3ZSBkb24ndCBi b3RoZXI7IHRoZXJlJ3MKKwkgICAgICAgbm8gbmVlZCB0byBwdXQgc3VjaCBhIGNhbGwgaW4gdGhl IGhhc2ggdGFibGUuICAqLworCSAgICByZXN1bHQgPSBsdmFsID8gY3R4LT5vYmplY3QgOiBjdHgt PmN0b3I7CiAJICBlbHNlIGlmIChWT0lEX1RZUEVfUCAoVFJFRV9UWVBFIChyZXMpKSkKIAkgICAg cmVzdWx0ID0gdm9pZF9ub2RlOwogCSAgZWxzZQpAQCAtNDQ5Myw2ICs0NDg3LDcgQEAgY3h4X2V2 YWxfY29tcG9uZW50X3JlZmVyZW5jZSAoY29uc3QgY29uc3RleHByX2N0eCAqY3R4LCB0cmVlIHQs CiAgICAgICAqbm9uX2NvbnN0YW50X3AgPSB0cnVlOwogICAgICAgcmV0dXJuIHQ7CiAgICAgfQor CiAgIGJvb2wgcG1mID0gVFlQRV9QVFJNRU1GVU5DX1AgKFRSRUVfVFlQRSAod2hvbGUpKTsKICAg Rk9SX0VBQ0hfQ09OU1RSVUNUT1JfRUxUIChDT05TVFJVQ1RPUl9FTFRTICh3aG9sZSksIGksIGZp ZWxkLCB2YWx1ZSkKICAgICB7CkBAIC00NTExLDIxICs0NTA2LDM2IEBAIGN4eF9ldmFsX2NvbXBv bmVudF9yZWZlcmVuY2UgKGNvbnN0IGNvbnN0ZXhwcl9jdHggKmN0eCwgdHJlZSB0LAogCSAgICBi cmVhazsKIAl9CiAgICAgfQotICBpZiAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKHdob2xlKSkgPT0g VU5JT05fVFlQRQotICAgICAgJiYgQ09OU1RSVUNUT1JfTkVMVFMgKHdob2xlKSA+IDApCisgIGlm IChUUkVFX0NPREUgKFRSRUVfVFlQRSAod2hvbGUpKSA9PSBVTklPTl9UWVBFKQogICAgIHsKLSAg ICAgIC8qIERSIDExODggc2F5cyB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGlzLiAgKi8K LSAgICAgIGlmICghY3R4LT5xdWlldCkKKyAgICAgIGlmIChDT05TVFJVQ1RPUl9ORUxUUyAod2hv bGUpID4gMCkKIAl7Ci0JICBjb25zdHJ1Y3Rvcl9lbHQgKmNlcCA9IENPTlNUUlVDVE9SX0VMVCAo d2hvbGUsIDApOwotCSAgaWYgKGNlcC0+dmFsdWUgPT0gTlVMTF9UUkVFKQotCSAgICBlcnJvciAo ImFjY2Vzc2luZyB1bmluaXRpYWxpemVkIG1lbWJlciAlcUQiLCBwYXJ0KTsKLQkgIGVsc2UKLQkg ICAgZXJyb3IgKCJhY2Nlc3NpbmcgJXFEIG1lbWJlciBpbnN0ZWFkIG9mIGluaXRpYWxpemVkICVx RCBtZW1iZXIgaW4gIgotCQkgICAiY29uc3RhbnQgZXhwcmVzc2lvbiIsIHBhcnQsIGNlcC0+aW5k ZXgpOworCSAgLyogRFIgMTE4OCBzYXlzIHdlIGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoIHRoaXMu ICAqLworCSAgaWYgKCFjdHgtPnF1aWV0KQorCSAgICB7CisJICAgICAgY29uc3RydWN0b3JfZWx0 ICpjZXAgPSBDT05TVFJVQ1RPUl9FTFQgKHdob2xlLCAwKTsKKwkgICAgICBpZiAoY2VwLT52YWx1 ZSA9PSBOVUxMX1RSRUUpCisJCWVycm9yICgiYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgbWVtYmVy ICVxRCIsIHBhcnQpOworCSAgICAgIGVsc2UKKwkJZXJyb3IgKCJhY2Nlc3NpbmcgJXFEIG1lbWJl ciBpbnN0ZWFkIG9mIGluaXRpYWxpemVkICVxRCBtZW1iZXIgIgorCQkgICAgICAgImluIGNvbnN0 YW50IGV4cHJlc3Npb24iLCBwYXJ0LCBjZXAtPmluZGV4KTsKKwkgICAgfQorCSAgKm5vbl9jb25z dGFudF9wID0gdHJ1ZTsKKwkgIHJldHVybiB0OworCX0KKyAgICAgIGVsc2UgaWYgKCFDT05TVFJV Q1RPUl9OT19DTEVBUklORyAod2hvbGUpKQorCXsKKwkgIC8qIFZhbHVlLWluaXRpYWxpemVkIHVu aW9uLCBjaGVjayBpZiBsb29raW5nIGF0IHRoZSBmaXJzdCBtZW1iZXIuICAqLworCSAgdHJlZSBm aXJzdCA9IG5leHRfYWdncmVnYXRlX2ZpZWxkIChUWVBFX0ZJRUxEUyAoVFJFRV9UWVBFICh3aG9s ZSkpKTsKKwkgIGlmIChmaXJzdCAhPSBwYXJ0KQorCSAgICB7CisJICAgICAgaWYgKCFjdHgtPnF1 aWV0KQorCQllcnJvciAoImFjY2Vzc2luZyAlcUQgbWVtYmVyIGluc3RlYWQgb2YgaW5pdGlhbGl6 ZWQgJXFEICIKKwkJICAgICAgICJtZW1iZXIgaW4gY29uc3RhbnQgZXhwcmVzc2lvbiIsIHBhcnQs IGZpcnN0KTsKKwkgICAgICAqbm9uX2NvbnN0YW50X3AgPSB0cnVlOworCSAgICAgIHJldHVybiB0 OworCSAgICB9CiAJfQotICAgICAgKm5vbl9jb25zdGFudF9wID0gdHJ1ZTsKLSAgICAgIHJldHVy biB0OwogICAgIH0KIAogICAvKiBXZSBvbmx5IGNyZWF0ZSBhIENPTlNUUlVDVE9SIGZvciBhIHN1 Ym9iamVjdCB3aGVuIHdlIG1vZGlmeSBpdCwgc28gZW1wdHkKQEAgLTYxNDIsNiArNjE1MiwxNCBA QCBjeHhfZXZhbF9zdG9yZV9leHByZXNzaW9uIChjb25zdCBjb25zdGV4cHJfY3R4ICpjdHgsIHRy ZWUgdCwKIAkJCQkJCSAgbXV0YWJsZV9wKQogCQkgICAgICYmIGNvbnN0X29iamVjdF9iZWluZ19t b2RpZmllZCA9PSBOVUxMX1RSRUUpCiAJICAgICAgY29uc3Rfb2JqZWN0X2JlaW5nX21vZGlmaWVk ID0gcHJvYmU7CisKKwkgICAgLyogVHJhY2sgbmFtZWQgbWVtYmVyIGFjY2Vzc2VzIGZvciB1bmlv bnMgdG8gdmFsaWRhdGUgbW9kaWZpY2F0aW9ucworCSAgICAgICB0aGF0IGNoYW5nZSBhY3RpdmUg bWVtYmVyLiAgKi8KKwkgICAgaWYgKCFldmFsdWF0ZWQgJiYgVFJFRV9DT0RFIChwcm9iZSkgPT0g Q09NUE9ORU5UX1JFRikKKwkgICAgICB2ZWNfc2FmZV9wdXNoIChyZWZzLCBwcm9iZSk7CisJICAg IGVsc2UKKwkgICAgICB2ZWNfc2FmZV9wdXNoIChyZWZzLCBOVUxMX1RSRUUpOworCiAJICAgIHZl Y19zYWZlX3B1c2ggKHJlZnMsIGVsdCk7CiAJICAgIHZlY19zYWZlX3B1c2ggKHJlZnMsIFRSRUVf VFlQRSAocHJvYmUpKTsKIAkgICAgcHJvYmUgPSBvYjsKQEAgLTYxNTAsNiArNjE2OCw3IEBAIGN4 eF9ldmFsX3N0b3JlX2V4cHJlc3Npb24gKGNvbnN0IGNvbnN0ZXhwcl9jdHggKmN0eCwgdHJlZSB0 LAogCiAJY2FzZSBSRUFMUEFSVF9FWFBSOgogCSAgZ2NjX2Fzc2VydCAocHJvYmUgPT0gdGFyZ2V0 KTsKKwkgIHZlY19zYWZlX3B1c2ggKHJlZnMsIE5VTExfVFJFRSk7CiAJICB2ZWNfc2FmZV9wdXNo IChyZWZzLCBwcm9iZSk7CiAJICB2ZWNfc2FmZV9wdXNoIChyZWZzLCBUUkVFX1RZUEUgKHByb2Jl KSk7CiAJICBwcm9iZSA9IFRSRUVfT1BFUkFORCAocHJvYmUsIDApOwpAQCAtNjE1Nyw2ICs2MTc2 LDcgQEAgY3h4X2V2YWxfc3RvcmVfZXhwcmVzc2lvbiAoY29uc3QgY29uc3RleHByX2N0eCAqY3R4 LCB0cmVlIHQsCiAKIAljYXNlIElNQUdQQVJUX0VYUFI6CiAJICBnY2NfYXNzZXJ0IChwcm9iZSA9 PSB0YXJnZXQpOworCSAgdmVjX3NhZmVfcHVzaCAocmVmcywgTlVMTF9UUkVFKTsKIAkgIHZlY19z YWZlX3B1c2ggKHJlZnMsIHByb2JlKTsKIAkgIHZlY19zYWZlX3B1c2ggKHJlZnMsIFRSRUVfVFlQ RSAocHJvYmUpKTsKIAkgIHByb2JlID0gVFJFRV9PUEVSQU5EIChwcm9iZSwgMCk7CkBAIC02MjQ1 LDYgKzYyNjUsNyBAQCBjeHhfZXZhbF9zdG9yZV9leHByZXNzaW9uIChjb25zdCBjb25zdGV4cHJf Y3R4ICpjdHgsIHRyZWUgdCwKICAgICAgIGVudW0gdHJlZV9jb2RlIGNvZGUgPSBUUkVFX0NPREUg KHR5cGUpOwogICAgICAgdHJlZSByZWZ0eXBlID0gcmVmcy0+cG9wKCk7CiAgICAgICB0cmVlIGlu ZGV4ID0gcmVmcy0+cG9wKCk7CisgICAgICBib29sIGlzX2FjY2Vzc19leHByID0gcmVmcy0+cG9w KCkgIT0gTlVMTF9UUkVFOwogCiAgICAgICBpZiAoY29kZSA9PSBDT01QTEVYX1RZUEUpCiAJewpA QCAtNjI4MywyMyArNjMwNCw3MyBAQCBjeHhfZXZhbF9zdG9yZV9leHByZXNzaW9uIChjb25zdCBj b25zdGV4cHJfY3R4ICpjdHgsIHRyZWUgdCwKIAkgIGJyZWFrOwogCX0KIAotICAgICAgdHlwZSA9 IHJlZnR5cGU7CisgICAgICAvKiBJZiBhIHVuaW9uIGlzIHplcm8taW5pdGlhbGl6ZWQsIGl0cyBm aXJzdCBub24tc3RhdGljIG5hbWVkIGRhdGEgbWVtYmVyCisJIGlzIHplcm8taW5pdGlhbGl6ZWQg KGFuZCB0aGVyZWZvcmUgYWN0aXZlKS4gICovCisgICAgICBpZiAoY29kZSA9PSBVTklPTl9UWVBF CisJICAmJiAhbm9femVyb19pbml0CisJICAmJiBDT05TVFJVQ1RPUl9ORUxUUyAoKnZhbHApID09 IDApCisJaWYgKHRyZWUgZmlyc3QgPSBuZXh0X2FnZ3JlZ2F0ZV9maWVsZCAoVFlQRV9GSUVMRFMg KHR5cGUpKSkKKwkgIENPTlNUUlVDVE9SX0FQUEVORF9FTFQgKENPTlNUUlVDVE9SX0VMVFMgKCp2 YWxwKSwgZmlyc3QsIE5VTExfVFJFRSk7CiAKLSAgICAgIGlmIChjb2RlID09IFVOSU9OX1RZUEUg JiYgQ09OU1RSVUNUT1JfTkVMVFMgKCp2YWxwKQotCSAgJiYgQ09OU1RSVUNUT1JfRUxUICgqdmFs cCwgMCktPmluZGV4ICE9IGluZGV4KQorICAgICAgLyogQ2hlY2sgZm9yIGltcGxpY2l0IGNoYW5n ZSBvZiBhY3RpdmUgbWVtYmVyIGZvciBhIHVuaW9uLiAgKi8KKyAgICAgIGlmIChjb2RlID09IFVO SU9OX1RZUEUKKwkgICYmIChDT05TVFJVQ1RPUl9ORUxUUyAoKnZhbHApID09IDAKKwkgICAgICB8 fCBDT05TVFJVQ1RPUl9FTFQgKCp2YWxwLCAwKS0+aW5kZXggIT0gaW5kZXgpCisJICAvKiBBbiBJ TklUX0VYUFIgb2YgdGhlIGxhc3QgbWVtYmVyIGluIGFuIGFjY2VzcyBjaGFpbiBpcyBhbHdheXMg T0ssCisJICAgICBidXQgc3RpbGwgY2hlY2sgaW1wbGljaXQgY2hhbmdlIG9mIG1lbWJlcnMgZWFy bGllciBvbjsgc2VlCisJICAgICBjcHAyYS9jb25zdGV4cHItdW5pb242LkMuICAqLworCSAgJiYg IShUUkVFX0NPREUgKHQpID09IElOSVRfRVhQUiAmJiByZWZzLT5pc19lbXB0eSAoKSkpCiAJewot CSAgaWYgKGN4eF9kaWFsZWN0IDwgY3h4MjApCisJICBib29sIGhhc19hY3RpdmVfbWVtYmVyID0g Q09OU1RSVUNUT1JfTkVMVFMgKCp2YWxwKSAhPSAwOworCSAgdHJlZSBpbm5lciA9IHN0cmlwX2Fy cmF5X3R5cGVzIChyZWZ0eXBlKTsKKworCSAgaWYgKGhhc19hY3RpdmVfbWVtYmVyICYmIGN4eF9k aWFsZWN0IDwgY3h4MjApCiAJICAgIHsKIAkgICAgICBpZiAoIWN0eC0+cXVpZXQpCiAJCWVycm9y X2F0IChjcF9leHByX2xvY19vcl9pbnB1dF9sb2MgKHQpLAogCQkJICAiY2hhbmdlIG9mIHRoZSBh Y3RpdmUgbWVtYmVyIG9mIGEgdW5pb24gIgotCQkJICAiZnJvbSAlcUQgdG8gJXFEIiwKKwkJCSAg ImZyb20gJXFEIHRvICVxRCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICIKKwkJCSAgImJl Zm9yZSBDKysyMCIsCiAJCQkgIENPTlNUUlVDVE9SX0VMVCAoKnZhbHAsIDApLT5pbmRleCwKIAkJ CSAgaW5kZXgpOwogCSAgICAgICpub25fY29uc3RhbnRfcCA9IHRydWU7CiAJICAgIH0KLQkgIGVs c2UgaWYgKFRSRUVfQ09ERSAodCkgPT0gTU9ESUZZX0VYUFIKLQkJICAgJiYgQ09OU1RSVUNUT1Jf Tk9fQ0xFQVJJTkcgKCp2YWxwKSkKKwkgIGVsc2UgaWYgKCFpc19hY2Nlc3NfZXhwcgorCQkgICB8 fCAoVFJFRV9DT0RFICh0KSA9PSBNT0RJRllfRVhQUgorCQkgICAgICAgJiYgQ0xBU1NfVFlQRV9Q IChpbm5lcikKKwkJICAgICAgICYmICF0eXBlX2hhc19ub25fZGVsZXRlZF90cml2aWFsX2RlZmF1 bHRfY3RvciAoaW5uZXIpKSkKKwkgICAgeworCSAgICAgIC8qIERpYWdub3NlIGNoYW5naW5nIGFj dGl2ZSB1bmlvbiBtZW1iZXIgYWZ0ZXIgaW5pdGlhbGl6YXRpb24KKwkJIHdpdGhvdXQgYSB2YWxp ZCBtZW1iZXIgYWNjZXNzIGV4cHJlc3Npb24sIGFzIGRlc2NyaWJlZCBpbgorCQkgW2NsYXNzLnVu aW9uLmdlbmVyYWxdIHA1LiAgKi8KKwkgICAgICBpZiAoIWN0eC0+cXVpZXQpCisJCXsKKwkJICBh dXRvX2RpYWdub3N0aWNfZ3JvdXAgZDsKKwkJICBpZiAoaGFzX2FjdGl2ZV9tZW1iZXIpCisJCSAg ICBlcnJvcl9hdCAoY3BfZXhwcl9sb2Nfb3JfaW5wdXRfbG9jICh0KSwKKwkJCSAgICAgICJhY2Nl c3NpbmcgJXFEIG1lbWJlciBpbnN0ZWFkIG9mIGluaXRpYWxpemVkICIKKwkJCSAgICAgICIlcUQg bWVtYmVyIGluIGNvbnN0YW50IGV4cHJlc3Npb24iLAorCQkJICAgICAgaW5kZXgsIENPTlNUUlVD VE9SX0VMVCAoKnZhbHAsIDApLT5pbmRleCk7CisJCSAgZWxzZQorCQkgICAgZXJyb3JfYXQgKGNw X2V4cHJfbG9jX29yX2lucHV0X2xvYyAodCksCisJCQkgICAgICAiYWNjZXNzaW5nIHVuaW5pdGlh bGl6ZWQgbWVtYmVyICVxRCIsCisJCQkgICAgICBpbmRleCk7CisJCSAgaWYgKGlzX2FjY2Vzc19l eHByKQorCQkgICAgaW5mb3JtIChERUNMX1NPVVJDRV9MT0NBVElPTiAoaW5kZXgpLAorCQkJICAg ICIlcUQgZG9lcyBub3QgaW1wbGljaXRseSBiZWdpbiBpdHMgbGlmZXRpbWUgIgorCQkJICAgICJi ZWNhdXNlICVxVCBkb2VzIG5vdCBoYXZlIGEgbm9uLWRlbGV0ZWQgIgorCQkJICAgICJ0cml2aWFs IGRlZmF1bHQgY29uc3RydWN0b3IsIHVzZSAiCisJCQkgICAgIiU8c3RkOjpjb25zdHJ1Y3RfYXQl PiBpbnN0ZWFkIiwKKwkJCSAgICBpbmRleCwgaW5uZXIpOworCQkgIGVsc2UKKwkJICAgIGluZm9y bSAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKGluZGV4KSwKKwkJCSAgICAiaW5pdGlhbGl6aW5nICVx RCByZXF1aXJlcyBhIG1lbWJlciBhY2Nlc3MgIgorCQkJICAgICJleHByZXNzaW9uIGFzIHRoZSBs ZWZ0IG9wZXJhbmQgb2YgdGhlIGFzc2lnbm1lbnQiLAorCQkJICAgIGluZGV4KTsKKwkJfQorCSAg ICAgICpub25fY29uc3RhbnRfcCA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UgaWYgKGhhc19hY3Rp dmVfbWVtYmVyICYmIENPTlNUUlVDVE9SX05PX0NMRUFSSU5HICgqdmFscCkpCiAJICAgIHsKIAkg ICAgICAvKiBEaWFnbm9zZSBjaGFuZ2luZyB0aGUgYWN0aXZlIHVuaW9uIG1lbWJlciB3aGlsZSB0 aGUgdW5pb24KIAkJIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGluaXRpYWxpemVkLiAgKi8K QEAgLTYzMjUsNiArNjM5Niw3IEBAIGN4eF9ldmFsX3N0b3JlX2V4cHJlc3Npb24gKGNvbnN0IGNv bnN0ZXhwcl9jdHggKmN0eCwgdHJlZSB0LAogCWFjdGl2YXRlZF91bmlvbl9tZW1iZXJfcCA9IHRy dWU7CiAKICAgICAgIHZhbHAgPSAmY2VwLT52YWx1ZTsKKyAgICAgIHR5cGUgPSByZWZ0eXBlOwog ICAgIH0KIAogICAvKiBGb3IgaW5pdGlhbGl6YXRpb24gb2YgYW4gZW1wdHkgYmFzZSwgdGhlIG9y aWdpbmFsIHRhcmdldCB3aWxsIGJlCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2crKy5kZy9j cHAxeS9jb25zdGV4cHItODkzMzYtMy5DIGIvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMXkvY29u c3RleHByLTg5MzM2LTMuQwppbmRleCA5ZDM3MGRkZWZjZi4uNmE2MDk2NmY2ZjggMTAwNjQ0Ci0t LSBhL2djYy90ZXN0c3VpdGUvZysrLmRnL2NwcDF5L2NvbnN0ZXhwci04OTMzNi0zLkMKKysrIGIv Z2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMXkvY29uc3RleHByLTg5MzM2LTMuQwpAQCAtMTgsNyAr MTgsNyBAQCBjb25zdGV4cHIgaW50CiBiYXIgKCkKIHsKICAgdW5pb24gVSB7IGludCBhWzVdOyBs b25nIGI7IH07Ci0gIHVuaW9uIFYgeyB1bmlvbiBVIHU7IHNob3J0IHY7IH07CisgIHVuaW9uIFYg eyBzaG9ydCB2OyB1bmlvbiBVIHU7IH07CiAgIFYgdyB7fTsKICAgdy52ID0gNTsKICAgdy51LmFb M10gPSB3LnUuYVsxXSA9IHcudjsJCS8vIHsgZGctZXJyb3IgImNoYW5nZSBvZiB0aGUgYWN0aXZl IG1lbWJlciBvZiBhIHVuaW9uIGZyb20iICIiIHsgdGFyZ2V0IGMrKzE3X2Rvd24gfSB9CmRpZmYg LS1naXQgYS9nY2MvdGVzdHN1aXRlL2crKy5kZy9jcHAxeS9jb25zdGV4cHItdW5pb242LkMgYi9n Y2MvdGVzdHN1aXRlL2crKy5kZy9jcHAxeS9jb25zdGV4cHItdW5pb242LkMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmZmN2ViZjE5Zjg5Ci0tLSAvZGV2L251bGwKKysr IGIvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMXkvY29uc3RleHByLXVuaW9uNi5DCkBAIC0wLDAg KzEsMTMgQEAKKy8vIHsgZGctZG8gY29tcGlsZSB7IHRhcmdldCBjKysxNCB9IH0KKwordW5pb24g VSB7CisgIGludCBhOworICBmbG9hdCBiOworfTsKKworY29uc3RleHByIGJvb2wgZm9vKCkgewor ICBVIHUge307CisgIHUuYiA9IDEuMGY7ICAvLyB7IGRnLWVycm9yICJjaGFuZ2Ugb2YgdGhlIGFj dGl2ZSBtZW1iZXIiICIiIHsgdGFyZ2V0IGMrKzE3X2Rvd24gfSB9CisgIHJldHVybiB1LmIgPT0g MS4wZjsKK30KK2NvbnN0ZXhwciBib29sIHggPSBmb28oKTsKZGlmZiAtLWdpdCBhL2djYy90ZXN0 c3VpdGUvZysrLmRnL2NwcDF5L2NvbnN0ZXhwci11bmlvbjcuQyBiL2djYy90ZXN0c3VpdGUvZysr LmRnL2NwcDF5L2NvbnN0ZXhwci11bmlvbjcuQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMC4uNmZjNDFmOTczNTQKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRl L2crKy5kZy9jcHAxeS9jb25zdGV4cHItdW5pb243LkMKQEAgLTAsMCArMSwxOCBAQAorLy8geyBk Zy1kbyBjb21waWxlIHsgdGFyZ2V0IGMrKzE0IH0gfQorCisvLyB0aGlzIHR5cGUgaXMgbm90IHZh bHVlLWluaXRpYWxpc2FibGUKK3N0cnVjdCBTIHsgY29uc3QgaW50IGE7IGludCBiOyB9OworCit1 bmlvbiBVMSB7IGludCBrOyBTIHM7IH07Citjb25zdGV4cHIgaW50IHRlc3QxKCkgeworICBVMSB1 IHt9OworICByZXR1cm4gdS5zLmI7ICAvLyB7IGRnLWVycm9yICJhY2Nlc3NpbmcgLlUxOjpzLiBt ZW1iZXIgaW5zdGVhZCBvZiBpbml0aWFsaXplZCAuVTE6OmsuIG1lbWJlciIgfQorfQorY29uc3Rl eHByIGludCB4ID0gdGVzdDEoKTsKKwordW5pb24gVTIgeyBpbnQgOjA7IHN0YXRpYyBpbnQgczsg dm9pZCBmb28oKTsgaW50IGs7IH07Citjb25zdGV4cHIgaW50IHRlc3QyKCkgeworICBVMiB1IHt9 OyAgLy8gc2hvdWxkIHNraXAgemVyby13aWR0aCBiaXRmaWVsZHMsIHN0YXRpYyBtZW1iZXJzLCBh bmQgZnVuY3Rpb25zCisgIHJldHVybiB1Lms7Cit9CitzdGF0aWNfYXNzZXJ0KHRlc3QyKCkgPT0g MCwgIiIpOwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEvY29uc3RleHBy LXVuaW9uMi5DIGIvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEvY29uc3RleHByLXVuaW9uMi5D Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4xNzEyMzk1ZDdlNwotLS0g L2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL2NvbnN0ZXhwci11bmlv bjIuQwpAQCAtMCwwICsxLDMwIEBACisvLyBQUiBjKysvMTAxNjMxCisvLyB7IGRnLWRvIGNvbXBp bGUgeyB0YXJnZXQgYysrMjAgfSB9CisKK3N0cnVjdCBzc28geworICB1bmlvbiB7CisgICAgaW50 IGJ1ZlsxMF07CisgICAgaW50KiBhbGxvYzsKKyAgfTsKK307CisKK2NvbnN0ZXhwciBib29sIGRp cmVjdCgpIHsKKyAgc3NvIHZhbDsKKyAgdmFsLmFsbG9jID0gbnVsbHB0cjsKKyAgdmFsLmJ1Zls1 XSA9IDQyOworICByZXR1cm4gdHJ1ZTsKK30KK2NvbnN0ZXhwciBib29sIG9rID0gZGlyZWN0KCk7 CisKKworY29uc3RleHByIHZvaWQgcGVyZm9ybV9hc3NpZ25tZW50KGludCYgbGVmdCwgaW50IHJp Z2h0KSBub2V4Y2VwdCB7CisgIGxlZnQgPSByaWdodDsgIC8vIHsgZGctZXJyb3IgImFjY2Vzc2lu ZyAuKyBtZW1iZXIgaW5zdGVhZCBvZiBpbml0aWFsaXplZCIgfQorfQorCitjb25zdGV4cHIgYm9v bCBpbmRpcmVjdCgpIHsKKyAgc3NvIHZhbDsKKyAgdmFsLmFsbG9jID0gbnVsbHB0cjsKKyAgcGVy Zm9ybV9hc3NpZ25tZW50KHZhbC5idWZbNV0sIDQyKTsgIC8vIHsgZGctbWVzc2FnZSAiaW4gLmNv bnN0ZXhwci4gZXhwYW5zaW9uIiB9CisgIHJldHVybiB0cnVlOworfQorY29uc3RleHByIGJvb2wg ZXJyID0gaW5kaXJlY3QoKTsgIC8vIHsgZGctbWVzc2FnZSAiaW4gLmNvbnN0ZXhwci4gZXhwYW5z aW9uIiB9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2crKy5kZy9jcHAyYS9jb25zdGV4cHIt dW5pb24zLkMgYi9nY2MvdGVzdHN1aXRlL2crKy5kZy9jcHAyYS9jb25zdGV4cHItdW5pb24zLkMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjZkMzBiYjI0OThmCi0tLSAv ZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEvY29uc3RleHByLXVuaW9u My5DCkBAIC0wLDAgKzEsNDUgQEAKKy8vIHsgZGctZG8gY29tcGlsZSB7IHRhcmdldCBjKysyMCB9 IH0KKworc3RydWN0IFMKK3sKKyAgdW5pb24geworICAgIGNoYXIgYnVmWzhdOworICAgIGNoYXIq IHB0cjsKKyAgfTsKKyAgdW5zaWduZWQgbGVuOworCisgIGNvbnN0ZXhwciBTKGNvbnN0IGNoYXIq IHMsIHVuc2lnbmVkIG4pCisgIHsKKyAgICBjaGFyKiBwOworICAgIGlmIChuID4gNykKKyAgICAg IHAgPSBwdHIgPSBuZXcgY2hhcltuKzFdOworICAgIGVsc2UKKyAgICAgIHAgPSBidWY7CisgICAg Zm9yIChsZW4gPSAwOyBsZW4gPCBuOyArK2xlbikKKyAgICAgIHBbbGVuXSA9IHNbbGVuXTsgIC8v IHsgZGctZXJyb3IgImFjY2Vzc2luZyB1bmluaXRpYWxpemVkIG1lbWJlciIgfQorICAgIHBbbGVu XSA9ICdcMCc7CisgIH0KKworICBjb25zdGV4cHIgflMoKQorICB7CisgICAgaWYgKGxlbiA+IDcp CisgICAgICBkZWxldGVbXSBwdHI7CisgIH0KK307CisKK2NvbnN0ZXhwciBib29sIHRlc3QxKCkK K3sKKyAgUyBzKCJ0ZXN0IiwgNCk7ICAvLyB7IGRnLW1lc3NhZ2UgImluIC5jb25zdGV4cHIuIGV4 cGFuc2lvbiIgfQorICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3RleHByIGJvb2wgYSA9IHRlc3Qx KCk7ICAvLyB7IGRnLW1lc3NhZ2UgImluIC5jb25zdGV4cHIuIGV4cGFuc2lvbiIgfQorCisKK2Nv bnN0ZXhwciBib29sIHRlc3QyKCkKK3sKKyAgUyBzKCJoZWxsbyB3b3JsZCIsIDExKTsKKyAgcmV0 dXJuIHRydWU7Cit9CisKK2NvbnN0ZXhwciBib29sIGIgPSB0ZXN0MigpOwpkaWZmIC0tZ2l0IGEv Z2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEvY29uc3RleHByLXVuaW9uNC5DIGIvZ2NjL3Rlc3Rz dWl0ZS9nKysuZGcvY3BwMmEvY29uc3RleHByLXVuaW9uNC5DCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwLi40MjlhYjIwM2FjMgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90 ZXN0c3VpdGUvZysrLmRnL2NwcDJhL2NvbnN0ZXhwci11bmlvbjQuQwpAQCAtMCwwICsxLDI5IEBA CisvLyB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgYysrMjAgfSB9CisKKy8vIGZyb20gW2NsYXNz LnVuaW9uLmdlbmVyYWxdIHA1CisKK3VuaW9uIEEgeyBpbnQgeDsgaW50IHlbNF07IH07CitzdHJ1 Y3QgQiB7IEEgYTsgfTsKK3VuaW9uIEMgeyBCIGI7IGludCBrOyB9OworY29uc3RleHByIGludCBm KCkgeworICBDIGM7ICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3Qgc3RhcnQgbGlmZXRpbWUg b2YgYW55IHVuaW9uIG1lbWJlcgorICBjLmIuYS55WzNdID0gNDsgICAgICAgLy8gT0ssIFMoYy5i LmEueVszXSkgY29udGFpbnMgYy5iIGFuZCBjLmIuYS55OworICAgICAgICAgICAgICAgICAgICAg ICAgLy8gY3JlYXRlcyBvYmplY3RzIHRvIGhvbGQgdW5pb24gbWVtYmVycyBjLmIgYW5kIGMuYi5h LnkKKyAgcmV0dXJuIGMuYi5hLnlbM107ICAgIC8vIE9LLCBjLmIuYS55IHJlZmVycyB0byBuZXds eSBjcmVhdGVkIG9iamVjdCAoc2VlIFtiYXNpYy5saWZlXSkKK30KK2NvbnN0ZXhwciBpbnQgYSA9 IGYoKTsKKworc3RydWN0IFggeyBjb25zdCBpbnQgYTsgaW50IGI7IH07Cit1bmlvbiBZIHsgWCB4 OyBpbnQgazsgfTsvLyB7IGRnLW1lc3NhZ2UgImRvZXMgbm90IGltcGxpY2l0bHkgYmVnaW4gaXRz IGxpZmV0aW1lIiB9Citjb25zdGV4cHIgaW50IGcoKSB7CisgIFkgeSA9IHsgeyAxLCAyIH0gfTsg ICAvLyBPSywgeS54IGlzIGFjdGl2ZSB1bmlvbiBtZW1iZXIgKFtjbGFzcy5tZW1dKQorICBpbnQg biA9IHkueC5hOworICB5LmsgPSA0OyAgICAgICAgICAgICAgLy8gT0ssIGVuZHMgbGlmZXRpbWUg b2YgeS54LCB5LmsgaXMgYWN0aXZlIG1lbWJlciBvZiB1bmlvbgorCisgIHkueC5iID0gbjsgICAg ICAgICAgICAvLyB7IGRnLWVycm9yICJhY2Nlc3NpbmcgLiogbWVtYmVyIGluc3RlYWQgb2YgaW5p dGlhbGl6ZWQgLiogbWVtYmVyIiB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmlu ZWQgYmVoYXZpb3I6IHkueC5iIG1vZGlmaWVkIG91dHNpZGUgaXRzIGxpZmV0aW1lLAorICAgICAg ICAgICAgICAgICAgICAgICAgLy8gUyh5LnguYikgaXMgZW1wdHkgYmVjYXVzZSBYJ3MgZGVmYXVs dCBjb25zdHJ1Y3RvciBpcyBkZWxldGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28g dW5pb24gbWVtYmVyIHkueCdzIGxpZmV0aW1lIGRvZXMgbm90IGltcGxpY2l0bHkgc3RhcnQKKyAg cmV0dXJuIDA7Cit9Citjb25zdGV4cHIgaW50IGIgPSBnKCk7ICAvLyB7IGRnLW1lc3NhZ2UgImlu IC5jb25zdGV4cHIuIGV4cGFuc2lvbiIgfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nKysu ZGcvY3BwMmEvY29uc3RleHByLXVuaW9uNS5DIGIvZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvY3BwMmEv Y29uc3RleHByLXVuaW9uNS5DCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw Li43ZTQyNTIyYjRlMQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZysrLmRnL2Nw cDJhL2NvbnN0ZXhwci11bmlvbjUuQwpAQCAtMCwwICsxLDgwIEBACisvLyB7IGRnLWRvIGNvbXBp bGUgeyB0YXJnZXQgYysrMjAgfSB9CisKK3VuaW9uIFUgeyBpbnQgYTsgaW50IGI7IGludCBjWzJd OyB9OworCitjb25zdGV4cHIgaW50IHRlc3QxKCkgeworICBVIHU7CisgIHUuYSA9IDEwOworICAq JnUuYiA9IDIwOyAgLy8geyBkZy1lcnJvciAiYWNjZXNzaW5nIiB9CisgIHJldHVybiB1LmI7Cit9 Citjb25zdGV4cHIgaW50IHgxID0gdGVzdDEoKTsgIC8vIHsgZGctbWVzc2FnZSAiaW4gLmNvbnN0 ZXhwci4gZXhwYW5zaW9uIiB9CisKK2NvbnN0ZXhwciBpbnQgdGVzdDIoKSB7CisgIFUgdTsKKyAg dS5hID0gMTA7CisgICgwLCB1LmIpID0gMjA7ICAvLyB7IGRnLWVycm9yICJhY2Nlc3NpbmciIH0K KyAgcmV0dXJuIHUuYjsKK30KK2NvbnN0ZXhwciBpbnQgeDIgPSB0ZXN0MigpOyAgLy8geyBkZy1t ZXNzYWdlICJpbiAuY29uc3RleHByLiBleHBhbnNpb24iIH0KKworY29uc3RleHByIGludCB0ZXN0 MygpIHsKKyAgVSB1OworICB1LmEgPSAwOworICBpbnQqIHAgPSAmdS5iOworICBwW3UuYV0gPSAx MDsgIC8vIHsgZGctZXJyb3IgImFjY2Vzc2luZyIgfQorICByZXR1cm4gdS5iOworfQorY29uc3Rl eHByIGludCB4MyA9IHRlc3QzKCk7ICAvLyB7IGRnLW1lc3NhZ2UgImluIC5jb25zdGV4cHIuIGV4 cGFuc2lvbiIgfQorCitjb25zdGV4cHIgaW50IHRlc3Q0KCkgeworICBVIHU7CisgIHUuYSA9IDA7 CisgIGludCogcCA9ICZ1LmI7CisgIHUuYVtwXSA9IDEwOyAgLy8geyBkZy1lcnJvciAiYWNjZXNz aW5nIiB9CisgIHJldHVybiB1LmI7Cit9Citjb25zdGV4cHIgaW50IHg0ID0gdGVzdDQoKTsgIC8v IHsgZGctbWVzc2FnZSAiaW4gLmNvbnN0ZXhwci4gZXhwYW5zaW9uIiB9CisKK3N0cnVjdCBTIHsg VSB1WzEwXTsgfTsKK2NvbnN0ZXhwciBpbnQgdGVzdDUoKSB7CisgIFMgczsKKyAgcy51WzRdLmEg PSAxMDsKKyAgNltzLnVdLmIgPSAxNTsKKyAgcmV0dXJuIDRbcy51XS5hICsgcy51WzZdLmI7Cit9 CitzdGF0aWNfYXNzZXJ0KHRlc3Q1KCkgPT0gMjUpOworCitjb25zdGV4cHIgaW50IHRlc3Q2KCkg eworICBVIHU7CisgIHUuYSA9IDU7CisgIHUuY1swXSA9IDM7CisgIDFbdS5jXSA9IDg7CisgIHJl dHVybiAxW3UuY10gKyB1LmNbMF07Cit9CitzdGF0aWNfYXNzZXJ0KHRlc3Q2KCkgPT0gMTEpOwor Citjb25zdGV4cHIgaW50IHRlc3Q3KCkgeworICBVIHU7ICAvLyBkZWZhdWx0IGluaXRpYWxpc2F0 aW9uIGxlYXZlcyBubyBtZW1iZXIgaW5pdGlhbGlzZWQKKyAgaW50KiBwID0gJnUuYTsKKyAgKnAg PSAxMDsgIC8vIHsgZGctZXJyb3IgImFjY2Vzc2luZyIgfQorICByZXR1cm4gKnA7Cit9Citjb25z dGV4cHIgaW50IHg3ID0gdGVzdDcoKTsgIC8vIHsgZGctbWVzc2FnZSAiaW4gLmNvbnN0ZXhwci4g ZXhwYW5zaW9uIiB9CisKK2NvbnN0ZXhwciBpbnQgdGVzdDgoKSB7CisgIFUgdSB7fTsgIC8vIHZh bHVlIGluaXRpYWxpc2F0aW9uIGluaXRpYWxpc2VzIGZpcnN0IG1lbWJlcgorICBpbnQqIHAgPSAm dS5hOworICAqcCA9IDg7CisgIHJldHVybiAqcDsKK30KK3N0YXRpY19hc3NlcnQodGVzdDgoKSA9 PSA4KTsKKwordW5pb24gViB7IGludCA6MDsgc3RhdGljIGludCB4OyB2b2lkIGZvbygpOyBpbnQg YTsgfTsKK2NvbnN0ZXhwciBpbnQgdGVzdDkoKSB7CisgIFYgdiB7fTsgLy8gc2hvdWxkIHNraXAg emVyby13aWR0aCBiaXQgZmllbGRzLCBzdGF0aWMgbWVtYmVycywgYW5kIGZ1bmN0aW9ucworICBp bnQqIHAgPSAmdi5hOworICAqcCA9IDk7CisgIHJldHVybiAqcDsKK30KK3N0YXRpY19hc3NlcnQo dGVzdDkoKSA9PSA5KTsKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL2Nv bnN0ZXhwci11bmlvbjYuQyBiL2djYy90ZXN0c3VpdGUvZysrLmRnL2NwcDJhL2NvbnN0ZXhwci11 bmlvbjYuQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMDBiZGE1MzFl NTkKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2crKy5kZy9jcHAyYS9jb25zdGV4 cHItdW5pb242LkMKQEAgLTAsMCArMSw1MyBAQAorLy8geyBkZy1kbyBjb21waWxlIHsgdGFyZ2V0 IGMrKzIwIH0gfQorLy8gUFIgYysrLzEwMjI4NgorCisjaW5jbHVkZSAiY29uc3RydWN0X2F0Lmgi CisKK3N0cnVjdCBTIHsgY29uc3QgaW50IGE7IGludCBiOyB9OwordW5pb24gVSB7IGludCBrOyBT IHM7IH07CisKK2NvbnN0ZXhwciBpbnQgdGVzdDEoKSB7CisgIFUgdSB7fTsKKyAgc3RkOjpjb25z dHJ1Y3RfYXQoJnUucywgU3sgMSwgMiB9KTsKKyAgcmV0dXJuIHUucy5iOworfQorc3RhdGljX2Fz c2VydCh0ZXN0MSgpID09IDIpOworCitjb25zdGV4cHIgaW50IHRlc3QyKCkgeworICBVIHUge307 CisgIGludCogcCA9ICZ1LnMuYjsKKyAgc3RkOjpjb25zdHJ1Y3RfYXQocCwgNSk7ICAvLyB7IGRn LW1lc3NhZ2UgImluIC5jb25zdGV4cHIuIGV4cGFuc2lvbiIgfQorICByZXR1cm4gdS5zLmI7Cit9 Citjb25zdGV4cHIgaW50IHgyID0gdGVzdDIoKTsgIC8vIHsgZGctbWVzc2FnZSAiaW4gLmNvbnN0 ZXhwci4gZXhwYW5zaW9uIiB9CisKK2NvbnN0ZXhwciB2b2lkIGZvbyhTKiBzKSB7CisgIHMtPmIg PSAxMDsgIC8vIHsgZGctZXJyb3IgImFjY2Vzc2luZyAuVTo6cy4gbWVtYmVyIGluc3RlYWQgb2Yg aW5pdGlhbGl6ZWQgLlU6OmsuIiB9Cit9Citjb25zdGV4cHIgaW50IHRlc3QzKCkgeworICBVIHUg e307CisgIGZvbygmdS5zKTsgIC8vIHsgZGctbWVzc2FnZSAiaW4gLmNvbnN0ZXhwci4gZXhwYW5z aW9uIiB9CisgIHJldHVybiB1LnMuYjsKK30KK2NvbnN0ZXhwciBpbnQgeDMgPSB0ZXN0MygpOyAg Ly8geyBkZy1tZXNzYWdlICJpbiAuY29uc3RleHByLiBleHBhbnNpb24iIH0KKworc3RydWN0IFMy IHsgaW50IGE7IGludCBiOyB9OwordW5pb24gVTIgeyBpbnQgazsgUzIgczsgfTsKK2NvbnN0ZXhw ciBpbnQgdGVzdDQoKSB7CisgIFUyIHU7CisgIGludCogcCA9ICZ1LnMuYjsKKyAgc3RkOjpjb25z dHJ1Y3RfYXQocCwgOCk7ICAvLyB7IGRnLW1lc3NhZ2UgImluIC5jb25zdGV4cHIuIGV4cGFuc2lv biIgfQorICByZXR1cm4gdS5zLmI7Cit9OworY29uc3RleHByIGludCB4NCA9IHRlc3Q0KCk7ICAv LyB7IGRnLW1lc3NhZ2UgImluIC5jb25zdGV4cHIuIGV4cGFuc2lvbiIgfQorCitjb25zdGV4cHIg aW50IHRlc3Q1KCkgeworICB1bmlvbiB7CisgICAgaW50IGRhdGFbMV07CisgIH0gdTsKKyAgc3Rk Ojpjb25zdHJ1Y3RfYXQodS5kYXRhLCAwKTsgIC8vIHsgZGctbWVzc2FnZSAiaW4gLmNvbnN0ZXhw ci4gZXhwYW5zaW9uIiB9CisgIHJldHVybiAwOworfQorY29uc3RleHByIGludCB4NSA9IHRlc3Q1 KCk7ICAvLyB7IGRnLW1lc3NhZ2UgImluIC5jb25zdGV4cHIuIGV4cGFuc2lvbiIgfQorCisvLyB7 IGRnLWVycm9yICJhY2Nlc3NpbmcgKHVuaW5pdGlhbGl6ZWQgbWVtYmVyfC4qIG1lbWJlciBpbnN0 ZWFkIG9mKSIgIiIgeyB0YXJnZXQgKi0qLSogfSAwIH0KLS0gCjIuMzkuMwoK --------------FKJNHLqPRoyrvgdH8J0k0isU--