<?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>40663</bug_id>
          
          <creation_ts>2010-06-16 02:14:22 -0700</creation_ts>
          <short_desc>Modernize SVG Text code, following the HTML design</short_desc>
          <delta_ts>2010-06-21 17:20:23 -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>SVG</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>Major</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>40665</dependson>
    
    <dependson>40676</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Nikolas Zimmermann">zimmermann</reporter>
          <assigned_to name="Nikolas Zimmermann">zimmermann</assigned_to>
          <cc>abarth</cc>
    
    <cc>bdakin</cc>
    
    <cc>eric</cc>
    
    <cc>krit</cc>
    
    <cc>nickshanks</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>staikos</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>238749</commentid>
    <comment_count>0</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-16 02:14:22 -0700</bug_when>
    <thetext>The SVG Text code from 2007 was a prototype. We should fix it to match the HTML design. Painting is done only from SVGRootInlineBox, which keeps track of all characters, and draws them. Instead we should divide the work through SVGInlineFlowBox/SVGInlineTextBox.

The rewrite is done, and it&apos;s really large. It fixes numerous problems with SVG text selection, provides sub-pixel positioning support, integrated properly within the SVGRenderBase::computeRepaintRect() logic etc.
This is the master bug tracking the work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239294</commentid>
    <comment_count>1</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-17 01:39:15 -0700</bug_when>
    <thetext>*** Bug 15644 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239296</commentid>
    <comment_count>2</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-17 01:39:24 -0700</bug_when>
    <thetext>*** Bug 15386 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239298</commentid>
    <comment_count>3</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-17 01:40:14 -0700</bug_when>
    <thetext>*** Bug 12172 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239351</commentid>
    <comment_count>4</comment_count>
      <attachid>58987</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-17 05:54:47 -0700</bug_when>
    <thetext>Created attachment 58987
Initial patch

Sorry for this uber-large patch, but I&apos;m including all layout test changes, so EWS can run - at least for mac it should turn green.
All other platforms, with platform specific results, for any SVG test containing text will fail. I need to fix them after landing, as I do not have access to all platforms.

Uploading the pixel test changes in a seperated patch, as the full patch is 12mb.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239352</commentid>
    <comment_count>5</comment_count>
      <attachid>58988</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-17 05:58:42 -0700</bug_when>
    <thetext>Created attachment 58988
Pixel test changes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239353</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-06-17 06:03:03 -0700</bug_when>
    <thetext>Attachment 58987 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/svg/SVGTextContentElement.cpp:30:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/rendering/SVGTextChunkLayoutInfo.h:86:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebCore/rendering/InlineBox.h:146:  More than one command on the same line  [whitespace/newline] [4]
WebCore/rendering/RenderSVGText.cpp:206:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Total errors found: 4 in 726 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239356</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-06-17 06:07:36 -0700</bug_when>
    <thetext>Attachment 58988 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
Total errors found: 0 in 0 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239359</commentid>
    <comment_count>8</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-06-17 06:09:17 -0700</bug_when>
    <thetext>Attachment 58987 did not build on mac:
Build output: http://webkit-commit-queue.appspot.com/results/3275296</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239361</commentid>
    <comment_count>9</comment_count>
      <attachid>58990</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-17 06:22:07 -0700</bug_when>
    <thetext>Created attachment 58990
Updated patch

Fix build failure in release mode, fix style issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239398</commentid>
    <comment_count>10</comment_count>
      <attachid>58990</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2010-06-17 08:11:04 -0700</bug_when>
    <thetext>Comment on attachment 58990
Updated patch

WebCore/rendering/RenderBlock.h:232
 +      // Only used by RenderSVGText, which explicitely overrides RenderBlock::layoutBlock(), do NOT use for anything else.
Can you surround it with #if ENABLE(SVG)?

WebCore/rendering/RenderBlockLineLayout.cpp:750
 +                          if (!isSVGRootInlineBox)
Can you use:
#if ENABLE(SVG)
    if (lineBox-&gt;isSVGRootInlineBox())
#endif
        computeHorizontalPositionsForLine(lineBox, firstLine, resolver.firstRun(), trailingSpaceRun, end.atEnd(), textBoxDataMap);

instead?

WebCore/rendering/RenderSVGInlineText.cpp: 
 +      // FIXME: That&apos;s not sufficient. The localCaretRect function is also used for selection.
Do or don&apos;t we need caret rects for selecting texts?

WebCore/rendering/RenderSVGText.cpp:185
 +      FloatRect boundingBox = objectBoundingBox();
Can you name it strokeRect or strokeBoundaries please? This would match the naming in other renderers.

WebCore/rendering/RenderSVGText.cpp:207
 +   
No need for this white space :-)

WebCore/rendering/SVGInlineFlowBox.cpp:44
 +      FloatRect boundingBox = boxRenderer-&gt;repaintRectInLocalCoordinates();
same. boundingBox is not accurate enough, use repaintRect here

WebCore/rendering/SVGInlineTextBox.cpp:310
 +          ASSERT_NOT_REACHED();
I think this the assertion should be removed. At the moment our default fallback is black. This will change and if fill or stroke are not valid, we shouldn&apos;t draw text/decorations/under-/over-/through-line at all. 
WebCore/rendering/SVGInlineTextBox.cpp:414
 +      ASSERT_NOT_REACHED();
IIRC there are also other decorations like blink. Maybe you shouldn&apos;t use the assert here.

I did not check the pixel results yet, but the DRT looking at the DRT results, the text moves more than 30px sometimes. You checked all DRT tests manually with such a huge change?

I would like to look a second time on the patch, once you replied to this review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239785</commentid>
    <comment_count>11</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-17 23:59:48 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 58990 [details])
&gt; WebCore/rendering/RenderBlock.h:232
&gt;  +      // Only used by RenderSVGText, which explicitely overrides RenderBlock::layoutBlock(), do NOT use for anything else.
&gt; Can you surround it with #if ENABLE(SVG)?
&gt; 
&gt; WebCore/rendering/RenderBlockLineLayout.cpp:750
&gt;  +                          if (!isSVGRootInlineBox)
&gt; Can you use:
&gt; #if ENABLE(SVG)
&gt;     if (lineBox-&gt;isSVGRootInlineBox())
&gt; #endif
&gt;         computeHorizontalPositionsForLine(lineBox, firstLine, resolver.firstRun(), trailingSpaceRun, end.atEnd(), textBoxDataMap);
&gt; 
&gt; instead?

You must have misread this part, we always have to call computeHorizontalPositionsForLine, except for SVG. I&apos;m also saving the isSVGRootInlineBox() virtual call result in a temporary variable, as it&apos;s used again, some lines below, to determine whether computePerCharacterLayoutInformation should be called, thus saving another virtual function call.

&gt; 
&gt; WebCore/rendering/RenderSVGInlineText.cpp: 
&gt;  +      // FIXME: That&apos;s not sufficient. The localCaretRect function is also used for selection.
&gt; Do or don&apos;t we need caret rects for selecting texts?
&gt; 
&gt; WebCore/rendering/RenderSVGText.cpp:185
&gt;  +      FloatRect boundingBox = objectBoundingBox();
&gt; Can you name it strokeRect or strokeBoundaries please? This would match the naming in other renderers.

Fixed, named it &quot;strokeBoundaries&quot;.

&gt; WebCore/rendering/RenderSVGText.cpp:207
&gt;  +   
&gt; No need for this white space :-)

Right, fixed.

&gt; 
&gt; WebCore/rendering/SVGInlineFlowBox.cpp:44
&gt;  +      FloatRect boundingBox = boxRenderer-&gt;repaintRectInLocalCoordinates();
&gt; same. boundingBox is not accurate enough, use repaintRect here

Fixed.
 
&gt; WebCore/rendering/SVGInlineTextBox.cpp:310
&gt;  +          ASSERT_NOT_REACHED();
&gt; I think this the assertion should be removed. At the moment our default fallback is black. This will change and if fill or stroke are not valid, we shouldn&apos;t draw text/decorations/under-/over-/through-line at all. 

No, the assertion is valid all the time. It only assures that m_paintingResourceMode has been set to ApplyToFillMode _or_ ApplyToStrokeMode before calling acquirePaintingResource(). I&apos;m not asserting that the acquired painting resource is not null. So it&apos;s fine :-)

&gt; WebCore/rendering/SVGInlineTextBox.cpp:414
&gt;  +      ASSERT_NOT_REACHED();
&gt; IIRC there are also other decorations like blink. Maybe you shouldn&apos;t use the assert here.

positionOffsetForDecoration() is only called by paintDecorationWithStyle(), which is called by paintDecoration(), which is called by paint(), and _only_ for UNDERLINE, OVERLINE and STRIKE-THROUGH. I&apos;m not handling any other decoration for SVG, per spec. So the assertion is valid.
 
&gt; I did not check the pixel results yet, but the DRT looking at the DRT results, the text moves more than 30px sometimes. You checked all DRT tests manually with such a huge change?
Oh, this is because the postions are correct now! Previously the RenderSVGText had x/y positions, and the RenderSVGInlineText mostly had negative y offsets, which was a relict of the old layouting code - I&apos;ve checked most results by hand, and they&apos;re just fine now. If you make up equivalent HTML testcases (using an absolute positioned dev, that contains text, you&apos;ll get the same style of results).

&gt; 
&gt; I would like to look a second time on the patch, once you replied to this review.
Sure! Thanks for that!

Building, running tests and uploading a new version.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239794</commentid>
    <comment_count>12</comment_count>
      <attachid>59076</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-18 00:43:51 -0700</bug_when>
    <thetext>Created attachment 59076
Updated patch v2

Just uploading a new patch, without test results.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239798</commentid>
    <comment_count>13</comment_count>
      <attachid>59076</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2010-06-18 01:05:10 -0700</bug_when>
    <thetext>Comment on attachment 59076
Updated patch v2

WebCore/rendering/SVGRootInlineBox.cpp:53
 +      FloatRect boundingBox = boxRenderer-&gt;repaintRectInLocalCoordinates();
forgto to mention this boundingBox. -&gt; repaintRect

Just fix this name and i&apos;m fine with it. You moved the LayoutTest results out now?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239800</commentid>
    <comment_count>14</comment_count>
      <attachid>58988</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2010-06-18 01:19:59 -0700</bug_when>
    <thetext>Comment on attachment 58988
Pixel test changes

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239812</commentid>
    <comment_count>15</comment_count>
      <attachid>59083</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-18 01:40:38 -0700</bug_when>
    <thetext>Created attachment 59083
LayoutTests: expected.txt changes

For completness, the expected.txt changes - that previously lived in &quot;Updated patch&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239856</commentid>
    <comment_count>16</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-18 04:21:10 -0700</bug_when>
    <thetext>Landed in r61393. This will definately break bots, because I need to rebaseline all platform specific results. Waiting for the results now, and fixing incrementally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239862</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-06-18 04:39:57 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/61393 might have broken Qt Linux Release</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239909</commentid>
    <comment_count>18</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-06-18 07:39:05 -0700</bug_when>
    <thetext>Rebaseline fixes:
r61396: Qt
r61398: Mac Tiger
r61399: Mac Snowleopard
r61401: Win
r61403: Gtk (by Dirk, thanks)

Notified chromium sheriff prior to landing (tkent), who will take care of the Chromium rebaseline.
That&apos;s it, closing bug!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>240995</commentid>
    <comment_count>19</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-06-21 17:17:09 -0700</bug_when>
    <thetext>This broke CSS text-shadow applied to SVG (added via bug 30479)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>240998</commentid>
    <comment_count>20</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-06-21 17:20:23 -0700</bug_when>
    <thetext>I filed bug 40960 on text-shadow.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>58987</attachid>
            <date>2010-06-17 05:54:47 -0700</date>
            <delta_ts>2010-06-17 06:22:07 -0700</delta_ts>
            <desc>Initial patch</desc>
            <filename>FullSVGText.diff</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64"></data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>58988</attachid>
            <date>2010-06-17 05:58:42 -0700</date>
            <delta_ts>2010-06-18 01:19:59 -0700</delta_ts>
            <desc>Pixel test changes</desc>
            <filename>FullSVGText-pngs.diff</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64"></data>
<flag name="review"
          id="45558"
          type_id="1"
          status="+"
          setter="krit"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>58990</attachid>
            <date>2010-06-17 06:22:07 -0700</date>
            <delta_ts>2010-06-18 00:43:51 -0700</delta_ts>
            <desc>Updated patch</desc>
            <filename>FullSVGText.diff</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64"></data>
<flag name="review"
          id="45562"
          type_id="1"
          status="-"
          setter="krit"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>59076</attachid>
            <date>2010-06-18 00:43:51 -0700</date>
            <delta_ts>2010-06-18 01:05:10 -0700</delta_ts>
            <desc>Updated patch v2</desc>
            <filename>SVGText-WebCore.diff</filename>
            <type>text/plain</type>
            <size>187888</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2MTM4MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTg2IEBACisyMDEwLTA2LTE4ICBOaWtvbGFzIFppbW1lcm1hbm4gIDxuemltbWVy
bWFubkByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIE1vZGVybml6ZSBTVkcgVGV4dCBjb2RlLCBmb2xsb3dpbmcgdGhlIEhUTUwgZGVzaWdu
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MDY2Mwor
CisgICAgICAgIFNWRyBUZXh0IGRvZXMgbm90IHN1cHBvcnQgc3VicGl4ZWwgcG9zaXRpb25pbmcK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMTcyCisK
KyAgICAgICAgUmVuZGVyU1ZHVGV4dCBjYW4ndCBkbyBwYXJ0aWFsIHJlcGFpbnRzCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTM4NgorCisgICAgICAg
IEhUTUwgYW5kIFNWRyBuZWVkIHRvIHNoYXJlIG1vcmUgdGV4dCBwYWludGluZyBjb2RlCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTY0NAorCisgICAg
ICAgIFJld3JpdGUgU1ZHIFRleHQgcmVuZGVyaW5nLCBvbmx5IGtlZXBpbmcgdGhlIGxheW91dCBv
ZiB0aGUgYWN0dWFsIGNoYXJhY3RlcnMvY2h1bmtzIGFzIGl0IHdhcy4KKyAgICAgICAgV2UncmUg
bm93IGRyYXdpbmcgU1ZHIFRleHQgdmVyeSBzaW1pbGFyIHRvIEhUTUwgVGV4dCwgdXRpbGl6aW5n
IHRoZSBTVkdJbmxpbmVGbG93Qm94L1NWR0lubGluZVRleHRCb3ggc3RydWN0dXJlLAorICAgICAg
ICBpbnN0ZWFkIG9mIHBhaW50aW5nIGFsbCB0ZXh0IGNvbnRlbnQgb2YgYSA8dGV4dD4gZWxlbWVu
dCBmcm9tIHRoZSBTVkdSb290SW5saW5lQm94LCBhcyBpdCB3YXMgdGhlIGxhc3QgeWVhcnMuCisK
KyAgICAgICAgUm91Z2ggb3ZlcnZpZXcgb2YgdGhlIGNoYW5nZXM6CisgICAgICAgIC0gUGFydGlh
bCByZXBhaW50aW5nIHN1cHBvcnQgZm9yIHRleHQgc2VsZWN0aW9ucyAoc3RhcnRQb3MvZW5kUG9z
IGFyZSByZXNwZWN0ZWQpLCBubyBtb3JlIHJlZHJhd2luZyBvZiB0aGUgd2hvbGUgPHRleHQ+IGNv
bnRlbnQgd2hpbGUgc2VsZWN0aW5nCisgICAgICAgIC0gU3VicGl4ZWwgcG9zaXRpb25pbmcgKG5l
YXIgcGl4ZWwtcGVyZmVjdCByZW5kZXJpbmcgZm9yIGFsbCBXM0MgdGVzdHMgdGhhdCBjb250YWlu
IHRleHQsIGZpbmFsbHkhKQorICAgICAgICAgIC0+IG11Y2ggYmV0dGVyIHRleHRQYXRoIHJlc3Vs
dHMsIGNoYXJhY3RlcnMgbm93IGFsaWduIGFzIGV4cGVjdGVkLCBhcyBhbGwgcm91bmRpbmcgaGFj
a3MgYXJlIGRpc2FibGVkIGZvciBTVkcgdGV4dCBydW5zLCBhbmQgc3VicGl4ZWwgcHJlY2lzaW9u
IGlzIHVzZWQgd2hpbGUgcGFpbnRpbmcKKyAgICAgICAgLSBObyBtb3JlIGN1c3RvbSBoYW5kbGlu
ZyBvZiBzZWxlY3Rpb24sIHRoZSBzdGFuZGFyZCBtZXRob2RzIG9mZnNldEZyb21Qb3NpdGlvbigp
IC8gc2VsZWN0aW9uUmVjdEZvclRleHQoKSBhcmUgdXNlZCBpbnN0ZWFkLgorICAgICAgICAtIFNl
bGVjdGlvbiB3b3JrcyBhcyBleHBlY3RlZCBvbiBzdHJldGNoZWQvc3F1ZWV6ZWQgdGV4dCAobGVu
Z3RoQWRqdXN0PSJzcGFjaW5nQW5kR2x5cGhzIiksIHRha2VzICdpbmNsdWRlUGFydGlhbEdseXBo
cycgaW50byBhY2NvdW50IC0ganVzdCBsaWtlIEhUTUwgdGV4dAorICAgICAgICAtIENvcnJlY3Qg
dGV4dCBkZWNvcmF0aW9uIGRyYXdpbmcgKHByb3BlciB3aXRoIGFuZCBwb3NpdGlvbnMgYW5kIHJl
bmRlcmluZy1vcmRlciwgdW5kZXJsaW5lL292ZXJsaW5lIGJlZm9yZSB0ZXh0LCBzdHJpa2UtdGhy
b3VnaCBhZnRlcndhcmRzKQorICAgICAgICAtIFByb3BlciBzaXppbmcgb2YgYWxsIElubGluZUJv
eGVzLCBzdGFydGluZyBmcm9tIHRoZSBTVkdSb290SW5saW5lQm94LCBkb3duIHRvIGV2ZXJ5IHNp
bmdsZSBmbG93ICYgdGV4dCBib3gKKyAgICAgICAgICAtPiBjb3JyZWN0IERSVCByZXN1bHRzLCBu
byBtb3JlIHdlaXJkIG5lZ2F0aXZlIG9mZnNldHMgb2YgdGV4dCBydW5zLCBldGMuIExvb2tzIGV4
YWN0bHkgbGlrZSB0aGUgSFRNTCB0ZXh0IHRlc3QgcmVzdWx0cy4KKyAgICAgICAgLSBSZXdyaXR0
ZW4gU1ZHVGV4dENvbnRlbnRFbGVtZW50IEFQSSB0byB0YWtlIHBlci1jaGFyYWN0ZXIgLyBwZXIt
Y2h1bmsgdHJhbnNmb3JtYXRpb25zIGludG8gYWNjb3VudC4KKyAgICAgICAgLSBTcGVlZWVlZWQh
IERyYXdpbmcgaXMgbXVjaCBmYXN0ZXIgbm93LgorCisgICAgICAgIEFkZCAyNCBuZXcgdGVzdGNh
c2VzIGNvdmVyaW5nIGJhc2ljIHNlbGVjdGlvbiBmZWF0dXJlcyBhbmQgdGhlIFNWR1RleHRDb250
ZW50RWxlbWVudCBBUEkuIEVhY2ggdGVzdCBkcmF3cyBhIGhhbGYtb3BhcXVlIHJlZCByZWN0YW5n
bGUsIGNhbGN1bGF0ZWQgdXNpbmcKKyAgICAgICAgU1ZHVGV4dENvbnRlbnRFbGVtZW50IEFQSSB0
byBoaWdobGlnaHQgdGhlIGFyZWEgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBzZWxlY3RlZC4gVGhl
biBldmVudFNlbmRlciBBUEkgaXMgdXRpbGl6ZWQgdG8gbW92ZSB0aGUgbW91c2UgdG8gdGhlIGNh
bGN1bGF0ZWQKKyAgICAgICAgc3RhcnQgb3JpZ2luLCBob2xkaW5nIGl0IGRvd24gYW5kIG1vdmlu
ZyBpdCB0byB0aGUgZW5kIHBvc2l0aW9uLgorCisgICAgICAgIEEgZGV0YWlsZWQgbGlzdCBvZiB0
ZXN0cyB0aGF0IHNob3cgcHJvZ3Jlc3Npb24sIGNhbiBiZSBmb3VuZCBpbiB0aGUgY29ycmVzcG9u
ZGluZyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cuCisgICAgICAgIE5vdGUgdGhhdCB0aGlzIHJlcXVp
cmVzIGEgcmViYXNlbGluaW5nIG9mIGFsbCBTVkcgdGVzdHMgY29udGFpbmluZyB0ZXh0IGVsZW1l
bnRzLgorCisgICAgICAgIFRlc3RzOiBzdmcvaGl4aWUvdGV4dC8wMDEueG1sIChtb3ZlZCBmcm9t
IHN2Zy9oaXhpZS90ZXh0LzAwMS1icm9rZW4ueG1sKQorICAgICAgICAgICAgICAgc3ZnL3RleHQv
bGVuZ3RoQWRqdXN0LXRleHQtbWV0cmljcy5odG1sCisgICAgICAgICAgICAgICBzdmcvdGV4dC9z
ZWxlY3QtdGV4dExlbmd0aC1zcGFjaW5nLXNxdWVlemUtMS5zdmcKKyAgICAgICAgICAgICAgIHN2
Zy90ZXh0L3NlbGVjdC10ZXh0TGVuZ3RoLXNwYWNpbmctc3F1ZWV6ZS0yLnN2ZworICAgICAgICAg
ICAgICAgc3ZnL3RleHQvc2VsZWN0LXRleHRMZW5ndGgtc3BhY2luZy1zcXVlZXplLTMuc3ZnCisg
ICAgICAgICAgICAgICBzdmcvdGV4dC9zZWxlY3QtdGV4dExlbmd0aC1zcGFjaW5nLXNxdWVlemUt
NC5zdmcKKyAgICAgICAgICAgICAgIHN2Zy90ZXh0L3NlbGVjdC10ZXh0TGVuZ3RoLXNwYWNpbmct
c3RyZXRjaC0xLnN2ZworICAgICAgICAgICAgICAgc3ZnL3RleHQvc2VsZWN0LXRleHRMZW5ndGgt
c3BhY2luZy1zdHJldGNoLTIuc3ZnCisgICAgICAgICAgICAgICBzdmcvdGV4dC9zZWxlY3QtdGV4
dExlbmd0aC1zcGFjaW5nLXN0cmV0Y2gtMy5zdmcKKyAgICAgICAgICAgICAgIHN2Zy90ZXh0L3Nl
bGVjdC10ZXh0TGVuZ3RoLXNwYWNpbmctc3RyZXRjaC00LnN2ZworICAgICAgICAgICAgICAgc3Zn
L3RleHQvc2VsZWN0LXRleHRMZW5ndGgtc3BhY2luZ0FuZEdseXBocy1zcXVlZXplLTEuc3ZnCisg
ICAgICAgICAgICAgICBzdmcvdGV4dC9zZWxlY3QtdGV4dExlbmd0aC1zcGFjaW5nQW5kR2x5cGhz
LXNxdWVlemUtMi5zdmcKKyAgICAgICAgICAgICAgIHN2Zy90ZXh0L3NlbGVjdC10ZXh0TGVuZ3Ro
LXNwYWNpbmdBbmRHbHlwaHMtc3F1ZWV6ZS0zLnN2ZworICAgICAgICAgICAgICAgc3ZnL3RleHQv
c2VsZWN0LXRleHRMZW5ndGgtc3BhY2luZ0FuZEdseXBocy1zcXVlZXplLTQuc3ZnCisgICAgICAg
ICAgICAgICBzdmcvdGV4dC9zZWxlY3QtdGV4dExlbmd0aC1zcGFjaW5nQW5kR2x5cGhzLXN0cmV0
Y2gtMS5zdmcKKyAgICAgICAgICAgICAgIHN2Zy90ZXh0L3NlbGVjdC10ZXh0TGVuZ3RoLXNwYWNp
bmdBbmRHbHlwaHMtc3RyZXRjaC0yLnN2ZworICAgICAgICAgICAgICAgc3ZnL3RleHQvc2VsZWN0
LXRleHRMZW5ndGgtc3BhY2luZ0FuZEdseXBocy1zdHJldGNoLTMuc3ZnCisgICAgICAgICAgICAg
ICBzdmcvdGV4dC9zZWxlY3QtdGV4dExlbmd0aC1zcGFjaW5nQW5kR2x5cGhzLXN0cmV0Y2gtNC5z
dmcKKyAgICAgICAgICAgICAgIHN2Zy90ZXh0L3NlbGVjdC14LWxpc3QtMS5zdmcKKyAgICAgICAg
ICAgICAgIHN2Zy90ZXh0L3NlbGVjdC14LWxpc3QtMi5zdmcKKyAgICAgICAgICAgICAgIHN2Zy90
ZXh0L3NlbGVjdC14LWxpc3QtMy5zdmcKKyAgICAgICAgICAgICAgIHN2Zy90ZXh0L3NlbGVjdC14
LWxpc3QtNC5zdmcKKyAgICAgICAgICAgICAgIHN2Zy90ZXh0L3NlbGVjdC14LWxpc3Qtd2l0aC10
c3BhbnMtMS5zdmcKKyAgICAgICAgICAgICAgIHN2Zy90ZXh0L3NlbGVjdC14LWxpc3Qtd2l0aC10
c3BhbnMtMi5zdmcKKyAgICAgICAgICAgICAgIHN2Zy90ZXh0L3NlbGVjdC14LWxpc3Qtd2l0aC10
c3BhbnMtMy5zdmcKKyAgICAgICAgICAgICAgIHN2Zy90ZXh0L3NlbGVjdC14LWxpc3Qtd2l0aC10
c3BhbnMtNC5zdmcKKworICAgICAgICAqIHJlbmRlcmluZy9JbmxpbmVCb3guaDogUmVtb3ZlIG5v
dCBuZWVkZWQgaXNJbmxpbmVCb3goKSBtZXRob2QuCisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVC
b3g6OmlzSW5saW5lVGV4dEJveCk6IENvbnN0aWZ5IHRoaXMgbWV0aG9kLgorICAgICAgICAoV2Vi
Q29yZTo6SW5saW5lQm94Ojppc1NWR0lubGluZVRleHRCb3gpOiBBZGRlZCwgd2l0aCBFTkFCTEUo
U1ZHKSBndWFyZHMsIGp1c3QgbGlrZSB0aGUgZXhpc3RpbmcgaXNTVkdSb290SW5saW5lQm94KCku
CisgICAgICAgIChXZWJDb3JlOjpJbmxpbmVCb3g6OmlzU1ZHUm9vdElubGluZUJveCk6IENvbnN0
aWZ5IHRoaXMgbWV0aG9kLgorICAgICAgICAoV2ViQ29yZTo6SW5saW5lQm94OjpjYWxjdWxhdGVC
b3VuZGFyaWVzKTogQWRkZWQsIHdpdGggRU5BQkxFKFNWRykgZ3VhcmRzLCB1c2VkIHRvIGNhbGN1
bGF0ZSB0aGUgd2hvbGUgYm91bmRhcmllcyBvZiBhIElubGluZVRleHQvRmxvd0JveCwgb25seSB1
c2VkIGluIFNWRyB0ZXh0LgorICAgICAgICAqIHJlbmRlcmluZy9JbmxpbmVGbG93Qm94Lmg6IERl
dmlydHVhbGl6ZSBwbGFjZUJveGVzSG9yaXpvbnRhbGx5KCksIFNWRyBubyBtb3JlIG92ZXJyaWRl
cyBpdC4KKyAgICAgICAgKiByZW5kZXJpbmcvSW5saW5lVGV4dEJveC5oOiBWaXJ0dWFsaXplIHNl
bGVjdGlvblN0YXJ0RW5kKCkgLSBTVkdJbmxpbmVUZXh0Qm94IG5lZWRzIHRvIGNoYW5nZSBzdGFy
dC9lbmRQb3NpdGlvbnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGV4dCBjaHVuayBwYXJ0IHRoYXQg
aXQncyByZW5kZXJpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZH
VGV4dENodW5rTGF5b3V0SW5mby5oIGNvbnRhaW5zIGEgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiB3
aGF0IGEgU1ZHVGV4dENodW5rL1NWR1RleHRDaHVua1BhcnQgaXMsIGFuZCB3aHkgdGhleSBhcmUg
bmVjZXNzYXJ5LgorICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6aXNJbmxpbmVUZXh0
Qm94KTogQ29uc3RpZnkgdGhpcyBtZXRob2QuCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJs
b2NrLmg6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6Zm9yY2VMYXlvdXRJbmxpbmVD
aGlsZHJlbik6IEFkZCBoZWxwZXIgbWV0aG9kLCB1c2VkIG9ubHkgYnkgUmVuZGVyU1ZHVGV4dCwg
dG8gdXNlIGEgc2ltcGxpZmllZCBsYXlvdXQgc3RyYXRlZ3ksIHdoaWNoIGlzIGEgYmlnIHNwZWVk
IHdpbi4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpjb21wdXRlSG9yaXpvbnRhbFBvc2l0aW9uc0Zv
ckxpbmUpOiBSZW1vdmUgYWxsIGlzU1ZHVGV4dCgpIHNwZWNpYWwgY2FzZXMsIGFzIHRoaXMgZnVu
Y3Rpb24gaXMgbm90IGNhbGxlZCBhbnltb3JlIGZvciBTVkcgdGV4dC4KKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlckJsb2NrOjpsYXlvdXRJbmxpbmVDaGlsZHJlbik6IERvbid0IGNhbGwgY29tcHV0
ZUhvcml6b250YWxQb3NpdGlvbnNGb3JMaW5lKCkgZm9yIFNWRyB0ZXh0LiBjb21wdXRlUGVyQ2hh
cmFjdGVyTGF5b3V0SW5mb3JtYXRpb24oKSBvdmVycmlkZXMgaXQgYW55d2F5LgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJTVkdJbmxpbmUuY3BwOiBSZW1vdmUgY3VzdG9tIGFic29sdXRlUmVj
dHMvYWJzb2x1dGVRdWFkcyBjb2RlLCBhbGwgc2hhcmVkIHdpdGggUmVuZGVySW5saW5lIG5vdy4K
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR0lubGluZTo6Y2xpcHBlZE92ZXJmbG93UmVjdEZv
clJlcGFpbnQpOiBBZGRlZCwgZm9yd2FyZCB0byBTVkdSZW5kZXJCYXNlLCBqdXN0IGxpa2UgYWxs
IG90aGVyIG5vbi10ZXh0IFNWRyByZW5kZXJlcnMgZG8uCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJTVkdJbmxpbmU6OmNvbXB1dGVSZWN0Rm9yUmVwYWludCk6IERpdHRvLgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyU1ZHSW5saW5lOjptYXBMb2NhbFRvQ29udGFpbmVyKTogRGl0dG8KKyAgICAg
ICAgKiByZW5kZXJpbmcvUmVuZGVyU1ZHSW5saW5lLmg6IAorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJTVkdJbmxpbmVUZXh0LmNwcDogUmVtb3ZlIGRlc3Ryb3koKSBoYWNrLCB3aGljaCBjYWxs
ZWQgc2V0TmVlZHNMYXlvdXRBbmRQcmVmV2lkdGhzUmVjYWxjL3JlcGFpbnQgb24gZGVzdHJ1Y3Rp
b24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcyByZXBh
aW50IHJlY3RzIHdvcmsgcHJvcGVybHkgbm93LCB0aGlzIGhhY2sgaXMgbm8gbG9uZ2VyIG5lY2Vz
c2FyeSwgaXQgd2FzIG9ubHkgaGlkaW5nIHRoZSByZWFsIHByb2JsZW0uCisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJTVkdJbmxpbmVUZXh0OjpzdHlsZURpZENoYW5nZSk6IERvbid0IHNraXAgUmVu
ZGVyVGV4dDo6c3R5bGVEaWRDaGFuZ2UoKSBhbnltb3JlLCB3aGljaCBhdXRvbWF0aWNhbGx5IHNj
aGVkdWxlcyBsYXlvdXQgY2hhbmdlcyBmb3IgdXMuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJT
VkdJbmxpbmVUZXh0Ojpsb2NhbENhcmV0UmVjdCk6IFJlbW92ZSBvdXRkYXRlZCBjb21tZW50LCBs
b2NhbENhcmV0UmVjdCgpIGlzIG5vdCB5ZXQgbmVlZGVkIGluIFNWRyB0ZXh0IGNvZGUuCisgICAg
ICAgICogcmVuZGVyaW5nL1JlbmRlclNWR0lubGluZVRleHQuaDogUmVtb3ZlIGN1c3RvbSBhYnNv
bHV0ZVJlY3RzL2Fic29sdXRlUXVhZHMvc2VsZWN0aW9uUmVjdEZvclJlcGFpbnQvcG9zaXRpb25G
b3JQb2ludC9kZXN0cm95L2NvbXB1dGVSZWN0Rm9yUmVwYWludCogY29kZSwgYWxsIHNoYXJlZCB3
aXRoIFJlbmRlclRleHQgbm93LgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJTVkdUZXh0LmNw
cDogCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdUZXh0OjptYXBMb2NhbFRvQ29udGFpbmVy
KTogVGFrZSB4L3kgdHJhbnNsYXRpb24gaW50byBhY2NvdW50LCBidXQgZG8gTk9UIGluY2x1ZGUg
aW4gbG9jYWxUb1BhcmVudFRyYW5zZm9ybSgpLCBhcyB0aGF0IHdvdWxkIGFmZmVjdCByZW5kZXJp
bmcuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdUZXh0OjpsYXlvdXQpOiBVc2Ugc3VwZXIt
c2ltcGxpZmllZCBsYXlvdXQgc3RyYXRlZ3ksIHJlbW92aW5nIGEgbG90IG9mIHVuY2Vzc2FyeSBz
dHVmZiBkb25lIGJ5IFJlbmRlckJsb2NrLCB0aGF0IFNWRyBkb2VzIG5vdCBuZWVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyU1ZHVGV4dDo6YWJzb2x1dGVSZWN0cyk6IFJlbW92ZSBkZWFkLWNv
ZGUsIHJldHJldmluZyB0aGUgUmVuZGVyU1ZHUm9vdCogb2JqZWN0LCBub3QgbmVjZXNzYXJ5IHNp
bmNlIGEgbG9uZ2VyIHRpbWUuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdUZXh0OjphYnNv
bHV0ZVF1YWRzKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdUZXh0OjpwYWlu
dCk6IEVhcmx5IGV4aXQgaWYgd2UncmUgbm90IGluIFBhaW50UGhhc2VGb3JlZ3JvdW5kL1BhaW50
UGhhc2VTZWxmT3V0bGluZS4gV2UncmUgbm90IGludGVyZXNzdGVkIGluIG90aGVyIHBoYXNlcy4K
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR1RleHQ6OnN0cm9rZUJvdW5kaW5nQm94KTogRml4
IHN0cm9rZSB3aWR0aCBjYWxjdWxhdGlvbiwgbm8gbmVlZCB0byBzcGVjaWFsIGNhc2UgU1ZHRm9u
dHMuCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclNWR1RleHQuaDogUmVtb3ZlIHVwZGF0ZUZp
cnN0TGluZUJsb2NrL3VwZGF0ZUZpcnN0TGV0dGVyIG92ZXJyaWRlcywgdGhlIG5ldyBSZW5kZXJT
VkdUZXh0OjpsYXlvdXQoKSBjb2RlLCBkb2Vzbid0IHVzZSB0aGVzZSBtZXRob2RzIGF0IGFsbC4K
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZSBhc2tlZCBSZW5kZXJCbG9j
ayB0byBsYXlvdXQgYmVmb3JlLCB3aGljaCB3YXMgY2FsbGluZyB1cGRhdGVGaXJzdExldHRlciAm
IGNvLCB0aGlzIGlzIGdvbmUgbm93LCBhcyBpdCB3YXMgYWxsIG5vdCBuZWVkZWQuCisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJTVkdUZXh0OjpvYmplY3RCb3VuZGluZ0JveCk6IERpcmVjdGx5IHJl
dHVybiB0aGUgZnJhbWVSZWN0IGhlcmUsIGlubGluZWQgZm9yIHNwZWVkLgorICAgICAgICAqIHJl
bmRlcmluZy9Sb290SW5saW5lQm94LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJvb3RJbmxpbmVC
b3g6OnZlcnRpY2FsbHlBbGlnbkJveGVzKTogRWFybHktZXhpdCBpZiB3ZSdyZSBhIFNWR1Jvb3RJ
bmxpbmVCb3guIFNWRyBoYW5kbGVzIHRoaXMgb24gaXRzIG93bi4KKyAgICAgICAgKiByZW5kZXJp
bmcvUm9vdElubGluZUJveC5oOiBEZXZpcnR1YWxpemUgdmVydGljYWxseUFsaWduQm94ZXMoKSwg
U1ZHIG5vIGxvbmdlciBvdmVycmlkZXMgaXQuIFJlbW92ZSB2aXJ0dWFsIGNvbXB1dGVQZXJDaGFy
YWN0ZXJMYXlvdXRJbmZvcm1hdGlvbigpIG1ldGhvZCwgb25seSBsaXZlcyBpbiBTVkdSb290SW5s
aW5lQm94IG5vdy4KKyAgICAgICAgKiByZW5kZXJpbmcvU1ZHQ2hhcmFjdGVyRGF0YS5oOiBSZW1v
dmUgbm8gbG9uZ2VyIG5lZWRlZCBTVkdUZXh0RGVjb3JhdGlvbkluZm8uCisgICAgICAgICogcmVu
ZGVyaW5nL1NWR0NoYXJhY3RlckxheW91dEluZm8uY3BwOiBEb24ndCBwYXNzIGEgcmVmZXJlbmNl
IHRvIGEgVmVjdG9yPFNWR0NoYXI+IHRvIFNWR0NoYXJhY3RlckxheW91dEluZm8sIGxldCBpdCBj
cmVhdGUgaXQuCisgICAgICAgIChXZWJDb3JlOjpTVkdDaGFyYWN0ZXJMYXlvdXRJbmZvOjpTVkdD
aGFyYWN0ZXJMYXlvdXRJbmZvKToKKyAgICAgICAgKiByZW5kZXJpbmcvU1ZHQ2hhcmFjdGVyTGF5
b3V0SW5mby5oOgorICAgICAgICAqIHJlbmRlcmluZy9TVkdJbmxpbmVGbG93Qm94LmNwcDogCisg
ICAgICAgIChXZWJDb3JlOjpTVkdJbmxpbmVGbG93Qm94OjpwYWludCk6IEFzayBjaGlsZHJlbiB0
byBwYWludC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR0lubGluZUZsb3dCb3g6OmNhbGN1bGF0ZUJv
dW5kYXJpZXMpOiBDYWxjdWxhdGUgYm91bmRhcmllcyBieSB1bml0aW5nIGFsbCBkaXJlY3QgY2hp
bGRyZW4gYm91bmRhcmllcy4KKyAgICAgICAgKiByZW5kZXJpbmcvU1ZHSW5saW5lRmxvd0JveC5o
OiBSZW1vdmUgcGxhY2VCb3hlc0hvcml6b250YWxseSwgd2hpY2ggZG9lcyBub3QgZ2V0IGNhbGxl
ZCBhbnltb3JlLCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZW4uCisgICAgICAgICog
cmVuZGVyaW5nL1NWR0lubGluZVRleHRCb3guY3BwOiAKKyAgICAgICAgKFdlYkNvcmU6OlNWR0lu
bGluZVRleHRCb3g6OlNWR0lubGluZVRleHRCb3gpOiBEb24ndCB1c2UgYWJicmV2YXRpb25zIGZv
ciB2YXJpYWJsZSBuYW1lcywgaW5pdGlhbGl6ZSBuZXcgbWVtYmVyIHZhcmlhYmxlcy4KKyAgICAg
ICAgKFdlYkNvcmU6OlNWR0lubGluZVRleHRCb3g6Om1lYXN1cmVDaGFyYWN0ZXIpOiBOZXcgaGVs
cGVyIGZ1bmN0aW9uIGV4dHJhY3RlZCBmcm9tIGJ1aWxkTGF5b3V0SW5mb3JtYXRpb24sIHJlcGxh
Y2luZyBjYWxjdWxhdGVHbHlwaFdpZHRoL0hlaWdodC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR0lu
bGluZVRleHRCb3g6Om9mZnNldEZvclBvc2l0aW9uKTogSW1wbGVtZW50IHRoaXMgbWV0aG9kIGJ5
IHV0aWxpemluZyBGb250OjpvZmZzZXRGb3JQb3NpdGlvbigpLCBidXQgcmVzcGVjdGluZyB0aGUg
dGV4dCBjaHVuayBwYXJ0cy4KKyAgICAgICAgKFdlYkNvcmU6OlNWR0lubGluZVRleHRCb3g6OnBv
c2l0aW9uRm9yT2Zmc2V0KTogTm8gY2hhbmdlIGhlcmUsIHN0aWxsIG5vdCB1c2VkLgorICAgICAg
ICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4dEJveDo6c2VsZWN0aW9uUmVjdCk6IFJld3JpdHRlbiwg
dXRpbGl6aW5nIEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JUZXh0KCksIHRha2luZyB0ZXh0IGNodW5r
IHBhcnRzIGludG8gYWNjb3VudCwgYW5kIHRoZSBzdXBwbGllZCBzdGFydFBvcy9lbmRQb3MuCisg
ICAgICAgIChXZWJDb3JlOjpTVkdJbmxpbmVUZXh0Qm94OjpwYWludCk6IFJld3JpdHRlbiwgdG8g
aGFuZGxlIHBhaW50IHNlcnZlcnMgbXVjaCBtb3JlIGVsZWdhbnQsIHRoYW4gdGhlIG9sZCBzb2x1
dGlvbi4gU2VlIGNvZGUgZm9yIGRldGFpbHMsIHRvbyBtdWNoIHRvIGV4cGxhaW4gaGVyZS4KKyAg
ICAgICAgKFdlYkNvcmU6OlNWR0lubGluZVRleHRCb3g6OmFjcXVpcmVQYWludGluZ1Jlc291cmNl
KTogSGVscGVyIGZ1bmN0aW9uLCB1c2VkIGZyb20gcGFpbnQoKS4KKyAgICAgICAgKFdlYkNvcmU6
OlNWR0lubGluZVRleHRCb3g6OnJlbGVhc2VQYWludGluZ1Jlc291cmNlKTogRGl0dG8uCisgICAg
ICAgIChXZWJDb3JlOjpTVkdJbmxpbmVUZXh0Qm94OjpwcmVwYXJlR3JhcGhpY3NDb250ZXh0Rm9y
VGV4dFBhaW50aW5nKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpTVkdJbmxpbmVUZXh0Qm94
OjpyZXN0b3JlR3JhcGhpY3NDb250ZXh0QWZ0ZXJUZXh0UGFpbnRpbmcpOiBEaXR0by4KKyAgICAg
ICAgKFdlYkNvcmU6OlNWR0lubGluZVRleHRCb3g6OmNvbnN0cnVjdFRleHRSdW4pOiBIZWxwZXIg
ZnVuY3Rpb24gY2VudHJhbGl6aW5nIHRoZSBjcmVhdGlvbiBvZiBhIFRleHRSdW4gb2JqZWN0LCB1
c2VkIHRvIGRyYXcvbWVhc3VyZSBTVkcgdGV4dC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR0lubGlu
ZVRleHRCb3g6Om1hcFN0YXJ0RW5kUG9zaXRpb25zSW50b0NodW5rUGFydENvb3JkaW5hdGVzKTog
SW1wb3J0YW50IGhlbHBlciBmdW5jdGlvbiwgbWFwcGluZyBhIHN0YXJ0UG9zL2VuZFBvcyBmcm9t
IElubGluZVRleHRCb3gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZSBzcGFj
ZSB0byB0aGUgU1ZHSW5saW5lVGV4dEJveCwgcmVzcGVjdGluZyB0aGUgY3VycmVudCB0ZXh0IGNo
dW5rIHBhcnQuCisgICAgICAgIChXZWJDb3JlOjpTVkdJbmxpbmVUZXh0Qm94OjpzZWxlY3Rpb25T
dGFydEVuZCk6IENhbGwgSW5saW5lVGV4dEJveDo6c2VsZWN0aW9uU3RhcnRFbmQoKSwgYW5kIGFw
cGx5IHBvc3QgZml4ZXMgd2hlbiBtX2N1cnJlbnRDaHVua1BhcnQgaXMgc2V0LiAoY2FsbGVkIHdo
ZW4gcGFpbnRpbmcgYSBzZWxlY3RlZCBjaHVuayBwYXJ0KQorICAgICAgICAoV2ViQ29yZTo6cG9z
aXRpb25PZmZzZXRGb3JEZWNvcmF0aW9uKTogUmVmYWN0b3JlZCBmcm9tIG9sZCBwYWludERlY29y
YXRpb24oKSBjb2RlLgorICAgICAgICAoV2ViQ29yZTo6dGhpY2tuZXNzRm9yRGVjb3JhdGlvbik6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6ZmluZFJlbmRlck9iamVjdERlZmluaW5pbmdUZXh0
RGVjb3JhdGlvbik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4dEJveDo6
cGFpbnREZWNvcmF0aW9uKTogRGl0dG8uIChDYW4gbm90IHNoYXJlIHRoZSBjb2RlIHdpdGggSFRN
TCwgYXMgd2UgbmVlZCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24sIGFuZCBkaXJlY3RseSBjYWxs
IGZpbGxSZWN0LCBpbnN0ZWFkIG9mIGRyYXdIaWdobGlnaHRGb3JUZXh0LikKKyAgICAgICAgKFdl
YkNvcmU6OlNWR0lubGluZVRleHRCb3g6OnBhaW50RGVjb3JhdGlvbldpdGhTdHlsZSk6IERpdHRv
LgorICAgICAgICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4dEJveDo6cGFpbnRTZWxlY3Rpb24pOiBO
ZXcgbWV0aG9kLCBwYWludGluZyB0ZXh0IHNlbGVjdGlvbnMgd2l0aCBmbG9hdGluZy1wb2ludCBw
cmVjaXNpb24uCisgICAgICAgIChXZWJDb3JlOjpTVkdJbmxpbmVUZXh0Qm94OjpwYWludFRleHQp
OiBOZXcgbWV0aG9kLCBwYWludGluZyB0ZXh0IHdpdGggZmxvYXRpbmctcG9pbnQgcHJlY2lzaW9u
LCBjb3JyZWN0bHkgaGFuZGxpbmcgc2VsZWN0ZWQgdGV4dCwgcmVtb3ZpbmcgdGhlIG5lZWQgZm9y
IHNwZWNpYWwgU1ZHIHRleHQgc3ViLXBhaW50IHBoYXNlcy4KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHbHlwaEZpbGwvU3Ryb2tlU2VsZWN0aW9uUGhh
c2UsIEdseXBoRmlsbC9TdHJva2VQaGFzZSkKKyAgICAgICAgKFdlYkNvcmU6OlNWR0lubGluZVRl
eHRCb3g6OmJ1aWxkTGF5b3V0SW5mb3JtYXRpb24pOiBVc2UgbmV3IG1lYXN1cmVDaGFyYWN0ZXIo
KSBoZWxwZXIgZnVuY3Rpb24sIHJlbmFtZWQgc29tZSB2YXJpYWJsZXMsIHRvIGF2b2lkIGFiYnJl
dmF0aW9ucy4KKyAgICAgICAgKFdlYkNvcmU6OlNWR0lubGluZVRleHRCb3g6OmNhbGN1bGF0ZUds
eXBoQm91bmRhcmllcyk6IFJld3JpdHRlbiB0byB1c2UgbmV3IG1lYXN1cmVDaGFyYWN0ZXIoKSBo
ZWxwZXIgZnVuY3Rpb24uCisgICAgICAgIChXZWJDb3JlOjpTVkdJbmxpbmVUZXh0Qm94OjpjYWxj
dWxhdGVCb3VuZGFyaWVzKTogUmV3cml0dGVuIHRvIHRha2UgdGV4dCBjaHVuayBwYXJ0cyBpbnRv
IGFjY291bnQsIHNlcnZlcyBhcyBjZW50cmFsIG1ldGhvZCB1c2VkIHRvIGxheW91dCBJbmxpbmVC
b3hlcyAoc2VlIFNWR1Jvb3RJbmxpbmVCb3guKQorICAgICAgICAqIHJlbmRlcmluZy9TVkdJbmxp
bmVUZXh0Qm94Lmg6CisgICAgICAgIChXZWJDb3JlOjpTVkdJbmxpbmVUZXh0Qm94Ojppc1NWR0lu
bGluZVRleHRCb3gpOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR0lubGluZVRleHRCb3g6
OnNldEhlaWdodCk6IFJlbmFtZSB2YXJpYWJsZSwgdG8gYXZvaWQgYWJicmV2YXRpb25zLgorICAg
ICAgICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4dEJveDo6Y2h1bmtUcmFuc2Zvcm1hdGlvbik6IE5l
dyBoZWxwZXIgZnVuY3Rpb24sIHJldHVybmluZyB0aGUgdHJhbnNmb3JtYXRpb24sIHRoYXQgZ2V0
cyBhcHBsaWVkIHRvIHRoZSBjb21wbGV0ZSB0ZXh0IGNodW5rLCBpZiBhbnkuCisgICAgICAgIChX
ZWJDb3JlOjpTVkdJbmxpbmVUZXh0Qm94OjpzZXRDaHVua1RyYW5zZm9ybWF0aW9uKTogTmV3IGhl
bHBlciBmdW5jdGlvbiB1c2VkIGJ5IFNWR1Jyb290SW5saW5lQm94LCB0byBzZXQgdGhlIGNodW5r
IHRyYW5zZm9ybWF0aW9uLCBkdXJpbmcgdGV4dCBjaHVuayBwYXJ0IHByb3BhZ2F0aW9uIHBoYXNl
LgorICAgICAgICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4dEJveDo6YWRkQ2h1bmtQYXJ0SW5mb3Jt
YXRpb24pOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OlNWR0lubGluZVRleHRCb3g6OnN2Z1Rl
eHRDaHVua1BhcnRzKTogRGl0dG8uCisgICAgICAgICogcmVuZGVyaW5nL1NWR1Jvb3RJbmxpbmVC
b3guY3BwOiBWaXJ0dWFsbHkgcmV3cml0dGVuLCB0byBiZSBkZXNpZ25lZCBtb3JlIGxpa2UgSFRN
THMgUm9vdElubGluZUJveCwgZGl2aW5nIGludG8gY2hpbGRyZW4gZm9yIHBhaW50aW5nLgorICAg
ICAgICAoV2ViQ29yZTo6U1ZHUm9vdElubGluZUJveDo6cGFpbnQpOiBBc2sgY2hpbGRyZW4gdG8g
cGFpbnQsIG5vdGhpbmcgbW9yZS4gTm8gbW9yZSB0cmF2ZXJzaW5nIHRocm91Z2ggdGhlIFNWR1Rl
eHRDaHVua3MsIGZpZ3VyaW5nIG91dCB3aGljaCBwYXJ0IHRvIHJlbmRlciwgdGhpcyBpcyBkb25l
IGluIGxheW91dCBwaGFzZSBub3cuCisgICAgICAgIChXZWJDb3JlOjpTVkdSb290SW5saW5lQm94
Ojpjb21wdXRlUGVyQ2hhcmFjdGVyTGF5b3V0SW5mb3JtYXRpb24pOiBDb21wbGV0bHkgcmVkZXNp
Z25lZCwgc2VlIFNWR1RleHRDaHVua0xheW91dEluZm8uaCBmb3IgYSBoaWdoLWxldmVsIG92ZXJ2
aWV3LgorICAgICAgICAoV2ViQ29yZTo6U1ZHUm9vdElubGluZUJveDo6YnVpbGRMYXlvdXRJbmZv
cm1hdGlvbik6IEp1c3Qgc21hbGwgY2xlYW51cHMsIG5vdGhpbmcgY2hhbmdlZCBoZXJlLgorICAg
ICAgICAoV2ViQ29yZTo6U1ZHUm9vdElubGluZUJveDo6bGF5b3V0Q2hpbGRCb3hlcyk6IE5ldyBo
ZWxwZXIgZnVuY3Rpb24sIGV4dHJhY3RlZCBmcm9tIG9sZCBsYXlvdXRJbmxpbmVCb3hlcygpLgor
ICAgICAgICAoV2ViQ29yZTo6U1ZHUm9vdElubGluZUJveDo6bGF5b3V0Um9vdEJveCk6IERpdHRv
LgorICAgICAgICAoV2ViQ29yZTo6U1ZHUm9vdElubGluZUJveDo6cHJvcGFnYXRlVGV4dENodW5r
UGFydEluZm9ybWF0aW9uKTogS2V5LWNvbmNlcHQgb2YgdGhlIG5ldyBkZXNpZ24sIGJ1aWxkcyAi
dGV4dCBjaHVuayBwYXJ0cyIgYW5kIHByb3BhZ2F0ZXMgdGhhdCBrbm93bmxlZGdlIHRvIGFsbCBj
aGlsZCBTVkdJbmxpbmVUZXh0Qm94ZXMuCisgICAgICAgICogcmVuZGVyaW5nL1NWR1Jvb3RJbmxp
bmVCb3guaDoKKyAgICAgICAgKFdlYkNvcmU6OlNWR1Jvb3RJbmxpbmVCb3g6OmlzU1ZHUm9vdElu
bGluZUJveCk6IENvbnN0aWZpZWQgbWV0aG9kLgorICAgICAgICAoV2ViQ29yZTo6U1ZHUm9vdElu
bGluZUJveDo6c2V0SGVpZ2h0KTogQ2hhbmdlIHZhcmlhYmxlIG5hbWUsIHRvIGF2b2lkIGFiYnJl
dmF0aW9ucy4KKyAgICAgICAgKiByZW5kZXJpbmcvU1ZHVGV4dENodW5rTGF5b3V0SW5mby5jcHA6
IFJlbW92ZSBpZiAwLCBlbmFibGUgY29tcGlsYXRpb24uCisgICAgICAgICogcmVuZGVyaW5nL1NW
R1RleHRDaHVua0xheW91dEluZm8uaDogQWRkIGxhcmdlIGNvbW1lbnQgZXhwbGFpbmluZyB0ZXh0
IGNodW5rIHBhcnRzLCB0aGUga2V5IGNvbmNlcHQgb2YgdGhlIG5ldyBkZXNpZ24uIFJlbW92ZSBT
VkdUZXh0Q2h1bmtXYWxrZXIgJiBmcmllbmRzLCBubyBsb25nZXIgdXNlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlNWR1RleHRDaHVua1BhcnQ6OlNWR1RleHRDaHVua1BhcnQpOgorICAgICAgICAoV2Vi
Q29yZTo6U1ZHVGV4dENodW5rUGFydDo6aXNWYWxpZCk6CisgICAgICAgIChXZWJDb3JlOjpTVkdU
ZXh0Q2h1bms6OlNWR1RleHRDaHVuayk6CisgICAgICAgIChXZWJDb3JlOjpTVkdUZXh0Q2h1bmtM
YXlvdXRJbmZvOjpTVkdUZXh0Q2h1bmtMYXlvdXRJbmZvKToKKyAgICAgICAgKFdlYkNvcmU6OlNW
R1RleHRDaHVua0xheW91dEluZm86OnRleHRDaHVua3MpOgorICAgICAgICAqIHJlbmRlcmluZy9T
VkdUZXh0TGF5b3V0VXRpbGl0aWVzLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmN1bW11bGF0ZWRX
aWR0aE9mSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6Y3VtbXVs
YXRlZEhlaWdodE9mSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6
c3ZnVGV4dFJ1bkZvcklubGluZVRleHRCb3gpOiBEaXNhYmxlIHJvdW5kaW5nIGhhY2tzLCBleHBs
YWluIHBhcmFtZXRlcnMgd2l0aCBjb21tZW50cywgd2h5IHRoZXkgaGF2ZSB3aGljaCB2YWx1ZXMu
CisgICAgICAgICogcmVuZGVyaW5nL1NWR1RleHRMYXlvdXRVdGlsaXRpZXMuaDogUmVtb3ZlIFNW
R1RleHRQYWludFN1YnBoYXNlIGFuZCBTVkdUZXh0UGFpbnRJbmZvLgorICAgICAgICAqIHJlbmRl
cmluZy9TVkdUZXh0UXVlcnkuY3BwOiBSZW1vdmUgaWYgMCwgZW5hYmxlIGNvbXBpbGF0aW9uLgor
ICAgICAgICAqIHJlbmRlcmluZy9TVkdUZXh0UXVlcnkuaDogRGl0dG8uCisgICAgICAgICogc3Zn
L1NWR1N0eWxlZEVsZW1lbnQuY3BwOiBWZXJ5IGltcG9ydGFudCBjaGFuZ2UhIERvIG5vdCB0cmVh
dCBDU1MgYXR0cmlidXRlcyBhcyByZWNvZ25pemVkIGF0dHJpYnV0ZXMsIHRoYXQgd291bGQgbGVh
ZCB0byBzZXROZWVkc0xheW91dCgpIGNhbGxzLCByZWR1Y2luZyBwZXJmb3JtYW5jZSEKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaGFjayBleGlzdGVkLCBhcyB3ZSB3
ZXJlIG5vdCBkZWFsaW5nIHdpdGggdGV4dCB1cGRhdGVzIGNvcnJlY3RseSwgbm93IHRoYXQgUmVu
ZGVyU1ZHSW5saW5lVGV4dDo6c3R5bGVEaWRDaGFuZ2UgaXMgZml4ZWQsIGl0J3Mgbm8gbG9uZ2Vy
IG5lY2Vzc2FyeS4KKyAgICAgICAgKFdlYkNvcmU6OlNWR1N0eWxlZEVsZW1lbnQ6OmlzS25vd25B
dHRyaWJ1dGUpOgorICAgICAgICAqIHN2Zy9TVkdUZXh0Q29udGVudEVsZW1lbnQuY3BwOiBDb21w
bGV0ZWx5IHJlbW92ZSB0aGUgU1ZHVGV4dENvbnRlbnRFbGVtZW50IEFQSSwgdGhhdCBtYW51YWxs
eSB0cmF2ZXJzZWQgYWxsIHRleHQgY2h1bmtzLCBpbnN0ZWFkIHVzZSB0aGUgbmV3IFNWR1RleHRR
dWVyeSBBUEkuCisgICAgICAgIChXZWJDb3JlOjpTVkdUZXh0Q29udGVudEVsZW1lbnQ6OmdldE51
bWJlck9mQ2hhcnMpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHVGV4dENvbnRlbnRFbGVtZW50Ojpn
ZXRDb21wdXRlZFRleHRMZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHVGV4dENvbnRlbnRF
bGVtZW50OjpnZXRTdWJTdHJpbmdMZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHVGV4dENv
bnRlbnRFbGVtZW50OjpnZXRTdGFydFBvc2l0aW9uT2ZDaGFyKToKKyAgICAgICAgKFdlYkNvcmU6
OlNWR1RleHRDb250ZW50RWxlbWVudDo6Z2V0RW5kUG9zaXRpb25PZkNoYXIpOgorICAgICAgICAo
V2ViQ29yZTo6U1ZHVGV4dENvbnRlbnRFbGVtZW50OjpnZXRFeHRlbnRPZkNoYXIpOgorICAgICAg
ICAoV2ViQ29yZTo6U1ZHVGV4dENvbnRlbnRFbGVtZW50OjpnZXRSb3RhdGlvbk9mQ2hhcik6Cisg
ICAgICAgIChXZWJDb3JlOjpTVkdUZXh0Q29udGVudEVsZW1lbnQ6OmdldENoYXJOdW1BdFBvc2l0
aW9uKToKKyAgICAgICAgKiBzdmcvU1ZHVGV4dEVsZW1lbnQuY3BwOiBWZXJ5IGltcG9ydGFudCBj
aGFuZ2UhIERvIG5vdCBjYWxscyBzZXROZWVkc0xheW91dCgpIG9uIFJlbmRlclNWR1RleHQsIGlm
IGNoaWxkcmVuQ2hhbmdlZCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgICAgKiBzdmcvU1ZHVGV4
dEVsZW1lbnQuaDogQ29tcGxldGx5IHJlbW92ZSBjaGlsZHJlbkNoYW5nZWQoKSAtIG5vIGxvbmdl
ciBuZWNlc3NhcnksIHVwZGF0ZXMgd29yayBhcyBleHBlY3RlZCB3aXRob3V0IGl0IG5vdy4KKwog
MjAxMC0wNi0xNyAgUm9iIEJ1aXMgIDxyd2xidWlzQGdtYWlsLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBEYXZlIEh5YXR0LgpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmgJKHJldmlzaW9uIDYx
MzgzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmgJKHdvcmtpbmcgY29weSkKQEAg
LTEzMywxNiArMTMzLDI2IEBAIHB1YmxpYzoKICAgICBib29sIGlzVGV4dCgpIGNvbnN0IHsgcmV0
dXJuIG1faXNUZXh0OyB9CiAgICAgdm9pZCBzZXRJc1RleHQoYm9vbCBiKSB7IG1faXNUZXh0ID0g
YjsgfQogIAotICAgIHZpcnR1YWwgYm9vbCBpc0lubGluZUJveCgpIHsgcmV0dXJuIGZhbHNlOyB9
CiAgICAgdmlydHVhbCBib29sIGlzSW5saW5lRmxvd0JveCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNl
OyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW5saW5lVGV4dEJveCgpIHsgcmV0dXJuIGZhbHNlOyB9
CisgICAgdmlydHVhbCBib29sIGlzSW5saW5lVGV4dEJveCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNl
OyB9CiAgICAgdmlydHVhbCBib29sIGlzUm9vdElubGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIGZh
bHNlOyB9Ci0jaWYgRU5BQkxFKFNWRykgCi0gICAgdmlydHVhbCBib29sIGlzU1ZHUm9vdElubGlu
ZUJveCgpIHsgcmV0dXJuIGZhbHNlOyB9CisjaWYgRU5BQkxFKFNWRykKKyAgICB2aXJ0dWFsIGJv
b2wgaXNTVkdJbmxpbmVUZXh0Qm94KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0
dWFsIGJvb2wgaXNTVkdSb290SW5saW5lQm94KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAog
ICAgIGJvb2wgaGFzVmlydHVhbEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzVmlydHVhbEhl
aWdodDsgfQogICAgIHZvaWQgc2V0SGFzVmlydHVhbEhlaWdodCgpIHsgbV9oYXNWaXJ0dWFsSGVp
Z2h0ID0gdHJ1ZTsgfQotICAgIHZpcnR1YWwgaW50IHZpcnR1YWxIZWlnaHQoKSBjb25zdCB7IEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50IHZpcnR1YWxI
ZWlnaHQoKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
ICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgSW50UmVjdCBjYWxjdWxhdGVCb3Vu
ZGFyaWVzKCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
ICAgICByZXR1cm4gSW50UmVjdCgpOworICAgIH0KICNlbmRpZgogICAgIAogICAgIGJvb2wgaXND
b25zdHJ1Y3RlZCgpIHsgcmV0dXJuIG1fY29uc3RydWN0ZWQ7IH0KSW5kZXg6IFdlYkNvcmUvcmVu
ZGVyaW5nL0lubGluZUZsb3dCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9J
bmxpbmVGbG93Qm94LmgJKHJldmlzaW9uIDYxMzgzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvSW5s
aW5lRmxvd0JveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjcsNyArMTI3LDcgQEAgcHVibGljOgog
ICAgIHZvaWQgZGV0ZXJtaW5lU3BhY2luZ0ZvckZsb3dCb3hlcyhib29sIGxhc3RMaW5lLCBSZW5k
ZXJPYmplY3QqIGVuZE9iamVjdCk7CiAgICAgaW50IGdldEZsb3dTcGFjaW5nV2lkdGgoKTsKICAg
ICBib29sIG9uRW5kQ2hhaW4oUmVuZGVyT2JqZWN0KiBlbmRPYmplY3QpOwotICAgIHZpcnR1YWwg
aW50IHBsYWNlQm94ZXNIb3Jpem9udGFsbHkoaW50IHgsIGJvb2wmIG5lZWRzV29yZFNwYWNpbmcs
IEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJik7CisgICAgaW50IHBsYWNlQm94ZXNI
b3Jpem9udGFsbHkoaW50IHgsIGJvb2wmIG5lZWRzV29yZFNwYWNpbmcsIEdseXBoT3ZlcmZsb3dB
bmRGYWxsYmFja0ZvbnRzTWFwJik7CiAgICAgdm9pZCBjb21wdXRlTG9naWNhbEJveEhlaWdodHMo
aW50JiBtYXhQb3NpdGlvblRvcCwgaW50JiBtYXhQb3NpdGlvbkJvdHRvbSwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG1heEFzY2VudCwgaW50JiBtYXhEZXNjZW50LCBi
b29sIHN0cmljdE1vZGUsIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRzTWFwJik7CiAgICAg
dm9pZCBhZGp1c3RNYXhBc2NlbnRBbmREZXNjZW50KGludCYgbWF4QXNjZW50LCBpbnQmIG1heERl
c2NlbnQsCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5oCShyZXZpc2lvbiA2MTM4MykK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3guaAkod29ya2luZyBjb3B5KQpAQCAt
NzIsOSArNzIsOSBAQCBwcml2YXRlOgogcHVibGljOgogICAgIHZpcnR1YWwgSW50UmVjdCBzZWxl
Y3Rpb25SZWN0KGludCBhYnN4LCBpbnQgYWJzeSwgaW50IHN0YXJ0UG9zLCBpbnQgZW5kUG9zKTsK
ICAgICBib29sIGlzU2VsZWN0ZWQoaW50IHN0YXJ0UG9zLCBpbnQgZW5kUG9zKSBjb25zdDsKLSAg
ICB2b2lkIHNlbGVjdGlvblN0YXJ0RW5kKGludCYgc1BvcywgaW50JiBlUG9zKTsKKyAgICB2aXJ0
dWFsIHZvaWQgc2VsZWN0aW9uU3RhcnRFbmQoaW50JiBzUG9zLCBpbnQmIGVQb3MpOwogCi1wcml2
YXRlOgorcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6OlBh
aW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKICAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQo
Y29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQg
dHgsIGludCB0eSk7CiAKQEAgLTk5LDcgKzk5LDcgQEAgcHVibGljOgogICAgIHZvaWQgc2V0U3Bh
Y2VBZGQoaW50IGFkZCkgeyBtX3dpZHRoIC09IG1fdG9BZGQ7IG1fdG9BZGQgPSBhZGQ7IG1fd2lk
dGggKz0gbV90b0FkZDsgfQogCiBwcml2YXRlOgotICAgIHZpcnR1YWwgYm9vbCBpc0lubGluZVRl
eHRCb3goKSB7IHJldHVybiB0cnVlOyB9ICAgIAorICAgIHZpcnR1YWwgYm9vbCBpc0lubGluZVRl
eHRCb3goKSBjb25zdCB7IHJldHVybiB0cnVlOyB9ICAgIAogCiBwdWJsaWM6CiAgICAgdmlydHVh
bCBpbnQgY2FyZXRNaW5PZmZzZXQoKSBjb25zdDsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2su
aAkocmV2aXNpb24gNjEzODMpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCSh3
b3JraW5nIGNvcHkpCkBAIC0yMjcsNyArMjI3LDE5IEBAIHByb3RlY3RlZDoKIAogICAgIHZpcnR1
YWwgYm9vbCBoYXNMaW5lSWZFbXB0eSgpIGNvbnN0OwogICAgIGJvb2wgbGF5b3V0T25seVBvc2l0
aW9uZWRPYmplY3RzKCk7Ci0gICAgCisKKyNpZiBFTkFCTEUoU1ZHKQorcHJvdGVjdGVkOgorCisg
ICAgLy8gT25seSB1c2VkIGJ5IFJlbmRlclNWR1RleHQsIHdoaWNoIGV4cGxpY2l0ZWx5IG92ZXJy
aWRlcyBSZW5kZXJCbG9jazo6bGF5b3V0QmxvY2soKSwgZG8gTk9UIHVzZSBmb3IgYW55dGhpbmcg
ZWxzZS4KKyAgICB2b2lkIGZvcmNlTGF5b3V0SW5saW5lQ2hpbGRyZW4oKQorICAgIHsKKyAgICAg
ICAgaW50IHJlcGFpbnRUb3AgPSAwOworICAgICAgICBpbnQgcmVwYWludEJvdHRvbSA9IDA7Cisg
ICAgICAgIGxheW91dElubGluZUNoaWxkcmVuKHRydWUsIHJlcGFpbnRUb3AsIHJlcGFpbnRCb3R0
b20pOworICAgIH0KKyNlbmRpZgorCiBwcml2YXRlOgogICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0
Q2hpbGRMaXN0KiB2aXJ0dWFsQ2hpbGRyZW4oKSB7IHJldHVybiBjaGlsZHJlbigpOyB9CiAgICAg
dmlydHVhbCBjb25zdCBSZW5kZXJPYmplY3RDaGlsZExpc3QqIHZpcnR1YWxDaGlsZHJlbigpIGNv
bnN0IHsgcmV0dXJuIGNoaWxkcmVuKCk7IH0KSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckJsb2NrTGluZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkocmV2aXNpb24gNjEzODMpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICsz
OSwxMCBAQAogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KICNpbmNsdWRlIDx3dGYvVmVj
dG9yLmg+CiAKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIlNWR1Jvb3RJbmxpbmVCb3guaCIK
KyNlbmRpZgorCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIFdURjsKIHVz
aW5nIG5hbWVzcGFjZSBVbmljb2RlOwpAQCAtMzQ1LDIxICszNDksMTMgQEAgdm9pZCBSZW5kZXJC
bG9jazo6Y29tcHV0ZUhvcml6b250YWxQb3NpdAogICAgICAgICAgICAgSGFzaFNldDxjb25zdCBT
aW1wbGVGb250RGF0YSo+IGZhbGxiYWNrRm9udHM7CiAgICAgICAgICAgICBHbHlwaE92ZXJmbG93
IGdseXBoT3ZlcmZsb3c7CiAgICAgICAgICAgICByLT5tX2JveC0+c2V0V2lkdGgocnQtPndpZHRo
KHItPm1fc3RhcnQsIHItPm1fc3RvcCAtIHItPm1fc3RhcnQsIHRvdFdpZHRoLCBmaXJzdExpbmUs
ICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdykpOwotICAgICAgICAgICAgaWYgKCFmYWxs
YmFja0ZvbnRzLmlzRW1wdHkoKQotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgICAgICAgICAgICAg
ICYmICFpc1NWR1RleHQoKQotI2VuZGlmCi0gICAgICAgICAgICApIHsKKyAgICAgICAgICAgIGlm
ICghZmFsbGJhY2tGb250cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBBU1NFUlQoci0+
bV9ib3gtPmlzVGV4dCgpKTsKICAgICAgICAgICAgICAgICBHbHlwaE92ZXJmbG93QW5kRmFsbGJh
Y2tGb250c01hcDo6aXRlcmF0b3IgaXQgPSB0ZXh0Qm94RGF0YU1hcC5hZGQoc3RhdGljX2Nhc3Q8
SW5saW5lVGV4dEJveCo+KHItPm1fYm94KSwgbWFrZV9wYWlyKFZlY3Rvcjxjb25zdCBTaW1wbGVG
b250RGF0YSo+KCksIEdseXBoT3ZlcmZsb3coKSkpLmZpcnN0OwogICAgICAgICAgICAgICAgIEFT
U0VSVChpdC0+c2Vjb25kLmZpcnN0LmlzRW1wdHkoKSk7CiAgICAgICAgICAgICAgICAgY29weVRv
VmVjdG9yKGZhbGxiYWNrRm9udHMsIGl0LT5zZWNvbmQuZmlyc3QpOwogICAgICAgICAgICAgfQot
ICAgICAgICAgICAgaWYgKChnbHlwaE92ZXJmbG93LnRvcCB8fCBnbHlwaE92ZXJmbG93LmJvdHRv
bSB8fCBnbHlwaE92ZXJmbG93LmxlZnQgfHwgZ2x5cGhPdmVyZmxvdy5yaWdodCkKLSNpZiBFTkFC
TEUoU1ZHKQotICAgICAgICAgICAgICAgICYmICFpc1NWR1RleHQoKQotI2VuZGlmCi0gICAgICAg
ICAgICApIHsKKyAgICAgICAgICAgIGlmICgoZ2x5cGhPdmVyZmxvdy50b3AgfHwgZ2x5cGhPdmVy
Zmxvdy5ib3R0b20gfHwgZ2x5cGhPdmVyZmxvdy5sZWZ0IHx8IGdseXBoT3ZlcmZsb3cucmlnaHQp
KSB7CiAgICAgICAgICAgICAgICAgQVNTRVJUKHItPm1fYm94LT5pc1RleHQoKSk7CiAgICAgICAg
ICAgICAgICAgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXA6Oml0ZXJhdG9yIGl0ID0g
dGV4dEJveERhdGFNYXAuYWRkKHN0YXRpY19jYXN0PElubGluZVRleHRCb3gqPihyLT5tX2JveCks
IG1ha2VfcGFpcihWZWN0b3I8Y29uc3QgU2ltcGxlRm9udERhdGEqPigpLCBHbHlwaE92ZXJmbG93
KCkpKS5maXJzdDsKICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCA9IGdseXBoT3Zl
cmZsb3c7CkBAIC03NDIsMTYgKzczOCwzMSBAQCB2b2lkIFJlbmRlckJsb2NrOjpsYXlvdXRJbmxp
bmVDaGlsZHJlbihiCiAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lQm94KSB7CiAgICAgICAg
ICAgICAgICAgICAgICAgICBsaW5lQm94LT5zZXRFbmRzV2l0aEJyZWFrKHByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBwb3NpdGlv
biBhbGwgb2Ygb3VyIHRleHQgcnVucyBob3Jpem9udGFsbHkuCisjaWYgRU5BQkxFKFNWRykKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTVkdSb290SW5saW5lQm94ID0gbGluZUJveC0+
aXNTVkdSb290SW5saW5lQm94KCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYm9v
bCBpc1NWR1Jvb3RJbmxpbmVCb3ggPSBmYWxzZTsKKyNlbmRpZgorCiAgICAgICAgICAgICAgICAg
ICAgICAgICBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCB0ZXh0Qm94RGF0YU1hcDsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVIb3Jpem9udGFsUG9zaXRpb25zRm9yTGlu
ZShsaW5lQm94LCBmaXJzdExpbmUsIHJlc29sdmVyLmZpcnN0UnVuKCksIHRyYWlsaW5nU3BhY2VS
dW4sIGVuZC5hdEVuZCgpLCB0ZXh0Qm94RGF0YU1hcCk7CisKKyAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIE5vdyB3ZSBwb3NpdGlvbiBhbGwgb2Ygb3VyIHRleHQgcnVucyBob3Jpem9udGFsbHku
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU1ZHUm9vdElubGluZUJveCkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlSG9yaXpvbnRhbFBvc2l0aW9uc0ZvckxpbmUo
bGluZUJveCwgZmlyc3RMaW5lLCByZXNvbHZlci5maXJzdFJ1bigpLCB0cmFpbGluZ1NwYWNlUnVu
LCBlbmQuYXRFbmQoKSwgdGV4dEJveERhdGFNYXApOwogCiAgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBOb3cgcG9zaXRpb24gb3VyIHRleHQgcnVucyB2ZXJ0aWNhbGx5LgogICAgICAgICAgICAg
ICAgICAgICAgICAgY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCByZXNv
bHZlci5maXJzdFJ1bigpLCB0ZXh0Qm94RGF0YU1hcCk7CiAKICNpZiBFTkFCTEUoU1ZHKQotICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBTVkcgdGV4dCBsYXlvdXQgY29kZQotICAg
ICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+Y29tcHV0ZVBlckNoYXJhY3RlckxheW91dElu
Zm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTVkcgdGV4dCBsYXlvdXQg
Y29kZSBjb21wdXRlcyB2ZXJ0aWNhbCAmIGhvcml6b250YWwgcG9zaXRpb25zIG9uIGl0cyBvd24u
CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2Ugc3RpbGwgbmVlZCB0byBl
eGVjdXRlIGNvbXB1dGVWZXJ0aWNhbFBvc2l0aW9uc0ZvckxpbmUoKSBhcworICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gaXQgY2FsbHMgSW5saW5lVGV4dEJveDo6cG9zaXRpb25MaW5lQm94KCks
IHdoaWNoIHRyYWNrcyB3aGV0aGVyIHRoZSBib3gKKyAgICAgICAgICAgICAgICAgICAgICAgIC8v
IGNvbnRhaW5zIHJldmVyc2VkIHRleHQgb3Igbm90LiBJZiB3ZSB3b3VsZG4ndCBkbyB0aGF0IGVk
aXRpbmcgYW5kIHRodXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHQgc2VsZWN0aW9u
IGluIFJUTCBib3hlcyB3b3VsZCBub3Qgd29yayBhcyBleHBlY3RlZC4KKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChpc1NWR1Jvb3RJbmxpbmVCb3gpIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBBU1NFUlQoaXNTVkdUZXh0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0YXRpY19jYXN0PFNWR1Jvb3RJbmxpbmVCb3gqPihsaW5lQm94KS0+Y29tcHV0ZVBlckNoYXJh
Y3RlckxheW91dEluZm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAjZW5k
aWYKIAogI2lmIFBMQVRGT1JNKE1BQykKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNW
R0lubGluZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHSW5s
aW5lLmNwcAkocmV2aXNpb24gNjEzODMpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTVkdJ
bmxpbmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiwxMSArMjYsNyBAQAogI2lmIEVOQUJMRShT
VkcpCiAjaW5jbHVkZSAiUmVuZGVyU1ZHSW5saW5lLmgiCiAKLSNpbmNsdWRlICJGbG9hdFF1YWQu
aCIKLSNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgogI2luY2x1ZGUgIlNWR0lubGluZUZsb3dCb3gu
aCIKLSNpbmNsdWRlICJTVkdJbmxpbmVUZXh0Qm94LmgiCi0jaW5jbHVkZSAiU1ZHUm9vdElubGlu
ZUJveC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgCkBAIC00NiwyNSArNDIsNiBAQCBJ
bmxpbmVGbG93Qm94KiBSZW5kZXJTVkdJbmxpbmU6OmNyZWF0ZUluCiAgICAgcmV0dXJuIGJveDsK
IH0KIAotdm9pZCBSZW5kZXJTVkdJbmxpbmU6OmFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+
JiByZWN0cywgaW50LCBpbnQpCi17Ci0gICAgSW5saW5lRmxvd0JveCogZmlyc3RCb3ggPSBmaXJz
dExpbmVCb3goKTsKLQotICAgIFJvb3RJbmxpbmVCb3gqIHJvb3RCb3ggPSBmaXJzdEJveCA/IGZp
cnN0Qm94LT5yb290KCkgOiAwOwotICAgIFJlbmRlckJveCogb2JqZWN0ID0gcm9vdEJveCA/IHJv
b3RCb3gtPmJsb2NrKCkgOiAwOwotCi0gICAgaWYgKCFvYmplY3QpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGludCB4UmVmID0gb2JqZWN0LT54KCk7Ci0gICAgaW50IHlSZWYgPSBvYmplY3QtPnko
KTsKLQotICAgIGZvciAoSW5saW5lRmxvd0JveCogY3VyciA9IGZpcnN0Qm94OyBjdXJyOyBjdXJy
ID0gY3Vyci0+bmV4dExpbmVCb3goKSkgewotICAgICAgICBGbG9hdFJlY3QgcmVjdCh4UmVmICsg
Y3Vyci0+eCgpLCB5UmVmICsgY3Vyci0+eSgpLCBjdXJyLT53aWR0aCgpLCBjdXJyLT5oZWlnaHQo
KSk7Ci0gICAgICAgIHJlY3RzLmFwcGVuZChlbmNsb3NpbmdJbnRSZWN0KGxvY2FsVG9BYnNvbHV0
ZVF1YWQocmVjdCkuYm91bmRpbmdCb3goKSkpOwotICAgIH0KLX0KLQogRmxvYXRSZWN0IFJlbmRl
clNWR0lubGluZTo6b2JqZWN0Qm91bmRpbmdCb3goKSBjb25zdAogewogICAgIGlmIChjb25zdCBS
ZW5kZXJPYmplY3QqIG9iamVjdCA9IGZpbmRUZXh0Um9vdE9iamVjdCh0aGlzKSkKQEAgLTg5LDIz
ICs2NiwxOSBAQCBGbG9hdFJlY3QgUmVuZGVyU1ZHSW5saW5lOjpyZXBhaW50UmVjdEluCiAgICAg
cmV0dXJuIEZsb2F0UmVjdCgpOwogfQogCi12b2lkIFJlbmRlclNWR0lubGluZTo6YWJzb2x1dGVR
dWFkcyhWZWN0b3I8RmxvYXRRdWFkPiYgcXVhZHMpCitJbnRSZWN0IFJlbmRlclNWR0lubGluZTo6
Y2xpcHBlZE92ZXJmbG93UmVjdEZvclJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFp
bnRDb250YWluZXIpCiB7Ci0gICAgSW5saW5lRmxvd0JveCogZmlyc3RCb3ggPSBmaXJzdExpbmVC
b3goKTsKLQotICAgIFJvb3RJbmxpbmVCb3gqIHJvb3RCb3ggPSBmaXJzdEJveCA/IGZpcnN0Qm94
LT5yb290KCkgOiAwOwotICAgIFJlbmRlckJveCogb2JqZWN0ID0gcm9vdEJveCA/IHJvb3RCb3gt
PmJsb2NrKCkgOiAwOwotCi0gICAgaWYgKCFvYmplY3QpCi0gICAgICAgIHJldHVybjsKKyAgICBy
ZXR1cm4gU1ZHUmVuZGVyQmFzZTo6Y2xpcHBlZE92ZXJmbG93UmVjdEZvclJlcGFpbnQodGhpcywg
cmVwYWludENvbnRhaW5lcik7Cit9CiAKLSAgICBpbnQgeFJlZiA9IG9iamVjdC0+eCgpOwotICAg
IGludCB5UmVmID0gb2JqZWN0LT55KCk7Cit2b2lkIFJlbmRlclNWR0lubGluZTo6Y29tcHV0ZVJl
Y3RGb3JSZXBhaW50KFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29udGFpbmVyLCBJbnRS
ZWN0JiByZXBhaW50UmVjdCwgYm9vbCBmaXhlZCkKK3sKKyAgICBTVkdSZW5kZXJCYXNlOjpjb21w
dXRlUmVjdEZvclJlcGFpbnQodGhpcywgcmVwYWludENvbnRhaW5lciwgcmVwYWludFJlY3QsIGZp
eGVkKTsKK30KIAotICAgIGZvciAoSW5saW5lRmxvd0JveCogY3VyciA9IGZpcnN0Qm94OyBjdXJy
OyBjdXJyID0gY3Vyci0+bmV4dExpbmVCb3goKSkgewotICAgICAgICBGbG9hdFJlY3QgcmVjdCh4
UmVmICsgY3Vyci0+eCgpLCB5UmVmICsgY3Vyci0+eSgpLCBjdXJyLT53aWR0aCgpLCBjdXJyLT5o
ZWlnaHQoKSk7Ci0gICAgICAgIHF1YWRzLmFwcGVuZChsb2NhbFRvQWJzb2x1dGVRdWFkKHJlY3Qp
KTsKLSAgICB9Cit2b2lkIFJlbmRlclNWR0lubGluZTo6bWFwTG9jYWxUb0NvbnRhaW5lcihSZW5k
ZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgYm9vbCB1c2VUcmFuc2Zvcm1zLCBi
b29sIGZpeGVkLCBUcmFuc2Zvcm1TdGF0ZSYgdHJhbnNmb3JtU3RhdGUpIGNvbnN0Cit7CisgICAg
U1ZHUmVuZGVyQmFzZTo6bWFwTG9jYWxUb0NvbnRhaW5lcih0aGlzLCByZXBhaW50Q29udGFpbmVy
LCB1c2VUcmFuc2Zvcm1zLCBmaXhlZCwgdHJhbnNmb3JtU3RhdGUpOwogfQogCiB9CkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTVkdJbmxpbmUuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJTVkdJbmxpbmUuaAkocmV2aXNpb24gNjEzODMpCisrKyBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJTVkdJbmxpbmUuaAkod29ya2luZyBjb3B5KQpAQCAtMzEsMjYgKzMx
LDI3IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgUmVuZGVyU1ZHSW5saW5lIDog
cHVibGljIFJlbmRlcklubGluZSwgcHJvdGVjdGVkIFNWR1JlbmRlckJhc2UgeworY2xhc3MgUmVu
ZGVyU1ZHSW5saW5lIDogcHVibGljIFJlbmRlcklubGluZQorICAgICAgICAgICAgICAgICAgICAg
ICwgcHJvdGVjdGVkIFNWR1JlbmRlckJhc2UgewogcHVibGljOgogICAgIFJlbmRlclNWR0lubGlu
ZShOb2RlKik7CiAKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHJlbmRlck5hbWUoKSBjb25zdCB7
IHJldHVybiAiUmVuZGVyU1ZHSW5saW5lIjsgfQogICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc0xh
eWVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAotICAgIC8vIFRoZXNlIGFyZSBzaGFyZWQg
YmV0d2VlbiBSZW5kZXJTVkdUU3BhbiBhbmQgUmVuZGVyU1ZHVGV4dFBhdGgKLSAgICB2aXJ0dWFs
IHZvaWQgYWJzb2x1dGVSZWN0cyhWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQgdHgsIGludCB0
eSk7Ci0gICAgdmlydHVhbCB2b2lkIGFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mKTsK
LQogICAgIC8vIENoYXB0ZXIgMTAuNCBvZiB0aGUgU1ZHIFNwZWNpZmljYXRpb24gc2F5IHRoYXQg
d2Ugc2hvdWxkIHVzZSB0aGUKICAgICAvLyBvYmplY3QgYm91bmRpbmcgYm94IG9mIHRoZSBwYXJl
bnQgdGV4dCBlbGVtZW50LgotICAgIC8vIFdlIHNlYXJjaCBmb3IgdGhlIHJvb3QgdGV4dCBlbGVt
ZW50IGFuZCB0YWtlIGl0J3MgYm91bmRpbmcgYm94LgorICAgIC8vIFdlIHNlYXJjaCBmb3IgdGhl
IHJvb3QgdGV4dCBlbGVtZW50IGFuZCB0YWtlIGl0cyBib3VuZGluZyBib3guCiAgICAgLy8gSXQg
aXMgYWxzbyBuZWNlc3NhcnkgdG8gdGFrZSB0aGUgc3Ryb2tlIGFuZCByZXBhaW50IHJlY3Qgb2YK
ICAgICAvLyB0aGlzIGVsZW1lbnQsIHNpbmNlIHdlIG5lZWQgaXQgZm9yIGZpbHRlcnMuCiAgICAg
dmlydHVhbCBGbG9hdFJlY3Qgb2JqZWN0Qm91bmRpbmdCb3goKSBjb25zdDsKICAgICB2aXJ0dWFs
IEZsb2F0UmVjdCBzdHJva2VCb3VuZGluZ0JveCgpIGNvbnN0OwogICAgIHZpcnR1YWwgRmxvYXRS
ZWN0IHJlcGFpbnRSZWN0SW5Mb2NhbENvb3JkaW5hdGVzKCkgY29uc3Q7Ci0gICAgCisKKyAgICB2
aXJ0dWFsIEludFJlY3QgY2xpcHBlZE92ZXJmbG93UmVjdEZvclJlcGFpbnQoUmVuZGVyQm94TW9k
ZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIpOworICAgIHZpcnR1YWwgdm9pZCBjb21wdXRlUmVj
dEZvclJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIEludFJl
Y3QmLCBib29sIGZpeGVkID0gZmFsc2UpOworICAgIHZpcnR1YWwgdm9pZCBtYXBMb2NhbFRvQ29u
dGFpbmVyKFJlbmRlckJveE1vZGVsT2JqZWN0KiByZXBhaW50Q29udGFpbmVyLCBib29sIHVzZVRy
YW5zZm9ybXMsIGJvb2wgZml4ZWQsIFRyYW5zZm9ybVN0YXRlJikgY29uc3Q7CisKIHByaXZhdGU6
CiAgICAgdmlydHVhbCBJbmxpbmVGbG93Qm94KiBjcmVhdGVJbmxpbmVGbG93Qm94KCk7CiB9OwpJ
bmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHSW5saW5lVGV4dC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHSW5saW5lVGV4dC5jcHAJKHJldmlzaW9u
IDYxMzgzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHSW5saW5lVGV4dC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTM4LDk5ICszOCwyMSBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
LXN0YXRpYyBpbmxpbmUgYm9vbCBpc0NoaWxkT2ZIaWRkZW5Db250YWluZXIoUmVuZGVyT2JqZWN0
KiBzdGFydCkKLXsKLSAgICB3aGlsZSAoc3RhcnQpIHsKLSAgICAgICAgaWYgKHN0YXJ0LT5pc1NW
R0hpZGRlbkNvbnRhaW5lcigpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAg
c3RhcnQgPSBzdGFydC0+cGFyZW50KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQot
CiBSZW5kZXJTVkdJbmxpbmVUZXh0OjpSZW5kZXJTVkdJbmxpbmVUZXh0KE5vZGUqIG4sIFBhc3NS
ZWZQdHI8U3RyaW5nSW1wbD4gc3RyKSAKICAgICA6IFJlbmRlclRleHQobiwgc3RyKQogewogfQog
Ci0KIHZvaWQgUmVuZGVyU1ZHSW5saW5lVGV4dDo6c3R5bGVEaWRDaGFuZ2UoU3R5bGVEaWZmZXJl
bmNlIGRpZmYsIGNvbnN0IFJlbmRlclN0eWxlKiBvbGRTdHlsZSkKIHsKLSAgICAvLyBTa2lwIFJl
bmRlclRleHQncyBwb3NzaWJsZSBsYXlvdXQgc2NoZWR1bGluZyBvbiBzdHlsZSBjaGFuZ2UKLSAg
ICBSZW5kZXJPYmplY3Q6OnN0eWxlRGlkQ2hhbmdlKGRpZmYsIG9sZFN0eWxlKTsKKyAgICBSZW5k
ZXJUZXh0OjpzdHlsZURpZENoYW5nZShkaWZmLCBvbGRTdHlsZSk7CiAgICAgCi0gICAgLy8gRklY
TUU6IFNWRyB0ZXh0IGlzIGFwcGFyZW50bHkgYWx3YXlzIHRyYW5zZm9ybWVkPworICAgIC8vIEZJ
WE1FOiBTaG91bGQgb3B0aW1pemUgdGhpcy4KKyAgICAvLyBTVkcgdGV4dCBpcyBhbHdheXMgdHJh
bnNmb3JtZWQuCiAgICAgaWYgKFJlZlB0cjxTdHJpbmdJbXBsPiB0ZXh0VG9UcmFuc2Zvcm0gPSBv
cmlnaW5hbFRleHQoKSkKICAgICAgICAgc2V0VGV4dCh0ZXh0VG9UcmFuc2Zvcm0ucmVsZWFzZSgp
LCB0cnVlKTsKIH0KIAotdm9pZCBSZW5kZXJTVkdJbmxpbmVUZXh0OjphYnNvbHV0ZVJlY3RzKFZl
Y3RvcjxJbnRSZWN0PiYgcmVjdHMsIGludCwgaW50KQotewotICAgIHJlY3RzLmFwcGVuZChjb21w
dXRlUmVwYWludFJlY3RGb3JSYW5nZSgwLCAwLCB0ZXh0TGVuZ3RoKCkpKTsKLX0KLQotdm9pZCBS
ZW5kZXJTVkdJbmxpbmVUZXh0OjphYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+JiBxdWFk
cykKLXsKLSAgICBxdWFkcy5hcHBlbmQoY29tcHV0ZVJlcGFpbnRRdWFkRm9yUmFuZ2UoMCwgMCwg
dGV4dExlbmd0aCgpKSk7Ci19Ci0KLUludFJlY3QgUmVuZGVyU1ZHSW5saW5lVGV4dDo6c2VsZWN0
aW9uUmVjdEZvclJlcGFpbnQoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIs
IGJvb2wgLypjbGlwVG9WaXNpYmxlQ29udGVudCovKQotewotICAgIEFTU0VSVCghbmVlZHNMYXlv
dXQoKSk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uU3RhdGUoKSA9PSBTZWxlY3Rpb25Ob25lKQotICAg
ICAgICByZXR1cm4gSW50UmVjdCgpOwotCi0gICAgLy8gRWFybHkgZXhpdCBpZiB3ZSdyZSBpZS4g
YSA8dGV4dD4gd2l0aGluIGEgPGRlZnM+IHNlY3Rpb24uCi0gICAgaWYgKGlzQ2hpbGRPZkhpZGRl
bkNvbnRhaW5lcih0aGlzKSkKLSAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKLQotICAgIC8vIE5v
dyBjYWxjdWxhdGUgc3RhcnRQb3MgYW5kIGVuZFBvcyBmb3IgcGFpbnRpbmcgc2VsZWN0aW9uLgot
ICAgIC8vIFdlIGluY2x1ZGUgYSBzZWxlY3Rpb24gd2hpbGUgZW5kUG9zID4gMAotICAgIGludCBz
dGFydFBvcywgZW5kUG9zOwotICAgIGlmIChzZWxlY3Rpb25TdGF0ZSgpID09IFNlbGVjdGlvbklu
c2lkZSkgewotICAgICAgICAvLyBXZSBhcmUgZnVsbHkgc2VsZWN0ZWQuCi0gICAgICAgIHN0YXJ0
UG9zID0gMDsKLSAgICAgICAgZW5kUG9zID0gdGV4dExlbmd0aCgpOwotICAgIH0gZWxzZSB7Ci0g
ICAgICAgIHNlbGVjdGlvblN0YXJ0RW5kKHN0YXJ0UG9zLCBlbmRQb3MpOwotICAgICAgICBpZiAo
c2VsZWN0aW9uU3RhdGUoKSA9PSBTZWxlY3Rpb25TdGFydCkKLSAgICAgICAgICAgIGVuZFBvcyA9
IHRleHRMZW5ndGgoKTsKLSAgICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uU3RhdGUoKSA9PSBTZWxl
Y3Rpb25FbmQpCi0gICAgICAgICAgICBzdGFydFBvcyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHN0
YXJ0UG9zID09IGVuZFBvcykKLSAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKLQotICAgIHJldHVy
biBjb21wdXRlUmVwYWludFJlY3RGb3JSYW5nZShyZXBhaW50Q29udGFpbmVyLCBzdGFydFBvcywg
ZW5kUG9zKTsKLX0KLQotSW50UmVjdCBSZW5kZXJTVkdJbmxpbmVUZXh0Ojpjb21wdXRlUmVwYWlu
dFJlY3RGb3JSYW5nZShSZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgaW50
IHN0YXJ0UG9zLCBpbnQgZW5kUG9zKQotewotICAgIEZsb2F0UXVhZCByZXBhaW50UXVhZCA9IGNv
bXB1dGVSZXBhaW50UXVhZEZvclJhbmdlKHJlcGFpbnRDb250YWluZXIsIHN0YXJ0UG9zLCBlbmRQ
b3MpOwotICAgIHJldHVybiBlbmNsb3NpbmdJbnRSZWN0KHJlcGFpbnRRdWFkLmJvdW5kaW5nQm94
KCkpOwotfQotCi1GbG9hdFF1YWQgUmVuZGVyU1ZHSW5saW5lVGV4dDo6Y29tcHV0ZVJlcGFpbnRR
dWFkRm9yUmFuZ2UoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBz
dGFydFBvcywgaW50IGVuZFBvcykKLXsKLSAgICBSZW5kZXJCbG9jayogY2IgPSBjb250YWluaW5n
QmxvY2soKTsKLSAgICBpZiAoIWNiIHx8ICFjYi0+Y29udGFpbmVyKCkpCi0gICAgICAgIHJldHVy
biBGbG9hdFF1YWQoKTsKLQotICAgIFJlbmRlclNWR1Jvb3QqIHJvb3QgPSBmaW5kU1ZHUm9vdE9i
amVjdChwYXJlbnQoKSk7Ci0gICAgaWYgKCFyb290KQotICAgICAgICByZXR1cm4gRmxvYXRRdWFk
KCk7Ci0KLSAgICBJbnRSZWN0IHJlY3Q7Ci0gICAgZm9yIChJbmxpbmVUZXh0Qm94KiBib3ggPSBm
aXJzdFRleHRCb3goKTsgYm94OyBib3ggPSBib3gtPm5leHRUZXh0Qm94KCkpCi0gICAgICAgIHJl
Y3QudW5pdGUoYm94LT5zZWxlY3Rpb25SZWN0KDAsIDAsIHN0YXJ0UG9zLCBlbmRQb3MpKTsKLQot
ICAgIHJldHVybiBsb2NhbFRvQ29udGFpbmVyUXVhZChGbG9hdFF1YWQocmVjdCksIHJlcGFpbnRD
b250YWluZXIpOwotfQotCiBJbmxpbmVUZXh0Qm94KiBSZW5kZXJTVkdJbmxpbmVUZXh0OjpjcmVh
dGVUZXh0Qm94KCkKIHsKICAgICBJbmxpbmVUZXh0Qm94KiBib3ggPSBuZXcgKHJlbmRlckFyZW5h
KCkpIFNWR0lubGluZVRleHRCb3godGhpcyk7CkBAIC0xNDAsNTcgKzYyLDkgQEAgSW5saW5lVGV4
dEJveCogUmVuZGVyU1ZHSW5saW5lVGV4dDo6Y3JlYQogCiBJbnRSZWN0IFJlbmRlclNWR0lubGlu
ZVRleHQ6OmxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCwgaW50KikKIHsKLSAgICAvLyBT
VkcgZG9lc24ndCBoYXZlIGFueSBlZGl0YWJsZSBjb250ZW50IHdoZXJlIGEgY2FyZXQgcmVjdCB3
b3VsZCBiZSBuZWVkZWQuCi0gICAgLy8gRklYTUU6IFRoYXQncyBub3Qgc3VmZmljaWVudC4gVGhl
IGxvY2FsQ2FyZXRSZWN0IGZ1bmN0aW9uIGlzIGFsc28gdXNlZCBmb3Igc2VsZWN0aW9uLgogICAg
IHJldHVybiBJbnRSZWN0KCk7CiB9CiAKLVZpc2libGVQb3NpdGlvbiBSZW5kZXJTVkdJbmxpbmVU
ZXh0Ojpwb3NpdGlvbkZvclBvaW50KGNvbnN0IEludFBvaW50JiBwb2ludCkKLXsKLSAgICBTVkdJ
bmxpbmVUZXh0Qm94KiB0ZXh0Qm94ID0gc3RhdGljX2Nhc3Q8U1ZHSW5saW5lVGV4dEJveCo+KGZp
cnN0VGV4dEJveCgpKTsKLQotICAgIGlmICghdGV4dEJveCB8fCB0ZXh0TGVuZ3RoKCkgPT0gMCkK
LSAgICAgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQb3NpdGlvbigwLCBET1dOU1RSRUFNKTsKLQot
ICAgIFNWR1Jvb3RJbmxpbmVCb3gqIHJvb3RCb3ggPSB0ZXh0Qm94LT5zdmdSb290SW5saW5lQm94
KCk7Ci0gICAgUmVuZGVyQmxvY2sqIG9iamVjdCA9IHJvb3RCb3ggPyByb290Qm94LT5ibG9jaygp
IDogMDsKLQotICAgIGlmICghb2JqZWN0KQotICAgICAgICByZXR1cm4gY3JlYXRlVmlzaWJsZVBv
c2l0aW9uKDAsIERPV05TVFJFQU0pOwotCi0gICAgaW50IGNsb3Nlc3RPZmZzZXRJbkJveCA9IDA7
Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBhcHByb2FjaCBpcyB3cm9uZy4gIFRoZSBjb3JyZWN0IGNv
ZGUgd291bGQgZmlyc3QgZmluZCB0aGUKLSAgICAvLyBjbG9zZXN0IFNWR0lubGluZVRleHRCb3gg
dG8gdGhlIHBvaW50LCBhbmQgKnRoZW4qIGFzayBvbmx5IHRoYXQgaW5saW5lIGJveAotICAgIC8v
IHdoYXQgdGhlIGNsb3Nlc3QgdGV4dCBvZmZzZXQgdG8gdGhhdCBwb2ludCBpcy4gIFRoaXMgY29k
ZSBpbnN0ZWFkIHdhbGtzCi0gICAgLy8gdGhyb3VnaCBhbGwgYm94ZXMgaW4gb3JkZXIsIHNvIHdo
ZW4geW91IGNsaWNrICJuZWFyIiBhIGJveCwgeW91J2xsIGFjdHVhbGx5Ci0gICAgLy8gZW5kIHVw
IHJldHVybmluZyB0aGUgbmVhcmVzdCBvZmZzZXQgaW4gdGhlIGxhc3QgYm94LCBldmVuIGlmIHRo
ZQotICAgIC8vIG5lYXJlc3Qgb2Zmc2V0IHRvIHlvdXIgY2xpY2sgaXMgY29udGFpbmVkIGluIGFu
b3RoZXIgYm94LgotICAgIGZvciAoU1ZHSW5saW5lVGV4dEJveCogYm94ID0gdGV4dEJveDsgYm94
OyBib3ggPSBzdGF0aWNfY2FzdDxTVkdJbmxpbmVUZXh0Qm94Kj4oYm94LT5uZXh0VGV4dEJveCgp
KSkgewotICAgICAgICBpZiAoYm94LT5zdmdDaGFyYWN0ZXJIaXRzUG9zaXRpb24ocG9pbnQueCgp
ICsgb2JqZWN0LT54KCksIHBvaW50LnkoKSArIG9iamVjdC0+eSgpLCBjbG9zZXN0T2Zmc2V0SW5C
b3gpKSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgYXQgdGhlIGVuZC9zdGFydCBvZiB0
aGUgYm94LCBzdG9wIGxvb2tpbmcgZm9yIG90aGVyIHNlbGVjdGVkIGJveGVzLgotICAgICAgICAg
ICAgaWYgKGJveC0+ZGlyZWN0aW9uKCkgPT0gTFRSKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNs
b3Nlc3RPZmZzZXRJbkJveCA8PSAoaW50KSBib3gtPmVuZCgpICsgMSkKLSAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChj
bG9zZXN0T2Zmc2V0SW5Cb3ggPiAoaW50KSBib3gtPnN0YXJ0KCkpCi0gICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJu
IGNyZWF0ZVZpc2libGVQb3NpdGlvbihjbG9zZXN0T2Zmc2V0SW5Cb3gsIERPV05TVFJFQU0pOwot
fQotCi12b2lkIFJlbmRlclNWR0lubGluZVRleHQ6OmRlc3Ryb3koKQotewotICAgIGlmICghZG9j
dW1lbnRCZWluZ0Rlc3Ryb3llZCgpKSB7Ci0gICAgICAgIHNldE5lZWRzTGF5b3V0QW5kUHJlZldp
ZHRoc1JlY2FsYygpOwotICAgICAgICByZXBhaW50KCk7Ci0gICAgfQotICAgIFJlbmRlclRleHQ6
OmRlc3Ryb3koKTsKLX0KLQogfQogCiAjZW5kaWYgLy8gRU5BQkxFKFNWRykKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlclNWR0lubGluZVRleHQuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJTVkdJbmxpbmVUZXh0LmgJKHJldmlzaW9uIDYxMzgzKQorKysgV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHSW5saW5lVGV4dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0z
NiwyOCArMzYsMTkgQEAgcHVibGljOgogCiBwcml2YXRlOgogICAgIHZpcnR1YWwgY29uc3QgY2hh
ciogcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJTVkdJbmxpbmVUZXh0IjsgfQot
ICAgICAgICAKKwogICAgIHZpcnR1YWwgdm9pZCBzdHlsZURpZENoYW5nZShTdHlsZURpZmZlcmVu
Y2UsIGNvbnN0IFJlbmRlclN0eWxlKik7CiAKICAgICAvLyBGSVhNRTogV2UgbmVlZCBvYmplY3RC
b3VuZGluZ0JveCBmb3IgRFJUIHJlc3VsdHMgYW5kIGZpbHRlcnMgYXQgdGhlIG1vbWVudC4KICAg
ICAvLyBUaGlzIHNob3VsZCBiZSBmaXhlZCB0byBnaXZlIGJhY2sgdGhlIG9iamVjdEJvdW5kaW5n
Qm94IG9mIHRoZSB0ZXh0IHJvb3QuCiAgICAgdmlydHVhbCBGbG9hdFJlY3Qgb2JqZWN0Qm91bmRp
bmdCb3goKSBjb25zdCB7IHJldHVybiBGbG9hdFJlY3QoKTsgfQogCi0gICAgdmlydHVhbCB2b2lk
IGFic29sdXRlUmVjdHMoVmVjdG9yPEludFJlY3Q+JiByZWN0cywgaW50IHR4LCBpbnQgdHkpOwot
ICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVF1YWRzKFZlY3RvcjxGbG9hdFF1YWQ+Jik7Ci0KICAg
ICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNMYXllcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0g
ICAgdmlydHVhbCBJbnRSZWN0IHNlbGVjdGlvblJlY3RGb3JSZXBhaW50KFJlbmRlckJveE1vZGVs
T2JqZWN0KiByZXBhaW50Q29udGFpbmVyLCBib29sIGNsaXBUb1Zpc2libGVDb250ZW50ID0gdHJ1
ZSk7CiAgICAgdmlydHVhbCBib29sIGlzU1ZHVGV4dCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0K
IAogICAgIHZpcnR1YWwgSW50UmVjdCBsb2NhbENhcmV0UmVjdChJbmxpbmVCb3gqLCBpbnQgY2Fy
ZXRPZmZzZXQsIGludCogZXh0cmFXaWR0aFRvRW5kT2ZMaW5lID0gMCk7Ci0gICAgdmlydHVhbCBW
aXNpYmxlUG9zaXRpb24gcG9zaXRpb25Gb3JQb2ludChjb25zdCBJbnRQb2ludCYpOwotCi0gICAg
dmlydHVhbCB2b2lkIGRlc3Ryb3koKTsKIAogICAgIHZpcnR1YWwgSW5saW5lVGV4dEJveCogY3Jl
YXRlVGV4dEJveCgpOwotICAgIEludFJlY3QgY29tcHV0ZVJlcGFpbnRSZWN0Rm9yUmFuZ2UoUmVu
ZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIsIGludCBzdGFydFBvcywgaW50IGVu
ZFBvcyk7Ci0gICAgRmxvYXRRdWFkIGNvbXB1dGVSZXBhaW50UXVhZEZvclJhbmdlKFJlbmRlckJv
eE1vZGVsT2JqZWN0KiByZXBhaW50Q29udGFpbmVyLCBpbnQgc3RhcnRQb3MsIGludCBlbmRQb3Mp
OwogfTsKIAogfQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHVGV4dC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHVGV4dC5jcHAJKHJldmlzaW9u
IDYxMzgzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHVGV4dC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlICJTVkdUcmFuc2Zvcm1MaXN0LmgiCiAj
aW5jbHVkZSAiU1ZHVVJJUmVmZXJlbmNlLmgiCiAjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIK
KyNpbmNsdWRlICJUcmFuc2Zvcm1TdGF0ZS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAg
LTYzLDggKzY0LDkgQEAgdm9pZCBSZW5kZXJTVkdUZXh0Ojpjb21wdXRlUmVjdEZvclJlcGFpbgog
ICAgIFNWR1JlbmRlckJhc2U6OmNvbXB1dGVSZWN0Rm9yUmVwYWludCh0aGlzLCByZXBhaW50Q29u
dGFpbmVyLCByZXBhaW50UmVjdCwgZml4ZWQpOwogfQogCi12b2lkIFJlbmRlclNWR1RleHQ6Om1h
cExvY2FsVG9Db250YWluZXIoUmVuZGVyQm94TW9kZWxPYmplY3QqIHJlcGFpbnRDb250YWluZXIs
IGJvb2wgZml4ZWQgLCBib29sIHVzZVRyYW5zZm9ybXMsIFRyYW5zZm9ybVN0YXRlJiB0cmFuc2Zv
cm1TdGF0ZSkgY29uc3QKK3ZvaWQgUmVuZGVyU1ZHVGV4dDo6bWFwTG9jYWxUb0NvbnRhaW5lcihS
ZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgYm9vbCBmaXhlZCwgYm9vbCB1
c2VUcmFuc2Zvcm1zLCBUcmFuc2Zvcm1TdGF0ZSYgdHJhbnNmb3JtU3RhdGUpIGNvbnN0CiB7Cisg
ICAgdHJhbnNmb3JtU3RhdGUubW92ZSh4KCksIHkoKSk7CiAgICAgU1ZHUmVuZGVyQmFzZTo6bWFw
TG9jYWxUb0NvbnRhaW5lcih0aGlzLCByZXBhaW50Q29udGFpbmVyLCBmaXhlZCwgdXNlVHJhbnNm
b3JtcywgdHJhbnNmb3JtU3RhdGUpOwogfQogCkBAIC03MywxOCArNzUsMjggQEAgdm9pZCBSZW5k
ZXJTVkdUZXh0OjpsYXlvdXQoKQogICAgIEFTU0VSVChuZWVkc0xheW91dCgpKTsKICAgICBMYXlv
dXRSZXBhaW50ZXIgcmVwYWludGVyKCp0aGlzLCBjaGVja0ZvclJlcGFpbnREdXJpbmdMYXlvdXQo
KSk7CiAKLSAgICAvLyBCZXN0IGd1ZXNzIGZvciBhIHJlbGF0aXZlIHN0YXJ0aW5nIHBvaW50Ci0g
ICAgU1ZHVGV4dEVsZW1lbnQqIHRleHQgPSBzdGF0aWNfY2FzdDxTVkdUZXh0RWxlbWVudCo+KG5v
ZGUoKSk7Ci0gICAgaW50IHhPZmZzZXQgPSAoaW50KSh0ZXh0LT54KCktPmdldEZpcnN0KCkudmFs
dWUodGV4dCkpOwotICAgIGludCB5T2Zmc2V0ID0gKGludCkodGV4dC0+eSgpLT5nZXRGaXJzdCgp
LnZhbHVlKHRleHQpKTsKLSAgICBzZXRMb2NhdGlvbih4T2Zmc2V0LCB5T2Zmc2V0KTsKLQogICAg
IGlmIChtX25lZWRzVHJhbnNmb3JtVXBkYXRlKSB7CisgICAgICAgIFNWR1RleHRFbGVtZW50KiB0
ZXh0ID0gc3RhdGljX2Nhc3Q8U1ZHVGV4dEVsZW1lbnQqPihub2RlKCkpOwogICAgICAgICBtX2xv
Y2FsVHJhbnNmb3JtID0gdGV4dC0+YW5pbWF0ZWRMb2NhbFRyYW5zZm9ybSgpOwogICAgICAgICBt
X25lZWRzVHJhbnNmb3JtVXBkYXRlID0gZmFsc2U7CiAgICAgfQogCi0gICAgUmVuZGVyQmxvY2s6
OmxheW91dCgpOworICAgIC8vIFJlZHVjZWQgdmVyc2lvbiBvZiBSZW5kZXJCbG9jazo6bGF5b3V0
QmxvY2soKSwgd2hpY2ggb25seSB0YWtlcyBjYXJlIG9mIFNWRyB0ZXh0LgorICAgIC8vIEFsbCBp
ZiBicmFuY2hlcyB0aGF0IGNvdWxkIGNhdXNlIGVhcmx5IGV4aXQgaW4gUmVuZGVyQmxvY2tzIGxh
eW91dEJsb2NrKCkgbWV0aG9kIGFyZSB0dXJuZWQgaW50byBhc3NlcnRpb25zLgorICAgIEFTU0VS
VCghaXNJbmxpbmUoKSk7CisgICAgQVNTRVJUKCFsYXlvdXRPbmx5UG9zaXRpb25lZE9iamVjdHMo
KSk7CisgICAgQVNTRVJUKCFzY3JvbGxzT3ZlcmZsb3coKSk7CisgICAgQVNTRVJUKCFoYXNDb250
cm9sQ2xpcCgpKTsKKyAgICBBU1NFUlQoIWhhc0NvbHVtbnMoKSk7CisgICAgQVNTRVJUKCFwb3Np
dGlvbmVkT2JqZWN0cygpKTsKKyAgICBBU1NFUlQoIW1fb3ZlcmZsb3cpOworICAgIEFTU0VSVCgh
aXNBbm9ueW1vdXNCbG9jaygpKTsKKworICAgIGlmICghZmlyc3RDaGlsZCgpKQorICAgICAgICBz
ZXRDaGlsZHJlbklubGluZSh0cnVlKTsKKworICAgIEFTU0VSVChjaGlsZHJlbklubGluZSgpKTsK
KyAgICBmb3JjZUxheW91dElubGluZUNoaWxkcmVuKCk7CiAKICAgICByZXBhaW50ZXIucmVwYWlu
dEFmdGVyTGF5b3V0KCk7CiAgICAgc2V0TmVlZHNMYXlvdXQoZmFsc2UpOwpAQCAtMTMwLDEwICsx
NDIsNiBAQCBib29sIFJlbmRlclNWR1RleHQ6Om5vZGVBdFBvaW50KGNvbnN0IEhpCiAKIHZvaWQg
UmVuZGVyU1ZHVGV4dDo6YWJzb2x1dGVSZWN0cyhWZWN0b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQs
IGludCkKIHsKLSAgICBSZW5kZXJTVkdSb290KiByb290ID0gZmluZFNWR1Jvb3RPYmplY3QocGFy
ZW50KCkpOwotICAgIGlmICghcm9vdCkKLSAgICAgICAgcmV0dXJuOwotIAogICAgIC8vIERvbid0
IHVzZSBvYmplY3RCb3VuZGluZ0JveCBoZXJlLCBhcyBpdCdzIHVuaXRlcyB0aGUgc2VsZWN0aW9u
IHJlY3RzLiBNYWtlcyBpdCBoYXJkCiAgICAgLy8gdG8gc3BvdCBlcnJvcnMsIGlmIHRoZXJlIGFy
ZSBhbnkgdXNpbmcgV2ViSW5zcGVjdG9yLiBJbmRpdmlkdWFsbHkgZmVlZCB0aGVtIGludG8gJ3Jl
Y3RzJy4KICAgICBmb3IgKElubGluZUZsb3dCb3gqIGZsb3cgPSBmaXJzdExpbmVCb3goKTsgZmxv
dzsgZmxvdyA9IGZsb3ctPm5leHRMaW5lQm94KCkpIHsKQEAgLTE0OCwxMCArMTU2LDYgQEAgdm9p
ZCBSZW5kZXJTVkdUZXh0OjphYnNvbHV0ZVJlY3RzKFZlY3RvcgogCiB2b2lkIFJlbmRlclNWR1Rl
eHQ6OmFic29sdXRlUXVhZHMoVmVjdG9yPEZsb2F0UXVhZD4mIHF1YWRzKQogewotICAgIFJlbmRl
clNWR1Jvb3QqIHJvb3QgPSBmaW5kU1ZHUm9vdE9iamVjdChwYXJlbnQoKSk7Ci0gICAgaWYgKCFy
b290KQotICAgICAgICByZXR1cm47Ci0gCiAgICAgLy8gRG9uJ3QgdXNlIG9iamVjdEJvdW5kaW5n
Qm94IGhlcmUsIGFzIGl0J3MgdW5pdGVzIHRoZSBzZWxlY3Rpb24gcmVjdHMuIE1ha2VzIGl0IGhh
cmQKICAgICAvLyB0byBzcG90IGVycm9ycywgaWYgdGhlcmUgYXJlIGFueSB1c2luZyBXZWJJbnNw
ZWN0b3IuIEluZGl2aWR1YWxseSBmZWVkIHRoZW0gaW50byAncmVjdHMnLgogICAgIGZvciAoSW5s
aW5lRmxvd0JveCogZmxvdyA9IGZpcnN0TGluZUJveCgpOyBmbG93OyBmbG93ID0gZmxvdy0+bmV4
dExpbmVCb3goKSkgewpAQCAtMTY2LDUxICsxNzAsMjQgQEAgdm9pZCBSZW5kZXJTVkdUZXh0Ojph
YnNvbHV0ZVF1YWRzKFZlY3RvcgogCiB2b2lkIFJlbmRlclNWR1RleHQ6OnBhaW50KFBhaW50SW5m
byYgcGFpbnRJbmZvLCBpbnQsIGludCkKIHsKLSAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlz
YWJsZWQoKSB8fCAocGFpbnRJbmZvLnBoYXNlICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kICYmIHBh
aW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUpKQogICAgICAgICByZXR1cm47
CiAKLSAgICBQYWludEluZm8gcGkocGFpbnRJbmZvKTsKLSAgICBwaS5jb250ZXh0LT5zYXZlKCk7
Ci0gICAgYXBwbHlUcmFuc2Zvcm1Ub1BhaW50SW5mbyhwaSwgbG9jYWxUb1BhcmVudFRyYW5zZm9y
bSgpKTsKLSAgICBSZW5kZXJCbG9jazo6cGFpbnQocGksIDAsIDApOwotICAgIHBpLmNvbnRleHQt
PnJlc3RvcmUoKTsKLX0KLQotRmxvYXRSZWN0IFJlbmRlclNWR1RleHQ6Om9iamVjdEJvdW5kaW5n
Qm94KCkgY29uc3QKLXsKLSAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7Ci0KLSAgICBmb3IgKElu
bGluZUZsb3dCb3gqIGZsb3cgPSBmaXJzdExpbmVCb3goKTsgZmxvdzsgZmxvdyA9IGZsb3ctPm5l
eHRMaW5lQm94KCkpIHsKLSAgICAgICAgZm9yIChJbmxpbmVCb3gqIGJveCA9IGZsb3ctPmZpcnN0
Q2hpbGQoKTsgYm94OyBib3ggPSBib3gtPm5leHRPbkxpbmUoKSkKLSAgICAgICAgICAgIGJvdW5k
aW5nQm94LnVuaXRlKEZsb2F0UmVjdChib3gtPngoKSwgYm94LT55KCksIGJveC0+d2lkdGgoKSwg
Ym94LT5oZWlnaHQoKSkpOwotICAgIH0KLQotICAgIGJvdW5kaW5nQm94Lm1vdmUoeCgpLCB5KCkp
OwotICAgIHJldHVybiBib3VuZGluZ0JveDsKKyAgICBQYWludEluZm8gYmxvY2tJbmZvKHBhaW50
SW5mbyk7CisgICAgYmxvY2tJbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBhcHBseVRyYW5zZm9y
bVRvUGFpbnRJbmZvKGJsb2NrSW5mbywgbG9jYWxUb1BhcmVudFRyYW5zZm9ybSgpKTsKKyAgICBS
ZW5kZXJCbG9jazo6cGFpbnQoYmxvY2tJbmZvLCAwLCAwKTsKKyAgICBibG9ja0luZm8uY29udGV4
dC0+cmVzdG9yZSgpOwogfQogCiBGbG9hdFJlY3QgUmVuZGVyU1ZHVGV4dDo6c3Ryb2tlQm91bmRp
bmdCb3goKSBjb25zdAogewotICAgIEZsb2F0UmVjdCBzdHJva2VSZWN0ID0gb2JqZWN0Qm91bmRp
bmdCb3goKTsKKyAgICBGbG9hdFJlY3Qgc3Ryb2tlQm91bmRhcmllcyA9IG9iamVjdEJvdW5kaW5n
Qm94KCk7CisgICAgaWYgKCFzdHlsZSgpLT5zdmdTdHlsZSgpLT5oYXNTdHJva2UoKSkKKyAgICAg
ICAgcmV0dXJuIHN0cm9rZUJvdW5kYXJpZXM7CiAKLSAgICAvLyBTVkcgbmVlZHMgdG8gaW5jbHVk
ZSB0aGUgc3Ryb2tlV2lkdGgoKSwgbm90IHRoZSB0ZXh0U3Ryb2tlV2lkdGgoKS4KLSAgICBpZiAo
c3R5bGUoKS0+c3ZnU3R5bGUoKS0+aGFzU3Ryb2tlKCkpIHsKLSAgICAgICAgZmxvYXQgc3Ryb2tl
V2lkdGggPSBTVkdSZW5kZXJTdHlsZTo6Y3NzUHJpbWl0aXZlVG9MZW5ndGgodGhpcywgc3R5bGUo
KS0+c3ZnU3R5bGUoKS0+c3Ryb2tlV2lkdGgoKSwgMS4wZik7Ci0KLSNpZiBFTkFCTEUoU1ZHX0ZP
TlRTKQotICAgICAgICBjb25zdCBGb250JiBmb250ID0gc3R5bGUoKS0+Zm9udCgpOwotICAgICAg
ICBpZiAoZm9udC5wcmltYXJ5Rm9udCgpLT5pc1NWR0ZvbnQoKSkgewotICAgICAgICAgICAgZmxv
YXQgc2NhbGUgPSBmb250LnVuaXRzUGVyRW0oKSA+IDAgPyBmb250LnNpemUoKSAvIGZvbnQudW5p
dHNQZXJFbSgpIDogMC4wZjsKLQotICAgICAgICAgICAgaWYgKHNjYWxlICE9IDAuMGYpCi0gICAg
ICAgICAgICAgICAgc3Ryb2tlV2lkdGggLz0gc2NhbGU7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0g
ICAgICAgIHN0cm9rZVJlY3QuaW5mbGF0ZShzdHJva2VXaWR0aCk7Ci0gICAgfQotCi0gICAgcmV0
dXJuIHN0cm9rZVJlY3Q7CisgICAgc3Ryb2tlQm91bmRhcmllcy5pbmZsYXRlKFNWR1JlbmRlclN0
eWxlOjpjc3NQcmltaXRpdmVUb0xlbmd0aCh0aGlzLCBzdHlsZSgpLT5zdmdTdHlsZSgpLT5zdHJv
a2VXaWR0aCgpLCAxLjBmKSk7CisgICAgcmV0dXJuIHN0cm9rZUJvdW5kYXJpZXM7CiB9CiAKIEZs
b2F0UmVjdCBSZW5kZXJTVkdUZXh0OjpyZXBhaW50UmVjdEluTG9jYWxDb29yZGluYXRlcygpIGNv
bnN0CkBAIC0yMzcsNSArMjE0LDMgQEAgdm9pZCBSZW5kZXJTVkdUZXh0Ojp1cGRhdGVGaXJzdExl
dHRlcigpCiB9CiAKICNlbmRpZiAvLyBFTkFCTEUoU1ZHKQotCi0vLyB2aW06dHM9NDpub2V0Cklu
ZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTVkdUZXh0LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHVGV4dC5oCShyZXZpc2lvbiA2MTM4MykKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlclNWR1RleHQuaAkod29ya2luZyBjb3B5KQpAQCAtNjMsMTIgKzYz
LDExIEBAIHByaXZhdGU6CiAKICAgICB2aXJ0dWFsIHZvaWQgbWFwTG9jYWxUb0NvbnRhaW5lcihS
ZW5kZXJCb3hNb2RlbE9iamVjdCogcmVwYWludENvbnRhaW5lciwgYm9vbCB1c2VUcmFuc2Zvcm1z
LCBib29sIGZpeGVkLCBUcmFuc2Zvcm1TdGF0ZSYpIGNvbnN0OwogCi0gICAgdmlydHVhbCBGbG9h
dFJlY3Qgb2JqZWN0Qm91bmRpbmdCb3goKSBjb25zdDsKKyAgICB2aXJ0dWFsIEZsb2F0UmVjdCBv
YmplY3RCb3VuZGluZ0JveCgpIGNvbnN0IHsgcmV0dXJuIGZyYW1lUmVjdCgpOyB9CiAgICAgdmly
dHVhbCBGbG9hdFJlY3Qgc3Ryb2tlQm91bmRpbmdCb3goKSBjb25zdDsKICAgICB2aXJ0dWFsIEZs
b2F0UmVjdCByZXBhaW50UmVjdEluTG9jYWxDb29yZGluYXRlcygpIGNvbnN0OwogCiAgICAgdmly
dHVhbCBBZmZpbmVUcmFuc2Zvcm0gbG9jYWxUcmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX2xv
Y2FsVHJhbnNmb3JtOyB9Ci0KICAgICB2aXJ0dWFsIFJvb3RJbmxpbmVCb3gqIGNyZWF0ZVJvb3RJ
bmxpbmVCb3goKTsKIAogICAgIHZpcnR1YWwgUmVuZGVyQmxvY2sqIGZpcnN0TGluZUJsb2NrKCkg
Y29uc3Q7CkBAIC04Miw1ICs4MSwzIEBAIHByaXZhdGU6CiAKICNlbmRpZiAvLyBFTkFCTEUoU1ZH
KQogI2VuZGlmCi0KLS8vIHZpbTp0cz00Om5vZXQKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jv
b3RJbmxpbmVCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxp
bmVCb3guY3BwCShyZXZpc2lvbiA2MTM4MykKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxp
bmVCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMDQsNiArMjA0LDEyIEBAIHZvaWQgUm9vdElu
bGluZUJveDo6Y2hpbGRSZW1vdmVkKElubGluZUIKIAogaW50IFJvb3RJbmxpbmVCb3g6OnZlcnRp
Y2FsbHlBbGlnbkJveGVzKGludCBoZWlnaHRPZkJsb2NrLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJh
Y2tGb250c01hcCYgdGV4dEJveERhdGFNYXApCiB7CisjaWYgRU5BQkxFKFNWRykKKyAgICAvLyBT
Vkcgd2lsbCBoYW5kbGUgdmVydGljYWwgYWxpZ25tZW50IG9uIGl0cyBvd24uCisgICAgaWYgKGlz
U1ZHUm9vdElubGluZUJveCgpKQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorCiAgICAgaW50
IG1heFBvc2l0aW9uVG9wID0gMDsKICAgICBpbnQgbWF4UG9zaXRpb25Cb3R0b20gPSAwOwogICAg
IGludCBtYXhBc2NlbnQgPSAwOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUm9vdElubGluZUJv
eC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guaAkocmV2
aXNpb24gNjEzODMpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9Sb290SW5saW5lQm94LmgJKHdvcmtp
bmcgY29weSkKQEAgLTYxLDE1ICs2MSwxMSBAQCBwdWJsaWM6CiAgICAgaW50IHNlbGVjdGlvbkJv
dHRvbSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVCb3R0b20oKTsgfQogICAgIGludCBzZWxlY3Rpb25I
ZWlnaHQoKSBjb25zdCB7IHJldHVybiBtYXgoMCwgc2VsZWN0aW9uQm90dG9tKCkgLSBzZWxlY3Rp
b25Ub3AoKSk7IH0KIAotICAgIHZpcnR1YWwgaW50IHZlcnRpY2FsbHlBbGlnbkJveGVzKGludCBo
ZWlnaHRPZkJsb2NrLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYpOworICAgIGlu
dCB2ZXJ0aWNhbGx5QWxpZ25Cb3hlcyhpbnQgaGVpZ2h0T2ZCbG9jaywgR2x5cGhPdmVyZmxvd0Fu
ZEZhbGxiYWNrRm9udHNNYXAmKTsKICAgICB2b2lkIHNldExpbmVUb3BCb3R0b21Qb3NpdGlvbnMo
aW50IHRvcCwgaW50IGJvdHRvbSk7CiAKICAgICB2aXJ0dWFsIFJlbmRlckxpbmVCb3hMaXN0KiBy
ZW5kZXJlckxpbmVCb3hlcygpIGNvbnN0OwogCi0jaWYgRU5BQkxFKFNWRykKLSAgICB2aXJ0dWFs
IHZvaWQgY29tcHV0ZVBlckNoYXJhY3RlckxheW91dEluZm9ybWF0aW9uKCkgeyB9Ci0jZW5kaWYK
LQogICAgIFJlbmRlck9iamVjdCogbGluZUJyZWFrT2JqKCkgY29uc3QgeyByZXR1cm4gbV9saW5l
QnJlYWtPYmo7IH0KICAgICBCaWRpU3RhdHVzIGxpbmVCcmVha0JpZGlTdGF0dXMoKSBjb25zdDsK
ICAgICB2b2lkIHNldExpbmVCcmVha0luZm8oUmVuZGVyT2JqZWN0KiwgdW5zaWduZWQgYnJlYWtQ
b3MsIGNvbnN0IEJpZGlTdGF0dXMmKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1NWR0NoYXJh
Y3RlckRhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9TVkdDaGFyYWN0ZXJE
YXRhLmgJKHJldmlzaW9uIDYxMzgzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvU1ZHQ2hhcmFjdGVy
RGF0YS5oCSh3b3JraW5nIGNvcHkpCkBAIC05MCwxMiArOTAsNiBAQCBzdHJ1Y3QgU1ZHQ2hhciB7
CiAgICAgQWZmaW5lVHJhbnNmb3JtIGNoYXJhY3RlclRyYW5zZm9ybSgpIGNvbnN0OwogfTsKIAot
c3RydWN0IFNWR1RleHREZWNvcmF0aW9uSW5mbyB7Ci0gICAgLy8gRVRleHREZWNvcmF0aW9uIGlz
IG1lYW50IHRvIGJlIHVzZWQgaGVyZQotICAgIEhhc2hNYXA8aW50LCBSZW5kZXJPYmplY3QqPiBm
aWxsU2VydmVyTWFwOwotICAgIEhhc2hNYXA8aW50LCBSZW5kZXJPYmplY3QqPiBzdHJva2VTZXJ2
ZXJNYXA7Ci19OwotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBFTkFCTEUo
U1ZHKQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvU1ZHQ2hhcmFjdGVyTGF5b3V0SW5mby5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvU1ZHQ2hhcmFjdGVyTGF5b3V0SW5mby5j
cHAJKHJldmlzaW9uIDYxMzgzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvU1ZHQ2hhcmFjdGVyTGF5
b3V0SW5mby5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY3LDcgKzY3LDcgQEAgc3RhdGljIGZsb2F0
IGNhbGN1bGF0ZUJhc2VsaW5lU2hpZnQoUmVuZAogICAgIHJldHVybiBiYXNlbGluZVNoaWZ0Owog
fQogCi1TVkdDaGFyYWN0ZXJMYXlvdXRJbmZvOjpTVkdDaGFyYWN0ZXJMYXlvdXRJbmZvKFZlY3Rv
cjxTVkdDaGFyPiYgY2hhcnMpCitTVkdDaGFyYWN0ZXJMYXlvdXRJbmZvOjpTVkdDaGFyYWN0ZXJM
YXlvdXRJbmZvKCkKICAgICA6IGN1cngoMC4wZikKICAgICAsIGN1cnkoMC4wZikKICAgICAsIGFu
Z2xlKDAuMGYpCkBAIC03OCw3ICs3OCw2IEBAIFNWR0NoYXJhY3RlckxheW91dEluZm86OlNWR0No
YXJhY3RlckxheW8KICAgICAsIHBhdGhFeHRyYUFkdmFuY2UoMC4wZikKICAgICAsIHBhdGhUZXh0
TGVuZ3RoKDAuMGYpCiAgICAgLCBwYXRoQ2h1bmtMZW5ndGgoMC4wZikKLSAgICAsIHN2Z0NoYXJz
KGNoYXJzKQogICAgICwgbmV4dERyYXduU2VwZXJhdGVkKGZhbHNlKQogICAgICwgeFN0YWNrQ2hh
bmdlZChmYWxzZSkKICAgICAsIHlTdGFja0NoYW5nZWQoZmFsc2UpCkluZGV4OiBXZWJDb3JlL3Jl
bmRlcmluZy9TVkdDaGFyYWN0ZXJMYXlvdXRJbmZvLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9y
ZW5kZXJpbmcvU1ZHQ2hhcmFjdGVyTGF5b3V0SW5mby5oCShyZXZpc2lvbiA2MTM4MykKKysrIFdl
YkNvcmUvcmVuZGVyaW5nL1NWR0NoYXJhY3RlckxheW91dEluZm8uaAkod29ya2luZyBjb3B5KQpA
QCAtNjcsNyArNjcsNyBAQCBjbGFzcyBQb3NpdGlvbmVkRmxvYXRWZWN0b3IgOiBwdWJsaWMgUG9z
CiBzdHJ1Y3QgU1ZHQ2hhcjsKIAogc3RydWN0IFNWR0NoYXJhY3RlckxheW91dEluZm8gewotICAg
IFNWR0NoYXJhY3RlckxheW91dEluZm8oVmVjdG9yPFNWR0NoYXI+Jik7CisgICAgU1ZHQ2hhcmFj
dGVyTGF5b3V0SW5mbygpOwogCiAgICAgZW51bSBTdGFja1R5cGUgeyBYU3RhY2ssIFlTdGFjaywg
RHhTdGFjaywgRHlTdGFjaywgQW5nbGVTdGFjaywgQmFzZWxpbmVTaGlmdFN0YWNrIH07CiAKQEAg
LTEyMCw3ICsxMjAsNyBAQCBzdHJ1Y3QgU1ZHQ2hhcmFjdGVyTGF5b3V0SW5mbyB7CiAgICAgZmxv
YXQgcGF0aENodW5rTGVuZ3RoOwogCiAgICAgLy8gUmVzdWx0IHZlY3RvcgotICAgIFZlY3RvcjxT
VkdDaGFyPiYgc3ZnQ2hhcnM7CisgICAgVmVjdG9yPFNWR0NoYXI+IHN2Z0NoYXJzOwogICAgIGJv
b2wgbmV4dERyYXduU2VwZXJhdGVkIDogMTsKIAogcHJpdmF0ZToKSW5kZXg6IFdlYkNvcmUvcmVu
ZGVyaW5nL1NWR0lubGluZUZsb3dCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVy
aW5nL1NWR0lubGluZUZsb3dCb3guY3BwCShyZXZpc2lvbiA2MTM4MykKKysrIFdlYkNvcmUvcmVu
ZGVyaW5nL1NWR0lubGluZUZsb3dCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDkgKzEsOCBA
QAogLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBXZWJLaXQgcHJvamVjdC4KLSAqCiAg
KiBDb3B5cmlnaHQgKEMpIDIwMDYgT2xpdmVyIEh1bnQgPG9qaDE2QHN0dWRlbnQuY2FudGVyYnVy
eS5hYy5uej4KICAqICAgICAgICAgICAoQykgMjAwNiBBcHBsZSBDb21wdXRlciBJbmMuCiAgKiAg
ICAgICAgICAgKEMpIDIwMDcgTmlrb2xhcyBaaW1tZXJtYW5uIDx6aW1tZXJtYW5uQGtkZS5vcmc+
CisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIzLDI0ICsyMiw0MiBAQAog
ICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTVkdJbmxpbmVGbG93Qm94Lmgi
CiAKICNpZiBFTkFCTEUoU1ZHKQotI2luY2x1ZGUgIlNWR0lubGluZUZsb3dCb3guaCIKLSNpbmNs
dWRlICJTVkdOYW1lcy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
IlNWR1JlbmRlclN1cHBvcnQuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBuYW1l
c3BhY2UgU1ZHTmFtZXM7Ci0KLXZvaWQgU1ZHSW5saW5lRmxvd0JveDo6cGFpbnQoUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBpbnQsIGludCkKK3ZvaWQgU1ZHSW5saW5lRmxvd0JveDo6cGFpbnQo
UmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgaW50LCBpbnQpCiB7Ci0gICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgQVNTRVJUKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBo
YXNlRm9yZWdyb3VuZCk7CisKKyAgICBSZW5kZXJPYmplY3QqIGJveFJlbmRlcmVyID0gcmVuZGVy
ZXIoKTsKKyAgICBBU1NFUlQoYm94UmVuZGVyZXIpOworCisgICAgUmVuZGVyT2JqZWN0OjpQYWlu
dEluZm8gY2hpbGRQYWludEluZm8ocGFpbnRJbmZvKTsKKyAgICBjaGlsZFBhaW50SW5mby5jb250
ZXh0LT5zYXZlKCk7CisKKyAgICBSZW5kZXJTVkdSZXNvdXJjZUZpbHRlciogZmlsdGVyID0gMDsK
KyAgICBGbG9hdFJlY3QgcmVwYWludFJlY3QgPSBib3hSZW5kZXJlci0+cmVwYWludFJlY3RJbkxv
Y2FsQ29vcmRpbmF0ZXMoKTsKKworICAgIGlmIChTVkdSZW5kZXJCYXNlOjpwcmVwYXJlVG9SZW5k
ZXJTVkdDb250ZW50KGJveFJlbmRlcmVyLCBjaGlsZFBhaW50SW5mbywgcmVwYWludFJlY3QsIGZp
bHRlcikpIHsKKyAgICAgICAgZm9yIChJbmxpbmVCb3gqIGNoaWxkID0gZmlyc3RDaGlsZCgpOyBj
aGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dE9uTGluZSgpKQorICAgICAgICAgICAgY2hpbGQtPnBh
aW50KGNoaWxkUGFpbnRJbmZvLCAwLCAwKTsKKyAgICB9CisKKyAgICBTVkdSZW5kZXJCYXNlOjpm
aW5pc2hSZW5kZXJTVkdDb250ZW50KGJveFJlbmRlcmVyLCBjaGlsZFBhaW50SW5mbywgZmlsdGVy
LCBwYWludEluZm8uY29udGV4dCk7CisgICAgY2hpbGRQYWludEluZm8uY29udGV4dC0+cmVzdG9y
ZSgpOwogfQogCi1pbnQgU1ZHSW5saW5lRmxvd0JveDo6cGxhY2VCb3hlc0hvcml6b250YWxseShp
bnQsIGludCYsIGludCYsIGJvb2wmLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYp
CitJbnRSZWN0IFNWR0lubGluZUZsb3dCb3g6OmNhbGN1bGF0ZUJvdW5kYXJpZXMoKSBjb25zdAog
ewotICAgIC8vIG5vLW9wCi0gICAgcmV0dXJuIDA7CisgICAgSW50UmVjdCBjaGlsZFJlY3Q7Cisg
ICAgZm9yIChJbmxpbmVCb3gqIGNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBj
aGlsZC0+bmV4dE9uTGluZSgpKQorICAgICAgICBjaGlsZFJlY3QudW5pdGUoY2hpbGQtPmNhbGN1
bGF0ZUJvdW5kYXJpZXMoKSk7CisgICAgcmV0dXJuIGNoaWxkUmVjdDsKIH0KIAogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvU1ZHSW5saW5lRmxvd0JveC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lubGluZUZsb3dCb3guaAkocmV2
aXNpb24gNjEzODMpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9TVkdJbmxpbmVGbG93Qm94LmgJKHdv
cmtpbmcgY29weSkKQEAgLTQxLDggKzQxLDEwIEBAIHB1YmxpYzoKICAgICB2b2lkIHNldEhlaWdo
dChpbnQgaCkgeyBtX2hlaWdodCA9IGg7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBwYWludChSZW5k
ZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2aXJ0dWFsIGludCBw
bGFjZUJveGVzSG9yaXpvbnRhbGx5KGludCB4LCBpbnQmIGxlZnRQb3NpdGlvbiwgaW50JiByaWdo
dFBvc2l0aW9uLCBib29sJiBuZWVkc1dvcmRTcGFjaW5nLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJh
Y2tGb250c01hcCYpOwotICAgIAorCisgICAgdmlydHVhbCBJbnRSZWN0IGNhbGN1bGF0ZUJvdW5k
YXJpZXMoKSBjb25zdDsKKyAgICB2b2lkIGxheW91dEZsb3dCb3goKTsKKwogcHJpdmF0ZToKICAg
ICBpbnQgbV9oZWlnaHQ7CiB9OwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvU1ZHSW5saW5lVGV4
dEJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvU1ZHSW5saW5lVGV4dEJv
eC5jcHAJKHJldmlzaW9uIDYxMzgzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvU1ZHSW5saW5lVGV4
dEJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIxLDI1ICsyMSwyOCBAQAogICovCiAKICNpbmNs
dWRlICJjb25maWcuaCIKLQotI2lmIEVOQUJMRShTVkcpCiAjaW5jbHVkZSAiU1ZHSW5saW5lVGV4
dEJveC5oIgogCi0jaW5jbHVkZSAiRnJhbWUuaCIKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUg
IkZsb2F0Q29udmVyc2lvbi5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1
ZGUgIklubGluZUZsb3dCb3guaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgogI2luY2x1ZGUg
IlJlbmRlclNWR1Jlc291cmNlLmgiCiAjaW5jbHVkZSAiU1ZHUm9vdElubGluZUJveC5oIgogI2lu
Y2x1ZGUgIlNWR1RleHRMYXlvdXRVdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJUZXh0LmgiCiAKICNp
bmNsdWRlIDxmbG9hdC5oPgogCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKLVNWR0lubGluZVRleHRCb3g6OlNWR0lubGluZVRleHRCb3goUmVuZGVyT2JqZWN0
KiBvYmopCi0gICAgOiBJbmxpbmVUZXh0Qm94KG9iaikKK1NWR0lubGluZVRleHRCb3g6OlNWR0lu
bGluZVRleHRCb3goUmVuZGVyT2JqZWN0KiBvYmplY3QpCisgICAgOiBJbmxpbmVUZXh0Qm94KG9i
amVjdCkKICAgICAsIG1faGVpZ2h0KDApCisgICAgLCBtX3BhaW50aW5nUmVzb3VyY2UoMCkKKyAg
ICAsIG1fcGFpbnRpbmdSZXNvdXJjZU1vZGUoQXBwbHlUb0RlZmF1bHRNb2RlKQogewogfQogCkBA
IC02MCw1MzAgKzYzLDUyNSBAQCBTVkdSb290SW5saW5lQm94KiBTVkdJbmxpbmVUZXh0Qm94Ojpz
dmdSCiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFNWR1Jvb3RJbmxpbmVCb3gqPihwYXJlbnRCb3gp
OwogfQogCi1mbG9hdCBTVkdJbmxpbmVUZXh0Qm94OjpjYWxjdWxhdGVHbHlwaFdpZHRoKFJlbmRl
clN0eWxlKiBzdHlsZSwgaW50IG9mZnNldCwgaW50IGV4dHJhQ2hhcnNBdmFpbGFibGUsIGludCYg
Y2hhcnNDb25zdW1lZCwgU3RyaW5nJiBnbHlwaE5hbWUpIGNvbnN0Cit2b2lkIFNWR0lubGluZVRl
eHRCb3g6Om1lYXN1cmVDaGFyYWN0ZXIoUmVuZGVyU3R5bGUqIHN0eWxlLCBpbnQgcG9zaXRpb24s
IGludCYgY2hhcnNDb25zdW1lZCwgU3RyaW5nJiBnbHlwaE5hbWUsIFN0cmluZyYgdW5pY29kZVN0
cmluZywgZmxvYXQmIGdseXBoV2lkdGgsIGZsb2F0JiBnbHlwaEhlaWdodCkgY29uc3QKIHsKICAg
ICBBU1NFUlQoc3R5bGUpOwotICAgIHJldHVybiBzdHlsZS0+Zm9udCgpLmZsb2F0V2lkdGgoc3Zn
VGV4dFJ1bkZvcklubGluZVRleHRCb3godGV4dFJlbmRlcmVyKCktPmNoYXJhY3RlcnMoKSArIG9m
ZnNldCwgMSwgc3R5bGUsIHRoaXMsIDApLCBleHRyYUNoYXJzQXZhaWxhYmxlLCBjaGFyc0NvbnN1
bWVkLCBnbHlwaE5hbWUpOwotfQogCi1mbG9hdCBTVkdJbmxpbmVUZXh0Qm94OjpjYWxjdWxhdGVH
bHlwaEhlaWdodChSZW5kZXJTdHlsZSogc3R5bGUsIGludCwgaW50KSBjb25zdAotewotICAgIC8v
IFRoaXMgaXMganVzdCBhIGd1ZXNzLCBhbmQgdGhlIG9ubHkgcHVycG9zZSBvZiB0aGlzIGZ1bmN0
aW9uIGlzIHRvIGNlbnRyYWxpemUgdGhpcyBoYWNrLgotICAgIC8vIEluIHJlYWwtbGlmZSB0b3At
dG9wLWJvdHRvbSBzY3JpcHRzIHRoaXMgd29uJ3QgYmUgZW5vdWdoLCBJIGZlYXIuCi0gICAgcmV0
dXJuIHN0eWxlLT5mb250KCkuYXNjZW50KCkgKyBzdHlsZS0+Zm9udCgpLmRlc2NlbnQoKTsKKyAg
ICBpbnQgb2Zmc2V0ID0gZGlyZWN0aW9uKCkgPT0gUlRMID8gZW5kKCkgLSBwb3NpdGlvbiA6IHN0
YXJ0KCkgKyBwb3NpdGlvbjsKKyAgICBpbnQgZXh0cmFDaGFyc0F2YWlsYWJsZSA9IGxlbigpIC0g
cG9zaXRpb24gLSAxOworICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzID0gdGV4dFJlbmRlcmVy
KCktPmNoYXJhY3RlcnMoKTsKKworICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBzdHlsZS0+Zm9udCgp
OworICAgIGdseXBoV2lkdGggPSBmb250LmZsb2F0V2lkdGgoc3ZnVGV4dFJ1bkZvcklubGluZVRl
eHRCb3goY2hhcmFjdGVycyArIG9mZnNldCwgMSwgc3R5bGUsIHRoaXMpLCBleHRyYUNoYXJzQXZh
aWxhYmxlLCBjaGFyc0NvbnN1bWVkLCBnbHlwaE5hbWUpOworICAgIGdseXBoSGVpZ2h0ID0gZm9u
dC5oZWlnaHQoKTsKKworICAgIC8vIFRoZSB1bmljb2RlU3RyaW5nIC8gZ2x5cGhOYW1lIHBhaXIg
aXMgbmVlZGVkIGZvciBrZXJuaW5nIGNhbGN1bGF0aW9ucy4KKyAgICB1bmljb2RlU3RyaW5nID0g
U3RyaW5nKGNoYXJhY3RlcnMgKyBvZmZzZXQsIGNoYXJzQ29uc3VtZWQpOwogfQogCi1GbG9hdFJl
Y3QgU1ZHSW5saW5lVGV4dEJveDo6Y2FsY3VsYXRlR2x5cGhCb3VuZGFyaWVzKFJlbmRlclN0eWxl
KiBzdHlsZSwgaW50IG9mZnNldCwgY29uc3QgU1ZHQ2hhciYgc3ZnQ2hhcikgY29uc3QKK2ludCBT
VkdJbmxpbmVUZXh0Qm94OjpvZmZzZXRGb3JQb3NpdGlvbihpbnQgeENvb3JkaW5hdGUsIGJvb2wg
aW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0CiB7Ci0gICAgY29uc3QgRm9udCYgZm9udCA9IHN0
eWxlLT5mb250KCk7CisgICAgQVNTRVJUKCFtX2N1cnJlbnRDaHVua1BhcnQuaXNWYWxpZCgpKTsK
KyAgICBmbG9hdCB4ID0geENvb3JkaW5hdGU7CiAKLSAgICAvLyBUYWtlIFJUTCB0ZXh0IGludG8g
YWNjb3VudCBhbmQgcGljayByaWdodCBnbHlwaCB3aWR0aC9oZWlnaHQuCi0gICAgZmxvYXQgZ2x5
cGhXaWR0aCA9IDAuMGY7CisgICAgUmVuZGVyVGV4dCogdGV4dFJlbmRlcmVyID0gdGhpcy0+dGV4
dFJlbmRlcmVyKCk7CisgICAgQVNTRVJUKHRleHRSZW5kZXJlcik7CiAKLSAgICAvLyBGSVhNRTog
YWNjb3VudCBmb3IgbXVsdGktY2hhcmFjdGVyIGdseXBocwotICAgIGludCBjaGFyc0NvbnN1bWVk
OwotICAgIFN0cmluZyBnbHlwaE5hbWU7Ci0gICAgaWYgKGRpcmVjdGlvbigpID09IExUUikKLSAg
ICAgICAgZ2x5cGhXaWR0aCA9IGNhbGN1bGF0ZUdseXBoV2lkdGgoc3R5bGUsIG9mZnNldCwgMCwg
Y2hhcnNDb25zdW1lZCwgZ2x5cGhOYW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGdseXBoV2lkdGgg
PSBjYWxjdWxhdGVHbHlwaFdpZHRoKHN0eWxlLCBzdGFydCgpICsgZW5kKCkgLSBvZmZzZXQsIDAs
IGNoYXJzQ29uc3VtZWQsIGdseXBoTmFtZSk7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4
dFJlbmRlcmVyLT5zdHlsZSgpOworICAgIEFTU0VSVChzdHlsZSk7CiAKLSAgICBmbG9hdCB4MSA9
IHN2Z0NoYXIueDsKLSAgICBmbG9hdCB4MiA9IHN2Z0NoYXIueCArIGdseXBoV2lkdGg7CisgICAg
UmVuZGVyQmxvY2sqIGNvbnRhaW5pbmdCbG9jayA9IHRleHRSZW5kZXJlci0+Y29udGFpbmluZ0Js
b2NrKCk7CisgICAgQVNTRVJUKGNvbnRhaW5pbmdCbG9jayk7CiAKLSAgICBmbG9hdCB5MSA9IHN2
Z0NoYXIueSAtIGZvbnQuYXNjZW50KCk7Ci0gICAgZmxvYXQgeTIgPSBzdmdDaGFyLnkgKyBmb250
LmRlc2NlbnQoKTsKKyAgICAvLyBNb3ZlIGluY29taW5nIHJlbGF0aXZlIHggcG9zaXRpb24gdG8g
YWJzb2x1dGUgcG9zaXRpb24sIGFzIHRoZSBjaGFyYWN0ZXIgb3JpZ2lucyBzdG9yZWQgaW4gdGhl
IGNodW5rIHBhcnRzIHVzZSBhYnNvbHV0ZSBjb29yZGluYXRlcworICAgIHggKz0gY29udGFpbmlu
Z0Jsb2NrLT54KCk7CiAKLSAgICBGbG9hdFJlY3QgZ2x5cGhSZWN0KHgxLCB5MSwgeDIgLSB4MSwg
eTIgLSB5MSk7CisgICAgLy8gRmlndXJlIG91dCB3aGljaCB0ZXh0IGNodW5rIHBhcnQgaXMgaGl0
CisgICAgU1ZHVGV4dENodW5rUGFydCBoaXRQYXJ0OwogCi0gICAgLy8gVGFrZSBwZXItY2hhcmFj
dGVyIHRyYW5zZm9ybWF0aW9ucyBpbnRvIGFjY291bnQKLSAgICBnbHlwaFJlY3QgPSBzdmdDaGFy
LmNoYXJhY3RlclRyYW5zZm9ybSgpLm1hcFJlY3QoZ2x5cGhSZWN0KTsKKyAgICBjb25zdCBWZWN0
b3I8U1ZHVGV4dENodW5rUGFydD46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fc3ZnVGV4dENodW5r
UGFydHMuZW5kKCk7CisgICAgZm9yIChWZWN0b3I8U1ZHVGV4dENodW5rUGFydD46OmNvbnN0X2l0
ZXJhdG9yIGl0ID0gbV9zdmdUZXh0Q2h1bmtQYXJ0cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQp
IHsKKyAgICAgICAgY29uc3QgU1ZHVGV4dENodW5rUGFydCYgcGFydCA9ICppdDsKIAotICAgIHJl
dHVybiBnbHlwaFJlY3Q7Ci19CisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgd2UncmUgcGFzdCB0
aGUgaGl0IHBhcnQuCisgICAgICAgIGlmICh4IDwgcGFydC5maXJzdENoYXJhY3Rlci0+eCkKKyAg
ICAgICAgICAgIGJyZWFrOwogCi0vLyBIZWxwZXIgY2xhc3MgZm9yIGNsb3Nlc3RDaGFyYWN0ZXJU
b1Bvc2l0aW9uKCkKLXN0cnVjdCBTVkdJbmxpbmVUZXh0Qm94Q2xvc2VzdENoYXJhY3RlclRvUG9z
aXRpb25XYWxrZXIgewotICAgIFNWR0lubGluZVRleHRCb3hDbG9zZXN0Q2hhcmFjdGVyVG9Qb3Np
dGlvbldhbGtlcihpbnQgeCwgaW50IHkpCi0gICAgICAgIDogbV9jaGFyYWN0ZXIoMCkKLSAgICAg
ICAgLCBtX2Rpc3RhbmNlKEZMVF9NQVgpCi0gICAgICAgICwgbV94KHgpCi0gICAgICAgICwgbV95
KHkpCi0gICAgICAgICwgbV9vZmZzZXRPZkhpdENoYXJhY3RlcigwKQotICAgIHsKKyAgICAgICAg
aGl0UGFydCA9IHBhcnQ7CiAgICAgfQogCi0gICAgdm9pZCBjaHVua1BvcnRpb25DYWxsYmFjayhT
VkdJbmxpbmVUZXh0Qm94KiB0ZXh0Qm94LCBpbnQgc3RhcnRPZmZzZXQsIGNvbnN0IEFmZmluZVRy
YW5zZm9ybSYgY2h1bmtDdG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBW
ZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yJiBzdGFydCwgY29uc3QgVmVjdG9yPFNWR0NoYXI+Ojpp
dGVyYXRvciYgZW5kKQotICAgIHsKLSAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dEJv
eC0+dGV4dFJlbmRlcmVyKCktPnN0eWxlKCk7CisgICAgLy8gSWYgd2UgZGlkIG5vdCBoaXQgYW55
dGhpbmcsIGp1c3QgZXhpdC4KKyAgICBpZiAoIWhpdFBhcnQuaXNWYWxpZCgpKQorICAgICAgICBy
ZXR1cm4gMDsKIAotICAgICAgICBWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yIGNsb3Nlc3RDaGFy
YWN0ZXIgPSAwOwotICAgICAgICB1bnNpZ25lZCBpbnQgY2xvc2VzdE9mZnNldCA9IFVJTlRfTUFY
OworICAgIC8vIEJlZm9yZSBjYWxsaW5nIEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uKCksIHN1YnRy
YWN0IHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICAgLy8gaW4g
dGhlIGhpdCB0ZXh0IGNodW5rIHBhcnQsIHRvIHBhc3MgaW4gY29vcmRpbmF0ZXMsIHdoaWNoIGFy
ZSByZWxhdGl2ZSB0byB0aGUgdGV4dCBjaHVuayBwYXJ0LCBhcworICAgIC8vIGNvbnN0cnVjdFRl
eHRSdW4oKSBvbmx5IGJ1aWxkcyBhIFRleHRSdW4gZm9yIHRoZSBjdXJyZW50IGNodW5rIHBhcnQs
IG5vdCB0aGUgd2hvbGUgaW5saW5lIHRleHQgYm94LgorICAgIHggLT0gaGl0UGFydC5maXJzdENo
YXJhY3Rlci0+eDsKKworICAgIG1fY3VycmVudENodW5rUGFydCA9IGhpdFBhcnQ7CisgICAgVGV4
dFJ1biB0ZXh0UnVuKGNvbnN0cnVjdFRleHRSdW4oc3R5bGUpKTsKKyAgICBtX2N1cnJlbnRDaHVu
a1BhcnQgPSBTVkdUZXh0Q2h1bmtQYXJ0KCk7CisKKyAgICAvLyBFdmVudHVhbGx5IGhhbmRsZSBs
ZW5ndGhBZGp1c3Q9InNwYWNpbmdBbmRHbHlwaHMiLgorICAgIGlmICghbV9jaHVua1RyYW5zZm9y
bWF0aW9uLmlzSWRlbnRpdHkoKSkKKyAgICAgICAgdGV4dFJ1bi5zZXRHbHlwaFNjYWxlKG5hcnJv
d1ByZWNpc2lvblRvRmxvYXQoaXNWZXJ0aWNhbFdyaXRpbmdNb2RlKHN0eWxlLT5zdmdTdHlsZSgp
KSA/IG1fY2h1bmtUcmFuc2Zvcm1hdGlvbi5kKCkgOiBtX2NodW5rVHJhbnNmb3JtYXRpb24uYSgp
KSk7CiAKLSAgICAgICAgZm9yIChWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yIGl0ID0gc3RhcnQ7
IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgaWYgKGl0LT5pc0hpZGRlbigpKQotICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgIHJldHVybiBoaXRQYXJ0Lm9mZnNldCArIHN0eWxl
LT5mb250KCkub2Zmc2V0Rm9yUG9zaXRpb24odGV4dFJ1biwgeCwgaW5jbHVkZVBhcnRpYWxHbHlw
aHMpOworfQogCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmV3T2Zmc2V0ID0gdGV4dEJveC0+
c3RhcnQoKSArIChpdCAtIHN0YXJ0KSArIHN0YXJ0T2Zmc2V0OwotICAgICAgICAgICAgRmxvYXRS
ZWN0IGdseXBoUmVjdCA9IGNodW5rQ3RtLm1hcFJlY3QodGV4dEJveC0+Y2FsY3VsYXRlR2x5cGhC
b3VuZGFyaWVzKHN0eWxlLCBuZXdPZmZzZXQsICppdCkpOworaW50IFNWR0lubGluZVRleHRCb3g6
OnBvc2l0aW9uRm9yT2Zmc2V0KGludCkgY29uc3QKK3sKKyAgICAvLyBTVkcgZG9lc24ndCB1c2Ug
dGhlIG9mZnNldCA8LT4gcG9zaXRpb24gc2VsZWN0aW9uIHN5c3RlbS4gCisgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CiAKLSAgICAgICAgICAgIC8vIFRha2UgUlRM
IHRleHQgaW50byBhY2NvdW50IGFuZCBwaWNrIHJpZ2h0IGdseXBoIHdpZHRoL2hlaWdodC4KLSAg
ICAgICAgICAgIC8vIE5PVEU6IFRoaXMgb2Zmc2V0IGhhcyB0byBiZSBjb3JyZWN0ZWQgX2FmdGVy
XyBjYWxsaW5nIGNhbGN1bGF0ZUdseXBoQm91bmRhcmllcwotICAgICAgICAgICAgaWYgKHRleHRC
b3gtPmRpcmVjdGlvbigpID09IFJUTCkKLSAgICAgICAgICAgICAgICBuZXdPZmZzZXQgPSB0ZXh0
Qm94LT5zdGFydCgpICsgdGV4dEJveC0+ZW5kKCkgLSBuZXdPZmZzZXQ7CitJbnRSZWN0IFNWR0lu
bGluZVRleHRCb3g6OnNlbGVjdGlvblJlY3QoaW50LCBpbnQsIGludCBzdGFydFBvcywgaW50IGVu
ZFBvcykKK3sKKyAgICBBU1NFUlQoIW1fY3VycmVudENodW5rUGFydC5pc1ZhbGlkKCkpOwogCi0g
ICAgICAgICAgICAvLyBDYWxjdWxhdGUgZGlzdGFuY2VzIHJlbGF0aXZlIHRvIHRoZSBnbHlwaCBt
aWQtcG9pbnQuIEkgaG9wZSB0aGlzIGlzIGFjY3VyYXRlIGVub3VnaC4KLSAgICAgICAgICAgIGZs
b2F0IHhEaXN0YW5jZSA9IGdseXBoUmVjdC54KCkgKyBnbHlwaFJlY3Qud2lkdGgoKSAvIDIuMGYg
LSBtX3g7Ci0gICAgICAgICAgICBmbG9hdCB5RGlzdGFuY2UgPSBnbHlwaFJlY3QueSgpIC0gZ2x5
cGhSZWN0LmhlaWdodCgpIC8gMi4wZiAtIG1feTsKKyAgICBpbnQgYm94U3RhcnQgPSBzdGFydCgp
OworICAgIHN0YXJ0UG9zID0gbWF4KHN0YXJ0UG9zIC0gYm94U3RhcnQsIDApOworICAgIGVuZFBv
cyA9IG1pbihlbmRQb3MgLSBib3hTdGFydCwgc3RhdGljX2Nhc3Q8aW50PihsZW4oKSkpOwogCi0g
ICAgICAgICAgICBmbG9hdCBuZXdEaXN0YW5jZSA9IHNxcnRmKHhEaXN0YW5jZSAqIHhEaXN0YW5j
ZSArIHlEaXN0YW5jZSAqIHlEaXN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAobmV3RGlzdGFuY2Ug
PD0gbV9kaXN0YW5jZSkgewotICAgICAgICAgICAgICAgIG1fZGlzdGFuY2UgPSBuZXdEaXN0YW5j
ZTsKLSAgICAgICAgICAgICAgICBjbG9zZXN0T2Zmc2V0ID0gbmV3T2Zmc2V0OwotICAgICAgICAg
ICAgICAgIGNsb3Nlc3RDaGFyYWN0ZXIgPSBpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQor
ICAgIGlmIChzdGFydFBvcyA+PSBlbmRQb3MpCisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisK
KyAgICBSZW5kZXJUZXh0KiB0ZXh0ID0gdGV4dFJlbmRlcmVyKCk7CisgICAgQVNTRVJUKHRleHQp
OworCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dC0+c3R5bGUoKTsKKyAgICBBU1NFUlQo
c3R5bGUpOworCisgICAgY29uc3QgRm9udCYgZm9udCA9IHN0eWxlLT5mb250KCk7CisgICAgaW50
IGJhc2VsaW5lID0gZm9udC5hc2NlbnQoKTsKKyAgICBGbG9hdFJlY3Qgc2VsZWN0aW9uUmVjdDsK
KworICAgIC8vIEZpZ3VyZSBvdXQgd2hpY2ggdGV4dCBjaHVuayBwYXJ0IGlzIGhpdAorICAgIGlu
dCBwYXJ0U3RhcnRQb3MgPSAwOworICAgIGludCBwYXJ0RW5kUG9zID0gMDsKKworICAgIGNvbnN0
IFZlY3RvcjxTVkdUZXh0Q2h1bmtQYXJ0Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9zdmdUZXh0
Q2h1bmtQYXJ0cy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxTVkdUZXh0Q2h1bmtQYXJ0Pjo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBtX3N2Z1RleHRDaHVua1BhcnRzLmJlZ2luKCk7IGl0ICE9IGVuZDsg
KytpdCkgeworICAgICAgICBwYXJ0U3RhcnRQb3MgPSBzdGFydFBvczsKKyAgICAgICAgcGFydEVu
ZFBvcyA9IGVuZFBvczsKIAotICAgICAgICBpZiAoY2xvc2VzdE9mZnNldCAhPSBVSU5UX01BWCkg
ewotICAgICAgICAgICAgLy8gUmVjb3JkIGN1cnJlbnQgY2h1bmssIGlmIGl0IGNvbnRhaW5zIHRo
ZSBjdXJyZW50IGNsb3Nlc3QgY2hhcmFjdGVyIG5leHQgdG8gdGhlIG1vdXNlLgotICAgICAgICAg
ICAgbV9jaGFyYWN0ZXIgPSBjbG9zZXN0Q2hhcmFjdGVyOwotICAgICAgICAgICAgbV9vZmZzZXRP
ZkhpdENoYXJhY3RlciA9IGNsb3Nlc3RPZmZzZXQ7CisgICAgICAgIC8vIFNlbGVjdCBjdXJyZW50
IGNodW5rIHBhcnQsIG1hcCBzdGFydFBvcy9lbmRQb3MgcG9zaXRpb25zIGludG8gY2h1bmsgcGFy
dAorICAgICAgICBtX2N1cnJlbnRDaHVua1BhcnQgPSAqaXQ7CisgICAgICAgIG1hcFN0YXJ0RW5k
UG9zaXRpb25zSW50b0NodW5rUGFydENvb3JkaW5hdGVzKHBhcnRTdGFydFBvcywgcGFydEVuZFBv
cywgbV9jdXJyZW50Q2h1bmtQYXJ0KTsKKworICAgICAgICBpZiAocGFydFN0YXJ0UG9zIDwgcGFy
dEVuZFBvcykgeworICAgICAgICAgICAgVmVjdG9yPFNWR0NoYXI+Ojpjb25zdF9pdGVyYXRvciBj
aGFyYWN0ZXIgPSBtX2N1cnJlbnRDaHVua1BhcnQuZmlyc3RDaGFyYWN0ZXI7CisgICAgICAgICAg
ICBGbG9hdFBvaW50IHRleHRPcmlnaW4oY2hhcmFjdGVyLT54LCBjaGFyYWN0ZXItPnkgLSBiYXNl
bGluZSk7CisgICAgICAgICAgICBGbG9hdFJlY3QgcGFydFJlY3QoZm9udC5zZWxlY3Rpb25SZWN0
Rm9yVGV4dChjb25zdHJ1Y3RUZXh0UnVuKHN0eWxlKSwgdGV4dE9yaWdpbiwgbV9jdXJyZW50Q2h1
bmtQYXJ0LmhlaWdodCwgcGFydFN0YXJ0UG9zLCBwYXJ0RW5kUG9zKSk7CisgICAgICAgICAgICBz
ZWxlY3Rpb25SZWN0LnVuaXRlKGNoYXJhY3Rlci0+Y2hhcmFjdGVyVHJhbnNmb3JtKCkubWFwUmVj
dChwYXJ0UmVjdCkpOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgU1ZHQ2hhciogY2hhcmFjdGVy
KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NoYXJhY3RlcjsKKyAgICAgICAgbV9j
dXJyZW50Q2h1bmtQYXJ0ID0gU1ZHVGV4dENodW5rUGFydCgpOwogICAgIH0KIAotICAgIGludCBv
ZmZzZXRPZkhpdENoYXJhY3RlcigpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoIW1fY2hhcmFj
dGVyKQotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gUmVzZXBlY3QgcG9zc2libGUgY2h1
bmsgdHJhbnNmb3JtYXRpb24KKyAgICBpZiAobV9jaHVua1RyYW5zZm9ybWF0aW9uLmlzSWRlbnRp
dHkoKSkKKyAgICAgICAgcmV0dXJuIGVuY2xvc2luZ0ludFJlY3Qoc2VsZWN0aW9uUmVjdCk7CiAK
LSAgICAgICAgcmV0dXJuIG1fb2Zmc2V0T2ZIaXRDaGFyYWN0ZXI7Ci0gICAgfQorICAgIHJldHVy
biBlbmNsb3NpbmdJbnRSZWN0KG1fY2h1bmtUcmFuc2Zvcm1hdGlvbi5tYXBSZWN0KHNlbGVjdGlv
blJlY3QpKTsKK30KIAotcHJpdmF0ZToKLSAgICBWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yIG1f
Y2hhcmFjdGVyOwotICAgIGZsb2F0IG1fZGlzdGFuY2U7Cit2b2lkIFNWR0lubGluZVRleHRCb3g6
OnBhaW50KFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGludCwgaW50KQorewor
ICAgIEFTU0VSVChyZW5kZXJlcigpLT5zaG91bGRQYWludFdpdGhpblJvb3QocGFpbnRJbmZvKSk7
CisgICAgQVNTRVJUKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlRm9yZWdyb3VuZCk7Cisg
ICAgQVNTRVJUKHRydW5jYXRpb24oKSA9PSBjTm9UcnVuY2F0aW9uKTsKIAotICAgIGludCBtX3g7
Ci0gICAgaW50IG1feTsKLSAgICBpbnQgbV9vZmZzZXRPZkhpdENoYXJhY3RlcjsKLX07CisgICAg
aWYgKHJlbmRlcmVyKCktPnN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFKQorICAgICAg
ICByZXR1cm47CiAKLS8vIEhlbHBlciBjbGFzcyBmb3Igc2VsZWN0aW9uUmVjdCgpCi1zdHJ1Y3Qg
U1ZHSW5saW5lVGV4dEJveFNlbGVjdGlvblJlY3RXYWxrZXIgewotICAgIFNWR0lubGluZVRleHRC
b3hTZWxlY3Rpb25SZWN0V2Fsa2VyKCkKLSAgICB7Ci0gICAgfQorICAgIC8vIE5vdGU6IFdlJ3Jl
IGV4cGxpY2l0ZWx5IG5vdCBzdXBwb3J0aW5nIGNvbXBvc2l0aW9uICYgY3VzdG9tIHVuZGVybGlu
ZXMgYW5kIGN1c3RvbSBoaWdobGlnaHRlcnMgLSB1bmxpa2UgSW5saW5lVGV4dEJveC4KKyAgICAv
LyBJZiB3ZSBldmVyIG5lZWQgdGhhdCBmb3IgU1ZHLCBpdCdzIHZlcnkgZWFzeSB0byByZWZhY3Rv
ciBhbmQgcmV1c2UgdGhlIGNvZGUuCiAKLSAgICB2b2lkIGNodW5rUG9ydGlvbkNhbGxiYWNrKFNW
R0lubGluZVRleHRCb3gqIHRleHRCb3gsIGludCBzdGFydE9mZnNldCwgY29uc3QgQWZmaW5lVHJh
bnNmb3JtJiBjaHVua0N0bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZl
Y3RvcjxTVkdDaGFyPjo6aXRlcmF0b3ImIHN0YXJ0LCBjb25zdCBWZWN0b3I8U1ZHQ2hhcj46Oml0
ZXJhdG9yJiBlbmQpCi0gICAgewotICAgICAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0Qm94
LT50ZXh0UmVuZGVyZXIoKS0+c3R5bGUoKTsKKyAgICBSZW5kZXJPYmplY3QqIHBhcmVudFJlbmRl
cmVyID0gcGFyZW50KCktPnJlbmRlcmVyKCk7CisgICAgQVNTRVJUKHBhcmVudFJlbmRlcmVyKTsK
IAotICAgICAgICBmb3IgKFZlY3RvcjxTVkdDaGFyPjo6aXRlcmF0b3IgaXQgPSBzdGFydDsgaXQg
IT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICBpZiAoaXQtPmlzSGlkZGVuKCkpCi0gICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gcGFyZW50UmVuZGVy
ZXItPnN0eWxlKCk7CisgICAgQVNTRVJUKHN0eWxlKTsKIAotICAgICAgICAgICAgdW5zaWduZWQg
aW50IG5ld09mZnNldCA9IHRleHRCb3gtPnN0YXJ0KCkgKyAoaXQgLSBzdGFydCkgKyBzdGFydE9m
ZnNldDsKLSAgICAgICAgICAgIG1fc2VsZWN0aW9uUmVjdC51bml0ZSh0ZXh0Qm94LT5jYWxjdWxh
dGVHbHlwaEJvdW5kYXJpZXMoc3R5bGUsIG5ld09mZnNldCwgKml0KSk7Ci0gICAgICAgIH0KKyAg
ICBjb25zdCBTVkdSZW5kZXJTdHlsZSogc3ZnU3R5bGUgPSBzdHlsZS0+c3ZnU3R5bGUoKTsKKyAg
ICBBU1NFUlQoc3ZnU3R5bGUpOwogCi0gICAgICAgIG1fc2VsZWN0aW9uUmVjdCA9IGNodW5rQ3Rt
Lm1hcFJlY3QobV9zZWxlY3Rpb25SZWN0KTsKLSAgICB9CisgICAgYm9vbCBoYXNGaWxsID0gc3Zn
U3R5bGUtPmhhc0ZpbGwoKTsKKyAgICBib29sIGhhc1N0cm9rZSA9IHN2Z1N0eWxlLT5oYXNTdHJv
a2UoKTsKIAotICAgIEZsb2F0UmVjdCBzZWxlY3Rpb25SZWN0KCkgY29uc3QKLSAgICB7Ci0gICAg
ICAgIHJldHVybiBtX3NlbGVjdGlvblJlY3Q7CisgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgb3Ig
bm90IHdlJ3JlIHNlbGVjdGVkLgorICAgIGJvb2wgaXNQcmludGluZyA9IHBhcmVudFJlbmRlcmVy
LT5kb2N1bWVudCgpLT5wcmludGluZygpOworICAgIGJvb2wgaGFzU2VsZWN0aW9uID0gIWlzUHJp
bnRpbmcgJiYgc2VsZWN0aW9uU3RhdGUoKSAhPSBSZW5kZXJPYmplY3Q6OlNlbGVjdGlvbk5vbmU7
CisKKyAgICBSZW5kZXJTdHlsZSogc2VsZWN0aW9uU3R5bGUgPSBzdHlsZTsKKyAgICBpZiAoaGFz
U2VsZWN0aW9uKSB7CisgICAgICAgIHNlbGVjdGlvblN0eWxlID0gcGFyZW50UmVuZGVyZXItPmdl
dENhY2hlZFBzZXVkb1N0eWxlKFNFTEVDVElPTik7CisgICAgICAgIGlmIChzZWxlY3Rpb25TdHls
ZSkgeworICAgICAgICAgICAgY29uc3QgU1ZHUmVuZGVyU3R5bGUqIHN2Z1NlbGVjdGlvblN0eWxl
ID0gc2VsZWN0aW9uU3R5bGUtPnN2Z1N0eWxlKCk7CisgICAgICAgICAgICBBU1NFUlQoc3ZnU2Vs
ZWN0aW9uU3R5bGUpOworCisgICAgICAgICAgICBpZiAoIWhhc0ZpbGwpCisgICAgICAgICAgICAg
ICAgaGFzRmlsbCA9IHN2Z1NlbGVjdGlvblN0eWxlLT5oYXNGaWxsKCk7CisgICAgICAgICAgICBp
ZiAoIWhhc1N0cm9rZSkKKyAgICAgICAgICAgICAgICBoYXNTdHJva2UgPSBzdmdTZWxlY3Rpb25T
dHlsZS0+aGFzU3Ryb2tlKCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgc2VsZWN0aW9u
U3R5bGUgPSBzdHlsZTsKICAgICB9CiAKLXByaXZhdGU6Ci0gICAgRmxvYXRSZWN0IG1fc2VsZWN0
aW9uUmVjdDsKLX07CisgICAgQVNTRVJUKCFtX2N1cnJlbnRDaHVua1BhcnQuaXNWYWxpZCgpKTsK
IAotU1ZHQ2hhciogU1ZHSW5saW5lVGV4dEJveDo6Y2xvc2VzdENoYXJhY3RlclRvUG9zaXRpb24o
aW50IHgsIGludCB5LCBpbnQmIG9mZnNldE9mSGl0Q2hhcmFjdGVyKSBjb25zdAotewotICAgIFNW
R1Jvb3RJbmxpbmVCb3gqIHJvb3RCb3ggPSBzdmdSb290SW5saW5lQm94KCk7Ci0gICAgaWYgKCFy
b290Qm94KQotICAgICAgICByZXR1cm4gMDsKKyAgICBjb25zdCBWZWN0b3I8U1ZHVGV4dENodW5r
UGFydD46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fc3ZnVGV4dENodW5rUGFydHMuZW5kKCk7Cisg
ICAgZm9yIChWZWN0b3I8U1ZHVGV4dENodW5rUGFydD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9z
dmdUZXh0Q2h1bmtQYXJ0cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgQVNT
RVJUKCFtX3BhaW50aW5nUmVzb3VyY2UpOwogCi0gICAgU1ZHSW5saW5lVGV4dEJveENsb3Nlc3RD
aGFyYWN0ZXJUb1Bvc2l0aW9uV2Fsa2VyIHdhbGtlckNhbGxiYWNrKHgsIHkpOwotICAgIFNWR1Rl
eHRDaHVua1dhbGtlcjxTVkdJbmxpbmVUZXh0Qm94Q2xvc2VzdENoYXJhY3RlclRvUG9zaXRpb25X
YWxrZXI+IHdhbGtlcigmd2Fsa2VyQ2FsbGJhY2ssICZTVkdJbmxpbmVUZXh0Qm94Q2xvc2VzdENo
YXJhY3RlclRvUG9zaXRpb25XYWxrZXI6OmNodW5rUG9ydGlvbkNhbGxiYWNrKTsKKyAgICAgICAg
Ly8gY29uc3RydWN0VGV4dFJ1bigpIHVzZXMgdGhlIGN1cnJlbnQgY2h1bmsgcGFydCB0byBmaWd1
cmUgb3V0IHdoYXQgdGV4dCB0byByZW5kZXIuCisgICAgICAgIG1fY3VycmVudENodW5rUGFydCA9
ICppdDsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKIAotICAgIHJvb3RCb3gt
PndhbGtUZXh0Q2h1bmtzKCZ3YWxrZXIsIHRoaXMpOworICAgICAgICAvLyBQcmVwYXJlIGNvbnRl
eHQgYW5kIGRyYXcgdGV4dAorICAgICAgICBpZiAoIW1fY2h1bmtUcmFuc2Zvcm1hdGlvbi5pc0lk
ZW50aXR5KCkpCisgICAgICAgICAgICBwYWludEluZm8uY29udGV4dC0+Y29uY2F0Q1RNKG1fY2h1
bmtUcmFuc2Zvcm1hdGlvbik7CiAKLSAgICBvZmZzZXRPZkhpdENoYXJhY3RlciA9IHdhbGtlckNh
bGxiYWNrLm9mZnNldE9mSGl0Q2hhcmFjdGVyKCk7Ci0gICAgcmV0dXJuIHdhbGtlckNhbGxiYWNr
LmNoYXJhY3RlcigpOwotfQorICAgICAgICBWZWN0b3I8U1ZHQ2hhcj46OmNvbnN0X2l0ZXJhdG9y
IGZpcnN0Q2hhcmFjdGVyID0gbV9jdXJyZW50Q2h1bmtQYXJ0LmZpcnN0Q2hhcmFjdGVyOworICAg
ICAgICBBZmZpbmVUcmFuc2Zvcm0gY2hhcmFjdGVyVHJhbnNmb3JtID0gZmlyc3RDaGFyYWN0ZXIt
PmNoYXJhY3RlclRyYW5zZm9ybSgpOworICAgICAgICBpZiAoIWNoYXJhY3RlclRyYW5zZm9ybS5p
c0lkZW50aXR5KCkpCisgICAgICAgICAgICBwYWludEluZm8uY29udGV4dC0+Y29uY2F0Q1RNKGNo
YXJhY3RlclRyYW5zZm9ybSk7CiAKLWJvb2wgU1ZHSW5saW5lVGV4dEJveDo6c3ZnQ2hhcmFjdGVy
SGl0c1Bvc2l0aW9uKGludCB4LCBpbnQgeSwgaW50JiBjbG9zZXN0T2Zmc2V0SW5Cb3gpIGNvbnN0
Ci17Ci0gICAgaW50IG9mZnNldE9mSGl0Q2hhcmFjdGVyID0gMDsKLSAgICBTVkdDaGFyKiBjaGFy
QXRQb3NQdHIgPSBjbG9zZXN0Q2hhcmFjdGVyVG9Qb3NpdGlvbih4LCB5LCBvZmZzZXRPZkhpdENo
YXJhY3Rlcik7Ci0gICAgaWYgKCFjaGFyQXRQb3NQdHIpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgRmxvYXRQb2ludCB0ZXh0T3JpZ2luKGZpcnN0Q2hhcmFjdGVyLT54LCBmaXJzdENo
YXJhY3Rlci0+eSk7CisKKyAgICAgICAgLy8gRHJhdyBiYWNrZ3JvdW5kIG9uY2UgKG5vdCBpbiBi
b3RoIGZpbGwvc3Ryb2tlIHBoYXNlcykKKyAgICAgICAgaWYgKCFpc1ByaW50aW5nKSB7CisgICAg
ICAgICAgICAvLyBGSVhNRTogcGFpbnREb2N1bWVudE1hcmtlcnMocGFpbnRJbmZvLmNvbnRleHQs
IHhPcmlnaW4sIHlPcmlnaW4sIHN0eWxlLCBmb250LCB0cnVlKTsKIAotICAgIFNWR0NoYXImIGNo
YXJBdFBvcyA9ICpjaGFyQXRQb3NQdHI7Ci0gICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dFJl
bmRlcmVyKCktPnN0eWxlKG1fZmlyc3RMaW5lKTsKLSAgICBGbG9hdFJlY3QgZ2x5cGhSZWN0ID0g
Y2FsY3VsYXRlR2x5cGhCb3VuZGFyaWVzKHN0eWxlLCBvZmZzZXRPZkhpdENoYXJhY3RlciwgY2hh
ckF0UG9zKTsKLQotICAgIC8vIEZJWE1FOiBXaHk/Ci0gICAgaWYgKGRpcmVjdGlvbigpID09IFJU
TCkKLSAgICAgICAgb2Zmc2V0T2ZIaXRDaGFyYWN0ZXIrKzsKLQotICAgIC8vIFRoZSBjYWxsZXIg
YWN0dWFsbHkgdGhlIGNsb3Nlc3Qgb2Zmc2V0IGJlZm9yZS9hZnRlciB0aGUgaGl0IGNoYXIKLSAg
ICAvLyBjbG9zZXN0Q2hhcmFjdGVyVG9Qb3NpdGlvbiByZXR1cm5zIHVzIG9mZnNldE9mSGl0Q2hh
cmFjdGVyLgotICAgIGNsb3Nlc3RPZmZzZXRJbkJveCA9IG9mZnNldE9mSGl0Q2hhcmFjdGVyOwor
ICAgICAgICAgICAgaWYgKGhhc1NlbGVjdGlvbikKKyAgICAgICAgICAgICAgICBwYWludFNlbGVj
dGlvbihwYWludEluZm8uY29udGV4dCwgdGV4dE9yaWdpbiwgc3R5bGUpOworICAgICAgICB9CiAK
LSAgICAvLyBGSVhNRTogKGJ1ZyAxMzkxMCkgVGhpcyBjb2RlIGRvZXMgbm90IGhhbmRsZSBib3R0
b20tdG8tdG9wL3RvcC10by1ib3R0b20gdmVydGljYWwgdGV4dC4KKyAgICAgICAgLy8gU3BlYzog
QWxsIHRleHQgZGVjb3JhdGlvbnMgZXhjZXB0IGxpbmUtdGhyb3VnaCBzaG91bGQgYmUgZHJhd24g
YmVmb3JlIHRoZSB0ZXh0IGlzIGZpbGxlZCBhbmQgc3Ryb2tlZDsgdGh1cywgdGhlIHRleHQgaXMg
cmVuZGVyZWQgb24gdG9wIG9mIHRoZXNlIGRlY29yYXRpb25zLgorICAgICAgICBpbnQgZGVjb3Jh
dGlvbnMgPSBzdHlsZS0+dGV4dERlY29yYXRpb25zSW5FZmZlY3QoKTsKKyAgICAgICAgaWYgKGRl
Y29yYXRpb25zICYgVU5ERVJMSU5FKQorICAgICAgICAgICAgcGFpbnREZWNvcmF0aW9uKHBhaW50
SW5mby5jb250ZXh0LCB0ZXh0T3JpZ2luLCBVTkRFUkxJTkUsIGhhc1NlbGVjdGlvbik7CisgICAg
ICAgIGlmIChkZWNvcmF0aW9ucyAmIE9WRVJMSU5FKQorICAgICAgICAgICAgcGFpbnREZWNvcmF0
aW9uKHBhaW50SW5mby5jb250ZXh0LCB0ZXh0T3JpZ2luLCBPVkVSTElORSwgaGFzU2VsZWN0aW9u
KTsKIAotICAgIC8vIENoZWNrIHdoZXRoZXIgeSBwb3NpdGlvbiBoaXRzIHRoZSBjdXJyZW50IGNo
YXJhY3RlciAKLSAgICBpZiAoeSA8IGNoYXJBdFBvcy55IC0gZ2x5cGhSZWN0LmhlaWdodCgpIHx8
IHkgPiBjaGFyQXRQb3MueSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBGaWxs
IHRleHQKKyAgICAgICAgaWYgKGhhc0ZpbGwpIHsKKyAgICAgICAgICAgIG1fcGFpbnRpbmdSZXNv
dXJjZU1vZGUgPSBBcHBseVRvRmlsbE1vZGUgfCBBcHBseVRvVGV4dE1vZGU7CisgICAgICAgICAg
ICBwYWludFRleHQocGFpbnRJbmZvLmNvbnRleHQsIHRleHRPcmlnaW4sIHN0eWxlLCBzZWxlY3Rp
b25TdHlsZSwgaGFzU2VsZWN0aW9uKTsKKyAgICAgICAgfQogCi0gICAgLy8gQ2hlY2sgd2hldGhl
ciB4IHBvc2l0aW9uIGhpdHMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCi0gICAgaWYgKHggPCBjaGFy
QXRQb3MueCkgewotICAgICAgICBpZiAoY2xvc2VzdE9mZnNldEluQm94ID4gMCAmJiBkaXJlY3Rp
b24oKSA9PSBMVFIpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGNsb3Nl
c3RPZmZzZXRJbkJveCA8IHN0YXRpY19jYXN0PGludD4oZW5kKCkpICYmIGRpcmVjdGlvbigpID09
IFJUTCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAvLyBTdHJva2UgdGV4dAor
ICAgICAgICBpZiAoaGFzU3Ryb2tlKSB7CisgICAgICAgICAgICBtX3BhaW50aW5nUmVzb3VyY2VN
b2RlID0gQXBwbHlUb1N0cm9rZU1vZGUgfCBBcHBseVRvVGV4dE1vZGU7CisgICAgICAgICAgICBw
YWludFRleHQocGFpbnRJbmZvLmNvbnRleHQsIHRleHRPcmlnaW4sIHN0eWxlLCBzZWxlY3Rpb25T
dHlsZSwgaGFzU2VsZWN0aW9uKTsKKyAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgLy8gU3BlYzogTGluZS10aHJvdWdoIHNob3VsZCBiZSBkcmF3biBhZnRlciB0aGUg
dGV4dCBpcyBmaWxsZWQgYW5kIHN0cm9rZWQ7IHRodXMsIHRoZSBsaW5lLXRocm91Z2ggaXMgcmVu
ZGVyZWQgb24gdG9wIG9mIHRoZSB0ZXh0LgorICAgICAgICBpZiAoZGVjb3JhdGlvbnMgJiBMSU5F
X1RIUk9VR0gpCisgICAgICAgICAgICBwYWludERlY29yYXRpb24ocGFpbnRJbmZvLmNvbnRleHQs
IHRleHRPcmlnaW4sIExJTkVfVEhST1VHSCwgaGFzU2VsZWN0aW9uKTsKKworICAgICAgICAvLyBQ
YWludCBkb2N1bWVudCBtYXJrZXJzCisgICAgICAgIC8vIEZJWE1FOiBwYWludERvY3VtZW50TWFy
a2VycyhwYWludEluZm8uY29udGV4dCwgeE9yaWdpbiwgeU9yaWdpbiwgc3R5bGUsIGZvbnQsIGZh
bHNlKTsKKworICAgICAgICBtX3BhaW50aW5nUmVzb3VyY2VNb2RlID0gQXBwbHlUb0RlZmF1bHRN
b2RlOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOwogICAgIH0KIAotICAg
IC8vIEFkanVzdCB0aGUgY2xvc2VzdCBvZmZzZXQgdG8gYWZ0ZXIgdGhlIGNoYXIgaWYgeCB3YXMg
YWZ0ZXIgdGhlIGNoYXIgbWlkcG9pbnQKLSAgICBpZiAoeCA+PSBjaGFyQXRQb3MueCArIGdseXBo
UmVjdC53aWR0aCgpIC8gMi4wKQotICAgICAgICBjbG9zZXN0T2Zmc2V0SW5Cb3ggKz0gZGlyZWN0
aW9uKCkgPT0gUlRMID8gLTEgOiAxOworICAgIG1fY3VycmVudENodW5rUGFydCA9IFNWR1RleHRD
aHVua1BhcnQoKTsKKyAgICBBU1NFUlQoIW1fcGFpbnRpbmdSZXNvdXJjZSk7Cit9CisKK2Jvb2wg
U1ZHSW5saW5lVGV4dEJveDo6YWNxdWlyZVBhaW50aW5nUmVzb3VyY2UoR3JhcGhpY3NDb250ZXh0
KiYgY29udGV4dCwgUmVuZGVyU3R5bGUqIHN0eWxlKQoreworICAgIEFTU0VSVChtX3BhaW50aW5n
UmVzb3VyY2VNb2RlICE9IEFwcGx5VG9EZWZhdWx0TW9kZSk7CisKKyAgICBSZW5kZXJPYmplY3Qq
IHBhcmVudFJlbmRlcmVyID0gcGFyZW50KCktPnJlbmRlcmVyKCk7CisgICAgQVNTRVJUKHBhcmVu
dFJlbmRlcmVyKTsKKworICAgIGlmIChtX3BhaW50aW5nUmVzb3VyY2VNb2RlICYgQXBwbHlUb0Zp
bGxNb2RlKQorICAgICAgICBtX3BhaW50aW5nUmVzb3VyY2UgPSBSZW5kZXJTVkdSZXNvdXJjZTo6
ZmlsbFBhaW50aW5nUmVzb3VyY2UocGFyZW50UmVuZGVyZXIsIHN0eWxlKTsKKyAgICBlbHNlIGlm
IChtX3BhaW50aW5nUmVzb3VyY2VNb2RlICYgQXBwbHlUb1N0cm9rZU1vZGUpCisgICAgICAgIG1f
cGFpbnRpbmdSZXNvdXJjZSA9IFJlbmRlclNWR1Jlc291cmNlOjpzdHJva2VQYWludGluZ1Jlc291
cmNlKHBhcmVudFJlbmRlcmVyLCBzdHlsZSk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIFdlJ3Jl
IGVpdGhlciBjYWxsZWQgZm9yIHN0cm9raW5nIG9yIGZpbGxpbmcuCisgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgIH0KIAotICAgIC8vIElmIHdlIGFyZSBwYXN0IHRoZSBsYXN0IGds
eXBoIG9mIHRoaXMgYm94LCBkb24ndCBtYXJrIGl0IGFzICdoaXQnCi0gICAgaWYgKHggPj0gY2hh
ckF0UG9zLnggKyBnbHlwaFJlY3Qud2lkdGgoKSAmJiBjbG9zZXN0T2Zmc2V0SW5Cb3ggPT0gKGlu
dCkgZW5kKCkpCisgICAgaWYgKCFtX3BhaW50aW5nUmVzb3VyY2UpCiAgICAgICAgIHJldHVybiBm
YWxzZTsKIAorICAgIG1fcGFpbnRpbmdSZXNvdXJjZS0+YXBwbHlSZXNvdXJjZShwYXJlbnRSZW5k
ZXJlciwgc3R5bGUsIGNvbnRleHQsIG1fcGFpbnRpbmdSZXNvdXJjZU1vZGUpOwogICAgIHJldHVy
biB0cnVlOwogfQogCi1pbnQgU1ZHSW5saW5lVGV4dEJveDo6b2Zmc2V0Rm9yUG9zaXRpb24oaW50
LCBib29sKSBjb25zdAordm9pZCBTVkdJbmxpbmVUZXh0Qm94OjpyZWxlYXNlUGFpbnRpbmdSZXNv
dXJjZShHcmFwaGljc0NvbnRleHQqJiBjb250ZXh0KQogewotICAgIC8vIFNWRyBkb2Vzbid0IHVz
ZSB0aGUgb2Zmc2V0IDwtPiBwb3NpdGlvbiBzZWxlY3Rpb24gc3lzdGVtLiAKLSAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsKLX0KKyAgICBBU1NFUlQobV9wYWludGluZ1Jl
c291cmNlKTsKIAotaW50IFNWR0lubGluZVRleHRCb3g6OnBvc2l0aW9uRm9yT2Zmc2V0KGludCkg
Y29uc3QKLXsKLSAgICAvLyBTVkcgZG9lc24ndCB1c2UgdGhlIG9mZnNldCA8LT4gcG9zaXRpb24g
c2VsZWN0aW9uIHN5c3RlbS4gCi0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJu
IDA7CisgICAgUmVuZGVyT2JqZWN0KiBwYXJlbnRSZW5kZXJlciA9IHBhcmVudCgpLT5yZW5kZXJl
cigpOworICAgIEFTU0VSVChwYXJlbnRSZW5kZXJlcik7CisKKyAgICBtX3BhaW50aW5nUmVzb3Vy
Y2UtPnBvc3RBcHBseVJlc291cmNlKHBhcmVudFJlbmRlcmVyLCBjb250ZXh0LCBtX3BhaW50aW5n
UmVzb3VyY2VNb2RlKTsKKyAgICBtX3BhaW50aW5nUmVzb3VyY2UgPSAwOwogfQogCi1ib29sIFNW
R0lubGluZVRleHRCb3g6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVz
dFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KQorYm9vbCBTVkdJ
bmxpbmVUZXh0Qm94OjpwcmVwYXJlR3JhcGhpY3NDb250ZXh0Rm9yVGV4dFBhaW50aW5nKEdyYXBo
aWNzQ29udGV4dComIGNvbnRleHQsIFRleHRSdW4mIHRleHRSdW4sIFJlbmRlclN0eWxlKiBzdHls
ZSkKIHsKLSAgICBBU1NFUlQoIWlzTGluZUJyZWFrKCkpOworICAgIGJvb2wgYWNxdWlyZWRSZXNv
dXJjZSA9IGFjcXVpcmVQYWludGluZ1Jlc291cmNlKGNvbnRleHQsIHN0eWxlKTsKIAotICAgIElu
dFJlY3QgcmVjdCA9IHNlbGVjdGlvblJlY3QoMCwgMCwgMCwgbGVuKCkpOwotICAgIGlmIChyZW5k
ZXJlcigpLT5zdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSAmJiByZWN0LmNvbnRhaW5z
KHgsIHkpKSB7Ci0gICAgICAgIHJlbmRlcmVyKCktPnVwZGF0ZUhpdFRlc3RSZXN1bHQocmVzdWx0
LCBJbnRQb2ludCh4IC0gdHgsIHkgLSB0eSkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9
CisjaWYgRU5BQkxFKFNWR19GT05UUykKKyAgICAvLyBTVkcgRm9udHMgbmVlZCBhY2Nlc3MgdG8g
dGhlIHBhaW50aW5nIHJlc291cmNlIHVzZWQgdG8gZHJhdyB0aGUgY3VycmVudCB0ZXh0IGNodW5r
LgorICAgIGlmIChhY3F1aXJlZFJlc291cmNlKQorICAgICAgICB0ZXh0UnVuLnNldEFjdGl2ZVBh
aW50aW5nUmVzb3VyY2UobV9wYWludGluZ1Jlc291cmNlKTsKKyNlbmRpZgogCi0gICAgcmV0dXJu
IGZhbHNlOworICAgIHJldHVybiBhY3F1aXJlZFJlc291cmNlOwogfQogCi1JbnRSZWN0IFNWR0lu
bGluZVRleHRCb3g6OnNlbGVjdGlvblJlY3QoaW50LCBpbnQsIGludCBzdGFydFBvcywgaW50IGVu
ZFBvcykKK3ZvaWQgU1ZHSW5saW5lVGV4dEJveDo6cmVzdG9yZUdyYXBoaWNzQ29udGV4dEFmdGVy
VGV4dFBhaW50aW5nKEdyYXBoaWNzQ29udGV4dComIGNvbnRleHQsIFRleHRSdW4mIHRleHRSdW4p
CiB7Ci0gICAgaWYgKHN0YXJ0UG9zID49IGVuZFBvcykKLSAgICAgICAgcmV0dXJuIEludFJlY3Qo
KTsKLQotICAgIC8vIFRPRE86IEFjdHVhbGx5IHJlc3BlY3Qgc3RhcnRQb3MvZW5kUG9zIC0gd2Un
cmUgcmV0dXJuaW5nIHRoZSBfZnVsbF8gc2VsZWN0aW9uUmVjdAotICAgIC8vIGhlcmUuIFRoaXMg
d29uJ3QgbGVhZCB0byB2aXNpYmxlIGJ1Z3MsIGJ1dCB0byBleHRyYSB3b3JrIGJlaW5nIGRvbmUu
IEludmVzdGlnYXRlLgotICAgIFNWR1Jvb3RJbmxpbmVCb3gqIHJvb3RCb3ggPSBzdmdSb290SW5s
aW5lQm94KCk7Ci0gICAgaWYgKCFyb290Qm94KQotICAgICAgICByZXR1cm4gSW50UmVjdCgpOwor
ICAgIHJlbGVhc2VQYWludGluZ1Jlc291cmNlKGNvbnRleHQpOwogCi0gICAgU1ZHSW5saW5lVGV4
dEJveFNlbGVjdGlvblJlY3RXYWxrZXIgd2Fsa2VyQ2FsbGJhY2s7Ci0gICAgU1ZHVGV4dENodW5r
V2Fsa2VyPFNWR0lubGluZVRleHRCb3hTZWxlY3Rpb25SZWN0V2Fsa2VyPiB3YWxrZXIoJndhbGtl
ckNhbGxiYWNrLCAmU1ZHSW5saW5lVGV4dEJveFNlbGVjdGlvblJlY3RXYWxrZXI6OmNodW5rUG9y
dGlvbkNhbGxiYWNrKTsKKyNpZiBFTkFCTEUoU1ZHX0ZPTlRTKQorICAgIHRleHRSdW4uc2V0QWN0
aXZlUGFpbnRpbmdSZXNvdXJjZSgwKTsKKyNlbmRpZgorfQogCi0gICAgcm9vdEJveC0+d2Fsa1Rl
eHRDaHVua3MoJndhbGtlciwgdGhpcyk7Ci0gICAgcmV0dXJuIGVuY2xvc2luZ0ludFJlY3Qod2Fs
a2VyQ2FsbGJhY2suc2VsZWN0aW9uUmVjdCgpKTsKK1RleHRSdW4gU1ZHSW5saW5lVGV4dEJveDo6
Y29uc3RydWN0VGV4dFJ1bihSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgQVNTRVJU
KG1fY3VycmVudENodW5rUGFydC5pc1ZhbGlkKCkpOworICAgIHJldHVybiBzdmdUZXh0UnVuRm9y
SW5saW5lVGV4dEJveCh0ZXh0UmVuZGVyZXIoKS0+dGV4dCgpLT5jaGFyYWN0ZXJzKCkgKyBzdGFy
dCgpICsgbV9jdXJyZW50Q2h1bmtQYXJ0Lm9mZnNldCwgbV9jdXJyZW50Q2h1bmtQYXJ0Lmxlbmd0
aCwgc3R5bGUsIHRoaXMpOwogfQogCi1ib29sIFNWR0lubGluZVRleHRCb3g6OmNodW5rU2VsZWN0
aW9uU3RhcnRFbmQoY29uc3QgVUNoYXIqIGNodW5rLCBpbnQgY2h1bmtMZW5ndGgsIGludCYgc2Vs
ZWN0aW9uU3RhcnQsIGludCYgc2VsZWN0aW9uRW5kKQordm9pZCBTVkdJbmxpbmVUZXh0Qm94Ojpt
YXBTdGFydEVuZFBvc2l0aW9uc0ludG9DaHVua1BhcnRDb29yZGluYXRlcyhpbnQmIHN0YXJ0UG9z
LCBpbnQmIGVuZFBvcywgY29uc3QgU1ZHVGV4dENodW5rUGFydCYgcGFydCkgY29uc3QKIHsKLSAg
ICAvLyBOT1RFOiBXZSBpZ25vcmUgU1ZHSW5saW5lVGV4dEJveDo6bV9zdGFydCBoZXJlIGJlY2F1
c2UgaXQgaXMgYWx3YXlzIDAuCi0gICAgLy8gICAgICAgQ3VyZW50bHkgU1ZHIGRvZXNuJ3QgdXNl
IEhUTUwgYmxvY2stbGV2ZWwgbGF5b3V0LCBpbiB3aGljaCBtX3N0YXJ0IHdvdWxkIGJlIHNldC4K
KyAgICBpZiAoc3RhcnRQb3MgPj0gZW5kUG9zKQorICAgICAgICByZXR1cm47CiAKLSAgICBpbnQg
Y2h1bmtTdGFydCA9IGNodW5rIC0gdGV4dFJlbmRlcmVyKCktPmNoYXJhY3RlcnMoKTsKLSAgICBB
U1NFUlQoMCA8PSBjaHVua1N0YXJ0KTsgICAgCisgICAgLy8gVGFrZSA8dGV4dCB4PSIxMCA1MCAx
MDAiPkFCQzwvdGV4dD4gYXMgZXhhbXBsZS4gV2UncmUgY2FsbGVkIHRocmVlIHRpbWVzIGZyb20g
cGFpbnQoKSwgYmVjYXVzZSBhbGwgYWJzb2x1dGUgcG9zaXRpb25lZAorICAgIC8vIGNoYXJhY3Rl
cnMgYXJlIGRyYXduIG9uIHRoZWlyIG93bi4gRm9yIGVhY2ggb2YgdGhlbSB3ZSB3YW50IHRvIGZp
bmQgb3V0IHdoZWh0ZXIgaXQncyBzZWxlY3RlZC4gc3RhcnRQb3M9MCwgZW5kUG9zPTEKKyAgICAv
LyBjb3VsZCBtZWFuIEEsIEIgb3IgQyBpcyBoaXQsIGRlcGVuZGluZyBvbiB3aGljaCBjaHVuayBw
YXJ0IGlzIHByb2Nlc3NlZCBhdCB0aGUgbW9tZW50LiBXaXRoIHRoZSBvZmZzZXQgJiBsZW5ndGgg
dmFsdWVzCisgICAgLy8gb2YgZWFjaCBjaHVuayBwYXJ0IHdlIGNhbiBlYXNpbHkgZmluZCBvdXQg
d2hpY2ggb25lIGlzIG1lYW50IHRvIGJlIHNlbGVjdGVkLiBCYWlsIG91dCBmb3IgdGhlIG90aGVy
IGNodW5rIHBhcnRzLgorICAgIC8vIElmIHN0YXJQb3MgaXMgYmVoaW5kIHRoZSBjdXJyZW50IGNo
dW5rIG9yIHRoZSBlbmRQb3MgZW5kcyBiZWZvcmUgdGhpcyB0ZXh0IGNodW5rIHBhcnQsIHdlJ3Jl
IG5vdCBtZWFudCB0byBiZSBzZWxlY3RlZC4KKyAgICBpZiAoc3RhcnRQb3MgPj0gcGFydC5vZmZz
ZXQgKyBwYXJ0Lmxlbmd0aCB8fCBlbmRQb3MgPD0gcGFydC5vZmZzZXQpIHsKKyAgICAgICAgc3Rh
cnRQb3MgPSAwOworICAgICAgICBlbmRQb3MgPSAtMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
IAotICAgIHNlbGVjdGlvblN0YXJ0RW5kKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOwot
ICAgIGlmIChzZWxlY3Rpb25FbmQgPD0gY2h1bmtTdGFydCkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIGlmIChjaHVua1N0YXJ0ICsgY2h1bmtMZW5ndGggPD0gc2VsZWN0aW9uU3RhcnQpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBUaGUgY3VycmVudCBwcm9jZXNzZWQgY2h1bmsg
cGFydCBpcyBoaXQuIFdoZW4gcGFpbnRpbmcgdGhlIHNlbGVjdGlvbiwgY29uc3RydWN0VGV4dFJ1
bigpIGJ1aWxkcworICAgIC8vIGEgVGV4dFJ1biBvYmplY3Qgd2hvc2Ugc3RhcnRQb3MgaXMgMCBh
bmQgZW5kUG9zIGlzIGNodW5rIHBhcnQgbGVuZ3RoLiBUaGUgY29kZSBiZWxvdyBtYXBzIHRoZSBp
bmNvbWluZworICAgIC8vIHN0YXJ0UG9zL2VuZFBvcyByYW5nZSBpbnRvIGEgWzAsIHBhcnQgbGVu
Z3RoXSBjb29yZGluYXRlIHN5c3RlbSwgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY2h1bmsgcGFy
dC4KKyAgICBpZiAoc3RhcnRQb3MgPCBwYXJ0Lm9mZnNldCkKKyAgICAgICAgc3RhcnRQb3MgPSAw
OworICAgIGVsc2UKKyAgICAgICAgc3RhcnRQb3MgLT0gcGFydC5vZmZzZXQ7CiAKLSAgICAvLyBN
YXAgaW5kaWNlcyBmcm9tIHZpZXctZ2xvYmFsIHRvIGNodW5rLWxvY2FsLgotICAgIHNlbGVjdGlv
blN0YXJ0IC09IGNodW5rU3RhcnQ7Ci0gICAgc2VsZWN0aW9uRW5kIC09IGNodW5rU3RhcnQ7Ci0g
ICAgLy8gVGhlbiBjbGFtcCB3aXRoIGNodW5rIHJhbmdlCi0gICAgaWYgKHNlbGVjdGlvblN0YXJ0
IDwgMCkKLSAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSAwOwotICAgIGlmIChjaHVua0xlbmd0aCA8
IHNlbGVjdGlvbkVuZCkKLSAgICAgICAgc2VsZWN0aW9uRW5kID0gY2h1bmtMZW5ndGg7CisgICAg
aWYgKGVuZFBvcyA+IHBhcnQub2Zmc2V0ICsgcGFydC5sZW5ndGgpCisgICAgICAgIGVuZFBvcyA9
IHBhcnQubGVuZ3RoOworICAgIGVsc2UgeworICAgICAgICBBU1NFUlQoZW5kUG9zID49IHBhcnQu
b2Zmc2V0KTsKKyAgICAgICAgZW5kUG9zIC09IHBhcnQub2Zmc2V0OworICAgIH0KIAotICAgIHJl
dHVybiBzZWxlY3Rpb25TdGFydCA8IHNlbGVjdGlvbkVuZDsKKyAgICBBU1NFUlQoc3RhcnRQb3Mg
PCBlbmRQb3MpOwogfQogCi12b2lkIFNWR0lubGluZVRleHRCb3g6OnBhaW50Q2hhcmFjdGVycyhS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSwgY29uc3Qg
U1ZHQ2hhciYgc3ZnQ2hhciwgY29uc3QgVUNoYXIqIGNoYXJzLCBpbnQgbGVuZ3RoLCBTVkdUZXh0
UGFpbnRJbmZvJiB0ZXh0UGFpbnRJbmZvKQordm9pZCBTVkdJbmxpbmVUZXh0Qm94OjpzZWxlY3Rp
b25TdGFydEVuZChpbnQmIHN0YXJ0UG9zLCBpbnQmIGVuZFBvcykKIHsKLSAgICBpZiAocmVuZGVy
ZXIoKS0+c3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUgfHwgcGFpbnRJbmZvLnBoYXNl
ID09IFBhaW50UGhhc2VPdXRsaW5lKQorICAgIElubGluZVRleHRCb3g6OnNlbGVjdGlvblN0YXJ0
RW5kKHN0YXJ0UG9zLCBlbmRQb3MpOworCisgICAgaWYgKCFtX2N1cnJlbnRDaHVua1BhcnQuaXNW
YWxpZCgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBBU1NFUlQocGFpbnRJbmZvLnBoYXNlICE9
IFBhaW50UGhhc2VTZWxmT3V0bGluZSAmJiBwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUNo
aWxkT3V0bGluZXMpOworICAgIG1hcFN0YXJ0RW5kUG9zaXRpb25zSW50b0NodW5rUGFydENvb3Jk
aW5hdGVzKHN0YXJ0UG9zLCBlbmRQb3MsIG1fY3VycmVudENodW5rUGFydCk7Cit9CiAKLSAgICBS
ZW5kZXJUZXh0KiB0ZXh0ID0gdGV4dFJlbmRlcmVyKCk7Ci0gICAgQVNTRVJUKHRleHQpOworc3Rh
dGljIGlubGluZSBmbG9hdCBwb3NpdGlvbk9mZnNldEZvckRlY29yYXRpb24oRVRleHREZWNvcmF0
aW9uIGRlY29yYXRpb24sIGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0IHRoaWNrbmVzcykKK3sKKyAg
ICAvLyBGSVhNRTogRm9yIFNWRyBGb250cyB3ZSBuZWVkIHRvIHVzZSB0aGUgYXR0cmlidXRlcyBk
ZWZpbmVkIGluIHRoZSA8Zm9udC1mYWNlPiBpZiBzcGVjaWZpZWQuCisgICAgLy8gQ29tcGF0aWJs
ZSB3aXRoIEJhdGlrL09wZXJhLgorICAgIGlmIChkZWNvcmF0aW9uID09IFVOREVSTElORSkKKyAg
ICAgICAgcmV0dXJuIGZvbnQuYXNjZW50KCkgKyB0aGlja25lc3MgKiAxLjVmOworICAgIGlmIChk
ZWNvcmF0aW9uID09IE9WRVJMSU5FKQorICAgICAgICByZXR1cm4gdGhpY2tuZXNzOworICAgIGlm
IChkZWNvcmF0aW9uID09IExJTkVfVEhST1VHSCkKKyAgICAgICAgcmV0dXJuIGZvbnQuYXNjZW50
KCkgKiA1LjBmIC8gOC4wZjsKIAotICAgIGJvb2wgaXNQcmludGluZyA9IHRleHQtPmRvY3VtZW50
KCktPnByaW50aW5nKCk7CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDAu
MGY7Cit9CiAKLSAgICAvLyBEZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2UncmUgc2VsZWN0ZWQu
Ci0gICAgYm9vbCBoYXZlU2VsZWN0aW9uID0gIWlzUHJpbnRpbmcgJiYgc2VsZWN0aW9uU3RhdGUo
KSAhPSBSZW5kZXJPYmplY3Q6OlNlbGVjdGlvbk5vbmU7Ci0gICAgaWYgKCFoYXZlU2VsZWN0aW9u
ICYmIHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlU2VsZWN0aW9uKQotICAgICAgICAvLyBX
aGVuIG9ubHkgcGFpbnRpbmcgdGhlIHNlbGVjdGlvbiwgZG9uJ3QgYm90aGVyIHRvIHBhaW50IGlm
IHRoZXJlIGlzIG5vbmUuCi0gICAgICAgIHJldHVybjsKK3N0YXRpYyBpbmxpbmUgZmxvYXQgdGhp
Y2tuZXNzRm9yRGVjb3JhdGlvbihFVGV4dERlY29yYXRpb24sIGNvbnN0IEZvbnQmIGZvbnQpCit7
CisgICAgLy8gRklYTUU6IEZvciBTVkcgRm9udHMgd2UgbmVlZCB0byB1c2UgdGhlIGF0dHJpYnV0
ZXMgZGVmaW5lZCBpbiB0aGUgPGZvbnQtZmFjZT4gaWYgc3BlY2lmaWVkLgorICAgIC8vIENvbXBh
dGlibGUgd2l0aCBCYXRpay9PcGVyYQorICAgIHJldHVybiBmb250LnNpemUoKSAvIDIwLjBmOwor
fQorIAorc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGZpbmRSZW5kZXJPYmplY3REZWZpbmlu
aW5nVGV4dERlY29yYXRpb24oSW5saW5lRmxvd0JveCogcGFyZW50Qm94LCBFVGV4dERlY29yYXRp
b24gZGVjb3JhdGlvbikKK3sKKyAgICAvLyBMb29rdXAgcmVuZGVyIG9iamVjdCB3aGljaCBoYXMg
dGV4dC1kZWNvcmF0aW9uIHNldC4KKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gMDsKKyAg
ICB3aGlsZSAocGFyZW50Qm94KSB7CisgICAgICAgIHJlbmRlcmVyID0gcGFyZW50Qm94LT5yZW5k
ZXJlcigpOwogCi0gICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIGhhdmUgYSBjb21w
b3NpdGlvbi4KLSAgICBib29sIGNvbnRhaW5zQ29tcG9zaXRpb24gPSB0ZXh0LT5kb2N1bWVudCgp
LT5mcmFtZSgpLT5lZGl0b3IoKS0+Y29tcG9zaXRpb25Ob2RlKCkgPT0gdGV4dC0+bm9kZSgpOwot
ICAgIGJvb2wgdXNlQ3VzdG9tVW5kZXJsaW5lcyA9IGNvbnRhaW5zQ29tcG9zaXRpb24gJiYgdGV4
dC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+ZWRpdG9yKCktPmNvbXBvc2l0aW9uVXNlc0N1c3RvbVVu
ZGVybGluZXMoKTsKLQotICAgIC8vIFNldCBvdXIgZm9udAotICAgIFJlbmRlclN0eWxlKiBzdHls
ZVRvVXNlID0gdGV4dC0+c3R5bGUoaXNGaXJzdExpbmVTdHlsZSgpKTsKLSAgICBjb25zdCBGb250
JiBmb250ID0gc3R5bGVUb1VzZS0+Zm9udCgpOwotCi0gICAgQWZmaW5lVHJhbnNmb3JtIGN0bSA9
IHN2Z0NoYXIuY2hhcmFjdGVyVHJhbnNmb3JtKCk7Ci0gICAgaWYgKCFjdG0uaXNJZGVudGl0eSgp
KQotICAgICAgICBwYWludEluZm8uY29udGV4dC0+Y29uY2F0Q1RNKGN0bSk7Ci0KLSAgICAvLyAx
LiBQYWludCBiYWNrZ3JvdW5kcyBiZWhpbmQgdGV4dCBpZiBuZWVkZWQuICBFeGFtcGxlcyBvZiBz
dWNoIGJhY2tncm91bmRzIGluY2x1ZGUgc2VsZWN0aW9uCi0gICAgLy8gYW5kIG1hcmtlZCB0ZXh0
LgotICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGVjdGlvbiAmJiAhaXNQ
cmludGluZyAmJiB0ZXh0UGFpbnRJbmZvLnN1YnBoYXNlID09IFNWR1RleHRQYWludFN1YnBoYXNl
QmFja2dyb3VuZCkgewotI2lmIFBMQVRGT1JNKE1BQykKLSAgICAgICAgLy8gQ3VzdG9tIGhpZ2hs
aWdodGVycyBnbyBiZWhpbmQgZXZlcnl0aGluZyBlbHNlLgotICAgICAgICBpZiAoc3R5bGVUb1Vz
ZS0+aGlnaGxpZ2h0KCkgIT0gbnVsbEF0b20gJiYgIXBhaW50SW5mby5jb250ZXh0LT5wYWludGlu
Z0Rpc2FibGVkKCkpCi0gICAgICAgICAgICBwYWludEN1c3RvbUhpZ2hsaWdodCh0eCwgdHksIHN0
eWxlVG9Vc2UtPmhpZ2hsaWdodCgpKTsKLSNlbmRpZgorICAgICAgICAvLyBFeHBsaWNpdGVseSBj
aGVjayB0ZXh0RGVjb3JhdGlvbigpIG5vdCB0ZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCgpLCB3aGlj
aCBpcyBpbmhlcml0ZWQgdG8KKyAgICAgICAgLy8gY2hpbGRyZW4sIGFzIHdlIHdhbnQgdG8gbG9v
a3VwIHRoZSByZW5kZXIgb2JqZWN0IHdob3NlIHN0eWxlIGRlZmluZWQgdGhlIHRleHQtZGVjb3Jh
dGlvbi4KKyAgICAgICAgaWYgKHJlbmRlcmVyLT5zdHlsZSgpICYmIHJlbmRlcmVyLT5zdHlsZSgp
LT50ZXh0RGVjb3JhdGlvbigpICYgZGVjb3JhdGlvbikKKyAgICAgICAgICAgIGJyZWFrOwogCi0g
ICAgICAgIGlmIChjb250YWluc0NvbXBvc2l0aW9uICYmICF1c2VDdXN0b21VbmRlcmxpbmVzKQot
ICAgICAgICAgICAgcGFpbnRDb21wb3NpdGlvbkJhY2tncm91bmQocGFpbnRJbmZvLmNvbnRleHQs
IHR4LCB0eSwgc3R5bGVUb1VzZSwgZm9udCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0ZXh0LT5kb2N1bWVudCgpLT5mcmFtZSgpLT5lZGl0b3IoKS0+Y29tcG9zaXRp
b25TdGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC0+
ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+ZWRpdG9yKCktPmNvbXBvc2l0aW9uRW5kKCkpOwotICAgICAg
ICAKLSAgICAgICAgcGFpbnREb2N1bWVudE1hcmtlcnMocGFpbnRJbmZvLmNvbnRleHQsIHR4LCB0
eSwgc3R5bGVUb1VzZSwgZm9udCwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKGhhdmVTZWxlY3Rpb24g
JiYgIXVzZUN1c3RvbVVuZGVybGluZXMpIHsKLSAgICAgICAgICAgIGludCBib3hTdGFydE9mZnNl
dCA9IGNoYXJzIC0gdGV4dC0+Y2hhcmFjdGVycygpIC0gc3RhcnQoKTsKLSAgICAgICAgICAgIHBh
aW50U2VsZWN0aW9uKGJveFN0YXJ0T2Zmc2V0LCBzdmdDaGFyLCBjaGFycywgbGVuZ3RoLCBwYWlu
dEluZm8uY29udGV4dCwgc3R5bGVUb1VzZSwgZm9udCk7Ci0gICAgICAgIH0KKyAgICAgICAgcGFy
ZW50Qm94ID0gcGFyZW50Qm94LT5wYXJlbnQoKTsKICAgICB9CiAKLSAgICBib29sIGlzR2x5cGhQ
aGFzZSA9IHRleHRQYWludEluZm8uc3VicGhhc2UgPT0gU1ZHVGV4dFBhaW50U3VicGhhc2VHbHlw
aEZpbGwgfHwgdGV4dFBhaW50SW5mby5zdWJwaGFzZSA9PSBTVkdUZXh0UGFpbnRTdWJwaGFzZUds
eXBoU3Ryb2tlOwotICAgIGJvb2wgaXNTZWxlY3Rpb25HbHlwaFBoYXNlID0gdGV4dFBhaW50SW5m
by5zdWJwaGFzZSA9PSBTVkdUZXh0UGFpbnRTdWJwaGFzZUdseXBoRmlsbFNlbGVjdGlvbiB8fCB0
ZXh0UGFpbnRJbmZvLnN1YnBoYXNlID09IFNWR1RleHRQYWludFN1YnBoYXNlR2x5cGhTdHJva2VT
ZWxlY3Rpb247Ci0KLSAgICBpZiAgKGlzR2x5cGhQaGFzZSB8fCBpc1NlbGVjdGlvbkdseXBoUGhh
c2UpIHsKLSAgICAgICAgLy8gU2V0IGEgdGV4dCBzaGFkb3cgaWYgd2UgaGF2ZSBvbmUuCi0gICAg
ICAgIC8vIEZJWE1FOiBTdXBwb3J0IG11bHRpcGxlIHNoYWRvdyBlZmZlY3RzLiAgU2VlIGhvdyBp
dCdzIGRvbmUgaW4gSW5saW5lVGV4dEJveC5jcHAuCi0gICAgICAgIGJvb2wgc2V0U2hhZG93ID0g
ZmFsc2U7Ci0gICAgICAgIGlmIChzdHlsZVRvVXNlLT50ZXh0U2hhZG93KCkpIHsKLSAgICAgICAg
ICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTaGFkb3coSW50U2l6ZShzdHlsZVRvVXNlLT50ZXh0
U2hhZG93KCktPngoKSwgc3R5bGVUb1VzZS0+dGV4dFNoYWRvdygpLT55KCkpLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVRvVXNlLT50ZXh0U2hhZG93KCkt
PmJsdXIoKSwgc3R5bGVUb1VzZS0+dGV4dFNoYWRvdygpLT5jb2xvcigpLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVRvVXNlLT5jb2xvclNwYWNlKCkpOwot
ICAgICAgICAgICAgc2V0U2hhZG93ID0gdHJ1ZTsKLSAgICAgICAgfQorICAgIEFTU0VSVChyZW5k
ZXJlcik7CisgICAgcmV0dXJuIHJlbmRlcmVyOworfQogCi0gICAgICAgIEludFBvaW50IG9yaWdp
bigoaW50KSBzdmdDaGFyLngsIChpbnQpIHN2Z0NoYXIueSk7Ci0gICAgICAgIFRleHRSdW4gcnVu
ID0gc3ZnVGV4dFJ1bkZvcklubGluZVRleHRCb3goY2hhcnMsIGxlbmd0aCwgc3R5bGVUb1VzZSwg
dGhpcywgc3ZnQ2hhci54KTsKK3ZvaWQgU1ZHSW5saW5lVGV4dEJveDo6cGFpbnREZWNvcmF0aW9u
KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgRmxvYXRQb2ludCYgdGV4dE9yaWdpbiwg
RVRleHREZWNvcmF0aW9uIGRlY29yYXRpb24sIGJvb2wgaGFzU2VsZWN0aW9uKQoreworICAgIC8v
IEZpbmQgb3V0IHdoaWNoIHJlbmRlciBzdHlsZSBkZWZpbmVkIHRoZSB0ZXh0LWRlY29yYXRpb24s
IGFzIGl0cyBmaWxsL3N0cm9rZSBwcm9wZXJ0aWVzIGhhdmUgdG8gYmUgdXNlZCBmb3IgZHJhd2lu
ZyBpbnN0ZWFkIG9mIG91cnMuCisgICAgUmVuZGVyT2JqZWN0KiBkZWNvcmF0aW9uUmVuZGVyZXIg
PSBmaW5kUmVuZGVyT2JqZWN0RGVmaW5pbmluZ1RleHREZWNvcmF0aW9uKHBhcmVudCgpLCBkZWNv
cmF0aW9uKTsKKyAgICBSZW5kZXJTdHlsZSogZGVjb3JhdGlvblN0eWxlID0gZGVjb3JhdGlvblJl
bmRlcmVyLT5zdHlsZSgpOworICAgIEFTU0VSVChkZWNvcmF0aW9uU3R5bGUpOwogCi0jaWYgRU5B
QkxFKFNWR19GT05UUykKLSAgICAgICAgLy8gU1ZHIEZvbnRzIG5lZWQgYWNjZXNzIHRvIHRoZSBw
YWludGluZyByZXNvdXJjZSB1c2VkIHRvIGRyYXcgdGhlIGN1cnJlbnQgdGV4dCBjaHVuay4KLSAg
ICAgICAgQVNTRVJUKHRleHRQYWludEluZm8uYWN0aXZlUGFpbnRpbmdSZXNvdXJjZSk7Ci0gICAg
ICAgIHJ1bi5zZXRBY3RpdmVQYWludGluZ1Jlc291cmNlKHRleHRQYWludEluZm8uYWN0aXZlUGFp
bnRpbmdSZXNvdXJjZSk7Ci0jZW5kaWYKKyAgICBjb25zdCBTVkdSZW5kZXJTdHlsZSogc3ZnRGVj
b3JhdGlvblN0eWxlID0gZGVjb3JhdGlvblN0eWxlLT5zdmdTdHlsZSgpOworICAgIEFTU0VSVChz
dmdEZWNvcmF0aW9uU3R5bGUpOwogCi0gICAgICAgIGludCBzZWxlY3Rpb25TdGFydCA9IDA7Ci0g
ICAgICAgIGludCBzZWxlY3Rpb25FbmQgPSAwOwotICAgICAgICBib29sIGhhdmVTZWxlY3RlZFJh
bmdlID0gaGF2ZVNlbGVjdGlvbiAmJiBjaHVua1NlbGVjdGlvblN0YXJ0RW5kKGNoYXJzLCBsZW5n
dGgsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOwotICAgICAgICAKLSAgICAgICAgaWYg
KGlzR2x5cGhQaGFzZSkgewotICAgICAgICAgICAgaWYgKGhhdmVTZWxlY3RlZFJhbmdlKSB7Ci0g
ICAgICAgICAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdUZXh0KGZvbnQsIHJ1biwgb3Jp
Z2luLCAwLCBzZWxlY3Rpb25TdGFydCk7Ci0gICAgICAgICAgICAgICAgcGFpbnRJbmZvLmNvbnRl
eHQtPmRyYXdUZXh0KGZvbnQsIHJ1biwgb3JpZ2luLCBzZWxlY3Rpb25FbmQsIHJ1bi5sZW5ndGgo
KSk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBwYWludEluZm8uY29udGV4
dC0+ZHJhd1RleHQoZm9udCwgcnVuLCBvcmlnaW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgQVNTRVJUKGlzU2VsZWN0aW9uR2x5cGhQaGFzZSk7Ci0gICAgICAgICAgICBpZiAoaGF2
ZVNlbGVjdGVkUmFuZ2UpCi0gICAgICAgICAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdU
ZXh0KGZvbnQsIHJ1biwgb3JpZ2luLCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmIChzZXRTaGFkb3cpCi0gICAgICAgICAgICBwYWludEluZm8u
Y29udGV4dC0+Y2xlYXJTaGFkb3coKTsKLSAgICB9Ci0KLSAgICBpZiAocGFpbnRJbmZvLnBoYXNl
ICE9IFBhaW50UGhhc2VTZWxlY3Rpb24gJiYgdGV4dFBhaW50SW5mby5zdWJwaGFzZSA9PSBTVkdU
ZXh0UGFpbnRTdWJwaGFzZUZvcmVncm91bmQpIHsKLSAgICAgICAgcGFpbnREb2N1bWVudE1hcmtl
cnMocGFpbnRJbmZvLmNvbnRleHQsIHR4LCB0eSwgc3R5bGVUb1VzZSwgZm9udCwgZmFsc2UpOwot
Ci0gICAgICAgIGlmICh1c2VDdXN0b21VbmRlcmxpbmVzKSB7Ci0gICAgICAgICAgICBjb25zdCBW
ZWN0b3I8Q29tcG9zaXRpb25VbmRlcmxpbmU+JiB1bmRlcmxpbmVzID0gdGV4dC0+ZG9jdW1lbnQo
KS0+ZnJhbWUoKS0+ZWRpdG9yKCktPmN1c3RvbUNvbXBvc2l0aW9uVW5kZXJsaW5lcygpOwotICAg
ICAgICAgICAgc2l6ZV90IG51bVVuZGVybGluZXMgPSB1bmRlcmxpbmVzLnNpemUoKTsKLSAgICAg
ICAgICAgIAotICAgICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IG51bVVu
ZGVybGluZXM7ICsraW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBDb21wb3NpdGlvblVu
ZGVybGluZSYgdW5kZXJsaW5lID0gdW5kZXJsaW5lc1tpbmRleF07Ci0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgaWYgKHVuZGVybGluZS5lbmRPZmZzZXQgPD0gc3RhcnQoKSkKLSAg
ICAgICAgICAgICAgICAgICAgLy8gdW5kZXJsaW5lIGlzIGNvbXBsZXRlbHkgYmVmb3JlIHRoaXMg
cnVuLiAgVGhpcyBtaWdodCBiZSBhbiB1bmRlcmxpbmUgdGhhdCBzaXRzCi0gICAgICAgICAgICAg
ICAgICAgIC8vIGJlZm9yZSB0aGUgZmlyc3QgcnVuIHdlIGRyYXcsIG9yIHVuZGVybGluZXMgdGhh
dCB3ZXJlIHdpdGhpbiBydW5zIHdlIHNraXBwZWQgCi0gICAgICAgICAgICAgICAgICAgIC8vIGR1
ZSB0byB0cnVuY2F0aW9uLgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAodW5kZXJsaW5lLnN0YXJ0T2Zmc2V0IDw9IGVu
ZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHVuZGVybGluZSBpbnRlcnNlY3RzIHRoaXMg
cnVuLiAgUGFpbnQgaXQuCi0gICAgICAgICAgICAgICAgICAgIHBhaW50Q29tcG9zaXRpb25VbmRl
cmxpbmUocGFpbnRJbmZvLmNvbnRleHQsIHR4LCB0eSwgdW5kZXJsaW5lKTsKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKHVuZGVybGluZS5lbmRPZmZzZXQgPiBlbmQoKSArIDEpCi0gICAgICAgICAg
ICAgICAgICAgICAgICAvLyB1bmRlcmxpbmUgYWxzbyBydW5zIGludG8gdGhlIG5leHQgcnVuLiBC
YWlsIG5vdywgbm8gbW9yZSBtYXJrZXIgYWR2YW5jZW1lbnQuCi0gICAgICAgICAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAg
Ly8gdW5kZXJsaW5lIGlzIGNvbXBsZXRlbHkgYWZ0ZXIgdGhpcyBydW4sIGJhaWwuICBBIGxhdGVy
IHJ1biB3aWxsIHBhaW50IGl0LgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICB9CisgICAgYm9vbCBoYXNEZWNvcmF0aW9u
RmlsbCA9IHN2Z0RlY29yYXRpb25TdHlsZS0+aGFzRmlsbCgpOworICAgIGJvb2wgaGFzRGVjb3Jh
dGlvblN0cm9rZSA9IHN2Z0RlY29yYXRpb25TdHlsZS0+aGFzU3Ryb2tlKCk7CiAKLSAgICBpZiAo
IWN0bS5pc0lkZW50aXR5KCkpCi0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5jb25jYXRDVE0o
Y3RtLmludmVyc2UoKSk7Ci19CisgICAgaWYgKGhhc1NlbGVjdGlvbikgeworICAgICAgICBpZiAo
UmVuZGVyU3R5bGUqIHBzZXVkb1N0eWxlID0gZGVjb3JhdGlvblJlbmRlcmVyLT5nZXRDYWNoZWRQ
c2V1ZG9TdHlsZShTRUxFQ1RJT04pKSB7CisgICAgICAgICAgICBkZWNvcmF0aW9uU3R5bGUgPSBw
c2V1ZG9TdHlsZTsKIAotdm9pZCBTVkdJbmxpbmVUZXh0Qm94OjpwYWludFNlbGVjdGlvbihpbnQg
Ym94U3RhcnRPZmZzZXQsIGNvbnN0IFNWR0NoYXImIHN2Z0NoYXIsIGNvbnN0IFVDaGFyKiwgaW50
IGxlbmd0aCwgR3JhcGhpY3NDb250ZXh0KiBwLCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IEZv
bnQmIGZvbnQpCi17Ci0gICAgaWYgKHNlbGVjdGlvblN0YXRlKCkgPT0gUmVuZGVyT2JqZWN0OjpT
ZWxlY3Rpb25Ob25lKQotICAgICAgICByZXR1cm47CisgICAgICAgICAgICBzdmdEZWNvcmF0aW9u
U3R5bGUgPSBkZWNvcmF0aW9uU3R5bGUtPnN2Z1N0eWxlKCk7CisgICAgICAgICAgICBBU1NFUlQo
c3ZnRGVjb3JhdGlvblN0eWxlKTsKIAotICAgIGludCBzdGFydFBvcywgZW5kUG9zOwotICAgIHNl
bGVjdGlvblN0YXJ0RW5kKHN0YXJ0UG9zLCBlbmRQb3MpOworICAgICAgICAgICAgaWYgKCFoYXNE
ZWNvcmF0aW9uRmlsbCkKKyAgICAgICAgICAgICAgICBoYXNEZWNvcmF0aW9uRmlsbCA9IHN2Z0Rl
Y29yYXRpb25TdHlsZS0+aGFzRmlsbCgpOworICAgICAgICAgICAgaWYgKCFoYXNEZWNvcmF0aW9u
U3Ryb2tlKQorICAgICAgICAgICAgICAgIGhhc0RlY29yYXRpb25TdHJva2UgPSBzdmdEZWNvcmF0
aW9uU3R5bGUtPmhhc1N0cm9rZSgpOworICAgICAgICB9CisgICAgfQogCi0gICAgaWYgKHN0YXJ0
UG9zID49IGVuZFBvcykKKyAgICBpZiAoZGVjb3JhdGlvblN0eWxlLT52aXNpYmlsaXR5KCkgPT0g
SElEREVOKQogICAgICAgICByZXR1cm47CiAKLSAgICBDb2xvciB0ZXh0Q29sb3IgPSBzdHlsZS0+
dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Q29sb3IpOwotICAgIENvbG9yIGNvbG9y
ID0gcmVuZGVyZXIoKS0+c2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCk7Ci0gICAgaWYgKCFjb2xv
ci5pc1ZhbGlkKCkgfHwgIWNvbG9yLmFscGhhKCkpCi0gICAgICAgIHJldHVybjsKKyAgICBpZiAo
aGFzRGVjb3JhdGlvbkZpbGwpIHsKKyAgICAgICAgbV9wYWludGluZ1Jlc291cmNlTW9kZSA9IEFw
cGx5VG9GaWxsTW9kZTsKKyAgICAgICAgcGFpbnREZWNvcmF0aW9uV2l0aFN0eWxlKGNvbnRleHQs
IHRleHRPcmlnaW4sIGRlY29yYXRpb25TdHlsZSwgZGVjb3JhdGlvbik7CisgICAgfQogCi0gICAg
Ly8gSWYgdGhlIHRleHQgY29sb3IgZW5kcyB1cCBiZWluZyB0aGUgc2FtZSBhcyB0aGUgc2VsZWN0
aW9uIGJhY2tncm91bmQsIGludmVydCB0aGUgc2VsZWN0aW9uCi0gICAgLy8gYmFja2dyb3VuZC4g
IFRoaXMgc2hvdWxkIGJhc2ljYWxseSBuZXZlciBoYXBwZW4sIHNpbmNlIHRoZSBzZWxlY3Rpb24g
aGFzIHRyYW5zcGFyZW5jeS4KLSAgICBpZiAodGV4dENvbG9yID09IGNvbG9yKQotICAgICAgICBj
b2xvciA9IENvbG9yKDB4ZmYgLSBjb2xvci5yZWQoKSwgMHhmZiAtIGNvbG9yLmdyZWVuKCksIDB4
ZmYgLSBjb2xvci5ibHVlKCkpOwotCi0gICAgLy8gTWFwIGZyb20gdGV4dCBib3ggcG9zaXRpb25z
IGFuZCBhIGdpdmVuIHN0YXJ0IG9mZnNldCB0byBjaHVuayBwb3NpdGlvbnMKLSAgICAvLyAnYm94
U3RhcnRPZmZzZXQnIHJlcHJlc2VudHMgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dCBjaHVuay4K
LSAgICBpZiAoKHN0YXJ0UG9zID4gYm94U3RhcnRPZmZzZXQgJiYgZW5kUG9zID4gYm94U3RhcnRP
ZmZzZXQgKyBsZW5ndGgpIHx8IGJveFN0YXJ0T2Zmc2V0ID49IGVuZFBvcykKLSAgICAgICAgcmV0
dXJuOworICAgIGlmIChoYXNEZWNvcmF0aW9uU3Ryb2tlKSB7CisgICAgICAgIG1fcGFpbnRpbmdS
ZXNvdXJjZU1vZGUgPSBBcHBseVRvU3Ryb2tlTW9kZTsKKyAgICAgICAgcGFpbnREZWNvcmF0aW9u
V2l0aFN0eWxlKGNvbnRleHQsIHRleHRPcmlnaW4sIGRlY29yYXRpb25TdHlsZSwgZGVjb3JhdGlv
bik7CisgICAgfQorfQogCi0gICAgaWYgKGVuZFBvcyA+IGJveFN0YXJ0T2Zmc2V0ICsgbGVuZ3Ro
KQotICAgICAgICBlbmRQb3MgPSBib3hTdGFydE9mZnNldCArIGxlbmd0aDsKK3ZvaWQgU1ZHSW5s
aW5lVGV4dEJveDo6cGFpbnREZWNvcmF0aW9uV2l0aFN0eWxlKEdyYXBoaWNzQ29udGV4dCogY29u
dGV4dCwgY29uc3QgRmxvYXRQb2ludCYgdGV4dE9yaWdpbiwgUmVuZGVyU3R5bGUqIGRlY29yYXRp
b25TdHlsZSwgRVRleHREZWNvcmF0aW9uIGRlY29yYXRpb24pCit7CisgICAgQVNTRVJUKCFtX3Bh
aW50aW5nUmVzb3VyY2UpOworICAgIEFTU0VSVChtX3BhaW50aW5nUmVzb3VyY2VNb2RlICE9IEFw
cGx5VG9EZWZhdWx0TW9kZSk7CisgICAgQVNTRVJUKG1fY3VycmVudENodW5rUGFydC5pc1ZhbGlk
KCkpOwogCi0gICAgaWYgKHN0YXJ0UG9zIDwgYm94U3RhcnRPZmZzZXQpCi0gICAgICAgIHN0YXJ0
UG9zID0gYm94U3RhcnRPZmZzZXQ7CisgICAgY29uc3QgRm9udCYgZm9udCA9IGRlY29yYXRpb25T
dHlsZS0+Zm9udCgpOwogCi0gICAgQVNTRVJUKHN0YXJ0UG9zID49IGJveFN0YXJ0T2Zmc2V0KTsK
LSAgICBBU1NFUlQoZW5kUG9zIDw9IGJveFN0YXJ0T2Zmc2V0ICsgbGVuZ3RoKTsKLSAgICBBU1NF
UlQoc3RhcnRQb3MgPCBlbmRQb3MpOworICAgIC8vIFRoZSBpbml0aWFsIHkgdmFsdWUgcmVmZXJz
IHRvIG92ZXJsaW5lIHBvc2l0aW9uLgorICAgIGZsb2F0IHRoaWNrbmVzcyA9IHRoaWNrbmVzc0Zv
ckRlY29yYXRpb24oZGVjb3JhdGlvbiwgZm9udCk7CisgICAgZmxvYXQgeCA9IHRleHRPcmlnaW4u
eCgpOworICAgIGZsb2F0IHkgPSB0ZXh0T3JpZ2luLnkoKSAtIGZvbnQuYXNjZW50KCkgKyBwb3Np
dGlvbk9mZnNldEZvckRlY29yYXRpb24oZGVjb3JhdGlvbiwgZm9udCwgdGhpY2tuZXNzKTsKIAot
ICAgIHAtPnNhdmUoKTsKKyAgICBjb250ZXh0LT5zYXZlKCk7CisgICAgY29udGV4dC0+YmVnaW5Q
YXRoKCk7CisgICAgY29udGV4dC0+YWRkUGF0aChQYXRoOjpjcmVhdGVSZWN0YW5nbGUoRmxvYXRS
ZWN0KHgsIHksIG1fY3VycmVudENodW5rUGFydC53aWR0aCwgdGhpY2tuZXNzKSkpOwogCi0gICAg
aW50IGFkanVzdCA9IHN0YXJ0UG9zID49IGJveFN0YXJ0T2Zmc2V0ID8gYm94U3RhcnRPZmZzZXQg
OiAwOwotICAgIHAtPmRyYXdIaWdobGlnaHRGb3JUZXh0KGZvbnQsIHN2Z1RleHRSdW5Gb3JJbmxp
bmVUZXh0Qm94KHRleHRSZW5kZXJlcigpLT5jaGFyYWN0ZXJzKCkgKyBzdGFydCgpICsgYm94U3Rh
cnRPZmZzZXQsIGxlbmd0aCwgc3R5bGUsIHRoaXMsIHN2Z0NoYXIueCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgSW50UG9pbnQoKGludCkgc3ZnQ2hhci54LCAoaW50KSBzdmdDaGFyLnkg
LSBmb250LmFzY2VudCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LmFzY2Vu
dCgpICsgZm9udC5kZXNjZW50KCksIGNvbG9yLCBzdHlsZS0+Y29sb3JTcGFjZSgpLCBzdGFydFBv
cyAtIGFkanVzdCwgZW5kUG9zIC0gYWRqdXN0KTsKKyAgICBpZiAoYWNxdWlyZVBhaW50aW5nUmVz
b3VyY2UoY29udGV4dCwgZGVjb3JhdGlvblN0eWxlKSkKKyAgICAgICAgcmVsZWFzZVBhaW50aW5n
UmVzb3VyY2UoY29udGV4dCk7CiAKLSAgICBwLT5yZXN0b3JlKCk7CisgICAgY29udGV4dC0+cmVz
dG9yZSgpOwogfQogCi1zdGF0aWMgaW5saW5lIFBhdGggcGF0aEZvckRlY29yYXRpb24oRVRleHRE
ZWNvcmF0aW9uIGRlY29yYXRpb24sIFJlbmRlck9iamVjdCogb2JqZWN0LCBmbG9hdCB4LCBmbG9h
dCB5LCBmbG9hdCB3aWR0aCkKK3ZvaWQgU1ZHSW5saW5lVGV4dEJveDo6cGFpbnRTZWxlY3Rpb24o
R3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBGbG9hdFBvaW50JiB0ZXh0T3JpZ2luLCBS
ZW5kZXJTdHlsZSogc3R5bGUpCiB7Ci0gICAgZmxvYXQgdGhpY2tuZXNzID0gU1ZHUmVuZGVyU3R5
bGU6OmNzc1ByaW1pdGl2ZVRvTGVuZ3RoKG9iamVjdCwgb2JqZWN0LT5zdHlsZSgpLT5zdmdTdHls
ZSgpLT5zdHJva2VXaWR0aCgpLCAxLjBmKTsKKyAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhIHNlbGVj
dGlvbiB0byBwYWludCBhdCBhbGwuCisgICAgaW50IHN0YXJ0UG9zLCBlbmRQb3M7CisgICAgc2Vs
ZWN0aW9uU3RhcnRFbmQoc3RhcnRQb3MsIGVuZFBvcyk7CisgICAgaWYgKHN0YXJ0UG9zID49IGVu
ZFBvcykKKyAgICAgICAgcmV0dXJuOwogCi0gICAgY29uc3QgRm9udCYgZm9udCA9IG9iamVjdC0+
c3R5bGUoKS0+Zm9udCgpOwotICAgIHRoaWNrbmVzcyA9IG1heCh0aGlja25lc3MgKiBwb3dmKGZv
bnQuc2l6ZSgpLCAyLjBmKSAvIGZvbnQudW5pdHNQZXJFbSgpLCAxLjBmKTsKKyAgICBDb2xvciBi
YWNrZ3JvdW5kQ29sb3IgPSByZW5kZXJlcigpLT5zZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKTsK
KyAgICBpZiAoIWJhY2tncm91bmRDb2xvci5pc1ZhbGlkKCkgfHwgIWJhY2tncm91bmRDb2xvci5h
bHBoYSgpKQorICAgICAgICByZXR1cm47CiAKLSAgICBpZiAoZGVjb3JhdGlvbiA9PSBVTkRFUkxJ
TkUpCi0gICAgICAgIHkgKz0gdGhpY2tuZXNzICogMS41ZjsgLy8gRm9yIGNvbXBhdGliaWxpdHkg
d2l0aCBCYXRpay9PcGVyYQotICAgIGVsc2UgaWYgKGRlY29yYXRpb24gPT0gT1ZFUkxJTkUpCi0g
ICAgICAgIHkgKz0gdGhpY2tuZXNzOworICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBzdHlsZS0+Zm9u
dCgpOwogCi0gICAgZmxvYXQgaGFsZlRoaWNrbmVzcyA9IHRoaWNrbmVzcyAvIDIuMGY7Ci0gICAg
cmV0dXJuIFBhdGg6OmNyZWF0ZVJlY3RhbmdsZShGbG9hdFJlY3QoeCArIGhhbGZUaGlja25lc3Ms
IHksIHdpZHRoIC0gMi4wZiAqIGhhbGZUaGlja25lc3MsIHRoaWNrbmVzcykpOworICAgIEZsb2F0
UG9pbnQgc2VsZWN0aW9uT3JpZ2luID0gdGV4dE9yaWdpbjsKKyAgICBzZWxlY3Rpb25PcmlnaW4u
bW92ZSgwLCAtZm9udC5hc2NlbnQoKSk7CisKKyAgICBjb250ZXh0LT5zYXZlKCk7CisgICAgY29u
dGV4dC0+c2V0RmlsbENvbG9yKGJhY2tncm91bmRDb2xvciwgc3R5bGUtPmNvbG9yU3BhY2UoKSk7
CisgICAgY29udGV4dC0+ZmlsbFJlY3QoZm9udC5zZWxlY3Rpb25SZWN0Rm9yVGV4dChjb25zdHJ1
Y3RUZXh0UnVuKHN0eWxlKSwgc2VsZWN0aW9uT3JpZ2luLCBtX2N1cnJlbnRDaHVua1BhcnQuaGVp
Z2h0LCBzdGFydFBvcywgZW5kUG9zKSwgYmFja2dyb3VuZENvbG9yLCBzdHlsZS0+Y29sb3JTcGFj
ZSgpKTsKKyAgICBjb250ZXh0LT5yZXN0b3JlKCk7CiB9CiAKLXZvaWQgU1ZHSW5saW5lVGV4dEJv
eDo6cGFpbnREZWNvcmF0aW9uKEVUZXh0RGVjb3JhdGlvbiBkZWNvcmF0aW9uLCBHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQsIGludCB0eCwgaW50IHR5LCBpbnQgd2lkdGgsIGNvbnN0IFNWR0NoYXIm
IHN2Z0NoYXIsIGNvbnN0IFNWR1RleHREZWNvcmF0aW9uSW5mbyYgaW5mbykKK3ZvaWQgU1ZHSW5s
aW5lVGV4dEJveDo6cGFpbnRUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgRmxv
YXRQb2ludCYgdGV4dE9yaWdpbiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogc2Vs
ZWN0aW9uU3R5bGUsIGJvb2wgaGFzU2VsZWN0aW9uKQogewotICAgIGlmIChyZW5kZXJlcigpLT5z
dHlsZSgpLT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
Ly8gVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCBhY2NlcHQgY29tYmluYXRlZCB0ZXh0IGRlY29yYXRp
b25zLiBJdCdzIG1lYW50IHRvIGJlIGludm9rZWQgZm9yIGp1c3Qgb25lLgotICAgIEFTU0VSVChk
ZWNvcmF0aW9uID09IFRETk9ORSB8fCBkZWNvcmF0aW9uID09IFVOREVSTElORSB8fCBkZWNvcmF0
aW9uID09IE9WRVJMSU5FIHx8IGRlY29yYXRpb24gPT0gTElORV9USFJPVUdIIHx8IGRlY29yYXRp
b24gPT0gQkxJTkspOworICAgIEFTU0VSVChzdHlsZSk7CisgICAgQVNTRVJUKHNlbGVjdGlvblN0
eWxlKTsKKyAgICBBU1NFUlQobV9jdXJyZW50Q2h1bmtQYXJ0LmlzVmFsaWQoKSk7CiAKLSAgICBi
b29sIGlzRmlsbGVkID0gaW5mby5maWxsU2VydmVyTWFwLmNvbnRhaW5zKGRlY29yYXRpb24pOwot
ICAgIGJvb2wgaXNTdHJva2VkID0gaW5mby5zdHJva2VTZXJ2ZXJNYXAuY29udGFpbnMoZGVjb3Jh
dGlvbik7CisgICAgaW50IHN0YXJ0UG9zID0gMDsKKyAgICBpbnQgZW5kUG9zID0gMDsKKyAgICBz
ZWxlY3Rpb25TdGFydEVuZChzdGFydFBvcywgZW5kUG9zKTsKIAotICAgIGlmICghaXNGaWxsZWQg
JiYgIWlzU3Ryb2tlZCkKLSAgICAgICAgcmV0dXJuOworICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBz
dHlsZS0+Zm9udCgpOworICAgIFRleHRSdW4gdGV4dFJ1bihjb25zdHJ1Y3RUZXh0UnVuKHN0eWxl
KSk7CiAKLSAgICBpbnQgYmFzZWxpbmUgPSByZW5kZXJlcigpLT5zdHlsZShtX2ZpcnN0TGluZSkt
PmZvbnQoKS5hc2NlbnQoKTsKLSAgICBpZiAoZGVjb3JhdGlvbiA9PSBVTkRFUkxJTkUpCi0gICAg
ICAgIHR5ICs9IGJhc2VsaW5lOwotICAgIGVsc2UgaWYgKGRlY29yYXRpb24gPT0gTElORV9USFJP
VUdIKQotICAgICAgICB0eSArPSAyICogYmFzZWxpbmUgLyAzOworICAgIC8vIEZhc3QgcGF0aCBp
ZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24sIGp1c3QgZHJhdyB0aGUgd2hvbGUgY2h1bmsgcGFydCB1
c2luZyB0aGUgcmVndWxhciBzdHlsZQorICAgIGlmICghaGFzU2VsZWN0aW9uIHx8IHN0YXJ0UG9z
ID49IGVuZFBvcykgeworICAgICAgICBpZiAocHJlcGFyZUdyYXBoaWNzQ29udGV4dEZvclRleHRQ
YWludGluZyhjb250ZXh0LCB0ZXh0UnVuLCBzdHlsZSkpIHsKKyAgICAgICAgICAgIGZvbnQuZHJh
d1RleHQoY29udGV4dCwgdGV4dFJ1biwgdGV4dE9yaWdpbiwgMCwgbV9jdXJyZW50Q2h1bmtQYXJ0
Lmxlbmd0aCk7CisgICAgICAgICAgICByZXN0b3JlR3JhcGhpY3NDb250ZXh0QWZ0ZXJUZXh0UGFp
bnRpbmcoY29udGV4dCwgdGV4dFJ1bik7CisgICAgICAgIH0KIAotICAgIGNvbnRleHQtPnNhdmUo
KTsKLSAgICBjb250ZXh0LT5iZWdpblBhdGgoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAot
ICAgIEFmZmluZVRyYW5zZm9ybSBjdG0gPSBzdmdDaGFyLmNoYXJhY3RlclRyYW5zZm9ybSgpOwot
ICAgIGlmICghY3RtLmlzSWRlbnRpdHkoKSkKLSAgICAgICAgY29udGV4dC0+Y29uY2F0Q1RNKGN0
bSk7Ci0KLSAgICBpZiAoaXNGaWxsZWQpIHsKLSAgICAgICAgaWYgKFJlbmRlck9iamVjdCogZmls
bE9iamVjdCA9IGluZm8uZmlsbFNlcnZlck1hcC5nZXQoZGVjb3JhdGlvbikpIHsKLSAgICAgICAg
ICAgIGlmIChSZW5kZXJTVkdSZXNvdXJjZSogZmlsbFBhaW50aW5nUmVzb3VyY2UgPSBSZW5kZXJT
VkdSZXNvdXJjZTo6ZmlsbFBhaW50aW5nUmVzb3VyY2UoZmlsbE9iamVjdCwgZmlsbE9iamVjdC0+
c3R5bGUoKSkpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5hZGRQYXRoKHBhdGhGb3JEZWNv
cmF0aW9uKGRlY29yYXRpb24sIGZpbGxPYmplY3QsIHR4LCB0eSwgd2lkdGgpKTsKLSAgICAgICAg
ICAgICAgICBpZiAoZmlsbFBhaW50aW5nUmVzb3VyY2UtPmFwcGx5UmVzb3VyY2UoZmlsbE9iamVj
dCwgZmlsbE9iamVjdC0+c3R5bGUoKSwgY29udGV4dCwgQXBwbHlUb0ZpbGxNb2RlKSkKLSAgICAg
ICAgICAgICAgICAgICAgZmlsbFBhaW50aW5nUmVzb3VyY2UtPnBvc3RBcHBseVJlc291cmNlKGZp
bGxPYmplY3QsIGNvbnRleHQsIEFwcGx5VG9GaWxsTW9kZSk7Ci0gICAgICAgICAgICB9CisgICAg
Ly8gRXZlbnR1YWxseSBkcmF3IHRleHQgdXNpbmcgcmVndWxhciBzdHlsZSB1bnRpbCB0aGUgc3Rh
cnQgcG9zaXRpb24gb2YgdGhlIHNlbGVjdGlvbgorICAgIGlmIChzdGFydFBvcyA+IDApIHsKKyAg
ICAgICAgaWYgKHByZXBhcmVHcmFwaGljc0NvbnRleHRGb3JUZXh0UGFpbnRpbmcoY29udGV4dCwg
dGV4dFJ1biwgc3R5bGUpKSB7CisgICAgICAgICAgICBmb250LmRyYXdUZXh0KGNvbnRleHQsIHRl
eHRSdW4sIHRleHRPcmlnaW4sIDAsIHN0YXJ0UG9zKTsKKyAgICAgICAgICAgIHJlc3RvcmVHcmFw
aGljc0NvbnRleHRBZnRlclRleHRQYWludGluZyhjb250ZXh0LCB0ZXh0UnVuKTsKICAgICAgICAg
fQogICAgIH0KIAotICAgIGlmIChpc1N0cm9rZWQpIHsKLSAgICAgICAgaWYgKFJlbmRlck9iamVj
dCogc3Ryb2tlT2JqZWN0ID0gaW5mby5zdHJva2VTZXJ2ZXJNYXAuZ2V0KGRlY29yYXRpb24pKSB7
Ci0gICAgICAgICAgICBpZiAoUmVuZGVyU1ZHUmVzb3VyY2UqIHN0cm9rZVBhaW50aW5nUmVzb3Vy
Y2UgPSBSZW5kZXJTVkdSZXNvdXJjZTo6c3Ryb2tlUGFpbnRpbmdSZXNvdXJjZShzdHJva2VPYmpl
Y3QsIHN0cm9rZU9iamVjdC0+c3R5bGUoKSkpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5h
ZGRQYXRoKHBhdGhGb3JEZWNvcmF0aW9uKGRlY29yYXRpb24sIHN0cm9rZU9iamVjdCwgdHgsIHR5
LCB3aWR0aCkpOwotICAgICAgICAgICAgICAgIGlmIChzdHJva2VQYWludGluZ1Jlc291cmNlLT5h
cHBseVJlc291cmNlKHN0cm9rZU9iamVjdCwgc3Ryb2tlT2JqZWN0LT5zdHlsZSgpLCBjb250ZXh0
LCBBcHBseVRvU3Ryb2tlTW9kZSkpCi0gICAgICAgICAgICAgICAgICAgIHN0cm9rZVBhaW50aW5n
UmVzb3VyY2UtPnBvc3RBcHBseVJlc291cmNlKHN0cm9rZU9iamVjdCwgY29udGV4dCwgQXBwbHlU
b1N0cm9rZU1vZGUpOwotICAgICAgICAgICAgfQorICAgIC8vIERyYXcgdGV4dCB1c2luZyBzZWxl
Y3Rpb24gc3R5bGUgZnJvbSB0aGUgc3RhcnQgdG8gdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgc2Vs
ZWN0aW9uCisgICAgVGV4dFJ1biBzZWxlY3Rpb25UZXh0UnVuKGNvbnN0cnVjdFRleHRSdW4oc2Vs
ZWN0aW9uU3R5bGUpKTsKKyAgICBpZiAocHJlcGFyZUdyYXBoaWNzQ29udGV4dEZvclRleHRQYWlu
dGluZyhjb250ZXh0LCBzZWxlY3Rpb25UZXh0UnVuLCBzZWxlY3Rpb25TdHlsZSkpIHsKKyAgICAg
ICAgc2VsZWN0aW9uU3R5bGUtPmZvbnQoKS5kcmF3VGV4dChjb250ZXh0LCBzZWxlY3Rpb25UZXh0
UnVuLCB0ZXh0T3JpZ2luLCBzdGFydFBvcywgZW5kUG9zKTsKKyAgICAgICAgcmVzdG9yZUdyYXBo
aWNzQ29udGV4dEFmdGVyVGV4dFBhaW50aW5nKGNvbnRleHQsIHNlbGVjdGlvblRleHRSdW4pOwor
ICAgIH0KKworICAgIC8vIEV2ZW50dWFsbHkgZHJhdyB0ZXh0IHVzaW5nIHJlZ3VsYXIgc3R5bGUg
ZnJvbSB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBzZWxlY3Rpb24gdG8gdGhlIGVuZCBvZiB0aGUg
Y3VycmVudCBjaHVuayBwYXJ0CisgICAgaWYgKGVuZFBvcyA8IG1fY3VycmVudENodW5rUGFydC5s
ZW5ndGgpIHsKKyAgICAgICAgaWYgKHByZXBhcmVHcmFwaGljc0NvbnRleHRGb3JUZXh0UGFpbnRp
bmcoY29udGV4dCwgdGV4dFJ1biwgc3R5bGUpKSB7CisgICAgICAgICAgICBmb250LmRyYXdUZXh0
KGNvbnRleHQsIHRleHRSdW4sIHRleHRPcmlnaW4sIGVuZFBvcywgbV9jdXJyZW50Q2h1bmtQYXJ0
Lmxlbmd0aCk7CisgICAgICAgICAgICByZXN0b3JlR3JhcGhpY3NDb250ZXh0QWZ0ZXJUZXh0UGFp
bnRpbmcoY29udGV4dCwgdGV4dFJ1bik7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBjb250ZXh0
LT5yZXN0b3JlKCk7CiB9CiAKKwogdm9pZCBTVkdJbmxpbmVUZXh0Qm94OjpidWlsZExheW91dElu
Zm9ybWF0aW9uKFNWR0NoYXJhY3RlckxheW91dEluZm8mIGluZm8sIFNWR0xhc3RHbHlwaEluZm8m
IGxhc3RHbHlwaCkKIHsKICAgICBSZW5kZXJUZXh0KiB0ZXh0UmVuZGVyZXIgPSB0aGlzLT50ZXh0
UmVuZGVyZXIoKTsKICAgICBBU1NFUlQodGV4dFJlbmRlcmVyKTsKIAotICAgIFJlbmRlclN0eWxl
KiBzdHlsZSA9IHRleHRSZW5kZXJlci0+c3R5bGUoaXNGaXJzdExpbmVTdHlsZSgpKTsKKyAgICBS
ZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0UmVuZGVyZXItPnN0eWxlKCk7CiAgICAgQVNTRVJUKHN0
eWxlKTsKIAogICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBzdHlsZS0+Zm9udCgpOwpAQCAtNjA2LDIw
ICs2MDQsOSBAQCB2b2lkIFNWR0lubGluZVRleHRCb3g6OmJ1aWxkTGF5b3V0SW5mb3JtCiAKICAg
ICAgICAgZmxvYXQgZ2x5cGhXaWR0aCA9IDAuMGY7CiAgICAgICAgIGZsb2F0IGdseXBoSGVpZ2h0
ID0gMC4wZjsKLQotICAgICAgICBpbnQgZXh0cmFDaGFyc0F2YWlsYWJsZSA9IGxlbmd0aCAtIGkg
LSAxOwotCi0gICAgICAgIFN0cmluZyB1bmljb2RlU3RyOwogICAgICAgICBTdHJpbmcgZ2x5cGhO
YW1lOwotICAgICAgICBpZiAodGV4dERpcmVjdGlvbiA9PSBSVEwpIHsKLSAgICAgICAgICAgIGds
eXBoV2lkdGggPSBjYWxjdWxhdGVHbHlwaFdpZHRoKHN0eWxlLCBlbmRQb3NpdGlvbiAtIGksIGV4
dHJhQ2hhcnNBdmFpbGFibGUsIGNoYXJzQ29uc3VtZWQsIGdseXBoTmFtZSk7Ci0gICAgICAgICAg
ICBnbHlwaEhlaWdodCA9IGNhbGN1bGF0ZUdseXBoSGVpZ2h0KHN0eWxlLCBlbmRQb3NpdGlvbiAt
IGksIGV4dHJhQ2hhcnNBdmFpbGFibGUpOwotICAgICAgICAgICAgdW5pY29kZVN0ciA9IFN0cmlu
ZyhjaGFyYWN0ZXJzICsgZW5kUG9zaXRpb24gLSBpLCBjaGFyc0NvbnN1bWVkKTsKLSAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgIGdseXBoV2lkdGggPSBjYWxjdWxhdGVHbHlwaFdpZHRoKHN0
eWxlLCBzdGFydFBvc2l0aW9uICsgaSwgZXh0cmFDaGFyc0F2YWlsYWJsZSwgY2hhcnNDb25zdW1l
ZCwgZ2x5cGhOYW1lKTsKLSAgICAgICAgICAgIGdseXBoSGVpZ2h0ID0gY2FsY3VsYXRlR2x5cGhI
ZWlnaHQoc3R5bGUsIHN0YXJ0UG9zaXRpb24gKyBpLCBleHRyYUNoYXJzQXZhaWxhYmxlKTsKLSAg
ICAgICAgICAgIHVuaWNvZGVTdHIgPSBTdHJpbmcoY2hhcmFjdGVycyArIHN0YXJ0UG9zaXRpb24g
KyBpLCBjaGFyc0NvbnN1bWVkKTsKLSAgICAgICAgfQorICAgICAgICBTdHJpbmcgdW5pY29kZVN0
cmluZzsKKyAgICAgICAgbWVhc3VyZUNoYXJhY3RlcihzdHlsZSwgaSwgY2hhcnNDb25zdW1lZCwg
Z2x5cGhOYW1lLCB1bmljb2RlU3RyaW5nLCBnbHlwaFdpZHRoLCBnbHlwaEhlaWdodCk7CiAKICAg
ICAgICAgYm9vbCBhc3NpZ25lZFggPSBmYWxzZTsKICAgICAgICAgYm9vbCBhc3NpZ25lZFkgPSBm
YWxzZTsKQEAgLTY4Miw3ICs2NjksNyBAQCB2b2lkIFNWR0lubGluZVRleHRCb3g6OmJ1aWxkTGF5
b3V0SW5mb3JtCiAgICAgICAgIH0KIAogICAgICAgICAvLyBGSVhNRTogU1ZHIEtlcm5pbmcgZG9l
c24ndCBnZXQgYXBwbGllZCBvbiB0ZXh0cyBvbiBwYXRoLgotICAgICAgICBib29sIGFwcGxpZWRT
VkdLZXJuaW5nID0gYXBwbHlTVkdLZXJuaW5nKGluZm8sIHN0eWxlLCBsYXN0R2x5cGgsIHVuaWNv
ZGVTdHIsIGdseXBoTmFtZSwgaXNWZXJ0aWNhbFRleHQpOworICAgICAgICBib29sIGFwcGxpZWRT
VkdLZXJuaW5nID0gYXBwbHlTVkdLZXJuaW5nKGluZm8sIHN0eWxlLCBsYXN0R2x5cGgsIHVuaWNv
ZGVTdHJpbmcsIGdseXBoTmFtZSwgaXNWZXJ0aWNhbFRleHQpOwogICAgICAgICBpZiAoaW5mby5u
ZXh0RHJhd25TZXBlcmF0ZWQgfHwgc3BhY2luZyAhPSAwLjBmIHx8IGFwcGxpZWRTVkdLZXJuaW5n
KSB7CiAgICAgICAgICAgICBpbmZvLm5leHREcmF3blNlcGVyYXRlZCA9IGZhbHNlOwogICAgICAg
ICAgICAgc3ZnQ2hhci5kcmF3blNlcGVyYXRlZCA9IHRydWU7CkBAIC04MDUsNiArNzkyLDM1IEBA
IHZvaWQgU1ZHSW5saW5lVGV4dEJveDo6YnVpbGRMYXlvdXRJbmZvcm0KICAgICB9CiB9CiAKK0Zs
b2F0UmVjdCBTVkdJbmxpbmVUZXh0Qm94OjpjYWxjdWxhdGVHbHlwaEJvdW5kYXJpZXMoUmVuZGVy
U3R5bGUqIHN0eWxlLCBpbnQgcG9zaXRpb24sIGNvbnN0IFNWR0NoYXImIGNoYXJhY3RlcikgY29u
c3QKK3sKKyAgICBpbnQgY2hhcnNDb25zdW1lZCA9IDA7CisgICAgU3RyaW5nIGdseXBoTmFtZTsK
KyAgICBTdHJpbmcgdW5pY29kZVN0cmluZzsKKyAgICBmbG9hdCBnbHlwaFdpZHRoID0gMC4wZjsK
KyAgICBmbG9hdCBnbHlwaEhlaWdodCA9IDAuMGY7CisgICAgbWVhc3VyZUNoYXJhY3RlcihzdHls
ZSwgcG9zaXRpb24sIGNoYXJzQ29uc3VtZWQsIGdseXBoTmFtZSwgdW5pY29kZVN0cmluZywgZ2x5
cGhXaWR0aCwgZ2x5cGhIZWlnaHQpOworCisgICAgRmxvYXRSZWN0IGdseXBoUmVjdChjaGFyYWN0
ZXIueCwgY2hhcmFjdGVyLnkgLSBzdHlsZS0+Zm9udCgpLmFzY2VudCgpLCBnbHlwaFdpZHRoLCBn
bHlwaEhlaWdodCk7CisgICAgZ2x5cGhSZWN0ID0gY2hhcmFjdGVyLmNoYXJhY3RlclRyYW5zZm9y
bSgpLm1hcFJlY3QoZ2x5cGhSZWN0KTsKKyAgICBpZiAobV9jaHVua1RyYW5zZm9ybWF0aW9uLmlz
SWRlbnRpdHkoKSkKKyAgICAgICAgcmV0dXJuIGdseXBoUmVjdDsKKworICAgIHJldHVybiBtX2No
dW5rVHJhbnNmb3JtYXRpb24ubWFwUmVjdChnbHlwaFJlY3QpOworfQorCitJbnRSZWN0IFNWR0lu
bGluZVRleHRCb3g6OmNhbGN1bGF0ZUJvdW5kYXJpZXMoKSBjb25zdAoreworICAgIEZsb2F0UmVj
dCB0ZXh0UmVjdDsKKyAgICBpbnQgYmFzZWxpbmUgPSBiYXNlbGluZVBvc2l0aW9uKHRydWUpOwor
CisgICAgY29uc3QgVmVjdG9yPFNWR1RleHRDaHVua1BhcnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQg
PSBtX3N2Z1RleHRDaHVua1BhcnRzLmVuZCgpOworICAgIGZvciAoVmVjdG9yPFNWR1RleHRDaHVu
a1BhcnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fc3ZnVGV4dENodW5rUGFydHMuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KQorICAgICAgICB0ZXh0UmVjdC51bml0ZShpdC0+Zmlyc3RDaGFyYWN0
ZXItPmNoYXJhY3RlclRyYW5zZm9ybSgpLm1hcFJlY3QoRmxvYXRSZWN0KGl0LT5maXJzdENoYXJh
Y3Rlci0+eCwgaXQtPmZpcnN0Q2hhcmFjdGVyLT55IC0gYmFzZWxpbmUsIGl0LT53aWR0aCwgaXQt
PmhlaWdodCkpKTsKKworICAgIHJldHVybiBlbmNsb3NpbmdJbnRSZWN0KG1fY2h1bmtUcmFuc2Zv
cm1hdGlvbi5tYXBSZWN0KHRleHRSZWN0KSk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
IAogI2VuZGlmCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9TVkdJbmxpbmVUZXh0Qm94LmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvU1ZHSW5saW5lVGV4dEJveC5oCShyZXZpc2lv
biA2MTM4MykKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1NWR0lubGluZVRleHRCb3guaAkod29ya2lu
ZyBjb3B5KQpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUm9iIEJ1
aXMgPGJ1aXNAa2RlLm9yZz4KICAqICAgICAgICAgICAoQykgMjAwNyBOaWtvbGFzIFppbW1lcm1h
bm4gPHppbW1lcm1hbm5Aa2RlLm9yZz4KKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90
aW9uIExpbWl0ZWQgMjAxMC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YwpAQCAtMjQsNjAgKzI1LDc0IEBACiAKICNpZiBFTkFCTEUoU1ZHKQogI2luY2x1ZGUgIklubGlu
ZVRleHRCb3guaCIKLSNpbmNsdWRlICJSZW5kZXJTVkdSZXNvdXJjZS5oIgorI2luY2x1ZGUgIlNW
R1RleHRDaHVua0xheW91dEluZm8uaCIKKyNpbmNsdWRlICJTVkdUZXh0TGF5b3V0VXRpbGl0aWVz
LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgUmVuZGVyU1ZHUmVzb3VyY2U7CiBj
bGFzcyBTVkdSb290SW5saW5lQm94OwogCi1zdHJ1Y3QgU1ZHQ2hhcjsKIHN0cnVjdCBTVkdDaGFy
YWN0ZXJMYXlvdXRJbmZvOwogc3RydWN0IFNWR0xhc3RHbHlwaEluZm87Ci1zdHJ1Y3QgU1ZHVGV4
dERlY29yYXRpb25JbmZvOwotc3RydWN0IFNWR1RleHRQYWludEluZm87CiAKIGNsYXNzIFNWR0lu
bGluZVRleHRCb3ggOiBwdWJsaWMgSW5saW5lVGV4dEJveCB7CiBwdWJsaWM6Ci0gICAgU1ZHSW5s
aW5lVGV4dEJveChSZW5kZXJPYmplY3QqIG9iaik7CisgICAgU1ZHSW5saW5lVGV4dEJveChSZW5k
ZXJPYmplY3QqKTsKKworICAgIHZpcnR1YWwgYm9vbCBpc1NWR0lubGluZVRleHRCb3goKSBjb25z
dCB7IHJldHVybiB0cnVlOyB9CiAKICAgICB2aXJ0dWFsIGludCB2aXJ0dWFsSGVpZ2h0KCkgY29u
c3QgeyByZXR1cm4gbV9oZWlnaHQ7IH0KLSAgICB2b2lkIHNldEhlaWdodChpbnQgaCkgeyBtX2hl
aWdodCA9IGg7IH0KKyAgICB2b2lkIHNldEhlaWdodChpbnQgaGVpZ2h0KSB7IG1faGVpZ2h0ID0g
aGVpZ2h0OyB9CiAKICAgICB2aXJ0dWFsIGludCBzZWxlY3Rpb25Ub3AoKSB7IHJldHVybiBtX3k7
IH0KICAgICB2aXJ0dWFsIGludCBzZWxlY3Rpb25IZWlnaHQoKSB7IHJldHVybiBtX2hlaWdodDsg
fQotCiAgICAgdmlydHVhbCBpbnQgb2Zmc2V0Rm9yUG9zaXRpb24oaW50IHgsIGJvb2wgaW5jbHVk
ZVBhcnRpYWxHbHlwaHMgPSB0cnVlKSBjb25zdDsKICAgICB2aXJ0dWFsIGludCBwb3NpdGlvbkZv
ck9mZnNldChpbnQgb2Zmc2V0KSBjb25zdDsKIAotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGlu
dCB0eCwgaW50IHR5KTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUmVuZGVyT2JqZWN0OjpQYWlu
dEluZm8mLCBpbnQgdHgsIGludCB0eSk7CiAgICAgdmlydHVhbCBJbnRSZWN0IHNlbGVjdGlvblJl
Y3QoaW50IGFic3gsIGludCBhYnN5LCBpbnQgc3RhcnRQb3MsIGludCBlbmRQb3MpOwogCi0gICAg
Ly8gU1ZHcyBjdXN0b20gcGFpbnQgdGV4dCBtZXRob2QKLSAgICB2b2lkIHBhaW50Q2hhcmFjdGVy
cyhSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5LCBjb25zdCBTVkdDaGFy
JiwgY29uc3QgVUNoYXIqIGNoYXJzLCBpbnQgbGVuZ3RoLCBTVkdUZXh0UGFpbnRJbmZvJik7Ci0K
LSAgICAvLyBTVkdzIGN1c3RvbSBwYWludCBzZWxlY3Rpb24gbWV0aG9kCi0gICAgdm9pZCBwYWlu
dFNlbGVjdGlvbihpbnQgYm94U3RhcnRPZmZzZXQsIGNvbnN0IFNWR0NoYXImLCBjb25zdCBVQ2hh
ciosIGludCBsZW5ndGgsIEdyYXBoaWNzQ29udGV4dCosIFJlbmRlclN0eWxlKiwgY29uc3QgRm9u
dCYpOworICAgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25TdGFydEVuZChpbnQmIHN0YXJ0UG9zLCBp
bnQmIGVuZFBvcyk7CisgICAgdm9pZCBtYXBTdGFydEVuZFBvc2l0aW9uc0ludG9DaHVua1BhcnRD
b29yZGluYXRlcyhpbnQmIHN0YXJ0UG9zLCBpbnQmIGVuZFBvcywgY29uc3QgU1ZHVGV4dENodW5r
UGFydCYpIGNvbnN0OwogCi0gICAgLy8gU1ZHcyBjdXN0b20gcGFpbnQgZGVjb3JhdGlvbiBtZXRo
b2QKLSAgICB2b2lkIHBhaW50RGVjb3JhdGlvbihFVGV4dERlY29yYXRpb24sIEdyYXBoaWNzQ29u
dGV4dCosIGludCB0eCwgaW50IHR5LCBpbnQgd2lkdGgsIGNvbnN0IFNWR0NoYXImLCBjb25zdCBT
VkdUZXh0RGVjb3JhdGlvbkluZm8mKTsKLSAKICAgICBTVkdSb290SW5saW5lQm94KiBzdmdSb290
SW5saW5lQm94KCkgY29uc3Q7CiAKICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIHNoYXJlZCB3aXRo
IFNWR1Jvb3RJbmxpbmVCb3ggICAgIAotICAgIGZsb2F0IGNhbGN1bGF0ZUdseXBoV2lkdGgoUmVu
ZGVyU3R5bGUqIHN0eWxlLCBpbnQgb2Zmc2V0LCBpbnQgZXh0cmFDaGFyc0F2YWlsYWJsZSwgaW50
JiBjaGFyc0NvbnN1bWVkLCBTdHJpbmcmIGdseXBoTmFtZSkgY29uc3Q7Ci0gICAgZmxvYXQgY2Fs
Y3VsYXRlR2x5cGhIZWlnaHQoUmVuZGVyU3R5bGUqLCBpbnQgb2Zmc2V0LCBpbnQgZXh0cmFDaGFy
c0F2YWlsYWJsZSkgY29uc3Q7Ci0KLSAgICBGbG9hdFJlY3QgY2FsY3VsYXRlR2x5cGhCb3VuZGFy
aWVzKFJlbmRlclN0eWxlKiwgaW50IG9mZnNldCwgY29uc3QgU1ZHQ2hhciYpIGNvbnN0OwotICAg
IFNWR0NoYXIqIGNsb3Nlc3RDaGFyYWN0ZXJUb1Bvc2l0aW9uKGludCB4LCBpbnQgeSwgaW50JiBv
ZmZzZXQpIGNvbnN0OworICAgIHZvaWQgbWVhc3VyZUNoYXJhY3RlcihSZW5kZXJTdHlsZSosIGlu
dCBwb3NpdGlvbiwgaW50JiBjaGFyc0NvbnN1bWVkLCBTdHJpbmcmIGdseXBoTmFtZSwgU3RyaW5n
JiB1bmljb2RlU3RyaW5nLCBmbG9hdCYgZ2x5cGhXaWR0aCwgZmxvYXQmIGdseXBoSGVpZ2h0KSBj
b25zdDsKKyAgICBGbG9hdFJlY3QgY2FsY3VsYXRlR2x5cGhCb3VuZGFyaWVzKFJlbmRlclN0eWxl
KiwgaW50IHBvc2l0aW9uLCBjb25zdCBTVkdDaGFyJikgY29uc3Q7CiAKICAgICB2b2lkIGJ1aWxk
TGF5b3V0SW5mb3JtYXRpb24oU1ZHQ2hhcmFjdGVyTGF5b3V0SW5mbyYsIFNWR0xhc3RHbHlwaElu
Zm8mKTsKIAorICAgIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgY2h1bmtUcmFuc2Zvcm1hdGlvbigp
IGNvbnN0IHsgcmV0dXJuIG1fY2h1bmtUcmFuc2Zvcm1hdGlvbjsgfQorICAgIHZvaWQgc2V0Q2h1
bmtUcmFuc2Zvcm1hdGlvbihjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkgeyBtX2No
dW5rVHJhbnNmb3JtYXRpb24gPSB0cmFuc2Zvcm07IH0KKyAgICB2b2lkIGFkZENodW5rUGFydElu
Zm9ybWF0aW9uKGNvbnN0IFNWR1RleHRDaHVua1BhcnQmIHBhcnQpIHsgbV9zdmdUZXh0Q2h1bmtQ
YXJ0cy5hcHBlbmQocGFydCk7IH0KKyAgICBjb25zdCBWZWN0b3I8U1ZHVGV4dENodW5rUGFydD4m
IHN2Z1RleHRDaHVua1BhcnRzKCkgY29uc3QgeyByZXR1cm4gbV9zdmdUZXh0Q2h1bmtQYXJ0czsg
fQorCisgICAgdmlydHVhbCBJbnRSZWN0IGNhbGN1bGF0ZUJvdW5kYXJpZXMoKSBjb25zdDsKKwor
cHJpdmF0ZToKKyAgICBUZXh0UnVuIGNvbnN0cnVjdFRleHRSdW4oUmVuZGVyU3R5bGUqKSBjb25z
dDsKKyAgICBBZmZpbmVUcmFuc2Zvcm0gYnVpbGRDaHVua1RyYW5zZm9ybWF0aW9uKFNWR0NoYXIm
IGZpcnN0Q2hhcmFjdGVyKSBjb25zdDsKKworICAgIGJvb2wgYWNxdWlyZVBhaW50aW5nUmVzb3Vy
Y2UoR3JhcGhpY3NDb250ZXh0KiYsIFJlbmRlclN0eWxlKik7CisgICAgdm9pZCByZWxlYXNlUGFp
bnRpbmdSZXNvdXJjZShHcmFwaGljc0NvbnRleHQqJik7CisKKyAgICBib29sIHByZXBhcmVHcmFw
aGljc0NvbnRleHRGb3JUZXh0UGFpbnRpbmcoR3JhcGhpY3NDb250ZXh0KiYsIFRleHRSdW4mLCBS
ZW5kZXJTdHlsZSopOworICAgIHZvaWQgcmVzdG9yZUdyYXBoaWNzQ29udGV4dEFmdGVyVGV4dFBh
aW50aW5nKEdyYXBoaWNzQ29udGV4dComLCBUZXh0UnVuJik7CisKKyAgICB2b2lkIHBhaW50RGVj
b3JhdGlvbihHcmFwaGljc0NvbnRleHQqLCBjb25zdCBGbG9hdFBvaW50JiB0ZXh0T3JpZ2luLCBF
VGV4dERlY29yYXRpb24sIGJvb2wgaGFzU2VsZWN0aW9uKTsKKyAgICB2b2lkIHBhaW50RGVjb3Jh
dGlvbldpdGhTdHlsZShHcmFwaGljc0NvbnRleHQqLCBjb25zdCBGbG9hdFBvaW50JiB0ZXh0T3Jp
Z2luLCBSZW5kZXJTdHlsZSosIEVUZXh0RGVjb3JhdGlvbik7CisgICAgdm9pZCBwYWludFNlbGVj
dGlvbihHcmFwaGljc0NvbnRleHQqLCBjb25zdCBGbG9hdFBvaW50JiB0ZXh0T3JpZ2luLCBSZW5k
ZXJTdHlsZSopOworICAgIHZvaWQgcGFpbnRUZXh0KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEZs
b2F0UG9pbnQmIHRleHRPcmlnaW4sIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHNlbGVjdGlv
blN0eWxlLCBib29sIGhhc1NlbGVjdGlvbik7CisKIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNz
IFJlbmRlclNWR0lubGluZVRleHQ7Ci0gICAgYm9vbCBzdmdDaGFyYWN0ZXJIaXRzUG9zaXRpb24o
aW50IHgsIGludCB5LCBpbnQmIG9mZnNldCkgY29uc3Q7Ci0gICAgYm9vbCBjaHVua1NlbGVjdGlv
blN0YXJ0RW5kKGNvbnN0IFVDaGFyKiBjaHVuaywgaW50IGNodW5rTGVuZ3RoLCBpbnQmIHNlbGVj
dGlvblN0YXJ0LCBpbnQmIHNlbGVjdGlvbkVuZCk7Ci0gICAgCiAgICAgaW50IG1faGVpZ2h0Owor
ICAgIEFmZmluZVRyYW5zZm9ybSBtX2NodW5rVHJhbnNmb3JtYXRpb247CisgICAgVmVjdG9yPFNW
R1RleHRDaHVua1BhcnQ+IG1fc3ZnVGV4dENodW5rUGFydHM7CisgICAgbXV0YWJsZSBTVkdUZXh0
Q2h1bmtQYXJ0IG1fY3VycmVudENodW5rUGFydDsKKyAgICBSZW5kZXJTVkdSZXNvdXJjZSogbV9w
YWludGluZ1Jlc291cmNlOworICAgIGludCBtX3BhaW50aW5nUmVzb3VyY2VNb2RlOwogfTsKIAog
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvU1ZHUm9vdElu
bGluZUJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvU1ZHUm9vdElubGlu
ZUJveC5jcHAJKHJldmlzaW9uIDYxMzgzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvU1ZHUm9vdElu
bGluZUJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDY0MyArMjIsNDQgQEAKICAqLwogCiAj
aW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZiBFTkFCTEUoU1ZHKQogI2luY2x1ZGUgIlNWR1Jvb3RJ
bmxpbmVCb3guaCIKIAorI2lmIEVOQUJMRShTVkcpCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCiAjaW5jbHVkZSAiUmVuZGVyQmxvY2suaCIKICNpbmNsdWRlICJSZW5kZXJTVkdSZXNvdXJj
ZUZpbHRlci5oIgotI2luY2x1ZGUgIlJlbmRlclNWR1Jvb3QuaCIKICNpbmNsdWRlICJTVkdJbmxp
bmVGbG93Qm94LmgiCiAjaW5jbHVkZSAiU1ZHSW5saW5lVGV4dEJveC5oIgogI2luY2x1ZGUgIlNW
R1JlbmRlclN1cHBvcnQuaCIKICNpbmNsdWRlICJTVkdUZXh0TGF5b3V0VXRpbGl0aWVzLmgiCiAj
aW5jbHVkZSAiU1ZHVGV4dFBvc2l0aW9uaW5nRWxlbWVudC5oIgogCi0vLyBUZXh0IGNodW5rIGNy
ZWF0aW9uIGlzIGNvbXBsZXggYW5kIHRoZSB3aG9sZSBwcm9jZXNzCi0vLyBjYW4gZWFzaWx5IGJl
IHRyYWNlZCBieSBzZXR0aW5nIHRoaXMgdmFyaWFibGUgPiAwLgotI2RlZmluZSBERUJVR19DSFVO
S19CVUlMRElORyAwCisvLyBUZXh0IGNodW5rIHBhcnQgcHJvcGFnYXRpb24gY2FuIGJlIHRyYWNl
ZCBieSBzZXR0aW5nIHRoaXMgdmFyaWFibGUgPiAwLgorI2RlZmluZSBERUJVR19DSFVOS19QQVJU
X1BST1BBR0FUSU9OIDAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1zdGF0aWMgaW5saW5lIHZv
aWQgc3RhcnRUZXh0Q2h1bmsoU1ZHVGV4dENodW5rTGF5b3V0SW5mbyYgaW5mbykKK3ZvaWQgU1ZH
Um9vdElubGluZUJveDo6cGFpbnQoUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywg
aW50LCBpbnQpCiB7Ci0gICAgaW5mby5jaHVuay5ib3hlcy5jbGVhcigpOwotICAgIGluZm8uY2h1
bmsuYm94ZXMuYXBwZW5kKFNWR0lubGluZUJveENoYXJhY3RlclJhbmdlKCkpOwotCi0gICAgaW5m
by5jaHVuay5zdGFydCA9IGluZm8uaXQ7Ci0gICAgaW5mby5hc3NpZ25DaHVua1Byb3BlcnRpZXMg
PSB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xvc2VUZXh0Q2h1bmsoU1ZHVGV4dENo
dW5rTGF5b3V0SW5mbyYgaW5mbykKLXsKLSAgICBBU1NFUlQoIWluZm8uY2h1bmsuYm94ZXMubGFz
dCgpLmlzT3BlbigpKTsKLSAgICBBU1NFUlQoaW5mby5jaHVuay5ib3hlcy5sYXN0KCkuaXNDbG9z
ZWQoKSk7Ci0KLSAgICBpbmZvLmNodW5rLmVuZCA9IGluZm8uaXQ7Ci0gICAgQVNTRVJUKGluZm8u
Y2h1bmsuZW5kID49IGluZm8uY2h1bmsuc3RhcnQpOwotCi0gICAgaW5mby5zdmdUZXh0Q2h1bmtz
LmFwcGVuZChpbmZvLmNodW5rKTsKLX0KLQotUmVuZGVyU1ZHUm9vdCogZmluZFNWR1Jvb3RPYmpl
Y3QoUmVuZGVyT2JqZWN0KiBzdGFydCkKLXsKLSAgICAvLyBGaW5kIGFzc29jaWF0ZWQgcm9vdCBp
bmxpbmUgYm94LgotICAgIHdoaWxlIChzdGFydCAmJiAhc3RhcnQtPmlzU1ZHUm9vdCgpKQotICAg
ICAgICBzdGFydCA9IHN0YXJ0LT5wYXJlbnQoKTsKLSAgICBBU1NFUlQoc3RhcnQpOwotICAgIHJl
dHVybiB0b1JlbmRlclNWR1Jvb3Qoc3RhcnQpOwotfQotCi0vLyBIZWxwZXIgY2xhc3MgZm9yIHBh
aW50KCkKLXN0cnVjdCBTVkdSb290SW5saW5lQm94UGFpbnRXYWxrZXIgewotICAgIFNWR1Jvb3RJ
bmxpbmVCb3hQYWludFdhbGtlcihTVkdSb290SW5saW5lQm94KiByb290Qm94LCBSZW5kZXJPYmpl
Y3Q6OlBhaW50SW5mbyBwYWludEluZm8sIGludCB0eCwgaW50IHR5KQotICAgICAgICA6IG1fcm9v
dEJveChyb290Qm94KQotICAgICAgICAsIG1fY2h1bmtTdGFydGVkKGZhbHNlKQotICAgICAgICAs
IG1fcGFpbnRJbmZvKHBhaW50SW5mbykKLSAgICAgICAgLCBtX3NhdmVkSW5mbyhwYWludEluZm8p
Ci0gICAgICAgICwgbV9ib3VuZGluZ0JveCh0eCArIHJvb3RCb3gtPngoKSwgdHkgKyByb290Qm94
LT55KCksIHJvb3RCb3gtPndpZHRoKCksIHJvb3RCb3gtPmhlaWdodCgpKQotICAgICAgICAsIG1f
ZmlsdGVyKDApCi0gICAgICAgICwgbV9maWxsUGFpbnRpbmdSZXNvdXJjZSgwKQotICAgICAgICAs
IG1fc3Ryb2tlUGFpbnRpbmdSZXNvdXJjZSgwKQotICAgICAgICAsIG1fZmlsbFBhaW50aW5nUmVz
b3VyY2VPYmplY3QoMCkKLSAgICAgICAgLCBtX3N0cm9rZVBhaW50aW5nUmVzb3VyY2VPYmplY3Qo
MCkKLSAgICAgICAgLCBtX3R4KHR4KQotICAgICAgICAsIG1fdHkodHkpCi0gICAgewotICAgIH0K
LQotICAgIH5TVkdSb290SW5saW5lQm94UGFpbnRXYWxrZXIoKQotICAgIHsKLSAgICAgICAgQVNT
RVJUKCFtX2ZpbHRlcik7Ci0gICAgICAgIEFTU0VSVCghbV9maWxsUGFpbnRpbmdSZXNvdXJjZSk7
Ci0gICAgICAgIEFTU0VSVCghbV9maWxsUGFpbnRpbmdSZXNvdXJjZU9iamVjdCk7Ci0gICAgICAg
IEFTU0VSVCghbV9zdHJva2VQYWludGluZ1Jlc291cmNlKTsKLSAgICAgICAgQVNTRVJUKCFtX3N0
cm9rZVBhaW50aW5nUmVzb3VyY2VPYmplY3QpOwotICAgICAgICBBU1NFUlQoIW1fY2h1bmtTdGFy
dGVkKTsKLSAgICB9Ci0KLSAgICBib29sIG1heUhhdmVTZWxlY3Rpb24oU1ZHSW5saW5lVGV4dEJv
eCogYm94KSBjb25zdAotICAgIHsKLSAgICAgICAgaW50IHNlbGVjdGlvblN0YXJ0ID0gMCwgc2Vs
ZWN0aW9uRW5kID0gMDsKLSAgICAgICAgYm94LT5zZWxlY3Rpb25TdGFydEVuZChzZWxlY3Rpb25T
dGFydCwgc2VsZWN0aW9uRW5kKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGlvblN0YXJ0IDwgc2Vs
ZWN0aW9uRW5kOwotICAgIH0KLQotICAgIHZvaWQgdGVhcmRvd25GaWxsUGFpbnRTZXJ2ZXIoKQot
ICAgIHsKLSAgICAgICAgaWYgKCFtX2ZpbGxQYWludGluZ1Jlc291cmNlKQotICAgICAgICAgICAg
cmV0dXJuOwotCi0gICAgICAgIG1fZmlsbFBhaW50aW5nUmVzb3VyY2UtPnBvc3RBcHBseVJlc291
cmNlKG1fZmlsbFBhaW50aW5nUmVzb3VyY2VPYmplY3QsIG1fcGFpbnRJbmZvLmNvbnRleHQsIEFw
cGx5VG9GaWxsTW9kZSB8IEFwcGx5VG9UZXh0TW9kZSk7Ci0gICAgICAgIG1fZmlsbFBhaW50aW5n
UmVzb3VyY2UgPSAwOwotICAgICAgICBtX2ZpbGxQYWludGluZ1Jlc291cmNlT2JqZWN0ID0gMDsK
LSAgICB9Ci0KLSAgICB2b2lkIHRlYXJkb3duU3Ryb2tlUGFpbnRTZXJ2ZXIoKQotICAgIHsKLSAg
ICAgICAgaWYgKCFtX3N0cm9rZVBhaW50aW5nUmVzb3VyY2UpCi0gICAgICAgICAgICByZXR1cm47
Ci0KLSAgICAgICAgbV9zdHJva2VQYWludGluZ1Jlc291cmNlLT5wb3N0QXBwbHlSZXNvdXJjZSht
X3N0cm9rZVBhaW50aW5nUmVzb3VyY2VPYmplY3QsIG1fcGFpbnRJbmZvLmNvbnRleHQsIEFwcGx5
VG9TdHJva2VNb2RlIHwgQXBwbHlUb1RleHRNb2RlKTsKLSAgICAgICAgbV9zdHJva2VQYWludGlu
Z1Jlc291cmNlID0gMDsKLSAgICAgICAgbV9zdHJva2VQYWludGluZ1Jlc291cmNlT2JqZWN0ID0g
MDsKLSAgICB9Ci0KLSAgICB2b2lkIGNodW5rU3RhcnRDYWxsYmFjayhJbmxpbmVCb3gqIGJveCkK
LSAgICB7Ci0gICAgICAgIEFTU0VSVCghbV9jaHVua1N0YXJ0ZWQpOwotICAgICAgICBtX2NodW5r
U3RhcnRlZCA9IHRydWU7Ci0KLSAgICAgICAgSW5saW5lRmxvd0JveCogZmxvd0JveCA9IGJveC0+
cGFyZW50KCk7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0ZXh0IHJlbmRlcmluZwotICAgICAg
ICBSZW5kZXJPYmplY3QqIG9iamVjdCA9IGZsb3dCb3gtPnJlbmRlcmVyKCk7Ci0gICAgICAgIEFT
U0VSVChvYmplY3QpOwotCi0gICAgICAgIG1fc2F2ZWRJbmZvID0gbV9wYWludEluZm87Ci0gICAg
ICAgIG1fcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKLQotICAgICAgICAvLyBGSVhNRTogV2h5
IGlzIHRoaXMgZG9uZSBoZXJlIGluc3RlYWQgb2YgaW4gUmVuZGVyU1ZHVGV4dD8KLSAgICAgICAg
aWYgKCFmbG93Qm94LT5pc1Jvb3RJbmxpbmVCb3goKSkKLSAgICAgICAgICAgIFNWR1JlbmRlckJh
c2U6OnByZXBhcmVUb1JlbmRlclNWR0NvbnRlbnQob2JqZWN0LCBtX3BhaW50SW5mbywgbV9ib3Vu
ZGluZ0JveCwgbV9maWx0ZXIpOwotICAgIH0KLQotICAgIHZvaWQgY2h1bmtFbmRDYWxsYmFjayhJ
bmxpbmVCb3gqIGJveCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX2NodW5rU3RhcnRlZCk7Ci0g
ICAgICAgIG1fY2h1bmtTdGFydGVkID0gZmFsc2U7Ci0KLSAgICAgICAgSW5saW5lRmxvd0JveCog
Zmxvd0JveCA9IGJveC0+cGFyZW50KCk7Ci0KLSAgICAgICAgUmVuZGVyT2JqZWN0KiBvYmplY3Qg
PSBmbG93Qm94LT5yZW5kZXJlcigpOwotICAgICAgICBBU1NFUlQob2JqZWN0KTsKLQotICAgICAg
ICAvLyBDbGVhbiB1cCBsYXN0IHVzZWQgcGFpbnQgc2VydmVyCi0gICAgICAgIHRlYXJkb3duRmls
bFBhaW50U2VydmVyKCk7Ci0gICAgICAgIHRlYXJkb3duU3Ryb2tlUGFpbnRTZXJ2ZXIoKTsKLQot
ICAgICAgICAvLyBGaW5hbGl6ZSB0ZXh0IHJlbmRlcmluZyAKLSAgICAgICAgaWYgKCFmbG93Qm94
LT5pc1Jvb3RJbmxpbmVCb3goKSkgewotICAgICAgICAgICAgU1ZHUmVuZGVyQmFzZTo6ZmluaXNo
UmVuZGVyU1ZHQ29udGVudChvYmplY3QsIG1fcGFpbnRJbmZvLCBtX2ZpbHRlciwgbV9zYXZlZElu
Zm8uY29udGV4dCk7Ci0gICAgICAgICAgICBtX2ZpbHRlciA9IDA7Ci0gICAgICAgIH0KLQotICAg
ICAgICAvLyBSZXN0b3JlIGNvbnRleHQgJiByZXBhaW50IHJlY3QKLSAgICAgICAgbV9wYWludElu
Zm8uY29udGV4dC0+cmVzdG9yZSgpOwotICAgICAgICBtX3BhaW50SW5mby5yZWN0ID0gbV9zYXZl
ZEluZm8ucmVjdDsKLSAgICB9Ci0KLSAgICBib29sIHNldHVwQmFja2dyb3VuZChTVkdJbmxpbmVU
ZXh0Qm94KikKLSAgICB7Ci0gICAgICAgIG1fdGV4dFBhaW50SW5mby5zdWJwaGFzZSA9IFNWR1Rl
eHRQYWludFN1YnBoYXNlQmFja2dyb3VuZDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot
Ci0gICAgYm9vbCBzZXR1cEZpbGwoU1ZHSW5saW5lVGV4dEJveCogYm94KQotICAgIHsKLSAgICAg
ICAgSW5saW5lRmxvd0JveCogZmxvd0JveCA9IGJveC0+cGFyZW50KCk7Ci0KLSAgICAgICAgLy8g
U2V0dXAgZmlsbCBwYWludCBzZXJ2ZXIKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBvYmplY3QgPSBm
bG93Qm94LT5yZW5kZXJlcigpOwotICAgICAgICBBU1NFUlQob2JqZWN0KTsKLQotICAgICAgICBB
U1NFUlQoIW1fc3Ryb2tlUGFpbnRpbmdSZXNvdXJjZSk7Ci0gICAgICAgIHRlYXJkb3duRmlsbFBh
aW50U2VydmVyKCk7Ci0KLSAgICAgICAgbV90ZXh0UGFpbnRJbmZvLnN1YnBoYXNlID0gU1ZHVGV4
dFBhaW50U3VicGhhc2VHbHlwaEZpbGw7Ci0gICAgICAgIG1fZmlsbFBhaW50aW5nUmVzb3VyY2Ug
PSBSZW5kZXJTVkdSZXNvdXJjZTo6ZmlsbFBhaW50aW5nUmVzb3VyY2Uob2JqZWN0LCBvYmplY3Qt
PnN0eWxlKCkpOwotICAgICAgICBpZiAobV9maWxsUGFpbnRpbmdSZXNvdXJjZSkgewotICAgICAg
ICAgICAgbV9maWxsUGFpbnRpbmdSZXNvdXJjZS0+YXBwbHlSZXNvdXJjZShvYmplY3QsIG9iamVj
dC0+c3R5bGUoKSwgbV9wYWludEluZm8uY29udGV4dCwgQXBwbHlUb0ZpbGxNb2RlIHwgQXBwbHlU
b1RleHRNb2RlKTsKLSAgICAgICAgICAgIG1fZmlsbFBhaW50aW5nUmVzb3VyY2VPYmplY3QgPSBv
YmplY3Q7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIHNldHVwRmlsbFNlbGVjdGlvbihTVkdJbmxp
bmVUZXh0Qm94KiBib3gpCi0gICAgewotICAgICAgICBJbmxpbmVGbG93Qm94KiBmbG93Qm94ID0g
Ym94LT5wYXJlbnQoKTsKLQotICAgICAgICAvLyBTZXR1cCBmaWxsIHBhaW50IHNlcnZlcgotICAg
ICAgICBSZW5kZXJPYmplY3QqIG9iamVjdCA9IGZsb3dCb3gtPnJlbmRlcmVyKCk7Ci0gICAgICAg
IEFTU0VSVChvYmplY3QpOwotICAgICAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBvYmplY3QtPmdl
dENhY2hlZFBzZXVkb1N0eWxlKFNFTEVDVElPTik7Ci0gICAgICAgIGlmICghc3R5bGUpCi0gICAg
ICAgICAgICBzdHlsZSA9IG9iamVjdC0+c3R5bGUoKTsKLQotICAgICAgICBBU1NFUlQoIW1fc3Ry
b2tlUGFpbnRpbmdSZXNvdXJjZSk7Ci0gICAgICAgIHRlYXJkb3duRmlsbFBhaW50U2VydmVyKCk7
Ci0KLSAgICAgICAgaWYgKCFtYXlIYXZlU2VsZWN0aW9uKGJveCkpCi0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICAgICAgbV90ZXh0UGFpbnRJbmZvLnN1YnBoYXNlID0gU1ZHVGV4dFBh
aW50U3VicGhhc2VHbHlwaEZpbGxTZWxlY3Rpb247Ci0gICAgICAgIG1fZmlsbFBhaW50aW5nUmVz
b3VyY2UgPSBSZW5kZXJTVkdSZXNvdXJjZTo6ZmlsbFBhaW50aW5nUmVzb3VyY2Uob2JqZWN0LCBz
dHlsZSk7Ci0gICAgICAgIGlmIChtX2ZpbGxQYWludGluZ1Jlc291cmNlKSB7Ci0gICAgICAgICAg
ICBtX2ZpbGxQYWludGluZ1Jlc291cmNlLT5hcHBseVJlc291cmNlKG9iamVjdCwgc3R5bGUsIG1f
cGFpbnRJbmZvLmNvbnRleHQsIEFwcGx5VG9GaWxsTW9kZSB8IEFwcGx5VG9UZXh0TW9kZSk7Ci0g
ICAgICAgICAgICBtX2ZpbGxQYWludGluZ1Jlc291cmNlT2JqZWN0ID0gb2JqZWN0OwotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotCi0gICAgYm9vbCBzZXR1cFN0cm9rZShTVkdJbmxpbmVUZXh0Qm94KiBib3gpCi0gICAg
ewotICAgICAgICBJbmxpbmVGbG93Qm94KiBmbG93Qm94ID0gYm94LT5wYXJlbnQoKTsKLQotICAg
ICAgICAvLyBTZXR1cCBzdHJva2UgcGFpbnQgc2VydmVyCi0gICAgICAgIFJlbmRlck9iamVjdCog
b2JqZWN0ID0gZmxvd0JveC0+cmVuZGVyZXIoKTsKLSAgICAgICAgQVNTRVJUKG9iamVjdCk7Ci0K
LSAgICAgICAgLy8gSWYgd2UncmUgYm90aCBzdHJva2VkICYgZmlsbGVkLCB0ZWFyZG93biBmaWxs
IHBhaW50IHNlcnZlciBiZWZvcmUgc3Ryb2tpbmcuCi0gICAgICAgIHRlYXJkb3duRmlsbFBhaW50
U2VydmVyKCk7Ci0gICAgICAgIHRlYXJkb3duU3Ryb2tlUGFpbnRTZXJ2ZXIoKTsKLQotICAgICAg
ICBtX3RleHRQYWludEluZm8uc3VicGhhc2UgPSBTVkdUZXh0UGFpbnRTdWJwaGFzZUdseXBoU3Ry
b2tlOwotICAgICAgICBtX3N0cm9rZVBhaW50aW5nUmVzb3VyY2UgPSBSZW5kZXJTVkdSZXNvdXJj
ZTo6c3Ryb2tlUGFpbnRpbmdSZXNvdXJjZShvYmplY3QsIG9iamVjdC0+c3R5bGUoKSk7Ci0gICAg
ICAgIGlmIChtX3N0cm9rZVBhaW50aW5nUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIG1fc3Ryb2tl
UGFpbnRpbmdSZXNvdXJjZS0+YXBwbHlSZXNvdXJjZShvYmplY3QsIG9iamVjdC0+c3R5bGUoKSwg
bV9wYWludEluZm8uY29udGV4dCwgQXBwbHlUb1N0cm9rZU1vZGUgfCBBcHBseVRvVGV4dE1vZGUp
OwotICAgICAgICAgICAgbV9zdHJva2VQYWludGluZ1Jlc291cmNlT2JqZWN0ID0gb2JqZWN0Owot
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQotCi0gICAgYm9vbCBzZXR1cFN0cm9rZVNlbGVjdGlvbihTVkdJbmxpbmVUZXh0
Qm94KiBib3gpCi0gICAgewotICAgICAgICBJbmxpbmVGbG93Qm94KiBmbG93Qm94ID0gYm94LT5w
YXJlbnQoKTsKLQotICAgICAgICAvLyBTZXR1cCBzdHJva2UgcGFpbnQgc2VydmVyCi0gICAgICAg
IFJlbmRlck9iamVjdCogb2JqZWN0ID0gZmxvd0JveC0+cmVuZGVyZXIoKTsKLSAgICAgICAgQVNT
RVJUKG9iamVjdCk7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG9iamVjdC0+Z2V0Q2Fj
aGVkUHNldWRvU3R5bGUoU0VMRUNUSU9OKTsKLSAgICAgICAgaWYgKCFzdHlsZSkKLSAgICAgICAg
ICAgIHN0eWxlID0gb2JqZWN0LT5zdHlsZSgpOwotCi0gICAgICAgIC8vIElmIHdlJ3JlIGJvdGgg
c3Ryb2tlZCAmIGZpbGxlZCwgdGVhcmRvd24gZmlsbCBwYWludCBzZXJ2ZXIgYmVmb3JlIHN0cm9r
aW5nLgotICAgICAgICB0ZWFyZG93bkZpbGxQYWludFNlcnZlcigpOwotICAgICAgICB0ZWFyZG93
blN0cm9rZVBhaW50U2VydmVyKCk7Ci0KLSAgICAgICAgaWYgKCFtYXlIYXZlU2VsZWN0aW9uKGJv
eCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgbV90ZXh0UGFpbnRJbmZv
LnN1YnBoYXNlID0gU1ZHVGV4dFBhaW50U3VicGhhc2VHbHlwaFN0cm9rZVNlbGVjdGlvbjsKLSAg
ICAgICAgbV9zdHJva2VQYWludGluZ1Jlc291cmNlID0gUmVuZGVyU1ZHUmVzb3VyY2U6OnN0cm9r
ZVBhaW50aW5nUmVzb3VyY2Uob2JqZWN0LCBzdHlsZSk7Ci0gICAgICAgIGlmIChtX3N0cm9rZVBh
aW50aW5nUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIG1fc3Ryb2tlUGFpbnRpbmdSZXNvdXJjZS0+
YXBwbHlSZXNvdXJjZShvYmplY3QsIHN0eWxlLCBtX3BhaW50SW5mby5jb250ZXh0LCBBcHBseVRv
U3Ryb2tlTW9kZSB8IEFwcGx5VG9UZXh0TW9kZSk7Ci0gICAgICAgICAgICBtX3N0cm9rZVBhaW50
aW5nUmVzb3VyY2VPYmplY3QgPSBvYmplY3Q7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIHNldHVw
Rm9yZWdyb3VuZChTVkdJbmxpbmVUZXh0Qm94KikKLSAgICB7Ci0gICAgICAgIHRlYXJkb3duRmls
bFBhaW50U2VydmVyKCk7Ci0gICAgICAgIHRlYXJkb3duU3Ryb2tlUGFpbnRTZXJ2ZXIoKTsKLQot
ICAgICAgICBtX3RleHRQYWludEluZm8uc3VicGhhc2UgPSBTVkdUZXh0UGFpbnRTdWJwaGFzZUZv
cmVncm91bmQ7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgUmVuZGVyU1ZH
UmVzb3VyY2UqIGFjdGl2ZVBhaW50aW5nUmVzb3VyY2UoKSBjb25zdAotICAgIHsKLSAgICAgICAg
c3dpdGNoIChtX3RleHRQYWludEluZm8uc3VicGhhc2UpIHsKLSAgICAgICAgY2FzZSBTVkdUZXh0
UGFpbnRTdWJwaGFzZUdseXBoRmlsbDoKLSAgICAgICAgY2FzZSBTVkdUZXh0UGFpbnRTdWJwaGFz
ZUdseXBoRmlsbFNlbGVjdGlvbjoKLSAgICAgICAgICAgIEFTU0VSVChtX2ZpbGxQYWludGluZ1Jl
c291cmNlKTsKLSAgICAgICAgICAgIHJldHVybiBtX2ZpbGxQYWludGluZ1Jlc291cmNlOwotICAg
ICAgICBjYXNlIFNWR1RleHRQYWludFN1YnBoYXNlR2x5cGhTdHJva2U6Ci0gICAgICAgIGNhc2Ug
U1ZHVGV4dFBhaW50U3VicGhhc2VHbHlwaFN0cm9rZVNlbGVjdGlvbjoKLSAgICAgICAgICAgIEFT
U0VSVChtX3N0cm9rZVBhaW50aW5nUmVzb3VyY2UpOwotICAgICAgICAgICAgcmV0dXJuIG1fc3Ry
b2tlUGFpbnRpbmdSZXNvdXJjZTsKLSAgICAgICAgY2FzZSBTVkdUZXh0UGFpbnRTdWJwaGFzZUJh
Y2tncm91bmQ6Ci0gICAgICAgIGNhc2UgU1ZHVGV4dFBhaW50U3VicGhhc2VGb3JlZ3JvdW5kOgot
ICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9
CisgICAgQVNTRVJUKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlRm9yZWdyb3VuZCk7Cisg
ICAgQVNTRVJUKCFwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKTsKIAotICAg
IHZvaWQgY2h1bmtQb3J0aW9uQ2FsbGJhY2soU1ZHSW5saW5lVGV4dEJveCogdGV4dEJveCwgaW50
IHN0YXJ0T2Zmc2V0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIGNodW5rQ3RtLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPFNWR0NoYXI+OjppdGVyYXRvciYgc3Rh
cnQsIGNvbnN0IFZlY3RvcjxTVkdDaGFyPjo6aXRlcmF0b3ImIGVuZCkKLSAgICB7Ci0gICAgICAg
IGlmIChzZXR1cEJhY2tncm91bmQodGV4dEJveCkpCi0gICAgICAgICAgICBwYWludENodW5rKHRl
eHRCb3gsIHN0YXJ0T2Zmc2V0LCBjaHVua0N0bSwgc3RhcnQsIGVuZCk7Ci0KLSAgICAgICAgaWYg
KHNldHVwRmlsbCh0ZXh0Qm94KSkKLSAgICAgICAgICAgIHBhaW50Q2h1bmsodGV4dEJveCwgc3Rh
cnRPZmZzZXQsIGNodW5rQ3RtLCBzdGFydCwgZW5kKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChz
ZXR1cEZpbGxTZWxlY3Rpb24odGV4dEJveCkpCi0gICAgICAgICAgICBwYWludENodW5rKHRleHRC
b3gsIHN0YXJ0T2Zmc2V0LCBjaHVua0N0bSwgc3RhcnQsIGVuZCk7Ci0KLSAgICAgICAgaWYgKHNl
dHVwU3Ryb2tlKHRleHRCb3gpKQotICAgICAgICAgICAgcGFpbnRDaHVuayh0ZXh0Qm94LCBzdGFy
dE9mZnNldCwgY2h1bmtDdG0sIHN0YXJ0LCBlbmQpOwotCi0gICAgICAgIGlmIChzZXR1cFN0cm9r
ZVNlbGVjdGlvbih0ZXh0Qm94KSkKLSAgICAgICAgICAgIHBhaW50Q2h1bmsodGV4dEJveCwgc3Rh
cnRPZmZzZXQsIGNodW5rQ3RtLCBzdGFydCwgZW5kKTsKLQotICAgICAgICBpZiAoc2V0dXBGb3Jl
Z3JvdW5kKHRleHRCb3gpKQotICAgICAgICAgICAgcGFpbnRDaHVuayh0ZXh0Qm94LCBzdGFydE9m
ZnNldCwgY2h1bmtDdG0sIHN0YXJ0LCBlbmQpOwotICAgIH0KLQotICAgIHZvaWQgcGFpbnRDaHVu
ayhTVkdJbmxpbmVUZXh0Qm94KiB0ZXh0Qm94LCBpbnQgc3RhcnRPZmZzZXQsIGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSYgY2h1bmtDdG0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxT
VkdDaGFyPjo6aXRlcmF0b3ImIHN0YXJ0LCBjb25zdCBWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9y
JiBlbmQpCi0gICAgewotICAgICAgICBSZW5kZXJUZXh0KiB0ZXh0ID0gdGV4dEJveC0+dGV4dFJl
bmRlcmVyKCk7Ci0gICAgICAgIEFTU0VSVCh0ZXh0KTsKLQotICAgICAgICBSZW5kZXJTdHlsZSog
c3R5bGVUb1VzZSA9IHRleHQtPnN0eWxlKHRleHRCb3gtPmlzRmlyc3RMaW5lU3R5bGUoKSk7Ci0g
ICAgICAgIEFTU0VSVChzdHlsZVRvVXNlKTsKLQotICAgICAgICBzdGFydE9mZnNldCArPSB0ZXh0
Qm94LT5zdGFydCgpOwotCi0gICAgICAgIGludCB0ZXh0RGVjb3JhdGlvbnMgPSBzdHlsZVRvVXNl
LT50ZXh0RGVjb3JhdGlvbnNJbkVmZmVjdCgpOyAKLQotICAgICAgICBpbnQgdGV4dFdpZHRoID0g
MDsKLSAgICAgICAgSW50UG9pbnQgZGVjb3JhdGlvbk9yaWdpbjsKLSAgICAgICAgU1ZHVGV4dERl
Y29yYXRpb25JbmZvIGluZm87Ci0KLSAgICAgICAgaWYgKCFjaHVua0N0bS5pc0lkZW50aXR5KCkp
Ci0gICAgICAgICAgICBtX3BhaW50SW5mby5jb250ZXh0LT5jb25jYXRDVE0oY2h1bmtDdG0pOwot
Ci0gICAgICAgIGZvciAoVmVjdG9yPFNWR0NoYXI+OjppdGVyYXRvciBpdCA9IHN0YXJ0OyBpdCAh
PSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgIGlmIChpdC0+aXNIaWRkZW4oKSkKLSAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBtYW55IGNo
YXJhY3RlcnMgLSBzdGFydGluZyBmcm9tIHRoZSBjdXJyZW50IC0gY2FuIGJlIGRyYXduIGF0IG9u
Y2UuCi0gICAgICAgICAgICBWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yIGl0U2VhcmNoID0gaXQg
KyAxOwotICAgICAgICAgICAgd2hpbGUgKGl0U2VhcmNoICE9IGVuZCkgewotICAgICAgICAgICAg
ICAgIGlmIChpdFNlYXJjaC0+ZHJhd25TZXBlcmF0ZWQgfHwgaXRTZWFyY2gtPmlzSGlkZGVuKCkp
Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgaXRTZWFyY2gr
KzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29uc3QgVUNoYXIqIHN0cmluZ1N0YXJ0
ID0gdGV4dC0+Y2hhcmFjdGVycygpICsgc3RhcnRPZmZzZXQgKyAoaXQgLSBzdGFydCk7Ci0gICAg
ICAgICAgICB1bnNpZ25lZCBpbnQgc3RyaW5nTGVuZ3RoID0gaXRTZWFyY2ggLSBpdDsKLQotICAg
ICAgICAgICAgLy8gUGFpbnQgZGVjb3JhdGlvbnMsIHRoYXQgaGF2ZSB0byBiZSBkcmF3biBiZWZv
cmUgdGhlIHRleHQgZ2V0cyBkcmF3bgotICAgICAgICAgICAgaWYgKHRleHREZWNvcmF0aW9ucyAh
PSBURE5PTkUgJiYgbV9wYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZVNlbGVjdGlvbikgewot
ICAgICAgICAgICAgICAgIHRleHRXaWR0aCA9IHN0eWxlVG9Vc2UtPmZvbnQoKS53aWR0aChzdmdU
ZXh0UnVuRm9ySW5saW5lVGV4dEJveChzdHJpbmdTdGFydCwgc3RyaW5nTGVuZ3RoLCBzdHlsZVRv
VXNlLCB0ZXh0Qm94LCAoKml0KS54KSk7Ci0gICAgICAgICAgICAgICAgZGVjb3JhdGlvbk9yaWdp
biA9IEludFBvaW50KChpbnQpICgqaXQpLngsIChpbnQpICgqaXQpLnkgLSBzdHlsZVRvVXNlLT5m
b250KCkuYXNjZW50KCkpOwotICAgICAgICAgICAgICAgIGluZm8gPSBtX3Jvb3RCb3gtPnJldHJp
ZXZlUGFpbnRTZXJ2ZXJzRm9yVGV4dERlY29yYXRpb24odGV4dCk7Ci0gICAgICAgICAgICB9Cisg
ICAgUmVuZGVyT2JqZWN0KiBib3hSZW5kZXJlciA9IHJlbmRlcmVyKCk7CisgICAgQVNTRVJUKGJv
eFJlbmRlcmVyKTsKIAotICAgICAgICAgICAgaWYgKHRleHREZWNvcmF0aW9ucyAmIFVOREVSTElO
RSAmJiB0ZXh0V2lkdGggIT0gMC4wZikKLSAgICAgICAgICAgICAgICB0ZXh0Qm94LT5wYWludERl
Y29yYXRpb24oVU5ERVJMSU5FLCBtX3BhaW50SW5mby5jb250ZXh0LCBkZWNvcmF0aW9uT3JpZ2lu
LngoKSwgZGVjb3JhdGlvbk9yaWdpbi55KCksIHRleHRXaWR0aCwgKml0LCBpbmZvKTsKKyAgICBS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyBjaGlsZFBhaW50SW5mbyhwYWludEluZm8pOworICAgIGNo
aWxkUGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKIAotICAgICAgICAgICAgaWYgKHRleHREZWNv
cmF0aW9ucyAmIE9WRVJMSU5FICYmIHRleHRXaWR0aCAhPSAwLjBmKQotICAgICAgICAgICAgICAg
IHRleHRCb3gtPnBhaW50RGVjb3JhdGlvbihPVkVSTElORSwgbV9wYWludEluZm8uY29udGV4dCwg
ZGVjb3JhdGlvbk9yaWdpbi54KCksIGRlY29yYXRpb25PcmlnaW4ueSgpLCB0ZXh0V2lkdGgsICpp
dCwgaW5mbyk7Ci0KLSAgICAgICAgICAgIC8vIFBhaW50IHRleHQKLSAgICAgICAgICAgIG1fdGV4
dFBhaW50SW5mby5hY3RpdmVQYWludGluZ1Jlc291cmNlID0gYWN0aXZlUGFpbnRpbmdSZXNvdXJj
ZSgpOwotICAgICAgICAgICAgdGV4dEJveC0+cGFpbnRDaGFyYWN0ZXJzKG1fcGFpbnRJbmZvLCBt
X3R4LCBtX3R5LCAqaXQsIHN0cmluZ1N0YXJ0LCBzdHJpbmdMZW5ndGgsIG1fdGV4dFBhaW50SW5m
byk7Ci0KLSAgICAgICAgICAgIC8vIFBhaW50IGRlY29yYXRpb25zLCB0aGF0IGhhdmUgdG8gYmUg
ZHJhd24gYWZ0ZXJ3YXJkcwotICAgICAgICAgICAgaWYgKHRleHREZWNvcmF0aW9ucyAmIExJTkVf
VEhST1VHSCAmJiB0ZXh0V2lkdGggIT0gMC4wZikKLSAgICAgICAgICAgICAgICB0ZXh0Qm94LT5w
YWludERlY29yYXRpb24oTElORV9USFJPVUdILCBtX3BhaW50SW5mby5jb250ZXh0LCBkZWNvcmF0
aW9uT3JpZ2luLngoKSwgZGVjb3JhdGlvbk9yaWdpbi55KCksIHRleHRXaWR0aCwgKml0LCBpbmZv
KTsKLQotICAgICAgICAgICAgLy8gU2tpcCBwcm9jZXNzZWQgY2hhcmFjdGVycwotICAgICAgICAg
ICAgaXQgPSBpdFNlYXJjaCAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWNodW5rQ3Rt
LmlzSWRlbnRpdHkoKSkKLSAgICAgICAgICAgIG1fcGFpbnRJbmZvLmNvbnRleHQtPmNvbmNhdENU
TShjaHVua0N0bS5pbnZlcnNlKCkpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBTVkdSb290SW5s
aW5lQm94KiBtX3Jvb3RCb3g7Ci0gICAgYm9vbCBtX2NodW5rU3RhcnRlZCA6IDE7Ci0KLSAgICBS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyBtX3BhaW50SW5mbzsKLSAgICBSZW5kZXJPYmplY3Q6OlBh
aW50SW5mbyBtX3NhdmVkSW5mbzsKLQotICAgIEZsb2F0UmVjdCBtX2JvdW5kaW5nQm94OwotICAg
IFJlbmRlclNWR1Jlc291cmNlRmlsdGVyKiBtX2ZpbHRlcjsKLQotICAgIFJlbmRlclNWR1Jlc291
cmNlKiBtX2ZpbGxQYWludGluZ1Jlc291cmNlOwotICAgIFJlbmRlclNWR1Jlc291cmNlKiBtX3N0
cm9rZVBhaW50aW5nUmVzb3VyY2U7Ci0KLSAgICBSZW5kZXJPYmplY3QqIG1fZmlsbFBhaW50aW5n
UmVzb3VyY2VPYmplY3Q7Ci0gICAgUmVuZGVyT2JqZWN0KiBtX3N0cm9rZVBhaW50aW5nUmVzb3Vy
Y2VPYmplY3Q7Ci0KLSAgICBpbnQgbV90eDsKLSAgICBpbnQgbV90eTsKLQotICAgIFNWR1RleHRQ
YWludEluZm8gbV90ZXh0UGFpbnRJbmZvOwotfTsKLQotdm9pZCBTVkdSb290SW5saW5lQm94Ojpw
YWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSkK
LXsKLSAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSB8fCBwYWlu
dEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIFJlbmRlck9iamVjdDo6UGFpbnRJbmZvIHNhdmVkSW5mbyhwYWludEluZm8pOwotICAgIHBh
aW50SW5mby5jb250ZXh0LT5zYXZlKCk7CisgICAgRmxvYXRSZWN0IGJvdW5kaW5nQm94ID0gYm94
UmVuZGVyZXItPnJlcGFpbnRSZWN0SW5Mb2NhbENvb3JkaW5hdGVzKCk7CiAKICAgICBSZW5kZXJT
VkdSZXNvdXJjZUZpbHRlciogZmlsdGVyID0gMDsKLSAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3go
dHggKyB4KCksIHR5ICsgeSgpLCB3aWR0aCgpLCBoZWlnaHQoKSk7Ci0KLSAgICAvLyBJbml0aWFs
aXplIHRleHQgcmVuZGVyaW5nCi0gICAgaWYgKFNWR1JlbmRlckJhc2U6OnByZXBhcmVUb1JlbmRl
clNWR0NvbnRlbnQocmVuZGVyZXIoKSwgcGFpbnRJbmZvLCBib3VuZGluZ0JveCwgZmlsdGVyKSkg
ewotICAgICAgICAvLyBSZW5kZXIgdGV4dCwgY2h1bmstYnktY2h1bmsKLSAgICAgICAgU1ZHUm9v
dElubGluZUJveFBhaW50V2Fsa2VyIHdhbGtlckNhbGxiYWNrKHRoaXMsIHBhaW50SW5mbywgdHgs
IHR5KTsKLSAgICAgICAgU1ZHVGV4dENodW5rV2Fsa2VyPFNWR1Jvb3RJbmxpbmVCb3hQYWludFdh
bGtlcj4gd2Fsa2VyKCZ3YWxrZXJDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTVkdSb290SW5saW5lQm94UGFp
bnRXYWxrZXI6OmNodW5rUG9ydGlvbkNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNWR1Jvb3RJbmxpbmVCb3hQ
YWludFdhbGtlcjo6Y2h1bmtTdGFydENhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNWR1Jvb3RJbmxpbmVCb3hQ
YWludFdhbGtlcjo6Y2h1bmtFbmRDYWxsYmFjayk7Ci0KLSAgICAgICAgd2Fsa1RleHRDaHVua3Mo
JndhbGtlcik7CisgICAgaWYgKFNWR1JlbmRlckJhc2U6OnByZXBhcmVUb1JlbmRlclNWR0NvbnRl
bnQoYm94UmVuZGVyZXIsIGNoaWxkUGFpbnRJbmZvLCBib3VuZGluZ0JveCwgZmlsdGVyKSkgewor
ICAgICAgICBmb3IgKElubGluZUJveCogY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGls
ZCA9IGNoaWxkLT5uZXh0T25MaW5lKCkpCisgICAgICAgICAgICBjaGlsZC0+cGFpbnQoY2hpbGRQ
YWludEluZm8sIDAsIDApOwogICAgIH0KIAotICAgIC8vIEZpbmFsaXplIHRleHQgcmVuZGVyaW5n
IAotICAgIFNWR1JlbmRlckJhc2U6OmZpbmlzaFJlbmRlclNWR0NvbnRlbnQocmVuZGVyZXIoKSwg
cGFpbnRJbmZvLCBmaWx0ZXIsIHNhdmVkSW5mby5jb250ZXh0KTsKLSAgICBwYWludEluZm8uY29u
dGV4dC0+cmVzdG9yZSgpOwotfQotCi1pbnQgU1ZHUm9vdElubGluZUJveDo6cGxhY2VCb3hlc0hv
cml6b250YWxseShpbnQsIGludCYgbGVmdFBvc2l0aW9uLCBpbnQmIHJpZ2h0UG9zaXRpb24sIGJv
b2wmLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYpCi17Ci0gICAgLy8gUmVtb3Zl
IGFueSBvZmZzZXRzIGNhdXNlZCBieSBSVEwgdGV4dCBsYXlvdXQKLSAgICBsZWZ0UG9zaXRpb24g
PSAwOwotICAgIHJpZ2h0UG9zaXRpb24gPSAwOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgU1ZH
Um9vdElubGluZUJveDo6dmVydGljYWxseUFsaWduQm94ZXMoaW50LCBHbHlwaE92ZXJmbG93QW5k
RmFsbGJhY2tGb250c01hcCYpCi17Ci0gICAgLy8gaGVpZ2h0IGlzIHNldCBieSBsYXlvdXRJbmxp
bmVCb3hlcy4KLSAgICByZXR1cm4gaGVpZ2h0KCk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBjdW1tdWxh
dGVkV2lkdGhPckhlaWdodE9mVGV4dENodW5rKFNWR1RleHRDaHVuayYgY2h1bmssIGJvb2wgY2Fs
Y1dpZHRoT25seSkKLXsKLSAgICBmbG9hdCBsZW5ndGggPSAwLjBmOwotICAgIFZlY3RvcjxTVkdD
aGFyPjo6aXRlcmF0b3IgY2hhckl0ID0gY2h1bmsuc3RhcnQ7Ci0KLSAgICBWZWN0b3I8U1ZHSW5s
aW5lQm94Q2hhcmFjdGVyUmFuZ2U+OjppdGVyYXRvciBpdCA9IGNodW5rLmJveGVzLmJlZ2luKCk7
Ci0gICAgVmVjdG9yPFNWR0lubGluZUJveENoYXJhY3RlclJhbmdlPjo6aXRlcmF0b3IgZW5kID0g
Y2h1bmsuYm94ZXMuZW5kKCk7Ci0KLSAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAg
ICAgIFNWR0lubGluZUJveENoYXJhY3RlclJhbmdlJiByYW5nZSA9ICppdDsKLQotICAgICAgICBT
VkdJbmxpbmVUZXh0Qm94KiBib3ggPSBzdGF0aWNfY2FzdDxTVkdJbmxpbmVUZXh0Qm94Kj4ocmFu
Z2UuYm94KTsKLSAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gYm94LT5yZW5kZXJlcigpLT5z
dHlsZSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSByYW5nZS5zdGFydE9mZnNldDsgaSA8IHJh
bmdlLmVuZE9mZnNldDsgKytpKSB7Ci0gICAgICAgICAgICBBU1NFUlQoY2hhckl0IDw9IGNodW5r
LmVuZCk7Ci0KLSAgICAgICAgICAgIC8vIERldGVybWluZSBob3cgbWFueSBjaGFyYWN0ZXJzIC0g
c3RhcnRpbmcgZnJvbSB0aGUgY3VycmVudCAtIGNhbiBiZSBtZWFzdXJlZCBhdCBvbmNlLgotICAg
ICAgICAgICAgLy8gSW1wb3J0YW50IGZvciBub24tYWJzb2x1dGUgcG9zaXRpb25lZCBub24tbGF0
aW4xIHRleHQgKGllLiBBcmFiaWMpIHdoZXJlIGllLiB0aGUgd2lkdGgKLSAgICAgICAgICAgIC8v
IG9mIGEgc3RyaW5nIGlzIG5vdCB0aGUgc3VtIG9mIHRoZSBib3VuZGFyaWVzIG9mIGFsbCBjb250
YWluZWQgZ2x5cGhzLgotICAgICAgICAgICAgVmVjdG9yPFNWR0NoYXI+OjppdGVyYXRvciBpdFNl
YXJjaCA9IGNoYXJJdCArIDE7Ci0gICAgICAgICAgICBWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9y
IGVuZFNlYXJjaCA9IGNoYXJJdCArIHJhbmdlLmVuZE9mZnNldCAtIGk7Ci0gICAgICAgICAgICB3
aGlsZSAoaXRTZWFyY2ggIT0gZW5kU2VhcmNoKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gbmVl
ZCB0byBjaGVjayBmb3IgJ2lzSGlkZGVuKCknIGhlcmUgYXMgdGhpcyBmdW5jdGlvbiBpcyBub3Qg
Y2FsbGVkIGZvciB0ZXh0IHBhdGhzLgotICAgICAgICAgICAgICAgIGlmIChpdFNlYXJjaC0+ZHJh
d25TZXBlcmF0ZWQpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAg
ICAgaXRTZWFyY2grKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdW5zaWduZWQgaW50
IHBvc2l0aW9uT2Zmc2V0ID0gaXRTZWFyY2ggLSBjaGFySXQ7Ci0KLSAgICAgICAgICAgIC8vIENh
bGN1bGF0ZSB3aWR0aC9oZWlnaHQgb2Ygc3VicmFuZ2UKLSAgICAgICAgICAgIFNWR0lubGluZUJv
eENoYXJhY3RlclJhbmdlIHN1YlJhbmdlOwotICAgICAgICAgICAgc3ViUmFuZ2UuYm94ID0gcmFu
Z2UuYm94OwotICAgICAgICAgICAgc3ViUmFuZ2Uuc3RhcnRPZmZzZXQgPSBpOwotICAgICAgICAg
ICAgc3ViUmFuZ2UuZW5kT2Zmc2V0ID0gaSArIHBvc2l0aW9uT2Zmc2V0OwotCi0gICAgICAgICAg
ICBpZiAoY2FsY1dpZHRoT25seSkKLSAgICAgICAgICAgICAgICBsZW5ndGggKz0gY3VtbXVsYXRl
ZFdpZHRoT2ZJbmxpbmVCb3hDaGFyYWN0ZXJSYW5nZShzdWJSYW5nZSk7Ci0gICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IGN1bW11bGF0ZWRIZWlnaHRPZklubGluZUJv
eENoYXJhY3RlclJhbmdlKHN1YlJhbmdlKTsKLQotICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGdh
cCBiZXR3ZWVuIHRoZSBwcmV2aW91cyAmIGN1cnJlbnQgcmFuZ2UKLSAgICAgICAgICAgIC8vIDx0
ZXh0IHg9IjEwIDUwIDcwIj5BQkNEPC90ZXh0PiAtIHdlIG5lZWQgdG8gdGFrZSB0aGUgZ2FwcyBi
ZXR3ZWVuIEEgJiBCIGludG8gYWNjb3VudAotICAgICAgICAgICAgLy8gc28gYWRkICI0MCIgYXMg
d2lkdGgsIGFuZCBhbmFsb2dvdXMgZm9yIEIgJiBDLCBhZGQgIjIwIiBhcyB3aWR0aC4KLSAgICAg
ICAgICAgIGlmIChpdFNlYXJjaCA+IGNodW5rLnN0YXJ0ICYmIGl0U2VhcmNoIDwgY2h1bmsuZW5k
KSB7Ci0gICAgICAgICAgICAgICAgU1ZHQ2hhciYgbGFzdENoYXJhY3RlciA9ICooaXRTZWFyY2gg
LSAxKTsKLSAgICAgICAgICAgICAgICBTVkdDaGFyJiBjdXJyZW50Q2hhcmFjdGVyID0gKml0U2Vh
cmNoOwotCi0gICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGJveC0+ZGlyZWN0aW9uKCkgPT0g
UlRMID8gYm94LT5lbmQoKSAtIGkgLSBwb3NpdGlvbk9mZnNldCArIDEgOiBib3gtPnN0YXJ0KCkg
KyBpICsgcG9zaXRpb25PZmZzZXQgLSAxOwotCi0gICAgICAgICAgICAgICAgLy8gRklYTUU6IGRv
ZXMgdGhpcyBuZWVkIHRvIGNoYW5nZSB0byBoYW5kbGUgbXVsdGljaGFyIGdseXBocz8KLSAgICAg
ICAgICAgICAgICBpbnQgY2hhcnNDb25zdW1lZCA9IDE7Ci0gICAgICAgICAgICAgICAgU3RyaW5n
IGdseXBoTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAoY2FsY1dpZHRoT25seSkgewotICAgICAg
ICAgICAgICAgICAgICBmbG9hdCBsYXN0R2x5cGhXaWR0aCA9IGJveC0+Y2FsY3VsYXRlR2x5cGhX
aWR0aChzdHlsZSwgb2Zmc2V0LCAwLCBjaGFyc0NvbnN1bWVkLCBnbHlwaE5hbWUpOwotICAgICAg
ICAgICAgICAgICAgICBsZW5ndGggKz0gY3VycmVudENoYXJhY3Rlci54IC0gbGFzdENoYXJhY3Rl
ci54IC0gbGFzdEdseXBoV2lkdGg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgICAgICAgICAgZmxvYXQgbGFzdEdseXBoSGVpZ2h0ID0gYm94LT5jYWxjdWxhdGVHbHlwaEhl
aWdodChzdHlsZSwgb2Zmc2V0LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICs9IGN1
cnJlbnRDaGFyYWN0ZXIueSAtIGxhc3RDaGFyYWN0ZXIueSAtIGxhc3RHbHlwaEhlaWdodDsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkdmFuY2Ug
cHJvY2Vzc2VkIGNoYXJhY3RlcnMKLSAgICAgICAgICAgIGkgKz0gcG9zaXRpb25PZmZzZXQgLSAx
OwotICAgICAgICAgICAgY2hhckl0ID0gaXRTZWFyY2g7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg
ICBBU1NFUlQoY2hhckl0ID09IGNodW5rLmVuZCk7Ci0gICAgcmV0dXJuIGxlbmd0aDsKLX0KLQot
c3RhdGljIGZsb2F0IGN1bW11bGF0ZWRXaWR0aE9mVGV4dENodW5rKFNWR1RleHRDaHVuayYgY2h1
bmspCi17Ci0gICAgcmV0dXJuIGN1bW11bGF0ZWRXaWR0aE9ySGVpZ2h0T2ZUZXh0Q2h1bmsoY2h1
bmssIHRydWUpOwotfQotCi1zdGF0aWMgZmxvYXQgY3VtbXVsYXRlZEhlaWdodE9mVGV4dENodW5r
KFNWR1RleHRDaHVuayYgY2h1bmspCi17Ci0gICAgcmV0dXJuIGN1bW11bGF0ZWRXaWR0aE9ySGVp
Z2h0T2ZUZXh0Q2h1bmsoY2h1bmssIGZhbHNlKTsKLX0KLQotc3RhdGljIGZsb2F0IGNhbGN1bGF0
ZVRleHRBbmNob3JTaGlmdEZvclRleHRDaHVuayhTVkdUZXh0Q2h1bmsmIGNodW5rLCBFVGV4dEFu
Y2hvciBhbmNob3IpCi17Ci0gICAgZmxvYXQgc2hpZnQgPSAwLjBmOwotCi0gICAgaWYgKGNodW5r
LmlzVmVydGljYWxUZXh0KQotICAgICAgICBzaGlmdCA9IGN1bW11bGF0ZWRIZWlnaHRPZlRleHRD
aHVuayhjaHVuayk7Ci0gICAgZWxzZQotICAgICAgICBzaGlmdCA9IGN1bW11bGF0ZWRXaWR0aE9m
VGV4dENodW5rKGNodW5rKTsKLQotICAgIGlmIChhbmNob3IgPT0gVEFfTUlERExFKQotICAgICAg
ICBzaGlmdCAqPSAtMC41ZjsKLSAgICBlbHNlCi0gICAgICAgIHNoaWZ0ICo9IC0xLjBmOwotCi0g
ICAgcmV0dXJuIHNoaWZ0OwotfQotCi1zdGF0aWMgdm9pZCBhcHBseVRleHRBbmNob3JUb1RleHRD
aHVuayhTVkdUZXh0Q2h1bmsmIGNodW5rKQotewotICAgIC8vIFRoaXMgbWV0aG9kIGlzIG5vdCBj
YWxsZWQgZm9yIGNodW5rcyBjb250YWluaW5nIGNoYXJzIGFsaWduZWQgb24gYSBwYXRoLgotICAg
IC8vIC0+IGFsbCBjaGFyYWN0ZXJzIGFyZSB2aXNpYmxlLCBubyBuZWVkIHRvIGNoZWNrIGZvciAi
aXNIaWRkZW4oKSIgYW55d2hlcmUuCi0KLSAgICBpZiAoY2h1bmsuYW5jaG9yID09IFRBX1NUQVJU
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBmbG9hdCBzaGlmdCA9IGNhbGN1bGF0ZVRleHRBbmNo
b3JTaGlmdEZvclRleHRDaHVuayhjaHVuaywgY2h1bmsuYW5jaG9yKTsKLQotICAgIC8vIEFwcGx5
IGNvcnJlY3Rpb24gdG8gY2h1bmsKLSAgICBWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yIGNodW5r
SXQgPSBjaHVuay5zdGFydDsKLSAgICBmb3IgKDsgY2h1bmtJdCAhPSBjaHVuay5lbmQ7ICsrY2h1
bmtJdCkgewotICAgICAgICBTVkdDaGFyJiBjdXJDaGFyID0gKmNodW5rSXQ7Ci0KLSAgICAgICAg
aWYgKGNodW5rLmlzVmVydGljYWxUZXh0KQotICAgICAgICAgICAgY3VyQ2hhci55ICs9IHNoaWZ0
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjdXJDaGFyLnggKz0gc2hpZnQ7Ci0gICAgfQot
Ci0gICAgLy8gTW92ZSBpbmxpbmUgYm94ZXMKLSAgICBWZWN0b3I8U1ZHSW5saW5lQm94Q2hhcmFj
dGVyUmFuZ2U+OjppdGVyYXRvciBib3hJdCA9IGNodW5rLmJveGVzLmJlZ2luKCk7Ci0gICAgVmVj
dG9yPFNWR0lubGluZUJveENoYXJhY3RlclJhbmdlPjo6aXRlcmF0b3IgYm94RW5kID0gY2h1bmsu
Ym94ZXMuZW5kKCk7Ci0KLSAgICBmb3IgKDsgYm94SXQgIT0gYm94RW5kOyArK2JveEl0KSB7Ci0g
ICAgICAgIFNWR0lubGluZUJveENoYXJhY3RlclJhbmdlJiByYW5nZSA9ICpib3hJdDsKLQotICAg
ICAgICBJbmxpbmVCb3gqIGN1ckJveCA9IHJhbmdlLmJveDsKLSAgICAgICAgQVNTRVJUKGN1ckJv
eC0+aXNJbmxpbmVUZXh0Qm94KCkpOwotCi0gICAgICAgIC8vIE1vdmUgdGFyZ2V0IGJveAotICAg
ICAgICBpZiAoY2h1bmsuaXNWZXJ0aWNhbFRleHQpCi0gICAgICAgICAgICBjdXJCb3gtPnNldFko
Y3VyQm94LT55KCkgKyBzdGF0aWNfY2FzdDxpbnQ+KHNoaWZ0KSk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIGN1ckJveC0+c2V0WChjdXJCb3gtPngoKSArIHN0YXRpY19jYXN0PGludD4oc2hp
ZnQpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBmbG9hdCBjYWxjdWxhdGVUZXh0TGVuZ3RoQ29ycmVj
dGlvbkZvclRleHRDaHVuayhTVkdUZXh0Q2h1bmsmIGNodW5rLCBFTGVuZ3RoQWRqdXN0IGxlbmd0
aEFkanVzdCwgZmxvYXQmIGNvbXB1dGVkTGVuZ3RoKQotewotICAgIGlmIChjaHVuay50ZXh0TGVu
Z3RoIDw9IDAuMGYpCi0gICAgICAgIHJldHVybiAwLjBmOwotCi0gICAgZmxvYXQgY29tcHV0ZWRX
aWR0aCA9IGN1bW11bGF0ZWRXaWR0aE9mVGV4dENodW5rKGNodW5rKTsKLSAgICBmbG9hdCBjb21w
dXRlZEhlaWdodCA9IGN1bW11bGF0ZWRIZWlnaHRPZlRleHRDaHVuayhjaHVuayk7Ci0KLSAgICBp
ZiAoKGNvbXB1dGVkV2lkdGggPD0gMC4wZiAmJiAhY2h1bmsuaXNWZXJ0aWNhbFRleHQpCi0gICAg
ICAgIHx8IChjb21wdXRlZEhlaWdodCA8PSAwLjBmICYmIGNodW5rLmlzVmVydGljYWxUZXh0KSkK
LSAgICAgICAgcmV0dXJuIDAuMGY7Ci0KLSAgICBpZiAoY2h1bmsuaXNWZXJ0aWNhbFRleHQpCi0g
ICAgICAgIGNvbXB1dGVkTGVuZ3RoID0gY29tcHV0ZWRIZWlnaHQ7Ci0gICAgZWxzZQotICAgICAg
ICBjb21wdXRlZExlbmd0aCA9IGNvbXB1dGVkV2lkdGg7Ci0KLSAgICBpZiAobGVuZ3RoQWRqdXN0
ID09IFNWR1RleHRDb250ZW50RWxlbWVudDo6TEVOR1RIQURKVVNUX1NQQUNJTkdBTkRHTFlQSFMp
IHsKLSAgICAgICAgaWYgKGNodW5rLmlzVmVydGljYWxUZXh0KQotICAgICAgICAgICAgY2h1bmsu
Y3RtLnNjYWxlTm9uVW5pZm9ybSgxLjBmLCBjaHVuay50ZXh0TGVuZ3RoIC8gY29tcHV0ZWRMZW5n
dGgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjaHVuay5jdG0uc2NhbGVOb25Vbmlmb3Jt
KGNodW5rLnRleHRMZW5ndGggLyBjb21wdXRlZExlbmd0aCwgMS4wZik7Ci0KLSAgICAgICAgcmV0
dXJuIDAuMGY7Ci0gICAgfQotCi0gICAgcmV0dXJuIChjaHVuay50ZXh0TGVuZ3RoIC0gY29tcHV0
ZWRMZW5ndGgpIC8gZmxvYXQoY2h1bmsuZW5kIC0gY2h1bmsuc3RhcnQpOwotfQotCi1zdGF0aWMg
dm9pZCBhcHBseVRleHRMZW5ndGhDb3JyZWN0aW9uVG9UZXh0Q2h1bmsoU1ZHVGV4dENodW5rJiBj
aHVuaykKLXsKLSAgICAvLyBUaGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGZvciBjaHVua3MgY29u
dGFpbmluZyBjaGFycyBhbGlnbmVkIG9uIGEgcGF0aC4KLSAgICAvLyAtPiBhbGwgY2hhcmFjdGVy
cyBhcmUgdmlzaWJsZSwgbm8gbmVlZCB0byBjaGVjayBmb3IgImlzSGlkZGVuKCkiIGFueXdoZXJl
LgotCi0gICAgLy8gbGVuZ3RoQWRqdXN0PSJzcGFjaW5nQW5kR2x5cGhzIiBpcyBoYW5kbGVkIGJ5
IG1vZGlmeWluZyBjaHVuay5jdG0KLSAgICBmbG9hdCBjb21wdXRlZExlbmd0aCA9IDAuMGY7Ci0g
ICAgZmxvYXQgc3BhY2luZ1RvQXBwbHkgPSBjYWxjdWxhdGVUZXh0TGVuZ3RoQ29ycmVjdGlvbkZv
clRleHRDaHVuayhjaHVuaywgY2h1bmsubGVuZ3RoQWRqdXN0LCBjb21wdXRlZExlbmd0aCk7Ci0K
LSAgICBpZiAoIWNodW5rLmN0bS5pc0lkZW50aXR5KCkgJiYgY2h1bmsubGVuZ3RoQWRqdXN0ID09
IFNWR1RleHRDb250ZW50RWxlbWVudDo6TEVOR1RIQURKVVNUX1NQQUNJTkdBTkRHTFlQSFMpIHsK
LSAgICAgICAgU1ZHQ2hhciYgZmlyc3RDaGFyID0gKihjaHVuay5zdGFydCk7Ci0KLSAgICAgICAg
Ly8gQXNzdXJlIHdlIGFwcGx5IHRoZSBjaHVuayBzY2FsaW5nIGluIHRoZSByaWdodCBvcmlnaW4K
LSAgICAgICAgQWZmaW5lVHJhbnNmb3JtIG5ld0NodW5rQ3RtKGNodW5rLmN0bSk7Ci0gICAgICAg
IG5ld0NodW5rQ3RtLnRyYW5zbGF0ZVJpZ2h0KGZpcnN0Q2hhci54LCBmaXJzdENoYXIueSk7Ci0g
ICAgICAgIG5ld0NodW5rQ3RtLnRyYW5zbGF0ZSgtZmlyc3RDaGFyLngsIC1maXJzdENoYXIueSk7
Ci0KLSAgICAgICAgY2h1bmsuY3RtID0gbmV3Q2h1bmtDdG07Ci0gICAgfQotCi0gICAgLy8gQXBw
bHkgY29ycmVjdGlvbiB0byBjaHVuayAKLSAgICBpZiAoc3BhY2luZ1RvQXBwbHkgIT0gMC4wZikg
ewotICAgICAgICBWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yIGNodW5rSXQgPSBjaHVuay5zdGFy
dDsKLSAgICAgICAgZm9yICg7IGNodW5rSXQgIT0gY2h1bmsuZW5kOyArK2NodW5rSXQpIHsKLSAg
ICAgICAgICAgIFNWR0NoYXImIGN1ckNoYXIgPSAqY2h1bmtJdDsKLSAgICAgICAgICAgIGN1ckNo
YXIuZHJhd25TZXBlcmF0ZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAoY2h1bmsuaXNWZXJ0
aWNhbFRleHQpCi0gICAgICAgICAgICAgICAgY3VyQ2hhci55ICs9IChjaHVua0l0IC0gY2h1bmsu
c3RhcnQpICogc3BhY2luZ1RvQXBwbHk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAg
ICAgY3VyQ2hhci54ICs9IChjaHVua0l0IC0gY2h1bmsuc3RhcnQpICogc3BhY2luZ1RvQXBwbHk7
Ci0gICAgICAgIH0KLSAgICB9CisgICAgU1ZHUmVuZGVyQmFzZTo6ZmluaXNoUmVuZGVyU1ZHQ29u
dGVudChib3hSZW5kZXJlciwgY2hpbGRQYWludEluZm8sIGZpbHRlciwgcGFpbnRJbmZvLmNvbnRl
eHQpOworICAgIGNoaWxkUGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKIH0KIAogdm9pZCBT
VkdSb290SW5saW5lQm94Ojpjb21wdXRlUGVyQ2hhcmFjdGVyTGF5b3V0SW5mb3JtYXRpb24oKQpA
QCAtNjY4LDI2ICs2OSwyOSBAQCB2b2lkIFNWR1Jvb3RJbmxpbmVCb3g6OmNvbXB1dGVQZXJDaGFy
YWN0CiAgICAgbV9zdmdUZXh0Q2h1bmtzLmNsZWFyKCk7CiAKICAgICAvLyBCdWlsZCBsYXlvdXQg
aW5mb3JtYXRpb24gZm9yIGFsbCBjb250YWluZWQgcmVuZGVyIG9iamVjdHMKLSAgICBTVkdDaGFy
YWN0ZXJMYXlvdXRJbmZvIGluZm8obV9zdmdDaGFycyk7Ci0gICAgYnVpbGRMYXlvdXRJbmZvcm1h
dGlvbih0aGlzLCBpbmZvKTsKKyAgICBTVkdDaGFyYWN0ZXJMYXlvdXRJbmZvIGNoYXJJbmZvOwor
ICAgIGJ1aWxkTGF5b3V0SW5mb3JtYXRpb24odGhpcywgY2hhckluZm8pOworICAgIG1fc3ZnQ2hh
cnMgPSBjaGFySW5mby5zdmdDaGFyczsKIAogICAgIC8vIE5vdyBhbGwgbGF5b3V0IGluZm9ybWF0
aW9uIGFyZSBhdmFpbGFibGUgZm9yIGV2ZXJ5IGNoYXJhY3RlcgogICAgIC8vIGNvbnRhaW5lZCBp
biBhbnkgb2Ygb3VyIGNoaWxkIGlubGluZS9mbG93IGJveGVzLiBCdWlsZCBsaXN0CiAgICAgLy8g
b2YgdGV4dCBjaHVua3Mgbm93LCB0byBiZSBhYmxlIHRvIGFwcGx5IHRleHQtYW5jaG9yIHNoaWZ0
cy4KLSAgICBidWlsZFRleHRDaHVua3MobV9zdmdDaGFycywgbV9zdmdUZXh0Q2h1bmtzLCB0aGlz
KTsKKyAgICBTVkdUZXh0Q2h1bmtMYXlvdXRJbmZvIGNodW5rSW5mbzsKKyAgICBjaHVua0luZm8u
YnVpbGRUZXh0Q2h1bmtzKG1fc3ZnQ2hhcnMuYmVnaW4oKSwgbV9zdmdDaGFycy5lbmQoKSwgdGhp
cyk7CiAKICAgICAvLyBMYXlvdXQgYWxsIHRleHQgY2h1bmtzCiAgICAgLy8gdGV4dC1hbmNob3Ig
bmVlZHMgdG8gYmUgYXBwbGllZCB0byBpbmRpdmlkdWFsIGNodW5rcy4KLSAgICBsYXlvdXRUZXh0
Q2h1bmtzKCk7CisgICAgY2h1bmtJbmZvLmxheW91dFRleHRDaHVua3MoKTsKKyAgICBtX3N2Z1Rl
eHRDaHVua3MgPSBjaHVua0luZm8udGV4dENodW5rcygpOwogCi0gICAgLy8gRmluYWxseSB0aGUg
dG9wIGxlZnQgcG9zaXRpb24gb2Ygb3VyIGJveCBpcyBrbm93bi4KLSAgICAvLyBQcm9wb2dhdGUg
dGhpcyBrbm93bmxlZGdlIHRvIG91ciBSZW5kZXJTVkdUZXh0IHBhcmVudC4KLSAgICBGbG9hdFBv
aW50IHRvcExlZnQgPSB0b3BMZWZ0UG9zaXRpb25PZkNoYXJhY3RlclJhbmdlKG1fc3ZnQ2hhcnMu
YmVnaW4oKSwgbV9zdmdDaGFycy5lbmQoKSk7Ci0gICAgYmxvY2soKS0+c2V0TG9jYXRpb24oKGlu
dCkgZmxvb3JmKHRvcExlZnQueCgpKSwgKGludCkgZmxvb3JmKHRvcExlZnQueSgpKSk7Ci0KLSAg
ICAvLyBMYXlvdXQgYWxsIElubGluZVRleHQvRmxvdyBib3hlcwotICAgIC8vIEJFV0FSRTogVGhp
cyByZXF1aXJlcyB0aGUgcm9vdCB0b3AvbGVmdCBwb3NpdGlvbiB0byBiZSBzZXQgY29ycmVjdGx5
IGJlZm9yZSEKLSAgICBsYXlvdXRJbmxpbmVCb3hlcygpOworICAgIC8vIFByb3BhZ2F0ZSB0ZXh0
IGNodW5rIHBhcnQgaW5mb3JtYXRpb24gdG8gYWxsIFNWR0lubGluZVRleHRCb3hlcywgc2VlIFNW
R1RleHRDaHVua0xheW91dEluZm8uaCBmb3IgZGV0YWlscworICAgIHByb3BhZ2F0ZVRleHRDaHVu
a1BhcnRJbmZvcm1hdGlvbigpOworCisgICAgLy8gTGF5b3V0IGFsbCBjaGlsZCBib3hlcy4KKyAg
ICBsYXlvdXRDaGlsZEJveGVzKHRoaXMpOworCisgICAgLy8gUmVzaXplIG91ciByb290IGJveCBh
bmQgb3VyIFJlbmRlclNWR1RleHQgcGFyZW50IGJsb2NrCisgICAgbGF5b3V0Um9vdEJveCgpOwog
fQogCiB2b2lkIFNWR1Jvb3RJbmxpbmVCb3g6OmJ1aWxkTGF5b3V0SW5mb3JtYXRpb24oSW5saW5l
Rmxvd0JveCogc3RhcnQsIFNWR0NoYXJhY3RlckxheW91dEluZm8mIGluZm8pCkBAIC03MTEsOCAr
MTE1LDkgQEAgdm9pZCBTVkdSb290SW5saW5lQm94OjpidWlsZExheW91dEluZm9ybQogICAgICAg
ICAgICAgQVNTRVJUKGN1cnItPmlzSW5saW5lRmxvd0JveCgpKTsKICAgICAgICAgICAgIElubGlu
ZUZsb3dCb3gqIGZsb3dCb3ggPSBzdGF0aWNfY2FzdDxJbmxpbmVGbG93Qm94Kj4oY3Vycik7CiAK
KyAgICAgICAgICAgIC8vIFNraXAgZ2VuZXJhdGVkIGNvbnRlbnQuCiAgICAgICAgICAgICBpZiAo
IWZsb3dCb3gtPnJlbmRlcmVyKCktPm5vZGUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsg
Ly8gU2tpcCBnZW5lcmF0ZWQgY29udGVudC4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKIAog
ICAgICAgICAgICAgYm9vbCBpc0FuY2hvciA9IGZsb3dCb3gtPnJlbmRlcmVyKCktPm5vZGUoKS0+
aGFzVGFnTmFtZShTVkdOYW1lczo6YVRhZyk7CiAgICAgICAgICAgICBib29sIGlzVGV4dFBhdGgg
PSBmbG93Qm94LT5yZW5kZXJlcigpLT5ub2RlKCktPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnRleHRQ
YXRoVGFnKTsKQEAgLTc0MCwxMyArMTQ1LDE0IEBAIHZvaWQgU1ZHUm9vdElubGluZUJveDo6YnVp
bGRMYXlvdXRJbmZvcm0KICAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIHN1Yi1sYXlvdXQu
IFdlIG5lZWQgdG8gY3JlYXRlIHRleHQgY2h1bmtzIGZyb20gdGhlIHRleHRQYXRoCiAgICAgICAg
ICAgICAgICAgLy8gY2hpbGRyZW4gdXNpbmcgb3VyIHN0YW5kYXJkIGxheW91dCBjb2RlLCB0byBi
ZSBhYmxlIHRvIG1lYXN1cmUgdGhlCiAgICAgICAgICAgICAgICAgLy8gdGV4dCBsZW5ndGggdXNp
bmcgb3VyIG5vcm1hbCBtZXRob2RzIGFuZCBub3QgdGV4dFBhdGggc3BlY2lmaWMgaGFja3MuCi0g
ICAgICAgICAgICAgICAgVmVjdG9yPFNWR0NoYXI+IHRlbXBDaGFyczsKICAgICAgICAgICAgICAg
ICBWZWN0b3I8U1ZHVGV4dENodW5rPiB0ZW1wQ2h1bmtzOwogCi0gICAgICAgICAgICAgICAgU1ZH
Q2hhcmFjdGVyTGF5b3V0SW5mbyB0ZW1wSW5mbyh0ZW1wQ2hhcnMpOwotICAgICAgICAgICAgICAg
IGJ1aWxkTGF5b3V0SW5mb3JtYXRpb24oZmxvd0JveCwgdGVtcEluZm8pOworICAgICAgICAgICAg
ICAgIFNWR0NoYXJhY3RlckxheW91dEluZm8gdGVtcENoYXJJbmZvOworICAgICAgICAgICAgICAg
IGJ1aWxkTGF5b3V0SW5mb3JtYXRpb24oZmxvd0JveCwgdGVtcENoYXJJbmZvKTsKIAotICAgICAg
ICAgICAgICAgIGJ1aWxkVGV4dENodW5rcyh0ZW1wQ2hhcnMsIHRlbXBDaHVua3MsIGZsb3dCb3gp
OworICAgICAgICAgICAgICAgIFNWR1RleHRDaHVua0xheW91dEluZm8gdGVtcENodW5rSW5mbzsK
KyAgICAgICAgICAgICAgICB0ZW1wQ2h1bmtJbmZvLmJ1aWxkVGV4dENodW5rcyh0ZW1wQ2hhcklu
Zm8uc3ZnQ2hhcnMuYmVnaW4oKSwgdGVtcENoYXJJbmZvLnN2Z0NoYXJzLmVuZCgpLCBmbG93Qm94
KTsKKyAgICAgICAgICAgICAgICB0ZW1wQ2h1bmtzID0gdGVtcENodW5rSW5mby50ZXh0Q2h1bmtz
KCk7CiAKICAgICAgICAgICAgICAgICBWZWN0b3I8U1ZHVGV4dENodW5rPjo6aXRlcmF0b3IgaXQg
PSB0ZW1wQ2h1bmtzLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgVmVjdG9yPFNWR1RleHRDaHVu
az46Oml0ZXJhdG9yIGVuZCA9IHRlbXBDaHVua3MuZW5kKCk7CkBAIC03ODYsNDY3ICsxOTIsMTc1
IEBAIHZvaWQgU1ZHUm9vdElubGluZUJveDo6YnVpbGRMYXlvdXRJbmZvcm0KICAgICB9CiB9CiAK
LXZvaWQgU1ZHUm9vdElubGluZUJveDo6bGF5b3V0SW5saW5lQm94ZXMoKQordm9pZCBTVkdSb290
SW5saW5lQm94OjpsYXlvdXRDaGlsZEJveGVzKElubGluZUZsb3dCb3gqIHN0YXJ0KQogewotICAg
IGludCBsb3dYID0gSU5UX01BWDsKLSAgICBpbnQgbG93WSA9IElOVF9NQVg7Ci0gICAgaW50IGhp
Z2hYID0gSU5UX01JTjsKLSAgICBpbnQgaGlnaFkgPSBJTlRfTUlOOwotCi0gICAgLy8gTGF5b3V0
IGFsbCBjaGlsZCBib3hlcwotICAgIFZlY3RvcjxTVkdDaGFyPjo6aXRlcmF0b3IgaXQgPSBtX3N2
Z0NoYXJzLmJlZ2luKCk7IAotICAgIGxheW91dElubGluZUJveGVzKHRoaXMsIGl0LCBsb3dYLCBo
aWdoWCwgbG93WSwgaGlnaFkpOwotICAgIEFTU0VSVChpdCA9PSBtX3N2Z0NoYXJzLmVuZCgpKTsK
LX0KLQotdm9pZCBTVkdSb290SW5saW5lQm94OjpsYXlvdXRJbmxpbmVCb3hlcyhJbmxpbmVGbG93
Qm94KiBzdGFydCwgVmVjdG9yPFNWR0NoYXI+OjppdGVyYXRvciYgaXQsIGludCYgbG93WCwgaW50
JiBoaWdoWCwgaW50JiBsb3dZLCBpbnQmIGhpZ2hZKQotewotICAgIGZvciAoSW5saW5lQm94KiBj
dXJyID0gc3RhcnQtPmZpcnN0Q2hpbGQoKTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRPbkxpbmUo
KSkgewotICAgICAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBjdXJyLT5yZW5kZXJlcigpLT5zdHls
ZSgpOyAgICAKLSAgICAgICAgaWYgKGN1cnItPnJlbmRlcmVyKCktPmlzVGV4dCgpKSB7Ci0gICAg
ICAgICAgICBTVkdJbmxpbmVUZXh0Qm94KiB0ZXh0Qm94ID0gc3RhdGljX2Nhc3Q8U1ZHSW5saW5l
VGV4dEJveCo+KGN1cnIpOwotICAgICAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dEJveC0+
bGVuKCk7Ci0KLSAgICAgICAgICAgIFNWR0NoYXIgY3VyQ2hhciA9ICppdDsgCi0gICAgICAgICAg
ICBBU1NFUlQoaXQgIT0gbV9zdmdDaGFycy5lbmQoKSk7ICAKLQotICAgICAgICAgICAgRmxvYXRS
ZWN0IHN0cmluZ1JlY3Q7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVu
Z3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoaXQgIT0gbV9zdmdDaGFycy5lbmQo
KSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXQtPmlzSGlkZGVuKCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgKytpdDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3RyaW5nUmVjdC51bml0ZSh0ZXh0Qm94LT5jYWxj
dWxhdGVHbHlwaEJvdW5kYXJpZXMoc3R5bGUsIHRleHRCb3gtPnN0YXJ0KCkgKyBpLCAqaXQpKTsK
LSAgICAgICAgICAgICAgICArK2l0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJbnRS
ZWN0IGVuY2xvc2VkU3RyaW5nUmVjdCA9IGVuY2xvc2luZ0ludFJlY3Qoc3RyaW5nUmVjdCk7Ci0K
LSAgICAgICAgICAgIGludCBtaW5YID0gZW5jbG9zZWRTdHJpbmdSZWN0LngoKTsKLSAgICAgICAg
ICAgIGludCBtYXhYID0gbWluWCArIGVuY2xvc2VkU3RyaW5nUmVjdC53aWR0aCgpOwotCi0gICAg
ICAgICAgICBpbnQgbWluWSA9IGVuY2xvc2VkU3RyaW5nUmVjdC55KCk7Ci0gICAgICAgICAgICBp
bnQgbWF4WSA9IG1pblkgKyBlbmNsb3NlZFN0cmluZ1JlY3QuaGVpZ2h0KCk7Ci0KLSAgICAgICAg
ICAgIGN1cnItPnNldFgobWluWCAtIGJsb2NrKCktPngoKSk7Ci0gICAgICAgICAgICBjdXJyLT5z
ZXRXaWR0aChlbmNsb3NlZFN0cmluZ1JlY3Qud2lkdGgoKSk7Ci0KLSAgICAgICAgICAgIGN1cnIt
PnNldFkobWluWSAtIGJsb2NrKCktPnkoKSk7Ci0gICAgICAgICAgICB0ZXh0Qm94LT5zZXRIZWln
aHQoZW5jbG9zZWRTdHJpbmdSZWN0LmhlaWdodCgpKTsKLQotICAgICAgICAgICAgaWYgKG1pblgg
PCBsb3dYKQotICAgICAgICAgICAgICAgIGxvd1ggPSBtaW5YOwotCi0gICAgICAgICAgICBpZiAo
bWF4WCA+IGhpZ2hYKQotICAgICAgICAgICAgICAgIGhpZ2hYID0gbWF4WDsKLQotICAgICAgICAg
ICAgaWYgKG1pblkgPCBsb3dZKQotICAgICAgICAgICAgICAgIGxvd1kgPSBtaW5ZOwotCi0gICAg
ICAgICAgICBpZiAobWF4WSA+IGhpZ2hZKQotICAgICAgICAgICAgICAgIGhpZ2hZID0gbWF4WTsK
KyAgICBmb3IgKElubGluZUJveCogY2hpbGQgPSBzdGFydC0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsg
Y2hpbGQgPSBjaGlsZC0+bmV4dE9uTGluZSgpKSB7CisgICAgICAgIGlmIChjaGlsZC0+cmVuZGVy
ZXIoKS0+aXNUZXh0KCkpIHsKKyAgICAgICAgICAgIFNWR0lubGluZVRleHRCb3gqIHRleHRCb3gg
PSBzdGF0aWNfY2FzdDxTVkdJbmxpbmVUZXh0Qm94Kj4oY2hpbGQpOworICAgICAgICAgICAgSW50
UmVjdCBib3hSZWN0ID0gdGV4dEJveC0+Y2FsY3VsYXRlQm91bmRhcmllcygpOworICAgICAgICAg
ICAgdGV4dEJveC0+c2V0WChib3hSZWN0LngoKSk7CisgICAgICAgICAgICB0ZXh0Qm94LT5zZXRZ
KGJveFJlY3QueSgpKTsKKyAgICAgICAgICAgIHRleHRCb3gtPnNldFdpZHRoKGJveFJlY3Qud2lk
dGgoKSk7CisgICAgICAgICAgICB0ZXh0Qm94LT5zZXRIZWlnaHQoYm94UmVjdC5oZWlnaHQoKSk7
CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBU1NFUlQoY3Vyci0+aXNJbmxpbmVGbG93
Qm94KCkpOwotCi0gICAgICAgICAgICBpbnQgbWluWCA9IElOVF9NQVg7Ci0gICAgICAgICAgICBp
bnQgbWluWSA9IElOVF9NQVg7Ci0gICAgICAgICAgICBpbnQgbWF4WCA9IElOVF9NSU47Ci0gICAg
ICAgICAgICBpbnQgbWF4WSA9IElOVF9NSU47Ci0KLSAgICAgICAgICAgIElubGluZUZsb3dCb3gq
IGZsb3dCb3ggPSBzdGF0aWNfY2FzdDxJbmxpbmVGbG93Qm94Kj4oY3Vycik7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgICAgIGlmICghZmxvd0JveC0+cmVuZGVyZXIoKS0+bm9kZSgpKQotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGdlbmVyYXRlZCBjb250ZW50LgotICAgIAotICAg
ICAgICAgICAgbGF5b3V0SW5saW5lQm94ZXMoZmxvd0JveCwgaXQsIG1pblgsIG1heFgsIG1pblks
IG1heFkpOwotCi0gICAgICAgICAgICBjdXJyLT5zZXRYKG1pblggLSBibG9jaygpLT54KCkpOwot
ICAgICAgICAgICAgY3Vyci0+c2V0V2lkdGgobWF4WCAtIG1pblgpOwotCi0gICAgICAgICAgICBj
dXJyLT5zZXRZKG1pblkgLSBibG9jaygpLT55KCkpOwotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
U1ZHSW5saW5lRmxvd0JveCo+KGN1cnIpLT5zZXRIZWlnaHQobWF4WSAtIG1pblkpOwotCi0gICAg
ICAgICAgICBpZiAobWluWCA8IGxvd1gpCi0gICAgICAgICAgICAgICAgbG93WCA9IG1pblg7Ci0K
LSAgICAgICAgICAgIGlmIChtYXhYID4gaGlnaFgpCi0gICAgICAgICAgICAgICAgaGlnaFggPSBt
YXhYOworICAgICAgICAgICAgQVNTRVJUKGNoaWxkLT5pc0lubGluZUZsb3dCb3goKSk7CisgICAK
KyAgICAgICAgICAgIC8vIFNraXAgZ2VuZXJhdGVkIGNvbnRlbnQuCisgICAgICAgICAgICBpZiAo
IWNoaWxkLT5yZW5kZXJlcigpLT5ub2RlKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CiAK
LSAgICAgICAgICAgIGlmIChtaW5ZIDwgbG93WSkKLSAgICAgICAgICAgICAgICBsb3dZID0gbWlu
WTsKKyAgICAgICAgICAgIFNWR0lubGluZUZsb3dCb3gqIGZsb3dCb3ggPSBzdGF0aWNfY2FzdDxT
VkdJbmxpbmVGbG93Qm94Kj4oY2hpbGQpOworICAgICAgICAgICAgbGF5b3V0Q2hpbGRCb3hlcyhm
bG93Qm94KTsKIAotICAgICAgICAgICAgaWYgKG1heFkgPiBoaWdoWSkKLSAgICAgICAgICAgICAg
ICBoaWdoWSA9IG1heFk7CisgICAgICAgICAgICBJbnRSZWN0IGJveFJlY3QgPSBmbG93Qm94LT5j
YWxjdWxhdGVCb3VuZGFyaWVzKCk7CisgICAgICAgICAgICBmbG93Qm94LT5zZXRYKGJveFJlY3Qu
eCgpKTsKKyAgICAgICAgICAgIGZsb3dCb3gtPnNldFkoYm94UmVjdC55KCkpOworICAgICAgICAg
ICAgZmxvd0JveC0+c2V0V2lkdGgoYm94UmVjdC53aWR0aCgpKTsKKyAgICAgICAgICAgIGZsb3dC
b3gtPnNldEhlaWdodChib3hSZWN0LmhlaWdodCgpKTsKICAgICAgICAgfQogICAgIH0KLQotICAg
IGlmIChzdGFydC0+aXNTVkdSb290SW5saW5lQm94KCkpIHsKLSAgICAgICAgaW50IHRvcCA9IGxv
d1kgLSBibG9jaygpLT55KCk7Ci0gICAgICAgIGludCBib3R0b20gPSBoaWdoWSAtIGJsb2NrKCkt
PnkoKTsKLQotICAgICAgICBzdGFydC0+c2V0WChsb3dYIC0gYmxvY2soKS0+eCgpKTsKLSAgICAg
ICAgc3RhcnQtPnNldFkodG9wKTsKLQotICAgICAgICBzdGFydC0+c2V0V2lkdGgoaGlnaFggLSBs
b3dYKTsKLSAgICAgICAgc3RhdGljX2Nhc3Q8U1ZHUm9vdElubGluZUJveCo+KHN0YXJ0KS0+c2V0
SGVpZ2h0KGhpZ2hZIC0gbG93WSk7Ci0KLSAgICAgICAgR2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNr
Rm9udHNNYXAgdGV4dEJveERhdGFNYXA7Ci0gICAgICAgIHN0YXJ0LT5jb21wdXRlVmVydGljYWxP
dmVyZmxvdyh0b3AsIGJvdHRvbSwgdHJ1ZSwgdGV4dEJveERhdGFNYXApOwotICAgICAgICBzdGF0
aWNfY2FzdDxTVkdSb290SW5saW5lQm94Kj4oc3RhcnQpLT5zZXRMaW5lVG9wQm90dG9tUG9zaXRp
b25zKHRvcCwgYm90dG9tKTsKLSAgICB9CiB9CiAKLXZvaWQgU1ZHUm9vdElubGluZUJveDo6YnVp
bGRUZXh0Q2h1bmtzKFZlY3RvcjxTVkdDaGFyPiYgc3ZnQ2hhcnMsIFZlY3RvcjxTVkdUZXh0Q2h1
bms+JiBzdmdUZXh0Q2h1bmtzLCBJbmxpbmVGbG93Qm94KiBzdGFydCkKK3ZvaWQgU1ZHUm9vdElu
bGluZUJveDo6bGF5b3V0Um9vdEJveCgpCiB7Ci0gICAgU1ZHVGV4dENodW5rTGF5b3V0SW5mbyBp
bmZvKHN2Z1RleHRDaHVua3MpOwotICAgIGluZm8uaXQgPSBzdmdDaGFycy5iZWdpbigpOwotICAg
IGluZm8uY2h1bmsuc3RhcnQgPSBzdmdDaGFycy5iZWdpbigpOwotICAgIGluZm8uY2h1bmsuZW5k
ID0gc3ZnQ2hhcnMuYmVnaW4oKTsKKyAgICBSZW5kZXJCbG9jayogcGFyZW50QmxvY2sgPSBibG9j
aygpOworICAgIEFTU0VSVChwYXJlbnRCbG9jayk7CisKKyAgICBJbnRSZWN0IGNoaWxkUmVjdDsK
KyAgICBmb3IgKElubGluZUJveCogY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9
IGNoaWxkLT5uZXh0T25MaW5lKCkpIHsKKyAgICAgICAgLy8gU2tpcCBnZW5lcmF0ZWQgY29udGVu
dC4KKyAgICAgICAgaWYgKCFjaGlsZC0+cmVuZGVyZXIoKS0+bm9kZSgpKQorICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIGNoaWxkUmVjdC51bml0ZShjaGlsZC0+Y2FsY3VsYXRlQm91bmRh
cmllcygpKTsKKyAgICB9CisKKyAgICBpbnQgeEJsb2NrID0gY2hpbGRSZWN0LngoKTsKKyAgICBp
bnQgeUJsb2NrID0gY2hpbGRSZWN0LnkoKTsKKyAgICBpbnQgd2lkdGhCbG9jayA9IGNoaWxkUmVj
dC53aWR0aCgpOworICAgIGludCBoZWlnaHRCbG9jayA9IGNoaWxkUmVjdC5oZWlnaHQoKTsKKwor
ICAgIC8vIEZpbmFsbHksIGFzc2lnbiB0aGUgcm9vdCBibG9jayBwb3NpdGlvbiwgbm93IHRoYXQg
YWxsIGNvbnRlbnQgaXMgbGFpZCBvdXQuCisgICAgcGFyZW50QmxvY2stPnNldExvY2F0aW9uKHhC
bG9jaywgeUJsb2NrKTsKKyAgICBwYXJlbnRCbG9jay0+c2V0V2lkdGgod2lkdGhCbG9jayk7Cisg
ICAgcGFyZW50QmxvY2stPnNldEhlaWdodChoZWlnaHRCbG9jayk7CisKKyAgICAvLyBQb3NpdGlv
biBhbGwgY2hpbGRyZW4gcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBibG9jay4KKyAgICBmb3IgKElu
bGluZUJveCogY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0
T25MaW5lKCkpIHsKKyAgICAgICAgLy8gU2tpcCBnZW5lcmF0ZWQgY29udGVudC4KKyAgICAgICAg
aWYgKCFjaGlsZC0+cmVuZGVyZXIoKS0+bm9kZSgpKQorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIGNoaWxkLT5hZGp1c3RQb3NpdGlvbigteEJsb2NrLCAteUJsb2NrKTsKKyAgICB9CiAK
LSAgICBidWlsZFRleHRDaHVua3Moc3ZnQ2hhcnMsIHN0YXJ0LCBpbmZvKTsKLSAgICBBU1NFUlQo
aW5mby5pdCA9PSBzdmdDaGFycy5lbmQoKSk7CisgICAgLy8gUG9zaXRpb24gb3Vyc2VsdmVzLgor
ICAgIHNldFgoMCk7CisgICAgc2V0WSgwKTsKKyAgICBzZXRXaWR0aCh3aWR0aEJsb2NrKTsKKyAg
ICBzZXRIZWlnaHQoaGVpZ2h0QmxvY2spOworICAgIHNldEJsb2NrSGVpZ2h0KGhlaWdodEJsb2Nr
KTsKKyAgICBzZXRMaW5lVG9wQm90dG9tUG9zaXRpb25zKDAsIGhlaWdodEJsb2NrKTsKIH0KIAot
dm9pZCBTVkdSb290SW5saW5lQm94OjpidWlsZFRleHRDaHVua3MoVmVjdG9yPFNWR0NoYXI+JiBz
dmdDaGFycywgSW5saW5lRmxvd0JveCogc3RhcnQsIFNWR1RleHRDaHVua0xheW91dEluZm8mIGlu
Zm8pCit2b2lkIFNWR1Jvb3RJbmxpbmVCb3g6OnByb3BhZ2F0ZVRleHRDaHVua1BhcnRJbmZvcm1h
dGlvbigpCiB7Ci0jaWYgREVCVUdfQ0hVTktfQlVJTERJTkcgPiAxCi0gICAgZnByaW50ZihzdGRl
cnIsICIgLT4gYnVpbGRUZXh0Q2h1bmtzKHN0YXJ0PSVwKVxuIiwgc3RhcnQpOworI2lmIERFQlVH
X0NIVU5LX1BBUlRfUFJPUEFHQVRJT04gPiAwCisgICAgTGlzdEhhc2hTZXQ8U1ZHSW5saW5lVGV4
dEJveCo+IGJveGVzOwogI2VuZGlmCiAKLSAgICBmb3IgKElubGluZUJveCogY3VyciA9IHN0YXJ0
LT5maXJzdENoaWxkKCk7IGN1cnI7IGN1cnIgPSBjdXJyLT5uZXh0T25MaW5lKCkpIHsKLSAgICAg
ICAgaWYgKGN1cnItPnJlbmRlcmVyKCktPmlzVGV4dCgpKSB7Ci0gICAgICAgICAgICBJbmxpbmVU
ZXh0Qm94KiB0ZXh0Qm94ID0gc3RhdGljX2Nhc3Q8SW5saW5lVGV4dEJveCo+KGN1cnIpOworICAg
IC8vIExvb3AgdGhyb3VnaCBhbGwgdGV4dCBjaHVua3MKKyAgICBjb25zdCBWZWN0b3I8U1ZHVGV4
dENodW5rPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9zdmdUZXh0Q2h1bmtzLmVuZCgpOworICAg
IGZvciAoVmVjdG9yPFNWR1RleHRDaHVuaz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9zdmdUZXh0
Q2h1bmtzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBjb25zdCBTVkdUZXh0
Q2h1bmsmIGNodW5rID0gKml0OworICAgICAgICBpbnQgcHJvY2Vzc2VkQ2h1bmtDaGFyYWN0ZXJz
ID0gMDsKIAotICAgICAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dEJveC0+bGVuKCk7Ci0g
ICAgICAgICAgICBpZiAoIWxlbmd0aCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgLy8gTG9vcCB0aHJvdWdoIGFsbCByYW5nZXMgY29udGFpbmVkIGluIHRoaXMgY2h1bmsKKyAg
ICAgICAgY29uc3QgVmVjdG9yPFNWR0lubGluZUJveENoYXJhY3RlclJhbmdlPjo6Y29uc3RfaXRl
cmF0b3IgYm94RW5kID0gY2h1bmsuYm94ZXMuZW5kKCk7CisgICAgICAgIGZvciAoVmVjdG9yPFNW
R0lubGluZUJveENoYXJhY3RlclJhbmdlPjo6Y29uc3RfaXRlcmF0b3IgYm94SXQgPSBjaHVuay5i
b3hlcy5iZWdpbigpOyBib3hJdCAhPSBib3hFbmQ7ICsrYm94SXQpIHsKKyAgICAgICAgICAgIGNv
bnN0IFNWR0lubGluZUJveENoYXJhY3RlclJhbmdlJiByYW5nZSA9ICpib3hJdDsKKyAgICAgICAg
ICAgIEFTU0VSVChyYW5nZS5ib3gtPmlzU1ZHSW5saW5lVGV4dEJveCgpKTsKIAotI2lmIERFQlVH
X0NIVU5LX0JVSUxESU5HID4gMQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgLT4gSGFu
ZGxlIGlubGluZSB0ZXh0IGJveCAoJXApIHdpdGggJWkgY2hhcmFjdGVycyAoc3RhcnQ6ICVpLCBl
bmQ6ICVpKSwgaGFuZGxpbmdUZXh0UGF0aD0laVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB0ZXh0Qm94LCBsZW5ndGgsIHRleHRCb3gtPnN0YXJ0KCksIHRleHRCb3gtPmVuZCgpLCAo
aW50KSBpbmZvLmhhbmRsaW5nVGV4dFBhdGgpOwotI2VuZGlmCisgICAgICAgICAgICAvLyBBY2Nl
c3Mgc3R5bGUgJiBmb250IGluZm9ybWF0aW9uIG9mIHRoaXMgdGV4dCBib3gKKyAgICAgICAgICAg
IFNWR0lubGluZVRleHRCb3gqIHJhbmdlVGV4dEJveCA9IHN0YXRpY19jYXN0PFNWR0lubGluZVRl
eHRCb3gqPihyYW5nZS5ib3gpOworICAgICAgICAgICAgcmFuZ2VUZXh0Qm94LT5zZXRDaHVua1Ry
YW5zZm9ybWF0aW9uKGNodW5rLmN0bSk7CiAKLSAgICAgICAgICAgIFJlbmRlclRleHQqIHRleHQg
PSB0ZXh0Qm94LT50ZXh0UmVuZGVyZXIoKTsKKyAgICAgICAgICAgIFJlbmRlclRleHQqIHRleHQg
PSByYW5nZVRleHRCb3gtPnRleHRSZW5kZXJlcigpOwogICAgICAgICAgICAgQVNTRVJUKHRleHQp
OwotICAgICAgICAgICAgQVNTRVJUKHRleHQtPm5vZGUoKSk7Ci0KLSAgICAgICAgICAgIFNWR1Rl
eHRDb250ZW50RWxlbWVudCogdGV4dENvbnRlbnQgPSAwOwotICAgICAgICAgICAgTm9kZSogbm9k
ZSA9IHRleHQtPm5vZGUoKS0+cGFyZW50KCk7Ci0gICAgICAgICAgICB3aGlsZSAobm9kZSAmJiBu
b2RlLT5pc1NWR0VsZW1lbnQoKSAmJiAhdGV4dENvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICBp
ZiAoc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KG5vZGUpLT5pc1RleHRDb250ZW50KCkpCi0gICAg
ICAgICAgICAgICAgICAgIHRleHRDb250ZW50ID0gc3RhdGljX2Nhc3Q8U1ZHVGV4dENvbnRlbnRF
bGVtZW50Kj4obm9kZSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAg
ICBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
QVNTRVJUKHRleHRDb250ZW50KTsKIAotICAgICAgICAgICAgLy8gU3RhcnQgbmV3IGNoYXJhY3Rl
ciByYW5nZSBmb3IgdGhlIGZpcnN0IGNodW5rCi0gICAgICAgICAgICBib29sIGlzRmlyc3RDaGFy
YWN0ZXIgPSBpbmZvLnN2Z1RleHRDaHVua3MuaXNFbXB0eSgpICYmIGluZm8uY2h1bmsuc3RhcnQg
PT0gaW5mby5pdCAmJiBpbmZvLmNodW5rLnN0YXJ0ID09IGluZm8uY2h1bmsuZW5kOwotICAgICAg
ICAgICAgaWYgKGlzRmlyc3RDaGFyYWN0ZXIpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoaW5m
by5jaHVuay5ib3hlcy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgICAgIGluZm8uY2h1bmsuYm94
ZXMuYXBwZW5kKFNWR0lubGluZUJveENoYXJhY3RlclJhbmdlKCkpOwotICAgICAgICAgICAgfSBl
bHNlCi0gICAgICAgICAgICAgICAgQVNTRVJUKCFpbmZvLmNodW5rLmJveGVzLmlzRW1wdHkoKSk7
Ci0KLSAgICAgICAgICAgIC8vIFdhbGsgc3RyaW5nIHRvIGZpbmQgb3V0IG5ldyBjaHVuayBwb3Np
dGlvbnMsIGlmIGV4aXN0ZW50Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQoaW5mby5pdCAhPSBzdmdDaGFy
cy5lbmQoKSk7Ci0KLSAgICAgICAgICAgICAgICBTVkdJbmxpbmVCb3hDaGFyYWN0ZXJSYW5nZSYg
cmFuZ2UgPSBpbmZvLmNodW5rLmJveGVzLmxhc3QoKTsKLSAgICAgICAgICAgICAgICBpZiAocmFu
Z2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2UuYm94ID0gY3VycjsKLSAg
ICAgICAgICAgICAgICAgICAgcmFuZ2Uuc3RhcnRPZmZzZXQgPSBpID09IDAgPyAwIDogaSAtIDE7
CisgICAgICAgICAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0LT5zdHlsZSgpOworICAgICAg
ICAgICAgQVNTRVJUKHN0eWxlKTsKIAotI2lmIERFQlVHX0NIVU5LX0JVSUxESU5HID4gMQotICAg
ICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiB8IC0+IFJhbmdlIGlzIG9wZW4hIGJv
eD0lcCwgc3RhcnRPZmZzZXQ9JWlcbiIsIHJhbmdlLmJveCwgcmFuZ2Uuc3RhcnRPZmZzZXQpOwot
I2VuZGlmCisgICAgICAgICAgICBjb25zdCBGb250JiBmb250ID0gc3R5bGUtPmZvbnQoKTsKKyAK
KyAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgZmlyc3QgYW5kIGxhc3QgY2hhcmFjdGVyIG9mIHRo
aXMgcmFuZ2UgaW4gdGhpcyBjaHVuaworICAgICAgICAgICAgaW50IHJhbmdlTGVuZ3RoID0gcmFu
Z2UuZW5kT2Zmc2V0IC0gcmFuZ2Uuc3RhcnRPZmZzZXQ7CisgICAgICAgICAgICBWZWN0b3I8U1ZH
Q2hhcj46Oml0ZXJhdG9yIGl0Q2hhckJlZ2luID0gY2h1bmsuc3RhcnQgKyBwcm9jZXNzZWRDaHVu
a0NoYXJhY3RlcnM7CisgICAgICAgICAgICBWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yIGl0Q2hh
ckVuZCA9IGNodW5rLnN0YXJ0ICsgcHJvY2Vzc2VkQ2h1bmtDaGFyYWN0ZXJzICsgcmFuZ2VMZW5n
dGg7CisgICAgICAgICAgICBBU1NFUlQoaXRDaGFyRW5kIDw9IGNodW5rLmVuZCk7CisKKyAgICAg
ICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgY2hhcmFjdGVycyBpbiByYW5nZSAKKyAgICAgICAg
ICAgIGludCBwcm9jZXNzZWRSYW5nZUNoYXJhY3RlcnMgPSAwOworICAgICAgICAgICAgZm9yIChW
ZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yIGl0Q2hhciA9IGl0Q2hhckJlZ2luOyBpdENoYXIgIT0g
aXRDaGFyRW5kOyArK2l0Q2hhcikgeworICAgICAgICAgICAgICAgIGlmIChpdENoYXItPmlzSGlk
ZGVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytwcm9jZXNzZWRSYW5nZUNoYXJhY3RlcnM7
CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAg
ICAgICAgICAgICAgIC8vIElmIGEgbmV3IChvciB0aGUgZmlyc3QpIGNodW5rIGhhcyBiZWVuIHN0
YXJ0ZWQsIHJlY29yZCBpdCdzIHRleHQtYW5jaG9yIGFuZCB3cml0aW5nIG1vZGUuCi0gICAgICAg
ICAgICAgICAgaWYgKGluZm8uYXNzaWduQ2h1bmtQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGluZm8uYXNzaWduQ2h1bmtQcm9wZXJ0aWVzID0gZmFsc2U7Ci0KLSAgICAgICAgICAg
ICAgICAgICAgaW5mby5jaHVuay5pc1ZlcnRpY2FsVGV4dCA9IGlzVmVydGljYWxXcml0aW5nTW9k
ZSh0ZXh0LT5zdHlsZSgpLT5zdmdTdHlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5j
aHVuay5pc1RleHRQYXRoID0gaW5mby5oYW5kbGluZ1RleHRQYXRoOwotICAgICAgICAgICAgICAg
ICAgICBpbmZvLmNodW5rLmFuY2hvciA9IHRleHQtPnN0eWxlKCktPnN2Z1N0eWxlKCktPnRleHRB
bmNob3IoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5jaHVuay50ZXh0TGVuZ3RoID0gdGV4
dENvbnRlbnQtPnRleHRMZW5ndGgoKS52YWx1ZSh0ZXh0Q29udGVudCk7Ci0gICAgICAgICAgICAg
ICAgICAgIGluZm8uY2h1bmsubGVuZ3RoQWRqdXN0ID0gKEVMZW5ndGhBZGp1c3QpIHRleHRDb250
ZW50LT5sZW5ndGhBZGp1c3QoKTsKKyAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgaG93IG1h
bnkgY2hhcmFjdGVycyAtIHN0YXJ0aW5nIGZyb20gdGhlIGN1cnJlbnQgLSBjYW4gYmUgZHJhd24g
YXQgb25jZS4KKyAgICAgICAgICAgICAgICBWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yIGl0U2Vh
cmNoID0gaXRDaGFyICsgMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRTZWFyY2ggIT0gaXRD
aGFyRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdFNlYXJjaC0+ZHJhd25TZXBlcmF0
ZWQgfHwgaXRTZWFyY2gtPmlzSGlkZGVuKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKIAotI2lmIERFQlVHX0NIVU5LX0JVSUxESU5HID4gMQotICAgICAgICAgICAgICAgICAgICBm
cHJpbnRmKHN0ZGVyciwgIiB8IC0+IEFzc2lnbiBjaHVuayBwcm9wZXJ0aWVzLCBpc1ZlcnRpY2Fs
VGV4dD0laSwgYW5jaG9yPSVpXG4iLCBpbmZvLmNodW5rLmlzVmVydGljYWxUZXh0LCBpbmZvLmNo
dW5rLmFuY2hvcik7Ci0jZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKytpdFNlYXJjaDsKICAg
ICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgIWlzRmlyc3RD
aGFyYWN0ZXIgJiYgKCppbmZvLml0KS5uZXdUZXh0Q2h1bmspIHsKLSAgICAgICAgICAgICAgICAg
ICAgLy8gQ2xvc2UgbWlkIGNodW5rICYgY2hhcmFjdGVyIHJhbmdlCi0gICAgICAgICAgICAgICAg
ICAgIEFTU0VSVCghcmFuZ2UuaXNPcGVuKCkpOwotICAgICAgICAgICAgICAgICAgICBBU1NFUlQo
IXJhbmdlLmlzQ2xvc2VkKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZE9mZnNl
dCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlVGV4dENodW5rKGluZm8pOwotCi0jaWYg
REVCVUdfQ0hVTktfQlVJTERJTkcgPiAxCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rk
ZXJyLCAiIHwgLT4gQ2xvc2UgbWlkLXRleHQgY2h1bmssIGF0IGVuZE9mZnNldDogJWkgYW5kIHN0
YXJ0aW5nIG5ldyBtaWQgY2h1bmshXG4iLCByYW5nZS5lbmRPZmZzZXQpOwotI2VuZGlmCi0gICAg
Ci0gICAgICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgZm9yIG5leHQgY2h1bmssIGlmIHdlJ3Jl
IG5vdCBhdCB0aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0VGV4dENodW5rKGluZm8p
OwotICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPT0gbGVuZ3RoKSB7Ci0jaWYgREVCVUdf
Q0hVTktfQlVJTERJTkcgPiAxCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVy
ciwgIiB8IC0+IFJlY29yZCBsYXN0IGNodW5rIG9mIGlubGluZSB0ZXh0IGJveCFcbiIpOwotI2Vu
ZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGV4dENodW5rKGluZm8pOwotICAg
ICAgICAgICAgICAgICAgICAgICAgU1ZHSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2UmIHJhbmdlID0g
aW5mby5jaHVuay5ib3hlcy5sYXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8u
YXNzaWduQ2h1bmtQcm9wZXJ0aWVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBp
bmZvLmNodW5rLmlzVmVydGljYWxUZXh0ID0gaXNWZXJ0aWNhbFdyaXRpbmdNb2RlKHRleHQtPnN0
eWxlKCktPnN2Z1N0eWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5jaHVuay5p
c1RleHRQYXRoID0gaW5mby5oYW5kbGluZ1RleHRQYXRoOwotICAgICAgICAgICAgICAgICAgICAg
ICAgaW5mby5jaHVuay5hbmNob3IgPSB0ZXh0LT5zdHlsZSgpLT5zdmdTdHlsZSgpLT50ZXh0QW5j
aG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmNodW5rLnRleHRMZW5ndGggPSB0
ZXh0Q29udGVudC0+dGV4dExlbmd0aCgpLnZhbHVlKHRleHRDb250ZW50KTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGluZm8uY2h1bmsubGVuZ3RoQWRqdXN0ID0gKEVMZW5ndGhBZGp1c3QpIHRl
eHRDb250ZW50LT5sZW5ndGhBZGp1c3QoKTsKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUg
dGV4dCBjaHVuayBwYXJ0IGluZm9ybWF0aW9uIGZvciB0aGlzIGNodW5rIHN1Yi1yYW5nZQorICAg
ICAgICAgICAgICAgIGNvbnN0IFVDaGFyKiBwYXJ0U3RhcnQgPSB0ZXh0LT5jaGFyYWN0ZXJzKCkg
KyByYW5nZVRleHRCb3gtPnN0YXJ0KCkgKyByYW5nZS5zdGFydE9mZnNldCArIHByb2Nlc3NlZFJh
bmdlQ2hhcmFjdGVyczsKIAotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuYm94ID0gY3Vy
cjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0T2Zmc2V0ID0gaTsKLQotICAg
ICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKCFyYW5nZS5pc09wZW4oKSk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBBU1NFUlQoIXJhbmdlLmlzQ2xvc2VkKCkpOwotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNWR1RleHRDaHVua1Bh
cnQgcGFydDsKKyAgICAgICAgICAgICAgICBwYXJ0LmZpcnN0Q2hhcmFjdGVyID0gaXRDaGFyOwor
ICAgICAgICAgICAgICAgIHBhcnQubGVuZ3RoID0gaXRTZWFyY2ggLSBpdENoYXI7CisgICAgICAg
ICAgICAgICAgcGFydC53aWR0aCA9IGZvbnQuZmxvYXRXaWR0aChzdmdUZXh0UnVuRm9ySW5saW5l
VGV4dEJveChwYXJ0U3RhcnQsIHBhcnQubGVuZ3RoLCBzdHlsZSwgcmFuZ2VUZXh0Qm94KSk7Cisg
ICAgICAgICAgICAgICAgcGFydC5oZWlnaHQgPSBmb250LmhlaWdodCgpOworICAgICAgICAgICAg
ICAgIHBhcnQub2Zmc2V0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQgKyBwcm9jZXNzZWRSYW5nZUNoYXJh
Y3RlcnM7CisgICAgICAgICAgICAgICAgcmFuZ2VUZXh0Qm94LT5hZGRDaHVua1BhcnRJbmZvcm1h
dGlvbihwYXJ0KTsKKyAgICAgICAgICAgICAgICBwcm9jZXNzZWRSYW5nZUNoYXJhY3RlcnMgKz0g
cGFydC5sZW5ndGg7CiAKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhvbGQg
dHJ1ZSBmb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZmlyc3QgY2h1bmsKLSAgICAgICAg
ICAgICAgICBpZiAoaXNGaXJzdENoYXJhY3RlcikKLSAgICAgICAgICAgICAgICAgICAgaXNGaXJz
dENoYXJhY3RlciA9IGZhbHNlOwotICAgIAotICAgICAgICAgICAgICAgICsraW5mby5pdDsKKyAg
ICAgICAgICAgICAgICAvLyBTa2lwIHByb2Nlc3NlZCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAg
ICAgaXRDaGFyID0gaXRTZWFyY2ggLSAxOwogICAgICAgICAgICAgfQogCi0jaWYgREVCVUdfQ0hV
TktfQlVJTERJTkcgPiAxICAgIAotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgLT4gRmlu
aXNoZWQgaW5saW5lIHRleHQgYm94IVxuIik7Ci0jZW5kaWYKKyAgICAgICAgICAgIEFTU0VSVChw
cm9jZXNzZWRSYW5nZUNoYXJhY3RlcnMgPT0gcmFuZ2VMZW5ndGgpOworICAgICAgICAgICAgcHJv
Y2Vzc2VkQ2h1bmtDaGFyYWN0ZXJzICs9IHJhbmdlTGVuZ3RoOwogCi0gICAgICAgICAgICBTVkdJ
bmxpbmVCb3hDaGFyYWN0ZXJSYW5nZSYgcmFuZ2UgPSBpbmZvLmNodW5rLmJveGVzLmxhc3QoKTsK
LSAgICAgICAgICAgIGlmICghcmFuZ2UuaXNPcGVuKCkgJiYgIXJhbmdlLmlzQ2xvc2VkKCkpIHsK
LSNpZiBERUJVR19DSFVOS19CVUlMRElORyA+IDEKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0
ZGVyciwgIiAtPiBMYXN0IHJhbmdlIG5vdCBjbG9zZWQgLSBjbG9zaW5nIHdpdGggZW5kT2Zmc2V0
OiAlaVxuIiwgbGVuZ3RoKTsKKyNpZiBERUJVR19DSFVOS19QQVJUX1BST1BBR0FUSU9OID4gMAor
ICAgICAgICAgICAgYm94ZXMuYWRkKHJhbmdlVGV4dEJveCk7CiAjZW5kaWYKLQotICAgICAgICAg
ICAgICAgIC8vIEN1cnJlbnQgdGV4dCBjaHVuayBpcyBub3QgeWV0IGNsb3NlZC4gRmluaXNoIHRo
ZSBjdXJyZW50IHJhbmdlLCBidXQgZG9uJ3Qgc3RhcnQgYSBuZXcgY2h1bmsuCi0gICAgICAgICAg
ICAgICAgcmFuZ2UuZW5kT2Zmc2V0ID0gbGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgaWYgKGlu
Zm8uaXQgIT0gc3ZnQ2hhcnMuZW5kKCkpIHsKLSNpZiBERUJVR19DSFVOS19CVUlMRElORyA+IDEK
LSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgLT4gTm90IGF0IGxhc3QgY2hh
cmFjdGVyIHlldCFcbiIpOwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Un
cmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgYm94IHRvIGJlIHByb2Nlc3NlZCwgYW5kIGlm
IHRoZSBuZXh0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlciBzdGFydHMgYSBuZXcg
Y2h1bmssIHRoZW4gY2xvc2UgdGhlIGN1cnJlbnQgY2h1bmsgYW5kIHN0YXJ0IGEgbmV3IG9uZS4K
LSAgICAgICAgICAgICAgICAgICAgaWYgKCgqaW5mby5pdCkubmV3VGV4dENodW5rKSB7Ci0jaWYg
REVCVUdfQ0hVTktfQlVJTERJTkcgPiAxCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRm
KHN0ZGVyciwgIiAtPiBOZXh0IGNoYXJhY3RlciBzdGFydHMgbmV3IGNodW5rISBDbG9zaW5nIGN1
cnJlbnQgY2h1bmssIGFuZCBzdGFydGluZyBhIG5ldyBvbmUuLi5cbiIpOwotI2VuZGlmCi0KLSAg
ICAgICAgICAgICAgICAgICAgICAgIGNsb3NlVGV4dENodW5rKGluZm8pOwotICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhcnRUZXh0Q2h1bmsoaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHN0YXJ0IGEgbmV3IGNoYXJh
Y3RlciByYW5nZQotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5jaHVuay5ib3hlcy5hcHBl
bmQoU1ZHSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2UoKSk7Ci0KLSNpZiBERUJVR19DSFVOS19CVUlM
RElORyA+IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIC0+IE5l
eHQgY2hhcmFjdGVyIGRvZXMgTk9UIHN0YXJ0IGEgbmV3IGNodW5rISBTdGFydGluZyBuZXcgY2hh
cmFjdGVyIHJhbmdlLi4uXG4iKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgfSBlbHNlIHsKLSNpZiBERUJVR19DSFVOS19CVUlMRElORyA+IDEKLSAgICAg
ICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgLT4gQ2xvc2luZyBmaW5hbCBjaHVuayEg
RmluaXNoZWQgcHJvY2Vzc2luZyFcbiIpOwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAg
Ly8gQ2xvc2UgZmluYWwgY2h1bmssIG9uY2Ugd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBi
b3gKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VUZXh0Q2h1bmsoaW5mbyk7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVNT
RVJUKGN1cnItPmlzSW5saW5lRmxvd0JveCgpKTsKLSAgICAgICAgICAgIElubGluZUZsb3dCb3gq
IGZsb3dCb3ggPSBzdGF0aWNfY2FzdDxJbmxpbmVGbG93Qm94Kj4oY3Vycik7Ci0KLSAgICAgICAg
ICAgIGlmICghZmxvd0JveC0+cmVuZGVyZXIoKS0+bm9kZSgpKQotICAgICAgICAgICAgICAgIGNv
bnRpbnVlOyAvLyBTa2lwIGdlbmVyYXRlZCBjb250ZW50LgotCi0gICAgICAgICAgICBib29sIGlz
VGV4dFBhdGggPSBmbG93Qm94LT5yZW5kZXJlcigpLT5ub2RlKCktPmhhc1RhZ05hbWUoU1ZHTmFt
ZXM6OnRleHRQYXRoVGFnKTsKLQotI2lmIERFQlVHX0NIVU5LX0JVSUxESU5HID4gMQotICAgICAg
ICAgICAgZnByaW50ZihzdGRlcnIsICIgLT4gSGFuZGxlIGlubGluZSBmbG93IGJveCAoJXApLCBp
c1RleHRQYXRoPSVpXG4iLCBmbG93Qm94LCAoaW50KSBpc1RleHRQYXRoKTsKLSNlbmRpZgotCi0g
ICAgICAgICAgICBpZiAoaXNUZXh0UGF0aCkKLSAgICAgICAgICAgICAgICBpbmZvLmhhbmRsaW5n
VGV4dFBhdGggPSB0cnVlOwotCi0gICAgICAgICAgICBidWlsZFRleHRDaHVua3Moc3ZnQ2hhcnMs
IGZsb3dCb3gsIGluZm8pOwotCi0gICAgICAgICAgICBpZiAoaXNUZXh0UGF0aCkKLSAgICAgICAg
ICAgICAgICBpbmZvLmhhbmRsaW5nVGV4dFBhdGggPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0K
LQotI2lmIERFQlVHX0NIVU5LX0JVSUxESU5HID4gMQotICAgIGZwcmludGYoc3RkZXJyLCAiIDwt
IGJ1aWxkVGV4dENodW5rcyhzdGFydD0lcClcbiIsIHN0YXJ0KTsKLSNlbmRpZgotfQotCi12b2lk
IFNWR1Jvb3RJbmxpbmVCb3g6OmxheW91dFRleHRDaHVua3MoKQotewotICAgIFZlY3RvcjxTVkdU
ZXh0Q2h1bms+OjppdGVyYXRvciBpdCA9IG1fc3ZnVGV4dENodW5rcy5iZWdpbigpOwotICAgIFZl
Y3RvcjxTVkdUZXh0Q2h1bms+OjppdGVyYXRvciBlbmQgPSBtX3N2Z1RleHRDaHVua3MuZW5kKCk7
Ci0KLSAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIFNWR1RleHRDaHVuayYg
Y2h1bmsgPSAqaXQ7Ci0KLSNpZiBERUJVR19DSFVOS19CVUlMRElORyA+IDAKLSAgICAgICAgewot
ICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJIYW5kbGUgVEVYVCBDSFVOSyEgYW5jaG9yPSVp
LCB0ZXh0TGVuZ3RoPSVmLCBsZW5ndGhBZGp1c3Q9JWksIGlzVmVydGljYWxUZXh0PSVpLCBpc1Rl
eHRQYXRoPSVpIHN0YXJ0PSVwLCBlbmQ9JXAgLT4gZGlzdDogJWlcbiIsCi0gICAgICAgICAgICAg
ICAgICAgIChpbnQpIGNodW5rLmFuY2hvciwgY2h1bmsudGV4dExlbmd0aCwgKGludCkgY2h1bmsu
bGVuZ3RoQWRqdXN0LCAoaW50KSBjaHVuay5pc1ZlcnRpY2FsVGV4dCwKLSAgICAgICAgICAgICAg
ICAgICAgKGludCkgY2h1bmsuaXNUZXh0UGF0aCwgY2h1bmsuc3RhcnQsIGNodW5rLmVuZCwgKHVu
c2lnbmVkIGludCkgKGNodW5rLmVuZCAtIGNodW5rLnN0YXJ0KSk7Ci0KLSAgICAgICAgICAgIFZl
Y3RvcjxTVkdJbmxpbmVCb3hDaGFyYWN0ZXJSYW5nZT46Oml0ZXJhdG9yIGJveEl0ID0gY2h1bmsu
Ym94ZXMuYmVnaW4oKTsKLSAgICAgICAgICAgIFZlY3RvcjxTVkdJbmxpbmVCb3hDaGFyYWN0ZXJS
YW5nZT46Oml0ZXJhdG9yIGJveEVuZCA9IGNodW5rLmJveGVzLmVuZCgpOwotCi0gICAgICAgICAg
ICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKDsgYm94SXQgIT0gYm94RW5k
OyArK2JveEl0KSB7Ci0gICAgICAgICAgICAgICAgU1ZHSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2Um
IHJhbmdlID0gKmJveEl0OwotICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgICAgICBm
cHJpbnRmKHN0ZGVyciwgIiAtPiBSQU5HRSAlaSBTVEFSVE9GRlNFVDogJWksIEVORE9GRlNFVDog
JWksIEJPWDogJXBcbiIsIGksIHJhbmdlLnN0YXJ0T2Zmc2V0LCByYW5nZS5lbmRPZmZzZXQsIHJh
bmdlLmJveCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGlm
IChjaHVuay5pc1RleHRQYXRoKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8g
dGV4dC1wYXRoICYgdGV4dExlbmd0aCwgd2l0aCBsZW5ndGhBZGp1c3Q9InNwYWNpbmciIGlzIGFs
cmVhZHkgaGFuZGxlZCBmb3IgdGV4dFBhdGggbGF5b3V0cy4KLSAgICAgICAgYXBwbHlUZXh0TGVu
Z3RoQ29ycmVjdGlvblRvVGV4dENodW5rKGNodW5rKTsKLSAKLSAgICAgICAgLy8gdGV4dC1hbmNo
b3IgaXMgYWxyZWFkeSBoYW5kbGVkIGZvciB0ZXh0UGF0aCBsYXlvdXRzLgotICAgICAgICBhcHBs
eVRleHRBbmNob3JUb1RleHRDaHVuayhjaHVuayk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5l
IHZvaWQgYWRkUGFpbnRTZXJ2ZXJUb1RleHREZWNvcmF0aW9uSW5mbyhFVGV4dERlY29yYXRpb24g
ZGVjb3JhdGlvbiwgU1ZHVGV4dERlY29yYXRpb25JbmZvJiBpbmZvLCBSZW5kZXJPYmplY3QqIG9i
amVjdCkKLXsKLSAgICBpZiAob2JqZWN0LT5zdHlsZSgpLT5zdmdTdHlsZSgpLT5oYXNGaWxsKCkp
Ci0gICAgICAgIGluZm8uZmlsbFNlcnZlck1hcC5zZXQoZGVjb3JhdGlvbiwgb2JqZWN0KTsKLQot
ICAgIGlmIChvYmplY3QtPnN0eWxlKCktPnN2Z1N0eWxlKCktPmhhc1N0cm9rZSgpKQotICAgICAg
ICBpbmZvLnN0cm9rZVNlcnZlck1hcC5zZXQoZGVjb3JhdGlvbiwgb2JqZWN0KTsKLX0KLQotU1ZH
VGV4dERlY29yYXRpb25JbmZvIFNWR1Jvb3RJbmxpbmVCb3g6OnJldHJpZXZlUGFpbnRTZXJ2ZXJz
Rm9yVGV4dERlY29yYXRpb24oUmVuZGVyT2JqZWN0KiBzdGFydCkKLXsKLSAgICBBU1NFUlQoc3Rh
cnQpOwotCi0gICAgVmVjdG9yPFJlbmRlck9iamVjdCo+IHBhcmVudENoYWluOwotICAgIHdoaWxl
ICgoc3RhcnQgPSBzdGFydC0+cGFyZW50KCkpKSB7Ci0gICAgICAgIHBhcmVudENoYWluLnByZXBl
bmQoc3RhcnQpOwotCi0gICAgICAgIC8vIFN0b3AgYXQgb3VyIGRpcmVjdCA8dGV4dD4gcGFyZW50
LgotICAgICAgICBpZiAoc3RhcnQtPmlzU1ZHVGV4dCgpKQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgfQotCi0gICAgVmVjdG9yPFJlbmRlck9iamVjdCo+OjppdGVyYXRvciBpdCA9IHBhcmVudENo
YWluLmJlZ2luKCk7Ci0gICAgVmVjdG9yPFJlbmRlck9iamVjdCo+OjppdGVyYXRvciBlbmQgPSBw
YXJlbnRDaGFpbi5lbmQoKTsKLQotICAgIFNWR1RleHREZWNvcmF0aW9uSW5mbyBpbmZvOwotCi0g
ICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBSZW5kZXJPYmplY3QqIG9iamVj
dCA9ICppdDsKLSAgICAgICAgQVNTRVJUKG9iamVjdCk7Ci0KLSAgICAgICAgUmVuZGVyU3R5bGUq
IHN0eWxlID0gb2JqZWN0LT5zdHlsZSgpOwotICAgICAgICBBU1NFUlQoc3R5bGUpOwotCi0gICAg
ICAgIGludCBkZWNvcmF0aW9ucyA9IHN0eWxlLT50ZXh0RGVjb3JhdGlvbigpOwotICAgICAgICBp
ZiAoZGVjb3JhdGlvbnMgIT0gTk9ORSkgewotICAgICAgICAgICAgaWYgKGRlY29yYXRpb25zICYg
T1ZFUkxJTkUpCi0gICAgICAgICAgICAgICAgYWRkUGFpbnRTZXJ2ZXJUb1RleHREZWNvcmF0aW9u
SW5mbyhPVkVSTElORSwgaW5mbywgb2JqZWN0KTsKLQotICAgICAgICAgICAgaWYgKGRlY29yYXRp
b25zICYgVU5ERVJMSU5FKQotICAgICAgICAgICAgICAgIGFkZFBhaW50U2VydmVyVG9UZXh0RGVj
b3JhdGlvbkluZm8oVU5ERVJMSU5FLCBpbmZvLCBvYmplY3QpOwotCi0gICAgICAgICAgICBpZiAo
ZGVjb3JhdGlvbnMgJiBMSU5FX1RIUk9VR0gpCi0gICAgICAgICAgICAgICAgYWRkUGFpbnRTZXJ2
ZXJUb1RleHREZWNvcmF0aW9uSW5mbyhMSU5FX1RIUk9VR0gsIGluZm8sIG9iamVjdCk7CiAgICAg
ICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gaW5mbzsKLX0KLQotdm9pZCBTVkdSb290SW5saW5l
Qm94Ojp3YWxrVGV4dENodW5rcyhTVkdUZXh0Q2h1bmtXYWxrZXJCYXNlKiB3YWxrZXIsIGNvbnN0
IFNWR0lubGluZVRleHRCb3gqIHRleHRCb3gpCi17Ci0gICAgQVNTRVJUKHdhbGtlcik7Ci0KLSAg
ICBWZWN0b3I8U1ZHVGV4dENodW5rPjo6aXRlcmF0b3IgaXQgPSBtX3N2Z1RleHRDaHVua3MuYmVn
aW4oKTsKLSAgICBWZWN0b3I8U1ZHVGV4dENodW5rPjo6aXRlcmF0b3IgaXRFbmQgPSBtX3N2Z1Rl
eHRDaHVua3MuZW5kKCk7Ci0KLSAgICBmb3IgKDsgaXQgIT0gaXRFbmQ7ICsraXQpIHsKLSAgICAg
ICAgU1ZHVGV4dENodW5rJiBjdXJDaHVuayA9ICppdDsKLQotICAgICAgICBWZWN0b3I8U1ZHSW5s
aW5lQm94Q2hhcmFjdGVyUmFuZ2U+OjppdGVyYXRvciBib3hJdCA9IGN1ckNodW5rLmJveGVzLmJl
Z2luKCk7Ci0gICAgICAgIFZlY3RvcjxTVkdJbmxpbmVCb3hDaGFyYWN0ZXJSYW5nZT46Oml0ZXJh
dG9yIGJveEVuZCA9IGN1ckNodW5rLmJveGVzLmVuZCgpOwotCi0gICAgICAgIElubGluZUJveCog
bGFzdE5vdGlmaWVkQm94ID0gMDsKLSAgICAgICAgSW5saW5lQm94KiBwcmV2Qm94ID0gMDsKLQot
ICAgICAgICB1bnNpZ25lZCBpbnQgY2h1bmtPZmZzZXQgPSAwOwotICAgICAgICBib29sIHN0YXJ0
ZWRGaXJzdENodW5rID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yICg7IGJveEl0ICE9IGJveEVuZDsg
Kytib3hJdCkgewotICAgICAgICAgICAgU1ZHSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2UmIHJhbmdl
ID0gKmJveEl0OwotCi0gICAgICAgICAgICBBU1NFUlQocmFuZ2UuYm94LT5pc0lubGluZVRleHRC
b3goKSk7Ci0gICAgICAgICAgICBTVkdJbmxpbmVUZXh0Qm94KiByYW5nZVRleHRCb3ggPSBzdGF0
aWNfY2FzdDxTVkdJbmxpbmVUZXh0Qm94Kj4ocmFuZ2UuYm94KTsKKyNpZiBERUJVR19DSFVOS19Q
QVJUX1BST1BBR0FUSU9OID4gMAorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJQcm9w
YWdhdGVkIHRleHQgY2h1bmsgcGFydCBpbmZvcm1hdGlvbjpcbiIpOwogCi0gICAgICAgICAgICBp
ZiAodGV4dEJveCAmJiByYW5nZVRleHRCb3ggIT0gdGV4dEJveCkgewotICAgICAgICAgICAgICAg
IGNodW5rT2Zmc2V0ICs9IHJhbmdlLmVuZE9mZnNldCAtIHJhbmdlLnN0YXJ0T2Zmc2V0OwotICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQorICAgICAgICBMaXN0SGFzaFNl
dDxTVkdJbmxpbmVUZXh0Qm94Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYm94ZXMuYmVnaW4oKTsK
KyAgICAgICAgY29uc3QgTGlzdEhhc2hTZXQ8U1ZHSW5saW5lVGV4dEJveCo+Ojpjb25zdF9pdGVy
YXRvciBlbmQgPSBib3hlcy5lbmQoKTsKIAotICAgICAgICAgICAgLy8gRXZlbnR1YWxseSBub3Rp
ZnkgdGhhdCB3ZSBzdGFydGVkIGEgbmV3IGNodW5rCi0gICAgICAgICAgICBpZiAoIXRleHRCb3gg
JiYgIXN0YXJ0ZWRGaXJzdENodW5rKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRlZEZpcnN0Q2h1
bmsgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgbGFzdE5vdGlmaWVkQm94ID0gcmFuZ2UuYm94
OwotICAgICAgICAgICAgICAgIHdhbGtlci0+c3RhcnQocmFuZ2UuYm94KTsKLSAgICAgICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRXZlbnR1YWxseSBhcHBseSBuZXcgc3R5bGUs
IGFzIHRoaXMgY2h1bmsgc3BhbnMgbXVsdGlwbGUgYm94ZXMgKHdpdGggcG9zc2libGUgZGlmZmVy
ZW50IHN0eWxpbmcpCi0gICAgICAgICAgICAgICAgaWYgKHByZXZCb3ggJiYgcHJldkJveCAhPSBy
YW5nZS5ib3gpIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdE5vdGlmaWVkQm94ID0gcmFuZ2Uu
Ym94OworICAgICAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICBjb25z
dCBTVkdJbmxpbmVUZXh0Qm94KiBib3ggPSAqaXQ7CisgICAgICAgICAgICBjb25zdCBWZWN0b3I8
U1ZHVGV4dENodW5rUGFydD4mIHBhcnRzID0gYm94LT5zdmdUZXh0Q2h1bmtQYXJ0cygpOwogCi0g
ICAgICAgICAgICAgICAgICAgIHdhbGtlci0+ZW5kKHByZXZCb3gpOwotICAgICAgICAgICAgICAg
ICAgICB3YWxrZXItPnN0YXJ0KGxhc3ROb3RpZmllZEJveCk7Ci0gICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgQm94ICVwIGNvbnRhaW5zICVpIHRleHQgY2h1
bmsgcGFydHM6XG4iLCBib3gsIHN0YXRpY19jYXN0PGludD4ocGFydHMuc2l6ZSgpKSk7CisgICAg
ICAgICAgICBWZWN0b3I8U1ZHVGV4dENodW5rUGFydD46OmNvbnN0X2l0ZXJhdG9yIHBhcnRJdCA9
IHBhcnRzLmJlZ2luKCk7CisgICAgICAgICAgICBjb25zdCBWZWN0b3I8U1ZHVGV4dENodW5rUGFy
dD46OmNvbnN0X2l0ZXJhdG9yIHBhcnRFbmQgPSBwYXJ0cy5lbmQoKTsKKyAgICAgICAgICAgIGZv
ciAoOyBwYXJ0SXQgIT0gcGFydEVuZDsgKytwYXJ0SXQpIHsKKyAgICAgICAgICAgICAgICBjb25z
dCBTVkdUZXh0Q2h1bmtQYXJ0JiBwYXJ0ID0gKnBhcnRJdDsKKyAgICAgICAgICAgICAgICBmcHJp
bnRmKHN0ZGVyciwgIiAgIC0+IGZpcnN0Q2hhcmFjdGVyIHg9JWxmLCB5PSVsZiwgb2Zmc2V0PSVp
LCBsZW5ndGg9JWksIHdpZHRoPSVsZiwgaGVpZ2h0PSVsZiwgdGV4dFJlbmRlcmVyPSVwXG4iCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHBhcnQuZmlyc3RDaGFyYWN0ZXItPngsIHBh
cnQuZmlyc3RDaGFyYWN0ZXItPnksIHBhcnQub2Zmc2V0LCBwYXJ0Lmxlbmd0aCwgcGFydC53aWR0
aCwgcGFydC5oZWlnaHQsIGJveC0+dGV4dFJlbmRlcmVyKCkpOwogICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoID0gcmFuZ2UuZW5kT2Zmc2V0IC0gcmFuZ2Uu
c3RhcnRPZmZzZXQ7Ci0KLSAgICAgICAgICAgIFZlY3RvcjxTVkdDaGFyPjo6aXRlcmF0b3IgaXRD
aGFyQmVnaW4gPSBjdXJDaHVuay5zdGFydCArIGNodW5rT2Zmc2V0OwotICAgICAgICAgICAgVmVj
dG9yPFNWR0NoYXI+OjppdGVyYXRvciBpdENoYXJFbmQgPSBjdXJDaHVuay5zdGFydCArIGNodW5r
T2Zmc2V0ICsgbGVuZ3RoOwotICAgICAgICAgICAgQVNTRVJUKGl0Q2hhckVuZCA8PSBjdXJDaHVu
ay5lbmQpOwotCi0gICAgICAgICAgICAvLyBQcm9jZXNzIHRoaXMgY2h1bmsgcG9ydGlvbgotICAg
ICAgICAgICAgKCp3YWxrZXIpKHJhbmdlVGV4dEJveCwgcmFuZ2Uuc3RhcnRPZmZzZXQsIGN1ckNo
dW5rLmN0bSwgaXRDaGFyQmVnaW4sIGl0Q2hhckVuZCk7Ci0KLSAgICAgICAgICAgIGNodW5rT2Zm
c2V0ICs9IGxlbmd0aDsKLQotICAgICAgICAgICAgaWYgKCF0ZXh0Qm94KQotICAgICAgICAgICAg
ICAgIHByZXZCb3ggPSByYW5nZS5ib3g7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoIXRleHRC
b3ggJiYgc3RhcnRlZEZpcnN0Q2h1bmspCi0gICAgICAgICAgICB3YWxrZXItPmVuZChsYXN0Tm90
aWZpZWRCb3gpOwogICAgIH0KKyNlbmRpZgogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9TVkdSb290SW5saW5lQm94LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9yZW5kZXJpbmcvU1ZHUm9vdElubGluZUJveC5oCShyZXZpc2lvbiA2MTM4MykKKysr
IFdlYkNvcmUvcmVuZGVyaW5nL1NWR1Jvb3RJbmxpbmVCb3guaAkod29ya2luZyBjb3B5KQpAQCAt
MSw5ICsxLDggQEAKIC8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgV2ViS2l0IHByb2pl
Y3QuCi0gKgogICogQ29weXJpZ2h0IChDKSAyMDA2IE9saXZlciBIdW50IDxvamgxNkBzdHVkZW50
LmNhbnRlcmJ1cnkuYWMubno+CiAgKiAgICAgICAgICAgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIg
SW5jLgogICogICAgICAgICAgIChDKSAyMDA3IE5pa29sYXMgWmltbWVybWFubiA8emltbWVybWFu
bkBrZGUub3JnPgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAy
MDEwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCkBAIC0zNCwxMiAr
MzMsMTAgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFzcyBJbmxpbmVUZXh0Qm94Owot
Y2xhc3MgUmVuZGVyU1ZHUm9vdDsKIGNsYXNzIFNWR0lubGluZVRleHRCb3g7Ci1zdHJ1Y3QgU1ZH
TGFzdEdseXBoSW5mbzsKIAotY2xhc3MgU1ZHUm9vdElubGluZUJveCA6IHB1YmxpYyBSb290SW5s
aW5lQm94LCBwcm90ZWN0ZWQgU1ZHUmVuZGVyQmFzZSB7CitjbGFzcyBTVkdSb290SW5saW5lQm94
IDogcHVibGljIFJvb3RJbmxpbmVCb3gKKyAgICAgICAgICAgICAgICAgICAgICAgLCBwcm90ZWN0
ZWQgU1ZHUmVuZGVyQmFzZSB7CiBwdWJsaWM6CiAgICAgU1ZHUm9vdElubGluZUJveChSZW5kZXJP
YmplY3QqIG9iaikKICAgICAgICAgOiBSb290SW5saW5lQm94KG9iaikKQEAgLTQ3LDM5ICs0NCwy
NyBAQCBwdWJsaWM6CiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCBpc1NWR1Jvb3RJ
bmxpbmVCb3goKSB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBib29sIGlzU1ZHUm9vdElu
bGluZUJveCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KIAogICAgIHZpcnR1YWwgaW50IHZpcnR1
YWxIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2hlaWdodDsgfQotICAgIHZvaWQgc2V0SGVpZ2h0
KGludCBoKSB7IG1faGVpZ2h0ID0gaDsgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBwYWludChS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKyAgICB2b2lkIHNldEhl
aWdodChpbnQgaGVpZ2h0KSB7IG1faGVpZ2h0ID0gaGVpZ2h0OyB9CiAKLSAgICB2aXJ0dWFsIGlu
dCBwbGFjZUJveGVzSG9yaXpvbnRhbGx5KGludCB4LCBpbnQmIGxlZnRQb3NpdGlvbiwgaW50JiBy
aWdodFBvc2l0aW9uLCBib29sJiBuZWVkc1dvcmRTcGFjaW5nLCBHbHlwaE92ZXJmbG93QW5kRmFs
bGJhY2tGb250c01hcCYpOwotICAgIHZpcnR1YWwgaW50IHZlcnRpY2FsbHlBbGlnbkJveGVzKGlu
dCBoZWlnaHRPZkJsb2NrLCBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYpOworICAg
IHZpcnR1YWwgdm9pZCBwYWludChSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGludCB0eCwgaW50
IHR5KTsKIAotICAgIHZpcnR1YWwgdm9pZCBjb21wdXRlUGVyQ2hhcmFjdGVyTGF5b3V0SW5mb3Jt
YXRpb24oKTsKKyAgICB2b2lkIGNvbXB1dGVQZXJDaGFyYWN0ZXJMYXlvdXRJbmZvcm1hdGlvbigp
OwogCiAgICAgdmlydHVhbCBGbG9hdFJlY3Qgb2JqZWN0Qm91bmRpbmdCb3goKSBjb25zdCB7IHJl
dHVybiBGbG9hdFJlY3QoKTsgfQogICAgIHZpcnR1YWwgRmxvYXRSZWN0IHJlcGFpbnRSZWN0SW5M
b2NhbENvb3JkaW5hdGVzKCkgY29uc3QgeyByZXR1cm4gRmxvYXRSZWN0KCk7IH0KIAotICAgIC8v
IFVzZWQgYnkgU1ZHSW5saW5lVGV4dEJveAorICAgIC8vIFVzZWQgYnkgU1ZHUmVuZGVyVHJlZUFz
VGV4dAogICAgIGNvbnN0IFZlY3RvcjxTVkdUZXh0Q2h1bms+JiBzdmdUZXh0Q2h1bmtzKCkgY29u
c3QgeyByZXR1cm4gbV9zdmdUZXh0Q2h1bmtzOyB9CiAKLSAgICB2b2lkIHdhbGtUZXh0Q2h1bmtz
KFNWR1RleHRDaHVua1dhbGtlckJhc2UqLCBjb25zdCBTVkdJbmxpbmVUZXh0Qm94KiB0ZXh0Qm94
ID0gMCk7Ci0KIHByaXZhdGU6Ci0gICAgZnJpZW5kIHN0cnVjdCBTVkdSb290SW5saW5lQm94UGFp
bnRXYWxrZXI7Ci0KLSAgICB2b2lkIGxheW91dElubGluZUJveGVzKCk7Ci0gICAgdm9pZCBsYXlv
dXRJbmxpbmVCb3hlcyhJbmxpbmVGbG93Qm94KiBzdGFydCwgVmVjdG9yPFNWR0NoYXI+OjppdGVy
YXRvciYgaXQsIGludCYgbWluWCwgaW50JiBtYXhYLCBpbnQmIG1pblksIGludCYgbWF4WSk7Ci0K
KyAgICB2b2lkIHByb3BhZ2F0ZVRleHRDaHVua1BhcnRJbmZvcm1hdGlvbigpOwogICAgIHZvaWQg
YnVpbGRMYXlvdXRJbmZvcm1hdGlvbihJbmxpbmVGbG93Qm94KiBzdGFydCwgU1ZHQ2hhcmFjdGVy
TGF5b3V0SW5mbyYpOwogCi0gICAgdm9pZCBidWlsZFRleHRDaHVua3MoVmVjdG9yPFNWR0NoYXI+
JiwgVmVjdG9yPFNWR1RleHRDaHVuaz4mLCBJbmxpbmVGbG93Qm94KiBzdGFydCk7Ci0gICAgdm9p
ZCBidWlsZFRleHRDaHVua3MoVmVjdG9yPFNWR0NoYXI+JiwgSW5saW5lRmxvd0JveCogc3RhcnQs
IFNWR1RleHRDaHVua0xheW91dEluZm8mKTsKLSAgICB2b2lkIGxheW91dFRleHRDaHVua3MoKTsK
LQotICAgIFNWR1RleHREZWNvcmF0aW9uSW5mbyByZXRyaWV2ZVBhaW50U2VydmVyc0ZvclRleHRE
ZWNvcmF0aW9uKFJlbmRlck9iamVjdCogc3RhcnQpOworICAgIHZvaWQgbGF5b3V0Um9vdEJveCgp
OworICAgIHZvaWQgbGF5b3V0Q2hpbGRCb3hlcyhJbmxpbmVGbG93Qm94KiBzdGFydCk7CiAKIHBy
aXZhdGU6CiAgICAgaW50IG1faGVpZ2h0OwpAQCAtODcsOSArNzIsNiBAQCBwcml2YXRlOgogICAg
IFZlY3RvcjxTVkdUZXh0Q2h1bms+IG1fc3ZnVGV4dENodW5rczsKIH07CiAKLS8vIFNoYXJlZCB3
aXRoIFNWR1JlbmRlclRyZWVBc1RleHQgLyBTVkdJbmxpbmVUZXh0Qm94Ci1SZW5kZXJTVkdSb290
KiBmaW5kU1ZHUm9vdE9iamVjdChSZW5kZXJPYmplY3QqIHN0YXJ0KTsKLQogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gRU5BQkxFKFNWRykKSW5kZXg6IFdlYkNvcmUvcmVuZGVy
aW5nL1NWR1RleHRDaHVua0xheW91dEluZm8uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVu
ZGVyaW5nL1NWR1RleHRDaHVua0xheW91dEluZm8uY3BwCShyZXZpc2lvbiA2MTM4MykKKysrIFdl
YkNvcmUvcmVuZGVyaW5nL1NWR1RleHRDaHVua0xheW91dEluZm8uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yMiw4ICsyMiw3IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiU1ZHVGV4
dENodW5rTGF5b3V0SW5mby5oIgogCi0vLyBGSVhNRTogVGhpcyBjb2RlIGlzIGN1cnJlbnRseSBk
ZWFjdGl2YXRlZCwgdW50aWwgdGhlIFNWRyBUZXh0IHJld3JpdGUgcGF0Y2ggbGFuZHMuCi0jaWYg
RU5BQkxFKFNWRykgJiYgMAorI2lmIEVOQUJMRShTVkcpCiAjaW5jbHVkZSAiSW5saW5lRmxvd0Jv
eC5oIgogI2luY2x1ZGUgIlNWR0lubGluZVRleHRCb3guaCIKICNpbmNsdWRlICJTVkdSZW5kZXJT
dHlsZS5oIgpAQCAtMjc3LDggKzI3Niw3IEBAIHZvaWQgU1ZHVGV4dENodW5rTGF5b3V0SW5mbzo6
cmVjdXJzaXZlQnUKICAgICAgICAgICAgIElubGluZVRleHRCb3gqIHRleHRCb3ggPSBzdGF0aWNf
Y2FzdDxJbmxpbmVUZXh0Qm94Kj4oY3Vycik7CiAKICAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0
aCA9IHRleHRCb3gtPmxlbigpOwotICAgICAgICAgICAgaWYgKCFsZW5ndGgpCi0gICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICBBU1NFUlQobGVuZ3RoID4gMCk7CiAKICNpZiBE
RUJVR19DSFVOS19CVUlMRElORyA+IDEKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIC0+
IEhhbmRsZSBpbmxpbmUgdGV4dCBib3ggKCVwKSB3aXRoICVpIGNoYXJhY3RlcnMgKHN0YXJ0OiAl
aSwgZW5kOiAlaSksIGhhbmRsaW5nVGV4dFBhdGg9JWlcbiIsCkluZGV4OiBXZWJDb3JlL3JlbmRl
cmluZy9TVkdUZXh0Q2h1bmtMYXlvdXRJbmZvLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5k
ZXJpbmcvU1ZHVGV4dENodW5rTGF5b3V0SW5mby5oCShyZXZpc2lvbiA2MTM4MykKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1NWR1RleHRDaHVua0xheW91dEluZm8uaAkod29ya2luZyBjb3B5KQpAQCAt
MjQsNiArMjQsNyBAQAogCiAjaWYgRU5BQkxFKFNWRykKICNpbmNsdWRlICJBZmZpbmVUcmFuc2Zv
cm0uaCIKKyNpbmNsdWRlICJTVkdDaGFyYWN0ZXJEYXRhLmgiCiAjaW5jbHVkZSAiU1ZHUmVuZGVy
U3R5bGUuaCIKICNpbmNsdWRlICJTVkdUZXh0Q29udGVudEVsZW1lbnQuaCIKIApAQCAtMzMsOCAr
MzQsNzUgQEAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgSW5saW5lQm94OworY2xhc3Mg
SW5saW5lRmxvd0JveDsKIGNsYXNzIFNWR0lubGluZVRleHRCb3g7CiAKKy8vIEEgU1ZHVGV4dENo
dW5rIGRpcmVjdGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBkZWZpbml0aW9uIG9mIGEgInRleHQgY2h1
bmsiIHBlciBTVkcgMS4xIHNwZWNpZmljYXRpb24KKy8vIEZvciBleGFtcGxlLCBlYWNoIGFic29s
dXRlIHBvc2l0aW9uZWQgY2hhcmFjdGVyIHN0YXJ0cyBhIHRleHQgY2h1bmsgKG11Y2ggbW9yZSB0
byByZXNwZWN0LCBzZWUgc3BlYykuCisvLyBFYWNoIFNWR1RleHRDaHVuayBjb250YWlucyBhIFZl
Y3RvciBvZiBTVkdJbmxpbmVCb3hDaGFyYWN0ZXJSYW5nZSwgZGVzY3JpYmluZyBob3cgbWFueSBi
b3hlcyBhcmUgc3Bhbm5lZAorLy8gYnkgdGhpcyBjaHVuay4gRm9sbG93aW5nIHR3byBleGFtcGxl
cyBzaG91bGQgY2xhcmlmeSB0aGUgY29kZSBhIGJpdDoKKy8vCisvLyAxLiA8dGV4dCB4PSIxMCAy
MCAzMCI+QUJDPC90ZXh0PiAtIG9uZSBJbmxpbmVUZXh0Qm94IGlzIGNyZWF0ZWQsIHRocmVlIFNW
R1RleHRDaHVua3MgZWFjaCB3aXRoIG9uZSBTVkdJbmxpbmVCb3hDaGFyYXRlclJhbmdlCisvLyBb
U1ZHVGV4dENodW5rIDFdCisvLyAgICBbU1ZHSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2UgMSwgc3Rh
cnRPZmZzZXQ9MCwgZW5kT2Zmc2V0PTEsIGJveD0weDFdCisvLyBbU1ZHVGV4dENodW5rIDJdCisv
LyAgICBbU1ZHSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2UgMSwgc3RhcnRPZmZzZXQ9MSwgZW5kT2Zm
c2V0PTIsIGJveD0weDFdCisvLyBbU1ZHVGV4dENodW5rIDNdCisvLyAgICBbU1ZHSW5saW5lQm94
Q2hhcmFjdGVyUmFuZ2UgMSwgc3RhcnRPZmZzZXQ9MiwgZW5kT2Zmc2V0PTMsIGJveD0weDFdCisv
LworLy8gMi4gPHRleHQgeD0iMTAiPkE8dHNwYW4+QjwvdHNwYW4+QzwvdGV4dD4gLSB0aHJlZSBJ
bmxpbmVUZXh0Qm94cyBhcmUgY3JlYXRlZCwgb25lIFNWR1RleHRDaHVuaywgd2l0aCB0aHJlZSBT
VkdJbmxpbmVCb3hDaGFyYWN0ZXJSYW5nZXMKKy8vIFtTVkdUZXh0Q2h1bmsgMV0KKy8vICAgIFtT
VkdJbmxpbmVCb3hDaGFyYWN0ZXJSYW5nZSAxLCBzdGFydE9mZnNldD0wLCBlbmRPZmZzZXQ9MSwg
Ym94PTB4MV0KKy8vICAgIFtTVkdJbmxpbmVCb3hDaGFyYWN0ZXJSYW5nZSAyLCBzdGFydE9mZnNl
dD0wLCBlbmRPZmZzZXQ9MSwgYm94PTB4Ml0KKy8vICAgIFtTVkdJbmxpbmVCb3hDaGFyYWN0ZXJS
YW5nZSAzLCBzdGFydE9mZnNldD0wLCBlbmRPZmZzZXQ9MSwgYm94PTB4M10KKy8vCisvLyBIaWdo
IGxldmVsIG92ZXJ2aWV3IG9mIHRoZSBTVkcgdGV4dCBsYXlvdXQgY29kZToKKy8vIFN0ZXAgIzEp
IC0gQnVpbGQgVmVjdG9yIG9mIFNWR0NoYXIgb2JqZWN0cyBzdGFydGluZyBmcm9tIHJvb3QgPHRl
eHQ+IGRpdmluZyBpbnRvIGNoaWxkcmVuCisvLyBTdGVwICMyKSAtIEJ1aWxkIFZlY3RvciBvZiBT
VkdUZXh0Q2h1bmsgb2JqZWN0cywgY29udGFpbmluZyBvZmZzZXRzIGludG8gdGhlIElubGluZVRl
eHRCb3hlcyBhbmQgU1ZHQ2hhciB2ZWN0b3JzCisvLyBTdGVwICMzKSAtIEFwcGx5IGNodW5rIHBv
c3QgcHJvY2Vzc2luZyAodGV4dC1hbmNob3IgLyB0ZXh0TGVuZ3RoIHN1cHBvcnQsIHdoaWNoIG9w
ZXJhdGUgb24gdGV4dCBjaHVua3MhKQorLy8gU3RlcCAjNCkgLSBQcm9wYWdhdGUgaW5mb3JtYXRp
b24sIGhvdyBtYW55IGNodW5rICJwYXJ0cyIgYXJlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIFNWR0lu
bGluZVRleHRCb3ggKHNlZSBiZWxvdykKKy8vIFN0ZXAgIzUpIC0gTGF5b3V0IGFsbCBJbmxpbmVC
b3hlcywgb25seSBieSBtZWFzdXJpbmcgdGhlaXIgY29udGV4dCByZWN0ICh4L3kvd2lkdGgvaGVp
Z2h0IGRlZmluZWQgdGhyb3VnaCBTVkdDaGFycyBhbmQgdHJhbnNmb3JtYXRpb25zKQorLy8gU3Rl
cCAjNikgLSBMYXlvdXQgU1ZHUm9vdElubGluZUJveCwgaXQncyBwYXJlbnQgUmVuZGVyU1ZHVGV4
dCBibG9jayBhbmQgZml4dXAgY2hpbGQgcG9zaXRpb25zLCB0byBiZSByZWxhdGl2ZSB0byB0aGUg
cm9vdCBib3gKKy8vCisvLyBXaGVuIHBhaW50aW5nIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycywgd2Ug
aGF2ZSB0byBkZXRlcm1pbmUgaG93IG1hbnkgY2FuIGJlIGRyYXduIGluIGEgcm93LiBFYWNoIGFi
c29sdXRlIHBvc3Rpb25lZAorLy8gY2hhcmFjdGVyIGlzIGRyYXduIGluZGl2aWR1YWxseS4gQWZ0
ZXIgc3RlcCAjMikgd2Uga25vdyBhbGwgdGV4dCBjaHVua3MsIGFuZCBob3cgdGhleSBzcGFuIGFj
cm9zcyB0aGUgU1ZHSW5saW5lVGV4dEJveGVzLgorLy8gSW4gc3RlcCAjNCkgd2UgYnVpbGQgYSBs
aXN0IG9mIHRleHQgY2h1bmsgInBhcnRzIiBhbmQgc3RvcmUgaXQgaW4gZWFjaCBTVkdJbmxpbmVU
ZXh0Qm94LiBBIGNodW5rICJwYXJ0IiBpcyBhIHBhcnQgb2YgYQorLy8gdGV4dCBjaHVuayB0aGF0
IGxpdmVzIGluIGEgU1ZHSW5saW5lVGV4dEJveCAoY29uc2lzdHMgb2YgYSBsZW5ndGgsIHdpZHRo
LCBoZWlnaHQgYW5kIGEgbW9ub3RvbmljIG9mZnNldCBmcm9tIHRoZSBjaHVuayBiZWdpbikKKy8v
IFRoZSBTVkdUZXh0Q2h1bmtQYXJ0IG9iamVjdCBkZXNjcmliZXMgdGhpcyBpbmZvcm1hdGlvbi4K
Ky8vIFdoZW4gcGFpbnRpbmcgd2UgY2FuIGZvbGxvdyB0aGUgcmVndWxhciBJbmxpbmVCb3ggZmxv
dywgd2Ugc3RhcnQgcGFpbnRpbmcgdGhlIFNWR1Jvb3RJbmxpbmVCb3gsIHdoaWNoIGp1c3QgYXNr
cyBpdHMgY2hpbGRyZW4KKy8vIHRvIHBhaW50LiBUaGV5IGNhbiBwYWludCBvbiB0aGVpciBvd24g
YmVjYXVzZSBhbGwgcG9zaXRpb24gaW5mb3JtYXRpb24gYXJlIGtub3duLiBQcmV2aW91c2x5IHdl
IHVzZWQgdG8gZHJhdyBfYWxsXyBjaGFyYWN0ZXJzCisvLyBmcm9tIHRoZSBTVkdSb290SW5saW5l
Qm94LCB3aGljaCB2aW9sYXRlcyB0aGUgd2hvbGUgY29uY2VwdCBvZiB0aGUgbXVsdGlwbGUgSW5s
aW5lQm94ZXMsIGFuZCBtYWRlIHRleHQgc2VsZWN0aW9uIHZlcnkgaGFyZCB0bworLy8gaW1wbGVt
ZW50LgorCitzdHJ1Y3QgU1ZHVGV4dENodW5rUGFydCB7CisgICAgU1ZHVGV4dENodW5rUGFydCgp
CisgICAgICAgIDogb2Zmc2V0KC0xKQorICAgICAgICAsIGxlbmd0aCgtMSkKKyAgICAgICAgLCB3
aWR0aCgwKQorICAgICAgICAsIGhlaWdodCgwKQorICAgIHsKKyAgICB9CisKKyAgICBib29sIGlz
VmFsaWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG9mZnNldCAhPSAtMQorICAgICAg
ICAgICAgJiYgbGVuZ3RoICE9IC0xCisgICAgICAgICAgICAmJiB3aWR0aAorICAgICAgICAgICAg
JiYgaGVpZ2h0OworICAgIH0KKworICAgIC8vIEZpcnN0IGNoYXJhY3RlciBvZiB0aGlzIHRleHQg
Y2h1bmsgcGFydCwgZGVmaW5pbmcgdGhlIG9yaWdpbiB0byBiZSBkcmF3bgorICAgIFZlY3RvcjxT
VkdDaGFyPjo6Y29uc3RfaXRlcmF0b3IgZmlyc3RDaGFyYWN0ZXI7CisKKyAgICAvLyBTdGFydCBv
ZmZzZXQgaW4gdGV4dFJlbmRlcmVyKCktPmNoYXJhY3RlcnMoKSBidWZmZXIuCisgICAgaW50IG9m
ZnNldDsKKworICAgIC8vIGxlbmd0aC93aWR0aC9oZWlnaHQgb2YgY2h1bmsgcGFydAorICAgIGlu
dCBsZW5ndGg7CisgICAgZmxvYXQgd2lkdGg7CisgICAgZmxvYXQgaGVpZ2h0OworfTsKKwogc3Ry
dWN0IFNWR0lubGluZUJveENoYXJhY3RlclJhbmdlIHsKICAgICBTVkdJbmxpbmVCb3hDaGFyYWN0
ZXJSYW5nZSgpCiAgICAgICAgIDogc3RhcnRPZmZzZXQoSU5UX01JTikKQEAgLTU4LDE2ICsxMjYs
MTYgQEAgc3RydWN0IFNWR0NoYXI7CiB0eXBlZGVmIFNWR1RleHRDb250ZW50RWxlbWVudDo6U1ZH
TGVuZ3RoQWRqdXN0VHlwZSBFTGVuZ3RoQWRqdXN0OwogCiBzdHJ1Y3QgU1ZHVGV4dENodW5rIHsK
LSAgICBTVkdUZXh0Q2h1bmsoKQorICAgIFNWR1RleHRDaHVuayhWZWN0b3I8U1ZHQ2hhcj46Oml0
ZXJhdG9yIGl0KQogICAgICAgICA6IGFuY2hvcihUQV9TVEFSVCkKICAgICAgICAgLCB0ZXh0TGVu
Z3RoKDAuMGYpCiAgICAgICAgICwgbGVuZ3RoQWRqdXN0KFNWR1RleHRDb250ZW50RWxlbWVudDo6
TEVOR1RIQURKVVNUX1NQQUNJTkcpCi0gICAgICAgICwgY3RtKCkKICAgICAgICAgLCBpc1ZlcnRp
Y2FsVGV4dChmYWxzZSkKICAgICAgICAgLCBpc1RleHRQYXRoKGZhbHNlKQotICAgICAgICAsIHN0
YXJ0KDApCi0gICAgICAgICwgZW5kKDApCi0gICAgeyB9CisgICAgICAgICwgc3RhcnQoaXQpCisg
ICAgICAgICwgZW5kKGl0KQorICAgIHsKKyAgICB9CiAKICAgICAvLyB0ZXh0LWFuY2hvciBzdXBw
b3J0CiAgICAgRVRleHRBbmNob3IgYW5jaG9yOwpAQCAtODgsOTEgKzE1Niw0MiBAQCBzdHJ1Y3Qg
U1ZHVGV4dENodW5rIHsKICAgICBWZWN0b3I8U1ZHSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2U+IGJv
eGVzOwogfTsKIAotc3RydWN0IFNWR1RleHRDaHVua1dhbGtlckJhc2UgewotICAgIHZpcnR1YWwg
flNWR1RleHRDaHVua1dhbGtlckJhc2UoKSB7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBvcGVyYXRv
cigpKFNWR0lubGluZVRleHRCb3gqIHRleHRCb3gsIGludCBzdGFydE9mZnNldCwgY29uc3QgQWZm
aW5lVHJhbnNmb3JtJiBjaHVua0N0bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yJiBzdGFydCwgY29uc3QgVmVjdG9yPFNWR0NoYXI+
OjppdGVyYXRvciYgZW5kKSA9IDA7Ci0KLSAgICAvLyBGb2xsb3dpbmdzIG1ldGhvZHMgYXJlIG9u
bHkgdXNlZCBmb3IgcGFpbnRpbmcgdGV4dCBjaHVua3MKLSAgICB2aXJ0dWFsIHZvaWQgc3RhcnQo
SW5saW5lQm94KikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBlbmQoSW5saW5lQm94KikgPSAwOwot
fTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgQ2FsbGJhY2tDbGFzcz4KLXN0cnVjdCBTVkdUZXh0Q2h1
bmtXYWxrZXIgOiBwdWJsaWMgU1ZHVGV4dENodW5rV2Fsa2VyQmFzZSB7Ci1wdWJsaWM6Ci0gICAg
dHlwZWRlZiB2b2lkIChDYWxsYmFja0NsYXNzOjoqU1ZHVGV4dENodW5rV2Fsa2VyQ2FsbGJhY2sp
KFNWR0lubGluZVRleHRCb3gqIHRleHRCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydE9mZnNldCwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgQWZmaW5lVHJhbnNmb3JtJiBjaHVua0N0bSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPFNWR0No
YXI+OjppdGVyYXRvciYgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxTVkdDaGFyPjo6aXRlcmF0
b3ImIGVuZCk7Ci0KLSAgICAvLyBUaGVzZSBjYWxsYmFja3MgYXJlIG9ubHkgdXNlZCBmb3IgcGFp
bnRpbmchCi0gICAgdHlwZWRlZiB2b2lkIChDYWxsYmFja0NsYXNzOjoqU1ZHVGV4dENodW5rU3Rh
cnRDYWxsYmFjaykoSW5saW5lQm94KiBib3gpOwotICAgIHR5cGVkZWYgdm9pZCAoQ2FsbGJhY2tD
bGFzczo6KlNWR1RleHRDaHVua0VuZENhbGxiYWNrKShJbmxpbmVCb3gqIGJveCk7Ci0KLSAgICBT
VkdUZXh0Q2h1bmtXYWxrZXIoQ2FsbGJhY2tDbGFzcyogb2JqZWN0LCAKLSAgICAgICAgICAgICAg
ICAgICAgICAgU1ZHVGV4dENodW5rV2Fsa2VyQ2FsbGJhY2sgd2Fsa2VyLAotICAgICAgICAgICAg
ICAgICAgICAgICBTVkdUZXh0Q2h1bmtTdGFydENhbGxiYWNrIHN0YXJ0ID0gMCwKLSAgICAgICAg
ICAgICAgICAgICAgICAgU1ZHVGV4dENodW5rRW5kQ2FsbGJhY2sgZW5kID0gMCkKLSAgICAgICAg
OiBtX29iamVjdChvYmplY3QpCi0gICAgICAgICwgbV93YWxrZXJDYWxsYmFjayh3YWxrZXIpCi0g
ICAgICAgICwgbV9zdGFydENhbGxiYWNrKHN0YXJ0KQotICAgICAgICAsIG1fZW5kQ2FsbGJhY2so
ZW5kKQotICAgIHsKLSAgICAgICAgQVNTRVJUKG9iamVjdCk7Ci0gICAgICAgIEFTU0VSVCh3YWxr
ZXIpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBvcGVyYXRvcigpKFNWR0lubGluZVRleHRC
b3gqIHRleHRCb3gsIGludCBzdGFydE9mZnNldCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBjaHVu
a0N0bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8U1ZHQ2hhcj46
Oml0ZXJhdG9yJiBzdGFydCwgY29uc3QgVmVjdG9yPFNWR0NoYXI+OjppdGVyYXRvciYgZW5kKQor
c3RydWN0IFNWR1RleHRDaHVua0xheW91dEluZm8geworICAgIFNWR1RleHRDaHVua0xheW91dElu
Zm8oKQorICAgICAgICA6IG1fYXNzaWduQ2h1bmtQcm9wZXJ0aWVzKHRydWUpCisgICAgICAgICwg
bV9oYW5kbGluZ1RleHRQYXRoKGZhbHNlKQorICAgICAgICAsIG1fY2hhcnNJdCgwKQorICAgICAg
ICAsIG1fY2hhcnNCZWdpbigwKQorICAgICAgICAsIG1fY2hhcnNFbmQoMCkKKyAgICAgICAgLCBt
X2NodW5rKDApCiAgICAgewotICAgICAgICAoKm1fb2JqZWN0LiptX3dhbGtlckNhbGxiYWNrKSh0
ZXh0Qm94LCBzdGFydE9mZnNldCwgY2h1bmtDdG0sIHN0YXJ0LCBlbmQpOwogICAgIH0KIAotICAg
IC8vIEZvbGxvd2luZ3MgbWV0aG9kcyBhcmUgb25seSB1c2VkIGZvciBwYWludGluZyB0ZXh0IGNo
dW5rcwotICAgIHZpcnR1YWwgdm9pZCBzdGFydChJbmxpbmVCb3gqIGJveCkKLSAgICB7Ci0gICAg
ICAgIGlmIChtX3N0YXJ0Q2FsbGJhY2spCi0gICAgICAgICAgICAoKm1fb2JqZWN0LiptX3N0YXJ0
Q2FsbGJhY2spKGJveCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOwotICAgIH0KKyAgICBjb25zdCBWZWN0b3I8U1ZHVGV4dENodW5rPiYgdGV4dENodW5r
cygpIGNvbnN0IHsgcmV0dXJuIG1fc3ZnVGV4dENodW5rczsgfQogCi0gICAgdmlydHVhbCB2b2lk
IGVuZChJbmxpbmVCb3gqIGJveCkKLSAgICB7Ci0gICAgICAgIGlmIChtX2VuZENhbGxiYWNrKQot
ICAgICAgICAgICAgKCptX29iamVjdC4qbV9lbmRDYWxsYmFjaykoYm94KTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQorICAgIHZvaWQgYnVp
bGRUZXh0Q2h1bmtzKFZlY3RvcjxTVkdDaGFyPjo6aXRlcmF0b3IgY2hhcnNCZWdpbiwgVmVjdG9y
PFNWR0NoYXI+OjppdGVyYXRvciBjaGFyc0VuZCwgSW5saW5lRmxvd0JveCogc3RhcnQpOworICAg
IHZvaWQgbGF5b3V0VGV4dENodW5rcygpOwogCiBwcml2YXRlOgotICAgIENhbGxiYWNrQ2xhc3Mq
IG1fb2JqZWN0OwotICAgIFNWR1RleHRDaHVua1dhbGtlckNhbGxiYWNrIG1fd2Fsa2VyQ2FsbGJh
Y2s7Ci0gICAgU1ZHVGV4dENodW5rU3RhcnRDYWxsYmFjayBtX3N0YXJ0Q2FsbGJhY2s7Ci0gICAg
U1ZHVGV4dENodW5rRW5kQ2FsbGJhY2sgbV9lbmRDYWxsYmFjazsKLX07Ci0KLXN0cnVjdCBTVkdU
ZXh0Q2h1bmtMYXlvdXRJbmZvIHsKLSAgICBTVkdUZXh0Q2h1bmtMYXlvdXRJbmZvKFZlY3RvcjxT
VkdUZXh0Q2h1bms+JiB0ZXh0Q2h1bmtzKQotICAgICAgICA6IGFzc2lnbkNodW5rUHJvcGVydGll
cyh0cnVlKQotICAgICAgICAsIGhhbmRsaW5nVGV4dFBhdGgoZmFsc2UpCi0gICAgICAgICwgc3Zn
VGV4dENodW5rcyh0ZXh0Q2h1bmtzKQotICAgICAgICAsIGl0KDApCi0gICAgewotICAgIH0KKyAg
ICB2b2lkIHN0YXJ0VGV4dENodW5rKCk7CisgICAgdm9pZCBjbG9zZVRleHRDaHVuaygpOworICAg
IHZvaWQgcmVjdXJzaXZlQnVpbGRUZXh0Q2h1bmtzKElubGluZUZsb3dCb3gqIHN0YXJ0KTsKKwor
ICAgIGJvb2wgbV9hc3NpZ25DaHVua1Byb3BlcnRpZXMgOiAxOworICAgIGJvb2wgbV9oYW5kbGlu
Z1RleHRQYXRoIDogMTsKKworICAgIFZlY3RvcjxTVkdDaGFyPjo6aXRlcmF0b3IgbV9jaGFyc0l0
OworICAgIFZlY3RvcjxTVkdDaGFyPjo6aXRlcmF0b3IgbV9jaGFyc0JlZ2luOworICAgIFZlY3Rv
cjxTVkdDaGFyPjo6aXRlcmF0b3IgbV9jaGFyc0VuZDsKIAotICAgIGJvb2wgYXNzaWduQ2h1bmtQ
cm9wZXJ0aWVzIDogMTsKLSAgICBib29sIGhhbmRsaW5nVGV4dFBhdGggOiAxOwotCi0gICAgVmVj
dG9yPFNWR1RleHRDaHVuaz4mIHN2Z1RleHRDaHVua3M7Ci0gICAgVmVjdG9yPFNWR0NoYXI+Ojpp
dGVyYXRvciBpdDsKLQotICAgIFNWR1RleHRDaHVuayBjaHVuazsKKyAgICBWZWN0b3I8U1ZHVGV4
dENodW5rPiBtX3N2Z1RleHRDaHVua3M7CisgICAgU1ZHVGV4dENodW5rIG1fY2h1bms7CiB9Owog
CisvLyBIZWxwZXIgZnVuY3Rpb25zCitmbG9hdCBjYWxjdWxhdGVUZXh0QW5jaG9yU2hpZnRGb3JU
ZXh0Q2h1bmsoU1ZHVGV4dENodW5rJiwgRVRleHRBbmNob3IpOworZmxvYXQgY2FsY3VsYXRlVGV4
dExlbmd0aENvcnJlY3Rpb25Gb3JUZXh0Q2h1bmsoU1ZHVGV4dENodW5rJiwgRUxlbmd0aEFkanVz
dCwgZmxvYXQmIGNvbXB1dGVkTGVuZ3RoKTsKKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAj
ZW5kaWYgLy8gRU5BQkxFKFNWRykKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1NWR1RleHRMYXlv
dXRVdGlsaXRpZXMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1NWR1RleHRM
YXlvdXRVdGlsaXRpZXMuY3BwCShyZXZpc2lvbiA2MTM4MykKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L1NWR1RleHRMYXlvdXRVdGlsaXRpZXMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNzIsNDAgKzI3
Miw0NSBAQCBmbG9hdCBjdW1tdWxhdGVkV2lkdGhPZklubGluZUJveENoYXJhY3RlCiB7CiAgICAg
QVNTRVJUKCFyYW5nZS5pc09wZW4oKSk7CiAgICAgQVNTRVJUKHJhbmdlLmlzQ2xvc2VkKCkpOwot
ICAgIEFTU0VSVChyYW5nZS5ib3gtPmlzSW5saW5lVGV4dEJveCgpKTsKKyAgICBBU1NFUlQocmFu
Z2UuYm94LT5pc1NWR0lubGluZVRleHRCb3goKSk7CiAKICAgICBJbmxpbmVUZXh0Qm94KiB0ZXh0
Qm94ID0gc3RhdGljX2Nhc3Q8SW5saW5lVGV4dEJveCo+KHJhbmdlLmJveCk7CiAgICAgUmVuZGVy
VGV4dCogdGV4dCA9IHRleHRCb3gtPnRleHRSZW5kZXJlcigpOwogICAgIFJlbmRlclN0eWxlKiBz
dHlsZSA9IHRleHQtPnN0eWxlKCk7Ci0KLSAgICByZXR1cm4gc3R5bGUtPmZvbnQoKS5mbG9hdFdp
ZHRoKHN2Z1RleHRSdW5Gb3JJbmxpbmVUZXh0Qm94KHRleHQtPmNoYXJhY3RlcnMoKSArIHRleHRC
b3gtPnN0YXJ0KCkgKyByYW5nZS5zdGFydE9mZnNldCwgcmFuZ2UuZW5kT2Zmc2V0IC0gcmFuZ2Uu
c3RhcnRPZmZzZXQsIHN0eWxlLCB0ZXh0Qm94LCAwKSk7CisgICAgcmV0dXJuIHN0eWxlLT5mb250
KCkuZmxvYXRXaWR0aChzdmdUZXh0UnVuRm9ySW5saW5lVGV4dEJveCh0ZXh0LT5jaGFyYWN0ZXJz
KCkgKyB0ZXh0Qm94LT5zdGFydCgpICsgcmFuZ2Uuc3RhcnRPZmZzZXQsIHJhbmdlLmVuZE9mZnNl
dCAtIHJhbmdlLnN0YXJ0T2Zmc2V0LCBzdHlsZSwgdGV4dEJveCkpOwogfQogCiBmbG9hdCBjdW1t
dWxhdGVkSGVpZ2h0T2ZJbmxpbmVCb3hDaGFyYWN0ZXJSYW5nZShTVkdJbmxpbmVCb3hDaGFyYWN0
ZXJSYW5nZSYgcmFuZ2UpCiB7CiAgICAgQVNTRVJUKCFyYW5nZS5pc09wZW4oKSk7CiAgICAgQVNT
RVJUKHJhbmdlLmlzQ2xvc2VkKCkpOwotICAgIEFTU0VSVChyYW5nZS5ib3gtPmlzSW5saW5lVGV4
dEJveCgpKTsKKyAgICBBU1NFUlQocmFuZ2UuYm94LT5pc1NWR0lubGluZVRleHRCb3goKSk7CiAK
ICAgICBJbmxpbmVUZXh0Qm94KiB0ZXh0Qm94ID0gc3RhdGljX2Nhc3Q8SW5saW5lVGV4dEJveCo+
KHJhbmdlLmJveCk7Ci0gICAgUmVuZGVyVGV4dCogdGV4dCA9IHRleHRCb3gtPnRleHRSZW5kZXJl
cigpOwotICAgIGNvbnN0IEZvbnQmIGZvbnQgPSB0ZXh0LT5zdHlsZSgpLT5mb250KCk7Ci0KLSAg
ICByZXR1cm4gKHJhbmdlLmVuZE9mZnNldCAtIHJhbmdlLnN0YXJ0T2Zmc2V0KSAqIChmb250LmFz
Y2VudCgpICsgZm9udC5kZXNjZW50KCkpOworICAgIHJldHVybiAocmFuZ2UuZW5kT2Zmc2V0IC0g
cmFuZ2Uuc3RhcnRPZmZzZXQpICogdGV4dEJveC0+dGV4dFJlbmRlcmVyKCktPnN0eWxlKCktPmZv
bnQoKS5oZWlnaHQoKTsKIH0KIAotVGV4dFJ1biBzdmdUZXh0UnVuRm9ySW5saW5lVGV4dEJveChj
b25zdCBVQ2hhciogY2hhcmFjdGVycywgaW50IGxlbmd0aCwgY29uc3QgUmVuZGVyU3R5bGUqIHN0
eWxlLCBjb25zdCBJbmxpbmVUZXh0Qm94KiB0ZXh0Qm94LCBmbG9hdCB4UG9zaXRpb24pCitUZXh0
UnVuIHN2Z1RleHRSdW5Gb3JJbmxpbmVUZXh0Qm94KGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBp
bnQgbGVuZ3RoLCBjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IElubGluZVRleHRCb3gq
IHRleHRCb3gpCiB7CiAgICAgQVNTRVJUKHRleHRCb3gpOwogICAgIEFTU0VSVChzdHlsZSk7CiAK
LSAgICBUZXh0UnVuIHJ1bihjaGFyYWN0ZXJzLCBsZW5ndGgsIGZhbHNlLCBzdGF0aWNfY2FzdDxp
bnQ+KHhQb3NpdGlvbiksIHRleHRCb3gtPnRvQWRkKCksIHRleHRCb3gtPmRpcmVjdGlvbigpID09
IFJUTCwgdGV4dEJveC0+bV9kaXJPdmVycmlkZSB8fCBzdHlsZS0+dmlzdWFsbHlPcmRlcmVkKCkp
OworICAgIFRleHRSdW4gcnVuKGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICAsIGxlbmd0aAor
ICAgICAgICAgICAgICAgICwgZmFsc2UgLyogYWxsb3dUYWJzICovCisgICAgICAgICAgICAgICAg
LCAwIC8qIHhQb3MsIG9ubHkgcmVsZXZhbnQgd2l0aCBhbGxvd1RhYnM9dHJ1ZSAqLworICAgICAg
ICAgICAgICAgICwgMCAvKiBwYWRkaW5nLCBvbmx5IHJlbGV2YW50IGZvciBqdXN0aWZpZWQgdGV4
dCwgbm90IHJlbGV2YW50IGZvciBTVkcgKi8KKyAgICAgICAgICAgICAgICAsIHRleHRCb3gtPmRp
cmVjdGlvbigpID09IFJUTAorICAgICAgICAgICAgICAgICwgdGV4dEJveC0+bV9kaXJPdmVycmlk
ZSB8fCBzdHlsZS0+dmlzdWFsbHlPcmRlcmVkKCkgLyogZGlyZWN0aW9uYWxPdmVycmlkZSAqLyk7
CiAKICNpZiBFTkFCTEUoU1ZHX0ZPTlRTKQogICAgIHJ1bi5zZXRSZWZlcmVuY2luZ1JlbmRlck9i
amVjdCh0ZXh0Qm94LT50ZXh0UmVuZGVyZXIoKS0+cGFyZW50KCkpOwogI2VuZGlmCiAKLSAgICAv
LyBXZSBoYW5kbGUgbGV0dGVyICYgd29yZCBzcGFjaW5nIG91cnNlbHZlcworICAgIC8vIERpc2Fi
bGUgYW55IHdvcmQvY2hhcmFjdGVyIHJvdW5kaW5nLgorICAgIHJ1bi5kaXNhYmxlUm91bmRpbmdI
YWNrcygpOworCisgICAgLy8gV2UgaGFuZGxlIGxldHRlciAmIHdvcmQgc3BhY2luZyBvdXJzZWx2
ZXMuCiAgICAgcnVuLmRpc2FibGVTcGFjaW5nKCk7CiAgICAgcmV0dXJuIHJ1bjsKIH0KSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL1NWR1RleHRMYXlvdXRVdGlsaXRpZXMuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3JlbmRlcmluZy9TVkdUZXh0TGF5b3V0VXRpbGl0aWVzLmgJKHJldmlzaW9uIDYx
MzgzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvU1ZHVGV4dExheW91dFV0aWxpdGllcy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMiw3ICszMiw2IEBAIGNsYXNzIEZvbnQ7CiBjbGFzcyBJbmxpbmVUZXh0
Qm94OwogY2xhc3MgUmVuZGVyT2JqZWN0OwogY2xhc3MgUmVuZGVyU3R5bGU7Ci1jbGFzcyBSZW5k
ZXJTVkdSZXNvdXJjZTsKIGNsYXNzIFNWR1JlbmRlclN0eWxlOwogY2xhc3MgVGV4dFJ1bjsKIApA
QCAtNDAsMjYgKzM5LDYgQEAgc3RydWN0IFNWR0NoYXI7CiBzdHJ1Y3QgU1ZHQ2hhcmFjdGVyTGF5
b3V0SW5mbzsKIHN0cnVjdCBTVkdJbmxpbmVCb3hDaGFyYWN0ZXJSYW5nZTsKIAotZW51bSBTVkdU
ZXh0UGFpbnRTdWJwaGFzZSB7Ci0gICAgU1ZHVGV4dFBhaW50U3VicGhhc2VCYWNrZ3JvdW5kLAot
ICAgIFNWR1RleHRQYWludFN1YnBoYXNlR2x5cGhGaWxsLAotICAgIFNWR1RleHRQYWludFN1YnBo
YXNlR2x5cGhGaWxsU2VsZWN0aW9uLAotICAgIFNWR1RleHRQYWludFN1YnBoYXNlR2x5cGhTdHJv
a2UsCi0gICAgU1ZHVGV4dFBhaW50U3VicGhhc2VHbHlwaFN0cm9rZVNlbGVjdGlvbiwKLSAgICBT
VkdUZXh0UGFpbnRTdWJwaGFzZUZvcmVncm91bmQKLX07Ci0KLXN0cnVjdCBTVkdUZXh0UGFpbnRJ
bmZvIHsKLSAgICBTVkdUZXh0UGFpbnRJbmZvKCkKLSAgICAgICAgOiBhY3RpdmVQYWludGluZ1Jl
c291cmNlKDApCi0gICAgICAgICwgc3VicGhhc2UoU1ZHVGV4dFBhaW50U3VicGhhc2VCYWNrZ3Jv
dW5kKQotICAgIHsKLSAgICB9Ci0KLSAgICBSZW5kZXJTVkdSZXNvdXJjZSogYWN0aXZlUGFpbnRp
bmdSZXNvdXJjZTsKLSAgICBTVkdUZXh0UGFpbnRTdWJwaGFzZSBzdWJwaGFzZTsKLX07Ci0KIHN0
cnVjdCBTVkdMYXN0R2x5cGhJbmZvIHsKICAgICBTVkdMYXN0R2x5cGhJbmZvKCkKICAgICAgICAg
OiBpc1ZhbGlkKGZhbHNlKQpAQCAtNzksNyArNTgsNyBAQCBmbG9hdCBhcHBseUdseXBoQWR2YW5j
ZUFuZFNoaWZ0UmVzcGVjdGluCiBGbG9hdFBvaW50IHRvcExlZnRQb3NpdGlvbk9mQ2hhcmFjdGVy
UmFuZ2UoVmVjdG9yPFNWR0NoYXI+OjppdGVyYXRvciBzdGFydCwgVmVjdG9yPFNWR0NoYXI+Ojpp
dGVyYXRvciBlbmQpOwogZmxvYXQgY3VtbXVsYXRlZFdpZHRoT2ZJbmxpbmVCb3hDaGFyYWN0ZXJS
YW5nZShTVkdJbmxpbmVCb3hDaGFyYWN0ZXJSYW5nZSYpOwogZmxvYXQgY3VtbXVsYXRlZEhlaWdo
dE9mSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2UoU1ZHSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2UmKTsK
LVRleHRSdW4gc3ZnVGV4dFJ1bkZvcklubGluZVRleHRCb3goY29uc3QgVUNoYXIqLCBpbnQgbGVu
Z3RoLCBjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IElubGluZVRleHRCb3gqLCBmbG9hdCB4UG9z
KTsKK1RleHRSdW4gc3ZnVGV4dFJ1bkZvcklubGluZVRleHRCb3goY29uc3QgVUNoYXIqLCBpbnQg
bGVuZ3RoLCBjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IElubGluZVRleHRCb3gqKTsKIAogZmxv
YXQgY2FsY3VsYXRlQ1NTS2VybmluZyhjb25zdCBSZW5kZXJTdHlsZSopOwogYm9vbCBhcHBseVNW
R0tlcm5pbmcoU1ZHQ2hhcmFjdGVyTGF5b3V0SW5mbyYsIGNvbnN0IFJlbmRlclN0eWxlKiwgU1ZH
TGFzdEdseXBoSW5mbyYsIGNvbnN0IFN0cmluZyYgdW5pY29kZVN0cmluZywgY29uc3QgU3RyaW5n
JiBnbHlwaE5hbWUsIGJvb2wgaXNWZXJ0aWNhbFRleHQpOwpJbmRleDogV2ViQ29yZS9yZW5kZXJp
bmcvU1ZHVGV4dFF1ZXJ5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9TVkdU
ZXh0UXVlcnkuY3BwCShyZXZpc2lvbiA2MTM4MykKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1NWR1Rl
eHRRdWVyeS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIwLDggKzIwLDcgQEAKICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJTVkdUZXh0UXVlcnkuaCIKIAotLy8gRklYTUU6IFRoaXMgY29k
ZSBpcyBjdXJyZW50bHkgZGVhY3RpdmF0ZWQsIHVudGlsIHRoZSBTVkcgVGV4dCByZXdyaXRlIHBh
dGNoIGxhbmRzLgotI2lmIEVOQUJMRShTVkcpICYmIDAKKyNpZiBFTkFCTEUoU1ZHKQogI2luY2x1
ZGUgIkZsb2F0Q29udmVyc2lvbi5oIgogI2luY2x1ZGUgIklubGluZUZsb3dCb3guaCIKICNpbmNs
dWRlICJSZW5kZXJCbG9jay5oIgpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvU1ZHVGV4dFF1ZXJ5
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvU1ZHVGV4dFF1ZXJ5LmgJKHJldmlz
aW9uIDYxMzgzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvU1ZHVGV4dFF1ZXJ5LmgJKHdvcmtpbmcg
Y29weSkKQEAgLTIwLDggKzIwLDcgQEAKICNpZm5kZWYgU1ZHVGV4dFF1ZXJ5X2gKICNkZWZpbmUg
U1ZHVGV4dFF1ZXJ5X2gKIAotLy8gRklYTUU6IFRoaXMgY29kZSBpcyBjdXJyZW50bHkgZGVhY3Rp
dmF0ZWQsIHVudGlsIHRoZSBTVkcgVGV4dCByZXdyaXRlIHBhdGNoIGxhbmRzLgotI2lmIEVOQUJM
RShTVkcpICYmIDAKKyNpZiBFTkFCTEUoU1ZHKQogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2lu
Y2x1ZGUgPHd0Zi9WZWN0b3IuaD4KIApJbmRleDogV2ViQ29yZS9zdmcvU1ZHU3R5bGVkRWxlbWVu
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdmcvU1ZHU3R5bGVkRWxlbWVudC5jcHAJKHJl
dmlzaW9uIDYxMzgzKQorKysgV2ViQ29yZS9zdmcvU1ZHU3R5bGVkRWxlbWVudC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTIyOCwxMSArMjI4LDYgQEAgdm9pZCBTVkdTdHlsZWRFbGVtZW50OjpwYXJz
ZU1hcHBlZEF0dHJpYgogCiBib29sIFNWR1N0eWxlZEVsZW1lbnQ6OmlzS25vd25BdHRyaWJ1dGUo
Y29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUpCiB7Ci0gICAgLy8gUmVjb2duaXplIGFsbCBz
dHlsZSByZWxhdGVkIFNWRyBDU1MgcHJvcGVydGllcwotICAgIGludCBwcm9wSWQgPSBTVkdTdHls
ZWRFbGVtZW50Ojpjc3NQcm9wZXJ0eUlkRm9yU1ZHQXR0cmlidXRlTmFtZShhdHRyTmFtZSk7Ci0g
ICAgaWYgKHByb3BJZCA+IDApCi0gICAgICAgIHJldHVybiB0cnVlOwotCiAgICAgcmV0dXJuIGlz
SWRBdHRyaWJ1dGVOYW1lKGF0dHJOYW1lKSB8fCBhdHRyTmFtZSA9PSBIVE1MTmFtZXM6OnN0eWxl
QXR0cjsgCiB9CiAKSW5kZXg6IFdlYkNvcmUvc3ZnL1NWR1RleHRDb250ZW50RWxlbWVudC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9zdmcvU1ZHVGV4dENvbnRlbnRFbGVtZW50LmNwcAkocmV2
aXNpb24gNjEzODMpCisrKyBXZWJDb3JlL3N2Zy9TVkdUZXh0Q29udGVudEVsZW1lbnQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yMywyMyArMjMsMTIgQEAKICNpZiBFTkFCTEUoU1ZHKQogI2luY2x1
ZGUgIlNWR1RleHRDb250ZW50RWxlbWVudC5oIgogCi0jaW5jbHVkZSAiQXR0cmlidXRlLmgiCiAj
aW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgogI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMu
aCIKLSNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCi0jaW5jbHVkZSAiRmxvYXRQb2ludC5oIgot
I2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiUG9z
aXRpb24uaCIKLSNpbmNsdWRlICJSZW5kZXJTVkdUZXh0LmgiCi0jaW5jbHVkZSAiU1ZHQ2hhcmFj
dGVyRGF0YS5oIgotI2luY2x1ZGUgIlNWR0lubGluZVRleHRCb3guaCIKLSNpbmNsdWRlICJTVkdM
ZW5ndGguaCIKLSNpbmNsdWRlICJTVkdOYW1lcy5oIgotI2luY2x1ZGUgIlNWR1Jvb3RJbmxpbmVC
b3guaCIKKyNpbmNsdWRlICJTVkdUZXh0UXVlcnkuaCIKICNpbmNsdWRlICJTZWxlY3Rpb25Db250
cm9sbGVyLmgiCiAjaW5jbHVkZSAiWE1MTmFtZXMuaCIKLSNpbmNsdWRlIDx3dGYvU3RkTGliRXh0
cmFzLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNTcsMzMwICs0NiwxNiBAQCBTVkdU
ZXh0Q29udGVudEVsZW1lbnQ6On5TVkdUZXh0Q29udGVudEVsCiB7CiB9CiAKLXN0YXRpYyBpbmxp
bmUgZmxvYXQgY3VtdWxhdGl2ZUNoYXJhY3RlclJhbmdlTGVuZ3RoKGNvbnN0IFZlY3RvcjxTVkdD
aGFyPjo6aXRlcmF0b3ImIHN0YXJ0LCBjb25zdCBWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yJiBl
bmQsIFNWR0lubGluZVRleHRCb3gqIHRleHRCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRPZmZzZXQsIGxvbmcgc3RhcnRQb3Np
dGlvbiwgbG9uZyBsZW5ndGgsIGJvb2wgaXNWZXJ0aWNhbFRleHQsIGxvbmcmIGF0Q2hhcmFjdGVy
KQotewotICAgIGlmICghbGVuZ3RoKQotICAgICAgICByZXR1cm4gMC4wZjsKLQotICAgIGZsb2F0
IHRleHRMZW5ndGggPSAwLjBmOwotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IHRleHRCb3gtPnRl
eHRSZW5kZXJlcigpLT5zdHlsZSgpOwotCi0gICAgYm9vbCB1c2VzRnVsbFJhbmdlID0gKHN0YXJ0
UG9zaXRpb24gPT0gLTEgJiYgbGVuZ3RoID09IC0xKTsKLQotICAgIGZvciAoVmVjdG9yPFNWR0No
YXI+OjppdGVyYXRvciBpdCA9IHN0YXJ0OyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgaWYg
KHVzZXNGdWxsUmFuZ2UgfHwgKGF0Q2hhcmFjdGVyID49IHN0YXJ0UG9zaXRpb24gJiYgYXRDaGFy
YWN0ZXIgPD0gc3RhcnRQb3NpdGlvbiArIGxlbmd0aCkpIHsKLSAgICAgICAgICAgIHVuc2lnbmVk
IGludCBuZXdPZmZzZXQgPSB0ZXh0Qm94LT5zdGFydCgpICsgKGl0IC0gc3RhcnQpICsgc3RhcnRP
ZmZzZXQ7Ci0KLSAgICAgICAgICAgIC8vIFRha2UgUlRMIHRleHQgaW50byBhY2NvdW50IGFuZCBw
aWNrIHJpZ2h0IGdseXBoIHdpZHRoL2hlaWdodC4KLSAgICAgICAgICAgIGlmICh0ZXh0Qm94LT5k
aXJlY3Rpb24oKSA9PSBSVEwpCi0gICAgICAgICAgICAgICAgbmV3T2Zmc2V0ID0gdGV4dEJveC0+
c3RhcnQoKSArIHRleHRCb3gtPmVuZCgpIC0gbmV3T2Zmc2V0OwotCi0gICAgICAgICAgICAvLyBG
SVhNRTogZG9lcyB0aGlzIGhhbmRsZSBtdWx0aWNoYXIgZ2x5cGhzIG9rPyBub3Qgc3VyZQotICAg
ICAgICAgICAgaW50IGNoYXJzQ29uc3VtZWQgPSAwOwotICAgICAgICAgICAgU3RyaW5nIGdseXBo
TmFtZTsKLSAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsVGV4dCkKLSAgICAgICAgICAgICAgICB0
ZXh0TGVuZ3RoICs9IHRleHRCb3gtPmNhbGN1bGF0ZUdseXBoSGVpZ2h0KHN0eWxlLCBuZXdPZmZz
ZXQsIDApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRleHRMZW5ndGggKz0g
dGV4dEJveC0+Y2FsY3VsYXRlR2x5cGhXaWR0aChzdHlsZSwgbmV3T2Zmc2V0LCAwLCBjaGFyc0Nv
bnN1bWVkLCBnbHlwaE5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF1c2VzRnVsbFJh
bmdlKSB7Ci0gICAgICAgICAgICBpZiAoYXRDaGFyYWN0ZXIgPT0gc3RhcnRQb3NpdGlvbiArIGxl
bmd0aCAtIDEpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGF0Q2hhcmFj
dGVyKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdGV4dExlbmd0aDsKLX0KLQot
Ly8gSGVscGVyIGNsYXNzIGZvciBxdWVyeWluZyBjZXJ0YWluIGdseXBoIGluZm9ybWF0aW9uCi1z
dHJ1Y3QgU1ZHSW5saW5lVGV4dEJveFF1ZXJ5V2Fsa2VyIHsKLSAgICB0eXBlZGVmIGVudW0gewot
ICAgICAgICBOdW1iZXJPZkNoYXJhY3RlcnMsCi0gICAgICAgIFRleHRMZW5ndGgsCi0gICAgICAg
IFN1YlN0cmluZ0xlbmd0aCwKLSAgICAgICAgU3RhcnRQb3NpdGlvbiwKLSAgICAgICAgRW5kUG9z
aXRpb24sCi0gICAgICAgIEV4dGVudCwKLSAgICAgICAgUm90YXRpb24sCi0gICAgICAgIENoYXJh
Y3Rlck51bWJlckF0UG9zaXRpb24KLSAgICB9IFF1ZXJ5TW9kZTsKLQotICAgIFNWR0lubGluZVRl
eHRCb3hRdWVyeVdhbGtlcihjb25zdCBTVkdUZXh0Q29udGVudEVsZW1lbnQqIHJlZmVyZW5jZSwg
UXVlcnlNb2RlIG1vZGUpCi0gICAgICAgIDogbV9yZWZlcmVuY2UocmVmZXJlbmNlKQotICAgICAg
ICAsIG1fbW9kZShtb2RlKQotICAgICAgICAsIG1fcXVlcnlTdGFydFBvc2l0aW9uKDApCi0gICAg
ICAgICwgbV9xdWVyeUxlbmd0aCgwKQotICAgICAgICAsIG1fcXVlcnlQb2ludElucHV0KCkKLSAg
ICAgICAgLCBtX3F1ZXJ5TG9uZ1Jlc3VsdCgwKQotICAgICAgICAsIG1fcXVlcnlGbG9hdFJlc3Vs
dCgwLjBmKQotICAgICAgICAsIG1fcXVlcnlQb2ludFJlc3VsdCgpCi0gICAgICAgICwgbV9xdWVy
eVJlY3RSZXN1bHQoKQotICAgICAgICAsIG1fc3RvcFByb2Nlc3NpbmcodHJ1ZSkgICAgCi0gICAg
ICAgICwgbV9hdENoYXJhY3RlcigwKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIGNodW5rUG9y
dGlvbkNhbGxiYWNrKFNWR0lubGluZVRleHRCb3gqIHRleHRCb3gsIGludCBzdGFydE9mZnNldCwg
Y29uc3QgQWZmaW5lVHJhbnNmb3JtJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IFZlY3RvcjxTVkdDaGFyPjo6aXRlcmF0b3ImIHN0YXJ0LCBjb25zdCBWZWN0b3I8U1ZHQ2hh
cj46Oml0ZXJhdG9yJiBlbmQpCi0gICAgewotICAgICAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0
ZXh0Qm94LT50ZXh0UmVuZGVyZXIoKS0+c3R5bGUoKTsKLSAgICAgICAgYm9vbCBpc1ZlcnRpY2Fs
VGV4dCA9IHN0eWxlLT5zdmdTdHlsZSgpLT53cml0aW5nTW9kZSgpID09IFdNX1RCUkwgfHwgc3R5
bGUtPnN2Z1N0eWxlKCktPndyaXRpbmdNb2RlKCkgPT0gV01fVEI7Ci0KLSAgICAgICAgc3dpdGNo
IChtX21vZGUpIHsKLSAgICAgICAgY2FzZSBOdW1iZXJPZkNoYXJhY3RlcnM6Ci0gICAgICAgIHsg
ICAgCi0gICAgICAgICAgICBtX3F1ZXJ5TG9uZ1Jlc3VsdCArPSAoZW5kIC0gc3RhcnQpOwotICAg
ICAgICAgICAgbV9zdG9wUHJvY2Vzc2luZyA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICB9Ci0gICAgICAgIGNhc2UgVGV4dExlbmd0aDoKLSAgICAgICAgewotICAgICAgICAg
ICAgZmxvYXQgdGV4dExlbmd0aCA9IGN1bXVsYXRpdmVDaGFyYWN0ZXJSYW5nZUxlbmd0aChzdGFy
dCwgZW5kLCB0ZXh0Qm94LCBzdGFydE9mZnNldCwgLTEsIC0xLCBpc1ZlcnRpY2FsVGV4dCwgbV9h
dENoYXJhY3Rlcik7Ci0KLSAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsVGV4dCkKLSAgICAgICAg
ICAgICAgICBtX3F1ZXJ5RmxvYXRSZXN1bHQgKz0gdGV4dExlbmd0aDsKLSAgICAgICAgICAgIGVs
c2UKLSAgICAgICAgICAgICAgICBtX3F1ZXJ5RmxvYXRSZXN1bHQgKz0gdGV4dExlbmd0aDsKLQot
ICAgICAgICAgICAgbV9zdG9wUHJvY2Vzc2luZyA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU3ViU3RyaW5nTGVuZ3RoOgotICAgICAgICB7Ci0g
ICAgICAgICAgICBsb25nIHN0YXJ0UG9zaXRpb24gPSBtX3F1ZXJ5U3RhcnRQb3NpdGlvbjsKLSAg
ICAgICAgICAgIGxvbmcgbGVuZ3RoID0gbV9xdWVyeUxlbmd0aDsKLQotICAgICAgICAgICAgZmxv
YXQgdGV4dExlbmd0aCA9IGN1bXVsYXRpdmVDaGFyYWN0ZXJSYW5nZUxlbmd0aChzdGFydCwgZW5k
LCB0ZXh0Qm94LCBzdGFydE9mZnNldCwgc3RhcnRQb3NpdGlvbiwgbGVuZ3RoLCBpc1ZlcnRpY2Fs
VGV4dCwgbV9hdENoYXJhY3Rlcik7Ci0KLSAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsVGV4dCkK
LSAgICAgICAgICAgICAgICBtX3F1ZXJ5RmxvYXRSZXN1bHQgKz0gdGV4dExlbmd0aDsKLSAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX3F1ZXJ5RmxvYXRSZXN1bHQgKz0gdGV4dExl
bmd0aDsKLQotICAgICAgICAgICAgaWYgKG1fYXRDaGFyYWN0ZXIgPT0gc3RhcnRQb3NpdGlvbiAr
IGxlbmd0aCkKLSAgICAgICAgICAgICAgICBtX3N0b3BQcm9jZXNzaW5nID0gdHJ1ZTsKLSAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX3N0b3BQcm9jZXNzaW5nID0gZmFsc2U7Ci0K
LSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFN0YXJ0UG9zaXRp
b246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoVmVjdG9yPFNWR0NoYXI+OjppdGVyYXRv
ciBpdCA9IHN0YXJ0OyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9h
dENoYXJhY3RlciA9PSBtX3F1ZXJ5U3RhcnRQb3NpdGlvbikgewotICAgICAgICAgICAgICAgICAg
ICBtX3F1ZXJ5UG9pbnRSZXN1bHQgPSBGbG9hdFBvaW50KGl0LT54LCBpdC0+eSk7Ci0gICAgICAg
ICAgICAgICAgICAgIG1fc3RvcFByb2Nlc3NpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbV9hdENoYXJh
Y3RlcisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtX3N0b3BQcm9jZXNzaW5nID0g
ZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBFbmRQ
b3NpdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChWZWN0b3I8U1ZHQ2hhcj46Oml0
ZXJhdG9yIGl0ID0gc3RhcnQ7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgICAgIGlm
IChtX2F0Q2hhcmFjdGVyID09IG1fcXVlcnlTdGFydFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIHVuc2lnbmVkIGludCBuZXdPZmZzZXQgPSB0ZXh0Qm94LT5zdGFydCgpICsgKGl0IC0g
c3RhcnQpICsgc3RhcnRPZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGFrZSBSVEwg
dGV4dCBpbnRvIGFjY291bnQgYW5kIHBpY2sgcmlnaHQgZ2x5cGggd2lkdGgvaGVpZ2h0LgotICAg
ICAgICAgICAgICAgICAgICBpZiAodGV4dEJveC0+ZGlyZWN0aW9uKCkgPT0gUlRMKQotICAgICAg
ICAgICAgICAgICAgICAgICAgbmV3T2Zmc2V0ID0gdGV4dEJveC0+c3RhcnQoKSArIHRleHRCb3gt
PmVuZCgpIC0gbmV3T2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgIGludCBjaGFyc0NvbnN1
bWVkOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ2x5cGhOYW1lOwotICAgICAgICAgICAg
ICAgICAgICAvLyBjYWxjdWxhdGVHbHlwaHtIZWlnaHQsV2lkdGh9IHdpbGwgY29uc3VtZSBhdCBs
ZWFzdCBvbmUgY2hhcmFjdGVyLiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhdmFp
bGFibGUKLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlbSBiZXlvbmQgdGhhdCBmaXJzdCBv
bmUuCi0gICAgICAgICAgICAgICAgICAgIGludCBleHRyYUNoYXJhY3RlcnNBdmFpbGFibGUgPSBl
bmQgLSBpdCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsVGV4dCkKLSAg
ICAgICAgICAgICAgICAgICAgICAgIG1fcXVlcnlQb2ludFJlc3VsdC5tb3ZlKGl0LT54LCBpdC0+
eSArIHRleHRCb3gtPmNhbGN1bGF0ZUdseXBoSGVpZ2h0KHN0eWxlLCBuZXdPZmZzZXQsIGV4dHJh
Q2hhcmFjdGVyc0F2YWlsYWJsZSkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgICAgICAgICBtX3F1ZXJ5UG9pbnRSZXN1bHQubW92ZShpdC0+eCArIHRleHRCb3gt
PmNhbGN1bGF0ZUdseXBoV2lkdGgoc3R5bGUsIG5ld09mZnNldCwgZXh0cmFDaGFyYWN0ZXJzQXZh
aWxhYmxlLCBjaGFyc0NvbnN1bWVkLCBnbHlwaE5hbWUpLCBpdC0+eSk7Ci0KLSAgICAgICAgICAg
ICAgICAgICAgbV9zdG9wUHJvY2Vzc2luZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtX2F0Q2hhcmFjdGVy
Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1fc3RvcFByb2Nlc3NpbmcgPSBmYWxz
ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEV4dGVudDoK
LSAgICAgICAgewotICAgICAgICAgICAgZm9yIChWZWN0b3I8U1ZHQ2hhcj46Oml0ZXJhdG9yIGl0
ID0gc3RhcnQ7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgICAgIGlmIChtX2F0Q2hh
cmFjdGVyID09IG1fcXVlcnlTdGFydFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVu
c2lnbmVkIGludCBuZXdPZmZzZXQgPSB0ZXh0Qm94LT5zdGFydCgpICsgKGl0IC0gc3RhcnQpICsg
c3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIG1fcXVlcnlSZWN0UmVzdWx0ID0gdGV4
dEJveC0+Y2FsY3VsYXRlR2x5cGhCb3VuZGFyaWVzKHN0eWxlLCBuZXdPZmZzZXQsICppdCk7Ci0g
ICAgICAgICAgICAgICAgICAgIG1fc3RvcFByb2Nlc3NpbmcgPSB0cnVlOwotICAgICAgICAgICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbV9h
dENoYXJhY3RlcisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtX3N0b3BQcm9jZXNz
aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2Fz
ZSBSb3RhdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChWZWN0b3I8U1ZHQ2hhcj46
Oml0ZXJhdG9yIGl0ID0gc3RhcnQ7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgICAg
IGlmIChtX2F0Q2hhcmFjdGVyID09IG1fcXVlcnlTdGFydFBvc2l0aW9uKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIG1fcXVlcnlGbG9hdFJlc3VsdCA9IGl0LT5hbmdsZTsKLSAgICAgICAgICAgICAg
ICAgICAgbV9zdG9wUHJvY2Vzc2luZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtX2F0Q2hhcmFjdGVyKys7
Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1fc3RvcFByb2Nlc3NpbmcgPSBmYWxzZTsK
LSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENoYXJhY3Rlck51
bWJlckF0UG9zaXRpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOwot
ICAgICAgICAgICAgU1ZHQ2hhciogY2hhckF0UG9zID0gdGV4dEJveC0+Y2xvc2VzdENoYXJhY3Rl
clRvUG9zaXRpb24obV9xdWVyeVBvaW50SW5wdXQueCgpLCBtX3F1ZXJ5UG9pbnRJbnB1dC55KCks
IG9mZnNldCk7Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSBtX2F0Q2hhcmFjdGVyOwotICAgICAg
ICAgICAgaWYgKGNoYXJBdFBvcyAmJiBvZmZzZXQgPiBtX3F1ZXJ5TG9uZ1Jlc3VsdCkKLSAgICAg
ICAgICAgICAgICBtX3F1ZXJ5TG9uZ1Jlc3VsdCA9IG9mZnNldDsKLQotICAgICAgICAgICAgbV9h
dENoYXJhY3RlciArPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIG1fc3RvcFByb2Nlc3Npbmcg
PSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0
OgotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgICAgICBtX3N0b3BQ
cm9jZXNzaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIHZvaWQgc2V0UXVlcnlJbnB1dFBhcmFtZXRlcnMobG9uZyBzdGFydFBvc2l0aW9uLCBs
b25nIGxlbmd0aCwgRmxvYXRQb2ludCByZWZlcmVuY2VQb2ludCkKLSAgICB7Ci0gICAgICAgIG1f
cXVlcnlTdGFydFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsKLSAgICAgICAgbV9xdWVyeUxlbmd0
aCA9IGxlbmd0aDsKLSAgICAgICAgbV9xdWVyeVBvaW50SW5wdXQgPSByZWZlcmVuY2VQb2ludDsK
LSAgICB9Ci0KLSAgICBsb25nIGxvbmdSZXN1bHQoKSBjb25zdCB7IHJldHVybiBtX3F1ZXJ5TG9u
Z1Jlc3VsdDsgfQotICAgIGZsb2F0IGZsb2F0UmVzdWx0KCkgY29uc3QgeyByZXR1cm4gbV9xdWVy
eUZsb2F0UmVzdWx0OyB9Ci0gICAgRmxvYXRQb2ludCBwb2ludFJlc3VsdCgpIGNvbnN0IHsgcmV0
dXJuIG1fcXVlcnlQb2ludFJlc3VsdDsgfQotICAgIEZsb2F0UmVjdCByZWN0UmVzdWx0KCkgY29u
c3QgeyByZXR1cm4gbV9xdWVyeVJlY3RSZXN1bHQ7IH0KLSAgICBib29sIHN0b3BQcm9jZXNzaW5n
KCkgY29uc3QgeyByZXR1cm4gbV9zdG9wUHJvY2Vzc2luZzsgfQotCi1wcml2YXRlOgotICAgIGNv
bnN0IFNWR1RleHRDb250ZW50RWxlbWVudCogbV9yZWZlcmVuY2U7Ci0gICAgUXVlcnlNb2RlIG1f
bW9kZTsKLQotICAgIGxvbmcgbV9xdWVyeVN0YXJ0UG9zaXRpb247Ci0gICAgbG9uZyBtX3F1ZXJ5
TGVuZ3RoOwotICAgIEZsb2F0UG9pbnQgbV9xdWVyeVBvaW50SW5wdXQ7Ci0KLSAgICBsb25nIG1f
cXVlcnlMb25nUmVzdWx0OwotICAgIGZsb2F0IG1fcXVlcnlGbG9hdFJlc3VsdDsKLSAgICBGbG9h
dFBvaW50IG1fcXVlcnlQb2ludFJlc3VsdDsKLSAgICBGbG9hdFJlY3QgbV9xdWVyeVJlY3RSZXN1
bHQ7Ci0KLSAgICBib29sIG1fc3RvcFByb2Nlc3Npbmc7Ci0gICAgbG9uZyBtX2F0Q2hhcmFjdGVy
OwotfTsKLQotc3RhdGljIFZlY3RvcjxTVkdJbmxpbmVUZXh0Qm94Kj4gZmluZElubGluZVRleHRC
b3hJblRleHRDaHVua3MoY29uc3QgU1ZHVGV4dENvbnRlbnRFbGVtZW50KiBlbGVtZW50LCBjb25z
dCBWZWN0b3I8U1ZHVGV4dENodW5rPiYgY2h1bmtzKQoteyAgIAotICAgIFZlY3RvcjxTVkdUZXh0
Q2h1bms+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNodW5rcy5iZWdpbigpOwotICAgIGNvbnN0IFZl
Y3RvcjxTVkdUZXh0Q2h1bms+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBjaHVua3MuZW5kKCk7Ci0K
LSAgICBWZWN0b3I8U1ZHSW5saW5lVGV4dEJveCo+IGJveGVzOwotCi0gICAgZm9yICg7IGl0ICE9
IGVuZDsgKytpdCkgewotICAgICAgICBWZWN0b3I8U1ZHSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2U+
Ojpjb25zdF9pdGVyYXRvciBib3hJdCA9IGl0LT5ib3hlcy5iZWdpbigpOwotICAgICAgICBjb25z
dCBWZWN0b3I8U1ZHSW5saW5lQm94Q2hhcmFjdGVyUmFuZ2U+Ojpjb25zdF9pdGVyYXRvciBib3hF
bmQgPSBpdC0+Ym94ZXMuZW5kKCk7Ci0KLSAgICAgICAgZm9yICg7IGJveEl0ICE9IGJveEVuZDsg
Kytib3hJdCkgewotICAgICAgICAgICAgU1ZHSW5saW5lVGV4dEJveCogdGV4dEJveCA9IHN0YXRp
Y19jYXN0PFNWR0lubGluZVRleHRCb3gqPihib3hJdC0+Ym94KTsKLQotICAgICAgICAgICAgTm9k
ZSogdGV4dEVsZW1lbnQgPSB0ZXh0Qm94LT50ZXh0UmVuZGVyZXIoKS0+cGFyZW50KCktPm5vZGUo
KTsKLSAgICAgICAgICAgIEFTU0VSVCh0ZXh0RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIGlmICh0
ZXh0RWxlbWVudCA9PSBlbGVtZW50IHx8IHRleHRFbGVtZW50LT5wYXJlbnQoKSA9PSBlbGVtZW50
KQotICAgICAgICAgICAgICAgIGJveGVzLmFwcGVuZCh0ZXh0Qm94KTsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIHJldHVybiBib3hlczsKLX0KLQotc3RhdGljIGlubGluZSBTVkdSb290SW5saW5l
Qm94KiByb290SW5saW5lQm94Rm9yVGV4dENvbnRlbnRFbGVtZW50KGNvbnN0IFNWR1RleHRDb250
ZW50RWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBSZW5kZXJPYmplY3QqIG9iamVjdCA9IGVsZW1l
bnQtPnJlbmRlcmVyKCk7Ci0gICAgCi0gICAgaWYgKCFvYmplY3QgfHwgIW9iamVjdC0+aXNTVkdU
ZXh0KCkgfHwgb2JqZWN0LT5pc1RleHQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBSZW5k
ZXJCbG9jayogc3ZnVGV4dCA9IHRvUmVuZGVyQmxvY2sob2JqZWN0KTsKLQotICAgIC8vIEZpbmQg
cm9vdCBpbmxpbmUgYm94Ci0gICAgU1ZHUm9vdElubGluZUJveCogcm9vdEJveCA9IHN0YXRpY19j
YXN0PFNWR1Jvb3RJbmxpbmVCb3gqPihzdmdUZXh0LT5maXJzdFJvb3RCb3goKSk7Ci0gICAgaWYg
KCFyb290Qm94KSB7Ci0gICAgICAgIC8vIExheW91dCBpcyBub3Qgc3luYyB5ZXQhCi0gICAgICAg
IGVsZW1lbnQtPmRvY3VtZW50KCktPnVwZGF0ZUxheW91dElnbm9yZVBlbmRpbmdTdHlsZXNoZWV0
cygpOwotICAgICAgICByb290Qm94ID0gc3RhdGljX2Nhc3Q8U1ZHUm9vdElubGluZUJveCo+KHN2
Z1RleHQtPmZpcnN0Um9vdEJveCgpKTsKLSAgICB9Ci0KLSAgICBBU1NFUlQocm9vdEJveCk7Ci0g
ICAgcmV0dXJuIHJvb3RCb3g7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgU1ZHSW5saW5lVGV4dEJveFF1
ZXJ5V2Fsa2VyIGV4ZWN1dGVUZXh0UXVlcnkoY29uc3QgU1ZHVGV4dENvbnRlbnRFbGVtZW50KiBl
bGVtZW50LCBTVkdJbmxpbmVUZXh0Qm94UXVlcnlXYWxrZXI6OlF1ZXJ5TW9kZSBtb2RlLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBs
b25nIHN0YXJ0UG9zaXRpb24gPSAwLCBsb25nIGxlbmd0aCA9IDAsIEZsb2F0UG9pbnQgcmVmZXJl
bmNlUG9pbnQgPSBGbG9hdFBvaW50KCkpCi17Ci0gICAgU1ZHUm9vdElubGluZUJveCogcm9vdEJv
eCA9IHJvb3RJbmxpbmVCb3hGb3JUZXh0Q29udGVudEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgaWYg
KCFyb290Qm94KQotICAgICAgICByZXR1cm4gU1ZHSW5saW5lVGV4dEJveFF1ZXJ5V2Fsa2VyKDAs
IG1vZGUpOwotCi0gICAgLy8gRmluZCBhbGwgaW5saW5lIHRleHQgYm94IGFzc29jaWF0ZWQgd2l0
aCBvdXIgcmVuZGVyZXIKLSAgICBWZWN0b3I8U1ZHSW5saW5lVGV4dEJveCo+IHRleHRCb3hlcyA9
IGZpbmRJbmxpbmVUZXh0Qm94SW5UZXh0Q2h1bmtzKGVsZW1lbnQsIHJvb3RCb3gtPnN2Z1RleHRD
aHVua3MoKSk7Ci0KLSAgICAvLyBXYWxrIHRleHQgY2h1bmtzIHRvIGZpbmQgY2h1bmtzIGFzc29j
aWF0ZWQgd2l0aCBvdXIgaW5saW5lIHRleHQgYm94Ci0gICAgU1ZHSW5saW5lVGV4dEJveFF1ZXJ5
V2Fsa2VyIHdhbGtlckNhbGxiYWNrKGVsZW1lbnQsIG1vZGUpOwotICAgIHdhbGtlckNhbGxiYWNr
LnNldFF1ZXJ5SW5wdXRQYXJhbWV0ZXJzKHN0YXJ0UG9zaXRpb24sIGxlbmd0aCwgcmVmZXJlbmNl
UG9pbnQpOwotCi0gICAgU1ZHVGV4dENodW5rV2Fsa2VyPFNWR0lubGluZVRleHRCb3hRdWVyeVdh
bGtlcj4gd2Fsa2VyKCZ3YWxrZXJDYWxsYmFjaywgJlNWR0lubGluZVRleHRCb3hRdWVyeVdhbGtl
cjo6Y2h1bmtQb3J0aW9uQ2FsbGJhY2spOwotCi0gICAgVmVjdG9yPFNWR0lubGluZVRleHRCb3gq
Pjo6aXRlcmF0b3IgaXQgPSB0ZXh0Qm94ZXMuYmVnaW4oKTsKLSAgICBWZWN0b3I8U1ZHSW5saW5l
VGV4dEJveCo+OjppdGVyYXRvciBlbmQgPSB0ZXh0Qm94ZXMuZW5kKCk7Ci0KLSAgICBmb3IgKDsg
aXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIHJvb3RCb3gtPndhbGtUZXh0Q2h1bmtzKCZ3YWxr
ZXIsICppdCk7Ci0KLSAgICAgICAgaWYgKHdhbGtlckNhbGxiYWNrLnN0b3BQcm9jZXNzaW5nKCkp
Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gd2Fsa2VyQ2FsbGJhY2s7
Ci19Ci0KIHVuc2lnbmVkIFNWR1RleHRDb250ZW50RWxlbWVudDo6Z2V0TnVtYmVyT2ZDaGFycygp
IGNvbnN0CiB7CiAgICAgZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxl
c2hlZXRzKCk7Ci0KLSAgICByZXR1cm4gZXhlY3V0ZVRleHRRdWVyeSh0aGlzLCBTVkdJbmxpbmVU
ZXh0Qm94UXVlcnlXYWxrZXI6Ok51bWJlck9mQ2hhcmFjdGVycykubG9uZ1Jlc3VsdCgpOworICAg
IHJldHVybiBTVkdUZXh0UXVlcnkocmVuZGVyZXIoKSkubnVtYmVyT2ZDaGFyYWN0ZXJzKCk7CiB9
CiAKIGZsb2F0IFNWR1RleHRDb250ZW50RWxlbWVudDo6Z2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCkg
Y29uc3QKIHsKICAgICBkb2N1bWVudCgpLT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVz
aGVldHMoKTsKLQotICAgIHJldHVybiBleGVjdXRlVGV4dFF1ZXJ5KHRoaXMsIFNWR0lubGluZVRl
eHRCb3hRdWVyeVdhbGtlcjo6VGV4dExlbmd0aCkuZmxvYXRSZXN1bHQoKTsKKyAgICByZXR1cm4g
U1ZHVGV4dFF1ZXJ5KHJlbmRlcmVyKCkpLnRleHRMZW5ndGgoKTsKIH0KIAogZmxvYXQgU1ZHVGV4
dENvbnRlbnRFbGVtZW50OjpnZXRTdWJTdHJpbmdMZW5ndGgodW5zaWduZWQgY2hhcm51bSwgdW5z
aWduZWQgbmNoYXJzLCBFeGNlcHRpb25Db2RlJiBlYykgY29uc3QKQEAgLTM5Myw3ICs2OCw3IEBA
IGZsb2F0IFNWR1RleHRDb250ZW50RWxlbWVudDo6Z2V0U3ViU3RyaW4KICAgICAgICAgcmV0dXJu
IDAuMGY7CiAgICAgfQogCi0gICAgcmV0dXJuIGV4ZWN1dGVUZXh0UXVlcnkodGhpcywgU1ZHSW5s
aW5lVGV4dEJveFF1ZXJ5V2Fsa2VyOjpTdWJTdHJpbmdMZW5ndGgsIGNoYXJudW0sIG5jaGFycyku
ZmxvYXRSZXN1bHQoKTsKKyAgICByZXR1cm4gU1ZHVGV4dFF1ZXJ5KHJlbmRlcmVyKCkpLnN1YlN0
cmluZ0xlbmd0aChjaGFybnVtLCBuY2hhcnMpOwogfQogCiBGbG9hdFBvaW50IFNWR1RleHRDb250
ZW50RWxlbWVudDo6Z2V0U3RhcnRQb3NpdGlvbk9mQ2hhcih1bnNpZ25lZCBjaGFybnVtLCBFeGNl
cHRpb25Db2RlJiBlYykgY29uc3QKQEAgLTQwNSw3ICs4MCw3IEBAIEZsb2F0UG9pbnQgU1ZHVGV4
dENvbnRlbnRFbGVtZW50OjpnZXRTdGEKICAgICAgICAgcmV0dXJuIEZsb2F0UG9pbnQoKTsKICAg
ICB9CiAKLSAgICByZXR1cm4gZXhlY3V0ZVRleHRRdWVyeSh0aGlzLCBTVkdJbmxpbmVUZXh0Qm94
UXVlcnlXYWxrZXI6OlN0YXJ0UG9zaXRpb24sIGNoYXJudW0pLnBvaW50UmVzdWx0KCk7CisgICAg
cmV0dXJuIFNWR1RleHRRdWVyeShyZW5kZXJlcigpKS5zdGFydFBvc2l0aW9uT2ZDaGFyYWN0ZXIo
Y2hhcm51bSk7CiB9CiAKIEZsb2F0UG9pbnQgU1ZHVGV4dENvbnRlbnRFbGVtZW50OjpnZXRFbmRQ
b3NpdGlvbk9mQ2hhcih1bnNpZ25lZCBjaGFybnVtLCBFeGNlcHRpb25Db2RlJiBlYykgY29uc3QK
QEAgLTQxNyw3ICs5Miw3IEBAIEZsb2F0UG9pbnQgU1ZHVGV4dENvbnRlbnRFbGVtZW50OjpnZXRF
bmQKICAgICAgICAgcmV0dXJuIEZsb2F0UG9pbnQoKTsKICAgICB9CiAKLSAgICByZXR1cm4gZXhl
Y3V0ZVRleHRRdWVyeSh0aGlzLCBTVkdJbmxpbmVUZXh0Qm94UXVlcnlXYWxrZXI6OkVuZFBvc2l0
aW9uLCBjaGFybnVtKS5wb2ludFJlc3VsdCgpOworICAgIHJldHVybiBTVkdUZXh0UXVlcnkocmVu
ZGVyZXIoKSkuZW5kUG9zaXRpb25PZkNoYXJhY3RlcihjaGFybnVtKTsKIH0KIAogRmxvYXRSZWN0
IFNWR1RleHRDb250ZW50RWxlbWVudDo6Z2V0RXh0ZW50T2ZDaGFyKHVuc2lnbmVkIGNoYXJudW0s
IEV4Y2VwdGlvbkNvZGUmIGVjKSBjb25zdApAQCAtNDI5LDcgKzEwNCw3IEBAIEZsb2F0UmVjdCBT
VkdUZXh0Q29udGVudEVsZW1lbnQ6OmdldEV4dGUKICAgICAgICAgcmV0dXJuIEZsb2F0UmVjdCgp
OwogICAgIH0KIAotICAgIHJldHVybiBleGVjdXRlVGV4dFF1ZXJ5KHRoaXMsIFNWR0lubGluZVRl
eHRCb3hRdWVyeVdhbGtlcjo6RXh0ZW50LCBjaGFybnVtKS5yZWN0UmVzdWx0KCk7CisgICAgcmV0
dXJuIFNWR1RleHRRdWVyeShyZW5kZXJlcigpKS5leHRlbnRPZkNoYXJhY3RlcihjaGFybnVtKTsK
IH0KIAogZmxvYXQgU1ZHVGV4dENvbnRlbnRFbGVtZW50OjpnZXRSb3RhdGlvbk9mQ2hhcih1bnNp
Z25lZCBjaGFybnVtLCBFeGNlcHRpb25Db2RlJiBlYykgY29uc3QKQEAgLTQ0MSwxNCArMTE2LDEz
IEBAIGZsb2F0IFNWR1RleHRDb250ZW50RWxlbWVudDo6Z2V0Um90YXRpb24KICAgICAgICAgcmV0
dXJuIDAuMGY7CiAgICAgfQogCi0gICAgcmV0dXJuIGV4ZWN1dGVUZXh0UXVlcnkodGhpcywgU1ZH
SW5saW5lVGV4dEJveFF1ZXJ5V2Fsa2VyOjpSb3RhdGlvbiwgY2hhcm51bSkuZmxvYXRSZXN1bHQo
KTsKKyAgICByZXR1cm4gU1ZHVGV4dFF1ZXJ5KHJlbmRlcmVyKCkpLnJvdGF0aW9uT2ZDaGFyYWN0
ZXIoY2hhcm51bSk7CiB9CiAKIGludCBTVkdUZXh0Q29udGVudEVsZW1lbnQ6OmdldENoYXJOdW1B
dFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAogewogICAgIGRvY3VtZW50
KCktPnVwZGF0ZUxheW91dElnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cygpOwotCi0gICAgcmV0dXJu
IGV4ZWN1dGVUZXh0UXVlcnkodGhpcywgU1ZHSW5saW5lVGV4dEJveFF1ZXJ5V2Fsa2VyOjpDaGFy
YWN0ZXJOdW1iZXJBdFBvc2l0aW9uLCAwLjBmLCAwLjBmLCBwb2ludCkubG9uZ1Jlc3VsdCgpOwor
ICAgIHJldHVybiBTVkdUZXh0UXVlcnkocmVuZGVyZXIoKSkuY2hhcmFjdGVyTnVtYmVyQXRQb3Np
dGlvbihwb2ludCk7CiB9CiAKIHZvaWQgU1ZHVGV4dENvbnRlbnRFbGVtZW50OjpzZWxlY3RTdWJT
dHJpbmcodW5zaWduZWQgY2hhcm51bSwgdW5zaWduZWQgbmNoYXJzLCBFeGNlcHRpb25Db2RlJiBl
YykgY29uc3QKSW5kZXg6IFdlYkNvcmUvc3ZnL1NWR1RleHRFbGVtZW50LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3N2Zy9TVkdUZXh0RWxlbWVudC5jcHAJKHJldmlzaW9uIDYxMzgzKQorKysg
V2ViQ29yZS9zdmcvU1ZHVGV4dEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMzIsMTYg
KzEzMiw2IEBAIHZvaWQgU1ZHVGV4dEVsZW1lbnQ6OnN5bmNocm9uaXplUHJvcGVydHkKICAgICAg
ICAgc3luY2hyb25pemVUcmFuc2Zvcm0oKTsKIH0KIAotdm9pZCBTVkdUZXh0RWxlbWVudDo6Y2hp
bGRyZW5DaGFuZ2VkKGJvb2wgY2hhbmdlZEJ5UGFyc2VyLCBOb2RlKiBiZWZvcmVDaGFuZ2UsIE5v
ZGUqIGFmdGVyQ2hhbmdlLCBpbnQgY2hpbGRDb3VudERlbHRhKQotewotICAgIFNWR1RleHRQb3Np
dGlvbmluZ0VsZW1lbnQ6OmNoaWxkcmVuQ2hhbmdlZChjaGFuZ2VkQnlQYXJzZXIsIGJlZm9yZUNo
YW5nZSwgYWZ0ZXJDaGFuZ2UsIGNoaWxkQ291bnREZWx0YSk7Ci0KLSAgICBpZiAoIXJlbmRlcmVy
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0KHRy
dWUpOwotfQotCiB9CiAKICNlbmRpZiAvLyBFTkFCTEUoU1ZHKQpJbmRleDogV2ViQ29yZS9zdmcv
U1ZHVGV4dEVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N2Zy9TVkdUZXh0RWxlbWVu
dC5oCShyZXZpc2lvbiA2MTM4MykKKysrIFdlYkNvcmUvc3ZnL1NWR1RleHRFbGVtZW50LmgJKHdv
cmtpbmcgY29weSkKQEAgLTUwLDcgKzUwLDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAg
ICAgICAgICAgIAogICAgICAgICB2aXJ0dWFsIHZvaWQgc3ZnQXR0cmlidXRlQ2hhbmdlZChjb25z
dCBRdWFsaWZpZWROYW1lJik7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzeW5jaHJvbml6ZVByb3Bl
cnR5KGNvbnN0IFF1YWxpZmllZE5hbWUmKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGNoaWxkcmVu
Q2hhbmdlZChib29sIGNoYW5nZWRCeVBhcnNlciA9IGZhbHNlLCBOb2RlKiBiZWZvcmVDaGFuZ2Ug
PSAwLCBOb2RlKiBhZnRlckNoYW5nZSA9IDAsIGludCBjaGlsZENvdW50RGVsdGEgPSAwKTsKIAog
ICAgIHByaXZhdGU6CiAgICAgICAgIERFQ0xBUkVfQU5JTUFURURfUFJPUEVSVFkoU1ZHVGV4dEVs
ZW1lbnQsIFNWR05hbWVzOjp0cmFuc2Zvcm1BdHRyLCBTVkdUcmFuc2Zvcm1MaXN0KiwgVHJhbnNm
b3JtLCB0cmFuc2Zvcm0pCg==
</data>
<flag name="review"
          id="45703"
          type_id="1"
          status="+"
          setter="krit"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>59083</attachid>
            <date>2010-06-18 01:40:38 -0700</date>
            <delta_ts>2010-06-18 01:50:40 -0700</delta_ts>
            <desc>LayoutTests: expected.txt changes</desc>
            <filename>SVGText-text.diff</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64"></data>
<flag name="review"
          id="45715"
          type_id="1"
          status="+"
          setter="krit"
    />
          </attachment>
      

    </bug>

</bugzilla>