<?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>99502</bug_id>
          
          <creation_ts>2012-10-16 13:59:46 -0700</creation_ts>
          <short_desc>AX: Refactor accessibility name computation so it&apos;s more platform independent</short_desc>
          <delta_ts>2012-10-19 09:26:32 -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>Accessibility</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>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="chris fleizach">cfleizach</reporter>
          <assigned_to name="chris fleizach">cfleizach</assigned_to>
          <cc>apinheiro</cc>
    
    <cc>bdakin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>dmazzoni</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>feature-media-reviews</cc>
    
    <cc>jdiggs</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>743526</commentid>
    <comment_count>0</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-16 13:59:46 -0700</bug_when>
    <thetext>The current model of determining the accessible text for an object has a lot of Mac biases built in due to legacy implementation. 

This patch will categorize and order accessibility text based on WAI-ARIA text computation rules and then allows the platform (only Mac right now) to decide how best to apply that text to its own AX API.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>743993</commentid>
    <comment_count>1</comment_count>
      <attachid>169116</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-17 01:12:05 -0700</bug_when>
    <thetext>Created attachment 169116
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>744089</commentid>
    <comment_count>2</comment_count>
      <attachid>169116</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-10-17 03:08:04 -0700</bug_when>
    <thetext>Comment on attachment 169116
patch

Attachment 169116 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/14395502

New failing tests:
accessibility/loading-iframe-sends-notification.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>744250</commentid>
    <comment_count>3</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-17 08:19:42 -0700</bug_when>
    <thetext>Hard to believe that 
accessibility/loading-iframe-sends-notification.html

is failing because of this patch. It does run fine on Mac and this patch shouldn&apos;t affect other platforms.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>744262</commentid>
    <comment_count>4</comment_count>
      <attachid>169116</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-10-17 08:34:57 -0700</bug_when>
    <thetext>Comment on attachment 169116
patch

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

I like the idea, since it should make it easier for ports to &quot;select&quot; which accessible textual information is interested in in any case, without having to reinvent the wheel.

Besides, I&apos;ve informally reviewed the patch and it mostly looks good to me, although it would be worth to try to understand why it made that layout test fail in chromium EWS.

I just have some really minor comments probably a bit too subjective sometimes. See them below

&gt; Source/WebCore/ChangeLog:12
&gt; +        This change categorizes and orders accessibility text based on WAI-ARIA text computation rules and then
&gt; +        allows the platform (only Mac right now) to decide how best to apply that text to its own AX API.

A link to the part of the WAI-ARIA specification where these rules are explained might be useful here.

&gt; Source/WebCore/ChangeLog:72
&gt; +        (WebCore::localizedMediaControlElementHelpText):

I know it&apos;s a pain, but in theory we should be adding a short description to every function in the ChangeLog

&gt; Source/WebCore/accessibility/AccessibilityObject.h:546
&gt; +    // Accessibility Text - (To be deprecated).
&gt; +    virtual String accessibilityDescription() const { return String(); }
&gt; +    virtual String title() const { return String(); }
&gt; +    virtual String helpText() const { return String(); }

I understand that other ports (e.g. GTK) should migrate the usage of these functions to the new AccessibilityText API, right?

&gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1096
&gt; +    

Extra line

&gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1107
&gt; +    titleElementText(textOrder);
&gt; +    
&gt; +    alternativeText(textOrder);
&gt; +    
&gt; +    visibleText(textOrder);
&gt; +    
&gt; +    helpText(textOrder);

I would probably compact these without extra lines. Also, I would try to keep them in the same order as they are declared in the header file:

    void alternativeText(Vector&lt;AccessibilityText&gt;&amp;) const;
    void visibleText(Vector&lt;AccessibilityText&gt;&amp;) const;
    void titleElementText(Vector&lt;AccessibilityText&gt;&amp;);
    void helpText(Vector&lt;AccessibilityText&gt;&amp;) const;
    String alternativeTextForWebArea() const;
    void ariaLabeledByText(Vector&lt;AccessibilityText&gt;&amp;) const;

Additionally I would probably reorder the definitions for these functions in this same file to be consistent too with that order. I think it would make the code easier to read.

Just a suggestion, not a big deal anyway as it&apos;s just a matter of taster

&gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1251
&gt; +    if (isHeading() || isLink())
&gt; +        useTextUnderElement = true;
&gt; +    
&gt; +    // If it&apos;s focusable but it&apos;s not content editable or a known control type, then it will appear to
&gt; +    // the user as a single atomic object, so we should use its text as the default title.                              
&gt; +    if (isGenericFocusableElement())
&gt; +        useTextUnderElement = true;

Would it make sense to merge these two ifs in a single block?

&gt; Source/WebCore/accessibility/AccessibilityNodeObject.cpp:1258
&gt; +

Extra line</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>744284</commentid>
    <comment_count>5</comment_count>
    <who name="Dominic Mazzoni">dmazzoni</who>
    <bug_when>2012-10-17 08:56:56 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Hard to believe that 
&gt; accessibility/loading-iframe-sends-notification.html
&gt; 
&gt; is failing because of this patch. It does run fine on Mac and this patch shouldn&apos;t affect other platforms.

I think the test may be too brittle. Mark it as skipped and assign the bug to me, with a note to take a look after this bug lands.

- Dominic</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>744875</commentid>
    <comment_count>6</comment_count>
      <attachid>169318</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-17 18:01:34 -0700</bug_when>
    <thetext>Created attachment 169318
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>746364</commentid>
    <comment_count>7</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2012-10-19 09:26:32 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/131905</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>169116</attachid>
            <date>2012-10-17 01:12:05 -0700</date>
            <delta_ts>2012-10-17 18:01:34 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch2</filename>
            <type>text/plain</type>
            <size>33725</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzMTU1MCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDc2IEBACisyMDEyLTEwLTE2ICBDaHJpcyBG
bGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IFJlZmFjdG9yIGFj
Y2Vzc2liaWxpdHkgbmFtZSBjb21wdXRhdGlvbiBzbyBpdCdzIG1vcmUgcGxhdGZvcm0gaW5kZXBl
bmRlbnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTk5
NTAyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhl
IGN1cnJlbnQgbW9kZWwgb2YgZGV0ZXJtaW5pbmcgdGhlIGFjY2Vzc2libGUgdGV4dCBmb3IgYW4g
b2JqZWN0IGhhcyBhIGxvdCBvZiBNYWMgYmlhc2VzIGJ1aWx0IGluCisgICAgICAgIGR1ZSB0byBs
ZWdhY3kgaW1wbGVtZW50YXRpb24uIAorCisgICAgICAgIFRoaXMgY2hhbmdlIGNhdGVnb3JpemVz
IGFuZCBvcmRlcnMgYWNjZXNzaWJpbGl0eSB0ZXh0IGJhc2VkIG9uIFdBSS1BUklBIHRleHQgY29t
cHV0YXRpb24gcnVsZXMgYW5kIHRoZW4KKyAgICAgICAgYWxsb3dzIHRoZSBwbGF0Zm9ybSAob25s
eSBNYWMgcmlnaHQgbm93KSB0byBkZWNpZGUgaG93IGJlc3QgdG8gYXBwbHkgdGhhdCB0ZXh0IHRv
IGl0cyBvd24gQVggQVBJLgorCisgICAgICAgIFRoaXMgY2hhbmdlIHRyaWVkIHZlcnkgaGFyZCBu
b3QgdG8gY2hhbmdlIGFueSB0ZXN0IGJlaGF2aW9yLCBldmVuIHRob3VnaCBpdCBleHBvc2VkIGEg
bnVtYmVyIG9mIHdlaXJkCisgICAgICAgIGVkZ2UgY2FzZXMgd2hlcmUgd2Ugd2VyZSB0cmVhdGlu
ZyBhdHRyaWJ1dGVzIGRpZmZlcmVudGx5IGJhc2VkIG9uIGVsZW1lbnQgdHlwZS4gCisKKyAgICAg
ICAgRnV0dXJlIHBhdGNoZXMgd2lsbCByZXNvbHZlIHRob3NlIGRpc2NyZXBhbmNpZXMuCisKKyAg
ICAgICAgKiBhY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlJbWFnZU1hcExpbmsuY3BwOgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5SW1hZ2VNYXBM
aW5rOjphY2Nlc3NpYmlsaXR5VGV4dCk6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BY2Nlc3Np
YmlsaXR5SW1hZ2VNYXBMaW5rLmg6CisgICAgICAgIChBY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5r
KToKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNZWRpYUNvbnRyb2xzLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlNZWRpYUNvbnRyb2w6OmFjY2Vzc2li
aWxpdHlUZXh0KToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eU1lZGlhQ29udHJvbHMuaDoKKyAgICAgICAgKEFjY2Vzc2liaWxpdHlNZWRp
YUNvbnRyb2wpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU1lZGlhVGltZURpc3Bs
YXk6OmlzTWVkaWFDb250cm9sTGFiZWwpOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNz
aWJpbGl0eU5vZGVPYmplY3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU5v
ZGVPYmplY3Q6OnRpdGxlRWxlbWVudFRleHQpOgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAg
IChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YWNjZXNzaWJpbGl0eVRleHQpOgor
ICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFyaWFMYWJlbGVkQnlU
ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0OjphbHRlcm5h
dGl2ZVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFs
dGVybmF0aXZlVGV4dEZvcldlYkFyZWEpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0
eU5vZGVPYmplY3Q6OnZpc2libGVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlOb2RlT2JqZWN0OjpoZWxwVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5
Tm9kZU9iamVjdDo6YXJpYURlc2NyaWJlZEJ5QXR0cmlidXRlKToKKyAgICAgICAgKiBhY2Nlc3Np
YmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlT2JqZWN0Lmg6CisgICAgICAgIChBY2Nlc3NpYmlsaXR5
Tm9kZU9iamVjdCk6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0
Lmg6CisgICAgICAgIChBY2Nlc3NpYmlsaXR5VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nl
c3NpYmlsaXR5VGV4dDo6QWNjZXNzaWJpbGl0eVRleHQpOgorICAgICAgICAoV2ViQ29yZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojppc01lZGlhQ29udHJvbExhYmVs
KToKKyAgICAgICAgKEFjY2Vzc2liaWxpdHlPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6QWNj
ZXNzaWJpbGl0eU9iamVjdDo6YWNjZXNzaWJpbGl0eVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6
QWNjZXNzaWJpbGl0eU9iamVjdDo6c2V0QWNjZXNzaWJsZU5hbWUpOgorICAgICAgICAoV2ViQ29y
ZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6YWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6OnRpdGxlKToKKyAgICAgICAgKFdlYkNv
cmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6OmhlbHBUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkFj
Y2Vzc2liaWxpdHlPYmplY3Q6OnN0cmluZ1ZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlPYmplY3Q6OnRleHRVbmRlckVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6QWNj
ZXNzaWJpbGl0eU9iamVjdDo6dGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5
T2JqZWN0Ojp0ZXh0TGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmpl
Y3Q6OnNldFJvbGVWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0
Ojpyb2xlVmFsdWUpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6c2Vs
ZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6OmhpZXJhcmNo
aWNhbExldmVsKToKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJP
YmplY3QuY3BwOgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9B
Y2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Lmg6CisgICAgICAgIChBY2Nlc3NpYmlsaXR5UmVuZGVy
T2JqZWN0KToKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L21hYy9XZWJBY2Nlc3NpYmlsaXR5T2Jq
ZWN0V3JhcHBlci5tbToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIg
dGl0bGVUYWdTaG91bGRCZVVzZWRJbkRlc2NyaXB0aW9uRmllbGRdKToKKyAgICAgICAgKC1bV2Vi
QWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIgYWNjZXNzaWJpbGl0eVRpdGxlXSk6CisgICAgICAg
ICgtW1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyIGFjY2Vzc2liaWxpdHlEZXNjcmlwdGlv
bl0pOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciBhY2Nlc3NpYmls
aXR5SGVscFRleHRdKToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIg
YWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOl0pOgorICAgICAgICAqIHBsYXRmb3JtL0xvY2Fs
aXplZFN0cmluZ3MuY3BwOgorICAgICAgICAoV2ViQ29yZTo6bG9jYWxpemVkTWVkaWFDb250cm9s
RWxlbWVudEhlbHBUZXh0KToKKwogMjAxMi0xMC0xNiAgTU9SSVRBIEhhamltZSAgPG1vcnJpdGFA
Z29vZ2xlLmNvbT4KIAogICAgICAgICBbU2hhZG93IERPTV1bVjhdIFdlYkNvcmU6OlY4RE9NV2lu
ZG93OjppbnN0YWxsUGVyQ29udGV4dFByb3BlcnRpZXMoKSBpcyBzbG93IHdoZW4gc2hhZG93RE9N
RW5hYmxlZCBmbGFnIGlzIG9uLgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vTG9jYWxp
emVkU3RyaW5ncy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vTG9j
YWxpemVkU3RyaW5ncy5jcHAJKHJldmlzaW9uIDEzMTU1MCkKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL0xvY2FsaXplZFN0cmluZ3MuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04ODIsNiArODgy
LDEwIEBACiAgICAgaWYgKG5hbWUgPT0gIkhpZGVDbG9zZWRDYXB0aW9uc0J1dHRvbiIpCiAgICAg
ICAgIHJldHVybiBXRUJfVUlfU1RSSU5HKCJzdG9wIGRpc3BsYXlpbmcgY2xvc2VkIGNhcHRpb25z
IiwgImFjY2Vzc2liaWxpdHkgaGVscCB0ZXh0IGZvciBoaWRlIGNsb3NlZCBjYXB0aW9ucyBidXR0
b24iKTsKIAorICAgIC8vIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGJ1dHRvbiBpcyBkZXNjcmlw
dGl2ZSBlbm91Z2ggdGhhdCBpdCBkb2Vzbid0IHJlcXVpcmUgaGVscCB0ZXh0LgorICAgIGlmIChu
YW1lID09ICJFbnRlckZ1bGxzY3JlZW5CdXR0b24iKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7
CisgICAgCiAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgcmV0dXJuIFN0cmluZygpOwog
fQpJbmRleDogU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5SW1hZ2VN
YXBMaW5rLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nl
c3NpYmlsaXR5SW1hZ2VNYXBMaW5rLmgJKHJldmlzaW9uIDEzMTU1MCkKKysrIFNvdXJjZS9XZWJD
b3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUltYWdlTWFwTGluay5oCSh3b3JraW5nIGNv
cHkpCkBAIC03Myw2ICs3Myw3IEBACiAgICAgUmVmUHRyPEhUTUxBcmVhRWxlbWVudD4gbV9hcmVh
RWxlbWVudDsKICAgICBSZWZQdHI8SFRNTE1hcEVsZW1lbnQ+IG1fbWFwRWxlbWVudDsKICAgICAK
KyAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzaWJpbGl0eVRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlU
ZXh0PiYpOwogICAgIHZpcnR1YWwgYm9vbCBpc0ltYWdlTWFwTGluaygpIGNvbnN0IHsgcmV0dXJu
IHRydWU7IH0KIH07CiAgICAgCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21h
Yy9XZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlci5tbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9XZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlci5t
bQkocmV2aXNpb24gMTMxNTUwKQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9tYWMv
V2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIubW0JKHdvcmtpbmcgY29weSkKQEAgLTE4MTgs
NiArMTgxOCwxMDMgQEAKICAgICByZXR1cm4gW3NlbGYgcmVtb3RlQWNjZXNzaWJpbGl0eVBhcmVu
dE9iamVjdF07CiB9CiAKKy8vIEZJWE1FOiBEaWZmZXJlbnQga2luZHMgb2YgZWxlbWVudHMgYXJl
IHB1dHRpbmcgdGhlIHRpdGxlIHRhZyB0byB1c2UgaW4gZGlmZmVyZW50CisvLyBBWCBmaWVsZHMu
IFRoaXMgc2hvdWxkIGJlIHJlY3RpZmllZCwgYnV0IGluIHRoZSBpbml0aWFsIHBhdGNoIEkgd2Fu
dCB0byBhY2hpZXZlCisvLyBwYXJpdHkgd2l0aCBleGlzdGluZyBiZWhhdmlvci4KKy0gKEJPT0wp
dGl0bGVUYWdTaG91bGRCZVVzZWRJbkRlc2NyaXB0aW9uRmllbGQKK3sKKyAgICByZXR1cm4gKG1f
b2JqZWN0LT5pc0xpbmsoKSAmJiAhbV9vYmplY3QtPmlzSW1hZ2VNYXBMaW5rKCkpIHx8IG1fb2Jq
ZWN0LT5pc0ltYWdlKCk7Cit9CisKKy8vIFRoaXMgc2hvdWxkIGJlIHRoZSAidmlzaWJsZSIgdGV4
dCB0aGF0J3MgYWN0dWFsbHkgb24gdGhlIHNjcmVlbiBpZiBwb3NzaWJsZS4KKy8vIElmIHRoZXJl
J3MgYWx0ZXJuYXRpdmUgdGV4dCwgdGhhdCBjYW4gb3ZlcnJpZGUgdGhlIHRpdGxlLgorLSAoTlNT
dHJpbmcgKilhY2Nlc3NpYmlsaXR5VGl0bGUKK3sKKyAgICAvLyBTdGF0aWMgdGV4dCBvYmplY3Rz
IHNob3VsZCBub3QgaGF2ZSBhIHRpdGxlLiBJdHMgY29udGVudCBpcyBjb21tdW5pY2F0ZWQgaW4g
aXRzIEFYVmFsdWUuCisgICAgaWYgKG1fb2JqZWN0LT5yb2xlVmFsdWUoKSA9PSBTdGF0aWNUZXh0
Um9sZSkKKyAgICAgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmddOworCisgICAgVmVjdG9yPEFj
Y2Vzc2liaWxpdHlUZXh0PiB0ZXh0T3JkZXI7CisgICAgbV9vYmplY3QtPmFjY2Vzc2liaWxpdHlU
ZXh0KHRleHRPcmRlcik7CisgICAgCisgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dE9yZGVyLnNp
emUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgbGVuZ3RoOyBrKyspIHsKKyAgICAg
ICAgY29uc3QgQWNjZXNzaWJpbGl0eVRleHQmIHRleHQgPSB0ZXh0T3JkZXJba107CisgICAgICAg
IAorICAgICAgICAvLyBPbmNlIHdlIGVuY291bnRlciB2aXNpYmxlIHRleHQsIG9yIHRoZSB0ZXh0
IGZyb20gb3VyIGNoaWxkcmVuIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yZW1vc3QuCisgICAgICAg
IGlmICh0ZXh0LnRleHRTb3VyY2UgPT0gVmlzaWJsZVRleHQgfHwgdGV4dC50ZXh0U291cmNlID09
IENoaWxkcmVuVGV4dCkKKyAgICAgICAgICAgIHJldHVybiB0ZXh0LnRleHQ7CisgICAgICAgIAor
ICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGVsZW1lbnQgdGhhdCBsYWJlbHMgdGhpcyBvYmplY3Qg
YW5kIGl0J3Mgbm90IGV4cG9zZWQsIHRoZW4gd2Ugc2hvdWxkIHVzZQorICAgICAgICAvLyB0aGF0
IHRleHQgYXMgb3VyIHRpdGxlLgorICAgICAgICBpZiAodGV4dC50ZXh0U291cmNlID09IExhYmVs
QnlFbGVtZW50VGV4dCAmJiAhbV9vYmplY3QtPmV4cG9zZXNUaXRsZVVJRWxlbWVudCgpKQorICAg
ICAgICAgICAgcmV0dXJuIHRleHQudGV4dDsKKyAgICAgICAgCisgICAgICAgIC8vIEZJWE1FOiBU
aGUgdGl0bGUgdGFnIGlzIHVzZWQgaW4gY2VydGFpbiBjYXNlcyBmb3IgdGhlIHRpdGxlLiBUaGlz
IHVzYWdlIHNob3VsZAorICAgICAgICAvLyBwcm9iYWJseSBiZSBpbiB0aGUgZGVzY3JpcHRpb24g
ZmllbGQgc2luY2UgaXQncyBub3QgInZpc2libGUiLgorICAgICAgICBpZiAodGV4dC50ZXh0U291
cmNlID09IFRpdGxlVGFnVGV4dCAmJiAhW3NlbGYgdGl0bGVUYWdTaG91bGRCZVVzZWRJbkRlc2Ny
aXB0aW9uRmllbGRdKQorICAgICAgICAgICAgcmV0dXJuIHRleHQudGV4dDsKKyAgICB9CisgICAg
CisgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmddOworfQorCistIChOU1N0cmluZyAqKWFjY2Vz
c2liaWxpdHlEZXNjcmlwdGlvbgoreworICAgIC8vIFN0YXRpYyB0ZXh0IG9iamVjdHMgc2hvdWxk
IG5vdCBoYXZlIGEgZGVzY3JpcHRpb24uIEl0cyBjb250ZW50IGlzIGNvbW11bmljYXRlZCBpbiBp
dHMgQVhWYWx1ZS4KKyAgICAvLyBPbmUgZXhjZXB0aW9uIGlzIHRoZSBtZWRpYSBjb250cm9sIGxh
YmVscyB0aGF0IGhhdmUgYSB2YWx1ZSBhbmQgYSBkZXNjcmlwdGlvbi4gVGhvc2UgYXJlIHNldCBw
cm9ncmFtYXRpY2FsbHkuCisgICAgaWYgKG1fb2JqZWN0LT5yb2xlVmFsdWUoKSA9PSBTdGF0aWNU
ZXh0Um9sZSAmJiAhbV9vYmplY3QtPmlzTWVkaWFDb250cm9sTGFiZWwoKSkKKyAgICAgICAgcmV0
dXJuIFtOU1N0cmluZyBzdHJpbmddOworICAgIAorICAgIFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4
dD4gdGV4dE9yZGVyOworICAgIG1fb2JqZWN0LT5hY2Nlc3NpYmlsaXR5VGV4dCh0ZXh0T3JkZXIp
OworICAgIAorICAgIHVuc2lnbmVkIGxlbmd0aCA9IHRleHRPcmRlci5zaXplKCk7CisgICAgZm9y
ICh1bnNpZ25lZCBrID0gMDsgayA8IGxlbmd0aDsgaysrKSB7CisgICAgICAgIGNvbnN0IEFjY2Vz
c2liaWxpdHlUZXh0JiB0ZXh0ID0gdGV4dE9yZGVyW2tdOworICAgICAgICAKKyAgICAgICAgaWYg
KHRleHQudGV4dFNvdXJjZSA9PSBBbHRlcm5hdGl2ZVRleHQpCisgICAgICAgICAgICByZXR1cm4g
dGV4dC50ZXh0OworICAgICAgICAKKyAgICAgICAgaWYgKHRleHQudGV4dFNvdXJjZSA9PSBUaXRs
ZVRhZ1RleHQgJiYgW3NlbGYgdGl0bGVUYWdTaG91bGRCZVVzZWRJbkRlc2NyaXB0aW9uRmllbGRd
KQorICAgICAgICAgICAgcmV0dXJuIHRleHQudGV4dDsKKyAgICB9CisgICAgCisgICAgcmV0dXJu
IFtOU1N0cmluZyBzdHJpbmddOworfQorCistIChOU1N0cmluZyAqKWFjY2Vzc2liaWxpdHlIZWxw
VGV4dAoreworICAgIFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4dD4gdGV4dE9yZGVyOworICAgIG1f
b2JqZWN0LT5hY2Nlc3NpYmlsaXR5VGV4dCh0ZXh0T3JkZXIpOworICAgIAorICAgIHVuc2lnbmVk
IGxlbmd0aCA9IHRleHRPcmRlci5zaXplKCk7CisgICAgYm9vbCBkZXNjcmlwdGl2ZVRleHRBdmFp
bGFibGUgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgbGVuZ3RoOyBrKysp
IHsKKyAgICAgICAgY29uc3QgQWNjZXNzaWJpbGl0eVRleHQmIHRleHQgPSB0ZXh0T3JkZXJba107
CisgICAgICAgIAorICAgICAgICBpZiAodGV4dC50ZXh0U291cmNlID09IEhlbHBUZXh0IHx8IHRl
eHQudGV4dFNvdXJjZSA9PSBTdW1tYXJ5VGV4dCkKKyAgICAgICAgICAgIHJldHVybiB0ZXh0LnRl
eHQ7CisgICAgICAgIAorICAgICAgICAvLyBJZiBhbiBlbGVtZW50IGRvZXMgTk9UIGhhdmUgb3Ro
ZXIgZGVzY3JpcHRpdmUgdGV4dCB0aGUgdGl0bGUgdGFnIHNob3VsZCBiZSB1c2VkIGFzIGl0cyBk
ZXNjcmlwdGl2ZSB0ZXh0LgorICAgICAgICAvLyBCdXQsIGlmIHRob3NlIEFSRSBhdmFpbGFibGUs
IHRoZW4gdGhlIHRpdGxlIHRhZyBzaG91bGQgYmUgdXNlZCBmb3IgaGVscCB0ZXh0IGluc3RlYWQu
CisgICAgICAgIHN3aXRjaCAodGV4dC50ZXh0U291cmNlKSB7CisgICAgICAgIGNhc2UgQWx0ZXJu
YXRpdmVUZXh0OgorICAgICAgICBjYXNlIFZpc2libGVUZXh0OgorICAgICAgICBjYXNlIENoaWxk
cmVuVGV4dDoKKyAgICAgICAgY2FzZSBMYWJlbEJ5RWxlbWVudFRleHQ6CisgICAgICAgICAgICBk
ZXNjcmlwdGl2ZVRleHRBdmFpbGFibGUgPSB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICh0ZXh0LnRleHRT
b3VyY2UgPT0gVGl0bGVUYWdUZXh0ICYmIGRlc2NyaXB0aXZlVGV4dEF2YWlsYWJsZSkKKyAgICAg
ICAgICAgIHJldHVybiB0ZXh0LnRleHQ7CisgICAgfQorICAgIAorICAgIHJldHVybiBbTlNTdHJp
bmcgc3RyaW5nXTsKK30KKwogLy8gRklYTUU6IHNwbGl0IHVwIHRoaXMgZnVuY3Rpb24gaW4gYSBi
ZXR0ZXIgd2F5LiAgCiAvLyBzdWdnZXN0aW9uczogVXNlIGEgaGFzaCB0YWJsZSB0aGF0IG1hcHMg
YXR0cmlidXRlIG5hbWVzIHRvIGZ1bmN0aW9uIGNhbGxzLAogLy8gb3IgbWF5YmUgcG9pbnRlcnMg
dG8gbWVtYmVyIGZ1bmN0aW9ucwpAQCAtMTk4NCw3ICsyMDgxLDggQEAKICAgICAgICAgICAgIGlm
IChbW1tzZWxmIGF0dGFjaG1lbnRWaWV3XSBhY2Nlc3NpYmlsaXR5QXR0cmlidXRlTmFtZXNdIGNv
bnRhaW5zT2JqZWN0Ok5TQWNjZXNzaWJpbGl0eVRpdGxlQXR0cmlidXRlXSkgCiAgICAgICAgICAg
ICAgICAgcmV0dXJuIFtbc2VsZiBhdHRhY2htZW50Vmlld10gYWNjZXNzaWJpbGl0eUF0dHJpYnV0
ZVZhbHVlOk5TQWNjZXNzaWJpbGl0eVRpdGxlQXR0cmlidXRlXTsKICAgICAgICAgfQotICAgICAg
ICByZXR1cm4gbV9vYmplY3QtPnRpdGxlKCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gW3Nl
bGYgYWNjZXNzaWJpbGl0eVRpdGxlXTsKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGVO
YW1lIGlzRXF1YWxUb1N0cmluZzogTlNBY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb25BdHRyaWJ1dGVd
KSB7CkBAIC0xOTkyLDcgKzIwOTAsNyBAQAogICAgICAgICAgICAgaWYgKFtbW3NlbGYgYXR0YWNo
bWVudFZpZXddIGFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVOYW1lc10gY29udGFpbnNPYmplY3Q6TlNB
Y2Nlc3NpYmlsaXR5RGVzY3JpcHRpb25BdHRyaWJ1dGVdKQogICAgICAgICAgICAgICAgIHJldHVy
biBbW3NlbGYgYXR0YWNobWVudFZpZXddIGFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1ZTpOU0Fj
Y2Vzc2liaWxpdHlEZXNjcmlwdGlvbkF0dHJpYnV0ZV07CiAgICAgICAgIH0KLSAgICAgICAgcmV0
dXJuIG1fb2JqZWN0LT5hY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb24oKTsKKyAgICAgICAgcmV0dXJu
IFtzZWxmIGFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbl07CiAgICAgfQogCiAgICAgaWYgKFthdHRy
aWJ1dGVOYW1lIGlzRXF1YWxUb1N0cmluZzogTlNBY2Nlc3NpYmlsaXR5VmFsdWVBdHRyaWJ1dGVd
KSB7CkBAIC0yMDQ2LDcgKzIxNDQsNyBAQAogICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51bWJl
cldpdGhGbG9hdDptX29iamVjdC0+bWF4VmFsdWVGb3JSYW5nZSgpXTsKIAogICAgIGlmIChbYXR0
cmlidXRlTmFtZSBpc0VxdWFsVG9TdHJpbmc6IE5TQWNjZXNzaWJpbGl0eUhlbHBBdHRyaWJ1dGVd
KQotICAgICAgICByZXR1cm4gbV9vYmplY3QtPmhlbHBUZXh0KCk7CisgICAgICAgIHJldHVybiBb
c2VsZiBhY2Nlc3NpYmlsaXR5SGVscFRleHRdOwogCiAgICAgaWYgKFthdHRyaWJ1dGVOYW1lIGlz
RXF1YWxUb1N0cmluZzogTlNBY2Nlc3NpYmlsaXR5Rm9jdXNlZEF0dHJpYnV0ZV0pCiAgICAgICAg
IHJldHVybiBbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6IG1fb2JqZWN0LT5pc0ZvY3VzZWQoKV07
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNZWRpYUNv
bnRyb2xzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nl
c3NpYmlsaXR5TWVkaWFDb250cm9scy5oCShyZXZpc2lvbiAxMzE1NTApCisrKyBTb3VyY2UvV2Vi
Q29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNZWRpYUNvbnRyb2xzLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTU0LDYgKzU0LDcgQEAKICAgICBleHBsaWNpdCBBY2Nlc3NpYmlsaXR5TWVkaWFD
b250cm9sKFJlbmRlck9iamVjdCopOwogICAgIE1lZGlhQ29udHJvbEVsZW1lbnRUeXBlIGNvbnRy
b2xUeXBlKCkgY29uc3Q7CiAgICAgU3RyaW5nIGNvbnRyb2xUeXBlTmFtZSgpIGNvbnN0OworICAg
IHZpcnR1YWwgdm9pZCBhY2Nlc3NpYmlsaXR5VGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+
Jik7CiB9OwogCiAKQEAgLTEwNyw2ICsxMDgsNyBAQAogCiBwcml2YXRlOgogICAgIGV4cGxpY2l0
IEFjY2Vzc2liaWxpdHlNZWRpYVRpbWVEaXNwbGF5KFJlbmRlck9iamVjdCopOworICAgIHZpcnR1
YWwgYm9vbCBpc01lZGlhQ29udHJvbExhYmVsKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogfTsK
IAogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmpl
Y3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2li
aWxpdHlPYmplY3QuaAkocmV2aXNpb24gMTMxNTUwKQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNz
aWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTIwMSw2ICsy
MDEsNDEgQEAKICAgICBXaW5kb3dSb2xlLAogfTsKIAorZW51bSBBY2Nlc3NpYmlsaXR5VGV4dFNv
dXJjZSB7CisgICAgQWx0ZXJuYXRpdmVUZXh0LAorICAgIENoaWxkcmVuVGV4dCwKKyAgICBTdW1t
YXJ5VGV4dCwKKyAgICBIZWxwVGV4dCwKKyAgICBWaXNpYmxlVGV4dCwKKyAgICBUaXRsZVRhZ1Rl
eHQsCisgICAgUGxhY2Vob2xkZXJUZXh0LAorICAgIExhYmVsQnlFbGVtZW50VGV4dCwKK307Cisg
ICAgCitzdHJ1Y3QgQWNjZXNzaWJpbGl0eVRleHQgeworICAgIFN0cmluZyB0ZXh0OworICAgIEFj
Y2Vzc2liaWxpdHlUZXh0U291cmNlIHRleHRTb3VyY2U7CisgICAgVmVjdG9yPFJlZlB0cjxBY2Nl
c3NpYmlsaXR5T2JqZWN0PiA+IHRleHRFbGVtZW50czsKKyAgICAKKyAgICBBY2Nlc3NpYmlsaXR5
VGV4dChjb25zdCBTdHJpbmcmIHQsIGNvbnN0IEFjY2Vzc2liaWxpdHlUZXh0U291cmNlJiBzKQor
ICAgIDogdGV4dCh0KQorICAgICwgdGV4dFNvdXJjZShzKQorICAgIHsgfQorCisgICAgQWNjZXNz
aWJpbGl0eVRleHQoY29uc3QgU3RyaW5nJiB0LCBjb25zdCBBY2Nlc3NpYmlsaXR5VGV4dFNvdXJj
ZSYgcywgY29uc3QgVmVjdG9yPFJlZlB0cjxBY2Nlc3NpYmlsaXR5T2JqZWN0PiA+IGVsZW1lbnRz
KQorICAgIDogdGV4dCh0KQorICAgICwgdGV4dFNvdXJjZShzKQorICAgICwgdGV4dEVsZW1lbnRz
KGVsZW1lbnRzKQorICAgIHsgfQorCisgICAgQWNjZXNzaWJpbGl0eVRleHQoY29uc3QgU3RyaW5n
JiB0LCBjb25zdCBBY2Nlc3NpYmlsaXR5VGV4dFNvdXJjZSYgcywgY29uc3QgUmVmUHRyPEFjY2Vz
c2liaWxpdHlPYmplY3Q+IGVsZW1lbnQpCisgICAgOiB0ZXh0KHQpCisgICAgLCB0ZXh0U291cmNl
KHMpCisgICAgeworICAgICAgICB0ZXh0RWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpOworICAgIH0K
K307CisgICAgCiBlbnVtIEFjY2Vzc2liaWxpdHlPcmllbnRhdGlvbiB7CiAgICAgQWNjZXNzaWJp
bGl0eU9yaWVudGF0aW9uVmVydGljYWwsCiAgICAgQWNjZXNzaWJpbGl0eU9yaWVudGF0aW9uSG9y
aXpvbnRhbCwKQEAgLTM3MSw2ICs0MDYsNyBAQAogICAgIHZpcnR1YWwgYm9vbCBpc1NwaW5CdXR0
b24oKSBjb25zdCB7IHJldHVybiByb2xlVmFsdWUoKSA9PSBTcGluQnV0dG9uUm9sZTsgfQogICAg
IHZpcnR1YWwgYm9vbCBpc1NwaW5CdXR0b25QYXJ0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
ICAgICB2aXJ0dWFsIGJvb2wgaXNNb2NrT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
KyAgICB2aXJ0dWFsIGJvb2wgaXNNZWRpYUNvbnRyb2xMYWJlbCgpIGNvbnN0IHsgcmV0dXJuIGZh
bHNlOyB9CiAgICAgYm9vbCBpc1RleHRDb250cm9sKCkgY29uc3QgeyByZXR1cm4gcm9sZVZhbHVl
KCkgPT0gVGV4dEFyZWFSb2xlIHx8IHJvbGVWYWx1ZSgpID09IFRleHRGaWVsZFJvbGU7IH0KICAg
ICBib29sIGlzQVJJQVRleHRDb250cm9sKCkgY29uc3Q7CiAgICAgYm9vbCBpc1RhYkxpc3QoKSBj
b25zdCB7IHJldHVybiByb2xlVmFsdWUoKSA9PSBUYWJMaXN0Um9sZTsgfQpAQCAtNDMwLDkgKzQ2
Niw2IEBACiAgICAgdmlydHVhbCBib29sIGNhblNldFNlbGVjdGVkQ2hpbGRyZW5BdHRyaWJ1dGUo
KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBjYW5TZXRFeHBhbmRl
ZEF0dHJpYnV0ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgCi0gICAgLy8gQSBwcm9n
cmFtbWF0aWMgd2F5IHRvIHNldCBhIG5hbWUgb24gYW4gQWNjZXNzaWJsZU9iamVjdC4KLSAgICB2
aXJ0dWFsIHZvaWQgc2V0QWNjZXNzaWJsZU5hbWUoY29uc3QgQXRvbWljU3RyaW5nJikgeyB9Ci0g
ICAgCiAgICAgdmlydHVhbCBOb2RlKiBub2RlKCkgY29uc3QgeyByZXR1cm4gMDsgfQogICAgIHZp
cnR1YWwgUmVuZGVyT2JqZWN0KiByZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIDA7IH0KICAgICB2
aXJ0dWFsIGJvb2wgYWNjZXNzaWJpbGl0eUlzSWdub3JlZCgpIGNvbnN0ICB7IHJldHVybiB0cnVl
OyB9CkBAIC01MDEsMTIgKzUzNCwyOSBAQAogICAgIHZpcnR1YWwgYm9vbCBpc1ByZXNlbnRhdGlv
bmFsQ2hpbGRPZkFyaWFSb2xlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFs
IGJvb2wgYXJpYVJvbGVIYXNQcmVzZW50YXRpb25hbENoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4g
ZmFsc2U7IH0KIAotICAgIHZvaWQgc2V0Um9sZVZhbHVlKEFjY2Vzc2liaWxpdHlSb2xlIHJvbGUp
IHsgbV9yb2xlID0gcm9sZTsgfQotICAgIHZpcnR1YWwgQWNjZXNzaWJpbGl0eVJvbGUgcm9sZVZh
bHVlKCkgY29uc3QgeyByZXR1cm4gbV9yb2xlOyB9CisgICAgLy8gQWNjZXNzaWJpbGl0eSBUZXh0
CisgICAgdmlydHVhbCB2b2lkIGFjY2Vzc2liaWxpdHlUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5
VGV4dD4mKSB7IH07CisKKyAgICAvLyBBIHByb2dyYW1tYXRpYyB3YXkgdG8gc2V0IGEgbmFtZSBv
biBhbiBBY2Nlc3NpYmxlT2JqZWN0LgorICAgIHZpcnR1YWwgdm9pZCBzZXRBY2Nlc3NpYmxlTmFt
ZShjb25zdCBBdG9taWNTdHJpbmcmKSB7IH0KKworICAgIC8vIEFjY2Vzc2liaWxpdHkgVGV4dCAt
IChUbyBiZSBkZXByZWNhdGVkKS4KKyAgICB2aXJ0dWFsIFN0cmluZyBhY2Nlc3NpYmlsaXR5RGVz
Y3JpcHRpb24oKSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgU3RyaW5n
IHRpdGxlKCkgY29uc3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KKyAgICB2aXJ0dWFsIFN0cmluZyBo
ZWxwVGV4dCgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9CisKKyAgICAvLyBNZXRob2RzIGZv
ciBkZXRlcm1pbmluZyBhY2Nlc3NpYmlsaXR5IHRleHQuCisgICAgdmlydHVhbCBTdHJpbmcgc3Ry
aW5nVmFsdWUoKSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgU3RyaW5n
IHRleHRVbmRlckVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1
YWwgU3RyaW5nIHRleHQoKSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwg
aW50IHRleHRMZW5ndGgoKSBjb25zdCB7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBTdHJpbmcg
YXJpYUxhYmVsZWRCeUF0dHJpYnV0ZSgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9CiAgICAg
dmlydHVhbCBTdHJpbmcgYXJpYURlc2NyaWJlZEJ5QXR0cmlidXRlKCkgY29uc3QgeyByZXR1cm4g
U3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIFN0cmluZyBhY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb24o
KSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcGxh
Y2Vob2xkZXJWYWx1ZSgpIGNvbnN0OwogCisgICAgdm9pZCBzZXRSb2xlVmFsdWUoQWNjZXNzaWJp
bGl0eVJvbGUgcm9sZSkgeyBtX3JvbGUgPSByb2xlOyB9CisgICAgdmlydHVhbCBBY2Nlc3NpYmls
aXR5Um9sZSByb2xlVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3JvbGU7IH0KKwogICAgIHZpcnR1
YWwgQVhPYmplY3RDYWNoZSogYXhPYmplY3RDYWNoZSgpIGNvbnN0OwogICAgIEFYSUQgYXhPYmpl
Y3RJRCgpIGNvbnN0IHsgcmV0dXJuIG1faWQ7IH0KICAgICB2b2lkIHNldEFYT2JqZWN0SUQoQVhJ
RCBheE9iamVjdElEKSB7IG1faWQgPSBheE9iamVjdElEOyB9CkBAIC01MjksMTIgKzU3OSw2IEBA
CiAgICAgCiAgICAgdmlydHVhbCBLVVJMIHVybCgpIGNvbnN0IHsgcmV0dXJuIEtVUkwoKTsgfQog
ICAgIHZpcnR1YWwgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rpb24oKSBjb25zdCB7IHJldHVybiBW
aXNpYmxlU2VsZWN0aW9uKCk7IH0KLSAgICB2aXJ0dWFsIFN0cmluZyBzdHJpbmdWYWx1ZSgpIGNv
bnN0IHsgcmV0dXJuIFN0cmluZygpOyB9Ci0gICAgdmlydHVhbCBTdHJpbmcgdGl0bGUoKSBjb25z
dCB7IHJldHVybiBTdHJpbmcoKTsgfQotICAgIHZpcnR1YWwgU3RyaW5nIGhlbHBUZXh0KCkgY29u
c3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIFN0cmluZyB0ZXh0VW5kZXJFbGVt
ZW50KCkgY29uc3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIFN0cmluZyB0ZXh0
KCkgY29uc3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIGludCB0ZXh0TGVuZ3Ro
KCkgY29uc3QgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgU3RyaW5nIHNlbGVjdGVkVGV4dCgp
IGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9CiAgICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJp
bmcmIGFjY2Vzc0tleSgpIGNvbnN0IHsgcmV0dXJuIG51bGxBdG9tOyB9CiAgICAgY29uc3QgU3Ry
aW5nJiBhY3Rpb25WZXJiKCkgY29uc3Q7CkBAIC01NDYsNyArNTkwLDYgQEAKICAgICB2aXJ0dWFs
IEZyYW1lVmlldyogZG9jdW1lbnRGcmFtZVZpZXcoKSBjb25zdDsKICAgICBTdHJpbmcgbGFuZ3Vh
Z2UoKSBjb25zdDsKICAgICB2aXJ0dWFsIHVuc2lnbmVkIGhpZXJhcmNoaWNhbExldmVsKCkgY29u
c3QgeyByZXR1cm4gMDsgfQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcGxhY2Vob2xkZXJWYWx1
ZSgpIGNvbnN0OwogICAgIAogICAgIHZpcnR1YWwgdm9pZCBzZXRGb2N1c2VkKGJvb2wpIHsgfQog
ICAgIHZpcnR1YWwgdm9pZCBzZXRTZWxlY3RlZFRleHQoY29uc3QgU3RyaW5nJikgeyB9CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Qu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxp
dHlSZW5kZXJPYmplY3QuaAkocmV2aXNpb24gMTMxNTUwKQorKysgU291cmNlL1dlYkNvcmUvYWNj
ZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAg
LTE0Myw4ICsxNDMsNiBAQAogICAgIHZpcnR1YWwgUGxhaW5UZXh0UmFuZ2Ugc2VsZWN0ZWRUZXh0
UmFuZ2UoKSBjb25zdDsKICAgICB2aXJ0dWFsIFZpc2libGVTZWxlY3Rpb24gc2VsZWN0aW9uKCkg
Y29uc3Q7CiAgICAgdmlydHVhbCBTdHJpbmcgc3RyaW5nVmFsdWUoKSBjb25zdDsKLSAgICB2aXJ0
dWFsIFN0cmluZyBhcmlhRGVzY3JpYmVkQnlBdHRyaWJ1dGUoKSBjb25zdDsKLSAgICB2aXJ0dWFs
IFN0cmluZyBhY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb24oKSBjb25zdDsKICAgICB2aXJ0dWFsIFN0
cmluZyBoZWxwVGV4dCgpIGNvbnN0OwogICAgIHZpcnR1YWwgU3RyaW5nIHRleHRVbmRlckVsZW1l
bnQoKSBjb25zdDsKICAgICB2aXJ0dWFsIFN0cmluZyB0ZXh0KCkgY29uc3Q7CkBAIC0yNjEsOCAr
MjU5LDYgQEAKICAgICBib29sIGVsZW1lbnRBdHRyaWJ1dGVWYWx1ZShjb25zdCBRdWFsaWZpZWRO
YW1lJikgY29uc3Q7CiAgICAgdm9pZCBzZXRFbGVtZW50QXR0cmlidXRlVmFsdWUoY29uc3QgUXVh
bGlmaWVkTmFtZSYsIGJvb2wpOwogICAgIAotICAgIFN0cmluZyB3ZWJBcmVhQWNjZXNzaWJpbGl0
eURlc2NyaXB0aW9uKCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIEVTcGVhayBzcGVha1Byb3BlcnR5
KCkgY29uc3Q7CiAgICAgCiAgICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIGFyaWFMaXZl
UmVnaW9uU3RhdHVzKCkgY29uc3Q7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5
L0FjY2Vzc2liaWxpdHlOb2RlT2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
YWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdC5oCShyZXZpc2lvbiAxMzE1NTAp
CisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlT2JqZWN0
LmgJKHdvcmtpbmcgY29weSkKQEAgLTE3NCwxMyArMTc0LDIyIEBACiAgICAgdm9pZCBhcmlhTGFi
ZWxlZEJ5RWxlbWVudHMoVmVjdG9yPEVsZW1lbnQqPiYgZWxlbWVudHMpIGNvbnN0OwogICAgIFN0
cmluZyBhY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb25Gb3JFbGVtZW50cyhWZWN0b3I8RWxlbWVudCo+
ICZlbGVtZW50cykgY29uc3Q7CiAgICAgdm9pZCBlbGVtZW50c0Zyb21BdHRyaWJ1dGUoVmVjdG9y
PEVsZW1lbnQqPiYgZWxlbWVudHMsIGNvbnN0IFF1YWxpZmllZE5hbWUmKSBjb25zdDsKLQorICAg
IFN0cmluZyBhcmlhRGVzY3JpYmVkQnlBdHRyaWJ1dGUoKSBjb25zdDsKKyAgICAKICAgICBFbGVt
ZW50KiBtZW51RWxlbWVudEZvck1lbnVCdXR0b24oKSBjb25zdDsKICAgICBFbGVtZW50KiBtZW51
SXRlbUVsZW1lbnRGb3JNZW51KCkgY29uc3Q7CiAgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogbWVu
dUJ1dHRvbkZvck1lbnUoKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBOb2RlKiBtX25vZGU7CisK
KyAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzaWJpbGl0eVRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlU
ZXh0PiYpOworICAgIHZvaWQgYWx0ZXJuYXRpdmVUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4
dD4mKSBjb25zdDsKKyAgICB2b2lkIHZpc2libGVUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4
dD4mKSBjb25zdDsKKyAgICB2b2lkIHRpdGxlRWxlbWVudFRleHQoVmVjdG9yPEFjY2Vzc2liaWxp
dHlUZXh0PiYpOworICAgIHZvaWQgaGVscFRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYp
IGNvbnN0OworICAgIFN0cmluZyBhbHRlcm5hdGl2ZVRleHRGb3JXZWJBcmVhKCkgY29uc3Q7Cisg
ICAgdm9pZCBhcmlhTGFiZWxlZEJ5VGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+JikgY29u
c3Q7CiB9OwogCiBpbmxpbmUgQWNjZXNzaWJpbGl0eU5vZGVPYmplY3QqIHRvQWNjZXNzaWJpbGl0
eU5vZGVPYmplY3QoQWNjZXNzaWJpbGl0eU9iamVjdCogb2JqZWN0KQpJbmRleDogU291cmNlL1dl
YkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlJbWFnZU1h
cExpbmsuY3BwCShyZXZpc2lvbiAxMzE1NTApCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L0FjY2Vzc2liaWxpdHlJbWFnZU1hcExpbmsuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NCw2
ICs5NCwyMSBAQAogICAgIAogICAgIHJldHVybiBtX2FyZWFFbGVtZW50LT5ocmVmKCk7CiB9CisK
K3ZvaWQgQWNjZXNzaWJpbGl0eUltYWdlTWFwTGluazo6YWNjZXNzaWJpbGl0eVRleHQoVmVjdG9y
PEFjY2Vzc2liaWxpdHlUZXh0PiYgdGV4dE9yZGVyKQoreworICAgIFN0cmluZyBkZXNjcmlwdGlv
biA9IGFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpOworICAgIGlmICghZGVzY3JpcHRpb24uaXNF
bXB0eSgpKQorICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KGRlc2Ny
aXB0aW9uLCBBbHRlcm5hdGl2ZVRleHQpKTsKKworICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdGl0
bGVUZXh0ID0gZ2V0QXR0cmlidXRlKHRpdGxlQXR0cik7CisgICAgaWYgKCF0aXRsZVRleHQuaXNF
bXB0eSgpKQorICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KHRpdGxl
VGV4dCwgVGl0bGVUYWdUZXh0KSk7CisKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIHN1bW1hcnkg
PSBnZXRBdHRyaWJ1dGUoc3VtbWFyeUF0dHIpOworICAgIGlmICghc3VtbWFyeS5pc0VtcHR5KCkp
CisgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQoc3VtbWFyeSwgU3Vt
bWFyeVRleHQpKTsKK30KICAgICAKIFN0cmluZyBBY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rOjph
Y2Nlc3NpYmlsaXR5RGVzY3JpcHRpb24oKSBjb25zdAogewpJbmRleDogU291cmNlL1dlYkNvcmUv
YWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWVkaWFDb250cm9scy5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWVkaWFDb250cm9s
cy5jcHAJKHJldmlzaW9uIDEzMTU1MCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eU1lZGlhQ29udHJvbHMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDAsNiAr
MTQwLDIyIEBACiAgICAgcmV0dXJuIFN0cmluZygpOwogfQogCit2b2lkIEFjY2Vzc2liaWxpdHlN
ZWRpYUNvbnRyb2w6OmFjY2Vzc2liaWxpdHlUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4dD4m
IHRleHRPcmRlcikKK3sKKyAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBhY2Nlc3NpYmlsaXR5RGVz
Y3JpcHRpb24oKTsKKyAgICBpZiAoIWRlc2NyaXB0aW9uLmlzRW1wdHkoKSkKKyAgICAgICAgdGV4
dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChkZXNjcmlwdGlvbiwgQWx0ZXJuYXRpdmVU
ZXh0KSk7CisKKyAgICBTdHJpbmcgdGl0bGUgPSB0aGlzLT50aXRsZSgpOworICAgIGlmICghdGl0
bGUuaXNFbXB0eSgpKQorICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0
KHRpdGxlLCBBbHRlcm5hdGl2ZVRleHQpKTsKKworICAgIFN0cmluZyBoZWxwdGV4dCA9IGhlbHBU
ZXh0KCk7CisgICAgaWYgKCFoZWxwdGV4dC5pc0VtcHR5KCkpCisgICAgICAgIHRleHRPcmRlci5h
cHBlbmQoQWNjZXNzaWJpbGl0eVRleHQoaGVscHRleHQsIEhlbHBUZXh0KSk7Cit9CisgICAgCisK
IFN0cmluZyBBY2Nlc3NpYmlsaXR5TWVkaWFDb250cm9sOjp0aXRsZSgpIGNvbnN0CiB7CiAgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGNvbnRyb2xzUGFuZWwsIChBU0NJSUxp
dGVyYWwoIkNvbnRyb2xzUGFuZWwiKSkpOwpJbmRleDogU291cmNlL1dlYkNvcmUvYWNjZXNzaWJp
bGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCShyZXZp
c2lvbiAxMzE1NTApCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxp
dHlSZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MjUsNzIgKzcyNSw2IEBACiAg
ICAgcmV0dXJuIDA7CiB9CiAKLVN0cmluZyBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojphcmlh
RGVzY3JpYmVkQnlBdHRyaWJ1dGUoKSBjb25zdAotewotICAgIFZlY3RvcjxFbGVtZW50Kj4gZWxl
bWVudHM7Ci0gICAgZWxlbWVudHNGcm9tQXR0cmlidXRlKGVsZW1lbnRzLCBhcmlhX2Rlc2NyaWJl
ZGJ5QXR0cik7Ci0gICAgCi0gICAgcmV0dXJuIGFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbkZvckVs
ZW1lbnRzKGVsZW1lbnRzKTsKLX0KLSAgICAKLVN0cmluZyBBY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0Ojp3ZWJBcmVhQWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uKCkgY29uc3QKLXsKLSAgICAvLyBU
aGUgV2ViQXJlYSBkZXNjcmlwdGlvbiBzaG91bGQgZm9sbG93IHRoaXMgb3JkZXI6Ci0gICAgLy8g
ICAgIGFyaWEtbGFiZWwgb24gdGhlIDxodG1sPgotICAgIC8vICAgICB0aXRsZSBvbiB0aGUgPGh0
bWw+Ci0gICAgLy8gICAgIDx0aXRsZT4gaW5zaWRlIHRoZSA8aGVhZD4gKG9mIGl0IHdhcyBzZXQg
dGhyb3VnaCBKUykKLSAgICAvLyAgICAgbmFtZSBvbiB0aGUgPGh0bWw+Ci0gICAgLy8gRm9yIGlm
cmFtZXM6Ci0gICAgLy8gICAgIGFyaWEtbGFiZWwgb24gdGhlIDxpZnJhbWU+Ci0gICAgLy8gICAg
IHRpdGxlIG9uIHRoZSA8aWZyYW1lPgotICAgIC8vICAgICBuYW1lIG9uIHRoZSA8aWZyYW1lPgot
ICAgIAotICAgIGlmICghbV9yZW5kZXJlcikKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotICAg
IAotICAgIERvY3VtZW50KiBkb2N1bWVudCA9IG1fcmVuZGVyZXItPmRvY3VtZW50KCk7Ci0gICAg
Ci0gICAgLy8gQ2hlY2sgaWYgdGhlIEhUTUwgZWxlbWVudCBoYXMgYW4gYXJpYS1sYWJlbCBmb3Ig
dGhlIHdlYnBhZ2UuCi0gICAgaWYgKEVsZW1lbnQqIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50
LT5kb2N1bWVudEVsZW1lbnQoKSkgewotICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGFyaWFM
YWJlbCA9IGRvY3VtZW50RWxlbWVudC0+Z2V0QXR0cmlidXRlKGFyaWFfbGFiZWxBdHRyKTsKLSAg
ICAgICAgaWYgKCFhcmlhTGFiZWwuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIGFyaWFM
YWJlbDsKLSAgICB9Ci0gICAgCi0gICAgTm9kZSogb3duZXIgPSBkb2N1bWVudC0+b3duZXJFbGVt
ZW50KCk7Ci0gICAgaWYgKG93bmVyKSB7Ci0gICAgICAgIGlmIChvd25lci0+aGFzVGFnTmFtZShm
cmFtZVRhZykgfHwgb3duZXItPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSkgewotICAgICAgICAgICAg
Y29uc3QgQXRvbWljU3RyaW5nJiB0aXRsZSA9IHN0YXRpY19jYXN0PEhUTUxGcmFtZUVsZW1lbnRC
YXNlKj4ob3duZXIpLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKLSAgICAgICAgICAgIGlmICgh
dGl0bGUuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0aXRsZTsKLSAgICAgICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRnJhbWVFbGVtZW50QmFzZSo+KG93bmVyKS0+Z2V0
TmFtZUF0dHJpYnV0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvd25lci0+aXNIVE1MRWxl
bWVudCgpKQotICAgICAgICAgICAgcmV0dXJuIHRvSFRNTEVsZW1lbnQob3duZXIpLT5nZXROYW1l
QXR0cmlidXRlKCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIGRvY3VtZW50VGl0bGUgPSBkb2N1bWVu
dC0+dGl0bGUoKTsKLSAgICBpZiAoIWRvY3VtZW50VGl0bGUuaXNFbXB0eSgpKQotICAgICAgICBy
ZXR1cm4gZG9jdW1lbnRUaXRsZTsKLSAgICAKLSAgICBvd25lciA9IGRvY3VtZW50LT5ib2R5KCk7
Ci0gICAgaWYgKG93bmVyICYmIG93bmVyLT5pc0hUTUxFbGVtZW50KCkpCi0gICAgICAgIHJldHVy
biB0b0hUTUxFbGVtZW50KG93bmVyKS0+Z2V0TmFtZUF0dHJpYnV0ZSgpOwotICAgIAotICAgIHJl
dHVybiBTdHJpbmcoKTsKLX0KLSAgICAKLVN0cmluZyBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0
OjphY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb24oKSBjb25zdAotewotICAgIGlmICghbV9yZW5kZXJl
cikKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotCi0gICAgaWYgKGlzV2ViQXJlYSgpKQotICAg
ICAgICByZXR1cm4gd2ViQXJlYUFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpOwotCi0gICAgcmV0
dXJuIEFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0OjphY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb24oKTsK
LX0KLQogTGF5b3V0UmVjdCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpib3VuZGluZ0JveFJl
Y3QoKSBjb25zdAogewogICAgIFJlbmRlck9iamVjdCogb2JqID0gbV9yZW5kZXJlcjsKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU5vZGVPYmplY3QuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0
eU5vZGVPYmplY3QuY3BwCShyZXZpc2lvbiAxMzE1NTApCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MTA3NCw2ICsxMDc0LDIyMyBAQAogICAgIHJldHVybiAwOwogfQogCit2b2lkIEFjY2Vzc2liaWxp
dHlOb2RlT2JqZWN0Ojp0aXRsZUVsZW1lbnRUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4dD4m
IHRleHRPcmRlcikKK3sKKyAgICBOb2RlKiBub2RlID0gdGhpcy0+bm9kZSgpOworICAgIGlmICgh
bm9kZSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGJvb2wgaXNJbnB1dFRhZyA9IG5vZGUt
Pmhhc1RhZ05hbWUoaW5wdXRUYWcpOworICAgIGlmIChpc0lucHV0VGFnIHx8IEFjY2Vzc2liaWxp
dHlPYmplY3Q6OmlzQVJJQUlucHV0KGFyaWFSb2xlQXR0cmlidXRlKCkpIHx8IGlzQ29udHJvbCgp
KSB7CisgICAgICAgIEhUTUxMYWJlbEVsZW1lbnQqIGxhYmVsID0gbGFiZWxGb3JFbGVtZW50KHRv
RWxlbWVudChub2RlKSk7CisgICAgICAgIGlmIChsYWJlbCkgeworICAgICAgICAgICAgQWNjZXNz
aWJpbGl0eU9iamVjdCogbGFiZWxPYmplY3QgPSBheE9iamVjdENhY2hlKCktPmdldE9yQ3JlYXRl
KGxhYmVsKTsKKyAgICAgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQo
bGFiZWwtPmlubmVyVGV4dCgpLCBMYWJlbEJ5RWxlbWVudFRleHQsIGxhYmVsT2JqZWN0KSk7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgQWNjZXNzaWJp
bGl0eU9iamVjdCogdGl0bGVVSUVsZW1lbnQgPSB0aGlzLT50aXRsZVVJRWxlbWVudCgpOworICAg
IGlmICh0aXRsZVVJRWxlbWVudCkKKyAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmls
aXR5VGV4dChTdHJpbmcoKSwgTGFiZWxCeUVsZW1lbnRUZXh0LCB0aXRsZVVJRWxlbWVudCkpOwor
ICAgIAorfQorICAgIAordm9pZCBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YWNjZXNzaWJpbGl0
eVRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYgdGV4dE9yZGVyKQoreworICAgIHRpdGxl
RWxlbWVudFRleHQodGV4dE9yZGVyKTsKKyAgICAKKyAgICBhbHRlcm5hdGl2ZVRleHQodGV4dE9y
ZGVyKTsKKyAgICAKKyAgICB2aXNpYmxlVGV4dCh0ZXh0T3JkZXIpOworICAgIAorICAgIGhlbHBU
ZXh0KHRleHRPcmRlcik7CisgICAgCisgICAgU3RyaW5nIHBsYWNlaG9sZGVyID0gcGxhY2Vob2xk
ZXJWYWx1ZSgpOworICAgIGlmICghcGxhY2Vob2xkZXIuaXNFbXB0eSgpKQorICAgICAgICB0ZXh0
T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KHBsYWNlaG9sZGVyLCBQbGFjZWhvbGRlclRl
eHQpKTsKK30KKyAgICAKK3ZvaWQgQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFyaWFMYWJlbGVk
QnlUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4dD4mIHRleHRPcmRlcikgY29uc3QKK3sKKyAg
ICBTdHJpbmcgYXJpYUxhYmVsZWRCeSA9IGFyaWFMYWJlbGVkQnlBdHRyaWJ1dGUoKTsKKyAgICBp
ZiAoIWFyaWFMYWJlbGVkQnkuaXNFbXB0eSgpKSB7CisgICAgICAgIFZlY3RvcjxFbGVtZW50Kj4g
ZWxlbWVudHM7CisgICAgICAgIGFyaWFMYWJlbGVkQnlFbGVtZW50cyhlbGVtZW50cyk7CisgICAg
ICAgIAorICAgICAgICBWZWN0b3I8UmVmUHRyPEFjY2Vzc2liaWxpdHlPYmplY3Q+ID4gYXhFbGVt
ZW50czsKKyAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gZWxlbWVudHMuc2l6ZSgpOworICAgICAg
ICBmb3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgbGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgIFJl
ZlB0cjxBY2Nlc3NpYmlsaXR5T2JqZWN0PiBheEVsZW1lbnQgPSBheE9iamVjdENhY2hlKCktPmdl
dE9yQ3JlYXRlKGVsZW1lbnRzW2tdKTsKKyAgICAgICAgICAgIGF4RWxlbWVudHMuYXBwZW5kKGF4
RWxlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRleHRPcmRlci5hcHBlbmQo
QWNjZXNzaWJpbGl0eVRleHQoYXJpYUxhYmVsZWRCeSwgQWx0ZXJuYXRpdmVUZXh0LCBheEVsZW1l
bnRzKSk7CisgICAgfQorfQorICAgIAordm9pZCBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YWx0
ZXJuYXRpdmVUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4dD4mIHRleHRPcmRlcikgY29uc3QK
K3sKKyAgICBpZiAoaXNXZWJBcmVhKCkpIHsKKyAgICAgICAgU3RyaW5nIHdlYkFyZWFUZXh0ID0g
YWx0ZXJuYXRpdmVUZXh0Rm9yV2ViQXJlYSgpOworICAgICAgICBpZiAoIXdlYkFyZWFUZXh0Lmlz
RW1wdHkoKSkKKyAgICAgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQo
d2ViQXJlYVRleHQsIEFsdGVybmF0aXZlVGV4dCkpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgYXJpYUxhYmVsZWRCeVRleHQodGV4dE9yZGVyKTsKKyAgICAKKyAgICBjb25zdCBBdG9t
aWNTdHJpbmcmIGFyaWFMYWJlbCA9IGdldEF0dHJpYnV0ZShhcmlhX2xhYmVsQXR0cik7CisgICAg
aWYgKCFhcmlhTGFiZWwuaXNFbXB0eSgpKQorICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vz
c2liaWxpdHlUZXh0KGFyaWFMYWJlbCwgQWx0ZXJuYXRpdmVUZXh0KSk7CisgICAgCisgICAgaWYg
KGlzSW1hZ2UoKSB8fCBpc0lucHV0SW1hZ2UoKSB8fCBpc05hdGl2ZUltYWdlKCkgfHwgaXNDYW52
YXMoKSkgeworICAgICAgICAvLyBJbWFnZXMgc2hvdWxkIHVzZSBhbHQgYXMgbG9uZyBhcyB0aGUg
YXR0cmlidXRlIGlzIHByZXNlbnQsIGV2ZW4gaWYgZW1wdHkuCisgICAgICAgIC8vIE90aGVyd2lz
ZSwgaXQgc2hvdWxkIGZhbGxiYWNrIHRvIG90aGVyIG1ldGhvZHMsIGxpa2UgdGhlIHRpdGxlIGF0
dHJpYnV0ZS4KKyAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBhbHQgPSBnZXRBdHRyaWJ1dGUo
YWx0QXR0cik7CisgICAgICAgIGlmICghYWx0LmlzTnVsbCgpKQorICAgICAgICAgICAgdGV4dE9y
ZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChhbHQsIEFsdGVybmF0aXZlVGV4dCkpOworICAg
IH0KKyAgICAKKyNpZiBFTkFCTEUoTUFUSE1MKQorICAgIE5vZGUqIG5vZGUgPSB0aGlzLT5ub2Rl
KCk7CisgICAgaWYgKG5vZGUgJiYgbm9kZS0+aXNFbGVtZW50Tm9kZSgpICYmIHRvRWxlbWVudChu
b2RlKS0+aXNNYXRoTUxFbGVtZW50KCkpCisgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNz
aWJpbGl0eVRleHQoZ2V0QXR0cmlidXRlKE1hdGhNTE5hbWVzOjphbHR0ZXh0QXR0ciksIEFsdGVy
bmF0aXZlVGV4dCkpOworI2VuZGlmCit9CisgICAgCitTdHJpbmcgQWNjZXNzaWJpbGl0eU5vZGVP
YmplY3Q6OmFsdGVybmF0aXZlVGV4dEZvcldlYkFyZWEoKSBjb25zdAoreworICAgIC8vIFRoZSBX
ZWJBcmVhIGRlc2NyaXB0aW9uIHNob3VsZCBmb2xsb3cgdGhpcyBvcmRlcjoKKyAgICAvLyAgICAg
YXJpYS1sYWJlbCBvbiB0aGUgPGh0bWw+CisgICAgLy8gICAgIHRpdGxlIG9uIHRoZSA8aHRtbD4K
KyAgICAvLyAgICAgPHRpdGxlPiBpbnNpZGUgdGhlIDxoZWFkPiAob2YgaXQgd2FzIHNldCB0aHJv
dWdoIEpTKQorICAgIC8vICAgICBuYW1lIG9uIHRoZSA8aHRtbD4KKyAgICAvLyBGb3IgaWZyYW1l
czoKKyAgICAvLyAgICAgYXJpYS1sYWJlbCBvbiB0aGUgPGlmcmFtZT4KKyAgICAvLyAgICAgdGl0
bGUgb24gdGhlIDxpZnJhbWU+CisgICAgLy8gICAgIG5hbWUgb24gdGhlIDxpZnJhbWU+CisgICAg
CisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gdGhpcy0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRv
Y3VtZW50KQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgCisgICAgLy8gQ2hlY2sgaWYg
dGhlIEhUTUwgZWxlbWVudCBoYXMgYW4gYXJpYS1sYWJlbCBmb3IgdGhlIHdlYnBhZ2UuCisgICAg
aWYgKEVsZW1lbnQqIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQo
KSkgeworICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGFyaWFMYWJlbCA9IGRvY3VtZW50RWxl
bWVudC0+Z2V0QXR0cmlidXRlKGFyaWFfbGFiZWxBdHRyKTsKKyAgICAgICAgaWYgKCFhcmlhTGFi
ZWwuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGFyaWFMYWJlbDsKKyAgICB9CisgICAg
CisgICAgTm9kZSogb3duZXIgPSBkb2N1bWVudC0+b3duZXJFbGVtZW50KCk7CisgICAgaWYgKG93
bmVyKSB7CisgICAgICAgIGlmIChvd25lci0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgb3duZXIt
Pmhhc1RhZ05hbWUoaWZyYW1lVGFnKSkgeworICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5n
JiB0aXRsZSA9IHN0YXRpY19jYXN0PEhUTUxGcmFtZUVsZW1lbnRCYXNlKj4ob3duZXIpLT5nZXRB
dHRyaWJ1dGUodGl0bGVBdHRyKTsKKyAgICAgICAgICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKQor
ICAgICAgICAgICAgICAgIHJldHVybiB0aXRsZTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxIVE1MRnJhbWVFbGVtZW50QmFzZSo+KG93bmVyKS0+Z2V0TmFtZUF0dHJpYnV0ZSgpOwor
ICAgICAgICB9CisgICAgICAgIGlmIChvd25lci0+aXNIVE1MRWxlbWVudCgpKQorICAgICAgICAg
ICAgcmV0dXJuIHRvSFRNTEVsZW1lbnQob3duZXIpLT5nZXROYW1lQXR0cmlidXRlKCk7CisgICAg
fQorICAgIAorICAgIFN0cmluZyBkb2N1bWVudFRpdGxlID0gZG9jdW1lbnQtPnRpdGxlKCk7Cisg
ICAgaWYgKCFkb2N1bWVudFRpdGxlLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50
VGl0bGU7CisgICAgCisgICAgb3duZXIgPSBkb2N1bWVudC0+Ym9keSgpOworICAgIGlmIChvd25l
ciAmJiBvd25lci0+aXNIVE1MRWxlbWVudCgpKQorICAgICAgICByZXR1cm4gdG9IVE1MRWxlbWVu
dChvd25lciktPmdldE5hbWVBdHRyaWJ1dGUoKTsKKyAgICAKKyAgICByZXR1cm4gU3RyaW5nKCk7
Cit9CisKK3ZvaWQgQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OnZpc2libGVUZXh0KFZlY3RvcjxB
Y2Nlc3NpYmlsaXR5VGV4dD4mIHRleHRPcmRlcikgY29uc3QKK3sKKyAgICBOb2RlKiBub2RlID0g
dGhpcy0+bm9kZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAg
IGJvb2wgaXNJbnB1dFRhZyA9IG5vZGUtPmhhc1RhZ05hbWUoaW5wdXRUYWcpOworICAgIGlmIChp
c0lucHV0VGFnKSB7CisgICAgICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0ID0gc3RhdGljX2Nh
c3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUpOworICAgICAgICBpZiAoaW5wdXQtPmlzVGV4dEJ1
dHRvbigpKSB7CisgICAgICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0
KGlucHV0LT52YWx1ZVdpdGhEZWZhdWx0KCksIFZpc2libGVUZXh0KSk7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIG5vZGUgaXNuJ3QgcmVu
ZGVyZWQsIHRoZXJlJ3Mgbm8gaW5uZXIgdGV4dCB3ZSBjYW4gZXh0cmFjdCBmcm9tIGEgc2VsZWN0
IGVsZW1lbnQuCisgICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QoKSAmJiBub2Rl
LT5oYXNUYWdOYW1lKHNlbGVjdFRhZykpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBib29s
IHVzZVRleHRVbmRlckVsZW1lbnQgPSBmYWxzZTsKKyAgICAKKyAgICBzd2l0Y2ggKHJvbGVWYWx1
ZSgpKSB7CisgICAgY2FzZSBQb3BVcEJ1dHRvblJvbGU6CisgICAgY2FzZSBCdXR0b25Sb2xlOgor
ICAgIGNhc2UgVG9nZ2xlQnV0dG9uUm9sZToKKyAgICBjYXNlIENoZWNrQm94Um9sZToKKyAgICBj
YXNlIExpc3RCb3hPcHRpb25Sb2xlOgorICAgIGNhc2UgTWVudUJ1dHRvblJvbGU6CisgICAgY2Fz
ZSBNZW51SXRlbVJvbGU6CisgICAgY2FzZSBSYWRpb0J1dHRvblJvbGU6CisgICAgY2FzZSBUYWJS
b2xlOgorICAgICAgICB1c2VUZXh0VW5kZXJFbGVtZW50ID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7
CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGlmIChpc0hl
YWRpbmcoKSB8fCBpc0xpbmsoKSkKKyAgICAgICAgdXNlVGV4dFVuZGVyRWxlbWVudCA9IHRydWU7
CisgICAgCisgICAgLy8gSWYgaXQncyBmb2N1c2FibGUgYnV0IGl0J3Mgbm90IGNvbnRlbnQgZWRp
dGFibGUgb3IgYSBrbm93biBjb250cm9sIHR5cGUsIHRoZW4gaXQgd2lsbCBhcHBlYXIgdG8KKyAg
ICAvLyB0aGUgdXNlciBhcyBhIHNpbmdsZSBhdG9taWMgb2JqZWN0LCBzbyB3ZSBzaG91bGQgdXNl
IGl0cyB0ZXh0IGFzIHRoZSBkZWZhdWx0IHRpdGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIAorICAgIGlmIChpc0dlbmVyaWNGb2N1c2FibGVFbGVtZW50KCkpCisgICAgICAgIHVzZVRl
eHRVbmRlckVsZW1lbnQgPSB0cnVlOworICAgIAorICAgIGlmICh1c2VUZXh0VW5kZXJFbGVtZW50
KSB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gdGV4dFVuZGVyRWxlbWVudCgpOworICAgICAgICBp
ZiAoIXRleHQuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3Np
YmlsaXR5VGV4dCh0ZXh0LCBDaGlsZHJlblRleHQpKTsKKyAgICB9CisKK30KKyAgICAKK3ZvaWQg
QWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmhlbHBUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4
dD4mIHRleHRPcmRlcikgY29uc3QKK3sKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIGFyaWFIZWxw
ID0gZ2V0QXR0cmlidXRlKGFyaWFfaGVscEF0dHIpOworICAgIGlmICghYXJpYUhlbHAuaXNFbXB0
eSgpKQorICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KGFyaWFIZWxw
LCBIZWxwVGV4dCkpOworICAgIAorICAgIFN0cmluZyBkZXNjcmliZWRCeSA9IGFyaWFEZXNjcmli
ZWRCeUF0dHJpYnV0ZSgpOworICAgIGlmICghZGVzY3JpYmVkQnkuaXNFbXB0eSgpKQorICAgICAg
ICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KGRlc2NyaWJlZEJ5LCBTdW1tYXJ5
VGV4dCkpOworICAgIAorICAgIC8vIEFkZCBoZWxwIHR5cGUgdGV4dCB0aGF0IGlzIGRlcml2ZWQg
ZnJvbSBhbmNlc3RvcnMuCisgICAgZm9yIChOb2RlKiBjdXJyID0gbm9kZSgpOyBjdXJyOyBjdXJy
ID0gY3Vyci0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3Vt
bWFyeSA9IGdldEF0dHJpYnV0ZShzdW1tYXJ5QXR0cik7CisgICAgICAgIGlmICghc3VtbWFyeS5p
c0VtcHR5KCkpCisgICAgICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0
KHN1bW1hcnksIFN1bW1hcnlUZXh0KSk7CisgICAgICAgIAorICAgICAgICAvLyBUaGUgdGl0bGUg
YXR0cmlidXRlIHNob3VsZCBiZSB1c2VkIGFzIGhlbHAgdGV4dCB1bmxlc3MgaXQgaXMgYWxyZWFk
eSBiZWluZyB1c2VkIGFzIGRlc2NyaXB0aXZlIHRleHQuCisgICAgICAgIGNvbnN0IEF0b21pY1N0
cmluZyYgdGl0bGUgPSBnZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKKyAgICAgICAgaWYgKCF0aXRs
ZS5pc0VtcHR5KCkpCisgICAgICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlU
ZXh0KHRpdGxlLCBUaXRsZVRhZ1RleHQpKTsKKyAgICAgICAgCisgICAgICAgIC8vIE9ubHkgdGFr
ZSBoZWxwIHRleHQgZnJvbSBhbiBhbmNlc3RvciBlbGVtZW50IGlmIGl0cyBhIGdyb3VwIG9yIGFu
IHVua25vd24gcm9sZS4gSWYgaGVscCB3YXMKKyAgICAgICAgLy8gYWRkZWQgdG8gdGhvc2Uga2lu
ZHMgb2YgZWxlbWVudHMsIGl0IGlzIGxpa2VseSBpdCB3YXMgbWVhbnQgZm9yIGEgY2hpbGQgZWxl
bWVudC4KKyAgICAgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogYXhPYmogPSBheE9iamVjdENhY2hl
KCktPmdldE9yQ3JlYXRlKGN1cnIpOworICAgICAgICBpZiAoIWF4T2JqKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAKKyAgICAgICAgQWNjZXNzaWJpbGl0eVJvbGUgcm9sZSA9IGF4T2Jq
LT5yb2xlVmFsdWUoKTsKKyAgICAgICAgaWYgKHJvbGUgIT0gR3JvdXBSb2xlICYmIHJvbGUgIT0g
VW5rbm93blJvbGUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisgICAgCiBTdHJpbmcg
QWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpIGNvbnN0
CiB7CiAgICAgLy8gU3RhdGljIHRleHQgc2hvdWxkIG5vdCBoYXZlIGEgZGVzY3JpcHRpb24sIGl0
IHNob3VsZCBvbmx5IGhhdmUgYSBzdHJpbmdWYWx1ZS4KQEAgLTEzNDEsNiArMTU1OCwxNCBAQAog
ICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiB9CiAKK1N0cmluZyBBY2Nlc3NpYmlsaXR5
Tm9kZU9iamVjdDo6YXJpYURlc2NyaWJlZEJ5QXR0cmlidXRlKCkgY29uc3QKK3sKKyAgICBWZWN0
b3I8RWxlbWVudCo+IGVsZW1lbnRzOworICAgIGVsZW1lbnRzRnJvbUF0dHJpYnV0ZShlbGVtZW50
cywgYXJpYV9kZXNjcmliZWRieUF0dHIpOworICAgIAorICAgIHJldHVybiBhY2Nlc3NpYmlsaXR5
RGVzY3JpcHRpb25Gb3JFbGVtZW50cyhlbGVtZW50cyk7Cit9CisKIHZvaWQgQWNjZXNzaWJpbGl0
eU5vZGVPYmplY3Q6OmVsZW1lbnRzRnJvbUF0dHJpYnV0ZShWZWN0b3I8RWxlbWVudCo+JiBlbGVt
ZW50cywgY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0cmlidXRlKSBjb25zdAogewogICAgIE5vZGUq
IG5vZGUgPSB0aGlzLT5ub2RlKCk7CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxMzE1NTApCisrKyBMYXlv
dXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNCBAQAorMjAxMi0x
MC0xNiAgQ2hyaXMgRmxlaXphY2ggIDxjZmxlaXphY2hAYXBwbGUuY29tPgorCisgICAgICAgIEFY
OiBSZWZhY3RvciBhY2Nlc3NpYmlsaXR5IG5hbWUgY29tcHV0YXRpb24gc28gaXQncyBtb3JlIHBs
YXRmb3JtIGluZGVwZW5kZW50CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD05OTUwMgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFVwZGF0ZSB0ZXN0IHRvIHJlZmxlY3QgY2hhbmdlIGluIHdoYXQncyByZWNvZ25p
emVkIGFzIGEgdGl0bGUuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvYWNjZXNzaWJpbGl0eS9h
cmlhLXJhZGlvYnV0dG9uLXRleHQuaHRtbDoKKwogMjAxMi0xMC0xNiAgS2Vpc2hpIEhhdHRvcmkg
IDxrZWlzaGlAd2Via2l0Lm9yZz4KIAogICAgICAgICBBZGQgdGVzdCB0aGF0IGNoZWNrcyBpZiBz
Y3JvbGxpbmcgd29ya3MgaW5zaWRlIHRoZSBzdWdnZXN0aW9uIHBpY2tlcgpJbmRleDogTGF5b3V0
VGVzdHMvcGxhdGZvcm0vbWFjL2FjY2Vzc2liaWxpdHkvYXJpYS1yYWRpb2J1dHRvbi10ZXh0Lmh0
bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjL2FjY2Vzc2liaWxpdHkv
YXJpYS1yYWRpb2J1dHRvbi10ZXh0Lmh0bWwJKHJldmlzaW9uIDEzMTU1MCkKKysrIExheW91dFRl
c3RzL3BsYXRmb3JtL21hYy9hY2Nlc3NpYmlsaXR5L2FyaWEtcmFkaW9idXR0b24tdGV4dC5odG1s
CSh3b3JraW5nIGNvcHkpCkBAIC0zMCw3ICszMCw5IEBACiAgICAgICAgICAgdmFyIHN1Y2NlZWRl
ZCA9IG9iai5jaGlsZEF0SW5kZXgoMSkudGl0bGUgPT0gIkFYVGl0bGU6IFR3byI7CiAgICAgICAg
ICAgc2hvdWxkQmUoInN1Y2NlZWRlZCIsICJ0cnVlIik7CiAKLSAgICAgICAgICB2YXIgc3VjY2Vl
ZGVkID0gb2JqLmNoaWxkQXRJbmRleCgyKS50aXRsZSA9PSAiQVhUaXRsZTogVGhyZWUiOworICAg
ICAgICAgIC8vIEJlY2F1c2UgdGhlIHRoaXJkIGJ1dHRvbiB1c2VzIGFyaWEtbGFiZWxsZWRieSwg
dGhlIGFjY2Vzc2libGUgbmFtZQorICAgICAgICAgIC8vIHdpbGwgYmUgaW5zaWRlIHRoZSBkZXNj
cmlwdGlvbiBmaWVsZC4KKyAgICAgICAgICB2YXIgc3VjY2VlZGVkID0gb2JqLmNoaWxkQXRJbmRl
eCgyKS5kZXNjcmlwdGlvbiA9PSAiQVhEZXNjcmlwdGlvbjogVGhyZWUiOwogICAgICAgICAgIHNo
b3VsZEJlKCJzdWNjZWVkZWQiLCAidHJ1ZSIpOwogICAgIH0KIAo=
</data>
<flag name="commit-queue"
          id="182337"
          type_id="3"
          status="-"
          setter="webkit.review.bot"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>169318</attachid>
            <date>2012-10-17 18:01:34 -0700</date>
            <delta_ts>2012-10-18 21:20:18 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>34171</size>
            <attacher name="chris fleizach">cfleizach</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzMTY3OCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDcyIEBACisyMDEyLTEwLTE3ICBDaHJpcyBG
bGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IFJlZmFjdG9yIGFj
Y2Vzc2liaWxpdHkgbmFtZSBjb21wdXRhdGlvbiBzbyBpdCdzIG1vcmUgcGxhdGZvcm0gaW5kZXBl
bmRlbnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTk5
NTAyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhl
IGN1cnJlbnQgbW9kZWwgb2YgZGV0ZXJtaW5pbmcgdGhlIGFjY2Vzc2libGUgdGV4dCBmb3IgYW4g
b2JqZWN0IGhhcyBhIGxvdCBvZiBNYWMgYmlhc2VzIGJ1aWx0IGluCisgICAgICAgIGR1ZSB0byBs
ZWdhY3kgaW1wbGVtZW50YXRpb24uIAorCisgICAgICAgIFRoaXMgY2hhbmdlIGNhdGVnb3JpemVz
IGFuZCBvcmRlcnMgYWNjZXNzaWJpbGl0eSB0ZXh0IGJhc2VkIG9uIFdBSS1BUklBIHRleHQgY29t
cHV0YXRpb24gcnVsZXMgYW5kIHRoZW4KKyAgICAgICAgYWxsb3dzIHRoZSBwbGF0Zm9ybSAob25s
eSBNYWMgcmlnaHQgbm93KSB0byBkZWNpZGUgaG93IGJlc3QgdG8gYXBwbHkgdGhhdCB0ZXh0IHRv
IGl0cyBvd24gQVggQVBJLgorICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS9y
b2xlcyN0ZXh0YWx0ZXJuYXRpdmVjb21wdXRhdGlvbgorCisgICAgICAgIFRoaXMgY2hhbmdlIHRy
aWVkIHZlcnkgaGFyZCBub3QgdG8gY2hhbmdlIGFueSB0ZXN0IGJlaGF2aW9yLCBldmVuIHRob3Vn
aCBpdCBleHBvc2VkIGEgbnVtYmVyIG9mIHdlaXJkCisgICAgICAgIGVkZ2UgY2FzZXMgd2hlcmUg
d2Ugd2VyZSB0cmVhdGluZyBhdHRyaWJ1dGVzIGRpZmZlcmVudGx5IGJhc2VkIG9uIGVsZW1lbnQg
dHlwZS4gCisKKyAgICAgICAgRnV0dXJlIHBhdGNoZXMgd2lsbCByZXNvbHZlIHRob3NlIGRpc2Ny
ZXBhbmNpZXMuCisKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlJbWFnZU1h
cExpbmsuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eUltYWdlTWFwTGluazo6
YWNjZXNzaWJpbGl0eVRleHQpOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0
eUltYWdlTWFwTGluay5oOgorICAgICAgICAoQWNjZXNzaWJpbGl0eUltYWdlTWFwTGluayk6Cisg
ICAgICAgICogYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWVkaWFDb250cm9scy5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5TWVkaWFDb250cm9sOjphY2Nlc3NpYmlsaXR5
VGV4dCk6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWVkaWFDb250cm9s
cy5oOgorICAgICAgICAoQWNjZXNzaWJpbGl0eU1lZGlhQ29udHJvbCk6CisgICAgICAgIChXZWJD
b3JlOjpBY2Nlc3NpYmlsaXR5TWVkaWFUaW1lRGlzcGxheTo6aXNNZWRpYUNvbnRyb2xMYWJlbCk6
CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdC5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6dGl0bGVFbGVtZW50VGV4
dCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YWNjZXNzaWJp
bGl0eVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFy
aWFMYWJlbGVkQnlUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlOb2RlT2Jq
ZWN0OjphbHRlcm5hdGl2ZVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU5v
ZGVPYmplY3Q6OmFsdGVybmF0aXZlVGV4dEZvcldlYkFyZWEpOgorICAgICAgICAoV2ViQ29yZTo6
QWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OnZpc2libGVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OkFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0OjpoZWxwVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpB
Y2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YXJpYURlc2NyaWJlZEJ5QXR0cmlidXRlKToKKyAgICAg
ICAgKiBhY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlT2JqZWN0Lmg6CisgICAgICAgIChB
Y2Nlc3NpYmlsaXR5Tm9kZU9iamVjdCk6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BY2Nlc3Np
YmlsaXR5T2JqZWN0Lmg6CisgICAgICAgIChBY2Nlc3NpYmlsaXR5VGV4dCk6CisgICAgICAgIChX
ZWJDb3JlOjpBY2Nlc3NpYmlsaXR5VGV4dDo6QWNjZXNzaWJpbGl0eVRleHQpOgorICAgICAgICAo
V2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6aXNNZWRpYUNvbnRyb2xMYWJlbCk6CisgICAg
ICAgIChBY2Nlc3NpYmlsaXR5T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OmFjY2Vzc2liaWxpdHlUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2li
aWxpdHlPYmplY3Q6OnNldEFjY2Vzc2libGVOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlPYmplY3Q6OmFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojp0aXRsZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nl
c3NpYmlsaXR5T2JqZWN0OjpoZWxwVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmls
aXR5T2JqZWN0OjpzdHJpbmdWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5
T2JqZWN0Ojp0ZXh0VW5kZXJFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6
dGV4dExlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzZXRS
b2xlVmFsdWUpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6cm9sZVZh
bHVlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6OnNlbGVjdGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpoaWVyYXJjaGljYWxMZXZl
bCk6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNw
cDoKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuaDoK
KyAgICAgICAgKEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QpOgorICAgICAgICAqIGFjY2Vzc2li
aWxpdHkvbWFjL1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyLm1tOgorICAgICAgICAoLVtX
ZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciB0aXRsZVRhZ1Nob3VsZEJlVXNlZEluRGVzY3Jp
cHRpb25GaWVsZF0pOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciBh
Y2Nlc3NpYmlsaXR5VGl0bGVdKToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdy
YXBwZXIgYWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uXSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2li
aWxpdHlPYmplY3RXcmFwcGVyIGFjY2Vzc2liaWxpdHlIZWxwVGV4dF0pOgorICAgICAgICAoLVtX
ZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciBhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6
XSk6CisgICAgICAgICogcGxhdGZvcm0vTG9jYWxpemVkU3RyaW5ncy5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpsb2NhbGl6ZWRNZWRpYUNvbnRyb2xFbGVtZW50SGVscFRleHQpOgorCiAyMDEyLTEw
LTE3ICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KIAogICAgICAgICBNYWtlIGRvbS1x
dWVyeS5odG1sIHNsaWdodGx5IGZhc3RlciBieSByZW1vdmluZyB1bm5lY2Vzc2FyeSByZWYtY2h1
cm4gaW4gU3RyaW5nVHJhaXRzCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9Mb2NhbGl6
ZWRTdHJpbmdzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9Mb2Nh
bGl6ZWRTdHJpbmdzLmNwcAkocmV2aXNpb24gMTMxNTUwKQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vTG9jYWxpemVkU3RyaW5ncy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTg4Miw2ICs4ODIs
MTAgQEAKICAgICBpZiAobmFtZSA9PSAiSGlkZUNsb3NlZENhcHRpb25zQnV0dG9uIikKICAgICAg
ICAgcmV0dXJuIFdFQl9VSV9TVFJJTkcoInN0b3AgZGlzcGxheWluZyBjbG9zZWQgY2FwdGlvbnMi
LCAiYWNjZXNzaWJpbGl0eSBoZWxwIHRleHQgZm9yIGhpZGUgY2xvc2VkIGNhcHRpb25zIGJ1dHRv
biIpOwogCisgICAgLy8gVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYnV0dG9uIGlzIGRlc2NyaXB0
aXZlIGVub3VnaCB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSBoZWxwIHRleHQuCisgICAgaWYgKG5h
bWUgPT0gIkVudGVyRnVsbHNjcmVlbkJ1dHRvbiIpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsK
KyAgICAKICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICByZXR1cm4gU3RyaW5nKCk7CiB9
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlJbWFnZU1h
cExpbmsuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vz
c2liaWxpdHlJbWFnZU1hcExpbmsuaAkocmV2aXNpb24gMTMxNTUwKQorKysgU291cmNlL1dlYkNv
cmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTczLDYgKzczLDcgQEAKICAgICBSZWZQdHI8SFRNTEFyZWFFbGVtZW50PiBtX2FyZWFF
bGVtZW50OwogICAgIFJlZlB0cjxIVE1MTWFwRWxlbWVudD4gbV9tYXBFbGVtZW50OwogICAgIAor
ICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NpYmlsaXR5VGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRl
eHQ+Jik7CiAgICAgdmlydHVhbCBib29sIGlzSW1hZ2VNYXBMaW5rKCkgY29uc3QgeyByZXR1cm4g
dHJ1ZTsgfQogfTsKICAgICAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvbWFj
L1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyLm1tCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2FjY2Vzc2liaWxpdHkvbWFjL1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyLm1t
CShyZXZpc2lvbiAxMzE1NTApCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9X
ZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlci5tbQkod29ya2luZyBjb3B5KQpAQCAtMTgxOCw2
ICsxODE4LDEwMyBAQAogICAgIHJldHVybiBbc2VsZiByZW1vdGVBY2Nlc3NpYmlsaXR5UGFyZW50
T2JqZWN0XTsKIH0KIAorLy8gRklYTUU6IERpZmZlcmVudCBraW5kcyBvZiBlbGVtZW50cyBhcmUg
cHV0dGluZyB0aGUgdGl0bGUgdGFnIHRvIHVzZSBpbiBkaWZmZXJlbnQKKy8vIEFYIGZpZWxkcy4g
VGhpcyBzaG91bGQgYmUgcmVjdGlmaWVkLCBidXQgaW4gdGhlIGluaXRpYWwgcGF0Y2ggSSB3YW50
IHRvIGFjaGlldmUKKy8vIHBhcml0eSB3aXRoIGV4aXN0aW5nIGJlaGF2aW9yLgorLSAoQk9PTCl0
aXRsZVRhZ1Nob3VsZEJlVXNlZEluRGVzY3JpcHRpb25GaWVsZAoreworICAgIHJldHVybiAobV9v
YmplY3QtPmlzTGluaygpICYmICFtX29iamVjdC0+aXNJbWFnZU1hcExpbmsoKSkgfHwgbV9vYmpl
Y3QtPmlzSW1hZ2UoKTsKK30KKworLy8gVGhpcyBzaG91bGQgYmUgdGhlICJ2aXNpYmxlIiB0ZXh0
IHRoYXQncyBhY3R1YWxseSBvbiB0aGUgc2NyZWVuIGlmIHBvc3NpYmxlLgorLy8gSWYgdGhlcmUn
cyBhbHRlcm5hdGl2ZSB0ZXh0LCB0aGF0IGNhbiBvdmVycmlkZSB0aGUgdGl0bGUuCistIChOU1N0
cmluZyAqKWFjY2Vzc2liaWxpdHlUaXRsZQoreworICAgIC8vIFN0YXRpYyB0ZXh0IG9iamVjdHMg
c2hvdWxkIG5vdCBoYXZlIGEgdGl0bGUuIEl0cyBjb250ZW50IGlzIGNvbW11bmljYXRlZCBpbiBp
dHMgQVhWYWx1ZS4KKyAgICBpZiAobV9vYmplY3QtPnJvbGVWYWx1ZSgpID09IFN0YXRpY1RleHRS
b2xlKQorICAgICAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ107CisKKyAgICBWZWN0b3I8QWNj
ZXNzaWJpbGl0eVRleHQ+IHRleHRPcmRlcjsKKyAgICBtX29iamVjdC0+YWNjZXNzaWJpbGl0eVRl
eHQodGV4dE9yZGVyKTsKKyAgICAKKyAgICB1bnNpZ25lZCBsZW5ndGggPSB0ZXh0T3JkZXIuc2l6
ZSgpOworICAgIGZvciAodW5zaWduZWQgayA9IDA7IGsgPCBsZW5ndGg7IGsrKykgeworICAgICAg
ICBjb25zdCBBY2Nlc3NpYmlsaXR5VGV4dCYgdGV4dCA9IHRleHRPcmRlcltrXTsKKyAgICAgICAg
CisgICAgICAgIC8vIE9uY2Ugd2UgZW5jb3VudGVyIHZpc2libGUgdGV4dCwgb3IgdGhlIHRleHQg
ZnJvbSBvdXIgY2hpbGRyZW4gdGhhdCBzaG91bGQgYmUgdXNlZCBmb3JlbW9zdC4KKyAgICAgICAg
aWYgKHRleHQudGV4dFNvdXJjZSA9PSBWaXNpYmxlVGV4dCB8fCB0ZXh0LnRleHRTb3VyY2UgPT0g
Q2hpbGRyZW5UZXh0KQorICAgICAgICAgICAgcmV0dXJuIHRleHQudGV4dDsKKyAgICAgICAgCisg
ICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gZWxlbWVudCB0aGF0IGxhYmVscyB0aGlzIG9iamVjdCBh
bmQgaXQncyBub3QgZXhwb3NlZCwgdGhlbiB3ZSBzaG91bGQgdXNlCisgICAgICAgIC8vIHRoYXQg
dGV4dCBhcyBvdXIgdGl0bGUuCisgICAgICAgIGlmICh0ZXh0LnRleHRTb3VyY2UgPT0gTGFiZWxC
eUVsZW1lbnRUZXh0ICYmICFtX29iamVjdC0+ZXhwb3Nlc1RpdGxlVUlFbGVtZW50KCkpCisgICAg
ICAgICAgICByZXR1cm4gdGV4dC50ZXh0OworICAgICAgICAKKyAgICAgICAgLy8gRklYTUU6IFRo
ZSB0aXRsZSB0YWcgaXMgdXNlZCBpbiBjZXJ0YWluIGNhc2VzIGZvciB0aGUgdGl0bGUuIFRoaXMg
dXNhZ2Ugc2hvdWxkCisgICAgICAgIC8vIHByb2JhYmx5IGJlIGluIHRoZSBkZXNjcmlwdGlvbiBm
aWVsZCBzaW5jZSBpdCdzIG5vdCAidmlzaWJsZSIuCisgICAgICAgIGlmICh0ZXh0LnRleHRTb3Vy
Y2UgPT0gVGl0bGVUYWdUZXh0ICYmICFbc2VsZiB0aXRsZVRhZ1Nob3VsZEJlVXNlZEluRGVzY3Jp
cHRpb25GaWVsZF0pCisgICAgICAgICAgICByZXR1cm4gdGV4dC50ZXh0OworICAgIH0KKyAgICAK
KyAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ107Cit9CisKKy0gKE5TU3RyaW5nICopYWNjZXNz
aWJpbGl0eURlc2NyaXB0aW9uCit7CisgICAgLy8gU3RhdGljIHRleHQgb2JqZWN0cyBzaG91bGQg
bm90IGhhdmUgYSBkZXNjcmlwdGlvbi4gSXRzIGNvbnRlbnQgaXMgY29tbXVuaWNhdGVkIGluIGl0
cyBBWFZhbHVlLgorICAgIC8vIE9uZSBleGNlcHRpb24gaXMgdGhlIG1lZGlhIGNvbnRyb2wgbGFi
ZWxzIHRoYXQgaGF2ZSBhIHZhbHVlIGFuZCBhIGRlc2NyaXB0aW9uLiBUaG9zZSBhcmUgc2V0IHBy
b2dyYW1hdGljYWxseS4KKyAgICBpZiAobV9vYmplY3QtPnJvbGVWYWx1ZSgpID09IFN0YXRpY1Rl
eHRSb2xlICYmICFtX29iamVjdC0+aXNNZWRpYUNvbnRyb2xMYWJlbCgpKQorICAgICAgICByZXR1
cm4gW05TU3RyaW5nIHN0cmluZ107CisgICAgCisgICAgVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0
PiB0ZXh0T3JkZXI7CisgICAgbV9vYmplY3QtPmFjY2Vzc2liaWxpdHlUZXh0KHRleHRPcmRlcik7
CisgICAgCisgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dE9yZGVyLnNpemUoKTsKKyAgICBmb3Ig
KHVuc2lnbmVkIGsgPSAwOyBrIDwgbGVuZ3RoOyBrKyspIHsKKyAgICAgICAgY29uc3QgQWNjZXNz
aWJpbGl0eVRleHQmIHRleHQgPSB0ZXh0T3JkZXJba107CisgICAgICAgIAorICAgICAgICBpZiAo
dGV4dC50ZXh0U291cmNlID09IEFsdGVybmF0aXZlVGV4dCkKKyAgICAgICAgICAgIHJldHVybiB0
ZXh0LnRleHQ7CisgICAgICAgIAorICAgICAgICBpZiAodGV4dC50ZXh0U291cmNlID09IFRpdGxl
VGFnVGV4dCAmJiBbc2VsZiB0aXRsZVRhZ1Nob3VsZEJlVXNlZEluRGVzY3JpcHRpb25GaWVsZF0p
CisgICAgICAgICAgICByZXR1cm4gdGV4dC50ZXh0OworICAgIH0KKyAgICAKKyAgICByZXR1cm4g
W05TU3RyaW5nIHN0cmluZ107Cit9CisKKy0gKE5TU3RyaW5nICopYWNjZXNzaWJpbGl0eUhlbHBU
ZXh0Cit7CisgICAgVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiB0ZXh0T3JkZXI7CisgICAgbV9v
YmplY3QtPmFjY2Vzc2liaWxpdHlUZXh0KHRleHRPcmRlcik7CisgICAgCisgICAgdW5zaWduZWQg
bGVuZ3RoID0gdGV4dE9yZGVyLnNpemUoKTsKKyAgICBib29sIGRlc2NyaXB0aXZlVGV4dEF2YWls
YWJsZSA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgayA9IDA7IGsgPCBsZW5ndGg7IGsrKykg
eworICAgICAgICBjb25zdCBBY2Nlc3NpYmlsaXR5VGV4dCYgdGV4dCA9IHRleHRPcmRlcltrXTsK
KyAgICAgICAgCisgICAgICAgIGlmICh0ZXh0LnRleHRTb3VyY2UgPT0gSGVscFRleHQgfHwgdGV4
dC50ZXh0U291cmNlID09IFN1bW1hcnlUZXh0KQorICAgICAgICAgICAgcmV0dXJuIHRleHQudGV4
dDsKKyAgICAgICAgCisgICAgICAgIC8vIElmIGFuIGVsZW1lbnQgZG9lcyBOT1QgaGF2ZSBvdGhl
ciBkZXNjcmlwdGl2ZSB0ZXh0IHRoZSB0aXRsZSB0YWcgc2hvdWxkIGJlIHVzZWQgYXMgaXRzIGRl
c2NyaXB0aXZlIHRleHQuCisgICAgICAgIC8vIEJ1dCwgaWYgdGhvc2UgQVJFIGF2YWlsYWJsZSwg
dGhlbiB0aGUgdGl0bGUgdGFnIHNob3VsZCBiZSB1c2VkIGZvciBoZWxwIHRleHQgaW5zdGVhZC4K
KyAgICAgICAgc3dpdGNoICh0ZXh0LnRleHRTb3VyY2UpIHsKKyAgICAgICAgY2FzZSBBbHRlcm5h
dGl2ZVRleHQ6CisgICAgICAgIGNhc2UgVmlzaWJsZVRleHQ6CisgICAgICAgIGNhc2UgQ2hpbGRy
ZW5UZXh0OgorICAgICAgICBjYXNlIExhYmVsQnlFbGVtZW50VGV4dDoKKyAgICAgICAgICAgIGRl
c2NyaXB0aXZlVGV4dEF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHRleHQudGV4dFNv
dXJjZSA9PSBUaXRsZVRhZ1RleHQgJiYgZGVzY3JpcHRpdmVUZXh0QXZhaWxhYmxlKQorICAgICAg
ICAgICAgcmV0dXJuIHRleHQudGV4dDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFtOU1N0cmlu
ZyBzdHJpbmddOworfQorCiAvLyBGSVhNRTogc3BsaXQgdXAgdGhpcyBmdW5jdGlvbiBpbiBhIGJl
dHRlciB3YXkuICAKIC8vIHN1Z2dlc3Rpb25zOiBVc2UgYSBoYXNoIHRhYmxlIHRoYXQgbWFwcyBh
dHRyaWJ1dGUgbmFtZXMgdG8gZnVuY3Rpb24gY2FsbHMsCiAvLyBvciBtYXliZSBwb2ludGVycyB0
byBtZW1iZXIgZnVuY3Rpb25zCkBAIC0xOTg0LDcgKzIwODEsOCBAQAogICAgICAgICAgICAgaWYg
KFtbW3NlbGYgYXR0YWNobWVudFZpZXddIGFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVOYW1lc10gY29u
dGFpbnNPYmplY3Q6TlNBY2Nlc3NpYmlsaXR5VGl0bGVBdHRyaWJ1dGVdKSAKICAgICAgICAgICAg
ICAgICByZXR1cm4gW1tzZWxmIGF0dGFjaG1lbnRWaWV3XSBhY2Nlc3NpYmlsaXR5QXR0cmlidXRl
VmFsdWU6TlNBY2Nlc3NpYmlsaXR5VGl0bGVBdHRyaWJ1dGVdOwogICAgICAgICB9Ci0gICAgICAg
IHJldHVybiBtX29iamVjdC0+dGl0bGUoKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBbc2Vs
ZiBhY2Nlc3NpYmlsaXR5VGl0bGVdOwogICAgIH0KICAgICAKICAgICBpZiAoW2F0dHJpYnV0ZU5h
bWUgaXNFcXVhbFRvU3RyaW5nOiBOU0FjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbkF0dHJpYnV0ZV0p
IHsKQEAgLTE5OTIsNyArMjA5MCw3IEBACiAgICAgICAgICAgICBpZiAoW1tbc2VsZiBhdHRhY2ht
ZW50Vmlld10gYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZU5hbWVzXSBjb250YWluc09iamVjdDpOU0Fj
Y2Vzc2liaWxpdHlEZXNjcmlwdGlvbkF0dHJpYnV0ZV0pCiAgICAgICAgICAgICAgICAgcmV0dXJu
IFtbc2VsZiBhdHRhY2htZW50Vmlld10gYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOk5TQWNj
ZXNzaWJpbGl0eURlc2NyaXB0aW9uQXR0cmlidXRlXTsKICAgICAgICAgfQotICAgICAgICByZXR1
cm4gbV9vYmplY3QtPmFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpOworICAgICAgICByZXR1cm4g
W3NlbGYgYWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uXTsKICAgICB9CiAKICAgICBpZiAoW2F0dHJp
YnV0ZU5hbWUgaXNFcXVhbFRvU3RyaW5nOiBOU0FjY2Vzc2liaWxpdHlWYWx1ZUF0dHJpYnV0ZV0p
IHsKQEAgLTIwNDYsNyArMjE0NCw3IEBACiAgICAgICAgIHJldHVybiBbTlNOdW1iZXIgbnVtYmVy
V2l0aEZsb2F0Om1fb2JqZWN0LT5tYXhWYWx1ZUZvclJhbmdlKCldOwogCiAgICAgaWYgKFthdHRy
aWJ1dGVOYW1lIGlzRXF1YWxUb1N0cmluZzogTlNBY2Nlc3NpYmlsaXR5SGVscEF0dHJpYnV0ZV0p
Ci0gICAgICAgIHJldHVybiBtX29iamVjdC0+aGVscFRleHQoKTsKKyAgICAgICAgcmV0dXJuIFtz
ZWxmIGFjY2Vzc2liaWxpdHlIZWxwVGV4dF07CiAKICAgICBpZiAoW2F0dHJpYnV0ZU5hbWUgaXNF
cXVhbFRvU3RyaW5nOiBOU0FjY2Vzc2liaWxpdHlGb2N1c2VkQXR0cmlidXRlXSkKICAgICAgICAg
cmV0dXJuIFtOU051bWJlciBudW1iZXJXaXRoQm9vbDogbV9vYmplY3QtPmlzRm9jdXNlZCgpXTsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1lZGlhQ29u
dHJvbHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vz
c2liaWxpdHlNZWRpYUNvbnRyb2xzLmgJKHJldmlzaW9uIDEzMTU1MCkKKysrIFNvdXJjZS9XZWJD
b3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1lZGlhQ29udHJvbHMuaAkod29ya2luZyBj
b3B5KQpAQCAtNTQsNiArNTQsNyBAQAogICAgIGV4cGxpY2l0IEFjY2Vzc2liaWxpdHlNZWRpYUNv
bnRyb2woUmVuZGVyT2JqZWN0Kik7CiAgICAgTWVkaWFDb250cm9sRWxlbWVudFR5cGUgY29udHJv
bFR5cGUoKSBjb25zdDsKICAgICBTdHJpbmcgY29udHJvbFR5cGVOYW1lKCkgY29uc3Q7CisgICAg
dmlydHVhbCB2b2lkIGFjY2Vzc2liaWxpdHlUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4dD4m
KTsKIH07CiAKIApAQCAtMTA3LDYgKzEwOCw3IEBACiAKIHByaXZhdGU6CiAgICAgZXhwbGljaXQg
QWNjZXNzaWJpbGl0eU1lZGlhVGltZURpc3BsYXkoUmVuZGVyT2JqZWN0Kik7CisgICAgdmlydHVh
bCBib29sIGlzTWVkaWFDb250cm9sTGFiZWwoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiB9Owog
CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVj
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eU9iamVjdC5oCShyZXZpc2lvbiAxMzE1NTApCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3Np
YmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtMjAxLDYgKzIw
MSw0MSBAQAogICAgIFdpbmRvd1JvbGUsCiB9OwogCitlbnVtIEFjY2Vzc2liaWxpdHlUZXh0U291
cmNlIHsKKyAgICBBbHRlcm5hdGl2ZVRleHQsCisgICAgQ2hpbGRyZW5UZXh0LAorICAgIFN1bW1h
cnlUZXh0LAorICAgIEhlbHBUZXh0LAorICAgIFZpc2libGVUZXh0LAorICAgIFRpdGxlVGFnVGV4
dCwKKyAgICBQbGFjZWhvbGRlclRleHQsCisgICAgTGFiZWxCeUVsZW1lbnRUZXh0LAorfTsKKyAg
ICAKK3N0cnVjdCBBY2Nlc3NpYmlsaXR5VGV4dCB7CisgICAgU3RyaW5nIHRleHQ7CisgICAgQWNj
ZXNzaWJpbGl0eVRleHRTb3VyY2UgdGV4dFNvdXJjZTsKKyAgICBWZWN0b3I8UmVmUHRyPEFjY2Vz
c2liaWxpdHlPYmplY3Q+ID4gdGV4dEVsZW1lbnRzOworICAgIAorICAgIEFjY2Vzc2liaWxpdHlU
ZXh0KGNvbnN0IFN0cmluZyYgdCwgY29uc3QgQWNjZXNzaWJpbGl0eVRleHRTb3VyY2UmIHMpCisg
ICAgOiB0ZXh0KHQpCisgICAgLCB0ZXh0U291cmNlKHMpCisgICAgeyB9CisKKyAgICBBY2Nlc3Np
YmlsaXR5VGV4dChjb25zdCBTdHJpbmcmIHQsIGNvbnN0IEFjY2Vzc2liaWxpdHlUZXh0U291cmNl
JiBzLCBjb25zdCBWZWN0b3I8UmVmUHRyPEFjY2Vzc2liaWxpdHlPYmplY3Q+ID4gZWxlbWVudHMp
CisgICAgOiB0ZXh0KHQpCisgICAgLCB0ZXh0U291cmNlKHMpCisgICAgLCB0ZXh0RWxlbWVudHMo
ZWxlbWVudHMpCisgICAgeyB9CisKKyAgICBBY2Nlc3NpYmlsaXR5VGV4dChjb25zdCBTdHJpbmcm
IHQsIGNvbnN0IEFjY2Vzc2liaWxpdHlUZXh0U291cmNlJiBzLCBjb25zdCBSZWZQdHI8QWNjZXNz
aWJpbGl0eU9iamVjdD4gZWxlbWVudCkKKyAgICA6IHRleHQodCkKKyAgICAsIHRleHRTb3VyY2Uo
cykKKyAgICB7CisgICAgICAgIHRleHRFbGVtZW50cy5hcHBlbmQoZWxlbWVudCk7CisgICAgfQor
fTsKKyAgICAKIGVudW0gQWNjZXNzaWJpbGl0eU9yaWVudGF0aW9uIHsKICAgICBBY2Nlc3NpYmls
aXR5T3JpZW50YXRpb25WZXJ0aWNhbCwKICAgICBBY2Nlc3NpYmlsaXR5T3JpZW50YXRpb25Ib3Jp
em9udGFsLApAQCAtMzcxLDYgKzQwNiw3IEBACiAgICAgdmlydHVhbCBib29sIGlzU3BpbkJ1dHRv
bigpIGNvbnN0IHsgcmV0dXJuIHJvbGVWYWx1ZSgpID09IFNwaW5CdXR0b25Sb2xlOyB9CiAgICAg
dmlydHVhbCBib29sIGlzU3BpbkJ1dHRvblBhcnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQog
ICAgIHZpcnR1YWwgYm9vbCBpc01vY2tPYmplY3QoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQor
ICAgIHZpcnR1YWwgYm9vbCBpc01lZGlhQ29udHJvbExhYmVsKCkgY29uc3QgeyByZXR1cm4gZmFs
c2U7IH0KICAgICBib29sIGlzVGV4dENvbnRyb2woKSBjb25zdCB7IHJldHVybiByb2xlVmFsdWUo
KSA9PSBUZXh0QXJlYVJvbGUgfHwgcm9sZVZhbHVlKCkgPT0gVGV4dEZpZWxkUm9sZTsgfQogICAg
IGJvb2wgaXNBUklBVGV4dENvbnRyb2woKSBjb25zdDsKICAgICBib29sIGlzVGFiTGlzdCgpIGNv
bnN0IHsgcmV0dXJuIHJvbGVWYWx1ZSgpID09IFRhYkxpc3RSb2xlOyB9CkBAIC00MzAsOSArNDY2
LDYgQEAKICAgICB2aXJ0dWFsIGJvb2wgY2FuU2V0U2VsZWN0ZWRDaGlsZHJlbkF0dHJpYnV0ZSgp
IGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29sIGNhblNldEV4cGFuZGVk
QXR0cmlidXRlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICAKLSAgICAvLyBBIHByb2dy
YW1tYXRpYyB3YXkgdG8gc2V0IGEgbmFtZSBvbiBhbiBBY2Nlc3NpYmxlT2JqZWN0LgotICAgIHZp
cnR1YWwgdm9pZCBzZXRBY2Nlc3NpYmxlTmFtZShjb25zdCBBdG9taWNTdHJpbmcmKSB7IH0KLSAg
ICAKICAgICB2aXJ0dWFsIE5vZGUqIG5vZGUoKSBjb25zdCB7IHJldHVybiAwOyB9CiAgICAgdmly
dHVhbCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyKCkgY29uc3QgeyByZXR1cm4gMDsgfQogICAgIHZp
cnR1YWwgYm9vbCBhY2Nlc3NpYmlsaXR5SXNJZ25vcmVkKCkgY29uc3QgIHsgcmV0dXJuIHRydWU7
IH0KQEAgLTUwMSwxMiArNTM0LDI5IEBACiAgICAgdmlydHVhbCBib29sIGlzUHJlc2VudGF0aW9u
YWxDaGlsZE9mQXJpYVJvbGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwg
Ym9vbCBhcmlhUm9sZUhhc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBm
YWxzZTsgfQogCi0gICAgdm9pZCBzZXRSb2xlVmFsdWUoQWNjZXNzaWJpbGl0eVJvbGUgcm9sZSkg
eyBtX3JvbGUgPSByb2xlOyB9Ci0gICAgdmlydHVhbCBBY2Nlc3NpYmlsaXR5Um9sZSByb2xlVmFs
dWUoKSBjb25zdCB7IHJldHVybiBtX3JvbGU7IH0KKyAgICAvLyBBY2Nlc3NpYmlsaXR5IFRleHQK
KyAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzaWJpbGl0eVRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlU
ZXh0PiYpIHsgfTsKKworICAgIC8vIEEgcHJvZ3JhbW1hdGljIHdheSB0byBzZXQgYSBuYW1lIG9u
IGFuIEFjY2Vzc2libGVPYmplY3QuCisgICAgdmlydHVhbCB2b2lkIHNldEFjY2Vzc2libGVOYW1l
KGNvbnN0IEF0b21pY1N0cmluZyYpIHsgfQorCisgICAgLy8gQWNjZXNzaWJpbGl0eSBUZXh0IC0g
KFRvIGJlIGRlcHJlY2F0ZWQpLgorICAgIHZpcnR1YWwgU3RyaW5nIGFjY2Vzc2liaWxpdHlEZXNj
cmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9CisgICAgdmlydHVhbCBTdHJpbmcg
dGl0bGUoKSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQorICAgIHZpcnR1YWwgU3RyaW5nIGhl
bHBUZXh0KCkgY29uc3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KKworICAgIC8vIE1ldGhvZHMgZm9y
IGRldGVybWluaW5nIGFjY2Vzc2liaWxpdHkgdGV4dC4KKyAgICB2aXJ0dWFsIFN0cmluZyBzdHJp
bmdWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9CisgICAgdmlydHVhbCBTdHJpbmcg
dGV4dFVuZGVyRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9CisgICAgdmlydHVh
bCBTdHJpbmcgdGV4dCgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9CisgICAgdmlydHVhbCBp
bnQgdGV4dExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIFN0cmluZyBh
cmlhTGFiZWxlZEJ5QXR0cmlidXRlKCkgY29uc3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KICAgICB2
aXJ0dWFsIFN0cmluZyBhcmlhRGVzY3JpYmVkQnlBdHRyaWJ1dGUoKSBjb25zdCB7IHJldHVybiBT
dHJpbmcoKTsgfQotICAgIHZpcnR1YWwgU3RyaW5nIGFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigp
IGNvbnN0IHsgcmV0dXJuIFN0cmluZygpOyB9CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBwbGFj
ZWhvbGRlclZhbHVlKCkgY29uc3Q7CiAKKyAgICB2b2lkIHNldFJvbGVWYWx1ZShBY2Nlc3NpYmls
aXR5Um9sZSByb2xlKSB7IG1fcm9sZSA9IHJvbGU7IH0KKyAgICB2aXJ0dWFsIEFjY2Vzc2liaWxp
dHlSb2xlIHJvbGVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm9sZTsgfQorCiAgICAgdmlydHVh
bCBBWE9iamVjdENhY2hlKiBheE9iamVjdENhY2hlKCkgY29uc3Q7CiAgICAgQVhJRCBheE9iamVj
dElEKCkgY29uc3QgeyByZXR1cm4gbV9pZDsgfQogICAgIHZvaWQgc2V0QVhPYmplY3RJRChBWElE
IGF4T2JqZWN0SUQpIHsgbV9pZCA9IGF4T2JqZWN0SUQ7IH0KQEAgLTUyOSwxMiArNTc5LDYgQEAK
ICAgICAKICAgICB2aXJ0dWFsIEtVUkwgdXJsKCkgY29uc3QgeyByZXR1cm4gS1VSTCgpOyB9CiAg
ICAgdmlydHVhbCBWaXNpYmxlU2VsZWN0aW9uIHNlbGVjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFZp
c2libGVTZWxlY3Rpb24oKTsgfQotICAgIHZpcnR1YWwgU3RyaW5nIHN0cmluZ1ZhbHVlKCkgY29u
c3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KLSAgICB2aXJ0dWFsIFN0cmluZyB0aXRsZSgpIGNvbnN0
IHsgcmV0dXJuIFN0cmluZygpOyB9Ci0gICAgdmlydHVhbCBTdHJpbmcgaGVscFRleHQoKSBjb25z
dCB7IHJldHVybiBTdHJpbmcoKTsgfQotICAgIHZpcnR1YWwgU3RyaW5nIHRleHRVbmRlckVsZW1l
bnQoKSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQotICAgIHZpcnR1YWwgU3RyaW5nIHRleHQo
KSBjb25zdCB7IHJldHVybiBTdHJpbmcoKTsgfQotICAgIHZpcnR1YWwgaW50IHRleHRMZW5ndGgo
KSBjb25zdCB7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBTdHJpbmcgc2VsZWN0ZWRUZXh0KCkg
Y29uc3QgeyByZXR1cm4gU3RyaW5nKCk7IH0KICAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmlu
ZyYgYWNjZXNzS2V5KCkgY29uc3QgeyByZXR1cm4gbnVsbEF0b207IH0KICAgICBjb25zdCBTdHJp
bmcmIGFjdGlvblZlcmIoKSBjb25zdDsKQEAgLTU0Niw3ICs1OTAsNiBAQAogICAgIHZpcnR1YWwg
RnJhbWVWaWV3KiBkb2N1bWVudEZyYW1lVmlldygpIGNvbnN0OwogICAgIFN0cmluZyBsYW5ndWFn
ZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgdW5zaWduZWQgaGllcmFyY2hpY2FsTGV2ZWwoKSBjb25z
dCB7IHJldHVybiAwOyB9Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBwbGFjZWhvbGRlclZhbHVl
KCkgY29uc3Q7CiAgICAgCiAgICAgdmlydHVhbCB2b2lkIHNldEZvY3VzZWQoYm9vbCkgeyB9CiAg
ICAgdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkVGV4dChjb25zdCBTdHJpbmcmKSB7IH0KSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0
eVJlbmRlck9iamVjdC5oCShyZXZpc2lvbiAxMzE1NTApCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAt
MTQzLDggKzE0Myw2IEBACiAgICAgdmlydHVhbCBQbGFpblRleHRSYW5nZSBzZWxlY3RlZFRleHRS
YW5nZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rpb24oKSBj
b25zdDsKICAgICB2aXJ0dWFsIFN0cmluZyBzdHJpbmdWYWx1ZSgpIGNvbnN0OwotICAgIHZpcnR1
YWwgU3RyaW5nIGFyaWFEZXNjcmliZWRCeUF0dHJpYnV0ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwg
U3RyaW5nIGFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpIGNvbnN0OwogICAgIHZpcnR1YWwgU3Ry
aW5nIGhlbHBUZXh0KCkgY29uc3Q7CiAgICAgdmlydHVhbCBTdHJpbmcgdGV4dFVuZGVyRWxlbWVu
dCgpIGNvbnN0OwogICAgIHZpcnR1YWwgU3RyaW5nIHRleHQoKSBjb25zdDsKQEAgLTI2MSw4ICsy
NTksNiBAQAogICAgIGJvb2wgZWxlbWVudEF0dHJpYnV0ZVZhbHVlKGNvbnN0IFF1YWxpZmllZE5h
bWUmKSBjb25zdDsKICAgICB2b2lkIHNldEVsZW1lbnRBdHRyaWJ1dGVWYWx1ZShjb25zdCBRdWFs
aWZpZWROYW1lJiwgYm9vbCk7CiAgICAgCi0gICAgU3RyaW5nIHdlYkFyZWFBY2Nlc3NpYmlsaXR5
RGVzY3JpcHRpb24oKSBjb25zdDsKLQogICAgIHZpcnR1YWwgRVNwZWFrIHNwZWFrUHJvcGVydHko
KSBjb25zdDsKICAgICAKICAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgYXJpYUxpdmVS
ZWdpb25TdGF0dXMoKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eU5vZGVPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9h
Y2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlT2JqZWN0LmgJKHJldmlzaW9uIDEzMTU1MCkK
KysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Qu
aAkod29ya2luZyBjb3B5KQpAQCAtMTc0LDEzICsxNzQsMjIgQEAKICAgICB2b2lkIGFyaWFMYWJl
bGVkQnlFbGVtZW50cyhWZWN0b3I8RWxlbWVudCo+JiBlbGVtZW50cykgY29uc3Q7CiAgICAgU3Ry
aW5nIGFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbkZvckVsZW1lbnRzKFZlY3RvcjxFbGVtZW50Kj4g
JmVsZW1lbnRzKSBjb25zdDsKICAgICB2b2lkIGVsZW1lbnRzRnJvbUF0dHJpYnV0ZShWZWN0b3I8
RWxlbWVudCo+JiBlbGVtZW50cywgY29uc3QgUXVhbGlmaWVkTmFtZSYpIGNvbnN0OwotCisgICAg
U3RyaW5nIGFyaWFEZXNjcmliZWRCeUF0dHJpYnV0ZSgpIGNvbnN0OworICAgIAogICAgIEVsZW1l
bnQqIG1lbnVFbGVtZW50Rm9yTWVudUJ1dHRvbigpIGNvbnN0OwogICAgIEVsZW1lbnQqIG1lbnVJ
dGVtRWxlbWVudEZvck1lbnUoKSBjb25zdDsKICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBtZW51
QnV0dG9uRm9yTWVudSgpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIE5vZGUqIG1fbm9kZTsKKwor
ICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NpYmlsaXR5VGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRl
eHQ+Jik7CisgICAgdm9pZCB0aXRsZUVsZW1lbnRUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4
dD4mKTsKKyAgICB2b2lkIGFsdGVybmF0aXZlVGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+
JikgY29uc3Q7CisgICAgdm9pZCB2aXNpYmxlVGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+
JikgY29uc3Q7CisgICAgdm9pZCBoZWxwVGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+Jikg
Y29uc3Q7CisgICAgU3RyaW5nIGFsdGVybmF0aXZlVGV4dEZvcldlYkFyZWEoKSBjb25zdDsKKyAg
ICB2b2lkIGFyaWFMYWJlbGVkQnlUZXh0KFZlY3RvcjxBY2Nlc3NpYmlsaXR5VGV4dD4mKSBjb25z
dDsKIH07CiAKIGlubGluZSBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdCogdG9BY2Nlc3NpYmlsaXR5
Tm9kZU9iamVjdChBY2Nlc3NpYmlsaXR5T2JqZWN0KiBvYmplY3QpCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlJbWFnZU1hcExpbmsuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUltYWdlTWFw
TGluay5jcHAJKHJldmlzaW9uIDEzMTU1MCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxp
dHkvQWNjZXNzaWJpbGl0eUltYWdlTWFwTGluay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTk0LDYg
Kzk0LDIxIEBACiAgICAgCiAgICAgcmV0dXJuIG1fYXJlYUVsZW1lbnQtPmhyZWYoKTsKIH0KKwor
dm9pZCBBY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rOjphY2Nlc3NpYmlsaXR5VGV4dChWZWN0b3I8
QWNjZXNzaWJpbGl0eVRleHQ+JiB0ZXh0T3JkZXIpCit7CisgICAgU3RyaW5nIGRlc2NyaXB0aW9u
ID0gYWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uKCk7CisgICAgaWYgKCFkZXNjcmlwdGlvbi5pc0Vt
cHR5KCkpCisgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQoZGVzY3Jp
cHRpb24sIEFsdGVybmF0aXZlVGV4dCkpOworCisgICAgY29uc3QgQXRvbWljU3RyaW5nJiB0aXRs
ZVRleHQgPSBnZXRBdHRyaWJ1dGUodGl0bGVBdHRyKTsKKyAgICBpZiAoIXRpdGxlVGV4dC5pc0Vt
cHR5KCkpCisgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQodGl0bGVU
ZXh0LCBUaXRsZVRhZ1RleHQpKTsKKworICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3VtbWFyeSA9
IGdldEF0dHJpYnV0ZShzdW1tYXJ5QXR0cik7CisgICAgaWYgKCFzdW1tYXJ5LmlzRW1wdHkoKSkK
KyAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChzdW1tYXJ5LCBTdW1t
YXJ5VGV4dCkpOworfQogICAgIAogU3RyaW5nIEFjY2Vzc2liaWxpdHlJbWFnZU1hcExpbms6OmFj
Y2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpIGNvbnN0CiB7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9h
Y2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNZWRpYUNvbnRyb2xzLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNZWRpYUNvbnRyb2xz
LmNwcAkocmV2aXNpb24gMTMxNTUwKQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9B
Y2Nlc3NpYmlsaXR5TWVkaWFDb250cm9scy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0MCw2ICsx
NDAsMjIgQEAKICAgICByZXR1cm4gU3RyaW5nKCk7CiB9CiAKK3ZvaWQgQWNjZXNzaWJpbGl0eU1l
ZGlhQ29udHJvbDo6YWNjZXNzaWJpbGl0eVRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYg
dGV4dE9yZGVyKQoreworICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGFjY2Vzc2liaWxpdHlEZXNj
cmlwdGlvbigpOworICAgIGlmICghZGVzY3JpcHRpb24uaXNFbXB0eSgpKQorICAgICAgICB0ZXh0
T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KGRlc2NyaXB0aW9uLCBBbHRlcm5hdGl2ZVRl
eHQpKTsKKworICAgIFN0cmluZyB0aXRsZSA9IHRoaXMtPnRpdGxlKCk7CisgICAgaWYgKCF0aXRs
ZS5pc0VtcHR5KCkpCisgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQo
dGl0bGUsIEFsdGVybmF0aXZlVGV4dCkpOworCisgICAgU3RyaW5nIGhlbHB0ZXh0ID0gaGVscFRl
eHQoKTsKKyAgICBpZiAoIWhlbHB0ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgdGV4dE9yZGVyLmFw
cGVuZChBY2Nlc3NpYmlsaXR5VGV4dChoZWxwdGV4dCwgSGVscFRleHQpKTsKK30KKyAgICAKKwog
U3RyaW5nIEFjY2Vzc2liaWxpdHlNZWRpYUNvbnRyb2w6OnRpdGxlKCkgY29uc3QKIHsKICAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgY29udHJvbHNQYW5lbCwgKEFTQ0lJTGl0
ZXJhbCgiQ29udHJvbHNQYW5lbCIpKSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAJKHJldmlz
aW9uIDEzMTU1MCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0
eVJlbmRlck9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcyNSw3MiArNzI1LDYgQEAKICAg
ICByZXR1cm4gMDsKIH0KIAotU3RyaW5nIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFyaWFE
ZXNjcmliZWRCeUF0dHJpYnV0ZSgpIGNvbnN0Ci17Ci0gICAgVmVjdG9yPEVsZW1lbnQqPiBlbGVt
ZW50czsKLSAgICBlbGVtZW50c0Zyb21BdHRyaWJ1dGUoZWxlbWVudHMsIGFyaWFfZGVzY3JpYmVk
YnlBdHRyKTsKLSAgICAKLSAgICByZXR1cm4gYWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uRm9yRWxl
bWVudHMoZWxlbWVudHMpOwotfQotICAgIAotU3RyaW5nIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmpl
Y3Q6OndlYkFyZWFBY2Nlc3NpYmlsaXR5RGVzY3JpcHRpb24oKSBjb25zdAotewotICAgIC8vIFRo
ZSBXZWJBcmVhIGRlc2NyaXB0aW9uIHNob3VsZCBmb2xsb3cgdGhpcyBvcmRlcjoKLSAgICAvLyAg
ICAgYXJpYS1sYWJlbCBvbiB0aGUgPGh0bWw+Ci0gICAgLy8gICAgIHRpdGxlIG9uIHRoZSA8aHRt
bD4KLSAgICAvLyAgICAgPHRpdGxlPiBpbnNpZGUgdGhlIDxoZWFkPiAob2YgaXQgd2FzIHNldCB0
aHJvdWdoIEpTKQotICAgIC8vICAgICBuYW1lIG9uIHRoZSA8aHRtbD4KLSAgICAvLyBGb3IgaWZy
YW1lczoKLSAgICAvLyAgICAgYXJpYS1sYWJlbCBvbiB0aGUgPGlmcmFtZT4KLSAgICAvLyAgICAg
dGl0bGUgb24gdGhlIDxpZnJhbWU+Ci0gICAgLy8gICAgIG5hbWUgb24gdGhlIDxpZnJhbWU+Ci0g
ICAgCi0gICAgaWYgKCFtX3JlbmRlcmVyKQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0gICAg
Ci0gICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gbV9yZW5kZXJlci0+ZG9jdW1lbnQoKTsKLSAgICAK
LSAgICAvLyBDaGVjayBpZiB0aGUgSFRNTCBlbGVtZW50IGhhcyBhbiBhcmlhLWxhYmVsIGZvciB0
aGUgd2VicGFnZS4KLSAgICBpZiAoRWxlbWVudCogZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQt
PmRvY3VtZW50RWxlbWVudCgpKSB7Ci0gICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgYXJpYUxh
YmVsID0gZG9jdW1lbnRFbGVtZW50LT5nZXRBdHRyaWJ1dGUoYXJpYV9sYWJlbEF0dHIpOwotICAg
ICAgICBpZiAoIWFyaWFMYWJlbC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gYXJpYUxh
YmVsOwotICAgIH0KLSAgICAKLSAgICBOb2RlKiBvd25lciA9IGRvY3VtZW50LT5vd25lckVsZW1l
bnQoKTsKLSAgICBpZiAob3duZXIpIHsKLSAgICAgICAgaWYgKG93bmVyLT5oYXNUYWdOYW1lKGZy
YW1lVGFnKSB8fCBvd25lci0+aGFzVGFnTmFtZShpZnJhbWVUYWcpKSB7Ci0gICAgICAgICAgICBj
b25zdCBBdG9taWNTdHJpbmcmIHRpdGxlID0gc3RhdGljX2Nhc3Q8SFRNTEZyYW1lRWxlbWVudEJh
c2UqPihvd25lciktPmdldEF0dHJpYnV0ZSh0aXRsZUF0dHIpOwotICAgICAgICAgICAgaWYgKCF0
aXRsZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRpdGxlOwotICAgICAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxGcmFtZUVsZW1lbnRCYXNlKj4ob3duZXIpLT5nZXRO
YW1lQXR0cmlidXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG93bmVyLT5pc0hUTUxFbGVt
ZW50KCkpCi0gICAgICAgICAgICByZXR1cm4gdG9IVE1MRWxlbWVudChvd25lciktPmdldE5hbWVB
dHRyaWJ1dGUoKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZG9jdW1lbnRUaXRsZSA9IGRvY3VtZW50
LT50aXRsZSgpOwotICAgIGlmICghZG9jdW1lbnRUaXRsZS5pc0VtcHR5KCkpCi0gICAgICAgIHJl
dHVybiBkb2N1bWVudFRpdGxlOwotICAgIAotICAgIG93bmVyID0gZG9jdW1lbnQtPmJvZHkoKTsK
LSAgICBpZiAob3duZXIgJiYgb3duZXItPmlzSFRNTEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJu
IHRvSFRNTEVsZW1lbnQob3duZXIpLT5nZXROYW1lQXR0cmlidXRlKCk7Ci0gICAgCi0gICAgcmV0
dXJuIFN0cmluZygpOwotfQotICAgIAotU3RyaW5nIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6
OmFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3JlbmRlcmVy
KQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0KLSAgICBpZiAoaXNXZWJBcmVhKCkpCi0gICAg
ICAgIHJldHVybiB3ZWJBcmVhQWNjZXNzaWJpbGl0eURlc2NyaXB0aW9uKCk7Ci0KLSAgICByZXR1
cm4gQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpOwot
fQotCiBMYXlvdXRSZWN0IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmJvdW5kaW5nQm94UmVj
dCgpIGNvbnN0CiB7CiAgICAgUmVuZGVyT2JqZWN0KiBvYmogPSBtX3JlbmRlcmVyOwpJbmRleDog
U291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5
Tm9kZU9iamVjdC5jcHAJKHJldmlzaW9uIDEzMTU1MCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vz
c2liaWxpdHkvQWNjZXNzaWJpbGl0eU5vZGVPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
MDc0LDYgKzEwNzQsMjE1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3ZvaWQgQWNjZXNzaWJpbGl0
eU5vZGVPYmplY3Q6OnRpdGxlRWxlbWVudFRleHQoVmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYg
dGV4dE9yZGVyKQoreworICAgIE5vZGUqIG5vZGUgPSB0aGlzLT5ub2RlKCk7CisgICAgaWYgKCFu
b2RlKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgYm9vbCBpc0lucHV0VGFnID0gbm9kZS0+
aGFzVGFnTmFtZShpbnB1dFRhZyk7CisgICAgaWYgKGlzSW5wdXRUYWcgfHwgQWNjZXNzaWJpbGl0
eU9iamVjdDo6aXNBUklBSW5wdXQoYXJpYVJvbGVBdHRyaWJ1dGUoKSkgfHwgaXNDb250cm9sKCkp
IHsKKyAgICAgICAgSFRNTExhYmVsRWxlbWVudCogbGFiZWwgPSBsYWJlbEZvckVsZW1lbnQodG9F
bGVtZW50KG5vZGUpKTsKKyAgICAgICAgaWYgKGxhYmVsKSB7CisgICAgICAgICAgICBBY2Nlc3Np
YmlsaXR5T2JqZWN0KiBsYWJlbE9iamVjdCA9IGF4T2JqZWN0Q2FjaGUoKS0+Z2V0T3JDcmVhdGUo
bGFiZWwpOworICAgICAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChs
YWJlbC0+aW5uZXJUZXh0KCksIExhYmVsQnlFbGVtZW50VGV4dCwgbGFiZWxPYmplY3QpKTsKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBBY2Nlc3NpYmls
aXR5T2JqZWN0KiB0aXRsZVVJRWxlbWVudCA9IHRoaXMtPnRpdGxlVUlFbGVtZW50KCk7CisgICAg
aWYgKHRpdGxlVUlFbGVtZW50KQorICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxp
dHlUZXh0KFN0cmluZygpLCBMYWJlbEJ5RWxlbWVudFRleHQsIHRpdGxlVUlFbGVtZW50KSk7Cit9
CisKK3ZvaWQgQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFsdGVybmF0aXZlVGV4dChWZWN0b3I8
QWNjZXNzaWJpbGl0eVRleHQ+JiB0ZXh0T3JkZXIpIGNvbnN0Cit7CisgICAgaWYgKGlzV2ViQXJl
YSgpKSB7CisgICAgICAgIFN0cmluZyB3ZWJBcmVhVGV4dCA9IGFsdGVybmF0aXZlVGV4dEZvcldl
YkFyZWEoKTsKKyAgICAgICAgaWYgKCF3ZWJBcmVhVGV4dC5pc0VtcHR5KCkpCisgICAgICAgICAg
ICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vzc2liaWxpdHlUZXh0KHdlYkFyZWFUZXh0LCBBbHRlcm5h
dGl2ZVRleHQpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBhcmlhTGFiZWxl
ZEJ5VGV4dCh0ZXh0T3JkZXIpOworICAgIAorICAgIGNvbnN0IEF0b21pY1N0cmluZyYgYXJpYUxh
YmVsID0gZ2V0QXR0cmlidXRlKGFyaWFfbGFiZWxBdHRyKTsKKyAgICBpZiAoIWFyaWFMYWJlbC5p
c0VtcHR5KCkpCisgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQoYXJp
YUxhYmVsLCBBbHRlcm5hdGl2ZVRleHQpKTsKKyAgICAKKyAgICBpZiAoaXNJbWFnZSgpIHx8IGlz
SW5wdXRJbWFnZSgpIHx8IGlzTmF0aXZlSW1hZ2UoKSB8fCBpc0NhbnZhcygpKSB7CisgICAgICAg
IC8vIEltYWdlcyBzaG91bGQgdXNlIGFsdCBhcyBsb25nIGFzIHRoZSBhdHRyaWJ1dGUgaXMgcHJl
c2VudCwgZXZlbiBpZiBlbXB0eS4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBzaG91bGQgZmFs
bGJhY2sgdG8gb3RoZXIgbWV0aG9kcywgbGlrZSB0aGUgdGl0bGUgYXR0cmlidXRlLgorICAgICAg
ICBjb25zdCBBdG9taWNTdHJpbmcmIGFsdCA9IGdldEF0dHJpYnV0ZShhbHRBdHRyKTsKKyAgICAg
ICAgaWYgKCFhbHQuaXNOdWxsKCkpCisgICAgICAgICAgICB0ZXh0T3JkZXIuYXBwZW5kKEFjY2Vz
c2liaWxpdHlUZXh0KGFsdCwgQWx0ZXJuYXRpdmVUZXh0KSk7CisgICAgfQorICAgIAorI2lmIEVO
QUJMRShNQVRITUwpCisgICAgTm9kZSogbm9kZSA9IHRoaXMtPm5vZGUoKTsKKyAgICBpZiAobm9k
ZSAmJiBub2RlLT5pc0VsZW1lbnROb2RlKCkgJiYgdG9FbGVtZW50KG5vZGUpLT5pc01hdGhNTEVs
ZW1lbnQoKSkKKyAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChnZXRB
dHRyaWJ1dGUoTWF0aE1MTmFtZXM6OmFsdHRleHRBdHRyKSwgQWx0ZXJuYXRpdmVUZXh0KSk7Cisj
ZW5kaWYKK30KKwordm9pZCBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6dmlzaWJsZVRleHQoVmVj
dG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYgdGV4dE9yZGVyKSBjb25zdAoreworICAgIE5vZGUqIG5v
ZGUgPSB0aGlzLT5ub2RlKCk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm47CisgICAg
CisgICAgYm9vbCBpc0lucHV0VGFnID0gbm9kZS0+aGFzVGFnTmFtZShpbnB1dFRhZyk7CisgICAg
aWYgKGlzSW5wdXRUYWcpIHsKKyAgICAgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0
aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSk7CisgICAgICAgIGlmIChpbnB1dC0+aXNU
ZXh0QnV0dG9uKCkpIHsKKyAgICAgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0
eVRleHQoaW5wdXQtPnZhbHVlV2l0aERlZmF1bHQoKSwgVmlzaWJsZVRleHQpKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBJZiB0aGlzIG5vZGUg
aXNuJ3QgcmVuZGVyZWQsIHRoZXJlJ3Mgbm8gaW5uZXIgdGV4dCB3ZSBjYW4gZXh0cmFjdCBmcm9t
IGEgc2VsZWN0IGVsZW1lbnQuCisgICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Qo
KSAmJiBub2RlLT5oYXNUYWdOYW1lKHNlbGVjdFRhZykpCisgICAgICAgIHJldHVybjsKKyAgICAK
KyAgICBib29sIHVzZVRleHRVbmRlckVsZW1lbnQgPSBmYWxzZTsKKyAgICAKKyAgICBzd2l0Y2gg
KHJvbGVWYWx1ZSgpKSB7CisgICAgY2FzZSBQb3BVcEJ1dHRvblJvbGU6CisgICAgY2FzZSBCdXR0
b25Sb2xlOgorICAgIGNhc2UgVG9nZ2xlQnV0dG9uUm9sZToKKyAgICBjYXNlIENoZWNrQm94Um9s
ZToKKyAgICBjYXNlIExpc3RCb3hPcHRpb25Sb2xlOgorICAgIGNhc2UgTWVudUJ1dHRvblJvbGU6
CisgICAgY2FzZSBNZW51SXRlbVJvbGU6CisgICAgY2FzZSBSYWRpb0J1dHRvblJvbGU6CisgICAg
Y2FzZSBUYWJSb2xlOgorICAgICAgICB1c2VUZXh0VW5kZXJFbGVtZW50ID0gdHJ1ZTsKKyAgICAg
ICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAg
IC8vIElmIGl0J3MgZm9jdXNhYmxlIGJ1dCBpdCdzIG5vdCBjb250ZW50IGVkaXRhYmxlIG9yIGEg
a25vd24gY29udHJvbCB0eXBlLCB0aGVuIGl0IHdpbGwgYXBwZWFyIHRvCisgICAgLy8gdGhlIHVz
ZXIgYXMgYSBzaW5nbGUgYXRvbWljIG9iamVjdCwgc28gd2Ugc2hvdWxkIHVzZSBpdHMgdGV4dCBh
cyB0aGUgZGVmYXVsdCB0aXRsZS4KKyAgICBpZiAoaXNIZWFkaW5nKCkgfHwgaXNMaW5rKCkgfHwg
aXNHZW5lcmljRm9jdXNhYmxlRWxlbWVudCgpKQorICAgICAgICB1c2VUZXh0VW5kZXJFbGVtZW50
ID0gdHJ1ZTsKKyAgICAKKyAgICBpZiAodXNlVGV4dFVuZGVyRWxlbWVudCkgeworICAgICAgICBT
dHJpbmcgdGV4dCA9IHRleHRVbmRlckVsZW1lbnQoKTsKKyAgICAgICAgaWYgKCF0ZXh0LmlzRW1w
dHkoKSkKKyAgICAgICAgICAgIHRleHRPcmRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eVRleHQodGV4
dCwgQ2hpbGRyZW5UZXh0KSk7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc2liaWxpdHlOb2RlT2Jq
ZWN0OjpoZWxwVGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+JiB0ZXh0T3JkZXIpIGNvbnN0
Cit7CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBhcmlhSGVscCA9IGdldEF0dHJpYnV0ZShhcmlh
X2hlbHBBdHRyKTsKKyAgICBpZiAoIWFyaWFIZWxwLmlzRW1wdHkoKSkKKyAgICAgICAgdGV4dE9y
ZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChhcmlhSGVscCwgSGVscFRleHQpKTsKKyAgICAK
KyAgICBTdHJpbmcgZGVzY3JpYmVkQnkgPSBhcmlhRGVzY3JpYmVkQnlBdHRyaWJ1dGUoKTsKKyAg
ICBpZiAoIWRlc2NyaWJlZEJ5LmlzRW1wdHkoKSkKKyAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChB
Y2Nlc3NpYmlsaXR5VGV4dChkZXNjcmliZWRCeSwgU3VtbWFyeVRleHQpKTsKKyAgICAKKyAgICAv
LyBBZGQgaGVscCB0eXBlIHRleHQgdGhhdCBpcyBkZXJpdmVkIGZyb20gYW5jZXN0b3JzLgorICAg
IGZvciAoTm9kZSogY3VyciA9IG5vZGUoKTsgY3VycjsgY3VyciA9IGN1cnItPnBhcmVudE5vZGUo
KSkgeworICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHN1bW1hcnkgPSBnZXRBdHRyaWJ1dGUo
c3VtbWFyeUF0dHIpOworICAgICAgICBpZiAoIXN1bW1hcnkuaXNFbXB0eSgpKQorICAgICAgICAg
ICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dChzdW1tYXJ5LCBTdW1tYXJ5VGV4
dCkpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlIHRpdGxlIGF0dHJpYnV0ZSBzaG91bGQgYmUg
dXNlZCBhcyBoZWxwIHRleHQgdW5sZXNzIGl0IGlzIGFscmVhZHkgYmVpbmcgdXNlZCBhcyBkZXNj
cmlwdGl2ZSB0ZXh0LgorICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHRpdGxlID0gZ2V0QXR0
cmlidXRlKHRpdGxlQXR0cik7CisgICAgICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3NpYmlsaXR5VGV4dCh0aXRsZSwgVGl0bGVUYWdU
ZXh0KSk7CisgICAgICAgIAorICAgICAgICAvLyBPbmx5IHRha2UgaGVscCB0ZXh0IGZyb20gYW4g
YW5jZXN0b3IgZWxlbWVudCBpZiBpdHMgYSBncm91cCBvciBhbiB1bmtub3duIHJvbGUuIElmIGhl
bHAgd2FzCisgICAgICAgIC8vIGFkZGVkIHRvIHRob3NlIGtpbmRzIG9mIGVsZW1lbnRzLCBpdCBp
cyBsaWtlbHkgaXQgd2FzIG1lYW50IGZvciBhIGNoaWxkIGVsZW1lbnQuCisgICAgICAgIEFjY2Vz
c2liaWxpdHlPYmplY3QqIGF4T2JqID0gYXhPYmplY3RDYWNoZSgpLT5nZXRPckNyZWF0ZShjdXJy
KTsKKyAgICAgICAgaWYgKCFheE9iaikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisg
ICAgICAgIEFjY2Vzc2liaWxpdHlSb2xlIHJvbGUgPSBheE9iai0+cm9sZVZhbHVlKCk7CisgICAg
ICAgIGlmIChyb2xlICE9IEdyb3VwUm9sZSAmJiByb2xlICE9IFVua25vd25Sb2xlKQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0Ojph
Y2Nlc3NpYmlsaXR5VGV4dChWZWN0b3I8QWNjZXNzaWJpbGl0eVRleHQ+JiB0ZXh0T3JkZXIpCit7
CisgICAgdGl0bGVFbGVtZW50VGV4dCh0ZXh0T3JkZXIpOworICAgIGFsdGVybmF0aXZlVGV4dCh0
ZXh0T3JkZXIpOworICAgIHZpc2libGVUZXh0KHRleHRPcmRlcik7CisgICAgaGVscFRleHQodGV4
dE9yZGVyKTsKKyAgICAKKyAgICBTdHJpbmcgcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlclZhbHVl
KCk7CisgICAgaWYgKCFwbGFjZWhvbGRlci5pc0VtcHR5KCkpCisgICAgICAgIHRleHRPcmRlci5h
cHBlbmQoQWNjZXNzaWJpbGl0eVRleHQocGxhY2Vob2xkZXIsIFBsYWNlaG9sZGVyVGV4dCkpOwor
fQorICAgIAordm9pZCBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6YXJpYUxhYmVsZWRCeVRleHQo
VmVjdG9yPEFjY2Vzc2liaWxpdHlUZXh0PiYgdGV4dE9yZGVyKSBjb25zdAoreworICAgIFN0cmlu
ZyBhcmlhTGFiZWxlZEJ5ID0gYXJpYUxhYmVsZWRCeUF0dHJpYnV0ZSgpOworICAgIGlmICghYXJp
YUxhYmVsZWRCeS5pc0VtcHR5KCkpIHsKKyAgICAgICAgVmVjdG9yPEVsZW1lbnQqPiBlbGVtZW50
czsKKyAgICAgICAgYXJpYUxhYmVsZWRCeUVsZW1lbnRzKGVsZW1lbnRzKTsKKyAgICAgICAgCisg
ICAgICAgIFZlY3RvcjxSZWZQdHI8QWNjZXNzaWJpbGl0eU9iamVjdD4gPiBheEVsZW1lbnRzOwor
ICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBlbGVtZW50cy5zaXplKCk7CisgICAgICAgIGZvciAo
dW5zaWduZWQgayA9IDA7IGsgPCBsZW5ndGg7IGsrKykgeworICAgICAgICAgICAgUmVmUHRyPEFj
Y2Vzc2liaWxpdHlPYmplY3Q+IGF4RWxlbWVudCA9IGF4T2JqZWN0Q2FjaGUoKS0+Z2V0T3JDcmVh
dGUoZWxlbWVudHNba10pOworICAgICAgICAgICAgYXhFbGVtZW50cy5hcHBlbmQoYXhFbGVtZW50
KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdGV4dE9yZGVyLmFwcGVuZChBY2Nlc3Np
YmlsaXR5VGV4dChhcmlhTGFiZWxlZEJ5LCBBbHRlcm5hdGl2ZVRleHQsIGF4RWxlbWVudHMpKTsK
KyAgICB9Cit9CisgICAgCitTdHJpbmcgQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFsdGVybmF0
aXZlVGV4dEZvcldlYkFyZWEoKSBjb25zdAoreworICAgIC8vIFRoZSBXZWJBcmVhIGRlc2NyaXB0
aW9uIHNob3VsZCBmb2xsb3cgdGhpcyBvcmRlcjoKKyAgICAvLyAgICAgYXJpYS1sYWJlbCBvbiB0
aGUgPGh0bWw+CisgICAgLy8gICAgIHRpdGxlIG9uIHRoZSA8aHRtbD4KKyAgICAvLyAgICAgPHRp
dGxlPiBpbnNpZGUgdGhlIDxoZWFkPiAob2YgaXQgd2FzIHNldCB0aHJvdWdoIEpTKQorICAgIC8v
ICAgICBuYW1lIG9uIHRoZSA8aHRtbD4KKyAgICAvLyBGb3IgaWZyYW1lczoKKyAgICAvLyAgICAg
YXJpYS1sYWJlbCBvbiB0aGUgPGlmcmFtZT4KKyAgICAvLyAgICAgdGl0bGUgb24gdGhlIDxpZnJh
bWU+CisgICAgLy8gICAgIG5hbWUgb24gdGhlIDxpZnJhbWU+CisgICAgCisgICAgRG9jdW1lbnQq
IGRvY3VtZW50ID0gdGhpcy0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAg
ICByZXR1cm4gU3RyaW5nKCk7CisgICAgCisgICAgLy8gQ2hlY2sgaWYgdGhlIEhUTUwgZWxlbWVu
dCBoYXMgYW4gYXJpYS1sYWJlbCBmb3IgdGhlIHdlYnBhZ2UuCisgICAgaWYgKEVsZW1lbnQqIGRv
Y3VtZW50RWxlbWVudCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQoKSkgeworICAgICAgICBj
b25zdCBBdG9taWNTdHJpbmcmIGFyaWFMYWJlbCA9IGRvY3VtZW50RWxlbWVudC0+Z2V0QXR0cmli
dXRlKGFyaWFfbGFiZWxBdHRyKTsKKyAgICAgICAgaWYgKCFhcmlhTGFiZWwuaXNFbXB0eSgpKQor
ICAgICAgICAgICAgcmV0dXJuIGFyaWFMYWJlbDsKKyAgICB9CisgICAgCisgICAgTm9kZSogb3du
ZXIgPSBkb2N1bWVudC0+b3duZXJFbGVtZW50KCk7CisgICAgaWYgKG93bmVyKSB7CisgICAgICAg
IGlmIChvd25lci0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgb3duZXItPmhhc1RhZ05hbWUoaWZy
YW1lVGFnKSkgeworICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB0aXRsZSA9IHN0YXRp
Y19jYXN0PEhUTUxGcmFtZUVsZW1lbnRCYXNlKj4ob3duZXIpLT5nZXRBdHRyaWJ1dGUodGl0bGVB
dHRyKTsKKyAgICAgICAgICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAg
IHJldHVybiB0aXRsZTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRnJhbWVF
bGVtZW50QmFzZSo+KG93bmVyKS0+Z2V0TmFtZUF0dHJpYnV0ZSgpOworICAgICAgICB9CisgICAg
ICAgIGlmIChvd25lci0+aXNIVE1MRWxlbWVudCgpKQorICAgICAgICAgICAgcmV0dXJuIHRvSFRN
TEVsZW1lbnQob3duZXIpLT5nZXROYW1lQXR0cmlidXRlKCk7CisgICAgfQorICAgIAorICAgIFN0
cmluZyBkb2N1bWVudFRpdGxlID0gZG9jdW1lbnQtPnRpdGxlKCk7CisgICAgaWYgKCFkb2N1bWVu
dFRpdGxlLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50VGl0bGU7CisgICAgCisg
ICAgb3duZXIgPSBkb2N1bWVudC0+Ym9keSgpOworICAgIGlmIChvd25lciAmJiBvd25lci0+aXNI
VE1MRWxlbWVudCgpKQorICAgICAgICByZXR1cm4gdG9IVE1MRWxlbWVudChvd25lciktPmdldE5h
bWVBdHRyaWJ1dGUoKTsKKyAgICAKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisgICAgCiBTdHJp
bmcgQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFjY2Vzc2liaWxpdHlEZXNjcmlwdGlvbigpIGNv
bnN0CiB7CiAgICAgLy8gU3RhdGljIHRleHQgc2hvdWxkIG5vdCBoYXZlIGEgZGVzY3JpcHRpb24s
IGl0IHNob3VsZCBvbmx5IGhhdmUgYSBzdHJpbmdWYWx1ZS4KQEAgLTEzNDEsNiArMTU1MCwxNCBA
QAogICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiB9CiAKK1N0cmluZyBBY2Nlc3NpYmls
aXR5Tm9kZU9iamVjdDo6YXJpYURlc2NyaWJlZEJ5QXR0cmlidXRlKCkgY29uc3QKK3sKKyAgICBW
ZWN0b3I8RWxlbWVudCo+IGVsZW1lbnRzOworICAgIGVsZW1lbnRzRnJvbUF0dHJpYnV0ZShlbGVt
ZW50cywgYXJpYV9kZXNjcmliZWRieUF0dHIpOworICAgIAorICAgIHJldHVybiBhY2Nlc3NpYmls
aXR5RGVzY3JpcHRpb25Gb3JFbGVtZW50cyhlbGVtZW50cyk7Cit9CisKIHZvaWQgQWNjZXNzaWJp
bGl0eU5vZGVPYmplY3Q6OmVsZW1lbnRzRnJvbUF0dHJpYnV0ZShWZWN0b3I8RWxlbWVudCo+JiBl
bGVtZW50cywgY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0cmlidXRlKSBjb25zdAogewogICAgIE5v
ZGUqIG5vZGUgPSB0aGlzLT5ub2RlKCk7CkluZGV4OiBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJv
bWl1bS9UZXN0RXhwZWN0YXRpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3Jt
L2Nocm9taXVtL1Rlc3RFeHBlY3RhdGlvbnMJKHJldmlzaW9uIDEzMTU1MCkKKysrIExheW91dFRl
c3RzL3BsYXRmb3JtL2Nocm9taXVtL1Rlc3RFeHBlY3RhdGlvbnMJKHdvcmtpbmcgY29weSkKQEAg
LTE0MzUsNiArMTQzNSw3IEBACiAKIHdlYmtpdC5vcmcvYi85NzM1OSBhY2Nlc3NpYmlsaXR5L3N2
Zy1ib3VuZHMuaHRtbCBbIFNraXAgXQogd2Via2l0Lm9yZy9iLzczOTEyIGFjY2Vzc2liaWxpdHkv
YXJpYS1jaGVja2JveC10ZXh0Lmh0bWwgWyBTa2lwIF0KK3dlYmtpdC5vcmcvYi85OTY2NSBhY2Nl
c3NpYmlsaXR5L2xvYWRpbmctaWZyYW1lLXNlbmRzLW5vdGlmaWNhdGlvbi5odG1sIFsgU2tpcCBd
CiAKIHdlYmtpdC5vcmcvYi83MzkxMiBhY2Nlc3NpYmlsaXR5L2FyaWEtY2hlY2tib3gtc2VuZHMt
bm90aWZpY2F0aW9uLmh0bWwgWyBGYWlsdXJlIFBhc3MgXQogCkluZGV4OiBMYXlvdXRUZXN0cy9w
bGF0Zm9ybS9tYWMvYWNjZXNzaWJpbGl0eS9hcmlhLXJhZGlvYnV0dG9uLXRleHQuaHRtbAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMvYWNjZXNzaWJpbGl0eS9hcmlhLXJh
ZGlvYnV0dG9uLXRleHQuaHRtbAkocmV2aXNpb24gMTMxNTUwKQorKysgTGF5b3V0VGVzdHMvcGxh
dGZvcm0vbWFjL2FjY2Vzc2liaWxpdHkvYXJpYS1yYWRpb2J1dHRvbi10ZXh0Lmh0bWwJKHdvcmtp
bmcgY29weSkKQEAgLTMwLDcgKzMwLDkgQEAKICAgICAgICAgICB2YXIgc3VjY2VlZGVkID0gb2Jq
LmNoaWxkQXRJbmRleCgxKS50aXRsZSA9PSAiQVhUaXRsZTogVHdvIjsKICAgICAgICAgICBzaG91
bGRCZSgic3VjY2VlZGVkIiwgInRydWUiKTsKIAotICAgICAgICAgIHZhciBzdWNjZWVkZWQgPSBv
YmouY2hpbGRBdEluZGV4KDIpLnRpdGxlID09ICJBWFRpdGxlOiBUaHJlZSI7CisgICAgICAgICAg
Ly8gQmVjYXVzZSB0aGUgdGhpcmQgYnV0dG9uIHVzZXMgYXJpYS1sYWJlbGxlZGJ5LCB0aGUgYWNj
ZXNzaWJsZSBuYW1lCisgICAgICAgICAgLy8gd2lsbCBiZSBpbnNpZGUgdGhlIGRlc2NyaXB0aW9u
IGZpZWxkLgorICAgICAgICAgIHZhciBzdWNjZWVkZWQgPSBvYmouY2hpbGRBdEluZGV4KDIpLmRl
c2NyaXB0aW9uID09ICJBWERlc2NyaXB0aW9uOiBUaHJlZSI7CiAgICAgICAgICAgc2hvdWxkQmUo
InN1Y2NlZWRlZCIsICJ0cnVlIik7CiAgICAgfQogCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxMzE2Nzgp
CisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNCBA
QAorMjAxMi0xMC0xNyAgQ2hyaXMgRmxlaXphY2ggIDxjZmxlaXphY2hAYXBwbGUuY29tPgorCisg
ICAgICAgIEFYOiBSZWZhY3RvciBhY2Nlc3NpYmlsaXR5IG5hbWUgY29tcHV0YXRpb24gc28gaXQn
cyBtb3JlIHBsYXRmb3JtIGluZGVwZW5kZW50CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD05OTUwMgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFVwZGF0ZSB0ZXN0IHRvIHJlZmxlY3QgY2hhbmdlIGluIHdoYXQg
c2hvdWQgYmUgcmVjb2duaXplZCBhcyBhIHRpdGxlLgorCisgICAgICAgICogcGxhdGZvcm0vbWFj
L2FjY2Vzc2liaWxpdHkvYXJpYS1yYWRpb2J1dHRvbi10ZXh0Lmh0bWw6CisKIDIwMTItMTAtMTcg
IEpvYW5tYXJpZSBEaWdncyAgPGpkaWdnc0BpZ2FsaWEuY29tPgogCiAgICAgICAgIFtHVEtdIEFj
Y2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnJvbGUoKSBzaG91bGQgYmUgY29uc2lzdGVudCBhY3Jvc3Mg
cGxhdGZvcm1zIHdoZXJldmVyIHBvc3NpYmxlCg==
</data>
<flag name="review"
          id="182572"
          type_id="1"
          status="+"
          setter="bdakin"
    />
          </attachment>
      

    </bug>

</bugzilla>