From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by sourceware.org (Postfix) with ESMTPS id 544603858439; Wed, 20 Dec 2023 06:09:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 544603858439 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 544603858439 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::433 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1703052598; cv=none; b=U49l33Ndf+4j2xrF0rkre+njiUMXK99LdKFNZIFYACqTg90X0z9t+ZQushDBOGf3gB8Tf2tMe+r/Yz1tl8PEi8C/HEM08u8Trf87DXRlDqWY6+W+BjOsJN5Fxj4ZJtnvu7r578i0OXnwd8NkRPxVwPCQcLIAQHmAsJE6gKeyptU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1703052598; c=relaxed/simple; bh=7g1zz0xXgIIFB7ch1+Fg1EwAFSuUqSj7mmXoRBBkSZc=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:From:To; b=v9O7HZzZv1YwY+h73zJswcL1+AWO8WS1h0BbsrV3w+NSuHzxW+jjyaRqMnGlPKuxlyAozBHn8ML0FpUI6218iX6bE0P/58mHIl/pIUPUGcHWN3R5C5MZO06G3NdR0Dsn+WqgwCAHn2Nt9GVOHk1tuiRuT6JbnhXVSFY+katR5Yk= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-3367632ce7bso886987f8f.2; Tue, 19 Dec 2023 22:09:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1703052590; x=1703657390; darn=gcc.gnu.org; h=in-reply-to:content-language:references:cc:to:from:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=PDloWwbnom1jCwRLQOK9KBLkFiK97LNikMDgXInelYQ=; b=NWrEgozxmSwY1fSGUfVNzGMns0qlwT22ZXsEZQ3v/QDhMtJU9pKz5YF8TwJOfZBggQ DyL19tFmp50emGZCvvkOsfdDjuB2vmYBcz0qpYyypcm0CdXahEx8b+kGCIGbu2ucHMo1 uH792HOsebJrfWzOB126IebST/dwsx/NyNidT+NxTM/QLPC5xIZGbOXu9kw3QKdHeLpq 6vnnefTguUSmwQSATVMTQOb9Mje328m1mSlicNDZkVDv1WE+fmFpq8ZoLaKe7/zp5Aa3 BBFYx3qfPHYlpKuGCaxT1MrUhgYjweZvoKHTQm4KL9WMxoRbF+jnhCLHMfMhp4/8pw3/ rdsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1703052590; x=1703657390; h=in-reply-to:content-language:references:cc:to:from:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=PDloWwbnom1jCwRLQOK9KBLkFiK97LNikMDgXInelYQ=; b=iqRwl+7U2pGZjPOen+RxU0/UFnnsHbIVoYBQS0X8SDXM5+jy0+aRYf9q9sVInP0wqH QOb5av8n23jOi5pZ5R9anrujmVtTQdDYdy2v1kl9C1J6+dPmrENzKSZ53rk2Ft+SgMjM drlO8ntq0NRzlumiGDnnJkNJU5eGlRIPCOCy23zdTjkzyMHHmFBvwvzLHh/vxXghFv60 FTdu3vpEKBaJc2f2whZFJrnpvQguNGO3VHFwlp2fz2z9+zikGvFPZAENOnXNW3GxnkMA LEY/JRQqPsBfswLClRpTmoPgT4HLTfkTY8t3GqzlCDcPS0uIjfhdNibmHpmzABv9Yy0s LFHA== X-Gm-Message-State: AOJu0YxudYeOeANQjCbQl+MWsoedSsrWcqQ4v28NnEZ8w/JY7JOJWNaT U874KYw63Ud7oFv7TgHr1XPgZ3IOFfs= X-Google-Smtp-Source: AGHT+IGoNqnjtJYIIXkM+pEqD3EEqGnHlh9iX4JEX3JFB8MbJstW/wKytxDoSJ5qoZnpkZtKEWw5hA== X-Received: by 2002:a05:600c:19d4:b0:40b:45e2:1f56 with SMTP id u20-20020a05600c19d400b0040b45e21f56mr10949023wmq.39.1703052589753; Tue, 19 Dec 2023 22:09:49 -0800 (PST) Received: from [10.34.0.57] ([89.207.171.102]) by smtp.gmail.com with ESMTPSA id m26-20020a05600c3b1a00b0040b2b38a1fasm5796345wms.4.2023.12.19.22.09.48 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 19 Dec 2023 22:09:48 -0800 (PST) Content-Type: multipart/mixed; boundary="------------7OWIcD0TBhrkxbqrc0lJJwhB" Message-ID: <84461179-cc39-4b74-8e61-b5199946f608@gmail.com> Date: Wed, 20 Dec 2023 07:09:47 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 5/5][_Hashtable] Prefer to insert after last node From: =?UTF-8?Q?Fran=C3=A7ois_Dumont?= To: libstdc++ Cc: gcc-patches References: Content-Language: en-US In-Reply-To: X-Spam-Status: No, score=-9.2 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE 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. --------------7OWIcD0TBhrkxbqrc0lJJwhB Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Here is a new version of this patch. The previous one had some flaws that were unnoticed by testsuite tests, only the performance tests were spotting it. So I'm adding checks on the consistency of the unordered containers in this patch. I also forget to signal that after this patch gnu versioned namespace version is supposed to be bump. But I hope it's already the plan because of the move to the cxx11 abi in this mode. Note for reviewer, after application of the patch, a 'git diff -b' is much more readable. And some benches results: before: unordered_set_range_insert.cc-thread    hash code NOT cached 2 X 1000000 inserts individually 19999990 calls      44r   44u    0s 95999760mem    0pf unordered_set_range_insert.cc-thread    hash code NOT cached 2 X 1000000 inserts in range 20000000 calls      43r   43u    0s 95999760mem    0pf unordered_set_range_insert.cc-thread    hash code NOT cached 1000000 X inserts individually 19999990 calls      44r   44u 0s  95999760mem    0pf unordered_set_range_insert.cc-thread    hash code NOT cached 1000000 X inserts in range 20000000 calls      43r   43u    0s 95999760mem    0pf unordered_set_range_insert.cc-thread    hash code cached 2 X 1000000 inserts individually 10000000 calls      30r   30u    0s 111999328mem    0pf unordered_set_range_insert.cc-thread    hash code cached 2 X 1000000 inserts in range 10000010 calls      33r   32u    0s 111999328mem    0pf unordered_set_range_insert.cc-thread    hash code cached 1000000 X inserts individually 10000000 calls      30r   31u    0s 111999328mem    0pf unordered_set_range_insert.cc-thread    hash code cached 1000000 X inserts in range 10000010 calls      32r   32u    0s 111999328mem    0pf after: unordered_set_range_insert.cc-thread    hash code NOT cached 2 X 1000000 inserts individually 19999990 calls      44r   44u    0s 95999760mem    0pf unordered_set_range_insert.cc-thread    hash code NOT cached 2 X 1000000 inserts in range 10000020 calls      26r   25u    0s 95999760mem    0pf unordered_set_range_insert.cc-thread    hash code NOT cached 1000000 X inserts individually 19999990 calls      43r   44u 0s  95999760mem    0pf unordered_set_range_insert.cc-thread    hash code NOT cached 1000000 X inserts in range 10000020 calls      26r   26u    0s 95999760mem    0pf unordered_set_range_insert.cc-thread    hash code cached 2 X 1000000 inserts individually 10000000 calls      35r   35u    0s 111999328mem    0pf unordered_set_range_insert.cc-thread    hash code cached 2 X 1000000 inserts in range 10000010 calls      32r   33u    0s 111999328mem    0pf unordered_set_range_insert.cc-thread    hash code cached 1000000 X inserts individually 10000000 calls      31r   32u    0s 111999328mem    0pf unordered_set_range_insert.cc-thread    hash code cached 1000000 X inserts in range 10000010 calls      31r   31u    0s 111999328mem    0pf     libstdc++: [_Hashtable] Prefer to insert after last node     When inserting an element into an empty bucket we currently insert the new node     after the before-begin node so in first position. The drawback of doing this is     that we are forced to update the bucket that was containing this before-begin     node to point to the newly inserted node. To do so we need at best to do a modulo     to find this bucket and at worst, when hash code is not cached, also compute it.     To avoid this side effect it is better to insert after the last node. To do so     we are introducing a helper type _HintPolicy that has 3 resposibilities.     1. When the gnu versioned namespace is used we add a _M_last member to _Hashtable,     _HintPolicy is then in charge of maintaining it. For this purpose _HintPolicy is     using the RAII pattern, it resets the _M_last at destruction level. It also maintain     its own _M_last, all mutable operations are updating it when needed.     2. When the gnu versioned namespace is not used _HintPolicy will still maintain its     _M_last member using initially the user provided hint if any and if it is actually     the container last node that is to say a dereferenceable node with its next node being     null. All mutable operations can also update the contextual _HintPolicy instance     whenever they detect the last node during their process.     3. As long as we haven't been able to detect the container last node, _HintPolicy     is used to keep a cache of the before-begin bucket index so that we do not need to     compute it afterward for example in the context of range insertion.     libstdc++-v3/ChangeLog:             * include/bits/hashtable.h [_GLIBCXX_INLINE_VERSION](_Hashtable<>::_M_last): New, the container last node.             (_Hashtable<>::_LastNodeManager): New.             (_Hashtable<>::_M_get_last(__node_ptr)): New. (_Hashtable<>::_M_get_last_node_mgr(__node_ptr)): New. (_Hashtable<>::_M_check_for_last(__node_base_ptr)): New.             (_Hashtable<>::_M_set_last(__node_ptr)): New.             (_Hashtable<>::_M_compute_hash_code(__node_ptr, const key_type&)): Remove. (_Hashtable<>::operator=(initializer_list<>)): Adapt to instantiate a _HintPolicy.             (_Hashtable<>::_M_insert_bucket_begin): Add _HintPolicy& parameter and use it             to optimize insertion in an empty bucket.             (_Hashtable<>::_M_insert_unique_node): Add _HintPolicy& parameter.             (_Hashtable<>::_M_insert_multi_node(__node_ptr, __hash_code, __node_ptr)): Replace by... (_Hashtable<>::_M_insert_multi_node(_HintPolicy&, const key_type&,             __node_ptr, __node_ptr)): ... this. (_Hashtable<>::_M_emplace_unique(_HintPolicy&, _Args&&...)): New. (_Hashtable<>::_M_emplace_multi(_HintPolicy&, _Args&&...)): New.             (_Hashtable<>::_M_emplace): Adapt to use latters.             (_Hashtable<>::_M_insert_unique): Add _HintPolicy& parameter.             (_Hashtable<>::_M_insert_unique_aux): Add _HintPolicy& parameter.             (_Hashtable<>::_M_insert): Adapt to use latter.             (_Hashtable<>::emplace_hint(const_iterator, _Args&&...)): Adapt.             (_hashtable<>::rehash(size_type)): Adapt.             (_Hashtable<>::_M_reinsert_node(const_iterator, node_type&&)):             Add hint parameter, adapt to use it for _HintPolicy instantiation.             (_Hashtable<>::_M_reinsert_node_multi): Likewise.             (_Hashtable<>::_M_merge_unique): Adapt.             (_Hashtable<>::_M_rehash): Add _HintPolicy& parameter.             (_Hashtable<>::_Hashtable<_InputIte>()): Adapt.             (_Hashtable<>::_M_assign): Call _M_set_last.             (_Hashtable<>::_M_reset()): Reset _M_last. (_Hashtable<>::_M_move_assign(_Hashtable&&, true_type)): Move _M_last.             (_Hashtable<>(_Hashtable&&, __node_alloc_type&&, true_type)): Copy _M_last.             (_Hashtable<>(_Hashtable&&, __node_alloc_type&&, false_type)): Copy _M_last.             (_Hashtable<>::_M_insert_range): Adapt.             (_Hashtable<>::_M_erase): Call _M_check_for_last.             (_Hashtable<>::erase): Likewise.             * include/bits/hashtable_policy.h:             (_Map_base<>::operator[](const key_type&)): Use hint policy.             (_Map_base<>::operator[](key_type&&)): Likewise.             (_Insert_base<>::insert(const_iterator, const value_type&)): Likewise using hint.             (_Insert_base<>::try_emplace): Likewise. (_Insert_base<>::_M_insert_range<>(_InputIte, _InputIte, true_type)): Use hint policy. (_Insert_base<>::_M_insert_range<>(_InputIte, _InputIte, false_type)): Use hint policy.             (_Insert<>::insert(const_iterator, value_type&&)): Likewise.             * include/bits/unordered_map.h (unordered_map<>::insert(node_type&&)): Pass cend as             hint.             (unordered_map<>::insert(const_iterator, node_type&&)): Adapt to use hint.             * include/bits/unordered_set.h (unordered_set<>::insert(node_type&&)): Pass cend as             hint.             (unordered_set<>::insert(const_iterator, node_type&&)): Adapt to use hint.             * testsuite/23_containers/unordered_multimap/insert/hint.cc: Adapt implementation             specific tests.             * testsuite/23_containers/unordered_map/consistency_check.cc: New test case.             * testsuite/23_containers/unordered_multimap/consistency_check.cc: New test case.             * testsuite/23_containers/unordered_multiset/consistency_check.cc: New test case.             * testsuite/23_containers/unordered_set/consistency_check.cc: New test case.             * testsuite/libstdc++-prettyprinters/cxx11.cc (main): Adapt expectations on element             order in unordered_map instance. --------------7OWIcD0TBhrkxbqrc0lJJwhB Content-Type: text/plain; charset=UTF-8; name="hashtable_patch.txt" Content-Disposition: attachment; filename="hashtable_patch.txt" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvaGFzaHRhYmxlLmggYi9s aWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5oCmluZGV4IGFlYzc3YzM0YTU4 Li5mOTJmZjE5NjY3OSAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9o YXNodGFibGUuaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5o CkBAIC00MDMsNiArNDAzLDU5IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9O CiAgICAgICAvLyBudW1lcm91cyBjaGVja3MgaW4gdGhlIGNvZGUgdG8gYXZvaWQgMCBtb2R1 bHVzLgogICAgICAgX19ub2RlX2Jhc2VfcHRyCQlfTV9zaW5nbGVfYnVja2V0CT0gbnVsbHB0 cjsKIAorI2lmIF9HTElCQ1hYX0lOTElORV9WRVJTSU9OCisgICAgICAvLyBUaGUgbGFzdCBj b250YWluZXIgbm9kZSB0byBvcHRpbWl6ZSBpbnNlcnRpb24gaW4gZW1wdHkgYnVja2V0cy4K KyAgICAgIF9fbm9kZV9wdHIJCV9NX2xhc3QJCQk9IG51bGxwdHI7CisjZW5kaWYKKworICAg ICAgY2xhc3MgX0xhc3ROb2RlTWFuYWdlcgorICAgICAgeworCV9IYXNodGFibGUmIF9NX2h0 YjsKKwlfX25vZGVfcHRyIF9NX2xhc3Q7CisJc3RkOjpzaXplX3QgX01fYmJlZ2luX2luZGV4 OworCWJvb2wgX01faW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgICAgcHVibGljOgorCV9M YXN0Tm9kZU1hbmFnZXIoX0hhc2h0YWJsZSYgX19odGJsLCBfX25vZGVfcHRyIF9fbGFzdCkK Kwk6IF9NX2h0YihfX2h0YmwpLCBfTV9sYXN0KF9fbGFzdCkKKwl7IH0KKworI2lmIF9HTElC Q1hYX0lOTElORV9WRVJTSU9OCisJfl9MYXN0Tm9kZU1hbmFnZXIoKQorCXsgX01faHRiLl9N X2xhc3QgPSBfTV9sYXN0OyB9CisjZW5kaWYKKworCXZvaWQKKwlfTV9yZXNldCgpCisJewor CSAgX01fbGFzdCA9IG51bGxwdHI7CisJICBfTV9pbml0aWFsaXplZCA9IGZhbHNlOworCX0K KworCXN0ZDo6c2l6ZV90CisJX01fZ2V0X2JiZWdpbl9ia3QoX19ub2RlX3B0ciBfX24pIGNv bnN0CisJeworCSAgaWYgKCFfTV9pbml0aWFsaXplZCkKKwkgICAgcmV0dXJuIF9NX2h0Yi5f TV9idWNrZXRfaW5kZXgoKl9fbik7CisJICByZXR1cm4gX01fYmJlZ2luX2luZGV4OworCX0K KworCXZvaWQKKwlfTV9zdG9yZV9iYmVnaW5fYmt0KHN0ZDo6c2l6ZV90IF9fYmt0KQorCXsK KwkgIF9NX2JiZWdpbl9pbmRleCA9IF9fYmt0OworCSAgX01faW5pdGlhbGl6ZWQgPSB0cnVl OworCX0KKworCWNvbnN0ZXhwciBfX25vZGVfcHRyCisJX01fZ2V0KCkKKwl7IHJldHVybiBf TV9sYXN0OyB9CisKKwl2b2lkCisJX01fc2V0KF9fbm9kZV9wdHIgX19uKQorCXsgX01fbGFz dCA9IF9fbjsgfQorICAgICAgfTsKKwogICAgICAgdm9pZAogICAgICAgX01fdXBkYXRlX2Ji ZWdpbigpCiAgICAgICB7CkBAIC00MjUsNiArNDc4LDQxIEBAIF9HTElCQ1hYX0JFR0lOX05B TUVTUEFDRV9WRVJTSU9OCiAgICAgICBfTV91c2VzX3NpbmdsZV9idWNrZXQoKSBjb25zdAog ICAgICAgeyByZXR1cm4gX01fdXNlc19zaW5nbGVfYnVja2V0KF9NX2J1Y2tldHMpOyB9CiAK KyAgICAgIF9fbm9kZV9wdHIKKyAgICAgIF9NX2dldF9sYXN0KFtbbWF5YmVfdW51c2VkXV0g X19ub2RlX3B0ciBfX3Vzcl9oaW50ID0gbnVsbHB0cikgY29uc3QKKyAgICAgIHsKKyNpZiBf R0xJQkNYWF9JTkxJTkVfVkVSU0lPTgorCXJldHVybiBfTV9sYXN0OworI2Vsc2UKKwlyZXR1 cm4gX191c3JfaGludCAmJiAhX191c3JfaGludC0+X01fbnh0ID8gX191c3JfaGludCA6IG51 bGxwdHI7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgX0xhc3ROb2RlTWFuYWdlcgorICAg ICAgX01fZ2V0X2xhc3Rfbm9kZV9tZ3IoX19ub2RlX3B0ciBfX3Vzcl9oaW50ID0gbnVsbHB0 cikKKyAgICAgIHsgcmV0dXJuIF9MYXN0Tm9kZU1hbmFnZXIoKnRoaXMsIF9NX2dldF9sYXN0 KF9fdXNyX2hpbnQpKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jaGVja19mb3JfbGFz dChbW21heWJlX3VudXNlZF1dIF9fbm9kZV9iYXNlX3B0ciBfX3ByZXZfbikKKyAgICAgIHsK KyNpZiBfR0xJQkNYWF9JTkxJTkVfVkVSU0lPTgorCWlmICghX19wcmV2X24tPl9NX254dCkK KwkgIHsKKwkgICAgX01fbGFzdCA9IF9fcHJldl9uID09ICZfTV9iZWZvcmVfYmVnaW4KKwkg ICAgICA/IG51bGxwdHIKKwkgICAgICA6IHN0YXRpY19jYXN0PF9fbm9kZV9wdHI+KF9fcHJl dl9uKTsKKwkgIH0KKyNlbmRpZgorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9z ZXRfbGFzdChbW21heWJlX3VudXNlZF1dIF9fbm9kZV9wdHIgX19uKQorICAgICAgeworI2lm IF9HTElCQ1hYX0lOTElORV9WRVJTSU9OCisJX01fbGFzdCA9IF9fbjsKKyNlbmRpZgorICAg ICAgfQorCiAgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdAogICAgICAgX19zbWFsbF9z aXplX3RocmVzaG9sZCgpIG5vZXhjZXB0CiAgICAgICB7CkBAIC02MTIsMTEgKzcwMCwxMyBA QCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCS8vIFdlIGNvbnNpZGVyIHRo YXQgYWxsIGVsZW1lbnRzIG9mIF9fbCBhcmUgZ29pbmcgdG8gYmUgaW5zZXJ0ZWQuCiAJYXV0 byBfX2xfYmt0X2NvdW50ID0gX01fcmVoYXNoX3BvbGljeS5fTV9ia3RfZm9yX2VsZW1lbnRz KF9fbC5zaXplKCkpOwogCisJYXV0byBfX2xhc3RfbWdyID0gX01fZ2V0X2xhc3Rfbm9kZV9t Z3IoKTsKKwogCS8vIERvIG5vdCBzaHJpbmsgdG8ga2VlcCBwb3RlbnRpYWwgdXNlciByZXNl cnZhdGlvbi4KIAlpZiAoX01fYnVja2V0X2NvdW50IDwgX19sX2JrdF9jb3VudCkKLQkgIHJl aGFzaChfX2xfYmt0X2NvdW50KTsKKwkgIF9NX3JlaGFzaChfX2xhc3RfbWdyLCBfX2xfYmt0 X2NvdW50KTsKIAotCV9NX2luc2VydF9yYW5nZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBf X3JvYW4pOworCV9NX2luc2VydF9yYW5nZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX2xh c3RfbWdyLCBfX3JvYW4pOwogCXJldHVybiAqdGhpczsKICAgICAgIH0KIApAQCAtODM3LDMx ICs5MjcsNjEgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAl9CiAKICAg ICAgIC8vIEluc2VydCBhIG5vZGUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJ1Y2tldC4KLSAg ICAgIHZvaWQKLSAgICAgIF9NX2luc2VydF9idWNrZXRfYmVnaW4oc2l6ZV90eXBlIF9fYmt0 LCBfX25vZGVfcHRyIF9fbm9kZSkKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19pbnNl cnRfYnVja2V0X2JlZ2luKF9MYXN0Tm9kZU1hbmFnZXImIF9fbGFzdF9tZ3IsCisJCQkgICAg IF9fbm9kZV9iYXNlX3B0ciBfX2JiZWdpbl9uLCBfX2J1Y2tldHNfcHRyIF9fYnVja2V0cywK KwkJCSAgICAgc2l6ZV90eXBlIF9fYmt0LCBfX25vZGVfcHRyIF9fbm9kZSkKICAgICAgIHsK LQlpZiAoX01fYnVja2V0c1tfX2JrdF0pCisJX19ub2RlX2Jhc2VfcHRyIF9fcHJldjsKKwlp ZiAoX19idWNrZXRzW19fYmt0XSkKIAkgIHsKIAkgICAgLy8gQnVja2V0IGlzIG5vdCBlbXB0 eSwgd2UganVzdCBuZWVkIHRvIGluc2VydCB0aGUgbmV3IG5vZGUKIAkgICAgLy8gYWZ0ZXIg dGhlIGJ1Y2tldCBiZWZvcmUgYmVnaW4uCi0JICAgIF9fbm9kZS0+X01fbnh0ID0gX01fYnVj a2V0c1tfX2JrdF0tPl9NX254dDsKLQkgICAgX01fYnVja2V0c1tfX2JrdF0tPl9NX254dCA9 IF9fbm9kZTsKKwkgICAgX19wcmV2ID0gX19idWNrZXRzW19fYmt0XTsKIAkgIH0KIAllbHNl CiAJICB7Ci0JICAgIC8vIFRoZSBidWNrZXQgaXMgZW1wdHksIHRoZSBuZXcgbm9kZSBpcyBp bnNlcnRlZCBhdCB0aGUKLQkgICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBzaW5nbHktbGlua2Vk IGxpc3QgYW5kIHRoZSBidWNrZXQgd2lsbAotCSAgICAvLyBjb250YWluIF9NX2JlZm9yZV9i ZWdpbiBwb2ludGVyLgotCSAgICBfX25vZGUtPl9NX254dCA9IF9NX2JlZm9yZV9iZWdpbi5f TV9ueHQ7Ci0JICAgIF9NX2JlZm9yZV9iZWdpbi5fTV9ueHQgPSBfX25vZGU7Ci0KLQkgICAg aWYgKF9fbm9kZS0+X01fbnh0KQotCSAgICAgIC8vIFdlIG11c3QgdXBkYXRlIGZvcm1lciBi ZWdpbiBidWNrZXQgdGhhdCBpcyBwb2ludGluZyB0bwotCSAgICAgIC8vIF9NX2JlZm9yZV9i ZWdpbi4KLQkgICAgICBfTV9idWNrZXRzW19NX2J1Y2tldF9pbmRleCgqX19ub2RlLT5fTV9u ZXh0KCkpXSA9IF9fbm9kZTsKLQotCSAgICBfTV9idWNrZXRzW19fYmt0XSA9ICZfTV9iZWZv cmVfYmVnaW47CisJICAgIC8vIElmIHdlIGhhdmUgdGhlIGxhc3QgY29udGFpbmVyIG5vZGUs IGluc2VydCBhZnRlciBpdC4KKwkgICAgX19ub2RlX3B0ciBfX2xhc3QgPSBfX2xhc3RfbWdy Ll9NX2dldCgpOworCSAgICBpZiAoX19sYXN0KQorCSAgICAgIHsKKwkJX19wcmV2ID0gX19s YXN0OworCQlfX2xhc3RfbWdyLl9NX3NldChfX25vZGUpOworCSAgICAgIH0KKwkgICAgZWxz ZQorCSAgICAgIHsKKwkJLy8gVGhlIGJ1Y2tldCBpcyBlbXB0eSwgdGhlIG5ldyBub2RlIGlz IGluc2VydGVkIGF0IHRoZQorCQkvLyBiZWdpbm5pbmcgb2YgdGhlIHNpbmdseS1saW5rZWQg bGlzdCBhbmQgdGhlIGJ1Y2tldCB3aWxsCisJCS8vIGNvbnRhaW4gdGhlIGJlZm9yZSBiZWdp biBub2RlLgorCQlfX3ByZXYgPSBfX2JiZWdpbl9uOworCisJCWlmIChfX3ByZXYtPl9NX254 dCkKKwkJICB7CisJCSAgICAvLyBXZSBtdXN0IHVwZGF0ZSBmb3JtZXIgYmVnaW4gYnVja2V0 IHRoYXQgaXMgcG9pbnRpbmcgdG8KKwkJICAgIC8vIF9NX2JlZm9yZV9iZWdpbi4KKwkJICAg IHNpemVfdHlwZSBfX2JiX2JrdCA9IF9fbGFzdF9tZ3IuX01fZ2V0X2JiZWdpbl9ia3QoCisJ CSAgICAgIHN0YXRpY19jYXN0PF9fbm9kZV9wdHI+KF9fcHJldi0+X01fbnh0KSk7CisJCSAg ICBfX2J1Y2tldHNbX19iYl9ia3RdID0gX19ub2RlOworCQkgIH0KKwkJZWxzZQorCQkgIF9f bGFzdF9tZ3IuX01fc2V0KF9fbm9kZSk7CisKKwkJX19sYXN0X21nci5fTV9zdG9yZV9iYmVn aW5fYmt0KF9fYmt0KTsKKwkgICAgICB9CisKKwkgICAgX19idWNrZXRzW19fYmt0XSA9IF9f cHJldjsKIAkgIH0KKworCV9fbm9kZS0+X01fbnh0ID0gX19wcmV2LT5fTV9ueHQ7CisJX19w cmV2LT5fTV9ueHQgPSBfX25vZGU7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9N X2luc2VydF9idWNrZXRfYmVnaW4oX0xhc3ROb2RlTWFuYWdlciYgX19sYXN0X21nciwKKwkJ CSAgICAgc2l6ZV90eXBlIF9fYmt0LCBfX25vZGVfcHRyIF9fbm9kZSkKKyAgICAgIHsKKwlf U19pbnNlcnRfYnVja2V0X2JlZ2luKF9fbGFzdF9tZ3IsICZfTV9iZWZvcmVfYmVnaW4sIF9N X2J1Y2tldHMsCisJCQkgICAgICAgX19ia3QsIF9fbm9kZSk7CiAgICAgICB9CiAKICAgICAg IC8vIFJlbW92ZSB0aGUgYnVja2V0IGZpcnN0IG5vZGUKQEAgLTg4Nyw0NCArMTAwNyw2MiBA QCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAgX19ub2RlX2Jhc2Vf cHRyCiAgICAgICBfTV9nZXRfcHJldmlvdXNfbm9kZShzaXplX3R5cGUgX19ia3QsIF9fbm9k ZV9wdHIgX19uKTsKIAotICAgICAgcGFpcjxfX25vZGVfcHRyLCBfX2hhc2hfY29kZT4KLSAg ICAgIF9NX2NvbXB1dGVfaGFzaF9jb2RlKF9fbm9kZV9wdHIgX19oaW50LCBjb25zdCBrZXlf dHlwZSYgX19rKSBjb25zdDsKLQogICAgICAgLy8gSW5zZXJ0IG5vZGUgX19uIHdpdGggaGFz aCBjb2RlIF9fY29kZSwgaW4gYnVja2V0IF9fYmt0IGlmIG5vCiAgICAgICAvLyByZWhhc2gg KGFzc3VtZXMgbm8gZWxlbWVudCB3aXRoIHNhbWUga2V5IGFscmVhZHkgcHJlc2VudCkuCiAg ICAgICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgX19uIGlmIGluc2VydGlvbiBzdWNjZWVkcywg dGhyb3dzIG90aGVyd2lzZS4KICAgICAgIGl0ZXJhdG9yCi0gICAgICBfTV9pbnNlcnRfdW5p cXVlX25vZGUoc2l6ZV90eXBlIF9fYmt0LCBfX2hhc2hfY29kZSwKKyAgICAgIF9NX2luc2Vy dF91bmlxdWVfbm9kZShfTGFzdE5vZGVNYW5hZ2VyJiBfX2xhc3RfbWdyLAorCQkJICAgIHNp emVfdHlwZSBfX2JrdCwgX19oYXNoX2NvZGUsCiAJCQkgICAgX19ub2RlX3B0ciBfX24sIHNp emVfdHlwZSBfX25fZWx0ID0gMSk7CiAKLSAgICAgIC8vIEluc2VydCBub2RlIF9fbiB3aXRo IGtleSBfX2sgYW5kIGhhc2ggY29kZSBfX2NvZGUuCisgICAgICAvLyBJbnNlcnQgbm9kZSBf X24gYWZ0ZXIgX19wcmV2IGlmIGFueS4KICAgICAgIC8vIFRha2VzIG93bmVyc2hpcCBvZiBf X24gaWYgaW5zZXJ0aW9uIHN1Y2NlZWRzLCB0aHJvd3Mgb3RoZXJ3aXNlLgogICAgICAgaXRl cmF0b3IKLSAgICAgIF9NX2luc2VydF9tdWx0aV9ub2RlKF9fbm9kZV9wdHIgX19oaW50LAot CQkJICAgX19oYXNoX2NvZGUgX19jb2RlLCBfX25vZGVfcHRyIF9fbik7CisgICAgICBfTV9p bnNlcnRfbXVsdGlfbm9kZShfTGFzdE5vZGVNYW5hZ2VyJiBfX2xhc3RfbWdyLCBjb25zdCBr ZXlfdHlwZSYgX19rLAorCQkJICAgX19ub2RlX3B0ciBfX24sIF9fbm9kZV9wdHIgX19oYXNo X2NvZGVfbiA9IG51bGxwdHIpOwogCiAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJn cz4KIAlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+Ci0JX01fZW1wbGFjZSh0cnVlX3R5cGUg X191a3MsIF9BcmdzJiYuLi4gX19hcmdzKTsKKwlfTV9lbXBsYWNlX3VuaXF1ZShfTGFzdE5v ZGVNYW5hZ2VyJiwgX0FyZ3MmJi4uLiBfX2FyZ3MpOwogCiAgICAgICB0ZW1wbGF0ZTx0eXBl bmFtZS4uLiBfQXJncz4KIAlpdGVyYXRvcgotCV9NX2VtcGxhY2UoZmFsc2VfdHlwZSBfX3Vr cywgX0FyZ3MmJi4uLiBfX2FyZ3MpCi0JeyByZXR1cm4gX01fZW1wbGFjZShjZW5kKCksIF9f dWtzLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisJX01fZW1wbGFjZV9t dWx0aShfTGFzdE5vZGVNYW5hZ2VyJiwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgICAgICB0 ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+ CisJX01fZW1wbGFjZSh0cnVlX3R5cGUgLypfX3VrcyovLCBfQXJncyYmLi4uIF9fYXJncykK Kwl7CisJICBhdXRvIF9fbGFzdF9tZ3IgPSBfTV9nZXRfbGFzdF9ub2RlX21ncigpOworCSAg cmV0dXJuIF9NX2VtcGxhY2VfdW5pcXVlKF9fbGFzdF9tZ3IsIHN0ZDo6Zm9yd2FyZDxfQXJn cz4oX19hcmdzKS4uLik7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJn cz4KKwlpdGVyYXRvcgorCV9NX2VtcGxhY2UoZmFsc2VfdHlwZSAvKl9fdWtzKi8sIF9Bcmdz JiYuLi4gX19hcmdzKQorCXsKKwkgIGF1dG8gX19sYXN0X21nciA9IF9NX2dldF9sYXN0X25v ZGVfbWdyKCk7CisJICByZXR1cm4gX01fZW1wbGFjZV9tdWx0aShfX2xhc3RfbWdyLCBzdGQ6 OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KIAotICAgICAgLy8gRW1wbGFjZSB3 aXRoIGhpbnQsIHVzZWxlc3Mgd2hlbiBrZXlzIGFyZSB1bmlxdWUuCiAgICAgICB0ZW1wbGF0 ZTx0eXBlbmFtZS4uLiBfQXJncz4KIAlpdGVyYXRvcgotCV9NX2VtcGxhY2UoY29uc3RfaXRl cmF0b3IsIHRydWVfdHlwZSBfX3VrcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCi0JeyByZXR1cm4g X01fZW1wbGFjZShfX3Vrcywgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKS5maXJz dDsgfQorCV9NX2VtcGxhY2UoX0xhc3ROb2RlTWFuYWdlciYgX19sYXN0X21nciwKKwkJICAg dHJ1ZV90eXBlIC8qX191a3MqLywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgcmV0dXJu IF9NX2VtcGxhY2VfdW5pcXVlKF9fbGFzdF9tZ3IsCisJCQkJICAgc3RkOjpmb3J3YXJkPF9B cmdzPihfX2FyZ3MpLi4uKS5maXJzdDsKKwl9CiAKICAgICAgIHRlbXBsYXRlPHR5cGVuYW1l Li4uIF9BcmdzPgogCWl0ZXJhdG9yCi0JX01fZW1wbGFjZShjb25zdF9pdGVyYXRvciwgZmFs c2VfdHlwZSBfX3VrcywgX0FyZ3MmJi4uLiBfX2FyZ3MpOworCV9NX2VtcGxhY2UoX0xhc3RO b2RlTWFuYWdlciYgX19sYXN0X21nciwKKwkJICAgZmFsc2VfdHlwZSAvKl9fdWtzKi8sIF9B cmdzJiYuLi4gX19hcmdzKQorCXsgcmV0dXJuIF9NX2VtcGxhY2VfbXVsdGkoX19sYXN0X21n ciwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQogCiAgICAgICB0ZW1wbGF0 ZTx0eXBlbmFtZSBfS3QsIHR5cGVuYW1lIF9BcmcsIHR5cGVuYW1lIF9Ob2RlR2VuZXJhdG9y PgogCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KLQlfTV9pbnNlcnRfdW5pcXVlKF9LdCYm LCBfQXJnJiYsIF9Ob2RlR2VuZXJhdG9yJik7CisJX01faW5zZXJ0X3VuaXF1ZShfTGFzdE5v ZGVNYW5hZ2VyJiwgX0t0JiYsIF9BcmcmJiwgX05vZGVHZW5lcmF0b3ImKTsKIAogICAgICAg dGVtcGxhdGU8dHlwZW5hbWUgX0t0PgogCXN0YXRpYyBfX2NvbmRpdGlvbmFsX3Q8CkBAIC05 NDQsOSArMTA4MiwxMCBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCiAg ICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZSBfTm9kZUdlbmVyYXRvcj4K IAlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+Ci0JX01faW5zZXJ0X3VuaXF1ZV9hdXgoX0Fy ZyYmIF9fYXJnLCBfTm9kZUdlbmVyYXRvciYgX19ub2RlX2dlbikKKwlfTV9pbnNlcnRfdW5p cXVlX2F1eChfTGFzdE5vZGVNYW5hZ2VyJiBfX2xhc3RfbWdyLAorCQkJICAgICBfQXJnJiYg X19hcmcsIF9Ob2RlR2VuZXJhdG9yJiBfX25vZGVfZ2VuKQogCXsKLQkgIHJldHVybiBfTV9p bnNlcnRfdW5pcXVlKAorCSAgcmV0dXJuIF9NX2luc2VydF91bmlxdWUoX19sYXN0X21nciwK IAkgICAgX1NfZm9yd2FyZF9rZXkoX0V4dHJhY3RLZXl7fShzdGQ6OmZvcndhcmQ8X0FyZz4o X19hcmcpKSksCiAJICAgIHN0ZDo6Zm9yd2FyZDxfQXJnPihfX2FyZyksIF9fbm9kZV9nZW4p OwogCX0KQEAgLTk1Niw5ICsxMDk1LDEwIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9W RVJTSU9OCiAJX01faW5zZXJ0KF9BcmcmJiBfX2FyZywgX05vZGVHZW5lcmF0b3ImIF9fbm9k ZV9nZW4sCiAJCSAgdHJ1ZV90eXBlIC8qIF9fdWtzICovKQogCXsKKwkgIGF1dG8gX19sYXN0 X21nciA9IF9NX2dldF9sYXN0X25vZGVfbWdyKCk7CiAJICB1c2luZyBfX3RvX3ZhbHVlCiAJ ICAgID0gX19kZXRhaWw6Ol9Db252ZXJ0VG9WYWx1ZVR5cGU8X0V4dHJhY3RLZXksIHZhbHVl X3R5cGU+OwotCSAgcmV0dXJuIF9NX2luc2VydF91bmlxdWVfYXV4KAorCSAgcmV0dXJuIF9N X2luc2VydF91bmlxdWVfYXV4KF9fbGFzdF9tZ3IsCiAJICAgIF9fdG9fdmFsdWV7fShzdGQ6 OmZvcndhcmQ8X0FyZz4oX19hcmcpKSwgX19ub2RlX2dlbik7CiAJfQogCkBAIC05NjcsMzIg KzExMDcsMzUgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAlfTV9pbnNl cnQoX0FyZyYmIF9fYXJnLCBfTm9kZUdlbmVyYXRvciYgX19ub2RlX2dlbiwKIAkJICBmYWxz ZV90eXBlIF9fdWtzKQogCXsKKwkgIGF1dG8gX19sYXN0X21nciA9IF9NX2dldF9sYXN0X25v ZGVfbWdyKCk7CiAJICB1c2luZyBfX3RvX3ZhbHVlCiAJICAgID0gX19kZXRhaWw6Ol9Db252 ZXJ0VG9WYWx1ZVR5cGU8X0V4dHJhY3RLZXksIHZhbHVlX3R5cGU+OwotCSAgcmV0dXJuIF9N X2luc2VydChjZW5kKCksCisJICByZXR1cm4gX01faW5zZXJ0KF9fbGFzdF9tZ3IsCiAJICAg IF9fdG9fdmFsdWV7fShzdGQ6OmZvcndhcmQ8X0FyZz4oX19hcmcpKSwgX19ub2RlX2dlbiwg X191a3MpOwogCX0KIAotICAgICAgLy8gSW5zZXJ0IHdpdGggaGludCwgbm90IHVzZWQgd2hl biBrZXlzIGFyZSB1bmlxdWUuCisgICAgICAvLyBJbnNlcnQgd2l0aCBoaW50IHdoZW4ga2V5 cyBhcmUgdW5pcXVlLgogICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZywgdHlwZW5hbWUg X05vZGVHZW5lcmF0b3I+CiAJaXRlcmF0b3IKLQlfTV9pbnNlcnQoY29uc3RfaXRlcmF0b3Is IF9BcmcmJiBfX2FyZywKLQkJICBfTm9kZUdlbmVyYXRvciYgX19ub2RlX2dlbiwgdHJ1ZV90 eXBlIF9fdWtzKQorCV9NX2luc2VydChfTGFzdE5vZGVNYW5hZ2VyJiBfX2xhc3RfbWdyLCBf QXJnJiYgX19hcmcsCisJCSAgX05vZGVHZW5lcmF0b3ImIF9fbm9kZV9nZW4sIHRydWVfdHlw ZSAvKiBfX3VrcyAqLykKIAl7Ci0JICByZXR1cm4KLQkgICAgX01faW5zZXJ0KHN0ZDo6Zm9y d2FyZDxfQXJnPihfX2FyZyksIF9fbm9kZV9nZW4sIF9fdWtzKS5maXJzdDsKKwkgIHVzaW5n IF9fdG9fdmFsdWUKKwkgICAgPSBfX2RldGFpbDo6X0NvbnZlcnRUb1ZhbHVlVHlwZTxfRXh0 cmFjdEtleSwgdmFsdWVfdHlwZT47CisJICByZXR1cm4gX01faW5zZXJ0X3VuaXF1ZV9hdXgo X19sYXN0X21nciwKKwkgICAgX190b192YWx1ZXt9KHN0ZDo6Zm9yd2FyZDxfQXJnPihfX2Fy ZykpLCBfX25vZGVfZ2VuKS5maXJzdDsKIAl9CiAKICAgICAgIC8vIEluc2VydCB3aXRoIGhp bnQgd2hlbiBrZXlzIGFyZSBub3QgdW5pcXVlLgogICAgICAgdGVtcGxhdGU8dHlwZW5hbWUg X0FyZywgdHlwZW5hbWUgX05vZGVHZW5lcmF0b3I+CiAJaXRlcmF0b3IKLQlfTV9pbnNlcnQo Y29uc3RfaXRlcmF0b3IsIF9BcmcmJiwKKwlfTV9pbnNlcnQoX0xhc3ROb2RlTWFuYWdlciYg X19sYXN0X21nciwgX0FyZyYmIF9fYXJnLAogCQkgIF9Ob2RlR2VuZXJhdG9yJiwgZmFsc2Vf dHlwZSBfX3Vrcyk7CiAKICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9y LCB0eXBlbmFtZSBfTm9kZUdlbmVyYXRvcj4KIAl2b2lkCiAJX01faW5zZXJ0X3JhbmdlKF9J bnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKLQkJCV9Ob2Rl R2VuZXJhdG9yJik7CisJCQlfTGFzdE5vZGVNYW5hZ2VyJiwgX05vZGVHZW5lcmF0b3ImKTsK IAogICAgICAgc2l6ZV90eXBlCiAgICAgICBfTV9lcmFzZSh0cnVlX3R5cGUgX191a3MsIGNv bnN0IGtleV90eXBlJik7CkBAIC0xMDE0LDcgKzExNTcsOCBAQCBfR0xJQkNYWF9CRUdJTl9O QU1FU1BBQ0VfVkVSU0lPTgogCWl0ZXJhdG9yCiAJZW1wbGFjZV9oaW50KGNvbnN0X2l0ZXJh dG9yIF9faGludCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCiAJewotCSAgcmV0dXJuIF9NX2VtcGxh Y2UoX19oaW50LCBfX3VuaXF1ZV9rZXlze30sCisJICBhdXRvIF9fbGFzdF9tZ3IgPSBfTV9n ZXRfbGFzdF9ub2RlX21ncihfX2hpbnQuX01fY3VyKTsKKwkgIHJldHVybiBfTV9lbXBsYWNl KF9fbGFzdF9tZ3IsIF9fdW5pcXVlX2tleXN7fSwKIAkJCSAgICBzdGQ6OmZvcndhcmQ8X0Fy Z3M+KF9fYXJncykuLi4pOwogCX0KIApAQCAtMTA0MSw3ICsxMTg1LDExIEBAIF9HTElCQ1hY X0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAKICAgICAgIC8vIFNldCBudW1iZXIgb2YgYnVj a2V0cyBrZWVwaW5nIGl0IGFwcHJvcHJpYXRlIGZvciBjb250YWluZXIncyBudW1iZXIKICAg ICAgIC8vIG9mIGVsZW1lbnRzLgotICAgICAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9fYmt0 X2NvdW50KTsKKyAgICAgIHZvaWQgcmVoYXNoKHNpemVfdHlwZSBfX2JrdF9jb3VudCkKKyAg ICAgIHsKKwlhdXRvIF9fbGFzdF9tZ3IgPSBfTV9nZXRfbGFzdF9ub2RlX21ncigpOworCV9N X3JlaGFzaChfX2xhc3RfbWdyLCBfX2JrdF9jb3VudCk7CisgICAgICB9CiAKICAgICAgIC8v IERSIDExODkuCiAgICAgICAvLyByZXNlcnZlLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9S ZWhhc2hfYmFzZS4KQEAgLTEwNDksNyArMTE5Nyw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVT UEFDRV9WRVJTSU9OCiAjaWYgX19jcGx1c3BsdXMgPiAyMDE0MDJMCiAgICAgICAvLy8gUmUt aW5zZXJ0IGFuIGV4dHJhY3RlZCBub2RlIGludG8gYSBjb250YWluZXIgd2l0aCB1bmlxdWUg a2V5cy4KICAgICAgIGluc2VydF9yZXR1cm5fdHlwZQotICAgICAgX01fcmVpbnNlcnRfbm9k ZShub2RlX3R5cGUmJiBfX25oKQorICAgICAgX01fcmVpbnNlcnRfbm9kZShjb25zdF9pdGVy YXRvciBfX2hpbnQsIG5vZGVfdHlwZSYmIF9fbmgpCiAgICAgICB7CiAJaW5zZXJ0X3JldHVy bl90eXBlIF9fcmV0OwogCWlmIChfX25oLmVtcHR5KCkpCkBAIC0xMDU4LDE0ICsxMjA2LDIy IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJICB7CiAJICAgIF9fZ2xp YmN4eF9hc3NlcnQoZ2V0X2FsbG9jYXRvcigpID09IF9fbmguZ2V0X2FsbG9jYXRvcigpKTsK IAorCSAgICBhdXRvIF9fbGFzdF9tZ3IgPSBfTV9nZXRfbGFzdF9ub2RlX21ncihfX2hpbnQu X01fY3VyKTsKIAkgICAgX19ub2RlX3B0ciBfX24gPSBudWxscHRyOwogCSAgICBjb25zdCBr ZXlfdHlwZSYgX19rID0gX19uaC5fTV9rZXkoKTsKIAkgICAgY29uc3Qgc2l6ZV90eXBlIF9f c2l6ZSA9IHNpemUoKTsKIAkgICAgaWYgKF9fc2l6ZSA8PSBfX3NtYWxsX3NpemVfdGhyZXNo b2xkKCkpCiAJICAgICAgewotCQlmb3IgKF9fbiA9IF9NX2JlZ2luKCk7IF9fbjsgX19uID0g X19uLT5fTV9uZXh0KCkpCi0JCSAgaWYgKHRoaXMtPl9NX2tleV9lcXVhbHMoX19rLCAqX19u KSkKLQkJICAgIGJyZWFrOworCQlfX25vZGVfcHRyIF9fbGFzdF9uID0gbnVsbHB0cjsKKwkJ Zm9yIChfX24gPSBfTV9iZWdpbigpOyBfX247CisJCSAgICAgX19sYXN0X24gPSBfX24sIF9f biA9IF9fbi0+X01fbmV4dCgpKQorCQkgIHsKKwkJICAgIGlmICh0aGlzLT5fTV9rZXlfZXF1 YWxzKF9faywgKl9fbikpCisJCSAgICAgIGJyZWFrOworCQkgIH0KKworCQlpZiAoIV9fbikK KwkJICBfX2xhc3RfbWdyLl9NX3NldChfX2xhc3Rfbik7CiAJICAgICAgfQogCiAJICAgIF9f aGFzaF9jb2RlIF9fY29kZTsKQEAgLTEwODYsOCArMTI0Miw4IEBAIF9HTElCQ1hYX0JFR0lO X05BTUVTUEFDRV9WRVJTSU9OCiAJICAgICAgfQogCSAgICBlbHNlCiAJICAgICAgewotCQlf X3JldC5wb3NpdGlvbgotCQkgID0gX01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fYmt0LCBfX2Nv ZGUsIF9fbmguX01fcHRyKTsKKwkJX19yZXQucG9zaXRpb24gPSBfTV9pbnNlcnRfdW5pcXVl X25vZGUoCisJCSAgX19sYXN0X21nciwgX19ia3QsIF9fY29kZSwgX19uaC5fTV9wdHIpOwog CQlfX25oLl9NX3B0ciA9IG51bGxwdHI7CiAJCV9fcmV0Lmluc2VydGVkID0gdHJ1ZTsKIAkg ICAgICB9CkBAIC0xMTA0LDEwICsxMjYwLDkgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNF X1ZFUlNJT04KIAogCV9fZ2xpYmN4eF9hc3NlcnQoZ2V0X2FsbG9jYXRvcigpID09IF9fbmgu Z2V0X2FsbG9jYXRvcigpKTsKIAorCWF1dG8gX19sYXN0X21nciA9IF9NX2dldF9sYXN0X25v ZGVfbWdyKF9faGludC5fTV9jdXIpOwogCWNvbnN0IGtleV90eXBlJiBfX2sgPSBfX25oLl9N X2tleSgpOwotCWF1dG8gX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7Ci0JYXV0 byBfX3JldAotCSAgPSBfTV9pbnNlcnRfbXVsdGlfbm9kZShfX2hpbnQuX01fY3VyLCBfX2Nv ZGUsIF9fbmguX01fcHRyKTsKKwlhdXRvIF9fcmV0ID0gX01faW5zZXJ0X211bHRpX25vZGUo X19sYXN0X21nciwgX19rLCBfX25oLl9NX3B0cik7CiAJX19uaC5fTV9wdHIgPSBudWxscHRy OwogCXJldHVybiBfX3JldDsKICAgICAgIH0KQEAgLTExNDcsNiArMTMwMiwxOSBAQCBfR0xJ QkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgcmV0dXJuIHRoaXMtPl9NX2hhc2hf Y29kZShfX2spOwogCX0KIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0gyPgorCWl0ZXJh dG9yCisJX01faW5zZXJ0X211bHRpX25vZGUoY29uc3QgX0gyJiwgX0xhc3ROb2RlTWFuYWdl ciYgX19sYXN0X21nciwKKwkJCSAgICAgY29uc3Qga2V5X3R5cGUmIF9faywgX19ub2RlX3B0 ciBfX2VxdWlfbiwKKwkJCSAgICAgX19ub2RlX3B0ciBfX24pCisJeworCSAgaWYgY29uc3Rl eHByIChzdGQ6OmlzX3NhbWVfdjxfSDIsIF9IYXNoPikKKwkgICAgaWYgY29uc3RleHByIChz dGQ6OmlzX2VtcHR5X3Y8X0hhc2g+KQorCSAgICAgIHJldHVybiBfTV9pbnNlcnRfbXVsdGlf bm9kZShfX2xhc3RfbWdyLCBfX2ssIF9fbiwgX19lcXVpX24pOworCisJICByZXR1cm4gX01f aW5zZXJ0X211bHRpX25vZGUoX19sYXN0X21nciwgX19rLCBfX24pOworCX0KKwogICAgIHB1 YmxpYzoKICAgICAgIC8vIEV4dHJhY3QgYSBub2RlLgogICAgICAgbm9kZV90eXBlCkBAIC0x MTc4LDYgKzEzNDYsNyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAg ICAgIG5vZGVfdHlwZT4sICJOb2RlIHR5cGVzIGFyZSBjb21wYXRpYmxlIik7CiAJICBfX2ds aWJjeHhfYXNzZXJ0KGdldF9hbGxvY2F0b3IoKSA9PSBfX3NyYy5nZXRfYWxsb2NhdG9yKCkp OwogCisJICBhdXRvIF9fbGFzdF9tZ3IgPSBfTV9nZXRfbGFzdF9ub2RlX21ncigpOwogCSAg YXV0byBfX25fZWx0ID0gX19zcmMuc2l6ZSgpOwogCSAgZm9yIChhdXRvIF9faSA9IF9fc3Jj LmNiZWdpbigpLCBfX2VuZCA9IF9fc3JjLmNlbmQoKTsgX19pICE9IF9fZW5kOykKIAkgICAg ewpAQCAtMTE4Niw4ICsxMzU1LDEwIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJT SU9OCiAJICAgICAgY29uc3Qga2V5X3R5cGUmIF9fayA9IF9FeHRyYWN0S2V5e30oKl9fcG9z KTsKIAkgICAgICBpZiAoX19zaXplIDw9IF9fc21hbGxfc2l6ZV90aHJlc2hvbGQoKSkKIAkJ eworCQkgIF9fbm9kZV9wdHIgX19sYXN0X24gPSBudWxscHRyOwogCQkgIGJvb2wgX19mb3Vu ZCA9IGZhbHNlOwotCQkgIGZvciAoYXV0byBfX24gPSBfTV9iZWdpbigpOyBfX247IF9fbiA9 IF9fbi0+X01fbmV4dCgpKQorCQkgIGZvciAoYXV0byBfX24gPSBfTV9iZWdpbigpOyBfX247 CisJCSAgICAgICBfX2xhc3RfbiA9IF9fbiwgX19uID0gX19uLT5fTV9uZXh0KCkpCiAJCSAg ICBpZiAodGhpcy0+X01fa2V5X2VxdWFscyhfX2ssICpfX24pKQogCQkgICAgICB7CiAJCQlf X2ZvdW5kID0gdHJ1ZTsKQEAgLTEyMDAsNiArMTM3MSw4IEBAIF9HTElCQ1hYX0JFR0lOX05B TUVTUEFDRV9WRVJTSU9OCiAJCQktLV9fbl9lbHQ7CiAJCSAgICAgIGNvbnRpbnVlOwogCQkg ICAgfQorCQkgIGVsc2UKKwkJICAgIF9fbGFzdF9tZ3IuX01fc2V0KF9fbGFzdF9uKTsKIAkJ fQogCiAJICAgICAgX19oYXNoX2NvZGUgX19jb2RlCkBAIC0xMjA5LDcgKzEzODIsOCBAQCBf R0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCQkgIHx8IF9NX2ZpbmRfbm9kZShf X2JrdCwgX19rLCBfX2NvZGUpID09IG51bGxwdHIpCiAJCXsKIAkJICBhdXRvIF9fbmggPSBf X3NyYy5leHRyYWN0KF9fcG9zKTsKLQkJICBfTV9pbnNlcnRfdW5pcXVlX25vZGUoX19ia3Qs IF9fY29kZSwgX19uaC5fTV9wdHIsIF9fbl9lbHQpOworCQkgIF9NX2luc2VydF91bmlxdWVf bm9kZSgKKwkJICAgIF9fbGFzdF9tZ3IsIF9fYmt0LCBfX2NvZGUsIF9fbmguX01fcHRyLCBf X25fZWx0KTsKIAkJICBfX25oLl9NX3B0ciA9IG51bGxwdHI7CiAJCSAgX19uX2VsdCA9IDE7 CiAJCX0KQEAgLTEyMjcsMjcgKzE0MDEsMjggQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNF X1ZFUlNJT04KIAkgICAgICBub2RlX3R5cGU+LCAiTm9kZSB0eXBlcyBhcmUgY29tcGF0aWJs ZSIpOwogCSAgX19nbGliY3h4X2Fzc2VydChnZXRfYWxsb2NhdG9yKCkgPT0gX19zcmMuZ2V0 X2FsbG9jYXRvcigpKTsKIAotCSAgX19ub2RlX3B0ciBfX2hpbnQgPSBudWxscHRyOworCSAg YXV0byBfX2xhc3RfbWdyID0gX01fZ2V0X2xhc3Rfbm9kZV9tZ3IoKTsKIAkgIHRoaXMtPnJl c2VydmUoc2l6ZSgpICsgX19zcmMuc2l6ZSgpKTsKIAkgIGZvciAoYXV0byBfX2kgPSBfX3Ny Yy5jYmVnaW4oKSwgX19lbmQgPSBfX3NyYy5jZW5kKCk7IF9faSAhPSBfX2VuZDspCiAJICAg IHsKIAkgICAgICBhdXRvIF9fcG9zID0gX19pKys7CiAJICAgICAgY29uc3Qga2V5X3R5cGUm IF9fayA9IF9FeHRyYWN0S2V5e30oKl9fcG9zKTsKLQkgICAgICBfX2hhc2hfY29kZSBfX2Nv ZGUKLQkJPSBfTV9zcmNfaGFzaF9jb2RlKF9fc3JjLmhhc2hfZnVuY3Rpb24oKSwgX19rLCAq X19wb3MuX01fY3VyKTsKIAkgICAgICBhdXRvIF9fbmggPSBfX3NyYy5leHRyYWN0KF9fcG9z KTsKLQkgICAgICBfX2hpbnQgPSBfTV9pbnNlcnRfbXVsdGlfbm9kZShfX2hpbnQsIF9fY29k ZSwgX19uaC5fTV9wdHIpLl9NX2N1cjsKKwkgICAgICBfTV9pbnNlcnRfbXVsdGlfbm9kZShf X3NyYy5oYXNoX2Z1bmN0aW9uKCksCisJCQkJICAgX19sYXN0X21nciwgX19rLCBfX3Bvcy5f TV9jdXIsIF9fbmguX01fcHRyKTsKIAkgICAgICBfX25oLl9NX3B0ciA9IG51bGxwdHI7CiAJ ICAgIH0KIAl9CiAjZW5kaWYgLy8gQysrMTcKIAogICAgIHByaXZhdGU6CisgICAgICB2b2lk IF9NX3JlaGFzaChfTGFzdE5vZGVNYW5hZ2VyJiwgc2l6ZV90eXBlIF9fYmt0X2NvdW50KTsK KwogICAgICAgLy8gSGVscGVyIHJlaGFzaCBtZXRob2QgdXNlZCB3aGVuIGtleXMgYXJlIHVu aXF1ZS4KLSAgICAgIHZvaWQgX01fcmVoYXNoKHNpemVfdHlwZSBfX2JrdF9jb3VudCwgdHJ1 ZV90eXBlIF9fdWtzKTsKKyAgICAgIHZvaWQgX01fcmVoYXNoKF9MYXN0Tm9kZU1hbmFnZXIm LCBzaXplX3R5cGUgX19ia3RfY291bnQsIHRydWVfdHlwZSBfX3Vrcyk7CiAKICAgICAgIC8v IEhlbHBlciByZWhhc2ggbWV0aG9kIHVzZWQgd2hlbiBrZXlzIGNhbiBiZSBub24tdW5pcXVl LgotICAgICAgdm9pZCBfTV9yZWhhc2goc2l6ZV90eXBlIF9fYmt0X2NvdW50LCBmYWxzZV90 eXBlIF9fdWtzKTsKKyAgICAgIHZvaWQgX01fcmVoYXNoKF9MYXN0Tm9kZU1hbmFnZXImLCBz aXplX3R5cGUgX19ia3RfY291bnQsIGZhbHNlX3R5cGUgX191a3MpOwogICAgIH07CiAKICAg Ly8gRGVmaW5pdGlvbnMgb2YgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZSdzIG91dC1vZi1s aW5lIG1lbWJlciBmdW5jdGlvbnMuCkBAIC0xMzA4LDggKzE0ODMsOSBAQCBfR0xJQkNYWF9C RUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgICBfTV9idWNrZXRfY291bnQgPSBfX2JrdF9j b3VudDsKIAkgIH0KIAorCWF1dG8gX19sYXN0X21nciA9IF9NX2dldF9sYXN0X25vZGVfbWdy KCk7CiAJX19hbGxvY19ub2RlX2dlbl90IF9fbm9kZV9nZW4oKnRoaXMpOwotCV9NX2luc2Vy dF9yYW5nZShfX2YsIF9fbCwgX19ub2RlX2dlbik7CisJX01faW5zZXJ0X3JhbmdlKF9fZiwg X19sLCBfX2xhc3RfbWdyLCBfX25vZGVfZ2VuKTsKICAgICAgIH0KIAogICB0ZW1wbGF0ZTx0 eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxvYywKQEAgLTE0 NTQsNiArMTYzMCw4IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJCSAg X01fYnVja2V0c1tfX2JrdF0gPSBfX3ByZXZfbjsKIAkJX19wcmV2X24gPSBfX3RoaXNfbjsK IAkgICAgICB9CisKKwkgICAgX01fc2V0X2xhc3QoX19wcmV2X24pOwogCSAgfQogCV9fY2F0 Y2goLi4uKQogCSAgewpAQCAtMTQ3OSw2ICsxNjU3LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFN RVNQQUNFX1ZFUlNJT04KICAgICAgIF9NX2J1Y2tldHMgPSAmX01fc2luZ2xlX2J1Y2tldDsK ICAgICAgIF9NX2JlZm9yZV9iZWdpbi5fTV9ueHQgPSBudWxscHRyOwogICAgICAgX01fZWxl bWVudF9jb3VudCA9IDA7CisgICAgICBfTV9zZXRfbGFzdChudWxscHRyKTsKICAgICB9CiAK ICAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBf QWxsb2MsCkBAIC0xNTA5LDkgKzE2ODgsMTEgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNF X1ZFUlNJT04KICAgICAgIF9NX2JlZm9yZV9iZWdpbi5fTV9ueHQgPSBfX2h0Ll9NX2JlZm9y ZV9iZWdpbi5fTV9ueHQ7CiAgICAgICBfTV9lbGVtZW50X2NvdW50ID0gX19odC5fTV9lbGVt ZW50X2NvdW50OwogICAgICAgc3RkOjpfX2FsbG9jX29uX21vdmUodGhpcy0+X01fbm9kZV9h bGxvY2F0b3IoKSwgX19odC5fTV9ub2RlX2FsbG9jYXRvcigpKTsKKyAgICAgIF9NX3NldF9s YXN0KF9faHQuX01fZ2V0X2xhc3QoKSk7CiAKICAgICAgIC8vIEZpeCBidWNrZXQgY29udGFp bmluZyB0aGUgX01fYmVmb3JlX2JlZ2luIHBvaW50ZXIgdGhhdCBjYW4ndCBiZSBtb3ZlZC4K ICAgICAgIF9NX3VwZGF0ZV9iYmVnaW4oKTsKKwogICAgICAgX19odC5fTV9yZXNldCgpOwog ICAgIH0KIApAQCAtMTU3NSw2ICsxNzU2LDkgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNF X1ZFUlNJT04KICAgICAgIF9NX2JlZm9yZV9iZWdpbihfX2h0Ll9NX2JlZm9yZV9iZWdpbi5f TV9ueHQpLAogICAgICAgX01fZWxlbWVudF9jb3VudChfX2h0Ll9NX2VsZW1lbnRfY291bnQp LAogICAgICAgX01fcmVoYXNoX3BvbGljeShfX2h0Ll9NX3JlaGFzaF9wb2xpY3kpCisjaWYg X0dMSUJDWFhfSU5MSU5FX1ZFUlNJT04KKyAgICAsIF9NX2xhc3QoX19odC5fTV9sYXN0KQor I2VuZGlmCiAgICAgewogICAgICAgLy8gVXBkYXRlIGJ1Y2tldHMgaWYgX19odCBpcyB1c2lu ZyBpdHMgc2luZ2xlIGJ1Y2tldC4KICAgICAgIGlmIChfX2h0Ll9NX3VzZXNfc2luZ2xlX2J1 Y2tldCgpKQpAQCAtMTYzOCw2ICsxODIyLDggQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNF X1ZFUlNJT04KIAkgIGVsc2UKIAkgICAgX01fYnVja2V0cyA9IF9faHQuX01fYnVja2V0czsK IAorCSAgX01fc2V0X2xhc3QoX19odC5fTV9nZXRfbGFzdCgpKTsKKwogCSAgLy8gRml4IGJ1 Y2tldCBjb250YWluaW5nIHRoZSBfTV9iZWZvcmVfYmVnaW4gcG9pbnRlciB0aGF0IGNhbid0 IGJlCiAJICAvLyBtb3ZlZC4KIAkgIF9NX3VwZGF0ZV9iYmVnaW4oX19odC5fTV9iZWdpbigp KTsKQEAgLTIxNDcsNyArMjMzMyw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJT SU9OCiAgICAgICBhdXRvCiAgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9j LCBfRXh0cmFjdEtleSwgX0VxdWFsLAogCQkgX0hhc2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQs IF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKLSAgICAgIF9NX2VtcGxhY2UodHJ1ZV90eXBl IC8qIF9fdWtzICovLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIF9NX2VtcGxhY2VfdW5p cXVlKF9MYXN0Tm9kZU1hbmFnZXImIF9fbGFzdF9tZ3IsIF9BcmdzJiYuLi4gX19hcmdzKQog ICAgICAgLT4gcGFpcjxpdGVyYXRvciwgYm9vbD4KICAgICAgIHsKIAkvLyBGaXJzdCBidWls ZCB0aGUgbm9kZSB0byBnZXQgYWNjZXNzIHRvIHRoZSBoYXNoIGNvZGUKQEAgLTIxNTYsMTAg KzIzNDIsMTQgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAljb25zdCBz aXplX3R5cGUgX19zaXplID0gc2l6ZSgpOwogCWlmIChfX3NpemUgPD0gX19zbWFsbF9zaXpl X3RocmVzaG9sZCgpKQogCSAgewotCSAgICBmb3IgKGF1dG8gX19pdCA9IF9NX2JlZ2luKCk7 IF9faXQ7IF9faXQgPSBfX2l0LT5fTV9uZXh0KCkpCi0JICAgICAgaWYgKHRoaXMtPl9NX2tl eV9lcXVhbHMoX19rLCAqX19pdCkpCisJICAgIF9fbm9kZV9wdHIgX19sYXN0X24gPSBudWxs cHRyOworCSAgICBmb3IgKGF1dG8gX19uID0gX01fYmVnaW4oKTsgX19uOworCQkgX19sYXN0 X24gPSBfX24sIF9fbiA9IF9fbi0+X01fbmV4dCgpKQorCSAgICAgIGlmICh0aGlzLT5fTV9r ZXlfZXF1YWxzKF9faywgKl9fbikpCiAJCS8vIFRoZXJlIGlzIGFscmVhZHkgYW4gZXF1aXZh bGVudCBub2RlLCBubyBpbnNlcnRpb24KLQkJcmV0dXJuIHsgaXRlcmF0b3IoX19pdCksIGZh bHNlIH07CisJCXJldHVybiB7IGl0ZXJhdG9yKF9fbiksIGZhbHNlIH07CisKKwkgICAgX19s YXN0X21nci5fTV9zZXQoX19sYXN0X24pOwogCSAgfQogCiAJX19oYXNoX2NvZGUgX19jb2Rl ID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CkBAIC0yMTcwLDcgKzIzNjAsOCBAQCBfR0xJ QkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgICByZXR1cm4geyBpdGVyYXRvcihf X3ApLCBmYWxzZSB9OwogCiAJLy8gSW5zZXJ0IHRoZSBub2RlCi0JYXV0byBfX3BvcyA9IF9N X2luc2VydF91bmlxdWVfbm9kZShfX2JrdCwgX19jb2RlLCBfX25vZGUuX01fbm9kZSk7CisJ YXV0byBfX3BvcyA9IF9NX2luc2VydF91bmlxdWVfbm9kZShfX2xhc3RfbWdyLCBfX2JrdCwg X19jb2RlLAorCQkJCQkgICBfX25vZGUuX01fbm9kZSk7CiAJX19ub2RlLl9NX25vZGUgPSBu dWxscHRyOwogCXJldHVybiB7IF9fcG9zLCB0cnVlIH07CiAgICAgICB9CkBAIC0yMTgzLDE3 ICsyMzc0LDE1IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAgICBh dXRvCiAgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0cmFjdEtl eSwgX0VxdWFsLAogCQkgX0hhc2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQsIF9SZWhhc2hQb2xp Y3ksIF9UcmFpdHM+OjoKLSAgICAgIF9NX2VtcGxhY2UoY29uc3RfaXRlcmF0b3IgX19oaW50 LCBmYWxzZV90eXBlIC8qIF9fdWtzICovLAotCQkgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAg ICBfTV9lbXBsYWNlX211bHRpKF9MYXN0Tm9kZU1hbmFnZXImIF9fbGFzdF9tZ3IsIF9Bcmdz JiYuLi4gX19hcmdzKQogICAgICAgLT4gaXRlcmF0b3IKICAgICAgIHsKLQkvLyBGaXJzdCBi dWlsZCB0aGUgbm9kZSB0byBnZXQgaXRzIGhhc2ggY29kZS4KKwkvLyBGaXJzdCBidWlsZCB0 aGUgbm9kZSB0byBnZXQgaXRzIGtleSBhbmQgaGFzaCBjb2RlLgogCV9TY29wZWRfbm9kZSBf X25vZGUgeyB0aGlzLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4gIH07CisKIAlj b25zdCBrZXlfdHlwZSYgX19rID0gX0V4dHJhY3RLZXl7fShfX25vZGUuX01fbm9kZS0+X01f digpKTsKKwlhdXRvIF9fcG9zID0gX01faW5zZXJ0X211bHRpX25vZGUoX19sYXN0X21nciwg X19rLCBfX25vZGUuX01fbm9kZSk7CiAKLQlhdXRvIF9fcmVzID0gdGhpcy0+X01fY29tcHV0 ZV9oYXNoX2NvZGUoX19oaW50Ll9NX2N1ciwgX19rKTsKLQlhdXRvIF9fcG9zCi0JICA9IF9N X2luc2VydF9tdWx0aV9ub2RlKF9fcmVzLmZpcnN0LCBfX3Jlcy5zZWNvbmQsIF9fbm9kZS5f TV9ub2RlKTsKIAlfX25vZGUuX01fbm9kZSA9IG51bGxwdHI7CiAJcmV0dXJuIF9fcG9zOwog ICAgICAgfQpAQCAtMjIwNSwzNiArMjM5NCw4IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFD RV9WRVJTSU9OCiAgICAgYXV0bwogICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxs b2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCiAJICAgICAgIF9IYXNoLCBfUmFuZ2VIYXNoLCBf VW51c2VkLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6Ci0gICAgX01fY29tcHV0ZV9oYXNo X2NvZGUoX19ub2RlX3B0ciBfX2hpbnQsIGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0Ci0g ICAgLT4gcGFpcjxfX25vZGVfcHRyLCBfX2hhc2hfY29kZT4KLSAgICB7Ci0gICAgICBpZiAo c2l6ZSgpIDw9IF9fc21hbGxfc2l6ZV90aHJlc2hvbGQoKSkKLQl7Ci0JICBpZiAoX19oaW50 KQotCSAgICB7Ci0JICAgICAgZm9yIChhdXRvIF9faXQgPSBfX2hpbnQ7IF9faXQ7IF9faXQg PSBfX2l0LT5fTV9uZXh0KCkpCi0JCWlmICh0aGlzLT5fTV9rZXlfZXF1YWxzKF9faywgKl9f aXQpKQotCQkgIHJldHVybiB7IF9faXQsIHRoaXMtPl9NX2hhc2hfY29kZSgqX19pdCkgfTsK LQkgICAgfQotCi0JICBmb3IgKGF1dG8gX19pdCA9IF9NX2JlZ2luKCk7IF9faXQgIT0gX19o aW50OyBfX2l0ID0gX19pdC0+X01fbmV4dCgpKQotCSAgICBpZiAodGhpcy0+X01fa2V5X2Vx dWFscyhfX2ssICpfX2l0KSkKLQkgICAgICByZXR1cm4geyBfX2l0LCB0aGlzLT5fTV9oYXNo X2NvZGUoKl9faXQpIH07Ci0KLQkgIF9faGludCA9IG51bGxwdHI7Ci0JfQotCi0gICAgICBy ZXR1cm4geyBfX2hpbnQsIHRoaXMtPl9NX2hhc2hfY29kZShfX2spIH07Ci0gICAgfQotCi0g IHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0Fs bG9jLAotCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCi0JICAg dHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SYW5nZUhhc2gsIHR5cGVuYW1lIF9VbnVzZWQs Ci0JICAgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX1RyYWl0cz4KLSAgICBh dXRvCi0gICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXks IF9FcXVhbCwKLQkgICAgICAgX0hhc2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQsIF9SZWhhc2hQ b2xpY3ksIF9UcmFpdHM+OjoKLSAgICBfTV9pbnNlcnRfdW5pcXVlX25vZGUoc2l6ZV90eXBl IF9fYmt0LCBfX2hhc2hfY29kZSBfX2NvZGUsCisgICAgX01faW5zZXJ0X3VuaXF1ZV9ub2Rl KF9MYXN0Tm9kZU1hbmFnZXImIF9fbGFzdF9tZ3IsCisJCQkgIHNpemVfdHlwZSBfX2JrdCwg X19oYXNoX2NvZGUgX19jb2RlLAogCQkJICBfX25vZGVfcHRyIF9fbm9kZSwgc2l6ZV90eXBl IF9fbl9lbHQpCiAgICAgLT4gaXRlcmF0b3IKICAgICB7CkBAIC0yMjQ1LDcgKzI0MDYsNyBA QCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCiAgICAgICBpZiAoX19kb19y ZWhhc2guZmlyc3QpCiAJewotCSAgX01fcmVoYXNoKF9fZG9fcmVoYXNoLnNlY29uZCwgdHJ1 ZV90eXBle30pOworCSAgX01fcmVoYXNoKF9fbGFzdF9tZ3IsIF9fZG9fcmVoYXNoLnNlY29u ZCwgdHJ1ZV90eXBle30pOwogCSAgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19jb2RlKTsK IAl9CiAKQEAgLTIyNTMsNyArMjQxNCw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9W RVJTSU9OCiAgICAgICB0aGlzLT5fTV9zdG9yZV9jb2RlKCpfX25vZGUsIF9fY29kZSk7CiAK ICAgICAgIC8vIEFsd2F5cyBpbnNlcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVja2V0 LgotICAgICAgX01faW5zZXJ0X2J1Y2tldF9iZWdpbihfX2JrdCwgX19ub2RlKTsKKyAgICAg IF9NX2luc2VydF9idWNrZXRfYmVnaW4oX19sYXN0X21nciwgX19ia3QsIF9fbm9kZSk7CiAg ICAgICArK19NX2VsZW1lbnRfY291bnQ7CiAgICAgICByZXR1cm4gaXRlcmF0b3IoX19ub2Rl KTsKICAgICB9CkBAIC0yMjY1LDUxICsyNDI2LDc0IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVT UEFDRV9WRVJTSU9OCiAgICAgYXV0bwogICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBf QWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCiAJICAgICAgIF9IYXNoLCBfUmFuZ2VIYXNo LCBfVW51c2VkLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6Ci0gICAgX01faW5zZXJ0X211 bHRpX25vZGUoX19ub2RlX3B0ciBfX2hpbnQsCi0JCQkgX19oYXNoX2NvZGUgX19jb2RlLCBf X25vZGVfcHRyIF9fbm9kZSkKKyAgICBfTV9pbnNlcnRfbXVsdGlfbm9kZShfTGFzdE5vZGVN YW5hZ2VyJiBfX2xhc3RfbWdyLCBjb25zdCBrZXlfdHlwZSYgX19rLAorCQkJIF9fbm9kZV9w dHIgX19ub2RlLCBfX25vZGVfcHRyIF9fZXF1aV9uKQogICAgIC0+IGl0ZXJhdG9yCiAgICAg eworICAgICAgLy8gQ29tcHV0ZSBoYXNoIGNvZGUsIGlmIG5lZWRlZCwgc28gdGhhdCB3ZSBk byBub3QgcmVoYXNoIGlmIGl0IHRocm93cy4KKyAgICAgIF9faGFzaF9jb2RlIF9fY29kZTsK KyAgICAgIF9fbm9kZV9iYXNlX3B0ciBfX3ByZXYgPSBudWxscHRyOworICAgICAgY29uc3Qg c2l6ZV90eXBlIF9fc2l6ZSA9IHNpemUoKTsKKyAgICAgIGlmIChfX3NpemUgPD0gX19zbWFs bF9zaXplX3RocmVzaG9sZCgpKQorCXsKKwkgIF9fbm9kZV9wdHIgX19sYXN0X24gPSBudWxs cHRyOworCSAgX19wcmV2ID0gJl9NX2JlZm9yZV9iZWdpbjsKKwkgIF9fbm9kZV9wdHIgX19u ID0gc3RhdGljX2Nhc3Q8X19ub2RlX3B0cj4oX19wcmV2LT5fTV9ueHQpOworCSAgZm9yICg7 IF9fbjsgX19wcmV2ID0gX19sYXN0X24gPSBfX24sIF9fbiA9IF9fbi0+X01fbmV4dCgpKQor CSAgICB7CisJICAgICAgaWYgKHRoaXMtPl9NX2tleV9lcXVhbHMoX19rLCAqX19uKSkKKwkJ eworCQkgIGlmIChfX2hhc2hfY2FjaGVkOjp2YWx1ZSkKKwkJICAgIF9fY29kZSA9IHRoaXMt Pl9NX2hhc2hfY29kZSgqX19uKTsKKworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKworCSAg aWYgKCFfX24pCisJICAgIHsKKwkgICAgICBfX3ByZXYgPSBudWxscHRyOworCSAgICAgIF9f bGFzdF9tZ3IuX01fc2V0KF9fbGFzdF9uKTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKCFf X3ByZXYpCisJeworCSAgX19jb2RlID0gX19lcXVpX24KKwkgICAgPyB0aGlzLT5fTV9oYXNo X2NvZGUoKl9fZXF1aV9uKQorCSAgICA6IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworCX0K KwogICAgICAgX19yZWhhc2hfZ3VhcmRfdCBfX3JlaGFzaF9ndWFyZChfTV9yZWhhc2hfcG9s aWN5KTsKICAgICAgIHN0ZDo6cGFpcjxib29sLCBzdGQ6OnNpemVfdD4gX19kb19yZWhhc2gK IAk9IF9NX3JlaGFzaF9wb2xpY3kuX01fbmVlZF9yZWhhc2goX01fYnVja2V0X2NvdW50LCBf TV9lbGVtZW50X2NvdW50LCAxKTsKIAogICAgICAgaWYgKF9fZG9fcmVoYXNoLmZpcnN0KQot CV9NX3JlaGFzaChfX2RvX3JlaGFzaC5zZWNvbmQsIGZhbHNlX3R5cGV7fSk7CisJX01fcmVo YXNoKF9fbGFzdF9tZ3IsIF9fZG9fcmVoYXNoLnNlY29uZCwgZmFsc2VfdHlwZXt9KTsKIAog ICAgICAgX19yZWhhc2hfZ3VhcmQuX01fZ3VhcmRlZF9vYmogPSBudWxscHRyOwogICAgICAg dGhpcy0+X01fc3RvcmVfY29kZSgqX19ub2RlLCBfX2NvZGUpOwotICAgICAgY29uc3Qga2V5 X3R5cGUmIF9fayA9IF9FeHRyYWN0S2V5e30oX19ub2RlLT5fTV92KCkpOwotICAgICAgc2l6 ZV90eXBlIF9fYmt0ID0gX01fYnVja2V0X2luZGV4KF9fY29kZSk7CiAKLSAgICAgIC8vIEZp bmQgdGhlIG5vZGUgYmVmb3JlIGFuIGVxdWl2YWxlbnQgb25lIG9yIHVzZSBoaW50IGlmIGl0 IGV4aXN0cyBhbmQKLSAgICAgIC8vIGlmIGl0IGlzIGVxdWl2YWxlbnQuCi0gICAgICBfX25v ZGVfYmFzZV9wdHIgX19wcmV2Ci0JPSBfX2J1aWx0aW5fZXhwZWN0KF9faGludCAhPSBudWxs cHRyLCBmYWxzZSkKLQkgICYmIHRoaXMtPl9NX2VxdWFscyhfX2ssIF9fY29kZSwgKl9faGlu dCkKLQkgICAgPyBfX2hpbnQKLQkgICAgOiBfTV9maW5kX2JlZm9yZV9ub2RlKF9fYmt0LCBf X2ssIF9fY29kZSk7CisgICAgICBzaXplX3R5cGUgX19ia3Q7CisgICAgICBpZiAoIV9fcHJl dikKKwl7CisJICBfX2JrdCA9IF9NX2J1Y2tldF9pbmRleChfX2NvZGUpOworCSAgaWYgKF9f c2l6ZSA+IF9fc21hbGxfc2l6ZV90aHJlc2hvbGQoKSkKKwkgICAgX19wcmV2ID0gX01fZmlu ZF9iZWZvcmVfbm9kZShfX2JrdCwgX19rLCBfX2NvZGUpOworCX0KIAogICAgICAgaWYgKF9f cHJldikKIAl7CiAJICAvLyBJbnNlcnQgYWZ0ZXIgdGhlIG5vZGUgYmVmb3JlIHRoZSBlcXVp dmFsZW50IG9uZS4KIAkgIF9fbm9kZS0+X01fbnh0ID0gX19wcmV2LT5fTV9ueHQ7CiAJICBf X3ByZXYtPl9NX254dCA9IF9fbm9kZTsKLQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fcHJl diA9PSBfX2hpbnQsIGZhbHNlKSkKLQkgICAgLy8gaGludCBtaWdodCBiZSB0aGUgbGFzdCBi dWNrZXQgbm9kZSwgaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8KLQkgICAgLy8gdXBkYXRlIG5l eHQgYnVja2V0LgotCSAgICBpZiAoX19ub2RlLT5fTV9ueHQKLQkJJiYgIXRoaXMtPl9NX2Vx dWFscyhfX2ssIF9fY29kZSwgKl9fbm9kZS0+X01fbmV4dCgpKSkKLQkgICAgICB7Ci0JCXNp emVfdHlwZSBfX25leHRfYmt0ID0gX01fYnVja2V0X2luZGV4KCpfX25vZGUtPl9NX25leHQo KSk7Ci0JCWlmIChfX25leHRfYmt0ICE9IF9fYmt0KQotCQkgIF9NX2J1Y2tldHNbX19uZXh0 X2JrdF0gPSBfX25vZGU7Ci0JICAgICAgfQogCX0KICAgICAgIGVsc2UKIAkvLyBUaGUgaW5z ZXJ0ZWQgbm9kZSBoYXMgbm8gZXF1aXZhbGVudCBpbiB0aGUgaGFzaHRhYmxlLiBXZSBtdXN0 CiAJLy8gaW5zZXJ0IHRoZSBuZXcgbm9kZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWNr ZXQgdG8gcHJlc2VydmUKIAkvLyBlcXVpdmFsZW50IGVsZW1lbnRzJyByZWxhdGl2ZSBwb3Np dGlvbnMuCi0JX01faW5zZXJ0X2J1Y2tldF9iZWdpbihfX2JrdCwgX19ub2RlKTsKKwlfTV9p bnNlcnRfYnVja2V0X2JlZ2luKF9fbGFzdF9tZ3IsIF9fYmt0LCBfX25vZGUpOworCiAgICAg ICArK19NX2VsZW1lbnRfY291bnQ7CiAgICAgICByZXR1cm4gaXRlcmF0b3IoX19ub2RlKTsK ICAgICB9CkBAIC0yMzIzLDE1ICsyNTA3LDIxIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFD RV9WRVJTSU9OCiAgICAgICBhdXRvCiAgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwg X0FsbG9jLCBfRXh0cmFjdEtleSwgX0VxdWFsLAogCQkgX0hhc2gsIF9SYW5nZUhhc2gsIF9V bnVzZWQsIF9SZWhhc2hQb2xpY3ksIF9UcmFpdHM+OjoKLSAgICAgIF9NX2luc2VydF91bmlx dWUoX0t0JiYgX19rLCBfQXJnJiYgX192LAorICAgICAgX01faW5zZXJ0X3VuaXF1ZShfTGFz dE5vZGVNYW5hZ2VyJiBfX2xhc3RfbWdyLCBfS3QmJiBfX2ssIF9BcmcmJiBfX3YsCiAJCSAg ICAgICBfTm9kZUdlbmVyYXRvciYgX19ub2RlX2dlbikKICAgICAgIC0+IHBhaXI8aXRlcmF0 b3IsIGJvb2w+CiAgICAgICB7CiAJY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHNpemUoKTsK IAlpZiAoX19zaXplIDw9IF9fc21hbGxfc2l6ZV90aHJlc2hvbGQoKSkKLQkgIGZvciAoYXV0 byBfX2l0ID0gX01fYmVnaW4oKTsgX19pdDsgX19pdCA9IF9faXQtPl9NX25leHQoKSkKLQkg ICAgaWYgKHRoaXMtPl9NX2tleV9lcXVhbHNfdHIoX19rLCAqX19pdCkpCi0JICAgICAgcmV0 dXJuIHsgaXRlcmF0b3IoX19pdCksIGZhbHNlIH07CisJICB7CisJICAgIF9fbm9kZV9wdHIg X19sYXN0X24gPSBudWxscHRyOworCSAgICBmb3IgKGF1dG8gX19uID0gX01fYmVnaW4oKTsg X19uOworCQkgX19sYXN0X24gPSBfX24sIF9fbiA9IF9fbi0+X01fbmV4dCgpKQorCSAgICAg IGlmICh0aGlzLT5fTV9rZXlfZXF1YWxzX3RyKF9faywgKl9fbikpCisJCXJldHVybiB7IGl0 ZXJhdG9yKF9fbiksIGZhbHNlIH07CisKKwkgICAgX19sYXN0X21nci5fTV9zZXQoX19sYXN0 X24pOworCSAgfQogCiAJX19oYXNoX2NvZGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2Rl X3RyKF9fayk7CiAJc2l6ZV90eXBlIF9fYmt0ID0gX01fYnVja2V0X2luZGV4KF9fY29kZSk7 CkBAIC0yMzQ2LDggKzI1MzYsOSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lP TgogCQkJCSAgICAgX19ub2RlX2dlbiksCiAJICB0aGlzCiAJfTsKKwogCWF1dG8gX19wb3MK LQkgID0gX01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fYmt0LCBfX2NvZGUsIF9fbm9kZS5fTV9u b2RlKTsKKwkgID0gX01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fbGFzdF9tZ3IsIF9fYmt0LCBf X2NvZGUsIF9fbm9kZS5fTV9ub2RlKTsKIAlfX25vZGUuX01fbm9kZSA9IG51bGxwdHI7CiAJ cmV0dXJuIHsgX19wb3MsIHRydWUgfTsKICAgICAgIH0KQEAgLTIzNjEsMjAgKzI1NTIsMTUg QEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICAgIGF1dG8KICAgICAg IF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9FeHRyYWN0S2V5LCBfRXF1YWws CiAJCSBfSGFzaCwgX1JhbmdlSGFzaCwgX1VudXNlZCwgX1JlaGFzaFBvbGljeSwgX1RyYWl0 cz46OgotICAgICAgX01faW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgX0FyZyYmIF9f diwKLQkJX05vZGVHZW5lcmF0b3ImIF9fbm9kZV9nZW4sCi0JCWZhbHNlX3R5cGUgLyogX191 a3MgKi8pCisgICAgICBfTV9pbnNlcnQoX0xhc3ROb2RlTWFuYWdlciYgX19sYXN0X21nciwg X0FyZyYmIF9fdiwKKwkJX05vZGVHZW5lcmF0b3ImIF9fbm9kZV9nZW4sIGZhbHNlX3R5cGUg LyogX191a3MgKi8pCiAgICAgICAtPiBpdGVyYXRvcgogICAgICAgewogCS8vIEZpcnN0IGFs bG9jYXRlIG5ldyBub2RlIHNvIHRoYXQgd2UgZG9uJ3QgZG8gYW55dGhpbmcgaWYgaXQgdGhy b3dzLgotCV9TY29wZWRfbm9kZSBfX25vZGV7IF9fbm9kZV9nZW4oc3RkOjpmb3J3YXJkPF9B cmc+KF9fdikpLCB0aGlzIH07Ci0KLQkvLyBTZWNvbmQgY29tcHV0ZSB0aGUgaGFzaCBjb2Rl IHNvIHRoYXQgd2UgZG9uJ3QgcmVoYXNoIGlmIGl0IHRocm93cy4KLQlhdXRvIF9fcmVzID0g dGhpcy0+X01fY29tcHV0ZV9oYXNoX2NvZGUoCi0JICBfX2hpbnQuX01fY3VyLCBfRXh0cmFj dEtleXt9KF9fbm9kZS5fTV9ub2RlLT5fTV92KCkpKTsKKwlfU2NvcGVkX25vZGUgX19ub2Rl IHsgX19ub2RlX2dlbihzdGQ6OmZvcndhcmQ8X0FyZz4oX192KSksIHRoaXMgfTsKIAotCWF1 dG8gX19wb3MKLQkgID0gX01faW5zZXJ0X211bHRpX25vZGUoX19yZXMuZmlyc3QsIF9fcmVz LnNlY29uZCwgX19ub2RlLl9NX25vZGUpOworCWF1dG8gX19wb3MgPSBfTV9pbnNlcnRfbXVs dGlfbm9kZSgKKwkgIF9fbGFzdF9tZ3IsIF9FeHRyYWN0S2V5e30oX19ub2RlLl9NX25vZGUt Pl9NX3YoKSksIF9fbm9kZS5fTV9ub2RlKTsKIAlfX25vZGUuX01fbm9kZSA9IG51bGxwdHI7 CiAJcmV0dXJuIF9fcG9zOwogICAgICAgfQpAQCAtMjM4OCwxMCArMjU3NCwxMCBAQCBfR0xJ QkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAgX0hhc2h0YWJsZTxfS2V5LCBf VmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVhbCwKIAkJIF9IYXNoLCBfUmFuZ2VI YXNoLCBfVW51c2VkLCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6CiAgICAgICBfTV9pbnNl cnRfcmFuZ2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0 LAotCQkgICAgICBfTm9kZUdlbmVyYXRvciYgX19ub2RlX2dlbikKKwkJICAgICAgX0xhc3RO b2RlTWFuYWdlciYgX19sYXN0X21nciwgX05vZGVHZW5lcmF0b3ImIF9fbm9kZV9nZW4pCiAg ICAgICB7CiAJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCi0JICBfTV9p bnNlcnQoKl9fZmlyc3QsIF9fbm9kZV9nZW4sIF9fdW5pcXVlX2tleXN7fSk7CisJICBfTV9p bnNlcnQoX19sYXN0X21nciwgKl9fZmlyc3QsIF9fbm9kZV9nZW4sIF9fdW5pcXVlX2tleXN7 fSk7CiAgICAgICB9CiAKICAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1Zh bHVlLCB0eXBlbmFtZSBfQWxsb2MsCkBAIC0yNDM4LDcgKzI2MjQsNyBAQCBfR0xJQkNYWF9C RUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAgaXRlcmF0b3IgX19yZXN1bHQoX19uLT5f TV9uZXh0KCkpOwogICAgICAgdGhpcy0+X01fZGVhbGxvY2F0ZV9ub2RlKF9fbik7CiAgICAg ICAtLV9NX2VsZW1lbnRfY291bnQ7Ci0KKyAgICAgIF9NX2NoZWNrX2Zvcl9sYXN0KF9fcHJl dl9uKTsKICAgICAgIHJldHVybiBfX3Jlc3VsdDsKICAgICB9CiAKQEAgLTI1NDcsNyArMjcz Myw5IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJX01fcmVtb3ZlX2J1 Y2tldF9iZWdpbihfX2JrdCwgX19uX2xhc3QsIF9fbl9sYXN0X2JrdCk7CiAgICAgICBlbHNl IGlmIChfX25fbGFzdF9ia3QgIT0gX19ia3QpCiAJX01fYnVja2V0c1tfX25fbGFzdF9ia3Rd ID0gX19wcmV2X247CisKICAgICAgIF9fcHJldl9uLT5fTV9ueHQgPSBfX25fbGFzdDsKKyAg ICAgIF9NX2NoZWNrX2Zvcl9sYXN0KF9fcHJldl9uKTsKICAgICAgIHJldHVybiBfX3Jlc3Vs dDsKICAgICB9CiAKQEAgLTI1OTUsNiArMjc4Myw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVT UEFDRV9WRVJTSU9OCiAgICAgICBpZiAoX19uICYmIChfX25fYmt0ICE9IF9fYmt0IHx8IF9f aXNfYnVja2V0X2JlZ2luKSkKIAlfTV9idWNrZXRzW19fbl9ia3RdID0gX19wcmV2X247CiAg ICAgICBfX3ByZXZfbi0+X01fbnh0ID0gX19uOworICAgICAgX01fY2hlY2tfZm9yX2xhc3Qo X19wcmV2X24pOwogICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fbik7CiAgICAgfQogCkBAIC0y NjEyLDYgKzI4MDEsNyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCQkg ICAgICAgX01fYnVja2V0X2NvdW50ICogc2l6ZW9mKF9fbm9kZV9iYXNlX3B0cikpOwogICAg ICAgX01fZWxlbWVudF9jb3VudCA9IDA7CiAgICAgICBfTV9iZWZvcmVfYmVnaW4uX01fbnh0 ID0gbnVsbHB0cjsKKyAgICAgIF9NX3NldF9sYXN0KG51bGxwdHIpOwogICAgIH0KIAogICB0 ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9BbGxv YywKQEAgLTI2MjEsNyArMjgxMSw3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJT SU9OCiAgICAgdm9pZAogICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2MsIF9F eHRyYWN0S2V5LCBfRXF1YWwsCiAJICAgICAgIF9IYXNoLCBfUmFuZ2VIYXNoLCBfVW51c2Vk LCBfUmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6Ci0gICAgcmVoYXNoKHNpemVfdHlwZSBfX2Jr dF9jb3VudCkKKyAgICBfTV9yZWhhc2goX0xhc3ROb2RlTWFuYWdlciYgX19sYXN0X21nciwg c2l6ZV90eXBlIF9fYmt0X2NvdW50KQogICAgIHsKICAgICAgIF9fcmVoYXNoX2d1YXJkX3Qg X19yZWhhc2hfZ3VhcmQoX01fcmVoYXNoX3BvbGljeSk7CiAgICAgICBfX2JrdF9jb3VudApA QCAtMjYzMSw3ICsyODIxLDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04K IAogICAgICAgaWYgKF9fYmt0X2NvdW50ICE9IF9NX2J1Y2tldF9jb3VudCkKIAl7Ci0JICBf TV9yZWhhc2goX19ia3RfY291bnQsIF9fdW5pcXVlX2tleXN7fSk7CisJICBfTV9yZWhhc2go X19sYXN0X21nciwgX19ia3RfY291bnQsIF9fdW5pcXVlX2tleXN7fSk7CiAJICBfX3JlaGFz aF9ndWFyZC5fTV9ndWFyZGVkX29iaiA9IG51bGxwdHI7CiAJfQogICAgIH0KQEAgLTI2NDQs MzIgKzI4MzQsMjIgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICB2 b2lkCiAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXks IF9FcXVhbCwKIAkgICAgICAgX0hhc2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQsIF9SZWhhc2hQ b2xpY3ksIF9UcmFpdHM+OjoKLSAgICBfTV9yZWhhc2goc2l6ZV90eXBlIF9fYmt0X2NvdW50 LCB0cnVlX3R5cGUgLyogX191a3MgKi8pCisgICAgX01fcmVoYXNoKF9MYXN0Tm9kZU1hbmFn ZXImIF9fbGFzdF9tZ3IsCisJICAgICAgc2l6ZV90eXBlIF9fYmt0X2NvdW50LCB0cnVlX3R5 cGUgLyogX191a3MgKi8pCiAgICAgewotICAgICAgX19idWNrZXRzX3B0ciBfX25ld19idWNr ZXRzID0gX01fYWxsb2NhdGVfYnVja2V0cyhfX2JrdF9jb3VudCk7CiAgICAgICBfX25vZGVf cHRyIF9fcCA9IF9NX2JlZ2luKCk7CisgICAgICBfX25vZGVfYmFzZV9wdHIgX19iYmVnaW5f biA9ICZfTV9iZWZvcmVfYmVnaW47CisKKyAgICAgIF9fYnVja2V0c19wdHIgX19uZXdfYnVj a2V0cyA9IF9NX2FsbG9jYXRlX2J1Y2tldHMoX19ia3RfY291bnQpOwogICAgICAgX01fYmVm b3JlX2JlZ2luLl9NX254dCA9IG51bGxwdHI7Ci0gICAgICBzdGQ6OnNpemVfdCBfX2JiZWdp bl9ia3QgPSAwOworICAgICAgX19sYXN0X21nci5fTV9yZXNldCgpOwogICAgICAgd2hpbGUg KF9fcCkKIAl7CiAJICBfX25vZGVfcHRyIF9fbmV4dCA9IF9fcC0+X01fbmV4dCgpOwogCSAg c3RkOjpzaXplX3QgX19ia3QKIAkgICAgPSBfX2hhc2hfY29kZV9iYXNlOjpfTV9idWNrZXRf aW5kZXgoKl9fcCwgX19ia3RfY291bnQpOwotCSAgaWYgKCFfX25ld19idWNrZXRzW19fYmt0 XSkKLQkgICAgewotCSAgICAgIF9fcC0+X01fbnh0ID0gX01fYmVmb3JlX2JlZ2luLl9NX254 dDsKLQkgICAgICBfTV9iZWZvcmVfYmVnaW4uX01fbnh0ID0gX19wOwotCSAgICAgIF9fbmV3 X2J1Y2tldHNbX19ia3RdID0gJl9NX2JlZm9yZV9iZWdpbjsKLQkgICAgICBpZiAoX19wLT5f TV9ueHQpCi0JCV9fbmV3X2J1Y2tldHNbX19iYmVnaW5fYmt0XSA9IF9fcDsKLQkgICAgICBf X2JiZWdpbl9ia3QgPSBfX2JrdDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAg X19wLT5fTV9ueHQgPSBfX25ld19idWNrZXRzW19fYmt0XS0+X01fbnh0OwotCSAgICAgIF9f bmV3X2J1Y2tldHNbX19ia3RdLT5fTV9ueHQgPSBfX3A7Ci0JICAgIH0KLQorCSAgX1NfaW5z ZXJ0X2J1Y2tldF9iZWdpbihfX2xhc3RfbWdyLCBfX2JiZWdpbl9uLCBfX25ld19idWNrZXRz LAorCQkJCSBfX2JrdCwgX19wKTsKIAkgIF9fcCA9IF9fbmV4dDsKIAl9CiAKQEAgLTI2ODcs MTYgKzI4NjcsMTggQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICB2 b2lkCiAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXks IF9FcXVhbCwKIAkgICAgICAgX0hhc2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQsIF9SZWhhc2hQ b2xpY3ksIF9UcmFpdHM+OjoKLSAgICBfTV9yZWhhc2goc2l6ZV90eXBlIF9fYmt0X2NvdW50 LCBmYWxzZV90eXBlIC8qIF9fdWtzICovKQorICAgIF9NX3JlaGFzaChfTGFzdE5vZGVNYW5h Z2VyJiBfX2xhc3RfbWdyLAorCSAgICAgIHNpemVfdHlwZSBfX2JrdF9jb3VudCwgZmFsc2Vf dHlwZSAvKiBfX3VrcyAqLykKICAgICB7Ci0gICAgICBfX2J1Y2tldHNfcHRyIF9fbmV3X2J1 Y2tldHMgPSBfTV9hbGxvY2F0ZV9idWNrZXRzKF9fYmt0X2NvdW50KTsKICAgICAgIF9fbm9k ZV9wdHIgX19wID0gX01fYmVnaW4oKTsKLSAgICAgIF9NX2JlZm9yZV9iZWdpbi5fTV9ueHQg PSBudWxscHRyOwotICAgICAgc3RkOjpzaXplX3QgX19iYmVnaW5fYmt0ID0gMDsKKyAgICAg IF9fbm9kZV9iYXNlX3B0ciBfX2JiZWdpbl9uID0gJl9NX2JlZm9yZV9iZWdpbjsKICAgICAg IHN0ZDo6c2l6ZV90IF9fcHJldl9ia3QgPSAwOwogICAgICAgX19ub2RlX3B0ciBfX3ByZXZf cCA9IG51bGxwdHI7CiAgICAgICBib29sIF9fY2hlY2tfYnVja2V0ID0gZmFsc2U7CiAKKyAg ICAgIF9fYnVja2V0c19wdHIgX19uZXdfYnVja2V0cyA9IF9NX2FsbG9jYXRlX2J1Y2tldHMo X19ia3RfY291bnQpOworICAgICAgX01fYmVmb3JlX2JlZ2luLl9NX254dCA9IG51bGxwdHI7 CisgICAgICBfX2xhc3RfbWdyLl9NX3Jlc2V0KCk7CiAgICAgICB3aGlsZSAoX19wKQogCXsK IAkgIF9fbm9kZV9wdHIgX19uZXh0ID0gX19wLT5fTV9uZXh0KCk7CkBAIC0yNzExLDYgKzI4 OTMsOSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgICAgIF9fcC0+ X01fbnh0ID0gX19wcmV2X3AtPl9NX254dDsKIAkgICAgICBfX3ByZXZfcC0+X01fbnh0ID0g X19wOwogCisJICAgICAgaWYgKCFfX3AtPl9NX254dCkKKwkJX19sYXN0X21nci5fTV9zZXQo X19wKTsKKwogCSAgICAgIC8vIEluc2VydGluZyBhZnRlciBhIG5vZGUgaW4gYSBidWNrZXQg cmVxdWlyZSB0byBjaGVjayB0aGF0IHdlCiAJICAgICAgLy8gaGF2ZW4ndCBjaGFuZ2UgdGhl IGJ1Y2tldCBsYXN0IG5vZGUsIGluIHRoaXMgY2FzZSBuZXh0CiAJICAgICAgLy8gYnVja2V0 IGNvbnRhaW5pbmcgaXRzIGJlZm9yZSBiZWdpbiBub2RlIG11c3QgYmUgdXBkYXRlZC4gV2UK QEAgLTI3MjgsMjggKzI5MTMsMTcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJ T04KIAkJICAgIHsKIAkJICAgICAgc3RkOjpzaXplX3QgX19uZXh0X2JrdAogCQkJPSBfX2hh c2hfY29kZV9iYXNlOjpfTV9idWNrZXRfaW5kZXgoCi0JCQkgICpfX3ByZXZfcC0+X01fbmV4 dCgpLCBfX2JrdF9jb3VudCk7CisJCQkgICAgKl9fcHJldl9wLT5fTV9uZXh0KCksIF9fYmt0 X2NvdW50KTsKIAkJICAgICAgaWYgKF9fbmV4dF9ia3QgIT0gX19wcmV2X2JrdCkKIAkJCV9f bmV3X2J1Y2tldHNbX19uZXh0X2JrdF0gPSBfX3ByZXZfcDsKIAkJICAgIH0KIAkJICBfX2No ZWNrX2J1Y2tldCA9IGZhbHNlOwogCQl9CiAKLQkgICAgICBpZiAoIV9fbmV3X2J1Y2tldHNb X19ia3RdKQotCQl7Ci0JCSAgX19wLT5fTV9ueHQgPSBfTV9iZWZvcmVfYmVnaW4uX01fbnh0 OwotCQkgIF9NX2JlZm9yZV9iZWdpbi5fTV9ueHQgPSBfX3A7Ci0JCSAgX19uZXdfYnVja2V0 c1tfX2JrdF0gPSAmX01fYmVmb3JlX2JlZ2luOwotCQkgIGlmIChfX3AtPl9NX254dCkKLQkJ ICAgIF9fbmV3X2J1Y2tldHNbX19iYmVnaW5fYmt0XSA9IF9fcDsKLQkJICBfX2JiZWdpbl9i a3QgPSBfX2JrdDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIF9fcC0+X01fbnh0ID0g X19uZXdfYnVja2V0c1tfX2JrdF0tPl9NX254dDsKLQkJICBfX25ld19idWNrZXRzW19fYmt0 XS0+X01fbnh0ID0gX19wOwotCQl9CisJICAgICAgX1NfaW5zZXJ0X2J1Y2tldF9iZWdpbihf X2xhc3RfbWdyLCBfX2JiZWdpbl9uLCBfX25ld19idWNrZXRzLAorCQkJCSAgICAgX19ia3Qs IF9fcCk7CiAJICAgIH0KKwogCSAgX19wcmV2X3AgPSBfX3A7CiAJICBfX3ByZXZfYmt0ID0g X19ia3Q7CiAJICBfX3AgPSBfX25leHQ7CmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvaW5j bHVkZS9iaXRzL2hhc2h0YWJsZV9wb2xpY3kuaCBiL2xpYnN0ZGMrKy12My9pbmNsdWRlL2Jp dHMvaGFzaHRhYmxlX3BvbGljeS5oCmluZGV4IDlmNzc1NTIyY2ZmLi42OWVmODRhZDUxOSAx MDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9oYXNodGFibGVfcG9saWN5 LmgKKysrIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9oYXNodGFibGVfcG9saWN5LmgK QEAgLTg0OCw4ICs4NDgsOSBAQCBuYW1lc3BhY2UgX19kZXRhaWwKIAlzdGQ6OnR1cGxlPGNv bnN0IGtleV90eXBlJj4oX19rKSwKIAlzdGQ6OnR1cGxlPD4oKQogICAgICAgfTsKLSAgICAg IGF1dG8gX19wb3MKLQk9IF9faC0+X01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fYmt0LCBfX2Nv ZGUsIF9fbm9kZS5fTV9ub2RlKTsKKyAgICAgIGF1dG8gX19sYXN0X21nciA9IF9faC0+X01f Z2V0X2xhc3Rfbm9kZV9tZ3IoKTsKKyAgICAgIGF1dG8gX19wb3MgPSAgX19oLT5fTV9pbnNl cnRfdW5pcXVlX25vZGUoX19sYXN0X21nciwgX19ia3QsIF9fY29kZSwKKwkJCQkJICAgICAg IF9fbm9kZS5fTV9ub2RlKTsKICAgICAgIF9fbm9kZS5fTV9ub2RlID0gbnVsbHB0cjsKICAg ICAgIHJldHVybiBfX3Bvcy0+c2Vjb25kOwogICAgIH0KQEAgLTg3NSw4ICs4NzYsOSBAQCBu YW1lc3BhY2UgX19kZXRhaWwKIAlzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjptb3ZlKF9f aykpLAogCXN0ZDo6dHVwbGU8PigpCiAgICAgICB9OwotICAgICAgYXV0byBfX3BvcwotCT0g X19oLT5fTV9pbnNlcnRfdW5pcXVlX25vZGUoX19ia3QsIF9fY29kZSwgX19ub2RlLl9NX25v ZGUpOworICAgICAgYXV0byBfX2xhc3RfbWdyID0gX19oLT5fTV9nZXRfbGFzdF9ub2RlX21n cigpOworICAgICAgYXV0byBfX3BvcyA9IF9faC0+X01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9f bGFzdF9tZ3IsIF9fYmt0LCBfX2NvZGUsCisJCQkJCSAgICAgIF9fbm9kZS5fTV9ub2RlKTsK ICAgICAgIF9fbm9kZS5fTV9ub2RlID0gbnVsbHB0cjsKICAgICAgIHJldHVybiBfX3Bvcy0+ c2Vjb25kOwogICAgIH0KQEAgLTk2NCwxMyArOTY2LDE0IEBAIG5hbWVzcGFjZSBfX2RldGFp bAogICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgY29uc3QgdmFsdWVfdHlw ZSYgX192KQogICAgICAgewogCV9faGFzaHRhYmxlJiBfX2ggPSBfTV9jb25qdXJlX2hhc2h0 YWJsZSgpOwotCV9fbm9kZV9nZW5fdHlwZSBfX25vZGVfZ2VuKF9faCk7CQotCXJldHVybiBf X2guX01faW5zZXJ0KF9faGludCwgX192LCBfX25vZGVfZ2VuLCBfX3VuaXF1ZV9rZXlze30p OworCWF1dG8gX19sYXN0X21nciA9IF9faC5fTV9nZXRfbGFzdF9ub2RlX21ncihfX2hpbnQu X01fY3VyKTsKKwlfX25vZGVfZ2VuX3R5cGUgX19ub2RlX2dlbihfX2gpOworCXJldHVybiBf X2guX01faW5zZXJ0KF9fbGFzdF9tZ3IsIF9fdiwgX19ub2RlX2dlbiwgX191bmlxdWVfa2V5 c3t9KTsKICAgICAgIH0KIAogICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0tUeXBlLCB0eXBl bmFtZS4uLiBfQXJncz4KIAlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+Ci0JdHJ5X2VtcGxh Y2UoY29uc3RfaXRlcmF0b3IsIF9LVHlwZSYmIF9faywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJ dHJ5X2VtcGxhY2UoY29uc3RfaXRlcmF0b3IgX19oaW50LCBfS1R5cGUmJiBfX2ssIF9Bcmdz JiYuLi4gX19hcmdzKQogCXsKIAkgIF9faGFzaHRhYmxlJiBfX2ggPSBfTV9jb25qdXJlX2hh c2h0YWJsZSgpOwogCSAgYXV0byBfX2NvZGUgPSBfX2guX01faGFzaF9jb2RlKF9fayk7CkBA IC05ODQsOCArOTg3LDkgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAJICAgIHN0ZDo6Zm9yd2Fy ZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0tUeXBlPihfX2spKSwKIAkgICAgc3RkOjpmb3J3 YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikKIAkgICAgfTsK LQkgIGF1dG8gX19pdAotCSAgICA9IF9faC5fTV9pbnNlcnRfdW5pcXVlX25vZGUoX19ia3Qs IF9fY29kZSwgX19ub2RlLl9NX25vZGUpOworCSAgYXV0byBfX2xhc3RfbWdyID0gX19oLl9N X2dldF9sYXN0X25vZGVfbWdyKF9faGludC5fTV9jdXIpOworCSAgYXV0byBfX2l0ID0gX19o Ll9NX2luc2VydF91bmlxdWVfbm9kZShfX2xhc3RfbWdyLCBfX2JrdCwgX19jb2RlLAorCQkJ CQkJX19ub2RlLl9NX25vZGUpOwogCSAgX19ub2RlLl9NX25vZGUgPSBudWxscHRyOwogCSAg cmV0dXJuIHsgX19pdCwgdHJ1ZSB9OwogCX0KQEAgLTEwMTMsOCArMTAxNyw5IEBAIG5hbWVz cGFjZSBfX2RldGFpbAogCQkgICAgICB0cnVlX3R5cGUgLyogX191a3MgKi8pCiAgICAgICB7 CiAJX19oYXNodGFibGUmIF9faCA9IF9NX2Nvbmp1cmVfaGFzaHRhYmxlKCk7CisJYXV0byBf X2xhc3RfbWdyID0gX19oLl9NX2dldF9sYXN0X25vZGVfbWdyKCk7CiAJX19ub2RlX2dlbl90 eXBlIF9fbm9kZV9nZW4oX19oKTsKLQlfX2guX01faW5zZXJ0X3JhbmdlKF9fZmlyc3QsIF9f bGFzdCwgX19ub2RlX2dlbik7CisJX19oLl9NX2luc2VydF9yYW5nZShfX2ZpcnN0LCBfX2xh c3QsIF9fbGFzdF9tZ3IsIF9fbm9kZV9nZW4pOwogICAgICAgfQogCiAgIHRlbXBsYXRlPHR5 cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jLApAQCAtMTAz Nyw2ICsxMDQyLDcgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAJICByZXR1cm47CiAKIAlfX2hh c2h0YWJsZSYgX19oID0gX01fY29uanVyZV9oYXNodGFibGUoKTsKKwlhdXRvIF9fbGFzdF9t Z3IgPSBfX2guX01fZ2V0X2xhc3Rfbm9kZV9tZ3IoKTsKIAlfX3JlaGFzaF9ndWFyZF90IF9f cmVoYXNoX2d1YXJkKF9faC5fTV9yZWhhc2hfcG9saWN5KTsKIAlfX3BhaXJfdHlwZSBfX2Rv X3JlaGFzaAogCSAgPSBfX2guX01fcmVoYXNoX3BvbGljeS5fTV9uZWVkX3JlaGFzaChfX2gu X01fYnVja2V0X2NvdW50LApAQCAtMTA0NCwxMSArMTA1MCwxMSBAQCBuYW1lc3BhY2UgX19k ZXRhaWwKIAkJCQkJCV9fbl9lbHQpOwogCiAJaWYgKF9fZG9fcmVoYXNoLmZpcnN0KQotCSAg X19oLl9NX3JlaGFzaChfX2RvX3JlaGFzaC5zZWNvbmQsIF9fdWtzKTsKKwkgIF9faC5fTV9y ZWhhc2goX19sYXN0X21nciwgX19kb19yZWhhc2guc2Vjb25kLCBfX3Vrcyk7CiAKIAlfX3Jl aGFzaF9ndWFyZC5fTV9ndWFyZGVkX29iaiA9IG51bGxwdHI7CiAJX19ub2RlX2dlbl90eXBl IF9fbm9kZV9nZW4oX19oKTsKLQlfX2guX01faW5zZXJ0X3JhbmdlKF9fZmlyc3QsIF9fbGFz dCwgX19ub2RlX2dlbik7CisJX19oLl9NX2luc2VydF9yYW5nZShfX2ZpcnN0LCBfX2xhc3Qs IF9fbGFzdF9tZ3IsIF9fbm9kZV9nZW4pOwogICAgICAgfQogCiAgIC8qKgpAQCAtMTEwMiw4 ICsxMTA4LDkgQEAgbmFtZXNwYWNlIF9fZGV0YWlsCiAgICAgICBpbnNlcnQoY29uc3RfaXRl cmF0b3IgX19oaW50LCB2YWx1ZV90eXBlJiYgX192KQogICAgICAgewogCV9faGFzaHRhYmxl JiBfX2ggPSB0aGlzLT5fTV9jb25qdXJlX2hhc2h0YWJsZSgpOworCWF1dG8gX19sYXN0X21n ciA9IF9faC5fTV9nZXRfbGFzdF9ub2RlX21ncihfX2hpbnQuX01fY3VyKTsKIAlfX25vZGVf Z2VuX3R5cGUgX19ub2RlX2dlbihfX2gpOwotCXJldHVybiBfX2guX01faW5zZXJ0KF9faGlu dCwgc3RkOjptb3ZlKF9fdiksIF9fbm9kZV9nZW4sCisJcmV0dXJuIF9faC5fTV9pbnNlcnQo X19sYXN0X21nciwgc3RkOjptb3ZlKF9fdiksIF9fbm9kZV9nZW4sCiAJCQkgICAgIF9fdW5p cXVlX2tleXN7fSk7CiAgICAgICB9CiAgICAgfTsKQEAgLTExNTMsNyArMTE2MCw4IEBAIG5h bWVzcGFjZSBfX2RldGFpbAogCWluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIF9QYWly JiYgX192KQogCXsKIAkgIF9faGFzaHRhYmxlJiBfX2ggPSB0aGlzLT5fTV9jb25qdXJlX2hh c2h0YWJsZSgpOwotCSAgcmV0dXJuIF9faC5fTV9lbXBsYWNlKF9faGludCwgX191bmlxdWVf a2V5c3t9LAorCSAgYXV0byBfX2xhc3RfbWdyID0gX19oLl9NX2dldF9sYXN0X25vZGVfbWdy KF9faGludC5fTV9jdXIpOworCSAgcmV0dXJuIF9faC5fTV9lbXBsYWNlKF9fbGFzdF9tZ3Is IF9fdW5pcXVlX2tleXN7fSwKIAkJCQlzdGQ6OmZvcndhcmQ8X1BhaXI+KF9fdikpOwogCX0K ICAgIH07CmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3Vub3JkZXJl ZF9tYXAuaCBiL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvdW5vcmRlcmVkX21hcC5oCmlu ZGV4IDFjOTlhODNiYzFlLi5lNWRmOTdjOTIyOSAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYz L2luY2x1ZGUvYml0cy91bm9yZGVyZWRfbWFwLmgKKysrIGIvbGlic3RkYysrLXYzL2luY2x1 ZGUvYml0cy91bm9yZGVyZWRfbWFwLmgKQEAgLTQ0MywxMiArNDQzLDEyIEBAIF9HTElCQ1hY X0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKICAgICAgIC8vLyBSZS1pbnNlcnQgYW4gZXh0 cmFjdGVkIG5vZGUuCiAgICAgICBpbnNlcnRfcmV0dXJuX3R5cGUKICAgICAgIGluc2VydChu b2RlX3R5cGUmJiBfX25oKQotICAgICAgeyByZXR1cm4gX01faC5fTV9yZWluc2VydF9ub2Rl KHN0ZDo6bW92ZShfX25oKSk7IH0KKyAgICAgIHsgcmV0dXJuIF9NX2guX01fcmVpbnNlcnRf bm9kZShjZW5kKCksIHN0ZDo6bW92ZShfX25oKSk7IH0KIAogICAgICAgLy8vIFJlLWluc2Vy dCBhbiBleHRyYWN0ZWQgbm9kZS4KICAgICAgIGl0ZXJhdG9yCi0gICAgICBpbnNlcnQoY29u c3RfaXRlcmF0b3IsIG5vZGVfdHlwZSYmIF9fbmgpCi0gICAgICB7IHJldHVybiBfTV9oLl9N X3JlaW5zZXJ0X25vZGUoc3RkOjptb3ZlKF9fbmgpKS5wb3NpdGlvbjsgfQorICAgICAgaW5z ZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgbm9kZV90eXBlJiYgX19uaCkKKyAgICAgIHsg cmV0dXJuIF9NX2guX01fcmVpbnNlcnRfbm9kZShfX2hpbnQsIHN0ZDo6bW92ZShfX25oKSku cG9zaXRpb247IH0KICNlbmRpZiAvLyBDKysxNwogCiAjaWZkZWYgX19nbGliY3h4X3Vub3Jk ZXJlZF9tYXBfdHJ5X2VtcGxhY2UgLy8gQysrID49IDE3ICYmIEhPU1RFRApkaWZmIC0tZ2l0 IGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy91bm9yZGVyZWRfc2V0LmggYi9saWJzdGRj KystdjMvaW5jbHVkZS9iaXRzL3Vub3JkZXJlZF9zZXQuaAppbmRleCBmM2IwYzA3OGJhYS4u OTE1Y2Q0ZmI3MDAgMTAwNjQ0Ci0tLSBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvdW5v cmRlcmVkX3NldC5oCisrKyBiL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvdW5vcmRlcmVk X3NldC5oCkBAIC01MDQsMTIgKzUwNCwxMiBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0Vf Q09OVEFJTkVSCiAgICAgICAvLy8gUmUtaW5zZXJ0IGFuIGV4dHJhY3RlZCBub2RlLgogICAg ICAgaW5zZXJ0X3JldHVybl90eXBlCiAgICAgICBpbnNlcnQobm9kZV90eXBlJiYgX19uaCkK LSAgICAgIHsgcmV0dXJuIF9NX2guX01fcmVpbnNlcnRfbm9kZShzdGQ6Om1vdmUoX19uaCkp OyB9CisgICAgICB7IHJldHVybiBfTV9oLl9NX3JlaW5zZXJ0X25vZGUoY2VuZCgpLCBzdGQ6 Om1vdmUoX19uaCkpOyB9CiAKICAgICAgIC8vLyBSZS1pbnNlcnQgYW4gZXh0cmFjdGVkIG5v ZGUuCiAgICAgICBpdGVyYXRvcgotICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yLCBub2Rl X3R5cGUmJiBfX25oKQotICAgICAgeyByZXR1cm4gX01faC5fTV9yZWluc2VydF9ub2RlKHN0 ZDo6bW92ZShfX25oKSkucG9zaXRpb247IH0KKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRv ciBfX2hpbnQsIG5vZGVfdHlwZSYmIF9fbmgpCisgICAgICB7IHJldHVybiBfTV9oLl9NX3Jl aW5zZXJ0X25vZGUoX19oaW50LCBzdGQ6Om1vdmUoX19uaCkpLnBvc2l0aW9uOyB9CiAjZW5k aWYgLy8gQysrMTcKIAogICAgICAgLy8vQHsKZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My90 ZXN0c3VpdGUvMjNfY29udGFpbmVycy91bm9yZGVyZWRfbWFwL2NvbnNpc3RlbmN5X2NoZWNr LmNjIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL3Vub3JkZXJlZF9t YXAvY29uc2lzdGVuY3lfY2hlY2suY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAuLmJhYzM3YzM5YTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGlic3RkYysrLXYz L3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL3Vub3JkZXJlZF9tYXAvY29uc2lzdGVuY3lfY2hl Y2suY2MKQEAgLTAsMCArMSwxMDggQEAKKy8vIHsgZGctZG8gcnVuIHsgdGFyZ2V0IGMrKzEx IH0gfQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVk ZSA8dmVjdG9yPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDx0ZXN0 c3VpdGVfaG9va3MuaD4KKworbmFtZXNwYWNlCit7CisgIGNvbnN0IGludCBuYl9lbGVtZW50 cyA9IDIwMDA7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0VsZW1UeXBlPgorICB2b2lkIGNo ZWNrKGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxfRWxlbVR5cGUsIGludD4mIHVzKQorICAg IHsKKyAgICAgIFZFUklGWSggc3RkOjpkaXN0YW5jZSh1cy5iZWdpbigpLCB1cy5lbmQoKSkg PT0gdXMuc2l6ZSgpICk7CisgICAgICBzdGQ6OnNpemVfdCBia3RfZWxlbXNfY291bnQgPSAw OworICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSAhPSB1cy5idWNrZXRfY291bnQo KTsgKytpKQorCXsKKwkgIGlmICh1cy5idWNrZXRfc2l6ZShpKSA9PSAwKQorCSAgICBjb250 aW51ZTsKKworCSAgYmt0X2VsZW1zX2NvdW50ICs9IHVzLmJ1Y2tldF9zaXplKGkpOworCSAg Zm9yIChhdXRvIGxpdCA9IHVzLmJlZ2luKGkpOyBsaXQgIT0gdXMuZW5kKGkpOyArK2xpdCkK KwkgICAgeworCSAgICAgIFZFUklGWSggdXMuYnVja2V0KGxpdC0+Zmlyc3QpID09IGkgKTsK KwkgICAgfQorCX0KKworICAgICAgVkVSSUZZKCBia3RfZWxlbXNfY291bnQgPT0gdXMuc2l6 ZSgpICk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FbGVtVHlwZT4KKyAgICB2 b2lkIHJ1bihjb25zdCBzdGQ6OnZlY3RvcjxfRWxlbVR5cGU+JiBlbGVtcywgYm9vbCB3aXRo X2NvcHkpCisgICAgeworICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPF9FbGVtVHlwZSwgaW50 PiB1bTsKKyAgICAgIGNoZWNrKHVtKTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0g bmJfZWxlbWVudHM7ICsraSkKKwl7CisJICB1bS5pbnNlcnQoeyBlbGVtc1tpXSwgaSB9KTsK KwkgIGNoZWNrKHVtKTsKKwl9CisKKyAgICAgIGlmICh3aXRoX2NvcHkpCisJeworCSAgc3Rk Ojp1bm9yZGVyZWRfbWFwPF9FbGVtVHlwZSwgaW50Pih1bSkuc3dhcCh1bSk7CisJICBjaGVj ayh1bSk7CisJfQorCisgICAgICBmb3IgKGludCBpID0gbmJfZWxlbWVudHMgLSAxOyBpID49 IDA7IC0taSkKKwl7CisJICBhdXRvIGl0ID0gdW0uZmluZChlbGVtc1tpXSk7CisJICBpZiAo aXQgIT0gdW0uZW5kKCkpCisJICAgIHsKKwkgICAgICB1bS5lcmFzZShpdCk7CisJICAgICAg Y2hlY2sodW0pOworCSAgICB9CisJfQorCisgICAgICB1bS5pbnNlcnQoeyBlbGVtc1swXSwg MCB9KTsKKyAgICAgIGNoZWNrKHVtKTsKKworICAgICAgZm9yIChpbnQgaSA9IG5iX2VsZW1l bnRzIC0gMTsgaSA+PSAwOyAtLWkpCisJeworCSAgdW0uaW5zZXJ0KHsgZWxlbXNbaV0sIGkg fSk7CisJICBjaGVjayh1bSk7CisJfQorCisgICAgICBmb3IgKGludCBqID0gbmJfZWxlbWVu dHMgLSAxOyBqID49IDA7IC0taikKKwl7CisJICB1bS5lcmFzZShlbGVtc1tqXSk7CisJICBj aGVjayh1bSk7CisJfQorICAgIH0KK30KKworaW50IG1haW4oKQoreworICB7CisgICAgc3Rk Ojp2ZWN0b3I8aW50PiBlbGVtczsKKyAgICBlbGVtcy5yZXNlcnZlKG5iX2VsZW1lbnRzKTsK KyAgICBmb3IgKGludCBpID0gMDsgaSAhPSBuYl9lbGVtZW50czsgKytpKQorICAgICAgZWxl bXMucHVzaF9iYWNrKGkpOworCisgICAgcnVuKGVsZW1zLCBmYWxzZSk7CisgICAgcnVuKGVs ZW1zLCB0cnVlKTsKKyAgfQorCisgIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4g ZWxlbXM7CisgICAgeworICAgICAgZWxlbXMucmVzZXJ2ZShuYl9lbGVtZW50cyk7CisgICAg ICBmb3IgKGludCBpID0gMDsgaSAhPSBuYl9lbGVtZW50czsgKytpKQorCXsKKwkgIHN0ZDo6 b3N0cmluZ3N0cmVhbSBvc3RyOworCSAgb3N0ciA8PCAic3RyaW5nICMiIDw8IGkgPDwgJyAn IDw8IHN0ZDo6c3RyaW5nKDEwMDAsICdhJyArIGkpOworCSAgZWxlbXMucHVzaF9iYWNrKG9z dHIuc3RyKCkpOworCX0KKyAgICB9CisKKyAgICBydW4oZWxlbXMsIGZhbHNlKTsKKyAgICBy dW4oZWxlbXMsIHRydWUpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9s aWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRlcmVkX211bHRpbWFw L2NvbnNpc3RlbmN5X2NoZWNrLmNjIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250 YWluZXJzL3Vub3JkZXJlZF9tdWx0aW1hcC9jb25zaXN0ZW5jeV9jaGVjay5jYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYzRmMjY1NTNkOGEKLS0tIC9kZXYv bnVsbAorKysgYi9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRl cmVkX211bHRpbWFwL2NvbnNpc3RlbmN5X2NoZWNrLmNjCkBAIC0wLDAgKzEsMTExIEBACisv LyB7IGRnLWRvIHJ1biB7IHRhcmdldCBjKysxMSB9IH0KKworI2luY2x1ZGUgPHN0cmluZz4K KyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1bm9y ZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8dGVzdHN1aXRlX2hvb2tzLmg+CisKK25hbWVzcGFj ZQoreworICBjb25zdCBpbnQgbmJfZWxlbWVudHMgPSAxMDAwOworICBjb25zdCBpbnQgbmJf Y29waWVzID0gNTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRWxlbVR5cGU+CisgIHZvaWQg Y2hlY2soY29uc3Qgc3RkOjp1bm9yZGVyZWRfbXVsdGltYXA8X0VsZW1UeXBlLCBpbnQ+JiB1 bSkKKyAgICB7CisgICAgICBWRVJJRlkoIHN0ZDo6ZGlzdGFuY2UodW0uYmVnaW4oKSwgdW0u ZW5kKCkpID09IHVtLnNpemUoKSApOworICAgICAgc3RkOjpzaXplX3QgYmt0X2VsZW1zX2Nv dW50ID0gMDsKKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gdW0uYnVja2V0 X2NvdW50KCk7ICsraSkKKwl7CisJICBpZiAodW0uYnVja2V0X3NpemUoaSkgPT0gMCkKKwkg ICAgY29udGludWU7CisKKwkgIGJrdF9lbGVtc19jb3VudCArPSB1bS5idWNrZXRfc2l6ZShp KTsKKwkgIGZvciAoYXV0byBsaXQgPSB1bS5iZWdpbihpKTsgbGl0ICE9IHVtLmVuZChpKTsg KytsaXQpCisJICAgIHsKKwkgICAgICBWRVJJRlkoIHVtLmJ1Y2tldChsaXQtPmZpcnN0KSA9 PSBpICk7CisJICAgIH0KKwl9CisKKyAgICAgIFZFUklGWSggYmt0X2VsZW1zX2NvdW50ID09 IHVtLnNpemUoKSApOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRWxlbVR5cGU+ CisgICAgdm9pZCBydW4oY29uc3Qgc3RkOjp2ZWN0b3I8X0VsZW1UeXBlPiYgZWxlbXMsIGJv b2wgd2l0aF9jb3B5KQorICAgIHsKKyAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPF9F bGVtVHlwZSwgaW50PiB1bTsKKyAgICAgIHVtLm1heF9sb2FkX2ZhY3RvcihuYl9jb3BpZXMp OworICAgICAgY2hlY2sodW0pOworCisgICAgICBmb3IgKGludCBoID0gMDsgaCAhPSBuYl9j b3BpZXM7ICsraCkKKwlmb3IgKGludCBpID0gMDsgaSAhPSBuYl9lbGVtZW50czsgKytpKQor CSAgeworCSAgICB1bS5pbnNlcnQoeyBlbGVtc1tpXSwgaSArIGkgKiBoIH0pOworCSAgICBj aGVjayh1bSk7CisJICB9CisKKyAgICAgIGlmICh3aXRoX2NvcHkpCisJeworCSAgc3RkOjp1 bm9yZGVyZWRfbXVsdGltYXA8X0VsZW1UeXBlLCBpbnQ+KHVtKS5zd2FwKHVtKTsKKwkgIGNo ZWNrKHVtKTsKKwl9CisKKyAgICAgIGZvciAoaW50IGkgPSBuYl9lbGVtZW50cyAtIDE7IGkg Pj0gMDsgLS1pKQorCXsKKwkgIGF1dG8gaXQgPSB1bS5maW5kKGVsZW1zW2ldKTsKKwkgIGlm IChpdCAhPSB1bS5lbmQoKSkKKwkgICAgeworCSAgICAgIHVtLmVyYXNlKGl0KTsKKwkgICAg ICBjaGVjayh1bSk7CisJICAgIH0KKwl9CisKKyAgICAgIHVtLmluc2VydCh7IGVsZW1zWzBd LCAwIH0pOworICAgICAgY2hlY2sodW0pOworCisgICAgICBmb3IgKGludCBpID0gbmJfZWxl bWVudHMgLSAxOyBpID49IDA7IC0taSkKKwl7CisJICB1bS5pbnNlcnQoeyBlbGVtc1tpXSwg aSB9KTsKKwkgIGNoZWNrKHVtKTsKKwl9CisKKyAgICAgIGZvciAoaW50IGogPSBuYl9lbGVt ZW50cyAtIDE7IGogPj0gMDsgLS1qKQorCXsKKwkgIHVtLmVyYXNlKGVsZW1zW2pdKTsKKwkg IGNoZWNrKHVtKTsKKwl9CisgICAgfQorfQorCitpbnQgbWFpbigpCit7CisgIHsKKyAgICBz dGQ6OnZlY3RvcjxpbnQ+IGVsZW1zOworICAgIGVsZW1zLnJlc2VydmUobmJfZWxlbWVudHMp OworICAgIGZvciAoaW50IGkgPSAwOyBpICE9IG5iX2VsZW1lbnRzOyArK2kpCisgICAgICBl bGVtcy5wdXNoX2JhY2soaSk7CisKKyAgICBydW4oZWxlbXMsIGZhbHNlKTsKKyAgICBydW4o ZWxlbXMsIHRydWUpOworICB9CisKKyAgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5n PiBlbGVtczsKKyAgICB7CisgICAgICBlbGVtcy5yZXNlcnZlKG5iX2VsZW1lbnRzKTsKKyAg ICAgIGZvciAoaW50IGkgPSAwOyBpICE9IG5iX2VsZW1lbnRzOyArK2kpCisJeworCSAgc3Rk Ojpvc3RyaW5nc3RyZWFtIG9zdHI7CisJICBvc3RyIDw8ICJzdHJpbmcgIyIgPDwgaSA8PCAn ICcgPDwgc3RkOjpzdHJpbmcoMTAwMCwgJ2EnICsgaSk7CisJICBlbGVtcy5wdXNoX2JhY2so b3N0ci5zdHIoKSk7CisJfQorICAgIH0KKworICAgIHJ1bihlbGVtcywgZmFsc2UpOworICAg IHJ1bihlbGVtcywgdHJ1ZSk7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBh L2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy91bm9yZGVyZWRfbXVsdGlt YXAvaW5zZXJ0L2hpbnQuY2MgYi9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5l cnMvdW5vcmRlcmVkX211bHRpbWFwL2luc2VydC9oaW50LmNjCmluZGV4IGQwZWQ2MGM2Nzk5 Li4xZGI3MWI4ZjMwYiAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19j b250YWluZXJzL3Vub3JkZXJlZF9tdWx0aW1hcC9pbnNlcnQvaGludC5jYworKysgYi9saWJz dGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRlcmVkX211bHRpbWFwL2lu c2VydC9oaW50LmNjCkBAIC00MCwxMSArNDAsMTIgQEAgdm9pZCB0ZXN0MDEoKQogICBWRVJJ RlkoIGl0MiAhPSBtLmVuZCgpICk7CiAgIFZFUklGWSggaXQyICE9IGl0MSApOwogICBWRVJJ RlkoIGl0Mi0+c2Vjb25kID09IDIgKTsKLSAgVkVSSUZZKCBpdDIgPT0gc3RkOjpuZXh0KGl0 MSkgKTsKKyAgVkVSSUZZKCBzdGQ6Om5leHQoaXQyKSA9PSBpdDEgKTsKIAorICBpdDEgPSBp dDI7CiAgIFBhaXIgcCgwLCAxKTsKICAgaXQyID0gbS5pbnNlcnQoaXQxLCBwKTsKLSAgVkVS SUZZKCBpdDIgPT0gc3RkOjpuZXh0KGl0MSkgKTsKKyAgVkVSSUZZKCBzdGQ6Om5leHQoaXQy KSA9PSBpdDEgKTsKIH0KIAogc3RydWN0IGhhc2hlcgpAQCAtNzEsMTMgKzcyLDEzIEBAIHZv aWQgdGVzdDAyKCkKICAgVkVSSUZZKCBtLmJ1Y2tldF9zaXplKG0uYnVja2V0KGl0My0+Zmly c3QpKSA9PSAxICk7CiAKICAgYXV0byBpdDQgPSBtLmluc2VydChpdDEsIFBhaXIoMCwgMSkp OwotICBWRVJJRlkoIGl0NCA9PSBzdGQ6Om5leHQoaXQxKSApOworICBWRVJJRlkoIHN0ZDo6 bmV4dChpdDQpID09IGl0MSApOwogICBWRVJJRlkoIG0uYnVja2V0X3NpemUobS5idWNrZXQo aXQxLT5maXJzdCkpID09IDMgKTsKICAgVkVSSUZZKCBtLmJ1Y2tldF9zaXplKG0uYnVja2V0 KGl0My0+Zmlyc3QpKSA9PSAxICk7CiAKICAgUGFpciBwKDEsIDEpOwogICBpdDQgPSBtLmlu c2VydChpdDIsIHApOwotICBWRVJJRlkoIGl0NCA9PSBzdGQ6Om5leHQoaXQyKSApOworICBW RVJJRlkoIHN0ZDo6bmV4dChpdDQpID09IGl0MiApOwogICBWRVJJRlkoIG0uYnVja2V0X3Np emUobS5idWNrZXQoaXQxLT5maXJzdCkpID09IDQgKTsKICAgYXV0byByYW5nZSA9IG0uZXF1 YWxfcmFuZ2UoMCk7CiAgIFZFUklGWSggc3RkOjpkaXN0YW5jZShyYW5nZS5maXJzdCwgcmFu Z2Uuc2Vjb25kKSA9PSAyICk7CkBAIC0xMDQsMTEgKzEwNSwxMiBAQCB2b2lkIHRlc3QwMygp CiAgIFZFUklGWSggaXQyICE9IG0uZW5kKCkgKTsKICAgVkVSSUZZKCBpdDIgIT0gaXQxICk7 CiAgIFZFUklGWSggaXQyLT5zZWNvbmQgPT0gMiApOwotICBWRVJJRlkoIGl0MiA9PSBzdGQ6 Om5leHQoaXQxKSApOworICBWRVJJRlkoIHN0ZDo6bmV4dChpdDIpID09IGl0MSApOwogCisg IGl0MSA9IGl0MjsKICAgUGFpciBwKDAsIDEpOwogICBpdDIgPSBtLmVtcGxhY2VfaGludChp dDEsIHApOwotICBWRVJJRlkoIGl0MiA9PSBzdGQ6Om5leHQoaXQxKSApOworICBWRVJJRlko IHN0ZDo6bmV4dChpdDIpID09IGl0MSApOwogfQogCiBpbnQgbWFpbigpCmRpZmYgLS1naXQg YS9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRlcmVkX211bHRp c2V0L2NvbnNpc3RlbmN5X2NoZWNrLmNjIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19j b250YWluZXJzL3Vub3JkZXJlZF9tdWx0aXNldC9jb25zaXN0ZW5jeV9jaGVjay5jYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZjQ2M2EyY2VlMWQKLS0tIC9k ZXYvbnVsbAorKysgYi9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5v cmRlcmVkX211bHRpc2V0L2NvbnNpc3RlbmN5X2NoZWNrLmNjCkBAIC0wLDAgKzEsMTEwIEBA CisvLyB7IGRnLWRvIHJ1biB7IHRhcmdldCBjKysxMSB9IH0KKworI2luY2x1ZGUgPHN0cmlu Zz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1 bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8dGVzdHN1aXRlX2hvb2tzLmg+CisKK25hbWVz cGFjZQoreworICBjb25zdCBpbnQgbmJfZWxlbWVudHMgPSAxMDAwOworICBjb25zdCBpbnQg bmJfY29waWVzID0gNTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRWxlbVR5cGU+CisgICAg dm9pZCBjaGVjayhjb25zdCBzdGQ6OnVub3JkZXJlZF9tdWx0aXNldDxfRWxlbVR5cGU+JiB1 cykKKyAgICB7CisgICAgICBWRVJJRlkoIHN0ZDo6ZGlzdGFuY2UodXMuYmVnaW4oKSwgdXMu ZW5kKCkpID09IHVzLnNpemUoKSApOworICAgICAgc3RkOjpzaXplX3QgYmt0X2VsZW1zX2Nv dW50ID0gMDsKKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gdXMuYnVja2V0 X2NvdW50KCk7ICsraSkKKwl7CisJICBpZiAodXMuYnVja2V0X3NpemUoaSkgPT0gMCkKKwkg ICAgY29udGludWU7CisKKwkgIGJrdF9lbGVtc19jb3VudCArPSB1cy5idWNrZXRfc2l6ZShp KTsKKwkgIGZvciAoYXV0byBsaXQgPSB1cy5iZWdpbihpKTsgbGl0ICE9IHVzLmVuZChpKTsg KytsaXQpCisJICAgIHsKKwkgICAgICBWRVJJRlkoIHVzLmJ1Y2tldCgqbGl0KSA9PSBpICk7 CisJICAgIH0KKwl9CisKKyAgICAgIFZFUklGWSggYmt0X2VsZW1zX2NvdW50ID09IHVzLnNp emUoKSApOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRWxlbVR5cGU+CisgICAg dm9pZCBydW4oY29uc3Qgc3RkOjp2ZWN0b3I8X0VsZW1UeXBlPiYgZWxlbXMsIGJvb2wgd2l0 aF9jb3B5KQorICAgIHsKKyAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0PF9FbGVtVHlw ZT4gdXM7CisgICAgICB1cy5tYXhfbG9hZF9mYWN0b3IobmJfY29waWVzKTsKKyAgICAgIGNo ZWNrKHVzKTsKKworICAgICAgZm9yIChpbnQgaCA9IDA7IGggIT0gbmJfY29waWVzOyArK2gp CisJZm9yIChpbnQgaSA9IDA7IGkgIT0gbmJfZWxlbWVudHM7ICsraSkKKwkgIHsKKwkgICAg dXMuaW5zZXJ0KGVsZW1zW2ldKTsKKwkgICAgY2hlY2sodXMpOworCSAgfQorCisgICAgICBp ZiAod2l0aF9jb3B5KQorCXsKKwkgIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0PF9FbGVtVHlw ZT4odXMpLnN3YXAodXMpOworCSAgY2hlY2sodXMpOworCX0KKworICAgICAgZm9yIChpbnQg aSA9IG5iX2VsZW1lbnRzIC0gMTsgaSA+PSAwOyAtLWkpCisJeworCSAgYXV0byBpdCA9IHVz LmZpbmQoZWxlbXNbaV0pOworCSAgaWYgKGl0ICE9IHVzLmVuZCgpKQorCSAgICB7CisJICAg ICAgdXMuZXJhc2UoaXQpOworCSAgICAgIGNoZWNrKHVzKTsKKwkgICAgfQorCX0KKworICAg ICAgdXMuaW5zZXJ0KGVsZW1zWzBdKTsKKyAgICAgIGNoZWNrKHVzKTsKKyAgICAgIGZvciAo aW50IGkgPSBuYl9lbGVtZW50cyAtIDE7IGkgPj0gMDsgLS1pKQorCXsKKwkgIHVzLmluc2Vy dChlbGVtc1tpXSk7CisJICBjaGVjayh1cyk7CisJfQorCisgICAgICBmb3IgKGludCBqID0g bmJfZWxlbWVudHMgLSAxOyBqID49IDA7IC0taikKKwl7CisJICB1cy5lcmFzZShlbGVtc1tq XSk7CisJICBjaGVjayh1cyk7CisJfQorICAgIH0KK30KKworaW50IG1haW4oKQoreworICB7 CisgICAgc3RkOjp2ZWN0b3I8aW50PiBlbGVtczsKKyAgICBlbGVtcy5yZXNlcnZlKG5iX2Vs ZW1lbnRzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSAhPSBuYl9lbGVtZW50czsgKytpKQor ICAgICAgZWxlbXMucHVzaF9iYWNrKGkpOworCisgICAgcnVuKGVsZW1zLCBmYWxzZSk7Cisg ICAgcnVuKGVsZW1zLCB0cnVlKTsKKyAgfQorCisgIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6 OnN0cmluZz4gZWxlbXM7CisgICAgeworICAgICAgZWxlbXMucmVzZXJ2ZShuYl9lbGVtZW50 cyk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBuYl9lbGVtZW50czsgKytpKQorCXsK KwkgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3RyOworCSAgb3N0ciA8PCAic3RyaW5nICMiIDw8 IGkgPDwgJyAnIDw8IHN0ZDo6c3RyaW5nKDEwMDAsICdhJyArIGkpOworCSAgZWxlbXMucHVz aF9iYWNrKG9zdHIuc3RyKCkpOworCX0KKyAgICB9CisKKyAgICBydW4oZWxlbXMsIGZhbHNl KTsKKyAgICBydW4oZWxlbXMsIHRydWUpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYg LS1naXQgYS9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRlcmVk X3NldC9jb25zaXN0ZW5jeV9jaGVjay5jYyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNf Y29udGFpbmVycy91bm9yZGVyZWRfc2V0L2NvbnNpc3RlbmN5X2NoZWNrLmNjCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi43MDU4MWM1NTdhZAotLS0gL2Rldi9u dWxsCisrKyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy91bm9yZGVy ZWRfc2V0L2NvbnNpc3RlbmN5X2NoZWNrLmNjCkBAIC0wLDAgKzEsMTA3IEBACisvLyB7IGRn LWRvIHJ1biB7IHRhcmdldCBjKysxMSB9IH0KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNs dWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1bm9yZGVyZWRf c2V0PgorCisjaW5jbHVkZSA8dGVzdHN1aXRlX2hvb2tzLmg+CisKK25hbWVzcGFjZQorewor ICBjb25zdCBpbnQgbmJfZWxlbWVudHMgPSAyMDAwOworCisgIHRlbXBsYXRlPHR5cGVuYW1l IF9FbGVtVHlwZT4KKyAgICB2b2lkIGNoZWNrKGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxf RWxlbVR5cGU+JiB1cykKKyAgICB7CisgICAgICBWRVJJRlkoIHN0ZDo6ZGlzdGFuY2UodXMu YmVnaW4oKSwgdXMuZW5kKCkpID09IHVzLnNpemUoKSApOworICAgICAgc3RkOjpzaXplX3Qg Ymt0X2VsZW1zX2NvdW50ID0gMDsKKyAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkg IT0gdXMuYnVja2V0X2NvdW50KCk7ICsraSkKKwl7CisJICBpZiAodXMuYnVja2V0X3NpemUo aSkgPT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIGJrdF9lbGVtc19jb3VudCArPSB1cy5i dWNrZXRfc2l6ZShpKTsKKwkgIGZvciAoYXV0byBsaXQgPSB1cy5iZWdpbihpKTsgbGl0ICE9 IHVzLmVuZChpKTsgKytsaXQpCisJICAgIHsKKwkgICAgICBWRVJJRlkoIHVzLmJ1Y2tldCgq bGl0KSA9PSBpICk7CisJICAgIH0KKwl9CisKKyAgICAgIFZFUklGWSggYmt0X2VsZW1zX2Nv dW50ID09IHVzLnNpemUoKSApOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRWxl bVR5cGU+CisgICAgdm9pZCBydW4oY29uc3Qgc3RkOjp2ZWN0b3I8X0VsZW1UeXBlPiYgZWxl bXMsIGJvb2wgd2l0aF9jb3B5KQorICAgIHsKKyAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxf RWxlbVR5cGU+IHVzOworICAgICAgY2hlY2sodXMpOworCisgICAgICBmb3IgKGludCBpID0g MDsgaSAhPSBuYl9lbGVtZW50czsgKytpKQorCXsKKwkgIHVzLmluc2VydChlbGVtc1tpXSk7 CisJICBjaGVjayh1cyk7CisJfQorCisgICAgICBpZiAod2l0aF9jb3B5KQorCXsKKwkgIHN0 ZDo6dW5vcmRlcmVkX3NldDxfRWxlbVR5cGU+KHVzKS5zd2FwKHVzKTsKKwkgIGNoZWNrKHVz KTsKKwl9CisKKyAgICAgIGZvciAoaW50IGkgPSBuYl9lbGVtZW50cyAtIDE7IGkgPj0gMDsg LS1pKQorCXsKKwkgIGF1dG8gaXQgPSB1cy5maW5kKGVsZW1zW2ldKTsKKwkgIGlmIChpdCAh PSB1cy5lbmQoKSkKKwkgICAgeworCSAgICAgIHVzLmVyYXNlKGl0KTsKKwkgICAgICBjaGVj ayh1cyk7CisJICAgIH0KKwl9CisKKyAgICAgIHVzLmluc2VydChlbGVtc1swXSk7CisgICAg ICBjaGVjayh1cyk7CisgICAgICBmb3IgKGludCBpID0gbmJfZWxlbWVudHMgLSAxOyBpID49 IDA7IC0taSkKKwl7CisJICB1cy5pbnNlcnQoZWxlbXNbaV0pOworCSAgY2hlY2sodXMpOwor CX0KKworICAgICAgZm9yIChpbnQgaiA9IG5iX2VsZW1lbnRzIC0gMTsgaiA+PSAwOyAtLWop CisJeworCSAgdXMuZXJhc2UoZWxlbXNbal0pOworCSAgY2hlY2sodXMpOworCX0KKyAgICB9 Cit9CisKK2ludCBtYWluKCkKK3sKKyAgeworICAgIHN0ZDo6dmVjdG9yPGludD4gZWxlbXM7 CisgICAgZWxlbXMucmVzZXJ2ZShuYl9lbGVtZW50cyk7CisgICAgZm9yIChpbnQgaSA9IDA7 IGkgIT0gbmJfZWxlbWVudHM7ICsraSkKKyAgICAgIGVsZW1zLnB1c2hfYmFjayhpKTsKKwor ICAgIHJ1bihlbGVtcywgZmFsc2UpOworICAgIHJ1bihlbGVtcywgdHJ1ZSk7CisgIH0KKwor ICB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVsZW1zOworICAgIHsKKyAgICAg IGVsZW1zLnJlc2VydmUobmJfZWxlbWVudHMpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkg IT0gbmJfZWxlbWVudHM7ICsraSkKKwl7CisJICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3N0cjsK KwkgIG9zdHIgPDwgInN0cmluZyAjIiA8PCBpIDw8ICcgJyA8PCBzdGQ6OnN0cmluZygxMDAw LCAnYScgKyBpKTsKKwkgIGVsZW1zLnB1c2hfYmFjayhvc3RyLnN0cigpKTsKKwl9CisgICAg fQorCisgICAgcnVuKGVsZW1zLCBmYWxzZSk7CisgICAgcnVuKGVsZW1zLCB0cnVlKTsKKyAg fQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL3Rlc3RzdWl0 ZS9saWJzdGRjKystcHJldHR5cHJpbnRlcnMvY3h4MTEuY2MgYi9saWJzdGRjKystdjMvdGVz dHN1aXRlL2xpYnN0ZGMrKy1wcmV0dHlwcmludGVycy9jeHgxMS5jYwppbmRleCAwZjE3MzZh MTU1MC4uNGIxNjM1NGEyNmIgMTAwNjQ0Ci0tLSBhL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUv bGlic3RkYysrLXByZXR0eXByaW50ZXJzL2N4eDExLmNjCisrKyBiL2xpYnN0ZGMrKy12My90 ZXN0c3VpdGUvbGlic3RkYysrLXByZXR0eXByaW50ZXJzL2N4eDExLmNjCkBAIC0xMDMsMTAg KzEwMywxMCBAQCBtYWluKCkKICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3RkOjpzdHJp bmc+IHVvbTsKICAgdW9tWzVdID0gInRocmVlIjsKICAgdW9tWzNdID0gInNldmVuIjsKLS8v IHsgZGctZmluYWwgeyByZWdleHAtdGVzdCB1b20ge3N0ZDo6KF9fZGVidWc6Oik/dW5vcmRl cmVkX21hcCB3aXRoIDIgZWxlbWVudHMgPSB7XFszXF0gPSAic2V2ZW4iLCBcWzVcXSA9ICJ0 aHJlZSJ9fSB9IH0KKy8vIHsgZGctZmluYWwgeyByZWdleHAtdGVzdCB1b20ge3N0ZDo6KF9f ZGVidWc6Oik/dW5vcmRlcmVkX21hcCB3aXRoIDIgZWxlbWVudHMgPSB7XFs1XF0gPSAidGhy ZWUiLCBcWzNcXSA9ICJzZXZlbiJ9fSB9IH0KIAogICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50 LCBzdGQ6OnN0cmluZz4gJnJ1b20gPSB1b207Ci0vLyB7IGRnLWZpbmFsIHsgcmVnZXhwLXRl c3QgcnVvbSB7c3RkOjooX19kZWJ1Zzo6KT91bm9yZGVyZWRfbWFwIHdpdGggMiBlbGVtZW50 cyA9IHtcWzNcXSA9ICJzZXZlbiIsIFxbNVxdID0gInRocmVlIn19IH0gfQorLy8geyBkZy1m aW5hbCB7IHJlZ2V4cC10ZXN0IHJ1b20ge3N0ZDo6KF9fZGVidWc6Oik/dW5vcmRlcmVkX21h cCB3aXRoIDIgZWxlbWVudHMgPSB7XFs1XF0gPSAidGhyZWUiLCBcWzNcXSA9ICJzZXZlbiJ9 fSB9IH0KIAogICBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcDxpbnQsIHN0ZDo6c3RyaW5nPiB1 b21tOwogICB1b21tLmluc2VydChzdGQ6OnBhaXI8aW50LCBzdGQ6OnN0cmluZz4gKDUsICJ0 aHJlZSIpKTsK --------------7OWIcD0TBhrkxbqrc0lJJwhB--