<?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>69518</bug_id>
          
          <creation_ts>2011-10-06 05:06:05 -0700</creation_ts>
          <short_desc>Remove SelectElement class</short_desc>
          <delta_ts>2011-10-07 06:29:06 -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>DOM</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>Minor</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>69621</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kent Tamura">tkent</reporter>
          <assigned_to name="Kent Tamura">tkent</assigned_to>
          <cc>gustavo</cc>
    
    <cc>rniwa</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>479074</commentid>
    <comment_count>0</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2011-10-06 05:06:05 -0700</bug_when>
    <thetext>SelectElement abstraction for HTMLSelectElement and WMLSelectElement is not needed anymore because WMLSelectElement was removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>479087</commentid>
    <comment_count>1</comment_count>
      <attachid>109948</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2011-10-06 05:40:39 -0700</bug_when>
    <thetext>Created attachment 109948
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>479156</commentid>
    <comment_count>2</comment_count>
      <attachid>109948</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2011-10-06 07:49:16 -0700</bug_when>
    <thetext>Comment on attachment 109948
Patch

Attachment 109948 did not pass gtk-ews (gtk):
Output: http://queues.webkit.org/results/9977245</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>479201</commentid>
    <comment_count>3</comment_count>
      <attachid>109948</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-10-06 09:25:05 -0700</bug_when>
    <thetext>Comment on attachment 109948
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=109948&amp;action=review

r=me provided builds are fixed before you land.

&gt; Source/WebCore/ChangeLog:8
&gt; +        SelectElement used to be an abstraction class for

Nit: abstract class.

&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:1149
&gt; -        SelectElement* selectNode = toSelectElement(static_cast&lt;Element*&gt;(m_renderer-&gt;node()));
&gt; +        HTMLSelectElement* selectNode = static_cast&lt;HTMLSelectElement*&gt;(m_renderer-&gt;node());

I&apos;d like to see a type check here just to be safe. You can add toHTMLSelectElement.

&gt; Source/WebCore/html/HTMLSelectElement.cpp:675
&gt; +        OptionElement* optionElement = toOptionElement(items[i]);
&gt; +        cachedStateForActiveSelection.append(optionElement &amp;&amp; optionElement-&gt;selected());

Seems like these two lines can be merged into one line?

&gt; Source/WebCore/html/HTMLSelectElement.cpp:729
&gt; +        bool selected = optionElement &amp;&amp;  optionElement-&gt;selected();

Nit: 2 spaces after &amp;&amp;.

&gt; Source/WebCore/html/HTMLSelectElement.cpp:912
&gt; +    int optionIndex2 = -1;
&gt; +    for (int listIndex = 0; listIndex &lt; listSize; ++listIndex) {
&gt; +        if (isOptionElement(items[listIndex])) {
&gt; +            ++optionIndex2;
&gt; +            if (optionIndex2 == optionIndex)
&gt; +                return listIndex;
&gt; +        }
&gt; +    }

Huh... this loop is almost identical to the one in listToOptionIndex except it&apos;s written in such a convoluted way.

&gt; Source/WebCore/html/HTMLSelectElement.cpp:945
&gt; +    // made. This matches other browsers&apos; behavior.

Nit: please put &quot;made.&quot; on the previous line to avoid the awkward wrapping.

&gt; Source/WebCore/html/HTMLSelectElement.cpp:1106
&gt; +        bool handled = false;

Can we initialize this to true?

&gt; Source/WebCore/html/HTMLSelectElement.cpp:1131
&gt; +        }

And then add an else clause here and set it to false? I&apos;m also surprised that key identifier isn&apos;t given as an integer.

&gt; Source/WebCore/html/HTMLSelectElement.cpp:1231
&gt; +                                        bool multi, bool shift)

Nit: wrong indentation.

&gt; Source/WebCore/html/HTMLSelectElement.cpp:1282
&gt; +void HTMLSelectElement::listBoxDefaultEventHandler(SelectElementData&amp; data, Element* element, Event* event, HTMLFormElement* htmlForm)

This function needs a massive refactoring :(

&gt; Source/WebCore/html/HTMLSelectElement.cpp:1440
&gt; +    // return the number of the last option selected

Nit: s/number/index/

&gt; Source/WebCore/html/HTMLSelectElement.cpp:1449
&gt; +    for (size_t i = 0; i &lt; items.size(); ++i) {
&gt; +        if (OptionElement* optionElement = toOptionElement(items[i])) {
&gt; +            if (optionElement-&gt;selected()) {
&gt; +                index = i;
&gt; +                found = true;
&gt; +            }

In a follow up, we should iterate through options backwards so that we wouldn&apos;t need these two variables.

&gt; Source/WebCore/rendering/RenderListBox.cpp:168
&gt; -    SelectElement* select = toSelectElement(static_cast&lt;Element*&gt;(node()));
&gt; +    HTMLSelectElement* select = toSelectElement(static_cast&lt;Element*&gt;(node()));

It looks silly to cast node to Element* and then call toSelectElement. Can we make toSelectElement take Node* instead?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>479757</commentid>
    <comment_count>4</comment_count>
      <attachid>109948</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2011-10-06 20:12:40 -0700</bug_when>
    <thetext>Comment on attachment 109948
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=109948&amp;action=review

&gt;&gt; Source/WebCore/ChangeLog:8
&gt;&gt; +        SelectElement used to be an abstraction class for
&gt; 
&gt; Nit: abstract class.

done.

&gt;&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:1149
&gt;&gt; +        HTMLSelectElement* selectNode = static_cast&lt;HTMLSelectElement*&gt;(m_renderer-&gt;node());
&gt; 
&gt; I&apos;d like to see a type check here just to be safe. You can add toHTMLSelectElement.

done.

&gt;&gt; Source/WebCore/html/HTMLSelectElement.cpp:675
&gt;&gt; +        cachedStateForActiveSelection.append(optionElement &amp;&amp; optionElement-&gt;selected());
&gt; 
&gt; Seems like these two lines can be merged into one line?

I don&apos;t think so.

&gt;&gt; Source/WebCore/html/HTMLSelectElement.cpp:729
&gt;&gt; +        bool selected = optionElement &amp;&amp;  optionElement-&gt;selected();
&gt; 
&gt; Nit: 2 spaces after &amp;&amp;.

Fixed.

&gt;&gt; Source/WebCore/html/HTMLSelectElement.cpp:912
&gt;&gt; +    }
&gt; 
&gt; Huh... this loop is almost identical to the one in listToOptionIndex except it&apos;s written in such a convoluted way.

I don&apos;t think so.

&gt;&gt; Source/WebCore/html/HTMLSelectElement.cpp:945
&gt;&gt; +    // made. This matches other browsers&apos; behavior.
&gt; 
&gt; Nit: please put &quot;made.&quot; on the previous line to avoid the awkward wrapping.

done.

&gt;&gt; Source/WebCore/html/HTMLSelectElement.cpp:1106
&gt;&gt; +        bool handled = false;
&gt; 
&gt; Can we initialize this to true?

Done.

&gt;&gt; Source/WebCore/html/HTMLSelectElement.cpp:1231
&gt;&gt; +                                        bool multi, bool shift)
&gt; 
&gt; Nit: wrong indentation.

Done.

&gt;&gt; Source/WebCore/html/HTMLSelectElement.cpp:1282
&gt;&gt; +void HTMLSelectElement::listBoxDefaultEventHandler(SelectElementData&amp; data, Element* element, Event* event, HTMLFormElement* htmlForm)
&gt; 
&gt; This function needs a massive refactoring :(

I agree.  I&apos;ll handle later.

&gt;&gt; Source/WebCore/html/HTMLSelectElement.cpp:1440
&gt;&gt; +    // return the number of the last option selected
&gt; 
&gt; Nit: s/number/index/

I removed this comment.

&gt;&gt; Source/WebCore/html/HTMLSelectElement.cpp:1449
&gt;&gt; +            }
&gt; 
&gt; In a follow up, we should iterate through options backwards so that we wouldn&apos;t need these two variables.

I added a FIXME comment.

&gt;&gt; Source/WebCore/rendering/RenderListBox.cpp:168
&gt;&gt; +    HTMLSelectElement* select = toSelectElement(static_cast&lt;Element*&gt;(node()));
&gt; 
&gt; It looks silly to cast node to Element* and then call toSelectElement. Can we make toSelectElement take Node* instead?

I&apos;ll handle it later.
IMO, RenderListBox and RenderMenuList should have selectElement() member function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>479760</commentid>
    <comment_count>5</comment_count>
      <attachid>110083</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2011-10-06 20:20:29 -0700</bug_when>
    <thetext>Created attachment 110083
Patch for landing

Windows and GTK build fixes, and so on.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>479807</commentid>
    <comment_count>6</comment_count>
      <attachid>110083</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2011-10-06 22:53:16 -0700</bug_when>
    <thetext>Comment on attachment 110083
Patch for landing

Attachment 110083 did not pass gtk-ews (gtk):
Output: http://queues.webkit.org/results/10010097</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>479813</commentid>
    <comment_count>7</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2011-10-06 23:04:20 -0700</bug_when>
    <thetext>Committed r96907: &lt;http://trac.webkit.org/changeset/96907&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109948</attachid>
            <date>2011-10-06 05:40:39 -0700</date>
            <delta_ts>2011-10-06 20:20:22 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-69518-20111006214037.patch</filename>
            <type>text/plain</type>
            <size>131000</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTY3OTYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAyYzg1ZGQ3MGUyZTdjM2I0
MDJiYzViZWZmNGFlMmVhMGRlNTlmY2JlLi4xNWJmM2ViOTAyNDA0ZTk0MTc1ZjY3ZWZiZGUzZmFi
OTlhNTM4MWY0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTE1IEBACisyMDExLTEwLTA2ICBLZW50
IFRhbXVyYSAgPHRrZW50QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZW1vdmUgU2VsZWN0RWxl
bWVudCBjbGFzcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9Njk1MTgKKyAgICAgICAgCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFNlbGVjdEVsZW1lbnQgdXNlZCB0byBiZSBhbiBhYnN0cmFjdGlvbiBjbGFzcyBm
b3IKKyAgICAgICAgSFRNTFNlbGVjdEVsZW1lbnQgYW5kIFdNTFNlbGVjdEVsZW1lbnQuIFNlbGVj
dEVsZW1lbnQgaXMgbm90CisgICAgICAgIG5lZWRlZCBhbnltb3JlIGJlY2F1c2UgV01MIHdhcyBy
ZW1vdmVkLgorCisgICAgICAgIFRoaXMgcGF0Y2gganVzdCByZW1vdmVzIFNlbGVjdEVsZW1lbnQg
YnkgbW92aW5nIFNlbGVjdEVsZW1lbnQKKyAgICAgICAgZnVuY3Rpb25zIHRvIEhUTUxTZWxlY3RF
bGVtZW50LgorCisgICAgICAgIE5vIG5ldyB0ZXN0cy4gSnVzdCBhIHJlZmFjdG9yaW5nLgorCisg
ICAgICAgICogYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TGlzdEJveE9wdGlvbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5TGlzdEJveE9wdGlvbjo6c2V0U2VsZWN0ZWQp
OgorICAgICAgICBSZW1vdmUgdW5uZWNlc3NhcnkgY2FzdC4KKyAgICAgICAgKiBhY2Nlc3NpYmls
aXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QWNj
ZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6c3RyaW5nVmFsdWUpOgorICAgICAgICBVc2UgSFRNTFNl
bGVjdEVsZW1lbnQgaW5zdGVhZCBvZiBTZWxlY3RFbGVtZW50LgorICAgICAgICAqIGRvbS9PcHRp
b25FbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok9wdGlvbkVsZW1lbnQ6Om9wdGlvbklu
ZGV4KTogZGl0dG8uCisgICAgICAgICogZG9tL09wdGlvbkVsZW1lbnQuaDogZGl0dG8uCisgICAg
ICAgICogZG9tL1NlbGVjdEVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxl
bWVudERhdGE6OmNoZWNrTGlzdEl0ZW1zKTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpTZWxl
Y3RFbGVtZW50RGF0YTo6bGlzdEl0ZW1zKTogZGl0dG8uCisgICAgICAgICogZG9tL1NlbGVjdEVs
ZW1lbnQuaDogUmVtb3ZlZCBTZWxlY3RFbGVtZW50IGNsYXNzIGRlY2xhcmF0aW9uLgorICAgICAg
ICAqIGh0bWwvSFRNTFNlbGVjdEVsZW1lbnQuY3BwOiBNb3ZlIGZ1bmN0aW9ucyBmcm9tIFNlbGVj
dEVsZW1lbnQuY3BwLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNlbGVj
dGVkSW5kZXgpOgorICAgICAgICBSZW1vdmVkICdTZWxlY3RFbGVtZW50OjonIGJlY2F1c2UgdGhl
IGZ1bmN0aW9uIGlzIG1vdmVkIHRvIEhUTUxTZWxlY3RFbGVtZW50LgorICAgICAgICAoV2ViQ29y
ZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmRlc2VsZWN0SXRlbXMpOiBkaXRvLgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNldFNlbGVjdGVkSW5kZXgpOiBkaXRvLgorICAgICAg
ICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNldFNlbGVjdGVkSW5kZXhCeVVzZXIpOiBk
aXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjphY3RpdmVTZWxlY3Rp
b25FbmRMaXN0SW5kZXgpOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVt
ZW50OjpsZW5ndGgpOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50
OjpzYXZlRm9ybUNvbnRyb2xTdGF0ZSk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNl
bGVjdEVsZW1lbnQ6OnJlc3RvcmVGb3JtQ29udHJvbFN0YXRlKTogZGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUpOiBkaXR0by4K
KyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpzZWxlY3RBbGwpOiBkaXR0by4K
KyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjphcHBlbmRGb3JtRGF0YSk6IGRp
dHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6Om9wdGlvblRvTGlzdElu
ZGV4KTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6bGlzdFRv
T3B0aW9uSW5kZXgpOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50
OjpyZWNhbGNMaXN0SXRlbXMpOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RF
bGVtZW50OjpzZXRSZWNhbGNMaXN0SXRlbXMpOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxTZWxlY3RFbGVtZW50OjpyZXNldCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNl
bGVjdEVsZW1lbnQ6OmRpc3BhdGNoRm9jdXNFdmVudCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29y
ZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OmRpc3BhdGNoQmx1ckV2ZW50KTogZGl0dG8uCisgICAgICAg
IChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6ZGVmYXVsdEV2ZW50SGFuZGxlcik6IGRpdHRv
LgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNldEFjdGl2ZVNlbGVjdGlv
bkFuY2hvckluZGV4KTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVu
dDo6c2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgpOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxTZWxlY3RFbGVtZW50Ojp1cGRhdGVMaXN0Qm94U2VsZWN0aW9uKTogZGl0dG8uCisgICAg
ICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6bWVudUxpc3RPbkNoYW5nZSk6IGRpdHRv
LgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6Omxpc3RCb3hPbkNoYW5nZSk6
IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNhdmVMYXN0U2Vs
ZWN0aW9uKTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6YWNj
ZXNzS2V5U2V0U2VsZWN0ZWRJbmRleCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNl
bGVjdEVsZW1lbnQ6OnNjcm9sbFRvU2VsZWN0aW9uKTogZGl0dG8uCisgICAgICAgIChXZWJDb3Jl
OjpIVE1MU2VsZWN0RWxlbWVudDo6aW5zZXJ0ZWRJbnRvVHJlZSk6IGRpdHRvLgorICAgICAgICAo
V2ViQ29yZTo6bmV4dFZhbGlkSW5kZXgpOiBNb3ZlZCBmcm9tIFNlbGVjdEVsZW1lbnQuY3BwLgor
ICAgICAgICAoV2ViQ29yZTo6bmV4dFNlbGVjdGFibGVMaXN0SW5kZXgpOiBkaXR0by4KKyAgICAg
ICAgKFdlYkNvcmU6OnByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleCk6IGRpdHRvLgorICAgICAg
ICAoV2ViQ29yZTo6Zmlyc3RTZWxlY3RhYmxlTGlzdEluZGV4KTogZGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpsYXN0U2VsZWN0YWJsZUxpc3RJbmRleCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29y
ZTo6bmV4dFNlbGVjdGFibGVMaXN0SW5kZXhQYWdlQXdheSk6IGRpdHRvLgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNldE9wdGlvbnNDaGFuZ2VkT25SZW5kZXJlcik6IGRp
dHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnBhcnNlTXVsdGlwbGVB
dHRyaWJ1dGUpOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50Ojpw
bGF0Zm9ybUhhbmRsZUtleWRvd25FdmVudCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRN
TFNlbGVjdEVsZW1lbnQ6Om1lbnVMaXN0RGVmYXVsdEV2ZW50SGFuZGxlcik6IGRpdHRvLgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnVwZGF0ZVNlbGVjdGVkU3RhdGUpOiBk
aXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpsaXN0Qm94RGVmYXVs
dEV2ZW50SGFuZGxlcik6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1l
bnQ6Omxhc3RTZWxlY3RlZExpc3RJbmRleCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6c3Ry
aXBMZWFkaW5nV2hpdGVTcGFjZSk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVj
dEVsZW1lbnQ6OnR5cGVBaGVhZEZpbmQpOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxT
ZWxlY3RFbGVtZW50OjpvcHRpb25Db3VudCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6dG9T
ZWxlY3RFbGVtZW50KTogZGl0dG8uCisgICAgICAgICogaHRtbC9IVE1MU2VsZWN0RWxlbWVudC5o
OiBSZW1vdmVkICd2aXJ0dWFsJyBvZiBTZWxlY3RFbGVtZW50IGZ1bmN0aW9ucy4KKyAgICAgICAg
KFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpzaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxTZWxlY3RFbGVtZW50OjptdWx0aXBsZSk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0
RWxlbWVudDo6bGlzdEl0ZW1zKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50
Ojp1cGRhdGVWYWxpZGl0eSk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckxpc3RCb3guY3Bw
OiBSZXBsYWNlIFNlbGVjdEVsZW1lbnQgd2l0aCBIVE1MU2VsZWN0RWxlbWVudAorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6UmVuZGVyTGlzdEJveCk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJMaXN0Qm94OjpzY3JvbGxUb1JldmVhbFNlbGVjdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJMaXN0Qm94OjphZGRGb2N1c1JpbmdSZWN0cyk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJMaXN0Qm94OjpwYWludEl0ZW1Gb3JlZ3JvdW5kKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlckxpc3RCb3g6OnBhaW50SXRlbUJhY2tncm91bmQpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyTGlzdEJveDo6cGFuU2Nyb2xsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxpc3RC
b3g6OmF1dG9zY3JvbGwpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6dmFsdWVD
aGFuZ2VkKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyTWVudUxpc3QuY3BwOiBSZXBsYWNl
IFNlbGVjdEVsZW1lbnQgd2l0aCBIVE1MU2VsZWN0RWxlbWVudAorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyTWVudUxpc3Q6OlJlbmRlck1lbnVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ck1lbnVMaXN0OjpzZXRUZXh0RnJvbU9wdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJN
ZW51TGlzdDo6c2hvd1BvcHVwKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0Ojp2
YWx1ZUNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWVudUxpc3Q6Omxpc3RCb3hT
ZWxlY3RJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0OjptdWx0aXBsZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNZW51TGlzdDo6ZGlkU2V0U2VsZWN0ZWRJbmRleCk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNZW51TGlzdDo6ZGlkVXBkYXRlQWN0aXZlT3B0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0OjppdGVtVGV4dCk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJNZW51TGlzdDo6aXRlbUFjY2Vzc2liaWxpdHlUZXh0KToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0OjppdGVtVG9vbFRpcCk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJNZW51TGlzdDo6aXRlbUlzRW5hYmxlZCk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJNZW51TGlzdDo6aXRlbVN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVM
aXN0OjppdGVtQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVM
aXN0OjpsaXN0U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNZW51TGlzdDo6c2VsZWN0
ZWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNZW51TGlzdDo6aXRlbUlzU2VwYXJh
dG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0OjppdGVtSXNMYWJlbCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJNZW51TGlzdDo6aXRlbUlzU2VsZWN0ZWQpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyTWVudUxpc3Q6OnNldFRleHRGcm9tSXRlbSk6CisKIDIwMTEtMTAt
MDMgIEhhbnMgV2VubmJvcmcgIDxoYW5zQGNocm9taXVtLm9yZz4KIAogICAgICAgICBJbmRleGVk
REI6IFJlbW92ZSBTUUxpdGUtTGV2ZWxEQiBtaWdyYXRpb24gY29kZQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TGlzdEJveE9wdGlvbi5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlMaXN0Qm94T3B0aW9u
LmNwcAppbmRleCBhMjA3ODJhMzc0ODM2ZjI3ZDA3NDg1OGQ2MTNlNmRhNGI1MDhhZTEyLi4yYWIw
ODE0M2M2NjE0ODM0MjQ2MmNlYTI2NzZjNTY5ZDA4MzJjZjRmIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlMaXN0Qm94T3B0aW9uLmNwcAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlMaXN0Qm94T3B0aW9u
LmNwcApAQCAtMTgwLDcgKzE4MCw3IEBAIHZvaWQgQWNjZXNzaWJpbGl0eUxpc3RCb3hPcHRpb246
OnNldFNlbGVjdGVkKGJvb2wgc2VsZWN0ZWQpCiAgICAgICAgIHJldHVybjsKICAgICAKICAgICAv
LyBDb252ZXJ0IGZyb20gdGhlIGVudGlyZSBsaXN0IGluZGV4IHRvIHRoZSBvcHRpb24gaW5kZXgu
Ci0gICAgaW50IG9wdGlvbkluZGV4ID0gc3RhdGljX2Nhc3Q8U2VsZWN0RWxlbWVudCo+KHNlbGVj
dEVsZW1lbnQpLT5saXN0VG9PcHRpb25JbmRleChsaXN0Qm94T3B0aW9uSW5kZXgoKSk7CisgICAg
aW50IG9wdGlvbkluZGV4ID0gc2VsZWN0RWxlbWVudC0+bGlzdFRvT3B0aW9uSW5kZXgobGlzdEJv
eE9wdGlvbkluZGV4KCkpOwogICAgIHNlbGVjdEVsZW1lbnQtPmFjY2Vzc0tleVNldFNlbGVjdGVk
SW5kZXgob3B0aW9uSW5kZXgpOwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwIGIvU291cmNlL1dlYkNvcmUv
YWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAppbmRleCAwMjRkYTdk
ZDQzNTMyNzMyOTQwZmQ3MTc0ZGVjNDk4YjQ2Y2E1YTNlLi4wMjM1YTRmZWMzYWQ3OWM2MDU1ODMy
YzIwMzc1ZDQzZDdkNjI4NGZhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Fj
Y2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAKQEAgLTc0LDcgKzc0LDYg
QEAKICNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSAiUmVuZGVyV2lkZ2V0LmgiCiAj
aW5jbHVkZSAiUmVuZGVyZWRQb3NpdGlvbi5oIgotI2luY2x1ZGUgIlNlbGVjdEVsZW1lbnQuaCIK
ICNpbmNsdWRlICJUZXh0LmgiCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAi
aHRtbGVkaXRpbmcuaCIKQEAgLTExNDcsNyArMTE0Niw3IEBAIFN0cmluZyBBY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0OjpzdHJpbmdWYWx1ZSgpIGNvbnN0CiAgICAgaWYgKGNzc0JveCAmJiBjc3NC
b3gtPmlzTWVudUxpc3QoKSkgewogICAgICAgICAvLyBSZW5kZXJNZW51TGlzdCB3aWxsIGdvIHN0
cmFpZ2h0IHRvIHRoZSB0ZXh0KCkgb2YgaXRzIHNlbGVjdGVkIGl0ZW0uCiAgICAgICAgIC8vIFRo
aXMgaGFzIHRvIGJlIG92ZXJyaWRlbiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc2VsZWN0ZWQgaXRl
bSBoYXMgYW4gYXJpYSBsYWJlbAotICAgICAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3ROb2RlID0g
dG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihtX3JlbmRlcmVyLT5ub2RlKCkp
KTsKKyAgICAgICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdE5vZGUgPSBzdGF0aWNfY2FzdDxI
VE1MU2VsZWN0RWxlbWVudCo+KG1fcmVuZGVyZXItPm5vZGUoKSk7CiAgICAgICAgIGludCBzZWxl
Y3RlZEluZGV4ID0gc2VsZWN0Tm9kZS0+c2VsZWN0ZWRJbmRleCgpOwogICAgICAgICBjb25zdCBW
ZWN0b3I8RWxlbWVudCo+IGxpc3RJdGVtcyA9IHNlbGVjdE5vZGUtPmxpc3RJdGVtcygpOwogICAg
ICAgICAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9PcHRpb25FbGVtZW50LmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2RvbS9PcHRpb25FbGVtZW50LmNwcAppbmRleCA4M2QyNTFjM2ZlZWQ5
YjI1NGFhYTdjOGE2YzY1OThlY2Y3MGUwN2M2Li44MDVkZjFjNGI1ZjQzNTY5ODc3MzQ4ZDc2MWM2
ZGFhNmZjZTAwMTkyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vT3B0aW9uRWxlbWVu
dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvZG9tL09wdGlvbkVsZW1lbnQuY3BwCkBAIC0yNiw2
ICsyNiw3IEBACiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiSFRNTE9wdGlvbkVs
ZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MUGFyc2VySWRpb21zLmgiCisjaW5jbHVkZSAiSFRNTFNl
bGVjdEVsZW1lbnQuaCIKICNpbmNsdWRlICJPcHRpb25Hcm91cEVsZW1lbnQuaCIKICNpbmNsdWRl
ICJTY3JpcHRFbGVtZW50LmgiCiAjaW5jbHVkZSAiU2VsZWN0RWxlbWVudC5oIgpAQCAtNDIsNyAr
NDMsNyBAQCB2b2lkIE9wdGlvbkVsZW1lbnQ6OnNldFNlbGVjdGVkU3RhdGUoT3B0aW9uRWxlbWVu
dERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsCiAgICAgZWxlbWVudC0+c2V0TmVlZHNTdHls
ZVJlY2FsYygpOwogfQogCi1pbnQgT3B0aW9uRWxlbWVudDo6b3B0aW9uSW5kZXgoU2VsZWN0RWxl
bWVudCogc2VsZWN0RWxlbWVudCwgY29uc3QgRWxlbWVudCogZWxlbWVudCkKK2ludCBPcHRpb25F
bGVtZW50OjpvcHRpb25JbmRleChIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0RWxlbWVudCwgY29u
c3QgRWxlbWVudCogZWxlbWVudCkKIHsKICAgICBpZiAoIXNlbGVjdEVsZW1lbnQpCiAgICAgICAg
IHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL09wdGlvbkVsZW1lbnQu
aCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9PcHRpb25FbGVtZW50LmgKaW5kZXggYTgzYjkzNTNjOGVl
MDEyZmMwNTYyMWFjMmU1OWU3MTFlYzE2YmJkNy4uOTVmM2VlMzk3NDBmYjA4NWYzZWYyY2U2N2Y1
YjgxZDhmMjk3YzEwMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZG9tL09wdGlvbkVsZW1l
bnQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vT3B0aW9uRWxlbWVudC5oCkBAIC0yNyw4ICsy
Nyw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgRWxlbWVudDsKIGNsYXNzIERvY3Vt
ZW50OworY2xhc3MgSFRNTFNlbGVjdEVsZW1lbnQ7CiBjbGFzcyBPcHRpb25FbGVtZW50RGF0YTsK
LWNsYXNzIFNlbGVjdEVsZW1lbnQ7CiAKIGNsYXNzIE9wdGlvbkVsZW1lbnQgewogcHVibGljOgpA
QCAtNDQsNyArNDQsNyBAQCBwdWJsaWM6CiAKIHByb3RlY3RlZDoKICAgICBzdGF0aWMgdm9pZCBz
ZXRTZWxlY3RlZFN0YXRlKE9wdGlvbkVsZW1lbnREYXRhJiwgRWxlbWVudCosIGJvb2wgc2VsZWN0
ZWQpOwotICAgIHN0YXRpYyBpbnQgb3B0aW9uSW5kZXgoU2VsZWN0RWxlbWVudCosIGNvbnN0IEVs
ZW1lbnQqKTsKKyAgICBzdGF0aWMgaW50IG9wdGlvbkluZGV4KEhUTUxTZWxlY3RFbGVtZW50Kiwg
Y29uc3QgRWxlbWVudCopOwogICAgIHN0YXRpYyBTdHJpbmcgY29sbGVjdE9wdGlvbkxhYmVsT3JU
ZXh0KGNvbnN0IE9wdGlvbkVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCopOwogICAgIHN0YXRp
YyBTdHJpbmcgY29sbGVjdE9wdGlvblRleHRSZXNwZWN0aW5nR3JvdXBMYWJlbChjb25zdCBPcHRp
b25FbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqKTsKICAgICBzdGF0aWMgU3RyaW5nIGNvbGxl
Y3RPcHRpb25WYWx1ZShjb25zdCBPcHRpb25FbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqKTsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2RvbS9TZWxlY3RFbGVtZW50LmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2RvbS9TZWxlY3RFbGVtZW50LmNwcAppbmRleCBjZmQ2OWUwZDA0YzQ2MGMxZGYz
NzNhNjQwMGQ1MmYyMGZlYTliYTRjLi4zNGEzM2EwOGJkNmMzNWIxY2MxMjllOTMwYzkxZDJmOGIx
ZjZjZDljIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vU2VsZWN0RWxlbWVudC5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvZG9tL1NlbGVjdEVsZW1lbnQuY3BwCkBAIC00NSwxOSArNDUs
NiBAQAogI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CiAjaW5jbHVkZSA8d3RmL3VuaWNvZGUv
Q2hhcmFjdGVyTmFtZXMuaD4KIAotLy8gQ29uZmlndXJlIHBsYXRmb3JtLXNwZWNpZmljIGJlaGF2
aW9yIHdoZW4gZm9jdXNlZCBwb3AtdXAgcmVjZWl2ZXMgYXJyb3cvc3BhY2UvcmV0dXJuIGtleXN0
cm9rZS4KLS8vIChQTEFURk9STShNQUMpIGFuZCBQTEFURk9STShHVEspIGFyZSBhbHdheXMgZmFs
c2UgaW4gQ2hyb21pdW0sIGhlbmNlIHRoZSBleHRyYSB0ZXN0cy4pCi0jaWYgUExBVEZPUk0oTUFD
KSB8fCAoUExBVEZPUk0oQ0hST01JVU0pICYmIE9TKERBUldJTikpCi0jZGVmaW5lIEFSUk9XX0tF
WVNfUE9QX01FTlUgMQotI2RlZmluZSBTUEFDRV9PUl9SRVRVUk5fUE9QX01FTlUgMAotI2VsaWYg
UExBVEZPUk0oR1RLKSB8fCAoUExBVEZPUk0oQ0hST01JVU0pICYmIE9TKFVOSVgpKQotI2RlZmlu
ZSBBUlJPV19LRVlTX1BPUF9NRU5VIDAKLSNkZWZpbmUgU1BBQ0VfT1JfUkVUVVJOX1BPUF9NRU5V
IDEKLSNlbHNlCi0jZGVmaW5lIEFSUk9XX0tFWVNfUE9QX01FTlUgMAotI2RlZmluZSBTUEFDRV9P
Ul9SRVRVUk5fUE9QX01FTlUgMAotI2VuZGlmCi0KIHVzaW5nIHN0ZDo6bWluOwogdXNpbmcgc3Rk
OjptYXg7CiB1c2luZyBuYW1lc3BhY2UgV1RGOwpAQCAtNjUsOTg5ICs1Miw2IEBAIHVzaW5nIG5h
bWVzcGFjZSBVbmljb2RlOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXN0YXRpYyBjb25zdCBE
T01UaW1lU3RhbXAgdHlwZUFoZWFkVGltZW91dCA9IDEwMDA7Ci0KLWVudW0gU2tpcERpcmVjdGlv
biB7Ci0gICAgU2tpcEJhY2t3YXJkcyA9IC0xLAotICAgIFNraXBGb3J3YXJkcyA9IDEKLX07Ci0K
LS8vIFJldHVybnMgdGhlIDFzdCB2YWxpZCBpdGVtIHxza2lwfCBpdGVtcyBmcm9tIHxsaXN0SW5k
ZXh8IGluIGRpcmVjdGlvbiB8ZGlyZWN0aW9ufCBpZiB0aGVyZSBpcyBvbmUuCi0vLyBPdGhlcndp
c2UsIGl0IHJldHVybnMgdGhlIHZhbGlkIGl0ZW0gY2xvc2VzdCB0byB0aGF0IGJvdW5kYXJ5IHdo
aWNoIGlzIHBhc3QgfGxpc3RJbmRleHwgaWYgdGhlcmUgaXMgb25lLgotLy8gT3RoZXJ3aXNlLCBp
dCByZXR1cm5zIHxsaXN0SW5kZXh8LgotLy8gVmFsaWQgbWVhbnMgdGhhdCBpdCBpcyBlbmFibGVk
IGFuZCBhbiBvcHRpb24gZWxlbWVudC4KLXN0YXRpYyBpbnQgbmV4dFZhbGlkSW5kZXgoY29uc3Qg
VmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zLCBpbnQgbGlzdEluZGV4LCBTa2lwRGlyZWN0aW9u
IGRpcmVjdGlvbiwgaW50IHNraXApCi17Ci0gICAgQVNTRVJUKGRpcmVjdGlvbiA9PSAtMSB8fCBk
aXJlY3Rpb24gPT0gMSk7Ci0gICAgaW50IGxhc3RHb29kSW5kZXggPSBsaXN0SW5kZXg7Ci0gICAg
aW50IHNpemUgPSBsaXN0SXRlbXMuc2l6ZSgpOwotICAgIGZvciAobGlzdEluZGV4ICs9IGRpcmVj
dGlvbjsgbGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgc2l6ZTsgbGlzdEluZGV4ICs9IGRp
cmVjdGlvbikgewotICAgICAgICAtLXNraXA7Ci0gICAgICAgIGlmICghbGlzdEl0ZW1zW2xpc3RJ
bmRleF0tPmRpc2FibGVkKCkgJiYgaXNPcHRpb25FbGVtZW50KGxpc3RJdGVtc1tsaXN0SW5kZXhd
KSkgewotICAgICAgICAgICAgbGFzdEdvb2RJbmRleCA9IGxpc3RJbmRleDsKLSAgICAgICAgICAg
IGlmIChza2lwIDw9IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgcmV0dXJuIGxhc3RHb29kSW5kZXg7Ci19Ci0KLXN0YXRpYyBpbnQgbmV4dFNlbGVjdGFi
bGVMaXN0SW5kZXgoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGlu
dCBzdGFydEluZGV4KQotewotICAgIHJldHVybiBuZXh0VmFsaWRJbmRleChkYXRhLmxpc3RJdGVt
cyhlbGVtZW50KSwgc3RhcnRJbmRleCwgU2tpcEZvcndhcmRzLCAxKTsKLX0KLQotc3RhdGljIGlu
dCBwcmV2aW91c1NlbGVjdGFibGVMaXN0SW5kZXgoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVs
ZW1lbnQqIGVsZW1lbnQsIGludCBzdGFydEluZGV4KQotewotICAgIGlmIChzdGFydEluZGV4ID09
IC0xKQotICAgICAgICBzdGFydEluZGV4ID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCkuc2l6ZSgp
OwotICAgIHJldHVybiBuZXh0VmFsaWRJbmRleChkYXRhLmxpc3RJdGVtcyhlbGVtZW50KSwgc3Rh
cnRJbmRleCwgU2tpcEJhY2t3YXJkcywgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgZmlyc3RTZWxlY3Rh
YmxlTGlzdEluZGV4KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQot
ewotICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxl
bWVudCk7Ci0gICAgaW50IGluZGV4ID0gbmV4dFZhbGlkSW5kZXgoaXRlbXMsIGl0ZW1zLnNpemUo
KSwgU2tpcEJhY2t3YXJkcywgSU5UX01BWCk7Ci0gICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVk
PihpbmRleCkgPT0gaXRlbXMuc2l6ZSgpKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgcmV0dXJu
IGluZGV4OwotfQotCi1zdGF0aWMgaW50IGxhc3RTZWxlY3RhYmxlTGlzdEluZGV4KFNlbGVjdEVs
ZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIHJldHVybiBuZXh0VmFs
aWRJbmRleChkYXRhLmxpc3RJdGVtcyhlbGVtZW50KSwgLTEsIFNraXBGb3J3YXJkcywgSU5UX01B
WCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHZhbGlkIGl0ZW0gb25l
IHBhZ2UgYXdheSBmcm9tIHxzdGFydEluZGV4fCBpbiBkaXJlY3Rpb24gfGRpcmVjdGlvbnwuCi1z
dGF0aWMgaW50IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4UGFnZUF3YXkoU2VsZWN0RWxlbWVudERh
dGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBzdGFydEluZGV4LCBTa2lwRGlyZWN0aW9u
IGRpcmVjdGlvbikKLXsKLSAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEu
bGlzdEl0ZW1zKGVsZW1lbnQpOwotICAgIC8vIENhbid0IHVzZSBkYXRhLT5zaXplKCkgYmVjYXVz
ZSByZW5kZXJlciBmb3JjZXMgYSBtaW5pbXVtIHNpemUuCi0gICAgaW50IHBhZ2VTaXplID0gMDsK
LSAgICBpZiAoZWxlbWVudC0+cmVuZGVyZXIoKS0+aXNMaXN0Qm94KCkpCi0gICAgICAgIHBhZ2VT
aXplID0gdG9SZW5kZXJMaXN0Qm94KGVsZW1lbnQtPnJlbmRlcmVyKCkpLT5zaXplKCkgLSAxOyAv
LyAtMSBzbyB3ZSBzdGlsbCBzaG93IGNvbnRleHQKLQotICAgIC8vIE9uZSBwYWdlIGF3YXksIGJ1
dCBub3Qgb3V0c2lkZSB2YWxpZCBib3VuZHMuCi0gICAgLy8gSWYgdGhlcmUgaXMgYSB2YWxpZCBv
cHRpb24gaXRlbSBvbmUgcGFnZSBhd2F5LCB0aGUgaW5kZXggaXMgY2hvc2VuLgotICAgIC8vIElm
IHRoZXJlIGlzIG5vIGV4YWN0IG9uZSBwYWdlIGF3YXkgdmFsaWQgb3B0aW9uLCByZXR1cm5zIHN0
YXJ0SW5kZXggb3IgdGhlIG1vc3QgZmFyIGluZGV4LgotICAgIGludCBlZGdlSW5kZXggPSAoZGly
ZWN0aW9uID09IFNraXBGb3J3YXJkcykgPyAwIDogKGl0ZW1zLnNpemUoKSAtIDEpOwotICAgIGlu
dCBza2lwQW1vdW50ID0gcGFnZVNpemUgKyAoKGRpcmVjdGlvbiA9PSBTa2lwRm9yd2FyZHMpID8g
c3RhcnRJbmRleCA6IChlZGdlSW5kZXggLSBzdGFydEluZGV4KSk7Ci0gICAgcmV0dXJuIG5leHRW
YWxpZEluZGV4KGl0ZW1zLCBlZGdlSW5kZXgsIGRpcmVjdGlvbiwgc2tpcEFtb3VudCk7Ci19Ci0K
LXZvaWQgU2VsZWN0RWxlbWVudDo6c2VsZWN0QWxsKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBF
bGVtZW50KiBlbGVtZW50KQotewotICAgIEFTU0VSVCghZGF0YS51c2VzTWVudUxpc3QoKSk7Ci0g
ICAgaWYgKCFlbGVtZW50LT5yZW5kZXJlcigpIHx8ICFkYXRhLm11bHRpcGxlKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIC8vIFNhdmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFy
ZWQgdG8gdGhlIG5ldyBzZWxlY3RBbGwgc2VsZWN0aW9uIHdoZW4gZGlzcGF0Y2hpbmcgY2hhbmdl
IGV2ZW50cwotICAgIHNhdmVMYXN0U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOwotCi0gICAgZGF0
YS5zZXRBY3RpdmVTZWxlY3Rpb25TdGF0ZSh0cnVlKTsKLSAgICBzZXRBY3RpdmVTZWxlY3Rpb25B
bmNob3JJbmRleChkYXRhLCBlbGVtZW50LCBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBl
bGVtZW50LCAtMSkpOwotICAgIHNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGRhdGEsIHByZXZp
b3VzU2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBlbGVtZW50LCAtMSkpOwotCi0gICAgdXBkYXRl
TGlzdEJveFNlbGVjdGlvbihkYXRhLCBlbGVtZW50LCBmYWxzZSk7Ci0gICAgbGlzdEJveE9uQ2hh
bmdlKGRhdGEsIGVsZW1lbnQpOwotfQotCi12b2lkIFNlbGVjdEVsZW1lbnQ6OnNhdmVMYXN0U2Vs
ZWN0aW9uKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQotewotICAg
IGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKSB7Ci0gICAgICAgIGRhdGEuc2V0TGFzdE9uQ2hhbmdl
SW5kZXgoc2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50KSk7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0KLSAgICBWZWN0b3I8Ym9vbD4mIGxhc3RPbkNoYW5nZVNlbGVjdGlvbiA9IGRhdGEubGFz
dE9uQ2hhbmdlU2VsZWN0aW9uKCk7IAotICAgIGxhc3RPbkNoYW5nZVNlbGVjdGlvbi5jbGVhcigp
OwotCi0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhl
bGVtZW50KTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kp
IHsKLSAgICAgICAgT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVu
dChpdGVtc1tpXSk7Ci0gICAgICAgIGxhc3RPbkNoYW5nZVNlbGVjdGlvbi5hcHBlbmQob3B0aW9u
RWxlbWVudCAmJiBvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpKTsKLSAgICB9Ci19Ci0KLXZvaWQg
U2VsZWN0RWxlbWVudDo6c2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoU2VsZWN0RWxlbWVu
dERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBpbmRleCkKLXsKLSAgICBkYXRhLnNl
dEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGluZGV4KTsKLQotICAgIC8vIENhY2hlIHRoZSBz
ZWxlY3Rpb24gc3RhdGUgc28gd2UgY2FuIHJlc3RvcmUgdGhlIG9sZCBzZWxlY3Rpb24gYXMgdGhl
IG5ldyBzZWxlY3Rpb24gcGl2b3RzIGFyb3VuZCB0aGlzIGFuY2hvciBpbmRleAotICAgIFZlY3Rv
cjxib29sPiYgY2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24gPSBkYXRhLmNhY2hlZFN0YXRl
Rm9yQWN0aXZlU2VsZWN0aW9uKCk7IAotICAgIGNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9u
LmNsZWFyKCk7Ci0KLSAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlz
dEl0ZW1zKGVsZW1lbnQpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXpl
KCk7ICsraSkgewotICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRp
b25FbGVtZW50KGl0ZW1zW2ldKTsKLSAgICAgICAgY2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rp
b24uYXBwZW5kKG9wdGlvbkVsZW1lbnQgJiYgb3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSk7Ci0g
ICAgfQotfQotCi12b2lkIFNlbGVjdEVsZW1lbnQ6OnNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4
KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBpbnQgaW5kZXgpCi17Ci0gICAgZGF0YS5zZXRBY3Rp
dmVTZWxlY3Rpb25FbmRJbmRleChpbmRleCk7Ci19Ci0KLXZvaWQgU2VsZWN0RWxlbWVudDo6dXBk
YXRlTGlzdEJveFNlbGVjdGlvbihTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxl
bWVudCwgYm9vbCBkZXNlbGVjdE90aGVyT3B0aW9ucykKLXsKLSAgICBBU1NFUlQoZWxlbWVudC0+
cmVuZGVyZXIoKSAmJiAoZWxlbWVudC0+cmVuZGVyZXIoKS0+aXNMaXN0Qm94KCkgfHwgZGF0YS5t
dWx0aXBsZSgpKSk7Ci0gICAgQVNTRVJUKCFkYXRhLmxpc3RJdGVtcyhlbGVtZW50KS5zaXplKCkg
fHwgZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpID49IDApOwotCi0gICAgdW5zaWdu
ZWQgc3RhcnQgPSBtaW4oZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpLCBkYXRhLmFj
dGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkpOwotICAgIHVuc2lnbmVkIGVuZCA9IG1heChkYXRhLmFj
dGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KCksIGRhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgo
KSk7Ci0gICAgVmVjdG9yPGJvb2w+JiBjYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbiA9IGRh
dGEuY2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24oKTsKLQotICAgIGNvbnN0IFZlY3RvcjxF
bGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7Ci0gICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIE9wdGlvbkVsZW1l
bnQqIG9wdGlvbkVsZW1lbnQgPSB0b09wdGlvbkVsZW1lbnQoaXRlbXNbaV0pOwotICAgICAgICBp
ZiAoIW9wdGlvbkVsZW1lbnQgfHwgaXRlbXNbaV0tPmRpc2FibGVkKCkpCi0gICAgICAgICAgICBj
b250aW51ZTsKLQotICAgICAgICBpZiAoaSA+PSBzdGFydCAmJiBpIDw9IGVuZCkKLSAgICAgICAg
ICAgIG9wdGlvbkVsZW1lbnQtPnNldFNlbGVjdGVkU3RhdGUoZGF0YS5hY3RpdmVTZWxlY3Rpb25T
dGF0ZSgpKTsKLSAgICAgICAgZWxzZSBpZiAoZGVzZWxlY3RPdGhlck9wdGlvbnMgfHwgaSA+PSBj
YWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbi5zaXplKCkpCi0gICAgICAgICAgICBvcHRpb25F
bGVtZW50LT5zZXRTZWxlY3RlZFN0YXRlKGZhbHNlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgb3B0aW9uRWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZShjYWNoZWRTdGF0ZUZvckFjdGl2ZVNl
bGVjdGlvbltpXSk7Ci0gICAgfQotCi0gICAgdG9TZWxlY3RFbGVtZW50KGVsZW1lbnQpLT51cGRh
dGVWYWxpZGl0eSgpOwotICAgIHNjcm9sbFRvU2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOwotfQot
Ci12b2lkIFNlbGVjdEVsZW1lbnQ6Omxpc3RCb3hPbkNoYW5nZShTZWxlY3RFbGVtZW50RGF0YSYg
ZGF0YSwgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBBU1NFUlQoIWRhdGEudXNlc01lbnVMaXN0
KCkgfHwgZGF0YS5tdWx0aXBsZSgpKTsKLQotICAgIFZlY3Rvcjxib29sPiYgbGFzdE9uQ2hhbmdl
U2VsZWN0aW9uID0gZGF0YS5sYXN0T25DaGFuZ2VTZWxlY3Rpb24oKTsgCi0gICAgY29uc3QgVmVj
dG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLQotICAgIC8v
IElmIHRoZSBjYWNoZWQgc2VsZWN0aW9uIGxpc3QgaXMgZW1wdHksIG9yIHRoZSBzaXplIGhhcyBj
aGFuZ2VkLCB0aGVuIGZpcmUgZGlzcGF0Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50LCBhbmQgcmV0
dXJuIGVhcmx5LgotICAgIGlmIChsYXN0T25DaGFuZ2VTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IGxh
c3RPbkNoYW5nZVNlbGVjdGlvbi5zaXplKCkgIT0gaXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgIGVs
ZW1lbnQtPmRpc3BhdGNoRm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgLy8gVXBkYXRlIGxhc3RPbkNoYW5nZVNlbGVjdGlvbiBhbmQgZmlyZSBk
aXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQKLSAgICBib29sIGZpcmVPbkNoYW5nZSA9IGZh
bHNlOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgewot
ICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0
ZW1zW2ldKTsKLSAgICAgICAgYm9vbCBzZWxlY3RlZCA9IG9wdGlvbkVsZW1lbnQgJiYgIG9wdGlv
bkVsZW1lbnQtPnNlbGVjdGVkKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZCAhPSBsYXN0T25DaGFu
Z2VTZWxlY3Rpb25baV0pCi0gICAgICAgICAgICBmaXJlT25DaGFuZ2UgPSB0cnVlOwotICAgICAg
ICBsYXN0T25DaGFuZ2VTZWxlY3Rpb25baV0gPSBzZWxlY3RlZDsKLSAgICB9Ci0KLSAgICBpZiAo
ZmlyZU9uQ2hhbmdlKQotICAgICAgICBlbGVtZW50LT5kaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdl
RXZlbnQoKTsKLX0KLQotdm9pZCBTZWxlY3RFbGVtZW50OjptZW51TGlzdE9uQ2hhbmdlKFNlbGVj
dEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIEFTU0VSVChkYXRh
LnVzZXNNZW51TGlzdCgpKTsKLQotICAgIGludCBzZWxlY3RlZCA9IHNlbGVjdGVkSW5kZXgoZGF0
YSwgZWxlbWVudCk7Ci0gICAgaWYgKGRhdGEubGFzdE9uQ2hhbmdlSW5kZXgoKSAhPSBzZWxlY3Rl
ZCAmJiBkYXRhLnVzZXJEcml2ZW5DaGFuZ2UoKSkgewotICAgICAgICBkYXRhLnNldExhc3RPbkNo
YW5nZUluZGV4KHNlbGVjdGVkKTsKLSAgICAgICAgZGF0YS5zZXRVc2VyRHJpdmVuQ2hhbmdlKGZh
bHNlKTsKLSAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50KCk7
Ci0gICAgfQotfQotCi12b2lkIFNlbGVjdEVsZW1lbnQ6OnNjcm9sbFRvU2VsZWN0aW9uKFNlbGVj
dEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIGlmIChkYXRhLnVz
ZXNNZW51TGlzdCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCkpCi0gICAgICAgIHRvUmVuZGVyTGlzdEJveChy
ZW5kZXJlciktPnNlbGVjdGlvbkNoYW5nZWQoKTsKLX0KLQotdm9pZCBTZWxlY3RFbGVtZW50Ojpz
ZXRPcHRpb25zQ2hhbmdlZE9uUmVuZGVyZXIoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1l
bnQqIGVsZW1lbnQpCi17Ci0gICAgaWYgKFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBlbGVtZW50
LT5yZW5kZXJlcigpKSB7Ci0gICAgICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKQotICAgICAg
ICAgICAgdG9SZW5kZXJNZW51TGlzdChyZW5kZXJlciktPnNldE9wdGlvbnNDaGFuZ2VkKHRydWUp
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0b1JlbmRlckxpc3RCb3gocmVuZGVyZXIpLT5z
ZXRPcHRpb25zQ2hhbmdlZCh0cnVlKTsKLSAgICB9Ci19Ci0KLXZvaWQgU2VsZWN0RWxlbWVudDo6
c2V0UmVjYWxjTGlzdEl0ZW1zKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVt
ZW50KQotewotICAgIGRhdGEuc2V0U2hvdWxkUmVjYWxjTGlzdEl0ZW1zKHRydWUpOwotICAgIGRh
dGEuc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoLTEpOyAvLyBNYW51YWwgc2VsZWN0aW9u
IGFuY2hvciBpcyByZXNldCB3aGVuIG1hbmlwdWxhdGluZyB0aGUgc2VsZWN0IHByb2dyYW1tYXRp
Y2FsbHkuCi0gICAgc2V0T3B0aW9uc0NoYW5nZWRPblJlbmRlcmVyKGRhdGEsIGVsZW1lbnQpOwot
ICAgIGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKLX0KLQotdm9pZCBTZWxlY3RFbGVt
ZW50OjpyZWNhbGNMaXN0SXRlbXMoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIGNvbnN0IEVsZW1l
bnQqIGVsZW1lbnQsIGJvb2wgdXBkYXRlU2VsZWN0ZWRTdGF0ZXMpCi17Ci0gICAgVmVjdG9yPEVs
ZW1lbnQqPiYgbGlzdEl0ZW1zID0gZGF0YS5yYXdMaXN0SXRlbXMoKTsKLSAgICBsaXN0SXRlbXMu
Y2xlYXIoKTsKLQotICAgIGRhdGEuc2V0U2hvdWxkUmVjYWxjTGlzdEl0ZW1zKGZhbHNlKTsKLQot
ICAgIE9wdGlvbkVsZW1lbnQqIGZvdW5kU2VsZWN0ZWQgPSAwOwotICAgIGZvciAoTm9kZSogY3Vy
cmVudE5vZGUgPSBlbGVtZW50LT5maXJzdENoaWxkKCk7IGN1cnJlbnROb2RlOykgewotICAgICAg
ICBpZiAoIWN1cnJlbnROb2RlLT5pc0VsZW1lbnROb2RlKCkpIHsKLSAgICAgICAgICAgIGN1cnJl
bnROb2RlID0gY3VycmVudE5vZGUtPnRyYXZlcnNlTmV4dFNpYmxpbmcoZWxlbWVudCk7Ci0gICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEVsZW1lbnQqIGN1cnJlbnQg
PSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4oY3VycmVudE5vZGUpOwotCi0gICAgICAgIC8vIG9wdGdy
b3VwIHRhZ3MgbWF5IG5vdCBuZXN0LiBIb3dldmVyLCBib3RoIEZpcmVGb3ggYW5kIElFIHdpbGwK
LSAgICAgICAgLy8gZmxhdHRlbiB0aGUgdHJlZSBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBmb2xsb3cg
c3VpdC4KLSAgICAgICAgLy8gKGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEvaW50ZXJhY3Qv
Zm9ybXMuaHRtbCNoLTE3LjYpCi0gICAgICAgIGlmIChpc09wdGlvbkdyb3VwRWxlbWVudChjdXJy
ZW50KSkgewotICAgICAgICAgICAgbGlzdEl0ZW1zLmFwcGVuZChjdXJyZW50KTsKLSAgICAgICAg
ICAgIGlmIChjdXJyZW50LT5maXJzdENoaWxkKCkpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50
Tm9kZSA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChPcHRpb25FbGVtZW50KiBv
cHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGN1cnJlbnQpKSB7Ci0gICAgICAgICAgICBs
aXN0SXRlbXMuYXBwZW5kKGN1cnJlbnQpOwotCi0gICAgICAgICAgICBpZiAodXBkYXRlU2VsZWN0
ZWRTdGF0ZXMgJiYgIWRhdGEubXVsdGlwbGUoKSkgewotICAgICAgICAgICAgICAgIGlmICghZm91
bmRTZWxlY3RlZCAmJiAoZGF0YS5zaXplKCkgPD0gMSB8fCBvcHRpb25FbGVtZW50LT5zZWxlY3Rl
ZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkID0gb3B0aW9uRWxlbWVu
dDsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZC0+c2V0U2VsZWN0ZWRTdGF0ZSh0
cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvdW5kU2VsZWN0ZWQgJiYgb3B0aW9u
RWxlbWVudC0+c2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVk
LT5zZXRTZWxlY3RlZFN0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRTZWxl
Y3RlZCA9IG9wdGlvbkVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpo
clRhZykpCi0gICAgICAgICAgICBsaXN0SXRlbXMuYXBwZW5kKGN1cnJlbnQpOwotCi0gICAgICAg
IC8vIEluIGNvbmZvcm1pbmcgSFRNTCBjb2RlLCBvbmx5IDxvcHRncm91cD4gYW5kIDxvcHRpb24+
IHdpbGwgYmUgZm91bmQKLSAgICAgICAgLy8gd2l0aGluIGEgPHNlbGVjdD4uIFdlIGNhbGwgdHJh
dmVyc2VOZXh0U2libGluZyBzbyB0aGF0IHdlIG9ubHkgc3RlcAotICAgICAgICAvLyBpbnRvIHRo
b3NlIHRhZ3MgdGhhdCB3ZSBjaG9vc2UgdG8uIEZvciB3ZWItY29tcGF0LCB3ZSBzaG91bGQgY29w
ZQotICAgICAgICAvLyB3aXRoIHRoZSBjYXNlIHdoZXJlIG9kZCB0YWdzIGxpa2UgYSA8ZGl2PiBo
YXZlIGJlZW4gYWRkZWQgYnV0IHdlCi0gICAgICAgIC8vIGhhbmRsZSB0aGlzIGJlY2F1c2Ugc3Vj
aCB0YWdzIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUKLSAgICAgICAgLy8gPHNl
bGVjdD4ncyBzdWJ0cmVlIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgIGN1cnJlbnROb2RlID0gY3Vy
cmVudE5vZGUtPnRyYXZlcnNlTmV4dFNpYmxpbmcoZWxlbWVudCk7Ci0gICAgfQotfQotCi1pbnQg
U2VsZWN0RWxlbWVudDo6c2VsZWN0ZWRJbmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYgZGF0
YSwgY29uc3QgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICB1bnNpZ25lZCBpbmRleCA9IDA7Ci0K
LSAgICAvLyByZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgZmlyc3Qgb3B0aW9uIHNlbGVjdGVkCi0g
ICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50
KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgKytpKSB7Ci0gICAg
ICAgIGlmIChPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0
ZW1zW2ldKSkgewotICAgICAgICAgICAgaWYgKG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVkKCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgKytpbmRleDsKLSAgICAg
ICAgfQotICAgIH0KLQotICAgIHJldHVybiAtMTsKLX0KLQotdm9pZCBTZWxlY3RFbGVtZW50Ojpz
ZXRTZWxlY3RlZEluZGV4KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50
LCBpbnQgb3B0aW9uSW5kZXgsIGJvb2wgZGVzZWxlY3QsIGJvb2wgZmlyZU9uQ2hhbmdlTm93LCBi
b29sIHVzZXJEcml2ZW5DaGFuZ2UpCi17Ci0gICAgaWYgKG9wdGlvbkluZGV4ID09IC0xICYmICFk
ZXNlbGVjdCAmJiAhZGF0YS5tdWx0aXBsZSgpKQotICAgICAgICBvcHRpb25JbmRleCA9IG5leHRT
ZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIC0xKTsKLSAgICBpZiAoIWRhdGEubXVs
dGlwbGUoKSkKLSAgICAgICAgZGVzZWxlY3QgPSB0cnVlOwotCi0gICAgY29uc3QgVmVjdG9yPEVs
ZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAgICBpbnQgbGlzdElu
ZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgb3B0aW9uSW5kZXgpOwotCi0g
ICAgRWxlbWVudCogZXhjbHVkZUVsZW1lbnQgPSAwOwotICAgIGlmIChPcHRpb25FbGVtZW50KiBv
cHRpb25FbGVtZW50ID0gKGxpc3RJbmRleCA+PSAwID8gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2xp
c3RJbmRleF0pIDogMCkpIHsKLSAgICAgICAgZXhjbHVkZUVsZW1lbnQgPSBpdGVtc1tsaXN0SW5k
ZXhdOwotICAgICAgICBpZiAoZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpIDwgMCB8
fCBkZXNlbGVjdCkKLSAgICAgICAgICAgIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGRh
dGEsIGVsZW1lbnQsIGxpc3RJbmRleCk7Ci0gICAgICAgIGlmIChkYXRhLmFjdGl2ZVNlbGVjdGlv
bkVuZEluZGV4KCkgPCAwIHx8IGRlc2VsZWN0KQotICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0
aW9uRW5kSW5kZXgoZGF0YSwgbGlzdEluZGV4KTsKLSAgICAgICAgb3B0aW9uRWxlbWVudC0+c2V0
U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBpZiAoZGVzZWxlY3QpCi0gICAgICAg
IGRlc2VsZWN0SXRlbXMoZGF0YSwgZWxlbWVudCwgZXhjbHVkZUVsZW1lbnQpOwotCi0gICAgLy8g
Rm9yIHRoZSBtZW51IGxpc3QgY2FzZSwgdGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBzZWxlY3RlZCBl
bGVtZW50IGFwcGVhci4KLSAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQt
PnJlbmRlcmVyKCkpCi0gICAgICAgIHJlbmRlcmVyLT51cGRhdGVGcm9tRWxlbWVudCgpOwotCi0g
ICAgc2Nyb2xsVG9TZWxlY3Rpb24oZGF0YSwgZWxlbWVudCk7Ci0KLSAgICAvLyBUaGlzIG9ubHkg
Z2V0cyBjYWxsZWQgd2l0aCBmaXJlT25DaGFuZ2VOb3cgZm9yIG1lbnUgbGlzdHMuIAotICAgIGlm
IChkYXRhLnVzZXNNZW51TGlzdCgpKSB7Ci0gICAgICAgIGRhdGEuc2V0VXNlckRyaXZlbkNoYW5n
ZSh1c2VyRHJpdmVuQ2hhbmdlKTsKLSAgICAgICAgaWYgKGZpcmVPbkNoYW5nZU5vdykKLSAgICAg
ICAgICAgIG1lbnVMaXN0T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7Ci0gICAgICAgIFJlbmRlck9i
amVjdCogcmVuZGVyZXIgPSBlbGVtZW50LT5yZW5kZXJlcigpOwotICAgICAgICBpZiAocmVuZGVy
ZXIpIHsKLSAgICAgICAgICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKQotICAgICAgICAgICAg
ICAgIHRvUmVuZGVyTWVudUxpc3QocmVuZGVyZXIpLT5kaWRTZXRTZWxlY3RlZEluZGV4KGxpc3RJ
bmRleCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZW5kZXJlci0+aXNMaXN0Qm94KCkpCi0gICAg
ICAgICAgICAgICAgdG9SZW5kZXJMaXN0Qm94KHJlbmRlcmVyKS0+c2VsZWN0aW9uQ2hhbmdlZCgp
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdG9TZWxlY3RFbGVtZW50KGVsZW1lbnQpLT51cGRh
dGVWYWxpZGl0eSgpOwotICAgIGlmIChGcmFtZSogZnJhbWUgPSBlbGVtZW50LT5kb2N1bWVudCgp
LT5mcmFtZSgpKQotICAgICAgICBmcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmZv
cm1TdGF0ZURpZENoYW5nZShlbGVtZW50KTsKLX0KLQotaW50IFNlbGVjdEVsZW1lbnQ6Om9wdGlv
blRvTGlzdEluZGV4KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBFbGVtZW50
KiBlbGVtZW50LCBpbnQgb3B0aW9uSW5kZXgpCi17Ci0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQq
PiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAgICBpbnQgbGlzdFNpemUgPSAo
aW50KSBpdGVtcy5zaXplKCk7Ci0gICAgaWYgKG9wdGlvbkluZGV4IDwgMCB8fCBvcHRpb25JbmRl
eCA+PSBsaXN0U2l6ZSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaW50IG9wdGlvbkluZGV4
MiA9IC0xOwotICAgIGZvciAoaW50IGxpc3RJbmRleCA9IDA7IGxpc3RJbmRleCA8IGxpc3RTaXpl
OyArK2xpc3RJbmRleCkgewotICAgICAgICBpZiAoaXNPcHRpb25FbGVtZW50KGl0ZW1zW2xpc3RJ
bmRleF0pKSB7Ci0gICAgICAgICAgICArK29wdGlvbkluZGV4MjsKLSAgICAgICAgICAgIGlmIChv
cHRpb25JbmRleDIgPT0gb3B0aW9uSW5kZXgpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RJ
bmRleDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAtMTsKLX0KLQotaW50IFNlbGVj
dEVsZW1lbnQ6Omxpc3RUb09wdGlvbkluZGV4KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiBkYXRh
LCBjb25zdCBFbGVtZW50KiBlbGVtZW50LCBpbnQgbGlzdEluZGV4KQotewotICAgIGNvbnN0IFZl
Y3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7Ci0gICAgaWYg
KGxpc3RJbmRleCA8IDAgfHwgbGlzdEluZGV4ID49IGludChpdGVtcy5zaXplKCkpIHx8Ci0gICAg
ICAgICFpc09wdGlvbkVsZW1lbnQoaXRlbXNbbGlzdEluZGV4XSkpCi0gICAgICAgIHJldHVybiAt
MTsKLQotICAgIGludCBvcHRpb25JbmRleCA9IDA7IC8vIGFjdHVhbCBpbmRleCBvZiBvcHRpb24g
bm90IGNvdW50aW5nIE9QVEdST1VQIGVudHJpZXMgdGhhdCBtYXkgYmUgaW4gbGlzdAotICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgbGlzdEluZGV4OyArK2kpCi0gICAgICAgIGlmIChpc09wdGlvbkVs
ZW1lbnQoaXRlbXNbaV0pKQotICAgICAgICAgICAgKytvcHRpb25JbmRleDsKLQotICAgIHJldHVy
biBvcHRpb25JbmRleDsKLX0KLQotdm9pZCBTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEZvY3VzRXZl
bnQoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgLy8g
U2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVj
dGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBldmVudHMgZHVyaW5nIGJsdXIgZXZlbnQgZGlz
cGF0Y2hhbAotICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKQotICAgICAgICBzYXZlTGFzdFNl
bGVjdGlvbihkYXRhLCBlbGVtZW50KTsKLX0KLQotdm9pZCBTZWxlY3RFbGVtZW50OjpkaXNwYXRj
aEJsdXJFdmVudChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKLXsK
LSAgICAvLyBXZSBvbmx5IG5lZWQgdG8gZmlyZSBjaGFuZ2UgZXZlbnRzIGhlcmUgZm9yIG1lbnUg
bGlzdHMsIGJlY2F1c2Ugd2UgZmlyZSBjaGFuZ2UgZXZlbnRzIGZvciBsaXN0IGJveGVzIHdoZW5l
dmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlIGlzIGFjdHVhbGx5IG1hZGUuCi0gICAgLy8gVGhpcyBt
YXRjaGVzIG90aGVyIGJyb3dzZXJzJyBiZWhhdmlvci4KLSAgICBpZiAoZGF0YS51c2VzTWVudUxp
c3QoKSkKLSAgICAgICAgbWVudUxpc3RPbkNoYW5nZShkYXRhLCBlbGVtZW50KTsKLX0KLQotdm9p
ZCBTZWxlY3RFbGVtZW50OjpkZXNlbGVjdEl0ZW1zKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBF
bGVtZW50KiBlbGVtZW50LCBFbGVtZW50KiBleGNsdWRlRWxlbWVudCkKLXsKLSAgICBjb25zdCBW
ZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOwotICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAo
aXRlbXNbaV0gPT0gZXhjbHVkZUVsZW1lbnQpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAg
ICAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChp
dGVtc1tpXSkpCi0gICAgICAgICAgICBvcHRpb25FbGVtZW50LT5zZXRTZWxlY3RlZFN0YXRlKGZh
bHNlKTsKLSAgICB9Ci19Ci0KLWJvb2wgU2VsZWN0RWxlbWVudDo6c2F2ZUZvcm1Db250cm9sU3Rh
dGUoY29uc3QgU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQs
IFN0cmluZyYgdmFsdWUpCi17Ci0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBk
YXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAgICBpbnQgbGVuZ3RoID0gaXRlbXMuc2l6ZSgpOwot
Ci0gICAgLy8gRklYTUU6IENoYW5nZSB0aGlzIGNvZGUgdG8gdXNlIHRoZSBuZXcgU3RyaW5nSW1w
bDo6Y3JlYXRlVW5pbml0aWFsaXplZCBjb2RlIHBhdGguCi0gICAgVmVjdG9yPGNoYXIsIDEwMjQ+
IGNoYXJhY3RlcnMobGVuZ3RoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytp
KSB7Ci0gICAgICAgIE9wdGlvbkVsZW1lbnQqIG9wdGlvbkVsZW1lbnQgPSB0b09wdGlvbkVsZW1l
bnQoaXRlbXNbaV0pOwotICAgICAgICBib29sIHNlbGVjdGVkID0gb3B0aW9uRWxlbWVudCAmJiBv
cHRpb25FbGVtZW50LT5zZWxlY3RlZCgpOwotICAgICAgICBjaGFyYWN0ZXJzW2ldID0gc2VsZWN0
ZWQgPyAnWCcgOiAnLic7Ci0gICAgfQotCi0gICAgdmFsdWUgPSBTdHJpbmcoY2hhcmFjdGVycy5k
YXRhKCksIGxlbmd0aCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2VsZWN0RWxlbWVu
dDo6cmVzdG9yZUZvcm1Db250cm9sU3RhdGUoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1l
bnQqIGVsZW1lbnQsIGNvbnN0IFN0cmluZyYgc3RhdGUpCi17Ci0gICAgcmVjYWxjTGlzdEl0ZW1z
KGRhdGEsIGVsZW1lbnQpOwotCi0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBk
YXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAgICBpbnQgbGVuZ3RoID0gaXRlbXMuc2l6ZSgpOwot
Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICBpZiAoT3B0
aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSkpCi0g
ICAgICAgICAgICBvcHRpb25FbGVtZW50LT5zZXRTZWxlY3RlZFN0YXRlKHN0YXRlW2ldID09ICdY
Jyk7Ci0gICAgfQotCi0gICAgc2V0T3B0aW9uc0NoYW5nZWRPblJlbmRlcmVyKGRhdGEsIGVsZW1l
bnQpOwotfQotCi12b2lkIFNlbGVjdEVsZW1lbnQ6OnBhcnNlTXVsdGlwbGVBdHRyaWJ1dGUoU2Vs
ZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIEF0dHJpYnV0ZSogYXR0cmli
dXRlKQotewotICAgIGJvb2wgb2xkVXNlc01lbnVMaXN0ID0gZGF0YS51c2VzTWVudUxpc3QoKTsK
LSAgICBkYXRhLnNldE11bHRpcGxlKCFhdHRyaWJ1dGUtPmlzTnVsbCgpKTsKLSAgICB0b1NlbGVj
dEVsZW1lbnQoZWxlbWVudCktPnVwZGF0ZVZhbGlkaXR5KCk7Ci0gICAgaWYgKG9sZFVzZXNNZW51
TGlzdCAhPSBkYXRhLnVzZXNNZW51TGlzdCgpICYmIGVsZW1lbnQtPmF0dGFjaGVkKCkpIHsKLSAg
ICAgICAgZWxlbWVudC0+ZGV0YWNoKCk7Ci0gICAgICAgIGVsZW1lbnQtPmF0dGFjaCgpOwotICAg
IH0KLX0KLQotYm9vbCBTZWxlY3RFbGVtZW50OjphcHBlbmRGb3JtRGF0YShTZWxlY3RFbGVtZW50
RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgRm9ybURhdGFMaXN0JiBsaXN0KQotewotICAg
IGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSA9IGVsZW1lbnQtPmZvcm1Db250cm9sTmFtZSgpOwot
ICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9v
bCBzdWNjZXNzZnVsID0gZmFsc2U7Ci0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMg
PSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBpdGVtcy5zaXplKCk7ICsraSkgewotICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVt
ZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKLSAgICAgICAgaWYgKG9wdGlvbkVsZW1l
bnQgJiYgb3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSAmJiAhb3B0aW9uRWxlbWVudC0+ZGlzYWJs
ZWQoKSkgewotICAgICAgICAgICAgbGlzdC5hcHBlbmREYXRhKG5hbWUsIG9wdGlvbkVsZW1lbnQt
PnZhbHVlKCkpOwotICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBpcyBhIG1lbnVsaXN0IHdpdGgg
bXVsdGlwbGUgb3B0aW9ucyBhbmQgbm90aGluZwotICAgIC8vIHdpbGwgYmUgc3VibWl0dGVkICgh
c3VjY2Vzc2Z1bCkuIFdlIHdvbid0IHNlbmQgYSB1bnNlbGVjdGVkIG5vbi1kaXNhYmxlZAotICAg
IC8vIG9wdGlvbiBhcyBmYWxsYmFjay4gVGhpcyBiZWhhdmlvciBtYXRjaGVzIHRvIG90aGVyIGJy
b3dzZXJzLgotICAgIHJldHVybiBzdWNjZXNzZnVsOwotfSAKLQotdm9pZCBTZWxlY3RFbGVtZW50
OjpyZXNldChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKLXsKLSAg
ICBPcHRpb25FbGVtZW50KiBmaXJzdE9wdGlvbiA9IDA7Ci0gICAgT3B0aW9uRWxlbWVudCogc2Vs
ZWN0ZWRPcHRpb24gPSAwOwotCi0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBk
YXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRl
bXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9
IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSk7Ci0gICAgICAgIGlmICghb3B0aW9uRWxlbWVudCkK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGlmIChpdGVtc1tpXS0+ZmFzdEhhc0F0
dHJpYnV0ZShIVE1MTmFtZXM6OnNlbGVjdGVkQXR0cikpIHsKLSAgICAgICAgICAgIGlmIChzZWxl
Y3RlZE9wdGlvbiAmJiAhZGF0YS5tdWx0aXBsZSgpKQotICAgICAgICAgICAgICAgIHNlbGVjdGVk
T3B0aW9uLT5zZXRTZWxlY3RlZFN0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgIG9wdGlvbkVsZW1l
bnQtPnNldFNlbGVjdGVkU3RhdGUodHJ1ZSk7Ci0gICAgICAgICAgICBzZWxlY3RlZE9wdGlvbiA9
IG9wdGlvbkVsZW1lbnQ7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgb3B0aW9uRWxlbWVu
dC0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7Ci0KLSAgICAgICAgaWYgKCFmaXJzdE9wdGlvbikK
LSAgICAgICAgICAgIGZpcnN0T3B0aW9uID0gb3B0aW9uRWxlbWVudDsKLSAgICB9Ci0KLSAgICBp
ZiAoIXNlbGVjdGVkT3B0aW9uICYmIGZpcnN0T3B0aW9uICYmICFkYXRhLm11bHRpcGxlKCkgJiYg
ZGF0YS5zaXplKCkgPD0gMSkKLSAgICAgICAgZmlyc3RPcHRpb24tPnNldFNlbGVjdGVkU3RhdGUo
dHJ1ZSk7Ci0KLSAgICBzZXRPcHRpb25zQ2hhbmdlZE9uUmVuZGVyZXIoZGF0YSwgZWxlbWVudCk7
Ci0gICAgZWxlbWVudC0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOwotfQotCi0jaWYgIVBMQVRGT1JN
KFdJTikgfHwgT1MoV0lOQ0UpCi1ib29sIFNlbGVjdEVsZW1lbnQ6OnBsYXRmb3JtSGFuZGxlS2V5
ZG93bkV2ZW50KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBLZXli
b2FyZEV2ZW50KiBldmVudCkKLXsKLSNpZiBBUlJPV19LRVlTX1BPUF9NRU5VCi0gICAgaWYgKCFp
c1NwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZChlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKSkg
ewotICAgICAgICBpZiAoZXZlbnQtPmtleUlkZW50aWZpZXIoKSA9PSAiRG93biIgfHwgZXZlbnQt
PmtleUlkZW50aWZpZXIoKSA9PSAiVXAiKSB7Ci0gICAgICAgICAgICBlbGVtZW50LT5mb2N1cygp
OwotCi0gICAgICAgICAgICAvLyBDYWxsaW5nIGZvY3VzKCkgbWF5IGNhdXNlIHVzIHRvIGxvc2Ug
b3VyIHJlbmRlcmVyLiBSZXR1cm4gdHJ1ZSBzbyB0aGF0IG91ciBjYWxsZXIgZG9lc24ndCBwcm9j
ZXNzIHRoZSBldmVudAotICAgICAgICAgICAgLy8gZnVydGhlciwgYnV0IGRvbid0IHNldCB0aGUg
ZXZlbnQgYXMgaGFuZGxlZC4KLSAgICAgICAgICAgIGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gU2F2ZSB0aGUg
c2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVu
IGRpc3BhdGNoaW5nIGNoYW5nZSBldmVudHMgZHVyaW5nIHNldFNlbGVjdGVkSW5kZXgsCi0gICAg
ICAgICAgICAvLyB3aGljaCBnZXRzIGNhbGxlZCBmcm9tIFJlbmRlck1lbnVMaXN0Ojp2YWx1ZUNo
YW5nZWQsIHdoaWNoIGdldHMgY2FsbGVkIGFmdGVyIHRoZSB1c2VyIG1ha2VzIGEgc2VsZWN0aW9u
IGZyb20gdGhlIG1lbnUuCi0gICAgICAgICAgICBzYXZlTGFzdFNlbGVjdGlvbihkYXRhLCBlbGVt
ZW50KTsKLSAgICAgICAgICAgIGlmIChSZW5kZXJNZW51TGlzdCogbWVudUxpc3QgPSB0b1JlbmRl
ck1lbnVMaXN0KGVsZW1lbnQtPnJlbmRlcmVyKCkpKQotICAgICAgICAgICAgICAgIG1lbnVMaXN0
LT5zaG93UG9wdXAoKTsKLSAgICAgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwot
ICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVy
biBmYWxzZTsKLX0KLSNlbmRpZgotCi12b2lkIFNlbGVjdEVsZW1lbnQ6Om1lbnVMaXN0RGVmYXVs
dEV2ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwg
RXZlbnQqIGV2ZW50LCBIVE1MRm9ybUVsZW1lbnQqIGh0bWxGb3JtKQotewotICAgIGlmIChldmVu
dC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5rZXlkb3duRXZlbnQpIHsKLSAgICAgICAgaWYgKCFl
bGVtZW50LT5yZW5kZXJlcigpIHx8ICFldmVudC0+aXNLZXlib2FyZEV2ZW50KCkpCi0gICAgICAg
ICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHBsYXRmb3JtSGFuZGxlS2V5ZG93bkV2ZW50KGRh
dGEsIGVsZW1lbnQsIHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihldmVudCkpKQotICAgICAg
ICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIFdoZW4gdXNpbmcgc3BhdGlhbCBuYXZpZ2F0aW9u
LCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gbmF2aWdhdGUgYXdheSBmcm9tIHRoZSBzZWxlY3QgZWxl
bWVudAotICAgICAgICAvLyB3aGVuIHRoZSB1c2VyIGhpdHMgYW55IG9mIHRoZSBhcnJvdyBrZXlz
LCBpbnN0ZWFkIG9mIGNoYW5naW5nIHRoZSBzZWxlY3Rpb24uCi0gICAgICAgIGlmIChpc1NwYXRp
YWxOYXZpZ2F0aW9uRW5hYmxlZChlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKSkgewotICAg
ICAgICAgICAgaWYgKCFkYXRhLmFjdGl2ZVNlbGVjdGlvblN0YXRlKCkpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgU3RyaW5nJiBrZXlJZGVudGlm
aWVyID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2ZW50KS0+a2V5SWRlbnRpZmllcigp
OwotICAgICAgICBib29sIGhhbmRsZWQgPSBmYWxzZTsKLQotICAgICAgICBVTlVTRURfUEFSQU0o
aHRtbEZvcm0pOwotICAgICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBk
YXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLQotICAgICAgICBpbnQgbGlzdEluZGV4ID0gb3B0aW9u
VG9MaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgc2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50KSk7
Ci0KLSAgICAgICAgaWYgKGtleUlkZW50aWZpZXIgPT0gIkRvd24iIHx8IGtleUlkZW50aWZpZXIg
PT0gIlJpZ2h0IikgewotICAgICAgICAgICAgbGlzdEluZGV4ID0gbmV4dFZhbGlkSW5kZXgobGlz
dEl0ZW1zLCBsaXN0SW5kZXgsIFNraXBGb3J3YXJkcywgMSk7Ci0gICAgICAgICAgICBoYW5kbGVk
ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChrZXlJZGVudGlmaWVyID09ICJVcCIgfHwga2V5
SWRlbnRpZmllciA9PSAiTGVmdCIpIHsKLSAgICAgICAgICAgIGxpc3RJbmRleCA9IG5leHRWYWxp
ZEluZGV4KGxpc3RJdGVtcywgbGlzdEluZGV4LCBTa2lwQmFja3dhcmRzLCAxKTsKLSAgICAgICAg
ICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0g
IlBhZ2VEb3duIikgewotICAgICAgICAgICAgbGlzdEluZGV4ID0gbmV4dFZhbGlkSW5kZXgobGlz
dEl0ZW1zLCBsaXN0SW5kZXgsIFNraXBGb3J3YXJkcywgMyk7Ci0gICAgICAgICAgICBoYW5kbGVk
ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChrZXlJZGVudGlmaWVyID09ICJQYWdlVXAiKSB7
Ci0gICAgICAgICAgICBsaXN0SW5kZXggPSBuZXh0VmFsaWRJbmRleChsaXN0SXRlbXMsIGxpc3RJ
bmRleCwgU2tpcEJhY2t3YXJkcywgMyk7Ci0gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAg
ICAgICAgfSBlbHNlIGlmIChrZXlJZGVudGlmaWVyID09ICJIb21lIikgewotICAgICAgICAgICAg
bGlzdEluZGV4ID0gbmV4dFZhbGlkSW5kZXgobGlzdEl0ZW1zLCAtMSwgU2tpcEZvcndhcmRzLCAx
KTsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGtleUlk
ZW50aWZpZXIgPT0gIkVuZCIpIHsKLSAgICAgICAgICAgIGxpc3RJbmRleCA9IG5leHRWYWxpZElu
ZGV4KGxpc3RJdGVtcywgbGlzdEl0ZW1zLnNpemUoKSwgU2tpcEJhY2t3YXJkcywgMSk7Ci0gICAg
ICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYW5kbGVk
ICYmIGxpc3RJbmRleCA+PSAwICYmIHN0YXRpY19jYXN0PHVuc2lnbmVkPihsaXN0SW5kZXgpIDwg
bGlzdEl0ZW1zLnNpemUoKSkKLSAgICAgICAgICAgIHNldFNlbGVjdGVkSW5kZXgoZGF0YSwgZWxl
bWVudCwgbGlzdFRvT3B0aW9uSW5kZXgoZGF0YSwgZWxlbWVudCwgbGlzdEluZGV4KSk7Ci0KLSAg
ICAgICAgaWYgKGhhbmRsZWQpCi0gICAgICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQo
KTsKLSAgICB9Ci0KLSAgICAvLyBVc2Uga2V5IHByZXNzIGV2ZW50IGhlcmUgc2luY2Ugc2VuZGlu
ZyBzaW11bGF0ZWQgbW91c2UgZXZlbnRzCi0gICAgLy8gb24ga2V5IGRvd24gYmxvY2tzIHRoZSBw
cm9wZXIgc2VuZGluZyBvZiB0aGUga2V5IHByZXNzIGV2ZW50LgotICAgIGlmIChldmVudC0+dHlw
ZSgpID09IGV2ZW50TmFtZXMoKS5rZXlwcmVzc0V2ZW50KSB7Ci0gICAgICAgIGlmICghZWxlbWVu
dC0+cmVuZGVyZXIoKSB8fCAhZXZlbnQtPmlzS2V5Ym9hcmRFdmVudCgpKQotICAgICAgICAgICAg
cmV0dXJuOwotCi0gICAgICAgIGludCBrZXlDb2RlID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVu
dCo+KGV2ZW50KS0+a2V5Q29kZSgpOwotICAgICAgICBib29sIGhhbmRsZWQgPSBmYWxzZTsKLQot
ICAgICAgICBpZiAoa2V5Q29kZSA9PSAnICcgJiYgaXNTcGF0aWFsTmF2aWdhdGlvbkVuYWJsZWQo
ZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSkpIHsKLSAgICAgICAgICAgIC8vIFVzZSBzcGFj
ZSB0byB0b2dnbGUgYXJyb3cga2V5IGhhbmRsaW5nIGZvciBzZWxlY3Rpb24gY2hhbmdlIG9yIHNw
YXRpYWwgbmF2aWdhdGlvbi4KLSAgICAgICAgICAgIGRhdGEuc2V0QWN0aXZlU2VsZWN0aW9uU3Rh
dGUoIWRhdGEuYWN0aXZlU2VsZWN0aW9uU3RhdGUoKSk7Ci0gICAgICAgICAgICBldmVudC0+c2V0
RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0jaWYg
U1BBQ0VfT1JfUkVUVVJOX1BPUF9NRU5VCi0gICAgICAgIGlmIChrZXlDb2RlID09ICcgJyB8fCBr
ZXlDb2RlID09ICdccicpIHsKLSAgICAgICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7Ci0KLSAgICAg
ICAgICAgIGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSkgLy8gQ2FsbGluZyBmb2N1cygpIG1heSBj
YXVzZSB1cyB0byBsb3NlIG91ciByZW5kZXJlciwgaW4gd2hpY2ggY2FzZSBkbyBub3Qgd2FudCB0
byBoYW5kbGUgdGhlIGV2ZW50LgotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAg
ICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3
IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBldmVudHMgZHVyaW5nIHNldFNlbGVj
dGVkSW5kZXgsCi0gICAgICAgICAgICAvLyB3aGljaCBnZXRzIGNhbGxlZCBmcm9tIFJlbmRlck1l
bnVMaXN0Ojp2YWx1ZUNoYW5nZWQsIHdoaWNoIGdldHMgY2FsbGVkIGFmdGVyIHRoZSB1c2VyIG1h
a2VzIGEgc2VsZWN0aW9uIGZyb20gdGhlIG1lbnUuCi0gICAgICAgICAgICBzYXZlTGFzdFNlbGVj
dGlvbihkYXRhLCBlbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChSZW5kZXJNZW51TGlzdCogbWVu
dUxpc3QgPSB0b1JlbmRlck1lbnVMaXN0KGVsZW1lbnQtPnJlbmRlcmVyKCkpKQotICAgICAgICAg
ICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAoKTsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVl
OwotICAgICAgICB9Ci0jZWxpZiBBUlJPV19LRVlTX1BPUF9NRU5VCi0gICAgICAgIGlmIChrZXlD
b2RlID09ICcgJykgewotICAgICAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLQotICAgICAgICAg
ICAgaWYgKCFlbGVtZW50LT5yZW5kZXJlcigpKSAvLyBDYWxsaW5nIGZvY3VzKCkgbWF5IGNhdXNl
IHVzIHRvIGxvc2Ugb3VyIHJlbmRlcmVyLCBpbiB3aGljaCBjYXNlIGRvIG5vdCB3YW50IHRvIGhh
bmRsZSB0aGUgZXZlbnQuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAv
LyBTYXZlIHRoZSBzZWxlY3Rpb24gc28gaXQgY2FuIGJlIGNvbXBhcmVkIHRvIHRoZSBuZXcgc2Vs
ZWN0aW9uIHdoZW4gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgc2V0U2VsZWN0ZWRJ
bmRleCwKLSAgICAgICAgICAgIC8vIHdoaWNoIGdldHMgY2FsbGVkIGZyb20gUmVuZGVyTWVudUxp
c3Q6OnZhbHVlQ2hhbmdlZCwgd2hpY2ggZ2V0cyBjYWxsZWQgYWZ0ZXIgdGhlIHVzZXIgbWFrZXMg
YSBzZWxlY3Rpb24gZnJvbSB0aGUgbWVudS4KLSAgICAgICAgICAgIHNhdmVMYXN0U2VsZWN0aW9u
KGRhdGEsIGVsZW1lbnQpOwotICAgICAgICAgICAgaWYgKFJlbmRlck1lbnVMaXN0KiBtZW51TGlz
dCA9IHRvUmVuZGVyTWVudUxpc3QoZWxlbWVudC0+cmVuZGVyZXIoKSkpCi0gICAgICAgICAgICAg
ICAgbWVudUxpc3QtPnNob3dQb3B1cCgpOwotICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0g
ICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PSAnXHInKSB7Ci0gICAgICAgICAgICBpZiAoaHRt
bEZvcm0pCi0gICAgICAgICAgICAgICAgaHRtbEZvcm0tPnN1Ym1pdEltcGxpY2l0bHkoZXZlbnQs
IGZhbHNlKTsKLSAgICAgICAgICAgIG1lbnVMaXN0T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7Ci0g
ICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaW50
IGxpc3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIHNlbGVjdGVkSW5k
ZXgoZGF0YSwgZWxlbWVudCkpOwotICAgICAgICBpZiAoa2V5Q29kZSA9PSAnXHInKSB7Ci0gICAg
ICAgICAgICAvLyBsaXN0SW5kZXggc2hvdWxkIGFscmVhZHkgYmUgc2VsZWN0ZWQsIGJ1dCB0aGlz
IHdpbGwgZmlyZSB0aGUgb25jaGFuZ2UgaGFuZGxlci4KLSAgICAgICAgICAgIHNldFNlbGVjdGVk
SW5kZXgoZGF0YSwgZWxlbWVudCwgbGlzdFRvT3B0aW9uSW5kZXgoZGF0YSwgZWxlbWVudCwgbGlz
dEluZGV4KSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAg
ICAgfQotI2VuZGlmCi0gICAgICAgIGlmIChoYW5kbGVkKQotICAgICAgICAgICAgZXZlbnQtPnNl
dERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgfQotCi0gICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZl
bnROYW1lcygpLm1vdXNlZG93bkV2ZW50ICYmIGV2ZW50LT5pc01vdXNlRXZlbnQoKSAmJiBzdGF0
aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZlbnQpLT5idXR0b24oKSA9PSBMZWZ0QnV0dG9uKSB7Ci0g
ICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7Ci0gICAgICAgIGlmIChlbGVtZW50LT5yZW5kZXJlcigp
ICYmIGVsZW1lbnQtPnJlbmRlcmVyKCktPmlzTWVudUxpc3QoKSkgewotICAgICAgICAgICAgaWYg
KFJlbmRlck1lbnVMaXN0KiBtZW51TGlzdCA9IHRvUmVuZGVyTWVudUxpc3QoZWxlbWVudC0+cmVu
ZGVyZXIoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAobWVudUxpc3QtPnBvcHVwSXNWaXNpYmxl
KCkpCi0gICAgICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5oaWRlUG9wdXAoKTsKLSAgICAgICAg
ICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9u
IHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIHdlIGNhbGwg
b25DaGFuZ2UgZHVyaW5nIHNldFNlbGVjdGVkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIC8v
IHdoaWNoIGdldHMgY2FsbGVkIGZyb20gUmVuZGVyTWVudUxpc3Q6OnZhbHVlQ2hhbmdlZCwgd2hp
Y2ggZ2V0cyBjYWxsZWQgYWZ0ZXIgdGhlIHVzZXIgbWFrZXMgYSBzZWxlY3Rpb24gZnJvbSB0aGUg
bWVudS4KLSAgICAgICAgICAgICAgICAgICAgc2F2ZUxhc3RTZWxlY3Rpb24oZGF0YSwgZWxlbWVu
dCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAoKTsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZXZlbnQtPnNldERl
ZmF1bHRIYW5kbGVkKCk7Ci0gICAgfQotfQotCi12b2lkIFNlbGVjdEVsZW1lbnQ6OnVwZGF0ZVNl
bGVjdGVkU3RhdGUoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGlu
dCBsaXN0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9v
bCBtdWx0aSwgYm9vbCBzaGlmdCkKLXsKLSAgICBBU1NFUlQobGlzdEluZGV4ID49IDApOwotCi0g
ICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3
IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBldmVudHMgZHVyaW5nIG1vdXNldXAs
IG9yIGFmdGVyIGF1dG9zY3JvbGwgZmluaXNoZXMuCi0gICAgc2F2ZUxhc3RTZWxlY3Rpb24oZGF0
YSwgZWxlbWVudCk7Ci0KLSAgICBkYXRhLnNldEFjdGl2ZVNlbGVjdGlvblN0YXRlKHRydWUpOwot
Ci0gICAgYm9vbCBzaGlmdFNlbGVjdCA9IGRhdGEubXVsdGlwbGUoKSAmJiBzaGlmdDsKLSAgICBi
b29sIG11bHRpU2VsZWN0ID0gZGF0YS5tdWx0aXBsZSgpICYmIG11bHRpICYmICFzaGlmdDsKLQot
ICAgIEVsZW1lbnQqIGNsaWNrZWRFbGVtZW50ID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudClbbGlz
dEluZGV4XTsKLSAgICBPcHRpb25FbGVtZW50KiBvcHRpb24gPSB0b09wdGlvbkVsZW1lbnQoY2xp
Y2tlZEVsZW1lbnQpOwotICAgIGlmIChvcHRpb24pIHsKLSAgICAgICAgLy8gS2VlcCB0cmFjayBv
ZiB3aGV0aGVyIGFuIGFjdGl2ZSBzZWxlY3Rpb24gKGxpa2UgZHVyaW5nIGRyYWcgc2VsZWN0aW9u
KSwgc2hvdWxkIHNlbGVjdCBvciBkZXNlbGVjdAotICAgICAgICBpZiAob3B0aW9uLT5zZWxlY3Rl
ZCgpICYmIG11bHRpKQotICAgICAgICAgICAgZGF0YS5zZXRBY3RpdmVTZWxlY3Rpb25TdGF0ZShm
YWxzZSk7Ci0KLSAgICAgICAgaWYgKCFkYXRhLmFjdGl2ZVNlbGVjdGlvblN0YXRlKCkpCi0gICAg
ICAgICAgICBvcHRpb24tPnNldFNlbGVjdGVkU3RhdGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8v
IElmIHdlJ3JlIG5vdCBpbiBhbnkgc3BlY2lhbCBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSwgdGhl
biBkZXNlbGVjdCBhbGwgb3RoZXIgaXRlbXMsIGV4Y2x1ZGluZyB0aGUgY2xpY2tlZCBvcHRpb24u
Ci0gICAgLy8gSWYgbm8gb3B0aW9uIHdhcyBjbGlja2VkLCB0aGVuIHRoaXMgd2lsbCBkZXNlbGVj
dCBhbGwgaXRlbXMgaW4gdGhlIGxpc3QuCi0gICAgaWYgKCFzaGlmdFNlbGVjdCAmJiAhbXVsdGlT
ZWxlY3QpCi0gICAgICAgIGRlc2VsZWN0SXRlbXMoZGF0YSwgZWxlbWVudCwgY2xpY2tlZEVsZW1l
bnQpOwotCi0gICAgLy8gSWYgdGhlIGFuY2hvciBoYXNuJ3QgYmVlbiBzZXQsIGFuZCB3ZSdyZSBk
b2luZyBhIHNpbmdsZSBzZWxlY3Rpb24gb3IgYSBzaGlmdCBzZWxlY3Rpb24sIHRoZW4gaW5pdGlh
bGl6ZSB0aGUgYW5jaG9yIHRvIHRoZSBmaXJzdCBzZWxlY3RlZCBpbmRleC4KLSAgICBpZiAoZGF0
YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpIDwgMCAmJiAhbXVsdGlTZWxlY3QpCi0gICAg
ICAgIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGRhdGEsIGVsZW1lbnQsIHNlbGVjdGVk
SW5kZXgoZGF0YSwgZWxlbWVudCkpOwotCi0gICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gc3RhdGUg
b2YgdGhlIGNsaWNrZWQgb3B0aW9uCi0gICAgaWYgKG9wdGlvbiAmJiAhY2xpY2tlZEVsZW1lbnQt
PmRpc2FibGVkKCkpCi0gICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKLQot
ICAgIC8vIElmIHRoZXJlIHdhcyBubyBzZWxlY3RlZEluZGV4KCkgZm9yIHRoZSBwcmV2aW91cyBp
bml0aWFsaXphdGlvbiwgb3IKLSAgICAvLyBJZiB3ZSdyZSBkb2luZyBhIHNpbmdsZSBzZWxlY3Rp
b24sIG9yIGEgbXVsdGlwbGUgc2VsZWN0aW9uICh1c2luZyBjbWQgb3IgY3RybCksIHRoZW4gaW5p
dGlhbGl6ZSB0aGUgYW5jaG9yIGluZGV4IHRvIHRoZSBsaXN0SW5kZXggdGhhdCBqdXN0IGdvdCBj
bGlja2VkLgotICAgIGlmIChkYXRhLmFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KCkgPCAwIHx8
ICFzaGlmdFNlbGVjdCkKLSAgICAgICAgc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoZGF0
YSwgZWxlbWVudCwgbGlzdEluZGV4KTsKLQotICAgIHNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4
KGRhdGEsIGxpc3RJbmRleCk7Ci0gICAgdXBkYXRlTGlzdEJveFNlbGVjdGlvbihkYXRhLCBlbGVt
ZW50LCAhbXVsdGlTZWxlY3QpOwotfQotCi12b2lkIFNlbGVjdEVsZW1lbnQ6Omxpc3RCb3hEZWZh
dWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50
LCBFdmVudCogZXZlbnQsIEhUTUxGb3JtRWxlbWVudCogaHRtbEZvcm0pCi17Ci0gICAgY29uc3Qg
VmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7Ci0K
LSAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2Vkb3duRXZlbnQgJiYg
ZXZlbnQtPmlzTW91c2VFdmVudCgpICYmIHN0YXRpY19jYXN0PE1vdXNlRXZlbnQqPihldmVudCkt
PmJ1dHRvbigpID09IExlZnRCdXR0b24pIHsKLSAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLQot
ICAgICAgICBpZiAoIWVsZW1lbnQtPnJlbmRlcmVyKCkpIC8vIENhbGxpbmcgZm9jdXMoKSBtYXkg
Y2F1c2UgdXMgdG8gbG9zZSBvdXIgcmVuZGVyZXIsIGluIHdoaWNoIGNhc2UgZG8gbm90IHdhbnQg
dG8gaGFuZGxlIHRoZSBldmVudC4KLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBD
b252ZXJ0IHRvIGNvb3JkcyByZWxhdGl2ZSB0byB0aGUgbGlzdCBib3ggaWYgbmVlZGVkLgotICAg
ICAgICBNb3VzZUV2ZW50KiBtb3VzZUV2ZW50ID0gc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2
ZW50KTsKLSAgICAgICAgSW50UG9pbnQgbG9jYWxPZmZzZXQgPSByb3VuZGVkSW50UG9pbnQoZWxl
bWVudC0+cmVuZGVyZXIoKS0+YWJzb2x1dGVUb0xvY2FsKG1vdXNlRXZlbnQtPmFic29sdXRlTG9j
YXRpb24oKSwgZmFsc2UsIHRydWUpKTsKLSAgICAgICAgaW50IGxpc3RJbmRleCA9IHRvUmVuZGVy
TGlzdEJveChlbGVtZW50LT5yZW5kZXJlcigpKS0+bGlzdEluZGV4QXRPZmZzZXQodG9TaXplKGxv
Y2FsT2Zmc2V0KSk7Ci0gICAgICAgIGlmIChsaXN0SW5kZXggPj0gMCkgewotI2lmIFBMQVRGT1JN
KE1BQykgfHwgKFBMQVRGT1JNKENIUk9NSVVNKSAmJiBPUyhEQVJXSU4pKQotICAgICAgICAgICAg
dXBkYXRlU2VsZWN0ZWRTdGF0ZShkYXRhLCBlbGVtZW50LCBsaXN0SW5kZXgsIG1vdXNlRXZlbnQt
Pm1ldGFLZXkoKSwgbW91c2VFdmVudC0+c2hpZnRLZXkoKSk7Ci0jZWxzZQotICAgICAgICAgICAg
dXBkYXRlU2VsZWN0ZWRTdGF0ZShkYXRhLCBlbGVtZW50LCBsaXN0SW5kZXgsIG1vdXNlRXZlbnQt
PmN0cmxLZXkoKSwgbW91c2VFdmVudC0+c2hpZnRLZXkoKSk7Ci0jZW5kaWYKLSAgICAgICAgICAg
IGlmIChGcmFtZSogZnJhbWUgPSBlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKQotICAgICAg
ICAgICAgICAgIGZyYW1lLT5ldmVudEhhbmRsZXIoKS0+c2V0TW91c2VEb3duTWF5U3RhcnRBdXRv
c2Nyb2xsKCk7Ci0KLSAgICAgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAg
ICAgICB9Ci0gICAgfSBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5tb3Vz
ZXVwRXZlbnQgJiYgZXZlbnQtPmlzTW91c2VFdmVudCgpICYmIHN0YXRpY19jYXN0PE1vdXNlRXZl
bnQqPihldmVudCktPmJ1dHRvbigpID09IExlZnRCdXR0b24gJiYgZWxlbWVudC0+ZG9jdW1lbnQo
KS0+ZnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPmF1dG9zY3JvbGxSZW5kZXJlcigpICE9IGVsZW1l
bnQtPnJlbmRlcmVyKCkpIHsKLSAgICAgICAgLy8gVGhpcyBtYWtlcyBzdXJlIHdlIGZpcmUgZGlz
cGF0Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50IGZvciBhIHNpbmdsZSBjbGljay4gIEZvciBkcmFn
IHNlbGVjdGlvbiwgb25DaGFuZ2Ugd2lsbCBmaXJlIHdoZW4gdGhlIGF1dG9zY3JvbGwgdGltZXIg
c3RvcHMuCi0gICAgICAgIGxpc3RCb3hPbkNoYW5nZShkYXRhLCBlbGVtZW50KTsKLSAgICB9IGVs
c2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleWRvd25FdmVudCkgewotICAg
ICAgICBpZiAoIWV2ZW50LT5pc0tleWJvYXJkRXZlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgY29uc3QgU3RyaW5nJiBrZXlJZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8S2V5Ym9h
cmRFdmVudCo+KGV2ZW50KS0+a2V5SWRlbnRpZmllcigpOwotCi0gICAgICAgIGJvb2wgaGFuZGxl
ZCA9IGZhbHNlOwotICAgICAgICBpbnQgZW5kSW5kZXggPSAwOwotICAgICAgICBpZiAoZGF0YS5h
Y3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpIDwgMCkgewotICAgICAgICAgICAgLy8gSW5pdGlhbGl6
ZSB0aGUgZW5kIGluZGV4Ci0gICAgICAgICAgICBpZiAoa2V5SWRlbnRpZmllciA9PSAiRG93biIg
fHwga2V5SWRlbnRpZmllciA9PSAiUGFnZURvd24iKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0
YXJ0SW5kZXggPSBsYXN0U2VsZWN0ZWRMaXN0SW5kZXgoZGF0YSwgZWxlbWVudCk7Ci0gICAgICAg
ICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKGtleUlkZW50aWZp
ZXIgPT0gIkRvd24iKQotICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IG5leHRTZWxlY3Rh
YmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIHN0YXJ0SW5kZXgpOwotICAgICAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBuZXh0U2VsZWN0YWJsZUxpc3RJ
bmRleFBhZ2VBd2F5KGRhdGEsIGVsZW1lbnQsIHN0YXJ0SW5kZXgsIFNraXBGb3J3YXJkcyk7Ci0g
ICAgICAgICAgICB9IGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIlVwIiB8fCBrZXlJZGVudGlm
aWVyID09ICJQYWdlVXAiKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0SW5kZXggPSBvcHRp
b25Ub0xpc3RJbmRleChkYXRhLCBlbGVtZW50LCBzZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1lbnQp
KTsKLSAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAo
a2V5SWRlbnRpZmllciA9PSAiVXAiKQotICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IHBy
ZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBlbGVtZW50LCBzdGFydEluZGV4KTsKLSAg
ICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gbmV4dFNl
bGVjdGFibGVMaXN0SW5kZXhQYWdlQXdheShkYXRhLCBlbGVtZW50LCBzdGFydEluZGV4LCBTa2lw
QmFja3dhcmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
IC8vIFNldCB0aGUgZW5kIGluZGV4IGJhc2VkIG9uIHRoZSBjdXJyZW50IGVuZCBpbmRleAotICAg
ICAgICAgICAgaWYgKGtleUlkZW50aWZpZXIgPT0gIkRvd24iKSB7Ci0gICAgICAgICAgICAgICAg
ZW5kSW5kZXggPSBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBlbGVtZW50LCBkYXRhLmFj
dGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkpOwotICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVl
OwotICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlJZGVudGlmaWVyID09ICJVcCIpIHsKLSAgICAg
ICAgICAgICAgICBlbmRJbmRleCA9IHByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBl
bGVtZW50LCBkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkpOwotICAgICAgICAgICAgICAg
IGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlJZGVudGlmaWVyID09
ICJQYWdlRG93biIpIHsKLSAgICAgICAgICAgICAgICBlbmRJbmRleCA9IG5leHRTZWxlY3RhYmxl
TGlzdEluZGV4UGFnZUF3YXkoZGF0YSwgZWxlbWVudCwgZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJ
bmRleCgpLCBTa2lwRm9yd2FyZHMpOwotICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwot
ICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlJZGVudGlmaWVyID09ICJQYWdlVXAiKSB7Ci0gICAg
ICAgICAgICAgICAgZW5kSW5kZXggPSBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleFBhZ2VBd2F5KGRh
dGEsIGVsZW1lbnQsIGRhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSwgU2tpcEJhY2t3YXJk
cyk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICAgICAgaWYgKGtleUlkZW50aWZpZXIgPT0gIkhvbWUiKSB7Ci0gICAgICAgICAg
ICBlbmRJbmRleCA9IGZpcnN0U2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBlbGVtZW50KTsKLSAg
ICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGtleUlkZW50aWZp
ZXIgPT0gIkVuZCIpIHsKLSAgICAgICAgICAgIGVuZEluZGV4ID0gbGFzdFNlbGVjdGFibGVMaXN0
SW5kZXgoZGF0YSwgZWxlbWVudCk7Ci0gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAg
ICAgfQotCi0gICAgICAgIGlmIChpc1NwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZChlbGVtZW50LT5k
b2N1bWVudCgpLT5mcmFtZSgpKSkKLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzZWxlY3Rp
b24gbW92ZXMgdG8gdGhlIGJvdW5kYXJ5LgotICAgICAgICAgICAgaWYgKGtleUlkZW50aWZpZXIg
PT0gIkxlZnQiIHx8IGtleUlkZW50aWZpZXIgPT0gIlJpZ2h0IiB8fCAoKGtleUlkZW50aWZpZXIg
PT0gIkRvd24iIHx8IGtleUlkZW50aWZpZXIgPT0gIlVwIikgJiYgZW5kSW5kZXggPT0gZGF0YS5h
Y3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAg
ICAgICAgaWYgKGVuZEluZGV4ID49IDAgJiYgaGFuZGxlZCkgewotICAgICAgICAgICAgLy8gU2F2
ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlv
biB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBldmVudHMgaW1tZWRpYXRlbHkgYWZ0ZXIgbWFraW5n
IHRoZSBuZXcgc2VsZWN0aW9uLgotICAgICAgICAgICAgc2F2ZUxhc3RTZWxlY3Rpb24oZGF0YSwg
ZWxlbWVudCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQobGlzdEl0ZW1zLCAhbGlzdEl0
ZW1zLnNpemUoKSB8fCAoZW5kSW5kZXggPj0gMCAmJiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZW5k
SW5kZXgpIDwgbGlzdEl0ZW1zLnNpemUoKSkpOwotICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0
aW9uRW5kSW5kZXgoZGF0YSwgZW5kSW5kZXgpOwotCi0gICAgICAgICAgICBib29sIHNlbGVjdE5l
d0l0ZW0gPSAhZGF0YS5tdWx0aXBsZSgpIHx8IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihl
dmVudCktPnNoaWZ0S2V5KCkgfHwgIWlzU3BhdGlhbE5hdmlnYXRpb25FbmFibGVkKGVsZW1lbnQt
PmRvY3VtZW50KCktPmZyYW1lKCkpOwotICAgICAgICAgICAgaWYgKHNlbGVjdE5ld0l0ZW0pCi0g
ICAgICAgICAgICAgICAgZGF0YS5zZXRBY3RpdmVTZWxlY3Rpb25TdGF0ZSh0cnVlKTsKLSAgICAg
ICAgICAgIC8vIElmIHRoZSBhbmNob3IgaXMgdW5pdGlhbGl6ZWQsIG9yIGlmIHdlJ3JlIGdvaW5n
IHRvIGRlc2VsZWN0IGFsbCBvdGhlciBvcHRpb25zLCB0aGVuIHNldCB0aGUgYW5jaG9yIGluZGV4
IGVxdWFsIHRvIHRoZSBlbmQgaW5kZXguCi0gICAgICAgICAgICBib29sIGRlc2VsZWN0T3RoZXJz
ID0gIWRhdGEubXVsdGlwbGUoKSB8fCAoIXN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihldmVu
dCktPnNoaWZ0S2V5KCkgJiYgc2VsZWN0TmV3SXRlbSk7Ci0gICAgICAgICAgICBpZiAoZGF0YS5h
Y3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpIDwgMCB8fCBkZXNlbGVjdE90aGVycykgewotICAg
ICAgICAgICAgICAgIGlmIChkZXNlbGVjdE90aGVycykKLSAgICAgICAgICAgICAgICAgICAgZGVz
ZWxlY3RJdGVtcyhkYXRhLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBzZXRBY3RpdmVTZWxl
Y3Rpb25BbmNob3JJbmRleChkYXRhLCBlbGVtZW50LCBkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZElu
ZGV4KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0b1JlbmRlckxpc3RCb3goZWxl
bWVudC0+cmVuZGVyZXIoKSktPnNjcm9sbFRvUmV2ZWFsRWxlbWVudEF0TGlzdEluZGV4KGVuZElu
ZGV4KTsKLSAgICAgICAgICAgIGlmIChzZWxlY3ROZXdJdGVtKSB7Ci0gICAgICAgICAgICAgICAg
dXBkYXRlTGlzdEJveFNlbGVjdGlvbihkYXRhLCBlbGVtZW50LCBkZXNlbGVjdE90aGVycyk7Ci0g
ICAgICAgICAgICAgICAgbGlzdEJveE9uQ2hhbmdlKGRhdGEsIGVsZW1lbnQpOwotICAgICAgICAg
ICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgc2Nyb2xsVG9TZWxlY3Rpb24oZGF0YSwgZWxlbWVu
dCk7Ci0KLSAgICAgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9
Ci0gICAgfSBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5rZXlwcmVzc0V2
ZW50KSB7Ci0gICAgICAgIGlmICghZXZlbnQtPmlzS2V5Ym9hcmRFdmVudCgpKQotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICBpbnQga2V5Q29kZSA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZl
bnQqPihldmVudCktPmtleUNvZGUoKTsKLQotICAgICAgICBpZiAoa2V5Q29kZSA9PSAnXHInKSB7
Ci0gICAgICAgICAgICBpZiAoaHRtbEZvcm0pCi0gICAgICAgICAgICAgICAgaHRtbEZvcm0tPnN1
Ym1pdEltcGxpY2l0bHkoZXZlbnQsIGZhbHNlKTsKLSAgICAgICAgICAgIGV2ZW50LT5zZXREZWZh
dWx0SGFuZGxlZCgpOwotICAgICAgICB9IGVsc2UgaWYgKGRhdGEubXVsdGlwbGUoKSAmJiBrZXlD
b2RlID09ICcgJyAmJiBpc1NwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZChlbGVtZW50LT5kb2N1bWVu
dCgpLT5mcmFtZSgpKSkgewotICAgICAgICAgICAgLy8gVXNlIHNwYWNlIHRvIHRvZ2dsZSBzZWxl
Y3Rpb24gY2hhbmdlLgotICAgICAgICAgICAgZGF0YS5zZXRBY3RpdmVTZWxlY3Rpb25TdGF0ZSgh
ZGF0YS5hY3RpdmVTZWxlY3Rpb25TdGF0ZSgpKTsKLSAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGVk
U3RhdGUoZGF0YSwgZWxlbWVudCwgbGlzdFRvT3B0aW9uSW5kZXgoZGF0YSwgZWxlbWVudCwgZGF0
YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpKSwgdHJ1ZSAvKm11bHRpKi8sIGZhbHNlIC8qc2hp
ZnQqLyk7Ci0gICAgICAgICAgICBsaXN0Qm94T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7Ci0gICAg
ICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0KLX0K
LQotdm9pZCBTZWxlY3RFbGVtZW50OjpkZWZhdWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1lbnRE
YXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBFdmVudCogZXZlbnQsIEhUTUxGb3JtRWxlbWVu
dCogaHRtbEZvcm0pCi17Ci0gICAgaWYgKCFlbGVtZW50LT5yZW5kZXJlcigpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBpZiAoZGF0YS51c2VzTWVudUxpc3QoKSkKLSAgICAgICAgbWVudUxpc3RE
ZWZhdWx0RXZlbnRIYW5kbGVyKGRhdGEsIGVsZW1lbnQsIGV2ZW50LCBodG1sRm9ybSk7Ci0gICAg
ZWxzZSAKLSAgICAgICAgbGlzdEJveERlZmF1bHRFdmVudEhhbmRsZXIoZGF0YSwgZWxlbWVudCwg
ZXZlbnQsIGh0bWxGb3JtKTsKLQotICAgIGlmIChldmVudC0+ZGVmYXVsdEhhbmRsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtl
eXByZXNzRXZlbnQgJiYgZXZlbnQtPmlzS2V5Ym9hcmRFdmVudCgpKSB7Ci0gICAgICAgIEtleWJv
YXJkRXZlbnQqIGtleWJvYXJkRXZlbnQgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50Kj4oZXZl
bnQpOwotICAgICAgICBpZiAoIWtleWJvYXJkRXZlbnQtPmN0cmxLZXkoKSAmJiAha2V5Ym9hcmRF
dmVudC0+YWx0S2V5KCkgJiYgIWtleWJvYXJkRXZlbnQtPm1ldGFLZXkoKSAmJiBpc1ByaW50YWJs
ZUNoYXIoa2V5Ym9hcmRFdmVudC0+Y2hhckNvZGUoKSkpIHsKLSAgICAgICAgICAgIHR5cGVBaGVh
ZEZpbmQoZGF0YSwgZWxlbWVudCwga2V5Ym9hcmRFdmVudCk7Ci0gICAgICAgICAgICBldmVudC0+
c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAg
IH0KLX0KLQotaW50IFNlbGVjdEVsZW1lbnQ6Omxhc3RTZWxlY3RlZExpc3RJbmRleChjb25zdCBT
ZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgY29uc3QgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICAv
LyByZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgbGFzdCBvcHRpb24gc2VsZWN0ZWQKLSAgICB1bnNp
Z25lZCBpbmRleCA9IDA7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGNvbnN0IFZlY3Rv
cjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7Ci0gICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoT3B0aW9u
RWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSkpIHsKLSAg
ICAgICAgICAgIGlmIChvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAg
ICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmb3VuZCA/IChpbnQpIGluZGV4IDog
LTE7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgc3RyaXBMZWFkaW5nV2hpdGVTcGFjZShjb25zdCBTdHJp
bmcmIHN0cmluZykKLXsKLSAgICBpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCi0gICAg
aW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgICAgIGlmIChz
dHJpbmdbaV0gIT0gbm9CcmVha1NwYWNlICYmIChzdHJpbmdbaV0gPD0gMHg3RiA/ICFpc0FTQ0lJ
U3BhY2Uoc3RyaW5nW2ldKSA6IChkaXJlY3Rpb24oc3RyaW5nW2ldKSAhPSBXaGl0ZVNwYWNlTmV1
dHJhbCkpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0cmluZy5z
dWJzdHJpbmcoaSwgbGVuZ3RoIC0gaSk7Ci19Ci0KLXZvaWQgU2VsZWN0RWxlbWVudDo6dHlwZUFo
ZWFkRmluZChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgS2V5Ym9h
cmRFdmVudCogZXZlbnQpCi17Ci0gICAgaWYgKGV2ZW50LT50aW1lU3RhbXAoKSA8IGRhdGEubGFz
dENoYXJUaW1lKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIERPTVRpbWVTdGFtcCBkZWx0YSA9
IGV2ZW50LT50aW1lU3RhbXAoKSAtIGRhdGEubGFzdENoYXJUaW1lKCk7Ci0gICAgZGF0YS5zZXRM
YXN0Q2hhclRpbWUoZXZlbnQtPnRpbWVTdGFtcCgpKTsKLQotICAgIFVDaGFyIGMgPSBldmVudC0+
Y2hhckNvZGUoKTsKLQotICAgIFN0cmluZyBwcmVmaXg7Ci0gICAgaW50IHNlYXJjaFN0YXJ0T2Zm
c2V0ID0gMTsKLSAgICBpZiAoZGVsdGEgPiB0eXBlQWhlYWRUaW1lb3V0KSB7Ci0gICAgICAgIHBy
ZWZpeCA9IFN0cmluZygmYywgMSk7Ci0gICAgICAgIGRhdGEuc2V0VHlwZWRTdHJpbmcocHJlZml4
KTsKLSAgICAgICAgZGF0YS5zZXRSZXBlYXRpbmdDaGFyKGMpOwotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIGRhdGEudHlwZWRTdHJpbmcoKS5hcHBlbmQoYyk7Ci0KLSAgICAgICAgaWYgKGMgPT0gZGF0
YS5yZXBlYXRpbmdDaGFyKCkpCi0gICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBsaWtlbHkgdHJ5
aW5nIHRvIGN5Y2xlIHRocm91Z2ggYWxsIHRoZSBpdGVtcyBzdGFydGluZyB3aXRoIHRoaXMgY2hh
cmFjdGVyLCBzbyBqdXN0IHNlYXJjaCBvbiB0aGUgY2hhcmFjdGVyCi0gICAgICAgICAgICBwcmVm
aXggPSBTdHJpbmcoJmMsIDEpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEuc2V0
UmVwZWF0aW5nQ2hhcigwKTsKLSAgICAgICAgICAgIHByZWZpeCA9IGRhdGEudHlwZWRTdHJpbmco
KTsKLSAgICAgICAgICAgIHNlYXJjaFN0YXJ0T2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxl
bWVudCk7Ci0gICAgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKLSAgICBpZiAoaXRlbUNv
dW50IDwgMSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW50IHNlbGVjdGVkID0gc2VsZWN0ZWRJ
bmRleChkYXRhLCBlbGVtZW50KTsKLSAgICBpbnQgaW5kZXggPSAob3B0aW9uVG9MaXN0SW5kZXgo
ZGF0YSwgZWxlbWVudCwgc2VsZWN0ZWQgPj0gMCA/IHNlbGVjdGVkIDogMCkgKyBzZWFyY2hTdGFy
dE9mZnNldCkgJSBpdGVtQ291bnQ7Ci0gICAgQVNTRVJUKGluZGV4ID49IDApOwotCi0gICAgLy8g
Q29tcHV0ZSBhIGNhc2UtZm9sZGVkIGNvcHkgb2YgdGhlIHByZWZpeCBzdHJpbmcgYmVmb3JlIGJl
Z2lubmluZyB0aGUgc2VhcmNoIGZvcgotICAgIC8vIGEgbWF0Y2hpbmcgZWxlbWVudC4gVGhpcyBj
b2RlIHVzZXMgZm9sZENhc2UgdG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdAotICAgIC8vIFN0
cmluZzo6c3RhcnRXaXRoIGRvZXMgbm90IGZvbGQgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuIFRoaXMg
Y29kZSBjYW4gYmUgY2hhbmdlZAotICAgIC8vIHRvIHVzZSBzdGFydFdpdGggb25jZSB0aGF0IGlz
IGZpeGVkLgotICAgIFN0cmluZyBwcmVmaXhXaXRoQ2FzZUZvbGRlZChwcmVmaXguZm9sZENhc2Uo
KSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7ICsraSwgaW5kZXggPSAoaW5k
ZXggKyAxKSAlIGl0ZW1Db3VudCkgewotICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVt
ZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2luZGV4XSk7Ci0gICAgICAgIGlmICghb3B0aW9u
RWxlbWVudCB8fCBpdGVtc1tpbmRleF0tPmRpc2FibGVkKCkpCi0gICAgICAgICAgICBjb250aW51
ZTsKLQotICAgICAgICAvLyBGb2xkIHRoZSBvcHRpb24gc3RyaW5nIGFuZCBjaGVjayBpZiBpdHMg
cHJlZml4IGlzIGVxdWFsIHRvIHRoZSBmb2xkZWQgcHJlZml4LgotICAgICAgICBTdHJpbmcgdGV4
dCA9IG9wdGlvbkVsZW1lbnQtPnRleHRJbmRlbnRlZFRvUmVzcGVjdEdyb3VwTGFiZWwoKTsKLSAg
ICAgICAgaWYgKHN0cmlwTGVhZGluZ1doaXRlU3BhY2UodGV4dCkuZm9sZENhc2UoKS5zdGFydHNX
aXRoKHByZWZpeFdpdGhDYXNlRm9sZGVkKSkgewotICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRl
eChkYXRhLCBlbGVtZW50LCBsaXN0VG9PcHRpb25JbmRleChkYXRhLCBlbGVtZW50LCBpbmRleCkp
OwotICAgICAgICAgICAgaWYgKCFkYXRhLnVzZXNNZW51TGlzdCgpKQotICAgICAgICAgICAgICAg
IGxpc3RCb3hPbkNoYW5nZShkYXRhLCBlbGVtZW50KTsKLQotICAgICAgICAgICAgc2V0T3B0aW9u
c0NoYW5nZWRPblJlbmRlcmVyKGRhdGEsIGVsZW1lbnQpOwotICAgICAgICAgICAgZWxlbWVudC0+
c2V0TmVlZHNTdHlsZVJlY2FsYygpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0g
ICAgfQotfQotCi12b2lkIFNlbGVjdEVsZW1lbnQ6Omluc2VydGVkSW50b1RyZWUoU2VsZWN0RWxl
bWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgLy8gV2hlbiB0aGUgZWxl
bWVudCBpcyBjcmVhdGVkIGR1cmluZyBkb2N1bWVudCBwYXJzaW5nLCBpdCB3b24ndCBoYXZlIGFu
eSBpdGVtcyB5ZXQgLSBidXQgZm9yIGlubmVySFRNTAotICAgIC8vIGFuZCByZWxhdGVkIG1ldGhv
ZHMsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgd2hvbGUgc3VidHJlZSBpcyBjb25z
dHJ1Y3RlZC4KLSAgICByZWNhbGNMaXN0SXRlbXMoZGF0YSwgZWxlbWVudCwgdHJ1ZSk7Ci19Ci0K
LXZvaWQgU2VsZWN0RWxlbWVudDo6YWNjZXNzS2V5U2V0U2VsZWN0ZWRJbmRleChTZWxlY3RFbGVt
ZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgaW50IGluZGV4KQoteyAgICAKLSAgICAv
LyBmaXJzdCBicmluZyBpbnRvIGZvY3VzIHRoZSBsaXN0IGJveAotICAgIGlmICghZWxlbWVudC0+
Zm9jdXNlZCgpKQotICAgICAgICBlbGVtZW50LT5hY2Nlc3NLZXlBY3Rpb24oZmFsc2UpOwotICAg
IAotICAgIC8vIGlmIHRoaXMgaW5kZXggaXMgYWxyZWFkeSBzZWxlY3RlZCwgdW5zZWxlY3QuIG90
aGVyd2lzZSB1cGRhdGUgdGhlIHNlbGVjdGVkIGluZGV4Ci0gICAgY29uc3QgVmVjdG9yPEVsZW1l
bnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAgICBpbnQgbGlzdEluZGV4
ID0gb3B0aW9uVG9MaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgaW5kZXgpOwotICAgIGlmIChPcHRp
b25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gKGxpc3RJbmRleCA+PSAwID8gdG9PcHRpb25FbGVt
ZW50KGl0ZW1zW2xpc3RJbmRleF0pIDogMCkpIHsKLSAgICAgICAgaWYgKG9wdGlvbkVsZW1lbnQt
PnNlbGVjdGVkKCkpCi0gICAgICAgICAgICBvcHRpb25FbGVtZW50LT5zZXRTZWxlY3RlZFN0YXRl
KGZhbHNlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChkYXRh
LCBlbGVtZW50LCBpbmRleCwgZmFsc2UsIHRydWUpOwotICAgIH0KLQotICAgIGlmIChkYXRhLnVz
ZXNNZW51TGlzdCgpKQotICAgICAgICBtZW51TGlzdE9uQ2hhbmdlKGRhdGEsIGVsZW1lbnQpOwot
ICAgIGVsc2UKLSAgICAgICAgbGlzdEJveE9uQ2hhbmdlKGRhdGEsIGVsZW1lbnQpOwotCi0gICAg
c2Nyb2xsVG9TZWxlY3Rpb24oZGF0YSwgZWxlbWVudCk7Ci19Ci0KLXVuc2lnbmVkIFNlbGVjdEVs
ZW1lbnQ6Om9wdGlvbkNvdW50KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBF
bGVtZW50KiBlbGVtZW50KQotewotICAgIHVuc2lnbmVkIG9wdGlvbnMgPSAwOwotCi0gICAgY29u
c3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAg
aWYgKGlzT3B0aW9uRWxlbWVudChpdGVtc1tpXSkpCi0gICAgICAgICAgICArK29wdGlvbnM7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIG9wdGlvbnM7Ci19Ci0KIC8vIFNlbGVjdEVsZW1lbnREYXRhCiBT
ZWxlY3RFbGVtZW50RGF0YTo6U2VsZWN0RWxlbWVudERhdGEoKQogICAgIDogbV9sYXN0Q2hhclRp
bWUoMCkKQEAgLTEwNzEsNyArNzUsNyBAQCB2b2lkIFNlbGVjdEVsZW1lbnREYXRhOjpjaGVja0xp
c3RJdGVtcyhjb25zdCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAogewogI2lmICFBU1NFUlRfRElT
QUJMRUQKICAgICBWZWN0b3I8RWxlbWVudCo+IGl0ZW1zID0gbV9saXN0SXRlbXM7Ci0gICAgU2Vs
ZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zKCpjb25zdF9jYXN0PFNlbGVjdEVsZW1lbnREYXRh
Kj4odGhpcyksIGVsZW1lbnQsIGZhbHNlKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudDo6cmVjYWxj
TGlzdEl0ZW1zKCpjb25zdF9jYXN0PFNlbGVjdEVsZW1lbnREYXRhKj4odGhpcyksIGVsZW1lbnQs
IGZhbHNlKTsKICAgICBBU1NFUlQoaXRlbXMgPT0gbV9saXN0SXRlbXMpOwogI2Vsc2UKICAgICBV
TlVTRURfUEFSQU0oZWxlbWVudCk7CkBAIC0xMDgxLDcgKzg1LDcgQEAgdm9pZCBTZWxlY3RFbGVt
ZW50RGF0YTo6Y2hlY2tMaXN0SXRlbXMoY29uc3QgRWxlbWVudCogZWxlbWVudCkgY29uc3QKIFZl
Y3RvcjxFbGVtZW50Kj4mIFNlbGVjdEVsZW1lbnREYXRhOjpsaXN0SXRlbXMoY29uc3QgRWxlbWVu
dCogZWxlbWVudCkKIHsKICAgICBpZiAobV9yZWNhbGNMaXN0SXRlbXMpCi0gICAgICAgIFNlbGVj
dEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtcygqdGhpcywgZWxlbWVudCk7CisgICAgICAgIEhUTUxT
ZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMoKnRoaXMsIGVsZW1lbnQpOwogICAgIGVsc2UK
ICAgICAgICAgY2hlY2tMaXN0SXRlbXMoZWxlbWVudCk7CiAKQEAgLTEwOTEsMTggKzk1LDExIEBA
IFZlY3RvcjxFbGVtZW50Kj4mIFNlbGVjdEVsZW1lbnREYXRhOjpsaXN0SXRlbXMoY29uc3QgRWxl
bWVudCogZWxlbWVudCkKIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIFNlbGVjdEVsZW1lbnREYXRh
OjpsaXN0SXRlbXMoY29uc3QgRWxlbWVudCogZWxlbWVudCkgY29uc3QKIHsKICAgICBpZiAobV9y
ZWNhbGNMaXN0SXRlbXMpCi0gICAgICAgIFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtcygq
Y29uc3RfY2FzdDxTZWxlY3RFbGVtZW50RGF0YSo+KHRoaXMpLCBlbGVtZW50KTsKKyAgICAgICAg
SFRNTFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtcygqY29uc3RfY2FzdDxTZWxlY3RFbGVt
ZW50RGF0YSo+KHRoaXMpLCBlbGVtZW50KTsKICAgICBlbHNlCiAgICAgICAgIGNoZWNrTGlzdEl0
ZW1zKGVsZW1lbnQpOwogCiAgICAgcmV0dXJuIG1fbGlzdEl0ZW1zOwogfQogCi1TZWxlY3RFbGVt
ZW50KiB0b1NlbGVjdEVsZW1lbnQoRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBpZiAoZWxlbWVu
dC0+aXNIVE1MRWxlbWVudCgpICYmIGVsZW1lbnQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpzZWxl
Y3RUYWcpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihl
bGVtZW50KTsKLSAgICByZXR1cm4gMDsKLX0KLQogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvZG9tL1NlbGVjdEVsZW1lbnQuaCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9TZWxlY3RFbGVtZW50
LmgKaW5kZXggODQ3OTM3YTk1MzdlNWRlZmNkMmU0ZjVmZTA1OTI4MTk3OGYxNDIzYy4uM2ZlNTZh
NmQ0ZmU4MDVkMzZiZjBhODQ0MGI4M2U3ZmIyOGVmNWQ0OCAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvZG9tL1NlbGVjdEVsZW1lbnQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vU2VsZWN0
RWxlbWVudC5oCkBAIC0zMCw4OSArMzAsMTAgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1j
bGFzcyBBdHRyaWJ1dGU7CiBjbGFzcyBFbGVtZW50OwotY2xhc3MgRXZlbnQ7Ci1jbGFzcyBGb3Jt
RGF0YUxpc3Q7Ci1jbGFzcyBIVE1MRm9ybUVsZW1lbnQ7Ci1jbGFzcyBLZXlib2FyZEV2ZW50Owot
Y2xhc3MgU2VsZWN0RWxlbWVudERhdGE7Ci0KLWNsYXNzIFNlbGVjdEVsZW1lbnQgewotcHVibGlj
OgotICAgIHZpcnR1YWwgYm9vbCBtdWx0aXBsZSgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwg
aW50IHNpemUoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBjb25zdCBWZWN0b3I8RWxlbWVudCo+
JiBsaXN0SXRlbXMoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbGlzdEJveE9uQ2hh
bmdlKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVMaXN0Qm94U2VsZWN0aW9uKGJvb2wg
ZGVzZWxlY3RPdGhlck9wdGlvbnMpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBtZW51TGlzdE9u
Q2hhbmdlKCkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQgYWN0aXZlU2VsZWN0aW9uU3RhcnRMaXN0
SW5kZXgoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBpbnQgYWN0aXZlU2VsZWN0aW9uRW5kTGlz
dEluZGV4KCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIHNldEFjdGl2ZVNlbGVjdGlv
bkFuY2hvckluZGV4KGludCBpbmRleCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmVT
ZWxlY3Rpb25FbmRJbmRleChpbnQgaW5kZXgpID0gMDsKLQotICAgIHZpcnR1YWwgaW50IGxpc3RU
b09wdGlvbkluZGV4KGludCBsaXN0SW5kZXgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIGludCBv
cHRpb25Ub0xpc3RJbmRleChpbnQgb3B0aW9uSW5kZXgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1
YWwgaW50IHNlbGVjdGVkSW5kZXgoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHNldFNl
bGVjdGVkSW5kZXgoaW50IGluZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1ZSkgPSAwOwotICAgIHZp
cnR1YWwgdm9pZCBzZXRTZWxlY3RlZEluZGV4QnlVc2VyKGludCBpbmRleCwgYm9vbCBkZXNlbGVj
dCA9IHRydWUsIGJvb2wgZmlyZU9uQ2hhbmdlTm93ID0gZmFsc2UsIGJvb2wgYWxsb3dNdWx0aXBs
ZVNlbGVjdGlvbiA9IGZhbHNlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbGlzdEJveFNlbGVj
dEl0ZW0oaW50IGxpc3RJbmRleCwgYm9vbCBhbGxvd011bHRpcGx5U2VsZWN0aW9ucywgYm9vbCBz
aGlmdCwgYm9vbCBmaXJlT25DaGFuZ2VOb3cgPSB0cnVlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgdXBkYXRlVmFsaWRpdHkoKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5TZWxl
Y3RFbGVtZW50KCkgeyB9Ci0KLSAgICBmcmllbmQgY2xhc3MgU2VsZWN0RWxlbWVudERhdGE7Ci0K
LSAgICBzdGF0aWMgdm9pZCBzZWxlY3RBbGwoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7
Ci0gICAgc3RhdGljIHZvaWQgc2F2ZUxhc3RTZWxlY3Rpb24oU2VsZWN0RWxlbWVudERhdGEmLCBF
bGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgo
U2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgaW50IGluZGV4KTsKLSAgICBzdGF0aWMgdm9p
ZCBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChTZWxlY3RFbGVtZW50RGF0YSYsIGludCBpbmRl
eCk7Ci0gICAgc3RhdGljIHZvaWQgdXBkYXRlTGlzdEJveFNlbGVjdGlvbihTZWxlY3RFbGVtZW50
RGF0YSYsIEVsZW1lbnQqLCBib29sIGRlc2VsZWN0T3RoZXJPcHRpb25zKTsKLSAgICBzdGF0aWMg
dm9pZCBsaXN0Qm94T25DaGFuZ2UoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7Ci0gICAg
c3RhdGljIHZvaWQgbWVudUxpc3RPbkNoYW5nZShTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQq
KTsKLSAgICBzdGF0aWMgdm9pZCBzY3JvbGxUb1NlbGVjdGlvbihTZWxlY3RFbGVtZW50RGF0YSYs
IEVsZW1lbnQqKTsKLSAgICBzdGF0aWMgdm9pZCBzZXRSZWNhbGNMaXN0SXRlbXMoU2VsZWN0RWxl
bWVudERhdGEmLCBFbGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgcmVjYWxjTGlzdEl0ZW1zKFNl
bGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCosIGJvb2wgdXBkYXRlU2VsZWN0ZWRTdGF0
ZXMgPSB0cnVlKTsKLSAgICBzdGF0aWMgaW50IHNlbGVjdGVkSW5kZXgoY29uc3QgU2VsZWN0RWxl
bWVudERhdGEmLCBjb25zdCBFbGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgc2V0U2VsZWN0ZWRJ
bmRleChTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBpbnQgb3B0aW9uSW5kZXgsIGJvb2wg
ZGVzZWxlY3QgPSB0cnVlLCBib29sIGZpcmVPbkNoYW5nZU5vdyA9IGZhbHNlLCBib29sIHVzZXJE
cml2ZW5DaGFuZ2UgPSB0cnVlKTsKLSAgICBzdGF0aWMgaW50IG9wdGlvblRvTGlzdEluZGV4KGNv
bnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCosIGludCBvcHRpb25JbmRleCk7
Ci0gICAgc3RhdGljIGludCBsaXN0VG9PcHRpb25JbmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0
YSYsIGNvbnN0IEVsZW1lbnQqLCBpbnQgbGlzdEluZGV4KTsKLSAgICBzdGF0aWMgdm9pZCBkaXNw
YXRjaEZvY3VzRXZlbnQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7Ci0gICAgc3RhdGlj
IHZvaWQgZGlzcGF0Y2hCbHVyRXZlbnQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7Ci0g
ICAgc3RhdGljIHZvaWQgZGVzZWxlY3RJdGVtcyhTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQq
LCBFbGVtZW50KiBleGNsdWRlRWxlbWVudCA9IDApOwotICAgIHN0YXRpYyBib29sIHNhdmVGb3Jt
Q29udHJvbFN0YXRlKGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCosIFN0
cmluZyYgc3RhdGUpOwotICAgIHN0YXRpYyB2b2lkIHJlc3RvcmVGb3JtQ29udHJvbFN0YXRlKFNl
bGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIGNvbnN0IFN0cmluZyYgc3RhdGUpOwotICAgIHN0
YXRpYyB2b2lkIHBhcnNlTXVsdGlwbGVBdHRyaWJ1dGUoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVt
ZW50KiwgQXR0cmlidXRlKik7Ci0gICAgc3RhdGljIGJvb2wgYXBwZW5kRm9ybURhdGEoU2VsZWN0
RWxlbWVudERhdGEmLCBFbGVtZW50KiwgRm9ybURhdGFMaXN0Jik7Ci0gICAgc3RhdGljIHZvaWQg
cmVzZXQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgZGVm
YXVsdEV2ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBFdmVudCosIEhU
TUxGb3JtRWxlbWVudCopOwotICAgIHN0YXRpYyBpbnQgbGFzdFNlbGVjdGVkTGlzdEluZGV4KGNv
bnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCopOwotICAgIHN0YXRpYyB2b2lk
IHR5cGVBaGVhZEZpbmQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgS2V5Ym9hcmRFdmVu
dCopOwotICAgIHN0YXRpYyB2b2lkIGluc2VydGVkSW50b1RyZWUoU2VsZWN0RWxlbWVudERhdGEm
LCBFbGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgYWNjZXNzS2V5U2V0U2VsZWN0ZWRJbmRleChT
ZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBpbnQgaW5kZXgpOwotICAgIHN0YXRpYyB1bnNp
Z25lZCBvcHRpb25Db3VudChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQq
KTsKLQotICAgIHN0YXRpYyB2b2lkIHVwZGF0ZVNlbGVjdGVkU3RhdGUoU2VsZWN0RWxlbWVudERh
dGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBsaXN0SW5kZXgsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBib29sIG11bHRpLCBib29sIHNoaWZ0KTsKLSAKLXByaXZh
dGU6Ci0gICAgc3RhdGljIHZvaWQgbWVudUxpc3REZWZhdWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVs
ZW1lbnREYXRhJiwgRWxlbWVudCosIEV2ZW50KiwgSFRNTEZvcm1FbGVtZW50Kik7Ci0gICAgc3Rh
dGljIGJvb2wgcGxhdGZvcm1IYW5kbGVLZXlkb3duRXZlbnQoU2VsZWN0RWxlbWVudERhdGEmLCBF
bGVtZW50KiwgS2V5Ym9hcmRFdmVudCopOwotICAgIHN0YXRpYyB2b2lkIGxpc3RCb3hEZWZhdWx0
RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIEV2ZW50KiwgSFRNTEZv
cm1FbGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgc2V0T3B0aW9uc0NoYW5nZWRPblJlbmRlcmVy
KFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCopOwotfTsKIAogLy8gSFRNTFNlbGVjdEVsZW1l
bnQgaG9sZCB0aGlzIHN0cnVjdCBhcyBtZW1iZXIgdmFyaWFibGUKLS8vIGFuZCBwYXNzIGl0IHRv
IHRoZSBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucyBpbiBTZWxlY3RFbGVtZW50CisvLyBhbmQgcGFz
cyBpdCB0byB0aGUgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMuCiBjbGFzcyBTZWxlY3RFbGVtZW50
RGF0YSB7CiBwdWJsaWM6CiAgICAgU2VsZWN0RWxlbWVudERhdGEoKTsKQEAgLTE5MSw4ICsxMTIs
NiBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9yZWNhbGNMaXN0SXRlbXM7CiB9OwogCi1TZWxlY3RF
bGVtZW50KiB0b1NlbGVjdEVsZW1lbnQoRWxlbWVudCopOwotCiB9CiAKICNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MU2VsZWN0RWxlbWVudC5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9odG1sL0hUTUxTZWxlY3RFbGVtZW50LmNwcAppbmRleCAxNjc5ZmFiOTcxNWYzZmI2
ODhmZWIwMzJlNWY5NTBiMmM1MjVhMDQzLi5lZmZhZTViMWVlN2IzMWQwM2U5ZWY4MTRkYWZmMTUz
ZDczMTBlMTg2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxTZWxlY3RFbGVt
ZW50LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxTZWxlY3RFbGVtZW50LmNwcApA
QCAtMyw5ICszLDEwIEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxA
a2RlLm9yZykKICAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9A
a2RlLm9yZykKICAqICAgICAgICAgICAoQykgMjAwMSBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2Rl
Lm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAx
MCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQs
IDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgogICogICAgICAgICAgIChDKSAyMDA2IEFsZXhleSBQcm9za3VyeWFrb3YgKGFw
QG55cG9wLmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pCiAgKgogICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKQEAgLTI5LDE1ICszMCwyNyBAQAogCiAjaW5jbHVkZSAiQVhPYmplY3RDYWNoZS5o
IgogI2luY2x1ZGUgIkF0dHJpYnV0ZS5oIgorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUg
IkNocm9tZUNsaWVudC5oIgogI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKKyNpbmNsdWRlICJGb3Jt
RGF0YUxpc3QuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVu
dC5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50
LmgiCiAjaW5jbHVkZSAiSFRNTE9wdGlvbnNDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiS2V5Ym9h
cmRFdmVudC5oIgorI2luY2x1ZGUgIk1vdXNlRXZlbnQuaCIKKyNpbmNsdWRlICJPcHRpb25Hcm91
cEVsZW1lbnQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCiAjaW5jbHVkZSAiUmVuZGVyTGlzdEJveC5o
IgogI2luY2x1ZGUgIlJlbmRlck1lbnVMaXN0LmgiCiAjaW5jbHVkZSAiU2NyaXB0RXZlbnRMaXN0
ZW5lci5oIgorI2luY2x1ZGUgIlNwYXRpYWxOYXZpZ2F0aW9uLmgiCisjaW5jbHVkZSA8d3RmL3Vu
aWNvZGUvVW5pY29kZS5oPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNl
IFdURjo6VW5pY29kZTsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC00Niw2ICs1OSwyNiBA
QCB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogLy8gVXBwZXIgbGltaXQgYWdyZWVkIHVwb24g
d2l0aCByZXByZXNlbnRhdGl2ZXMgb2YgT3BlcmEgYW5kIE1vemlsbGEuCiBzdGF0aWMgY29uc3Qg
dW5zaWduZWQgbWF4U2VsZWN0SXRlbXMgPSAxMDAwMDsKIAorLy8gQ29uZmlndXJlIHBsYXRmb3Jt
LXNwZWNpZmljIGJlaGF2aW9yIHdoZW4gZm9jdXNlZCBwb3AtdXAgcmVjZWl2ZXMgYXJyb3cvc3Bh
Y2UvcmV0dXJuIGtleXN0cm9rZS4KKy8vIChQTEFURk9STShNQUMpIGFuZCBQTEFURk9STShHVEsp
IGFyZSBhbHdheXMgZmFsc2UgaW4gQ2hyb21pdW0sIGhlbmNlIHRoZSBleHRyYSB0ZXN0cy4pCisj
aWYgUExBVEZPUk0oTUFDKSB8fCAoUExBVEZPUk0oQ0hST01JVU0pICYmIE9TKERBUldJTikpCisj
ZGVmaW5lIEFSUk9XX0tFWVNfUE9QX01FTlUgMQorI2RlZmluZSBTUEFDRV9PUl9SRVRVUk5fUE9Q
X01FTlUgMAorI2VsaWYgUExBVEZPUk0oR1RLKSB8fCAoUExBVEZPUk0oQ0hST01JVU0pICYmIE9T
KFVOSVgpKQorI2RlZmluZSBBUlJPV19LRVlTX1BPUF9NRU5VIDAKKyNkZWZpbmUgU1BBQ0VfT1Jf
UkVUVVJOX1BPUF9NRU5VIDEKKyNlbHNlCisjZGVmaW5lIEFSUk9XX0tFWVNfUE9QX01FTlUgMAor
I2RlZmluZSBTUEFDRV9PUl9SRVRVUk5fUE9QX01FTlUgMAorI2VuZGlmCisKK3N0YXRpYyBjb25z
dCBET01UaW1lU3RhbXAgdHlwZUFoZWFkVGltZW91dCA9IDEwMDA7CisKK2VudW0gU2tpcERpcmVj
dGlvbiB7CisgICAgU2tpcEJhY2t3YXJkcyA9IC0xLAorICAgIFNraXBGb3J3YXJkcyA9IDEKK307
CisKIEhUTUxTZWxlY3RFbGVtZW50OjpIVE1MU2VsZWN0RWxlbWVudChjb25zdCBRdWFsaWZpZWRO
YW1lJiB0YWdOYW1lLCBEb2N1bWVudCogZG9jdW1lbnQsIEhUTUxGb3JtRWxlbWVudCogZm9ybSkK
ICAgICA6IEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUodGFnTmFtZSwgZG9jdW1lbnQs
IGZvcm0pCiB7CkBAIC02NywxOCArMTAwLDE4IEBAIGNvbnN0IEF0b21pY1N0cmluZyYgSFRNTFNl
bGVjdEVsZW1lbnQ6OmZvcm1Db250cm9sVHlwZSgpIGNvbnN0CiAKIGludCBIVE1MU2VsZWN0RWxl
bWVudDo6c2VsZWN0ZWRJbmRleCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIFNlbGVjdEVsZW1lbnQ6
OnNlbGVjdGVkSW5kZXgobV9kYXRhLCB0aGlzKTsKKyAgICByZXR1cm4gc2VsZWN0ZWRJbmRleCht
X2RhdGEsIHRoaXMpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkZXNlbGVjdEl0ZW1z
KEhUTUxPcHRpb25FbGVtZW50KiBleGNsdWRlRWxlbWVudCkKIHsKLSAgICBTZWxlY3RFbGVtZW50
OjpkZXNlbGVjdEl0ZW1zKG1fZGF0YSwgdGhpcywgZXhjbHVkZUVsZW1lbnQpOworICAgIGRlc2Vs
ZWN0SXRlbXMobV9kYXRhLCB0aGlzLCBleGNsdWRlRWxlbWVudCk7CiAgICAgc2V0TmVlZHNWYWxp
ZGl0eUNoZWNrKCk7CiB9CiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNldFNlbGVjdGVkSW5k
ZXgoaW50IG9wdGlvbkluZGV4LCBib29sIGRlc2VsZWN0KQogewotICAgIFNlbGVjdEVsZW1lbnQ6
OnNldFNlbGVjdGVkSW5kZXgobV9kYXRhLCB0aGlzLCBvcHRpb25JbmRleCwgZGVzZWxlY3QsIGZh
bHNlLCBmYWxzZSk7CisgICAgc2V0U2VsZWN0ZWRJbmRleChtX2RhdGEsIHRoaXMsIG9wdGlvbklu
ZGV4LCBkZXNlbGVjdCwgZmFsc2UsIGZhbHNlKTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVu
dDo6c2V0U2VsZWN0ZWRJbmRleEJ5VXNlcihpbnQgb3B0aW9uSW5kZXgsIGJvb2wgZGVzZWxlY3Qs
IGJvb2wgZmlyZU9uQ2hhbmdlTm93LCBib29sIGFsbG93TXVsdGlwbGVTZWxlY3Rpb24pCkBAIC0x
MDAsNyArMTMzLDcgQEAgdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2V0U2VsZWN0ZWRJbmRleEJ5
VXNlcihpbnQgb3B0aW9uSW5kZXgsIGJvb2wgZGVzZWxlY3QsIGIKICAgICBpZiAob3B0aW9uSW5k
ZXggPT0gc2VsZWN0ZWRJbmRleCgpKQogICAgICAgICByZXR1cm47CiAgICAgCi0gICAgU2VsZWN0
RWxlbWVudDo6c2V0U2VsZWN0ZWRJbmRleChtX2RhdGEsIHRoaXMsIG9wdGlvbkluZGV4LCBkZXNl
bGVjdCwgZmlyZU9uQ2hhbmdlTm93LCB0cnVlKTsKKyAgICBzZXRTZWxlY3RlZEluZGV4KG1fZGF0
YSwgdGhpcywgb3B0aW9uSW5kZXgsIGRlc2VsZWN0LCBmaXJlT25DaGFuZ2VOb3csIHRydWUpOwog
fQogCiBib29sIEhUTUxTZWxlY3RFbGVtZW50OjpoYXNQbGFjZWhvbGRlckxhYmVsT3B0aW9uKCkg
Y29uc3QKQEAgLTE2MSwxMiArMTk0LDEyIEBAIGludCBIVE1MU2VsZWN0RWxlbWVudDo6YWN0aXZl
U2VsZWN0aW9uRW5kTGlzdEluZGV4KCkgY29uc3QKIHsKICAgICBpZiAobV9kYXRhLmFjdGl2ZVNl
bGVjdGlvbkVuZEluZGV4KCkgPj0gMCkKICAgICAgICAgcmV0dXJuIG1fZGF0YS5hY3RpdmVTZWxl
Y3Rpb25FbmRJbmRleCgpOwotICAgIHJldHVybiBTZWxlY3RFbGVtZW50OjpsYXN0U2VsZWN0ZWRM
aXN0SW5kZXgobV9kYXRhLCB0aGlzKTsKKyAgICByZXR1cm4gbGFzdFNlbGVjdGVkTGlzdEluZGV4
KG1fZGF0YSwgdGhpcyk7CiB9CiAKIHVuc2lnbmVkIEhUTUxTZWxlY3RFbGVtZW50OjpsZW5ndGgo
KSBjb25zdAogewotICAgIHJldHVybiBTZWxlY3RFbGVtZW50OjpvcHRpb25Db3VudChtX2RhdGEs
IHRoaXMpOworICAgIHJldHVybiBvcHRpb25Db3VudChtX2RhdGEsIHRoaXMpOwogfQogCiB2b2lk
IEhUTUxTZWxlY3RFbGVtZW50OjphZGQoSFRNTEVsZW1lbnQqIGVsZW1lbnQsIEhUTUxFbGVtZW50
KiBiZWZvcmUsIEV4Y2VwdGlvbkNvZGUmIGVjKQpAQCAtMjMwLDEyICsyNjMsMTIgQEAgdm9pZCBI
VE1MU2VsZWN0RWxlbWVudDo6c2V0VmFsdWUoY29uc3QgU3RyaW5nICZ2YWx1ZSkKIAogYm9vbCBI
VE1MU2VsZWN0RWxlbWVudDo6c2F2ZUZvcm1Db250cm9sU3RhdGUoU3RyaW5nJiB2YWx1ZSkgY29u
c3QKIHsKLSAgICByZXR1cm4gU2VsZWN0RWxlbWVudDo6c2F2ZUZvcm1Db250cm9sU3RhdGUobV9k
YXRhLCB0aGlzLCB2YWx1ZSk7CisgICAgcmV0dXJuIHNhdmVGb3JtQ29udHJvbFN0YXRlKG1fZGF0
YSwgdGhpcywgdmFsdWUpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpyZXN0b3JlRm9y
bUNvbnRyb2xTdGF0ZShjb25zdCBTdHJpbmcmIHN0YXRlKQogewotICAgIFNlbGVjdEVsZW1lbnQ6
OnJlc3RvcmVGb3JtQ29udHJvbFN0YXRlKG1fZGF0YSwgdGhpcywgc3RhdGUpOworICAgIHJlc3Rv
cmVGb3JtQ29udHJvbFN0YXRlKG1fZGF0YSwgdGhpcywgc3RhdGUpOwogICAgIHNldE5lZWRzVmFs
aWRpdHlDaGVjaygpOwogfQogCkBAIC0yNjIsNyArMjk1LDcgQEAgdm9pZCBIVE1MU2VsZWN0RWxl
bWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoQXR0cmlidXRlKiBhdHRyKQogICAgICAgICAgICAg
c2V0UmVjYWxjTGlzdEl0ZW1zKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBtdWx0aXBsZUF0dHIpCi0gICAgICAgIFNlbGVjdEVsZW1lbnQ6OnBhcnNlTXVsdGlw
bGVBdHRyaWJ1dGUobV9kYXRhLCB0aGlzLCBhdHRyKTsKKyAgICAgICAgcGFyc2VNdWx0aXBsZUF0
dHJpYnV0ZShtX2RhdGEsIHRoaXMsIGF0dHIpOwogICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBhY2Nlc3NrZXlBdHRyKSB7CiAgICAgICAgIC8vIEZJWE1FOiBpZ25vcmUgZm9yIHRoZSBtb21l
bnQKICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhbGlnbkF0dHIpIHsKQEAgLTI5NSw3
ICszMjgsNyBAQCBib29sIEhUTUxTZWxlY3RFbGVtZW50OjpjYW5TZWxlY3RBbGwoKSBjb25zdAog
CiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpzZWxlY3RBbGwoKQogewotICAgIFNlbGVjdEVsZW1l
bnQ6OnNlbGVjdEFsbChtX2RhdGEsIHRoaXMpOworICAgIHNlbGVjdEFsbChtX2RhdGEsIHRoaXMp
OwogICAgIHNldE5lZWRzVmFsaWRpdHlDaGVjaygpOwogfQogCkBAIC0zMDgsMTcgKzM0MSwxNyBA
QCBSZW5kZXJPYmplY3QqIEhUTUxTZWxlY3RFbGVtZW50OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJB
cmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKgogCiBib29sIEhUTUxTZWxlY3RFbGVtZW50OjphcHBl
bmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmIGxpc3QsIGJvb2wpCiB7Ci0gICAgcmV0dXJuIFNlbGVj
dEVsZW1lbnQ6OmFwcGVuZEZvcm1EYXRhKG1fZGF0YSwgdGhpcywgbGlzdCk7CisgICAgcmV0dXJu
IGFwcGVuZEZvcm1EYXRhKG1fZGF0YSwgdGhpcywgbGlzdCk7CiB9CiAKIGludCBIVE1MU2VsZWN0
RWxlbWVudDo6b3B0aW9uVG9MaXN0SW5kZXgoaW50IG9wdGlvbkluZGV4KSBjb25zdAogewotICAg
IHJldHVybiBTZWxlY3RFbGVtZW50OjpvcHRpb25Ub0xpc3RJbmRleChtX2RhdGEsIHRoaXMsIG9w
dGlvbkluZGV4KTsKKyAgICByZXR1cm4gb3B0aW9uVG9MaXN0SW5kZXgobV9kYXRhLCB0aGlzLCBv
cHRpb25JbmRleCk7CiB9CiAKIGludCBIVE1MU2VsZWN0RWxlbWVudDo6bGlzdFRvT3B0aW9uSW5k
ZXgoaW50IGxpc3RJbmRleCkgY29uc3QKIHsKLSAgICByZXR1cm4gU2VsZWN0RWxlbWVudDo6bGlz
dFRvT3B0aW9uSW5kZXgobV9kYXRhLCB0aGlzLCBsaXN0SW5kZXgpOworICAgIHJldHVybiBsaXN0
VG9PcHRpb25JbmRleChtX2RhdGEsIHRoaXMsIGxpc3RJbmRleCk7CiB9CiAKIFBhc3NSZWZQdHI8
SFRNTE9wdGlvbnNDb2xsZWN0aW9uPiBIVE1MU2VsZWN0RWxlbWVudDo6b3B0aW9ucygpCkBAIC0z
MjgsNyArMzYxLDcgQEAgUGFzc1JlZlB0cjxIVE1MT3B0aW9uc0NvbGxlY3Rpb24+IEhUTUxTZWxl
Y3RFbGVtZW50OjpvcHRpb25zKCkKIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6cmVjYWxjTGlz
dEl0ZW1zKGJvb2wgdXBkYXRlU2VsZWN0ZWRTdGF0ZXMpIGNvbnN0CiB7Ci0gICAgU2VsZWN0RWxl
bWVudDo6cmVjYWxjTGlzdEl0ZW1zKGNvbnN0X2Nhc3Q8U2VsZWN0RWxlbWVudERhdGEmPihtX2Rh
dGEpLCB0aGlzLCB1cGRhdGVTZWxlY3RlZFN0YXRlcyk7CisgICAgcmVjYWxjTGlzdEl0ZW1zKGNv
bnN0X2Nhc3Q8U2VsZWN0RWxlbWVudERhdGEmPihtX2RhdGEpLCB0aGlzLCB1cGRhdGVTZWxlY3Rl
ZFN0YXRlcyk7CiB9CiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtc0lm
TmVlZGVkKCkKQEAgLTM0OSw3ICszODIsNyBAQCB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpjaGls
ZHJlbkNoYW5nZWQoYm9vbCBjaGFuZ2VkQnlQYXJzZXIsIE5vZGUqIGJlZm9yZUNoYW5nZQogCiB2
b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpzZXRSZWNhbGNMaXN0SXRlbXMoKQogewotICAgIFNlbGVj
dEVsZW1lbnQ6OnNldFJlY2FsY0xpc3RJdGVtcyhtX2RhdGEsIHRoaXMpOworICAgIHNldFJlY2Fs
Y0xpc3RJdGVtcyhtX2RhdGEsIHRoaXMpOwogCiAgICAgaWYgKCFpbkRvY3VtZW50KCkpCiAgICAg
ICAgIG1fY29sbGVjdGlvbkluZm8ucmVzZXQoKTsKQEAgLTM1NywyNSArMzkwLDI1IEBAIHZvaWQg
SFRNTFNlbGVjdEVsZW1lbnQ6OnNldFJlY2FsY0xpc3RJdGVtcygpCiAKIHZvaWQgSFRNTFNlbGVj
dEVsZW1lbnQ6OnJlc2V0KCkKIHsKLSAgICBTZWxlY3RFbGVtZW50OjpyZXNldChtX2RhdGEsIHRo
aXMpOworICAgIHJlc2V0KG1fZGF0YSwgdGhpcyk7CiAgICAgc2V0TmVlZHNWYWxpZGl0eUNoZWNr
KCk7CiB9CiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OmRpc3BhdGNoRm9jdXNFdmVudChQYXNz
UmVmUHRyPE5vZGU+IG9sZEZvY3VzZWROb2RlKQogewotICAgIFNlbGVjdEVsZW1lbnQ6OmRpc3Bh
dGNoRm9jdXNFdmVudChtX2RhdGEsIHRoaXMpOworICAgIGRpc3BhdGNoRm9jdXNFdmVudChtX2Rh
dGEsIHRoaXMpOwogICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGU6OmRpc3BhdGNo
Rm9jdXNFdmVudChvbGRGb2N1c2VkTm9kZSk7CiB9CiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6
OmRpc3BhdGNoQmx1ckV2ZW50KFBhc3NSZWZQdHI8Tm9kZT4gbmV3Rm9jdXNlZE5vZGUpCiB7Ci0g
ICAgU2VsZWN0RWxlbWVudDo6ZGlzcGF0Y2hCbHVyRXZlbnQobV9kYXRhLCB0aGlzKTsKKyAgICBk
aXNwYXRjaEJsdXJFdmVudChtX2RhdGEsIHRoaXMpOwogICAgIEhUTUxGb3JtQ29udHJvbEVsZW1l
bnRXaXRoU3RhdGU6OmRpc3BhdGNoQmx1ckV2ZW50KG5ld0ZvY3VzZWROb2RlKTsKIH0KIAogdm9p
ZCBIVE1MU2VsZWN0RWxlbWVudDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudCogZXZlbnQpCiB7
Ci0gICAgU2VsZWN0RWxlbWVudDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihtX2RhdGEsIHRoaXMsIGV2
ZW50LCBmb3JtKCkpOworICAgIGRlZmF1bHRFdmVudEhhbmRsZXIobV9kYXRhLCB0aGlzLCBldmVu
dCwgZm9ybSgpKTsKICAgICBpZiAoZXZlbnQtPmRlZmF1bHRIYW5kbGVkKCkpCiAgICAgICAgIHJl
dHVybjsKICAgICBIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjpkZWZhdWx0RXZlbnRI
YW5kbGVyKGV2ZW50KTsKQEAgLTM4MywzMyArNDE2LDMzIEBAIHZvaWQgSFRNTFNlbGVjdEVsZW1l
bnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnQqIGV2ZW50KQogCiB2b2lkIEhUTUxTZWxlY3RF
bGVtZW50OjpzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChpbnQgaW5kZXgpCiB7Ci0gICAg
U2VsZWN0RWxlbWVudDo6c2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgobV9kYXRhLCB0aGlz
LCBpbmRleCk7CisgICAgc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgobV9kYXRhLCB0aGlz
LCBpbmRleCk7CiB9CiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNldEFjdGl2ZVNlbGVjdGlv
bkVuZEluZGV4KGludCBpbmRleCkKIHsKLSAgICBTZWxlY3RFbGVtZW50OjpzZXRBY3RpdmVTZWxl
Y3Rpb25FbmRJbmRleChtX2RhdGEsIGluZGV4KTsKKyAgICBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJ
bmRleChtX2RhdGEsIGluZGV4KTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6dXBkYXRl
TGlzdEJveFNlbGVjdGlvbihib29sIGRlc2VsZWN0T3RoZXJPcHRpb25zKQogewotICAgIFNlbGVj
dEVsZW1lbnQ6OnVwZGF0ZUxpc3RCb3hTZWxlY3Rpb24obV9kYXRhLCB0aGlzLCBkZXNlbGVjdE90
aGVyT3B0aW9ucyk7CisgICAgdXBkYXRlTGlzdEJveFNlbGVjdGlvbihtX2RhdGEsIHRoaXMsIGRl
c2VsZWN0T3RoZXJPcHRpb25zKTsKICAgICBzZXROZWVkc1ZhbGlkaXR5Q2hlY2soKTsKIH0KIAog
dm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6bWVudUxpc3RPbkNoYW5nZSgpCiB7Ci0gICAgU2VsZWN0
RWxlbWVudDo6bWVudUxpc3RPbkNoYW5nZShtX2RhdGEsIHRoaXMpOworICAgIG1lbnVMaXN0T25D
aGFuZ2UobV9kYXRhLCB0aGlzKTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6bGlzdEJv
eE9uQ2hhbmdlKCkKIHsKLSAgICBTZWxlY3RFbGVtZW50OjpsaXN0Qm94T25DaGFuZ2UobV9kYXRh
LCB0aGlzKTsKKyAgICBsaXN0Qm94T25DaGFuZ2UobV9kYXRhLCB0aGlzKTsKIH0KIAogdm9pZCBI
VE1MU2VsZWN0RWxlbWVudDo6c2F2ZUxhc3RTZWxlY3Rpb24oKQogewotICAgIFNlbGVjdEVsZW1l
bnQ6OnNhdmVMYXN0U2VsZWN0aW9uKG1fZGF0YSwgdGhpcyk7CisgICAgc2F2ZUxhc3RTZWxlY3Rp
b24obV9kYXRhLCB0aGlzKTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6YWNjZXNzS2V5
QWN0aW9uKGJvb2wgc2VuZFRvQW55RWxlbWVudCkKQEAgLTQyMCw3ICs0NTMsNyBAQCB2b2lkIEhU
TUxTZWxlY3RFbGVtZW50OjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQog
CiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjphY2Nlc3NLZXlTZXRTZWxlY3RlZEluZGV4KGludCBp
bmRleCkKIHsKLSAgICBTZWxlY3RFbGVtZW50OjphY2Nlc3NLZXlTZXRTZWxlY3RlZEluZGV4KG1f
ZGF0YSwgdGhpcywgaW5kZXgpOworICAgIGFjY2Vzc0tleVNldFNlbGVjdGVkSW5kZXgobV9kYXRh
LCB0aGlzLCBpbmRleCk7CiB9CiAgICAgCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpzZXRNdWx0
aXBsZShib29sIG11bHRpcGxlKQpAQCAtNTE1LDEyICs1NDgsMTIgQEAgdm9pZCBIVE1MU2VsZWN0
RWxlbWVudDo6c2V0TGVuZ3RoKHVuc2lnbmVkIG5ld0xlbiwgRXhjZXB0aW9uQ29kZSYgZWMpCiAK
IHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNjcm9sbFRvU2VsZWN0aW9uKCkKIHsKLSAgICBTZWxl
Y3RFbGVtZW50OjpzY3JvbGxUb1NlbGVjdGlvbihtX2RhdGEsIHRoaXMpOworICAgIHNjcm9sbFRv
U2VsZWN0aW9uKG1fZGF0YSwgdGhpcyk7CiB9CiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6Omlu
c2VydGVkSW50b1RyZWUoYm9vbCBkZWVwKQogewotICAgIFNlbGVjdEVsZW1lbnQ6Omluc2VydGVk
SW50b1RyZWUobV9kYXRhLCB0aGlzKTsKKyAgICBpbnNlcnRlZEludG9UcmVlKG1fZGF0YSwgdGhp
cyk7CiAgICAgSFRNTEZvcm1Db250cm9sRWxlbWVudFdpdGhTdGF0ZTo6aW5zZXJ0ZWRJbnRvVHJl
ZShkZWVwKTsKIH0KIApAQCAtNTI5LDQgKzU2MiwxMDIzIEBAIGJvb2wgSFRNTFNlbGVjdEVsZW1l
bnQ6OmlzUmVxdWlyZWRGb3JtQ29udHJvbCgpIGNvbnN0CiAgICAgcmV0dXJuIHJlcXVpcmVkKCk7
CiB9CiAKKy8vIFJldHVybnMgdGhlIDFzdCB2YWxpZCBpdGVtIHxza2lwfCBpdGVtcyBmcm9tIHxs
aXN0SW5kZXh8IGluIGRpcmVjdGlvbiB8ZGlyZWN0aW9ufCBpZiB0aGVyZSBpcyBvbmUuCisvLyBP
dGhlcndpc2UsIGl0IHJldHVybnMgdGhlIHZhbGlkIGl0ZW0gY2xvc2VzdCB0byB0aGF0IGJvdW5k
YXJ5IHdoaWNoIGlzIHBhc3QgfGxpc3RJbmRleHwgaWYgdGhlcmUgaXMgb25lLgorLy8gT3RoZXJ3
aXNlLCBpdCByZXR1cm5zIHxsaXN0SW5kZXh8LgorLy8gVmFsaWQgbWVhbnMgdGhhdCBpdCBpcyBl
bmFibGVkIGFuZCBhbiBvcHRpb24gZWxlbWVudC4KK3N0YXRpYyBpbnQgbmV4dFZhbGlkSW5kZXgo
Y29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zLCBpbnQgbGlzdEluZGV4LCBTa2lwRGly
ZWN0aW9uIGRpcmVjdGlvbiwgaW50IHNraXApCit7CisgICAgQVNTRVJUKGRpcmVjdGlvbiA9PSAt
MSB8fCBkaXJlY3Rpb24gPT0gMSk7CisgICAgaW50IGxhc3RHb29kSW5kZXggPSBsaXN0SW5kZXg7
CisgICAgaW50IHNpemUgPSBsaXN0SXRlbXMuc2l6ZSgpOworICAgIGZvciAobGlzdEluZGV4ICs9
IGRpcmVjdGlvbjsgbGlzdEluZGV4ID49IDAgJiYgbGlzdEluZGV4IDwgc2l6ZTsgbGlzdEluZGV4
ICs9IGRpcmVjdGlvbikgeworICAgICAgICAtLXNraXA7CisgICAgICAgIGlmICghbGlzdEl0ZW1z
W2xpc3RJbmRleF0tPmRpc2FibGVkKCkgJiYgaXNPcHRpb25FbGVtZW50KGxpc3RJdGVtc1tsaXN0
SW5kZXhdKSkgeworICAgICAgICAgICAgbGFzdEdvb2RJbmRleCA9IGxpc3RJbmRleDsKKyAgICAg
ICAgICAgIGlmIChza2lwIDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICB9CisgICAgcmV0dXJuIGxhc3RHb29kSW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgbmV4dFNl
bGVjdGFibGVMaXN0SW5kZXgoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1l
bnQsIGludCBzdGFydEluZGV4KQoreworICAgIHJldHVybiBuZXh0VmFsaWRJbmRleChkYXRhLmxp
c3RJdGVtcyhlbGVtZW50KSwgc3RhcnRJbmRleCwgU2tpcEZvcndhcmRzLCAxKTsKK30KKworc3Rh
dGljIGludCBwcmV2aW91c1NlbGVjdGFibGVMaXN0SW5kZXgoU2VsZWN0RWxlbWVudERhdGEmIGRh
dGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBzdGFydEluZGV4KQoreworICAgIGlmIChzdGFydElu
ZGV4ID09IC0xKQorICAgICAgICBzdGFydEluZGV4ID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCku
c2l6ZSgpOworICAgIHJldHVybiBuZXh0VmFsaWRJbmRleChkYXRhLmxpc3RJdGVtcyhlbGVtZW50
KSwgc3RhcnRJbmRleCwgU2tpcEJhY2t3YXJkcywgMSk7Cit9CisKK3N0YXRpYyBpbnQgZmlyc3RT
ZWxlY3RhYmxlTGlzdEluZGV4KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVt
ZW50KQoreworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRl
bXMoZWxlbWVudCk7CisgICAgaW50IGluZGV4ID0gbmV4dFZhbGlkSW5kZXgoaXRlbXMsIGl0ZW1z
LnNpemUoKSwgU2tpcEJhY2t3YXJkcywgSU5UX01BWCk7CisgICAgaWYgKHN0YXRpY19jYXN0PHVu
c2lnbmVkPihpbmRleCkgPT0gaXRlbXMuc2l6ZSgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAg
cmV0dXJuIGluZGV4OworfQorCitzdGF0aWMgaW50IGxhc3RTZWxlY3RhYmxlTGlzdEluZGV4KFNl
bGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIHJldHVybiBu
ZXh0VmFsaWRJbmRleChkYXRhLmxpc3RJdGVtcyhlbGVtZW50KSwgLTEsIFNraXBGb3J3YXJkcywg
SU5UX01BWCk7Cit9CisKKy8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHZhbGlkIGl0
ZW0gb25lIHBhZ2UgYXdheSBmcm9tIHxzdGFydEluZGV4fCBpbiBkaXJlY3Rpb24gfGRpcmVjdGlv
bnwuCitzdGF0aWMgaW50IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4UGFnZUF3YXkoU2VsZWN0RWxl
bWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBzdGFydEluZGV4LCBTa2lwRGly
ZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9
IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIC8vIENhbid0IHVzZSBkYXRhLT5zaXplKCkg
YmVjYXVzZSByZW5kZXJlciBmb3JjZXMgYSBtaW5pbXVtIHNpemUuCisgICAgaW50IHBhZ2VTaXpl
ID0gMDsKKyAgICBpZiAoZWxlbWVudC0+cmVuZGVyZXIoKS0+aXNMaXN0Qm94KCkpCisgICAgICAg
IHBhZ2VTaXplID0gdG9SZW5kZXJMaXN0Qm94KGVsZW1lbnQtPnJlbmRlcmVyKCkpLT5zaXplKCkg
LSAxOyAvLyAtMSBzbyB3ZSBzdGlsbCBzaG93IGNvbnRleHQKKworICAgIC8vIE9uZSBwYWdlIGF3
YXksIGJ1dCBub3Qgb3V0c2lkZSB2YWxpZCBib3VuZHMuCisgICAgLy8gSWYgdGhlcmUgaXMgYSB2
YWxpZCBvcHRpb24gaXRlbSBvbmUgcGFnZSBhd2F5LCB0aGUgaW5kZXggaXMgY2hvc2VuLgorICAg
IC8vIElmIHRoZXJlIGlzIG5vIGV4YWN0IG9uZSBwYWdlIGF3YXkgdmFsaWQgb3B0aW9uLCByZXR1
cm5zIHN0YXJ0SW5kZXggb3IgdGhlIG1vc3QgZmFyIGluZGV4LgorICAgIGludCBlZGdlSW5kZXgg
PSAoZGlyZWN0aW9uID09IFNraXBGb3J3YXJkcykgPyAwIDogKGl0ZW1zLnNpemUoKSAtIDEpOwor
ICAgIGludCBza2lwQW1vdW50ID0gcGFnZVNpemUgKyAoKGRpcmVjdGlvbiA9PSBTa2lwRm9yd2Fy
ZHMpID8gc3RhcnRJbmRleCA6IChlZGdlSW5kZXggLSBzdGFydEluZGV4KSk7CisgICAgcmV0dXJu
IG5leHRWYWxpZEluZGV4KGl0ZW1zLCBlZGdlSW5kZXgsIGRpcmVjdGlvbiwgc2tpcEFtb3VudCk7
Cit9CisKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNlbGVjdEFsbChTZWxlY3RFbGVtZW50RGF0
YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBBU1NFUlQoIWRhdGEudXNlc01lbnVM
aXN0KCkpOworICAgIGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSB8fCAhZGF0YS5tdWx0aXBsZSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBTYXZlIHRoZSBzZWxlY3Rpb24gc28gaXQgY2Fu
IGJlIGNvbXBhcmVkIHRvIHRoZSBuZXcgc2VsZWN0QWxsIHNlbGVjdGlvbgorICAgIC8vIHdoZW4g
ZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cworICAgIHNhdmVMYXN0U2VsZWN0aW9uKGRhdGEsIGVs
ZW1lbnQpOworCisgICAgZGF0YS5zZXRBY3RpdmVTZWxlY3Rpb25TdGF0ZSh0cnVlKTsKKyAgICBz
ZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChkYXRhLCBlbGVtZW50LCBuZXh0U2VsZWN0YWJs
ZUxpc3RJbmRleChkYXRhLCBlbGVtZW50LCAtMSkpOworICAgIHNldEFjdGl2ZVNlbGVjdGlvbkVu
ZEluZGV4KGRhdGEsIHByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBlbGVtZW50LCAt
MSkpOworCisgICAgdXBkYXRlTGlzdEJveFNlbGVjdGlvbihkYXRhLCBlbGVtZW50LCBmYWxzZSk7
CisgICAgbGlzdEJveE9uQ2hhbmdlKGRhdGEsIGVsZW1lbnQpOworfQorCit2b2lkIEhUTUxTZWxl
Y3RFbGVtZW50OjpzYXZlTGFzdFNlbGVjdGlvbihTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxl
bWVudCogZWxlbWVudCkKK3sKKyAgICBpZiAoZGF0YS51c2VzTWVudUxpc3QoKSkgeworICAgICAg
ICBkYXRhLnNldExhc3RPbkNoYW5nZUluZGV4KHNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCkp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmVjdG9yPGJvb2w+JiBsYXN0T25DaGFu
Z2VTZWxlY3Rpb24gPSBkYXRhLmxhc3RPbkNoYW5nZVNlbGVjdGlvbigpOyAKKyAgICBsYXN0T25D
aGFuZ2VTZWxlY3Rpb24uY2xlYXIoKTsKKworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0
ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGl0ZW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgIE9wdGlvbkVsZW1lbnQqIG9wdGlvbkVs
ZW1lbnQgPSB0b09wdGlvbkVsZW1lbnQoaXRlbXNbaV0pOworICAgICAgICBsYXN0T25DaGFuZ2VT
ZWxlY3Rpb24uYXBwZW5kKG9wdGlvbkVsZW1lbnQgJiYgb3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQo
KSk7CisgICAgfQorfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpzZXRBY3RpdmVTZWxlY3Rp
b25BbmNob3JJbmRleChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwg
aW50IGluZGV4KQoreworICAgIGRhdGEuc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoaW5k
ZXgpOworCisgICAgLy8gQ2FjaGUgdGhlIHNlbGVjdGlvbiBzdGF0ZSBzbyB3ZSBjYW4gcmVzdG9y
ZSB0aGUgb2xkIHNlbGVjdGlvbiBhcyB0aGUgbmV3CisgICAgLy8gc2VsZWN0aW9uIHBpdm90cyBh
cm91bmQgdGhpcyBhbmNob3IgaW5kZXgKKyAgICBWZWN0b3I8Ym9vbD4mIGNhY2hlZFN0YXRlRm9y
QWN0aXZlU2VsZWN0aW9uID0gZGF0YS5jYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbigpOyAK
KyAgICBjYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbi5jbGVhcigpOworCisgICAgY29uc3Qg
VmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgT3B0
aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSk7Cisg
ICAgICAgIGNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uLmFwcGVuZChvcHRpb25FbGVtZW50
ICYmIG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVkKCkpOworICAgIH0KK30KKwordm9pZCBIVE1MU2Vs
ZWN0RWxlbWVudDo6c2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoU2VsZWN0RWxlbWVudERhdGEm
IGRhdGEsIGludCBpbmRleCkKK3sKKyAgICBkYXRhLnNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4
KGluZGV4KTsKK30KKwordm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6dXBkYXRlTGlzdEJveFNlbGVj
dGlvbihTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgYm9vbCBkZXNl
bGVjdE90aGVyT3B0aW9ucykKK3sKKyAgICBBU1NFUlQoZWxlbWVudC0+cmVuZGVyZXIoKSAmJiAo
ZWxlbWVudC0+cmVuZGVyZXIoKS0+aXNMaXN0Qm94KCkgfHwgZGF0YS5tdWx0aXBsZSgpKSk7Cisg
ICAgQVNTRVJUKCFkYXRhLmxpc3RJdGVtcyhlbGVtZW50KS5zaXplKCkgfHwgZGF0YS5hY3RpdmVT
ZWxlY3Rpb25BbmNob3JJbmRleCgpID49IDApOworCisgICAgdW5zaWduZWQgc3RhcnQgPSBtaW4o
ZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpLCBkYXRhLmFjdGl2ZVNlbGVjdGlvbkVu
ZEluZGV4KCkpOworICAgIHVuc2lnbmVkIGVuZCA9IG1heChkYXRhLmFjdGl2ZVNlbGVjdGlvbkFu
Y2hvckluZGV4KCksIGRhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSk7CisgICAgVmVjdG9y
PGJvb2w+JiBjYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbiA9IGRhdGEuY2FjaGVkU3RhdGVG
b3JBY3RpdmVTZWxlY3Rpb24oKTsKKworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1z
ID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IGl0ZW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgIE9wdGlvbkVsZW1lbnQqIG9wdGlvbkVsZW1l
bnQgPSB0b09wdGlvbkVsZW1lbnQoaXRlbXNbaV0pOworICAgICAgICBpZiAoIW9wdGlvbkVsZW1l
bnQgfHwgaXRlbXNbaV0tPmRpc2FibGVkKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAg
ICAgICBpZiAoaSA+PSBzdGFydCAmJiBpIDw9IGVuZCkKKyAgICAgICAgICAgIG9wdGlvbkVsZW1l
bnQtPnNldFNlbGVjdGVkU3RhdGUoZGF0YS5hY3RpdmVTZWxlY3Rpb25TdGF0ZSgpKTsKKyAgICAg
ICAgZWxzZSBpZiAoZGVzZWxlY3RPdGhlck9wdGlvbnMgfHwgaSA+PSBjYWNoZWRTdGF0ZUZvckFj
dGl2ZVNlbGVjdGlvbi5zaXplKCkpCisgICAgICAgICAgICBvcHRpb25FbGVtZW50LT5zZXRTZWxl
Y3RlZFN0YXRlKGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3B0aW9uRWxlbWVu
dC0+c2V0U2VsZWN0ZWRTdGF0ZShjYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbltpXSk7Cisg
ICAgfQorCisgICAgdG9TZWxlY3RFbGVtZW50KGVsZW1lbnQpLT51cGRhdGVWYWxpZGl0eSgpOwor
ICAgIHNjcm9sbFRvU2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOworfQorCit2b2lkIEhUTUxTZWxl
Y3RFbGVtZW50OjpsaXN0Qm94T25DaGFuZ2UoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1l
bnQqIGVsZW1lbnQpCit7CisgICAgQVNTRVJUKCFkYXRhLnVzZXNNZW51TGlzdCgpIHx8IGRhdGEu
bXVsdGlwbGUoKSk7CisKKyAgICBWZWN0b3I8Ym9vbD4mIGxhc3RPbkNoYW5nZVNlbGVjdGlvbiA9
IGRhdGEubGFzdE9uQ2hhbmdlU2VsZWN0aW9uKCk7IAorICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50
Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisKKyAgICAvLyBJZiB0aGUgY2Fj
aGVkIHNlbGVjdGlvbiBsaXN0IGlzIGVtcHR5LCBvciB0aGUgc2l6ZSBoYXMgY2hhbmdlZCwgdGhl
biBmaXJlCisgICAgLy8gZGlzcGF0Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50LCBhbmQgcmV0dXJu
IGVhcmx5LgorICAgIGlmIChsYXN0T25DaGFuZ2VTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IGxhc3RP
bkNoYW5nZVNlbGVjdGlvbi5zaXplKCkgIT0gaXRlbXMuc2l6ZSgpKSB7CisgICAgICAgIGVsZW1l
bnQtPmRpc3BhdGNoRm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgLy8gVXBkYXRlIGxhc3RPbkNoYW5nZVNlbGVjdGlvbiBhbmQgZmlyZSBkaXNw
YXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQKKyAgICBib29sIGZpcmVPbkNoYW5nZSA9IGZhbHNl
OworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAg
ICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1z
W2ldKTsKKyAgICAgICAgYm9vbCBzZWxlY3RlZCA9IG9wdGlvbkVsZW1lbnQgJiYgIG9wdGlvbkVs
ZW1lbnQtPnNlbGVjdGVkKCk7CisgICAgICAgIGlmIChzZWxlY3RlZCAhPSBsYXN0T25DaGFuZ2VT
ZWxlY3Rpb25baV0pCisgICAgICAgICAgICBmaXJlT25DaGFuZ2UgPSB0cnVlOworICAgICAgICBs
YXN0T25DaGFuZ2VTZWxlY3Rpb25baV0gPSBzZWxlY3RlZDsKKyAgICB9CisKKyAgICBpZiAoZmly
ZU9uQ2hhbmdlKQorICAgICAgICBlbGVtZW50LT5kaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZl
bnQoKTsKK30KKwordm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6bWVudUxpc3RPbkNoYW5nZShTZWxl
Y3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBBU1NFUlQoZGF0
YS51c2VzTWVudUxpc3QoKSk7CisKKyAgICBpbnQgc2VsZWN0ZWQgPSBzZWxlY3RlZEluZGV4KGRh
dGEsIGVsZW1lbnQpOworICAgIGlmIChkYXRhLmxhc3RPbkNoYW5nZUluZGV4KCkgIT0gc2VsZWN0
ZWQgJiYgZGF0YS51c2VyRHJpdmVuQ2hhbmdlKCkpIHsKKyAgICAgICAgZGF0YS5zZXRMYXN0T25D
aGFuZ2VJbmRleChzZWxlY3RlZCk7CisgICAgICAgIGRhdGEuc2V0VXNlckRyaXZlbkNoYW5nZShm
YWxzZSk7CisgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoRm9ybUNvbnRyb2xDaGFuZ2VFdmVudCgp
OworICAgIH0KK30KKwordm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2Nyb2xsVG9TZWxlY3Rpb24o
U2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgaWYgKGRh
dGEudXNlc01lbnVMaXN0KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyID0gZWxlbWVudC0+cmVuZGVyZXIoKSkKKyAgICAgICAgdG9SZW5kZXJMaXN0
Qm94KHJlbmRlcmVyKS0+c2VsZWN0aW9uQ2hhbmdlZCgpOworfQorCit2b2lkIEhUTUxTZWxlY3RF
bGVtZW50OjpzZXRPcHRpb25zQ2hhbmdlZE9uUmVuZGVyZXIoU2VsZWN0RWxlbWVudERhdGEmIGRh
dGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgaWYgKFJlbmRlck9iamVjdCogcmVuZGVyZXIg
PSBlbGVtZW50LT5yZW5kZXJlcigpKSB7CisgICAgICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgp
KQorICAgICAgICAgICAgdG9SZW5kZXJNZW51TGlzdChyZW5kZXJlciktPnNldE9wdGlvbnNDaGFu
Z2VkKHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0b1JlbmRlckxpc3RCb3gocmVu
ZGVyZXIpLT5zZXRPcHRpb25zQ2hhbmdlZCh0cnVlKTsKKyAgICB9Cit9CisKK3ZvaWQgSFRNTFNl
bGVjdEVsZW1lbnQ6OnNldFJlY2FsY0xpc3RJdGVtcyhTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwg
RWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBkYXRhLnNldFNob3VsZFJlY2FsY0xpc3RJdGVtcyh0
cnVlKTsKKyAgICAvLyBNYW51YWwgc2VsZWN0aW9uIGFuY2hvciBpcyByZXNldCB3aGVuIG1hbmlw
dWxhdGluZyB0aGUgc2VsZWN0IHByb2dyYW1tYXRpY2FsbHkuCisgICAgZGF0YS5zZXRBY3RpdmVT
ZWxlY3Rpb25BbmNob3JJbmRleCgtMSk7CisgICAgc2V0T3B0aW9uc0NoYW5nZWRPblJlbmRlcmVy
KGRhdGEsIGVsZW1lbnQpOworICAgIGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKK30K
Kwordm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zKFNlbGVjdEVsZW1lbnRE
YXRhJiBkYXRhLCBjb25zdCBFbGVtZW50KiBlbGVtZW50LCBib29sIHVwZGF0ZVNlbGVjdGVkU3Rh
dGVzKQoreworICAgIFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcyA9IGRhdGEucmF3TGlzdEl0
ZW1zKCk7CisgICAgbGlzdEl0ZW1zLmNsZWFyKCk7CisKKyAgICBkYXRhLnNldFNob3VsZFJlY2Fs
Y0xpc3RJdGVtcyhmYWxzZSk7CisKKyAgICBPcHRpb25FbGVtZW50KiBmb3VuZFNlbGVjdGVkID0g
MDsKKyAgICBmb3IgKE5vZGUqIGN1cnJlbnROb2RlID0gZWxlbWVudC0+Zmlyc3RDaGlsZCgpOyBj
dXJyZW50Tm9kZTspIHsKKyAgICAgICAgaWYgKCFjdXJyZW50Tm9kZS0+aXNFbGVtZW50Tm9kZSgp
KSB7CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLT50cmF2ZXJzZU5leHRT
aWJsaW5nKGVsZW1lbnQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAg
ICAgICBFbGVtZW50KiBjdXJyZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KGN1cnJlbnROb2Rl
KTsKKworICAgICAgICAvLyBvcHRncm91cCB0YWdzIG1heSBub3QgbmVzdC4gSG93ZXZlciwgYm90
aCBGaXJlRm94IGFuZCBJRSB3aWxsCisgICAgICAgIC8vIGZsYXR0ZW4gdGhlIHRyZWUgYXV0b21h
dGljYWxseSwgc28gd2UgZm9sbG93IHN1aXQuCisgICAgICAgIC8vIChodHRwOi8vd3d3LnczLm9y
Zy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy42KQorICAgICAgICBpZiAoaXNP
cHRpb25Hcm91cEVsZW1lbnQoY3VycmVudCkpIHsKKyAgICAgICAgICAgIGxpc3RJdGVtcy5hcHBl
bmQoY3VycmVudCk7CisgICAgICAgICAgICBpZiAoY3VycmVudC0+Zmlyc3RDaGlsZCgpKSB7Cisg
ICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50LT5maXJzdENoaWxkKCk7CisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAg
ICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChjdXJy
ZW50KSkgeworICAgICAgICAgICAgbGlzdEl0ZW1zLmFwcGVuZChjdXJyZW50KTsKKworICAgICAg
ICAgICAgaWYgKHVwZGF0ZVNlbGVjdGVkU3RhdGVzICYmICFkYXRhLm11bHRpcGxlKCkpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoIWZvdW5kU2VsZWN0ZWQgJiYgKGRhdGEuc2l6ZSgpIDw9IDEgfHwg
b3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRT
ZWxlY3RlZCA9IG9wdGlvbkVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0
ZWQtPnNldFNlbGVjdGVkU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChm
b3VuZFNlbGVjdGVkICYmIG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVkKCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgZm91bmRTZWxlY3RlZC0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7CisgICAgICAg
ICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQgPSBvcHRpb25FbGVtZW50OworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyZW50LT5o
YXNUYWdOYW1lKEhUTUxOYW1lczo6aHJUYWcpKQorICAgICAgICAgICAgbGlzdEl0ZW1zLmFwcGVu
ZChjdXJyZW50KTsKKworICAgICAgICAvLyBJbiBjb25mb3JtaW5nIEhUTUwgY29kZSwgb25seSA8
b3B0Z3JvdXA+IGFuZCA8b3B0aW9uPiB3aWxsIGJlIGZvdW5kCisgICAgICAgIC8vIHdpdGhpbiBh
IDxzZWxlY3Q+LiBXZSBjYWxsIHRyYXZlcnNlTmV4dFNpYmxpbmcgc28gdGhhdCB3ZSBvbmx5IHN0
ZXAKKyAgICAgICAgLy8gaW50byB0aG9zZSB0YWdzIHRoYXQgd2UgY2hvb3NlIHRvLiBGb3Igd2Vi
LWNvbXBhdCwgd2Ugc2hvdWxkIGNvcGUKKyAgICAgICAgLy8gd2l0aCB0aGUgY2FzZSB3aGVyZSBv
ZGQgdGFncyBsaWtlIGEgPGRpdj4gaGF2ZSBiZWVuIGFkZGVkIGJ1dCB3ZQorICAgICAgICAvLyBo
YW5kbGUgdGhpcyBiZWNhdXNlIHN1Y2ggdGFncyBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZy
b20gdGhlCisgICAgICAgIC8vIDxzZWxlY3Q+J3Mgc3VidHJlZSBhdCB0aGlzIHBvaW50LgorICAg
ICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLT50cmF2ZXJzZU5leHRTaWJsaW5nKGVsZW1l
bnQpOworICAgIH0KK30KKworaW50IEhUTUxTZWxlY3RFbGVtZW50OjpzZWxlY3RlZEluZGV4KGNv
bnN0IFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBFbGVtZW50KiBlbGVtZW50KQorewor
ICAgIHVuc2lnbmVkIGluZGV4ID0gMDsKKworICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIHRo
ZSBmaXJzdCBvcHRpb24gc2VsZWN0ZWQKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVt
cyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
aXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKE9wdGlvbkVsZW1lbnQqIG9wdGlvbkVs
ZW1lbnQgPSB0b09wdGlvbkVsZW1lbnQoaXRlbXNbaV0pKSB7CisgICAgICAgICAgICBpZiAob3B0
aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Cisg
ICAgICAgICAgICArK2luZGV4OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOwor
fQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpzZXRTZWxlY3RlZEluZGV4KFNlbGVjdEVsZW1l
bnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBpbnQgb3B0aW9uSW5kZXgsIGJvb2wgZGVz
ZWxlY3QsIGJvb2wgZmlyZU9uQ2hhbmdlTm93LCBib29sIHVzZXJEcml2ZW5DaGFuZ2UpCit7Cisg
ICAgaWYgKG9wdGlvbkluZGV4ID09IC0xICYmICFkZXNlbGVjdCAmJiAhZGF0YS5tdWx0aXBsZSgp
KQorICAgICAgICBvcHRpb25JbmRleCA9IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVs
ZW1lbnQsIC0xKTsKKyAgICBpZiAoIWRhdGEubXVsdGlwbGUoKSkKKyAgICAgICAgZGVzZWxlY3Qg
PSB0cnVlOworCisgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJ
dGVtcyhlbGVtZW50KTsKKyAgICBpbnQgbGlzdEluZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoZGF0
YSwgZWxlbWVudCwgb3B0aW9uSW5kZXgpOworCisgICAgRWxlbWVudCogZXhjbHVkZUVsZW1lbnQg
PSAwOworICAgIGlmIChPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gKGxpc3RJbmRleCA+
PSAwID8gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2xpc3RJbmRleF0pIDogMCkpIHsKKyAgICAgICAg
ZXhjbHVkZUVsZW1lbnQgPSBpdGVtc1tsaXN0SW5kZXhdOworICAgICAgICBpZiAoZGF0YS5hY3Rp
dmVTZWxlY3Rpb25BbmNob3JJbmRleCgpIDwgMCB8fCBkZXNlbGVjdCkKKyAgICAgICAgICAgIHNl
dEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGRhdGEsIGVsZW1lbnQsIGxpc3RJbmRleCk7Cisg
ICAgICAgIGlmIChkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkgPCAwIHx8IGRlc2VsZWN0
KQorICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoZGF0YSwgbGlzdEluZGV4
KTsKKyAgICAgICAgb3B0aW9uRWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKKyAgICB9
CisKKyAgICBpZiAoZGVzZWxlY3QpCisgICAgICAgIGRlc2VsZWN0SXRlbXMoZGF0YSwgZWxlbWVu
dCwgZXhjbHVkZUVsZW1lbnQpOworCisgICAgLy8gRm9yIHRoZSBtZW51IGxpc3QgY2FzZSwgdGhp
cyBpcyB3aGF0IG1ha2VzIHRoZSBzZWxlY3RlZCBlbGVtZW50IGFwcGVhci4KKyAgICBpZiAoUmVu
ZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCkpCisgICAgICAgIHJlbmRl
cmVyLT51cGRhdGVGcm9tRWxlbWVudCgpOworCisgICAgc2Nyb2xsVG9TZWxlY3Rpb24oZGF0YSwg
ZWxlbWVudCk7CisKKyAgICAvLyBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgd2l0aCBmaXJlT25DaGFu
Z2VOb3cgZm9yIG1lbnUgbGlzdHMuIAorICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKSB7Cisg
ICAgICAgIGRhdGEuc2V0VXNlckRyaXZlbkNoYW5nZSh1c2VyRHJpdmVuQ2hhbmdlKTsKKyAgICAg
ICAgaWYgKGZpcmVPbkNoYW5nZU5vdykKKyAgICAgICAgICAgIG1lbnVMaXN0T25DaGFuZ2UoZGF0
YSwgZWxlbWVudCk7CisgICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBlbGVtZW50LT5y
ZW5kZXJlcigpOworICAgICAgICBpZiAocmVuZGVyZXIpIHsKKyAgICAgICAgICAgIGlmIChkYXRh
LnVzZXNNZW51TGlzdCgpKQorICAgICAgICAgICAgICAgIHRvUmVuZGVyTWVudUxpc3QocmVuZGVy
ZXIpLT5kaWRTZXRTZWxlY3RlZEluZGV4KGxpc3RJbmRleCk7CisgICAgICAgICAgICBlbHNlIGlm
IChyZW5kZXJlci0+aXNMaXN0Qm94KCkpCisgICAgICAgICAgICAgICAgdG9SZW5kZXJMaXN0Qm94
KHJlbmRlcmVyKS0+c2VsZWN0aW9uQ2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAg
dG9TZWxlY3RFbGVtZW50KGVsZW1lbnQpLT51cGRhdGVWYWxpZGl0eSgpOworICAgIGlmIChGcmFt
ZSogZnJhbWUgPSBlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKQorICAgICAgICBmcmFtZS0+
cGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmZvcm1TdGF0ZURpZENoYW5nZShlbGVtZW50KTsK
K30KKworaW50IEhUTUxTZWxlY3RFbGVtZW50OjpvcHRpb25Ub0xpc3RJbmRleChjb25zdCBTZWxl
Y3RFbGVtZW50RGF0YSYgZGF0YSwgY29uc3QgRWxlbWVudCogZWxlbWVudCwgaW50IG9wdGlvbklu
ZGV4KQoreworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRl
bXMoZWxlbWVudCk7CisgICAgaW50IGxpc3RTaXplID0gKGludCkgaXRlbXMuc2l6ZSgpOworICAg
IGlmIChvcHRpb25JbmRleCA8IDAgfHwgb3B0aW9uSW5kZXggPj0gbGlzdFNpemUpCisgICAgICAg
IHJldHVybiAtMTsKKworICAgIGludCBvcHRpb25JbmRleDIgPSAtMTsKKyAgICBmb3IgKGludCBs
aXN0SW5kZXggPSAwOyBsaXN0SW5kZXggPCBsaXN0U2l6ZTsgKytsaXN0SW5kZXgpIHsKKyAgICAg
ICAgaWYgKGlzT3B0aW9uRWxlbWVudChpdGVtc1tsaXN0SW5kZXhdKSkgeworICAgICAgICAgICAg
KytvcHRpb25JbmRleDI7CisgICAgICAgICAgICBpZiAob3B0aW9uSW5kZXgyID09IG9wdGlvbklu
ZGV4KQorICAgICAgICAgICAgICAgIHJldHVybiBsaXN0SW5kZXg7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBIVE1MU2VsZWN0RWxlbWVudDo6bGlzdFRvT3B0
aW9uSW5kZXgoY29uc3QgU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIGNvbnN0IEVsZW1lbnQqIGVs
ZW1lbnQsIGludCBsaXN0SW5kZXgpCit7CisgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRl
bXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKyAgICBpZiAobGlzdEluZGV4IDwgMCB8fCBs
aXN0SW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkgfHwgIWlzT3B0aW9uRWxlbWVudChpdGVtc1ts
aXN0SW5kZXhdKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy8gQWN0dWFsIGluZGV4IG9m
IG9wdGlvbiBub3QgY291bnRpbmcgT1BUR1JPVVAgZW50cmllcyB0aGF0IG1heSBiZSBpbiBsaXN0
LgorICAgIGludCBvcHRpb25JbmRleCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0
SW5kZXg7ICsraSkgeworICAgICAgICBpZiAoaXNPcHRpb25FbGVtZW50KGl0ZW1zW2ldKSkKKyAg
ICAgICAgICAgICsrb3B0aW9uSW5kZXg7CisgICAgfQorCisgICAgcmV0dXJuIG9wdGlvbkluZGV4
OworfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEZvY3VzRXZlbnQoU2VsZWN0
RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgLy8gU2F2ZSB0aGUg
c2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVu
CisgICAgLy8gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgYmx1ciBldmVudCBkaXNw
YXRjaGFsCisgICAgaWYgKGRhdGEudXNlc01lbnVMaXN0KCkpCisgICAgICAgIHNhdmVMYXN0U2Vs
ZWN0aW9uKGRhdGEsIGVsZW1lbnQpOworfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkaXNw
YXRjaEJsdXJFdmVudChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkK
K3sKKyAgICAvLyBXZSBvbmx5IG5lZWQgdG8gZmlyZSBjaGFuZ2UgZXZlbnRzIGhlcmUgZm9yIG1l
bnUgbGlzdHMsIGJlY2F1c2Ugd2UgZmlyZQorICAgIC8vIGNoYW5nZSBldmVudHMgZm9yIGxpc3Qg
Ym94ZXMgd2hlbmV2ZXIgdGhlIHNlbGVjdGlvbiBjaGFuZ2UgaXMgYWN0dWFsbHkKKyAgICAvLyBt
YWRlLiBUaGlzIG1hdGNoZXMgb3RoZXIgYnJvd3NlcnMnIGJlaGF2aW9yLgorICAgIGlmIChkYXRh
LnVzZXNNZW51TGlzdCgpKQorICAgICAgICBtZW51TGlzdE9uQ2hhbmdlKGRhdGEsIGVsZW1lbnQp
OworfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkZXNlbGVjdEl0ZW1zKFNlbGVjdEVsZW1l
bnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBFbGVtZW50KiBleGNsdWRlRWxlbWVudCkK
K3sKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVs
ZW1lbnQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkg
eworICAgICAgICBpZiAoaXRlbXNbaV0gPT0gZXhjbHVkZUVsZW1lbnQpCisgICAgICAgICAgICBj
b250aW51ZTsKKworICAgICAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRv
T3B0aW9uRWxlbWVudChpdGVtc1tpXSkpCisgICAgICAgICAgICBvcHRpb25FbGVtZW50LT5zZXRT
ZWxlY3RlZFN0YXRlKGZhbHNlKTsKKyAgICB9Cit9CisKK2Jvb2wgSFRNTFNlbGVjdEVsZW1lbnQ6
OnNhdmVGb3JtQ29udHJvbFN0YXRlKGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBjb25z
dCBFbGVtZW50KiBlbGVtZW50LCBTdHJpbmcmIHZhbHVlKQoreworICAgIGNvbnN0IFZlY3RvcjxF
bGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisgICAgaW50IGxlbmd0
aCA9IGl0ZW1zLnNpemUoKTsKKworICAgIC8vIEZJWE1FOiBDaGFuZ2UgdGhpcyBjb2RlIHRvIHVz
ZSB0aGUgbmV3IFN0cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQgY29kZSBwYXRoLgorICAg
IFZlY3RvcjxjaGFyLCAxMDI0PiBjaGFyYWN0ZXJzKGxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVt
ZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKKyAgICAgICAgYm9vbCBzZWxlY3RlZCA9
IG9wdGlvbkVsZW1lbnQgJiYgb3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKTsKKyAgICAgICAgY2hh
cmFjdGVyc1tpXSA9IHNlbGVjdGVkID8gJ1gnIDogJy4nOworICAgIH0KKworICAgIHZhbHVlID0g
U3RyaW5nKGNoYXJhY3RlcnMuZGF0YSgpLCBsZW5ndGgpOworICAgIHJldHVybiB0cnVlOworfQor
Cit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpyZXN0b3JlRm9ybUNvbnRyb2xTdGF0ZShTZWxlY3RF
bGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgY29uc3QgU3RyaW5nJiBzdGF0ZSkK
K3sKKyAgICByZWNhbGNMaXN0SXRlbXMoZGF0YSwgZWxlbWVudCk7CisKKyAgICBjb25zdCBWZWN0
b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGludCBs
ZW5ndGggPSBpdGVtcy5zaXplKCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsg
KytpKSB7CisgICAgICAgIGlmIChPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRp
b25FbGVtZW50KGl0ZW1zW2ldKSkKKyAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQtPnNldFNlbGVj
dGVkU3RhdGUoc3RhdGVbaV0gPT0gJ1gnKTsKKyAgICB9CisKKyAgICBzZXRPcHRpb25zQ2hhbmdl
ZE9uUmVuZGVyZXIoZGF0YSwgZWxlbWVudCk7Cit9CisKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6
OnBhcnNlTXVsdGlwbGVBdHRyaWJ1dGUoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQq
IGVsZW1lbnQsIEF0dHJpYnV0ZSogYXR0cmlidXRlKQoreworICAgIGJvb2wgb2xkVXNlc01lbnVM
aXN0ID0gZGF0YS51c2VzTWVudUxpc3QoKTsKKyAgICBkYXRhLnNldE11bHRpcGxlKCFhdHRyaWJ1
dGUtPmlzTnVsbCgpKTsKKyAgICB0b1NlbGVjdEVsZW1lbnQoZWxlbWVudCktPnVwZGF0ZVZhbGlk
aXR5KCk7CisgICAgaWYgKG9sZFVzZXNNZW51TGlzdCAhPSBkYXRhLnVzZXNNZW51TGlzdCgpICYm
IGVsZW1lbnQtPmF0dGFjaGVkKCkpIHsKKyAgICAgICAgZWxlbWVudC0+ZGV0YWNoKCk7CisgICAg
ICAgIGVsZW1lbnQtPmF0dGFjaCgpOworICAgIH0KK30KKworYm9vbCBIVE1MU2VsZWN0RWxlbWVu
dDo6YXBwZW5kRm9ybURhdGEoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1l
bnQsIEZvcm1EYXRhTGlzdCYgbGlzdCkKK3sKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUg
PSBlbGVtZW50LT5mb3JtQ29udHJvbE5hbWUoKTsKKyAgICBpZiAobmFtZS5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgc3VjY2Vzc2Z1bCA9IGZhbHNlOworICAg
IGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7
CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVt
c1tpXSk7CisgICAgICAgIGlmIChvcHRpb25FbGVtZW50ICYmIG9wdGlvbkVsZW1lbnQtPnNlbGVj
dGVkKCkgJiYgIW9wdGlvbkVsZW1lbnQtPmRpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIGxpc3Qu
YXBwZW5kRGF0YShuYW1lLCBvcHRpb25FbGVtZW50LT52YWx1ZSgpKTsKKyAgICAgICAgICAgIHN1
Y2Nlc3NmdWwgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSXQncyBwb3NzaWJs
ZSB0aGF0IHRoaXMgaXMgYSBtZW51bGlzdCB3aXRoIG11bHRpcGxlIG9wdGlvbnMgYW5kIG5vdGhp
bmcKKyAgICAvLyB3aWxsIGJlIHN1Ym1pdHRlZCAoIXN1Y2Nlc3NmdWwpLiBXZSB3b24ndCBzZW5k
IGEgdW5zZWxlY3RlZCBub24tZGlzYWJsZWQKKyAgICAvLyBvcHRpb24gYXMgZmFsbGJhY2suIFRo
aXMgYmVoYXZpb3IgbWF0Y2hlcyB0byBvdGhlciBicm93c2Vycy4KKyAgICByZXR1cm4gc3VjY2Vz
c2Z1bDsKK30gCisKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnJlc2V0KFNlbGVjdEVsZW1lbnRE
YXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIE9wdGlvbkVsZW1lbnQqIGZpcnN0
T3B0aW9uID0gMDsKKyAgICBPcHRpb25FbGVtZW50KiBzZWxlY3RlZE9wdGlvbiA9IDA7CisKKyAg
ICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQp
OworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAg
ICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1z
W2ldKTsKKyAgICAgICAgaWYgKCFvcHRpb25FbGVtZW50KQorICAgICAgICAgICAgY29udGludWU7
CisKKyAgICAgICAgaWYgKGl0ZW1zW2ldLT5mYXN0SGFzQXR0cmlidXRlKEhUTUxOYW1lczo6c2Vs
ZWN0ZWRBdHRyKSkgeworICAgICAgICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uICYmICFkYXRhLm11
bHRpcGxlKCkpCisgICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24tPnNldFNlbGVjdGVkU3Rh
dGUoZmFsc2UpOworICAgICAgICAgICAgb3B0aW9uRWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZSh0
cnVlKTsKKyAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uID0gb3B0aW9uRWxlbWVudDsKKyAgICAg
ICAgfSBlbHNlCisgICAgICAgICAgICBvcHRpb25FbGVtZW50LT5zZXRTZWxlY3RlZFN0YXRlKGZh
bHNlKTsKKworICAgICAgICBpZiAoIWZpcnN0T3B0aW9uKQorICAgICAgICAgICAgZmlyc3RPcHRp
b24gPSBvcHRpb25FbGVtZW50OworICAgIH0KKworICAgIGlmICghc2VsZWN0ZWRPcHRpb24gJiYg
Zmlyc3RPcHRpb24gJiYgIWRhdGEubXVsdGlwbGUoKSAmJiBkYXRhLnNpemUoKSA8PSAxKQorICAg
ICAgICBmaXJzdE9wdGlvbi0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKKworICAgIHNldE9wdGlv
bnNDaGFuZ2VkT25SZW5kZXJlcihkYXRhLCBlbGVtZW50KTsKKyAgICBlbGVtZW50LT5zZXROZWVk
c1N0eWxlUmVjYWxjKCk7Cit9CisKKyNpZiAhUExBVEZPUk0oV0lOKSB8fCBPUyhXSU5DRSkKK2Jv
b2wgSFRNTFNlbGVjdEVsZW1lbnQ6OnBsYXRmb3JtSGFuZGxlS2V5ZG93bkV2ZW50KFNlbGVjdEVs
ZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBLZXlib2FyZEV2ZW50KiBldmVudCkK
K3sKKyNpZiBBUlJPV19LRVlTX1BPUF9NRU5VCisgICAgaWYgKCFpc1NwYXRpYWxOYXZpZ2F0aW9u
RW5hYmxlZChlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKSkgeworICAgICAgICBpZiAoZXZl
bnQtPmtleUlkZW50aWZpZXIoKSA9PSAiRG93biIgfHwgZXZlbnQtPmtleUlkZW50aWZpZXIoKSA9
PSAiVXAiKSB7CisgICAgICAgICAgICBlbGVtZW50LT5mb2N1cygpOworCisgICAgICAgICAgICAv
LyBDYWxsaW5nIGZvY3VzKCkgbWF5IGNhdXNlIHVzIHRvIGxvc2Ugb3VyIHJlbmRlcmVyLiBSZXR1
cm4gdHJ1ZSBzbworICAgICAgICAgICAgLy8gdGhhdCBvdXIgY2FsbGVyIGRvZXNuJ3QgcHJvY2Vz
cyB0aGUgZXZlbnQgZnVydGhlciwgYnV0IGRvbid0IHNldAorICAgICAgICAgICAgLy8gdGhlIGV2
ZW50IGFzIGhhbmRsZWQuCisgICAgICAgICAgICBpZiAoIWVsZW1lbnQtPnJlbmRlcmVyKCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIC8vIFNhdmUgdGhlIHNl
bGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIG5ldyBzZWxlY3Rpb24KKyAgICAg
ICAgICAgIC8vIHdoZW4gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgc2V0U2VsZWN0
ZWRJbmRleCwgd2hpY2gKKyAgICAgICAgICAgIC8vIGdldHMgY2FsbGVkIGZyb20gUmVuZGVyTWVu
dUxpc3Q6OnZhbHVlQ2hhbmdlZCwgd2hpY2ggZ2V0cyBjYWxsZWQKKyAgICAgICAgICAgIC8vIGFm
dGVyIHRoZSB1c2VyIG1ha2VzIGEgc2VsZWN0aW9uIGZyb20gdGhlIG1lbnUuCisgICAgICAgICAg
ICBzYXZlTGFzdFNlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsKKyAgICAgICAgICAgIGlmIChSZW5k
ZXJNZW51TGlzdCogbWVudUxpc3QgPSB0b1JlbmRlck1lbnVMaXN0KGVsZW1lbnQtPnJlbmRlcmVy
KCkpKQorICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAoKTsKKyAgICAgICAgICAg
IGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCit2b2lk
IEhUTUxTZWxlY3RFbGVtZW50OjptZW51TGlzdERlZmF1bHRFdmVudEhhbmRsZXIoU2VsZWN0RWxl
bWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIEV2ZW50KiBldmVudCwgSFRNTEZvcm1F
bGVtZW50KiBodG1sRm9ybSkKK3sKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVz
KCkua2V5ZG93bkV2ZW50KSB7CisgICAgICAgIGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSB8fCAh
ZXZlbnQtPmlzS2V5Ym9hcmRFdmVudCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAg
IGlmIChwbGF0Zm9ybUhhbmRsZUtleWRvd25FdmVudChkYXRhLCBlbGVtZW50LCBzdGF0aWNfY2Fz
dDxLZXlib2FyZEV2ZW50Kj4oZXZlbnQpKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICAvLyBXaGVuIHVzaW5nIHNwYXRpYWwgbmF2aWdhdGlvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRv
IG5hdmlnYXRlIGF3YXkKKyAgICAgICAgLy8gZnJvbSB0aGUgc2VsZWN0IGVsZW1lbnQgd2hlbiB0
aGUgdXNlciBoaXRzIGFueSBvZiB0aGUgYXJyb3cga2V5cywKKyAgICAgICAgLy8gaW5zdGVhZCBv
ZiBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uLgorICAgICAgICBpZiAoaXNTcGF0aWFsTmF2aWdhdGlv
bkVuYWJsZWQoZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSkpIHsKKyAgICAgICAgICAgIGlm
ICghZGF0YS5hY3RpdmVTZWxlY3Rpb25TdGF0ZSgpKQorICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFN0cmluZyYga2V5SWRlbnRpZmllciA9IHN0YXRp
Y19jYXN0PEtleWJvYXJkRXZlbnQqPihldmVudCktPmtleUlkZW50aWZpZXIoKTsKKyAgICAgICAg
Ym9vbCBoYW5kbGVkID0gZmFsc2U7CisKKyAgICAgICAgVU5VU0VEX1BBUkFNKGh0bWxGb3JtKTsK
KyAgICAgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gZGF0YS5saXN0SXRl
bXMoZWxlbWVudCk7CisKKyAgICAgICAgaW50IGxpc3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4
KGRhdGEsIGVsZW1lbnQsIHNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCkpOworCisgICAgICAg
IGlmIChrZXlJZGVudGlmaWVyID09ICJEb3duIiB8fCBrZXlJZGVudGlmaWVyID09ICJSaWdodCIp
IHsKKyAgICAgICAgICAgIGxpc3RJbmRleCA9IG5leHRWYWxpZEluZGV4KGxpc3RJdGVtcywgbGlz
dEluZGV4LCBTa2lwRm9yd2FyZHMsIDEpOworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Cisg
ICAgICAgIH0gZWxzZSBpZiAoa2V5SWRlbnRpZmllciA9PSAiVXAiIHx8IGtleUlkZW50aWZpZXIg
PT0gIkxlZnQiKSB7CisgICAgICAgICAgICBsaXN0SW5kZXggPSBuZXh0VmFsaWRJbmRleChsaXN0
SXRlbXMsIGxpc3RJbmRleCwgU2tpcEJhY2t3YXJkcywgMSk7CisgICAgICAgICAgICBoYW5kbGVk
ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXlJZGVudGlmaWVyID09ICJQYWdlRG93biIp
IHsKKyAgICAgICAgICAgIGxpc3RJbmRleCA9IG5leHRWYWxpZEluZGV4KGxpc3RJdGVtcywgbGlz
dEluZGV4LCBTa2lwRm9yd2FyZHMsIDMpOworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Cisg
ICAgICAgIH0gZWxzZSBpZiAoa2V5SWRlbnRpZmllciA9PSAiUGFnZVVwIikgeworICAgICAgICAg
ICAgbGlzdEluZGV4ID0gbmV4dFZhbGlkSW5kZXgobGlzdEl0ZW1zLCBsaXN0SW5kZXgsIFNraXBC
YWNrd2FyZHMsIDMpOworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0gZWxz
ZSBpZiAoa2V5SWRlbnRpZmllciA9PSAiSG9tZSIpIHsKKyAgICAgICAgICAgIGxpc3RJbmRleCA9
IG5leHRWYWxpZEluZGV4KGxpc3RJdGVtcywgLTEsIFNraXBGb3J3YXJkcywgMSk7CisgICAgICAg
ICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXlJZGVudGlmaWVyID09
ICJFbmQiKSB7CisgICAgICAgICAgICBsaXN0SW5kZXggPSBuZXh0VmFsaWRJbmRleChsaXN0SXRl
bXMsIGxpc3RJdGVtcy5zaXplKCksIFNraXBCYWNrd2FyZHMsIDEpOworICAgICAgICAgICAgaGFu
ZGxlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGFuZGxlZCAmJiBsaXN0SW5k
ZXggPj0gMCAmJiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obGlzdEluZGV4KSA8IGxpc3RJdGVtcy5z
aXplKCkpCisgICAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1lbnQsIGxpc3RU
b09wdGlvbkluZGV4KGRhdGEsIGVsZW1lbnQsIGxpc3RJbmRleCkpOworCisgICAgICAgIGlmICho
YW5kbGVkKQorICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgfQor
CisgICAgLy8gVXNlIGtleSBwcmVzcyBldmVudCBoZXJlIHNpbmNlIHNlbmRpbmcgc2ltdWxhdGVk
IG1vdXNlIGV2ZW50cworICAgIC8vIG9uIGtleSBkb3duIGJsb2NrcyB0aGUgcHJvcGVyIHNlbmRp
bmcgb2YgdGhlIGtleSBwcmVzcyBldmVudC4KKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVu
dE5hbWVzKCkua2V5cHJlc3NFdmVudCkgeworICAgICAgICBpZiAoIWVsZW1lbnQtPnJlbmRlcmVy
KCkgfHwgIWV2ZW50LT5pc0tleWJvYXJkRXZlbnQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKwor
ICAgICAgICBpbnQga2V5Q29kZSA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihldmVudCkt
PmtleUNvZGUoKTsKKyAgICAgICAgYm9vbCBoYW5kbGVkID0gZmFsc2U7CisKKyAgICAgICAgaWYg
KGtleUNvZGUgPT0gJyAnICYmIGlzU3BhdGlhbE5hdmlnYXRpb25FbmFibGVkKGVsZW1lbnQtPmRv
Y3VtZW50KCktPmZyYW1lKCkpKSB7CisgICAgICAgICAgICAvLyBVc2Ugc3BhY2UgdG8gdG9nZ2xl
IGFycm93IGtleSBoYW5kbGluZyBmb3Igc2VsZWN0aW9uIGNoYW5nZSBvciBzcGF0aWFsIG5hdmln
YXRpb24uCisgICAgICAgICAgICBkYXRhLnNldEFjdGl2ZVNlbGVjdGlvblN0YXRlKCFkYXRhLmFj
dGl2ZVNlbGVjdGlvblN0YXRlKCkpOworICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5k
bGVkKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworI2lmIFNQQUNFX09SX1JF
VFVSTl9QT1BfTUVOVQorICAgICAgICBpZiAoa2V5Q29kZSA9PSAnICcgfHwga2V5Q29kZSA9PSAn
XHInKSB7CisgICAgICAgICAgICBlbGVtZW50LT5mb2N1cygpOworCisgICAgICAgICAgICAvLyBD
YWxsaW5nIGZvY3VzKCkgbWF5IGNhdXNlIHVzIHRvIGxvc2Ugb3VyIHJlbmRlcmVyLCBpbiB3aGlj
aCBjYXNlCisgICAgICAgICAgICAvLyBkbyBub3Qgd2FudCB0byBoYW5kbGUgdGhlIGV2ZW50Lgor
ICAgICAgICAgICAgaWYgKCFlbGVtZW50LT5yZW5kZXJlcigpKQorICAgICAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBj
b21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbgorICAgICAgICAgICAgLy8gd2hlbiBkaXNwYXRj
aGluZyBjaGFuZ2UgZXZlbnRzIGR1cmluZyBzZXRTZWxlY3RlZEluZGV4LCB3aGljaAorICAgICAg
ICAgICAgLy8gZ2V0cyBjYWxsZWQgZnJvbSBSZW5kZXJNZW51TGlzdDo6dmFsdWVDaGFuZ2VkLCB3
aGljaCBnZXRzIGNhbGxlZAorICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIHVzZXIgbWFrZXMgYSBz
ZWxlY3Rpb24gZnJvbSB0aGUgbWVudS4KKyAgICAgICAgICAgIHNhdmVMYXN0U2VsZWN0aW9uKGRh
dGEsIGVsZW1lbnQpOworICAgICAgICAgICAgaWYgKFJlbmRlck1lbnVMaXN0KiBtZW51TGlzdCA9
IHRvUmVuZGVyTWVudUxpc3QoZWxlbWVudC0+cmVuZGVyZXIoKSkpCisgICAgICAgICAgICAgICAg
bWVudUxpc3QtPnNob3dQb3B1cCgpOworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAg
ICAgIH0KKyNlbGlmIEFSUk9XX0tFWVNfUE9QX01FTlUKKyAgICAgICAgaWYgKGtleUNvZGUgPT0g
JyAnKSB7CisgICAgICAgICAgICBlbGVtZW50LT5mb2N1cygpOworCisgICAgICAgICAgICAvLyBD
YWxsaW5nIGZvY3VzKCkgbWF5IGNhdXNlIHVzIHRvIGxvc2Ugb3VyIHJlbmRlcmVyLCBpbiB3aGlj
aCBjYXNlCisgICAgICAgICAgICAvLyBkbyBub3Qgd2FudCB0byBoYW5kbGUgdGhlIGV2ZW50Lgor
ICAgICAgICAgICAgaWYgKCFlbGVtZW50LT5yZW5kZXJlcigpKQorICAgICAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBj
b21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbgorICAgICAgICAgICAgLy8gd2hlbiBkaXNwYXRj
aGluZyBjaGFuZ2UgZXZlbnRzIGR1cmluZyBzZXRTZWxlY3RlZEluZGV4LCB3aGljaAorICAgICAg
ICAgICAgLy8gZ2V0cyBjYWxsZWQgZnJvbSBSZW5kZXJNZW51TGlzdDo6dmFsdWVDaGFuZ2VkLCB3
aGljaCBnZXRzIGNhbGxlZAorICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIHVzZXIgbWFrZXMgYSBz
ZWxlY3Rpb24gZnJvbSB0aGUgbWVudS4KKyAgICAgICAgICAgIHNhdmVMYXN0U2VsZWN0aW9uKGRh
dGEsIGVsZW1lbnQpOworICAgICAgICAgICAgaWYgKFJlbmRlck1lbnVMaXN0KiBtZW51TGlzdCA9
IHRvUmVuZGVyTWVudUxpc3QoZWxlbWVudC0+cmVuZGVyZXIoKSkpCisgICAgICAgICAgICAgICAg
bWVudUxpc3QtPnNob3dQb3B1cCgpOworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAg
ICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PSAnXHInKSB7CisgICAgICAgICAgICBpZiAoaHRtbEZv
cm0pCisgICAgICAgICAgICAgICAgaHRtbEZvcm0tPnN1Ym1pdEltcGxpY2l0bHkoZXZlbnQsIGZh
bHNlKTsKKyAgICAgICAgICAgIG1lbnVMaXN0T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7CisgICAg
ICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaW50IGxp
c3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIHNlbGVjdGVkSW5kZXgo
ZGF0YSwgZWxlbWVudCkpOworICAgICAgICBpZiAoa2V5Q29kZSA9PSAnXHInKSB7CisgICAgICAg
ICAgICAvLyBsaXN0SW5kZXggc2hvdWxkIGFscmVhZHkgYmUgc2VsZWN0ZWQsIGJ1dCB0aGlzIHdp
bGwgZmlyZSB0aGUgb25jaGFuZ2UgaGFuZGxlci4KKyAgICAgICAgICAgIHNldFNlbGVjdGVkSW5k
ZXgoZGF0YSwgZWxlbWVudCwgbGlzdFRvT3B0aW9uSW5kZXgoZGF0YSwgZWxlbWVudCwgbGlzdElu
ZGV4KSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAg
fQorI2VuZGlmCisgICAgICAgIGlmIChoYW5kbGVkKQorICAgICAgICAgICAgZXZlbnQtPnNldERl
ZmF1bHRIYW5kbGVkKCk7CisgICAgfQorCisgICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnRO
YW1lcygpLm1vdXNlZG93bkV2ZW50ICYmIGV2ZW50LT5pc01vdXNlRXZlbnQoKSAmJiBzdGF0aWNf
Y2FzdDxNb3VzZUV2ZW50Kj4oZXZlbnQpLT5idXR0b24oKSA9PSBMZWZ0QnV0dG9uKSB7CisgICAg
ICAgIGVsZW1lbnQtPmZvY3VzKCk7CisgICAgICAgIGlmIChlbGVtZW50LT5yZW5kZXJlcigpICYm
IGVsZW1lbnQtPnJlbmRlcmVyKCktPmlzTWVudUxpc3QoKSkgeworICAgICAgICAgICAgaWYgKFJl
bmRlck1lbnVMaXN0KiBtZW51TGlzdCA9IHRvUmVuZGVyTWVudUxpc3QoZWxlbWVudC0+cmVuZGVy
ZXIoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWVudUxpc3QtPnBvcHVwSXNWaXNpYmxlKCkp
CisgICAgICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5oaWRlUG9wdXAoKTsKKyAgICAgICAgICAg
ICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNv
IGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3CisgICAgICAgICAgICAgICAgICAgIC8vIHNl
bGVjdGlvbiB3aGVuIHdlIGNhbGwgb25DaGFuZ2UgZHVyaW5nIHNldFNlbGVjdGVkSW5kZXgsCisg
ICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGdldHMgY2FsbGVkIGZyb20gUmVuZGVyTWVudUxp
c3Q6OnZhbHVlQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggZ2V0cyBjYWxs
ZWQgYWZ0ZXIgdGhlIHVzZXIgbWFrZXMgYSBzZWxlY3Rpb24gZnJvbQorICAgICAgICAgICAgICAg
ICAgICAvLyB0aGUgbWVudS4KKyAgICAgICAgICAgICAgICAgICAgc2F2ZUxhc3RTZWxlY3Rpb24o
ZGF0YSwgZWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAo
KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAg
ZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgfQorfQorCit2b2lkIEhUTUxTZWxlY3RF
bGVtZW50Ojp1cGRhdGVTZWxlY3RlZFN0YXRlKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVt
ZW50KiBlbGVtZW50LCBpbnQgbGlzdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJvb2wgbXVsdGksIGJvb2wgc2hpZnQpCit7CisgICAgQVNTRVJUKGxpc3RJ
bmRleCA+PSAwKTsKKworICAgIC8vIFNhdmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29t
cGFyZWQgdG8gdGhlIG5ldyBzZWxlY3Rpb24gd2hlbgorICAgIC8vIGRpc3BhdGNoaW5nIGNoYW5n
ZSBldmVudHMgZHVyaW5nIG1vdXNldXAsIG9yIGFmdGVyIGF1dG9zY3JvbGwgZmluaXNoZXMuCisg
ICAgc2F2ZUxhc3RTZWxlY3Rpb24oZGF0YSwgZWxlbWVudCk7CisKKyAgICBkYXRhLnNldEFjdGl2
ZVNlbGVjdGlvblN0YXRlKHRydWUpOworCisgICAgYm9vbCBzaGlmdFNlbGVjdCA9IGRhdGEubXVs
dGlwbGUoKSAmJiBzaGlmdDsKKyAgICBib29sIG11bHRpU2VsZWN0ID0gZGF0YS5tdWx0aXBsZSgp
ICYmIG11bHRpICYmICFzaGlmdDsKKworICAgIEVsZW1lbnQqIGNsaWNrZWRFbGVtZW50ID0gZGF0
YS5saXN0SXRlbXMoZWxlbWVudClbbGlzdEluZGV4XTsKKyAgICBPcHRpb25FbGVtZW50KiBvcHRp
b24gPSB0b09wdGlvbkVsZW1lbnQoY2xpY2tlZEVsZW1lbnQpOworICAgIGlmIChvcHRpb24pIHsK
KyAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB3aGV0aGVyIGFuIGFjdGl2ZSBzZWxlY3Rpb24gKGxp
a2UgZHVyaW5nIGRyYWcKKyAgICAgICAgLy8gc2VsZWN0aW9uKSwgc2hvdWxkIHNlbGVjdCBvciBk
ZXNlbGVjdAorICAgICAgICBpZiAob3B0aW9uLT5zZWxlY3RlZCgpICYmIG11bHRpKQorICAgICAg
ICAgICAgZGF0YS5zZXRBY3RpdmVTZWxlY3Rpb25TdGF0ZShmYWxzZSk7CisKKyAgICAgICAgaWYg
KCFkYXRhLmFjdGl2ZVNlbGVjdGlvblN0YXRlKCkpCisgICAgICAgICAgICBvcHRpb24tPnNldFNl
bGVjdGVkU3RhdGUoZmFsc2UpOworICAgIH0KKworICAgIC8vIElmIHdlJ3JlIG5vdCBpbiBhbnkg
c3BlY2lhbCBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSwgdGhlbiBkZXNlbGVjdCBhbGwKKyAgICAv
LyBvdGhlciBpdGVtcywgZXhjbHVkaW5nIHRoZSBjbGlja2VkIG9wdGlvbi4gSWYgbm8gb3B0aW9u
IHdhcyBjbGlja2VkLCB0aGVuCisgICAgLy8gdGhpcyB3aWxsIGRlc2VsZWN0IGFsbCBpdGVtcyBp
biB0aGUgbGlzdC4KKyAgICBpZiAoIXNoaWZ0U2VsZWN0ICYmICFtdWx0aVNlbGVjdCkKKyAgICAg
ICAgZGVzZWxlY3RJdGVtcyhkYXRhLCBlbGVtZW50LCBjbGlja2VkRWxlbWVudCk7CisKKyAgICAv
LyBJZiB0aGUgYW5jaG9yIGhhc24ndCBiZWVuIHNldCwgYW5kIHdlJ3JlIGRvaW5nIGEgc2luZ2xl
IHNlbGVjdGlvbiBvciBhCisgICAgLy8gc2hpZnQgc2VsZWN0aW9uLCB0aGVuIGluaXRpYWxpemUg
dGhlIGFuY2hvciB0byB0aGUgZmlyc3Qgc2VsZWN0ZWQgaW5kZXguCisgICAgaWYgKGRhdGEuYWN0
aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoKSA8IDAgJiYgIW11bHRpU2VsZWN0KQorICAgICAgICBz
ZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChkYXRhLCBlbGVtZW50LCBzZWxlY3RlZEluZGV4
KGRhdGEsIGVsZW1lbnQpKTsKKworICAgIC8vIFNldCB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIHRo
ZSBjbGlja2VkIG9wdGlvbgorICAgIGlmIChvcHRpb24gJiYgIWNsaWNrZWRFbGVtZW50LT5kaXNh
YmxlZCgpKQorICAgICAgICBvcHRpb24tPnNldFNlbGVjdGVkU3RhdGUodHJ1ZSk7CisKKyAgICAv
LyBJZiB0aGVyZSB3YXMgbm8gc2VsZWN0ZWRJbmRleCgpIGZvciB0aGUgcHJldmlvdXMgaW5pdGlh
bGl6YXRpb24sIG9yIElmCisgICAgLy8gd2UncmUgZG9pbmcgYSBzaW5nbGUgc2VsZWN0aW9uLCBv
ciBhIG11bHRpcGxlIHNlbGVjdGlvbiAodXNpbmcgY21kIG9yCisgICAgLy8gY3RybCksIHRoZW4g
aW5pdGlhbGl6ZSB0aGUgYW5jaG9yIGluZGV4IHRvIHRoZSBsaXN0SW5kZXggdGhhdCBqdXN0IGdv
dAorICAgIC8vIGNsaWNrZWQuCisgICAgaWYgKGRhdGEuYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5k
ZXgoKSA8IDAgfHwgIXNoaWZ0U2VsZWN0KQorICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNo
b3JJbmRleChkYXRhLCBlbGVtZW50LCBsaXN0SW5kZXgpOworCisgICAgc2V0QWN0aXZlU2VsZWN0
aW9uRW5kSW5kZXgoZGF0YSwgbGlzdEluZGV4KTsKKyAgICB1cGRhdGVMaXN0Qm94U2VsZWN0aW9u
KGRhdGEsIGVsZW1lbnQsICFtdWx0aVNlbGVjdCk7Cit9CisKK3ZvaWQgSFRNTFNlbGVjdEVsZW1l
bnQ6Omxpc3RCb3hEZWZhdWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBF
bGVtZW50KiBlbGVtZW50LCBFdmVudCogZXZlbnQsIEhUTUxGb3JtRWxlbWVudCogaHRtbEZvcm0p
Cit7CisgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gZGF0YS5saXN0SXRl
bXMoZWxlbWVudCk7CisKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91
c2Vkb3duRXZlbnQgJiYgZXZlbnQtPmlzTW91c2VFdmVudCgpICYmIHN0YXRpY19jYXN0PE1vdXNl
RXZlbnQqPihldmVudCktPmJ1dHRvbigpID09IExlZnRCdXR0b24pIHsKKyAgICAgICAgZWxlbWVu
dC0+Zm9jdXMoKTsKKworICAgICAgICAvLyBDYWxsaW5nIGZvY3VzKCkgbWF5IGNhdXNlIHVzIHRv
IGxvc2Ugb3VyIHJlbmRlcmVyLCBpbiB3aGljaCBjYXNlIGRvIG5vdCB3YW50IHRvIGhhbmRsZSB0
aGUgZXZlbnQuCisgICAgICAgIGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSkKKyAgICAgICAgICAg
IHJldHVybjsKKworICAgICAgICAvLyBDb252ZXJ0IHRvIGNvb3JkcyByZWxhdGl2ZSB0byB0aGUg
bGlzdCBib3ggaWYgbmVlZGVkLgorICAgICAgICBNb3VzZUV2ZW50KiBtb3VzZUV2ZW50ID0gc3Rh
dGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2ZW50KTsKKyAgICAgICAgSW50UG9pbnQgbG9jYWxPZmZz
ZXQgPSByb3VuZGVkSW50UG9pbnQoZWxlbWVudC0+cmVuZGVyZXIoKS0+YWJzb2x1dGVUb0xvY2Fs
KG1vdXNlRXZlbnQtPmFic29sdXRlTG9jYXRpb24oKSwgZmFsc2UsIHRydWUpKTsKKyAgICAgICAg
aW50IGxpc3RJbmRleCA9IHRvUmVuZGVyTGlzdEJveChlbGVtZW50LT5yZW5kZXJlcigpKS0+bGlz
dEluZGV4QXRPZmZzZXQodG9TaXplKGxvY2FsT2Zmc2V0KSk7CisgICAgICAgIGlmIChsaXN0SW5k
ZXggPj0gMCkgeworI2lmIFBMQVRGT1JNKE1BQykgfHwgKFBMQVRGT1JNKENIUk9NSVVNKSAmJiBP
UyhEQVJXSU4pKQorICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRTdGF0ZShkYXRhLCBlbGVtZW50
LCBsaXN0SW5kZXgsIG1vdXNlRXZlbnQtPm1ldGFLZXkoKSwgbW91c2VFdmVudC0+c2hpZnRLZXko
KSk7CisjZWxzZQorICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRTdGF0ZShkYXRhLCBlbGVtZW50
LCBsaXN0SW5kZXgsIG1vdXNlRXZlbnQtPmN0cmxLZXkoKSwgbW91c2VFdmVudC0+c2hpZnRLZXko
KSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBlbGVtZW50LT5kb2N1
bWVudCgpLT5mcmFtZSgpKQorICAgICAgICAgICAgICAgIGZyYW1lLT5ldmVudEhhbmRsZXIoKS0+
c2V0TW91c2VEb3duTWF5U3RhcnRBdXRvc2Nyb2xsKCk7CisKKyAgICAgICAgICAgIGV2ZW50LT5z
ZXREZWZhdWx0SGFuZGxlZCgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChldmVudC0+dHlw
ZSgpID09IGV2ZW50TmFtZXMoKS5tb3VzZXVwRXZlbnQgJiYgZXZlbnQtPmlzTW91c2VFdmVudCgp
ICYmIHN0YXRpY19jYXN0PE1vdXNlRXZlbnQqPihldmVudCktPmJ1dHRvbigpID09IExlZnRCdXR0
b24gJiYgZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPmF1dG9z
Y3JvbGxSZW5kZXJlcigpICE9IGVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKKyAgICAgICAgLy8gVGhp
cyBtYWtlcyBzdXJlIHdlIGZpcmUgZGlzcGF0Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50IGZvciBh
IHNpbmdsZQorICAgICAgICAvLyBjbGljay4gRm9yIGRyYWcgc2VsZWN0aW9uLCBvbkNoYW5nZSB3
aWxsIGZpcmUgd2hlbiB0aGUgYXV0b3Njcm9sbAorICAgICAgICAvLyB0aW1lciBzdG9wcy4KKyAg
ICAgICAgbGlzdEJveE9uQ2hhbmdlKGRhdGEsIGVsZW1lbnQpOworICAgIH0gZWxzZSBpZiAoZXZl
bnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkua2V5ZG93bkV2ZW50KSB7CisgICAgICAgIGlmICgh
ZXZlbnQtPmlzS2V5Ym9hcmRFdmVudCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBj
b25zdCBTdHJpbmcmIGtleUlkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50Kj4o
ZXZlbnQpLT5rZXlJZGVudGlmaWVyKCk7CisKKyAgICAgICAgYm9vbCBoYW5kbGVkID0gZmFsc2U7
CisgICAgICAgIGludCBlbmRJbmRleCA9IDA7CisgICAgICAgIGlmIChkYXRhLmFjdGl2ZVNlbGVj
dGlvbkVuZEluZGV4KCkgPCAwKSB7CisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBlbmQg
aW5kZXgKKyAgICAgICAgICAgIGlmIChrZXlJZGVudGlmaWVyID09ICJEb3duIiB8fCBrZXlJZGVu
dGlmaWVyID09ICJQYWdlRG93biIpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRJbmRleCA9
IGxhc3RTZWxlY3RlZExpc3RJbmRleChkYXRhLCBlbGVtZW50KTsKKyAgICAgICAgICAgICAgICBo
YW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5SWRlbnRpZmllciA9PSAiRG93
biIpCisgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gbmV4dFNlbGVjdGFibGVMaXN0SW5k
ZXgoZGF0YSwgZWxlbWVudCwgc3RhcnRJbmRleCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4UGFnZUF3
YXkoZGF0YSwgZWxlbWVudCwgc3RhcnRJbmRleCwgU2tpcEZvcndhcmRzKTsKKyAgICAgICAgICAg
IH0gZWxzZSBpZiAoa2V5SWRlbnRpZmllciA9PSAiVXAiIHx8IGtleUlkZW50aWZpZXIgPT0gIlBh
Z2VVcCIpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRJbmRleCA9IG9wdGlvblRvTGlzdElu
ZGV4KGRhdGEsIGVsZW1lbnQsIHNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCkpOworICAgICAg
ICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChrZXlJZGVudGlm
aWVyID09ICJVcCIpCisgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gcHJldmlvdXNTZWxl
Y3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIHN0YXJ0SW5kZXgpOworICAgICAgICAgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBuZXh0U2VsZWN0YWJsZUxp
c3RJbmRleFBhZ2VBd2F5KGRhdGEsIGVsZW1lbnQsIHN0YXJ0SW5kZXgsIFNraXBCYWNrd2FyZHMp
OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU2V0IHRo
ZSBlbmQgaW5kZXggYmFzZWQgb24gdGhlIGN1cnJlbnQgZW5kIGluZGV4CisgICAgICAgICAgICBp
ZiAoa2V5SWRlbnRpZmllciA9PSAiRG93biIpIHsKKyAgICAgICAgICAgICAgICBlbmRJbmRleCA9
IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIGRhdGEuYWN0aXZlU2VsZWN0
aW9uRW5kSW5kZXgoKSk7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAg
ICAgICB9IGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIlVwIikgeworICAgICAgICAgICAgICAg
IGVuZEluZGV4ID0gcHJldmlvdXNTZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIGRh
dGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSk7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9
IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIlBhZ2VEb3du
IikgeworICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gbmV4dFNlbGVjdGFibGVMaXN0SW5kZXhQ
YWdlQXdheShkYXRhLCBlbGVtZW50LCBkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCksIFNr
aXBGb3J3YXJkcyk7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAg
ICB9IGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIlBhZ2VVcCIpIHsKKyAgICAgICAgICAgICAg
ICBlbmRJbmRleCA9IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4UGFnZUF3YXkoZGF0YSwgZWxlbWVu
dCwgZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpLCBTa2lwQmFja3dhcmRzKTsKKyAgICAg
ICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
ICAgICBpZiAoa2V5SWRlbnRpZmllciA9PSAiSG9tZSIpIHsKKyAgICAgICAgICAgIGVuZEluZGV4
ID0gZmlyc3RTZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQpOworICAgICAgICAgICAg
aGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5SWRlbnRpZmllciA9PSAiRW5k
IikgeworICAgICAgICAgICAgZW5kSW5kZXggPSBsYXN0U2VsZWN0YWJsZUxpc3RJbmRleChkYXRh
LCBlbGVtZW50KTsKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKGlzU3BhdGlhbE5hdmlnYXRpb25FbmFibGVkKGVsZW1lbnQtPmRvY3VtZW50KCkt
PmZyYW1lKCkpKQorICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlbGVjdGlvbiBtb3ZlcyB0
byB0aGUgYm91bmRhcnkuCisgICAgICAgICAgICBpZiAoa2V5SWRlbnRpZmllciA9PSAiTGVmdCIg
fHwga2V5SWRlbnRpZmllciA9PSAiUmlnaHQiIHx8ICgoa2V5SWRlbnRpZmllciA9PSAiRG93biIg
fHwga2V5SWRlbnRpZmllciA9PSAiVXAiKSAmJiBlbmRJbmRleCA9PSBkYXRhLmFjdGl2ZVNlbGVj
dGlvbkVuZEluZGV4KCkpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAo
ZW5kSW5kZXggPj0gMCAmJiBoYW5kbGVkKSB7CisgICAgICAgICAgICAvLyBTYXZlIHRoZSBzZWxl
Y3Rpb24gc28gaXQgY2FuIGJlIGNvbXBhcmVkIHRvIHRoZSBuZXcgc2VsZWN0aW9uCisgICAgICAg
ICAgICAvLyB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBldmVudHMgaW1tZWRpYXRlbHkgYWZ0ZXIg
bWFraW5nIHRoZSBuZXcKKyAgICAgICAgICAgIC8vIHNlbGVjdGlvbi4KKyAgICAgICAgICAgIHNh
dmVMYXN0U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOworCisgICAgICAgICAgICBBU1NFUlRfVU5V
U0VEKGxpc3RJdGVtcywgIWxpc3RJdGVtcy5zaXplKCkgfHwgKGVuZEluZGV4ID49IDAgJiYgc3Rh
dGljX2Nhc3Q8dW5zaWduZWQ+KGVuZEluZGV4KSA8IGxpc3RJdGVtcy5zaXplKCkpKTsKKyAgICAg
ICAgICAgIHNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGRhdGEsIGVuZEluZGV4KTsKKworICAg
ICAgICAgICAgYm9vbCBzZWxlY3ROZXdJdGVtID0gIWRhdGEubXVsdGlwbGUoKSB8fCBzdGF0aWNf
Y2FzdDxLZXlib2FyZEV2ZW50Kj4oZXZlbnQpLT5zaGlmdEtleSgpIHx8ICFpc1NwYXRpYWxOYXZp
Z2F0aW9uRW5hYmxlZChlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKTsKKyAgICAgICAgICAg
IGlmIChzZWxlY3ROZXdJdGVtKQorICAgICAgICAgICAgICAgIGRhdGEuc2V0QWN0aXZlU2VsZWN0
aW9uU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICAvLyBJZiB0aGUgYW5jaG9yIGlzIHVuaXRpYWxp
emVkLCBvciBpZiB3ZSdyZSBnb2luZyB0byBkZXNlbGVjdCBhbGwKKyAgICAgICAgICAgIC8vIG90
aGVyIG9wdGlvbnMsIHRoZW4gc2V0IHRoZSBhbmNob3IgaW5kZXggZXF1YWwgdG8gdGhlIGVuZCBp
bmRleC4KKyAgICAgICAgICAgIGJvb2wgZGVzZWxlY3RPdGhlcnMgPSAhZGF0YS5tdWx0aXBsZSgp
IHx8ICghc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2ZW50KS0+c2hpZnRLZXkoKSAmJiBz
ZWxlY3ROZXdJdGVtKTsKKyAgICAgICAgICAgIGlmIChkYXRhLmFjdGl2ZVNlbGVjdGlvbkFuY2hv
ckluZGV4KCkgPCAwIHx8IGRlc2VsZWN0T3RoZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKGRl
c2VsZWN0T3RoZXJzKQorICAgICAgICAgICAgICAgICAgICBkZXNlbGVjdEl0ZW1zKGRhdGEsIGVs
ZW1lbnQpOworICAgICAgICAgICAgICAgIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGRh
dGEsIGVsZW1lbnQsIGRhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSk7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIHRvUmVuZGVyTGlzdEJveChlbGVtZW50LT5yZW5kZXJlcigpKS0+
c2Nyb2xsVG9SZXZlYWxFbGVtZW50QXRMaXN0SW5kZXgoZW5kSW5kZXgpOworICAgICAgICAgICAg
aWYgKHNlbGVjdE5ld0l0ZW0pIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVMaXN0Qm94U2VsZWN0
aW9uKGRhdGEsIGVsZW1lbnQsIGRlc2VsZWN0T3RoZXJzKTsKKyAgICAgICAgICAgICAgICBsaXN0
Qm94T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgICAgICBzY3JvbGxUb1NlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsKKworICAgICAgICAgICAg
ZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGV2
ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleXByZXNzRXZlbnQpIHsKKyAgICAgICAgaWYg
KCFldmVudC0+aXNLZXlib2FyZEV2ZW50KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IGludCBrZXlDb2RlID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2ZW50KS0+a2V5Q29k
ZSgpOworCisgICAgICAgIGlmIChrZXlDb2RlID09ICdccicpIHsKKyAgICAgICAgICAgIGlmICho
dG1sRm9ybSkKKyAgICAgICAgICAgICAgICBodG1sRm9ybS0+c3VibWl0SW1wbGljaXRseShldmVu
dCwgZmFsc2UpOworICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAg
ICAgIH0gZWxzZSBpZiAoZGF0YS5tdWx0aXBsZSgpICYmIGtleUNvZGUgPT0gJyAnICYmIGlzU3Bh
dGlhbE5hdmlnYXRpb25FbmFibGVkKGVsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCkpKSB7Cisg
ICAgICAgICAgICAvLyBVc2Ugc3BhY2UgdG8gdG9nZ2xlIHNlbGVjdGlvbiBjaGFuZ2UuCisgICAg
ICAgICAgICBkYXRhLnNldEFjdGl2ZVNlbGVjdGlvblN0YXRlKCFkYXRhLmFjdGl2ZVNlbGVjdGlv
blN0YXRlKCkpOworICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRTdGF0ZShkYXRhLCBlbGVtZW50
LCBsaXN0VG9PcHRpb25JbmRleChkYXRhLCBlbGVtZW50LCBkYXRhLmFjdGl2ZVNlbGVjdGlvbkVu
ZEluZGV4KCkpLCB0cnVlIC8qbXVsdGkqLywgZmFsc2UgLypzaGlmdCovKTsKKyAgICAgICAgICAg
IGxpc3RCb3hPbkNoYW5nZShkYXRhLCBlbGVtZW50KTsKKyAgICAgICAgICAgIGV2ZW50LT5zZXRE
ZWZhdWx0SGFuZGxlZCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEhUTUxTZWxlY3RF
bGVtZW50OjpkZWZhdWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVt
ZW50KiBlbGVtZW50LCBFdmVudCogZXZlbnQsIEhUTUxGb3JtRWxlbWVudCogaHRtbEZvcm0pCit7
CisgICAgaWYgKCFlbGVtZW50LT5yZW5kZXJlcigpKQorICAgICAgICByZXR1cm47CisKKyAgICBp
ZiAoZGF0YS51c2VzTWVudUxpc3QoKSkKKyAgICAgICAgbWVudUxpc3REZWZhdWx0RXZlbnRIYW5k
bGVyKGRhdGEsIGVsZW1lbnQsIGV2ZW50LCBodG1sRm9ybSk7CisgICAgZWxzZSAKKyAgICAgICAg
bGlzdEJveERlZmF1bHRFdmVudEhhbmRsZXIoZGF0YSwgZWxlbWVudCwgZXZlbnQsIGh0bWxGb3Jt
KTsKKworICAgIGlmIChldmVudC0+ZGVmYXVsdEhhbmRsZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleXByZXNzRXZlbnQgJiYg
ZXZlbnQtPmlzS2V5Ym9hcmRFdmVudCgpKSB7CisgICAgICAgIEtleWJvYXJkRXZlbnQqIGtleWJv
YXJkRXZlbnQgPSBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50Kj4oZXZlbnQpOworICAgICAgICBp
ZiAoIWtleWJvYXJkRXZlbnQtPmN0cmxLZXkoKSAmJiAha2V5Ym9hcmRFdmVudC0+YWx0S2V5KCkg
JiYgIWtleWJvYXJkRXZlbnQtPm1ldGFLZXkoKSAmJiBpc1ByaW50YWJsZUNoYXIoa2V5Ym9hcmRF
dmVudC0+Y2hhckNvZGUoKSkpIHsKKyAgICAgICAgICAgIHR5cGVBaGVhZEZpbmQoZGF0YSwgZWxl
bWVudCwga2V5Ym9hcmRFdmVudCk7CisgICAgICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRs
ZWQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IEhU
TUxTZWxlY3RFbGVtZW50OjpsYXN0U2VsZWN0ZWRMaXN0SW5kZXgoY29uc3QgU2VsZWN0RWxlbWVu
dERhdGEmIGRhdGEsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgLy8gcmV0dXJuIHRo
ZSBudW1iZXIgb2YgdGhlIGxhc3Qgb3B0aW9uIHNlbGVjdGVkCisgICAgdW5zaWduZWQgaW5kZXgg
PSAwOworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+
JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKE9wdGlvbkVsZW1lbnQqIG9w
dGlvbkVsZW1lbnQgPSB0b09wdGlvbkVsZW1lbnQoaXRlbXNbaV0pKSB7CisgICAgICAgICAgICBp
ZiAob3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0g
aTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9CisKKyAgICByZXR1cm4gZm91bmQgPyAoaW50KSBpbmRleCA6IC0xOworfQorCitz
dGF0aWMgU3RyaW5nIHN0cmlwTGVhZGluZ1doaXRlU3BhY2UoY29uc3QgU3RyaW5nJiBzdHJpbmcp
Cit7CisgICAgaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKKworICAgIGludCBpOworICAg
IGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBpZiAoc3RyaW5nW2ldICE9
IG5vQnJlYWtTcGFjZSAmJiAoc3RyaW5nW2ldIDw9IDB4N0YgPyAhaXNBU0NJSVNwYWNlKHN0cmlu
Z1tpXSkgOiAoZGlyZWN0aW9uKHN0cmluZ1tpXSkgIT0gV2hpdGVTcGFjZU5ldXRyYWwpKSkKKyAg
ICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKGks
IGxlbmd0aCAtIGkpOworfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50Ojp0eXBlQWhlYWRGaW5k
KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBLZXlib2FyZEV2ZW50
KiBldmVudCkKK3sKKyAgICBpZiAoZXZlbnQtPnRpbWVTdGFtcCgpIDwgZGF0YS5sYXN0Q2hhclRp
bWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRE9NVGltZVN0YW1wIGRlbHRhID0gZXZlbnQt
PnRpbWVTdGFtcCgpIC0gZGF0YS5sYXN0Q2hhclRpbWUoKTsKKyAgICBkYXRhLnNldExhc3RDaGFy
VGltZShldmVudC0+dGltZVN0YW1wKCkpOworCisgICAgVUNoYXIgYyA9IGV2ZW50LT5jaGFyQ29k
ZSgpOworCisgICAgU3RyaW5nIHByZWZpeDsKKyAgICBpbnQgc2VhcmNoU3RhcnRPZmZzZXQgPSAx
OworICAgIGlmIChkZWx0YSA+IHR5cGVBaGVhZFRpbWVvdXQpIHsKKyAgICAgICAgcHJlZml4ID0g
U3RyaW5nKCZjLCAxKTsKKyAgICAgICAgZGF0YS5zZXRUeXBlZFN0cmluZyhwcmVmaXgpOworICAg
ICAgICBkYXRhLnNldFJlcGVhdGluZ0NoYXIoYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0
YS50eXBlZFN0cmluZygpLmFwcGVuZChjKTsKKworICAgICAgICBpZiAoYyA9PSBkYXRhLnJlcGVh
dGluZ0NoYXIoKSkgeworICAgICAgICAgICAgLy8gVGhlIHVzZXIgaXMgbGlrZWx5IHRyeWluZyB0
byBjeWNsZSB0aHJvdWdoIGFsbCB0aGUgaXRlbXMgc3RhcnRpbmcKKyAgICAgICAgICAgIC8vIHdp
dGggdGhpcyBjaGFyYWN0ZXIsIHNvIGp1c3Qgc2VhcmNoIG9uIHRoZSBjaGFyYWN0ZXIKKyAgICAg
ICAgICAgIHByZWZpeCA9IFN0cmluZygmYywgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICBkYXRhLnNldFJlcGVhdGluZ0NoYXIoMCk7CisgICAgICAgICAgICBwcmVmaXggPSBkYXRh
LnR5cGVkU3RyaW5nKCk7CisgICAgICAgICAgICBzZWFyY2hTdGFydE9mZnNldCA9IDA7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEu
bGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7Cisg
ICAgaWYgKGl0ZW1Db3VudCA8IDEpCisgICAgICAgIHJldHVybjsKKworICAgIGludCBzZWxlY3Rl
ZCA9IHNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCk7CisgICAgaW50IGluZGV4ID0gKG9wdGlv
blRvTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQsIHNlbGVjdGVkID49IDAgPyBzZWxlY3RlZCA6IDAp
ICsgc2VhcmNoU3RhcnRPZmZzZXQpICUgaXRlbUNvdW50OworICAgIEFTU0VSVChpbmRleCA+PSAw
KTsKKworICAgIC8vIENvbXB1dGUgYSBjYXNlLWZvbGRlZCBjb3B5IG9mIHRoZSBwcmVmaXggc3Ry
aW5nIGJlZm9yZSBiZWdpbm5pbmcgdGhlIHNlYXJjaCBmb3IKKyAgICAvLyBhIG1hdGNoaW5nIGVs
ZW1lbnQuIFRoaXMgY29kZSB1c2VzIGZvbGRDYXNlIHRvIHdvcmsgYXJvdW5kIHRoZSBmYWN0IHRo
YXQKKyAgICAvLyBTdHJpbmc6OnN0YXJ0V2l0aCBkb2VzIG5vdCBmb2xkIG5vbi1BU0NJSSBjaGFy
YWN0ZXJzLiBUaGlzIGNvZGUgY2FuIGJlIGNoYW5nZWQKKyAgICAvLyB0byB1c2Ugc3RhcnRXaXRo
IG9uY2UgdGhhdCBpcyBmaXhlZC4KKyAgICBTdHJpbmcgcHJlZml4V2l0aENhc2VGb2xkZWQocHJl
Zml4LmZvbGRDYXNlKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyArK2ks
IGluZGV4ID0gKGluZGV4ICsgMSkgJSBpdGVtQ291bnQpIHsKKyAgICAgICAgT3B0aW9uRWxlbWVu
dCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpbmRleF0pOworICAgICAg
ICBpZiAoIW9wdGlvbkVsZW1lbnQgfHwgaXRlbXNbaW5kZXhdLT5kaXNhYmxlZCgpKQorICAgICAg
ICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gRm9sZCB0aGUgb3B0aW9uIHN0cmluZyBhbmQg
Y2hlY2sgaWYgaXRzIHByZWZpeCBpcyBlcXVhbCB0byB0aGUgZm9sZGVkIHByZWZpeC4KKyAgICAg
ICAgU3RyaW5nIHRleHQgPSBvcHRpb25FbGVtZW50LT50ZXh0SW5kZW50ZWRUb1Jlc3BlY3RHcm91
cExhYmVsKCk7CisgICAgICAgIGlmIChzdHJpcExlYWRpbmdXaGl0ZVNwYWNlKHRleHQpLmZvbGRD
YXNlKCkuc3RhcnRzV2l0aChwcmVmaXhXaXRoQ2FzZUZvbGRlZCkpIHsKKyAgICAgICAgICAgIHNl
dFNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCwgbGlzdFRvT3B0aW9uSW5kZXgoZGF0YSwgZWxl
bWVudCwgaW5kZXgpKTsKKyAgICAgICAgICAgIGlmICghZGF0YS51c2VzTWVudUxpc3QoKSkKKyAg
ICAgICAgICAgICAgICBsaXN0Qm94T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7CisKKyAgICAgICAg
ICAgIHNldE9wdGlvbnNDaGFuZ2VkT25SZW5kZXJlcihkYXRhLCBlbGVtZW50KTsKKyAgICAgICAg
ICAgIGVsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6aW5zZXJ0ZWRJ
bnRvVHJlZShTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKK3sKKyAg
ICAvLyBXaGVuIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQgZHVyaW5nIGRvY3VtZW50IHBhcnNpbmcs
IGl0IHdvbid0IGhhdmUgYW55CisgICAgLy8gaXRlbXMgeWV0IC0gYnV0IGZvciBpbm5lckhUTUwg
YW5kIHJlbGF0ZWQgbWV0aG9kcywgdGhpcyBtZXRob2QgaXMgY2FsbGVkCisgICAgLy8gYWZ0ZXIg
dGhlIHdob2xlIHN1YnRyZWUgaXMgY29uc3RydWN0ZWQuCisgICAgcmVjYWxjTGlzdEl0ZW1zKGRh
dGEsIGVsZW1lbnQsIHRydWUpOworfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjphY2Nlc3NL
ZXlTZXRTZWxlY3RlZEluZGV4KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVt
ZW50LCBpbnQgaW5kZXgpCit7ICAgIAorICAgIC8vIGZpcnN0IGJyaW5nIGludG8gZm9jdXMgdGhl
IGxpc3QgYm94CisgICAgaWYgKCFlbGVtZW50LT5mb2N1c2VkKCkpCisgICAgICAgIGVsZW1lbnQt
PmFjY2Vzc0tleUFjdGlvbihmYWxzZSk7CisgICAgCisgICAgLy8gaWYgdGhpcyBpbmRleCBpcyBh
bHJlYWR5IHNlbGVjdGVkLCB1bnNlbGVjdC4gb3RoZXJ3aXNlIHVwZGF0ZSB0aGUgc2VsZWN0ZWQg
aW5kZXgKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1z
KGVsZW1lbnQpOworICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChkYXRhLCBl
bGVtZW50LCBpbmRleCk7CisgICAgaWYgKE9wdGlvbkVsZW1lbnQqIG9wdGlvbkVsZW1lbnQgPSAo
bGlzdEluZGV4ID49IDAgPyB0b09wdGlvbkVsZW1lbnQoaXRlbXNbbGlzdEluZGV4XSkgOiAwKSkg
eworICAgICAgICBpZiAob3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSkKKyAgICAgICAgICAgIG9w
dGlvbkVsZW1lbnQtPnNldFNlbGVjdGVkU3RhdGUoZmFsc2UpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBzZXRTZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1lbnQsIGluZGV4LCBmYWxzZSwgdHJ1
ZSk7CisgICAgfQorCisgICAgaWYgKGRhdGEudXNlc01lbnVMaXN0KCkpCisgICAgICAgIG1lbnVM
aXN0T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7CisgICAgZWxzZQorICAgICAgICBsaXN0Qm94T25D
aGFuZ2UoZGF0YSwgZWxlbWVudCk7CisKKyAgICBzY3JvbGxUb1NlbGVjdGlvbihkYXRhLCBlbGVt
ZW50KTsKK30KKwordW5zaWduZWQgSFRNTFNlbGVjdEVsZW1lbnQ6Om9wdGlvbkNvdW50KGNvbnN0
IFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBFbGVtZW50KiBlbGVtZW50KQoreworICAg
IHVuc2lnbmVkIG9wdGlvbnMgPSAwOworCisgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRl
bXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGlzT3B0aW9uRWxlbWVudChpdGVt
c1tpXSkpCisgICAgICAgICAgICArK29wdGlvbnM7CisgICAgfQorCisgICAgcmV0dXJuIG9wdGlv
bnM7Cit9CisKK0hUTUxTZWxlY3RFbGVtZW50KiB0b1NlbGVjdEVsZW1lbnQoRWxlbWVudCogZWxl
bWVudCkKK3sKKyAgICBpZiAoZWxlbWVudC0+aXNIVE1MRWxlbWVudCgpICYmIGVsZW1lbnQtPmhh
c1RhZ05hbWUoSFRNTE5hbWVzOjpzZWxlY3RUYWcpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihlbGVtZW50KTsKKyAgICByZXR1cm4gMDsKK30KKwogfSAv
LyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFNlbGVjdEVs
ZW1lbnQuaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFNlbGVjdEVsZW1lbnQuaAppbmRleCA2
NDhlZjY0M2QyNDlkOTNlNzAxMGQ5Zjk5NWI1NjhlMzdlYmM1NzBmLi42YzMxNjE0ODhmOWU5NjA4
YTkzYTkyOGZlYTc0MTVlNjE4YThmNmJkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1s
L0hUTUxTZWxlY3RFbGVtZW50LmgKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MU2VsZWN0
RWxlbWVudC5oCkBAIC0zNiwyMSArMzYsMjEgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogY2xhc3Mg
SFRNTE9wdGlvbkVsZW1lbnQ7CiBjbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb247CiAKLWNsYXNz
IEhUTUxTZWxlY3RFbGVtZW50IDogcHVibGljIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3Rh
dGUsIHB1YmxpYyBTZWxlY3RFbGVtZW50IHsKK2NsYXNzIEhUTUxTZWxlY3RFbGVtZW50IDogcHVi
bGljIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUgewogcHVibGljOgogICAgIHN0YXRp
YyBQYXNzUmVmUHRyPEhUTUxTZWxlY3RFbGVtZW50PiBjcmVhdGUoY29uc3QgUXVhbGlmaWVkTmFt
ZSYsIERvY3VtZW50KiwgSFRNTEZvcm1FbGVtZW50Kik7CiAKLSAgICB2aXJ0dWFsIGludCBzZWxl
Y3RlZEluZGV4KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkSW5kZXgoaW50
IGluZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1ZSk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFNlbGVj
dGVkSW5kZXhCeVVzZXIoaW50IGluZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1ZSwgYm9vbCBmaXJl
T25DaGFuZ2VOb3cgPSBmYWxzZSwgYm9vbCBhbGxvd011bHRpcGxlU2VsZWN0aW9uID0gZmFsc2Up
OworICAgIGludCBzZWxlY3RlZEluZGV4KCkgY29uc3Q7CisgICAgdm9pZCBzZXRTZWxlY3RlZElu
ZGV4KGludCBpbmRleCwgYm9vbCBkZXNlbGVjdCA9IHRydWUpOworICAgIHZvaWQgc2V0U2VsZWN0
ZWRJbmRleEJ5VXNlcihpbnQgaW5kZXgsIGJvb2wgZGVzZWxlY3QgPSB0cnVlLCBib29sIGZpcmVP
bkNoYW5nZU5vdyA9IGZhbHNlLCBib29sIGFsbG93TXVsdGlwbGVTZWxlY3Rpb24gPSBmYWxzZSk7
CiAKICAgICAvLyBGb3IgVmFsaWRpdHlTdGF0ZQogICAgIGJvb2wgdmFsdWVNaXNzaW5nKCkgY29u
c3Q7CiAKICAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdDsKIAotICAgIHZpcnR1YWwgaW50IHNp
emUoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuc2l6ZSgpOyB9Ci0gICAgdmlydHVhbCBib29sIG11
bHRpcGxlKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm11bHRpcGxlKCk7IH0KKyAgICBpbnQgc2l6
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5zaXplKCk7IH0KKyAgICBib29sIG11bHRpcGxlKCkg
Y29uc3QgeyByZXR1cm4gbV9kYXRhLm11bHRpcGxlKCk7IH0KIAogICAgIHZvaWQgYWRkKEhUTUxF
bGVtZW50KiwgSFRNTEVsZW1lbnQqIGJlZm9yZUVsZW1lbnQsIEV4Y2VwdGlvbkNvZGUmKTsKICAg
ICB2b2lkIHJlbW92ZShpbnQgaW5kZXgpOwpAQCAtNjYsNyArNjYsNyBAQCBwdWJsaWM6CiAgICAg
dm9pZCBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKICAgICB2b2lkIHJlY2FsY0xpc3RJdGVtc0lmTmVl
ZGVkKCk7CiAKLSAgICB2aXJ0dWFsIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcygp
IGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0SXRlbXModGhpcyk7IH0KKyAgICBjb25zdCBWZWN0
b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdEl0ZW1z
KHRoaXMpOyB9CiAKICAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRv
QW55RWxlbWVudCk7CiAgICAgdm9pZCBhY2Nlc3NLZXlTZXRTZWxlY3RlZEluZGV4KGludCk7CkBA
IC04NywxMSArODcsMTkgQEAgcHVibGljOgogCiAgICAgdm9pZCBsaXN0Qm94U2VsZWN0SXRlbShp
bnQgbGlzdEluZGV4LCBib29sIGFsbG93TXVsdGlwbHlTZWxlY3Rpb25zLCBib29sIHNoaWZ0LCBi
b29sIGZpcmVPbkNoYW5nZU5vdyA9IHRydWUpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZVZh
bGlkaXR5KCkgeyBzZXROZWVkc1ZhbGlkaXR5Q2hlY2soKTsgfQorICAgIHZvaWQgdXBkYXRlVmFs
aWRpdHkoKSB7IHNldE5lZWRzVmFsaWRpdHlDaGVjaygpOyB9CiAKICAgICB2aXJ0dWFsIGJvb2wg
Y2FuU2VsZWN0QWxsKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHNlbGVjdEFsbCgpOwotCisg
ICAgaW50IGxpc3RUb09wdGlvbkluZGV4KGludCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZvaWQg
bGlzdEJveE9uQ2hhbmdlKCk7CisgICAgaW50IG9wdGlvblRvTGlzdEluZGV4KGludCBvcHRpb25J
bmRleCkgY29uc3Q7CisgICAgaW50IGFjdGl2ZVNlbGVjdGlvblN0YXJ0TGlzdEluZGV4KCkgY29u
c3Q7CisgICAgaW50IGFjdGl2ZVNlbGVjdGlvbkVuZExpc3RJbmRleCgpIGNvbnN0OworICAgIHZv
aWQgc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoaW50KTsKKyAgICB2b2lkIHNldEFjdGl2
ZVNlbGVjdGlvbkVuZEluZGV4KGludCk7CisgICAgdm9pZCB1cGRhdGVMaXN0Qm94U2VsZWN0aW9u
KGJvb2wgZGVzZWxlY3RPdGhlck9wdGlvbnMpOworICAgIAogcHJvdGVjdGVkOgogICAgIEhUTUxT
ZWxlY3RFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmLCBEb2N1bWVudCosIEhUTUxGb3JtRWxl
bWVudCopOwogCkBAIC0xMTYsMjEgKzEyNCwxMSBAQCBwcml2YXRlOgogICAgIHZpcnR1YWwgUmVu
ZGVyT2JqZWN0KiBjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSosIFJlbmRlclN0eWxlICopOwog
ICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsKIAot
ICAgIHZpcnR1YWwgaW50IG9wdGlvblRvTGlzdEluZGV4KGludCBvcHRpb25JbmRleCkgY29uc3Q7
Ci0gICAgdmlydHVhbCBpbnQgbGlzdFRvT3B0aW9uSW5kZXgoaW50IGxpc3RJbmRleCkgY29uc3Q7
Ci0KICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBkZWZhdWx0
RXZlbnRIYW5kbGVyKEV2ZW50Kik7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlU2VsZWN0
aW9uQW5jaG9ySW5kZXgoaW50IGluZGV4KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlU2Vs
ZWN0aW9uRW5kSW5kZXgoaW50IGluZGV4KTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGlzdEJv
eFNlbGVjdGlvbihib29sIGRlc2VsZWN0T3RoZXJPcHRpb25zKTsKLSAgICB2aXJ0dWFsIHZvaWQg
bGlzdEJveE9uQ2hhbmdlKCk7Ci0gICAgdmlydHVhbCB2b2lkIG1lbnVMaXN0T25DaGFuZ2UoKTsK
LSAgICAKLSAgICB2aXJ0dWFsIGludCBhY3RpdmVTZWxlY3Rpb25TdGFydExpc3RJbmRleCgpIGNv
bnN0OwotICAgIHZpcnR1YWwgaW50IGFjdGl2ZVNlbGVjdGlvbkVuZExpc3RJbmRleCgpIGNvbnN0
OworICAgIHZvaWQgbWVudUxpc3RPbkNoYW5nZSgpOwogICAgIAogICAgIHZvaWQgcmVjYWxjTGlz
dEl0ZW1zKGJvb2wgdXBkYXRlU2VsZWN0ZWRTdGF0ZXMgPSB0cnVlKSBjb25zdDsKIApAQCAtMTQ1
LDEwICsxNDMsNTAgQEAgcHJpdmF0ZToKIAogICAgIGJvb2wgaGFzUGxhY2Vob2xkZXJMYWJlbE9w
dGlvbigpIGNvbnN0OwogCisgICAgLy8gRklYTUU6IEZvbGQgc29tZSBvZiB0aGUgZm9sbG93aW5n
IGZ1bmN0aW9ucy4KKyAgICBzdGF0aWMgdm9pZCBzZWxlY3RBbGwoU2VsZWN0RWxlbWVudERhdGEm
LCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2F2ZUxhc3RTZWxlY3Rpb24oU2VsZWN0RWxl
bWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2V0QWN0aXZlU2VsZWN0aW9u
QW5jaG9ySW5kZXgoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgaW50IGluZGV4KTsKKyAg
ICBzdGF0aWMgdm9pZCBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChTZWxlY3RFbGVtZW50RGF0
YSYsIGludCBpbmRleCk7CisgICAgc3RhdGljIHZvaWQgdXBkYXRlTGlzdEJveFNlbGVjdGlvbihT
ZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBib29sIGRlc2VsZWN0T3RoZXJPcHRpb25zKTsK
KyAgICBzdGF0aWMgdm9pZCBsaXN0Qm94T25DaGFuZ2UoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVt
ZW50Kik7CisgICAgc3RhdGljIHZvaWQgbWVudUxpc3RPbkNoYW5nZShTZWxlY3RFbGVtZW50RGF0
YSYsIEVsZW1lbnQqKTsKKyAgICBzdGF0aWMgdm9pZCBzY3JvbGxUb1NlbGVjdGlvbihTZWxlY3RF
bGVtZW50RGF0YSYsIEVsZW1lbnQqKTsKKyAgICBzdGF0aWMgdm9pZCBzZXRSZWNhbGNMaXN0SXRl
bXMoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgcmVjYWxj
TGlzdEl0ZW1zKFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCosIGJvb2wgdXBkYXRl
U2VsZWN0ZWRTdGF0ZXMgPSB0cnVlKTsKKyAgICBzdGF0aWMgaW50IHNlbGVjdGVkSW5kZXgoY29u
c3QgU2VsZWN0RWxlbWVudERhdGEmLCBjb25zdCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQg
c2V0U2VsZWN0ZWRJbmRleChTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBpbnQgb3B0aW9u
SW5kZXgsIGJvb2wgZGVzZWxlY3QgPSB0cnVlLCBib29sIGZpcmVPbkNoYW5nZU5vdyA9IGZhbHNl
LCBib29sIHVzZXJEcml2ZW5DaGFuZ2UgPSB0cnVlKTsKKyAgICBzdGF0aWMgaW50IG9wdGlvblRv
TGlzdEluZGV4KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCosIGludCBv
cHRpb25JbmRleCk7CisgICAgc3RhdGljIGludCBsaXN0VG9PcHRpb25JbmRleChjb25zdCBTZWxl
Y3RFbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqLCBpbnQgbGlzdEluZGV4KTsKKyAgICBzdGF0
aWMgdm9pZCBkaXNwYXRjaEZvY3VzRXZlbnQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7
CisgICAgc3RhdGljIHZvaWQgZGlzcGF0Y2hCbHVyRXZlbnQoU2VsZWN0RWxlbWVudERhdGEmLCBF
bGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgZGVzZWxlY3RJdGVtcyhTZWxlY3RFbGVtZW50RGF0
YSYsIEVsZW1lbnQqLCBFbGVtZW50KiBleGNsdWRlRWxlbWVudCA9IDApOworICAgIHN0YXRpYyBi
b29sIHNhdmVGb3JtQ29udHJvbFN0YXRlKGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3Qg
RWxlbWVudCosIFN0cmluZyYgc3RhdGUpOworICAgIHN0YXRpYyB2b2lkIHJlc3RvcmVGb3JtQ29u
dHJvbFN0YXRlKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIGNvbnN0IFN0cmluZyYgc3Rh
dGUpOworICAgIHN0YXRpYyB2b2lkIHBhcnNlTXVsdGlwbGVBdHRyaWJ1dGUoU2VsZWN0RWxlbWVu
dERhdGEmLCBFbGVtZW50KiwgQXR0cmlidXRlKik7CisgICAgc3RhdGljIGJvb2wgYXBwZW5kRm9y
bURhdGEoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgRm9ybURhdGFMaXN0Jik7CisgICAg
c3RhdGljIHZvaWQgcmVzZXQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3Rh
dGljIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQq
LCBFdmVudCosIEhUTUxGb3JtRWxlbWVudCopOworICAgIHN0YXRpYyBpbnQgbGFzdFNlbGVjdGVk
TGlzdEluZGV4KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCopOworICAg
IHN0YXRpYyB2b2lkIHR5cGVBaGVhZEZpbmQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kiwg
S2V5Ym9hcmRFdmVudCopOworICAgIHN0YXRpYyB2b2lkIGluc2VydGVkSW50b1RyZWUoU2VsZWN0
RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgYWNjZXNzS2V5U2V0U2Vs
ZWN0ZWRJbmRleChTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBpbnQgaW5kZXgpOworICAg
IHN0YXRpYyB1bnNpZ25lZCBvcHRpb25Db3VudChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYsIGNv
bnN0IEVsZW1lbnQqKTsKKworICAgIHN0YXRpYyB2b2lkIHVwZGF0ZVNlbGVjdGVkU3RhdGUoU2Vs
ZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgaW50IGxpc3RJbmRleCwgYm9vbCBtdWx0aSwgYm9v
bCBzaGlmdCk7CisgCisgICAgc3RhdGljIHZvaWQgbWVudUxpc3REZWZhdWx0RXZlbnRIYW5kbGVy
KFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIEV2ZW50KiwgSFRNTEZvcm1FbGVtZW50Kik7
CisgICAgc3RhdGljIGJvb2wgcGxhdGZvcm1IYW5kbGVLZXlkb3duRXZlbnQoU2VsZWN0RWxlbWVu
dERhdGEmLCBFbGVtZW50KiwgS2V5Ym9hcmRFdmVudCopOworICAgIHN0YXRpYyB2b2lkIGxpc3RC
b3hEZWZhdWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIEV2ZW50
KiwgSFRNTEZvcm1FbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2V0T3B0aW9uc0NoYW5nZWRP
blJlbmRlcmVyKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCopOworICAgIGZyaWVuZCBjbGFz
cyBTZWxlY3RFbGVtZW50RGF0YTsKKwogICAgIFNlbGVjdEVsZW1lbnREYXRhIG1fZGF0YTsKICAg
ICBDb2xsZWN0aW9uQ2FjaGUgbV9jb2xsZWN0aW9uSW5mbzsKIH07CiAKK0hUTUxTZWxlY3RFbGVt
ZW50KiB0b1NlbGVjdEVsZW1lbnQoRWxlbWVudCopOworCiB9IC8vIG5hbWVzcGFjZQogCiAjZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0Qm94LmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0Qm94LmNwcAppbmRleCBlY2Ez
OTk2ODMzOTY5YjNlMzVmZDZjOTU5ZjliYzk2ODFmNzBhYmNmLi4wNzAyYWIwNDI2MmMyYjFlODJi
OWFlZWRiZTkzMjYxN2ZhZjVhOTk2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyTGlzdEJveC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckxpc3RCb3guY3BwCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCiAj
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5j
bHVkZSAiSFRNTFNlbGVjdEVsZW1lbnQuaCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAj
aW5jbHVkZSAiTm9kZVJlbmRlclN0eWxlLmgiCiAjaW5jbHVkZSAiT3B0aW9uR3JvdXBFbGVtZW50
LmgiCkBAIC01NSw3ICs1Niw2IEBACiAjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUg
IlNjcm9sbGJhci5oIgogI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lLmgiCi0jaW5jbHVkZSAiU2Vs
ZWN0RWxlbWVudC5oIgogI2luY2x1ZGUgIlNwYXRpYWxOYXZpZ2F0aW9uLmgiCiAjaW5jbHVkZSA8
bWF0aC5oPgogCkBAIC04NCw2ICs4NCw5IEBAIFJlbmRlckxpc3RCb3g6OlJlbmRlckxpc3RCb3go
RWxlbWVudCogZWxlbWVudCkKICAgICAsIG1fb3B0aW9uc1dpZHRoKDApCiAgICAgLCBtX2luZGV4
T2Zmc2V0KDApCiB7CisgICAgQVNTRVJUKGVsZW1lbnQpOworICAgIEFTU0VSVChlbGVtZW50LT5p
c0hUTUxFbGVtZW50KCkpOworICAgIEFTU0VSVChlbGVtZW50LT5oYXNUYWdOYW1lKEhUTUxOYW1l
czo6c2VsZWN0VGFnKSk7CiAgICAgaWYgKFBhZ2UqIHBhZ2UgPSBmcmFtZSgpLT5wYWdlKCkpIHsK
ICAgICAgICAgbV9wYWdlID0gcGFnZTsKICAgICAgICAgbV9wYWdlLT5hZGRTY3JvbGxhYmxlQXJl
YSh0aGlzKTsKQEAgLTE2Miw3ICsxNjUsNyBAQCB2b2lkIFJlbmRlckxpc3RCb3g6OmxheW91dCgp
CiAKIHZvaWQgUmVuZGVyTGlzdEJveDo6c2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKQogeyAgICAK
LSAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8
RWxlbWVudCo+KG5vZGUoKSkpOworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1Nl
bGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogCiAgICAgbV9zY3Jv
bGxUb1JldmVhbFNlbGVjdGlvbkFmdGVyTGF5b3V0ID0gZmFsc2U7CiAKQEAgLTMwOSw3ICszMTIs
NyBAQCB2b2lkIFJlbmRlckxpc3RCb3g6OmFkZEZvY3VzUmluZ1JlY3RzKFZlY3RvcjxMYXlvdXRS
ZWN0PiYgcmVjdHMsIGNvbnN0IExheW91dFBvaQogICAgIGlmICghaXNTcGF0aWFsTmF2aWdhdGlv
bkVuYWJsZWQoZnJhbWUoKSkpCiAgICAgICAgIHJldHVybiBSZW5kZXJCbG9jazo6YWRkRm9jdXNS
aW5nUmVjdHMocmVjdHMsIGFkZGl0aW9uYWxPZmZzZXQpOwogCi0gICAgU2VsZWN0RWxlbWVudCog
c2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsK
KyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19j
YXN0PEVsZW1lbnQqPihub2RlKCkpKTsKIAogICAgIC8vIEZvY3VzIHRoZSBsYXN0IHNlbGVjdGVk
IGl0ZW0uCiAgICAgaW50IHNlbGVjdGVkSXRlbSA9IHNlbGVjdC0+YWN0aXZlU2VsZWN0aW9uRW5k
TGlzdEluZGV4KCk7CkBAIC0zNjUsNyArMzY4LDcgQEAgdm9pZCBSZW5kZXJMaXN0Qm94OjpwYWlu
dEl0ZW1Gb3JlZ3JvdW5kKFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBMYXlvdXRQb2ludCYK
IHsKICAgICBGb250Q2FjaGVQdXJnZVByZXZlbnRlciBmb250Q2FjaGVQdXJnZVByZXZlbnRlcjsK
IAotICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2Fz
dDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRv
U2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CiAgICAgY29uc3Qg
VmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gc2VsZWN0LT5saXN0SXRlbXMoKTsKICAgICBF
bGVtZW50KiBlbGVtZW50ID0gbGlzdEl0ZW1zW2xpc3RJbmRleF07CiAgICAgT3B0aW9uRWxlbWVu
dCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChlbGVtZW50KTsKQEAgLTQxNiw3ICs0
MTksNyBAQCB2b2lkIFJlbmRlckxpc3RCb3g6OnBhaW50SXRlbUZvcmVncm91bmQoUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IExheW91dFBvaW50JgogCiB2b2lkIFJlbmRlckxpc3RCb3g6OnBh
aW50SXRlbUJhY2tncm91bmQoUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IExheW91dFBvaW50
JiBwYWludE9mZnNldCwgaW50IGxpc3RJbmRleCkKIHsKLSAgICBTZWxlY3RFbGVtZW50KiBzZWxl
Y3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOworICAg
IEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8
RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVt
cyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7CiAgICAgRWxlbWVudCogZWxlbWVudCA9IGxpc3RJdGVt
c1tsaXN0SW5kZXhdOwogICAgIE9wdGlvbkVsZW1lbnQqIG9wdGlvbkVsZW1lbnQgPSB0b09wdGlv
bkVsZW1lbnQoZWxlbWVudCk7CkBAIC01MTMsNyArNTE2LDcgQEAgdm9pZCBSZW5kZXJMaXN0Qm94
OjpwYW5TY3JvbGwoY29uc3QgSW50UG9pbnQmIHBhblN0YXJ0TW91c2VQb3NpdGlvbikKICAgICAg
ICAgcmV0dXJuOwogCiAgICAgbV9pbkF1dG9zY3JvbGwgPSB0cnVlOwotICAgIFNlbGVjdEVsZW1l
bnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgp
KSk7CisgICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0
aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CiAgICAgc2VsZWN0LT51cGRhdGVMaXN0Qm94U2Vs
ZWN0aW9uKCFzZWxlY3QtPm11bHRpcGxlKCkpOwogICAgIG1faW5BdXRvc2Nyb2xsID0gZmFsc2U7
CiB9CkBAIC01NDIsNyArNTQ1LDcgQEAgdm9pZCBSZW5kZXJMaXN0Qm94OjphdXRvc2Nyb2xsKCkK
IAogICAgIGludCBlbmRJbmRleCA9IHNjcm9sbFRvd2FyZChwb3MpOwogICAgIGlmIChlbmRJbmRl
eCA+PSAwKSB7Ci0gICAgICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVu
dChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAgICAgIEhUTUxTZWxlY3RFbGVt
ZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUo
KSkpOwogICAgICAgICBtX2luQXV0b3Njcm9sbCA9IHRydWU7CiAKICAgICAgICAgaWYgKCFzZWxl
Y3QtPm11bHRpcGxlKCkpCkBAIC01OTMsNyArNTk2LDcgQEAgYm9vbCBSZW5kZXJMaXN0Qm94Ojps
b2dpY2FsU2Nyb2xsKFNjcm9sbExvZ2ljYWxEaXJlY3Rpb24gZGlyZWN0aW9uLCBTY3JvbGxHcmFu
dWwKIHZvaWQgUmVuZGVyTGlzdEJveDo6dmFsdWVDaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCkK
IHsKICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSk7
Ci0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KGVsZW1lbnQpOwor
ICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoZWxlbWVudCk7
CiAgICAgc2VsZWN0LT5zZXRTZWxlY3RlZEluZGV4KHNlbGVjdC0+bGlzdFRvT3B0aW9uSW5kZXgo
bGlzdEluZGV4KSk7CiAgICAgZWxlbWVudC0+ZGlzcGF0Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50
KCk7CiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTWVudUxp
c3QuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck1lbnVMaXN0LmNwcAppbmRl
eCA4OTdhYTg4ZWFmMWVhMmE0NmVkMTM2ZjUwZjdjNjI2MjM5MTM5ZTAxLi5lNjY2YzllNmY3YmVh
ZmE4NWJkZDY0ODgwZWIzNzBlMzBmOTJhZWRhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyTWVudUxpc3QuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJNZW51TGlzdC5jcHAKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJGcmFtZS5o
IgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1
ZGUgIkhUTUxTZWxlY3RFbGVtZW50LmgiCiAjaW5jbHVkZSAiTm9kZVJlbmRlclN0eWxlLmgiCiAj
aW5jbHVkZSAiT3B0aW9uRWxlbWVudC5oIgogI2luY2x1ZGUgIk9wdGlvbkdyb3VwRWxlbWVudC5o
IgpAQCAtNDIsNyArNDMsNiBAQAogI2luY2x1ZGUgIlJlbmRlckJSLmgiCiAjaW5jbHVkZSAiUmVu
ZGVyU2Nyb2xsYmFyLmgiCiAjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKLSNpbmNsdWRlICJTZWxl
Y3RFbGVtZW50LmgiCiAjaW5jbHVkZSAiVGV4dFJ1bi5oIgogI2luY2x1ZGUgPG1hdGguaD4KIApA
QCAtNjEsNiArNjEsOSBAQCBSZW5kZXJNZW51TGlzdDo6UmVuZGVyTWVudUxpc3QoRWxlbWVudCog
ZWxlbWVudCkKICAgICAsIG1fbGFzdEFjdGl2ZUluZGV4KC0xKQogICAgICwgbV9wb3B1cElzVmlz
aWJsZShmYWxzZSkKIHsKKyAgICBBU1NFUlQoZWxlbWVudCk7CisgICAgQVNTRVJUKGVsZW1lbnQt
PmlzSFRNTEVsZW1lbnQoKSk7CisgICAgQVNTRVJUKGVsZW1lbnQtPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjpzZWxlY3RUYWcpKTsKIH0KIAogUmVuZGVyTWVudUxpc3Q6On5SZW5kZXJNZW51TGlzdCgp
CkBAIC0xOTAsNyArMTkzLDcgQEAgdm9pZCBSZW5kZXJNZW51TGlzdDo6dXBkYXRlRnJvbUVsZW1l
bnQoKQogCiB2b2lkIFJlbmRlck1lbnVMaXN0OjpzZXRUZXh0RnJvbU9wdGlvbihpbnQgb3B0aW9u
SW5kZXgpCiB7Ci0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0
YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2Vs
ZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKICAg
ICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBzZWxlY3QtPmxpc3RJdGVtcygp
OwogICAgIGludCBzaXplID0gbGlzdEl0ZW1zLnNpemUoKTsKIApAQCAtMjk2LDcgKzI5OSw3IEBA
IHZvaWQgUmVuZGVyTWVudUxpc3Q6OnNob3dQb3B1cCgpCiAgICAgY3JlYXRlSW5uZXJCbG9jaygp
OwogICAgIGlmICghbV9wb3B1cCkKICAgICAgICAgbV9wb3B1cCA9IGRvY3VtZW50KCktPnBhZ2Uo
KS0+Y2hyb21lKCktPmNyZWF0ZVBvcHVwTWVudSh0aGlzKTsKLSAgICBTZWxlY3RFbGVtZW50KiBz
ZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwor
ICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nh
c3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIG1fcG9wdXBJc1Zpc2libGUgPSB0cnVlOwogCiAg
ICAgLy8gQ29tcHV0ZSB0aGUgdG9wIGxlZnQgdGFraW5nIHRyYW5zZm9ybXMgaW50byBhY2NvdW50
LCBidXQgdXNlCkBAIC0zMjIsMjcgKzMyNSwyNyBAQCB2b2lkIFJlbmRlck1lbnVMaXN0Ojp2YWx1
ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVPbkNoYW5nZSkKICAgICBpZiAo
IWRvYyB8fCBkb2MgIT0gZG9jLT5mcmFtZSgpLT5kb2N1bWVudCgpKQogICAgICAgICByZXR1cm47
CiAgICAgCi0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRp
Y19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0
ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKICAgICBz
ZWxlY3QtPnNldFNlbGVjdGVkSW5kZXhCeVVzZXIoc2VsZWN0LT5saXN0VG9PcHRpb25JbmRleChs
aXN0SW5kZXgpLCB0cnVlLCBmaXJlT25DaGFuZ2UpOwogfQogCiAjaWYgRU5BQkxFKE5PX0xJU1RC
T1hfUkVOREVSSU5HKQogdm9pZCBSZW5kZXJNZW51TGlzdDo6bGlzdEJveFNlbGVjdEl0ZW0oaW50
IGxpc3RJbmRleCwgYm9vbCBhbGxvd011bHRpcGx5U2VsZWN0aW9ucywgYm9vbCBzaGlmdCwgYm9v
bCBmaXJlT25DaGFuZ2VOb3cpCiB7Ci0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxl
Y3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1MU2VsZWN0
RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihu
b2RlKCkpKTsKICAgICBzZWxlY3QtPmxpc3RCb3hTZWxlY3RJdGVtKGxpc3RJbmRleCwgYWxsb3dN
dWx0aXBseVNlbGVjdGlvbnMsIHNoaWZ0LCBmaXJlT25DaGFuZ2VOb3cpOwogfQogCiBib29sIFJl
bmRlck1lbnVMaXN0OjptdWx0aXBsZSgpCiB7Ci0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0g
dG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1M
U2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1l
bnQqPihub2RlKCkpKTsKICAgICByZXR1cm4gc2VsZWN0LT5tdWx0aXBsZSgpOwogfQogI2VuZGlm
CiAKIHZvaWQgUmVuZGVyTWVudUxpc3Q6OmRpZFNldFNlbGVjdGVkSW5kZXgoaW50IGxpc3RJbmRl
eCkKIHsKLSAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGlj
X2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3Qg
PSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIGRp
ZFVwZGF0ZUFjdGl2ZU9wdGlvbihzZWxlY3QtPmxpc3RUb09wdGlvbkluZGV4KGxpc3RJbmRleCkp
OwogfQogCkBAIC0zNTUsNyArMzU4LDcgQEAgdm9pZCBSZW5kZXJNZW51TGlzdDo6ZGlkVXBkYXRl
QWN0aXZlT3B0aW9uKGludCBvcHRpb25JbmRleCkKICAgICAgICAgcmV0dXJuOwogICAgIG1fbGFz
dEFjdGl2ZUluZGV4ID0gb3B0aW9uSW5kZXg7CiAKLSAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3Qg
PSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOworICAgIEhU
TUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxl
bWVudCo+KG5vZGUoKSkpOwogICAgIGludCBsaXN0SW5kZXggPSBzZWxlY3QtPm9wdGlvblRvTGlz
dEluZGV4KG9wdGlvbkluZGV4KTsKICAgICBpZiAobGlzdEluZGV4IDwgMCB8fCBsaXN0SW5kZXgg
Pj0gc3RhdGljX2Nhc3Q8aW50PihzZWxlY3QtPmxpc3RJdGVtcygpLnNpemUoKSkpCiAgICAgICAg
IHJldHVybjsKQEAgLTM2OCw3ICszNzEsNyBAQCB2b2lkIFJlbmRlck1lbnVMaXN0OjpkaWRVcGRh
dGVBY3RpdmVPcHRpb24oaW50IG9wdGlvbkluZGV4KQogCiBTdHJpbmcgUmVuZGVyTWVudUxpc3Q6
Oml0ZW1UZXh0KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKIHsKLSAgICBTZWxlY3RFbGVtZW50
KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkp
OworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGlj
X2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxp
c3RJdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7CiAgICAgaWYgKGxpc3RJbmRleCA+PSBsaXN0
SXRlbXMuc2l6ZSgpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CkBAIC0zOTMsNyArMzk2LDcg
QEAgU3RyaW5nIFJlbmRlck1lbnVMaXN0OjppdGVtSWNvbih1bnNpZ25lZCkgY29uc3QKIFN0cmlu
ZyBSZW5kZXJNZW51TGlzdDo6aXRlbUFjY2Vzc2liaWxpdHlUZXh0KHVuc2lnbmVkIGxpc3RJbmRl
eCkgY29uc3QKIHsKICAgICAvLyBBbGxvdyB0aGUgYWNjZXNzaWJsZSBuYW1lIGJlIGNoYW5nZWQg
aWYgbmVjZXNzYXJ5LgotICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVu
dChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAgSFRNTFNlbGVjdEVsZW1lbnQq
IHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7
CiAgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gc2VsZWN0LT5saXN0SXRl
bXMoKTsKICAgICBpZiAobGlzdEluZGV4ID49IGxpc3RJdGVtcy5zaXplKCkpCiAgICAgICAgIHJl
dHVybiBTdHJpbmcoKTsKQEAgLTQwMyw3ICs0MDYsNyBAQCBTdHJpbmcgUmVuZGVyTWVudUxpc3Q6
Oml0ZW1BY2Nlc3NpYmlsaXR5VGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0CiAgICAgCiBT
dHJpbmcgUmVuZGVyTWVudUxpc3Q6Oml0ZW1Ub29sVGlwKHVuc2lnbmVkIGxpc3RJbmRleCkgY29u
c3QKIHsKLSAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGlj
X2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3Qg
PSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIGNv
bnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7CiAg
ICAgaWYgKGxpc3RJbmRleCA+PSBsaXN0SXRlbXMuc2l6ZSgpKQogICAgICAgICByZXR1cm4gU3Ry
aW5nKCk7CkBAIC00MTMsNyArNDE2LDcgQEAgU3RyaW5nIFJlbmRlck1lbnVMaXN0OjppdGVtVG9v
bFRpcCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0CiAKIGJvb2wgUmVuZGVyTWVudUxpc3Q6Oml0
ZW1Jc0VuYWJsZWQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAogewotICAgIFNlbGVjdEVsZW1l
bnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgp
KSk7CisgICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0
aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CiAgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYg
bGlzdEl0ZW1zID0gc2VsZWN0LT5saXN0SXRlbXMoKTsKICAgICBpZiAobGlzdEluZGV4ID49IGxp
c3RJdGVtcy5zaXplKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTQzNCw3ICs0MzcsNyBA
QCBib29sIFJlbmRlck1lbnVMaXN0OjppdGVtSXNFbmFibGVkKHVuc2lnbmVkIGxpc3RJbmRleCkg
Y29uc3QKIAogUG9wdXBNZW51U3R5bGUgUmVuZGVyTWVudUxpc3Q6Oml0ZW1TdHlsZSh1bnNpZ25l
ZCBsaXN0SW5kZXgpIGNvbnN0CiB7Ci0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxl
Y3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1MU2VsZWN0
RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihu
b2RlKCkpKTsKICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBzZWxlY3Qt
Pmxpc3RJdGVtcygpOwogICAgIGlmIChsaXN0SW5kZXggPj0gbGlzdEl0ZW1zLnNpemUoKSkgewog
ICAgICAgICAvLyBJZiB3ZSBhcmUgbWFraW5nIGFuIG91dCBvZiBib3VuZHMgYWNjZXNzLCB0aGVu
IHdlIHdhbnQgdG8gdXNlIHRoZSBzdHlsZQpAQCAtNDU0LDcgKzQ1Nyw3IEBAIFBvcHVwTWVudVN0
eWxlIFJlbmRlck1lbnVMaXN0OjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAog
CiBDb2xvciBSZW5kZXJNZW51TGlzdDo6aXRlbUJhY2tncm91bmRDb2xvcih1bnNpZ25lZCBsaXN0
SW5kZXgpIGNvbnN0CiB7Ci0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVt
ZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVu
dCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkp
KTsKICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBzZWxlY3QtPmxpc3RJ
dGVtcygpOwogICAgIGlmIChsaXN0SW5kZXggPj0gbGlzdEl0ZW1zLnNpemUoKSkKICAgICAgICAg
cmV0dXJuIHN0eWxlKCktPnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eUJhY2tncm91
bmRDb2xvcik7CkBAIC01MzEsMTMgKzUzNCwxMyBAQCBpbnQgUmVuZGVyTWVudUxpc3Q6OmNsaWVu
dFBhZGRpbmdSaWdodCgpIGNvbnN0CiAKIGludCBSZW5kZXJNZW51TGlzdDo6bGlzdFNpemUoKSBj
b25zdAogewotICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0
aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVj
dCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CiAgICAg
cmV0dXJuIHNlbGVjdC0+bGlzdEl0ZW1zKCkuc2l6ZSgpOwogfQogCiBpbnQgUmVuZGVyTWVudUxp
c3Q6OnNlbGVjdGVkSW5kZXgoKSBjb25zdAogewotICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9
IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAgSFRN
TFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVt
ZW50Kj4obm9kZSgpKSk7CiAgICAgcmV0dXJuIHNlbGVjdC0+b3B0aW9uVG9MaXN0SW5kZXgoc2Vs
ZWN0LT5zZWxlY3RlZEluZGV4KCkpOwogfQogCkBAIC01NDgsNyArNTUxLDcgQEAgdm9pZCBSZW5k
ZXJNZW51TGlzdDo6cG9wdXBEaWRIaWRlKCkKIAogYm9vbCBSZW5kZXJNZW51TGlzdDo6aXRlbUlz
U2VwYXJhdG9yKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKIHsKLSAgICBTZWxlY3RFbGVtZW50
KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkp
OworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGlj
X2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxp
c3RJdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7CiAgICAgaWYgKGxpc3RJbmRleCA+PSBsaXN0
SXRlbXMuc2l6ZSgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC01NTgsNyArNTYxLDcgQEAg
Ym9vbCBSZW5kZXJNZW51TGlzdDo6aXRlbUlzU2VwYXJhdG9yKHVuc2lnbmVkIGxpc3RJbmRleCkg
Y29uc3QKIAogYm9vbCBSZW5kZXJNZW51TGlzdDo6aXRlbUlzTGFiZWwodW5zaWduZWQgbGlzdElu
ZGV4KSBjb25zdAogewotICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVu
dChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAgSFRNTFNlbGVjdEVsZW1lbnQq
IHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7
CiAgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gc2VsZWN0LT5saXN0SXRl
bXMoKTsKICAgICBpZiAobGlzdEluZGV4ID49IGxpc3RJdGVtcy5zaXplKCkpCiAgICAgICAgIHJl
dHVybiBmYWxzZTsKQEAgLTU2OCw3ICs1NzEsNyBAQCBib29sIFJlbmRlck1lbnVMaXN0OjppdGVt
SXNMYWJlbCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0CiAKIGJvb2wgUmVuZGVyTWVudUxpc3Q6
Oml0ZW1Jc1NlbGVjdGVkKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKIHsKLSAgICBTZWxlY3RF
bGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5v
ZGUoKSkpOworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQo
c3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50
Kj4mIGxpc3RJdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7CiAgICAgaWYgKGxpc3RJbmRleCA+
PSBsaXN0SXRlbXMuc2l6ZSgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC01ODAsNyArNTgz
LDcgQEAgYm9vbCBSZW5kZXJNZW51TGlzdDo6aXRlbUlzU2VsZWN0ZWQodW5zaWduZWQgbGlzdElu
ZGV4KSBjb25zdAogCiB2b2lkIFJlbmRlck1lbnVMaXN0OjpzZXRUZXh0RnJvbUl0ZW0odW5zaWdu
ZWQgbGlzdEluZGV4KQogewotICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxl
bWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAgSFRNTFNlbGVjdEVsZW1l
bnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgp
KSk7CiAgICAgc2V0VGV4dEZyb21PcHRpb24oc2VsZWN0LT5saXN0VG9PcHRpb25JbmRleChsaXN0
SW5kZXgpKTsKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>110083</attachid>
            <date>2011-10-06 20:20:29 -0700</date>
            <delta_ts>2011-10-06 22:53:16 -0700</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-69518-20111007122027.patch</filename>
            <type>text/plain</type>
            <size>140089</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk2ODk3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIzIEBACisyMDExLTEwLTA2ICBLZW50IFRh
bXVyYSAgPHRrZW50QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZW1vdmUgU2VsZWN0RWxlbWVu
dCBjbGFzcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
Njk1MTgKKworICAgICAgICBSZXZpZXdlZCBieSBSeW9zdWtlIE5pd2EuCisKKyAgICAgICAgU2Vs
ZWN0RWxlbWVudCB1c2VkIHRvIGJlIGFuIGFic3RyYWN0IGNsYXNzIGZvciBIVE1MU2VsZWN0RWxl
bWVudAorICAgICAgICBhbmQgV01MU2VsZWN0RWxlbWVudC4gU2VsZWN0RWxlbWVudCBpcyBub3Qg
bmVlZGVkIGFueW1vcmUgYmVjYXVzZQorICAgICAgICBXTUwgd2FzIHJlbW92ZWQuCisKKyAgICAg
ICAgVGhpcyBwYXRjaCBqdXN0IHJlbW92ZXMgU2VsZWN0RWxlbWVudCBieSBtb3ZpbmcgU2VsZWN0
RWxlbWVudAorICAgICAgICBmdW5jdGlvbnMgdG8gSFRNTFNlbGVjdEVsZW1lbnQuCisKKyAgICAg
ICAgTm8gbmV3IHRlc3RzLiBKdXN0IGEgcmVmYWN0b3JpbmcuCisKKyAgICAgICAgKiBXZWJDb3Jl
LnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgUmVuYW1lIGRvbVxTZWxlY3RFbGVtZW50
V2luLmNwcCB0byBodG1sXEhUTUxTZWxlY3RFbGVtZW50V2luLmNwcC4KKyAgICAgICAgKiBhY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlMaXN0Qm94T3B0aW9uLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OkFjY2Vzc2liaWxpdHlMaXN0Qm94T3B0aW9uOjpzZXRTZWxlY3RlZCk6CisgICAgICAgIFJl
bW92ZSB1bm5lY2Vzc2FyeSBjYXN0LgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eVJlbmRlck9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVu
ZGVyT2JqZWN0OjpzdHJpbmdWYWx1ZSk6CisgICAgICAgIFVzZSBIVE1MU2VsZWN0RWxlbWVudCBp
bnN0ZWFkIG9mIFNlbGVjdEVsZW1lbnQuCisgICAgICAgICogYWNjZXNzaWJpbGl0eS9ndGsvQWNj
ZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwOgorICAgICAgICAob3B0aW9uRnJvbVNlbGVj
dGlvbik6IGRpdHRvLgorICAgICAgICAod2Via2l0X2FjY2Vzc2libGVfc2VsZWN0aW9uX2dldF9z
ZWxlY3Rpb25fY291bnQpOiBkaXR0by4KKyAgICAgICAgKiBkb20vT3B0aW9uRWxlbWVudC5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpPcHRpb25FbGVtZW50OjpvcHRpb25JbmRleCk6IGRpdHRvLgor
ICAgICAgICAqIGRvbS9PcHRpb25FbGVtZW50Lmg6IGRpdHRvLgorICAgICAgICAqIGRvbS9TZWxl
Y3RFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNlbGVjdEVsZW1lbnREYXRhOjpjaGVj
a0xpc3RJdGVtcyk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0RWxlbWVudERhdGE6
Omxpc3RJdGVtcyk6IGRpdHRvLgorICAgICAgICAqIGRvbS9TZWxlY3RFbGVtZW50V2luLmNwcDog
UmVtb3ZlZC4KKyAgICAgICAgKiBkb20vU2VsZWN0RWxlbWVudC5oOiBSZW1vdmVkIFNlbGVjdEVs
ZW1lbnQgY2xhc3MgZGVjbGFyYXRpb24uCisgICAgICAgICogaHRtbC9IVE1MU2VsZWN0RWxlbWVu
dC5jcHA6IE1vdmUgZnVuY3Rpb25zIGZyb20gU2VsZWN0RWxlbWVudC5jcHAuCisgICAgICAgIChX
ZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6c2VsZWN0ZWRJbmRleCk6CisgICAgICAgIFJlbW92
ZWQgJ1NlbGVjdEVsZW1lbnQ6OicgYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgbW92ZWQgdG8gSFRN
TFNlbGVjdEVsZW1lbnQuCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6ZGVz
ZWxlY3RJdGVtcyk6IGRpdG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6
c2V0U2VsZWN0ZWRJbmRleCk6IGRpdG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxl
bWVudDo6c2V0U2VsZWN0ZWRJbmRleEJ5VXNlcik6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
SFRNTFNlbGVjdEVsZW1lbnQ6OmFjdGl2ZVNlbGVjdGlvbkVuZExpc3RJbmRleCk6IGRpdHRvLgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6Omxlbmd0aCk6IGRpdHRvLgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNhdmVGb3JtQ29udHJvbFN0YXRlKTog
ZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6cmVzdG9yZUZvcm1D
b250cm9sU3RhdGUpOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50
OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZSk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNl
bGVjdEVsZW1lbnQ6OnNlbGVjdEFsbCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNl
bGVjdEVsZW1lbnQ6OmFwcGVuZEZvcm1EYXRhKTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpI
VE1MU2VsZWN0RWxlbWVudDo6b3B0aW9uVG9MaXN0SW5kZXgpOiBkaXR0by4KKyAgICAgICAgKFdl
YkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpsaXN0VG9PcHRpb25JbmRleCk6IGRpdHRvLgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtcyk6IGRpdHRv
LgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNldFJlY2FsY0xpc3RJdGVt
cyk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnJlc2V0KTog
ZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6ZGlzcGF0Y2hGb2N1
c0V2ZW50KTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6ZGlz
cGF0Y2hCbHVyRXZlbnQpOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVt
ZW50OjpkZWZhdWx0RXZlbnRIYW5kbGVyKTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1M
U2VsZWN0RWxlbWVudDo6c2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgpOiBkaXR0by4KKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpzZXRBY3RpdmVTZWxlY3Rpb25FbmRJ
bmRleCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnVwZGF0
ZUxpc3RCb3hTZWxlY3Rpb24pOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RF
bGVtZW50OjptZW51TGlzdE9uQ2hhbmdlKTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1M
U2VsZWN0RWxlbWVudDo6bGlzdEJveE9uQ2hhbmdlKTogZGl0dG8uCisgICAgICAgIChXZWJDb3Jl
OjpIVE1MU2VsZWN0RWxlbWVudDo6c2F2ZUxhc3RTZWxlY3Rpb24pOiBkaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjphY2Nlc3NLZXlTZXRTZWxlY3RlZEluZGV4KTog
ZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6c2Nyb2xsVG9TZWxl
Y3Rpb24pOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjppbnNl
cnRlZEludG9UcmVlKTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpuZXh0VmFsaWRJbmRleCk6
IE1vdmVkIGZyb20gU2VsZWN0RWxlbWVudC5jcHAuCisgICAgICAgIChXZWJDb3JlOjpuZXh0U2Vs
ZWN0YWJsZUxpc3RJbmRleCk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6cHJldmlvdXNTZWxl
Y3RhYmxlTGlzdEluZGV4KTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpmaXJzdFNlbGVjdGFi
bGVMaXN0SW5kZXgpOiBkaXR0by4KKyAgICAgICAgKFdlYkNvcmU6Omxhc3RTZWxlY3RhYmxlTGlz
dEluZGV4KTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpuZXh0U2VsZWN0YWJsZUxpc3RJbmRl
eFBhZ2VBd2F5KTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6
c2V0T3B0aW9uc0NoYW5nZWRPblJlbmRlcmVyKTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpI
VE1MU2VsZWN0RWxlbWVudDo6cGFyc2VNdWx0aXBsZUF0dHJpYnV0ZSk6IGRpdHRvLgorICAgICAg
ICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnBsYXRmb3JtSGFuZGxlS2V5ZG93bkV2ZW50
KTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6bWVudUxpc3RE
ZWZhdWx0RXZlbnRIYW5kbGVyKTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0
RWxlbWVudDo6dXBkYXRlU2VsZWN0ZWRTdGF0ZSk6IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
SFRNTFNlbGVjdEVsZW1lbnQ6Omxpc3RCb3hEZWZhdWx0RXZlbnRIYW5kbGVyKTogZGl0dG8uCisg
ICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6bGFzdFNlbGVjdGVkTGlzdEluZGV4
KTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpzdHJpcExlYWRpbmdXaGl0ZVNwYWNlKTogZGl0
dG8uCisgICAgICAgIChXZWJDb3JlOjpIVE1MU2VsZWN0RWxlbWVudDo6dHlwZUFoZWFkRmluZCk6
IGRpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6Om9wdGlvbkNvdW50
KTogZGl0dG8uCisgICAgICAgIChXZWJDb3JlOjp0b1NlbGVjdEVsZW1lbnQpOiBkaXR0by4KKyAg
ICAgICAgKiBodG1sL0hUTUxTZWxlY3RFbGVtZW50V2luLmNwcDogQ29waWVkIGZyb20gU291cmNl
L1dlYkNvcmUvZG9tL1NlbGVjdEVsZW1lbnRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6SFRN
TFNlbGVjdEVsZW1lbnQ6OnBsYXRmb3JtSGFuZGxlS2V5ZG93bkV2ZW50KToKKyAgICAgICAgKiBo
dG1sL0hUTUxTZWxlY3RFbGVtZW50Lmg6IFJlbW92ZWQgJ3ZpcnR1YWwnIG9mIFNlbGVjdEVsZW1l
bnQgZnVuY3Rpb25zLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnNpemUp
OgorICAgICAgICAoV2ViQ29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6Om11bHRpcGxlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkhUTUxTZWxlY3RFbGVtZW50OjpsaXN0SXRlbXMpOgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTFNlbGVjdEVsZW1lbnQ6OnVwZGF0ZVZhbGlkaXR5KToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyTGlzdEJveC5jcHA6IFJlcGxhY2UgU2VsZWN0RWxlbWVudCB3aXRoIEhUTUxT
ZWxlY3RFbGVtZW50CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJMaXN0Qm94OjpSZW5kZXJMaXN0
Qm94KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxpc3RCb3g6OnNjcm9sbFRvUmV2ZWFsU2Vs
ZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxpc3RCb3g6OmFkZEZvY3VzUmluZ1Jl
Y3RzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxpc3RCb3g6OnBhaW50SXRlbUZvcmVncm91
bmQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6cGFpbnRJdGVtQmFja2dyb3Vu
ZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJMaXN0Qm94OjpwYW5TY3JvbGwpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6YXV0b3Njcm9sbCk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJMaXN0Qm94Ojp2YWx1ZUNoYW5nZWQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5k
ZXJNZW51TGlzdC5jcHA6IFJlcGxhY2UgU2VsZWN0RWxlbWVudCB3aXRoIEhUTUxTZWxlY3RFbGVt
ZW50CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNZW51TGlzdDo6UmVuZGVyTWVudUxpc3QpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWVudUxpc3Q6OnNldFRleHRGcm9tT3B0aW9uKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0OjpzaG93UG9wdXApOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyTWVudUxpc3Q6OnZhbHVlQ2hhbmdlZCk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJNZW51TGlzdDo6bGlzdEJveFNlbGVjdEl0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyTWVudUxpc3Q6Om11bHRpcGxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0
OjpkaWRTZXRTZWxlY3RlZEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0
OjpkaWRVcGRhdGVBY3RpdmVPcHRpb24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWVudUxp
c3Q6Oml0ZW1UZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0OjppdGVtQWNj
ZXNzaWJpbGl0eVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWVudUxpc3Q6Oml0ZW1U
b29sVGlwKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0OjppdGVtSXNFbmFibGVk
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0OjppdGVtU3R5bGUpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyTWVudUxpc3Q6Oml0ZW1CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyTWVudUxpc3Q6Omxpc3RTaXplKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlck1lbnVMaXN0OjpzZWxlY3RlZEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ck1lbnVMaXN0OjppdGVtSXNTZXBhcmF0b3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTWVu
dUxpc3Q6Oml0ZW1Jc0xhYmVsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlck1lbnVMaXN0Ojpp
dGVtSXNTZWxlY3RlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJNZW51TGlzdDo6c2V0VGV4
dEZyb21JdGVtKToKKwogMjAxMS0xMC0wNiAgQW50b2luZSBMYWJvdXIgIDxwaW1hbkBjaHJvbWl1
bS5vcmc+CiAKICAgICAgICAgV2Via2l0IEFQSSBmb3IgY29tcG9zaXRvcgpJbmRleDogU291cmNl
L1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDk2ODg3
KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtp
bmcgY29weSkKQEAgLTQ4Njk0LDEwICs0ODY5NCw2IEBACiAJCQkJPgogCQkJPC9GaWxlPgogCQkJ
PEZpbGUKLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGRvbVxTZWxlY3RFbGVtZW50V2luLmNwcCIKLQkJ
CQk+Ci0JCQk8L0ZpbGU+Ci0JCQk8RmlsZQogCQkJCVJlbGF0aXZlUGF0aD0iLi5cZG9tXFNlbGVj
dG9yUXVlcnkuY3BwIgogCQkJCT4KIAkJCQk8RmlsZUNvbmZpZ3VyYXRpb24KQEAgLTU3MjAyLDYg
KzU3MTk4LDEwIEBACiAJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KIAkJCTwvRmlsZT4KIAkJCTxG
aWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxodG1sXEhUTUxTZWxlY3RFbGVtZW50V2luLmNwcCIK
KwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQogCQkJCVJlbGF0aXZlUGF0aD0iLi5caHRtbFxI
VE1MU2VsZWN0RWxlbWVudC5oIgogCQkJCT4KIAkJCTwvRmlsZT4KSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUxpc3RCb3hPcHRpb24uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUxpc3RCb3hP
cHRpb24uY3BwCShyZXZpc2lvbiA5Njg4NykKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxp
dHkvQWNjZXNzaWJpbGl0eUxpc3RCb3hPcHRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xODAs
NyArMTgwLDcgQEAgdm9pZCBBY2Nlc3NpYmlsaXR5TGlzdEJveE9wdGlvbjo6c2V0U2VsZQogICAg
ICAgICByZXR1cm47CiAgICAgCiAgICAgLy8gQ29udmVydCBmcm9tIHRoZSBlbnRpcmUgbGlzdCBp
bmRleCB0byB0aGUgb3B0aW9uIGluZGV4LgotICAgIGludCBvcHRpb25JbmRleCA9IHN0YXRpY19j
YXN0PFNlbGVjdEVsZW1lbnQqPihzZWxlY3RFbGVtZW50KS0+bGlzdFRvT3B0aW9uSW5kZXgobGlz
dEJveE9wdGlvbkluZGV4KCkpOworICAgIGludCBvcHRpb25JbmRleCA9IHNlbGVjdEVsZW1lbnQt
Pmxpc3RUb09wdGlvbkluZGV4KGxpc3RCb3hPcHRpb25JbmRleCgpKTsKICAgICBzZWxlY3RFbGVt
ZW50LT5hY2Nlc3NLZXlTZXRTZWxlY3RlZEluZGV4KG9wdGlvbkluZGV4KTsKIH0KIApJbmRleDog
U291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxp
dHlSZW5kZXJPYmplY3QuY3BwCShyZXZpc2lvbiA5Njg4NykKKysrIFNvdXJjZS9XZWJDb3JlL2Fj
Y2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTc0LDcgKzc0LDYgQEAKICNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSAiUmVu
ZGVyV2lkZ2V0LmgiCiAjaW5jbHVkZSAiUmVuZGVyZWRQb3NpdGlvbi5oIgotI2luY2x1ZGUgIlNl
bGVjdEVsZW1lbnQuaCIKICNpbmNsdWRlICJUZXh0LmgiCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9y
LmgiCiAjaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKQEAgLTExNDcsMTkgKzExNDYsMjEgQEAgU3Ry
aW5nIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnN0cmluZwogICAgIGlmIChjc3NCb3ggJiYg
Y3NzQm94LT5pc01lbnVMaXN0KCkpIHsKICAgICAgICAgLy8gUmVuZGVyTWVudUxpc3Qgd2lsbCBn
byBzdHJhaWdodCB0byB0aGUgdGV4dCgpIG9mIGl0cyBzZWxlY3RlZCBpdGVtLgogICAgICAgICAv
LyBUaGlzIGhhcyB0byBiZSBvdmVycmlkZW4gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHNlbGVjdGVk
IGl0ZW0gaGFzIGFuIGFyaWEgbGFiZWwKLSAgICAgICAgU2VsZWN0RWxlbWVudCogc2VsZWN0Tm9k
ZSA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9yZW5kZXJlci0+bm9k
ZSgpKSk7Ci0gICAgICAgIGludCBzZWxlY3RlZEluZGV4ID0gc2VsZWN0Tm9kZS0+c2VsZWN0ZWRJ
bmRleCgpOwotICAgICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+IGxpc3RJdGVtcyA9IHNlbGVj
dE5vZGUtPmxpc3RJdGVtcygpOwotICAgICAgICAKLSAgICAgICAgRWxlbWVudCogc2VsZWN0ZWRP
cHRpb24gPSAwOwotICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSAwICYmIHNlbGVjdGVkSW5k
ZXggPCAoaW50KWxpc3RJdGVtcy5zaXplKCkpIAotICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24g
PSBsaXN0SXRlbXNbc2VsZWN0ZWRJbmRleF07Ci0gICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikg
ewotICAgICAgICAgICAgU3RyaW5nIG92ZXJyaWRlbkRlc2NyaXB0aW9uID0gc2VsZWN0ZWRPcHRp
b24tPmdldEF0dHJpYnV0ZShhcmlhX2xhYmVsQXR0cik7Ci0gICAgICAgICAgICBpZiAoIW92ZXJy
aWRlbkRlc2NyaXB0aW9uLmlzTnVsbCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBvdmVycmlk
ZW5EZXNjcmlwdGlvbjsKKyAgICAgICAgTm9kZSogbm9kZSA9IG1fcmVuZGVyZXItPm5vZGUoKTsK
KyAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS0+aXNIVE1MRWxlbWVudCgpICYmIG5vZGUtPmhhc1Rh
Z05hbWUoc2VsZWN0VGFnKSkgeworICAgICAgICAgICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVj
dE5vZGUgPSBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUpOworICAgICAgICAg
ICAgaW50IHNlbGVjdGVkSW5kZXggPSBzZWxlY3ROb2RlLT5zZWxlY3RlZEluZGV4KCk7CisgICAg
ICAgICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+IGxpc3RJdGVtcyA9IHNlbGVjdE5vZGUtPmxp
c3RJdGVtcygpOworICAgICAgICAKKyAgICAgICAgICAgIEVsZW1lbnQqIHNlbGVjdGVkT3B0aW9u
ID0gMDsKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID49IDAgJiYgc2VsZWN0ZWRJbmRl
eCA8IChpbnQpbGlzdEl0ZW1zLnNpemUoKSkgCisgICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRp
b24gPSBsaXN0SXRlbXNbc2VsZWN0ZWRJbmRleF07CisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRP
cHRpb24pIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgb3ZlcnJpZGVuRGVzY3JpcHRpb24gPSBz
ZWxlY3RlZE9wdGlvbi0+Z2V0QXR0cmlidXRlKGFyaWFfbGFiZWxBdHRyKTsKKyAgICAgICAgICAg
ICAgICBpZiAoIW92ZXJyaWRlbkRlc2NyaXB0aW9uLmlzTnVsbCgpKQorICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gb3ZlcnJpZGVuRGVzY3JpcHRpb247CisgICAgICAgICAgICB9CiAgICAgICAg
IH0KLSAgICAgICAgCiAgICAgICAgIHJldHVybiB0b1JlbmRlck1lbnVMaXN0KG1fcmVuZGVyZXIp
LT50ZXh0KCk7CiAgICAgfQogICAgIApJbmRleDogU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0
eS9ndGsvQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJBdGsuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvZ3RrL0FjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVy
QXRrLmNwcAkocmV2aXNpb24gOTY4ODcpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5
L2d0ay9BY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckF0ay5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlICJHT3duUHRyLmgiCiAjaW5jbHVkZSAiSG9zdFdpbmRv
dy5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxTZWxlY3RFbGVtZW50
LmgiCiAjaW5jbHVkZSAiSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1M
VGFibGVFbGVtZW50LmgiCiAjaW5jbHVkZSAiSW5saW5lVGV4dEJveC5oIgpAQCAtNTgsNyArNTks
NiBAQAogI2luY2x1ZGUgIlJlbmRlckxpc3RJdGVtLmgiCiAjaW5jbHVkZSAiUmVuZGVyTGlzdE1h
cmtlci5oIgogI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKLSNpbmNsdWRlICJTZWxlY3RFbGVtZW50
LmgiCiAjaW5jbHVkZSAiU2V0dGluZ3MuaCIKICNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKICNp
bmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKQEAgLTk2Miw3ICs5NjIsNyBAQCBzdGF0aWMgQWNjZXNz
aWJpbGl0eU9iamVjdCogb3B0aW9uRnJvbVNlCiAgICAgICAgIGlmICghcmVuZGVyZXIpCiAgICAg
ICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3ROb2RlID0g
dG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihyZW5kZXJlci0+bm9kZSgpKSk7
CisgICAgICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3ROb2RlID0gdG9TZWxlY3RFbGVtZW50
KHN0YXRpY19jYXN0PEVsZW1lbnQqPihyZW5kZXJlci0+bm9kZSgpKSk7CiAgICAgICAgIGludCBz
ZWxlY3RlZEluZGV4ID0gc2VsZWN0Tm9kZS0+c2VsZWN0ZWRJbmRleCgpOwogICAgICAgICBjb25z
dCBWZWN0b3I8RWxlbWVudCo+IGxpc3RJdGVtcyA9IHNlbGVjdE5vZGUtPmxpc3RJdGVtcygpOwog
CkBAIC0xMDM5LDcgKzEwMzksNyBAQCBzdGF0aWMgZ2ludCB3ZWJraXRfYWNjZXNzaWJsZV9zZWxl
Y3Rpb25fCiAgICAgICAgIGlmICghcmVuZGVyZXIpCiAgICAgICAgICAgICByZXR1cm4gMDsKIAot
ICAgICAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3ROb2RlID0gdG9TZWxlY3RFbGVtZW50KHN0YXRp
Y19jYXN0PEVsZW1lbnQqPihyZW5kZXJlci0+bm9kZSgpKSk7CisgICAgICAgIEhUTUxTZWxlY3RF
bGVtZW50KiBzZWxlY3ROb2RlID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQq
PihyZW5kZXJlci0+bm9kZSgpKSk7CiAgICAgICAgIGludCBzZWxlY3RlZEluZGV4ID0gc2VsZWN0
Tm9kZS0+c2VsZWN0ZWRJbmRleCgpOwogICAgICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+IGxp
c3RJdGVtcyA9IHNlbGVjdE5vZGUtPmxpc3RJdGVtcygpOwogCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9kb20vT3B0aW9uRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9t
L09wdGlvbkVsZW1lbnQuY3BwCShyZXZpc2lvbiA5Njg4NykKKysrIFNvdXJjZS9XZWJDb3JlL2Rv
bS9PcHRpb25FbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYsNiArMjYsNyBAQAogI2lu
Y2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50LmgiCiAjaW5j
bHVkZSAiSFRNTFBhcnNlcklkaW9tcy5oIgorI2luY2x1ZGUgIkhUTUxTZWxlY3RFbGVtZW50Lmgi
CiAjaW5jbHVkZSAiT3B0aW9uR3JvdXBFbGVtZW50LmgiCiAjaW5jbHVkZSAiU2NyaXB0RWxlbWVu
dC5oIgogI2luY2x1ZGUgIlNlbGVjdEVsZW1lbnQuaCIKQEAgLTQyLDcgKzQzLDcgQEAgdm9pZCBP
cHRpb25FbGVtZW50OjpzZXRTZWxlY3RlZFN0YXRlKE9wdAogICAgIGVsZW1lbnQtPnNldE5lZWRz
U3R5bGVSZWNhbGMoKTsKIH0KIAotaW50IE9wdGlvbkVsZW1lbnQ6Om9wdGlvbkluZGV4KFNlbGVj
dEVsZW1lbnQqIHNlbGVjdEVsZW1lbnQsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCitpbnQgT3B0
aW9uRWxlbWVudDo6b3B0aW9uSW5kZXgoSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdEVsZW1lbnQs
IGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCiB7CiAgICAgaWYgKCFzZWxlY3RFbGVtZW50KQogICAg
ICAgICByZXR1cm4gMDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9PcHRpb25FbGVtZW50LmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL09wdGlvbkVsZW1lbnQuaAkocmV2aXNp
b24gOTY4ODcpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vT3B0aW9uRWxlbWVudC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0yNyw4ICsyNyw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgRWxl
bWVudDsKIGNsYXNzIERvY3VtZW50OworY2xhc3MgSFRNTFNlbGVjdEVsZW1lbnQ7CiBjbGFzcyBP
cHRpb25FbGVtZW50RGF0YTsKLWNsYXNzIFNlbGVjdEVsZW1lbnQ7CiAKIGNsYXNzIE9wdGlvbkVs
ZW1lbnQgewogcHVibGljOgpAQCAtNDQsNyArNDQsNyBAQCBwdWJsaWM6CiAKIHByb3RlY3RlZDoK
ICAgICBzdGF0aWMgdm9pZCBzZXRTZWxlY3RlZFN0YXRlKE9wdGlvbkVsZW1lbnREYXRhJiwgRWxl
bWVudCosIGJvb2wgc2VsZWN0ZWQpOwotICAgIHN0YXRpYyBpbnQgb3B0aW9uSW5kZXgoU2VsZWN0
RWxlbWVudCosIGNvbnN0IEVsZW1lbnQqKTsKKyAgICBzdGF0aWMgaW50IG9wdGlvbkluZGV4KEhU
TUxTZWxlY3RFbGVtZW50KiwgY29uc3QgRWxlbWVudCopOwogICAgIHN0YXRpYyBTdHJpbmcgY29s
bGVjdE9wdGlvbkxhYmVsT3JUZXh0KGNvbnN0IE9wdGlvbkVsZW1lbnREYXRhJiwgY29uc3QgRWxl
bWVudCopOwogICAgIHN0YXRpYyBTdHJpbmcgY29sbGVjdE9wdGlvblRleHRSZXNwZWN0aW5nR3Jv
dXBMYWJlbChjb25zdCBPcHRpb25FbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqKTsKICAgICBz
dGF0aWMgU3RyaW5nIGNvbGxlY3RPcHRpb25WYWx1ZShjb25zdCBPcHRpb25FbGVtZW50RGF0YSYs
IGNvbnN0IEVsZW1lbnQqKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9TZWxlY3RFbGVtZW50
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vU2VsZWN0RWxlbWVudC5jcHAJ
KHJldmlzaW9uIDk2ODg3KQorKysgU291cmNlL1dlYkNvcmUvZG9tL1NlbGVjdEVsZW1lbnQuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC00NSwxOSArNDUsNiBAQAogI2luY2x1ZGUgPHd0Zi9Bc3NlcnRp
b25zLmg+CiAjaW5jbHVkZSA8d3RmL3VuaWNvZGUvQ2hhcmFjdGVyTmFtZXMuaD4KIAotLy8gQ29u
ZmlndXJlIHBsYXRmb3JtLXNwZWNpZmljIGJlaGF2aW9yIHdoZW4gZm9jdXNlZCBwb3AtdXAgcmVj
ZWl2ZXMgYXJyb3cvc3BhY2UvcmV0dXJuIGtleXN0cm9rZS4KLS8vIChQTEFURk9STShNQUMpIGFu
ZCBQTEFURk9STShHVEspIGFyZSBhbHdheXMgZmFsc2UgaW4gQ2hyb21pdW0sIGhlbmNlIHRoZSBl
eHRyYSB0ZXN0cy4pCi0jaWYgUExBVEZPUk0oTUFDKSB8fCAoUExBVEZPUk0oQ0hST01JVU0pICYm
IE9TKERBUldJTikpCi0jZGVmaW5lIEFSUk9XX0tFWVNfUE9QX01FTlUgMQotI2RlZmluZSBTUEFD
RV9PUl9SRVRVUk5fUE9QX01FTlUgMAotI2VsaWYgUExBVEZPUk0oR1RLKSB8fCAoUExBVEZPUk0o
Q0hST01JVU0pICYmIE9TKFVOSVgpKQotI2RlZmluZSBBUlJPV19LRVlTX1BPUF9NRU5VIDAKLSNk
ZWZpbmUgU1BBQ0VfT1JfUkVUVVJOX1BPUF9NRU5VIDEKLSNlbHNlCi0jZGVmaW5lIEFSUk9XX0tF
WVNfUE9QX01FTlUgMAotI2RlZmluZSBTUEFDRV9PUl9SRVRVUk5fUE9QX01FTlUgMAotI2VuZGlm
Ci0KIHVzaW5nIHN0ZDo6bWluOwogdXNpbmcgc3RkOjptYXg7CiB1c2luZyBuYW1lc3BhY2UgV1RG
OwpAQCAtNjUsOTg5ICs1Miw2IEBAIHVzaW5nIG5hbWVzcGFjZSBVbmljb2RlOwogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKLXN0YXRpYyBjb25zdCBET01UaW1lU3RhbXAgdHlwZUFoZWFkVGltZW91
dCA9IDEwMDA7Ci0KLWVudW0gU2tpcERpcmVjdGlvbiB7Ci0gICAgU2tpcEJhY2t3YXJkcyA9IC0x
LAotICAgIFNraXBGb3J3YXJkcyA9IDEKLX07Ci0KLS8vIFJldHVybnMgdGhlIDFzdCB2YWxpZCBp
dGVtIHxza2lwfCBpdGVtcyBmcm9tIHxsaXN0SW5kZXh8IGluIGRpcmVjdGlvbiB8ZGlyZWN0aW9u
fCBpZiB0aGVyZSBpcyBvbmUuCi0vLyBPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIHZhbGlkIGl0
ZW0gY2xvc2VzdCB0byB0aGF0IGJvdW5kYXJ5IHdoaWNoIGlzIHBhc3QgfGxpc3RJbmRleHwgaWYg
dGhlcmUgaXMgb25lLgotLy8gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHxsaXN0SW5kZXh8LgotLy8g
VmFsaWQgbWVhbnMgdGhhdCBpdCBpcyBlbmFibGVkIGFuZCBhbiBvcHRpb24gZWxlbWVudC4KLXN0
YXRpYyBpbnQgbmV4dFZhbGlkSW5kZXgoY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1z
LCBpbnQgbGlzdEluZGV4LCBTa2lwRGlyZWN0aW9uIGRpcmVjdGlvbiwgaW50IHNraXApCi17Ci0g
ICAgQVNTRVJUKGRpcmVjdGlvbiA9PSAtMSB8fCBkaXJlY3Rpb24gPT0gMSk7Ci0gICAgaW50IGxh
c3RHb29kSW5kZXggPSBsaXN0SW5kZXg7Ci0gICAgaW50IHNpemUgPSBsaXN0SXRlbXMuc2l6ZSgp
OwotICAgIGZvciAobGlzdEluZGV4ICs9IGRpcmVjdGlvbjsgbGlzdEluZGV4ID49IDAgJiYgbGlz
dEluZGV4IDwgc2l6ZTsgbGlzdEluZGV4ICs9IGRpcmVjdGlvbikgewotICAgICAgICAtLXNraXA7
Ci0gICAgICAgIGlmICghbGlzdEl0ZW1zW2xpc3RJbmRleF0tPmRpc2FibGVkKCkgJiYgaXNPcHRp
b25FbGVtZW50KGxpc3RJdGVtc1tsaXN0SW5kZXhdKSkgewotICAgICAgICAgICAgbGFzdEdvb2RJ
bmRleCA9IGxpc3RJbmRleDsKLSAgICAgICAgICAgIGlmIChza2lwIDw9IDApCi0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxhc3RHb29kSW5kZXg7
Ci19Ci0KLXN0YXRpYyBpbnQgbmV4dFNlbGVjdGFibGVMaXN0SW5kZXgoU2VsZWN0RWxlbWVudERh
dGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBzdGFydEluZGV4KQotewotICAgIHJldHVy
biBuZXh0VmFsaWRJbmRleChkYXRhLmxpc3RJdGVtcyhlbGVtZW50KSwgc3RhcnRJbmRleCwgU2tp
cEZvcndhcmRzLCAxKTsKLX0KLQotc3RhdGljIGludCBwcmV2aW91c1NlbGVjdGFibGVMaXN0SW5k
ZXgoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBzdGFydElu
ZGV4KQotewotICAgIGlmIChzdGFydEluZGV4ID09IC0xKQotICAgICAgICBzdGFydEluZGV4ID0g
ZGF0YS5saXN0SXRlbXMoZWxlbWVudCkuc2l6ZSgpOwotICAgIHJldHVybiBuZXh0VmFsaWRJbmRl
eChkYXRhLmxpc3RJdGVtcyhlbGVtZW50KSwgc3RhcnRJbmRleCwgU2tpcEJhY2t3YXJkcywgMSk7
Ci19Ci0KLXN0YXRpYyBpbnQgZmlyc3RTZWxlY3RhYmxlTGlzdEluZGV4KFNlbGVjdEVsZW1lbnRE
YXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50
Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7Ci0gICAgaW50IGluZGV4ID0gbmV4
dFZhbGlkSW5kZXgoaXRlbXMsIGl0ZW1zLnNpemUoKSwgU2tpcEJhY2t3YXJkcywgSU5UX01BWCk7
Ci0gICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkPihpbmRleCkgPT0gaXRlbXMuc2l6ZSgpKQot
ICAgICAgICByZXR1cm4gLTE7Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi1zdGF0aWMgaW50IGxh
c3RTZWxlY3RhYmxlTGlzdEluZGV4KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBl
bGVtZW50KQotewotICAgIHJldHVybiBuZXh0VmFsaWRJbmRleChkYXRhLmxpc3RJdGVtcyhlbGVt
ZW50KSwgLTEsIFNraXBGb3J3YXJkcywgSU5UX01BWCk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGlu
ZGV4IG9mIHRoZSBuZXh0IHZhbGlkIGl0ZW0gb25lIHBhZ2UgYXdheSBmcm9tIHxzdGFydEluZGV4
fCBpbiBkaXJlY3Rpb24gfGRpcmVjdGlvbnwuCi1zdGF0aWMgaW50IG5leHRTZWxlY3RhYmxlTGlz
dEluZGV4UGFnZUF3YXkoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQs
IGludCBzdGFydEluZGV4LCBTa2lwRGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgICBjb25zdCBW
ZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOwotICAgIC8v
IENhbid0IHVzZSBkYXRhLT5zaXplKCkgYmVjYXVzZSByZW5kZXJlciBmb3JjZXMgYSBtaW5pbXVt
IHNpemUuCi0gICAgaW50IHBhZ2VTaXplID0gMDsKLSAgICBpZiAoZWxlbWVudC0+cmVuZGVyZXIo
KS0+aXNMaXN0Qm94KCkpCi0gICAgICAgIHBhZ2VTaXplID0gdG9SZW5kZXJMaXN0Qm94KGVsZW1l
bnQtPnJlbmRlcmVyKCkpLT5zaXplKCkgLSAxOyAvLyAtMSBzbyB3ZSBzdGlsbCBzaG93IGNvbnRl
eHQKLQotICAgIC8vIE9uZSBwYWdlIGF3YXksIGJ1dCBub3Qgb3V0c2lkZSB2YWxpZCBib3VuZHMu
Ci0gICAgLy8gSWYgdGhlcmUgaXMgYSB2YWxpZCBvcHRpb24gaXRlbSBvbmUgcGFnZSBhd2F5LCB0
aGUgaW5kZXggaXMgY2hvc2VuLgotICAgIC8vIElmIHRoZXJlIGlzIG5vIGV4YWN0IG9uZSBwYWdl
IGF3YXkgdmFsaWQgb3B0aW9uLCByZXR1cm5zIHN0YXJ0SW5kZXggb3IgdGhlIG1vc3QgZmFyIGlu
ZGV4LgotICAgIGludCBlZGdlSW5kZXggPSAoZGlyZWN0aW9uID09IFNraXBGb3J3YXJkcykgPyAw
IDogKGl0ZW1zLnNpemUoKSAtIDEpOwotICAgIGludCBza2lwQW1vdW50ID0gcGFnZVNpemUgKyAo
KGRpcmVjdGlvbiA9PSBTa2lwRm9yd2FyZHMpID8gc3RhcnRJbmRleCA6IChlZGdlSW5kZXggLSBz
dGFydEluZGV4KSk7Ci0gICAgcmV0dXJuIG5leHRWYWxpZEluZGV4KGl0ZW1zLCBlZGdlSW5kZXgs
IGRpcmVjdGlvbiwgc2tpcEFtb3VudCk7Ci19Ci0KLXZvaWQgU2VsZWN0RWxlbWVudDo6c2VsZWN0
QWxsKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIEFT
U0VSVCghZGF0YS51c2VzTWVudUxpc3QoKSk7Ci0gICAgaWYgKCFlbGVtZW50LT5yZW5kZXJlcigp
IHx8ICFkYXRhLm11bHRpcGxlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFNhdmUgdGhl
IHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIG5ldyBzZWxlY3RBbGwgc2Vs
ZWN0aW9uIHdoZW4gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cwotICAgIHNhdmVMYXN0U2VsZWN0
aW9uKGRhdGEsIGVsZW1lbnQpOwotCi0gICAgZGF0YS5zZXRBY3RpdmVTZWxlY3Rpb25TdGF0ZSh0
cnVlKTsKLSAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChkYXRhLCBlbGVtZW50LCBu
ZXh0U2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBlbGVtZW50LCAtMSkpOwotICAgIHNldEFjdGl2
ZVNlbGVjdGlvbkVuZEluZGV4KGRhdGEsIHByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleChkYXRh
LCBlbGVtZW50LCAtMSkpOwotCi0gICAgdXBkYXRlTGlzdEJveFNlbGVjdGlvbihkYXRhLCBlbGVt
ZW50LCBmYWxzZSk7Ci0gICAgbGlzdEJveE9uQ2hhbmdlKGRhdGEsIGVsZW1lbnQpOwotfQotCi12
b2lkIFNlbGVjdEVsZW1lbnQ6OnNhdmVMYXN0U2VsZWN0aW9uKFNlbGVjdEVsZW1lbnREYXRhJiBk
YXRhLCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKSB7
Ci0gICAgICAgIGRhdGEuc2V0TGFzdE9uQ2hhbmdlSW5kZXgoc2VsZWN0ZWRJbmRleChkYXRhLCBl
bGVtZW50KSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWZWN0b3I8Ym9vbD4mIGxh
c3RPbkNoYW5nZVNlbGVjdGlvbiA9IGRhdGEubGFzdE9uQ2hhbmdlU2VsZWN0aW9uKCk7IAotICAg
IGxhc3RPbkNoYW5nZVNlbGVjdGlvbi5jbGVhcigpOwotCi0gICAgY29uc3QgVmVjdG9yPEVsZW1l
bnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgT3B0aW9uRWxlbWVudCog
b3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSk7Ci0gICAgICAgIGxhc3RP
bkNoYW5nZVNlbGVjdGlvbi5hcHBlbmQob3B0aW9uRWxlbWVudCAmJiBvcHRpb25FbGVtZW50LT5z
ZWxlY3RlZCgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgU2VsZWN0RWxlbWVudDo6c2V0QWN0aXZlU2Vs
ZWN0aW9uQW5jaG9ySW5kZXgoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1l
bnQsIGludCBpbmRleCkKLXsKLSAgICBkYXRhLnNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4
KGluZGV4KTsKLQotICAgIC8vIENhY2hlIHRoZSBzZWxlY3Rpb24gc3RhdGUgc28gd2UgY2FuIHJl
c3RvcmUgdGhlIG9sZCBzZWxlY3Rpb24gYXMgdGhlIG5ldyBzZWxlY3Rpb24gcGl2b3RzIGFyb3Vu
ZCB0aGlzIGFuY2hvciBpbmRleAotICAgIFZlY3Rvcjxib29sPiYgY2FjaGVkU3RhdGVGb3JBY3Rp
dmVTZWxlY3Rpb24gPSBkYXRhLmNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uKCk7IAotICAg
IGNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uLmNsZWFyKCk7Ci0KLSAgICBjb25zdCBWZWN0
b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOwotICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgewotICAgICAgICBPcHRpb25F
bGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKLSAgICAg
ICAgY2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24uYXBwZW5kKG9wdGlvbkVsZW1lbnQgJiYg
b3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSk7Ci0gICAgfQotfQotCi12b2lkIFNlbGVjdEVsZW1l
bnQ6OnNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBp
bnQgaW5kZXgpCi17Ci0gICAgZGF0YS5zZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChpbmRleCk7
Ci19Ci0KLXZvaWQgU2VsZWN0RWxlbWVudDo6dXBkYXRlTGlzdEJveFNlbGVjdGlvbihTZWxlY3RF
bGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgYm9vbCBkZXNlbGVjdE90aGVyT3B0
aW9ucykKLXsKLSAgICBBU1NFUlQoZWxlbWVudC0+cmVuZGVyZXIoKSAmJiAoZWxlbWVudC0+cmVu
ZGVyZXIoKS0+aXNMaXN0Qm94KCkgfHwgZGF0YS5tdWx0aXBsZSgpKSk7Ci0gICAgQVNTRVJUKCFk
YXRhLmxpc3RJdGVtcyhlbGVtZW50KS5zaXplKCkgfHwgZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNo
b3JJbmRleCgpID49IDApOwotCi0gICAgdW5zaWduZWQgc3RhcnQgPSBtaW4oZGF0YS5hY3RpdmVT
ZWxlY3Rpb25BbmNob3JJbmRleCgpLCBkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkpOwot
ICAgIHVuc2lnbmVkIGVuZCA9IG1heChkYXRhLmFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KCks
IGRhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSk7Ci0gICAgVmVjdG9yPGJvb2w+JiBjYWNo
ZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbiA9IGRhdGEuY2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxl
Y3Rpb24oKTsKLQotICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0
SXRlbXMoZWxlbWVudCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGl0ZW1zLnNpemUo
KTsgKytpKSB7Ci0gICAgICAgIE9wdGlvbkVsZW1lbnQqIG9wdGlvbkVsZW1lbnQgPSB0b09wdGlv
bkVsZW1lbnQoaXRlbXNbaV0pOwotICAgICAgICBpZiAoIW9wdGlvbkVsZW1lbnQgfHwgaXRlbXNb
aV0tPmRpc2FibGVkKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoaSA+
PSBzdGFydCAmJiBpIDw9IGVuZCkKLSAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQtPnNldFNlbGVj
dGVkU3RhdGUoZGF0YS5hY3RpdmVTZWxlY3Rpb25TdGF0ZSgpKTsKLSAgICAgICAgZWxzZSBpZiAo
ZGVzZWxlY3RPdGhlck9wdGlvbnMgfHwgaSA+PSBjYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlv
bi5zaXplKCkpCi0gICAgICAgICAgICBvcHRpb25FbGVtZW50LT5zZXRTZWxlY3RlZFN0YXRlKGZh
bHNlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb3B0aW9uRWxlbWVudC0+c2V0U2VsZWN0
ZWRTdGF0ZShjYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbltpXSk7Ci0gICAgfQotCi0gICAg
dG9TZWxlY3RFbGVtZW50KGVsZW1lbnQpLT51cGRhdGVWYWxpZGl0eSgpOwotICAgIHNjcm9sbFRv
U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOwotfQotCi12b2lkIFNlbGVjdEVsZW1lbnQ6Omxpc3RC
b3hPbkNoYW5nZShTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKLXsK
LSAgICBBU1NFUlQoIWRhdGEudXNlc01lbnVMaXN0KCkgfHwgZGF0YS5tdWx0aXBsZSgpKTsKLQot
ICAgIFZlY3Rvcjxib29sPiYgbGFzdE9uQ2hhbmdlU2VsZWN0aW9uID0gZGF0YS5sYXN0T25DaGFu
Z2VTZWxlY3Rpb24oKTsgCi0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRh
Lmxpc3RJdGVtcyhlbGVtZW50KTsKLQotICAgIC8vIElmIHRoZSBjYWNoZWQgc2VsZWN0aW9uIGxp
c3QgaXMgZW1wdHksIG9yIHRoZSBzaXplIGhhcyBjaGFuZ2VkLCB0aGVuIGZpcmUgZGlzcGF0Y2hG
b3JtQ29udHJvbENoYW5nZUV2ZW50LCBhbmQgcmV0dXJuIGVhcmx5LgotICAgIGlmIChsYXN0T25D
aGFuZ2VTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IGxhc3RPbkNoYW5nZVNlbGVjdGlvbi5zaXplKCkg
IT0gaXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoRm9ybUNvbnRyb2xD
aGFuZ2VFdmVudCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVXBkYXRlIGxh
c3RPbkNoYW5nZVNlbGVjdGlvbiBhbmQgZmlyZSBkaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZl
bnQKLSAgICBib29sIGZpcmVPbkNoYW5nZSA9IGZhbHNlOwotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgewotICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRp
b25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKLSAgICAgICAgYm9vbCBzZWxl
Y3RlZCA9IG9wdGlvbkVsZW1lbnQgJiYgIG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVkKCk7Ci0gICAg
ICAgIGlmIChzZWxlY3RlZCAhPSBsYXN0T25DaGFuZ2VTZWxlY3Rpb25baV0pCi0gICAgICAgICAg
ICBmaXJlT25DaGFuZ2UgPSB0cnVlOwotICAgICAgICBsYXN0T25DaGFuZ2VTZWxlY3Rpb25baV0g
PSBzZWxlY3RlZDsKLSAgICB9Ci0KLSAgICBpZiAoZmlyZU9uQ2hhbmdlKQotICAgICAgICBlbGVt
ZW50LT5kaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQoKTsKLX0KLQotdm9pZCBTZWxlY3RF
bGVtZW50OjptZW51TGlzdE9uQ2hhbmdlKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50
KiBlbGVtZW50KQotewotICAgIEFTU0VSVChkYXRhLnVzZXNNZW51TGlzdCgpKTsKLQotICAgIGlu
dCBzZWxlY3RlZCA9IHNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCk7Ci0gICAgaWYgKGRhdGEu
bGFzdE9uQ2hhbmdlSW5kZXgoKSAhPSBzZWxlY3RlZCAmJiBkYXRhLnVzZXJEcml2ZW5DaGFuZ2Uo
KSkgewotICAgICAgICBkYXRhLnNldExhc3RPbkNoYW5nZUluZGV4KHNlbGVjdGVkKTsKLSAgICAg
ICAgZGF0YS5zZXRVc2VyRHJpdmVuQ2hhbmdlKGZhbHNlKTsKLSAgICAgICAgZWxlbWVudC0+ZGlz
cGF0Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50KCk7Ci0gICAgfQotfQotCi12b2lkIFNlbGVjdEVs
ZW1lbnQ6OnNjcm9sbFRvU2VsZWN0aW9uKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50
KiBlbGVtZW50KQotewotICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVy
KCkpCi0gICAgICAgIHRvUmVuZGVyTGlzdEJveChyZW5kZXJlciktPnNlbGVjdGlvbkNoYW5nZWQo
KTsKLX0KLQotdm9pZCBTZWxlY3RFbGVtZW50OjpzZXRPcHRpb25zQ2hhbmdlZE9uUmVuZGVyZXIo
U2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgaWYgKFJl
bmRlck9iamVjdCogcmVuZGVyZXIgPSBlbGVtZW50LT5yZW5kZXJlcigpKSB7Ci0gICAgICAgIGlm
IChkYXRhLnVzZXNNZW51TGlzdCgpKQotICAgICAgICAgICAgdG9SZW5kZXJNZW51TGlzdChyZW5k
ZXJlciktPnNldE9wdGlvbnNDaGFuZ2VkKHRydWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICB0b1JlbmRlckxpc3RCb3gocmVuZGVyZXIpLT5zZXRPcHRpb25zQ2hhbmdlZCh0cnVlKTsKLSAg
ICB9Ci19Ci0KLXZvaWQgU2VsZWN0RWxlbWVudDo6c2V0UmVjYWxjTGlzdEl0ZW1zKFNlbGVjdEVs
ZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIGRhdGEuc2V0U2hvdWxk
UmVjYWxjTGlzdEl0ZW1zKHRydWUpOwotICAgIGRhdGEuc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9y
SW5kZXgoLTEpOyAvLyBNYW51YWwgc2VsZWN0aW9uIGFuY2hvciBpcyByZXNldCB3aGVuIG1hbmlw
dWxhdGluZyB0aGUgc2VsZWN0IHByb2dyYW1tYXRpY2FsbHkuCi0gICAgc2V0T3B0aW9uc0NoYW5n
ZWRPblJlbmRlcmVyKGRhdGEsIGVsZW1lbnQpOwotICAgIGVsZW1lbnQtPnNldE5lZWRzU3R5bGVS
ZWNhbGMoKTsKLX0KLQotdm9pZCBTZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMoU2VsZWN0
RWxlbWVudERhdGEmIGRhdGEsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQsIGJvb2wgdXBkYXRlU2Vs
ZWN0ZWRTdGF0ZXMpCi17Ci0gICAgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gZGF0YS5y
YXdMaXN0SXRlbXMoKTsKLSAgICBsaXN0SXRlbXMuY2xlYXIoKTsKLQotICAgIGRhdGEuc2V0U2hv
dWxkUmVjYWxjTGlzdEl0ZW1zKGZhbHNlKTsKLQotICAgIE9wdGlvbkVsZW1lbnQqIGZvdW5kU2Vs
ZWN0ZWQgPSAwOwotICAgIGZvciAoTm9kZSogY3VycmVudE5vZGUgPSBlbGVtZW50LT5maXJzdENo
aWxkKCk7IGN1cnJlbnROb2RlOykgewotICAgICAgICBpZiAoIWN1cnJlbnROb2RlLT5pc0VsZW1l
bnROb2RlKCkpIHsKLSAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUtPnRyYXZl
cnNlTmV4dFNpYmxpbmcoZWxlbWVudCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
fQotCi0gICAgICAgIEVsZW1lbnQqIGN1cnJlbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4oY3Vy
cmVudE5vZGUpOwotCi0gICAgICAgIC8vIG9wdGdyb3VwIHRhZ3MgbWF5IG5vdCBuZXN0LiBIb3dl
dmVyLCBib3RoIEZpcmVGb3ggYW5kIElFIHdpbGwKLSAgICAgICAgLy8gZmxhdHRlbiB0aGUgdHJl
ZSBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBmb2xsb3cgc3VpdC4KLSAgICAgICAgLy8gKGh0dHA6Ly93
d3cudzMub3JnL1RSL2h0bWw0MDEvaW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjYpCi0gICAgICAg
IGlmIChpc09wdGlvbkdyb3VwRWxlbWVudChjdXJyZW50KSkgewotICAgICAgICAgICAgbGlzdEl0
ZW1zLmFwcGVuZChjdXJyZW50KTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5maXJzdENoaWxk
KCkpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQo
KTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
Ci0gICAgICAgIGlmIChPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVt
ZW50KGN1cnJlbnQpKSB7Ci0gICAgICAgICAgICBsaXN0SXRlbXMuYXBwZW5kKGN1cnJlbnQpOwot
Ci0gICAgICAgICAgICBpZiAodXBkYXRlU2VsZWN0ZWRTdGF0ZXMgJiYgIWRhdGEubXVsdGlwbGUo
KSkgewotICAgICAgICAgICAgICAgIGlmICghZm91bmRTZWxlY3RlZCAmJiAoZGF0YS5zaXplKCkg
PD0gMSB8fCBvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpKSkgewotICAgICAgICAgICAgICAgICAg
ICBmb3VuZFNlbGVjdGVkID0gb3B0aW9uRWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgZm91
bmRTZWxlY3RlZC0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVs
c2UgaWYgKGZvdW5kU2VsZWN0ZWQgJiYgb3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSkgewotICAg
ICAgICAgICAgICAgICAgICBmb3VuZFNlbGVjdGVkLT5zZXRTZWxlY3RlZFN0YXRlKGZhbHNlKTsK
LSAgICAgICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZCA9IG9wdGlvbkVsZW1lbnQ7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1
cnJlbnQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpoclRhZykpCi0gICAgICAgICAgICBsaXN0SXRl
bXMuYXBwZW5kKGN1cnJlbnQpOwotCi0gICAgICAgIC8vIEluIGNvbmZvcm1pbmcgSFRNTCBjb2Rl
LCBvbmx5IDxvcHRncm91cD4gYW5kIDxvcHRpb24+IHdpbGwgYmUgZm91bmQKLSAgICAgICAgLy8g
d2l0aGluIGEgPHNlbGVjdD4uIFdlIGNhbGwgdHJhdmVyc2VOZXh0U2libGluZyBzbyB0aGF0IHdl
IG9ubHkgc3RlcAotICAgICAgICAvLyBpbnRvIHRob3NlIHRhZ3MgdGhhdCB3ZSBjaG9vc2UgdG8u
IEZvciB3ZWItY29tcGF0LCB3ZSBzaG91bGQgY29wZQotICAgICAgICAvLyB3aXRoIHRoZSBjYXNl
IHdoZXJlIG9kZCB0YWdzIGxpa2UgYSA8ZGl2PiBoYXZlIGJlZW4gYWRkZWQgYnV0IHdlCi0gICAg
ICAgIC8vIGhhbmRsZSB0aGlzIGJlY2F1c2Ugc3VjaCB0YWdzIGhhdmUgYWxyZWFkeSBiZWVuIHJl
bW92ZWQgZnJvbSB0aGUKLSAgICAgICAgLy8gPHNlbGVjdD4ncyBzdWJ0cmVlIGF0IHRoaXMgcG9p
bnQuCi0gICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUtPnRyYXZlcnNlTmV4dFNpYmxp
bmcoZWxlbWVudCk7Ci0gICAgfQotfQotCi1pbnQgU2VsZWN0RWxlbWVudDo6c2VsZWN0ZWRJbmRl
eChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgY29uc3QgRWxlbWVudCogZWxlbWVudCkK
LXsKLSAgICB1bnNpZ25lZCBpbmRleCA9IDA7Ci0KLSAgICAvLyByZXR1cm4gdGhlIG51bWJlciBv
ZiB0aGUgZmlyc3Qgb3B0aW9uIHNlbGVjdGVkCi0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYg
aXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IGl0ZW1zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChPcHRpb25FbGVtZW50KiBvcHRp
b25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKSkgewotICAgICAgICAgICAgaWYg
KG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4
OwotICAgICAgICAgICAgKytpbmRleDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAt
MTsKLX0KLQotdm9pZCBTZWxlY3RFbGVtZW50OjpzZXRTZWxlY3RlZEluZGV4KFNlbGVjdEVsZW1l
bnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBpbnQgb3B0aW9uSW5kZXgsIGJvb2wgZGVz
ZWxlY3QsIGJvb2wgZmlyZU9uQ2hhbmdlTm93LCBib29sIHVzZXJEcml2ZW5DaGFuZ2UpCi17Ci0g
ICAgaWYgKG9wdGlvbkluZGV4ID09IC0xICYmICFkZXNlbGVjdCAmJiAhZGF0YS5tdWx0aXBsZSgp
KQotICAgICAgICBvcHRpb25JbmRleCA9IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVs
ZW1lbnQsIC0xKTsKLSAgICBpZiAoIWRhdGEubXVsdGlwbGUoKSkKLSAgICAgICAgZGVzZWxlY3Qg
PSB0cnVlOwotCi0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJ
dGVtcyhlbGVtZW50KTsKLSAgICBpbnQgbGlzdEluZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoZGF0
YSwgZWxlbWVudCwgb3B0aW9uSW5kZXgpOwotCi0gICAgRWxlbWVudCogZXhjbHVkZUVsZW1lbnQg
PSAwOwotICAgIGlmIChPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gKGxpc3RJbmRleCA+
PSAwID8gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2xpc3RJbmRleF0pIDogMCkpIHsKLSAgICAgICAg
ZXhjbHVkZUVsZW1lbnQgPSBpdGVtc1tsaXN0SW5kZXhdOwotICAgICAgICBpZiAoZGF0YS5hY3Rp
dmVTZWxlY3Rpb25BbmNob3JJbmRleCgpIDwgMCB8fCBkZXNlbGVjdCkKLSAgICAgICAgICAgIHNl
dEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGRhdGEsIGVsZW1lbnQsIGxpc3RJbmRleCk7Ci0g
ICAgICAgIGlmIChkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkgPCAwIHx8IGRlc2VsZWN0
KQotICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoZGF0YSwgbGlzdEluZGV4
KTsKLSAgICAgICAgb3B0aW9uRWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKLSAgICB9
Ci0KLSAgICBpZiAoZGVzZWxlY3QpCi0gICAgICAgIGRlc2VsZWN0SXRlbXMoZGF0YSwgZWxlbWVu
dCwgZXhjbHVkZUVsZW1lbnQpOwotCi0gICAgLy8gRm9yIHRoZSBtZW51IGxpc3QgY2FzZSwgdGhp
cyBpcyB3aGF0IG1ha2VzIHRoZSBzZWxlY3RlZCBlbGVtZW50IGFwcGVhci4KLSAgICBpZiAoUmVu
ZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCkpCi0gICAgICAgIHJlbmRl
cmVyLT51cGRhdGVGcm9tRWxlbWVudCgpOwotCi0gICAgc2Nyb2xsVG9TZWxlY3Rpb24oZGF0YSwg
ZWxlbWVudCk7Ci0KLSAgICAvLyBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgd2l0aCBmaXJlT25DaGFu
Z2VOb3cgZm9yIG1lbnUgbGlzdHMuIAotICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKSB7Ci0g
ICAgICAgIGRhdGEuc2V0VXNlckRyaXZlbkNoYW5nZSh1c2VyRHJpdmVuQ2hhbmdlKTsKLSAgICAg
ICAgaWYgKGZpcmVPbkNoYW5nZU5vdykKLSAgICAgICAgICAgIG1lbnVMaXN0T25DaGFuZ2UoZGF0
YSwgZWxlbWVudCk7Ci0gICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBlbGVtZW50LT5y
ZW5kZXJlcigpOwotICAgICAgICBpZiAocmVuZGVyZXIpIHsKLSAgICAgICAgICAgIGlmIChkYXRh
LnVzZXNNZW51TGlzdCgpKQotICAgICAgICAgICAgICAgIHRvUmVuZGVyTWVudUxpc3QocmVuZGVy
ZXIpLT5kaWRTZXRTZWxlY3RlZEluZGV4KGxpc3RJbmRleCk7Ci0gICAgICAgICAgICBlbHNlIGlm
IChyZW5kZXJlci0+aXNMaXN0Qm94KCkpCi0gICAgICAgICAgICAgICAgdG9SZW5kZXJMaXN0Qm94
KHJlbmRlcmVyKS0+c2VsZWN0aW9uQ2hhbmdlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
dG9TZWxlY3RFbGVtZW50KGVsZW1lbnQpLT51cGRhdGVWYWxpZGl0eSgpOwotICAgIGlmIChGcmFt
ZSogZnJhbWUgPSBlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKQotICAgICAgICBmcmFtZS0+
cGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmZvcm1TdGF0ZURpZENoYW5nZShlbGVtZW50KTsK
LX0KLQotaW50IFNlbGVjdEVsZW1lbnQ6Om9wdGlvblRvTGlzdEluZGV4KGNvbnN0IFNlbGVjdEVs
ZW1lbnREYXRhJiBkYXRhLCBjb25zdCBFbGVtZW50KiBlbGVtZW50LCBpbnQgb3B0aW9uSW5kZXgp
Ci17Ci0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhl
bGVtZW50KTsKLSAgICBpbnQgbGlzdFNpemUgPSAoaW50KSBpdGVtcy5zaXplKCk7Ci0gICAgaWYg
KG9wdGlvbkluZGV4IDwgMCB8fCBvcHRpb25JbmRleCA+PSBsaXN0U2l6ZSkKLSAgICAgICAgcmV0
dXJuIC0xOwotCi0gICAgaW50IG9wdGlvbkluZGV4MiA9IC0xOwotICAgIGZvciAoaW50IGxpc3RJ
bmRleCA9IDA7IGxpc3RJbmRleCA8IGxpc3RTaXplOyArK2xpc3RJbmRleCkgewotICAgICAgICBp
ZiAoaXNPcHRpb25FbGVtZW50KGl0ZW1zW2xpc3RJbmRleF0pKSB7Ci0gICAgICAgICAgICArK29w
dGlvbkluZGV4MjsKLSAgICAgICAgICAgIGlmIChvcHRpb25JbmRleDIgPT0gb3B0aW9uSW5kZXgp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RJbmRleDsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIHJldHVybiAtMTsKLX0KLQotaW50IFNlbGVjdEVsZW1lbnQ6Omxpc3RUb09wdGlvbkluZGV4
KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBFbGVtZW50KiBlbGVtZW50LCBp
bnQgbGlzdEluZGV4KQotewotICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0
YS5saXN0SXRlbXMoZWxlbWVudCk7Ci0gICAgaWYgKGxpc3RJbmRleCA8IDAgfHwgbGlzdEluZGV4
ID49IGludChpdGVtcy5zaXplKCkpIHx8Ci0gICAgICAgICFpc09wdGlvbkVsZW1lbnQoaXRlbXNb
bGlzdEluZGV4XSkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGludCBvcHRpb25JbmRleCA9
IDA7IC8vIGFjdHVhbCBpbmRleCBvZiBvcHRpb24gbm90IGNvdW50aW5nIE9QVEdST1VQIGVudHJp
ZXMgdGhhdCBtYXkgYmUgaW4gbGlzdAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdEluZGV4
OyArK2kpCi0gICAgICAgIGlmIChpc09wdGlvbkVsZW1lbnQoaXRlbXNbaV0pKQotICAgICAgICAg
ICAgKytvcHRpb25JbmRleDsKLQotICAgIHJldHVybiBvcHRpb25JbmRleDsKLX0KLQotdm9pZCBT
ZWxlY3RFbGVtZW50OjpkaXNwYXRjaEZvY3VzRXZlbnQoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEs
IEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNh
biBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNoYW5n
ZSBldmVudHMgZHVyaW5nIGJsdXIgZXZlbnQgZGlzcGF0Y2hhbAotICAgIGlmIChkYXRhLnVzZXNN
ZW51TGlzdCgpKQotICAgICAgICBzYXZlTGFzdFNlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsKLX0K
LQotdm9pZCBTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEJsdXJFdmVudChTZWxlY3RFbGVtZW50RGF0
YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICAvLyBXZSBvbmx5IG5lZWQgdG8gZmly
ZSBjaGFuZ2UgZXZlbnRzIGhlcmUgZm9yIG1lbnUgbGlzdHMsIGJlY2F1c2Ugd2UgZmlyZSBjaGFu
Z2UgZXZlbnRzIGZvciBsaXN0IGJveGVzIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlIGlz
IGFjdHVhbGx5IG1hZGUuCi0gICAgLy8gVGhpcyBtYXRjaGVzIG90aGVyIGJyb3dzZXJzJyBiZWhh
dmlvci4KLSAgICBpZiAoZGF0YS51c2VzTWVudUxpc3QoKSkKLSAgICAgICAgbWVudUxpc3RPbkNo
YW5nZShkYXRhLCBlbGVtZW50KTsKLX0KLQotdm9pZCBTZWxlY3RFbGVtZW50OjpkZXNlbGVjdEl0
ZW1zKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBFbGVtZW50KiBl
eGNsdWRlRWxlbWVudCkKLXsKLSAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRh
dGEubGlzdEl0ZW1zKGVsZW1lbnQpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVt
cy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoaXRlbXNbaV0gPT0gZXhjbHVkZUVsZW1lbnQp
Ci0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0
aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSkpCi0gICAgICAgICAgICBvcHRp
b25FbGVtZW50LT5zZXRTZWxlY3RlZFN0YXRlKGZhbHNlKTsKLSAgICB9Ci19Ci0KLWJvb2wgU2Vs
ZWN0RWxlbWVudDo6c2F2ZUZvcm1Db250cm9sU3RhdGUoY29uc3QgU2VsZWN0RWxlbWVudERhdGEm
IGRhdGEsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQsIFN0cmluZyYgdmFsdWUpCi17Ci0gICAgY29u
c3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAg
ICBpbnQgbGVuZ3RoID0gaXRlbXMuc2l6ZSgpOwotCi0gICAgLy8gRklYTUU6IENoYW5nZSB0aGlz
IGNvZGUgdG8gdXNlIHRoZSBuZXcgU3RyaW5nSW1wbDo6Y3JlYXRlVW5pbml0aWFsaXplZCBjb2Rl
IHBhdGguCi0gICAgVmVjdG9yPGNoYXIsIDEwMjQ+IGNoYXJhY3RlcnMobGVuZ3RoKTsKLSAgICBm
b3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgICAgIE9wdGlvbkVsZW1lbnQq
IG9wdGlvbkVsZW1lbnQgPSB0b09wdGlvbkVsZW1lbnQoaXRlbXNbaV0pOwotICAgICAgICBib29s
IHNlbGVjdGVkID0gb3B0aW9uRWxlbWVudCAmJiBvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpOwot
ICAgICAgICBjaGFyYWN0ZXJzW2ldID0gc2VsZWN0ZWQgPyAnWCcgOiAnLic7Ci0gICAgfQotCi0g
ICAgdmFsdWUgPSBTdHJpbmcoY2hhcmFjdGVycy5kYXRhKCksIGxlbmd0aCk7Ci0gICAgcmV0dXJu
IHRydWU7Ci19Ci0KLXZvaWQgU2VsZWN0RWxlbWVudDo6cmVzdG9yZUZvcm1Db250cm9sU3RhdGUo
U2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IFN0cmluZyYg
c3RhdGUpCi17Ci0gICAgcmVjYWxjTGlzdEl0ZW1zKGRhdGEsIGVsZW1lbnQpOwotCi0gICAgY29u
c3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAg
ICBpbnQgbGVuZ3RoID0gaXRlbXMuc2l6ZSgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBs
ZW5ndGg7ICsraSkgewotICAgICAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9
IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSkpCi0gICAgICAgICAgICBvcHRpb25FbGVtZW50LT5z
ZXRTZWxlY3RlZFN0YXRlKHN0YXRlW2ldID09ICdYJyk7Ci0gICAgfQotCi0gICAgc2V0T3B0aW9u
c0NoYW5nZWRPblJlbmRlcmVyKGRhdGEsIGVsZW1lbnQpOwotfQotCi12b2lkIFNlbGVjdEVsZW1l
bnQ6OnBhcnNlTXVsdGlwbGVBdHRyaWJ1dGUoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1l
bnQqIGVsZW1lbnQsIEF0dHJpYnV0ZSogYXR0cmlidXRlKQotewotICAgIGJvb2wgb2xkVXNlc01l
bnVMaXN0ID0gZGF0YS51c2VzTWVudUxpc3QoKTsKLSAgICBkYXRhLnNldE11bHRpcGxlKCFhdHRy
aWJ1dGUtPmlzTnVsbCgpKTsKLSAgICB0b1NlbGVjdEVsZW1lbnQoZWxlbWVudCktPnVwZGF0ZVZh
bGlkaXR5KCk7Ci0gICAgaWYgKG9sZFVzZXNNZW51TGlzdCAhPSBkYXRhLnVzZXNNZW51TGlzdCgp
ICYmIGVsZW1lbnQtPmF0dGFjaGVkKCkpIHsKLSAgICAgICAgZWxlbWVudC0+ZGV0YWNoKCk7Ci0g
ICAgICAgIGVsZW1lbnQtPmF0dGFjaCgpOwotICAgIH0KLX0KLQotYm9vbCBTZWxlY3RFbGVtZW50
OjphcHBlbmRGb3JtRGF0YShTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVu
dCwgRm9ybURhdGFMaXN0JiBsaXN0KQotewotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSA9
IGVsZW1lbnQtPmZvcm1Db250cm9sTmFtZSgpOwotICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbCBzdWNjZXNzZnVsID0gZmFsc2U7Ci0gICAg
Y29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsK
LQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgewotICAg
ICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1z
W2ldKTsKLSAgICAgICAgaWYgKG9wdGlvbkVsZW1lbnQgJiYgb3B0aW9uRWxlbWVudC0+c2VsZWN0
ZWQoKSAmJiAhb3B0aW9uRWxlbWVudC0+ZGlzYWJsZWQoKSkgewotICAgICAgICAgICAgbGlzdC5h
cHBlbmREYXRhKG5hbWUsIG9wdGlvbkVsZW1lbnQtPnZhbHVlKCkpOwotICAgICAgICAgICAgc3Vj
Y2Vzc2Z1bCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJdCdzIHBvc3NpYmxl
IHRoYXQgdGhpcyBpcyBhIG1lbnVsaXN0IHdpdGggbXVsdGlwbGUgb3B0aW9ucyBhbmQgbm90aGlu
ZwotICAgIC8vIHdpbGwgYmUgc3VibWl0dGVkICghc3VjY2Vzc2Z1bCkuIFdlIHdvbid0IHNlbmQg
YSB1bnNlbGVjdGVkIG5vbi1kaXNhYmxlZAotICAgIC8vIG9wdGlvbiBhcyBmYWxsYmFjay4gVGhp
cyBiZWhhdmlvciBtYXRjaGVzIHRvIG90aGVyIGJyb3dzZXJzLgotICAgIHJldHVybiBzdWNjZXNz
ZnVsOwotfSAKLQotdm9pZCBTZWxlY3RFbGVtZW50OjpyZXNldChTZWxlY3RFbGVtZW50RGF0YSYg
ZGF0YSwgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBPcHRpb25FbGVtZW50KiBmaXJzdE9wdGlv
biA9IDA7Ci0gICAgT3B0aW9uRWxlbWVudCogc2VsZWN0ZWRPcHRpb24gPSAwOwotCi0gICAgY29u
c3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAg
T3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSk7
Ci0gICAgICAgIGlmICghb3B0aW9uRWxlbWVudCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgIGlmIChpdGVtc1tpXS0+ZmFzdEhhc0F0dHJpYnV0ZShIVE1MTmFtZXM6OnNlbGVjdGVk
QXR0cikpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbiAmJiAhZGF0YS5tdWx0aXBs
ZSgpKQotICAgICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uLT5zZXRTZWxlY3RlZFN0YXRlKGZh
bHNlKTsKLSAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQtPnNldFNlbGVjdGVkU3RhdGUodHJ1ZSk7
Ci0gICAgICAgICAgICBzZWxlY3RlZE9wdGlvbiA9IG9wdGlvbkVsZW1lbnQ7Ci0gICAgICAgIH0g
ZWxzZQotICAgICAgICAgICAgb3B0aW9uRWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7
Ci0KLSAgICAgICAgaWYgKCFmaXJzdE9wdGlvbikKLSAgICAgICAgICAgIGZpcnN0T3B0aW9uID0g
b3B0aW9uRWxlbWVudDsKLSAgICB9Ci0KLSAgICBpZiAoIXNlbGVjdGVkT3B0aW9uICYmIGZpcnN0
T3B0aW9uICYmICFkYXRhLm11bHRpcGxlKCkgJiYgZGF0YS5zaXplKCkgPD0gMSkKLSAgICAgICAg
Zmlyc3RPcHRpb24tPnNldFNlbGVjdGVkU3RhdGUodHJ1ZSk7Ci0KLSAgICBzZXRPcHRpb25zQ2hh
bmdlZE9uUmVuZGVyZXIoZGF0YSwgZWxlbWVudCk7Ci0gICAgZWxlbWVudC0+c2V0TmVlZHNTdHls
ZVJlY2FsYygpOwotfQotCi0jaWYgIVBMQVRGT1JNKFdJTikgfHwgT1MoV0lOQ0UpCi1ib29sIFNl
bGVjdEVsZW1lbnQ6OnBsYXRmb3JtSGFuZGxlS2V5ZG93bkV2ZW50KFNlbGVjdEVsZW1lbnREYXRh
JiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBLZXlib2FyZEV2ZW50KiBldmVudCkKLXsKLSNpZiBB
UlJPV19LRVlTX1BPUF9NRU5VCi0gICAgaWYgKCFpc1NwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZChl
bGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKSkgewotICAgICAgICBpZiAoZXZlbnQtPmtleUlk
ZW50aWZpZXIoKSA9PSAiRG93biIgfHwgZXZlbnQtPmtleUlkZW50aWZpZXIoKSA9PSAiVXAiKSB7
Ci0gICAgICAgICAgICBlbGVtZW50LT5mb2N1cygpOwotCi0gICAgICAgICAgICAvLyBDYWxsaW5n
IGZvY3VzKCkgbWF5IGNhdXNlIHVzIHRvIGxvc2Ugb3VyIHJlbmRlcmVyLiBSZXR1cm4gdHJ1ZSBz
byB0aGF0IG91ciBjYWxsZXIgZG9lc24ndCBwcm9jZXNzIHRoZSBldmVudAotICAgICAgICAgICAg
Ly8gZnVydGhlciwgYnV0IGRvbid0IHNldCB0aGUgZXZlbnQgYXMgaGFuZGxlZC4KLSAgICAgICAg
ICAgIGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKLQotICAgICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21w
YXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBldmVudHMg
ZHVyaW5nIHNldFNlbGVjdGVkSW5kZXgsCi0gICAgICAgICAgICAvLyB3aGljaCBnZXRzIGNhbGxl
ZCBmcm9tIFJlbmRlck1lbnVMaXN0Ojp2YWx1ZUNoYW5nZWQsIHdoaWNoIGdldHMgY2FsbGVkIGFm
dGVyIHRoZSB1c2VyIG1ha2VzIGEgc2VsZWN0aW9uIGZyb20gdGhlIG1lbnUuCi0gICAgICAgICAg
ICBzYXZlTGFzdFNlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChSZW5k
ZXJNZW51TGlzdCogbWVudUxpc3QgPSB0b1JlbmRlck1lbnVMaXN0KGVsZW1lbnQtPnJlbmRlcmVy
KCkpKQotICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAoKTsKLSAgICAgICAgICAg
IGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0
cnVlOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiBmYWxzZTsKLX0KLSNlbmRpZgotCi12b2lk
IFNlbGVjdEVsZW1lbnQ6Om1lbnVMaXN0RGVmYXVsdEV2ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50
RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgRXZlbnQqIGV2ZW50LCBIVE1MRm9ybUVsZW1l
bnQqIGh0bWxGb3JtKQotewotICAgIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5r
ZXlkb3duRXZlbnQpIHsKLSAgICAgICAgaWYgKCFlbGVtZW50LT5yZW5kZXJlcigpIHx8ICFldmVu
dC0+aXNLZXlib2FyZEV2ZW50KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYg
KHBsYXRmb3JtSGFuZGxlS2V5ZG93bkV2ZW50KGRhdGEsIGVsZW1lbnQsIHN0YXRpY19jYXN0PEtl
eWJvYXJkRXZlbnQqPihldmVudCkpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8v
IFdoZW4gdXNpbmcgc3BhdGlhbCBuYXZpZ2F0aW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gbmF2
aWdhdGUgYXdheSBmcm9tIHRoZSBzZWxlY3QgZWxlbWVudAotICAgICAgICAvLyB3aGVuIHRoZSB1
c2VyIGhpdHMgYW55IG9mIHRoZSBhcnJvdyBrZXlzLCBpbnN0ZWFkIG9mIGNoYW5naW5nIHRoZSBz
ZWxlY3Rpb24uCi0gICAgICAgIGlmIChpc1NwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZChlbGVtZW50
LT5kb2N1bWVudCgpLT5mcmFtZSgpKSkgewotICAgICAgICAgICAgaWYgKCFkYXRhLmFjdGl2ZVNl
bGVjdGlvblN0YXRlKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAg
ICAgICAgY29uc3QgU3RyaW5nJiBrZXlJZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRF
dmVudCo+KGV2ZW50KS0+a2V5SWRlbnRpZmllcigpOwotICAgICAgICBib29sIGhhbmRsZWQgPSBm
YWxzZTsKLQotICAgICAgICBVTlVTRURfUEFSQU0oaHRtbEZvcm0pOwotICAgICAgICBjb25zdCBW
ZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLQot
ICAgICAgICBpbnQgbGlzdEluZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwg
c2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50KSk7Ci0KLSAgICAgICAgaWYgKGtleUlkZW50aWZp
ZXIgPT0gIkRvd24iIHx8IGtleUlkZW50aWZpZXIgPT0gIlJpZ2h0IikgewotICAgICAgICAgICAg
bGlzdEluZGV4ID0gbmV4dFZhbGlkSW5kZXgobGlzdEl0ZW1zLCBsaXN0SW5kZXgsIFNraXBGb3J3
YXJkcywgMSk7Ci0gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlm
IChrZXlJZGVudGlmaWVyID09ICJVcCIgfHwga2V5SWRlbnRpZmllciA9PSAiTGVmdCIpIHsKLSAg
ICAgICAgICAgIGxpc3RJbmRleCA9IG5leHRWYWxpZEluZGV4KGxpc3RJdGVtcywgbGlzdEluZGV4
LCBTa2lwQmFja3dhcmRzLCAxKTsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAg
ICB9IGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIlBhZ2VEb3duIikgewotICAgICAgICAgICAg
bGlzdEluZGV4ID0gbmV4dFZhbGlkSW5kZXgobGlzdEl0ZW1zLCBsaXN0SW5kZXgsIFNraXBGb3J3
YXJkcywgMyk7Ci0gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlm
IChrZXlJZGVudGlmaWVyID09ICJQYWdlVXAiKSB7Ci0gICAgICAgICAgICBsaXN0SW5kZXggPSBu
ZXh0VmFsaWRJbmRleChsaXN0SXRlbXMsIGxpc3RJbmRleCwgU2tpcEJhY2t3YXJkcywgMyk7Ci0g
ICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChrZXlJZGVudGlm
aWVyID09ICJIb21lIikgewotICAgICAgICAgICAgbGlzdEluZGV4ID0gbmV4dFZhbGlkSW5kZXgo
bGlzdEl0ZW1zLCAtMSwgU2tpcEZvcndhcmRzLCAxKTsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0
cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIkVuZCIpIHsKLSAgICAg
ICAgICAgIGxpc3RJbmRleCA9IG5leHRWYWxpZEluZGV4KGxpc3RJdGVtcywgbGlzdEl0ZW1zLnNp
emUoKSwgU2tpcEJhY2t3YXJkcywgMSk7Ci0gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmIChoYW5kbGVkICYmIGxpc3RJbmRleCA+PSAwICYmIHN0YXRp
Y19jYXN0PHVuc2lnbmVkPihsaXN0SW5kZXgpIDwgbGlzdEl0ZW1zLnNpemUoKSkKLSAgICAgICAg
ICAgIHNldFNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCwgbGlzdFRvT3B0aW9uSW5kZXgoZGF0
YSwgZWxlbWVudCwgbGlzdEluZGV4KSk7Ci0KLSAgICAgICAgaWYgKGhhbmRsZWQpCi0gICAgICAg
ICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICB9Ci0KLSAgICAvLyBVc2Uga2V5
IHByZXNzIGV2ZW50IGhlcmUgc2luY2Ugc2VuZGluZyBzaW11bGF0ZWQgbW91c2UgZXZlbnRzCi0g
ICAgLy8gb24ga2V5IGRvd24gYmxvY2tzIHRoZSBwcm9wZXIgc2VuZGluZyBvZiB0aGUga2V5IHBy
ZXNzIGV2ZW50LgotICAgIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5rZXlwcmVz
c0V2ZW50KSB7Ci0gICAgICAgIGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSB8fCAhZXZlbnQtPmlz
S2V5Ym9hcmRFdmVudCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGludCBrZXlD
b2RlID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2ZW50KS0+a2V5Q29kZSgpOwotICAg
ICAgICBib29sIGhhbmRsZWQgPSBmYWxzZTsKLQotICAgICAgICBpZiAoa2V5Q29kZSA9PSAnICcg
JiYgaXNTcGF0aWFsTmF2aWdhdGlvbkVuYWJsZWQoZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUo
KSkpIHsKLSAgICAgICAgICAgIC8vIFVzZSBzcGFjZSB0byB0b2dnbGUgYXJyb3cga2V5IGhhbmRs
aW5nIGZvciBzZWxlY3Rpb24gY2hhbmdlIG9yIHNwYXRpYWwgbmF2aWdhdGlvbi4KLSAgICAgICAg
ICAgIGRhdGEuc2V0QWN0aXZlU2VsZWN0aW9uU3RhdGUoIWRhdGEuYWN0aXZlU2VsZWN0aW9uU3Rh
dGUoKSk7Ci0gICAgICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgfQotCi0jaWYgU1BBQ0VfT1JfUkVUVVJOX1BPUF9NRU5VCi0g
ICAgICAgIGlmIChrZXlDb2RlID09ICcgJyB8fCBrZXlDb2RlID09ICdccicpIHsKLSAgICAgICAg
ICAgIGVsZW1lbnQtPmZvY3VzKCk7Ci0KLSAgICAgICAgICAgIGlmICghZWxlbWVudC0+cmVuZGVy
ZXIoKSkgLy8gQ2FsbGluZyBmb2N1cygpIG1heSBjYXVzZSB1cyB0byBsb3NlIG91ciByZW5kZXJl
ciwgaW4gd2hpY2ggY2FzZSBkbyBub3Qgd2FudCB0byBoYW5kbGUgdGhlIGV2ZW50LgotICAgICAg
ICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNv
IGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5n
IGNoYW5nZSBldmVudHMgZHVyaW5nIHNldFNlbGVjdGVkSW5kZXgsCi0gICAgICAgICAgICAvLyB3
aGljaCBnZXRzIGNhbGxlZCBmcm9tIFJlbmRlck1lbnVMaXN0Ojp2YWx1ZUNoYW5nZWQsIHdoaWNo
IGdldHMgY2FsbGVkIGFmdGVyIHRoZSB1c2VyIG1ha2VzIGEgc2VsZWN0aW9uIGZyb20gdGhlIG1l
bnUuCi0gICAgICAgICAgICBzYXZlTGFzdFNlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsKLSAgICAg
ICAgICAgIGlmIChSZW5kZXJNZW51TGlzdCogbWVudUxpc3QgPSB0b1JlbmRlck1lbnVMaXN0KGVs
ZW1lbnQtPnJlbmRlcmVyKCkpKQotICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAo
KTsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICB9Ci0jZWxpZiBBUlJPV19L
RVlTX1BPUF9NRU5VCi0gICAgICAgIGlmIChrZXlDb2RlID09ICcgJykgewotICAgICAgICAgICAg
ZWxlbWVudC0+Zm9jdXMoKTsKLQotICAgICAgICAgICAgaWYgKCFlbGVtZW50LT5yZW5kZXJlcigp
KSAvLyBDYWxsaW5nIGZvY3VzKCkgbWF5IGNhdXNlIHVzIHRvIGxvc2Ugb3VyIHJlbmRlcmVyLCBp
biB3aGljaCBjYXNlIGRvIG5vdCB3YW50IHRvIGhhbmRsZSB0aGUgZXZlbnQuCi0gICAgICAgICAg
ICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAvLyBTYXZlIHRoZSBzZWxlY3Rpb24gc28gaXQg
Y2FuIGJlIGNvbXBhcmVkIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHdoZW4gZGlzcGF0Y2hpbmcgY2hh
bmdlIGV2ZW50cyBkdXJpbmcgc2V0U2VsZWN0ZWRJbmRleCwKLSAgICAgICAgICAgIC8vIHdoaWNo
IGdldHMgY2FsbGVkIGZyb20gUmVuZGVyTWVudUxpc3Q6OnZhbHVlQ2hhbmdlZCwgd2hpY2ggZ2V0
cyBjYWxsZWQgYWZ0ZXIgdGhlIHVzZXIgbWFrZXMgYSBzZWxlY3Rpb24gZnJvbSB0aGUgbWVudS4K
LSAgICAgICAgICAgIHNhdmVMYXN0U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOwotICAgICAgICAg
ICAgaWYgKFJlbmRlck1lbnVMaXN0KiBtZW51TGlzdCA9IHRvUmVuZGVyTWVudUxpc3QoZWxlbWVu
dC0+cmVuZGVyZXIoKSkpCi0gICAgICAgICAgICAgICAgbWVudUxpc3QtPnNob3dQb3B1cCgpOwot
ICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9
PSAnXHInKSB7Ci0gICAgICAgICAgICBpZiAoaHRtbEZvcm0pCi0gICAgICAgICAgICAgICAgaHRt
bEZvcm0tPnN1Ym1pdEltcGxpY2l0bHkoZXZlbnQsIGZhbHNlKTsKLSAgICAgICAgICAgIG1lbnVM
aXN0T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7Ci0gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsK
LSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaW50IGxpc3RJbmRleCA9IG9wdGlvblRvTGlzdElu
ZGV4KGRhdGEsIGVsZW1lbnQsIHNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCkpOwotICAgICAg
ICBpZiAoa2V5Q29kZSA9PSAnXHInKSB7Ci0gICAgICAgICAgICAvLyBsaXN0SW5kZXggc2hvdWxk
IGFscmVhZHkgYmUgc2VsZWN0ZWQsIGJ1dCB0aGlzIHdpbGwgZmlyZSB0aGUgb25jaGFuZ2UgaGFu
ZGxlci4KLSAgICAgICAgICAgIHNldFNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCwgbGlzdFRv
T3B0aW9uSW5kZXgoZGF0YSwgZWxlbWVudCwgbGlzdEluZGV4KSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAg
ICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGlmICho
YW5kbGVkKQotICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgfQot
Ci0gICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1vdXNlZG93bkV2ZW50ICYm
IGV2ZW50LT5pc01vdXNlRXZlbnQoKSAmJiBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZlbnQp
LT5idXR0b24oKSA9PSBMZWZ0QnV0dG9uKSB7Ci0gICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7Ci0g
ICAgICAgIGlmIChlbGVtZW50LT5yZW5kZXJlcigpICYmIGVsZW1lbnQtPnJlbmRlcmVyKCktPmlz
TWVudUxpc3QoKSkgewotICAgICAgICAgICAgaWYgKFJlbmRlck1lbnVMaXN0KiBtZW51TGlzdCA9
IHRvUmVuZGVyTWVudUxpc3QoZWxlbWVudC0+cmVuZGVyZXIoKSkpIHsKLSAgICAgICAgICAgICAg
ICBpZiAobWVudUxpc3QtPnBvcHVwSXNWaXNpYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgIG1l
bnVMaXN0LT5oaWRlUG9wdXAoKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
ICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0
aGUgbmV3IHNlbGVjdGlvbiB3aGVuIHdlIGNhbGwgb25DaGFuZ2UgZHVyaW5nIHNldFNlbGVjdGVk
SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGdldHMgY2FsbGVkIGZyb20gUmVu
ZGVyTWVudUxpc3Q6OnZhbHVlQ2hhbmdlZCwgd2hpY2ggZ2V0cyBjYWxsZWQgYWZ0ZXIgdGhlIHVz
ZXIgbWFrZXMgYSBzZWxlY3Rpb24gZnJvbSB0aGUgbWVudS4KLSAgICAgICAgICAgICAgICAgICAg
c2F2ZUxhc3RTZWxlY3Rpb24oZGF0YSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIG1l
bnVMaXN0LT5zaG93UG9wdXAoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci0gICAgfQotfQot
Ci12b2lkIFNlbGVjdEVsZW1lbnQ6OnVwZGF0ZVNlbGVjdGVkU3RhdGUoU2VsZWN0RWxlbWVudERh
dGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBsaXN0SW5kZXgsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtdWx0aSwgYm9vbCBzaGlmdCkKLXsKLSAg
ICBBU1NFUlQobGlzdEluZGV4ID49IDApOwotCi0gICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNv
IGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5n
IGNoYW5nZSBldmVudHMgZHVyaW5nIG1vdXNldXAsIG9yIGFmdGVyIGF1dG9zY3JvbGwgZmluaXNo
ZXMuCi0gICAgc2F2ZUxhc3RTZWxlY3Rpb24oZGF0YSwgZWxlbWVudCk7Ci0KLSAgICBkYXRhLnNl
dEFjdGl2ZVNlbGVjdGlvblN0YXRlKHRydWUpOwotCi0gICAgYm9vbCBzaGlmdFNlbGVjdCA9IGRh
dGEubXVsdGlwbGUoKSAmJiBzaGlmdDsKLSAgICBib29sIG11bHRpU2VsZWN0ID0gZGF0YS5tdWx0
aXBsZSgpICYmIG11bHRpICYmICFzaGlmdDsKLQotICAgIEVsZW1lbnQqIGNsaWNrZWRFbGVtZW50
ID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudClbbGlzdEluZGV4XTsKLSAgICBPcHRpb25FbGVtZW50
KiBvcHRpb24gPSB0b09wdGlvbkVsZW1lbnQoY2xpY2tlZEVsZW1lbnQpOwotICAgIGlmIChvcHRp
b24pIHsKLSAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB3aGV0aGVyIGFuIGFjdGl2ZSBzZWxlY3Rp
b24gKGxpa2UgZHVyaW5nIGRyYWcgc2VsZWN0aW9uKSwgc2hvdWxkIHNlbGVjdCBvciBkZXNlbGVj
dAotICAgICAgICBpZiAob3B0aW9uLT5zZWxlY3RlZCgpICYmIG11bHRpKQotICAgICAgICAgICAg
ZGF0YS5zZXRBY3RpdmVTZWxlY3Rpb25TdGF0ZShmYWxzZSk7Ci0KLSAgICAgICAgaWYgKCFkYXRh
LmFjdGl2ZVNlbGVjdGlvblN0YXRlKCkpCi0gICAgICAgICAgICBvcHRpb24tPnNldFNlbGVjdGVk
U3RhdGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8vIElmIHdlJ3JlIG5vdCBpbiBhbnkgc3BlY2lh
bCBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSwgdGhlbiBkZXNlbGVjdCBhbGwgb3RoZXIgaXRlbXMs
IGV4Y2x1ZGluZyB0aGUgY2xpY2tlZCBvcHRpb24uCi0gICAgLy8gSWYgbm8gb3B0aW9uIHdhcyBj
bGlja2VkLCB0aGVuIHRoaXMgd2lsbCBkZXNlbGVjdCBhbGwgaXRlbXMgaW4gdGhlIGxpc3QuCi0g
ICAgaWYgKCFzaGlmdFNlbGVjdCAmJiAhbXVsdGlTZWxlY3QpCi0gICAgICAgIGRlc2VsZWN0SXRl
bXMoZGF0YSwgZWxlbWVudCwgY2xpY2tlZEVsZW1lbnQpOwotCi0gICAgLy8gSWYgdGhlIGFuY2hv
ciBoYXNuJ3QgYmVlbiBzZXQsIGFuZCB3ZSdyZSBkb2luZyBhIHNpbmdsZSBzZWxlY3Rpb24gb3Ig
YSBzaGlmdCBzZWxlY3Rpb24sIHRoZW4gaW5pdGlhbGl6ZSB0aGUgYW5jaG9yIHRvIHRoZSBmaXJz
dCBzZWxlY3RlZCBpbmRleC4KLSAgICBpZiAoZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRl
eCgpIDwgMCAmJiAhbXVsdGlTZWxlY3QpCi0gICAgICAgIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hv
ckluZGV4KGRhdGEsIGVsZW1lbnQsIHNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCkpOwotCi0g
ICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIGNsaWNrZWQgb3B0aW9uCi0gICAg
aWYgKG9wdGlvbiAmJiAhY2xpY2tlZEVsZW1lbnQtPmRpc2FibGVkKCkpCi0gICAgICAgIG9wdGlv
bi0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKLQotICAgIC8vIElmIHRoZXJlIHdhcyBubyBzZWxl
Y3RlZEluZGV4KCkgZm9yIHRoZSBwcmV2aW91cyBpbml0aWFsaXphdGlvbiwgb3IKLSAgICAvLyBJ
ZiB3ZSdyZSBkb2luZyBhIHNpbmdsZSBzZWxlY3Rpb24sIG9yIGEgbXVsdGlwbGUgc2VsZWN0aW9u
ICh1c2luZyBjbWQgb3IgY3RybCksIHRoZW4gaW5pdGlhbGl6ZSB0aGUgYW5jaG9yIGluZGV4IHRv
IHRoZSBsaXN0SW5kZXggdGhhdCBqdXN0IGdvdCBjbGlja2VkLgotICAgIGlmIChkYXRhLmFjdGl2
ZVNlbGVjdGlvbkFuY2hvckluZGV4KCkgPCAwIHx8ICFzaGlmdFNlbGVjdCkKLSAgICAgICAgc2V0
QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoZGF0YSwgZWxlbWVudCwgbGlzdEluZGV4KTsKLQot
ICAgIHNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KGRhdGEsIGxpc3RJbmRleCk7Ci0gICAgdXBk
YXRlTGlzdEJveFNlbGVjdGlvbihkYXRhLCBlbGVtZW50LCAhbXVsdGlTZWxlY3QpOwotfQotCi12
b2lkIFNlbGVjdEVsZW1lbnQ6Omxpc3RCb3hEZWZhdWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1l
bnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBFdmVudCogZXZlbnQsIEhUTUxGb3JtRWxl
bWVudCogaHRtbEZvcm0pCi17Ci0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1z
ID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7Ci0KLSAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBl
dmVudE5hbWVzKCkubW91c2Vkb3duRXZlbnQgJiYgZXZlbnQtPmlzTW91c2VFdmVudCgpICYmIHN0
YXRpY19jYXN0PE1vdXNlRXZlbnQqPihldmVudCktPmJ1dHRvbigpID09IExlZnRCdXR0b24pIHsK
LSAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsKLQotICAgICAgICBpZiAoIWVsZW1lbnQtPnJlbmRl
cmVyKCkpIC8vIENhbGxpbmcgZm9jdXMoKSBtYXkgY2F1c2UgdXMgdG8gbG9zZSBvdXIgcmVuZGVy
ZXIsIGluIHdoaWNoIGNhc2UgZG8gbm90IHdhbnQgdG8gaGFuZGxlIHRoZSBldmVudC4KLSAgICAg
ICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBDb252ZXJ0IHRvIGNvb3JkcyByZWxhdGl2ZSB0
byB0aGUgbGlzdCBib3ggaWYgbmVlZGVkLgotICAgICAgICBNb3VzZUV2ZW50KiBtb3VzZUV2ZW50
ID0gc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2ZW50KTsKLSAgICAgICAgSW50UG9pbnQgbG9j
YWxPZmZzZXQgPSByb3VuZGVkSW50UG9pbnQoZWxlbWVudC0+cmVuZGVyZXIoKS0+YWJzb2x1dGVU
b0xvY2FsKG1vdXNlRXZlbnQtPmFic29sdXRlTG9jYXRpb24oKSwgZmFsc2UsIHRydWUpKTsKLSAg
ICAgICAgaW50IGxpc3RJbmRleCA9IHRvUmVuZGVyTGlzdEJveChlbGVtZW50LT5yZW5kZXJlcigp
KS0+bGlzdEluZGV4QXRPZmZzZXQodG9TaXplKGxvY2FsT2Zmc2V0KSk7Ci0gICAgICAgIGlmIChs
aXN0SW5kZXggPj0gMCkgewotI2lmIFBMQVRGT1JNKE1BQykgfHwgKFBMQVRGT1JNKENIUk9NSVVN
KSAmJiBPUyhEQVJXSU4pKQotICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRTdGF0ZShkYXRhLCBl
bGVtZW50LCBsaXN0SW5kZXgsIG1vdXNlRXZlbnQtPm1ldGFLZXkoKSwgbW91c2VFdmVudC0+c2hp
ZnRLZXkoKSk7Ci0jZWxzZQotICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRTdGF0ZShkYXRhLCBl
bGVtZW50LCBsaXN0SW5kZXgsIG1vdXNlRXZlbnQtPmN0cmxLZXkoKSwgbW91c2VFdmVudC0+c2hp
ZnRLZXkoKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBlbGVtZW50
LT5kb2N1bWVudCgpLT5mcmFtZSgpKQotICAgICAgICAgICAgICAgIGZyYW1lLT5ldmVudEhhbmRs
ZXIoKS0+c2V0TW91c2VEb3duTWF5U3RhcnRBdXRvc2Nyb2xsKCk7Ci0KLSAgICAgICAgICAgIGV2
ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChldmVu
dC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5tb3VzZXVwRXZlbnQgJiYgZXZlbnQtPmlzTW91c2VF
dmVudCgpICYmIHN0YXRpY19jYXN0PE1vdXNlRXZlbnQqPihldmVudCktPmJ1dHRvbigpID09IExl
ZnRCdXR0b24gJiYgZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCkt
PmF1dG9zY3JvbGxSZW5kZXJlcigpICE9IGVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKLSAgICAgICAg
Ly8gVGhpcyBtYWtlcyBzdXJlIHdlIGZpcmUgZGlzcGF0Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50
IGZvciBhIHNpbmdsZSBjbGljay4gIEZvciBkcmFnIHNlbGVjdGlvbiwgb25DaGFuZ2Ugd2lsbCBm
aXJlIHdoZW4gdGhlIGF1dG9zY3JvbGwgdGltZXIgc3RvcHMuCi0gICAgICAgIGxpc3RCb3hPbkNo
YW5nZShkYXRhLCBlbGVtZW50KTsKLSAgICB9IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZl
bnROYW1lcygpLmtleWRvd25FdmVudCkgewotICAgICAgICBpZiAoIWV2ZW50LT5pc0tleWJvYXJk
RXZlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY29uc3QgU3RyaW5nJiBrZXlJ
ZGVudGlmaWVyID0gc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVudCo+KGV2ZW50KS0+a2V5SWRlbnRp
ZmllcigpOwotCi0gICAgICAgIGJvb2wgaGFuZGxlZCA9IGZhbHNlOwotICAgICAgICBpbnQgZW5k
SW5kZXggPSAwOwotICAgICAgICBpZiAoZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpIDwg
MCkgewotICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZW5kIGluZGV4Ci0gICAgICAgICAg
ICBpZiAoa2V5SWRlbnRpZmllciA9PSAiRG93biIgfHwga2V5SWRlbnRpZmllciA9PSAiUGFnZURv
d24iKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0SW5kZXggPSBsYXN0U2VsZWN0ZWRMaXN0
SW5kZXgoZGF0YSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0g
ICAgICAgICAgICAgICAgaWYgKGtleUlkZW50aWZpZXIgPT0gIkRvd24iKQotICAgICAgICAgICAg
ICAgICAgICBlbmRJbmRleCA9IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQs
IHN0YXJ0SW5kZXgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAg
ZW5kSW5kZXggPSBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleFBhZ2VBd2F5KGRhdGEsIGVsZW1lbnQs
IHN0YXJ0SW5kZXgsIFNraXBGb3J3YXJkcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGtleUlk
ZW50aWZpZXIgPT0gIlVwIiB8fCBrZXlJZGVudGlmaWVyID09ICJQYWdlVXAiKSB7Ci0gICAgICAg
ICAgICAgICAgaW50IHN0YXJ0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChkYXRhLCBlbGVtZW50
LCBzZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1lbnQpKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVk
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5SWRlbnRpZmllciA9PSAiVXAiKQotICAg
ICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IHByZXZpb3VzU2VsZWN0YWJsZUxpc3RJbmRleChk
YXRhLCBlbGVtZW50LCBzdGFydEluZGV4KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgICAgIGVuZEluZGV4ID0gbmV4dFNlbGVjdGFibGVMaXN0SW5kZXhQYWdlQXdheShk
YXRhLCBlbGVtZW50LCBzdGFydEluZGV4LCBTa2lwQmFja3dhcmRzKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFNldCB0aGUgZW5kIGluZGV4IGJhc2Vk
IG9uIHRoZSBjdXJyZW50IGVuZCBpbmRleAotICAgICAgICAgICAgaWYgKGtleUlkZW50aWZpZXIg
PT0gIkRvd24iKSB7Ci0gICAgICAgICAgICAgICAgZW5kSW5kZXggPSBuZXh0U2VsZWN0YWJsZUxp
c3RJbmRleChkYXRhLCBlbGVtZW50LCBkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkpOwot
ICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChr
ZXlJZGVudGlmaWVyID09ICJVcCIpIHsKLSAgICAgICAgICAgICAgICBlbmRJbmRleCA9IHByZXZp
b3VzU2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBlbGVtZW50LCBkYXRhLmFjdGl2ZVNlbGVjdGlv
bkVuZEluZGV4KCkpOwotICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAg
ICAgfSBlbHNlIGlmIChrZXlJZGVudGlmaWVyID09ICJQYWdlRG93biIpIHsKLSAgICAgICAgICAg
ICAgICBlbmRJbmRleCA9IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4UGFnZUF3YXkoZGF0YSwgZWxl
bWVudCwgZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpLCBTa2lwRm9yd2FyZHMpOwotICAg
ICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlJ
ZGVudGlmaWVyID09ICJQYWdlVXAiKSB7Ci0gICAgICAgICAgICAgICAgZW5kSW5kZXggPSBuZXh0
U2VsZWN0YWJsZUxpc3RJbmRleFBhZ2VBd2F5KGRhdGEsIGVsZW1lbnQsIGRhdGEuYWN0aXZlU2Vs
ZWN0aW9uRW5kSW5kZXgoKSwgU2tpcEJhY2t3YXJkcyk7Ci0gICAgICAgICAgICAgICAgaGFuZGxl
ZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGtleUlkZW50
aWZpZXIgPT0gIkhvbWUiKSB7Ci0gICAgICAgICAgICBlbmRJbmRleCA9IGZpcnN0U2VsZWN0YWJs
ZUxpc3RJbmRleChkYXRhLCBlbGVtZW50KTsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwot
ICAgICAgICB9IGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIkVuZCIpIHsKLSAgICAgICAgICAg
IGVuZEluZGV4ID0gbGFzdFNlbGVjdGFibGVMaXN0SW5kZXgoZGF0YSwgZWxlbWVudCk7Ci0gICAg
ICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1NwYXRp
YWxOYXZpZ2F0aW9uRW5hYmxlZChlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKSkKLSAgICAg
ICAgICAgIC8vIENoZWNrIGlmIHRoZSBzZWxlY3Rpb24gbW92ZXMgdG8gdGhlIGJvdW5kYXJ5Lgot
ICAgICAgICAgICAgaWYgKGtleUlkZW50aWZpZXIgPT0gIkxlZnQiIHx8IGtleUlkZW50aWZpZXIg
PT0gIlJpZ2h0IiB8fCAoKGtleUlkZW50aWZpZXIgPT0gIkRvd24iIHx8IGtleUlkZW50aWZpZXIg
PT0gIlVwIikgJiYgZW5kSW5kZXggPT0gZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpKSkK
LSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKGVuZEluZGV4ID49IDAgJiYg
aGFuZGxlZCkgewotICAgICAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBi
ZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBl
dmVudHMgaW1tZWRpYXRlbHkgYWZ0ZXIgbWFraW5nIHRoZSBuZXcgc2VsZWN0aW9uLgotICAgICAg
ICAgICAgc2F2ZUxhc3RTZWxlY3Rpb24oZGF0YSwgZWxlbWVudCk7Ci0KLSAgICAgICAgICAgIEFT
U0VSVF9VTlVTRUQobGlzdEl0ZW1zLCAhbGlzdEl0ZW1zLnNpemUoKSB8fCAoZW5kSW5kZXggPj0g
MCAmJiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZW5kSW5kZXgpIDwgbGlzdEl0ZW1zLnNpemUoKSkp
OwotICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoZGF0YSwgZW5kSW5kZXgp
OwotCi0gICAgICAgICAgICBib29sIHNlbGVjdE5ld0l0ZW0gPSAhZGF0YS5tdWx0aXBsZSgpIHx8
IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihldmVudCktPnNoaWZ0S2V5KCkgfHwgIWlzU3Bh
dGlhbE5hdmlnYXRpb25FbmFibGVkKGVsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCkpOwotICAg
ICAgICAgICAgaWYgKHNlbGVjdE5ld0l0ZW0pCi0gICAgICAgICAgICAgICAgZGF0YS5zZXRBY3Rp
dmVTZWxlY3Rpb25TdGF0ZSh0cnVlKTsKLSAgICAgICAgICAgIC8vIElmIHRoZSBhbmNob3IgaXMg
dW5pdGlhbGl6ZWQsIG9yIGlmIHdlJ3JlIGdvaW5nIHRvIGRlc2VsZWN0IGFsbCBvdGhlciBvcHRp
b25zLCB0aGVuIHNldCB0aGUgYW5jaG9yIGluZGV4IGVxdWFsIHRvIHRoZSBlbmQgaW5kZXguCi0g
ICAgICAgICAgICBib29sIGRlc2VsZWN0T3RoZXJzID0gIWRhdGEubXVsdGlwbGUoKSB8fCAoIXN0
YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihldmVudCktPnNoaWZ0S2V5KCkgJiYgc2VsZWN0TmV3
SXRlbSk7Ci0gICAgICAgICAgICBpZiAoZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgp
IDwgMCB8fCBkZXNlbGVjdE90aGVycykgewotICAgICAgICAgICAgICAgIGlmIChkZXNlbGVjdE90
aGVycykKLSAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RJdGVtcyhkYXRhLCBlbGVtZW50KTsK
LSAgICAgICAgICAgICAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleChkYXRhLCBlbGVt
ZW50LCBkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkpOwotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICB0b1JlbmRlckxpc3RCb3goZWxlbWVudC0+cmVuZGVyZXIoKSktPnNjcm9sbFRv
UmV2ZWFsRWxlbWVudEF0TGlzdEluZGV4KGVuZEluZGV4KTsKLSAgICAgICAgICAgIGlmIChzZWxl
Y3ROZXdJdGVtKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGlzdEJveFNlbGVjdGlvbihkYXRh
LCBlbGVtZW50LCBkZXNlbGVjdE90aGVycyk7Ci0gICAgICAgICAgICAgICAgbGlzdEJveE9uQ2hh
bmdlKGRhdGEsIGVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAg
c2Nyb2xsVG9TZWxlY3Rpb24oZGF0YSwgZWxlbWVudCk7Ci0KLSAgICAgICAgICAgIGV2ZW50LT5z
ZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChldmVudC0+dHlw
ZSgpID09IGV2ZW50TmFtZXMoKS5rZXlwcmVzc0V2ZW50KSB7Ci0gICAgICAgIGlmICghZXZlbnQt
PmlzS2V5Ym9hcmRFdmVudCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQga2V5
Q29kZSA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihldmVudCktPmtleUNvZGUoKTsKLQot
ICAgICAgICBpZiAoa2V5Q29kZSA9PSAnXHInKSB7Ci0gICAgICAgICAgICBpZiAoaHRtbEZvcm0p
Ci0gICAgICAgICAgICAgICAgaHRtbEZvcm0tPnN1Ym1pdEltcGxpY2l0bHkoZXZlbnQsIGZhbHNl
KTsKLSAgICAgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICB9IGVs
c2UgaWYgKGRhdGEubXVsdGlwbGUoKSAmJiBrZXlDb2RlID09ICcgJyAmJiBpc1NwYXRpYWxOYXZp
Z2F0aW9uRW5hYmxlZChlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKSkgewotICAgICAgICAg
ICAgLy8gVXNlIHNwYWNlIHRvIHRvZ2dsZSBzZWxlY3Rpb24gY2hhbmdlLgotICAgICAgICAgICAg
ZGF0YS5zZXRBY3RpdmVTZWxlY3Rpb25TdGF0ZSghZGF0YS5hY3RpdmVTZWxlY3Rpb25TdGF0ZSgp
KTsKLSAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGVkU3RhdGUoZGF0YSwgZWxlbWVudCwgbGlzdFRv
T3B0aW9uSW5kZXgoZGF0YSwgZWxlbWVudCwgZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgp
KSwgdHJ1ZSAvKm11bHRpKi8sIGZhbHNlIC8qc2hpZnQqLyk7Ci0gICAgICAgICAgICBsaXN0Qm94
T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7Ci0gICAgICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhh
bmRsZWQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBTZWxlY3RFbGVtZW50OjpkZWZh
dWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50
LCBFdmVudCogZXZlbnQsIEhUTUxGb3JtRWxlbWVudCogaHRtbEZvcm0pCi17Ci0gICAgaWYgKCFl
bGVtZW50LT5yZW5kZXJlcigpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoZGF0YS51c2Vz
TWVudUxpc3QoKSkKLSAgICAgICAgbWVudUxpc3REZWZhdWx0RXZlbnRIYW5kbGVyKGRhdGEsIGVs
ZW1lbnQsIGV2ZW50LCBodG1sRm9ybSk7Ci0gICAgZWxzZSAKLSAgICAgICAgbGlzdEJveERlZmF1
bHRFdmVudEhhbmRsZXIoZGF0YSwgZWxlbWVudCwgZXZlbnQsIGh0bWxGb3JtKTsKLQotICAgIGlm
IChldmVudC0+ZGVmYXVsdEhhbmRsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGV2
ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleXByZXNzRXZlbnQgJiYgZXZlbnQtPmlzS2V5
Ym9hcmRFdmVudCgpKSB7Ci0gICAgICAgIEtleWJvYXJkRXZlbnQqIGtleWJvYXJkRXZlbnQgPSBz
dGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50Kj4oZXZlbnQpOwotICAgICAgICBpZiAoIWtleWJvYXJk
RXZlbnQtPmN0cmxLZXkoKSAmJiAha2V5Ym9hcmRFdmVudC0+YWx0S2V5KCkgJiYgIWtleWJvYXJk
RXZlbnQtPm1ldGFLZXkoKSAmJiBpc1ByaW50YWJsZUNoYXIoa2V5Ym9hcmRFdmVudC0+Y2hhckNv
ZGUoKSkpIHsKLSAgICAgICAgICAgIHR5cGVBaGVhZEZpbmQoZGF0YSwgZWxlbWVudCwga2V5Ym9h
cmRFdmVudCk7Ci0gICAgICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW50IFNlbGVjdEVsZW1lbnQ6
Omxhc3RTZWxlY3RlZExpc3RJbmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgY29u
c3QgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICAvLyByZXR1cm4gdGhlIG51bWJlciBvZiB0aGUg
bGFzdCBvcHRpb24gc2VsZWN0ZWQKLSAgICB1bnNpZ25lZCBpbmRleCA9IDA7Ci0gICAgYm9vbCBm
b3VuZCA9IGZhbHNlOwotICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5s
aXN0SXRlbXMoZWxlbWVudCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVtcy5zaXpl
KCk7ICsraSkgewotICAgICAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRv
T3B0aW9uRWxlbWVudChpdGVtc1tpXSkpIHsKLSAgICAgICAgICAgIGlmIChvcHRpb25FbGVtZW50
LT5zZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAg
ICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAg
IHJldHVybiBmb3VuZCA/IChpbnQpIGluZGV4IDogLTE7Ci19Ci0KLXN0YXRpYyBTdHJpbmcgc3Ry
aXBMZWFkaW5nV2hpdGVTcGFjZShjb25zdCBTdHJpbmcmIHN0cmluZykKLXsKLSAgICBpbnQgbGVu
Z3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCi0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8
IGxlbmd0aDsgKytpKSB7Ci0gICAgICAgIGlmIChzdHJpbmdbaV0gIT0gbm9CcmVha1NwYWNlICYm
IChzdHJpbmdbaV0gPD0gMHg3RiA/ICFpc0FTQ0lJU3BhY2Uoc3RyaW5nW2ldKSA6IChkaXJlY3Rp
b24oc3RyaW5nW2ldKSAhPSBXaGl0ZVNwYWNlTmV1dHJhbCkpKQotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoaSwgbGVuZ3RoIC0gaSk7Ci19
Ci0KLXZvaWQgU2VsZWN0RWxlbWVudDo6dHlwZUFoZWFkRmluZChTZWxlY3RFbGVtZW50RGF0YSYg
ZGF0YSwgRWxlbWVudCogZWxlbWVudCwgS2V5Ym9hcmRFdmVudCogZXZlbnQpCi17Ci0gICAgaWYg
KGV2ZW50LT50aW1lU3RhbXAoKSA8IGRhdGEubGFzdENoYXJUaW1lKCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIERPTVRpbWVTdGFtcCBkZWx0YSA9IGV2ZW50LT50aW1lU3RhbXAoKSAtIGRhdGEu
bGFzdENoYXJUaW1lKCk7Ci0gICAgZGF0YS5zZXRMYXN0Q2hhclRpbWUoZXZlbnQtPnRpbWVTdGFt
cCgpKTsKLQotICAgIFVDaGFyIGMgPSBldmVudC0+Y2hhckNvZGUoKTsKLQotICAgIFN0cmluZyBw
cmVmaXg7Ci0gICAgaW50IHNlYXJjaFN0YXJ0T2Zmc2V0ID0gMTsKLSAgICBpZiAoZGVsdGEgPiB0
eXBlQWhlYWRUaW1lb3V0KSB7Ci0gICAgICAgIHByZWZpeCA9IFN0cmluZygmYywgMSk7Ci0gICAg
ICAgIGRhdGEuc2V0VHlwZWRTdHJpbmcocHJlZml4KTsKLSAgICAgICAgZGF0YS5zZXRSZXBlYXRp
bmdDaGFyKGMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRhdGEudHlwZWRTdHJpbmcoKS5hcHBl
bmQoYyk7Ci0KLSAgICAgICAgaWYgKGMgPT0gZGF0YS5yZXBlYXRpbmdDaGFyKCkpCi0gICAgICAg
ICAgICAvLyBUaGUgdXNlciBpcyBsaWtlbHkgdHJ5aW5nIHRvIGN5Y2xlIHRocm91Z2ggYWxsIHRo
ZSBpdGVtcyBzdGFydGluZyB3aXRoIHRoaXMgY2hhcmFjdGVyLCBzbyBqdXN0IHNlYXJjaCBvbiB0
aGUgY2hhcmFjdGVyCi0gICAgICAgICAgICBwcmVmaXggPSBTdHJpbmcoJmMsIDEpOwotICAgICAg
ICBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEuc2V0UmVwZWF0aW5nQ2hhcigwKTsKLSAgICAgICAg
ICAgIHByZWZpeCA9IGRhdGEudHlwZWRTdHJpbmcoKTsKLSAgICAgICAgICAgIHNlYXJjaFN0YXJ0
T2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50
Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7Ci0gICAgaW50IGl0ZW1Db3VudCA9
IGl0ZW1zLnNpemUoKTsKLSAgICBpZiAoaXRlbUNvdW50IDwgMSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgaW50IHNlbGVjdGVkID0gc2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50KTsKLSAgICBp
bnQgaW5kZXggPSAob3B0aW9uVG9MaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgc2VsZWN0ZWQgPj0g
MCA/IHNlbGVjdGVkIDogMCkgKyBzZWFyY2hTdGFydE9mZnNldCkgJSBpdGVtQ291bnQ7Ci0gICAg
QVNTRVJUKGluZGV4ID49IDApOwotCi0gICAgLy8gQ29tcHV0ZSBhIGNhc2UtZm9sZGVkIGNvcHkg
b2YgdGhlIHByZWZpeCBzdHJpbmcgYmVmb3JlIGJlZ2lubmluZyB0aGUgc2VhcmNoIGZvcgotICAg
IC8vIGEgbWF0Y2hpbmcgZWxlbWVudC4gVGhpcyBjb2RlIHVzZXMgZm9sZENhc2UgdG8gd29yayBh
cm91bmQgdGhlIGZhY3QgdGhhdAotICAgIC8vIFN0cmluZzo6c3RhcnRXaXRoIGRvZXMgbm90IGZv
bGQgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuIFRoaXMgY29kZSBjYW4gYmUgY2hhbmdlZAotICAgIC8v
IHRvIHVzZSBzdGFydFdpdGggb25jZSB0aGF0IGlzIGZpeGVkLgotICAgIFN0cmluZyBwcmVmaXhX
aXRoQ2FzZUZvbGRlZChwcmVmaXguZm9sZENhc2UoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkg
PCBpdGVtQ291bnQ7ICsraSwgaW5kZXggPSAoaW5kZXggKyAxKSAlIGl0ZW1Db3VudCkgewotICAg
ICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1z
W2luZGV4XSk7Ci0gICAgICAgIGlmICghb3B0aW9uRWxlbWVudCB8fCBpdGVtc1tpbmRleF0tPmRp
c2FibGVkKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBGb2xkIHRoZSBv
cHRpb24gc3RyaW5nIGFuZCBjaGVjayBpZiBpdHMgcHJlZml4IGlzIGVxdWFsIHRvIHRoZSBmb2xk
ZWQgcHJlZml4LgotICAgICAgICBTdHJpbmcgdGV4dCA9IG9wdGlvbkVsZW1lbnQtPnRleHRJbmRl
bnRlZFRvUmVzcGVjdEdyb3VwTGFiZWwoKTsKLSAgICAgICAgaWYgKHN0cmlwTGVhZGluZ1doaXRl
U3BhY2UodGV4dCkuZm9sZENhc2UoKS5zdGFydHNXaXRoKHByZWZpeFdpdGhDYXNlRm9sZGVkKSkg
ewotICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50LCBsaXN0VG9PcHRp
b25JbmRleChkYXRhLCBlbGVtZW50LCBpbmRleCkpOwotICAgICAgICAgICAgaWYgKCFkYXRhLnVz
ZXNNZW51TGlzdCgpKQotICAgICAgICAgICAgICAgIGxpc3RCb3hPbkNoYW5nZShkYXRhLCBlbGVt
ZW50KTsKLQotICAgICAgICAgICAgc2V0T3B0aW9uc0NoYW5nZWRPblJlbmRlcmVyKGRhdGEsIGVs
ZW1lbnQpOwotICAgICAgICAgICAgZWxlbWVudC0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOwotICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFNlbGVjdEVsZW1l
bnQ6Omluc2VydGVkSW50b1RyZWUoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVs
ZW1lbnQpCi17Ci0gICAgLy8gV2hlbiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkIGR1cmluZyBkb2N1
bWVudCBwYXJzaW5nLCBpdCB3b24ndCBoYXZlIGFueSBpdGVtcyB5ZXQgLSBidXQgZm9yIGlubmVy
SFRNTAotICAgIC8vIGFuZCByZWxhdGVkIG1ldGhvZHMsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBh
ZnRlciB0aGUgd2hvbGUgc3VidHJlZSBpcyBjb25zdHJ1Y3RlZC4KLSAgICByZWNhbGNMaXN0SXRl
bXMoZGF0YSwgZWxlbWVudCwgdHJ1ZSk7Ci19Ci0KLXZvaWQgU2VsZWN0RWxlbWVudDo6YWNjZXNz
S2V5U2V0U2VsZWN0ZWRJbmRleChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxl
bWVudCwgaW50IGluZGV4KQoteyAgICAKLSAgICAvLyBmaXJzdCBicmluZyBpbnRvIGZvY3VzIHRo
ZSBsaXN0IGJveAotICAgIGlmICghZWxlbWVudC0+Zm9jdXNlZCgpKQotICAgICAgICBlbGVtZW50
LT5hY2Nlc3NLZXlBY3Rpb24oZmFsc2UpOwotICAgIAotICAgIC8vIGlmIHRoaXMgaW5kZXggaXMg
YWxyZWFkeSBzZWxlY3RlZCwgdW5zZWxlY3QuIG90aGVyd2lzZSB1cGRhdGUgdGhlIHNlbGVjdGVk
IGluZGV4Ci0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVt
cyhlbGVtZW50KTsKLSAgICBpbnQgbGlzdEluZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoZGF0YSwg
ZWxlbWVudCwgaW5kZXgpOwotICAgIGlmIChPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0g
KGxpc3RJbmRleCA+PSAwID8gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2xpc3RJbmRleF0pIDogMCkp
IHsKLSAgICAgICAgaWYgKG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVkKCkpCi0gICAgICAgICAgICBv
cHRpb25FbGVtZW50LT5zZXRTZWxlY3RlZFN0YXRlKGZhbHNlKTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50LCBpbmRleCwgZmFsc2UsIHRy
dWUpOwotICAgIH0KLQotICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKQotICAgICAgICBtZW51
TGlzdE9uQ2hhbmdlKGRhdGEsIGVsZW1lbnQpOwotICAgIGVsc2UKLSAgICAgICAgbGlzdEJveE9u
Q2hhbmdlKGRhdGEsIGVsZW1lbnQpOwotCi0gICAgc2Nyb2xsVG9TZWxlY3Rpb24oZGF0YSwgZWxl
bWVudCk7Ci19Ci0KLXVuc2lnbmVkIFNlbGVjdEVsZW1lbnQ6Om9wdGlvbkNvdW50KGNvbnN0IFNl
bGVjdEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIHVu
c2lnbmVkIG9wdGlvbnMgPSAwOwotCi0gICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMg
PSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
aXRlbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKGlzT3B0aW9uRWxlbWVudChpdGVtc1tp
XSkpCi0gICAgICAgICAgICArK29wdGlvbnM7Ci0gICAgfQotCi0gICAgcmV0dXJuIG9wdGlvbnM7
Ci19Ci0KIC8vIFNlbGVjdEVsZW1lbnREYXRhCiBTZWxlY3RFbGVtZW50RGF0YTo6U2VsZWN0RWxl
bWVudERhdGEoKQogICAgIDogbV9sYXN0Q2hhclRpbWUoMCkKQEAgLTEwNzEsNyArNzUsNyBAQCB2
b2lkIFNlbGVjdEVsZW1lbnREYXRhOjpjaGVja0xpc3RJdGVtcyhjCiB7CiAjaWYgIUFTU0VSVF9E
SVNBQkxFRAogICAgIFZlY3RvcjxFbGVtZW50Kj4gaXRlbXMgPSBtX2xpc3RJdGVtczsKLSAgICBT
ZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMoKmNvbnN0X2Nhc3Q8U2VsZWN0RWxlbWVudERh
dGEqPih0aGlzKSwgZWxlbWVudCwgZmFsc2UpOworICAgIEhUTUxTZWxlY3RFbGVtZW50OjpyZWNh
bGNMaXN0SXRlbXMoKmNvbnN0X2Nhc3Q8U2VsZWN0RWxlbWVudERhdGEqPih0aGlzKSwgZWxlbWVu
dCwgZmFsc2UpOwogICAgIEFTU0VSVChpdGVtcyA9PSBtX2xpc3RJdGVtcyk7CiAjZWxzZQogICAg
IFVOVVNFRF9QQVJBTShlbGVtZW50KTsKQEAgLTEwODEsNyArODUsNyBAQCB2b2lkIFNlbGVjdEVs
ZW1lbnREYXRhOjpjaGVja0xpc3RJdGVtcyhjCiBWZWN0b3I8RWxlbWVudCo+JiBTZWxlY3RFbGVt
ZW50RGF0YTo6bGlzdEl0ZW1zKGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCiB7CiAgICAgaWYgKG1f
cmVjYWxjTGlzdEl0ZW1zKQotICAgICAgICBTZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMo
KnRoaXMsIGVsZW1lbnQpOworICAgICAgICBIVE1MU2VsZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0
ZW1zKCp0aGlzLCBlbGVtZW50KTsKICAgICBlbHNlCiAgICAgICAgIGNoZWNrTGlzdEl0ZW1zKGVs
ZW1lbnQpOwogCkBAIC0xMDkxLDE4ICs5NSwxMSBAQCBWZWN0b3I8RWxlbWVudCo+JiBTZWxlY3RF
bGVtZW50RGF0YTo6bGlzCiBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBTZWxlY3RFbGVtZW50RGF0
YTo6bGlzdEl0ZW1zKGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0CiB7CiAgICAgaWYgKG1f
cmVjYWxjTGlzdEl0ZW1zKQotICAgICAgICBTZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMo
KmNvbnN0X2Nhc3Q8U2VsZWN0RWxlbWVudERhdGEqPih0aGlzKSwgZWxlbWVudCk7CisgICAgICAg
IEhUTUxTZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMoKmNvbnN0X2Nhc3Q8U2VsZWN0RWxl
bWVudERhdGEqPih0aGlzKSwgZWxlbWVudCk7CiAgICAgZWxzZQogICAgICAgICBjaGVja0xpc3RJ
dGVtcyhlbGVtZW50KTsKIAogICAgIHJldHVybiBtX2xpc3RJdGVtczsKIH0KIAotU2VsZWN0RWxl
bWVudCogdG9TZWxlY3RFbGVtZW50KEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgaWYgKGVsZW1l
bnQtPmlzSFRNTEVsZW1lbnQoKSAmJiBlbGVtZW50LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6c2Vs
ZWN0VGFnKSkKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4o
ZWxlbWVudCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Rv
bS9TZWxlY3RFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL1NlbGVj
dEVsZW1lbnQuaAkocmV2aXNpb24gOTY4ODcpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vU2VsZWN0
RWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw4OSArMzAsMTAgQEAKIAogbmFtZXNwYWNl
IFdlYkNvcmUgewogCi1jbGFzcyBBdHRyaWJ1dGU7CiBjbGFzcyBFbGVtZW50OwotY2xhc3MgRXZl
bnQ7Ci1jbGFzcyBGb3JtRGF0YUxpc3Q7Ci1jbGFzcyBIVE1MRm9ybUVsZW1lbnQ7Ci1jbGFzcyBL
ZXlib2FyZEV2ZW50OwotY2xhc3MgU2VsZWN0RWxlbWVudERhdGE7Ci0KLWNsYXNzIFNlbGVjdEVs
ZW1lbnQgewotcHVibGljOgotICAgIHZpcnR1YWwgYm9vbCBtdWx0aXBsZSgpIGNvbnN0ID0gMDsK
LQotICAgIHZpcnR1YWwgaW50IHNpemUoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBjb25zdCBW
ZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgbGlzdEJveE9uQ2hhbmdlKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVMaXN0Qm94
U2VsZWN0aW9uKGJvb2wgZGVzZWxlY3RPdGhlck9wdGlvbnMpID0gMDsKLQotICAgIHZpcnR1YWwg
dm9pZCBtZW51TGlzdE9uQ2hhbmdlKCkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQgYWN0aXZlU2Vs
ZWN0aW9uU3RhcnRMaXN0SW5kZXgoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBpbnQgYWN0aXZl
U2VsZWN0aW9uRW5kTGlzdEluZGV4KCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIHNl
dEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGludCBpbmRleCkgPSAwOwotICAgIHZpcnR1YWwg
dm9pZCBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChpbnQgaW5kZXgpID0gMDsKLQotICAgIHZp
cnR1YWwgaW50IGxpc3RUb09wdGlvbkluZGV4KGludCBsaXN0SW5kZXgpIGNvbnN0ID0gMDsKLSAg
ICB2aXJ0dWFsIGludCBvcHRpb25Ub0xpc3RJbmRleChpbnQgb3B0aW9uSW5kZXgpIGNvbnN0ID0g
MDsKLQotICAgIHZpcnR1YWwgaW50IHNlbGVjdGVkSW5kZXgoKSBjb25zdCA9IDA7Ci0gICAgdmly
dHVhbCB2b2lkIHNldFNlbGVjdGVkSW5kZXgoaW50IGluZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1
ZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTZWxlY3RlZEluZGV4QnlVc2VyKGludCBpbmRl
eCwgYm9vbCBkZXNlbGVjdCA9IHRydWUsIGJvb2wgZmlyZU9uQ2hhbmdlTm93ID0gZmFsc2UsIGJv
b2wgYWxsb3dNdWx0aXBsZVNlbGVjdGlvbiA9IGZhbHNlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgbGlzdEJveFNlbGVjdEl0ZW0oaW50IGxpc3RJbmRleCwgYm9vbCBhbGxvd011bHRpcGx5U2Vs
ZWN0aW9ucywgYm9vbCBzaGlmdCwgYm9vbCBmaXJlT25DaGFuZ2VOb3cgPSB0cnVlKSA9IDA7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlVmFsaWRpdHkoKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAg
ICB2aXJ0dWFsIH5TZWxlY3RFbGVtZW50KCkgeyB9Ci0KLSAgICBmcmllbmQgY2xhc3MgU2VsZWN0
RWxlbWVudERhdGE7Ci0KLSAgICBzdGF0aWMgdm9pZCBzZWxlY3RBbGwoU2VsZWN0RWxlbWVudERh
dGEmLCBFbGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgc2F2ZUxhc3RTZWxlY3Rpb24oU2VsZWN0
RWxlbWVudERhdGEmLCBFbGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgc2V0QWN0aXZlU2VsZWN0
aW9uQW5jaG9ySW5kZXgoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgaW50IGluZGV4KTsK
LSAgICBzdGF0aWMgdm9pZCBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChTZWxlY3RFbGVtZW50
RGF0YSYsIGludCBpbmRleCk7Ci0gICAgc3RhdGljIHZvaWQgdXBkYXRlTGlzdEJveFNlbGVjdGlv
bihTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBib29sIGRlc2VsZWN0T3RoZXJPcHRpb25z
KTsKLSAgICBzdGF0aWMgdm9pZCBsaXN0Qm94T25DaGFuZ2UoU2VsZWN0RWxlbWVudERhdGEmLCBF
bGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgbWVudUxpc3RPbkNoYW5nZShTZWxlY3RFbGVtZW50
RGF0YSYsIEVsZW1lbnQqKTsKLSAgICBzdGF0aWMgdm9pZCBzY3JvbGxUb1NlbGVjdGlvbihTZWxl
Y3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqKTsKLSAgICBzdGF0aWMgdm9pZCBzZXRSZWNhbGNMaXN0
SXRlbXMoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgcmVj
YWxjTGlzdEl0ZW1zKFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCosIGJvb2wgdXBk
YXRlU2VsZWN0ZWRTdGF0ZXMgPSB0cnVlKTsKLSAgICBzdGF0aWMgaW50IHNlbGVjdGVkSW5kZXgo
Y29uc3QgU2VsZWN0RWxlbWVudERhdGEmLCBjb25zdCBFbGVtZW50Kik7Ci0gICAgc3RhdGljIHZv
aWQgc2V0U2VsZWN0ZWRJbmRleChTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBpbnQgb3B0
aW9uSW5kZXgsIGJvb2wgZGVzZWxlY3QgPSB0cnVlLCBib29sIGZpcmVPbkNoYW5nZU5vdyA9IGZh
bHNlLCBib29sIHVzZXJEcml2ZW5DaGFuZ2UgPSB0cnVlKTsKLSAgICBzdGF0aWMgaW50IG9wdGlv
blRvTGlzdEluZGV4KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCosIGlu
dCBvcHRpb25JbmRleCk7Ci0gICAgc3RhdGljIGludCBsaXN0VG9PcHRpb25JbmRleChjb25zdCBT
ZWxlY3RFbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqLCBpbnQgbGlzdEluZGV4KTsKLSAgICBz
dGF0aWMgdm9pZCBkaXNwYXRjaEZvY3VzRXZlbnQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50
Kik7Ci0gICAgc3RhdGljIHZvaWQgZGlzcGF0Y2hCbHVyRXZlbnQoU2VsZWN0RWxlbWVudERhdGEm
LCBFbGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgZGVzZWxlY3RJdGVtcyhTZWxlY3RFbGVtZW50
RGF0YSYsIEVsZW1lbnQqLCBFbGVtZW50KiBleGNsdWRlRWxlbWVudCA9IDApOwotICAgIHN0YXRp
YyBib29sIHNhdmVGb3JtQ29udHJvbFN0YXRlKGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29u
c3QgRWxlbWVudCosIFN0cmluZyYgc3RhdGUpOwotICAgIHN0YXRpYyB2b2lkIHJlc3RvcmVGb3Jt
Q29udHJvbFN0YXRlKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIGNvbnN0IFN0cmluZyYg
c3RhdGUpOwotICAgIHN0YXRpYyB2b2lkIHBhcnNlTXVsdGlwbGVBdHRyaWJ1dGUoU2VsZWN0RWxl
bWVudERhdGEmLCBFbGVtZW50KiwgQXR0cmlidXRlKik7Ci0gICAgc3RhdGljIGJvb2wgYXBwZW5k
Rm9ybURhdGEoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgRm9ybURhdGFMaXN0Jik7Ci0g
ICAgc3RhdGljIHZvaWQgcmVzZXQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7Ci0gICAg
c3RhdGljIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1l
bnQqLCBFdmVudCosIEhUTUxGb3JtRWxlbWVudCopOwotICAgIHN0YXRpYyBpbnQgbGFzdFNlbGVj
dGVkTGlzdEluZGV4KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCopOwot
ICAgIHN0YXRpYyB2b2lkIHR5cGVBaGVhZEZpbmQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50
KiwgS2V5Ym9hcmRFdmVudCopOwotICAgIHN0YXRpYyB2b2lkIGluc2VydGVkSW50b1RyZWUoU2Vs
ZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgYWNjZXNzS2V5U2V0
U2VsZWN0ZWRJbmRleChTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBpbnQgaW5kZXgpOwot
ICAgIHN0YXRpYyB1bnNpZ25lZCBvcHRpb25Db3VudChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYs
IGNvbnN0IEVsZW1lbnQqKTsKLQotICAgIHN0YXRpYyB2b2lkIHVwZGF0ZVNlbGVjdGVkU3RhdGUo
U2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGludCBsaXN0SW5kZXgs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG11bHRpLCBib29sIHNo
aWZ0KTsKLSAKLXByaXZhdGU6Ci0gICAgc3RhdGljIHZvaWQgbWVudUxpc3REZWZhdWx0RXZlbnRI
YW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIEV2ZW50KiwgSFRNTEZvcm1FbGVt
ZW50Kik7Ci0gICAgc3RhdGljIGJvb2wgcGxhdGZvcm1IYW5kbGVLZXlkb3duRXZlbnQoU2VsZWN0
RWxlbWVudERhdGEmLCBFbGVtZW50KiwgS2V5Ym9hcmRFdmVudCopOwotICAgIHN0YXRpYyB2b2lk
IGxpc3RCb3hEZWZhdWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCos
IEV2ZW50KiwgSFRNTEZvcm1FbGVtZW50Kik7Ci0gICAgc3RhdGljIHZvaWQgc2V0T3B0aW9uc0No
YW5nZWRPblJlbmRlcmVyKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCopOwotfTsKIAogLy8g
SFRNTFNlbGVjdEVsZW1lbnQgaG9sZCB0aGlzIHN0cnVjdCBhcyBtZW1iZXIgdmFyaWFibGUKLS8v
IGFuZCBwYXNzIGl0IHRvIHRoZSBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucyBpbiBTZWxlY3RFbGVt
ZW50CisvLyBhbmQgcGFzcyBpdCB0byB0aGUgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMuCiBjbGFz
cyBTZWxlY3RFbGVtZW50RGF0YSB7CiBwdWJsaWM6CiAgICAgU2VsZWN0RWxlbWVudERhdGEoKTsK
QEAgLTE5MSw4ICsxMTIsNiBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9yZWNhbGNMaXN0SXRlbXM7
CiB9OwogCi1TZWxlY3RFbGVtZW50KiB0b1NlbGVjdEVsZW1lbnQoRWxlbWVudCopOwotCiB9CiAK
ICNlbmRpZgpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL1NlbGVjdEVsZW1lbnRXaW4uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9TZWxlY3RFbGVtZW50V2luLmNwcAkocmV2
aXNpb24gOTY4ODcpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vU2VsZWN0RWxlbWVudFdpbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAx
MSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJTZWxlY3RFbGVtZW50LmgiCi0KLSNpbmNsdWRlICJFbGVtZW50
LmgiCi0jaW5jbHVkZSAiS2V5Ym9hcmRFdmVudC5oIgotI2luY2x1ZGUgIlJlbmRlck1lbnVMaXN0
LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotYm9vbCBTZWxlY3RFbGVtZW50OjpwbGF0Zm9y
bUhhbmRsZUtleWRvd25FdmVudChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxl
bWVudCwgS2V5Ym9hcmRFdmVudCogZXZlbnQpCi17Ci0gICAgLy8gQWxsb3cgKFNoaWZ0KSBGNCBh
bmQgKEN0cmwvU2hpZnQpIEFsdC9BbHRHciArIFVwL0Rvd24gYXJyb3cgdG8gcG9wIHRoZSBtZW51
LCBtYXRjaGluZyBGaXJlZm94LgotICAgIGJvb2wgZXZlbnRTaG93c01lbnUgPSAoIWV2ZW50LT5h
bHRLZXkoKSAmJiAhZXZlbnQtPmN0cmxLZXkoKSAmJiBldmVudC0+a2V5SWRlbnRpZmllcigpID09
ICJGNCIpCi0gICAgICAgIHx8ICgoZXZlbnQtPmFsdEdyYXBoS2V5KCkgfHwgZXZlbnQtPmFsdEtl
eSgpKSAmJiAoZXZlbnQtPmtleUlkZW50aWZpZXIoKSA9PSAiRG93biIgfHwgZXZlbnQtPmtleUlk
ZW50aWZpZXIoKSA9PSAiVXAiKSk7Ci0gICAgaWYgKCFldmVudFNob3dzTWVudSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBj
b21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBldmVu
dHMgZHVyaW5nIHNldFNlbGVjdGVkSW5kZXgsCi0gICAgLy8gd2hpY2ggZ2V0cyBjYWxsZWQgZnJv
bSBSZW5kZXJNZW51TGlzdDo6dmFsdWVDaGFuZ2VkLCB3aGljaCBnZXRzIGNhbGxlZCBhZnRlciB0
aGUgdXNlciBtYWtlcyBhIHNlbGVjdGlvbiBmcm9tIHRoZSBtZW51LgotICAgIHNhdmVMYXN0U2Vs
ZWN0aW9uKGRhdGEsIGVsZW1lbnQpOwotICAgIGlmIChSZW5kZXJNZW51TGlzdCogbWVudUxpc3Qg
PSB0b1JlbmRlck1lbnVMaXN0KGVsZW1lbnQtPnJlbmRlcmVyKCkpKQotICAgICAgICBtZW51TGlz
dC0+c2hvd1BvcHVwKCk7Ci0KLSAgICBpbnQgaW5kZXggPSBzZWxlY3RlZEluZGV4KGRhdGEsIGVs
ZW1lbnQpOwotICAgIEFTU0VSVChpbmRleCA+PSAwKTsKLSAgICBBU1NFUlQoaW5kZXggPCBkYXRh
Lmxpc3RJdGVtcyhlbGVtZW50KS5zaXplKCkpOwotICAgIHNldFNlbGVjdGVkSW5kZXgoZGF0YSwg
ZWxlbWVudCwgaW5kZXgpOwotICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgIHJl
dHVybiB0cnVlOwotfQotCi19CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxTZWxlY3RF
bGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxTZWxlY3RF
bGVtZW50LmNwcAkocmV2aXNpb24gOTY4ODcpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxT
ZWxlY3RFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMyw5ICszLDEwIEBACiAgKiBDb3B5
cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKICAqICAgICAgICAgICAo
QykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKICAqICAgICAgICAgICAo
QykgMjAwMSBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykg
MjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDks
IDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogICAgICAgICAg
IChDKSAyMDA2IEFsZXhleSBQcm9za3VyeWFrb3YgKGFwQG55cG9wLmNvbSkKICAqIENvcHlyaWdo
dCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8v
d3d3LnRvcmNobW9iaWxlLmNvbS8pCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTI5LDE1ICszMCwy
NyBAQAogCiAjaW5jbHVkZSAiQVhPYmplY3RDYWNoZS5oIgogI2luY2x1ZGUgIkF0dHJpYnV0ZS5o
IgorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudC5oIgogI2luY2x1
ZGUgIkV2ZW50TmFtZXMuaCIKKyNpbmNsdWRlICJGb3JtRGF0YUxpc3QuaCIKKyNpbmNsdWRlICJG
cmFtZS5oIgorI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxOYW1l
cy5oIgogI2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE9wdGlv
bnNDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiS2V5Ym9hcmRFdmVudC5oIgorI2luY2x1ZGUgIk1v
dXNlRXZlbnQuaCIKKyNpbmNsdWRlICJPcHRpb25Hcm91cEVsZW1lbnQuaCIKKyNpbmNsdWRlICJQ
YWdlLmgiCiAjaW5jbHVkZSAiUmVuZGVyTGlzdEJveC5oIgogI2luY2x1ZGUgIlJlbmRlck1lbnVM
aXN0LmgiCiAjaW5jbHVkZSAiU2NyaXB0RXZlbnRMaXN0ZW5lci5oIgorI2luY2x1ZGUgIlNwYXRp
YWxOYXZpZ2F0aW9uLmgiCisjaW5jbHVkZSA8d3RmL3VuaWNvZGUvVW5pY29kZS5oPgogCiB1c2lu
ZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIFdURjo6VW5pY29kZTsKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCkBAIC00Niw2ICs1OSwyNiBAQCB1c2luZyBuYW1lc3BhY2UgSFRNTE5h
bWVzOwogLy8gVXBwZXIgbGltaXQgYWdyZWVkIHVwb24gd2l0aCByZXByZXNlbnRhdGl2ZXMgb2Yg
T3BlcmEgYW5kIE1vemlsbGEuCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4U2VsZWN0SXRlbXMg
PSAxMDAwMDsKIAorLy8gQ29uZmlndXJlIHBsYXRmb3JtLXNwZWNpZmljIGJlaGF2aW9yIHdoZW4g
Zm9jdXNlZCBwb3AtdXAgcmVjZWl2ZXMgYXJyb3cvc3BhY2UvcmV0dXJuIGtleXN0cm9rZS4KKy8v
IChQTEFURk9STShNQUMpIGFuZCBQTEFURk9STShHVEspIGFyZSBhbHdheXMgZmFsc2UgaW4gQ2hy
b21pdW0sIGhlbmNlIHRoZSBleHRyYSB0ZXN0cy4pCisjaWYgUExBVEZPUk0oTUFDKSB8fCAoUExB
VEZPUk0oQ0hST01JVU0pICYmIE9TKERBUldJTikpCisjZGVmaW5lIEFSUk9XX0tFWVNfUE9QX01F
TlUgMQorI2RlZmluZSBTUEFDRV9PUl9SRVRVUk5fUE9QX01FTlUgMAorI2VsaWYgUExBVEZPUk0o
R1RLKSB8fCAoUExBVEZPUk0oQ0hST01JVU0pICYmIE9TKFVOSVgpKQorI2RlZmluZSBBUlJPV19L
RVlTX1BPUF9NRU5VIDAKKyNkZWZpbmUgU1BBQ0VfT1JfUkVUVVJOX1BPUF9NRU5VIDEKKyNlbHNl
CisjZGVmaW5lIEFSUk9XX0tFWVNfUE9QX01FTlUgMAorI2RlZmluZSBTUEFDRV9PUl9SRVRVUk5f
UE9QX01FTlUgMAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBET01UaW1lU3RhbXAgdHlwZUFoZWFk
VGltZW91dCA9IDEwMDA7CisKK2VudW0gU2tpcERpcmVjdGlvbiB7CisgICAgU2tpcEJhY2t3YXJk
cyA9IC0xLAorICAgIFNraXBGb3J3YXJkcyA9IDEKK307CisKIEhUTUxTZWxlY3RFbGVtZW50OjpI
VE1MU2VsZWN0RWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCog
ZG9jdW1lbnQsIEhUTUxGb3JtRWxlbWVudCogZm9ybSkKICAgICA6IEhUTUxGb3JtQ29udHJvbEVs
ZW1lbnRXaXRoU3RhdGUodGFnTmFtZSwgZG9jdW1lbnQsIGZvcm0pCiB7CkBAIC02NywxOCArMTAw
LDE4IEBAIGNvbnN0IEF0b21pY1N0cmluZyYgSFRNTFNlbGVjdEVsZW1lbnQ6OmYKIAogaW50IEhU
TUxTZWxlY3RFbGVtZW50OjpzZWxlY3RlZEluZGV4KCkgY29uc3QKIHsKLSAgICByZXR1cm4gU2Vs
ZWN0RWxlbWVudDo6c2VsZWN0ZWRJbmRleChtX2RhdGEsIHRoaXMpOworICAgIHJldHVybiBzZWxl
Y3RlZEluZGV4KG1fZGF0YSwgdGhpcyk7CiB9CiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OmRl
c2VsZWN0SXRlbXMoSFRNTE9wdGlvbkVsZW1lbnQqIGV4Y2x1ZGVFbGVtZW50KQogewotICAgIFNl
bGVjdEVsZW1lbnQ6OmRlc2VsZWN0SXRlbXMobV9kYXRhLCB0aGlzLCBleGNsdWRlRWxlbWVudCk7
CisgICAgZGVzZWxlY3RJdGVtcyhtX2RhdGEsIHRoaXMsIGV4Y2x1ZGVFbGVtZW50KTsKICAgICBz
ZXROZWVkc1ZhbGlkaXR5Q2hlY2soKTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2V0
U2VsZWN0ZWRJbmRleChpbnQgb3B0aW9uSW5kZXgsIGJvb2wgZGVzZWxlY3QpCiB7Ci0gICAgU2Vs
ZWN0RWxlbWVudDo6c2V0U2VsZWN0ZWRJbmRleChtX2RhdGEsIHRoaXMsIG9wdGlvbkluZGV4LCBk
ZXNlbGVjdCwgZmFsc2UsIGZhbHNlKTsKKyAgICBzZXRTZWxlY3RlZEluZGV4KG1fZGF0YSwgdGhp
cywgb3B0aW9uSW5kZXgsIGRlc2VsZWN0LCBmYWxzZSwgZmFsc2UpOwogfQogCiB2b2lkIEhUTUxT
ZWxlY3RFbGVtZW50OjpzZXRTZWxlY3RlZEluZGV4QnlVc2VyKGludCBvcHRpb25JbmRleCwgYm9v
bCBkZXNlbGVjdCwgYm9vbCBmaXJlT25DaGFuZ2VOb3csIGJvb2wgYWxsb3dNdWx0aXBsZVNlbGVj
dGlvbikKQEAgLTEwMCw3ICsxMzMsNyBAQCB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpzZXRTZWxl
Y3RlZEluZGV4CiAgICAgaWYgKG9wdGlvbkluZGV4ID09IHNlbGVjdGVkSW5kZXgoKSkKICAgICAg
ICAgcmV0dXJuOwogICAgIAotICAgIFNlbGVjdEVsZW1lbnQ6OnNldFNlbGVjdGVkSW5kZXgobV9k
YXRhLCB0aGlzLCBvcHRpb25JbmRleCwgZGVzZWxlY3QsIGZpcmVPbkNoYW5nZU5vdywgdHJ1ZSk7
CisgICAgc2V0U2VsZWN0ZWRJbmRleChtX2RhdGEsIHRoaXMsIG9wdGlvbkluZGV4LCBkZXNlbGVj
dCwgZmlyZU9uQ2hhbmdlTm93LCB0cnVlKTsKIH0KIAogYm9vbCBIVE1MU2VsZWN0RWxlbWVudDo6
aGFzUGxhY2Vob2xkZXJMYWJlbE9wdGlvbigpIGNvbnN0CkBAIC0xNjEsMTIgKzE5NCwxMiBAQCBp
bnQgSFRNTFNlbGVjdEVsZW1lbnQ6OmFjdGl2ZVNlbGVjdGlvbkVuCiB7CiAgICAgaWYgKG1fZGF0
YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpID49IDApCiAgICAgICAgIHJldHVybiBtX2RhdGEu
YWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKTsKLSAgICByZXR1cm4gU2VsZWN0RWxlbWVudDo6bGFz
dFNlbGVjdGVkTGlzdEluZGV4KG1fZGF0YSwgdGhpcyk7CisgICAgcmV0dXJuIGxhc3RTZWxlY3Rl
ZExpc3RJbmRleChtX2RhdGEsIHRoaXMpOwogfQogCiB1bnNpZ25lZCBIVE1MU2VsZWN0RWxlbWVu
dDo6bGVuZ3RoKCkgY29uc3QKIHsKLSAgICByZXR1cm4gU2VsZWN0RWxlbWVudDo6b3B0aW9uQ291
bnQobV9kYXRhLCB0aGlzKTsKKyAgICByZXR1cm4gb3B0aW9uQ291bnQobV9kYXRhLCB0aGlzKTsK
IH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6YWRkKEhUTUxFbGVtZW50KiBlbGVtZW50LCBI
VE1MRWxlbWVudCogYmVmb3JlLCBFeGNlcHRpb25Db2RlJiBlYykKQEAgLTIzMCwxMiArMjYzLDEy
IEBAIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNldFZhbHVlKGNvbnN0IFMKIAogYm9vbCBIVE1M
U2VsZWN0RWxlbWVudDo6c2F2ZUZvcm1Db250cm9sU3RhdGUoU3RyaW5nJiB2YWx1ZSkgY29uc3QK
IHsKLSAgICByZXR1cm4gU2VsZWN0RWxlbWVudDo6c2F2ZUZvcm1Db250cm9sU3RhdGUobV9kYXRh
LCB0aGlzLCB2YWx1ZSk7CisgICAgcmV0dXJuIHNhdmVGb3JtQ29udHJvbFN0YXRlKG1fZGF0YSwg
dGhpcywgdmFsdWUpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpyZXN0b3JlRm9ybUNv
bnRyb2xTdGF0ZShjb25zdCBTdHJpbmcmIHN0YXRlKQogewotICAgIFNlbGVjdEVsZW1lbnQ6OnJl
c3RvcmVGb3JtQ29udHJvbFN0YXRlKG1fZGF0YSwgdGhpcywgc3RhdGUpOworICAgIHJlc3RvcmVG
b3JtQ29udHJvbFN0YXRlKG1fZGF0YSwgdGhpcywgc3RhdGUpOwogICAgIHNldE5lZWRzVmFsaWRp
dHlDaGVjaygpOwogfQogCkBAIC0yNjIsNyArMjk1LDcgQEAgdm9pZCBIVE1MU2VsZWN0RWxlbWVu
dDo6cGFyc2VNYXBwZWRBdHRyaQogICAgICAgICAgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKCk7CiAg
ICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtdWx0aXBsZUF0dHIpCi0g
ICAgICAgIFNlbGVjdEVsZW1lbnQ6OnBhcnNlTXVsdGlwbGVBdHRyaWJ1dGUobV9kYXRhLCB0aGlz
LCBhdHRyKTsKKyAgICAgICAgcGFyc2VNdWx0aXBsZUF0dHJpYnV0ZShtX2RhdGEsIHRoaXMsIGF0
dHIpOwogICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhY2Nlc3NrZXlBdHRyKSB7CiAgICAg
ICAgIC8vIEZJWE1FOiBpZ25vcmUgZm9yIHRoZSBtb21lbnQKICAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBhbGlnbkF0dHIpIHsKQEAgLTI5NSw3ICszMjgsNyBAQCBib29sIEhUTUxTZWxl
Y3RFbGVtZW50OjpjYW5TZWxlY3RBbGwoKSBjCiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNl
bGVjdEFsbCgpCiB7Ci0gICAgU2VsZWN0RWxlbWVudDo6c2VsZWN0QWxsKG1fZGF0YSwgdGhpcyk7
CisgICAgc2VsZWN0QWxsKG1fZGF0YSwgdGhpcyk7CiAgICAgc2V0TmVlZHNWYWxpZGl0eUNoZWNr
KCk7CiB9CiAKQEAgLTMwOCwxNyArMzQxLDE3IEBAIFJlbmRlck9iamVjdCogSFRNTFNlbGVjdEVs
ZW1lbnQ6OmNyZWF0ZVIKIAogYm9vbCBIVE1MU2VsZWN0RWxlbWVudDo6YXBwZW5kRm9ybURhdGEo
Rm9ybURhdGFMaXN0JiBsaXN0LCBib29sKQogewotICAgIHJldHVybiBTZWxlY3RFbGVtZW50Ojph
cHBlbmRGb3JtRGF0YShtX2RhdGEsIHRoaXMsIGxpc3QpOworICAgIHJldHVybiBhcHBlbmRGb3Jt
RGF0YShtX2RhdGEsIHRoaXMsIGxpc3QpOwogfQogCiBpbnQgSFRNTFNlbGVjdEVsZW1lbnQ6Om9w
dGlvblRvTGlzdEluZGV4KGludCBvcHRpb25JbmRleCkgY29uc3QKIHsKLSAgICByZXR1cm4gU2Vs
ZWN0RWxlbWVudDo6b3B0aW9uVG9MaXN0SW5kZXgobV9kYXRhLCB0aGlzLCBvcHRpb25JbmRleCk7
CisgICAgcmV0dXJuIG9wdGlvblRvTGlzdEluZGV4KG1fZGF0YSwgdGhpcywgb3B0aW9uSW5kZXgp
OwogfQogCiBpbnQgSFRNTFNlbGVjdEVsZW1lbnQ6Omxpc3RUb09wdGlvbkluZGV4KGludCBsaXN0
SW5kZXgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIFNlbGVjdEVsZW1lbnQ6Omxpc3RUb09wdGlvbklu
ZGV4KG1fZGF0YSwgdGhpcywgbGlzdEluZGV4KTsKKyAgICByZXR1cm4gbGlzdFRvT3B0aW9uSW5k
ZXgobV9kYXRhLCB0aGlzLCBsaXN0SW5kZXgpOwogfQogCiBQYXNzUmVmUHRyPEhUTUxPcHRpb25z
Q29sbGVjdGlvbj4gSFRNTFNlbGVjdEVsZW1lbnQ6Om9wdGlvbnMoKQpAQCAtMzI4LDcgKzM2MSw3
IEBAIFBhc3NSZWZQdHI8SFRNTE9wdGlvbnNDb2xsZWN0aW9uPiBIVE1MU2UKIAogdm9pZCBIVE1M
U2VsZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zKGJvb2wgdXBkYXRlU2VsZWN0ZWRTdGF0ZXMp
IGNvbnN0CiB7Ci0gICAgU2VsZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zKGNvbnN0X2Nhc3Q8
U2VsZWN0RWxlbWVudERhdGEmPihtX2RhdGEpLCB0aGlzLCB1cGRhdGVTZWxlY3RlZFN0YXRlcyk7
CisgICAgcmVjYWxjTGlzdEl0ZW1zKGNvbnN0X2Nhc3Q8U2VsZWN0RWxlbWVudERhdGEmPihtX2Rh
dGEpLCB0aGlzLCB1cGRhdGVTZWxlY3RlZFN0YXRlcyk7CiB9CiAKIHZvaWQgSFRNTFNlbGVjdEVs
ZW1lbnQ6OnJlY2FsY0xpc3RJdGVtc0lmTmVlZGVkKCkKQEAgLTM0OSw3ICszODIsNyBAQCB2b2lk
IEhUTUxTZWxlY3RFbGVtZW50OjpjaGlsZHJlbkNoYW5nZWQoCiAKIHZvaWQgSFRNTFNlbGVjdEVs
ZW1lbnQ6OnNldFJlY2FsY0xpc3RJdGVtcygpCiB7Ci0gICAgU2VsZWN0RWxlbWVudDo6c2V0UmVj
YWxjTGlzdEl0ZW1zKG1fZGF0YSwgdGhpcyk7CisgICAgc2V0UmVjYWxjTGlzdEl0ZW1zKG1fZGF0
YSwgdGhpcyk7CiAKICAgICBpZiAoIWluRG9jdW1lbnQoKSkKICAgICAgICAgbV9jb2xsZWN0aW9u
SW5mby5yZXNldCgpOwpAQCAtMzU3LDI1ICszOTAsMjUgQEAgdm9pZCBIVE1MU2VsZWN0RWxlbWVu
dDo6c2V0UmVjYWxjTGlzdEl0ZQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpyZXNldCgpCiB7
Ci0gICAgU2VsZWN0RWxlbWVudDo6cmVzZXQobV9kYXRhLCB0aGlzKTsKKyAgICByZXNldChtX2Rh
dGEsIHRoaXMpOwogICAgIHNldE5lZWRzVmFsaWRpdHlDaGVjaygpOwogfQogCiB2b2lkIEhUTUxT
ZWxlY3RFbGVtZW50OjpkaXNwYXRjaEZvY3VzRXZlbnQoUGFzc1JlZlB0cjxOb2RlPiBvbGRGb2N1
c2VkTm9kZSkKIHsKLSAgICBTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEZvY3VzRXZlbnQobV9kYXRh
LCB0aGlzKTsKKyAgICBkaXNwYXRjaEZvY3VzRXZlbnQobV9kYXRhLCB0aGlzKTsKICAgICBIVE1M
Rm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjpkaXNwYXRjaEZvY3VzRXZlbnQob2xkRm9jdXNl
ZE5vZGUpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEJsdXJFdmVudChQ
YXNzUmVmUHRyPE5vZGU+IG5ld0ZvY3VzZWROb2RlKQogewotICAgIFNlbGVjdEVsZW1lbnQ6OmRp
c3BhdGNoQmx1ckV2ZW50KG1fZGF0YSwgdGhpcyk7CisgICAgZGlzcGF0Y2hCbHVyRXZlbnQobV9k
YXRhLCB0aGlzKTsKICAgICBIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0YXRlOjpkaXNwYXRj
aEJsdXJFdmVudChuZXdGb2N1c2VkTm9kZSk7CiB9CiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6
OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnQqIGV2ZW50KQogewotICAgIFNlbGVjdEVsZW1lbnQ6
OmRlZmF1bHRFdmVudEhhbmRsZXIobV9kYXRhLCB0aGlzLCBldmVudCwgZm9ybSgpKTsKKyAgICBk
ZWZhdWx0RXZlbnRIYW5kbGVyKG1fZGF0YSwgdGhpcywgZXZlbnQsIGZvcm0oKSk7CiAgICAgaWYg
KGV2ZW50LT5kZWZhdWx0SGFuZGxlZCgpKQogICAgICAgICByZXR1cm47CiAgICAgSFRNTEZvcm1D
b250cm9sRWxlbWVudFdpdGhTdGF0ZTo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldmVudCk7CkBAIC0z
ODMsMzMgKzQxNiwzMyBAQCB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkZWZhdWx0RXZlbnRIYW5k
CiAKIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4
KGludCBpbmRleCkKIHsKLSAgICBTZWxlY3RFbGVtZW50OjpzZXRBY3RpdmVTZWxlY3Rpb25BbmNo
b3JJbmRleChtX2RhdGEsIHRoaXMsIGluZGV4KTsKKyAgICBzZXRBY3RpdmVTZWxlY3Rpb25BbmNo
b3JJbmRleChtX2RhdGEsIHRoaXMsIGluZGV4KTsKIH0KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVu
dDo6c2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoaW50IGluZGV4KQogewotICAgIFNlbGVjdEVs
ZW1lbnQ6OnNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KG1fZGF0YSwgaW5kZXgpOworICAgIHNl
dEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KG1fZGF0YSwgaW5kZXgpOwogfQogCiB2b2lkIEhUTUxT
ZWxlY3RFbGVtZW50Ojp1cGRhdGVMaXN0Qm94U2VsZWN0aW9uKGJvb2wgZGVzZWxlY3RPdGhlck9w
dGlvbnMpCiB7Ci0gICAgU2VsZWN0RWxlbWVudDo6dXBkYXRlTGlzdEJveFNlbGVjdGlvbihtX2Rh
dGEsIHRoaXMsIGRlc2VsZWN0T3RoZXJPcHRpb25zKTsKKyAgICB1cGRhdGVMaXN0Qm94U2VsZWN0
aW9uKG1fZGF0YSwgdGhpcywgZGVzZWxlY3RPdGhlck9wdGlvbnMpOwogICAgIHNldE5lZWRzVmFs
aWRpdHlDaGVjaygpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjptZW51TGlzdE9uQ2hh
bmdlKCkKIHsKLSAgICBTZWxlY3RFbGVtZW50OjptZW51TGlzdE9uQ2hhbmdlKG1fZGF0YSwgdGhp
cyk7CisgICAgbWVudUxpc3RPbkNoYW5nZShtX2RhdGEsIHRoaXMpOwogfQogCiB2b2lkIEhUTUxT
ZWxlY3RFbGVtZW50OjpsaXN0Qm94T25DaGFuZ2UoKQogewotICAgIFNlbGVjdEVsZW1lbnQ6Omxp
c3RCb3hPbkNoYW5nZShtX2RhdGEsIHRoaXMpOworICAgIGxpc3RCb3hPbkNoYW5nZShtX2RhdGEs
IHRoaXMpOwogfQogCiB2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpzYXZlTGFzdFNlbGVjdGlvbigp
CiB7Ci0gICAgU2VsZWN0RWxlbWVudDo6c2F2ZUxhc3RTZWxlY3Rpb24obV9kYXRhLCB0aGlzKTsK
KyAgICBzYXZlTGFzdFNlbGVjdGlvbihtX2RhdGEsIHRoaXMpOwogfQogCiB2b2lkIEhUTUxTZWxl
Y3RFbGVtZW50OjphY2Nlc3NLZXlBY3Rpb24oYm9vbCBzZW5kVG9BbnlFbGVtZW50KQpAQCAtNDIw
LDcgKzQ1Myw3IEBAIHZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OmFjY2Vzc0tleUFjdGlvbigKIAog
dm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6YWNjZXNzS2V5U2V0U2VsZWN0ZWRJbmRleChpbnQgaW5k
ZXgpCiB7Ci0gICAgU2VsZWN0RWxlbWVudDo6YWNjZXNzS2V5U2V0U2VsZWN0ZWRJbmRleChtX2Rh
dGEsIHRoaXMsIGluZGV4KTsKKyAgICBhY2Nlc3NLZXlTZXRTZWxlY3RlZEluZGV4KG1fZGF0YSwg
dGhpcywgaW5kZXgpOwogfQogICAgIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2V0TXVsdGlw
bGUoYm9vbCBtdWx0aXBsZSkKQEAgLTUxNSwxMiArNTQ4LDEyIEBAIHZvaWQgSFRNTFNlbGVjdEVs
ZW1lbnQ6OnNldExlbmd0aCh1bnNpZ24KIAogdm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2Nyb2xs
VG9TZWxlY3Rpb24oKQogewotICAgIFNlbGVjdEVsZW1lbnQ6OnNjcm9sbFRvU2VsZWN0aW9uKG1f
ZGF0YSwgdGhpcyk7CisgICAgc2Nyb2xsVG9TZWxlY3Rpb24obV9kYXRhLCB0aGlzKTsKIH0KIAog
dm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6aW5zZXJ0ZWRJbnRvVHJlZShib29sIGRlZXApCiB7Ci0g
ICAgU2VsZWN0RWxlbWVudDo6aW5zZXJ0ZWRJbnRvVHJlZShtX2RhdGEsIHRoaXMpOworICAgIGlu
c2VydGVkSW50b1RyZWUobV9kYXRhLCB0aGlzKTsKICAgICBIVE1MRm9ybUNvbnRyb2xFbGVtZW50
V2l0aFN0YXRlOjppbnNlcnRlZEludG9UcmVlKGRlZXApOwogfQogCkBAIC01MjksNCArNTYyLDEw
MTggQEAgYm9vbCBIVE1MU2VsZWN0RWxlbWVudDo6aXNSZXF1aXJlZEZvcm1DbwogICAgIHJldHVy
biByZXF1aXJlZCgpOwogfQogCisvLyBSZXR1cm5zIHRoZSAxc3QgdmFsaWQgaXRlbSB8c2tpcHwg
aXRlbXMgZnJvbSB8bGlzdEluZGV4fCBpbiBkaXJlY3Rpb24gfGRpcmVjdGlvbnwgaWYgdGhlcmUg
aXMgb25lLgorLy8gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRoZSB2YWxpZCBpdGVtIGNsb3Nlc3Qg
dG8gdGhhdCBib3VuZGFyeSB3aGljaCBpcyBwYXN0IHxsaXN0SW5kZXh8IGlmIHRoZXJlIGlzIG9u
ZS4KKy8vIE90aGVyd2lzZSwgaXQgcmV0dXJucyB8bGlzdEluZGV4fC4KKy8vIFZhbGlkIG1lYW5z
IHRoYXQgaXQgaXMgZW5hYmxlZCBhbmQgYW4gb3B0aW9uIGVsZW1lbnQuCitzdGF0aWMgaW50IG5l
eHRWYWxpZEluZGV4KGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcywgaW50IGxpc3RJ
bmRleCwgU2tpcERpcmVjdGlvbiBkaXJlY3Rpb24sIGludCBza2lwKQoreworICAgIEFTU0VSVChk
aXJlY3Rpb24gPT0gLTEgfHwgZGlyZWN0aW9uID09IDEpOworICAgIGludCBsYXN0R29vZEluZGV4
ID0gbGlzdEluZGV4OworICAgIGludCBzaXplID0gbGlzdEl0ZW1zLnNpemUoKTsKKyAgICBmb3Ig
KGxpc3RJbmRleCArPSBkaXJlY3Rpb247IGxpc3RJbmRleCA+PSAwICYmIGxpc3RJbmRleCA8IHNp
emU7IGxpc3RJbmRleCArPSBkaXJlY3Rpb24pIHsKKyAgICAgICAgLS1za2lwOworICAgICAgICBp
ZiAoIWxpc3RJdGVtc1tsaXN0SW5kZXhdLT5kaXNhYmxlZCgpICYmIGlzT3B0aW9uRWxlbWVudChs
aXN0SXRlbXNbbGlzdEluZGV4XSkpIHsKKyAgICAgICAgICAgIGxhc3RHb29kSW5kZXggPSBsaXN0
SW5kZXg7CisgICAgICAgICAgICBpZiAoc2tpcCA8PSAwKQorICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsYXN0R29vZEluZGV4OworfQorCitzdGF0
aWMgaW50IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBF
bGVtZW50KiBlbGVtZW50LCBpbnQgc3RhcnRJbmRleCkKK3sKKyAgICByZXR1cm4gbmV4dFZhbGlk
SW5kZXgoZGF0YS5saXN0SXRlbXMoZWxlbWVudCksIHN0YXJ0SW5kZXgsIFNraXBGb3J3YXJkcywg
MSk7Cit9CisKK3N0YXRpYyBpbnQgcHJldmlvdXNTZWxlY3RhYmxlTGlzdEluZGV4KFNlbGVjdEVs
ZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBpbnQgc3RhcnRJbmRleCkKK3sKKyAg
ICBpZiAoc3RhcnRJbmRleCA9PSAtMSkKKyAgICAgICAgc3RhcnRJbmRleCA9IGRhdGEubGlzdEl0
ZW1zKGVsZW1lbnQpLnNpemUoKTsKKyAgICByZXR1cm4gbmV4dFZhbGlkSW5kZXgoZGF0YS5saXN0
SXRlbXMoZWxlbWVudCksIHN0YXJ0SW5kZXgsIFNraXBCYWNrd2FyZHMsIDEpOworfQorCitzdGF0
aWMgaW50IGZpcnN0U2VsZWN0YWJsZUxpc3RJbmRleChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwg
RWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9
IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGludCBpbmRleCA9IG5leHRWYWxpZEluZGV4
KGl0ZW1zLCBpdGVtcy5zaXplKCksIFNraXBCYWNrd2FyZHMsIElOVF9NQVgpOworICAgIGlmIChz
dGF0aWNfY2FzdDx1bnNpZ25lZD4oaW5kZXgpID09IGl0ZW1zLnNpemUoKSkKKyAgICAgICAgcmV0
dXJuIC0xOworICAgIHJldHVybiBpbmRleDsKK30KKworc3RhdGljIGludCBsYXN0U2VsZWN0YWJs
ZUxpc3RJbmRleChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKK3sK
KyAgICByZXR1cm4gbmV4dFZhbGlkSW5kZXgoZGF0YS5saXN0SXRlbXMoZWxlbWVudCksIC0xLCBT
a2lwRm9yd2FyZHMsIElOVF9NQVgpOworfQorCisvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUg
bmV4dCB2YWxpZCBpdGVtIG9uZSBwYWdlIGF3YXkgZnJvbSB8c3RhcnRJbmRleHwgaW4gZGlyZWN0
aW9uIHxkaXJlY3Rpb258Lgorc3RhdGljIGludCBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleFBhZ2VB
d2F5KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBpbnQgc3RhcnRJ
bmRleCwgU2tpcERpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgY29uc3QgVmVjdG9yPEVsZW1l
bnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKyAgICAvLyBDYW4ndCB1c2Ug
ZGF0YS0+c2l6ZSgpIGJlY2F1c2UgcmVuZGVyZXIgZm9yY2VzIGEgbWluaW11bSBzaXplLgorICAg
IGludCBwYWdlU2l6ZSA9IDA7CisgICAgaWYgKGVsZW1lbnQtPnJlbmRlcmVyKCktPmlzTGlzdEJv
eCgpKQorICAgICAgICBwYWdlU2l6ZSA9IHRvUmVuZGVyTGlzdEJveChlbGVtZW50LT5yZW5kZXJl
cigpKS0+c2l6ZSgpIC0gMTsgLy8gLTEgc28gd2Ugc3RpbGwgc2hvdyBjb250ZXh0CisKKyAgICAv
LyBPbmUgcGFnZSBhd2F5LCBidXQgbm90IG91dHNpZGUgdmFsaWQgYm91bmRzLgorICAgIC8vIElm
IHRoZXJlIGlzIGEgdmFsaWQgb3B0aW9uIGl0ZW0gb25lIHBhZ2UgYXdheSwgdGhlIGluZGV4IGlz
IGNob3Nlbi4KKyAgICAvLyBJZiB0aGVyZSBpcyBubyBleGFjdCBvbmUgcGFnZSBhd2F5IHZhbGlk
IG9wdGlvbiwgcmV0dXJucyBzdGFydEluZGV4IG9yIHRoZSBtb3N0IGZhciBpbmRleC4KKyAgICBp
bnQgZWRnZUluZGV4ID0gKGRpcmVjdGlvbiA9PSBTa2lwRm9yd2FyZHMpID8gMCA6IChpdGVtcy5z
aXplKCkgLSAxKTsKKyAgICBpbnQgc2tpcEFtb3VudCA9IHBhZ2VTaXplICsgKChkaXJlY3Rpb24g
PT0gU2tpcEZvcndhcmRzKSA/IHN0YXJ0SW5kZXggOiAoZWRnZUluZGV4IC0gc3RhcnRJbmRleCkp
OworICAgIHJldHVybiBuZXh0VmFsaWRJbmRleChpdGVtcywgZWRnZUluZGV4LCBkaXJlY3Rpb24s
IHNraXBBbW91bnQpOworfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpzZWxlY3RBbGwoU2Vs
ZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgQVNTRVJUKCFk
YXRhLnVzZXNNZW51TGlzdCgpKTsKKyAgICBpZiAoIWVsZW1lbnQtPnJlbmRlcmVyKCkgfHwgIWRh
dGEubXVsdGlwbGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gU2F2ZSB0aGUgc2VsZWN0
aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdEFsbCBzZWxlY3Rpb24K
KyAgICAvLyB3aGVuIGRpc3BhdGNoaW5nIGNoYW5nZSBldmVudHMKKyAgICBzYXZlTGFzdFNlbGVj
dGlvbihkYXRhLCBlbGVtZW50KTsKKworICAgIGRhdGEuc2V0QWN0aXZlU2VsZWN0aW9uU3RhdGUo
dHJ1ZSk7CisgICAgc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoZGF0YSwgZWxlbWVudCwg
bmV4dFNlbGVjdGFibGVMaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgLTEpKTsKKyAgICBzZXRBY3Rp
dmVTZWxlY3Rpb25FbmRJbmRleChkYXRhLCBwcmV2aW91c1NlbGVjdGFibGVMaXN0SW5kZXgoZGF0
YSwgZWxlbWVudCwgLTEpKTsKKworICAgIHVwZGF0ZUxpc3RCb3hTZWxlY3Rpb24oZGF0YSwgZWxl
bWVudCwgZmFsc2UpOworICAgIGxpc3RCb3hPbkNoYW5nZShkYXRhLCBlbGVtZW50KTsKK30KKwor
dm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2F2ZUxhc3RTZWxlY3Rpb24oU2VsZWN0RWxlbWVudERh
dGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgaWYgKGRhdGEudXNlc01lbnVMaXN0
KCkpIHsKKyAgICAgICAgZGF0YS5zZXRMYXN0T25DaGFuZ2VJbmRleChzZWxlY3RlZEluZGV4KGRh
dGEsIGVsZW1lbnQpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZlY3Rvcjxib29s
PiYgbGFzdE9uQ2hhbmdlU2VsZWN0aW9uID0gZGF0YS5sYXN0T25DaGFuZ2VTZWxlY3Rpb24oKTsg
CisgICAgbGFzdE9uQ2hhbmdlU2VsZWN0aW9uLmNsZWFyKCk7CisKKyAgICBjb25zdCBWZWN0b3I8
RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBPcHRpb25FbGVt
ZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKKyAgICAgICAg
bGFzdE9uQ2hhbmdlU2VsZWN0aW9uLmFwcGVuZChvcHRpb25FbGVtZW50ICYmIG9wdGlvbkVsZW1l
bnQtPnNlbGVjdGVkKCkpOworICAgIH0KK30KKwordm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2V0
QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1l
bnQqIGVsZW1lbnQsIGludCBpbmRleCkKK3sKKyAgICBkYXRhLnNldEFjdGl2ZVNlbGVjdGlvbkFu
Y2hvckluZGV4KGluZGV4KTsKKworICAgIC8vIENhY2hlIHRoZSBzZWxlY3Rpb24gc3RhdGUgc28g
d2UgY2FuIHJlc3RvcmUgdGhlIG9sZCBzZWxlY3Rpb24gYXMgdGhlIG5ldworICAgIC8vIHNlbGVj
dGlvbiBwaXZvdHMgYXJvdW5kIHRoaXMgYW5jaG9yIGluZGV4CisgICAgVmVjdG9yPGJvb2w+JiBj
YWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbiA9IGRhdGEuY2FjaGVkU3RhdGVGb3JBY3RpdmVT
ZWxlY3Rpb24oKTsgCisgICAgY2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24uY2xlYXIoKTsK
KworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxl
bWVudCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgKytpKSB7
CisgICAgICAgIE9wdGlvbkVsZW1lbnQqIG9wdGlvbkVsZW1lbnQgPSB0b09wdGlvbkVsZW1lbnQo
aXRlbXNbaV0pOworICAgICAgICBjYWNoZWRTdGF0ZUZvckFjdGl2ZVNlbGVjdGlvbi5hcHBlbmQo
b3B0aW9uRWxlbWVudCAmJiBvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpKTsKKyAgICB9Cit9CisK
K3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNldEFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KFNlbGVj
dEVsZW1lbnREYXRhJiBkYXRhLCBpbnQgaW5kZXgpCit7CisgICAgZGF0YS5zZXRBY3RpdmVTZWxl
Y3Rpb25FbmRJbmRleChpbmRleCk7Cit9CisKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnVwZGF0
ZUxpc3RCb3hTZWxlY3Rpb24oU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1l
bnQsIGJvb2wgZGVzZWxlY3RPdGhlck9wdGlvbnMpCit7CisgICAgQVNTRVJUKGVsZW1lbnQtPnJl
bmRlcmVyKCkgJiYgKGVsZW1lbnQtPnJlbmRlcmVyKCktPmlzTGlzdEJveCgpIHx8IGRhdGEubXVs
dGlwbGUoKSkpOworICAgIEFTU0VSVCghZGF0YS5saXN0SXRlbXMoZWxlbWVudCkuc2l6ZSgpIHx8
IGRhdGEuYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoKSA+PSAwKTsKKworICAgIHVuc2lnbmVk
IHN0YXJ0ID0gbWluKGRhdGEuYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoKSwgZGF0YS5hY3Rp
dmVTZWxlY3Rpb25FbmRJbmRleCgpKTsKKyAgICB1bnNpZ25lZCBlbmQgPSBtYXgoZGF0YS5hY3Rp
dmVTZWxlY3Rpb25BbmNob3JJbmRleCgpLCBkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkp
OworICAgIFZlY3Rvcjxib29sPiYgY2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24gPSBkYXRh
LmNhY2hlZFN0YXRlRm9yQWN0aXZlU2VsZWN0aW9uKCk7CisKKyAgICBjb25zdCBWZWN0b3I8RWxl
bWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBPcHRpb25FbGVtZW50
KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKKyAgICAgICAgaWYg
KCFvcHRpb25FbGVtZW50IHx8IGl0ZW1zW2ldLT5kaXNhYmxlZCgpKQorICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgaWYgKGkgPj0gc3RhcnQgJiYgaSA8PSBlbmQpCisgICAgICAgICAg
ICBvcHRpb25FbGVtZW50LT5zZXRTZWxlY3RlZFN0YXRlKGRhdGEuYWN0aXZlU2VsZWN0aW9uU3Rh
dGUoKSk7CisgICAgICAgIGVsc2UgaWYgKGRlc2VsZWN0T3RoZXJPcHRpb25zIHx8IGkgPj0gY2Fj
aGVkU3RhdGVGb3JBY3RpdmVTZWxlY3Rpb24uc2l6ZSgpKQorICAgICAgICAgICAgb3B0aW9uRWxl
bWVudC0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IG9wdGlvbkVsZW1lbnQtPnNldFNlbGVjdGVkU3RhdGUoY2FjaGVkU3RhdGVGb3JBY3RpdmVTZWxl
Y3Rpb25baV0pOworICAgIH0KKworICAgIHRvU2VsZWN0RWxlbWVudChlbGVtZW50KS0+dXBkYXRl
VmFsaWRpdHkoKTsKKyAgICBzY3JvbGxUb1NlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsKK30KKwor
dm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6bGlzdEJveE9uQ2hhbmdlKFNlbGVjdEVsZW1lbnREYXRh
JiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIEFTU0VSVCghZGF0YS51c2VzTWVudUxp
c3QoKSB8fCBkYXRhLm11bHRpcGxlKCkpOworCisgICAgVmVjdG9yPGJvb2w+JiBsYXN0T25DaGFu
Z2VTZWxlY3Rpb24gPSBkYXRhLmxhc3RPbkNoYW5nZVNlbGVjdGlvbigpOyAKKyAgICBjb25zdCBW
ZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworCisgICAg
Ly8gSWYgdGhlIGNhY2hlZCBzZWxlY3Rpb24gbGlzdCBpcyBlbXB0eSwgb3IgdGhlIHNpemUgaGFz
IGNoYW5nZWQsIHRoZW4gZmlyZQorICAgIC8vIGRpc3BhdGNoRm9ybUNvbnRyb2xDaGFuZ2VFdmVu
dCwgYW5kIHJldHVybiBlYXJseS4KKyAgICBpZiAobGFzdE9uQ2hhbmdlU2VsZWN0aW9uLmlzRW1w
dHkoKSB8fCBsYXN0T25DaGFuZ2VTZWxlY3Rpb24uc2l6ZSgpICE9IGl0ZW1zLnNpemUoKSkgewor
ICAgICAgICBlbGVtZW50LT5kaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQoKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFVwZGF0ZSBsYXN0T25DaGFuZ2VTZWxlY3Rpb24g
YW5kIGZpcmUgZGlzcGF0Y2hGb3JtQ29udHJvbENoYW5nZUV2ZW50CisgICAgYm9vbCBmaXJlT25D
aGFuZ2UgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9u
RWxlbWVudChpdGVtc1tpXSk7CisgICAgICAgIGJvb2wgc2VsZWN0ZWQgPSBvcHRpb25FbGVtZW50
ICYmIG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVkKCk7CisgICAgICAgIGlmIChzZWxlY3RlZCAhPSBs
YXN0T25DaGFuZ2VTZWxlY3Rpb25baV0pCisgICAgICAgICAgICBmaXJlT25DaGFuZ2UgPSB0cnVl
OworICAgICAgICBsYXN0T25DaGFuZ2VTZWxlY3Rpb25baV0gPSBzZWxlY3RlZDsKKyAgICB9CisK
KyAgICBpZiAoZmlyZU9uQ2hhbmdlKQorICAgICAgICBlbGVtZW50LT5kaXNwYXRjaEZvcm1Db250
cm9sQ2hhbmdlRXZlbnQoKTsKK30KKwordm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6bWVudUxpc3RP
bkNoYW5nZShTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKK3sKKyAg
ICBBU1NFUlQoZGF0YS51c2VzTWVudUxpc3QoKSk7CisKKyAgICBpbnQgc2VsZWN0ZWQgPSBzZWxl
Y3RlZEluZGV4KGRhdGEsIGVsZW1lbnQpOworICAgIGlmIChkYXRhLmxhc3RPbkNoYW5nZUluZGV4
KCkgIT0gc2VsZWN0ZWQgJiYgZGF0YS51c2VyRHJpdmVuQ2hhbmdlKCkpIHsKKyAgICAgICAgZGF0
YS5zZXRMYXN0T25DaGFuZ2VJbmRleChzZWxlY3RlZCk7CisgICAgICAgIGRhdGEuc2V0VXNlckRy
aXZlbkNoYW5nZShmYWxzZSk7CisgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoRm9ybUNvbnRyb2xD
aGFuZ2VFdmVudCgpOworICAgIH0KK30KKwordm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6c2Nyb2xs
VG9TZWxlY3Rpb24oU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7
CisgICAgaWYgKGRhdGEudXNlc01lbnVMaXN0KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlm
IChSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gZWxlbWVudC0+cmVuZGVyZXIoKSkKKyAgICAgICAg
dG9SZW5kZXJMaXN0Qm94KHJlbmRlcmVyKS0+c2VsZWN0aW9uQ2hhbmdlZCgpOworfQorCit2b2lk
IEhUTUxTZWxlY3RFbGVtZW50OjpzZXRPcHRpb25zQ2hhbmdlZE9uUmVuZGVyZXIoU2VsZWN0RWxl
bWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgaWYgKFJlbmRlck9iamVj
dCogcmVuZGVyZXIgPSBlbGVtZW50LT5yZW5kZXJlcigpKSB7CisgICAgICAgIGlmIChkYXRhLnVz
ZXNNZW51TGlzdCgpKQorICAgICAgICAgICAgdG9SZW5kZXJNZW51TGlzdChyZW5kZXJlciktPnNl
dE9wdGlvbnNDaGFuZ2VkKHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0b1JlbmRl
ckxpc3RCb3gocmVuZGVyZXIpLT5zZXRPcHRpb25zQ2hhbmdlZCh0cnVlKTsKKyAgICB9Cit9CisK
K3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnNldFJlY2FsY0xpc3RJdGVtcyhTZWxlY3RFbGVtZW50
RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBkYXRhLnNldFNob3VsZFJlY2Fs
Y0xpc3RJdGVtcyh0cnVlKTsKKyAgICAvLyBNYW51YWwgc2VsZWN0aW9uIGFuY2hvciBpcyByZXNl
dCB3aGVuIG1hbmlwdWxhdGluZyB0aGUgc2VsZWN0IHByb2dyYW1tYXRpY2FsbHkuCisgICAgZGF0
YS5zZXRBY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgtMSk7CisgICAgc2V0T3B0aW9uc0NoYW5n
ZWRPblJlbmRlcmVyKGRhdGEsIGVsZW1lbnQpOworICAgIGVsZW1lbnQtPnNldE5lZWRzU3R5bGVS
ZWNhbGMoKTsKK30KKwordm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zKFNl
bGVjdEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBFbGVtZW50KiBlbGVtZW50LCBib29sIHVwZGF0
ZVNlbGVjdGVkU3RhdGVzKQoreworICAgIFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcyA9IGRh
dGEucmF3TGlzdEl0ZW1zKCk7CisgICAgbGlzdEl0ZW1zLmNsZWFyKCk7CisKKyAgICBkYXRhLnNl
dFNob3VsZFJlY2FsY0xpc3RJdGVtcyhmYWxzZSk7CisKKyAgICBPcHRpb25FbGVtZW50KiBmb3Vu
ZFNlbGVjdGVkID0gMDsKKyAgICBmb3IgKE5vZGUqIGN1cnJlbnROb2RlID0gZWxlbWVudC0+Zmly
c3RDaGlsZCgpOyBjdXJyZW50Tm9kZTspIHsKKyAgICAgICAgaWYgKCFjdXJyZW50Tm9kZS0+aXNF
bGVtZW50Tm9kZSgpKSB7CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLT50
cmF2ZXJzZU5leHRTaWJsaW5nKGVsZW1lbnQpOworICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIH0KKworICAgICAgICBFbGVtZW50KiBjdXJyZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+
KGN1cnJlbnROb2RlKTsKKworICAgICAgICAvLyBvcHRncm91cCB0YWdzIG1heSBub3QgbmVzdC4g
SG93ZXZlciwgYm90aCBGaXJlRm94IGFuZCBJRSB3aWxsCisgICAgICAgIC8vIGZsYXR0ZW4gdGhl
IHRyZWUgYXV0b21hdGljYWxseSwgc28gd2UgZm9sbG93IHN1aXQuCisgICAgICAgIC8vIChodHRw
Oi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy42KQorICAg
ICAgICBpZiAoaXNPcHRpb25Hcm91cEVsZW1lbnQoY3VycmVudCkpIHsKKyAgICAgICAgICAgIGxp
c3RJdGVtcy5hcHBlbmQoY3VycmVudCk7CisgICAgICAgICAgICBpZiAoY3VycmVudC0+Zmlyc3RD
aGlsZCgpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50LT5maXJzdENo
aWxkKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKworICAgICAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9u
RWxlbWVudChjdXJyZW50KSkgeworICAgICAgICAgICAgbGlzdEl0ZW1zLmFwcGVuZChjdXJyZW50
KTsKKworICAgICAgICAgICAgaWYgKHVwZGF0ZVNlbGVjdGVkU3RhdGVzICYmICFkYXRhLm11bHRp
cGxlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kU2VsZWN0ZWQgJiYgKGRhdGEuc2l6
ZSgpIDw9IDEgfHwgb3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgZm91bmRTZWxlY3RlZCA9IG9wdGlvbkVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAg
IGZvdW5kU2VsZWN0ZWQtPnNldFNlbGVjdGVkU3RhdGUodHJ1ZSk7CisgICAgICAgICAgICAgICAg
fSBlbHNlIGlmIChmb3VuZFNlbGVjdGVkICYmIG9wdGlvbkVsZW1lbnQtPnNlbGVjdGVkKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgZm91bmRTZWxlY3RlZC0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxz
ZSk7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kU2VsZWN0ZWQgPSBvcHRpb25FbGVtZW50Owor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlm
IChjdXJyZW50LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aHJUYWcpKQorICAgICAgICAgICAgbGlz
dEl0ZW1zLmFwcGVuZChjdXJyZW50KTsKKworICAgICAgICAvLyBJbiBjb25mb3JtaW5nIEhUTUwg
Y29kZSwgb25seSA8b3B0Z3JvdXA+IGFuZCA8b3B0aW9uPiB3aWxsIGJlIGZvdW5kCisgICAgICAg
IC8vIHdpdGhpbiBhIDxzZWxlY3Q+LiBXZSBjYWxsIHRyYXZlcnNlTmV4dFNpYmxpbmcgc28gdGhh
dCB3ZSBvbmx5IHN0ZXAKKyAgICAgICAgLy8gaW50byB0aG9zZSB0YWdzIHRoYXQgd2UgY2hvb3Nl
IHRvLiBGb3Igd2ViLWNvbXBhdCwgd2Ugc2hvdWxkIGNvcGUKKyAgICAgICAgLy8gd2l0aCB0aGUg
Y2FzZSB3aGVyZSBvZGQgdGFncyBsaWtlIGEgPGRpdj4gaGF2ZSBiZWVuIGFkZGVkIGJ1dCB3ZQor
ICAgICAgICAvLyBoYW5kbGUgdGhpcyBiZWNhdXNlIHN1Y2ggdGFncyBoYXZlIGFscmVhZHkgYmVl
biByZW1vdmVkIGZyb20gdGhlCisgICAgICAgIC8vIDxzZWxlY3Q+J3Mgc3VidHJlZSBhdCB0aGlz
IHBvaW50LgorICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLT50cmF2ZXJzZU5leHRT
aWJsaW5nKGVsZW1lbnQpOworICAgIH0KK30KKworaW50IEhUTUxTZWxlY3RFbGVtZW50OjpzZWxl
Y3RlZEluZGV4KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBjb25zdCBFbGVtZW50KiBl
bGVtZW50KQoreworICAgIHVuc2lnbmVkIGluZGV4ID0gMDsKKworICAgIC8vIHJldHVybiB0aGUg
bnVtYmVyIG9mIHRoZSBmaXJzdCBvcHRpb24gc2VsZWN0ZWQKKyAgICBjb25zdCBWZWN0b3I8RWxl
bWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKE9wdGlvbkVsZW1l
bnQqIG9wdGlvbkVsZW1lbnQgPSB0b09wdGlvbkVsZW1lbnQoaXRlbXNbaV0pKSB7CisgICAgICAg
ICAgICBpZiAob3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gaW5kZXg7CisgICAgICAgICAgICArK2luZGV4OworICAgICAgICB9CisgICAgfQorCisgICAg
cmV0dXJuIC0xOworfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpzZXRTZWxlY3RlZEluZGV4
KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBpbnQgb3B0aW9uSW5k
ZXgsIGJvb2wgZGVzZWxlY3QsIGJvb2wgZmlyZU9uQ2hhbmdlTm93LCBib29sIHVzZXJEcml2ZW5D
aGFuZ2UpCit7CisgICAgaWYgKG9wdGlvbkluZGV4ID09IC0xICYmICFkZXNlbGVjdCAmJiAhZGF0
YS5tdWx0aXBsZSgpKQorICAgICAgICBvcHRpb25JbmRleCA9IG5leHRTZWxlY3RhYmxlTGlzdElu
ZGV4KGRhdGEsIGVsZW1lbnQsIC0xKTsKKyAgICBpZiAoIWRhdGEubXVsdGlwbGUoKSkKKyAgICAg
ICAgZGVzZWxlY3QgPSB0cnVlOworCisgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgaXRlbXMg
PSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKyAgICBpbnQgbGlzdEluZGV4ID0gb3B0aW9uVG9M
aXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgb3B0aW9uSW5kZXgpOworCisgICAgRWxlbWVudCogZXhj
bHVkZUVsZW1lbnQgPSAwOworICAgIGlmIChPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0g
KGxpc3RJbmRleCA+PSAwID8gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2xpc3RJbmRleF0pIDogMCkp
IHsKKyAgICAgICAgZXhjbHVkZUVsZW1lbnQgPSBpdGVtc1tsaXN0SW5kZXhdOworICAgICAgICBp
ZiAoZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpIDwgMCB8fCBkZXNlbGVjdCkKKyAg
ICAgICAgICAgIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGRhdGEsIGVsZW1lbnQsIGxp
c3RJbmRleCk7CisgICAgICAgIGlmIChkYXRhLmFjdGl2ZVNlbGVjdGlvbkVuZEluZGV4KCkgPCAw
IHx8IGRlc2VsZWN0KQorICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoZGF0
YSwgbGlzdEluZGV4KTsKKyAgICAgICAgb3B0aW9uRWxlbWVudC0+c2V0U2VsZWN0ZWRTdGF0ZSh0
cnVlKTsKKyAgICB9CisKKyAgICBpZiAoZGVzZWxlY3QpCisgICAgICAgIGRlc2VsZWN0SXRlbXMo
ZGF0YSwgZWxlbWVudCwgZXhjbHVkZUVsZW1lbnQpOworCisgICAgLy8gRm9yIHRoZSBtZW51IGxp
c3QgY2FzZSwgdGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBzZWxlY3RlZCBlbGVtZW50IGFwcGVhci4K
KyAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGVsZW1lbnQtPnJlbmRlcmVyKCkpCisg
ICAgICAgIHJlbmRlcmVyLT51cGRhdGVGcm9tRWxlbWVudCgpOworCisgICAgc2Nyb2xsVG9TZWxl
Y3Rpb24oZGF0YSwgZWxlbWVudCk7CisKKyAgICAvLyBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgd2l0
aCBmaXJlT25DaGFuZ2VOb3cgZm9yIG1lbnUgbGlzdHMuIAorICAgIGlmIChkYXRhLnVzZXNNZW51
TGlzdCgpKSB7CisgICAgICAgIGRhdGEuc2V0VXNlckRyaXZlbkNoYW5nZSh1c2VyRHJpdmVuQ2hh
bmdlKTsKKyAgICAgICAgaWYgKGZpcmVPbkNoYW5nZU5vdykKKyAgICAgICAgICAgIG1lbnVMaXN0
T25DaGFuZ2UoZGF0YSwgZWxlbWVudCk7CisgICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIg
PSBlbGVtZW50LT5yZW5kZXJlcigpOworICAgICAgICBpZiAocmVuZGVyZXIpIHsKKyAgICAgICAg
ICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKQorICAgICAgICAgICAgICAgIHRvUmVuZGVyTWVu
dUxpc3QocmVuZGVyZXIpLT5kaWRTZXRTZWxlY3RlZEluZGV4KGxpc3RJbmRleCk7CisgICAgICAg
ICAgICBlbHNlIGlmIChyZW5kZXJlci0+aXNMaXN0Qm94KCkpCisgICAgICAgICAgICAgICAgdG9S
ZW5kZXJMaXN0Qm94KHJlbmRlcmVyKS0+c2VsZWN0aW9uQ2hhbmdlZCgpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgdG9TZWxlY3RFbGVtZW50KGVsZW1lbnQpLT51cGRhdGVWYWxpZGl0eSgpOwor
ICAgIGlmIChGcmFtZSogZnJhbWUgPSBlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKQorICAg
ICAgICBmcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmZvcm1TdGF0ZURpZENoYW5n
ZShlbGVtZW50KTsKK30KKworaW50IEhUTUxTZWxlY3RFbGVtZW50OjpvcHRpb25Ub0xpc3RJbmRl
eChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgY29uc3QgRWxlbWVudCogZWxlbWVudCwg
aW50IG9wdGlvbkluZGV4KQoreworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0g
ZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisgICAgaW50IGxpc3RTaXplID0gKGludCkgaXRlbXMu
c2l6ZSgpOworICAgIGlmIChvcHRpb25JbmRleCA8IDAgfHwgb3B0aW9uSW5kZXggPj0gbGlzdFNp
emUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGludCBvcHRpb25JbmRleDIgPSAtMTsKKyAg
ICBmb3IgKGludCBsaXN0SW5kZXggPSAwOyBsaXN0SW5kZXggPCBsaXN0U2l6ZTsgKytsaXN0SW5k
ZXgpIHsKKyAgICAgICAgaWYgKGlzT3B0aW9uRWxlbWVudChpdGVtc1tsaXN0SW5kZXhdKSkgewor
ICAgICAgICAgICAgKytvcHRpb25JbmRleDI7CisgICAgICAgICAgICBpZiAob3B0aW9uSW5kZXgy
ID09IG9wdGlvbkluZGV4KQorICAgICAgICAgICAgICAgIHJldHVybiBsaXN0SW5kZXg7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBIVE1MU2VsZWN0RWxlbWVu
dDo6bGlzdFRvT3B0aW9uSW5kZXgoY29uc3QgU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIGNvbnN0
IEVsZW1lbnQqIGVsZW1lbnQsIGludCBsaXN0SW5kZXgpCit7CisgICAgY29uc3QgVmVjdG9yPEVs
ZW1lbnQqPiYgaXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKyAgICBpZiAobGlzdElu
ZGV4IDwgMCB8fCBsaXN0SW5kZXggPj0gaW50KGl0ZW1zLnNpemUoKSkgfHwgIWlzT3B0aW9uRWxl
bWVudChpdGVtc1tsaXN0SW5kZXhdKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy8gQWN0
dWFsIGluZGV4IG9mIG9wdGlvbiBub3QgY291bnRpbmcgT1BUR1JPVVAgZW50cmllcyB0aGF0IG1h
eSBiZSBpbiBsaXN0LgorICAgIGludCBvcHRpb25JbmRleCA9IDA7CisgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBsaXN0SW5kZXg7ICsraSkgeworICAgICAgICBpZiAoaXNPcHRpb25FbGVtZW50KGl0
ZW1zW2ldKSkKKyAgICAgICAgICAgICsrb3B0aW9uSW5kZXg7CisgICAgfQorCisgICAgcmV0dXJu
IG9wdGlvbkluZGV4OworfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkaXNwYXRjaEZvY3Vz
RXZlbnQoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAg
Ly8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNl
bGVjdGlvbiB3aGVuCisgICAgLy8gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgYmx1
ciBldmVudCBkaXNwYXRjaGFsCisgICAgaWYgKGRhdGEudXNlc01lbnVMaXN0KCkpCisgICAgICAg
IHNhdmVMYXN0U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOworfQorCit2b2lkIEhUTUxTZWxlY3RF
bGVtZW50OjpkaXNwYXRjaEJsdXJFdmVudChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVu
dCogZWxlbWVudCkKK3sKKyAgICAvLyBXZSBvbmx5IG5lZWQgdG8gZmlyZSBjaGFuZ2UgZXZlbnRz
IGhlcmUgZm9yIG1lbnUgbGlzdHMsIGJlY2F1c2Ugd2UgZmlyZQorICAgIC8vIGNoYW5nZSBldmVu
dHMgZm9yIGxpc3QgYm94ZXMgd2hlbmV2ZXIgdGhlIHNlbGVjdGlvbiBjaGFuZ2UgaXMgYWN0dWFs
bHkgbWFkZS4KKyAgICAvLyBUaGlzIG1hdGNoZXMgb3RoZXIgYnJvd3NlcnMnIGJlaGF2aW9yLgor
ICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgpKQorICAgICAgICBtZW51TGlzdE9uQ2hhbmdlKGRh
dGEsIGVsZW1lbnQpOworfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpkZXNlbGVjdEl0ZW1z
KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBFbGVtZW50KiBleGNs
dWRlRWxlbWVudCkKK3sKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEu
bGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5z
aXplKCk7ICsraSkgeworICAgICAgICBpZiAoaXRlbXNbaV0gPT0gZXhjbHVkZUVsZW1lbnQpCisg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9u
RWxlbWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSkpCisgICAgICAgICAgICBvcHRpb25F
bGVtZW50LT5zZXRTZWxlY3RlZFN0YXRlKGZhbHNlKTsKKyAgICB9Cit9CisKK2Jvb2wgSFRNTFNl
bGVjdEVsZW1lbnQ6OnNhdmVGb3JtQ29udHJvbFN0YXRlKGNvbnN0IFNlbGVjdEVsZW1lbnREYXRh
JiBkYXRhLCBjb25zdCBFbGVtZW50KiBlbGVtZW50LCBTdHJpbmcmIHZhbHVlKQoreworICAgIGNv
bnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7Cisg
ICAgaW50IGxlbmd0aCA9IGl0ZW1zLnNpemUoKTsKKworICAgIC8vIEZJWE1FOiBDaGFuZ2UgdGhp
cyBjb2RlIHRvIHVzZSB0aGUgbmV3IFN0cmluZ0ltcGw6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQgY29k
ZSBwYXRoLgorICAgIFZlY3RvcjxjaGFyLCAxMDI0PiBjaGFyYWN0ZXJzKGxlbmd0aCk7CisgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBPcHRpb25FbGVtZW50
KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKTsKKyAgICAgICAgYm9v
bCBzZWxlY3RlZCA9IG9wdGlvbkVsZW1lbnQgJiYgb3B0aW9uRWxlbWVudC0+c2VsZWN0ZWQoKTsK
KyAgICAgICAgY2hhcmFjdGVyc1tpXSA9IHNlbGVjdGVkID8gJ1gnIDogJy4nOworICAgIH0KKwor
ICAgIHZhbHVlID0gU3RyaW5nKGNoYXJhY3RlcnMuZGF0YSgpLCBsZW5ndGgpOworICAgIHJldHVy
biB0cnVlOworfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjpyZXN0b3JlRm9ybUNvbnRyb2xT
dGF0ZShTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgY29uc3QgU3Ry
aW5nJiBzdGF0ZSkKK3sKKyAgICByZWNhbGNMaXN0SXRlbXMoZGF0YSwgZWxlbWVudCk7CisKKyAg
ICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0ZW1zKGVsZW1lbnQp
OworICAgIGludCBsZW5ndGggPSBpdGVtcy5zaXplKCk7CisKKyAgICBmb3IgKGludCBpID0gMDsg
aSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIGlmIChPcHRpb25FbGVtZW50KiBvcHRpb25FbGVt
ZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2ldKSkKKyAgICAgICAgICAgIG9wdGlvbkVsZW1l
bnQtPnNldFNlbGVjdGVkU3RhdGUoc3RhdGVbaV0gPT0gJ1gnKTsKKyAgICB9CisKKyAgICBzZXRP
cHRpb25zQ2hhbmdlZE9uUmVuZGVyZXIoZGF0YSwgZWxlbWVudCk7Cit9CisKK3ZvaWQgSFRNTFNl
bGVjdEVsZW1lbnQ6OnBhcnNlTXVsdGlwbGVBdHRyaWJ1dGUoU2VsZWN0RWxlbWVudERhdGEmIGRh
dGEsIEVsZW1lbnQqIGVsZW1lbnQsIEF0dHJpYnV0ZSogYXR0cmlidXRlKQoreworICAgIGJvb2wg
b2xkVXNlc01lbnVMaXN0ID0gZGF0YS51c2VzTWVudUxpc3QoKTsKKyAgICBkYXRhLnNldE11bHRp
cGxlKCFhdHRyaWJ1dGUtPmlzTnVsbCgpKTsKKyAgICB0b1NlbGVjdEVsZW1lbnQoZWxlbWVudCkt
PnVwZGF0ZVZhbGlkaXR5KCk7CisgICAgaWYgKG9sZFVzZXNNZW51TGlzdCAhPSBkYXRhLnVzZXNN
ZW51TGlzdCgpICYmIGVsZW1lbnQtPmF0dGFjaGVkKCkpIHsKKyAgICAgICAgZWxlbWVudC0+ZGV0
YWNoKCk7CisgICAgICAgIGVsZW1lbnQtPmF0dGFjaCgpOworICAgIH0KK30KKworYm9vbCBIVE1M
U2VsZWN0RWxlbWVudDo6YXBwZW5kRm9ybURhdGEoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVs
ZW1lbnQqIGVsZW1lbnQsIEZvcm1EYXRhTGlzdCYgbGlzdCkKK3sKKyAgICBjb25zdCBBdG9taWNT
dHJpbmcmIG5hbWUgPSBlbGVtZW50LT5mb3JtQ29udHJvbE5hbWUoKTsKKyAgICBpZiAobmFtZS5p
c0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgc3VjY2Vzc2Z1bCA9
IGZhbHNlOworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRl
bXMoZWxlbWVudCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IHRvT3B0aW9u
RWxlbWVudChpdGVtc1tpXSk7CisgICAgICAgIGlmIChvcHRpb25FbGVtZW50ICYmIG9wdGlvbkVs
ZW1lbnQtPnNlbGVjdGVkKCkgJiYgIW9wdGlvbkVsZW1lbnQtPmRpc2FibGVkKCkpIHsKKyAgICAg
ICAgICAgIGxpc3QuYXBwZW5kRGF0YShuYW1lLCBvcHRpb25FbGVtZW50LT52YWx1ZSgpKTsKKyAg
ICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8g
SXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgaXMgYSBtZW51bGlzdCB3aXRoIG11bHRpcGxlIG9wdGlv
bnMgYW5kIG5vdGhpbmcKKyAgICAvLyB3aWxsIGJlIHN1Ym1pdHRlZCAoIXN1Y2Nlc3NmdWwpLiBX
ZSB3b24ndCBzZW5kIGEgdW5zZWxlY3RlZCBub24tZGlzYWJsZWQKKyAgICAvLyBvcHRpb24gYXMg
ZmFsbGJhY2suIFRoaXMgYmVoYXZpb3IgbWF0Y2hlcyB0byBvdGhlciBicm93c2Vycy4KKyAgICBy
ZXR1cm4gc3VjY2Vzc2Z1bDsKK30gCisKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnJlc2V0KFNl
bGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIE9wdGlvbkVs
ZW1lbnQqIGZpcnN0T3B0aW9uID0gMDsKKyAgICBPcHRpb25FbGVtZW50KiBzZWxlY3RlZE9wdGlv
biA9IDA7CisKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRhdGEubGlzdEl0
ZW1zKGVsZW1lbnQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7
ICsraSkgeworICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25F
bGVtZW50KGl0ZW1zW2ldKTsKKyAgICAgICAgaWYgKCFvcHRpb25FbGVtZW50KQorICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGl0ZW1zW2ldLT5mYXN0SGFzQXR0cmlidXRlKEhU
TUxOYW1lczo6c2VsZWN0ZWRBdHRyKSkgeworICAgICAgICAgICAgaWYgKHNlbGVjdGVkT3B0aW9u
ICYmICFkYXRhLm11bHRpcGxlKCkpCisgICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24tPnNl
dFNlbGVjdGVkU3RhdGUoZmFsc2UpOworICAgICAgICAgICAgb3B0aW9uRWxlbWVudC0+c2V0U2Vs
ZWN0ZWRTdGF0ZSh0cnVlKTsKKyAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uID0gb3B0aW9uRWxl
bWVudDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBvcHRpb25FbGVtZW50LT5zZXRTZWxl
Y3RlZFN0YXRlKGZhbHNlKTsKKworICAgICAgICBpZiAoIWZpcnN0T3B0aW9uKQorICAgICAgICAg
ICAgZmlyc3RPcHRpb24gPSBvcHRpb25FbGVtZW50OworICAgIH0KKworICAgIGlmICghc2VsZWN0
ZWRPcHRpb24gJiYgZmlyc3RPcHRpb24gJiYgIWRhdGEubXVsdGlwbGUoKSAmJiBkYXRhLnNpemUo
KSA8PSAxKQorICAgICAgICBmaXJzdE9wdGlvbi0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKKwor
ICAgIHNldE9wdGlvbnNDaGFuZ2VkT25SZW5kZXJlcihkYXRhLCBlbGVtZW50KTsKKyAgICBlbGVt
ZW50LT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7Cit9CisKKyNpZiAhUExBVEZPUk0oV0lOKSB8fCBP
UyhXSU5DRSkKK2Jvb2wgSFRNTFNlbGVjdEVsZW1lbnQ6OnBsYXRmb3JtSGFuZGxlS2V5ZG93bkV2
ZW50KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50LCBLZXlib2FyZEV2
ZW50KiBldmVudCkKK3sKKyNpZiBBUlJPV19LRVlTX1BPUF9NRU5VCisgICAgaWYgKCFpc1NwYXRp
YWxOYXZpZ2F0aW9uRW5hYmxlZChlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKSkgeworICAg
ICAgICBpZiAoZXZlbnQtPmtleUlkZW50aWZpZXIoKSA9PSAiRG93biIgfHwgZXZlbnQtPmtleUlk
ZW50aWZpZXIoKSA9PSAiVXAiKSB7CisgICAgICAgICAgICBlbGVtZW50LT5mb2N1cygpOworCisg
ICAgICAgICAgICAvLyBDYWxsaW5nIGZvY3VzKCkgbWF5IGNhdXNlIHVzIHRvIGxvc2Ugb3VyIHJl
bmRlcmVyLiBSZXR1cm4gdHJ1ZSBzbworICAgICAgICAgICAgLy8gdGhhdCBvdXIgY2FsbGVyIGRv
ZXNuJ3QgcHJvY2VzcyB0aGUgZXZlbnQgZnVydGhlciwgYnV0IGRvbid0IHNldAorICAgICAgICAg
ICAgLy8gdGhlIGV2ZW50IGFzIGhhbmRsZWQuCisgICAgICAgICAgICBpZiAoIWVsZW1lbnQtPnJl
bmRlcmVyKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIC8v
IFNhdmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIG5ldyBzZWxl
Y3Rpb24KKyAgICAgICAgICAgIC8vIHdoZW4gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJp
bmcgc2V0U2VsZWN0ZWRJbmRleCwgd2hpY2gKKyAgICAgICAgICAgIC8vIGdldHMgY2FsbGVkIGZy
b20gUmVuZGVyTWVudUxpc3Q6OnZhbHVlQ2hhbmdlZCwgd2hpY2ggZ2V0cyBjYWxsZWQKKyAgICAg
ICAgICAgIC8vIGFmdGVyIHRoZSB1c2VyIG1ha2VzIGEgc2VsZWN0aW9uIGZyb20gdGhlIG1lbnUu
CisgICAgICAgICAgICBzYXZlTGFzdFNlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsKKyAgICAgICAg
ICAgIGlmIChSZW5kZXJNZW51TGlzdCogbWVudUxpc3QgPSB0b1JlbmRlck1lbnVMaXN0KGVsZW1l
bnQtPnJlbmRlcmVyKCkpKQorICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAoKTsK
KyAgICAgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgICAgICB9CisgICAg
ICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBmYWxzZTsKK30KKyNl
bmRpZgorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjptZW51TGlzdERlZmF1bHRFdmVudEhhbmRs
ZXIoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIEV2ZW50KiBldmVu
dCwgSFRNTEZvcm1FbGVtZW50KiBodG1sRm9ybSkKK3sKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9
PSBldmVudE5hbWVzKCkua2V5ZG93bkV2ZW50KSB7CisgICAgICAgIGlmICghZWxlbWVudC0+cmVu
ZGVyZXIoKSB8fCAhZXZlbnQtPmlzS2V5Ym9hcmRFdmVudCgpKQorICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgIGlmIChwbGF0Zm9ybUhhbmRsZUtleWRvd25FdmVudChkYXRhLCBlbGVtZW50
LCBzdGF0aWNfY2FzdDxLZXlib2FyZEV2ZW50Kj4oZXZlbnQpKSkKKyAgICAgICAgICAgIHJldHVy
bjsKKworICAgICAgICAvLyBXaGVuIHVzaW5nIHNwYXRpYWwgbmF2aWdhdGlvbiwgd2Ugd2FudCB0
byBiZSBhYmxlIHRvIG5hdmlnYXRlIGF3YXkKKyAgICAgICAgLy8gZnJvbSB0aGUgc2VsZWN0IGVs
ZW1lbnQgd2hlbiB0aGUgdXNlciBoaXRzIGFueSBvZiB0aGUgYXJyb3cga2V5cywKKyAgICAgICAg
Ly8gaW5zdGVhZCBvZiBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uLgorICAgICAgICBpZiAoaXNTcGF0
aWFsTmF2aWdhdGlvbkVuYWJsZWQoZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSkpIHsKKyAg
ICAgICAgICAgIGlmICghZGF0YS5hY3RpdmVTZWxlY3Rpb25TdGF0ZSgpKQorICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFN0cmluZyYga2V5SWRlbnRp
ZmllciA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihldmVudCktPmtleUlkZW50aWZpZXIo
KTsKKyAgICAgICAgYm9vbCBoYW5kbGVkID0gdHJ1ZTsKKworICAgICAgICBVTlVTRURfUEFSQU0o
aHRtbEZvcm0pOworICAgICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBk
YXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKworICAgICAgICBpbnQgbGlzdEluZGV4ID0gb3B0aW9u
VG9MaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgc2VsZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50KSk7
CisKKyAgICAgICAgaWYgKGtleUlkZW50aWZpZXIgPT0gIkRvd24iIHx8IGtleUlkZW50aWZpZXIg
PT0gIlJpZ2h0IikKKyAgICAgICAgICAgIGxpc3RJbmRleCA9IG5leHRWYWxpZEluZGV4KGxpc3RJ
dGVtcywgbGlzdEluZGV4LCBTa2lwRm9yd2FyZHMsIDEpOworICAgICAgICBlbHNlIGlmIChrZXlJ
ZGVudGlmaWVyID09ICJVcCIgfHwga2V5SWRlbnRpZmllciA9PSAiTGVmdCIpCisgICAgICAgICAg
ICBsaXN0SW5kZXggPSBuZXh0VmFsaWRJbmRleChsaXN0SXRlbXMsIGxpc3RJbmRleCwgU2tpcEJh
Y2t3YXJkcywgMSk7CisgICAgICAgIGVsc2UgaWYgKGtleUlkZW50aWZpZXIgPT0gIlBhZ2VEb3du
IikKKyAgICAgICAgICAgIGxpc3RJbmRleCA9IG5leHRWYWxpZEluZGV4KGxpc3RJdGVtcywgbGlz
dEluZGV4LCBTa2lwRm9yd2FyZHMsIDMpOworICAgICAgICBlbHNlIGlmIChrZXlJZGVudGlmaWVy
ID09ICJQYWdlVXAiKQorICAgICAgICAgICAgbGlzdEluZGV4ID0gbmV4dFZhbGlkSW5kZXgobGlz
dEl0ZW1zLCBsaXN0SW5kZXgsIFNraXBCYWNrd2FyZHMsIDMpOworICAgICAgICBlbHNlIGlmIChr
ZXlJZGVudGlmaWVyID09ICJIb21lIikKKyAgICAgICAgICAgIGxpc3RJbmRleCA9IG5leHRWYWxp
ZEluZGV4KGxpc3RJdGVtcywgLTEsIFNraXBGb3J3YXJkcywgMSk7CisgICAgICAgIGVsc2UgaWYg
KGtleUlkZW50aWZpZXIgPT0gIkVuZCIpCisgICAgICAgICAgICBsaXN0SW5kZXggPSBuZXh0VmFs
aWRJbmRleChsaXN0SXRlbXMsIGxpc3RJdGVtcy5zaXplKCksIFNraXBCYWNrd2FyZHMsIDEpOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBoYW5kbGVkID0gZmFsc2U7CisKKyAgICAgICAgaWYg
KGhhbmRsZWQgJiYgbGlzdEluZGV4ID49IDAgJiYgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGxpc3RJ
bmRleCkgPCBsaXN0SXRlbXMuc2l6ZSgpKQorICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChk
YXRhLCBlbGVtZW50LCBsaXN0VG9PcHRpb25JbmRleChkYXRhLCBlbGVtZW50LCBsaXN0SW5kZXgp
KTsKKworICAgICAgICBpZiAoaGFuZGxlZCkKKyAgICAgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0
SGFuZGxlZCgpOworICAgIH0KKworICAgIC8vIFVzZSBrZXkgcHJlc3MgZXZlbnQgaGVyZSBzaW5j
ZSBzZW5kaW5nIHNpbXVsYXRlZCBtb3VzZSBldmVudHMKKyAgICAvLyBvbiBrZXkgZG93biBibG9j
a3MgdGhlIHByb3BlciBzZW5kaW5nIG9mIHRoZSBrZXkgcHJlc3MgZXZlbnQuCisgICAgaWYgKGV2
ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmtleXByZXNzRXZlbnQpIHsKKyAgICAgICAgaWYg
KCFlbGVtZW50LT5yZW5kZXJlcigpIHx8ICFldmVudC0+aXNLZXlib2FyZEV2ZW50KCkpCisgICAg
ICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IGtleUNvZGUgPSBzdGF0aWNfY2FzdDxLZXli
b2FyZEV2ZW50Kj4oZXZlbnQpLT5rZXlDb2RlKCk7CisgICAgICAgIGJvb2wgaGFuZGxlZCA9IGZh
bHNlOworCisgICAgICAgIGlmIChrZXlDb2RlID09ICcgJyAmJiBpc1NwYXRpYWxOYXZpZ2F0aW9u
RW5hYmxlZChlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKSkgeworICAgICAgICAgICAgLy8g
VXNlIHNwYWNlIHRvIHRvZ2dsZSBhcnJvdyBrZXkgaGFuZGxpbmcgZm9yIHNlbGVjdGlvbiBjaGFu
Z2Ugb3Igc3BhdGlhbCBuYXZpZ2F0aW9uLgorICAgICAgICAgICAgZGF0YS5zZXRBY3RpdmVTZWxl
Y3Rpb25TdGF0ZSghZGF0YS5hY3RpdmVTZWxlY3Rpb25TdGF0ZSgpKTsKKyAgICAgICAgICAgIGV2
ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisKKyNpZiBTUEFDRV9PUl9SRVRVUk5fUE9QX01FTlUKKyAgICAgICAgaWYgKGtleUNvZGUgPT0g
JyAnIHx8IGtleUNvZGUgPT0gJ1xyJykgeworICAgICAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsK
KworICAgICAgICAgICAgLy8gQ2FsbGluZyBmb2N1cygpIG1heSBjYXVzZSB1cyB0byBsb3NlIG91
ciByZW5kZXJlciwgaW4gd2hpY2ggY2FzZQorICAgICAgICAgICAgLy8gZG8gbm90IHdhbnQgdG8g
aGFuZGxlIHRoZSBldmVudC4KKyAgICAgICAgICAgIGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSkK
KyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFNhdmUgdGhlIHNlbGVj
dGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIG5ldyBzZWxlY3Rpb24KKyAgICAgICAg
ICAgIC8vIHdoZW4gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgc2V0U2VsZWN0ZWRJ
bmRleCwgd2hpY2gKKyAgICAgICAgICAgIC8vIGdldHMgY2FsbGVkIGZyb20gUmVuZGVyTWVudUxp
c3Q6OnZhbHVlQ2hhbmdlZCwgd2hpY2ggZ2V0cyBjYWxsZWQKKyAgICAgICAgICAgIC8vIGFmdGVy
IHRoZSB1c2VyIG1ha2VzIGEgc2VsZWN0aW9uIGZyb20gdGhlIG1lbnUuCisgICAgICAgICAgICBz
YXZlTGFzdFNlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsKKyAgICAgICAgICAgIGlmIChSZW5kZXJN
ZW51TGlzdCogbWVudUxpc3QgPSB0b1JlbmRlck1lbnVMaXN0KGVsZW1lbnQtPnJlbmRlcmVyKCkp
KQorICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAoKTsKKyAgICAgICAgICAgIGhh
bmRsZWQgPSB0cnVlOworICAgICAgICB9CisjZWxpZiBBUlJPV19LRVlTX1BPUF9NRU5VCisgICAg
ICAgIGlmIChrZXlDb2RlID09ICcgJykgeworICAgICAgICAgICAgZWxlbWVudC0+Zm9jdXMoKTsK
KworICAgICAgICAgICAgLy8gQ2FsbGluZyBmb2N1cygpIG1heSBjYXVzZSB1cyB0byBsb3NlIG91
ciByZW5kZXJlciwgaW4gd2hpY2ggY2FzZQorICAgICAgICAgICAgLy8gZG8gbm90IHdhbnQgdG8g
aGFuZGxlIHRoZSBldmVudC4KKyAgICAgICAgICAgIGlmICghZWxlbWVudC0+cmVuZGVyZXIoKSkK
KyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFNhdmUgdGhlIHNlbGVj
dGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIG5ldyBzZWxlY3Rpb24KKyAgICAgICAg
ICAgIC8vIHdoZW4gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgc2V0U2VsZWN0ZWRJ
bmRleCwgd2hpY2gKKyAgICAgICAgICAgIC8vIGdldHMgY2FsbGVkIGZyb20gUmVuZGVyTWVudUxp
c3Q6OnZhbHVlQ2hhbmdlZCwgd2hpY2ggZ2V0cyBjYWxsZWQKKyAgICAgICAgICAgIC8vIGFmdGVy
IHRoZSB1c2VyIG1ha2VzIGEgc2VsZWN0aW9uIGZyb20gdGhlIG1lbnUuCisgICAgICAgICAgICBz
YXZlTGFzdFNlbGVjdGlvbihkYXRhLCBlbGVtZW50KTsKKyAgICAgICAgICAgIGlmIChSZW5kZXJN
ZW51TGlzdCogbWVudUxpc3QgPSB0b1JlbmRlck1lbnVMaXN0KGVsZW1lbnQtPnJlbmRlcmVyKCkp
KQorICAgICAgICAgICAgICAgIG1lbnVMaXN0LT5zaG93UG9wdXAoKTsKKyAgICAgICAgICAgIGhh
bmRsZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT0gJ1xyJykgeworICAg
ICAgICAgICAgaWYgKGh0bWxGb3JtKQorICAgICAgICAgICAgICAgIGh0bWxGb3JtLT5zdWJtaXRJ
bXBsaWNpdGx5KGV2ZW50LCBmYWxzZSk7CisgICAgICAgICAgICBtZW51TGlzdE9uQ2hhbmdlKGRh
dGEsIGVsZW1lbnQpOworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0KKyNl
bHNlCisgICAgICAgIGludCBsaXN0SW5kZXggPSBvcHRpb25Ub0xpc3RJbmRleChkYXRhLCBlbGVt
ZW50LCBzZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1lbnQpKTsKKyAgICAgICAgaWYgKGtleUNvZGUg
PT0gJ1xyJykgeworICAgICAgICAgICAgLy8gbGlzdEluZGV4IHNob3VsZCBhbHJlYWR5IGJlIHNl
bGVjdGVkLCBidXQgdGhpcyB3aWxsIGZpcmUgdGhlIG9uY2hhbmdlIGhhbmRsZXIuCisgICAgICAg
ICAgICBzZXRTZWxlY3RlZEluZGV4KGRhdGEsIGVsZW1lbnQsIGxpc3RUb09wdGlvbkluZGV4KGRh
dGEsIGVsZW1lbnQsIGxpc3RJbmRleCksIHRydWUsIHRydWUpOworICAgICAgICAgICAgaGFuZGxl
ZCA9IHRydWU7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoaGFuZGxlZCkKKyAgICAg
ICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgIH0KKworICAgIGlmIChldmVu
dC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5tb3VzZWRvd25FdmVudCAmJiBldmVudC0+aXNNb3Vz
ZUV2ZW50KCkgJiYgc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2ZW50KS0+YnV0dG9uKCkgPT0g
TGVmdEJ1dHRvbikgeworICAgICAgICBlbGVtZW50LT5mb2N1cygpOworICAgICAgICBpZiAoZWxl
bWVudC0+cmVuZGVyZXIoKSAmJiBlbGVtZW50LT5yZW5kZXJlcigpLT5pc01lbnVMaXN0KCkpIHsK
KyAgICAgICAgICAgIGlmIChSZW5kZXJNZW51TGlzdCogbWVudUxpc3QgPSB0b1JlbmRlck1lbnVM
aXN0KGVsZW1lbnQtPnJlbmRlcmVyKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1lbnVMaXN0
LT5wb3B1cElzVmlzaWJsZSgpKQorICAgICAgICAgICAgICAgICAgICBtZW51TGlzdC0+aGlkZVBv
cHVwKCk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNh
dmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIG5ldworICAgICAg
ICAgICAgICAgICAgICAvLyBzZWxlY3Rpb24gd2hlbiB3ZSBjYWxsIG9uQ2hhbmdlIGR1cmluZyBz
ZXRTZWxlY3RlZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBnZXRzIGNhbGxl
ZCBmcm9tIFJlbmRlck1lbnVMaXN0Ojp2YWx1ZUNoYW5nZWQsCisgICAgICAgICAgICAgICAgICAg
IC8vIHdoaWNoIGdldHMgY2FsbGVkIGFmdGVyIHRoZSB1c2VyIG1ha2VzIGEgc2VsZWN0aW9uIGZy
b20KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1lbnUuCisgICAgICAgICAgICAgICAgICAg
IHNhdmVMYXN0U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBt
ZW51TGlzdC0+c2hvd1BvcHVwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgIH0KK30K
Kwordm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6dXBkYXRlU2VsZWN0ZWRTdGF0ZShTZWxlY3RFbGVt
ZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwgaW50IGxpc3RJbmRleCwgYm9vbCBtdWx0
aSwgYm9vbCBzaGlmdCkKK3sKKyAgICBBU1NFUlQobGlzdEluZGV4ID49IDApOworCisgICAgLy8g
U2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVj
dGlvbiB3aGVuCisgICAgLy8gZGlzcGF0Y2hpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgbW91c2V1
cCwgb3IgYWZ0ZXIgYXV0b3Njcm9sbCBmaW5pc2hlcy4KKyAgICBzYXZlTGFzdFNlbGVjdGlvbihk
YXRhLCBlbGVtZW50KTsKKworICAgIGRhdGEuc2V0QWN0aXZlU2VsZWN0aW9uU3RhdGUodHJ1ZSk7
CisKKyAgICBib29sIHNoaWZ0U2VsZWN0ID0gZGF0YS5tdWx0aXBsZSgpICYmIHNoaWZ0OworICAg
IGJvb2wgbXVsdGlTZWxlY3QgPSBkYXRhLm11bHRpcGxlKCkgJiYgbXVsdGkgJiYgIXNoaWZ0Owor
CisgICAgRWxlbWVudCogY2xpY2tlZEVsZW1lbnQgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KVts
aXN0SW5kZXhdOworICAgIE9wdGlvbkVsZW1lbnQqIG9wdGlvbiA9IHRvT3B0aW9uRWxlbWVudChj
bGlja2VkRWxlbWVudCk7CisgICAgaWYgKG9wdGlvbikgeworICAgICAgICAvLyBLZWVwIHRyYWNr
IG9mIHdoZXRoZXIgYW4gYWN0aXZlIHNlbGVjdGlvbiAobGlrZSBkdXJpbmcgZHJhZworICAgICAg
ICAvLyBzZWxlY3Rpb24pLCBzaG91bGQgc2VsZWN0IG9yIGRlc2VsZWN0CisgICAgICAgIGlmIChv
cHRpb24tPnNlbGVjdGVkKCkgJiYgbXVsdGkpCisgICAgICAgICAgICBkYXRhLnNldEFjdGl2ZVNl
bGVjdGlvblN0YXRlKGZhbHNlKTsKKworICAgICAgICBpZiAoIWRhdGEuYWN0aXZlU2VsZWN0aW9u
U3RhdGUoKSkKKyAgICAgICAgICAgIG9wdGlvbi0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7Cisg
ICAgfQorCisgICAgLy8gSWYgd2UncmUgbm90IGluIGFueSBzcGVjaWFsIG11bHRpcGxlIHNlbGVj
dGlvbiBtb2RlLCB0aGVuIGRlc2VsZWN0IGFsbAorICAgIC8vIG90aGVyIGl0ZW1zLCBleGNsdWRp
bmcgdGhlIGNsaWNrZWQgb3B0aW9uLiBJZiBubyBvcHRpb24gd2FzIGNsaWNrZWQsIHRoZW4KKyAg
ICAvLyB0aGlzIHdpbGwgZGVzZWxlY3QgYWxsIGl0ZW1zIGluIHRoZSBsaXN0LgorICAgIGlmICgh
c2hpZnRTZWxlY3QgJiYgIW11bHRpU2VsZWN0KQorICAgICAgICBkZXNlbGVjdEl0ZW1zKGRhdGEs
IGVsZW1lbnQsIGNsaWNrZWRFbGVtZW50KTsKKworICAgIC8vIElmIHRoZSBhbmNob3IgaGFzbid0
IGJlZW4gc2V0LCBhbmQgd2UncmUgZG9pbmcgYSBzaW5nbGUgc2VsZWN0aW9uIG9yIGEKKyAgICAv
LyBzaGlmdCBzZWxlY3Rpb24sIHRoZW4gaW5pdGlhbGl6ZSB0aGUgYW5jaG9yIHRvIHRoZSBmaXJz
dCBzZWxlY3RlZCBpbmRleC4KKyAgICBpZiAoZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRl
eCgpIDwgMCAmJiAhbXVsdGlTZWxlY3QpCisgICAgICAgIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hv
ckluZGV4KGRhdGEsIGVsZW1lbnQsIHNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCkpOworCisg
ICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIGNsaWNrZWQgb3B0aW9uCisgICAg
aWYgKG9wdGlvbiAmJiAhY2xpY2tlZEVsZW1lbnQtPmRpc2FibGVkKCkpCisgICAgICAgIG9wdGlv
bi0+c2V0U2VsZWN0ZWRTdGF0ZSh0cnVlKTsKKworICAgIC8vIElmIHRoZXJlIHdhcyBubyBzZWxl
Y3RlZEluZGV4KCkgZm9yIHRoZSBwcmV2aW91cyBpbml0aWFsaXphdGlvbiwgb3IgSWYKKyAgICAv
LyB3ZSdyZSBkb2luZyBhIHNpbmdsZSBzZWxlY3Rpb24sIG9yIGEgbXVsdGlwbGUgc2VsZWN0aW9u
ICh1c2luZyBjbWQgb3IKKyAgICAvLyBjdHJsKSwgdGhlbiBpbml0aWFsaXplIHRoZSBhbmNob3Ig
aW5kZXggdG8gdGhlIGxpc3RJbmRleCB0aGF0IGp1c3QgZ290CisgICAgLy8gY2xpY2tlZC4KKyAg
ICBpZiAoZGF0YS5hY3RpdmVTZWxlY3Rpb25BbmNob3JJbmRleCgpIDwgMCB8fCAhc2hpZnRTZWxl
Y3QpCisgICAgICAgIHNldEFjdGl2ZVNlbGVjdGlvbkFuY2hvckluZGV4KGRhdGEsIGVsZW1lbnQs
IGxpc3RJbmRleCk7CisKKyAgICBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChkYXRhLCBsaXN0
SW5kZXgpOworICAgIHVwZGF0ZUxpc3RCb3hTZWxlY3Rpb24oZGF0YSwgZWxlbWVudCwgIW11bHRp
U2VsZWN0KTsKK30KKwordm9pZCBIVE1MU2VsZWN0RWxlbWVudDo6bGlzdEJveERlZmF1bHRFdmVu
dEhhbmRsZXIoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIEV2ZW50
KiBldmVudCwgSFRNTEZvcm1FbGVtZW50KiBodG1sRm9ybSkKK3sKKyAgICBjb25zdCBWZWN0b3I8
RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KTsKKworICAgIGlm
IChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5tb3VzZWRvd25FdmVudCAmJiBldmVudC0+
aXNNb3VzZUV2ZW50KCkgJiYgc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2ZW50KS0+YnV0dG9u
KCkgPT0gTGVmdEJ1dHRvbikgeworICAgICAgICBlbGVtZW50LT5mb2N1cygpOworCisgICAgICAg
IC8vIENhbGxpbmcgZm9jdXMoKSBtYXkgY2F1c2UgdXMgdG8gbG9zZSBvdXIgcmVuZGVyZXIsIGlu
IHdoaWNoIGNhc2UgZG8gbm90IHdhbnQgdG8gaGFuZGxlIHRoZSBldmVudC4KKyAgICAgICAgaWYg
KCFlbGVtZW50LT5yZW5kZXJlcigpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8v
IENvbnZlcnQgdG8gY29vcmRzIHJlbGF0aXZlIHRvIHRoZSBsaXN0IGJveCBpZiBuZWVkZWQuCisg
ICAgICAgIE1vdXNlRXZlbnQqIG1vdXNlRXZlbnQgPSBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4o
ZXZlbnQpOworICAgICAgICBJbnRQb2ludCBsb2NhbE9mZnNldCA9IHJvdW5kZWRJbnRQb2ludChl
bGVtZW50LT5yZW5kZXJlcigpLT5hYnNvbHV0ZVRvTG9jYWwobW91c2VFdmVudC0+YWJzb2x1dGVM
b2NhdGlvbigpLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICBpbnQgbGlzdEluZGV4ID0gdG9SZW5k
ZXJMaXN0Qm94KGVsZW1lbnQtPnJlbmRlcmVyKCkpLT5saXN0SW5kZXhBdE9mZnNldCh0b1NpemUo
bG9jYWxPZmZzZXQpKTsKKyAgICAgICAgaWYgKGxpc3RJbmRleCA+PSAwKSB7CisjaWYgUExBVEZP
Uk0oTUFDKSB8fCAoUExBVEZPUk0oQ0hST01JVU0pICYmIE9TKERBUldJTikpCisgICAgICAgICAg
ICB1cGRhdGVTZWxlY3RlZFN0YXRlKGRhdGEsIGVsZW1lbnQsIGxpc3RJbmRleCwgbW91c2VFdmVu
dC0+bWV0YUtleSgpLCBtb3VzZUV2ZW50LT5zaGlmdEtleSgpKTsKKyNlbHNlCisgICAgICAgICAg
ICB1cGRhdGVTZWxlY3RlZFN0YXRlKGRhdGEsIGVsZW1lbnQsIGxpc3RJbmRleCwgbW91c2VFdmVu
dC0+Y3RybEtleSgpLCBtb3VzZUV2ZW50LT5zaGlmdEtleSgpKTsKKyNlbmRpZgorICAgICAgICAg
ICAgaWYgKEZyYW1lKiBmcmFtZSA9IGVsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCkpCisgICAg
ICAgICAgICAgICAgZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5zZXRNb3VzZURvd25NYXlTdGFydEF1
dG9zY3JvbGwoKTsKKworICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Cisg
ICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1v
dXNldXBFdmVudCAmJiBldmVudC0+aXNNb3VzZUV2ZW50KCkgJiYgc3RhdGljX2Nhc3Q8TW91c2VF
dmVudCo+KGV2ZW50KS0+YnV0dG9uKCkgPT0gTGVmdEJ1dHRvbiAmJiBlbGVtZW50LT5kb2N1bWVu
dCgpLT5mcmFtZSgpLT5ldmVudEhhbmRsZXIoKS0+YXV0b3Njcm9sbFJlbmRlcmVyKCkgIT0gZWxl
bWVudC0+cmVuZGVyZXIoKSkgeworICAgICAgICAvLyBUaGlzIG1ha2VzIHN1cmUgd2UgZmlyZSBk
aXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQgZm9yIGEgc2luZ2xlCisgICAgICAgIC8vIGNs
aWNrLiBGb3IgZHJhZyBzZWxlY3Rpb24sIG9uQ2hhbmdlIHdpbGwgZmlyZSB3aGVuIHRoZSBhdXRv
c2Nyb2xsCisgICAgICAgIC8vIHRpbWVyIHN0b3BzLgorICAgICAgICBsaXN0Qm94T25DaGFuZ2Uo
ZGF0YSwgZWxlbWVudCk7CisgICAgfSBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFt
ZXMoKS5rZXlkb3duRXZlbnQpIHsKKyAgICAgICAgaWYgKCFldmVudC0+aXNLZXlib2FyZEV2ZW50
KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNvbnN0IFN0cmluZyYga2V5SWRlbnRp
ZmllciA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihldmVudCktPmtleUlkZW50aWZpZXIo
KTsKKworICAgICAgICBib29sIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgaW50IGVuZEluZGV4
ID0gMDsKKyAgICAgICAgaWYgKGRhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSA8IDApIHsK
KyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGVuZCBpbmRleAorICAgICAgICAgICAgaWYg
KGtleUlkZW50aWZpZXIgPT0gIkRvd24iIHx8IGtleUlkZW50aWZpZXIgPT0gIlBhZ2VEb3duIikg
eworICAgICAgICAgICAgICAgIGludCBzdGFydEluZGV4ID0gbGFzdFNlbGVjdGVkTGlzdEluZGV4
KGRhdGEsIGVsZW1lbnQpOworICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAg
ICAgICAgICAgIGlmIChrZXlJZGVudGlmaWVyID09ICJEb3duIikKKyAgICAgICAgICAgICAgICAg
ICAgZW5kSW5kZXggPSBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleChkYXRhLCBlbGVtZW50LCBzdGFy
dEluZGV4KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVuZElu
ZGV4ID0gbmV4dFNlbGVjdGFibGVMaXN0SW5kZXhQYWdlQXdheShkYXRhLCBlbGVtZW50LCBzdGFy
dEluZGV4LCBTa2lwRm9yd2FyZHMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlJZGVudGlm
aWVyID09ICJVcCIgfHwga2V5SWRlbnRpZmllciA9PSAiUGFnZVVwIikgeworICAgICAgICAgICAg
ICAgIGludCBzdGFydEluZGV4ID0gb3B0aW9uVG9MaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgc2Vs
ZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50KSk7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRy
dWU7CisgICAgICAgICAgICAgICAgaWYgKGtleUlkZW50aWZpZXIgPT0gIlVwIikKKyAgICAgICAg
ICAgICAgICAgICAgZW5kSW5kZXggPSBwcmV2aW91c1NlbGVjdGFibGVMaXN0SW5kZXgoZGF0YSwg
ZWxlbWVudCwgc3RhcnRJbmRleCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgICAgICBlbmRJbmRleCA9IG5leHRTZWxlY3RhYmxlTGlzdEluZGV4UGFnZUF3YXkoZGF0YSwg
ZWxlbWVudCwgc3RhcnRJbmRleCwgU2tpcEJhY2t3YXJkcyk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBpbmRleCBiYXNlZCBvbiB0
aGUgY3VycmVudCBlbmQgaW5kZXgKKyAgICAgICAgICAgIGlmIChrZXlJZGVudGlmaWVyID09ICJE
b3duIikgeworICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gbmV4dFNlbGVjdGFibGVMaXN0SW5k
ZXgoZGF0YSwgZWxlbWVudCwgZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJbmRleCgpKTsKKyAgICAg
ICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5SWRl
bnRpZmllciA9PSAiVXAiKSB7CisgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBwcmV2aW91c1Nl
bGVjdGFibGVMaXN0SW5kZXgoZGF0YSwgZWxlbWVudCwgZGF0YS5hY3RpdmVTZWxlY3Rpb25FbmRJ
bmRleCgpKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0g
ZWxzZSBpZiAoa2V5SWRlbnRpZmllciA9PSAiUGFnZURvd24iKSB7CisgICAgICAgICAgICAgICAg
ZW5kSW5kZXggPSBuZXh0U2VsZWN0YWJsZUxpc3RJbmRleFBhZ2VBd2F5KGRhdGEsIGVsZW1lbnQs
IGRhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSwgU2tpcEZvcndhcmRzKTsKKyAgICAgICAg
ICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5SWRlbnRp
ZmllciA9PSAiUGFnZVVwIikgeworICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gbmV4dFNlbGVj
dGFibGVMaXN0SW5kZXhQYWdlQXdheShkYXRhLCBlbGVtZW50LCBkYXRhLmFjdGl2ZVNlbGVjdGlv
bkVuZEluZGV4KCksIFNraXBCYWNrd2FyZHMpOworICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0
cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChrZXlJZGVudGlmaWVy
ID09ICJIb21lIikgeworICAgICAgICAgICAgZW5kSW5kZXggPSBmaXJzdFNlbGVjdGFibGVMaXN0
SW5kZXgoZGF0YSwgZWxlbWVudCk7CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAg
ICAgfSBlbHNlIGlmIChrZXlJZGVudGlmaWVyID09ICJFbmQiKSB7CisgICAgICAgICAgICBlbmRJ
bmRleCA9IGxhc3RTZWxlY3RhYmxlTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQpOworICAgICAgICAg
ICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTcGF0aWFsTmF2
aWdhdGlvbkVuYWJsZWQoZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSkpCisgICAgICAgICAg
ICAvLyBDaGVjayBpZiB0aGUgc2VsZWN0aW9uIG1vdmVzIHRvIHRoZSBib3VuZGFyeS4KKyAgICAg
ICAgICAgIGlmIChrZXlJZGVudGlmaWVyID09ICJMZWZ0IiB8fCBrZXlJZGVudGlmaWVyID09ICJS
aWdodCIgfHwgKChrZXlJZGVudGlmaWVyID09ICJEb3duIiB8fCBrZXlJZGVudGlmaWVyID09ICJV
cCIpICYmIGVuZEluZGV4ID09IGRhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChlbmRJbmRleCA+PSAwICYmIGhhbmRs
ZWQpIHsKKyAgICAgICAgICAgIC8vIFNhdmUgdGhlIHNlbGVjdGlvbiBzbyBpdCBjYW4gYmUgY29t
cGFyZWQgdG8gdGhlIG5ldyBzZWxlY3Rpb24KKyAgICAgICAgICAgIC8vIHdoZW4gZGlzcGF0Y2hp
bmcgY2hhbmdlIGV2ZW50cyBpbW1lZGlhdGVseSBhZnRlciBtYWtpbmcgdGhlIG5ldworICAgICAg
ICAgICAgLy8gc2VsZWN0aW9uLgorICAgICAgICAgICAgc2F2ZUxhc3RTZWxlY3Rpb24oZGF0YSwg
ZWxlbWVudCk7CisKKyAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQobGlzdEl0ZW1zLCAhbGlzdEl0
ZW1zLnNpemUoKSB8fCAoZW5kSW5kZXggPj0gMCAmJiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZW5k
SW5kZXgpIDwgbGlzdEl0ZW1zLnNpemUoKSkpOworICAgICAgICAgICAgc2V0QWN0aXZlU2VsZWN0
aW9uRW5kSW5kZXgoZGF0YSwgZW5kSW5kZXgpOworCisgICAgICAgICAgICBib29sIHNlbGVjdE5l
d0l0ZW0gPSAhZGF0YS5tdWx0aXBsZSgpIHx8IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnQqPihl
dmVudCktPnNoaWZ0S2V5KCkgfHwgIWlzU3BhdGlhbE5hdmlnYXRpb25FbmFibGVkKGVsZW1lbnQt
PmRvY3VtZW50KCktPmZyYW1lKCkpOworICAgICAgICAgICAgaWYgKHNlbGVjdE5ld0l0ZW0pCisg
ICAgICAgICAgICAgICAgZGF0YS5zZXRBY3RpdmVTZWxlY3Rpb25TdGF0ZSh0cnVlKTsKKyAgICAg
ICAgICAgIC8vIElmIHRoZSBhbmNob3IgaXMgdW5pdGlhbGl6ZWQsIG9yIGlmIHdlJ3JlIGdvaW5n
IHRvIGRlc2VsZWN0IGFsbAorICAgICAgICAgICAgLy8gb3RoZXIgb3B0aW9ucywgdGhlbiBzZXQg
dGhlIGFuY2hvciBpbmRleCBlcXVhbCB0byB0aGUgZW5kIGluZGV4LgorICAgICAgICAgICAgYm9v
bCBkZXNlbGVjdE90aGVycyA9ICFkYXRhLm11bHRpcGxlKCkgfHwgKCFzdGF0aWNfY2FzdDxLZXli
b2FyZEV2ZW50Kj4oZXZlbnQpLT5zaGlmdEtleSgpICYmIHNlbGVjdE5ld0l0ZW0pOworICAgICAg
ICAgICAgaWYgKGRhdGEuYWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoKSA8IDAgfHwgZGVzZWxl
Y3RPdGhlcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVzZWxlY3RPdGhlcnMpCisgICAgICAg
ICAgICAgICAgICAgIGRlc2VsZWN0SXRlbXMoZGF0YSwgZWxlbWVudCk7CisgICAgICAgICAgICAg
ICAgc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoZGF0YSwgZWxlbWVudCwgZGF0YS5hY3Rp
dmVTZWxlY3Rpb25FbmRJbmRleCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG9S
ZW5kZXJMaXN0Qm94KGVsZW1lbnQtPnJlbmRlcmVyKCkpLT5zY3JvbGxUb1JldmVhbEVsZW1lbnRB
dExpc3RJbmRleChlbmRJbmRleCk7CisgICAgICAgICAgICBpZiAoc2VsZWN0TmV3SXRlbSkgewor
ICAgICAgICAgICAgICAgIHVwZGF0ZUxpc3RCb3hTZWxlY3Rpb24oZGF0YSwgZWxlbWVudCwgZGVz
ZWxlY3RPdGhlcnMpOworICAgICAgICAgICAgICAgIGxpc3RCb3hPbkNoYW5nZShkYXRhLCBlbGVt
ZW50KTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHNjcm9sbFRvU2VsZWN0
aW9uKGRhdGEsIGVsZW1lbnQpOworCisgICAgICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRs
ZWQoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5h
bWVzKCkua2V5cHJlc3NFdmVudCkgeworICAgICAgICBpZiAoIWV2ZW50LT5pc0tleWJvYXJkRXZl
bnQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW50IGtleUNvZGUgPSBzdGF0aWNf
Y2FzdDxLZXlib2FyZEV2ZW50Kj4oZXZlbnQpLT5rZXlDb2RlKCk7CisKKyAgICAgICAgaWYgKGtl
eUNvZGUgPT0gJ1xyJykgeworICAgICAgICAgICAgaWYgKGh0bWxGb3JtKQorICAgICAgICAgICAg
ICAgIGh0bWxGb3JtLT5zdWJtaXRJbXBsaWNpdGx5KGV2ZW50LCBmYWxzZSk7CisgICAgICAgICAg
ICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChkYXRhLm11
bHRpcGxlKCkgJiYga2V5Q29kZSA9PSAnICcgJiYgaXNTcGF0aWFsTmF2aWdhdGlvbkVuYWJsZWQo
ZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSkpIHsKKyAgICAgICAgICAgIC8vIFVzZSBzcGFj
ZSB0byB0b2dnbGUgc2VsZWN0aW9uIGNoYW5nZS4KKyAgICAgICAgICAgIGRhdGEuc2V0QWN0aXZl
U2VsZWN0aW9uU3RhdGUoIWRhdGEuYWN0aXZlU2VsZWN0aW9uU3RhdGUoKSk7CisgICAgICAgICAg
ICB1cGRhdGVTZWxlY3RlZFN0YXRlKGRhdGEsIGVsZW1lbnQsIGxpc3RUb09wdGlvbkluZGV4KGRh
dGEsIGVsZW1lbnQsIGRhdGEuYWN0aXZlU2VsZWN0aW9uRW5kSW5kZXgoKSksIHRydWUgLyptdWx0
aSovLCBmYWxzZSAvKnNoaWZ0Ki8pOworICAgICAgICAgICAgbGlzdEJveE9uQ2hhbmdlKGRhdGEs
IGVsZW1lbnQpOworICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAg
ICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhh
bmRsZXIoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIEV2ZW50KiBl
dmVudCwgSFRNTEZvcm1FbGVtZW50KiBodG1sRm9ybSkKK3sKKyAgICBpZiAoIWVsZW1lbnQtPnJl
bmRlcmVyKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChkYXRhLnVzZXNNZW51TGlzdCgp
KQorICAgICAgICBtZW51TGlzdERlZmF1bHRFdmVudEhhbmRsZXIoZGF0YSwgZWxlbWVudCwgZXZl
bnQsIGh0bWxGb3JtKTsKKyAgICBlbHNlIAorICAgICAgICBsaXN0Qm94RGVmYXVsdEV2ZW50SGFu
ZGxlcihkYXRhLCBlbGVtZW50LCBldmVudCwgaHRtbEZvcm0pOworCisgICAgaWYgKGV2ZW50LT5k
ZWZhdWx0SGFuZGxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZXZlbnQtPnR5cGUo
KSA9PSBldmVudE5hbWVzKCkua2V5cHJlc3NFdmVudCAmJiBldmVudC0+aXNLZXlib2FyZEV2ZW50
KCkpIHsKKyAgICAgICAgS2V5Ym9hcmRFdmVudCoga2V5Ym9hcmRFdmVudCA9IHN0YXRpY19jYXN0
PEtleWJvYXJkRXZlbnQqPihldmVudCk7CisgICAgICAgIGlmICgha2V5Ym9hcmRFdmVudC0+Y3Ry
bEtleSgpICYmICFrZXlib2FyZEV2ZW50LT5hbHRLZXkoKSAmJiAha2V5Ym9hcmRFdmVudC0+bWV0
YUtleSgpICYmIGlzUHJpbnRhYmxlQ2hhcihrZXlib2FyZEV2ZW50LT5jaGFyQ29kZSgpKSkgewor
ICAgICAgICAgICAgdHlwZUFoZWFkRmluZChkYXRhLCBlbGVtZW50LCBrZXlib2FyZEV2ZW50KTsK
KyAgICAgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgSFRNTFNlbGVjdEVsZW1lbnQ6Omxhc3RT
ZWxlY3RlZExpc3RJbmRleChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgY29uc3QgRWxl
bWVudCogZWxlbWVudCkKK3sKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGl0ZXJhdGUgdGhlIGxp
c3RJdGVtcyBpbiB0aGUgcmV2ZXJzZSBvcmRlci4KKyAgICB1bnNpZ25lZCBpbmRleCA9IDA7Cisg
ICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1z
ID0gZGF0YS5saXN0SXRlbXMoZWxlbWVudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBp
dGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9uRWxl
bWVudCA9IHRvT3B0aW9uRWxlbWVudChpdGVtc1tpXSkpIHsKKyAgICAgICAgICAgIGlmIChvcHRp
b25FbGVtZW50LT5zZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAg
ICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
IH0KKworICAgIHJldHVybiBmb3VuZCA/IChpbnQpIGluZGV4IDogLTE7Cit9CisKK3N0YXRpYyBT
dHJpbmcgc3RyaXBMZWFkaW5nV2hpdGVTcGFjZShjb25zdCBTdHJpbmcmIHN0cmluZykKK3sKKyAg
ICBpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOworCisgICAgaW50IGk7CisgICAgZm9yIChp
ID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIGlmIChzdHJpbmdbaV0gIT0gbm9CcmVh
a1NwYWNlICYmIChzdHJpbmdbaV0gPD0gMHg3RiA/ICFpc0FTQ0lJU3BhY2Uoc3RyaW5nW2ldKSA6
IChkaXJlY3Rpb24oc3RyaW5nW2ldKSAhPSBXaGl0ZVNwYWNlTmV1dHJhbCkpKQorICAgICAgICAg
ICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoaSwgbGVuZ3Ro
IC0gaSk7Cit9CisKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OnR5cGVBaGVhZEZpbmQoU2VsZWN0
RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIEtleWJvYXJkRXZlbnQqIGV2ZW50
KQoreworICAgIGlmIChldmVudC0+dGltZVN0YW1wKCkgPCBkYXRhLmxhc3RDaGFyVGltZSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBET01UaW1lU3RhbXAgZGVsdGEgPSBldmVudC0+dGltZVN0
YW1wKCkgLSBkYXRhLmxhc3RDaGFyVGltZSgpOworICAgIGRhdGEuc2V0TGFzdENoYXJUaW1lKGV2
ZW50LT50aW1lU3RhbXAoKSk7CisKKyAgICBVQ2hhciBjID0gZXZlbnQtPmNoYXJDb2RlKCk7CisK
KyAgICBTdHJpbmcgcHJlZml4OworICAgIGludCBzZWFyY2hTdGFydE9mZnNldCA9IDE7CisgICAg
aWYgKGRlbHRhID4gdHlwZUFoZWFkVGltZW91dCkgeworICAgICAgICBwcmVmaXggPSBTdHJpbmco
JmMsIDEpOworICAgICAgICBkYXRhLnNldFR5cGVkU3RyaW5nKHByZWZpeCk7CisgICAgICAgIGRh
dGEuc2V0UmVwZWF0aW5nQ2hhcihjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhLnR5cGVk
U3RyaW5nKCkuYXBwZW5kKGMpOworCisgICAgICAgIGlmIChjID09IGRhdGEucmVwZWF0aW5nQ2hh
cigpKSB7CisgICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBsaWtlbHkgdHJ5aW5nIHRvIGN5Y2xl
IHRocm91Z2ggYWxsIHRoZSBpdGVtcyBzdGFydGluZworICAgICAgICAgICAgLy8gd2l0aCB0aGlz
IGNoYXJhY3Rlciwgc28ganVzdCBzZWFyY2ggb24gdGhlIGNoYXJhY3RlcgorICAgICAgICAgICAg
cHJlZml4ID0gU3RyaW5nKCZjLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRh
dGEuc2V0UmVwZWF0aW5nQ2hhcigwKTsKKyAgICAgICAgICAgIHByZWZpeCA9IGRhdGEudHlwZWRT
dHJpbmcoKTsKKyAgICAgICAgICAgIHNlYXJjaFN0YXJ0T2Zmc2V0ID0gMDsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRl
bXMoZWxlbWVudCk7CisgICAgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICBpZiAo
aXRlbUNvdW50IDwgMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50IHNlbGVjdGVkID0gc2Vs
ZWN0ZWRJbmRleChkYXRhLCBlbGVtZW50KTsKKyAgICBpbnQgaW5kZXggPSAob3B0aW9uVG9MaXN0
SW5kZXgoZGF0YSwgZWxlbWVudCwgc2VsZWN0ZWQgPj0gMCA/IHNlbGVjdGVkIDogMCkgKyBzZWFy
Y2hTdGFydE9mZnNldCkgJSBpdGVtQ291bnQ7CisgICAgQVNTRVJUKGluZGV4ID49IDApOworCisg
ICAgLy8gQ29tcHV0ZSBhIGNhc2UtZm9sZGVkIGNvcHkgb2YgdGhlIHByZWZpeCBzdHJpbmcgYmVm
b3JlIGJlZ2lubmluZyB0aGUgc2VhcmNoIGZvcgorICAgIC8vIGEgbWF0Y2hpbmcgZWxlbWVudC4g
VGhpcyBjb2RlIHVzZXMgZm9sZENhc2UgdG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdAorICAg
IC8vIFN0cmluZzo6c3RhcnRXaXRoIGRvZXMgbm90IGZvbGQgbm9uLUFTQ0lJIGNoYXJhY3RlcnMu
IFRoaXMgY29kZSBjYW4gYmUgY2hhbmdlZAorICAgIC8vIHRvIHVzZSBzdGFydFdpdGggb25jZSB0
aGF0IGlzIGZpeGVkLgorICAgIFN0cmluZyBwcmVmaXhXaXRoQ2FzZUZvbGRlZChwcmVmaXguZm9s
ZENhc2UoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7ICsraSwgaW5kZXgg
PSAoaW5kZXggKyAxKSAlIGl0ZW1Db3VudCkgeworICAgICAgICBPcHRpb25FbGVtZW50KiBvcHRp
b25FbGVtZW50ID0gdG9PcHRpb25FbGVtZW50KGl0ZW1zW2luZGV4XSk7CisgICAgICAgIGlmICgh
b3B0aW9uRWxlbWVudCB8fCBpdGVtc1tpbmRleF0tPmRpc2FibGVkKCkpCisgICAgICAgICAgICBj
b250aW51ZTsKKworICAgICAgICAvLyBGb2xkIHRoZSBvcHRpb24gc3RyaW5nIGFuZCBjaGVjayBp
ZiBpdHMgcHJlZml4IGlzIGVxdWFsIHRvIHRoZSBmb2xkZWQgcHJlZml4LgorICAgICAgICBTdHJp
bmcgdGV4dCA9IG9wdGlvbkVsZW1lbnQtPnRleHRJbmRlbnRlZFRvUmVzcGVjdEdyb3VwTGFiZWwo
KTsKKyAgICAgICAgaWYgKHN0cmlwTGVhZGluZ1doaXRlU3BhY2UodGV4dCkuZm9sZENhc2UoKS5z
dGFydHNXaXRoKHByZWZpeFdpdGhDYXNlRm9sZGVkKSkgeworICAgICAgICAgICAgc2V0U2VsZWN0
ZWRJbmRleChkYXRhLCBlbGVtZW50LCBsaXN0VG9PcHRpb25JbmRleChkYXRhLCBlbGVtZW50LCBp
bmRleCkpOworICAgICAgICAgICAgaWYgKCFkYXRhLnVzZXNNZW51TGlzdCgpKQorICAgICAgICAg
ICAgICAgIGxpc3RCb3hPbkNoYW5nZShkYXRhLCBlbGVtZW50KTsKKworICAgICAgICAgICAgc2V0
T3B0aW9uc0NoYW5nZWRPblJlbmRlcmVyKGRhdGEsIGVsZW1lbnQpOworICAgICAgICAgICAgZWxl
bWVudC0+c2V0TmVlZHNTdHlsZVJlY2FsYygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisgICAgfQorfQorCit2b2lkIEhUTUxTZWxlY3RFbGVtZW50OjppbnNlcnRlZEludG9UcmVl
KFNlbGVjdEVsZW1lbnREYXRhJiBkYXRhLCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8vIFdo
ZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBkdXJpbmcgZG9jdW1lbnQgcGFyc2luZywgaXQgd29u
J3QgaGF2ZSBhbnkKKyAgICAvLyBpdGVtcyB5ZXQgLSBidXQgZm9yIGlubmVySFRNTCBhbmQgcmVs
YXRlZCBtZXRob2RzLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKKyAgICAvLyBhZnRlciB0aGUgd2hv
bGUgc3VidHJlZSBpcyBjb25zdHJ1Y3RlZC4KKyAgICByZWNhbGNMaXN0SXRlbXMoZGF0YSwgZWxl
bWVudCwgdHJ1ZSk7Cit9CisKK3ZvaWQgSFRNTFNlbGVjdEVsZW1lbnQ6OmFjY2Vzc0tleVNldFNl
bGVjdGVkSW5kZXgoU2VsZWN0RWxlbWVudERhdGEmIGRhdGEsIEVsZW1lbnQqIGVsZW1lbnQsIGlu
dCBpbmRleCkKK3sgICAgCisgICAgLy8gZmlyc3QgYnJpbmcgaW50byBmb2N1cyB0aGUgbGlzdCBi
b3gKKyAgICBpZiAoIWVsZW1lbnQtPmZvY3VzZWQoKSkKKyAgICAgICAgZWxlbWVudC0+YWNjZXNz
S2V5QWN0aW9uKGZhbHNlKTsKKyAgICAKKyAgICAvLyBpZiB0aGlzIGluZGV4IGlzIGFscmVhZHkg
c2VsZWN0ZWQsIHVuc2VsZWN0LiBvdGhlcndpc2UgdXBkYXRlIHRoZSBzZWxlY3RlZCBpbmRleAor
ICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGl0ZW1zID0gZGF0YS5saXN0SXRlbXMoZWxlbWVu
dCk7CisgICAgaW50IGxpc3RJbmRleCA9IG9wdGlvblRvTGlzdEluZGV4KGRhdGEsIGVsZW1lbnQs
IGluZGV4KTsKKyAgICBpZiAoT3B0aW9uRWxlbWVudCogb3B0aW9uRWxlbWVudCA9IChsaXN0SW5k
ZXggPj0gMCA/IHRvT3B0aW9uRWxlbWVudChpdGVtc1tsaXN0SW5kZXhdKSA6IDApKSB7CisgICAg
ICAgIGlmIChvcHRpb25FbGVtZW50LT5zZWxlY3RlZCgpKQorICAgICAgICAgICAgb3B0aW9uRWxl
bWVudC0+c2V0U2VsZWN0ZWRTdGF0ZShmYWxzZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IHNldFNlbGVjdGVkSW5kZXgoZGF0YSwgZWxlbWVudCwgaW5kZXgsIGZhbHNlLCB0cnVlKTsKKyAg
ICB9CisKKyAgICBpZiAoZGF0YS51c2VzTWVudUxpc3QoKSkKKyAgICAgICAgbWVudUxpc3RPbkNo
YW5nZShkYXRhLCBlbGVtZW50KTsKKyAgICBlbHNlCisgICAgICAgIGxpc3RCb3hPbkNoYW5nZShk
YXRhLCBlbGVtZW50KTsKKworICAgIHNjcm9sbFRvU2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOwor
fQorCit1bnNpZ25lZCBIVE1MU2VsZWN0RWxlbWVudDo6b3B0aW9uQ291bnQoY29uc3QgU2VsZWN0
RWxlbWVudERhdGEmIGRhdGEsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgdW5zaWdu
ZWQgb3B0aW9ucyA9IDA7CisKKyAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBpdGVtcyA9IGRh
dGEubGlzdEl0ZW1zKGVsZW1lbnQpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVt
cy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoaXNPcHRpb25FbGVtZW50KGl0ZW1zW2ldKSkK
KyAgICAgICAgICAgICsrb3B0aW9uczsKKyAgICB9CisKKyAgICByZXR1cm4gb3B0aW9uczsKK30K
KworSFRNTFNlbGVjdEVsZW1lbnQqIHRvU2VsZWN0RWxlbWVudChFbGVtZW50KiBlbGVtZW50KQor
eworICAgIGlmIChlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkgJiYgZWxlbWVudC0+aGFzVGFnTmFt
ZShIVE1MTmFtZXM6OnNlbGVjdFRhZykpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1M
U2VsZWN0RWxlbWVudCo+KGVsZW1lbnQpOworICAgIC8vIEZJWE1FOiB0b0Zvb0NsYXNzKCkgZnVu
Y3Rpb24gc2hvdWxkIG5vdCByZXR1cm4gMC4KKyAgICByZXR1cm4gMDsKK30KKwogfSAvLyBuYW1l
c3BhY2UKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFNlbGVjdEVsZW1lbnQuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxTZWxlY3RFbGVtZW50LmgJKHJldmlz
aW9uIDk2ODg3KQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MU2VsZWN0RWxlbWVudC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0zNiwyMSArMzYsMjEgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogY2xh
c3MgSFRNTE9wdGlvbkVsZW1lbnQ7CiBjbGFzcyBIVE1MT3B0aW9uc0NvbGxlY3Rpb247CiAKLWNs
YXNzIEhUTUxTZWxlY3RFbGVtZW50IDogcHVibGljIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRo
U3RhdGUsIHB1YmxpYyBTZWxlY3RFbGVtZW50IHsKK2NsYXNzIEhUTUxTZWxlY3RFbGVtZW50IDog
cHVibGljIEhUTUxGb3JtQ29udHJvbEVsZW1lbnRXaXRoU3RhdGUgewogcHVibGljOgogICAgIHN0
YXRpYyBQYXNzUmVmUHRyPEhUTUxTZWxlY3RFbGVtZW50PiBjcmVhdGUoY29uc3QgUXVhbGlmaWVk
TmFtZSYsIERvY3VtZW50KiwgSFRNTEZvcm1FbGVtZW50Kik7CiAKLSAgICB2aXJ0dWFsIGludCBz
ZWxlY3RlZEluZGV4KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkSW5kZXgo
aW50IGluZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1ZSk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFNl
bGVjdGVkSW5kZXhCeVVzZXIoaW50IGluZGV4LCBib29sIGRlc2VsZWN0ID0gdHJ1ZSwgYm9vbCBm
aXJlT25DaGFuZ2VOb3cgPSBmYWxzZSwgYm9vbCBhbGxvd011bHRpcGxlU2VsZWN0aW9uID0gZmFs
c2UpOworICAgIGludCBzZWxlY3RlZEluZGV4KCkgY29uc3Q7CisgICAgdm9pZCBzZXRTZWxlY3Rl
ZEluZGV4KGludCBpbmRleCwgYm9vbCBkZXNlbGVjdCA9IHRydWUpOworICAgIHZvaWQgc2V0U2Vs
ZWN0ZWRJbmRleEJ5VXNlcihpbnQgaW5kZXgsIGJvb2wgZGVzZWxlY3QgPSB0cnVlLCBib29sIGZp
cmVPbkNoYW5nZU5vdyA9IGZhbHNlLCBib29sIGFsbG93TXVsdGlwbGVTZWxlY3Rpb24gPSBmYWxz
ZSk7CiAKICAgICAvLyBGb3IgVmFsaWRpdHlTdGF0ZQogICAgIGJvb2wgdmFsdWVNaXNzaW5nKCkg
Y29uc3Q7CiAKICAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdDsKIAotICAgIHZpcnR1YWwgaW50
IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuc2l6ZSgpOyB9Ci0gICAgdmlydHVhbCBib29s
IG11bHRpcGxlKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm11bHRpcGxlKCk7IH0KKyAgICBpbnQg
c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5zaXplKCk7IH0KKyAgICBib29sIG11bHRpcGxl
KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm11bHRpcGxlKCk7IH0KIAogICAgIHZvaWQgYWRkKEhU
TUxFbGVtZW50KiwgSFRNTEVsZW1lbnQqIGJlZm9yZUVsZW1lbnQsIEV4Y2VwdGlvbkNvZGUmKTsK
ICAgICB2b2lkIHJlbW92ZShpbnQgaW5kZXgpOwpAQCAtNjYsNyArNjYsNyBAQCBwdWJsaWM6CiAg
ICAgdm9pZCBzZXRSZWNhbGNMaXN0SXRlbXMoKTsKICAgICB2b2lkIHJlY2FsY0xpc3RJdGVtc0lm
TmVlZGVkKCk7CiAKLSAgICB2aXJ0dWFsIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVt
cygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0SXRlbXModGhpcyk7IH0KKyAgICBjb25zdCBW
ZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdEl0
ZW1zKHRoaXMpOyB9CiAKICAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2Vu
ZFRvQW55RWxlbWVudCk7CiAgICAgdm9pZCBhY2Nlc3NLZXlTZXRTZWxlY3RlZEluZGV4KGludCk7
CkBAIC04NywxMSArODcsMTkgQEAgcHVibGljOgogCiAgICAgdm9pZCBsaXN0Qm94U2VsZWN0SXRl
bShpbnQgbGlzdEluZGV4LCBib29sIGFsbG93TXVsdGlwbHlTZWxlY3Rpb25zLCBib29sIHNoaWZ0
LCBib29sIGZpcmVPbkNoYW5nZU5vdyA9IHRydWUpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0
ZVZhbGlkaXR5KCkgeyBzZXROZWVkc1ZhbGlkaXR5Q2hlY2soKTsgfQorICAgIHZvaWQgdXBkYXRl
VmFsaWRpdHkoKSB7IHNldE5lZWRzVmFsaWRpdHlDaGVjaygpOyB9CiAKICAgICB2aXJ0dWFsIGJv
b2wgY2FuU2VsZWN0QWxsKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHNlbGVjdEFsbCgpOwot
CisgICAgaW50IGxpc3RUb09wdGlvbkluZGV4KGludCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZv
aWQgbGlzdEJveE9uQ2hhbmdlKCk7CisgICAgaW50IG9wdGlvblRvTGlzdEluZGV4KGludCBvcHRp
b25JbmRleCkgY29uc3Q7CisgICAgaW50IGFjdGl2ZVNlbGVjdGlvblN0YXJ0TGlzdEluZGV4KCkg
Y29uc3Q7CisgICAgaW50IGFjdGl2ZVNlbGVjdGlvbkVuZExpc3RJbmRleCgpIGNvbnN0OworICAg
IHZvaWQgc2V0QWN0aXZlU2VsZWN0aW9uQW5jaG9ySW5kZXgoaW50KTsKKyAgICB2b2lkIHNldEFj
dGl2ZVNlbGVjdGlvbkVuZEluZGV4KGludCk7CisgICAgdm9pZCB1cGRhdGVMaXN0Qm94U2VsZWN0
aW9uKGJvb2wgZGVzZWxlY3RPdGhlck9wdGlvbnMpOworICAgIAogcHJvdGVjdGVkOgogICAgIEhU
TUxTZWxlY3RFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmLCBEb2N1bWVudCosIEhUTUxGb3Jt
RWxlbWVudCopOwogCkBAIC0xMTYsMjEgKzEyNCwxMSBAQCBwcml2YXRlOgogICAgIHZpcnR1YWwg
UmVuZGVyT2JqZWN0KiBjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSosIFJlbmRlclN0eWxlICop
OwogICAgIHZpcnR1YWwgYm9vbCBhcHBlbmRGb3JtRGF0YShGb3JtRGF0YUxpc3QmLCBib29sKTsK
IAotICAgIHZpcnR1YWwgaW50IG9wdGlvblRvTGlzdEluZGV4KGludCBvcHRpb25JbmRleCkgY29u
c3Q7Ci0gICAgdmlydHVhbCBpbnQgbGlzdFRvT3B0aW9uSW5kZXgoaW50IGxpc3RJbmRleCkgY29u
c3Q7Ci0KICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBkZWZh
dWx0RXZlbnRIYW5kbGVyKEV2ZW50Kik7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlU2Vs
ZWN0aW9uQW5jaG9ySW5kZXgoaW50IGluZGV4KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZl
U2VsZWN0aW9uRW5kSW5kZXgoaW50IGluZGV4KTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlTGlz
dEJveFNlbGVjdGlvbihib29sIGRlc2VsZWN0T3RoZXJPcHRpb25zKTsKLSAgICB2aXJ0dWFsIHZv
aWQgbGlzdEJveE9uQ2hhbmdlKCk7Ci0gICAgdmlydHVhbCB2b2lkIG1lbnVMaXN0T25DaGFuZ2Uo
KTsKLSAgICAKLSAgICB2aXJ0dWFsIGludCBhY3RpdmVTZWxlY3Rpb25TdGFydExpc3RJbmRleCgp
IGNvbnN0OwotICAgIHZpcnR1YWwgaW50IGFjdGl2ZVNlbGVjdGlvbkVuZExpc3RJbmRleCgpIGNv
bnN0OworICAgIHZvaWQgbWVudUxpc3RPbkNoYW5nZSgpOwogICAgIAogICAgIHZvaWQgcmVjYWxj
TGlzdEl0ZW1zKGJvb2wgdXBkYXRlU2VsZWN0ZWRTdGF0ZXMgPSB0cnVlKSBjb25zdDsKIApAQCAt
MTQ1LDEwICsxNDMsNTAgQEAgcHJpdmF0ZToKIAogICAgIGJvb2wgaGFzUGxhY2Vob2xkZXJMYWJl
bE9wdGlvbigpIGNvbnN0OwogCisgICAgLy8gRklYTUU6IEZvbGQgc29tZSBvZiB0aGUgZm9sbG93
aW5nIGZ1bmN0aW9ucy4KKyAgICBzdGF0aWMgdm9pZCBzZWxlY3RBbGwoU2VsZWN0RWxlbWVudERh
dGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2F2ZUxhc3RTZWxlY3Rpb24oU2VsZWN0
RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2V0QWN0aXZlU2VsZWN0
aW9uQW5jaG9ySW5kZXgoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgaW50IGluZGV4KTsK
KyAgICBzdGF0aWMgdm9pZCBzZXRBY3RpdmVTZWxlY3Rpb25FbmRJbmRleChTZWxlY3RFbGVtZW50
RGF0YSYsIGludCBpbmRleCk7CisgICAgc3RhdGljIHZvaWQgdXBkYXRlTGlzdEJveFNlbGVjdGlv
bihTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBib29sIGRlc2VsZWN0T3RoZXJPcHRpb25z
KTsKKyAgICBzdGF0aWMgdm9pZCBsaXN0Qm94T25DaGFuZ2UoU2VsZWN0RWxlbWVudERhdGEmLCBF
bGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgbWVudUxpc3RPbkNoYW5nZShTZWxlY3RFbGVtZW50
RGF0YSYsIEVsZW1lbnQqKTsKKyAgICBzdGF0aWMgdm9pZCBzY3JvbGxUb1NlbGVjdGlvbihTZWxl
Y3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqKTsKKyAgICBzdGF0aWMgdm9pZCBzZXRSZWNhbGNMaXN0
SXRlbXMoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgcmVj
YWxjTGlzdEl0ZW1zKFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCosIGJvb2wgdXBk
YXRlU2VsZWN0ZWRTdGF0ZXMgPSB0cnVlKTsKKyAgICBzdGF0aWMgaW50IHNlbGVjdGVkSW5kZXgo
Y29uc3QgU2VsZWN0RWxlbWVudERhdGEmLCBjb25zdCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZv
aWQgc2V0U2VsZWN0ZWRJbmRleChTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBpbnQgb3B0
aW9uSW5kZXgsIGJvb2wgZGVzZWxlY3QgPSB0cnVlLCBib29sIGZpcmVPbkNoYW5nZU5vdyA9IGZh
bHNlLCBib29sIHVzZXJEcml2ZW5DaGFuZ2UgPSB0cnVlKTsKKyAgICBzdGF0aWMgaW50IG9wdGlv
blRvTGlzdEluZGV4KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCosIGlu
dCBvcHRpb25JbmRleCk7CisgICAgc3RhdGljIGludCBsaXN0VG9PcHRpb25JbmRleChjb25zdCBT
ZWxlY3RFbGVtZW50RGF0YSYsIGNvbnN0IEVsZW1lbnQqLCBpbnQgbGlzdEluZGV4KTsKKyAgICBz
dGF0aWMgdm9pZCBkaXNwYXRjaEZvY3VzRXZlbnQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50
Kik7CisgICAgc3RhdGljIHZvaWQgZGlzcGF0Y2hCbHVyRXZlbnQoU2VsZWN0RWxlbWVudERhdGEm
LCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgZGVzZWxlY3RJdGVtcyhTZWxlY3RFbGVtZW50
RGF0YSYsIEVsZW1lbnQqLCBFbGVtZW50KiBleGNsdWRlRWxlbWVudCA9IDApOworICAgIHN0YXRp
YyBib29sIHNhdmVGb3JtQ29udHJvbFN0YXRlKGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29u
c3QgRWxlbWVudCosIFN0cmluZyYgc3RhdGUpOworICAgIHN0YXRpYyB2b2lkIHJlc3RvcmVGb3Jt
Q29udHJvbFN0YXRlKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIGNvbnN0IFN0cmluZyYg
c3RhdGUpOworICAgIHN0YXRpYyB2b2lkIHBhcnNlTXVsdGlwbGVBdHRyaWJ1dGUoU2VsZWN0RWxl
bWVudERhdGEmLCBFbGVtZW50KiwgQXR0cmlidXRlKik7CisgICAgc3RhdGljIGJvb2wgYXBwZW5k
Rm9ybURhdGEoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgRm9ybURhdGFMaXN0Jik7Cisg
ICAgc3RhdGljIHZvaWQgcmVzZXQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAg
c3RhdGljIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1l
bnQqLCBFdmVudCosIEhUTUxGb3JtRWxlbWVudCopOworICAgIHN0YXRpYyBpbnQgbGFzdFNlbGVj
dGVkTGlzdEluZGV4KGNvbnN0IFNlbGVjdEVsZW1lbnREYXRhJiwgY29uc3QgRWxlbWVudCopOwor
ICAgIHN0YXRpYyB2b2lkIHR5cGVBaGVhZEZpbmQoU2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50
KiwgS2V5Ym9hcmRFdmVudCopOworICAgIHN0YXRpYyB2b2lkIGluc2VydGVkSW50b1RyZWUoU2Vs
ZWN0RWxlbWVudERhdGEmLCBFbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgYWNjZXNzS2V5U2V0
U2VsZWN0ZWRJbmRleChTZWxlY3RFbGVtZW50RGF0YSYsIEVsZW1lbnQqLCBpbnQgaW5kZXgpOwor
ICAgIHN0YXRpYyB1bnNpZ25lZCBvcHRpb25Db3VudChjb25zdCBTZWxlY3RFbGVtZW50RGF0YSYs
IGNvbnN0IEVsZW1lbnQqKTsKKworICAgIHN0YXRpYyB2b2lkIHVwZGF0ZVNlbGVjdGVkU3RhdGUo
U2VsZWN0RWxlbWVudERhdGEmLCBFbGVtZW50KiwgaW50IGxpc3RJbmRleCwgYm9vbCBtdWx0aSwg
Ym9vbCBzaGlmdCk7CisgCisgICAgc3RhdGljIHZvaWQgbWVudUxpc3REZWZhdWx0RXZlbnRIYW5k
bGVyKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIEV2ZW50KiwgSFRNTEZvcm1FbGVtZW50
Kik7CisgICAgc3RhdGljIGJvb2wgcGxhdGZvcm1IYW5kbGVLZXlkb3duRXZlbnQoU2VsZWN0RWxl
bWVudERhdGEmLCBFbGVtZW50KiwgS2V5Ym9hcmRFdmVudCopOworICAgIHN0YXRpYyB2b2lkIGxp
c3RCb3hEZWZhdWx0RXZlbnRIYW5kbGVyKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCosIEV2
ZW50KiwgSFRNTEZvcm1FbGVtZW50Kik7CisgICAgc3RhdGljIHZvaWQgc2V0T3B0aW9uc0NoYW5n
ZWRPblJlbmRlcmVyKFNlbGVjdEVsZW1lbnREYXRhJiwgRWxlbWVudCopOworICAgIGZyaWVuZCBj
bGFzcyBTZWxlY3RFbGVtZW50RGF0YTsKKwogICAgIFNlbGVjdEVsZW1lbnREYXRhIG1fZGF0YTsK
ICAgICBDb2xsZWN0aW9uQ2FjaGUgbV9jb2xsZWN0aW9uSW5mbzsKIH07CiAKK0hUTUxTZWxlY3RF
bGVtZW50KiB0b1NlbGVjdEVsZW1lbnQoRWxlbWVudCopOworCiB9IC8vIG5hbWVzcGFjZQogCiAj
ZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFNlbGVjdEVsZW1lbnRXaW4uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFNlbGVjdEVsZW1lbnRXaW4u
Y3BwCShyZXZpc2lvbiA5Njg4NykJKGZyb20gU291cmNlL1dlYkNvcmUvZG9tL1NlbGVjdEVsZW1l
bnRXaW4uY3BwOjk2ODg3KQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MU2VsZWN0RWxlbWVu
dFdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTZWxlY3RFbGVtZW50LmgiCisKKyNpbmNsdWRl
ICJFbGVtZW50LmgiCisjaW5jbHVkZSAiS2V5Ym9hcmRFdmVudC5oIgorI2luY2x1ZGUgIlJlbmRl
ck1lbnVMaXN0LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworYm9vbCBTZWxlY3RFbGVtZW50
OjpwbGF0Zm9ybUhhbmRsZUtleWRvd25FdmVudChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxl
bWVudCogZWxlbWVudCwgS2V5Ym9hcmRFdmVudCogZXZlbnQpCit7CisgICAgLy8gQWxsb3cgKFNo
aWZ0KSBGNCBhbmQgKEN0cmwvU2hpZnQpIEFsdC9BbHRHciArIFVwL0Rvd24gYXJyb3cgdG8gcG9w
IHRoZSBtZW51LCBtYXRjaGluZyBGaXJlZm94LgorICAgIGJvb2wgZXZlbnRTaG93c01lbnUgPSAo
IWV2ZW50LT5hbHRLZXkoKSAmJiAhZXZlbnQtPmN0cmxLZXkoKSAmJiBldmVudC0+a2V5SWRlbnRp
ZmllcigpID09ICJGNCIpCisgICAgICAgIHx8ICgoZXZlbnQtPmFsdEdyYXBoS2V5KCkgfHwgZXZl
bnQtPmFsdEtleSgpKSAmJiAoZXZlbnQtPmtleUlkZW50aWZpZXIoKSA9PSAiRG93biIgfHwgZXZl
bnQtPmtleUlkZW50aWZpZXIoKSA9PSAiVXAiKSk7CisgICAgaWYgKCFldmVudFNob3dzTWVudSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIGl0
IGNhbiBiZSBjb21wYXJlZCB0byB0aGUgbmV3IHNlbGVjdGlvbiB3aGVuIGRpc3BhdGNoaW5nIGNo
YW5nZSBldmVudHMgZHVyaW5nIHNldFNlbGVjdGVkSW5kZXgsCisgICAgLy8gd2hpY2ggZ2V0cyBj
YWxsZWQgZnJvbSBSZW5kZXJNZW51TGlzdDo6dmFsdWVDaGFuZ2VkLCB3aGljaCBnZXRzIGNhbGxl
ZCBhZnRlciB0aGUgdXNlciBtYWtlcyBhIHNlbGVjdGlvbiBmcm9tIHRoZSBtZW51LgorICAgIHNh
dmVMYXN0U2VsZWN0aW9uKGRhdGEsIGVsZW1lbnQpOworICAgIGlmIChSZW5kZXJNZW51TGlzdCog
bWVudUxpc3QgPSB0b1JlbmRlck1lbnVMaXN0KGVsZW1lbnQtPnJlbmRlcmVyKCkpKQorICAgICAg
ICBtZW51TGlzdC0+c2hvd1BvcHVwKCk7CisKKyAgICBpbnQgaW5kZXggPSBzZWxlY3RlZEluZGV4
KGRhdGEsIGVsZW1lbnQpOworICAgIEFTU0VSVChpbmRleCA+PSAwKTsKKyAgICBBU1NFUlQoaW5k
ZXggPCBkYXRhLmxpc3RJdGVtcyhlbGVtZW50KS5zaXplKCkpOworICAgIHNldFNlbGVjdGVkSW5k
ZXgoZGF0YSwgZWxlbWVudCwgaW5kZXgpOworICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgp
OworICAgIHJldHVybiB0cnVlOworfQorCit9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hU
TUxTZWxlY3RFbGVtZW50V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1s
L0hUTUxTZWxlY3RFbGVtZW50V2luLmNwcAkocmV2aXNpb24gOTY4ODcpCisrKyBTb3VyY2UvV2Vi
Q29yZS9odG1sL0hUTUxTZWxlY3RFbGVtZW50V2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQs
NyArMjQsNyBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJTZWxlY3RF
bGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFNlbGVjdEVsZW1lbnQuaCIKIAogI2luY2x1ZGUgIkVs
ZW1lbnQuaCIKICNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCkBAIC0zMiw3ICszMiw3IEBACiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotYm9vbCBTZWxlY3RFbGVtZW50OjpwbGF0Zm9ybUhhbmRs
ZUtleWRvd25FdmVudChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVudCwg
S2V5Ym9hcmRFdmVudCogZXZlbnQpCitib29sIEhUTUxTZWxlY3RFbGVtZW50OjpwbGF0Zm9ybUhh
bmRsZUtleWRvd25FdmVudChTZWxlY3RFbGVtZW50RGF0YSYgZGF0YSwgRWxlbWVudCogZWxlbWVu
dCwgS2V5Ym9hcmRFdmVudCogZXZlbnQpCiB7CiAgICAgLy8gQWxsb3cgKFNoaWZ0KSBGNCBhbmQg
KEN0cmwvU2hpZnQpIEFsdC9BbHRHciArIFVwL0Rvd24gYXJyb3cgdG8gcG9wIHRoZSBtZW51LCBt
YXRjaGluZyBGaXJlZm94LgogICAgIGJvb2wgZXZlbnRTaG93c01lbnUgPSAoIWV2ZW50LT5hbHRL
ZXkoKSAmJiAhZXZlbnQtPmN0cmxLZXkoKSAmJiBldmVudC0+a2V5SWRlbnRpZmllcigpID09ICJG
NCIpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEJveC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpc3RCb3guY3BwCShy
ZXZpc2lvbiA5Njg4NykKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0Qm94
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgIkZyYW1lVmll
dy5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5o
IgorI2luY2x1ZGUgIkhUTUxTZWxlY3RFbGVtZW50LmgiCiAjaW5jbHVkZSAiSGl0VGVzdFJlc3Vs
dC5oIgogI2luY2x1ZGUgIk5vZGVSZW5kZXJTdHlsZS5oIgogI2luY2x1ZGUgIk9wdGlvbkdyb3Vw
RWxlbWVudC5oIgpAQCAtNTUsNyArNTYsNiBAQAogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNp
bmNsdWRlICJTY3JvbGxiYXIuaCIKICNpbmNsdWRlICJTY3JvbGxiYXJUaGVtZS5oIgotI2luY2x1
ZGUgIlNlbGVjdEVsZW1lbnQuaCIKICNpbmNsdWRlICJTcGF0aWFsTmF2aWdhdGlvbi5oIgogI2lu
Y2x1ZGUgPG1hdGguaD4KIApAQCAtODQsNiArODQsOSBAQCBSZW5kZXJMaXN0Qm94OjpSZW5kZXJM
aXN0Qm94KEVsZW1lbnQqIGVsCiAgICAgLCBtX29wdGlvbnNXaWR0aCgwKQogICAgICwgbV9pbmRl
eE9mZnNldCgwKQogeworICAgIEFTU0VSVChlbGVtZW50KTsKKyAgICBBU1NFUlQoZWxlbWVudC0+
aXNIVE1MRWxlbWVudCgpKTsKKyAgICBBU1NFUlQoZWxlbWVudC0+aGFzVGFnTmFtZShIVE1MTmFt
ZXM6OnNlbGVjdFRhZykpOwogICAgIGlmIChQYWdlKiBwYWdlID0gZnJhbWUoKS0+cGFnZSgpKSB7
CiAgICAgICAgIG1fcGFnZSA9IHBhZ2U7CiAgICAgICAgIG1fcGFnZS0+YWRkU2Nyb2xsYWJsZUFy
ZWEodGhpcyk7CkBAIC0xNjIsNyArMTY1LDcgQEAgdm9pZCBSZW5kZXJMaXN0Qm94OjpsYXlvdXQo
KQogCiB2b2lkIFJlbmRlckxpc3RCb3g6OnNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9uKCkKIHsgICAg
Ci0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0
PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9T
ZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKIAogICAgIG1fc2Ny
b2xsVG9SZXZlYWxTZWxlY3Rpb25BZnRlckxheW91dCA9IGZhbHNlOwogCkBAIC0zMDksNyArMzEy
LDcgQEAgdm9pZCBSZW5kZXJMaXN0Qm94OjphZGRGb2N1c1JpbmdSZWN0cyhWZQogICAgIGlmICgh
aXNTcGF0aWFsTmF2aWdhdGlvbkVuYWJsZWQoZnJhbWUoKSkpCiAgICAgICAgIHJldHVybiBSZW5k
ZXJCbG9jazo6YWRkRm9jdXNSaW5nUmVjdHMocmVjdHMsIGFkZGl0aW9uYWxPZmZzZXQpOwogCi0g
ICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVs
ZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxl
Y3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKIAogICAgIC8vIEZvY3Vz
IHRoZSBsYXN0IHNlbGVjdGVkIGl0ZW0uCiAgICAgaW50IHNlbGVjdGVkSXRlbSA9IHNlbGVjdC0+
YWN0aXZlU2VsZWN0aW9uRW5kTGlzdEluZGV4KCk7CkBAIC0zNjUsNyArMzY4LDcgQEAgdm9pZCBS
ZW5kZXJMaXN0Qm94OjpwYWludEl0ZW1Gb3JlZ3JvdW5kKAogewogICAgIEZvbnRDYWNoZVB1cmdl
UHJldmVudGVyIGZvbnRDYWNoZVB1cmdlUHJldmVudGVyOwogCi0gICAgU2VsZWN0RWxlbWVudCog
c2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsK
KyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19j
YXN0PEVsZW1lbnQqPihub2RlKCkpKTsKICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0
SXRlbXMgPSBzZWxlY3QtPmxpc3RJdGVtcygpOwogICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBsaXN0
SXRlbXNbbGlzdEluZGV4XTsKICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9P
cHRpb25FbGVtZW50KGVsZW1lbnQpOwpAQCAtNDE2LDcgKzQxOSw3IEBAIHZvaWQgUmVuZGVyTGlz
dEJveDo6cGFpbnRJdGVtRm9yZWdyb3VuZCgKIAogdm9pZCBSZW5kZXJMaXN0Qm94OjpwYWludEl0
ZW1CYWNrZ3JvdW5kKFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBMYXlvdXRQb2ludCYgcGFp
bnRPZmZzZXQsIGludCBsaXN0SW5kZXgpCiB7Ci0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0g
dG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1M
U2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1l
bnQqPihub2RlKCkpKTsKICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBz
ZWxlY3QtPmxpc3RJdGVtcygpOwogICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBsaXN0SXRlbXNbbGlz
dEluZGV4XTsKICAgICBPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gdG9PcHRpb25FbGVt
ZW50KGVsZW1lbnQpOwpAQCAtNTEzLDcgKzUxNiw3IEBAIHZvaWQgUmVuZGVyTGlzdEJveDo6cGFu
U2Nyb2xsKGNvbnN0IEludFAKICAgICAgICAgcmV0dXJuOwogCiAgICAgbV9pbkF1dG9zY3JvbGwg
PSB0cnVlOwotICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0
aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVj
dCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CiAgICAg
c2VsZWN0LT51cGRhdGVMaXN0Qm94U2VsZWN0aW9uKCFzZWxlY3QtPm11bHRpcGxlKCkpOwogICAg
IG1faW5BdXRvc2Nyb2xsID0gZmFsc2U7CiB9CkBAIC01NDIsNyArNTQ1LDcgQEAgdm9pZCBSZW5k
ZXJMaXN0Qm94OjphdXRvc2Nyb2xsKCkKIAogICAgIGludCBlbmRJbmRleCA9IHNjcm9sbFRvd2Fy
ZChwb3MpOwogICAgIGlmIChlbmRJbmRleCA+PSAwKSB7Ci0gICAgICAgIFNlbGVjdEVsZW1lbnQq
IHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7
CisgICAgICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3Rh
dGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgICAgICBtX2luQXV0b3Njcm9sbCA9IHRy
dWU7CiAKICAgICAgICAgaWYgKCFzZWxlY3QtPm11bHRpcGxlKCkpCkBAIC01OTMsNyArNTk2LDcg
QEAgYm9vbCBSZW5kZXJMaXN0Qm94Ojpsb2dpY2FsU2Nyb2xsKFNjcm9sbAogdm9pZCBSZW5kZXJM
aXN0Qm94Ojp2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4KQogewogICAgIEVsZW1lbnQq
IGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKTsKLSAgICBTZWxlY3RFbGVt
ZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoZWxlbWVudCk7CisgICAgSFRNTFNlbGVjdEVs
ZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChlbGVtZW50KTsKICAgICBzZWxlY3QtPnNl
dFNlbGVjdGVkSW5kZXgoc2VsZWN0LT5saXN0VG9PcHRpb25JbmRleChsaXN0SW5kZXgpKTsKICAg
ICBlbGVtZW50LT5kaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQoKTsKIH0KSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJNZW51TGlzdC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck1lbnVMaXN0LmNwcAkocmV2aXNpb24gOTY4
ODcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTWVudUxpc3QuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRl
ICJGcmFtZVZpZXcuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJIVE1MU2Vs
ZWN0RWxlbWVudC5oIgogI2luY2x1ZGUgIk5vZGVSZW5kZXJTdHlsZS5oIgogI2luY2x1ZGUgIk9w
dGlvbkVsZW1lbnQuaCIKICNpbmNsdWRlICJPcHRpb25Hcm91cEVsZW1lbnQuaCIKQEAgLTQyLDcg
KzQzLDYgQEAKICNpbmNsdWRlICJSZW5kZXJCUi5oIgogI2luY2x1ZGUgIlJlbmRlclNjcm9sbGJh
ci5oIgogI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCi0jaW5jbHVkZSAiU2VsZWN0RWxlbWVudC5o
IgogI2luY2x1ZGUgIlRleHRSdW4uaCIKICNpbmNsdWRlIDxtYXRoLmg+CiAKQEAgLTYxLDYgKzYx
LDkgQEAgUmVuZGVyTWVudUxpc3Q6OlJlbmRlck1lbnVMaXN0KEVsZW1lbnQqIAogICAgICwgbV9s
YXN0QWN0aXZlSW5kZXgoLTEpCiAgICAgLCBtX3BvcHVwSXNWaXNpYmxlKGZhbHNlKQogeworICAg
IEFTU0VSVChlbGVtZW50KTsKKyAgICBBU1NFUlQoZWxlbWVudC0+aXNIVE1MRWxlbWVudCgpKTsK
KyAgICBBU1NFUlQoZWxlbWVudC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnNlbGVjdFRhZykpOwog
fQogCiBSZW5kZXJNZW51TGlzdDo6flJlbmRlck1lbnVMaXN0KCkKQEAgLTE5MCw3ICsxOTMsNyBA
QCB2b2lkIFJlbmRlck1lbnVMaXN0Ojp1cGRhdGVGcm9tRWxlbWVudCgpCiAKIHZvaWQgUmVuZGVy
TWVudUxpc3Q6OnNldFRleHRGcm9tT3B0aW9uKGludCBvcHRpb25JbmRleCkKIHsKLSAgICBTZWxl
Y3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+
KG5vZGUoKSkpOworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1l
bnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIGNvbnN0IFZlY3RvcjxFbGVt
ZW50Kj4mIGxpc3RJdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7CiAgICAgaW50IHNpemUgPSBs
aXN0SXRlbXMuc2l6ZSgpOwogCkBAIC0yOTYsNyArMjk5LDcgQEAgdm9pZCBSZW5kZXJNZW51TGlz
dDo6c2hvd1BvcHVwKCkKICAgICBjcmVhdGVJbm5lckJsb2NrKCk7CiAgICAgaWYgKCFtX3BvcHVw
KQogICAgICAgICBtX3BvcHVwID0gZG9jdW1lbnQoKS0+cGFnZSgpLT5jaHJvbWUoKS0+Y3JlYXRl
UG9wdXBNZW51KHRoaXMpOwotICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxl
bWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAgSFRNTFNlbGVjdEVsZW1l
bnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgp
KSk7CiAgICAgbV9wb3B1cElzVmlzaWJsZSA9IHRydWU7CiAKICAgICAvLyBDb21wdXRlIHRoZSB0
b3AgbGVmdCB0YWtpbmcgdHJhbnNmb3JtcyBpbnRvIGFjY291bnQsIGJ1dCB1c2UKQEAgLTMyMiwy
NyArMzI1LDI3IEBAIHZvaWQgUmVuZGVyTWVudUxpc3Q6OnZhbHVlQ2hhbmdlZCh1bnNpZ24KICAg
ICBpZiAoIWRvYyB8fCBkb2MgIT0gZG9jLT5mcmFtZSgpLT5kb2N1bWVudCgpKQogICAgICAgICBy
ZXR1cm47CiAgICAgCi0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50
KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCog
c2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsK
ICAgICBzZWxlY3QtPnNldFNlbGVjdGVkSW5kZXhCeVVzZXIoc2VsZWN0LT5saXN0VG9PcHRpb25J
bmRleChsaXN0SW5kZXgpLCB0cnVlLCBmaXJlT25DaGFuZ2UpOwogfQogCiAjaWYgRU5BQkxFKE5P
X0xJU1RCT1hfUkVOREVSSU5HKQogdm9pZCBSZW5kZXJNZW51TGlzdDo6bGlzdEJveFNlbGVjdEl0
ZW0oaW50IGxpc3RJbmRleCwgYm9vbCBhbGxvd011bHRpcGx5U2VsZWN0aW9ucywgYm9vbCBzaGlm
dCwgYm9vbCBmaXJlT25DaGFuZ2VOb3cpCiB7Ci0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0g
dG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1M
U2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1l
bnQqPihub2RlKCkpKTsKICAgICBzZWxlY3QtPmxpc3RCb3hTZWxlY3RJdGVtKGxpc3RJbmRleCwg
YWxsb3dNdWx0aXBseVNlbGVjdGlvbnMsIHNoaWZ0LCBmaXJlT25DaGFuZ2VOb3cpOwogfQogCiBi
b29sIFJlbmRlck1lbnVMaXN0OjptdWx0aXBsZSgpCiB7Ci0gICAgU2VsZWN0RWxlbWVudCogc2Vs
ZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAg
ICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0
PEVsZW1lbnQqPihub2RlKCkpKTsKICAgICByZXR1cm4gc2VsZWN0LT5tdWx0aXBsZSgpOwogfQog
I2VuZGlmCiAKIHZvaWQgUmVuZGVyTWVudUxpc3Q6OmRpZFNldFNlbGVjdGVkSW5kZXgoaW50IGxp
c3RJbmRleCkKIHsKLSAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQo
c3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBz
ZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwog
ICAgIGRpZFVwZGF0ZUFjdGl2ZU9wdGlvbihzZWxlY3QtPmxpc3RUb09wdGlvbkluZGV4KGxpc3RJ
bmRleCkpOwogfQogCkBAIC0zNTUsNyArMzU4LDcgQEAgdm9pZCBSZW5kZXJNZW51TGlzdDo6ZGlk
VXBkYXRlQWN0aXZlT3B0aQogICAgICAgICByZXR1cm47CiAgICAgbV9sYXN0QWN0aXZlSW5kZXgg
PSBvcHRpb25JbmRleDsKIAotICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxl
bWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAgSFRNTFNlbGVjdEVsZW1l
bnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgp
KSk7CiAgICAgaW50IGxpc3RJbmRleCA9IHNlbGVjdC0+b3B0aW9uVG9MaXN0SW5kZXgob3B0aW9u
SW5kZXgpOwogICAgIGlmIChsaXN0SW5kZXggPCAwIHx8IGxpc3RJbmRleCA+PSBzdGF0aWNfY2Fz
dDxpbnQ+KHNlbGVjdC0+bGlzdEl0ZW1zKCkuc2l6ZSgpKSkKICAgICAgICAgcmV0dXJuOwpAQCAt
MzY4LDcgKzM3MSw3IEBAIHZvaWQgUmVuZGVyTWVudUxpc3Q6OmRpZFVwZGF0ZUFjdGl2ZU9wdGkK
IAogU3RyaW5nIFJlbmRlck1lbnVMaXN0OjppdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNv
bnN0CiB7Ci0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRp
Y19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0
ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKICAgICBj
b25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBzZWxlY3QtPmxpc3RJdGVtcygpOwog
ICAgIGlmIChsaXN0SW5kZXggPj0gbGlzdEl0ZW1zLnNpemUoKSkKICAgICAgICAgcmV0dXJuIFN0
cmluZygpOwpAQCAtMzkzLDcgKzM5Niw3IEBAIFN0cmluZyBSZW5kZXJNZW51TGlzdDo6aXRlbUlj
b24odW5zaWduZWQKIFN0cmluZyBSZW5kZXJNZW51TGlzdDo6aXRlbUFjY2Vzc2liaWxpdHlUZXh0
KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKIHsKICAgICAvLyBBbGxvdyB0aGUgYWNjZXNzaWJs
ZSBuYW1lIGJlIGNoYW5nZWQgaWYgbmVjZXNzYXJ5LgotICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVj
dCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAg
SFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxF
bGVtZW50Kj4obm9kZSgpKSk7CiAgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0ZW1z
ID0gc2VsZWN0LT5saXN0SXRlbXMoKTsKICAgICBpZiAobGlzdEluZGV4ID49IGxpc3RJdGVtcy5z
aXplKCkpCiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsKQEAgLTQwMyw3ICs0MDYsNyBAQCBTdHJp
bmcgUmVuZGVyTWVudUxpc3Q6Oml0ZW1BY2Nlc3NpYmlsaXR5CiAgICAgCiBTdHJpbmcgUmVuZGVy
TWVudUxpc3Q6Oml0ZW1Ub29sVGlwKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKIHsKLSAgICBT
ZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVu
dCo+KG5vZGUoKSkpOworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVs
ZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAgIGNvbnN0IFZlY3RvcjxF
bGVtZW50Kj4mIGxpc3RJdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7CiAgICAgaWYgKGxpc3RJ
bmRleCA+PSBsaXN0SXRlbXMuc2l6ZSgpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CkBAIC00
MTMsNyArNDE2LDcgQEAgU3RyaW5nIFJlbmRlck1lbnVMaXN0OjppdGVtVG9vbFRpcCh1bnNpZwog
CiBib29sIFJlbmRlck1lbnVMaXN0OjppdGVtSXNFbmFibGVkKHVuc2lnbmVkIGxpc3RJbmRleCkg
Y29uc3QKIHsKLSAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3Rh
dGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBzZWxl
Y3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwogICAg
IGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1zKCk7
CiAgICAgaWYgKGxpc3RJbmRleCA+PSBsaXN0SXRlbXMuc2l6ZSgpKQogICAgICAgICByZXR1cm4g
ZmFsc2U7CkBAIC00MzQsNyArNDM3LDcgQEAgYm9vbCBSZW5kZXJNZW51TGlzdDo6aXRlbUlzRW5h
YmxlZCh1bnNpZwogCiBQb3B1cE1lbnVTdHlsZSBSZW5kZXJNZW51TGlzdDo6aXRlbVN0eWxlKHVu
c2lnbmVkIGxpc3RJbmRleCkgY29uc3QKIHsKLSAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0
b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOworICAgIEhUTUxT
ZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVu
dCo+KG5vZGUoKSkpOwogICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcyA9IHNl
bGVjdC0+bGlzdEl0ZW1zKCk7CiAgICAgaWYgKGxpc3RJbmRleCA+PSBsaXN0SXRlbXMuc2l6ZSgp
KSB7CiAgICAgICAgIC8vIElmIHdlIGFyZSBtYWtpbmcgYW4gb3V0IG9mIGJvdW5kcyBhY2Nlc3Ms
IHRoZW4gd2Ugd2FudCB0byB1c2UgdGhlIHN0eWxlCkBAIC00NTQsNyArNDU3LDcgQEAgUG9wdXBN
ZW51U3R5bGUgUmVuZGVyTWVudUxpc3Q6Oml0ZW1TdHlsZQogCiBDb2xvciBSZW5kZXJNZW51TGlz
dDo6aXRlbUJhY2tncm91bmRDb2xvcih1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0CiB7Ci0gICAg
U2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1l
bnQqPihub2RlKCkpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RF
bGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKICAgICBjb25zdCBWZWN0b3I8
RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBzZWxlY3QtPmxpc3RJdGVtcygpOwogICAgIGlmIChsaXN0
SW5kZXggPj0gbGlzdEl0ZW1zLnNpemUoKSkKICAgICAgICAgcmV0dXJuIHN0eWxlKCktPnZpc2l0
ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcik7CkBAIC01MzEsMTMg
KzUzNCwxMyBAQCBpbnQgUmVuZGVyTWVudUxpc3Q6OmNsaWVudFBhZGRpbmdSaWdodCgpCiAKIGlu
dCBSZW5kZXJNZW51TGlzdDo6bGlzdFNpemUoKSBjb25zdAogewotICAgIFNlbGVjdEVsZW1lbnQq
IHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7
CisgICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNf
Y2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CiAgICAgcmV0dXJuIHNlbGVjdC0+bGlzdEl0ZW1zKCku
c2l6ZSgpOwogfQogCiBpbnQgUmVuZGVyTWVudUxpc3Q6OnNlbGVjdGVkSW5kZXgoKSBjb25zdAog
ewotICAgIFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2Fz
dDxFbGVtZW50Kj4obm9kZSgpKSk7CisgICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRv
U2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7CiAgICAgcmV0dXJu
IHNlbGVjdC0+b3B0aW9uVG9MaXN0SW5kZXgoc2VsZWN0LT5zZWxlY3RlZEluZGV4KCkpOwogfQog
CkBAIC01NDgsNyArNTUxLDcgQEAgdm9pZCBSZW5kZXJNZW51TGlzdDo6cG9wdXBEaWRIaWRlKCkK
IAogYm9vbCBSZW5kZXJNZW51TGlzdDo6aXRlbUlzU2VwYXJhdG9yKHVuc2lnbmVkIGxpc3RJbmRl
eCkgY29uc3QKIHsKLSAgICBTZWxlY3RFbGVtZW50KiBzZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQo
c3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOworICAgIEhUTUxTZWxlY3RFbGVtZW50KiBz
ZWxlY3QgPSB0b1NlbGVjdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSkpOwog
ICAgIGNvbnN0IFZlY3RvcjxFbGVtZW50Kj4mIGxpc3RJdGVtcyA9IHNlbGVjdC0+bGlzdEl0ZW1z
KCk7CiAgICAgaWYgKGxpc3RJbmRleCA+PSBsaXN0SXRlbXMuc2l6ZSgpKQogICAgICAgICByZXR1
cm4gZmFsc2U7CkBAIC01NTgsNyArNTYxLDcgQEAgYm9vbCBSZW5kZXJNZW51TGlzdDo6aXRlbUlz
U2VwYXJhdG9yKHVucwogCiBib29sIFJlbmRlck1lbnVMaXN0OjppdGVtSXNMYWJlbCh1bnNpZ25l
ZCBsaXN0SW5kZXgpIGNvbnN0CiB7Ci0gICAgU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxl
Y3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKKyAgICBIVE1MU2VsZWN0
RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihu
b2RlKCkpKTsKICAgICBjb25zdCBWZWN0b3I8RWxlbWVudCo+JiBsaXN0SXRlbXMgPSBzZWxlY3Qt
Pmxpc3RJdGVtcygpOwogICAgIGlmIChsaXN0SW5kZXggPj0gbGlzdEl0ZW1zLnNpemUoKSkKICAg
ICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTY4LDcgKzU3MSw3IEBAIGJvb2wgUmVuZGVyTWVudUxp
c3Q6Oml0ZW1Jc0xhYmVsKHVuc2lnbmUKIAogYm9vbCBSZW5kZXJNZW51TGlzdDo6aXRlbUlzU2Vs
ZWN0ZWQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAogewotICAgIFNlbGVjdEVsZW1lbnQqIHNl
bGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSgpKSk7Cisg
ICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdCA9IHRvU2VsZWN0RWxlbWVudChzdGF0aWNfY2Fz
dDxFbGVtZW50Kj4obm9kZSgpKSk7CiAgICAgY29uc3QgVmVjdG9yPEVsZW1lbnQqPiYgbGlzdEl0
ZW1zID0gc2VsZWN0LT5saXN0SXRlbXMoKTsKICAgICBpZiAobGlzdEluZGV4ID49IGxpc3RJdGVt
cy5zaXplKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTU4MCw3ICs1ODMsNyBAQCBib29s
IFJlbmRlck1lbnVMaXN0OjppdGVtSXNTZWxlY3RlZCh1bnNpCiAKIHZvaWQgUmVuZGVyTWVudUxp
c3Q6OnNldFRleHRGcm9tSXRlbSh1bnNpZ25lZCBsaXN0SW5kZXgpCiB7Ci0gICAgU2VsZWN0RWxl
bWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2Rl
KCkpKTsKKyAgICBIVE1MU2VsZWN0RWxlbWVudCogc2VsZWN0ID0gdG9TZWxlY3RFbGVtZW50KHN0
YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpKTsKICAgICBzZXRUZXh0RnJvbU9wdGlvbihzZWxl
Y3QtPmxpc3RUb09wdGlvbkluZGV4KGxpc3RJbmRleCkpOwogfQogCg==
</data>
<flag name="commit-queue"
          id="107502"
          type_id="3"
          status="-"
          setter="gustavo"
    />
          </attachment>
      

    </bug>

</bugzilla>