<?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>38783</bug_id>
          
          <creation_ts>2010-05-07 16:57:23 -0700</creation_ts>
          <short_desc>[chromium] Implement h/w accelerated compositing for LayerChromium layers</short_desc>
          <delta_ts>2010-05-20 10:31:45 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>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>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Vangelis Kokkevis">vangelis</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
    
    <cc>kbr</cc>
    
    <cc>mrobinson</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>222703</commentid>
    <comment_count>0</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-05-07 16:57:23 -0700</bug_when>
    <thetext>Switch the current implementation of the ACCELERATED_COMPOSITING path in chromium to do the compositing on the GPU rather than the CPU.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>225414</commentid>
    <comment_count>1</comment_count>
      <attachid>56003</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-05-13 11:45:49 -0700</bug_when>
    <thetext>Created attachment 56003
Proposed patch

Sorry this patch got to be a bit bigger than I intended to.  There are still a few things that will change in subsequent CLs such as:
1. Layers don&apos;t need to hang on to their GC and Canvas.  The can create one temporarily, render into it and upload the results to the texture.
2. Setting a 1x1 dirty region to kick off the render logic for the browser will go away once the compositor moves to its own thread.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>225415</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-05-13 11:47:03 -0700</bug_when>
    <thetext>Attachment 56003 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
Last 3072 characters of output:
s] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:471:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:472:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:473:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:474:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:502:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:560:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:567:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:642:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:643:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:644:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:645:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:646:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:647:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:648:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:649:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:651:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:652:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:656:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:662:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:668:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:691:  Should have a space between // and comment  [whitespace/comments] [4]
Total errors found: 45 in 10 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>225438</commentid>
    <comment_count>3</comment_count>
      <attachid>56003</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-13 12:28:10 -0700</bug_when>
    <thetext>Comment on attachment 56003
Proposed patch

Please run check-webkit-style before posting your patch (or use webkit-patch to upload your patch, which runs the style checker for you).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>225453</commentid>
    <comment_count>4</comment_count>
      <attachid>56010</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-05-13 13:04:10 -0700</bug_when>
    <thetext>Created attachment 56010
Proposed patch with style issues fixed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>225463</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-13 13:14:26 -0700</bug_when>
    <thetext>(When you upload a patch, please check the &quot;this is a patch&quot; box so we get the links we need to review your patch.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>225820</commentid>
    <comment_count>6</comment_count>
      <attachid>56010</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-05-14 07:58:36 -0700</bug_when>
    <thetext>Comment on attachment 56010
Proposed patch with style issues fixed

Vangelis, I am sorry -- I gave it my best. But this patch is too large to be reviewed like this. Can you please split it up into smaller bits? Ideally, into a progression of patches that makes logical sense.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>225967</commentid>
    <comment_count>7</comment_count>
      <attachid>56010</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-05-14 13:16:28 -0700</bug_when>
    <thetext>Comment on attachment 56010
Proposed patch with style issues fixed

This generally looks good to me. It looks like the code is mostly interdependent so it seems to me it will be difficult to split it up into multiple patches. I&apos;d support landing it all at once, given that it&apos;s been demonstrated to work.

The only high level comment I have is that compositeLayersRecursive does two pieces of work: updating the layer&apos;s contents and drawing it to the screen. I think it would be better to split these into two different phases, even though doing so would involve two traversals of the layer hierarchy. That way the updating of the layer&apos;s contents, which must be done on the main thread, would be more easily split off from the drawing, which might be more profitably done on a background thread in the future.

A few minor comments.

WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:215
 +      FloatPoint3D test2 = renderMatrix.mapPoint(FloatPoint3D(0.5, -0.5, 0));
Test code should be removed.

WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:155
 +  static GLuint createLayerTexture()
Should refactor with createTextureObject().


WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:265
 +      offset+= 3 * sizeof(GLfloat);
Need space between offset and += .

WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:416
 +      FloatPoint3D test2 = renderMatrix.mapPoint(FloatPoint3D(0.5, -0.5, 0));
More test code.


WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:720
 +  }
Formatting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227022</commentid>
    <comment_count>8</comment_count>
      <attachid>56297</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-05-17 17:49:34 -0700</bug_when>
    <thetext>Created attachment 56297
Proposed patch - smaller this time

This patch now covers the code necessary for the compositor. I&apos;m afraid it&apos;s still a fairly large patch but it&apos;s hard to break it up any further. Please let me know if you&apos;d like me to walk you through the code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227023</commentid>
    <comment_count>9</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-05-17 17:50:38 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; A few minor comments.
&gt; 
&gt; WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:215
&gt;  +      FloatPoint3D test2 = renderMatrix.mapPoint(FloatPoint3D(0.5, -0.5, 0));
&gt; Test code should be removed.
&gt; 

Done.

&gt; WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:155
&gt;  +  static GLuint createLayerTexture()
&gt; Should refactor with createTextureObject().
&gt; 

Done. Removed createTextureObject() as it wasn&apos;t getting used.

&gt; 
&gt; WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:265
&gt;  +      offset+= 3 * sizeof(GLfloat);
&gt; Need space between offset and += .
&gt; 

Done.

&gt; WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:416
&gt;  +      FloatPoint3D test2 = renderMatrix.mapPoint(FloatPoint3D(0.5, -0.5, 0));
&gt; More test code.
&gt; 

Removed.

&gt; 
&gt; WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:720
&gt;  +  }
&gt; Formatting.

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227323</commentid>
    <comment_count>10</comment_count>
      <attachid>56297</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-05-18 08:44:31 -0700</bug_when>
    <thetext>Comment on attachment 56297
Proposed patch - smaller this time

Overall, looks great.  Just a few minor issues:

WebCore/platform/graphics/chromium/GraphicsLayerChromium.cpp:535
 +      // The position of they layer is the center of quad.
nit: &quot;they layer&quot; -&gt; &quot;the layer&quot; ?

WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:264
 +              // Scrolling works as follows: We render a quad with the current root layer contents
nit: indent by 4 spaces instead of 8.  true, this means the
body is not visually separate from the &quot;|| (scrollDelta...&quot;
bit, but that&apos;s what webkit style would have you do.

WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:359
 +      std::map&lt;LayerChromium*, unsigned int&gt;::iterator textureId;
webkit avoids the container classes from STL.  please use HashMap
from WTF instead.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227388</commentid>
    <comment_count>11</comment_count>
      <attachid>56390</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-05-18 11:10:04 -0700</bug_when>
    <thetext>Created attachment 56390
Patch addressing review comments

Replaced std::map with wtf&apos;s HashMap and took care of the other issues as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227389</commentid>
    <comment_count>12</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-05-18 11:10:49 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 56297 [details])
&gt; Overall, looks great.  Just a few minor issues:

Thanks for the quick review! Please see new patch.

&gt; 
&gt; WebCore/platform/graphics/chromium/GraphicsLayerChromium.cpp:535
&gt;  +      // The position of they layer is the center of quad.
&gt; nit: &quot;they layer&quot; -&gt; &quot;the layer&quot; ?
&gt; 

Done.

&gt; WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:264
&gt;  +              // Scrolling works as follows: We render a quad with the current root layer contents
&gt; nit: indent by 4 spaces instead of 8.  true, this means the
&gt; body is not visually separate from the &quot;|| (scrollDelta...&quot;
&gt; bit, but that&apos;s what webkit style would have you do.
&gt; 

Done. 

&gt; WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:359
&gt;  +      std::map&lt;LayerChromium*, unsigned int&gt;::iterator textureId;
&gt; webkit avoids the container classes from STL.  please use HashMap
&gt; from WTF instead.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227395</commentid>
    <comment_count>13</comment_count>
      <attachid>56390</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-05-18 11:22:40 -0700</bug_when>
    <thetext>Comment on attachment 56390
Patch addressing review comments

Looks good. Couple of very minor comments, not necessary to address now.

WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:310
 +      glClearColor(0, 0, 1, 1);
Presumably the blue color is for debugging purposes?

WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:328
 +      // so we need to send the blending mode appropriately.
send -&gt; set</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>228207</commentid>
    <comment_count>14</comment_count>
      <attachid>56390</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-05-19 22:59:21 -0700</bug_when>
    <thetext>Comment on attachment 56390
Patch addressing review comments

Clearing flags on attachment: 56390

Committed r59822: &lt;http://trac.webkit.org/changeset/59822&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>228208</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-05-19 22:59:28 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>228213</commentid>
    <comment_count>16</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-05-20 00:12:25 -0700</bug_when>
    <thetext>This broke lots of tests on Gtk:
http://build.webkit.org/results/GTK%20Linux%2032-bit%20Release/r59822%20(13001)/results.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>228214</commentid>
    <comment_count>17</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-05-20 00:14:43 -0700</bug_when>
    <thetext>It&apos;s unclear to me if the Gtk bot just wedged itself or if this is actually responsible for the regression.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>228448</commentid>
    <comment_count>18</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-05-20 10:31:45 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; It&apos;s unclear to me if the Gtk bot just wedged itself or if this is actually responsible for the regression.

I&apos;d be surprised too if this patch caused the problem. All the code sits behind an #if WTF_USE_ACCELERATED_COMPOSITING which doesn&apos;t get defined yet in regular builds.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56003</attachid>
            <date>2010-05-13 11:45:49 -0700</date>
            <delta_ts>2010-05-13 13:04:10 -0700</delta_ts>
            <desc>Proposed patch</desc>
            <filename>glCompositor.txt</filename>
            <type>text/plain</type>
            <size>62651</size>
            <attacher name="Vangelis Kokkevis">vangelis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1OTMzNCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzIgQEAKKzIwMTAtMDUtMTIgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNA
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEltcGxlbWVudGluZyBoL3cgYWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcgb2YgbGF5ZXJz
IGZvciBjaHJvbWltdW0uCisgICAgICAgICogUmVtb3ZlZCB0aGUgZXhpc3Rpbmcgc29mdHdhcmUg
Y29tcG9zaXRpbmcgcGF0aCBmb3IgTGF5ZXJDaHJvbWl1bSdzIGFuZAorICAgICAgICAgIHJlcGxh
Y2VkIGl0IHdpdGggYSBHTCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgKiBGaXhlZCBpc3N1ZXMg
d2l0aCBMYXllckNocm9taXVtIGhpZXJhcmNoeSB1cGRhdGUgY29kZS4KKyAgICAgICAgKiBBZGRl
ZCBjb2RlIGZvciBoYW5kbGluZyBsYXllcnMgdGhhdCBjb250YWluIGp1c3Qgb25lIEltYWdlIGVs
ZW1lbnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0z
ODc4MworCisgICAgICAgICogV2ViQ29yZS5neXAvV2ViQ29yZS5neXA6IAorICAgICAgICAgICAg
IEFkZGVkIGNocm9taXVtJ3MgZ3B1IGRpciBpbiBpbmNsdWRlIHBhdGguCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6fkdyYXBoaWNzTGF5ZXJDaHJvbWl1
bSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldENvbnRlbnRz
VG9JbWFnZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQ2hyb21pdW06OnVwZGF0
ZUxheWVyRHJhd3NDb250ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDaHJv
bWl1bTo6dXBkYXRlQ29udGVudHNJbWFnZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xh
eWVyQ2hyb21pdW06OnVwZGF0ZUNvbnRlbnRzUmVjdCk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmg6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllckNocm9taXVtOjpMYXllckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
Q2hyb21pdW06On5MYXllckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21p
dW06OnVwZGF0ZUdyYXBoaWNzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9t
aXVtOjpkcmF3c0NvbnRlbnRVcGRhdGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21p
dW06OnVwZGF0ZUNvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnNl
dENvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnNldE5lZWRzQ29t
bWl0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06Omluc2VydFN1YmxheWVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnJlbW92ZUZyb21TdXBlcmxheWVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnJlbW92ZVN1YmxheWVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnJlcGxhY2VTdWJsYXllcik6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllckNocm9taXVtOjpzZXRCYWNraW5nU3RvcmVTaXplKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyQ2hyb21pdW06OnNldEJvdW5kcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXll
ckNocm9taXVtOjpyZW1vdmVBbGxTdWJsYXllcnMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJD
aHJvbWl1bTo6c2V0U3VibGF5ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06
OnNldE5lZWRzRGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
TGF5ZXJDaHJvbWl1bS5oOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6Y29udGVu
dHNEaXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjpjb250ZW50cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjpkcmF3c0NvbnRlbnQpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6c2V0U3VwZXJsYXllcik6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6Oik6CisgICAgICAgIChXZWJDb3JlOjpjaGVja0dMRXJyb3IpOgorICAgICAgICAo
V2ViQ29yZTo6Y3JlYXRlVGV4dHVyZU9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpsb2FkU2hh
ZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OmxvYWRTaGFkZXJQcm9ncmFtKToKKyAgICAgICAgKFdl
YkNvcmU6OnRvR0xNYXRyaXgpOgorICAgICAgICAoV2ViQ29yZTo6b3J0aG9NYXRyaXgpOgorICAg
ICAgICAoV2ViQ29yZTo6Y3JlYXRlTGF5ZXJUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyUmVuZGVyZXJDaHJvbWl1bTo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVu
ZGVyZXJDaHJvbWl1bTo6TGF5ZXJSZW5kZXJlckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6fkxheWVyUmVuZGVyZXJDaHJvbWl1bSk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmRyYXdUZXh0dXJlZFF1YWQpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3TGF5ZXJzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6Z2V0VGV4dHVyZUlkKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6YXNzaWduVGV4dHVyZUZvckxheWVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6ZnJlZUxheWVyVGV4
dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmRyYXdEZWJ1
Z0JvcmRlcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmlzTGF5
ZXJWaXNpYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6Y29t
cG9zaXRlTGF5ZXJzUmVjdXJzaXZlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJD
aHJvbWl1bTo6bWFrZUNvbnRleHRDdXJyZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVu
ZGVyZXJDaHJvbWl1bTo6aW5pdEdMKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJD
aHJvbWl1bTo6YmluZENvbW1vbkF0dHJpYkxvY2F0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyUmVuZGVyZXJDaHJvbWl1bTo6aW5pdGlhbGl6ZVNoYXJlZEdMT2JqZWN0cyk6CisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmg6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06Oik6CisKIDIwMTAtMDUtMTIg
IEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdl
ZCBieSBTaW1vbiBGcmFzZXIuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAJKHJldmlzaW9u
IDU5MTc0KQorKysgV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cAkod29ya2luZyBjb3B5
KQpAQCAtNzIyLDYgKzcyMiw3IEBACiAgICAgICAnaW5jbHVkZV9kaXJzJzogWwogICAgICAgICAn
PChJTlRFUk1FRElBVEVfRElSKScsCiAgICAgICAgICc8QCh3ZWJjb3JlX2luY2x1ZGVfZGlycykn
LAorICAgICAgICAnPChjaHJvbWl1bV9zcmNfZGlyKS9ncHUnCiAgICAgICBdLAogICAgICAgJ3Nv
dXJjZXMnOiBbCiAgICAgICAgICc8QCh3ZWJjb3JlX2ZpbGVzKScsCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVy
Q2hyb21pdW0uY3BwCShyZXZpc2lvbiA1OTE3NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MTAxLDEyICsxMDEsNiBAQCBHcmFwaGljc0xheWVyQ2hyb21pdW06OkdyYXBoaWNzTGF5ZXJDaHJv
CiAKIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6fkdyYXBoaWNzTGF5ZXJDaHJvbWl1bSgpCiB7Ci0g
ICAgLy8gQ2xlYW4gdXAgdGhlIFNraWEgbGF5ZXIuCi0gICAgaWYgKG1fbGF5ZXIpCi0gICAgICAg
IG1fbGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7Ci0KLSAgICBpZiAobV90cmFuc2Zvcm1M
YXllcikKLSAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsK
IH0KIAogdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldE5hbWUoY29uc3QgU3RyaW5nJiBp
bk5hbWUpCkBAIC0zMTEsNyArMzA1LDIzIEBAIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjpz
ZXRDb250ZW50c1IKIAogdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldENvbnRlbnRzVG9J
bWFnZShJbWFnZSogaW1hZ2UpCiB7Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAorICAgIGJvb2wg
Y2hpbGRyZW5DaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIG1fcGVu
ZGluZ0NvbnRlbnRzSW1hZ2UgPSBpbWFnZS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsK
KyAgICAgICAgbV9jb250ZW50c0xheWVyUHVycG9zZSA9IENvbnRlbnRzTGF5ZXJGb3JJbWFnZTsK
KyAgICAgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgICAgICBjaGlsZHJlbkNoYW5n
ZWQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fcGVuZGluZ0NvbnRlbnRzSW1hZ2Ug
PSAwOworICAgICAgICBtX2NvbnRlbnRzTGF5ZXJQdXJwb3NlID0gTm9Db250ZW50c0xheWVyOwor
ICAgICAgICBpZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICAgICAgY2hpbGRyZW5DaGFuZ2Vk
ID0gdHJ1ZTsKKyAgICB9CisKKyAgICB1cGRhdGVDb250ZW50c0ltYWdlKCk7CisKKyAgICBpZiAo
Y2hpbGRyZW5DaGFuZ2VkKQorICAgICAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKIH0KIAogdm9p
ZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldENvbnRlbnRzVG9WaWRlbyhQbGF0Zm9ybUxheWVy
KiB2aWRlb0xheWVyKQpAQCAtNDY5LDYgKzQ3OSwxMSBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJv
bWl1bTo6dXBkYXRlTGF5ZXJQCiAKIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjp1cGRhdGVM
YXllckRyYXdzQ29udGVudCgpCiB7CisgICAgLy8gU2luY2Ugb25seSBsYXllcnMgdGhhdCBkcmF3
IGNvbnRlbnQgaGF2ZSBhIHZhbGlkIGNvbnRleHQKKyAgICAvLyB3ZSBuZWVkIHRvIGNhbGwgdXBk
YXRlR3JhcGhpY3NDb250ZXh0KCkgaGVyZSB0byBtYWtlIHN1cmUgb25lCisgICAgLy8gZ2V0cyBj
cmVhdGVkLgorICAgIG1fbGF5ZXItPmRyYXdzQ29udGVudFVwZGF0ZWQoKTsKKwogICAgIGlmICht
X2RyYXdzQ29udGVudCkKICAgICAgICAgbV9sYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CiAKQEAg
LTQ4OSw3ICs1MDQsMjIgQEAgdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnVwZGF0ZUxheWVy
QgogCiB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6dXBkYXRlQ29udGVudHNJbWFnZSgpCiB7
Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAorICAgIGlmIChtX3BlbmRpbmdDb250ZW50c0ltYWdl
KSB7CisgICAgICAgIGlmICghbV9jb250ZW50c0xheWVyLmdldCgpKSB7CisgICAgICAgICAgICBS
ZWZQdHI8TGF5ZXJDaHJvbWl1bT4gaW1hZ2VMYXllciA9IExheWVyQ2hyb21pdW06OmNyZWF0ZShM
YXllckNocm9taXVtOjpMYXllciwgdGhpcyk7CisKKyAgICAgICAgICAgIHNldHVwQ29udGVudHNM
YXllcihpbWFnZUxheWVyLmdldCgpKTsKKyAgICAgICAgICAgIG1fY29udGVudHNMYXllciA9IGlt
YWdlTGF5ZXI7CisgICAgICAgICAgICAvLyBtX2NvbnRlbnRzTGF5ZXIgd2lsbCBiZSBwYXJlbnRl
ZCBieSB1cGRhdGVTdWJsYXllckxpc3QuCisgICAgICAgIH0KKyAgICAgICAgbV9jb250ZW50c0xh
eWVyLT5zZXRDb250ZW50cyhtX3BlbmRpbmdDb250ZW50c0ltYWdlKTsKKyAgICAgICAgbV9wZW5k
aW5nQ29udGVudHNJbWFnZSA9IDA7CisKKyAgICAgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTm8gaW1hZ2UuIG1fY29udGVudHNMYXllciB3aWxsIGJl
IHJlbW92ZWQgdmlhIHVwZGF0ZVN1YmxheWVyTGlzdC4KKyAgICAgICAgbV9jb250ZW50c0xheWVy
ID0gMDsKKyAgICB9CiB9CiAKIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjp1cGRhdGVDb250
ZW50c1ZpZGVvKCkKQEAgLTUwMiw3ICs1MzIsOCBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1
bTo6dXBkYXRlQ29udGVuCiAgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCiAgICAgICAgIHJldHVy
bjsKIAotICAgIG1fY29udGVudHNMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludChtX2NvbnRl
bnRzUmVjdC54KCksIG1fY29udGVudHNSZWN0LnkoKSkpOworICAgIC8vIFRoZSBwb3NpdGlvbiBv
ZiB0aGV5IGxheWVyIGlzIHRoZSBjZW50ZXIgb2YgcXVhZC4KKyAgICBtX2NvbnRlbnRzTGF5ZXIt
PnNldFBvc2l0aW9uKEZsb2F0UG9pbnQobV9jb250ZW50c1JlY3QueCgpICsgbV9jb250ZW50c1Jl
Y3Qud2lkdGgoKSAvIDIsIG1fY29udGVudHNSZWN0LnkoKSArIG1fY29udGVudHNSZWN0LmhlaWdo
dCgpIC8gMikpOwogICAgIG1fY29udGVudHNMYXllci0+c2V0Qm91bmRzKEludFNpemUobV9jb250
ZW50c1JlY3Qud2lkdGgoKSwgbV9jb250ZW50c1JlY3QuaGVpZ2h0KCkpKTsKIH0KIApJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0u
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBo
aWNzTGF5ZXJDaHJvbWl1bS5oCShyZXZpc2lvbiA1OTE3NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmgJKHdvcmtpbmcgY29weSkK
QEAgLTE0MCw2ICsxNDAsOCBAQCBwcml2YXRlOgogCiAgICAgQ29udGVudHNMYXllclB1cnBvc2Ug
bV9jb250ZW50c0xheWVyUHVycG9zZTsKICAgICBib29sIG1fY29udGVudHNMYXllckhhc0JhY2tn
cm91bmRDb2xvciA6IDE7CisKKyAgICBOYXRpdmVJbWFnZVB0ciBtX3BlbmRpbmdDb250ZW50c0lt
YWdlOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lv
biA1OTE3NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJv
bWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU1LDkgKzU1LDEwIEBAIExheWVyQ2hyb21pdW06
OkxheWVyQ2hyb21pdW0oTGF5ZXJUeXBlIHQKICAgICAsIG1fYm9yZGVyV2lkdGgoMCkKICAgICAs
IG1fYm9yZGVyQ29sb3IoMCwgMCwgMCwgMCkKICAgICAsIG1fYmFja2dyb3VuZENvbG9yKDAsIDAs
IDAsIDApCisgICAgLCBtX2FuY2hvclBvaW50KDAuNSwgMC41KQogICAgICwgbV9hbmNob3JQb2lu
dFooMCkKICAgICAsIG1fY2xlYXJzQ29udGV4dChmYWxzZSkKLSAgICAsIG1fZG91YmxlU2lkZWQo
ZmFsc2UpCisgICAgLCBtX2RvdWJsZVNpZGVkKHRydWUpCiAgICAgLCBtX2VkZ2VBbnRpYWxpYXNp
bmdNYXNrKDApCiAgICAgLCBtX2hpZGRlbihmYWxzZSkKICAgICAsIG1fbWFza3NUb0JvdW5kcyhm
YWxzZSkKQEAgLTY5LDIyICs3MCwzOSBAQCBMYXllckNocm9taXVtOjpMYXllckNocm9taXVtKExh
eWVyVHlwZSB0CiAgICAgLCBtX3NraWFDb250ZXh0KDApCiAgICAgLCBtX2dyYXBoaWNzQ29udGV4
dCgwKQogICAgICwgbV9nZW9tZXRyeUZsaXBwZWQoZmFsc2UpCisgICAgLCBtX2NvbnRlbnRzRGly
dHkoZmFsc2UpCisgICAgLCBtX2NvbnRlbnRzKDApCisgICAgLCBtX2hhc0NvbnRleHQoZmFsc2Up
CiB7Ci0gICAgdXBkYXRlR3JhcGhpY3NDb250ZXh0KG1fYmFja2luZ1N0b3JlUmVjdCk7CiB9CiAK
IExheWVyQ2hyb21pdW06On5MYXllckNocm9taXVtKCkKIHsKLSAgICAvLyBPdXIgc3VwZXJsYXll
ciBzaG91bGQgYmUgaG9sZGluZyBhIHJlZmVyZW5jZSB0byB1cywgc28gdGhlcmUgc2hvdWxkIGJl
IG5vIHdheSBmb3IgdXMgdG8gYmUgZGVzdHJveWVkIHdoaWxlIHdlIHN0aWxsIGhhdmUgYSBzdXBl
cmxheWVyLgorICAgIC8vIE91ciBzdXBlcmxheWVyIHNob3VsZCBiZSBob2xkaW5nIGEgcmVmZXJl
bmNlIHRvIHVzIHNvIHRoZXJlIHNob3VsZCBiZSBubworICAgIC8vIHdheSBmb3IgdXMgdG8gYmUg
ZGVzdHJveWVkIHdoaWxlIHdlIHN0aWxsIGhhdmUgYSBzdXBlcmxheWVyLgogICAgIEFTU0VSVCgh
c3VwZXJsYXllcigpKTsKKyAgICByZW1vdmVBbGxTdWJsYXllcnMoKTsKIH0KIAotdm9pZCBMYXll
ckNocm9taXVtOjp1cGRhdGVHcmFwaGljc0NvbnRleHQoY29uc3QgSW50U2l6ZSYgc2l6ZSkKK3Zv
aWQgTGF5ZXJDaHJvbWl1bTo6dXBkYXRlR3JhcGhpY3NDb250ZXh0KCkKIHsKKyAgICAvLyBJZiB0
aGUgbGF5ZXIgZG9lc24ndCBkcmF3IGFueXRoaW5nIChlLmcuIGl0J3MgYSBjb250YWluZXIgbGF5
ZXIpIHRoZW4gd2UKKyAgICAvLyBkb24ndCBjcmVhdGUgYSBjYW52YXMgLyBjb250ZXh0IGZvciBp
dC4gVGhlIHJvb3QgbGF5ZXIgaXMgYSBzcGVjaWFsCisgICAgLy8gY2FzZSBhcyBldmVuIGlmIGl0
J3MgbWFya2VkIGFzIGEgY29udGFpbmVyIGxheWVyIGl0IGRvZXMgYWN0dWFsbHkgaGF2ZQorICAg
IC8vIGNvbnRlbnQgdGhhdCBpdCBkcmF3cy4KKyAgICBSZW5kZXJMYXllckJhY2tpbmcqIGJhY2tp
bmcgPSBzdGF0aWNfY2FzdDxSZW5kZXJMYXllckJhY2tpbmcqPihtX293bmVyLT5jbGllbnQoKSk7
CisgICAgaWYgKCFkcmF3c0NvbnRlbnQoKSAmJiAhKHRoaXMgPT0gcm9vdExheWVyKCkpKSB7Cisg
ICAgICAgIG1fZ3JhcGhpY3NDb250ZXh0LmNsZWFyKCk7CisgICAgICAgIG1fc2tpYUNvbnRleHQu
Y2xlYXIoKTsKKyAgICAgICAgbV9jYW52YXMuY2xlYXIoKTsKKyAgICAgICAgbV9oYXNDb250ZXh0
ID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICNpZiBQTEFURk9STShTS0lBKQog
ICAgIC8vIENyZWF0ZSBuZXcgY2FudmFzIGFuZCBjb250ZXh0LiBPd25QdHIgdGFrZXMgY2FyZSBv
ZiBmcmVlaW5nIHVwCiAgICAgLy8gdGhlIG9sZCBvbmVzLgotICAgIG1fY2FudmFzID0gbmV3IHNr
aWE6OlBsYXRmb3JtQ2FudmFzKHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgZmFsc2UpOwor
ICAgIG1fY2FudmFzID0gbmV3IHNraWE6OlBsYXRmb3JtQ2FudmFzKG1fYmFja2luZ1N0b3JlU2l6
ZS53aWR0aCgpLCBtX2JhY2tpbmdTdG9yZVNpemUuaGVpZ2h0KCksIGZhbHNlKTsKICAgICBtX3Nr
aWFDb250ZXh0ID0gbmV3IFBsYXRmb3JtQ29udGV4dFNraWEobV9jYW52YXMuZ2V0KCkpOwogCiAg
ICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IHRleHQgdG8gc2hvdyB1cCBjb3JyZWN0bHkuIFdp
dGhvdXQgaXQsCkBAIC05MywzNyArMTExLDQ3IEBAIHZvaWQgTGF5ZXJDaHJvbWl1bTo6dXBkYXRl
R3JhcGhpY3NDb250ZXgKICAgICBtX3NraWFDb250ZXh0LT5zZXREcmF3aW5nVG9JbWFnZUJ1ZmZl
cih0cnVlKTsKIAogICAgIG1fZ3JhcGhpY3NDb250ZXh0ID0gbmV3IEdyYXBoaWNzQ29udGV4dChy
ZWludGVycHJldF9jYXN0PFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0Kj4obV9za2lhQ29udGV4dC5n
ZXQoKSkpOworCisgICAgbV9oYXNDb250ZXh0ID0gdHJ1ZTsKKyAgICBtX2NvbnRlbnRzRGlydHkg
PSB0cnVlOwogI2Vsc2UKICNlcnJvciAiTmVlZCB0byBpbXBsZW1lbnQgZm9yIHlvdXIgcGxhdGZv
cm0uIgogI2VuZGlmCi0gICAgLy8gVGhlIGJhY2tpbmcgc3RvcmUgYWxsb2NhdGVkIGZvciBhIGxh
eWVyIGNhbiBiZSBzbWFsbGVyIHRoYW4gdGhlIGxheWVyJ3MgYm91bmRzLgotICAgIC8vIFRoaXMg
aXMgbW9zdGx5IHRydWUgZm9yIHRoZSByb290IGxheWVyIHdob3NlIGJhY2tpbmcgc3RvcmUgaXMg
c2l6ZWQgYmFzZWQgb24gdGhlIHZpc2libGUKLSAgICAvLyBwb3J0aW9uIG9mIHRoZSBsYXllciBy
YXRoZXIgdGhhbiB0aGUgYWN0dWFsIHBhZ2Ugc2l6ZS4KLSAgICBtX2JhY2tpbmdTdG9yZVJlY3Qg
PSBzaXplOworCisgICAgcmV0dXJuOworfQorCit2b2lkIExheWVyQ2hyb21pdW06OmRyYXdzQ29u
dGVudFVwZGF0ZWQoKQoreworICAgIC8vIENyZWF0ZSBhIGRyYXdpbmcgY29udGV4dCBpZiB0aGUg
bGF5ZXIgbm93IGRyYXdzIGNvbnRlbnQKKyAgICAvLyBvciBkZWxldGUgdGhlIGV4aXN0aW5nIGNv
bnRleHQgaWYgdGhlIGxheWVyIGRvZXNuJ3QgZHJhdworICAgIC8vIGNvbnRlbnQgYW55bW9yZS4K
KyAgICB1cGRhdGVHcmFwaGljc0NvbnRleHQoKTsKIH0KIAogdm9pZCBMYXllckNocm9taXVtOjp1
cGRhdGVDb250ZW50cygpCiB7CiAgICAgUmVuZGVyTGF5ZXJCYWNraW5nKiBiYWNraW5nID0gc3Rh
dGljX2Nhc3Q8UmVuZGVyTGF5ZXJCYWNraW5nKj4obV9vd25lci0+Y2xpZW50KCkpOwogCi0gICAg
aWYgKGJhY2tpbmcgJiYgIWJhY2tpbmctPnBhaW50aW5nR29lc1RvV2luZG93KCkpCisgICAgaWYg
KGJhY2tpbmcgJiYgIWJhY2tpbmctPnBhaW50aW5nR29lc1RvV2luZG93KCkgJiYgZHJhd3NDb250
ZW50KCkpCiAgICAgICAgIG1fb3duZXItPnBhaW50R3JhcGhpY3NMYXllckNvbnRlbnRzKCptX2dy
YXBoaWNzQ29udGV4dCwgSW50UmVjdCgwLCAwLCBtX2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5o
ZWlnaHQoKSkpOworCisgICAgbV9jb250ZW50c0RpcnR5ID0gZmFsc2U7CiB9CiAKLXZvaWQgTGF5
ZXJDaHJvbWl1bTo6ZHJhd0RlYnVnQm9yZGVyKCkKK3ZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0Q29u
dGVudHMoTmF0aXZlSW1hZ2VQdHIgY29udGVudHMpCiB7Ci0gICAgbV9ncmFwaGljc0NvbnRleHQt
PnNldFN0cm9rZUNvbG9yKG1fYm9yZGVyQ29sb3IsIERldmljZUNvbG9yU3BhY2UpOwotICAgIG1f
Z3JhcGhpY3NDb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobV9ib3JkZXJXaWR0aCk7Ci0gICAg
bV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBvaW50KDAsIDApLCBJbnRQb2ludChtX2Jv
dW5kcy53aWR0aCgpLCAwKSk7Ci0gICAgbV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBv
aW50KDAsIDApLCBJbnRQb2ludCgwLCBtX2JvdW5kcy5oZWlnaHQoKSkpOwotICAgIG1fZ3JhcGhp
Y3NDb250ZXh0LT5kcmF3TGluZShJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCAwKSwgSW50UG9p
bnQobV9ib3VuZHMud2lkdGgoKSwgbV9ib3VuZHMuaGVpZ2h0KCkpKTsKLSAgICBtX2dyYXBoaWNz
Q29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQoMCwgbV9ib3VuZHMuaGVpZ2h0KCkpLCBJbnRQb2lu
dChtX2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5oZWlnaHQoKSkpOworICAgIC8vIENoZWNrIGlm
IHRoZSBpbWFnZSBoYXMgY2hhbmdlZC4KKyAgICBpZiAobV9jb250ZW50cyA9PSBjb250ZW50cykK
KyAgICAgICAgcmV0dXJuOworICAgIG1fY29udGVudHMgPSBjb250ZW50czsKKyAgICBtX2NvbnRl
bnRzRGlydHkgPSB0cnVlOwogfQogCiB2b2lkIExheWVyQ2hyb21pdW06OnNldE5lZWRzQ29tbWl0
KCkKIHsKICAgICAvLyBDYWxsIG5vdGlmeVN5bmNSZXF1aXJlZCgpLCB3aGljaCBpbiB0aGlzIGlt
cGxlbWVudGF0aW9uIHBsdW1icyB0aHJvdWdoIHRvCi0gICAgLy8gY2FsbCBzZXRSb290TGF5ZXJO
ZWVkc0Rpc3BsYXkoKSBvbiB0aGUgV2ViVmlldywgd2hpY2ggd2lsbCBjYXVzZSBMYXllclJlbmRl
cmVyU2tpYQorICAgIC8vIGNhbGwgc2V0Um9vdExheWVyTmVlZHNEaXNwbGF5KCkgb24gdGhlIFdl
YlZpZXcsIHdoaWNoIHdpbGwgY2F1c2UgTGF5ZXJSZW5kZXJlckNocm9taXVtCiAgICAgLy8gdG8g
cmVuZGVyIGEgZnJhbWUuCiAgICAgaWYgKG1fb3duZXIpCiAgICAgICAgIG1fb3duZXItPm5vdGlm
eVN5bmNSZXF1aXJlZCgpOwpAQCAtMTM3LDE4ICsxNjUsMTYgQEAgdm9pZCBMYXllckNocm9taXVt
OjphZGRTdWJsYXllcihQYXNzUmVmUAogdm9pZCBMYXllckNocm9taXVtOjppbnNlcnRTdWJsYXll
cihQYXNzUmVmUHRyPExheWVyQ2hyb21pdW0+IHN1YmxheWVyLCBzaXplX3QgaW5kZXgpCiB7CiAg
ICAgaW5kZXggPSBtaW4oaW5kZXgsIG1fc3VibGF5ZXJzLnNpemUoKSk7Ci0gICAgbV9zdWJsYXll
cnMuaW5zZXJ0KGluZGV4LCBzdWJsYXllcik7CisgICAgc3VibGF5ZXItPnJlbW92ZUZyb21TdXBl
cmxheWVyKCk7CiAgICAgc3VibGF5ZXItPnNldFN1cGVybGF5ZXIodGhpcyk7CisgICAgbV9zdWJs
YXllcnMuaW5zZXJ0KGluZGV4LCBzdWJsYXllcik7CiAgICAgc2V0TmVlZHNDb21taXQoKTsKIH0K
IAogdm9pZCBMYXllckNocm9taXVtOjpyZW1vdmVGcm9tU3VwZXJsYXllcigpCiB7Ci0gICAgTGF5
ZXJDaHJvbWl1bSogc3VwZXJsYXllciA9IHRoaXMtPnN1cGVybGF5ZXIoKTsKLSAgICBpZiAoIXN1
cGVybGF5ZXIpCi0gICAgICAgIHJldHVybjsKLQotICAgIHN1cGVybGF5ZXItPnJlbW92ZVN1Ymxh
eWVyKHRoaXMpOworICAgIGlmIChtX3N1cGVybGF5ZXIpCisgICAgICAgIG1fc3VwZXJsYXllci0+
cmVtb3ZlU3VibGF5ZXIodGhpcyk7CiB9CiAKIHZvaWQgTGF5ZXJDaHJvbWl1bTo6cmVtb3ZlU3Vi
bGF5ZXIoTGF5ZXJDaHJvbWl1bSogc3VibGF5ZXIpCkBAIC0xNTcsMTEgKzE4MywzMiBAQCB2b2lk
IExheWVyQ2hyb21pdW06OnJlbW92ZVN1YmxheWVyKExheWVyCiAgICAgaWYgKGZvdW5kSW5kZXgg
PT0gLTEpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1fc3VibGF5ZXJzLnJlbW92ZShmb3VuZElu
ZGV4KTsKICAgICBzdWJsYXllci0+c2V0U3VwZXJsYXllcigwKTsKKyAgICBtX3N1YmxheWVycy5y
ZW1vdmUoZm91bmRJbmRleCk7CiAgICAgc2V0TmVlZHNDb21taXQoKTsKIH0KIAordm9pZCBMYXll
ckNocm9taXVtOjpyZXBsYWNlU3VibGF5ZXIoTGF5ZXJDaHJvbWl1bSogcmVmZXJlbmNlLCBQYXNz
UmVmUHRyPExheWVyQ2hyb21pdW0+IG5ld0xheWVyKQoreworICAgIEFTU0VSVF9BUkcocmVmZXJl
bmNlLCByZWZlcmVuY2UpOworICAgIEFTU0VSVF9BUkcocmVmZXJlbmNlLCByZWZlcmVuY2UtPnN1
cGVybGF5ZXIoKSA9PSB0aGlzKTsKKworICAgIGlmIChyZWZlcmVuY2UgPT0gbmV3TGF5ZXIpCisg
ICAgICAgIHJldHVybjsKKworICAgIGludCByZWZlcmVuY2VJbmRleCA9IGluZGV4T2ZTdWJsYXll
cihyZWZlcmVuY2UpOworICAgIEFTU0VSVChyZWZlcmVuY2VJbmRleCAhPSAtMSk7CisgICAgaWYg
KHJlZmVyZW5jZUluZGV4ID09IC0xKQorICAgICAgICByZXR1cm47CisKKyAgICByZWZlcmVuY2Ut
PnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisKKyAgICBpZiAobmV3TGF5ZXIpIHsKKyAgICAgICAg
bmV3TGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgICAgIGluc2VydFN1YmxheWVy
KG5ld0xheWVyLCByZWZlcmVuY2VJbmRleCk7CisgICAgfQorfQorCiBpbnQgTGF5ZXJDaHJvbWl1
bTo6aW5kZXhPZlN1YmxheWVyKGNvbnN0IExheWVyQ2hyb21pdW0qIHJlZmVyZW5jZSkKIHsKICAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3VibGF5ZXJzLnNpemUoKTsgaSsrKSB7CkBAIC0x
NzEsMjggKzIxOCwyOSBAQCBpbnQgTGF5ZXJDaHJvbWl1bTo6aW5kZXhPZlN1YmxheWVyKGNvbnN0
CiAgICAgcmV0dXJuIC0xOwogfQogCi12b2lkIExheWVyQ2hyb21pdW06OnNldEJhY2tpbmdTdG9y
ZVJlY3QoY29uc3QgSW50U2l6ZSYgcmVjdCkKKy8vIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQg
dG8gb3ZlcmlkZSB0aGUgc2l6ZSBvZiB0aGUgYmFja2luZyBzdG9yZQorLy8gdXNlZCBmb3IgdGhl
IGxheWVyLiBJdCdzIHR5cGljYWxseSBjYWxsZWQgb24gdGhlIHJvb3QgbGF5ZXIgdG8gbGltaXQK
Ky8vIGl0cyBzaXplIHRvIHRoZSBhY3R1YWwgdmlzaWJsZSBzaXplLgordm9pZCBMYXllckNocm9t
aXVtOjpzZXRCYWNraW5nU3RvcmVTaXplKGNvbnN0IEludFNpemUmIHNpemUpCiB7Ci0gICAgaWYg
KG1fYmFja2luZ1N0b3JlUmVjdCA9PSByZWN0KQorICAgIGlmIChtX2JhY2tpbmdTdG9yZVNpemUg
PT0gc2l6ZSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgdXBkYXRlR3JhcGhpY3NDb250ZXh0KHJl
Y3QpOworICAgIG1fYmFja2luZ1N0b3JlU2l6ZSA9IHNpemU7CisgICAgdXBkYXRlR3JhcGhpY3ND
b250ZXh0KCk7CisgICAgc2V0TmVlZHNDb21taXQoKTsKIH0KIAotdm9pZCBMYXllckNocm9taXVt
OjpzZXRCb3VuZHMoY29uc3QgSW50U2l6ZSYgcmVjdCkKK3ZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0
Qm91bmRzKGNvbnN0IEludFNpemUmIHNpemUpCiB7Ci0gICAgaWYgKHJlY3QgPT0gbV9ib3VuZHMp
CisgICAgaWYgKG1fYm91bmRzID09IHNpemUpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1fYm91
bmRzID0gcmVjdDsKKyAgICBtX2JvdW5kcyA9IHNpemU7CisgICAgbV9iYWNraW5nU3RvcmVTaXpl
ID0gc2l6ZTsKIAogICAgIC8vIFJlLWNyZWF0ZSB0aGUgY2FudmFzIGFuZCBhc3NvY2lhdGVkIGNv
bnRleHRzLgotICAgIHVwZGF0ZUdyYXBoaWNzQ29udGV4dChtX2JvdW5kcyk7Ci0KLSAgICAvLyBM
YXllciBjb250ZW50cyBuZWVkIHRvIGJlIHJlZHJhd24gYXMgdGhlIGJhY2tpbmcgc3VyZmFjZQot
ICAgIC8vIHdhcyByZWNyZWF0ZWQgYWJvdmUuCi0gICAgdXBkYXRlQ29udGVudHMoKTsKLQorICAg
IHVwZGF0ZUdyYXBoaWNzQ29udGV4dCgpOwogICAgIHNldE5lZWRzQ29tbWl0KCk7CiB9CiAKQEAg
LTIxNCwxOCArMjYyLDIzIEBAIGNvbnN0IExheWVyQ2hyb21pdW0qIExheWVyQ2hyb21pdW06OnJv
b3QKIAogdm9pZCBMYXllckNocm9taXVtOjpyZW1vdmVBbGxTdWJsYXllcnMoKQogewotICAgIG1f
c3VibGF5ZXJzLmNsZWFyKCk7CisgICAgd2hpbGUgKG1fc3VibGF5ZXJzLnNpemUoKSkgeworICAg
ICAgICBMYXllckNocm9taXVtKiBsYXllciA9IG1fc3VibGF5ZXJzWzBdLmdldCgpOworICAgICAg
ICBBU1NFUlQobGF5ZXItPnN1cGVybGF5ZXIoKSk7CisgICAgICAgIGxheWVyLT5yZW1vdmVGcm9t
U3VwZXJsYXllcigpOworICAgIH0KICAgICBzZXROZWVkc0NvbW1pdCgpOwogfQogCiB2b2lkIExh
eWVyQ2hyb21pdW06OnNldFN1YmxheWVycyhjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyQ2hyb21p
dW0+ID4mIHN1YmxheWVycykKIHsKLSAgICBtX3N1YmxheWVycyA9IHN1YmxheWVyczsKLX0KKyAg
ICBpZiAoc3VibGF5ZXJzID09IG1fc3VibGF5ZXJzKQorICAgICAgICByZXR1cm47CiAKLXZvaWQg
TGF5ZXJDaHJvbWl1bTo6c2V0U3VwZXJsYXllcihMYXllckNocm9taXVtKiBzdXBlcmxheWVyKQot
ewotICAgIG1fc3VwZXJsYXllciA9IHN1cGVybGF5ZXI7CisgICAgcmVtb3ZlQWxsU3VibGF5ZXJz
KCk7CisgICAgc2l6ZV90IGxpc3RTaXplID0gc3VibGF5ZXJzLnNpemUoKTsKKyAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspCisgICAgICAgIGFkZFN1YmxheWVyKHN1Ymxh
eWVyc1tpXSk7CiB9CiAKIExheWVyQ2hyb21pdW0qIExheWVyQ2hyb21pdW06OnN1cGVybGF5ZXIo
KSBjb25zdApAQCAtMjM1LDggKzI4OCwxMSBAQCBMYXllckNocm9taXVtKiBMYXllckNocm9taXVt
OjpzdXBlcmxheWVyCiAKIHZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0TmVlZHNEaXNwbGF5KGNvbnN0
IEZsb2F0UmVjdCYgZGlydHlSZWN0KQogewotICAgIC8vIFJlZHJhdyB0aGUgY29udGVudHMgb2Yg
dGhlIGxheWVyLgotICAgIHVwZGF0ZUNvbnRlbnRzKCk7CisgICAgLy8gU2ltcGx5IG1hcmsgdGhl
IGNvbnRlbnRzIGFzIGRpcnR5LiBUaGUgYWN0dWFsIHJlZHJhdyB3aWxsCisgICAgLy8gaGFwcGVu
IHdoZW4gaXQncyB0aW1lIHRvIGRvIHRoZSBjb21wb3NpdGluZy4KKyAgICAvLyBGSVhNRTogU2hv
dWxkIG9ubHkgdXBkYXRlIHRoZSBkaXJ0eSByZWN0IGluc3RlYWQgb2YgbWFya2luZworICAgIC8v
ICAgICAgICB0aGUgZW50aXJlIGxheWVyIGRpcnR5LgorICAgIG1fY29udGVudHNEaXJ0eSA9IHRy
dWU7CiAKICAgICBzZXROZWVkc0NvbW1pdCgpOwogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgJKHJldmlzaW9uIDU5MTc0
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTY3LDYgKzY3LDcgQEAgcHVibGljOgogCiAgICAgdm9pZCBhZGRT
dWJsYXllcihQYXNzUmVmUHRyPExheWVyQ2hyb21pdW0+KTsKICAgICB2b2lkIGluc2VydFN1Ymxh
eWVyKFBhc3NSZWZQdHI8TGF5ZXJDaHJvbWl1bT4sIHNpemVfdCBpbmRleCk7CisgICAgdm9pZCBy
ZXBsYWNlU3VibGF5ZXIoTGF5ZXJDaHJvbWl1bSogcmVmZXJlbmNlLCBQYXNzUmVmUHRyPExheWVy
Q2hyb21pdW0+IG5ld0xheWVyKTsKICAgICB2b2lkIHJlbW92ZUZyb21TdXBlcmxheWVyKCk7CiAK
ICAgICB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQmIGFuY2hvclBvaW50KSB7
IG1fYW5jaG9yUG9pbnQgPSBhbmNob3JQb2ludDsgc2V0TmVlZHNDb21taXQoKTsgfQpAQCAtMTQw
LDEwICsxNDEsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRTdWJsYXllclRyYW5zZm9ybShjb25z
dCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtKSB7IG1fc3VibGF5ZXJUcmFuc2Zvcm0g
PSB0cmFuc2Zvcm07IHNldE5lZWRzQ29tbWl0KCk7IH0KICAgICBjb25zdCBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCYgc3VibGF5ZXJUcmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX3N1YmxheWVyVHJh
bnNmb3JtOyB9CiAKLSAgICB2b2lkIHNldFN1cGVybGF5ZXIoTGF5ZXJDaHJvbWl1bSogc3VwZXJs
YXllcik7CiAgICAgTGF5ZXJDaHJvbWl1bSogc3VwZXJsYXllcigpIGNvbnN0OwogCi0KICAgICB2
b2lkIHNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtKSB7
IG1fdHJhbnNmb3JtID0gdHJhbnNmb3JtOyBzZXROZWVkc0NvbW1pdCgpOyB9CiAgICAgY29uc3Qg
VHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fdHJhbnNm
b3JtOyB9CiAKQEAgLTE1MSwxOSArMTUwLDMwIEBAIHB1YmxpYzoKICAgICBib29sIGdlb21ldHJ5
RmxpcHBlZCgpIGNvbnN0IHsgcmV0dXJuIG1fZ2VvbWV0cnlGbGlwcGVkOyB9CiAKICAgICB2b2lk
IHVwZGF0ZUNvbnRlbnRzKCk7CisgICAgYm9vbCBjb250ZW50c0RpcnR5KCkgeyByZXR1cm4gbV9j
b250ZW50c0RpcnR5OyB9CisKKyAgICB2b2lkIHNldENvbnRlbnRzKE5hdGl2ZUltYWdlUHRyIGNv
bnRlbnRzKTsKKyAgICBOYXRpdmVJbWFnZVB0ciBjb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIG1f
Y29udGVudHM7IH0KIAogICAgIHNraWE6OlBsYXRmb3JtQ2FudmFzKiBwbGF0Zm9ybUNhbnZhcygp
IHsgcmV0dXJuIG1fY2FudmFzLmdldCgpOyB9CiAgICAgR3JhcGhpY3NDb250ZXh0KiBncmFwaGlj
c0NvbnRleHQoKSB7IHJldHVybiBtX2dyYXBoaWNzQ29udGV4dC5nZXQoKTsgfQogCi0gICAgdm9p
ZCBzZXRCYWNraW5nU3RvcmVSZWN0KGNvbnN0IEludFNpemUmKTsKKyAgICB2b2lkIHNldEJhY2tp
bmdTdG9yZVNpemUoY29uc3QgSW50U2l6ZSYpOwogCi0gICAgdm9pZCBkcmF3RGVidWdCb3JkZXIo
KTsKKyAgICBib29sIGRyYXdzQ29udGVudCgpIHsgcmV0dXJuIG1fb3duZXIgJiYgbV9vd25lci0+
ZHJhd3NDb250ZW50KCk7IH0KKworICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQg
ZXZlcnkgdGltZSB0aGUgc3RhdHVzIGRyYXdzQ29udGVudCgpCisgICAgLy8gc3RhdHVzIGNoYW5n
ZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGludGVybmFsIGdyYXBoaWNzIGNvbnRleHQgaXMgaW4gc3lu
Yy4KKyAgICB2b2lkIGRyYXdzQ29udGVudFVwZGF0ZWQoKTsKIAogcHJpdmF0ZToKICAgICBMYXll
ckNocm9taXVtKExheWVyVHlwZSwgR3JhcGhpY3NMYXllckNocm9taXVtKiBvd25lcik7CiAKICAg
ICB2b2lkIHNldE5lZWRzQ29tbWl0KCk7CiAKKyAgICB2b2lkIHNldFN1cGVybGF5ZXIoTGF5ZXJD
aHJvbWl1bSogc3VwZXJsYXllcikgeyBtX3N1cGVybGF5ZXIgPSBzdXBlcmxheWVyOyB9CisKKwog
ICAgIHZvaWQgcGFpbnRNZSgpOwogCiAgICAgc2l6ZV90IG51bVN1YmxheWVycygpIGNvbnN0CkBA
IC0xNzcsMjIgKzE4NywyNiBAQCBwcml2YXRlOgogICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUg
Y2FsbGVkIGZyb20gcmVtb3ZlRnJvbVN1cGVybGF5ZXIuCiAgICAgdm9pZCByZW1vdmVTdWJsYXll
cihMYXllckNocm9taXVtKik7CiAKLSAgICAvLyBSZS1jcmVhdGUgdGhlIGNhbnZhcyBhbmQgZ3Jh
cGhpY3MgY29udGV4dC4gVGhpcyBtZXRob2QKLSAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0
aW1lIHRoZSBsYXllciBpcyByZXNpemVkLgotICAgIHZvaWQgdXBkYXRlR3JhcGhpY3NDb250ZXh0
KGNvbnN0IEludFNpemUmKTsKKyAgICAvLyBSZS1jcmVhdGVzIHRoZSBjYW52YXMgYW5kIGdyYXBo
aWNzIGNvbnRleHQuIFRoaXMgbWV0aG9kCisgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGlt
ZSB0aGUgbGF5ZXIgaXMgcmVzaXplZC4gT25seSBsYXllcnMKKyAgICAvLyB0aGF0IGRvIGRyYXdp
bmcgYW5kIHRoZSByb290IGxheWVyIGdldCBhIGNvbnRleHQuCisgICAgdm9pZCB1cGRhdGVHcmFw
aGljc0NvbnRleHQoKTsKIAogICAgIFZlY3RvcjxSZWZQdHI8TGF5ZXJDaHJvbWl1bT4gPiBtX3N1
YmxheWVyczsKICAgICBMYXllckNocm9taXVtKiBtX3N1cGVybGF5ZXI7CiAKICAgICBHcmFwaGlj
c0xheWVyQ2hyb21pdW0qIG1fb3duZXI7CisjaWYgUExBVEZPUk0oU0tJQSkKICAgICBPd25QdHI8
c2tpYTo6UGxhdGZvcm1DYW52YXM+IG1fY2FudmFzOwogICAgIE93blB0cjxQbGF0Zm9ybUNvbnRl
eHRTa2lhPiBtX3NraWFDb250ZXh0OwogICAgIE93blB0cjxHcmFwaGljc0NvbnRleHQ+IG1fZ3Jh
cGhpY3NDb250ZXh0OworI2VuZGlmCisgICAgYm9vbCBtX2hhc0NvbnRleHQ7CiAKICAgICBMYXll
clR5cGUgbV9sYXllclR5cGU7CiAKICAgICBJbnRTaXplIG1fYm91bmRzOwotICAgIEludFNpemUg
bV9iYWNraW5nU3RvcmVSZWN0OworICAgIEludFNpemUgbV9iYWNraW5nU3RvcmVTaXplOwogICAg
IEZsb2F0UG9pbnQgbV9wb3NpdGlvbjsKICAgICBGbG9hdFBvaW50IG1fYW5jaG9yUG9pbnQ7CiAg
ICAgQ29sb3IgbV9iYWNrZ3JvdW5kQ29sb3I7CkBAIC0yMTYsNyArMjMwLDEwIEBAIHByaXZhdGU6
CiAgICAgYm9vbCBtX2dlb21ldHJ5RmxpcHBlZDsKICAgICBib29sIG1fbmVlZHNEaXNwbGF5T25C
b3VuZHNDaGFuZ2U7CiAKKyAgICBib29sIG1fY29udGVudHNEaXJ0eTsKKwogICAgIENvbnRlbnRz
R3Jhdml0eVR5cGUgbV9jb250ZW50c0dyYXZpdHk7CisgICAgTmF0aXZlSW1hZ2VQdHIgbV9jb250
ZW50czsKICAgICBTdHJpbmcgbV9uYW1lOwogfTsKIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVt
LmNwcAkocmV2aXNpb24gNTkxNzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDEwNSAr
MzQsNjkyIEBACiAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQogI2luY2x1ZGUgIkxh
eWVyUmVuZGVyZXJDaHJvbWl1bS5oIgogCisjaW5jbHVkZSAiR0xFUzJDb250ZXh0LmgiCiAjaW5j
bHVkZSAiTGF5ZXJDaHJvbWl1bS5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5j
bHVkZSAiUGFnZS5oIgorI2lmIFBMQVRGT1JNKFNLSUEpCisjaW5jbHVkZSAiTmF0aXZlSW1hZ2VT
a2lhLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5oIgotI2luY2x1ZGUgInNraWEv
ZXh0L3BsYXRmb3JtX2NhbnZhcy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4K
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1QYXNzT3duUHRyPExheWVyUmVuZGVyZXJDaHJvbWl1
bT4gTGF5ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUoKQorc3RhdGljIFdURkxvZ0NoYW5uZWwg
TG9nTGF5ZXJSZW5kZXJlciA9IHsgMHgwMDAwMDAwMCwgIkxheWVyUmVuZGVyZXIiLCBXVEZMb2dD
aGFubmVsT24gfTsKKworc3RhdGljIHZvaWQgY2hlY2tHTEVycm9yKCkgeworI2lmbmRlZiBOREVC
VUcKKyAgICBHTGVudW0gZXJyb3IgPSBnbEdldEVycm9yKCk7CisgICAgaWYgKGVycm9yKQorICAg
ICAgICBMT0dfRVJST1IoIkdMIEVycm9yOiAlZCAiICwgZXJyb3IpOworI2VuZGlmCit9CisKK3N0
YXRpYyBHTHVpbnQgY3JlYXRlVGV4dHVyZU9iamVjdChHTGVudW0gdGFyZ2V0KQoreworICAgIEdM
dWludCB0ZXh0dXJlID0gMDsKKyAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlKTsKKyAgICBn
bEJpbmRUZXh0dXJlKHRhcmdldCwgdGV4dHVyZSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJmKHRhcmdl
dCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBnbFRleFBhcmFtZXRl
cmYodGFyZ2V0LCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOworICAgIHJldHVy
biB0ZXh0dXJlOworfQorCitzdGF0aWMgR0x1aW50IGxvYWRTaGFkZXIoR0xlbnVtIHR5cGUsIGNv
bnN0IGNoYXIqIHNoYWRlclNvdXJjZSkKK3sKKyAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVT
aGFkZXIodHlwZSk7CisgICAgaWYgKHNoYWRlciA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAg
ICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZzaGFkZXJTb3VyY2UsIE5VTEwpOworICAgIGds
Q29tcGlsZVNoYWRlcihzaGFkZXIpOworICAgIEdMaW50IGNvbXBpbGVkOworICAgIGdsR2V0U2hh
ZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKKyAgICBpZiAoIWNv
bXBpbGVkKSB7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgICAgIHJldHVy
biAwOworICAgIH0KKyAgICByZXR1cm4gc2hhZGVyOworfQorCitzdGF0aWMgR0x1aW50IGxvYWRT
aGFkZXJQcm9ncmFtKGNvbnN0IGNoYXIqIHZlcnRleFNoYWRlclNvdXJjZSwgY29uc3QgY2hhciog
ZnJhZ21lbnRTaGFkZXJTb3VyY2UpCit7CisgICAgR0x1aW50IHZlcnRleFNoYWRlcjsKKyAgICBH
THVpbnQgZnJhZ21lbnRTaGFkZXI7CisgICAgR0x1aW50IHByb2dyYW1PYmplY3Q7CisgICAgR0xp
bnQgbGlua2VkOworICAgIHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURF
UiwgdmVydGV4U2hhZGVyU291cmNlKTsKKyAgICBpZiAoIHZlcnRleFNoYWRlciA9PSAwICkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgZnJhZ21lbnRTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX0ZSQUdN
RU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOworICAgIGlmIChmcmFnbWVudFNoYWRl
ciA9PSAwKSB7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgICAg
IHJldHVybiAwOworICAgIH0KKyAgICBwcm9ncmFtT2JqZWN0ID0gZ2xDcmVhdGVQcm9ncmFtKCk7
CisgICAgaWYgKHByb2dyYW1PYmplY3QgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZ2xB
dHRhY2hTaGFkZXIocHJvZ3JhbU9iamVjdCwgdmVydGV4U2hhZGVyKTsKKyAgICBnbEF0dGFjaFNo
YWRlcihwcm9ncmFtT2JqZWN0LCBmcmFnbWVudFNoYWRlcik7CisgICAgZ2xMaW5rUHJvZ3JhbShw
cm9ncmFtT2JqZWN0KTsKKyAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtT2JqZWN0LCBHTF9MSU5L
X1NUQVRVUywgJmxpbmtlZCk7CisgICAgaWYgKCFsaW5rZWQpIHsKKyAgICAgICAgZ2xEZWxldGVQ
cm9ncmFtKHByb2dyYW1PYmplY3QpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZ2xE
ZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKKyAgICBnbERlbGV0ZVNoYWRlcihmcmFnbWVudFNo
YWRlcik7CisgICAgcmV0dXJuIHByb2dyYW1PYmplY3Q7Cit9CisKK3N0YXRpYyB2b2lkIHRvR0xN
YXRyaXgoZmxvYXQqIGZsYXR0ZW5lZCwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG0pCiB7
Ci0gICAgcmV0dXJuIG5ldyBMYXllclJlbmRlcmVyQ2hyb21pdW0oKTsKKyAgICBmbGF0dGVuZWRb
MF0gPSBtLm0xMSgpOworICAgIGZsYXR0ZW5lZFsxXSA9IG0ubTEyKCk7CisgICAgZmxhdHRlbmVk
WzJdID0gbS5tMTMoKTsKKyAgICBmbGF0dGVuZWRbM10gPSBtLm0xNCgpOworICAgIGZsYXR0ZW5l
ZFs0XSA9IG0ubTIxKCk7CisgICAgZmxhdHRlbmVkWzVdID0gbS5tMjIoKTsKKyAgICBmbGF0dGVu
ZWRbNl0gPSBtLm0yMygpOworICAgIGZsYXR0ZW5lZFs3XSA9IG0ubTI0KCk7CisgICAgZmxhdHRl
bmVkWzhdID0gbS5tMzEoKTsKKyAgICBmbGF0dGVuZWRbOV0gPSBtLm0zMigpOworICAgIGZsYXR0
ZW5lZFsxMF0gPSBtLm0zMygpOworICAgIGZsYXR0ZW5lZFsxMV0gPSBtLm0zNCgpOworICAgIGZs
YXR0ZW5lZFsxMl0gPSBtLm00MSgpOworICAgIGZsYXR0ZW5lZFsxM10gPSBtLm00MigpOworICAg
IGZsYXR0ZW5lZFsxNF0gPSBtLm00MygpOworICAgIGZsYXR0ZW5lZFsxNV0gPSBtLm00NCgpOwog
fQogCi1MYXllclJlbmRlcmVyQ2hyb21pdW06OkxheWVyUmVuZGVyZXJDaHJvbWl1bSgpCitzdGF0
aWMgVHJhbnNmb3JtYXRpb25NYXRyaXggb3J0aG9NYXRyaXgoZmxvYXQgbGVmdCwgZmxvYXQgcmln
aHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyWiwgZmxvYXQgZmFyWikKK3sK
KyAgICBmbG9hdCBkZWx0YVggPSByaWdodCAtIGxlZnQ7CisgICAgZmxvYXQgZGVsdGFZID0gdG9w
IC0gYm90dG9tOworICAgIGZsb2F0IGRlbHRhWiA9IGZhclogLSBuZWFyWjsKKyAgICBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCBvcnRobzsKKyAgICBpZiAoKGRlbHRhWCA9PSAwKSB8fCAoZGVsdGFZID09
IDApIHx8IChkZWx0YVogPT0gMCkpCisgICAgICAgIHJldHVybiBvcnRobzsKKyAgICBvcnRoby5z
ZXRNMTEoMi4wZiAvIGRlbHRhWCk7CisgICAgb3J0aG8uc2V0TTQxKC0ocmlnaHQgKyBsZWZ0KSAv
IGRlbHRhWCk7CisgICAgb3J0aG8uc2V0TTIyKDIuMGYgLyBkZWx0YVkpOworICAgIG9ydGhvLnNl
dE00MigtKHRvcCArIGJvdHRvbSkgLyBkZWx0YVkpOworICAgIG9ydGhvLnNldE0zMygtMi4wZiAv
IGRlbHRhWik7CisgICAgb3J0aG8uc2V0TTQzKC0obmVhclogKyBmYXJaKSAvIGRlbHRhWik7Cisg
ICAgcmV0dXJuIG9ydGhvOworfQorCisvLyBDcmVhdGVzIGEgR0wgdGV4dHVyZSBvYmplY3QgdG8g
YmUgdXNlZCBmb3IgdHJhbnNmZXJpbmcgdGhlIGxheWVyJ3MgYml0bWFwIGludG8uCitzdGF0aWMg
R0x1aW50IGNyZWF0ZUxheWVyVGV4dHVyZSgpCit7CisgICAgR0x1aW50IHRleHR1cmVJZCA9IDA7
CisgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZUlkKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdM
X1RFWFRVUkVfMkQsIHRleHR1cmVJZCk7CisgICAgLy8gRG8gYmFzaWMgbGluZWFyIGZpbHRlcmlu
ZyBvbiByZXNpemUuCisgICAgZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRV
UkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVS
RV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIC8vIE5QT1QgdGV4
dHVyZXMgaW4gR0wgRVMgb25seSB3b3JrIHdoZW4gdGhlIHdyYXAgbW9kZSBpcyBzZXQgdG8gR0xf
Q0xBTVBfVE9fRURHRS4KKyAgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVY
VFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1ldGVyZihHTF9U
RVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgcmV0
dXJuIHRleHR1cmVJZDsKK30KKworCitQYXNzT3duUHRyPExheWVyUmVuZGVyZXJDaHJvbWl1bT4g
TGF5ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUoUGFnZSogcGFnZSkKK3sKKyAgICByZXR1cm4g
bmV3IExheWVyUmVuZGVyZXJDaHJvbWl1bShwYWdlKTsKK30KKworTGF5ZXJSZW5kZXJlckNocm9t
aXVtOjpMYXllclJlbmRlcmVyQ2hyb21pdW0oUGFnZSogcGFnZSkKICAgICA6IG1fcm9vdExheWVy
KDApCiAgICAgLCBtX25lZWRzRGlzcGxheShmYWxzZSkKKyAgICAsIG1fbGF5ZXJQcm9ncmFtT2Jq
ZWN0KDApCisgICAgLCBtX2JvcmRlclByb2dyYW1PYmplY3QoMCkKKyAgICAsIG1fc2Nyb2xsUHJv
Z3JhbU9iamVjdCgwKQorICAgICwgbV9wb3NpdGlvbkxvY2F0aW9uKDApCisgICAgLCBtX3RleENv
b3JkTG9jYXRpb24oMSkKKyAgICAsIG1fcGFnZShwYWdlKQorICAgICwgbV9yb290TGF5ZXJUZXh0
dXJlV2lkdGgoMCkKKyAgICAsIG1fcm9vdExheWVyVGV4dHVyZUhlaWdodCgwKQogeworICAgIG1f
cXVhZFZib0lkc1tWZXJ0aWNlc10gPSBtX3F1YWRWYm9JZHNbTGF5ZXJFbGVtZW50c10gPSAwOwor
ICAgIG1faGFyZHdhcmVDb21wb3NpdGluZyA9IChpbml0R0woKSAmJiBpbml0aWFsaXplU2hhcmVk
R0xPYmplY3RzKCkpOwogfQogCiBMYXllclJlbmRlcmVyQ2hyb21pdW06On5MYXllclJlbmRlcmVy
Q2hyb21pdW0oKQogeworICAgIGlmIChtX2hhcmR3YXJlQ29tcG9zaXRpbmcpIHsKKyAgICAgICAg
bWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgICAgIGdsRGVsZXRlQnVmZmVycygzLCBtX3F1YWRW
Ym9JZHMpOworICAgICAgICBnbERlbGV0ZVByb2dyYW0obV9sYXllclByb2dyYW1PYmplY3QpOwor
ICAgICAgICBnbERlbGV0ZVByb2dyYW0obV9zY3JvbGxQcm9ncmFtT2JqZWN0KTsKKyAgICAgICAg
Z2xEZWxldGVQcm9ncmFtKG1fYm9yZGVyUHJvZ3JhbU9iamVjdCk7CisgICAgfQogfQogCi12b2lk
IExheWVyUmVuZGVyZXJDaHJvbWl1bTo6dXBkYXRlTGF5ZXJDb250ZW50cygpCit2b2lkIExheWVy
UmVuZGVyZXJDaHJvbWl1bTo6ZHJhd1RleHR1cmVkUXVhZChjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgbWF0cml4LCBmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBvcGFjaXR5LCBi
b29sIHNjcm9sbGluZykKIHsKLSAgICBpZiAobV9yb290TGF5ZXIpCi0gICAgICAgIHVwZGF0ZUxh
eWVyQ29udGVudHNSZWN1cnNpdmUobV9yb290TGF5ZXIuZ2V0KCkpOworICAgIHN0YXRpYyBHTGZs
b2F0IGdsTWF0cml4WzE2XTsKKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlbmRlck1hdHJp
eCA9IG1hdHJpeDsKKworICAgIC8vIEFwcGx5IGEgc2NhbGluZyBmYWN0b3IgdG8gc2l6ZSB0aGUg
cXVhZCBmcm9tIDF4MSB0byBpdHMgaW50ZW5kZWQgc2l6ZS4KKyAgICByZW5kZXJNYXRyaXguc2Nh
bGUzZCh3aWR0aCwgaGVpZ2h0LCAxKTsKKworICAgIC8vIEFwcGx5IHRoZSBwcm9qZWN0aW9uIG1h
dHJpeCBiZWZvcmUgc2VuZGluZyB0aGUgdHJhbnNmb3JtIG92ZXIgdG8gdGhlIHNoYWRlci4KKyAg
ICByZW5kZXJNYXRyaXgubXVsdGlwbHkobV9wcm9qZWN0aW9uTWF0cml4KTsKKworICAgIEZsb2F0
UG9pbnQzRCB0ZXN0MSA9IHJlbmRlck1hdHJpeC5tYXBQb2ludChGbG9hdFBvaW50M0QoLTAuNSwg
MC41LCAwKSk7CisgICAgRmxvYXRQb2ludDNEIHRlc3QyID0gcmVuZGVyTWF0cml4Lm1hcFBvaW50
KEZsb2F0UG9pbnQzRCgwLjUsIC0wLjUsIDApKTsKKworICAgIHRvR0xNYXRyaXgoJmdsTWF0cml4
WzBdLCByZW5kZXJNYXRyaXgpOworCisgICAgaW50IG1hdHJpeExvY2F0aW9uID0gKHNjcm9sbGlu
ZyA/IG1fc2Nyb2xsTWF0cml4TG9jYXRpb24gOiBtX21hdHJpeExvY2F0aW9uKTsKKyAgICBnbFVu
aWZvcm1NYXRyaXg0ZnYobWF0cml4TG9jYXRpb24sIDEsIGZhbHNlLCAmZ2xNYXRyaXhbMF0pOwor
CisgICAgaWYgKCFzY3JvbGxpbmcpCisgICAgICAgIGdsVW5pZm9ybTFmKG1fYWxwaGFMb2NhdGlv
biwgb3BhY2l0eSk7CisKKyAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIDYsIEdMX1VO
U0lHTkVEX1NIT1JULCAwKTsKIH0KIAotI2lmIFBMQVRGT1JNKFNLSUEpCi12b2lkIExheWVyUmVu
ZGVyZXJDaHJvbWl1bTo6ZHJhd0xheWVyc0luQ2FudmFzKHNraWE6OlBsYXRmb3JtQ2FudmFzKiBj
YW52YXMsIGNvbnN0IEludFJlY3QmIGNsaXBSZWN0KQorCisvLyBVcGRhdGVzIHRoZSBjb250ZW50
cyBvZiB0aGUgcm9vdCBsYXllciB0ZXh0dXJlIHRoYXQgZmFsbCBpbnNpZGUgdGhlIHVwZGF0ZVJl
Y3QKKy8vIGFuZCByZS1jb21wb3NpdHMgYWxsIHN1YmxheWVycy4KK3ZvaWQgTGF5ZXJSZW5kZXJl
ckNocm9taXVtOjpkcmF3TGF5ZXJzKGNvbnN0IEludFJlY3QmIHVwZGF0ZVJlY3QsIGNvbnN0IElu
dFJlY3QmIHZpc2libGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QsIGNvbnN0IEludFBvaW50JiBzY3JvbGxQb3Np
dGlvbikKIHsKKyAgICBBU1NFUlQobV9oYXJkd2FyZUNvbXBvc2l0aW5nKTsKKwogICAgIGlmICgh
bV9yb290TGF5ZXIpCiAgICAgICAgIHJldHVybjsKIAotICAgIGNhbnZhcy0+c2F2ZSgpOwotICAg
IGNhbnZhcy0+Y2xpcFJlY3QoU2tSZWN0KGNsaXBSZWN0KSk7CisgICAgLy8gSWYgdGhlIHNpemUg
b2YgdGhlIHZpc2libGUgYXJlYSBoYXMgY2hhbmdlZCB0aGVuIGFsbG9jYXRlIGEgbmV3IHRleHR1
cmUKKyAgICAvLyB0byBzdG9yZSB0aGUgY29udGVudHMgb2YgdGhlIHJvb3QgbGF5ZXIgYW5kIGFk
anVzdCB0aGUgcHJvamVjdGlvbiBtYXRyaXgKKyAgICAvLyBhbmQgdmlld3BvcnQuCisgICAgbWFr
ZUNvbnRleHRDdXJyZW50KCk7CisKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1f
cm9vdExheWVyVGV4dHVyZUlkKTsKKworICAgIHVuc2lnbmVkIGludCB2aXNpYmxlUmVjdFdpZHRo
ID0gdmlzaWJsZVJlY3Qud2lkdGgoKTsKKyAgICB1bnNpZ25lZCBpbnQgdmlzaWJsZVJlY3RIZWln
aHQgPSB2aXNpYmxlUmVjdC5oZWlnaHQoKTsKKyAgICBpZiAodmlzaWJsZVJlY3RXaWR0aCAhPSBt
X3Jvb3RMYXllclRleHR1cmVXaWR0aCB8fCB2aXNpYmxlUmVjdEhlaWdodCAhPSBtX3Jvb3RMYXll
clRleHR1cmVIZWlnaHQpIHsKKyAgICAgICAgbV9yb290TGF5ZXJUZXh0dXJlV2lkdGggPSB2aXNp
YmxlUmVjdC53aWR0aCgpOworICAgICAgICBtX3Jvb3RMYXllclRleHR1cmVIZWlnaHQgPSB2aXNp
YmxlUmVjdC5oZWlnaHQoKTsKKworICAgICAgICBtX3Byb2plY3Rpb25NYXRyaXggPSBvcnRob01h
dHJpeCgwLCB2aXNpYmxlUmVjdFdpZHRoICsgMC41LCB2aXNpYmxlUmVjdEhlaWdodCArIDAuNSwg
MCwgLTEwMDAsIDEwMDApOworICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwg
R0xfUkdCQSwgbV9yb290TGF5ZXJUZXh0dXJlV2lkdGgsIG1fcm9vdExheWVyVGV4dHVyZUhlaWdo
dCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgMCk7CisgICAgfQorCisgICAgLy8gVGhl
IEdMIHZpZXdwb3J0IGNvdmVycyB0aGUgZW50aXJlIHZpc2libGUgYXJlYSwgaW5jbHVkaW5nIHRo
ZSBzY3JvbGxiYXJzLgorICAgIGdsVmlld3BvcnQoMCwgMCwgdmlzaWJsZVJlY3RXaWR0aCwgdmlz
aWJsZVJlY3RIZWlnaHQpOworCisgICAgLy8gVGhlIGxheWVyLCBzY3JvbGwgYW5kIGRlYnVnIGJv
cmRlciBzaGFkZXJzIGFsbCB1c2UgdGhlIHNhbWUgdmVydGV4IGF0dHJpYnV0ZXMKKyAgICAvLyBz
byB3ZSBjYW4gYmluZCB0aGVtIG9ubHkgb25jZS4KKyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlf
QlVGRkVSLCBtX3F1YWRWYm9JZHNbVmVydGljZXNdKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxF
TUVOVF9BUlJBWV9CVUZGRVIsIG1fcXVhZFZib0lkc1tMYXllckVsZW1lbnRzXSk7CisgICAgR0x1
aW50IG9mZnNldCA9IDA7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1fcG9zaXRpb25Mb2Nh
dGlvbiwgMywgR0xfRkxPQVQsIEdMX0ZBTFNFLCA1ICogc2l6ZW9mKEdMZmxvYXQpLCAoR0x2b2lk
Kikob2Zmc2V0KSk7CisgICAgb2Zmc2V0Kz0gMyAqIHNpemVvZihHTGZsb2F0KTsKKyAgICBnbFZl
cnRleEF0dHJpYlBvaW50ZXIobV90ZXhDb29yZExvY2F0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFM
U0UsIDUgKiBzaXplb2YoR0xmbG9hdCksIChHTHZvaWQqKShvZmZzZXQpKTsKKyAgICBnbEVuYWJs
ZVZlcnRleEF0dHJpYkFycmF5KG1fcG9zaXRpb25Mb2NhdGlvbik7CisgICAgZ2xFbmFibGVWZXJ0
ZXhBdHRyaWJBcnJheShtX3RleENvb3JkTG9jYXRpb24pOworICAgIGdsQWN0aXZlVGV4dHVyZShH
TF9URVhUVVJFMCk7CisgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIGdsRGlzYWJs
ZShHTF9DVUxMX0ZBQ0UpOworCisgICAgSW50UG9pbnQgc2Nyb2xsRGVsdGEgPSB0b1BvaW50KHNj
cm9sbFBvc2l0aW9uIC0gbV9zY3JvbGxQb3NpdGlvbik7CisgICAgLy8gU2Nyb2xsIG9ubHkgd2hl
biB0aGUgdXBkYXRlUmVjdCBjb250YWlucyBwaXhlbHMgZm9yIHRoZSBuZXdseSB1bmNvdmVyZWQg
cmVnaW9uIHRvIGF2b2lkIGZsYXNoaW5nLgorICAgIGlmICgoc2Nyb2xsRGVsdGEueCgpICE9IDAg
JiYgdXBkYXRlUmVjdC53aWR0aCgpID49IGFicyhzY3JvbGxEZWx0YS54KCkpICYmIHVwZGF0ZVJl
Y3QuaGVpZ2h0KCkgPj0gY29udGVudFJlY3QuaGVpZ2h0KCkpIHx8IAorICAgICAgICAoc2Nyb2xs
RGVsdGEueSgpICE9IDAgJiYgdXBkYXRlUmVjdC5oZWlnaHQoKSA+PSBhYnMoc2Nyb2xsRGVsdGEu
eSgpKSAmJiB1cGRhdGVSZWN0LndpZHRoKCkgPj0gY29udGVudFJlY3Qud2lkdGgoKSkpIHsKKyAg
ICAgICAgICAgIC8vIFNjcm9sbGluZyB3b3JrcyBhcyBmb2xsb3dzOiBXZSByZW5kZXIgYSBxdWFk
IHdpdGggdGhlIGN1cnJlbnQgcm9vdCBsYXllciBjb250ZW50cworICAgICAgICAgICAgLy8gdHJh
bnNsYXRlZCBieSB0aGUgYW1vdW50IHRoZSBwYWdlIGhhcyBzY3JvbGxlZCBzaW5jZSB0aGUgbGFz
dCB1cGRhdGUgYW5kIHRoZW4gcmVhZCB0aGUKKyAgICAgICAgICAgIC8vIHBpeGVscyBvZiB0aGUg
Y29udGVudCBhcmVhICh2aXNpYmxlIGFyZWEgZXhjbHVkaW5nIHRoZSBzY3JvbGwgYmFycykgYmFj
ayBpbnRvIHRoZQorICAgICAgICAgICAgLy8gcm9vdCBsYXllciB0ZXh0dXJlLiBUaGUgbmV3bHkg
ZXhwb3NlZCBhcmVhIGlzIHN1YmVzcXVlbnRseSBmaWxsZWQgYXMgdXN1YWwgd2l0aAorICAgICAg
ICAgICAgLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSB1cGRhdGVSZWN0LgorICAgICAgICAgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggc2Nyb2xsZWRMYXllck1hdHJpeDsKKyAgICAgICAgICAgIHNjcm9s
bGVkTGF5ZXJNYXRyaXgudHJhbnNsYXRlM2QoKGludClmbG9vcmYoMC41ICogdmlzaWJsZVJlY3Qu
d2lkdGgoKSArIDAuNSkgLSBzY3JvbGxEZWx0YS54KCksCisgICAgICAgICAgICAgICAgKGludClm
bG9vcmYoMC41ICogdmlzaWJsZVJlY3QuaGVpZ2h0KCkgKyAwLjUpICsgc2Nyb2xsRGVsdGEueSgp
LCAwKTsKKyAgICAgICAgICAgIHNjcm9sbGVkTGF5ZXJNYXRyaXguc2NhbGUzZCgxLCAtMSwgMSk7
CisKKyAgICAgICAgICAgIC8vIFN3aXRjaCBzaGFkZXJzIHRvIGF2b2lkIFJHQiBzd2l6emxpbmcu
CisgICAgICAgICAgICBnbFVzZVByb2dyYW0obV9zY3JvbGxQcm9ncmFtT2JqZWN0KTsKKyAgICAg
ICAgICAgIGdsVW5pZm9ybTFpKG1fc2Nyb2xsU2FtcGxlckxvY2F0aW9uLCAwKTsKKworICAgICAg
ICAgICAgZHJhd1RleHR1cmVkUXVhZChzY3JvbGxlZExheWVyTWF0cml4LCB2aXNpYmxlUmVjdC53
aWR0aCgpLCB2aXNpYmxlUmVjdC5oZWlnaHQoKSwgMSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGds
Q29weVRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMCwgMCwgY29udGVudFJl
Y3Qud2lkdGgoKSwgY29udGVudFJlY3QuaGVpZ2h0KCkpOworCisgICAgICAgICAgICBjaGVja0dM
RXJyb3IoKTsKKyAgICAgICAgICAgIG1fc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjsK
KyAgICB9CisKKyAgICAvLyBGSVhNRTogVGhlIGZvbGxvd2luZyBjaGVjayBzaG91bGQgZ28gYXdh
eSB3aGVuIHRoZSBjb21wb3NpdG9yIHJlbmRlcnMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBvd24g
dGhyZWFkLgorICAgIC8vIElnbm9yZSBhIDF4MSB1cGRhdGUgcmVjdCBhdCAoMCwgMCkgYXMgdGhh
dCdzIHVzZWQgYSB3YXkgdG8ga2ljayBvZmYgYSByZWRyYXcgZm9yIHRoZSBjb21wb3NpdG9yLgor
ICAgIGlmICghKHVwZGF0ZVJlY3QueCgpID09IDAgJiYgdXBkYXRlUmVjdC55KCkgPT0gMCAmJiB1
cGRhdGVSZWN0LndpZHRoKCkgPT0gMSAmJiB1cGRhdGVSZWN0LmhlaWdodCgpID09IDEpKSB7Cisg
ICAgICAgIC8vIFVwZGF0ZSB0aGUgcm9vdCBsYXllciB0ZXh0dXJlLgorICAgICAgICBBU1NFUlQo
KHVwZGF0ZVJlY3QueCgpICsgdXBkYXRlUmVjdC53aWR0aCgpIDw9IG1fcm9vdExheWVyVGV4dHVy
ZVdpZHRoKSAmJgorICAgICAgICAgICAgKHVwZGF0ZVJlY3QueSgpICsgdXBkYXRlUmVjdC5oZWln
aHQoKSA8PSBtX3Jvb3RMYXllclRleHR1cmVIZWlnaHQpKTsKIAotICAgIC8vIEZpcnN0IGNvbXBv
c2l0ZSB0aGUgcm9vdCBsYXllciBpbnRvIHRoZSBjYW52YXMuCi0gICAgY2FudmFzLT5kcmF3Qml0
bWFwKG1fcm9vdExheWVyLT5wbGF0Zm9ybUNhbnZhcygpLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0
bWFwKGZhbHNlKSwgMCwgMCwgMCk7Ci0KLSAgICAvLyBBY2NvdW50IGZvciB0aGUgc2Nyb2xsIG9m
ZnNldCBiZWZvcmUgY29tcG9zaXRpbmcgdGhlIHJlbWFpbmluZyBsYXllcnMuCi0gICAgLy8gTm90
ZSB0aGF0IHRoZSByb290IGxheWVyJ3MgcGFpbnRpbmcgdGFrZXMgaW50byBhY2NvdW50IHRoZSBz
Y3JvbGwgb2Zmc2V0IGFscmVhZHkuCi0gICAgY2FudmFzLT50cmFuc2xhdGUoLW1fc2Nyb2xsRnJh
bWUuZkxlZnQsIC1tX3Njcm9sbEZyYW1lLmZUb3ApOwotCi0gICAgZmxvYXQgb3BhY2l0eSA9IDEu
MGY7CisjaWYgUExBVEZPUk0oU0tJQSkKKyAgICAgICAgLy8gR2V0IHRoZSBjb250ZW50cyBvZiB0
aGUgdXBkYXRlZCByZWN0LgorICAgICAgICBjb25zdCBTa0JpdG1hcCBiaXRtYXAgPSBtX3Jvb3RM
YXllci0+cGxhdGZvcm1DYW52YXMoKS0+Z2V0RGV2aWNlKCktPmFjY2Vzc0JpdG1hcChmYWxzZSk7
CisgICAgICAgIGludCByb290TGF5ZXJXaWR0aCA9IGJpdG1hcC53aWR0aCgpOworICAgICAgICBp
bnQgcm9vdExheWVySGVpZ2h0ID0gYml0bWFwLmhlaWdodCgpOworICAgICAgICBBU1NFUlQocm9v
dExheWVyV2lkdGggPT0gdXBkYXRlUmVjdC53aWR0aCgpICYmIHJvb3RMYXllckhlaWdodCA9PSB1
cGRhdGVSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgdm9pZCogcGl4ZWxzID0gYml0bWFwLmdldFBp
eGVscygpOworCisgICAgICAgIGNoZWNrR0xFcnJvcigpOworICAgICAgICAvLyBDb3B5IHRoZSBj
b250ZW50cyBvZiB0aGUgdXBkYXRlZCByZWN0IHRvIHRoZSByb290IGxheWVyIHRleHR1cmUuCisg
ICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCB1cGRhdGVSZWN0LngoKSwg
dXBkYXRlUmVjdC55KCksIHVwZGF0ZVJlY3Qud2lkdGgoKSwgdXBkYXRlUmVjdC5oZWlnaHQoKSwg
R0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgcGl4ZWxzKTsKKyAgICAgICAgY2hlY2tHTEVycm9y
KCk7CisjZWxzZQorI2Vycm9yIE11c3QgcG9ydCB0byB5b3VyIHBsYXRmb3JtCisjZW5kaWYKKyAg
ICB9CisKKyAgICBnbENsZWFyQ29sb3IoMCwgMCwgMSwgMSk7CisgICAgZ2xDbGVhcihHTF9DT0xP
Ul9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisKKyAgICAvLyBSZW5kZXIgdGhl
IHJvb3QgbGF5ZXIgdXNpbmcgYSBxdWFkIHRoYXQgdGFrZXMgdXAgdGhlIGVudGlyZSB2aXNpYmxl
IGFyZWEgb2YgdGhlIHdpbmRvdy4KKyAgICBnbFVzZVByb2dyYW0obV9sYXllclByb2dyYW1PYmpl
Y3QpOworICAgIGdsVW5pZm9ybTFpKG1fc2FtcGxlckxvY2F0aW9uLCAwKTsKKyAgICBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCBsYXllck1hdHJpeDsKKyAgICBsYXllck1hdHJpeC50cmFuc2xhdGUzZCh2
aXNpYmxlUmVjdC53aWR0aCgpIC8gMiwgdmlzaWJsZVJlY3QuaGVpZ2h0KCkgLyAyLCAwKTsKKyAg
ICBkcmF3VGV4dHVyZWRRdWFkKGxheWVyTWF0cml4LCB2aXNpYmxlUmVjdC53aWR0aCgpLCB2aXNp
YmxlUmVjdC5oZWlnaHQoKSwgMSwgZmFsc2UpOworCisgICAgLy8gSWYgY3VsbGluZyBpcyBlbmFi
bGVkIHRoZW4gd2Ugd2lsbCBjdWxsIHRoZSBiYWNrZmFjZS4KKyAgICBnbEN1bGxGYWNlKEdMX0JB
Q0spOworICAgIC8vIFRoZSBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBpcyBzZXR1cCBzdWNoIHRo
YXQgWSBzdGFydHMgYXQgemVybyBhbmQKKyAgICAvLyBpbmNyZWFzZXMgZ29pbmcgZG93biB0aGUg
cGFnZSBzbyB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgd2luZGluZyBvcmRlciBvZgorICAgIC8vIGZy
b250IGZhY2luZyB0cmlhbmdsZXMuCisgICAgZ2xGcm9udEZhY2UoR0xfQ1cpOworCisgICAgLy8g
VGhlIHNoYWRlciB1c2VkIHRvIHJlbmRlciBsYXllcnMgcmV0dXJucyBwcmUtbXVsdGlwbGllZCBh
bHBoYSBjb2xvcnMKKyAgICAvLyBzbyB3ZSBuZWVkIHRvIHNlbmQgdGhlIGJsZW5kaW5nIG1vZGUg
YXBwcm9wcmlhdGVseS4KKyAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgZ2xCbGVuZEZ1bmMo
R0xfT05FLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKworICAgIGNoZWNrR0xFcnJvcigpOwor
CisgICAgLy8gRklYTUU6IE5lZWQgdG8gcHJldmVudCBjb21wb3NpdGVkIGxheWVycyBmcm9tIGRy
YXdpbmcgb3ZlciB0aGUgc2Nyb2xsCisgICAgLy8gYmFycy4KKworICAgIC8vIEZJWE1FOiBTdWJs
YXllcnMgbmVlZCB0byBiZSBzb3J0ZWQgaW4gWiB0byBnZXQgdGhlIGNvcnJlY3QgdHJhbnNwYXJl
bmN5IGVmZmVjdC4KKworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY3VsbCBvdXQgbGF5ZXJzIHRo
YXQgYXJlIG5vdCBpbnNpZGUgdGhlIHZpc2libGUgcmVjdC4KKworICAgIC8vIFRyYW5zbGF0ZSBh
bGwgdGhlIGNvbXBvc2l0ZWQgbGF5ZXJzIGJ5IHRoZSBzY3JvbGwgcG9zaXRpb24uCisgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggbWF0cml4OworICAgIG1hdHJpeC50cmFuc2xhdGUzZCgtbV9zY3Jv
bGxQb3NpdGlvbi54KCksIC1tX3Njcm9sbFBvc2l0aW9uLnkoKSwgMCk7CisgICAgZmxvYXQgb3Bh
Y2l0eSA9IDE7CiAgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxMYXllckNocm9taXVtPiA+JiBzdWJs
YXllcnMgPSBtX3Jvb3RMYXllci0+Z2V0U3VibGF5ZXJzKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspCi0gICAgICAgIGRyYXdMYXllckluQ2FudmFz
UmVjdXJzaXZlKGNhbnZhcywgc3VibGF5ZXJzW2ldLmdldCgpLCBvcGFjaXR5KTsKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHN1YmxheWVycy5zaXplKCk7IGkrKykgeworICAgICAgICBjb21w
b3NpdGVMYXllcnNSZWN1cnNpdmUoc3VibGF5ZXJzW2ldLmdldCgpLCBtYXRyaXgsIG9wYWNpdHks
IHZpc2libGVSZWN0KTsKKyAgICB9CiAKLSAgICBjYW52YXMtPnJlc3RvcmUoKTsKKyAgICBtX2ds
ZXMyQ29udGV4dC0+c3dhcEJ1ZmZlcnMoKTsKIAogICAgIG1fbmVlZHNEaXNwbGF5ID0gZmFsc2U7
CiB9CiAKLXZvaWQgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3TGF5ZXJJbkNhbnZhc1JlY3Vy
c2l2ZShza2lhOjpQbGF0Zm9ybUNhbnZhcyogY2FudmFzLCBMYXllckNocm9taXVtKiBsYXllciwg
ZmxvYXQgb3BhY2l0eSkKLXsKLSAgICAvLyBHdWFyYW50ZWVzIHRoYXQgdGhlIGNhbnZhcyBpcyBy
ZXN0b3JlZCB0byBhIGtub3duIHN0YXRlIG9uIGRlc3RydWN0aW9uLgotICAgIFNrQXV0b0NhbnZh
c1Jlc3RvcmUgYXV0b1Jlc3RvcmVDYW52YXMoY2FudmFzLCB0cnVlKTsKKy8vIFJldHVybnMgdGhl
IGlkIG9mIHRoZSB0ZXh0dXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIGxheWVyIG9y
CisvLyAtMSBpZiB0aGUgaWQgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCB5ZXQuCitpbnQgTGF5ZXJS
ZW5kZXJlckNocm9taXVtOjpnZXRUZXh0dXJlSWQoTGF5ZXJDaHJvbWl1bSogbGF5ZXIpIHsKKyAg
IHN0ZDo6bWFwPExheWVyQ2hyb21pdW0qLCB1bnNpZ25lZCBpbnQ+OjppdGVyYXRvciB0ZXh0dXJl
SWQ7CisgICBpZiAoKHRleHR1cmVJZCA9IG1fdGV4dHVyZUlkTWFwLmZpbmQobGF5ZXIpKSAhPSBt
X3RleHR1cmVJZE1hcC5lbmQoKSkKKyAgICAgICByZXR1cm4gdGV4dHVyZUlkLT5zZWNvbmQ7Cisg
ICBlbHNlIAorICAgICAgIHJldHVybiAtMTsKK30KIAotICAgIEZsb2F0UG9pbnQgcG9zaXRpb24g
PSBsYXllci0+cG9zaXRpb24oKTsKLSAgICBGbG9hdFBvaW50IGFuY2hvclBvaW50ID0gbGF5ZXIt
PmFuY2hvclBvaW50KCk7Ci0gICAgU2tNYXRyaXggdHJhbnNmb3JtID0gbGF5ZXItPnRyYW5zZm9y
bSgpLnRvQWZmaW5lVHJhbnNmb3JtKCk7CisvLyBBbGxvY2F0ZXMgYSBuZXcgdGV4dHVyZSBmb3Ig
dGhlIGxheWVyIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIHRleHR1cmVJZCBtYXAuCisvLyBGSVhN
RTogV2Ugd2lsbCBuZWVkIHRvIGNvbWUgdXAgd2l0aCBhIG1vcmUgc29waGlzdGljYXRlZCBhbGxv
Y2F0aW9uIHN0cmF0ZWd5IGhlcmUuCisvLyBGSVhNRTogV2UgbmVlZCB0byBmcmVlIHVwIHRoZSBh
c3NvY2lhdGVkIHRleHR1cmUgdXBvbiBsYXllciBkZXN0cnVjdGlvbi4KK2ludCBMYXllclJlbmRl
cmVyQ2hyb21pdW06OmFzc2lnblRleHR1cmVGb3JMYXllcihMYXllckNocm9taXVtKiBsYXllcikg
eworICAgIEdMdWludCB0ZXh0dXJlSWQgPSBjcmVhdGVMYXllclRleHR1cmUoKTsKKworICAgIC8v
IEZJWE1FOiBDaGVjayB0aGF0IHRleHR1cmVJZCBpcyB2YWxpZAorICAgIG1fdGV4dHVyZUlkTWFw
Lmluc2VydChzdGQ6Om1ha2VfcGFpcihsYXllciwgdGV4dHVyZUlkKSk7CisgICAgcmV0dXJuIHRl
eHR1cmVJZDsKK30KKworYm9vbCBMYXllclJlbmRlcmVyQ2hyb21pdW06OmZyZWVMYXllclRleHR1
cmUoTGF5ZXJDaHJvbWl1bSogbGF5ZXIpIHsKKyAgICBzdGQ6Om1hcDxMYXllckNocm9taXVtKiwg
dW5zaWduZWQgaW50Pjo6aXRlcmF0b3IgdGV4dHVyZUlkID0gbV90ZXh0dXJlSWRNYXAuZmluZChs
YXllcik7CisgICAgaWYgKHRleHR1cmVJZCA9PSBtX3RleHR1cmVJZE1hcC5lbmQoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIC8vIEZyZWUgdXAgdGhlIHRleHR1cmUuCisgICAgZ2xEZWxl
dGVUZXh0dXJlcygxLCAmKHRleHR1cmVJZC0+c2Vjb25kKSk7CisgICAgbV90ZXh0dXJlSWRNYXAu
ZXJhc2UodGV4dHVyZUlkKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRHJhd3MgYSBkZWJ1
ZyBib3JkZXIgYXJvdW5kIHRoZSBsYXllcidzIGJvdW5kcy4KK3ZvaWQgTGF5ZXJSZW5kZXJlckNo
cm9taXVtOjpkcmF3RGVidWdCb3JkZXIoTGF5ZXJDaHJvbWl1bSogbGF5ZXIsIGNvbnN0IFRyYW5z
Zm9ybWF0aW9uTWF0cml4JiBtYXRyaXgpIHsKKyAgICBzdGF0aWMgR0xmbG9hdCBnbE1hdHJpeFsx
Nl07CisgICAgQ29sb3IgYm9yZGVyQ29sb3IgPSBsYXllci0+Ym9yZGVyQ29sb3IoKTsKKyAgICBp
ZiAoYm9yZGVyQ29sb3IuYWxwaGEoKSA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBnbFVz
ZVByb2dyYW0obV9ib3JkZXJQcm9ncmFtT2JqZWN0KTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCByZW5kZXJNYXRyaXggPSBtYXRyaXg7CiAgICAgSW50U2l6ZSBib3VuZHMgPSBsYXllci0+Ym91
bmRzKCk7CisgICAgcmVuZGVyTWF0cml4LnNjYWxlM2QoYm91bmRzLndpZHRoKCksIGJvdW5kcy5o
ZWlnaHQoKSwgMSk7CisgICAgcmVuZGVyTWF0cml4Lm11bHRpcGx5KG1fcHJvamVjdGlvbk1hdHJp
eCk7CisgICAgdG9HTE1hdHJpeCgmZ2xNYXRyaXhbMF0sIHJlbmRlck1hdHJpeCk7CisgICAgRmxv
YXRQb2ludDNEIHRlc3QxID0gcmVuZGVyTWF0cml4Lm1hcFBvaW50KEZsb2F0UG9pbnQzRCgtMC41
LCAwLjUsIDApKTsKKyAgICBGbG9hdFBvaW50M0QgdGVzdDIgPSByZW5kZXJNYXRyaXgubWFwUG9p
bnQoRmxvYXRQb2ludDNEKDAuNSwgLTAuNSwgMCkpOworICAgIGdsVW5pZm9ybU1hdHJpeDRmdiht
X2JvcmRlck1hdHJpeExvY2F0aW9uLCAxLCBmYWxzZSwgJmdsTWF0cml4WzBdKTsKKyAgICAKKyAg
ICBnbFVuaWZvcm00ZihtX2JvcmRlckNvbG9yTG9jYXRpb24sIGJvcmRlckNvbG9yLnJlZCgpIC8g
MjU1LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xv
ci5ncmVlbigpIC8gMjU1LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBib3JkZXJDb2xvci5ibHVlKCkgLyAyNTUuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIDEpOworCisgICAgZ2xMaW5lV2lkdGgobGF5ZXItPmJvcmRlcldpZHRoKCkp
OworCisgICAgLy8gVGhlIGluZGljZXMgZm9yIHRoZSBsaW5lIGFyZSBzdG9yZWQgaW4gdGhlIHNh
bWUgYXJyYXkgYXMgdGhlIHRyaWFuZ2xlIGluZGljZXMuCisgICAgZ2xEcmF3RWxlbWVudHMoR0xf
TElORV9MT09QLCA0LCBHTF9VTlNJR05FRF9TSE9SVCwgKHZvaWQqKSg2ICogc2l6ZW9mKHVuc2ln
bmVkIHNob3J0KSkpOworICAgIGNoZWNrR0xFcnJvcigpOworCisgICAgLy8gU3dpdGNoIGJhY2sg
dG8gdGhlIHNoYWRlciBwcm9ncmFtIHVzZWQgZm9yIGxheWVyIGNvbnRlbnRzLgorICAgIGdsVXNl
UHJvZ3JhbShtX2xheWVyUHJvZ3JhbU9iamVjdCk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBh
bnkgcGFydCBvZiB0aGUgbGF5ZXIgZmFsbHMgd2l0aGluIHRoZSB2aXNpYmxlUmVjdAorYm9vbCBM
YXllclJlbmRlcmVyQ2hyb21pdW06OmlzTGF5ZXJWaXNpYmxlKExheWVyQ2hyb21pdW0qIGxheWVy
LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgbWF0cml4LCBjb25zdCBJbnRSZWN0JiB2aXNp
YmxlUmVjdCkKK3sKKyAgICAvLyBGb3JtIHRoZSBtYXRyaXggdXNlZCBieSB0aGUgc2hhZGVyIHRv
IG1hcCB0aGUgY29ybmVycyBvZiB0aGUgbGF5ZXIncworICAgIC8vIGJvdW5kcyBpbnRvIGNsaXAg
c3BhY2UuCisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggcmVuZGVyTWF0cml4ID0gbWF0cml4Owor
ICAgIHJlbmRlck1hdHJpeC5zY2FsZTNkKGxheWVyLT5ib3VuZHMoKS53aWR0aCgpLCBsYXllci0+
Ym91bmRzKCkuaGVpZ2h0KCksIDEpOworICAgIHJlbmRlck1hdHJpeC5tdWx0aXBseShtX3Byb2pl
Y3Rpb25NYXRyaXgpOworCisgICAgRmxvYXRSZWN0IGxheWVyUmVjdCgtMC41LCAtMC41LCAxLCAx
KTsKKyAgICBGbG9hdFJlY3QgbWFwcGVkUmVjdCA9IHJlbmRlck1hdHJpeC5tYXBSZWN0KGxheWVy
UmVjdCk7CisKKyAgICAvLyBUaGUgbGF5ZXIgaXMgdmlzaWJsZSBpZiBpdCBpbnRlcnNlY3RzIGFu
eSBwYXJ0IG9mIGEgcmVjdGFuZ2xlIHdob3NlIG9yaWdpbgorICAgIC8vIGlzIGF0ICgtMSwgLTEp
IGFuZCBzaXplIGlzIDJ4Mi4KKyAgICByZXR1cm4gbWFwcGVkUmVjdC5pbnRlcnNlY3RzKEZsb2F0
UmVjdCgtMSwgLTEsIDIsIDIpKTsKK30KIAotICAgIGNhbnZhcy0+dHJhbnNsYXRlKHBvc2l0aW9u
LngoKSwgcG9zaXRpb24ueSgpKTsKK3ZvaWQgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpjb21wb3Np
dGVMYXllcnNSZWN1cnNpdmUoTGF5ZXJDaHJvbWl1bSogbGF5ZXIsIGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4JiBtYXRyaXgsIGZsb2F0IG9wYWNpdHksIGNvbnN0IEludFJlY3QmIHZpc2libGVS
ZWN0KQoreworICAgIHN0YXRpYyBHTGZsb2F0IGdsTWF0cml4WzE2XTsKIAotICAgIFNrU2NhbGFy
IHR4ID0gU2tTY2FsYXJNdWwoYW5jaG9yUG9pbnQueCgpLCBib3VuZHMud2lkdGgoKSk7Ci0gICAg
U2tTY2FsYXIgdHkgPSBTa1NjYWxhck11bChhbmNob3JQb2ludC55KCksIGJvdW5kcy5oZWlnaHQo
KSk7Ci0gICAgY2FudmFzLT50cmFuc2xhdGUodHgsIHR5KTsKLSAgICBjYW52YXMtPmNvbmNhdCh0
cmFuc2Zvcm0pOwotICAgIGNhbnZhcy0+dHJhbnNsYXRlKC10eCwgLXR5KTsKLQotICAgIC8vIFRo
ZSBwb3NpdGlvbiB3ZSBnZXQgaXMgZm9yIHRoZSBjZW50ZXIgb2YgdGhlIGxheWVyLCBidXQKLSAg
ICAvLyBkcmF3Qml0bWFwIHN0YXJ0cyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIsIGFuZCB0aGVy
ZWZvcmUKLSAgICAvLyB3ZSBuZWVkIHRvIGFkanVzdCBvdXIgdHJhbnNmb3JtLgotICAgIGNhbnZh
cy0+dHJhbnNsYXRlKC0wLjVmICogYm91bmRzLndpZHRoKCksIC0wLjVmICogYm91bmRzLmhlaWdo
dCgpKTsKKyAgICAvLyBDb21wdXRlIHRoZSBuZXcgbWF0cml4IHRyYW5zZm9ybWF0aW9uIHRoYXQg
d2lsbCBiZSBhcHBsaWVkIHRvIHRoaXMgbGF5ZXIgYW5kCisgICAgLy8gYWxsIGl0cyBzdWJsYXll
cnMuCisgICAgLy8gVGhlIGJhc2ljIHRyYW5zZm9ybWF0aW9uIGNoYWluIGZvciB0aGUgbGF5ZXIg
aXMgKHVzaW5nIHRoZSBNYXRyaXggeCBWZWN0b3Igb3JkZXIpOgorICAgIC8vIE0gPSBNW3BdICog
VFtsXSAqIFRbYV0gKiBNW2xdICogVFstYV0KKyAgICAvLyBXaGVyZSBNW3BdIGlzIHRoZSBwYXJl
bnQgbWF0cml4IHBhc3NlZCBkb3duIHRvIHRoZSBmdW5jdGlvbgorICAgIC8vICAgICAgIFRbbF0g
aXMgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBsYXllcidzIGNlbnRlcgorICAgIC8vICAgICAgIFRb
YV0gYW5kIFRbLWFdIGlzIGEgdHJhbnNsYXRpb24vaW52ZXJzZSB0cmFuc2xhdGlvbiBieSB0aGUg
YW5jaG9yIHBvaW50CisgICAgLy8gICAgICAgTVtsXSBpcyB0aGUgbGF5ZXIncyBtYXRyaXgKKyAg
ICAvLyBOb3RlIHRoYXQgdGhlIGZpbmFsIG1hdHJpeCB1c2VkIGJ5IHRoZSBzaGFkZXIgZm9yIHRo
ZSBsYXllciBpcyBQICogTSAqIFMgLiBUaGlzIGZpbmFsIHByb2R1Y3QKKyAgICAvLyBpcyBlZmZl
Y3RpdmVseSBjb21wdXRlZCBpbiBkcmF3VGV4dHVyZWRRdWFkKCkuCisgICAgLy8gV2hlcmU6IFAg
aXMgdGhlIHByb2plY3Rpb24gbWF0cml4CisgICAgLy8gICAgICAgIE0gaXMgdGhlIGxheWVyJ3Mg
bWF0cml4IGNvbXB1dGVkIGFib3ZlCisgICAgLy8gICAgICAgIFMgaXMgdGhlIHNjYWxlIGFkanVz
dG1lbnQgKHRvIHNjYWxlIHVwIHRvIHRoZSBsYXllciBzaXplKQorICAgIEludFNpemUgYm91bmRz
ID0gbGF5ZXItPmJvdW5kcygpOworICAgIEZsb2F0UG9pbnQgYW5jaG9yUG9pbnQgPSBsYXllci0+
YW5jaG9yUG9pbnQoKTsKKyAgICBGbG9hdFBvaW50IHBvc2l0aW9uID0gbGF5ZXItPnBvc2l0aW9u
KCk7CisgICAgZmxvYXQgYW5jaG9yWCA9IChhbmNob3JQb2ludC54KCkgLSAwLjUpICogYm91bmRz
LndpZHRoKCk7CisgICAgZmxvYXQgYW5jaG9yWSA9ICgwLjUgLSBhbmNob3JQb2ludC55KCkpICog
Ym91bmRzLmhlaWdodCgpOwogCi0gICAgbGF5ZXItPmRyYXdEZWJ1Z0JvcmRlcigpOworICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IGxvY2FsTWF0cml4ID0gbWF0cml4OyAgICAgICAgICAgICAgICAg
Ly8gTSA9IE1bcF0KKyAgICBsb2NhbE1hdHJpeC50cmFuc2xhdGUzZChwb3NpdGlvbi54KCksIHBv
c2l0aW9uLnkoKSwgMCk7ICAgIC8vIE0gPSBNW3BdICogVFtsXQorICAgIGxvY2FsTWF0cml4LnRy
YW5zbGF0ZTNkKGFuY2hvclgsIGFuY2hvclksIDApOyAgICAgICAgICAgICAgLy8gTSA9IE1bcF0g
KiBUW2xdICogVFthXQorICAgIGxvY2FsTWF0cml4Lm11bHRMZWZ0KGxheWVyLT50cmFuc2Zvcm0o
KSk7ICAgICAgICAgICAgICAgICAgLy8gTSA9IE1bcF0gKiBUW2xdICogVFthXSAqIE1bbF0KKyAg
ICBsb2NhbE1hdHJpeC50cmFuc2xhdGUzZCgtYW5jaG9yWCwgLWFuY2hvclksIDApOyAgICAgICAg
ICAgIC8vIE0gPSBNW3BdICogVFtsXSAqIFRbYV0gKiBNW2xdICogVFstYV0KKworICAgIGJvb2wg
c2tpcExheWVyID0gZmFsc2U7CisgICAgaWYgKGJvdW5kcy53aWR0aCgpID4gMjA0OCB8fCBib3Vu
ZHMuaGVpZ2h0KCkgPiAyMDQ4KSB7CisgICAgICAgIExPRyhMYXllclJlbmRlcmVyLCAiU2tpcHBp
bmcgbGF5ZXIgd2l0aCBzaXplICVkICVkIiwgYm91bmRzLndpZHRoKCksIGJvdW5kcy5oZWlnaHQo
KSk7CisgICAgICAgIHNraXBMYXllciA9IHRydWU7CisgICAgfQorCisgICAgYm9vbCBsYXllclZp
c2libGUgPSBpc0xheWVyVmlzaWJsZShsYXllciwgbG9jYWxNYXRyaXgsIHZpc2libGVSZWN0KTsK
KworICAgIC8vIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIGxheWVyczoKKyAgICAv
LyAxLiBMYXllcnMgdGhhdCBoYXZlIHRoZWlyIG93biBHcmFwaGljc0NvbnRleHQgYW5kIGNhbiBk
cmF3IHRoZWlyIGNvbnRlbnRzIG9uIGRlbWFuZCAobGF5ZXItPmRyYXdzQ29udGVudCgpID09IHRy
dWUpLgorICAgIC8vIDIuIExheWVycyB0aGF0IGFyZSBqdXN0IGNvbnRhaW5lcnMgb2YgaW1hZ2Vz
L3ZpZGVvL2V0YyB0aGF0IGRvbid0IG93biBhIEdyYXBoaWNzQ29udGV4dCAobGF5ZXItPmNvbnRl
bnRzKCkgPT0gdHJ1ZSkuCisgICAgaWYgKChsYXllci0+ZHJhd3NDb250ZW50KCkgfHwgbGF5ZXIt
PmNvbnRlbnRzKCkpICYmICFza2lwTGF5ZXIgJiYgbGF5ZXJWaXNpYmxlKSB7CisgICAgICAgIGlu
dCB0ZXh0dXJlSWQgPSBnZXRUZXh0dXJlSWQobGF5ZXIpOworICAgICAgICAvLyBJZiBubyB0ZXh0
dXJlIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBsYXllciB5ZXQgdGhlbiBjcmVhdGUgb25lIG5v
dy4KKyAgICAgICAgaWYgKHRleHR1cmVJZCA9PSAtMSkKKyAgICAgICAgICAgIHRleHR1cmVJZCA9
IGFzc2lnblRleHR1cmVGb3JMYXllcihsYXllcik7CisKKyAgICAgICAgLy8gUmVkcmF3IHRoZSBj
b250ZW50cyBvZiB0aGUgbGF5ZXIgaWYgbmVjZXNzYXJ5LgorICAgICAgICBpZiAoKGxheWVyLT5k
cmF3c0NvbnRlbnQoKSB8fCBsYXllci0+Y29udGVudHMoKSkgJiYgbGF5ZXItPmNvbnRlbnRzRGly
dHkoKSkgeworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgbGF5ZXIg
YmVmb3JlIHRha2luZyBhIHNuYXBzaG90LiBGb3IgbGF5ZXJzIHRoYXQKKyAgICAgICAgICAgIC8v
IGFyZSBzaW1wbHkgY29udGFpbmVycywgdGhlIGZvbGxvd2luZyBjYWxsIGp1c3QgY2xlYXJzIHRo
ZSBkaXJ0eSBmbGFnIGJ1dCBkb2Vzbid0CisgICAgICAgICAgICAvLyBhY3R1YWxseSBkbyBhbnkg
ZHJhd3MvY29waWVzLgorICAgICAgICAgICAgbGF5ZXItPnVwZGF0ZUNvbnRlbnRzKCk7CisKKyAg
ICAgICAgICAgIGNvbnN0IFNrQml0bWFwKiBza2lhQml0bWFwID0gMDsKKyAgICAgICAgICAgIHZv
aWQqIHBpeGVscyA9IDA7CisgICAgICAgICAgICBpZiAobGF5ZXItPmRyYXdzQ29udGVudCgpKSB7
ICAvLyBMYXllciBoYXMgaXRzIG93biBHcmFwaGljc0NvbnRleHQuCisgICAgICAgICAgICAgICAg
Ly8gVGhlIGNvbnRlbnRzIG9mIHRoZSBsYXllciBhcmUgc3RvcmVkIGluIHRoZSBjYW52YXMgYXNz
b2NpYXRlZCB3aXRoIGl0LgorICAgICAgICAgICAgICAgIGNvbnN0IFNrQml0bWFwJiBiaXRtYXAg
PSBsYXllci0+cGxhdGZvcm1DYW52YXMoKS0+Z2V0RGV2aWNlKCktPmFjY2Vzc0JpdG1hcChmYWxz
ZSk7CisgICAgICAgICAgICAgICAgc2tpYUJpdG1hcCA9ICZiaXRtYXA7CisgICAgICAgICAgICB9
IGVsc2UgeyAvLyBMYXllciBpcyBhIGNvbnRhaW5lci4KKyAgICAgICAgICAgICAgICAvLyBUaGUg
bGF5ZXIgY29udGFpbnMgYW4gSW1hZ2UuCisgICAgICAgICAgICAgICAgTmF0aXZlSW1hZ2VTa2lh
KiBza2lhSW1hZ2UgPSBzdGF0aWNfY2FzdDxOYXRpdmVJbWFnZVNraWEqPihsYXllci0+Y29udGVu
dHMoKSk7CisgICAgICAgICAgICAgICAgc2tpYUJpdG1hcCA9IHNraWFJbWFnZTsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgQVNTRVJUKHNraWFCaXRtYXApOworICAgICAgICAgICAgU2tC
aXRtYXA6OkNvbmZpZyBza2lhQ29uZmlnID0gc2tpYUJpdG1hcC0+Y29uZmlnKCk7CisgICAgICAg
ICAgICAvLyBGSVhNRTogbXVzdCBzdXBwb3J0IG1vcmUgaW1hZ2UgY29uZmlndXJhdGlvbnMuCisg
ICAgICAgICAgICBpZiAoc2tpYUNvbmZpZyA9PSBTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWcp
IHsKKyAgICAgICAgICAgICAgICBTa0F1dG9Mb2NrUGl4ZWxzIGxvY2soKnNraWFCaXRtYXApOwor
ICAgICAgICAgICAgICAgIGludCBiaXRtYXBXaWR0aCA9IHNraWFCaXRtYXAtPndpZHRoKCk7Cisg
ICAgICAgICAgICAgICAgaW50IGJpdG1hcEhlaWdodCA9IHNraWFCaXRtYXAtPmhlaWdodCgpOwor
ICAgICAgICAgICAgICAgIGludCByb3dCeXRlcyA9IHNraWFCaXRtYXAtPnJvd0J5dGVzKCk7Cisg
ICAgICAgICAgICAgICAgQVNTRVJUKHJvd0J5dGVzID09IGJpdG1hcFdpZHRoICogNCk7CisKKyAg
ICAgICAgICAgICAgICAvLyBDb3B5IHRoZSBsYXllciBjb250ZW50cyBpbnRvIHRoZSB0ZXh0dXJl
LgorICAgICAgICAgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZUlk
KTsKKyAgICAgICAgICAgICAgICB2b2lkKiBwaXhlbHMgPSBza2lhQml0bWFwLT5nZXRQaXhlbHMo
KTsKKyAgICAgICAgICAgICAgICBpZiAocGl4ZWxzKSB7CisgICAgICAgICAgICAgICAgICAgIC8v
IEZJWE1FLiBXZSBjYW4gYmUgc21hcnQgaGVyZSBhbmQgY2FsbCBnbFRleFN1YkltYWdlMkQgaWYg
dGhlIG5ldyBiaXRtYXAgaGFzIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgIC8vIHNpemUg
YXMgdGhlIG9sZCBvbmUgd2hpY2ggd2lsbCBzYXZlIHVzIG9uZSB1bmVjZXNzYXJ5IGFsbG9jYXRp
b24gLyBkZWFsbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9U
RVhUVVJFXzJELCAwLCBHTF9SR0JBLCBiaXRtYXBXaWR0aCwgYml0bWFwSGVpZ2h0LCAwLCBHTF9S
R0JBLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbHMpOworICAgICAgICAgICAgICAgICAgICBjaGVj
a0dMRXJyb3IoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
IAotICAgIFNrUGFpbnQgb3BhY2l0eVBhaW50OworICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGxh
eWVyJ3Mgb3BhY2l0eS4KICAgICBvcGFjaXR5ICo9IGxheWVyLT5vcGFjaXR5KCk7Ci0gICAgb3Bh
Y2l0eVBhaW50LnNldEFscGhhKG9wYWNpdHkgKiAyNTUpOwotCi0gICAgY2FudmFzLT5kcmF3Qml0
bWFwKGxheWVyLT5wbGF0Zm9ybUNhbnZhcygpLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZh
bHNlKSwgMCwgMCwgJm9wYWNpdHlQYWludCk7CiAKKyAgICAgICAgaWYgKGxheWVyLT5kb3VibGVT
aWRlZCgpKQorICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICAgICAgZ2xCaW5k
VGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlSWQpOworCisgICAgICAgIGRyYXdUZXh0dXJl
ZFF1YWQobG9jYWxNYXRyaXgsIGJvdW5kcy53aWR0aCgpLCBib3VuZHMuaGVpZ2h0KCksIG9wYWNp
dHksIGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBEcmF3IHRoZSBkZWJ1ZyBib3JkZXIgaWYgdGhl
cmUgaXMgb25lLgorICAgIGRyYXdEZWJ1Z0JvcmRlcihsYXllciwgbG9jYWxNYXRyaXgpOworCisg
ICAgLy8gQXBwbHkgdGhlIHN1YmxheWVyIHRyYW5zZm9ybS4KKyAgICBsb2NhbE1hdHJpeC5tdWx0
TGVmdChsYXllci0+c3VibGF5ZXJUcmFuc2Zvcm0oKSk7CisKKyAgICAvLyBUaGUgb3JpZ2luIG9m
IHRoZSBzdWJsYXllcnMgaXMgYWN0dWFsbHkgdGhlIGxlZnQgdG9wIGNvcm5lciBvZiB0aGUgbGF5
ZXIKKyAgICAvLyBpbnN0ZWFkIG9mIHRoZSBjZW50ZXIuIFRoZSBtYXRyaXggcGFzc2VkIGRvd24g
dG8gdGhlIHN1YmxheWVycyBpcyB0aGVyZWZvcmU6CisgICAgLy8gTVtzXSA9IE0gKiBUWy1jZW50
ZXJdCisgICAgbG9jYWxNYXRyaXgudHJhbnNsYXRlM2QoLWJvdW5kcy53aWR0aCgpICogMC41LCAt
Ym91bmRzLmhlaWdodCgpICogMC41LCAwKTsKICAgICBjb25zdCBWZWN0b3I8UmVmUHRyPExheWVy
Q2hyb21pdW0+ID4mIHN1YmxheWVycyA9IGxheWVyLT5nZXRTdWJsYXllcnMoKTsKLSAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHN1YmxheWVycy5zaXplKCk7IGkrKykKLSAgICAgICAgZHJhd0xh
eWVySW5DYW52YXNSZWN1cnNpdmUoY2FudmFzLCBzdWJsYXllcnNbaV0uZ2V0KCksIG9wYWNpdHkp
OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VibGF5ZXJzLnNpemUoKTsgaSsrKSB7Cisg
ICAgICAgIGNvbXBvc2l0ZUxheWVyc1JlY3Vyc2l2ZShzdWJsYXllcnNbaV0uZ2V0KCksIGxvY2Fs
TWF0cml4LCBvcGFjaXR5LCB2aXNpYmxlUmVjdCk7Cit9Cit9Citib29sIExheWVyUmVuZGVyZXJD
aHJvbWl1bTo6bWFrZUNvbnRleHRDdXJyZW50KCkKK3sKKyAgICByZXR1cm4gbV9nbGVzMkNvbnRl
eHQtPm1ha2VDdXJyZW50KCk7CiB9Ci0jZW5kaWYgLy8gUExBVEZPUk0oU0tJQSkKIAotdm9pZCBM
YXllclJlbmRlcmVyQ2hyb21pdW06OnVwZGF0ZUxheWVyQ29udGVudHNSZWN1cnNpdmUoTGF5ZXJD
aHJvbWl1bSogbGF5ZXIpCitib29sIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6aW5pdEdMKCkgewor
ICAgIG1fZ2xlczJDb250ZXh0ID0gR0xFUzJDb250ZXh0OjpjcmVhdGUobV9wYWdlKTsKKworICAg
IGlmICghbV9nbGVzMkNvbnRleHQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVy
biB0cnVlOworfQorCisvLyBCaW5kcyB0aGUgZ2l2ZW4gYXR0cmlidXRlIG5hbWUgdG8gYSBjb21t
b24gbG9jYXRpb24gYWNyb3NzIGFsbCB0aHJlZSBwcm9ncmFtcworLy8gdXNlZCBieSB0aGUgY29t
cG9zaXRvci4gVGhpcyBhbGxvd3MgdGhlIGNvZGUgdG8gYmluZCB0aGUgYXR0cmlidXRlcyBvbmx5
IG9uY2UKKy8vIGV2ZW4gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBwcm9ncmFtcy4KK3ZvaWQgTGF5
ZXJSZW5kZXJlckNocm9taXVtOjpiaW5kQ29tbW9uQXR0cmliTG9jYXRpb24oaW50IGxvY2F0aW9u
LCBjaGFyKiBhdHRyaWJOYW1lKQogewotICAgIGxheWVyLT51cGRhdGVDb250ZW50cygpOworICAg
IGdsQmluZEF0dHJpYkxvY2F0aW9uKG1fbGF5ZXJQcm9ncmFtT2JqZWN0LCBsb2NhdGlvbiwgYXR0
cmliTmFtZSk7CisgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24obV9ib3JkZXJQcm9ncmFtT2JqZWN0
LCBsb2NhdGlvbiwgYXR0cmliTmFtZSk7CisgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24obV9zY3Jv
bGxQcm9ncmFtT2JqZWN0LCBsb2NhdGlvbiwgYXR0cmliTmFtZSk7Cit9CiAKLSAgICBjb25zdCBW
ZWN0b3I8UmVmUHRyPExheWVyQ2hyb21pdW0+ID4mIHN1YmxheWVycyA9IGxheWVyLT5nZXRTdWJs
YXllcnMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1YmxheWVycy5zaXplKCk7IGkr
KykKLSAgICAgICAgdXBkYXRlTGF5ZXJDb250ZW50c1JlY3Vyc2l2ZShzdWJsYXllcnNbaV0uZ2V0
KCkpOworYm9vbCBMYXllclJlbmRlcmVyQ2hyb21pdW06OmluaXRpYWxpemVTaGFyZWRHTE9iamVj
dHMoKQoreworICAgIC8vIFNoYWRlcnMgZm9yIGRyYXdpbmcgdGhlIGxheWVyIGNvbnRlbnRzLgor
ICAgIGNoYXIgdmVydGV4U2hhZGVyU3RyaW5nW10gPQorICAgICAgICAiYXR0cmlidXRlIHZlYzQg
YV9wb3NpdGlvbjsgICBcbiIKKyAgICAgICAgImF0dHJpYnV0ZSB2ZWMyIGFfdGV4Q29vcmQ7ICAg
XG4iCisgICAgICAgICJ1bmlmb3JtIG1hdDQgbWF0cml4OyAgICAgICAgIFxuIgorICAgICAgICAi
dmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7ICAgICBcbiIKKyAgICAgICAgInZvaWQgbWFpbigpICAg
ICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ7ICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFxuIgorICAgICAgICAiICBnbF9Qb3NpdGlvbiA9IG1hdHJpeCAqIGFfcG9zaXRpb247IFxuIgor
ICAgICAgICAiICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsgICBcbiIKKyAgICAgICAgIn0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXG4iOworICAgIGNoYXIgZnJhZ21lbnRTaGFkZXJTdHJp
bmdbXSA9CisgICAgICAgIC8vIEZJWE1FOiBSZS1pbnRyb2R1Y2UgcHJlY2lzaW9uIHF1YWxpZmll
ciB3aGVuIHdlIG5lZWQgR0wgRVMgc2hhZGVycy4KKyAgICAgICAgIi8vcHJlY2lzaW9uIG1lZGl1
bXAgZmxvYXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAidmFyeWlu
ZyB2ZWMyIHZfdGV4Q29vcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAg
ICAidW5pZm9ybSBzYW1wbGVyMkQgc190ZXh0dXJlOyAgICAgICAgICAgICAgICAgICAgICAgIFxu
IgorICAgICAgICAidW5pZm9ybSBmbG9hdCBhbHBoYTsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFxuIgorICAgICAgICAidm9pZCBtYWluKCkgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAieyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAiICB2ZWM0IHRleENvbG9yID0g
dGV4dHVyZTJEKHNfdGV4dHVyZSwgdl90ZXhDb29yZCk7IFxuIgorICAgICAgICAiICBnbF9GcmFn
Q29sb3IgPSB2ZWM0KHRleENvbG9yLnosIHRleENvbG9yLnksIHRleENvbG9yLngsIHRleENvbG9y
LncpICogYWxwaGE7IFxuIgorICAgICAgICAifSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFxuIjsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB1c2Vk
IGZvciByZW5kZXJpbmcgdGhlIHNjcm9sbGVkIHJvb3QgbGF5ZXIgcXVhZC4gSXQgZGlmZmVycwor
ICAgIC8vIGZyb20gZnJhZ21lbnRTaGFkZXJTdHJpbmcgaW4gdGhhdCBpdCBkb2Vzbid0IHN3aXp6
bGUgdGhlIGNvbG9ycyBhbmQgZG9lc24ndAorICAgIC8vIHRha2UgYW4gYWxwaGEgdmFsdWUuCisg
ICAgY2hhciBzY3JvbGxGcmFnbWVudFNoYWRlclN0cmluZ1tdID0KKyAgICAgICAgLy8gRklYTUU6
IFJlLWludHJvZHVjZSBwcmVjaXNpb24gcXVhbGlmaWVyIHdoZW4gd2UgbmVlZCBHTCBFUyBzaGFk
ZXJzLgorICAgICAgICAiLy9wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXG4iCisgICAgICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZDsgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBzX3Rl
eHR1cmU7ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ2b2lkIG1haW4oKSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ7ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAg
ICAgICIgIHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoc190ZXh0dXJlLCB2X3RleENvb3JkKTsg
XG4iCisgICAgICAgICIgIGdsX0ZyYWdDb2xvciA9IHZlYzQodGV4Q29sb3IueCwgdGV4Q29sb3Iu
eSwgdGV4Q29sb3IueiwgdGV4Q29sb3Iudyk7IFxuIgorICAgICAgICAifSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIjsKKworICAgIC8vIFNoYWRl
cnMgZm9yIGRyYXdpbmcgdGhlIGRlYnVnIGJvcmRlcnMgYXJvdW5kIHRoZSBsYXllcnMuCisgICAg
Y2hhciBib3JkZXJWZXJ0ZXhTaGFkZXJTdHJpbmdbXSA9CisgICAgICAgICJhdHRyaWJ1dGUgdmVj
NCBhX3Bvc2l0aW9uOyAgIFxuIgorICAgICAgICAidW5pZm9ybSBtYXQ0IG1hdHJpeDsgICAgICAg
ICBcbiIKKyAgICAgICAgInZvaWQgbWFpbigpICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAg
ICJ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAiICAgZ2xfUG9zaXRp
b24gPSBtYXRyaXggKiBhX3Bvc2l0aW9uOyBcbiIKKyAgICAgICAgIn0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXG4iOworICAgIGNoYXIgYm9yZGVyRnJhZ21lbnRTaGFkZXJTdHJpbmdbXSA9
CisgICAgICAgIC8vIEZJWE1FOiBSZS1pbnRyb2R1Y2UgcHJlY2lzaW9uIHF1YWxpZmllciB3aGVu
IHdlIG5lZWQgR0wgRVMgc2hhZGVycy4KKyAgICAgICAgIi8vcHJlY2lzaW9uIG1lZGl1bXAgZmxv
YXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAidW5pZm9ybSB2ZWM0
IGNvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAidm9p
ZCBtYWluKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAg
ICAgICAieyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFxuIgorICAgICAgICAiICBnbF9GcmFnQ29sb3IgPSBjb2xvcjsgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIFxuIgorICAgICAgICAifSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFxuIjsKKworICAgIEdMZmxvYXQgdmVydGljZXNbXSA9IHsgLTAu
NWYsICAwLjVmLCAwLjBmLCAgLy8gUG9zaXRpb24gMAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDAuMGYsICAxLjBmLCAgICAgICAgLy8gVGV4Q29vcmQgMCAKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgIC0wLjVmLCAtMC41ZiwgMC4wZiwgIC8vIFBvc2l0aW9uIDEKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAwLjBmLCAgMC4wZiwgICAgICAgIC8vIFRleENvb3JkIDEKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAwLjVmLCAtMC41ZiwgMC4wZiwgIC8vIFBvc2l0aW9uIDIK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmLCAgMC4wZiwgICAgICAgIC8vIFRleENv
b3JkIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjVmLCAgMC41ZiwgMC4wZiwgIC8v
IFBvc2l0aW9uIDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmLCAgMS4wZiAgICAg
ICAgIC8vIFRleENvb3JkIDMKKyAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgIEdMdXNo
b3J0IGluZGljZXNbXSA9IHsgMCwgMSwgMiwgMCwgMiwgMywgIC8vIFR3byB0cmlhbmdsZXMgdG8g
bWFrZSB1cCB0aGUgbGF5ZXIgcXVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwg
MiwgM307ICAgICAgIC8vIExpbmUgc2VnbWVudHMgZm9yIHRoZSBib3JkZXIuCisKKyAgICBtYWtl
Q29udGV4dEN1cnJlbnQoKTsKKyAgICBtX2xheWVyUHJvZ3JhbU9iamVjdCA9IGxvYWRTaGFkZXJQ
cm9ncmFtKHZlcnRleFNoYWRlclN0cmluZywgZnJhZ21lbnRTaGFkZXJTdHJpbmcpOworICAgIGlm
IChtX2xheWVyUHJvZ3JhbU9iamVjdCA9PSAwKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVk
IHRvIGNyZWF0ZSBzaGFkZXIgcHJvZ3JhbSBmb3IgbGF5ZXJzIik7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICBtX3Njcm9sbFByb2dyYW1PYmplY3QgPSBsb2FkU2hhZGVyUHJv
Z3JhbSh2ZXJ0ZXhTaGFkZXJTdHJpbmcsIHNjcm9sbEZyYWdtZW50U2hhZGVyU3RyaW5nKTsKKyAg
ICBpZiAobV9zY3JvbGxQcm9ncmFtT2JqZWN0ID09IDApIHsKKyAgICAgICAgTE9HX0VSUk9SKCJG
YWlsZWQgdG8gY3JlYXRlIHNoYWRlciBwcm9ncmFtIGZvciBzY3JvbGxpbmcgbGF5ZXIiKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fYm9yZGVyUHJvZ3JhbU9iamVjdCA9
IGxvYWRTaGFkZXJQcm9ncmFtKGJvcmRlclZlcnRleFNoYWRlclN0cmluZywgYm9yZGVyRnJhZ21l
bnRTaGFkZXJTdHJpbmcpOworICAgIGlmIChtX2JvcmRlclByb2dyYW1PYmplY3QgPT0gMCkgewor
ICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgc2hhZGVyIHByb2dyYW0gZm9yIGRl
YnVnIGJvcmRlcnMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNw
ZWNpZnkgdGhlIGF0dHJpYiBsb2NhdGlvbiBmb3IgdGhlIHBvc2l0aW9uIGFuZCBtYWtlIGl0IHRo
ZSBzYW1lIGZvciBhbGwgdGhyZWUgcHJvZ3JhbXMgdG8KKyAgICAvLyBhdm9pZCBiaW5kaW5nIHJl
LWJpbmRpbmcgdGhlIHZlcnRleCBhdHRyaWJ1dGVzLgorICAgIGJpbmRDb21tb25BdHRyaWJMb2Nh
dGlvbihtX3Bvc2l0aW9uTG9jYXRpb24sICJhX3Bvc2l0aW9uIik7CisgICAgYmluZENvbW1vbkF0
dHJpYkxvY2F0aW9uKG1fdGV4Q29vcmRMb2NhdGlvbiwgImFfdGV4Q29vcmQiKTsKKworICAgIGNo
ZWNrR0xFcnJvcigpOworCisgICAgLy8gUmUtbGluayB0aGUgc2hhZGVycyB0byBnZXQgdGhlIG5l
dyBhdHRyaWIgbG9jYXRpb24gdG8gdGFrZSBlZmZlY3QuCisgICAgZ2xMaW5rUHJvZ3JhbShtX2xh
eWVyUHJvZ3JhbU9iamVjdCk7CisgICAgZ2xMaW5rUHJvZ3JhbShtX2JvcmRlclByb2dyYW1PYmpl
Y3QpOworICAgIGdsTGlua1Byb2dyYW0obV9zY3JvbGxQcm9ncmFtT2JqZWN0KTsKKworICAgIGNo
ZWNrR0xFcnJvcigpOworCisgICAgaW50IHRlc3QxID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihtX2xh
eWVyUHJvZ3JhbU9iamVjdCwgImFfcG9zaXRpb24iKTsKKyAgICBpbnQgdGVzdDIgPSBnbEdldEF0
dHJpYkxvY2F0aW9uKG1fbGF5ZXJQcm9ncmFtT2JqZWN0LCAiYV90ZXhDb29yZCIpOworCisgICAg
Ly8gR2V0IGxvY2F0aW9ucyBvZiB1bmlmb3JtcyBmb3IgdGhlIGxheWVyIGNvbnRlbnQgc2hhZGVy
IHByb2dyYW0uCisgICAgLy9tX3RleENvb3JkTG9jYXRpb24gPSBnbEdldEF0dHJpYkxvY2F0aW9u
KG1fbGF5ZXJQcm9ncmFtT2JqZWN0LCAiYV90ZXhDb29yZCIpOworICAgIG1fc2FtcGxlckxvY2F0
aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9sYXllclByb2dyYW1PYmplY3QsICJzX3RleHR1
cmUiKTsKKyAgICBtX21hdHJpeExvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9sYXll
clByb2dyYW1PYmplY3QsICJtYXRyaXgiKTsKKyAgICBtX2FscGhhTG9jYXRpb24gPSBnbEdldFVu
aWZvcm1Mb2NhdGlvbihtX2xheWVyUHJvZ3JhbU9iamVjdCwgImFscGhhIik7CisKKyAgICBtX3Nj
cm9sbE1hdHJpeExvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9zY3JvbGxQcm9ncmFt
T2JqZWN0LCAibWF0cml4Iik7CisgICAgbV9zY3JvbGxTYW1wbGVyTG9jYXRpb24gPSBnbEdldFVu
aWZvcm1Mb2NhdGlvbihtX3Njcm9sbFByb2dyYW1PYmplY3QsICJzX3RleHR1cmUiKTsKKworICAg
IC8vIEdldCBsb2NhdGlvbnMgb2YgdW5pZm9ybXMgZm9yIHRoZSBkZWJ1ZyBib3JkZXIgc2hhZGVy
IHByb2dyYW0uCisgICAgbV9ib3JkZXJNYXRyaXhMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0
aW9uKG1fYm9yZGVyUHJvZ3JhbU9iamVjdCwgIm1hdHJpeCIpOworICAgIG1fYm9yZGVyQ29sb3JM
b2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fYm9yZGVyUHJvZ3JhbU9iamVjdCwgImNv
bG9yIik7CisKKyAgICBnbEdlbkJ1ZmZlcnMoMywgbV9xdWFkVmJvSWRzKTsKKyAgICBnbEJpbmRC
dWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtX3F1YWRWYm9JZHNbVmVydGljZXNdKTsKKyAgICBnbEJ1
ZmZlckRhdGEoR0xfQVJSQVlfQlVGRkVSLCBzaXplb2YodmVydGljZXMpLCB2ZXJ0aWNlcywgR0xf
U1RBVElDX0RSQVcpOworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwg
bV9xdWFkVmJvSWRzW0xheWVyRWxlbWVudHNdKTsKKyAgICBnbEJ1ZmZlckRhdGEoR0xfRUxFTUVO
VF9BUlJBWV9CVUZGRVIsIHNpemVvZihpbmRpY2VzKSwgaW5kaWNlcywgR0xfU1RBVElDX0RSQVcp
OworCisgICAgLy8gQ3JlYXRlIGEgdGV4dHVyZSBvYmplY3QgdG8gaG9sZCB0aGUgY29udGVudHMg
b2YgdGhlIHJvb3QgbGF5ZXIuCisgICAgbV9yb290TGF5ZXJUZXh0dXJlSWQgPSBjcmVhdGVMYXll
clRleHR1cmUoKTsKKyAgICBpZiAobV9yb290TGF5ZXJUZXh0dXJlSWQgPT0gLTEpIHsKKyAgICAg
ICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHRleHR1cmUgZm9yIHJvb3QgbGF5ZXIiKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOwogfQorICAgIC8vIFR1cm4gb2ZmIGZpbHRlcmluZyBmb3Ig
dGhlIHJvb3QgbGF5ZXIgdG8gYXZvaWQgYmx1cnJpbmcgZnJvbSB0aGUgcmVwZWF0ZWQKKyAgICAv
LyB3cml0ZXMgYW5kIHJlYWRzIHRvIHRoZSBmcmFtZWJ1ZmZlciB0aGF0IGhhcHBlbiB3aGlsZSBz
Y3JvbGxpbmcuCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3Jvb3RMYXllclRl
eHR1cmVJZCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVf
TUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVf
MkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CiAKKyAgICByZXR1cm4gdHJ1
ZTsKK30KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
TGF5ZXJSZW5kZXJlckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uaAkocmV2aXNpb24gNTkxNzQp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJv
bWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw3ICsyOCw2IEBACiAgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgog
ICovCiAKLQogI2lmbmRlZiBMYXllclJlbmRlcmVyQ2hyb21pdW1faAogI2RlZmluZSBMYXllclJl
bmRlcmVyQ2hyb21pdW1faAogCkBAIC0zNiw0NSArMzUsOTUgQEAKIAogI2luY2x1ZGUgIkludFJl
Y3QuaCIKICNpbmNsdWRlICJMYXllckNocm9taXVtLmgiCisjaW5jbHVkZSAiU2tCaXRtYXAuaCIK
ICNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KICNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5o
PgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIHNraWEgewotY2xhc3MgUGxh
dGZvcm1DYW52YXM7Ci19CisjaW5jbHVkZSA8bWFwPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
K2NsYXNzIEdMRVMyQ29udGV4dDsKK2NsYXNzIFBhZ2U7CisKKy8vIENsYXNzIHRoYXQgaGFuZGxl
cyBkcmF3aW5nIG9mIGNvbXBvc2l0ZWQgcmVuZGVyIGxheWVycyB1c2luZyBHTC4KIGNsYXNzIExh
eWVyUmVuZGVyZXJDaHJvbWl1bSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CiBwdWJsaWM6Ci0gICAg
c3RhdGljIFBhc3NPd25QdHI8TGF5ZXJSZW5kZXJlckNocm9taXVtPiBjcmVhdGUoKTsKKyAgICBz
dGF0aWMgUGFzc093blB0cjxMYXllclJlbmRlcmVyQ2hyb21pdW0+IGNyZWF0ZShQYWdlKiBwYWdl
KTsKIAotICAgIExheWVyUmVuZGVyZXJDaHJvbWl1bSgpOworICAgIExheWVyUmVuZGVyZXJDaHJv
bWl1bShQYWdlKiBwYWdlKTsKICAgICB+TGF5ZXJSZW5kZXJlckNocm9taXVtKCk7CiAKLSNpZiBQ
TEFURk9STShTS0lBKQotICAgIHZvaWQgZHJhd0xheWVyc0luQ2FudmFzKHNraWE6OlBsYXRmb3Jt
Q2FudmFzKiwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpOwotI2VuZGlmCi0gICAgdm9pZCB1cGRh
dGVMYXllckNvbnRlbnRzKCk7CisgICAgLy8gVXBkYXRlcyB0aGUgY29udGVudHMgb2YgdGhlIHJv
b3QgbGF5ZXIgdGhhdCBmYWxsIGluc2lkZSB0aGUgdXBkYXRlUmVjdCBhbmQgcmVjb21wb3NpdHMK
KyAgICAvLyBhbGwgdGhlIGxheWVycy4KKyAgICB2b2lkIGRyYXdMYXllcnMoY29uc3QgSW50UmVj
dCYgdXBkYXRlUmVjdCwgY29uc3QgSW50UmVjdCYgdmlzaWJsZVJlY3QsIGNvbnN0IEludFJlY3Qm
IGNvbnRlbnRSZWN0LCBjb25zdCBJbnRQb2ludCYgc2Nyb2xsUG9zaXRpb24pOwogCiAgICAgdm9p
ZCBzZXRSb290TGF5ZXIoUGFzc1JlZlB0cjxMYXllckNocm9taXVtPiBsYXllcikgeyBtX3Jvb3RM
YXllciA9IGxheWVyOyB9CiAgICAgTGF5ZXJDaHJvbWl1bSogcm9vdExheWVyKCkgeyByZXR1cm4g
bV9yb290TGF5ZXIuZ2V0KCk7IH0KIAogICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCkgeyBtX25l
ZWRzRGlzcGxheSA9IHRydWU7IH0KIAotICAgIHZvaWQgc2V0U2Nyb2xsRnJhbWUoU2tJUmVjdCYg
c2Nyb2xsRnJhbWUpIHsgbV9zY3JvbGxGcmFtZSA9IHNjcm9sbEZyYW1lOyB9CisgICAgLy8gRnJl
ZXMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBsYXllci4KKyAgICBib29s
IGZyZWVMYXllclRleHR1cmUoTGF5ZXJDaHJvbWl1bSopOwogCiBwcml2YXRlOgotI2lmIFBMQVRG
T1JNKFNLSUEpCi0gICAgdm9pZCBkcmF3TGF5ZXJJbkNhbnZhc1JlY3Vyc2l2ZShza2lhOjpQbGF0
Zm9ybUNhbnZhcyosIExheWVyQ2hyb21pdW0qLCBmbG9hdCBvcGFjaXR5KTsKLSNlbmRpZgotICAg
IHZvaWQgdXBkYXRlTGF5ZXJDb250ZW50c1JlY3Vyc2l2ZShMYXllckNocm9taXVtKik7CisgICAg
dm9pZCBjb21wb3NpdGVMYXllcnNSZWN1cnNpdmUoTGF5ZXJDaHJvbWl1bSosIGNvbnN0IFRyYW5z
Zm9ybWF0aW9uTWF0cml4JiwgZmxvYXQgb3BhY2l0eSwgY29uc3QgSW50UmVjdCYgdmlzaWJsZVJl
Y3QpOworCisgICAgdm9pZCBkcmF3RGVidWdCb3JkZXIoTGF5ZXJDaHJvbWl1bSosIGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4Jik7CisKKyAgICB2b2lkIGRyYXdUZXh0dXJlZFF1YWQoY29uc3Qg
VHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCwgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwg
ZmxvYXQgb3BhY2l0eSwgYm9vbCBzY3JvbGxpbmcpOworCisgICAgYm9vbCBpc0xheWVyVmlzaWJs
ZShMYXllckNocm9taXVtKiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmLCBjb25zdCBJbnRS
ZWN0JiB2aXNpYmxlUmVjdCk7CisKKyAgICB2b2lkIGJpbmRDb21tb25BdHRyaWJMb2NhdGlvbihp
bnQgbG9jYXRpb24sIGNoYXIqIGF0dHJpYk5hbWUpOworCisgICAgZW51bSBWYm9JZHMgeyBWZXJ0
aWNlcywgTGF5ZXJFbGVtZW50cyB9OworCisgICAgLy8gVGhlc2UgYXJlIGhlcmUgb25seSB0ZW1w
b3JhcmlseSBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB3ZSBzd2l0Y2ggb3ZlciB0byBHR0wK
KyAgICBib29sIGluaXRHTCgpOworICAgIGJvb2wgbWFrZUNvbnRleHRDdXJyZW50KCk7CisKKyAg
ICBib29sIGluaXRpYWxpemVTaGFyZWRHTE9iamVjdHMoKTsKKyAgICBpbnQgZ2V0VGV4dHVyZUlk
KExheWVyQ2hyb21pdW0qKTsKKyAgICBpbnQgYXNzaWduVGV4dHVyZUZvckxheWVyKExheWVyQ2hy
b21pdW0qKTsKKworICAgIC8vIEdMIHNoYWRlciBwcm9ncmFtIG9iamVjdCBJRHMuCisgICAgdW5z
aWduZWQgaW50IG1fbGF5ZXJQcm9ncmFtT2JqZWN0OworICAgIHVuc2lnbmVkIGludCBtX2JvcmRl
clByb2dyYW1PYmplY3Q7CisgICAgdW5zaWduZWQgaW50IG1fc2Nyb2xsUHJvZ3JhbU9iamVjdDsK
KworICAgIHVuc2lnbmVkIGludCBtX3Jvb3RMYXllclRleHR1cmVJZDsKKyAgICBpbnQgbV9yb290
TGF5ZXJUZXh0dXJlV2lkdGg7CisgICAgaW50IG1fcm9vdExheWVyVGV4dHVyZUhlaWdodDsKKwor
ICAgIC8vIFNoYWRlciB1bmlmb3JtIGFuZCBhdHRyaWJ1dGUgbG9jYXRpb25zLgorICAgIGNvbnN0
IGludCBtX3Bvc2l0aW9uTG9jYXRpb247CisgICAgY29uc3QgaW50IG1fdGV4Q29vcmRMb2NhdGlv
bjsKKyAgICBpbnQgbV9zYW1wbGVyTG9jYXRpb247CisgICAgaW50IG1fbWF0cml4TG9jYXRpb247
CisgICAgaW50IG1fYWxwaGFMb2NhdGlvbjsKKyAgICBpbnQgbV9zY3JvbGxNYXRyaXhMb2NhdGlv
bjsKKyAgICBpbnQgbV9zY3JvbGxTYW1wbGVyTG9jYXRpb247CisKKyAgICBpbnQgbV9ib3JkZXJN
YXRyaXhMb2NhdGlvbjsKKyAgICBpbnQgbV9ib3JkZXJDb2xvckxvY2F0aW9uOworCisgICAgdW5z
aWduZWQgaW50IG1fcXVhZFZib0lkc1szXTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtX3By
b2plY3Rpb25NYXRyaXg7CiAKICAgICBSZWZQdHI8TGF5ZXJDaHJvbWl1bT4gbV9yb290TGF5ZXI7
CiAKICAgICBib29sIG1fbmVlZHNEaXNwbGF5OwotICAgIFNrSVJlY3QgbV9zY3JvbGxGcmFtZTsK
KyAgICBJbnRQb2ludCBtX3Njcm9sbFBvc2l0aW9uOworICAgIGJvb2wgbV9oYXJkd2FyZUNvbXBv
c2l0aW5nOworCisgICAgLy8gTWFwIGFzc29jaWF0aW5nIGxheWVycyB3aXRoIHRleHR1cmVzIGlk
cyB1c2VkIGJ5IHRoZSBHTCBjb21wb3NpdG9yLgorICAgIHN0ZDo6bWFwPExheWVyQ2hyb21pdW0q
LCB1bnNpZ25lZCBpbnQ+IG1fdGV4dHVyZUlkTWFwOworCisgICAgT3duUHRyPEdMRVMyQ29udGV4
dD4gbV9nbGVzMkNvbnRleHQ7CisKKyAgICAvLyBUaGUgV2ViQ29yZSBQYWdlIHRoYXQgdGhlIGNv
bXBvc2l0b3IgcmVuZGVycyBpbnRvLgorICAgIFBhZ2UqIG1fcGFnZTsKIH07CiAKIH0KSW5kZXg6
IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVt
L0NoYW5nZUxvZwkocmV2aXNpb24gNTkzMzQpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9n
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTAtMDUtMTIgIFZhbmdlbGlzIEtv
a2tldmlzICA8dmFuZ2VsaXNAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFN3aXRjaGluZyBvdmVy
IHRvIHVzaW5nIGhhcmR3YXJlIGNvbXBvc2l0aW5nIGZvciBMYXllckNocm9taXVtIGxheWVycy4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM4NzgzCisK
KyAgICAgICAgKiBzcmMvV2ViVmlld0ltcGwuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3
SW1wbDo6cGFpbnQpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6c2V0SXNBY2NlbGVy
YXRlZENvbXBvc2l0aW5nQWN0aXZlKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnVw
ZGF0ZVJvb3RMYXllckNvbnRlbnRzKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnNl
dFJvb3RMYXllck5lZWRzRGlzcGxheSk6CisKIDIwMTAtMDUtMTIgIEpvaG4gQWJkLUVsLU1hbGVr
ICA8amFtQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBGaXNoZXIu
CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAkocmV2aXNpb24gNTkxNzQpCisr
KyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
OTcwLDEyICs5NzAsMTkgQEAgdm9pZCBXZWJWaWV3SW1wbDo6cGFpbnQoV2ViQ2FudmFzKiBjYW52
YQogICAgICAgICAvLyBEcmF3IHRoZSBjb250ZW50cyBvZiB0aGUgcm9vdCBsYXllci4KICAgICAg
ICAgdXBkYXRlUm9vdExheWVyQ29udGVudHMocmVjdCk7CiAKLSAgICAgICAgLy8gQ29tcG9zaXRl
IGV2ZXJ5dGhpbmcgaW50byB0aGUgY2FudmFzIHRoYXQncyBwYXNzZWQgdG8gdXMuCi0jaWYgUExB
VEZPUk0oU0tJQSkKLSAgICAgICAgbV9sYXllclJlbmRlcmVyLT5kcmF3TGF5ZXJzSW5DYW52YXMo
c3RhdGljX2Nhc3Q8c2tpYTo6UGxhdGZvcm1DYW52YXMqPihjYW52YXMpLCBJbnRSZWN0KHJlY3Qp
KTsKLSNlbGlmIFBMQVRGT1JNKENHKQotI2Vycm9yICJOZWVkIHRvIGltcGxlbWVudCBDRyB2ZXJz
aW9uIgotI2VuZGlmCisgICAgICAgIFdlYkZyYW1lSW1wbCogd2ViZnJhbWUgPSBtYWluRnJhbWVJ
bXBsKCk7CisgICAgICAgIGlmICghd2ViZnJhbWUpCisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIEZyYW1lVmlldyogdmlldyA9IHdlYmZyYW1lLT5mcmFtZVZpZXcoKTsKKyAgICAgICAgaWYg
KCF2aWV3KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFRoZSB2aXNpYmxlUmVj
dCBpbmNsdWRlcyBzY3JvbGxiYXJzIHdoZXJlYXMgdGhlIGNvbnRlbnRSZWN0IGRvZXNuJ3QuCisg
ICAgICAgIEludFJlY3QgdmlzaWJsZVJlY3QgPSB2aWV3LT52aXNpYmxlQ29udGVudFJlY3QodHJ1
ZSk7CisgICAgICAgIEludFJlY3QgY29udGVudFJlY3QgPSB2aWV3LT52aXNpYmxlQ29udGVudFJl
Y3QoZmFsc2UpOworCisgICAgICAgIC8vIEFzayB0aGUgbGF5ZXIgY29tcG9zaXRvciB0byByZWRy
YXcgYWxsIHRoZSBsYXllcnMuCisgICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+ZHJhd0xheWVycyhy
ZWN0LCB2aXNpYmxlUmVjdCwgY29udGVudFJlY3QsIEludFBvaW50KHZpZXctPnNjcm9sbFgoKSwg
dmlldy0+c2Nyb2xsWSgpKSk7CiAgICAgfQogI2VuZGlmCiB9CkBAIC0yMDcyLDcgKzIwNzksNyBA
QCB2b2lkIFdlYlZpZXdJbXBsOjpzZXRJc0FjY2VsZXJhdGVkQ29tcG9zCiAgICAgICAgIHJldHVy
bjsKIAogICAgIGlmIChhY3RpdmUpIHsKLSAgICAgICAgbV9sYXllclJlbmRlcmVyID0gTGF5ZXJS
ZW5kZXJlckNocm9taXVtOjpjcmVhdGUoKTsKKyAgICAgICAgbV9sYXllclJlbmRlcmVyID0gTGF5
ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUocGFnZSgpKTsKICAgICAgICAgaWYgKG1fbGF5ZXJS
ZW5kZXJlcikKICAgICAgICAgICAgIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0aXZlID0g
dHJ1ZTsKICAgICB9IGVsc2UgewpAQCAtMjA4Niw2ICsyMDkzLDEyIEBAIHZvaWQgV2ViVmlld0lt
cGw6OnVwZGF0ZVJvb3RMYXllckNvbnRlbnQKICAgICBpZiAoIWlzQWNjZWxlcmF0ZWRDb21wb3Np
dGluZ0FjdGl2ZSgpKQogICAgICAgICByZXR1cm47CiAKKyAgICAvLyBGSVhNRTogVGhlIGFjY2Vs
ZXJhdGVkIGNvbXBvc2l0aW5nIHBhdGggaW52YWxpZGF0ZXMgYSAxeDEgcmVjdCBhdCAoMCwgMCkK
KyAgICAvLyBpbiBvcmRlciB0byBnZXQgdGhlIHJlbmRlcmVyIHRvIGFzayB0aGUgY29tcG9zaXRv
ciB0byByZWRyYXcuIFRoaXMgaXMgb25seQorICAgIC8vIHRlbXBvcmFyeSB1bnRpbCB3ZSBnZXQg
dGhlIGNvbXBvc2l0b3IgdG8gcmVuZGVyIGRpcmVjdGx5IGZyb20gaXRzIG93biB0aHJlYWQuCisg
ICAgaWYgKHJlY3QueCA9PSAwICYmIHJlY3QueSA9PSAwICYmIHJlY3Qud2lkdGggPT0gMSAmJiBy
ZWN0LmhlaWdodCA9PSAxKQorICAgICAgICByZXR1cm47CisKICAgICBXZWJGcmFtZUltcGwqIHdl
YmZyYW1lID0gbWFpbkZyYW1lSW1wbCgpOwogICAgIGlmICghd2ViZnJhbWUpCiAgICAgICAgIHJl
dHVybjsKQEAgLTIwOTMsMjQgKzIxMDYsMjcgQEAgdm9pZCBXZWJWaWV3SW1wbDo6dXBkYXRlUm9v
dExheWVyQ29udGVudAogICAgIGlmICghdmlldykKICAgICAgICAgcmV0dXJuOwogCi0gICAgV2Vi
UmVjdCB2aWV3UmVjdCA9IHZpZXctPmZyYW1lUmVjdCgpOwotICAgIFNrSVJlY3Qgc2Nyb2xsRnJh
bWU7Ci0gICAgc2Nyb2xsRnJhbWUuc2V0KHZpZXctPnNjcm9sbFgoKSwgdmlldy0+c2Nyb2xsWSgp
LCB2aWV3LT5sYXlvdXRXaWR0aCgpICsgdmlldy0+c2Nyb2xsWCgpLCB2aWV3LT5sYXlvdXRIZWln
aHQoKSArIHZpZXctPnNjcm9sbFkoKSk7Ci0gICAgbV9sYXllclJlbmRlcmVyLT5zZXRTY3JvbGxG
cmFtZShzY3JvbGxGcmFtZSk7CiAgICAgTGF5ZXJDaHJvbWl1bSogcm9vdExheWVyID0gbV9sYXll
clJlbmRlcmVyLT5yb290TGF5ZXIoKTsKICAgICBpZiAocm9vdExheWVyKSB7CiAgICAgICAgIElu
dFJlY3QgdmlzaWJsZVJlY3QgPSB2aWV3LT52aXNpYmxlQ29udGVudFJlY3QodHJ1ZSk7CiAKLSAg
ICAgICAgLy8gU2V0IHRoZSBiYWNraW5nIHN0b3JlIHNpemUgdXNlZCBieSB0aGUgcm9vdCBsYXll
ciB0byBiZSB0aGUgc2l6ZSBvZiB0aGUgdmlzaWJsZQotICAgICAgICAvLyBhcmVhLiBOb3RlIHRo
YXQgdGhlIHJvb3QgbGF5ZXIgYm91bmRzIGNvdWxkIGJlIGxhcmdlciB0aGFuIHRoZSBiYWNraW5n
IHN0b3JlIHNpemUsCi0gICAgICAgIC8vIGJ1dCB0aGVyZSdzIG5vIHJlYXNvbiB0byB3YXN0ZSBt
ZW1vcnkgYnkgYWxsb2NhdGluZyBiYWNraW5nIHN0b3JlIGxhcmdlciB0aGFuIHRoZQotICAgICAg
ICAvLyB2aXNpYmxlIHBvcnRpb24uCi0gICAgICAgIHJvb3RMYXllci0+c2V0QmFja2luZ1N0b3Jl
UmVjdChJbnRTaXplKHZpc2libGVSZWN0LndpZHRoKCksIHZpc2libGVSZWN0LmhlaWdodCgpKSk7
CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgcm9vdCBsYXllcidzIGJhY2tpbmcgc3RvcmUgdG8gYmUg
dGhlIHNpemUgb2YgdGhlIGRpcnR5IHJlY3QuCisgICAgICAgIC8vIFVubGlrZSBvdGhlciBsYXll
cnMgdGhlIHJvb3QgbGF5ZXIgZG9lc24ndCBoYXZlIHBlcnNpc3RlbnQgc3RvcmFnZSBmb3IgaXRz
CisgICAgICAgIC8vIGNvbnRlbnRzIGluIHN5c3RlbSBtZW1vcnkuCisgICAgICAgIHJvb3RMYXll
ci0+c2V0QmFja2luZ1N0b3JlU2l6ZShJbnRTaXplKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KSk7
CiAgICAgICAgIEdyYXBoaWNzQ29udGV4dCogcm9vdExheWVyQ29udGV4dCA9IHJvb3RMYXllci0+
Z3JhcGhpY3NDb250ZXh0KCk7Ci0gICAgICAgIHJvb3RMYXllckNvbnRleHQtPnNhdmUoKTsKKyAg
ICAgICAgc2tpYTo6UGxhdGZvcm1DYW52YXMqIHBsYXRmb3JtQ2FudmFzID0gcm9vdExheWVyLT5w
bGF0Zm9ybUNhbnZhcygpOworCisgICAgICAgIHBsYXRmb3JtQ2FudmFzLT5zYXZlKCk7CiAKKyAg
ICAgICAgLy8gQnJpbmcgdGhlIGNhbnZhcyBpbnRvIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0
aGUgcGFpbnQgcmVjdC4KKyAgICAgICAgcGxhdGZvcm1DYW52YXMtPnRyYW5zbGF0ZShzdGF0aWNf
Y2FzdDxTa1NjYWxhcj4oLXJlY3QueCksIHN0YXRpY19jYXN0PFNrU2NhbGFyPigtcmVjdC55KSk7
CisKKyAgICAgICAgcm9vdExheWVyQ29udGV4dC0+c2F2ZSgpOwogICAgICAgICB3ZWJmcmFtZS0+
cGFpbnRXaXRoQ29udGV4dCgqKHJvb3RMYXllci0+Z3JhcGhpY3NDb250ZXh0KCkpLCByZWN0KTsK
ICAgICAgICAgcm9vdExheWVyQ29udGV4dC0+cmVzdG9yZSgpOworCisgICAgICAgIHBsYXRmb3Jt
Q2FudmFzLT5yZXN0b3JlKCk7CiAgICAgfQogfQogCkBAIC0yMTE5LDggKzIxMzUsMTAgQEAgdm9p
ZCBXZWJWaWV3SW1wbDo6c2V0Um9vdExheWVyTmVlZHNEaXNwbAogICAgIC8vIEZJWE1FOiBGb3Ig
bm93IHdlJ3JlIHBvc3RpbmcgYSByZXBhaW50IGV2ZW50IGZvciB0aGUgZW50aXJlIHBhZ2Ugd2hp
Y2ggaXMgYW4gb3ZlcmtpbGwuCiAgICAgaWYgKFdlYkZyYW1lSW1wbCogd2ViZnJhbWUgPSBtYWlu
RnJhbWVJbXBsKCkpIHsKICAgICAgICAgaWYgKEZyYW1lVmlldyogdmlldyA9IHdlYmZyYW1lLT5m
cmFtZVZpZXcoKSkgeworICAgICAgICAgICAgLy8gRklYTUU6IFRlbXBvcmFyeSBoYWNrIHRvIGlu
dmFsaWRhdGUgcGFydCBvZiB0aGUgcGFnZSBzbyB0aGF0IHdlIGdldCBjYWxsZWQgdG8gcmVuZGVy
CisgICAgICAgICAgICAvLyAgICAgICAgYWdhaW4uCiAgICAgICAgICAgICBJbnRSZWN0IHZpc2li
bGVSZWN0ID0gdmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KHRydWUpOwotICAgICAgICAgICAgbV9j
bGllbnQtPmRpZEludmFsaWRhdGVSZWN0KHZpc2libGVSZWN0KTsKKyAgICAgICAgICAgIG1fY2xp
ZW50LT5kaWRJbnZhbGlkYXRlUmVjdChJbnRSZWN0KDAsIDAsIDEsIDEpKTsKICAgICAgICAgfQog
ICAgIH0KIAo=
</data>
<flag name="review"
          id="40326"
          type_id="1"
          status="-"
          setter="abarth"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56010</attachid>
            <date>2010-05-13 13:04:10 -0700</date>
            <delta_ts>2010-05-17 17:49:34 -0700</delta_ts>
            <desc>Proposed patch with style issues fixed</desc>
            <filename>glCompositor_1.txt</filename>
            <type>text/plain</type>
            <size>62199</size>
            <attacher name="Vangelis Kokkevis">vangelis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1OTMzNCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzIgQEAKKzIwMTAtMDUtMTIgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNA
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEltcGxlbWVudGluZyBoL3cgYWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcgb2YgbGF5ZXJz
IGZvciBjaHJvbWltdW0uCisgICAgICAgICogUmVtb3ZlZCB0aGUgZXhpc3Rpbmcgc29mdHdhcmUg
Y29tcG9zaXRpbmcgcGF0aCBmb3IgTGF5ZXJDaHJvbWl1bSdzIGFuZAorICAgICAgICAgIHJlcGxh
Y2VkIGl0IHdpdGggYSBHTCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgKiBGaXhlZCBpc3N1ZXMg
d2l0aCBMYXllckNocm9taXVtIGhpZXJhcmNoeSB1cGRhdGUgY29kZS4KKyAgICAgICAgKiBBZGRl
ZCBjb2RlIGZvciBoYW5kbGluZyBsYXllcnMgdGhhdCBjb250YWluIGp1c3Qgb25lIEltYWdlIGVs
ZW1lbnQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0z
ODc4MworCisgICAgICAgICogV2ViQ29yZS5neXAvV2ViQ29yZS5neXA6IAorICAgICAgICAgICAg
IEFkZGVkIGNocm9taXVtJ3MgZ3B1IGRpciBpbiBpbmNsdWRlIHBhdGguCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6fkdyYXBoaWNzTGF5ZXJDaHJvbWl1
bSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldENvbnRlbnRz
VG9JbWFnZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQ2hyb21pdW06OnVwZGF0
ZUxheWVyRHJhd3NDb250ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDaHJv
bWl1bTo6dXBkYXRlQ29udGVudHNJbWFnZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xh
eWVyQ2hyb21pdW06OnVwZGF0ZUNvbnRlbnRzUmVjdCk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmg6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllckNocm9taXVtOjpMYXllckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
Q2hyb21pdW06On5MYXllckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21p
dW06OnVwZGF0ZUdyYXBoaWNzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9t
aXVtOjpkcmF3c0NvbnRlbnRVcGRhdGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21p
dW06OnVwZGF0ZUNvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnNl
dENvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnNldE5lZWRzQ29t
bWl0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06Omluc2VydFN1YmxheWVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnJlbW92ZUZyb21TdXBlcmxheWVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnJlbW92ZVN1YmxheWVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnJlcGxhY2VTdWJsYXllcik6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllckNocm9taXVtOjpzZXRCYWNraW5nU3RvcmVTaXplKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyQ2hyb21pdW06OnNldEJvdW5kcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXll
ckNocm9taXVtOjpyZW1vdmVBbGxTdWJsYXllcnMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJD
aHJvbWl1bTo6c2V0U3VibGF5ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06
OnNldE5lZWRzRGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
TGF5ZXJDaHJvbWl1bS5oOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6Y29udGVu
dHNEaXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjpjb250ZW50cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjpkcmF3c0NvbnRlbnQpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6c2V0U3VwZXJsYXllcik6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6Oik6CisgICAgICAgIChXZWJDb3JlOjpjaGVja0dMRXJyb3IpOgorICAgICAgICAo
V2ViQ29yZTo6Y3JlYXRlVGV4dHVyZU9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpsb2FkU2hh
ZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OmxvYWRTaGFkZXJQcm9ncmFtKToKKyAgICAgICAgKFdl
YkNvcmU6OnRvR0xNYXRyaXgpOgorICAgICAgICAoV2ViQ29yZTo6b3J0aG9NYXRyaXgpOgorICAg
ICAgICAoV2ViQ29yZTo6Y3JlYXRlTGF5ZXJUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyUmVuZGVyZXJDaHJvbWl1bTo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVu
ZGVyZXJDaHJvbWl1bTo6TGF5ZXJSZW5kZXJlckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6fkxheWVyUmVuZGVyZXJDaHJvbWl1bSk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmRyYXdUZXh0dXJlZFF1YWQpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3TGF5ZXJzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6Z2V0VGV4dHVyZUlkKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6YXNzaWduVGV4dHVyZUZvckxheWVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6ZnJlZUxheWVyVGV4
dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmRyYXdEZWJ1
Z0JvcmRlcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmlzTGF5
ZXJWaXNpYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6Y29t
cG9zaXRlTGF5ZXJzUmVjdXJzaXZlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJD
aHJvbWl1bTo6bWFrZUNvbnRleHRDdXJyZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVu
ZGVyZXJDaHJvbWl1bTo6aW5pdEdMKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJD
aHJvbWl1bTo6YmluZENvbW1vbkF0dHJpYkxvY2F0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyUmVuZGVyZXJDaHJvbWl1bTo6aW5pdGlhbGl6ZVNoYXJlZEdMT2JqZWN0cyk6CisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmg6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06Oik6CisKIDIwMTAtMDUtMTIg
IEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdl
ZCBieSBTaW1vbiBGcmFzZXIuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAJKHJldmlzaW9u
IDU5MTc0KQorKysgV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJDb3JlLmd5cAkod29ya2luZyBjb3B5
KQpAQCAtNzIyLDYgKzcyMiw3IEBACiAgICAgICAnaW5jbHVkZV9kaXJzJzogWwogICAgICAgICAn
PChJTlRFUk1FRElBVEVfRElSKScsCiAgICAgICAgICc8QCh3ZWJjb3JlX2luY2x1ZGVfZGlycykn
LAorICAgICAgICAnPChjaHJvbWl1bV9zcmNfZGlyKS9ncHUnCiAgICAgICBdLAogICAgICAgJ3Nv
dXJjZXMnOiBbCiAgICAgICAgICc8QCh3ZWJjb3JlX2ZpbGVzKScsCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVy
Q2hyb21pdW0uY3BwCShyZXZpc2lvbiA1OTE3NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MTAxLDEyICsxMDEsNiBAQCBHcmFwaGljc0xheWVyQ2hyb21pdW06OkdyYXBoaWNzTGF5ZXJDaHJv
CiAKIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6fkdyYXBoaWNzTGF5ZXJDaHJvbWl1bSgpCiB7Ci0g
ICAgLy8gQ2xlYW4gdXAgdGhlIFNraWEgbGF5ZXIuCi0gICAgaWYgKG1fbGF5ZXIpCi0gICAgICAg
IG1fbGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7Ci0KLSAgICBpZiAobV90cmFuc2Zvcm1M
YXllcikKLSAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsK
IH0KIAogdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldE5hbWUoY29uc3QgU3RyaW5nJiBp
bk5hbWUpCkBAIC0zMTEsNyArMzA1LDIzIEBAIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjpz
ZXRDb250ZW50c1IKIAogdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldENvbnRlbnRzVG9J
bWFnZShJbWFnZSogaW1hZ2UpCiB7Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAorICAgIGJvb2wg
Y2hpbGRyZW5DaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIG1fcGVu
ZGluZ0NvbnRlbnRzSW1hZ2UgPSBpbWFnZS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsK
KyAgICAgICAgbV9jb250ZW50c0xheWVyUHVycG9zZSA9IENvbnRlbnRzTGF5ZXJGb3JJbWFnZTsK
KyAgICAgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgICAgICBjaGlsZHJlbkNoYW5n
ZWQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fcGVuZGluZ0NvbnRlbnRzSW1hZ2Ug
PSAwOworICAgICAgICBtX2NvbnRlbnRzTGF5ZXJQdXJwb3NlID0gTm9Db250ZW50c0xheWVyOwor
ICAgICAgICBpZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICAgICAgY2hpbGRyZW5DaGFuZ2Vk
ID0gdHJ1ZTsKKyAgICB9CisKKyAgICB1cGRhdGVDb250ZW50c0ltYWdlKCk7CisKKyAgICBpZiAo
Y2hpbGRyZW5DaGFuZ2VkKQorICAgICAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKIH0KIAogdm9p
ZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldENvbnRlbnRzVG9WaWRlbyhQbGF0Zm9ybUxheWVy
KiB2aWRlb0xheWVyKQpAQCAtNDY5LDYgKzQ3OSwxMSBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJv
bWl1bTo6dXBkYXRlTGF5ZXJQCiAKIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjp1cGRhdGVM
YXllckRyYXdzQ29udGVudCgpCiB7CisgICAgLy8gU2luY2Ugb25seSBsYXllcnMgdGhhdCBkcmF3
IGNvbnRlbnQgaGF2ZSBhIHZhbGlkIGNvbnRleHQKKyAgICAvLyB3ZSBuZWVkIHRvIGNhbGwgdXBk
YXRlR3JhcGhpY3NDb250ZXh0KCkgaGVyZSB0byBtYWtlIHN1cmUgb25lCisgICAgLy8gZ2V0cyBj
cmVhdGVkLgorICAgIG1fbGF5ZXItPmRyYXdzQ29udGVudFVwZGF0ZWQoKTsKKwogICAgIGlmICht
X2RyYXdzQ29udGVudCkKICAgICAgICAgbV9sYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CiAKQEAg
LTQ4OSw3ICs1MDQsMjIgQEAgdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnVwZGF0ZUxheWVy
QgogCiB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6dXBkYXRlQ29udGVudHNJbWFnZSgpCiB7
Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAorICAgIGlmIChtX3BlbmRpbmdDb250ZW50c0ltYWdl
KSB7CisgICAgICAgIGlmICghbV9jb250ZW50c0xheWVyLmdldCgpKSB7CisgICAgICAgICAgICBS
ZWZQdHI8TGF5ZXJDaHJvbWl1bT4gaW1hZ2VMYXllciA9IExheWVyQ2hyb21pdW06OmNyZWF0ZShM
YXllckNocm9taXVtOjpMYXllciwgdGhpcyk7CisKKyAgICAgICAgICAgIHNldHVwQ29udGVudHNM
YXllcihpbWFnZUxheWVyLmdldCgpKTsKKyAgICAgICAgICAgIG1fY29udGVudHNMYXllciA9IGlt
YWdlTGF5ZXI7CisgICAgICAgICAgICAvLyBtX2NvbnRlbnRzTGF5ZXIgd2lsbCBiZSBwYXJlbnRl
ZCBieSB1cGRhdGVTdWJsYXllckxpc3QuCisgICAgICAgIH0KKyAgICAgICAgbV9jb250ZW50c0xh
eWVyLT5zZXRDb250ZW50cyhtX3BlbmRpbmdDb250ZW50c0ltYWdlKTsKKyAgICAgICAgbV9wZW5k
aW5nQ29udGVudHNJbWFnZSA9IDA7CisKKyAgICAgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTm8gaW1hZ2UuIG1fY29udGVudHNMYXllciB3aWxsIGJl
IHJlbW92ZWQgdmlhIHVwZGF0ZVN1YmxheWVyTGlzdC4KKyAgICAgICAgbV9jb250ZW50c0xheWVy
ID0gMDsKKyAgICB9CiB9CiAKIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjp1cGRhdGVDb250
ZW50c1ZpZGVvKCkKQEAgLTUwMiw3ICs1MzIsOCBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1
bTo6dXBkYXRlQ29udGVuCiAgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCiAgICAgICAgIHJldHVy
bjsKIAotICAgIG1fY29udGVudHNMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludChtX2NvbnRl
bnRzUmVjdC54KCksIG1fY29udGVudHNSZWN0LnkoKSkpOworICAgIC8vIFRoZSBwb3NpdGlvbiBv
ZiB0aGV5IGxheWVyIGlzIHRoZSBjZW50ZXIgb2YgcXVhZC4KKyAgICBtX2NvbnRlbnRzTGF5ZXIt
PnNldFBvc2l0aW9uKEZsb2F0UG9pbnQobV9jb250ZW50c1JlY3QueCgpICsgbV9jb250ZW50c1Jl
Y3Qud2lkdGgoKSAvIDIsIG1fY29udGVudHNSZWN0LnkoKSArIG1fY29udGVudHNSZWN0LmhlaWdo
dCgpIC8gMikpOwogICAgIG1fY29udGVudHNMYXllci0+c2V0Qm91bmRzKEludFNpemUobV9jb250
ZW50c1JlY3Qud2lkdGgoKSwgbV9jb250ZW50c1JlY3QuaGVpZ2h0KCkpKTsKIH0KIApJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0u
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBo
aWNzTGF5ZXJDaHJvbWl1bS5oCShyZXZpc2lvbiA1OTE3NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmgJKHdvcmtpbmcgY29weSkK
QEAgLTE0MCw2ICsxNDAsOCBAQCBwcml2YXRlOgogCiAgICAgQ29udGVudHNMYXllclB1cnBvc2Ug
bV9jb250ZW50c0xheWVyUHVycG9zZTsKICAgICBib29sIG1fY29udGVudHNMYXllckhhc0JhY2tn
cm91bmRDb2xvciA6IDE7CisKKyAgICBOYXRpdmVJbWFnZVB0ciBtX3BlbmRpbmdDb250ZW50c0lt
YWdlOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lv
biA1OTE3NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJv
bWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU1LDkgKzU1LDEwIEBAIExheWVyQ2hyb21pdW06
OkxheWVyQ2hyb21pdW0oTGF5ZXJUeXBlIHQKICAgICAsIG1fYm9yZGVyV2lkdGgoMCkKICAgICAs
IG1fYm9yZGVyQ29sb3IoMCwgMCwgMCwgMCkKICAgICAsIG1fYmFja2dyb3VuZENvbG9yKDAsIDAs
IDAsIDApCisgICAgLCBtX2FuY2hvclBvaW50KDAuNSwgMC41KQogICAgICwgbV9hbmNob3JQb2lu
dFooMCkKICAgICAsIG1fY2xlYXJzQ29udGV4dChmYWxzZSkKLSAgICAsIG1fZG91YmxlU2lkZWQo
ZmFsc2UpCisgICAgLCBtX2RvdWJsZVNpZGVkKHRydWUpCiAgICAgLCBtX2VkZ2VBbnRpYWxpYXNp
bmdNYXNrKDApCiAgICAgLCBtX2hpZGRlbihmYWxzZSkKICAgICAsIG1fbWFza3NUb0JvdW5kcyhm
YWxzZSkKQEAgLTY5LDIyICs3MCwzOSBAQCBMYXllckNocm9taXVtOjpMYXllckNocm9taXVtKExh
eWVyVHlwZSB0CiAgICAgLCBtX3NraWFDb250ZXh0KDApCiAgICAgLCBtX2dyYXBoaWNzQ29udGV4
dCgwKQogICAgICwgbV9nZW9tZXRyeUZsaXBwZWQoZmFsc2UpCisgICAgLCBtX2NvbnRlbnRzRGly
dHkoZmFsc2UpCisgICAgLCBtX2NvbnRlbnRzKDApCisgICAgLCBtX2hhc0NvbnRleHQoZmFsc2Up
CiB7Ci0gICAgdXBkYXRlR3JhcGhpY3NDb250ZXh0KG1fYmFja2luZ1N0b3JlUmVjdCk7CiB9CiAK
IExheWVyQ2hyb21pdW06On5MYXllckNocm9taXVtKCkKIHsKLSAgICAvLyBPdXIgc3VwZXJsYXll
ciBzaG91bGQgYmUgaG9sZGluZyBhIHJlZmVyZW5jZSB0byB1cywgc28gdGhlcmUgc2hvdWxkIGJl
IG5vIHdheSBmb3IgdXMgdG8gYmUgZGVzdHJveWVkIHdoaWxlIHdlIHN0aWxsIGhhdmUgYSBzdXBl
cmxheWVyLgorICAgIC8vIE91ciBzdXBlcmxheWVyIHNob3VsZCBiZSBob2xkaW5nIGEgcmVmZXJl
bmNlIHRvIHVzIHNvIHRoZXJlIHNob3VsZCBiZSBubworICAgIC8vIHdheSBmb3IgdXMgdG8gYmUg
ZGVzdHJveWVkIHdoaWxlIHdlIHN0aWxsIGhhdmUgYSBzdXBlcmxheWVyLgogICAgIEFTU0VSVCgh
c3VwZXJsYXllcigpKTsKKyAgICByZW1vdmVBbGxTdWJsYXllcnMoKTsKIH0KIAotdm9pZCBMYXll
ckNocm9taXVtOjp1cGRhdGVHcmFwaGljc0NvbnRleHQoY29uc3QgSW50U2l6ZSYgc2l6ZSkKK3Zv
aWQgTGF5ZXJDaHJvbWl1bTo6dXBkYXRlR3JhcGhpY3NDb250ZXh0KCkKIHsKKyAgICAvLyBJZiB0
aGUgbGF5ZXIgZG9lc24ndCBkcmF3IGFueXRoaW5nIChlLmcuIGl0J3MgYSBjb250YWluZXIgbGF5
ZXIpIHRoZW4gd2UKKyAgICAvLyBkb24ndCBjcmVhdGUgYSBjYW52YXMgLyBjb250ZXh0IGZvciBp
dC4gVGhlIHJvb3QgbGF5ZXIgaXMgYSBzcGVjaWFsCisgICAgLy8gY2FzZSBhcyBldmVuIGlmIGl0
J3MgbWFya2VkIGFzIGEgY29udGFpbmVyIGxheWVyIGl0IGRvZXMgYWN0dWFsbHkgaGF2ZQorICAg
IC8vIGNvbnRlbnQgdGhhdCBpdCBkcmF3cy4KKyAgICBSZW5kZXJMYXllckJhY2tpbmcqIGJhY2tp
bmcgPSBzdGF0aWNfY2FzdDxSZW5kZXJMYXllckJhY2tpbmcqPihtX293bmVyLT5jbGllbnQoKSk7
CisgICAgaWYgKCFkcmF3c0NvbnRlbnQoKSAmJiAhKHRoaXMgPT0gcm9vdExheWVyKCkpKSB7Cisg
ICAgICAgIG1fZ3JhcGhpY3NDb250ZXh0LmNsZWFyKCk7CisgICAgICAgIG1fc2tpYUNvbnRleHQu
Y2xlYXIoKTsKKyAgICAgICAgbV9jYW52YXMuY2xlYXIoKTsKKyAgICAgICAgbV9oYXNDb250ZXh0
ID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICNpZiBQTEFURk9STShTS0lBKQog
ICAgIC8vIENyZWF0ZSBuZXcgY2FudmFzIGFuZCBjb250ZXh0LiBPd25QdHIgdGFrZXMgY2FyZSBv
ZiBmcmVlaW5nIHVwCiAgICAgLy8gdGhlIG9sZCBvbmVzLgotICAgIG1fY2FudmFzID0gbmV3IHNr
aWE6OlBsYXRmb3JtQ2FudmFzKHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgZmFsc2UpOwor
ICAgIG1fY2FudmFzID0gbmV3IHNraWE6OlBsYXRmb3JtQ2FudmFzKG1fYmFja2luZ1N0b3JlU2l6
ZS53aWR0aCgpLCBtX2JhY2tpbmdTdG9yZVNpemUuaGVpZ2h0KCksIGZhbHNlKTsKICAgICBtX3Nr
aWFDb250ZXh0ID0gbmV3IFBsYXRmb3JtQ29udGV4dFNraWEobV9jYW52YXMuZ2V0KCkpOwogCiAg
ICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IHRleHQgdG8gc2hvdyB1cCBjb3JyZWN0bHkuIFdp
dGhvdXQgaXQsCkBAIC05MywzNyArMTExLDQ3IEBAIHZvaWQgTGF5ZXJDaHJvbWl1bTo6dXBkYXRl
R3JhcGhpY3NDb250ZXgKICAgICBtX3NraWFDb250ZXh0LT5zZXREcmF3aW5nVG9JbWFnZUJ1ZmZl
cih0cnVlKTsKIAogICAgIG1fZ3JhcGhpY3NDb250ZXh0ID0gbmV3IEdyYXBoaWNzQ29udGV4dChy
ZWludGVycHJldF9jYXN0PFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0Kj4obV9za2lhQ29udGV4dC5n
ZXQoKSkpOworCisgICAgbV9oYXNDb250ZXh0ID0gdHJ1ZTsKKyAgICBtX2NvbnRlbnRzRGlydHkg
PSB0cnVlOwogI2Vsc2UKICNlcnJvciAiTmVlZCB0byBpbXBsZW1lbnQgZm9yIHlvdXIgcGxhdGZv
cm0uIgogI2VuZGlmCi0gICAgLy8gVGhlIGJhY2tpbmcgc3RvcmUgYWxsb2NhdGVkIGZvciBhIGxh
eWVyIGNhbiBiZSBzbWFsbGVyIHRoYW4gdGhlIGxheWVyJ3MgYm91bmRzLgotICAgIC8vIFRoaXMg
aXMgbW9zdGx5IHRydWUgZm9yIHRoZSByb290IGxheWVyIHdob3NlIGJhY2tpbmcgc3RvcmUgaXMg
c2l6ZWQgYmFzZWQgb24gdGhlIHZpc2libGUKLSAgICAvLyBwb3J0aW9uIG9mIHRoZSBsYXllciBy
YXRoZXIgdGhhbiB0aGUgYWN0dWFsIHBhZ2Ugc2l6ZS4KLSAgICBtX2JhY2tpbmdTdG9yZVJlY3Qg
PSBzaXplOworCisgICAgcmV0dXJuOworfQorCit2b2lkIExheWVyQ2hyb21pdW06OmRyYXdzQ29u
dGVudFVwZGF0ZWQoKQoreworICAgIC8vIENyZWF0ZSBhIGRyYXdpbmcgY29udGV4dCBpZiB0aGUg
bGF5ZXIgbm93IGRyYXdzIGNvbnRlbnQKKyAgICAvLyBvciBkZWxldGUgdGhlIGV4aXN0aW5nIGNv
bnRleHQgaWYgdGhlIGxheWVyIGRvZXNuJ3QgZHJhdworICAgIC8vIGNvbnRlbnQgYW55bW9yZS4K
KyAgICB1cGRhdGVHcmFwaGljc0NvbnRleHQoKTsKIH0KIAogdm9pZCBMYXllckNocm9taXVtOjp1
cGRhdGVDb250ZW50cygpCiB7CiAgICAgUmVuZGVyTGF5ZXJCYWNraW5nKiBiYWNraW5nID0gc3Rh
dGljX2Nhc3Q8UmVuZGVyTGF5ZXJCYWNraW5nKj4obV9vd25lci0+Y2xpZW50KCkpOwogCi0gICAg
aWYgKGJhY2tpbmcgJiYgIWJhY2tpbmctPnBhaW50aW5nR29lc1RvV2luZG93KCkpCisgICAgaWYg
KGJhY2tpbmcgJiYgIWJhY2tpbmctPnBhaW50aW5nR29lc1RvV2luZG93KCkgJiYgZHJhd3NDb250
ZW50KCkpCiAgICAgICAgIG1fb3duZXItPnBhaW50R3JhcGhpY3NMYXllckNvbnRlbnRzKCptX2dy
YXBoaWNzQ29udGV4dCwgSW50UmVjdCgwLCAwLCBtX2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5o
ZWlnaHQoKSkpOworCisgICAgbV9jb250ZW50c0RpcnR5ID0gZmFsc2U7CiB9CiAKLXZvaWQgTGF5
ZXJDaHJvbWl1bTo6ZHJhd0RlYnVnQm9yZGVyKCkKK3ZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0Q29u
dGVudHMoTmF0aXZlSW1hZ2VQdHIgY29udGVudHMpCiB7Ci0gICAgbV9ncmFwaGljc0NvbnRleHQt
PnNldFN0cm9rZUNvbG9yKG1fYm9yZGVyQ29sb3IsIERldmljZUNvbG9yU3BhY2UpOwotICAgIG1f
Z3JhcGhpY3NDb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobV9ib3JkZXJXaWR0aCk7Ci0gICAg
bV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBvaW50KDAsIDApLCBJbnRQb2ludChtX2Jv
dW5kcy53aWR0aCgpLCAwKSk7Ci0gICAgbV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBv
aW50KDAsIDApLCBJbnRQb2ludCgwLCBtX2JvdW5kcy5oZWlnaHQoKSkpOwotICAgIG1fZ3JhcGhp
Y3NDb250ZXh0LT5kcmF3TGluZShJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCAwKSwgSW50UG9p
bnQobV9ib3VuZHMud2lkdGgoKSwgbV9ib3VuZHMuaGVpZ2h0KCkpKTsKLSAgICBtX2dyYXBoaWNz
Q29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQoMCwgbV9ib3VuZHMuaGVpZ2h0KCkpLCBJbnRQb2lu
dChtX2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5oZWlnaHQoKSkpOworICAgIC8vIENoZWNrIGlm
IHRoZSBpbWFnZSBoYXMgY2hhbmdlZC4KKyAgICBpZiAobV9jb250ZW50cyA9PSBjb250ZW50cykK
KyAgICAgICAgcmV0dXJuOworICAgIG1fY29udGVudHMgPSBjb250ZW50czsKKyAgICBtX2NvbnRl
bnRzRGlydHkgPSB0cnVlOwogfQogCiB2b2lkIExheWVyQ2hyb21pdW06OnNldE5lZWRzQ29tbWl0
KCkKIHsKICAgICAvLyBDYWxsIG5vdGlmeVN5bmNSZXF1aXJlZCgpLCB3aGljaCBpbiB0aGlzIGlt
cGxlbWVudGF0aW9uIHBsdW1icyB0aHJvdWdoIHRvCi0gICAgLy8gY2FsbCBzZXRSb290TGF5ZXJO
ZWVkc0Rpc3BsYXkoKSBvbiB0aGUgV2ViVmlldywgd2hpY2ggd2lsbCBjYXVzZSBMYXllclJlbmRl
cmVyU2tpYQorICAgIC8vIGNhbGwgc2V0Um9vdExheWVyTmVlZHNEaXNwbGF5KCkgb24gdGhlIFdl
YlZpZXcsIHdoaWNoIHdpbGwgY2F1c2UgTGF5ZXJSZW5kZXJlckNocm9taXVtCiAgICAgLy8gdG8g
cmVuZGVyIGEgZnJhbWUuCiAgICAgaWYgKG1fb3duZXIpCiAgICAgICAgIG1fb3duZXItPm5vdGlm
eVN5bmNSZXF1aXJlZCgpOwpAQCAtMTM3LDE4ICsxNjUsMTYgQEAgdm9pZCBMYXllckNocm9taXVt
OjphZGRTdWJsYXllcihQYXNzUmVmUAogdm9pZCBMYXllckNocm9taXVtOjppbnNlcnRTdWJsYXll
cihQYXNzUmVmUHRyPExheWVyQ2hyb21pdW0+IHN1YmxheWVyLCBzaXplX3QgaW5kZXgpCiB7CiAg
ICAgaW5kZXggPSBtaW4oaW5kZXgsIG1fc3VibGF5ZXJzLnNpemUoKSk7Ci0gICAgbV9zdWJsYXll
cnMuaW5zZXJ0KGluZGV4LCBzdWJsYXllcik7CisgICAgc3VibGF5ZXItPnJlbW92ZUZyb21TdXBl
cmxheWVyKCk7CiAgICAgc3VibGF5ZXItPnNldFN1cGVybGF5ZXIodGhpcyk7CisgICAgbV9zdWJs
YXllcnMuaW5zZXJ0KGluZGV4LCBzdWJsYXllcik7CiAgICAgc2V0TmVlZHNDb21taXQoKTsKIH0K
IAogdm9pZCBMYXllckNocm9taXVtOjpyZW1vdmVGcm9tU3VwZXJsYXllcigpCiB7Ci0gICAgTGF5
ZXJDaHJvbWl1bSogc3VwZXJsYXllciA9IHRoaXMtPnN1cGVybGF5ZXIoKTsKLSAgICBpZiAoIXN1
cGVybGF5ZXIpCi0gICAgICAgIHJldHVybjsKLQotICAgIHN1cGVybGF5ZXItPnJlbW92ZVN1Ymxh
eWVyKHRoaXMpOworICAgIGlmIChtX3N1cGVybGF5ZXIpCisgICAgICAgIG1fc3VwZXJsYXllci0+
cmVtb3ZlU3VibGF5ZXIodGhpcyk7CiB9CiAKIHZvaWQgTGF5ZXJDaHJvbWl1bTo6cmVtb3ZlU3Vi
bGF5ZXIoTGF5ZXJDaHJvbWl1bSogc3VibGF5ZXIpCkBAIC0xNTcsMTEgKzE4MywzMiBAQCB2b2lk
IExheWVyQ2hyb21pdW06OnJlbW92ZVN1YmxheWVyKExheWVyCiAgICAgaWYgKGZvdW5kSW5kZXgg
PT0gLTEpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1fc3VibGF5ZXJzLnJlbW92ZShmb3VuZElu
ZGV4KTsKICAgICBzdWJsYXllci0+c2V0U3VwZXJsYXllcigwKTsKKyAgICBtX3N1YmxheWVycy5y
ZW1vdmUoZm91bmRJbmRleCk7CiAgICAgc2V0TmVlZHNDb21taXQoKTsKIH0KIAordm9pZCBMYXll
ckNocm9taXVtOjpyZXBsYWNlU3VibGF5ZXIoTGF5ZXJDaHJvbWl1bSogcmVmZXJlbmNlLCBQYXNz
UmVmUHRyPExheWVyQ2hyb21pdW0+IG5ld0xheWVyKQoreworICAgIEFTU0VSVF9BUkcocmVmZXJl
bmNlLCByZWZlcmVuY2UpOworICAgIEFTU0VSVF9BUkcocmVmZXJlbmNlLCByZWZlcmVuY2UtPnN1
cGVybGF5ZXIoKSA9PSB0aGlzKTsKKworICAgIGlmIChyZWZlcmVuY2UgPT0gbmV3TGF5ZXIpCisg
ICAgICAgIHJldHVybjsKKworICAgIGludCByZWZlcmVuY2VJbmRleCA9IGluZGV4T2ZTdWJsYXll
cihyZWZlcmVuY2UpOworICAgIEFTU0VSVChyZWZlcmVuY2VJbmRleCAhPSAtMSk7CisgICAgaWYg
KHJlZmVyZW5jZUluZGV4ID09IC0xKQorICAgICAgICByZXR1cm47CisKKyAgICByZWZlcmVuY2Ut
PnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisKKyAgICBpZiAobmV3TGF5ZXIpIHsKKyAgICAgICAg
bmV3TGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgICAgIGluc2VydFN1YmxheWVy
KG5ld0xheWVyLCByZWZlcmVuY2VJbmRleCk7CisgICAgfQorfQorCiBpbnQgTGF5ZXJDaHJvbWl1
bTo6aW5kZXhPZlN1YmxheWVyKGNvbnN0IExheWVyQ2hyb21pdW0qIHJlZmVyZW5jZSkKIHsKICAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3VibGF5ZXJzLnNpemUoKTsgaSsrKSB7CkBAIC0x
NzEsMjggKzIxOCwyOSBAQCBpbnQgTGF5ZXJDaHJvbWl1bTo6aW5kZXhPZlN1YmxheWVyKGNvbnN0
CiAgICAgcmV0dXJuIC0xOwogfQogCi12b2lkIExheWVyQ2hyb21pdW06OnNldEJhY2tpbmdTdG9y
ZVJlY3QoY29uc3QgSW50U2l6ZSYgcmVjdCkKKy8vIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQg
dG8gb3ZlcmlkZSB0aGUgc2l6ZSBvZiB0aGUgYmFja2luZyBzdG9yZQorLy8gdXNlZCBmb3IgdGhl
IGxheWVyLiBJdCdzIHR5cGljYWxseSBjYWxsZWQgb24gdGhlIHJvb3QgbGF5ZXIgdG8gbGltaXQK
Ky8vIGl0cyBzaXplIHRvIHRoZSBhY3R1YWwgdmlzaWJsZSBzaXplLgordm9pZCBMYXllckNocm9t
aXVtOjpzZXRCYWNraW5nU3RvcmVTaXplKGNvbnN0IEludFNpemUmIHNpemUpCiB7Ci0gICAgaWYg
KG1fYmFja2luZ1N0b3JlUmVjdCA9PSByZWN0KQorICAgIGlmIChtX2JhY2tpbmdTdG9yZVNpemUg
PT0gc2l6ZSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgdXBkYXRlR3JhcGhpY3NDb250ZXh0KHJl
Y3QpOworICAgIG1fYmFja2luZ1N0b3JlU2l6ZSA9IHNpemU7CisgICAgdXBkYXRlR3JhcGhpY3ND
b250ZXh0KCk7CisgICAgc2V0TmVlZHNDb21taXQoKTsKIH0KIAotdm9pZCBMYXllckNocm9taXVt
OjpzZXRCb3VuZHMoY29uc3QgSW50U2l6ZSYgcmVjdCkKK3ZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0
Qm91bmRzKGNvbnN0IEludFNpemUmIHNpemUpCiB7Ci0gICAgaWYgKHJlY3QgPT0gbV9ib3VuZHMp
CisgICAgaWYgKG1fYm91bmRzID09IHNpemUpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1fYm91
bmRzID0gcmVjdDsKKyAgICBtX2JvdW5kcyA9IHNpemU7CisgICAgbV9iYWNraW5nU3RvcmVTaXpl
ID0gc2l6ZTsKIAogICAgIC8vIFJlLWNyZWF0ZSB0aGUgY2FudmFzIGFuZCBhc3NvY2lhdGVkIGNv
bnRleHRzLgotICAgIHVwZGF0ZUdyYXBoaWNzQ29udGV4dChtX2JvdW5kcyk7Ci0KLSAgICAvLyBM
YXllciBjb250ZW50cyBuZWVkIHRvIGJlIHJlZHJhd24gYXMgdGhlIGJhY2tpbmcgc3VyZmFjZQot
ICAgIC8vIHdhcyByZWNyZWF0ZWQgYWJvdmUuCi0gICAgdXBkYXRlQ29udGVudHMoKTsKLQorICAg
IHVwZGF0ZUdyYXBoaWNzQ29udGV4dCgpOwogICAgIHNldE5lZWRzQ29tbWl0KCk7CiB9CiAKQEAg
LTIxNCwxOCArMjYyLDIzIEBAIGNvbnN0IExheWVyQ2hyb21pdW0qIExheWVyQ2hyb21pdW06OnJv
b3QKIAogdm9pZCBMYXllckNocm9taXVtOjpyZW1vdmVBbGxTdWJsYXllcnMoKQogewotICAgIG1f
c3VibGF5ZXJzLmNsZWFyKCk7CisgICAgd2hpbGUgKG1fc3VibGF5ZXJzLnNpemUoKSkgeworICAg
ICAgICBMYXllckNocm9taXVtKiBsYXllciA9IG1fc3VibGF5ZXJzWzBdLmdldCgpOworICAgICAg
ICBBU1NFUlQobGF5ZXItPnN1cGVybGF5ZXIoKSk7CisgICAgICAgIGxheWVyLT5yZW1vdmVGcm9t
U3VwZXJsYXllcigpOworICAgIH0KICAgICBzZXROZWVkc0NvbW1pdCgpOwogfQogCiB2b2lkIExh
eWVyQ2hyb21pdW06OnNldFN1YmxheWVycyhjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyQ2hyb21p
dW0+ID4mIHN1YmxheWVycykKIHsKLSAgICBtX3N1YmxheWVycyA9IHN1YmxheWVyczsKLX0KKyAg
ICBpZiAoc3VibGF5ZXJzID09IG1fc3VibGF5ZXJzKQorICAgICAgICByZXR1cm47CiAKLXZvaWQg
TGF5ZXJDaHJvbWl1bTo6c2V0U3VwZXJsYXllcihMYXllckNocm9taXVtKiBzdXBlcmxheWVyKQot
ewotICAgIG1fc3VwZXJsYXllciA9IHN1cGVybGF5ZXI7CisgICAgcmVtb3ZlQWxsU3VibGF5ZXJz
KCk7CisgICAgc2l6ZV90IGxpc3RTaXplID0gc3VibGF5ZXJzLnNpemUoKTsKKyAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspCisgICAgICAgIGFkZFN1YmxheWVyKHN1Ymxh
eWVyc1tpXSk7CiB9CiAKIExheWVyQ2hyb21pdW0qIExheWVyQ2hyb21pdW06OnN1cGVybGF5ZXIo
KSBjb25zdApAQCAtMjM1LDggKzI4OCwxMSBAQCBMYXllckNocm9taXVtKiBMYXllckNocm9taXVt
OjpzdXBlcmxheWVyCiAKIHZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0TmVlZHNEaXNwbGF5KGNvbnN0
IEZsb2F0UmVjdCYgZGlydHlSZWN0KQogewotICAgIC8vIFJlZHJhdyB0aGUgY29udGVudHMgb2Yg
dGhlIGxheWVyLgotICAgIHVwZGF0ZUNvbnRlbnRzKCk7CisgICAgLy8gU2ltcGx5IG1hcmsgdGhl
IGNvbnRlbnRzIGFzIGRpcnR5LiBUaGUgYWN0dWFsIHJlZHJhdyB3aWxsCisgICAgLy8gaGFwcGVu
IHdoZW4gaXQncyB0aW1lIHRvIGRvIHRoZSBjb21wb3NpdGluZy4KKyAgICAvLyBGSVhNRTogU2hv
dWxkIG9ubHkgdXBkYXRlIHRoZSBkaXJ0eSByZWN0IGluc3RlYWQgb2YgbWFya2luZworICAgIC8v
ICAgICAgICB0aGUgZW50aXJlIGxheWVyIGRpcnR5LgorICAgIG1fY29udGVudHNEaXJ0eSA9IHRy
dWU7CiAKICAgICBzZXROZWVkc0NvbW1pdCgpOwogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgJKHJldmlzaW9uIDU5MTc0
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTY3LDYgKzY3LDcgQEAgcHVibGljOgogCiAgICAgdm9pZCBhZGRT
dWJsYXllcihQYXNzUmVmUHRyPExheWVyQ2hyb21pdW0+KTsKICAgICB2b2lkIGluc2VydFN1Ymxh
eWVyKFBhc3NSZWZQdHI8TGF5ZXJDaHJvbWl1bT4sIHNpemVfdCBpbmRleCk7CisgICAgdm9pZCBy
ZXBsYWNlU3VibGF5ZXIoTGF5ZXJDaHJvbWl1bSogcmVmZXJlbmNlLCBQYXNzUmVmUHRyPExheWVy
Q2hyb21pdW0+IG5ld0xheWVyKTsKICAgICB2b2lkIHJlbW92ZUZyb21TdXBlcmxheWVyKCk7CiAK
ICAgICB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQmIGFuY2hvclBvaW50KSB7
IG1fYW5jaG9yUG9pbnQgPSBhbmNob3JQb2ludDsgc2V0TmVlZHNDb21taXQoKTsgfQpAQCAtMTQw
LDEwICsxNDEsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRTdWJsYXllclRyYW5zZm9ybShjb25z
dCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtKSB7IG1fc3VibGF5ZXJUcmFuc2Zvcm0g
PSB0cmFuc2Zvcm07IHNldE5lZWRzQ29tbWl0KCk7IH0KICAgICBjb25zdCBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCYgc3VibGF5ZXJUcmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX3N1YmxheWVyVHJh
bnNmb3JtOyB9CiAKLSAgICB2b2lkIHNldFN1cGVybGF5ZXIoTGF5ZXJDaHJvbWl1bSogc3VwZXJs
YXllcik7CiAgICAgTGF5ZXJDaHJvbWl1bSogc3VwZXJsYXllcigpIGNvbnN0OwogCi0KICAgICB2
b2lkIHNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtKSB7
IG1fdHJhbnNmb3JtID0gdHJhbnNmb3JtOyBzZXROZWVkc0NvbW1pdCgpOyB9CiAgICAgY29uc3Qg
VHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fdHJhbnNm
b3JtOyB9CiAKQEAgLTE1MSwxOSArMTUwLDMwIEBAIHB1YmxpYzoKICAgICBib29sIGdlb21ldHJ5
RmxpcHBlZCgpIGNvbnN0IHsgcmV0dXJuIG1fZ2VvbWV0cnlGbGlwcGVkOyB9CiAKICAgICB2b2lk
IHVwZGF0ZUNvbnRlbnRzKCk7CisgICAgYm9vbCBjb250ZW50c0RpcnR5KCkgeyByZXR1cm4gbV9j
b250ZW50c0RpcnR5OyB9CisKKyAgICB2b2lkIHNldENvbnRlbnRzKE5hdGl2ZUltYWdlUHRyIGNv
bnRlbnRzKTsKKyAgICBOYXRpdmVJbWFnZVB0ciBjb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIG1f
Y29udGVudHM7IH0KIAogICAgIHNraWE6OlBsYXRmb3JtQ2FudmFzKiBwbGF0Zm9ybUNhbnZhcygp
IHsgcmV0dXJuIG1fY2FudmFzLmdldCgpOyB9CiAgICAgR3JhcGhpY3NDb250ZXh0KiBncmFwaGlj
c0NvbnRleHQoKSB7IHJldHVybiBtX2dyYXBoaWNzQ29udGV4dC5nZXQoKTsgfQogCi0gICAgdm9p
ZCBzZXRCYWNraW5nU3RvcmVSZWN0KGNvbnN0IEludFNpemUmKTsKKyAgICB2b2lkIHNldEJhY2tp
bmdTdG9yZVNpemUoY29uc3QgSW50U2l6ZSYpOwogCi0gICAgdm9pZCBkcmF3RGVidWdCb3JkZXIo
KTsKKyAgICBib29sIGRyYXdzQ29udGVudCgpIHsgcmV0dXJuIG1fb3duZXIgJiYgbV9vd25lci0+
ZHJhd3NDb250ZW50KCk7IH0KKworICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQg
ZXZlcnkgdGltZSB0aGUgc3RhdHVzIGRyYXdzQ29udGVudCgpCisgICAgLy8gc3RhdHVzIGNoYW5n
ZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGludGVybmFsIGdyYXBoaWNzIGNvbnRleHQgaXMgaW4gc3lu
Yy4KKyAgICB2b2lkIGRyYXdzQ29udGVudFVwZGF0ZWQoKTsKIAogcHJpdmF0ZToKICAgICBMYXll
ckNocm9taXVtKExheWVyVHlwZSwgR3JhcGhpY3NMYXllckNocm9taXVtKiBvd25lcik7CiAKICAg
ICB2b2lkIHNldE5lZWRzQ29tbWl0KCk7CiAKKyAgICB2b2lkIHNldFN1cGVybGF5ZXIoTGF5ZXJD
aHJvbWl1bSogc3VwZXJsYXllcikgeyBtX3N1cGVybGF5ZXIgPSBzdXBlcmxheWVyOyB9CisKKwog
ICAgIHZvaWQgcGFpbnRNZSgpOwogCiAgICAgc2l6ZV90IG51bVN1YmxheWVycygpIGNvbnN0CkBA
IC0xNzcsMjIgKzE4NywyNiBAQCBwcml2YXRlOgogICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUg
Y2FsbGVkIGZyb20gcmVtb3ZlRnJvbVN1cGVybGF5ZXIuCiAgICAgdm9pZCByZW1vdmVTdWJsYXll
cihMYXllckNocm9taXVtKik7CiAKLSAgICAvLyBSZS1jcmVhdGUgdGhlIGNhbnZhcyBhbmQgZ3Jh
cGhpY3MgY29udGV4dC4gVGhpcyBtZXRob2QKLSAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0
aW1lIHRoZSBsYXllciBpcyByZXNpemVkLgotICAgIHZvaWQgdXBkYXRlR3JhcGhpY3NDb250ZXh0
KGNvbnN0IEludFNpemUmKTsKKyAgICAvLyBSZS1jcmVhdGVzIHRoZSBjYW52YXMgYW5kIGdyYXBo
aWNzIGNvbnRleHQuIFRoaXMgbWV0aG9kCisgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGlt
ZSB0aGUgbGF5ZXIgaXMgcmVzaXplZC4gT25seSBsYXllcnMKKyAgICAvLyB0aGF0IGRvIGRyYXdp
bmcgYW5kIHRoZSByb290IGxheWVyIGdldCBhIGNvbnRleHQuCisgICAgdm9pZCB1cGRhdGVHcmFw
aGljc0NvbnRleHQoKTsKIAogICAgIFZlY3RvcjxSZWZQdHI8TGF5ZXJDaHJvbWl1bT4gPiBtX3N1
YmxheWVyczsKICAgICBMYXllckNocm9taXVtKiBtX3N1cGVybGF5ZXI7CiAKICAgICBHcmFwaGlj
c0xheWVyQ2hyb21pdW0qIG1fb3duZXI7CisjaWYgUExBVEZPUk0oU0tJQSkKICAgICBPd25QdHI8
c2tpYTo6UGxhdGZvcm1DYW52YXM+IG1fY2FudmFzOwogICAgIE93blB0cjxQbGF0Zm9ybUNvbnRl
eHRTa2lhPiBtX3NraWFDb250ZXh0OwogICAgIE93blB0cjxHcmFwaGljc0NvbnRleHQ+IG1fZ3Jh
cGhpY3NDb250ZXh0OworI2VuZGlmCisgICAgYm9vbCBtX2hhc0NvbnRleHQ7CiAKICAgICBMYXll
clR5cGUgbV9sYXllclR5cGU7CiAKICAgICBJbnRTaXplIG1fYm91bmRzOwotICAgIEludFNpemUg
bV9iYWNraW5nU3RvcmVSZWN0OworICAgIEludFNpemUgbV9iYWNraW5nU3RvcmVTaXplOwogICAg
IEZsb2F0UG9pbnQgbV9wb3NpdGlvbjsKICAgICBGbG9hdFBvaW50IG1fYW5jaG9yUG9pbnQ7CiAg
ICAgQ29sb3IgbV9iYWNrZ3JvdW5kQ29sb3I7CkBAIC0yMTYsNyArMjMwLDEwIEBAIHByaXZhdGU6
CiAgICAgYm9vbCBtX2dlb21ldHJ5RmxpcHBlZDsKICAgICBib29sIG1fbmVlZHNEaXNwbGF5T25C
b3VuZHNDaGFuZ2U7CiAKKyAgICBib29sIG1fY29udGVudHNEaXJ0eTsKKwogICAgIENvbnRlbnRz
R3Jhdml0eVR5cGUgbV9jb250ZW50c0dyYXZpdHk7CisgICAgTmF0aXZlSW1hZ2VQdHIgbV9jb250
ZW50czsKICAgICBTdHJpbmcgbV9uYW1lOwogfTsKIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVt
LmNwcAkocmV2aXNpb24gNTkxNzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDEwNSAr
MzQsNjk4IEBACiAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQogI2luY2x1ZGUgIkxh
eWVyUmVuZGVyZXJDaHJvbWl1bS5oIgogCisjaW5jbHVkZSAiR0xFUzJDb250ZXh0LmgiCiAjaW5j
bHVkZSAiTGF5ZXJDaHJvbWl1bS5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5j
bHVkZSAiUGFnZS5oIgorI2lmIFBMQVRGT1JNKFNLSUEpCisjaW5jbHVkZSAiTmF0aXZlSW1hZ2VT
a2lhLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5oIgotI2luY2x1ZGUgInNraWEv
ZXh0L3BsYXRmb3JtX2NhbnZhcy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4K
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1QYXNzT3duUHRyPExheWVyUmVuZGVyZXJDaHJvbWl1
bT4gTGF5ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUoKQorc3RhdGljIFdURkxvZ0NoYW5uZWwg
TG9nTGF5ZXJSZW5kZXJlciA9IHsgMHgwMDAwMDAwMCwgIkxheWVyUmVuZGVyZXIiLCBXVEZMb2dD
aGFubmVsT24gfTsKKworc3RhdGljIHZvaWQgY2hlY2tHTEVycm9yKCkKK3sKKyNpZm5kZWYgTkRF
QlVHCisgICAgR0xlbnVtIGVycm9yID0gZ2xHZXRFcnJvcigpOworICAgIGlmIChlcnJvcikKKyAg
ICAgICAgTE9HX0VSUk9SKCJHTCBFcnJvcjogJWQgIiAsIGVycm9yKTsKKyNlbmRpZgorfQorCitz
dGF0aWMgR0x1aW50IGNyZWF0ZVRleHR1cmVPYmplY3QoR0xlbnVtIHRhcmdldCkKIHsKLSAgICBy
ZXR1cm4gbmV3IExheWVyUmVuZGVyZXJDaHJvbWl1bSgpOworICAgIEdMdWludCB0ZXh0dXJlID0g
MDsKKyAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlKTsKKyAgICBnbEJpbmRUZXh0dXJlKHRh
cmdldCwgdGV4dHVyZSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJmKHRhcmdldCwgR0xfVEVYVFVSRV9N
SU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBnbFRleFBhcmFtZXRlcmYodGFyZ2V0LCBHTF9U
RVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOworICAgIHJldHVybiB0ZXh0dXJlOwogfQog
Ci1MYXllclJlbmRlcmVyQ2hyb21pdW06OkxheWVyUmVuZGVyZXJDaHJvbWl1bSgpCitzdGF0aWMg
R0x1aW50IGxvYWRTaGFkZXIoR0xlbnVtIHR5cGUsIGNvbnN0IGNoYXIqIHNoYWRlclNvdXJjZSkK
K3sKKyAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIodHlwZSk7CisgICAgaWYgKCFz
aGFkZXIpCisgICAgICAgIHJldHVybiAwOworICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwg
JnNoYWRlclNvdXJjZSwgMCk7CisgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7CisgICAgR0xp
bnQgY29tcGlsZWQ7CisgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVT
LCAmY29tcGlsZWQpOworICAgIGlmICghY29tcGlsZWQpIHsKKyAgICAgICAgZ2xEZWxldGVTaGFk
ZXIoc2hhZGVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBzaGFkZXI7
Cit9CisKK3N0YXRpYyBHTHVpbnQgbG9hZFNoYWRlclByb2dyYW0oY29uc3QgY2hhciogdmVydGV4
U2hhZGVyU291cmNlLCBjb25zdCBjaGFyKiBmcmFnbWVudFNoYWRlclNvdXJjZSkKK3sKKyAgICBH
THVpbnQgdmVydGV4U2hhZGVyOworICAgIEdMdWludCBmcmFnbWVudFNoYWRlcjsKKyAgICBHTHVp
bnQgcHJvZ3JhbU9iamVjdDsKKyAgICBHTGludCBsaW5rZWQ7CisgICAgdmVydGV4U2hhZGVyID0g
bG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpOworICAgIGlm
ICghdmVydGV4U2hhZGVyKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmcmFnbWVudFNoYWRlciA9
IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7Cisg
ICAgaWYgKCFmcmFnbWVudFNoYWRlcikgeworICAgICAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0ZXhT
aGFkZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcHJvZ3JhbU9iamVjdCA9IGds
Q3JlYXRlUHJvZ3JhbSgpOworICAgIGlmICghcHJvZ3JhbU9iamVjdCkKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbU9iamVjdCwgdmVydGV4U2hhZGVyKTsKKyAg
ICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtT2JqZWN0LCBmcmFnbWVudFNoYWRlcik7CisgICAgZ2xM
aW5rUHJvZ3JhbShwcm9ncmFtT2JqZWN0KTsKKyAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtT2Jq
ZWN0LCBHTF9MSU5LX1NUQVRVUywgJmxpbmtlZCk7CisgICAgaWYgKCFsaW5rZWQpIHsKKyAgICAg
ICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW1PYmplY3QpOworICAgICAgICByZXR1cm4gMDsKKyAg
ICB9CisgICAgZ2xEZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKKyAgICBnbERlbGV0ZVNoYWRl
cihmcmFnbWVudFNoYWRlcik7CisgICAgcmV0dXJuIHByb2dyYW1PYmplY3Q7Cit9CisKK3N0YXRp
YyB2b2lkIHRvR0xNYXRyaXgoZmxvYXQqIGZsYXR0ZW5lZCwgY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgmIG0pCit7CisgICAgZmxhdHRlbmVkWzBdID0gbS5tMTEoKTsKKyAgICBmbGF0dGVuZWRb
MV0gPSBtLm0xMigpOworICAgIGZsYXR0ZW5lZFsyXSA9IG0ubTEzKCk7CisgICAgZmxhdHRlbmVk
WzNdID0gbS5tMTQoKTsKKyAgICBmbGF0dGVuZWRbNF0gPSBtLm0yMSgpOworICAgIGZsYXR0ZW5l
ZFs1XSA9IG0ubTIyKCk7CisgICAgZmxhdHRlbmVkWzZdID0gbS5tMjMoKTsKKyAgICBmbGF0dGVu
ZWRbN10gPSBtLm0yNCgpOworICAgIGZsYXR0ZW5lZFs4XSA9IG0ubTMxKCk7CisgICAgZmxhdHRl
bmVkWzldID0gbS5tMzIoKTsKKyAgICBmbGF0dGVuZWRbMTBdID0gbS5tMzMoKTsKKyAgICBmbGF0
dGVuZWRbMTFdID0gbS5tMzQoKTsKKyAgICBmbGF0dGVuZWRbMTJdID0gbS5tNDEoKTsKKyAgICBm
bGF0dGVuZWRbMTNdID0gbS5tNDIoKTsKKyAgICBmbGF0dGVuZWRbMTRdID0gbS5tNDMoKTsKKyAg
ICBmbGF0dGVuZWRbMTVdID0gbS5tNDQoKTsKK30KKworc3RhdGljIFRyYW5zZm9ybWF0aW9uTWF0
cml4IG9ydGhvTWF0cml4KGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZs
b2F0IHRvcCwgZmxvYXQgbmVhclosIGZsb2F0IGZhclopCit7CisgICAgZmxvYXQgZGVsdGFYID0g
cmlnaHQgLSBsZWZ0OworICAgIGZsb2F0IGRlbHRhWSA9IHRvcCAtIGJvdHRvbTsKKyAgICBmbG9h
dCBkZWx0YVogPSBmYXJaIC0gbmVhclo7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggb3J0aG87
CisgICAgaWYgKCFkZWx0YVggfHwgIWRlbHRhWSB8fCAhZGVsdGFaKQorICAgICAgICByZXR1cm4g
b3J0aG87CisgICAgb3J0aG8uc2V0TTExKDIuMGYgLyBkZWx0YVgpOworICAgIG9ydGhvLnNldE00
MSgtKHJpZ2h0ICsgbGVmdCkgLyBkZWx0YVgpOworICAgIG9ydGhvLnNldE0yMigyLjBmIC8gZGVs
dGFZKTsKKyAgICBvcnRoby5zZXRNNDIoLSh0b3AgKyBib3R0b20pIC8gZGVsdGFZKTsKKyAgICBv
cnRoby5zZXRNMzMoLTIuMGYgLyBkZWx0YVopOworICAgIG9ydGhvLnNldE00MygtKG5lYXJaICsg
ZmFyWikgLyBkZWx0YVopOworICAgIHJldHVybiBvcnRobzsKK30KKworLy8gQ3JlYXRlcyBhIEdM
IHRleHR1cmUgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIHRyYW5zZmVyaW5nIHRoZSBsYXllcidzIGJp
dG1hcCBpbnRvLgorc3RhdGljIEdMdWludCBjcmVhdGVMYXllclRleHR1cmUoKQoreworICAgIEdM
dWludCB0ZXh0dXJlSWQgPSAwOworICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmVJZCk7Cisg
ICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlSWQpOworICAgIC8vIERvIGJh
c2ljIGxpbmVhciBmaWx0ZXJpbmcgb24gcmVzaXplLgorICAgIGdsVGV4UGFyYW1ldGVyZihHTF9U
RVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQ
YXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFS
KTsKKyAgICAvLyBOUE9UIHRleHR1cmVzIGluIEdMIEVTIG9ubHkgd29yayB3aGVuIHRoZSB3cmFw
IG1vZGUgaXMgc2V0IHRvIEdMX0NMQU1QX1RPX0VER0UuCisgICAgZ2xUZXhQYXJhbWV0ZXJmKEdM
X1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBn
bFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1Q
X1RPX0VER0UpOworICAgIHJldHVybiB0ZXh0dXJlSWQ7Cit9CisKKworUGFzc093blB0cjxMYXll
clJlbmRlcmVyQ2hyb21pdW0+IExheWVyUmVuZGVyZXJDaHJvbWl1bTo6Y3JlYXRlKFBhZ2UqIHBh
Z2UpCit7CisgICAgcmV0dXJuIG5ldyBMYXllclJlbmRlcmVyQ2hyb21pdW0ocGFnZSk7Cit9CisK
K0xheWVyUmVuZGVyZXJDaHJvbWl1bTo6TGF5ZXJSZW5kZXJlckNocm9taXVtKFBhZ2UqIHBhZ2Up
CiAgICAgOiBtX3Jvb3RMYXllcigwKQogICAgICwgbV9uZWVkc0Rpc3BsYXkoZmFsc2UpCisgICAg
LCBtX2xheWVyUHJvZ3JhbU9iamVjdCgwKQorICAgICwgbV9ib3JkZXJQcm9ncmFtT2JqZWN0KDAp
CisgICAgLCBtX3Njcm9sbFByb2dyYW1PYmplY3QoMCkKKyAgICAsIG1fcG9zaXRpb25Mb2NhdGlv
bigwKQorICAgICwgbV90ZXhDb29yZExvY2F0aW9uKDEpCisgICAgLCBtX3BhZ2UocGFnZSkKKyAg
ICAsIG1fcm9vdExheWVyVGV4dHVyZVdpZHRoKDApCisgICAgLCBtX3Jvb3RMYXllclRleHR1cmVI
ZWlnaHQoMCkKIHsKKyAgICBtX3F1YWRWYm9JZHNbVmVydGljZXNdID0gbV9xdWFkVmJvSWRzW0xh
eWVyRWxlbWVudHNdID0gMDsKKyAgICBtX2hhcmR3YXJlQ29tcG9zaXRpbmcgPSAoaW5pdEdMKCkg
JiYgaW5pdGlhbGl6ZVNoYXJlZEdMT2JqZWN0cygpKTsKIH0KIAogTGF5ZXJSZW5kZXJlckNocm9t
aXVtOjp+TGF5ZXJSZW5kZXJlckNocm9taXVtKCkKIHsKKyAgICBpZiAobV9oYXJkd2FyZUNvbXBv
c2l0aW5nKSB7CisgICAgICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOworICAgICAgICBnbERlbGV0
ZUJ1ZmZlcnMoMywgbV9xdWFkVmJvSWRzKTsKKyAgICAgICAgZ2xEZWxldGVQcm9ncmFtKG1fbGF5
ZXJQcm9ncmFtT2JqZWN0KTsKKyAgICAgICAgZ2xEZWxldGVQcm9ncmFtKG1fc2Nyb2xsUHJvZ3Jh
bU9iamVjdCk7CisgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShtX2JvcmRlclByb2dyYW1PYmplY3Qp
OworICAgIH0KIH0KIAotdm9pZCBMYXllclJlbmRlcmVyQ2hyb21pdW06OnVwZGF0ZUxheWVyQ29u
dGVudHMoKQordm9pZCBMYXllclJlbmRlcmVyQ2hyb21pdW06OmRyYXdUZXh0dXJlZFF1YWQoY29u
c3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCwgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdo
dCwgZmxvYXQgb3BhY2l0eSwgYm9vbCBzY3JvbGxpbmcpCiB7Ci0gICAgaWYgKG1fcm9vdExheWVy
KQotICAgICAgICB1cGRhdGVMYXllckNvbnRlbnRzUmVjdXJzaXZlKG1fcm9vdExheWVyLmdldCgp
KTsKKyAgICBzdGF0aWMgR0xmbG9hdCBnbE1hdHJpeFsxNl07CisKKyAgICBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCByZW5kZXJNYXRyaXggPSBtYXRyaXg7CisKKyAgICAvLyBBcHBseSBhIHNjYWxpbmcg
ZmFjdG9yIHRvIHNpemUgdGhlIHF1YWQgZnJvbSAxeDEgdG8gaXRzIGludGVuZGVkIHNpemUuCisg
ICAgcmVuZGVyTWF0cml4LnNjYWxlM2Qod2lkdGgsIGhlaWdodCwgMSk7CisKKyAgICAvLyBBcHBs
eSB0aGUgcHJvamVjdGlvbiBtYXRyaXggYmVmb3JlIHNlbmRpbmcgdGhlIHRyYW5zZm9ybSBvdmVy
IHRvIHRoZSBzaGFkZXIuCisgICAgcmVuZGVyTWF0cml4Lm11bHRpcGx5KG1fcHJvamVjdGlvbk1h
dHJpeCk7CisKKyAgICBGbG9hdFBvaW50M0QgdGVzdDEgPSByZW5kZXJNYXRyaXgubWFwUG9pbnQo
RmxvYXRQb2ludDNEKC0wLjUsIDAuNSwgMCkpOworICAgIEZsb2F0UG9pbnQzRCB0ZXN0MiA9IHJl
bmRlck1hdHJpeC5tYXBQb2ludChGbG9hdFBvaW50M0QoMC41LCAtMC41LCAwKSk7CisKKyAgICB0
b0dMTWF0cml4KCZnbE1hdHJpeFswXSwgcmVuZGVyTWF0cml4KTsKKworICAgIGludCBtYXRyaXhM
b2NhdGlvbiA9IChzY3JvbGxpbmcgPyBtX3Njcm9sbE1hdHJpeExvY2F0aW9uIDogbV9tYXRyaXhM
b2NhdGlvbik7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KG1hdHJpeExvY2F0aW9uLCAxLCBmYWxz
ZSwgJmdsTWF0cml4WzBdKTsKKworICAgIGlmICghc2Nyb2xsaW5nKQorICAgICAgICBnbFVuaWZv
cm0xZihtX2FscGhhTG9jYXRpb24sIG9wYWNpdHkpOworCisgICAgZ2xEcmF3RWxlbWVudHMoR0xf
VFJJQU5HTEVTLCA2LCBHTF9VTlNJR05FRF9TSE9SVCwgMCk7CiB9CiAKLSNpZiBQTEFURk9STShT
S0lBKQotdm9pZCBMYXllclJlbmRlcmVyQ2hyb21pdW06OmRyYXdMYXllcnNJbkNhbnZhcyhza2lh
OjpQbGF0Zm9ybUNhbnZhcyogY2FudmFzLCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkKKworLy8g
VXBkYXRlcyB0aGUgY29udGVudHMgb2YgdGhlIHJvb3QgbGF5ZXIgdGV4dHVyZSB0aGF0IGZhbGwg
aW5zaWRlIHRoZSB1cGRhdGVSZWN0CisvLyBhbmQgcmUtY29tcG9zaXRzIGFsbCBzdWJsYXllcnMu
Cit2b2lkIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6ZHJhd0xheWVycyhjb25zdCBJbnRSZWN0JiB1
cGRhdGVSZWN0LCBjb25zdCBJbnRSZWN0JiB2aXNpYmxlUmVjdCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFJlY3QmIGNvbnRlbnRSZWN0LCBjb25zdCBJ
bnRQb2ludCYgc2Nyb2xsUG9zaXRpb24pCiB7CisgICAgQVNTRVJUKG1faGFyZHdhcmVDb21wb3Np
dGluZyk7CisKICAgICBpZiAoIW1fcm9vdExheWVyKQogICAgICAgICByZXR1cm47CiAKLSAgICBj
YW52YXMtPnNhdmUoKTsKLSAgICBjYW52YXMtPmNsaXBSZWN0KFNrUmVjdChjbGlwUmVjdCkpOwot
Ci0gICAgLy8gRmlyc3QgY29tcG9zaXRlIHRoZSByb290IGxheWVyIGludG8gdGhlIGNhbnZhcy4K
LSAgICBjYW52YXMtPmRyYXdCaXRtYXAobV9yb290TGF5ZXItPnBsYXRmb3JtQ2FudmFzKCktPmdl
dERldmljZSgpLT5hY2Nlc3NCaXRtYXAoZmFsc2UpLCAwLCAwLCAwKTsKKyAgICAvLyBJZiB0aGUg
c2l6ZSBvZiB0aGUgdmlzaWJsZSBhcmVhIGhhcyBjaGFuZ2VkIHRoZW4gYWxsb2NhdGUgYSBuZXcg
dGV4dHVyZQorICAgIC8vIHRvIHN0b3JlIHRoZSBjb250ZW50cyBvZiB0aGUgcm9vdCBsYXllciBh
bmQgYWRqdXN0IHRoZSBwcm9qZWN0aW9uIG1hdHJpeAorICAgIC8vIGFuZCB2aWV3cG9ydC4KKyAg
ICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8y
RCwgbV9yb290TGF5ZXJUZXh0dXJlSWQpOworCisgICAgdW5zaWduZWQgaW50IHZpc2libGVSZWN0
V2lkdGggPSB2aXNpYmxlUmVjdC53aWR0aCgpOworICAgIHVuc2lnbmVkIGludCB2aXNpYmxlUmVj
dEhlaWdodCA9IHZpc2libGVSZWN0LmhlaWdodCgpOworICAgIGlmICh2aXNpYmxlUmVjdFdpZHRo
ICE9IG1fcm9vdExheWVyVGV4dHVyZVdpZHRoIHx8IHZpc2libGVSZWN0SGVpZ2h0ICE9IG1fcm9v
dExheWVyVGV4dHVyZUhlaWdodCkgeworICAgICAgICBtX3Jvb3RMYXllclRleHR1cmVXaWR0aCA9
IHZpc2libGVSZWN0LndpZHRoKCk7CisgICAgICAgIG1fcm9vdExheWVyVGV4dHVyZUhlaWdodCA9
IHZpc2libGVSZWN0LmhlaWdodCgpOworCisgICAgICAgIG1fcHJvamVjdGlvbk1hdHJpeCA9IG9y
dGhvTWF0cml4KDAsIHZpc2libGVSZWN0V2lkdGggKyAwLjUsIHZpc2libGVSZWN0SGVpZ2h0ICsg
MC41LCAwLCAtMTAwMCwgMTAwMCk7CisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJE
LCAwLCBHTF9SR0JBLCBtX3Jvb3RMYXllclRleHR1cmVXaWR0aCwgbV9yb290TGF5ZXJUZXh0dXJl
SGVpZ2h0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCAwKTsKKyAgICB9CisKKyAgICAv
LyBUaGUgR0wgdmlld3BvcnQgY292ZXJzIHRoZSBlbnRpcmUgdmlzaWJsZSBhcmVhLCBpbmNsdWRp
bmcgdGhlIHNjcm9sbGJhcnMuCisgICAgZ2xWaWV3cG9ydCgwLCAwLCB2aXNpYmxlUmVjdFdpZHRo
LCB2aXNpYmxlUmVjdEhlaWdodCk7CisKKyAgICAvLyBUaGUgbGF5ZXIsIHNjcm9sbCBhbmQgZGVi
dWcgYm9yZGVyIHNoYWRlcnMgYWxsIHVzZSB0aGUgc2FtZSB2ZXJ0ZXggYXR0cmlidXRlcworICAg
IC8vIHNvIHdlIGNhbiBiaW5kIHRoZW0gb25seSBvbmNlLgorICAgIGdsQmluZEJ1ZmZlcihHTF9B
UlJBWV9CVUZGRVIsIG1fcXVhZFZib0lkc1tWZXJ0aWNlc10pOworICAgIGdsQmluZEJ1ZmZlcihH
TF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbV9xdWFkVmJvSWRzW0xheWVyRWxlbWVudHNdKTsKKyAg
ICBHTHVpbnQgb2Zmc2V0ID0gMDsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobV9wb3NpdGlv
bkxvY2F0aW9uLCAzLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDUgKiBzaXplb2YoR0xmbG9hdCksIChH
THZvaWQqKShvZmZzZXQpKTsKKyAgICBvZmZzZXQrPSAzICogc2l6ZW9mKEdMZmxvYXQpOworICAg
IGdsVmVydGV4QXR0cmliUG9pbnRlcihtX3RleENvb3JkTG9jYXRpb24sIDIsIEdMX0ZMT0FULCBH
TF9GQUxTRSwgNSAqIHNpemVvZihHTGZsb2F0KSwgKEdMdm9pZCopKG9mZnNldCkpOworICAgIGds
RW5hYmxlVmVydGV4QXR0cmliQXJyYXkobV9wb3NpdGlvbkxvY2F0aW9uKTsKKyAgICBnbEVuYWJs
ZVZlcnRleEF0dHJpYkFycmF5KG1fdGV4Q29vcmRMb2NhdGlvbik7CisgICAgZ2xBY3RpdmVUZXh0
dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAgZ2xE
aXNhYmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICBJbnRQb2ludCBzY3JvbGxEZWx0YSA9IHRvUG9p
bnQoc2Nyb2xsUG9zaXRpb24gLSBtX3Njcm9sbFBvc2l0aW9uKTsKKyAgICAvLyBTY3JvbGwgb25s
eSB3aGVuIHRoZSB1cGRhdGVSZWN0IGNvbnRhaW5zIHBpeGVscyBmb3IgdGhlIG5ld2x5IHVuY292
ZXJlZCByZWdpb24gdG8gYXZvaWQgZmxhc2hpbmcuCisgICAgaWYgKChzY3JvbGxEZWx0YS54KCkg
JiYgdXBkYXRlUmVjdC53aWR0aCgpID49IGFicyhzY3JvbGxEZWx0YS54KCkpICYmIHVwZGF0ZVJl
Y3QuaGVpZ2h0KCkgPj0gY29udGVudFJlY3QuaGVpZ2h0KCkpCisgICAgICAgIHx8IChzY3JvbGxE
ZWx0YS55KCkgJiYgdXBkYXRlUmVjdC5oZWlnaHQoKSA+PSBhYnMoc2Nyb2xsRGVsdGEueSgpKSAm
JiB1cGRhdGVSZWN0LndpZHRoKCkgPj0gY29udGVudFJlY3Qud2lkdGgoKSkpIHsKKyAgICAgICAg
ICAgIC8vIFNjcm9sbGluZyB3b3JrcyBhcyBmb2xsb3dzOiBXZSByZW5kZXIgYSBxdWFkIHdpdGgg
dGhlIGN1cnJlbnQgcm9vdCBsYXllciBjb250ZW50cworICAgICAgICAgICAgLy8gdHJhbnNsYXRl
ZCBieSB0aGUgYW1vdW50IHRoZSBwYWdlIGhhcyBzY3JvbGxlZCBzaW5jZSB0aGUgbGFzdCB1cGRh
dGUgYW5kIHRoZW4gcmVhZCB0aGUKKyAgICAgICAgICAgIC8vIHBpeGVscyBvZiB0aGUgY29udGVu
dCBhcmVhICh2aXNpYmxlIGFyZWEgZXhjbHVkaW5nIHRoZSBzY3JvbGwgYmFycykgYmFjayBpbnRv
IHRoZQorICAgICAgICAgICAgLy8gcm9vdCBsYXllciB0ZXh0dXJlLiBUaGUgbmV3bHkgZXhwb3Nl
ZCBhcmVhIGlzIHN1YmVzcXVlbnRseSBmaWxsZWQgYXMgdXN1YWwgd2l0aAorICAgICAgICAgICAg
Ly8gdGhlIGNvbnRlbnRzIG9mIHRoZSB1cGRhdGVSZWN0LgorICAgICAgICAgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggc2Nyb2xsZWRMYXllck1hdHJpeDsKKyAgICAgICAgICAgIHNjcm9sbGVkTGF5
ZXJNYXRyaXgudHJhbnNsYXRlM2QoKGludClmbG9vcmYoMC41ICogdmlzaWJsZVJlY3Qud2lkdGgo
KSArIDAuNSkgLSBzY3JvbGxEZWx0YS54KCksCisgICAgICAgICAgICAgICAgKGludClmbG9vcmYo
MC41ICogdmlzaWJsZVJlY3QuaGVpZ2h0KCkgKyAwLjUpICsgc2Nyb2xsRGVsdGEueSgpLCAwKTsK
KyAgICAgICAgICAgIHNjcm9sbGVkTGF5ZXJNYXRyaXguc2NhbGUzZCgxLCAtMSwgMSk7CisKKyAg
ICAgICAgICAgIC8vIFN3aXRjaCBzaGFkZXJzIHRvIGF2b2lkIFJHQiBzd2l6emxpbmcuCisgICAg
ICAgICAgICBnbFVzZVByb2dyYW0obV9zY3JvbGxQcm9ncmFtT2JqZWN0KTsKKyAgICAgICAgICAg
IGdsVW5pZm9ybTFpKG1fc2Nyb2xsU2FtcGxlckxvY2F0aW9uLCAwKTsKKworICAgICAgICAgICAg
ZHJhd1RleHR1cmVkUXVhZChzY3JvbGxlZExheWVyTWF0cml4LCB2aXNpYmxlUmVjdC53aWR0aCgp
LCB2aXNpYmxlUmVjdC5oZWlnaHQoKSwgMSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGdsQ29weVRl
eFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMCwgMCwgY29udGVudFJlY3Qud2lk
dGgoKSwgY29udGVudFJlY3QuaGVpZ2h0KCkpOworCisgICAgICAgICAgICBjaGVja0dMRXJyb3Io
KTsKKyAgICAgICAgICAgIG1fc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjsKKyAgICB9
CisKKyAgICAvLyBGSVhNRTogVGhlIGZvbGxvd2luZyBjaGVjayBzaG91bGQgZ28gYXdheSB3aGVu
IHRoZSBjb21wb3NpdG9yIHJlbmRlcnMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBvd24gdGhyZWFk
LgorICAgIC8vIElnbm9yZSBhIDF4MSB1cGRhdGUgcmVjdCBhdCAoMCwgMCkgYXMgdGhhdCdzIHVz
ZWQgYSB3YXkgdG8ga2ljayBvZmYgYSByZWRyYXcgZm9yIHRoZSBjb21wb3NpdG9yLgorICAgIGlm
ICghKHVwZGF0ZVJlY3QueCgpICYmIHVwZGF0ZVJlY3QueSgpICYmIHVwZGF0ZVJlY3Qud2lkdGgo
KSA9PSAxICYmIHVwZGF0ZVJlY3QuaGVpZ2h0KCkgPT0gMSkpIHsKKyAgICAgICAgLy8gVXBkYXRl
IHRoZSByb290IGxheWVyIHRleHR1cmUuCisgICAgICAgIEFTU0VSVCgodXBkYXRlUmVjdC54KCkg
KyB1cGRhdGVSZWN0LndpZHRoKCkgPD0gbV9yb290TGF5ZXJUZXh0dXJlV2lkdGgpCisgICAgICAg
ICAgICAgICAmJiAodXBkYXRlUmVjdC55KCkgKyB1cGRhdGVSZWN0LmhlaWdodCgpIDw9IG1fcm9v
dExheWVyVGV4dHVyZUhlaWdodCkpOwogCi0gICAgLy8gQWNjb3VudCBmb3IgdGhlIHNjcm9sbCBv
ZmZzZXQgYmVmb3JlIGNvbXBvc2l0aW5nIHRoZSByZW1haW5pbmcgbGF5ZXJzLgotICAgIC8vIE5v
dGUgdGhhdCB0aGUgcm9vdCBsYXllcidzIHBhaW50aW5nIHRha2VzIGludG8gYWNjb3VudCB0aGUg
c2Nyb2xsIG9mZnNldCBhbHJlYWR5LgotICAgIGNhbnZhcy0+dHJhbnNsYXRlKC1tX3Njcm9sbEZy
YW1lLmZMZWZ0LCAtbV9zY3JvbGxGcmFtZS5mVG9wKTsKLQotICAgIGZsb2F0IG9wYWNpdHkgPSAx
LjBmOworI2lmIFBMQVRGT1JNKFNLSUEpCisgICAgICAgIC8vIEdldCB0aGUgY29udGVudHMgb2Yg
dGhlIHVwZGF0ZWQgcmVjdC4KKyAgICAgICAgY29uc3QgU2tCaXRtYXAgYml0bWFwID0gbV9yb290
TGF5ZXItPnBsYXRmb3JtQ2FudmFzKCktPmdldERldmljZSgpLT5hY2Nlc3NCaXRtYXAoZmFsc2Up
OworICAgICAgICBpbnQgcm9vdExheWVyV2lkdGggPSBiaXRtYXAud2lkdGgoKTsKKyAgICAgICAg
aW50IHJvb3RMYXllckhlaWdodCA9IGJpdG1hcC5oZWlnaHQoKTsKKyAgICAgICAgQVNTRVJUKHJv
b3RMYXllcldpZHRoID09IHVwZGF0ZVJlY3Qud2lkdGgoKSAmJiByb290TGF5ZXJIZWlnaHQgPT0g
dXBkYXRlUmVjdC5oZWlnaHQoKSk7CisgICAgICAgIHZvaWQqIHBpeGVscyA9IGJpdG1hcC5nZXRQ
aXhlbHMoKTsKKworICAgICAgICBjaGVja0dMRXJyb3IoKTsKKyAgICAgICAgLy8gQ29weSB0aGUg
Y29udGVudHMgb2YgdGhlIHVwZGF0ZWQgcmVjdCB0byB0aGUgcm9vdCBsYXllciB0ZXh0dXJlLgor
ICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgdXBkYXRlUmVjdC54KCks
IHVwZGF0ZVJlY3QueSgpLCB1cGRhdGVSZWN0LndpZHRoKCksIHVwZGF0ZVJlY3QuaGVpZ2h0KCks
IEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7CisgICAgICAgIGNoZWNrR0xFcnJv
cigpOworI2Vsc2UKKyNlcnJvciBNdXN0IHBvcnQgdG8geW91ciBwbGF0Zm9ybQorI2VuZGlmCisg
ICAgfQorCisgICAgZ2xDbGVhckNvbG9yKDAsIDAsIDEsIDEpOworICAgIGdsQ2xlYXIoR0xfQ09M
T1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQpOworCisgICAgLy8gUmVuZGVyIHRo
ZSByb290IGxheWVyIHVzaW5nIGEgcXVhZCB0aGF0IHRha2VzIHVwIHRoZSBlbnRpcmUgdmlzaWJs
ZSBhcmVhIG9mIHRoZSB3aW5kb3cuCisgICAgZ2xVc2VQcm9ncmFtKG1fbGF5ZXJQcm9ncmFtT2Jq
ZWN0KTsKKyAgICBnbFVuaWZvcm0xaShtX3NhbXBsZXJMb2NhdGlvbiwgMCk7CisgICAgVHJhbnNm
b3JtYXRpb25NYXRyaXggbGF5ZXJNYXRyaXg7CisgICAgbGF5ZXJNYXRyaXgudHJhbnNsYXRlM2Qo
dmlzaWJsZVJlY3Qud2lkdGgoKSAvIDIsIHZpc2libGVSZWN0LmhlaWdodCgpIC8gMiwgMCk7Cisg
ICAgZHJhd1RleHR1cmVkUXVhZChsYXllck1hdHJpeCwgdmlzaWJsZVJlY3Qud2lkdGgoKSwgdmlz
aWJsZVJlY3QuaGVpZ2h0KCksIDEsIGZhbHNlKTsKKworICAgIC8vIElmIGN1bGxpbmcgaXMgZW5h
YmxlZCB0aGVuIHdlIHdpbGwgY3VsbCB0aGUgYmFja2ZhY2UuCisgICAgZ2xDdWxsRmFjZShHTF9C
QUNLKTsKKyAgICAvLyBUaGUgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gaXMgc2V0dXAgc3VjaCB0
aGF0IFkgc3RhcnRzIGF0IHplcm8gYW5kCisgICAgLy8gaW5jcmVhc2VzIGdvaW5nIGRvd24gdGhl
IHBhZ2Ugc28gd2UgbmVlZCB0byBhZGp1c3QgdGhlIHdpbmRpbmcgb3JkZXIgb2YKKyAgICAvLyBm
cm9udCBmYWNpbmcgdHJpYW5nbGVzLgorICAgIGdsRnJvbnRGYWNlKEdMX0NXKTsKKworICAgIC8v
IFRoZSBzaGFkZXIgdXNlZCB0byByZW5kZXIgbGF5ZXJzIHJldHVybnMgcHJlLW11bHRpcGxpZWQg
YWxwaGEgY29sb3JzCisgICAgLy8gc28gd2UgbmVlZCB0byBzZW5kIHRoZSBibGVuZGluZyBtb2Rl
IGFwcHJvcHJpYXRlbHkuCisgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgIGdsQmxlbmRGdW5j
KEdMX09ORSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisKKyAgICBjaGVja0dMRXJyb3IoKTsK
KworICAgIC8vIEZJWE1FOiBOZWVkIHRvIHByZXZlbnQgY29tcG9zaXRlZCBsYXllcnMgZnJvbSBk
cmF3aW5nIG92ZXIgdGhlIHNjcm9sbAorICAgIC8vIGJhcnMuCisKKyAgICAvLyBGSVhNRTogU3Vi
bGF5ZXJzIG5lZWQgdG8gYmUgc29ydGVkIGluIFogdG8gZ2V0IHRoZSBjb3JyZWN0IHRyYW5zcGFy
ZW5jeSBlZmZlY3QuCisKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGN1bGwgb3V0IGxheWVycyB0
aGF0IGFyZSBub3QgaW5zaWRlIHRoZSB2aXNpYmxlIHJlY3QuCisKKyAgICAvLyBUcmFuc2xhdGUg
YWxsIHRoZSBjb21wb3NpdGVkIGxheWVycyBieSB0aGUgc2Nyb2xsIHBvc2l0aW9uLgorICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeDsKKyAgICBtYXRyaXgudHJhbnNsYXRlM2QoLW1fc2Ny
b2xsUG9zaXRpb24ueCgpLCAtbV9zY3JvbGxQb3NpdGlvbi55KCksIDApOworICAgIGZsb2F0IG9w
YWNpdHkgPSAxOwogICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJDaHJvbWl1bT4gPiYgc3Vi
bGF5ZXJzID0gbV9yb290TGF5ZXItPmdldFN1YmxheWVycygpOwogICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgc3VibGF5ZXJzLnNpemUoKTsgaSsrKQotICAgICAgICBkcmF3TGF5ZXJJbkNhbnZh
c1JlY3Vyc2l2ZShjYW52YXMsIHN1YmxheWVyc1tpXS5nZXQoKSwgb3BhY2l0eSk7CisgICAgICAg
IGNvbXBvc2l0ZUxheWVyc1JlY3Vyc2l2ZShzdWJsYXllcnNbaV0uZ2V0KCksIG1hdHJpeCwgb3Bh
Y2l0eSwgdmlzaWJsZVJlY3QpOwogCi0gICAgY2FudmFzLT5yZXN0b3JlKCk7CisgICAgbV9nbGVz
MkNvbnRleHQtPnN3YXBCdWZmZXJzKCk7CiAKICAgICBtX25lZWRzRGlzcGxheSA9IGZhbHNlOwog
fQogCi12b2lkIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6ZHJhd0xheWVySW5DYW52YXNSZWN1cnNp
dmUoc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcywgTGF5ZXJDaHJvbWl1bSogbGF5ZXIsIGZs
b2F0IG9wYWNpdHkpCisvLyBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgdGV4dHVyZSBjdXJyZW50bHkg
YXNzb2NpYXRlZCB3aXRoIHRoZSBsYXllciBvcgorLy8gLTEgaWYgdGhlIGlkIGhhc24ndCBiZWVu
IHJlZ2lzdGVyZWQgeWV0LgoraW50IExheWVyUmVuZGVyZXJDaHJvbWl1bTo6Z2V0VGV4dHVyZUlk
KExheWVyQ2hyb21pdW0qIGxheWVyKQogewotICAgIC8vIEd1YXJhbnRlZXMgdGhhdCB0aGUgY2Fu
dmFzIGlzIHJlc3RvcmVkIHRvIGEga25vd24gc3RhdGUgb24gZGVzdHJ1Y3Rpb24uCi0gICAgU2tB
dXRvQ2FudmFzUmVzdG9yZSBhdXRvUmVzdG9yZUNhbnZhcyhjYW52YXMsIHRydWUpOworICAgIHN0
ZDo6bWFwPExheWVyQ2hyb21pdW0qLCB1bnNpZ25lZCBpbnQ+OjppdGVyYXRvciB0ZXh0dXJlSWQ7
CisgICAgaWYgKCh0ZXh0dXJlSWQgPSBtX3RleHR1cmVJZE1hcC5maW5kKGxheWVyKSkgIT0gbV90
ZXh0dXJlSWRNYXAuZW5kKCkpCisgICAgICAgIHJldHVybiB0ZXh0dXJlSWQtPnNlY29uZDsKIAot
ICAgIEZsb2F0UG9pbnQgcG9zaXRpb24gPSBsYXllci0+cG9zaXRpb24oKTsKLSAgICBGbG9hdFBv
aW50IGFuY2hvclBvaW50ID0gbGF5ZXItPmFuY2hvclBvaW50KCk7Ci0gICAgU2tNYXRyaXggdHJh
bnNmb3JtID0gbGF5ZXItPnRyYW5zZm9ybSgpLnRvQWZmaW5lVHJhbnNmb3JtKCk7CisgICAgcmV0
dXJuIC0xOworfQorCisvLyBBbGxvY2F0ZXMgYSBuZXcgdGV4dHVyZSBmb3IgdGhlIGxheWVyIGFu
ZCByZWdpc3RlcnMgaXQgaW4gdGhlIHRleHR1cmVJZCBtYXAuCisvLyBGSVhNRTogV2Ugd2lsbCBu
ZWVkIHRvIGNvbWUgdXAgd2l0aCBhIG1vcmUgc29waGlzdGljYXRlZCBhbGxvY2F0aW9uIHN0cmF0
ZWd5IGhlcmUuCisvLyBGSVhNRTogV2UgbmVlZCB0byBmcmVlIHVwIHRoZSBhc3NvY2lhdGVkIHRl
eHR1cmUgdXBvbiBsYXllciBkZXN0cnVjdGlvbi4KK2ludCBMYXllclJlbmRlcmVyQ2hyb21pdW06
OmFzc2lnblRleHR1cmVGb3JMYXllcihMYXllckNocm9taXVtKiBsYXllcikKK3sKKyAgICBHTHVp
bnQgdGV4dHVyZUlkID0gY3JlYXRlTGF5ZXJUZXh0dXJlKCk7CisKKyAgICAvLyBGSVhNRTogQ2hl
Y2sgdGhhdCB0ZXh0dXJlSWQgaXMgdmFsaWQKKyAgICBtX3RleHR1cmVJZE1hcC5pbnNlcnQoc3Rk
OjptYWtlX3BhaXIobGF5ZXIsIHRleHR1cmVJZCkpOworICAgIHJldHVybiB0ZXh0dXJlSWQ7Cit9
CisKK2Jvb2wgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpmcmVlTGF5ZXJUZXh0dXJlKExheWVyQ2hy
b21pdW0qIGxheWVyKQoreworICAgIHN0ZDo6bWFwPExheWVyQ2hyb21pdW0qLCB1bnNpZ25lZCBp
bnQ+OjppdGVyYXRvciB0ZXh0dXJlSWQgPSBtX3RleHR1cmVJZE1hcC5maW5kKGxheWVyKTsKKyAg
ICBpZiAodGV4dHVyZUlkID09IG1fdGV4dHVyZUlkTWFwLmVuZCgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgLy8gRnJlZSB1cCB0aGUgdGV4dHVyZS4KKyAgICBnbERlbGV0ZVRleHR1cmVz
KDEsICYodGV4dHVyZUlkLT5zZWNvbmQpKTsKKyAgICBtX3RleHR1cmVJZE1hcC5lcmFzZSh0ZXh0
dXJlSWQpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBEcmF3cyBhIGRlYnVnIGJvcmRlciBh
cm91bmQgdGhlIGxheWVyJ3MgYm91bmRzLgordm9pZCBMYXllclJlbmRlcmVyQ2hyb21pdW06OmRy
YXdEZWJ1Z0JvcmRlcihMYXllckNocm9taXVtKiBsYXllciwgY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgmIG1hdHJpeCkKK3sKKyAgICBzdGF0aWMgR0xmbG9hdCBnbE1hdHJpeFsxNl07CisgICAg
Q29sb3IgYm9yZGVyQ29sb3IgPSBsYXllci0+Ym9yZGVyQ29sb3IoKTsKKyAgICBpZiAoIWJvcmRl
ckNvbG9yLmFscGhhKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGdsVXNlUHJvZ3JhbShtX2Jv
cmRlclByb2dyYW1PYmplY3QpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlbmRlck1hdHJp
eCA9IG1hdHJpeDsKICAgICBJbnRTaXplIGJvdW5kcyA9IGxheWVyLT5ib3VuZHMoKTsKKyAgICBy
ZW5kZXJNYXRyaXguc2NhbGUzZChib3VuZHMud2lkdGgoKSwgYm91bmRzLmhlaWdodCgpLCAxKTsK
KyAgICByZW5kZXJNYXRyaXgubXVsdGlwbHkobV9wcm9qZWN0aW9uTWF0cml4KTsKKyAgICB0b0dM
TWF0cml4KCZnbE1hdHJpeFswXSwgcmVuZGVyTWF0cml4KTsKKyAgICBGbG9hdFBvaW50M0QgdGVz
dDEgPSByZW5kZXJNYXRyaXgubWFwUG9pbnQoRmxvYXRQb2ludDNEKC0wLjUsIDAuNSwgMCkpOwor
ICAgIEZsb2F0UG9pbnQzRCB0ZXN0MiA9IHJlbmRlck1hdHJpeC5tYXBQb2ludChGbG9hdFBvaW50
M0QoMC41LCAtMC41LCAwKSk7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KG1fYm9yZGVyTWF0cml4
TG9jYXRpb24sIDEsIGZhbHNlLCAmZ2xNYXRyaXhbMF0pOworICAgIAorICAgIGdsVW5pZm9ybTRm
KG1fYm9yZGVyQ29sb3JMb2NhdGlvbiwgYm9yZGVyQ29sb3IucmVkKCkgLyAyNTUuMCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yLmdyZWVuKCkgLyAy
NTUuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9y
LmJsdWUoKSAvIDI1NS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
MSk7CisKKyAgICBnbExpbmVXaWR0aChsYXllci0+Ym9yZGVyV2lkdGgoKSk7CisKKyAgICAvLyBU
aGUgaW5kaWNlcyBmb3IgdGhlIGxpbmUgYXJlIHN0b3JlZCBpbiB0aGUgc2FtZSBhcnJheSBhcyB0
aGUgdHJpYW5nbGUgaW5kaWNlcy4KKyAgICBnbERyYXdFbGVtZW50cyhHTF9MSU5FX0xPT1AsIDQs
IEdMX1VOU0lHTkVEX1NIT1JULCAodm9pZCopKDYgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSk7
CisgICAgY2hlY2tHTEVycm9yKCk7CiAKLSAgICBjYW52YXMtPnRyYW5zbGF0ZShwb3NpdGlvbi54
KCksIHBvc2l0aW9uLnkoKSk7CisgICAgLy8gU3dpdGNoIGJhY2sgdG8gdGhlIHNoYWRlciBwcm9n
cmFtIHVzZWQgZm9yIGxheWVyIGNvbnRlbnRzLgorICAgIGdsVXNlUHJvZ3JhbShtX2xheWVyUHJv
Z3JhbU9iamVjdCk7Cit9CiAKLSAgICBTa1NjYWxhciB0eCA9IFNrU2NhbGFyTXVsKGFuY2hvclBv
aW50LngoKSwgYm91bmRzLndpZHRoKCkpOwotICAgIFNrU2NhbGFyIHR5ID0gU2tTY2FsYXJNdWwo
YW5jaG9yUG9pbnQueSgpLCBib3VuZHMuaGVpZ2h0KCkpOwotICAgIGNhbnZhcy0+dHJhbnNsYXRl
KHR4LCB0eSk7Ci0gICAgY2FudmFzLT5jb25jYXQodHJhbnNmb3JtKTsKLSAgICBjYW52YXMtPnRy
YW5zbGF0ZSgtdHgsIC10eSk7Ci0KLSAgICAvLyBUaGUgcG9zaXRpb24gd2UgZ2V0IGlzIGZvciB0
aGUgY2VudGVyIG9mIHRoZSBsYXllciwgYnV0Ci0gICAgLy8gZHJhd0JpdG1hcCBzdGFydHMgYXQg
dGhlIHVwcGVyLWxlZnQgY29ybmVyLCBhbmQgdGhlcmVmb3JlCi0gICAgLy8gd2UgbmVlZCB0byBh
ZGp1c3Qgb3VyIHRyYW5zZm9ybS4KLSAgICBjYW52YXMtPnRyYW5zbGF0ZSgtMC41ZiAqIGJvdW5k
cy53aWR0aCgpLCAtMC41ZiAqIGJvdW5kcy5oZWlnaHQoKSk7Ci0KLSAgICBsYXllci0+ZHJhd0Rl
YnVnQm9yZGVyKCk7Ci0KLSAgICBTa1BhaW50IG9wYWNpdHlQYWludDsKLSAgICBvcGFjaXR5ICo9
IGxheWVyLT5vcGFjaXR5KCk7Ci0gICAgb3BhY2l0eVBhaW50LnNldEFscGhhKG9wYWNpdHkgKiAy
NTUpOworLy8gUmV0dXJucyB0cnVlIGlmIGFueSBwYXJ0IG9mIHRoZSBsYXllciBmYWxscyB3aXRo
aW4gdGhlIHZpc2libGVSZWN0Citib29sIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6aXNMYXllclZp
c2libGUoTGF5ZXJDaHJvbWl1bSogbGF5ZXIsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBt
YXRyaXgsIGNvbnN0IEludFJlY3QmIHZpc2libGVSZWN0KQoreworICAgIC8vIEZvcm0gdGhlIG1h
dHJpeCB1c2VkIGJ5IHRoZSBzaGFkZXIgdG8gbWFwIHRoZSBjb3JuZXJzIG9mIHRoZSBsYXllcidz
CisgICAgLy8gYm91bmRzIGludG8gY2xpcCBzcGFjZS4KKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCByZW5kZXJNYXRyaXggPSBtYXRyaXg7CisgICAgcmVuZGVyTWF0cml4LnNjYWxlM2QobGF5ZXIt
PmJvdW5kcygpLndpZHRoKCksIGxheWVyLT5ib3VuZHMoKS5oZWlnaHQoKSwgMSk7CisgICAgcmVu
ZGVyTWF0cml4Lm11bHRpcGx5KG1fcHJvamVjdGlvbk1hdHJpeCk7CisKKyAgICBGbG9hdFJlY3Qg
bGF5ZXJSZWN0KC0wLjUsIC0wLjUsIDEsIDEpOworICAgIEZsb2F0UmVjdCBtYXBwZWRSZWN0ID0g
cmVuZGVyTWF0cml4Lm1hcFJlY3QobGF5ZXJSZWN0KTsKKworICAgIC8vIFRoZSBsYXllciBpcyB2
aXNpYmxlIGlmIGl0IGludGVyc2VjdHMgYW55IHBhcnQgb2YgYSByZWN0YW5nbGUgd2hvc2Ugb3Jp
Z2luCisgICAgLy8gaXMgYXQgKC0xLCAtMSkgYW5kIHNpemUgaXMgMngyLgorICAgIHJldHVybiBt
YXBwZWRSZWN0LmludGVyc2VjdHMoRmxvYXRSZWN0KC0xLCAtMSwgMiwgMikpOworfQogCi0gICAg
Y2FudmFzLT5kcmF3Qml0bWFwKGxheWVyLT5wbGF0Zm9ybUNhbnZhcygpLT5nZXREZXZpY2UoKS0+
YWNjZXNzQml0bWFwKGZhbHNlKSwgMCwgMCwgJm9wYWNpdHlQYWludCk7Cit2b2lkIExheWVyUmVu
ZGVyZXJDaHJvbWl1bTo6Y29tcG9zaXRlTGF5ZXJzUmVjdXJzaXZlKExheWVyQ2hyb21pdW0qIGxh
eWVyLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgbWF0cml4LCBmbG9hdCBvcGFjaXR5LCBj
b25zdCBJbnRSZWN0JiB2aXNpYmxlUmVjdCkKK3sKKyAgICBzdGF0aWMgR0xmbG9hdCBnbE1hdHJp
eFsxNl07CisKKyAgICAvLyBDb21wdXRlIHRoZSBuZXcgbWF0cml4IHRyYW5zZm9ybWF0aW9uIHRo
YXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoaXMgbGF5ZXIgYW5kCisgICAgLy8gYWxsIGl0cyBzdWJs
YXllcnMuCisgICAgLy8gVGhlIGJhc2ljIHRyYW5zZm9ybWF0aW9uIGNoYWluIGZvciB0aGUgbGF5
ZXIgaXMgKHVzaW5nIHRoZSBNYXRyaXggeCBWZWN0b3Igb3JkZXIpOgorICAgIC8vIE0gPSBNW3Bd
ICogVFtsXSAqIFRbYV0gKiBNW2xdICogVFstYV0KKyAgICAvLyBXaGVyZSBNW3BdIGlzIHRoZSBw
YXJlbnQgbWF0cml4IHBhc3NlZCBkb3duIHRvIHRoZSBmdW5jdGlvbgorICAgIC8vICAgICAgIFRb
bF0gaXMgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBsYXllcidzIGNlbnRlcgorICAgIC8vICAgICAg
IFRbYV0gYW5kIFRbLWFdIGlzIGEgdHJhbnNsYXRpb24vaW52ZXJzZSB0cmFuc2xhdGlvbiBieSB0
aGUgYW5jaG9yIHBvaW50CisgICAgLy8gICAgICAgTVtsXSBpcyB0aGUgbGF5ZXIncyBtYXRyaXgK
KyAgICAvLyBOb3RlIHRoYXQgdGhlIGZpbmFsIG1hdHJpeCB1c2VkIGJ5IHRoZSBzaGFkZXIgZm9y
IHRoZSBsYXllciBpcyBQICogTSAqIFMgLiBUaGlzIGZpbmFsIHByb2R1Y3QKKyAgICAvLyBpcyBl
ZmZlY3RpdmVseSBjb21wdXRlZCBpbiBkcmF3VGV4dHVyZWRRdWFkKCkuCisgICAgLy8gV2hlcmU6
IFAgaXMgdGhlIHByb2plY3Rpb24gbWF0cml4CisgICAgLy8gICAgICAgIE0gaXMgdGhlIGxheWVy
J3MgbWF0cml4IGNvbXB1dGVkIGFib3ZlCisgICAgLy8gICAgICAgIFMgaXMgdGhlIHNjYWxlIGFk
anVzdG1lbnQgKHRvIHNjYWxlIHVwIHRvIHRoZSBsYXllciBzaXplKQorICAgIEludFNpemUgYm91
bmRzID0gbGF5ZXItPmJvdW5kcygpOworICAgIEZsb2F0UG9pbnQgYW5jaG9yUG9pbnQgPSBsYXll
ci0+YW5jaG9yUG9pbnQoKTsKKyAgICBGbG9hdFBvaW50IHBvc2l0aW9uID0gbGF5ZXItPnBvc2l0
aW9uKCk7CisgICAgZmxvYXQgYW5jaG9yWCA9IChhbmNob3JQb2ludC54KCkgLSAwLjUpICogYm91
bmRzLndpZHRoKCk7CisgICAgZmxvYXQgYW5jaG9yWSA9ICgwLjUgLSBhbmNob3JQb2ludC55KCkp
ICogYm91bmRzLmhlaWdodCgpOwogCisgICAgLy8gTSA9IE1bcF0KKyAgICBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCBsb2NhbE1hdHJpeCA9IG1hdHJpeDsKKyAgICAvLyBNID0gTVtwXSAqIFRbbF0KKyAg
ICBsb2NhbE1hdHJpeC50cmFuc2xhdGUzZChwb3NpdGlvbi54KCksIHBvc2l0aW9uLnkoKSwgMCk7
CisgICAgLy8gTSA9IE1bcF0gKiBUW2xdICogVFthXQorICAgIGxvY2FsTWF0cml4LnRyYW5zbGF0
ZTNkKGFuY2hvclgsIGFuY2hvclksIDApOworICAgIC8vIE0gPSBNW3BdICogVFtsXSAqIFRbYV0g
KiBNW2xdCisgICAgbG9jYWxNYXRyaXgubXVsdExlZnQobGF5ZXItPnRyYW5zZm9ybSgpKTsKKyAg
ICAvLyBNID0gTVtwXSAqIFRbbF0gKiBUW2FdICogTVtsXSAqIFRbLWFdCisgICAgbG9jYWxNYXRy
aXgudHJhbnNsYXRlM2QoLWFuY2hvclgsIC1hbmNob3JZLCAwKTsKKworICAgIGJvb2wgc2tpcExh
eWVyID0gZmFsc2U7CisgICAgaWYgKGJvdW5kcy53aWR0aCgpID4gMjA0OCB8fCBib3VuZHMuaGVp
Z2h0KCkgPiAyMDQ4KSB7CisgICAgICAgIExPRyhMYXllclJlbmRlcmVyLCAiU2tpcHBpbmcgbGF5
ZXIgd2l0aCBzaXplICVkICVkIiwgYm91bmRzLndpZHRoKCksIGJvdW5kcy5oZWlnaHQoKSk7Cisg
ICAgICAgIHNraXBMYXllciA9IHRydWU7CisgICAgfQorCisgICAgYm9vbCBsYXllclZpc2libGUg
PSBpc0xheWVyVmlzaWJsZShsYXllciwgbG9jYWxNYXRyaXgsIHZpc2libGVSZWN0KTsKKworICAg
IC8vIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIGxheWVyczoKKyAgICAvLyAxLiBM
YXllcnMgdGhhdCBoYXZlIHRoZWlyIG93biBHcmFwaGljc0NvbnRleHQgYW5kIGNhbiBkcmF3IHRo
ZWlyIGNvbnRlbnRzIG9uIGRlbWFuZCAobGF5ZXItPmRyYXdzQ29udGVudCgpID09IHRydWUpLgor
ICAgIC8vIDIuIExheWVycyB0aGF0IGFyZSBqdXN0IGNvbnRhaW5lcnMgb2YgaW1hZ2VzL3ZpZGVv
L2V0YyB0aGF0IGRvbid0IG93biBhIEdyYXBoaWNzQ29udGV4dCAobGF5ZXItPmNvbnRlbnRzKCkg
PT0gdHJ1ZSkuCisgICAgaWYgKChsYXllci0+ZHJhd3NDb250ZW50KCkgfHwgbGF5ZXItPmNvbnRl
bnRzKCkpICYmICFza2lwTGF5ZXIgJiYgbGF5ZXJWaXNpYmxlKSB7CisgICAgICAgIGludCB0ZXh0
dXJlSWQgPSBnZXRUZXh0dXJlSWQobGF5ZXIpOworICAgICAgICAvLyBJZiBubyB0ZXh0dXJlIGhh
cyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBsYXllciB5ZXQgdGhlbiBjcmVhdGUgb25lIG5vdy4KKyAg
ICAgICAgaWYgKHRleHR1cmVJZCA9PSAtMSkKKyAgICAgICAgICAgIHRleHR1cmVJZCA9IGFzc2ln
blRleHR1cmVGb3JMYXllcihsYXllcik7CisKKyAgICAgICAgLy8gUmVkcmF3IHRoZSBjb250ZW50
cyBvZiB0aGUgbGF5ZXIgaWYgbmVjZXNzYXJ5LgorICAgICAgICBpZiAoKGxheWVyLT5kcmF3c0Nv
bnRlbnQoKSB8fCBsYXllci0+Y29udGVudHMoKSkgJiYgbGF5ZXItPmNvbnRlbnRzRGlydHkoKSkg
eworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgbGF5ZXIgYmVmb3Jl
IHRha2luZyBhIHNuYXBzaG90LiBGb3IgbGF5ZXJzIHRoYXQKKyAgICAgICAgICAgIC8vIGFyZSBz
aW1wbHkgY29udGFpbmVycywgdGhlIGZvbGxvd2luZyBjYWxsIGp1c3QgY2xlYXJzIHRoZSBkaXJ0
eSBmbGFnIGJ1dCBkb2Vzbid0CisgICAgICAgICAgICAvLyBhY3R1YWxseSBkbyBhbnkgZHJhd3Mv
Y29waWVzLgorICAgICAgICAgICAgbGF5ZXItPnVwZGF0ZUNvbnRlbnRzKCk7CisKKyAgICAgICAg
ICAgIGNvbnN0IFNrQml0bWFwKiBza2lhQml0bWFwID0gMDsKKyAgICAgICAgICAgIHZvaWQqIHBp
eGVscyA9IDA7CisgICAgICAgICAgICBpZiAobGF5ZXItPmRyYXdzQ29udGVudCgpKSB7IC8vIExh
eWVyIGhhcyBpdHMgb3duIEdyYXBoaWNzQ29udGV4dC4KKyAgICAgICAgICAgICAgICAvLyBUaGUg
Y29udGVudHMgb2YgdGhlIGxheWVyIGFyZSBzdG9yZWQgaW4gdGhlIGNhbnZhcyBhc3NvY2lhdGVk
IHdpdGggaXQuCisgICAgICAgICAgICAgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCA9IGxheWVy
LT5wbGF0Zm9ybUNhbnZhcygpLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKTsKKyAg
ICAgICAgICAgICAgICBza2lhQml0bWFwID0gJmJpdG1hcDsKKyAgICAgICAgICAgIH0gZWxzZSB7
IC8vIExheWVyIGlzIGEgY29udGFpbmVyLgorICAgICAgICAgICAgICAgIC8vIFRoZSBsYXllciBj
b250YWlucyBhbiBJbWFnZS4KKyAgICAgICAgICAgICAgICBOYXRpdmVJbWFnZVNraWEqIHNraWFJ
bWFnZSA9IHN0YXRpY19jYXN0PE5hdGl2ZUltYWdlU2tpYSo+KGxheWVyLT5jb250ZW50cygpKTsK
KyAgICAgICAgICAgICAgICBza2lhQml0bWFwID0gc2tpYUltYWdlOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBBU1NFUlQoc2tpYUJpdG1hcCk7CisgICAgICAgICAgICBTa0JpdG1hcDo6
Q29uZmlnIHNraWFDb25maWcgPSBza2lhQml0bWFwLT5jb25maWcoKTsKKyAgICAgICAgICAgIC8v
IEZJWE1FOiBtdXN0IHN1cHBvcnQgbW9yZSBpbWFnZSBjb25maWd1cmF0aW9ucy4KKyAgICAgICAg
ICAgIGlmIChza2lhQ29uZmlnID09IFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZykgeworICAg
ICAgICAgICAgICAgIFNrQXV0b0xvY2tQaXhlbHMgbG9jaygqc2tpYUJpdG1hcCk7CisgICAgICAg
ICAgICAgICAgaW50IGJpdG1hcFdpZHRoID0gc2tpYUJpdG1hcC0+d2lkdGgoKTsKKyAgICAgICAg
ICAgICAgICBpbnQgYml0bWFwSGVpZ2h0ID0gc2tpYUJpdG1hcC0+aGVpZ2h0KCk7CisgICAgICAg
ICAgICAgICAgaW50IHJvd0J5dGVzID0gc2tpYUJpdG1hcC0+cm93Qnl0ZXMoKTsKKyAgICAgICAg
ICAgICAgICBBU1NFUlQocm93Qnl0ZXMgPT0gYml0bWFwV2lkdGggKiA0KTsKKworICAgICAgICAg
ICAgICAgIC8vIENvcHkgdGhlIGxheWVyIGNvbnRlbnRzIGludG8gdGhlIHRleHR1cmUuCisgICAg
ICAgICAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlSWQpOworICAg
ICAgICAgICAgICAgIHZvaWQqIHBpeGVscyA9IHNraWFCaXRtYXAtPmdldFBpeGVscygpOworICAg
ICAgICAgICAgICAgIGlmIChwaXhlbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUu
IFdlIGNhbiBiZSBzbWFydCBoZXJlIGFuZCBjYWxsIGdsVGV4U3ViSW1hZ2UyRCBpZiB0aGUgbmV3
IGJpdG1hcCBoYXMgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBhcyB0aGUg
b2xkIG9uZSB3aGljaCB3aWxsIHNhdmUgdXMgb25lIHVuZWNlc3NhcnkgYWxsb2NhdGlvbiAvIGRl
YWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVf
MkQsIDAsIEdMX1JHQkEsIGJpdG1hcFdpZHRoLCBiaXRtYXBIZWlnaHQsIDAsIEdMX1JHQkEsIEdM
X1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrR0xFcnJv
cigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
ICAgIC8vIENhbGN1bGF0ZSB0aGUgbGF5ZXIncyBvcGFjaXR5LgorICAgICAgICBvcGFjaXR5ICo9
IGxheWVyLT5vcGFjaXR5KCk7CisKKyAgICAgICAgaWYgKGxheWVyLT5kb3VibGVTaWRlZCgpKQor
ICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShH
TF9URVhUVVJFXzJELCB0ZXh0dXJlSWQpOworCisgICAgICAgIGRyYXdUZXh0dXJlZFF1YWQobG9j
YWxNYXRyaXgsIGJvdW5kcy53aWR0aCgpLCBib3VuZHMuaGVpZ2h0KCksIG9wYWNpdHksIGZhbHNl
KTsKKyAgICB9CisKKyAgICAvLyBEcmF3IHRoZSBkZWJ1ZyBib3JkZXIgaWYgdGhlcmUgaXMgb25l
LgorICAgIGRyYXdEZWJ1Z0JvcmRlcihsYXllciwgbG9jYWxNYXRyaXgpOworCisgICAgLy8gQXBw
bHkgdGhlIHN1YmxheWVyIHRyYW5zZm9ybS4KKyAgICBsb2NhbE1hdHJpeC5tdWx0TGVmdChsYXll
ci0+c3VibGF5ZXJUcmFuc2Zvcm0oKSk7CisKKyAgICAvLyBUaGUgb3JpZ2luIG9mIHRoZSBzdWJs
YXllcnMgaXMgYWN0dWFsbHkgdGhlIGxlZnQgdG9wIGNvcm5lciBvZiB0aGUgbGF5ZXIKKyAgICAv
LyBpbnN0ZWFkIG9mIHRoZSBjZW50ZXIuIFRoZSBtYXRyaXggcGFzc2VkIGRvd24gdG8gdGhlIHN1
YmxheWVycyBpcyB0aGVyZWZvcmU6CisgICAgLy8gTVtzXSA9IE0gKiBUWy1jZW50ZXJdCisgICAg
bG9jYWxNYXRyaXgudHJhbnNsYXRlM2QoLWJvdW5kcy53aWR0aCgpICogMC41LCAtYm91bmRzLmhl
aWdodCgpICogMC41LCAwKTsKICAgICBjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyQ2hyb21pdW0+
ID4mIHN1YmxheWVycyA9IGxheWVyLT5nZXRTdWJsYXllcnMoKTsKICAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHN1YmxheWVycy5zaXplKCk7IGkrKykKLSAgICAgICAgZHJhd0xheWVySW5DYW52
YXNSZWN1cnNpdmUoY2FudmFzLCBzdWJsYXllcnNbaV0uZ2V0KCksIG9wYWNpdHkpOworICAgICAg
ICBjb21wb3NpdGVMYXllcnNSZWN1cnNpdmUoc3VibGF5ZXJzW2ldLmdldCgpLCBsb2NhbE1hdHJp
eCwgb3BhY2l0eSwgdmlzaWJsZVJlY3QpOwogfQotI2VuZGlmIC8vIFBMQVRGT1JNKFNLSUEpCiAK
LXZvaWQgTGF5ZXJSZW5kZXJlckNocm9taXVtOjp1cGRhdGVMYXllckNvbnRlbnRzUmVjdXJzaXZl
KExheWVyQ2hyb21pdW0qIGxheWVyKQorYm9vbCBMYXllclJlbmRlcmVyQ2hyb21pdW06Om1ha2VD
b250ZXh0Q3VycmVudCgpCiB7Ci0gICAgbGF5ZXItPnVwZGF0ZUNvbnRlbnRzKCk7CisgICAgcmV0
dXJuIG1fZ2xlczJDb250ZXh0LT5tYWtlQ3VycmVudCgpOworfQogCi0gICAgY29uc3QgVmVjdG9y
PFJlZlB0cjxMYXllckNocm9taXVtPiA+JiBzdWJsYXllcnMgPSBsYXllci0+Z2V0U3VibGF5ZXJz
KCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspCi0g
ICAgICAgIHVwZGF0ZUxheWVyQ29udGVudHNSZWN1cnNpdmUoc3VibGF5ZXJzW2ldLmdldCgpKTsK
K2Jvb2wgTGF5ZXJSZW5kZXJlckNocm9taXVtOjppbml0R0woKQoreworICAgIG1fZ2xlczJDb250
ZXh0ID0gR0xFUzJDb250ZXh0OjpjcmVhdGUobV9wYWdlKTsKKworICAgIGlmICghbV9nbGVzMkNv
bnRleHQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCisv
LyBCaW5kcyB0aGUgZ2l2ZW4gYXR0cmlidXRlIG5hbWUgdG8gYSBjb21tb24gbG9jYXRpb24gYWNy
b3NzIGFsbCB0aHJlZSBwcm9ncmFtcworLy8gdXNlZCBieSB0aGUgY29tcG9zaXRvci4gVGhpcyBh
bGxvd3MgdGhlIGNvZGUgdG8gYmluZCB0aGUgYXR0cmlidXRlcyBvbmx5IG9uY2UKKy8vIGV2ZW4g
d2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBwcm9ncmFtcy4KK3ZvaWQgTGF5ZXJSZW5kZXJlckNocm9t
aXVtOjpiaW5kQ29tbW9uQXR0cmliTG9jYXRpb24oaW50IGxvY2F0aW9uLCBjaGFyKiBhdHRyaWJO
YW1lKQoreworICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKG1fbGF5ZXJQcm9ncmFtT2JqZWN0LCBs
b2NhdGlvbiwgYXR0cmliTmFtZSk7CisgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24obV9ib3JkZXJQ
cm9ncmFtT2JqZWN0LCBsb2NhdGlvbiwgYXR0cmliTmFtZSk7CisgICAgZ2xCaW5kQXR0cmliTG9j
YXRpb24obV9zY3JvbGxQcm9ncmFtT2JqZWN0LCBsb2NhdGlvbiwgYXR0cmliTmFtZSk7CiB9CiAK
K2Jvb2wgTGF5ZXJSZW5kZXJlckNocm9taXVtOjppbml0aWFsaXplU2hhcmVkR0xPYmplY3RzKCkK
K3sKKyAgICAvLyBTaGFkZXJzIGZvciBkcmF3aW5nIHRoZSBsYXllciBjb250ZW50cy4KKyAgICBj
aGFyIHZlcnRleFNoYWRlclN0cmluZ1tdID0KKyAgICAgICAgImF0dHJpYnV0ZSB2ZWM0IGFfcG9z
aXRpb247ICAgXG4iCisgICAgICAgICJhdHRyaWJ1dGUgdmVjMiBhX3RleENvb3JkOyAgIFxuIgor
ICAgICAgICAidW5pZm9ybSBtYXQ0IG1hdHJpeDsgICAgICAgICBcbiIKKyAgICAgICAgInZhcnlp
bmcgdmVjMiB2X3RleENvb3JkOyAgICAgXG4iCisgICAgICAgICJ2b2lkIG1haW4oKSAgICAgICAg
ICAgICAgICAgIFxuIgorICAgICAgICAieyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIK
KyAgICAgICAgIiAgZ2xfUG9zaXRpb24gPSBtYXRyaXggKiBhX3Bvc2l0aW9uOyBcbiIKKyAgICAg
ICAgIiAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7ICAgXG4iCisgICAgICAgICJ9ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFxuIjsKKyAgICBjaGFyIGZyYWdtZW50U2hhZGVyU3RyaW5nW10g
PQorICAgICAgICAvLyBGSVhNRTogUmUtaW50cm9kdWNlIHByZWNpc2lvbiBxdWFsaWZpZXIgd2hl
biB3ZSBuZWVkIEdMIEVTIHNoYWRlcnMuCisgICAgICAgICIvL3ByZWNpc2lvbiBtZWRpdW1wIGZs
b2F0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInZhcnlpbmcgdmVj
MiB2X3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInVu
aWZvcm0gc2FtcGxlcjJEIHNfdGV4dHVyZTsgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAg
ICAgICAgInVuaWZvcm0gZmxvYXQgYWxwaGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcbiIKKyAgICAgICAgInZvaWQgbWFpbigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcbiIKKyAgICAgICAgInsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIiAgdmVjNCB0ZXhDb2xvciA9IHRleHR1
cmUyRChzX3RleHR1cmUsIHZfdGV4Q29vcmQpOyBcbiIKKyAgICAgICAgIiAgZ2xfRnJhZ0NvbG9y
ID0gdmVjNCh0ZXhDb2xvci56LCB0ZXhDb2xvci55LCB0ZXhDb2xvci54LCB0ZXhDb2xvci53KSAq
IGFscGhhOyBcbiIKKyAgICAgICAgIn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcbiI7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgdXNlZCBmb3Ig
cmVuZGVyaW5nIHRoZSBzY3JvbGxlZCByb290IGxheWVyIHF1YWQuIEl0IGRpZmZlcnMKKyAgICAv
LyBmcm9tIGZyYWdtZW50U2hhZGVyU3RyaW5nIGluIHRoYXQgaXQgZG9lc24ndCBzd2l6emxlIHRo
ZSBjb2xvcnMgYW5kIGRvZXNuJ3QKKyAgICAvLyB0YWtlIGFuIGFscGhhIHZhbHVlLgorICAgIGNo
YXIgc2Nyb2xsRnJhZ21lbnRTaGFkZXJTdHJpbmdbXSA9CisgICAgICAgIC8vIEZJWE1FOiBSZS1p
bnRyb2R1Y2UgcHJlY2lzaW9uIHF1YWxpZmllciB3aGVuIHdlIG5lZWQgR0wgRVMgc2hhZGVycy4K
KyAgICAgICAgIi8vcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7ICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFxuIgorICAgICAgICAidmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7ICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAidW5pZm9ybSBzYW1wbGVyMkQgc190ZXh0dXJl
OyAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAidm9pZCBtYWluKCkgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAieyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAi
ICB2ZWM0IHRleENvbG9yID0gdGV4dHVyZTJEKHNfdGV4dHVyZSwgdl90ZXhDb29yZCk7IFxuIgor
ICAgICAgICAiICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHRleENvbG9yLngsIHRleENvbG9yLnksIHRl
eENvbG9yLnosIHRleENvbG9yLncpOyBcbiIKKyAgICAgICAgIn0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiI7CisKKyAgICAvLyBTaGFkZXJzIGZv
ciBkcmF3aW5nIHRoZSBkZWJ1ZyBib3JkZXJzIGFyb3VuZCB0aGUgbGF5ZXJzLgorICAgIGNoYXIg
Ym9yZGVyVmVydGV4U2hhZGVyU3RyaW5nW10gPQorICAgICAgICAiYXR0cmlidXRlIHZlYzQgYV9w
b3NpdGlvbjsgICBcbiIKKyAgICAgICAgInVuaWZvcm0gbWF0NCBtYXRyaXg7ICAgICAgICAgXG4i
CisgICAgICAgICJ2b2lkIG1haW4oKSAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAieyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIiAgIGdsX1Bvc2l0aW9uID0g
bWF0cml4ICogYV9wb3NpdGlvbjsgXG4iCisgICAgICAgICJ9ICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFxuIjsKKyAgICBjaGFyIGJvcmRlckZyYWdtZW50U2hhZGVyU3RyaW5nW10gPQorICAg
ICAgICAvLyBGSVhNRTogUmUtaW50cm9kdWNlIHByZWNpc2lvbiBxdWFsaWZpZXIgd2hlbiB3ZSBu
ZWVkIEdMIEVTIHNoYWRlcnMuCisgICAgICAgICIvL3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xv
cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInZvaWQgbWFp
bigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAg
InsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIK
KyAgICAgICAgIiAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcbiIKKyAgICAgICAgIn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcbiI7CisKKyAgICBHTGZsb2F0IHZlcnRpY2VzW10gPSB7IC0wLjVmLCAg
MC41ZiwgMC4wZiwgLy8gUG9zaXRpb24gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAu
MGYsICAxLjBmLCAvLyBUZXhDb29yZCAwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAu
NWYsIC0wLjVmLCAwLjBmLCAvLyBQb3NpdGlvbiAxCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgMC4wZiwgIDAuMGYsIC8vIFRleENvb3JkIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAwLjVmLCAtMC41ZiwgMC4wZiwgLy8gUG9zaXRpb24gMgorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDEuMGYsICAwLjBmLCAvLyBUZXhDb29yZCAyCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgMC41ZiwgIDAuNWYsIDAuMGYsIC8vIFBvc2l0aW9uIDMKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAxLjBmLCAgMS4wZiAvLyBUZXhDb29yZCAzCisgICAgICAgICAgICAgICAgICAg
ICAgICAgfTsKKyAgICBHTHVzaG9ydCBpbmRpY2VzW10gPSB7IDAsIDEsIDIsIDAsIDIsIDMsIC8v
IFRoZSB0d28gdHJpYW5nbGVzIHRoYXQgbWFrZSB1cCB0aGUgbGF5ZXIgcXVhZC4KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDN9OyAvLyBBIGxpbmUgcGF0aCBmb3IgZHJhd2lu
ZyB0aGUgbGF5ZXIgYm9yZGVyLgorCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgbV9s
YXllclByb2dyYW1PYmplY3QgPSBsb2FkU2hhZGVyUHJvZ3JhbSh2ZXJ0ZXhTaGFkZXJTdHJpbmcs
IGZyYWdtZW50U2hhZGVyU3RyaW5nKTsKKyAgICBpZiAoIW1fbGF5ZXJQcm9ncmFtT2JqZWN0KSB7
CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBzaGFkZXIgcHJvZ3JhbSBmb3Ig
bGF5ZXJzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3Njcm9sbFBy
b2dyYW1PYmplY3QgPSBsb2FkU2hhZGVyUHJvZ3JhbSh2ZXJ0ZXhTaGFkZXJTdHJpbmcsIHNjcm9s
bEZyYWdtZW50U2hhZGVyU3RyaW5nKTsKKyAgICBpZiAoIW1fc2Nyb2xsUHJvZ3JhbU9iamVjdCkg
eworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgc2hhZGVyIHByb2dyYW0gZm9y
IHNjcm9sbGluZyBsYXllciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
bV9ib3JkZXJQcm9ncmFtT2JqZWN0ID0gbG9hZFNoYWRlclByb2dyYW0oYm9yZGVyVmVydGV4U2hh
ZGVyU3RyaW5nLCBib3JkZXJGcmFnbWVudFNoYWRlclN0cmluZyk7CisgICAgaWYgKCFtX2JvcmRl
clByb2dyYW1PYmplY3QpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHNo
YWRlciBwcm9ncmFtIGZvciBkZWJ1ZyBib3JkZXJzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisKKyAgICAvLyBTcGVjaWZ5IHRoZSBhdHRyaWIgbG9jYXRpb24gZm9yIHRoZSBwb3Np
dGlvbiBhbmQgbWFrZSBpdCB0aGUgc2FtZSBmb3IgYWxsIHRocmVlIHByb2dyYW1zIHRvCisgICAg
Ly8gYXZvaWQgYmluZGluZyByZS1iaW5kaW5nIHRoZSB2ZXJ0ZXggYXR0cmlidXRlcy4KKyAgICBi
aW5kQ29tbW9uQXR0cmliTG9jYXRpb24obV9wb3NpdGlvbkxvY2F0aW9uLCAiYV9wb3NpdGlvbiIp
OworICAgIGJpbmRDb21tb25BdHRyaWJMb2NhdGlvbihtX3RleENvb3JkTG9jYXRpb24sICJhX3Rl
eENvb3JkIik7CisKKyAgICBjaGVja0dMRXJyb3IoKTsKKworICAgIC8vIFJlLWxpbmsgdGhlIHNo
YWRlcnMgdG8gZ2V0IHRoZSBuZXcgYXR0cmliIGxvY2F0aW9uIHRvIHRha2UgZWZmZWN0LgorICAg
IGdsTGlua1Byb2dyYW0obV9sYXllclByb2dyYW1PYmplY3QpOworICAgIGdsTGlua1Byb2dyYW0o
bV9ib3JkZXJQcm9ncmFtT2JqZWN0KTsKKyAgICBnbExpbmtQcm9ncmFtKG1fc2Nyb2xsUHJvZ3Jh
bU9iamVjdCk7CisKKyAgICBjaGVja0dMRXJyb3IoKTsKKworICAgIC8vIEdldCBsb2NhdGlvbnMg
b2YgdW5pZm9ybXMgZm9yIHRoZSBsYXllciBjb250ZW50IHNoYWRlciBwcm9ncmFtLgorICAgIG1f
c2FtcGxlckxvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9sYXllclByb2dyYW1PYmpl
Y3QsICJzX3RleHR1cmUiKTsKKyAgICBtX21hdHJpeExvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9j
YXRpb24obV9sYXllclByb2dyYW1PYmplY3QsICJtYXRyaXgiKTsKKyAgICBtX2FscGhhTG9jYXRp
b24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtX2xheWVyUHJvZ3JhbU9iamVjdCwgImFscGhhIik7
CisKKyAgICBtX3Njcm9sbE1hdHJpeExvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9z
Y3JvbGxQcm9ncmFtT2JqZWN0LCAibWF0cml4Iik7CisgICAgbV9zY3JvbGxTYW1wbGVyTG9jYXRp
b24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtX3Njcm9sbFByb2dyYW1PYmplY3QsICJzX3RleHR1
cmUiKTsKKworICAgIC8vIEdldCBsb2NhdGlvbnMgb2YgdW5pZm9ybXMgZm9yIHRoZSBkZWJ1ZyBi
b3JkZXIgc2hhZGVyIHByb2dyYW0uCisgICAgbV9ib3JkZXJNYXRyaXhMb2NhdGlvbiA9IGdsR2V0
VW5pZm9ybUxvY2F0aW9uKG1fYm9yZGVyUHJvZ3JhbU9iamVjdCwgIm1hdHJpeCIpOworICAgIG1f
Ym9yZGVyQ29sb3JMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fYm9yZGVyUHJvZ3Jh
bU9iamVjdCwgImNvbG9yIik7CisKKyAgICBnbEdlbkJ1ZmZlcnMoMywgbV9xdWFkVmJvSWRzKTsK
KyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtX3F1YWRWYm9JZHNbVmVydGljZXNd
KTsKKyAgICBnbEJ1ZmZlckRhdGEoR0xfQVJSQVlfQlVGRkVSLCBzaXplb2YodmVydGljZXMpLCB2
ZXJ0aWNlcywgR0xfU1RBVElDX0RSQVcpOworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FS
UkFZX0JVRkZFUiwgbV9xdWFkVmJvSWRzW0xheWVyRWxlbWVudHNdKTsKKyAgICBnbEJ1ZmZlckRh
dGEoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHNpemVvZihpbmRpY2VzKSwgaW5kaWNlcywgR0xf
U1RBVElDX0RSQVcpOworCisgICAgLy8gQ3JlYXRlIGEgdGV4dHVyZSBvYmplY3QgdG8gaG9sZCB0
aGUgY29udGVudHMgb2YgdGhlIHJvb3QgbGF5ZXIuCisgICAgbV9yb290TGF5ZXJUZXh0dXJlSWQg
PSBjcmVhdGVMYXllclRleHR1cmUoKTsKKyAgICBpZiAobV9yb290TGF5ZXJUZXh0dXJlSWQgPT0g
LTEpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHRleHR1cmUgZm9yIHJv
b3QgbGF5ZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorICAgIC8vIFR1cm4gb2ZmIGZp
bHRlcmluZyBmb3IgdGhlIHJvb3QgbGF5ZXIgdG8gYXZvaWQgYmx1cnJpbmcgZnJvbSB0aGUgcmVw
ZWF0ZWQKKyAgICAvLyB3cml0ZXMgYW5kIHJlYWRzIHRvIHRoZSBmcmFtZWJ1ZmZlciB0aGF0IGhh
cHBlbiB3aGlsZSBzY3JvbGxpbmcuCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBt
X3Jvb3RMYXllclRleHR1cmVJZCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQs
IEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJm
KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIFVT
RShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uaAkocmV2
aXNpb24gNTkxNzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVy
UmVuZGVyZXJDaHJvbWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw3ICsyOCw2IEBACiAgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgogICovCiAKLQogI2lmbmRlZiBMYXllclJlbmRlcmVyQ2hyb21pdW1faAogI2Rl
ZmluZSBMYXllclJlbmRlcmVyQ2hyb21pdW1faAogCkBAIC0zNiw0NSArMzUsOTUgQEAKIAogI2lu
Y2x1ZGUgIkludFJlY3QuaCIKICNpbmNsdWRlICJMYXllckNocm9taXVtLmgiCisjaW5jbHVkZSAi
U2tCaXRtYXAuaCIKKyNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+
CiAjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAK
LW5hbWVzcGFjZSBza2lhIHsKLWNsYXNzIFBsYXRmb3JtQ2FudmFzOwotfQotCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKK2NsYXNzIEdMRVMyQ29udGV4dDsKK2NsYXNzIFBhZ2U7CisKKy8vIENsYXNz
IHRoYXQgaGFuZGxlcyBkcmF3aW5nIG9mIGNvbXBvc2l0ZWQgcmVuZGVyIGxheWVycyB1c2luZyBH
TC4KIGNsYXNzIExheWVyUmVuZGVyZXJDaHJvbWl1bSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CiBw
dWJsaWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8TGF5ZXJSZW5kZXJlckNocm9taXVtPiBjcmVh
dGUoKTsKKyAgICBzdGF0aWMgUGFzc093blB0cjxMYXllclJlbmRlcmVyQ2hyb21pdW0+IGNyZWF0
ZShQYWdlKiBwYWdlKTsKIAotICAgIExheWVyUmVuZGVyZXJDaHJvbWl1bSgpOworICAgIExheWVy
UmVuZGVyZXJDaHJvbWl1bShQYWdlKiBwYWdlKTsKICAgICB+TGF5ZXJSZW5kZXJlckNocm9taXVt
KCk7CiAKLSNpZiBQTEFURk9STShTS0lBKQotICAgIHZvaWQgZHJhd0xheWVyc0luQ2FudmFzKHNr
aWE6OlBsYXRmb3JtQ2FudmFzKiwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpOwotI2VuZGlmCi0g
ICAgdm9pZCB1cGRhdGVMYXllckNvbnRlbnRzKCk7CisgICAgLy8gVXBkYXRlcyB0aGUgY29udGVu
dHMgb2YgdGhlIHJvb3QgbGF5ZXIgdGhhdCBmYWxsIGluc2lkZSB0aGUgdXBkYXRlUmVjdCBhbmQg
cmVjb21wb3NpdHMKKyAgICAvLyBhbGwgdGhlIGxheWVycy4KKyAgICB2b2lkIGRyYXdMYXllcnMo
Y29uc3QgSW50UmVjdCYgdXBkYXRlUmVjdCwgY29uc3QgSW50UmVjdCYgdmlzaWJsZVJlY3QsIGNv
bnN0IEludFJlY3QmIGNvbnRlbnRSZWN0LCBjb25zdCBJbnRQb2ludCYgc2Nyb2xsUG9zaXRpb24p
OwogCiAgICAgdm9pZCBzZXRSb290TGF5ZXIoUGFzc1JlZlB0cjxMYXllckNocm9taXVtPiBsYXll
cikgeyBtX3Jvb3RMYXllciA9IGxheWVyOyB9CiAgICAgTGF5ZXJDaHJvbWl1bSogcm9vdExheWVy
KCkgeyByZXR1cm4gbV9yb290TGF5ZXIuZ2V0KCk7IH0KIAogICAgIHZvaWQgc2V0TmVlZHNEaXNw
bGF5KCkgeyBtX25lZWRzRGlzcGxheSA9IHRydWU7IH0KIAotICAgIHZvaWQgc2V0U2Nyb2xsRnJh
bWUoU2tJUmVjdCYgc2Nyb2xsRnJhbWUpIHsgbV9zY3JvbGxGcmFtZSA9IHNjcm9sbEZyYW1lOyB9
CisgICAgLy8gRnJlZXMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBsYXll
ci4KKyAgICBib29sIGZyZWVMYXllclRleHR1cmUoTGF5ZXJDaHJvbWl1bSopOwogCiBwcml2YXRl
OgotI2lmIFBMQVRGT1JNKFNLSUEpCi0gICAgdm9pZCBkcmF3TGF5ZXJJbkNhbnZhc1JlY3Vyc2l2
ZShza2lhOjpQbGF0Zm9ybUNhbnZhcyosIExheWVyQ2hyb21pdW0qLCBmbG9hdCBvcGFjaXR5KTsK
LSNlbmRpZgotICAgIHZvaWQgdXBkYXRlTGF5ZXJDb250ZW50c1JlY3Vyc2l2ZShMYXllckNocm9t
aXVtKik7CisgICAgdm9pZCBjb21wb3NpdGVMYXllcnNSZWN1cnNpdmUoTGF5ZXJDaHJvbWl1bSos
IGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiwgZmxvYXQgb3BhY2l0eSwgY29uc3QgSW50UmVj
dCYgdmlzaWJsZVJlY3QpOworCisgICAgdm9pZCBkcmF3RGVidWdCb3JkZXIoTGF5ZXJDaHJvbWl1
bSosIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7CisKKyAgICB2b2lkIGRyYXdUZXh0dXJl
ZFF1YWQoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCwgZmxvYXQgd2lkdGgsIGZs
b2F0IGhlaWdodCwgZmxvYXQgb3BhY2l0eSwgYm9vbCBzY3JvbGxpbmcpOworCisgICAgYm9vbCBp
c0xheWVyVmlzaWJsZShMYXllckNocm9taXVtKiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
LCBjb25zdCBJbnRSZWN0JiB2aXNpYmxlUmVjdCk7CisKKyAgICB2b2lkIGJpbmRDb21tb25BdHRy
aWJMb2NhdGlvbihpbnQgbG9jYXRpb24sIGNoYXIqIGF0dHJpYk5hbWUpOworCisgICAgZW51bSBW
Ym9JZHMgeyBWZXJ0aWNlcywgTGF5ZXJFbGVtZW50cyB9OworCisgICAgLy8gVGhlc2UgYXJlIGhl
cmUgb25seSB0ZW1wb3JhcmlseSBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB3ZSBzd2l0Y2gg
b3ZlciB0byBHR0wKKyAgICBib29sIGluaXRHTCgpOworICAgIGJvb2wgbWFrZUNvbnRleHRDdXJy
ZW50KCk7CisKKyAgICBib29sIGluaXRpYWxpemVTaGFyZWRHTE9iamVjdHMoKTsKKyAgICBpbnQg
Z2V0VGV4dHVyZUlkKExheWVyQ2hyb21pdW0qKTsKKyAgICBpbnQgYXNzaWduVGV4dHVyZUZvckxh
eWVyKExheWVyQ2hyb21pdW0qKTsKKworICAgIC8vIEdMIHNoYWRlciBwcm9ncmFtIG9iamVjdCBJ
RHMuCisgICAgdW5zaWduZWQgaW50IG1fbGF5ZXJQcm9ncmFtT2JqZWN0OworICAgIHVuc2lnbmVk
IGludCBtX2JvcmRlclByb2dyYW1PYmplY3Q7CisgICAgdW5zaWduZWQgaW50IG1fc2Nyb2xsUHJv
Z3JhbU9iamVjdDsKKworICAgIHVuc2lnbmVkIGludCBtX3Jvb3RMYXllclRleHR1cmVJZDsKKyAg
ICBpbnQgbV9yb290TGF5ZXJUZXh0dXJlV2lkdGg7CisgICAgaW50IG1fcm9vdExheWVyVGV4dHVy
ZUhlaWdodDsKKworICAgIC8vIFNoYWRlciB1bmlmb3JtIGFuZCBhdHRyaWJ1dGUgbG9jYXRpb25z
LgorICAgIGNvbnN0IGludCBtX3Bvc2l0aW9uTG9jYXRpb247CisgICAgY29uc3QgaW50IG1fdGV4
Q29vcmRMb2NhdGlvbjsKKyAgICBpbnQgbV9zYW1wbGVyTG9jYXRpb247CisgICAgaW50IG1fbWF0
cml4TG9jYXRpb247CisgICAgaW50IG1fYWxwaGFMb2NhdGlvbjsKKyAgICBpbnQgbV9zY3JvbGxN
YXRyaXhMb2NhdGlvbjsKKyAgICBpbnQgbV9zY3JvbGxTYW1wbGVyTG9jYXRpb247CisKKyAgICBp
bnQgbV9ib3JkZXJNYXRyaXhMb2NhdGlvbjsKKyAgICBpbnQgbV9ib3JkZXJDb2xvckxvY2F0aW9u
OworCisgICAgdW5zaWduZWQgaW50IG1fcXVhZFZib0lkc1szXTsKKyAgICBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCBtX3Byb2plY3Rpb25NYXRyaXg7CiAKICAgICBSZWZQdHI8TGF5ZXJDaHJvbWl1bT4g
bV9yb290TGF5ZXI7CiAKICAgICBib29sIG1fbmVlZHNEaXNwbGF5OwotICAgIFNrSVJlY3QgbV9z
Y3JvbGxGcmFtZTsKKyAgICBJbnRQb2ludCBtX3Njcm9sbFBvc2l0aW9uOworICAgIGJvb2wgbV9o
YXJkd2FyZUNvbXBvc2l0aW5nOworCisgICAgLy8gTWFwIGFzc29jaWF0aW5nIGxheWVycyB3aXRo
IHRleHR1cmVzIGlkcyB1c2VkIGJ5IHRoZSBHTCBjb21wb3NpdG9yLgorICAgIHN0ZDo6bWFwPExh
eWVyQ2hyb21pdW0qLCB1bnNpZ25lZCBpbnQ+IG1fdGV4dHVyZUlkTWFwOworCisgICAgT3duUHRy
PEdMRVMyQ29udGV4dD4gbV9nbGVzMkNvbnRleHQ7CisKKyAgICAvLyBUaGUgV2ViQ29yZSBQYWdl
IHRoYXQgdGhlIGNvbXBvc2l0b3IgcmVuZGVycyBpbnRvLgorICAgIFBhZ2UqIG1fcGFnZTsKIH07
CiAKIH0KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L2Nocm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTkzMzQpCisrKyBXZWJLaXQvY2hyb21p
dW0vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTAtMDUtMTIg
IFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFN3
aXRjaGluZyBvdmVyIHRvIHVzaW5nIGhhcmR3YXJlIGNvbXBvc2l0aW5nIGZvciBMYXllckNocm9t
aXVtIGxheWVycy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTM4NzgzCisKKyAgICAgICAgKiBzcmMvV2ViVmlld0ltcGwuY3BwOgorICAgICAgICAoV2Vi
S2l0OjpXZWJWaWV3SW1wbDo6cGFpbnQpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6
c2V0SXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0aXZlKToKKyAgICAgICAgKFdlYktpdDo6V2Vi
Vmlld0ltcGw6OnVwZGF0ZVJvb3RMYXllckNvbnRlbnRzKToKKyAgICAgICAgKFdlYktpdDo6V2Vi
Vmlld0ltcGw6OnNldFJvb3RMYXllck5lZWRzRGlzcGxheSk6CisKIDIwMTAtMDUtMTIgIEpvaG4g
QWJkLUVsLU1hbGVrICA8amFtQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBE
YXJpbiBGaXNoZXIuCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAkocmV2aXNp
b24gNTkxNzQpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtOTcwLDEyICs5NzAsMTkgQEAgdm9pZCBXZWJWaWV3SW1wbDo6cGFpbnQoV2Vi
Q2FudmFzKiBjYW52YQogICAgICAgICAvLyBEcmF3IHRoZSBjb250ZW50cyBvZiB0aGUgcm9vdCBs
YXllci4KICAgICAgICAgdXBkYXRlUm9vdExheWVyQ29udGVudHMocmVjdCk7CiAKLSAgICAgICAg
Ly8gQ29tcG9zaXRlIGV2ZXJ5dGhpbmcgaW50byB0aGUgY2FudmFzIHRoYXQncyBwYXNzZWQgdG8g
dXMuCi0jaWYgUExBVEZPUk0oU0tJQSkKLSAgICAgICAgbV9sYXllclJlbmRlcmVyLT5kcmF3TGF5
ZXJzSW5DYW52YXMoc3RhdGljX2Nhc3Q8c2tpYTo6UGxhdGZvcm1DYW52YXMqPihjYW52YXMpLCBJ
bnRSZWN0KHJlY3QpKTsKLSNlbGlmIFBMQVRGT1JNKENHKQotI2Vycm9yICJOZWVkIHRvIGltcGxl
bWVudCBDRyB2ZXJzaW9uIgotI2VuZGlmCisgICAgICAgIFdlYkZyYW1lSW1wbCogd2ViZnJhbWUg
PSBtYWluRnJhbWVJbXBsKCk7CisgICAgICAgIGlmICghd2ViZnJhbWUpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIEZyYW1lVmlldyogdmlldyA9IHdlYmZyYW1lLT5mcmFtZVZpZXcoKTsK
KyAgICAgICAgaWYgKCF2aWV3KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFRo
ZSB2aXNpYmxlUmVjdCBpbmNsdWRlcyBzY3JvbGxiYXJzIHdoZXJlYXMgdGhlIGNvbnRlbnRSZWN0
IGRvZXNuJ3QuCisgICAgICAgIEludFJlY3QgdmlzaWJsZVJlY3QgPSB2aWV3LT52aXNpYmxlQ29u
dGVudFJlY3QodHJ1ZSk7CisgICAgICAgIEludFJlY3QgY29udGVudFJlY3QgPSB2aWV3LT52aXNp
YmxlQ29udGVudFJlY3QoZmFsc2UpOworCisgICAgICAgIC8vIEFzayB0aGUgbGF5ZXIgY29tcG9z
aXRvciB0byByZWRyYXcgYWxsIHRoZSBsYXllcnMuCisgICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+
ZHJhd0xheWVycyhyZWN0LCB2aXNpYmxlUmVjdCwgY29udGVudFJlY3QsIEludFBvaW50KHZpZXct
PnNjcm9sbFgoKSwgdmlldy0+c2Nyb2xsWSgpKSk7CiAgICAgfQogI2VuZGlmCiB9CkBAIC0yMDcy
LDcgKzIwNzksNyBAQCB2b2lkIFdlYlZpZXdJbXBsOjpzZXRJc0FjY2VsZXJhdGVkQ29tcG9zCiAg
ICAgICAgIHJldHVybjsKIAogICAgIGlmIChhY3RpdmUpIHsKLSAgICAgICAgbV9sYXllclJlbmRl
cmVyID0gTGF5ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUoKTsKKyAgICAgICAgbV9sYXllclJl
bmRlcmVyID0gTGF5ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUocGFnZSgpKTsKICAgICAgICAg
aWYgKG1fbGF5ZXJSZW5kZXJlcikKICAgICAgICAgICAgIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0
aW5nQWN0aXZlID0gdHJ1ZTsKICAgICB9IGVsc2UgewpAQCAtMjA4Niw2ICsyMDkzLDEyIEBAIHZv
aWQgV2ViVmlld0ltcGw6OnVwZGF0ZVJvb3RMYXllckNvbnRlbnQKICAgICBpZiAoIWlzQWNjZWxl
cmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSgpKQogICAgICAgICByZXR1cm47CiAKKyAgICAvLyBGSVhN
RTogVGhlIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nIHBhdGggaW52YWxpZGF0ZXMgYSAxeDEgcmVj
dCBhdCAoMCwgMCkKKyAgICAvLyBpbiBvcmRlciB0byBnZXQgdGhlIHJlbmRlcmVyIHRvIGFzayB0
aGUgY29tcG9zaXRvciB0byByZWRyYXcuIFRoaXMgaXMgb25seQorICAgIC8vIHRlbXBvcmFyeSB1
bnRpbCB3ZSBnZXQgdGhlIGNvbXBvc2l0b3IgdG8gcmVuZGVyIGRpcmVjdGx5IGZyb20gaXRzIG93
biB0aHJlYWQuCisgICAgaWYgKCFyZWN0LnggJiYgIXJlY3QueSAmJiByZWN0LndpZHRoID09IDEg
JiYgcmVjdC5oZWlnaHQgPT0gMSkKKyAgICAgICAgcmV0dXJuOworCiAgICAgV2ViRnJhbWVJbXBs
KiB3ZWJmcmFtZSA9IG1haW5GcmFtZUltcGwoKTsKICAgICBpZiAoIXdlYmZyYW1lKQogICAgICAg
ICByZXR1cm47CkBAIC0yMDkzLDI0ICsyMTA2LDI3IEBAIHZvaWQgV2ViVmlld0ltcGw6OnVwZGF0
ZVJvb3RMYXllckNvbnRlbnQKICAgICBpZiAoIXZpZXcpCiAgICAgICAgIHJldHVybjsKIAotICAg
IFdlYlJlY3Qgdmlld1JlY3QgPSB2aWV3LT5mcmFtZVJlY3QoKTsKLSAgICBTa0lSZWN0IHNjcm9s
bEZyYW1lOwotICAgIHNjcm9sbEZyYW1lLnNldCh2aWV3LT5zY3JvbGxYKCksIHZpZXctPnNjcm9s
bFkoKSwgdmlldy0+bGF5b3V0V2lkdGgoKSArIHZpZXctPnNjcm9sbFgoKSwgdmlldy0+bGF5b3V0
SGVpZ2h0KCkgKyB2aWV3LT5zY3JvbGxZKCkpOwotICAgIG1fbGF5ZXJSZW5kZXJlci0+c2V0U2Ny
b2xsRnJhbWUoc2Nyb2xsRnJhbWUpOwogICAgIExheWVyQ2hyb21pdW0qIHJvb3RMYXllciA9IG1f
bGF5ZXJSZW5kZXJlci0+cm9vdExheWVyKCk7CiAgICAgaWYgKHJvb3RMYXllcikgewogICAgICAg
ICBJbnRSZWN0IHZpc2libGVSZWN0ID0gdmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KHRydWUpOwog
Ci0gICAgICAgIC8vIFNldCB0aGUgYmFja2luZyBzdG9yZSBzaXplIHVzZWQgYnkgdGhlIHJvb3Qg
bGF5ZXIgdG8gYmUgdGhlIHNpemUgb2YgdGhlIHZpc2libGUKLSAgICAgICAgLy8gYXJlYS4gTm90
ZSB0aGF0IHRoZSByb290IGxheWVyIGJvdW5kcyBjb3VsZCBiZSBsYXJnZXIgdGhhbiB0aGUgYmFj
a2luZyBzdG9yZSBzaXplLAotICAgICAgICAvLyBidXQgdGhlcmUncyBubyByZWFzb24gdG8gd2Fz
dGUgbWVtb3J5IGJ5IGFsbG9jYXRpbmcgYmFja2luZyBzdG9yZSBsYXJnZXIgdGhhbiB0aGUKLSAg
ICAgICAgLy8gdmlzaWJsZSBwb3J0aW9uLgotICAgICAgICByb290TGF5ZXItPnNldEJhY2tpbmdT
dG9yZVJlY3QoSW50U2l6ZSh2aXNpYmxlUmVjdC53aWR0aCgpLCB2aXNpYmxlUmVjdC5oZWlnaHQo
KSkpOworICAgICAgICAvLyBVcGRhdGUgdGhlIHJvb3QgbGF5ZXIncyBiYWNraW5nIHN0b3JlIHRv
IGJlIHRoZSBzaXplIG9mIHRoZSBkaXJ0eSByZWN0LgorICAgICAgICAvLyBVbmxpa2Ugb3RoZXIg
bGF5ZXJzIHRoZSByb290IGxheWVyIGRvZXNuJ3QgaGF2ZSBwZXJzaXN0ZW50IHN0b3JhZ2UgZm9y
IGl0cworICAgICAgICAvLyBjb250ZW50cyBpbiBzeXN0ZW0gbWVtb3J5LgorICAgICAgICByb290
TGF5ZXItPnNldEJhY2tpbmdTdG9yZVNpemUoSW50U2l6ZShyZWN0LndpZHRoLCByZWN0LmhlaWdo
dCkpOwogICAgICAgICBHcmFwaGljc0NvbnRleHQqIHJvb3RMYXllckNvbnRleHQgPSByb290TGF5
ZXItPmdyYXBoaWNzQ29udGV4dCgpOwotICAgICAgICByb290TGF5ZXJDb250ZXh0LT5zYXZlKCk7
CisgICAgICAgIHNraWE6OlBsYXRmb3JtQ2FudmFzKiBwbGF0Zm9ybUNhbnZhcyA9IHJvb3RMYXll
ci0+cGxhdGZvcm1DYW52YXMoKTsKKworICAgICAgICBwbGF0Zm9ybUNhbnZhcy0+c2F2ZSgpOwog
CisgICAgICAgIC8vIEJyaW5nIHRoZSBjYW52YXMgaW50byB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0g
b2YgdGhlIHBhaW50IHJlY3QuCisgICAgICAgIHBsYXRmb3JtQ2FudmFzLT50cmFuc2xhdGUoc3Rh
dGljX2Nhc3Q8U2tTY2FsYXI+KC1yZWN0LngpLCBzdGF0aWNfY2FzdDxTa1NjYWxhcj4oLXJlY3Qu
eSkpOworCisgICAgICAgIHJvb3RMYXllckNvbnRleHQtPnNhdmUoKTsKICAgICAgICAgd2ViZnJh
bWUtPnBhaW50V2l0aENvbnRleHQoKihyb290TGF5ZXItPmdyYXBoaWNzQ29udGV4dCgpKSwgcmVj
dCk7CiAgICAgICAgIHJvb3RMYXllckNvbnRleHQtPnJlc3RvcmUoKTsKKworICAgICAgICBwbGF0
Zm9ybUNhbnZhcy0+cmVzdG9yZSgpOwogICAgIH0KIH0KIApAQCAtMjExOSw4ICsyMTM1LDEwIEBA
IHZvaWQgV2ViVmlld0ltcGw6OnNldFJvb3RMYXllck5lZWRzRGlzcGwKICAgICAvLyBGSVhNRTog
Rm9yIG5vdyB3ZSdyZSBwb3N0aW5nIGEgcmVwYWludCBldmVudCBmb3IgdGhlIGVudGlyZSBwYWdl
IHdoaWNoIGlzIGFuIG92ZXJraWxsLgogICAgIGlmIChXZWJGcmFtZUltcGwqIHdlYmZyYW1lID0g
bWFpbkZyYW1lSW1wbCgpKSB7CiAgICAgICAgIGlmIChGcmFtZVZpZXcqIHZpZXcgPSB3ZWJmcmFt
ZS0+ZnJhbWVWaWV3KCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBUZW1wb3JhcnkgaGFjayB0
byBpbnZhbGlkYXRlIHBhcnQgb2YgdGhlIHBhZ2Ugc28gdGhhdCB3ZSBnZXQgY2FsbGVkIHRvIHJl
bmRlcgorICAgICAgICAgICAgLy8gICAgICAgIGFnYWluLgogICAgICAgICAgICAgSW50UmVjdCB2
aXNpYmxlUmVjdCA9IHZpZXctPnZpc2libGVDb250ZW50UmVjdCh0cnVlKTsKLSAgICAgICAgICAg
IG1fY2xpZW50LT5kaWRJbnZhbGlkYXRlUmVjdCh2aXNpYmxlUmVjdCk7CisgICAgICAgICAgICBt
X2NsaWVudC0+ZGlkSW52YWxpZGF0ZVJlY3QoSW50UmVjdCgwLCAwLCAxLCAxKSk7CiAgICAgICAg
IH0KICAgICB9CiAK
</data>
<flag name="review"
          id="40333"
          type_id="1"
          status="-"
          setter="dglazkov"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56297</attachid>
            <date>2010-05-17 17:49:34 -0700</date>
            <delta_ts>2010-05-18 11:10:04 -0700</delta_ts>
            <desc>Proposed patch - smaller this time</desc>
            <filename>glCompositor38783.txt</filename>
            <type>text/plain</type>
            <size>54685</size>
            <attacher name="Vangelis Kokkevis">vangelis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1OTYzMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTggQEAKKzIwMTAtMDUtMTcgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNA
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEltcGxlbWVudGluZyBoYXJkd2FyZSBhY2NlbGVyYXRlZCBjb21wb3NpdGluZyBvZiBs
YXllcnMgZm9yIENocm9taXVtLgorICAgICAgICBDb21wbGV0ZWx5IHJlbW92ZWQgdGhlIGV4aXN0
aW5nIHNvZnR3YXJlIGNvbXBvc2l0aW5nIHBhdGggdG8gcmVwbGFjZQorICAgICAgICBpdCB3aXRo
IGNvZGUgaW1wbGVtZW50ZWQgdXNpbmcgT3BlbkdMLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzg3ODMKKworICAgICAgICBUZXN0czogQ292ZXJlZCBi
eSBleGlzdGluZyBjb21wb3NpdGluZyB0ZXN0cy4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwL1dl
YkNvcmUuZ3lwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNz
TGF5ZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQ2hyb21p
dW06On5HcmFwaGljc0xheWVyQ2hyb21pdW0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckNocm9taXVtOjp1cGRhdGVMYXllckRyYXdzQ29udGVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0xheWVyQ2hyb21pdW06OnVwZGF0ZUNvbnRlbnRzUmVjdCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllckNocm9taXVtOjpMYXllckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyQ2hyb21pdW06On5MYXllckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
Q2hyb21pdW06OnVwZGF0ZUdyYXBoaWNzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpMYXll
ckNocm9taXVtOjpkcmF3c0NvbnRlbnRVcGRhdGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
Q2hyb21pdW06OnVwZGF0ZUNvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21p
dW06OnNldENvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnNldEJh
Y2tpbmdTdG9yZVNpemUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6c2V0Qm91
bmRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnNldE5lZWRzRGlzcGxheSk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6Y29udGVudHNEaXJ0eSk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllckNocm9taXVtOjpkcmF3c0NvbnRlbnQpOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tHTEVycm9yKToKKyAgICAgICAg
KFdlYkNvcmU6OmxvYWRTaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6bG9hZFNoYWRlclByb2dy
YW0pOgorICAgICAgICAoV2ViQ29yZTo6dG9HTE1hdHJpeCk6CisgICAgICAgIChXZWJDb3JlOjpv
cnRob01hdHJpeCk6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVMYXllclRleHR1cmUpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpMYXllclJlbmRlcmVyQ2hyb21pdW0pOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjp+TGF5ZXJSZW5kZXJlckNo
cm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6ZHJhd1Rl
eHR1cmVkUXVhZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmRy
YXdMYXllcnMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpnZXRU
ZXh0dXJlSWQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjphc3Np
Z25UZXh0dXJlRm9yTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9t
aXVtOjpmcmVlTGF5ZXJUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJD
aHJvbWl1bTo6ZHJhd0RlYnVnQm9yZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVy
ZXJDaHJvbWl1bTo6aXNMYXllclZpc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5k
ZXJlckNocm9taXVtOjpjb21wb3NpdGVMYXllcnNSZWN1cnNpdmUpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjptYWtlQ29udGV4dEN1cnJlbnQpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjppbml0R0wpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpiaW5kQ29tbW9uQXR0cmliTG9jYXRpb24pOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjppbml0aWFsaXplU2hhcmVkR0xP
YmplY3RzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRl
cmVyQ2hyb21pdW0uaDoKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6
KToKKwogMjAxMC0wNS0xNCAgRGFyaW4gQWRsZXIgIDxkYXJpbkBhcHBsZS5jb20+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgQnJhZHkgRWlkc29uLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLmd5cC9X
ZWJDb3JlLmd5cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lw
CShyZXZpc2lvbiA1OTYxMikKKysrIFdlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAJKHdv
cmtpbmcgY29weSkKQEAgLTcyMyw2ICs3MjMsNyBAQAogICAgICAgJ2luY2x1ZGVfZGlycyc6IFsK
ICAgICAgICAgJzwoSU5URVJNRURJQVRFX0RJUiknLAogICAgICAgICAnPEAod2ViY29yZV9pbmNs
dWRlX2RpcnMpJywKKyAgICAgICAgJzwoY2hyb21pdW1fc3JjX2RpcikvZ3B1JwogICAgICAgXSwK
ICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnPEAod2ViY29yZV9maWxlcyknLApJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3Jh
cGhpY3NMYXllckNocm9taXVtLmNwcAkocmV2aXNpb24gNTk2MTIpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTEwMSwxMiArMTAxLDYgQEAgR3JhcGhpY3NMYXllckNocm9taXVtOjpHcmFwaGlj
c0xheWVyQ2hybwogCiBHcmFwaGljc0xheWVyQ2hyb21pdW06On5HcmFwaGljc0xheWVyQ2hyb21p
dW0oKQogewotICAgIC8vIENsZWFuIHVwIHRoZSBTa2lhIGxheWVyLgotICAgIGlmIChtX2xheWVy
KQotICAgICAgICBtX2xheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOwotCi0gICAgaWYgKG1f
dHJhbnNmb3JtTGF5ZXIpCi0gICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnJlbW92ZUZyb21TdXBl
cmxheWVyKCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjpzZXROYW1lKGNvbnN0
IFN0cmluZyYgaW5OYW1lKQpAQCAtNDg1LDYgKzQ3OSwxMSBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJD
aHJvbWl1bTo6dXBkYXRlTGF5ZXJQCiAKIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjp1cGRh
dGVMYXllckRyYXdzQ29udGVudCgpCiB7CisgICAgLy8gU2luY2Ugb25seSBsYXllcnMgdGhhdCBk
cmF3IGNvbnRlbnQgaGF2ZSBhIHZhbGlkIGNvbnRleHQKKyAgICAvLyB3ZSBuZWVkIHRvIGNhbGwg
dXBkYXRlR3JhcGhpY3NDb250ZXh0KCkgaGVyZSB0byBtYWtlIHN1cmUgb25lCisgICAgLy8gZ2V0
cyBjcmVhdGVkLgorICAgIG1fbGF5ZXItPmRyYXdzQ29udGVudFVwZGF0ZWQoKTsKKwogICAgIGlm
IChtX2RyYXdzQ29udGVudCkKICAgICAgICAgbV9sYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CiAK
QEAgLTUzMyw3ICs1MzIsOCBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6dXBkYXRlQ29u
dGVuCiAgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1f
Y29udGVudHNMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludChtX2NvbnRlbnRzUmVjdC54KCks
IG1fY29udGVudHNSZWN0LnkoKSkpOworICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGV5IGxheWVy
IGlzIHRoZSBjZW50ZXIgb2YgcXVhZC4KKyAgICBtX2NvbnRlbnRzTGF5ZXItPnNldFBvc2l0aW9u
KEZsb2F0UG9pbnQobV9jb250ZW50c1JlY3QueCgpICsgbV9jb250ZW50c1JlY3Qud2lkdGgoKSAv
IDIsIG1fY29udGVudHNSZWN0LnkoKSArIG1fY29udGVudHNSZWN0LmhlaWdodCgpIC8gMikpOwog
ICAgIG1fY29udGVudHNMYXllci0+c2V0Qm91bmRzKEludFNpemUobV9jb250ZW50c1JlY3Qud2lk
dGgoKSwgbV9jb250ZW50c1JlY3QuaGVpZ2h0KCkpKTsKIH0KIApJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uY3BwCShyZXZp
c2lvbiA1OTYxMikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJD
aHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU1LDkgKzU1LDEwIEBAIExheWVyQ2hyb21p
dW06OkxheWVyQ2hyb21pdW0oTGF5ZXJUeXBlIHQKICAgICAsIG1fYm9yZGVyV2lkdGgoMCkKICAg
ICAsIG1fYm9yZGVyQ29sb3IoMCwgMCwgMCwgMCkKICAgICAsIG1fYmFja2dyb3VuZENvbG9yKDAs
IDAsIDAsIDApCisgICAgLCBtX2FuY2hvclBvaW50KDAuNSwgMC41KQogICAgICwgbV9hbmNob3JQ
b2ludFooMCkKICAgICAsIG1fY2xlYXJzQ29udGV4dChmYWxzZSkKLSAgICAsIG1fZG91YmxlU2lk
ZWQoZmFsc2UpCisgICAgLCBtX2RvdWJsZVNpZGVkKHRydWUpCiAgICAgLCBtX2VkZ2VBbnRpYWxp
YXNpbmdNYXNrKDApCiAgICAgLCBtX2hpZGRlbihmYWxzZSkKICAgICAsIG1fbWFza3NUb0JvdW5k
cyhmYWxzZSkKQEAgLTY5LDkgKzcwLDEwIEBAIExheWVyQ2hyb21pdW06OkxheWVyQ2hyb21pdW0o
TGF5ZXJUeXBlIHQKICAgICAsIG1fc2tpYUNvbnRleHQoMCkKICAgICAsIG1fZ3JhcGhpY3NDb250
ZXh0KDApCiAgICAgLCBtX2dlb21ldHJ5RmxpcHBlZChmYWxzZSkKKyAgICAsIG1fY29udGVudHNE
aXJ0eShmYWxzZSkKICAgICAsIG1fY29udGVudHMoMCkKKyAgICAsIG1faGFzQ29udGV4dChmYWxz
ZSkKIHsKLSAgICB1cGRhdGVHcmFwaGljc0NvbnRleHQobV9iYWNraW5nU3RvcmVSZWN0KTsKIH0K
IAogTGF5ZXJDaHJvbWl1bTo6fkxheWVyQ2hyb21pdW0oKQpAQCAtNzksMTQgKzgxLDMwIEBAIExh
eWVyQ2hyb21pdW06On5MYXllckNocm9taXVtKCkKICAgICAvLyBPdXIgc3VwZXJsYXllciBzaG91
bGQgYmUgaG9sZGluZyBhIHJlZmVyZW5jZSB0byB1cyBzbyB0aGVyZSBzaG91bGQgYmUgbm8KICAg
ICAvLyB3YXkgZm9yIHVzIHRvIGJlIGRlc3Ryb3llZCB3aGlsZSB3ZSBzdGlsbCBoYXZlIGEgc3Vw
ZXJsYXllci4KICAgICBBU1NFUlQoIXN1cGVybGF5ZXIoKSk7CisKKyAgICAvLyBSZW1vdmUgdGhl
IHN1cGVybGF5ZXIgcmVmZXJlbmNlIGZyb20gYWxsIHN1YmxheWVycy4KKyAgICByZW1vdmVBbGxT
dWJsYXllcnMoKTsKIH0KIAotdm9pZCBMYXllckNocm9taXVtOjp1cGRhdGVHcmFwaGljc0NvbnRl
eHQoY29uc3QgSW50U2l6ZSYgc2l6ZSkKK3ZvaWQgTGF5ZXJDaHJvbWl1bTo6dXBkYXRlR3JhcGhp
Y3NDb250ZXh0KCkKIHsKKyAgICAvLyBJZiB0aGUgbGF5ZXIgZG9lc24ndCBkcmF3IGFueXRoaW5n
IChlLmcuIGl0J3MgYSBjb250YWluZXIgbGF5ZXIpIHRoZW4gd2UKKyAgICAvLyBkb24ndCBjcmVh
dGUgYSBjYW52YXMgLyBjb250ZXh0IGZvciBpdC4gVGhlIHJvb3QgbGF5ZXIgaXMgYSBzcGVjaWFs
CisgICAgLy8gY2FzZSBhcyBldmVuIGlmIGl0J3MgbWFya2VkIGFzIGEgY29udGFpbmVyIGxheWVy
IGl0IGRvZXMgYWN0dWFsbHkgaGF2ZQorICAgIC8vIGNvbnRlbnQgdGhhdCBpdCBkcmF3cy4KKyAg
ICBSZW5kZXJMYXllckJhY2tpbmcqIGJhY2tpbmcgPSBzdGF0aWNfY2FzdDxSZW5kZXJMYXllckJh
Y2tpbmcqPihtX293bmVyLT5jbGllbnQoKSk7CisgICAgaWYgKCFkcmF3c0NvbnRlbnQoKSAmJiAh
KHRoaXMgPT0gcm9vdExheWVyKCkpKSB7CisgICAgICAgIG1fZ3JhcGhpY3NDb250ZXh0LmNsZWFy
KCk7CisgICAgICAgIG1fc2tpYUNvbnRleHQuY2xlYXIoKTsKKyAgICAgICAgbV9jYW52YXMuY2xl
YXIoKTsKKyAgICAgICAgbV9oYXNDb250ZXh0ID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKICNpZiBQTEFURk9STShTS0lBKQogICAgIC8vIENyZWF0ZSBuZXcgY2FudmFzIGFuZCBj
b250ZXh0LiBPd25QdHIgdGFrZXMgY2FyZSBvZiBmcmVlaW5nIHVwCiAgICAgLy8gdGhlIG9sZCBv
bmVzLgotICAgIG1fY2FudmFzID0gbmV3IHNraWE6OlBsYXRmb3JtQ2FudmFzKHNpemUud2lkdGgo
KSwgc2l6ZS5oZWlnaHQoKSwgZmFsc2UpOworICAgIG1fY2FudmFzID0gbmV3IHNraWE6OlBsYXRm
b3JtQ2FudmFzKG1fYmFja2luZ1N0b3JlU2l6ZS53aWR0aCgpLCBtX2JhY2tpbmdTdG9yZVNpemUu
aGVpZ2h0KCksIGZhbHNlKTsKICAgICBtX3NraWFDb250ZXh0ID0gbmV3IFBsYXRmb3JtQ29udGV4
dFNraWEobV9jYW52YXMuZ2V0KCkpOwogCiAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IHRl
eHQgdG8gc2hvdyB1cCBjb3JyZWN0bHkuIFdpdGhvdXQgaXQsCkBAIC05NSwzMSArMTEzLDMyIEBA
IHZvaWQgTGF5ZXJDaHJvbWl1bTo6dXBkYXRlR3JhcGhpY3NDb250ZXgKICAgICBtX3NraWFDb250
ZXh0LT5zZXREcmF3aW5nVG9JbWFnZUJ1ZmZlcih0cnVlKTsKIAogICAgIG1fZ3JhcGhpY3NDb250
ZXh0ID0gbmV3IEdyYXBoaWNzQ29udGV4dChyZWludGVycHJldF9jYXN0PFBsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0Kj4obV9za2lhQ29udGV4dC5nZXQoKSkpOworCisgICAgbV9oYXNDb250ZXh0ID0g
dHJ1ZTsKKyAgICBtX2NvbnRlbnRzRGlydHkgPSB0cnVlOwogI2Vsc2UKICNlcnJvciAiTmVlZCB0
byBpbXBsZW1lbnQgZm9yIHlvdXIgcGxhdGZvcm0uIgogI2VuZGlmCi0gICAgLy8gVGhlIGJhY2tp
bmcgc3RvcmUgYWxsb2NhdGVkIGZvciBhIGxheWVyIGNhbiBiZSBzbWFsbGVyIHRoYW4gdGhlIGxh
eWVyJ3MgYm91bmRzLgotICAgIC8vIFRoaXMgaXMgbW9zdGx5IHRydWUgZm9yIHRoZSByb290IGxh
eWVyIHdob3NlIGJhY2tpbmcgc3RvcmUgaXMgc2l6ZWQgYmFzZWQgb24gdGhlIHZpc2libGUKLSAg
ICAvLyBwb3J0aW9uIG9mIHRoZSBsYXllciByYXRoZXIgdGhhbiB0aGUgYWN0dWFsIHBhZ2Ugc2l6
ZS4KLSAgICBtX2JhY2tpbmdTdG9yZVJlY3QgPSBzaXplOworCisgICAgcmV0dXJuOworfQorCit2
b2lkIExheWVyQ2hyb21pdW06OmRyYXdzQ29udGVudFVwZGF0ZWQoKQoreworICAgIC8vIENyZWF0
ZSBhIGRyYXdpbmcgY29udGV4dCBpZiB0aGUgbGF5ZXIgbm93IGRyYXdzIGNvbnRlbnQKKyAgICAv
LyBvciBkZWxldGUgdGhlIGV4aXN0aW5nIGNvbnRleHQgaWYgdGhlIGxheWVyIGRvZXNuJ3QgZHJh
dworICAgIC8vIGNvbnRlbnQgYW55bW9yZS4KKyAgICB1cGRhdGVHcmFwaGljc0NvbnRleHQoKTsK
IH0KIAogdm9pZCBMYXllckNocm9taXVtOjp1cGRhdGVDb250ZW50cygpCiB7CiAgICAgUmVuZGVy
TGF5ZXJCYWNraW5nKiBiYWNraW5nID0gc3RhdGljX2Nhc3Q8UmVuZGVyTGF5ZXJCYWNraW5nKj4o
bV9vd25lci0+Y2xpZW50KCkpOwogCi0gICAgaWYgKGJhY2tpbmcgJiYgIWJhY2tpbmctPnBhaW50
aW5nR29lc1RvV2luZG93KCkpCisgICAgaWYgKGJhY2tpbmcgJiYgIWJhY2tpbmctPnBhaW50aW5n
R29lc1RvV2luZG93KCkgJiYgZHJhd3NDb250ZW50KCkpCiAgICAgICAgIG1fb3duZXItPnBhaW50
R3JhcGhpY3NMYXllckNvbnRlbnRzKCptX2dyYXBoaWNzQ29udGV4dCwgSW50UmVjdCgwLCAwLCBt
X2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5oZWlnaHQoKSkpOwotfQogCi12b2lkIExheWVyQ2hy
b21pdW06OmRyYXdEZWJ1Z0JvcmRlcigpCi17Ci0gICAgbV9ncmFwaGljc0NvbnRleHQtPnNldFN0
cm9rZUNvbG9yKG1fYm9yZGVyQ29sb3IsIERldmljZUNvbG9yU3BhY2UpOwotICAgIG1fZ3JhcGhp
Y3NDb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobV9ib3JkZXJXaWR0aCk7Ci0gICAgbV9ncmFw
aGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBvaW50KDAsIDApLCBJbnRQb2ludChtX2JvdW5kcy53
aWR0aCgpLCAwKSk7Ci0gICAgbV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBvaW50KDAs
IDApLCBJbnRQb2ludCgwLCBtX2JvdW5kcy5oZWlnaHQoKSkpOwotICAgIG1fZ3JhcGhpY3NDb250
ZXh0LT5kcmF3TGluZShJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCAwKSwgSW50UG9pbnQobV9i
b3VuZHMud2lkdGgoKSwgbV9ib3VuZHMuaGVpZ2h0KCkpKTsKLSAgICBtX2dyYXBoaWNzQ29udGV4
dC0+ZHJhd0xpbmUoSW50UG9pbnQoMCwgbV9ib3VuZHMuaGVpZ2h0KCkpLCBJbnRQb2ludChtX2Jv
dW5kcy53aWR0aCgpLCBtX2JvdW5kcy5oZWlnaHQoKSkpOworICAgIG1fY29udGVudHNEaXJ0eSA9
IGZhbHNlOwogfQogCiB2b2lkIExheWVyQ2hyb21pdW06OnNldENvbnRlbnRzKE5hdGl2ZUltYWdl
UHRyIGNvbnRlbnRzKQpAQCAtMTI4LDYgKzE0Nyw3IEBAIHZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0
Q29udGVudHMoTmF0aXZlSW0KICAgICBpZiAobV9jb250ZW50cyA9PSBjb250ZW50cykKICAgICAg
ICAgcmV0dXJuOwogICAgIG1fY29udGVudHMgPSBjb250ZW50czsKKyAgICBtX2NvbnRlbnRzRGly
dHkgPSB0cnVlOwogfQogCiB2b2lkIExheWVyQ2hyb21pdW06OnNldE5lZWRzQ29tbWl0KCkKQEAg
LTIwMSwyOCArMjIxLDI5IEBAIGludCBMYXllckNocm9taXVtOjppbmRleE9mU3VibGF5ZXIoY29u
c3QKICAgICByZXR1cm4gLTE7CiB9CiAKLXZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0QmFja2luZ1N0
b3JlUmVjdChjb25zdCBJbnRTaXplJiByZWN0KQorLy8gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxl
ZCB0byBvdmVyaWRlIHRoZSBzaXplIG9mIHRoZSBiYWNraW5nIHN0b3JlCisvLyB1c2VkIGZvciB0
aGUgbGF5ZXIuIEl0J3MgdHlwaWNhbGx5IGNhbGxlZCBvbiB0aGUgcm9vdCBsYXllciB0byBsaW1p
dAorLy8gaXRzIHNpemUgdG8gdGhlIGFjdHVhbCB2aXNpYmxlIHNpemUuCit2b2lkIExheWVyQ2hy
b21pdW06OnNldEJhY2tpbmdTdG9yZVNpemUoY29uc3QgSW50U2l6ZSYgc2l6ZSkKIHsKLSAgICBp
ZiAobV9iYWNraW5nU3RvcmVSZWN0ID09IHJlY3QpCisgICAgaWYgKG1fYmFja2luZ1N0b3JlU2l6
ZSA9PSBzaXplKQogICAgICAgICByZXR1cm47CiAKLSAgICB1cGRhdGVHcmFwaGljc0NvbnRleHQo
cmVjdCk7CisgICAgbV9iYWNraW5nU3RvcmVTaXplID0gc2l6ZTsKKyAgICB1cGRhdGVHcmFwaGlj
c0NvbnRleHQoKTsKKyAgICBzZXROZWVkc0NvbW1pdCgpOwogfQogCi12b2lkIExheWVyQ2hyb21p
dW06OnNldEJvdW5kcyhjb25zdCBJbnRTaXplJiByZWN0KQordm9pZCBMYXllckNocm9taXVtOjpz
ZXRCb3VuZHMoY29uc3QgSW50U2l6ZSYgc2l6ZSkKIHsKLSAgICBpZiAocmVjdCA9PSBtX2JvdW5k
cykKKyAgICBpZiAobV9ib3VuZHMgPT0gc2l6ZSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgbV9i
b3VuZHMgPSByZWN0OworICAgIG1fYm91bmRzID0gc2l6ZTsKKyAgICBtX2JhY2tpbmdTdG9yZVNp
emUgPSBzaXplOwogCiAgICAgLy8gUmUtY3JlYXRlIHRoZSBjYW52YXMgYW5kIGFzc29jaWF0ZWQg
Y29udGV4dHMuCi0gICAgdXBkYXRlR3JhcGhpY3NDb250ZXh0KG1fYm91bmRzKTsKLQotICAgIC8v
IExheWVyIGNvbnRlbnRzIG5lZWQgdG8gYmUgcmVkcmF3biBhcyB0aGUgYmFja2luZyBzdXJmYWNl
Ci0gICAgLy8gd2FzIHJlY3JlYXRlZCBhYm92ZS4KLSAgICB1cGRhdGVDb250ZW50cygpOwotCisg
ICAgdXBkYXRlR3JhcGhpY3NDb250ZXh0KCk7CiAgICAgc2V0TmVlZHNDb21taXQoKTsKIH0KIApA
QCAtMjcwLDggKzI5MSwxMSBAQCBMYXllckNocm9taXVtKiBMYXllckNocm9taXVtOjpzdXBlcmxh
eWVyCiAKIHZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0TmVlZHNEaXNwbGF5KGNvbnN0IEZsb2F0UmVj
dCYgZGlydHlSZWN0KQogewotICAgIC8vIFJlZHJhdyB0aGUgY29udGVudHMgb2YgdGhlIGxheWVy
LgotICAgIHVwZGF0ZUNvbnRlbnRzKCk7CisgICAgLy8gU2ltcGx5IG1hcmsgdGhlIGNvbnRlbnRz
IGFzIGRpcnR5LiBUaGUgYWN0dWFsIHJlZHJhdyB3aWxsCisgICAgLy8gaGFwcGVuIHdoZW4gaXQn
cyB0aW1lIHRvIGRvIHRoZSBjb21wb3NpdGluZy4KKyAgICAvLyBGSVhNRTogU2hvdWxkIG9ubHkg
dXBkYXRlIHRoZSBkaXJ0eSByZWN0IGluc3RlYWQgb2YgbWFya2luZworICAgIC8vICAgICAgICB0
aGUgZW50aXJlIGxheWVyIGRpcnR5LgorICAgIG1fY29udGVudHNEaXJ0eSA9IHRydWU7CiAKICAg
ICBzZXROZWVkc0NvbW1pdCgpOwogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9MYXllckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgJKHJldmlzaW9uIDU5NjEyKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTE1MSw2ICsxNTEsNyBAQCBwdWJsaWM6CiAgICAgYm9vbCBnZW9tZXRyeUZsaXBw
ZWQoKSBjb25zdCB7IHJldHVybiBtX2dlb21ldHJ5RmxpcHBlZDsgfQogCiAgICAgdm9pZCB1cGRh
dGVDb250ZW50cygpOworICAgIGJvb2wgY29udGVudHNEaXJ0eSgpIHsgcmV0dXJuIG1fY29udGVu
dHNEaXJ0eTsgfQogCiAgICAgdm9pZCBzZXRDb250ZW50cyhOYXRpdmVJbWFnZVB0ciBjb250ZW50
cyk7CiAgICAgTmF0aXZlSW1hZ2VQdHIgY29udGVudHMoKSBjb25zdCB7IHJldHVybiBtX2NvbnRl
bnRzOyB9CkBAIC0xNTgsOSArMTU5LDEzIEBAIHB1YmxpYzoKICAgICBza2lhOjpQbGF0Zm9ybUNh
bnZhcyogcGxhdGZvcm1DYW52YXMoKSB7IHJldHVybiBtX2NhbnZhcy5nZXQoKTsgfQogICAgIEdy
YXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0KCkgeyByZXR1cm4gbV9ncmFwaGljc0NvbnRl
eHQuZ2V0KCk7IH0KIAotICAgIHZvaWQgc2V0QmFja2luZ1N0b3JlUmVjdChjb25zdCBJbnRTaXpl
Jik7CisgICAgdm9pZCBzZXRCYWNraW5nU3RvcmVTaXplKGNvbnN0IEludFNpemUmKTsKIAotICAg
IHZvaWQgZHJhd0RlYnVnQm9yZGVyKCk7CisgICAgYm9vbCBkcmF3c0NvbnRlbnQoKSB7IHJldHVy
biBtX293bmVyICYmIG1fb3duZXItPmRyYXdzQ29udGVudCgpOyB9CisKKyAgICAvLyBUaGlzIG1l
dGhvZCBzaG91bGQgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIHN0YXR1cyBkcmF3c0NvbnRlbnQo
KQorICAgIC8vIHN0YXR1cyBjaGFuZ2VzIHRvIGVuc3VyZSB0aGF0IHRoZSBpbnRlcm5hbCBncmFw
aGljcyBjb250ZXh0IGlzIGluIHN5bmMuCisgICAgdm9pZCBkcmF3c0NvbnRlbnRVcGRhdGVkKCk7
CiAKIHByaXZhdGU6CiAgICAgTGF5ZXJDaHJvbWl1bShMYXllclR5cGUsIEdyYXBoaWNzTGF5ZXJD
aHJvbWl1bSogb3duZXIpOwpAQCAtMTg0LDcgKzE4OSw4IEBAIHByaXZhdGU6CiAKICAgICAvLyBS
ZS1jcmVhdGVzIHRoZSBjYW52YXMgYW5kIGdyYXBoaWNzIGNvbnRleHQuIFRoaXMgbWV0aG9kCiAg
ICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUgbGF5ZXIgaXMgcmVzaXplZC4gT25s
eSBsYXllcnMKLSAgICB2b2lkIHVwZGF0ZUdyYXBoaWNzQ29udGV4dChjb25zdCBJbnRTaXplJik7
CisgICAgLy8gdGhhdCBkbyBkcmF3aW5nIGFuZCB0aGUgcm9vdCBsYXllciBnZXQgYSBjb250ZXh0
LgorICAgIHZvaWQgdXBkYXRlR3JhcGhpY3NDb250ZXh0KCk7CiAKICAgICBWZWN0b3I8UmVmUHRy
PExheWVyQ2hyb21pdW0+ID4gbV9zdWJsYXllcnM7CiAgICAgTGF5ZXJDaHJvbWl1bSogbV9zdXBl
cmxheWVyOwpAQCAtMTk1LDExICsyMDEsMTIgQEAgcHJpdmF0ZToKICAgICBPd25QdHI8UGxhdGZv
cm1Db250ZXh0U2tpYT4gbV9za2lhQ29udGV4dDsKICAgICBPd25QdHI8R3JhcGhpY3NDb250ZXh0
PiBtX2dyYXBoaWNzQ29udGV4dDsKICNlbmRpZgorICAgIGJvb2wgbV9oYXNDb250ZXh0OwogCiAg
ICAgTGF5ZXJUeXBlIG1fbGF5ZXJUeXBlOwogCiAgICAgSW50U2l6ZSBtX2JvdW5kczsKLSAgICBJ
bnRTaXplIG1fYmFja2luZ1N0b3JlUmVjdDsKKyAgICBJbnRTaXplIG1fYmFja2luZ1N0b3JlU2l6
ZTsKICAgICBGbG9hdFBvaW50IG1fcG9zaXRpb247CiAgICAgRmxvYXRQb2ludCBtX2FuY2hvclBv
aW50OwogICAgIENvbG9yIG1fYmFja2dyb3VuZENvbG9yOwpAQCAtMjIzLDYgKzIzMCw4IEBAIHBy
aXZhdGU6CiAgICAgYm9vbCBtX2dlb21ldHJ5RmxpcHBlZDsKICAgICBib29sIG1fbmVlZHNEaXNw
bGF5T25Cb3VuZHNDaGFuZ2U7CiAKKyAgICBib29sIG1fY29udGVudHNEaXJ0eTsKKwogICAgIENv
bnRlbnRzR3Jhdml0eVR5cGUgbV9jb250ZW50c0dyYXZpdHk7CiAgICAgTmF0aXZlSW1hZ2VQdHIg
bV9jb250ZW50czsKICAgICBTdHJpbmcgbV9uYW1lOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVt
LmNwcAkocmV2aXNpb24gNTk2MTIpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDEwNSAr
MzQsNjg0IEBACiAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQogI2luY2x1ZGUgIkxh
eWVyUmVuZGVyZXJDaHJvbWl1bS5oIgogCisjaW5jbHVkZSAiR0xFUzJDb250ZXh0LmgiCiAjaW5j
bHVkZSAiTGF5ZXJDaHJvbWl1bS5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5j
bHVkZSAiUGFnZS5oIgorI2lmIFBMQVRGT1JNKFNLSUEpCisjaW5jbHVkZSAiTmF0aXZlSW1hZ2VT
a2lhLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5oIgotI2luY2x1ZGUgInNraWEv
ZXh0L3BsYXRmb3JtX2NhbnZhcy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4K
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1QYXNzT3duUHRyPExheWVyUmVuZGVyZXJDaHJvbWl1
bT4gTGF5ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUoKQorc3RhdGljIFdURkxvZ0NoYW5uZWwg
TG9nTGF5ZXJSZW5kZXJlciA9IHsgMHgwMDAwMDAwMCwgIkxheWVyUmVuZGVyZXIiLCBXVEZMb2dD
aGFubmVsT24gfTsKKworc3RhdGljIHZvaWQgY2hlY2tHTEVycm9yKCkKK3sKKyNpZm5kZWYgTkRF
QlVHCisgICAgR0xlbnVtIGVycm9yID0gZ2xHZXRFcnJvcigpOworICAgIGlmIChlcnJvcikKKyAg
ICAgICAgTE9HX0VSUk9SKCJHTCBFcnJvcjogJWQgIiAsIGVycm9yKTsKKyNlbmRpZgorfQorCitz
dGF0aWMgR0x1aW50IGxvYWRTaGFkZXIoR0xlbnVtIHR5cGUsIGNvbnN0IGNoYXIqIHNoYWRlclNv
dXJjZSkKK3sKKyAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIodHlwZSk7CisgICAg
aWYgKCFzaGFkZXIpCisgICAgICAgIHJldHVybiAwOworICAgIGdsU2hhZGVyU291cmNlKHNoYWRl
ciwgMSwgJnNoYWRlclNvdXJjZSwgMCk7CisgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7Cisg
ICAgR0xpbnQgY29tcGlsZWQ7CisgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVf
U1RBVFVTLCAmY29tcGlsZWQpOworICAgIGlmICghY29tcGlsZWQpIHsKKyAgICAgICAgZ2xEZWxl
dGVTaGFkZXIoc2hhZGVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBz
aGFkZXI7Cit9CisKK3N0YXRpYyBHTHVpbnQgbG9hZFNoYWRlclByb2dyYW0oY29uc3QgY2hhciog
dmVydGV4U2hhZGVyU291cmNlLCBjb25zdCBjaGFyKiBmcmFnbWVudFNoYWRlclNvdXJjZSkKK3sK
KyAgICBHTHVpbnQgdmVydGV4U2hhZGVyOworICAgIEdMdWludCBmcmFnbWVudFNoYWRlcjsKKyAg
ICBHTHVpbnQgcHJvZ3JhbU9iamVjdDsKKyAgICBHTGludCBsaW5rZWQ7CisgICAgdmVydGV4U2hh
ZGVyID0gbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCB2ZXJ0ZXhTaGFkZXJTb3VyY2UpOwor
ICAgIGlmICghdmVydGV4U2hhZGVyKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmcmFnbWVudFNo
YWRlciA9IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNoYWRlclNvdXJj
ZSk7CisgICAgaWYgKCFmcmFnbWVudFNoYWRlcikgeworICAgICAgICBnbERlbGV0ZVNoYWRlcih2
ZXJ0ZXhTaGFkZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcHJvZ3JhbU9iamVj
dCA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIGlmICghcHJvZ3JhbU9iamVjdCkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbU9iamVjdCwgdmVydGV4U2hhZGVy
KTsKKyAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtT2JqZWN0LCBmcmFnbWVudFNoYWRlcik7Cisg
ICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtT2JqZWN0KTsKKyAgICBnbEdldFByb2dyYW1pdihwcm9n
cmFtT2JqZWN0LCBHTF9MSU5LX1NUQVRVUywgJmxpbmtlZCk7CisgICAgaWYgKCFsaW5rZWQpIHsK
KyAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW1PYmplY3QpOworICAgICAgICByZXR1cm4g
MDsKKyAgICB9CisgICAgZ2xEZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKKyAgICBnbERlbGV0
ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CisgICAgcmV0dXJuIHByb2dyYW1PYmplY3Q7Cit9CisK
K3N0YXRpYyB2b2lkIHRvR0xNYXRyaXgoZmxvYXQqIGZsYXR0ZW5lZCwgY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIG0pCit7CisgICAgZmxhdHRlbmVkWzBdID0gbS5tMTEoKTsKKyAgICBmbGF0
dGVuZWRbMV0gPSBtLm0xMigpOworICAgIGZsYXR0ZW5lZFsyXSA9IG0ubTEzKCk7CisgICAgZmxh
dHRlbmVkWzNdID0gbS5tMTQoKTsKKyAgICBmbGF0dGVuZWRbNF0gPSBtLm0yMSgpOworICAgIGZs
YXR0ZW5lZFs1XSA9IG0ubTIyKCk7CisgICAgZmxhdHRlbmVkWzZdID0gbS5tMjMoKTsKKyAgICBm
bGF0dGVuZWRbN10gPSBtLm0yNCgpOworICAgIGZsYXR0ZW5lZFs4XSA9IG0ubTMxKCk7CisgICAg
ZmxhdHRlbmVkWzldID0gbS5tMzIoKTsKKyAgICBmbGF0dGVuZWRbMTBdID0gbS5tMzMoKTsKKyAg
ICBmbGF0dGVuZWRbMTFdID0gbS5tMzQoKTsKKyAgICBmbGF0dGVuZWRbMTJdID0gbS5tNDEoKTsK
KyAgICBmbGF0dGVuZWRbMTNdID0gbS5tNDIoKTsKKyAgICBmbGF0dGVuZWRbMTRdID0gbS5tNDMo
KTsKKyAgICBmbGF0dGVuZWRbMTVdID0gbS5tNDQoKTsKK30KKworc3RhdGljIFRyYW5zZm9ybWF0
aW9uTWF0cml4IG9ydGhvTWF0cml4KGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0
b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhclosIGZsb2F0IGZhclopCit7CisgICAgZmxvYXQgZGVs
dGFYID0gcmlnaHQgLSBsZWZ0OworICAgIGZsb2F0IGRlbHRhWSA9IHRvcCAtIGJvdHRvbTsKKyAg
ICBmbG9hdCBkZWx0YVogPSBmYXJaIC0gbmVhclo7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgg
b3J0aG87CisgICAgaWYgKCFkZWx0YVggfHwgIWRlbHRhWSB8fCAhZGVsdGFaKQorICAgICAgICBy
ZXR1cm4gb3J0aG87CisgICAgb3J0aG8uc2V0TTExKDIuMGYgLyBkZWx0YVgpOworICAgIG9ydGhv
LnNldE00MSgtKHJpZ2h0ICsgbGVmdCkgLyBkZWx0YVgpOworICAgIG9ydGhvLnNldE0yMigyLjBm
IC8gZGVsdGFZKTsKKyAgICBvcnRoby5zZXRNNDIoLSh0b3AgKyBib3R0b20pIC8gZGVsdGFZKTsK
KyAgICBvcnRoby5zZXRNMzMoLTIuMGYgLyBkZWx0YVopOworICAgIG9ydGhvLnNldE00MygtKG5l
YXJaICsgZmFyWikgLyBkZWx0YVopOworICAgIHJldHVybiBvcnRobzsKK30KKworLy8gQ3JlYXRl
cyBhIEdMIHRleHR1cmUgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIHRyYW5zZmVyaW5nIHRoZSBsYXll
cidzIGJpdG1hcCBpbnRvLgorc3RhdGljIEdMdWludCBjcmVhdGVMYXllclRleHR1cmUoKQogewot
ICAgIHJldHVybiBuZXcgTGF5ZXJSZW5kZXJlckNocm9taXVtKCk7CisgICAgR0x1aW50IHRleHR1
cmVJZCA9IDA7CisgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZUlkKTsKKyAgICBnbEJpbmRU
ZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmVJZCk7CisgICAgLy8gRG8gYmFzaWMgbGluZWFy
IGZpbHRlcmluZyBvbiByZXNpemUuCisgICAgZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQs
IEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmYo
R0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIC8v
IE5QT1QgdGV4dHVyZXMgaW4gR0wgRVMgb25seSB3b3JrIHdoZW4gdGhlIHdyYXAgbW9kZSBpcyBz
ZXQgdG8gR0xfQ0xBTVBfVE9fRURHRS4KKyAgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8y
RCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1l
dGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7
CisgICAgcmV0dXJuIHRleHR1cmVJZDsKIH0KIAotTGF5ZXJSZW5kZXJlckNocm9taXVtOjpMYXll
clJlbmRlcmVyQ2hyb21pdW0oKQorCitQYXNzT3duUHRyPExheWVyUmVuZGVyZXJDaHJvbWl1bT4g
TGF5ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUoUGFnZSogcGFnZSkKK3sKKyAgICByZXR1cm4g
bmV3IExheWVyUmVuZGVyZXJDaHJvbWl1bShwYWdlKTsKK30KKworTGF5ZXJSZW5kZXJlckNocm9t
aXVtOjpMYXllclJlbmRlcmVyQ2hyb21pdW0oUGFnZSogcGFnZSkKICAgICA6IG1fcm9vdExheWVy
KDApCiAgICAgLCBtX25lZWRzRGlzcGxheShmYWxzZSkKKyAgICAsIG1fbGF5ZXJQcm9ncmFtT2Jq
ZWN0KDApCisgICAgLCBtX2JvcmRlclByb2dyYW1PYmplY3QoMCkKKyAgICAsIG1fc2Nyb2xsUHJv
Z3JhbU9iamVjdCgwKQorICAgICwgbV9wb3NpdGlvbkxvY2F0aW9uKDApCisgICAgLCBtX3RleENv
b3JkTG9jYXRpb24oMSkKKyAgICAsIG1fcGFnZShwYWdlKQorICAgICwgbV9yb290TGF5ZXJUZXh0
dXJlV2lkdGgoMCkKKyAgICAsIG1fcm9vdExheWVyVGV4dHVyZUhlaWdodCgwKQogeworICAgIG1f
cXVhZFZib0lkc1tWZXJ0aWNlc10gPSBtX3F1YWRWYm9JZHNbTGF5ZXJFbGVtZW50c10gPSAwOwor
ICAgIG1faGFyZHdhcmVDb21wb3NpdGluZyA9IChpbml0R0woKSAmJiBpbml0aWFsaXplU2hhcmVk
R0xPYmplY3RzKCkpOwogfQogCiBMYXllclJlbmRlcmVyQ2hyb21pdW06On5MYXllclJlbmRlcmVy
Q2hyb21pdW0oKQogeworICAgIGlmIChtX2hhcmR3YXJlQ29tcG9zaXRpbmcpIHsKKyAgICAgICAg
bWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgICAgIGdsRGVsZXRlQnVmZmVycygzLCBtX3F1YWRW
Ym9JZHMpOworICAgICAgICBnbERlbGV0ZVByb2dyYW0obV9sYXllclByb2dyYW1PYmplY3QpOwor
ICAgICAgICBnbERlbGV0ZVByb2dyYW0obV9zY3JvbGxQcm9ncmFtT2JqZWN0KTsKKyAgICAgICAg
Z2xEZWxldGVQcm9ncmFtKG1fYm9yZGVyUHJvZ3JhbU9iamVjdCk7CisgICAgfQogfQogCi12b2lk
IExheWVyUmVuZGVyZXJDaHJvbWl1bTo6dXBkYXRlTGF5ZXJDb250ZW50cygpCit2b2lkIExheWVy
UmVuZGVyZXJDaHJvbWl1bTo6ZHJhd1RleHR1cmVkUXVhZChjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgbWF0cml4LCBmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBvcGFjaXR5LCBi
b29sIHNjcm9sbGluZykKIHsKLSAgICBpZiAobV9yb290TGF5ZXIpCi0gICAgICAgIHVwZGF0ZUxh
eWVyQ29udGVudHNSZWN1cnNpdmUobV9yb290TGF5ZXIuZ2V0KCkpOworICAgIHN0YXRpYyBHTGZs
b2F0IGdsTWF0cml4WzE2XTsKKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlbmRlck1hdHJp
eCA9IG1hdHJpeDsKKworICAgIC8vIEFwcGx5IGEgc2NhbGluZyBmYWN0b3IgdG8gc2l6ZSB0aGUg
cXVhZCBmcm9tIDF4MSB0byBpdHMgaW50ZW5kZWQgc2l6ZS4KKyAgICByZW5kZXJNYXRyaXguc2Nh
bGUzZCh3aWR0aCwgaGVpZ2h0LCAxKTsKKworICAgIC8vIEFwcGx5IHRoZSBwcm9qZWN0aW9uIG1h
dHJpeCBiZWZvcmUgc2VuZGluZyB0aGUgdHJhbnNmb3JtIG92ZXIgdG8gdGhlIHNoYWRlci4KKyAg
ICByZW5kZXJNYXRyaXgubXVsdGlwbHkobV9wcm9qZWN0aW9uTWF0cml4KTsKKworICAgIHRvR0xN
YXRyaXgoJmdsTWF0cml4WzBdLCByZW5kZXJNYXRyaXgpOworCisgICAgaW50IG1hdHJpeExvY2F0
aW9uID0gKHNjcm9sbGluZyA/IG1fc2Nyb2xsTWF0cml4TG9jYXRpb24gOiBtX21hdHJpeExvY2F0
aW9uKTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobWF0cml4TG9jYXRpb24sIDEsIGZhbHNlLCAm
Z2xNYXRyaXhbMF0pOworCisgICAgaWYgKCFzY3JvbGxpbmcpCisgICAgICAgIGdsVW5pZm9ybTFm
KG1fYWxwaGFMb2NhdGlvbiwgb3BhY2l0eSk7CisKKyAgICBnbERyYXdFbGVtZW50cyhHTF9UUklB
TkdMRVMsIDYsIEdMX1VOU0lHTkVEX1NIT1JULCAwKTsKIH0KIAotI2lmIFBMQVRGT1JNKFNLSUEp
Ci12b2lkIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6ZHJhd0xheWVyc0luQ2FudmFzKHNraWE6OlBs
YXRmb3JtQ2FudmFzKiBjYW52YXMsIGNvbnN0IEludFJlY3QmIGNsaXBSZWN0KQorCisvLyBVcGRh
dGVzIHRoZSBjb250ZW50cyBvZiB0aGUgcm9vdCBsYXllciB0ZXh0dXJlIHRoYXQgZmFsbCBpbnNp
ZGUgdGhlIHVwZGF0ZVJlY3QKKy8vIGFuZCByZS1jb21wb3NpdHMgYWxsIHN1YmxheWVycy4KK3Zv
aWQgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3TGF5ZXJzKGNvbnN0IEludFJlY3QmIHVwZGF0
ZVJlY3QsIGNvbnN0IEludFJlY3QmIHZpc2libGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QsIGNvbnN0IEludFBv
aW50JiBzY3JvbGxQb3NpdGlvbikKIHsKKyAgICBBU1NFUlQobV9oYXJkd2FyZUNvbXBvc2l0aW5n
KTsKKwogICAgIGlmICghbV9yb290TGF5ZXIpCiAgICAgICAgIHJldHVybjsKIAotICAgIGNhbnZh
cy0+c2F2ZSgpOwotICAgIGNhbnZhcy0+Y2xpcFJlY3QoU2tSZWN0KGNsaXBSZWN0KSk7Ci0KLSAg
ICAvLyBGaXJzdCBjb21wb3NpdGUgdGhlIHJvb3QgbGF5ZXIgaW50byB0aGUgY2FudmFzLgotICAg
IGNhbnZhcy0+ZHJhd0JpdG1hcChtX3Jvb3RMYXllci0+cGxhdGZvcm1DYW52YXMoKS0+Z2V0RGV2
aWNlKCktPmFjY2Vzc0JpdG1hcChmYWxzZSksIDAsIDAsIDApOworICAgIC8vIElmIHRoZSBzaXpl
IG9mIHRoZSB2aXNpYmxlIGFyZWEgaGFzIGNoYW5nZWQgdGhlbiBhbGxvY2F0ZSBhIG5ldyB0ZXh0
dXJlCisgICAgLy8gdG8gc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSByb290IGxheWVyIGFuZCBh
ZGp1c3QgdGhlIHByb2plY3Rpb24gbWF0cml4CisgICAgLy8gYW5kIHZpZXdwb3J0LgorICAgIG1h
a2VDb250ZXh0Q3VycmVudCgpOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBt
X3Jvb3RMYXllclRleHR1cmVJZCk7CisKKyAgICB1bnNpZ25lZCBpbnQgdmlzaWJsZVJlY3RXaWR0
aCA9IHZpc2libGVSZWN0LndpZHRoKCk7CisgICAgdW5zaWduZWQgaW50IHZpc2libGVSZWN0SGVp
Z2h0ID0gdmlzaWJsZVJlY3QuaGVpZ2h0KCk7CisgICAgaWYgKHZpc2libGVSZWN0V2lkdGggIT0g
bV9yb290TGF5ZXJUZXh0dXJlV2lkdGggfHwgdmlzaWJsZVJlY3RIZWlnaHQgIT0gbV9yb290TGF5
ZXJUZXh0dXJlSGVpZ2h0KSB7CisgICAgICAgIG1fcm9vdExheWVyVGV4dHVyZVdpZHRoID0gdmlz
aWJsZVJlY3Qud2lkdGgoKTsKKyAgICAgICAgbV9yb290TGF5ZXJUZXh0dXJlSGVpZ2h0ID0gdmlz
aWJsZVJlY3QuaGVpZ2h0KCk7CisKKyAgICAgICAgbV9wcm9qZWN0aW9uTWF0cml4ID0gb3J0aG9N
YXRyaXgoMCwgdmlzaWJsZVJlY3RXaWR0aCArIDAuNSwgdmlzaWJsZVJlY3RIZWlnaHQgKyAwLjUs
IDAsIC0xMDAwLCAxMDAwKTsKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAs
IEdMX1JHQkEsIG1fcm9vdExheWVyVGV4dHVyZVdpZHRoLCBtX3Jvb3RMYXllclRleHR1cmVIZWln
aHQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIDApOworICAgIH0KKworICAgIC8vIFRo
ZSBHTCB2aWV3cG9ydCBjb3ZlcnMgdGhlIGVudGlyZSB2aXNpYmxlIGFyZWEsIGluY2x1ZGluZyB0
aGUgc2Nyb2xsYmFycy4KKyAgICBnbFZpZXdwb3J0KDAsIDAsIHZpc2libGVSZWN0V2lkdGgsIHZp
c2libGVSZWN0SGVpZ2h0KTsKKworICAgIC8vIFRoZSBsYXllciwgc2Nyb2xsIGFuZCBkZWJ1ZyBi
b3JkZXIgc2hhZGVycyBhbGwgdXNlIHRoZSBzYW1lIHZlcnRleCBhdHRyaWJ1dGVzCisgICAgLy8g
c28gd2UgY2FuIGJpbmQgdGhlbSBvbmx5IG9uY2UuCisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZ
X0JVRkZFUiwgbV9xdWFkVmJvSWRzW1ZlcnRpY2VzXSk7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0VM
RU1FTlRfQVJSQVlfQlVGRkVSLCBtX3F1YWRWYm9JZHNbTGF5ZXJFbGVtZW50c10pOworICAgIEdM
dWludCBvZmZzZXQgPSAwOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtX3Bvc2l0aW9uTG9j
YXRpb24sIDMsIEdMX0ZMT0FULCBHTF9GQUxTRSwgNSAqIHNpemVvZihHTGZsb2F0KSwgKEdMdm9p
ZCopKG9mZnNldCkpOworICAgIG9mZnNldCArPSAzICogc2l6ZW9mKEdMZmxvYXQpOworICAgIGds
VmVydGV4QXR0cmliUG9pbnRlcihtX3RleENvb3JkTG9jYXRpb24sIDIsIEdMX0ZMT0FULCBHTF9G
QUxTRSwgNSAqIHNpemVvZihHTGZsb2F0KSwgKEdMdm9pZCopKG9mZnNldCkpOworICAgIGdsRW5h
YmxlVmVydGV4QXR0cmliQXJyYXkobV9wb3NpdGlvbkxvY2F0aW9uKTsKKyAgICBnbEVuYWJsZVZl
cnRleEF0dHJpYkFycmF5KG1fdGV4Q29vcmRMb2NhdGlvbik7CisgICAgZ2xBY3RpdmVUZXh0dXJl
KEdMX1RFWFRVUkUwKTsKKyAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAgZ2xEaXNh
YmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICBJbnRQb2ludCBzY3JvbGxEZWx0YSA9IHRvUG9pbnQo
c2Nyb2xsUG9zaXRpb24gLSBtX3Njcm9sbFBvc2l0aW9uKTsKKyAgICAvLyBTY3JvbGwgb25seSB3
aGVuIHRoZSB1cGRhdGVSZWN0IGNvbnRhaW5zIHBpeGVscyBmb3IgdGhlIG5ld2x5IHVuY292ZXJl
ZCByZWdpb24gdG8gYXZvaWQgZmxhc2hpbmcuCisgICAgaWYgKChzY3JvbGxEZWx0YS54KCkgJiYg
dXBkYXRlUmVjdC53aWR0aCgpID49IGFicyhzY3JvbGxEZWx0YS54KCkpICYmIHVwZGF0ZVJlY3Qu
aGVpZ2h0KCkgPj0gY29udGVudFJlY3QuaGVpZ2h0KCkpCisgICAgICAgIHx8IChzY3JvbGxEZWx0
YS55KCkgJiYgdXBkYXRlUmVjdC5oZWlnaHQoKSA+PSBhYnMoc2Nyb2xsRGVsdGEueSgpKSAmJiB1
cGRhdGVSZWN0LndpZHRoKCkgPj0gY29udGVudFJlY3Qud2lkdGgoKSkpIHsKKyAgICAgICAgICAg
IC8vIFNjcm9sbGluZyB3b3JrcyBhcyBmb2xsb3dzOiBXZSByZW5kZXIgYSBxdWFkIHdpdGggdGhl
IGN1cnJlbnQgcm9vdCBsYXllciBjb250ZW50cworICAgICAgICAgICAgLy8gdHJhbnNsYXRlZCBi
eSB0aGUgYW1vdW50IHRoZSBwYWdlIGhhcyBzY3JvbGxlZCBzaW5jZSB0aGUgbGFzdCB1cGRhdGUg
YW5kIHRoZW4gcmVhZCB0aGUKKyAgICAgICAgICAgIC8vIHBpeGVscyBvZiB0aGUgY29udGVudCBh
cmVhICh2aXNpYmxlIGFyZWEgZXhjbHVkaW5nIHRoZSBzY3JvbGwgYmFycykgYmFjayBpbnRvIHRo
ZQorICAgICAgICAgICAgLy8gcm9vdCBsYXllciB0ZXh0dXJlLiBUaGUgbmV3bHkgZXhwb3NlZCBh
cmVhIGlzIHN1YmVzcXVlbnRseSBmaWxsZWQgYXMgdXN1YWwgd2l0aAorICAgICAgICAgICAgLy8g
dGhlIGNvbnRlbnRzIG9mIHRoZSB1cGRhdGVSZWN0LgorICAgICAgICAgICAgVHJhbnNmb3JtYXRp
b25NYXRyaXggc2Nyb2xsZWRMYXllck1hdHJpeDsKKyAgICAgICAgICAgIHNjcm9sbGVkTGF5ZXJN
YXRyaXgudHJhbnNsYXRlM2QoKGludClmbG9vcmYoMC41ICogdmlzaWJsZVJlY3Qud2lkdGgoKSAr
IDAuNSkgLSBzY3JvbGxEZWx0YS54KCksCisgICAgICAgICAgICAgICAgKGludClmbG9vcmYoMC41
ICogdmlzaWJsZVJlY3QuaGVpZ2h0KCkgKyAwLjUpICsgc2Nyb2xsRGVsdGEueSgpLCAwKTsKKyAg
ICAgICAgICAgIHNjcm9sbGVkTGF5ZXJNYXRyaXguc2NhbGUzZCgxLCAtMSwgMSk7CisKKyAgICAg
ICAgICAgIC8vIFN3aXRjaCBzaGFkZXJzIHRvIGF2b2lkIFJHQiBzd2l6emxpbmcuCisgICAgICAg
ICAgICBnbFVzZVByb2dyYW0obV9zY3JvbGxQcm9ncmFtT2JqZWN0KTsKKyAgICAgICAgICAgIGds
VW5pZm9ybTFpKG1fc2Nyb2xsU2FtcGxlckxvY2F0aW9uLCAwKTsKKworICAgICAgICAgICAgZHJh
d1RleHR1cmVkUXVhZChzY3JvbGxlZExheWVyTWF0cml4LCB2aXNpYmxlUmVjdC53aWR0aCgpLCB2
aXNpYmxlUmVjdC5oZWlnaHQoKSwgMSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGdsQ29weVRleFN1
YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMCwgMCwgY29udGVudFJlY3Qud2lkdGgo
KSwgY29udGVudFJlY3QuaGVpZ2h0KCkpOworCisgICAgICAgICAgICBjaGVja0dMRXJyb3IoKTsK
KyAgICAgICAgICAgIG1fc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjsKKyAgICB9CisK
KyAgICAvLyBGSVhNRTogVGhlIGZvbGxvd2luZyBjaGVjayBzaG91bGQgZ28gYXdheSB3aGVuIHRo
ZSBjb21wb3NpdG9yIHJlbmRlcnMgaW5kZXBlbmRlbnRseSBmcm9tIGl0cyBvd24gdGhyZWFkLgor
ICAgIC8vIElnbm9yZSBhIDF4MSB1cGRhdGUgcmVjdCBhdCAoMCwgMCkgYXMgdGhhdCdzIHVzZWQg
YSB3YXkgdG8ga2ljayBvZmYgYSByZWRyYXcgZm9yIHRoZSBjb21wb3NpdG9yLgorICAgIGlmICgh
KCF1cGRhdGVSZWN0LngoKSAmJiAhdXBkYXRlUmVjdC55KCkgJiYgdXBkYXRlUmVjdC53aWR0aCgp
ID09IDEgJiYgdXBkYXRlUmVjdC5oZWlnaHQoKSA9PSAxKSkgeworICAgICAgICAvLyBVcGRhdGUg
dGhlIHJvb3QgbGF5ZXIgdGV4dHVyZS4KKyAgICAgICAgQVNTRVJUKCh1cGRhdGVSZWN0LngoKSAr
IHVwZGF0ZVJlY3Qud2lkdGgoKSA8PSBtX3Jvb3RMYXllclRleHR1cmVXaWR0aCkKKyAgICAgICAg
ICAgICAgICYmICh1cGRhdGVSZWN0LnkoKSArIHVwZGF0ZVJlY3QuaGVpZ2h0KCkgPD0gbV9yb290
TGF5ZXJUZXh0dXJlSGVpZ2h0KSk7CiAKLSAgICAvLyBBY2NvdW50IGZvciB0aGUgc2Nyb2xsIG9m
ZnNldCBiZWZvcmUgY29tcG9zaXRpbmcgdGhlIHJlbWFpbmluZyBsYXllcnMuCi0gICAgLy8gTm90
ZSB0aGF0IHRoZSByb290IGxheWVyJ3MgcGFpbnRpbmcgdGFrZXMgaW50byBhY2NvdW50IHRoZSBz
Y3JvbGwgb2Zmc2V0IGFscmVhZHkuCi0gICAgY2FudmFzLT50cmFuc2xhdGUoLW1fc2Nyb2xsRnJh
bWUuZkxlZnQsIC1tX3Njcm9sbEZyYW1lLmZUb3ApOwotCi0gICAgZmxvYXQgb3BhY2l0eSA9IDEu
MGY7CisjaWYgUExBVEZPUk0oU0tJQSkKKyAgICAgICAgLy8gR2V0IHRoZSBjb250ZW50cyBvZiB0
aGUgdXBkYXRlZCByZWN0LgorICAgICAgICBjb25zdCBTa0JpdG1hcCBiaXRtYXAgPSBtX3Jvb3RM
YXllci0+cGxhdGZvcm1DYW52YXMoKS0+Z2V0RGV2aWNlKCktPmFjY2Vzc0JpdG1hcChmYWxzZSk7
CisgICAgICAgIGludCByb290TGF5ZXJXaWR0aCA9IGJpdG1hcC53aWR0aCgpOworICAgICAgICBp
bnQgcm9vdExheWVySGVpZ2h0ID0gYml0bWFwLmhlaWdodCgpOworICAgICAgICBBU1NFUlQocm9v
dExheWVyV2lkdGggPT0gdXBkYXRlUmVjdC53aWR0aCgpICYmIHJvb3RMYXllckhlaWdodCA9PSB1
cGRhdGVSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgdm9pZCogcGl4ZWxzID0gYml0bWFwLmdldFBp
eGVscygpOworCisgICAgICAgIGNoZWNrR0xFcnJvcigpOworICAgICAgICAvLyBDb3B5IHRoZSBj
b250ZW50cyBvZiB0aGUgdXBkYXRlZCByZWN0IHRvIHRoZSByb290IGxheWVyIHRleHR1cmUuCisg
ICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCB1cGRhdGVSZWN0LngoKSwg
dXBkYXRlUmVjdC55KCksIHVwZGF0ZVJlY3Qud2lkdGgoKSwgdXBkYXRlUmVjdC5oZWlnaHQoKSwg
R0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgcGl4ZWxzKTsKKyAgICAgICAgY2hlY2tHTEVycm9y
KCk7CisjZWxzZQorI2Vycm9yIE11c3QgcG9ydCB0byB5b3VyIHBsYXRmb3JtCisjZW5kaWYKKyAg
ICB9CisKKyAgICBnbENsZWFyQ29sb3IoMCwgMCwgMSwgMSk7CisgICAgZ2xDbGVhcihHTF9DT0xP
Ul9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisKKyAgICAvLyBSZW5kZXIgdGhl
IHJvb3QgbGF5ZXIgdXNpbmcgYSBxdWFkIHRoYXQgdGFrZXMgdXAgdGhlIGVudGlyZSB2aXNpYmxl
IGFyZWEgb2YgdGhlIHdpbmRvdy4KKyAgICBnbFVzZVByb2dyYW0obV9sYXllclByb2dyYW1PYmpl
Y3QpOworICAgIGdsVW5pZm9ybTFpKG1fc2FtcGxlckxvY2F0aW9uLCAwKTsKKyAgICBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCBsYXllck1hdHJpeDsKKyAgICBsYXllck1hdHJpeC50cmFuc2xhdGUzZCh2
aXNpYmxlUmVjdC53aWR0aCgpIC8gMiwgdmlzaWJsZVJlY3QuaGVpZ2h0KCkgLyAyLCAwKTsKKyAg
ICBkcmF3VGV4dHVyZWRRdWFkKGxheWVyTWF0cml4LCB2aXNpYmxlUmVjdC53aWR0aCgpLCB2aXNp
YmxlUmVjdC5oZWlnaHQoKSwgMSwgZmFsc2UpOworCisgICAgLy8gSWYgY3VsbGluZyBpcyBlbmFi
bGVkIHRoZW4gd2Ugd2lsbCBjdWxsIHRoZSBiYWNrZmFjZS4KKyAgICBnbEN1bGxGYWNlKEdMX0JB
Q0spOworICAgIC8vIFRoZSBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBpcyBzZXR1cCBzdWNoIHRo
YXQgWSBzdGFydHMgYXQgemVybyBhbmQKKyAgICAvLyBpbmNyZWFzZXMgZ29pbmcgZG93biB0aGUg
cGFnZSBzbyB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgd2luZGluZyBvcmRlciBvZgorICAgIC8vIGZy
b250IGZhY2luZyB0cmlhbmdsZXMuCisgICAgZ2xGcm9udEZhY2UoR0xfQ1cpOworCisgICAgLy8g
VGhlIHNoYWRlciB1c2VkIHRvIHJlbmRlciBsYXllcnMgcmV0dXJucyBwcmUtbXVsdGlwbGllZCBh
bHBoYSBjb2xvcnMKKyAgICAvLyBzbyB3ZSBuZWVkIHRvIHNlbmQgdGhlIGJsZW5kaW5nIG1vZGUg
YXBwcm9wcmlhdGVseS4KKyAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgZ2xCbGVuZEZ1bmMo
R0xfT05FLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKworICAgIGNoZWNrR0xFcnJvcigpOwor
CisgICAgLy8gRklYTUU6IE5lZWQgdG8gcHJldmVudCBjb21wb3NpdGVkIGxheWVycyBmcm9tIGRy
YXdpbmcgb3ZlciB0aGUgc2Nyb2xsCisgICAgLy8gYmFycy4KKworICAgIC8vIEZJWE1FOiBTdWJs
YXllcnMgbmVlZCB0byBiZSBzb3J0ZWQgaW4gWiB0byBnZXQgdGhlIGNvcnJlY3QgdHJhbnNwYXJl
bmN5IGVmZmVjdC4KKworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY3VsbCBvdXQgbGF5ZXJzIHRo
YXQgYXJlIG5vdCBpbnNpZGUgdGhlIHZpc2libGUgcmVjdC4KKworICAgIC8vIFRyYW5zbGF0ZSBh
bGwgdGhlIGNvbXBvc2l0ZWQgbGF5ZXJzIGJ5IHRoZSBzY3JvbGwgcG9zaXRpb24uCisgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggbWF0cml4OworICAgIG1hdHJpeC50cmFuc2xhdGUzZCgtbV9zY3Jv
bGxQb3NpdGlvbi54KCksIC1tX3Njcm9sbFBvc2l0aW9uLnkoKSwgMCk7CisgICAgZmxvYXQgb3Bh
Y2l0eSA9IDE7CiAgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxMYXllckNocm9taXVtPiA+JiBzdWJs
YXllcnMgPSBtX3Jvb3RMYXllci0+Z2V0U3VibGF5ZXJzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspCi0gICAgICAgIGRyYXdMYXllckluQ2FudmFz
UmVjdXJzaXZlKGNhbnZhcywgc3VibGF5ZXJzW2ldLmdldCgpLCBvcGFjaXR5KTsKKyAgICAgICAg
Y29tcG9zaXRlTGF5ZXJzUmVjdXJzaXZlKHN1YmxheWVyc1tpXS5nZXQoKSwgbWF0cml4LCBvcGFj
aXR5LCB2aXNpYmxlUmVjdCk7CiAKLSAgICBjYW52YXMtPnJlc3RvcmUoKTsKKyAgICBnbEZsdXNo
KCk7CisgICAgbV9nbGVzMkNvbnRleHQtPnN3YXBCdWZmZXJzKCk7CiAKICAgICBtX25lZWRzRGlz
cGxheSA9IGZhbHNlOwogfQogCi12b2lkIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6ZHJhd0xheWVy
SW5DYW52YXNSZWN1cnNpdmUoc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcywgTGF5ZXJDaHJv
bWl1bSogbGF5ZXIsIGZsb2F0IG9wYWNpdHkpCisvLyBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgdGV4
dHVyZSBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBsYXllciBvcgorLy8gLTEgaWYgdGhl
IGlkIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQgeWV0LgoraW50IExheWVyUmVuZGVyZXJDaHJvbWl1
bTo6Z2V0VGV4dHVyZUlkKExheWVyQ2hyb21pdW0qIGxheWVyKQogewotICAgIC8vIEd1YXJhbnRl
ZXMgdGhhdCB0aGUgY2FudmFzIGlzIHJlc3RvcmVkIHRvIGEga25vd24gc3RhdGUgb24gZGVzdHJ1
Y3Rpb24uCi0gICAgU2tBdXRvQ2FudmFzUmVzdG9yZSBhdXRvUmVzdG9yZUNhbnZhcyhjYW52YXMs
IHRydWUpOworICAgIHN0ZDo6bWFwPExheWVyQ2hyb21pdW0qLCB1bnNpZ25lZCBpbnQ+OjppdGVy
YXRvciB0ZXh0dXJlSWQ7CisgICAgaWYgKCh0ZXh0dXJlSWQgPSBtX3RleHR1cmVJZE1hcC5maW5k
KGxheWVyKSkgIT0gbV90ZXh0dXJlSWRNYXAuZW5kKCkpCisgICAgICAgIHJldHVybiB0ZXh0dXJl
SWQtPnNlY29uZDsKIAotICAgIEZsb2F0UG9pbnQgcG9zaXRpb24gPSBsYXllci0+cG9zaXRpb24o
KTsKLSAgICBGbG9hdFBvaW50IGFuY2hvclBvaW50ID0gbGF5ZXItPmFuY2hvclBvaW50KCk7Ci0g
ICAgU2tNYXRyaXggdHJhbnNmb3JtID0gbGF5ZXItPnRyYW5zZm9ybSgpLnRvQWZmaW5lVHJhbnNm
b3JtKCk7CisgICAgcmV0dXJuIC0xOworfQorCisvLyBBbGxvY2F0ZXMgYSBuZXcgdGV4dHVyZSBm
b3IgdGhlIGxheWVyIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIHRleHR1cmVJZCBtYXAuCisvLyBG
SVhNRTogV2Ugd2lsbCBuZWVkIHRvIGNvbWUgdXAgd2l0aCBhIG1vcmUgc29waGlzdGljYXRlZCBh
bGxvY2F0aW9uIHN0cmF0ZWd5IGhlcmUuCisvLyBGSVhNRTogV2UgbmVlZCB0byBmcmVlIHVwIHRo
ZSBhc3NvY2lhdGVkIHRleHR1cmUgdXBvbiBsYXllciBkZXN0cnVjdGlvbi4KK2ludCBMYXllclJl
bmRlcmVyQ2hyb21pdW06OmFzc2lnblRleHR1cmVGb3JMYXllcihMYXllckNocm9taXVtKiBsYXll
cikKK3sKKyAgICBHTHVpbnQgdGV4dHVyZUlkID0gY3JlYXRlTGF5ZXJUZXh0dXJlKCk7CisKKyAg
ICAvLyBGSVhNRTogQ2hlY2sgdGhhdCB0ZXh0dXJlSWQgaXMgdmFsaWQKKyAgICBtX3RleHR1cmVJ
ZE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIobGF5ZXIsIHRleHR1cmVJZCkpOworICAgIHJldHVy
biB0ZXh0dXJlSWQ7Cit9CisKK2Jvb2wgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpmcmVlTGF5ZXJU
ZXh0dXJlKExheWVyQ2hyb21pdW0qIGxheWVyKQoreworICAgIHN0ZDo6bWFwPExheWVyQ2hyb21p
dW0qLCB1bnNpZ25lZCBpbnQ+OjppdGVyYXRvciB0ZXh0dXJlSWQgPSBtX3RleHR1cmVJZE1hcC5m
aW5kKGxheWVyKTsKKyAgICBpZiAodGV4dHVyZUlkID09IG1fdGV4dHVyZUlkTWFwLmVuZCgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gRnJlZSB1cCB0aGUgdGV4dHVyZS4KKyAgICBn
bERlbGV0ZVRleHR1cmVzKDEsICYodGV4dHVyZUlkLT5zZWNvbmQpKTsKKyAgICBtX3RleHR1cmVJ
ZE1hcC5lcmFzZSh0ZXh0dXJlSWQpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBEcmF3cyBh
IGRlYnVnIGJvcmRlciBhcm91bmQgdGhlIGxheWVyJ3MgYm91bmRzLgordm9pZCBMYXllclJlbmRl
cmVyQ2hyb21pdW06OmRyYXdEZWJ1Z0JvcmRlcihMYXllckNocm9taXVtKiBsYXllciwgY29uc3Qg
VHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCkKK3sKKyAgICBzdGF0aWMgR0xmbG9hdCBnbE1h
dHJpeFsxNl07CisgICAgQ29sb3IgYm9yZGVyQ29sb3IgPSBsYXllci0+Ym9yZGVyQ29sb3IoKTsK
KyAgICBpZiAoIWJvcmRlckNvbG9yLmFscGhhKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGds
VXNlUHJvZ3JhbShtX2JvcmRlclByb2dyYW1PYmplY3QpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4IHJlbmRlck1hdHJpeCA9IG1hdHJpeDsKICAgICBJbnRTaXplIGJvdW5kcyA9IGxheWVyLT5i
b3VuZHMoKTsKKyAgICByZW5kZXJNYXRyaXguc2NhbGUzZChib3VuZHMud2lkdGgoKSwgYm91bmRz
LmhlaWdodCgpLCAxKTsKKyAgICByZW5kZXJNYXRyaXgubXVsdGlwbHkobV9wcm9qZWN0aW9uTWF0
cml4KTsKKyAgICB0b0dMTWF0cml4KCZnbE1hdHJpeFswXSwgcmVuZGVyTWF0cml4KTsKKyAgICBn
bFVuaWZvcm1NYXRyaXg0ZnYobV9ib3JkZXJNYXRyaXhMb2NhdGlvbiwgMSwgZmFsc2UsICZnbE1h
dHJpeFswXSk7CisgICAgCisgICAgZ2xVbmlmb3JtNGYobV9ib3JkZXJDb2xvckxvY2F0aW9uLCBi
b3JkZXJDb2xvci5yZWQoKSAvIDI1NS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYm9yZGVyQ29sb3IuZ3JlZW4oKSAvIDI1NS4wLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3IuYmx1ZSgpIC8gMjU1LjAsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgIGdsTGluZVdpZHRoKGxh
eWVyLT5ib3JkZXJXaWR0aCgpKTsKKworICAgIC8vIFRoZSBpbmRpY2VzIGZvciB0aGUgbGluZSBh
cmUgc3RvcmVkIGluIHRoZSBzYW1lIGFycmF5IGFzIHRoZSB0cmlhbmdsZSBpbmRpY2VzLgorICAg
IGdsRHJhd0VsZW1lbnRzKEdMX0xJTkVfTE9PUCwgNCwgR0xfVU5TSUdORURfU0hPUlQsICh2b2lk
KikoNiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpKTsKKyAgICBjaGVja0dMRXJyb3IoKTsKIAot
ICAgIGNhbnZhcy0+dHJhbnNsYXRlKHBvc2l0aW9uLngoKSwgcG9zaXRpb24ueSgpKTsKKyAgICAv
LyBTd2l0Y2ggYmFjayB0byB0aGUgc2hhZGVyIHByb2dyYW0gdXNlZCBmb3IgbGF5ZXIgY29udGVu
dHMuCisgICAgZ2xVc2VQcm9ncmFtKG1fbGF5ZXJQcm9ncmFtT2JqZWN0KTsKK30KIAotICAgIFNr
U2NhbGFyIHR4ID0gU2tTY2FsYXJNdWwoYW5jaG9yUG9pbnQueCgpLCBib3VuZHMud2lkdGgoKSk7
Ci0gICAgU2tTY2FsYXIgdHkgPSBTa1NjYWxhck11bChhbmNob3JQb2ludC55KCksIGJvdW5kcy5o
ZWlnaHQoKSk7Ci0gICAgY2FudmFzLT50cmFuc2xhdGUodHgsIHR5KTsKLSAgICBjYW52YXMtPmNv
bmNhdCh0cmFuc2Zvcm0pOwotICAgIGNhbnZhcy0+dHJhbnNsYXRlKC10eCwgLXR5KTsKLQotICAg
IC8vIFRoZSBwb3NpdGlvbiB3ZSBnZXQgaXMgZm9yIHRoZSBjZW50ZXIgb2YgdGhlIGxheWVyLCBi
dXQKLSAgICAvLyBkcmF3Qml0bWFwIHN0YXJ0cyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIsIGFu
ZCB0aGVyZWZvcmUKLSAgICAvLyB3ZSBuZWVkIHRvIGFkanVzdCBvdXIgdHJhbnNmb3JtLgotICAg
IGNhbnZhcy0+dHJhbnNsYXRlKC0wLjVmICogYm91bmRzLndpZHRoKCksIC0wLjVmICogYm91bmRz
LmhlaWdodCgpKTsKKy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcGFydCBvZiB0aGUgbGF5ZXIgZmFs
bHMgd2l0aGluIHRoZSB2aXNpYmxlUmVjdAorYm9vbCBMYXllclJlbmRlcmVyQ2hyb21pdW06Omlz
TGF5ZXJWaXNpYmxlKExheWVyQ2hyb21pdW0qIGxheWVyLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgbWF0cml4LCBjb25zdCBJbnRSZWN0JiB2aXNpYmxlUmVjdCkKK3sKKyAgICAvLyBGb3Jt
IHRoZSBtYXRyaXggdXNlZCBieSB0aGUgc2hhZGVyIHRvIG1hcCB0aGUgY29ybmVycyBvZiB0aGUg
bGF5ZXIncworICAgIC8vIGJvdW5kcyBpbnRvIGNsaXAgc3BhY2UuCisgICAgVHJhbnNmb3JtYXRp
b25NYXRyaXggcmVuZGVyTWF0cml4ID0gbWF0cml4OworICAgIHJlbmRlck1hdHJpeC5zY2FsZTNk
KGxheWVyLT5ib3VuZHMoKS53aWR0aCgpLCBsYXllci0+Ym91bmRzKCkuaGVpZ2h0KCksIDEpOwor
ICAgIHJlbmRlck1hdHJpeC5tdWx0aXBseShtX3Byb2plY3Rpb25NYXRyaXgpOworCisgICAgRmxv
YXRSZWN0IGxheWVyUmVjdCgtMC41LCAtMC41LCAxLCAxKTsKKyAgICBGbG9hdFJlY3QgbWFwcGVk
UmVjdCA9IHJlbmRlck1hdHJpeC5tYXBSZWN0KGxheWVyUmVjdCk7CisKKyAgICAvLyBUaGUgbGF5
ZXIgaXMgdmlzaWJsZSBpZiBpdCBpbnRlcnNlY3RzIGFueSBwYXJ0IG9mIGEgcmVjdGFuZ2xlIHdo
b3NlIG9yaWdpbgorICAgIC8vIGlzIGF0ICgtMSwgLTEpIGFuZCBzaXplIGlzIDJ4Mi4KKyAgICBy
ZXR1cm4gbWFwcGVkUmVjdC5pbnRlcnNlY3RzKEZsb2F0UmVjdCgtMSwgLTEsIDIsIDIpKTsKK30K
IAotICAgIGxheWVyLT5kcmF3RGVidWdCb3JkZXIoKTsKK3ZvaWQgTGF5ZXJSZW5kZXJlckNocm9t
aXVtOjpjb21wb3NpdGVMYXllcnNSZWN1cnNpdmUoTGF5ZXJDaHJvbWl1bSogbGF5ZXIsIGNvbnN0
IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBtYXRyaXgsIGZsb2F0IG9wYWNpdHksIGNvbnN0IEludFJl
Y3QmIHZpc2libGVSZWN0KQoreworICAgIHN0YXRpYyBHTGZsb2F0IGdsTWF0cml4WzE2XTsKIAot
ICAgIFNrUGFpbnQgb3BhY2l0eVBhaW50OworICAgIC8vIENvbXB1dGUgdGhlIG5ldyBtYXRyaXgg
dHJhbnNmb3JtYXRpb24gdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhpcyBsYXllciBhbmQKKyAg
ICAvLyBhbGwgaXRzIHN1YmxheWVycy4KKyAgICAvLyBUaGUgYmFzaWMgdHJhbnNmb3JtYXRpb24g
Y2hhaW4gZm9yIHRoZSBsYXllciBpcyAodXNpbmcgdGhlIE1hdHJpeCB4IFZlY3RvciBvcmRlcik6
CisgICAgLy8gTSA9IE1bcF0gKiBUW2xdICogVFthXSAqIE1bbF0gKiBUWy1hXQorICAgIC8vIFdo
ZXJlIE1bcF0gaXMgdGhlIHBhcmVudCBtYXRyaXggcGFzc2VkIGRvd24gdG8gdGhlIGZ1bmN0aW9u
CisgICAgLy8gICAgICAgVFtsXSBpcyB0aGUgdHJhbnNsYXRpb24gb2YgdGhlIGxheWVyJ3MgY2Vu
dGVyCisgICAgLy8gICAgICAgVFthXSBhbmQgVFstYV0gaXMgYSB0cmFuc2xhdGlvbi9pbnZlcnNl
IHRyYW5zbGF0aW9uIGJ5IHRoZSBhbmNob3IgcG9pbnQKKyAgICAvLyAgICAgICBNW2xdIGlzIHRo
ZSBsYXllcidzIG1hdHJpeAorICAgIC8vIE5vdGUgdGhhdCB0aGUgZmluYWwgbWF0cml4IHVzZWQg
YnkgdGhlIHNoYWRlciBmb3IgdGhlIGxheWVyIGlzIFAgKiBNICogUyAuIFRoaXMgZmluYWwgcHJv
ZHVjdAorICAgIC8vIGlzIGVmZmVjdGl2ZWx5IGNvbXB1dGVkIGluIGRyYXdUZXh0dXJlZFF1YWQo
KS4KKyAgICAvLyBXaGVyZTogUCBpcyB0aGUgcHJvamVjdGlvbiBtYXRyaXgKKyAgICAvLyAgICAg
ICAgTSBpcyB0aGUgbGF5ZXIncyBtYXRyaXggY29tcHV0ZWQgYWJvdmUKKyAgICAvLyAgICAgICAg
UyBpcyB0aGUgc2NhbGUgYWRqdXN0bWVudCAodG8gc2NhbGUgdXAgdG8gdGhlIGxheWVyIHNpemUp
CisgICAgSW50U2l6ZSBib3VuZHMgPSBsYXllci0+Ym91bmRzKCk7CisgICAgRmxvYXRQb2ludCBh
bmNob3JQb2ludCA9IGxheWVyLT5hbmNob3JQb2ludCgpOworICAgIEZsb2F0UG9pbnQgcG9zaXRp
b24gPSBsYXllci0+cG9zaXRpb24oKTsKKyAgICBmbG9hdCBhbmNob3JYID0gKGFuY2hvclBvaW50
LngoKSAtIDAuNSkgKiBib3VuZHMud2lkdGgoKTsKKyAgICBmbG9hdCBhbmNob3JZID0gKDAuNSAt
IGFuY2hvclBvaW50LnkoKSkgKiBib3VuZHMuaGVpZ2h0KCk7CisKKyAgICAvLyBNID0gTVtwXQor
ICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxvY2FsTWF0cml4ID0gbWF0cml4OworICAgIC8vIE0g
PSBNW3BdICogVFtsXQorICAgIGxvY2FsTWF0cml4LnRyYW5zbGF0ZTNkKHBvc2l0aW9uLngoKSwg
cG9zaXRpb24ueSgpLCAwKTsKKyAgICAvLyBNID0gTVtwXSAqIFRbbF0gKiBUW2FdCisgICAgbG9j
YWxNYXRyaXgudHJhbnNsYXRlM2QoYW5jaG9yWCwgYW5jaG9yWSwgMCk7CisgICAgLy8gTSA9IE1b
cF0gKiBUW2xdICogVFthXSAqIE1bbF0KKyAgICBsb2NhbE1hdHJpeC5tdWx0TGVmdChsYXllci0+
dHJhbnNmb3JtKCkpOworICAgIC8vIE0gPSBNW3BdICogVFtsXSAqIFRbYV0gKiBNW2xdICogVFst
YV0KKyAgICBsb2NhbE1hdHJpeC50cmFuc2xhdGUzZCgtYW5jaG9yWCwgLWFuY2hvclksIDApOwor
CisgICAgYm9vbCBza2lwTGF5ZXIgPSBmYWxzZTsKKyAgICBpZiAoYm91bmRzLndpZHRoKCkgPiAy
MDQ4IHx8IGJvdW5kcy5oZWlnaHQoKSA+IDIwNDgpIHsKKyAgICAgICAgTE9HKExheWVyUmVuZGVy
ZXIsICJTa2lwcGluZyBsYXllciB3aXRoIHNpemUgJWQgJWQiLCBib3VuZHMud2lkdGgoKSwgYm91
bmRzLmhlaWdodCgpKTsKKyAgICAgICAgc2tpcExheWVyID0gdHJ1ZTsKKyAgICB9CisKKyAgICAv
LyBDYWxjdWxhdGUgdGhlIGxheWVyJ3Mgb3BhY2l0eS4KICAgICBvcGFjaXR5ICo9IGxheWVyLT5v
cGFjaXR5KCk7Ci0gICAgb3BhY2l0eVBhaW50LnNldEFscGhhKG9wYWNpdHkgKiAyNTUpOwogCi0g
ICAgY2FudmFzLT5kcmF3Qml0bWFwKGxheWVyLT5wbGF0Zm9ybUNhbnZhcygpLT5nZXREZXZpY2Uo
KS0+YWNjZXNzQml0bWFwKGZhbHNlKSwgMCwgMCwgJm9wYWNpdHlQYWludCk7CisgICAgYm9vbCBs
YXllclZpc2libGUgPSBpc0xheWVyVmlzaWJsZShsYXllciwgbG9jYWxNYXRyaXgsIHZpc2libGVS
ZWN0KTsKIAorICAgIC8vIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIGxheWVyczoK
KyAgICAvLyAxLiBMYXllcnMgdGhhdCBoYXZlIHRoZWlyIG93biBHcmFwaGljc0NvbnRleHQgYW5k
IGNhbiBkcmF3IHRoZWlyIGNvbnRlbnRzIG9uIGRlbWFuZCAobGF5ZXItPmRyYXdzQ29udGVudCgp
ID09IHRydWUpLgorICAgIC8vIDIuIExheWVycyB0aGF0IGFyZSBqdXN0IGNvbnRhaW5lcnMgb2Yg
aW1hZ2VzL3ZpZGVvL2V0YyB0aGF0IGRvbid0IG93biBhIEdyYXBoaWNzQ29udGV4dCAobGF5ZXIt
PmNvbnRlbnRzKCkgPT0gdHJ1ZSkuCisgICAgaWYgKChsYXllci0+ZHJhd3NDb250ZW50KCkgfHwg
bGF5ZXItPmNvbnRlbnRzKCkpICYmICFza2lwTGF5ZXIgJiYgbGF5ZXJWaXNpYmxlKSB7CisgICAg
ICAgIGludCB0ZXh0dXJlSWQgPSBnZXRUZXh0dXJlSWQobGF5ZXIpOworICAgICAgICAvLyBJZiBu
byB0ZXh0dXJlIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBsYXllciB5ZXQgdGhlbiBjcmVhdGUg
b25lIG5vdy4KKyAgICAgICAgaWYgKHRleHR1cmVJZCA9PSAtMSkKKyAgICAgICAgICAgIHRleHR1
cmVJZCA9IGFzc2lnblRleHR1cmVGb3JMYXllcihsYXllcik7CisKKyAgICAgICAgLy8gUmVkcmF3
IHRoZSBjb250ZW50cyBvZiB0aGUgbGF5ZXIgaWYgbmVjZXNzYXJ5LgorICAgICAgICBpZiAoKGxh
eWVyLT5kcmF3c0NvbnRlbnQoKSB8fCBsYXllci0+Y29udGVudHMoKSkgJiYgbGF5ZXItPmNvbnRl
bnRzRGlydHkoKSkgeworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb250ZW50cyBvZiB0aGUg
bGF5ZXIgYmVmb3JlIHRha2luZyBhIHNuYXBzaG90LiBGb3IgbGF5ZXJzIHRoYXQKKyAgICAgICAg
ICAgIC8vIGFyZSBzaW1wbHkgY29udGFpbmVycywgdGhlIGZvbGxvd2luZyBjYWxsIGp1c3QgY2xl
YXJzIHRoZSBkaXJ0eSBmbGFnIGJ1dCBkb2Vzbid0CisgICAgICAgICAgICAvLyBhY3R1YWxseSBk
byBhbnkgZHJhd3MvY29waWVzLgorICAgICAgICAgICAgbGF5ZXItPnVwZGF0ZUNvbnRlbnRzKCk7
CisKKyAgICAgICAgICAgIGNvbnN0IFNrQml0bWFwKiBza2lhQml0bWFwID0gMDsKKyAgICAgICAg
ICAgIHZvaWQqIHBpeGVscyA9IDA7CisgICAgICAgICAgICBpZiAobGF5ZXItPmRyYXdzQ29udGVu
dCgpKSB7IC8vIExheWVyIGhhcyBpdHMgb3duIEdyYXBoaWNzQ29udGV4dC4KKyAgICAgICAgICAg
ICAgICAvLyBUaGUgY29udGVudHMgb2YgdGhlIGxheWVyIGFyZSBzdG9yZWQgaW4gdGhlIGNhbnZh
cyBhc3NvY2lhdGVkIHdpdGggaXQuCisgICAgICAgICAgICAgICAgY29uc3QgU2tCaXRtYXAmIGJp
dG1hcCA9IGxheWVyLT5wbGF0Zm9ybUNhbnZhcygpLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFw
KGZhbHNlKTsKKyAgICAgICAgICAgICAgICBza2lhQml0bWFwID0gJmJpdG1hcDsKKyAgICAgICAg
ICAgIH0gZWxzZSB7IC8vIExheWVyIGlzIGEgY29udGFpbmVyLgorICAgICAgICAgICAgICAgIC8v
IFRoZSBsYXllciBjb250YWlucyBhbiBJbWFnZS4KKyAgICAgICAgICAgICAgICBOYXRpdmVJbWFn
ZVNraWEqIHNraWFJbWFnZSA9IHN0YXRpY19jYXN0PE5hdGl2ZUltYWdlU2tpYSo+KGxheWVyLT5j
b250ZW50cygpKTsKKyAgICAgICAgICAgICAgICBza2lhQml0bWFwID0gc2tpYUltYWdlOworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBBU1NFUlQoc2tpYUJpdG1hcCk7CisgICAgICAgICAg
ICBTa0JpdG1hcDo6Q29uZmlnIHNraWFDb25maWcgPSBza2lhQml0bWFwLT5jb25maWcoKTsKKyAg
ICAgICAgICAgIC8vIEZJWE1FOiBtdXN0IHN1cHBvcnQgbW9yZSBpbWFnZSBjb25maWd1cmF0aW9u
cy4KKyAgICAgICAgICAgIGlmIChza2lhQ29uZmlnID09IFNrQml0bWFwOjprQVJHQl84ODg4X0Nv
bmZpZykgeworICAgICAgICAgICAgICAgIFNrQXV0b0xvY2tQaXhlbHMgbG9jaygqc2tpYUJpdG1h
cCk7CisgICAgICAgICAgICAgICAgaW50IGJpdG1hcFdpZHRoID0gc2tpYUJpdG1hcC0+d2lkdGgo
KTsKKyAgICAgICAgICAgICAgICBpbnQgYml0bWFwSGVpZ2h0ID0gc2tpYUJpdG1hcC0+aGVpZ2h0
KCk7CisgICAgICAgICAgICAgICAgaW50IHJvd0J5dGVzID0gc2tpYUJpdG1hcC0+cm93Qnl0ZXMo
KTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocm93Qnl0ZXMgPT0gYml0bWFwV2lkdGggKiA0KTsK
KworICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlIGxheWVyIGNvbnRlbnRzIGludG8gdGhlIHRl
eHR1cmUuCisgICAgICAgICAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0
dXJlSWQpOworICAgICAgICAgICAgICAgIHZvaWQqIHBpeGVscyA9IHNraWFCaXRtYXAtPmdldFBp
eGVscygpOworICAgICAgICAgICAgICAgIGlmIChwaXhlbHMpIHsKKyAgICAgICAgICAgICAgICAg
ICAgLy8gRklYTUUuIFdlIGNhbiBiZSBzbWFydCBoZXJlIGFuZCBjYWxsIGdsVGV4U3ViSW1hZ2Uy
RCBpZiB0aGUgbmV3IGJpdG1hcCBoYXMgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgLy8g
c2l6ZSBhcyB0aGUgb2xkIG9uZSB3aGljaCB3aWxsIHNhdmUgdXMgb25lIHVuZWNlc3NhcnkgYWxs
b2NhdGlvbiAvIGRlYWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgZ2xUZXhJbWFnZTJE
KEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJpdG1hcFdpZHRoLCBiaXRtYXBIZWlnaHQsIDAs
IEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7CisgICAgICAgICAgICAgICAgICAg
IGNoZWNrR0xFcnJvcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorCisgICAgICAgIGlmIChsYXllci0+ZG91YmxlU2lkZWQoKSkKKyAgICAgICAgICAgIGds
RGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnbEVuYWJs
ZShHTF9DVUxMX0ZBQ0UpOworCisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwg
dGV4dHVyZUlkKTsKKworICAgICAgICBkcmF3VGV4dHVyZWRRdWFkKGxvY2FsTWF0cml4LCBib3Vu
ZHMud2lkdGgoKSwgYm91bmRzLmhlaWdodCgpLCBvcGFjaXR5LCBmYWxzZSk7CisgICAgfQorCisg
ICAgLy8gRHJhdyB0aGUgZGVidWcgYm9yZGVyIGlmIHRoZXJlIGlzIG9uZS4KKyAgICBkcmF3RGVi
dWdCb3JkZXIobGF5ZXIsIGxvY2FsTWF0cml4KTsKKworICAgIC8vIEFwcGx5IHRoZSBzdWJsYXll
ciB0cmFuc2Zvcm0uCisgICAgbG9jYWxNYXRyaXgubXVsdExlZnQobGF5ZXItPnN1YmxheWVyVHJh
bnNmb3JtKCkpOworCisgICAgLy8gVGhlIG9yaWdpbiBvZiB0aGUgc3VibGF5ZXJzIGlzIGFjdHVh
bGx5IHRoZSBsZWZ0IHRvcCBjb3JuZXIgb2YgdGhlIGxheWVyCisgICAgLy8gaW5zdGVhZCBvZiB0
aGUgY2VudGVyLiBUaGUgbWF0cml4IHBhc3NlZCBkb3duIHRvIHRoZSBzdWJsYXllcnMgaXMgdGhl
cmVmb3JlOgorICAgIC8vIE1bc10gPSBNICogVFstY2VudGVyXQorICAgIGxvY2FsTWF0cml4LnRy
YW5zbGF0ZTNkKC1ib3VuZHMud2lkdGgoKSAqIDAuNSwgLWJvdW5kcy5oZWlnaHQoKSAqIDAuNSwg
MCk7CiAgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxMYXllckNocm9taXVtPiA+JiBzdWJsYXllcnMg
PSBsYXllci0+Z2V0U3VibGF5ZXJzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJs
YXllcnMuc2l6ZSgpOyBpKyspCi0gICAgICAgIGRyYXdMYXllckluQ2FudmFzUmVjdXJzaXZlKGNh
bnZhcywgc3VibGF5ZXJzW2ldLmdldCgpLCBvcGFjaXR5KTsKKyAgICAgICAgY29tcG9zaXRlTGF5
ZXJzUmVjdXJzaXZlKHN1YmxheWVyc1tpXS5nZXQoKSwgbG9jYWxNYXRyaXgsIG9wYWNpdHksIHZp
c2libGVSZWN0KTsKIH0KLSNlbmRpZiAvLyBQTEFURk9STShTS0lBKQogCi12b2lkIExheWVyUmVu
ZGVyZXJDaHJvbWl1bTo6dXBkYXRlTGF5ZXJDb250ZW50c1JlY3Vyc2l2ZShMYXllckNocm9taXVt
KiBsYXllcikKK2Jvb2wgTGF5ZXJSZW5kZXJlckNocm9taXVtOjptYWtlQ29udGV4dEN1cnJlbnQo
KQogewotICAgIGxheWVyLT51cGRhdGVDb250ZW50cygpOworICAgIHJldHVybiBtX2dsZXMyQ29u
dGV4dC0+bWFrZUN1cnJlbnQoKTsKK30KIAotICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJD
aHJvbWl1bT4gPiYgc3VibGF5ZXJzID0gbGF5ZXItPmdldFN1YmxheWVycygpOwotICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgc3VibGF5ZXJzLnNpemUoKTsgaSsrKQotICAgICAgICB1cGRhdGVM
YXllckNvbnRlbnRzUmVjdXJzaXZlKHN1YmxheWVyc1tpXS5nZXQoKSk7Citib29sIExheWVyUmVu
ZGVyZXJDaHJvbWl1bTo6aW5pdEdMKCkKK3sKKyAgICBtX2dsZXMyQ29udGV4dCA9IEdMRVMyQ29u
dGV4dDo6Y3JlYXRlKG1fcGFnZSk7CisKKyAgICBpZiAoIW1fZ2xlczJDb250ZXh0KQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQmluZHMgdGhlIGdp
dmVuIGF0dHJpYnV0ZSBuYW1lIHRvIGEgY29tbW9uIGxvY2F0aW9uIGFjcm9zcyBhbGwgdGhyZWUg
cHJvZ3JhbXMKKy8vIHVzZWQgYnkgdGhlIGNvbXBvc2l0b3IuIFRoaXMgYWxsb3dzIHRoZSBjb2Rl
IHRvIGJpbmQgdGhlIGF0dHJpYnV0ZXMgb25seSBvbmNlCisvLyBldmVuIHdoZW4gc3dpdGNoaW5n
IGJldHdlZW4gcHJvZ3JhbXMuCit2b2lkIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6YmluZENvbW1v
bkF0dHJpYkxvY2F0aW9uKGludCBsb2NhdGlvbiwgY2hhciogYXR0cmliTmFtZSkKK3sKKyAgICBn
bEJpbmRBdHRyaWJMb2NhdGlvbihtX2xheWVyUHJvZ3JhbU9iamVjdCwgbG9jYXRpb24sIGF0dHJp
Yk5hbWUpOworICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKG1fYm9yZGVyUHJvZ3JhbU9iamVjdCwg
bG9jYXRpb24sIGF0dHJpYk5hbWUpOworICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKG1fc2Nyb2xs
UHJvZ3JhbU9iamVjdCwgbG9jYXRpb24sIGF0dHJpYk5hbWUpOwogfQogCitib29sIExheWVyUmVu
ZGVyZXJDaHJvbWl1bTo6aW5pdGlhbGl6ZVNoYXJlZEdMT2JqZWN0cygpCit7CisgICAgLy8gU2hh
ZGVycyBmb3IgZHJhd2luZyB0aGUgbGF5ZXIgY29udGVudHMuCisgICAgY2hhciB2ZXJ0ZXhTaGFk
ZXJTdHJpbmdbXSA9CisgICAgICAgICJhdHRyaWJ1dGUgdmVjNCBhX3Bvc2l0aW9uOyAgIFxuIgor
ICAgICAgICAiYXR0cmlidXRlIHZlYzIgYV90ZXhDb29yZDsgICBcbiIKKyAgICAgICAgInVuaWZv
cm0gbWF0NCBtYXRyaXg7ICAgICAgICAgXG4iCisgICAgICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXhD
b29yZDsgICAgIFxuIgorICAgICAgICAidm9pZCBtYWluKCkgICAgICAgICAgICAgICAgICBcbiIK
KyAgICAgICAgInsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIgIGds
X1Bvc2l0aW9uID0gbWF0cml4ICogYV9wb3NpdGlvbjsgXG4iCisgICAgICAgICIgIHZfdGV4Q29v
cmQgPSBhX3RleENvb3JkOyAgIFxuIgorICAgICAgICAifSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcbiI7CisgICAgY2hhciBmcmFnbWVudFNoYWRlclN0cmluZ1tdID0KKyAgICAgICAgLy8g
RklYTUU6IFJlLWludHJvZHVjZSBwcmVjaXNpb24gcXVhbGlmaWVyIHdoZW4gd2UgbmVlZCBHTCBF
UyBzaGFkZXJzLgorICAgICAgICAiLy9wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZDsg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIy
RCBzX3RleHR1cmU7ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ1bmlmb3Jt
IGZsb2F0IGFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAg
ICJ2b2lkIG1haW4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4i
CisgICAgICAgICJ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXG4iCisgICAgICAgICIgIHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoc190ZXh0dXJl
LCB2X3RleENvb3JkKTsgXG4iCisgICAgICAgICIgIGdsX0ZyYWdDb2xvciA9IHZlYzQodGV4Q29s
b3IueiwgdGV4Q29sb3IueSwgdGV4Q29sb3IueCwgdGV4Q29sb3IudykgKiBhbHBoYTsgXG4iCisg
ICAgICAgICJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXG4iOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUg
c2Nyb2xsZWQgcm9vdCBsYXllciBxdWFkLiBJdCBkaWZmZXJzCisgICAgLy8gZnJvbSBmcmFnbWVu
dFNoYWRlclN0cmluZyBpbiB0aGF0IGl0IGRvZXNuJ3Qgc3dpenpsZSB0aGUgY29sb3JzIGFuZCBk
b2Vzbid0CisgICAgLy8gdGFrZSBhbiBhbHBoYSB2YWx1ZS4KKyAgICBjaGFyIHNjcm9sbEZyYWdt
ZW50U2hhZGVyU3RyaW5nW10gPQorICAgICAgICAvLyBGSVhNRTogUmUtaW50cm9kdWNlIHByZWNp
c2lvbiBxdWFsaWZpZXIgd2hlbiB3ZSBuZWVkIEdMIEVTIHNoYWRlcnMuCisgICAgICAgICIvL3By
ZWNpc2lvbiBtZWRpdW1wIGZsb2F0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAg
ICAgICAgInZhcnlpbmcgdmVjMiB2X3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcbiIKKyAgICAgICAgInVuaWZvcm0gc2FtcGxlcjJEIHNfdGV4dHVyZTsgICAgICAgICAgICAg
ICAgICAgICAgICBcbiIKKyAgICAgICAgInZvaWQgbWFpbigpICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIiAgdmVjNCB0ZXhDb2xv
ciA9IHRleHR1cmUyRChzX3RleHR1cmUsIHZfdGV4Q29vcmQpOyBcbiIKKyAgICAgICAgIiAgZ2xf
RnJhZ0NvbG9yID0gdmVjNCh0ZXhDb2xvci54LCB0ZXhDb2xvci55LCB0ZXhDb2xvci56LCB0ZXhD
b2xvci53KTsgXG4iCisgICAgICAgICJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXG4iOworCisgICAgLy8gU2hhZGVycyBmb3IgZHJhd2luZyB0aGUg
ZGVidWcgYm9yZGVycyBhcm91bmQgdGhlIGxheWVycy4KKyAgICBjaGFyIGJvcmRlclZlcnRleFNo
YWRlclN0cmluZ1tdID0KKyAgICAgICAgImF0dHJpYnV0ZSB2ZWM0IGFfcG9zaXRpb247ICAgXG4i
CisgICAgICAgICJ1bmlmb3JtIG1hdDQgbWF0cml4OyAgICAgICAgIFxuIgorICAgICAgICAidm9p
ZCBtYWluKCkgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbiA9IG1hdHJpeCAqIGFfcG9z
aXRpb247IFxuIgorICAgICAgICAifSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiI7Cisg
ICAgY2hhciBib3JkZXJGcmFnbWVudFNoYWRlclN0cmluZ1tdID0KKyAgICAgICAgLy8gRklYTUU6
IFJlLWludHJvZHVjZSBwcmVjaXNpb24gcXVhbGlmaWVyIHdoZW4gd2UgbmVlZCBHTCBFUyBzaGFk
ZXJzLgorICAgICAgICAiLy9wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3I7ICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ2b2lkIG1haW4oKSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ7ICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIgIGds
X0ZyYWdDb2xvciA9IGNvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAg
ICAgICJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XG4iOworCisgICAgR0xmbG9hdCB2ZXJ0aWNlc1tdID0geyAtMC41ZiwgIDAuNWYsIDAuMGYsIC8v
IFBvc2l0aW9uIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAgMS4wZiwgLy8g
VGV4Q29vcmQgMCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjVmLCAtMC41ZiwgMC4w
ZiwgLy8gUG9zaXRpb24gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsICAwLjBm
LCAvLyBUZXhDb29yZCAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ZiwgLTAuNWYs
IDAuMGYsIC8vIFBvc2l0aW9uIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmLCAg
MC4wZiwgLy8gVGV4Q29vcmQgMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNWYsICAw
LjVmLCAwLjBmLCAvLyBQb3NpdGlvbiAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4w
ZiwgIDEuMGYgLy8gVGV4Q29vcmQgMworICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAg
R0x1c2hvcnQgaW5kaWNlc1tdID0geyAwLCAxLCAyLCAwLCAyLCAzLCAvLyBUaGUgdHdvIHRyaWFu
Z2xlcyB0aGF0IG1ha2UgdXAgdGhlIGxheWVyIHF1YWQuCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAwLCAxLCAyLCAzfTsgLy8gQSBsaW5lIHBhdGggZm9yIGRyYXdpbmcgdGhlIGxheWVyIGJv
cmRlci4KKworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOworICAgIG1fbGF5ZXJQcm9ncmFtT2Jq
ZWN0ID0gbG9hZFNoYWRlclByb2dyYW0odmVydGV4U2hhZGVyU3RyaW5nLCBmcmFnbWVudFNoYWRl
clN0cmluZyk7CisgICAgaWYgKCFtX2xheWVyUHJvZ3JhbU9iamVjdCkgeworICAgICAgICBMT0df
RVJST1IoIkZhaWxlZCB0byBjcmVhdGUgc2hhZGVyIHByb2dyYW0gZm9yIGxheWVycyIpOworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zY3JvbGxQcm9ncmFtT2JqZWN0ID0g
bG9hZFNoYWRlclByb2dyYW0odmVydGV4U2hhZGVyU3RyaW5nLCBzY3JvbGxGcmFnbWVudFNoYWRl
clN0cmluZyk7CisgICAgaWYgKCFtX3Njcm9sbFByb2dyYW1PYmplY3QpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHNoYWRlciBwcm9ncmFtIGZvciBzY3JvbGxpbmcgbGF5
ZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fYm9yZGVyUHJvZ3Jh
bU9iamVjdCA9IGxvYWRTaGFkZXJQcm9ncmFtKGJvcmRlclZlcnRleFNoYWRlclN0cmluZywgYm9y
ZGVyRnJhZ21lbnRTaGFkZXJTdHJpbmcpOworICAgIGlmICghbV9ib3JkZXJQcm9ncmFtT2JqZWN0
KSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBzaGFkZXIgcHJvZ3JhbSBm
b3IgZGVidWcgYm9yZGVycyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
Ly8gU3BlY2lmeSB0aGUgYXR0cmliIGxvY2F0aW9uIGZvciB0aGUgcG9zaXRpb24gYW5kIG1ha2Ug
aXQgdGhlIHNhbWUgZm9yIGFsbCB0aHJlZSBwcm9ncmFtcyB0bworICAgIC8vIGF2b2lkIGJpbmRp
bmcgcmUtYmluZGluZyB0aGUgdmVydGV4IGF0dHJpYnV0ZXMuCisgICAgYmluZENvbW1vbkF0dHJp
YkxvY2F0aW9uKG1fcG9zaXRpb25Mb2NhdGlvbiwgImFfcG9zaXRpb24iKTsKKyAgICBiaW5kQ29t
bW9uQXR0cmliTG9jYXRpb24obV90ZXhDb29yZExvY2F0aW9uLCAiYV90ZXhDb29yZCIpOworCisg
ICAgY2hlY2tHTEVycm9yKCk7CisKKyAgICAvLyBSZS1saW5rIHRoZSBzaGFkZXJzIHRvIGdldCB0
aGUgbmV3IGF0dHJpYiBsb2NhdGlvbiB0byB0YWtlIGVmZmVjdC4KKyAgICBnbExpbmtQcm9ncmFt
KG1fbGF5ZXJQcm9ncmFtT2JqZWN0KTsKKyAgICBnbExpbmtQcm9ncmFtKG1fYm9yZGVyUHJvZ3Jh
bU9iamVjdCk7CisgICAgZ2xMaW5rUHJvZ3JhbShtX3Njcm9sbFByb2dyYW1PYmplY3QpOworCisg
ICAgY2hlY2tHTEVycm9yKCk7CisKKyAgICAvLyBHZXQgbG9jYXRpb25zIG9mIHVuaWZvcm1zIGZv
ciB0aGUgbGF5ZXIgY29udGVudCBzaGFkZXIgcHJvZ3JhbS4KKyAgICBtX3NhbXBsZXJMb2NhdGlv
biA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fbGF5ZXJQcm9ncmFtT2JqZWN0LCAic190ZXh0dXJl
Iik7CisgICAgbV9tYXRyaXhMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fbGF5ZXJQ
cm9ncmFtT2JqZWN0LCAibWF0cml4Iik7CisgICAgbV9hbHBoYUxvY2F0aW9uID0gZ2xHZXRVbmlm
b3JtTG9jYXRpb24obV9sYXllclByb2dyYW1PYmplY3QsICJhbHBoYSIpOworCisgICAgbV9zY3Jv
bGxNYXRyaXhMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fc2Nyb2xsUHJvZ3JhbU9i
amVjdCwgIm1hdHJpeCIpOworICAgIG1fc2Nyb2xsU2FtcGxlckxvY2F0aW9uID0gZ2xHZXRVbmlm
b3JtTG9jYXRpb24obV9zY3JvbGxQcm9ncmFtT2JqZWN0LCAic190ZXh0dXJlIik7CisKKyAgICAv
LyBHZXQgbG9jYXRpb25zIG9mIHVuaWZvcm1zIGZvciB0aGUgZGVidWcgYm9yZGVyIHNoYWRlciBw
cm9ncmFtLgorICAgIG1fYm9yZGVyTWF0cml4TG9jYXRpb24gPSBnbEdldFVuaWZvcm1Mb2NhdGlv
bihtX2JvcmRlclByb2dyYW1PYmplY3QsICJtYXRyaXgiKTsKKyAgICBtX2JvcmRlckNvbG9yTG9j
YXRpb24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtX2JvcmRlclByb2dyYW1PYmplY3QsICJjb2xv
ciIpOworCisgICAgZ2xHZW5CdWZmZXJzKDMsIG1fcXVhZFZib0lkcyk7CisgICAgZ2xCaW5kQnVm
ZmVyKEdMX0FSUkFZX0JVRkZFUiwgbV9xdWFkVmJvSWRzW1ZlcnRpY2VzXSk7CisgICAgZ2xCdWZm
ZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgc2l6ZW9mKHZlcnRpY2VzKSwgdmVydGljZXMsIEdMX1NU
QVRJQ19EUkFXKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1f
cXVhZFZib0lkc1tMYXllckVsZW1lbnRzXSk7CisgICAgZ2xCdWZmZXJEYXRhKEdMX0VMRU1FTlRf
QVJSQVlfQlVGRkVSLCBzaXplb2YoaW5kaWNlcyksIGluZGljZXMsIEdMX1NUQVRJQ19EUkFXKTsK
KworICAgIC8vIENyZWF0ZSBhIHRleHR1cmUgb2JqZWN0IHRvIGhvbGQgdGhlIGNvbnRlbnRzIG9m
IHRoZSByb290IGxheWVyLgorICAgIG1fcm9vdExheWVyVGV4dHVyZUlkID0gY3JlYXRlTGF5ZXJU
ZXh0dXJlKCk7CisgICAgaWYgKG1fcm9vdExheWVyVGV4dHVyZUlkID09IC0xKSB7CisgICAgICAg
IExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSB0ZXh0dXJlIGZvciByb290IGxheWVyIik7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gVHVybiBvZmYgZmlsdGVyaW5nIGZv
ciB0aGUgcm9vdCBsYXllciB0byBhdm9pZCBibHVycmluZyBmcm9tIHRoZSByZXBlYXRlZAorICAg
IC8vIHdyaXRlcyBhbmQgcmVhZHMgdG8gdGhlIGZyYW1lYnVmZmVyIHRoYXQgaGFwcGVuIHdoaWxl
IHNjcm9sbGluZy4KKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1fcm9vdExheWVy
VGV4dHVyZUlkKTsKKyAgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVS
RV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVS
RV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKworICAgIHJldHVybiB0
cnVlOworfQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5oCShyZXZpc2lvbiA1OTYx
MikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNo
cm9taXVtLmgJKHdvcmtpbmcgY29weSkKQEAgLTM2LDQ1ICszNiw5NyBAQAogCiAjaW5jbHVkZSAi
SW50UmVjdC5oIgogI2luY2x1ZGUgIkxheWVyQ2hyb21pdW0uaCIKKyNpbmNsdWRlICJTa0JpdG1h
cC5oIgorI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KICNpbmNs
dWRlIDx3dGYvUGFzc093blB0ci5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KIAotbmFtZXNw
YWNlIHNraWEgewotY2xhc3MgUGxhdGZvcm1DYW52YXM7Ci19Ci0KIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAorY2xhc3MgR0xFUzJDb250ZXh0OworY2xhc3MgUGFnZTsKKworLy8gQ2xhc3MgdGhhdCBo
YW5kbGVzIGRyYXdpbmcgb2YgY29tcG9zaXRlZCByZW5kZXIgbGF5ZXJzIHVzaW5nIEdMLgogY2xh
c3MgTGF5ZXJSZW5kZXJlckNocm9taXVtIDogcHVibGljIE5vbmNvcHlhYmxlIHsKIHB1YmxpYzoK
LSAgICBzdGF0aWMgUGFzc093blB0cjxMYXllclJlbmRlcmVyQ2hyb21pdW0+IGNyZWF0ZSgpOwor
ICAgIHN0YXRpYyBQYXNzT3duUHRyPExheWVyUmVuZGVyZXJDaHJvbWl1bT4gY3JlYXRlKFBhZ2Uq
IHBhZ2UpOwogCi0gICAgTGF5ZXJSZW5kZXJlckNocm9taXVtKCk7CisgICAgTGF5ZXJSZW5kZXJl
ckNocm9taXVtKFBhZ2UqIHBhZ2UpOwogICAgIH5MYXllclJlbmRlcmVyQ2hyb21pdW0oKTsKIAot
I2lmIFBMQVRGT1JNKFNLSUEpCi0gICAgdm9pZCBkcmF3TGF5ZXJzSW5DYW52YXMoc2tpYTo6UGxh
dGZvcm1DYW52YXMqLCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCk7Ci0jZW5kaWYKLSAgICB2b2lk
IHVwZGF0ZUxheWVyQ29udGVudHMoKTsKKyAgICAvLyBVcGRhdGVzIHRoZSBjb250ZW50cyBvZiB0
aGUgcm9vdCBsYXllciB0aGF0IGZhbGwgaW5zaWRlIHRoZSB1cGRhdGVSZWN0IGFuZCByZWNvbXBv
c2l0ZXMKKyAgICAvLyBhbGwgdGhlIGxheWVycy4KKyAgICB2b2lkIGRyYXdMYXllcnMoY29uc3Qg
SW50UmVjdCYgdXBkYXRlUmVjdCwgY29uc3QgSW50UmVjdCYgdmlzaWJsZVJlY3QsIGNvbnN0IElu
dFJlY3QmIGNvbnRlbnRSZWN0LCBjb25zdCBJbnRQb2ludCYgc2Nyb2xsUG9zaXRpb24pOwogCiAg
ICAgdm9pZCBzZXRSb290TGF5ZXIoUGFzc1JlZlB0cjxMYXllckNocm9taXVtPiBsYXllcikgeyBt
X3Jvb3RMYXllciA9IGxheWVyOyB9CiAgICAgTGF5ZXJDaHJvbWl1bSogcm9vdExheWVyKCkgeyBy
ZXR1cm4gbV9yb290TGF5ZXIuZ2V0KCk7IH0KIAogICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCkg
eyBtX25lZWRzRGlzcGxheSA9IHRydWU7IH0KIAotICAgIHZvaWQgc2V0U2Nyb2xsRnJhbWUoU2tJ
UmVjdCYgc2Nyb2xsRnJhbWUpIHsgbV9zY3JvbGxGcmFtZSA9IHNjcm9sbEZyYW1lOyB9CisgICAg
Ly8gRnJlZXMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBsYXllci4KKyAg
ICBib29sIGZyZWVMYXllclRleHR1cmUoTGF5ZXJDaHJvbWl1bSopOworCisgICAgYm9vbCBoYXJk
d2FyZUNvbXBvc2l0aW5nKCkgY29uc3QgeyByZXR1cm4gbV9oYXJkd2FyZUNvbXBvc2l0aW5nOyB9
CiAKIHByaXZhdGU6Ci0jaWYgUExBVEZPUk0oU0tJQSkKLSAgICB2b2lkIGRyYXdMYXllckluQ2Fu
dmFzUmVjdXJzaXZlKHNraWE6OlBsYXRmb3JtQ2FudmFzKiwgTGF5ZXJDaHJvbWl1bSosIGZsb2F0
IG9wYWNpdHkpOwotI2VuZGlmCi0gICAgdm9pZCB1cGRhdGVMYXllckNvbnRlbnRzUmVjdXJzaXZl
KExheWVyQ2hyb21pdW0qKTsKKyAgICB2b2lkIGNvbXBvc2l0ZUxheWVyc1JlY3Vyc2l2ZShMYXll
ckNocm9taXVtKiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmLCBmbG9hdCBvcGFjaXR5LCBj
b25zdCBJbnRSZWN0JiB2aXNpYmxlUmVjdCk7CisKKyAgICB2b2lkIGRyYXdEZWJ1Z0JvcmRlcihM
YXllckNocm9taXVtKiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKworICAgIHZvaWQg
ZHJhd1RleHR1cmVkUXVhZChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgbWF0cml4LCBmbG9h
dCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBvcGFjaXR5LCBib29sIHNjcm9sbGluZyk7CisK
KyAgICBib29sIGlzTGF5ZXJWaXNpYmxlKExheWVyQ2hyb21pdW0qLCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYsIGNvbnN0IEludFJlY3QmIHZpc2libGVSZWN0KTsKKworICAgIHZvaWQgYmlu
ZENvbW1vbkF0dHJpYkxvY2F0aW9uKGludCBsb2NhdGlvbiwgY2hhciogYXR0cmliTmFtZSk7CisK
KyAgICBlbnVtIFZib0lkcyB7IFZlcnRpY2VzLCBMYXllckVsZW1lbnRzIH07CisKKyAgICAvLyBU
aGVzZSBhcmUgaGVyZSBvbmx5IHRlbXBvcmFyaWx5IGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBvbmNl
IHdlIHN3aXRjaCBvdmVyIHRvIEdHTAorICAgIGJvb2wgaW5pdEdMKCk7CisgICAgYm9vbCBtYWtl
Q29udGV4dEN1cnJlbnQoKTsKKworICAgIGJvb2wgaW5pdGlhbGl6ZVNoYXJlZEdMT2JqZWN0cygp
OworICAgIGludCBnZXRUZXh0dXJlSWQoTGF5ZXJDaHJvbWl1bSopOworICAgIGludCBhc3NpZ25U
ZXh0dXJlRm9yTGF5ZXIoTGF5ZXJDaHJvbWl1bSopOworCisgICAgLy8gR0wgc2hhZGVyIHByb2dy
YW0gb2JqZWN0IElEcy4KKyAgICB1bnNpZ25lZCBpbnQgbV9sYXllclByb2dyYW1PYmplY3Q7Cisg
ICAgdW5zaWduZWQgaW50IG1fYm9yZGVyUHJvZ3JhbU9iamVjdDsKKyAgICB1bnNpZ25lZCBpbnQg
bV9zY3JvbGxQcm9ncmFtT2JqZWN0OworCisgICAgdW5zaWduZWQgaW50IG1fcm9vdExheWVyVGV4
dHVyZUlkOworICAgIGludCBtX3Jvb3RMYXllclRleHR1cmVXaWR0aDsKKyAgICBpbnQgbV9yb290
TGF5ZXJUZXh0dXJlSGVpZ2h0OworCisgICAgLy8gU2hhZGVyIHVuaWZvcm0gYW5kIGF0dHJpYnV0
ZSBsb2NhdGlvbnMuCisgICAgY29uc3QgaW50IG1fcG9zaXRpb25Mb2NhdGlvbjsKKyAgICBjb25z
dCBpbnQgbV90ZXhDb29yZExvY2F0aW9uOworICAgIGludCBtX3NhbXBsZXJMb2NhdGlvbjsKKyAg
ICBpbnQgbV9tYXRyaXhMb2NhdGlvbjsKKyAgICBpbnQgbV9hbHBoYUxvY2F0aW9uOworICAgIGlu
dCBtX3Njcm9sbE1hdHJpeExvY2F0aW9uOworICAgIGludCBtX3Njcm9sbFNhbXBsZXJMb2NhdGlv
bjsKKworICAgIGludCBtX2JvcmRlck1hdHJpeExvY2F0aW9uOworICAgIGludCBtX2JvcmRlckNv
bG9yTG9jYXRpb247CisKKyAgICB1bnNpZ25lZCBpbnQgbV9xdWFkVmJvSWRzWzNdOworICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IG1fcHJvamVjdGlvbk1hdHJpeDsKIAogICAgIFJlZlB0cjxMYXll
ckNocm9taXVtPiBtX3Jvb3RMYXllcjsKIAogICAgIGJvb2wgbV9uZWVkc0Rpc3BsYXk7Ci0gICAg
U2tJUmVjdCBtX3Njcm9sbEZyYW1lOworICAgIEludFBvaW50IG1fc2Nyb2xsUG9zaXRpb247Cisg
ICAgYm9vbCBtX2hhcmR3YXJlQ29tcG9zaXRpbmc7CisKKyAgICAvLyBNYXAgYXNzb2NpYXRpbmcg
bGF5ZXJzIHdpdGggdGV4dHVyZXMgaWRzIHVzZWQgYnkgdGhlIEdMIGNvbXBvc2l0b3IuCisgICAg
c3RkOjptYXA8TGF5ZXJDaHJvbWl1bSosIHVuc2lnbmVkIGludD4gbV90ZXh0dXJlSWRNYXA7CisK
KyAgICBPd25QdHI8R0xFUzJDb250ZXh0PiBtX2dsZXMyQ29udGV4dDsKKworICAgIC8vIFRoZSBX
ZWJDb3JlIFBhZ2UgdGhhdCB0aGUgY29tcG9zaXRvciByZW5kZXJzIGludG8uCisgICAgUGFnZSog
bV9wYWdlOwogfTsKIAogfQpJbmRleDogV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCShyZXZpc2lvbiA1OTYzMCkKKysrIFdl
YktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNyBAQAor
MjAxMC0wNS0xNyAgVmFuZ2VsaXMgS29ra2V2aXMgIDx2YW5nZWxpc0BjaHJvbWl1bS5vcmc+CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTW9kaWZ5aW5n
IFdlYlZpZXdJbXBsIHRvIHN1cHBvcnQgbmV3IGhhcmR3YXJlIGNvbXBvc2l0aW5nIGZvcgorICAg
ICAgICBMYXllckNocm9taXVtIGxheWVycy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTM4NzgzCisKKyAgICAgICAgKiBzcmMvV2ViVmlld0ltcGwuY3Bw
OgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6cGFpbnQpOgorICAgICAgICAoV2ViS2l0
OjpXZWJWaWV3SW1wbDo6c2V0SXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0aXZlKToKKyAgICAg
ICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnVwZGF0ZVJvb3RMYXllckNvbnRlbnRzKToKKyAgICAg
ICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnNldFJvb3RMYXllck5lZWRzRGlzcGxheSk6CisKIDIw
MTAtMDUtMTYgIE1pa2UgQmVsc2hlICA8bWJlbHNoZUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgRGltaXRyaSBHbGF6a292LgpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9X
ZWJWaWV3SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3
SW1wbC5jcHAJKHJldmlzaW9uIDU5NjEyKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3
SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTk3MCwxMiArOTcwLDE5IEBAIHZvaWQgV2ViVmll
d0ltcGw6OnBhaW50KFdlYkNhbnZhcyogY2FudmEKICAgICAgICAgLy8gRHJhdyB0aGUgY29udGVu
dHMgb2YgdGhlIHJvb3QgbGF5ZXIuCiAgICAgICAgIHVwZGF0ZVJvb3RMYXllckNvbnRlbnRzKHJl
Y3QpOwogCi0gICAgICAgIC8vIENvbXBvc2l0ZSBldmVyeXRoaW5nIGludG8gdGhlIGNhbnZhcyB0
aGF0J3MgcGFzc2VkIHRvIHVzLgotI2lmIFBMQVRGT1JNKFNLSUEpCi0gICAgICAgIG1fbGF5ZXJS
ZW5kZXJlci0+ZHJhd0xheWVyc0luQ2FudmFzKHN0YXRpY19jYXN0PHNraWE6OlBsYXRmb3JtQ2Fu
dmFzKj4oY2FudmFzKSwgSW50UmVjdChyZWN0KSk7Ci0jZWxpZiBQTEFURk9STShDRykKLSNlcnJv
ciAiTmVlZCB0byBpbXBsZW1lbnQgQ0cgdmVyc2lvbiIKLSNlbmRpZgorICAgICAgICBXZWJGcmFt
ZUltcGwqIHdlYmZyYW1lID0gbWFpbkZyYW1lSW1wbCgpOworICAgICAgICBpZiAoIXdlYmZyYW1l
KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBGcmFtZVZpZXcqIHZpZXcgPSB3ZWJmcmFt
ZS0+ZnJhbWVWaWV3KCk7CisgICAgICAgIGlmICghdmlldykKKyAgICAgICAgICAgIHJldHVybjsK
KworICAgICAgICAvLyBUaGUgdmlzaWJsZVJlY3QgaW5jbHVkZXMgc2Nyb2xsYmFycyB3aGVyZWFz
IHRoZSBjb250ZW50UmVjdCBkb2Vzbid0LgorICAgICAgICBJbnRSZWN0IHZpc2libGVSZWN0ID0g
dmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KHRydWUpOworICAgICAgICBJbnRSZWN0IGNvbnRlbnRS
ZWN0ID0gdmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KGZhbHNlKTsKKworICAgICAgICAvLyBBc2sg
dGhlIGxheWVyIGNvbXBvc2l0b3IgdG8gcmVkcmF3IGFsbCB0aGUgbGF5ZXJzLgorICAgICAgICBt
X2xheWVyUmVuZGVyZXItPmRyYXdMYXllcnMocmVjdCwgdmlzaWJsZVJlY3QsIGNvbnRlbnRSZWN0
LCBJbnRQb2ludCh2aWV3LT5zY3JvbGxYKCksIHZpZXctPnNjcm9sbFkoKSkpOwogICAgIH0KICNl
bmRpZgogfQpAQCAtMjA3Miw5ICsyMDc5LDEzIEBAIHZvaWQgV2ViVmlld0ltcGw6OnNldElzQWNj
ZWxlcmF0ZWRDb21wb3MKICAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKGFjdGl2ZSkgewotICAg
ICAgICBtX2xheWVyUmVuZGVyZXIgPSBMYXllclJlbmRlcmVyQ2hyb21pdW06OmNyZWF0ZSgpOwot
ICAgICAgICBpZiAobV9sYXllclJlbmRlcmVyKQorICAgICAgICBtX2xheWVyUmVuZGVyZXIgPSBM
YXllclJlbmRlcmVyQ2hyb21pdW06OmNyZWF0ZShwYWdlKCkpOworICAgICAgICBpZiAobV9sYXll
clJlbmRlcmVyLT5oYXJkd2FyZUNvbXBvc2l0aW5nKCkpCiAgICAgICAgICAgICBtX2lzQWNjZWxl
cmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSA9IHRydWU7CisgICAgICAgIGVsc2UgeworICAgICAgICAg
ICAgbV9sYXllclJlbmRlcmVyLmNsZWFyKCk7CisgICAgICAgICAgICBtX2lzQWNjZWxlcmF0ZWRD
b21wb3NpdGluZ0FjdGl2ZSA9IGZhbHNlOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAg
ICAgbV9sYXllclJlbmRlcmVyID0gMDsKICAgICAgICAgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRp
bmdBY3RpdmUgPSBmYWxzZTsKQEAgLTIwODYsNiArMjA5NywxMiBAQCB2b2lkIFdlYlZpZXdJbXBs
Ojp1cGRhdGVSb290TGF5ZXJDb250ZW50CiAgICAgaWYgKCFpc0FjY2VsZXJhdGVkQ29tcG9zaXRp
bmdBY3RpdmUoKSkKICAgICAgICAgcmV0dXJuOwogCisgICAgLy8gRklYTUU6IFRoZSBhY2NlbGVy
YXRlZCBjb21wb3NpdGluZyBwYXRoIGludmFsaWRhdGVzIGEgMXgxIHJlY3QgYXQgKDAsIDApCisg
ICAgLy8gaW4gb3JkZXIgdG8gZ2V0IHRoZSByZW5kZXJlciB0byBhc2sgdGhlIGNvbXBvc2l0b3Ig
dG8gcmVkcmF3LiBUaGlzIGlzIG9ubHkKKyAgICAvLyB0ZW1wb3JhcnkgdW50aWwgd2UgZ2V0IHRo
ZSBjb21wb3NpdG9yIHRvIHJlbmRlciBkaXJlY3RseSBmcm9tIGl0cyBvd24gdGhyZWFkLgorICAg
IGlmICghcmVjdC54ICYmICFyZWN0LnkgJiYgcmVjdC53aWR0aCA9PSAxICYmIHJlY3QuaGVpZ2h0
ID09IDEpCisgICAgICAgIHJldHVybjsKKwogICAgIFdlYkZyYW1lSW1wbCogd2ViZnJhbWUgPSBt
YWluRnJhbWVJbXBsKCk7CiAgICAgaWYgKCF3ZWJmcmFtZSkKICAgICAgICAgcmV0dXJuOwpAQCAt
MjA5MywyNCArMjExMCwyOCBAQCB2b2lkIFdlYlZpZXdJbXBsOjp1cGRhdGVSb290TGF5ZXJDb250
ZW50CiAgICAgaWYgKCF2aWV3KQogICAgICAgICByZXR1cm47CiAKLSAgICBXZWJSZWN0IHZpZXdS
ZWN0ID0gdmlldy0+ZnJhbWVSZWN0KCk7Ci0gICAgU2tJUmVjdCBzY3JvbGxGcmFtZTsKLSAgICBz
Y3JvbGxGcmFtZS5zZXQodmlldy0+c2Nyb2xsWCgpLCB2aWV3LT5zY3JvbGxZKCksIHZpZXctPmxh
eW91dFdpZHRoKCkgKyB2aWV3LT5zY3JvbGxYKCksIHZpZXctPmxheW91dEhlaWdodCgpICsgdmll
dy0+c2Nyb2xsWSgpKTsKLSAgICBtX2xheWVyUmVuZGVyZXItPnNldFNjcm9sbEZyYW1lKHNjcm9s
bEZyYW1lKTsKICAgICBMYXllckNocm9taXVtKiByb290TGF5ZXIgPSBtX2xheWVyUmVuZGVyZXIt
PnJvb3RMYXllcigpOwogICAgIGlmIChyb290TGF5ZXIpIHsKICAgICAgICAgSW50UmVjdCB2aXNp
YmxlUmVjdCA9IHZpZXctPnZpc2libGVDb250ZW50UmVjdCh0cnVlKTsKIAotICAgICAgICAvLyBT
ZXQgdGhlIGJhY2tpbmcgc3RvcmUgc2l6ZSB1c2VkIGJ5IHRoZSByb290IGxheWVyIHRvIGJlIHRo
ZSBzaXplIG9mIHRoZSB2aXNpYmxlCi0gICAgICAgIC8vIGFyZWEuIE5vdGUgdGhhdCB0aGUgcm9v
dCBsYXllciBib3VuZHMgY291bGQgYmUgbGFyZ2VyIHRoYW4gdGhlIGJhY2tpbmcgc3RvcmUgc2l6
ZSwKLSAgICAgICAgLy8gYnV0IHRoZXJlJ3Mgbm8gcmVhc29uIHRvIHdhc3RlIG1lbW9yeSBieSBh
bGxvY2F0aW5nIGJhY2tpbmcgc3RvcmUgbGFyZ2VyIHRoYW4gdGhlCi0gICAgICAgIC8vIHZpc2li
bGUgcG9ydGlvbi4KLSAgICAgICAgcm9vdExheWVyLT5zZXRCYWNraW5nU3RvcmVSZWN0KEludFNp
emUodmlzaWJsZVJlY3Qud2lkdGgoKSwgdmlzaWJsZVJlY3QuaGVpZ2h0KCkpKTsKKyAgICAgICAg
Ly8gVXBkYXRlIHRoZSByb290IGxheWVyJ3MgYmFja2luZyBzdG9yZSB0byBiZSB0aGUgc2l6ZSBv
ZiB0aGUgZGlydHkgcmVjdC4KKyAgICAgICAgLy8gVW5saWtlIG90aGVyIGxheWVycyB0aGUgcm9v
dCBsYXllciBkb2Vzbid0IGhhdmUgcGVyc2lzdGVudCBzdG9yYWdlIGZvciBpdHMKKyAgICAgICAg
Ly8gY29udGVudHMgaW4gc3lzdGVtIG1lbW9yeS4KKyAgICAgICAgcm9vdExheWVyLT5zZXRCYWNr
aW5nU3RvcmVTaXplKEludFNpemUocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpKTsKICAgICAgICAg
R3JhcGhpY3NDb250ZXh0KiByb290TGF5ZXJDb250ZXh0ID0gcm9vdExheWVyLT5ncmFwaGljc0Nv
bnRleHQoKTsKKyAgICAgICAgc2tpYTo6UGxhdGZvcm1DYW52YXMqIHBsYXRmb3JtQ2FudmFzID0g
cm9vdExheWVyLT5wbGF0Zm9ybUNhbnZhcygpOworCisgICAgICAgIHBsYXRmb3JtQ2FudmFzLT5z
YXZlKCk7CisKKyAgICAgICAgLy8gQnJpbmcgdGhlIGNhbnZhcyBpbnRvIHRoZSBjb29yZGluYXRl
IHN5c3RlbSBvZiB0aGUgcGFpbnQgcmVjdC4KKyAgICAgICAgcGxhdGZvcm1DYW52YXMtPnRyYW5z
bGF0ZShzdGF0aWNfY2FzdDxTa1NjYWxhcj4oLXJlY3QueCksIHN0YXRpY19jYXN0PFNrU2NhbGFy
PigtcmVjdC55KSk7CisKICAgICAgICAgcm9vdExheWVyQ29udGV4dC0+c2F2ZSgpOwogCiAgICAg
ICAgIHdlYmZyYW1lLT5wYWludFdpdGhDb250ZXh0KCoocm9vdExheWVyLT5ncmFwaGljc0NvbnRl
eHQoKSksIHJlY3QpOwogICAgICAgICByb290TGF5ZXJDb250ZXh0LT5yZXN0b3JlKCk7CisKKyAg
ICAgICAgcGxhdGZvcm1DYW52YXMtPnJlc3RvcmUoKTsKICAgICB9CiB9CiAKQEAgLTIxMTksOCAr
MjE0MCwxMCBAQCB2b2lkIFdlYlZpZXdJbXBsOjpzZXRSb290TGF5ZXJOZWVkc0Rpc3BsCiAgICAg
Ly8gRklYTUU6IEZvciBub3cgd2UncmUgcG9zdGluZyBhIHJlcGFpbnQgZXZlbnQgZm9yIHRoZSBl
bnRpcmUgcGFnZSB3aGljaCBpcyBhbiBvdmVya2lsbC4KICAgICBpZiAoV2ViRnJhbWVJbXBsKiB3
ZWJmcmFtZSA9IG1haW5GcmFtZUltcGwoKSkgewogICAgICAgICBpZiAoRnJhbWVWaWV3KiB2aWV3
ID0gd2ViZnJhbWUtPmZyYW1lVmlldygpKSB7CisgICAgICAgICAgICAvLyBGSVhNRTogVGVtcG9y
YXJ5IGhhY2sgdG8gaW52YWxpZGF0ZSBwYXJ0IG9mIHRoZSBwYWdlIHNvIHRoYXQgd2UgZ2V0IGNh
bGxlZCB0byByZW5kZXIKKyAgICAgICAgICAgIC8vICAgICAgICBhZ2Fpbi4KICAgICAgICAgICAg
IEludFJlY3QgdmlzaWJsZVJlY3QgPSB2aWV3LT52aXNpYmxlQ29udGVudFJlY3QodHJ1ZSk7Ci0g
ICAgICAgICAgICBtX2NsaWVudC0+ZGlkSW52YWxpZGF0ZVJlY3QodmlzaWJsZVJlY3QpOworICAg
ICAgICAgICAgbV9jbGllbnQtPmRpZEludmFsaWRhdGVSZWN0KEludFJlY3QoMCwgMCwgMSwgMSkp
OwogICAgICAgICB9CiAgICAgfQogCg==
</data>
<flag name="review"
          id="40701"
          type_id="1"
          status="-"
          setter="fishd"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56390</attachid>
            <date>2010-05-18 11:10:04 -0700</date>
            <delta_ts>2010-05-19 22:59:21 -0700</delta_ts>
            <desc>Patch addressing review comments</desc>
            <filename>glCompositor38783_1.txt</filename>
            <type>text/plain</type>
            <size>54512</size>
            <attacher name="Vangelis Kokkevis">vangelis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1OTYzMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTggQEAKKzIwMTAtMDUtMTcgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNA
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEltcGxlbWVudGluZyBoYXJkd2FyZSBhY2NlbGVyYXRlZCBjb21wb3NpdGluZyBvZiBs
YXllcnMgZm9yIENocm9taXVtLgorICAgICAgICBDb21wbGV0ZWx5IHJlbW92ZWQgdGhlIGV4aXN0
aW5nIHNvZnR3YXJlIGNvbXBvc2l0aW5nIHBhdGggdG8gcmVwbGFjZQorICAgICAgICBpdCB3aXRo
IGNvZGUgaW1wbGVtZW50ZWQgdXNpbmcgT3BlbkdMLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzg3ODMKKworICAgICAgICBUZXN0czogQ292ZXJlZCBi
eSBleGlzdGluZyBjb21wb3NpdGluZyB0ZXN0cy4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwL1dl
YkNvcmUuZ3lwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNz
TGF5ZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQ2hyb21p
dW06On5HcmFwaGljc0xheWVyQ2hyb21pdW0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckNocm9taXVtOjp1cGRhdGVMYXllckRyYXdzQ29udGVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0xheWVyQ2hyb21pdW06OnVwZGF0ZUNvbnRlbnRzUmVjdCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllckNocm9taXVtOjpMYXllckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyQ2hyb21pdW06On5MYXllckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
Q2hyb21pdW06OnVwZGF0ZUdyYXBoaWNzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpMYXll
ckNocm9taXVtOjpkcmF3c0NvbnRlbnRVcGRhdGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
Q2hyb21pdW06OnVwZGF0ZUNvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21p
dW06OnNldENvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnNldEJh
Y2tpbmdTdG9yZVNpemUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6c2V0Qm91
bmRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnNldE5lZWRzRGlzcGxheSk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6Y29udGVudHNEaXJ0eSk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllckNocm9taXVtOjpkcmF3c0NvbnRlbnQpOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tHTEVycm9yKToKKyAgICAgICAg
KFdlYkNvcmU6OmxvYWRTaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6bG9hZFNoYWRlclByb2dy
YW0pOgorICAgICAgICAoV2ViQ29yZTo6dG9HTE1hdHJpeCk6CisgICAgICAgIChXZWJDb3JlOjpv
cnRob01hdHJpeCk6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVMYXllclRleHR1cmUpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpMYXllclJlbmRlcmVyQ2hyb21pdW0pOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjp+TGF5ZXJSZW5kZXJlckNo
cm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6ZHJhd1Rl
eHR1cmVkUXVhZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmRy
YXdMYXllcnMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpnZXRU
ZXh0dXJlSWQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjphc3Np
Z25UZXh0dXJlRm9yTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9t
aXVtOjpmcmVlTGF5ZXJUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJD
aHJvbWl1bTo6ZHJhd0RlYnVnQm9yZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVy
ZXJDaHJvbWl1bTo6aXNMYXllclZpc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5k
ZXJlckNocm9taXVtOjpjb21wb3NpdGVMYXllcnNSZWN1cnNpdmUpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjptYWtlQ29udGV4dEN1cnJlbnQpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjppbml0R0wpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpiaW5kQ29tbW9uQXR0cmliTG9jYXRpb24pOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjppbml0aWFsaXplU2hhcmVkR0xP
YmplY3RzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRl
cmVyQ2hyb21pdW0uaDoKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyUmVuZGVyZXJDaHJvbWl1bTo6
KToKKwogMjAxMC0wNS0xNCAgRGFyaW4gQWRsZXIgIDxkYXJpbkBhcHBsZS5jb20+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgQnJhZHkgRWlkc29uLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLmd5cC9X
ZWJDb3JlLmd5cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lw
CShyZXZpc2lvbiA1OTYxMikKKysrIFdlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAJKHdv
cmtpbmcgY29weSkKQEAgLTcyMyw2ICs3MjMsNyBAQAogICAgICAgJ2luY2x1ZGVfZGlycyc6IFsK
ICAgICAgICAgJzwoSU5URVJNRURJQVRFX0RJUiknLAogICAgICAgICAnPEAod2ViY29yZV9pbmNs
dWRlX2RpcnMpJywKKyAgICAgICAgJzwoY2hyb21pdW1fc3JjX2RpcikvZ3B1JwogICAgICAgXSwK
ICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnPEAod2ViY29yZV9maWxlcyknLApJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3Jh
cGhpY3NMYXllckNocm9taXVtLmNwcAkocmV2aXNpb24gNTk2MTIpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTEwMSwxMiArMTAxLDYgQEAgR3JhcGhpY3NMYXllckNocm9taXVtOjpHcmFwaGlj
c0xheWVyQ2hybwogCiBHcmFwaGljc0xheWVyQ2hyb21pdW06On5HcmFwaGljc0xheWVyQ2hyb21p
dW0oKQogewotICAgIC8vIENsZWFuIHVwIHRoZSBTa2lhIGxheWVyLgotICAgIGlmIChtX2xheWVy
KQotICAgICAgICBtX2xheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOwotCi0gICAgaWYgKG1f
dHJhbnNmb3JtTGF5ZXIpCi0gICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnJlbW92ZUZyb21TdXBl
cmxheWVyKCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjpzZXROYW1lKGNvbnN0
IFN0cmluZyYgaW5OYW1lKQpAQCAtNDg1LDYgKzQ3OSwxMSBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJD
aHJvbWl1bTo6dXBkYXRlTGF5ZXJQCiAKIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjp1cGRh
dGVMYXllckRyYXdzQ29udGVudCgpCiB7CisgICAgLy8gU2luY2Ugb25seSBsYXllcnMgdGhhdCBk
cmF3IGNvbnRlbnQgaGF2ZSBhIHZhbGlkIGNvbnRleHQKKyAgICAvLyB3ZSBuZWVkIHRvIGNhbGwg
dXBkYXRlR3JhcGhpY3NDb250ZXh0KCkgaGVyZSB0byBtYWtlIHN1cmUgb25lCisgICAgLy8gZ2V0
cyBjcmVhdGVkLgorICAgIG1fbGF5ZXItPmRyYXdzQ29udGVudFVwZGF0ZWQoKTsKKwogICAgIGlm
IChtX2RyYXdzQ29udGVudCkKICAgICAgICAgbV9sYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CiAK
QEAgLTUzMyw3ICs1MzIsOCBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6dXBkYXRlQ29u
dGVuCiAgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1f
Y29udGVudHNMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludChtX2NvbnRlbnRzUmVjdC54KCks
IG1fY29udGVudHNSZWN0LnkoKSkpOworICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgbGF5ZXIg
aXMgdGhlIGNlbnRlciBvZiBxdWFkLgorICAgIG1fY29udGVudHNMYXllci0+c2V0UG9zaXRpb24o
RmxvYXRQb2ludChtX2NvbnRlbnRzUmVjdC54KCkgKyBtX2NvbnRlbnRzUmVjdC53aWR0aCgpIC8g
MiwgbV9jb250ZW50c1JlY3QueSgpICsgbV9jb250ZW50c1JlY3QuaGVpZ2h0KCkgLyAyKSk7CiAg
ICAgbV9jb250ZW50c0xheWVyLT5zZXRCb3VuZHMoSW50U2l6ZShtX2NvbnRlbnRzUmVjdC53aWR0
aCgpLCBtX2NvbnRlbnRzUmVjdC5oZWlnaHQoKSkpOwogfQogCkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5jcHAJKHJldmlz
aW9uIDU5NjEyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNo
cm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTUsOSArNTUsMTAgQEAgTGF5ZXJDaHJvbWl1
bTo6TGF5ZXJDaHJvbWl1bShMYXllclR5cGUgdAogICAgICwgbV9ib3JkZXJXaWR0aCgwKQogICAg
ICwgbV9ib3JkZXJDb2xvcigwLCAwLCAwLCAwKQogICAgICwgbV9iYWNrZ3JvdW5kQ29sb3IoMCwg
MCwgMCwgMCkKKyAgICAsIG1fYW5jaG9yUG9pbnQoMC41LCAwLjUpCiAgICAgLCBtX2FuY2hvclBv
aW50WigwKQogICAgICwgbV9jbGVhcnNDb250ZXh0KGZhbHNlKQotICAgICwgbV9kb3VibGVTaWRl
ZChmYWxzZSkKKyAgICAsIG1fZG91YmxlU2lkZWQodHJ1ZSkKICAgICAsIG1fZWRnZUFudGlhbGlh
c2luZ01hc2soMCkKICAgICAsIG1faGlkZGVuKGZhbHNlKQogICAgICwgbV9tYXNrc1RvQm91bmRz
KGZhbHNlKQpAQCAtNjksOSArNzAsMTAgQEAgTGF5ZXJDaHJvbWl1bTo6TGF5ZXJDaHJvbWl1bShM
YXllclR5cGUgdAogICAgICwgbV9za2lhQ29udGV4dCgwKQogICAgICwgbV9ncmFwaGljc0NvbnRl
eHQoMCkKICAgICAsIG1fZ2VvbWV0cnlGbGlwcGVkKGZhbHNlKQorICAgICwgbV9jb250ZW50c0Rp
cnR5KGZhbHNlKQogICAgICwgbV9jb250ZW50cygwKQorICAgICwgbV9oYXNDb250ZXh0KGZhbHNl
KQogewotICAgIHVwZGF0ZUdyYXBoaWNzQ29udGV4dChtX2JhY2tpbmdTdG9yZVJlY3QpOwogfQog
CiBMYXllckNocm9taXVtOjp+TGF5ZXJDaHJvbWl1bSgpCkBAIC03OSwxNCArODEsMzAgQEAgTGF5
ZXJDaHJvbWl1bTo6fkxheWVyQ2hyb21pdW0oKQogICAgIC8vIE91ciBzdXBlcmxheWVyIHNob3Vs
ZCBiZSBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIHVzIHNvIHRoZXJlIHNob3VsZCBiZSBubwogICAg
IC8vIHdheSBmb3IgdXMgdG8gYmUgZGVzdHJveWVkIHdoaWxlIHdlIHN0aWxsIGhhdmUgYSBzdXBl
cmxheWVyLgogICAgIEFTU0VSVCghc3VwZXJsYXllcigpKTsKKworICAgIC8vIFJlbW92ZSB0aGUg
c3VwZXJsYXllciByZWZlcmVuY2UgZnJvbSBhbGwgc3VibGF5ZXJzLgorICAgIHJlbW92ZUFsbFN1
YmxheWVycygpOwogfQogCi12b2lkIExheWVyQ2hyb21pdW06OnVwZGF0ZUdyYXBoaWNzQ29udGV4
dChjb25zdCBJbnRTaXplJiBzaXplKQordm9pZCBMYXllckNocm9taXVtOjp1cGRhdGVHcmFwaGlj
c0NvbnRleHQoKQogeworICAgIC8vIElmIHRoZSBsYXllciBkb2Vzbid0IGRyYXcgYW55dGhpbmcg
KGUuZy4gaXQncyBhIGNvbnRhaW5lciBsYXllcikgdGhlbiB3ZQorICAgIC8vIGRvbid0IGNyZWF0
ZSBhIGNhbnZhcyAvIGNvbnRleHQgZm9yIGl0LiBUaGUgcm9vdCBsYXllciBpcyBhIHNwZWNpYWwK
KyAgICAvLyBjYXNlIGFzIGV2ZW4gaWYgaXQncyBtYXJrZWQgYXMgYSBjb250YWluZXIgbGF5ZXIg
aXQgZG9lcyBhY3R1YWxseSBoYXZlCisgICAgLy8gY29udGVudCB0aGF0IGl0IGRyYXdzLgorICAg
IFJlbmRlckxheWVyQmFja2luZyogYmFja2luZyA9IHN0YXRpY19jYXN0PFJlbmRlckxheWVyQmFj
a2luZyo+KG1fb3duZXItPmNsaWVudCgpKTsKKyAgICBpZiAoIWRyYXdzQ29udGVudCgpICYmICEo
dGhpcyA9PSByb290TGF5ZXIoKSkpIHsKKyAgICAgICAgbV9ncmFwaGljc0NvbnRleHQuY2xlYXIo
KTsKKyAgICAgICAgbV9za2lhQ29udGV4dC5jbGVhcigpOworICAgICAgICBtX2NhbnZhcy5jbGVh
cigpOworICAgICAgICBtX2hhc0NvbnRleHQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKwogI2lmIFBMQVRGT1JNKFNLSUEpCiAgICAgLy8gQ3JlYXRlIG5ldyBjYW52YXMgYW5kIGNv
bnRleHQuIE93blB0ciB0YWtlcyBjYXJlIG9mIGZyZWVpbmcgdXAKICAgICAvLyB0aGUgb2xkIG9u
ZXMuCi0gICAgbV9jYW52YXMgPSBuZXcgc2tpYTo6UGxhdGZvcm1DYW52YXMoc2l6ZS53aWR0aCgp
LCBzaXplLmhlaWdodCgpLCBmYWxzZSk7CisgICAgbV9jYW52YXMgPSBuZXcgc2tpYTo6UGxhdGZv
cm1DYW52YXMobV9iYWNraW5nU3RvcmVTaXplLndpZHRoKCksIG1fYmFja2luZ1N0b3JlU2l6ZS5o
ZWlnaHQoKSwgZmFsc2UpOwogICAgIG1fc2tpYUNvbnRleHQgPSBuZXcgUGxhdGZvcm1Db250ZXh0
U2tpYShtX2NhbnZhcy5nZXQoKSk7CiAKICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBnZXQgdGV4
dCB0byBzaG93IHVwIGNvcnJlY3RseS4gV2l0aG91dCBpdCwKQEAgLTk1LDMxICsxMTMsMzIgQEAg
dm9pZCBMYXllckNocm9taXVtOjp1cGRhdGVHcmFwaGljc0NvbnRleAogICAgIG1fc2tpYUNvbnRl
eHQtPnNldERyYXdpbmdUb0ltYWdlQnVmZmVyKHRydWUpOwogCiAgICAgbV9ncmFwaGljc0NvbnRl
eHQgPSBuZXcgR3JhcGhpY3NDb250ZXh0KHJlaW50ZXJwcmV0X2Nhc3Q8UGxhdGZvcm1HcmFwaGlj
c0NvbnRleHQqPihtX3NraWFDb250ZXh0LmdldCgpKSk7CisKKyAgICBtX2hhc0NvbnRleHQgPSB0
cnVlOworICAgIG1fY29udGVudHNEaXJ0eSA9IHRydWU7CiAjZWxzZQogI2Vycm9yICJOZWVkIHRv
IGltcGxlbWVudCBmb3IgeW91ciBwbGF0Zm9ybS4iCiAjZW5kaWYKLSAgICAvLyBUaGUgYmFja2lu
ZyBzdG9yZSBhbGxvY2F0ZWQgZm9yIGEgbGF5ZXIgY2FuIGJlIHNtYWxsZXIgdGhhbiB0aGUgbGF5
ZXIncyBib3VuZHMuCi0gICAgLy8gVGhpcyBpcyBtb3N0bHkgdHJ1ZSBmb3IgdGhlIHJvb3QgbGF5
ZXIgd2hvc2UgYmFja2luZyBzdG9yZSBpcyBzaXplZCBiYXNlZCBvbiB0aGUgdmlzaWJsZQotICAg
IC8vIHBvcnRpb24gb2YgdGhlIGxheWVyIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgcGFnZSBzaXpl
LgotICAgIG1fYmFja2luZ1N0b3JlUmVjdCA9IHNpemU7CisKKyAgICByZXR1cm47Cit9CisKK3Zv
aWQgTGF5ZXJDaHJvbWl1bTo6ZHJhd3NDb250ZW50VXBkYXRlZCgpCit7CisgICAgLy8gQ3JlYXRl
IGEgZHJhd2luZyBjb250ZXh0IGlmIHRoZSBsYXllciBub3cgZHJhd3MgY29udGVudAorICAgIC8v
IG9yIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY29udGV4dCBpZiB0aGUgbGF5ZXIgZG9lc24ndCBkcmF3
CisgICAgLy8gY29udGVudCBhbnltb3JlLgorICAgIHVwZGF0ZUdyYXBoaWNzQ29udGV4dCgpOwog
fQogCiB2b2lkIExheWVyQ2hyb21pdW06OnVwZGF0ZUNvbnRlbnRzKCkKIHsKICAgICBSZW5kZXJM
YXllckJhY2tpbmcqIGJhY2tpbmcgPSBzdGF0aWNfY2FzdDxSZW5kZXJMYXllckJhY2tpbmcqPiht
X293bmVyLT5jbGllbnQoKSk7CiAKLSAgICBpZiAoYmFja2luZyAmJiAhYmFja2luZy0+cGFpbnRp
bmdHb2VzVG9XaW5kb3coKSkKKyAgICBpZiAoYmFja2luZyAmJiAhYmFja2luZy0+cGFpbnRpbmdH
b2VzVG9XaW5kb3coKSAmJiBkcmF3c0NvbnRlbnQoKSkKICAgICAgICAgbV9vd25lci0+cGFpbnRH
cmFwaGljc0xheWVyQ29udGVudHMoKm1fZ3JhcGhpY3NDb250ZXh0LCBJbnRSZWN0KDAsIDAsIG1f
Ym91bmRzLndpZHRoKCksIG1fYm91bmRzLmhlaWdodCgpKSk7Ci19CiAKLXZvaWQgTGF5ZXJDaHJv
bWl1bTo6ZHJhd0RlYnVnQm9yZGVyKCkKLXsKLSAgICBtX2dyYXBoaWNzQ29udGV4dC0+c2V0U3Ry
b2tlQ29sb3IobV9ib3JkZXJDb2xvciwgRGV2aWNlQ29sb3JTcGFjZSk7Ci0gICAgbV9ncmFwaGlj
c0NvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcyhtX2JvcmRlcldpZHRoKTsKLSAgICBtX2dyYXBo
aWNzQ29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQoMCwgMCksIEludFBvaW50KG1fYm91bmRzLndp
ZHRoKCksIDApKTsKLSAgICBtX2dyYXBoaWNzQ29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQoMCwg
MCksIEludFBvaW50KDAsIG1fYm91bmRzLmhlaWdodCgpKSk7Ci0gICAgbV9ncmFwaGljc0NvbnRl
eHQtPmRyYXdMaW5lKEludFBvaW50KG1fYm91bmRzLndpZHRoKCksIDApLCBJbnRQb2ludChtX2Jv
dW5kcy53aWR0aCgpLCBtX2JvdW5kcy5oZWlnaHQoKSkpOwotICAgIG1fZ3JhcGhpY3NDb250ZXh0
LT5kcmF3TGluZShJbnRQb2ludCgwLCBtX2JvdW5kcy5oZWlnaHQoKSksIEludFBvaW50KG1fYm91
bmRzLndpZHRoKCksIG1fYm91bmRzLmhlaWdodCgpKSk7CisgICAgbV9jb250ZW50c0RpcnR5ID0g
ZmFsc2U7CiB9CiAKIHZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0Q29udGVudHMoTmF0aXZlSW1hZ2VQ
dHIgY29udGVudHMpCkBAIC0xMjgsNiArMTQ3LDcgQEAgdm9pZCBMYXllckNocm9taXVtOjpzZXRD
b250ZW50cyhOYXRpdmVJbQogICAgIGlmIChtX2NvbnRlbnRzID09IGNvbnRlbnRzKQogICAgICAg
ICByZXR1cm47CiAgICAgbV9jb250ZW50cyA9IGNvbnRlbnRzOworICAgIG1fY29udGVudHNEaXJ0
eSA9IHRydWU7CiB9CiAKIHZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0TmVlZHNDb21taXQoKQpAQCAt
MjAxLDI4ICsyMjEsMjkgQEAgaW50IExheWVyQ2hyb21pdW06OmluZGV4T2ZTdWJsYXllcihjb25z
dAogICAgIHJldHVybiAtMTsKIH0KIAotdm9pZCBMYXllckNocm9taXVtOjpzZXRCYWNraW5nU3Rv
cmVSZWN0KGNvbnN0IEludFNpemUmIHJlY3QpCisvLyBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVk
IHRvIG92ZXJpZGUgdGhlIHNpemUgb2YgdGhlIGJhY2tpbmcgc3RvcmUKKy8vIHVzZWQgZm9yIHRo
ZSBsYXllci4gSXQncyB0eXBpY2FsbHkgY2FsbGVkIG9uIHRoZSByb290IGxheWVyIHRvIGxpbWl0
CisvLyBpdHMgc2l6ZSB0byB0aGUgYWN0dWFsIHZpc2libGUgc2l6ZS4KK3ZvaWQgTGF5ZXJDaHJv
bWl1bTo6c2V0QmFja2luZ1N0b3JlU2l6ZShjb25zdCBJbnRTaXplJiBzaXplKQogewotICAgIGlm
IChtX2JhY2tpbmdTdG9yZVJlY3QgPT0gcmVjdCkKKyAgICBpZiAobV9iYWNraW5nU3RvcmVTaXpl
ID09IHNpemUpCiAgICAgICAgIHJldHVybjsKIAotICAgIHVwZGF0ZUdyYXBoaWNzQ29udGV4dChy
ZWN0KTsKKyAgICBtX2JhY2tpbmdTdG9yZVNpemUgPSBzaXplOworICAgIHVwZGF0ZUdyYXBoaWNz
Q29udGV4dCgpOworICAgIHNldE5lZWRzQ29tbWl0KCk7CiB9CiAKLXZvaWQgTGF5ZXJDaHJvbWl1
bTo6c2V0Qm91bmRzKGNvbnN0IEludFNpemUmIHJlY3QpCit2b2lkIExheWVyQ2hyb21pdW06OnNl
dEJvdW5kcyhjb25zdCBJbnRTaXplJiBzaXplKQogewotICAgIGlmIChyZWN0ID09IG1fYm91bmRz
KQorICAgIGlmIChtX2JvdW5kcyA9PSBzaXplKQogICAgICAgICByZXR1cm47CiAKLSAgICBtX2Jv
dW5kcyA9IHJlY3Q7CisgICAgbV9ib3VuZHMgPSBzaXplOworICAgIG1fYmFja2luZ1N0b3JlU2l6
ZSA9IHNpemU7CiAKICAgICAvLyBSZS1jcmVhdGUgdGhlIGNhbnZhcyBhbmQgYXNzb2NpYXRlZCBj
b250ZXh0cy4KLSAgICB1cGRhdGVHcmFwaGljc0NvbnRleHQobV9ib3VuZHMpOwotCi0gICAgLy8g
TGF5ZXIgY29udGVudHMgbmVlZCB0byBiZSByZWRyYXduIGFzIHRoZSBiYWNraW5nIHN1cmZhY2UK
LSAgICAvLyB3YXMgcmVjcmVhdGVkIGFib3ZlLgotICAgIHVwZGF0ZUNvbnRlbnRzKCk7Ci0KKyAg
ICB1cGRhdGVHcmFwaGljc0NvbnRleHQoKTsKICAgICBzZXROZWVkc0NvbW1pdCgpOwogfQogCkBA
IC0yNzAsOCArMjkxLDExIEBAIExheWVyQ2hyb21pdW0qIExheWVyQ2hyb21pdW06OnN1cGVybGF5
ZXIKIAogdm9pZCBMYXllckNocm9taXVtOjpzZXROZWVkc0Rpc3BsYXkoY29uc3QgRmxvYXRSZWN0
JiBkaXJ0eVJlY3QpCiB7Ci0gICAgLy8gUmVkcmF3IHRoZSBjb250ZW50cyBvZiB0aGUgbGF5ZXIu
Ci0gICAgdXBkYXRlQ29udGVudHMoKTsKKyAgICAvLyBTaW1wbHkgbWFyayB0aGUgY29udGVudHMg
YXMgZGlydHkuIFRoZSBhY3R1YWwgcmVkcmF3IHdpbGwKKyAgICAvLyBoYXBwZW4gd2hlbiBpdCdz
IHRpbWUgdG8gZG8gdGhlIGNvbXBvc2l0aW5nLgorICAgIC8vIEZJWE1FOiBTaG91bGQgb25seSB1
cGRhdGUgdGhlIGRpcnR5IHJlY3QgaW5zdGVhZCBvZiBtYXJraW5nCisgICAgLy8gICAgICAgIHRo
ZSBlbnRpcmUgbGF5ZXIgZGlydHkuCisgICAgbV9jb250ZW50c0RpcnR5ID0gdHJ1ZTsKIAogICAg
IHNldE5lZWRzQ29tbWl0KCk7CiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0xheWVyQ2hyb21pdW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uaAkocmV2aXNpb24gNTk2MTIpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uaAkod29ya2luZyBj
b3B5KQpAQCAtMTUxLDYgKzE1MSw3IEBAIHB1YmxpYzoKICAgICBib29sIGdlb21ldHJ5RmxpcHBl
ZCgpIGNvbnN0IHsgcmV0dXJuIG1fZ2VvbWV0cnlGbGlwcGVkOyB9CiAKICAgICB2b2lkIHVwZGF0
ZUNvbnRlbnRzKCk7CisgICAgYm9vbCBjb250ZW50c0RpcnR5KCkgeyByZXR1cm4gbV9jb250ZW50
c0RpcnR5OyB9CiAKICAgICB2b2lkIHNldENvbnRlbnRzKE5hdGl2ZUltYWdlUHRyIGNvbnRlbnRz
KTsKICAgICBOYXRpdmVJbWFnZVB0ciBjb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVu
dHM7IH0KQEAgLTE1OCw5ICsxNTksMTMgQEAgcHVibGljOgogICAgIHNraWE6OlBsYXRmb3JtQ2Fu
dmFzKiBwbGF0Zm9ybUNhbnZhcygpIHsgcmV0dXJuIG1fY2FudmFzLmdldCgpOyB9CiAgICAgR3Jh
cGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQoKSB7IHJldHVybiBtX2dyYXBoaWNzQ29udGV4
dC5nZXQoKTsgfQogCi0gICAgdm9pZCBzZXRCYWNraW5nU3RvcmVSZWN0KGNvbnN0IEludFNpemUm
KTsKKyAgICB2b2lkIHNldEJhY2tpbmdTdG9yZVNpemUoY29uc3QgSW50U2l6ZSYpOwogCi0gICAg
dm9pZCBkcmF3RGVidWdCb3JkZXIoKTsKKyAgICBib29sIGRyYXdzQ29udGVudCgpIHsgcmV0dXJu
IG1fb3duZXIgJiYgbV9vd25lci0+ZHJhd3NDb250ZW50KCk7IH0KKworICAgIC8vIFRoaXMgbWV0
aG9kIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUgc3RhdHVzIGRyYXdzQ29udGVudCgp
CisgICAgLy8gc3RhdHVzIGNoYW5nZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGludGVybmFsIGdyYXBo
aWNzIGNvbnRleHQgaXMgaW4gc3luYy4KKyAgICB2b2lkIGRyYXdzQ29udGVudFVwZGF0ZWQoKTsK
IAogcHJpdmF0ZToKICAgICBMYXllckNocm9taXVtKExheWVyVHlwZSwgR3JhcGhpY3NMYXllckNo
cm9taXVtKiBvd25lcik7CkBAIC0xODQsNyArMTg5LDggQEAgcHJpdmF0ZToKIAogICAgIC8vIFJl
LWNyZWF0ZXMgdGhlIGNhbnZhcyBhbmQgZ3JhcGhpY3MgY29udGV4dC4gVGhpcyBtZXRob2QKICAg
ICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBsYXllciBpcyByZXNpemVkLiBPbmx5
IGxheWVycwotICAgIHZvaWQgdXBkYXRlR3JhcGhpY3NDb250ZXh0KGNvbnN0IEludFNpemUmKTsK
KyAgICAvLyB0aGF0IGRvIGRyYXdpbmcgYW5kIHRoZSByb290IGxheWVyIGdldCBhIGNvbnRleHQu
CisgICAgdm9pZCB1cGRhdGVHcmFwaGljc0NvbnRleHQoKTsKIAogICAgIFZlY3RvcjxSZWZQdHI8
TGF5ZXJDaHJvbWl1bT4gPiBtX3N1YmxheWVyczsKICAgICBMYXllckNocm9taXVtKiBtX3N1cGVy
bGF5ZXI7CkBAIC0xOTUsMTEgKzIwMSwxMiBAQCBwcml2YXRlOgogICAgIE93blB0cjxQbGF0Zm9y
bUNvbnRleHRTa2lhPiBtX3NraWFDb250ZXh0OwogICAgIE93blB0cjxHcmFwaGljc0NvbnRleHQ+
IG1fZ3JhcGhpY3NDb250ZXh0OwogI2VuZGlmCisgICAgYm9vbCBtX2hhc0NvbnRleHQ7CiAKICAg
ICBMYXllclR5cGUgbV9sYXllclR5cGU7CiAKICAgICBJbnRTaXplIG1fYm91bmRzOwotICAgIElu
dFNpemUgbV9iYWNraW5nU3RvcmVSZWN0OworICAgIEludFNpemUgbV9iYWNraW5nU3RvcmVTaXpl
OwogICAgIEZsb2F0UG9pbnQgbV9wb3NpdGlvbjsKICAgICBGbG9hdFBvaW50IG1fYW5jaG9yUG9p
bnQ7CiAgICAgQ29sb3IgbV9iYWNrZ3JvdW5kQ29sb3I7CkBAIC0yMjMsNiArMjMwLDggQEAgcHJp
dmF0ZToKICAgICBib29sIG1fZ2VvbWV0cnlGbGlwcGVkOwogICAgIGJvb2wgbV9uZWVkc0Rpc3Bs
YXlPbkJvdW5kc0NoYW5nZTsKIAorICAgIGJvb2wgbV9jb250ZW50c0RpcnR5OworCiAgICAgQ29u
dGVudHNHcmF2aXR5VHlwZSBtX2NvbnRlbnRzR3Jhdml0eTsKICAgICBOYXRpdmVJbWFnZVB0ciBt
X2NvbnRlbnRzOwogICAgIFN0cmluZyBtX25hbWU7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0u
Y3BwCShyZXZpc2lvbiA1OTYxMikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsMTA1ICsz
NCw2ODIgQEAKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAjaW5jbHVkZSAiTGF5
ZXJSZW5kZXJlckNocm9taXVtLmgiCiAKKyNpbmNsdWRlICJHTEVTMkNvbnRleHQuaCIKICNpbmNs
dWRlICJMYXllckNocm9taXVtLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNs
dWRlICJQYWdlLmgiCisjaWYgUExBVEZPUk0oU0tJQSkKKyNpbmNsdWRlICJOYXRpdmVJbWFnZVNr
aWEuaCIKICNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHRTa2lhLmgiCi0jaW5jbHVkZSAic2tpYS9l
eHQvcGxhdGZvcm1fY2FudmFzLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLVBhc3NPd25QdHI8TGF5ZXJSZW5kZXJlckNocm9taXVt
PiBMYXllclJlbmRlcmVyQ2hyb21pdW06OmNyZWF0ZSgpCitzdGF0aWMgV1RGTG9nQ2hhbm5lbCBM
b2dMYXllclJlbmRlcmVyID0geyAweDAwMDAwMDAwLCAiTGF5ZXJSZW5kZXJlciIsIFdURkxvZ0No
YW5uZWxPbiB9OworCitzdGF0aWMgdm9pZCBjaGVja0dMRXJyb3IoKQoreworI2lmbmRlZiBOREVC
VUcKKyAgICBHTGVudW0gZXJyb3IgPSBnbEdldEVycm9yKCk7CisgICAgaWYgKGVycm9yKQorICAg
ICAgICBMT0dfRVJST1IoIkdMIEVycm9yOiAlZCAiICwgZXJyb3IpOworI2VuZGlmCit9CisKK3N0
YXRpYyBHTHVpbnQgbG9hZFNoYWRlcihHTGVudW0gdHlwZSwgY29uc3QgY2hhciogc2hhZGVyU291
cmNlKQoreworICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcih0eXBlKTsKKyAgICBp
ZiAoIXNoYWRlcikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVy
LCAxLCAmc2hhZGVyU291cmNlLCAwKTsKKyAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKyAg
ICBHTGludCBjb21waWxlZDsKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9T
VEFUVVMsICZjb21waWxlZCk7CisgICAgaWYgKCFjb21waWxlZCkgeworICAgICAgICBnbERlbGV0
ZVNoYWRlcihzaGFkZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHNo
YWRlcjsKK30KKworc3RhdGljIEdMdWludCBsb2FkU2hhZGVyUHJvZ3JhbShjb25zdCBjaGFyKiB2
ZXJ0ZXhTaGFkZXJTb3VyY2UsIGNvbnN0IGNoYXIqIGZyYWdtZW50U2hhZGVyU291cmNlKQorewor
ICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXI7CisgICAgR0x1aW50IGZyYWdtZW50U2hhZGVyOworICAg
IEdMdWludCBwcm9ncmFtT2JqZWN0OworICAgIEdMaW50IGxpbmtlZDsKKyAgICB2ZXJ0ZXhTaGFk
ZXIgPSBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHZlcnRleFNoYWRlclNvdXJjZSk7Cisg
ICAgaWYgKCF2ZXJ0ZXhTaGFkZXIpCisgICAgICAgIHJldHVybiAwOworICAgIGZyYWdtZW50U2hh
ZGVyID0gbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNl
KTsKKyAgICBpZiAoIWZyYWdtZW50U2hhZGVyKSB7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHZl
cnRleFNoYWRlcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwcm9ncmFtT2JqZWN0
ID0gZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgaWYgKCFwcm9ncmFtT2JqZWN0KQorICAgICAgICBy
ZXR1cm4gMDsKKyAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtT2JqZWN0LCB2ZXJ0ZXhTaGFkZXIp
OworICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW1PYmplY3QsIGZyYWdtZW50U2hhZGVyKTsKKyAg
ICBnbExpbmtQcm9ncmFtKHByb2dyYW1PYmplY3QpOworICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dy
YW1PYmplY3QsIEdMX0xJTktfU1RBVFVTLCAmbGlua2VkKTsKKyAgICBpZiAoIWxpbmtlZCkgewor
ICAgICAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbU9iamVjdCk7CisgICAgICAgIHJldHVybiAw
OworICAgIH0KKyAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOworICAgIGdsRGVsZXRl
U2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICByZXR1cm4gcHJvZ3JhbU9iamVjdDsKK30KKwor
c3RhdGljIHZvaWQgdG9HTE1hdHJpeChmbG9hdCogZmxhdHRlbmVkLCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgbSkKK3sKKyAgICBmbGF0dGVuZWRbMF0gPSBtLm0xMSgpOworICAgIGZsYXR0
ZW5lZFsxXSA9IG0ubTEyKCk7CisgICAgZmxhdHRlbmVkWzJdID0gbS5tMTMoKTsKKyAgICBmbGF0
dGVuZWRbM10gPSBtLm0xNCgpOworICAgIGZsYXR0ZW5lZFs0XSA9IG0ubTIxKCk7CisgICAgZmxh
dHRlbmVkWzVdID0gbS5tMjIoKTsKKyAgICBmbGF0dGVuZWRbNl0gPSBtLm0yMygpOworICAgIGZs
YXR0ZW5lZFs3XSA9IG0ubTI0KCk7CisgICAgZmxhdHRlbmVkWzhdID0gbS5tMzEoKTsKKyAgICBm
bGF0dGVuZWRbOV0gPSBtLm0zMigpOworICAgIGZsYXR0ZW5lZFsxMF0gPSBtLm0zMygpOworICAg
IGZsYXR0ZW5lZFsxMV0gPSBtLm0zNCgpOworICAgIGZsYXR0ZW5lZFsxMl0gPSBtLm00MSgpOwor
ICAgIGZsYXR0ZW5lZFsxM10gPSBtLm00MigpOworICAgIGZsYXR0ZW5lZFsxNF0gPSBtLm00Mygp
OworICAgIGZsYXR0ZW5lZFsxNV0gPSBtLm00NCgpOworfQorCitzdGF0aWMgVHJhbnNmb3JtYXRp
b25NYXRyaXggb3J0aG9NYXRyaXgoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRv
bSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyWiwgZmxvYXQgZmFyWikKK3sKKyAgICBmbG9hdCBkZWx0
YVggPSByaWdodCAtIGxlZnQ7CisgICAgZmxvYXQgZGVsdGFZID0gdG9wIC0gYm90dG9tOworICAg
IGZsb2F0IGRlbHRhWiA9IGZhclogLSBuZWFyWjsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBv
cnRobzsKKyAgICBpZiAoIWRlbHRhWCB8fCAhZGVsdGFZIHx8ICFkZWx0YVopCisgICAgICAgIHJl
dHVybiBvcnRobzsKKyAgICBvcnRoby5zZXRNMTEoMi4wZiAvIGRlbHRhWCk7CisgICAgb3J0aG8u
c2V0TTQxKC0ocmlnaHQgKyBsZWZ0KSAvIGRlbHRhWCk7CisgICAgb3J0aG8uc2V0TTIyKDIuMGYg
LyBkZWx0YVkpOworICAgIG9ydGhvLnNldE00MigtKHRvcCArIGJvdHRvbSkgLyBkZWx0YVkpOwor
ICAgIG9ydGhvLnNldE0zMygtMi4wZiAvIGRlbHRhWik7CisgICAgb3J0aG8uc2V0TTQzKC0obmVh
clogKyBmYXJaKSAvIGRlbHRhWik7CisgICAgcmV0dXJuIG9ydGhvOworfQorCisvLyBDcmVhdGVz
IGEgR0wgdGV4dHVyZSBvYmplY3QgdG8gYmUgdXNlZCBmb3IgdHJhbnNmZXJpbmcgdGhlIGxheWVy
J3MgYml0bWFwIGludG8uCitzdGF0aWMgR0x1aW50IGNyZWF0ZUxheWVyVGV4dHVyZSgpCiB7Ci0g
ICAgcmV0dXJuIG5ldyBMYXllclJlbmRlcmVyQ2hyb21pdW0oKTsKKyAgICBHTHVpbnQgdGV4dHVy
ZUlkID0gMDsKKyAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlSWQpOworICAgIGdsQmluZFRl
eHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZUlkKTsKKyAgICAvLyBEbyBiYXNpYyBsaW5lYXIg
ZmlsdGVyaW5nIG9uIHJlc2l6ZS4KKyAgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwg
R0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyZihH
TF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgLy8g
TlBPVCB0ZXh0dXJlcyBpbiBHTCBFUyBvbmx5IHdvcmsgd2hlbiB0aGUgd3JhcCBtb2RlIGlzIHNl
dCB0byBHTF9DTEFNUF9UT19FREdFLgorICAgIGdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJE
LCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0
ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsK
KyAgICByZXR1cm4gdGV4dHVyZUlkOwogfQogCi1MYXllclJlbmRlcmVyQ2hyb21pdW06OkxheWVy
UmVuZGVyZXJDaHJvbWl1bSgpCisKK1Bhc3NPd25QdHI8TGF5ZXJSZW5kZXJlckNocm9taXVtPiBM
YXllclJlbmRlcmVyQ2hyb21pdW06OmNyZWF0ZShQYWdlKiBwYWdlKQoreworICAgIHJldHVybiBu
ZXcgTGF5ZXJSZW5kZXJlckNocm9taXVtKHBhZ2UpOworfQorCitMYXllclJlbmRlcmVyQ2hyb21p
dW06OkxheWVyUmVuZGVyZXJDaHJvbWl1bShQYWdlKiBwYWdlKQogICAgIDogbV9yb290TGF5ZXIo
MCkKICAgICAsIG1fbmVlZHNEaXNwbGF5KGZhbHNlKQorICAgICwgbV9sYXllclByb2dyYW1PYmpl
Y3QoMCkKKyAgICAsIG1fYm9yZGVyUHJvZ3JhbU9iamVjdCgwKQorICAgICwgbV9zY3JvbGxQcm9n
cmFtT2JqZWN0KDApCisgICAgLCBtX3Bvc2l0aW9uTG9jYXRpb24oMCkKKyAgICAsIG1fdGV4Q29v
cmRMb2NhdGlvbigxKQorICAgICwgbV9wYWdlKHBhZ2UpCisgICAgLCBtX3Jvb3RMYXllclRleHR1
cmVXaWR0aCgwKQorICAgICwgbV9yb290TGF5ZXJUZXh0dXJlSGVpZ2h0KDApCiB7CisgICAgbV9x
dWFkVmJvSWRzW1ZlcnRpY2VzXSA9IG1fcXVhZFZib0lkc1tMYXllckVsZW1lbnRzXSA9IDA7Cisg
ICAgbV9oYXJkd2FyZUNvbXBvc2l0aW5nID0gKGluaXRHTCgpICYmIGluaXRpYWxpemVTaGFyZWRH
TE9iamVjdHMoKSk7CiB9CiAKIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6fkxheWVyUmVuZGVyZXJD
aHJvbWl1bSgpCiB7CisgICAgaWYgKG1faGFyZHdhcmVDb21wb3NpdGluZykgeworICAgICAgICBt
YWtlQ29udGV4dEN1cnJlbnQoKTsKKyAgICAgICAgZ2xEZWxldGVCdWZmZXJzKDMsIG1fcXVhZFZi
b0lkcyk7CisgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShtX2xheWVyUHJvZ3JhbU9iamVjdCk7Cisg
ICAgICAgIGdsRGVsZXRlUHJvZ3JhbShtX3Njcm9sbFByb2dyYW1PYmplY3QpOworICAgICAgICBn
bERlbGV0ZVByb2dyYW0obV9ib3JkZXJQcm9ncmFtT2JqZWN0KTsKKyAgICB9CiB9CiAKLXZvaWQg
TGF5ZXJSZW5kZXJlckNocm9taXVtOjp1cGRhdGVMYXllckNvbnRlbnRzKCkKK3ZvaWQgTGF5ZXJS
ZW5kZXJlckNocm9taXVtOjpkcmF3VGV4dHVyZWRRdWFkKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0
cml4JiBtYXRyaXgsIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIGZsb2F0IG9wYWNpdHksIGJv
b2wgc2Nyb2xsaW5nKQogewotICAgIGlmIChtX3Jvb3RMYXllcikKLSAgICAgICAgdXBkYXRlTGF5
ZXJDb250ZW50c1JlY3Vyc2l2ZShtX3Jvb3RMYXllci5nZXQoKSk7CisgICAgc3RhdGljIEdMZmxv
YXQgZ2xNYXRyaXhbMTZdOworCisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggcmVuZGVyTWF0cml4
ID0gbWF0cml4OworCisgICAgLy8gQXBwbHkgYSBzY2FsaW5nIGZhY3RvciB0byBzaXplIHRoZSBx
dWFkIGZyb20gMXgxIHRvIGl0cyBpbnRlbmRlZCBzaXplLgorICAgIHJlbmRlck1hdHJpeC5zY2Fs
ZTNkKHdpZHRoLCBoZWlnaHQsIDEpOworCisgICAgLy8gQXBwbHkgdGhlIHByb2plY3Rpb24gbWF0
cml4IGJlZm9yZSBzZW5kaW5nIHRoZSB0cmFuc2Zvcm0gb3ZlciB0byB0aGUgc2hhZGVyLgorICAg
IHJlbmRlck1hdHJpeC5tdWx0aXBseShtX3Byb2plY3Rpb25NYXRyaXgpOworCisgICAgdG9HTE1h
dHJpeCgmZ2xNYXRyaXhbMF0sIHJlbmRlck1hdHJpeCk7CisKKyAgICBpbnQgbWF0cml4TG9jYXRp
b24gPSAoc2Nyb2xsaW5nID8gbV9zY3JvbGxNYXRyaXhMb2NhdGlvbiA6IG1fbWF0cml4TG9jYXRp
b24pOworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihtYXRyaXhMb2NhdGlvbiwgMSwgZmFsc2UsICZn
bE1hdHJpeFswXSk7CisKKyAgICBpZiAoIXNjcm9sbGluZykKKyAgICAgICAgZ2xVbmlmb3JtMWYo
bV9hbHBoYUxvY2F0aW9uLCBvcGFjaXR5KTsKKworICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFO
R0xFUywgNiwgR0xfVU5TSUdORURfU0hPUlQsIDApOwogfQogCi0jaWYgUExBVEZPUk0oU0tJQSkK
LXZvaWQgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3TGF5ZXJzSW5DYW52YXMoc2tpYTo6UGxh
dGZvcm1DYW52YXMqIGNhbnZhcywgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpCisKKy8vIFVwZGF0
ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSByb290IGxheWVyIHRleHR1cmUgdGhhdCBmYWxsIGluc2lk
ZSB0aGUgdXBkYXRlUmVjdAorLy8gYW5kIHJlLWNvbXBvc2l0cyBhbGwgc3VibGF5ZXJzLgordm9p
ZCBMYXllclJlbmRlcmVyQ2hyb21pdW06OmRyYXdMYXllcnMoY29uc3QgSW50UmVjdCYgdXBkYXRl
UmVjdCwgY29uc3QgSW50UmVjdCYgdmlzaWJsZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBJbnRSZWN0JiBjb250ZW50UmVjdCwgY29uc3QgSW50UG9p
bnQmIHNjcm9sbFBvc2l0aW9uKQogeworICAgIEFTU0VSVChtX2hhcmR3YXJlQ29tcG9zaXRpbmcp
OworCiAgICAgaWYgKCFtX3Jvb3RMYXllcikKICAgICAgICAgcmV0dXJuOwogCi0gICAgY2FudmFz
LT5zYXZlKCk7Ci0gICAgY2FudmFzLT5jbGlwUmVjdChTa1JlY3QoY2xpcFJlY3QpKTsKLQotICAg
IC8vIEZpcnN0IGNvbXBvc2l0ZSB0aGUgcm9vdCBsYXllciBpbnRvIHRoZSBjYW52YXMuCi0gICAg
Y2FudmFzLT5kcmF3Qml0bWFwKG1fcm9vdExheWVyLT5wbGF0Zm9ybUNhbnZhcygpLT5nZXREZXZp
Y2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKSwgMCwgMCwgMCk7CisgICAgLy8gSWYgdGhlIHNpemUg
b2YgdGhlIHZpc2libGUgYXJlYSBoYXMgY2hhbmdlZCB0aGVuIGFsbG9jYXRlIGEgbmV3IHRleHR1
cmUKKyAgICAvLyB0byBzdG9yZSB0aGUgY29udGVudHMgb2YgdGhlIHJvb3QgbGF5ZXIgYW5kIGFk
anVzdCB0aGUgcHJvamVjdGlvbiBtYXRyaXgKKyAgICAvLyBhbmQgdmlld3BvcnQuCisgICAgbWFr
ZUNvbnRleHRDdXJyZW50KCk7CisKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1f
cm9vdExheWVyVGV4dHVyZUlkKTsKKworICAgIHVuc2lnbmVkIGludCB2aXNpYmxlUmVjdFdpZHRo
ID0gdmlzaWJsZVJlY3Qud2lkdGgoKTsKKyAgICB1bnNpZ25lZCBpbnQgdmlzaWJsZVJlY3RIZWln
aHQgPSB2aXNpYmxlUmVjdC5oZWlnaHQoKTsKKyAgICBpZiAodmlzaWJsZVJlY3RXaWR0aCAhPSBt
X3Jvb3RMYXllclRleHR1cmVXaWR0aCB8fCB2aXNpYmxlUmVjdEhlaWdodCAhPSBtX3Jvb3RMYXll
clRleHR1cmVIZWlnaHQpIHsKKyAgICAgICAgbV9yb290TGF5ZXJUZXh0dXJlV2lkdGggPSB2aXNp
YmxlUmVjdC53aWR0aCgpOworICAgICAgICBtX3Jvb3RMYXllclRleHR1cmVIZWlnaHQgPSB2aXNp
YmxlUmVjdC5oZWlnaHQoKTsKKworICAgICAgICBtX3Byb2plY3Rpb25NYXRyaXggPSBvcnRob01h
dHJpeCgwLCB2aXNpYmxlUmVjdFdpZHRoICsgMC41LCB2aXNpYmxlUmVjdEhlaWdodCArIDAuNSwg
MCwgLTEwMDAsIDEwMDApOworICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwg
R0xfUkdCQSwgbV9yb290TGF5ZXJUZXh0dXJlV2lkdGgsIG1fcm9vdExheWVyVGV4dHVyZUhlaWdo
dCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgMCk7CisgICAgfQorCisgICAgLy8gVGhl
IEdMIHZpZXdwb3J0IGNvdmVycyB0aGUgZW50aXJlIHZpc2libGUgYXJlYSwgaW5jbHVkaW5nIHRo
ZSBzY3JvbGxiYXJzLgorICAgIGdsVmlld3BvcnQoMCwgMCwgdmlzaWJsZVJlY3RXaWR0aCwgdmlz
aWJsZVJlY3RIZWlnaHQpOworCisgICAgLy8gVGhlIGxheWVyLCBzY3JvbGwgYW5kIGRlYnVnIGJv
cmRlciBzaGFkZXJzIGFsbCB1c2UgdGhlIHNhbWUgdmVydGV4IGF0dHJpYnV0ZXMKKyAgICAvLyBz
byB3ZSBjYW4gYmluZCB0aGVtIG9ubHkgb25jZS4KKyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlf
QlVGRkVSLCBtX3F1YWRWYm9JZHNbVmVydGljZXNdKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxF
TUVOVF9BUlJBWV9CVUZGRVIsIG1fcXVhZFZib0lkc1tMYXllckVsZW1lbnRzXSk7CisgICAgR0x1
aW50IG9mZnNldCA9IDA7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1fcG9zaXRpb25Mb2Nh
dGlvbiwgMywgR0xfRkxPQVQsIEdMX0ZBTFNFLCA1ICogc2l6ZW9mKEdMZmxvYXQpLCAoR0x2b2lk
Kikob2Zmc2V0KSk7CisgICAgb2Zmc2V0ICs9IDMgKiBzaXplb2YoR0xmbG9hdCk7CisgICAgZ2xW
ZXJ0ZXhBdHRyaWJQb2ludGVyKG1fdGV4Q29vcmRMb2NhdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZB
TFNFLCA1ICogc2l6ZW9mKEdMZmxvYXQpLCAoR0x2b2lkKikob2Zmc2V0KSk7CisgICAgZ2xFbmFi
bGVWZXJ0ZXhBdHRyaWJBcnJheShtX3Bvc2l0aW9uTG9jYXRpb24pOworICAgIGdsRW5hYmxlVmVy
dGV4QXR0cmliQXJyYXkobV90ZXhDb29yZExvY2F0aW9uKTsKKyAgICBnbEFjdGl2ZVRleHR1cmUo
R0xfVEVYVFVSRTApOworICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICBnbERpc2Fi
bGUoR0xfQ1VMTF9GQUNFKTsKKworICAgIEludFBvaW50IHNjcm9sbERlbHRhID0gdG9Qb2ludChz
Y3JvbGxQb3NpdGlvbiAtIG1fc2Nyb2xsUG9zaXRpb24pOworICAgIC8vIFNjcm9sbCBvbmx5IHdo
ZW4gdGhlIHVwZGF0ZVJlY3QgY29udGFpbnMgcGl4ZWxzIGZvciB0aGUgbmV3bHkgdW5jb3ZlcmVk
IHJlZ2lvbiB0byBhdm9pZCBmbGFzaGluZy4KKyAgICBpZiAoKHNjcm9sbERlbHRhLngoKSAmJiB1
cGRhdGVSZWN0LndpZHRoKCkgPj0gYWJzKHNjcm9sbERlbHRhLngoKSkgJiYgdXBkYXRlUmVjdC5o
ZWlnaHQoKSA+PSBjb250ZW50UmVjdC5oZWlnaHQoKSkKKyAgICAgICAgfHwgKHNjcm9sbERlbHRh
LnkoKSAmJiB1cGRhdGVSZWN0LmhlaWdodCgpID49IGFicyhzY3JvbGxEZWx0YS55KCkpICYmIHVw
ZGF0ZVJlY3Qud2lkdGgoKSA+PSBjb250ZW50UmVjdC53aWR0aCgpKSkgeworICAgICAgICAvLyBT
Y3JvbGxpbmcgd29ya3MgYXMgZm9sbG93czogV2UgcmVuZGVyIGEgcXVhZCB3aXRoIHRoZSBjdXJy
ZW50IHJvb3QgbGF5ZXIgY29udGVudHMKKyAgICAgICAgLy8gdHJhbnNsYXRlZCBieSB0aGUgYW1v
dW50IHRoZSBwYWdlIGhhcyBzY3JvbGxlZCBzaW5jZSB0aGUgbGFzdCB1cGRhdGUgYW5kIHRoZW4g
cmVhZCB0aGUKKyAgICAgICAgLy8gcGl4ZWxzIG9mIHRoZSBjb250ZW50IGFyZWEgKHZpc2libGUg
YXJlYSBleGNsdWRpbmcgdGhlIHNjcm9sbCBiYXJzKSBiYWNrIGludG8gdGhlCisgICAgICAgIC8v
IHJvb3QgbGF5ZXIgdGV4dHVyZS4gVGhlIG5ld2x5IGV4cG9zZWQgYXJlYSBpcyBzdWJlc3F1ZW50
bHkgZmlsbGVkIGFzIHVzdWFsIHdpdGgKKyAgICAgICAgLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSB1
cGRhdGVSZWN0LgorICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBzY3JvbGxlZExheWVyTWF0
cml4OworICAgICAgICBzY3JvbGxlZExheWVyTWF0cml4LnRyYW5zbGF0ZTNkKChpbnQpZmxvb3Jm
KDAuNSAqIHZpc2libGVSZWN0LndpZHRoKCkgKyAwLjUpIC0gc2Nyb2xsRGVsdGEueCgpLAorICAg
ICAgICAgICAgKGludClmbG9vcmYoMC41ICogdmlzaWJsZVJlY3QuaGVpZ2h0KCkgKyAwLjUpICsg
c2Nyb2xsRGVsdGEueSgpLCAwKTsKKyAgICAgICAgc2Nyb2xsZWRMYXllck1hdHJpeC5zY2FsZTNk
KDEsIC0xLCAxKTsKKworICAgICAgICAvLyBTd2l0Y2ggc2hhZGVycyB0byBhdm9pZCBSR0Igc3dp
enpsaW5nLgorICAgICAgICBnbFVzZVByb2dyYW0obV9zY3JvbGxQcm9ncmFtT2JqZWN0KTsKKyAg
ICAgICAgZ2xVbmlmb3JtMWkobV9zY3JvbGxTYW1wbGVyTG9jYXRpb24sIDApOworCisgICAgICAg
IGRyYXdUZXh0dXJlZFF1YWQoc2Nyb2xsZWRMYXllck1hdHJpeCwgdmlzaWJsZVJlY3Qud2lkdGgo
KSwgdmlzaWJsZVJlY3QuaGVpZ2h0KCksIDEsIHRydWUpOworCisgICAgICAgIGdsQ29weVRleFN1
YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMCwgMCwgY29udGVudFJlY3Qud2lkdGgo
KSwgY29udGVudFJlY3QuaGVpZ2h0KCkpOworCisgICAgICAgIGNoZWNrR0xFcnJvcigpOworICAg
ICAgICBtX3Njcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247CisgICAgfQorCisgICAgLy8g
RklYTUU6IFRoZSBmb2xsb3dpbmcgY2hlY2sgc2hvdWxkIGdvIGF3YXkgd2hlbiB0aGUgY29tcG9z
aXRvciByZW5kZXJzIGluZGVwZW5kZW50bHkgZnJvbSBpdHMgb3duIHRocmVhZC4KKyAgICAvLyBJ
Z25vcmUgYSAxeDEgdXBkYXRlIHJlY3QgYXQgKDAsIDApIGFzIHRoYXQncyB1c2VkIGEgd2F5IHRv
IGtpY2sgb2ZmIGEgcmVkcmF3IGZvciB0aGUgY29tcG9zaXRvci4KKyAgICBpZiAoISghdXBkYXRl
UmVjdC54KCkgJiYgIXVwZGF0ZVJlY3QueSgpICYmIHVwZGF0ZVJlY3Qud2lkdGgoKSA9PSAxICYm
IHVwZGF0ZVJlY3QuaGVpZ2h0KCkgPT0gMSkpIHsKKyAgICAgICAgLy8gVXBkYXRlIHRoZSByb290
IGxheWVyIHRleHR1cmUuCisgICAgICAgIEFTU0VSVCgodXBkYXRlUmVjdC54KCkgKyB1cGRhdGVS
ZWN0LndpZHRoKCkgPD0gbV9yb290TGF5ZXJUZXh0dXJlV2lkdGgpCisgICAgICAgICAgICAgICAm
JiAodXBkYXRlUmVjdC55KCkgKyB1cGRhdGVSZWN0LmhlaWdodCgpIDw9IG1fcm9vdExheWVyVGV4
dHVyZUhlaWdodCkpOwogCi0gICAgLy8gQWNjb3VudCBmb3IgdGhlIHNjcm9sbCBvZmZzZXQgYmVm
b3JlIGNvbXBvc2l0aW5nIHRoZSByZW1haW5pbmcgbGF5ZXJzLgotICAgIC8vIE5vdGUgdGhhdCB0
aGUgcm9vdCBsYXllcidzIHBhaW50aW5nIHRha2VzIGludG8gYWNjb3VudCB0aGUgc2Nyb2xsIG9m
ZnNldCBhbHJlYWR5LgotICAgIGNhbnZhcy0+dHJhbnNsYXRlKC1tX3Njcm9sbEZyYW1lLmZMZWZ0
LCAtbV9zY3JvbGxGcmFtZS5mVG9wKTsKLQotICAgIGZsb2F0IG9wYWNpdHkgPSAxLjBmOworI2lm
IFBMQVRGT1JNKFNLSUEpCisgICAgICAgIC8vIEdldCB0aGUgY29udGVudHMgb2YgdGhlIHVwZGF0
ZWQgcmVjdC4KKyAgICAgICAgY29uc3QgU2tCaXRtYXAgYml0bWFwID0gbV9yb290TGF5ZXItPnBs
YXRmb3JtQ2FudmFzKCktPmdldERldmljZSgpLT5hY2Nlc3NCaXRtYXAoZmFsc2UpOworICAgICAg
ICBpbnQgcm9vdExheWVyV2lkdGggPSBiaXRtYXAud2lkdGgoKTsKKyAgICAgICAgaW50IHJvb3RM
YXllckhlaWdodCA9IGJpdG1hcC5oZWlnaHQoKTsKKyAgICAgICAgQVNTRVJUKHJvb3RMYXllcldp
ZHRoID09IHVwZGF0ZVJlY3Qud2lkdGgoKSAmJiByb290TGF5ZXJIZWlnaHQgPT0gdXBkYXRlUmVj
dC5oZWlnaHQoKSk7CisgICAgICAgIHZvaWQqIHBpeGVscyA9IGJpdG1hcC5nZXRQaXhlbHMoKTsK
KworICAgICAgICBjaGVja0dMRXJyb3IoKTsKKyAgICAgICAgLy8gQ29weSB0aGUgY29udGVudHMg
b2YgdGhlIHVwZGF0ZWQgcmVjdCB0byB0aGUgcm9vdCBsYXllciB0ZXh0dXJlLgorICAgICAgICBn
bFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgdXBkYXRlUmVjdC54KCksIHVwZGF0ZVJl
Y3QueSgpLCB1cGRhdGVSZWN0LndpZHRoKCksIHVwZGF0ZVJlY3QuaGVpZ2h0KCksIEdMX1JHQkEs
IEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7CisgICAgICAgIGNoZWNrR0xFcnJvcigpOworI2Vs
c2UKKyNlcnJvciBNdXN0IHBvcnQgdG8geW91ciBwbGF0Zm9ybQorI2VuZGlmCisgICAgfQorCisg
ICAgZ2xDbGVhckNvbG9yKDAsIDAsIDEsIDEpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVS
X0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQpOworCisgICAgLy8gUmVuZGVyIHRoZSByb290IGxh
eWVyIHVzaW5nIGEgcXVhZCB0aGF0IHRha2VzIHVwIHRoZSBlbnRpcmUgdmlzaWJsZSBhcmVhIG9m
IHRoZSB3aW5kb3cuCisgICAgZ2xVc2VQcm9ncmFtKG1fbGF5ZXJQcm9ncmFtT2JqZWN0KTsKKyAg
ICBnbFVuaWZvcm0xaShtX3NhbXBsZXJMb2NhdGlvbiwgMCk7CisgICAgVHJhbnNmb3JtYXRpb25N
YXRyaXggbGF5ZXJNYXRyaXg7CisgICAgbGF5ZXJNYXRyaXgudHJhbnNsYXRlM2QodmlzaWJsZVJl
Y3Qud2lkdGgoKSAvIDIsIHZpc2libGVSZWN0LmhlaWdodCgpIC8gMiwgMCk7CisgICAgZHJhd1Rl
eHR1cmVkUXVhZChsYXllck1hdHJpeCwgdmlzaWJsZVJlY3Qud2lkdGgoKSwgdmlzaWJsZVJlY3Qu
aGVpZ2h0KCksIDEsIGZhbHNlKTsKKworICAgIC8vIElmIGN1bGxpbmcgaXMgZW5hYmxlZCB0aGVu
IHdlIHdpbGwgY3VsbCB0aGUgYmFja2ZhY2UuCisgICAgZ2xDdWxsRmFjZShHTF9CQUNLKTsKKyAg
ICAvLyBUaGUgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gaXMgc2V0dXAgc3VjaCB0aGF0IFkgc3Rh
cnRzIGF0IHplcm8gYW5kCisgICAgLy8gaW5jcmVhc2VzIGdvaW5nIGRvd24gdGhlIHBhZ2Ugc28g
d2UgbmVlZCB0byBhZGp1c3QgdGhlIHdpbmRpbmcgb3JkZXIgb2YKKyAgICAvLyBmcm9udCBmYWNp
bmcgdHJpYW5nbGVzLgorICAgIGdsRnJvbnRGYWNlKEdMX0NXKTsKKworICAgIC8vIFRoZSBzaGFk
ZXIgdXNlZCB0byByZW5kZXIgbGF5ZXJzIHJldHVybnMgcHJlLW11bHRpcGxpZWQgYWxwaGEgY29s
b3JzCisgICAgLy8gc28gd2UgbmVlZCB0byBzZW5kIHRoZSBibGVuZGluZyBtb2RlIGFwcHJvcHJp
YXRlbHkuCisgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgIGdsQmxlbmRGdW5jKEdMX09ORSwg
R0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisKKyAgICBjaGVja0dMRXJyb3IoKTsKKworICAgIC8v
IEZJWE1FOiBOZWVkIHRvIHByZXZlbnQgY29tcG9zaXRlZCBsYXllcnMgZnJvbSBkcmF3aW5nIG92
ZXIgdGhlIHNjcm9sbAorICAgIC8vIGJhcnMuCisKKyAgICAvLyBGSVhNRTogU3VibGF5ZXJzIG5l
ZWQgdG8gYmUgc29ydGVkIGluIFogdG8gZ2V0IHRoZSBjb3JyZWN0IHRyYW5zcGFyZW5jeSBlZmZl
Y3QuCisKKyAgICAvLyBUcmFuc2xhdGUgYWxsIHRoZSBjb21wb3NpdGVkIGxheWVycyBieSB0aGUg
c2Nyb2xsIHBvc2l0aW9uLgorICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeDsKKyAgICBt
YXRyaXgudHJhbnNsYXRlM2QoLW1fc2Nyb2xsUG9zaXRpb24ueCgpLCAtbV9zY3JvbGxQb3NpdGlv
bi55KCksIDApOworICAgIGZsb2F0IG9wYWNpdHkgPSAxOwogICAgIGNvbnN0IFZlY3RvcjxSZWZQ
dHI8TGF5ZXJDaHJvbWl1bT4gPiYgc3VibGF5ZXJzID0gbV9yb290TGF5ZXItPmdldFN1YmxheWVy
cygpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VibGF5ZXJzLnNpemUoKTsgaSsrKQot
ICAgICAgICBkcmF3TGF5ZXJJbkNhbnZhc1JlY3Vyc2l2ZShjYW52YXMsIHN1YmxheWVyc1tpXS5n
ZXQoKSwgb3BhY2l0eSk7CisgICAgICAgIGNvbXBvc2l0ZUxheWVyc1JlY3Vyc2l2ZShzdWJsYXll
cnNbaV0uZ2V0KCksIG1hdHJpeCwgb3BhY2l0eSwgdmlzaWJsZVJlY3QpOwogCi0gICAgY2FudmFz
LT5yZXN0b3JlKCk7CisgICAgZ2xGbHVzaCgpOworICAgIG1fZ2xlczJDb250ZXh0LT5zd2FwQnVm
ZmVycygpOwogCiAgICAgbV9uZWVkc0Rpc3BsYXkgPSBmYWxzZTsKIH0KIAotdm9pZCBMYXllclJl
bmRlcmVyQ2hyb21pdW06OmRyYXdMYXllckluQ2FudmFzUmVjdXJzaXZlKHNraWE6OlBsYXRmb3Jt
Q2FudmFzKiBjYW52YXMsIExheWVyQ2hyb21pdW0qIGxheWVyLCBmbG9hdCBvcGFjaXR5KQorLy8g
UmV0dXJucyB0aGUgaWQgb2YgdGhlIHRleHR1cmUgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0
aGUgbGF5ZXIgb3IKKy8vIC0xIGlmIHRoZSBpZCBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkIHlldC4K
K2ludCBMYXllclJlbmRlcmVyQ2hyb21pdW06OmdldFRleHR1cmVJZChMYXllckNocm9taXVtKiBs
YXllcikKIHsKLSAgICAvLyBHdWFyYW50ZWVzIHRoYXQgdGhlIGNhbnZhcyBpcyByZXN0b3JlZCB0
byBhIGtub3duIHN0YXRlIG9uIGRlc3RydWN0aW9uLgotICAgIFNrQXV0b0NhbnZhc1Jlc3RvcmUg
YXV0b1Jlc3RvcmVDYW52YXMoY2FudmFzLCB0cnVlKTsKKyAgICBUZXh0dXJlSWRNYXA6Oml0ZXJh
dG9yIHRleHR1cmVJZCA9IG1fdGV4dHVyZUlkTWFwLmZpbmQobGF5ZXIpOworICAgIGlmICh0ZXh0
dXJlSWQgIT0gbV90ZXh0dXJlSWRNYXAuZW5kKCkpCisgICAgICAgIHJldHVybiB0ZXh0dXJlSWQt
PnNlY29uZDsKIAotICAgIEZsb2F0UG9pbnQgcG9zaXRpb24gPSBsYXllci0+cG9zaXRpb24oKTsK
LSAgICBGbG9hdFBvaW50IGFuY2hvclBvaW50ID0gbGF5ZXItPmFuY2hvclBvaW50KCk7Ci0gICAg
U2tNYXRyaXggdHJhbnNmb3JtID0gbGF5ZXItPnRyYW5zZm9ybSgpLnRvQWZmaW5lVHJhbnNmb3Jt
KCk7CisgICAgcmV0dXJuIC0xOworfQorCisvLyBBbGxvY2F0ZXMgYSBuZXcgdGV4dHVyZSBmb3Ig
dGhlIGxheWVyIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIHRleHR1cmVJZCBtYXAuCisvLyBGSVhN
RTogV2Ugd2lsbCBuZWVkIHRvIGNvbWUgdXAgd2l0aCBhIG1vcmUgc29waGlzdGljYXRlZCBhbGxv
Y2F0aW9uIHN0cmF0ZWd5IGhlcmUuCisvLyBGSVhNRTogV2UgbmVlZCB0byBmcmVlIHVwIHRoZSBh
c3NvY2lhdGVkIHRleHR1cmUgdXBvbiBsYXllciBkZXN0cnVjdGlvbi4KK2ludCBMYXllclJlbmRl
cmVyQ2hyb21pdW06OmFzc2lnblRleHR1cmVGb3JMYXllcihMYXllckNocm9taXVtKiBsYXllcikK
K3sKKyAgICBHTHVpbnQgdGV4dHVyZUlkID0gY3JlYXRlTGF5ZXJUZXh0dXJlKCk7CisKKyAgICAv
LyBGSVhNRTogQ2hlY2sgdGhhdCB0ZXh0dXJlSWQgaXMgdmFsaWQKKyAgICBtX3RleHR1cmVJZE1h
cC5zZXQobGF5ZXIsIHRleHR1cmVJZCk7CisgICAgcmV0dXJuIHRleHR1cmVJZDsKK30KKworYm9v
bCBMYXllclJlbmRlcmVyQ2hyb21pdW06OmZyZWVMYXllclRleHR1cmUoTGF5ZXJDaHJvbWl1bSog
bGF5ZXIpCit7CisgICAgVGV4dHVyZUlkTWFwOjppdGVyYXRvciB0ZXh0dXJlSWQgPSBtX3RleHR1
cmVJZE1hcC5maW5kKGxheWVyKTsKKyAgICBpZiAodGV4dHVyZUlkID09IG1fdGV4dHVyZUlkTWFw
LmVuZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gRnJlZSB1cCB0aGUgdGV4dHVy
ZS4KKyAgICBnbERlbGV0ZVRleHR1cmVzKDEsICYodGV4dHVyZUlkLT5zZWNvbmQpKTsKKyAgICBt
X3RleHR1cmVJZE1hcC5yZW1vdmUodGV4dHVyZUlkKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
Ly8gRHJhd3MgYSBkZWJ1ZyBib3JkZXIgYXJvdW5kIHRoZSBsYXllcidzIGJvdW5kcy4KK3ZvaWQg
TGF5ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3RGVidWdCb3JkZXIoTGF5ZXJDaHJvbWl1bSogbGF5
ZXIsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBtYXRyaXgpCit7CisgICAgc3RhdGljIEdM
ZmxvYXQgZ2xNYXRyaXhbMTZdOworICAgIENvbG9yIGJvcmRlckNvbG9yID0gbGF5ZXItPmJvcmRl
ckNvbG9yKCk7CisgICAgaWYgKCFib3JkZXJDb2xvci5hbHBoYSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBnbFVzZVByb2dyYW0obV9ib3JkZXJQcm9ncmFtT2JqZWN0KTsKKyAgICBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCByZW5kZXJNYXRyaXggPSBtYXRyaXg7CiAgICAgSW50U2l6ZSBib3VuZHMg
PSBsYXllci0+Ym91bmRzKCk7CisgICAgcmVuZGVyTWF0cml4LnNjYWxlM2QoYm91bmRzLndpZHRo
KCksIGJvdW5kcy5oZWlnaHQoKSwgMSk7CisgICAgcmVuZGVyTWF0cml4Lm11bHRpcGx5KG1fcHJv
amVjdGlvbk1hdHJpeCk7CisgICAgdG9HTE1hdHJpeCgmZ2xNYXRyaXhbMF0sIHJlbmRlck1hdHJp
eCk7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KG1fYm9yZGVyTWF0cml4TG9jYXRpb24sIDEsIGZh
bHNlLCAmZ2xNYXRyaXhbMF0pOworCisgICAgZ2xVbmlmb3JtNGYobV9ib3JkZXJDb2xvckxvY2F0
aW9uLCBib3JkZXJDb2xvci5yZWQoKSAvIDI1NS4wLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYm9yZGVyQ29sb3IuZ3JlZW4oKSAvIDI1NS4wLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3IuYmx1ZSgpIC8gMjU1LjAsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgIGdsTGluZVdp
ZHRoKGxheWVyLT5ib3JkZXJXaWR0aCgpKTsKKworICAgIC8vIFRoZSBpbmRpY2VzIGZvciB0aGUg
bGluZSBhcmUgc3RvcmVkIGluIHRoZSBzYW1lIGFycmF5IGFzIHRoZSB0cmlhbmdsZSBpbmRpY2Vz
LgorICAgIGdsRHJhd0VsZW1lbnRzKEdMX0xJTkVfTE9PUCwgNCwgR0xfVU5TSUdORURfU0hPUlQs
ICh2b2lkKikoNiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpKTsKKyAgICBjaGVja0dMRXJyb3Io
KTsKIAotICAgIGNhbnZhcy0+dHJhbnNsYXRlKHBvc2l0aW9uLngoKSwgcG9zaXRpb24ueSgpKTsK
KyAgICAvLyBTd2l0Y2ggYmFjayB0byB0aGUgc2hhZGVyIHByb2dyYW0gdXNlZCBmb3IgbGF5ZXIg
Y29udGVudHMuCisgICAgZ2xVc2VQcm9ncmFtKG1fbGF5ZXJQcm9ncmFtT2JqZWN0KTsKK30KIAot
ICAgIFNrU2NhbGFyIHR4ID0gU2tTY2FsYXJNdWwoYW5jaG9yUG9pbnQueCgpLCBib3VuZHMud2lk
dGgoKSk7Ci0gICAgU2tTY2FsYXIgdHkgPSBTa1NjYWxhck11bChhbmNob3JQb2ludC55KCksIGJv
dW5kcy5oZWlnaHQoKSk7Ci0gICAgY2FudmFzLT50cmFuc2xhdGUodHgsIHR5KTsKLSAgICBjYW52
YXMtPmNvbmNhdCh0cmFuc2Zvcm0pOwotICAgIGNhbnZhcy0+dHJhbnNsYXRlKC10eCwgLXR5KTsK
LQotICAgIC8vIFRoZSBwb3NpdGlvbiB3ZSBnZXQgaXMgZm9yIHRoZSBjZW50ZXIgb2YgdGhlIGxh
eWVyLCBidXQKLSAgICAvLyBkcmF3Qml0bWFwIHN0YXJ0cyBhdCB0aGUgdXBwZXItbGVmdCBjb3Ju
ZXIsIGFuZCB0aGVyZWZvcmUKLSAgICAvLyB3ZSBuZWVkIHRvIGFkanVzdCBvdXIgdHJhbnNmb3Jt
LgotICAgIGNhbnZhcy0+dHJhbnNsYXRlKC0wLjVmICogYm91bmRzLndpZHRoKCksIC0wLjVmICog
Ym91bmRzLmhlaWdodCgpKTsKKy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcGFydCBvZiB0aGUgbGF5
ZXIgZmFsbHMgd2l0aGluIHRoZSB2aXNpYmxlUmVjdAorYm9vbCBMYXllclJlbmRlcmVyQ2hyb21p
dW06OmlzTGF5ZXJWaXNpYmxlKExheWVyQ2hyb21pdW0qIGxheWVyLCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgbWF0cml4LCBjb25zdCBJbnRSZWN0JiB2aXNpYmxlUmVjdCkKK3sKKyAgICAv
LyBGb3JtIHRoZSBtYXRyaXggdXNlZCBieSB0aGUgc2hhZGVyIHRvIG1hcCB0aGUgY29ybmVycyBv
ZiB0aGUgbGF5ZXIncworICAgIC8vIGJvdW5kcyBpbnRvIGNsaXAgc3BhY2UuCisgICAgVHJhbnNm
b3JtYXRpb25NYXRyaXggcmVuZGVyTWF0cml4ID0gbWF0cml4OworICAgIHJlbmRlck1hdHJpeC5z
Y2FsZTNkKGxheWVyLT5ib3VuZHMoKS53aWR0aCgpLCBsYXllci0+Ym91bmRzKCkuaGVpZ2h0KCks
IDEpOworICAgIHJlbmRlck1hdHJpeC5tdWx0aXBseShtX3Byb2plY3Rpb25NYXRyaXgpOworCisg
ICAgRmxvYXRSZWN0IGxheWVyUmVjdCgtMC41LCAtMC41LCAxLCAxKTsKKyAgICBGbG9hdFJlY3Qg
bWFwcGVkUmVjdCA9IHJlbmRlck1hdHJpeC5tYXBSZWN0KGxheWVyUmVjdCk7CisKKyAgICAvLyBU
aGUgbGF5ZXIgaXMgdmlzaWJsZSBpZiBpdCBpbnRlcnNlY3RzIGFueSBwYXJ0IG9mIGEgcmVjdGFu
Z2xlIHdob3NlIG9yaWdpbgorICAgIC8vIGlzIGF0ICgtMSwgLTEpIGFuZCBzaXplIGlzIDJ4Mi4K
KyAgICByZXR1cm4gbWFwcGVkUmVjdC5pbnRlcnNlY3RzKEZsb2F0UmVjdCgtMSwgLTEsIDIsIDIp
KTsKK30KIAotICAgIGxheWVyLT5kcmF3RGVidWdCb3JkZXIoKTsKK3ZvaWQgTGF5ZXJSZW5kZXJl
ckNocm9taXVtOjpjb21wb3NpdGVMYXllcnNSZWN1cnNpdmUoTGF5ZXJDaHJvbWl1bSogbGF5ZXIs
IGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBtYXRyaXgsIGZsb2F0IG9wYWNpdHksIGNvbnN0
IEludFJlY3QmIHZpc2libGVSZWN0KQoreworICAgIHN0YXRpYyBHTGZsb2F0IGdsTWF0cml4WzE2
XTsKIAotICAgIFNrUGFpbnQgb3BhY2l0eVBhaW50OworICAgIC8vIENvbXB1dGUgdGhlIG5ldyBt
YXRyaXggdHJhbnNmb3JtYXRpb24gdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhpcyBsYXllciBh
bmQKKyAgICAvLyBhbGwgaXRzIHN1YmxheWVycy4KKyAgICAvLyBUaGUgYmFzaWMgdHJhbnNmb3Jt
YXRpb24gY2hhaW4gZm9yIHRoZSBsYXllciBpcyAodXNpbmcgdGhlIE1hdHJpeCB4IFZlY3RvciBv
cmRlcik6CisgICAgLy8gTSA9IE1bcF0gKiBUW2xdICogVFthXSAqIE1bbF0gKiBUWy1hXQorICAg
IC8vIFdoZXJlIE1bcF0gaXMgdGhlIHBhcmVudCBtYXRyaXggcGFzc2VkIGRvd24gdG8gdGhlIGZ1
bmN0aW9uCisgICAgLy8gICAgICAgVFtsXSBpcyB0aGUgdHJhbnNsYXRpb24gb2YgdGhlIGxheWVy
J3MgY2VudGVyCisgICAgLy8gICAgICAgVFthXSBhbmQgVFstYV0gaXMgYSB0cmFuc2xhdGlvbi9p
bnZlcnNlIHRyYW5zbGF0aW9uIGJ5IHRoZSBhbmNob3IgcG9pbnQKKyAgICAvLyAgICAgICBNW2xd
IGlzIHRoZSBsYXllcidzIG1hdHJpeAorICAgIC8vIE5vdGUgdGhhdCB0aGUgZmluYWwgbWF0cml4
IHVzZWQgYnkgdGhlIHNoYWRlciBmb3IgdGhlIGxheWVyIGlzIFAgKiBNICogUyAuIFRoaXMgZmlu
YWwgcHJvZHVjdAorICAgIC8vIGlzIGVmZmVjdGl2ZWx5IGNvbXB1dGVkIGluIGRyYXdUZXh0dXJl
ZFF1YWQoKS4KKyAgICAvLyBXaGVyZTogUCBpcyB0aGUgcHJvamVjdGlvbiBtYXRyaXgKKyAgICAv
LyAgICAgICAgTSBpcyB0aGUgbGF5ZXIncyBtYXRyaXggY29tcHV0ZWQgYWJvdmUKKyAgICAvLyAg
ICAgICAgUyBpcyB0aGUgc2NhbGUgYWRqdXN0bWVudCAodG8gc2NhbGUgdXAgdG8gdGhlIGxheWVy
IHNpemUpCisgICAgSW50U2l6ZSBib3VuZHMgPSBsYXllci0+Ym91bmRzKCk7CisgICAgRmxvYXRQ
b2ludCBhbmNob3JQb2ludCA9IGxheWVyLT5hbmNob3JQb2ludCgpOworICAgIEZsb2F0UG9pbnQg
cG9zaXRpb24gPSBsYXllci0+cG9zaXRpb24oKTsKKyAgICBmbG9hdCBhbmNob3JYID0gKGFuY2hv
clBvaW50LngoKSAtIDAuNSkgKiBib3VuZHMud2lkdGgoKTsKKyAgICBmbG9hdCBhbmNob3JZID0g
KDAuNSAtIGFuY2hvclBvaW50LnkoKSkgKiBib3VuZHMuaGVpZ2h0KCk7CisKKyAgICAvLyBNID0g
TVtwXQorICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxvY2FsTWF0cml4ID0gbWF0cml4OworICAg
IC8vIE0gPSBNW3BdICogVFtsXQorICAgIGxvY2FsTWF0cml4LnRyYW5zbGF0ZTNkKHBvc2l0aW9u
LngoKSwgcG9zaXRpb24ueSgpLCAwKTsKKyAgICAvLyBNID0gTVtwXSAqIFRbbF0gKiBUW2FdCisg
ICAgbG9jYWxNYXRyaXgudHJhbnNsYXRlM2QoYW5jaG9yWCwgYW5jaG9yWSwgMCk7CisgICAgLy8g
TSA9IE1bcF0gKiBUW2xdICogVFthXSAqIE1bbF0KKyAgICBsb2NhbE1hdHJpeC5tdWx0TGVmdChs
YXllci0+dHJhbnNmb3JtKCkpOworICAgIC8vIE0gPSBNW3BdICogVFtsXSAqIFRbYV0gKiBNW2xd
ICogVFstYV0KKyAgICBsb2NhbE1hdHJpeC50cmFuc2xhdGUzZCgtYW5jaG9yWCwgLWFuY2hvclks
IDApOworCisgICAgYm9vbCBza2lwTGF5ZXIgPSBmYWxzZTsKKyAgICBpZiAoYm91bmRzLndpZHRo
KCkgPiAyMDQ4IHx8IGJvdW5kcy5oZWlnaHQoKSA+IDIwNDgpIHsKKyAgICAgICAgTE9HKExheWVy
UmVuZGVyZXIsICJTa2lwcGluZyBsYXllciB3aXRoIHNpemUgJWQgJWQiLCBib3VuZHMud2lkdGgo
KSwgYm91bmRzLmhlaWdodCgpKTsKKyAgICAgICAgc2tpcExheWVyID0gdHJ1ZTsKKyAgICB9CisK
KyAgICAvLyBDYWxjdWxhdGUgdGhlIGxheWVyJ3Mgb3BhY2l0eS4KICAgICBvcGFjaXR5ICo9IGxh
eWVyLT5vcGFjaXR5KCk7Ci0gICAgb3BhY2l0eVBhaW50LnNldEFscGhhKG9wYWNpdHkgKiAyNTUp
OwogCi0gICAgY2FudmFzLT5kcmF3Qml0bWFwKGxheWVyLT5wbGF0Zm9ybUNhbnZhcygpLT5nZXRE
ZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKSwgMCwgMCwgJm9wYWNpdHlQYWludCk7CisgICAg
Ym9vbCBsYXllclZpc2libGUgPSBpc0xheWVyVmlzaWJsZShsYXllciwgbG9jYWxNYXRyaXgsIHZp
c2libGVSZWN0KTsKIAorICAgIC8vIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIGxh
eWVyczoKKyAgICAvLyAxLiBMYXllcnMgdGhhdCBoYXZlIHRoZWlyIG93biBHcmFwaGljc0NvbnRl
eHQgYW5kIGNhbiBkcmF3IHRoZWlyIGNvbnRlbnRzIG9uIGRlbWFuZCAobGF5ZXItPmRyYXdzQ29u
dGVudCgpID09IHRydWUpLgorICAgIC8vIDIuIExheWVycyB0aGF0IGFyZSBqdXN0IGNvbnRhaW5l
cnMgb2YgaW1hZ2VzL3ZpZGVvL2V0YyB0aGF0IGRvbid0IG93biBhIEdyYXBoaWNzQ29udGV4dCAo
bGF5ZXItPmNvbnRlbnRzKCkgPT0gdHJ1ZSkuCisgICAgaWYgKChsYXllci0+ZHJhd3NDb250ZW50
KCkgfHwgbGF5ZXItPmNvbnRlbnRzKCkpICYmICFza2lwTGF5ZXIgJiYgbGF5ZXJWaXNpYmxlKSB7
CisgICAgICAgIGludCB0ZXh0dXJlSWQgPSBnZXRUZXh0dXJlSWQobGF5ZXIpOworICAgICAgICAv
LyBJZiBubyB0ZXh0dXJlIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBsYXllciB5ZXQgdGhlbiBj
cmVhdGUgb25lIG5vdy4KKyAgICAgICAgaWYgKHRleHR1cmVJZCA9PSAtMSkKKyAgICAgICAgICAg
IHRleHR1cmVJZCA9IGFzc2lnblRleHR1cmVGb3JMYXllcihsYXllcik7CisKKyAgICAgICAgLy8g
UmVkcmF3IHRoZSBjb250ZW50cyBvZiB0aGUgbGF5ZXIgaWYgbmVjZXNzYXJ5LgorICAgICAgICBp
ZiAoKGxheWVyLT5kcmF3c0NvbnRlbnQoKSB8fCBsYXllci0+Y29udGVudHMoKSkgJiYgbGF5ZXIt
PmNvbnRlbnRzRGlydHkoKSkgeworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb250ZW50cyBv
ZiB0aGUgbGF5ZXIgYmVmb3JlIHRha2luZyBhIHNuYXBzaG90LiBGb3IgbGF5ZXJzIHRoYXQKKyAg
ICAgICAgICAgIC8vIGFyZSBzaW1wbHkgY29udGFpbmVycywgdGhlIGZvbGxvd2luZyBjYWxsIGp1
c3QgY2xlYXJzIHRoZSBkaXJ0eSBmbGFnIGJ1dCBkb2Vzbid0CisgICAgICAgICAgICAvLyBhY3R1
YWxseSBkbyBhbnkgZHJhd3MvY29waWVzLgorICAgICAgICAgICAgbGF5ZXItPnVwZGF0ZUNvbnRl
bnRzKCk7CisKKyAgICAgICAgICAgIGNvbnN0IFNrQml0bWFwKiBza2lhQml0bWFwID0gMDsKKyAg
ICAgICAgICAgIHZvaWQqIHBpeGVscyA9IDA7CisgICAgICAgICAgICBpZiAobGF5ZXItPmRyYXdz
Q29udGVudCgpKSB7IC8vIExheWVyIGhhcyBpdHMgb3duIEdyYXBoaWNzQ29udGV4dC4KKyAgICAg
ICAgICAgICAgICAvLyBUaGUgY29udGVudHMgb2YgdGhlIGxheWVyIGFyZSBzdG9yZWQgaW4gdGhl
IGNhbnZhcyBhc3NvY2lhdGVkIHdpdGggaXQuCisgICAgICAgICAgICAgICAgY29uc3QgU2tCaXRt
YXAmIGJpdG1hcCA9IGxheWVyLT5wbGF0Zm9ybUNhbnZhcygpLT5nZXREZXZpY2UoKS0+YWNjZXNz
Qml0bWFwKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBza2lhQml0bWFwID0gJmJpdG1hcDsKKyAg
ICAgICAgICAgIH0gZWxzZSB7IC8vIExheWVyIGlzIGEgY29udGFpbmVyLgorICAgICAgICAgICAg
ICAgIC8vIFRoZSBsYXllciBjb250YWlucyBhbiBJbWFnZS4KKyAgICAgICAgICAgICAgICBOYXRp
dmVJbWFnZVNraWEqIHNraWFJbWFnZSA9IHN0YXRpY19jYXN0PE5hdGl2ZUltYWdlU2tpYSo+KGxh
eWVyLT5jb250ZW50cygpKTsKKyAgICAgICAgICAgICAgICBza2lhQml0bWFwID0gc2tpYUltYWdl
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBU1NFUlQoc2tpYUJpdG1hcCk7CisgICAg
ICAgICAgICBTa0JpdG1hcDo6Q29uZmlnIHNraWFDb25maWcgPSBza2lhQml0bWFwLT5jb25maWco
KTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBtdXN0IHN1cHBvcnQgbW9yZSBpbWFnZSBjb25maWd1
cmF0aW9ucy4KKyAgICAgICAgICAgIGlmIChza2lhQ29uZmlnID09IFNrQml0bWFwOjprQVJHQl84
ODg4X0NvbmZpZykgeworICAgICAgICAgICAgICAgIFNrQXV0b0xvY2tQaXhlbHMgbG9jaygqc2tp
YUJpdG1hcCk7CisgICAgICAgICAgICAgICAgaW50IGJpdG1hcFdpZHRoID0gc2tpYUJpdG1hcC0+
d2lkdGgoKTsKKyAgICAgICAgICAgICAgICBpbnQgYml0bWFwSGVpZ2h0ID0gc2tpYUJpdG1hcC0+
aGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgaW50IHJvd0J5dGVzID0gc2tpYUJpdG1hcC0+cm93
Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQocm93Qnl0ZXMgPT0gYml0bWFwV2lkdGgg
KiA0KTsKKworICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlIGxheWVyIGNvbnRlbnRzIGludG8g
dGhlIHRleHR1cmUuCisgICAgICAgICAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJE
LCB0ZXh0dXJlSWQpOworICAgICAgICAgICAgICAgIHZvaWQqIHBpeGVscyA9IHNraWFCaXRtYXAt
PmdldFBpeGVscygpOworICAgICAgICAgICAgICAgIGlmIChwaXhlbHMpIHsKKyAgICAgICAgICAg
ICAgICAgICAgLy8gRklYTUUuIFdlIGNhbiBiZSBzbWFydCBoZXJlIGFuZCBjYWxsIGdsVGV4U3Vi
SW1hZ2UyRCBpZiB0aGUgbmV3IGJpdG1hcCBoYXMgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAg
ICAgLy8gc2l6ZSBhcyB0aGUgb2xkIG9uZSB3aGljaCB3aWxsIHNhdmUgdXMgb25lIHVuZWNlc3Nh
cnkgYWxsb2NhdGlvbiAvIGRlYWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgZ2xUZXhJ
bWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJpdG1hcFdpZHRoLCBiaXRtYXBIZWln
aHQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7CisgICAgICAgICAgICAg
ICAgICAgIGNoZWNrR0xFcnJvcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXllci0+ZG91YmxlU2lkZWQoKSkKKyAgICAgICAg
ICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBn
bEVuYWJsZShHTF9DVUxMX0ZBQ0UpOworCisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVS
RV8yRCwgdGV4dHVyZUlkKTsKKworICAgICAgICBkcmF3VGV4dHVyZWRRdWFkKGxvY2FsTWF0cml4
LCBib3VuZHMud2lkdGgoKSwgYm91bmRzLmhlaWdodCgpLCBvcGFjaXR5LCBmYWxzZSk7CisgICAg
fQorCisgICAgLy8gRHJhdyB0aGUgZGVidWcgYm9yZGVyIGlmIHRoZXJlIGlzIG9uZS4KKyAgICBk
cmF3RGVidWdCb3JkZXIobGF5ZXIsIGxvY2FsTWF0cml4KTsKKworICAgIC8vIEFwcGx5IHRoZSBz
dWJsYXllciB0cmFuc2Zvcm0uCisgICAgbG9jYWxNYXRyaXgubXVsdExlZnQobGF5ZXItPnN1Ymxh
eWVyVHJhbnNmb3JtKCkpOworCisgICAgLy8gVGhlIG9yaWdpbiBvZiB0aGUgc3VibGF5ZXJzIGlz
IGFjdHVhbGx5IHRoZSBsZWZ0IHRvcCBjb3JuZXIgb2YgdGhlIGxheWVyCisgICAgLy8gaW5zdGVh
ZCBvZiB0aGUgY2VudGVyLiBUaGUgbWF0cml4IHBhc3NlZCBkb3duIHRvIHRoZSBzdWJsYXllcnMg
aXMgdGhlcmVmb3JlOgorICAgIC8vIE1bc10gPSBNICogVFstY2VudGVyXQorICAgIGxvY2FsTWF0
cml4LnRyYW5zbGF0ZTNkKC1ib3VuZHMud2lkdGgoKSAqIDAuNSwgLWJvdW5kcy5oZWlnaHQoKSAq
IDAuNSwgMCk7CiAgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxMYXllckNocm9taXVtPiA+JiBzdWJs
YXllcnMgPSBsYXllci0+Z2V0U3VibGF5ZXJzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspCi0gICAgICAgIGRyYXdMYXllckluQ2FudmFzUmVjdXJz
aXZlKGNhbnZhcywgc3VibGF5ZXJzW2ldLmdldCgpLCBvcGFjaXR5KTsKKyAgICAgICAgY29tcG9z
aXRlTGF5ZXJzUmVjdXJzaXZlKHN1YmxheWVyc1tpXS5nZXQoKSwgbG9jYWxNYXRyaXgsIG9wYWNp
dHksIHZpc2libGVSZWN0KTsKIH0KLSNlbmRpZiAvLyBQTEFURk9STShTS0lBKQogCi12b2lkIExh
eWVyUmVuZGVyZXJDaHJvbWl1bTo6dXBkYXRlTGF5ZXJDb250ZW50c1JlY3Vyc2l2ZShMYXllckNo
cm9taXVtKiBsYXllcikKK2Jvb2wgTGF5ZXJSZW5kZXJlckNocm9taXVtOjptYWtlQ29udGV4dEN1
cnJlbnQoKQogewotICAgIGxheWVyLT51cGRhdGVDb250ZW50cygpOworICAgIHJldHVybiBtX2ds
ZXMyQ29udGV4dC0+bWFrZUN1cnJlbnQoKTsKK30KIAotICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8
TGF5ZXJDaHJvbWl1bT4gPiYgc3VibGF5ZXJzID0gbGF5ZXItPmdldFN1YmxheWVycygpOwotICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VibGF5ZXJzLnNpemUoKTsgaSsrKQotICAgICAgICB1
cGRhdGVMYXllckNvbnRlbnRzUmVjdXJzaXZlKHN1YmxheWVyc1tpXS5nZXQoKSk7Citib29sIExh
eWVyUmVuZGVyZXJDaHJvbWl1bTo6aW5pdEdMKCkKK3sKKyAgICBtX2dsZXMyQ29udGV4dCA9IEdM
RVMyQ29udGV4dDo6Y3JlYXRlKG1fcGFnZSk7CisKKyAgICBpZiAoIW1fZ2xlczJDb250ZXh0KQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQmluZHMg
dGhlIGdpdmVuIGF0dHJpYnV0ZSBuYW1lIHRvIGEgY29tbW9uIGxvY2F0aW9uIGFjcm9zcyBhbGwg
dGhyZWUgcHJvZ3JhbXMKKy8vIHVzZWQgYnkgdGhlIGNvbXBvc2l0b3IuIFRoaXMgYWxsb3dzIHRo
ZSBjb2RlIHRvIGJpbmQgdGhlIGF0dHJpYnV0ZXMgb25seSBvbmNlCisvLyBldmVuIHdoZW4gc3dp
dGNoaW5nIGJldHdlZW4gcHJvZ3JhbXMuCit2b2lkIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6Ymlu
ZENvbW1vbkF0dHJpYkxvY2F0aW9uKGludCBsb2NhdGlvbiwgY2hhciogYXR0cmliTmFtZSkKK3sK
KyAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihtX2xheWVyUHJvZ3JhbU9iamVjdCwgbG9jYXRpb24s
IGF0dHJpYk5hbWUpOworICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKG1fYm9yZGVyUHJvZ3JhbU9i
amVjdCwgbG9jYXRpb24sIGF0dHJpYk5hbWUpOworICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKG1f
c2Nyb2xsUHJvZ3JhbU9iamVjdCwgbG9jYXRpb24sIGF0dHJpYk5hbWUpOwogfQogCitib29sIExh
eWVyUmVuZGVyZXJDaHJvbWl1bTo6aW5pdGlhbGl6ZVNoYXJlZEdMT2JqZWN0cygpCit7CisgICAg
Ly8gU2hhZGVycyBmb3IgZHJhd2luZyB0aGUgbGF5ZXIgY29udGVudHMuCisgICAgY2hhciB2ZXJ0
ZXhTaGFkZXJTdHJpbmdbXSA9CisgICAgICAgICJhdHRyaWJ1dGUgdmVjNCBhX3Bvc2l0aW9uOyAg
IFxuIgorICAgICAgICAiYXR0cmlidXRlIHZlYzIgYV90ZXhDb29yZDsgICBcbiIKKyAgICAgICAg
InVuaWZvcm0gbWF0NCBtYXRyaXg7ICAgICAgICAgXG4iCisgICAgICAgICJ2YXJ5aW5nIHZlYzIg
dl90ZXhDb29yZDsgICAgIFxuIgorICAgICAgICAidm9pZCBtYWluKCkgICAgICAgICAgICAgICAg
ICBcbiIKKyAgICAgICAgInsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAg
ICIgIGdsX1Bvc2l0aW9uID0gbWF0cml4ICogYV9wb3NpdGlvbjsgXG4iCisgICAgICAgICIgIHZf
dGV4Q29vcmQgPSBhX3RleENvb3JkOyAgIFxuIgorICAgICAgICAifSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcbiI7CisgICAgY2hhciBmcmFnbWVudFNoYWRlclN0cmluZ1tdID0KKyAgICAg
ICAgLy8gRklYTUU6IFJlLWludHJvZHVjZSBwcmVjaXNpb24gcXVhbGlmaWVyIHdoZW4gd2UgbmVl
ZCBHTCBFUyBzaGFkZXJzLgorICAgICAgICAiLy9wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXhD
b29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ1bmlmb3JtIHNh
bXBsZXIyRCBzX3RleHR1cmU7ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ1
bmlmb3JtIGZsb2F0IGFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisg
ICAgICAgICJ2b2lkIG1haW4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXG4iCisgICAgICAgICJ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXG4iCisgICAgICAgICIgIHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoc190
ZXh0dXJlLCB2X3RleENvb3JkKTsgXG4iCisgICAgICAgICIgIGdsX0ZyYWdDb2xvciA9IHZlYzQo
dGV4Q29sb3IueiwgdGV4Q29sb3IueSwgdGV4Q29sb3IueCwgdGV4Q29sb3IudykgKiBhbHBoYTsg
XG4iCisgICAgICAgICJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXG4iOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHVzZWQgZm9yIHJlbmRlcmlu
ZyB0aGUgc2Nyb2xsZWQgcm9vdCBsYXllciBxdWFkLiBJdCBkaWZmZXJzCisgICAgLy8gZnJvbSBm
cmFnbWVudFNoYWRlclN0cmluZyBpbiB0aGF0IGl0IGRvZXNuJ3Qgc3dpenpsZSB0aGUgY29sb3Jz
IGFuZCBkb2Vzbid0CisgICAgLy8gdGFrZSBhbiBhbHBoYSB2YWx1ZS4KKyAgICBjaGFyIHNjcm9s
bEZyYWdtZW50U2hhZGVyU3RyaW5nW10gPQorICAgICAgICAvLyBGSVhNRTogUmUtaW50cm9kdWNl
IHByZWNpc2lvbiBxdWFsaWZpZXIgd2hlbiB3ZSBuZWVkIEdMIEVTIHNoYWRlcnMuCisgICAgICAg
ICIvL3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
biIKKyAgICAgICAgInZhcnlpbmcgdmVjMiB2X3RleENvb3JkOyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcbiIKKyAgICAgICAgInVuaWZvcm0gc2FtcGxlcjJEIHNfdGV4dHVyZTsgICAgICAg
ICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInZvaWQgbWFpbigpICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgIiAgdmVjNCB0
ZXhDb2xvciA9IHRleHR1cmUyRChzX3RleHR1cmUsIHZfdGV4Q29vcmQpOyBcbiIKKyAgICAgICAg
IiAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh0ZXhDb2xvci54LCB0ZXhDb2xvci55LCB0ZXhDb2xvci56
LCB0ZXhDb2xvci53KTsgXG4iCisgICAgICAgICJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXG4iOworCisgICAgLy8gU2hhZGVycyBmb3IgZHJhd2lu
ZyB0aGUgZGVidWcgYm9yZGVycyBhcm91bmQgdGhlIGxheWVycy4KKyAgICBjaGFyIGJvcmRlclZl
cnRleFNoYWRlclN0cmluZ1tdID0KKyAgICAgICAgImF0dHJpYnV0ZSB2ZWM0IGFfcG9zaXRpb247
ICAgXG4iCisgICAgICAgICJ1bmlmb3JtIG1hdDQgbWF0cml4OyAgICAgICAgIFxuIgorICAgICAg
ICAidm9pZCBtYWluKCkgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICIgICBnbF9Qb3NpdGlvbiA9IG1hdHJpeCAq
IGFfcG9zaXRpb247IFxuIgorICAgICAgICAifSAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
biI7CisgICAgY2hhciBib3JkZXJGcmFnbWVudFNoYWRlclN0cmluZ1tdID0KKyAgICAgICAgLy8g
RklYTUU6IFJlLWludHJvZHVjZSBwcmVjaXNpb24gcXVhbGlmaWVyIHdoZW4gd2UgbmVlZCBHTCBF
UyBzaGFkZXJzLgorICAgICAgICAiLy9wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3I7ICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ2b2lkIG1haW4oKSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ7ICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAg
ICIgIGdsX0ZyYWdDb2xvciA9IGNvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4i
CisgICAgICAgICJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXG4iOworCisgICAgR0xmbG9hdCB2ZXJ0aWNlc1tdID0geyAtMC41ZiwgIDAuNWYsIDAu
MGYsIC8vIFBvc2l0aW9uIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAgMS4w
ZiwgLy8gVGV4Q29vcmQgMCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjVmLCAtMC41
ZiwgMC4wZiwgLy8gUG9zaXRpb24gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYs
ICAwLjBmLCAvLyBUZXhDb29yZCAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41Ziwg
LTAuNWYsIDAuMGYsIC8vIFBvc2l0aW9uIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAx
LjBmLCAgMC4wZiwgLy8gVGV4Q29vcmQgMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAu
NWYsICAwLjVmLCAwLjBmLCAvLyBQb3NpdGlvbiAzCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgMS4wZiwgIDEuMGYgLy8gVGV4Q29vcmQgMworICAgICAgICAgICAgICAgICAgICAgICAgIH07
CisgICAgR0x1c2hvcnQgaW5kaWNlc1tdID0geyAwLCAxLCAyLCAwLCAyLCAzLCAvLyBUaGUgdHdv
IHRyaWFuZ2xlcyB0aGF0IG1ha2UgdXAgdGhlIGxheWVyIHF1YWQuCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAwLCAxLCAyLCAzfTsgLy8gQSBsaW5lIHBhdGggZm9yIGRyYXdpbmcgdGhlIGxh
eWVyIGJvcmRlci4KKworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOworICAgIG1fbGF5ZXJQcm9n
cmFtT2JqZWN0ID0gbG9hZFNoYWRlclByb2dyYW0odmVydGV4U2hhZGVyU3RyaW5nLCBmcmFnbWVu
dFNoYWRlclN0cmluZyk7CisgICAgaWYgKCFtX2xheWVyUHJvZ3JhbU9iamVjdCkgeworICAgICAg
ICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgc2hhZGVyIHByb2dyYW0gZm9yIGxheWVycyIp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zY3JvbGxQcm9ncmFtT2Jq
ZWN0ID0gbG9hZFNoYWRlclByb2dyYW0odmVydGV4U2hhZGVyU3RyaW5nLCBzY3JvbGxGcmFnbWVu
dFNoYWRlclN0cmluZyk7CisgICAgaWYgKCFtX3Njcm9sbFByb2dyYW1PYmplY3QpIHsKKyAgICAg
ICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHNoYWRlciBwcm9ncmFtIGZvciBzY3JvbGxp
bmcgbGF5ZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fYm9yZGVy
UHJvZ3JhbU9iamVjdCA9IGxvYWRTaGFkZXJQcm9ncmFtKGJvcmRlclZlcnRleFNoYWRlclN0cmlu
ZywgYm9yZGVyRnJhZ21lbnRTaGFkZXJTdHJpbmcpOworICAgIGlmICghbV9ib3JkZXJQcm9ncmFt
T2JqZWN0KSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBzaGFkZXIgcHJv
Z3JhbSBmb3IgZGVidWcgYm9yZGVycyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgLy8gU3BlY2lmeSB0aGUgYXR0cmliIGxvY2F0aW9uIGZvciB0aGUgcG9zaXRpb24gYW5k
IG1ha2UgaXQgdGhlIHNhbWUgZm9yIGFsbCB0aHJlZSBwcm9ncmFtcyB0bworICAgIC8vIGF2b2lk
IGJpbmRpbmcgcmUtYmluZGluZyB0aGUgdmVydGV4IGF0dHJpYnV0ZXMuCisgICAgYmluZENvbW1v
bkF0dHJpYkxvY2F0aW9uKG1fcG9zaXRpb25Mb2NhdGlvbiwgImFfcG9zaXRpb24iKTsKKyAgICBi
aW5kQ29tbW9uQXR0cmliTG9jYXRpb24obV90ZXhDb29yZExvY2F0aW9uLCAiYV90ZXhDb29yZCIp
OworCisgICAgY2hlY2tHTEVycm9yKCk7CisKKyAgICAvLyBSZS1saW5rIHRoZSBzaGFkZXJzIHRv
IGdldCB0aGUgbmV3IGF0dHJpYiBsb2NhdGlvbiB0byB0YWtlIGVmZmVjdC4KKyAgICBnbExpbmtQ
cm9ncmFtKG1fbGF5ZXJQcm9ncmFtT2JqZWN0KTsKKyAgICBnbExpbmtQcm9ncmFtKG1fYm9yZGVy
UHJvZ3JhbU9iamVjdCk7CisgICAgZ2xMaW5rUHJvZ3JhbShtX3Njcm9sbFByb2dyYW1PYmplY3Qp
OworCisgICAgY2hlY2tHTEVycm9yKCk7CisKKyAgICAvLyBHZXQgbG9jYXRpb25zIG9mIHVuaWZv
cm1zIGZvciB0aGUgbGF5ZXIgY29udGVudCBzaGFkZXIgcHJvZ3JhbS4KKyAgICBtX3NhbXBsZXJM
b2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fbGF5ZXJQcm9ncmFtT2JqZWN0LCAic190
ZXh0dXJlIik7CisgICAgbV9tYXRyaXhMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1f
bGF5ZXJQcm9ncmFtT2JqZWN0LCAibWF0cml4Iik7CisgICAgbV9hbHBoYUxvY2F0aW9uID0gZ2xH
ZXRVbmlmb3JtTG9jYXRpb24obV9sYXllclByb2dyYW1PYmplY3QsICJhbHBoYSIpOworCisgICAg
bV9zY3JvbGxNYXRyaXhMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fc2Nyb2xsUHJv
Z3JhbU9iamVjdCwgIm1hdHJpeCIpOworICAgIG1fc2Nyb2xsU2FtcGxlckxvY2F0aW9uID0gZ2xH
ZXRVbmlmb3JtTG9jYXRpb24obV9zY3JvbGxQcm9ncmFtT2JqZWN0LCAic190ZXh0dXJlIik7CisK
KyAgICAvLyBHZXQgbG9jYXRpb25zIG9mIHVuaWZvcm1zIGZvciB0aGUgZGVidWcgYm9yZGVyIHNo
YWRlciBwcm9ncmFtLgorICAgIG1fYm9yZGVyTWF0cml4TG9jYXRpb24gPSBnbEdldFVuaWZvcm1M
b2NhdGlvbihtX2JvcmRlclByb2dyYW1PYmplY3QsICJtYXRyaXgiKTsKKyAgICBtX2JvcmRlckNv
bG9yTG9jYXRpb24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtX2JvcmRlclByb2dyYW1PYmplY3Qs
ICJjb2xvciIpOworCisgICAgZ2xHZW5CdWZmZXJzKDMsIG1fcXVhZFZib0lkcyk7CisgICAgZ2xC
aW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbV9xdWFkVmJvSWRzW1ZlcnRpY2VzXSk7CisgICAg
Z2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgc2l6ZW9mKHZlcnRpY2VzKSwgdmVydGljZXMs
IEdMX1NUQVRJQ19EUkFXKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZG
RVIsIG1fcXVhZFZib0lkc1tMYXllckVsZW1lbnRzXSk7CisgICAgZ2xCdWZmZXJEYXRhKEdMX0VM
RU1FTlRfQVJSQVlfQlVGRkVSLCBzaXplb2YoaW5kaWNlcyksIGluZGljZXMsIEdMX1NUQVRJQ19E
UkFXKTsKKworICAgIC8vIENyZWF0ZSBhIHRleHR1cmUgb2JqZWN0IHRvIGhvbGQgdGhlIGNvbnRl
bnRzIG9mIHRoZSByb290IGxheWVyLgorICAgIG1fcm9vdExheWVyVGV4dHVyZUlkID0gY3JlYXRl
TGF5ZXJUZXh0dXJlKCk7CisgICAgaWYgKG1fcm9vdExheWVyVGV4dHVyZUlkID09IC0xKSB7Cisg
ICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSB0ZXh0dXJlIGZvciByb290IGxheWVy
Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gVHVybiBvZmYgZmlsdGVy
aW5nIGZvciB0aGUgcm9vdCBsYXllciB0byBhdm9pZCBibHVycmluZyBmcm9tIHRoZSByZXBlYXRl
ZAorICAgIC8vIHdyaXRlcyBhbmQgcmVhZHMgdG8gdGhlIGZyYW1lYnVmZmVyIHRoYXQgaGFwcGVu
IHdoaWxlIHNjcm9sbGluZy4KKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1fcm9v
dExheWVyVGV4dHVyZUlkKTsKKyAgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xf
VEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBnbFRleFBhcmFtZXRlcmYoR0xf
VEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKworICAgIHJl
dHVybiB0cnVlOworfQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gVVNFKEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5oCShyZXZpc2lv
biA1OTYxMikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5k
ZXJlckNocm9taXVtLmgJKHdvcmtpbmcgY29weSkKQEAgLTM2LDQ1ICszNiw5OCBAQAogCiAjaW5j
bHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIkxheWVyQ2hyb21pdW0uaCIKKyNpbmNsdWRlICJT
a0JpdG1hcC5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CiAjaW5jbHVkZSA8d3RmL05vbmNv
cHlhYmxlLmg+CiAjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KICNpbmNsdWRlIDx3dGYvVmVj
dG9yLmg+CiAKLW5hbWVzcGFjZSBza2lhIHsKLWNsYXNzIFBsYXRmb3JtQ2FudmFzOwotfQotCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKK2NsYXNzIEdMRVMyQ29udGV4dDsKK2NsYXNzIFBhZ2U7CisK
Ky8vIENsYXNzIHRoYXQgaGFuZGxlcyBkcmF3aW5nIG9mIGNvbXBvc2l0ZWQgcmVuZGVyIGxheWVy
cyB1c2luZyBHTC4KIGNsYXNzIExheWVyUmVuZGVyZXJDaHJvbWl1bSA6IHB1YmxpYyBOb25jb3B5
YWJsZSB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8TGF5ZXJSZW5kZXJlckNocm9t
aXVtPiBjcmVhdGUoKTsKKyAgICBzdGF0aWMgUGFzc093blB0cjxMYXllclJlbmRlcmVyQ2hyb21p
dW0+IGNyZWF0ZShQYWdlKiBwYWdlKTsKIAotICAgIExheWVyUmVuZGVyZXJDaHJvbWl1bSgpOwor
ICAgIExheWVyUmVuZGVyZXJDaHJvbWl1bShQYWdlKiBwYWdlKTsKICAgICB+TGF5ZXJSZW5kZXJl
ckNocm9taXVtKCk7CiAKLSNpZiBQTEFURk9STShTS0lBKQotICAgIHZvaWQgZHJhd0xheWVyc0lu
Q2FudmFzKHNraWE6OlBsYXRmb3JtQ2FudmFzKiwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpOwot
I2VuZGlmCi0gICAgdm9pZCB1cGRhdGVMYXllckNvbnRlbnRzKCk7CisgICAgLy8gVXBkYXRlcyB0
aGUgY29udGVudHMgb2YgdGhlIHJvb3QgbGF5ZXIgdGhhdCBmYWxsIGluc2lkZSB0aGUgdXBkYXRl
UmVjdCBhbmQgcmVjb21wb3NpdGVzCisgICAgLy8gYWxsIHRoZSBsYXllcnMuCisgICAgdm9pZCBk
cmF3TGF5ZXJzKGNvbnN0IEludFJlY3QmIHVwZGF0ZVJlY3QsIGNvbnN0IEludFJlY3QmIHZpc2li
bGVSZWN0LCBjb25zdCBJbnRSZWN0JiBjb250ZW50UmVjdCwgY29uc3QgSW50UG9pbnQmIHNjcm9s
bFBvc2l0aW9uKTsKIAogICAgIHZvaWQgc2V0Um9vdExheWVyKFBhc3NSZWZQdHI8TGF5ZXJDaHJv
bWl1bT4gbGF5ZXIpIHsgbV9yb290TGF5ZXIgPSBsYXllcjsgfQogICAgIExheWVyQ2hyb21pdW0q
IHJvb3RMYXllcigpIHsgcmV0dXJuIG1fcm9vdExheWVyLmdldCgpOyB9CiAKICAgICB2b2lkIHNl
dE5lZWRzRGlzcGxheSgpIHsgbV9uZWVkc0Rpc3BsYXkgPSB0cnVlOyB9CiAKLSAgICB2b2lkIHNl
dFNjcm9sbEZyYW1lKFNrSVJlY3QmIHNjcm9sbEZyYW1lKSB7IG1fc2Nyb2xsRnJhbWUgPSBzY3Jv
bGxGcmFtZTsgfQorICAgIC8vIEZyZWVzIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUg
Z2l2ZW4gbGF5ZXIuCisgICAgYm9vbCBmcmVlTGF5ZXJUZXh0dXJlKExheWVyQ2hyb21pdW0qKTsK
KworICAgIGJvb2wgaGFyZHdhcmVDb21wb3NpdGluZygpIGNvbnN0IHsgcmV0dXJuIG1faGFyZHdh
cmVDb21wb3NpdGluZzsgfQogCiBwcml2YXRlOgotI2lmIFBMQVRGT1JNKFNLSUEpCi0gICAgdm9p
ZCBkcmF3TGF5ZXJJbkNhbnZhc1JlY3Vyc2l2ZShza2lhOjpQbGF0Zm9ybUNhbnZhcyosIExheWVy
Q2hyb21pdW0qLCBmbG9hdCBvcGFjaXR5KTsKLSNlbmRpZgotICAgIHZvaWQgdXBkYXRlTGF5ZXJD
b250ZW50c1JlY3Vyc2l2ZShMYXllckNocm9taXVtKik7CisgICAgdm9pZCBjb21wb3NpdGVMYXll
cnNSZWN1cnNpdmUoTGF5ZXJDaHJvbWl1bSosIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jiwg
ZmxvYXQgb3BhY2l0eSwgY29uc3QgSW50UmVjdCYgdmlzaWJsZVJlY3QpOworCisgICAgdm9pZCBk
cmF3RGVidWdCb3JkZXIoTGF5ZXJDaHJvbWl1bSosIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4
Jik7CisKKyAgICB2b2lkIGRyYXdUZXh0dXJlZFF1YWQoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRy
aXgmIG1hdHJpeCwgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgZmxvYXQgb3BhY2l0eSwgYm9v
bCBzY3JvbGxpbmcpOworCisgICAgYm9vbCBpc0xheWVyVmlzaWJsZShMYXllckNocm9taXVtKiwg
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmLCBjb25zdCBJbnRSZWN0JiB2aXNpYmxlUmVjdCk7
CisKKyAgICB2b2lkIGJpbmRDb21tb25BdHRyaWJMb2NhdGlvbihpbnQgbG9jYXRpb24sIGNoYXIq
IGF0dHJpYk5hbWUpOworCisgICAgZW51bSBWYm9JZHMgeyBWZXJ0aWNlcywgTGF5ZXJFbGVtZW50
cyB9OworCisgICAgLy8gVGhlc2UgYXJlIGhlcmUgb25seSB0ZW1wb3JhcmlseSBhbmQgc2hvdWxk
IGJlIHJlbW92ZWQgb25jZSB3ZSBzd2l0Y2ggb3ZlciB0byBHR0wKKyAgICBib29sIGluaXRHTCgp
OworICAgIGJvb2wgbWFrZUNvbnRleHRDdXJyZW50KCk7CisKKyAgICBib29sIGluaXRpYWxpemVT
aGFyZWRHTE9iamVjdHMoKTsKKyAgICBpbnQgZ2V0VGV4dHVyZUlkKExheWVyQ2hyb21pdW0qKTsK
KyAgICBpbnQgYXNzaWduVGV4dHVyZUZvckxheWVyKExheWVyQ2hyb21pdW0qKTsKKworICAgIC8v
IEdMIHNoYWRlciBwcm9ncmFtIG9iamVjdCBJRHMuCisgICAgdW5zaWduZWQgaW50IG1fbGF5ZXJQ
cm9ncmFtT2JqZWN0OworICAgIHVuc2lnbmVkIGludCBtX2JvcmRlclByb2dyYW1PYmplY3Q7Cisg
ICAgdW5zaWduZWQgaW50IG1fc2Nyb2xsUHJvZ3JhbU9iamVjdDsKKworICAgIHVuc2lnbmVkIGlu
dCBtX3Jvb3RMYXllclRleHR1cmVJZDsKKyAgICBpbnQgbV9yb290TGF5ZXJUZXh0dXJlV2lkdGg7
CisgICAgaW50IG1fcm9vdExheWVyVGV4dHVyZUhlaWdodDsKKworICAgIC8vIFNoYWRlciB1bmlm
b3JtIGFuZCBhdHRyaWJ1dGUgbG9jYXRpb25zLgorICAgIGNvbnN0IGludCBtX3Bvc2l0aW9uTG9j
YXRpb247CisgICAgY29uc3QgaW50IG1fdGV4Q29vcmRMb2NhdGlvbjsKKyAgICBpbnQgbV9zYW1w
bGVyTG9jYXRpb247CisgICAgaW50IG1fbWF0cml4TG9jYXRpb247CisgICAgaW50IG1fYWxwaGFM
b2NhdGlvbjsKKyAgICBpbnQgbV9zY3JvbGxNYXRyaXhMb2NhdGlvbjsKKyAgICBpbnQgbV9zY3Jv
bGxTYW1wbGVyTG9jYXRpb247CisKKyAgICBpbnQgbV9ib3JkZXJNYXRyaXhMb2NhdGlvbjsKKyAg
ICBpbnQgbV9ib3JkZXJDb2xvckxvY2F0aW9uOworCisgICAgdW5zaWduZWQgaW50IG1fcXVhZFZi
b0lkc1szXTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtX3Byb2plY3Rpb25NYXRyaXg7CiAK
ICAgICBSZWZQdHI8TGF5ZXJDaHJvbWl1bT4gbV9yb290TGF5ZXI7CiAKICAgICBib29sIG1fbmVl
ZHNEaXNwbGF5OwotICAgIFNrSVJlY3QgbV9zY3JvbGxGcmFtZTsKKyAgICBJbnRQb2ludCBtX3Nj
cm9sbFBvc2l0aW9uOworICAgIGJvb2wgbV9oYXJkd2FyZUNvbXBvc2l0aW5nOworCisgICAgLy8g
TWFwIGFzc29jaWF0aW5nIGxheWVycyB3aXRoIHRleHR1cmVzIGlkcyB1c2VkIGJ5IHRoZSBHTCBj
b21wb3NpdG9yLgorICAgIHR5cGVkZWYgSGFzaE1hcDxMYXllckNocm9taXVtKiwgdW5zaWduZWQg
aW50PiBUZXh0dXJlSWRNYXA7CisgICAgVGV4dHVyZUlkTWFwIG1fdGV4dHVyZUlkTWFwOworCisg
ICAgT3duUHRyPEdMRVMyQ29udGV4dD4gbV9nbGVzMkNvbnRleHQ7CisKKyAgICAvLyBUaGUgV2Vi
Q29yZSBQYWdlIHRoYXQgdGhlIGNvbXBvc2l0b3IgcmVuZGVycyBpbnRvLgorICAgIFBhZ2UqIG1f
cGFnZTsKIH07CiAKIH0KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTk2MzApCisrKyBXZWJL
aXQvY2hyb21pdW0vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAKKzIw
MTAtMDUtMTcgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNAY2hyb21pdW0ub3JnPgorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE1vZGlmeWluZyBX
ZWJWaWV3SW1wbCB0byBzdXBwb3J0IG5ldyBoYXJkd2FyZSBjb21wb3NpdGluZyBmb3IKKyAgICAg
ICAgTGF5ZXJDaHJvbWl1bSBsYXllcnMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zODc4MworCisgICAgICAgICogc3JjL1dlYlZpZXdJbXBsLmNwcDoK
KyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnBhaW50KToKKyAgICAgICAgKFdlYktpdDo6
V2ViVmlld0ltcGw6OnNldElzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSk6CisgICAgICAg
IChXZWJLaXQ6OldlYlZpZXdJbXBsOjp1cGRhdGVSb290TGF5ZXJDb250ZW50cyk6CisgICAgICAg
IChXZWJLaXQ6OldlYlZpZXdJbXBsOjpzZXRSb290TGF5ZXJOZWVkc0Rpc3BsYXkpOgorCiAyMDEw
LTA1LTE2ICBNaWtlIEJlbHNoZSAgPG1iZWxzaGVAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IERpbWl0cmkgR2xhemtvdi4KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV2Vi
Vmlld0ltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0lt
cGwuY3BwCShyZXZpc2lvbiA1OTYxMikKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0lt
cGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NzAsMTIgKzk3MCwxOSBAQCB2b2lkIFdlYlZpZXdJ
bXBsOjpwYWludChXZWJDYW52YXMqIGNhbnZhCiAgICAgICAgIC8vIERyYXcgdGhlIGNvbnRlbnRz
IG9mIHRoZSByb290IGxheWVyLgogICAgICAgICB1cGRhdGVSb290TGF5ZXJDb250ZW50cyhyZWN0
KTsKIAotICAgICAgICAvLyBDb21wb3NpdGUgZXZlcnl0aGluZyBpbnRvIHRoZSBjYW52YXMgdGhh
dCdzIHBhc3NlZCB0byB1cy4KLSNpZiBQTEFURk9STShTS0lBKQotICAgICAgICBtX2xheWVyUmVu
ZGVyZXItPmRyYXdMYXllcnNJbkNhbnZhcyhzdGF0aWNfY2FzdDxza2lhOjpQbGF0Zm9ybUNhbnZh
cyo+KGNhbnZhcyksIEludFJlY3QocmVjdCkpOwotI2VsaWYgUExBVEZPUk0oQ0cpCi0jZXJyb3Ig
Ik5lZWQgdG8gaW1wbGVtZW50IENHIHZlcnNpb24iCi0jZW5kaWYKKyAgICAgICAgV2ViRnJhbWVJ
bXBsKiB3ZWJmcmFtZSA9IG1haW5GcmFtZUltcGwoKTsKKyAgICAgICAgaWYgKCF3ZWJmcmFtZSkK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gd2ViZnJhbWUt
PmZyYW1lVmlldygpOworICAgICAgICBpZiAoIXZpZXcpCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgLy8gVGhlIHZpc2libGVSZWN0IGluY2x1ZGVzIHNjcm9sbGJhcnMgd2hlcmVhcyB0
aGUgY29udGVudFJlY3QgZG9lc24ndC4KKyAgICAgICAgSW50UmVjdCB2aXNpYmxlUmVjdCA9IHZp
ZXctPnZpc2libGVDb250ZW50UmVjdCh0cnVlKTsKKyAgICAgICAgSW50UmVjdCBjb250ZW50UmVj
dCA9IHZpZXctPnZpc2libGVDb250ZW50UmVjdChmYWxzZSk7CisKKyAgICAgICAgLy8gQXNrIHRo
ZSBsYXllciBjb21wb3NpdG9yIHRvIHJlZHJhdyBhbGwgdGhlIGxheWVycy4KKyAgICAgICAgbV9s
YXllclJlbmRlcmVyLT5kcmF3TGF5ZXJzKHJlY3QsIHZpc2libGVSZWN0LCBjb250ZW50UmVjdCwg
SW50UG9pbnQodmlldy0+c2Nyb2xsWCgpLCB2aWV3LT5zY3JvbGxZKCkpKTsKICAgICB9CiAjZW5k
aWYKIH0KQEAgLTIwNzIsOSArMjA3OSwxMyBAQCB2b2lkIFdlYlZpZXdJbXBsOjpzZXRJc0FjY2Vs
ZXJhdGVkQ29tcG9zCiAgICAgICAgIHJldHVybjsKIAogICAgIGlmIChhY3RpdmUpIHsKLSAgICAg
ICAgbV9sYXllclJlbmRlcmVyID0gTGF5ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUoKTsKLSAg
ICAgICAgaWYgKG1fbGF5ZXJSZW5kZXJlcikKKyAgICAgICAgbV9sYXllclJlbmRlcmVyID0gTGF5
ZXJSZW5kZXJlckNocm9taXVtOjpjcmVhdGUocGFnZSgpKTsKKyAgICAgICAgaWYgKG1fbGF5ZXJS
ZW5kZXJlci0+aGFyZHdhcmVDb21wb3NpdGluZygpKQogICAgICAgICAgICAgbV9pc0FjY2VsZXJh
dGVkQ29tcG9zaXRpbmdBY3RpdmUgPSB0cnVlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
IG1fbGF5ZXJSZW5kZXJlci5jbGVhcigpOworICAgICAgICAgICAgbV9pc0FjY2VsZXJhdGVkQ29t
cG9zaXRpbmdBY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAg
IG1fbGF5ZXJSZW5kZXJlciA9IDA7CiAgICAgICAgIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5n
QWN0aXZlID0gZmFsc2U7CkBAIC0yMDg2LDYgKzIwOTcsMTIgQEAgdm9pZCBXZWJWaWV3SW1wbDo6
dXBkYXRlUm9vdExheWVyQ29udGVudAogICAgIGlmICghaXNBY2NlbGVyYXRlZENvbXBvc2l0aW5n
QWN0aXZlKCkpCiAgICAgICAgIHJldHVybjsKIAorICAgIC8vIEZJWE1FOiBUaGUgYWNjZWxlcmF0
ZWQgY29tcG9zaXRpbmcgcGF0aCBpbnZhbGlkYXRlcyBhIDF4MSByZWN0IGF0ICgwLCAwKQorICAg
IC8vIGluIG9yZGVyIHRvIGdldCB0aGUgcmVuZGVyZXIgdG8gYXNrIHRoZSBjb21wb3NpdG9yIHRv
IHJlZHJhdy4gVGhpcyBpcyBvbmx5CisgICAgLy8gdGVtcG9yYXJ5IHVudGlsIHdlIGdldCB0aGUg
Y29tcG9zaXRvciB0byByZW5kZXIgZGlyZWN0bHkgZnJvbSBpdHMgb3duIHRocmVhZC4KKyAgICBp
ZiAoIXJlY3QueCAmJiAhcmVjdC55ICYmIHJlY3Qud2lkdGggPT0gMSAmJiByZWN0LmhlaWdodCA9
PSAxKQorICAgICAgICByZXR1cm47CisKICAgICBXZWJGcmFtZUltcGwqIHdlYmZyYW1lID0gbWFp
bkZyYW1lSW1wbCgpOwogICAgIGlmICghd2ViZnJhbWUpCiAgICAgICAgIHJldHVybjsKQEAgLTIw
OTMsMjQgKzIxMTAsMjggQEAgdm9pZCBXZWJWaWV3SW1wbDo6dXBkYXRlUm9vdExheWVyQ29udGVu
dAogICAgIGlmICghdmlldykKICAgICAgICAgcmV0dXJuOwogCi0gICAgV2ViUmVjdCB2aWV3UmVj
dCA9IHZpZXctPmZyYW1lUmVjdCgpOwotICAgIFNrSVJlY3Qgc2Nyb2xsRnJhbWU7Ci0gICAgc2Ny
b2xsRnJhbWUuc2V0KHZpZXctPnNjcm9sbFgoKSwgdmlldy0+c2Nyb2xsWSgpLCB2aWV3LT5sYXlv
dXRXaWR0aCgpICsgdmlldy0+c2Nyb2xsWCgpLCB2aWV3LT5sYXlvdXRIZWlnaHQoKSArIHZpZXct
PnNjcm9sbFkoKSk7Ci0gICAgbV9sYXllclJlbmRlcmVyLT5zZXRTY3JvbGxGcmFtZShzY3JvbGxG
cmFtZSk7CiAgICAgTGF5ZXJDaHJvbWl1bSogcm9vdExheWVyID0gbV9sYXllclJlbmRlcmVyLT5y
b290TGF5ZXIoKTsKICAgICBpZiAocm9vdExheWVyKSB7CiAgICAgICAgIEludFJlY3QgdmlzaWJs
ZVJlY3QgPSB2aWV3LT52aXNpYmxlQ29udGVudFJlY3QodHJ1ZSk7CiAKLSAgICAgICAgLy8gU2V0
IHRoZSBiYWNraW5nIHN0b3JlIHNpemUgdXNlZCBieSB0aGUgcm9vdCBsYXllciB0byBiZSB0aGUg
c2l6ZSBvZiB0aGUgdmlzaWJsZQotICAgICAgICAvLyBhcmVhLiBOb3RlIHRoYXQgdGhlIHJvb3Qg
bGF5ZXIgYm91bmRzIGNvdWxkIGJlIGxhcmdlciB0aGFuIHRoZSBiYWNraW5nIHN0b3JlIHNpemUs
Ci0gICAgICAgIC8vIGJ1dCB0aGVyZSdzIG5vIHJlYXNvbiB0byB3YXN0ZSBtZW1vcnkgYnkgYWxs
b2NhdGluZyBiYWNraW5nIHN0b3JlIGxhcmdlciB0aGFuIHRoZQotICAgICAgICAvLyB2aXNpYmxl
IHBvcnRpb24uCi0gICAgICAgIHJvb3RMYXllci0+c2V0QmFja2luZ1N0b3JlUmVjdChJbnRTaXpl
KHZpc2libGVSZWN0LndpZHRoKCksIHZpc2libGVSZWN0LmhlaWdodCgpKSk7CisgICAgICAgIC8v
IFVwZGF0ZSB0aGUgcm9vdCBsYXllcidzIGJhY2tpbmcgc3RvcmUgdG8gYmUgdGhlIHNpemUgb2Yg
dGhlIGRpcnR5IHJlY3QuCisgICAgICAgIC8vIFVubGlrZSBvdGhlciBsYXllcnMgdGhlIHJvb3Qg
bGF5ZXIgZG9lc24ndCBoYXZlIHBlcnNpc3RlbnQgc3RvcmFnZSBmb3IgaXRzCisgICAgICAgIC8v
IGNvbnRlbnRzIGluIHN5c3RlbSBtZW1vcnkuCisgICAgICAgIHJvb3RMYXllci0+c2V0QmFja2lu
Z1N0b3JlU2l6ZShJbnRTaXplKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KSk7CiAgICAgICAgIEdy
YXBoaWNzQ29udGV4dCogcm9vdExheWVyQ29udGV4dCA9IHJvb3RMYXllci0+Z3JhcGhpY3NDb250
ZXh0KCk7CisgICAgICAgIHNraWE6OlBsYXRmb3JtQ2FudmFzKiBwbGF0Zm9ybUNhbnZhcyA9IHJv
b3RMYXllci0+cGxhdGZvcm1DYW52YXMoKTsKKworICAgICAgICBwbGF0Zm9ybUNhbnZhcy0+c2F2
ZSgpOworCisgICAgICAgIC8vIEJyaW5nIHRoZSBjYW52YXMgaW50byB0aGUgY29vcmRpbmF0ZSBz
eXN0ZW0gb2YgdGhlIHBhaW50IHJlY3QuCisgICAgICAgIHBsYXRmb3JtQ2FudmFzLT50cmFuc2xh
dGUoc3RhdGljX2Nhc3Q8U2tTY2FsYXI+KC1yZWN0LngpLCBzdGF0aWNfY2FzdDxTa1NjYWxhcj4o
LXJlY3QueSkpOworCiAgICAgICAgIHJvb3RMYXllckNvbnRleHQtPnNhdmUoKTsKIAogICAgICAg
ICB3ZWJmcmFtZS0+cGFpbnRXaXRoQ29udGV4dCgqKHJvb3RMYXllci0+Z3JhcGhpY3NDb250ZXh0
KCkpLCByZWN0KTsKICAgICAgICAgcm9vdExheWVyQ29udGV4dC0+cmVzdG9yZSgpOworCisgICAg
ICAgIHBsYXRmb3JtQ2FudmFzLT5yZXN0b3JlKCk7CiAgICAgfQogfQogCkBAIC0yMTE5LDggKzIx
NDAsMTAgQEAgdm9pZCBXZWJWaWV3SW1wbDo6c2V0Um9vdExheWVyTmVlZHNEaXNwbAogICAgIC8v
IEZJWE1FOiBGb3Igbm93IHdlJ3JlIHBvc3RpbmcgYSByZXBhaW50IGV2ZW50IGZvciB0aGUgZW50
aXJlIHBhZ2Ugd2hpY2ggaXMgYW4gb3ZlcmtpbGwuCiAgICAgaWYgKFdlYkZyYW1lSW1wbCogd2Vi
ZnJhbWUgPSBtYWluRnJhbWVJbXBsKCkpIHsKICAgICAgICAgaWYgKEZyYW1lVmlldyogdmlldyA9
IHdlYmZyYW1lLT5mcmFtZVZpZXcoKSkgeworICAgICAgICAgICAgLy8gRklYTUU6IFRlbXBvcmFy
eSBoYWNrIHRvIGludmFsaWRhdGUgcGFydCBvZiB0aGUgcGFnZSBzbyB0aGF0IHdlIGdldCBjYWxs
ZWQgdG8gcmVuZGVyCisgICAgICAgICAgICAvLyAgICAgICAgYWdhaW4uCiAgICAgICAgICAgICBJ
bnRSZWN0IHZpc2libGVSZWN0ID0gdmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KHRydWUpOwotICAg
ICAgICAgICAgbV9jbGllbnQtPmRpZEludmFsaWRhdGVSZWN0KHZpc2libGVSZWN0KTsKKyAgICAg
ICAgICAgIG1fY2xpZW50LT5kaWRJbnZhbGlkYXRlUmVjdChJbnRSZWN0KDAsIDAsIDEsIDEpKTsK
ICAgICAgICAgfQogICAgIH0KIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>