<?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>46840</bug_id>
          
          <creation_ts>2010-09-29 14:27:20 -0700</creation_ts>
          <short_desc>FormatBlockCommand and IndentOutdentCommand should use the same code to iterate paragraphs</short_desc>
          <delta_ts>2010-10-01 21:49:58 -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>HTML Editing</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</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>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>19795</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>darin</cc>
    
    <cc>enrica</cc>
    
    <cc>ojan</cc>
    
    <cc>tkent</cc>
    
    <cc>tony</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>287123</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-09-29 14:27:20 -0700</bug_when>
    <thetext>Currently FormatBlockCommand and IndentOutdentCommand each implements its own paragraph iteration mechanism in FormatBlock::doApply and IndentOutdentCommand::indentRegion.  They should use the same iteration mechanism and in fact share the code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287182</commentid>
    <comment_count>1</comment_count>
      <attachid>69266</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-09-29 15:57:07 -0700</bug_when>
    <thetext>Created attachment 69266
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287184</commentid>
    <comment_count>2</comment_count>
      <attachid>69267</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-09-29 15:59:21 -0700</bug_when>
    <thetext>Created attachment 69267
FormatBlockCommand.cpp with patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287186</commentid>
    <comment_count>3</comment_count>
      <attachid>69268</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-09-29 15:59:48 -0700</bug_when>
    <thetext>Created attachment 69268
IndentOutdentCommand.cpp with patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287190</commentid>
    <comment_count>4</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-09-29 16:02:18 -0700</bug_when>
    <thetext>Since I&apos;m moving a lot of code, diff &amp; pretty diff are impossible to read.  I&apos;d recommend comparing the attached cpp files with the current cpp files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287196</commentid>
    <comment_count>5</comment_count>
      <attachid>69271</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-09-29 16:15:18 -0700</bug_when>
    <thetext>Created attachment 69271
FormatBlockCommand.cpp with patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287197</commentid>
    <comment_count>6</comment_count>
      <attachid>69272</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-09-29 16:15:49 -0700</bug_when>
    <thetext>Created attachment 69272
IndentOutdentCommand.cpp with patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287198</commentid>
    <comment_count>7</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-09-29 16:17:43 -0700</bug_when>
    <thetext>Sorry, I failed.  None of the attached files are what I intended to post here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287355</commentid>
    <comment_count>8</comment_count>
      <attachid>69266</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-09-29 20:22:26 -0700</bug_when>
    <thetext>Comment on attachment 69266
Patch

On second thought, it makes more senes to add an abstract class shared by FormatBlockCommand and IndentOutdentCommand.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>288512</commentid>
    <comment_count>9</comment_count>
      <attachid>69525</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-10-01 15:12:08 -0700</bug_when>
    <thetext>Created attachment 69525
adds an abstract class to be inherited by FormatBlockCommand and IndentOutdentCommand</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>288547</commentid>
    <comment_count>10</comment_count>
      <attachid>69525</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-10-01 15:56:31 -0700</bug_when>
    <thetext>Comment on attachment 69525
adds an abstract class to be inherited by FormatBlockCommand and IndentOutdentCommand

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

It might have been better to start ApplyBlockElementCommand.cpp as a copy of IndentOutdentCommand.cpp so we could see the unchanged code that came from there and preserve the change history of the code. Now it looks like you wrote all of it!

&gt; WebCore/editing/ApplyBlockElementCommand.cpp:2
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.

Did you write all this code? If not, then you need to have the copyright from the copied code on this file, rather than just saying 2010 Google.

&gt; WebCore/editing/ApplyBlockElementCommand.h:45
&gt; +    virtual void doApply();
&gt; +    virtual void formatSelection(const VisiblePosition&amp; startOfSelection, const VisiblePosition&amp; endOfSelection);
&gt; +    virtual void formatParagraph(const VisiblePosition&amp; endOfCurrentParagraph, RefPtr&lt;Element&gt;&amp;) = 0;

You might even consider making some of these private.

&gt; WebCore/editing/ApplyBlockElementCommand.h:52
&gt; +    QualifiedName m_tagName;
&gt; +    AtomicString m_className;
&gt; +    AtomicString m_inlineStyle;

Can these be private instead of protected?

&gt; WebCore/editing/EditorCommand.cpp:442
&gt; +    ExceptionCode ec;
&gt; +    String localName, prefix;
&gt; +    if (!Document::parseQualifiedName(tagName, prefix, localName, ec))
&gt; +        return false;
&gt; +    QualifiedName qualifiedTagName(prefix, localName, xhtmlNamespaceURI);

Seems to me we need to come up with a parseQualifiedName function that returns a QualifiedName!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>288575</commentid>
    <comment_count>11</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-10-01 16:36:31 -0700</bug_when>
    <thetext>Thanks for the review!

(In reply to comment #10)
&gt; (From update of attachment 69525 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=69525&amp;action=review
&gt; 
&gt; It might have been better to start ApplyBlockElementCommand.cpp as a copy of IndentOutdentCommand.cpp so we could see the unchanged code that came from there and preserve the change history of the code. Now it looks like you wrote all of it!

I considered that as well but that resulted in unreadable svn diff so decided not to.  Hopefully people read changelog when they&apos;re tracking code.

&gt; &gt; WebCore/editing/ApplyBlockElementCommand.cpp:2
&gt; &gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; 
&gt; Did you write all this code? If not, then you need to have the copyright from the copied code on this file, rather than just saying 2010 Google.

Good point.  I intended to add Apple&apos;s copyright to cpp file and forgot.  Thanks for pointing that out.

&gt; &gt; WebCore/editing/ApplyBlockElementCommand.h:45
&gt; &gt; +    virtual void doApply();
&gt; &gt; +    virtual void formatSelection(const VisiblePosition&amp; startOfSelection, const VisiblePosition&amp; endOfSelection);
&gt; &gt; +    virtual void formatParagraph(const VisiblePosition&amp; endOfCurrentParagraph, RefPtr&lt;Element&gt;&amp;) = 0;
&gt; 
&gt; You might even consider making some of these private.

I think all of them need to be because they need to be overridden.  But I made splitTextNodes private.

&gt; &gt; WebCore/editing/ApplyBlockElementCommand.h:52
&gt; &gt; +    QualifiedName m_tagName;
&gt; &gt; +    AtomicString m_className;
&gt; &gt; +    AtomicString m_inlineStyle;
&gt; 
&gt; Can these be private instead of protected?

Made everything private and added a protected tagName() accessor.

&gt; &gt; WebCore/editing/EditorCommand.cpp:442
&gt; &gt; +    ExceptionCode ec;
&gt; &gt; +    String localName, prefix;
&gt; &gt; +    if (!Document::parseQualifiedName(tagName, prefix, localName, ec))
&gt; &gt; +        return false;
&gt; &gt; +    QualifiedName qualifiedTagName(prefix, localName, xhtmlNamespaceURI);
&gt; 
&gt; Seems to me we need to come up with a parseQualifiedName function that returns a QualifiedName!

Yes.  That&apos;ll be nice.  But the fact there is no null value for QualifiedName prevents us from doing so at the moment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>288603</commentid>
    <comment_count>12</comment_count>
      <attachid>69525</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-10-01 17:32:36 -0700</bug_when>
    <thetext>Comment on attachment 69525
adds an abstract class to be inherited by FormatBlockCommand and IndentOutdentCommand

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

&gt;&gt;&gt; WebCore/editing/ApplyBlockElementCommand.h:45
&gt;&gt;&gt; +    virtual void formatParagraph(const VisiblePosition&amp; endOfCurrentParagraph, RefPtr&lt;Element&gt;&amp;) = 0;
&gt;&gt; 
&gt;&gt; You might even consider making some of these private.
&gt; 
&gt; I think all of them need to be because they need to be overridden.  But I made splitTextNodes private.

A function does not need to be protected to be overriden. Whether it’s protected or private affects only whether it can be called, no effect on overriding.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>288613</commentid>
    <comment_count>13</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-10-01 17:52:31 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; &gt;&gt; You might even consider making some of these private.
&gt; &gt; 
&gt; &gt; I think all of them need to be because they need to be overridden.  But I made splitTextNodes private.
&gt; 
&gt; A function does not need to be protected to be overriden. Whether it’s protected or private affects only whether it can be called, no effect on overriding.

Ah!  I guess I can make doApply and formatParagraph private then.  Will do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>288652</commentid>
    <comment_count>14</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-10-01 21:49:58 -0700</bug_when>
    <thetext>Committed r68972: &lt;http://trac.webkit.org/changeset/68972&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>69266</attachid>
            <date>2010-09-29 15:57:07 -0700</date>
            <delta_ts>2010-09-29 20:22:26 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-46840-20100929155706.patch</filename>
            <type>text/plain</type>
            <size>28305</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2ODY5NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDQgQEAKKzIwMTAtMDktMjkgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRm9y
bWF0QmxvY2tDb21tYW5kIGFuZCBJbmRlbnRPdXRkZW50Q29tbWFuZCBzaG91bGQgdXNlIHRoZSBz
YW1lIGNvZGUgdG8gaXRlcmF0ZSBwYXJhZ3JhcGhzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD00Njg0MAorCisgICAgICAgIE1lcmdlZCB0aGUgY29kZSB0
byBpdGVyYXRlIHBhcmFncmFwaHMgaW4gRm9ybWF0QmxvY2tDb21tYW5kIGFuZCBJbmRlbnRPdXRk
ZW50Q29tbWFuZC4KKyAgICAgICAgSW4gbmV3IGRlc2lnbiwgSW5kZW50T3V0ZGVudENvbW1hbmQg
aW5oZXJpdHMgZnJvbSBGb3JtYXRCbG9ja0NvbW1hbmQgYXMgZm9sbG93czoKKyAgICAgICAgLSBG
b3JtYXRCbG9ja0NvbW1hbmQ6OmRvQXBwbHkgaXMgbWVyZWx5IGEgd3JhcHBlciBmdW5jdGlvbiB0
aGF0IGNhbGxzIGZvcm1hdFNlbGVjdGlvbiBhbmQgcmVzdG9yZXMgc2VsZWN0aW9uIGFmdGVyd2Fy
ZHMuCisgICAgICAgICAgSW5kZW50T3V0ZGVudENvbW1hbmQgbm8gbG9uZ2VyIGltcGxlbWVudHMg
ZG9BcHBseSBzaW5jZSBpdHMgaW1wbGVtZW50YXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoYXQgb2Yg
Rm9ybWF0QmxvY2suCisgICAgICAgIC0gRm9ybWF0QmxvY2tDb21tYW5kOjpmb3JtYXRTZWxlY3Rp
b24gaXRlcmF0ZXMgdGhyb3VnaCBwYXJhZ3JhcGhzIGFuZCBjYWxscyBmb3JtYXRQYXJhZ3JhcGgg
b24gZWFjaCBwYXJhZ3JhcGguCisgICAgICAgICAgVGhlIGxvZ2ljIGlzIGlkZW50aWNhbCB0byB0
aGF0IG9mIHRoZSBvbGQgaW5kZW50UmVnaW9uLiAgQmVjYXVzZSBJbmRlbnRPdXRkZW50Q29tbWFu
ZDo6b3V0ZGVudFJlZ2lvbiB1c2VzIGEgc2xpZ2h0bHkKKyAgICAgICAgICBkaWZmZXJlbnQgaW1w
bGVtZW50YXRpb24sIEluZGVudE91dGRlbnRDb21tYW5kIG92ZXJyaWRlcyBmb3JtYXRTZWxlY3Rp
b24gdG8gY2FsbCBvdXRkZW50UmVnaW9uIHdoZW4gb3V0ZGVudGluZy4KKyAgICAgICAgLSBGb3Jt
YXRCbG9ja0NvbW1hbmQ6OmZvcm1hdFBhcmFncmFwaCBpbXBsZW1lbnRzIHRoZSBvbGQgRm9ybWF0
QmxvY2tDb21tYW5kOjpkb0FwcGx5Rm9yU2luZ2xlUGFyYWdyYXBoLgorICAgICAgICAgIEluIElu
ZGVudE91dGRlbnRDb21tYW5kLCBpdCdzIG92ZXJyaWRkZW4gdG8gY2FsbCB0cnlJbmRlbnRpbmdB
c0xpc3RJdGVtIGFuZCBpbmRlbnRJbnRvQmxvY2txdW90ZS4KKworICAgICAgICBObyBuZXcgdGVz
dHMgYXJlIGFkZGVkIHNpbmNlIHRoaXMgaXMgYSBjbGVhbnVwLgorCisgICAgICAgICogZWRpdGlu
Zy9FZGl0b3JDb21tYW5kLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmV4ZWN1dGVGb3JtYXRCbG9j
ayk6IEZvcm1hdEJsb2NrQ29tbWFuZDo6Y3JlYXRlIHRha2VzIGNvbnN0IHJlZmVyZW5jZSBvZiBR
dWFsaWZpZWROYW1lIGluc3RlYWQgb2YgQXRvbWljU3RyaW5nLgorICAgICAgICAqIGVkaXRpbmcv
Rm9ybWF0QmxvY2tDb21tYW5kLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZvcm1hdEJsb2NrQ29t
bWFuZDo6Rm9ybWF0QmxvY2tDb21tYW5kKToKKyAgICAgICAgKFdlYkNvcmU6OkZvcm1hdEJsb2Nr
Q29tbWFuZDo6ZG9BcHBseSk6CisgICAgICAgIChXZWJDb3JlOjpGb3JtYXRCbG9ja0NvbW1hbmQ6
OmZvcm1hdFNlbGVjdGlvbik6IE1vdmVkIGZyb20gSW5kZW50T3V0ZGVudENvbW1hbmQ6OmluZGVu
dFJlZ2lvbi4KKyAgICAgICAgQ2FsbHMgZm9ybWF0UGFyYWdyYXBoIGluc3RlYWQgb2YgZGlyZWN0
bHkgY2FsbGluZyB0cnlJbmRlbnRpbmdBc0xpc3RJdGVtIGFuZCBpbmRlbnRJbnRvQmxvY2txdW90
ZS4KKyAgICAgICAgKFdlYkNvcmU6OkZvcm1hdEJsb2NrQ29tbWFuZDo6Zm9ybWF0UGFyYWdyYXBo
KTogUmVuYW1lZCBmcm9tIGRvQXBwbHlGb3JTaW5nbGVQYXJhZ3JhcGguCisgICAgICAgIChXZWJD
b3JlOjpGb3JtYXRCbG9ja0NvbW1hbmQ6OmNyZWF0ZUJsb2NrRWxlbWVudCk6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Rm9ybWF0QmxvY2tDb21tYW5kOjpjb3VudFBhcmFncmFwaHMpOiBNb3Zl
ZCBmcm9tIEluZGVudE91dGRlbnRDb21tYW5kLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6OkZvcm1h
dEJsb2NrQ29tbWFuZDo6c3BsaXRUZXh0Tm9kZXMpOiBNb3ZlZCBmcm9tIEluZGVudE91dGRlbnRD
b21tYW5kOjpzcGxpdFRleHROb2Rlcy4KKyAgICAgICAgKiBlZGl0aW5nL0Zvcm1hdEJsb2NrQ29t
bWFuZC5oOgorICAgICAgICAoV2ViQ29yZTo6Rm9ybWF0QmxvY2tDb21tYW5kOjpjcmVhdGUpOgor
ICAgICAgICAqIGVkaXRpbmcvSW5kZW50T3V0ZGVudENvbW1hbmQuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6aXNMaXN0T3JJbmRlbnRCbG9ja3F1b3RlKToKKyAgICAgICAgKFdlYkNvcmU6OkluZGVu
dE91dGRlbnRDb21tYW5kOjpJbmRlbnRPdXRkZW50Q29tbWFuZCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbmRlbnRPdXRkZW50Q29tbWFuZDo6Zm9ybWF0U2VsZWN0aW9uKTogQWRkZWQuIENhbGxzIG91
dGRlbnRSZWdpb24gd2hlbiBtX3R5cGVPZkFjdGlvbiBpcyBPdXRkZW50LgorICAgICAgICAoV2Vi
Q29yZTo6SW5kZW50T3V0ZGVudENvbW1hbmQ6OmZvcm1hdFBhcmFncmFwaCk6IEFkZGVkLiBDYWxs
cyB0cnlJbmRlbnRpbmdBc0xpc3RJdGVtIGFuZCBpbmRlbnRJbnRvQmxvY2txdW90ZS4KKyAgICAg
ICAgKFdlYkNvcmU6OkluZGVudE91dGRlbnRDb21tYW5kOjpjcmVhdGVCbG9ja0VsZW1lbnQpOiBS
ZW5hbWVkIGZyb20gY3JlYXRlSW5kZW50QmxvY2txdW90ZUVsZW1lbnQuCisgICAgICAgIChXZWJD
b3JlOjpJbmRlbnRPdXRkZW50Q29tbWFuZDo6aW5kZW50SW50b0Jsb2NrcXVvdGUpOiBDYWxscyBj
cmVhdGVCbG9ja0VsZW1lbnQuCisgICAgICAgICogZWRpdGluZy9JbmRlbnRPdXRkZW50Q29tbWFu
ZC5oOgorCiAyMDEwLTA5LTI5ICBEYXZpZCBIeWF0dCAgPGh5YXR0QGFwcGxlLmNvbT4KIAogICAg
ICAgICBSZXZpZXdlZCBieSBTYW0gV2VpbmlnLgpJbmRleDogV2ViQ29yZS9lZGl0aW5nL0VkaXRv
ckNvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZWRpdGluZy9FZGl0b3JDb21tYW5k
LmNwcAkocmV2aXNpb24gNjg2NzUpCisrKyBXZWJDb3JlL2VkaXRpbmcvRWRpdG9yQ29tbWFuZC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTQzNCw3ICs0MzQsMTQgQEAgc3RhdGljIGJvb2wgZXhlY3V0
ZUZvcm1hdEJsb2NrKEZyYW1lKiBmcgogICAgICAgICB0YWdOYW1lID0gdGFnTmFtZS5zdWJzdHJp
bmcoMSwgdGFnTmFtZS5sZW5ndGgoKSAtIDIpOwogICAgIGlmICghdmFsaWRCbG9ja1RhZyh0YWdO
YW1lKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGFwcGx5Q29tbWFuZChGb3JtYXRCbG9j
a0NvbW1hbmQ6OmNyZWF0ZShmcmFtZS0+ZG9jdW1lbnQoKSwgdGFnTmFtZSkpOworCisgICAgRXhj
ZXB0aW9uQ29kZSBlYzsKKyAgICBTdHJpbmcgbG9jYWxOYW1lLCBwcmVmaXg7CisgICAgaWYgKCFE
b2N1bWVudDo6cGFyc2VRdWFsaWZpZWROYW1lKHRhZ05hbWUsIHByZWZpeCwgbG9jYWxOYW1lLCBl
YykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVk
VGFnTmFtZShwcmVmaXgsIGxvY2FsTmFtZSwgeGh0bWxOYW1lc3BhY2VVUkkpOworICAgIGFwcGx5
Q29tbWFuZChGb3JtYXRCbG9ja0NvbW1hbmQ6OmNyZWF0ZShmcmFtZS0+ZG9jdW1lbnQoKSwgcXVh
bGlmaWVkVGFnTmFtZSkpOwogICAgIHJldHVybiB0cnVlOwogfQogCkluZGV4OiBXZWJDb3JlL2Vk
aXRpbmcvRm9ybWF0QmxvY2tDb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2VkaXRp
bmcvRm9ybWF0QmxvY2tDb21tYW5kLmNwcAkocmV2aXNpb24gNjg2NzUpCisrKyBXZWJDb3JlL2Vk
aXRpbmcvRm9ybWF0QmxvY2tDb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsMTMgKzMw
LDE1IEBACiAjaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKICNpbmNsdWRlICJIVE1MRWxlbWVudC5o
IgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIlRleHQuaCIKKyNpbmNsdWRlICJU
ZXh0SXRlcmF0b3IuaCIKICNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAogdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAotRm9ybWF0QmxvY2tDb21t
YW5kOjpGb3JtYXRCbG9ja0NvbW1hbmQoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBBdG9taWNT
dHJpbmcmIHRhZ05hbWUpIAorRm9ybWF0QmxvY2tDb21tYW5kOjpGb3JtYXRCbG9ja0NvbW1hbmQo
RG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lKSAKICAgICA6
IENvbXBvc2l0ZUVkaXRDb21tYW5kKGRvY3VtZW50KSwgbV90YWdOYW1lKHRhZ05hbWUpCiB7CiB9
CkBAIC00NSw3ICs0Nyw3IEBAIHZvaWQgRm9ybWF0QmxvY2tDb21tYW5kOjpkb0FwcGx5KCkKIHsK
ICAgICBpZiAoIWVuZGluZ1NlbGVjdGlvbigpLmlzTm9uT3JwaGFuZWRDYXJldE9yUmFuZ2UoKSkK
ICAgICAgICAgcmV0dXJuOwotICAgIAorCiAgICAgaWYgKCFlbmRpbmdTZWxlY3Rpb24oKS5yb290
RWRpdGFibGVFbGVtZW50KCkpCiAgICAgICAgIHJldHVybjsKIApAQCAtNTksNDMgKzYxLDkwIEBA
IHZvaWQgRm9ybWF0QmxvY2tDb21tYW5kOjpkb0FwcGx5KCkKICAgICAvLyBGSVhNRTogV2UgcGFp
bnQgdGhlIGdhcCBiZWZvcmUgc29tZSBwYXJhZ3JhcGhzIHRoYXQgYXJlIGluZGVudGVkIHdpdGgg
bGVmdCAKICAgICAvLyBtYXJnaW4vcGFkZGluZywgYnV0IG5vdCBvdGhlcnMuICBXZSBzaG91bGQg
bWFrZSB0aGUgZ2FwIHBhaW50aW5nIG1vcmUgY29uc2lzdGVudCBhbmQgCiAgICAgLy8gdGhlbiB1
c2UgYSBsZWZ0IG1hcmdpbi9wYWRkaW5nIHJ1bGUgaGVyZS4KLSAgICBpZiAodmlzaWJsZUVuZCAh
PSB2aXNpYmxlU3RhcnQgJiYgaXNTdGFydE9mUGFyYWdyYXBoKHZpc2libGVFbmQpKSB7CisgICAg
aWYgKHZpc2libGVFbmQgIT0gdmlzaWJsZVN0YXJ0ICYmIGlzU3RhcnRPZlBhcmFncmFwaCh2aXNp
YmxlRW5kKSkKICAgICAgICAgc2V0RW5kaW5nU2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24odmlz
aWJsZVN0YXJ0LCB2aXNpYmxlRW5kLnByZXZpb3VzKHRydWUpKSk7Ci0gICAgICAgIHZpc2libGVF
bmQgPSBlbmRpbmdTZWxlY3Rpb24oKS52aXNpYmxlRW5kKCk7Ci0gICAgfQogCi0gICAgVmlzaWJs
ZVBvc2l0aW9uIHN0YXJ0T2ZMYXN0UGFyYWdyYXBoID0gc3RhcnRPZlBhcmFncmFwaCh2aXNpYmxl
RW5kKTsKLSAgICBpZiAoZW5kaW5nU2VsZWN0aW9uKCkuaXNDYXJldCgpIHx8IHN0YXJ0T2ZQYXJh
Z3JhcGgodmlzaWJsZVN0YXJ0KSA9PSBzdGFydE9mTGFzdFBhcmFncmFwaCkgewotICAgICAgICBk
b0FwcGx5Rm9yU2luZ2xlUGFyYWdyYXBoKCk7CisgICAgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rp
b24gPSBzZWxlY3Rpb25Gb3JQYXJhZ3JhcGhJdGVyYXRpb24oZW5kaW5nU2VsZWN0aW9uKCkpOwor
ICAgIFZpc2libGVQb3NpdGlvbiBzdGFydE9mU2VsZWN0aW9uID0gc2VsZWN0aW9uLnZpc2libGVT
dGFydCgpOworICAgIFZpc2libGVQb3NpdGlvbiBlbmRPZlNlbGVjdGlvbiA9IHNlbGVjdGlvbi52
aXNpYmxlRW5kKCk7CisKKyAgICBpbnQgc3RhcnRJbmRleCA9IGluZGV4Rm9yVmlzaWJsZVBvc2l0
aW9uKHN0YXJ0T2ZTZWxlY3Rpb24pOworICAgIGludCBlbmRJbmRleCA9IGluZGV4Rm9yVmlzaWJs
ZVBvc2l0aW9uKGVuZE9mU2VsZWN0aW9uKTsKKyAgICBBU1NFUlQoIXN0YXJ0T2ZTZWxlY3Rpb24u
aXNOdWxsKCkpOworICAgIEFTU0VSVCghZW5kT2ZTZWxlY3Rpb24uaXNOdWxsKCkpOworCisgICAg
Zm9ybWF0U2VsZWN0aW9uKHN0YXJ0T2ZTZWxlY3Rpb24sIGVuZE9mU2VsZWN0aW9uKTsKKworICAg
IHVwZGF0ZUxheW91dCgpOworCisgICAgUmVmUHRyPFJhbmdlPiBzdGFydFJhbmdlID0gVGV4dEl0
ZXJhdG9yOjpyYW5nZUZyb21Mb2NhdGlvbkFuZExlbmd0aChkb2N1bWVudCgpLT5kb2N1bWVudEVs
ZW1lbnQoKSwgc3RhcnRJbmRleCwgMCwgdHJ1ZSk7CisgICAgUmVmUHRyPFJhbmdlPiBlbmRSYW5n
ZSA9IFRleHRJdGVyYXRvcjo6cmFuZ2VGcm9tTG9jYXRpb25BbmRMZW5ndGgoZG9jdW1lbnQoKS0+
ZG9jdW1lbnRFbGVtZW50KCksIGVuZEluZGV4LCAwLCB0cnVlKTsKKyAgICBpZiAoc3RhcnRSYW5n
ZSAmJiBlbmRSYW5nZSkKKyAgICAgICAgc2V0RW5kaW5nU2VsZWN0aW9uKFZpc2libGVTZWxlY3Rp
b24oc3RhcnRSYW5nZS0+c3RhcnRQb3NpdGlvbigpLCBlbmRSYW5nZS0+c3RhcnRQb3NpdGlvbigp
LCBET1dOU1RSRUFNKSk7Cit9CisKK3ZvaWQgRm9ybWF0QmxvY2tDb21tYW5kOjpmb3JtYXRTZWxl
Y3Rpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBzdGFydE9mU2VsZWN0aW9uLCBjb25zdCBWaXNp
YmxlUG9zaXRpb24mIGVuZE9mU2VsZWN0aW9uKQoreworICAgIC8vIFNwZWNpYWwgY2FzZSBlbXB0
eSB1bnNwbGl0dGFibGUgZWxlbWVudHMgYmVjYXVzZSB0aGVyZSdzIG5vdGhpbmcgdG8gc3BsaXQK
KyAgICAvLyBhbmQgdGhlcmUncyBub3RoaW5nIHRvIG1vdmUuCisgICAgUG9zaXRpb24gc3RhcnQg
PSBzdGFydE9mU2VsZWN0aW9uLmRlZXBFcXVpdmFsZW50KCkuZG93bnN0cmVhbSgpOworICAgIGlm
IChpc0F0VW5zcGxpdHRhYmxlRWxlbWVudChzdGFydCkpIHsKKyAgICAgICAgUmVmUHRyPEVsZW1l
bnQ+IGJsb2NrTm9kZSA9IGNyZWF0ZUJsb2NrRWxlbWVudCgpOworICAgICAgICBpbnNlcnROb2Rl
QXQoYmxvY2tOb2RlLCBzdGFydCk7CisgICAgICAgIFJlZlB0cjxFbGVtZW50PiBwbGFjZWhvbGRl
ciA9IGNyZWF0ZUJyZWFrRWxlbWVudChkb2N1bWVudCgpKTsKKyAgICAgICAgYXBwZW5kTm9kZShw
bGFjZWhvbGRlciwgYmxvY2tOb2RlKTsKKyAgICAgICAgc2V0RW5kaW5nU2VsZWN0aW9uKFZpc2li
bGVTZWxlY3Rpb24oUG9zaXRpb24ocGxhY2Vob2xkZXIuZ2V0KCksIDApLCBET1dOU1RSRUFNKSk7
CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzZXRFbmRpbmdTZWxlY3Rpb24odmlzaWJs
ZVN0YXJ0KTsKLSAgICBkb0FwcGx5Rm9yU2luZ2xlUGFyYWdyYXBoKCk7Ci0gICAgdmlzaWJsZVN0
YXJ0ID0gZW5kaW5nU2VsZWN0aW9uKCkudmlzaWJsZVN0YXJ0KCk7Ci0gICAgVmlzaWJsZVBvc2l0
aW9uIG5leHRQYXJhZ3JhcGggPSBlbmRPZlBhcmFncmFwaCh2aXNpYmxlU3RhcnQpLm5leHQoKTsK
LSAgICB3aGlsZSAobmV4dFBhcmFncmFwaC5pc05vdE51bGwoKSAmJiBuZXh0UGFyYWdyYXBoICE9
IHN0YXJ0T2ZMYXN0UGFyYWdyYXBoKSB7Ci0gICAgICAgIHNldEVuZGluZ1NlbGVjdGlvbihuZXh0
UGFyYWdyYXBoKTsKLSAgICAgICAgZG9BcHBseUZvclNpbmdsZVBhcmFncmFwaCgpOwotICAgICAg
ICBuZXh0UGFyYWdyYXBoID0gZW5kT2ZQYXJhZ3JhcGgoZW5kaW5nU2VsZWN0aW9uKCkudmlzaWJs
ZVN0YXJ0KCkpLm5leHQoKTsKLSAgICB9Ci0gICAgc2V0RW5kaW5nU2VsZWN0aW9uKHZpc2libGVF
bmQpOwotICAgIGRvQXBwbHlGb3JTaW5nbGVQYXJhZ3JhcGgoKTsKLSAgICB2aXNpYmxlRW5kID0g
ZW5kaW5nU2VsZWN0aW9uKCkudmlzaWJsZUVuZCgpOwotCi0gICAgc2V0RW5kaW5nU2VsZWN0aW9u
KFZpc2libGVTZWxlY3Rpb24odmlzaWJsZVN0YXJ0LmRlZXBFcXVpdmFsZW50KCksIHZpc2libGVF
bmQuZGVlcEVxdWl2YWxlbnQoKSwgRE9XTlNUUkVBTSkpOwotfQotCi12b2lkIEZvcm1hdEJsb2Nr
Q29tbWFuZDo6ZG9BcHBseUZvclNpbmdsZVBhcmFncmFwaCgpCi17Ci0gICAgRXhjZXB0aW9uQ29k
ZSBlYzsKLSAgICBTdHJpbmcgbG9jYWxOYW1lLCBwcmVmaXg7Ci0gICAgaWYgKCFEb2N1bWVudDo6
cGFyc2VRdWFsaWZpZWROYW1lKG1fdGFnTmFtZSwgcHJlZml4LCBsb2NhbE5hbWUsIGVjKSkKLSAg
ICAgICAgcmV0dXJuOwotICAgIFF1YWxpZmllZE5hbWUgcVR5cGVPZkJsb2NrKHByZWZpeCwgbG9j
YWxOYW1lLCB4aHRtbE5hbWVzcGFjZVVSSSk7CisgICAgVmlzaWJsZVBvc2l0aW9uIGVuZE9mQ3Vy
cmVudFBhcmFncmFwaCA9IGVuZE9mUGFyYWdyYXBoKHN0YXJ0T2ZTZWxlY3Rpb24pOworICAgIFZp
c2libGVQb3NpdGlvbiBlbmRBZnRlclNlbGVjdGlvbiA9IGVuZE9mUGFyYWdyYXBoKGVuZE9mUGFy
YWdyYXBoKGVuZE9mU2VsZWN0aW9uKS5uZXh0KCkpOworICAgIGludCBlbmRPZkN1cnJlbnRQYXJh
Z3JhcGhJbmRleCA9IGluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uKGVuZE9mQ3VycmVudFBhcmFncmFw
aCk7CisgICAgaW50IGVuZEFmdGVyU2VsZWN0aW9uSW5kZXggPSBpbmRleEZvclZpc2libGVQb3Np
dGlvbihlbmRBZnRlclNlbGVjdGlvbik7CisKKyAgICAvLyBXaGVuIGluZGVudGluZyB3aXRoaW4g
YSA8cHJlPiB0YWcsIHdlIG5lZWQgdG8gc3BsaXQgZWFjaCBwYXJhZ3JhcGggaW50byBhIHNlcGFy
YXRlIG5vZGUgZm9yIG1vdmVQYXJhZ3JhcGhXaXRoQ2xvbmVzIHRvIHdvcmsuCisgICAgLy8gSG93
ZXZlciwgc3BsaXR0aW5nIHRleHQgbm9kZXMgY2FuIGNhdXNlIGVuZE9mQ3VycmVudFBhcmFncmFw
aCBhbmQgZW5kQWZ0ZXJTZWxlY3Rpb24gdG8gcG9pbnQgdG8gYW4gaW52YWxpZCBwb3NpdGlvbiBp
ZiB3ZQorICAgIC8vIGNoYW5nZWQgdGhlIHRleHQgbm9kZSBpdCB3YXMgcG9pbnRpbmcgYXQuICBT
byB3ZSBoYXZlIHRvIHJlc2V0IHRoZXNlIHBvc2l0aW9ucy4KKyAgICBpbnQgbnVtUGFyYWdyYXBo
cyA9IGNvdW50UGFyYWdyYXBocyhlbmRPZkN1cnJlbnRQYXJhZ3JhcGgsIGVuZEFmdGVyU2VsZWN0
aW9uKTsKKyAgICBpZiAoc3BsaXRUZXh0Tm9kZXMoc3RhcnRPZlBhcmFncmFwaChzdGFydE9mU2Vs
ZWN0aW9uKSwgbnVtUGFyYWdyYXBocyArIDEpKSB7CisgICAgICAgIFJlZlB0cjxSYW5nZT4gZW5k
T2ZDdXJyZW50UGFyYWdyYXBoUmFuZ2UgPSBUZXh0SXRlcmF0b3I6OnJhbmdlRnJvbUxvY2F0aW9u
QW5kTGVuZ3RoKGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpLCBlbmRPZkN1cnJlbnRQYXJh
Z3JhcGhJbmRleCwgMCwgdHJ1ZSk7CisgICAgICAgIFJlZlB0cjxSYW5nZT4gZW5kQWZ0ZXJTZWxl
Y3Rpb25SYW5nZSA9IFRleHRJdGVyYXRvcjo6cmFuZ2VGcm9tTG9jYXRpb25BbmRMZW5ndGgoZG9j
dW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCksIGVuZEFmdGVyU2VsZWN0aW9uSW5kZXgsIDAsIHRy
dWUpOworICAgICAgICBpZiAoIWVuZE9mQ3VycmVudFBhcmFncmFwaFJhbmdlLmdldCgpIHx8ICFl
bmRBZnRlclNlbGVjdGlvblJhbmdlLmdldCgpKSB7CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBlbmRPZkN1
cnJlbnRQYXJhZ3JhcGggPSBWaXNpYmxlUG9zaXRpb24oZW5kT2ZDdXJyZW50UGFyYWdyYXBoUmFu
Z2UtPnN0YXJ0UG9zaXRpb24oKSwgRE9XTlNUUkVBTSk7CisgICAgICAgIGVuZEFmdGVyU2VsZWN0
aW9uID0gVmlzaWJsZVBvc2l0aW9uKGVuZEFmdGVyU2VsZWN0aW9uUmFuZ2UtPnN0YXJ0UG9zaXRp
b24oKSwgRE9XTlNUUkVBTSk7CisgICAgfQorCisgICAgUmVmUHRyPEVsZW1lbnQ+IGJsb2NrTm9k
ZTsKKyAgICB3aGlsZSAoZW5kT2ZDdXJyZW50UGFyYWdyYXBoICE9IGVuZEFmdGVyU2VsZWN0aW9u
KSB7CisgICAgICAgIC8vIEl0ZXJhdGUgYWNyb3NzIHRoZSBzZWxlY3RlZCBwYXJhZ3JhcGhzLi4u
CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBlbmRPZk5leHRQYXJhZ3JhcGggPSBlbmRPZlBhcmFn
cmFwaChlbmRPZkN1cnJlbnRQYXJhZ3JhcGgubmV4dCgpKTsKKworICAgICAgICBmb3JtYXRQYXJh
Z3JhcGgoZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBlbmRPZk5leHRQYXJhZ3JhcGgsIGJsb2NrTm9k
ZSk7CisKKyAgICAgICAgLy8gZm9ybWF0UGFyYWdyYXBoIGNvdWxkIG1vdmUgbW9yZSB0aGFuIG9u
ZSBwYXJhZ3JhcGggaWYgdGhlIHBhcmFncmFwaAorICAgICAgICAvLyBpcyBpbiBhIGxpc3QgaXRl
bSBvciBhIHRhYmxlLiBBcyBhIHJlc3VsdCwgZW5kQWZ0ZXJTZWxlY3Rpb24gY291bGQgcmVmZXIg
dG8gYSBwb3NpdGlvbgorICAgICAgICAvLyBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50LgorICAg
ICAgICBpZiAoZW5kQWZ0ZXJTZWxlY3Rpb24uaXNOb3ROdWxsKCkgJiYgIWVuZEFmdGVyU2VsZWN0
aW9uLmRlZXBFcXVpdmFsZW50KCkubm9kZSgpLT5pbkRvY3VtZW50KCkpCisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBNYWtlIHN1cmUgb3VyIG1vdmVQYXJhZ3Jh
cGggY2FsbHMgZGlkbid0IHJlbW92ZSBlbmRPZk5leHRQYXJhZ3JhcGguZGVlcEVxdWl2YWxlbnQo
KS5ub2RlKCkKKyAgICAgICAgLy8gSWYgc29tZWhvdyB3ZSBkaWQsIHJldHVybiB0byBwcmV2ZW50
IGNyYXNoZXMuCisgICAgICAgIGlmIChlbmRPZk5leHRQYXJhZ3JhcGguaXNOb3ROdWxsKCkgJiYg
IWVuZE9mTmV4dFBhcmFncmFwaC5kZWVwRXF1aXZhbGVudCgpLm5vZGUoKS0+aW5Eb2N1bWVudCgp
KSB7CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgICBlbmRPZkN1cnJlbnRQYXJhZ3JhcGggPSBlbmRPZk5leHRQ
YXJhZ3JhcGg7CisgICAgfQorfQorCit2b2lkIEZvcm1hdEJsb2NrQ29tbWFuZDo6Zm9ybWF0UGFy
YWdyYXBoKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBjb25z
dCBWaXNpYmxlUG9zaXRpb24mLCBSZWZQdHI8RWxlbWVudD4mKQoreworICAgIHNldEVuZGluZ1Nl
bGVjdGlvbihlbmRPZkN1cnJlbnRQYXJhZ3JhcGgpOwogCiAgICAgTm9kZSogcmVmTm9kZSA9IGVu
Y2xvc2luZ0Jsb2NrRmxvd0VsZW1lbnQoZW5kaW5nU2VsZWN0aW9uKCkudmlzaWJsZVN0YXJ0KCkp
OwotICAgIGlmIChyZWZOb2RlLT5oYXNUYWdOYW1lKHFUeXBlT2ZCbG9jaykpCisgICAgaWYgKHJl
Zk5vZGUtPmhhc1RhZ05hbWUobV90YWdOYW1lKSkKICAgICAgICAgLy8gV2UncmUgYWxyZWFkeSBp
biBhIGJsb2NrIHdpdGggdGhlIGZvcm1hdCB3ZSB3YW50LCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRv
IGFueXRoaW5nCiAgICAgICAgIHJldHVybjsKIApAQCAtMTI3LDQgKzE3Niw0OCBAQCB2b2lkIEZv
cm1hdEJsb2NrQ29tbWFuZDo6ZG9BcHBseUZvclNpbmdsCiAgICAgbW92ZVBhcmFncmFwaChwYXJh
Z3JhcGhTdGFydCwgcGFyYWdyYXBoRW5kLCBkZXN0aW5hdGlvbiwgdHJ1ZSwgZmFsc2UpOwogfQog
CitQYXNzUmVmUHRyPEhUTUxFbGVtZW50PiBGb3JtYXRCbG9ja0NvbW1hbmQ6OmNyZWF0ZUJsb2Nr
RWxlbWVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNyZWF0ZUhUTUxFbGVtZW50KGRvY3VtZW50
KCksIG1fdGFnTmFtZSk7Cit9CisgICAgCisvLyBUaGlzIGZ1bmN0aW9uIGNhbiByZXR1cm4gLTEg
aWYgd2UgYXJlIHVuYWJsZSB0byBjb3VudCB0aGUgcGFyYWdyYXBocyBiZXR3ZWVuIHxzdGFydHwg
YW5kIHxlbmR8LgoraW50IEZvcm1hdEJsb2NrQ29tbWFuZDo6Y291bnRQYXJhZ3JhcGhzKGNvbnN0
IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZGaXJzdFBhcmFncmFwaCwgY29uc3QgVmlzaWJsZVBvc2l0
aW9uJiBlbmRPZkxhc3RQYXJhZ3JhcGgpIGNvbnN0Cit7CisgICAgaW50IGNvdW50ID0gMDsKKyAg
ICBWaXNpYmxlUG9zaXRpb24gY3VyID0gZW5kT2ZGaXJzdFBhcmFncmFwaDsKKyAgICB3aGlsZSAo
Y3VyICE9IGVuZE9mTGFzdFBhcmFncmFwaCkgeworICAgICAgICArK2NvdW50OworICAgICAgICBj
dXIgPSBlbmRPZlBhcmFncmFwaChjdXIubmV4dCgpKTsKKyAgICAgICAgLy8gSWYgc3RhcnQgaXMg
YmVmb3JlIGEgdGFibGUgYW5kIGVuZCBpcyBpbnNpZGUgYSB0YWJsZSwgd2Ugd2lsbCBuZXZlciBo
aXQgZW5kIGJlY2F1c2UgdGhlCisgICAgICAgIC8vIHdob2xlIHRhYmxlIGlzIGNvbnNpZGVyZWQg
YSBzaW5nbGUgcGFyYWdyYXBoLgorICAgICAgICBpZiAoY3VyLmlzTnVsbCgpKQorICAgICAgICAg
ICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8vIFJldHVybnMg
dHJ1ZSBpZiBhdCBsZWFzdCBvbmUgdGV4dCBub2RlIHdhcyBzcGxpdC4KK2Jvb2wgRm9ybWF0Qmxv
Y2tDb21tYW5kOjpzcGxpdFRleHROb2Rlcyhjb25zdCBWaXNpYmxlUG9zaXRpb24mIHN0YXJ0LCBp
bnQgbnVtUGFyYWdyYXBocykKK3sKKyAgICBWaXNpYmxlUG9zaXRpb24gY3VycmVudFBhcmFncmFw
aFN0YXJ0ID0gc3RhcnQ7CisgICAgYm9vbCBoYXNTcGxpdCA9IGZhbHNlOworICAgIGludCBwYXJh
Z3JhcGhDb3VudDsKKyAgICBmb3IgKHBhcmFncmFwaENvdW50ID0gMDsgcGFyYWdyYXBoQ291bnQg
PCBudW1QYXJhZ3JhcGhzOyArK3BhcmFncmFwaENvdW50KSB7CisgICAgICAgIC8vIElmIHRoZXJl
IGFyZSBtdWx0aXBsZSBwYXJhZ3JhcGhzIGluIGEgc2luZ2xlIHRleHQgbm9kZSwgd2Ugc3BsaXQg
dGhlIHRleHQgbm9kZSBpbnRvIGEgc2VwYXJhdGUgbm9kZSBmb3IgZWFjaCBwYXJhZ3JhcGguCisg
ICAgICAgIGlmIChjdXJyZW50UGFyYWdyYXBoU3RhcnQuZGVlcEVxdWl2YWxlbnQoKS5ub2RlKCkt
PmlzVGV4dE5vZGUoKSAmJiBjdXJyZW50UGFyYWdyYXBoU3RhcnQuZGVlcEVxdWl2YWxlbnQoKS5u
b2RlKCkgPT0gc3RhcnRPZlBhcmFncmFwaChjdXJyZW50UGFyYWdyYXBoU3RhcnQucHJldmlvdXMo
KSkuZGVlcEVxdWl2YWxlbnQoKS5ub2RlKCkpIHsKKyAgICAgICAgICAgIFRleHQqIHRleHROb2Rl
ID0gc3RhdGljX2Nhc3Q8VGV4dCAqPihjdXJyZW50UGFyYWdyYXBoU3RhcnQuZGVlcEVxdWl2YWxl
bnQoKS5ub2RlKCkpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IGN1cnJlbnRQYXJhZ3JhcGhT
dGFydC5kZWVwRXF1aXZhbGVudCgpLm9mZnNldEluQ29udGFpbmVyTm9kZSgpOworICAgICAgICAg
ICAgc3BsaXRUZXh0Tm9kZSh0ZXh0Tm9kZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGN1cnJlbnRQ
YXJhZ3JhcGhTdGFydCA9IFZpc2libGVQb3NpdGlvbih0ZXh0Tm9kZSwgMCwgVlBfREVGQVVMVF9B
RkZJTklUWSk7CisgICAgICAgICAgICBoYXNTcGxpdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAg
ICAgVmlzaWJsZVBvc2l0aW9uIG5leHRQYXJhZ3JhcGggPSBzdGFydE9mUGFyYWdyYXBoKGVuZE9m
UGFyYWdyYXBoKGN1cnJlbnRQYXJhZ3JhcGhTdGFydCkubmV4dCgpKTsKKyAgICAgICAgaWYgKG5l
eHRQYXJhZ3JhcGguaXNOdWxsKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY3VycmVu
dFBhcmFncmFwaFN0YXJ0ID0gbmV4dFBhcmFncmFwaDsKKyAgICB9CisgICAgcmV0dXJuIGhhc1Nw
bGl0OworfQorCiB9CkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvRm9ybWF0QmxvY2tDb21tYW5kLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL0Zvcm1hdEJsb2NrQ29tbWFuZC5oCShyZXZp
c2lvbiA2ODY3NSkKKysrIFdlYkNvcmUvZWRpdGluZy9Gb3JtYXRCbG9ja0NvbW1hbmQuaAkod29y
a2luZyBjb3B5KQpAQCAtMzIsMTkgKzMyLDI1IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xh
c3MgRm9ybWF0QmxvY2tDb21tYW5kIDogcHVibGljIENvbXBvc2l0ZUVkaXRDb21tYW5kIHsKIHB1
YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxGb3JtYXRCbG9ja0NvbW1hbmQ+IGNyZWF0ZShE
b2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IEF0b21pY1N0cmluZyYgdGFnTmFtZSkKKyAgICBzdGF0
aWMgUGFzc1JlZlB0cjxGb3JtYXRCbG9ja0NvbW1hbmQ+IGNyZWF0ZShEb2N1bWVudCogZG9jdW1l
bnQsIGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUpCiAgICAgewogICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IEZvcm1hdEJsb2NrQ29tbWFuZChkb2N1bWVudCwgdGFnTmFtZSkpOwogICAg
IH0KIAotcHJpdmF0ZToKLSAgICBGb3JtYXRCbG9ja0NvbW1hbmQoRG9jdW1lbnQqLCBjb25zdCBB
dG9taWNTdHJpbmcmIHRhZ05hbWUpOworcHJvdGVjdGVkOgorICAgIEZvcm1hdEJsb2NrQ29tbWFu
ZChEb2N1bWVudCosIGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUpOwogCiAgICAgdmlydHVh
bCB2b2lkIGRvQXBwbHkoKTsKLSAgICB2b2lkIGRvQXBwbHlGb3JTaW5nbGVQYXJhZ3JhcGgoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgZm9ybWF0U2VsZWN0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYg
c3RhcnRPZlNlbGVjdGlvbiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRPZlNlbGVjdGlvbik7
CisgICAgdmlydHVhbCB2b2lkIGZvcm1hdFBhcmFncmFwaChjb25zdCBWaXNpYmxlUG9zaXRpb24m
IGVuZE9mQ3VycmVudFBhcmFncmFwaCwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiwgUmVmUHRyPEVs
ZW1lbnQ+Jik7CiAgICAgdmlydHVhbCBFZGl0QWN0aW9uIGVkaXRpbmdBY3Rpb24oKSBjb25zdCB7
IHJldHVybiBFZGl0QWN0aW9uRm9ybWF0QmxvY2s7IH0KIAotICAgIEF0b21pY1N0cmluZyBtX3Rh
Z05hbWU7CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPEhUTUxFbGVtZW50PiBjcmVhdGVCbG9ja0Vs
ZW1lbnQoKSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZm9yIHByZQorICAgIGludCBjb3VudFBhcmFn
cmFwaHMoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRPZkZpcnN0UGFyYWdyYXBoLCBjb25zdCBW
aXNpYmxlUG9zaXRpb24mIGVuZE9mTGFzdFBhcmFncmFwaCkgY29uc3Q7CisgICAgYm9vbCBzcGxp
dFRleHROb2Rlcyhjb25zdCBWaXNpYmxlUG9zaXRpb24mIHN0YXJ0LCBpbnQgbnVtUGFyYWdyYXBo
cyk7CisKKyAgICBRdWFsaWZpZWROYW1lIG1fdGFnTmFtZTsKIH07CiAKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvZWRpdGluZy9JbmRlbnRPdXRkZW50Q29tbWFuZC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL0luZGVudE91dGRlbnRDb21tYW5kLmNwcAko
cmV2aXNpb24gNjg2NzUpCisrKyBXZWJDb3JlL2VkaXRpbmcvSW5kZW50T3V0ZGVudENvbW1hbmQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MCwzOCArNTAsMzggQEAgc3RhdGljIFN0cmluZyBpbmRl
bnRCbG9ja3F1b3RlU3RyaW5nKCkKICAgICByZXR1cm4gc3RyaW5nOwogfQogCi1zdGF0aWMgUGFz
c1JlZlB0cjxIVE1MQmxvY2txdW90ZUVsZW1lbnQ+IGNyZWF0ZUluZGVudEJsb2NrcXVvdGVFbGVt
ZW50KERvY3VtZW50KiBkb2N1bWVudCkKK3N0YXRpYyBib29sIGlzTGlzdE9ySW5kZW50QmxvY2tx
dW90ZShjb25zdCBOb2RlKiBub2RlKQogewotICAgIFJlZlB0cjxIVE1MQmxvY2txdW90ZUVsZW1l
bnQ+IGVsZW1lbnQgPSBIVE1MQmxvY2txdW90ZUVsZW1lbnQ6OmNyZWF0ZShkb2N1bWVudCk7Ci0g
ICAgZWxlbWVudC0+c2V0QXR0cmlidXRlKGNsYXNzQXR0ciwgaW5kZW50QmxvY2txdW90ZVN0cmlu
ZygpKTsKLSAgICBlbGVtZW50LT5zZXRBdHRyaWJ1dGUoc3R5bGVBdHRyLCAibWFyZ2luOiAwIDAg
MCA0MHB4OyBib3JkZXI6IG5vbmU7IHBhZGRpbmc6IDBweDsiKTsKLSAgICByZXR1cm4gZWxlbWVu
dC5yZWxlYXNlKCk7CisgICAgcmV0dXJuIG5vZGUgJiYgKG5vZGUtPmhhc1RhZ05hbWUodWxUYWcp
IHx8IG5vZGUtPmhhc1RhZ05hbWUob2xUYWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUoYmxvY2txdW90
ZVRhZykpOwogfQogCi1zdGF0aWMgYm9vbCBpc0xpc3RPckluZGVudEJsb2NrcXVvdGUoY29uc3Qg
Tm9kZSogbm9kZSkKK0luZGVudE91dGRlbnRDb21tYW5kOjpJbmRlbnRPdXRkZW50Q29tbWFuZChE
b2N1bWVudCogZG9jdW1lbnQsIEVJbmRlbnRUeXBlIHR5cGVPZkFjdGlvbiwgaW50IG1hcmdpbklu
UGl4ZWxzKQorICAgIDogRm9ybWF0QmxvY2tDb21tYW5kKGRvY3VtZW50LCBibG9ja3F1b3RlVGFn
KSwgbV90eXBlT2ZBY3Rpb24odHlwZU9mQWN0aW9uKSwgbV9tYXJnaW5JblBpeGVscyhtYXJnaW5J
blBpeGVscykKIHsKLSAgICByZXR1cm4gbm9kZSAmJiAobm9kZS0+aGFzVGFnTmFtZSh1bFRhZykg
fHwgbm9kZS0+aGFzVGFnTmFtZShvbFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZShibG9ja3F1b3Rl
VGFnKSk7CiB9CiAKLS8vIFRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiAtMSBpZiB3ZSBhcmUgdW5h
YmxlIHRvIGNvdW50IHRoZSBwYXJhZ3JhcGhzIGJldHdlZW4gfHN0YXJ0fCBhbmQgfGVuZHwuCi1z
dGF0aWMgaW50IGNvdW50UGFyYWdyYXBocyhjb25zdCBWaXNpYmxlUG9zaXRpb24mIGVuZE9mRmly
c3RQYXJhZ3JhcGgsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZMYXN0UGFyYWdyYXBoKQor
dm9pZCBJbmRlbnRPdXRkZW50Q29tbWFuZDo6Zm9ybWF0U2VsZWN0aW9uKGNvbnN0IFZpc2libGVQ
b3NpdGlvbiYgc3RhcnRPZlNlbGVjdGlvbiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRPZlNl
bGVjdGlvbikKIHsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIFZpc2libGVQb3NpdGlvbiBjdXIg
PSBlbmRPZkZpcnN0UGFyYWdyYXBoOwotICAgIHdoaWxlIChjdXIgIT0gZW5kT2ZMYXN0UGFyYWdy
YXBoKSB7Ci0gICAgICAgICsrY291bnQ7Ci0gICAgICAgIGN1ciA9IGVuZE9mUGFyYWdyYXBoKGN1
ci5uZXh0KCkpOwotICAgICAgICAvLyBJZiBzdGFydCBpcyBiZWZvcmUgYSB0YWJsZSBhbmQgZW5k
IGlzIGluc2lkZSBhIHRhYmxlLCB3ZSB3aWxsIG5ldmVyIGhpdCBlbmQgYmVjYXVzZSB0aGUKLSAg
ICAgICAgLy8gd2hvbGUgdGFibGUgaXMgY29uc2lkZXJlZCBhIHNpbmdsZSBwYXJhZ3JhcGguCi0g
ICAgICAgIGlmIChjdXIuaXNOdWxsKCkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQot
ICAgIHJldHVybiBjb3VudDsKKyAgICBpZiAobV90eXBlT2ZBY3Rpb24gPT0gT3V0ZGVudCkKKyAg
ICAgICAgb3V0ZGVudFJlZ2lvbihzdGFydE9mU2VsZWN0aW9uLCBlbmRPZlNlbGVjdGlvbik7Cisg
ICAgZWxzZQorICAgICAgICBGb3JtYXRCbG9ja0NvbW1hbmQ6OmZvcm1hdFNlbGVjdGlvbihzdGFy
dE9mU2VsZWN0aW9uLCBlbmRPZlNlbGVjdGlvbik7CiB9CiAKLUluZGVudE91dGRlbnRDb21tYW5k
OjpJbmRlbnRPdXRkZW50Q29tbWFuZChEb2N1bWVudCogZG9jdW1lbnQsIEVJbmRlbnRUeXBlIHR5
cGVPZkFjdGlvbiwgaW50IG1hcmdpbkluUGl4ZWxzKQotICAgIDogQ29tcG9zaXRlRWRpdENvbW1h
bmQoZG9jdW1lbnQpLCBtX3R5cGVPZkFjdGlvbih0eXBlT2ZBY3Rpb24pLCBtX21hcmdpbkluUGl4
ZWxzKG1hcmdpbkluUGl4ZWxzKQordm9pZCBJbmRlbnRPdXRkZW50Q29tbWFuZDo6Zm9ybWF0UGFy
YWdyYXBoKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBjb25z
dCBWaXNpYmxlUG9zaXRpb24mIGVuZE9mTmV4dFBhcmFncmFwaCwgUmVmUHRyPEVsZW1lbnQ+JiBi
bG9ja3F1b3RlVG9Vc2UpCit7CisgICAgaWYgKHRyeUluZGVudGluZ0FzTGlzdEl0ZW0oZW5kT2ZD
dXJyZW50UGFyYWdyYXBoKSkKKyAgICAgICAgYmxvY2txdW90ZVRvVXNlID0gMDsKKyAgICBlbHNl
CisgICAgICAgIGluZGVudEludG9CbG9ja3F1b3RlKGVuZE9mQ3VycmVudFBhcmFncmFwaCwgZW5k
T2ZOZXh0UGFyYWdyYXBoLCBibG9ja3F1b3RlVG9Vc2UpOworfQorCitQYXNzUmVmUHRyPEhUTUxF
bGVtZW50PiBJbmRlbnRPdXRkZW50Q29tbWFuZDo6Y3JlYXRlQmxvY2tFbGVtZW50KCkgY29uc3QK
IHsKKyAgICBSZWZQdHI8SFRNTEJsb2NrcXVvdGVFbGVtZW50PiBlbGVtZW50ID0gSFRNTEJsb2Nr
cXVvdGVFbGVtZW50OjpjcmVhdGUoZG9jdW1lbnQoKSk7CisgICAgZWxlbWVudC0+c2V0QXR0cmli
dXRlKGNsYXNzQXR0ciwgaW5kZW50QmxvY2txdW90ZVN0cmluZygpKTsKKyAgICBlbGVtZW50LT5z
ZXRBdHRyaWJ1dGUoc3R5bGVBdHRyLCAibWFyZ2luOiAwIDAgMCA0MHB4OyBib3JkZXI6IG5vbmU7
IHBhZGRpbmc6IDBweDsiKTsKKyAgICByZXR1cm4gZWxlbWVudC5yZWxlYXNlKCk7CiB9CiAKIGJv
b2wgSW5kZW50T3V0ZGVudENvbW1hbmQ6OnRyeUluZGVudGluZ0FzTGlzdEl0ZW0oY29uc3QgVmlz
aWJsZVBvc2l0aW9uJiBlbmRPZkN1cnJlbnRQYXJhZ3JhcGgpCkBAIC0xMzUsNyArMTM1LDcgQEAg
dm9pZCBJbmRlbnRPdXRkZW50Q29tbWFuZDo6aW5kZW50SW50b0JsbwogICAgIGlmICghdGFyZ2V0
QmxvY2txdW90ZSkgewogICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYmxvY2txdW90ZSBhbmQgaW5z
ZXJ0IGl0IGFzIGEgY2hpbGQgb2YgdGhlIHJvb3QgZWRpdGFibGUgZWxlbWVudC4gV2UgYWNjb21w
bGlzaAogICAgICAgICAvLyB0aGlzIGJ5IHNwbGl0dGluZyBhbGwgcGFyZW50cyBvZiB0aGUgY3Vy
cmVudCBwYXJhZ3JhcGggdXAgdG8gdGhhdCBwb2ludC4KLSAgICAgICAgdGFyZ2V0QmxvY2txdW90
ZSA9IGNyZWF0ZUluZGVudEJsb2NrcXVvdGVFbGVtZW50KGRvY3VtZW50KCkpOworICAgICAgICB0
YXJnZXRCbG9ja3F1b3RlID0gY3JlYXRlQmxvY2tFbGVtZW50KCk7CiAgICAgICAgIGluc2VydE5v
ZGVCZWZvcmUodGFyZ2V0QmxvY2txdW90ZSwgb3V0ZXJCbG9jayk7CiAgICAgfQogCkBAIC0xNDcs
ODcgKzE0Nyw2IEBAIHZvaWQgSW5kZW50T3V0ZGVudENvbW1hbmQ6OmluZGVudEludG9CbG8KICAg
ICAgICAgdGFyZ2V0QmxvY2txdW90ZSA9IDA7CiB9CiAKLXZvaWQgSW5kZW50T3V0ZGVudENvbW1h
bmQ6OmluZGVudFJlZ2lvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHN0YXJ0T2ZTZWxlY3Rpb24s
IGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZTZWxlY3Rpb24pCi17Ci0gICAgLy8gU3BlY2lh
bCBjYXNlIGVtcHR5IHVuc3BsaXR0YWJsZSBlbGVtZW50cyBiZWNhdXNlIHRoZXJlJ3Mgbm90aGlu
ZyB0byBzcGxpdAotICAgIC8vIGFuZCB0aGVyZSdzIG5vdGhpbmcgdG8gbW92ZS4KLSAgICBQb3Np
dGlvbiBzdGFydCA9IHN0YXJ0T2ZTZWxlY3Rpb24uZGVlcEVxdWl2YWxlbnQoKS5kb3duc3RyZWFt
KCk7Ci0gICAgaWYgKGlzQXRVbnNwbGl0dGFibGVFbGVtZW50KHN0YXJ0KSkgewotICAgICAgICBS
ZWZQdHI8RWxlbWVudD4gYmxvY2txdW90ZSA9IGNyZWF0ZUluZGVudEJsb2NrcXVvdGVFbGVtZW50
KGRvY3VtZW50KCkpOwotICAgICAgICBpbnNlcnROb2RlQXQoYmxvY2txdW90ZSwgc3RhcnQpOwot
ICAgICAgICBSZWZQdHI8RWxlbWVudD4gcGxhY2Vob2xkZXIgPSBjcmVhdGVCcmVha0VsZW1lbnQo
ZG9jdW1lbnQoKSk7Ci0gICAgICAgIGFwcGVuZE5vZGUocGxhY2Vob2xkZXIsIGJsb2NrcXVvdGUp
OwotICAgICAgICBzZXRFbmRpbmdTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihQb3NpdGlvbihw
bGFjZWhvbGRlci5nZXQoKSwgMCksIERPV05TVFJFQU0pKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIFJlZlB0cjxFbGVtZW50PiBibG9ja3F1b3RlRm9yTmV4dEluZGVudDsKLSAgICBW
aXNpYmxlUG9zaXRpb24gZW5kT2ZDdXJyZW50UGFyYWdyYXBoID0gZW5kT2ZQYXJhZ3JhcGgoc3Rh
cnRPZlNlbGVjdGlvbik7Ci0gICAgVmlzaWJsZVBvc2l0aW9uIGVuZEFmdGVyU2VsZWN0aW9uID0g
ZW5kT2ZQYXJhZ3JhcGgoZW5kT2ZQYXJhZ3JhcGgoZW5kT2ZTZWxlY3Rpb24pLm5leHQoKSk7Ci0g
ICAgaW50IGVuZE9mQ3VycmVudFBhcmFncmFwaEluZGV4ID0gaW5kZXhGb3JWaXNpYmxlUG9zaXRp
b24oZW5kT2ZDdXJyZW50UGFyYWdyYXBoKTsKLSAgICBpbnQgZW5kQWZ0ZXJTZWxlY3Rpb25JbmRl
eCA9IGluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uKGVuZEFmdGVyU2VsZWN0aW9uKTsKLQotICAgIC8v
IFdoZW4gaW5kZW50aW5nIHdpdGhpbiBhIDxwcmU+IHRhZywgd2UgbmVlZCB0byBzcGxpdCBlYWNo
IHBhcmFncmFwaCBpbnRvIGEgc2VwYXJhdGUgbm9kZSBmb3IgbW92ZVBhcmFncmFwaFdpdGhDbG9u
ZXMgdG8gd29yay4KLSAgICAvLyBIb3dldmVyLCBzcGxpdHRpbmcgdGV4dCBub2RlcyBjYW4gY2F1
c2UgZW5kT2ZDdXJyZW50UGFyYWdyYXBoIGFuZCBlbmRBZnRlclNlbGVjdGlvbiB0byBwb2ludCB0
byBhbiBpbnZhbGlkIHBvc2l0aW9uIGlmIHdlCi0gICAgLy8gY2hhbmdlZCB0aGUgdGV4dCBub2Rl
IGl0IHdhcyBwb2ludGluZyBhdC4gIFNvIHdlIGhhdmUgdG8gcmVzZXQgdGhlc2UgcG9zaXRpb25z
LgotICAgIGludCBudW1QYXJhZ3JhcGhzID0gY291bnRQYXJhZ3JhcGhzKGVuZE9mQ3VycmVudFBh
cmFncmFwaCwgZW5kQWZ0ZXJTZWxlY3Rpb24pOwotICAgIGlmIChzcGxpdFRleHROb2RlcyhzdGFy
dE9mUGFyYWdyYXBoKHN0YXJ0T2ZTZWxlY3Rpb24pLCBudW1QYXJhZ3JhcGhzICsgMSkpIHsKLSAg
ICAgICAgUmVmUHRyPFJhbmdlPiBlbmRPZkN1cnJlbnRQYXJhZ3JhcGhSYW5nZSA9IFRleHRJdGVy
YXRvcjo6cmFuZ2VGcm9tTG9jYXRpb25BbmRMZW5ndGgoZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVt
ZW50KCksIGVuZE9mQ3VycmVudFBhcmFncmFwaEluZGV4LCAwLCB0cnVlKTsKLSAgICAgICAgUmVm
UHRyPFJhbmdlPiBlbmRBZnRlclNlbGVjdGlvblJhbmdlID0gVGV4dEl0ZXJhdG9yOjpyYW5nZUZy
b21Mb2NhdGlvbkFuZExlbmd0aChkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSwgZW5kQWZ0
ZXJTZWxlY3Rpb25JbmRleCwgMCwgdHJ1ZSk7Ci0gICAgICAgIGlmICghZW5kT2ZDdXJyZW50UGFy
YWdyYXBoUmFuZ2UuZ2V0KCkgfHwgIWVuZEFmdGVyU2VsZWN0aW9uUmFuZ2UuZ2V0KCkpIHsKLSAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci0gICAgICAgIGVuZE9mQ3VycmVudFBhcmFncmFwaCA9IFZpc2libGVQb3NpdGlvbihl
bmRPZkN1cnJlbnRQYXJhZ3JhcGhSYW5nZS0+c3RhcnRQb3NpdGlvbigpLCBET1dOU1RSRUFNKTsK
LSAgICAgICAgZW5kQWZ0ZXJTZWxlY3Rpb24gPSBWaXNpYmxlUG9zaXRpb24oZW5kQWZ0ZXJTZWxl
Y3Rpb25SYW5nZS0+c3RhcnRQb3NpdGlvbigpLCBET1dOU1RSRUFNKTsKLSAgICB9Ci0KLSAgICB3
aGlsZSAoZW5kT2ZDdXJyZW50UGFyYWdyYXBoICE9IGVuZEFmdGVyU2VsZWN0aW9uKSB7Ci0gICAg
ICAgIC8vIEl0ZXJhdGUgYWNyb3NzIHRoZSBzZWxlY3RlZCBwYXJhZ3JhcGhzLi4uCi0gICAgICAg
IFZpc2libGVQb3NpdGlvbiBlbmRPZk5leHRQYXJhZ3JhcGggPSBlbmRPZlBhcmFncmFwaChlbmRP
ZkN1cnJlbnRQYXJhZ3JhcGgubmV4dCgpKTsKLSAgICAgICAgaWYgKHRyeUluZGVudGluZ0FzTGlz
dEl0ZW0oZW5kT2ZDdXJyZW50UGFyYWdyYXBoKSkKLSAgICAgICAgICAgIGJsb2NrcXVvdGVGb3JO
ZXh0SW5kZW50ID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5kZW50SW50b0Jsb2Nr
cXVvdGUoZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBlbmRPZk5leHRQYXJhZ3JhcGgsIGJsb2NrcXVv
dGVGb3JOZXh0SW5kZW50KTsKLQotICAgICAgICAvLyBpbmRlbnRJbnRvQmxvY2txdW90ZSBjb3Vs
ZCBtb3ZlIG1vcmUgdGhhbiBvbmUgcGFyYWdyYXBoIGlmIHRoZSBwYXJhZ3JhcGgKLSAgICAgICAg
Ly8gaXMgaW4gYSBsaXN0IGl0ZW0gb3IgYSB0YWJsZS4gQXMgYSByZXN1bHQsIGVuZEFmdGVyU2Vs
ZWN0aW9uIGNvdWxkIHJlZmVyIHRvIGEgcG9zaXRpb24KLSAgICAgICAgLy8gbm8gbG9uZ2VyIGlu
IHRoZSBkb2N1bWVudC4KLSAgICAgICAgaWYgKGVuZEFmdGVyU2VsZWN0aW9uLmlzTm90TnVsbCgp
ICYmICFlbmRBZnRlclNlbGVjdGlvbi5kZWVwRXF1aXZhbGVudCgpLm5vZGUoKS0+aW5Eb2N1bWVu
dCgpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8vIFNhbml0eSBjaGVjazogTWFrZSBz
dXJlIG91ciBtb3ZlUGFyYWdyYXBoIGNhbGxzIGRpZG4ndCByZW1vdmUgZW5kT2ZOZXh0UGFyYWdy
YXBoLmRlZXBFcXVpdmFsZW50KCkubm9kZSgpCi0gICAgICAgIC8vIElmIHNvbWVob3cgd2UgZGlk
LCByZXR1cm4gdG8gcHJldmVudCBjcmFzaGVzLgotICAgICAgICBpZiAoZW5kT2ZOZXh0UGFyYWdy
YXBoLmlzTm90TnVsbCgpICYmICFlbmRPZk5leHRQYXJhZ3JhcGguZGVlcEVxdWl2YWxlbnQoKS5u
b2RlKCktPmluRG9jdW1lbnQoKSkgewotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZW5kT2ZDdXJyZW50UGFy
YWdyYXBoID0gZW5kT2ZOZXh0UGFyYWdyYXBoOwotICAgIH0gICAKLX0KLQotLy8gUmV0dXJucyB0
cnVlIGlmIGF0IGxlYXN0IG9uZSB0ZXh0IG5vZGUgd2FzIHNwbGl0LgotYm9vbCBJbmRlbnRPdXRk
ZW50Q29tbWFuZDo6c3BsaXRUZXh0Tm9kZXMoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBzdGFydCwg
aW50IG51bVBhcmFncmFwaHMpCi17Ci0gICAgVmlzaWJsZVBvc2l0aW9uIGN1cnJlbnRQYXJhZ3Jh
cGhTdGFydCA9IHN0YXJ0OwotICAgIGJvb2wgaGFzU3BsaXQgPSBmYWxzZTsKLSAgICBpbnQgcGFy
YWdyYXBoQ291bnQ7Ci0gICAgZm9yIChwYXJhZ3JhcGhDb3VudCA9IDA7IHBhcmFncmFwaENvdW50
IDwgbnVtUGFyYWdyYXBoczsgKytwYXJhZ3JhcGhDb3VudCkgewotICAgICAgICAvLyBJZiB0aGVy
ZSBhcmUgbXVsdGlwbGUgcGFyYWdyYXBocyBpbiBhIHNpbmdsZSB0ZXh0IG5vZGUsIHdlIHNwbGl0
IHRoZSB0ZXh0IG5vZGUgaW50byBhIHNlcGFyYXRlIG5vZGUgZm9yIGVhY2ggcGFyYWdyYXBoLgot
ICAgICAgICBpZiAoY3VycmVudFBhcmFncmFwaFN0YXJ0LmRlZXBFcXVpdmFsZW50KCkubm9kZSgp
LT5pc1RleHROb2RlKCkgJiYgY3VycmVudFBhcmFncmFwaFN0YXJ0LmRlZXBFcXVpdmFsZW50KCku
bm9kZSgpID09IHN0YXJ0T2ZQYXJhZ3JhcGgoY3VycmVudFBhcmFncmFwaFN0YXJ0LnByZXZpb3Vz
KCkpLmRlZXBFcXVpdmFsZW50KCkubm9kZSgpKSB7Ci0gICAgICAgICAgICBUZXh0KiB0ZXh0Tm9k
ZSA9IHN0YXRpY19jYXN0PFRleHQgKj4oY3VycmVudFBhcmFncmFwaFN0YXJ0LmRlZXBFcXVpdmFs
ZW50KCkubm9kZSgpKTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBjdXJyZW50UGFyYWdyYXBo
U3RhcnQuZGVlcEVxdWl2YWxlbnQoKS5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKTsKLSAgICAgICAg
ICAgIHNwbGl0VGV4dE5vZGUodGV4dE5vZGUsIG9mZnNldCk7Ci0gICAgICAgICAgICBjdXJyZW50
UGFyYWdyYXBoU3RhcnQgPSBWaXNpYmxlUG9zaXRpb24odGV4dE5vZGUsIDAsIFZQX0RFRkFVTFRf
QUZGSU5JVFkpOwotICAgICAgICAgICAgaGFzU3BsaXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAg
ICAgIFZpc2libGVQb3NpdGlvbiBuZXh0UGFyYWdyYXBoID0gc3RhcnRPZlBhcmFncmFwaChlbmRP
ZlBhcmFncmFwaChjdXJyZW50UGFyYWdyYXBoU3RhcnQpLm5leHQoKSk7Ci0gICAgICAgIGlmIChu
ZXh0UGFyYWdyYXBoLmlzTnVsbCgpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGN1cnJl
bnRQYXJhZ3JhcGhTdGFydCA9IG5leHRQYXJhZ3JhcGg7Ci0gICAgfQotICAgIHJldHVybiBoYXNT
cGxpdDsKLX0KLQogdm9pZCBJbmRlbnRPdXRkZW50Q29tbWFuZDo6b3V0ZGVudFBhcmFncmFwaCgp
CiB7CiAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFydE9mUGFyYWdyYXBoID0gc3RhcnRP
ZlBhcmFncmFwaChlbmRpbmdTZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKSk7CkBAIC0yOTEsNiAr
MjEwLDggQEAgdm9pZCBJbmRlbnRPdXRkZW50Q29tbWFuZDo6b3V0ZGVudFBhcmFncgogICAgIG1v
dmVQYXJhZ3JhcGgoc3RhcnRPZlBhcmFncmFwaCh2aXNpYmxlU3RhcnRPZlBhcmFncmFwaCksIGVu
ZE9mUGFyYWdyYXBoKHZpc2libGVFbmRPZlBhcmFncmFwaCksIFZpc2libGVQb3NpdGlvbihQb3Np
dGlvbihwbGFjZWhvbGRlci5nZXQoKSwgMCkpLCB0cnVlKTsKIH0KIAorLy8gRklYTUU6IEl0J3Mg
b2RkIHRoYXQgb3V0ZGVudFJlZ2lvbiBuZWVkcyB0byBpdGVyYXRlIHBhcmFncmFwaHMgdXNpbmcg
YSBkaWZmZXJlbnQgbG9naWMuCisvLyBUaGlzIGxvb3Agc2hvdWxkIGJlIGNvbWJpbmVkIHdpdGgg
dGhhdCBvZiBmb3JtYXRQYXJhZ3JhcGguCiB2b2lkIEluZGVudE91dGRlbnRDb21tYW5kOjpvdXRk
ZW50UmVnaW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgc3RhcnRPZlNlbGVjdGlvbiwgY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJiBlbmRPZlNlbGVjdGlvbikKIHsKICAgICBWaXNpYmxlUG9zaXRpb24g
ZW5kT2ZMYXN0UGFyYWdyYXBoID0gZW5kT2ZQYXJhZ3JhcGgoZW5kT2ZTZWxlY3Rpb24pOwpAQCAt
MzI3LDQ4ICsyNDgsNCBAQCB2b2lkIEluZGVudE91dGRlbnRDb21tYW5kOjpvdXRkZW50UmVnaW9u
CiAgICAgfQogfQogCi12b2lkIEluZGVudE91dGRlbnRDb21tYW5kOjpkb0FwcGx5KCkKLXsKLSAg
ICBpZiAoIWVuZGluZ1NlbGVjdGlvbigpLmlzTm9uT3JwaGFuZWRDYXJldE9yUmFuZ2UoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFlbmRpbmdTZWxlY3Rpb24oKS5yb290RWRpdGFibGVF
bGVtZW50KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgVmlzaWJsZVBvc2l0aW9u
IHZpc2libGVFbmQgPSBlbmRpbmdTZWxlY3Rpb24oKS52aXNpYmxlRW5kKCk7Ci0gICAgVmlzaWJs
ZVBvc2l0aW9uIHZpc2libGVTdGFydCA9IGVuZGluZ1NlbGVjdGlvbigpLnZpc2libGVTdGFydCgp
OwotICAgIC8vIFdoZW4gYSBzZWxlY3Rpb24gZW5kcyBhdCB0aGUgc3RhcnQgb2YgYSBwYXJhZ3Jh
cGgsIHdlIHJhcmVseSBwYWludCAKLSAgICAvLyB0aGUgc2VsZWN0aW9uIGdhcCBiZWZvcmUgdGhh
dCBwYXJhZ3JhcGgsIGJlY2F1c2UgdGhlcmUgb2Z0ZW4gaXMgbm8gZ2FwLiAgCi0gICAgLy8gSW4g
YSBjYXNlIGxpa2UgdGhpcywgaXQncyBub3Qgb2J2aW91cyB0byB0aGUgdXNlciB0aGF0IHRoZSBz
ZWxlY3Rpb24gCi0gICAgLy8gZW5kcyAiaW5zaWRlIiB0aGF0IHBhcmFncmFwaCwgc28gaXQgd291
bGQgYmUgY29uZnVzaW5nIGlmIEluZGVudC9PdXRkZW50IAotICAgIC8vIG9wZXJhdGVkIG9uIHRo
YXQgcGFyYWdyYXBoLgotICAgIC8vIEZJWE1FOiBXZSBwYWludCB0aGUgZ2FwIGJlZm9yZSBzb21l
IHBhcmFncmFwaHMgdGhhdCBhcmUgaW5kZW50ZWQgd2l0aCBsZWZ0IAotICAgIC8vIG1hcmdpbi9w
YWRkaW5nLCBidXQgbm90IG90aGVycy4gIFdlIHNob3VsZCBtYWtlIHRoZSBnYXAgcGFpbnRpbmcg
bW9yZSBjb25zaXN0ZW50IGFuZCAKLSAgICAvLyB0aGVuIHVzZSBhIGxlZnQgbWFyZ2luL3BhZGRp
bmcgcnVsZSBoZXJlLgotICAgIGlmICh2aXNpYmxlRW5kICE9IHZpc2libGVTdGFydCAmJiBpc1N0
YXJ0T2ZQYXJhZ3JhcGgodmlzaWJsZUVuZCkpCi0gICAgICAgIHNldEVuZGluZ1NlbGVjdGlvbihW
aXNpYmxlU2VsZWN0aW9uKHZpc2libGVTdGFydCwgdmlzaWJsZUVuZC5wcmV2aW91cyh0cnVlKSkp
OwotCi0gICAgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Gb3JQYXJhZ3Jh
cGhJdGVyYXRpb24oZW5kaW5nU2VsZWN0aW9uKCkpOwotICAgIFZpc2libGVQb3NpdGlvbiBzdGFy
dE9mU2VsZWN0aW9uID0gc2VsZWN0aW9uLnZpc2libGVTdGFydCgpOwotICAgIFZpc2libGVQb3Np
dGlvbiBlbmRPZlNlbGVjdGlvbiA9IHNlbGVjdGlvbi52aXNpYmxlRW5kKCk7Ci0gICAgCi0gICAg
aW50IHN0YXJ0SW5kZXggPSBpbmRleEZvclZpc2libGVQb3NpdGlvbihzdGFydE9mU2VsZWN0aW9u
KTsKLSAgICBpbnQgZW5kSW5kZXggPSBpbmRleEZvclZpc2libGVQb3NpdGlvbihlbmRPZlNlbGVj
dGlvbik7Ci0gICAgCi0gICAgQVNTRVJUKCFzdGFydE9mU2VsZWN0aW9uLmlzTnVsbCgpKTsKLSAg
ICBBU1NFUlQoIWVuZE9mU2VsZWN0aW9uLmlzTnVsbCgpKTsKLSAgICAKLSAgICBpZiAobV90eXBl
T2ZBY3Rpb24gPT0gSW5kZW50KQotICAgICAgICBpbmRlbnRSZWdpb24oc3RhcnRPZlNlbGVjdGlv
biwgZW5kT2ZTZWxlY3Rpb24pOwotICAgIGVsc2UKLSAgICAgICAgb3V0ZGVudFJlZ2lvbihzdGFy
dE9mU2VsZWN0aW9uLCBlbmRPZlNlbGVjdGlvbik7Ci0KLSAgICB1cGRhdGVMYXlvdXQoKTsKLSAg
ICAKLSAgICBSZWZQdHI8UmFuZ2U+IHN0YXJ0UmFuZ2UgPSBUZXh0SXRlcmF0b3I6OnJhbmdlRnJv
bUxvY2F0aW9uQW5kTGVuZ3RoKGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpLCBzdGFydElu
ZGV4LCAwLCB0cnVlKTsKLSAgICBSZWZQdHI8UmFuZ2U+IGVuZFJhbmdlID0gVGV4dEl0ZXJhdG9y
OjpyYW5nZUZyb21Mb2NhdGlvbkFuZExlbmd0aChkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQo
KSwgZW5kSW5kZXgsIDAsIHRydWUpOwotICAgIGlmIChzdGFydFJhbmdlICYmIGVuZFJhbmdlKQot
ICAgICAgICBzZXRFbmRpbmdTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihzdGFydFJhbmdlLT5z
dGFydFBvc2l0aW9uKCksIGVuZFJhbmdlLT5zdGFydFBvc2l0aW9uKCksIERPV05TVFJFQU0pKTsK
LX0KLQogfQpJbmRleDogV2ViQ29yZS9lZGl0aW5nL0luZGVudE91dGRlbnRDb21tYW5kLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL0luZGVudE91dGRlbnRDb21tYW5kLmgJKHJldmlz
aW9uIDY4Njc1KQorKysgV2ViQ29yZS9lZGl0aW5nL0luZGVudE91dGRlbnRDb21tYW5kLmgJKHdv
cmtpbmcgY29weSkKQEAgLTI3LDEwICsyNywxMSBAQAogI2RlZmluZSBJbmRlbnRPdXRkZW50Q29t
bWFuZF9oCiAKICNpbmNsdWRlICJDb21wb3NpdGVFZGl0Q29tbWFuZC5oIgorI2luY2x1ZGUgIkZv
cm1hdEJsb2NrQ29tbWFuZC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIEluZGVu
dE91dGRlbnRDb21tYW5kIDogcHVibGljIENvbXBvc2l0ZUVkaXRDb21tYW5kIHsKK2NsYXNzIElu
ZGVudE91dGRlbnRDb21tYW5kIDogcHVibGljIEZvcm1hdEJsb2NrQ29tbWFuZCB7CiBwdWJsaWM6
CiAgICAgZW51bSBFSW5kZW50VHlwZSB7IEluZGVudCwgT3V0ZGVudCB9OwogICAgIHN0YXRpYyBQ
YXNzUmVmUHRyPEluZGVudE91dGRlbnRDb21tYW5kPiBjcmVhdGUoRG9jdW1lbnQqIGRvY3VtZW50
LCBFSW5kZW50VHlwZSB0eXBlLCBpbnQgbWFyZ2luSW5QaXhlbHMgPSAwKQpAQCAtNDMsMTUgKzQ0
LDE2IEBAIHB1YmxpYzoKIHByaXZhdGU6CiAgICAgSW5kZW50T3V0ZGVudENvbW1hbmQoRG9jdW1l
bnQqLCBFSW5kZW50VHlwZSwgaW50IG1hcmdpbkluUGl4ZWxzKTsKIAotICAgIHZpcnR1YWwgdm9p
ZCBkb0FwcGx5KCk7CiAgICAgdmlydHVhbCBFZGl0QWN0aW9uIGVkaXRpbmdBY3Rpb24oKSBjb25z
dCB7IHJldHVybiBtX3R5cGVPZkFjdGlvbiA9PSBJbmRlbnQgPyBFZGl0QWN0aW9uSW5kZW50IDog
RWRpdEFjdGlvbk91dGRlbnQ7IH0KIAotICAgIHZvaWQgaW5kZW50UmVnaW9uKGNvbnN0IFZpc2li
bGVQb3NpdGlvbiYsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOworICAgIHZpcnR1YWwgdm9pZCBm
b3JtYXRTZWxlY3Rpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBzdGFydE9mU2VsZWN0aW9uLCBj
b25zdCBWaXNpYmxlUG9zaXRpb24mIGVuZE9mU2VsZWN0aW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQg
Zm9ybWF0UGFyYWdyYXBoKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZDdXJyZW50UGFyYWdy
YXBoLCBjb25zdCBWaXNpYmxlUG9zaXRpb24mIGVuZE9mTmV4dFBhcmFncmFwaCwgUmVmUHRyPEVs
ZW1lbnQ+JiBibG9ja3F1b3RlVG9Vc2UpOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxIVE1MRWxl
bWVudD4gY3JlYXRlQmxvY2tFbGVtZW50KCkgY29uc3Q7CisKICAgICB2b2lkIG91dGRlbnRSZWdp
b24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CiAgICAg
dm9pZCBvdXRkZW50UGFyYWdyYXBoKCk7CiAgICAgYm9vbCB0cnlJbmRlbnRpbmdBc0xpc3RJdGVt
KGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOwogICAgIHZvaWQgaW5kZW50SW50b0Jsb2NrcXVvdGUo
Y29uc3QgVmlzaWJsZVBvc2l0aW9uJiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiwgUmVmUHRyPEVs
ZW1lbnQ+Jik7Ci0gICAgYm9vbCBzcGxpdFRleHROb2Rlcyhjb25zdCBWaXNpYmxlUG9zaXRpb24m
IHN0YXJ0LCBpbnQgbnVtUGFyYWdyYXBocyk7CiAKICAgICBFSW5kZW50VHlwZSBtX3R5cGVPZkFj
dGlvbjsKICAgICBpbnQgbV9tYXJnaW5JblBpeGVsczsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>69267</attachid>
            <date>2010-09-29 15:59:21 -0700</date>
            <delta_ts>2010-09-29 16:15:18 -0700</delta_ts>
            <desc>FormatBlockCommand.cpp with patch</desc>
            <filename>FormatBlockCommand.cpp</filename>
            <type>application/octet-stream</type>
            <size>12711</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBV
VEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIs
IElOQy4gT1IKICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCiAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCiAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICovCgojaW5j
bHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJFbGVtZW50LmgiCiNpbmNsdWRlICJGb3JtYXRCbG9j
a0NvbW1hbmQuaCIKI2luY2x1ZGUgIkRvY3VtZW50LmgiCiNpbmNsdWRlICJodG1sZWRpdGluZy5o
IgojaW5jbHVkZSAiSFRNTEVsZW1lbnQuaCIKI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgojaW5jbHVk
ZSAiVGV4dEl0ZXJhdG9yLmgiCiNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCgpuYW1lc3BhY2Ug
V2ViQ29yZSB7Cgp1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwoKRm9ybWF0QmxvY2tDb21tYW5k
OjpGb3JtYXRCbG9ja0NvbW1hbmQoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBBdG9taWNTdHJp
bmcmIHRhZ05hbWUpIAogICAgOiBDb21wb3NpdGVFZGl0Q29tbWFuZChkb2N1bWVudCksIG1fdGFn
TmFtZSh0YWdOYW1lKQp7Cn0KCnZvaWQgRm9ybWF0QmxvY2tDb21tYW5kOjpkb0FwcGx5KCkKewog
ICAgaWYgKCFlbmRpbmdTZWxlY3Rpb24oKS5pc05vbk9ycGhhbmVkQ2FyZXRPclJhbmdlKCkpCiAg
ICAgICAgcmV0dXJuOwoKICAgIGlmICghZW5kaW5nU2VsZWN0aW9uKCkucm9vdEVkaXRhYmxlRWxl
bWVudCgpKQogICAgICAgIHJldHVybjsKCiAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZUVuZCA9
IGVuZGluZ1NlbGVjdGlvbigpLnZpc2libGVFbmQoKTsKICAgIFZpc2libGVQb3NpdGlvbiB2aXNp
YmxlU3RhcnQgPSBlbmRpbmdTZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKTsKICAgIC8vIFdoZW4g
YSBzZWxlY3Rpb24gZW5kcyBhdCB0aGUgc3RhcnQgb2YgYSBwYXJhZ3JhcGgsIHdlIHJhcmVseSBw
YWludCAKICAgIC8vIHRoZSBzZWxlY3Rpb24gZ2FwIGJlZm9yZSB0aGF0IHBhcmFncmFwaCwgYmVj
YXVzZSB0aGVyZSBvZnRlbiBpcyBubyBnYXAuICAKICAgIC8vIEluIGEgY2FzZSBsaWtlIHRoaXMs
IGl0J3Mgbm90IG9idmlvdXMgdG8gdGhlIHVzZXIgdGhhdCB0aGUgc2VsZWN0aW9uIAogICAgLy8g
ZW5kcyAiaW5zaWRlIiB0aGF0IHBhcmFncmFwaCwgc28gaXQgd291bGQgYmUgY29uZnVzaW5nIGlm
IEZvcm1hdEJsb2NrCiAgICAvLyBvcGVyYXRlZCBvbiB0aGF0IHBhcmFncmFwaC4KICAgIC8vIEZJ
WE1FOiBXZSBwYWludCB0aGUgZ2FwIGJlZm9yZSBzb21lIHBhcmFncmFwaHMgdGhhdCBhcmUgaW5k
ZW50ZWQgd2l0aCBsZWZ0IAogICAgLy8gbWFyZ2luL3BhZGRpbmcsIGJ1dCBub3Qgb3RoZXJzLiAg
V2Ugc2hvdWxkIG1ha2UgdGhlIGdhcCBwYWludGluZyBtb3JlIGNvbnNpc3RlbnQgYW5kIAogICAg
Ly8gdGhlbiB1c2UgYSBsZWZ0IG1hcmdpbi9wYWRkaW5nIHJ1bGUgaGVyZS4KICAgIGlmICh2aXNp
YmxlRW5kICE9IHZpc2libGVTdGFydCAmJiBpc1N0YXJ0T2ZQYXJhZ3JhcGgodmlzaWJsZUVuZCkp
CiAgICAgICAgc2V0RW5kaW5nU2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24odmlzaWJsZVN0YXJ0
LCB2aXNpYmxlRW5kLnByZXZpb3VzKHRydWUpKSk7CgogICAgVmlzaWJsZVNlbGVjdGlvbiBzZWxl
Y3Rpb24gPSBzZWxlY3Rpb25Gb3JQYXJhZ3JhcGhJdGVyYXRpb24oZW5kaW5nU2VsZWN0aW9uKCkp
OwogICAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0T2ZTZWxlY3Rpb24gPSBzZWxlY3Rpb24udmlzaWJs
ZVN0YXJ0KCk7CiAgICBWaXNpYmxlUG9zaXRpb24gZW5kT2ZTZWxlY3Rpb24gPSBzZWxlY3Rpb24u
dmlzaWJsZUVuZCgpOwoKICAgIGludCBzdGFydEluZGV4ID0gaW5kZXhGb3JWaXNpYmxlUG9zaXRp
b24odmlzaWJsZVN0YXJ0KTsKICAgIGludCBlbmRJbmRleCA9IGluZGV4Rm9yVmlzaWJsZVBvc2l0
aW9uKHZpc2libGVFbmQpOwoKICAgIGZvcm1hdEN1cnJlbnRTZWxlY3Rpb24oc3RhcnRPZlNlbGVj
dGlvbiwgZW5kT2ZTZWxlY3Rpb24pOwoKICAgIHVwZGF0ZUxheW91dCgpOwoKICAgIFJlZlB0cjxS
YW5nZT4gc3RhcnRSYW5nZSA9IFRleHRJdGVyYXRvcjo6cmFuZ2VGcm9tTG9jYXRpb25BbmRMZW5n
dGgoZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCksIHN0YXJ0SW5kZXgsIDAsIHRydWUpOwog
ICAgUmVmUHRyPFJhbmdlPiBlbmRSYW5nZSA9IFRleHRJdGVyYXRvcjo6cmFuZ2VGcm9tTG9jYXRp
b25BbmRMZW5ndGgoZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCksIGVuZEluZGV4LCAwLCB0
cnVlKTsKICAgIGlmIChzdGFydFJhbmdlICYmIGVuZFJhbmdlKQogICAgICAgIHNldEVuZGluZ1Nl
bGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKHN0YXJ0UmFuZ2UtPnN0YXJ0UG9zaXRpb24oKSwgZW5k
UmFuZ2UtPnN0YXJ0UG9zaXRpb24oKSwgRE9XTlNUUkVBTSkpOwp9Cgp2b2lkIEZvcm1hdEJsb2Nr
Q29tbWFuZDo6Zm9ybWF0Q3VycmVudFNlbGVjdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHN0
YXJ0T2ZTZWxlY3Rpb24sIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZTZWxlY3Rpb24pCnsK
ICAgIEV4Y2VwdGlvbkNvZGUgZWM7CiAgICBTdHJpbmcgbG9jYWxOYW1lLCBwcmVmaXg7CiAgICBp
ZiAoIURvY3VtZW50OjpwYXJzZVF1YWxpZmllZE5hbWUobV90YWdOYW1lLCBwcmVmaXgsIGxvY2Fs
TmFtZSwgZWMpKQogICAgICAgIHJldHVybjsKICAgIFF1YWxpZmllZE5hbWUgYmxvY2tUYWdOYW1l
KHByZWZpeCwgbG9jYWxOYW1lLCB4aHRtbE5hbWVzcGFjZVVSSSk7CgogICAgLy8gU3BlY2lhbCBj
YXNlIGVtcHR5IHVuc3BsaXR0YWJsZSBlbGVtZW50cyBiZWNhdXNlIHRoZXJlJ3Mgbm90aGluZyB0
byBzcGxpdAogICAgLy8gYW5kIHRoZXJlJ3Mgbm90aGluZyB0byBtb3ZlLgogICAgUG9zaXRpb24g
c3RhcnQgPSBzdGFydE9mU2VsZWN0aW9uLmRlZXBFcXVpdmFsZW50KCkuZG93bnN0cmVhbSgpOwog
ICAgaWYgKGlzQXRVbnNwbGl0dGFibGVFbGVtZW50KHN0YXJ0KSkgewogICAgICAgIFJlZlB0cjxF
bGVtZW50PiBibG9ja3F1b3RlID0gY3JlYXRlSFRNTEVsZW1lbnQoZG9jdW1lbnQoKSwgYmxvY2tU
YWdOYW1lKTsKICAgICAgICBpbnNlcnROb2RlQXQoYmxvY2txdW90ZSwgc3RhcnQpOwogICAgICAg
IFJlZlB0cjxFbGVtZW50PiBwbGFjZWhvbGRlciA9IGNyZWF0ZUJyZWFrRWxlbWVudChkb2N1bWVu
dCgpKTsKICAgICAgICBhcHBlbmROb2RlKHBsYWNlaG9sZGVyLCBibG9ja3F1b3RlKTsKICAgICAg
ICBzZXRFbmRpbmdTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihQb3NpdGlvbihwbGFjZWhvbGRl
ci5nZXQoKSwgMCksIERPV05TVFJFQU0pKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgUmVm
UHRyPEVsZW1lbnQ+IGJsb2NrTm9kZTsKICAgIFZpc2libGVQb3NpdGlvbiBlbmRPZkN1cnJlbnRQ
YXJhZ3JhcGggPSBlbmRPZlBhcmFncmFwaChzdGFydE9mU2VsZWN0aW9uKTsKICAgIFZpc2libGVQ
b3NpdGlvbiBlbmRBZnRlclNlbGVjdGlvbiA9IGVuZE9mUGFyYWdyYXBoKGVuZE9mUGFyYWdyYXBo
KGVuZE9mU2VsZWN0aW9uKS5uZXh0KCkpOyAgICAKICAgIHdoaWxlIChlbmRPZkN1cnJlbnRQYXJh
Z3JhcGggIT0gZW5kQWZ0ZXJTZWxlY3Rpb24pIHsKICAgICAgICAvLyBJdGVyYXRlIGFjcm9zcyB0
aGUgc2VsZWN0ZWQgcGFyYWdyYXBocy4uLgogICAgICAgIFZpc2libGVQb3NpdGlvbiBlbmRPZk5l
eHRQYXJhZ3JhcGggPSBlbmRPZlBhcmFncmFwaChlbmRPZkN1cnJlbnRQYXJhZ3JhcGgubmV4dCgp
KTsKCiAgICAgICAgZm9ybWF0UGFyYWdyYXBoKGVuZE9mQ3VycmVudFBhcmFncmFwaCwgZW5kT2ZO
ZXh0UGFyYWdyYXBoLCBibG9ja05vZGUsIGJsb2NrVGFnTmFtZSk7CgogICAgICAgIC8vIGluZGVu
dEludG9CbG9ja3F1b3RlIGNvdWxkIG1vdmUgbW9yZSB0aGFuIG9uZSBwYXJhZ3JhcGggaWYgdGhl
IHBhcmFncmFwaAogICAgICAgIC8vIGlzIGluIGEgbGlzdCBpdGVtIG9yIGEgdGFibGUuIEFzIGEg
cmVzdWx0LCBlbmRBZnRlclNlbGVjdGlvbiBjb3VsZCByZWZlciB0byBhIHBvc2l0aW9uCiAgICAg
ICAgLy8gbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudC4KICAgICAgICBpZiAoZW5kQWZ0ZXJTZWxl
Y3Rpb24uaXNOb3ROdWxsKCkgJiYgIWVuZEFmdGVyU2VsZWN0aW9uLmRlZXBFcXVpdmFsZW50KCku
bm9kZSgpLT5pbkRvY3VtZW50KCkpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIFNhbml0
eSBjaGVjazogTWFrZSBzdXJlIG91ciBtb3ZlUGFyYWdyYXBoIGNhbGxzIGRpZG4ndCByZW1vdmUg
ZW5kT2ZOZXh0UGFyYWdyYXBoLmRlZXBFcXVpdmFsZW50KCkubm9kZSgpCiAgICAgICAgLy8gSWYg
c29tZWhvdyB3ZSBkaWQsIHJldHVybiB0byBwcmV2ZW50IGNyYXNoZXMuCiAgICAgICAgaWYgKGVu
ZE9mTmV4dFBhcmFncmFwaC5pc05vdE51bGwoKSAmJiAhZW5kT2ZOZXh0UGFyYWdyYXBoLmRlZXBF
cXVpdmFsZW50KCkubm9kZSgpLT5pbkRvY3VtZW50KCkpIHsKICAgICAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZW5kT2ZD
dXJyZW50UGFyYWdyYXBoID0gZW5kT2ZOZXh0UGFyYWdyYXBoOwogICAgfQp9Cgp2b2lkIEZvcm1h
dEJsb2NrQ29tbWFuZDo6Zm9ybWF0UGFyYWdyYXBoKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5k
T2ZDdXJyZW50UGFyYWdyYXBoLCBjb25zdCBWaXNpYmxlUG9zaXRpb24mLCBSZWZQdHI8RWxlbWVu
dD4mLCBRdWFsaWZpZWROYW1lJikKewogICAgc2V0RW5kaW5nU2VsZWN0aW9uKGVuZE9mQ3VycmVu
dFBhcmFncmFwaCk7CgogICAgRXhjZXB0aW9uQ29kZSBlYzsKICAgIFN0cmluZyBsb2NhbE5hbWUs
IHByZWZpeDsKICAgIGlmICghRG9jdW1lbnQ6OnBhcnNlUXVhbGlmaWVkTmFtZShtX3RhZ05hbWUs
IHByZWZpeCwgbG9jYWxOYW1lLCBlYykpCiAgICAgICAgcmV0dXJuOwogICAgUXVhbGlmaWVkTmFt
ZSBxVHlwZU9mQmxvY2socHJlZml4LCBsb2NhbE5hbWUsIHhodG1sTmFtZXNwYWNlVVJJKTsKCQog
ICAgTm9kZSogcmVmTm9kZSA9IGVuY2xvc2luZ0Jsb2NrRmxvd0VsZW1lbnQoZW5kaW5nU2VsZWN0
aW9uKCkudmlzaWJsZVN0YXJ0KCkpOwogICAgaWYgKHJlZk5vZGUtPmhhc1RhZ05hbWUocVR5cGVP
ZkJsb2NrKSkKICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IGluIGEgYmxvY2sgd2l0aCB0aGUgZm9y
bWF0IHdlIHdhbnQsIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKICAgICAgICByZXR1
cm47CgkKICAgIFZpc2libGVQb3NpdGlvbiBwYXJhZ3JhcGhTdGFydCA9IHN0YXJ0T2ZQYXJhZ3Jh
cGgoZW5kaW5nU2VsZWN0aW9uKCkudmlzaWJsZVN0YXJ0KCkpOwogICAgVmlzaWJsZVBvc2l0aW9u
IHBhcmFncmFwaEVuZCA9IGVuZE9mUGFyYWdyYXBoKGVuZGluZ1NlbGVjdGlvbigpLnZpc2libGVT
dGFydCgpKTsKICAgIFZpc2libGVQb3NpdGlvbiBibG9ja1N0YXJ0ID0gc3RhcnRPZkJsb2NrKGVu
ZGluZ1NlbGVjdGlvbigpLnZpc2libGVTdGFydCgpKTsKICAgIFZpc2libGVQb3NpdGlvbiBibG9j
a0VuZCA9IGVuZE9mQmxvY2soZW5kaW5nU2VsZWN0aW9uKCkudmlzaWJsZVN0YXJ0KCkpOwogICAg
UmVmUHRyPEVsZW1lbnQ+IGJsb2NrTm9kZSA9IGNyZWF0ZUhUTUxFbGVtZW50KGRvY3VtZW50KCks
IG1fdGFnTmFtZSk7CiAgICBSZWZQdHI8RWxlbWVudD4gcGxhY2Vob2xkZXIgPSBjcmVhdGVCcmVh
a0VsZW1lbnQoZG9jdW1lbnQoKSk7CgkKICAgIE5vZGUqIHJvb3QgPSBlbmRpbmdTZWxlY3Rpb24o
KS5zdGFydCgpLm5vZGUoKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOwogICAgaWYgKHZhbGlkQmxv
Y2tUYWcocmVmTm9kZS0+bm9kZU5hbWUoKS5sb3dlcigpKSAmJiAKICAgICAgICBwYXJhZ3JhcGhT
dGFydCA9PSBibG9ja1N0YXJ0ICYmIHBhcmFncmFwaEVuZCA9PSBibG9ja0VuZCAmJiAKICAgICAg
ICByZWZOb2RlICE9IHJvb3QgJiYgIXJvb3QtPmlzRGVzY2VuZGFudE9mKHJlZk5vZGUpKQogICAg
ICAgIC8vIEFscmVhZHkgaW4gYSB2YWxpZCBibG9jayB0YWcgdGhhdCBvbmx5IGNvbnRhaW5zIHRo
ZSBjdXJyZW50IHBhcmFncmFwaCwgc28gd2UgY2FuIHN3YXAgd2l0aCB0aGUgbmV3IHRhZwogICAg
ICAgIGluc2VydE5vZGVCZWZvcmUoYmxvY2tOb2RlLCByZWZOb2RlKTsKICAgIGVsc2UgewogICAg
ICAgIC8vIEF2b2lkIGluc2VydGluZyBpbnNpZGUgaW5saW5lIGVsZW1lbnRzIHRoYXQgc3Vycm91
bmQgcGFyYWdyYXBoU3RhcnQgd2l0aCB1cHN0cmVhbSgpLgogICAgICAgIC8vIFRoaXMgaXMgb25s
eSB0byBhdm9pZCBjcmVhdGluZyBibG9hdGVkIG1hcmt1cC4KICAgICAgICBpbnNlcnROb2RlQXQo
YmxvY2tOb2RlLCBwYXJhZ3JhcGhTdGFydC5kZWVwRXF1aXZhbGVudCgpLnVwc3RyZWFtKCkpOwog
ICAgfQogICAgYXBwZW5kTm9kZShwbGFjZWhvbGRlciwgYmxvY2tOb2RlKTsKCQogICAgVmlzaWJs
ZVBvc2l0aW9uIGRlc3RpbmF0aW9uKFBvc2l0aW9uKHBsYWNlaG9sZGVyLmdldCgpLCAwKSk7CiAg
ICBpZiAocGFyYWdyYXBoU3RhcnQgPT0gcGFyYWdyYXBoRW5kICYmICFsaW5lQnJlYWtFeGlzdHNB
dFZpc2libGVQb3NpdGlvbihwYXJhZ3JhcGhTdGFydCkpIHsKICAgICAgICBzZXRFbmRpbmdTZWxl
Y3Rpb24oZGVzdGluYXRpb24pOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIG1vdmVQYXJhZ3Jh
cGgocGFyYWdyYXBoU3RhcnQsIHBhcmFncmFwaEVuZCwgZGVzdGluYXRpb24sIHRydWUsIGZhbHNl
KTsKICAgIC8qCiAgICBFeGNlcHRpb25Db2RlIGVjOwogICAgU3RyaW5nIGxvY2FsTmFtZSwgcHJl
Zml4OwogICAgaWYgKCFEb2N1bWVudDo6cGFyc2VRdWFsaWZpZWROYW1lKG1fdGFnTmFtZSwgcHJl
Zml4LCBsb2NhbE5hbWUsIGVjKSkKICAgICAgICByZXR1cm47CiAgICBRdWFsaWZpZWROYW1lIHFU
eXBlT2ZCbG9jayhwcmVmaXgsIGxvY2FsTmFtZSwgeGh0bWxOYW1lc3BhY2VVUkkpOwoKICAgIE5v
ZGUqIHJlZk5vZGUgPSBlbmNsb3NpbmdCbG9ja0Zsb3dFbGVtZW50KGVuZGluZ1NlbGVjdGlvbigp
LnZpc2libGVTdGFydCgpKTsKICAgIGlmIChyZWZOb2RlLT5oYXNUYWdOYW1lKHFUeXBlT2ZCbG9j
aykpCiAgICAgICAgLy8gV2UncmUgYWxyZWFkeSBpbiBhIGJsb2NrIHdpdGggdGhlIGZvcm1hdCB3
ZSB3YW50LCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nCiAgICAgICAgcmV0dXJuOwoK
ICAgIFZpc2libGVQb3NpdGlvbiBzdGFydE9mQ3VycmVudFBhcmFncmFwaCA9IHN0YXJ0T2ZQYXJh
Z3JhcGgoZW5kT2ZDdXJyZW50UGFyYWdyYXBoKTsKICAgIFZpc2libGVQb3NpdGlvbiBibG9ja1N0
YXJ0ID0gc3RhcnRPZkJsb2NrKHN0YXJ0T2ZDdXJyZW50UGFyYWdyYXBoKTsKICAgIFZpc2libGVQ
b3NpdGlvbiBibG9ja0VuZCA9IGVuZE9mQmxvY2soc3RhcnRPZkN1cnJlbnRQYXJhZ3JhcGgpOwog
ICAgYmxvY2tOb2RlID0gY3JlYXRlSFRNTEVsZW1lbnQoZG9jdW1lbnQoKSwgbV90YWdOYW1lKTsK
ICAgIFJlZlB0cjxFbGVtZW50PiBwbGFjZWhvbGRlciA9IGNyZWF0ZUJyZWFrRWxlbWVudChkb2N1
bWVudCgpKTsKCiAgICBOb2RlKiByb290ID0gZW5kaW5nU2VsZWN0aW9uKCkuc3RhcnQoKS5ub2Rl
KCktPnJvb3RFZGl0YWJsZUVsZW1lbnQoKTsKICAgIGlmICh2YWxpZEJsb2NrVGFnKHJlZk5vZGUt
Pm5vZGVOYW1lKCkubG93ZXIoKSkgJiYgCiAgICAgICAgc3RhcnRPZkN1cnJlbnRQYXJhZ3JhcGgg
PT0gYmxvY2tTdGFydCAmJiBlbmRPZkN1cnJlbnRQYXJhZ3JhcGggPT0gYmxvY2tFbmQgJiYgCiAg
ICAgICAgcmVmTm9kZSAhPSByb290ICYmICFyb290LT5pc0Rlc2NlbmRhbnRPZihyZWZOb2RlKSkK
ICAgICAgICAvLyBBbHJlYWR5IGluIGEgdmFsaWQgYmxvY2sgdGFnIHRoYXQgb25seSBjb250YWlu
cyB0aGUgY3VycmVudCBwYXJhZ3JhcGgsIHNvIHdlIGNhbiBzd2FwIHdpdGggdGhlIG5ldyB0YWcK
ICAgICAgICBpbnNlcnROb2RlQmVmb3JlKGJsb2NrTm9kZSwgcmVmTm9kZSk7CiAgICBlbHNlIHsK
ICAgICAgICAvLyBBdm9pZCBpbnNlcnRpbmcgaW5zaWRlIGlubGluZSBlbGVtZW50cyB0aGF0IHN1
cnJvdW5kIHBhcmFncmFwaFN0YXJ0IHdpdGggdXBzdHJlYW0oKS4KICAgICAgICAvLyBUaGlzIGlz
IG9ubHkgdG8gYXZvaWQgY3JlYXRpbmcgYmxvYXRlZCBtYXJrdXAuCiAgICAgICAgaW5zZXJ0Tm9k
ZUF0KGJsb2NrTm9kZSwgc3RhcnRPZkN1cnJlbnRQYXJhZ3JhcGguZGVlcEVxdWl2YWxlbnQoKS51
cHN0cmVhbSgpKTsKICAgIH0KICAgIGFwcGVuZE5vZGUocGxhY2Vob2xkZXIsIGJsb2NrTm9kZSk7
CgogICAgVmlzaWJsZVBvc2l0aW9uIGRlc3RpbmF0aW9uKFBvc2l0aW9uKHBsYWNlaG9sZGVyLmdl
dCgpLCAwKSk7CiAgICBpZiAoc3RhcnRPZkN1cnJlbnRQYXJhZ3JhcGggPT0gZW5kT2ZDdXJyZW50
UGFyYWdyYXBoICYmICFsaW5lQnJlYWtFeGlzdHNBdFZpc2libGVQb3NpdGlvbihzdGFydE9mQ3Vy
cmVudFBhcmFncmFwaCkpIHsKLy8gICAgICAgIHNldEVuZGluZ1NlbGVjdGlvbihkZXN0aW5hdGlv
bik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbW92ZVBhcmFncmFwaChzdGFydE9mQ3VycmVu
dFBhcmFncmFwaCwgZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBkZXN0aW5hdGlvbiwgdHJ1ZSwgZmFs
c2UpOyovCi8qCiAgICBOb2RlKiBlbmNsb3NpbmdOb2RlID0gZW5jbG9zaW5nTm9kZVdpdGhUYWco
ZW5kT2ZDdXJyZW50UGFyYWdyYXBoLmRlZXBFcXVpdmFsZW50KCksIGJsb2NrVGFnTmFtZSk7CiAg
ICBpZiAoZW5jbG9zaW5nTm9kZSAmJiBlbmNsb3NpbmdOb2RlLT5yb290RWRpdGFibGVFbGVtZW50
KCkgPT0gZW5kT2ZDdXJyZW50UGFyYWdyYXBoLnJvb3RFZGl0YWJsZUVsZW1lbnQoKSkgewogICAg
ICAgIGJsb2NrTm9kZSA9IDA7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGluZGVudEludG9C
bG9ja05vZGUoZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBlbmRPZk5leHRQYXJhZ3JhcGgsIGJsb2Nr
Tm9kZSwgYmxvY2tUYWdOYW1lKTsKICAgIGJsb2NrTm9kZSA9IDA7Ki8KfQoKdm9pZCBGb3JtYXRC
bG9ja0NvbW1hbmQ6OmluZGVudEludG9CbG9ja05vZGUoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBl
bmRPZkN1cnJlbnRQYXJhZ3JhcGgsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZOZXh0UGFy
YWdyYXBoLCBSZWZQdHI8RWxlbWVudD4mIGJsb2NrTm9kZSwgUXVhbGlmaWVkTmFtZSYgYmxvY2tU
YWdOYW1lKQp7CiAgICBOb2RlKiBlbmNsb3NpbmdDZWxsID0gMDsKCiAgICBQb3NpdGlvbiBzdGFy
dCA9IHN0YXJ0T2ZQYXJhZ3JhcGgoZW5kT2ZDdXJyZW50UGFyYWdyYXBoKS5kZWVwRXF1aXZhbGVu
dCgpOwogICAgZW5jbG9zaW5nQ2VsbCA9IGVuY2xvc2luZ05vZGVPZlR5cGUoc3RhcnQsICZpc1Rh
YmxlQ2VsbCk7CiAgICBOb2RlKiBzcGxpdFRvID0gbm9kZVRvU3BsaXRUbyhzdGFydC5ub2RlKCkp
OwogICAgaWYgKCFzcGxpdFRvKQogICAgICAgIHJldHVybjsKCiAgICBSZWZQdHI8Tm9kZT4gb3V0
ZXJCbG9jayA9IChzdGFydC5ub2RlKCkgPT0gc3BsaXRUbykgPyBzdGFydC5ub2RlKCkgOiBzcGxp
dFRyZWVUb05vZGUoc3RhcnQubm9kZSgpLCBzcGxpdFRvKTsKCiAgICByZW1vdmVFeGlzdGluZ0Js
b2NrTm9kZShlbmRPZkN1cnJlbnRQYXJhZ3JhcGgsIG91dGVyQmxvY2suZ2V0KCkpOwoKICAgIGlm
ICghYmxvY2tOb2RlKSB7CiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJsb2NrcXVvdGUgYW5kIGlu
c2VydCBpdCBhcyBhIGNoaWxkIG9mIHRoZSByb290IGVkaXRhYmxlIGVsZW1lbnQuIFdlIGFjY29t
cGxpc2gKICAgICAgICAvLyB0aGlzIGJ5IHNwbGl0dGluZyBhbGwgcGFyZW50cyBvZiB0aGUgY3Vy
cmVudCBwYXJhZ3JhcGggdXAgdG8gdGhhdCBwb2ludC4KICAgICAgICBibG9ja05vZGUgPSBjcmVh
dGVIVE1MRWxlbWVudChkb2N1bWVudCgpLCBibG9ja1RhZ05hbWUpOwogICAgICAgIGluc2VydE5v
ZGVCZWZvcmUoYmxvY2tOb2RlLCBvdXRlckJsb2NrKTsKICAgIH0KCiAgICBtb3ZlUGFyYWdyYXBo
V2l0aENsb25lcyhzdGFydE9mUGFyYWdyYXBoKGVuZE9mQ3VycmVudFBhcmFncmFwaCksIGVuZE9m
Q3VycmVudFBhcmFncmFwaCwgYmxvY2tOb2RlLmdldCgpLCBvdXRlckJsb2NrLmdldCgpKTsKCiAg
ICAvLyBEb24ndCBwdXQgdGhlIG5leHQgcGFyYWdyYXBoIGluIHRoZSBibG9ja3F1b3RlIHdlIGp1
c3QgY3JlYXRlZCBmb3IgdGhpcyBwYXJhZ3JhcGggdW5sZXNzIAogICAgLy8gdGhlIG5leHQgcGFy
YWdyYXBoIGlzIGluIHRoZSBzYW1lIGNlbGwuCiAgICBpZiAoZW5jbG9zaW5nQ2VsbCAmJiBlbmNs
b3NpbmdDZWxsICE9IGVuY2xvc2luZ05vZGVPZlR5cGUoZW5kT2ZOZXh0UGFyYWdyYXBoLmRlZXBF
cXVpdmFsZW50KCksICZpc1RhYmxlQ2VsbCkpCiAgICAgICAgYmxvY2tOb2RlID0gMDsKfQoKTm9k
ZSogRm9ybWF0QmxvY2tDb21tYW5kOjpub2RlVG9TcGxpdFRvKE5vZGUqIHN0YXJ0Tm9kZSkKewog
ICAgTm9kZSogbGFzdEJsb2NrID0gc3RhcnROb2RlOwogICAgTm9kZSogbiA9IDA7CiAgICBmb3Ig
KG4gPSBzdGFydE5vZGU7IG47IG4gPSBuLT5wYXJlbnROb2RlKCkpIHsKICAgICAgICBpZiAoIW4t
PmlzQ29udGVudEVkaXRhYmxlKCkpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmIChp
c1RhYmxlQ2VsbChuKSB8fCAhbi0+cGFyZW50Tm9kZSgpIHx8ICFuLT5wYXJlbnROb2RlKCktPmlz
Q29udGVudEVkaXRhYmxlKCkgfHwgdmFsaWRCbG9ja1RhZyhuLT5ub2RlTmFtZSgpLmxvd2VyKCkp
KQogICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICBpZiAoaXNMaXN0RWxlbWVudChuKSkKICAg
ICAgICAgICAgcmV0dXJuIGxhc3RCbG9jazsKICAgICAgICBpZiAoaXNCbG9jayhuKSkKICAgICAg
ICAgICAgbGFzdEJsb2NrID0gbjsKICAgIH0KICAgIHJldHVybiAwOwp9Cgp2b2lkIEZvcm1hdEJs
b2NrQ29tbWFuZDo6cmVtb3ZlRXhpc3RpbmdCbG9ja05vZGUoY29uc3QgVmlzaWJsZVBvc2l0aW9u
JiBlbmRPZkN1cnJlbnRQYXJhZ3JhcGgsIE5vZGUqIG91dGVyQmxvY2spCnsKICAgIFZpc2libGVQ
b3NpdGlvbiBzdGFydE9mQ3VycmVudFBhcmFncmFwaCA9IHN0YXJ0T2ZQYXJhZ3JhcGgoZW5kT2ZD
dXJyZW50UGFyYWdyYXBoKTsKICAgIE5vZGUqIHJlZk5vZGUgPSBlbmNsb3NpbmdCbG9ja0Zsb3dF
bGVtZW50KGVuZE9mQ3VycmVudFBhcmFncmFwaCk7CiAgICBOb2RlKiByb290ID0gZW5kT2ZDdXJy
ZW50UGFyYWdyYXBoLnJvb3RFZGl0YWJsZUVsZW1lbnQoKTsKICAgIGlmICh2YWxpZEJsb2NrVGFn
KHJlZk5vZGUtPm5vZGVOYW1lKCkubG93ZXIoKSkgJiYgc3RhcnRPZkN1cnJlbnRQYXJhZ3JhcGgg
PT0gdmlzaWJsZVBvc2l0aW9uQmVmb3JlTm9kZShyZWZOb2RlKQogICAgICAgICYmIGVuZE9mQ3Vy
cmVudFBhcmFncmFwaCA9PSB2aXNpYmxlUG9zaXRpb25BZnRlck5vZGUocmVmTm9kZSkgJiYgcmVm
Tm9kZSAhPSBvdXRlckJsb2NrICYmICFyb290LT5pc0Rlc2NlbmRhbnRPZihyZWZOb2RlKSkgewog
ICAgICAgIHJlbW92ZU5vZGVQcmVzZXJ2aW5nQ2hpbGRyZW4ocmVmTm9kZSk7CiAgICB9Cn0KCn0K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>69268</attachid>
            <date>2010-09-29 15:59:48 -0700</date>
            <delta_ts>2010-09-29 16:15:49 -0700</delta_ts>
            <desc>IndentOutdentCommand.cpp with patch</desc>
            <filename>IndentOutdentCommand.cpp</filename>
            <type>application/octet-stream</type>
            <size>18518</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQogKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCiAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAogKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSW5kZW50T3V0ZGVudENvbW1hbmRJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJJbmRlbnRPdXRkZW50Q29t
bWFuZC5oIgoKI2luY2x1ZGUgIkRvY3VtZW50LmgiCiNpbmNsdWRlICJFbGVtZW50LmgiCiNpbmNs
dWRlICJIVE1MQmxvY2txdW90ZUVsZW1lbnQuaCIKI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgojaW5j
bHVkZSAiSW5zZXJ0TGluZUJyZWFrQ29tbWFuZC5oIgojaW5jbHVkZSAiSW5zZXJ0TGlzdENvbW1h
bmQuaCIKI2luY2x1ZGUgIlJhbmdlLmgiCiNpbmNsdWRlICJTcGxpdEVsZW1lbnRDb21tYW5kLmgi
CiNpbmNsdWRlICJUZXh0LmgiCiNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKI2luY2x1ZGUgImh0
bWxlZGl0aW5nLmgiCiNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCiNpbmNsdWRlIDx3dGYvU3Rk
TGliRXh0cmFzLmg+CgpuYW1lc3BhY2UgV2ViQ29yZSB7Cgp1c2luZyBuYW1lc3BhY2UgSFRNTE5h
bWVzOwoKc3RhdGljIFN0cmluZyBpbmRlbnRCbG9ja3F1b3RlU3RyaW5nKCkKewogICAgREVGSU5F
X1NUQVRJQ19MT0NBTChTdHJpbmcsIHN0cmluZywgKCJ3ZWJraXQtaW5kZW50LWJsb2NrcXVvdGUi
KSk7CiAgICByZXR1cm4gc3RyaW5nOwp9CgpzdGF0aWMgUGFzc1JlZlB0cjxIVE1MQmxvY2txdW90
ZUVsZW1lbnQ+IGNyZWF0ZUluZGVudEJsb2NrcXVvdGVFbGVtZW50KERvY3VtZW50KiBkb2N1bWVu
dCkKewogICAgUmVmUHRyPEhUTUxCbG9ja3F1b3RlRWxlbWVudD4gZWxlbWVudCA9IEhUTUxCbG9j
a3F1b3RlRWxlbWVudDo6Y3JlYXRlKGRvY3VtZW50KTsKICAgIGVsZW1lbnQtPnNldEF0dHJpYnV0
ZShjbGFzc0F0dHIsIGluZGVudEJsb2NrcXVvdGVTdHJpbmcoKSk7CiAgICBlbGVtZW50LT5zZXRB
dHRyaWJ1dGUoc3R5bGVBdHRyLCAibWFyZ2luOiAwIDAgMCA0MHB4OyBib3JkZXI6IG5vbmU7IHBh
ZGRpbmc6IDBweDsiKTsKICAgIHJldHVybiBlbGVtZW50LnJlbGVhc2UoKTsKfQoKc3RhdGljIGJv
b2wgaXNMaXN0T3JJbmRlbnRCbG9ja3F1b3RlKGNvbnN0IE5vZGUqIG5vZGUpCnsKICAgIHJldHVy
biBub2RlICYmIChub2RlLT5oYXNUYWdOYW1lKHVsVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKG9s
VGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKGJsb2NrcXVvdGVUYWcpKTsKfQoKLy8gVGhpcyBmdW5j
dGlvbiBjYW4gcmV0dXJuIC0xIGlmIHdlIGFyZSB1bmFibGUgdG8gY291bnQgdGhlIHBhcmFncmFw
aHMgYmV0d2VlbiB8c3RhcnR8IGFuZCB8ZW5kfC4Kc3RhdGljIGludCBjb3VudFBhcmFncmFwaHMo
Y29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRPZkZpcnN0UGFyYWdyYXBoLCBjb25zdCBWaXNpYmxl
UG9zaXRpb24mIGVuZE9mTGFzdFBhcmFncmFwaCkKewogICAgaW50IGNvdW50ID0gMDsKICAgIFZp
c2libGVQb3NpdGlvbiBjdXIgPSBlbmRPZkZpcnN0UGFyYWdyYXBoOwogICAgd2hpbGUgKGN1ciAh
PSBlbmRPZkxhc3RQYXJhZ3JhcGgpIHsKICAgICAgICArK2NvdW50OwogICAgICAgIGN1ciA9IGVu
ZE9mUGFyYWdyYXBoKGN1ci5uZXh0KCkpOwogICAgICAgIC8vIElmIHN0YXJ0IGlzIGJlZm9yZSBh
IHRhYmxlIGFuZCBlbmQgaXMgaW5zaWRlIGEgdGFibGUsIHdlIHdpbGwgbmV2ZXIgaGl0IGVuZCBi
ZWNhdXNlIHRoZQogICAgICAgIC8vIHdob2xlIHRhYmxlIGlzIGNvbnNpZGVyZWQgYSBzaW5nbGUg
cGFyYWdyYXBoLgogICAgICAgIGlmIChjdXIuaXNOdWxsKCkpCiAgICAgICAgICAgIHJldHVybiAt
MTsKICAgIH0KICAgIHJldHVybiBjb3VudDsKfQoKSW5kZW50T3V0ZGVudENvbW1hbmQ6OkluZGVu
dE91dGRlbnRDb21tYW5kKERvY3VtZW50KiBkb2N1bWVudCwgRUluZGVudFR5cGUgdHlwZU9mQWN0
aW9uLCBpbnQgbWFyZ2luSW5QaXhlbHMpCiAgICA6IENvbXBvc2l0ZUVkaXRDb21tYW5kKGRvY3Vt
ZW50KSwgbV90eXBlT2ZBY3Rpb24odHlwZU9mQWN0aW9uKSwgbV9tYXJnaW5JblBpeGVscyhtYXJn
aW5JblBpeGVscykKewp9Cgpib29sIEluZGVudE91dGRlbnRDb21tYW5kOjp0cnlJbmRlbnRpbmdB
c0xpc3RJdGVtKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZDdXJyZW50UGFyYWdyYXBoKQp7
CiAgICAvLyBJZiBvdXIgc2VsZWN0aW9uIGlzIG5vdCBpbnNpZGUgYSBsaXN0LCBiYWlsIG91dC4K
ICAgIE5vZGUqIGxhc3ROb2RlSW5TZWxlY3RlZFBhcmFncmFwaCA9IGVuZE9mQ3VycmVudFBhcmFn
cmFwaC5kZWVwRXF1aXZhbGVudCgpLm5vZGUoKTsKICAgIFJlZlB0cjxFbGVtZW50PiBsaXN0Tm9k
ZSA9IGVuY2xvc2luZ0xpc3QobGFzdE5vZGVJblNlbGVjdGVkUGFyYWdyYXBoKTsKICAgIGlmICgh
bGlzdE5vZGUpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIC8vIEZpbmQgdGhlIGJsb2NrIHRo
YXQgd2Ugd2FudCB0byBpbmRlbnQuICBJZiBpdCdzIG5vdCBhIGxpc3QgaXRlbSAoZS5nLiwgYSBk
aXYgaW5zaWRlIGEgbGlzdCBpdGVtKSwgd2UgYmFpbCBvdXQuCiAgICBFbGVtZW50KiBzZWxlY3Rl
ZExpc3RJdGVtID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KGVuY2xvc2luZ0Jsb2NrKGxhc3ROb2Rl
SW5TZWxlY3RlZFBhcmFncmFwaCkpOwoKICAgIC8vIEZJWE1FOiB3ZSBuZWVkIHRvIGRlYWwgd2l0
aCB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBsaSAobWFsZm9ybWVkIEhUTUwpCiAgICBpZiAo
IXNlbGVjdGVkTGlzdEl0ZW0tPmhhc1RhZ05hbWUobGlUYWcpKQogICAgICAgIHJldHVybiBmYWxz
ZTsKICAgIAogICAgLy8gRklYTUU6IHByZXZpb3VzRWxlbWVudFNpYmxpbmcgZG9lcyBub3QgaWdu
b3JlIG5vbi1yZW5kZXJlZCBjb250ZW50IGxpa2UgPHNwYW4+PC9zcGFuPi4gIFNob3VsZCB3ZT8K
ICAgIEVsZW1lbnQqIHByZXZpb3VzTGlzdCA9IHNlbGVjdGVkTGlzdEl0ZW0tPnByZXZpb3VzRWxl
bWVudFNpYmxpbmcoKTsKICAgIEVsZW1lbnQqIG5leHRMaXN0ID0gc2VsZWN0ZWRMaXN0SXRlbS0+
bmV4dEVsZW1lbnRTaWJsaW5nKCk7CgogICAgUmVmUHRyPEVsZW1lbnQ+IG5ld0xpc3QgPSBkb2N1
bWVudCgpLT5jcmVhdGVFbGVtZW50KGxpc3ROb2RlLT50YWdRTmFtZSgpLCBmYWxzZSk7CiAgICBp
bnNlcnROb2RlQmVmb3JlKG5ld0xpc3QsIHNlbGVjdGVkTGlzdEl0ZW0pOwoKICAgIG1vdmVQYXJh
Z3JhcGhXaXRoQ2xvbmVzKHN0YXJ0T2ZQYXJhZ3JhcGgoZW5kT2ZDdXJyZW50UGFyYWdyYXBoKSwg
ZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBuZXdMaXN0LmdldCgpLCBzZWxlY3RlZExpc3RJdGVtKTsK
CiAgICBpZiAoY2FuTWVyZ2VMaXN0cyhwcmV2aW91c0xpc3QsIG5ld0xpc3QuZ2V0KCkpKQogICAg
ICAgIG1lcmdlSWRlbnRpY2FsRWxlbWVudHMocHJldmlvdXNMaXN0LCBuZXdMaXN0KTsKICAgIGlm
IChjYW5NZXJnZUxpc3RzKG5ld0xpc3QuZ2V0KCksIG5leHRMaXN0KSkKICAgICAgICBtZXJnZUlk
ZW50aWNhbEVsZW1lbnRzKG5ld0xpc3QsIG5leHRMaXN0KTsKCiAgICByZXR1cm4gdHJ1ZTsKfQoK
dm9pZCBJbmRlbnRPdXRkZW50Q29tbWFuZDo6aW5kZW50SW50b0Jsb2NrcXVvdGUoY29uc3QgVmlz
aWJsZVBvc2l0aW9uJiBlbmRPZkN1cnJlbnRQYXJhZ3JhcGgsIGNvbnN0IFZpc2libGVQb3NpdGlv
biYgZW5kT2ZOZXh0UGFyYWdyYXBoLCBSZWZQdHI8RWxlbWVudD4mIHRhcmdldEJsb2NrcXVvdGUp
CnsKICAgIE5vZGUqIGVuY2xvc2luZ0NlbGwgPSAwOwoKICAgIFBvc2l0aW9uIHN0YXJ0ID0gc3Rh
cnRPZlBhcmFncmFwaChlbmRPZkN1cnJlbnRQYXJhZ3JhcGgpLmRlZXBFcXVpdmFsZW50KCk7CiAg
ICBlbmNsb3NpbmdDZWxsID0gZW5jbG9zaW5nTm9kZU9mVHlwZShzdGFydCwgJmlzVGFibGVDZWxs
KTsKICAgIE5vZGUqIG5vZGVUb1NwbGl0VG87CiAgICBpZiAoZW5jbG9zaW5nQ2VsbCkKICAgICAg
ICBub2RlVG9TcGxpdFRvID0gZW5jbG9zaW5nQ2VsbDsKICAgIGVsc2UgaWYgKGVuY2xvc2luZ0xp
c3Qoc3RhcnQubm9kZSgpKSkKICAgICAgICBub2RlVG9TcGxpdFRvID0gZW5jbG9zaW5nQmxvY2so
c3RhcnQubm9kZSgpKTsKICAgIGVsc2UKICAgICAgICBub2RlVG9TcGxpdFRvID0gZWRpdGFibGVS
b290Rm9yUG9zaXRpb24oc3RhcnQpOwoKICAgIFJlZlB0cjxOb2RlPiBvdXRlckJsb2NrID0gKHN0
YXJ0Lm5vZGUoKSA9PSBub2RlVG9TcGxpdFRvKSA/IHN0YXJ0Lm5vZGUoKSA6IHNwbGl0VHJlZVRv
Tm9kZShzdGFydC5ub2RlKCksIG5vZGVUb1NwbGl0VG8pOwoKICAgIGlmICghdGFyZ2V0QmxvY2tx
dW90ZSkgewogICAgICAgIC8vIENyZWF0ZSBhIG5ldyBibG9ja3F1b3RlIGFuZCBpbnNlcnQgaXQg
YXMgYSBjaGlsZCBvZiB0aGUgcm9vdCBlZGl0YWJsZSBlbGVtZW50LiBXZSBhY2NvbXBsaXNoCiAg
ICAgICAgLy8gdGhpcyBieSBzcGxpdHRpbmcgYWxsIHBhcmVudHMgb2YgdGhlIGN1cnJlbnQgcGFy
YWdyYXBoIHVwIHRvIHRoYXQgcG9pbnQuCiAgICAgICAgdGFyZ2V0QmxvY2txdW90ZSA9IGNyZWF0
ZUluZGVudEJsb2NrcXVvdGVFbGVtZW50KGRvY3VtZW50KCkpOwogICAgICAgIGluc2VydE5vZGVC
ZWZvcmUodGFyZ2V0QmxvY2txdW90ZSwgb3V0ZXJCbG9jayk7CiAgICB9CgogICAgbW92ZVBhcmFn
cmFwaFdpdGhDbG9uZXMoc3RhcnRPZlBhcmFncmFwaChlbmRPZkN1cnJlbnRQYXJhZ3JhcGgpLCBl
bmRPZkN1cnJlbnRQYXJhZ3JhcGgsIHRhcmdldEJsb2NrcXVvdGUuZ2V0KCksIG91dGVyQmxvY2su
Z2V0KCkpOwogICAgCiAgICAvLyBEb24ndCBwdXQgdGhlIG5leHQgcGFyYWdyYXBoIGluIHRoZSBi
bG9ja3F1b3RlIHdlIGp1c3QgY3JlYXRlZCBmb3IgdGhpcyBwYXJhZ3JhcGggdW5sZXNzIAogICAg
Ly8gdGhlIG5leHQgcGFyYWdyYXBoIGlzIGluIHRoZSBzYW1lIGNlbGwuCiAgICBpZiAoZW5jbG9z
aW5nQ2VsbCAmJiBlbmNsb3NpbmdDZWxsICE9IGVuY2xvc2luZ05vZGVPZlR5cGUoZW5kT2ZOZXh0
UGFyYWdyYXBoLmRlZXBFcXVpdmFsZW50KCksICZpc1RhYmxlQ2VsbCkpCiAgICAgICAgdGFyZ2V0
QmxvY2txdW90ZSA9IDA7Cn0KCnZvaWQgSW5kZW50T3V0ZGVudENvbW1hbmQ6OmluZGVudFJlZ2lv
bihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHN0YXJ0T2ZTZWxlY3Rpb24sIGNvbnN0IFZpc2libGVQ
b3NpdGlvbiYgZW5kT2ZTZWxlY3Rpb24pCnsKICAgIC8vIFNwZWNpYWwgY2FzZSBlbXB0eSB1bnNw
bGl0dGFibGUgZWxlbWVudHMgYmVjYXVzZSB0aGVyZSdzIG5vdGhpbmcgdG8gc3BsaXQKICAgIC8v
IGFuZCB0aGVyZSdzIG5vdGhpbmcgdG8gbW92ZS4KICAgIFBvc2l0aW9uIHN0YXJ0ID0gc3RhcnRP
ZlNlbGVjdGlvbi5kZWVwRXF1aXZhbGVudCgpLmRvd25zdHJlYW0oKTsKICAgIGlmIChpc0F0VW5z
cGxpdHRhYmxlRWxlbWVudChzdGFydCkpIHsKICAgICAgICBSZWZQdHI8RWxlbWVudD4gYmxvY2tx
dW90ZSA9IGNyZWF0ZUluZGVudEJsb2NrcXVvdGVFbGVtZW50KGRvY3VtZW50KCkpOwogICAgICAg
IGluc2VydE5vZGVBdChibG9ja3F1b3RlLCBzdGFydCk7CiAgICAgICAgUmVmUHRyPEVsZW1lbnQ+
IHBsYWNlaG9sZGVyID0gY3JlYXRlQnJlYWtFbGVtZW50KGRvY3VtZW50KCkpOwogICAgICAgIGFw
cGVuZE5vZGUocGxhY2Vob2xkZXIsIGJsb2NrcXVvdGUpOwogICAgICAgIHNldEVuZGluZ1NlbGVj
dGlvbihWaXNpYmxlU2VsZWN0aW9uKFBvc2l0aW9uKHBsYWNlaG9sZGVyLmdldCgpLCAwKSwgRE9X
TlNUUkVBTSkpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBSZWZQdHI8RWxlbWVudD4gYmxv
Y2txdW90ZUZvck5leHRJbmRlbnQ7CiAgICBWaXNpYmxlUG9zaXRpb24gZW5kT2ZDdXJyZW50UGFy
YWdyYXBoID0gZW5kT2ZQYXJhZ3JhcGgoc3RhcnRPZlNlbGVjdGlvbik7CiAgICBWaXNpYmxlUG9z
aXRpb24gZW5kQWZ0ZXJTZWxlY3Rpb24gPSBlbmRPZlBhcmFncmFwaChlbmRPZlBhcmFncmFwaChl
bmRPZlNlbGVjdGlvbikubmV4dCgpKTsKICAgIGludCBlbmRPZkN1cnJlbnRQYXJhZ3JhcGhJbmRl
eCA9IGluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uKGVuZE9mQ3VycmVudFBhcmFncmFwaCk7CiAgICBp
bnQgZW5kQWZ0ZXJTZWxlY3Rpb25JbmRleCA9IGluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uKGVuZEFm
dGVyU2VsZWN0aW9uKTsKCiAgICAvLyBXaGVuIGluZGVudGluZyB3aXRoaW4gYSA8cHJlPiB0YWcs
IHdlIG5lZWQgdG8gc3BsaXQgZWFjaCBwYXJhZ3JhcGggaW50byBhIHNlcGFyYXRlIG5vZGUgZm9y
IG1vdmVQYXJhZ3JhcGhXaXRoQ2xvbmVzIHRvIHdvcmsuCiAgICAvLyBIb3dldmVyLCBzcGxpdHRp
bmcgdGV4dCBub2RlcyBjYW4gY2F1c2UgZW5kT2ZDdXJyZW50UGFyYWdyYXBoIGFuZCBlbmRBZnRl
clNlbGVjdGlvbiB0byBwb2ludCB0byBhbiBpbnZhbGlkIHBvc2l0aW9uIGlmIHdlCiAgICAvLyBj
aGFuZ2VkIHRoZSB0ZXh0IG5vZGUgaXQgd2FzIHBvaW50aW5nIGF0LiAgU28gd2UgaGF2ZSB0byBy
ZXNldCB0aGVzZSBwb3NpdGlvbnMuCiAgICBpbnQgbnVtUGFyYWdyYXBocyA9IGNvdW50UGFyYWdy
YXBocyhlbmRPZkN1cnJlbnRQYXJhZ3JhcGgsIGVuZEFmdGVyU2VsZWN0aW9uKTsKICAgIGlmIChz
cGxpdFRleHROb2RlcyhzdGFydE9mUGFyYWdyYXBoKHN0YXJ0T2ZTZWxlY3Rpb24pLCBudW1QYXJh
Z3JhcGhzICsgMSkpIHsKICAgICAgICBSZWZQdHI8UmFuZ2U+IGVuZE9mQ3VycmVudFBhcmFncmFw
aFJhbmdlID0gVGV4dEl0ZXJhdG9yOjpyYW5nZUZyb21Mb2NhdGlvbkFuZExlbmd0aChkb2N1bWVu
dCgpLT5kb2N1bWVudEVsZW1lbnQoKSwgZW5kT2ZDdXJyZW50UGFyYWdyYXBoSW5kZXgsIDAsIHRy
dWUpOwogICAgICAgIFJlZlB0cjxSYW5nZT4gZW5kQWZ0ZXJTZWxlY3Rpb25SYW5nZSA9IFRleHRJ
dGVyYXRvcjo6cmFuZ2VGcm9tTG9jYXRpb25BbmRMZW5ndGgoZG9jdW1lbnQoKS0+ZG9jdW1lbnRF
bGVtZW50KCksIGVuZEFmdGVyU2VsZWN0aW9uSW5kZXgsIDAsIHRydWUpOwogICAgICAgIGlmICgh
ZW5kT2ZDdXJyZW50UGFyYWdyYXBoUmFuZ2UuZ2V0KCkgfHwgIWVuZEFmdGVyU2VsZWN0aW9uUmFu
Z2UuZ2V0KCkpIHsKICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgICAgICAg
IHJldHVybjsKICAgICAgICB9CiAgICAgICAgZW5kT2ZDdXJyZW50UGFyYWdyYXBoID0gVmlzaWJs
ZVBvc2l0aW9uKGVuZE9mQ3VycmVudFBhcmFncmFwaFJhbmdlLT5zdGFydFBvc2l0aW9uKCksIERP
V05TVFJFQU0pOwogICAgICAgIGVuZEFmdGVyU2VsZWN0aW9uID0gVmlzaWJsZVBvc2l0aW9uKGVu
ZEFmdGVyU2VsZWN0aW9uUmFuZ2UtPnN0YXJ0UG9zaXRpb24oKSwgRE9XTlNUUkVBTSk7CiAgICB9
CgogICAgd2hpbGUgKGVuZE9mQ3VycmVudFBhcmFncmFwaCAhPSBlbmRBZnRlclNlbGVjdGlvbikg
ewogICAgICAgIC8vIEl0ZXJhdGUgYWNyb3NzIHRoZSBzZWxlY3RlZCBwYXJhZ3JhcGhzLi4uCiAg
ICAgICAgVmlzaWJsZVBvc2l0aW9uIGVuZE9mTmV4dFBhcmFncmFwaCA9IGVuZE9mUGFyYWdyYXBo
KGVuZE9mQ3VycmVudFBhcmFncmFwaC5uZXh0KCkpOwogICAgICAgIGlmICh0cnlJbmRlbnRpbmdB
c0xpc3RJdGVtKGVuZE9mQ3VycmVudFBhcmFncmFwaCkpCiAgICAgICAgICAgIGJsb2NrcXVvdGVG
b3JOZXh0SW5kZW50ID0gMDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGluZGVudEludG9CbG9j
a3F1b3RlKGVuZE9mQ3VycmVudFBhcmFncmFwaCwgZW5kT2ZOZXh0UGFyYWdyYXBoLCBibG9ja3F1
b3RlRm9yTmV4dEluZGVudCk7CgogICAgICAgIC8vIGluZGVudEludG9CbG9ja3F1b3RlIGNvdWxk
IG1vdmUgbW9yZSB0aGFuIG9uZSBwYXJhZ3JhcGggaWYgdGhlIHBhcmFncmFwaAogICAgICAgIC8v
IGlzIGluIGEgbGlzdCBpdGVtIG9yIGEgdGFibGUuIEFzIGEgcmVzdWx0LCBlbmRBZnRlclNlbGVj
dGlvbiBjb3VsZCByZWZlciB0byBhIHBvc2l0aW9uCiAgICAgICAgLy8gbm8gbG9uZ2VyIGluIHRo
ZSBkb2N1bWVudC4KICAgICAgICBpZiAoZW5kQWZ0ZXJTZWxlY3Rpb24uaXNOb3ROdWxsKCkgJiYg
IWVuZEFmdGVyU2VsZWN0aW9uLmRlZXBFcXVpdmFsZW50KCkubm9kZSgpLT5pbkRvY3VtZW50KCkp
CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIFNhbml0eSBjaGVjazogTWFrZSBzdXJlIG91
ciBtb3ZlUGFyYWdyYXBoIGNhbGxzIGRpZG4ndCByZW1vdmUgZW5kT2ZOZXh0UGFyYWdyYXBoLmRl
ZXBFcXVpdmFsZW50KCkubm9kZSgpCiAgICAgICAgLy8gSWYgc29tZWhvdyB3ZSBkaWQsIHJldHVy
biB0byBwcmV2ZW50IGNyYXNoZXMuCiAgICAgICAgaWYgKGVuZE9mTmV4dFBhcmFncmFwaC5pc05v
dE51bGwoKSAmJiAhZW5kT2ZOZXh0UGFyYWdyYXBoLmRlZXBFcXVpdmFsZW50KCkubm9kZSgpLT5p
bkRvY3VtZW50KCkpIHsKICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgICAg
ICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZW5kT2ZDdXJyZW50UGFyYWdyYXBoID0gZW5k
T2ZOZXh0UGFyYWdyYXBoOwogICAgfSAgIAp9CgovLyBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qg
b25lIHRleHQgbm9kZSB3YXMgc3BsaXQuCmJvb2wgSW5kZW50T3V0ZGVudENvbW1hbmQ6OnNwbGl0
VGV4dE5vZGVzKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgc3RhcnQsIGludCBudW1QYXJhZ3JhcGhz
KQp7CiAgICBWaXNpYmxlUG9zaXRpb24gY3VycmVudFBhcmFncmFwaFN0YXJ0ID0gc3RhcnQ7CiAg
ICBib29sIGhhc1NwbGl0ID0gZmFsc2U7CiAgICBpbnQgcGFyYWdyYXBoQ291bnQ7CiAgICBmb3Ig
KHBhcmFncmFwaENvdW50ID0gMDsgcGFyYWdyYXBoQ291bnQgPCBudW1QYXJhZ3JhcGhzOyArK3Bh
cmFncmFwaENvdW50KSB7CiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHBhcmFncmFw
aHMgaW4gYSBzaW5nbGUgdGV4dCBub2RlLCB3ZSBzcGxpdCB0aGUgdGV4dCBub2RlIGludG8gYSBz
ZXBhcmF0ZSBub2RlIGZvciBlYWNoIHBhcmFncmFwaC4KICAgICAgICBpZiAoY3VycmVudFBhcmFn
cmFwaFN0YXJ0LmRlZXBFcXVpdmFsZW50KCkubm9kZSgpLT5pc1RleHROb2RlKCkgJiYgY3VycmVu
dFBhcmFncmFwaFN0YXJ0LmRlZXBFcXVpdmFsZW50KCkubm9kZSgpID09IHN0YXJ0T2ZQYXJhZ3Jh
cGgoY3VycmVudFBhcmFncmFwaFN0YXJ0LnByZXZpb3VzKCkpLmRlZXBFcXVpdmFsZW50KCkubm9k
ZSgpKSB7CiAgICAgICAgICAgIFRleHQqIHRleHROb2RlID0gc3RhdGljX2Nhc3Q8VGV4dCAqPihj
dXJyZW50UGFyYWdyYXBoU3RhcnQuZGVlcEVxdWl2YWxlbnQoKS5ub2RlKCkpOwogICAgICAgICAg
ICBpbnQgb2Zmc2V0ID0gY3VycmVudFBhcmFncmFwaFN0YXJ0LmRlZXBFcXVpdmFsZW50KCkub2Zm
c2V0SW5Db250YWluZXJOb2RlKCk7CiAgICAgICAgICAgIHNwbGl0VGV4dE5vZGUodGV4dE5vZGUs
IG9mZnNldCk7CiAgICAgICAgICAgIGN1cnJlbnRQYXJhZ3JhcGhTdGFydCA9IFZpc2libGVQb3Np
dGlvbih0ZXh0Tm9kZSwgMCwgVlBfREVGQVVMVF9BRkZJTklUWSk7CiAgICAgICAgICAgIGhhc1Nw
bGl0ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgVmlzaWJsZVBvc2l0aW9uIG5leHRQYXJhZ3Jh
cGggPSBzdGFydE9mUGFyYWdyYXBoKGVuZE9mUGFyYWdyYXBoKGN1cnJlbnRQYXJhZ3JhcGhTdGFy
dCkubmV4dCgpKTsKICAgICAgICBpZiAobmV4dFBhcmFncmFwaC5pc051bGwoKSkKICAgICAgICAg
ICAgYnJlYWs7CiAgICAgICAgY3VycmVudFBhcmFncmFwaFN0YXJ0ID0gbmV4dFBhcmFncmFwaDsK
ICAgIH0KICAgIHJldHVybiBoYXNTcGxpdDsKfQoKdm9pZCBJbmRlbnRPdXRkZW50Q29tbWFuZDo6
b3V0ZGVudFBhcmFncmFwaCgpCnsKICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlU3RhcnRPZlBh
cmFncmFwaCA9IHN0YXJ0T2ZQYXJhZ3JhcGgoZW5kaW5nU2VsZWN0aW9uKCkudmlzaWJsZVN0YXJ0
KCkpOwogICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVFbmRPZlBhcmFncmFwaCA9IGVuZE9mUGFy
YWdyYXBoKHZpc2libGVTdGFydE9mUGFyYWdyYXBoKTsKCiAgICBOb2RlKiBlbmNsb3NpbmdOb2Rl
ID0gZW5jbG9zaW5nTm9kZU9mVHlwZSh2aXNpYmxlU3RhcnRPZlBhcmFncmFwaC5kZWVwRXF1aXZh
bGVudCgpLCAmaXNMaXN0T3JJbmRlbnRCbG9ja3F1b3RlKTsKICAgIGlmICghZW5jbG9zaW5nTm9k
ZSB8fCAhZW5jbG9zaW5nTm9kZS0+cGFyZW50Tm9kZSgpLT5pc0NvbnRlbnRFZGl0YWJsZSgpKSAg
Ly8gV2UgY2FuJ3Qgb3V0ZGVudCBpZiB0aGVyZSBpcyBubyBwbGFjZSB0byBnbyEKICAgICAgICBy
ZXR1cm47CgogICAgLy8gVXNlIEluc2VydExpc3RDb21tYW5kIHRvIHJlbW92ZSB0aGUgc2VsZWN0
aW9uIGZyb20gdGhlIGxpc3QKICAgIGlmIChlbmNsb3NpbmdOb2RlLT5oYXNUYWdOYW1lKG9sVGFn
KSkgewogICAgICAgIGFwcGx5Q29tbWFuZFRvQ29tcG9zaXRlKEluc2VydExpc3RDb21tYW5kOjpj
cmVhdGUoZG9jdW1lbnQoKSwgSW5zZXJ0TGlzdENvbW1hbmQ6Ok9yZGVyZWRMaXN0KSk7CiAgICAg
ICAgcmV0dXJuOyAgICAgICAgCiAgICB9CiAgICBpZiAoZW5jbG9zaW5nTm9kZS0+aGFzVGFnTmFt
ZSh1bFRhZykpIHsKICAgICAgICBhcHBseUNvbW1hbmRUb0NvbXBvc2l0ZShJbnNlcnRMaXN0Q29t
bWFuZDo6Y3JlYXRlKGRvY3VtZW50KCksIEluc2VydExpc3RDb21tYW5kOjpVbm9yZGVyZWRMaXN0
KSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICAvLyBUaGUgc2VsZWN0aW9uIGlzIGlu
c2lkZSBhIGJsb2NrcXVvdGUgaS5lLiBlbmNsb3NpbmdOb2RlIGlzIGEgYmxvY2txdW90ZQogICAg
VmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9uSW5FbmNsb3NpbmdCbG9jayA9IFZpc2libGVQb3NpdGlv
bihQb3NpdGlvbihlbmNsb3NpbmdOb2RlLCAwKSk7CiAgICBWaXNpYmxlUG9zaXRpb24gc3RhcnRP
ZkVuY2xvc2luZ0Jsb2NrID0gc3RhcnRPZkJsb2NrKHBvc2l0aW9uSW5FbmNsb3NpbmdCbG9jayk7
CiAgICBWaXNpYmxlUG9zaXRpb24gbGFzdFBvc2l0aW9uSW5FbmNsb3NpbmdCbG9jayA9IFZpc2li
bGVQb3NpdGlvbihQb3NpdGlvbihlbmNsb3NpbmdOb2RlLCBlbmNsb3NpbmdOb2RlLT5jaGlsZE5v
ZGVDb3VudCgpKSk7CiAgICBWaXNpYmxlUG9zaXRpb24gZW5kT2ZFbmNsb3NpbmdCbG9jayA9IGVu
ZE9mQmxvY2sobGFzdFBvc2l0aW9uSW5FbmNsb3NpbmdCbG9jayk7CiAgICBpZiAodmlzaWJsZVN0
YXJ0T2ZQYXJhZ3JhcGggPT0gc3RhcnRPZkVuY2xvc2luZ0Jsb2NrICYmCiAgICAgICAgdmlzaWJs
ZUVuZE9mUGFyYWdyYXBoID09IGVuZE9mRW5jbG9zaW5nQmxvY2spIHsKICAgICAgICAvLyBUaGUg
YmxvY2txdW90ZSBkb2Vzbid0IGNvbnRhaW4gYW55dGhpbmcgb3V0c2lkZSB0aGUgcGFyYWdyYXBo
LCBzbyBpdCBjYW4gYmUgdG90YWxseSByZW1vdmVkLgogICAgICAgIE5vZGUqIHNwbGl0UG9pbnQg
PSBlbmNsb3NpbmdOb2RlLT5uZXh0U2libGluZygpOwogICAgICAgIHJlbW92ZU5vZGVQcmVzZXJ2
aW5nQ2hpbGRyZW4oZW5jbG9zaW5nTm9kZSk7CiAgICAgICAgLy8gb3V0ZGVudFJlZ2lvbigpIGFz
c3VtZXMgaXQgaXMgb3BlcmF0aW5nIG9uIHRoZSBmaXJzdCBwYXJhZ3JhcGggb2YgYW4gZW5jbG9z
aW5nIGJsb2NrcXVvdGUsIGJ1dCBpZiB0aGVyZSBhcmUgbXVsdGlwbHkgbmVzdGVkIGJsb2NrcXVv
dGVzIGFuZCB3ZSd2ZQogICAgICAgIC8vIGp1c3QgcmVtb3ZlZCBvbmUsIHRoZW4gdGhpcyBhc3N1
bXB0aW9uIGlzbid0IHRydWUuIEJ5IHNwbGl0dGluZyB0aGUgbmV4dCBjb250YWluaW5nIGJsb2Nr
cXVvdGUgYWZ0ZXIgdGhpcyBub2RlLCB3ZSBrZWVwIHRoaXMgYXNzdW1wdGlvbiB0cnVlCiAgICAg
ICAgaWYgKHNwbGl0UG9pbnQpIHsKICAgICAgICAgICAgaWYgKE5vZGUqIHNwbGl0UG9pbnRQYXJl
bnQgPSBzcGxpdFBvaW50LT5wYXJlbnROb2RlKCkpIHsKICAgICAgICAgICAgICAgIGlmIChzcGxp
dFBvaW50UGFyZW50LT5oYXNUYWdOYW1lKGJsb2NrcXVvdGVUYWcpCiAgICAgICAgICAgICAgICAg
ICAgJiYgIXNwbGl0UG9pbnQtPmhhc1RhZ05hbWUoYmxvY2txdW90ZVRhZykKICAgICAgICAgICAg
ICAgICAgICAmJiBzcGxpdFBvaW50UGFyZW50LT5wYXJlbnROb2RlKCktPmlzQ29udGVudEVkaXRh
YmxlKCkpIC8vIFdlIGNhbid0IG91dGRlbnQgaWYgdGhlcmUgaXMgbm8gcGxhY2UgdG8gZ28hCiAg
ICAgICAgICAgICAgICAgICAgc3BsaXRFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihzcGxp
dFBvaW50UGFyZW50KSwgc3BsaXRQb2ludCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAg
ICAgCiAgICAgICAgdXBkYXRlTGF5b3V0KCk7CiAgICAgICAgdmlzaWJsZVN0YXJ0T2ZQYXJhZ3Jh
cGggPSBWaXNpYmxlUG9zaXRpb24odmlzaWJsZVN0YXJ0T2ZQYXJhZ3JhcGguZGVlcEVxdWl2YWxl
bnQoKSk7CiAgICAgICAgdmlzaWJsZUVuZE9mUGFyYWdyYXBoID0gVmlzaWJsZVBvc2l0aW9uKHZp
c2libGVFbmRPZlBhcmFncmFwaC5kZWVwRXF1aXZhbGVudCgpKTsKICAgICAgICBpZiAodmlzaWJs
ZVN0YXJ0T2ZQYXJhZ3JhcGguaXNOb3ROdWxsKCkgJiYgIWlzU3RhcnRPZlBhcmFncmFwaCh2aXNp
YmxlU3RhcnRPZlBhcmFncmFwaCkpCiAgICAgICAgICAgIGluc2VydE5vZGVBdChjcmVhdGVCcmVh
a0VsZW1lbnQoZG9jdW1lbnQoKSksIHZpc2libGVTdGFydE9mUGFyYWdyYXBoLmRlZXBFcXVpdmFs
ZW50KCkpOwogICAgICAgIGlmICh2aXNpYmxlRW5kT2ZQYXJhZ3JhcGguaXNOb3ROdWxsKCkgJiYg
IWlzRW5kT2ZQYXJhZ3JhcGgodmlzaWJsZUVuZE9mUGFyYWdyYXBoKSkKICAgICAgICAgICAgaW5z
ZXJ0Tm9kZUF0KGNyZWF0ZUJyZWFrRWxlbWVudChkb2N1bWVudCgpKSwgdmlzaWJsZUVuZE9mUGFy
YWdyYXBoLmRlZXBFcXVpdmFsZW50KCkpOwoKICAgICAgICByZXR1cm47CiAgICB9CiAgICBOb2Rl
KiBlbmNsb3NpbmdCbG9ja0Zsb3cgPSBlbmNsb3NpbmdCbG9jayh2aXNpYmxlU3RhcnRPZlBhcmFn
cmFwaC5kZWVwRXF1aXZhbGVudCgpLm5vZGUoKSk7CiAgICBSZWZQdHI8Tm9kZT4gc3BsaXRCbG9j
a3F1b3RlTm9kZSA9IGVuY2xvc2luZ05vZGU7CiAgICBpZiAoZW5jbG9zaW5nQmxvY2tGbG93ICE9
IGVuY2xvc2luZ05vZGUpCiAgICAgICAgc3BsaXRCbG9ja3F1b3RlTm9kZSA9IHNwbGl0VHJlZVRv
Tm9kZShlbmNsb3NpbmdCbG9ja0Zsb3csIGVuY2xvc2luZ05vZGUsIHRydWUpOwogICAgZWxzZSB7
CiAgICAgICAgLy8gV2Ugc3BsaXQgdGhlIGJsb2NrcXVvdGUgYXQgd2hlcmUgd2Ugc3RhcnQgb3V0
ZGVudGluZy4KICAgICAgICBzcGxpdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+KGVuY2xv
c2luZ05vZGUpLCB2aXNpYmxlU3RhcnRPZlBhcmFncmFwaC5kZWVwRXF1aXZhbGVudCgpLm5vZGUo
KSk7CiAgICB9CiAgICBSZWZQdHI8Tm9kZT4gcGxhY2Vob2xkZXIgPSBjcmVhdGVCcmVha0VsZW1l
bnQoZG9jdW1lbnQoKSk7CiAgICBpbnNlcnROb2RlQmVmb3JlKHBsYWNlaG9sZGVyLCBzcGxpdEJs
b2NrcXVvdGVOb2RlKTsKICAgIG1vdmVQYXJhZ3JhcGgoc3RhcnRPZlBhcmFncmFwaCh2aXNpYmxl
U3RhcnRPZlBhcmFncmFwaCksIGVuZE9mUGFyYWdyYXBoKHZpc2libGVFbmRPZlBhcmFncmFwaCks
IFZpc2libGVQb3NpdGlvbihQb3NpdGlvbihwbGFjZWhvbGRlci5nZXQoKSwgMCkpLCB0cnVlKTsK
fQoKdm9pZCBJbmRlbnRPdXRkZW50Q29tbWFuZDo6b3V0ZGVudFJlZ2lvbihjb25zdCBWaXNpYmxl
UG9zaXRpb24mIHN0YXJ0T2ZTZWxlY3Rpb24sIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZT
ZWxlY3Rpb24pCnsKICAgIFZpc2libGVQb3NpdGlvbiBlbmRPZkxhc3RQYXJhZ3JhcGggPSBlbmRP
ZlBhcmFncmFwaChlbmRPZlNlbGVjdGlvbik7CgogICAgaWYgKGVuZE9mUGFyYWdyYXBoKHN0YXJ0
T2ZTZWxlY3Rpb24pID09IGVuZE9mTGFzdFBhcmFncmFwaCkgewogICAgICAgIG91dGRlbnRQYXJh
Z3JhcGgoKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAKICAgIFBvc2l0aW9uIG9yaWdpbmFs
U2VsZWN0aW9uRW5kID0gZW5kaW5nU2VsZWN0aW9uKCkuZW5kKCk7CiAgICBWaXNpYmxlUG9zaXRp
b24gZW5kT2ZDdXJyZW50UGFyYWdyYXBoID0gZW5kT2ZQYXJhZ3JhcGgoc3RhcnRPZlNlbGVjdGlv
bik7CiAgICBWaXNpYmxlUG9zaXRpb24gZW5kQWZ0ZXJTZWxlY3Rpb24gPSBlbmRPZlBhcmFncmFw
aChlbmRPZlBhcmFncmFwaChlbmRPZlNlbGVjdGlvbikubmV4dCgpKTsKCiAgICB3aGlsZSAoZW5k
T2ZDdXJyZW50UGFyYWdyYXBoICE9IGVuZEFmdGVyU2VsZWN0aW9uKSB7CiAgICAgICAgVmlzaWJs
ZVBvc2l0aW9uIGVuZE9mTmV4dFBhcmFncmFwaCA9IGVuZE9mUGFyYWdyYXBoKGVuZE9mQ3VycmVu
dFBhcmFncmFwaC5uZXh0KCkpOwogICAgICAgIGlmIChlbmRPZkN1cnJlbnRQYXJhZ3JhcGggPT0g
ZW5kT2ZMYXN0UGFyYWdyYXBoKQogICAgICAgICAgICBzZXRFbmRpbmdTZWxlY3Rpb24oVmlzaWJs
ZVNlbGVjdGlvbihvcmlnaW5hbFNlbGVjdGlvbkVuZCwgRE9XTlNUUkVBTSkpOwogICAgICAgIGVs
c2UKICAgICAgICAgICAgc2V0RW5kaW5nU2VsZWN0aW9uKGVuZE9mQ3VycmVudFBhcmFncmFwaCk7
CiAgICAgICAgCiAgICAgICAgb3V0ZGVudFBhcmFncmFwaCgpOwogICAgICAgIAogICAgICAgIC8v
IG91dGRlbnRQYXJhZ3JhcGggY291bGQgbW92ZSBtb3JlIHRoYW4gb25lIHBhcmFncmFwaCBpZiB0
aGUgcGFyYWdyYXBoCiAgICAgICAgLy8gaXMgaW4gYSBsaXN0IGl0ZW0uIEFzIGEgcmVzdWx0LCBl
bmRBZnRlclNlbGVjdGlvbiBhbmQgZW5kT2ZOZXh0UGFyYWdyYXBoCiAgICAgICAgLy8gY291bGQg
cmVmZXIgdG8gcG9zaXRpb25zIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQuCiAgICAgICAgaWYg
KGVuZEFmdGVyU2VsZWN0aW9uLmlzTm90TnVsbCgpICYmICFlbmRBZnRlclNlbGVjdGlvbi5kZWVw
RXF1aXZhbGVudCgpLm5vZGUoKS0+aW5Eb2N1bWVudCgpKQogICAgICAgICAgICBicmVhazsKICAg
ICAgICAgICAgCiAgICAgICAgaWYgKGVuZE9mTmV4dFBhcmFncmFwaC5pc05vdE51bGwoKSAmJiAh
ZW5kT2ZOZXh0UGFyYWdyYXBoLmRlZXBFcXVpdmFsZW50KCkubm9kZSgpLT5pbkRvY3VtZW50KCkp
IHsKICAgICAgICAgICAgZW5kT2ZDdXJyZW50UGFyYWdyYXBoID0gZW5kaW5nU2VsZWN0aW9uKCku
ZW5kKCk7CiAgICAgICAgICAgIGVuZE9mTmV4dFBhcmFncmFwaCA9IGVuZE9mUGFyYWdyYXBoKGVu
ZE9mQ3VycmVudFBhcmFncmFwaC5uZXh0KCkpOwogICAgICAgIH0KICAgICAgICBlbmRPZkN1cnJl
bnRQYXJhZ3JhcGggPSBlbmRPZk5leHRQYXJhZ3JhcGg7CiAgICB9Cn0KCnZvaWQgSW5kZW50T3V0
ZGVudENvbW1hbmQ6OmRvQXBwbHkoKQp7CiAgICBpZiAoIWVuZGluZ1NlbGVjdGlvbigpLmlzTm9u
T3JwaGFuZWRDYXJldE9yUmFuZ2UoKSkKICAgICAgICByZXR1cm47CgogICAgaWYgKCFlbmRpbmdT
ZWxlY3Rpb24oKS5yb290RWRpdGFibGVFbGVtZW50KCkpCiAgICAgICAgcmV0dXJuOwogICAgICAg
IAogICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVFbmQgPSBlbmRpbmdTZWxlY3Rpb24oKS52aXNp
YmxlRW5kKCk7CiAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVN0YXJ0ID0gZW5kaW5nU2VsZWN0
aW9uKCkudmlzaWJsZVN0YXJ0KCk7CiAgICAvLyBXaGVuIGEgc2VsZWN0aW9uIGVuZHMgYXQgdGhl
IHN0YXJ0IG9mIGEgcGFyYWdyYXBoLCB3ZSByYXJlbHkgcGFpbnQgCiAgICAvLyB0aGUgc2VsZWN0
aW9uIGdhcCBiZWZvcmUgdGhhdCBwYXJhZ3JhcGgsIGJlY2F1c2UgdGhlcmUgb2Z0ZW4gaXMgbm8g
Z2FwLiAgCiAgICAvLyBJbiBhIGNhc2UgbGlrZSB0aGlzLCBpdCdzIG5vdCBvYnZpb3VzIHRvIHRo
ZSB1c2VyIHRoYXQgdGhlIHNlbGVjdGlvbiAKICAgIC8vIGVuZHMgImluc2lkZSIgdGhhdCBwYXJh
Z3JhcGgsIHNvIGl0IHdvdWxkIGJlIGNvbmZ1c2luZyBpZiBJbmRlbnQvT3V0ZGVudCAKICAgIC8v
IG9wZXJhdGVkIG9uIHRoYXQgcGFyYWdyYXBoLgogICAgLy8gRklYTUU6IFdlIHBhaW50IHRoZSBn
YXAgYmVmb3JlIHNvbWUgcGFyYWdyYXBocyB0aGF0IGFyZSBpbmRlbnRlZCB3aXRoIGxlZnQgCiAg
ICAvLyBtYXJnaW4vcGFkZGluZywgYnV0IG5vdCBvdGhlcnMuICBXZSBzaG91bGQgbWFrZSB0aGUg
Z2FwIHBhaW50aW5nIG1vcmUgY29uc2lzdGVudCBhbmQgCiAgICAvLyB0aGVuIHVzZSBhIGxlZnQg
bWFyZ2luL3BhZGRpbmcgcnVsZSBoZXJlLgogICAgaWYgKHZpc2libGVFbmQgIT0gdmlzaWJsZVN0
YXJ0ICYmIGlzU3RhcnRPZlBhcmFncmFwaCh2aXNpYmxlRW5kKSkKICAgICAgICBzZXRFbmRpbmdT
ZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbih2aXNpYmxlU3RhcnQsIHZpc2libGVFbmQucHJldmlv
dXModHJ1ZSkpKTsKCiAgICBWaXNpYmxlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvbkZv
clBhcmFncmFwaEl0ZXJhdGlvbihlbmRpbmdTZWxlY3Rpb24oKSk7CiAgICBWaXNpYmxlUG9zaXRp
b24gc3RhcnRPZlNlbGVjdGlvbiA9IHNlbGVjdGlvbi52aXNpYmxlU3RhcnQoKTsKICAgIFZpc2li
bGVQb3NpdGlvbiBlbmRPZlNlbGVjdGlvbiA9IHNlbGVjdGlvbi52aXNpYmxlRW5kKCk7CiAgICAK
ICAgIGludCBzdGFydEluZGV4ID0gaW5kZXhGb3JWaXNpYmxlUG9zaXRpb24oc3RhcnRPZlNlbGVj
dGlvbik7CiAgICBpbnQgZW5kSW5kZXggPSBpbmRleEZvclZpc2libGVQb3NpdGlvbihlbmRPZlNl
bGVjdGlvbik7CiAgICAKICAgIEFTU0VSVCghc3RhcnRPZlNlbGVjdGlvbi5pc051bGwoKSk7CiAg
ICBBU1NFUlQoIWVuZE9mU2VsZWN0aW9uLmlzTnVsbCgpKTsKICAgIAogICAgaWYgKG1fdHlwZU9m
QWN0aW9uID09IEluZGVudCkKICAgICAgICBpbmRlbnRSZWdpb24oc3RhcnRPZlNlbGVjdGlvbiwg
ZW5kT2ZTZWxlY3Rpb24pOwogICAgZWxzZQogICAgICAgIG91dGRlbnRSZWdpb24oc3RhcnRPZlNl
bGVjdGlvbiwgZW5kT2ZTZWxlY3Rpb24pOwoKICAgIHVwZGF0ZUxheW91dCgpOwogICAgCiAgICBS
ZWZQdHI8UmFuZ2U+IHN0YXJ0UmFuZ2UgPSBUZXh0SXRlcmF0b3I6OnJhbmdlRnJvbUxvY2F0aW9u
QW5kTGVuZ3RoKGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpLCBzdGFydEluZGV4LCAwLCB0
cnVlKTsKICAgIFJlZlB0cjxSYW5nZT4gZW5kUmFuZ2UgPSBUZXh0SXRlcmF0b3I6OnJhbmdlRnJv
bUxvY2F0aW9uQW5kTGVuZ3RoKGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpLCBlbmRJbmRl
eCwgMCwgdHJ1ZSk7CiAgICBpZiAoc3RhcnRSYW5nZSAmJiBlbmRSYW5nZSkKICAgICAgICBzZXRF
bmRpbmdTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihzdGFydFJhbmdlLT5zdGFydFBvc2l0aW9u
KCksIGVuZFJhbmdlLT5zdGFydFBvc2l0aW9uKCksIERPV05TVFJFQU0pKTsKfQoKfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>69271</attachid>
            <date>2010-09-29 16:15:18 -0700</date>
            <delta_ts>2010-09-29 16:17:02 -0700</delta_ts>
            <desc>FormatBlockCommand.cpp with patch</desc>
            <filename>FormatBlockCommand.cpp</filename>
            <type>text/plain</type>
            <size>5758</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBV
VEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIs
IElOQy4gT1IKICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCiAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCiAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICovCgojaW5j
bHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJFbGVtZW50LmgiCiNpbmNsdWRlICJGb3JtYXRCbG9j
a0NvbW1hbmQuaCIKI2luY2x1ZGUgIkRvY3VtZW50LmgiCiNpbmNsdWRlICJodG1sZWRpdGluZy5o
IgojaW5jbHVkZSAiSFRNTEVsZW1lbnQuaCIKI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgojaW5jbHVk
ZSAidmlzaWJsZV91bml0cy5oIgoKbmFtZXNwYWNlIFdlYkNvcmUgewoKdXNpbmcgbmFtZXNwYWNl
IEhUTUxOYW1lczsKCkZvcm1hdEJsb2NrQ29tbWFuZDo6Rm9ybWF0QmxvY2tDb21tYW5kKERvY3Vt
ZW50KiBkb2N1bWVudCwgY29uc3QgQXRvbWljU3RyaW5nJiB0YWdOYW1lKSAKICAgIDogQ29tcG9z
aXRlRWRpdENvbW1hbmQoZG9jdW1lbnQpLCBtX3RhZ05hbWUodGFnTmFtZSkKewp9Cgp2b2lkIEZv
cm1hdEJsb2NrQ29tbWFuZDo6ZG9BcHBseSgpCnsKICAgIGlmICghZW5kaW5nU2VsZWN0aW9uKCku
aXNOb25PcnBoYW5lZENhcmV0T3JSYW5nZSgpKQogICAgICAgIHJldHVybjsKICAgIAogICAgaWYg
KCFlbmRpbmdTZWxlY3Rpb24oKS5yb290RWRpdGFibGVFbGVtZW50KCkpCiAgICAgICAgcmV0dXJu
OwoKICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlRW5kID0gZW5kaW5nU2VsZWN0aW9uKCkudmlz
aWJsZUVuZCgpOwogICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFydCA9IGVuZGluZ1NlbGVj
dGlvbigpLnZpc2libGVTdGFydCgpOwogICAgLy8gV2hlbiBhIHNlbGVjdGlvbiBlbmRzIGF0IHRo
ZSBzdGFydCBvZiBhIHBhcmFncmFwaCwgd2UgcmFyZWx5IHBhaW50IAogICAgLy8gdGhlIHNlbGVj
dGlvbiBnYXAgYmVmb3JlIHRoYXQgcGFyYWdyYXBoLCBiZWNhdXNlIHRoZXJlIG9mdGVuIGlzIG5v
IGdhcC4gIAogICAgLy8gSW4gYSBjYXNlIGxpa2UgdGhpcywgaXQncyBub3Qgb2J2aW91cyB0byB0
aGUgdXNlciB0aGF0IHRoZSBzZWxlY3Rpb24gCiAgICAvLyBlbmRzICJpbnNpZGUiIHRoYXQgcGFy
YWdyYXBoLCBzbyBpdCB3b3VsZCBiZSBjb25mdXNpbmcgaWYgRm9ybWF0QmxvY2sKICAgIC8vIG9w
ZXJhdGVkIG9uIHRoYXQgcGFyYWdyYXBoLgogICAgLy8gRklYTUU6IFdlIHBhaW50IHRoZSBnYXAg
YmVmb3JlIHNvbWUgcGFyYWdyYXBocyB0aGF0IGFyZSBpbmRlbnRlZCB3aXRoIGxlZnQgCiAgICAv
LyBtYXJnaW4vcGFkZGluZywgYnV0IG5vdCBvdGhlcnMuICBXZSBzaG91bGQgbWFrZSB0aGUgZ2Fw
IHBhaW50aW5nIG1vcmUgY29uc2lzdGVudCBhbmQgCiAgICAvLyB0aGVuIHVzZSBhIGxlZnQgbWFy
Z2luL3BhZGRpbmcgcnVsZSBoZXJlLgogICAgaWYgKHZpc2libGVFbmQgIT0gdmlzaWJsZVN0YXJ0
ICYmIGlzU3RhcnRPZlBhcmFncmFwaCh2aXNpYmxlRW5kKSkgewogICAgICAgIHNldEVuZGluZ1Nl
bGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKHZpc2libGVTdGFydCwgdmlzaWJsZUVuZC5wcmV2aW91
cyh0cnVlKSkpOwogICAgICAgIHZpc2libGVFbmQgPSBlbmRpbmdTZWxlY3Rpb24oKS52aXNpYmxl
RW5kKCk7CiAgICB9CgogICAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0T2ZMYXN0UGFyYWdyYXBoID0g
c3RhcnRPZlBhcmFncmFwaCh2aXNpYmxlRW5kKTsKICAgIGlmIChlbmRpbmdTZWxlY3Rpb24oKS5p
c0NhcmV0KCkgfHwgc3RhcnRPZlBhcmFncmFwaCh2aXNpYmxlU3RhcnQpID09IHN0YXJ0T2ZMYXN0
UGFyYWdyYXBoKSB7CiAgICAgICAgZG9BcHBseUZvclNpbmdsZVBhcmFncmFwaCgpOwogICAgICAg
IHJldHVybjsKICAgIH0KCiAgICBzZXRFbmRpbmdTZWxlY3Rpb24odmlzaWJsZVN0YXJ0KTsKICAg
IGRvQXBwbHlGb3JTaW5nbGVQYXJhZ3JhcGgoKTsKICAgIHZpc2libGVTdGFydCA9IGVuZGluZ1Nl
bGVjdGlvbigpLnZpc2libGVTdGFydCgpOwogICAgVmlzaWJsZVBvc2l0aW9uIG5leHRQYXJhZ3Jh
cGggPSBlbmRPZlBhcmFncmFwaCh2aXNpYmxlU3RhcnQpLm5leHQoKTsKICAgIHdoaWxlIChuZXh0
UGFyYWdyYXBoLmlzTm90TnVsbCgpICYmIG5leHRQYXJhZ3JhcGggIT0gc3RhcnRPZkxhc3RQYXJh
Z3JhcGgpIHsKICAgICAgICBzZXRFbmRpbmdTZWxlY3Rpb24obmV4dFBhcmFncmFwaCk7CiAgICAg
ICAgZG9BcHBseUZvclNpbmdsZVBhcmFncmFwaCgpOwogICAgICAgIG5leHRQYXJhZ3JhcGggPSBl
bmRPZlBhcmFncmFwaChlbmRpbmdTZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKSkubmV4dCgpOwog
ICAgfQogICAgc2V0RW5kaW5nU2VsZWN0aW9uKHZpc2libGVFbmQpOwogICAgZG9BcHBseUZvclNp
bmdsZVBhcmFncmFwaCgpOwogICAgdmlzaWJsZUVuZCA9IGVuZGluZ1NlbGVjdGlvbigpLnZpc2li
bGVFbmQoKTsKCiAgICBzZXRFbmRpbmdTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbih2aXNpYmxl
U3RhcnQuZGVlcEVxdWl2YWxlbnQoKSwgdmlzaWJsZUVuZC5kZWVwRXF1aXZhbGVudCgpLCBET1dO
U1RSRUFNKSk7Cn0KCnZvaWQgRm9ybWF0QmxvY2tDb21tYW5kOjpkb0FwcGx5Rm9yU2luZ2xlUGFy
YWdyYXBoKCkKewogICAgRXhjZXB0aW9uQ29kZSBlYzsKICAgIFN0cmluZyBsb2NhbE5hbWUsIHBy
ZWZpeDsKICAgIGlmICghRG9jdW1lbnQ6OnBhcnNlUXVhbGlmaWVkTmFtZShtX3RhZ05hbWUsIHBy
ZWZpeCwgbG9jYWxOYW1lLCBlYykpCiAgICAgICAgcmV0dXJuOwogICAgUXVhbGlmaWVkTmFtZSBx
VHlwZU9mQmxvY2socHJlZml4LCBsb2NhbE5hbWUsIHhodG1sTmFtZXNwYWNlVVJJKTsKCiAgICBO
b2RlKiByZWZOb2RlID0gZW5jbG9zaW5nQmxvY2tGbG93RWxlbWVudChlbmRpbmdTZWxlY3Rpb24o
KS52aXNpYmxlU3RhcnQoKSk7CiAgICBpZiAocmVmTm9kZS0+aGFzVGFnTmFtZShxVHlwZU9mQmxv
Y2spKQogICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgaW4gYSBibG9jayB3aXRoIHRoZSBmb3JtYXQg
d2Ugd2FudCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZwogICAgICAgIHJldHVybjsK
CiAgICBWaXNpYmxlUG9zaXRpb24gcGFyYWdyYXBoU3RhcnQgPSBzdGFydE9mUGFyYWdyYXBoKGVu
ZGluZ1NlbGVjdGlvbigpLnZpc2libGVTdGFydCgpKTsKICAgIFZpc2libGVQb3NpdGlvbiBwYXJh
Z3JhcGhFbmQgPSBlbmRPZlBhcmFncmFwaChlbmRpbmdTZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQo
KSk7CiAgICBWaXNpYmxlUG9zaXRpb24gYmxvY2tTdGFydCA9IHN0YXJ0T2ZCbG9jayhlbmRpbmdT
ZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKSk7CiAgICBWaXNpYmxlUG9zaXRpb24gYmxvY2tFbmQg
PSBlbmRPZkJsb2NrKGVuZGluZ1NlbGVjdGlvbigpLnZpc2libGVTdGFydCgpKTsKICAgIFJlZlB0
cjxFbGVtZW50PiBibG9ja05vZGUgPSBjcmVhdGVIVE1MRWxlbWVudChkb2N1bWVudCgpLCBtX3Rh
Z05hbWUpOwogICAgUmVmUHRyPEVsZW1lbnQ+IHBsYWNlaG9sZGVyID0gY3JlYXRlQnJlYWtFbGVt
ZW50KGRvY3VtZW50KCkpOwoKICAgIE5vZGUqIHJvb3QgPSBlbmRpbmdTZWxlY3Rpb24oKS5zdGFy
dCgpLm5vZGUoKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOwogICAgaWYgKHZhbGlkQmxvY2tUYWco
cmVmTm9kZS0+bm9kZU5hbWUoKS5sb3dlcigpKSAmJiAKICAgICAgICBwYXJhZ3JhcGhTdGFydCA9
PSBibG9ja1N0YXJ0ICYmIHBhcmFncmFwaEVuZCA9PSBibG9ja0VuZCAmJiAKICAgICAgICByZWZO
b2RlICE9IHJvb3QgJiYgIXJvb3QtPmlzRGVzY2VuZGFudE9mKHJlZk5vZGUpKQogICAgICAgIC8v
IEFscmVhZHkgaW4gYSB2YWxpZCBibG9jayB0YWcgdGhhdCBvbmx5IGNvbnRhaW5zIHRoZSBjdXJy
ZW50IHBhcmFncmFwaCwgc28gd2UgY2FuIHN3YXAgd2l0aCB0aGUgbmV3IHRhZwogICAgICAgIGlu
c2VydE5vZGVCZWZvcmUoYmxvY2tOb2RlLCByZWZOb2RlKTsKICAgIGVsc2UgewogICAgICAgIC8v
IEF2b2lkIGluc2VydGluZyBpbnNpZGUgaW5saW5lIGVsZW1lbnRzIHRoYXQgc3Vycm91bmQgcGFy
YWdyYXBoU3RhcnQgd2l0aCB1cHN0cmVhbSgpLgogICAgICAgIC8vIFRoaXMgaXMgb25seSB0byBh
dm9pZCBjcmVhdGluZyBibG9hdGVkIG1hcmt1cC4KICAgICAgICBpbnNlcnROb2RlQXQoYmxvY2tO
b2RlLCBwYXJhZ3JhcGhTdGFydC5kZWVwRXF1aXZhbGVudCgpLnVwc3RyZWFtKCkpOwogICAgfQog
ICAgYXBwZW5kTm9kZShwbGFjZWhvbGRlciwgYmxvY2tOb2RlKTsKCiAgICBWaXNpYmxlUG9zaXRp
b24gZGVzdGluYXRpb24oUG9zaXRpb24ocGxhY2Vob2xkZXIuZ2V0KCksIDApKTsKICAgIGlmIChw
YXJhZ3JhcGhTdGFydCA9PSBwYXJhZ3JhcGhFbmQgJiYgIWxpbmVCcmVha0V4aXN0c0F0VmlzaWJs
ZVBvc2l0aW9uKHBhcmFncmFwaFN0YXJ0KSkgewogICAgICAgIHNldEVuZGluZ1NlbGVjdGlvbihk
ZXN0aW5hdGlvbik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbW92ZVBhcmFncmFwaChwYXJh
Z3JhcGhTdGFydCwgcGFyYWdyYXBoRW5kLCBkZXN0aW5hdGlvbiwgdHJ1ZSwgZmFsc2UpOwp9Cgp9
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>69272</attachid>
            <date>2010-09-29 16:15:49 -0700</date>
            <delta_ts>2010-09-29 16:17:10 -0700</delta_ts>
            <desc>IndentOutdentCommand.cpp with patch</desc>
            <filename>IndentOutdentCommand.cpp</filename>
            <type>text/plain</type>
            <size>18522</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQogKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCiAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAogKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSW5kZW50T3V0ZGVudENvbW1hbmRJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJJbmRlbnRPdXRkZW50Q29t
bWFuZC5oIgoKI2luY2x1ZGUgIkRvY3VtZW50LmgiCiNpbmNsdWRlICJFbGVtZW50LmgiCiNpbmNs
dWRlICJIVE1MQmxvY2txdW90ZUVsZW1lbnQuaCIKI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgojaW5j
bHVkZSAiSW5zZXJ0TGluZUJyZWFrQ29tbWFuZC5oIgojaW5jbHVkZSAiSW5zZXJ0TGlzdENvbW1h
bmQuaCIKI2luY2x1ZGUgIlJhbmdlLmgiCiNpbmNsdWRlICJTcGxpdEVsZW1lbnRDb21tYW5kLmgi
CiNpbmNsdWRlICJUZXh0LmgiCiNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKI2luY2x1ZGUgImh0
bWxlZGl0aW5nLmgiCiNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCiNpbmNsdWRlIDx3dGYvU3Rk
TGliRXh0cmFzLmg+CgpuYW1lc3BhY2UgV2ViQ29yZSB7Cgp1c2luZyBuYW1lc3BhY2UgSFRNTE5h
bWVzOwoKc3RhdGljIFN0cmluZyBpbmRlbnRCbG9ja3F1b3RlU3RyaW5nKCkKewogICAgREVGSU5F
X1NUQVRJQ19MT0NBTChTdHJpbmcsIHN0cmluZywgKCJ3ZWJraXQtaW5kZW50LWJsb2NrcXVvdGUi
KSk7CiAgICByZXR1cm4gc3RyaW5nOwp9CgpzdGF0aWMgUGFzc1JlZlB0cjxIVE1MQmxvY2txdW90
ZUVsZW1lbnQ+IGNyZWF0ZUluZGVudEJsb2NrcXVvdGVFbGVtZW50KERvY3VtZW50KiBkb2N1bWVu
dCkKewogICAgUmVmUHRyPEhUTUxCbG9ja3F1b3RlRWxlbWVudD4gZWxlbWVudCA9IEhUTUxCbG9j
a3F1b3RlRWxlbWVudDo6Y3JlYXRlKGRvY3VtZW50KTsKICAgIGVsZW1lbnQtPnNldEF0dHJpYnV0
ZShjbGFzc0F0dHIsIGluZGVudEJsb2NrcXVvdGVTdHJpbmcoKSk7CiAgICBlbGVtZW50LT5zZXRB
dHRyaWJ1dGUoc3R5bGVBdHRyLCAibWFyZ2luOiAwIDAgMCA0MHB4OyBib3JkZXI6IG5vbmU7IHBh
ZGRpbmc6IDBweDsiKTsKICAgIHJldHVybiBlbGVtZW50LnJlbGVhc2UoKTsKfQoKc3RhdGljIGJv
b2wgaXNMaXN0T3JJbmRlbnRCbG9ja3F1b3RlKGNvbnN0IE5vZGUqIG5vZGUpCnsKICAgIHJldHVy
biBub2RlICYmIChub2RlLT5oYXNUYWdOYW1lKHVsVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKG9s
VGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKGJsb2NrcXVvdGVUYWcpKTsKfQoKLy8gVGhpcyBmdW5j
dGlvbiBjYW4gcmV0dXJuIC0xIGlmIHdlIGFyZSB1bmFibGUgdG8gY291bnQgdGhlIHBhcmFncmFw
aHMgYmV0d2VlbiB8c3RhcnR8IGFuZCB8ZW5kfC4Kc3RhdGljIGludCBjb3VudFBhcmFncmFwaHMo
Y29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRPZkZpcnN0UGFyYWdyYXBoLCBjb25zdCBWaXNpYmxl
UG9zaXRpb24mIGVuZE9mTGFzdFBhcmFncmFwaCkKewogICAgaW50IGNvdW50ID0gMDsKICAgIFZp
c2libGVQb3NpdGlvbiBjdXIgPSBlbmRPZkZpcnN0UGFyYWdyYXBoOwogICAgd2hpbGUgKGN1ciAh
PSBlbmRPZkxhc3RQYXJhZ3JhcGgpIHsKICAgICAgICArK2NvdW50OwogICAgICAgIGN1ciA9IGVu
ZE9mUGFyYWdyYXBoKGN1ci5uZXh0KCkpOwogICAgICAgIC8vIElmIHN0YXJ0IGlzIGJlZm9yZSBh
IHRhYmxlIGFuZCBlbmQgaXMgaW5zaWRlIGEgdGFibGUsIHdlIHdpbGwgbmV2ZXIgaGl0IGVuZCBi
ZWNhdXNlIHRoZQogICAgICAgIC8vIHdob2xlIHRhYmxlIGlzIGNvbnNpZGVyZWQgYSBzaW5nbGUg
cGFyYWdyYXBoLgogICAgICAgIGlmIChjdXIuaXNOdWxsKCkpCiAgICAgICAgICAgIHJldHVybiAt
MTsKICAgIH0KICAgIHJldHVybiBjb3VudDsKfQoKSW5kZW50T3V0ZGVudENvbW1hbmQ6OkluZGVu
dE91dGRlbnRDb21tYW5kKERvY3VtZW50KiBkb2N1bWVudCwgRUluZGVudFR5cGUgdHlwZU9mQWN0
aW9uLCBpbnQgbWFyZ2luSW5QaXhlbHMpCiAgICA6IENvbXBvc2l0ZUVkaXRDb21tYW5kKGRvY3Vt
ZW50KSwgbV90eXBlT2ZBY3Rpb24odHlwZU9mQWN0aW9uKSwgbV9tYXJnaW5JblBpeGVscyhtYXJn
aW5JblBpeGVscykKewp9Cgpib29sIEluZGVudE91dGRlbnRDb21tYW5kOjp0cnlJbmRlbnRpbmdB
c0xpc3RJdGVtKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZDdXJyZW50UGFyYWdyYXBoKQp7
CiAgICAvLyBJZiBvdXIgc2VsZWN0aW9uIGlzIG5vdCBpbnNpZGUgYSBsaXN0LCBiYWlsIG91dC4K
ICAgIE5vZGUqIGxhc3ROb2RlSW5TZWxlY3RlZFBhcmFncmFwaCA9IGVuZE9mQ3VycmVudFBhcmFn
cmFwaC5kZWVwRXF1aXZhbGVudCgpLm5vZGUoKTsKICAgIFJlZlB0cjxFbGVtZW50PiBsaXN0Tm9k
ZSA9IGVuY2xvc2luZ0xpc3QobGFzdE5vZGVJblNlbGVjdGVkUGFyYWdyYXBoKTsKICAgIGlmICgh
bGlzdE5vZGUpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIC8vIEZpbmQgdGhlIGJsb2NrIHRo
YXQgd2Ugd2FudCB0byBpbmRlbnQuICBJZiBpdCdzIG5vdCBhIGxpc3QgaXRlbSAoZS5nLiwgYSBk
aXYgaW5zaWRlIGEgbGlzdCBpdGVtKSwgd2UgYmFpbCBvdXQuCiAgICBFbGVtZW50KiBzZWxlY3Rl
ZExpc3RJdGVtID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KGVuY2xvc2luZ0Jsb2NrKGxhc3ROb2Rl
SW5TZWxlY3RlZFBhcmFncmFwaCkpOwoKICAgIC8vIEZJWE1FOiB3ZSBuZWVkIHRvIGRlYWwgd2l0
aCB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBsaSAobWFsZm9ybWVkIEhUTUwpCiAgICBpZiAo
IXNlbGVjdGVkTGlzdEl0ZW0tPmhhc1RhZ05hbWUobGlUYWcpKQogICAgICAgIHJldHVybiBmYWxz
ZTsKICAgIAogICAgLy8gRklYTUU6IHByZXZpb3VzRWxlbWVudFNpYmxpbmcgZG9lcyBub3QgaWdu
b3JlIG5vbi1yZW5kZXJlZCBjb250ZW50IGxpa2UgPHNwYW4+PC9zcGFuPi4gIFNob3VsZCB3ZT8K
ICAgIEVsZW1lbnQqIHByZXZpb3VzTGlzdCA9IHNlbGVjdGVkTGlzdEl0ZW0tPnByZXZpb3VzRWxl
bWVudFNpYmxpbmcoKTsKICAgIEVsZW1lbnQqIG5leHRMaXN0ID0gc2VsZWN0ZWRMaXN0SXRlbS0+
bmV4dEVsZW1lbnRTaWJsaW5nKCk7CgogICAgUmVmUHRyPEVsZW1lbnQ+IG5ld0xpc3QgPSBkb2N1
bWVudCgpLT5jcmVhdGVFbGVtZW50KGxpc3ROb2RlLT50YWdRTmFtZSgpLCBmYWxzZSk7CiAgICBp
bnNlcnROb2RlQmVmb3JlKG5ld0xpc3QsIHNlbGVjdGVkTGlzdEl0ZW0pOwoKICAgIG1vdmVQYXJh
Z3JhcGhXaXRoQ2xvbmVzKHN0YXJ0T2ZQYXJhZ3JhcGgoZW5kT2ZDdXJyZW50UGFyYWdyYXBoKSwg
ZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBuZXdMaXN0LmdldCgpLCBzZWxlY3RlZExpc3RJdGVtKTsK
CiAgICBpZiAoY2FuTWVyZ2VMaXN0cyhwcmV2aW91c0xpc3QsIG5ld0xpc3QuZ2V0KCkpKQogICAg
ICAgIG1lcmdlSWRlbnRpY2FsRWxlbWVudHMocHJldmlvdXNMaXN0LCBuZXdMaXN0KTsKICAgIGlm
IChjYW5NZXJnZUxpc3RzKG5ld0xpc3QuZ2V0KCksIG5leHRMaXN0KSkKICAgICAgICBtZXJnZUlk
ZW50aWNhbEVsZW1lbnRzKG5ld0xpc3QsIG5leHRMaXN0KTsKCiAgICByZXR1cm4gdHJ1ZTsKfQog
ICAgCnZvaWQgSW5kZW50T3V0ZGVudENvbW1hbmQ6OmluZGVudEludG9CbG9ja3F1b3RlKGNvbnN0
IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBjb25zdCBWaXNpYmxlUG9z
aXRpb24mIGVuZE9mTmV4dFBhcmFncmFwaCwgUmVmUHRyPEVsZW1lbnQ+JiB0YXJnZXRCbG9ja3F1
b3RlKQp7CiAgICBOb2RlKiBlbmNsb3NpbmdDZWxsID0gMDsKCiAgICBQb3NpdGlvbiBzdGFydCA9
IHN0YXJ0T2ZQYXJhZ3JhcGgoZW5kT2ZDdXJyZW50UGFyYWdyYXBoKS5kZWVwRXF1aXZhbGVudCgp
OwogICAgZW5jbG9zaW5nQ2VsbCA9IGVuY2xvc2luZ05vZGVPZlR5cGUoc3RhcnQsICZpc1RhYmxl
Q2VsbCk7CiAgICBOb2RlKiBub2RlVG9TcGxpdFRvOwogICAgaWYgKGVuY2xvc2luZ0NlbGwpCiAg
ICAgICAgbm9kZVRvU3BsaXRUbyA9IGVuY2xvc2luZ0NlbGw7CiAgICBlbHNlIGlmIChlbmNsb3Np
bmdMaXN0KHN0YXJ0Lm5vZGUoKSkpCiAgICAgICAgbm9kZVRvU3BsaXRUbyA9IGVuY2xvc2luZ0Js
b2NrKHN0YXJ0Lm5vZGUoKSk7CiAgICBlbHNlCiAgICAgICAgbm9kZVRvU3BsaXRUbyA9IGVkaXRh
YmxlUm9vdEZvclBvc2l0aW9uKHN0YXJ0KTsKCiAgICBSZWZQdHI8Tm9kZT4gb3V0ZXJCbG9jayA9
IChzdGFydC5ub2RlKCkgPT0gbm9kZVRvU3BsaXRUbykgPyBzdGFydC5ub2RlKCkgOiBzcGxpdFRy
ZWVUb05vZGUoc3RhcnQubm9kZSgpLCBub2RlVG9TcGxpdFRvKTsKCiAgICBpZiAoIXRhcmdldEJs
b2NrcXVvdGUpIHsKICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYmxvY2txdW90ZSBhbmQgaW5zZXJ0
IGl0IGFzIGEgY2hpbGQgb2YgdGhlIHJvb3QgZWRpdGFibGUgZWxlbWVudC4gV2UgYWNjb21wbGlz
aAogICAgICAgIC8vIHRoaXMgYnkgc3BsaXR0aW5nIGFsbCBwYXJlbnRzIG9mIHRoZSBjdXJyZW50
IHBhcmFncmFwaCB1cCB0byB0aGF0IHBvaW50LgogICAgICAgIHRhcmdldEJsb2NrcXVvdGUgPSBj
cmVhdGVJbmRlbnRCbG9ja3F1b3RlRWxlbWVudChkb2N1bWVudCgpKTsKICAgICAgICBpbnNlcnRO
b2RlQmVmb3JlKHRhcmdldEJsb2NrcXVvdGUsIG91dGVyQmxvY2spOwogICAgfQoKICAgIG1vdmVQ
YXJhZ3JhcGhXaXRoQ2xvbmVzKHN0YXJ0T2ZQYXJhZ3JhcGgoZW5kT2ZDdXJyZW50UGFyYWdyYXBo
KSwgZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCB0YXJnZXRCbG9ja3F1b3RlLmdldCgpLCBvdXRlckJs
b2NrLmdldCgpKTsKICAgIAogICAgLy8gRG9uJ3QgcHV0IHRoZSBuZXh0IHBhcmFncmFwaCBpbiB0
aGUgYmxvY2txdW90ZSB3ZSBqdXN0IGNyZWF0ZWQgZm9yIHRoaXMgcGFyYWdyYXBoIHVubGVzcyAK
ICAgIC8vIHRoZSBuZXh0IHBhcmFncmFwaCBpcyBpbiB0aGUgc2FtZSBjZWxsLgogICAgaWYgKGVu
Y2xvc2luZ0NlbGwgJiYgZW5jbG9zaW5nQ2VsbCAhPSBlbmNsb3NpbmdOb2RlT2ZUeXBlKGVuZE9m
TmV4dFBhcmFncmFwaC5kZWVwRXF1aXZhbGVudCgpLCAmaXNUYWJsZUNlbGwpKQogICAgICAgIHRh
cmdldEJsb2NrcXVvdGUgPSAwOwp9Cgp2b2lkIEluZGVudE91dGRlbnRDb21tYW5kOjppbmRlbnRS
ZWdpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBzdGFydE9mU2VsZWN0aW9uLCBjb25zdCBWaXNp
YmxlUG9zaXRpb24mIGVuZE9mU2VsZWN0aW9uKQp7CiAgICAvLyBTcGVjaWFsIGNhc2UgZW1wdHkg
dW5zcGxpdHRhYmxlIGVsZW1lbnRzIGJlY2F1c2UgdGhlcmUncyBub3RoaW5nIHRvIHNwbGl0CiAg
ICAvLyBhbmQgdGhlcmUncyBub3RoaW5nIHRvIG1vdmUuCiAgICBQb3NpdGlvbiBzdGFydCA9IHN0
YXJ0T2ZTZWxlY3Rpb24uZGVlcEVxdWl2YWxlbnQoKS5kb3duc3RyZWFtKCk7CiAgICBpZiAoaXNB
dFVuc3BsaXR0YWJsZUVsZW1lbnQoc3RhcnQpKSB7CiAgICAgICAgUmVmUHRyPEVsZW1lbnQ+IGJs
b2NrcXVvdGUgPSBjcmVhdGVJbmRlbnRCbG9ja3F1b3RlRWxlbWVudChkb2N1bWVudCgpKTsKICAg
ICAgICBpbnNlcnROb2RlQXQoYmxvY2txdW90ZSwgc3RhcnQpOwogICAgICAgIFJlZlB0cjxFbGVt
ZW50PiBwbGFjZWhvbGRlciA9IGNyZWF0ZUJyZWFrRWxlbWVudChkb2N1bWVudCgpKTsKICAgICAg
ICBhcHBlbmROb2RlKHBsYWNlaG9sZGVyLCBibG9ja3F1b3RlKTsKICAgICAgICBzZXRFbmRpbmdT
ZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbihQb3NpdGlvbihwbGFjZWhvbGRlci5nZXQoKSwgMCks
IERPV05TVFJFQU0pKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgUmVmUHRyPEVsZW1lbnQ+
IGJsb2NrcXVvdGVGb3JOZXh0SW5kZW50OwogICAgVmlzaWJsZVBvc2l0aW9uIGVuZE9mQ3VycmVu
dFBhcmFncmFwaCA9IGVuZE9mUGFyYWdyYXBoKHN0YXJ0T2ZTZWxlY3Rpb24pOwogICAgVmlzaWJs
ZVBvc2l0aW9uIGVuZEFmdGVyU2VsZWN0aW9uID0gZW5kT2ZQYXJhZ3JhcGgoZW5kT2ZQYXJhZ3Jh
cGgoZW5kT2ZTZWxlY3Rpb24pLm5leHQoKSk7CiAgICBpbnQgZW5kT2ZDdXJyZW50UGFyYWdyYXBo
SW5kZXggPSBpbmRleEZvclZpc2libGVQb3NpdGlvbihlbmRPZkN1cnJlbnRQYXJhZ3JhcGgpOwog
ICAgaW50IGVuZEFmdGVyU2VsZWN0aW9uSW5kZXggPSBpbmRleEZvclZpc2libGVQb3NpdGlvbihl
bmRBZnRlclNlbGVjdGlvbik7CgogICAgLy8gV2hlbiBpbmRlbnRpbmcgd2l0aGluIGEgPHByZT4g
dGFnLCB3ZSBuZWVkIHRvIHNwbGl0IGVhY2ggcGFyYWdyYXBoIGludG8gYSBzZXBhcmF0ZSBub2Rl
IGZvciBtb3ZlUGFyYWdyYXBoV2l0aENsb25lcyB0byB3b3JrLgogICAgLy8gSG93ZXZlciwgc3Bs
aXR0aW5nIHRleHQgbm9kZXMgY2FuIGNhdXNlIGVuZE9mQ3VycmVudFBhcmFncmFwaCBhbmQgZW5k
QWZ0ZXJTZWxlY3Rpb24gdG8gcG9pbnQgdG8gYW4gaW52YWxpZCBwb3NpdGlvbiBpZiB3ZQogICAg
Ly8gY2hhbmdlZCB0aGUgdGV4dCBub2RlIGl0IHdhcyBwb2ludGluZyBhdC4gIFNvIHdlIGhhdmUg
dG8gcmVzZXQgdGhlc2UgcG9zaXRpb25zLgogICAgaW50IG51bVBhcmFncmFwaHMgPSBjb3VudFBh
cmFncmFwaHMoZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBlbmRBZnRlclNlbGVjdGlvbik7CiAgICBp
ZiAoc3BsaXRUZXh0Tm9kZXMoc3RhcnRPZlBhcmFncmFwaChzdGFydE9mU2VsZWN0aW9uKSwgbnVt
UGFyYWdyYXBocyArIDEpKSB7CiAgICAgICAgUmVmUHRyPFJhbmdlPiBlbmRPZkN1cnJlbnRQYXJh
Z3JhcGhSYW5nZSA9IFRleHRJdGVyYXRvcjo6cmFuZ2VGcm9tTG9jYXRpb25BbmRMZW5ndGgoZG9j
dW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCksIGVuZE9mQ3VycmVudFBhcmFncmFwaEluZGV4LCAw
LCB0cnVlKTsKICAgICAgICBSZWZQdHI8UmFuZ2U+IGVuZEFmdGVyU2VsZWN0aW9uUmFuZ2UgPSBU
ZXh0SXRlcmF0b3I6OnJhbmdlRnJvbUxvY2F0aW9uQW5kTGVuZ3RoKGRvY3VtZW50KCktPmRvY3Vt
ZW50RWxlbWVudCgpLCBlbmRBZnRlclNlbGVjdGlvbkluZGV4LCAwLCB0cnVlKTsKICAgICAgICBp
ZiAoIWVuZE9mQ3VycmVudFBhcmFncmFwaFJhbmdlLmdldCgpIHx8ICFlbmRBZnRlclNlbGVjdGlv
blJhbmdlLmdldCgpKSB7CiAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgICAg
ICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVuZE9mQ3VycmVudFBhcmFncmFwaCA9IFZp
c2libGVQb3NpdGlvbihlbmRPZkN1cnJlbnRQYXJhZ3JhcGhSYW5nZS0+c3RhcnRQb3NpdGlvbigp
LCBET1dOU1RSRUFNKTsKICAgICAgICBlbmRBZnRlclNlbGVjdGlvbiA9IFZpc2libGVQb3NpdGlv
bihlbmRBZnRlclNlbGVjdGlvblJhbmdlLT5zdGFydFBvc2l0aW9uKCksIERPV05TVFJFQU0pOwog
ICAgfQoKICAgIHdoaWxlIChlbmRPZkN1cnJlbnRQYXJhZ3JhcGggIT0gZW5kQWZ0ZXJTZWxlY3Rp
b24pIHsKICAgICAgICAvLyBJdGVyYXRlIGFjcm9zcyB0aGUgc2VsZWN0ZWQgcGFyYWdyYXBocy4u
LgogICAgICAgIFZpc2libGVQb3NpdGlvbiBlbmRPZk5leHRQYXJhZ3JhcGggPSBlbmRPZlBhcmFn
cmFwaChlbmRPZkN1cnJlbnRQYXJhZ3JhcGgubmV4dCgpKTsKICAgICAgICBpZiAodHJ5SW5kZW50
aW5nQXNMaXN0SXRlbShlbmRPZkN1cnJlbnRQYXJhZ3JhcGgpKQogICAgICAgICAgICBibG9ja3F1
b3RlRm9yTmV4dEluZGVudCA9IDA7CiAgICAgICAgZWxzZQogICAgICAgICAgICBpbmRlbnRJbnRv
QmxvY2txdW90ZShlbmRPZkN1cnJlbnRQYXJhZ3JhcGgsIGVuZE9mTmV4dFBhcmFncmFwaCwgYmxv
Y2txdW90ZUZvck5leHRJbmRlbnQpOwoKICAgICAgICAvLyBpbmRlbnRJbnRvQmxvY2txdW90ZSBj
b3VsZCBtb3ZlIG1vcmUgdGhhbiBvbmUgcGFyYWdyYXBoIGlmIHRoZSBwYXJhZ3JhcGgKICAgICAg
ICAvLyBpcyBpbiBhIGxpc3QgaXRlbSBvciBhIHRhYmxlLiBBcyBhIHJlc3VsdCwgZW5kQWZ0ZXJT
ZWxlY3Rpb24gY291bGQgcmVmZXIgdG8gYSBwb3NpdGlvbgogICAgICAgIC8vIG5vIGxvbmdlciBp
biB0aGUgZG9jdW1lbnQuCiAgICAgICAgaWYgKGVuZEFmdGVyU2VsZWN0aW9uLmlzTm90TnVsbCgp
ICYmICFlbmRBZnRlclNlbGVjdGlvbi5kZWVwRXF1aXZhbGVudCgpLm5vZGUoKS0+aW5Eb2N1bWVu
dCgpKQogICAgICAgICAgICBicmVhazsKICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IE1ha2Ugc3Vy
ZSBvdXIgbW92ZVBhcmFncmFwaCBjYWxscyBkaWRuJ3QgcmVtb3ZlIGVuZE9mTmV4dFBhcmFncmFw
aC5kZWVwRXF1aXZhbGVudCgpLm5vZGUoKQogICAgICAgIC8vIElmIHNvbWVob3cgd2UgZGlkLCBy
ZXR1cm4gdG8gcHJldmVudCBjcmFzaGVzLgogICAgICAgIGlmIChlbmRPZk5leHRQYXJhZ3JhcGgu
aXNOb3ROdWxsKCkgJiYgIWVuZE9mTmV4dFBhcmFncmFwaC5kZWVwRXF1aXZhbGVudCgpLm5vZGUo
KS0+aW5Eb2N1bWVudCgpKSB7CiAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogICAg
ICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVuZE9mQ3VycmVudFBhcmFncmFwaCA9
IGVuZE9mTmV4dFBhcmFncmFwaDsKICAgIH0gICAKfQoKLy8gUmV0dXJucyB0cnVlIGlmIGF0IGxl
YXN0IG9uZSB0ZXh0IG5vZGUgd2FzIHNwbGl0Lgpib29sIEluZGVudE91dGRlbnRDb21tYW5kOjpz
cGxpdFRleHROb2Rlcyhjb25zdCBWaXNpYmxlUG9zaXRpb24mIHN0YXJ0LCBpbnQgbnVtUGFyYWdy
YXBocykKewogICAgVmlzaWJsZVBvc2l0aW9uIGN1cnJlbnRQYXJhZ3JhcGhTdGFydCA9IHN0YXJ0
OwogICAgYm9vbCBoYXNTcGxpdCA9IGZhbHNlOwogICAgaW50IHBhcmFncmFwaENvdW50OwogICAg
Zm9yIChwYXJhZ3JhcGhDb3VudCA9IDA7IHBhcmFncmFwaENvdW50IDwgbnVtUGFyYWdyYXBoczsg
KytwYXJhZ3JhcGhDb3VudCkgewogICAgICAgIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXJh
Z3JhcGhzIGluIGEgc2luZ2xlIHRleHQgbm9kZSwgd2Ugc3BsaXQgdGhlIHRleHQgbm9kZSBpbnRv
IGEgc2VwYXJhdGUgbm9kZSBmb3IgZWFjaCBwYXJhZ3JhcGguCiAgICAgICAgaWYgKGN1cnJlbnRQ
YXJhZ3JhcGhTdGFydC5kZWVwRXF1aXZhbGVudCgpLm5vZGUoKS0+aXNUZXh0Tm9kZSgpICYmIGN1
cnJlbnRQYXJhZ3JhcGhTdGFydC5kZWVwRXF1aXZhbGVudCgpLm5vZGUoKSA9PSBzdGFydE9mUGFy
YWdyYXBoKGN1cnJlbnRQYXJhZ3JhcGhTdGFydC5wcmV2aW91cygpKS5kZWVwRXF1aXZhbGVudCgp
Lm5vZGUoKSkgewogICAgICAgICAgICBUZXh0KiB0ZXh0Tm9kZSA9IHN0YXRpY19jYXN0PFRleHQg
Kj4oY3VycmVudFBhcmFncmFwaFN0YXJ0LmRlZXBFcXVpdmFsZW50KCkubm9kZSgpKTsKICAgICAg
ICAgICAgaW50IG9mZnNldCA9IGN1cnJlbnRQYXJhZ3JhcGhTdGFydC5kZWVwRXF1aXZhbGVudCgp
Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpOwogICAgICAgICAgICBzcGxpdFRleHROb2RlKHRleHRO
b2RlLCBvZmZzZXQpOwogICAgICAgICAgICBjdXJyZW50UGFyYWdyYXBoU3RhcnQgPSBWaXNpYmxl
UG9zaXRpb24odGV4dE5vZGUsIDAsIFZQX0RFRkFVTFRfQUZGSU5JVFkpOwogICAgICAgICAgICBo
YXNTcGxpdCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIFZpc2libGVQb3NpdGlvbiBuZXh0UGFy
YWdyYXBoID0gc3RhcnRPZlBhcmFncmFwaChlbmRPZlBhcmFncmFwaChjdXJyZW50UGFyYWdyYXBo
U3RhcnQpLm5leHQoKSk7CiAgICAgICAgaWYgKG5leHRQYXJhZ3JhcGguaXNOdWxsKCkpCiAgICAg
ICAgICAgIGJyZWFrOwogICAgICAgIGN1cnJlbnRQYXJhZ3JhcGhTdGFydCA9IG5leHRQYXJhZ3Jh
cGg7CiAgICB9CiAgICByZXR1cm4gaGFzU3BsaXQ7Cn0KCnZvaWQgSW5kZW50T3V0ZGVudENvbW1h
bmQ6Om91dGRlbnRQYXJhZ3JhcGgoKQp7CiAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVN0YXJ0
T2ZQYXJhZ3JhcGggPSBzdGFydE9mUGFyYWdyYXBoKGVuZGluZ1NlbGVjdGlvbigpLnZpc2libGVT
dGFydCgpKTsKICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlRW5kT2ZQYXJhZ3JhcGggPSBlbmRP
ZlBhcmFncmFwaCh2aXNpYmxlU3RhcnRPZlBhcmFncmFwaCk7CgogICAgTm9kZSogZW5jbG9zaW5n
Tm9kZSA9IGVuY2xvc2luZ05vZGVPZlR5cGUodmlzaWJsZVN0YXJ0T2ZQYXJhZ3JhcGguZGVlcEVx
dWl2YWxlbnQoKSwgJmlzTGlzdE9ySW5kZW50QmxvY2txdW90ZSk7CiAgICBpZiAoIWVuY2xvc2lu
Z05vZGUgfHwgIWVuY2xvc2luZ05vZGUtPnBhcmVudE5vZGUoKS0+aXNDb250ZW50RWRpdGFibGUo
KSkgIC8vIFdlIGNhbid0IG91dGRlbnQgaWYgdGhlcmUgaXMgbm8gcGxhY2UgdG8gZ28hCiAgICAg
ICAgcmV0dXJuOwoKICAgIC8vIFVzZSBJbnNlcnRMaXN0Q29tbWFuZCB0byByZW1vdmUgdGhlIHNl
bGVjdGlvbiBmcm9tIHRoZSBsaXN0CiAgICBpZiAoZW5jbG9zaW5nTm9kZS0+aGFzVGFnTmFtZShv
bFRhZykpIHsKICAgICAgICBhcHBseUNvbW1hbmRUb0NvbXBvc2l0ZShJbnNlcnRMaXN0Q29tbWFu
ZDo6Y3JlYXRlKGRvY3VtZW50KCksIEluc2VydExpc3RDb21tYW5kOjpPcmRlcmVkTGlzdCkpOwog
ICAgICAgIHJldHVybjsgICAgICAgIAogICAgfQogICAgaWYgKGVuY2xvc2luZ05vZGUtPmhhc1Rh
Z05hbWUodWxUYWcpKSB7CiAgICAgICAgYXBwbHlDb21tYW5kVG9Db21wb3NpdGUoSW5zZXJ0TGlz
dENvbW1hbmQ6OmNyZWF0ZShkb2N1bWVudCgpLCBJbnNlcnRMaXN0Q29tbWFuZDo6VW5vcmRlcmVk
TGlzdCkpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgLy8gVGhlIHNlbGVjdGlvbiBp
cyBpbnNpZGUgYSBibG9ja3F1b3RlIGkuZS4gZW5jbG9zaW5nTm9kZSBpcyBhIGJsb2NrcXVvdGUK
ICAgIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkluRW5jbG9zaW5nQmxvY2sgPSBWaXNpYmxlUG9z
aXRpb24oUG9zaXRpb24oZW5jbG9zaW5nTm9kZSwgMCkpOwogICAgVmlzaWJsZVBvc2l0aW9uIHN0
YXJ0T2ZFbmNsb3NpbmdCbG9jayA9IHN0YXJ0T2ZCbG9jayhwb3NpdGlvbkluRW5jbG9zaW5nQmxv
Y2spOwogICAgVmlzaWJsZVBvc2l0aW9uIGxhc3RQb3NpdGlvbkluRW5jbG9zaW5nQmxvY2sgPSBW
aXNpYmxlUG9zaXRpb24oUG9zaXRpb24oZW5jbG9zaW5nTm9kZSwgZW5jbG9zaW5nTm9kZS0+Y2hp
bGROb2RlQ291bnQoKSkpOwogICAgVmlzaWJsZVBvc2l0aW9uIGVuZE9mRW5jbG9zaW5nQmxvY2sg
PSBlbmRPZkJsb2NrKGxhc3RQb3NpdGlvbkluRW5jbG9zaW5nQmxvY2spOwogICAgaWYgKHZpc2li
bGVTdGFydE9mUGFyYWdyYXBoID09IHN0YXJ0T2ZFbmNsb3NpbmdCbG9jayAmJgogICAgICAgIHZp
c2libGVFbmRPZlBhcmFncmFwaCA9PSBlbmRPZkVuY2xvc2luZ0Jsb2NrKSB7CiAgICAgICAgLy8g
VGhlIGJsb2NrcXVvdGUgZG9lc24ndCBjb250YWluIGFueXRoaW5nIG91dHNpZGUgdGhlIHBhcmFn
cmFwaCwgc28gaXQgY2FuIGJlIHRvdGFsbHkgcmVtb3ZlZC4KICAgICAgICBOb2RlKiBzcGxpdFBv
aW50ID0gZW5jbG9zaW5nTm9kZS0+bmV4dFNpYmxpbmcoKTsKICAgICAgICByZW1vdmVOb2RlUHJl
c2VydmluZ0NoaWxkcmVuKGVuY2xvc2luZ05vZGUpOwogICAgICAgIC8vIG91dGRlbnRSZWdpb24o
KSBhc3N1bWVzIGl0IGlzIG9wZXJhdGluZyBvbiB0aGUgZmlyc3QgcGFyYWdyYXBoIG9mIGFuIGVu
Y2xvc2luZyBibG9ja3F1b3RlLCBidXQgaWYgdGhlcmUgYXJlIG11bHRpcGx5IG5lc3RlZCBibG9j
a3F1b3RlcyBhbmQgd2UndmUKICAgICAgICAvLyBqdXN0IHJlbW92ZWQgb25lLCB0aGVuIHRoaXMg
YXNzdW1wdGlvbiBpc24ndCB0cnVlLiBCeSBzcGxpdHRpbmcgdGhlIG5leHQgY29udGFpbmluZyBi
bG9ja3F1b3RlIGFmdGVyIHRoaXMgbm9kZSwgd2Uga2VlcCB0aGlzIGFzc3VtcHRpb24gdHJ1ZQog
ICAgICAgIGlmIChzcGxpdFBvaW50KSB7CiAgICAgICAgICAgIGlmIChOb2RlKiBzcGxpdFBvaW50
UGFyZW50ID0gc3BsaXRQb2ludC0+cGFyZW50Tm9kZSgpKSB7CiAgICAgICAgICAgICAgICBpZiAo
c3BsaXRQb2ludFBhcmVudC0+aGFzVGFnTmFtZShibG9ja3F1b3RlVGFnKQogICAgICAgICAgICAg
ICAgICAgICYmICFzcGxpdFBvaW50LT5oYXNUYWdOYW1lKGJsb2NrcXVvdGVUYWcpCiAgICAgICAg
ICAgICAgICAgICAgJiYgc3BsaXRQb2ludFBhcmVudC0+cGFyZW50Tm9kZSgpLT5pc0NvbnRlbnRF
ZGl0YWJsZSgpKSAvLyBXZSBjYW4ndCBvdXRkZW50IGlmIHRoZXJlIGlzIG5vIHBsYWNlIHRvIGdv
IQogICAgICAgICAgICAgICAgICAgIHNwbGl0RWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4o
c3BsaXRQb2ludFBhcmVudCksIHNwbGl0UG9pbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfQog
ICAgICAgIAogICAgICAgIHVwZGF0ZUxheW91dCgpOwogICAgICAgIHZpc2libGVTdGFydE9mUGFy
YWdyYXBoID0gVmlzaWJsZVBvc2l0aW9uKHZpc2libGVTdGFydE9mUGFyYWdyYXBoLmRlZXBFcXVp
dmFsZW50KCkpOwogICAgICAgIHZpc2libGVFbmRPZlBhcmFncmFwaCA9IFZpc2libGVQb3NpdGlv
bih2aXNpYmxlRW5kT2ZQYXJhZ3JhcGguZGVlcEVxdWl2YWxlbnQoKSk7CiAgICAgICAgaWYgKHZp
c2libGVTdGFydE9mUGFyYWdyYXBoLmlzTm90TnVsbCgpICYmICFpc1N0YXJ0T2ZQYXJhZ3JhcGgo
dmlzaWJsZVN0YXJ0T2ZQYXJhZ3JhcGgpKQogICAgICAgICAgICBpbnNlcnROb2RlQXQoY3JlYXRl
QnJlYWtFbGVtZW50KGRvY3VtZW50KCkpLCB2aXNpYmxlU3RhcnRPZlBhcmFncmFwaC5kZWVwRXF1
aXZhbGVudCgpKTsKICAgICAgICBpZiAodmlzaWJsZUVuZE9mUGFyYWdyYXBoLmlzTm90TnVsbCgp
ICYmICFpc0VuZE9mUGFyYWdyYXBoKHZpc2libGVFbmRPZlBhcmFncmFwaCkpCiAgICAgICAgICAg
IGluc2VydE5vZGVBdChjcmVhdGVCcmVha0VsZW1lbnQoZG9jdW1lbnQoKSksIHZpc2libGVFbmRP
ZlBhcmFncmFwaC5kZWVwRXF1aXZhbGVudCgpKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQogICAg
Tm9kZSogZW5jbG9zaW5nQmxvY2tGbG93ID0gZW5jbG9zaW5nQmxvY2sodmlzaWJsZVN0YXJ0T2ZQ
YXJhZ3JhcGguZGVlcEVxdWl2YWxlbnQoKS5ub2RlKCkpOwogICAgUmVmUHRyPE5vZGU+IHNwbGl0
QmxvY2txdW90ZU5vZGUgPSBlbmNsb3NpbmdOb2RlOwogICAgaWYgKGVuY2xvc2luZ0Jsb2NrRmxv
dyAhPSBlbmNsb3NpbmdOb2RlKQogICAgICAgIHNwbGl0QmxvY2txdW90ZU5vZGUgPSBzcGxpdFRy
ZWVUb05vZGUoZW5jbG9zaW5nQmxvY2tGbG93LCBlbmNsb3NpbmdOb2RlLCB0cnVlKTsKICAgIGVs
c2UgewogICAgICAgIC8vIFdlIHNwbGl0IHRoZSBibG9ja3F1b3RlIGF0IHdoZXJlIHdlIHN0YXJ0
IG91dGRlbnRpbmcuCiAgICAgICAgc3BsaXRFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihl
bmNsb3NpbmdOb2RlKSwgdmlzaWJsZVN0YXJ0T2ZQYXJhZ3JhcGguZGVlcEVxdWl2YWxlbnQoKS5u
b2RlKCkpOwogICAgfQogICAgUmVmUHRyPE5vZGU+IHBsYWNlaG9sZGVyID0gY3JlYXRlQnJlYWtF
bGVtZW50KGRvY3VtZW50KCkpOwogICAgaW5zZXJ0Tm9kZUJlZm9yZShwbGFjZWhvbGRlciwgc3Bs
aXRCbG9ja3F1b3RlTm9kZSk7CiAgICBtb3ZlUGFyYWdyYXBoKHN0YXJ0T2ZQYXJhZ3JhcGgodmlz
aWJsZVN0YXJ0T2ZQYXJhZ3JhcGgpLCBlbmRPZlBhcmFncmFwaCh2aXNpYmxlRW5kT2ZQYXJhZ3Jh
cGgpLCBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24ocGxhY2Vob2xkZXIuZ2V0KCksIDApKSwgdHJ1
ZSk7Cn0KCnZvaWQgSW5kZW50T3V0ZGVudENvbW1hbmQ6Om91dGRlbnRSZWdpb24oY29uc3QgVmlz
aWJsZVBvc2l0aW9uJiBzdGFydE9mU2VsZWN0aW9uLCBjb25zdCBWaXNpYmxlUG9zaXRpb24mIGVu
ZE9mU2VsZWN0aW9uKQp7CiAgICBWaXNpYmxlUG9zaXRpb24gZW5kT2ZMYXN0UGFyYWdyYXBoID0g
ZW5kT2ZQYXJhZ3JhcGgoZW5kT2ZTZWxlY3Rpb24pOwoKICAgIGlmIChlbmRPZlBhcmFncmFwaChz
dGFydE9mU2VsZWN0aW9uKSA9PSBlbmRPZkxhc3RQYXJhZ3JhcGgpIHsKICAgICAgICBvdXRkZW50
UGFyYWdyYXBoKCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICBQb3NpdGlvbiBvcmln
aW5hbFNlbGVjdGlvbkVuZCA9IGVuZGluZ1NlbGVjdGlvbigpLmVuZCgpOwogICAgVmlzaWJsZVBv
c2l0aW9uIGVuZE9mQ3VycmVudFBhcmFncmFwaCA9IGVuZE9mUGFyYWdyYXBoKHN0YXJ0T2ZTZWxl
Y3Rpb24pOwogICAgVmlzaWJsZVBvc2l0aW9uIGVuZEFmdGVyU2VsZWN0aW9uID0gZW5kT2ZQYXJh
Z3JhcGgoZW5kT2ZQYXJhZ3JhcGgoZW5kT2ZTZWxlY3Rpb24pLm5leHQoKSk7CgogICAgd2hpbGUg
KGVuZE9mQ3VycmVudFBhcmFncmFwaCAhPSBlbmRBZnRlclNlbGVjdGlvbikgewogICAgICAgIFZp
c2libGVQb3NpdGlvbiBlbmRPZk5leHRQYXJhZ3JhcGggPSBlbmRPZlBhcmFncmFwaChlbmRPZkN1
cnJlbnRQYXJhZ3JhcGgubmV4dCgpKTsKICAgICAgICBpZiAoZW5kT2ZDdXJyZW50UGFyYWdyYXBo
ID09IGVuZE9mTGFzdFBhcmFncmFwaCkKICAgICAgICAgICAgc2V0RW5kaW5nU2VsZWN0aW9uKFZp
c2libGVTZWxlY3Rpb24ob3JpZ2luYWxTZWxlY3Rpb25FbmQsIERPV05TVFJFQU0pKTsKICAgICAg
ICBlbHNlCiAgICAgICAgICAgIHNldEVuZGluZ1NlbGVjdGlvbihlbmRPZkN1cnJlbnRQYXJhZ3Jh
cGgpOwogICAgICAgIAogICAgICAgIG91dGRlbnRQYXJhZ3JhcGgoKTsKICAgICAgICAKICAgICAg
ICAvLyBvdXRkZW50UGFyYWdyYXBoIGNvdWxkIG1vdmUgbW9yZSB0aGFuIG9uZSBwYXJhZ3JhcGgg
aWYgdGhlIHBhcmFncmFwaAogICAgICAgIC8vIGlzIGluIGEgbGlzdCBpdGVtLiBBcyBhIHJlc3Vs
dCwgZW5kQWZ0ZXJTZWxlY3Rpb24gYW5kIGVuZE9mTmV4dFBhcmFncmFwaAogICAgICAgIC8vIGNv
dWxkIHJlZmVyIHRvIHBvc2l0aW9ucyBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50LgogICAgICAg
IGlmIChlbmRBZnRlclNlbGVjdGlvbi5pc05vdE51bGwoKSAmJiAhZW5kQWZ0ZXJTZWxlY3Rpb24u
ZGVlcEVxdWl2YWxlbnQoKS5ub2RlKCktPmluRG9jdW1lbnQoKSkKICAgICAgICAgICAgYnJlYWs7
CiAgICAgICAgICAgIAogICAgICAgIGlmIChlbmRPZk5leHRQYXJhZ3JhcGguaXNOb3ROdWxsKCkg
JiYgIWVuZE9mTmV4dFBhcmFncmFwaC5kZWVwRXF1aXZhbGVudCgpLm5vZGUoKS0+aW5Eb2N1bWVu
dCgpKSB7CiAgICAgICAgICAgIGVuZE9mQ3VycmVudFBhcmFncmFwaCA9IGVuZGluZ1NlbGVjdGlv
bigpLmVuZCgpOwogICAgICAgICAgICBlbmRPZk5leHRQYXJhZ3JhcGggPSBlbmRPZlBhcmFncmFw
aChlbmRPZkN1cnJlbnRQYXJhZ3JhcGgubmV4dCgpKTsKICAgICAgICB9CiAgICAgICAgZW5kT2ZD
dXJyZW50UGFyYWdyYXBoID0gZW5kT2ZOZXh0UGFyYWdyYXBoOwogICAgfQp9Cgp2b2lkIEluZGVu
dE91dGRlbnRDb21tYW5kOjpkb0FwcGx5KCkKewogICAgaWYgKCFlbmRpbmdTZWxlY3Rpb24oKS5p
c05vbk9ycGhhbmVkQ2FyZXRPclJhbmdlKCkpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmICghZW5k
aW5nU2VsZWN0aW9uKCkucm9vdEVkaXRhYmxlRWxlbWVudCgpKQogICAgICAgIHJldHVybjsKICAg
ICAgICAKICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlRW5kID0gZW5kaW5nU2VsZWN0aW9uKCku
dmlzaWJsZUVuZCgpOwogICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFydCA9IGVuZGluZ1Nl
bGVjdGlvbigpLnZpc2libGVTdGFydCgpOwogICAgLy8gV2hlbiBhIHNlbGVjdGlvbiBlbmRzIGF0
IHRoZSBzdGFydCBvZiBhIHBhcmFncmFwaCwgd2UgcmFyZWx5IHBhaW50IAogICAgLy8gdGhlIHNl
bGVjdGlvbiBnYXAgYmVmb3JlIHRoYXQgcGFyYWdyYXBoLCBiZWNhdXNlIHRoZXJlIG9mdGVuIGlz
IG5vIGdhcC4gIAogICAgLy8gSW4gYSBjYXNlIGxpa2UgdGhpcywgaXQncyBub3Qgb2J2aW91cyB0
byB0aGUgdXNlciB0aGF0IHRoZSBzZWxlY3Rpb24gCiAgICAvLyBlbmRzICJpbnNpZGUiIHRoYXQg
cGFyYWdyYXBoLCBzbyBpdCB3b3VsZCBiZSBjb25mdXNpbmcgaWYgSW5kZW50L091dGRlbnQgCiAg
ICAvLyBvcGVyYXRlZCBvbiB0aGF0IHBhcmFncmFwaC4KICAgIC8vIEZJWE1FOiBXZSBwYWludCB0
aGUgZ2FwIGJlZm9yZSBzb21lIHBhcmFncmFwaHMgdGhhdCBhcmUgaW5kZW50ZWQgd2l0aCBsZWZ0
IAogICAgLy8gbWFyZ2luL3BhZGRpbmcsIGJ1dCBub3Qgb3RoZXJzLiAgV2Ugc2hvdWxkIG1ha2Ug
dGhlIGdhcCBwYWludGluZyBtb3JlIGNvbnNpc3RlbnQgYW5kIAogICAgLy8gdGhlbiB1c2UgYSBs
ZWZ0IG1hcmdpbi9wYWRkaW5nIHJ1bGUgaGVyZS4KICAgIGlmICh2aXNpYmxlRW5kICE9IHZpc2li
bGVTdGFydCAmJiBpc1N0YXJ0T2ZQYXJhZ3JhcGgodmlzaWJsZUVuZCkpCiAgICAgICAgc2V0RW5k
aW5nU2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24odmlzaWJsZVN0YXJ0LCB2aXNpYmxlRW5kLnBy
ZXZpb3VzKHRydWUpKSk7CgogICAgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rp
b25Gb3JQYXJhZ3JhcGhJdGVyYXRpb24oZW5kaW5nU2VsZWN0aW9uKCkpOwogICAgVmlzaWJsZVBv
c2l0aW9uIHN0YXJ0T2ZTZWxlY3Rpb24gPSBzZWxlY3Rpb24udmlzaWJsZVN0YXJ0KCk7CiAgICBW
aXNpYmxlUG9zaXRpb24gZW5kT2ZTZWxlY3Rpb24gPSBzZWxlY3Rpb24udmlzaWJsZUVuZCgpOwog
ICAgCiAgICBpbnQgc3RhcnRJbmRleCA9IGluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uKHN0YXJ0T2ZT
ZWxlY3Rpb24pOwogICAgaW50IGVuZEluZGV4ID0gaW5kZXhGb3JWaXNpYmxlUG9zaXRpb24oZW5k
T2ZTZWxlY3Rpb24pOwogICAgCiAgICBBU1NFUlQoIXN0YXJ0T2ZTZWxlY3Rpb24uaXNOdWxsKCkp
OwogICAgQVNTRVJUKCFlbmRPZlNlbGVjdGlvbi5pc051bGwoKSk7CiAgICAKICAgIGlmIChtX3R5
cGVPZkFjdGlvbiA9PSBJbmRlbnQpCiAgICAgICAgaW5kZW50UmVnaW9uKHN0YXJ0T2ZTZWxlY3Rp
b24sIGVuZE9mU2VsZWN0aW9uKTsKICAgIGVsc2UKICAgICAgICBvdXRkZW50UmVnaW9uKHN0YXJ0
T2ZTZWxlY3Rpb24sIGVuZE9mU2VsZWN0aW9uKTsKCiAgICB1cGRhdGVMYXlvdXQoKTsKICAgIAog
ICAgUmVmUHRyPFJhbmdlPiBzdGFydFJhbmdlID0gVGV4dEl0ZXJhdG9yOjpyYW5nZUZyb21Mb2Nh
dGlvbkFuZExlbmd0aChkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSwgc3RhcnRJbmRleCwg
MCwgdHJ1ZSk7CiAgICBSZWZQdHI8UmFuZ2U+IGVuZFJhbmdlID0gVGV4dEl0ZXJhdG9yOjpyYW5n
ZUZyb21Mb2NhdGlvbkFuZExlbmd0aChkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSwgZW5k
SW5kZXgsIDAsIHRydWUpOwogICAgaWYgKHN0YXJ0UmFuZ2UgJiYgZW5kUmFuZ2UpCiAgICAgICAg
c2V0RW5kaW5nU2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24oc3RhcnRSYW5nZS0+c3RhcnRQb3Np
dGlvbigpLCBlbmRSYW5nZS0+c3RhcnRQb3NpdGlvbigpLCBET1dOU1RSRUFNKSk7Cn0KCn0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>69525</attachid>
            <date>2010-10-01 15:12:08 -0700</date>
            <delta_ts>2010-10-01 17:32:36 -0700</delta_ts>
            <desc>adds an abstract class to be inherited by FormatBlockCommand and IndentOutdentCommand</desc>
            <filename>bug-46840-20101001151207.patch</filename>
            <type>text/plain</type>
            <size>44662</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2ODkyNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTEgQEAKKzIwMTAtMTAtMDEgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRm9y
bWF0QmxvY2tDb21tYW5kIGFuZCBJbmRlbnRPdXRkZW50Q29tbWFuZCBzaG91bGQgdXNlIHRoZSBz
YW1lIGNvZGUgdG8gaXRlcmF0ZSBwYXJhZ3JhcGhzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD00Njg0MAorCisgICAgICAgIEFkZGVkIEFwcGx5QmxvY2tF
bGVtZW50Q29tbWFuZCwgd2hpY2ggaXMgYW4gYWJzdHJhY3QgY2xhc3MgaW5oZXJpdGVkIGJ5IEZv
cm1hdEJsb2NrQ29tbWFuZAorICAgICAgICBhbmQgSW5kZW50T3V0ZGVudENvbW1hbmQuICBJdCBp
cyBpbnRlbmRlZCB0byBiZSBpbmhlcml0ZWQgYnkgSW5zZXJ0TGlzdENvbW1hbmQgYXMgd2VsbC4K
KworICAgICAgICBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQncyBkb0FwcGx5IHZlcmlmaWVzIHRo
ZSBjdXJyZW50IHNlbGVjdGlvbiBhbmQgZXhpdHMgZWFybHkKKyAgICAgICAgaWYgaXQncyBpbnZh
bGlkIG9yIG9ycGhhbmVkIG9yIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBvdXRzaWRlIGVk
aXRhYmxlIHJlZ2lvbi4KKyAgICAgICAgSXQgdGhlbiBjYWxscyBmb3JtYXRTZWxlY3Rpb24gdG8g
YXBwbHkgdGhlIGJsb2NrIGVsZW1lbnQgYWZ0ZXIgd2hpY2ggZG9BcHBseSByZXN0b3JlcyB0aGUg
c2VsZWN0aW9uLgorICAgICAgICBmb3JtYXRTZWxlY3Rpb24gaXRlcmF0ZXMgdGhyb3VnaCBwYXJh
Z3JhcGhzIGFuZCBjYWxscyBmb3JtYXRQYXJhZ3JhcGgsIGEgcHVyZSB2aXJ0dWFsIGZ1bmN0aW9u
CisgICAgICAgIGltcGxlbWVudGVkIGJ5IEZvcm1hdEJsb2NrQ29tbWFuZCBhbmQgSW5kZW50T3V0
ZGVudENvbW1hbmQsIG9uIGVhY2ggcGFyYWdyYXBoLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBh
cmUgYWRkZWQgc2luY2UgdGhpcyBpcyBhIHJlZmFjdG9yaW5nLgorCisgICAgICAgICogQW5kcm9p
ZC5tazogQWRkZWQgQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmNwcC4KKyAgICAgICAgKiBDTWFr
ZUxpc3RzLnR4dDogRGl0dG8uCisgICAgICAgICogR05VbWFrZWZpbGUuYW06IEFkZGVkIEFwcGx5
QmxvY2tFbGVtZW50Q29tbWFuZC5jcHAgYW5kIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5oLgor
ICAgICAgICAqIFdlYkNvcmUuZ3lwaTogRGl0dG8uCisgICAgICAgICogV2ViQ29yZS5wcm86IERp
dHRvLgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajogRGl0dG8u
CisgICAgICAgICogZWRpdGluZy9BcHBseUJsb2NrRWxlbWVudENvbW1hbmQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OmNvdW50UGFyYWdyYXBocyk6IE1vdmVkIGZyb20gSW5kZW50T3V0
ZGVudENvbW1hbmQuY3BwCisgICAgICAgIChXZWJDb3JlOjpBcHBseUJsb2NrRWxlbWVudENvbW1h
bmQ6OkFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZCk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
QXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kOjpkb0FwcGx5KTogTW92ZWQgZnJvbSBJbmRlbnRPdXRk
ZW50Q29tbWFuZDo6ZG9BcHBseS4KKyAgICAgICAgKFdlYkNvcmU6OkFwcGx5QmxvY2tFbGVtZW50
Q29tbWFuZDo6Zm9ybWF0U2VsZWN0aW9uKTogTW92ZWQgZnJvbSBJbmRlbnRPdXRkZW50Q29tbWFu
ZDo6aW5kZW50UmVnaW9uLgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlCbG9ja0VsZW1lbnRDb21t
YW5kOjpjcmVhdGVCbG9ja0VsZW1lbnQpOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkFwcGx5
QmxvY2tFbGVtZW50Q29tbWFuZDo6c3BsaXRUZXh0Tm9kZXMpOiBNb3ZlZCBmcm9tIEluZGVudE91
dGRlbnRDb21tYW5kOjpzcGxpdFRleHROb2Rlcy4KKyAgICAgICAgKiBlZGl0aW5nL0FwcGx5Qmxv
Y2tFbGVtZW50Q29tbWFuZC5oOiBBZGRlZC4KKyAgICAgICAgKiBlZGl0aW5nL0VkaXRpbmdBbGxJ
bk9uZS5jcHA6CisgICAgICAgICogZWRpdGluZy9FZGl0b3JDb21tYW5kLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OmV4ZWN1dGVGb3JtYXRCbG9jayk6CisgICAgICAgICogZWRpdGluZy9Gb3JtYXRC
bG9ja0NvbW1hbmQuY3BwOiBSZW1vdmVkIGRvQXBwbHkuCisgICAgICAgIChXZWJDb3JlOjpGb3Jt
YXRCbG9ja0NvbW1hbmQ6OkZvcm1hdEJsb2NrQ29tbWFuZCk6IENhbGxzIEFwcGx5QmxvY2tFbGVt
ZW50Q29tbWFuZCdzIGNvbnN0cnVjdG9yLgorICAgICAgICAoV2ViQ29yZTo6Rm9ybWF0QmxvY2tD
b21tYW5kOjpmb3JtYXRQYXJhZ3JhcGgpOiBSZW5hbWVkIGZyb20gZG9BcHBseUZvclNpbmdsZVBh
cmFncmFwaC4KKyAgICAgICAgKiBlZGl0aW5nL0Zvcm1hdEJsb2NrQ29tbWFuZC5oOiBGb3JtYXRC
bG9ja0NvbW1hbmQgaW5oZXJpdHMgZnJvbSBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQuCisgICAg
ICAgIChXZWJDb3JlOjpGb3JtYXRCbG9ja0NvbW1hbmQ6OmNyZWF0ZSk6IFVzZXMgUXVhbGlmaWVk
TmFtZSBmb3IgdGhlIHRhZyBuYW1lIGluc3RlYWQgb2YgQXRvbWljU3RyaW5nLgorICAgICAgICAq
IGVkaXRpbmcvSW5kZW50T3V0ZGVudENvbW1hbmQuY3BwOiBSZW1vdmVkIGRvQXBwbHksIGluZGVu
dEludG9CbG9ja3F1b3RlLCBhbmQgc3BsaXRUZXh0Tm9kZXMuCisgICAgICAgIChXZWJDb3JlOjpJ
bmRlbnRPdXRkZW50Q29tbWFuZDo6SW5kZW50T3V0ZGVudENvbW1hbmQpOiBDYWxscyBBcHBseUJs
b2NrRWxlbWVudENvbW1hbmQncyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgKFdlYkNvcmU6OkluZGVu
dE91dGRlbnRDb21tYW5kOjppbmRlbnRJbnRvQmxvY2txdW90ZSk6IFRoZSBjb2RlIHRvIG51bGxp
ZnkgdGFyZ2V0QmxvY2txdW90ZQorICAgICAgICB3aGVuIHRoZSBuZXh0IHBhcmFncmFwaCBpcyBp
biBhIGRpZmZlcmVudCB0YWJsZSBjZWxsIGlzIG1vdmVkIHRvIEFwcGx5QmxvY2tFbGVtZW50Q29t
bWFuZDo6Zm9ybWF0U2VsZWN0aW9uLgorICAgICAgICAoV2ViQ29yZTo6SW5kZW50T3V0ZGVudENv
bW1hbmQ6OmZvcm1hdFNlbGVjdGlvbik6IEFkZGVkLiBDYWxscyBvdXRkZW50UmVnaW9uIHdoZW4g
b3V0ZGVudGluZy4KKyAgICAgICAgKFdlYkNvcmU6OkluZGVudE91dGRlbnRDb21tYW5kOjpmb3Jt
YXRQYXJhZ3JhcGgpOiBBZGRlZC4gQ2FsbHMgdHJ5SW5kZW50aW5nQXNMaXN0SXRlbSBhbmQgaW5k
ZW50SW50b0Jsb2NrcXVvdGUuCisgICAgICAgICogZWRpdGluZy9JbmRlbnRPdXRkZW50Q29tbWFu
ZC5oOiBJbmRlbnRPdXRkZW50Q29tbWFuZCBpbmhlcml0cyBmcm9tIEFwcGx5QmxvY2tFbGVtZW50
Q29tbWFuZC4KKwogMjAxMC0xMC0wMSAgRGF2aWQgSHlhdHQgIDxoeWF0dEBhcHBsZS5jb20+CiAK
ICAgICAgICAgUmV2aWV3ZWQgYnkgU2FtIFdlaW5pZy4KSW5kZXg6IFdlYkNvcmUvQW5kcm9pZC5t
awo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0FuZHJvaWQubWsJKHJldmlzaW9uIDY4OTA1KQorKysg
V2ViQ29yZS9BbmRyb2lkLm1rCSh3b3JraW5nIGNvcHkpCkBAIC0xOTgsNiArMTk4LDcgQEAgTE9D
QUxfU1JDX0ZJTEVTIDo9ICQoTE9DQUxfU1JDX0ZJTEVTKSBcCiAJZG9tL2RlZmF1bHQvUGxhdGZv
cm1NZXNzYWdlUG9ydENoYW5uZWwuY3BwIFwKIAlcCiAJZWRpdGluZy9BcHBlbmROb2RlQ29tbWFu
ZC5jcHAgXAorCWVkaXRpbmcvQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmNwcCBcCiAJZWRpdGlu
Zy9BcHBseVN0eWxlQ29tbWFuZC5jcHAgXAogCWVkaXRpbmcvQnJlYWtCbG9ja3F1b3RlQ29tbWFu
ZC5jcHAgXAogCWVkaXRpbmcvQ29tcG9zaXRlRWRpdENvbW1hbmQuY3BwIFwKSW5kZXg6IFdlYkNv
cmUvQ01ha2VMaXN0cy50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAko
cmV2aXNpb24gNjg5MDUpCisrKyBXZWJDb3JlL0NNYWtlTGlzdHMudHh0CSh3b3JraW5nIGNvcHkp
CkBAIC04ODIsNiArODgyLDcgQEAgU0VUKFdlYkNvcmVfU09VUkNFUwogICAgIGRvbS9kZWZhdWx0
L1BsYXRmb3JtTWVzc2FnZVBvcnRDaGFubmVsLmNwcAogCiAgICAgZWRpdGluZy9BcHBlbmROb2Rl
Q29tbWFuZC5jcHAKKyAgICBlZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHAKICAg
ICBlZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcAogICAgIGVkaXRpbmcvQnJlYWtCbG9ja3F1
b3RlQ29tbWFuZC5jcHAKICAgICBlZGl0aW5nL0NvbXBvc2l0ZUVkaXRDb21tYW5kLmNwcApJbmRl
eDogV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0dOVW1ha2Vm
aWxlLmFtCShyZXZpc2lvbiA2ODkwNSkKKysrIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0JKHdvcmtp
bmcgY29weSkKQEAgLTEyNTYsNiArMTI1Niw4IEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJV2Vi
Q29yZS9kb20vWE1MRG9jdW1lbnRQYXJzZXJTY29wZS5oIFwKIAlXZWJDb3JlL2VkaXRpbmcvQXBw
ZW5kTm9kZUNvbW1hbmQuY3BwIFwKIAlXZWJDb3JlL2VkaXRpbmcvQXBwZW5kTm9kZUNvbW1hbmQu
aCBcCisJV2ViQ29yZS9lZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHAgXAorCVdl
YkNvcmUvZWRpdGluZy9BcHBseUJsb2NrRWxlbWVudENvbW1hbmQuaCBcCiAJV2ViQ29yZS9lZGl0
aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcCBcCiAJV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVD
b21tYW5kLmggXAogCVdlYkNvcmUvZWRpdGluZy9CcmVha0Jsb2NrcXVvdGVDb21tYW5kLmNwcCBc
CkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNv
cmUuZ3lwaQkocmV2aXNpb24gNjg5MDUpCisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2lu
ZyBjb3B5KQpAQCAtMTM0MSw2ICsxMzQxLDggQEAKICAgICAgICAgICAgICdlZGl0aW5nL3d4L0Vk
aXRvcld4LmNwcCcsCiAgICAgICAgICAgICAnZWRpdGluZy9BcHBlbmROb2RlQ29tbWFuZC5jcHAn
LAogICAgICAgICAgICAgJ2VkaXRpbmcvQXBwZW5kTm9kZUNvbW1hbmQuaCcsCisgICAgICAgICAg
ICAnZWRpdGluZy9BcHBseUJsb2NrRWxlbWVudENvbW1hbmQuY3BwJywKKyAgICAgICAgICAgICdl
ZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5oJywKICAgICAgICAgICAgICdlZGl0aW5n
L0FwcGx5U3R5bGVDb21tYW5kLmNwcCcsCiAgICAgICAgICAgICAnZWRpdGluZy9BcHBseVN0eWxl
Q29tbWFuZC5oJywKICAgICAgICAgICAgICdlZGl0aW5nL0JyZWFrQmxvY2txdW90ZUNvbW1hbmQu
Y3BwJywKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5wcm8KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9X
ZWJDb3JlLnBybwkocmV2aXNpb24gNjg5MDUpCisrKyBXZWJDb3JlL1dlYkNvcmUucHJvCSh3b3Jr
aW5nIGNvcHkpCkBAIC03NzIsNiArNzcyLDcgQEAgU09VUkNFUyArPSBcCiAgICAgZG9tL1hNTERv
Y3VtZW50UGFyc2VyUXQuY3BwIFwKICAgICBkb20vZGVmYXVsdC9QbGF0Zm9ybU1lc3NhZ2VQb3J0
Q2hhbm5lbC5jcHAgXAogICAgIGVkaXRpbmcvQXBwZW5kTm9kZUNvbW1hbmQuY3BwIFwKKyAgICBl
ZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHAgXAogICAgIGVkaXRpbmcvQXBwbHlT
dHlsZUNvbW1hbmQuY3BwIFwKICAgICBlZGl0aW5nL0JyZWFrQmxvY2txdW90ZUNvbW1hbmQuY3Bw
IFwKICAgICBlZGl0aW5nL0NvbXBvc2l0ZUVkaXRDb21tYW5kLmNwcCBcCkBAIC0xNjY3LDYgKzE2
NjgsNyBAQCBIRUFERVJTICs9IFwKICAgICBkb20vV2hlZWxFdmVudC5oIFwKICAgICBkb20vWE1M
RG9jdW1lbnRQYXJzZXIuaCBcCiAgICAgZWRpdGluZy9BcHBlbmROb2RlQ29tbWFuZC5oIFwKKyAg
ICBlZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5oIFwKICAgICBlZGl0aW5nL0FwcGx5
U3R5bGVDb21tYW5kLmggXAogICAgIGVkaXRpbmcvQnJlYWtCbG9ja3F1b3RlQ29tbWFuZC5oIFwK
ICAgICBlZGl0aW5nL0NvbXBvc2l0ZUVkaXRDb21tYW5kLmggXApJbmRleDogV2ViQ29yZS9XZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDY4OTA1KQorKysgV2ViQ29y
ZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTI4
OTgsNiArMjg5OCw4IEBACiAJCTk3REQ0RDg2MEZERjRENkUwMEVDRjlBNCAvKiBYU1NBdWRpdG9y
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDk3REQ0
RDg0MEZERjRENkQwMEVDRjlBNCAvKiBYU1NBdWRpdG9yLmNwcCAqLzsgfTsKIAkJOTdERDREODcw
RkRGNEQ2RTAwRUNGOUE0IC8qIFhTU0F1ZGl0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDk3REQ0RDg1MEZERjRENkUwMEVDRjlBNCAvKiBYU1NBdWRp
dG9yLmggKi87IH07CiAJCTk3RUY3REZFMTA3RTU1QjcwMEQ3QzQ5QyAvKiBTY3JpcHRDb250cm9s
bGVyQmFzZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA5N0VGN0RGRDEwN0U1NUI3MDBEN0M0OUMgLyogU2NyaXB0Q29udHJvbGxlckJhc2UuY3BwICov
OyB9OworCQk5QjQxNzA2NDEyNTY2MkIzMDA2QjI4RkMgLyogQXBwbHlCbG9ja0VsZW1lbnRDb21t
YW5kLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5QjQx
NzA2MjEyNTY2MkIzMDA2QjI4RkMgLyogQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmggKi87IHNl
dHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKKwkJOUI0MTcwNjUxMjU2
NjJCMzAwNkIyOEZDIC8qIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5QjQxNzA2MzEyNTY2MkIzMDA2QjI4
RkMgLyogQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmNwcCAqLzsgfTsKIAkJOUYwRDZCMkUxMjFC
RkVCQTAwNkMwMjg4IC8qIEluc3BlY3RvclByb2ZpbGVyQWdlbnQuY3BwIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOUYwRDZCMkMxMjFCRkVCQTAwNkMwMjg4
IC8qIEluc3BlY3RvclByb2ZpbGVyQWdlbnQuY3BwICovOyB9OwogCQk5RjBENkIyRjEyMUJGRUJB
MDA2QzAyODggLyogSW5zcGVjdG9yUHJvZmlsZXJBZ2VudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOUYwRDZCMkQxMjFCRkVCQTAwNkMwMjg4IC8qIElu
c3BlY3RvclByb2ZpbGVyQWdlbnQuaCAqLzsgfTsKIAkJOUYzQjk0N0UxMjI0MTc1ODAwNTMwNEU3
IC8qIFNjcmlwdEhlYXBTbmFwc2hvdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gOUYzQjk0N0QxMjI0MTc1ODAwNTMwNEU3IC8qIFNjcmlwdEhlYXBTbmFw
c2hvdC5oICovOyB9OwpAQCAtODg5OSw2ICs4OTAxLDggQEAKIAkJOTdERDREODQwRkRGNEQ2RDAw
RUNGOUE0IC8qIFhTU0F1ZGl0b3IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gWFNTQXVkaXRvci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTk3REQ0
RDg1MEZERjRENkUwMEVDRjlBNCAvKiBYU1NBdWRpdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IFhTU0F1ZGl0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
OTdFRjdERkQxMDdFNTVCNzAwRDdDNDlDIC8qIFNjcmlwdENvbnRyb2xsZXJCYXNlLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFNjcmlwdENvbnRyb2xsZXJCYXNlLmNw
cDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJOUI0MTcwNjIxMjU2NjJCMzAwNkIyOEZD
IC8qIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKKwkJOUI0MTcwNjMxMjU2NjJCMzAwNkIyOEZDIC8qIEFwcGx5QmxvY2tFbGVtZW50Q29t
bWFuZC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBBcHBseUJsb2Nr
RWxlbWVudENvbW1hbmQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk5RjBENkIy
QzEyMUJGRUJBMDA2QzAyODggLyogSW5zcGVjdG9yUHJvZmlsZXJBZ2VudC5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJbnNwZWN0b3JQcm9maWxlckFnZW50LmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJOUYwRDZCMkQxMjFCRkVCQTAwNkMwMjg4IC8q
IEluc3BlY3RvclByb2ZpbGVyQWdlbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gSW5zcGVjdG9yUHJvZmlsZXJBZ2VudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQk5RjNCOTQ3RDEyMjQxNzU4MDA1MzA0RTcgLyogU2NyaXB0SGVhcFNuYXBzaG90LmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNjcmlwdEhlYXBTbmFwc2hvdC5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTQyNTYsNiArMTQyNjAsOCBAQAogCQkJCUVENTAxREM5
MEIyNDlGMzkwMEFFMThEOSAvKiBtYWMgKi8sCiAJCQkJOTMzMDlEODcwOTlFNjQ5MTAwNTZFNTgx
IC8qIEFwcGVuZE5vZGVDb21tYW5kLmNwcCAqLywKIAkJCQk5MzMwOUQ4ODA5OUU2NDkxMDA1NkU1
ODEgLyogQXBwZW5kTm9kZUNvbW1hbmQuaCAqLywKKwkJCQk5QjQxNzA2MjEyNTY2MkIzMDA2QjI4
RkMgLyogQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmggKi8sCisJCQkJOUI0MTcwNjMxMjU2NjJC
MzAwNkIyOEZDIC8qIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHAgKi8sCiAJCQkJOTMzMDlE
ODkwOTlFNjQ5MTAwNTZFNTgxIC8qIEFwcGx5U3R5bGVDb21tYW5kLmNwcCAqLywKIAkJCQk5MzMw
OUQ4QTA5OUU2NDkxMDA1NkU1ODEgLyogQXBwbHlTdHlsZUNvbW1hbmQuaCAqLywKIAkJCQk5MzMw
OUQ4QjA5OUU2NDkxMDA1NkU1ODEgLyogQnJlYWtCbG9ja3F1b3RlQ29tbWFuZC5jcHAgKi8sCkBA
IC0xODE4MSw2ICsxODE4Nyw3IEBACiAJCQkJMjRGNTRFQUQxMDFGRTkxNDAwMEFFNzQxIC8qIEFw
cGxpY2F0aW9uQ2FjaGVIb3N0LmggaW4gSGVhZGVycyAqLywKIAkJCQkxQThGNkJDMTBEQjU1Q0RD
MDAxREI3OTQgLyogQXBwbGljYXRpb25DYWNoZVJlc291cmNlLmggaW4gSGVhZGVycyAqLywKIAkJ
CQkxQTJBQUM1OTBEQzJBM0IxMDBBMjBEOUEgLyogQXBwbGljYXRpb25DYWNoZVN0b3JhZ2UuaCBp
biBIZWFkZXJzICovLAorCQkJCTlCNDE3MDY0MTI1NjYyQjMwMDZCMjhGQyAvKiBBcHBseUJsb2Nr
RWxlbWVudENvbW1hbmQuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzMzA5REQ5MDk5RTY0OTIwMDU2
RTU4MSAvKiBBcHBseVN0eWxlQ29tbWFuZC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNTEyREQ4RjYw
RDkxRTZBRjAwMEY4OUVFIC8qIEFyY2hpdmUuaCBpbiBIZWFkZXJzICovLAogCQkJCTUxMkREOEZE
MEQ5MUU2QUYwMDBGODlFRSAvKiBBcmNoaXZlRmFjdG9yeS5oIGluIEhlYWRlcnMgKi8sCkBAIC0y
MTI5MSw2ICsyMTI5OCw3IEBACiAJCQkJMjRGNTRFQUMxMDFGRTkxNDAwMEFFNzQxIC8qIEFwcGxp
Y2F0aW9uQ2FjaGVIb3N0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTFBOEY2QkMwMERCNTVDREMw
MDFEQjc5NCAvKiBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2UuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJMUEyQUFDNTgwREMyQTNCMTAwQTIwRDlBIC8qIEFwcGxpY2F0aW9uQ2FjaGVTdG9yYWdlLmNw
cCBpbiBTb3VyY2VzICovLAorCQkJCTlCNDE3MDY1MTI1NjYyQjMwMDZCMjhGQyAvKiBBcHBseUJs
b2NrRWxlbWVudENvbW1hbmQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTMzMDlERDgwOTlFNjQ5
MjAwNTZFNTgxIC8qIEFwcGx5U3R5bGVDb21tYW5kLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTUx
MkREOEZBMEQ5MUU2QUYwMDBGODlFRSAvKiBBcmNoaXZlRmFjdG9yeS5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQk1MTJERDhGQjBEOTFFNkFGMDAwRjg5RUUgLyogQXJjaGl2ZVJlc291cmNlLmNwcCBp
biBTb3VyY2VzICovLApJbmRleDogV2ViQ29yZS9lZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29t
bWFuZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50
Q29tbWFuZC5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2VkaXRpbmcvQXBwbHlCbG9ja0Vs
ZW1lbnRDb21tYW5kLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJp
YnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhl
IG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICog
IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmgiCisKKyNpbmNs
dWRlICJIVE1MRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIlRl
eHQuaCIKKyNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJWaXNpYmxlUG9zaXRp
b24uaCIKKyNpbmNsdWRlICJodG1sZWRpdGluZy5oIgorI2luY2x1ZGUgInZpc2libGVfdW5pdHMu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwor
ICAgIAorLy8gVGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIC0xIGlmIHdlIGFyZSB1bmFibGUgdG8g
Y291bnQgdGhlIHBhcmFncmFwaHMgYmV0d2VlbiB8c3RhcnR8IGFuZCB8ZW5kfC4KK3N0YXRpYyBp
bnQgY291bnRQYXJhZ3JhcGhzKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZGaXJzdFBhcmFn
cmFwaCwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRPZkxhc3RQYXJhZ3JhcGgpCit7CisgICAg
aW50IGNvdW50ID0gMDsKKyAgICBWaXNpYmxlUG9zaXRpb24gY3VyID0gZW5kT2ZGaXJzdFBhcmFn
cmFwaDsKKyAgICB3aGlsZSAoY3VyICE9IGVuZE9mTGFzdFBhcmFncmFwaCkgeworICAgICAgICAr
K2NvdW50OworICAgICAgICBjdXIgPSBlbmRPZlBhcmFncmFwaChjdXIubmV4dCgpKTsKKyAgICAg
ICAgLy8gSWYgc3RhcnQgaXMgYmVmb3JlIGEgdGFibGUgYW5kIGVuZCBpcyBpbnNpZGUgYSB0YWJs
ZSwgd2Ugd2lsbCBuZXZlciBoaXQgZW5kIGJlY2F1c2UgdGhlCisgICAgICAgIC8vIHdob2xlIHRh
YmxlIGlzIGNvbnNpZGVyZWQgYSBzaW5nbGUgcGFyYWdyYXBoLgorICAgICAgICBpZiAoY3VyLmlz
TnVsbCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7
Cit9CisKK0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZDo6QXBwbHlCbG9ja0VsZW1lbnRDb21tYW5k
KERvY3VtZW50KiBkb2N1bWVudCwgY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgY29uc3Qg
QXRvbWljU3RyaW5nJiBjbGFzc05hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgaW5saW5lU3R5bGUp
CisgICAgOiBDb21wb3NpdGVFZGl0Q29tbWFuZChkb2N1bWVudCkKKyAgICAsIG1fdGFnTmFtZSh0
YWdOYW1lKQorICAgICwgbV9jbGFzc05hbWUoY2xhc3NOYW1lKQorICAgICwgbV9pbmxpbmVTdHls
ZShpbmxpbmVTdHlsZSkKK3sKK30KKworQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kOjpBcHBseUJs
b2NrRWxlbWVudENvbW1hbmQoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBRdWFsaWZpZWROYW1l
JiB0YWdOYW1lKQorICAgIDogQ29tcG9zaXRlRWRpdENvbW1hbmQoZG9jdW1lbnQpCisgICAgLCBt
X3RhZ05hbWUodGFnTmFtZSkKK3sKK30KKwordm9pZCBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQ6
OmRvQXBwbHkoKQoreworICAgIGlmICghZW5kaW5nU2VsZWN0aW9uKCkuaXNOb25PcnBoYW5lZENh
cmV0T3JSYW5nZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWVuZGluZ1NlbGVjdGlv
bigpLnJvb3RFZGl0YWJsZUVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVmlzaWJs
ZVBvc2l0aW9uIHZpc2libGVFbmQgPSBlbmRpbmdTZWxlY3Rpb24oKS52aXNpYmxlRW5kKCk7Cisg
ICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFydCA9IGVuZGluZ1NlbGVjdGlvbigpLnZpc2li
bGVTdGFydCgpOworICAgIC8vIFdoZW4gYSBzZWxlY3Rpb24gZW5kcyBhdCB0aGUgc3RhcnQgb2Yg
YSBwYXJhZ3JhcGgsIHdlIHJhcmVseSBwYWludCAKKyAgICAvLyB0aGUgc2VsZWN0aW9uIGdhcCBi
ZWZvcmUgdGhhdCBwYXJhZ3JhcGgsIGJlY2F1c2UgdGhlcmUgb2Z0ZW4gaXMgbm8gZ2FwLiAgCisg
ICAgLy8gSW4gYSBjYXNlIGxpa2UgdGhpcywgaXQncyBub3Qgb2J2aW91cyB0byB0aGUgdXNlciB0
aGF0IHRoZSBzZWxlY3Rpb24gCisgICAgLy8gZW5kcyAiaW5zaWRlIiB0aGF0IHBhcmFncmFwaCwg
c28gaXQgd291bGQgYmUgY29uZnVzaW5nIGlmIEluZGVudC9PdXRkZW50IAorICAgIC8vIG9wZXJh
dGVkIG9uIHRoYXQgcGFyYWdyYXBoLgorICAgIC8vIEZJWE1FOiBXZSBwYWludCB0aGUgZ2FwIGJl
Zm9yZSBzb21lIHBhcmFncmFwaHMgdGhhdCBhcmUgaW5kZW50ZWQgd2l0aCBsZWZ0IAorICAgIC8v
IG1hcmdpbi9wYWRkaW5nLCBidXQgbm90IG90aGVycy4gIFdlIHNob3VsZCBtYWtlIHRoZSBnYXAg
cGFpbnRpbmcgbW9yZSBjb25zaXN0ZW50IGFuZCAKKyAgICAvLyB0aGVuIHVzZSBhIGxlZnQgbWFy
Z2luL3BhZGRpbmcgcnVsZSBoZXJlLgorICAgIGlmICh2aXNpYmxlRW5kICE9IHZpc2libGVTdGFy
dCAmJiBpc1N0YXJ0T2ZQYXJhZ3JhcGgodmlzaWJsZUVuZCkpCisgICAgICAgIHNldEVuZGluZ1Nl
bGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKHZpc2libGVTdGFydCwgdmlzaWJsZUVuZC5wcmV2aW91
cyh0cnVlKSkpOworCisgICAgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25G
b3JQYXJhZ3JhcGhJdGVyYXRpb24oZW5kaW5nU2VsZWN0aW9uKCkpOworICAgIFZpc2libGVQb3Np
dGlvbiBzdGFydE9mU2VsZWN0aW9uID0gc2VsZWN0aW9uLnZpc2libGVTdGFydCgpOworICAgIFZp
c2libGVQb3NpdGlvbiBlbmRPZlNlbGVjdGlvbiA9IHNlbGVjdGlvbi52aXNpYmxlRW5kKCk7Cisg
ICAgQVNTRVJUKCFzdGFydE9mU2VsZWN0aW9uLmlzTnVsbCgpKTsKKyAgICBBU1NFUlQoIWVuZE9m
U2VsZWN0aW9uLmlzTnVsbCgpKTsKKyAgICBpbnQgc3RhcnRJbmRleCA9IGluZGV4Rm9yVmlzaWJs
ZVBvc2l0aW9uKHN0YXJ0T2ZTZWxlY3Rpb24pOworICAgIGludCBlbmRJbmRleCA9IGluZGV4Rm9y
VmlzaWJsZVBvc2l0aW9uKGVuZE9mU2VsZWN0aW9uKTsKKworICAgIGZvcm1hdFNlbGVjdGlvbihz
dGFydE9mU2VsZWN0aW9uLCBlbmRPZlNlbGVjdGlvbik7CisKKyAgICB1cGRhdGVMYXlvdXQoKTsK
KworICAgIFJlZlB0cjxSYW5nZT4gc3RhcnRSYW5nZSA9IFRleHRJdGVyYXRvcjo6cmFuZ2VGcm9t
TG9jYXRpb25BbmRMZW5ndGgoZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCksIHN0YXJ0SW5k
ZXgsIDAsIHRydWUpOworICAgIFJlZlB0cjxSYW5nZT4gZW5kUmFuZ2UgPSBUZXh0SXRlcmF0b3I6
OnJhbmdlRnJvbUxvY2F0aW9uQW5kTGVuZ3RoKGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgp
LCBlbmRJbmRleCwgMCwgdHJ1ZSk7CisgICAgaWYgKHN0YXJ0UmFuZ2UgJiYgZW5kUmFuZ2UpCisg
ICAgICAgIHNldEVuZGluZ1NlbGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKHN0YXJ0UmFuZ2UtPnN0
YXJ0UG9zaXRpb24oKSwgZW5kUmFuZ2UtPnN0YXJ0UG9zaXRpb24oKSwgRE9XTlNUUkVBTSkpOwor
fQorCit2b2lkIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZDo6Zm9ybWF0U2VsZWN0aW9uKGNvbnN0
IFZpc2libGVQb3NpdGlvbiYgc3RhcnRPZlNlbGVjdGlvbiwgY29uc3QgVmlzaWJsZVBvc2l0aW9u
JiBlbmRPZlNlbGVjdGlvbikKK3sKKyAgICAvLyBTcGVjaWFsIGNhc2UgZW1wdHkgdW5zcGxpdHRh
YmxlIGVsZW1lbnRzIGJlY2F1c2UgdGhlcmUncyBub3RoaW5nIHRvIHNwbGl0CisgICAgLy8gYW5k
IHRoZXJlJ3Mgbm90aGluZyB0byBtb3ZlLgorICAgIFBvc2l0aW9uIHN0YXJ0ID0gc3RhcnRPZlNl
bGVjdGlvbi5kZWVwRXF1aXZhbGVudCgpLmRvd25zdHJlYW0oKTsKKyAgICBpZiAoaXNBdFVuc3Bs
aXR0YWJsZUVsZW1lbnQoc3RhcnQpKSB7CisgICAgICAgIFJlZlB0cjxFbGVtZW50PiBibG9ja3F1
b3RlID0gY3JlYXRlQmxvY2tFbGVtZW50KCk7CisgICAgICAgIGluc2VydE5vZGVBdChibG9ja3F1
b3RlLCBzdGFydCk7CisgICAgICAgIFJlZlB0cjxFbGVtZW50PiBwbGFjZWhvbGRlciA9IGNyZWF0
ZUJyZWFrRWxlbWVudChkb2N1bWVudCgpKTsKKyAgICAgICAgYXBwZW5kTm9kZShwbGFjZWhvbGRl
ciwgYmxvY2txdW90ZSk7CisgICAgICAgIHNldEVuZGluZ1NlbGVjdGlvbihWaXNpYmxlU2VsZWN0
aW9uKFBvc2l0aW9uKHBsYWNlaG9sZGVyLmdldCgpLCAwKSwgRE9XTlNUUkVBTSkpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgUmVmUHRyPEVsZW1lbnQ+IGJsb2NrcXVvdGVGb3JOZXh0
SW5kZW50OworICAgIFZpc2libGVQb3NpdGlvbiBlbmRPZkN1cnJlbnRQYXJhZ3JhcGggPSBlbmRP
ZlBhcmFncmFwaChzdGFydE9mU2VsZWN0aW9uKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gZW5kQWZ0
ZXJTZWxlY3Rpb24gPSBlbmRPZlBhcmFncmFwaChlbmRPZlBhcmFncmFwaChlbmRPZlNlbGVjdGlv
bikubmV4dCgpKTsKKyAgICBpbnQgZW5kT2ZDdXJyZW50UGFyYWdyYXBoSW5kZXggPSBpbmRleEZv
clZpc2libGVQb3NpdGlvbihlbmRPZkN1cnJlbnRQYXJhZ3JhcGgpOworICAgIGludCBlbmRBZnRl
clNlbGVjdGlvbkluZGV4ID0gaW5kZXhGb3JWaXNpYmxlUG9zaXRpb24oZW5kQWZ0ZXJTZWxlY3Rp
b24pOworCisgICAgLy8gV2hlbiBpbmRlbnRpbmcgd2l0aGluIGEgPHByZT4gdGFnLCB3ZSBuZWVk
IHRvIHNwbGl0IGVhY2ggcGFyYWdyYXBoIGludG8gYSBzZXBhcmF0ZSBub2RlIGZvciBtb3ZlUGFy
YWdyYXBoV2l0aENsb25lcyB0byB3b3JrLgorICAgIC8vIEhvd2V2ZXIsIHNwbGl0dGluZyB0ZXh0
IG5vZGVzIGNhbiBjYXVzZSBlbmRPZkN1cnJlbnRQYXJhZ3JhcGggYW5kIGVuZEFmdGVyU2VsZWN0
aW9uIHRvIHBvaW50IHRvIGFuIGludmFsaWQgcG9zaXRpb24gaWYgd2UKKyAgICAvLyBjaGFuZ2Vk
IHRoZSB0ZXh0IG5vZGUgaXQgd2FzIHBvaW50aW5nIGF0LiAgU28gd2UgaGF2ZSB0byByZXNldCB0
aGVzZSBwb3NpdGlvbnMuCisgICAgaW50IG51bVBhcmFncmFwaHMgPSBjb3VudFBhcmFncmFwaHMo
ZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBlbmRBZnRlclNlbGVjdGlvbik7CisgICAgaWYgKHNwbGl0
VGV4dE5vZGVzKHN0YXJ0T2ZQYXJhZ3JhcGgoc3RhcnRPZlNlbGVjdGlvbiksIG51bVBhcmFncmFw
aHMgKyAxKSkgeworICAgICAgICBSZWZQdHI8UmFuZ2U+IGVuZE9mQ3VycmVudFBhcmFncmFwaFJh
bmdlID0gVGV4dEl0ZXJhdG9yOjpyYW5nZUZyb21Mb2NhdGlvbkFuZExlbmd0aChkb2N1bWVudCgp
LT5kb2N1bWVudEVsZW1lbnQoKSwgZW5kT2ZDdXJyZW50UGFyYWdyYXBoSW5kZXgsIDAsIHRydWUp
OworICAgICAgICBSZWZQdHI8UmFuZ2U+IGVuZEFmdGVyU2VsZWN0aW9uUmFuZ2UgPSBUZXh0SXRl
cmF0b3I6OnJhbmdlRnJvbUxvY2F0aW9uQW5kTGVuZ3RoKGRvY3VtZW50KCktPmRvY3VtZW50RWxl
bWVudCgpLCBlbmRBZnRlclNlbGVjdGlvbkluZGV4LCAwLCB0cnVlKTsKKyAgICAgICAgaWYgKCFl
bmRPZkN1cnJlbnRQYXJhZ3JhcGhSYW5nZS5nZXQoKSB8fCAhZW5kQWZ0ZXJTZWxlY3Rpb25SYW5n
ZS5nZXQoKSkgeworICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZW5kT2ZDdXJyZW50UGFyYWdyYXBoID0gVmlz
aWJsZVBvc2l0aW9uKGVuZE9mQ3VycmVudFBhcmFncmFwaFJhbmdlLT5zdGFydFBvc2l0aW9uKCks
IERPV05TVFJFQU0pOworICAgICAgICBlbmRBZnRlclNlbGVjdGlvbiA9IFZpc2libGVQb3NpdGlv
bihlbmRBZnRlclNlbGVjdGlvblJhbmdlLT5zdGFydFBvc2l0aW9uKCksIERPV05TVFJFQU0pOwor
ICAgIH0KKworICAgIHdoaWxlIChlbmRPZkN1cnJlbnRQYXJhZ3JhcGggIT0gZW5kQWZ0ZXJTZWxl
Y3Rpb24pIHsKKyAgICAgICAgLy8gSXRlcmF0ZSBhY3Jvc3MgdGhlIHNlbGVjdGVkIHBhcmFncmFw
aHMuLi4KKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGVuZE9mTmV4dFBhcmFncmFwaCA9IGVuZE9m
UGFyYWdyYXBoKGVuZE9mQ3VycmVudFBhcmFncmFwaC5uZXh0KCkpOworICAgICAgICBOb2RlKiBl
bmNsb3NpbmdDZWxsID0gZW5jbG9zaW5nTm9kZU9mVHlwZShzdGFydCwgJmlzVGFibGVDZWxsKTsK
KworICAgICAgICBmb3JtYXRQYXJhZ3JhcGgoZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBibG9ja3F1
b3RlRm9yTmV4dEluZGVudCk7CisKKyAgICAgICAgLy8gRG9uJ3QgcHV0IHRoZSBuZXh0IHBhcmFn
cmFwaCBpbiB0aGUgYmxvY2txdW90ZSB3ZSBqdXN0IGNyZWF0ZWQgZm9yIHRoaXMgcGFyYWdyYXBo
IHVubGVzcyAKKyAgICAgICAgLy8gdGhlIG5leHQgcGFyYWdyYXBoIGlzIGluIHRoZSBzYW1lIGNl
bGwuCisgICAgICAgIGlmIChlbmNsb3NpbmdDZWxsICYmIGVuY2xvc2luZ0NlbGwgIT0gZW5jbG9z
aW5nTm9kZU9mVHlwZShlbmRPZk5leHRQYXJhZ3JhcGguZGVlcEVxdWl2YWxlbnQoKSwgJmlzVGFi
bGVDZWxsKSkKKyAgICAgICAgICAgIGJsb2NrcXVvdGVGb3JOZXh0SW5kZW50ID0gMDsKKworICAg
ICAgICAvLyBpbmRlbnRJbnRvQmxvY2txdW90ZSBjb3VsZCBtb3ZlIG1vcmUgdGhhbiBvbmUgcGFy
YWdyYXBoIGlmIHRoZSBwYXJhZ3JhcGgKKyAgICAgICAgLy8gaXMgaW4gYSBsaXN0IGl0ZW0gb3Ig
YSB0YWJsZS4gQXMgYSByZXN1bHQsIGVuZEFmdGVyU2VsZWN0aW9uIGNvdWxkIHJlZmVyIHRvIGEg
cG9zaXRpb24KKyAgICAgICAgLy8gbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudC4KKyAgICAgICAg
aWYgKGVuZEFmdGVyU2VsZWN0aW9uLmlzTm90TnVsbCgpICYmICFlbmRBZnRlclNlbGVjdGlvbi5k
ZWVwRXF1aXZhbGVudCgpLm5vZGUoKS0+aW5Eb2N1bWVudCgpKQorICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIC8vIFNhbml0eSBjaGVjazogTWFrZSBzdXJlIG91ciBtb3ZlUGFyYWdyYXBoIGNh
bGxzIGRpZG4ndCByZW1vdmUgZW5kT2ZOZXh0UGFyYWdyYXBoLmRlZXBFcXVpdmFsZW50KCkubm9k
ZSgpCisgICAgICAgIC8vIElmIHNvbWVob3cgd2UgZGlkLCByZXR1cm4gdG8gcHJldmVudCBjcmFz
aGVzLgorICAgICAgICBpZiAoZW5kT2ZOZXh0UGFyYWdyYXBoLmlzTm90TnVsbCgpICYmICFlbmRP
Zk5leHRQYXJhZ3JhcGguZGVlcEVxdWl2YWxlbnQoKS5ub2RlKCktPmluRG9jdW1lbnQoKSkgewor
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKyAgICAgICAgZW5kT2ZDdXJyZW50UGFyYWdyYXBoID0gZW5kT2ZOZXh0UGFyYWdy
YXBoOworICAgIH0KK30KKworUGFzc1JlZlB0cjxFbGVtZW50PiBBcHBseUJsb2NrRWxlbWVudENv
bW1hbmQ6OmNyZWF0ZUJsb2NrRWxlbWVudCgpIGNvbnN0Cit7CisgICAgUmVmUHRyPEVsZW1lbnQ+
IGVsZW1lbnQgPSBjcmVhdGVIVE1MRWxlbWVudChkb2N1bWVudCgpLCBtX3RhZ05hbWUpOworICAg
IGlmIChtX2NsYXNzTmFtZS5sZW5ndGgoKSkKKyAgICAgICAgZWxlbWVudC0+c2V0QXR0cmlidXRl
KGNsYXNzQXR0ciwgbV9jbGFzc05hbWUpOworICAgIGlmIChtX2lubGluZVN0eWxlLmxlbmd0aCgp
KQorICAgICAgICBlbGVtZW50LT5zZXRBdHRyaWJ1dGUoc3R5bGVBdHRyLCBtX2lubGluZVN0eWxl
KTsKKyAgICByZXR1cm4gZWxlbWVudC5yZWxlYXNlKCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBp
ZiBhdCBsZWFzdCBvbmUgdGV4dCBub2RlIHdhcyBzcGxpdC4KK2Jvb2wgQXBwbHlCbG9ja0VsZW1l
bnRDb21tYW5kOjpzcGxpdFRleHROb2Rlcyhjb25zdCBWaXNpYmxlUG9zaXRpb24mIHN0YXJ0LCBp
bnQgbnVtUGFyYWdyYXBocykKK3sKKyAgICBWaXNpYmxlUG9zaXRpb24gY3VycmVudFBhcmFncmFw
aFN0YXJ0ID0gc3RhcnQ7CisgICAgYm9vbCBoYXNTcGxpdCA9IGZhbHNlOworICAgIGludCBwYXJh
Z3JhcGhDb3VudDsKKyAgICBmb3IgKHBhcmFncmFwaENvdW50ID0gMDsgcGFyYWdyYXBoQ291bnQg
PCBudW1QYXJhZ3JhcGhzOyArK3BhcmFncmFwaENvdW50KSB7CisgICAgICAgIC8vIElmIHRoZXJl
IGFyZSBtdWx0aXBsZSBwYXJhZ3JhcGhzIGluIGEgc2luZ2xlIHRleHQgbm9kZSwgd2Ugc3BsaXQg
dGhlIHRleHQgbm9kZSBpbnRvIGEgc2VwYXJhdGUgbm9kZSBmb3IgZWFjaCBwYXJhZ3JhcGguCisg
ICAgICAgIGlmIChjdXJyZW50UGFyYWdyYXBoU3RhcnQuZGVlcEVxdWl2YWxlbnQoKS5ub2RlKCkt
PmlzVGV4dE5vZGUoKSAmJiBjdXJyZW50UGFyYWdyYXBoU3RhcnQuZGVlcEVxdWl2YWxlbnQoKS5u
b2RlKCkgPT0gc3RhcnRPZlBhcmFncmFwaChjdXJyZW50UGFyYWdyYXBoU3RhcnQucHJldmlvdXMo
KSkuZGVlcEVxdWl2YWxlbnQoKS5ub2RlKCkpIHsKKyAgICAgICAgICAgIFRleHQqIHRleHROb2Rl
ID0gc3RhdGljX2Nhc3Q8VGV4dCAqPihjdXJyZW50UGFyYWdyYXBoU3RhcnQuZGVlcEVxdWl2YWxl
bnQoKS5ub2RlKCkpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IGN1cnJlbnRQYXJhZ3JhcGhT
dGFydC5kZWVwRXF1aXZhbGVudCgpLm9mZnNldEluQ29udGFpbmVyTm9kZSgpOworICAgICAgICAg
ICAgc3BsaXRUZXh0Tm9kZSh0ZXh0Tm9kZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGN1cnJlbnRQ
YXJhZ3JhcGhTdGFydCA9IFZpc2libGVQb3NpdGlvbih0ZXh0Tm9kZSwgMCwgVlBfREVGQVVMVF9B
RkZJTklUWSk7CisgICAgICAgICAgICBoYXNTcGxpdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAg
ICAgVmlzaWJsZVBvc2l0aW9uIG5leHRQYXJhZ3JhcGggPSBzdGFydE9mUGFyYWdyYXBoKGVuZE9m
UGFyYWdyYXBoKGN1cnJlbnRQYXJhZ3JhcGhTdGFydCkubmV4dCgpKTsKKyAgICAgICAgaWYgKG5l
eHRQYXJhZ3JhcGguaXNOdWxsKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY3VycmVu
dFBhcmFncmFwaFN0YXJ0ID0gbmV4dFBhcmFncmFwaDsKKyAgICB9CisgICAgcmV0dXJuIGhhc1Nw
bGl0OworfQorCit9CkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvQXBwbHlCbG9ja0VsZW1lbnRDb21t
YW5kLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29t
bWFuZC5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9lZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50
Q29tbWFuZC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBBcHBseUJsb2Nr
RWxlbWVudENvbW1hbmRfaAorI2RlZmluZSBBcHBseUJsb2NrRWxlbWVudENvbW1hbmRfaAorCisj
aW5jbHVkZSAiQ29tcG9zaXRlRWRpdENvbW1hbmQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitjbGFzcyBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQgOiBwdWJsaWMgQ29tcG9zaXRlRWRpdENv
bW1hbmQgeworcHJvdGVjdGVkOgorICAgIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZChEb2N1bWVu
dCosIGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgY2xh
c3NOYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIGlubGluZVN0eWxlKTsKKyAgICBBcHBseUJsb2Nr
RWxlbWVudENvbW1hbmQoRG9jdW1lbnQqLCBjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lKTsK
KworICAgIHZpcnR1YWwgdm9pZCBkb0FwcGx5KCk7CisgICAgdmlydHVhbCB2b2lkIGZvcm1hdFNl
bGVjdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHN0YXJ0T2ZTZWxlY3Rpb24sIGNvbnN0IFZp
c2libGVQb3NpdGlvbiYgZW5kT2ZTZWxlY3Rpb24pOworICAgIHZpcnR1YWwgdm9pZCBmb3JtYXRQ
YXJhZ3JhcGgoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRPZkN1cnJlbnRQYXJhZ3JhcGgsIFJl
ZlB0cjxFbGVtZW50PiYpID0gMDsKKworICAgIFBhc3NSZWZQdHI8RWxlbWVudD4gY3JlYXRlQmxv
Y2tFbGVtZW50KCkgY29uc3Q7CisgICAgYm9vbCBzcGxpdFRleHROb2Rlcyhjb25zdCBWaXNpYmxl
UG9zaXRpb24mIHN0YXJ0LCBpbnQgbnVtUGFyYWdyYXBocyk7CisKKyAgICBRdWFsaWZpZWROYW1l
IG1fdGFnTmFtZTsKKyAgICBBdG9taWNTdHJpbmcgbV9jbGFzc05hbWU7CisgICAgQXRvbWljU3Ry
aW5nIG1faW5saW5lU3R5bGU7Cit9OworCit9CisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9lZGl0
aW5nL0VkaXRpbmdBbGxJbk9uZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL0Vk
aXRpbmdBbGxJbk9uZS5jcHAJKHJldmlzaW9uIDY4OTA1KQorKysgV2ViQ29yZS9lZGl0aW5nL0Vk
aXRpbmdBbGxJbk9uZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDYgKzI2LDcgQEAKIC8vIFRo
aXMgYWxsLWluLW9uZSBjcHAgZmlsZSBjdXRzIGRvd24gb24gdGVtcGxhdGUgYmxvYXQgdG8gYWxs
b3cgdXMgdG8gYnVpbGQgb3VyIFdpbmRvd3MgcmVsZWFzZSBidWlsZC4KIAogI2luY2x1ZGUgPEFw
cGVuZE5vZGVDb21tYW5kLmNwcD4KKyNpbmNsdWRlIDxBcHBseUJsb2NrRWxlbWVudENvbW1hbmQu
Y3BwPgogI2luY2x1ZGUgPEFwcGx5U3R5bGVDb21tYW5kLmNwcD4KICNpbmNsdWRlIDxCcmVha0Js
b2NrcXVvdGVDb21tYW5kLmNwcD4KICNpbmNsdWRlIDxDb21wb3NpdGVFZGl0Q29tbWFuZC5jcHA+
CkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvRWRpdG9yQ29tbWFuZC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9lZGl0aW5nL0VkaXRvckNvbW1hbmQuY3BwCShyZXZpc2lvbiA2ODkwNSkKKysrIFdl
YkNvcmUvZWRpdGluZy9FZGl0b3JDb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDM0LDcg
KzQzNCwxNCBAQCBzdGF0aWMgYm9vbCBleGVjdXRlRm9ybWF0QmxvY2soRnJhbWUqIGZyCiAgICAg
ICAgIHRhZ05hbWUgPSB0YWdOYW1lLnN1YnN0cmluZygxLCB0YWdOYW1lLmxlbmd0aCgpIC0gMik7
CiAgICAgaWYgKCF2YWxpZEJsb2NrVGFnKHRhZ05hbWUpKQogICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgYXBwbHlDb21tYW5kKEZvcm1hdEJsb2NrQ29tbWFuZDo6Y3JlYXRlKGZyYW1lLT5kb2N1
bWVudCgpLCB0YWdOYW1lKSk7CisKKyAgICBFeGNlcHRpb25Db2RlIGVjOworICAgIFN0cmluZyBs
b2NhbE5hbWUsIHByZWZpeDsKKyAgICBpZiAoIURvY3VtZW50OjpwYXJzZVF1YWxpZmllZE5hbWUo
dGFnTmFtZSwgcHJlZml4LCBsb2NhbE5hbWUsIGVjKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkVGFnTmFtZShwcmVmaXgsIGxvY2FsTmFtZSwgeGh0
bWxOYW1lc3BhY2VVUkkpOworCisgICAgYXBwbHlDb21tYW5kKEZvcm1hdEJsb2NrQ29tbWFuZDo6
Y3JlYXRlKGZyYW1lLT5kb2N1bWVudCgpLCBxdWFsaWZpZWRUYWdOYW1lKSk7CiAgICAgcmV0dXJu
IHRydWU7CiB9CiAKSW5kZXg6IFdlYkNvcmUvZWRpdGluZy9Gb3JtYXRCbG9ja0NvbW1hbmQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZWRpdGluZy9Gb3JtYXRCbG9ja0NvbW1hbmQuY3BwCShy
ZXZpc2lvbiA2ODkwNSkKKysrIFdlYkNvcmUvZWRpdGluZy9Gb3JtYXRCbG9ja0NvbW1hbmQuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zNiw2NiArMzYsMTYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewog
CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi1Gb3JtYXRCbG9ja0NvbW1hbmQ6OkZvcm1h
dEJsb2NrQ29tbWFuZChEb2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IEF0b21pY1N0cmluZyYgdGFn
TmFtZSkgCi0gICAgOiBDb21wb3NpdGVFZGl0Q29tbWFuZChkb2N1bWVudCksIG1fdGFnTmFtZSh0
YWdOYW1lKQorRm9ybWF0QmxvY2tDb21tYW5kOjpGb3JtYXRCbG9ja0NvbW1hbmQoRG9jdW1lbnQq
IGRvY3VtZW50LCBjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lKSAKKyAgICA6IEFwcGx5Qmxv
Y2tFbGVtZW50Q29tbWFuZChkb2N1bWVudCwgdGFnTmFtZSkKIHsKIH0KIAotdm9pZCBGb3JtYXRC
bG9ja0NvbW1hbmQ6OmRvQXBwbHkoKQordm9pZCBGb3JtYXRCbG9ja0NvbW1hbmQ6OmZvcm1hdFBh
cmFncmFwaChjb25zdCBWaXNpYmxlUG9zaXRpb24mIGVuZE9mQ3VycmVudFBhcmFncmFwaCwgUmVm
UHRyPEVsZW1lbnQ+JikKIHsKLSAgICBpZiAoIWVuZGluZ1NlbGVjdGlvbigpLmlzTm9uT3JwaGFu
ZWRDYXJldE9yUmFuZ2UoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmICghZW5kaW5n
U2VsZWN0aW9uKCkucm9vdEVkaXRhYmxlRWxlbWVudCgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZUVuZCA9IGVuZGluZ1NlbGVjdGlvbigpLnZpc2libGVF
bmQoKTsKLSAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVN0YXJ0ID0gZW5kaW5nU2VsZWN0aW9u
KCkudmlzaWJsZVN0YXJ0KCk7Ci0gICAgLy8gV2hlbiBhIHNlbGVjdGlvbiBlbmRzIGF0IHRoZSBz
dGFydCBvZiBhIHBhcmFncmFwaCwgd2UgcmFyZWx5IHBhaW50IAotICAgIC8vIHRoZSBzZWxlY3Rp
b24gZ2FwIGJlZm9yZSB0aGF0IHBhcmFncmFwaCwgYmVjYXVzZSB0aGVyZSBvZnRlbiBpcyBubyBn
YXAuICAKLSAgICAvLyBJbiBhIGNhc2UgbGlrZSB0aGlzLCBpdCdzIG5vdCBvYnZpb3VzIHRvIHRo
ZSB1c2VyIHRoYXQgdGhlIHNlbGVjdGlvbiAKLSAgICAvLyBlbmRzICJpbnNpZGUiIHRoYXQgcGFy
YWdyYXBoLCBzbyBpdCB3b3VsZCBiZSBjb25mdXNpbmcgaWYgRm9ybWF0QmxvY2sKLSAgICAvLyBv
cGVyYXRlZCBvbiB0aGF0IHBhcmFncmFwaC4KLSAgICAvLyBGSVhNRTogV2UgcGFpbnQgdGhlIGdh
cCBiZWZvcmUgc29tZSBwYXJhZ3JhcGhzIHRoYXQgYXJlIGluZGVudGVkIHdpdGggbGVmdCAKLSAg
ICAvLyBtYXJnaW4vcGFkZGluZywgYnV0IG5vdCBvdGhlcnMuICBXZSBzaG91bGQgbWFrZSB0aGUg
Z2FwIHBhaW50aW5nIG1vcmUgY29uc2lzdGVudCBhbmQgCi0gICAgLy8gdGhlbiB1c2UgYSBsZWZ0
IG1hcmdpbi9wYWRkaW5nIHJ1bGUgaGVyZS4KLSAgICBpZiAodmlzaWJsZUVuZCAhPSB2aXNpYmxl
U3RhcnQgJiYgaXNTdGFydE9mUGFyYWdyYXBoKHZpc2libGVFbmQpKSB7Ci0gICAgICAgIHNldEVu
ZGluZ1NlbGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKHZpc2libGVTdGFydCwgdmlzaWJsZUVuZC5w
cmV2aW91cyh0cnVlKSkpOwotICAgICAgICB2aXNpYmxlRW5kID0gZW5kaW5nU2VsZWN0aW9uKCku
dmlzaWJsZUVuZCgpOwotICAgIH0KLQotICAgIFZpc2libGVQb3NpdGlvbiBzdGFydE9mTGFzdFBh
cmFncmFwaCA9IHN0YXJ0T2ZQYXJhZ3JhcGgodmlzaWJsZUVuZCk7Ci0gICAgaWYgKGVuZGluZ1Nl
bGVjdGlvbigpLmlzQ2FyZXQoKSB8fCBzdGFydE9mUGFyYWdyYXBoKHZpc2libGVTdGFydCkgPT0g
c3RhcnRPZkxhc3RQYXJhZ3JhcGgpIHsKLSAgICAgICAgZG9BcHBseUZvclNpbmdsZVBhcmFncmFw
aCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc2V0RW5kaW5nU2VsZWN0aW9uKHZp
c2libGVTdGFydCk7Ci0gICAgZG9BcHBseUZvclNpbmdsZVBhcmFncmFwaCgpOwotICAgIHZpc2li
bGVTdGFydCA9IGVuZGluZ1NlbGVjdGlvbigpLnZpc2libGVTdGFydCgpOwotICAgIFZpc2libGVQ
b3NpdGlvbiBuZXh0UGFyYWdyYXBoID0gZW5kT2ZQYXJhZ3JhcGgodmlzaWJsZVN0YXJ0KS5uZXh0
KCk7Ci0gICAgd2hpbGUgKG5leHRQYXJhZ3JhcGguaXNOb3ROdWxsKCkgJiYgbmV4dFBhcmFncmFw
aCAhPSBzdGFydE9mTGFzdFBhcmFncmFwaCkgewotICAgICAgICBzZXRFbmRpbmdTZWxlY3Rpb24o
bmV4dFBhcmFncmFwaCk7Ci0gICAgICAgIGRvQXBwbHlGb3JTaW5nbGVQYXJhZ3JhcGgoKTsKLSAg
ICAgICAgbmV4dFBhcmFncmFwaCA9IGVuZE9mUGFyYWdyYXBoKGVuZGluZ1NlbGVjdGlvbigpLnZp
c2libGVTdGFydCgpKS5uZXh0KCk7Ci0gICAgfQotICAgIHNldEVuZGluZ1NlbGVjdGlvbih2aXNp
YmxlRW5kKTsKLSAgICBkb0FwcGx5Rm9yU2luZ2xlUGFyYWdyYXBoKCk7Ci0gICAgdmlzaWJsZUVu
ZCA9IGVuZGluZ1NlbGVjdGlvbigpLnZpc2libGVFbmQoKTsKLQotICAgIHNldEVuZGluZ1NlbGVj
dGlvbihWaXNpYmxlU2VsZWN0aW9uKHZpc2libGVTdGFydC5kZWVwRXF1aXZhbGVudCgpLCB2aXNp
YmxlRW5kLmRlZXBFcXVpdmFsZW50KCksIERPV05TVFJFQU0pKTsKLX0KLQotdm9pZCBGb3JtYXRC
bG9ja0NvbW1hbmQ6OmRvQXBwbHlGb3JTaW5nbGVQYXJhZ3JhcGgoKQotewotICAgIEV4Y2VwdGlv
bkNvZGUgZWM7Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSwgcHJlZml4OwotICAgIGlmICghRG9jdW1l
bnQ6OnBhcnNlUXVhbGlmaWVkTmFtZShtX3RhZ05hbWUsIHByZWZpeCwgbG9jYWxOYW1lLCBlYykp
Ci0gICAgICAgIHJldHVybjsKLSAgICBRdWFsaWZpZWROYW1lIHFUeXBlT2ZCbG9jayhwcmVmaXgs
IGxvY2FsTmFtZSwgeGh0bWxOYW1lc3BhY2VVUkkpOwotCisgICAgc2V0RW5kaW5nU2VsZWN0aW9u
KGVuZE9mQ3VycmVudFBhcmFncmFwaCk7CiAgICAgTm9kZSogcmVmTm9kZSA9IGVuY2xvc2luZ0Js
b2NrRmxvd0VsZW1lbnQoZW5kaW5nU2VsZWN0aW9uKCkudmlzaWJsZVN0YXJ0KCkpOwotICAgIGlm
IChyZWZOb2RlLT5oYXNUYWdOYW1lKHFUeXBlT2ZCbG9jaykpCisgICAgaWYgKHJlZk5vZGUtPmhh
c1RhZ05hbWUobV90YWdOYW1lKSkKICAgICAgICAgLy8gV2UncmUgYWxyZWFkeSBpbiBhIGJsb2Nr
IHdpdGggdGhlIGZvcm1hdCB3ZSB3YW50LCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5n
CiAgICAgICAgIHJldHVybjsKIApAQCAtMTAzLDcgKzUzLDcgQEAgdm9pZCBGb3JtYXRCbG9ja0Nv
bW1hbmQ6OmRvQXBwbHlGb3JTaW5nbAogICAgIFZpc2libGVQb3NpdGlvbiBwYXJhZ3JhcGhFbmQg
PSBlbmRPZlBhcmFncmFwaChlbmRpbmdTZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKSk7CiAgICAg
VmlzaWJsZVBvc2l0aW9uIGJsb2NrU3RhcnQgPSBzdGFydE9mQmxvY2soZW5kaW5nU2VsZWN0aW9u
KCkudmlzaWJsZVN0YXJ0KCkpOwogICAgIFZpc2libGVQb3NpdGlvbiBibG9ja0VuZCA9IGVuZE9m
QmxvY2soZW5kaW5nU2VsZWN0aW9uKCkudmlzaWJsZVN0YXJ0KCkpOwotICAgIFJlZlB0cjxFbGVt
ZW50PiBibG9ja05vZGUgPSBjcmVhdGVIVE1MRWxlbWVudChkb2N1bWVudCgpLCBtX3RhZ05hbWUp
OworICAgIFJlZlB0cjxFbGVtZW50PiBibG9ja05vZGUgPSBjcmVhdGVCbG9ja0VsZW1lbnQoKTsK
ICAgICBSZWZQdHI8RWxlbWVudD4gcGxhY2Vob2xkZXIgPSBjcmVhdGVCcmVha0VsZW1lbnQoZG9j
dW1lbnQoKSk7CiAKICAgICBOb2RlKiByb290ID0gZW5kaW5nU2VsZWN0aW9uKCkuc3RhcnQoKS5u
b2RlKCktPnJvb3RFZGl0YWJsZUVsZW1lbnQoKTsKSW5kZXg6IFdlYkNvcmUvZWRpdGluZy9Gb3Jt
YXRCbG9ja0NvbW1hbmQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2VkaXRpbmcvRm9ybWF0Qmxv
Y2tDb21tYW5kLmgJKHJldmlzaW9uIDY4OTA1KQorKysgV2ViQ29yZS9lZGl0aW5nL0Zvcm1hdEJs
b2NrQ29tbWFuZC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNiwyNSArMjYsMjMgQEAKICNpZm5kZWYg
Rm9ybWF0QmxvY2tDb21tYW5kX2gKICNkZWZpbmUgRm9ybWF0QmxvY2tDb21tYW5kX2gKIAorI2lu
Y2x1ZGUgIkFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5oIgogI2luY2x1ZGUgIkNvbXBvc2l0ZUVk
aXRDb21tYW5kLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgRm9ybWF0QmxvY2tD
b21tYW5kIDogcHVibGljIENvbXBvc2l0ZUVkaXRDb21tYW5kIHsKK2NsYXNzIEZvcm1hdEJsb2Nr
Q29tbWFuZCA6IHB1YmxpYyBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQgewogcHVibGljOgotICAg
IHN0YXRpYyBQYXNzUmVmUHRyPEZvcm1hdEJsb2NrQ29tbWFuZD4gY3JlYXRlKERvY3VtZW50KiBk
b2N1bWVudCwgY29uc3QgQXRvbWljU3RyaW5nJiB0YWdOYW1lKQorICAgIHN0YXRpYyBQYXNzUmVm
UHRyPEZvcm1hdEJsb2NrQ29tbWFuZD4gY3JlYXRlKERvY3VtZW50KiBkb2N1bWVudCwgY29uc3Qg
UXVhbGlmaWVkTmFtZSYgdGFnTmFtZSkKICAgICB7CiAgICAgICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgRm9ybWF0QmxvY2tDb21tYW5kKGRvY3VtZW50LCB0YWdOYW1lKSk7CiAgICAgfQogCiBwcml2
YXRlOgotICAgIEZvcm1hdEJsb2NrQ29tbWFuZChEb2N1bWVudCosIGNvbnN0IEF0b21pY1N0cmlu
ZyYgdGFnTmFtZSk7CisgICAgRm9ybWF0QmxvY2tDb21tYW5kKERvY3VtZW50KiwgY29uc3QgUXVh
bGlmaWVkTmFtZSYgdGFnTmFtZSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgZG9BcHBseSgpOwotICAg
IHZvaWQgZG9BcHBseUZvclNpbmdsZVBhcmFncmFwaCgpOworICAgIHZpcnR1YWwgdm9pZCBmb3Jt
YXRQYXJhZ3JhcGgoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRPZkN1cnJlbnRQYXJhZ3JhcGgs
IFJlZlB0cjxFbGVtZW50PiYpOwogICAgIHZpcnR1YWwgRWRpdEFjdGlvbiBlZGl0aW5nQWN0aW9u
KCkgY29uc3QgeyByZXR1cm4gRWRpdEFjdGlvbkZvcm1hdEJsb2NrOyB9Ci0KLSAgICBBdG9taWNT
dHJpbmcgbV90YWdOYW1lOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2Vi
Q29yZS9lZGl0aW5nL0luZGVudE91dGRlbnRDb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2VkaXRpbmcvSW5kZW50T3V0ZGVudENvbW1hbmQuY3BwCShyZXZpc2lvbiA2ODkwNSkKKysr
IFdlYkNvcmUvZWRpdGluZy9JbmRlbnRPdXRkZW50Q29tbWFuZC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTQ0LDQzICs0NCwxNSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIG5hbWVzcGFj
ZSBIVE1MTmFtZXM7CiAKLXN0YXRpYyBTdHJpbmcgaW5kZW50QmxvY2txdW90ZVN0cmluZygpCi17
Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHJpbmcsIHN0cmluZywgKCJ3ZWJraXQtaW5kZW50
LWJsb2NrcXVvdGUiKSk7Ci0gICAgcmV0dXJuIHN0cmluZzsKLX0KLQotc3RhdGljIFBhc3NSZWZQ
dHI8SFRNTEJsb2NrcXVvdGVFbGVtZW50PiBjcmVhdGVJbmRlbnRCbG9ja3F1b3RlRWxlbWVudChE
b2N1bWVudCogZG9jdW1lbnQpCi17Ci0gICAgUmVmUHRyPEhUTUxCbG9ja3F1b3RlRWxlbWVudD4g
ZWxlbWVudCA9IEhUTUxCbG9ja3F1b3RlRWxlbWVudDo6Y3JlYXRlKGRvY3VtZW50KTsKLSAgICBl
bGVtZW50LT5zZXRBdHRyaWJ1dGUoY2xhc3NBdHRyLCBpbmRlbnRCbG9ja3F1b3RlU3RyaW5nKCkp
OwotICAgIGVsZW1lbnQtPnNldEF0dHJpYnV0ZShzdHlsZUF0dHIsICJtYXJnaW46IDAgMCAwIDQw
cHg7IGJvcmRlcjogbm9uZTsgcGFkZGluZzogMHB4OyIpOwotICAgIHJldHVybiBlbGVtZW50LnJl
bGVhc2UoKTsKLX0KLQogc3RhdGljIGJvb2wgaXNMaXN0T3JJbmRlbnRCbG9ja3F1b3RlKGNvbnN0
IE5vZGUqIG5vZGUpCiB7CiAgICAgcmV0dXJuIG5vZGUgJiYgKG5vZGUtPmhhc1RhZ05hbWUodWxU
YWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUob2xUYWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUoYmxvY2tx
dW90ZVRhZykpOwogfQogCi0vLyBUaGlzIGZ1bmN0aW9uIGNhbiByZXR1cm4gLTEgaWYgd2UgYXJl
IHVuYWJsZSB0byBjb3VudCB0aGUgcGFyYWdyYXBocyBiZXR3ZWVuIHxzdGFydHwgYW5kIHxlbmR8
Lgotc3RhdGljIGludCBjb3VudFBhcmFncmFwaHMoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRP
ZkZpcnN0UGFyYWdyYXBoLCBjb25zdCBWaXNpYmxlUG9zaXRpb24mIGVuZE9mTGFzdFBhcmFncmFw
aCkKLXsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIFZpc2libGVQb3NpdGlvbiBjdXIgPSBlbmRP
ZkZpcnN0UGFyYWdyYXBoOwotICAgIHdoaWxlIChjdXIgIT0gZW5kT2ZMYXN0UGFyYWdyYXBoKSB7
Ci0gICAgICAgICsrY291bnQ7Ci0gICAgICAgIGN1ciA9IGVuZE9mUGFyYWdyYXBoKGN1ci5uZXh0
KCkpOwotICAgICAgICAvLyBJZiBzdGFydCBpcyBiZWZvcmUgYSB0YWJsZSBhbmQgZW5kIGlzIGlu
c2lkZSBhIHRhYmxlLCB3ZSB3aWxsIG5ldmVyIGhpdCBlbmQgYmVjYXVzZSB0aGUKLSAgICAgICAg
Ly8gd2hvbGUgdGFibGUgaXMgY29uc2lkZXJlZCBhIHNpbmdsZSBwYXJhZ3JhcGguCi0gICAgICAg
IGlmIChjdXIuaXNOdWxsKCkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJl
dHVybiBjb3VudDsKLX0KLQogSW5kZW50T3V0ZGVudENvbW1hbmQ6OkluZGVudE91dGRlbnRDb21t
YW5kKERvY3VtZW50KiBkb2N1bWVudCwgRUluZGVudFR5cGUgdHlwZU9mQWN0aW9uLCBpbnQgbWFy
Z2luSW5QaXhlbHMpCi0gICAgOiBDb21wb3NpdGVFZGl0Q29tbWFuZChkb2N1bWVudCksIG1fdHlw
ZU9mQWN0aW9uKHR5cGVPZkFjdGlvbiksIG1fbWFyZ2luSW5QaXhlbHMobWFyZ2luSW5QaXhlbHMp
CisgICAgOiBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQoZG9jdW1lbnQsIGJsb2NrcXVvdGVUYWcs
ICJ3ZWJraXQtaW5kZW50LWJsb2NrcXVvdGUiLCAibWFyZ2luOiAwIDAgMCA0MHB4OyBib3JkZXI6
IG5vbmU7IHBhZGRpbmc6IDBweDsiKQorICAgICwgbV90eXBlT2ZBY3Rpb24odHlwZU9mQWN0aW9u
KQorICAgICwgbV9tYXJnaW5JblBpeGVscyhtYXJnaW5JblBpeGVscykKIHsKIH0KIApAQCAtMTE2
LDEyICs4OCwxMCBAQCBib29sIEluZGVudE91dGRlbnRDb21tYW5kOjp0cnlJbmRlbnRpbmdBCiAg
ICAgcmV0dXJuIHRydWU7CiB9CiAgICAgCi12b2lkIEluZGVudE91dGRlbnRDb21tYW5kOjppbmRl
bnRJbnRvQmxvY2txdW90ZShjb25zdCBWaXNpYmxlUG9zaXRpb24mIGVuZE9mQ3VycmVudFBhcmFn
cmFwaCwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRPZk5leHRQYXJhZ3JhcGgsIFJlZlB0cjxF
bGVtZW50PiYgdGFyZ2V0QmxvY2txdW90ZSkKK3ZvaWQgSW5kZW50T3V0ZGVudENvbW1hbmQ6Omlu
ZGVudEludG9CbG9ja3F1b3RlKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZDdXJyZW50UGFy
YWdyYXBoLCBSZWZQdHI8RWxlbWVudD4mIHRhcmdldEJsb2NrcXVvdGUpCiB7Ci0gICAgTm9kZSog
ZW5jbG9zaW5nQ2VsbCA9IDA7Ci0KICAgICBQb3NpdGlvbiBzdGFydCA9IHN0YXJ0T2ZQYXJhZ3Jh
cGgoZW5kT2ZDdXJyZW50UGFyYWdyYXBoKS5kZWVwRXF1aXZhbGVudCgpOwotICAgIGVuY2xvc2lu
Z0NlbGwgPSBlbmNsb3NpbmdOb2RlT2ZUeXBlKHN0YXJ0LCAmaXNUYWJsZUNlbGwpOworICAgIE5v
ZGUqIGVuY2xvc2luZ0NlbGwgPSBlbmNsb3NpbmdOb2RlT2ZUeXBlKHN0YXJ0LCAmaXNUYWJsZUNl
bGwpOwogICAgIE5vZGUqIG5vZGVUb1NwbGl0VG87CiAgICAgaWYgKGVuY2xvc2luZ0NlbGwpCiAg
ICAgICAgIG5vZGVUb1NwbGl0VG8gPSBlbmNsb3NpbmdDZWxsOwpAQCAtMTM1LDk3ICsxMDUsMTEg
QEAgdm9pZCBJbmRlbnRPdXRkZW50Q29tbWFuZDo6aW5kZW50SW50b0JsbwogICAgIGlmICghdGFy
Z2V0QmxvY2txdW90ZSkgewogICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYmxvY2txdW90ZSBhbmQg
aW5zZXJ0IGl0IGFzIGEgY2hpbGQgb2YgdGhlIHJvb3QgZWRpdGFibGUgZWxlbWVudC4gV2UgYWNj
b21wbGlzaAogICAgICAgICAvLyB0aGlzIGJ5IHNwbGl0dGluZyBhbGwgcGFyZW50cyBvZiB0aGUg
Y3VycmVudCBwYXJhZ3JhcGggdXAgdG8gdGhhdCBwb2ludC4KLSAgICAgICAgdGFyZ2V0QmxvY2tx
dW90ZSA9IGNyZWF0ZUluZGVudEJsb2NrcXVvdGVFbGVtZW50KGRvY3VtZW50KCkpOworICAgICAg
ICB0YXJnZXRCbG9ja3F1b3RlID0gY3JlYXRlQmxvY2tFbGVtZW50KCk7CiAgICAgICAgIGluc2Vy
dE5vZGVCZWZvcmUodGFyZ2V0QmxvY2txdW90ZSwgb3V0ZXJCbG9jayk7CiAgICAgfQogCiAgICAg
bW92ZVBhcmFncmFwaFdpdGhDbG9uZXMoc3RhcnRPZlBhcmFncmFwaChlbmRPZkN1cnJlbnRQYXJh
Z3JhcGgpLCBlbmRPZkN1cnJlbnRQYXJhZ3JhcGgsIHRhcmdldEJsb2NrcXVvdGUuZ2V0KCksIG91
dGVyQmxvY2suZ2V0KCkpOwotICAgIAotICAgIC8vIERvbid0IHB1dCB0aGUgbmV4dCBwYXJhZ3Jh
cGggaW4gdGhlIGJsb2NrcXVvdGUgd2UganVzdCBjcmVhdGVkIGZvciB0aGlzIHBhcmFncmFwaCB1
bmxlc3MgCi0gICAgLy8gdGhlIG5leHQgcGFyYWdyYXBoIGlzIGluIHRoZSBzYW1lIGNlbGwuCi0g
ICAgaWYgKGVuY2xvc2luZ0NlbGwgJiYgZW5jbG9zaW5nQ2VsbCAhPSBlbmNsb3NpbmdOb2RlT2ZU
eXBlKGVuZE9mTmV4dFBhcmFncmFwaC5kZWVwRXF1aXZhbGVudCgpLCAmaXNUYWJsZUNlbGwpKQot
ICAgICAgICB0YXJnZXRCbG9ja3F1b3RlID0gMDsKLX0KLQotdm9pZCBJbmRlbnRPdXRkZW50Q29t
bWFuZDo6aW5kZW50UmVnaW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYgc3RhcnRPZlNlbGVjdGlv
biwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRPZlNlbGVjdGlvbikKLXsKLSAgICAvLyBTcGVj
aWFsIGNhc2UgZW1wdHkgdW5zcGxpdHRhYmxlIGVsZW1lbnRzIGJlY2F1c2UgdGhlcmUncyBub3Ro
aW5nIHRvIHNwbGl0Ci0gICAgLy8gYW5kIHRoZXJlJ3Mgbm90aGluZyB0byBtb3ZlLgotICAgIFBv
c2l0aW9uIHN0YXJ0ID0gc3RhcnRPZlNlbGVjdGlvbi5kZWVwRXF1aXZhbGVudCgpLmRvd25zdHJl
YW0oKTsKLSAgICBpZiAoaXNBdFVuc3BsaXR0YWJsZUVsZW1lbnQoc3RhcnQpKSB7Ci0gICAgICAg
IFJlZlB0cjxFbGVtZW50PiBibG9ja3F1b3RlID0gY3JlYXRlSW5kZW50QmxvY2txdW90ZUVsZW1l
bnQoZG9jdW1lbnQoKSk7Ci0gICAgICAgIGluc2VydE5vZGVBdChibG9ja3F1b3RlLCBzdGFydCk7
Ci0gICAgICAgIFJlZlB0cjxFbGVtZW50PiBwbGFjZWhvbGRlciA9IGNyZWF0ZUJyZWFrRWxlbWVu
dChkb2N1bWVudCgpKTsKLSAgICAgICAgYXBwZW5kTm9kZShwbGFjZWhvbGRlciwgYmxvY2txdW90
ZSk7Ci0gICAgICAgIHNldEVuZGluZ1NlbGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKFBvc2l0aW9u
KHBsYWNlaG9sZGVyLmdldCgpLCAwKSwgRE9XTlNUUkVBTSkpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgUmVmUHRyPEVsZW1lbnQ+IGJsb2NrcXVvdGVGb3JOZXh0SW5kZW50OwotICAg
IFZpc2libGVQb3NpdGlvbiBlbmRPZkN1cnJlbnRQYXJhZ3JhcGggPSBlbmRPZlBhcmFncmFwaChz
dGFydE9mU2VsZWN0aW9uKTsKLSAgICBWaXNpYmxlUG9zaXRpb24gZW5kQWZ0ZXJTZWxlY3Rpb24g
PSBlbmRPZlBhcmFncmFwaChlbmRPZlBhcmFncmFwaChlbmRPZlNlbGVjdGlvbikubmV4dCgpKTsK
LSAgICBpbnQgZW5kT2ZDdXJyZW50UGFyYWdyYXBoSW5kZXggPSBpbmRleEZvclZpc2libGVQb3Np
dGlvbihlbmRPZkN1cnJlbnRQYXJhZ3JhcGgpOwotICAgIGludCBlbmRBZnRlclNlbGVjdGlvbklu
ZGV4ID0gaW5kZXhGb3JWaXNpYmxlUG9zaXRpb24oZW5kQWZ0ZXJTZWxlY3Rpb24pOwotCi0gICAg
Ly8gV2hlbiBpbmRlbnRpbmcgd2l0aGluIGEgPHByZT4gdGFnLCB3ZSBuZWVkIHRvIHNwbGl0IGVh
Y2ggcGFyYWdyYXBoIGludG8gYSBzZXBhcmF0ZSBub2RlIGZvciBtb3ZlUGFyYWdyYXBoV2l0aENs
b25lcyB0byB3b3JrLgotICAgIC8vIEhvd2V2ZXIsIHNwbGl0dGluZyB0ZXh0IG5vZGVzIGNhbiBj
YXVzZSBlbmRPZkN1cnJlbnRQYXJhZ3JhcGggYW5kIGVuZEFmdGVyU2VsZWN0aW9uIHRvIHBvaW50
IHRvIGFuIGludmFsaWQgcG9zaXRpb24gaWYgd2UKLSAgICAvLyBjaGFuZ2VkIHRoZSB0ZXh0IG5v
ZGUgaXQgd2FzIHBvaW50aW5nIGF0LiAgU28gd2UgaGF2ZSB0byByZXNldCB0aGVzZSBwb3NpdGlv
bnMuCi0gICAgaW50IG51bVBhcmFncmFwaHMgPSBjb3VudFBhcmFncmFwaHMoZW5kT2ZDdXJyZW50
UGFyYWdyYXBoLCBlbmRBZnRlclNlbGVjdGlvbik7Ci0gICAgaWYgKHNwbGl0VGV4dE5vZGVzKHN0
YXJ0T2ZQYXJhZ3JhcGgoc3RhcnRPZlNlbGVjdGlvbiksIG51bVBhcmFncmFwaHMgKyAxKSkgewot
ICAgICAgICBSZWZQdHI8UmFuZ2U+IGVuZE9mQ3VycmVudFBhcmFncmFwaFJhbmdlID0gVGV4dEl0
ZXJhdG9yOjpyYW5nZUZyb21Mb2NhdGlvbkFuZExlbmd0aChkb2N1bWVudCgpLT5kb2N1bWVudEVs
ZW1lbnQoKSwgZW5kT2ZDdXJyZW50UGFyYWdyYXBoSW5kZXgsIDAsIHRydWUpOwotICAgICAgICBS
ZWZQdHI8UmFuZ2U+IGVuZEFmdGVyU2VsZWN0aW9uUmFuZ2UgPSBUZXh0SXRlcmF0b3I6OnJhbmdl
RnJvbUxvY2F0aW9uQW5kTGVuZ3RoKGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpLCBlbmRB
ZnRlclNlbGVjdGlvbkluZGV4LCAwLCB0cnVlKTsKLSAgICAgICAgaWYgKCFlbmRPZkN1cnJlbnRQ
YXJhZ3JhcGhSYW5nZS5nZXQoKSB8fCAhZW5kQWZ0ZXJTZWxlY3Rpb25SYW5nZS5nZXQoKSkgewot
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KLSAgICAgICAgZW5kT2ZDdXJyZW50UGFyYWdyYXBoID0gVmlzaWJsZVBvc2l0aW9u
KGVuZE9mQ3VycmVudFBhcmFncmFwaFJhbmdlLT5zdGFydFBvc2l0aW9uKCksIERPV05TVFJFQU0p
OwotICAgICAgICBlbmRBZnRlclNlbGVjdGlvbiA9IFZpc2libGVQb3NpdGlvbihlbmRBZnRlclNl
bGVjdGlvblJhbmdlLT5zdGFydFBvc2l0aW9uKCksIERPV05TVFJFQU0pOwotICAgIH0KLQotICAg
IHdoaWxlIChlbmRPZkN1cnJlbnRQYXJhZ3JhcGggIT0gZW5kQWZ0ZXJTZWxlY3Rpb24pIHsKLSAg
ICAgICAgLy8gSXRlcmF0ZSBhY3Jvc3MgdGhlIHNlbGVjdGVkIHBhcmFncmFwaHMuLi4KLSAgICAg
ICAgVmlzaWJsZVBvc2l0aW9uIGVuZE9mTmV4dFBhcmFncmFwaCA9IGVuZE9mUGFyYWdyYXBoKGVu
ZE9mQ3VycmVudFBhcmFncmFwaC5uZXh0KCkpOwotICAgICAgICBpZiAodHJ5SW5kZW50aW5nQXNM
aXN0SXRlbShlbmRPZkN1cnJlbnRQYXJhZ3JhcGgpKQotICAgICAgICAgICAgYmxvY2txdW90ZUZv
ck5leHRJbmRlbnQgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpbmRlbnRJbnRvQmxv
Y2txdW90ZShlbmRPZkN1cnJlbnRQYXJhZ3JhcGgsIGVuZE9mTmV4dFBhcmFncmFwaCwgYmxvY2tx
dW90ZUZvck5leHRJbmRlbnQpOwotCi0gICAgICAgIC8vIGluZGVudEludG9CbG9ja3F1b3RlIGNv
dWxkIG1vdmUgbW9yZSB0aGFuIG9uZSBwYXJhZ3JhcGggaWYgdGhlIHBhcmFncmFwaAotICAgICAg
ICAvLyBpcyBpbiBhIGxpc3QgaXRlbSBvciBhIHRhYmxlLiBBcyBhIHJlc3VsdCwgZW5kQWZ0ZXJT
ZWxlY3Rpb24gY291bGQgcmVmZXIgdG8gYSBwb3NpdGlvbgotICAgICAgICAvLyBubyBsb25nZXIg
aW4gdGhlIGRvY3VtZW50LgotICAgICAgICBpZiAoZW5kQWZ0ZXJTZWxlY3Rpb24uaXNOb3ROdWxs
KCkgJiYgIWVuZEFmdGVyU2VsZWN0aW9uLmRlZXBFcXVpdmFsZW50KCkubm9kZSgpLT5pbkRvY3Vt
ZW50KCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBNYWtl
IHN1cmUgb3VyIG1vdmVQYXJhZ3JhcGggY2FsbHMgZGlkbid0IHJlbW92ZSBlbmRPZk5leHRQYXJh
Z3JhcGguZGVlcEVxdWl2YWxlbnQoKS5ub2RlKCkKLSAgICAgICAgLy8gSWYgc29tZWhvdyB3ZSBk
aWQsIHJldHVybiB0byBwcmV2ZW50IGNyYXNoZXMuCi0gICAgICAgIGlmIChlbmRPZk5leHRQYXJh
Z3JhcGguaXNOb3ROdWxsKCkgJiYgIWVuZE9mTmV4dFBhcmFncmFwaC5kZWVwRXF1aXZhbGVudCgp
Lm5vZGUoKS0+aW5Eb2N1bWVudCgpKSB7Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbmRPZkN1cnJlbnRQ
YXJhZ3JhcGggPSBlbmRPZk5leHRQYXJhZ3JhcGg7Ci0gICAgfSAgIAotfQotCi0vLyBSZXR1cm5z
IHRydWUgaWYgYXQgbGVhc3Qgb25lIHRleHQgbm9kZSB3YXMgc3BsaXQuCi1ib29sIEluZGVudE91
dGRlbnRDb21tYW5kOjpzcGxpdFRleHROb2Rlcyhjb25zdCBWaXNpYmxlUG9zaXRpb24mIHN0YXJ0
LCBpbnQgbnVtUGFyYWdyYXBocykKLXsKLSAgICBWaXNpYmxlUG9zaXRpb24gY3VycmVudFBhcmFn
cmFwaFN0YXJ0ID0gc3RhcnQ7Ci0gICAgYm9vbCBoYXNTcGxpdCA9IGZhbHNlOwotICAgIGludCBw
YXJhZ3JhcGhDb3VudDsKLSAgICBmb3IgKHBhcmFncmFwaENvdW50ID0gMDsgcGFyYWdyYXBoQ291
bnQgPCBudW1QYXJhZ3JhcGhzOyArK3BhcmFncmFwaENvdW50KSB7Ci0gICAgICAgIC8vIElmIHRo
ZXJlIGFyZSBtdWx0aXBsZSBwYXJhZ3JhcGhzIGluIGEgc2luZ2xlIHRleHQgbm9kZSwgd2Ugc3Bs
aXQgdGhlIHRleHQgbm9kZSBpbnRvIGEgc2VwYXJhdGUgbm9kZSBmb3IgZWFjaCBwYXJhZ3JhcGgu
Ci0gICAgICAgIGlmIChjdXJyZW50UGFyYWdyYXBoU3RhcnQuZGVlcEVxdWl2YWxlbnQoKS5ub2Rl
KCktPmlzVGV4dE5vZGUoKSAmJiBjdXJyZW50UGFyYWdyYXBoU3RhcnQuZGVlcEVxdWl2YWxlbnQo
KS5ub2RlKCkgPT0gc3RhcnRPZlBhcmFncmFwaChjdXJyZW50UGFyYWdyYXBoU3RhcnQucHJldmlv
dXMoKSkuZGVlcEVxdWl2YWxlbnQoKS5ub2RlKCkpIHsKLSAgICAgICAgICAgIFRleHQqIHRleHRO
b2RlID0gc3RhdGljX2Nhc3Q8VGV4dCAqPihjdXJyZW50UGFyYWdyYXBoU3RhcnQuZGVlcEVxdWl2
YWxlbnQoKS5ub2RlKCkpOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IGN1cnJlbnRQYXJhZ3Jh
cGhTdGFydC5kZWVwRXF1aXZhbGVudCgpLm9mZnNldEluQ29udGFpbmVyTm9kZSgpOwotICAgICAg
ICAgICAgc3BsaXRUZXh0Tm9kZSh0ZXh0Tm9kZSwgb2Zmc2V0KTsKLSAgICAgICAgICAgIGN1cnJl
bnRQYXJhZ3JhcGhTdGFydCA9IFZpc2libGVQb3NpdGlvbih0ZXh0Tm9kZSwgMCwgVlBfREVGQVVM
VF9BRkZJTklUWSk7Ci0gICAgICAgICAgICBoYXNTcGxpdCA9IHRydWU7Ci0gICAgICAgIH0KLSAg
ICAgICAgVmlzaWJsZVBvc2l0aW9uIG5leHRQYXJhZ3JhcGggPSBzdGFydE9mUGFyYWdyYXBoKGVu
ZE9mUGFyYWdyYXBoKGN1cnJlbnRQYXJhZ3JhcGhTdGFydCkubmV4dCgpKTsKLSAgICAgICAgaWYg
KG5leHRQYXJhZ3JhcGguaXNOdWxsKCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY3Vy
cmVudFBhcmFncmFwaFN0YXJ0ID0gbmV4dFBhcmFncmFwaDsKLSAgICB9Ci0gICAgcmV0dXJuIGhh
c1NwbGl0OwogfQogCiB2b2lkIEluZGVudE91dGRlbnRDb21tYW5kOjpvdXRkZW50UGFyYWdyYXBo
KCkKQEAgLTI5MSw2ICsxNzUsNyBAQCB2b2lkIEluZGVudE91dGRlbnRDb21tYW5kOjpvdXRkZW50
UGFyYWdyCiAgICAgbW92ZVBhcmFncmFwaChzdGFydE9mUGFyYWdyYXBoKHZpc2libGVTdGFydE9m
UGFyYWdyYXBoKSwgZW5kT2ZQYXJhZ3JhcGgodmlzaWJsZUVuZE9mUGFyYWdyYXBoKSwgVmlzaWJs
ZVBvc2l0aW9uKFBvc2l0aW9uKHBsYWNlaG9sZGVyLmdldCgpLCAwKSksIHRydWUpOwogfQogCisv
LyBGSVhNRTogV2Ugc2hvdWxkIG1lcmdlIHRoaXMgZnVuY3Rpb24gd2l0aCBBcHBseUJsb2NrRWxl
bWVudENvbW1hbmQ6OmZvcm1hdFNlbGVjdGlvbgogdm9pZCBJbmRlbnRPdXRkZW50Q29tbWFuZDo6
b3V0ZGVudFJlZ2lvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHN0YXJ0T2ZTZWxlY3Rpb24sIGNv
bnN0IFZpc2libGVQb3NpdGlvbiYgZW5kT2ZTZWxlY3Rpb24pCiB7CiAgICAgVmlzaWJsZVBvc2l0
aW9uIGVuZE9mTGFzdFBhcmFncmFwaCA9IGVuZE9mUGFyYWdyYXBoKGVuZE9mU2VsZWN0aW9uKTsK
QEAgLTMyNyw0OCArMjEyLDIwIEBAIHZvaWQgSW5kZW50T3V0ZGVudENvbW1hbmQ6Om91dGRlbnRS
ZWdpb24KICAgICB9CiB9CiAKLXZvaWQgSW5kZW50T3V0ZGVudENvbW1hbmQ6OmRvQXBwbHkoKQor
dm9pZCBJbmRlbnRPdXRkZW50Q29tbWFuZDo6Zm9ybWF0U2VsZWN0aW9uKGNvbnN0IFZpc2libGVQ
b3NpdGlvbiYgc3RhcnRPZlNlbGVjdGlvbiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBlbmRPZlNl
bGVjdGlvbikKIHsKLSAgICBpZiAoIWVuZGluZ1NlbGVjdGlvbigpLmlzTm9uT3JwaGFuZWRDYXJl
dE9yUmFuZ2UoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFlbmRpbmdTZWxlY3Rpb24o
KS5yb290RWRpdGFibGVFbGVtZW50KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAg
VmlzaWJsZVBvc2l0aW9uIHZpc2libGVFbmQgPSBlbmRpbmdTZWxlY3Rpb24oKS52aXNpYmxlRW5k
KCk7Ci0gICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFydCA9IGVuZGluZ1NlbGVjdGlvbigp
LnZpc2libGVTdGFydCgpOwotICAgIC8vIFdoZW4gYSBzZWxlY3Rpb24gZW5kcyBhdCB0aGUgc3Rh
cnQgb2YgYSBwYXJhZ3JhcGgsIHdlIHJhcmVseSBwYWludCAKLSAgICAvLyB0aGUgc2VsZWN0aW9u
IGdhcCBiZWZvcmUgdGhhdCBwYXJhZ3JhcGgsIGJlY2F1c2UgdGhlcmUgb2Z0ZW4gaXMgbm8gZ2Fw
LiAgCi0gICAgLy8gSW4gYSBjYXNlIGxpa2UgdGhpcywgaXQncyBub3Qgb2J2aW91cyB0byB0aGUg
dXNlciB0aGF0IHRoZSBzZWxlY3Rpb24gCi0gICAgLy8gZW5kcyAiaW5zaWRlIiB0aGF0IHBhcmFn
cmFwaCwgc28gaXQgd291bGQgYmUgY29uZnVzaW5nIGlmIEluZGVudC9PdXRkZW50IAotICAgIC8v
IG9wZXJhdGVkIG9uIHRoYXQgcGFyYWdyYXBoLgotICAgIC8vIEZJWE1FOiBXZSBwYWludCB0aGUg
Z2FwIGJlZm9yZSBzb21lIHBhcmFncmFwaHMgdGhhdCBhcmUgaW5kZW50ZWQgd2l0aCBsZWZ0IAot
ICAgIC8vIG1hcmdpbi9wYWRkaW5nLCBidXQgbm90IG90aGVycy4gIFdlIHNob3VsZCBtYWtlIHRo
ZSBnYXAgcGFpbnRpbmcgbW9yZSBjb25zaXN0ZW50IGFuZCAKLSAgICAvLyB0aGVuIHVzZSBhIGxl
ZnQgbWFyZ2luL3BhZGRpbmcgcnVsZSBoZXJlLgotICAgIGlmICh2aXNpYmxlRW5kICE9IHZpc2li
bGVTdGFydCAmJiBpc1N0YXJ0T2ZQYXJhZ3JhcGgodmlzaWJsZUVuZCkpCi0gICAgICAgIHNldEVu
ZGluZ1NlbGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKHZpc2libGVTdGFydCwgdmlzaWJsZUVuZC5w
cmV2aW91cyh0cnVlKSkpOwotCi0gICAgVmlzaWJsZVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxl
Y3Rpb25Gb3JQYXJhZ3JhcGhJdGVyYXRpb24oZW5kaW5nU2VsZWN0aW9uKCkpOwotICAgIFZpc2li
bGVQb3NpdGlvbiBzdGFydE9mU2VsZWN0aW9uID0gc2VsZWN0aW9uLnZpc2libGVTdGFydCgpOwot
ICAgIFZpc2libGVQb3NpdGlvbiBlbmRPZlNlbGVjdGlvbiA9IHNlbGVjdGlvbi52aXNpYmxlRW5k
KCk7Ci0gICAgCi0gICAgaW50IHN0YXJ0SW5kZXggPSBpbmRleEZvclZpc2libGVQb3NpdGlvbihz
dGFydE9mU2VsZWN0aW9uKTsKLSAgICBpbnQgZW5kSW5kZXggPSBpbmRleEZvclZpc2libGVQb3Np
dGlvbihlbmRPZlNlbGVjdGlvbik7Ci0gICAgCi0gICAgQVNTRVJUKCFzdGFydE9mU2VsZWN0aW9u
LmlzTnVsbCgpKTsKLSAgICBBU1NFUlQoIWVuZE9mU2VsZWN0aW9uLmlzTnVsbCgpKTsKLSAgICAK
ICAgICBpZiAobV90eXBlT2ZBY3Rpb24gPT0gSW5kZW50KQotICAgICAgICBpbmRlbnRSZWdpb24o
c3RhcnRPZlNlbGVjdGlvbiwgZW5kT2ZTZWxlY3Rpb24pOworICAgICAgICBBcHBseUJsb2NrRWxl
bWVudENvbW1hbmQ6OmZvcm1hdFNlbGVjdGlvbihzdGFydE9mU2VsZWN0aW9uLCBlbmRPZlNlbGVj
dGlvbik7CiAgICAgZWxzZQogICAgICAgICBvdXRkZW50UmVnaW9uKHN0YXJ0T2ZTZWxlY3Rpb24s
IGVuZE9mU2VsZWN0aW9uKTsKK30KIAotICAgIHVwZGF0ZUxheW91dCgpOwotICAgIAotICAgIFJl
ZlB0cjxSYW5nZT4gc3RhcnRSYW5nZSA9IFRleHRJdGVyYXRvcjo6cmFuZ2VGcm9tTG9jYXRpb25B
bmRMZW5ndGgoZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCksIHN0YXJ0SW5kZXgsIDAsIHRy
dWUpOwotICAgIFJlZlB0cjxSYW5nZT4gZW5kUmFuZ2UgPSBUZXh0SXRlcmF0b3I6OnJhbmdlRnJv
bUxvY2F0aW9uQW5kTGVuZ3RoKGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpLCBlbmRJbmRl
eCwgMCwgdHJ1ZSk7Ci0gICAgaWYgKHN0YXJ0UmFuZ2UgJiYgZW5kUmFuZ2UpCi0gICAgICAgIHNl
dEVuZGluZ1NlbGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKHN0YXJ0UmFuZ2UtPnN0YXJ0UG9zaXRp
b24oKSwgZW5kUmFuZ2UtPnN0YXJ0UG9zaXRpb24oKSwgRE9XTlNUUkVBTSkpOwordm9pZCBJbmRl
bnRPdXRkZW50Q29tbWFuZDo6Zm9ybWF0UGFyYWdyYXBoKGNvbnN0IFZpc2libGVQb3NpdGlvbiYg
ZW5kT2ZDdXJyZW50UGFyYWdyYXBoLCBSZWZQdHI8RWxlbWVudD4mIGJsb2NrcXVvdGVGb3JOZXh0
SW5kZW50KQoreworICAgIGlmICh0cnlJbmRlbnRpbmdBc0xpc3RJdGVtKGVuZE9mQ3VycmVudFBh
cmFncmFwaCkpCisgICAgICAgIGJsb2NrcXVvdGVGb3JOZXh0SW5kZW50ID0gMDsKKyAgICBlbHNl
CisgICAgICAgIGluZGVudEludG9CbG9ja3F1b3RlKGVuZE9mQ3VycmVudFBhcmFncmFwaCwgYmxv
Y2txdW90ZUZvck5leHRJbmRlbnQpOwogfQogCiB9CkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvSW5k
ZW50T3V0ZGVudENvbW1hbmQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2VkaXRpbmcvSW5kZW50
T3V0ZGVudENvbW1hbmQuaAkocmV2aXNpb24gNjg5MDUpCisrKyBXZWJDb3JlL2VkaXRpbmcvSW5k
ZW50T3V0ZGVudENvbW1hbmQuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsMzIgKzI2LDM0IEBACiAj
aWZuZGVmIEluZGVudE91dGRlbnRDb21tYW5kX2gKICNkZWZpbmUgSW5kZW50T3V0ZGVudENvbW1h
bmRfaAogCisjaW5jbHVkZSAiQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmgiCiAjaW5jbHVkZSAi
Q29tcG9zaXRlRWRpdENvbW1hbmQuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFzcyBJ
bmRlbnRPdXRkZW50Q29tbWFuZCA6IHB1YmxpYyBDb21wb3NpdGVFZGl0Q29tbWFuZCB7CitjbGFz
cyBJbmRlbnRPdXRkZW50Q29tbWFuZCA6IHB1YmxpYyBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQg
ewogcHVibGljOgogICAgIGVudW0gRUluZGVudFR5cGUgeyBJbmRlbnQsIE91dGRlbnQgfTsKICAg
ICBzdGF0aWMgUGFzc1JlZlB0cjxJbmRlbnRPdXRkZW50Q29tbWFuZD4gY3JlYXRlKERvY3VtZW50
KiBkb2N1bWVudCwgRUluZGVudFR5cGUgdHlwZSwgaW50IG1hcmdpbkluUGl4ZWxzID0gMCkKICAg
ICB7CiAgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSW5kZW50T3V0ZGVudENvbW1hbmQoZG9j
dW1lbnQsIHR5cGUsIG1hcmdpbkluUGl4ZWxzKSk7CiAgICAgfQotICAgIAorCiAgICAgdmlydHVh
bCBib29sIHByZXNlcnZlc1R5cGluZ1N0eWxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogCiBw
cml2YXRlOgogICAgIEluZGVudE91dGRlbnRDb21tYW5kKERvY3VtZW50KiwgRUluZGVudFR5cGUs
IGludCBtYXJnaW5JblBpeGVscyk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgZG9BcHBseSgpOwogICAg
IHZpcnR1YWwgRWRpdEFjdGlvbiBlZGl0aW5nQWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV90eXBl
T2ZBY3Rpb24gPT0gSW5kZW50ID8gRWRpdEFjdGlvbkluZGVudCA6IEVkaXRBY3Rpb25PdXRkZW50
OyB9CiAKICAgICB2b2lkIGluZGVudFJlZ2lvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mLCBjb25z
dCBWaXNpYmxlUG9zaXRpb24mKTsKICAgICB2b2lkIG91dGRlbnRSZWdpb24oY29uc3QgVmlzaWJs
ZVBvc2l0aW9uJiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CiAgICAgdm9pZCBvdXRkZW50UGFy
YWdyYXBoKCk7CiAgICAgYm9vbCB0cnlJbmRlbnRpbmdBc0xpc3RJdGVtKGNvbnN0IFZpc2libGVQ
b3NpdGlvbiYpOwotICAgIHZvaWQgaW5kZW50SW50b0Jsb2NrcXVvdGUoY29uc3QgVmlzaWJsZVBv
c2l0aW9uJiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiwgUmVmUHRyPEVsZW1lbnQ+Jik7Ci0gICAg
Ym9vbCBzcGxpdFRleHROb2Rlcyhjb25zdCBWaXNpYmxlUG9zaXRpb24mIHN0YXJ0LCBpbnQgbnVt
UGFyYWdyYXBocyk7CisgICAgdm9pZCBpbmRlbnRJbnRvQmxvY2txdW90ZShjb25zdCBWaXNpYmxl
UG9zaXRpb24mLCBSZWZQdHI8RWxlbWVudD4mKTsKKworICAgIHZvaWQgZm9ybWF0U2VsZWN0aW9u
KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgc3RhcnRPZlNlbGVjdGlvbiwgY29uc3QgVmlzaWJsZVBv
c2l0aW9uJiBlbmRPZlNlbGVjdGlvbik7CisgICAgdm9pZCBmb3JtYXRQYXJhZ3JhcGgoY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJiBlbmRPZkN1cnJlbnRQYXJhZ3JhcGgsIFJlZlB0cjxFbGVtZW50PiYg
YmxvY2txdW90ZUZvck5leHRJbmRlbnQpOwogCiAgICAgRUluZGVudFR5cGUgbV90eXBlT2ZBY3Rp
b247CiAgICAgaW50IG1fbWFyZ2luSW5QaXhlbHM7Cg==
</data>
<flag name="review"
          id="59233"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>