<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>26062</bug_id>
          
          <creation_ts>2009-05-28 06:18:38 -0700</creation_ts>
          <short_desc>Refactor HTMLSelectElement code, to be reusable for WMLSelectElement</short_desc>
          <delta_ts>2009-05-28 10:49:31 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>20393</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Nikolas Zimmermann">zimmermann</reporter>
          <assigned_to name="Nikolas Zimmermann">zimmermann</assigned_to>
          <cc>darin</cc>
    
    <cc>mjs</cc>
    
    <cc>staikos</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>123401</commentid>
    <comment_count>0</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-05-28 06:18:38 -0700</bug_when>
    <thetext>Refactor HTMLSelectElement code, just like it has been done for HTMLInput/Option/OptGroupElement before. This is the last big refactorization, needed for WML.

A follow-up patch will add WMLSelectElement and integrate it. &lt;select&gt; is the last missing piece for WML.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123403</commentid>
    <comment_count>1</comment_count>
      <attachid>30736</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-05-28 06:43:01 -0700</bug_when>
    <thetext>Created attachment 30736
Initial patch

No regressions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123410</commentid>
    <comment_count>2</comment_count>
      <attachid>30738</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-05-28 08:37:38 -0700</bug_when>
    <thetext>Created attachment 30738
Updated patch

Oops, the initial patch wouldn&apos;t compile on non-mac platforms. Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123417</commentid>
    <comment_count>3</comment_count>
      <attachid>30738</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-05-28 09:14:08 -0700</bug_when>
    <thetext>Comment on attachment 30738
Updated patch

It&apos;s unfortunate that we&apos;re losing the Subversion history for all these functions. Also makes the patch harder to review, since I can&apos;t see what you did and did not change when moving the functions.

&gt; +static const DOMTimeStamp s_typeAheadTimeout = 1000;

The &quot;s_&quot; prefix seems a little strange here, since this is not a static data member. (Not that I like the s_ prefix even for static data members.) I liked the old name without a prefix better.

&gt; +        cachedStateForActiveSelection.append(optionElement ? optionElement-&gt;selected() : false);

This is probably not new code, but I would write this with &amp;&amp; instead of ?: as optionElement &amp;&amp; optionElement-&gt;selected().

&gt; +    for (unsigned int i = 0; i &lt; items.size(); ++i) {

Should be unsigned or size_t, not unsigned int.

&gt; +    Vector&lt;char, 1024&gt; characters(length);
&gt; +    for (int i = 0; i &lt; length; ++i) {
&gt; +        OptionElement* optionElement = toOptionElement(items[i]);
&gt; +        bool selected = optionElement ? optionElement-&gt;selected() : false;
&gt; +        characters[i] = selected ? &apos;X&apos; : &apos;.&apos;;
&gt; +    }
&gt; +
&gt; +    value = String(characters.data(), length);

Not related to refactoring, but we should change this to use String::createUninitialized.

&gt; +    // ### this case should not happen. make sure that we select the first option
&gt; +    // in any case. otherwise we have no consistency with the DOM interface. FIXME!
&gt; +    // we return the first one if it was a combobox select

This old comment could be changed to use modern WebKit style, with FIXME prefix instead of ### and sentence format.

&gt;  #include &lt;wtf/Vector.h&gt;
&gt; +#include &quot;Event.h&quot;

We normally put &quot;&quot; includes before &lt;&gt; includes because that&apos;s ASCII sort order.

&gt; +    ~SelectElementData();

Does this need to be explicitly declared and defined? Can&apos;t we just let the compiler generate it?

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123427</commentid>
    <comment_count>4</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-05-28 09:53:05 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 30738 [review])
&gt; It&apos;s unfortunate that we&apos;re losing the Subversion history for all these
&gt; functions. Also makes the patch harder to review, since I can&apos;t see what you
&gt; did and did not change when moving the functions.
Thanks, that you took the time despite that fact :-)
 
&gt; &gt; +static const DOMTimeStamp s_typeAheadTimeout = 1000;
&gt; 
&gt; The &quot;s_&quot; prefix seems a little strange here, since this is not a static data
&gt; member. (Not that I like the s_ prefix even for static data members.) I liked
&gt; the old name without a prefix better.
Restored the old name.
 
&gt; &gt; +        cachedStateForActiveSelection.append(optionElement ? optionElement-&gt;selected() : false);
&gt; 
&gt; This is probably not new code, but I would write this with &amp;&amp; instead of ?: as
&gt; optionElement &amp;&amp; optionElement-&gt;selected().
Fixed. There were other places, that I fixed as well.
 
&gt; &gt; +    for (unsigned int i = 0; i &lt; items.size(); ++i) {
&gt; 
&gt; Should be unsigned or size_t, not unsigned int.
Fixed. What about the other loops using &quot;for (unsigned i = 0; i &lt; items.size();...&quot;?
Does that need to be fixed as well?
 
&gt; &gt; +    Vector&lt;char, 1024&gt; characters(length);
&gt; &gt; +    for (int i = 0; i &lt; length; ++i) {
&gt; &gt; +        OptionElement* optionElement = toOptionElement(items[i]);
&gt; &gt; +        bool selected = optionElement ? optionElement-&gt;selected() : false;
&gt; &gt; +        characters[i] = selected ? &apos;X&apos; : &apos;.&apos;;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    value = String(characters.data(), length);
&gt; 
&gt; Not related to refactoring, but we should change this to use
&gt; String::createUninitialized.
Oh, interessting. I&apos;ll change the code.
 
&gt; &gt; +    // ### this case should not happen. make sure that we select the first option
&gt; &gt; +    // in any case. otherwise we have no consistency with the DOM interface. FIXME!
&gt; &gt; +    // we return the first one if it was a combobox select
&gt; 
&gt; This old comment could be changed to use modern WebKit style, with FIXME prefix
&gt; instead of ### and sentence format.
Fixed.
 
&gt; &gt;  #include &lt;wtf/Vector.h&gt;
&gt; &gt; +#include &quot;Event.h&quot;
&gt; 
&gt; We normally put &quot;&quot; includes before &lt;&gt; includes because that&apos;s ASCII sort order.
Fixed.
 
&gt; &gt; +    ~SelectElementData();
&gt; 
&gt; Does this need to be explicitly declared and defined? Can&apos;t we just let the
&gt; compiler generate it?
Ah I always forget about that. The rule is to only add empty dtors if they are virtual, to avoid bloat, right?
 
&gt; r=me

Thanks, I&apos;m going to test the changes first, then land later on.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123430</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-05-28 10:00:49 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt; &gt; +    for (unsigned int i = 0; i &lt; items.size(); ++i) {
&gt; &gt; 
&gt; &gt; Should be unsigned or size_t, not unsigned int.
&gt; Fixed. What about the other loops using &quot;for (unsigned i = 0; i &lt;
&gt; items.size();...&quot;?
&gt; Does that need to be fixed as well?

unsigned int is never correct. It&apos;s just a wordier synonym for unsigned that we don&apos;t use. So that half of the issue is clear cut.

As far as switching from unsigned to size_t is concerned, I don&apos;t know about that. In 64-bit configurations, size_t is 64-bit and unsigned is 32-bit, and I&apos;m not sure what the best practice is throughout WebCore code. I&apos;d love to hear Maciej&apos;s thoughts on that.

&gt; &gt; Does this need to be explicitly declared and defined? Can&apos;t we just let the
&gt; &gt; compiler generate it?
&gt; Ah I always forget about that. The rule is to only add empty dtors if they are
&gt; virtual, to avoid bloat, right?

There are two reasons I can think of to explicitly declare and define empty destructors.

    1) To put a destructor into a .cpp file to cut down on the includes needed in a header file. For example, if class A has a member of type RefPtr&lt;B&gt; and class B&apos;s definition is not included in the header, you might have a compile failure if you tried to destroy an A object, which could be avoided by having A.cpp include B.h and define the destructor.

    2) For some compilers it&apos;s important that the first virtual function explicitly defined in a class be explicitly defined in a .cpp file and not in a header file. But I don&apos;t think the destructor matters unless you explicitly define the empty destructor; leaving it out entirely does not have this issue.

If the destructor is virtual, there *might* be some value to putting it in the .cpp file but I&apos;m not aware of any. I normally omit even virtual destructors unless reason (1) applies. And reason (2) only applies if you are defining an empty destructor in the header for some reason, perhaps making it protected or private while leaving it empty.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123432</commentid>
    <comment_count>6</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-05-28 10:14:05 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; unsigned int is never correct. It&apos;s just a wordier synonym for unsigned that we
&gt; don&apos;t use. So that half of the issue is clear cut.
&gt; 
&gt; As far as switching from unsigned to size_t is concerned, I don&apos;t know about
&gt; that. In 64-bit configurations, size_t is 64-bit and unsigned is 32-bit, and
&gt; I&apos;m not sure what the best practice is throughout WebCore code. I&apos;d love to
&gt; hear Maciej&apos;s thoughts on that.
Okay, CC&apos;ing Maciej, as I&apos;m also interessted in that topic in general. What&apos;s good practice and what not.

&gt; 
&gt; &gt; &gt; Does this need to be explicitly declared and defined? Can&apos;t we just let the
&gt; &gt; &gt; compiler generate it?
&gt; &gt; Ah I always forget about that. The rule is to only add empty dtors if they are
&gt; &gt; virtual, to avoid bloat, right?
&gt; 
&gt; There are two reasons I can think of to explicitly declare and define empty
&gt; destructors.
&gt; 
&gt;     1) To put a destructor into a .cpp file to cut down on the includes needed
&gt; in a header file. For example, if class A has a member of type RefPtr&lt;B&gt; and
&gt; class B&apos;s definition is not included in the header, you might have a compile
&gt; failure if you tried to destroy an A object, which could be avoided by having
&gt; A.cpp include B.h and define the destructor.
&gt; 
&gt;     2) For some compilers it&apos;s important that the first virtual function
&gt; explicitly defined in a class be explicitly defined in a .cpp file and not in a
&gt; header file. But I don&apos;t think the destructor matters unless you explicitly
&gt; define the empty destructor; leaving it out entirely does not have this issue.
&gt; 
&gt; If the destructor is virtual, there *might* be some value to putting it in the
&gt; .cpp file but I&apos;m not aware of any. I normally omit even virtual destructors
&gt; unless reason (1) applies. And reason (2) only applies if you are defining an
&gt; empty destructor in the header for some reason, perhaps making it protected or
&gt; private while leaving it empty.

Thanks for that guide, that helps for the future. When I submitted a patch a while ago, omitting a virtual dtor, I thought Alexey complained about that (&apos;code bloat with some compilers&apos;), but I may misremember.

I&apos;ve added a FIXME to cover changing that String code path to use createUninitialized(), as I&apos;d like to seperate that from the current patch. There may be a reason for a follow-up patch as well if it turns out the unsigned -&gt; size_t conversion should be done as well. I&apos;d volunteer for doing this if necessary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>123436</commentid>
    <comment_count>7</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2009-05-28 10:49:20 -0700</bug_when>
    <thetext>Landed in r44243.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30736</attachid>
            <date>2009-05-28 06:43:01 -0700</date>
            <delta_ts>2009-05-28 08:37:38 -0700</delta_ts>
            <desc>Initial patch</desc>
            <filename>AddSelectElementCode.diff</filename>
            <type>text/plain</type>
            <size>89713</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQ0MjI2
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIxIEBACisyMDA5LTA1
LTI4ICBOaWtvbGFzIFppbW1lcm1hbm4gIDxuaWtvbGFzLnppbW1lcm1hbm5AdG9yY2htb2JpbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZp
eGVzOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjYwNjIKKworICAg
ICAgICBSZWZhY3RvciBjb2RlIGZyb20gYWxsIHZpcnR1YWwgbWV0aG9kcyBpbiBIVE1MU2VsZWN0
RWxlbWVudCAodGhhdCBhcmUgYWxzbyBuZWVkZWQgZm9yIFdNTFNlbGVjdEVsZW1lbnQpCisgICAg
ICAgIGluIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIFNlbGVjdEVsZW1lbnQgYWJzdHJhY3QgYmFz
ZSBjbGFzcy4gRm9sbG93IHRoZSBzYW1lIGRlc2lnbiBzaGVtZSB0aGF0IElucHV0RWxlbWVudCB1
c2VzLgorCisgICAgICAgIEEgZm9sbG93LXVwIHBhdGNoIGNhbiBub3cgZWFzaWx5IGFkZCBXTUxT
ZWxlY3RFbGVtZW50LgorCisgICAgICAgICogZG9tL09wdGlvbkVsZW1lbnQuaDoKKyAgICAgICAg
KiBkb20vU2VsZWN0RWxlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50
OjpzZWxlY3RBbGwpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudDo6c2F2ZUxhc3RT
ZWxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6aXNPcHRpb25FbGVtZW50KToKKyAgICAgICAg
KFdlYkNvcmU6OmlzT3B0aW9uR3JvdXBFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVj
dEVsZW1lbnQ6Om5leHRTZWxlY3RhYmxlTGlzdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlNl
bGVjdEVsZW1lbnQ6OnByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleCk6CisgICAgICAgIChXZWJD
b3JlOjpTZWxlY3RFbGVtZW50OjpzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCk6CisgICAg
ICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50OjpzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleCk6
CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50Ojp1cGRhdGVMaXN0Qm94U2VsZWN0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6Omxpc3RCb3hPbkNoYW5nZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50OjptZW51TGlzdE9uQ2hhbmdlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OnNjcm9sbFRvU2VsZWN0aW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OnJlY2FsY1N0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6
OlNlbGVjdEVsZW1lbnQ6OnNldFJlY2FsY0xpc3RJdGVtcyk6CisgICAgICAgIChXZWJDb3JlOjpT
ZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0
RWxlbWVudDo6c2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50
OjpzZXRTZWxlY3RlZEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6Om9w
dGlvblRvTGlzdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6Omxpc3RU
b09wdGlvbkluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OmRpc3BhdGNo
Rm9jdXNFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEJs
dXJFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50OjpkZXNlbGVjdEl0ZW1z
KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OnNhdmVGb3JtQ29udHJvbFN0YXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OnJlc3RvcmVGb3JtQ29udHJvbFN0
YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OnBhcnNlTXVsdGlwbGVBdHRy
aWJ1dGUpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudDo6YXBwZW5kRm9ybURhdGEp
OgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudDo6cmVzZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6U2VsZWN0RWxlbWVudDo6bWVudUxpc3REZWZhdWx0RXZlbnRIYW5kbGVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6Omxpc3RCb3hEZWZhdWx0RXZlbnRIYW5kbGVyKToK
KyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudDo6bGFzdFNlbGVjdGVkTGlzdEluZGV4KToK
KyAgICAgICAgKFdlYkNvcmU6OnN0cmlwTGVhZGluZ1doaXRlU3BhY2UpOgorICAgICAgICAoV2Vi
Q29yZTo6U2VsZWN0RWxlbWVudDo6dHlwZUFoZWFkRmluZCk6CisgICAgICAgIChXZWJDb3JlOjpT
ZWxlY3RFbGVtZW50OjppbnNlcnRlZEludG9UcmVlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVj
dEVsZW1lbnREYXRhOjpTZWxlY3RFbGVtZW50RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTZWxl
Y3RFbGVtZW50RGF0YTo6flNlbGVjdEVsZW1lbnREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNl
bGVjdEVsZW1lbnREYXRhOjpjaGVja0xpc3RJdGVtcyk6CisgICAgICAgIChXZWJDb3JlOjpTZWxl
Y3RFbGVtZW50RGF0YTo6bGlzdEl0ZW1zKToKKyAgICAgICAgKiBkb20vU2VsZWN0RWxlbWVudC5o
OgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudERhdGE6Om11bHRpcGxlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnREYXRhOjpzZXRNdWx0aXBsZSk6CisgICAgICAgIChX
ZWJDb3JlOjpTZWxlY3RFbGVtZW50RGF0YTo6c2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZWxl
Y3RFbGVtZW50RGF0YTo6c2V0U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50
RGF0YTo6dXNlc01lbnVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnREYXRh
OjpsYXN0T25DaGFuZ2VJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50RGF0
YTo6c2V0TGFzdE9uQ2hhbmdlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVu
dERhdGE6Omxhc3RPbkNoYW5nZVNlbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RF
bGVtZW50RGF0YTo6YWN0aXZlU2VsZWN0aW9uU3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6U2Vs
ZWN0RWxlbWVudERhdGE6OnNldEFjdGl2ZVNlbGVjdGlvblN0YXRlKToKKyAgICAgICAgKFdlYkNv
cmU6OlNlbGVjdEVsZW1lbnREYXRhOjphY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCk6CisgICAg
ICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50RGF0YTo6c2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9y
SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudERhdGE6OmFjdGl2ZVNlbGVj
dGlvbkVuZEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnREYXRhOjpzZXRB
Y3RpdmVTZWxlY3Rpb25FbmRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50
RGF0YTo6Y2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6
U2VsZWN0RWxlbWVudERhdGE6OnNob3VsZFJlY2FsY0xpc3RJdGVtcyk6CisgICAgICAgIChXZWJD
b3JlOjpTZWxlY3RFbGVtZW50RGF0YTo6c2V0U2hvdWxkUmVjYWxjTGlzdEl0ZW1zKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnREYXRhOjpyYXdMaXN0SXRlbXMpOgorICAgICAgICAo
V2ViQ29yZTo6U2VsZWN0RWxlbWVudERhdGE6OnJlcGVhdGluZ0NoYXIpOgorICAgICAgICAoV2Vi
Q29yZTo6U2VsZWN0RWxlbWVudERhdGE6OnNldFJlcGVhdGluZ0NoYXIpOgorICAgICAgICAoV2Vi
Q29yZTo6U2VsZWN0RWxlbWVudERhdGE6Omxhc3RDaGFyVGltZSk6CisgICAgICAgIChXZWJDb3Jl
OjpTZWxlY3RFbGVtZW50RGF0YTo6c2V0TGFzdENoYXJUaW1lKToKKyAgICAgICAgKFdlYkNvcmU6
OlNlbGVjdEVsZW1lbnREYXRhOjp0eXBlZFN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpTZWxl
Y3RFbGVtZW50RGF0YTo6c2V0VHlwZWRTdHJpbmcpOgorICAgICAgICAqIGh0bWwvSFRNTE9wdGlv
bkVsZW1lbnQuaDoKKyAgICAgICAgKiBodG1sL0hUTUxTZWxlY3RFbGVtZW50LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpIVE1MU2VsZWN0RWxlbWVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6cmVjYWxjU3R5bGUpOgorICAgICAgICAo
V2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmZvcm1Db250cm9sVHlwZSk6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6c2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChXZWJD
b3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6ZGVzZWxlY3RJdGVtcyk6CisgICAgICAgIChXZWJDb3Jl
OjpIVE1MU2VsZWN0RWxlbWVudDo6c2V0U2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChXZWJDb3Jl
OjpIVE1MU2VsZWN0RWxlbWVudDo6YWN0aXZlU2VsZWN0aW9uU3RhcnRMaXN0SW5kZXgpOgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmFjdGl2ZVNlbGVjdGlvbkVuZExpc3RJ
bmRleCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6c2F2ZUZvcm1Db250
cm9sU3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnJlc3RvcmVG
b3JtQ29udHJvbFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50Ojpw
YXJzZU1hcHBlZEF0dHJpYnV0ZSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVu
dDo6Y2FuU2VsZWN0QWxsKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50Ojpz
ZWxlY3RBbGwpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmNyZWF0ZVJl
bmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjphcHBlbmRGb3Jt
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6b3B0aW9uVG9MaXN0
SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6Omxpc3RUb09wdGlv
bkluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0
SXRlbXMpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNldFJlY2FsY0xp
c3RJdGVtcyk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6cmVzZXQpOgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmRpc3BhdGNoRm9jdXNFdmVudCk6
CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6ZGlzcGF0Y2hCbHVyRXZlbnQp
OgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRs
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNldEFjdGl2ZVNlbGVj
dGlvbkFuY2hvckluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50Ojpz
ZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0
RWxlbWVudDo6dXBkYXRlTGlzdEJveFNlbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpIVE1M
U2VsZWN0RWxlbWVudDo6bWVudUxpc3RPbkNoYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1M
U2VsZWN0RWxlbWVudDo6bGlzdEJveE9uQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxT
ZWxlY3RFbGVtZW50OjpzYXZlTGFzdFNlbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpIVE1M
U2VsZWN0RWxlbWVudDo6c2V0T3B0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RF
bGVtZW50OjpzY3JvbGxUb1NlbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0
RWxlbWVudDo6aW5zZXJ0ZWRJbnRvVHJlZSk6CisgICAgICAgICogaHRtbC9IVE1MU2VsZWN0RWxl
bWVudC5oOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNpemUpOgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6Om11bHRpcGxlKToKKyAgICAgICAgKFdl
YkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpsaXN0SXRlbXMpOgorICAgICAgICAqIHdtbC9XTUxP
cHRpb25FbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldNTE9wdGlvbkVsZW1lbnQ6OnRl
eHQpOgorICAgICAgICAqIHdtbC9XTUxPcHRpb25FbGVtZW50Lmg6CisKIDIwMDktMDUtMjggIEhv
bGdlciBIYW5zIFBldGVyIEZyZXl0aGVyICA8emVja2VAc2VsZmlzaC5vcmc+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgWGFuIExvcGV6LgpJbmRleDogZG9tL09wdGlvbkVsZW1lbnQuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBkb20vT3B0aW9uRWxlbWVudC5oCShyZXZpc2lvbiA0NDIyNikKKysrIGRvbS9PcHRp
b25FbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDcgQEAgcHVibGljOgogICAg
IHZpcnR1YWwgYm9vbCBzZWxlY3RlZCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0
U2VsZWN0ZWRTdGF0ZShib29sKSA9IDA7CiAKKyAgICB2aXJ0dWFsIFN0cmluZyB0ZXh0KCkgY29u
c3QgPSAwOwogICAgIHZpcnR1YWwgU3RyaW5nIHRleHRJbmRlbnRlZFRvUmVzcGVjdEdyb3VwTGFi
ZWwoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSBjb25zdCA9IDA7CiAK
SW5kZXg6IGRvbS9TZWxlY3RFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkb20vU2VsZWN0RWxl
bWVudC5jcHAJKHJldmlzaW9uIDQ0MjI2KQorKysgZG9tL1NlbGVjdEVsZW1lbnQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMSwyMCArMjEsODk0IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5j
bHVkZSAiU2VsZWN0RWxlbWVudC5oIgogCisjaW5jbHVkZSAiQ2hhcmFjdGVyTmFtZXMuaCIKKyNp
bmNsdWRlICJDaHJvbWVDbGllbnQuaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAi
RXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgorI2luY2x1ZGUgIkZvcm1E
YXRhTGlzdC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiSFRNTEZvcm1FbGVtZW50
LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiSFRNTEtleWdlbkVsZW1lbnQu
aCIKICNpbmNsdWRlICJIVE1MU2VsZWN0RWxlbWVudC5oIgorI2luY2x1ZGUgIktleWJvYXJkRXZl
bnQuaCIKKyNpbmNsdWRlICJNYXBwZWRBdHRyaWJ1dGUuaCIKKyNpbmNsdWRlICJNb3VzZUV2ZW50
LmgiCisjaW5jbHVkZSAiT3B0aW9uRWxlbWVudC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNs
dWRlICJSZW5kZXJMaXN0Qm94LmgiCisjaW5jbHVkZSAiUmVuZGVyTWVudUxpc3QuaCIKICNpbmNs
dWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgogCi0vLyBGSVhNRTogQWN0aXZhdGUgY29kZSBvbmNlIFdN
TFNlbGVjdEVsZW1lbnQgaXMgYXZhaWxhYmxlCi0jaWYgRU5BQkxFKFdNTCkgJiYgMAotI2luY2x1
ZGUgIldNTFNlbGVjdEVsZW1lbnQuaCIKKyNpZiBFTkFCTEUoV01MKQogI2luY2x1ZGUgIldNTE5h
bWVzLmgiCiAjZW5kaWYKIAorI2lmIFBMQVRGT1JNKE1BQykKKyNkZWZpbmUgQVJST1dfS0VZU19Q
T1BfTUVOVSAxCisjZWxzZQorI2RlZmluZSBBUlJPV19LRVlTX1BPUF9NRU5VIDAKKyNlbmRpZgor
Cit1c2luZyBzdGQ6Om1pbjsKK3VzaW5nIHN0ZDo6bWF4OwordXNpbmcgbmFtZXNwYWNlIFdURjsK
K3VzaW5nIG5hbWVzcGFjZSBVbmljb2RlOworCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK3N0YXRp
YyBjb25zdCBET01UaW1lU3RhbXAgc190eXBlQWhlYWRUaW1lb3V0ID0gMTAwMDsKKwordm9pZCBT
ZWxlY3RFbGVtZW50OjpzZWxlY3RBbGwoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQq
IGVsZW1lbnQpCit7CisgICAgQVNTRVJUKCFkYXRhLnVzZXNNZW51TGlzdCgpKTsKKyAgICBpZiAo
IWVsZW1lbnQtPnJlbmRlcmVyKCkgfHwgIWRhdGEubXVsdGlwbGUoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0
aGUgbmV3IHNlbGVjdEFsbCBzZWxlY3Rpb24gd2hlbiBkaXNwYXRjaGluZyBjaGFuZ2UgZXZlbnRz
CisgICAgc2F2ZUxhc3RTZWxlY3Rpb24oZGF0YSwgZWxlbWVudCk7CisKKyAgICBkYXRhLnNldEFj
dGl2ZVNlbGVjdGlvblN0YXRlKHRydWUpOworICAgIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvcklu
ZGV4KGRhdGEsIGVsZW1lbnQsIG5leHRTZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQs
IC0xKSk7CisgICAgc2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoZGF0YSwgcHJldmlvdXNTZWxl
Y3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIC0xKSk7CisKKyAgICB1cGRhdGVMaXN0Qm94
U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQsIGZhbHNlKTsKKyAgICBsaXN0Qm94T25DaGFuZ2UoZGF0
YSwgZWxlbWVudCk7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6c2F2ZUxhc3RTZWxlY3Rpb24o
U2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgaWYgKGRh
dGEudXNlc01lbnVMaXN0KCkpIHsKKyAgICAgICAgZGF0YS5zZXRMYXN0T25DaGFuZ2VJbmRleChz
ZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1lbnQpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIFZlY3Rvcjxib29sPiYgbGFzdE9uQ2hhbmdlU2VsZWN0aW9uID0gZGF0YS5sYXN0T25DaGFu
Z2VTZWxlY3Rpb24oKTsgCisgICAgbGFzdE9uQ2hhbmdlU2VsZWN0aW9uLmNsZWFyKCk7CisKKyAg
ICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQp
OworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAg
ICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1z
W2ldKTsKKyAgICAgICAgbGFzdE9uQ2hhbmdlU2VsZWN0aW9uLmFwcGVuZChvcHRpb25FbGVtZW50
ID8gb3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSA6IGZhbHNlKTsKKyAgICB9Cit9CisKK3N0YXRp
YyBpbmxpbmUgYm9vbCBpc09wdGlvbkVsZW1lbnQoRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBy
ZXR1cm4gZWxlbWVudC0+aGFzTG9jYWxOYW1lKEhUTUxOYW1lczo6b3B0aW9uVGFnKQorI2lmIEVO
QUJMRShXTUwpCisgICAgICAgIHx8IGVsZW1lbnQtPmhhc0xvY2FsTmFtZShXTUxOYW1lczo6b3B0
aW9uVGFnKQorI2VuZGlmCisgICAgICAgIDsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzT3B0
aW9uR3JvdXBFbGVtZW50KEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgcmV0dXJuIGVsZW1lbnQt
Pmhhc0xvY2FsTmFtZShIVE1MTmFtZXM6Om9wdGdyb3VwVGFnKQorI2lmIEVOQUJMRShXTUwpCisg
ICAgICAgIHx8IGVsZW1lbnQtPmhhc0xvY2FsTmFtZShXTUxOYW1lczo6b3B0Z3JvdXBUYWcpCisj
ZW5kaWYKKyAgICAgICAgOworfQorCitpbnQgU2VsZWN0RWxlbWVudDo6bmV4dFNlbGVjdGFibGVM
aXN0SW5kZXgoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBz
dGFydEluZGV4KQoreworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5s
aXN0SXRlbXMoZWxlbWVudCk7CisgICAgaW50IGluZGV4ID0gc3RhcnRJbmRleCArIDE7CisgICAg
d2hpbGUgKGluZGV4ID49IDAgJiYgKHVuc2lnbmVkKSBpbmRleCA8IGl0ZW1zLnNpemUoKSAmJiAo
IWlzT3B0aW9uRWxlbWVudChpdGVtc1tpbmRleF0pIHx8IGl0ZW1zW2luZGV4XS0+ZGlzYWJsZWQo
KSkpCisgICAgICAgICsraW5kZXg7CisgICAgaWYgKCh1bnNpZ25lZCkgaW5kZXggPT0gaXRlbXMu
c2l6ZSgpKQorICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKKyAgICByZXR1cm4gaW5kZXg7Cit9
CisKK2ludCBTZWxlY3RFbGVtZW50OjpwcmV2aW91c1NlbGVjdGFibGVMaXN0SW5kZXgoU2VsZWN0
RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBzdGFydEluZGV4KQorewor
ICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVu
dCk7CisgICAgaWYgKHN0YXJ0SW5kZXggPT0gLTEpCisgICAgICAgIHN0YXJ0SW5kZXggPSBpdGVt
cy5zaXplKCk7CisgICAgaW50IGluZGV4ID0gc3RhcnRJbmRleCAtIDE7CisgICAgd2hpbGUgKGlu
ZGV4ID49IDAgJiYgKHVuc2lnbmVkKSBpbmRleCA8IGl0ZW1zLnNpemUoKSAmJiAoIWlzT3B0aW9u
RWxlbWVudChpdGVtc1tpbmRleF0pIHx8IGl0ZW1zW2luZGV4XS0+ZGlzYWJsZWQoKSkpCisgICAg
ICAgIC0taW5kZXg7CisgICAgaWYgKGluZGV4ID09IC0xKQorICAgICAgICByZXR1cm4gc3RhcnRJ
bmRleDsKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6c2V0QWN0
aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQq
IGVsZW1lbnQsIGludCBpbmRleCkKK3sKKyAgICBkYXRhLnNldEFjdGl2ZVNlbGVjdGlvbkFuY2hv
ckluZGV4KGluZGV4KTsKKworICAgIC8vIENhY2hlIHRoZSBzZWxlY3Rpb24gc3RhdGUgc28gd2Ug
Y2FuIHJlc3RvcmUgdGhlIG9sZCBzZWxlY3Rpb24gYXMgdGhlIG5ldyBzZWxlY3Rpb24gcGl2b3Rz
IGFyb3VuZCB0aGlzIGFuY2hvciBpbmRleAorICAgIFZlY3Rvcjxib29sPiYgY2FjaGVkU3RhdGVG
b3JBY3RpdmVTZWxlY3Rpb24gPSBkYXRhLmNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uKCk7
IAorICAgIGNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uLmNsZWFyKCk7CisKKyAgICBjb25z
dCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBP
cHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsK
KyAgICAgICAgY2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24uYXBwZW5kKG9wdGlvbkVsZW1l
bnQgPyBvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpIDogZmFsc2UpOworICAgIH0KK30KKwordm9p
ZCBTZWxlY3RFbGVtZW50OjpzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChTZWxlY3RFbGVtZW50
RGF0YSYgZGF0YSwgaW50IGluZGV4KQoreworICAgIGRhdGEuc2V0QWN0aXZlU2VsZWN0aW9uRW5k
SW5kZXgoaW5kZXgpOworfQorCit2b2lkIFNlbGVjdEVsZW1lbnQ6OnVwZGF0ZUxpc3RCb3hTZWxl
Y3Rpb24oU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGJvb2wgZGVz
ZWxlY3RPdGhlck9wdGlvbnMpCit7CisgICAgQVNTRVJUKGVsZW1lbnQtPnJlbmRlcmVyKCkgJiYg
ZWxlbWVudC0+cmVuZGVyZXIoKS0+aXNMaXN0Qm94KCkpOworICAgIEFTU0VSVChkYXRhLmFjdGl2
ZVNlbGVjdGlvbkFuY2hvckluZGV4KCkgPj0gMCk7CisKKyAgICB1bnNpZ25lZCBzdGFydCA9IG1p
bihkYXRhLmFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KCksIGRhdGEuYWN0aXZlU2VsZWN0aW9u
RW5kSW5kZXgoKSk7CisgICAgdW5zaWduZWQgZW5kID0gbWF4KGRhdGEuYWN0aXZlU2VsZWN0aW9u
QW5jaG9ySW5kZXgoKSwgZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpKTsKKyAgICBWZWN0
b3I8Ym9vbD4mIGNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uID0gZGF0YS5jYWNoZWRTdGF0
ZUZvckFjdGl2ZVNlbGVjdGlvbigpOworCisgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRl
bXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgT3B0aW9uRWxlbWVudCogb3B0aW9uRWxl
bWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSk7CisgICAgICAgIGlmICghb3B0aW9uRWxl
bWVudCB8fCBpdGVtc1tpXS0+ZGlzYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgIGlmIChpID49IHN0YXJ0ICYmIGkgPD0gZW5kKQorICAgICAgICAgICAgb3B0aW9uRWxl
bWVudC0+c2V0U2VsZWN0ZWRTdGF0ZShkYXRhLmFjdGl2ZVNlbGVjdGlvblN0YXRlKCkpOworICAg
ICAgICBlbHNlIGlmIChkZXNlbGVjdE90aGVyT3B0aW9ucyB8fCBpID49IGNhY2hlZFN0YXRlRm9y
QWN0aXZlU2VsZWN0aW9uLnNpemUoKSkKKyAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQtPnNldFNl
bGVjdGVkU3RhdGUoZmFsc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvcHRpb25FbGVt
ZW50LT5zZXRTZWxlY3RlZFN0YXRlKGNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uW2ldKTsK
KyAgICB9CisKKyAgICBzY3JvbGxUb1NlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsKK30KKwordm9p
ZCBTZWxlY3RFbGVtZW50OjpsaXN0Qm94T25DaGFuZ2UoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEs
IEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgQVNTRVJUKCFkYXRhLnVzZXNNZW51TGlzdCgpKTsK
KworICAgIFZlY3Rvcjxib29sPiYgbGFzdE9uQ2hhbmdlU2VsZWN0aW9uID0gZGF0YS5sYXN0T25D
aGFuZ2VTZWxlY3Rpb24oKTsgCisgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBk
YXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKworICAgIC8vIElmIHRoZSBjYWNoZWQgc2VsZWN0aW9u
IGxpc3QgaXMgZW1wdHksIG9yIHRoZSBzaXplIGhhcyBjaGFuZ2VkLCB0aGVuIGZpcmUgZGlzcGF0
Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50LCBhbmQgcmV0dXJuIGVhcmx5LgorICAgIGlmIChsYXN0
T25DaGFuZ2VTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IGxhc3RPbkNoYW5nZVNlbGVjdGlvbi5zaXpl
KCkgIT0gaXRlbXMuc2l6ZSgpKSB7CisgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoRm9ybUNvbnRy
b2xDaGFuZ2VFdmVudCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVXBkYXRl
IGxhc3RPbkNoYW5nZVNlbGVjdGlvbiBhbmQgZmlyZSBkaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdl
RXZlbnQKKyAgICBib29sIGZpcmVPbkNoYW5nZSA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBPcHRpb25FbGVtZW50KiBv
cHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKKyAgICAgICAgYm9vbCBz
ZWxlY3RlZCA9IG9wdGlvbkVsZW1lbnQgPyBvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpIDogZmFs
c2U7CisgICAgICAgIGlmIChzZWxlY3RlZCAhPSBsYXN0T25DaGFuZ2VTZWxlY3Rpb25baV0pCisg
ICAgICAgICAgICBmaXJlT25DaGFuZ2UgPSB0cnVlOworICAgICAgICBsYXN0T25DaGFuZ2VTZWxl
Y3Rpb25baV0gPSBzZWxlY3RlZDsKKyAgICB9CisKKyAgICBpZiAoZmlyZU9uQ2hhbmdlKQorICAg
ICAgICBlbGVtZW50LT5kaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQoKTsKK30KKwordm9p
ZCBTZWxlY3RFbGVtZW50OjptZW51TGlzdE9uQ2hhbmdlKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRh
LCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIEFTU0VSVChkYXRhLnVzZXNNZW51TGlzdCgpKTsK
KworICAgIGludCBzZWxlY3RlZCA9IHNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCk7CisgICAg
aWYgKGRhdGEubGFzdE9uQ2hhbmdlSW5kZXgoKSAhPSBzZWxlY3RlZCkgeworICAgICAgICBkYXRh
LnNldExhc3RPbkNoYW5nZUluZGV4KHNlbGVjdGVkKTsKKyAgICAgICAgZWxlbWVudC0+ZGlzcGF0
Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50KCk7CisgICAgfQorfQorCit2b2lkIFNlbGVjdEVsZW1l
bnQ6OnNjcm9sbFRvU2VsZWN0aW9uKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBl
bGVtZW50KQoreworICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCkp
CisgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpc3RCb3gqPihyZW5kZXJlciktPnNlbGVjdGlv
bkNoYW5nZWQoKTsKK30KKwordm9pZCBTZWxlY3RFbGVtZW50OjpyZWNhbGNTdHlsZShTZWxlY3RF
bGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyID0gZWxlbWVudC0+cmVuZGVyZXIoKTsKKyAgICBpZiAoZWxlbWVudC0+Y2hpbGRO
ZWVkc1N0eWxlUmVjYWxjKCkgJiYgcmVuZGVyZXIpIHsKKyAgICAgICAgaWYgKGRhdGEudXNlc01l
bnVMaXN0KCkpCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJNZW51TGlzdCo+KHJlbmRl
cmVyKS0+c2V0T3B0aW9uc0NoYW5nZWQodHJ1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IHN0YXRpY19jYXN0PFJlbmRlckxpc3RCb3gqPihyZW5kZXJlciktPnNldE9wdGlvbnNDaGFuZ2Vk
KHRydWUpOworICAgIH0gZWxzZSBpZiAoZGF0YS5zaG91bGRSZWNhbGNMaXN0SXRlbXMoKSkKKyAg
ICAgICAgcmVjYWxjTGlzdEl0ZW1zKGRhdGEsIGVsZW1lbnQpOworfQorCit2b2lkIFNlbGVjdEVs
ZW1lbnQ6OnNldFJlY2FsY0xpc3RJdGVtcyhTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVu
dCogZWxlbWVudCkKK3sKKyAgICBkYXRhLnNldFNob3VsZFJlY2FsY0xpc3RJdGVtcyh0cnVlKTsK
KyAgICBkYXRhLnNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KC0xKTsgLy8gTWFudWFsIHNl
bGVjdGlvbiBhbmNob3IgaXMgcmVzZXQgd2hlbiBtYW5pcHVsYXRpbmcgdGhlIHNlbGVjdCBwcm9n
cmFtbWF0aWNhbGx5LgorICAgIGlmIChSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gZWxlbWVudC0+
cmVuZGVyZXIoKSkgeworICAgICAgICBpZiAoZGF0YS51c2VzTWVudUxpc3QoKSkKKyAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFJlbmRlck1lbnVMaXN0Kj4ocmVuZGVyZXIpLT5zZXRPcHRpb25zQ2hh
bmdlZCh0cnVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVy
TGlzdEJveCo+KHJlbmRlcmVyKS0+c2V0T3B0aW9uc0NoYW5nZWQodHJ1ZSk7CisgICAgfQorICAg
IGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKK30KKwordm9pZCBTZWxlY3RFbGVtZW50
OjpyZWNhbGNMaXN0SXRlbXMoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIGNvbnN0IEVsZW1lbnQq
IGVsZW1lbnQsIGJvb2wgdXBkYXRlU2VsZWN0ZWRTdGF0ZXMpCit7CisgICAgVmVjdG9yPEVsZW1l
bnQqPiYgbGlzdEl0ZW1zID0gZGF0YS5yYXdMaXN0SXRlbXMoKTsKKyAgICBsaXN0SXRlbXMuY2xl
YXIoKTsKKworICAgIE9wdGlvbkVsZW1lbnQqIGZvdW5kU2VsZWN0ZWQgPSAwOworICAgIGZvciAo
Tm9kZSogY3VycmVudE5vZGUgPSBlbGVtZW50LT5maXJzdENoaWxkKCk7IGN1cnJlbnROb2RlOykg
eworICAgICAgICBpZiAoIWN1cnJlbnROb2RlLT5pc0VsZW1lbnROb2RlKCkpIHsKKyAgICAgICAg
ICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUtPnRyYXZlcnNlTmV4dFNpYmxpbmcoZWxlbWVu
dCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEVsZW1lbnQq
IGN1cnJlbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4oY3VycmVudE5vZGUpOworCisgICAgICAg
IC8vIG9wdGdyb3VwIHRhZ3MgbWF5IG5vdCBuZXN0LiBIb3dldmVyLCBib3RoIEZpcmVGb3ggYW5k
IElFIHdpbGwKKyAgICAgICAgLy8gZmxhdHRlbiB0aGUgdHJlZSBhdXRvbWF0aWNhbGx5LCBzbyB3
ZSBmb2xsb3cgc3VpdC4KKyAgICAgICAgLy8gKGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEv
aW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjYpCisgICAgICAgIGlmIChpc09wdGlvbkdyb3VwRWxl
bWVudChjdXJyZW50KSkgeworICAgICAgICAgICAgbGlzdEl0ZW1zLmFwcGVuZChjdXJyZW50KTsK
KyAgICAgICAgICAgIGlmIChjdXJyZW50LT5maXJzdENoaWxkKCkpIHsKKyAgICAgICAgICAgICAg
ICBjdXJyZW50Tm9kZSA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChPcHRpb25F
bGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGN1cnJlbnQpKSB7CisgICAg
ICAgICAgICBsaXN0SXRlbXMuYXBwZW5kKGN1cnJlbnQpOworCisgICAgICAgICAgICBpZiAodXBk
YXRlU2VsZWN0ZWRTdGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kU2VsZWN0ZWQg
JiYgKGRhdGEudXNlc01lbnVMaXN0KCkgfHwgKCFkYXRhLm11bHRpcGxlKCkgJiYgb3B0aW9uRWxl
bWVudC0+c2VsZWN0ZWQoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQg
PSBvcHRpb25FbGVtZW50OworICAgICAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5zZXRT
ZWxlY3RlZFN0YXRlKHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmRTZWxl
Y3RlZCAmJiAhZGF0YS5tdWx0aXBsZSgpICYmIG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVkKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZC0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxz
ZSk7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQgPSBvcHRpb25FbGVtZW50Owor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlm
IChjdXJyZW50LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aHJUYWcpKQorICAgICAgICAgICAgbGlz
dEl0ZW1zLmFwcGVuZChjdXJyZW50KTsKKworICAgICAgICAvLyBJbiBjb25mb3JtaW5nIEhUTUwg
Y29kZSwgb25seSA8b3B0Z3JvdXA+IGFuZCA8b3B0aW9uPiB3aWxsIGJlIGZvdW5kCisgICAgICAg
IC8vIHdpdGhpbiBhIDxzZWxlY3Q+LiBXZSBjYWxsIHRyYXZlcnNlTmV4dFNpYmxpbmcgc28gdGhh
dCB3ZSBvbmx5IHN0ZXAKKyAgICAgICAgLy8gaW50byB0aG9zZSB0YWdzIHRoYXQgd2UgY2hvb3Nl
IHRvLiBGb3Igd2ViLWNvbXBhdCwgd2Ugc2hvdWxkIGNvcGUKKyAgICAgICAgLy8gd2l0aCB0aGUg
Y2FzZSB3aGVyZSBvZGQgdGFncyBsaWtlIGEgPGRpdj4gaGF2ZSBiZWVuIGFkZGVkIGJ1dCB3ZQor
ICAgICAgICAvLyBoYW5kbGUgdGhpcyBiZWNhdXNlIHN1Y2ggdGFncyBoYXZlIGFscmVhZHkgYmVl
biByZW1vdmVkIGZyb20gdGhlCisgICAgICAgIC8vIDxzZWxlY3Q+J3Mgc3VidHJlZSBhdCB0aGlz
IHBvaW50LgorICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLT50cmF2ZXJzZU5leHRT
aWJsaW5nKGVsZW1lbnQpOworICAgIH0KKworICAgIGRhdGEuc2V0U2hvdWxkUmVjYWxjTGlzdEl0
ZW1zKGZhbHNlKTsKK30KKworaW50IFNlbGVjdEVsZW1lbnQ6OnNlbGVjdGVkSW5kZXgoY29uc3Qg
U2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAg
dW5zaWduZWQgaW5kZXggPSAwOworCisgICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIGZp
cnN0IG9wdGlvbiBzZWxlY3RlZAorICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0g
ZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkg
PCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9u
RWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSkpIHsKKyAgICAgICAgICAgIGlmIChv
cHRpb25FbGVtZW50LT5zZWxlY3RlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsK
KyAgICAgICAgICAgICsraW5kZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLTE7
Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6c2V0U2VsZWN0ZWRJbmRleChTZWxlY3RFbGVtZW50
RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgaW50IG9wdGlvbkluZGV4LCBib29sIGRlc2Vs
ZWN0LCBib29sIGZpcmVPbkNoYW5nZSkKK3sKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBp
dGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGludCBsaXN0SW5kZXggPSBvcHRp
b25Ub0xpc3RJbmRleChkYXRhLCBlbGVtZW50LCBvcHRpb25JbmRleCk7CisgICAgaWYgKCFkYXRh
Lm11bHRpcGxlKCkpCisgICAgICAgIGRlc2VsZWN0ID0gdHJ1ZTsKKworICAgIEVsZW1lbnQqIGV4
Y2x1ZGVFbGVtZW50ID0gMDsKKyAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9
IChsaXN0SW5kZXggPj0gMCA/IHRvT3B0aW9uRWxlbWVudChpdGVtc1tsaXN0SW5kZXhdKSA6IDAp
KSB7CisgICAgICAgIGV4Y2x1ZGVFbGVtZW50ID0gaXRlbXNbbGlzdEluZGV4XTsKKyAgICAgICAg
aWYgKGRhdGEuYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoKSA8IDAgfHwgZGVzZWxlY3QpCisg
ICAgICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChkYXRhLCBlbGVtZW50LCBs
aXN0SW5kZXgpOworICAgICAgICBpZiAoZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpIDwg
MCB8fCBkZXNlbGVjdCkKKyAgICAgICAgICAgIHNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGRh
dGEsIGxpc3RJbmRleCk7CisgICAgICAgIG9wdGlvbkVsZW1lbnQtPnNldFNlbGVjdGVkU3RhdGUo
dHJ1ZSk7CisgICAgfQorCisgICAgaWYgKGRlc2VsZWN0KQorICAgICAgICBkZXNlbGVjdEl0ZW1z
KGRhdGEsIGVsZW1lbnQsIGV4Y2x1ZGVFbGVtZW50KTsKKworICAgIC8vIEZvciB0aGUgbWVudSBs
aXN0IGNhc2UsIHRoaXMgaXMgd2hhdCBtYWtlcyB0aGUgc2VsZWN0ZWQgZWxlbWVudCBhcHBlYXIu
CisgICAgaWYgKFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBlbGVtZW50LT5yZW5kZXJlcigpKQor
ICAgICAgICByZW5kZXJlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKKworICAgIHNjcm9sbFRvU2Vs
ZWN0aW9uKGRhdGEsIGVsZW1lbnQpOworCisgICAgLy8gVGhpcyBvbmx5IGdldHMgY2FsbGVkIHdp
dGggZmlyZU9uQ2hhbmdlIGZvciBtZW51IGxpc3RzLiAKKyAgICBpZiAoZmlyZU9uQ2hhbmdlICYm
IGRhdGEudXNlc01lbnVMaXN0KCkpCisgICAgICAgIG1lbnVMaXN0T25DaGFuZ2UoZGF0YSwgZWxl
bWVudCk7CisKKyAgICBpZiAoRnJhbWUqIGZyYW1lID0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJh
bWUoKSkKKyAgICAgICAgZnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5mb3JtU3Rh
dGVEaWRDaGFuZ2UoZWxlbWVudCk7Cit9CisKK2ludCBTZWxlY3RFbGVtZW50OjpvcHRpb25Ub0xp
c3RJbmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgY29uc3QgRWxlbWVudCogZWxl
bWVudCwgaW50IG9wdGlvbkluZGV4KQoreworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0
ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisgICAgaW50IGxpc3RTaXplID0gKGludCkg
aXRlbXMuc2l6ZSgpOworICAgIGlmIChvcHRpb25JbmRleCA8IDAgfHwgb3B0aW9uSW5kZXggPj0g
bGlzdFNpemUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGludCBvcHRpb25JbmRleDIgPSAt
MTsKKyAgICBmb3IgKGludCBsaXN0SW5kZXggPSAwOyBsaXN0SW5kZXggPCBsaXN0U2l6ZTsgKyts
aXN0SW5kZXgpIHsKKyAgICAgICAgaWYgKGlzT3B0aW9uRWxlbWVudChpdGVtc1tsaXN0SW5kZXhd
KSkgeworICAgICAgICAgICAgKytvcHRpb25JbmRleDI7CisgICAgICAgICAgICBpZiAob3B0aW9u
SW5kZXgyID09IG9wdGlvbkluZGV4KQorICAgICAgICAgICAgICAgIHJldHVybiBsaXN0SW5kZXg7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBTZWxlY3RFbGVt
ZW50OjpsaXN0VG9PcHRpb25JbmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgY29u
c3QgRWxlbWVudCogZWxlbWVudCwgaW50IGxpc3RJbmRleCkKK3sKKyAgICBjb25zdCBWZWN0b3I8
RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGlmIChsaXN0
SW5kZXggPCAwIHx8IGxpc3RJbmRleCA+PSBpbnQoaXRlbXMuc2l6ZSgpKSB8fAorICAgICAgICAh
aXNPcHRpb25FbGVtZW50KGl0ZW1zW2xpc3RJbmRleF0pKQorICAgICAgICByZXR1cm4gLTE7CisK
KyAgICBpbnQgb3B0aW9uSW5kZXggPSAwOyAvLyBhY3R1YWwgaW5kZXggb2Ygb3B0aW9uIG5vdCBj
b3VudGluZyBPUFRHUk9VUCBlbnRyaWVzIHRoYXQgbWF5IGJlIGluIGxpc3QKKyAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IGxpc3RJbmRleDsgKytpKQorICAgICAgICBpZiAoaXNPcHRpb25FbGVtZW50
KGl0ZW1zW2ldKSkKKyAgICAgICAgICAgICsrb3B0aW9uSW5kZXg7CisKKyAgICByZXR1cm4gb3B0
aW9uSW5kZXg7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6ZGlzcGF0Y2hGb2N1c0V2ZW50KFNl
bGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8vIFNhdmUg
dGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIG5ldyBzZWxlY3Rpb24g
d2hlbiBkaXNwYXRjaGluZyBjaGFuZ2UgZXZlbnRzIGR1cmluZyBibHVyIGV2ZW50IGRpc3BhdGNo
YWwKKyAgICBpZiAoZGF0YS51c2VzTWVudUxpc3QoKSkKKyAgICAgICAgc2F2ZUxhc3RTZWxlY3Rp
b24oZGF0YSwgZWxlbWVudCk7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6ZGlzcGF0Y2hCbHVy
RXZlbnQoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAg
Ly8gV2Ugb25seSBuZWVkIHRvIGZpcmUgY2hhbmdlIGV2ZW50cyBoZXJlIGZvciBtZW51IGxpc3Rz
LCBiZWNhdXNlIHdlIGZpcmUgY2hhbmdlIGV2ZW50cyBmb3IgbGlzdCBib3hlcyB3aGVuZXZlciB0
aGUgc2VsZWN0aW9uIGNoYW5nZSBpcyBhY3R1YWxseSBtYWRlLgorICAgIC8vIFRoaXMgbWF0Y2hl
cyBvdGhlciBicm93c2VycycgYmVoYXZpb3IuCisgICAgaWYgKGRhdGEudXNlc01lbnVMaXN0KCkp
CisgICAgICAgIG1lbnVMaXN0T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7Cit9CisKK3ZvaWQgU2Vs
ZWN0RWxlbWVudDo6ZGVzZWxlY3RJdGVtcyhTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVu
dCogZWxlbWVudCwgRWxlbWVudCogZXhjbHVkZUVsZW1lbnQpCit7CisgICAgY29uc3QgVmVjdG9y
PEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGl0ZW1z
W2ldID09IGV4Y2x1ZGVFbGVtZW50KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
aWYgKE9wdGlvbkVsZW1lbnQqIG9wdGlvbkVsZW1lbnQgPSB0b09wdGlvbkVsZW1lbnQoaXRlbXNb
aV0pKQorICAgICAgICAgICAgb3B0aW9uRWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7
CisgICAgfQorfQorCitib29sIFNlbGVjdEVsZW1lbnQ6OnNhdmVGb3JtQ29udHJvbFN0YXRlKGNv
bnN0IFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBFbGVtZW50KiBlbGVtZW50LCBTdHJp
bmcmIHZhbHVlKQoreworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5s
aXN0SXRlbXMoZWxlbWVudCk7CisgICAgaW50IGxlbmd0aCA9IGl0ZW1zLnNpemUoKTsKKworICAg
IFZlY3RvcjxjaGFyLCAxMDI0PiBjaGFyYWN0ZXJzKGxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVt
ZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKKyAgICAgICAgYm9vbCBzZWxlY3RlZCA9
IG9wdGlvbkVsZW1lbnQgPyBvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpIDogZmFsc2U7CisgICAg
ICAgIGNoYXJhY3RlcnNbaV0gPSBzZWxlY3RlZCA/ICdYJyA6ICcuJzsKKyAgICB9CisKKyAgICB2
YWx1ZSA9IFN0cmluZyhjaGFyYWN0ZXJzLmRhdGEoKSwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKwordm9pZCBTZWxlY3RFbGVtZW50OjpyZXN0b3JlRm9ybUNvbnRyb2xTdGF0ZShTZWxl
Y3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgY29uc3QgU3RyaW5nJiBzdGF0
ZSkKK3sKKyAgICByZWNhbGNMaXN0SXRlbXMoZGF0YSwgZWxlbWVudCk7CisKKyAgICBjb25zdCBW
ZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGlu
dCBsZW5ndGggPSBpdGVtcy5zaXplKCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0
aDsgKytpKSB7CisgICAgICAgIGlmIChPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9P
cHRpb25FbGVtZW50KGl0ZW1zW2ldKSkKKyAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQtPnNldFNl
bGVjdGVkU3RhdGUoc3RhdGVbaV0gPT0gJ1gnKTsKKyAgICB9CisKKyAgICBlbGVtZW50LT5zZXRO
ZWVkc1N0eWxlUmVjYWxjKCk7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6cGFyc2VNdWx0aXBs
ZUF0dHJpYnV0ZShTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgTWFw
cGVkQXR0cmlidXRlKiBhdHRyaWJ1dGUpCit7CisgICAgYm9vbCBvbGRVc2VzTWVudUxpc3QgPSBk
YXRhLnVzZXNNZW51TGlzdCgpOworICAgIGRhdGEuc2V0TXVsdGlwbGUoIWF0dHJpYnV0ZS0+aXNO
dWxsKCkpOworICAgIGlmIChvbGRVc2VzTWVudUxpc3QgIT0gZGF0YS51c2VzTWVudUxpc3QoKSAm
JiBlbGVtZW50LT5hdHRhY2hlZCgpKSB7CisgICAgICAgIGVsZW1lbnQtPmRldGFjaCgpOworICAg
ICAgICBlbGVtZW50LT5hdHRhY2goKTsKKyAgICB9Cit9CisKK2Jvb2wgU2VsZWN0RWxlbWVudDo6
YXBwZW5kRm9ybURhdGEoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQs
IEZvcm1EYXRhTGlzdCYgbGlzdCkKK3sKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUgPSBl
bGVtZW50LT5mb3JtQ29udHJvbE5hbWUoKTsKKyAgICBpZiAobmFtZS5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgc3VjY2Vzc2Z1bCA9IGZhbHNlOworICAgIGNv
bnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tp
XSk7CisgICAgICAgIGlmIChvcHRpb25FbGVtZW50ICYmIG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVk
KCkpIHsKKyAgICAgICAgICAgIGxpc3QuYXBwZW5kRGF0YShuYW1lLCBvcHRpb25FbGVtZW50LT52
YWx1ZSgpKTsKKyAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOworICAgICAgICB9CisgICAg
fQorCisgICAgLy8gIyMjIHRoaXMgY2FzZSBzaG91bGQgbm90IGhhcHBlbi4gbWFrZSBzdXJlIHRo
YXQgd2Ugc2VsZWN0IHRoZSBmaXJzdCBvcHRpb24KKyAgICAvLyBpbiBhbnkgY2FzZS4gb3RoZXJ3
aXNlIHdlIGhhdmUgbm8gY29uc2lzdGVuY3kgd2l0aCB0aGUgRE9NIGludGVyZmFjZS4gRklYTUUh
CisgICAgLy8gd2UgcmV0dXJuIHRoZSBmaXJzdCBvbmUgaWYgaXQgd2FzIGEgY29tYm9ib3ggc2Vs
ZWN0CisgICAgaWYgKCFzdWNjZXNzZnVsICYmICFkYXRhLm11bHRpcGxlKCkgJiYgZGF0YS5zaXpl
KCkgPD0gMSAmJiBpdGVtcy5zaXplKCkpIHsKKyAgICAgICAgT3B0aW9uRWxlbWVudCogb3B0aW9u
RWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1swXSk7CisgICAgICAgIGNvbnN0IEF0b21p
Y1N0cmluZyYgdmFsdWUgPSBvcHRpb25FbGVtZW50LT52YWx1ZSgpOworICAgICAgICBpZiAodmFs
dWUuaXNOdWxsKCkpCisgICAgICAgICAgICBsaXN0LmFwcGVuZERhdGEobmFtZSwgb3B0aW9uRWxl
bWVudC0+dGV4dCgpLnN0cmlwV2hpdGVTcGFjZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgbGlzdC5hcHBlbmREYXRhKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgc3VjY2Vzc2Z1bCA9IHRy
dWU7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3NmdWw7Cit9IAorCit2b2lkIFNlbGVjdEVs
ZW1lbnQ6OnJlc2V0KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQor
eworICAgIGJvb2wgb3B0aW9uU2VsZWN0ZWQgPSBmYWxzZTsKKyAgICBPcHRpb25FbGVtZW50KiBm
aXJzdE9wdGlvbiA9IDA7CisKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRh
dGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVt
cy5zaXplKCk7ICsraSkgeworICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0g
dG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKKyAgICAgICAgaWYgKCFvcHRpb25FbGVtZW50KQor
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKCFpdGVtc1tpXS0+Z2V0QXR0cmli
dXRlKEhUTUxOYW1lczo6c2VsZWN0ZWRBdHRyKS5pc051bGwoKSkgeworICAgICAgICAgICAgb3B0
aW9uRWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIG9wdGlvblNl
bGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBvcHRpb25FbGVtZW50
LT5zZXRTZWxlY3RlZFN0YXRlKGZhbHNlKTsKKworICAgICAgICBpZiAoIWZpcnN0T3B0aW9uKQor
ICAgICAgICAgICAgZmlyc3RPcHRpb24gPSBvcHRpb25FbGVtZW50OworICAgIH0KKworICAgIGlm
ICghb3B0aW9uU2VsZWN0ZWQgJiYgZmlyc3RPcHRpb24gJiYgZGF0YS51c2VzTWVudUxpc3QoKSkK
KyAgICAgICAgZmlyc3RPcHRpb24tPnNldFNlbGVjdGVkU3RhdGUodHJ1ZSk7CisKKyAgICBlbGVt
ZW50LT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6bWVu
dUxpc3REZWZhdWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50
KiBlbGVtZW50LCBFdmVudCogZXZlbnQsIEhUTUxGb3JtRWxlbWVudCogaHRtbEZvcm0pCit7Cisj
aWYgIUFSUk9XX0tFWVNfUE9QX01FTlUKKyAgICBVTlVTRURfUEFSQU0oaHRtbEZvcm0pOworI2Vu
ZGlmCisKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gZWxlbWVudC0+cmVuZGVyZXIoKTsK
KyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkua2V5ZG93bkV2ZW50KSB7Cisg
ICAgICAgIGlmICghcmVuZGVyZXIgfHwgIWV2ZW50LT5pc0tleWJvYXJkRXZlbnQoKSkKKyAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICBTdHJpbmcga2V5SWRlbnRpZmllciA9IHN0YXRpY19j
YXN0PEtleWJvYXJkRXZlbnQqPihldmVudCktPmtleUlkZW50aWZpZXIoKTsKKyAgICAgICAgYm9v
bCBoYW5kbGVkID0gZmFsc2U7CisKKyNpZiBBUlJPV19LRVlTX1BPUF9NRU5VCisgICAgICAgIGlm
IChrZXlJZGVudGlmaWVyID09ICJEb3duIiB8fCBrZXlJZGVudGlmaWVyID09ICJVcCIpIHsKKyAg
ICAgICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7CisgICAgICAgICAgICAvLyBTYXZlIHRoZSBzZWxl
Y3Rpb24gc28gaXQgY2FuIGJlIGNvbXBhcmVkIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHdoZW4gZGlz
cGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgc2V0U2VsZWN0ZWRJbmRleCwKKyAgICAgICAg
ICAgIC8vIHdoaWNoIGdldHMgY2FsbGVkIGZyb20gUmVuZGVyTWVudUxpc3Q6OnZhbHVlQ2hhbmdl
ZCwgd2hpY2ggZ2V0cyBjYWxsZWQgYWZ0ZXIgdGhlIHVzZXIgbWFrZXMgYSBzZWxlY3Rpb24gZnJv
bSB0aGUgbWVudS4KKyAgICAgICAgICAgIHNhdmVMYXN0U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQp
OworICAgICAgICAgICAgaWYgKFJlbmRlck1lbnVMaXN0KiBtZW51TGlzdCA9IHN0YXRpY19jYXN0
PFJlbmRlck1lbnVMaXN0Kj4ocmVuZGVyZXIpKQorICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5z
aG93UG9wdXAoKTsKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICB9CisjZWxz
ZQorICAgICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBkYXRhLmxpc3RJ
dGVtcyhlbGVtZW50KTsKKyAgICAgICAgaW50IHNpemUgPSBsaXN0SXRlbXMuc2l6ZSgpOworCisg
ICAgICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChkYXRhLCBlbGVtZW50LCBz
ZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1lbnQpKTsKKyAgICAgICAgaWYgKGtleUlkZW50aWZpZXIg
PT0gIkRvd24iIHx8IGtleUlkZW50aWZpZXIgPT0gIlJpZ2h0IikgeworICAgICAgICAgICAgZm9y
IChsaXN0SW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICAgbGlzdEluZGV4ID49IDAgJiYgbGlz
dEluZGV4IDwgc2l6ZSAmJiAobGlzdEl0ZW1zW2xpc3RJbmRleF0tPmRpc2FibGVkKCkgfHwgIWlz
T3B0aW9uRWxlbWVudChsaXN0SXRlbXNbbGlzdEluZGV4XSkpOworICAgICAgICAgICAgICAgICAr
K2xpc3RJbmRleCkgeyB9CisgICAgICAgICAgICBpZiAobGlzdEluZGV4ID49IDAgJiYgbGlzdElu
ZGV4IDwgc2l6ZSkKKyAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1l
bnQsIGxpc3RUb09wdGlvbkluZGV4KGRhdGEsIGVsZW1lbnQsIGxpc3RJbmRleCkpOworICAgICAg
ICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5SWRlbnRpZmllciA9
PSAiVXAiIHx8IGtleUlkZW50aWZpZXIgPT0gIkxlZnQiKSB7CisgICAgICAgICAgICBmb3IgKGxp
c3RJbmRleCAtPSAxOworICAgICAgICAgICAgICAgICBsaXN0SW5kZXggPj0gMCAmJiBsaXN0SW5k
ZXggPCBzaXplICYmIChsaXN0SXRlbXNbbGlzdEluZGV4XS0+ZGlzYWJsZWQoKSB8fCAhaXNPcHRp
b25FbGVtZW50KGxpc3RJdGVtc1tsaXN0SW5kZXhdKSk7CisgICAgICAgICAgICAgICAgIC0tbGlz
dEluZGV4KSB7IH0KKyAgICAgICAgICAgIGlmIChsaXN0SW5kZXggPj0gMCAmJiBsaXN0SW5kZXgg
PCBzaXplKQorICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCwg
bGlzdFRvT3B0aW9uSW5kZXgoZGF0YSwgZWxlbWVudCwgbGlzdEluZGV4KSk7CisgICAgICAgICAg
ICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChoYW5kbGVk
KQorICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgfQorCisgICAg
Ly8gVXNlIGtleSBwcmVzcyBldmVudCBoZXJlIHNpbmNlIHNlbmRpbmcgc2ltdWxhdGVkIG1vdXNl
IGV2ZW50cworICAgIC8vIG9uIGtleSBkb3duIGJsb2NrcyB0aGUgcHJvcGVyIHNlbmRpbmcgb2Yg
dGhlIGtleSBwcmVzcyBldmVudC4KKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVz
KCkua2V5cHJlc3NFdmVudCkgeworICAgICAgICBpZiAoIXJlbmRlcmVyIHx8ICFldmVudC0+aXNL
ZXlib2FyZEV2ZW50KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IGtleUNv
ZGUgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50Kj4oZXZlbnQpLT5rZXlDb2RlKCk7CisgICAg
ICAgIGJvb2wgaGFuZGxlZCA9IGZhbHNlOworCisjaWYgQVJST1dfS0VZU19QT1BfTUVOVQorICAg
ICAgICBpZiAoa2V5Q29kZSA9PSAnICcpIHsKKyAgICAgICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7
CisgICAgICAgICAgICAvLyBTYXZlIHRoZSBzZWxlY3Rpb24gc28gaXQgY2FuIGJlIGNvbXBhcmVk
IHRvIHRoZSBuZXcgc2VsZWN0aW9uIHdoZW4gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJp
bmcgc2V0U2VsZWN0ZWRJbmRleCwKKyAgICAgICAgICAgIC8vIHdoaWNoIGdldHMgY2FsbGVkIGZy
b20gUmVuZGVyTWVudUxpc3Q6OnZhbHVlQ2hhbmdlZCwgd2hpY2ggZ2V0cyBjYWxsZWQgYWZ0ZXIg
dGhlIHVzZXIgbWFrZXMgYSBzZWxlY3Rpb24gZnJvbSB0aGUgbWVudS4KKyAgICAgICAgICAgIHNh
dmVMYXN0U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOworICAgICAgICAgICAgaWYgKFJlbmRlck1l
bnVMaXN0KiBtZW51TGlzdCA9IHN0YXRpY19jYXN0PFJlbmRlck1lbnVMaXN0Kj4ocmVuZGVyZXIp
KQorICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAoKTsKKyAgICAgICAgICAgIGhh
bmRsZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT0gJ1xyJykgeworICAg
ICAgICAgICAgbWVudUxpc3RPbkNoYW5nZShkYXRhLCBlbGVtZW50KTsKKyAgICAgICAgICAgIGlm
IChodG1sRm9ybSkKKyAgICAgICAgICAgICAgICBodG1sRm9ybS0+c3VibWl0Q2xpY2soZXZlbnQp
OworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAg
IGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChkYXRhLCBlbGVtZW50LCBzZWxlY3Rl
ZEluZGV4KGRhdGEsIGVsZW1lbnQpKTsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gJ1xyJykgewor
ICAgICAgICAgICAgLy8gbGlzdEluZGV4IHNob3VsZCBhbHJlYWR5IGJlIHNlbGVjdGVkLCBidXQg
dGhpcyB3aWxsIGZpcmUgdGhlIG9uY2hhbmdlIGhhbmRsZXIuCisgICAgICAgICAgICBzZXRTZWxl
Y3RlZEluZGV4KGRhdGEsIGVsZW1lbnQsIGxpc3RUb09wdGlvbkluZGV4KGRhdGEsIGVsZW1lbnQs
IGxpc3RJbmRleCksIHRydWUsIHRydWUpOworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Cisg
ICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoaGFuZGxlZCkKKyAgICAgICAgICAgIGV2ZW50
LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgIH0KKworICAgIGlmIChldmVudC0+dHlwZSgpID09
IGV2ZW50TmFtZXMoKS5tb3VzZWRvd25FdmVudCAmJiBldmVudC0+aXNNb3VzZUV2ZW50KCkgJiYg
c3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2ZW50KS0+YnV0dG9uKCkgPT0gTGVmdEJ1dHRvbikg
eworICAgICAgICBlbGVtZW50LT5mb2N1cygpOworICAgICAgICBpZiAoUmVuZGVyTWVudUxpc3Qq
IG1lbnVMaXN0ID0gc3RhdGljX2Nhc3Q8UmVuZGVyTWVudUxpc3QqPihyZW5kZXJlcikpIHsKKyAg
ICAgICAgICAgIGlmIChtZW51TGlzdC0+cG9wdXBJc1Zpc2libGUoKSkKKyAgICAgICAgICAgICAg
ICBtZW51TGlzdC0+aGlkZVBvcHVwKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
ICAgICAvLyBTYXZlIHRoZSBzZWxlY3Rpb24gc28gaXQgY2FuIGJlIGNvbXBhcmVkIHRvIHRoZSBu
ZXcgc2VsZWN0aW9uIHdoZW4gd2UgY2FsbCBvbkNoYW5nZSBkdXJpbmcgc2V0U2VsZWN0ZWRJbmRl
eCwKKyAgICAgICAgICAgICAgICAvLyB3aGljaCBnZXRzIGNhbGxlZCBmcm9tIFJlbmRlck1lbnVM
aXN0Ojp2YWx1ZUNoYW5nZWQsIHdoaWNoIGdldHMgY2FsbGVkIGFmdGVyIHRoZSB1c2VyIG1ha2Vz
IGEgc2VsZWN0aW9uIGZyb20gdGhlIG1lbnUuCisgICAgICAgICAgICAgICAgc2F2ZUxhc3RTZWxl
Y3Rpb24oZGF0YSwgZWxlbWVudCk7CisgICAgICAgICAgICAgICAgbWVudUxpc3QtPnNob3dQb3B1
cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0
SGFuZGxlZCgpOworICAgIH0KK30KKwordm9pZCBTZWxlY3RFbGVtZW50OjpsaXN0Qm94RGVmYXVs
dEV2ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwg
RXZlbnQqIGV2ZW50LCBIVE1MRm9ybUVsZW1lbnQqIGh0bWxGb3JtKQoreworICAgIFJlbmRlck9i
amVjdCogcmVuZGVyZXIgPSBlbGVtZW50LT5yZW5kZXJlcigpOworICAgIGNvbnN0IFZlY3RvcjxF
bGVtZW50Kj4mIGxpc3RJdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworCisgICAgaWYg
KGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1vdXNlZG93bkV2ZW50ICYmIGV2ZW50LT5p
c01vdXNlRXZlbnQoKSAmJiBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZlbnQpLT5idXR0b24o
KSA9PSBMZWZ0QnV0dG9uKSB7CisgICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7CisKKyAgICAgICAg
Ly8gQ29udmVydCB0byBjb29yZHMgcmVsYXRpdmUgdG8gdGhlIGxpc3QgYm94IGlmIG5lZWRlZC4K
KyAgICAgICAgTW91c2VFdmVudCogbW91c2VFdmVudCA9IHN0YXRpY19jYXN0PE1vdXNlRXZlbnQq
PihldmVudCk7CisgICAgICAgIEludFBvaW50IGxvY2FsT2Zmc2V0ID0gcm91bmRlZEludFBvaW50
KHJlbmRlcmVyLT5hYnNvbHV0ZVRvTG9jYWwobW91c2VFdmVudC0+YWJzb2x1dGVMb2NhdGlvbigp
LCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICBpbnQgbGlzdEluZGV4ID0gc3RhdGljX2Nhc3Q8UmVu
ZGVyTGlzdEJveCo+KHJlbmRlcmVyKS0+bGlzdEluZGV4QXRPZmZzZXQobG9jYWxPZmZzZXQueCgp
LCBsb2NhbE9mZnNldC55KCkpOworICAgICAgICBpZiAobGlzdEluZGV4ID49IDApIHsKKyAgICAg
ICAgICAgIC8vIFNhdmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhl
IG5ldyBzZWxlY3Rpb24gd2hlbiBkaXNwYXRjaGluZyBjaGFuZ2UgZXZlbnRzIGR1cmluZyBtb3Vz
ZXVwLCBvciBhZnRlciBhdXRvc2Nyb2xsIGZpbmlzaGVzLgorICAgICAgICAgICAgc2F2ZUxhc3RT
ZWxlY3Rpb24oZGF0YSwgZWxlbWVudCk7CisKKyAgICAgICAgICAgIGRhdGEuc2V0QWN0aXZlU2Vs
ZWN0aW9uU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJvb2wgbXVsdGlT
ZWxlY3RLZXlQcmVzc2VkID0gZmFsc2U7CisjaWYgUExBVEZPUk0oTUFDKQorICAgICAgICAgICAg
bXVsdGlTZWxlY3RLZXlQcmVzc2VkID0gbW91c2VFdmVudC0+bWV0YUtleSgpOworI2Vsc2UKKyAg
ICAgICAgICAgIG11bHRpU2VsZWN0S2V5UHJlc3NlZCA9IG1vdXNlRXZlbnQtPmN0cmxLZXkoKTsK
KyNlbmRpZgorCisgICAgICAgICAgICBib29sIHNoaWZ0U2VsZWN0ID0gZGF0YS5tdWx0aXBsZSgp
ICYmIG1vdXNlRXZlbnQtPnNoaWZ0S2V5KCk7CisgICAgICAgICAgICBib29sIG11bHRpU2VsZWN0
ID0gZGF0YS5tdWx0aXBsZSgpICYmIG11bHRpU2VsZWN0S2V5UHJlc3NlZCAmJiAhbW91c2VFdmVu
dC0+c2hpZnRLZXkoKTsKKworICAgICAgICAgICAgRWxlbWVudCogY2xpY2tlZEVsZW1lbnQgPSBs
aXN0SXRlbXNbbGlzdEluZGV4XTsgICAgICAgICAgICAKKyAgICAgICAgICAgIE9wdGlvbkVsZW1l
bnQqIG9wdGlvbiA9IHRvT3B0aW9uRWxlbWVudChjbGlja2VkRWxlbWVudCk7CisgICAgICAgICAg
ICBpZiAob3B0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB3aGV0aGVy
IGFuIGFjdGl2ZSBzZWxlY3Rpb24gKGxpa2UgZHVyaW5nIGRyYWcgc2VsZWN0aW9uKSwgc2hvdWxk
IHNlbGVjdCBvciBkZXNlbGVjdAorICAgICAgICAgICAgICAgIGlmIChvcHRpb24tPnNlbGVjdGVk
KCkgJiYgbXVsdGlTZWxlY3RLZXlQcmVzc2VkKQorICAgICAgICAgICAgICAgICAgICBkYXRhLnNl
dEFjdGl2ZVNlbGVjdGlvblN0YXRlKGZhbHNlKTsKKworICAgICAgICAgICAgICAgIGlmICghZGF0
YS5hY3RpdmVTZWxlY3Rpb25TdGF0ZSgpKQorICAgICAgICAgICAgICAgICAgICBvcHRpb24tPnNl
dFNlbGVjdGVkU3RhdGUoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAg
ICAgICAgICAvLyBJZiB3ZSdyZSBub3QgaW4gYW55IHNwZWNpYWwgbXVsdGlwbGUgc2VsZWN0aW9u
IG1vZGUsIHRoZW4gZGVzZWxlY3QgYWxsIG90aGVyIGl0ZW1zLCBleGNsdWRpbmcgdGhlIGNsaWNr
ZWQgb3B0aW9uLgorICAgICAgICAgICAgLy8gSWYgbm8gb3B0aW9uIHdhcyBjbGlja2VkLCB0aGVu
IHRoaXMgd2lsbCBkZXNlbGVjdCBhbGwgaXRlbXMgaW4gdGhlIGxpc3QuCisgICAgICAgICAgICBp
ZiAoIXNoaWZ0U2VsZWN0ICYmICFtdWx0aVNlbGVjdCkKKyAgICAgICAgICAgICAgICBkZXNlbGVj
dEl0ZW1zKGRhdGEsIGVsZW1lbnQsIGNsaWNrZWRFbGVtZW50KTsKKworICAgICAgICAgICAgLy8g
SWYgdGhlIGFuY2hvciBoYXNuJ3QgYmVlbiBzZXQsIGFuZCB3ZSdyZSBkb2luZyBhIHNpbmdsZSBz
ZWxlY3Rpb24gb3IgYSBzaGlmdCBzZWxlY3Rpb24sIHRoZW4gaW5pdGlhbGl6ZSB0aGUgYW5jaG9y
IHRvIHRoZSBmaXJzdCBzZWxlY3RlZCBpbmRleC4KKyAgICAgICAgICAgIGlmIChkYXRhLmFjdGl2
ZVNlbGVjdGlvbkFuY2hvckluZGV4KCkgPCAwICYmICFtdWx0aVNlbGVjdCkKKyAgICAgICAgICAg
ICAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChkYXRhLCBlbGVtZW50LCBzZWxlY3Rl
ZEluZGV4KGRhdGEsIGVsZW1lbnQpKTsKKworICAgICAgICAgICAgLy8gU2V0IHRoZSBzZWxlY3Rp
b24gc3RhdGUgb2YgdGhlIGNsaWNrZWQgb3B0aW9uCisgICAgICAgICAgICBpZiAob3B0aW9uICYm
ICFjbGlja2VkRWxlbWVudC0+ZGlzYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBvcHRpb24tPnNl
dFNlbGVjdGVkU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElmIHRo
ZXJlIHdhcyBubyBzZWxlY3RlZEluZGV4KCkgZm9yIHRoZSBwcmV2aW91cyBpbml0aWFsaXphdGlv
biwgb3IKKyAgICAgICAgICAgIC8vIElmIHdlJ3JlIGRvaW5nIGEgc2luZ2xlIHNlbGVjdGlvbiwg
b3IgYSBtdWx0aXBsZSBzZWxlY3Rpb24gKHVzaW5nIGNtZCBvciBjdHJsKSwgdGhlbiBpbml0aWFs
aXplIHRoZSBhbmNob3IgaW5kZXggdG8gdGhlIGxpc3RJbmRleCB0aGF0IGp1c3QgZ290IGNsaWNr
ZWQuCisgICAgICAgICAgICBpZiAobGlzdEluZGV4ID49IDAgJiYgKGRhdGEuYWN0aXZlU2VsZWN0
aW9uQW5jaG9ySW5kZXgoKSA8IDAgfHwgIXNoaWZ0U2VsZWN0KSkKKyAgICAgICAgICAgICAgICBz
ZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChkYXRhLCBlbGVtZW50LCBsaXN0SW5kZXgpOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChkYXRh
LCBsaXN0SW5kZXgpOworICAgICAgICAgICAgdXBkYXRlTGlzdEJveFNlbGVjdGlvbihkYXRhLCBl
bGVtZW50LCAhbXVsdGlTZWxlY3QpOworCisgICAgICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0g
ZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSkKKyAgICAgICAgICAgICAgICBmcmFtZS0+ZXZl
bnRIYW5kbGVyKCktPnNldE1vdXNlRG93bk1heVN0YXJ0QXV0b3Njcm9sbCgpOworCisgICAgICAg
ICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBp
ZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2V1cEV2ZW50ICYmIGV2ZW50LT5p
c01vdXNlRXZlbnQoKSAmJiBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZlbnQpLT5idXR0b24o
KSA9PSBMZWZ0QnV0dG9uICYmIGVsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCktPmV2ZW50SGFu
ZGxlcigpLT5hdXRvc2Nyb2xsUmVuZGVyZXIoKSAhPSByZW5kZXJlcikKKyAgICAgICAgLy8gVGhp
cyBtYWtlcyBzdXJlIHdlIGZpcmUgZGlzcGF0Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50IGZvciBh
IHNpbmdsZSBjbGljay4gIEZvciBkcmFnIHNlbGVjdGlvbiwgb25DaGFuZ2Ugd2lsbCBmaXJlIHdo
ZW4gdGhlIGF1dG9zY3JvbGwgdGltZXIgc3RvcHMuCisgICAgICAgIGxpc3RCb3hPbkNoYW5nZShk
YXRhLCBlbGVtZW50KTsKKyAgICBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMo
KS5rZXlkb3duRXZlbnQpIHsKKyAgICAgICAgaWYgKCFldmVudC0+aXNLZXlib2FyZEV2ZW50KCkp
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyBrZXlJZGVudGlmaWVyID0gc3Rh
dGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2ZW50KS0+a2V5SWRlbnRpZmllcigpOworCisgICAg
ICAgIGludCBlbmRJbmRleCA9IDA7ICAgICAgICAKKyAgICAgICAgaWYgKGRhdGEuYWN0aXZlU2Vs
ZWN0aW9uRW5kSW5kZXgoKSA8IDApIHsKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGVu
ZCBpbmRleAorICAgICAgICAgICAgaWYgKGtleUlkZW50aWZpZXIgPT0gIkRvd24iKQorICAgICAg
ICAgICAgICAgIGVuZEluZGV4ID0gbmV4dFNlbGVjdGFibGVMaXN0SW5kZXgoZGF0YSwgZWxlbWVu
dCwgbGFzdFNlbGVjdGVkTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQpKTsKKyAgICAgICAgICAgIGVs
c2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIlVwIikKKyAgICAgICAgICAgICAgICBlbmRJbmRleCA9
IHByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBlbGVtZW50LCBvcHRpb25Ub0xpc3RJ
bmRleChkYXRhLCBlbGVtZW50LCBzZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1lbnQpKSk7CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBpbmRleCBiYXNlZCBvbiB0
aGUgY3VycmVudCBlbmQgaW5kZXgKKyAgICAgICAgICAgIGlmIChrZXlJZGVudGlmaWVyID09ICJE
b3duIikKKyAgICAgICAgICAgICAgICBlbmRJbmRleCA9IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4
KGRhdGEsIGVsZW1lbnQsIGRhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSk7CisgICAgICAg
ICAgICBlbHNlIGlmIChrZXlJZGVudGlmaWVyID09ICJVcCIpCisgICAgICAgICAgICAgICAgZW5k
SW5kZXggPSBwcmV2aW91c1NlbGVjdGFibGVMaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgZGF0YS5h
Y3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpKTsgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAg
ICAgIGlmIChrZXlJZGVudGlmaWVyID09ICJEb3duIiB8fCBrZXlJZGVudGlmaWVyID09ICJVcCIp
IHsKKyAgICAgICAgICAgIC8vIFNhdmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFy
ZWQgdG8gdGhlIG5ldyBzZWxlY3Rpb24gd2hlbiBkaXNwYXRjaGluZyBjaGFuZ2UgZXZlbnRzIGlt
bWVkaWF0ZWx5IGFmdGVyIG1ha2luZyB0aGUgbmV3IHNlbGVjdGlvbi4KKyAgICAgICAgICAgIHNh
dmVMYXN0U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOworCisgICAgICAgICAgICBBU1NFUlQoZW5k
SW5kZXggPj0gMCAmJiAodW5zaWduZWQpIGVuZEluZGV4IDwgbGlzdEl0ZW1zLnNpemUoKSk7IAor
ICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoZGF0YSwgZW5kSW5kZXgpOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBJZiB0aGUgYW5jaG9yIGlzIHVuaXRpYWxpemVk
LCBvciBpZiB3ZSdyZSBnb2luZyB0byBkZXNlbGVjdCBhbGwgb3RoZXIgb3B0aW9ucywgdGhlbiBz
ZXQgdGhlIGFuY2hvciBpbmRleCBlcXVhbCB0byB0aGUgZW5kIGluZGV4LgorICAgICAgICAgICAg
Ym9vbCBkZXNlbGVjdE90aGVycyA9ICFkYXRhLm11bHRpcGxlKCkgfHwgIXN0YXRpY19jYXN0PEtl
eWJvYXJkRXZlbnQqPihldmVudCktPnNoaWZ0S2V5KCk7CisgICAgICAgICAgICBpZiAoZGF0YS5h
Y3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpIDwgMCB8fCBkZXNlbGVjdE90aGVycykgeworICAg
ICAgICAgICAgICAgIGRhdGEuc2V0QWN0aXZlU2VsZWN0aW9uU3RhdGUodHJ1ZSk7CisgICAgICAg
ICAgICAgICAgaWYgKGRlc2VsZWN0T3RoZXJzKQorICAgICAgICAgICAgICAgICAgICBkZXNlbGVj
dEl0ZW1zKGRhdGEsIGVsZW1lbnQpOworICAgICAgICAgICAgICAgIHNldEFjdGl2ZVNlbGVjdGlv
bkFuY2hvckluZGV4KGRhdGEsIGVsZW1lbnQsIGRhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgo
KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpc3RC
b3gqPihyZW5kZXJlciktPnNjcm9sbFRvUmV2ZWFsRWxlbWVudEF0TGlzdEluZGV4KGVuZEluZGV4
KTsKKyAgICAgICAgICAgIHVwZGF0ZUxpc3RCb3hTZWxlY3Rpb24oZGF0YSwgZWxlbWVudCwgZGVz
ZWxlY3RPdGhlcnMpOworICAgICAgICAgICAgbGlzdEJveE9uQ2hhbmdlKGRhdGEsIGVsZW1lbnQp
OworICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgICAgIH0KKyAg
ICB9IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleXByZXNzRXZlbnQp
IHsKKyAgICAgICAgaWYgKCFldmVudC0+aXNLZXlib2FyZEV2ZW50KCkpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIGludCBrZXlDb2RlID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+
KGV2ZW50KS0+a2V5Q29kZSgpOworCisgICAgICAgIGlmIChrZXlDb2RlID09ICdccicpIHsKKyAg
ICAgICAgICAgIGlmIChodG1sRm9ybSkKKyAgICAgICAgICAgICAgICBodG1sRm9ybS0+c3VibWl0
Q2xpY2soZXZlbnQpOworICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU2VsZWN0RWxl
bWVudDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVu
dCogZWxlbWVudCwgRXZlbnQqIGV2ZW50LCBIVE1MRm9ybUVsZW1lbnQqIGh0bWxGb3JtKQorewor
ICAgIGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYg
KGRhdGEudXNlc01lbnVMaXN0KCkpCisgICAgICAgIG1lbnVMaXN0RGVmYXVsdEV2ZW50SGFuZGxl
cihkYXRhLCBlbGVtZW50LCBldmVudCwgaHRtbEZvcm0pOworICAgIGVsc2UgCisgICAgICAgIGxp
c3RCb3hEZWZhdWx0RXZlbnRIYW5kbGVyKGRhdGEsIGVsZW1lbnQsIGV2ZW50LCBodG1sRm9ybSk7
CisKKyAgICBpZiAoZXZlbnQtPmRlZmF1bHRIYW5kbGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5rZXlwcmVzc0V2ZW50ICYmIGV2
ZW50LT5pc0tleWJvYXJkRXZlbnQoKSkgeworICAgICAgICBLZXlib2FyZEV2ZW50KiBrZXlib2Fy
ZEV2ZW50ID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2ZW50KTsKKyAgICAgICAgaWYg
KCFrZXlib2FyZEV2ZW50LT5jdHJsS2V5KCkgJiYgIWtleWJvYXJkRXZlbnQtPmFsdEtleSgpICYm
ICFrZXlib2FyZEV2ZW50LT5tZXRhS2V5KCkgJiYgaXNQcmludGFibGVDaGFyKGtleWJvYXJkRXZl
bnQtPmNoYXJDb2RlKCkpKSB7CisgICAgICAgICAgICB0eXBlQWhlYWRGaW5kKGRhdGEsIGVsZW1l
bnQsIGtleWJvYXJkRXZlbnQpOworICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVk
KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBTZWxl
Y3RFbGVtZW50OjpsYXN0U2VsZWN0ZWRMaXN0SW5kZXgoY29uc3QgU2VsZWN0RWxlbWVudERhdGEm
IGRhdGEsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgLy8gcmV0dXJuIHRoZSBudW1i
ZXIgb2YgdGhlIGxhc3Qgb3B0aW9uIHNlbGVjdGVkCisgICAgdW5zaWduZWQgaW5kZXggPSAwOwor
ICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVt
cyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAw
OyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKE9wdGlvbkVsZW1lbnQqIG9w
dGlvbkVsZW1lbnQgPSB0b09wdGlvbkVsZW1lbnQoaXRlbXNbaV0pKSB7CisgICAgICAgICAgICBp
ZiAob3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0g
aTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9CisKKyAgICByZXR1cm4gZm91bmQgPyAoaW50KSBpbmRleCA6IC0xOworfQorCitz
dGF0aWMgU3RyaW5nIHN0cmlwTGVhZGluZ1doaXRlU3BhY2UoY29uc3QgU3RyaW5nJiBzdHJpbmcp
Cit7CisgICAgaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKKworICAgIGludCBpOworICAg
IGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBpZiAoc3RyaW5nW2ldICE9
IG5vQnJlYWtTcGFjZSAmJiAoc3RyaW5nW2ldIDw9IDB4N0YgPyAhaXNBU0NJSVNwYWNlKHN0cmlu
Z1tpXSkgOiAoZGlyZWN0aW9uKHN0cmluZ1tpXSkgIT0gV2hpdGVTcGFjZU5ldXRyYWwpKSkKKyAg
ICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKGks
IGxlbmd0aCAtIGkpOworfQorCit2b2lkIFNlbGVjdEVsZW1lbnQ6OnR5cGVBaGVhZEZpbmQoU2Vs
ZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIEtleWJvYXJkRXZlbnQqIGV2
ZW50KQoreworICAgIGlmIChldmVudC0+dGltZVN0YW1wKCkgPCBkYXRhLmxhc3RDaGFyVGltZSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBET01UaW1lU3RhbXAgZGVsdGEgPSBldmVudC0+dGlt
ZVN0YW1wKCkgLSBkYXRhLmxhc3RDaGFyVGltZSgpOworICAgIGRhdGEuc2V0TGFzdENoYXJUaW1l
KGV2ZW50LT50aW1lU3RhbXAoKSk7CisKKyAgICBVQ2hhciBjID0gZXZlbnQtPmNoYXJDb2RlKCk7
CisKKyAgICBTdHJpbmcgcHJlZml4OworICAgIGludCBzZWFyY2hTdGFydE9mZnNldCA9IDE7Cisg
ICAgaWYgKGRlbHRhID4gc190eXBlQWhlYWRUaW1lb3V0KSB7CisgICAgICAgIHByZWZpeCA9IFN0
cmluZygmYywgMSk7CisgICAgICAgIGRhdGEuc2V0VHlwZWRTdHJpbmcocHJlZml4KTsKKyAgICAg
ICAgZGF0YS5zZXRSZXBlYXRpbmdDaGFyKGMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEu
dHlwZWRTdHJpbmcoKS5hcHBlbmQoYyk7CisKKyAgICAgICAgaWYgKGMgPT0gZGF0YS5yZXBlYXRp
bmdDaGFyKCkpCisgICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBsaWtlbHkgdHJ5aW5nIHRvIGN5
Y2xlIHRocm91Z2ggYWxsIHRoZSBpdGVtcyBzdGFydGluZyB3aXRoIHRoaXMgY2hhcmFjdGVyLCBz
byBqdXN0IHNlYXJjaCBvbiB0aGUgY2hhcmFjdGVyCisgICAgICAgICAgICBwcmVmaXggPSBTdHJp
bmcoJmMsIDEpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEuc2V0UmVwZWF0aW5n
Q2hhcigwKTsKKyAgICAgICAgICAgIHByZWZpeCA9IGRhdGEudHlwZWRTdHJpbmcoKTsKKyAgICAg
ICAgICAgIHNlYXJjaFN0YXJ0T2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNv
bnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7Cisg
ICAgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICBpZiAoaXRlbUNvdW50IDwgMSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaW50IHNlbGVjdGVkID0gc2VsZWN0ZWRJbmRleChkYXRh
LCBlbGVtZW50KTsKKyAgICBpbnQgaW5kZXggPSAob3B0aW9uVG9MaXN0SW5kZXgoZGF0YSwgZWxl
bWVudCwgc2VsZWN0ZWQgPj0gMCA/IHNlbGVjdGVkIDogMCkgKyBzZWFyY2hTdGFydE9mZnNldCkg
JSBpdGVtQ291bnQ7CisgICAgQVNTRVJUKGluZGV4ID49IDApOworCisgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBpdGVtQ291bnQ7ICsraSwgaW5kZXggPSAoaW5kZXggKyAxKSAlIGl0ZW1Db3VudCkg
eworICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50
KGl0ZW1zW2luZGV4XSk7CisgICAgICAgIGlmICghb3B0aW9uRWxlbWVudCB8fCBpdGVtc1tpbmRl
eF0tPmRpc2FibGVkKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBTdHJpbmcg
dGV4dCA9IG9wdGlvbkVsZW1lbnQtPnRleHRJbmRlbnRlZFRvUmVzcGVjdEdyb3VwTGFiZWwoKTsK
KyAgICAgICAgaWYgKHN0cmlwTGVhZGluZ1doaXRlU3BhY2UodGV4dCkuc3RhcnRzV2l0aChwcmVm
aXgsIGZhbHNlKSkgeworICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50
LCBsaXN0VG9PcHRpb25JbmRleChkYXRhLCBlbGVtZW50LCBpbmRleCkpOworICAgICAgICAgICAg
aWYgKCFkYXRhLnVzZXNNZW51TGlzdCgpKQorICAgICAgICAgICAgICAgIGxpc3RCb3hPbkNoYW5n
ZShkYXRhLCBlbGVtZW50KTsKKyAgICAgICAgICAgIGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNh
bGMoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBT
ZWxlY3RFbGVtZW50OjppbnNlcnRlZEludG9UcmVlKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBF
bGVtZW50KiBlbGVtZW50KQoreworICAgIC8vIFdoZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBk
dXJpbmcgZG9jdW1lbnQgcGFyc2luZywgaXQgd29uJ3QgaGF2ZSBhbnkgaXRlbXMgeWV0IC0gYnV0
IGZvciBpbm5lckhUTUwKKyAgICAvLyBhbmQgcmVsYXRlZCBtZXRob2RzLCB0aGlzIG1ldGhvZCBp
cyBjYWxsZWQgYWZ0ZXIgdGhlIHdob2xlIHN1YnRyZWUgaXMgY29uc3RydWN0ZWQuCisgICAgcmVj
YWxjTGlzdEl0ZW1zKGRhdGEsIGVsZW1lbnQsIHRydWUpOworfQorCisvLyBTZWxlY3RFbGVtZW50
RGF0YQorU2VsZWN0RWxlbWVudERhdGE6OlNlbGVjdEVsZW1lbnREYXRhKCkKKyAgICA6IG1fbXVs
dGlwbGUoZmFsc2UpIAorICAgICwgbV9zaXplKDApCisgICAgLCBtX2xhc3RPbkNoYW5nZUluZGV4
KC0xKQorICAgICwgbV9hY3RpdmVTZWxlY3Rpb25TdGF0ZShmYWxzZSkKKyAgICAsIG1fYWN0aXZl
U2VsZWN0aW9uQW5jaG9ySW5kZXgoLTEpCisgICAgLCBtX2FjdGl2ZVNlbGVjdGlvbkVuZEluZGV4
KC0xKQorICAgICwgbV9yZWNhbGNMaXN0SXRlbXMoZmFsc2UpCisgICAgLCBtX3JlcGVhdGluZ0No
YXIoMCkKKyAgICAsIG1fbGFzdENoYXJUaW1lKDApCit7Cit9CisKK1NlbGVjdEVsZW1lbnREYXRh
Ojp+U2VsZWN0RWxlbWVudERhdGEoKQoreworfQorCit2b2lkIFNlbGVjdEVsZW1lbnREYXRhOjpj
aGVja0xpc3RJdGVtcyhjb25zdCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworI2lmbmRlZiBO
REVCVUcKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IG1fbGlzdEl0ZW1zOwor
ICAgIFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtcygqY29uc3RfY2FzdDxTZWxlY3RFbGVt
ZW50RGF0YSo+KHRoaXMpLCBlbGVtZW50LCBmYWxzZSk7CisgICAgQVNTRVJUKGl0ZW1zID09IG1f
bGlzdEl0ZW1zKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGVsZW1lbnQpOworI2VuZGlmCit9
CisKK1ZlY3RvcjxFbGVtZW50Kj4mIFNlbGVjdEVsZW1lbnREYXRhOjpsaXN0SXRlbXMoY29uc3Qg
RWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBpZiAobV9yZWNhbGNMaXN0SXRlbXMpCisgICAgICAg
IFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtcygqdGhpcywgZWxlbWVudCk7CisgICAgZWxz
ZQorICAgICAgICBjaGVja0xpc3RJdGVtcyhlbGVtZW50KTsKKworICAgIHJldHVybiBtX2xpc3RJ
dGVtczsKK30KKworY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgU2VsZWN0RWxlbWVudERhdGE6Omxp
c3RJdGVtcyhjb25zdCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIGlmIChtX3JlY2Fs
Y0xpc3RJdGVtcykKKyAgICAgICAgU2VsZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zKCpjb25z
dF9jYXN0PFNlbGVjdEVsZW1lbnREYXRhKj4odGhpcyksIGVsZW1lbnQpOworICAgIGVsc2UKKyAg
ICAgICAgY2hlY2tMaXN0SXRlbXMoZWxlbWVudCk7CisKKyAgICByZXR1cm4gbV9saXN0SXRlbXM7
Cit9CisKIFNlbGVjdEVsZW1lbnQqIHRvU2VsZWN0RWxlbWVudChFbGVtZW50KiBlbGVtZW50KQog
ewogICAgIGlmIChlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkpIHsKSW5kZXg6IGRvbS9TZWxlY3RF
bGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL1NlbGVjdEVsZW1lbnQuaAkocmV2aXNpb24gNDQy
MjYpCisrKyBkb20vU2VsZWN0RWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBA
QAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKQorICogQ29weXJpZ2h0IChD
KSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwLy93d3cu
dG9yY2htb2JpbGUuY29tLykKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMjIsMTAgKzIyLDE4IEBA
CiAjZGVmaW5lIFNlbGVjdEVsZW1lbnRfaAogCiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2lu
Y2x1ZGUgIkV2ZW50LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgRWxlbWVudDsK
K2NsYXNzIEV2ZW50OworY2xhc3MgRm9ybURhdGFMaXN0OworY2xhc3MgSFRNTEZvcm1FbGVtZW50
OworY2xhc3MgS2V5Ym9hcmRFdmVudDsKK2NsYXNzIE1hcHBlZEF0dHJpYnV0ZTsKK2NsYXNzIFNl
bGVjdEVsZW1lbnREYXRhOworY2xhc3MgU3RyaW5nOwogCiBjbGFzcyBTZWxlY3RFbGVtZW50IHsK
IHB1YmxpYzoKQEAgLTUyLDYgKzYwLDExMiBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIGludCBz
ZWxlY3RlZEluZGV4KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzZXRTZWxlY3RlZElu
ZGV4KGludCBpbmRleCwgYm9vbCBkZXNlbGVjdCA9IHRydWUsIGJvb2wgZmlyZU9uQ2hhbmdlID0g
ZmFsc2UpID0gMDsKKworcHJvdGVjdGVkOgorICAgIGZyaWVuZCBjbGFzcyBTZWxlY3RFbGVtZW50
RGF0YTsKKyAgICBzdGF0aWMgdm9pZCBzZWxlY3RBbGwoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVt
ZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2F2ZUxhc3RTZWxlY3Rpb24oU2VsZWN0RWxlbWVudERh
dGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIGludCBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleChT
ZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBpbnQgc3RhcnRJbmRleCk7CisgICAgc3RhdGlj
IGludCBwcmV2aW91c1NlbGVjdGFibGVMaXN0SW5kZXgoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVt
ZW50KiwgaW50IHN0YXJ0SW5kZXgpOworICAgIHN0YXRpYyB2b2lkIHNldEFjdGl2ZVNlbGVjdGlv
bkFuY2hvckluZGV4KFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIGludCBpbmRleCk7Cisg
ICAgc3RhdGljIHZvaWQgc2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoU2VsZWN0RWxlbWVudERh
dGEmLCBpbnQgaW5kZXgpOworICAgIHN0YXRpYyB2b2lkIHVwZGF0ZUxpc3RCb3hTZWxlY3Rpb24o
U2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgYm9vbCBkZXNlbGVjdE90aGVyT3B0aW9ucyk7
CisgICAgc3RhdGljIHZvaWQgbGlzdEJveE9uQ2hhbmdlKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxl
bWVudCopOworICAgIHN0YXRpYyB2b2lkIG1lbnVMaXN0T25DaGFuZ2UoU2VsZWN0RWxlbWVudERh
dGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2Nyb2xsVG9TZWxlY3Rpb24oU2VsZWN0
RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgcmVjYWxjU3R5bGUoU2Vs
ZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2V0UmVjYWxjTGlz
dEl0ZW1zKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCopOworICAgIHN0YXRpYyB2b2lkIHJl
Y2FsY0xpc3RJdGVtcyhTZWxlY3RFbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqLCBib29sIHVw
ZGF0ZVNlbGVjdGVkU3RhdGVzID0gdHJ1ZSk7CisgICAgc3RhdGljIGludCBzZWxlY3RlZEluZGV4
KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCopOworICAgIHN0YXRpYyB2
b2lkIHNldFNlbGVjdGVkSW5kZXgoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgaW50IG9w
dGlvbkluZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1ZSwgYm9vbCBmaXJlT25DaGFuZ2UgPSBmYWxz
ZSk7CisgICAgc3RhdGljIGludCBvcHRpb25Ub0xpc3RJbmRleChjb25zdCBTZWxlY3RFbGVtZW50
RGF0YSYsIGNvbnN0IEVsZW1lbnQqLCBpbnQgb3B0aW9uSW5kZXgpOworICAgIHN0YXRpYyBpbnQg
bGlzdFRvT3B0aW9uSW5kZXgoY29uc3QgU2VsZWN0RWxlbWVudERhdGEmLCBjb25zdCBFbGVtZW50
KiwgaW50IGxpc3RJbmRleCk7CisgICAgc3RhdGljIHZvaWQgZGlzcGF0Y2hGb2N1c0V2ZW50KFNl
bGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCopOworICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoQmx1
ckV2ZW50KFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCopOworICAgIHN0YXRpYyB2b2lkIGRl
c2VsZWN0SXRlbXMoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgRWxlbWVudCogZXhjbHVk
ZUVsZW1lbnQgPSAwKTsKKyAgICBzdGF0aWMgYm9vbCBzYXZlRm9ybUNvbnRyb2xTdGF0ZShjb25z
dCBTZWxlY3RFbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqLCBTdHJpbmcmIHZhbHVlKTsKKyAg
ICBzdGF0aWMgdm9pZCByZXN0b3JlRm9ybUNvbnRyb2xTdGF0ZShTZWxlY3RFbGVtZW50RGF0YSYs
IEVsZW1lbnQqLCBjb25zdCBTdHJpbmcmIHN0YXRlKTsKKyAgICBzdGF0aWMgdm9pZCBwYXJzZU11
bHRpcGxlQXR0cmlidXRlKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIE1hcHBlZEF0dHJp
YnV0ZSopOworICAgIHN0YXRpYyBib29sIGFwcGVuZEZvcm1EYXRhKFNlbGVjdEVsZW1lbnREYXRh
JiwgRWxlbWVudCosIEZvcm1EYXRhTGlzdCYgbGlzdCk7CisgICAgc3RhdGljIHZvaWQgcmVzZXQo
U2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgZGVmYXVsdEV2
ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBFdmVudCosIEhUTUxGb3Jt
RWxlbWVudCogaHRtbEZvcm0gPSAwKTsKKyAgICBzdGF0aWMgaW50IGxhc3RTZWxlY3RlZExpc3RJ
bmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqKTsKKyAgICBzdGF0
aWMgdm9pZCB0eXBlQWhlYWRGaW5kKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIEtleWJv
YXJkRXZlbnQqKTsKKyAgICBzdGF0aWMgdm9pZCBpbnNlcnRlZEludG9UcmVlKFNlbGVjdEVsZW1l
bnREYXRhJiwgRWxlbWVudCopOworCitwcml2YXRlOgorICAgIHN0YXRpYyB2b2lkIG1lbnVMaXN0
RGVmYXVsdEV2ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBFdmVudCos
IEhUTUxGb3JtRWxlbWVudCopOworICAgIHN0YXRpYyB2b2lkIGxpc3RCb3hEZWZhdWx0RXZlbnRI
YW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIEV2ZW50KiwgSFRNTEZvcm1FbGVt
ZW50Kik7Cit9OworCisvLyBIVE1ML1dNTFNlbGVjdEVsZW1lbnQgaG9sZCB0aGlzIHN0cnVjdCBh
cyBtZW1iZXIgdmFyaWFibGUKKy8vIGFuZCBwYXNzIGl0IHRvIHRoZSBzdGF0aWMgaGVscGVyIGZ1
bmN0aW9ucyBpbiBTZWxlY3RFbGVtZW50CitjbGFzcyBTZWxlY3RFbGVtZW50RGF0YSB7CitwdWJs
aWM6CisgICAgU2VsZWN0RWxlbWVudERhdGEoKTsKKyAgICB+U2VsZWN0RWxlbWVudERhdGEoKTsK
KworICAgIGJvb2wgbXVsdGlwbGUoKSBjb25zdCB7IHJldHVybiBtX211bHRpcGxlOyB9CisgICAg
dm9pZCBzZXRNdWx0aXBsZShib29sIHZhbHVlKSB7IG1fbXVsdGlwbGUgPSB2YWx1ZTsgfQorCisg
ICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKyAgICB2b2lkIHNldFNpemUo
aW50IHZhbHVlKSB7IG1fc2l6ZSA9IHZhbHVlOyB9CisKKyAgICBib29sIHVzZXNNZW51TGlzdCgp
IGNvbnN0IHsgcmV0dXJuICFtX211bHRpcGxlICYmIG1fc2l6ZSA8PSAxOyB9CisKKyAgICBpbnQg
bGFzdE9uQ2hhbmdlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2xhc3RPbkNoYW5nZUluZGV4OyB9
CisgICAgdm9pZCBzZXRMYXN0T25DaGFuZ2VJbmRleChpbnQgdmFsdWUpIHsgbV9sYXN0T25DaGFu
Z2VJbmRleCA9IHZhbHVlOyB9CisKKyAgICBWZWN0b3I8Ym9vbD4mIGxhc3RPbkNoYW5nZVNlbGVj
dGlvbigpIHsgcmV0dXJuIG1fbGFzdE9uQ2hhbmdlU2VsZWN0aW9uOyB9CisKKyAgICBib29sIGFj
dGl2ZVNlbGVjdGlvblN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9hY3RpdmVTZWxlY3Rpb25TdGF0
ZTsgfQorICAgIHZvaWQgc2V0QWN0aXZlU2VsZWN0aW9uU3RhdGUoYm9vbCB2YWx1ZSkgeyBtX2Fj
dGl2ZVNlbGVjdGlvblN0YXRlID0gdmFsdWU7IH0KKworICAgIGludCBhY3RpdmVTZWxlY3Rpb25B
bmNob3JJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXg7
IH0KKyAgICB2b2lkIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGludCB2YWx1ZSkgeyBt
X2FjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4ID0gdmFsdWU7IH0KKworICAgIGludCBhY3RpdmVT
ZWxlY3Rpb25FbmRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5k
ZXg7IH0KKyAgICB2b2lkIHNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGludCB2YWx1ZSkgeyBt
X2FjdGl2ZVNlbGVjdGlvbkVuZEluZGV4ID0gdmFsdWU7IH0KKworICAgIFZlY3Rvcjxib29sPiYg
Y2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24oKSB7IHJldHVybiBtX2NhY2hlZFN0YXRlRm9y
QWN0aXZlU2VsZWN0aW9uOyB9CisKKyAgICBib29sIHNob3VsZFJlY2FsY0xpc3RJdGVtcygpIGNv
bnN0IHsgcmV0dXJuIG1fcmVjYWxjTGlzdEl0ZW1zOyB9CisgICAgdm9pZCBzZXRTaG91bGRSZWNh
bGNMaXN0SXRlbXMoYm9vbCB2YWx1ZSkgeyBtX3JlY2FsY0xpc3RJdGVtcyA9IHZhbHVlOyB9CisK
KyAgICBWZWN0b3I8RWxlbWVudCo+JiByYXdMaXN0SXRlbXMoKSB7IHJldHVybiBtX2xpc3RJdGVt
czsgfQorICAgIFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcyhjb25zdCBFbGVtZW50Kik7Cisg
ICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zKGNvbnN0IEVsZW1lbnQqKSBjb25z
dDsKKworICAgIFVDaGFyIHJlcGVhdGluZ0NoYXIoKSBjb25zdCB7IHJldHVybiBtX3JlcGVhdGlu
Z0NoYXI7IH0KKyAgICB2b2lkIHNldFJlcGVhdGluZ0NoYXIoY29uc3QgVUNoYXImIHZhbHVlKSB7
IG1fcmVwZWF0aW5nQ2hhciA9IHZhbHVlOyB9CisKKyAgICBET01UaW1lU3RhbXAgbGFzdENoYXJU
aW1lKCkgY29uc3QgeyByZXR1cm4gbV9sYXN0Q2hhclRpbWU7IH0KKyAgICB2b2lkIHNldExhc3RD
aGFyVGltZShjb25zdCBET01UaW1lU3RhbXAmIHZhbHVlKSB7IG1fbGFzdENoYXJUaW1lID0gdmFs
dWU7IH0KKworICAgIFN0cmluZyYgdHlwZWRTdHJpbmcoKSB7IHJldHVybiBtX3R5cGVkU3RyaW5n
OyB9CisgICAgdm9pZCBzZXRUeXBlZFN0cmluZyhjb25zdCBTdHJpbmcmIHZhbHVlKSB7IG1fdHlw
ZWRTdHJpbmcgPSB2YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHZvaWQgY2hlY2tMaXN0SXRlbXMo
Y29uc3QgRWxlbWVudCopIGNvbnN0OworCisgICAgYm9vbCBtX211bHRpcGxlOworICAgIGludCBt
X3NpemU7CisKKyAgICBpbnQgbV9sYXN0T25DaGFuZ2VJbmRleDsKKyAgICBWZWN0b3I8Ym9vbD4g
bV9sYXN0T25DaGFuZ2VTZWxlY3Rpb247CisKKyAgICBib29sIG1fYWN0aXZlU2VsZWN0aW9uU3Rh
dGU7CisgICAgaW50IG1fYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXg7CisgICAgaW50IG1fYWN0
aXZlU2VsZWN0aW9uRW5kSW5kZXg7CisgICAgVmVjdG9yPGJvb2w+IG1fY2FjaGVkU3RhdGVGb3JB
Y3RpdmVTZWxlY3Rpb247CisKKyAgICBib29sIG1fcmVjYWxjTGlzdEl0ZW1zOworICAgIFZlY3Rv
cjxFbGVtZW50Kj4gbV9saXN0SXRlbXM7CisKKyAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMgZm9y
IHR5cGUtYWhlYWQgZmluZAorICAgIFVDaGFyIG1fcmVwZWF0aW5nQ2hhcjsKKyAgICBET01UaW1l
U3RhbXAgbV9sYXN0Q2hhclRpbWU7CisgICAgU3RyaW5nIG1fdHlwZWRTdHJpbmc7CiB9OwogCiBT
ZWxlY3RFbGVtZW50KiB0b1NlbGVjdEVsZW1lbnQoRWxlbWVudCopOwpJbmRleDogaHRtbC9IVE1M
T3B0aW9uRWxlbWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwvSFRNTE9wdGlvbkVsZW1lbnQuaAko
cmV2aXNpb24gNDQyMjYpCisrKyBodG1sL0hUTUxPcHRpb25FbGVtZW50LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTUwLDcgKzUwLDcgQEAgcHVibGljOgogICAgIAogICAgIHZpcnR1YWwgY29uc3QgQXRv
bWljU3RyaW5nJiBmb3JtQ29udHJvbFR5cGUoKSBjb25zdDsKIAotICAgIFN0cmluZyB0ZXh0KCkg
Y29uc3Q7CisgICAgdmlydHVhbCBTdHJpbmcgdGV4dCgpIGNvbnN0OwogICAgIHZvaWQgc2V0VGV4
dChjb25zdCBTdHJpbmcmLCBFeGNlcHRpb25Db2RlJik7CiAKICAgICBpbnQgaW5kZXgoKSBjb25z
dDsKSW5kZXg6IGh0bWwvSFRNTFNlbGVjdEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwv
SFRNTFNlbGVjdEVsZW1lbnQuY3BwCShyZXZpc2lvbiA0NDIyNikKKysrIGh0bWwvSFRNTFNlbGVj
dEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSwxNiArMjksMTEgQEAKICNpbmNsdWRl
ICJBWE9iamVjdENhY2hlLmgiCiAjaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgogI2luY2x1
ZGUgIkNTU1N0eWxlU2VsZWN0b3IuaCIKLSNpbmNsdWRlICJDaGFyYWN0ZXJOYW1lcy5oIgotI2lu
Y2x1ZGUgIkNocm9tZUNsaWVudC5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAi
RXZlbnQuaCIKLSNpbmNsdWRlICJFdmVudEhhbmRsZXIuaCIKICNpbmNsdWRlICJFdmVudE5hbWVz
LmgiCiAjaW5jbHVkZSAiRm9ybURhdGFMaXN0LmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNs
dWRlICJGcmFtZUxvYWRlci5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVyQ2xpZW50LmgiCiAjaW5j
bHVkZSAiSFRNTEZvcm1FbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVk
ZSAiSFRNTE9wdGlvbkVsZW1lbnQuaCIKQEAgLTU0LDM3ICs0OSwxOCBAQAogI2luY2x1ZGUgPHd0
Zi9TdGRMaWJFeHRyYXMuaD4KICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAKLSNpZiBQTEFURk9S
TShNQUMpCi0jZGVmaW5lIEFSUk9XX0tFWVNfUE9QX01FTlUgMQotI2Vsc2UKLSNkZWZpbmUgQVJS
T1dfS0VZU19QT1BfTUVOVSAwCi0jZW5kaWYKLQogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5n
IG5hbWVzcGFjZSBXVEY7Ci11c2luZyBuYW1lc3BhY2UgVW5pY29kZTsKIAogbmFtZXNwYWNlIFdl
YkNvcmUgewogCiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi1zdGF0aWMgY29uc3QgRE9N
VGltZVN0YW1wIHR5cGVBaGVhZFRpbWVvdXQgPSAxMDAwOwotCiAvLyBVcHBlciBsaW1pdCBhZ3Jl
ZWQgdXBvbiB3aXRoIHJlcHJlc2VudGF0aXZlcyBvZiBPcGVyYSBhbmQgTW96aWxsYS4KIHN0YXRp
YyBjb25zdCB1bnNpZ25lZCBtYXhTZWxlY3RJdGVtcyA9IDEwMDAwOwogCiBIVE1MU2VsZWN0RWxl
bWVudDo6SFRNTFNlbGVjdEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9j
dW1lbnQqIGRvYywgSFRNTEZvcm1FbGVtZW50KiBmKQogICAgIDogSFRNTEZvcm1Db250cm9sRWxl
bWVudFdpdGhTdGF0ZSh0YWdOYW1lLCBkb2MsIGYpCiAgICAgLCBtX21pbndpZHRoKDApCi0gICAg
LCBtX3NpemUoMCkKLSAgICAsIG1fbXVsdGlwbGUoZmFsc2UpCi0gICAgLCBtX3JlY2FsY0xpc3RJ
dGVtcyhmYWxzZSkKLSAgICAsIG1fbGFzdE9uQ2hhbmdlSW5kZXgoLTEpCi0gICAgLCBtX2FjdGl2
ZVNlbGVjdGlvbkFuY2hvckluZGV4KC0xKQotICAgICwgbV9hY3RpdmVTZWxlY3Rpb25FbmRJbmRl
eCgtMSkKLSAgICAsIG1fYWN0aXZlU2VsZWN0aW9uU3RhdGUoZmFsc2UpCi0gICAgLCBtX3JlcGVh
dGluZ0NoYXIoMCkKLSAgICAsIG1fbGFzdENoYXJUaW1lKDApCiB7CiAgICAgQVNTRVJUKGhhc1Rh
Z05hbWUoc2VsZWN0VGFnKSB8fCBoYXNUYWdOYW1lKGtleWdlblRhZykpOwogfQpAQCAtOTYsMTE1
ICs3Miw0NiBAQCBib29sIEhUTUxTZWxlY3RFbGVtZW50OjpjaGVja0RURChjb25zdCBOCiAgICAg
ICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlwdFRhZyk7CiB9CiAKLXZvaWQgSFRNTFNl
bGVjdEVsZW1lbnQ6OnJlY2FsY1N0eWxlKFN0eWxlQ2hhbmdlIGNoKQordm9pZCBIVE1MU2VsZWN0
RWxlbWVudDo6cmVjYWxjU3R5bGUoU3R5bGVDaGFuZ2UgY2hhbmdlKQogewotICAgIGlmIChjaGls
ZE5lZWRzU3R5bGVSZWNhbGMoKSAmJiByZW5kZXJlcigpKSB7Ci0gICAgICAgIGlmICh1c2VzTWVu
dUxpc3QoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlck1lbnVMaXN0Kj4ocmVuZGVy
ZXIoKSktPnNldE9wdGlvbnNDaGFuZ2VkKHRydWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBzdGF0aWNfY2FzdDxSZW5kZXJMaXN0Qm94Kj4ocmVuZGVyZXIoKSktPnNldE9wdGlvbnNDaGFu
Z2VkKHRydWUpOwotICAgIH0gZWxzZSBpZiAobV9yZWNhbGNMaXN0SXRlbXMpCi0gICAgICAgIHJl
Y2FsY0xpc3RJdGVtcygpOwotCi0gICAgSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZTo6
cmVjYWxjU3R5bGUoY2gpOworICAgIFNlbGVjdEVsZW1lbnQ6OnJlY2FsY1N0eWxlKG1fZGF0YSwg
dGhpcyk7CisgICAgSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZTo6cmVjYWxjU3R5bGUo
Y2hhbmdlKTsKIH0KIAogY29uc3QgQXRvbWljU3RyaW5nJiBIVE1MU2VsZWN0RWxlbWVudDo6Zm9y
bUNvbnRyb2xUeXBlKCkgY29uc3QKIHsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IEF0
b21pY1N0cmluZywgc2VsZWN0TXVsdGlwbGUsICgic2VsZWN0LW11bHRpcGxlIikpOwogICAgIERF
RklORV9TVEFUSUNfTE9DQUwoY29uc3QgQXRvbWljU3RyaW5nLCBzZWxlY3RPbmUsICgic2VsZWN0
LW9uZSIpKTsKLSAgICByZXR1cm4gbV9tdWx0aXBsZSA/IHNlbGVjdE11bHRpcGxlIDogc2VsZWN0
T25lOworICAgIHJldHVybiBtX2RhdGEubXVsdGlwbGUoKSA/IHNlbGVjdE11bHRpcGxlIDogc2Vs
ZWN0T25lOwogfQogCiBpbnQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNlbGVjdGVkSW5kZXgoKSBjb25z
dAogewotICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBvcHRpb24gc2VsZWN0
ZWQKLSAgICB1bnNpZ25lZCBpbmRleCA9IDA7Ci0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYg
aXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGl0
ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9w
dGlvblRhZykpIHsKLSAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVu
dCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7
Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsK
LX0KLQotaW50IEhUTUxTZWxlY3RFbGVtZW50OjpsYXN0U2VsZWN0ZWRMaXN0SW5kZXgoKSBjb25z
dAotewotICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBsYXN0IG9wdGlvbiBzZWxlY3Rl
ZAotICAgIHVuc2lnbmVkIGluZGV4ID0gMDsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAg
Y29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKHVu
c2lnbmVkIGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChp
dGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgIGlmIChzdGF0
aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkgewotICAg
ICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZvdW5kID8gKGludCkg
aW5kZXggOiAtMTsKKyAgICByZXR1cm4gU2VsZWN0RWxlbWVudDo6c2VsZWN0ZWRJbmRleChtX2Rh
dGEsIHRoaXMpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkZXNlbGVjdEl0ZW1zKEhU
TUxPcHRpb25FbGVtZW50KiBleGNsdWRlRWxlbWVudCkKIHsKLSAgICBjb25zdCBWZWN0b3I8RWxl
bWVudCo+JiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIHVuc2lnbmVkIGk7Ci0gICAgZm9yIChp
ID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFz
TG9jYWxOYW1lKG9wdGlvblRhZykgJiYgKGl0ZW1zW2ldICE9IGV4Y2x1ZGVFbGVtZW50KSkgewot
ICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1M
T3B0aW9uRWxlbWVudCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIGVsZW1lbnQtPnNldFNlbGVj
dGVkU3RhdGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQorICAgIFNlbGVjdEVsZW1lbnQ6OmRl
c2VsZWN0SXRlbXMobV9kYXRhLCB0aGlzLCBleGNsdWRlRWxlbWVudCk7CiB9CiAKIHZvaWQgSFRN
TFNlbGVjdEVsZW1lbnQ6OnNldFNlbGVjdGVkSW5kZXgoaW50IG9wdGlvbkluZGV4LCBib29sIGRl
c2VsZWN0LCBib29sIGZpcmVPbkNoYW5nZSkKIHsKLSAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+
JiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJ
bmRleChvcHRpb25JbmRleCk7Ci0gICAgSFRNTE9wdGlvbkVsZW1lbnQqIGVsZW1lbnQgPSAwOwot
ICAgIGlmICghbXVsdGlwbGUoKSkKLSAgICAgICAgZGVzZWxlY3QgPSB0cnVlOwotICAgIGlmIChs
aXN0SW5kZXggPj0gMCAmJiBpdGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFn
KSkgewotICAgICAgICBpZiAobV9hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCA8IDAgfHwgZGVz
ZWxlY3QpCi0gICAgICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChsaXN0SW5k
ZXgpOwotICAgICAgICBpZiAobV9hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCA8IDAgfHwgZGVzZWxl
Y3QpCi0gICAgICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChsaXN0SW5kZXgpOwot
ICAgICAgICBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihpdGVtc1ts
aXN0SW5kZXhdKTsKLSAgICAgICAgZWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKLSAg
ICB9Ci0gICAgaWYgKGRlc2VsZWN0KQotICAgICAgICBkZXNlbGVjdEl0ZW1zKGVsZW1lbnQpOwot
Ci0gICAgLy8gRm9yIHRoZSBtZW51IGxpc3QgY2FzZSwgdGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBz
ZWxlY3RlZCBlbGVtZW50IGFwcGVhci4KLSAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgcmVu
ZGVyZXIoKS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLQotICAgIHNjcm9sbFRvU2VsZWN0aW9uKCk7
Ci0KLSAgICAvLyBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgd2l0aCBmaXJlT25DaGFuZ2UgZm9yIG1l
bnUgbGlzdHMuIAotICAgIGlmIChmaXJlT25DaGFuZ2UgJiYgdXNlc01lbnVMaXN0KCkpCi0gICAg
ICAgIG1lbnVMaXN0T25DaGFuZ2UoKTsKLQotICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50KCkt
PmZyYW1lKCk7Ci0gICAgaWYgKGZyYW1lKQotICAgICAgICBmcmFtZS0+cGFnZSgpLT5jaHJvbWUo
KS0+Y2xpZW50KCktPmZvcm1TdGF0ZURpZENoYW5nZSh0aGlzKTsKKyAgICBTZWxlY3RFbGVtZW50
OjpzZXRTZWxlY3RlZEluZGV4KG1fZGF0YSwgdGhpcywgb3B0aW9uSW5kZXgsIGRlc2VsZWN0LCBm
aXJlT25DaGFuZ2UpOwogfQogCiBpbnQgSFRNTFNlbGVjdEVsZW1lbnQ6OmFjdGl2ZVNlbGVjdGlv
blN0YXJ0TGlzdEluZGV4KCkgY29uc3QKIHsKLSAgICBpZiAobV9hY3RpdmVTZWxlY3Rpb25BbmNo
b3JJbmRleCA+PSAwKQotICAgICAgICByZXR1cm4gbV9hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRl
eDsKKyAgICBpZiAobV9kYXRhLmFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KCkgPj0gMCkKKyAg
ICAgICAgcmV0dXJuIG1fZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpOwogICAgIHJl
dHVybiBvcHRpb25Ub0xpc3RJbmRleChzZWxlY3RlZEluZGV4KCkpOwogfQogCiBpbnQgSFRNTFNl
bGVjdEVsZW1lbnQ6OmFjdGl2ZVNlbGVjdGlvbkVuZExpc3RJbmRleCgpIGNvbnN0CiB7Ci0gICAg
aWYgKG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXggPj0gMCkKLSAgICAgICAgcmV0dXJuIG1fYWN0
aXZlU2VsZWN0aW9uRW5kSW5kZXg7Ci0gICAgcmV0dXJuIGxhc3RTZWxlY3RlZExpc3RJbmRleCgp
OworICAgIGlmIChtX2RhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSA+PSAwKQorICAgICAg
ICByZXR1cm4gbV9kYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCk7CisgICAgcmV0dXJuIFNl
bGVjdEVsZW1lbnQ6Omxhc3RTZWxlY3RlZExpc3RJbmRleChtX2RhdGEsIHRoaXMpOwogfQogCiB1
bnNpZ25lZCBIVE1MU2VsZWN0RWxlbWVudDo6bGVuZ3RoKCkgY29uc3QKQEAgLTI3MywzNiArMTgw
LDE5IEBAIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNldFZhbHVlKGNvbnN0IFMKIAogYm9vbCBI
VE1MU2VsZWN0RWxlbWVudDo6c2F2ZUZvcm1Db250cm9sU3RhdGUoU3RyaW5nJiB2YWx1ZSkgY29u
c3QKIHsKLSAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGxpc3RJdGVtcygpOwot
ICAgIGludCBsID0gaXRlbXMuc2l6ZSgpOwotICAgIFZlY3RvcjxjaGFyLCAxMDI0PiBjaGFyYWN0
ZXJzKGwpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbDsgKytpKSB7Ci0gICAgICAgIEVsZW1l
bnQqIGUgPSBpdGVtc1tpXTsKLSAgICAgICAgYm9vbCBzZWxlY3RlZCA9IGUtPmhhc0xvY2FsTmFt
ZShvcHRpb25UYWcpICYmIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4oZSktPnNlbGVj
dGVkKCk7Ci0gICAgICAgIGNoYXJhY3RlcnNbaV0gPSBzZWxlY3RlZCA/ICdYJyA6ICcuJzsKLSAg
ICB9Ci0gICAgdmFsdWUgPSBTdHJpbmcoY2hhcmFjdGVycy5kYXRhKCksIGwpOwotICAgIHJldHVy
biB0cnVlOworICAgIHJldHVybiBTZWxlY3RFbGVtZW50OjpzYXZlRm9ybUNvbnRyb2xTdGF0ZSht
X2RhdGEsIHRoaXMsIHZhbHVlKTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6cmVzdG9y
ZUZvcm1Db250cm9sU3RhdGUoY29uc3QgU3RyaW5nJiBzdGF0ZSkKIHsKLSAgICByZWNhbGNMaXN0
SXRlbXMoKTsKLSAgICAKLSAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGxpc3RJ
dGVtcygpOwotICAgIGludCBsID0gaXRlbXMuc2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgbDsgaSsrKQotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcp
KQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihpdGVtc1tpXSkt
PnNldFNlbGVjdGVkU3RhdGUoc3RhdGVbaV0gPT0gJ1gnKTsKLSAgICAgICAgICAgIAotICAgIHNl
dE5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICBTZWxlY3RFbGVtZW50OjpyZXN0b3JlRm9ybUNvbnRy
b2xTdGF0ZShtX2RhdGEsIHRoaXMsIHN0YXRlKTsKIH0KIAotdm9pZCBIVE1MU2VsZWN0RWxlbWVu
dDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICphdHRyKQordm9pZCBIVE1M
U2VsZWN0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKiBhdHRy
KSAKIHsKLSAgICBib29sIG9sZFVzZXNNZW51TGlzdCA9IHVzZXNNZW51TGlzdCgpOworICAgIGJv
b2wgb2xkVXNlc01lbnVMaXN0ID0gbV9kYXRhLnVzZXNNZW51TGlzdCgpOwogICAgIGlmIChhdHRy
LT5uYW1lKCkgPT0gc2l6ZUF0dHIpIHsKLSAgICAgICAgaW50IG9sZFNpemUgPSBtX3NpemU7Cisg
ICAgICAgIGludCBvbGRTaXplID0gbV9kYXRhLnNpemUoKTsKICAgICAgICAgLy8gU2V0IHRoZSBh
dHRyaWJ1dGUgdmFsdWUgdG8gYSBudW1iZXIuCiAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50
IHNpbmNlIHRoZSBzdHlsZSBydWxlcyBmb3IgdGhpcyBhdHRyaWJ1dGUgY2FuIGRldGVybWluZSB0
aGUgYXBwZWFyYW5jZSBwcm9wZXJ0eS4KICAgICAgICAgaW50IHNpemUgPSBhdHRyLT52YWx1ZSgp
LnRvSW50KCk7CkBAIC0zMTAsMjEgKzIwMCwxNyBAQCB2b2lkIEhUTUxTZWxlY3RFbGVtZW50Ojpw
YXJzZU1hcHBlZEF0dHJpCiAgICAgICAgIGlmIChhdHRyU2l6ZSAhPSBhdHRyLT52YWx1ZSgpKQog
ICAgICAgICAgICAgYXR0ci0+c2V0VmFsdWUoYXR0clNpemUpOwogCi0gICAgICAgIG1fc2l6ZSA9
IG1heChzaXplLCAxKTsKLSAgICAgICAgaWYgKChvbGRVc2VzTWVudUxpc3QgIT0gdXNlc01lbnVM
aXN0KCkgfHwgKCFvbGRVc2VzTWVudUxpc3QgJiYgbV9zaXplICE9IG9sZFNpemUpKSAmJiBhdHRh
Y2hlZCgpKSB7CisgICAgICAgIG1fZGF0YS5zZXRTaXplKG1heChzaXplLCAxKSk7CisgICAgICAg
IGlmICgob2xkVXNlc01lbnVMaXN0ICE9IG1fZGF0YS51c2VzTWVudUxpc3QoKSB8fCAoIW9sZFVz
ZXNNZW51TGlzdCAmJiBtX2RhdGEuc2l6ZSgpICE9IG9sZFNpemUpKSAmJiBhdHRhY2hlZCgpKSB7
CiAgICAgICAgICAgICBkZXRhY2goKTsKICAgICAgICAgICAgIGF0dGFjaCgpOwogICAgICAgICAg
ICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKICAgICAgICAgbV9taW53aWR0aCA9IG1heChhdHRyLT52
YWx1ZSgpLnRvSW50KCksIDApOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG11bHRp
cGxlQXR0cikgewotICAgICAgICBtX211bHRpcGxlID0gKCFhdHRyLT5pc051bGwoKSk7Ci0gICAg
ICAgIGlmIChvbGRVc2VzTWVudUxpc3QgIT0gdXNlc01lbnVMaXN0KCkgJiYgYXR0YWNoZWQoKSkg
ewotICAgICAgICAgICAgZGV0YWNoKCk7Ci0gICAgICAgICAgICBhdHRhY2goKTsKLSAgICAgICAg
fQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKKyAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtdWx0aXBsZUF0dHIpCisgICAgICAgIFNlbGVjdEVs
ZW1lbnQ6OnBhcnNlTXVsdGlwbGVBdHRyaWJ1dGUobV9kYXRhLCB0aGlzLCBhdHRyKTsKKyAgICBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewogICAgICAgICAvLyBGSVhN
RTogaWdub3JlIGZvciB0aGUgbW9tZW50CiAgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
YWxpZ25BdHRyKSB7CiAgICAgICAgIC8vIERvbid0IG1hcCAnYWxpZ24nIGF0dHJpYnV0ZS4gIFRo
aXMgbWF0Y2hlcyB3aGF0IEZpcmVmb3gsIE9wZXJhIGFuZCBJRSBkby4KQEAgLTM1NSw5OCArMjQx
LDM0IEBAIGJvb2wgSFRNTFNlbGVjdEVsZW1lbnQ6OmlzTW91c2VGb2N1c2FibGUKIAogYm9vbCBI
VE1MU2VsZWN0RWxlbWVudDo6Y2FuU2VsZWN0QWxsKCkgY29uc3QKIHsKLSAgICByZXR1cm4gIXVz
ZXNNZW51TGlzdCgpOyAKKyAgICByZXR1cm4gIW1fZGF0YS51c2VzTWVudUxpc3QoKTsgCiB9CiAK
IHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNlbGVjdEFsbCgpCiB7Ci0gICAgQVNTRVJUKCF1c2Vz
TWVudUxpc3QoKSk7Ci0gICAgaWYgKCFyZW5kZXJlcigpIHx8ICFtdWx0aXBsZSgpKQotICAgICAg
ICByZXR1cm47Ci0gICAgCi0gICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBj
b21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdEFsbCBzZWxlY3Rpb24gd2hlbiBkaXNwYXRjaGluZyBj
aGFuZ2UgZXZlbnRzCi0gICAgc2F2ZUxhc3RTZWxlY3Rpb24oKTsKLSAgICAKLSAgICBtX2FjdGl2
ZVNlbGVjdGlvblN0YXRlID0gdHJ1ZTsKLSAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRl
eChuZXh0U2VsZWN0YWJsZUxpc3RJbmRleCgtMSkpOwotICAgIHNldEFjdGl2ZVNlbGVjdGlvbkVu
ZEluZGV4KHByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleCgtMSkpOwotICAgIAotICAgIHVwZGF0
ZUxpc3RCb3hTZWxlY3Rpb24oZmFsc2UpOwotICAgIGxpc3RCb3hPbkNoYW5nZSgpOworICAgIFNl
bGVjdEVsZW1lbnQ6OnNlbGVjdEFsbChtX2RhdGEsIHRoaXMpOwogfQogCiBSZW5kZXJPYmplY3Qq
IEhUTUxTZWxlY3RFbGVtZW50OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJl
bmRlclN0eWxlKikKIHsKLSAgICBpZiAodXNlc01lbnVMaXN0KCkpCisgICAgaWYgKG1fZGF0YS51
c2VzTWVudUxpc3QoKSkKICAgICAgICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlck1lbnVMaXN0
KHRoaXMpOwogICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJMaXN0Qm94KHRoaXMpOwogfQog
CiBib29sIEhUTUxTZWxlY3RFbGVtZW50OjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGxp
c3QsIGJvb2wpCiB7Ci0gICAgaWYgKG5hbWUoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGJvb2wgc3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgIGNvbnN0IFZlY3RvcjxF
bGVtZW50Kj4mIGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0KLSAgICB1bnNpZ25lZCBpOwotICAgIGZv
ciAoaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0t
Pmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVu
dCAqb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihpdGVtc1tpXSk7Ci0g
ICAgICAgICAgICBpZiAob3B0aW9uLT5zZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbGlz
dC5hcHBlbmREYXRhKG5hbWUoKSwgb3B0aW9uLT52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBz
dWNjZXNzZnVsID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAg
IC8vICMjIyB0aGlzIGNhc2Ugc2hvdWxkIG5vdCBoYXBwZW4uIG1ha2Ugc3VyZSB0aGF0IHdlIHNl
bGVjdCB0aGUgZmlyc3Qgb3B0aW9uCi0gICAgLy8gaW4gYW55IGNhc2UuIG90aGVyd2lzZSB3ZSBo
YXZlIG5vIGNvbnNpc3RlbmN5IHdpdGggdGhlIERPTSBpbnRlcmZhY2UuIEZJWE1FIQotICAgIC8v
IHdlIHJldHVybiB0aGUgZmlyc3Qgb25lIGlmIGl0IHdhcyBhIGNvbWJvYm94IHNlbGVjdAotICAg
IGlmICghc3VjY2Vzc2Z1bCAmJiAhbV9tdWx0aXBsZSAmJiBtX3NpemUgPD0gMSAmJiBpdGVtcy5z
aXplKCkgJiYKLSAgICAgICAgKGl0ZW1zWzBdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkpIHsK
LSAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnQgKm9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRp
b25FbGVtZW50Kj4oaXRlbXNbMF0pOwotICAgICAgICBpZiAob3B0aW9uLT52YWx1ZSgpLmlzTnVs
bCgpKQotICAgICAgICAgICAgbGlzdC5hcHBlbmREYXRhKG5hbWUoKSwgb3B0aW9uLT50ZXh0KCku
c3RyaXBXaGl0ZVNwYWNlKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsaXN0LmFwcGVu
ZERhdGEobmFtZSgpLCBvcHRpb24tPnZhbHVlKCkpOwotICAgICAgICBzdWNjZXNzZnVsID0gdHJ1
ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2Vzc2Z1bDsKKyAgICByZXR1cm4gU2VsZWN0RWxl
bWVudDo6YXBwZW5kRm9ybURhdGEobV9kYXRhLCB0aGlzLCBsaXN0KTsKIH0KIAogaW50IEhUTUxT
ZWxlY3RFbGVtZW50OjpvcHRpb25Ub0xpc3RJbmRleChpbnQgb3B0aW9uSW5kZXgpIGNvbnN0CiB7
Ci0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBp
bnQgbGlzdFNpemUgPSAoaW50KWl0ZW1zLnNpemUoKTsKLSAgICBpZiAob3B0aW9uSW5kZXggPCAw
IHx8IG9wdGlvbkluZGV4ID49IGxpc3RTaXplKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBp
bnQgb3B0aW9uSW5kZXgyID0gLTE7Ci0gICAgZm9yIChpbnQgbGlzdEluZGV4ID0gMDsgbGlzdElu
ZGV4IDwgbGlzdFNpemU7IGxpc3RJbmRleCsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tsaXN0SW5k
ZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgb3B0aW9uSW5kZXgy
Kys7Ci0gICAgICAgICAgICBpZiAob3B0aW9uSW5kZXgyID09IG9wdGlvbkluZGV4KQotICAgICAg
ICAgICAgICAgIHJldHVybiBsaXN0SW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJu
IC0xOworICAgIHJldHVybiBTZWxlY3RFbGVtZW50OjpvcHRpb25Ub0xpc3RJbmRleChtX2RhdGEs
IHRoaXMsIG9wdGlvbkluZGV4KTsKIH0KIAogaW50IEhUTUxTZWxlY3RFbGVtZW50OjpsaXN0VG9P
cHRpb25JbmRleChpbnQgbGlzdEluZGV4KSBjb25zdAogewotICAgIGNvbnN0IFZlY3RvcjxFbGVt
ZW50Kj4mIGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYgKGxpc3RJbmRleCA8IDAgfHwgbGlz
dEluZGV4ID49IGludChpdGVtcy5zaXplKCkpIHx8Ci0gICAgICAgICFpdGVtc1tsaXN0SW5kZXhd
LT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaW50
IG9wdGlvbkluZGV4ID0gMDsgLy8gYWN0dWFsIGluZGV4IG9mIG9wdGlvbiBub3QgY291bnRpbmcg
T1BUR1JPVVAgZW50cmllcyB0aGF0IG1heSBiZSBpbiBsaXN0Ci0gICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBsaXN0SW5kZXg7IGkrKykKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUo
b3B0aW9uVGFnKSkKLSAgICAgICAgICAgIG9wdGlvbkluZGV4Kys7Ci0gICAgcmV0dXJuIG9wdGlv
bkluZGV4OworICAgIHJldHVybiBTZWxlY3RFbGVtZW50OjpsaXN0VG9PcHRpb25JbmRleChtX2Rh
dGEsIHRoaXMsIGxpc3RJbmRleCk7CiB9CiAKIFBhc3NSZWZQdHI8SFRNTE9wdGlvbnNDb2xsZWN0
aW9uPiBIVE1MU2VsZWN0RWxlbWVudDo6b3B0aW9ucygpCkBAIC00NTYsNDQgKzI3OCw3IEBAIFBh
c3NSZWZQdHI8SFRNTE9wdGlvbnNDb2xsZWN0aW9uPiBIVE1MU2UKIAogdm9pZCBIVE1MU2VsZWN0
RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zKGJvb2wgdXBkYXRlU2VsZWN0ZWRTdGF0ZXMpIGNvbnN0
CiB7Ci0gICAgbV9saXN0SXRlbXMuY2xlYXIoKTsKLSAgICBIVE1MT3B0aW9uRWxlbWVudCogZm91
bmRTZWxlY3RlZCA9IDA7Ci0gICAgZm9yIChOb2RlKiBjdXJyZW50ID0gZmlyc3RDaGlsZCgpOyBj
dXJyZW50OykgewotICAgICAgICAvLyBvcHRncm91cCB0YWdzIG1heSBub3QgbmVzdC4gSG93ZXZl
ciwgYm90aCBGaXJlRm94IGFuZCBJRSB3aWxsCi0gICAgICAgIC8vIGZsYXR0ZW4gdGhlIHRyZWUg
YXV0b21hdGljYWxseSwgc28gd2UgZm9sbG93IHN1aXQuCi0gICAgICAgIC8vIChodHRwOi8vd3d3
LnczLm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy42KQotICAgICAgICBp
ZiAoY3VycmVudC0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpIHsKLSAgICAgICAgICAgIG1fbGlz
dEl0ZW1zLmFwcGVuZChzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCo+KGN1cnJlbnQpKTsKLSAgICAg
ICAgICAgIGlmIChjdXJyZW50LT5maXJzdENoaWxkKCkpIHsKLSAgICAgICAgICAgICAgICBjdXJy
ZW50ID0gY3VycmVudC0+Zmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05h
bWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgbV9saXN0SXRlbXMuYXBwZW5kKHN0YXRpY19j
YXN0PEhUTUxFbGVtZW50Kj4oY3VycmVudCkpOwotICAgICAgICAgICAgaWYgKHVwZGF0ZVNlbGVj
dGVkU3RhdGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmb3VuZFNlbGVjdGVkICYmICh1c2Vz
TWVudUxpc3QoKSB8fCAoIW1fbXVsdGlwbGUgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1l
bnQqPihjdXJyZW50KS0+c2VsZWN0ZWQoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5k
U2VsZWN0ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGN1cnJlbnQpOwotICAg
ICAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5zZXRTZWxlY3RlZFN0YXRlKHRydWUpOwot
ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmRTZWxlY3RlZCAmJiAhbV9tdWx0aXBsZSAm
JiBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGN1cnJlbnQpLT5zZWxlY3RlZCgpKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQtPnNldFNlbGVjdGVkU3RhdGUoZmFs
c2UpOwotICAgICAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkID0gc3RhdGljX2Nhc3Q8SFRN
TE9wdGlvbkVsZW1lbnQqPihjdXJyZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUoaHJUYWcpKQot
ICAgICAgICAgICAgbV9saXN0SXRlbXMuYXBwZW5kKHN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4o
Y3VycmVudCkpOwotCi0gICAgICAgIC8vIEluIGNvbmZvcm1pbmcgSFRNTCBjb2RlLCBvbmx5IDxv
cHRncm91cD4gYW5kIDxvcHRpb24+IHdpbGwgYmUgZm91bmQKLSAgICAgICAgLy8gd2l0aGluIGEg
PHNlbGVjdD4uIFdlIGNhbGwgdHJhdmVyc2VOZXh0U2libGluZyBzbyB0aGF0IHdlIG9ubHkgc3Rl
cAotICAgICAgICAvLyBpbnRvIHRob3NlIHRhZ3MgdGhhdCB3ZSBjaG9vc2UgdG8uIEZvciB3ZWIt
Y29tcGF0LCB3ZSBzaG91bGQgY29wZQotICAgICAgICAvLyB3aXRoIHRoZSBjYXNlIHdoZXJlIG9k
ZCB0YWdzIGxpa2UgYSA8ZGl2PiBoYXZlIGJlZW4gYWRkZWQgYnV0IHdlCi0gICAgICAgIC8vIGhh
bmRsZSB0aGlzIGJlY2F1c2Ugc3VjaCB0YWdzIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJv
bSB0aGUKLSAgICAgICAgLy8gPHNlbGVjdD4ncyBzdWJ0cmVlIGF0IHRoaXMgcG9pbnQuCi0gICAg
ICAgIGN1cnJlbnQgPSBjdXJyZW50LT50cmF2ZXJzZU5leHRTaWJsaW5nKHRoaXMpOwotICAgIH0K
LSAgICBtX3JlY2FsY0xpc3RJdGVtcyA9IGZhbHNlOworICAgIFNlbGVjdEVsZW1lbnQ6OnJlY2Fs
Y0xpc3RJdGVtcyhjb25zdF9jYXN0PFNlbGVjdEVsZW1lbnREYXRhJj4obV9kYXRhKSwgdGhpcywg
dXBkYXRlU2VsZWN0ZWRTdGF0ZXMpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpjaGls
ZHJlbkNoYW5nZWQoYm9vbCBjaGFuZ2VkQnlQYXJzZXIsIE5vZGUqIGJlZm9yZUNoYW5nZSwgTm9k
ZSogYWZ0ZXJDaGFuZ2UsIGludCBjaGlsZENvdW50RGVsdGEpCkBAIC01MDcsNDg4ICsyOTIsNjIg
QEAgdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6Y2hpbGRyZW5DaGFuZ2VkKAogCiB2b2lkIEhUTUxT
ZWxlY3RFbGVtZW50OjpzZXRSZWNhbGNMaXN0SXRlbXMoKQogewotICAgIG1fcmVjYWxjTGlzdEl0
ZW1zID0gdHJ1ZTsKLSAgICBtX2FjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4ID0gLTE7IC8vIE1h
bnVhbCBzZWxlY3Rpb24gYW5jaG9yIGlzIHJlc2V0IHdoZW4gbWFuaXB1bGF0aW5nIHRoZSBzZWxl
Y3QgcHJvZ3JhbW1hdGljYWxseS4KLSAgICBpZiAocmVuZGVyZXIoKSkgewotICAgICAgICBpZiAo
dXNlc01lbnVMaXN0KCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJNZW51TGlzdCo+
KHJlbmRlcmVyKCkpLT5zZXRPcHRpb25zQ2hhbmdlZCh0cnVlKTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGlzdEJveCo+KHJlbmRlcmVyKCkpLT5zZXRPcHRp
b25zQ2hhbmdlZCh0cnVlKTsKLSAgICB9CisgICAgU2VsZWN0RWxlbWVudDo6c2V0UmVjYWxjTGlz
dEl0ZW1zKG1fZGF0YSwgdGhpcyk7CisKICAgICBpZiAoIWluRG9jdW1lbnQoKSkKICAgICAgICAg
bV9jb2xsZWN0aW9uSW5mby5yZXNldCgpOwotICAgIHNldE5lZWRzU3R5bGVSZWNhbGMoKTsKIH0K
IAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6cmVzZXQoKQogewotICAgIGJvb2wgb3B0aW9uU2Vs
ZWN0ZWQgPSBmYWxzZTsKLSAgICBIVE1MT3B0aW9uRWxlbWVudCogZmlyc3RPcHRpb24gPSAwOwot
ICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgdW5z
aWduZWQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAg
ICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAg
SFRNTE9wdGlvbkVsZW1lbnQgKm9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50
Kj4oaXRlbXNbaV0pOwotICAgICAgICAgICAgaWYgKCFvcHRpb24tPmdldEF0dHJpYnV0ZShzZWxl
Y3RlZEF0dHIpLmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgb3B0aW9uLT5zZXRTZWxlY3Rl
ZFN0YXRlKHRydWUpOwotICAgICAgICAgICAgICAgIG9wdGlvblNlbGVjdGVkID0gdHJ1ZTsKLSAg
ICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWRTdGF0
ZShmYWxzZSk7Ci0gICAgICAgICAgICBpZiAoIWZpcnN0T3B0aW9uKQotICAgICAgICAgICAgICAg
IGZpcnN0T3B0aW9uID0gb3B0aW9uOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghb3B0aW9u
U2VsZWN0ZWQgJiYgZmlyc3RPcHRpb24gJiYgdXNlc01lbnVMaXN0KCkpCi0gICAgICAgIGZpcnN0
T3B0aW9uLT5zZXRTZWxlY3RlZFN0YXRlKHRydWUpOwotICAgIAotICAgIHNldE5lZWRzU3R5bGVS
ZWNhbGMoKTsKKyAgICBTZWxlY3RFbGVtZW50OjpyZXNldChtX2RhdGEsIHRoaXMpOwogfQogCiB2
b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEZvY3VzRXZlbnQoKQogewotICAgIGlmICh1
c2VzTWVudUxpc3QoKSkKLSAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBi
ZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBl
dmVudHMgZHVyaW5nIGJsdXIgZXZlbnQgZGlzcGF0Y2hhbAotICAgICAgICBzYXZlTGFzdFNlbGVj
dGlvbigpOworICAgIFNlbGVjdEVsZW1lbnQ6OmRpc3BhdGNoRm9jdXNFdmVudChtX2RhdGEsIHRo
aXMpOwogICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6OmRpc3BhdGNoRm9jdXNF
dmVudCgpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEJsdXJFdmVudCgp
CiB7Ci0gICAgLy8gV2Ugb25seSBuZWVkIHRvIGZpcmUgY2hhbmdlIGV2ZW50cyBoZXJlIGZvciBt
ZW51IGxpc3RzLCBiZWNhdXNlIHdlIGZpcmUgY2hhbmdlIGV2ZW50cyBmb3IgbGlzdCBib3hlcyB3
aGVuZXZlciB0aGUgc2VsZWN0aW9uIGNoYW5nZSBpcyBhY3R1YWxseSBtYWRlLgotICAgIC8vIFRo
aXMgbWF0Y2hlcyBvdGhlciBicm93c2VycycgYmVoYXZpb3IuCi0gICAgaWYgKHVzZXNNZW51TGlz
dCgpKQotICAgICAgICBtZW51TGlzdE9uQ2hhbmdlKCk7CisgICAgU2VsZWN0RWxlbWVudDo6ZGlz
cGF0Y2hCbHVyRXZlbnQobV9kYXRhLCB0aGlzKTsKICAgICBIVE1MRm9ybUNvbnRyb2xFbGVtZW50
V2l0aFN0YXRlOjpkaXNwYXRjaEJsdXJFdmVudCgpOwogfQogCi12b2lkIEhUTUxTZWxlY3RFbGVt
ZW50OjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50KiBldnQpCi17Ci0gICAgaWYgKCFyZW5kZXJl
cigpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKHVzZXNNZW51TGlzdCgpKQotICAg
ICAgICBtZW51TGlzdERlZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKLSAgICBlbHNlIAotICAgICAg
ICBsaXN0Qm94RGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotICAgIAotICAgIGlmIChldnQtPmRl
ZmF1bHRIYW5kbGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChldnQtPnR5cGUoKSA9
PSBldmVudE5hbWVzKCkua2V5cHJlc3NFdmVudCAmJiBldnQtPmlzS2V5Ym9hcmRFdmVudCgpKSB7
Ci0gICAgICAgIEtleWJvYXJkRXZlbnQqIGtleWJvYXJkRXZlbnQgPSBzdGF0aWNfY2FzdDxLZXli
b2FyZEV2ZW50Kj4oZXZ0KTsKLSAgICAKLSAgICAgICAgaWYgKCFrZXlib2FyZEV2ZW50LT5jdHJs
S2V5KCkgJiYgIWtleWJvYXJkRXZlbnQtPmFsdEtleSgpICYmICFrZXlib2FyZEV2ZW50LT5tZXRh
S2V5KCkgJiYKLSAgICAgICAgICAgIGlzUHJpbnRhYmxlQ2hhcihrZXlib2FyZEV2ZW50LT5jaGFy
Q29kZSgpKSkgewotICAgICAgICAgICAgdHlwZUFoZWFkRmluZChrZXlib2FyZEV2ZW50KTsKLSAg
ICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6
OmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6
bWVudUxpc3REZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50KiBldnQpCit2b2lkIEhUTUxTZWxlY3RF
bGVtZW50OjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50KiBldmVudCkKIHsKLSAgICBpZiAoZXZ0
LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleWRvd25FdmVudCkgewotICAgICAgICBpZiAoIXJl
bmRlcmVyKCkgfHwgIWV2dC0+aXNLZXlib2FyZEV2ZW50KCkpCi0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIFN0cmluZyBrZXlJZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVu
dCo+KGV2dCktPmtleUlkZW50aWZpZXIoKTsKLSAgICAgICAgYm9vbCBoYW5kbGVkID0gZmFsc2U7
Ci0jaWYgQVJST1dfS0VZU19QT1BfTUVOVQotICAgICAgICBpZiAoa2V5SWRlbnRpZmllciA9PSAi
RG93biIgfHwga2V5SWRlbnRpZmllciA9PSAiVXAiKSB7Ci0gICAgICAgICAgICBmb2N1cygpOwot
ICAgICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0
byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBldmVudHMgZHVyaW5n
IHNldFNlbGVjdGVkSW5kZXgsCi0gICAgICAgICAgICAvLyB3aGljaCBnZXRzIGNhbGxlZCBmcm9t
IFJlbmRlck1lbnVMaXN0Ojp2YWx1ZUNoYW5nZWQsIHdoaWNoIGdldHMgY2FsbGVkIGFmdGVyIHRo
ZSB1c2VyIG1ha2VzIGEgc2VsZWN0aW9uIGZyb20gdGhlIG1lbnUuCi0gICAgICAgICAgICBzYXZl
TGFzdFNlbGVjdGlvbigpOwotICAgICAgICAgICAgaWYgKFJlbmRlck1lbnVMaXN0KiBtZW51TGlz
dCA9IHN0YXRpY19jYXN0PFJlbmRlck1lbnVMaXN0Kj4ocmVuZGVyZXIoKSkpCi0gICAgICAgICAg
ICAgICAgbWVudUxpc3QtPnNob3dQb3B1cCgpOwotICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7
Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJ
bmRleChzZWxlY3RlZEluZGV4KCkpOwotICAgICAgICBpZiAoa2V5SWRlbnRpZmllciA9PSAiRG93
biIgfHwga2V5SWRlbnRpZmllciA9PSAiUmlnaHQiKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9
IGxpc3RJdGVtcygpLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAobGlzdEluZGV4ICs9IDE7Ci0g
ICAgICAgICAgICAgICAgIGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHNpemUgJiYgKGxp
c3RJdGVtcygpW2xpc3RJbmRleF0tPmRpc2FibGVkKCkgfHwgIWxpc3RJdGVtcygpW2xpc3RJbmRl
eF0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSk7Ci0gICAgICAgICAgICAgICAgICsrbGlzdEluZGV4
KSB7IH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxpc3RJbmRleCA+PSAwICYmIGxp
c3RJbmRleCA8IHNpemUpCi0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChsaXN0VG9P
cHRpb25JbmRleChsaXN0SW5kZXgpKTsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAg
ICAgICB9IGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIlVwIiB8fCBrZXlJZGVudGlmaWVyID09
ICJMZWZ0IikgewotICAgICAgICAgICAgaW50IHNpemUgPSBsaXN0SXRlbXMoKS5zaXplKCk7Ci0g
ICAgICAgICAgICBmb3IgKGxpc3RJbmRleCAtPSAxOwotICAgICAgICAgICAgICAgICBsaXN0SW5k
ZXggPj0gMCAmJiBsaXN0SW5kZXggPCBzaXplICYmIChsaXN0SXRlbXMoKVtsaXN0SW5kZXhdLT5k
aXNhYmxlZCgpIHx8ICFsaXN0SXRlbXMoKVtsaXN0SW5kZXhdLT5oYXNUYWdOYW1lKG9wdGlvblRh
ZykpOwotICAgICAgICAgICAgICAgICAtLWxpc3RJbmRleCkgeyB9Ci0gICAgICAgICAgICAKLSAg
ICAgICAgICAgIGlmIChsaXN0SW5kZXggPj0gMCAmJiBsaXN0SW5kZXggPCBzaXplKQotICAgICAg
ICAgICAgICAgIHNldFNlbGVjdGVkSW5kZXgobGlzdFRvT3B0aW9uSW5kZXgobGlzdEluZGV4KSk7
Ci0gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAg
IGlmIChoYW5kbGVkKQotICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAg
IH0KLQotICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBzaW5jZSBzZW5kaW5nIHNpbXVs
YXRlZCBtb3VzZSBldmVudHMKLSAgICAvLyBvbiBrZXkgZG93biBibG9ja3MgdGhlIHByb3BlciBz
ZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQuCi0gICAgaWYgKGV2dC0+dHlwZSgpID09IGV2
ZW50TmFtZXMoKS5rZXlwcmVzc0V2ZW50KSB7Ci0gICAgICAgIGlmICghcmVuZGVyZXIoKSB8fCAh
ZXZ0LT5pc0tleWJvYXJkRXZlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaW50
IGtleUNvZGUgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50Kj4oZXZ0KS0+a2V5Q29kZSgpOwot
ICAgICAgICBib29sIGhhbmRsZWQgPSBmYWxzZTsKLSNpZiBBUlJPV19LRVlTX1BPUF9NRU5VCi0g
ICAgICAgIGlmIChrZXlDb2RlID09ICcgJykgewotICAgICAgICAgICAgZm9jdXMoKTsKLSAgICAg
ICAgICAgIC8vIFNhdmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhl
IG5ldyBzZWxlY3Rpb24gd2hlbiBkaXNwYXRjaGluZyBjaGFuZ2UgZXZlbnRzIGR1cmluZyBzZXRT
ZWxlY3RlZEluZGV4LAotICAgICAgICAgICAgLy8gd2hpY2ggZ2V0cyBjYWxsZWQgZnJvbSBSZW5k
ZXJNZW51TGlzdDo6dmFsdWVDaGFuZ2VkLCB3aGljaCBnZXRzIGNhbGxlZCBhZnRlciB0aGUgdXNl
ciBtYWtlcyBhIHNlbGVjdGlvbiBmcm9tIHRoZSBtZW51LgotICAgICAgICAgICAgc2F2ZUxhc3RT
ZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChSZW5kZXJNZW51TGlzdCogbWVudUxpc3QgPSBz
dGF0aWNfY2FzdDxSZW5kZXJNZW51TGlzdCo+KHJlbmRlcmVyKCkpKQotICAgICAgICAgICAgICAg
IG1lbnVMaXN0LT5zaG93UG9wdXAoKTsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAg
ICAgICB9Ci0gICAgICAgIGlmIChrZXlDb2RlID09ICdccicpIHsKLSAgICAgICAgICAgIG1lbnVM
aXN0T25DaGFuZ2UoKTsKLSAgICAgICAgICAgIGlmIChmb3JtKCkpCi0gICAgICAgICAgICAgICAg
Zm9ybSgpLT5zdWJtaXRDbGljayhldnQpOwotICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0g
ICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRl
eChzZWxlY3RlZEluZGV4KCkpOwotICAgICAgICBpZiAoa2V5Q29kZSA9PSAnXHInKSB7Ci0gICAg
ICAgICAgICAvLyBsaXN0SW5kZXggc2hvdWxkIGFscmVhZHkgYmUgc2VsZWN0ZWQsIGJ1dCB0aGlz
IHdpbGwgZmlyZSB0aGUgb25jaGFuZ2UgaGFuZGxlci4KLSAgICAgICAgICAgIHNldFNlbGVjdGVk
SW5kZXgobGlzdFRvT3B0aW9uSW5kZXgobGlzdEluZGV4KSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAg
ICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGlmIChoYW5k
bGVkKQotICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgIH0KLQotICAg
IGlmIChldnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2Vkb3duRXZlbnQgJiYgZXZ0LT5p
c01vdXNlRXZlbnQoKSAmJiBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZ0KS0+YnV0dG9uKCkg
PT0gTGVmdEJ1dHRvbikgewotICAgICAgICBmb2N1cygpOwotICAgICAgICBpZiAoUmVuZGVyTWVu
dUxpc3QqIG1lbnVMaXN0ID0gc3RhdGljX2Nhc3Q8UmVuZGVyTWVudUxpc3QqPihyZW5kZXJlcigp
KSkgewotICAgICAgICAgICAgaWYgKG1lbnVMaXN0LT5wb3B1cElzVmlzaWJsZSgpKQotICAgICAg
ICAgICAgICAgIG1lbnVMaXN0LT5oaWRlUG9wdXAoKTsKLSAgICAgICAgICAgIGVsc2UgewotICAg
ICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQg
dG8gdGhlIG5ldyBzZWxlY3Rpb24gd2hlbiB3ZSBjYWxsIG9uQ2hhbmdlIGR1cmluZyBzZXRTZWxl
Y3RlZEluZGV4LAotICAgICAgICAgICAgICAgIC8vIHdoaWNoIGdldHMgY2FsbGVkIGZyb20gUmVu
ZGVyTWVudUxpc3Q6OnZhbHVlQ2hhbmdlZCwgd2hpY2ggZ2V0cyBjYWxsZWQgYWZ0ZXIgdGhlIHVz
ZXIgbWFrZXMgYSBzZWxlY3Rpb24gZnJvbSB0aGUgbWVudS4KLSAgICAgICAgICAgICAgICBzYXZl
TGFzdFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAoKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVk
KCk7Ci0gICAgfQorICAgIFNlbGVjdEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIobV9kYXRh
LCB0aGlzLCBldmVudCwgZm9ybSgpKTsKIH0KIAotdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6bGlz
dEJveERlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnQqIGV2dCkKK3ZvaWQgSFRNTFNlbGVjdEVsZW1l
bnQ6OnNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGludCBpbmRleCkKIHsKLSAgICBpZiAo
ZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1vdXNlZG93bkV2ZW50ICYmIGV2dC0+aXNNb3Vz
ZUV2ZW50KCkgJiYgc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2dCktPmJ1dHRvbigpID09IExl
ZnRCdXR0b24pIHsKLSAgICAgICAgZm9jdXMoKTsKLQotICAgICAgICAvLyBDb252ZXJ0IHRvIGNv
b3JkcyByZWxhdGl2ZSB0byB0aGUgbGlzdCBib3ggaWYgbmVlZGVkLgotICAgICAgICBNb3VzZUV2
ZW50KiBtb3VzZUV2ZW50ID0gc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2dCk7Ci0gICAgICAg
IEludFBvaW50IGxvY2FsT2Zmc2V0ID0gcm91bmRlZEludFBvaW50KHJlbmRlcmVyKCktPmFic29s
dXRlVG9Mb2NhbChtb3VzZUV2ZW50LT5hYnNvbHV0ZUxvY2F0aW9uKCksIGZhbHNlLCB0cnVlKSk7
Ci0gICAgICAgIGludCBsaXN0SW5kZXggPSBzdGF0aWNfY2FzdDxSZW5kZXJMaXN0Qm94Kj4ocmVu
ZGVyZXIoKSktPmxpc3RJbmRleEF0T2Zmc2V0KGxvY2FsT2Zmc2V0LngoKSwgbG9jYWxPZmZzZXQu
eSgpKTsKLSAgICAgICAgaWYgKGxpc3RJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBTYXZl
IHRoZSBzZWxlY3Rpb24gc28gaXQgY2FuIGJlIGNvbXBhcmVkIHRvIHRoZSBuZXcgc2VsZWN0aW9u
IHdoZW4gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgbW91c2V1cCwgb3IgYWZ0ZXIg
YXV0b3Njcm9sbCBmaW5pc2hlcy4KLSAgICAgICAgICAgIHNhdmVMYXN0U2VsZWN0aW9uKCk7Ci0K
LSAgICAgICAgICAgIG1fYWN0aXZlU2VsZWN0aW9uU3RhdGUgPSB0cnVlOwotICAgICAgICAgICAg
Ci0gICAgICAgICAgICBib29sIG11bHRpU2VsZWN0S2V5UHJlc3NlZCA9IGZhbHNlOwotI2lmIFBM
QVRGT1JNKE1BQykKLSAgICAgICAgICAgIG11bHRpU2VsZWN0S2V5UHJlc3NlZCA9IG1vdXNlRXZl
bnQtPm1ldGFLZXkoKTsKLSNlbHNlCi0gICAgICAgICAgICBtdWx0aVNlbGVjdEtleVByZXNzZWQg
PSBtb3VzZUV2ZW50LT5jdHJsS2V5KCk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgYm9vbCBzaGlm
dFNlbGVjdCA9IG11bHRpcGxlKCkgJiYgbW91c2VFdmVudC0+c2hpZnRLZXkoKTsKLSAgICAgICAg
ICAgIGJvb2wgbXVsdGlTZWxlY3QgPSBtdWx0aXBsZSgpICYmIG11bHRpU2VsZWN0S2V5UHJlc3Nl
ZCAmJiAhbW91c2VFdmVudC0+c2hpZnRLZXkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAg
RWxlbWVudCogY2xpY2tlZEVsZW1lbnQgPSBsaXN0SXRlbXMoKVtsaXN0SW5kZXhdOyAgICAgICAg
ICAgIAotICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnQqIG9wdGlvbiA9IDA7Ci0gICAgICAg
ICAgICBpZiAoY2xpY2tlZEVsZW1lbnQtPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAg
ICAgICAgICAgICAgb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihjbGlj
a2VkRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gS2VlcCB0
cmFjayBvZiB3aGV0aGVyIGFuIGFjdGl2ZSBzZWxlY3Rpb24gKGxpa2UgZHVyaW5nIGRyYWcgc2Vs
ZWN0aW9uKSwgc2hvdWxkIHNlbGVjdCBvciBkZXNlbGVjdAotICAgICAgICAgICAgICAgIGlmIChv
cHRpb24tPnNlbGVjdGVkKCkgJiYgbXVsdGlTZWxlY3RLZXlQcmVzc2VkKQotICAgICAgICAgICAg
ICAgICAgICBtX2FjdGl2ZVNlbGVjdGlvblN0YXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAg
ICBpZiAoIW1fYWN0aXZlU2VsZWN0aW9uU3RhdGUpCi0gICAgICAgICAgICAgICAgICAgIG9wdGlv
bi0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAK
LSAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBpbiBhbnkgc3BlY2lhbCBtdWx0aXBsZSBzZWxl
Y3Rpb24gbW9kZSwgdGhlbiBkZXNlbGVjdCBhbGwgb3RoZXIgaXRlbXMsIGV4Y2x1ZGluZyB0aGUg
Y2xpY2tlZCBvcHRpb24uCi0gICAgICAgICAgICAvLyBJZiBubyBvcHRpb24gd2FzIGNsaWNrZWQs
IHRoZW4gdGhpcyB3aWxsIGRlc2VsZWN0IGFsbCBpdGVtcyBpbiB0aGUgbGlzdC4KLSAgICAgICAg
ICAgIGlmICghc2hpZnRTZWxlY3QgJiYgIW11bHRpU2VsZWN0KQotICAgICAgICAgICAgICAgIGRl
c2VsZWN0SXRlbXMob3B0aW9uKTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIGFuY2hvciBoYXNu
J3QgYmVlbiBzZXQsIGFuZCB3ZSdyZSBkb2luZyBhIHNpbmdsZSBzZWxlY3Rpb24gb3IgYSBzaGlm
dCBzZWxlY3Rpb24sIHRoZW4gaW5pdGlhbGl6ZSB0aGUgYW5jaG9yIHRvIHRoZSBmaXJzdCBzZWxl
Y3RlZCBpbmRleC4KLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4
IDwgMCAmJiAhbXVsdGlTZWxlY3QpCi0gICAgICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0aW9u
QW5jaG9ySW5kZXgoc2VsZWN0ZWRJbmRleCgpKTsKLQotICAgICAgICAgICAgLy8gU2V0IHRoZSBz
ZWxlY3Rpb24gc3RhdGUgb2YgdGhlIGNsaWNrZWQgb3B0aW9uCi0gICAgICAgICAgICBpZiAob3B0
aW9uICYmICFvcHRpb24tPmRpc2FibGVkKCkpCi0gICAgICAgICAgICAgICAgb3B0aW9uLT5zZXRT
ZWxlY3RlZFN0YXRlKHRydWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiB0aGVy
ZSB3YXMgbm8gc2VsZWN0ZWRJbmRleCgpIGZvciB0aGUgcHJldmlvdXMgaW5pdGlhbGl6YXRpb24s
IG9yCi0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBkb2luZyBhIHNpbmdsZSBzZWxlY3Rpb24sIG9y
IGEgbXVsdGlwbGUgc2VsZWN0aW9uICh1c2luZyBjbWQgb3IgY3RybCksIHRoZW4gaW5pdGlhbGl6
ZSB0aGUgYW5jaG9yIGluZGV4IHRvIHRoZSBsaXN0SW5kZXggdGhhdCBqdXN0IGdvdCBjbGlja2Vk
LgotICAgICAgICAgICAgaWYgKGxpc3RJbmRleCA+PSAwICYmIChtX2FjdGl2ZVNlbGVjdGlvbkFu
Y2hvckluZGV4IDwgMCB8fCAhc2hpZnRTZWxlY3QpKQotICAgICAgICAgICAgICAgIHNldEFjdGl2
ZVNlbGVjdGlvbkFuY2hvckluZGV4KGxpc3RJbmRleCk7Ci0gICAgICAgICAgICAKLSAgICAgICAg
ICAgIHNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGxpc3RJbmRleCk7Ci0gICAgICAgICAgICB1
cGRhdGVMaXN0Qm94U2VsZWN0aW9uKCFtdWx0aVNlbGVjdCk7Ci0KLSAgICAgICAgICAgIGlmIChG
cmFtZSogZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgpKQotICAgICAgICAgICAgICAgIGZyYW1l
LT5ldmVudEhhbmRsZXIoKS0+c2V0TW91c2VEb3duTWF5U3RhcnRBdXRvc2Nyb2xsKCk7Ci0KLSAg
ICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0gZWxz
ZSBpZiAoZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1vdXNldXBFdmVudCAmJiBldnQtPmlz
TW91c2VFdmVudCgpICYmIHN0YXRpY19jYXN0PE1vdXNlRXZlbnQqPihldnQpLT5idXR0b24oKSA9
PSBMZWZ0QnV0dG9uICYmIGRvY3VtZW50KCktPmZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5hdXRv
c2Nyb2xsUmVuZGVyZXIoKSAhPSByZW5kZXJlcigpKQotICAgICAgICAvLyBUaGlzIG1ha2VzIHN1
cmUgd2UgZmlyZSBkaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQgZm9yIGEgc2luZ2xlIGNs
aWNrLiAgRm9yIGRyYWcgc2VsZWN0aW9uLCBvbkNoYW5nZSB3aWxsIGZpcmUgd2hlbiB0aGUgYXV0
b3Njcm9sbCB0aW1lciBzdG9wcy4KLSAgICAgICAgbGlzdEJveE9uQ2hhbmdlKCk7Ci0gICAgZWxz
ZSBpZiAoZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleWRvd25FdmVudCkgewotICAgICAg
ICBpZiAoIWV2dC0+aXNLZXlib2FyZEV2ZW50KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIFN0cmluZyBrZXlJZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2
dCktPmtleUlkZW50aWZpZXIoKTsKLQotICAgICAgICBpbnQgZW5kSW5kZXggPSAwOyAgICAgICAg
Ci0gICAgICAgIGlmIChtX2FjdGl2ZVNlbGVjdGlvbkVuZEluZGV4IDwgMCkgewotICAgICAgICAg
ICAgLy8gSW5pdGlhbGl6ZSB0aGUgZW5kIGluZGV4Ci0gICAgICAgICAgICBpZiAoa2V5SWRlbnRp
ZmllciA9PSAiRG93biIpCi0gICAgICAgICAgICAgICAgZW5kSW5kZXggPSBuZXh0U2VsZWN0YWJs
ZUxpc3RJbmRleChsYXN0U2VsZWN0ZWRMaXN0SW5kZXgoKSk7Ci0gICAgICAgICAgICBlbHNlIGlm
IChrZXlJZGVudGlmaWVyID09ICJVcCIpCi0gICAgICAgICAgICAgICAgZW5kSW5kZXggPSBwcmV2
aW91c1NlbGVjdGFibGVMaXN0SW5kZXgob3B0aW9uVG9MaXN0SW5kZXgoc2VsZWN0ZWRJbmRleCgp
KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBpbmRleCBi
YXNlZCBvbiB0aGUgY3VycmVudCBlbmQgaW5kZXgKLSAgICAgICAgICAgIGlmIChrZXlJZGVudGlm
aWVyID09ICJEb3duIikKLSAgICAgICAgICAgICAgICBlbmRJbmRleCA9IG5leHRTZWxlY3RhYmxl
TGlzdEluZGV4KG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgpOwotICAgICAgICAgICAgZWxzZSBp
ZiAoa2V5SWRlbnRpZmllciA9PSAiVXAiKQotICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gcHJl
dmlvdXNTZWxlY3RhYmxlTGlzdEluZGV4KG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgpOyAgICAK
LSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGtleUlkZW50aWZpZXIgPT0gIkRvd24i
IHx8IGtleUlkZW50aWZpZXIgPT0gIlVwIikgewotICAgICAgICAgICAgLy8gU2F2ZSB0aGUgc2Vs
ZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRp
c3BhdGNoaW5nIGNoYW5nZSBldmVudHMgaW1tZWRpYXRlbHkgYWZ0ZXIgbWFraW5nIHRoZSBuZXcg
c2VsZWN0aW9uLgotICAgICAgICAgICAgc2F2ZUxhc3RTZWxlY3Rpb24oKTsKLQotICAgICAgICAg
ICAgQVNTRVJUKGVuZEluZGV4ID49IDAgJiYgKHVuc2lnbmVkKWVuZEluZGV4IDwgbGlzdEl0ZW1z
KCkuc2l6ZSgpKTsgCi0gICAgICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChlbmRJ
bmRleCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIHRoZSBhbmNob3IgaXMgdW5p
dGlhbGl6ZWQsIG9yIGlmIHdlJ3JlIGdvaW5nIHRvIGRlc2VsZWN0IGFsbCBvdGhlciBvcHRpb25z
LCB0aGVuIHNldCB0aGUgYW5jaG9yIGluZGV4IGVxdWFsIHRvIHRoZSBlbmQgaW5kZXguCi0gICAg
ICAgICAgICBib29sIGRlc2VsZWN0T3RoZXJzID0gIW11bHRpcGxlKCkgfHwgIXN0YXRpY19jYXN0
PEtleWJvYXJkRXZlbnQqPihldnQpLT5zaGlmdEtleSgpOwotICAgICAgICAgICAgaWYgKG1fYWN0
aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXggPCAwIHx8IGRlc2VsZWN0T3RoZXJzKSB7Ci0gICAgICAg
ICAgICAgICAgbV9hY3RpdmVTZWxlY3Rpb25TdGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAg
aWYgKGRlc2VsZWN0T3RoZXJzKQotICAgICAgICAgICAgICAgICAgICBkZXNlbGVjdEl0ZW1zKCk7
Ci0gICAgICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgobV9hY3RpdmVT
ZWxlY3Rpb25FbmRJbmRleCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXRpY19j
YXN0PFJlbmRlckxpc3RCb3gqPihyZW5kZXJlcigpKS0+c2Nyb2xsVG9SZXZlYWxFbGVtZW50QXRM
aXN0SW5kZXgoZW5kSW5kZXgpOwotICAgICAgICAgICAgdXBkYXRlTGlzdEJveFNlbGVjdGlvbihk
ZXNlbGVjdE90aGVycyk7Ci0gICAgICAgICAgICBsaXN0Qm94T25DaGFuZ2UoKTsKLSAgICAgICAg
ICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAo
ZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleXByZXNzRXZlbnQpIHsKLSAgICAgICAgaWYg
KCFldnQtPmlzS2V5Ym9hcmRFdmVudCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBp
bnQga2V5Q29kZSA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihldnQpLT5rZXlDb2RlKCk7
Ci0KLSAgICAgICAgaWYgKGtleUNvZGUgPT0gJ1xyJykgewotICAgICAgICAgICAgaWYgKGZvcm0o
KSkKLSAgICAgICAgICAgICAgICBmb3JtKCktPnN1Ym1pdENsaWNrKGV2dCk7Ci0gICAgICAgICAg
ICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLSAgICB9CisgICAgU2VsZWN0RWxlbWVudDo6c2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5k
ZXgobV9kYXRhLCB0aGlzLCBpbmRleCk7CiB9CiAKLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNl
dEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGludCBpbmRleCkKK3ZvaWQgSFRNTFNlbGVjdEVs
ZW1lbnQ6OnNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGludCBpbmRleCkKIHsKLSAgICBtX2Fj
dGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4ID0gaW5kZXg7Ci0gICAgCi0gICAgLy8gQ2FjaGUgdGhl
IHNlbGVjdGlvbiBzdGF0ZSBzbyB3ZSBjYW4gcmVzdG9yZSB0aGUgb2xkIHNlbGVjdGlvbiBhcyB0
aGUgbmV3IHNlbGVjdGlvbiBwaXZvdHMgYXJvdW5kIHRoaXMgYW5jaG9yIGluZGV4Ci0gICAgY29u
c3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBtX2NhY2hlZFN0
YXRlRm9yQWN0aXZlU2VsZWN0aW9uLmNsZWFyKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxO
YW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgIEhUTUxPcHRpb25FbGVtZW50KiBvcHRpb24g
PSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAg
IG1fY2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24uYXBwZW5kKG9wdGlvbi0+c2VsZWN0ZWQo
KSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbV9jYWNoZWRTdGF0ZUZvckFjdGl2ZVNl
bGVjdGlvbi5hcHBlbmQoZmFsc2UpOwotICAgIH0KKyAgICBTZWxlY3RFbGVtZW50OjpzZXRBY3Rp
dmVTZWxlY3Rpb25FbmRJbmRleChtX2RhdGEsIGluZGV4KTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0
RWxlbWVudDo6dXBkYXRlTGlzdEJveFNlbGVjdGlvbihib29sIGRlc2VsZWN0T3RoZXJPcHRpb25z
KQogewotICAgIEFTU0VSVChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPmlzTGlzdEJveCgpKTsK
LSAgICAKLSAgICB1bnNpZ25lZCBzdGFydDsKLSAgICB1bnNpZ25lZCBlbmQ7Ci0gICAgQVNTRVJU
KG1fYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXggPj0gMCk7Ci0gICAgc3RhcnQgPSBtaW4obV9h
Y3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCwgbV9hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCk7Ci0g
ICAgZW5kID0gbWF4KG1fYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgsIG1fYWN0aXZlU2VsZWN0
aW9uRW5kSW5kZXgpOwotCi0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBsaXN0
SXRlbXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKysp
IHsKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAg
ICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnQqIG9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRp
b25FbGVtZW50Kj4oaXRlbXNbaV0pOwotICAgICAgICAgICAgaWYgKCFvcHRpb24tPmRpc2FibGVk
KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+PSBzdGFydCAmJiBpIDw9IGVuZCkKLSAgICAg
ICAgICAgICAgICAgICAgb3B0aW9uLT5zZXRTZWxlY3RlZFN0YXRlKG1fYWN0aXZlU2VsZWN0aW9u
U3RhdGUpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlc2VsZWN0T3RoZXJPcHRpb25zIHx8
IGkgPj0gbV9jYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbi5zaXplKCkpCi0gICAgICAgICAg
ICAgICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBvcHRpb24tPnNldFNlbGVjdGVkU3RhdGUobV9j
YWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbltpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBzY3JvbGxUb1NlbGVjdGlvbigpOworICAgIFNlbGVjdEVsZW1lbnQ6
OnVwZGF0ZUxpc3RCb3hTZWxlY3Rpb24obV9kYXRhLCB0aGlzLCBkZXNlbGVjdE90aGVyT3B0aW9u
cyk7CiB9CiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6Om1lbnVMaXN0T25DaGFuZ2UoKQogewot
ICAgIEFTU0VSVCh1c2VzTWVudUxpc3QoKSk7Ci0gICAgaW50IHNlbGVjdGVkID0gc2VsZWN0ZWRJ
bmRleCgpOwotICAgIGlmIChtX2xhc3RPbkNoYW5nZUluZGV4ICE9IHNlbGVjdGVkKSB7Ci0gICAg
ICAgIG1fbGFzdE9uQ2hhbmdlSW5kZXggPSBzZWxlY3RlZDsKLSAgICAgICAgZGlzcGF0Y2hGb3Jt
Q29udHJvbENoYW5nZUV2ZW50KCk7Ci0gICAgfQorICAgIFNlbGVjdEVsZW1lbnQ6Om1lbnVMaXN0
T25DaGFuZ2UobV9kYXRhLCB0aGlzKTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6bGlz
dEJveE9uQ2hhbmdlKCkKIHsKLSAgICBBU1NFUlQoIXVzZXNNZW51TGlzdCgpKTsKLQotICAgIGNv
bnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgCi0gICAgLy8g
SWYgdGhlIGNhY2hlZCBzZWxlY3Rpb24gbGlzdCBpcyBlbXB0eSwgb3IgdGhlIHNpemUgaGFzIGNo
YW5nZWQsIHRoZW4gZmlyZSBkaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQsIGFuZCByZXR1
cm4gZWFybHkuCi0gICAgaWYgKG1fbGFzdE9uQ2hhbmdlU2VsZWN0aW9uLmlzRW1wdHkoKSB8fCBt
X2xhc3RPbkNoYW5nZVNlbGVjdGlvbi5zaXplKCkgIT0gaXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAg
IGRpc3BhdGNoRm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotICAgIAotICAgIC8vIFVwZGF0ZSBtX2xhc3RPbkNoYW5nZVNlbGVjdGlvbiBhbmQgZmlyZSBk
aXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQKLSAgICBib29sIGZpcmVPbkNoYW5nZSA9IGZh
bHNlOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewot
ICAgICAgICBib29sIHNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFz
TG9jYWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBzZWxlY3RlZCA9IHN0YXRpY19jYXN0
PEhUTUxPcHRpb25FbGVtZW50Kj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpOwotICAgICAgICBpZiAo
c2VsZWN0ZWQgIT0gbV9sYXN0T25DaGFuZ2VTZWxlY3Rpb25baV0pICAgICAgCi0gICAgICAgICAg
ICBmaXJlT25DaGFuZ2UgPSB0cnVlOwotICAgICAgICBtX2xhc3RPbkNoYW5nZVNlbGVjdGlvbltp
XSA9IHNlbGVjdGVkOwotICAgIH0KLSAgICBpZiAoZmlyZU9uQ2hhbmdlKQotICAgICAgICBkaXNw
YXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQoKTsKKyAgICBTZWxlY3RFbGVtZW50OjpsaXN0Qm94
T25DaGFuZ2UobV9kYXRhLCB0aGlzKTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2F2
ZUxhc3RTZWxlY3Rpb24oKQogewotICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0g
bGlzdEl0ZW1zKCk7Ci0KLSAgICBpZiAodXNlc01lbnVMaXN0KCkpIHsKLSAgICAgICAgbV9sYXN0
T25DaGFuZ2VJbmRleCA9IHNlbGVjdGVkSW5kZXgoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICAKLSAgICBtX2xhc3RPbkNoYW5nZVNlbGVjdGlvbi5jbGVhcigpOwotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNb
aV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxl
bWVudCogb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihpdGVtc1tpXSk7
Ci0gICAgICAgICAgICBtX2xhc3RPbkNoYW5nZVNlbGVjdGlvbi5hcHBlbmQob3B0aW9uLT5zZWxl
Y3RlZCgpKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBtX2xhc3RPbkNoYW5nZVNlbGVj
dGlvbi5hcHBlbmQoZmFsc2UpOwotICAgIH0KLX0KLQotc3RhdGljIFN0cmluZyBzdHJpcExlYWRp
bmdXaGl0ZVNwYWNlKGNvbnN0IFN0cmluZyYgc3RyaW5nKQotewotICAgIGludCBsZW5ndGggPSBz
dHJpbmcubGVuZ3RoKCk7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsg
KytpKQotICAgICAgICBpZiAoc3RyaW5nW2ldICE9IG5vQnJlYWtTcGFjZSAmJgotICAgICAgICAg
ICAgKHN0cmluZ1tpXSA8PSAweDdGID8gIWlzQVNDSUlTcGFjZShzdHJpbmdbaV0pIDogKGRpcmVj
dGlvbihzdHJpbmdbaV0pICE9IFdoaXRlU3BhY2VOZXV0cmFsKSkpCi0gICAgICAgICAgICBicmVh
azsKLQotICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKGksIGxlbmd0aCAtIGkpOwotfQotCi12
b2lkIEhUTUxTZWxlY3RFbGVtZW50Ojp0eXBlQWhlYWRGaW5kKEtleWJvYXJkRXZlbnQqIGV2ZW50
KQotewotICAgIGlmIChldmVudC0+dGltZVN0YW1wKCkgPCBtX2xhc3RDaGFyVGltZSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgRE9NVGltZVN0YW1wIGRlbHRhID0gZXZlbnQtPnRpbWVTdGFtcCgp
IC0gbV9sYXN0Q2hhclRpbWU7Ci0KLSAgICBtX2xhc3RDaGFyVGltZSA9IGV2ZW50LT50aW1lU3Rh
bXAoKTsKLQotICAgIFVDaGFyIGMgPSBldmVudC0+Y2hhckNvZGUoKTsKLQotICAgIFN0cmluZyBw
cmVmaXg7Ci0gICAgaW50IHNlYXJjaFN0YXJ0T2Zmc2V0ID0gMTsKLSAgICBpZiAoZGVsdGEgPiB0
eXBlQWhlYWRUaW1lb3V0KSB7Ci0gICAgICAgIG1fdHlwZWRTdHJpbmcgPSBwcmVmaXggPSBTdHJp
bmcoJmMsIDEpOwotICAgICAgICBtX3JlcGVhdGluZ0NoYXIgPSBjOwotICAgIH0gZWxzZSB7Ci0g
ICAgICAgIG1fdHlwZWRTdHJpbmcuYXBwZW5kKGMpOwotCi0gICAgICAgIGlmIChjID09IG1fcmVw
ZWF0aW5nQ2hhcikKLSAgICAgICAgICAgIC8vIFRoZSB1c2VyIGlzIGxpa2VseSB0cnlpbmcgdG8g
Y3ljbGUgdGhyb3VnaCBhbGwgdGhlIGl0ZW1zIHN0YXJ0aW5nIHdpdGggdGhpcyBjaGFyYWN0ZXIs
IHNvIGp1c3Qgc2VhcmNoIG9uIHRoZSBjaGFyYWN0ZXIKLSAgICAgICAgICAgIHByZWZpeCA9IFN0
cmluZygmYywgMSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbV9yZXBlYXRpbmdDaGFy
ID0gMDsKLSAgICAgICAgICAgIHByZWZpeCA9IG1fdHlwZWRTdHJpbmc7Ci0gICAgICAgICAgICBz
ZWFyY2hTdGFydE9mZnNldCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCBWZWN0
b3I8RWxlbWVudCo+JiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGludCBpdGVtQ291bnQgPSBp
dGVtcy5zaXplKCk7Ci0gICAgaWYgKGl0ZW1Db3VudCA8IDEpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIGludCBzZWxlY3RlZCA9IHNlbGVjdGVkSW5kZXgoKTsKLSAgICBpbnQgaW5kZXggPSAob3B0
aW9uVG9MaXN0SW5kZXgoc2VsZWN0ZWQgPj0gMCA/IHNlbGVjdGVkIDogMCkgKyBzZWFyY2hTdGFy
dE9mZnNldCkgJSBpdGVtQ291bnQ7Ci0gICAgQVNTRVJUKGluZGV4ID49IDApOwotICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyssIGluZGV4ID0gKGluZGV4ICsgMSkgJSBpdGVt
Q291bnQpIHsKLSAgICAgICAgaWYgKCFpdGVtc1tpbmRleF0tPmhhc1RhZ05hbWUob3B0aW9uVGFn
KSB8fCBpdGVtc1tpbmRleF0tPmRpc2FibGVkKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQot
ICAgICAgICBTdHJpbmcgdGV4dCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4oaXRl
bXNbaW5kZXhdKS0+dGV4dEluZGVudGVkVG9SZXNwZWN0R3JvdXBMYWJlbCgpOwotICAgICAgICBp
ZiAoc3RyaXBMZWFkaW5nV2hpdGVTcGFjZSh0ZXh0KS5zdGFydHNXaXRoKHByZWZpeCwgZmFsc2Up
KSB7Ci0gICAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KGxpc3RUb09wdGlvbkluZGV4KGluZGV4
KSk7Ci0gICAgICAgICAgICBpZiAoIXVzZXNNZW51TGlzdCgpKQotICAgICAgICAgICAgICAgIGxp
c3RCb3hPbkNoYW5nZSgpOwotICAgICAgICAgICAgc2V0TmVlZHNTdHlsZVJlY2FsYygpOwotICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotCi1pbnQgSFRNTFNlbGVjdEVs
ZW1lbnQ6Om5leHRTZWxlY3RhYmxlTGlzdEluZGV4KGludCBzdGFydEluZGV4KQotewotICAgIGNv
bnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaW50IGluZGV4
ID0gc3RhcnRJbmRleCArIDE7Ci0gICAgd2hpbGUgKGluZGV4ID49IDAgJiYgKHVuc2lnbmVkKWlu
ZGV4IDwgaXRlbXMuc2l6ZSgpICYmICghaXRlbXNbaW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9u
VGFnKSB8fCBpdGVtc1tpbmRleF0tPmRpc2FibGVkKCkpKQotICAgICAgICBpbmRleCsrOwotICAg
IGlmICgodW5zaWduZWQpIGluZGV4ID09IGl0ZW1zLnNpemUoKSkKLSAgICAgICAgcmV0dXJuIHN0
YXJ0SW5kZXg7Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi1pbnQgSFRNTFNlbGVjdEVsZW1lbnQ6
OnByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleChpbnQgc3RhcnRJbmRleCkKLXsKLSAgICBjb25z
dCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGlmIChzdGFydElu
ZGV4ID09IC0xKQotICAgICAgICBzdGFydEluZGV4ID0gaXRlbXMuc2l6ZSgpOwotICAgIGludCBp
bmRleCA9IHN0YXJ0SW5kZXggLSAxOwotICAgIHdoaWxlIChpbmRleCA+PSAwICYmICh1bnNpZ25l
ZClpbmRleCA8IGl0ZW1zLnNpemUoKSAmJiAoIWl0ZW1zW2luZGV4XS0+aGFzTG9jYWxOYW1lKG9w
dGlvblRhZykgfHwgaXRlbXNbaW5kZXhdLT5kaXNhYmxlZCgpKSkKLSAgICAgICAgaW5kZXgtLTsK
LSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgIHJl
dHVybiBpbmRleDsKKyAgICBTZWxlY3RFbGVtZW50OjpzYXZlTGFzdFNlbGVjdGlvbihtX2RhdGEs
IHRoaXMpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjphY2Nlc3NLZXlBY3Rpb24oYm9v
bCBzZW5kVG9BbnlFbGVtZW50KQpAQCAtMTA1Niw3ICs0MTUsNyBAQCB2b2lkIEhUTUxTZWxlY3RF
bGVtZW50OjpzZXRPcHRpb24odW5zaWduCiAgICAgaWYgKCFlYykgewogICAgICAgICBhZGQob3B0
aW9uLCBiZWZvcmUsIGVjKTsKICAgICAgICAgaWYgKGRpZmYgPj0gMCAmJiBvcHRpb24tPnNlbGVj
dGVkKCkpCi0gICAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KGluZGV4LCAhbV9tdWx0aXBsZSk7
CisgICAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KGluZGV4LCAhbV9kYXRhLm11bHRpcGxlKCkp
OwogICAgIH0KIH0KIApAQCAtMTA5MSwyNyArNDUwLDEzIEBAIHZvaWQgSFRNTFNlbGVjdEVsZW1l
bnQ6OnNldExlbmd0aCh1bnNpZ24KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2Nyb2xsVG9T
ZWxlY3Rpb24oKQogewotICAgIGlmIChyZW5kZXJlcigpICYmICF1c2VzTWVudUxpc3QoKSkKLSAg
ICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGlzdEJveCo+KHJlbmRlcmVyKCkpLT5zZWxlY3Rpb25D
aGFuZ2VkKCk7CisgICAgU2VsZWN0RWxlbWVudDo6c2Nyb2xsVG9TZWxlY3Rpb24obV9kYXRhLCB0
aGlzKTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6aW5zZXJ0ZWRJbnRvVHJlZShib29s
IGRlZXApCiB7Ci0gICAgLy8gV2hlbiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkIGR1cmluZyBkb2N1
bWVudCBwYXJzaW5nLCBpdCB3b24ndCBoYXZlIGFueSBpdGVtcyB5ZXQgLSBidXQgZm9yIGlubmVy
SFRNTAotICAgIC8vIGFuZCByZWxhdGVkIG1ldGhvZHMsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBh
ZnRlciB0aGUgd2hvbGUgc3VidHJlZSBpcyBjb25zdHJ1Y3RlZC4KLSAgICByZWNhbGNMaXN0SXRl
bXModHJ1ZSk7CisgICAgU2VsZWN0RWxlbWVudDo6aW5zZXJ0ZWRJbnRvVHJlZShtX2RhdGEsIHRo
aXMpOwogICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6Omluc2VydGVkSW50b1Ry
ZWUoZGVlcCk7CiB9CiAKLSNpZm5kZWYgTkRFQlVHCi0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6
OmNoZWNrTGlzdEl0ZW1zKCkgY29uc3QKLXsKLSAgICBWZWN0b3I8RWxlbWVudCo+IGl0ZW1zID0g
bV9saXN0SXRlbXM7Ci0gICAgcmVjYWxjTGlzdEl0ZW1zKGZhbHNlKTsKLSAgICBBU1NFUlQoaXRl
bXMgPT0gbV9saXN0SXRlbXMpOwotfQotCi0jZW5kaWYKLQogfSAvLyBuYW1lc3BhY2UKSW5kZXg6
IGh0bWwvSFRNTFNlbGVjdEVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL0hUTUxTZWxlY3RF
bGVtZW50LmgJKHJldmlzaW9uIDQ0MjI2KQorKysgaHRtbC9IVE1MU2VsZWN0RWxlbWVudC5oCSh3
b3JraW5nIGNvcHkpCkBAIC01OSw3ICs1OSw2IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgaW50
IHNlbGVjdGVkSW5kZXgoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0U2VsZWN0ZWRJbmRl
eChpbnQgaW5kZXgsIGJvb2wgZGVzZWxlY3QgPSB0cnVlLCBib29sIGZpcmVPbkNoYW5nZSA9IGZh
bHNlKTsKLSAgICBpbnQgbGFzdFNlbGVjdGVkTGlzdEluZGV4KCkgY29uc3Q7CiAKICAgICB2aXJ0
dWFsIGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiAKQEAgLTY3
LDkgKzY2LDggQEAgcHVibGljOgogCiAgICAgaW50IG1pbldpZHRoKCkgY29uc3QgeyByZXR1cm4g
bV9taW53aWR0aDsgfQogCi0gICAgdmlydHVhbCBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1f
c2l6ZTsgfQotCi0gICAgdmlydHVhbCBib29sIG11bHRpcGxlKCkgY29uc3QgeyByZXR1cm4gbV9t
dWx0aXBsZTsgfQorICAgIHZpcnR1YWwgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2RhdGEu
c2l6ZSgpOyB9CisgICAgdmlydHVhbCBib29sIG11bHRpcGxlKCkgY29uc3QgeyByZXR1cm4gbV9k
YXRhLm11bHRpcGxlKCk7IH0KIAogICAgIHZvaWQgYWRkKEhUTUxFbGVtZW50KiBlbGVtZW50LCBI
VE1MRWxlbWVudCogYmVmb3JlLCBFeGNlcHRpb25Db2RlJik7CiAgICAgdm9pZCByZW1vdmUoaW50
IGluZGV4KTsKQEAgLTk2LDE0ICs5NCw3IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgc2V0UmVjYWxj
TGlzdEl0ZW1zKCk7CiAKLSAgICB2aXJ0dWFsIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJ
dGVtcygpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAobV9yZWNhbGNMaXN0SXRlbXMpCi0gICAg
ICAgICAgICByZWNhbGNMaXN0SXRlbXMoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY2hl
Y2tMaXN0SXRlbXMoKTsKLSAgICAgICAgcmV0dXJuIG1fbGlzdEl0ZW1zOwotICAgIH0KKyAgICB2
aXJ0dWFsIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcygpIGNvbnN0IHsgcmV0dXJu
IG1fZGF0YS5saXN0SXRlbXModGhpcyk7IH0KICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKIAog
ICAgIHZpcnR1YWwgdm9pZCBkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50Kik7CkBAIC0xMjEsOSAr
MTEyLDkgQEAgcHVibGljOgogICAgIE5vZGUqIGl0ZW0odW5zaWduZWQgaW5kZXgpOwogCiAgICAg
Q29sbGVjdGlvbkNhY2hlKiBjb2xsZWN0aW9uSW5mbygpIHsgcmV0dXJuICZtX2NvbGxlY3Rpb25J
bmZvOyB9Ci0gICAgCisKICAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9y
SW5kZXgoaW50IGluZGV4KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlU2VsZWN0aW9uRW5k
SW5kZXgoaW50IGluZGV4KSB7IG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXggPSBpbmRleDsgfQor
ICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChpbnQgaW5kZXgpOwog
ICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVMaXN0Qm94U2VsZWN0aW9uKGJvb2wgZGVzZWxlY3RPdGhl
ck9wdGlvbnMpOwogICAgIHZpcnR1YWwgdm9pZCBsaXN0Qm94T25DaGFuZ2UoKTsKICAgICB2aXJ0
dWFsIHZvaWQgbWVudUxpc3RPbkNoYW5nZSgpOwpAQCAtMTM1LDQ4ICsxMjYsMTggQEAgcHVibGlj
OgogCiBwcml2YXRlOgogICAgIHZvaWQgcmVjYWxjTGlzdEl0ZW1zKGJvb2wgdXBkYXRlU2VsZWN0
ZWRTdGF0ZXMgPSB0cnVlKSBjb25zdDsKLSAgICB2b2lkIGNoZWNrTGlzdEl0ZW1zKCkgY29uc3Q7
CiAKICAgICB2b2lkIGRlc2VsZWN0SXRlbXMoSFRNTE9wdGlvbkVsZW1lbnQqIGV4Y2x1ZGVFbGVt
ZW50ID0gMCk7Ci0gICAgYm9vbCB1c2VzTWVudUxpc3QoKSBjb25zdCB7IHJldHVybiAhbV9tdWx0
aXBsZSAmJiBtX3NpemUgPD0gMTsgfQotICAgIGludCBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleChp
bnQgc3RhcnRJbmRleCk7Ci0gICAgaW50IHByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleChpbnQg
c3RhcnRJbmRleCk7Ci0gICAgdm9pZCBtZW51TGlzdERlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnQq
KTsKLSAgICB2b2lkIGxpc3RCb3hEZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50Kik7CiAgICAgdm9p
ZCB0eXBlQWhlYWRGaW5kKEtleWJvYXJkRXZlbnQqKTsKICAgICB2b2lkIHNhdmVMYXN0U2VsZWN0
aW9uKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvVHJlZShib29sKTsKIAotICAg
IG11dGFibGUgVmVjdG9yPEVsZW1lbnQqPiBtX2xpc3RJdGVtczsKLSAgICBWZWN0b3I8Ym9vbD4g
bV9jYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbjsKLSAgICBWZWN0b3I8Ym9vbD4gbV9sYXN0
T25DaGFuZ2VTZWxlY3Rpb247CisgICAgU2VsZWN0RWxlbWVudERhdGEgbV9kYXRhOwogICAgIGlu
dCBtX21pbndpZHRoOwotICAgIGludCBtX3NpemU7Ci0gICAgYm9vbCBtX211bHRpcGxlOwotICAg
IG11dGFibGUgYm9vbCBtX3JlY2FsY0xpc3RJdGVtczsKLSAgICBtdXRhYmxlIGludCBtX2xhc3RP
bkNoYW5nZUluZGV4OwotCi0gICAgaW50IG1fYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXg7Ci0g
ICAgaW50IG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXg7Ci0gICAgYm9vbCBtX2FjdGl2ZVNlbGVj
dGlvblN0YXRlOwotCi0gICAgLy8gSW5zdGFuY2UgdmFyaWFibGVzIGZvciB0eXBlLWFoZWFkIGZp
bmQKLSAgICBVQ2hhciBtX3JlcGVhdGluZ0NoYXI7Ci0gICAgRE9NVGltZVN0YW1wIG1fbGFzdENo
YXJUaW1lOwotICAgIFN0cmluZyBtX3R5cGVkU3RyaW5nOwotCiAgICAgQ29sbGVjdGlvbkNhY2hl
IG1fY29sbGVjdGlvbkluZm87CiB9OwogCi0jaWZkZWYgTkRFQlVHCi0KLWlubGluZSB2b2lkIEhU
TUxTZWxlY3RFbGVtZW50OjpjaGVja0xpc3RJdGVtcygpIGNvbnN0Ci17Ci19Ci0KLSNlbmRpZgot
CiB9IC8vIG5hbWVzcGFjZQogCiAjZW5kaWYKSW5kZXg6IHdtbC9XTUxPcHRpb25FbGVtZW50LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSB3bWwvV01MT3B0aW9uRWxlbWVudC5jcHAJKHJldmlzaW9uIDQ0MjI2
KQorKysgd21sL1dNTE9wdGlvbkVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDQsNiAr
MTQ0LDExIEBAIFN0cmluZyBXTUxPcHRpb25FbGVtZW50Ojp2YWx1ZSgpIGNvbnN0CiAgICAgcmV0
dXJuIE9wdGlvbkVsZW1lbnQ6OmNvbGxlY3RPcHRpb25WYWx1ZShtX2RhdGEsIHRoaXMpOwogfQog
CitTdHJpbmcgV01MT3B0aW9uRWxlbWVudDo6dGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIE9w
dGlvbkVsZW1lbnQ6OmNvbGxlY3RPcHRpb25UZXh0KG1fZGF0YSwgdGhpcyk7Cit9CisKIFN0cmlu
ZyBXTUxPcHRpb25FbGVtZW50Ojp0ZXh0SW5kZW50ZWRUb1Jlc3BlY3RHcm91cExhYmVsKCkgY29u
c3QKIHsKICAgICByZXR1cm4gT3B0aW9uRWxlbWVudDo6Y29sbGVjdE9wdGlvblRleHRSZXNwZWN0
aW5nR3JvdXBMYWJlbChtX2RhdGEsIHRoaXMpOwpJbmRleDogd21sL1dNTE9wdGlvbkVsZW1lbnQu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSB3bWwvV01MT3B0aW9uRWxlbWVudC5oCShyZXZpc2lvbiA0NDIyNikK
KysrIHdtbC9XTUxPcHRpb25FbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTUwLDYgKzUwLDcg
QEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBzZWxlY3RlZCgpIGNvbnN0OwogICAgIHZpcnR1
YWwgdm9pZCBzZXRTZWxlY3RlZFN0YXRlKGJvb2wpOwogCisgICAgdmlydHVhbCBTdHJpbmcgdGV4
dCgpIGNvbnN0OwogICAgIHZpcnR1YWwgU3RyaW5nIHRleHRJbmRlbnRlZFRvUmVzcGVjdEdyb3Vw
TGFiZWwoKSBjb25zdDsKICAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIGNvbnN0OwogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30738</attachid>
            <date>2009-05-28 08:37:38 -0700</date>
            <delta_ts>2009-05-28 09:14:08 -0700</delta_ts>
            <desc>Updated patch</desc>
            <filename>AddSelectElementCode.diff</filename>
            <type>text/plain</type>
            <size>89710</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQ0MjI2
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIxIEBACisyMDA5LTA1
LTI4ICBOaWtvbGFzIFppbW1lcm1hbm4gIDxuaWtvbGFzLnppbW1lcm1hbm5AdG9yY2htb2JpbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZp
eGVzOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjYwNjIKKworICAg
ICAgICBSZWZhY3RvciBjb2RlIGZyb20gYWxsIHZpcnR1YWwgbWV0aG9kcyBpbiBIVE1MU2VsZWN0
RWxlbWVudCAodGhhdCBhcmUgYWxzbyBuZWVkZWQgZm9yIFdNTFNlbGVjdEVsZW1lbnQpCisgICAg
ICAgIGluIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIFNlbGVjdEVsZW1lbnQgYWJzdHJhY3QgYmFz
ZSBjbGFzcy4gRm9sbG93IHRoZSBzYW1lIGRlc2lnbiBzaGVtZSB0aGF0IElucHV0RWxlbWVudCB1
c2VzLgorCisgICAgICAgIEEgZm9sbG93LXVwIHBhdGNoIGNhbiBub3cgZWFzaWx5IGFkZCBXTUxT
ZWxlY3RFbGVtZW50LgorCisgICAgICAgICogZG9tL09wdGlvbkVsZW1lbnQuaDoKKyAgICAgICAg
KiBkb20vU2VsZWN0RWxlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50
OjpzZWxlY3RBbGwpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudDo6c2F2ZUxhc3RT
ZWxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6aXNPcHRpb25FbGVtZW50KToKKyAgICAgICAg
KFdlYkNvcmU6OmlzT3B0aW9uR3JvdXBFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVj
dEVsZW1lbnQ6Om5leHRTZWxlY3RhYmxlTGlzdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlNl
bGVjdEVsZW1lbnQ6OnByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleCk6CisgICAgICAgIChXZWJD
b3JlOjpTZWxlY3RFbGVtZW50OjpzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCk6CisgICAg
ICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50OjpzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleCk6
CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50Ojp1cGRhdGVMaXN0Qm94U2VsZWN0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6Omxpc3RCb3hPbkNoYW5nZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50OjptZW51TGlzdE9uQ2hhbmdlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OnNjcm9sbFRvU2VsZWN0aW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OnJlY2FsY1N0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6
OlNlbGVjdEVsZW1lbnQ6OnNldFJlY2FsY0xpc3RJdGVtcyk6CisgICAgICAgIChXZWJDb3JlOjpT
ZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0
RWxlbWVudDo6c2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50
OjpzZXRTZWxlY3RlZEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6Om9w
dGlvblRvTGlzdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6Omxpc3RU
b09wdGlvbkluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OmRpc3BhdGNo
Rm9jdXNFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEJs
dXJFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50OjpkZXNlbGVjdEl0ZW1z
KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OnNhdmVGb3JtQ29udHJvbFN0YXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OnJlc3RvcmVGb3JtQ29udHJvbFN0
YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OnBhcnNlTXVsdGlwbGVBdHRy
aWJ1dGUpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudDo6YXBwZW5kRm9ybURhdGEp
OgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudDo6cmVzZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6U2VsZWN0RWxlbWVudDo6bWVudUxpc3REZWZhdWx0RXZlbnRIYW5kbGVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6Omxpc3RCb3hEZWZhdWx0RXZlbnRIYW5kbGVyKToK
KyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudDo6bGFzdFNlbGVjdGVkTGlzdEluZGV4KToK
KyAgICAgICAgKFdlYkNvcmU6OnN0cmlwTGVhZGluZ1doaXRlU3BhY2UpOgorICAgICAgICAoV2Vi
Q29yZTo6U2VsZWN0RWxlbWVudDo6dHlwZUFoZWFkRmluZCk6CisgICAgICAgIChXZWJDb3JlOjpT
ZWxlY3RFbGVtZW50OjppbnNlcnRlZEludG9UcmVlKToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVj
dEVsZW1lbnREYXRhOjpTZWxlY3RFbGVtZW50RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTZWxl
Y3RFbGVtZW50RGF0YTo6flNlbGVjdEVsZW1lbnREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNl
bGVjdEVsZW1lbnREYXRhOjpjaGVja0xpc3RJdGVtcyk6CisgICAgICAgIChXZWJDb3JlOjpTZWxl
Y3RFbGVtZW50RGF0YTo6bGlzdEl0ZW1zKToKKyAgICAgICAgKiBkb20vU2VsZWN0RWxlbWVudC5o
OgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudERhdGE6Om11bHRpcGxlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnREYXRhOjpzZXRNdWx0aXBsZSk6CisgICAgICAgIChX
ZWJDb3JlOjpTZWxlY3RFbGVtZW50RGF0YTo6c2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZWxl
Y3RFbGVtZW50RGF0YTo6c2V0U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50
RGF0YTo6dXNlc01lbnVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnREYXRh
OjpsYXN0T25DaGFuZ2VJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50RGF0
YTo6c2V0TGFzdE9uQ2hhbmdlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVu
dERhdGE6Omxhc3RPbkNoYW5nZVNlbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RF
bGVtZW50RGF0YTo6YWN0aXZlU2VsZWN0aW9uU3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6U2Vs
ZWN0RWxlbWVudERhdGE6OnNldEFjdGl2ZVNlbGVjdGlvblN0YXRlKToKKyAgICAgICAgKFdlYkNv
cmU6OlNlbGVjdEVsZW1lbnREYXRhOjphY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCk6CisgICAg
ICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50RGF0YTo6c2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9y
SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudERhdGE6OmFjdGl2ZVNlbGVj
dGlvbkVuZEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnREYXRhOjpzZXRB
Y3RpdmVTZWxlY3Rpb25FbmRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpTZWxlY3RFbGVtZW50
RGF0YTo6Y2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6
U2VsZWN0RWxlbWVudERhdGE6OnNob3VsZFJlY2FsY0xpc3RJdGVtcyk6CisgICAgICAgIChXZWJD
b3JlOjpTZWxlY3RFbGVtZW50RGF0YTo6c2V0U2hvdWxkUmVjYWxjTGlzdEl0ZW1zKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnREYXRhOjpyYXdMaXN0SXRlbXMpOgorICAgICAgICAo
V2ViQ29yZTo6U2VsZWN0RWxlbWVudERhdGE6OnJlcGVhdGluZ0NoYXIpOgorICAgICAgICAoV2Vi
Q29yZTo6U2VsZWN0RWxlbWVudERhdGE6OnNldFJlcGVhdGluZ0NoYXIpOgorICAgICAgICAoV2Vi
Q29yZTo6U2VsZWN0RWxlbWVudERhdGE6Omxhc3RDaGFyVGltZSk6CisgICAgICAgIChXZWJDb3Jl
OjpTZWxlY3RFbGVtZW50RGF0YTo6c2V0TGFzdENoYXJUaW1lKToKKyAgICAgICAgKFdlYkNvcmU6
OlNlbGVjdEVsZW1lbnREYXRhOjp0eXBlZFN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpTZWxl
Y3RFbGVtZW50RGF0YTo6c2V0VHlwZWRTdHJpbmcpOgorICAgICAgICAqIGh0bWwvSFRNTE9wdGlv
bkVsZW1lbnQuaDoKKyAgICAgICAgKiBodG1sL0hUTUxTZWxlY3RFbGVtZW50LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpIVE1MU2VsZWN0RWxlbWVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6cmVjYWxjU3R5bGUpOgorICAgICAgICAo
V2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmZvcm1Db250cm9sVHlwZSk6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6c2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChXZWJD
b3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6ZGVzZWxlY3RJdGVtcyk6CisgICAgICAgIChXZWJDb3Jl
OjpIVE1MU2VsZWN0RWxlbWVudDo6c2V0U2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChXZWJDb3Jl
OjpIVE1MU2VsZWN0RWxlbWVudDo6YWN0aXZlU2VsZWN0aW9uU3RhcnRMaXN0SW5kZXgpOgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmFjdGl2ZVNlbGVjdGlvbkVuZExpc3RJ
bmRleCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6c2F2ZUZvcm1Db250
cm9sU3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnJlc3RvcmVG
b3JtQ29udHJvbFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50Ojpw
YXJzZU1hcHBlZEF0dHJpYnV0ZSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVu
dDo6Y2FuU2VsZWN0QWxsKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50Ojpz
ZWxlY3RBbGwpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmNyZWF0ZVJl
bmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjphcHBlbmRGb3Jt
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6b3B0aW9uVG9MaXN0
SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6Omxpc3RUb09wdGlv
bkluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0
SXRlbXMpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNldFJlY2FsY0xp
c3RJdGVtcyk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6cmVzZXQpOgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmRpc3BhdGNoRm9jdXNFdmVudCk6
CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6ZGlzcGF0Y2hCbHVyRXZlbnQp
OgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRs
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNldEFjdGl2ZVNlbGVj
dGlvbkFuY2hvckluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50Ojpz
ZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0
RWxlbWVudDo6dXBkYXRlTGlzdEJveFNlbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpIVE1M
U2VsZWN0RWxlbWVudDo6bWVudUxpc3RPbkNoYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1M
U2VsZWN0RWxlbWVudDo6bGlzdEJveE9uQ2hhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxT
ZWxlY3RFbGVtZW50OjpzYXZlTGFzdFNlbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpIVE1M
U2VsZWN0RWxlbWVudDo6c2V0T3B0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RF
bGVtZW50OjpzY3JvbGxUb1NlbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0
RWxlbWVudDo6aW5zZXJ0ZWRJbnRvVHJlZSk6CisgICAgICAgICogaHRtbC9IVE1MU2VsZWN0RWxl
bWVudC5oOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNpemUpOgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6Om11bHRpcGxlKToKKyAgICAgICAgKFdl
YkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpsaXN0SXRlbXMpOgorICAgICAgICAqIHdtbC9XTUxP
cHRpb25FbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldNTE9wdGlvbkVsZW1lbnQ6OnRl
eHQpOgorICAgICAgICAqIHdtbC9XTUxPcHRpb25FbGVtZW50Lmg6CisKIDIwMDktMDUtMjggIEhv
bGdlciBIYW5zIFBldGVyIEZyZXl0aGVyICA8emVja2VAc2VsZmlzaC5vcmc+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgWGFuIExvcGV6LgpJbmRleDogZG9tL09wdGlvbkVsZW1lbnQuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBkb20vT3B0aW9uRWxlbWVudC5oCShyZXZpc2lvbiA0NDIyNikKKysrIGRvbS9PcHRp
b25FbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDcgQEAgcHVibGljOgogICAg
IHZpcnR1YWwgYm9vbCBzZWxlY3RlZCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0
U2VsZWN0ZWRTdGF0ZShib29sKSA9IDA7CiAKKyAgICB2aXJ0dWFsIFN0cmluZyB0ZXh0KCkgY29u
c3QgPSAwOwogICAgIHZpcnR1YWwgU3RyaW5nIHRleHRJbmRlbnRlZFRvUmVzcGVjdEdyb3VwTGFi
ZWwoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBTdHJpbmcgdmFsdWUoKSBjb25zdCA9IDA7CiAK
SW5kZXg6IGRvbS9TZWxlY3RFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkb20vU2VsZWN0RWxl
bWVudC5jcHAJKHJldmlzaW9uIDQ0MjI2KQorKysgZG9tL1NlbGVjdEVsZW1lbnQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMSwyMCArMjEsODkyIEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5j
bHVkZSAiU2VsZWN0RWxlbWVudC5oIgogCisjaW5jbHVkZSAiQ2hhcmFjdGVyTmFtZXMuaCIKKyNp
bmNsdWRlICJDaHJvbWVDbGllbnQuaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAi
RXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgorI2luY2x1ZGUgIkZvcm1E
YXRhTGlzdC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiSFRNTEZvcm1FbGVtZW50
LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiSFRNTEtleWdlbkVsZW1lbnQu
aCIKICNpbmNsdWRlICJIVE1MU2VsZWN0RWxlbWVudC5oIgorI2luY2x1ZGUgIktleWJvYXJkRXZl
bnQuaCIKKyNpbmNsdWRlICJNYXBwZWRBdHRyaWJ1dGUuaCIKKyNpbmNsdWRlICJNb3VzZUV2ZW50
LmgiCisjaW5jbHVkZSAiT3B0aW9uRWxlbWVudC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNs
dWRlICJSZW5kZXJMaXN0Qm94LmgiCisjaW5jbHVkZSAiUmVuZGVyTWVudUxpc3QuaCIKICNpbmNs
dWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgogCi0vLyBGSVhNRTogQWN0aXZhdGUgY29kZSBvbmNlIFdN
TFNlbGVjdEVsZW1lbnQgaXMgYXZhaWxhYmxlCi0jaWYgRU5BQkxFKFdNTCkgJiYgMAotI2luY2x1
ZGUgIldNTFNlbGVjdEVsZW1lbnQuaCIKKyNpZiBFTkFCTEUoV01MKQogI2luY2x1ZGUgIldNTE5h
bWVzLmgiCiAjZW5kaWYKIAorI2lmIFBMQVRGT1JNKE1BQykKKyNkZWZpbmUgQVJST1dfS0VZU19Q
T1BfTUVOVSAxCisjZWxzZQorI2RlZmluZSBBUlJPV19LRVlTX1BPUF9NRU5VIDAKKyNlbmRpZgor
Cit1c2luZyBzdGQ6Om1pbjsKK3VzaW5nIHN0ZDo6bWF4OwordXNpbmcgbmFtZXNwYWNlIFdURjsK
K3VzaW5nIG5hbWVzcGFjZSBVbmljb2RlOworCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK3N0YXRp
YyBjb25zdCBET01UaW1lU3RhbXAgc190eXBlQWhlYWRUaW1lb3V0ID0gMTAwMDsKKwordm9pZCBT
ZWxlY3RFbGVtZW50OjpzZWxlY3RBbGwoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQq
IGVsZW1lbnQpCit7CisgICAgQVNTRVJUKCFkYXRhLnVzZXNNZW51TGlzdCgpKTsKKyAgICBpZiAo
IWVsZW1lbnQtPnJlbmRlcmVyKCkgfHwgIWRhdGEubXVsdGlwbGUoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0
aGUgbmV3IHNlbGVjdEFsbCBzZWxlY3Rpb24gd2hlbiBkaXNwYXRjaGluZyBjaGFuZ2UgZXZlbnRz
CisgICAgc2F2ZUxhc3RTZWxlY3Rpb24oZGF0YSwgZWxlbWVudCk7CisKKyAgICBkYXRhLnNldEFj
dGl2ZVNlbGVjdGlvblN0YXRlKHRydWUpOworICAgIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvcklu
ZGV4KGRhdGEsIGVsZW1lbnQsIG5leHRTZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQs
IC0xKSk7CisgICAgc2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoZGF0YSwgcHJldmlvdXNTZWxl
Y3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIC0xKSk7CisKKyAgICB1cGRhdGVMaXN0Qm94
U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQsIGZhbHNlKTsKKyAgICBsaXN0Qm94T25DaGFuZ2UoZGF0
YSwgZWxlbWVudCk7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6c2F2ZUxhc3RTZWxlY3Rpb24o
U2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgaWYgKGRh
dGEudXNlc01lbnVMaXN0KCkpIHsKKyAgICAgICAgZGF0YS5zZXRMYXN0T25DaGFuZ2VJbmRleChz
ZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1lbnQpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIFZlY3Rvcjxib29sPiYgbGFzdE9uQ2hhbmdlU2VsZWN0aW9uID0gZGF0YS5sYXN0T25DaGFu
Z2VTZWxlY3Rpb24oKTsgCisgICAgbGFzdE9uQ2hhbmdlU2VsZWN0aW9uLmNsZWFyKCk7CisKKyAg
ICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQp
OworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAg
ICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1z
W2ldKTsKKyAgICAgICAgbGFzdE9uQ2hhbmdlU2VsZWN0aW9uLmFwcGVuZChvcHRpb25FbGVtZW50
ID8gb3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSA6IGZhbHNlKTsKKyAgICB9Cit9CisKK3N0YXRp
YyBpbmxpbmUgYm9vbCBpc09wdGlvbkVsZW1lbnQoRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBy
ZXR1cm4gZWxlbWVudC0+aGFzTG9jYWxOYW1lKEhUTUxOYW1lczo6b3B0aW9uVGFnKQorI2lmIEVO
QUJMRShXTUwpCisgICAgICAgIHx8IGVsZW1lbnQtPmhhc0xvY2FsTmFtZShXTUxOYW1lczo6b3B0
aW9uVGFnKQorI2VuZGlmCisgICAgICAgIDsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzT3B0
aW9uR3JvdXBFbGVtZW50KEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgcmV0dXJuIGVsZW1lbnQt
Pmhhc0xvY2FsTmFtZShIVE1MTmFtZXM6Om9wdGdyb3VwVGFnKQorI2lmIEVOQUJMRShXTUwpCisg
ICAgICAgIHx8IGVsZW1lbnQtPmhhc0xvY2FsTmFtZShXTUxOYW1lczo6b3B0Z3JvdXBUYWcpCisj
ZW5kaWYKKyAgICAgICAgOworfQorCitpbnQgU2VsZWN0RWxlbWVudDo6bmV4dFNlbGVjdGFibGVM
aXN0SW5kZXgoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBz
dGFydEluZGV4KQoreworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5s
aXN0SXRlbXMoZWxlbWVudCk7CisgICAgaW50IGluZGV4ID0gc3RhcnRJbmRleCArIDE7CisgICAg
d2hpbGUgKGluZGV4ID49IDAgJiYgKHVuc2lnbmVkKSBpbmRleCA8IGl0ZW1zLnNpemUoKSAmJiAo
IWlzT3B0aW9uRWxlbWVudChpdGVtc1tpbmRleF0pIHx8IGl0ZW1zW2luZGV4XS0+ZGlzYWJsZWQo
KSkpCisgICAgICAgICsraW5kZXg7CisgICAgaWYgKCh1bnNpZ25lZCkgaW5kZXggPT0gaXRlbXMu
c2l6ZSgpKQorICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKKyAgICByZXR1cm4gaW5kZXg7Cit9
CisKK2ludCBTZWxlY3RFbGVtZW50OjpwcmV2aW91c1NlbGVjdGFibGVMaXN0SW5kZXgoU2VsZWN0
RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBzdGFydEluZGV4KQorewor
ICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVu
dCk7CisgICAgaWYgKHN0YXJ0SW5kZXggPT0gLTEpCisgICAgICAgIHN0YXJ0SW5kZXggPSBpdGVt
cy5zaXplKCk7CisgICAgaW50IGluZGV4ID0gc3RhcnRJbmRleCAtIDE7CisgICAgd2hpbGUgKGlu
ZGV4ID49IDAgJiYgKHVuc2lnbmVkKSBpbmRleCA8IGl0ZW1zLnNpemUoKSAmJiAoIWlzT3B0aW9u
RWxlbWVudChpdGVtc1tpbmRleF0pIHx8IGl0ZW1zW2luZGV4XS0+ZGlzYWJsZWQoKSkpCisgICAg
ICAgIC0taW5kZXg7CisgICAgaWYgKGluZGV4ID09IC0xKQorICAgICAgICByZXR1cm4gc3RhcnRJ
bmRleDsKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6c2V0QWN0
aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQq
IGVsZW1lbnQsIGludCBpbmRleCkKK3sKKyAgICBkYXRhLnNldEFjdGl2ZVNlbGVjdGlvbkFuY2hv
ckluZGV4KGluZGV4KTsKKworICAgIC8vIENhY2hlIHRoZSBzZWxlY3Rpb24gc3RhdGUgc28gd2Ug
Y2FuIHJlc3RvcmUgdGhlIG9sZCBzZWxlY3Rpb24gYXMgdGhlIG5ldyBzZWxlY3Rpb24gcGl2b3Rz
IGFyb3VuZCB0aGlzIGFuY2hvciBpbmRleAorICAgIFZlY3Rvcjxib29sPiYgY2FjaGVkU3RhdGVG
b3JBY3RpdmVTZWxlY3Rpb24gPSBkYXRhLmNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uKCk7
IAorICAgIGNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uLmNsZWFyKCk7CisKKyAgICBjb25z
dCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBP
cHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsK
KyAgICAgICAgY2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24uYXBwZW5kKG9wdGlvbkVsZW1l
bnQgPyBvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpIDogZmFsc2UpOworICAgIH0KK30KKwordm9p
ZCBTZWxlY3RFbGVtZW50OjpzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChTZWxlY3RFbGVtZW50
RGF0YSYgZGF0YSwgaW50IGluZGV4KQoreworICAgIGRhdGEuc2V0QWN0aXZlU2VsZWN0aW9uRW5k
SW5kZXgoaW5kZXgpOworfQorCit2b2lkIFNlbGVjdEVsZW1lbnQ6OnVwZGF0ZUxpc3RCb3hTZWxl
Y3Rpb24oU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGJvb2wgZGVz
ZWxlY3RPdGhlck9wdGlvbnMpCit7CisgICAgQVNTRVJUKGVsZW1lbnQtPnJlbmRlcmVyKCkgJiYg
ZWxlbWVudC0+cmVuZGVyZXIoKS0+aXNMaXN0Qm94KCkpOworICAgIEFTU0VSVChkYXRhLmFjdGl2
ZVNlbGVjdGlvbkFuY2hvckluZGV4KCkgPj0gMCk7CisKKyAgICB1bnNpZ25lZCBzdGFydCA9IG1p
bihkYXRhLmFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KCksIGRhdGEuYWN0aXZlU2VsZWN0aW9u
RW5kSW5kZXgoKSk7CisgICAgdW5zaWduZWQgZW5kID0gbWF4KGRhdGEuYWN0aXZlU2VsZWN0aW9u
QW5jaG9ySW5kZXgoKSwgZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpKTsKKyAgICBWZWN0
b3I8Ym9vbD4mIGNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uID0gZGF0YS5jYWNoZWRTdGF0
ZUZvckFjdGl2ZVNlbGVjdGlvbigpOworCisgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRl
bXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgT3B0aW9uRWxlbWVudCogb3B0aW9uRWxl
bWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSk7CisgICAgICAgIGlmICghb3B0aW9uRWxl
bWVudCB8fCBpdGVtc1tpXS0+ZGlzYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgIGlmIChpID49IHN0YXJ0ICYmIGkgPD0gZW5kKQorICAgICAgICAgICAgb3B0aW9uRWxl
bWVudC0+c2V0U2VsZWN0ZWRTdGF0ZShkYXRhLmFjdGl2ZVNlbGVjdGlvblN0YXRlKCkpOworICAg
ICAgICBlbHNlIGlmIChkZXNlbGVjdE90aGVyT3B0aW9ucyB8fCBpID49IGNhY2hlZFN0YXRlRm9y
QWN0aXZlU2VsZWN0aW9uLnNpemUoKSkKKyAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQtPnNldFNl
bGVjdGVkU3RhdGUoZmFsc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvcHRpb25FbGVt
ZW50LT5zZXRTZWxlY3RlZFN0YXRlKGNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uW2ldKTsK
KyAgICB9CisKKyAgICBzY3JvbGxUb1NlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsKK30KKwordm9p
ZCBTZWxlY3RFbGVtZW50OjpsaXN0Qm94T25DaGFuZ2UoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEs
IEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgQVNTRVJUKCFkYXRhLnVzZXNNZW51TGlzdCgpKTsK
KworICAgIFZlY3Rvcjxib29sPiYgbGFzdE9uQ2hhbmdlU2VsZWN0aW9uID0gZGF0YS5sYXN0T25D
aGFuZ2VTZWxlY3Rpb24oKTsgCisgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBk
YXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKworICAgIC8vIElmIHRoZSBjYWNoZWQgc2VsZWN0aW9u
IGxpc3QgaXMgZW1wdHksIG9yIHRoZSBzaXplIGhhcyBjaGFuZ2VkLCB0aGVuIGZpcmUgZGlzcGF0
Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50LCBhbmQgcmV0dXJuIGVhcmx5LgorICAgIGlmIChsYXN0
T25DaGFuZ2VTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IGxhc3RPbkNoYW5nZVNlbGVjdGlvbi5zaXpl
KCkgIT0gaXRlbXMuc2l6ZSgpKSB7CisgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoRm9ybUNvbnRy
b2xDaGFuZ2VFdmVudCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVXBkYXRl
IGxhc3RPbkNoYW5nZVNlbGVjdGlvbiBhbmQgZmlyZSBkaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdl
RXZlbnQKKyAgICBib29sIGZpcmVPbkNoYW5nZSA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBPcHRpb25FbGVtZW50KiBv
cHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKKyAgICAgICAgYm9vbCBz
ZWxlY3RlZCA9IG9wdGlvbkVsZW1lbnQgPyBvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpIDogZmFs
c2U7CisgICAgICAgIGlmIChzZWxlY3RlZCAhPSBsYXN0T25DaGFuZ2VTZWxlY3Rpb25baV0pCisg
ICAgICAgICAgICBmaXJlT25DaGFuZ2UgPSB0cnVlOworICAgICAgICBsYXN0T25DaGFuZ2VTZWxl
Y3Rpb25baV0gPSBzZWxlY3RlZDsKKyAgICB9CisKKyAgICBpZiAoZmlyZU9uQ2hhbmdlKQorICAg
ICAgICBlbGVtZW50LT5kaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQoKTsKK30KKwordm9p
ZCBTZWxlY3RFbGVtZW50OjptZW51TGlzdE9uQ2hhbmdlKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRh
LCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIEFTU0VSVChkYXRhLnVzZXNNZW51TGlzdCgpKTsK
KworICAgIGludCBzZWxlY3RlZCA9IHNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCk7CisgICAg
aWYgKGRhdGEubGFzdE9uQ2hhbmdlSW5kZXgoKSAhPSBzZWxlY3RlZCkgeworICAgICAgICBkYXRh
LnNldExhc3RPbkNoYW5nZUluZGV4KHNlbGVjdGVkKTsKKyAgICAgICAgZWxlbWVudC0+ZGlzcGF0
Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50KCk7CisgICAgfQorfQorCit2b2lkIFNlbGVjdEVsZW1l
bnQ6OnNjcm9sbFRvU2VsZWN0aW9uKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBl
bGVtZW50KQoreworICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCkp
CisgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckxpc3RCb3gqPihyZW5kZXJlciktPnNlbGVjdGlv
bkNoYW5nZWQoKTsKK30KKwordm9pZCBTZWxlY3RFbGVtZW50OjpyZWNhbGNTdHlsZShTZWxlY3RF
bGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyID0gZWxlbWVudC0+cmVuZGVyZXIoKTsKKyAgICBpZiAoZWxlbWVudC0+Y2hpbGRO
ZWVkc1N0eWxlUmVjYWxjKCkgJiYgcmVuZGVyZXIpIHsKKyAgICAgICAgaWYgKGRhdGEudXNlc01l
bnVMaXN0KCkpCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJNZW51TGlzdCo+KHJlbmRl
cmVyKS0+c2V0T3B0aW9uc0NoYW5nZWQodHJ1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IHN0YXRpY19jYXN0PFJlbmRlckxpc3RCb3gqPihyZW5kZXJlciktPnNldE9wdGlvbnNDaGFuZ2Vk
KHRydWUpOworICAgIH0gZWxzZSBpZiAoZGF0YS5zaG91bGRSZWNhbGNMaXN0SXRlbXMoKSkKKyAg
ICAgICAgcmVjYWxjTGlzdEl0ZW1zKGRhdGEsIGVsZW1lbnQpOworfQorCit2b2lkIFNlbGVjdEVs
ZW1lbnQ6OnNldFJlY2FsY0xpc3RJdGVtcyhTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVu
dCogZWxlbWVudCkKK3sKKyAgICBkYXRhLnNldFNob3VsZFJlY2FsY0xpc3RJdGVtcyh0cnVlKTsK
KyAgICBkYXRhLnNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KC0xKTsgLy8gTWFudWFsIHNl
bGVjdGlvbiBhbmNob3IgaXMgcmVzZXQgd2hlbiBtYW5pcHVsYXRpbmcgdGhlIHNlbGVjdCBwcm9n
cmFtbWF0aWNhbGx5LgorICAgIGlmIChSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gZWxlbWVudC0+
cmVuZGVyZXIoKSkgeworICAgICAgICBpZiAoZGF0YS51c2VzTWVudUxpc3QoKSkKKyAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFJlbmRlck1lbnVMaXN0Kj4ocmVuZGVyZXIpLT5zZXRPcHRpb25zQ2hh
bmdlZCh0cnVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVy
TGlzdEJveCo+KHJlbmRlcmVyKS0+c2V0T3B0aW9uc0NoYW5nZWQodHJ1ZSk7CisgICAgfQorICAg
IGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKK30KKwordm9pZCBTZWxlY3RFbGVtZW50
OjpyZWNhbGNMaXN0SXRlbXMoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIGNvbnN0IEVsZW1lbnQq
IGVsZW1lbnQsIGJvb2wgdXBkYXRlU2VsZWN0ZWRTdGF0ZXMpCit7CisgICAgVmVjdG9yPEVsZW1l
bnQqPiYgbGlzdEl0ZW1zID0gZGF0YS5yYXdMaXN0SXRlbXMoKTsKKyAgICBsaXN0SXRlbXMuY2xl
YXIoKTsKKworICAgIE9wdGlvbkVsZW1lbnQqIGZvdW5kU2VsZWN0ZWQgPSAwOworICAgIGZvciAo
Tm9kZSogY3VycmVudE5vZGUgPSBlbGVtZW50LT5maXJzdENoaWxkKCk7IGN1cnJlbnROb2RlOykg
eworICAgICAgICBpZiAoIWN1cnJlbnROb2RlLT5pc0VsZW1lbnROb2RlKCkpIHsKKyAgICAgICAg
ICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUtPnRyYXZlcnNlTmV4dFNpYmxpbmcoZWxlbWVu
dCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEVsZW1lbnQq
IGN1cnJlbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4oY3VycmVudE5vZGUpOworCisgICAgICAg
IC8vIG9wdGdyb3VwIHRhZ3MgbWF5IG5vdCBuZXN0LiBIb3dldmVyLCBib3RoIEZpcmVGb3ggYW5k
IElFIHdpbGwKKyAgICAgICAgLy8gZmxhdHRlbiB0aGUgdHJlZSBhdXRvbWF0aWNhbGx5LCBzbyB3
ZSBmb2xsb3cgc3VpdC4KKyAgICAgICAgLy8gKGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEv
aW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjYpCisgICAgICAgIGlmIChpc09wdGlvbkdyb3VwRWxl
bWVudChjdXJyZW50KSkgeworICAgICAgICAgICAgbGlzdEl0ZW1zLmFwcGVuZChjdXJyZW50KTsK
KyAgICAgICAgICAgIGlmIChjdXJyZW50LT5maXJzdENoaWxkKCkpIHsKKyAgICAgICAgICAgICAg
ICBjdXJyZW50Tm9kZSA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChPcHRpb25F
bGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGN1cnJlbnQpKSB7CisgICAg
ICAgICAgICBsaXN0SXRlbXMuYXBwZW5kKGN1cnJlbnQpOworCisgICAgICAgICAgICBpZiAodXBk
YXRlU2VsZWN0ZWRTdGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kU2VsZWN0ZWQg
JiYgKGRhdGEudXNlc01lbnVMaXN0KCkgfHwgKCFkYXRhLm11bHRpcGxlKCkgJiYgb3B0aW9uRWxl
bWVudC0+c2VsZWN0ZWQoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQg
PSBvcHRpb25FbGVtZW50OworICAgICAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5zZXRT
ZWxlY3RlZFN0YXRlKHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmRTZWxl
Y3RlZCAmJiAhZGF0YS5tdWx0aXBsZSgpICYmIG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVkKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZC0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxz
ZSk7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQgPSBvcHRpb25FbGVtZW50Owor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlm
IChjdXJyZW50LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aHJUYWcpKQorICAgICAgICAgICAgbGlz
dEl0ZW1zLmFwcGVuZChjdXJyZW50KTsKKworICAgICAgICAvLyBJbiBjb25mb3JtaW5nIEhUTUwg
Y29kZSwgb25seSA8b3B0Z3JvdXA+IGFuZCA8b3B0aW9uPiB3aWxsIGJlIGZvdW5kCisgICAgICAg
IC8vIHdpdGhpbiBhIDxzZWxlY3Q+LiBXZSBjYWxsIHRyYXZlcnNlTmV4dFNpYmxpbmcgc28gdGhh
dCB3ZSBvbmx5IHN0ZXAKKyAgICAgICAgLy8gaW50byB0aG9zZSB0YWdzIHRoYXQgd2UgY2hvb3Nl
IHRvLiBGb3Igd2ViLWNvbXBhdCwgd2Ugc2hvdWxkIGNvcGUKKyAgICAgICAgLy8gd2l0aCB0aGUg
Y2FzZSB3aGVyZSBvZGQgdGFncyBsaWtlIGEgPGRpdj4gaGF2ZSBiZWVuIGFkZGVkIGJ1dCB3ZQor
ICAgICAgICAvLyBoYW5kbGUgdGhpcyBiZWNhdXNlIHN1Y2ggdGFncyBoYXZlIGFscmVhZHkgYmVl
biByZW1vdmVkIGZyb20gdGhlCisgICAgICAgIC8vIDxzZWxlY3Q+J3Mgc3VidHJlZSBhdCB0aGlz
IHBvaW50LgorICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLT50cmF2ZXJzZU5leHRT
aWJsaW5nKGVsZW1lbnQpOworICAgIH0KKworICAgIGRhdGEuc2V0U2hvdWxkUmVjYWxjTGlzdEl0
ZW1zKGZhbHNlKTsKK30KKworaW50IFNlbGVjdEVsZW1lbnQ6OnNlbGVjdGVkSW5kZXgoY29uc3Qg
U2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAg
dW5zaWduZWQgaW5kZXggPSAwOworCisgICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIGZp
cnN0IG9wdGlvbiBzZWxlY3RlZAorICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0g
ZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkg
PCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9u
RWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSkpIHsKKyAgICAgICAgICAgIGlmIChv
cHRpb25FbGVtZW50LT5zZWxlY3RlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsK
KyAgICAgICAgICAgICsraW5kZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLTE7
Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6c2V0U2VsZWN0ZWRJbmRleChTZWxlY3RFbGVtZW50
RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgaW50IG9wdGlvbkluZGV4LCBib29sIGRlc2Vs
ZWN0LCBib29sIGZpcmVPbkNoYW5nZSkKK3sKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBp
dGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGludCBsaXN0SW5kZXggPSBvcHRp
b25Ub0xpc3RJbmRleChkYXRhLCBlbGVtZW50LCBvcHRpb25JbmRleCk7CisgICAgaWYgKCFkYXRh
Lm11bHRpcGxlKCkpCisgICAgICAgIGRlc2VsZWN0ID0gdHJ1ZTsKKworICAgIEVsZW1lbnQqIGV4
Y2x1ZGVFbGVtZW50ID0gMDsKKyAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9
IChsaXN0SW5kZXggPj0gMCA/IHRvT3B0aW9uRWxlbWVudChpdGVtc1tsaXN0SW5kZXhdKSA6IDAp
KSB7CisgICAgICAgIGV4Y2x1ZGVFbGVtZW50ID0gaXRlbXNbbGlzdEluZGV4XTsKKyAgICAgICAg
aWYgKGRhdGEuYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoKSA8IDAgfHwgZGVzZWxlY3QpCisg
ICAgICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChkYXRhLCBlbGVtZW50LCBs
aXN0SW5kZXgpOworICAgICAgICBpZiAoZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpIDwg
MCB8fCBkZXNlbGVjdCkKKyAgICAgICAgICAgIHNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGRh
dGEsIGxpc3RJbmRleCk7CisgICAgICAgIG9wdGlvbkVsZW1lbnQtPnNldFNlbGVjdGVkU3RhdGUo
dHJ1ZSk7CisgICAgfQorCisgICAgaWYgKGRlc2VsZWN0KQorICAgICAgICBkZXNlbGVjdEl0ZW1z
KGRhdGEsIGVsZW1lbnQsIGV4Y2x1ZGVFbGVtZW50KTsKKworICAgIC8vIEZvciB0aGUgbWVudSBs
aXN0IGNhc2UsIHRoaXMgaXMgd2hhdCBtYWtlcyB0aGUgc2VsZWN0ZWQgZWxlbWVudCBhcHBlYXIu
CisgICAgaWYgKFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBlbGVtZW50LT5yZW5kZXJlcigpKQor
ICAgICAgICByZW5kZXJlci0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKKworICAgIHNjcm9sbFRvU2Vs
ZWN0aW9uKGRhdGEsIGVsZW1lbnQpOworCisgICAgLy8gVGhpcyBvbmx5IGdldHMgY2FsbGVkIHdp
dGggZmlyZU9uQ2hhbmdlIGZvciBtZW51IGxpc3RzLiAKKyAgICBpZiAoZmlyZU9uQ2hhbmdlICYm
IGRhdGEudXNlc01lbnVMaXN0KCkpCisgICAgICAgIG1lbnVMaXN0T25DaGFuZ2UoZGF0YSwgZWxl
bWVudCk7CisKKyAgICBpZiAoRnJhbWUqIGZyYW1lID0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJh
bWUoKSkKKyAgICAgICAgZnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5mb3JtU3Rh
dGVEaWRDaGFuZ2UoZWxlbWVudCk7Cit9CisKK2ludCBTZWxlY3RFbGVtZW50OjpvcHRpb25Ub0xp
c3RJbmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgY29uc3QgRWxlbWVudCogZWxl
bWVudCwgaW50IG9wdGlvbkluZGV4KQoreworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0
ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisgICAgaW50IGxpc3RTaXplID0gKGludCkg
aXRlbXMuc2l6ZSgpOworICAgIGlmIChvcHRpb25JbmRleCA8IDAgfHwgb3B0aW9uSW5kZXggPj0g
bGlzdFNpemUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGludCBvcHRpb25JbmRleDIgPSAt
MTsKKyAgICBmb3IgKGludCBsaXN0SW5kZXggPSAwOyBsaXN0SW5kZXggPCBsaXN0U2l6ZTsgKyts
aXN0SW5kZXgpIHsKKyAgICAgICAgaWYgKGlzT3B0aW9uRWxlbWVudChpdGVtc1tsaXN0SW5kZXhd
KSkgeworICAgICAgICAgICAgKytvcHRpb25JbmRleDI7CisgICAgICAgICAgICBpZiAob3B0aW9u
SW5kZXgyID09IG9wdGlvbkluZGV4KQorICAgICAgICAgICAgICAgIHJldHVybiBsaXN0SW5kZXg7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBTZWxlY3RFbGVt
ZW50OjpsaXN0VG9PcHRpb25JbmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgY29u
c3QgRWxlbWVudCogZWxlbWVudCwgaW50IGxpc3RJbmRleCkKK3sKKyAgICBjb25zdCBWZWN0b3I8
RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGlmIChsaXN0
SW5kZXggPCAwIHx8IGxpc3RJbmRleCA+PSBpbnQoaXRlbXMuc2l6ZSgpKSB8fAorICAgICAgICAh
aXNPcHRpb25FbGVtZW50KGl0ZW1zW2xpc3RJbmRleF0pKQorICAgICAgICByZXR1cm4gLTE7CisK
KyAgICBpbnQgb3B0aW9uSW5kZXggPSAwOyAvLyBhY3R1YWwgaW5kZXggb2Ygb3B0aW9uIG5vdCBj
b3VudGluZyBPUFRHUk9VUCBlbnRyaWVzIHRoYXQgbWF5IGJlIGluIGxpc3QKKyAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IGxpc3RJbmRleDsgKytpKQorICAgICAgICBpZiAoaXNPcHRpb25FbGVtZW50
KGl0ZW1zW2ldKSkKKyAgICAgICAgICAgICsrb3B0aW9uSW5kZXg7CisKKyAgICByZXR1cm4gb3B0
aW9uSW5kZXg7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6ZGlzcGF0Y2hGb2N1c0V2ZW50KFNl
bGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8vIFNhdmUg
dGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIG5ldyBzZWxlY3Rpb24g
d2hlbiBkaXNwYXRjaGluZyBjaGFuZ2UgZXZlbnRzIGR1cmluZyBibHVyIGV2ZW50IGRpc3BhdGNo
YWwKKyAgICBpZiAoZGF0YS51c2VzTWVudUxpc3QoKSkKKyAgICAgICAgc2F2ZUxhc3RTZWxlY3Rp
b24oZGF0YSwgZWxlbWVudCk7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6ZGlzcGF0Y2hCbHVy
RXZlbnQoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAg
Ly8gV2Ugb25seSBuZWVkIHRvIGZpcmUgY2hhbmdlIGV2ZW50cyBoZXJlIGZvciBtZW51IGxpc3Rz
LCBiZWNhdXNlIHdlIGZpcmUgY2hhbmdlIGV2ZW50cyBmb3IgbGlzdCBib3hlcyB3aGVuZXZlciB0
aGUgc2VsZWN0aW9uIGNoYW5nZSBpcyBhY3R1YWxseSBtYWRlLgorICAgIC8vIFRoaXMgbWF0Y2hl
cyBvdGhlciBicm93c2VycycgYmVoYXZpb3IuCisgICAgaWYgKGRhdGEudXNlc01lbnVMaXN0KCkp
CisgICAgICAgIG1lbnVMaXN0T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7Cit9CisKK3ZvaWQgU2Vs
ZWN0RWxlbWVudDo6ZGVzZWxlY3RJdGVtcyhTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVu
dCogZWxlbWVudCwgRWxlbWVudCogZXhjbHVkZUVsZW1lbnQpCit7CisgICAgY29uc3QgVmVjdG9y
PEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGl0ZW1z
W2ldID09IGV4Y2x1ZGVFbGVtZW50KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
aWYgKE9wdGlvbkVsZW1lbnQqIG9wdGlvbkVsZW1lbnQgPSB0b09wdGlvbkVsZW1lbnQoaXRlbXNb
aV0pKQorICAgICAgICAgICAgb3B0aW9uRWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7
CisgICAgfQorfQorCitib29sIFNlbGVjdEVsZW1lbnQ6OnNhdmVGb3JtQ29udHJvbFN0YXRlKGNv
bnN0IFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBFbGVtZW50KiBlbGVtZW50LCBTdHJp
bmcmIHZhbHVlKQoreworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5s
aXN0SXRlbXMoZWxlbWVudCk7CisgICAgaW50IGxlbmd0aCA9IGl0ZW1zLnNpemUoKTsKKworICAg
IFZlY3RvcjxjaGFyLCAxMDI0PiBjaGFyYWN0ZXJzKGxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVt
ZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKKyAgICAgICAgYm9vbCBzZWxlY3RlZCA9
IG9wdGlvbkVsZW1lbnQgPyBvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpIDogZmFsc2U7CisgICAg
ICAgIGNoYXJhY3RlcnNbaV0gPSBzZWxlY3RlZCA/ICdYJyA6ICcuJzsKKyAgICB9CisKKyAgICB2
YWx1ZSA9IFN0cmluZyhjaGFyYWN0ZXJzLmRhdGEoKSwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKwordm9pZCBTZWxlY3RFbGVtZW50OjpyZXN0b3JlRm9ybUNvbnRyb2xTdGF0ZShTZWxl
Y3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgY29uc3QgU3RyaW5nJiBzdGF0
ZSkKK3sKKyAgICByZWNhbGNMaXN0SXRlbXMoZGF0YSwgZWxlbWVudCk7CisKKyAgICBjb25zdCBW
ZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGlu
dCBsZW5ndGggPSBpdGVtcy5zaXplKCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0
aDsgKytpKSB7CisgICAgICAgIGlmIChPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9P
cHRpb25FbGVtZW50KGl0ZW1zW2ldKSkKKyAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQtPnNldFNl
bGVjdGVkU3RhdGUoc3RhdGVbaV0gPT0gJ1gnKTsKKyAgICB9CisKKyAgICBlbGVtZW50LT5zZXRO
ZWVkc1N0eWxlUmVjYWxjKCk7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6cGFyc2VNdWx0aXBs
ZUF0dHJpYnV0ZShTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgTWFw
cGVkQXR0cmlidXRlKiBhdHRyaWJ1dGUpCit7CisgICAgYm9vbCBvbGRVc2VzTWVudUxpc3QgPSBk
YXRhLnVzZXNNZW51TGlzdCgpOworICAgIGRhdGEuc2V0TXVsdGlwbGUoIWF0dHJpYnV0ZS0+aXNO
dWxsKCkpOworICAgIGlmIChvbGRVc2VzTWVudUxpc3QgIT0gZGF0YS51c2VzTWVudUxpc3QoKSAm
JiBlbGVtZW50LT5hdHRhY2hlZCgpKSB7CisgICAgICAgIGVsZW1lbnQtPmRldGFjaCgpOworICAg
ICAgICBlbGVtZW50LT5hdHRhY2goKTsKKyAgICB9Cit9CisKK2Jvb2wgU2VsZWN0RWxlbWVudDo6
YXBwZW5kRm9ybURhdGEoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQs
IEZvcm1EYXRhTGlzdCYgbGlzdCkKK3sKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUgPSBl
bGVtZW50LT5mb3JtQ29udHJvbE5hbWUoKTsKKyAgICBpZiAobmFtZS5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgc3VjY2Vzc2Z1bCA9IGZhbHNlOworICAgIGNv
bnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tp
XSk7CisgICAgICAgIGlmIChvcHRpb25FbGVtZW50ICYmIG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVk
KCkpIHsKKyAgICAgICAgICAgIGxpc3QuYXBwZW5kRGF0YShuYW1lLCBvcHRpb25FbGVtZW50LT52
YWx1ZSgpKTsKKyAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOworICAgICAgICB9CisgICAg
fQorCisgICAgLy8gIyMjIHRoaXMgY2FzZSBzaG91bGQgbm90IGhhcHBlbi4gbWFrZSBzdXJlIHRo
YXQgd2Ugc2VsZWN0IHRoZSBmaXJzdCBvcHRpb24KKyAgICAvLyBpbiBhbnkgY2FzZS4gb3RoZXJ3
aXNlIHdlIGhhdmUgbm8gY29uc2lzdGVuY3kgd2l0aCB0aGUgRE9NIGludGVyZmFjZS4gRklYTUUh
CisgICAgLy8gd2UgcmV0dXJuIHRoZSBmaXJzdCBvbmUgaWYgaXQgd2FzIGEgY29tYm9ib3ggc2Vs
ZWN0CisgICAgaWYgKCFzdWNjZXNzZnVsICYmICFkYXRhLm11bHRpcGxlKCkgJiYgZGF0YS5zaXpl
KCkgPD0gMSAmJiBpdGVtcy5zaXplKCkpIHsKKyAgICAgICAgT3B0aW9uRWxlbWVudCogb3B0aW9u
RWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1swXSk7CisgICAgICAgIGNvbnN0IEF0b21p
Y1N0cmluZyYgdmFsdWUgPSBvcHRpb25FbGVtZW50LT52YWx1ZSgpOworICAgICAgICBpZiAodmFs
dWUuaXNOdWxsKCkpCisgICAgICAgICAgICBsaXN0LmFwcGVuZERhdGEobmFtZSwgb3B0aW9uRWxl
bWVudC0+dGV4dCgpLnN0cmlwV2hpdGVTcGFjZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgbGlzdC5hcHBlbmREYXRhKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgc3VjY2Vzc2Z1bCA9IHRy
dWU7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3NmdWw7Cit9IAorCit2b2lkIFNlbGVjdEVs
ZW1lbnQ6OnJlc2V0KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQor
eworICAgIGJvb2wgb3B0aW9uU2VsZWN0ZWQgPSBmYWxzZTsKKyAgICBPcHRpb25FbGVtZW50KiBm
aXJzdE9wdGlvbiA9IDA7CisKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRh
dGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVt
cy5zaXplKCk7ICsraSkgeworICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0g
dG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKKyAgICAgICAgaWYgKCFvcHRpb25FbGVtZW50KQor
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKCFpdGVtc1tpXS0+Z2V0QXR0cmli
dXRlKEhUTUxOYW1lczo6c2VsZWN0ZWRBdHRyKS5pc051bGwoKSkgeworICAgICAgICAgICAgb3B0
aW9uRWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIG9wdGlvblNl
bGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBvcHRpb25FbGVtZW50
LT5zZXRTZWxlY3RlZFN0YXRlKGZhbHNlKTsKKworICAgICAgICBpZiAoIWZpcnN0T3B0aW9uKQor
ICAgICAgICAgICAgZmlyc3RPcHRpb24gPSBvcHRpb25FbGVtZW50OworICAgIH0KKworICAgIGlm
ICghb3B0aW9uU2VsZWN0ZWQgJiYgZmlyc3RPcHRpb24gJiYgZGF0YS51c2VzTWVudUxpc3QoKSkK
KyAgICAgICAgZmlyc3RPcHRpb24tPnNldFNlbGVjdGVkU3RhdGUodHJ1ZSk7CisKKyAgICBlbGVt
ZW50LT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6bWVu
dUxpc3REZWZhdWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50
KiBlbGVtZW50LCBFdmVudCogZXZlbnQsIEhUTUxGb3JtRWxlbWVudCogaHRtbEZvcm0pCit7Cisj
aWYgIUFSUk9XX0tFWVNfUE9QX01FTlUKKyAgICBVTlVTRURfUEFSQU0oaHRtbEZvcm0pOworI2Vu
ZGlmCisKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkua2V5ZG93bkV2ZW50
KSB7CisgICAgICAgIGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSB8fCAhZXZlbnQtPmlzS2V5Ym9h
cmRFdmVudCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFN0cmluZyBrZXlJZGVu
dGlmaWVyID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2ZW50KS0+a2V5SWRlbnRpZmll
cigpOworICAgICAgICBib29sIGhhbmRsZWQgPSBmYWxzZTsKKworI2lmIEFSUk9XX0tFWVNfUE9Q
X01FTlUKKyAgICAgICAgaWYgKGtleUlkZW50aWZpZXIgPT0gIkRvd24iIHx8IGtleUlkZW50aWZp
ZXIgPT0gIlVwIikgeworICAgICAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKKyAgICAgICAgICAg
IC8vIFNhdmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIG5ldyBz
ZWxlY3Rpb24gd2hlbiBkaXNwYXRjaGluZyBjaGFuZ2UgZXZlbnRzIGR1cmluZyBzZXRTZWxlY3Rl
ZEluZGV4LAorICAgICAgICAgICAgLy8gd2hpY2ggZ2V0cyBjYWxsZWQgZnJvbSBSZW5kZXJNZW51
TGlzdDo6dmFsdWVDaGFuZ2VkLCB3aGljaCBnZXRzIGNhbGxlZCBhZnRlciB0aGUgdXNlciBtYWtl
cyBhIHNlbGVjdGlvbiBmcm9tIHRoZSBtZW51LgorICAgICAgICAgICAgc2F2ZUxhc3RTZWxlY3Rp
b24oZGF0YSwgZWxlbWVudCk7CisgICAgICAgICAgICBpZiAoUmVuZGVyTWVudUxpc3QqIG1lbnVM
aXN0ID0gc3RhdGljX2Nhc3Q8UmVuZGVyTWVudUxpc3QqPihlbGVtZW50LT5yZW5kZXJlcigpKSkK
KyAgICAgICAgICAgICAgICBtZW51TGlzdC0+c2hvd1BvcHVwKCk7CisgICAgICAgICAgICBoYW5k
bGVkID0gdHJ1ZTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgY29uc3QgVmVjdG9yPEVsZW1l
bnQqPiYgbGlzdEl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisgICAgICAgIGludCBz
aXplID0gbGlzdEl0ZW1zLnNpemUoKTsKKworICAgICAgICBpbnQgbGlzdEluZGV4ID0gb3B0aW9u
VG9MaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgc2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50KSk7
CisgICAgICAgIGlmIChrZXlJZGVudGlmaWVyID09ICJEb3duIiB8fCBrZXlJZGVudGlmaWVyID09
ICJSaWdodCIpIHsKKyAgICAgICAgICAgIGZvciAobGlzdEluZGV4ICs9IDE7CisgICAgICAgICAg
ICAgICAgIGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHNpemUgJiYgKGxpc3RJdGVtc1ts
aXN0SW5kZXhdLT5kaXNhYmxlZCgpIHx8ICFpc09wdGlvbkVsZW1lbnQobGlzdEl0ZW1zW2xpc3RJ
bmRleF0pKTsKKyAgICAgICAgICAgICAgICAgKytsaXN0SW5kZXgpIHsgfQorICAgICAgICAgICAg
aWYgKGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHNpemUpCisgICAgICAgICAgICAgICAg
c2V0U2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50LCBsaXN0VG9PcHRpb25JbmRleChkYXRhLCBl
bGVtZW50LCBsaXN0SW5kZXgpKTsKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAg
ICB9IGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIlVwIiB8fCBrZXlJZGVudGlmaWVyID09ICJM
ZWZ0IikgeworICAgICAgICAgICAgZm9yIChsaXN0SW5kZXggLT0gMTsKKyAgICAgICAgICAgICAg
ICAgbGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgc2l6ZSAmJiAobGlzdEl0ZW1zW2xpc3RJ
bmRleF0tPmRpc2FibGVkKCkgfHwgIWlzT3B0aW9uRWxlbWVudChsaXN0SXRlbXNbbGlzdEluZGV4
XSkpOworICAgICAgICAgICAgICAgICAtLWxpc3RJbmRleCkgeyB9CisgICAgICAgICAgICBpZiAo
bGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgc2l6ZSkKKyAgICAgICAgICAgICAgICBzZXRT
ZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1lbnQsIGxpc3RUb09wdGlvbkluZGV4KGRhdGEsIGVsZW1l
bnQsIGxpc3RJbmRleCkpOworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0K
KyNlbmRpZgorICAgICAgICBpZiAoaGFuZGxlZCkKKyAgICAgICAgICAgIGV2ZW50LT5zZXREZWZh
dWx0SGFuZGxlZCgpOworICAgIH0KKworICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBz
aW5jZSBzZW5kaW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKKyAgICAvLyBvbiBrZXkgZG93biBi
bG9ja3MgdGhlIHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQuCisgICAgaWYg
KGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleXByZXNzRXZlbnQpIHsKKyAgICAgICAg
aWYgKCFlbGVtZW50LT5yZW5kZXJlcigpIHx8ICFldmVudC0+aXNLZXlib2FyZEV2ZW50KCkpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IGtleUNvZGUgPSBzdGF0aWNfY2FzdDxL
ZXlib2FyZEV2ZW50Kj4oZXZlbnQpLT5rZXlDb2RlKCk7CisgICAgICAgIGJvb2wgaGFuZGxlZCA9
IGZhbHNlOworCisjaWYgQVJST1dfS0VZU19QT1BfTUVOVQorICAgICAgICBpZiAoa2V5Q29kZSA9
PSAnICcpIHsKKyAgICAgICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7CisgICAgICAgICAgICAvLyBT
YXZlIHRoZSBzZWxlY3Rpb24gc28gaXQgY2FuIGJlIGNvbXBhcmVkIHRvIHRoZSBuZXcgc2VsZWN0
aW9uIHdoZW4gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgc2V0U2VsZWN0ZWRJbmRl
eCwKKyAgICAgICAgICAgIC8vIHdoaWNoIGdldHMgY2FsbGVkIGZyb20gUmVuZGVyTWVudUxpc3Q6
OnZhbHVlQ2hhbmdlZCwgd2hpY2ggZ2V0cyBjYWxsZWQgYWZ0ZXIgdGhlIHVzZXIgbWFrZXMgYSBz
ZWxlY3Rpb24gZnJvbSB0aGUgbWVudS4KKyAgICAgICAgICAgIHNhdmVMYXN0U2VsZWN0aW9uKGRh
dGEsIGVsZW1lbnQpOworICAgICAgICAgICAgaWYgKFJlbmRlck1lbnVMaXN0KiBtZW51TGlzdCA9
IHN0YXRpY19jYXN0PFJlbmRlck1lbnVMaXN0Kj4oZWxlbWVudC0+cmVuZGVyZXIoKSkpCisgICAg
ICAgICAgICAgICAgbWVudUxpc3QtPnNob3dQb3B1cCgpOworICAgICAgICAgICAgaGFuZGxlZCA9
IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PSAnXHInKSB7CisgICAgICAgICAg
ICBtZW51TGlzdE9uQ2hhbmdlKGRhdGEsIGVsZW1lbnQpOworICAgICAgICAgICAgaWYgKGh0bWxG
b3JtKQorICAgICAgICAgICAgICAgIGh0bWxGb3JtLT5zdWJtaXRDbGljayhldmVudCk7CisgICAg
ICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaW50IGxp
c3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIHNlbGVjdGVkSW5kZXgo
ZGF0YSwgZWxlbWVudCkpOworICAgICAgICBpZiAoa2V5Q29kZSA9PSAnXHInKSB7CisgICAgICAg
ICAgICAvLyBsaXN0SW5kZXggc2hvdWxkIGFscmVhZHkgYmUgc2VsZWN0ZWQsIGJ1dCB0aGlzIHdp
bGwgZmlyZSB0aGUgb25jaGFuZ2UgaGFuZGxlci4KKyAgICAgICAgICAgIHNldFNlbGVjdGVkSW5k
ZXgoZGF0YSwgZWxlbWVudCwgbGlzdFRvT3B0aW9uSW5kZXgoZGF0YSwgZWxlbWVudCwgbGlzdElu
ZGV4KSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAg
fQorI2VuZGlmCisgICAgICAgIGlmIChoYW5kbGVkKQorICAgICAgICAgICAgZXZlbnQtPnNldERl
ZmF1bHRIYW5kbGVkKCk7CisgICAgfQorCisgICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnRO
YW1lcygpLm1vdXNlZG93bkV2ZW50ICYmIGV2ZW50LT5pc01vdXNlRXZlbnQoKSAmJiBzdGF0aWNf
Y2FzdDxNb3VzZUV2ZW50Kj4oZXZlbnQpLT5idXR0b24oKSA9PSBMZWZ0QnV0dG9uKSB7CisgICAg
ICAgIGVsZW1lbnQtPmZvY3VzKCk7CisgICAgICAgIGlmIChSZW5kZXJNZW51TGlzdCogbWVudUxp
c3QgPSBzdGF0aWNfY2FzdDxSZW5kZXJNZW51TGlzdCo+KGVsZW1lbnQtPnJlbmRlcmVyKCkpKSB7
CisgICAgICAgICAgICBpZiAobWVudUxpc3QtPnBvcHVwSXNWaXNpYmxlKCkpCisgICAgICAgICAg
ICAgICAgbWVudUxpc3QtPmhpZGVQb3B1cCgpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAg
ICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0
aGUgbmV3IHNlbGVjdGlvbiB3aGVuIHdlIGNhbGwgb25DaGFuZ2UgZHVyaW5nIHNldFNlbGVjdGVk
SW5kZXgsCisgICAgICAgICAgICAgICAgLy8gd2hpY2ggZ2V0cyBjYWxsZWQgZnJvbSBSZW5kZXJN
ZW51TGlzdDo6dmFsdWVDaGFuZ2VkLCB3aGljaCBnZXRzIGNhbGxlZCBhZnRlciB0aGUgdXNlciBt
YWtlcyBhIHNlbGVjdGlvbiBmcm9tIHRoZSBtZW51LgorICAgICAgICAgICAgICAgIHNhdmVMYXN0
U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOworICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93
UG9wdXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBldmVudC0+c2V0RGVm
YXVsdEhhbmRsZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVudDo6bGlzdEJveERl
ZmF1bHRFdmVudEhhbmRsZXIoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1l
bnQsIEV2ZW50KiBldmVudCwgSFRNTEZvcm1FbGVtZW50KiBodG1sRm9ybSkKK3sKKyAgICBjb25z
dCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsK
KworICAgIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5tb3VzZWRvd25FdmVudCAm
JiBldmVudC0+aXNNb3VzZUV2ZW50KCkgJiYgc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2ZW50
KS0+YnV0dG9uKCkgPT0gTGVmdEJ1dHRvbikgeworICAgICAgICBlbGVtZW50LT5mb2N1cygpOwor
CisgICAgICAgIC8vIENvbnZlcnQgdG8gY29vcmRzIHJlbGF0aXZlIHRvIHRoZSBsaXN0IGJveCBp
ZiBuZWVkZWQuCisgICAgICAgIE1vdXNlRXZlbnQqIG1vdXNlRXZlbnQgPSBzdGF0aWNfY2FzdDxN
b3VzZUV2ZW50Kj4oZXZlbnQpOworICAgICAgICBJbnRQb2ludCBsb2NhbE9mZnNldCA9IHJvdW5k
ZWRJbnRQb2ludChlbGVtZW50LT5yZW5kZXJlcigpLT5hYnNvbHV0ZVRvTG9jYWwobW91c2VFdmVu
dC0+YWJzb2x1dGVMb2NhdGlvbigpLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICBpbnQgbGlzdElu
ZGV4ID0gc3RhdGljX2Nhc3Q8UmVuZGVyTGlzdEJveCo+KGVsZW1lbnQtPnJlbmRlcmVyKCkpLT5s
aXN0SW5kZXhBdE9mZnNldChsb2NhbE9mZnNldC54KCksIGxvY2FsT2Zmc2V0LnkoKSk7CisgICAg
ICAgIGlmIChsaXN0SW5kZXggPj0gMCkgeworICAgICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0
aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3Bh
dGNoaW5nIGNoYW5nZSBldmVudHMgZHVyaW5nIG1vdXNldXAsIG9yIGFmdGVyIGF1dG9zY3JvbGwg
ZmluaXNoZXMuCisgICAgICAgICAgICBzYXZlTGFzdFNlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsK
KworICAgICAgICAgICAgZGF0YS5zZXRBY3RpdmVTZWxlY3Rpb25TdGF0ZSh0cnVlKTsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgYm9vbCBtdWx0aVNlbGVjdEtleVByZXNzZWQgPSBmYWxzZTsK
KyNpZiBQTEFURk9STShNQUMpCisgICAgICAgICAgICBtdWx0aVNlbGVjdEtleVByZXNzZWQgPSBt
b3VzZUV2ZW50LT5tZXRhS2V5KCk7CisjZWxzZQorICAgICAgICAgICAgbXVsdGlTZWxlY3RLZXlQ
cmVzc2VkID0gbW91c2VFdmVudC0+Y3RybEtleSgpOworI2VuZGlmCisKKyAgICAgICAgICAgIGJv
b2wgc2hpZnRTZWxlY3QgPSBkYXRhLm11bHRpcGxlKCkgJiYgbW91c2VFdmVudC0+c2hpZnRLZXko
KTsKKyAgICAgICAgICAgIGJvb2wgbXVsdGlTZWxlY3QgPSBkYXRhLm11bHRpcGxlKCkgJiYgbXVs
dGlTZWxlY3RLZXlQcmVzc2VkICYmICFtb3VzZUV2ZW50LT5zaGlmdEtleSgpOworCisgICAgICAg
ICAgICBFbGVtZW50KiBjbGlja2VkRWxlbWVudCA9IGxpc3RJdGVtc1tsaXN0SW5kZXhdOyAgICAg
ICAgICAgIAorICAgICAgICAgICAgT3B0aW9uRWxlbWVudCogb3B0aW9uID0gdG9PcHRpb25FbGVt
ZW50KGNsaWNrZWRFbGVtZW50KTsKKyAgICAgICAgICAgIGlmIChvcHRpb24pIHsKKyAgICAgICAg
ICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgYW4gYWN0aXZlIHNlbGVjdGlvbiAobGlr
ZSBkdXJpbmcgZHJhZyBzZWxlY3Rpb24pLCBzaG91bGQgc2VsZWN0IG9yIGRlc2VsZWN0CisgICAg
ICAgICAgICAgICAgaWYgKG9wdGlvbi0+c2VsZWN0ZWQoKSAmJiBtdWx0aVNlbGVjdEtleVByZXNz
ZWQpCisgICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0QWN0aXZlU2VsZWN0aW9uU3RhdGUoZmFs
c2UpOworCisgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmFjdGl2ZVNlbGVjdGlvblN0YXRlKCkp
CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBp
biBhbnkgc3BlY2lhbCBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSwgdGhlbiBkZXNlbGVjdCBhbGwg
b3RoZXIgaXRlbXMsIGV4Y2x1ZGluZyB0aGUgY2xpY2tlZCBvcHRpb24uCisgICAgICAgICAgICAv
LyBJZiBubyBvcHRpb24gd2FzIGNsaWNrZWQsIHRoZW4gdGhpcyB3aWxsIGRlc2VsZWN0IGFsbCBp
dGVtcyBpbiB0aGUgbGlzdC4KKyAgICAgICAgICAgIGlmICghc2hpZnRTZWxlY3QgJiYgIW11bHRp
U2VsZWN0KQorICAgICAgICAgICAgICAgIGRlc2VsZWN0SXRlbXMoZGF0YSwgZWxlbWVudCwgY2xp
Y2tlZEVsZW1lbnQpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgYW5jaG9yIGhhc24ndCBiZWVu
IHNldCwgYW5kIHdlJ3JlIGRvaW5nIGEgc2luZ2xlIHNlbGVjdGlvbiBvciBhIHNoaWZ0IHNlbGVj
dGlvbiwgdGhlbiBpbml0aWFsaXplIHRoZSBhbmNob3IgdG8gdGhlIGZpcnN0IHNlbGVjdGVkIGlu
ZGV4LgorICAgICAgICAgICAgaWYgKGRhdGEuYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoKSA8
IDAgJiYgIW11bHRpU2VsZWN0KQorICAgICAgICAgICAgICAgIHNldEFjdGl2ZVNlbGVjdGlvbkFu
Y2hvckluZGV4KGRhdGEsIGVsZW1lbnQsIHNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCkpOwor
CisgICAgICAgICAgICAvLyBTZXQgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGUgY2xpY2tlZCBv
cHRpb24KKyAgICAgICAgICAgIGlmIChvcHRpb24gJiYgIWNsaWNrZWRFbGVtZW50LT5kaXNhYmxl
ZCgpKQorICAgICAgICAgICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG5vIHNlbGVjdGVkSW5kZXgo
KSBmb3IgdGhlIHByZXZpb3VzIGluaXRpYWxpemF0aW9uLCBvcgorICAgICAgICAgICAgLy8gSWYg
d2UncmUgZG9pbmcgYSBzaW5nbGUgc2VsZWN0aW9uLCBvciBhIG11bHRpcGxlIHNlbGVjdGlvbiAo
dXNpbmcgY21kIG9yIGN0cmwpLCB0aGVuIGluaXRpYWxpemUgdGhlIGFuY2hvciBpbmRleCB0byB0
aGUgbGlzdEluZGV4IHRoYXQganVzdCBnb3QgY2xpY2tlZC4KKyAgICAgICAgICAgIGlmIChsaXN0
SW5kZXggPj0gMCAmJiAoZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpIDwgMCB8fCAh
c2hpZnRTZWxlY3QpKQorICAgICAgICAgICAgICAgIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvcklu
ZGV4KGRhdGEsIGVsZW1lbnQsIGxpc3RJbmRleCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IHNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGRhdGEsIGxpc3RJbmRleCk7CisgICAgICAgICAg
ICB1cGRhdGVMaXN0Qm94U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQsICFtdWx0aVNlbGVjdCk7CisK
KyAgICAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFt
ZSgpKQorICAgICAgICAgICAgICAgIGZyYW1lLT5ldmVudEhhbmRsZXIoKS0+c2V0TW91c2VEb3du
TWF5U3RhcnRBdXRvc2Nyb2xsKCk7CisKKyAgICAgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFu
ZGxlZCgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50
TmFtZXMoKS5tb3VzZXVwRXZlbnQgJiYgZXZlbnQtPmlzTW91c2VFdmVudCgpICYmIHN0YXRpY19j
YXN0PE1vdXNlRXZlbnQqPihldmVudCktPmJ1dHRvbigpID09IExlZnRCdXR0b24gJiYgZWxlbWVu
dC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPmF1dG9zY3JvbGxSZW5kZXJl
cigpICE9IGVsZW1lbnQtPnJlbmRlcmVyKCkpCisgICAgICAgIC8vIFRoaXMgbWFrZXMgc3VyZSB3
ZSBmaXJlIGRpc3BhdGNoRm9ybUNvbnRyb2xDaGFuZ2VFdmVudCBmb3IgYSBzaW5nbGUgY2xpY2su
ICBGb3IgZHJhZyBzZWxlY3Rpb24sIG9uQ2hhbmdlIHdpbGwgZmlyZSB3aGVuIHRoZSBhdXRvc2Ny
b2xsIHRpbWVyIHN0b3BzLgorICAgICAgICBsaXN0Qm94T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7
CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkua2V5ZG93bkV2ZW50
KSB7CisgICAgICAgIGlmICghZXZlbnQtPmlzS2V5Ym9hcmRFdmVudCgpKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICBTdHJpbmcga2V5SWRlbnRpZmllciA9IHN0YXRpY19jYXN0PEtleWJv
YXJkRXZlbnQqPihldmVudCktPmtleUlkZW50aWZpZXIoKTsKKworICAgICAgICBpbnQgZW5kSW5k
ZXggPSAwOyAgICAgICAgCisgICAgICAgIGlmIChkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4
KCkgPCAwKSB7CisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBlbmQgaW5kZXgKKyAgICAg
ICAgICAgIGlmIChrZXlJZGVudGlmaWVyID09ICJEb3duIikKKyAgICAgICAgICAgICAgICBlbmRJ
bmRleCA9IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIGxhc3RTZWxlY3Rl
ZExpc3RJbmRleChkYXRhLCBlbGVtZW50KSk7CisgICAgICAgICAgICBlbHNlIGlmIChrZXlJZGVu
dGlmaWVyID09ICJVcCIpCisgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBwcmV2aW91c1NlbGVj
dGFibGVMaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgb3B0aW9uVG9MaXN0SW5kZXgoZGF0YSwgZWxl
bWVudCwgc2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50KSkpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgLy8gU2V0IHRoZSBlbmQgaW5kZXggYmFzZWQgb24gdGhlIGN1cnJlbnQgZW5k
IGluZGV4CisgICAgICAgICAgICBpZiAoa2V5SWRlbnRpZmllciA9PSAiRG93biIpCisgICAgICAg
ICAgICAgICAgZW5kSW5kZXggPSBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBlbGVtZW50
LCBkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkpOworICAgICAgICAgICAgZWxzZSBpZiAo
a2V5SWRlbnRpZmllciA9PSAiVXAiKQorICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gcHJldmlv
dXNTZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIGRhdGEuYWN0aXZlU2VsZWN0aW9u
RW5kSW5kZXgoKSk7ICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoa2V5SWRl
bnRpZmllciA9PSAiRG93biIgfHwga2V5SWRlbnRpZmllciA9PSAiVXAiKSB7CisgICAgICAgICAg
ICAvLyBTYXZlIHRoZSBzZWxlY3Rpb24gc28gaXQgY2FuIGJlIGNvbXBhcmVkIHRvIHRoZSBuZXcg
c2VsZWN0aW9uIHdoZW4gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBpbW1lZGlhdGVseSBhZnRl
ciBtYWtpbmcgdGhlIG5ldyBzZWxlY3Rpb24uCisgICAgICAgICAgICBzYXZlTGFzdFNlbGVjdGlv
bihkYXRhLCBlbGVtZW50KTsKKworICAgICAgICAgICAgQVNTRVJUKGVuZEluZGV4ID49IDAgJiYg
KHVuc2lnbmVkKSBlbmRJbmRleCA8IGxpc3RJdGVtcy5zaXplKCkpOyAKKyAgICAgICAgICAgIHNl
dEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGRhdGEsIGVuZEluZGV4KTsKKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgLy8gSWYgdGhlIGFuY2hvciBpcyB1bml0aWFsaXplZCwgb3IgaWYgd2UncmUg
Z29pbmcgdG8gZGVzZWxlY3QgYWxsIG90aGVyIG9wdGlvbnMsIHRoZW4gc2V0IHRoZSBhbmNob3Ig
aW5kZXggZXF1YWwgdG8gdGhlIGVuZCBpbmRleC4KKyAgICAgICAgICAgIGJvb2wgZGVzZWxlY3RP
dGhlcnMgPSAhZGF0YS5tdWx0aXBsZSgpIHx8ICFzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50Kj4o
ZXZlbnQpLT5zaGlmdEtleSgpOworICAgICAgICAgICAgaWYgKGRhdGEuYWN0aXZlU2VsZWN0aW9u
QW5jaG9ySW5kZXgoKSA8IDAgfHwgZGVzZWxlY3RPdGhlcnMpIHsKKyAgICAgICAgICAgICAgICBk
YXRhLnNldEFjdGl2ZVNlbGVjdGlvblN0YXRlKHRydWUpOworICAgICAgICAgICAgICAgIGlmIChk
ZXNlbGVjdE90aGVycykKKyAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RJdGVtcyhkYXRhLCBl
bGVtZW50KTsKKyAgICAgICAgICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChk
YXRhLCBlbGVtZW50LCBkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJMaXN0Qm94Kj4oZWxlbWVudC0+
cmVuZGVyZXIoKSktPnNjcm9sbFRvUmV2ZWFsRWxlbWVudEF0TGlzdEluZGV4KGVuZEluZGV4KTsK
KyAgICAgICAgICAgIHVwZGF0ZUxpc3RCb3hTZWxlY3Rpb24oZGF0YSwgZWxlbWVudCwgZGVzZWxl
Y3RPdGhlcnMpOworICAgICAgICAgICAgbGlzdEJveE9uQ2hhbmdlKGRhdGEsIGVsZW1lbnQpOwor
ICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgICAgIH0KKyAgICB9
IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleXByZXNzRXZlbnQpIHsK
KyAgICAgICAgaWYgKCFldmVudC0+aXNLZXlib2FyZEV2ZW50KCkpCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIGludCBrZXlDb2RlID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2
ZW50KS0+a2V5Q29kZSgpOworCisgICAgICAgIGlmIChrZXlDb2RlID09ICdccicpIHsKKyAgICAg
ICAgICAgIGlmIChodG1sRm9ybSkKKyAgICAgICAgICAgICAgICBodG1sRm9ybS0+c3VibWl0Q2xp
Y2soZXZlbnQpOworICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU2VsZWN0RWxlbWVu
dDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCog
ZWxlbWVudCwgRXZlbnQqIGV2ZW50LCBIVE1MRm9ybUVsZW1lbnQqIGh0bWxGb3JtKQoreworICAg
IGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGRh
dGEudXNlc01lbnVMaXN0KCkpCisgICAgICAgIG1lbnVMaXN0RGVmYXVsdEV2ZW50SGFuZGxlcihk
YXRhLCBlbGVtZW50LCBldmVudCwgaHRtbEZvcm0pOworICAgIGVsc2UgCisgICAgICAgIGxpc3RC
b3hEZWZhdWx0RXZlbnRIYW5kbGVyKGRhdGEsIGVsZW1lbnQsIGV2ZW50LCBodG1sRm9ybSk7CisK
KyAgICBpZiAoZXZlbnQtPmRlZmF1bHRIYW5kbGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5rZXlwcmVzc0V2ZW50ICYmIGV2ZW50
LT5pc0tleWJvYXJkRXZlbnQoKSkgeworICAgICAgICBLZXlib2FyZEV2ZW50KiBrZXlib2FyZEV2
ZW50ID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2ZW50KTsKKyAgICAgICAgaWYgKCFr
ZXlib2FyZEV2ZW50LT5jdHJsS2V5KCkgJiYgIWtleWJvYXJkRXZlbnQtPmFsdEtleSgpICYmICFr
ZXlib2FyZEV2ZW50LT5tZXRhS2V5KCkgJiYgaXNQcmludGFibGVDaGFyKGtleWJvYXJkRXZlbnQt
PmNoYXJDb2RlKCkpKSB7CisgICAgICAgICAgICB0eXBlQWhlYWRGaW5kKGRhdGEsIGVsZW1lbnQs
IGtleWJvYXJkRXZlbnQpOworICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBTZWxlY3RF
bGVtZW50OjpsYXN0U2VsZWN0ZWRMaXN0SW5kZXgoY29uc3QgU2VsZWN0RWxlbWVudERhdGEmIGRh
dGEsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgLy8gcmV0dXJuIHRoZSBudW1iZXIg
b2YgdGhlIGxhc3Qgb3B0aW9uIHNlbGVjdGVkCisgICAgdW5zaWduZWQgaW5kZXggPSAwOworICAg
IGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9
IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBp
IDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKE9wdGlvbkVsZW1lbnQqIG9wdGlv
bkVsZW1lbnQgPSB0b09wdGlvbkVsZW1lbnQoaXRlbXNbaV0pKSB7CisgICAgICAgICAgICBpZiAo
b3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gaTsK
KyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICB9CisKKyAgICByZXR1cm4gZm91bmQgPyAoaW50KSBpbmRleCA6IC0xOworfQorCitzdGF0
aWMgU3RyaW5nIHN0cmlwTGVhZGluZ1doaXRlU3BhY2UoY29uc3QgU3RyaW5nJiBzdHJpbmcpCit7
CisgICAgaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKKworICAgIGludCBpOworICAgIGZv
ciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBpZiAoc3RyaW5nW2ldICE9IG5v
QnJlYWtTcGFjZSAmJiAoc3RyaW5nW2ldIDw9IDB4N0YgPyAhaXNBU0NJSVNwYWNlKHN0cmluZ1tp
XSkgOiAoZGlyZWN0aW9uKHN0cmluZ1tpXSkgIT0gV2hpdGVTcGFjZU5ldXRyYWwpKSkKKyAgICAg
ICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKGksIGxl
bmd0aCAtIGkpOworfQorCit2b2lkIFNlbGVjdEVsZW1lbnQ6OnR5cGVBaGVhZEZpbmQoU2VsZWN0
RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIEtleWJvYXJkRXZlbnQqIGV2ZW50
KQoreworICAgIGlmIChldmVudC0+dGltZVN0YW1wKCkgPCBkYXRhLmxhc3RDaGFyVGltZSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBET01UaW1lU3RhbXAgZGVsdGEgPSBldmVudC0+dGltZVN0
YW1wKCkgLSBkYXRhLmxhc3RDaGFyVGltZSgpOworICAgIGRhdGEuc2V0TGFzdENoYXJUaW1lKGV2
ZW50LT50aW1lU3RhbXAoKSk7CisKKyAgICBVQ2hhciBjID0gZXZlbnQtPmNoYXJDb2RlKCk7CisK
KyAgICBTdHJpbmcgcHJlZml4OworICAgIGludCBzZWFyY2hTdGFydE9mZnNldCA9IDE7CisgICAg
aWYgKGRlbHRhID4gc190eXBlQWhlYWRUaW1lb3V0KSB7CisgICAgICAgIHByZWZpeCA9IFN0cmlu
ZygmYywgMSk7CisgICAgICAgIGRhdGEuc2V0VHlwZWRTdHJpbmcocHJlZml4KTsKKyAgICAgICAg
ZGF0YS5zZXRSZXBlYXRpbmdDaGFyKGMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEudHlw
ZWRTdHJpbmcoKS5hcHBlbmQoYyk7CisKKyAgICAgICAgaWYgKGMgPT0gZGF0YS5yZXBlYXRpbmdD
aGFyKCkpCisgICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBsaWtlbHkgdHJ5aW5nIHRvIGN5Y2xl
IHRocm91Z2ggYWxsIHRoZSBpdGVtcyBzdGFydGluZyB3aXRoIHRoaXMgY2hhcmFjdGVyLCBzbyBq
dXN0IHNlYXJjaCBvbiB0aGUgY2hhcmFjdGVyCisgICAgICAgICAgICBwcmVmaXggPSBTdHJpbmco
JmMsIDEpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEuc2V0UmVwZWF0aW5nQ2hh
cigwKTsKKyAgICAgICAgICAgIHByZWZpeCA9IGRhdGEudHlwZWRTdHJpbmcoKTsKKyAgICAgICAg
ICAgIHNlYXJjaFN0YXJ0T2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0
IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisgICAg
aW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICBpZiAoaXRlbUNvdW50IDwgMSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaW50IHNlbGVjdGVkID0gc2VsZWN0ZWRJbmRleChkYXRhLCBl
bGVtZW50KTsKKyAgICBpbnQgaW5kZXggPSAob3B0aW9uVG9MaXN0SW5kZXgoZGF0YSwgZWxlbWVu
dCwgc2VsZWN0ZWQgPj0gMCA/IHNlbGVjdGVkIDogMCkgKyBzZWFyY2hTdGFydE9mZnNldCkgJSBp
dGVtQ291bnQ7CisgICAgQVNTRVJUKGluZGV4ID49IDApOworCisgICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBpdGVtQ291bnQ7ICsraSwgaW5kZXggPSAoaW5kZXggKyAxKSAlIGl0ZW1Db3VudCkgewor
ICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0
ZW1zW2luZGV4XSk7CisgICAgICAgIGlmICghb3B0aW9uRWxlbWVudCB8fCBpdGVtc1tpbmRleF0t
PmRpc2FibGVkKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBTdHJpbmcgdGV4
dCA9IG9wdGlvbkVsZW1lbnQtPnRleHRJbmRlbnRlZFRvUmVzcGVjdEdyb3VwTGFiZWwoKTsKKyAg
ICAgICAgaWYgKHN0cmlwTGVhZGluZ1doaXRlU3BhY2UodGV4dCkuc3RhcnRzV2l0aChwcmVmaXgs
IGZhbHNlKSkgeworICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50LCBs
aXN0VG9PcHRpb25JbmRleChkYXRhLCBlbGVtZW50LCBpbmRleCkpOworICAgICAgICAgICAgaWYg
KCFkYXRhLnVzZXNNZW51TGlzdCgpKQorICAgICAgICAgICAgICAgIGxpc3RCb3hPbkNoYW5nZShk
YXRhLCBlbGVtZW50KTsKKyAgICAgICAgICAgIGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMo
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTZWxl
Y3RFbGVtZW50OjppbnNlcnRlZEludG9UcmVlKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVt
ZW50KiBlbGVtZW50KQoreworICAgIC8vIFdoZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBkdXJp
bmcgZG9jdW1lbnQgcGFyc2luZywgaXQgd29uJ3QgaGF2ZSBhbnkgaXRlbXMgeWV0IC0gYnV0IGZv
ciBpbm5lckhUTUwKKyAgICAvLyBhbmQgcmVsYXRlZCBtZXRob2RzLCB0aGlzIG1ldGhvZCBpcyBj
YWxsZWQgYWZ0ZXIgdGhlIHdob2xlIHN1YnRyZWUgaXMgY29uc3RydWN0ZWQuCisgICAgcmVjYWxj
TGlzdEl0ZW1zKGRhdGEsIGVsZW1lbnQsIHRydWUpOworfQorCisvLyBTZWxlY3RFbGVtZW50RGF0
YQorU2VsZWN0RWxlbWVudERhdGE6OlNlbGVjdEVsZW1lbnREYXRhKCkKKyAgICA6IG1fbXVsdGlw
bGUoZmFsc2UpIAorICAgICwgbV9zaXplKDApCisgICAgLCBtX2xhc3RPbkNoYW5nZUluZGV4KC0x
KQorICAgICwgbV9hY3RpdmVTZWxlY3Rpb25TdGF0ZShmYWxzZSkKKyAgICAsIG1fYWN0aXZlU2Vs
ZWN0aW9uQW5jaG9ySW5kZXgoLTEpCisgICAgLCBtX2FjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KC0x
KQorICAgICwgbV9yZWNhbGNMaXN0SXRlbXMoZmFsc2UpCisgICAgLCBtX3JlcGVhdGluZ0NoYXIo
MCkKKyAgICAsIG1fbGFzdENoYXJUaW1lKDApCit7Cit9CisKK1NlbGVjdEVsZW1lbnREYXRhOjp+
U2VsZWN0RWxlbWVudERhdGEoKQoreworfQorCit2b2lkIFNlbGVjdEVsZW1lbnREYXRhOjpjaGVj
a0xpc3RJdGVtcyhjb25zdCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworI2lmbmRlZiBOREVC
VUcKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IG1fbGlzdEl0ZW1zOworICAg
IFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtcygqY29uc3RfY2FzdDxTZWxlY3RFbGVtZW50
RGF0YSo+KHRoaXMpLCBlbGVtZW50LCBmYWxzZSk7CisgICAgQVNTRVJUKGl0ZW1zID09IG1fbGlz
dEl0ZW1zKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGVsZW1lbnQpOworI2VuZGlmCit9CisK
K1ZlY3RvcjxFbGVtZW50Kj4mIFNlbGVjdEVsZW1lbnREYXRhOjpsaXN0SXRlbXMoY29uc3QgRWxl
bWVudCogZWxlbWVudCkKK3sKKyAgICBpZiAobV9yZWNhbGNMaXN0SXRlbXMpCisgICAgICAgIFNl
bGVjdEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtcygqdGhpcywgZWxlbWVudCk7CisgICAgZWxzZQor
ICAgICAgICBjaGVja0xpc3RJdGVtcyhlbGVtZW50KTsKKworICAgIHJldHVybiBtX2xpc3RJdGVt
czsKK30KKworY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgU2VsZWN0RWxlbWVudERhdGE6Omxpc3RJ
dGVtcyhjb25zdCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIGlmIChtX3JlY2FsY0xp
c3RJdGVtcykKKyAgICAgICAgU2VsZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zKCpjb25zdF9j
YXN0PFNlbGVjdEVsZW1lbnREYXRhKj4odGhpcyksIGVsZW1lbnQpOworICAgIGVsc2UKKyAgICAg
ICAgY2hlY2tMaXN0SXRlbXMoZWxlbWVudCk7CisKKyAgICByZXR1cm4gbV9saXN0SXRlbXM7Cit9
CisKIFNlbGVjdEVsZW1lbnQqIHRvU2VsZWN0RWxlbWVudChFbGVtZW50KiBlbGVtZW50KQogewog
ICAgIGlmIChlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkpIHsKSW5kZXg6IGRvbS9TZWxlY3RFbGVt
ZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gZG9tL1NlbGVjdEVsZW1lbnQuaAkocmV2aXNpb24gNDQyMjYp
CisrKyBkb20vU2VsZWN0RWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAog
LyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKQorICogQ29weXJpZ2h0IChDKSAy
MDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwLy93d3cudG9y
Y2htb2JpbGUuY29tLykKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMjIsMTAgKzIyLDE4IEBACiAj
ZGVmaW5lIFNlbGVjdEVsZW1lbnRfaAogCiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1
ZGUgIkV2ZW50LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgRWxlbWVudDsKK2Ns
YXNzIEV2ZW50OworY2xhc3MgRm9ybURhdGFMaXN0OworY2xhc3MgSFRNTEZvcm1FbGVtZW50Owor
Y2xhc3MgS2V5Ym9hcmRFdmVudDsKK2NsYXNzIE1hcHBlZEF0dHJpYnV0ZTsKK2NsYXNzIFNlbGVj
dEVsZW1lbnREYXRhOworY2xhc3MgU3RyaW5nOwogCiBjbGFzcyBTZWxlY3RFbGVtZW50IHsKIHB1
YmxpYzoKQEAgLTUyLDYgKzYwLDExMiBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIGludCBzZWxl
Y3RlZEluZGV4KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzZXRTZWxlY3RlZEluZGV4
KGludCBpbmRleCwgYm9vbCBkZXNlbGVjdCA9IHRydWUsIGJvb2wgZmlyZU9uQ2hhbmdlID0gZmFs
c2UpID0gMDsKKworcHJvdGVjdGVkOgorICAgIGZyaWVuZCBjbGFzcyBTZWxlY3RFbGVtZW50RGF0
YTsKKyAgICBzdGF0aWMgdm9pZCBzZWxlY3RBbGwoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50
Kik7CisgICAgc3RhdGljIHZvaWQgc2F2ZUxhc3RTZWxlY3Rpb24oU2VsZWN0RWxlbWVudERhdGEm
LCBFbGVtZW50Kik7CisgICAgc3RhdGljIGludCBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleChTZWxl
Y3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBpbnQgc3RhcnRJbmRleCk7CisgICAgc3RhdGljIGlu
dCBwcmV2aW91c1NlbGVjdGFibGVMaXN0SW5kZXgoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50
KiwgaW50IHN0YXJ0SW5kZXgpOworICAgIHN0YXRpYyB2b2lkIHNldEFjdGl2ZVNlbGVjdGlvbkFu
Y2hvckluZGV4KFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIGludCBpbmRleCk7CisgICAg
c3RhdGljIHZvaWQgc2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoU2VsZWN0RWxlbWVudERhdGEm
LCBpbnQgaW5kZXgpOworICAgIHN0YXRpYyB2b2lkIHVwZGF0ZUxpc3RCb3hTZWxlY3Rpb24oU2Vs
ZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgYm9vbCBkZXNlbGVjdE90aGVyT3B0aW9ucyk7Cisg
ICAgc3RhdGljIHZvaWQgbGlzdEJveE9uQ2hhbmdlKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVu
dCopOworICAgIHN0YXRpYyB2b2lkIG1lbnVMaXN0T25DaGFuZ2UoU2VsZWN0RWxlbWVudERhdGEm
LCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2Nyb2xsVG9TZWxlY3Rpb24oU2VsZWN0RWxl
bWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgcmVjYWxjU3R5bGUoU2VsZWN0
RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2V0UmVjYWxjTGlzdEl0
ZW1zKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCopOworICAgIHN0YXRpYyB2b2lkIHJlY2Fs
Y0xpc3RJdGVtcyhTZWxlY3RFbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqLCBib29sIHVwZGF0
ZVNlbGVjdGVkU3RhdGVzID0gdHJ1ZSk7CisgICAgc3RhdGljIGludCBzZWxlY3RlZEluZGV4KGNv
bnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCopOworICAgIHN0YXRpYyB2b2lk
IHNldFNlbGVjdGVkSW5kZXgoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgaW50IG9wdGlv
bkluZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1ZSwgYm9vbCBmaXJlT25DaGFuZ2UgPSBmYWxzZSk7
CisgICAgc3RhdGljIGludCBvcHRpb25Ub0xpc3RJbmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0
YSYsIGNvbnN0IEVsZW1lbnQqLCBpbnQgb3B0aW9uSW5kZXgpOworICAgIHN0YXRpYyBpbnQgbGlz
dFRvT3B0aW9uSW5kZXgoY29uc3QgU2VsZWN0RWxlbWVudERhdGEmLCBjb25zdCBFbGVtZW50Kiwg
aW50IGxpc3RJbmRleCk7CisgICAgc3RhdGljIHZvaWQgZGlzcGF0Y2hGb2N1c0V2ZW50KFNlbGVj
dEVsZW1lbnREYXRhJiwgRWxlbWVudCopOworICAgIHN0YXRpYyB2b2lkIGRpc3BhdGNoQmx1ckV2
ZW50KFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCopOworICAgIHN0YXRpYyB2b2lkIGRlc2Vs
ZWN0SXRlbXMoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgRWxlbWVudCogZXhjbHVkZUVs
ZW1lbnQgPSAwKTsKKyAgICBzdGF0aWMgYm9vbCBzYXZlRm9ybUNvbnRyb2xTdGF0ZShjb25zdCBT
ZWxlY3RFbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqLCBTdHJpbmcmIHZhbHVlKTsKKyAgICBz
dGF0aWMgdm9pZCByZXN0b3JlRm9ybUNvbnRyb2xTdGF0ZShTZWxlY3RFbGVtZW50RGF0YSYsIEVs
ZW1lbnQqLCBjb25zdCBTdHJpbmcmIHN0YXRlKTsKKyAgICBzdGF0aWMgdm9pZCBwYXJzZU11bHRp
cGxlQXR0cmlidXRlKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIE1hcHBlZEF0dHJpYnV0
ZSopOworICAgIHN0YXRpYyBib29sIGFwcGVuZEZvcm1EYXRhKFNlbGVjdEVsZW1lbnREYXRhJiwg
RWxlbWVudCosIEZvcm1EYXRhTGlzdCYgbGlzdCk7CisgICAgc3RhdGljIHZvaWQgcmVzZXQoU2Vs
ZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgZGVmYXVsdEV2ZW50
SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBFdmVudCosIEhUTUxGb3JtRWxl
bWVudCogaHRtbEZvcm0gPSAwKTsKKyAgICBzdGF0aWMgaW50IGxhc3RTZWxlY3RlZExpc3RJbmRl
eChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqKTsKKyAgICBzdGF0aWMg
dm9pZCB0eXBlQWhlYWRGaW5kKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIEtleWJvYXJk
RXZlbnQqKTsKKyAgICBzdGF0aWMgdm9pZCBpbnNlcnRlZEludG9UcmVlKFNlbGVjdEVsZW1lbnRE
YXRhJiwgRWxlbWVudCopOworCitwcml2YXRlOgorICAgIHN0YXRpYyB2b2lkIG1lbnVMaXN0RGVm
YXVsdEV2ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBFdmVudCosIEhU
TUxGb3JtRWxlbWVudCopOworICAgIHN0YXRpYyB2b2lkIGxpc3RCb3hEZWZhdWx0RXZlbnRIYW5k
bGVyKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIEV2ZW50KiwgSFRNTEZvcm1FbGVtZW50
Kik7Cit9OworCisvLyBIVE1ML1dNTFNlbGVjdEVsZW1lbnQgaG9sZCB0aGlzIHN0cnVjdCBhcyBt
ZW1iZXIgdmFyaWFibGUKKy8vIGFuZCBwYXNzIGl0IHRvIHRoZSBzdGF0aWMgaGVscGVyIGZ1bmN0
aW9ucyBpbiBTZWxlY3RFbGVtZW50CitjbGFzcyBTZWxlY3RFbGVtZW50RGF0YSB7CitwdWJsaWM6
CisgICAgU2VsZWN0RWxlbWVudERhdGEoKTsKKyAgICB+U2VsZWN0RWxlbWVudERhdGEoKTsKKwor
ICAgIGJvb2wgbXVsdGlwbGUoKSBjb25zdCB7IHJldHVybiBtX211bHRpcGxlOyB9CisgICAgdm9p
ZCBzZXRNdWx0aXBsZShib29sIHZhbHVlKSB7IG1fbXVsdGlwbGUgPSB2YWx1ZTsgfQorCisgICAg
aW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKyAgICB2b2lkIHNldFNpemUoaW50
IHZhbHVlKSB7IG1fc2l6ZSA9IHZhbHVlOyB9CisKKyAgICBib29sIHVzZXNNZW51TGlzdCgpIGNv
bnN0IHsgcmV0dXJuICFtX211bHRpcGxlICYmIG1fc2l6ZSA8PSAxOyB9CisKKyAgICBpbnQgbGFz
dE9uQ2hhbmdlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2xhc3RPbkNoYW5nZUluZGV4OyB9Cisg
ICAgdm9pZCBzZXRMYXN0T25DaGFuZ2VJbmRleChpbnQgdmFsdWUpIHsgbV9sYXN0T25DaGFuZ2VJ
bmRleCA9IHZhbHVlOyB9CisKKyAgICBWZWN0b3I8Ym9vbD4mIGxhc3RPbkNoYW5nZVNlbGVjdGlv
bigpIHsgcmV0dXJuIG1fbGFzdE9uQ2hhbmdlU2VsZWN0aW9uOyB9CisKKyAgICBib29sIGFjdGl2
ZVNlbGVjdGlvblN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9hY3RpdmVTZWxlY3Rpb25TdGF0ZTsg
fQorICAgIHZvaWQgc2V0QWN0aXZlU2VsZWN0aW9uU3RhdGUoYm9vbCB2YWx1ZSkgeyBtX2FjdGl2
ZVNlbGVjdGlvblN0YXRlID0gdmFsdWU7IH0KKworICAgIGludCBhY3RpdmVTZWxlY3Rpb25BbmNo
b3JJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXg7IH0K
KyAgICB2b2lkIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGludCB2YWx1ZSkgeyBtX2Fj
dGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4ID0gdmFsdWU7IH0KKworICAgIGludCBhY3RpdmVTZWxl
Y3Rpb25FbmRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXg7
IH0KKyAgICB2b2lkIHNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGludCB2YWx1ZSkgeyBtX2Fj
dGl2ZVNlbGVjdGlvbkVuZEluZGV4ID0gdmFsdWU7IH0KKworICAgIFZlY3Rvcjxib29sPiYgY2Fj
aGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24oKSB7IHJldHVybiBtX2NhY2hlZFN0YXRlRm9yQWN0
aXZlU2VsZWN0aW9uOyB9CisKKyAgICBib29sIHNob3VsZFJlY2FsY0xpc3RJdGVtcygpIGNvbnN0
IHsgcmV0dXJuIG1fcmVjYWxjTGlzdEl0ZW1zOyB9CisgICAgdm9pZCBzZXRTaG91bGRSZWNhbGNM
aXN0SXRlbXMoYm9vbCB2YWx1ZSkgeyBtX3JlY2FsY0xpc3RJdGVtcyA9IHZhbHVlOyB9CisKKyAg
ICBWZWN0b3I8RWxlbWVudCo+JiByYXdMaXN0SXRlbXMoKSB7IHJldHVybiBtX2xpc3RJdGVtczsg
fQorICAgIFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcyhjb25zdCBFbGVtZW50Kik7CisgICAg
Y29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zKGNvbnN0IEVsZW1lbnQqKSBjb25zdDsK
KworICAgIFVDaGFyIHJlcGVhdGluZ0NoYXIoKSBjb25zdCB7IHJldHVybiBtX3JlcGVhdGluZ0No
YXI7IH0KKyAgICB2b2lkIHNldFJlcGVhdGluZ0NoYXIoY29uc3QgVUNoYXImIHZhbHVlKSB7IG1f
cmVwZWF0aW5nQ2hhciA9IHZhbHVlOyB9CisKKyAgICBET01UaW1lU3RhbXAgbGFzdENoYXJUaW1l
KCkgY29uc3QgeyByZXR1cm4gbV9sYXN0Q2hhclRpbWU7IH0KKyAgICB2b2lkIHNldExhc3RDaGFy
VGltZShjb25zdCBET01UaW1lU3RhbXAmIHZhbHVlKSB7IG1fbGFzdENoYXJUaW1lID0gdmFsdWU7
IH0KKworICAgIFN0cmluZyYgdHlwZWRTdHJpbmcoKSB7IHJldHVybiBtX3R5cGVkU3RyaW5nOyB9
CisgICAgdm9pZCBzZXRUeXBlZFN0cmluZyhjb25zdCBTdHJpbmcmIHZhbHVlKSB7IG1fdHlwZWRT
dHJpbmcgPSB2YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHZvaWQgY2hlY2tMaXN0SXRlbXMoY29u
c3QgRWxlbWVudCopIGNvbnN0OworCisgICAgYm9vbCBtX211bHRpcGxlOworICAgIGludCBtX3Np
emU7CisKKyAgICBpbnQgbV9sYXN0T25DaGFuZ2VJbmRleDsKKyAgICBWZWN0b3I8Ym9vbD4gbV9s
YXN0T25DaGFuZ2VTZWxlY3Rpb247CisKKyAgICBib29sIG1fYWN0aXZlU2VsZWN0aW9uU3RhdGU7
CisgICAgaW50IG1fYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXg7CisgICAgaW50IG1fYWN0aXZl
U2VsZWN0aW9uRW5kSW5kZXg7CisgICAgVmVjdG9yPGJvb2w+IG1fY2FjaGVkU3RhdGVGb3JBY3Rp
dmVTZWxlY3Rpb247CisKKyAgICBib29sIG1fcmVjYWxjTGlzdEl0ZW1zOworICAgIFZlY3RvcjxF
bGVtZW50Kj4gbV9saXN0SXRlbXM7CisKKyAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMgZm9yIHR5
cGUtYWhlYWQgZmluZAorICAgIFVDaGFyIG1fcmVwZWF0aW5nQ2hhcjsKKyAgICBET01UaW1lU3Rh
bXAgbV9sYXN0Q2hhclRpbWU7CisgICAgU3RyaW5nIG1fdHlwZWRTdHJpbmc7CiB9OwogCiBTZWxl
Y3RFbGVtZW50KiB0b1NlbGVjdEVsZW1lbnQoRWxlbWVudCopOwpJbmRleDogaHRtbC9IVE1MT3B0
aW9uRWxlbWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwvSFRNTE9wdGlvbkVsZW1lbnQuaAkocmV2
aXNpb24gNDQyMjYpCisrKyBodG1sL0hUTUxPcHRpb25FbGVtZW50LmgJKHdvcmtpbmcgY29weSkK
QEAgLTUwLDcgKzUwLDcgQEAgcHVibGljOgogICAgIAogICAgIHZpcnR1YWwgY29uc3QgQXRvbWlj
U3RyaW5nJiBmb3JtQ29udHJvbFR5cGUoKSBjb25zdDsKIAotICAgIFN0cmluZyB0ZXh0KCkgY29u
c3Q7CisgICAgdmlydHVhbCBTdHJpbmcgdGV4dCgpIGNvbnN0OwogICAgIHZvaWQgc2V0VGV4dChj
b25zdCBTdHJpbmcmLCBFeGNlcHRpb25Db2RlJik7CiAKICAgICBpbnQgaW5kZXgoKSBjb25zdDsK
SW5kZXg6IGh0bWwvSFRNTFNlbGVjdEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwvSFRN
TFNlbGVjdEVsZW1lbnQuY3BwCShyZXZpc2lvbiA0NDIyNikKKysrIGh0bWwvSFRNTFNlbGVjdEVs
ZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSwxNiArMjksMTEgQEAKICNpbmNsdWRlICJB
WE9iamVjdENhY2hlLmgiCiAjaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgogI2luY2x1ZGUg
IkNTU1N0eWxlU2VsZWN0b3IuaCIKLSNpbmNsdWRlICJDaGFyYWN0ZXJOYW1lcy5oIgotI2luY2x1
ZGUgIkNocm9tZUNsaWVudC5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiRXZl
bnQuaCIKLSNpbmNsdWRlICJFdmVudEhhbmRsZXIuaCIKICNpbmNsdWRlICJFdmVudE5hbWVzLmgi
CiAjaW5jbHVkZSAiRm9ybURhdGFMaXN0LmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRl
ICJGcmFtZUxvYWRlci5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVyQ2xpZW50LmgiCiAjaW5jbHVk
ZSAiSFRNTEZvcm1FbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAi
SFRNTE9wdGlvbkVsZW1lbnQuaCIKQEAgLTU0LDM3ICs0OSwxOCBAQAogI2luY2x1ZGUgPHd0Zi9T
dGRMaWJFeHRyYXMuaD4KICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAKLSNpZiBQTEFURk9STShN
QUMpCi0jZGVmaW5lIEFSUk9XX0tFWVNfUE9QX01FTlUgMQotI2Vsc2UKLSNkZWZpbmUgQVJST1df
S0VZU19QT1BfTUVOVSAwCi0jZW5kaWYKLQogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5h
bWVzcGFjZSBXVEY7Ci11c2luZyBuYW1lc3BhY2UgVW5pY29kZTsKIAogbmFtZXNwYWNlIFdlYkNv
cmUgewogCiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi1zdGF0aWMgY29uc3QgRE9NVGlt
ZVN0YW1wIHR5cGVBaGVhZFRpbWVvdXQgPSAxMDAwOwotCiAvLyBVcHBlciBsaW1pdCBhZ3JlZWQg
dXBvbiB3aXRoIHJlcHJlc2VudGF0aXZlcyBvZiBPcGVyYSBhbmQgTW96aWxsYS4KIHN0YXRpYyBj
b25zdCB1bnNpZ25lZCBtYXhTZWxlY3RJdGVtcyA9IDEwMDAwOwogCiBIVE1MU2VsZWN0RWxlbWVu
dDo6SFRNTFNlbGVjdEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1l
bnQqIGRvYywgSFRNTEZvcm1FbGVtZW50KiBmKQogICAgIDogSFRNTEZvcm1Db250cm9sRWxlbWVu
dFdpdGhTdGF0ZSh0YWdOYW1lLCBkb2MsIGYpCiAgICAgLCBtX21pbndpZHRoKDApCi0gICAgLCBt
X3NpemUoMCkKLSAgICAsIG1fbXVsdGlwbGUoZmFsc2UpCi0gICAgLCBtX3JlY2FsY0xpc3RJdGVt
cyhmYWxzZSkKLSAgICAsIG1fbGFzdE9uQ2hhbmdlSW5kZXgoLTEpCi0gICAgLCBtX2FjdGl2ZVNl
bGVjdGlvbkFuY2hvckluZGV4KC0xKQotICAgICwgbV9hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgt
MSkKLSAgICAsIG1fYWN0aXZlU2VsZWN0aW9uU3RhdGUoZmFsc2UpCi0gICAgLCBtX3JlcGVhdGlu
Z0NoYXIoMCkKLSAgICAsIG1fbGFzdENoYXJUaW1lKDApCiB7CiAgICAgQVNTRVJUKGhhc1RhZ05h
bWUoc2VsZWN0VGFnKSB8fCBoYXNUYWdOYW1lKGtleWdlblRhZykpOwogfQpAQCAtOTYsMTE1ICs3
Miw0NiBAQCBib29sIEhUTUxTZWxlY3RFbGVtZW50OjpjaGVja0RURChjb25zdCBOCiAgICAgICAg
ICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlwdFRhZyk7CiB9CiAKLXZvaWQgSFRNTFNlbGVj
dEVsZW1lbnQ6OnJlY2FsY1N0eWxlKFN0eWxlQ2hhbmdlIGNoKQordm9pZCBIVE1MU2VsZWN0RWxl
bWVudDo6cmVjYWxjU3R5bGUoU3R5bGVDaGFuZ2UgY2hhbmdlKQogewotICAgIGlmIChjaGlsZE5l
ZWRzU3R5bGVSZWNhbGMoKSAmJiByZW5kZXJlcigpKSB7Ci0gICAgICAgIGlmICh1c2VzTWVudUxp
c3QoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlck1lbnVMaXN0Kj4ocmVuZGVyZXIo
KSktPnNldE9wdGlvbnNDaGFuZ2VkKHRydWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBz
dGF0aWNfY2FzdDxSZW5kZXJMaXN0Qm94Kj4ocmVuZGVyZXIoKSktPnNldE9wdGlvbnNDaGFuZ2Vk
KHRydWUpOwotICAgIH0gZWxzZSBpZiAobV9yZWNhbGNMaXN0SXRlbXMpCi0gICAgICAgIHJlY2Fs
Y0xpc3RJdGVtcygpOwotCi0gICAgSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZTo6cmVj
YWxjU3R5bGUoY2gpOworICAgIFNlbGVjdEVsZW1lbnQ6OnJlY2FsY1N0eWxlKG1fZGF0YSwgdGhp
cyk7CisgICAgSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZTo6cmVjYWxjU3R5bGUoY2hh
bmdlKTsKIH0KIAogY29uc3QgQXRvbWljU3RyaW5nJiBIVE1MU2VsZWN0RWxlbWVudDo6Zm9ybUNv
bnRyb2xUeXBlKCkgY29uc3QKIHsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IEF0b21p
Y1N0cmluZywgc2VsZWN0TXVsdGlwbGUsICgic2VsZWN0LW11bHRpcGxlIikpOwogICAgIERFRklO
RV9TVEFUSUNfTE9DQUwoY29uc3QgQXRvbWljU3RyaW5nLCBzZWxlY3RPbmUsICgic2VsZWN0LW9u
ZSIpKTsKLSAgICByZXR1cm4gbV9tdWx0aXBsZSA/IHNlbGVjdE11bHRpcGxlIDogc2VsZWN0T25l
OworICAgIHJldHVybiBtX2RhdGEubXVsdGlwbGUoKSA/IHNlbGVjdE11bHRpcGxlIDogc2VsZWN0
T25lOwogfQogCiBpbnQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNlbGVjdGVkSW5kZXgoKSBjb25zdAog
ewotICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBvcHRpb24gc2VsZWN0ZWQK
LSAgICB1bnNpZ25lZCBpbmRleCA9IDA7Ci0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRl
bXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGl0ZW1z
LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlv
blRhZykpIHsKLSAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+
KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0g
ICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0K
LQotaW50IEhUTUxTZWxlY3RFbGVtZW50OjpsYXN0U2VsZWN0ZWRMaXN0SW5kZXgoKSBjb25zdAot
ewotICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBsYXN0IG9wdGlvbiBzZWxlY3RlZAot
ICAgIHVuc2lnbmVkIGluZGV4ID0gMDsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgY29u
c3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBmb3IgKHVuc2ln
bmVkIGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVt
c1tpXS0+aGFzTG9jYWxOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgIGlmIChzdGF0aWNf
Y2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkgewotICAgICAg
ICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZvdW5kID8gKGludCkgaW5k
ZXggOiAtMTsKKyAgICByZXR1cm4gU2VsZWN0RWxlbWVudDo6c2VsZWN0ZWRJbmRleChtX2RhdGEs
IHRoaXMpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkZXNlbGVjdEl0ZW1zKEhUTUxP
cHRpb25FbGVtZW50KiBleGNsdWRlRWxlbWVudCkKIHsKLSAgICBjb25zdCBWZWN0b3I8RWxlbWVu
dCo+JiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIHVuc2lnbmVkIGk7Ci0gICAgZm9yIChpID0g
MDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9j
YWxOYW1lKG9wdGlvblRhZykgJiYgKGl0ZW1zW2ldICE9IGV4Y2x1ZGVFbGVtZW50KSkgewotICAg
ICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0
aW9uRWxlbWVudCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIGVsZW1lbnQtPnNldFNlbGVjdGVk
U3RhdGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQorICAgIFNlbGVjdEVsZW1lbnQ6OmRlc2Vs
ZWN0SXRlbXMobV9kYXRhLCB0aGlzLCBleGNsdWRlRWxlbWVudCk7CiB9CiAKIHZvaWQgSFRNTFNl
bGVjdEVsZW1lbnQ6OnNldFNlbGVjdGVkSW5kZXgoaW50IG9wdGlvbkluZGV4LCBib29sIGRlc2Vs
ZWN0LCBib29sIGZpcmVPbkNoYW5nZSkKIHsKLSAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBp
dGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRl
eChvcHRpb25JbmRleCk7Ci0gICAgSFRNTE9wdGlvbkVsZW1lbnQqIGVsZW1lbnQgPSAwOwotICAg
IGlmICghbXVsdGlwbGUoKSkKLSAgICAgICAgZGVzZWxlY3QgPSB0cnVlOwotICAgIGlmIChsaXN0
SW5kZXggPj0gMCAmJiBpdGVtc1tsaXN0SW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkg
ewotICAgICAgICBpZiAobV9hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCA8IDAgfHwgZGVzZWxl
Y3QpCi0gICAgICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChsaXN0SW5kZXgp
OwotICAgICAgICBpZiAobV9hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCA8IDAgfHwgZGVzZWxlY3Qp
Ci0gICAgICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChsaXN0SW5kZXgpOwotICAg
ICAgICBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihpdGVtc1tsaXN0
SW5kZXhdKTsKLSAgICAgICAgZWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKLSAgICB9
Ci0gICAgaWYgKGRlc2VsZWN0KQotICAgICAgICBkZXNlbGVjdEl0ZW1zKGVsZW1lbnQpOwotCi0g
ICAgLy8gRm9yIHRoZSBtZW51IGxpc3QgY2FzZSwgdGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBzZWxl
Y3RlZCBlbGVtZW50IGFwcGVhci4KLSAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgcmVuZGVy
ZXIoKS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLQotICAgIHNjcm9sbFRvU2VsZWN0aW9uKCk7Ci0K
LSAgICAvLyBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgd2l0aCBmaXJlT25DaGFuZ2UgZm9yIG1lbnUg
bGlzdHMuIAotICAgIGlmIChmaXJlT25DaGFuZ2UgJiYgdXNlc01lbnVMaXN0KCkpCi0gICAgICAg
IG1lbnVMaXN0T25DaGFuZ2UoKTsKLQotICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50KCktPmZy
YW1lKCk7Ci0gICAgaWYgKGZyYW1lKQotICAgICAgICBmcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+
Y2xpZW50KCktPmZvcm1TdGF0ZURpZENoYW5nZSh0aGlzKTsKKyAgICBTZWxlY3RFbGVtZW50Ojpz
ZXRTZWxlY3RlZEluZGV4KG1fZGF0YSwgdGhpcywgb3B0aW9uSW5kZXgsIGRlc2VsZWN0LCBmaXJl
T25DaGFuZ2UpOwogfQogCiBpbnQgSFRNTFNlbGVjdEVsZW1lbnQ6OmFjdGl2ZVNlbGVjdGlvblN0
YXJ0TGlzdEluZGV4KCkgY29uc3QKIHsKLSAgICBpZiAobV9hY3RpdmVTZWxlY3Rpb25BbmNob3JJ
bmRleCA+PSAwKQotICAgICAgICByZXR1cm4gbV9hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleDsK
KyAgICBpZiAobV9kYXRhLmFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KCkgPj0gMCkKKyAgICAg
ICAgcmV0dXJuIG1fZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpOwogICAgIHJldHVy
biBvcHRpb25Ub0xpc3RJbmRleChzZWxlY3RlZEluZGV4KCkpOwogfQogCiBpbnQgSFRNTFNlbGVj
dEVsZW1lbnQ6OmFjdGl2ZVNlbGVjdGlvbkVuZExpc3RJbmRleCgpIGNvbnN0CiB7Ci0gICAgaWYg
KG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXggPj0gMCkKLSAgICAgICAgcmV0dXJuIG1fYWN0aXZl
U2VsZWN0aW9uRW5kSW5kZXg7Ci0gICAgcmV0dXJuIGxhc3RTZWxlY3RlZExpc3RJbmRleCgpOwor
ICAgIGlmIChtX2RhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSA+PSAwKQorICAgICAgICBy
ZXR1cm4gbV9kYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCk7CisgICAgcmV0dXJuIFNlbGVj
dEVsZW1lbnQ6Omxhc3RTZWxlY3RlZExpc3RJbmRleChtX2RhdGEsIHRoaXMpOwogfQogCiB1bnNp
Z25lZCBIVE1MU2VsZWN0RWxlbWVudDo6bGVuZ3RoKCkgY29uc3QKQEAgLTI3MywzNiArMTgwLDE5
IEBAIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNldFZhbHVlKGNvbnN0IFMKIAogYm9vbCBIVE1M
U2VsZWN0RWxlbWVudDo6c2F2ZUZvcm1Db250cm9sU3RhdGUoU3RyaW5nJiB2YWx1ZSkgY29uc3QK
IHsKLSAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAg
IGludCBsID0gaXRlbXMuc2l6ZSgpOwotICAgIFZlY3RvcjxjaGFyLCAxMDI0PiBjaGFyYWN0ZXJz
KGwpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbDsgKytpKSB7Ci0gICAgICAgIEVsZW1lbnQq
IGUgPSBpdGVtc1tpXTsKLSAgICAgICAgYm9vbCBzZWxlY3RlZCA9IGUtPmhhc0xvY2FsTmFtZShv
cHRpb25UYWcpICYmIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4oZSktPnNlbGVjdGVk
KCk7Ci0gICAgICAgIGNoYXJhY3RlcnNbaV0gPSBzZWxlY3RlZCA/ICdYJyA6ICcuJzsKLSAgICB9
Ci0gICAgdmFsdWUgPSBTdHJpbmcoY2hhcmFjdGVycy5kYXRhKCksIGwpOwotICAgIHJldHVybiB0
cnVlOworICAgIHJldHVybiBTZWxlY3RFbGVtZW50OjpzYXZlRm9ybUNvbnRyb2xTdGF0ZShtX2Rh
dGEsIHRoaXMsIHZhbHVlKTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6cmVzdG9yZUZv
cm1Db250cm9sU3RhdGUoY29uc3QgU3RyaW5nJiBzdGF0ZSkKIHsKLSAgICByZWNhbGNMaXN0SXRl
bXMoKTsKLSAgICAKLSAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGxpc3RJdGVt
cygpOwotICAgIGludCBsID0gaXRlbXMuc2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
bDsgaSsrKQotICAgICAgICBpZiAoaXRlbXNbaV0tPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKQot
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihpdGVtc1tpXSktPnNl
dFNlbGVjdGVkU3RhdGUoc3RhdGVbaV0gPT0gJ1gnKTsKLSAgICAgICAgICAgIAotICAgIHNldE5l
ZWRzU3R5bGVSZWNhbGMoKTsKKyAgICBTZWxlY3RFbGVtZW50OjpyZXN0b3JlRm9ybUNvbnRyb2xT
dGF0ZShtX2RhdGEsIHRoaXMsIHN0YXRlKTsKIH0KIAotdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICphdHRyKQordm9pZCBIVE1MU2Vs
ZWN0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKiBhdHRyKSAK
IHsKLSAgICBib29sIG9sZFVzZXNNZW51TGlzdCA9IHVzZXNNZW51TGlzdCgpOworICAgIGJvb2wg
b2xkVXNlc01lbnVMaXN0ID0gbV9kYXRhLnVzZXNNZW51TGlzdCgpOwogICAgIGlmIChhdHRyLT5u
YW1lKCkgPT0gc2l6ZUF0dHIpIHsKLSAgICAgICAgaW50IG9sZFNpemUgPSBtX3NpemU7CisgICAg
ICAgIGludCBvbGRTaXplID0gbV9kYXRhLnNpemUoKTsKICAgICAgICAgLy8gU2V0IHRoZSBhdHRy
aWJ1dGUgdmFsdWUgdG8gYSBudW1iZXIuCiAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IHNp
bmNlIHRoZSBzdHlsZSBydWxlcyBmb3IgdGhpcyBhdHRyaWJ1dGUgY2FuIGRldGVybWluZSB0aGUg
YXBwZWFyYW5jZSBwcm9wZXJ0eS4KICAgICAgICAgaW50IHNpemUgPSBhdHRyLT52YWx1ZSgpLnRv
SW50KCk7CkBAIC0zMTAsMjEgKzIwMCwxNyBAQCB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpwYXJz
ZU1hcHBlZEF0dHJpCiAgICAgICAgIGlmIChhdHRyU2l6ZSAhPSBhdHRyLT52YWx1ZSgpKQogICAg
ICAgICAgICAgYXR0ci0+c2V0VmFsdWUoYXR0clNpemUpOwogCi0gICAgICAgIG1fc2l6ZSA9IG1h
eChzaXplLCAxKTsKLSAgICAgICAgaWYgKChvbGRVc2VzTWVudUxpc3QgIT0gdXNlc01lbnVMaXN0
KCkgfHwgKCFvbGRVc2VzTWVudUxpc3QgJiYgbV9zaXplICE9IG9sZFNpemUpKSAmJiBhdHRhY2hl
ZCgpKSB7CisgICAgICAgIG1fZGF0YS5zZXRTaXplKG1heChzaXplLCAxKSk7CisgICAgICAgIGlm
ICgob2xkVXNlc01lbnVMaXN0ICE9IG1fZGF0YS51c2VzTWVudUxpc3QoKSB8fCAoIW9sZFVzZXNN
ZW51TGlzdCAmJiBtX2RhdGEuc2l6ZSgpICE9IG9sZFNpemUpKSAmJiBhdHRhY2hlZCgpKSB7CiAg
ICAgICAgICAgICBkZXRhY2goKTsKICAgICAgICAgICAgIGF0dGFjaCgpOwogICAgICAgICAgICAg
c2V0UmVjYWxjTGlzdEl0ZW1zKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSB3aWR0aEF0dHIpIHsKICAgICAgICAgbV9taW53aWR0aCA9IG1heChhdHRyLT52YWx1
ZSgpLnRvSW50KCksIDApOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG11bHRpcGxl
QXR0cikgewotICAgICAgICBtX211bHRpcGxlID0gKCFhdHRyLT5pc051bGwoKSk7Ci0gICAgICAg
IGlmIChvbGRVc2VzTWVudUxpc3QgIT0gdXNlc01lbnVMaXN0KCkgJiYgYXR0YWNoZWQoKSkgewot
ICAgICAgICAgICAgZGV0YWNoKCk7Ci0gICAgICAgICAgICBhdHRhY2goKTsKLSAgICAgICAgfQot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFjY2Vzc2tleUF0dHIpIHsKKyAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtdWx0aXBsZUF0dHIpCisgICAgICAgIFNlbGVjdEVsZW1l
bnQ6OnBhcnNlTXVsdGlwbGVBdHRyaWJ1dGUobV9kYXRhLCB0aGlzLCBhdHRyKTsKKyAgICBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gYWNjZXNza2V5QXR0cikgewogICAgICAgICAvLyBGSVhNRTog
aWdub3JlIGZvciB0aGUgbW9tZW50CiAgICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWxp
Z25BdHRyKSB7CiAgICAgICAgIC8vIERvbid0IG1hcCAnYWxpZ24nIGF0dHJpYnV0ZS4gIFRoaXMg
bWF0Y2hlcyB3aGF0IEZpcmVmb3gsIE9wZXJhIGFuZCBJRSBkby4KQEAgLTM1NSw5OCArMjQxLDM0
IEBAIGJvb2wgSFRNTFNlbGVjdEVsZW1lbnQ6OmlzTW91c2VGb2N1c2FibGUKIAogYm9vbCBIVE1M
U2VsZWN0RWxlbWVudDo6Y2FuU2VsZWN0QWxsKCkgY29uc3QKIHsKLSAgICByZXR1cm4gIXVzZXNN
ZW51TGlzdCgpOyAKKyAgICByZXR1cm4gIW1fZGF0YS51c2VzTWVudUxpc3QoKTsgCiB9CiAKIHZv
aWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNlbGVjdEFsbCgpCiB7Ci0gICAgQVNTRVJUKCF1c2VzTWVu
dUxpc3QoKSk7Ci0gICAgaWYgKCFyZW5kZXJlcigpIHx8ICFtdWx0aXBsZSgpKQotICAgICAgICBy
ZXR1cm47Ci0gICAgCi0gICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21w
YXJlZCB0byB0aGUgbmV3IHNlbGVjdEFsbCBzZWxlY3Rpb24gd2hlbiBkaXNwYXRjaGluZyBjaGFu
Z2UgZXZlbnRzCi0gICAgc2F2ZUxhc3RTZWxlY3Rpb24oKTsKLSAgICAKLSAgICBtX2FjdGl2ZVNl
bGVjdGlvblN0YXRlID0gdHJ1ZTsKLSAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChu
ZXh0U2VsZWN0YWJsZUxpc3RJbmRleCgtMSkpOwotICAgIHNldEFjdGl2ZVNlbGVjdGlvbkVuZElu
ZGV4KHByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleCgtMSkpOwotICAgIAotICAgIHVwZGF0ZUxp
c3RCb3hTZWxlY3Rpb24oZmFsc2UpOwotICAgIGxpc3RCb3hPbkNoYW5nZSgpOworICAgIFNlbGVj
dEVsZW1lbnQ6OnNlbGVjdEFsbChtX2RhdGEsIHRoaXMpOwogfQogCiBSZW5kZXJPYmplY3QqIEhU
TUxTZWxlY3RFbGVtZW50OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRl
clN0eWxlKikKIHsKLSAgICBpZiAodXNlc01lbnVMaXN0KCkpCisgICAgaWYgKG1fZGF0YS51c2Vz
TWVudUxpc3QoKSkKICAgICAgICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlck1lbnVMaXN0KHRo
aXMpOwogICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJMaXN0Qm94KHRoaXMpOwogfQogCiBi
b29sIEhUTUxTZWxlY3RFbGVtZW50OjphcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGxpc3Qs
IGJvb2wpCiB7Ci0gICAgaWYgKG5hbWUoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIGJvb2wgc3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgIGNvbnN0IFZlY3RvcjxFbGVt
ZW50Kj4mIGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0KLSAgICB1bnNpZ25lZCBpOwotICAgIGZvciAo
aSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0tPmhh
c0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudCAq
b3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihpdGVtc1tpXSk7Ci0gICAg
ICAgICAgICBpZiAob3B0aW9uLT5zZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5h
cHBlbmREYXRhKG5hbWUoKSwgb3B0aW9uLT52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBzdWNj
ZXNzZnVsID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8v
ICMjIyB0aGlzIGNhc2Ugc2hvdWxkIG5vdCBoYXBwZW4uIG1ha2Ugc3VyZSB0aGF0IHdlIHNlbGVj
dCB0aGUgZmlyc3Qgb3B0aW9uCi0gICAgLy8gaW4gYW55IGNhc2UuIG90aGVyd2lzZSB3ZSBoYXZl
IG5vIGNvbnNpc3RlbmN5IHdpdGggdGhlIERPTSBpbnRlcmZhY2UuIEZJWE1FIQotICAgIC8vIHdl
IHJldHVybiB0aGUgZmlyc3Qgb25lIGlmIGl0IHdhcyBhIGNvbWJvYm94IHNlbGVjdAotICAgIGlm
ICghc3VjY2Vzc2Z1bCAmJiAhbV9tdWx0aXBsZSAmJiBtX3NpemUgPD0gMSAmJiBpdGVtcy5zaXpl
KCkgJiYKLSAgICAgICAgKGl0ZW1zWzBdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkpIHsKLSAg
ICAgICAgSFRNTE9wdGlvbkVsZW1lbnQgKm9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25F
bGVtZW50Kj4oaXRlbXNbMF0pOwotICAgICAgICBpZiAob3B0aW9uLT52YWx1ZSgpLmlzTnVsbCgp
KQotICAgICAgICAgICAgbGlzdC5hcHBlbmREYXRhKG5hbWUoKSwgb3B0aW9uLT50ZXh0KCkuc3Ry
aXBXaGl0ZVNwYWNlKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsaXN0LmFwcGVuZERh
dGEobmFtZSgpLCBvcHRpb24tPnZhbHVlKCkpOwotICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsK
LSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2Vzc2Z1bDsKKyAgICByZXR1cm4gU2VsZWN0RWxlbWVu
dDo6YXBwZW5kRm9ybURhdGEobV9kYXRhLCB0aGlzLCBsaXN0KTsKIH0KIAogaW50IEhUTUxTZWxl
Y3RFbGVtZW50OjpvcHRpb25Ub0xpc3RJbmRleChpbnQgb3B0aW9uSW5kZXgpIGNvbnN0CiB7Ci0g
ICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBpbnQg
bGlzdFNpemUgPSAoaW50KWl0ZW1zLnNpemUoKTsKLSAgICBpZiAob3B0aW9uSW5kZXggPCAwIHx8
IG9wdGlvbkluZGV4ID49IGxpc3RTaXplKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpbnQg
b3B0aW9uSW5kZXgyID0gLTE7Ci0gICAgZm9yIChpbnQgbGlzdEluZGV4ID0gMDsgbGlzdEluZGV4
IDwgbGlzdFNpemU7IGxpc3RJbmRleCsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tsaXN0SW5kZXhd
LT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgb3B0aW9uSW5kZXgyKys7
Ci0gICAgICAgICAgICBpZiAob3B0aW9uSW5kZXgyID09IG9wdGlvbkluZGV4KQotICAgICAgICAg
ICAgICAgIHJldHVybiBsaXN0SW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0x
OworICAgIHJldHVybiBTZWxlY3RFbGVtZW50OjpvcHRpb25Ub0xpc3RJbmRleChtX2RhdGEsIHRo
aXMsIG9wdGlvbkluZGV4KTsKIH0KIAogaW50IEhUTUxTZWxlY3RFbGVtZW50OjpsaXN0VG9PcHRp
b25JbmRleChpbnQgbGlzdEluZGV4KSBjb25zdAogewotICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50
Kj4mIGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaWYgKGxpc3RJbmRleCA8IDAgfHwgbGlzdElu
ZGV4ID49IGludChpdGVtcy5zaXplKCkpIHx8Ci0gICAgICAgICFpdGVtc1tsaXN0SW5kZXhdLT5o
YXNMb2NhbE5hbWUob3B0aW9uVGFnKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaW50IG9w
dGlvbkluZGV4ID0gMDsgLy8gYWN0dWFsIGluZGV4IG9mIG9wdGlvbiBub3QgY291bnRpbmcgT1BU
R1JPVVAgZW50cmllcyB0aGF0IG1heSBiZSBpbiBsaXN0Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkg
PCBsaXN0SW5kZXg7IGkrKykKLSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0
aW9uVGFnKSkKLSAgICAgICAgICAgIG9wdGlvbkluZGV4Kys7Ci0gICAgcmV0dXJuIG9wdGlvbklu
ZGV4OworICAgIHJldHVybiBTZWxlY3RFbGVtZW50OjpsaXN0VG9PcHRpb25JbmRleChtX2RhdGEs
IHRoaXMsIGxpc3RJbmRleCk7CiB9CiAKIFBhc3NSZWZQdHI8SFRNTE9wdGlvbnNDb2xsZWN0aW9u
PiBIVE1MU2VsZWN0RWxlbWVudDo6b3B0aW9ucygpCkBAIC00NTYsNDQgKzI3OCw3IEBAIFBhc3NS
ZWZQdHI8SFRNTE9wdGlvbnNDb2xsZWN0aW9uPiBIVE1MU2UKIAogdm9pZCBIVE1MU2VsZWN0RWxl
bWVudDo6cmVjYWxjTGlzdEl0ZW1zKGJvb2wgdXBkYXRlU2VsZWN0ZWRTdGF0ZXMpIGNvbnN0CiB7
Ci0gICAgbV9saXN0SXRlbXMuY2xlYXIoKTsKLSAgICBIVE1MT3B0aW9uRWxlbWVudCogZm91bmRT
ZWxlY3RlZCA9IDA7Ci0gICAgZm9yIChOb2RlKiBjdXJyZW50ID0gZmlyc3RDaGlsZCgpOyBjdXJy
ZW50OykgewotICAgICAgICAvLyBvcHRncm91cCB0YWdzIG1heSBub3QgbmVzdC4gSG93ZXZlciwg
Ym90aCBGaXJlRm94IGFuZCBJRSB3aWxsCi0gICAgICAgIC8vIGZsYXR0ZW4gdGhlIHRyZWUgYXV0
b21hdGljYWxseSwgc28gd2UgZm9sbG93IHN1aXQuCi0gICAgICAgIC8vIChodHRwOi8vd3d3Lncz
Lm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy42KQotICAgICAgICBpZiAo
Y3VycmVudC0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpIHsKLSAgICAgICAgICAgIG1fbGlzdEl0
ZW1zLmFwcGVuZChzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCo+KGN1cnJlbnQpKTsKLSAgICAgICAg
ICAgIGlmIChjdXJyZW50LT5maXJzdENoaWxkKCkpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50
ID0gY3VycmVudC0+Zmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUo
b3B0aW9uVGFnKSkgewotICAgICAgICAgICAgbV9saXN0SXRlbXMuYXBwZW5kKHN0YXRpY19jYXN0
PEhUTUxFbGVtZW50Kj4oY3VycmVudCkpOwotICAgICAgICAgICAgaWYgKHVwZGF0ZVNlbGVjdGVk
U3RhdGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmb3VuZFNlbGVjdGVkICYmICh1c2VzTWVu
dUxpc3QoKSB8fCAoIW1fbXVsdGlwbGUgJiYgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQq
PihjdXJyZW50KS0+c2VsZWN0ZWQoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kU2Vs
ZWN0ZWQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGN1cnJlbnQpOwotICAgICAg
ICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5zZXRTZWxlY3RlZFN0YXRlKHRydWUpOwotICAg
ICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmRTZWxlY3RlZCAmJiAhbV9tdWx0aXBsZSAmJiBz
dGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGN1cnJlbnQpLT5zZWxlY3RlZCgpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQtPnNldFNlbGVjdGVkU3RhdGUoZmFsc2Up
OwotICAgICAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkID0gc3RhdGljX2Nhc3Q8SFRNTE9w
dGlvbkVsZW1lbnQqPihjdXJyZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUoaHJUYWcpKQotICAg
ICAgICAgICAgbV9saXN0SXRlbXMuYXBwZW5kKHN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4oY3Vy
cmVudCkpOwotCi0gICAgICAgIC8vIEluIGNvbmZvcm1pbmcgSFRNTCBjb2RlLCBvbmx5IDxvcHRn
cm91cD4gYW5kIDxvcHRpb24+IHdpbGwgYmUgZm91bmQKLSAgICAgICAgLy8gd2l0aGluIGEgPHNl
bGVjdD4uIFdlIGNhbGwgdHJhdmVyc2VOZXh0U2libGluZyBzbyB0aGF0IHdlIG9ubHkgc3RlcAot
ICAgICAgICAvLyBpbnRvIHRob3NlIHRhZ3MgdGhhdCB3ZSBjaG9vc2UgdG8uIEZvciB3ZWItY29t
cGF0LCB3ZSBzaG91bGQgY29wZQotICAgICAgICAvLyB3aXRoIHRoZSBjYXNlIHdoZXJlIG9kZCB0
YWdzIGxpa2UgYSA8ZGl2PiBoYXZlIGJlZW4gYWRkZWQgYnV0IHdlCi0gICAgICAgIC8vIGhhbmRs
ZSB0aGlzIGJlY2F1c2Ugc3VjaCB0YWdzIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0
aGUKLSAgICAgICAgLy8gPHNlbGVjdD4ncyBzdWJ0cmVlIGF0IHRoaXMgcG9pbnQuCi0gICAgICAg
IGN1cnJlbnQgPSBjdXJyZW50LT50cmF2ZXJzZU5leHRTaWJsaW5nKHRoaXMpOwotICAgIH0KLSAg
ICBtX3JlY2FsY0xpc3RJdGVtcyA9IGZhbHNlOworICAgIFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xp
c3RJdGVtcyhjb25zdF9jYXN0PFNlbGVjdEVsZW1lbnREYXRhJj4obV9kYXRhKSwgdGhpcywgdXBk
YXRlU2VsZWN0ZWRTdGF0ZXMpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpjaGlsZHJl
bkNoYW5nZWQoYm9vbCBjaGFuZ2VkQnlQYXJzZXIsIE5vZGUqIGJlZm9yZUNoYW5nZSwgTm9kZSog
YWZ0ZXJDaGFuZ2UsIGludCBjaGlsZENvdW50RGVsdGEpCkBAIC01MDcsNDg4ICsyOTIsNjIgQEAg
dm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6Y2hpbGRyZW5DaGFuZ2VkKAogCiB2b2lkIEhUTUxTZWxl
Y3RFbGVtZW50OjpzZXRSZWNhbGNMaXN0SXRlbXMoKQogewotICAgIG1fcmVjYWxjTGlzdEl0ZW1z
ID0gdHJ1ZTsKLSAgICBtX2FjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4ID0gLTE7IC8vIE1hbnVh
bCBzZWxlY3Rpb24gYW5jaG9yIGlzIHJlc2V0IHdoZW4gbWFuaXB1bGF0aW5nIHRoZSBzZWxlY3Qg
cHJvZ3JhbW1hdGljYWxseS4KLSAgICBpZiAocmVuZGVyZXIoKSkgewotICAgICAgICBpZiAodXNl
c01lbnVMaXN0KCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJNZW51TGlzdCo+KHJl
bmRlcmVyKCkpLT5zZXRPcHRpb25zQ2hhbmdlZCh0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGlzdEJveCo+KHJlbmRlcmVyKCkpLT5zZXRPcHRpb25z
Q2hhbmdlZCh0cnVlKTsKLSAgICB9CisgICAgU2VsZWN0RWxlbWVudDo6c2V0UmVjYWxjTGlzdEl0
ZW1zKG1fZGF0YSwgdGhpcyk7CisKICAgICBpZiAoIWluRG9jdW1lbnQoKSkKICAgICAgICAgbV9j
b2xsZWN0aW9uSW5mby5yZXNldCgpOwotICAgIHNldE5lZWRzU3R5bGVSZWNhbGMoKTsKIH0KIAog
dm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6cmVzZXQoKQogewotICAgIGJvb2wgb3B0aW9uU2VsZWN0
ZWQgPSBmYWxzZTsKLSAgICBIVE1MT3B0aW9uRWxlbWVudCogZmlyc3RPcHRpb24gPSAwOwotICAg
IGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgdW5zaWdu
ZWQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAg
aWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgSFRN
TE9wdGlvbkVsZW1lbnQgKm9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4o
aXRlbXNbaV0pOwotICAgICAgICAgICAgaWYgKCFvcHRpb24tPmdldEF0dHJpYnV0ZShzZWxlY3Rl
ZEF0dHIpLmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgb3B0aW9uLT5zZXRTZWxlY3RlZFN0
YXRlKHRydWUpOwotICAgICAgICAgICAgICAgIG9wdGlvblNlbGVjdGVkID0gdHJ1ZTsKLSAgICAg
ICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWRTdGF0ZShm
YWxzZSk7Ci0gICAgICAgICAgICBpZiAoIWZpcnN0T3B0aW9uKQotICAgICAgICAgICAgICAgIGZp
cnN0T3B0aW9uID0gb3B0aW9uOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghb3B0aW9uU2Vs
ZWN0ZWQgJiYgZmlyc3RPcHRpb24gJiYgdXNlc01lbnVMaXN0KCkpCi0gICAgICAgIGZpcnN0T3B0
aW9uLT5zZXRTZWxlY3RlZFN0YXRlKHRydWUpOwotICAgIAotICAgIHNldE5lZWRzU3R5bGVSZWNh
bGMoKTsKKyAgICBTZWxlY3RFbGVtZW50OjpyZXNldChtX2RhdGEsIHRoaXMpOwogfQogCiB2b2lk
IEhUTUxTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEZvY3VzRXZlbnQoKQogewotICAgIGlmICh1c2Vz
TWVudUxpc3QoKSkKLSAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBj
b21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBldmVu
dHMgZHVyaW5nIGJsdXIgZXZlbnQgZGlzcGF0Y2hhbAotICAgICAgICBzYXZlTGFzdFNlbGVjdGlv
bigpOworICAgIFNlbGVjdEVsZW1lbnQ6OmRpc3BhdGNoRm9jdXNFdmVudChtX2RhdGEsIHRoaXMp
OwogICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6OmRpc3BhdGNoRm9jdXNFdmVu
dCgpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEJsdXJFdmVudCgpCiB7
Ci0gICAgLy8gV2Ugb25seSBuZWVkIHRvIGZpcmUgY2hhbmdlIGV2ZW50cyBoZXJlIGZvciBtZW51
IGxpc3RzLCBiZWNhdXNlIHdlIGZpcmUgY2hhbmdlIGV2ZW50cyBmb3IgbGlzdCBib3hlcyB3aGVu
ZXZlciB0aGUgc2VsZWN0aW9uIGNoYW5nZSBpcyBhY3R1YWxseSBtYWRlLgotICAgIC8vIFRoaXMg
bWF0Y2hlcyBvdGhlciBicm93c2VycycgYmVoYXZpb3IuCi0gICAgaWYgKHVzZXNNZW51TGlzdCgp
KQotICAgICAgICBtZW51TGlzdE9uQ2hhbmdlKCk7CisgICAgU2VsZWN0RWxlbWVudDo6ZGlzcGF0
Y2hCbHVyRXZlbnQobV9kYXRhLCB0aGlzKTsKICAgICBIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0
aFN0YXRlOjpkaXNwYXRjaEJsdXJFdmVudCgpOwogfQogCi12b2lkIEhUTUxTZWxlY3RFbGVtZW50
OjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50KiBldnQpCi17Ci0gICAgaWYgKCFyZW5kZXJlcigp
KQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKHVzZXNNZW51TGlzdCgpKQotICAgICAg
ICBtZW51TGlzdERlZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKLSAgICBlbHNlIAotICAgICAgICBs
aXN0Qm94RGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotICAgIAotICAgIGlmIChldnQtPmRlZmF1
bHRIYW5kbGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChldnQtPnR5cGUoKSA9PSBl
dmVudE5hbWVzKCkua2V5cHJlc3NFdmVudCAmJiBldnQtPmlzS2V5Ym9hcmRFdmVudCgpKSB7Ci0g
ICAgICAgIEtleWJvYXJkRXZlbnQqIGtleWJvYXJkRXZlbnQgPSBzdGF0aWNfY2FzdDxLZXlib2Fy
ZEV2ZW50Kj4oZXZ0KTsKLSAgICAKLSAgICAgICAgaWYgKCFrZXlib2FyZEV2ZW50LT5jdHJsS2V5
KCkgJiYgIWtleWJvYXJkRXZlbnQtPmFsdEtleSgpICYmICFrZXlib2FyZEV2ZW50LT5tZXRhS2V5
KCkgJiYKLSAgICAgICAgICAgIGlzUHJpbnRhYmxlQ2hhcihrZXlib2FyZEV2ZW50LT5jaGFyQ29k
ZSgpKSkgewotICAgICAgICAgICAgdHlwZUFoZWFkRmluZChrZXlib2FyZEV2ZW50KTsKLSAgICAg
ICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6OmRl
ZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKLX0KLQotdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6bWVu
dUxpc3REZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50KiBldnQpCit2b2lkIEhUTUxTZWxlY3RFbGVt
ZW50OjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50KiBldmVudCkKIHsKLSAgICBpZiAoZXZ0LT50
eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleWRvd25FdmVudCkgewotICAgICAgICBpZiAoIXJlbmRl
cmVyKCkgfHwgIWV2dC0+aXNLZXlib2FyZEV2ZW50KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIFN0cmluZyBrZXlJZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+
KGV2dCktPmtleUlkZW50aWZpZXIoKTsKLSAgICAgICAgYm9vbCBoYW5kbGVkID0gZmFsc2U7Ci0j
aWYgQVJST1dfS0VZU19QT1BfTUVOVQotICAgICAgICBpZiAoa2V5SWRlbnRpZmllciA9PSAiRG93
biIgfHwga2V5SWRlbnRpZmllciA9PSAiVXAiKSB7Ci0gICAgICAgICAgICBmb2N1cygpOwotICAg
ICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0
aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBldmVudHMgZHVyaW5nIHNl
dFNlbGVjdGVkSW5kZXgsCi0gICAgICAgICAgICAvLyB3aGljaCBnZXRzIGNhbGxlZCBmcm9tIFJl
bmRlck1lbnVMaXN0Ojp2YWx1ZUNoYW5nZWQsIHdoaWNoIGdldHMgY2FsbGVkIGFmdGVyIHRoZSB1
c2VyIG1ha2VzIGEgc2VsZWN0aW9uIGZyb20gdGhlIG1lbnUuCi0gICAgICAgICAgICBzYXZlTGFz
dFNlbGVjdGlvbigpOwotICAgICAgICAgICAgaWYgKFJlbmRlck1lbnVMaXN0KiBtZW51TGlzdCA9
IHN0YXRpY19jYXN0PFJlbmRlck1lbnVMaXN0Kj4ocmVuZGVyZXIoKSkpCi0gICAgICAgICAgICAg
ICAgbWVudUxpc3QtPnNob3dQb3B1cCgpOwotICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0g
ICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRl
eChzZWxlY3RlZEluZGV4KCkpOwotICAgICAgICBpZiAoa2V5SWRlbnRpZmllciA9PSAiRG93biIg
fHwga2V5SWRlbnRpZmllciA9PSAiUmlnaHQiKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IGxp
c3RJdGVtcygpLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAobGlzdEluZGV4ICs9IDE7Ci0gICAg
ICAgICAgICAgICAgIGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHNpemUgJiYgKGxpc3RJ
dGVtcygpW2xpc3RJbmRleF0tPmRpc2FibGVkKCkgfHwgIWxpc3RJdGVtcygpW2xpc3RJbmRleF0t
Pmhhc1RhZ05hbWUob3B0aW9uVGFnKSk7Ci0gICAgICAgICAgICAgICAgICsrbGlzdEluZGV4KSB7
IH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxpc3RJbmRleCA+PSAwICYmIGxpc3RJ
bmRleCA8IHNpemUpCi0gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChsaXN0VG9PcHRp
b25JbmRleChsaXN0SW5kZXgpKTsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAg
ICB9IGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIlVwIiB8fCBrZXlJZGVudGlmaWVyID09ICJM
ZWZ0IikgewotICAgICAgICAgICAgaW50IHNpemUgPSBsaXN0SXRlbXMoKS5zaXplKCk7Ci0gICAg
ICAgICAgICBmb3IgKGxpc3RJbmRleCAtPSAxOwotICAgICAgICAgICAgICAgICBsaXN0SW5kZXgg
Pj0gMCAmJiBsaXN0SW5kZXggPCBzaXplICYmIChsaXN0SXRlbXMoKVtsaXN0SW5kZXhdLT5kaXNh
YmxlZCgpIHx8ICFsaXN0SXRlbXMoKVtsaXN0SW5kZXhdLT5oYXNUYWdOYW1lKG9wdGlvblRhZykp
OwotICAgICAgICAgICAgICAgICAtLWxpc3RJbmRleCkgeyB9Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIGlmIChsaXN0SW5kZXggPj0gMCAmJiBsaXN0SW5kZXggPCBzaXplKQotICAgICAgICAg
ICAgICAgIHNldFNlbGVjdGVkSW5kZXgobGlzdFRvT3B0aW9uSW5kZXgobGlzdEluZGV4KSk7Ci0g
ICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGlm
IChoYW5kbGVkKQotICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgIH0K
LQotICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBzaW5jZSBzZW5kaW5nIHNpbXVsYXRl
ZCBtb3VzZSBldmVudHMKLSAgICAvLyBvbiBrZXkgZG93biBibG9ja3MgdGhlIHByb3BlciBzZW5k
aW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQuCi0gICAgaWYgKGV2dC0+dHlwZSgpID09IGV2ZW50
TmFtZXMoKS5rZXlwcmVzc0V2ZW50KSB7Ci0gICAgICAgIGlmICghcmVuZGVyZXIoKSB8fCAhZXZ0
LT5pc0tleWJvYXJkRXZlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaW50IGtl
eUNvZGUgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50Kj4oZXZ0KS0+a2V5Q29kZSgpOwotICAg
ICAgICBib29sIGhhbmRsZWQgPSBmYWxzZTsKLSNpZiBBUlJPV19LRVlTX1BPUF9NRU5VCi0gICAg
ICAgIGlmIChrZXlDb2RlID09ICcgJykgewotICAgICAgICAgICAgZm9jdXMoKTsKLSAgICAgICAg
ICAgIC8vIFNhdmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIG5l
dyBzZWxlY3Rpb24gd2hlbiBkaXNwYXRjaGluZyBjaGFuZ2UgZXZlbnRzIGR1cmluZyBzZXRTZWxl
Y3RlZEluZGV4LAotICAgICAgICAgICAgLy8gd2hpY2ggZ2V0cyBjYWxsZWQgZnJvbSBSZW5kZXJN
ZW51TGlzdDo6dmFsdWVDaGFuZ2VkLCB3aGljaCBnZXRzIGNhbGxlZCBhZnRlciB0aGUgdXNlciBt
YWtlcyBhIHNlbGVjdGlvbiBmcm9tIHRoZSBtZW51LgotICAgICAgICAgICAgc2F2ZUxhc3RTZWxl
Y3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChSZW5kZXJNZW51TGlzdCogbWVudUxpc3QgPSBzdGF0
aWNfY2FzdDxSZW5kZXJNZW51TGlzdCo+KHJlbmRlcmVyKCkpKQotICAgICAgICAgICAgICAgIG1l
bnVMaXN0LT5zaG93UG9wdXAoKTsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAg
ICB9Ci0gICAgICAgIGlmIChrZXlDb2RlID09ICdccicpIHsKLSAgICAgICAgICAgIG1lbnVMaXN0
T25DaGFuZ2UoKTsKLSAgICAgICAgICAgIGlmIChmb3JtKCkpCi0gICAgICAgICAgICAgICAgZm9y
bSgpLT5zdWJtaXRDbGljayhldnQpOwotICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAg
ICAgIH0KLSNlbHNlCi0gICAgICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChz
ZWxlY3RlZEluZGV4KCkpOwotICAgICAgICBpZiAoa2V5Q29kZSA9PSAnXHInKSB7Ci0gICAgICAg
ICAgICAvLyBsaXN0SW5kZXggc2hvdWxkIGFscmVhZHkgYmUgc2VsZWN0ZWQsIGJ1dCB0aGlzIHdp
bGwgZmlyZSB0aGUgb25jaGFuZ2UgaGFuZGxlci4KLSAgICAgICAgICAgIHNldFNlbGVjdGVkSW5k
ZXgobGlzdFRvT3B0aW9uSW5kZXgobGlzdEluZGV4KSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAg
ICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGlmIChoYW5kbGVk
KQotICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgIH0KLQotICAgIGlm
IChldnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2Vkb3duRXZlbnQgJiYgZXZ0LT5pc01v
dXNlRXZlbnQoKSAmJiBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZ0KS0+YnV0dG9uKCkgPT0g
TGVmdEJ1dHRvbikgewotICAgICAgICBmb2N1cygpOwotICAgICAgICBpZiAoUmVuZGVyTWVudUxp
c3QqIG1lbnVMaXN0ID0gc3RhdGljX2Nhc3Q8UmVuZGVyTWVudUxpc3QqPihyZW5kZXJlcigpKSkg
ewotICAgICAgICAgICAgaWYgKG1lbnVMaXN0LT5wb3B1cElzVmlzaWJsZSgpKQotICAgICAgICAg
ICAgICAgIG1lbnVMaXN0LT5oaWRlUG9wdXAoKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgICAgIC8vIFNhdmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8g
dGhlIG5ldyBzZWxlY3Rpb24gd2hlbiB3ZSBjYWxsIG9uQ2hhbmdlIGR1cmluZyBzZXRTZWxlY3Rl
ZEluZGV4LAotICAgICAgICAgICAgICAgIC8vIHdoaWNoIGdldHMgY2FsbGVkIGZyb20gUmVuZGVy
TWVudUxpc3Q6OnZhbHVlQ2hhbmdlZCwgd2hpY2ggZ2V0cyBjYWxsZWQgYWZ0ZXIgdGhlIHVzZXIg
bWFrZXMgYSBzZWxlY3Rpb24gZnJvbSB0aGUgbWVudS4KLSAgICAgICAgICAgICAgICBzYXZlTGFz
dFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAoKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBldnQtPnNldERlZmF1bHRIYW5kbGVkKCk7
Ci0gICAgfQorICAgIFNlbGVjdEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIobV9kYXRhLCB0
aGlzLCBldmVudCwgZm9ybSgpKTsKIH0KIAotdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6bGlzdEJv
eERlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnQqIGV2dCkKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6
OnNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGludCBpbmRleCkKIHsKLSAgICBpZiAoZXZ0
LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1vdXNlZG93bkV2ZW50ICYmIGV2dC0+aXNNb3VzZUV2
ZW50KCkgJiYgc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2dCktPmJ1dHRvbigpID09IExlZnRC
dXR0b24pIHsKLSAgICAgICAgZm9jdXMoKTsKLQotICAgICAgICAvLyBDb252ZXJ0IHRvIGNvb3Jk
cyByZWxhdGl2ZSB0byB0aGUgbGlzdCBib3ggaWYgbmVlZGVkLgotICAgICAgICBNb3VzZUV2ZW50
KiBtb3VzZUV2ZW50ID0gc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2dCk7Ci0gICAgICAgIElu
dFBvaW50IGxvY2FsT2Zmc2V0ID0gcm91bmRlZEludFBvaW50KHJlbmRlcmVyKCktPmFic29sdXRl
VG9Mb2NhbChtb3VzZUV2ZW50LT5hYnNvbHV0ZUxvY2F0aW9uKCksIGZhbHNlLCB0cnVlKSk7Ci0g
ICAgICAgIGludCBsaXN0SW5kZXggPSBzdGF0aWNfY2FzdDxSZW5kZXJMaXN0Qm94Kj4ocmVuZGVy
ZXIoKSktPmxpc3RJbmRleEF0T2Zmc2V0KGxvY2FsT2Zmc2V0LngoKSwgbG9jYWxPZmZzZXQueSgp
KTsKLSAgICAgICAgaWYgKGxpc3RJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBTYXZlIHRo
ZSBzZWxlY3Rpb24gc28gaXQgY2FuIGJlIGNvbXBhcmVkIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHdo
ZW4gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgbW91c2V1cCwgb3IgYWZ0ZXIgYXV0
b3Njcm9sbCBmaW5pc2hlcy4KLSAgICAgICAgICAgIHNhdmVMYXN0U2VsZWN0aW9uKCk7Ci0KLSAg
ICAgICAgICAgIG1fYWN0aXZlU2VsZWN0aW9uU3RhdGUgPSB0cnVlOwotICAgICAgICAgICAgCi0g
ICAgICAgICAgICBib29sIG11bHRpU2VsZWN0S2V5UHJlc3NlZCA9IGZhbHNlOwotI2lmIFBMQVRG
T1JNKE1BQykKLSAgICAgICAgICAgIG11bHRpU2VsZWN0S2V5UHJlc3NlZCA9IG1vdXNlRXZlbnQt
Pm1ldGFLZXkoKTsKLSNlbHNlCi0gICAgICAgICAgICBtdWx0aVNlbGVjdEtleVByZXNzZWQgPSBt
b3VzZUV2ZW50LT5jdHJsS2V5KCk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgYm9vbCBzaGlmdFNl
bGVjdCA9IG11bHRpcGxlKCkgJiYgbW91c2VFdmVudC0+c2hpZnRLZXkoKTsKLSAgICAgICAgICAg
IGJvb2wgbXVsdGlTZWxlY3QgPSBtdWx0aXBsZSgpICYmIG11bHRpU2VsZWN0S2V5UHJlc3NlZCAm
JiAhbW91c2VFdmVudC0+c2hpZnRLZXkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRWxl
bWVudCogY2xpY2tlZEVsZW1lbnQgPSBsaXN0SXRlbXMoKVtsaXN0SW5kZXhdOyAgICAgICAgICAg
IAotICAgICAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnQqIG9wdGlvbiA9IDA7Ci0gICAgICAgICAg
ICBpZiAoY2xpY2tlZEVsZW1lbnQtPmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAg
ICAgICAgICAgb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihjbGlja2Vk
RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gS2VlcCB0cmFj
ayBvZiB3aGV0aGVyIGFuIGFjdGl2ZSBzZWxlY3Rpb24gKGxpa2UgZHVyaW5nIGRyYWcgc2VsZWN0
aW9uKSwgc2hvdWxkIHNlbGVjdCBvciBkZXNlbGVjdAotICAgICAgICAgICAgICAgIGlmIChvcHRp
b24tPnNlbGVjdGVkKCkgJiYgbXVsdGlTZWxlY3RLZXlQcmVzc2VkKQotICAgICAgICAgICAgICAg
ICAgICBtX2FjdGl2ZVNlbGVjdGlvblN0YXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBp
ZiAoIW1fYWN0aXZlU2VsZWN0aW9uU3RhdGUpCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbi0+
c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAg
ICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBpbiBhbnkgc3BlY2lhbCBtdWx0aXBsZSBzZWxlY3Rp
b24gbW9kZSwgdGhlbiBkZXNlbGVjdCBhbGwgb3RoZXIgaXRlbXMsIGV4Y2x1ZGluZyB0aGUgY2xp
Y2tlZCBvcHRpb24uCi0gICAgICAgICAgICAvLyBJZiBubyBvcHRpb24gd2FzIGNsaWNrZWQsIHRo
ZW4gdGhpcyB3aWxsIGRlc2VsZWN0IGFsbCBpdGVtcyBpbiB0aGUgbGlzdC4KLSAgICAgICAgICAg
IGlmICghc2hpZnRTZWxlY3QgJiYgIW11bHRpU2VsZWN0KQotICAgICAgICAgICAgICAgIGRlc2Vs
ZWN0SXRlbXMob3B0aW9uKTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIGFuY2hvciBoYXNuJ3Qg
YmVlbiBzZXQsIGFuZCB3ZSdyZSBkb2luZyBhIHNpbmdsZSBzZWxlY3Rpb24gb3IgYSBzaGlmdCBz
ZWxlY3Rpb24sIHRoZW4gaW5pdGlhbGl6ZSB0aGUgYW5jaG9yIHRvIHRoZSBmaXJzdCBzZWxlY3Rl
ZCBpbmRleC4KLSAgICAgICAgICAgIGlmIChtX2FjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4IDwg
MCAmJiAhbXVsdGlTZWxlY3QpCi0gICAgICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0aW9uQW5j
aG9ySW5kZXgoc2VsZWN0ZWRJbmRleCgpKTsKLQotICAgICAgICAgICAgLy8gU2V0IHRoZSBzZWxl
Y3Rpb24gc3RhdGUgb2YgdGhlIGNsaWNrZWQgb3B0aW9uCi0gICAgICAgICAgICBpZiAob3B0aW9u
ICYmICFvcHRpb24tPmRpc2FibGVkKCkpCi0gICAgICAgICAgICAgICAgb3B0aW9uLT5zZXRTZWxl
Y3RlZFN0YXRlKHRydWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiB0aGVyZSB3
YXMgbm8gc2VsZWN0ZWRJbmRleCgpIGZvciB0aGUgcHJldmlvdXMgaW5pdGlhbGl6YXRpb24sIG9y
Ci0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBkb2luZyBhIHNpbmdsZSBzZWxlY3Rpb24sIG9yIGEg
bXVsdGlwbGUgc2VsZWN0aW9uICh1c2luZyBjbWQgb3IgY3RybCksIHRoZW4gaW5pdGlhbGl6ZSB0
aGUgYW5jaG9yIGluZGV4IHRvIHRoZSBsaXN0SW5kZXggdGhhdCBqdXN0IGdvdCBjbGlja2VkLgot
ICAgICAgICAgICAgaWYgKGxpc3RJbmRleCA+PSAwICYmIChtX2FjdGl2ZVNlbGVjdGlvbkFuY2hv
ckluZGV4IDwgMCB8fCAhc2hpZnRTZWxlY3QpKQotICAgICAgICAgICAgICAgIHNldEFjdGl2ZVNl
bGVjdGlvbkFuY2hvckluZGV4KGxpc3RJbmRleCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAg
IHNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGxpc3RJbmRleCk7Ci0gICAgICAgICAgICB1cGRh
dGVMaXN0Qm94U2VsZWN0aW9uKCFtdWx0aVNlbGVjdCk7Ci0KLSAgICAgICAgICAgIGlmIChGcmFt
ZSogZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgpKQotICAgICAgICAgICAgICAgIGZyYW1lLT5l
dmVudEhhbmRsZXIoKS0+c2V0TW91c2VEb3duTWF5U3RhcnRBdXRvc2Nyb2xsKCk7Ci0KLSAgICAg
ICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBp
ZiAoZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1vdXNldXBFdmVudCAmJiBldnQtPmlzTW91
c2VFdmVudCgpICYmIHN0YXRpY19jYXN0PE1vdXNlRXZlbnQqPihldnQpLT5idXR0b24oKSA9PSBM
ZWZ0QnV0dG9uICYmIGRvY3VtZW50KCktPmZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5hdXRvc2Ny
b2xsUmVuZGVyZXIoKSAhPSByZW5kZXJlcigpKQotICAgICAgICAvLyBUaGlzIG1ha2VzIHN1cmUg
d2UgZmlyZSBkaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQgZm9yIGEgc2luZ2xlIGNsaWNr
LiAgRm9yIGRyYWcgc2VsZWN0aW9uLCBvbkNoYW5nZSB3aWxsIGZpcmUgd2hlbiB0aGUgYXV0b3Nj
cm9sbCB0aW1lciBzdG9wcy4KLSAgICAgICAgbGlzdEJveE9uQ2hhbmdlKCk7Ci0gICAgZWxzZSBp
ZiAoZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleWRvd25FdmVudCkgewotICAgICAgICBp
ZiAoIWV2dC0+aXNLZXlib2FyZEV2ZW50KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IFN0cmluZyBrZXlJZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2dCkt
PmtleUlkZW50aWZpZXIoKTsKLQotICAgICAgICBpbnQgZW5kSW5kZXggPSAwOyAgICAgICAgCi0g
ICAgICAgIGlmIChtX2FjdGl2ZVNlbGVjdGlvbkVuZEluZGV4IDwgMCkgewotICAgICAgICAgICAg
Ly8gSW5pdGlhbGl6ZSB0aGUgZW5kIGluZGV4Ci0gICAgICAgICAgICBpZiAoa2V5SWRlbnRpZmll
ciA9PSAiRG93biIpCi0gICAgICAgICAgICAgICAgZW5kSW5kZXggPSBuZXh0U2VsZWN0YWJsZUxp
c3RJbmRleChsYXN0U2VsZWN0ZWRMaXN0SW5kZXgoKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChr
ZXlJZGVudGlmaWVyID09ICJVcCIpCi0gICAgICAgICAgICAgICAgZW5kSW5kZXggPSBwcmV2aW91
c1NlbGVjdGFibGVMaXN0SW5kZXgob3B0aW9uVG9MaXN0SW5kZXgoc2VsZWN0ZWRJbmRleCgpKSk7
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBpbmRleCBiYXNl
ZCBvbiB0aGUgY3VycmVudCBlbmQgaW5kZXgKLSAgICAgICAgICAgIGlmIChrZXlJZGVudGlmaWVy
ID09ICJEb3duIikKLSAgICAgICAgICAgICAgICBlbmRJbmRleCA9IG5leHRTZWxlY3RhYmxlTGlz
dEluZGV4KG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgpOwotICAgICAgICAgICAgZWxzZSBpZiAo
a2V5SWRlbnRpZmllciA9PSAiVXAiKQotICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gcHJldmlv
dXNTZWxlY3RhYmxlTGlzdEluZGV4KG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgpOyAgICAKLSAg
ICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGtleUlkZW50aWZpZXIgPT0gIkRvd24iIHx8
IGtleUlkZW50aWZpZXIgPT0gIlVwIikgewotICAgICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0
aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3Bh
dGNoaW5nIGNoYW5nZSBldmVudHMgaW1tZWRpYXRlbHkgYWZ0ZXIgbWFraW5nIHRoZSBuZXcgc2Vs
ZWN0aW9uLgotICAgICAgICAgICAgc2F2ZUxhc3RTZWxlY3Rpb24oKTsKLQotICAgICAgICAgICAg
QVNTRVJUKGVuZEluZGV4ID49IDAgJiYgKHVuc2lnbmVkKWVuZEluZGV4IDwgbGlzdEl0ZW1zKCku
c2l6ZSgpKTsgCi0gICAgICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChlbmRJbmRl
eCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIHRoZSBhbmNob3IgaXMgdW5pdGlh
bGl6ZWQsIG9yIGlmIHdlJ3JlIGdvaW5nIHRvIGRlc2VsZWN0IGFsbCBvdGhlciBvcHRpb25zLCB0
aGVuIHNldCB0aGUgYW5jaG9yIGluZGV4IGVxdWFsIHRvIHRoZSBlbmQgaW5kZXguCi0gICAgICAg
ICAgICBib29sIGRlc2VsZWN0T3RoZXJzID0gIW11bHRpcGxlKCkgfHwgIXN0YXRpY19jYXN0PEtl
eWJvYXJkRXZlbnQqPihldnQpLT5zaGlmdEtleSgpOwotICAgICAgICAgICAgaWYgKG1fYWN0aXZl
U2VsZWN0aW9uQW5jaG9ySW5kZXggPCAwIHx8IGRlc2VsZWN0T3RoZXJzKSB7Ci0gICAgICAgICAg
ICAgICAgbV9hY3RpdmVTZWxlY3Rpb25TdGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYg
KGRlc2VsZWN0T3RoZXJzKQotICAgICAgICAgICAgICAgICAgICBkZXNlbGVjdEl0ZW1zKCk7Ci0g
ICAgICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgobV9hY3RpdmVTZWxl
Y3Rpb25FbmRJbmRleCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0
PFJlbmRlckxpc3RCb3gqPihyZW5kZXJlcigpKS0+c2Nyb2xsVG9SZXZlYWxFbGVtZW50QXRMaXN0
SW5kZXgoZW5kSW5kZXgpOwotICAgICAgICAgICAgdXBkYXRlTGlzdEJveFNlbGVjdGlvbihkZXNl
bGVjdE90aGVycyk7Ci0gICAgICAgICAgICBsaXN0Qm94T25DaGFuZ2UoKTsKLSAgICAgICAgICAg
IGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZXZ0
LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleXByZXNzRXZlbnQpIHsKLSAgICAgICAgaWYgKCFl
dnQtPmlzS2V5Ym9hcmRFdmVudCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQg
a2V5Q29kZSA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihldnQpLT5rZXlDb2RlKCk7Ci0K
LSAgICAgICAgaWYgKGtleUNvZGUgPT0gJ1xyJykgewotICAgICAgICAgICAgaWYgKGZvcm0oKSkK
LSAgICAgICAgICAgICAgICBmb3JtKCktPnN1Ym1pdENsaWNrKGV2dCk7Ci0gICAgICAgICAgICBl
dnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0K
LSAgICB9CisgICAgU2VsZWN0RWxlbWVudDo6c2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgo
bV9kYXRhLCB0aGlzLCBpbmRleCk7CiB9CiAKLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNldEFj
dGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGludCBpbmRleCkKK3ZvaWQgSFRNTFNlbGVjdEVsZW1l
bnQ6OnNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGludCBpbmRleCkKIHsKLSAgICBtX2FjdGl2
ZVNlbGVjdGlvbkFuY2hvckluZGV4ID0gaW5kZXg7Ci0gICAgCi0gICAgLy8gQ2FjaGUgdGhlIHNl
bGVjdGlvbiBzdGF0ZSBzbyB3ZSBjYW4gcmVzdG9yZSB0aGUgb2xkIHNlbGVjdGlvbiBhcyB0aGUg
bmV3IHNlbGVjdGlvbiBwaXZvdHMgYXJvdW5kIHRoaXMgYW5jaG9yIGluZGV4Ci0gICAgY29uc3Qg
VmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBsaXN0SXRlbXMoKTsKLSAgICBtX2NhY2hlZFN0YXRl
Rm9yQWN0aXZlU2VsZWN0aW9uLmNsZWFyKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9jYWxOYW1l
KG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgIEhUTUxPcHRpb25FbGVtZW50KiBvcHRpb24gPSBz
dGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGl0ZW1zW2ldKTsKLSAgICAgICAgICAgIG1f
Y2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24uYXBwZW5kKG9wdGlvbi0+c2VsZWN0ZWQoKSk7
Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbV9jYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVj
dGlvbi5hcHBlbmQoZmFsc2UpOwotICAgIH0KKyAgICBTZWxlY3RFbGVtZW50OjpzZXRBY3RpdmVT
ZWxlY3Rpb25FbmRJbmRleChtX2RhdGEsIGluZGV4KTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxl
bWVudDo6dXBkYXRlTGlzdEJveFNlbGVjdGlvbihib29sIGRlc2VsZWN0T3RoZXJPcHRpb25zKQog
ewotICAgIEFTU0VSVChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPmlzTGlzdEJveCgpKTsKLSAg
ICAKLSAgICB1bnNpZ25lZCBzdGFydDsKLSAgICB1bnNpZ25lZCBlbmQ7Ci0gICAgQVNTRVJUKG1f
YWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXggPj0gMCk7Ci0gICAgc3RhcnQgPSBtaW4obV9hY3Rp
dmVTZWxlY3Rpb25BbmNob3JJbmRleCwgbV9hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCk7Ci0gICAg
ZW5kID0gbWF4KG1fYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgsIG1fYWN0aXZlU2VsZWN0aW9u
RW5kSW5kZXgpOwotCi0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBsaXN0SXRl
bXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsK
LSAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFnKSkgewotICAgICAg
ICAgICAgSFRNTE9wdGlvbkVsZW1lbnQqIG9wdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25F
bGVtZW50Kj4oaXRlbXNbaV0pOwotICAgICAgICAgICAgaWYgKCFvcHRpb24tPmRpc2FibGVkKCkp
IHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+PSBzdGFydCAmJiBpIDw9IGVuZCkKLSAgICAgICAg
ICAgICAgICAgICAgb3B0aW9uLT5zZXRTZWxlY3RlZFN0YXRlKG1fYWN0aXZlU2VsZWN0aW9uU3Rh
dGUpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlc2VsZWN0T3RoZXJPcHRpb25zIHx8IGkg
Pj0gbV9jYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbi5zaXplKCkpCi0gICAgICAgICAgICAg
ICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAg
ZWxzZQotICAgICAgICAgICAgICAgICAgICBvcHRpb24tPnNldFNlbGVjdGVkU3RhdGUobV9jYWNo
ZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbltpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICBzY3JvbGxUb1NlbGVjdGlvbigpOworICAgIFNlbGVjdEVsZW1lbnQ6OnVw
ZGF0ZUxpc3RCb3hTZWxlY3Rpb24obV9kYXRhLCB0aGlzLCBkZXNlbGVjdE90aGVyT3B0aW9ucyk7
CiB9CiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6Om1lbnVMaXN0T25DaGFuZ2UoKQogewotICAg
IEFTU0VSVCh1c2VzTWVudUxpc3QoKSk7Ci0gICAgaW50IHNlbGVjdGVkID0gc2VsZWN0ZWRJbmRl
eCgpOwotICAgIGlmIChtX2xhc3RPbkNoYW5nZUluZGV4ICE9IHNlbGVjdGVkKSB7Ci0gICAgICAg
IG1fbGFzdE9uQ2hhbmdlSW5kZXggPSBzZWxlY3RlZDsKLSAgICAgICAgZGlzcGF0Y2hGb3JtQ29u
dHJvbENoYW5nZUV2ZW50KCk7Ci0gICAgfQorICAgIFNlbGVjdEVsZW1lbnQ6Om1lbnVMaXN0T25D
aGFuZ2UobV9kYXRhLCB0aGlzKTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6bGlzdEJv
eE9uQ2hhbmdlKCkKIHsKLSAgICBBU1NFUlQoIXVzZXNNZW51TGlzdCgpKTsKLQotICAgIGNvbnN0
IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgCi0gICAgLy8gSWYg
dGhlIGNhY2hlZCBzZWxlY3Rpb24gbGlzdCBpcyBlbXB0eSwgb3IgdGhlIHNpemUgaGFzIGNoYW5n
ZWQsIHRoZW4gZmlyZSBkaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQsIGFuZCByZXR1cm4g
ZWFybHkuCi0gICAgaWYgKG1fbGFzdE9uQ2hhbmdlU2VsZWN0aW9uLmlzRW1wdHkoKSB8fCBtX2xh
c3RPbkNoYW5nZVNlbGVjdGlvbi5zaXplKCkgIT0gaXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgIGRp
c3BhdGNoRm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
ICAgIAotICAgIC8vIFVwZGF0ZSBtX2xhc3RPbkNoYW5nZVNlbGVjdGlvbiBhbmQgZmlyZSBkaXNw
YXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQKLSAgICBib29sIGZpcmVPbkNoYW5nZSA9IGZhbHNl
OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAg
ICAgICBib29sIHNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChpdGVtc1tpXS0+aGFzTG9j
YWxOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBzZWxlY3RlZCA9IHN0YXRpY19jYXN0PEhU
TUxPcHRpb25FbGVtZW50Kj4oaXRlbXNbaV0pLT5zZWxlY3RlZCgpOwotICAgICAgICBpZiAoc2Vs
ZWN0ZWQgIT0gbV9sYXN0T25DaGFuZ2VTZWxlY3Rpb25baV0pICAgICAgCi0gICAgICAgICAgICBm
aXJlT25DaGFuZ2UgPSB0cnVlOwotICAgICAgICBtX2xhc3RPbkNoYW5nZVNlbGVjdGlvbltpXSA9
IHNlbGVjdGVkOwotICAgIH0KLSAgICBpZiAoZmlyZU9uQ2hhbmdlKQotICAgICAgICBkaXNwYXRj
aEZvcm1Db250cm9sQ2hhbmdlRXZlbnQoKTsKKyAgICBTZWxlY3RFbGVtZW50OjpsaXN0Qm94T25D
aGFuZ2UobV9kYXRhLCB0aGlzKTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2F2ZUxh
c3RTZWxlY3Rpb24oKQogewotICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gbGlz
dEl0ZW1zKCk7Ci0KLSAgICBpZiAodXNlc01lbnVMaXN0KCkpIHsKLSAgICAgICAgbV9sYXN0T25D
aGFuZ2VJbmRleCA9IHNlbGVjdGVkSW5kZXgoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAg
ICAKLSAgICBtX2xhc3RPbkNoYW5nZVNlbGVjdGlvbi5jbGVhcigpOwotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbXNbaV0t
Pmhhc0xvY2FsTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVu
dCogb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihpdGVtc1tpXSk7Ci0g
ICAgICAgICAgICBtX2xhc3RPbkNoYW5nZVNlbGVjdGlvbi5hcHBlbmQob3B0aW9uLT5zZWxlY3Rl
ZCgpKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBtX2xhc3RPbkNoYW5nZVNlbGVjdGlv
bi5hcHBlbmQoZmFsc2UpOwotICAgIH0KLX0KLQotc3RhdGljIFN0cmluZyBzdHJpcExlYWRpbmdX
aGl0ZVNwYWNlKGNvbnN0IFN0cmluZyYgc3RyaW5nKQotewotICAgIGludCBsZW5ndGggPSBzdHJp
bmcubGVuZ3RoKCk7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytp
KQotICAgICAgICBpZiAoc3RyaW5nW2ldICE9IG5vQnJlYWtTcGFjZSAmJgotICAgICAgICAgICAg
KHN0cmluZ1tpXSA8PSAweDdGID8gIWlzQVNDSUlTcGFjZShzdHJpbmdbaV0pIDogKGRpcmVjdGlv
bihzdHJpbmdbaV0pICE9IFdoaXRlU3BhY2VOZXV0cmFsKSkpCi0gICAgICAgICAgICBicmVhazsK
LQotICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKGksIGxlbmd0aCAtIGkpOwotfQotCi12b2lk
IEhUTUxTZWxlY3RFbGVtZW50Ojp0eXBlQWhlYWRGaW5kKEtleWJvYXJkRXZlbnQqIGV2ZW50KQot
ewotICAgIGlmIChldmVudC0+dGltZVN0YW1wKCkgPCBtX2xhc3RDaGFyVGltZSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgRE9NVGltZVN0YW1wIGRlbHRhID0gZXZlbnQtPnRpbWVTdGFtcCgpIC0g
bV9sYXN0Q2hhclRpbWU7Ci0KLSAgICBtX2xhc3RDaGFyVGltZSA9IGV2ZW50LT50aW1lU3RhbXAo
KTsKLQotICAgIFVDaGFyIGMgPSBldmVudC0+Y2hhckNvZGUoKTsKLQotICAgIFN0cmluZyBwcmVm
aXg7Ci0gICAgaW50IHNlYXJjaFN0YXJ0T2Zmc2V0ID0gMTsKLSAgICBpZiAoZGVsdGEgPiB0eXBl
QWhlYWRUaW1lb3V0KSB7Ci0gICAgICAgIG1fdHlwZWRTdHJpbmcgPSBwcmVmaXggPSBTdHJpbmco
JmMsIDEpOwotICAgICAgICBtX3JlcGVhdGluZ0NoYXIgPSBjOwotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIG1fdHlwZWRTdHJpbmcuYXBwZW5kKGMpOwotCi0gICAgICAgIGlmIChjID09IG1fcmVwZWF0
aW5nQ2hhcikKLSAgICAgICAgICAgIC8vIFRoZSB1c2VyIGlzIGxpa2VseSB0cnlpbmcgdG8gY3lj
bGUgdGhyb3VnaCBhbGwgdGhlIGl0ZW1zIHN0YXJ0aW5nIHdpdGggdGhpcyBjaGFyYWN0ZXIsIHNv
IGp1c3Qgc2VhcmNoIG9uIHRoZSBjaGFyYWN0ZXIKLSAgICAgICAgICAgIHByZWZpeCA9IFN0cmlu
ZygmYywgMSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbV9yZXBlYXRpbmdDaGFyID0g
MDsKLSAgICAgICAgICAgIHByZWZpeCA9IG1fdHlwZWRTdHJpbmc7Ci0gICAgICAgICAgICBzZWFy
Y2hTdGFydE9mZnNldCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCBWZWN0b3I8
RWxlbWVudCo+JiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGludCBpdGVtQ291bnQgPSBpdGVt
cy5zaXplKCk7Ci0gICAgaWYgKGl0ZW1Db3VudCA8IDEpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGludCBzZWxlY3RlZCA9IHNlbGVjdGVkSW5kZXgoKTsKLSAgICBpbnQgaW5kZXggPSAob3B0aW9u
VG9MaXN0SW5kZXgoc2VsZWN0ZWQgPj0gMCA/IHNlbGVjdGVkIDogMCkgKyBzZWFyY2hTdGFydE9m
ZnNldCkgJSBpdGVtQ291bnQ7Ci0gICAgQVNTRVJUKGluZGV4ID49IDApOwotICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyssIGluZGV4ID0gKGluZGV4ICsgMSkgJSBpdGVtQ291
bnQpIHsKLSAgICAgICAgaWYgKCFpdGVtc1tpbmRleF0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSB8
fCBpdGVtc1tpbmRleF0tPmRpc2FibGVkKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAg
ICAgICBTdHJpbmcgdGV4dCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4oaXRlbXNb
aW5kZXhdKS0+dGV4dEluZGVudGVkVG9SZXNwZWN0R3JvdXBMYWJlbCgpOwotICAgICAgICBpZiAo
c3RyaXBMZWFkaW5nV2hpdGVTcGFjZSh0ZXh0KS5zdGFydHNXaXRoKHByZWZpeCwgZmFsc2UpKSB7
Ci0gICAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KGxpc3RUb09wdGlvbkluZGV4KGluZGV4KSk7
Ci0gICAgICAgICAgICBpZiAoIXVzZXNNZW51TGlzdCgpKQotICAgICAgICAgICAgICAgIGxpc3RC
b3hPbkNoYW5nZSgpOwotICAgICAgICAgICAgc2V0TmVlZHNTdHlsZVJlY2FsYygpOwotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotCi1pbnQgSFRNTFNlbGVjdEVsZW1l
bnQ6Om5leHRTZWxlY3RhYmxlTGlzdEluZGV4KGludCBzdGFydEluZGV4KQotewotICAgIGNvbnN0
IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gbGlzdEl0ZW1zKCk7Ci0gICAgaW50IGluZGV4ID0g
c3RhcnRJbmRleCArIDE7Ci0gICAgd2hpbGUgKGluZGV4ID49IDAgJiYgKHVuc2lnbmVkKWluZGV4
IDwgaXRlbXMuc2l6ZSgpICYmICghaXRlbXNbaW5kZXhdLT5oYXNMb2NhbE5hbWUob3B0aW9uVGFn
KSB8fCBpdGVtc1tpbmRleF0tPmRpc2FibGVkKCkpKQotICAgICAgICBpbmRleCsrOwotICAgIGlm
ICgodW5zaWduZWQpIGluZGV4ID09IGl0ZW1zLnNpemUoKSkKLSAgICAgICAgcmV0dXJuIHN0YXJ0
SW5kZXg7Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi1pbnQgSFRNTFNlbGVjdEVsZW1lbnQ6OnBy
ZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleChpbnQgc3RhcnRJbmRleCkKLXsKLSAgICBjb25zdCBW
ZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGxpc3RJdGVtcygpOwotICAgIGlmIChzdGFydEluZGV4
ID09IC0xKQotICAgICAgICBzdGFydEluZGV4ID0gaXRlbXMuc2l6ZSgpOwotICAgIGludCBpbmRl
eCA9IHN0YXJ0SW5kZXggLSAxOwotICAgIHdoaWxlIChpbmRleCA+PSAwICYmICh1bnNpZ25lZClp
bmRleCA8IGl0ZW1zLnNpemUoKSAmJiAoIWl0ZW1zW2luZGV4XS0+aGFzTG9jYWxOYW1lKG9wdGlv
blRhZykgfHwgaXRlbXNbaW5kZXhdLT5kaXNhYmxlZCgpKSkKLSAgICAgICAgaW5kZXgtLTsKLSAg
ICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgIHJldHVy
biBpbmRleDsKKyAgICBTZWxlY3RFbGVtZW50OjpzYXZlTGFzdFNlbGVjdGlvbihtX2RhdGEsIHRo
aXMpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBz
ZW5kVG9BbnlFbGVtZW50KQpAQCAtMTA1Niw3ICs0MTUsNyBAQCB2b2lkIEhUTUxTZWxlY3RFbGVt
ZW50OjpzZXRPcHRpb24odW5zaWduCiAgICAgaWYgKCFlYykgewogICAgICAgICBhZGQob3B0aW9u
LCBiZWZvcmUsIGVjKTsKICAgICAgICAgaWYgKGRpZmYgPj0gMCAmJiBvcHRpb24tPnNlbGVjdGVk
KCkpCi0gICAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KGluZGV4LCAhbV9tdWx0aXBsZSk7Cisg
ICAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KGluZGV4LCAhbV9kYXRhLm11bHRpcGxlKCkpOwog
ICAgIH0KIH0KIApAQCAtMTA5MSwyNyArNDUwLDEzIEBAIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6
OnNldExlbmd0aCh1bnNpZ24KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2Nyb2xsVG9TZWxl
Y3Rpb24oKQogewotICAgIGlmIChyZW5kZXJlcigpICYmICF1c2VzTWVudUxpc3QoKSkKLSAgICAg
ICAgc3RhdGljX2Nhc3Q8UmVuZGVyTGlzdEJveCo+KHJlbmRlcmVyKCkpLT5zZWxlY3Rpb25DaGFu
Z2VkKCk7CisgICAgU2VsZWN0RWxlbWVudDo6c2Nyb2xsVG9TZWxlY3Rpb24obV9kYXRhLCB0aGlz
KTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6aW5zZXJ0ZWRJbnRvVHJlZShib29sIGRl
ZXApCiB7Ci0gICAgLy8gV2hlbiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkIGR1cmluZyBkb2N1bWVu
dCBwYXJzaW5nLCBpdCB3b24ndCBoYXZlIGFueSBpdGVtcyB5ZXQgLSBidXQgZm9yIGlubmVySFRN
TAotICAgIC8vIGFuZCByZWxhdGVkIG1ldGhvZHMsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRl
ciB0aGUgd2hvbGUgc3VidHJlZSBpcyBjb25zdHJ1Y3RlZC4KLSAgICByZWNhbGNMaXN0SXRlbXMo
dHJ1ZSk7CisgICAgU2VsZWN0RWxlbWVudDo6aW5zZXJ0ZWRJbnRvVHJlZShtX2RhdGEsIHRoaXMp
OwogICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6Omluc2VydGVkSW50b1RyZWUo
ZGVlcCk7CiB9CiAKLSNpZm5kZWYgTkRFQlVHCi0KLXZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OmNo
ZWNrTGlzdEl0ZW1zKCkgY29uc3QKLXsKLSAgICBWZWN0b3I8RWxlbWVudCo+IGl0ZW1zID0gbV9s
aXN0SXRlbXM7Ci0gICAgcmVjYWxjTGlzdEl0ZW1zKGZhbHNlKTsKLSAgICBBU1NFUlQoaXRlbXMg
PT0gbV9saXN0SXRlbXMpOwotfQotCi0jZW5kaWYKLQogfSAvLyBuYW1lc3BhY2UKSW5kZXg6IGh0
bWwvSFRNTFNlbGVjdEVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL0hUTUxTZWxlY3RFbGVt
ZW50LmgJKHJldmlzaW9uIDQ0MjI2KQorKysgaHRtbC9IVE1MU2VsZWN0RWxlbWVudC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC01OSw3ICs1OSw2IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgaW50IHNl
bGVjdGVkSW5kZXgoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0U2VsZWN0ZWRJbmRleChp
bnQgaW5kZXgsIGJvb2wgZGVzZWxlY3QgPSB0cnVlLCBib29sIGZpcmVPbkNoYW5nZSA9IGZhbHNl
KTsKLSAgICBpbnQgbGFzdFNlbGVjdGVkTGlzdEluZGV4KCkgY29uc3Q7CiAKICAgICB2aXJ0dWFs
IGJvb2wgaXNFbnVtZXJhdGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiAKQEAgLTY3LDkg
KzY2LDggQEAgcHVibGljOgogCiAgICAgaW50IG1pbldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9t
aW53aWR0aDsgfQogCi0gICAgdmlydHVhbCBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6
ZTsgfQotCi0gICAgdmlydHVhbCBib29sIG11bHRpcGxlKCkgY29uc3QgeyByZXR1cm4gbV9tdWx0
aXBsZTsgfQorICAgIHZpcnR1YWwgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuc2l6
ZSgpOyB9CisgICAgdmlydHVhbCBib29sIG11bHRpcGxlKCkgY29uc3QgeyByZXR1cm4gbV9kYXRh
Lm11bHRpcGxlKCk7IH0KIAogICAgIHZvaWQgYWRkKEhUTUxFbGVtZW50KiBlbGVtZW50LCBIVE1M
RWxlbWVudCogYmVmb3JlLCBFeGNlcHRpb25Db2RlJik7CiAgICAgdm9pZCByZW1vdmUoaW50IGlu
ZGV4KTsKQEAgLTk2LDE0ICs5NCw3IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgc2V0UmVjYWxjTGlz
dEl0ZW1zKCk7CiAKLSAgICB2aXJ0dWFsIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVt
cygpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAobV9yZWNhbGNMaXN0SXRlbXMpCi0gICAgICAg
ICAgICByZWNhbGNMaXN0SXRlbXMoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY2hlY2tM
aXN0SXRlbXMoKTsKLSAgICAgICAgcmV0dXJuIG1fbGlzdEl0ZW1zOwotICAgIH0KKyAgICB2aXJ0
dWFsIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1f
ZGF0YS5saXN0SXRlbXModGhpcyk7IH0KICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKIAogICAg
IHZpcnR1YWwgdm9pZCBkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50Kik7CkBAIC0xMjEsOSArMTEy
LDkgQEAgcHVibGljOgogICAgIE5vZGUqIGl0ZW0odW5zaWduZWQgaW5kZXgpOwogCiAgICAgQ29s
bGVjdGlvbkNhY2hlKiBjb2xsZWN0aW9uSW5mbygpIHsgcmV0dXJuICZtX2NvbGxlY3Rpb25JbmZv
OyB9Ci0gICAgCisKICAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5k
ZXgoaW50IGluZGV4KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5k
ZXgoaW50IGluZGV4KSB7IG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXggPSBpbmRleDsgfQorICAg
IHZpcnR1YWwgdm9pZCBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChpbnQgaW5kZXgpOwogICAg
IHZpcnR1YWwgdm9pZCB1cGRhdGVMaXN0Qm94U2VsZWN0aW9uKGJvb2wgZGVzZWxlY3RPdGhlck9w
dGlvbnMpOwogICAgIHZpcnR1YWwgdm9pZCBsaXN0Qm94T25DaGFuZ2UoKTsKICAgICB2aXJ0dWFs
IHZvaWQgbWVudUxpc3RPbkNoYW5nZSgpOwpAQCAtMTM1LDQ4ICsxMjYsMTggQEAgcHVibGljOgog
CiBwcml2YXRlOgogICAgIHZvaWQgcmVjYWxjTGlzdEl0ZW1zKGJvb2wgdXBkYXRlU2VsZWN0ZWRT
dGF0ZXMgPSB0cnVlKSBjb25zdDsKLSAgICB2b2lkIGNoZWNrTGlzdEl0ZW1zKCkgY29uc3Q7CiAK
ICAgICB2b2lkIGRlc2VsZWN0SXRlbXMoSFRNTE9wdGlvbkVsZW1lbnQqIGV4Y2x1ZGVFbGVtZW50
ID0gMCk7Ci0gICAgYm9vbCB1c2VzTWVudUxpc3QoKSBjb25zdCB7IHJldHVybiAhbV9tdWx0aXBs
ZSAmJiBtX3NpemUgPD0gMTsgfQotICAgIGludCBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleChpbnQg
c3RhcnRJbmRleCk7Ci0gICAgaW50IHByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleChpbnQgc3Rh
cnRJbmRleCk7Ci0gICAgdm9pZCBtZW51TGlzdERlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnQqKTsK
LSAgICB2b2lkIGxpc3RCb3hEZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50Kik7CiAgICAgdm9pZCB0
eXBlQWhlYWRGaW5kKEtleWJvYXJkRXZlbnQqKTsKICAgICB2b2lkIHNhdmVMYXN0U2VsZWN0aW9u
KCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvVHJlZShib29sKTsKIAotICAgIG11
dGFibGUgVmVjdG9yPEVsZW1lbnQqPiBtX2xpc3RJdGVtczsKLSAgICBWZWN0b3I8Ym9vbD4gbV9j
YWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbjsKLSAgICBWZWN0b3I8Ym9vbD4gbV9sYXN0T25D
aGFuZ2VTZWxlY3Rpb247CisgICAgU2VsZWN0RWxlbWVudERhdGEgbV9kYXRhOwogICAgIGludCBt
X21pbndpZHRoOwotICAgIGludCBtX3NpemU7Ci0gICAgYm9vbCBtX211bHRpcGxlOwotICAgIG11
dGFibGUgYm9vbCBtX3JlY2FsY0xpc3RJdGVtczsKLSAgICBtdXRhYmxlIGludCBtX2xhc3RPbkNo
YW5nZUluZGV4OwotCi0gICAgaW50IG1fYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXg7Ci0gICAg
aW50IG1fYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXg7Ci0gICAgYm9vbCBtX2FjdGl2ZVNlbGVjdGlv
blN0YXRlOwotCi0gICAgLy8gSW5zdGFuY2UgdmFyaWFibGVzIGZvciB0eXBlLWFoZWFkIGZpbmQK
LSAgICBVQ2hhciBtX3JlcGVhdGluZ0NoYXI7Ci0gICAgRE9NVGltZVN0YW1wIG1fbGFzdENoYXJU
aW1lOwotICAgIFN0cmluZyBtX3R5cGVkU3RyaW5nOwotCiAgICAgQ29sbGVjdGlvbkNhY2hlIG1f
Y29sbGVjdGlvbkluZm87CiB9OwogCi0jaWZkZWYgTkRFQlVHCi0KLWlubGluZSB2b2lkIEhUTUxT
ZWxlY3RFbGVtZW50OjpjaGVja0xpc3RJdGVtcygpIGNvbnN0Ci17Ci19Ci0KLSNlbmRpZgotCiB9
IC8vIG5hbWVzcGFjZQogCiAjZW5kaWYKSW5kZXg6IHdtbC9XTUxPcHRpb25FbGVtZW50LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSB3bWwvV01MT3B0aW9uRWxlbWVudC5jcHAJKHJldmlzaW9uIDQ0MjI2KQor
Kysgd21sL1dNTE9wdGlvbkVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDQsNiArMTQ0
LDExIEBAIFN0cmluZyBXTUxPcHRpb25FbGVtZW50Ojp2YWx1ZSgpIGNvbnN0CiAgICAgcmV0dXJu
IE9wdGlvbkVsZW1lbnQ6OmNvbGxlY3RPcHRpb25WYWx1ZShtX2RhdGEsIHRoaXMpOwogfQogCitT
dHJpbmcgV01MT3B0aW9uRWxlbWVudDo6dGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIE9wdGlv
bkVsZW1lbnQ6OmNvbGxlY3RPcHRpb25UZXh0KG1fZGF0YSwgdGhpcyk7Cit9CisKIFN0cmluZyBX
TUxPcHRpb25FbGVtZW50Ojp0ZXh0SW5kZW50ZWRUb1Jlc3BlY3RHcm91cExhYmVsKCkgY29uc3QK
IHsKICAgICByZXR1cm4gT3B0aW9uRWxlbWVudDo6Y29sbGVjdE9wdGlvblRleHRSZXNwZWN0aW5n
R3JvdXBMYWJlbChtX2RhdGEsIHRoaXMpOwpJbmRleDogd21sL1dNTE9wdGlvbkVsZW1lbnQuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSB3bWwvV01MT3B0aW9uRWxlbWVudC5oCShyZXZpc2lvbiA0NDIyNikKKysr
IHdtbC9XTUxPcHRpb25FbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTUwLDYgKzUwLDcgQEAg
cHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBzZWxlY3RlZCgpIGNvbnN0OwogICAgIHZpcnR1YWwg
dm9pZCBzZXRTZWxlY3RlZFN0YXRlKGJvb2wpOwogCisgICAgdmlydHVhbCBTdHJpbmcgdGV4dCgp
IGNvbnN0OwogICAgIHZpcnR1YWwgU3RyaW5nIHRleHRJbmRlbnRlZFRvUmVzcGVjdEdyb3VwTGFi
ZWwoKSBjb25zdDsKICAgICB2aXJ0dWFsIFN0cmluZyB2YWx1ZSgpIGNvbnN0OwogCg==
</data>
<flag name="review"
          id="15587"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>