<?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>79875</bug_id>
          
          <creation_ts>2012-02-28 22:45:38 -0800</creation_ts>
          <short_desc>[BlackBerry] Upstream classes that handle layer tiling</short_desc>
          <delta_ts>2012-03-09 09:31:06 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit BlackBerry</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</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>
          
          <blocked>73119</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Robin Cao">robin.webkit</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>arvid2.nilsson</cc>
    
    <cc>charles.wei</cc>
    
    <cc>leo.yang</cc>
    
    <cc>levin+threading</cc>
    
    <cc>manyoso</cc>
    
    <cc>rakuco</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>567395</commentid>
    <comment_count>0</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-02-28 22:45:38 -0800</bug_when>
    <thetext>Classes that handle layer tiling:
    LayerTile.cpp
    LayerTileData.h
    LayerTile.h
    LayerTileIndex.h
    LayerTiler.cpp
    LayerTiler.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568521</commentid>
    <comment_count>1</comment_count>
      <attachid>129676</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-01 03:24:36 -0800</bug_when>
    <thetext>Created attachment 129676
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568524</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-01 03:27:10 -0800</bug_when>
    <thetext>Thanks for the patch. If this patch contains new public API please make sure it follows the guidelines for new WebKit2 GTK+ API. See http://trac.webkit.org/wiki/WebKitGTK/AddingNewWebKit2API</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568525</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-01 03:28:06 -0800</bug_when>
    <thetext>Attachment 129676 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;ChangeLog&apos;, u&apos;LayoutTests/ChangeLog&apos;, u&apos;La...&quot; exit_code: 1
Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:160:  This { should be at the end of the previous line  [whitespace/braces] [4]
Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:177:  This { should be at the end of the previous line  [whitespace/braces] [4]
WARNING: File exempt from style guide. Skipping: &quot;Source/WebKit2/UIProcess/API/gtk/WebKitDefines.h&quot;
Total errors found: 2 in 142 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>568534</commentid>
    <comment_count>4</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-01 03:43:47 -0800</bug_when>
    <thetext>The style error is false positives, a bug has been filed against check-webkit-style: https://bugs.webkit.org/show_bug.cgi?id=80018</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>569129</commentid>
    <comment_count>5</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-01 18:09:47 -0800</bug_when>
    <thetext>LayerTiler.cpp misses an include which is needed in debug build.
#include &quot;LayerMessage.h&quot;

Will add it before landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>569678</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2012-03-02 08:52:47 -0800</bug_when>
    <thetext>Note, this originally had a piece that contained a hunk against LayerTiler.cpp.  I&apos;ve split it up so that is now committed to master_33.  That should be included when you redo this Robin. https://bugs.webkit.org/show_bug.cgi?id=80161</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>569869</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2012-03-02 13:08:16 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; Note, this originally had a piece that contained a hunk against LayerTiler.cpp.  I&apos;ve split it up so that is now committed to master_33.  That should be included when you redo this Robin. https://bugs.webkit.org/show_bug.cgi?id=80161

See webkit/098ee04bed1a7e97ddf7bbeb7389b53a3f98e0ec for a patch that touches LayerTiler.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570550</commentid>
    <comment_count>8</comment_count>
      <attachid>130087</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-05 03:26:29 -0800</bug_when>
    <thetext>Created attachment 130087
patch v2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570551</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-05 03:29:07 -0800</bug_when>
    <thetext>Attachment 130087 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:161:  This { should be at the end of the previous line  [whitespace/braces] [4]
Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:178:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 2 in 7 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>570555</commentid>
    <comment_count>10</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-05 03:34:26 -0800</bug_when>
    <thetext>The style error is false positive, see https://bugs.webkit.org/show_bug.cgi?id=79875#c4</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570985</commentid>
    <comment_count>11</comment_count>
      <attachid>130087</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-03-05 13:12:36 -0800</bug_when>
    <thetext>Comment on attachment 130087
patch v2

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

Looks good, can be cleaned up some more.

&gt; Source/WebCore/platform/graphics/blackberry/LayerTile.h:25
&gt; +#include &quot;IntRect.h&quot;

Can be just forward references.

&gt; Source/WebCore/platform/graphics/blackberry/LayerTileData.h:26
&gt; +class LayerTileData {

Not sure if this tiny class deserves its own file. Could we put it in LayerTile.h?

&gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:153
&gt; +        requiredTextureSize = IntSize(m_layer-&gt;contents()-&gt;width(), m_layer-&gt;contents()-&gt;height());

m_layer-&gt;contents()-&gt;size() should give IntSize too.

&gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:430
&gt; +    }

I&apos;d prefer:
if (result.second) // Successfully added the new job.
    return;

&gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:527
&gt; +            FloatRect rect(-d, -d, 2*d, 2*d);

Watch spacing 2*d

&gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.h:41
&gt; +class TransformationMatrix;

Not used? Please check all.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573763</commentid>
    <comment_count>12</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-08 04:26:37 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; (From update of attachment 130087 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=130087&amp;action=review
&gt; 
&gt; Looks good, can be cleaned up some more.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTile.h:25
&gt; &gt; +#include &quot;IntRect.h&quot;
&gt; 
&gt; Can be just forward references.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTileData.h:26
&gt; &gt; +class LayerTileData {
&gt; 
&gt; Not sure if this tiny class deserves its own file. Could we put it in LayerTile.h?
&gt; 
Fixed

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:153
&gt; &gt; +        requiredTextureSize = IntSize(m_layer-&gt;contents()-&gt;width(), m_layer-&gt;contents()-&gt;height());
&gt; 
&gt; m_layer-&gt;contents()-&gt;size() should give IntSize too.
&gt; 
Good catch, fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:430
&gt; &gt; +    }
&gt; 
&gt; I&apos;d prefer:
&gt; if (result.second) // Successfully added the new job.
&gt;     return;
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:527
&gt; &gt; +            FloatRect rect(-d, -d, 2*d, 2*d);
&gt; 
&gt; Watch spacing 2*d
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.h:41
&gt; &gt; +class TransformationMatrix;
&gt; 
&gt; Not used? Please check all.

All unnecessary includes and forward declarations are removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573768</commentid>
    <comment_count>13</comment_count>
      <attachid>130806</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-08 04:45:41 -0800</bug_when>
    <thetext>Created attachment 130806
patch-v3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573769</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-08 04:48:23 -0800</bug_when>
    <thetext>Attachment 130806 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:160:  This { should be at the end of the previous line  [whitespace/braces] [4]
Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:177:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 2 in 6 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>573838</commentid>
    <comment_count>15</comment_count>
      <attachid>130806</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-03-08 08:02:13 -0800</bug_when>
    <thetext>Comment on attachment 130806
patch-v3

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

Looks good, but needs one more round :)

&gt; Source/WebCore/platform/graphics/blackberry/LayerTileIndex.h:68
&gt; +template&lt;&gt; struct IntHash&lt;WebCore::TileIndex&gt; {

You probably don&apos;t need WebCore:: prefixes in this file.

&gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:153
&gt; +        dirtyRect = IntRect(IntPoint(), requiredTextureSize);

IntPoint::zero

&gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:159
&gt; +    if (requiredTextureSize.isEmpty() || dirtyRect == IntRect(IntPoint(), requiredTextureSize)) {

IntPoint::zero

&gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:648
&gt; +IntSize LayerTiler::defaultTileSize()

It seems this is only used internally? If so you can make it a free, static function.

&gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.h:104
&gt; +            : type(type)

This looks really confusing, can you add m_ to the member vars? This makes it clear which is which.

&gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.h:122
&gt; +        static TextureJob setContents(const SkBitmap&amp; contents, bool isOpaque) { return TextureJob(SetContents, contents, IntRect(IntPoint(), IntSize(contents.width(), contents.height())), isOpaque); }

IntPoint::zero</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574699</commentid>
    <comment_count>16</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-09 00:29:12 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; (From update of attachment 130806 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=130806&amp;action=review
&gt; 
&gt; Looks good, but needs one more round :)
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTileIndex.h:68
&gt; &gt; +template&lt;&gt; struct IntHash&lt;WebCore::TileIndex&gt; {
&gt; 
&gt; You probably don&apos;t need WebCore:: prefixes in this file.
&gt; 
I removed 4 WebCore:: prefixes, the other WebCore:: prefixes in the WTF namespace can not be omitted.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:153
&gt; &gt; +        dirtyRect = IntRect(IntPoint(), requiredTextureSize);
&gt; 
&gt; IntPoint::zero
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:159
&gt; &gt; +    if (requiredTextureSize.isEmpty() || dirtyRect == IntRect(IntPoint(), requiredTextureSize)) {
&gt; 
&gt; IntPoint::zero
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:648
&gt; &gt; +IntSize LayerTiler::defaultTileSize()
&gt; 
&gt; It seems this is only used internally? If so you can make it a free, static function.
&gt; 
Good point, fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.h:104
&gt; &gt; +            : type(type)
&gt; 
&gt; This looks really confusing, can you add m_ to the member vars? This makes it clear which is which.
&gt; 
My bad, I should have found this in the first round. All member variables have been prefixed now.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerTiler.h:122
&gt; &gt; +        static TextureJob setContents(const SkBitmap&amp; contents, bool isOpaque) { return TextureJob(SetContents, contents, IntRect(IntPoint(), IntSize(contents.width(), contents.height())), isOpaque); }
&gt; 
&gt; IntPoint::zero
Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574704</commentid>
    <comment_count>17</comment_count>
      <attachid>131001</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-09 00:45:57 -0800</bug_when>
    <thetext>Created attachment 131001
patch-v4</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574708</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-09 00:48:41 -0800</bug_when>
    <thetext>Attachment 131001 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:167:  This { should be at the end of the previous line  [whitespace/braces] [4]
Source/WebCore/platform/graphics/blackberry/LayerTiler.cpp:184:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 2 in 6 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>574900</commentid>
    <comment_count>19</comment_count>
      <attachid>131001</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-03-09 08:16:32 -0800</bug_when>
    <thetext>Comment on attachment 131001
patch-v4

LGTM.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574950</commentid>
    <comment_count>20</comment_count>
      <attachid>131001</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-09 09:31:00 -0800</bug_when>
    <thetext>Comment on attachment 131001
patch-v4

Clearing flags on attachment: 131001

Committed r110300: &lt;http://trac.webkit.org/changeset/110300&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>574951</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-09 09:31:06 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129676</attachid>
            <date>2012-03-01 03:24:36 -0800</date>
            <delta_ts>2012-03-05 03:26:17 -0800</delta_ts>
            <desc>patch</desc>
            <filename>bug-79875-20120301192431.patch</filename>
            <type>text/plain</type>
            <size>52658</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5MzAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNmJjMWIzZmZmMjZjZTY2
ZjM1YTA0YzgyNThiZThlMzZjMWQyYWM3OS4uMTEyNDljMGVhMTg4MjllODc3NjNiODJmZDkxN2Mz
MTM3MTE0ZGI1YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDk4IEBACisyMDEyLTAzLTAxICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBjbGFzc2VzIHRoYXQgaGFuZGxlIGxheWVyIHRpbGluZworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzk4NzUKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBu
byBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xh
eWVyVGlsZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclRpbGU6OkxheWVyVGlsZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6On5M
YXllclRpbGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlOjpzZXRDb250ZW50cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnNldENvbnRlbnRzVG9Db2xvcik6CisgICAgICAg
IChXZWJDb3JlOjpMYXllclRpbGU6OnVwZGF0ZUNvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyVGlsZTo6ZGlzY2FyZENvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGls
ZTo6c2V0VmlzaWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnNldFRleHR1cmUp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChMYXllclRpbGUpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJUaWxlOjp0ZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGls
ZTo6aXNWaXNpYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZTo6aXNEaXJ0eSk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6Omhhc1RleHR1cmUpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJUaWxlOjpzZXRDb250ZW50c0RpcnR5KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZURhdGEuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
KToKKyAgICAgICAgKExheWVyVGlsZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxl
RGF0YTo6TGF5ZXJUaWxlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVEYXRhOjpp
c1Zpc2libGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJU
aWxlSW5kZXguaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFRpbGVJbmRl
eCk6CisgICAgICAgIChXZWJDb3JlOjpUaWxlSW5kZXg6OlRpbGVJbmRleCk6CisgICAgICAgIChX
ZWJDb3JlOjpUaWxlSW5kZXg6On5UaWxlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6VGlsZUlu
ZGV4OjppKToKKyAgICAgICAgKFdlYkNvcmU6OlRpbGVJbmRleDo6aik6CisgICAgICAgIChXZWJD
b3JlOjpUaWxlSW5kZXg6OnNldEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6Om9wZXJhdG9yPT0p
OgorICAgICAgICAoV2ViQ29yZTo6b3BlcmF0b3IhPSk6CisgICAgICAgIChXVEYpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlci5jcHA6IEFkZGVkLgor
ICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjp0cmFuc2Zvcm1Qb2ludCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpMYXllclRpbGVyKToKKyAgICAgICAgKFdlYkNv
cmU6OkxheWVyVGlsZXI6On5MYXllclRpbGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGls
ZXI6OmxheWVyV2ViS2l0VGhyZWFkRGVzdHJveWVkKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
VGlsZXI6OmxheWVyQ29tcG9zaXRpbmdUaHJlYWREZXN0cm95ZWQpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJUaWxlcjo6c2V0TmVlZHNEaXNwbGF5KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
VGlsZXI6OnVwZGF0ZVRleHR1cmVDb250ZW50c0lmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyVGlsZXI6OnNob3VsZFBlcmZvcm1SZW5kZXJKb2IpOgorICAgICAgICAoV2ViQ29yZTo6
TGF5ZXJUaWxlcjo6YWRkVGV4dHVyZUpvYik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVy
OjpjbGVhclRleHR1cmVKb2JzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmNvbW1p
dFBlbmRpbmdUZXh0dXJlVXBsb2Fkcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjps
YXllclZpc2liaWxpdHlDaGFuZ2VkKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnVw
bG9hZFRleHR1cmVzSWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6cHJv
Y2Vzc1RleHR1cmVKb2IpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6YWRkVGlsZUpv
Yik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpwZXJmb3JtVGlsZUpvYik6CisgICAg
ICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpkcmF3VGV4dHVyZXMpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJUaWxlcjo6ZHJhd01pc3NpbmdUZXh0dXJlcyk6CisgICAgICAgIChXZWJDb3JlOjpM
YXllclRpbGVyOjpkcmF3VGV4dHVyZXNJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpMYXll
clRpbGVyOjphZGRSZW5kZXJKb2IpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6cmVt
b3ZlUmVuZGVySm9iKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmRlbGV0ZVRleHR1
cmVzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnBydW5lVGV4dHVyZXMpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6ZGVmYXVsdFRpbGVTaXplKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyVGlsZXI6OnVwZGF0ZVRpbGVTaXplKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyVGlsZXI6OmRpc2FibGVUaWxpbmcpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6
c2hvdWxkUHJlZmlsbFRpbGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6aW5kZXhP
ZlRpbGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6b3JpZ2luT2ZUaWxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnJlY3RGb3JUaWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OkxheWVyVGlsZXI6Omhhc0RpcnR5VGlsZXMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJU
aWxlcjo6YmluZENvbnRlbnRzVGV4dHVyZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
YmxhY2tiZXJyeS9MYXllclRpbGVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAg
ICAgIChMYXllclRpbGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmNyZWF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpsYXllcik6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclRpbGVyOjpoYXNNaXNzaW5nVGV4dHVyZXMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5
ZXJUaWxlcjo6VGV4dHVyZUpvYjo6VGV4dHVyZUpvYik6CisgICAgICAgIChUZXh0dXJlSm9iKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OlRleHR1cmVKb2I6OnNldENvbnRlbnRzKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OlRleHR1cmVKb2I6OnNldENvbnRlbnRzVG9D
b2xvcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpUZXh0dXJlSm9iOjp1cGRhdGVD
b250ZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpUZXh0dXJlSm9iOjpkaXNj
YXJkQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6VGV4dHVyZUpvYjo6
cmVzaXplQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6VGV4dHVyZUpv
Yjo6ZGlydHlDb250ZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpUZXh0dXJl
Sm9iOjppc051bGwpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6dGlsZVNpemUpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6cmVtb3ZlVXBkYXRlQ29udGVudHNKb2JzKToK
KwogMjAxMi0wMi0yOSAgSmFzb24gTGl1ICA8amFzb24ubGl1QHRvcmNobW9iaWxlLmNvbS5jbj4K
IAogICAgICAgICBbQmxhY2tCZXJyeV1NYWtlIGFib3V0OmNhY2hlIGZlYXR1cmUgYXZhaWxhYmxl
IGluIHJlbGVhc2UgdmVyc2lvbi4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wYzUzZWUw
MThiYTRjYWNmYTQxNDY4MTFjOGI5N2NiMWEwNWM1MjA1Ci0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGUuY3BwCkBA
IC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNo
IEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAq
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5v
dCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy
YW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKworI2luY2x1ZGUgIkxheWVyVGlsZS5oIgorCisjaW5jbHVkZSAiVGV4dHVyZUNhY2hl
Q29tcG9zaXRpbmdUaHJlYWQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitMYXllclRpbGU6
OkxheWVyVGlsZSgpCisgICAgOiBtX2NvbnRlbnRzRGlydHkoZmFsc2UpCit7Cit9CisKK0xheWVy
VGlsZTo6fkxheWVyVGlsZSgpCit7CisgICAgLy8gTWFrZSBzdXJlIHRvIHVucHJvdGVjdCB0aGUg
dGV4dHVyZSBpZiBuZWVkZWQuCisgICAgc2V0VmlzaWJsZShmYWxzZSk7Cit9CisKK3ZvaWQgTGF5
ZXJUaWxlOjpzZXRDb250ZW50cyhjb25zdCBTa0JpdG1hcCYgY29udGVudHMsIGNvbnN0IEludFJl
Y3QmIHRpbGVSZWN0LCBjb25zdCBUaWxlSW5kZXgmIGluZGV4LCBib29sIGlzT3BhcXVlKQorewor
ICAgIHNldFRleHR1cmUodGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKS0+dGV4dHVyZUZv
clRpbGVkQ29udGVudHMoY29udGVudHMsIHRpbGVSZWN0LCBpbmRleCwgaXNPcGFxdWUpKTsKK30K
Kwordm9pZCBMYXllclRpbGU6OnNldENvbnRlbnRzVG9Db2xvcihjb25zdCBDb2xvciYgY29sb3Ip
Cit7CisgICAgc2V0VGV4dHVyZSh0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT50ZXh0
dXJlRm9yQ29sb3IoY29sb3IpKTsKK30KKwordm9pZCBMYXllclRpbGU6OnVwZGF0ZUNvbnRlbnRz
KGNvbnN0IFNrQml0bWFwJiBjb250ZW50cywgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0LCBjb25z
dCBJbnRSZWN0JiB0aWxlUmVjdCkKK3sKKyAgICBzZXRUZXh0dXJlKHRleHR1cmVDYWNoZUNvbXBv
c2l0aW5nVGhyZWFkKCktPnVwZGF0ZUNvbnRlbnRzKG1fdGV4dHVyZSwgY29udGVudHMsIGRpcnR5
UmVjdCwgdGlsZVJlY3QpKTsKK30KKwordm9pZCBMYXllclRpbGU6OmRpc2NhcmRDb250ZW50cygp
Cit7CisgICAgc2V0VGV4dHVyZSgwKTsKK30KKwordm9pZCBMYXllclRpbGU6OnNldFZpc2libGUo
Ym9vbCB2aXNpYmxlKQoreworICAgIGlmICh2aXNpYmxlID09IG1fdmlzaWJsZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV92aXNpYmxlID0gdmlzaWJsZTsKKworICAgIGlmICghbV90ZXh0dXJl
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBQcm90ZWN0IHRoZSB0ZXh0dXJlIGZyb20gYmVp
bmcgZXZpY3RlZCBmcm9tIGNhY2hlCisgICAgLy8gaWYgd2UgYXJlIHZpc2libGUuCisgICAgaWYg
KHZpc2libGUpCisgICAgICAgIG1fdGV4dHVyZS0+cHJvdGVjdCgpOworICAgIGVsc2UKKyAgICAg
ICAgbV90ZXh0dXJlLT51bnByb3RlY3QoKTsKK30KKwordm9pZCBMYXllclRpbGU6OnNldFRleHR1
cmUoUGFzc1JlZlB0cjxUZXh0dXJlPiB0ZXh0dXJlKQoreworICAgIC8vIENsZWFyIHRoaXMgZmxh
ZyByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dHVyZSBwYXJhbWV0ZXIuCisgICAg
Ly8gSWYgaXQncyAwLCBpc0RpcnR5KCkgd2lsbCByZXR1cm4gdHJ1ZSBhbnl3YXkuCisgICAgLy8g
SWYgaXQncyB0aGUgc2FtZSB0ZXh0dXJlLCBwZXJoYXBzIHRoZXJlIHdhcyBubyBtb3JlIGRldGFp
bGVkIHRleHR1cmUKKyAgICAvLyBhdmFpbGFibGUgdGhhbiB0aGUgb25lIHdlIGFscmVhZHkgaGFk
LCBhbmQga2VlcGluZyB0aGUgZGlydHkgZmxhZyB3aWxsCisgICAgLy8gcmVzdWx0IGluIGFuIGVu
ZGxlc3MgbG9vcCBvZiB1cGRhdGluZyB0byB0aGUgc2FtZSB0ZXh0dXJlLgorICAgIG1fY29udGVu
dHNEaXJ0eSA9IGZhbHNlOworCisgICAgaWYgKHRleHR1cmUgPT0gbV90ZXh0dXJlKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBNb3ZlIHByb3RlY3Rpb24gb3ZlciB0byB0aGUgbmV3IHRleHR1
cmUKKyAgICBpZiAobV92aXNpYmxlKSB7CisgICAgICAgIGlmIChtX3RleHR1cmUpCisgICAgICAg
ICAgICBtX3RleHR1cmUtPnVucHJvdGVjdCgpOworICAgICAgICBpZiAodGV4dHVyZSkKKyAgICAg
ICAgICAgIHRleHR1cmUtPnByb3RlY3QoKTsKKyAgICB9CisKKyAgICBtX3RleHR1cmUgPSB0ZXh0
dXJlOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42NjY2YTA4NzIwYTU0
ZGJiZjdlYmFiNjM2NzUyYTgzZTZkMjM3Mjk2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGUuaApAQCAtMCwwICsx
LDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlv
biBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQ
dWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUg
dG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNp
Zm5kZWYgTGF5ZXJUaWxlX2gKKyNkZWZpbmUgTGF5ZXJUaWxlX2gKKworI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVkZSAiSW50UmVj
dC5oIgorI2luY2x1ZGUgIkxheWVyVGlsZURhdGEuaCIKKyNpbmNsdWRlICJMYXllclRpbGVJbmRl
eC5oIgorI2luY2x1ZGUgIlRleHR1cmUuaCIKKworI2luY2x1ZGUgPFNrQml0bWFwLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5ZXJUaWxlIDogcHVibGljIExheWVyVGlsZURh
dGEgeworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIExheWVyVGls
ZSgpOworICAgIH5MYXllclRpbGUoKTsKKworICAgIFRleHR1cmUqIHRleHR1cmUoKSBjb25zdCB7
IHJldHVybiBtX3RleHR1cmUuZ2V0KCk7IH0KKworICAgIGJvb2wgaXNWaXNpYmxlKCkgY29uc3Qg
eyByZXR1cm4gbV92aXNpYmxlOyB9CisgICAgdm9pZCBzZXRWaXNpYmxlKGJvb2wpOworCisgICAg
Ym9vbCBpc0RpcnR5KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50c0RpcnR5IHx8ICFtX3RleHR1
cmUgfHwgbV90ZXh0dXJlLT5pc0RpcnR5KCk7IH0KKworICAgIGJvb2wgaGFzVGV4dHVyZSgpIGNv
bnN0IHsgcmV0dXJuIG1fdGV4dHVyZSAmJiBtX3RleHR1cmUtPmhhc1RleHR1cmUoKTsgfQorCisg
ICAgdm9pZCBzZXRDb250ZW50cyhjb25zdCBTa0JpdG1hcCYgY29udGVudHMsIGNvbnN0IEludFJl
Y3QmIHRpbGVSZWN0LCBjb25zdCBUaWxlSW5kZXgmLCBib29sIGlzT3BhcXVlKTsKKyAgICB2b2lk
IHNldENvbnRlbnRzVG9Db2xvcihjb25zdCBDb2xvciYpOworICAgIHZvaWQgdXBkYXRlQ29udGVu
dHMoY29uc3QgU2tCaXRtYXAmIGNvbnRlbnRzLCBjb25zdCBJbnRSZWN0JiBkaXJ0eVJlY3QsIGNv
bnN0IEludFJlY3QmIHRpbGVSZWN0KTsKKyAgICB2b2lkIGRpc2NhcmRDb250ZW50cygpOworCisg
ICAgLy8gVGhlIGN1cnJlbnQgdGV4dHVyZSBpcyBhbiBhY2N1cmF0ZSBwcmV2aWV3IG9mIHRoaXMg
bGF5ZXIsIGJ1dCBhIG1vcmUKKyAgICAvLyBkZXRhaWxlZCB0ZXh0dXJlIGNvdWxkIGJlIG9idGFp
bmVkIGJ5IHJlcGFpbnRpbmcgdGhlIGxheWVyLiBVc2VkIHdoZW4KKyAgICAvLyB6b29tIGxldmVs
IGNoYW5nZXMuCisgICAgdm9pZCBzZXRDb250ZW50c0RpcnR5KCkgeyBtX2NvbnRlbnRzRGlydHkg
PSB0cnVlOyB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBzZXRUZXh0dXJlKFBhc3NSZWZQdHI8VGV4
dHVyZT4pOworCisgICAgUmVmUHRyPFRleHR1cmU+IG1fdGV4dHVyZTsgLy8gTmV2ZXIgYXNzaWdu
IHRvIG1fdGV4dHVyZSBkaXJlY3RseSwgdXNlIHNldFRleHR1cmUoKSBhYm92ZQorICAgIGJvb2wg
bV9jb250ZW50c0RpcnR5OworfTsKKworfQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorCisjZW5kaWYgLy8gVGV4dHVyZV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZURhdGEuaCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlRGF0YS5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmZkMDViZGQxNjFlZDYzZGZlYTY1ODFlNWVjNWQ3NmUzYTk5OTJlYzUKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5
L0xheWVyVGlsZURhdGEuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEg
IDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgTGF5ZXJUaWxlRGF0YV9oCisjZGVmaW5l
IExheWVyVGlsZURhdGFfaAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIExheWVyVGlsZURhdGEgeworcHVibGljOgorICAg
IExheWVyVGlsZURhdGEoKQorICAgICAgICA6IG1fdmlzaWJsZShmYWxzZSkKKyAgICB7CisgICAg
fQorCisgICAgYm9vbCBpc1Zpc2libGUoKSBjb25zdCB7IHJldHVybiBtX3Zpc2libGU7IH0KKwor
cHJvdGVjdGVkOgorICAgIGJvb2wgbV92aXNpYmxlOworfTsKKworfQorCisjZW5kaWYgLy8gVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gTGF5ZXJUaWxlRGF0YV9oCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xh
eWVyVGlsZUluZGV4LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2Jl
cnJ5L0xheWVyVGlsZUluZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNTA3OTdhZTFiYWQ4MDFlYTEzMzg1Nzg0
ZDg1ZTU2NGVjNzcwMmYxNAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlSW5kZXguaApAQCAtMCwwICsxLDkzIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhl
IEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYg
TGF5ZXJUaWxlSW5kZXhfaAorI2RlZmluZSBMYXllclRpbGVJbmRleF9oCisKKyNpbmNsdWRlIDxs
aW1pdHM+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitjbGFzcyBUaWxlSW5kZXggeworcHVibGljOgorICAgIFRpbGVJbmRleCgpCisgICAgICAgIDog
bV9pKHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSkKKyAgICAgICAgLCBtX2oo
c3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpKQorICAgIHsKKyAgICB9CisgICAg
VGlsZUluZGV4KHVuc2lnbmVkIGksIHVuc2lnbmVkIGopCisgICAgICAgIDogbV9pKGkpCisgICAg
ICAgICwgbV9qKGopCisgICAgeworICAgIH0KKyAgICB+VGlsZUluZGV4KCkgeyB9CisKKyAgICB1
bnNpZ25lZCBpKCkgY29uc3QgeyByZXR1cm4gbV9pOyB9CisgICAgdW5zaWduZWQgaigpIGNvbnN0
IHsgcmV0dXJuIG1fajsgfQorICAgIHZvaWQgc2V0SW5kZXgodW5zaWduZWQgaSwgdW5zaWduZWQg
aikKKyAgICB7CisgICAgICAgIG1faSA9IGk7CisgICAgICAgIG1faiA9IGo7CisgICAgfQorCitw
cml2YXRlOgorICAgIHVuc2lnbmVkIG1faTsKKyAgICB1bnNpZ25lZCBtX2o7Cit9OworCitpbmxp
bmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFdlYkNvcmU6OlRpbGVJbmRleCYgYSwgY29uc3QgV2Vi
Q29yZTo6VGlsZUluZGV4JiBiKQoreworICAgIHJldHVybiBhLmkoKSA9PSBiLmkoKSAmJiBhLmoo
KSA9PSBiLmooKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBXZWJDb3JlOjpU
aWxlSW5kZXgmIGEsIGNvbnN0IFdlYkNvcmU6OlRpbGVJbmRleCYgYikKK3sKKyAgICByZXR1cm4g
YS5pKCkgIT0gYi5pKCkgfHwgYS5qKCkgIT0gYi5qKCk7Cit9CisKK30KKworbmFtZXNwYWNlIFdU
RiB7CisKK3RlbXBsYXRlPD4gc3RydWN0IEludEhhc2g8V2ViQ29yZTo6VGlsZUluZGV4PiB7Cisg
ICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgV2ViQ29yZTo6VGlsZUluZGV4JiBrZXkpIHsg
cmV0dXJuIGludEhhc2goKHN0YXRpY19jYXN0PHVpbnQ2NF90PihrZXkuaSgpKSA8PCAzMiB8IGtl
eS5qKCkpKTsgfQorICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IFdlYkNvcmU6OlRpbGVJbmRl
eCYgYSwgY29uc3QgV2ViQ29yZTo6VGlsZUluZGV4JiBiKSB7IHJldHVybiBhID09IGI7IH0KKyAg
ICBzdGF0aWMgY29uc3QgYm9vbCBzYWZlVG9Db21wYXJlVG9FbXB0eU9yRGVsZXRlZCA9IHRydWU7
Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgRGVmYXVsdEhhc2g8V2ViQ29yZTo6VGlsZUluZGV4PiB7
CisgICAgdHlwZWRlZiBJbnRIYXNoPFdlYkNvcmU6OlRpbGVJbmRleD4gSGFzaDsKK307CisKK3Rl
bXBsYXRlPD4gc3RydWN0IEhhc2hUcmFpdHM8V2ViQ29yZTo6VGlsZUluZGV4PiA6IEdlbmVyaWNI
YXNoVHJhaXRzPFdlYkNvcmU6OlRpbGVJbmRleD4geworICAgIHN0YXRpYyBjb25zdCBib29sIGVt
cHR5VmFsdWVJc1plcm8gPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBuZWVkc0Rlc3Ry
dWN0aW9uID0gZmFsc2U7CisgICAgc3RhdGljIFdlYkNvcmU6OlRpbGVJbmRleCBlbXB0eVZhbHVl
KCkgeyByZXR1cm4gV2ViQ29yZTo6VGlsZUluZGV4KCk7IH0KKyAgICBzdGF0aWMgdm9pZCBjb25z
dHJ1Y3REZWxldGVkVmFsdWUoV2ViQ29yZTo6VGlsZUluZGV4JiBzbG90KQorICAgIHsKKyAgICAg
ICAgbmV3ICgmc2xvdCkgV2ViQ29yZTo6VGlsZUluZGV4KHN0ZDo6bnVtZXJpY19saW1pdHM8dW5z
aWduZWQ+OjptYXgoKSAtIDEsIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSAt
IDEpOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBpc0RlbGV0ZWRWYWx1ZShjb25zdCBXZWJDb3Jl
OjpUaWxlSW5kZXgmIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLmkoKSA9PSBz
dGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgLSAxICYmIHZhbHVlLmooKSA9PSBz
dGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgLSAxOworICAgIH0KK307CisKK30g
Ly8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYgLy8gTGF5ZXJUaWxlSW5kZXhfaApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVy
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJU
aWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uZjFlZWYxNTk0NzU0NDdjODQwMzQxNzVlMDM3YzA4ODQ4OGE2
NTUzYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2JsYWNrYmVycnkvTGF5ZXJUaWxlci5jcHAKQEAgLTAsMCArMSw3NDkgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy
ZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwg
Qm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiTGF5ZXJUaWxl
ci5oIgorCisjaW5jbHVkZSAiQml0bWFwSW1hZ2UuaCIKKyNpbmNsdWRlICJMYXllckNvbXBvc2l0
aW5nVGhyZWFkLmgiCisjaW5jbHVkZSAiTGF5ZXJUaWxlLmgiCisjaW5jbHVkZSAiTGF5ZXJXZWJL
aXRUaHJlYWQuaCIKKyNpbmNsdWRlICJOYXRpdmVJbWFnZVNraWEuaCIKKyNpbmNsdWRlICJUZXh0
dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZC5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRm
b3JtU2NyZWVuLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBz
dGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gVGhpcyBpcyB1c2VkIHRvIG1ha2UgdGhl
IHZpZXdwb3J0IGFzIHVzZWQgaW4gdGV4dHVyZSB2aXNpYmlsaXR5IGNhbGN1bGF0aW9ucworLy8g
c2xpZ2h0bHkgbGFyZ2VyIHNvIHRleHR1cmVzIGFyZSB1cGxvYWRlZCBiZWZvcmUgYmVjb21pbmcg
cmVhbGx5IHZpc2libGUuCitjb25zdCBmbG9hdCB2aWV3cG9ydEluZmxhdGlvbkZhY3RvciA9IDEu
MWY7CisKKy8vIFRoZSB0aWxlTXVsdGlwbGllciBpbmRpY2F0ZXMgaG93IG1hbnkgdGlsZXMgd2ls
bCBmaXQgaW4gdGhlIGxhcmdlc3QgZGltZW5zaW9uCisvLyBvZiB0aGUgc2NyZWVuLCBpZiBkcmF3
biB1c2luZyBpZGVudGl0eSB0cmFuc2Zvcm0uCisvLyBXZSB1c2UgaGFsZiB0aGUgc2NyZWVuIHNp
emUgYXMgdGlsZSBzaXplLCB0byByZWR1Y2UgdGhlIHRleHR1cmUgdXBsb2FkIHRpbWUKKy8vIGZv
ciBzbWFsbCByZXBhaW50IHJlY3RzLiBDb21wYXJlZCB0byB1c2luZyBzY3JlZW4gc2l6ZSBkaXJl
Y3RseSwgdGhpcyBzaG91bGQKKy8vIG1ha2UgbW9zdCBzbWFsbCBpbnZhbGlkYXRpb25zIDE2eCBm
YXN0ZXIsIHVubGVzcyB0aGV5J3JlIHVuZm9ydHVuYXRlIGVub3VnaAorLy8gdG8gaW50ZXJzZWN0
IHR3byBvciBtb3JlIHRpbGVzLCB3aGVyZSBpdCB3b3VsZCBiZSA4eC0xeCBmYXN0ZXIuCitjb25z
dCBpbnQgdGlsZU11bHRpcGxpZXIgPSA0OworCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1Qb2ludChm
bG9hdCB4LCBmbG9hdCB5LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgbSwgZmxvYXQqIHJl
c3VsdCkKK3sKKyAgICAvLyBTcXVhc2ggdGhlIFogY29vcmRpbmF0ZSBzbyB0aGF0IGxheWVycyBh
cmVuJ3QgY2xpcHBlZCBhZ2FpbnN0IHRoZSBuZWFyIGFuZAorICAgIC8vIGZhciBwbGFuZS4gTm90
ZSB0aGF0IHRoZSBwZXJzcGVjdGl2ZSBpcyBtYWludGFpbmVkIGFzIHdlJ3JlIHN0aWxsIHBhc3Np
bmcKKyAgICAvLyBkb3duIHRoZSBXIGNvb3JkaW5hdGUuCisgICAgcmVzdWx0WzBdID0geCAqIG0u
bTExKCkgKyB5ICogbS5tMjEoKSArIG0ubTQxKCk7CisgICAgcmVzdWx0WzFdID0geCAqIG0ubTEy
KCkgKyB5ICogbS5tMjIoKSArIG0ubTQyKCk7CisgICAgcmVzdWx0WzJdID0gMDsKKyAgICByZXN1
bHRbM10gPSB4ICogbS5tMTQoKSArIHkgKiBtLm0yNCgpICsgbS5tNDQoKTsKK30KKworTGF5ZXJU
aWxlcjo6TGF5ZXJUaWxlcihMYXllcldlYktpdFRocmVhZCogbGF5ZXIpCisgICAgOiBtX2xheWVy
KGxheWVyKQorICAgICwgbV90aWxpbmdEaXNhYmxlZChmYWxzZSkKKyAgICAsIG1fY29udGVudHNE
aXJ0eShmYWxzZSkKKyAgICAsIG1fdGlsZVNpemUoZGVmYXVsdFRpbGVTaXplKCkpCisgICAgLCBt
X2NsZWFyVGV4dHVyZUpvYnMoZmFsc2UpCisgICAgLCBtX2hhc01pc3NpbmdUZXh0dXJlcyhmYWxz
ZSkKKyAgICAsIG1fY29udGVudHNTY2FsZSgwLjApCit7Cit9CisKK0xheWVyVGlsZXI6On5MYXll
clRpbGVyKCkKK3sKKyAgICAvLyBTb21lb25lIHNob3VsZCBoYXZlIGNhbGxlZCBMYXllclRpbGVy
OjpkZWxldGVUZXh0dXJlcygpCisgICAgLy8gYmVmb3JlIG5vdy4gV2UgY2FuJ3QgY2FsbCBpdCBo
ZXJlIGJlY2F1c2Ugd2UgaGF2ZSBubworICAgIC8vIE9wZW5HTCBjb250ZXh0LgorICAgIEFTU0VS
VChtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuaXNFbXB0eSgpKTsKK30KKwordm9pZCBMYXllclRp
bGVyOjpsYXllcldlYktpdFRocmVhZERlc3Ryb3llZCgpCit7CisgICAgbV9sYXllciA9IDA7Cit9
CisKK3ZvaWQgTGF5ZXJUaWxlcjo6bGF5ZXJDb21wb3NpdGluZ1RocmVhZERlc3Ryb3llZCgpCit7
CisgICAgQVNTRVJUKGlzQ29tcG9zaXRpbmdUaHJlYWQoKSk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxl
cjo6c2V0TmVlZHNEaXNwbGF5KGNvbnN0IEZsb2F0UmVjdCYgZGlydHlSZWN0KQoreworICAgIG1f
ZGlydHlSZWN0LnVuaXRlKGRpcnR5UmVjdCk7CisgICAgbV9jb250ZW50c0RpcnR5ID0gdHJ1ZTsK
K30KKwordm9pZCBMYXllclRpbGVyOjpzZXROZWVkc0Rpc3BsYXkoKQoreworICAgIG1fZGlydHlS
ZWN0LnNldExvY2F0aW9uKEZsb2F0UG9pbnQoKSk7CisgICAgbV9kaXJ0eVJlY3Quc2V0U2l6ZSht
X2xheWVyLT5ib3VuZHMoKSk7CisgICAgbV9jb250ZW50c0RpcnR5ID0gdHJ1ZTsKK30KKwordm9p
ZCBMYXllclRpbGVyOjp1cGRhdGVUZXh0dXJlQ29udGVudHNJZk5lZWRlZChkb3VibGUgc2NhbGUp
Cit7CisgICAgdXBkYXRlVGlsZVNpemUoKTsKKworICAgIEhhc2hTZXQ8VGlsZUluZGV4PiByZW5k
ZXJKb2JzOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fcmVuZGVySm9ic011
dGV4KTsKKyAgICAgICAgaWYgKCFtX2NvbnRlbnRzRGlydHkgJiYgbV9yZW5kZXJKb2JzLmlzRW1w
dHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcmVuZGVySm9icyA9IG1fcmVuZGVy
Sm9iczsKKyAgICB9CisKKyAgICBib29sIGlzWm9vbUpvYiA9IGZhbHNlOworICAgIGlmIChzY2Fs
ZSAhPSBtX2NvbnRlbnRzU2NhbGUpIHsKKyAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgYXJvdW5k
LCBpdCBkb2VzIG5vdCBjb3VudCBhcyBhIHpvb20gam9iLgorICAgICAgICBpZiAobV9jb250ZW50
c1NjYWxlKQorICAgICAgICAgICAgaXNab29tSm9iID0gdHJ1ZTsKKyAgICAgICAgbV9jb250ZW50
c1NjYWxlID0gc2NhbGU7CisgICAgfQorCisgICAgSW50UmVjdCBkaXJ0eVJlY3QgPSBlbmNsb3Np
bmdJbnRSZWN0KG1fZGlydHlSZWN0KTsKKyAgICBJbnRTaXplIHJlcXVpcmVkVGV4dHVyZVNpemU7
CisKKyAgICBpZiAobV9sYXllci0+ZHJhd3NDb250ZW50KCkpIHsKKyAgICAgICAgLy8gTGF5ZXIg
Y29udGVudHMgbXVzdCBiZSBkcmF3biBpbnRvIGEgY2FudmFzLgorICAgICAgICBJbnRSZWN0IHVu
dHJhbnNmb3JtZWREaXJ0eVJlY3QoZGlydHlSZWN0KTsKKyAgICAgICAgSW50UmVjdCBib3VuZHNS
ZWN0KEludFBvaW50Ojp6ZXJvKCksIG1fbGF5ZXItPmJvdW5kcygpKTsKKyAgICAgICAgSW50UmVj
dCB1bnRyYW5zZm9ybWVkQm91bmRzUmVjdChib3VuZHNSZWN0KTsKKyAgICAgICAgcmVxdWlyZWRU
ZXh0dXJlU2l6ZSA9IGJvdW5kc1JlY3Quc2l6ZSgpOworCisgICAgICAgIGlmIChzY2FsZSAhPSAx
LjApIHsKKyAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeDsKKyAgICAgICAg
ICAgIG1hdHJpeC5zY2FsZShzY2FsZSk7CisKKyAgICAgICAgICAgIGRpcnR5UmVjdCA9IG1hdHJp
eC5tYXBSZWN0KHVudHJhbnNmb3JtZWREaXJ0eVJlY3QpOworICAgICAgICAgICAgcmVxdWlyZWRU
ZXh0dXJlU2l6ZSA9IG1hdHJpeC5tYXBSZWN0KEludFJlY3QoSW50UG9pbnQ6Onplcm8oKSwgcmVx
dWlyZWRUZXh0dXJlU2l6ZSkpLnNpemUoKTsKKyAgICAgICAgICAgIGJvdW5kc1JlY3QgPSBtYXRy
aXgubWFwUmVjdCh1bnRyYW5zZm9ybWVkQm91bmRzUmVjdCk7CisgICAgICAgIH0KKworICAgICAg
ICBpZiAocmVxdWlyZWRUZXh0dXJlU2l6ZSAhPSBtX3BlbmRpbmdUZXh0dXJlU2l6ZSkKKyAgICAg
ICAgICAgIGRpcnR5UmVjdCA9IGJvdW5kc1JlY3Q7CisgICAgICAgIGVsc2UgeworICAgICAgICAg
ICAgLy8gQ2xpcCB0aGUgZGlydHlSZWN0IHRvIHRoZSBzaXplIG9mIHRoZSBsYXllciB0byBhdm9p
ZCBkcmF3aW5nCisgICAgICAgICAgICAvLyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIGJhY2tp
bmcgdGV4dHVyZS4KKyAgICAgICAgICAgIGRpcnR5UmVjdC5pbnRlcnNlY3QoYm91bmRzUmVjdCk7
CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1fbGF5ZXItPmNvbnRlbnRzKCkpIHsKKyAgICAg
ICAgLy8gTGF5ZXIgaXMgYSBjb250YWluZXIsIGFuZCBpdCBjb250YWlucyBhbiBJbWFnZS4KKyAg
ICAgICAgcmVxdWlyZWRUZXh0dXJlU2l6ZSA9IEludFNpemUobV9sYXllci0+Y29udGVudHMoKS0+
d2lkdGgoKSwgbV9sYXllci0+Y29udGVudHMoKS0+aGVpZ2h0KCkpOworICAgICAgICBkaXJ0eVJl
Y3QgPSBJbnRSZWN0KEludFBvaW50KCksIHJlcXVpcmVkVGV4dHVyZVNpemUpOworICAgIH0KKwor
ICAgIC8vIElmIHdlIG5lZWQgZGlzcGxheSBiZWNhdXNlIHdlIG5vIGxvbmdlciBuZWVkIHRvIGJl
IGRpc3BsYXllZCwgZHVlIHRvIHRleHR1cmUgc2l6ZSBiZWNvbWluZyAwIHggMCwKKyAgICAvLyBv
ciBpZiB3ZSdyZSByZS1yZW5kZXJpbmcgdGhlIHdob2xlIHRoaW5nIGFueXdheSwgY2xlYXIgb2xk
IHRleHR1cmUgam9icy4KKyAgICBIYXNoU2V0PFRpbGVJbmRleD4gZmluaXNoZWRKb2JzOworICAg
IGlmIChyZXF1aXJlZFRleHR1cmVTaXplLmlzRW1wdHkoKSB8fCBkaXJ0eVJlY3QgPT0gSW50UmVj
dChJbnRQb2ludCgpLCByZXF1aXJlZFRleHR1cmVTaXplKSkgeworICAgICAgICB7CisgICAgICAg
ICAgICBNdXRleExvY2tlciBsb2NrZXIobV9yZW5kZXJKb2JzTXV0ZXgpOworICAgICAgICAgICAg
bV9yZW5kZXJKb2JzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgY2xlYXJUZXh0dXJlSm9i
cygpOworICAgIH0gZWxzZSBpZiAoIXJlbmRlckpvYnMuaXNFbXB0eSgpKSB7CisgICAgICAgIGlm
IChJbWFnZSogaW1hZ2UgPSBtX2xheWVyLT5jb250ZW50cygpKSB7CisgICAgICAgICAgICBib29s
IGlzT3BhcXVlID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoaW1hZ2UtPmlzQml0bWFwSW1hZ2Uo
KSkKKyAgICAgICAgICAgICAgICBpc09wYXF1ZSA9ICFzdGF0aWNfY2FzdDxCaXRtYXBJbWFnZSo+
KGltYWdlKS0+Y3VycmVudEZyYW1lSGFzQWxwaGEoKTsKKyAgICAgICAgICAgIGlmIChOYXRpdmVJ
bWFnZVB0ciBuYXRpdmVJbWFnZSA9IGltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgp
KSB7CisgICAgICAgICAgICAgICAgU2tCaXRtYXAgYml0bWFwID0gU2tCaXRtYXAoKm5hdGl2ZUlt
YWdlKTsKKyAgICAgICAgICAgICAgICBhZGRUZXh0dXJlSm9iKFRleHR1cmVKb2I6OnNldENvbnRl
bnRzKGJpdG1hcCwgaXNPcGFxdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIC8vIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIHNvbWUgcGVuZGluZyByZW5kZXIg
am9icyBkdWUgdG8gdmlzaWJpbGl0eSBjaGFuZ2VzLgorICAgICAgICAgICAgZm9yIChIYXNoU2V0
PFRpbGVJbmRleD46Oml0ZXJhdG9yIGl0ID0gcmVuZGVySm9icy5iZWdpbigpOyBpdCAhPSByZW5k
ZXJKb2JzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
ICAgICAvLyBDaGVjayBpZiB0aGUgam9iIGhhcyBiZWVuIGNhbmNlbGxlZC4KKyAgICAgICAgICAg
ICAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fcmVuZGVySm9ic011dGV4KTsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCFtX3JlbmRlckpvYnMuY29udGFpbnMoKml0KSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBtX3JlbmRlckpvYnMu
cmVtb3ZlKCppdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgSW50UmVj
dCB0aWxlUmVjdCA9IHJlY3RGb3JUaWxlKCppdCwgcmVxdWlyZWRUZXh0dXJlU2l6ZSk7CisgICAg
ICAgICAgICAgICAgaWYgKHRpbGVSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgICAgICAgICBib29sIGlzU29saWRDb2xvciA9IGZhbHNlOwor
ICAgICAgICAgICAgICAgIENvbG9yIGNvbG9yOworICAgICAgICAgICAgICAgIFNrQml0bWFwIGJp
dG1hcCA9IG1fbGF5ZXItPnBhaW50Q29udGVudHModGlsZVJlY3QsIHNjYWxlLCAmaXNTb2xpZENv
bG9yLCAmY29sb3IpOworICAgICAgICAgICAgICAgIC8vIGJpdG1hcCBjYW4gYmUgbnVsbCBoZXJl
LiBNYWtlIHJlcXVpcmVkVGV4dHVyZVNpemUgZW1wdHkgc28gdGhhdCB3ZQorICAgICAgICAgICAg
ICAgIC8vIHdpbGwgbm90IHRyeSB0byB1cGRhdGUgYW5kIGRyYXcgdGhlIGxheWVyLgorICAgICAg
ICAgICAgICAgIGlmICghYml0bWFwLmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlm
IChpc1NvbGlkQ29sb3IpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRUZXh0dXJlSm9iKFRl
eHR1cmVKb2I6OnNldENvbnRlbnRzVG9Db2xvcihjb2xvciwgKml0KSk7CisgICAgICAgICAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRleHR1cmVKb2IoVGV4dHVy
ZUpvYjo6dXBkYXRlQ29udGVudHMoYml0bWFwLCB0aWxlUmVjdCkpOworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIGZpbmlzaGVkSm9icy5hZGQoKml0KTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgZGlkUmVzaXplID0gZmFsc2U7CisgICAg
aWYgKG1fcGVuZGluZ1RleHR1cmVTaXplICE9IHJlcXVpcmVkVGV4dHVyZVNpemUpIHsKKyAgICAg
ICAgZGlkUmVzaXplID0gdHJ1ZTsKKyAgICAgICAgbV9wZW5kaW5nVGV4dHVyZVNpemUgPSByZXF1
aXJlZFRleHR1cmVTaXplOworICAgICAgICBhZGRUZXh0dXJlSm9iKFRleHR1cmVKb2I6OnJlc2l6
ZUNvbnRlbnRzKG1fcGVuZGluZ1RleHR1cmVTaXplKSk7CisgICAgfQorICAgIG1fY29udGVudHNE
aXJ0eSA9IGZhbHNlOworICAgIG1fZGlydHlSZWN0ID0gRmxvYXRSZWN0KCk7CisKKyAgICBpZiAo
ZGlydHlSZWN0LmlzRW1wdHkoKSB8fCByZXF1aXJlZFRleHR1cmVTaXplLmlzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKEltYWdlKiBpbWFnZSA9IG1fbGF5ZXItPmNvbnRlbnRz
KCkpIHsKKyAgICAgICAgYm9vbCBpc09wYXF1ZSA9IGZhbHNlOworICAgICAgICBpZiAoaW1hZ2Ut
PmlzQml0bWFwSW1hZ2UoKSkKKyAgICAgICAgICAgIGlzT3BhcXVlID0gIXN0YXRpY19jYXN0PEJp
dG1hcEltYWdlKj4oaW1hZ2UpLT5jdXJyZW50RnJhbWVIYXNBbHBoYSgpOworICAgICAgICAvLyBO
byBwb2ludCBpbiB0aWxpbmcgYW4gaW1hZ2UgbGF5ZXIsIHRoZSBpbWFnZSBpcyBhbHJlYWR5IHN0
b3JlZCBhcyBhbiBTa0JpdG1hcAorICAgICAgICBOYXRpdmVJbWFnZVB0ciBuYXRpdmVJbWFnZSA9
IG1fbGF5ZXItPmNvbnRlbnRzKCktPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAg
ICAgIGlmIChuYXRpdmVJbWFnZSkgeworICAgICAgICAgICAgU2tCaXRtYXAgYml0bWFwID0gU2tC
aXRtYXAoKm5hdGl2ZUltYWdlKTsKKyAgICAgICAgICAgIGFkZFRleHR1cmVKb2IoVGV4dHVyZUpv
Yjo6c2V0Q29udGVudHMoYml0bWFwLCBpc09wYXF1ZSkpOworICAgICAgICB9CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBJbnRQb2ludCB0b3BMZWZ0ID0gZGlydHlSZWN0Lm1pblhNaW5Z
Q29ybmVyKCk7CisgICAgSW50UG9pbnQgYm90dG9tUmlnaHQgPSBkaXJ0eVJlY3QubWF4WE1heFlD
b3JuZXIoKTsgLy8gVGhpcyBpcyBhY3R1YWxseSBhIHBpeGVsIGJlbG93IGFuZCB0byB0aGUgcmln
aHQgb2YgdGhlIGRpcnR5UmVjdC4KKworICAgIEludFNpemUgdGlsZU1heGltdW1TaXplID0gdGls
ZVNpemUoKTsKKyAgICBib29sIHdhc09uZVRpbGUgPSBtX3RpbGVzV2ViS2l0VGhyZWFkLnNpemUo
KSA9PSAxOworICAgIGJvb2wgaXNPbmVUaWxlID0gbV9wZW5kaW5nVGV4dHVyZVNpemUud2lkdGgo
KSA8PSB0aWxlTWF4aW11bVNpemUud2lkdGgoKSAmJiBtX3BlbmRpbmdUZXh0dXJlU2l6ZS5oZWln
aHQoKSA8PSB0aWxlTWF4aW11bVNpemUuaGVpZ2h0KCk7CisgICAgSW50UG9pbnQgb3JpZ2luID0g
b3JpZ2luT2ZUaWxlKGluZGV4T2ZUaWxlKHRvcExlZnQpKTsKKyAgICBJbnRSZWN0IHRpbGVSZWN0
OworICAgIGZvciAodGlsZVJlY3Quc2V0WChvcmlnaW4ueCgpKTsgdGlsZVJlY3QueCgpIDwgYm90
dG9tUmlnaHQueCgpOyB0aWxlUmVjdC5zZXRYKHRpbGVSZWN0LngoKSArIHRpbGVNYXhpbXVtU2l6
ZS53aWR0aCgpKSkgeworICAgICAgICBmb3IgKHRpbGVSZWN0LnNldFkob3JpZ2luLnkoKSk7IHRp
bGVSZWN0LnkoKSA8IGJvdHRvbVJpZ2h0LnkoKTsgdGlsZVJlY3Quc2V0WSh0aWxlUmVjdC55KCkg
KyB0aWxlTWF4aW11bVNpemUuaGVpZ2h0KCkpKSB7CisgICAgICAgICAgICB0aWxlUmVjdC5zZXRX
aWR0aChtaW4ocmVxdWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgpIC0gdGlsZVJlY3QueCgpLCB0aWxl
TWF4aW11bVNpemUud2lkdGgoKSkpOworICAgICAgICAgICAgdGlsZVJlY3Quc2V0SGVpZ2h0KG1p
bihyZXF1aXJlZFRleHR1cmVTaXplLmhlaWdodCgpIC0gdGlsZVJlY3QueSgpLCB0aWxlTWF4aW11
bVNpemUuaGVpZ2h0KCkpKTsKKworICAgICAgICAgICAgSW50UmVjdCBsb2NhbERpcnR5UmVjdChk
aXJ0eVJlY3QpOworICAgICAgICAgICAgbG9jYWxEaXJ0eVJlY3QuaW50ZXJzZWN0KHRpbGVSZWN0
KTsKKyAgICAgICAgICAgIGlmIChsb2NhbERpcnR5UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAg
ICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIFRpbGVJbmRleCBpbmRleCA9IGluZGV4T2ZU
aWxlKHRpbGVSZWN0LmxvY2F0aW9uKCkpOworCisgICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5
IGRpZCB0aGlzIGFzIHBhcnQgb2Ygb25lIG9mIHRoZSByZW5kZXIgam9icyBkdWUgdG8KKyAgICAg
ICAgICAgIC8vIHZpc2liaWxpdHkgY2hhbmdlcywgZG9uJ3QgcmVuZGVyIHRoYXQgdGlsZSBhZ2Fp
bi4KKyAgICAgICAgICAgIGlmIChmaW5pc2hlZEpvYnMuY29udGFpbnMoaW5kZXgpKQorICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoIXNob3VsZFBlcmZvcm1SZW5k
ZXJKb2IoaW5kZXgsICFpc1pvb21Kb2IpKSB7CisgICAgICAgICAgICAgICAgLy8gQXZvaWQgY2hl
Y2tlcmJvYXJkaW5nIHVubGVzcyB0aGUgbGF5ZXIgaXMgcmVzaXplZC4gV2hlbgorICAgICAgICAg
ICAgICAgIC8vIHJlc2l6ZWQsIHRoZSBjb250ZW50cyBhcmUgbGlrZWx5IHRvIGNoYW5nZSBhcHBl
YXJhbmNlLCBmb3IKKyAgICAgICAgICAgICAgICAvLyBleGFtcGxlIGR1ZSB0byBhc3BlY3QgcmF0
aW8gY2hhbmdlLiBIb3dldmVyLCBpZiBpdCBpcyBhCisgICAgICAgICAgICAgICAgLy8gcmVzaXpl
IGR1ZSB0byB6b29taW5nLCB0aGUgYXNwZWN0IHJhdGlvIGFuZCBjb250ZW50IHdpbGwKKyAgICAg
ICAgICAgICAgICAvLyBzdGF5IHRoZSBzYW1lLCBhbmQgd2UgY2FuIGtlZXAgdGhlIG9sZCB0ZXh0
dXJlIGNvbnRlbnQgYXMgYQorICAgICAgICAgICAgICAgIC8vIHByZXZpZXcuCisgICAgICAgICAg
ICAgICAgLy8gRklYTUU6IHRoZSB6b29tIHByZXZpZXcgb25seSB3b3JrcyBpZiB3ZSBkb24ndCBy
ZS10aWxlIHRoZQorICAgICAgICAgICAgICAgIC8vIGxheWVyLiBXZSBuZWVkIHRvIHN0b3JlIHRl
eHR1cmUgY29vcmRpbmF0ZXMgaW4KKyAgICAgICAgICAgICAgICAvLyBXZWJDb3JlOjpUZXh0dXJl
IHRvIGJlIGFibGUgdG8gZml4IHRoYXQuCisgICAgICAgICAgICAgICAgaWYgKGRpZFJlc2l6ZSAm
JiAhKGlzWm9vbUpvYiAmJiB3YXNPbmVUaWxlICYmIGlzT25lVGlsZSkpCisgICAgICAgICAgICAg
ICAgICAgIGFkZFRleHR1cmVKb2IoVGV4dHVyZUpvYjo6ZGlzY2FyZENvbnRlbnRzKHRpbGVSZWN0
KSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBhZGRUZXh0dXJl
Sm9iKFRleHR1cmVKb2I6OmRpcnR5Q29udGVudHModGlsZVJlY3QpKTsKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSnVzdCBpbiBjYXNl
IGEgbmV3IGpvYiBmb3IgdGhpcyB0aWxlIGhhcyBqdXN0IGJlZW4gaW5zZXJ0ZWQgYnkgY29tcG9z
aXRpbmcgdGhyZWFkLgorICAgICAgICAgICAgcmVtb3ZlUmVuZGVySm9iKGluZGV4KTsKKworICAg
ICAgICAgICAgLy8gRklYTUU6IFdlIGFyZSBhbHdheXMgZHJhd2luZyB3aG9sZSB0aWxlcyBhdCB0
aGUgbW9tZW50LCBiZWNhdXNlCisgICAgICAgICAgICAvLyB3ZSBjdXJyZW50bHkgY2FuJ3Qga2Vl
cCB0cmFjayBvZiB3aGljaCBwYXJ0IG9mIGEgdGlsZSBpcworICAgICAgICAgICAgLy8gcmVuZGVy
ZWQgYW5kIHdoaWNoIGlzIG5vdC4gU2VuZGluZyBvbmx5IGEgc3VicmVjdGFuZ2xlIG9mIGEgdGls
ZQorICAgICAgICAgICAgLy8gdG8gdGhlIGNvbXBvc2l0aW5nIHRocmVhZCBtaWdodCBjYXVzZSBp
dCB0byBiZSB1cGxvYWRlZCB1c2luZworICAgICAgICAgICAgLy8gZ2xUZXhJbWFnZSwgaWYgdGhl
IHRleHR1cmUgd2FzIHByZXZpb3VzbHkgZXZpY3RlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgICAg
ICAgIC8vIFRoZSByZXN1bHQgd291bGQgYmUgdGhhdCBhIHN1YnJlY3RhbmdsZSBvZiB0aGUgdGls
ZSB3YXMgc3RyZXRjaGVkCisgICAgICAgICAgICAvLyB0byBmaXQgdGhlIHRpbGUgZ2VvbWV0cnks
IGFwcGVhcmluZyBhcyBhIGdsYXJpbmcgbWlzcmVuZGVyaW5nIG9mCisgICAgICAgICAgICAvLyB0
aGUgd2ViIHBhZ2UuCisgICAgICAgICAgICBib29sIGlzU29saWRDb2xvciA9IGZhbHNlOworICAg
ICAgICAgICAgQ29sb3IgY29sb3I7CisgICAgICAgICAgICBTa0JpdG1hcCBiaXRtYXAgPSBtX2xh
eWVyLT5wYWludENvbnRlbnRzKHRpbGVSZWN0LCBzY2FsZSwgJmlzU29saWRDb2xvciwgJmNvbG9y
KTsKKyAgICAgICAgICAgIC8vIGJpdG1hcCBjYW4gYmUgbnVsbCBoZXJlLiBNYWtlIHJlcXVpcmVk
VGV4dHVyZVNpemUgZW1wdHkgc28gdGhhdCB3ZQorICAgICAgICAgICAgLy8gd2lsbCBub3QgdHJ5
IHRvIHVwZGF0ZSBhbmQgZHJhdyB0aGUgbGF5ZXIuCisgICAgICAgICAgICBpZiAoIWJpdG1hcC5p
c051bGwoKSkgeworICAgICAgICAgICAgICAgIGlmIChpc1NvbGlkQ29sb3IpCisgICAgICAgICAg
ICAgICAgICAgIGFkZFRleHR1cmVKb2IoVGV4dHVyZUpvYjo6c2V0Q29udGVudHNUb0NvbG9yKGNv
bG9yLCBpbmRleCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
YWRkVGV4dHVyZUpvYihUZXh0dXJlSm9iOjp1cGRhdGVDb250ZW50cyhiaXRtYXAsIHRpbGVSZWN0
KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgTGF5ZXJUaWxl
cjo6c2hvdWxkUGVyZm9ybVJlbmRlckpvYihjb25zdCBUaWxlSW5kZXgmIGluZGV4LCBib29sIGFs
bG93UHJlZmlsbCkKK3sKKyAgICAvLyBJZiB0aGUgdmlzaWJpbGl0eSBpbmZvcm1hdGlvbiB3YXMg
cHJvcGFnYXRlZCBmcm9tIHRoZSBjb21wb3NpdGluZworICAgIC8vIHRocmVhZCwgdXNlIHRoYXQg
aW5mb3JtYXRpb24uCisgICAgLy8gSG93ZXZlciwgd2UgYXJlIGFib3V0IHRvIGNvbW1pdCBuZXcg
bGF5ZXIgcHJvcGVydGllcyB0aGF0IG1heSBtYWtlCisgICAgLy8gY3VycmVudGx5IGhpZGRlbiBs
YXllcnMgdmlzaWJsZS4gVG8gYXZvaWQgZmFsc2UgbmVnYXRpdmVzLCB3ZSBvbmx5IGFsbG93Cisg
ICAgLy8gdGhlIGN1cnJlbnQgc3RhdGUgdG8gYmUgdXNlZCB0byBhY2NlcHQgcmVuZGVyIGpvYnMs
IG5vdCB0byByZWplY3QgdGhlbS4KKyAgICBpZiAobV90aWxlc1dlYktpdFRocmVhZC5nZXQoaW5k
ZXgpLmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFRpbGVzIHRo
YXQgYXJlIG5vdCBjdXJyZW50bHkgdmlzaWJsZSBvbiB0aGUgY29tcG9zaXRpbmcgdGhyZWFkIG1h
eSBzdGlsbAorICAgIC8vIGRlc2VydmUgdG8gYmUgcmVuZGVyZWQgaWYgdGhleSBzaG91bGQgYmUg
cHJlZmlsbGVkLi4uCisgICAgaWYgKGFsbG93UHJlZmlsbCAmJiAhbV90aWxlc1dlYktpdFRocmVh
ZC5jb250YWlucyhpbmRleCkgJiYgc2hvdWxkUHJlZmlsbFRpbGUoaW5kZXgpKQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworICAgIC8vIE9yIGlmIHRoZXkgYXJlIHZpc2libGUgYWNjb3JkaW5nIHRv
IHRoZSBzdGF0ZSB0aGF0J3MgYWJvdXQgdG8gYmUKKyAgICAvLyBjb21taXR0ZWQuIFdlIGRvIGEg
dmlzaWJpbGl0eSB0ZXN0IHVzaW5nIHRoZSBjdXJyZW50IHRyYW5zZm9ybSBzdGF0ZS4KKyAgICBJ
bnRSZWN0IGNvbnRlbnRSZWN0ID0gcmVjdEZvclRpbGUoaW5kZXgsIG1fcGVuZGluZ1RleHR1cmVT
aXplKTsKKyAgICByZXR1cm4gbV9sYXllci0+Y29udGVudHNWaXNpYmxlKGNvbnRlbnRSZWN0KTsK
K30KKwordm9pZCBMYXllclRpbGVyOjphZGRUZXh0dXJlSm9iKGNvbnN0IFRleHR1cmVKb2ImIGpv
YikKK3sKKyAgICBtX3BlbmRpbmdUZXh0dXJlSm9icy5hcHBlbmQoam9iKTsKK30KKwordm9pZCBM
YXllclRpbGVyOjpjbGVhclRleHR1cmVKb2JzKCkKK3sKKyAgICAvLyBDbGVhciBhbnkgY29tbWl0
dGVkIHRleHR1cmUgam9icyBvbiBuZXh0IGludm9jYXRpb24gb2YgTGF5ZXJUaWxlcjo6Y29tbWl0
UGVuZGluZ1RleHR1cmVVcGxvYWRzKCkuCisgICAgbV9jbGVhclRleHR1cmVKb2JzID0gdHJ1ZTsK
KworICAgIHJlbW92ZVVwZGF0ZUNvbnRlbnRzSm9icyhtX3BlbmRpbmdUZXh0dXJlSm9icyk7Cit9
CisKK3ZvaWQgTGF5ZXJUaWxlcjo6Y29tbWl0UGVuZGluZ1RleHR1cmVVcGxvYWRzKCkKK3sKKyAg
ICBpZiAobV9jbGVhclRleHR1cmVKb2JzKSB7CisgICAgICAgIHJlbW92ZVVwZGF0ZUNvbnRlbnRz
Sm9icyhtX3RleHR1cmVKb2JzKTsKKyAgICAgICAgbV9jbGVhclRleHR1cmVKb2JzID0gZmFsc2U7
CisgICAgfQorCisgICAgZm9yIChWZWN0b3I8VGV4dHVyZUpvYj46Oml0ZXJhdG9yIGl0ID0gbV9w
ZW5kaW5nVGV4dHVyZUpvYnMuYmVnaW4oKTsgaXQgIT0gbV9wZW5kaW5nVGV4dHVyZUpvYnMuZW5k
KCk7ICsraXQpCisgICAgICAgIG1fdGV4dHVyZUpvYnMuYXBwZW5kKCppdCk7CisgICAgbV9wZW5k
aW5nVGV4dHVyZUpvYnMuY2xlYXIoKTsKK30KKwordm9pZCBMYXllclRpbGVyOjpsYXllclZpc2li
aWxpdHlDaGFuZ2VkKGJvb2wgdmlzaWJsZSkKK3sKKyAgICAvLyBGb3IgdmlzaWJsZSBsYXllcnMs
IHdlIGhhbmRsZSB0aGUgdGlsZS1sZXZlbCB2aXNpYmlsaXR5CisgICAgLy8gaW4gdGhlIGRyYXcg
bG9vcCwgc2VlIExheWVyVGlsZXI6OmRyYXdUZXh0dXJlcygpLgorICAgIGlmICh2aXNpYmxlKQor
ICAgICAgICByZXR1cm47CisKKyAgICB7CisgICAgICAgIC8vIEFsbCB0aWxlcyBhcmUgaW52aXNp
YmxlIG5vdy4KKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fcmVuZGVySm9ic011dGV4KTsK
KyAgICAgICAgbV9yZW5kZXJKb2JzLmNsZWFyKCk7CisgICAgfQorCisgICAgZm9yIChUaWxlTWFw
OjppdGVyYXRvciBpdCA9IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5iZWdpbigpOyBpdCAhPSBt
X3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgVGlsZUluZGV4
IGluZGV4ID0gKCppdCkuZmlyc3Q7CisgICAgICAgIExheWVyVGlsZSogdGlsZSA9ICgqaXQpLnNl
Y29uZDsKKyAgICAgICAgdGlsZS0+c2V0VmlzaWJsZShmYWxzZSk7CisgICAgfQorfQorCit2b2lk
IExheWVyVGlsZXI6OnVwbG9hZFRleHR1cmVzSWZOZWVkZWQoKQoreworICAgIFRpbGVKb2JzTWFw
IHRpbGVKb2JzTWFwOworICAgIERlcXVlPFRleHR1cmVKb2I+Ojpjb25zdF9pdGVyYXRvciB0ZXh0
dXJlSm9iSXRlckVuZCA9IG1fdGV4dHVyZUpvYnMuZW5kKCk7CisgICAgZm9yIChEZXF1ZTxUZXh0
dXJlSm9iPjo6Y29uc3RfaXRlcmF0b3IgdGV4dHVyZUpvYkl0ZXIgPSBtX3RleHR1cmVKb2JzLmJl
Z2luKCk7IHRleHR1cmVKb2JJdGVyICE9IHRleHR1cmVKb2JJdGVyRW5kOyArK3RleHR1cmVKb2JJ
dGVyKQorICAgICAgICBwcm9jZXNzVGV4dHVyZUpvYigqdGV4dHVyZUpvYkl0ZXIsIHRpbGVKb2Jz
TWFwKTsKKworICAgIFRpbGVKb2JzTWFwOjpjb25zdF9pdGVyYXRvciB0aWxlSm9ic0l0ZXJFbmQg
PSB0aWxlSm9ic01hcC5lbmQoKTsKKyAgICBmb3IgKFRpbGVKb2JzTWFwOjpjb25zdF9pdGVyYXRv
ciB0aWxlSm9ic0l0ZXIgPSB0aWxlSm9ic01hcC5iZWdpbigpOyB0aWxlSm9ic0l0ZXIgIT0gdGls
ZUpvYnNJdGVyRW5kOyArK3RpbGVKb2JzSXRlcikgeworICAgICAgICBJbnRQb2ludCBvcmlnaW4g
PSBvcmlnaW5PZlRpbGUodGlsZUpvYnNJdGVyLT5maXJzdCk7CisKKyAgICAgICAgTGF5ZXJUaWxl
KiB0aWxlID0gbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFkLmdldCh0aWxlSm9ic0l0ZXItPmZpcnN0
KTsKKyAgICAgICAgaWYgKCF0aWxlKSB7CisgICAgICAgICAgICBpZiAob3JpZ2luLngoKSA+PSBt
X3JlcXVpcmVkVGV4dHVyZVNpemUud2lkdGgoKSB8fCBvcmlnaW4ueSgpID49IG1fcmVxdWlyZWRU
ZXh0dXJlU2l6ZS5oZWlnaHQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIHRpbGUgPSBuZXcgTGF5ZXJUaWxlKCk7CisgICAgICAgICAgICBtX3RpbGVzQ29tcG9zaXRp
bmdUaHJlYWQuYWRkKHRpbGVKb2JzSXRlci0+Zmlyc3QsIHRpbGUpOworICAgICAgICB9CisKKyAg
ICAgICAgSW50UmVjdCB0aWxlUmVjdChvcmlnaW4sIHRpbGVTaXplKCkpOworICAgICAgICB0aWxl
UmVjdC5zZXRXaWR0aChtaW4obV9yZXF1aXJlZFRleHR1cmVTaXplLndpZHRoKCkgLSB0aWxlUmVj
dC54KCksIHRpbGVSZWN0LndpZHRoKCkpKTsKKyAgICAgICAgdGlsZVJlY3Quc2V0SGVpZ2h0KG1p
bihtX3JlcXVpcmVkVGV4dHVyZVNpemUuaGVpZ2h0KCkgLSB0aWxlUmVjdC55KCksIHRpbGVSZWN0
LmhlaWdodCgpKSk7CisKKyAgICAgICAgcGVyZm9ybVRpbGVKb2IodGlsZSwgKnRpbGVKb2JzSXRl
ci0+c2Vjb25kLCB0aWxlUmVjdCk7CisgICAgfQorICAgIAorICAgIG1fdGV4dHVyZUpvYnMuY2xl
YXIoKTsKK30KKwordm9pZCBMYXllclRpbGVyOjpwcm9jZXNzVGV4dHVyZUpvYihjb25zdCBUZXh0
dXJlSm9iJiBqb2IsIFRpbGVKb2JzTWFwJiB0aWxlSm9ic01hcCkKK3sKKyAgICBpZiAoam9iLnR5
cGUgPT0gVGV4dHVyZUpvYjo6UmVzaXplQ29udGVudHMpIHsKKyAgICAgICAgSW50U2l6ZSBwZW5k
aW5nVGV4dHVyZVNpemUgPSBqb2IuZGlydHlSZWN0LnNpemUoKTsKKyAgICAgICAgaWYgKHBlbmRp
bmdUZXh0dXJlU2l6ZS53aWR0aCgpIDwgbV9yZXF1aXJlZFRleHR1cmVTaXplLndpZHRoKCkgfHwg
cGVuZGluZ1RleHR1cmVTaXplLmhlaWdodCgpIDwgbV9yZXF1aXJlZFRleHR1cmVTaXplLmhlaWdo
dCgpKQorICAgICAgICAgICAgcHJ1bmVUZXh0dXJlcygpOworCisgICAgICAgIG1fcmVxdWlyZWRU
ZXh0dXJlU2l6ZSA9IHBlbmRpbmdUZXh0dXJlU2l6ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIGlmIChqb2IudHlwZSA9PSBUZXh0dXJlSm9iOjpTZXRDb250ZW50c1RvQ29sb3IpIHsK
KyAgICAgICAgYWRkVGlsZUpvYihqb2IuaW5kZXgsIGpvYiwgdGlsZUpvYnNNYXApOworICAgICAg
ICByZXR1cm47CisgICAgIH0KKworICAgIEludFNpemUgdGlsZU1heGltdW1TaXplID0gdGlsZVNp
emUoKTsKKyAgICBJbnRQb2ludCB0b3BMZWZ0ID0gam9iLmRpcnR5UmVjdC5taW5YTWluWUNvcm5l
cigpOworICAgIEludFBvaW50IGJvdHRvbVJpZ2h0ID0gam9iLmRpcnR5UmVjdC5tYXhYTWF4WUNv
cm5lcigpOyAvLyBUaGlzIGlzIGFjdHVhbGx5IGEgcGl4ZWwgYmVsb3cgYW5kIHRvIHRoZSByaWdo
dCBvZiB0aGUgZGlydHlSZWN0LgorICAgIEludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShp
bmRleE9mVGlsZSh0b3BMZWZ0KSk7CisgICAgSW50UmVjdCB0aWxlUmVjdDsKKyAgICBmb3IgKHRp
bGVSZWN0LnNldFgob3JpZ2luLngoKSk7IHRpbGVSZWN0LngoKSA8IGJvdHRvbVJpZ2h0LngoKTsg
dGlsZVJlY3Quc2V0WCh0aWxlUmVjdC54KCkgKyB0aWxlTWF4aW11bVNpemUud2lkdGgoKSkpIHsK
KyAgICAgICAgZm9yICh0aWxlUmVjdC5zZXRZKG9yaWdpbi55KCkpOyB0aWxlUmVjdC55KCkgPCBi
b3R0b21SaWdodC55KCk7IHRpbGVSZWN0LnNldFkodGlsZVJlY3QueSgpICsgdGlsZU1heGltdW1T
aXplLmhlaWdodCgpKSkKKyAgICAgICAgICAgIGFkZFRpbGVKb2IoaW5kZXhPZlRpbGUodGlsZVJl
Y3QubG9jYXRpb24oKSksIGpvYiwgdGlsZUpvYnNNYXApOworICAgIH0KK30KKwordm9pZCBMYXll
clRpbGVyOjphZGRUaWxlSm9iKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIGNvbnN0IFRleHR1cmVK
b2ImIGpvYiwgVGlsZUpvYnNNYXAmIHRpbGVKb2JzTWFwKQoreworICAgIC8vIEhhc2hNYXA6OmFk
ZCBhbHdheXMgcmV0dXJucyBhIHZhbGlkIGl0ZXJhdG9yIGV2ZW4gdGhlIGtleSBhbHJlYWR5IGV4
aXN0cy4gCisgICAgcGFpcjxUaWxlSm9ic01hcDo6aXRlcmF0b3IsIGJvb2w+IHJlc3VsdCA9IHRp
bGVKb2JzTWFwLmFkZChpbmRleCwgJmpvYik7CisKKyAgICBpZiAocmVzdWx0LnNlY29uZCkgewor
ICAgICAgICAvLyBTdWNjZXNzZnVsbHkgYWRkZWQgdGhlIG5ldyBqb2IuCisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAoam9iLnR5cGUgPT0gVGV4dHVyZUpvYjo6RGlydHlDb250ZW50
cyAmJiByZXN1bHQuZmlyc3QtPnNlY29uZC0+dHlwZSA9PSBUZXh0dXJlSm9iOjpEaXNjYXJkQ29u
dGVudHMpIHsKKyAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIGxlYXZlIHRoZSBwcmV2aW91cyBq
b2IuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBPdmVycmlkZSB0aGUgcHJldmlv
dXMgam9iLgorICAgIHJlc3VsdC5maXJzdC0+c2Vjb25kID0gJmpvYjsKK30KKwordm9pZCBMYXll
clRpbGVyOjpwZXJmb3JtVGlsZUpvYihMYXllclRpbGUqIHRpbGUsIGNvbnN0IFRleHR1cmVKb2Im
IGpvYiwgY29uc3QgSW50UmVjdCYgdGlsZVJlY3QpCit7CisgICAgc3dpdGNoIChqb2IudHlwZSkg
eworICAgIGNhc2UgVGV4dHVyZUpvYjo6U2V0Q29udGVudHNUb0NvbG9yOgorICAgICAgICB0aWxl
LT5zZXRDb250ZW50c1RvQ29sb3Ioam9iLmNvbG9yKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNh
c2UgVGV4dHVyZUpvYjo6U2V0Q29udGVudHM6CisgICAgICAgIHRpbGUtPnNldENvbnRlbnRzKGpv
Yi5jb250ZW50cywgdGlsZVJlY3QsIGluZGV4T2ZUaWxlKHRpbGVSZWN0LmxvY2F0aW9uKCkpLCBq
b2IuaXNPcGFxdWUpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBUZXh0dXJlSm9iOjpVcGRh
dGVDb250ZW50czoKKyAgICAgICAgdGlsZS0+dXBkYXRlQ29udGVudHMoam9iLmNvbnRlbnRzLCBq
b2IuZGlydHlSZWN0LCB0aWxlUmVjdCk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFRleHR1
cmVKb2I6OkRpc2NhcmRDb250ZW50czoKKyAgICAgICAgdGlsZS0+ZGlzY2FyZENvbnRlbnRzKCk7
CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFRleHR1cmVKb2I6OkRpcnR5Q29udGVudHM6Cisg
ICAgICAgIHRpbGUtPnNldENvbnRlbnRzRGlydHkoKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNh
c2UgVGV4dHVyZUpvYjo6VW5rbm93bjoKKyAgICBjYXNlIFRleHR1cmVKb2I6OlJlc2l6ZUNvbnRl
bnRzOgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKwordm9pZCBMYXllclRpbGVyOjpkcmF3
VGV4dHVyZXMoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogbGF5ZXIsIGludCBwb3MsIGludCB0ZXhD
b29yZCkKK3sKKyAgICBkcmF3VGV4dHVyZXNJbnRlcm5hbChsYXllciwgcG9zLCB0ZXhDb29yZCwg
ZmFsc2UgLyogZHJhd01pc3NpbmcgKi8pOworfQorCit2b2lkIExheWVyVGlsZXI6OmRyYXdNaXNz
aW5nVGV4dHVyZXMoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogbGF5ZXIsIGludCBwb3MsIGludCB0
ZXhDb29yZCkKK3sKKyAgICBkcmF3VGV4dHVyZXNJbnRlcm5hbChsYXllciwgcG9zLCB0ZXhDb29y
ZCwgdHJ1ZSAvKiBkcmF3TWlzc2luZyAqLyk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6ZHJhd1Rl
eHR1cmVzSW50ZXJuYWwoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogbGF5ZXIsIGludCBwb3NpdGlv
bkxvY2F0aW9uLCBpbnQgdGV4Q29vcmRMb2NhdGlvbiwgYm9vbCBkcmF3TWlzc2luZykKK3sKKyAg
ICBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgZHJhd1RyYW5zZm9ybSA9IGxheWVyLT5kcmF3
VHJhbnNmb3JtKCk7CisgICAgSW50U2l6ZSBib3VuZHMgPSBsYXllci0+Ym91bmRzKCk7CisKKyAg
ICBmbG9hdCB0ZXhjb29yZHNbNCAqIDJdID0geyAwLCAwLCAgMCwgMSwgIDEsIDEsICAxLCAwIH07
CisgICAgZmxvYXQgdmVydGljZXNbNCAqIDRdOworCisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVy
KHBvc2l0aW9uTG9jYXRpb24sIDQsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgdmVydGljZXMpOwor
ICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZExvY2F0aW9uLCAyLCBHTF9GTE9BVCwg
R0xfRkFMU0UsIDAsIHRleGNvb3Jkcyk7CisKKyAgICBtX2hhc01pc3NpbmdUZXh0dXJlcyA9IGZh
bHNlOworCisgICAgaW50IG1heHcgPSB0aWxlU2l6ZSgpLndpZHRoKCk7CisgICAgaW50IG1heGgg
PSB0aWxlU2l6ZSgpLmhlaWdodCgpOworICAgIGZsb2F0IHN4ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+
KGJvdW5kcy53aWR0aCgpKSAvIG1fcmVxdWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgpOworICAgIGZs
b2F0IHN5ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJvdW5kcy5oZWlnaHQoKSkgLyBtX3JlcXVpcmVk
VGV4dHVyZVNpemUuaGVpZ2h0KCk7CisKKyAgICBib29sIG5lZWRzRGlzcGxheSA9IGZhbHNlOwor
CisgICAgYm9vbCBibGVuZGluZyA9ICFkcmF3TWlzc2luZzsKKworICAgIEludFJlY3QgdGlsZVJl
Y3Q7CisgICAgZm9yICh0aWxlUmVjdC5zZXRYKDApOyB0aWxlUmVjdC54KCkgPCBtX3JlcXVpcmVk
VGV4dHVyZVNpemUud2lkdGgoKTsgdGlsZVJlY3Quc2V0WCh0aWxlUmVjdC54KCkgKyBtYXh3KSkg
eworICAgICAgICBmb3IgKHRpbGVSZWN0LnNldFkoMCk7IHRpbGVSZWN0LnkoKSA8IG1fcmVxdWly
ZWRUZXh0dXJlU2l6ZS5oZWlnaHQoKTsgdGlsZVJlY3Quc2V0WSh0aWxlUmVjdC55KCkgKyBtYXho
KSkgeworICAgICAgICAgICAgVGlsZUluZGV4IGluZGV4ID0gaW5kZXhPZlRpbGUodGlsZVJlY3Qu
bG9jYXRpb24oKSk7CisgICAgICAgICAgICBMYXllclRpbGUqIHRpbGUgPSBtX3RpbGVzQ29tcG9z
aXRpbmdUaHJlYWQuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIGlmICghdGlsZSkgeworICAgICAg
ICAgICAgICAgIHRpbGUgPSBuZXcgTGF5ZXJUaWxlKCk7CisgICAgICAgICAgICAgICAgbV90aWxl
c0NvbXBvc2l0aW5nVGhyZWFkLmFkZChpbmRleCwgdGlsZSk7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGZsb2F0IHggPSBpbmRleC5pKCkgKiBtYXh3ICogc3g7CisgICAgICAgICAgICBm
bG9hdCB5ID0gaW5kZXguaigpICogbWF4aCAqIHN5OworICAgICAgICAgICAgZmxvYXQgdyA9IG1p
bihib3VuZHMud2lkdGgoKSAtIHgsIG1heHcgKiBzeCk7CisgICAgICAgICAgICBmbG9hdCBoID0g
bWluKGJvdW5kcy5oZWlnaHQoKSAtIHksIG1heGggKiBzeSk7CisgICAgICAgICAgICBmbG9hdCBv
eCA9IHggLSBib3VuZHMud2lkdGgoKSAvIDIuMDsKKyAgICAgICAgICAgIGZsb2F0IG95ID0geSAt
IGJvdW5kcy5oZWlnaHQoKSAvIDIuMDsKKworICAgICAgICAgICAgLy8gV2UgYXBwbHkgdGhlIHRy
YW5zZm9ybWF0aW9uIGJ5IGhhbmQsIHNpbmNlIHdlIG5lZWQgdGhlIHogY29vcmRpbmF0ZQorICAg
ICAgICAgICAgLy8gYXMgd2VsbCAodG8gZG8gcGVyc3BlY3RpdmUgY29ycmVjdCB0ZXh0dXJpbmcp
IGFuZCB3ZSBkb24ndCBuZWVkCisgICAgICAgICAgICAvLyB0byBkaXZpZGUgYnkgdyBieSBoYW5k
LCB0aGUgR1BVIHdpbGwgZG8gdGhhdCBmb3IgdXMKKyAgICAgICAgICAgIHRyYW5zZm9ybVBvaW50
KG94LCBveSwgZHJhd1RyYW5zZm9ybSwgJnZlcnRpY2VzWzBdKTsKKyAgICAgICAgICAgIHRyYW5z
Zm9ybVBvaW50KG94LCBveStoLCBkcmF3VHJhbnNmb3JtLCAmdmVydGljZXNbNF0pOworICAgICAg
ICAgICAgdHJhbnNmb3JtUG9pbnQob3grdywgb3kraCwgZHJhd1RyYW5zZm9ybSwgJnZlcnRpY2Vz
WzhdKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybVBvaW50KG94K3csIG95LCBkcmF3VHJhbnNmb3Jt
LCAmdmVydGljZXNbMTJdKTsKKworICAgICAgICAgICAgLy8gSW5mbGF0ZSB0aGUgcmVjdCBzb21l
d2hhdCB0byBhdHRlbXB0IHRvIG1ha2UgdGV4dHVyZXMgcmVuZGVyIGJlZm9yZSB0aGV5IHNob3cK
KyAgICAgICAgICAgIC8vIHVwIG9uIHNjcmVlbi4KKyAgICAgICAgICAgIGZsb2F0IGQgPSB2aWV3
cG9ydEluZmxhdGlvbkZhY3RvcjsKKyAgICAgICAgICAgIEZsb2F0UmVjdCByZWN0KC1kLCAtZCwg
MipkLCAyKmQpOworICAgICAgICAgICAgRmxvYXRRdWFkIHF1YWQoRmxvYXRQb2ludCh2ZXJ0aWNl
c1swXSAvIHZlcnRpY2VzWzNdLCB2ZXJ0aWNlc1sxXSAvIHZlcnRpY2VzWzNdKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEZsb2F0UG9pbnQodmVydGljZXNbNF0gLyB2ZXJ0aWNlc1s3XSwg
dmVydGljZXNbNV0gLyB2ZXJ0aWNlc1s3XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBG
bG9hdFBvaW50KHZlcnRpY2VzWzhdIC8gdmVydGljZXNbMTFdLCB2ZXJ0aWNlc1s5XSAvIHZlcnRp
Y2VzWzExXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdFBvaW50KHZlcnRpY2Vz
WzEyXSAvIHZlcnRpY2VzWzE1XSwgdmVydGljZXNbMTNdIC8gdmVydGljZXNbMTVdKSk7CisgICAg
ICAgICAgICBib29sIHZpc2libGUgPSBxdWFkLmJvdW5kaW5nQm94KCkuaW50ZXJzZWN0cyhyZWN0
KTsKKworICAgICAgICAgICAgYm9vbCB3YXNWaXNpYmxlID0gdGlsZS0+aXNWaXNpYmxlKCk7Cisg
ICAgICAgICAgICB0aWxlLT5zZXRWaXNpYmxlKHZpc2libGUpOworCisgICAgICAgICAgICAvLyBU
aGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gdHdvIHBhc3Nlcy4gVGhlIGZpcnN0IHBhc3MgZHJhd3Mg
YWxsCisgICAgICAgICAgICAvLyB2aXNpYmxlIHRpbGVzIHdpdGggdGV4dHVyZXMuCisgICAgICAg
ICAgICAvLyBJZiBhIHZpc2libGUgdGlsZSBoYXMgbm8gdGV4dHVyZSwgc2V0IHRoZSBtX2hhc01p
c3NpbmdUZXh0dXJlcworICAgICAgICAgICAgLy8gZmxhZywgdG8gaW5kaWNhdGUgdGhhdCB3ZSBu
ZWVkIGEgc2Vjb25kIHBhc3MuCisgICAgICAgICAgICAvLyBUaGUgc2Vjb25kICJkcmF3TWlzc2lu
ZyIgcGFzcyBkcmF3cyBhbGwgdmlzaWJsZSB0aWxlcyB3aXRob3V0CisgICAgICAgICAgICAvLyB0
ZXh0dXJlcyBhcyBjaGVja2VyYm9hcmQuCisgICAgICAgICAgICAvLyBIb3dldmVyLCBkb24ndCBk
cmF3IGJyYW5kIG5ldyB0aWxlcyBhcyBjaGVja2VyYm9hcmQuIFRoZSBjaGVja2VyLQorICAgICAg
ICAgICAgLy8gYm9hcmQgaW5kaWNhdGVzIHRoYXQgYSB0aWxlIGhhcyBkaXJ0eSBjb250ZW50cywg
YnV0IHRoYXQncyBub3QKKyAgICAgICAgICAgIC8vIHRoZSBjYXNlIGlmIGl0J3MgYnJhbmQgbmV3
LgorICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgICAgICBib29sIGhhc1Rl
eHR1cmUgPSB0aWxlLT5oYXNUZXh0dXJlKCk7CisgICAgICAgICAgICAgICAgaWYgKCFoYXNUZXh0
dXJlKQorICAgICAgICAgICAgICAgICAgICBtX2hhc01pc3NpbmdUZXh0dXJlcyA9IHRydWU7CisK
KyAgICAgICAgICAgICAgICBpZiAoaGFzVGV4dHVyZSAmJiAhZHJhd01pc3NpbmcpIHsKKyAgICAg
ICAgICAgICAgICAgICAgVGV4dHVyZSogdGV4dHVyZSA9IHRpbGUtPnRleHR1cmUoKTsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKHRleHR1cmUtPmlzT3BhcXVlKCkgJiYgbGF5ZXItPmRyYXdPcGFj
aXR5KCkgPT0gMS4wZiAmJiAhbGF5ZXItPm1hc2tMYXllcigpKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoYmxlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVu
ZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9C
TEVORCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0g
ZWxzZSBpZiAoIWJsZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZyA9
IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAg
ICAgICAgICAgICAgICAgICAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORV9NSU5VU19TUkNf
QUxQSEEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGV4
dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKS0+dGV4dHVyZUFjY2Vzc2VkKHRleHR1cmUpOwor
ICAgICAgICAgICAgICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUt
PnRleHR1cmVJZCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAo
aGFzVGV4dHVyZSAhPSBkcmF3TWlzc2luZykKKyAgICAgICAgICAgICAgICAgICAgZ2xEcmF3QXJy
YXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7CisKKyAgICAgICAgICAgICAgICBpZiAodGlsZS0+
aXNEaXJ0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFJlbmRlckpvYihpbmRleCk7Cisg
ICAgICAgICAgICAgICAgICAgIG5lZWRzRGlzcGxheSA9IHRydWU7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfSBlbHNlIGlmICh3YXNWaXNpYmxlKQorICAgICAgICAgICAgICAgIHJl
bW92ZVJlbmRlckpvYihpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXR1cm4g
ZWFybHkgZm9yIHRoZSBkcmF3TWlzc2luZyBjYXNlLCBkb24ndCBmbGFnIHVzIGFzIG5lZWRpbmcg
Y29tbWl0LgorICAgIGlmIChkcmF3TWlzc2luZykKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8g
U3dpdGNoIG9uIGJsZW5kaW5nIGFnYWluICh3ZSBrbm93IHRoYXQgZHJhd01pc3NpbmcgPT0gZmFs
c2UpLgorICAgIGlmICghYmxlbmRpbmcpIHsKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOwor
ICAgICAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOworICAg
IH0KKworICAgIC8vIElmIHdlIHNjaGVkdWxlIGEgY29tbWl0LCB2aXNpYmlsaXR5IHdpbGwgYmUg
dXBkYXRlZCwgYW5kIGRpc3BsYXkgd2lsbAorICAgIC8vIGhhcHBlbiBpZiB0aGVyZSBhcmUgYW55
IHZpc2libGUgYW5kIGRpcnR5IHRleHR1cmVzLgorICAgIGlmIChuZWVkc0Rpc3BsYXkpCisgICAg
ICAgIGxheWVyLT5zZXROZWVkc0NvbW1pdCgpOworfQorCit2b2lkIExheWVyVGlsZXI6OmFkZFJl
bmRlckpvYihjb25zdCBUaWxlSW5kZXgmIGluZGV4KQoreworICAgIEFTU0VSVChpc0NvbXBvc2l0
aW5nVGhyZWFkKCkpOworCisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fcmVuZGVySm9ic011dGV4
KTsKKyAgICBtX3JlbmRlckpvYnMuYWRkKGluZGV4KTsKK30KKwordm9pZCBMYXllclRpbGVyOjpy
ZW1vdmVSZW5kZXJKb2IoY29uc3QgVGlsZUluZGV4JiBpbmRleCkKK3sKKyAgICBNdXRleExvY2tl
ciBsb2NrZXIobV9yZW5kZXJKb2JzTXV0ZXgpOworICAgIG1fcmVuZGVySm9icy5yZW1vdmUoaW5k
ZXgpOworfQorCit2b2lkIExheWVyVGlsZXI6OmRlbGV0ZVRleHR1cmVzKCkKK3sKKyAgICAvLyBT
aW5jZSB0ZXh0dXJlcyBhcmUgZGVsZXRlZCBieSBhIHN5bmNocm9ub3VzIG1lc3NhZ2UKKyAgICAv
LyBmcm9tIFdlYktpdCB0aHJlYWQgdG8gY29tcG9zaXRpbmcgdGhyZWFkLCB3ZSBkb24ndCBuZWVk
CisgICAgLy8gYW55IHN5bmNocm9uaXphdGlvbiBtZWNoYW5pc20gaGVyZSwgZXZlbiB0aG91Z2gg
d2UgYXJlCisgICAgLy8gdG91Y2hpbmcgc29tZSBXZWJLaXQgdGhyZWFkIHN0YXRlLgorICAgIG1f
dGlsZXNXZWJLaXRUaHJlYWQuY2xlYXIoKTsKKworICAgIGlmIChtX3RpbGVzQ29tcG9zaXRpbmdU
aHJlYWQuc2l6ZSgpKSB7CisgICAgICAgIGZvciAoVGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3Rp
bGVzQ29tcG9zaXRpbmdUaHJlYWQuYmVnaW4oKTsgaXQgIT0gbV90aWxlc0NvbXBvc2l0aW5nVGhy
ZWFkLmVuZCgpOyArK2l0KQorICAgICAgICAgICAgKCppdCkuc2Vjb25kLT5kaXNjYXJkQ29udGVu
dHMoKTsKKyAgICAgICAgbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFkLmNsZWFyKCk7CisKKyAgICAg
ICAgbV9jb250ZW50c0RpcnR5ID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBGb3IgdmFyaW91cyBy
ZWFzb25zLCBlLmcuIHBhZ2UgY2FjaGUsIHNvbWVvbmUgbWF5IHRyeQorICAgIC8vIHRvIHJlbmRl
ciB1cyBhZnRlciB0aGUgdGV4dHVyZXMgd2VyZSBkZWxldGVkLgorICAgIG1fcGVuZGluZ1RleHR1
cmVTaXplID0gSW50U2l6ZSgpOworICAgIG1fcmVxdWlyZWRUZXh0dXJlU2l6ZSA9IEludFNpemUo
KTsKK30KKwordm9pZCBMYXllclRpbGVyOjpwcnVuZVRleHR1cmVzKCkKK3sKKyAgICAvLyBQcnVu
ZSB0aWxlcyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkCisgICAgVmVjdG9yPFRpbGVJbmRleD4g
dGlsZXNUb0RlbGV0ZTsKKyAgICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90aWxlc0Nv
bXBvc2l0aW5nVGhyZWFkLmJlZ2luKCk7IGl0ICE9IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5l
bmQoKTsgKytpdCkgeworICAgICAgICBUaWxlSW5kZXggaW5kZXggPSAoKml0KS5maXJzdDsKKwor
ICAgICAgICBJbnRQb2ludCBvcmlnaW4gPSBvcmlnaW5PZlRpbGUoaW5kZXgpOworICAgICAgICBp
ZiAob3JpZ2luLngoKSA+PSBtX3JlcXVpcmVkVGV4dHVyZVNpemUud2lkdGgoKSB8fCBvcmlnaW4u
eSgpID49IG1fcmVxdWlyZWRUZXh0dXJlU2l6ZS5oZWlnaHQoKSkKKyAgICAgICAgICAgIHRpbGVz
VG9EZWxldGUuYXBwZW5kKGluZGV4KTsKKyAgICB9CisKKyAgICBmb3IgKFZlY3RvcjxUaWxlSW5k
ZXg+OjppdGVyYXRvciBpdCA9IHRpbGVzVG9EZWxldGUuYmVnaW4oKTsgaXQgIT0gdGlsZXNUb0Rl
bGV0ZS5lbmQoKTsgKytpdCkgeworICAgICAgICBMYXllclRpbGUqIHRpbGUgPSBtX3RpbGVzQ29t
cG9zaXRpbmdUaHJlYWQudGFrZSgqaXQpOworICAgICAgICB0aWxlLT5kaXNjYXJkQ29udGVudHMo
KTsKKyAgICAgICAgZGVsZXRlIHRpbGU7CisgICAgfQorfQorCitJbnRTaXplIExheWVyVGlsZXI6
OmRlZmF1bHRUaWxlU2l6ZSgpCit7CisgICAgc3RhdGljIEludFNpemUgc2NyZWVuU2l6ZSA9IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpuYXRpdmVTaXplKCk7CisgICAg
c3RhdGljIGludCBkaW0gPSBtYXgoc2NyZWVuU2l6ZS53aWR0aCgpLCBzY3JlZW5TaXplLmhlaWdo
dCgpKSAvIHRpbGVNdWx0aXBsaWVyOworICAgIHJldHVybiBJbnRTaXplKGRpbSwgZGltKTsKK30K
Kwordm9pZCBMYXllclRpbGVyOjp1cGRhdGVUaWxlU2l6ZSgpCit7CisgICAgSW50U2l6ZSBzaXpl
ID0gbV90aWxpbmdEaXNhYmxlZCA/IG1fbGF5ZXItPmJvdW5kcygpIDogZGVmYXVsdFRpbGVTaXpl
KCk7CisgICAgY29uc3QgSW50U2l6ZSBtYXhUZXh0dXJlU2l6ZSgyMDQ4LCAyMDQ4KTsKKyAgICBz
aXplID0gc2l6ZS5zaHJ1bmtUbyhtYXhUZXh0dXJlU2l6ZSk7CisKKyAgICBpZiAobV90aWxlU2l6
ZSA9PSBzaXplIHx8IHNpemUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBJ
bnZhbGlkYXRlIHRoZSB3aG9sZSBsYXllciBpZiB0aWxlIHNpemUgY2hhbmdlcy4KKyAgICBzZXRO
ZWVkc0Rpc3BsYXkoKTsKKyAgICBtX3RpbGVTaXplID0gc2l6ZTsKK30KKwordm9pZCBMYXllclRp
bGVyOjpkaXNhYmxlVGlsaW5nKGJvb2wgZGlzYWJsZSkKK3sKKyAgICBpZiAobV90aWxpbmdEaXNh
YmxlZCA9PSBkaXNhYmxlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3RpbGluZ0Rpc2FibGVk
ID0gZGlzYWJsZTsKKyAgICB1cGRhdGVUaWxlU2l6ZSgpOworfQorCitib29sIExheWVyVGlsZXI6
OnNob3VsZFByZWZpbGxUaWxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgpCit7CisgICAgLy8gRm9y
IG5vdywgd2UgdXNlIHRoZSBoZXVyaXN0aWMgb2YgcHJlZmlsbGluZyB0aGUgZmlyc3Qgc2NyZWVu
ZnVsIG9mIHRpbGVzLgorICAgIC8vIFRoaXMgZ2l2ZXMgdGhlIGNvcnJlY3QgcmVzdWx0IG9ubHkg
Zm9yIGxheWVycyB3aXRoIGlkZW50aXR5IHRyYW5zZm9ybSwKKyAgICAvLyB3aGljaCBpcyB3aHkg
aXQncyBjYWxsZWQgYSBoZXVyaXN0aWMgaGVyZS4gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBjYXNl
CisgICAgLy8gd2hlcmUgdGhlIGRldmVsb3BlciBhY3R1YWxseSBkZXNpZ25lZCB0aGVpciB3ZWIg
cGFnZSBhcm91bmQgdGhlIHVzZSBvZgorICAgIC8vIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nLCBh
bmQgZXhwZWN0cyBldmVuIG9mZnNjcmVlbiBsYXllcnMgdG8gaGF2ZSBjb250ZW50LgorICAgIC8v
IFdlIG9ibGlnZSB0aGVtIHRvIHNvbWUgZGVncmVlIGJ5IHByZWZpbGxpbmcgYSBzY3JlZW5mdWwg
b2YgdGlsZXMuCisgICAgLy8gVGhpcyBpcyByZWR1bmRhbnQgaW4gc29tZSBvdGhlciBzY2VuYXJp
b3MsIGkuZS4gd2hlbiBhbiBvZmZzY3JlZW4gbGF5ZXIKKyAgICAvLyBpcyBjb21wb3NpdGVkIG9u
bHkgYmVjYXVzZSBvZiBvdmVybGFwcGluZyBhIGZsYXNoIGFkIG9yIHNvbWV0aGluZyBsaWtlCisg
ICAgLy8gdGhhdCwgYnV0IHdlJ3JlIHdpbGxpbmcgdG8gbWFrZSB0aGlzIHRyYWRlb2ZmLgorCisg
ICAgLy8gU2luY2UgdGhlIHRpbGVNdWx0aXBsaWVyIGluZGljYXRlcyBob3cgbWFueSB0aWxlcyBm
aXQgb24gdGhlIHNjcmVlbiwKKyAgICAvLyB0aGUgZm9sbG93aW5nIGZvcm11bGEgY2FuIGJlIHVz
ZWQ6CisgICAgcmV0dXJuIGluZGV4LmkoKSA8IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aWxlTXVs
dGlwbGllcikgJiYgaW5kZXguaigpIDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRpbGVNdWx0aXBs
aWVyKTsKK30KKworVGlsZUluZGV4IExheWVyVGlsZXI6OmluZGV4T2ZUaWxlKGNvbnN0IFdlYkNv
cmU6OkludFBvaW50JiBvcmlnaW4pCit7CisgICAgaW50IG9mZnNldFggPSBvcmlnaW4ueCgpOwor
ICAgIGludCBvZmZzZXRZID0gb3JpZ2luLnkoKTsKKyAgICBpZiAob2Zmc2V0WCkKKyAgICAgICAg
b2Zmc2V0WCA9IG9mZnNldFggLyB0aWxlU2l6ZSgpLndpZHRoKCk7CisgICAgaWYgKG9mZnNldFkp
CisgICAgICAgIG9mZnNldFkgPSBvZmZzZXRZIC8gdGlsZVNpemUoKS5oZWlnaHQoKTsKKyAgICBy
ZXR1cm4gVGlsZUluZGV4KG9mZnNldFgsIG9mZnNldFkpOworfQorCitJbnRQb2ludCBMYXllclRp
bGVyOjpvcmlnaW5PZlRpbGUoY29uc3QgVGlsZUluZGV4JiBpbmRleCkKK3sKKyAgICByZXR1cm4g
SW50UG9pbnQoaW5kZXguaSgpICogdGlsZVNpemUoKS53aWR0aCgpLCBpbmRleC5qKCkgKiB0aWxl
U2l6ZSgpLmhlaWdodCgpKTsKK30KKworSW50UmVjdCBMYXllclRpbGVyOjpyZWN0Rm9yVGlsZShj
b25zdCBUaWxlSW5kZXgmIGluZGV4LCBjb25zdCBJbnRTaXplJiBib3VuZHMpCit7CisgICAgSW50
UG9pbnQgb3JpZ2luID0gb3JpZ2luT2ZUaWxlKGluZGV4KTsKKyAgICBJbnRTaXplIG9mZnNldChv
cmlnaW4ueCgpLCBvcmlnaW4ueSgpKTsKKyAgICBJbnRTaXplIHNpemUgPSB0aWxlU2l6ZSgpLnNo
cnVua1RvKGJvdW5kcyAtIG9mZnNldCk7CisgICAgcmV0dXJuIEludFJlY3Qob3JpZ2luLCBzaXpl
KTsKK30KKworYm9vbCBMYXllclRpbGVyOjpoYXNEaXJ0eVRpbGVzKCkgY29uc3QKK3sKKyAgICBm
b3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFk
LmJlZ2luKCk7IGl0ICE9IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5lbmQoKTsgKytpdCkgewor
ICAgICAgICBjb25zdCBMYXllclRpbGUqIHRpbGUgPSAoKml0KS5zZWNvbmQ7CisgICAgICAgIGlm
ICh0aWxlLT5pc0RpcnR5KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6YmluZENvbnRlbnRzVGV4dHVy
ZSgpCit7CisgICAgQVNTRVJUKG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5zaXplKCkgPT0gMSk7
CisgICAgaWYgKG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5zaXplKCkgIT0gMSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgY29uc3QgTGF5ZXJUaWxlKiB0aWxlID0gbV90aWxlc0NvbXBvc2l0aW5n
VGhyZWFkLmJlZ2luKCktPnNlY29uZDsKKworICAgIEFTU0VSVCh0aWxlLT5oYXNUZXh0dXJlKCkp
OworICAgIGlmICghdGlsZS0+aGFzVGV4dHVyZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBn
bEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRpbGUtPnRleHR1cmUoKS0+dGV4dHVyZUlkKCkp
OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVyLmggYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZXIuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi4wYTdhNTM1ZDlmODJlMGE5NzU4NDQ5Y2E3NjJjODAzOGM4NWRjMGJkCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJy
eS9MYXllclRpbGVyLmgKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAg
MDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBMYXllclRpbGVyX2gKKyNkZWZpbmUgTGF5
ZXJUaWxlcl9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRl
ICJDb2xvci5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIK
KyNpbmNsdWRlICJMYXllclRpbGVEYXRhLmgiCisjaW5jbHVkZSAiTGF5ZXJUaWxlSW5kZXguaCIK
KworI2luY2x1ZGUgPFNrQml0bWFwLmg+CisjaW5jbHVkZSA8d3RmL0RlcXVlLmg+CisjaW5jbHVk
ZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0
Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IExheWVyVGlsZTsKK2NsYXNzIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ7CitjbGFzcyBMYXllcldl
YktpdFRocmVhZDsKK2NsYXNzIFRyYW5zZm9ybWF0aW9uTWF0cml4OworCitjbGFzcyBMYXllclRp
bGVyIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPExheWVyVGlsZXI+IHsKK3B1YmxpYzoK
KyAgICBUaWxlSW5kZXggaW5kZXhPZlRpbGUoY29uc3QgSW50UG9pbnQmIG9yaWdpbik7CisgICAg
SW50UG9pbnQgb3JpZ2luT2ZUaWxlKGNvbnN0IFRpbGVJbmRleCYpOworICAgIEludFJlY3QgcmVj
dEZvclRpbGUoY29uc3QgVGlsZUluZGV4JiwgY29uc3QgSW50U2l6ZSYgYm91bmRzKTsKKworICAg
IHN0YXRpYyBQYXNzUmVmUHRyPExheWVyVGlsZXI+IGNyZWF0ZShMYXllcldlYktpdFRocmVhZCog
bGF5ZXIpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IExheWVyVGlsZXIobGF5
ZXIpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5MYXllclRpbGVyKCk7CisKKyAgICAvLyBXZWJL
aXQgdGhyZWFkCisgICAgTGF5ZXJXZWJLaXRUaHJlYWQqIGxheWVyKCkgY29uc3QgeyByZXR1cm4g
bV9sYXllcjsgfQorICAgIHZvaWQgbGF5ZXJXZWJLaXRUaHJlYWREZXN0cm95ZWQoKTsKKyAgICB2
b2lkIHNldE5lZWRzRGlzcGxheShjb25zdCBGbG9hdFJlY3QmIGRpcnR5UmVjdCk7CisgICAgdm9p
ZCBzZXROZWVkc0Rpc3BsYXkoKTsKKyAgICB2b2lkIHVwZGF0ZVRleHR1cmVDb250ZW50c0lmTmVl
ZGVkKGRvdWJsZSBzY2FsZSk7CisgICAgdm9pZCBkaXNhYmxlVGlsaW5nKGJvb2wpOworCisgICAg
Ly8gQ29tcG9zaXRpbmcgdGhyZWFkCisgICAgdm9pZCBsYXllckNvbXBvc2l0aW5nVGhyZWFkRGVz
dHJveWVkKCk7CisgICAgdm9pZCB1cGxvYWRUZXh0dXJlc0lmTmVlZGVkKCk7CisgICAgdm9pZCBk
cmF3VGV4dHVyZXMoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCosIGludCBwb3NpdGlvbkxvY2F0aW9u
LCBpbnQgdGV4Q29vcmRMb2NhdGlvbik7CisgICAgYm9vbCBoYXNNaXNzaW5nVGV4dHVyZXMoKSBj
b25zdCB7IHJldHVybiBtX2hhc01pc3NpbmdUZXh0dXJlczsgfQorICAgIHZvaWQgZHJhd01pc3Np
bmdUZXh0dXJlcyhMYXllckNvbXBvc2l0aW5nVGhyZWFkKiwgaW50IHBvc2l0aW9uTG9jYXRpb24s
IGludCB0ZXhDb29yZExvY2F0aW9uKTsKKyAgICB2b2lkIGRlbGV0ZVRleHR1cmVzKCk7CisgICAg
dm9pZCBjb21taXRQZW5kaW5nVGV4dHVyZVVwbG9hZHMoKTsKKyAgICB2b2lkIGxheWVyVmlzaWJp
bGl0eUNoYW5nZWQoYm9vbCB2aXNpYmxlKTsKKyAgICBib29sIGhhc0RpcnR5VGlsZXMoKSBjb25z
dDsKKyAgICB2b2lkIGJpbmRDb250ZW50c1RleHR1cmUoKTsKKworICAgIC8vIFRocmVhZCBzYWZl
CisgICAgdm9pZCBhZGRSZW5kZXJKb2IoY29uc3QgVGlsZUluZGV4Jik7CisgICAgdm9pZCByZW1v
dmVSZW5kZXJKb2IoY29uc3QgVGlsZUluZGV4Jik7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IFRl
eHR1cmVKb2IgeworICAgICAgICBlbnVtIFR5cGUgeyBVbmtub3duLCBTZXRDb250ZW50cywgU2V0
Q29udGVudHNUb0NvbG9yLCBVcGRhdGVDb250ZW50cywgRGlzY2FyZENvbnRlbnRzLCBSZXNpemVD
b250ZW50cywgRGlydHlDb250ZW50cyB9OworCisgICAgICAgIFRleHR1cmVKb2IoKQorICAgICAg
ICAgICAgOiB0eXBlKFVua25vd24pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIFRl
eHR1cmVKb2IoVHlwZSB0eXBlLCBjb25zdCBJbnRTaXplJiBuZXdTaXplKQorICAgICAgICAgICAg
OiB0eXBlKHR5cGUpCisgICAgICAgICAgICAsIGlzT3BhcXVlKGZhbHNlKQorICAgICAgICAgICAg
LCBkaXJ0eVJlY3QoSW50UG9pbnQoKSwgbmV3U2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAg
QVNTRVJUKHR5cGUgPT0gUmVzaXplQ29udGVudHMpOworICAgICAgICB9CisKKyAgICAgICAgVGV4
dHVyZUpvYihUeXBlIHR5cGUsIGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCkKKyAgICAgICAgICAg
IDogdHlwZSh0eXBlKQorICAgICAgICAgICAgLCBpc09wYXF1ZShmYWxzZSkKKyAgICAgICAgICAg
ICwgZGlydHlSZWN0KGRpcnR5UmVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKHR5
cGUgPT0gRGlzY2FyZENvbnRlbnRzIHx8IHR5cGUgPT0gRGlydHlDb250ZW50cyk7CisgICAgICAg
IH0KKworICAgICAgICBUZXh0dXJlSm9iKFR5cGUgdHlwZSwgY29uc3QgU2tCaXRtYXAmIGNvbnRl
bnRzLCBjb25zdCBJbnRSZWN0JiBkaXJ0eVJlY3QsIGJvb2wgaXNPcGFxdWUgPSBmYWxzZSkKKyAg
ICAgICAgICAgIDogdHlwZSh0eXBlKQorICAgICAgICAgICAgLCBjb250ZW50cyhjb250ZW50cykK
KyAgICAgICAgICAgICwgaXNPcGFxdWUoaXNPcGFxdWUpCisgICAgICAgICAgICAsIGRpcnR5UmVj
dChkaXJ0eVJlY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IFVwZGF0
ZUNvbnRlbnRzIHx8IHR5cGUgPT0gU2V0Q29udGVudHMpOworICAgICAgICAgICAgQVNTRVJUKCFj
b250ZW50cy5pc051bGwoKSk7CisgICAgICAgIH0KKworICAgICAgICBUZXh0dXJlSm9iKFR5cGUg
dHlwZSwgY29uc3QgQ29sb3ImIGNvbG9yLCBjb25zdCBUaWxlSW5kZXgmIGluZGV4KQorICAgICAg
ICAgICAgOiB0eXBlKHR5cGUpCisgICAgICAgICAgICAsIGlzT3BhcXVlKGZhbHNlKQorICAgICAg
ICAgICAgLCBjb2xvcihjb2xvcikKKyAgICAgICAgICAgICwgaW5kZXgoaW5kZXgpCisgICAgICAg
IHsKKyAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IFNldENvbnRlbnRzVG9Db2xvcik7CisgICAg
ICAgIH0KKworICAgICAgICBzdGF0aWMgVGV4dHVyZUpvYiBzZXRDb250ZW50cyhjb25zdCBTa0Jp
dG1hcCYgY29udGVudHMsIGJvb2wgaXNPcGFxdWUpIHsgcmV0dXJuIFRleHR1cmVKb2IoU2V0Q29u
dGVudHMsIGNvbnRlbnRzLCBJbnRSZWN0KEludFBvaW50KCksIEludFNpemUoY29udGVudHMud2lk
dGgoKSwgY29udGVudHMuaGVpZ2h0KCkpKSwgaXNPcGFxdWUpOyB9CisgICAgICAgIHN0YXRpYyBU
ZXh0dXJlSm9iIHNldENvbnRlbnRzVG9Db2xvcihjb25zdCBDb2xvciYgY29sb3IsIGNvbnN0IFRp
bGVJbmRleCYgaW5kZXgpIHsgcmV0dXJuIFRleHR1cmVKb2IoU2V0Q29udGVudHNUb0NvbG9yLCBj
b2xvciwgaW5kZXgpOyB9CisgICAgICAgIHN0YXRpYyBUZXh0dXJlSm9iIHVwZGF0ZUNvbnRlbnRz
KGNvbnN0IFNrQml0bWFwJiBjb250ZW50cywgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0KSB7IHJl
dHVybiBUZXh0dXJlSm9iKFVwZGF0ZUNvbnRlbnRzLCBjb250ZW50cywgZGlydHlSZWN0KTsgfQor
ICAgICAgICBzdGF0aWMgVGV4dHVyZUpvYiBkaXNjYXJkQ29udGVudHMoY29uc3QgSW50UmVjdCYg
ZGlydHlSZWN0KSB7IHJldHVybiBUZXh0dXJlSm9iKERpc2NhcmRDb250ZW50cywgZGlydHlSZWN0
KTsgfQorICAgICAgICBzdGF0aWMgVGV4dHVyZUpvYiByZXNpemVDb250ZW50cyhjb25zdCBJbnRT
aXplJiBuZXdTaXplKSB7IHJldHVybiBUZXh0dXJlSm9iKFJlc2l6ZUNvbnRlbnRzLCBuZXdTaXpl
KTsgfQorICAgICAgICBzdGF0aWMgVGV4dHVyZUpvYiBkaXJ0eUNvbnRlbnRzKGNvbnN0IEludFJl
Y3QmIGRpcnR5UmVjdCkgeyByZXR1cm4gVGV4dHVyZUpvYihEaXJ0eUNvbnRlbnRzLCBkaXJ0eVJl
Y3QpOyB9CisKKyAgICAgICAgYm9vbCBpc051bGwoKSB7IHJldHVybiB0eXBlID09IFVua25vd247
IH0KKworICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgIFNrQml0bWFwIGNvbnRlbnRzOworICAg
ICAgICBib29sIGlzT3BhcXVlOworICAgICAgICBJbnRSZWN0IGRpcnR5UmVjdDsKKyAgICAgICAg
Q29sb3IgY29sb3I7CisgICAgICAgIFRpbGVJbmRleCBpbmRleDsKKyAgICB9OworCisgICAgdHlw
ZWRlZiBIYXNoTWFwPFRpbGVJbmRleCwgTGF5ZXJUaWxlKj4gVGlsZU1hcDsKKyAgICB0eXBlZGVm
IEhhc2hNYXA8VGlsZUluZGV4LCBMYXllclRpbGVEYXRhPiBWaXNpYmlsaXR5TWFwOworICAgIHR5
cGVkZWYgSGFzaE1hcDxUaWxlSW5kZXgsIGNvbnN0IFRleHR1cmVKb2IqPiBUaWxlSm9ic01hcDsK
KworICAgIHN0YXRpYyBJbnRTaXplIGRlZmF1bHRUaWxlU2l6ZSgpOworICAgIEludFNpemUgdGls
ZVNpemUoKSBjb25zdCB7IHJldHVybiBtX3RpbGVTaXplOyB9CisgICAgdm9pZCB1cGRhdGVUaWxl
U2l6ZSgpOworCisgICAgTGF5ZXJUaWxlcihMYXllcldlYktpdFRocmVhZCopOworCisgICAgLy8g
V2ViS2l0IHRocmVhZAorICAgIHZvaWQgYWRkVGV4dHVyZUpvYihjb25zdCBUZXh0dXJlSm9iJik7
CisgICAgdm9pZCBjbGVhclRleHR1cmVKb2JzKCk7CisgICAgYm9vbCBzaG91bGRQZXJmb3JtUmVu
ZGVySm9iKGNvbnN0IFRpbGVJbmRleCYsIGJvb2wgYWxsb3dQcmVmaWxsKTsKKyAgICBib29sIHNo
b3VsZFByZWZpbGxUaWxlKGNvbnN0IFRpbGVJbmRleCYpOworCisgICAgLy8gQ29tcG9zaXRpbmcg
dGhyZWFkCisgICAgdm9pZCB1cGRhdGVUaWxlQ29udGVudHMoY29uc3QgVGV4dHVyZUpvYiYsIGNv
bnN0IEludFJlY3QmKTsKKyAgICB2b2lkIGFkZFRpbGVKb2IoY29uc3QgVGlsZUluZGV4JiwgY29u
c3QgVGV4dHVyZUpvYiYsIFRpbGVKb2JzTWFwJik7CisgICAgdm9pZCBwZXJmb3JtVGlsZUpvYihM
YXllclRpbGUqLCBjb25zdCBUZXh0dXJlSm9iJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZvaWQg
cHJvY2Vzc1RleHR1cmVKb2IoY29uc3QgVGV4dHVyZUpvYiYsIFRpbGVKb2JzTWFwJik7CisgICAg
dm9pZCBkcmF3VGV4dHVyZXNJbnRlcm5hbChMYXllckNvbXBvc2l0aW5nVGhyZWFkKiwgaW50IHBv
c2l0aW9uTG9jYXRpb24sIGludCB0ZXhDb29yZExvY2F0aW9uLCBib29sIG1pc3NpbmcpOworICAg
IHZvaWQgcHJ1bmVUZXh0dXJlcygpOworICAgIHZvaWQgdmlzaWJpbGl0eUNoYW5nZWQoYm9vbCBu
ZWVkc0Rpc3BsYXkpOworCisgICAgLy8gQ2xlYXIgYWxsIHBlbmRpbmcgdXBkYXRlIGNvbnRlbnQg
dGV4dHVyZSBqb2JzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9pZCBy
ZW1vdmVVcGRhdGVDb250ZW50c0pvYnMoVCYgam9icykKKyAgICB7CisgICAgICAgIC8vIENsZWFy
IGFsbCBwZW5kaW5nIHVwZGF0ZSBjb250ZW50IGpvYnMKKyAgICAgICAgVCBsaXN0OworICAgICAg
ICBmb3IgKHR5cGVuYW1lIFQ6Oml0ZXJhdG9yIGl0ID0gam9icy5iZWdpbigpOyBpdCAhPSBqb2Jz
LmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoKCppdCkudHlwZSAhPSBUZXh0dXJlSm9i
OjpVcGRhdGVDb250ZW50cykKKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZCgqaXQpOworICAg
ICAgICB9CisgICAgICAgIGpvYnMgPSBsaXN0OworICAgIH0KKworICAgIExheWVyV2ViS2l0VGhy
ZWFkKiBtX2xheWVyOworCisgICAgVGlsZU1hcCBtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQ7CisK
KyAgICBWaXNpYmlsaXR5TWFwIG1fdGlsZXNXZWJLaXRUaHJlYWQ7CisKKyAgICBib29sIG1fdGls
aW5nRGlzYWJsZWQ7CisKKyAgICBib29sIG1fY29udGVudHNEaXJ0eTsKKyAgICBGbG9hdFJlY3Qg
bV9kaXJ0eVJlY3Q7CisKKyAgICBJbnRTaXplIG1fcGVuZGluZ1RleHR1cmVTaXplOyAvLyBSZXNp
emVkLCBidXQgbm90IGNvbW1pdHRlZCB5ZXQuCisgICAgSW50U2l6ZSBtX3JlcXVpcmVkVGV4dHVy
ZVNpemU7CisgICAgSW50U2l6ZSBtX3RpbGVTaXplOworCisgICAgYm9vbCBtX2NsZWFyVGV4dHVy
ZUpvYnM7CisgICAgVmVjdG9yPFRleHR1cmVKb2I+IG1fcGVuZGluZ1RleHR1cmVKb2JzOyAvLyBB
ZGRlZCwgYnV0IG5vdCBjb21taXR0ZWQgeWV0LgorICAgIERlcXVlPFRleHR1cmVKb2I+IG1fdGV4
dHVyZUpvYnM7CisgICAgYm9vbCBtX2hhc01pc3NpbmdUZXh0dXJlczsKKworICAgIEhhc2hTZXQ8
VGlsZUluZGV4PiBtX3JlbmRlckpvYnM7CisgICAgTXV0ZXggbV9yZW5kZXJKb2JzTXV0ZXg7Cisg
ICAgZG91YmxlIG1fY29udGVudHNTY2FsZTsKK307CisKK30KKworI2VuZGlmIC8vIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlmIC8vIExheWVyVGlsZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>130087</attachid>
            <date>2012-03-05 03:26:29 -0800</date>
            <delta_ts>2012-03-08 04:45:28 -0800</delta_ts>
            <desc>patch v2</desc>
            <filename>bug-79875-20120305192616.patch</filename>
            <type>text/plain</type>
            <size>52680</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5NzI4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzI0OWUyOGUzZGQ3YzIw
N2M2YWM2OWM3NGViNGY3YWUyOGYxMzhlMC4uMmVhNDM5MjU3OTdlNTIyMDdmZGY4YTUzYmM5OWNj
ODkzMzczYmFmZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDk4IEBACisyMDEyLTAzLTA1ICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBjbGFzc2VzIHRoYXQgaGFuZGxlIGxheWVyIHRpbGluZworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzk4NzUKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBu
byBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xh
eWVyVGlsZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclRpbGU6OkxheWVyVGlsZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6On5M
YXllclRpbGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlOjpzZXRDb250ZW50cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnNldENvbnRlbnRzVG9Db2xvcik6CisgICAgICAg
IChXZWJDb3JlOjpMYXllclRpbGU6OnVwZGF0ZUNvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyVGlsZTo6ZGlzY2FyZENvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGls
ZTo6c2V0VmlzaWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnNldFRleHR1cmUp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChMYXllclRpbGUpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJUaWxlOjp0ZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGls
ZTo6aXNWaXNpYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZTo6aXNEaXJ0eSk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6Omhhc1RleHR1cmUpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJUaWxlOjpzZXRDb250ZW50c0RpcnR5KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZURhdGEuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
KToKKyAgICAgICAgKExheWVyVGlsZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxl
RGF0YTo6TGF5ZXJUaWxlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVEYXRhOjpp
c1Zpc2libGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJU
aWxlSW5kZXguaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFRpbGVJbmRl
eCk6CisgICAgICAgIChXZWJDb3JlOjpUaWxlSW5kZXg6OlRpbGVJbmRleCk6CisgICAgICAgIChX
ZWJDb3JlOjpUaWxlSW5kZXg6On5UaWxlSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6VGlsZUlu
ZGV4OjppKToKKyAgICAgICAgKFdlYkNvcmU6OlRpbGVJbmRleDo6aik6CisgICAgICAgIChXZWJD
b3JlOjpUaWxlSW5kZXg6OnNldEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6Om9wZXJhdG9yPT0p
OgorICAgICAgICAoV2ViQ29yZTo6b3BlcmF0b3IhPSk6CisgICAgICAgIChXVEYpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlci5jcHA6IEFkZGVkLgor
ICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjp0cmFuc2Zvcm1Qb2ludCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpMYXllclRpbGVyKToKKyAgICAgICAgKFdlYkNv
cmU6OkxheWVyVGlsZXI6On5MYXllclRpbGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGls
ZXI6OmxheWVyV2ViS2l0VGhyZWFkRGVzdHJveWVkKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
VGlsZXI6OmxheWVyQ29tcG9zaXRpbmdUaHJlYWREZXN0cm95ZWQpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJUaWxlcjo6c2V0TmVlZHNEaXNwbGF5KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
VGlsZXI6OnVwZGF0ZVRleHR1cmVDb250ZW50c0lmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyVGlsZXI6OnNob3VsZFBlcmZvcm1SZW5kZXJKb2IpOgorICAgICAgICAoV2ViQ29yZTo6
TGF5ZXJUaWxlcjo6YWRkVGV4dHVyZUpvYik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVy
OjpjbGVhclRleHR1cmVKb2JzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmNvbW1p
dFBlbmRpbmdUZXh0dXJlVXBsb2Fkcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjps
YXllclZpc2liaWxpdHlDaGFuZ2VkKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnVw
bG9hZFRleHR1cmVzSWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6cHJv
Y2Vzc1RleHR1cmVKb2IpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6YWRkVGlsZUpv
Yik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpwZXJmb3JtVGlsZUpvYik6CisgICAg
ICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpkcmF3VGV4dHVyZXMpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJUaWxlcjo6ZHJhd01pc3NpbmdUZXh0dXJlcyk6CisgICAgICAgIChXZWJDb3JlOjpM
YXllclRpbGVyOjpkcmF3VGV4dHVyZXNJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpMYXll
clRpbGVyOjphZGRSZW5kZXJKb2IpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6cmVt
b3ZlUmVuZGVySm9iKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmRlbGV0ZVRleHR1
cmVzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnBydW5lVGV4dHVyZXMpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6ZGVmYXVsdFRpbGVTaXplKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyVGlsZXI6OnVwZGF0ZVRpbGVTaXplKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyVGlsZXI6OmRpc2FibGVUaWxpbmcpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6
c2hvdWxkUHJlZmlsbFRpbGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6aW5kZXhP
ZlRpbGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6b3JpZ2luT2ZUaWxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnJlY3RGb3JUaWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OkxheWVyVGlsZXI6Omhhc0RpcnR5VGlsZXMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJU
aWxlcjo6YmluZENvbnRlbnRzVGV4dHVyZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
YmxhY2tiZXJyeS9MYXllclRpbGVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAg
ICAgIChMYXllclRpbGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmNyZWF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpsYXllcik6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclRpbGVyOjpoYXNNaXNzaW5nVGV4dHVyZXMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5
ZXJUaWxlcjo6VGV4dHVyZUpvYjo6VGV4dHVyZUpvYik6CisgICAgICAgIChUZXh0dXJlSm9iKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OlRleHR1cmVKb2I6OnNldENvbnRlbnRzKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OlRleHR1cmVKb2I6OnNldENvbnRlbnRzVG9D
b2xvcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpUZXh0dXJlSm9iOjp1cGRhdGVD
b250ZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpUZXh0dXJlSm9iOjpkaXNj
YXJkQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6VGV4dHVyZUpvYjo6
cmVzaXplQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6VGV4dHVyZUpv
Yjo6ZGlydHlDb250ZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpUZXh0dXJl
Sm9iOjppc051bGwpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6dGlsZVNpemUpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6cmVtb3ZlVXBkYXRlQ29udGVudHNKb2JzKToK
KwogMjAxMi0wMy0wNSAgUGF2ZWwgUG9kaXZpbG92ICA8cG9kaXZpbG92QGNocm9taXVtLm9yZz4K
IAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBmaXggZXh0ZW5zaW9ucy1yZXNvdXJjZS5odG1sIHRl
c3QuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2Jl
cnJ5L0xheWVyVGlsZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFj
a2JlcnJ5L0xheWVyVGlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGM1M2VlMDE4YmE0Y2FjZmE0MTQ2ODEx
YzhiOTdjYjFhMDVjNTIwNQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlLmNwcApAQCAtMCwwICsxLDEwMyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRl
ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisg
KiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBG
cmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRl
ICJMYXllclRpbGUuaCIKKworI2luY2x1ZGUgIlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFk
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworTGF5ZXJUaWxlOjpMYXllclRpbGUoKQorICAg
IDogbV9jb250ZW50c0RpcnR5KGZhbHNlKQoreworfQorCitMYXllclRpbGU6On5MYXllclRpbGUo
KQoreworICAgIC8vIE1ha2Ugc3VyZSB0byB1bnByb3RlY3QgdGhlIHRleHR1cmUgaWYgbmVlZGVk
LgorICAgIHNldFZpc2libGUoZmFsc2UpOworfQorCit2b2lkIExheWVyVGlsZTo6c2V0Q29udGVu
dHMoY29uc3QgU2tCaXRtYXAmIGNvbnRlbnRzLCBjb25zdCBJbnRSZWN0JiB0aWxlUmVjdCwgY29u
c3QgVGlsZUluZGV4JiBpbmRleCwgYm9vbCBpc09wYXF1ZSkKK3sKKyAgICBzZXRUZXh0dXJlKHRl
eHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCktPnRleHR1cmVGb3JUaWxlZENvbnRlbnRzKGNv
bnRlbnRzLCB0aWxlUmVjdCwgaW5kZXgsIGlzT3BhcXVlKSk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxl
OjpzZXRDb250ZW50c1RvQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIHNldFRleHR1
cmUodGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKS0+dGV4dHVyZUZvckNvbG9yKGNvbG9y
KSk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlOjp1cGRhdGVDb250ZW50cyhjb25zdCBTa0JpdG1hcCYg
Y29udGVudHMsIGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCwgY29uc3QgSW50UmVjdCYgdGlsZVJl
Y3QpCit7CisgICAgc2V0VGV4dHVyZSh0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT51
cGRhdGVDb250ZW50cyhtX3RleHR1cmUsIGNvbnRlbnRzLCBkaXJ0eVJlY3QsIHRpbGVSZWN0KSk7
Cit9CisKK3ZvaWQgTGF5ZXJUaWxlOjpkaXNjYXJkQ29udGVudHMoKQoreworICAgIHNldFRleHR1
cmUoMCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlOjpzZXRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKK3sK
KyAgICBpZiAodmlzaWJsZSA9PSBtX3Zpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
dmlzaWJsZSA9IHZpc2libGU7CisKKyAgICBpZiAoIW1fdGV4dHVyZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gUHJvdGVjdCB0aGUgdGV4dHVyZSBmcm9tIGJlaW5nIGV2aWN0ZWQgZnJvbSBj
YWNoZQorICAgIC8vIGlmIHdlIGFyZSB2aXNpYmxlLgorICAgIGlmICh2aXNpYmxlKQorICAgICAg
ICBtX3RleHR1cmUtPnByb3RlY3QoKTsKKyAgICBlbHNlCisgICAgICAgIG1fdGV4dHVyZS0+dW5w
cm90ZWN0KCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlOjpzZXRUZXh0dXJlKFBhc3NSZWZQdHI8VGV4
dHVyZT4gdGV4dHVyZSkKK3sKKyAgICAvLyBDbGVhciB0aGlzIGZsYWcgcmVnYXJkbGVzcyBvZiB0
aGUgdmFsdWUgb2YgdGhlIHRleHR1cmUgcGFyYW1ldGVyLgorICAgIC8vIElmIGl0J3MgMCwgaXNE
aXJ0eSgpIHdpbGwgcmV0dXJuIHRydWUgYW55d2F5LgorICAgIC8vIElmIGl0J3MgdGhlIHNhbWUg
dGV4dHVyZSwgcGVyaGFwcyB0aGVyZSB3YXMgbm8gbW9yZSBkZXRhaWxlZCB0ZXh0dXJlCisgICAg
Ly8gYXZhaWxhYmxlIHRoYW4gdGhlIG9uZSB3ZSBhbHJlYWR5IGhhZCwgYW5kIGtlZXBpbmcgdGhl
IGRpcnR5IGZsYWcgd2lsbAorICAgIC8vIHJlc3VsdCBpbiBhbiBlbmRsZXNzIGxvb3Agb2YgdXBk
YXRpbmcgdG8gdGhlIHNhbWUgdGV4dHVyZS4KKyAgICBtX2NvbnRlbnRzRGlydHkgPSBmYWxzZTsK
KworICAgIGlmICh0ZXh0dXJlID09IG1fdGV4dHVyZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gTW92ZSBwcm90ZWN0aW9uIG92ZXIgdG8gdGhlIG5ldyB0ZXh0dXJlCisgICAgaWYgKG1fdmlz
aWJsZSkgeworICAgICAgICBpZiAobV90ZXh0dXJlKQorICAgICAgICAgICAgbV90ZXh0dXJlLT51
bnByb3RlY3QoKTsKKyAgICAgICAgaWYgKHRleHR1cmUpCisgICAgICAgICAgICB0ZXh0dXJlLT5w
cm90ZWN0KCk7CisgICAgfQorCisgICAgbV90ZXh0dXJlID0gdGV4dHVyZTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJy
eS9MYXllclRpbGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVy
cnkvTGF5ZXJUaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNjY2NmEwODcyMGE1NGRiYmY3ZWJhYjYzNjc1MmE4
M2U2ZDIzNzI5NgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3
YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIExheWVyVGlsZV9o
CisjZGVmaW5lIExheWVyVGlsZV9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisKKyNpbmNsdWRlICJDb2xvci5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJM
YXllclRpbGVEYXRhLmgiCisjaW5jbHVkZSAiTGF5ZXJUaWxlSW5kZXguaCIKKyNpbmNsdWRlICJU
ZXh0dXJlLmgiCisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIExheWVyVGlsZSA6IHB1YmxpYyBMYXllclRpbGVEYXRhIHsKKyAgICBXVEZfTUFL
RV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBMYXllclRpbGUoKTsKKyAgICB+TGF5ZXJU
aWxlKCk7CisKKyAgICBUZXh0dXJlKiB0ZXh0dXJlKCkgY29uc3QgeyByZXR1cm4gbV90ZXh0dXJl
LmdldCgpOyB9CisKKyAgICBib29sIGlzVmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmlzaWJs
ZTsgfQorICAgIHZvaWQgc2V0VmlzaWJsZShib29sKTsKKworICAgIGJvb2wgaXNEaXJ0eSgpIGNv
bnN0IHsgcmV0dXJuIG1fY29udGVudHNEaXJ0eSB8fCAhbV90ZXh0dXJlIHx8IG1fdGV4dHVyZS0+
aXNEaXJ0eSgpOyB9CisKKyAgICBib29sIGhhc1RleHR1cmUoKSBjb25zdCB7IHJldHVybiBtX3Rl
eHR1cmUgJiYgbV90ZXh0dXJlLT5oYXNUZXh0dXJlKCk7IH0KKworICAgIHZvaWQgc2V0Q29udGVu
dHMoY29uc3QgU2tCaXRtYXAmIGNvbnRlbnRzLCBjb25zdCBJbnRSZWN0JiB0aWxlUmVjdCwgY29u
c3QgVGlsZUluZGV4JiwgYm9vbCBpc09wYXF1ZSk7CisgICAgdm9pZCBzZXRDb250ZW50c1RvQ29s
b3IoY29uc3QgQ29sb3ImKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzKGNvbnN0IFNrQml0bWFw
JiBjb250ZW50cywgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0LCBjb25zdCBJbnRSZWN0JiB0aWxl
UmVjdCk7CisgICAgdm9pZCBkaXNjYXJkQ29udGVudHMoKTsKKworICAgIC8vIFRoZSBjdXJyZW50
IHRleHR1cmUgaXMgYW4gYWNjdXJhdGUgcHJldmlldyBvZiB0aGlzIGxheWVyLCBidXQgYSBtb3Jl
CisgICAgLy8gZGV0YWlsZWQgdGV4dHVyZSBjb3VsZCBiZSBvYnRhaW5lZCBieSByZXBhaW50aW5n
IHRoZSBsYXllci4gVXNlZCB3aGVuCisgICAgLy8gem9vbSBsZXZlbCBjaGFuZ2VzLgorICAgIHZv
aWQgc2V0Q29udGVudHNEaXJ0eSgpIHsgbV9jb250ZW50c0RpcnR5ID0gdHJ1ZTsgfQorCitwcml2
YXRlOgorICAgIHZvaWQgc2V0VGV4dHVyZShQYXNzUmVmUHRyPFRleHR1cmU+KTsKKworICAgIFJl
ZlB0cjxUZXh0dXJlPiBtX3RleHR1cmU7IC8vIE5ldmVyIGFzc2lnbiB0byBtX3RleHR1cmUgZGly
ZWN0bHksIHVzZSBzZXRUZXh0dXJlKCkgYWJvdmUKKyAgICBib29sIG1fY29udGVudHNEaXJ0eTsK
K307CisKK30KKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2Vu
ZGlmIC8vIFRleHR1cmVfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVEYXRhLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZURhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mZDA1YmRk
MTYxZWQ2M2RmZWE2NTgxZTVlYzVkNzZlM2E5OTkyZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVEYXRhLmgK
QEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJj
aCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisg
KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVi
bGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
IEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
KyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2Vy
IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBu
b3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG
cmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EK
KyAqLworCisjaWZuZGVmIExheWVyVGlsZURhdGFfaAorI2RlZmluZSBMYXllclRpbGVEYXRhX2gK
KworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitjbGFzcyBMYXllclRpbGVEYXRhIHsKK3B1YmxpYzoKKyAgICBMYXllclRpbGVEYXRhKCkK
KyAgICAgICAgOiBtX3Zpc2libGUoZmFsc2UpCisgICAgeworICAgIH0KKworICAgIGJvb2wgaXNW
aXNpYmxlKCkgY29uc3QgeyByZXR1cm4gbV92aXNpYmxlOyB9CisKK3Byb3RlY3RlZDoKKyAgICBi
b29sIG1fdmlzaWJsZTsKK307CisKK30KKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKKworI2VuZGlmIC8vIExheWVyVGlsZURhdGFfaApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVJbmRleC5oIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVJbmRl
eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjUwNzk3YWUxYmFkODAxZWExMzM4NTc4NGQ4NWU1NjRlYzc3MDJmMTQK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFj
a2JlcnJ5L0xheWVyVGlsZUluZGV4LmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisg
KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0
b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIExheWVyVGlsZUluZGV4X2gK
KyNkZWZpbmUgTGF5ZXJUaWxlSW5kZXhfaAorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUg
PHd0Zi9IYXNoTWFwLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgVGlsZUluZGV4
IHsKK3B1YmxpYzoKKyAgICBUaWxlSW5kZXgoKQorICAgICAgICA6IG1faShzdGQ6Om51bWVyaWNf
bGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpCisgICAgICAgICwgbV9qKHN0ZDo6bnVtZXJpY19saW1p
dHM8dW5zaWduZWQ+OjptYXgoKSkKKyAgICB7CisgICAgfQorICAgIFRpbGVJbmRleCh1bnNpZ25l
ZCBpLCB1bnNpZ25lZCBqKQorICAgICAgICA6IG1faShpKQorICAgICAgICAsIG1faihqKQorICAg
IHsKKyAgICB9CisgICAgflRpbGVJbmRleCgpIHsgfQorCisgICAgdW5zaWduZWQgaSgpIGNvbnN0
IHsgcmV0dXJuIG1faTsgfQorICAgIHVuc2lnbmVkIGooKSBjb25zdCB7IHJldHVybiBtX2o7IH0K
KyAgICB2b2lkIHNldEluZGV4KHVuc2lnbmVkIGksIHVuc2lnbmVkIGopCisgICAgeworICAgICAg
ICBtX2kgPSBpOworICAgICAgICBtX2ogPSBqOworICAgIH0KKworcHJpdmF0ZToKKyAgICB1bnNp
Z25lZCBtX2k7CisgICAgdW5zaWduZWQgbV9qOworfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9
PShjb25zdCBXZWJDb3JlOjpUaWxlSW5kZXgmIGEsIGNvbnN0IFdlYkNvcmU6OlRpbGVJbmRleCYg
YikKK3sKKyAgICByZXR1cm4gYS5pKCkgPT0gYi5pKCkgJiYgYS5qKCkgPT0gYi5qKCk7Cit9CisK
K2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgV2ViQ29yZTo6VGlsZUluZGV4JiBhLCBjb25z
dCBXZWJDb3JlOjpUaWxlSW5kZXgmIGIpCit7CisgICAgcmV0dXJuIGEuaSgpICE9IGIuaSgpIHx8
IGEuaigpICE9IGIuaigpOworfQorCit9CisKK25hbWVzcGFjZSBXVEYgeworCit0ZW1wbGF0ZTw+
IHN0cnVjdCBJbnRIYXNoPFdlYkNvcmU6OlRpbGVJbmRleD4geworICAgIHN0YXRpYyB1bnNpZ25l
ZCBoYXNoKGNvbnN0IFdlYkNvcmU6OlRpbGVJbmRleCYga2V5KSB7IHJldHVybiBpbnRIYXNoKChz
dGF0aWNfY2FzdDx1aW50NjRfdD4oa2V5LmkoKSkgPDwgMzIgfCBrZXkuaigpKSk7IH0KKyAgICBz
dGF0aWMgYm9vbCBlcXVhbChjb25zdCBXZWJDb3JlOjpUaWxlSW5kZXgmIGEsIGNvbnN0IFdlYkNv
cmU6OlRpbGVJbmRleCYgYikgeyByZXR1cm4gYSA9PSBiOyB9CisgICAgc3RhdGljIGNvbnN0IGJv
b2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVlOworfTsKK3RlbXBsYXRlPD4g
c3RydWN0IERlZmF1bHRIYXNoPFdlYkNvcmU6OlRpbGVJbmRleD4geworICAgIHR5cGVkZWYgSW50
SGFzaDxXZWJDb3JlOjpUaWxlSW5kZXg+IEhhc2g7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBI
YXNoVHJhaXRzPFdlYkNvcmU6OlRpbGVJbmRleD4gOiBHZW5lcmljSGFzaFRyYWl0czxXZWJDb3Jl
OjpUaWxlSW5kZXg+IHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBlbXB0eVZhbHVlSXNaZXJvID0g
ZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgbmVlZHNEZXN0cnVjdGlvbiA9IGZhbHNlOwor
ICAgIHN0YXRpYyBXZWJDb3JlOjpUaWxlSW5kZXggZW1wdHlWYWx1ZSgpIHsgcmV0dXJuIFdlYkNv
cmU6OlRpbGVJbmRleCgpOyB9CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0RGVsZXRlZFZhbHVl
KFdlYkNvcmU6OlRpbGVJbmRleCYgc2xvdCkKKyAgICB7CisgICAgICAgIG5ldyAoJnNsb3QpIFdl
YkNvcmU6OlRpbGVJbmRleChzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgLSAx
LCBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgLSAxKTsKKyAgICB9CisgICAg
c3RhdGljIGJvb2wgaXNEZWxldGVkVmFsdWUoY29uc3QgV2ViQ29yZTo6VGlsZUluZGV4JiB2YWx1
ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1ZS5pKCkgPT0gc3RkOjpudW1lcmljX2xpbWl0
czx1bnNpZ25lZD46Om1heCgpIC0gMSAmJiB2YWx1ZS5qKCkgPT0gc3RkOjpudW1lcmljX2xpbWl0
czx1bnNpZ25lZD46Om1heCgpIC0gMTsKKyAgICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBXVEYK
KworI2VuZGlmIC8vIExheWVyVGlsZUluZGV4X2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlci5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZXIuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjIwODQzODJlYTNlMTY0MDI5MGExZTk2MGRlNzc5YWRlMzdhNGYwNmUKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVy
VGlsZXIuY3BwCkBAIC0wLDAgKzEsNzUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAy
MDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24s
IEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEw
LTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgIkxheWVyVGlsZXIuaCIKKworI2luY2x1ZGUg
IkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiTGF5ZXJDb21wb3NpdGluZ1RocmVhZC5oIgorI2lu
Y2x1ZGUgIkxheWVyTWVzc2FnZS5oIgorI2luY2x1ZGUgIkxheWVyVGlsZS5oIgorI2luY2x1ZGUg
IkxheWVyV2ViS2l0VGhyZWFkLmgiCisjaW5jbHVkZSAiTmF0aXZlSW1hZ2VTa2lhLmgiCisjaW5j
bHVkZSAiVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQuaCIKKworI2luY2x1ZGUgPEJsYWNr
QmVycnlQbGF0Zm9ybVNjcmVlbi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCit1c2luZyBu
YW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFRoaXMgaXMgdXNlZCB0
byBtYWtlIHRoZSB2aWV3cG9ydCBhcyB1c2VkIGluIHRleHR1cmUgdmlzaWJpbGl0eSBjYWxjdWxh
dGlvbnMKKy8vIHNsaWdodGx5IGxhcmdlciBzbyB0ZXh0dXJlcyBhcmUgdXBsb2FkZWQgYmVmb3Jl
IGJlY29taW5nIHJlYWxseSB2aXNpYmxlLgorY29uc3QgZmxvYXQgdmlld3BvcnRJbmZsYXRpb25G
YWN0b3IgPSAxLjFmOworCisvLyBUaGUgdGlsZU11bHRpcGxpZXIgaW5kaWNhdGVzIGhvdyBtYW55
IHRpbGVzIHdpbGwgZml0IGluIHRoZSBsYXJnZXN0IGRpbWVuc2lvbgorLy8gb2YgdGhlIHNjcmVl
biwgaWYgZHJhd24gdXNpbmcgaWRlbnRpdHkgdHJhbnNmb3JtLgorLy8gV2UgdXNlIGhhbGYgdGhl
IHNjcmVlbiBzaXplIGFzIHRpbGUgc2l6ZSwgdG8gcmVkdWNlIHRoZSB0ZXh0dXJlIHVwbG9hZCB0
aW1lCisvLyBmb3Igc21hbGwgcmVwYWludCByZWN0cy4gQ29tcGFyZWQgdG8gdXNpbmcgc2NyZWVu
IHNpemUgZGlyZWN0bHksIHRoaXMgc2hvdWxkCisvLyBtYWtlIG1vc3Qgc21hbGwgaW52YWxpZGF0
aW9ucyAxNnggZmFzdGVyLCB1bmxlc3MgdGhleSdyZSB1bmZvcnR1bmF0ZSBlbm91Z2gKKy8vIHRv
IGludGVyc2VjdCB0d28gb3IgbW9yZSB0aWxlcywgd2hlcmUgaXQgd291bGQgYmUgOHgtMXggZmFz
dGVyLgorY29uc3QgaW50IHRpbGVNdWx0aXBsaWVyID0gNDsKKworc3RhdGljIHZvaWQgdHJhbnNm
b3JtUG9pbnQoZmxvYXQgeCwgZmxvYXQgeSwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG0s
IGZsb2F0KiByZXN1bHQpCit7CisgICAgLy8gU3F1YXNoIHRoZSBaIGNvb3JkaW5hdGUgc28gdGhh
dCBsYXllcnMgYXJlbid0IGNsaXBwZWQgYWdhaW5zdCB0aGUgbmVhciBhbmQKKyAgICAvLyBmYXIg
cGxhbmUuIE5vdGUgdGhhdCB0aGUgcGVyc3BlY3RpdmUgaXMgbWFpbnRhaW5lZCBhcyB3ZSdyZSBz
dGlsbCBwYXNzaW5nCisgICAgLy8gZG93biB0aGUgVyBjb29yZGluYXRlLgorICAgIHJlc3VsdFsw
XSA9IHggKiBtLm0xMSgpICsgeSAqIG0ubTIxKCkgKyBtLm00MSgpOworICAgIHJlc3VsdFsxXSA9
IHggKiBtLm0xMigpICsgeSAqIG0ubTIyKCkgKyBtLm00MigpOworICAgIHJlc3VsdFsyXSA9IDA7
CisgICAgcmVzdWx0WzNdID0geCAqIG0ubTE0KCkgKyB5ICogbS5tMjQoKSArIG0ubTQ0KCk7Cit9
CisKK0xheWVyVGlsZXI6OkxheWVyVGlsZXIoTGF5ZXJXZWJLaXRUaHJlYWQqIGxheWVyKQorICAg
IDogbV9sYXllcihsYXllcikKKyAgICAsIG1fdGlsaW5nRGlzYWJsZWQoZmFsc2UpCisgICAgLCBt
X2NvbnRlbnRzRGlydHkoZmFsc2UpCisgICAgLCBtX3RpbGVTaXplKGRlZmF1bHRUaWxlU2l6ZSgp
KQorICAgICwgbV9jbGVhclRleHR1cmVKb2JzKGZhbHNlKQorICAgICwgbV9oYXNNaXNzaW5nVGV4
dHVyZXMoZmFsc2UpCisgICAgLCBtX2NvbnRlbnRzU2NhbGUoMC4wKQoreworfQorCitMYXllclRp
bGVyOjp+TGF5ZXJUaWxlcigpCit7CisgICAgLy8gU29tZW9uZSBzaG91bGQgaGF2ZSBjYWxsZWQg
TGF5ZXJUaWxlcjo6ZGVsZXRlVGV4dHVyZXMoKQorICAgIC8vIGJlZm9yZSBub3cuIFdlIGNhbid0
IGNhbGwgaXQgaGVyZSBiZWNhdXNlIHdlIGhhdmUgbm8KKyAgICAvLyBPcGVuR0wgY29udGV4dC4K
KyAgICBBU1NFUlQobV90aWxlc0NvbXBvc2l0aW5nVGhyZWFkLmlzRW1wdHkoKSk7Cit9CisKK3Zv
aWQgTGF5ZXJUaWxlcjo6bGF5ZXJXZWJLaXRUaHJlYWREZXN0cm95ZWQoKQoreworICAgIG1fbGF5
ZXIgPSAwOworfQorCit2b2lkIExheWVyVGlsZXI6OmxheWVyQ29tcG9zaXRpbmdUaHJlYWREZXN0
cm95ZWQoKQoreworICAgIEFTU0VSVChpc0NvbXBvc2l0aW5nVGhyZWFkKCkpOworfQorCit2b2lk
IExheWVyVGlsZXI6OnNldE5lZWRzRGlzcGxheShjb25zdCBGbG9hdFJlY3QmIGRpcnR5UmVjdCkK
K3sKKyAgICBtX2RpcnR5UmVjdC51bml0ZShkaXJ0eVJlY3QpOworICAgIG1fY29udGVudHNEaXJ0
eSA9IHRydWU7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAg
ICBtX2RpcnR5UmVjdC5zZXRMb2NhdGlvbihGbG9hdFBvaW50KCkpOworICAgIG1fZGlydHlSZWN0
LnNldFNpemUobV9sYXllci0+Ym91bmRzKCkpOworICAgIG1fY29udGVudHNEaXJ0eSA9IHRydWU7
Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6dXBkYXRlVGV4dHVyZUNvbnRlbnRzSWZOZWVkZWQoZG91
YmxlIHNjYWxlKQoreworICAgIHVwZGF0ZVRpbGVTaXplKCk7CisKKyAgICBIYXNoU2V0PFRpbGVJ
bmRleD4gcmVuZGVySm9iczsKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX3Jl
bmRlckpvYnNNdXRleCk7CisgICAgICAgIGlmICghbV9jb250ZW50c0RpcnR5ICYmIG1fcmVuZGVy
Sm9icy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHJlbmRlckpvYnMg
PSBtX3JlbmRlckpvYnM7CisgICAgfQorCisgICAgYm9vbCBpc1pvb21Kb2IgPSBmYWxzZTsKKyAg
ICBpZiAoc2NhbGUgIT0gbV9jb250ZW50c1NjYWxlKSB7CisgICAgICAgIC8vIFRoZSBmaXJzdCB0
aW1lIGFyb3VuZCwgaXQgZG9lcyBub3QgY291bnQgYXMgYSB6b29tIGpvYi4KKyAgICAgICAgaWYg
KG1fY29udGVudHNTY2FsZSkKKyAgICAgICAgICAgIGlzWm9vbUpvYiA9IHRydWU7CisgICAgICAg
IG1fY29udGVudHNTY2FsZSA9IHNjYWxlOworICAgIH0KKworICAgIEludFJlY3QgZGlydHlSZWN0
ID0gZW5jbG9zaW5nSW50UmVjdChtX2RpcnR5UmVjdCk7CisgICAgSW50U2l6ZSByZXF1aXJlZFRl
eHR1cmVTaXplOworCisgICAgaWYgKG1fbGF5ZXItPmRyYXdzQ29udGVudCgpKSB7CisgICAgICAg
IC8vIExheWVyIGNvbnRlbnRzIG11c3QgYmUgZHJhd24gaW50byBhIGNhbnZhcy4KKyAgICAgICAg
SW50UmVjdCB1bnRyYW5zZm9ybWVkRGlydHlSZWN0KGRpcnR5UmVjdCk7CisgICAgICAgIEludFJl
Y3QgYm91bmRzUmVjdChJbnRQb2ludDo6emVybygpLCBtX2xheWVyLT5ib3VuZHMoKSk7CisgICAg
ICAgIEludFJlY3QgdW50cmFuc2Zvcm1lZEJvdW5kc1JlY3QoYm91bmRzUmVjdCk7CisgICAgICAg
IHJlcXVpcmVkVGV4dHVyZVNpemUgPSBib3VuZHNSZWN0LnNpemUoKTsKKworICAgICAgICBpZiAo
c2NhbGUgIT0gMS4wKSB7CisgICAgICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtYXRyaXg7
CisgICAgICAgICAgICBtYXRyaXguc2NhbGUoc2NhbGUpOworCisgICAgICAgICAgICBkaXJ0eVJl
Y3QgPSBtYXRyaXgubWFwUmVjdCh1bnRyYW5zZm9ybWVkRGlydHlSZWN0KTsKKyAgICAgICAgICAg
IHJlcXVpcmVkVGV4dHVyZVNpemUgPSBtYXRyaXgubWFwUmVjdChJbnRSZWN0KEludFBvaW50Ojp6
ZXJvKCksIHJlcXVpcmVkVGV4dHVyZVNpemUpKS5zaXplKCk7CisgICAgICAgICAgICBib3VuZHNS
ZWN0ID0gbWF0cml4Lm1hcFJlY3QodW50cmFuc2Zvcm1lZEJvdW5kc1JlY3QpOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKHJlcXVpcmVkVGV4dHVyZVNpemUgIT0gbV9wZW5kaW5nVGV4dHVyZVNp
emUpCisgICAgICAgICAgICBkaXJ0eVJlY3QgPSBib3VuZHNSZWN0OworICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgIC8vIENsaXAgdGhlIGRpcnR5UmVjdCB0byB0aGUgc2l6ZSBvZiB0aGUgbGF5
ZXIgdG8gYXZvaWQgZHJhd2luZworICAgICAgICAgICAgLy8gb3V0c2lkZSB0aGUgYm91bmRzIG9m
IHRoZSBiYWNraW5nIHRleHR1cmUuCisgICAgICAgICAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KGJv
dW5kc1JlY3QpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtX2xheWVyLT5jb250ZW50cygp
KSB7CisgICAgICAgIC8vIExheWVyIGlzIGEgY29udGFpbmVyLCBhbmQgaXQgY29udGFpbnMgYW4g
SW1hZ2UuCisgICAgICAgIHJlcXVpcmVkVGV4dHVyZVNpemUgPSBJbnRTaXplKG1fbGF5ZXItPmNv
bnRlbnRzKCktPndpZHRoKCksIG1fbGF5ZXItPmNvbnRlbnRzKCktPmhlaWdodCgpKTsKKyAgICAg
ICAgZGlydHlSZWN0ID0gSW50UmVjdChJbnRQb2ludCgpLCByZXF1aXJlZFRleHR1cmVTaXplKTsK
KyAgICB9CisKKyAgICAvLyBJZiB3ZSBuZWVkIGRpc3BsYXkgYmVjYXVzZSB3ZSBubyBsb25nZXIg
bmVlZCB0byBiZSBkaXNwbGF5ZWQsIGR1ZSB0byB0ZXh0dXJlIHNpemUgYmVjb21pbmcgMCB4IDAs
CisgICAgLy8gb3IgaWYgd2UncmUgcmUtcmVuZGVyaW5nIHRoZSB3aG9sZSB0aGluZyBhbnl3YXks
IGNsZWFyIG9sZCB0ZXh0dXJlIGpvYnMuCisgICAgSGFzaFNldDxUaWxlSW5kZXg+IGZpbmlzaGVk
Sm9iczsKKyAgICBpZiAocmVxdWlyZWRUZXh0dXJlU2l6ZS5pc0VtcHR5KCkgfHwgZGlydHlSZWN0
ID09IEludFJlY3QoSW50UG9pbnQoKSwgcmVxdWlyZWRUZXh0dXJlU2l6ZSkpIHsKKyAgICAgICAg
eworICAgICAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fcmVuZGVySm9ic011dGV4KTsKKyAg
ICAgICAgICAgIG1fcmVuZGVySm9icy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGNsZWFy
VGV4dHVyZUpvYnMoKTsKKyAgICB9IGVsc2UgaWYgKCFyZW5kZXJKb2JzLmlzRW1wdHkoKSkgewor
ICAgICAgICBpZiAoSW1hZ2UqIGltYWdlID0gbV9sYXllci0+Y29udGVudHMoKSkgeworICAgICAg
ICAgICAgYm9vbCBpc09wYXF1ZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGltYWdlLT5pc0Jp
dG1hcEltYWdlKCkpCisgICAgICAgICAgICAgICAgaXNPcGFxdWUgPSAhc3RhdGljX2Nhc3Q8Qml0
bWFwSW1hZ2UqPihpbWFnZSktPmN1cnJlbnRGcmFtZUhhc0FscGhhKCk7CisgICAgICAgICAgICBp
ZiAoTmF0aXZlSW1hZ2VQdHIgbmF0aXZlSW1hZ2UgPSBpbWFnZS0+bmF0aXZlSW1hZ2VGb3JDdXJy
ZW50RnJhbWUoKSkgeworICAgICAgICAgICAgICAgIFNrQml0bWFwIGJpdG1hcCA9IFNrQml0bWFw
KCpuYXRpdmVJbWFnZSk7CisgICAgICAgICAgICAgICAgYWRkVGV4dHVyZUpvYihUZXh0dXJlSm9i
OjpzZXRDb250ZW50cyhiaXRtYXAsIGlzT3BhcXVlKSk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVyZSBtaWdodCBzdGlsbCBiZSBzb21lIHBlbmRp
bmcgcmVuZGVyIGpvYnMgZHVlIHRvIHZpc2liaWxpdHkgY2hhbmdlcy4KKyAgICAgICAgICAgIGZv
ciAoSGFzaFNldDxUaWxlSW5kZXg+OjppdGVyYXRvciBpdCA9IHJlbmRlckpvYnMuYmVnaW4oKTsg
aXQgIT0gcmVuZGVySm9icy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGpvYiBoYXMgYmVlbiBjYW5jZWxsZWQuCisg
ICAgICAgICAgICAgICAgICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX3JlbmRlckpvYnNNdXRleCk7
CisgICAgICAgICAgICAgICAgICAgIGlmICghbV9yZW5kZXJKb2JzLmNvbnRhaW5zKCppdCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgbV9y
ZW5kZXJKb2JzLnJlbW92ZSgqaXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIEludFJlY3QgdGlsZVJlY3QgPSByZWN0Rm9yVGlsZSgqaXQsIHJlcXVpcmVkVGV4dHVyZVNp
emUpOworICAgICAgICAgICAgICAgIGlmICh0aWxlUmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgYm9vbCBpc1NvbGlkQ29sb3Ig
PSBmYWxzZTsKKyAgICAgICAgICAgICAgICBDb2xvciBjb2xvcjsKKyAgICAgICAgICAgICAgICBT
a0JpdG1hcCBiaXRtYXAgPSBtX2xheWVyLT5wYWludENvbnRlbnRzKHRpbGVSZWN0LCBzY2FsZSwg
JmlzU29saWRDb2xvciwgJmNvbG9yKTsKKyAgICAgICAgICAgICAgICAvLyBiaXRtYXAgY2FuIGJl
IG51bGwgaGVyZS4gTWFrZSByZXF1aXJlZFRleHR1cmVTaXplIGVtcHR5IHNvIHRoYXQgd2UKKyAg
ICAgICAgICAgICAgICAvLyB3aWxsIG5vdCB0cnkgdG8gdXBkYXRlIGFuZCBkcmF3IHRoZSBsYXll
ci4KKyAgICAgICAgICAgICAgICBpZiAoIWJpdG1hcC5pc051bGwoKSkgeworICAgICAgICAgICAg
ICAgICAgICBpZiAoaXNTb2xpZENvbG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkVGV4
dHVyZUpvYihUZXh0dXJlSm9iOjpzZXRDb250ZW50c1RvQ29sb3IoY29sb3IsICppdCkpOworICAg
ICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRUZXh0dXJl
Sm9iKFRleHR1cmVKb2I6OnVwZGF0ZUNvbnRlbnRzKGJpdG1hcCwgdGlsZVJlY3QpKTsKKyAgICAg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5pc2hlZEpvYnMuYWRkKCppdCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGRpZFJlc2l6ZSA9IGZh
bHNlOworICAgIGlmIChtX3BlbmRpbmdUZXh0dXJlU2l6ZSAhPSByZXF1aXJlZFRleHR1cmVTaXpl
KSB7CisgICAgICAgIGRpZFJlc2l6ZSA9IHRydWU7CisgICAgICAgIG1fcGVuZGluZ1RleHR1cmVT
aXplID0gcmVxdWlyZWRUZXh0dXJlU2l6ZTsKKyAgICAgICAgYWRkVGV4dHVyZUpvYihUZXh0dXJl
Sm9iOjpyZXNpemVDb250ZW50cyhtX3BlbmRpbmdUZXh0dXJlU2l6ZSkpOworICAgIH0KKyAgICBt
X2NvbnRlbnRzRGlydHkgPSBmYWxzZTsKKyAgICBtX2RpcnR5UmVjdCA9IEZsb2F0UmVjdCgpOwor
CisgICAgaWYgKGRpcnR5UmVjdC5pc0VtcHR5KCkgfHwgcmVxdWlyZWRUZXh0dXJlU2l6ZS5pc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChJbWFnZSogaW1hZ2UgPSBtX2xheWVy
LT5jb250ZW50cygpKSB7CisgICAgICAgIGJvb2wgaXNPcGFxdWUgPSBmYWxzZTsKKyAgICAgICAg
aWYgKGltYWdlLT5pc0JpdG1hcEltYWdlKCkpCisgICAgICAgICAgICBpc09wYXF1ZSA9ICFzdGF0
aWNfY2FzdDxCaXRtYXBJbWFnZSo+KGltYWdlKS0+Y3VycmVudEZyYW1lSGFzQWxwaGEoKTsKKyAg
ICAgICAgLy8gTm8gcG9pbnQgaW4gdGlsaW5nIGFuIGltYWdlIGxheWVyLCB0aGUgaW1hZ2UgaXMg
YWxyZWFkeSBzdG9yZWQgYXMgYW4gU2tCaXRtYXAKKyAgICAgICAgTmF0aXZlSW1hZ2VQdHIgbmF0
aXZlSW1hZ2UgPSBtX2xheWVyLT5jb250ZW50cygpLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFt
ZSgpOworICAgICAgICBpZiAobmF0aXZlSW1hZ2UpIHsKKyAgICAgICAgICAgIFNrQml0bWFwIGJp
dG1hcCA9IFNrQml0bWFwKCpuYXRpdmVJbWFnZSk7CisgICAgICAgICAgICBhZGRUZXh0dXJlSm9i
KFRleHR1cmVKb2I6OnNldENvbnRlbnRzKGJpdG1hcCwgaXNPcGFxdWUpKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSW50UG9pbnQgdG9wTGVmdCA9IGRpcnR5UmVj
dC5taW5YTWluWUNvcm5lcigpOworICAgIEludFBvaW50IGJvdHRvbVJpZ2h0ID0gZGlydHlSZWN0
Lm1heFhNYXhZQ29ybmVyKCk7IC8vIFRoaXMgaXMgYWN0dWFsbHkgYSBwaXhlbCBiZWxvdyBhbmQg
dG8gdGhlIHJpZ2h0IG9mIHRoZSBkaXJ0eVJlY3QuCisKKyAgICBJbnRTaXplIHRpbGVNYXhpbXVt
U2l6ZSA9IHRpbGVTaXplKCk7CisgICAgYm9vbCB3YXNPbmVUaWxlID0gbV90aWxlc1dlYktpdFRo
cmVhZC5zaXplKCkgPT0gMTsKKyAgICBib29sIGlzT25lVGlsZSA9IG1fcGVuZGluZ1RleHR1cmVT
aXplLndpZHRoKCkgPD0gdGlsZU1heGltdW1TaXplLndpZHRoKCkgJiYgbV9wZW5kaW5nVGV4dHVy
ZVNpemUuaGVpZ2h0KCkgPD0gdGlsZU1heGltdW1TaXplLmhlaWdodCgpOworICAgIEludFBvaW50
IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShpbmRleE9mVGlsZSh0b3BMZWZ0KSk7CisgICAgSW50UmVj
dCB0aWxlUmVjdDsKKyAgICBmb3IgKHRpbGVSZWN0LnNldFgob3JpZ2luLngoKSk7IHRpbGVSZWN0
LngoKSA8IGJvdHRvbVJpZ2h0LngoKTsgdGlsZVJlY3Quc2V0WCh0aWxlUmVjdC54KCkgKyB0aWxl
TWF4aW11bVNpemUud2lkdGgoKSkpIHsKKyAgICAgICAgZm9yICh0aWxlUmVjdC5zZXRZKG9yaWdp
bi55KCkpOyB0aWxlUmVjdC55KCkgPCBib3R0b21SaWdodC55KCk7IHRpbGVSZWN0LnNldFkodGls
ZVJlY3QueSgpICsgdGlsZU1heGltdW1TaXplLmhlaWdodCgpKSkgeworICAgICAgICAgICAgdGls
ZVJlY3Quc2V0V2lkdGgobWluKHJlcXVpcmVkVGV4dHVyZVNpemUud2lkdGgoKSAtIHRpbGVSZWN0
LngoKSwgdGlsZU1heGltdW1TaXplLndpZHRoKCkpKTsKKyAgICAgICAgICAgIHRpbGVSZWN0LnNl
dEhlaWdodChtaW4ocmVxdWlyZWRUZXh0dXJlU2l6ZS5oZWlnaHQoKSAtIHRpbGVSZWN0LnkoKSwg
dGlsZU1heGltdW1TaXplLmhlaWdodCgpKSk7CisKKyAgICAgICAgICAgIEludFJlY3QgbG9jYWxE
aXJ0eVJlY3QoZGlydHlSZWN0KTsKKyAgICAgICAgICAgIGxvY2FsRGlydHlSZWN0LmludGVyc2Vj
dCh0aWxlUmVjdCk7CisgICAgICAgICAgICBpZiAobG9jYWxEaXJ0eVJlY3QuaXNFbXB0eSgpKQor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBUaWxlSW5kZXggaW5kZXgg
PSBpbmRleE9mVGlsZSh0aWxlUmVjdC5sb2NhdGlvbigpKTsKKworICAgICAgICAgICAgLy8gSWYg
d2UgYWxyZWFkeSBkaWQgdGhpcyBhcyBwYXJ0IG9mIG9uZSBvZiB0aGUgcmVuZGVyIGpvYnMgZHVl
IHRvCisgICAgICAgICAgICAvLyB2aXNpYmlsaXR5IGNoYW5nZXMsIGRvbid0IHJlbmRlciB0aGF0
IHRpbGUgYWdhaW4uCisgICAgICAgICAgICBpZiAoZmluaXNoZWRKb2JzLmNvbnRhaW5zKGluZGV4
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKCFzaG91bGRQ
ZXJmb3JtUmVuZGVySm9iKGluZGV4LCAhaXNab29tSm9iKSkgeworICAgICAgICAgICAgICAgIC8v
IEF2b2lkIGNoZWNrZXJib2FyZGluZyB1bmxlc3MgdGhlIGxheWVyIGlzIHJlc2l6ZWQuIFdoZW4K
KyAgICAgICAgICAgICAgICAvLyByZXNpemVkLCB0aGUgY29udGVudHMgYXJlIGxpa2VseSB0byBj
aGFuZ2UgYXBwZWFyYW5jZSwgZm9yCisgICAgICAgICAgICAgICAgLy8gZXhhbXBsZSBkdWUgdG8g
YXNwZWN0IHJhdGlvIGNoYW5nZS4gSG93ZXZlciwgaWYgaXQgaXMgYQorICAgICAgICAgICAgICAg
IC8vIHJlc2l6ZSBkdWUgdG8gem9vbWluZywgdGhlIGFzcGVjdCByYXRpbyBhbmQgY29udGVudCB3
aWxsCisgICAgICAgICAgICAgICAgLy8gc3RheSB0aGUgc2FtZSwgYW5kIHdlIGNhbiBrZWVwIHRo
ZSBvbGQgdGV4dHVyZSBjb250ZW50IGFzIGEKKyAgICAgICAgICAgICAgICAvLyBwcmV2aWV3Lgor
ICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGUgem9vbSBwcmV2aWV3IG9ubHkgd29ya3MgaWYg
d2UgZG9uJ3QgcmUtdGlsZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBsYXllci4gV2UgbmVlZCB0
byBzdG9yZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIGluCisgICAgICAgICAgICAgICAgLy8gV2ViQ29y
ZTo6VGV4dHVyZSB0byBiZSBhYmxlIHRvIGZpeCB0aGF0LgorICAgICAgICAgICAgICAgIGlmIChk
aWRSZXNpemUgJiYgIShpc1pvb21Kb2IgJiYgd2FzT25lVGlsZSAmJiBpc09uZVRpbGUpKQorICAg
ICAgICAgICAgICAgICAgICBhZGRUZXh0dXJlSm9iKFRleHR1cmVKb2I6OmRpc2NhcmRDb250ZW50
cyh0aWxlUmVjdCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
YWRkVGV4dHVyZUpvYihUZXh0dXJlSm9iOjpkaXJ0eUNvbnRlbnRzKHRpbGVSZWN0KSk7CisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEp1
c3QgaW4gY2FzZSBhIG5ldyBqb2IgZm9yIHRoaXMgdGlsZSBoYXMganVzdCBiZWVuIGluc2VydGVk
IGJ5IGNvbXBvc2l0aW5nIHRocmVhZC4KKyAgICAgICAgICAgIHJlbW92ZVJlbmRlckpvYihpbmRl
eCk7CisKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBhcmUgYWx3YXlzIGRyYXdpbmcgd2hvbGUg
dGlsZXMgYXQgdGhlIG1vbWVudCwgYmVjYXVzZQorICAgICAgICAgICAgLy8gd2UgY3VycmVudGx5
IGNhbid0IGtlZXAgdHJhY2sgb2Ygd2hpY2ggcGFydCBvZiBhIHRpbGUgaXMKKyAgICAgICAgICAg
IC8vIHJlbmRlcmVkIGFuZCB3aGljaCBpcyBub3QuIFNlbmRpbmcgb25seSBhIHN1YnJlY3Rhbmds
ZSBvZiBhIHRpbGUKKyAgICAgICAgICAgIC8vIHRvIHRoZSBjb21wb3NpdGluZyB0aHJlYWQgbWln
aHQgY2F1c2UgaXQgdG8gYmUgdXBsb2FkZWQgdXNpbmcKKyAgICAgICAgICAgIC8vIGdsVGV4SW1h
Z2UsIGlmIHRoZSB0ZXh0dXJlIHdhcyBwcmV2aW91c2x5IGV2aWN0ZWQgZnJvbSB0aGUgY2FjaGUu
CisgICAgICAgICAgICAvLyBUaGUgcmVzdWx0IHdvdWxkIGJlIHRoYXQgYSBzdWJyZWN0YW5nbGUg
b2YgdGhlIHRpbGUgd2FzIHN0cmV0Y2hlZAorICAgICAgICAgICAgLy8gdG8gZml0IHRoZSB0aWxl
IGdlb21ldHJ5LCBhcHBlYXJpbmcgYXMgYSBnbGFyaW5nIG1pc3JlbmRlcmluZyBvZgorICAgICAg
ICAgICAgLy8gdGhlIHdlYiBwYWdlLgorICAgICAgICAgICAgYm9vbCBpc1NvbGlkQ29sb3IgPSBm
YWxzZTsKKyAgICAgICAgICAgIENvbG9yIGNvbG9yOworICAgICAgICAgICAgU2tCaXRtYXAgYml0
bWFwID0gbV9sYXllci0+cGFpbnRDb250ZW50cyh0aWxlUmVjdCwgc2NhbGUsICZpc1NvbGlkQ29s
b3IsICZjb2xvcik7CisgICAgICAgICAgICAvLyBiaXRtYXAgY2FuIGJlIG51bGwgaGVyZS4gTWFr
ZSByZXF1aXJlZFRleHR1cmVTaXplIGVtcHR5IHNvIHRoYXQgd2UKKyAgICAgICAgICAgIC8vIHdp
bGwgbm90IHRyeSB0byB1cGRhdGUgYW5kIGRyYXcgdGhlIGxheWVyLgorICAgICAgICAgICAgaWYg
KCFiaXRtYXAuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNTb2xpZENvbG9yKQor
ICAgICAgICAgICAgICAgICAgICBhZGRUZXh0dXJlSm9iKFRleHR1cmVKb2I6OnNldENvbnRlbnRz
VG9Db2xvcihjb2xvciwgaW5kZXgpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgICAgIGFkZFRleHR1cmVKb2IoVGV4dHVyZUpvYjo6dXBkYXRlQ29udGVudHMoYml0bWFw
LCB0aWxlUmVjdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitib29s
IExheWVyVGlsZXI6OnNob3VsZFBlcmZvcm1SZW5kZXJKb2IoY29uc3QgVGlsZUluZGV4JiBpbmRl
eCwgYm9vbCBhbGxvd1ByZWZpbGwpCit7CisgICAgLy8gSWYgdGhlIHZpc2liaWxpdHkgaW5mb3Jt
YXRpb24gd2FzIHByb3BhZ2F0ZWQgZnJvbSB0aGUgY29tcG9zaXRpbmcKKyAgICAvLyB0aHJlYWQs
IHVzZSB0aGF0IGluZm9ybWF0aW9uLgorICAgIC8vIEhvd2V2ZXIsIHdlIGFyZSBhYm91dCB0byBj
b21taXQgbmV3IGxheWVyIHByb3BlcnRpZXMgdGhhdCBtYXkgbWFrZQorICAgIC8vIGN1cnJlbnRs
eSBoaWRkZW4gbGF5ZXJzIHZpc2libGUuIFRvIGF2b2lkIGZhbHNlIG5lZ2F0aXZlcywgd2Ugb25s
eSBhbGxvdworICAgIC8vIHRoZSBjdXJyZW50IHN0YXRlIHRvIGJlIHVzZWQgdG8gYWNjZXB0IHJl
bmRlciBqb2JzLCBub3QgdG8gcmVqZWN0IHRoZW0uCisgICAgaWYgKG1fdGlsZXNXZWJLaXRUaHJl
YWQuZ2V0KGluZGV4KS5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAv
LyBUaWxlcyB0aGF0IGFyZSBub3QgY3VycmVudGx5IHZpc2libGUgb24gdGhlIGNvbXBvc2l0aW5n
IHRocmVhZCBtYXkgc3RpbGwKKyAgICAvLyBkZXNlcnZlIHRvIGJlIHJlbmRlcmVkIGlmIHRoZXkg
c2hvdWxkIGJlIHByZWZpbGxlZC4uLgorICAgIGlmIChhbGxvd1ByZWZpbGwgJiYgIW1fdGlsZXNX
ZWJLaXRUaHJlYWQuY29udGFpbnMoaW5kZXgpICYmIHNob3VsZFByZWZpbGxUaWxlKGluZGV4KSkK
KyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBPciBpZiB0aGV5IGFyZSB2aXNpYmxlIGFj
Y29yZGluZyB0byB0aGUgc3RhdGUgdGhhdCdzIGFib3V0IHRvIGJlCisgICAgLy8gY29tbWl0dGVk
LiBXZSBkbyBhIHZpc2liaWxpdHkgdGVzdCB1c2luZyB0aGUgY3VycmVudCB0cmFuc2Zvcm0gc3Rh
dGUuCisgICAgSW50UmVjdCBjb250ZW50UmVjdCA9IHJlY3RGb3JUaWxlKGluZGV4LCBtX3BlbmRp
bmdUZXh0dXJlU2l6ZSk7CisgICAgcmV0dXJuIG1fbGF5ZXItPmNvbnRlbnRzVmlzaWJsZShjb250
ZW50UmVjdCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6YWRkVGV4dHVyZUpvYihjb25zdCBUZXh0
dXJlSm9iJiBqb2IpCit7CisgICAgbV9wZW5kaW5nVGV4dHVyZUpvYnMuYXBwZW5kKGpvYik7Cit9
CisKK3ZvaWQgTGF5ZXJUaWxlcjo6Y2xlYXJUZXh0dXJlSm9icygpCit7CisgICAgLy8gQ2xlYXIg
YW55IGNvbW1pdHRlZCB0ZXh0dXJlIGpvYnMgb24gbmV4dCBpbnZvY2F0aW9uIG9mIExheWVyVGls
ZXI6OmNvbW1pdFBlbmRpbmdUZXh0dXJlVXBsb2FkcygpLgorICAgIG1fY2xlYXJUZXh0dXJlSm9i
cyA9IHRydWU7CisKKyAgICByZW1vdmVVcGRhdGVDb250ZW50c0pvYnMobV9wZW5kaW5nVGV4dHVy
ZUpvYnMpOworfQorCit2b2lkIExheWVyVGlsZXI6OmNvbW1pdFBlbmRpbmdUZXh0dXJlVXBsb2Fk
cygpCit7CisgICAgaWYgKG1fY2xlYXJUZXh0dXJlSm9icykgeworICAgICAgICByZW1vdmVVcGRh
dGVDb250ZW50c0pvYnMobV90ZXh0dXJlSm9icyk7CisgICAgICAgIG1fY2xlYXJUZXh0dXJlSm9i
cyA9IGZhbHNlOworICAgIH0KKworICAgIGZvciAoVmVjdG9yPFRleHR1cmVKb2I+OjppdGVyYXRv
ciBpdCA9IG1fcGVuZGluZ1RleHR1cmVKb2JzLmJlZ2luKCk7IGl0ICE9IG1fcGVuZGluZ1RleHR1
cmVKb2JzLmVuZCgpOyArK2l0KQorICAgICAgICBtX3RleHR1cmVKb2JzLmFwcGVuZCgqaXQpOwor
ICAgIG1fcGVuZGluZ1RleHR1cmVKb2JzLmNsZWFyKCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6
bGF5ZXJWaXNpYmlsaXR5Q2hhbmdlZChib29sIHZpc2libGUpCit7CisgICAgLy8gRm9yIHZpc2li
bGUgbGF5ZXJzLCB3ZSBoYW5kbGUgdGhlIHRpbGUtbGV2ZWwgdmlzaWJpbGl0eQorICAgIC8vIGlu
IHRoZSBkcmF3IGxvb3AsIHNlZSBMYXllclRpbGVyOjpkcmF3VGV4dHVyZXMoKS4KKyAgICBpZiAo
dmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgeworICAgICAgICAvLyBBbGwgdGlsZXMg
YXJlIGludmlzaWJsZSBub3cuCisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX3JlbmRlckpv
YnNNdXRleCk7CisgICAgICAgIG1fcmVuZGVySm9icy5jbGVhcigpOworICAgIH0KKworICAgIGZv
ciAoVGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuYmVnaW4o
KTsgaXQgIT0gbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFkLmVuZCgpOyArK2l0KSB7CisgICAgICAg
IFRpbGVJbmRleCBpbmRleCA9ICgqaXQpLmZpcnN0OworICAgICAgICBMYXllclRpbGUqIHRpbGUg
PSAoKml0KS5zZWNvbmQ7CisgICAgICAgIHRpbGUtPnNldFZpc2libGUoZmFsc2UpOworICAgIH0K
K30KKwordm9pZCBMYXllclRpbGVyOjp1cGxvYWRUZXh0dXJlc0lmTmVlZGVkKCkKK3sKKyAgICBU
aWxlSm9ic01hcCB0aWxlSm9ic01hcDsKKyAgICBEZXF1ZTxUZXh0dXJlSm9iPjo6Y29uc3RfaXRl
cmF0b3IgdGV4dHVyZUpvYkl0ZXJFbmQgPSBtX3RleHR1cmVKb2JzLmVuZCgpOworICAgIGZvciAo
RGVxdWU8VGV4dHVyZUpvYj46OmNvbnN0X2l0ZXJhdG9yIHRleHR1cmVKb2JJdGVyID0gbV90ZXh0
dXJlSm9icy5iZWdpbigpOyB0ZXh0dXJlSm9iSXRlciAhPSB0ZXh0dXJlSm9iSXRlckVuZDsgKyt0
ZXh0dXJlSm9iSXRlcikKKyAgICAgICAgcHJvY2Vzc1RleHR1cmVKb2IoKnRleHR1cmVKb2JJdGVy
LCB0aWxlSm9ic01hcCk7CisKKyAgICBUaWxlSm9ic01hcDo6Y29uc3RfaXRlcmF0b3IgdGlsZUpv
YnNJdGVyRW5kID0gdGlsZUpvYnNNYXAuZW5kKCk7CisgICAgZm9yIChUaWxlSm9ic01hcDo6Y29u
c3RfaXRlcmF0b3IgdGlsZUpvYnNJdGVyID0gdGlsZUpvYnNNYXAuYmVnaW4oKTsgdGlsZUpvYnNJ
dGVyICE9IHRpbGVKb2JzSXRlckVuZDsgKyt0aWxlSm9ic0l0ZXIpIHsKKyAgICAgICAgSW50UG9p
bnQgb3JpZ2luID0gb3JpZ2luT2ZUaWxlKHRpbGVKb2JzSXRlci0+Zmlyc3QpOworCisgICAgICAg
IExheWVyVGlsZSogdGlsZSA9IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5nZXQodGlsZUpvYnNJ
dGVyLT5maXJzdCk7CisgICAgICAgIGlmICghdGlsZSkgeworICAgICAgICAgICAgaWYgKG9yaWdp
bi54KCkgPj0gbV9yZXF1aXJlZFRleHR1cmVTaXplLndpZHRoKCkgfHwgb3JpZ2luLnkoKSA+PSBt
X3JlcXVpcmVkVGV4dHVyZVNpemUuaGVpZ2h0KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICB0aWxlID0gbmV3IExheWVyVGlsZSgpOworICAgICAgICAgICAgbV90aWxl
c0NvbXBvc2l0aW5nVGhyZWFkLmFkZCh0aWxlSm9ic0l0ZXItPmZpcnN0LCB0aWxlKTsKKyAgICAg
ICAgfQorCisgICAgICAgIEludFJlY3QgdGlsZVJlY3Qob3JpZ2luLCB0aWxlU2l6ZSgpKTsKKyAg
ICAgICAgdGlsZVJlY3Quc2V0V2lkdGgobWluKG1fcmVxdWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgp
IC0gdGlsZVJlY3QueCgpLCB0aWxlUmVjdC53aWR0aCgpKSk7CisgICAgICAgIHRpbGVSZWN0LnNl
dEhlaWdodChtaW4obV9yZXF1aXJlZFRleHR1cmVTaXplLmhlaWdodCgpIC0gdGlsZVJlY3QueSgp
LCB0aWxlUmVjdC5oZWlnaHQoKSkpOworCisgICAgICAgIHBlcmZvcm1UaWxlSm9iKHRpbGUsICp0
aWxlSm9ic0l0ZXItPnNlY29uZCwgdGlsZVJlY3QpOworICAgIH0KKworICAgIG1fdGV4dHVyZUpv
YnMuY2xlYXIoKTsKK30KKwordm9pZCBMYXllclRpbGVyOjpwcm9jZXNzVGV4dHVyZUpvYihjb25z
dCBUZXh0dXJlSm9iJiBqb2IsIFRpbGVKb2JzTWFwJiB0aWxlSm9ic01hcCkKK3sKKyAgICBpZiAo
am9iLnR5cGUgPT0gVGV4dHVyZUpvYjo6UmVzaXplQ29udGVudHMpIHsKKyAgICAgICAgSW50U2l6
ZSBwZW5kaW5nVGV4dHVyZVNpemUgPSBqb2IuZGlydHlSZWN0LnNpemUoKTsKKyAgICAgICAgaWYg
KHBlbmRpbmdUZXh0dXJlU2l6ZS53aWR0aCgpIDwgbV9yZXF1aXJlZFRleHR1cmVTaXplLndpZHRo
KCkgfHwgcGVuZGluZ1RleHR1cmVTaXplLmhlaWdodCgpIDwgbV9yZXF1aXJlZFRleHR1cmVTaXpl
LmhlaWdodCgpKQorICAgICAgICAgICAgcHJ1bmVUZXh0dXJlcygpOworCisgICAgICAgIG1fcmVx
dWlyZWRUZXh0dXJlU2l6ZSA9IHBlbmRpbmdUZXh0dXJlU2l6ZTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIGlmIChqb2IudHlwZSA9PSBUZXh0dXJlSm9iOjpTZXRDb250ZW50c1RvQ29s
b3IpIHsKKyAgICAgICAgYWRkVGlsZUpvYihqb2IuaW5kZXgsIGpvYiwgdGlsZUpvYnNNYXApOwor
ICAgICAgICByZXR1cm47CisgICAgIH0KKworICAgIEludFNpemUgdGlsZU1heGltdW1TaXplID0g
dGlsZVNpemUoKTsKKyAgICBJbnRQb2ludCB0b3BMZWZ0ID0gam9iLmRpcnR5UmVjdC5taW5YTWlu
WUNvcm5lcigpOworICAgIEludFBvaW50IGJvdHRvbVJpZ2h0ID0gam9iLmRpcnR5UmVjdC5tYXhY
TWF4WUNvcm5lcigpOyAvLyBUaGlzIGlzIGFjdHVhbGx5IGEgcGl4ZWwgYmVsb3cgYW5kIHRvIHRo
ZSByaWdodCBvZiB0aGUgZGlydHlSZWN0LgorICAgIEludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9m
VGlsZShpbmRleE9mVGlsZSh0b3BMZWZ0KSk7CisgICAgSW50UmVjdCB0aWxlUmVjdDsKKyAgICBm
b3IgKHRpbGVSZWN0LnNldFgob3JpZ2luLngoKSk7IHRpbGVSZWN0LngoKSA8IGJvdHRvbVJpZ2h0
LngoKTsgdGlsZVJlY3Quc2V0WCh0aWxlUmVjdC54KCkgKyB0aWxlTWF4aW11bVNpemUud2lkdGgo
KSkpIHsKKyAgICAgICAgZm9yICh0aWxlUmVjdC5zZXRZKG9yaWdpbi55KCkpOyB0aWxlUmVjdC55
KCkgPCBib3R0b21SaWdodC55KCk7IHRpbGVSZWN0LnNldFkodGlsZVJlY3QueSgpICsgdGlsZU1h
eGltdW1TaXplLmhlaWdodCgpKSkKKyAgICAgICAgICAgIGFkZFRpbGVKb2IoaW5kZXhPZlRpbGUo
dGlsZVJlY3QubG9jYXRpb24oKSksIGpvYiwgdGlsZUpvYnNNYXApOworICAgIH0KK30KKwordm9p
ZCBMYXllclRpbGVyOjphZGRUaWxlSm9iKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIGNvbnN0IFRl
eHR1cmVKb2ImIGpvYiwgVGlsZUpvYnNNYXAmIHRpbGVKb2JzTWFwKQoreworICAgIC8vIEhhc2hN
YXA6OmFkZCBhbHdheXMgcmV0dXJucyBhIHZhbGlkIGl0ZXJhdG9yIGV2ZW4gdGhlIGtleSBhbHJl
YWR5IGV4aXN0cy4KKyAgICBwYWlyPFRpbGVKb2JzTWFwOjppdGVyYXRvciwgYm9vbD4gcmVzdWx0
ID0gdGlsZUpvYnNNYXAuYWRkKGluZGV4LCAmam9iKTsKKworICAgIGlmIChyZXN1bHQuc2Vjb25k
KSB7CisgICAgICAgIC8vIFN1Y2Nlc3NmdWxseSBhZGRlZCB0aGUgbmV3IGpvYi4KKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGlmIChqb2IudHlwZSA9PSBUZXh0dXJlSm9iOjpEaXJ0eUNv
bnRlbnRzICYmIHJlc3VsdC5maXJzdC0+c2Vjb25kLT50eXBlID09IFRleHR1cmVKb2I6OkRpc2Nh
cmRDb250ZW50cykgeworICAgICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgbGVhdmUgdGhlIHByZXZp
b3VzIGpvYi4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE92ZXJyaWRlIHRoZSBw
cmV2aW91cyBqb2IuCisgICAgcmVzdWx0LmZpcnN0LT5zZWNvbmQgPSAmam9iOworfQorCit2b2lk
IExheWVyVGlsZXI6OnBlcmZvcm1UaWxlSm9iKExheWVyVGlsZSogdGlsZSwgY29uc3QgVGV4dHVy
ZUpvYiYgam9iLCBjb25zdCBJbnRSZWN0JiB0aWxlUmVjdCkKK3sKKyAgICBzd2l0Y2ggKGpvYi50
eXBlKSB7CisgICAgY2FzZSBUZXh0dXJlSm9iOjpTZXRDb250ZW50c1RvQ29sb3I6CisgICAgICAg
IHRpbGUtPnNldENvbnRlbnRzVG9Db2xvcihqb2IuY29sb3IpOworICAgICAgICByZXR1cm47Cisg
ICAgY2FzZSBUZXh0dXJlSm9iOjpTZXRDb250ZW50czoKKyAgICAgICAgdGlsZS0+c2V0Q29udGVu
dHMoam9iLmNvbnRlbnRzLCB0aWxlUmVjdCwgaW5kZXhPZlRpbGUodGlsZVJlY3QubG9jYXRpb24o
KSksIGpvYi5pc09wYXF1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFRleHR1cmVKb2I6
OlVwZGF0ZUNvbnRlbnRzOgorICAgICAgICB0aWxlLT51cGRhdGVDb250ZW50cyhqb2IuY29udGVu
dHMsIGpvYi5kaXJ0eVJlY3QsIHRpbGVSZWN0KTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2Ug
VGV4dHVyZUpvYjo6RGlzY2FyZENvbnRlbnRzOgorICAgICAgICB0aWxlLT5kaXNjYXJkQ29udGVu
dHMoKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVGV4dHVyZUpvYjo6RGlydHlDb250ZW50
czoKKyAgICAgICAgdGlsZS0+c2V0Q29udGVudHNEaXJ0eSgpOworICAgICAgICByZXR1cm47Cisg
ICAgY2FzZSBUZXh0dXJlSm9iOjpVbmtub3duOgorICAgIGNhc2UgVGV4dHVyZUpvYjo6UmVzaXpl
Q29udGVudHM6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm47
CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit2b2lkIExheWVyVGlsZXI6
OmRyYXdUZXh0dXJlcyhMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllciwgaW50IHBvcywgaW50
IHRleENvb3JkKQoreworICAgIGRyYXdUZXh0dXJlc0ludGVybmFsKGxheWVyLCBwb3MsIHRleENv
b3JkLCBmYWxzZSAvKiBkcmF3TWlzc2luZyAqLyk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6ZHJh
d01pc3NpbmdUZXh0dXJlcyhMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllciwgaW50IHBvcywg
aW50IHRleENvb3JkKQoreworICAgIGRyYXdUZXh0dXJlc0ludGVybmFsKGxheWVyLCBwb3MsIHRl
eENvb3JkLCB0cnVlIC8qIGRyYXdNaXNzaW5nICovKTsKK30KKwordm9pZCBMYXllclRpbGVyOjpk
cmF3VGV4dHVyZXNJbnRlcm5hbChMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllciwgaW50IHBv
c2l0aW9uTG9jYXRpb24sIGludCB0ZXhDb29yZExvY2F0aW9uLCBib29sIGRyYXdNaXNzaW5nKQor
eworICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBkcmF3VHJhbnNmb3JtID0gbGF5ZXIt
PmRyYXdUcmFuc2Zvcm0oKTsKKyAgICBJbnRTaXplIGJvdW5kcyA9IGxheWVyLT5ib3VuZHMoKTsK
KworICAgIGZsb2F0IHRleGNvb3Jkc1s0ICogMl0gPSB7IDAsIDAsICAwLCAxLCAgMSwgMSwgIDEs
IDAgfTsKKyAgICBmbG9hdCB2ZXJ0aWNlc1s0ICogNF07CisKKyAgICBnbFZlcnRleEF0dHJpYlBv
aW50ZXIocG9zaXRpb25Mb2NhdGlvbiwgNCwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCB2ZXJ0aWNl
cyk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3JkTG9jYXRpb24sIDIsIEdMX0ZM
T0FULCBHTF9GQUxTRSwgMCwgdGV4Y29vcmRzKTsKKworICAgIG1faGFzTWlzc2luZ1RleHR1cmVz
ID0gZmFsc2U7CisKKyAgICBpbnQgbWF4dyA9IHRpbGVTaXplKCkud2lkdGgoKTsKKyAgICBpbnQg
bWF4aCA9IHRpbGVTaXplKCkuaGVpZ2h0KCk7CisgICAgZmxvYXQgc3ggPSBzdGF0aWNfY2FzdDxm
bG9hdD4oYm91bmRzLndpZHRoKCkpIC8gbV9yZXF1aXJlZFRleHR1cmVTaXplLndpZHRoKCk7Cisg
ICAgZmxvYXQgc3kgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYm91bmRzLmhlaWdodCgpKSAvIG1fcmVx
dWlyZWRUZXh0dXJlU2l6ZS5oZWlnaHQoKTsKKworICAgIGJvb2wgbmVlZHNEaXNwbGF5ID0gZmFs
c2U7CisKKyAgICBib29sIGJsZW5kaW5nID0gIWRyYXdNaXNzaW5nOworCisgICAgSW50UmVjdCB0
aWxlUmVjdDsKKyAgICBmb3IgKHRpbGVSZWN0LnNldFgoMCk7IHRpbGVSZWN0LngoKSA8IG1fcmVx
dWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgpOyB0aWxlUmVjdC5zZXRYKHRpbGVSZWN0LngoKSArIG1h
eHcpKSB7CisgICAgICAgIGZvciAodGlsZVJlY3Quc2V0WSgwKTsgdGlsZVJlY3QueSgpIDwgbV9y
ZXF1aXJlZFRleHR1cmVTaXplLmhlaWdodCgpOyB0aWxlUmVjdC5zZXRZKHRpbGVSZWN0LnkoKSAr
IG1heGgpKSB7CisgICAgICAgICAgICBUaWxlSW5kZXggaW5kZXggPSBpbmRleE9mVGlsZSh0aWxl
UmVjdC5sb2NhdGlvbigpKTsKKyAgICAgICAgICAgIExheWVyVGlsZSogdGlsZSA9IG1fdGlsZXND
b21wb3NpdGluZ1RocmVhZC5nZXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKCF0aWxlKSB7Cisg
ICAgICAgICAgICAgICAgdGlsZSA9IG5ldyBMYXllclRpbGUoKTsKKyAgICAgICAgICAgICAgICBt
X3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuYWRkKGluZGV4LCB0aWxlKTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgZmxvYXQgeCA9IGluZGV4LmkoKSAqIG1heHcgKiBzeDsKKyAgICAgICAg
ICAgIGZsb2F0IHkgPSBpbmRleC5qKCkgKiBtYXhoICogc3k7CisgICAgICAgICAgICBmbG9hdCB3
ID0gbWluKGJvdW5kcy53aWR0aCgpIC0geCwgbWF4dyAqIHN4KTsKKyAgICAgICAgICAgIGZsb2F0
IGggPSBtaW4oYm91bmRzLmhlaWdodCgpIC0geSwgbWF4aCAqIHN5KTsKKyAgICAgICAgICAgIGZs
b2F0IG94ID0geCAtIGJvdW5kcy53aWR0aCgpIC8gMi4wOworICAgICAgICAgICAgZmxvYXQgb3kg
PSB5IC0gYm91bmRzLmhlaWdodCgpIC8gMi4wOworCisgICAgICAgICAgICAvLyBXZSBhcHBseSB0
aGUgdHJhbnNmb3JtYXRpb24gYnkgaGFuZCwgc2luY2Ugd2UgbmVlZCB0aGUgeiBjb29yZGluYXRl
CisgICAgICAgICAgICAvLyBhcyB3ZWxsICh0byBkbyBwZXJzcGVjdGl2ZSBjb3JyZWN0IHRleHR1
cmluZykgYW5kIHdlIGRvbid0IG5lZWQKKyAgICAgICAgICAgIC8vIHRvIGRpdmlkZSBieSB3IGJ5
IGhhbmQsIHRoZSBHUFUgd2lsbCBkbyB0aGF0IGZvciB1cworICAgICAgICAgICAgdHJhbnNmb3Jt
UG9pbnQob3gsIG95LCBkcmF3VHJhbnNmb3JtLCAmdmVydGljZXNbMF0pOworICAgICAgICAgICAg
dHJhbnNmb3JtUG9pbnQob3gsIG95K2gsIGRyYXdUcmFuc2Zvcm0sICZ2ZXJ0aWNlc1s0XSk7Cisg
ICAgICAgICAgICB0cmFuc2Zvcm1Qb2ludChveCt3LCBveStoLCBkcmF3VHJhbnNmb3JtLCAmdmVy
dGljZXNbOF0pOworICAgICAgICAgICAgdHJhbnNmb3JtUG9pbnQob3grdywgb3ksIGRyYXdUcmFu
c2Zvcm0sICZ2ZXJ0aWNlc1sxMl0pOworCisgICAgICAgICAgICAvLyBJbmZsYXRlIHRoZSByZWN0
IHNvbWV3aGF0IHRvIGF0dGVtcHQgdG8gbWFrZSB0ZXh0dXJlcyByZW5kZXIgYmVmb3JlIHRoZXkg
c2hvdworICAgICAgICAgICAgLy8gdXAgb24gc2NyZWVuLgorICAgICAgICAgICAgZmxvYXQgZCA9
IHZpZXdwb3J0SW5mbGF0aW9uRmFjdG9yOworICAgICAgICAgICAgRmxvYXRSZWN0IHJlY3QoLWQs
IC1kLCAyKmQsIDIqZCk7CisgICAgICAgICAgICBGbG9hdFF1YWQgcXVhZChGbG9hdFBvaW50KHZl
cnRpY2VzWzBdIC8gdmVydGljZXNbM10sIHZlcnRpY2VzWzFdIC8gdmVydGljZXNbM10pLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXRQb2ludCh2ZXJ0aWNlc1s0XSAvIHZlcnRpY2Vz
WzddLCB2ZXJ0aWNlc1s1XSAvIHZlcnRpY2VzWzddKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEZsb2F0UG9pbnQodmVydGljZXNbOF0gLyB2ZXJ0aWNlc1sxMV0sIHZlcnRpY2VzWzldIC8g
dmVydGljZXNbMTFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0UG9pbnQodmVy
dGljZXNbMTJdIC8gdmVydGljZXNbMTVdLCB2ZXJ0aWNlc1sxM10gLyB2ZXJ0aWNlc1sxNV0pKTsK
KyAgICAgICAgICAgIGJvb2wgdmlzaWJsZSA9IHF1YWQuYm91bmRpbmdCb3goKS5pbnRlcnNlY3Rz
KHJlY3QpOworCisgICAgICAgICAgICBib29sIHdhc1Zpc2libGUgPSB0aWxlLT5pc1Zpc2libGUo
KTsKKyAgICAgICAgICAgIHRpbGUtPnNldFZpc2libGUodmlzaWJsZSk7CisKKyAgICAgICAgICAg
IC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiB0d28gcGFzc2VzLiBUaGUgZmlyc3QgcGFzcyBk
cmF3cyBhbGwKKyAgICAgICAgICAgIC8vIHZpc2libGUgdGlsZXMgd2l0aCB0ZXh0dXJlcy4KKyAg
ICAgICAgICAgIC8vIElmIGEgdmlzaWJsZSB0aWxlIGhhcyBubyB0ZXh0dXJlLCBzZXQgdGhlIG1f
aGFzTWlzc2luZ1RleHR1cmVzCisgICAgICAgICAgICAvLyBmbGFnLCB0byBpbmRpY2F0ZSB0aGF0
IHdlIG5lZWQgYSBzZWNvbmQgcGFzcy4KKyAgICAgICAgICAgIC8vIFRoZSBzZWNvbmQgImRyYXdN
aXNzaW5nIiBwYXNzIGRyYXdzIGFsbCB2aXNpYmxlIHRpbGVzIHdpdGhvdXQKKyAgICAgICAgICAg
IC8vIHRleHR1cmVzIGFzIGNoZWNrZXJib2FyZC4KKyAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGRv
bid0IGRyYXcgYnJhbmQgbmV3IHRpbGVzIGFzIGNoZWNrZXJib2FyZC4gVGhlIGNoZWNrZXItCisg
ICAgICAgICAgICAvLyBib2FyZCBpbmRpY2F0ZXMgdGhhdCBhIHRpbGUgaGFzIGRpcnR5IGNvbnRl
bnRzLCBidXQgdGhhdCdzIG5vdAorICAgICAgICAgICAgLy8gdGhlIGNhc2UgaWYgaXQncyBicmFu
ZCBuZXcuCisgICAgICAgICAgICBpZiAodmlzaWJsZSkgeworICAgICAgICAgICAgICAgIGJvb2wg
aGFzVGV4dHVyZSA9IHRpbGUtPmhhc1RleHR1cmUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWhh
c1RleHR1cmUpCisgICAgICAgICAgICAgICAgICAgIG1faGFzTWlzc2luZ1RleHR1cmVzID0gdHJ1
ZTsKKworICAgICAgICAgICAgICAgIGlmIChoYXNUZXh0dXJlICYmICFkcmF3TWlzc2luZykgewor
ICAgICAgICAgICAgICAgICAgICBUZXh0dXJlKiB0ZXh0dXJlID0gdGlsZS0+dGV4dHVyZSgpOwor
ICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZS0+aXNPcGFxdWUoKSAmJiBsYXllci0+ZHJh
d09wYWNpdHkoKSA9PSAxLjBmICYmICFsYXllci0+bWFza0xheWVyKCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChibGVuZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJsZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xEaXNhYmxl
KEdMX0JMRU5EKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgfSBlbHNlIGlmICghYmxlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5k
aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfT05FX01JTlVT
X1NSQ19BTFBIQSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAg
ICB0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT50ZXh0dXJlQWNjZXNzZWQodGV4dHVy
ZSk7CisgICAgICAgICAgICAgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4
dHVyZS0+dGV4dHVyZUlkKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IGlmIChoYXNUZXh0dXJlICE9IGRyYXdNaXNzaW5nKQorICAgICAgICAgICAgICAgICAgICBnbERy
YXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKKworICAgICAgICAgICAgICAgIGlmICh0
aWxlLT5pc0RpcnR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUmVuZGVySm9iKGluZGV4
KTsKKyAgICAgICAgICAgICAgICAgICAgbmVlZHNEaXNwbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdhc1Zpc2libGUpCisgICAgICAgICAgICAg
ICAgcmVtb3ZlUmVuZGVySm9iKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJl
dHVybiBlYXJseSBmb3IgdGhlIGRyYXdNaXNzaW5nIGNhc2UsIGRvbid0IGZsYWcgdXMgYXMgbmVl
ZGluZyBjb21taXQuCisgICAgaWYgKGRyYXdNaXNzaW5nKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBTd2l0Y2ggb24gYmxlbmRpbmcgYWdhaW4gKHdlIGtub3cgdGhhdCBkcmF3TWlzc2luZyA9
PSBmYWxzZSkuCisgICAgaWYgKCFibGVuZGluZykgeworICAgICAgICBnbEVuYWJsZShHTF9CTEVO
RCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7
CisgICAgfQorCisgICAgLy8gSWYgd2Ugc2NoZWR1bGUgYSBjb21taXQsIHZpc2liaWxpdHkgd2ls
bCBiZSB1cGRhdGVkLCBhbmQgZGlzcGxheSB3aWxsCisgICAgLy8gaGFwcGVuIGlmIHRoZXJlIGFy
ZSBhbnkgdmlzaWJsZSBhbmQgZGlydHkgdGV4dHVyZXMuCisgICAgaWYgKG5lZWRzRGlzcGxheSkK
KyAgICAgICAgbGF5ZXItPnNldE5lZWRzQ29tbWl0KCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6
YWRkUmVuZGVySm9iKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgpCit7CisgICAgQVNTRVJUKGlzQ29t
cG9zaXRpbmdUaHJlYWQoKSk7CisKKyAgICBNdXRleExvY2tlciBsb2NrZXIobV9yZW5kZXJKb2Jz
TXV0ZXgpOworICAgIG1fcmVuZGVySm9icy5hZGQoaW5kZXgpOworfQorCit2b2lkIExheWVyVGls
ZXI6OnJlbW92ZVJlbmRlckpvYihjb25zdCBUaWxlSW5kZXgmIGluZGV4KQoreworICAgIE11dGV4
TG9ja2VyIGxvY2tlcihtX3JlbmRlckpvYnNNdXRleCk7CisgICAgbV9yZW5kZXJKb2JzLnJlbW92
ZShpbmRleCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6ZGVsZXRlVGV4dHVyZXMoKQoreworICAg
IC8vIFNpbmNlIHRleHR1cmVzIGFyZSBkZWxldGVkIGJ5IGEgc3luY2hyb25vdXMgbWVzc2FnZQor
ICAgIC8vIGZyb20gV2ViS2l0IHRocmVhZCB0byBjb21wb3NpdGluZyB0aHJlYWQsIHdlIGRvbid0
IG5lZWQKKyAgICAvLyBhbnkgc3luY2hyb25pemF0aW9uIG1lY2hhbmlzbSBoZXJlLCBldmVuIHRo
b3VnaCB3ZSBhcmUKKyAgICAvLyB0b3VjaGluZyBzb21lIFdlYktpdCB0aHJlYWQgc3RhdGUuCisg
ICAgbV90aWxlc1dlYktpdFRocmVhZC5jbGVhcigpOworCisgICAgaWYgKG1fdGlsZXNDb21wb3Np
dGluZ1RocmVhZC5zaXplKCkpIHsKKyAgICAgICAgZm9yIChUaWxlTWFwOjppdGVyYXRvciBpdCA9
IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5iZWdpbigpOyBpdCAhPSBtX3RpbGVzQ29tcG9zaXRp
bmdUaHJlYWQuZW5kKCk7ICsraXQpCisgICAgICAgICAgICAoKml0KS5zZWNvbmQtPmRpc2NhcmRD
b250ZW50cygpOworICAgICAgICBtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuY2xlYXIoKTsKKwor
ICAgICAgICBtX2NvbnRlbnRzRGlydHkgPSB0cnVlOworICAgIH0KKworICAgIC8vIEZvciB2YXJp
b3VzIHJlYXNvbnMsIGUuZy4gcGFnZSBjYWNoZSwgc29tZW9uZSBtYXkgdHJ5CisgICAgLy8gdG8g
cmVuZGVyIHVzIGFmdGVyIHRoZSB0ZXh0dXJlcyB3ZXJlIGRlbGV0ZWQuCisgICAgbV9wZW5kaW5n
VGV4dHVyZVNpemUgPSBJbnRTaXplKCk7CisgICAgbV9yZXF1aXJlZFRleHR1cmVTaXplID0gSW50
U2l6ZSgpOworfQorCit2b2lkIExheWVyVGlsZXI6OnBydW5lVGV4dHVyZXMoKQoreworICAgIC8v
IFBydW5lIHRpbGVzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQKKyAgICBWZWN0b3I8VGlsZUlu
ZGV4PiB0aWxlc1RvRGVsZXRlOworICAgIGZvciAoVGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3Rp
bGVzQ29tcG9zaXRpbmdUaHJlYWQuYmVnaW4oKTsgaXQgIT0gbV90aWxlc0NvbXBvc2l0aW5nVGhy
ZWFkLmVuZCgpOyArK2l0KSB7CisgICAgICAgIFRpbGVJbmRleCBpbmRleCA9ICgqaXQpLmZpcnN0
OworCisgICAgICAgIEludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShpbmRleCk7CisgICAg
ICAgIGlmIChvcmlnaW4ueCgpID49IG1fcmVxdWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgpIHx8IG9y
aWdpbi55KCkgPj0gbV9yZXF1aXJlZFRleHR1cmVTaXplLmhlaWdodCgpKQorICAgICAgICAgICAg
dGlsZXNUb0RlbGV0ZS5hcHBlbmQoaW5kZXgpOworICAgIH0KKworICAgIGZvciAoVmVjdG9yPFRp
bGVJbmRleD46Oml0ZXJhdG9yIGl0ID0gdGlsZXNUb0RlbGV0ZS5iZWdpbigpOyBpdCAhPSB0aWxl
c1RvRGVsZXRlLmVuZCgpOyArK2l0KSB7CisgICAgICAgIExheWVyVGlsZSogdGlsZSA9IG1fdGls
ZXNDb21wb3NpdGluZ1RocmVhZC50YWtlKCppdCk7CisgICAgICAgIHRpbGUtPmRpc2NhcmRDb250
ZW50cygpOworICAgICAgICBkZWxldGUgdGlsZTsKKyAgICB9Cit9CisKK0ludFNpemUgTGF5ZXJU
aWxlcjo6ZGVmYXVsdFRpbGVTaXplKCkKK3sKKyAgICBzdGF0aWMgSW50U2l6ZSBzY3JlZW5TaXpl
ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OnByaW1hcnlTY3JlZW4o
KS0+bmF0aXZlU2l6ZSgpOworICAgIHN0YXRpYyBpbnQgZGltID0gbWF4KHNjcmVlblNpemUud2lk
dGgoKSwgc2NyZWVuU2l6ZS5oZWlnaHQoKSkgLyB0aWxlTXVsdGlwbGllcjsKKyAgICByZXR1cm4g
SW50U2l6ZShkaW0sIGRpbSk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6dXBkYXRlVGlsZVNpemUo
KQoreworICAgIEludFNpemUgc2l6ZSA9IG1fdGlsaW5nRGlzYWJsZWQgPyBtX2xheWVyLT5ib3Vu
ZHMoKSA6IGRlZmF1bHRUaWxlU2l6ZSgpOworICAgIGNvbnN0IEludFNpemUgbWF4VGV4dHVyZVNp
emUoMjA0OCwgMjA0OCk7CisgICAgc2l6ZSA9IHNpemUuc2hydW5rVG8obWF4VGV4dHVyZVNpemUp
OworCisgICAgaWYgKG1fdGlsZVNpemUgPT0gc2l6ZSB8fCBzaXplLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgLy8gSW52YWxpZGF0ZSB0aGUgd2hvbGUgbGF5ZXIgaWYgdGlsZSBz
aXplIGNoYW5nZXMuCisgICAgc2V0TmVlZHNEaXNwbGF5KCk7CisgICAgbV90aWxlU2l6ZSA9IHNp
emU7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6ZGlzYWJsZVRpbGluZyhib29sIGRpc2FibGUpCit7
CisgICAgaWYgKG1fdGlsaW5nRGlzYWJsZWQgPT0gZGlzYWJsZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV90aWxpbmdEaXNhYmxlZCA9IGRpc2FibGU7CisgICAgdXBkYXRlVGlsZVNpemUoKTsK
K30KKworYm9vbCBMYXllclRpbGVyOjpzaG91bGRQcmVmaWxsVGlsZShjb25zdCBUaWxlSW5kZXgm
IGluZGV4KQoreworICAgIC8vIEZvciBub3csIHdlIHVzZSB0aGUgaGV1cmlzdGljIG9mIHByZWZp
bGxpbmcgdGhlIGZpcnN0IHNjcmVlbmZ1bCBvZiB0aWxlcy4KKyAgICAvLyBUaGlzIGdpdmVzIHRo
ZSBjb3JyZWN0IHJlc3VsdCBvbmx5IGZvciBsYXllcnMgd2l0aCBpZGVudGl0eSB0cmFuc2Zvcm0s
CisgICAgLy8gd2hpY2ggaXMgd2h5IGl0J3MgY2FsbGVkIGEgaGV1cmlzdGljIGhlcmUuIFRoaXMg
aXMgbmVlZGVkIGZvciB0aGUgY2FzZQorICAgIC8vIHdoZXJlIHRoZSBkZXZlbG9wZXIgYWN0dWFs
bHkgZGVzaWduZWQgdGhlaXIgd2ViIHBhZ2UgYXJvdW5kIHRoZSB1c2Ugb2YKKyAgICAvLyBhY2Nl
bGVyYXRlZCBjb21wb3NpdGluZywgYW5kIGV4cGVjdHMgZXZlbiBvZmZzY3JlZW4gbGF5ZXJzIHRv
IGhhdmUgY29udGVudC4KKyAgICAvLyBXZSBvYmxpZ2UgdGhlbSB0byBzb21lIGRlZ3JlZSBieSBw
cmVmaWxsaW5nIGEgc2NyZWVuZnVsIG9mIHRpbGVzLgorICAgIC8vIFRoaXMgaXMgcmVkdW5kYW50
IGluIHNvbWUgb3RoZXIgc2NlbmFyaW9zLCBpLmUuIHdoZW4gYW4gb2Zmc2NyZWVuIGxheWVyCisg
ICAgLy8gaXMgY29tcG9zaXRlZCBvbmx5IGJlY2F1c2Ugb2Ygb3ZlcmxhcHBpbmcgYSBmbGFzaCBh
ZCBvciBzb21ldGhpbmcgbGlrZQorICAgIC8vIHRoYXQsIGJ1dCB3ZSdyZSB3aWxsaW5nIHRvIG1h
a2UgdGhpcyB0cmFkZW9mZi4KKworICAgIC8vIFNpbmNlIHRoZSB0aWxlTXVsdGlwbGllciBpbmRp
Y2F0ZXMgaG93IG1hbnkgdGlsZXMgZml0IG9uIHRoZSBzY3JlZW4sCisgICAgLy8gdGhlIGZvbGxv
d2luZyBmb3JtdWxhIGNhbiBiZSB1c2VkOgorICAgIHJldHVybiBpbmRleC5pKCkgPCBzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4odGlsZU11bHRpcGxpZXIpICYmIGluZGV4LmooKSA8IHN0YXRpY19jYXN0
PHVuc2lnbmVkPih0aWxlTXVsdGlwbGllcik7Cit9CisKK1RpbGVJbmRleCBMYXllclRpbGVyOjpp
bmRleE9mVGlsZShjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgb3JpZ2luKQoreworICAgIGludCBv
ZmZzZXRYID0gb3JpZ2luLngoKTsKKyAgICBpbnQgb2Zmc2V0WSA9IG9yaWdpbi55KCk7CisgICAg
aWYgKG9mZnNldFgpCisgICAgICAgIG9mZnNldFggPSBvZmZzZXRYIC8gdGlsZVNpemUoKS53aWR0
aCgpOworICAgIGlmIChvZmZzZXRZKQorICAgICAgICBvZmZzZXRZID0gb2Zmc2V0WSAvIHRpbGVT
aXplKCkuaGVpZ2h0KCk7CisgICAgcmV0dXJuIFRpbGVJbmRleChvZmZzZXRYLCBvZmZzZXRZKTsK
K30KKworSW50UG9pbnQgTGF5ZXJUaWxlcjo6b3JpZ2luT2ZUaWxlKGNvbnN0IFRpbGVJbmRleCYg
aW5kZXgpCit7CisgICAgcmV0dXJuIEludFBvaW50KGluZGV4LmkoKSAqIHRpbGVTaXplKCkud2lk
dGgoKSwgaW5kZXguaigpICogdGlsZVNpemUoKS5oZWlnaHQoKSk7Cit9CisKK0ludFJlY3QgTGF5
ZXJUaWxlcjo6cmVjdEZvclRpbGUoY29uc3QgVGlsZUluZGV4JiBpbmRleCwgY29uc3QgSW50U2l6
ZSYgYm91bmRzKQoreworICAgIEludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShpbmRleCk7
CisgICAgSW50U2l6ZSBvZmZzZXQob3JpZ2luLngoKSwgb3JpZ2luLnkoKSk7CisgICAgSW50U2l6
ZSBzaXplID0gdGlsZVNpemUoKS5zaHJ1bmtUbyhib3VuZHMgLSBvZmZzZXQpOworICAgIHJldHVy
biBJbnRSZWN0KG9yaWdpbiwgc2l6ZSk7Cit9CisKK2Jvb2wgTGF5ZXJUaWxlcjo6aGFzRGlydHlU
aWxlcygpIGNvbnN0Cit7CisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1f
dGlsZXNDb21wb3NpdGluZ1RocmVhZC5iZWdpbigpOyBpdCAhPSBtX3RpbGVzQ29tcG9zaXRpbmdU
aHJlYWQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgY29uc3QgTGF5ZXJUaWxlKiB0aWxlID0gKCpp
dCkuc2Vjb25kOworICAgICAgICBpZiAodGlsZS0+aXNEaXJ0eSgpKQorICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIExheWVyVGls
ZXI6OmJpbmRDb250ZW50c1RleHR1cmUoKQoreworICAgIEFTU0VSVChtX3RpbGVzQ29tcG9zaXRp
bmdUaHJlYWQuc2l6ZSgpID09IDEpOworICAgIGlmIChtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQu
c2l6ZSgpICE9IDEpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IExheWVyVGlsZSogdGls
ZSA9IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5iZWdpbigpLT5zZWNvbmQ7CisKKyAgICBBU1NF
UlQodGlsZS0+aGFzVGV4dHVyZSgpKTsKKyAgICBpZiAoIXRpbGUtPmhhc1RleHR1cmUoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0aWxlLT50
ZXh0dXJlKCktPnRleHR1cmVJZCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNr
YmVycnkvTGF5ZXJUaWxlci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxh
Y2tiZXJyeS9MYXllclRpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGE3YTUzNWQ5ZjgyZTBhOTc1ODQ0OWNh
NzYyYzgwMzhjODVkYzBiZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlci5oCkBAIC0wLDAgKzEsMjA4IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVk
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy
ZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgTGF5
ZXJUaWxlcl9oCisjZGVmaW5lIExheWVyVGlsZXJfaAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorCisjaW5jbHVkZSAiQ29sb3IuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIK
KyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTGF5ZXJUaWxlRGF0YS5oIgorI2luY2x1
ZGUgIkxheWVyVGlsZUluZGV4LmgiCisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorI2luY2x1ZGUg
PHd0Zi9EZXF1ZS5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL0hh
c2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjbGFzcyBMYXllclRpbGU7CitjbGFzcyBMYXllckNvbXBvc2l0aW5n
VGhyZWFkOworY2xhc3MgTGF5ZXJXZWJLaXRUaHJlYWQ7CitjbGFzcyBUcmFuc2Zvcm1hdGlvbk1h
dHJpeDsKKworY2xhc3MgTGF5ZXJUaWxlciA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxM
YXllclRpbGVyPiB7CitwdWJsaWM6CisgICAgVGlsZUluZGV4IGluZGV4T2ZUaWxlKGNvbnN0IElu
dFBvaW50JiBvcmlnaW4pOworICAgIEludFBvaW50IG9yaWdpbk9mVGlsZShjb25zdCBUaWxlSW5k
ZXgmKTsKKyAgICBJbnRSZWN0IHJlY3RGb3JUaWxlKGNvbnN0IFRpbGVJbmRleCYsIGNvbnN0IElu
dFNpemUmIGJvdW5kcyk7CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxMYXllclRpbGVyPiBjcmVh
dGUoTGF5ZXJXZWJLaXRUaHJlYWQqIGxheWVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0
UmVmKG5ldyBMYXllclRpbGVyKGxheWVyKSk7CisgICAgfQorCisgICAgdmlydHVhbCB+TGF5ZXJU
aWxlcigpOworCisgICAgLy8gV2ViS2l0IHRocmVhZAorICAgIExheWVyV2ViS2l0VGhyZWFkKiBs
YXllcigpIGNvbnN0IHsgcmV0dXJuIG1fbGF5ZXI7IH0KKyAgICB2b2lkIGxheWVyV2ViS2l0VGhy
ZWFkRGVzdHJveWVkKCk7CisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoY29uc3QgRmxvYXRSZWN0
JiBkaXJ0eVJlY3QpOworICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCk7CisgICAgdm9pZCB1cGRh
dGVUZXh0dXJlQ29udGVudHNJZk5lZWRlZChkb3VibGUgc2NhbGUpOworICAgIHZvaWQgZGlzYWJs
ZVRpbGluZyhib29sKTsKKworICAgIC8vIENvbXBvc2l0aW5nIHRocmVhZAorICAgIHZvaWQgbGF5
ZXJDb21wb3NpdGluZ1RocmVhZERlc3Ryb3llZCgpOworICAgIHZvaWQgdXBsb2FkVGV4dHVyZXNJ
Zk5lZWRlZCgpOworICAgIHZvaWQgZHJhd1RleHR1cmVzKExheWVyQ29tcG9zaXRpbmdUaHJlYWQq
LCBpbnQgcG9zaXRpb25Mb2NhdGlvbiwgaW50IHRleENvb3JkTG9jYXRpb24pOworICAgIGJvb2wg
aGFzTWlzc2luZ1RleHR1cmVzKCkgY29uc3QgeyByZXR1cm4gbV9oYXNNaXNzaW5nVGV4dHVyZXM7
IH0KKyAgICB2b2lkIGRyYXdNaXNzaW5nVGV4dHVyZXMoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCos
IGludCBwb3NpdGlvbkxvY2F0aW9uLCBpbnQgdGV4Q29vcmRMb2NhdGlvbik7CisgICAgdm9pZCBk
ZWxldGVUZXh0dXJlcygpOworICAgIHZvaWQgY29tbWl0UGVuZGluZ1RleHR1cmVVcGxvYWRzKCk7
CisgICAgdm9pZCBsYXllclZpc2liaWxpdHlDaGFuZ2VkKGJvb2wgdmlzaWJsZSk7CisgICAgYm9v
bCBoYXNEaXJ0eVRpbGVzKCkgY29uc3Q7CisgICAgdm9pZCBiaW5kQ29udGVudHNUZXh0dXJlKCk7
CisKKyAgICAvLyBUaHJlYWQgc2FmZQorICAgIHZvaWQgYWRkUmVuZGVySm9iKGNvbnN0IFRpbGVJ
bmRleCYpOworICAgIHZvaWQgcmVtb3ZlUmVuZGVySm9iKGNvbnN0IFRpbGVJbmRleCYpOworCitw
cml2YXRlOgorICAgIHN0cnVjdCBUZXh0dXJlSm9iIHsKKyAgICAgICAgZW51bSBUeXBlIHsgVW5r
bm93biwgU2V0Q29udGVudHMsIFNldENvbnRlbnRzVG9Db2xvciwgVXBkYXRlQ29udGVudHMsIERp
c2NhcmRDb250ZW50cywgUmVzaXplQ29udGVudHMsIERpcnR5Q29udGVudHMgfTsKKworICAgICAg
ICBUZXh0dXJlSm9iKCkKKyAgICAgICAgICAgIDogdHlwZShVbmtub3duKQorICAgICAgICB7Cisg
ICAgICAgIH0KKworICAgICAgICBUZXh0dXJlSm9iKFR5cGUgdHlwZSwgY29uc3QgSW50U2l6ZSYg
bmV3U2l6ZSkKKyAgICAgICAgICAgIDogdHlwZSh0eXBlKQorICAgICAgICAgICAgLCBpc09wYXF1
ZShmYWxzZSkKKyAgICAgICAgICAgICwgZGlydHlSZWN0KEludFBvaW50KCksIG5ld1NpemUpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IFJlc2l6ZUNvbnRlbnRzKTsKKyAg
ICAgICAgfQorCisgICAgICAgIFRleHR1cmVKb2IoVHlwZSB0eXBlLCBjb25zdCBJbnRSZWN0JiBk
aXJ0eVJlY3QpCisgICAgICAgICAgICA6IHR5cGUodHlwZSkKKyAgICAgICAgICAgICwgaXNPcGFx
dWUoZmFsc2UpCisgICAgICAgICAgICAsIGRpcnR5UmVjdChkaXJ0eVJlY3QpCisgICAgICAgIHsK
KyAgICAgICAgICAgIEFTU0VSVCh0eXBlID09IERpc2NhcmRDb250ZW50cyB8fCB0eXBlID09IERp
cnR5Q29udGVudHMpOworICAgICAgICB9CisKKyAgICAgICAgVGV4dHVyZUpvYihUeXBlIHR5cGUs
IGNvbnN0IFNrQml0bWFwJiBjb250ZW50cywgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0LCBib29s
IGlzT3BhcXVlID0gZmFsc2UpCisgICAgICAgICAgICA6IHR5cGUodHlwZSkKKyAgICAgICAgICAg
ICwgY29udGVudHMoY29udGVudHMpCisgICAgICAgICAgICAsIGlzT3BhcXVlKGlzT3BhcXVlKQor
ICAgICAgICAgICAgLCBkaXJ0eVJlY3QoZGlydHlSZWN0KQorICAgICAgICB7CisgICAgICAgICAg
ICBBU1NFUlQodHlwZSA9PSBVcGRhdGVDb250ZW50cyB8fCB0eXBlID09IFNldENvbnRlbnRzKTsK
KyAgICAgICAgICAgIEFTU0VSVCghY29udGVudHMuaXNOdWxsKCkpOworICAgICAgICB9CisKKyAg
ICAgICAgVGV4dHVyZUpvYihUeXBlIHR5cGUsIGNvbnN0IENvbG9yJiBjb2xvciwgY29uc3QgVGls
ZUluZGV4JiBpbmRleCkKKyAgICAgICAgICAgIDogdHlwZSh0eXBlKQorICAgICAgICAgICAgLCBp
c09wYXF1ZShmYWxzZSkKKyAgICAgICAgICAgICwgY29sb3IoY29sb3IpCisgICAgICAgICAgICAs
IGluZGV4KGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBTZXRD
b250ZW50c1RvQ29sb3IpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIFRleHR1cmVKb2Ig
c2V0Q29udGVudHMoY29uc3QgU2tCaXRtYXAmIGNvbnRlbnRzLCBib29sIGlzT3BhcXVlKSB7IHJl
dHVybiBUZXh0dXJlSm9iKFNldENvbnRlbnRzLCBjb250ZW50cywgSW50UmVjdChJbnRQb2ludCgp
LCBJbnRTaXplKGNvbnRlbnRzLndpZHRoKCksIGNvbnRlbnRzLmhlaWdodCgpKSksIGlzT3BhcXVl
KTsgfQorICAgICAgICBzdGF0aWMgVGV4dHVyZUpvYiBzZXRDb250ZW50c1RvQ29sb3IoY29uc3Qg
Q29sb3ImIGNvbG9yLCBjb25zdCBUaWxlSW5kZXgmIGluZGV4KSB7IHJldHVybiBUZXh0dXJlSm9i
KFNldENvbnRlbnRzVG9Db2xvciwgY29sb3IsIGluZGV4KTsgfQorICAgICAgICBzdGF0aWMgVGV4
dHVyZUpvYiB1cGRhdGVDb250ZW50cyhjb25zdCBTa0JpdG1hcCYgY29udGVudHMsIGNvbnN0IElu
dFJlY3QmIGRpcnR5UmVjdCkgeyByZXR1cm4gVGV4dHVyZUpvYihVcGRhdGVDb250ZW50cywgY29u
dGVudHMsIGRpcnR5UmVjdCk7IH0KKyAgICAgICAgc3RhdGljIFRleHR1cmVKb2IgZGlzY2FyZENv
bnRlbnRzKGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCkgeyByZXR1cm4gVGV4dHVyZUpvYihEaXNj
YXJkQ29udGVudHMsIGRpcnR5UmVjdCk7IH0KKyAgICAgICAgc3RhdGljIFRleHR1cmVKb2IgcmVz
aXplQ29udGVudHMoY29uc3QgSW50U2l6ZSYgbmV3U2l6ZSkgeyByZXR1cm4gVGV4dHVyZUpvYihS
ZXNpemVDb250ZW50cywgbmV3U2l6ZSk7IH0KKyAgICAgICAgc3RhdGljIFRleHR1cmVKb2IgZGly
dHlDb250ZW50cyhjb25zdCBJbnRSZWN0JiBkaXJ0eVJlY3QpIHsgcmV0dXJuIFRleHR1cmVKb2Io
RGlydHlDb250ZW50cywgZGlydHlSZWN0KTsgfQorCisgICAgICAgIGJvb2wgaXNOdWxsKCkgeyBy
ZXR1cm4gdHlwZSA9PSBVbmtub3duOyB9CisKKyAgICAgICAgVHlwZSB0eXBlOworICAgICAgICBT
a0JpdG1hcCBjb250ZW50czsKKyAgICAgICAgYm9vbCBpc09wYXF1ZTsKKyAgICAgICAgSW50UmVj
dCBkaXJ0eVJlY3Q7CisgICAgICAgIENvbG9yIGNvbG9yOworICAgICAgICBUaWxlSW5kZXggaW5k
ZXg7CisgICAgfTsKKworICAgIHR5cGVkZWYgSGFzaE1hcDxUaWxlSW5kZXgsIExheWVyVGlsZSo+
IFRpbGVNYXA7CisgICAgdHlwZWRlZiBIYXNoTWFwPFRpbGVJbmRleCwgTGF5ZXJUaWxlRGF0YT4g
VmlzaWJpbGl0eU1hcDsKKyAgICB0eXBlZGVmIEhhc2hNYXA8VGlsZUluZGV4LCBjb25zdCBUZXh0
dXJlSm9iKj4gVGlsZUpvYnNNYXA7CisKKyAgICBzdGF0aWMgSW50U2l6ZSBkZWZhdWx0VGlsZVNp
emUoKTsKKyAgICBJbnRTaXplIHRpbGVTaXplKCkgY29uc3QgeyByZXR1cm4gbV90aWxlU2l6ZTsg
fQorICAgIHZvaWQgdXBkYXRlVGlsZVNpemUoKTsKKworICAgIExheWVyVGlsZXIoTGF5ZXJXZWJL
aXRUaHJlYWQqKTsKKworICAgIC8vIFdlYktpdCB0aHJlYWQKKyAgICB2b2lkIGFkZFRleHR1cmVK
b2IoY29uc3QgVGV4dHVyZUpvYiYpOworICAgIHZvaWQgY2xlYXJUZXh0dXJlSm9icygpOworICAg
IGJvb2wgc2hvdWxkUGVyZm9ybVJlbmRlckpvYihjb25zdCBUaWxlSW5kZXgmLCBib29sIGFsbG93
UHJlZmlsbCk7CisgICAgYm9vbCBzaG91bGRQcmVmaWxsVGlsZShjb25zdCBUaWxlSW5kZXgmKTsK
KworICAgIC8vIENvbXBvc2l0aW5nIHRocmVhZAorICAgIHZvaWQgdXBkYXRlVGlsZUNvbnRlbnRz
KGNvbnN0IFRleHR1cmVKb2ImLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdm9pZCBhZGRUaWxlSm9i
KGNvbnN0IFRpbGVJbmRleCYsIGNvbnN0IFRleHR1cmVKb2ImLCBUaWxlSm9ic01hcCYpOworICAg
IHZvaWQgcGVyZm9ybVRpbGVKb2IoTGF5ZXJUaWxlKiwgY29uc3QgVGV4dHVyZUpvYiYsIGNvbnN0
IEludFJlY3QmKTsKKyAgICB2b2lkIHByb2Nlc3NUZXh0dXJlSm9iKGNvbnN0IFRleHR1cmVKb2Im
LCBUaWxlSm9ic01hcCYpOworICAgIHZvaWQgZHJhd1RleHR1cmVzSW50ZXJuYWwoTGF5ZXJDb21w
b3NpdGluZ1RocmVhZCosIGludCBwb3NpdGlvbkxvY2F0aW9uLCBpbnQgdGV4Q29vcmRMb2NhdGlv
biwgYm9vbCBtaXNzaW5nKTsKKyAgICB2b2lkIHBydW5lVGV4dHVyZXMoKTsKKyAgICB2b2lkIHZp
c2liaWxpdHlDaGFuZ2VkKGJvb2wgbmVlZHNEaXNwbGF5KTsKKworICAgIC8vIENsZWFyIGFsbCBw
ZW5kaW5nIHVwZGF0ZSBjb250ZW50IHRleHR1cmUgam9icworICAgIHRlbXBsYXRlPHR5cGVuYW1l
IFQ+CisgICAgc3RhdGljIHZvaWQgcmVtb3ZlVXBkYXRlQ29udGVudHNKb2JzKFQmIGpvYnMpCisg
ICAgeworICAgICAgICAvLyBDbGVhciBhbGwgcGVuZGluZyB1cGRhdGUgY29udGVudCBqb2JzCisg
ICAgICAgIFQgbGlzdDsKKyAgICAgICAgZm9yICh0eXBlbmFtZSBUOjppdGVyYXRvciBpdCA9IGpv
YnMuYmVnaW4oKTsgaXQgIT0gam9icy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKCgq
aXQpLnR5cGUgIT0gVGV4dHVyZUpvYjo6VXBkYXRlQ29udGVudHMpCisgICAgICAgICAgICAgICAg
bGlzdC5hcHBlbmQoKml0KTsKKyAgICAgICAgfQorICAgICAgICBqb2JzID0gbGlzdDsKKyAgICB9
CisKKyAgICBMYXllcldlYktpdFRocmVhZCogbV9sYXllcjsKKworICAgIFRpbGVNYXAgbV90aWxl
c0NvbXBvc2l0aW5nVGhyZWFkOworCisgICAgVmlzaWJpbGl0eU1hcCBtX3RpbGVzV2ViS2l0VGhy
ZWFkOworCisgICAgYm9vbCBtX3RpbGluZ0Rpc2FibGVkOworCisgICAgYm9vbCBtX2NvbnRlbnRz
RGlydHk7CisgICAgRmxvYXRSZWN0IG1fZGlydHlSZWN0OworCisgICAgSW50U2l6ZSBtX3BlbmRp
bmdUZXh0dXJlU2l6ZTsgLy8gUmVzaXplZCwgYnV0IG5vdCBjb21taXR0ZWQgeWV0LgorICAgIElu
dFNpemUgbV9yZXF1aXJlZFRleHR1cmVTaXplOworICAgIEludFNpemUgbV90aWxlU2l6ZTsKKwor
ICAgIGJvb2wgbV9jbGVhclRleHR1cmVKb2JzOworICAgIFZlY3RvcjxUZXh0dXJlSm9iPiBtX3Bl
bmRpbmdUZXh0dXJlSm9iczsgLy8gQWRkZWQsIGJ1dCBub3QgY29tbWl0dGVkIHlldC4KKyAgICBE
ZXF1ZTxUZXh0dXJlSm9iPiBtX3RleHR1cmVKb2JzOworICAgIGJvb2wgbV9oYXNNaXNzaW5nVGV4
dHVyZXM7CisKKyAgICBIYXNoU2V0PFRpbGVJbmRleD4gbV9yZW5kZXJKb2JzOworICAgIE11dGV4
IG1fcmVuZGVySm9ic011dGV4OworICAgIGRvdWJsZSBtX2NvbnRlbnRzU2NhbGU7Cit9OworCit9
CisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZiAvLyBM
YXllclRpbGVyX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>130806</attachid>
            <date>2012-03-08 04:45:41 -0800</date>
            <delta_ts>2012-03-09 00:45:22 -0800</delta_ts>
            <desc>patch-v3</desc>
            <filename>bug-79875-20120308204542.patch</filename>
            <type>text/plain</type>
            <size>51120</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEwMTQ5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggN2IwYjAwOTYxMjJjMTY3
OThjMTAwYzg5OTZiNTI0MDNmZjVhYjFhMC4uYjRlNjg3NmE3NjNlYjg5MDllNWViYjNhZjRhMDgy
OGVjZDMxODJjZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDk2IEBACisyMDEyLTAzLTA4ICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBjbGFzc2VzIHRoYXQgaGFuZGxlIGxheWVyIHRpbGluZworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzk4NzUKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBu
byBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xh
eWVyVGlsZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclRpbGU6OkxheWVyVGlsZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6On5M
YXllclRpbGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlOjpzZXRDb250ZW50cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnNldENvbnRlbnRzVG9Db2xvcik6CisgICAgICAg
IChXZWJDb3JlOjpMYXllclRpbGU6OnVwZGF0ZUNvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyVGlsZTo6ZGlzY2FyZENvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGls
ZTo6c2V0VmlzaWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnNldFRleHR1cmUp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChMYXllclRpbGVEYXRhKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyVGlsZURhdGE6OkxheWVyVGlsZURhdGEpOgorICAgICAgICAoV2Vi
Q29yZTo6TGF5ZXJUaWxlRGF0YTo6aXNWaXNpYmxlKToKKyAgICAgICAgKExheWVyVGlsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnRleHR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6
TGF5ZXJUaWxlOjppc1Zpc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlOjppc0Rp
cnR5KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZTo6aGFzVGV4dHVyZSk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllclRpbGU6OnNldENvbnRlbnRzRGlydHkpOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlSW5kZXguaDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFRpbGVJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpUaWxl
SW5kZXg6OlRpbGVJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpUaWxlSW5kZXg6On5UaWxlSW5k
ZXgpOgorICAgICAgICAoV2ViQ29yZTo6VGlsZUluZGV4OjppKToKKyAgICAgICAgKFdlYkNvcmU6
OlRpbGVJbmRleDo6aik6CisgICAgICAgIChXZWJDb3JlOjpUaWxlSW5kZXg6OnNldEluZGV4KToK
KyAgICAgICAgKFdlYkNvcmU6Om9wZXJhdG9yPT0pOgorICAgICAgICAoV2ViQ29yZTo6b3BlcmF0
b3IhPSk6CisgICAgICAgIChXVEYpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNr
YmVycnkvTGF5ZXJUaWxlci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAg
IChXZWJDb3JlOjp0cmFuc2Zvcm1Qb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVy
OjpMYXllclRpbGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6On5MYXllclRpbGVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmxheWVyV2ViS2l0VGhyZWFkRGVzdHJv
eWVkKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmxheWVyQ29tcG9zaXRpbmdUaHJl
YWREZXN0cm95ZWQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6c2V0TmVlZHNEaXNw
bGF5KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnVwZGF0ZVRleHR1cmVDb250ZW50
c0lmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnNob3VsZFBlcmZvcm1S
ZW5kZXJKb2IpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6YWRkVGV4dHVyZUpvYik6
CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpjbGVhclRleHR1cmVKb2JzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmNvbW1pdFBlbmRpbmdUZXh0dXJlVXBsb2Fkcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpsYXllclZpc2liaWxpdHlDaGFuZ2VkKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnVwbG9hZFRleHR1cmVzSWZOZWVkZWQpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6cHJvY2Vzc1RleHR1cmVKb2IpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJUaWxlcjo6YWRkVGlsZUpvYik6CisgICAgICAgIChXZWJDb3JlOjpMYXll
clRpbGVyOjpwZXJmb3JtVGlsZUpvYik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpk
cmF3VGV4dHVyZXMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6ZHJhd01pc3NpbmdU
ZXh0dXJlcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpkcmF3VGV4dHVyZXNJbnRl
cm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjphZGRSZW5kZXJKb2IpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6cmVtb3ZlUmVuZGVySm9iKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyVGlsZXI6OmRlbGV0ZVRleHR1cmVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyVGlsZXI6OnBydW5lVGV4dHVyZXMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6
ZGVmYXVsdFRpbGVTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnVwZGF0ZVRp
bGVTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmRpc2FibGVUaWxpbmcpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6c2hvdWxkUHJlZmlsbFRpbGUpOgorICAgICAg
ICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6aW5kZXhPZlRpbGUpOgorICAgICAgICAoV2ViQ29yZTo6
TGF5ZXJUaWxlcjo6b3JpZ2luT2ZUaWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6
OnJlY3RGb3JUaWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6Omhhc0RpcnR5VGls
ZXMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6YmluZENvbnRlbnRzVGV4dHVyZSk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVyLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChMYXllclRpbGVyKToKKyAgICAgICAg
KFdlYkNvcmU6OkxheWVyVGlsZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRp
bGVyOjpsYXllcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpoYXNNaXNzaW5nVGV4
dHVyZXMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6VGV4dHVyZUpvYjo6VGV4dHVy
ZUpvYik6CisgICAgICAgIChUZXh0dXJlSm9iKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGls
ZXI6OlRleHR1cmVKb2I6OnNldENvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGls
ZXI6OlRleHR1cmVKb2I6OnNldENvbnRlbnRzVG9Db2xvcik6CisgICAgICAgIChXZWJDb3JlOjpM
YXllclRpbGVyOjpUZXh0dXJlSm9iOjp1cGRhdGVDb250ZW50cyk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclRpbGVyOjpUZXh0dXJlSm9iOjpkaXNjYXJkQ29udGVudHMpOgorICAgICAgICAoV2Vi
Q29yZTo6TGF5ZXJUaWxlcjo6VGV4dHVyZUpvYjo6cmVzaXplQ29udGVudHMpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJUaWxlcjo6VGV4dHVyZUpvYjo6ZGlydHlDb250ZW50cyk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllclRpbGVyOjpUZXh0dXJlSm9iOjppc051bGwpOgorICAgICAgICAoV2Vi
Q29yZTo6TGF5ZXJUaWxlcjo6dGlsZVNpemUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxl
cjo6cmVtb3ZlVXBkYXRlQ29udGVudHNKb2JzKToKKwogMjAxMi0wMy0wNyAgQW1pIEZpc2NobWFu
ICA8ZmlzY2htYW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtDaHJvbWl1bV0gQWxsb3cgQ0NM
YXllclRyZWVIb3N0Ojpjb250ZXh0KCkgdG8gYmUgY2FsbGVkIGV2ZW4gd2l0aCB0aGUgdGhyZWFk
ZWQgY29tcG9zaXRvciBlbmFibGVkLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmYyMWVh
OTQ4ZThjODZiZTFkYmZmYTFkZDgwYzMzNTdlN2I2MDhiZjUKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZS5jcHAK
QEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTIgUmVzZWFy
Y2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYg
bm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNB
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorCisjaW5jbHVkZSAiTGF5ZXJUaWxlLmgiCisKKyNpbmNsdWRlICJUZXh0dXJlQ2Fj
aGVDb21wb3NpdGluZ1RocmVhZC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0xheWVyVGls
ZTo6TGF5ZXJUaWxlKCkKKyAgICA6IG1fY29udGVudHNEaXJ0eShmYWxzZSkKK3sKK30KKworTGF5
ZXJUaWxlOjp+TGF5ZXJUaWxlKCkKK3sKKyAgICAvLyBNYWtlIHN1cmUgdG8gdW5wcm90ZWN0IHRo
ZSB0ZXh0dXJlIGlmIG5lZWRlZC4KKyAgICBzZXRWaXNpYmxlKGZhbHNlKTsKK30KKwordm9pZCBM
YXllclRpbGU6OnNldENvbnRlbnRzKGNvbnN0IFNrQml0bWFwJiBjb250ZW50cywgY29uc3QgSW50
UmVjdCYgdGlsZVJlY3QsIGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIGJvb2wgaXNPcGFxdWUpCit7
CisgICAgc2V0VGV4dHVyZSh0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT50ZXh0dXJl
Rm9yVGlsZWRDb250ZW50cyhjb250ZW50cywgdGlsZVJlY3QsIGluZGV4LCBpc09wYXF1ZSkpOwor
fQorCit2b2lkIExheWVyVGlsZTo6c2V0Q29udGVudHNUb0NvbG9yKGNvbnN0IENvbG9yJiBjb2xv
cikKK3sKKyAgICBzZXRUZXh0dXJlKHRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCktPnRl
eHR1cmVGb3JDb2xvcihjb2xvcikpOworfQorCit2b2lkIExheWVyVGlsZTo6dXBkYXRlQ29udGVu
dHMoY29uc3QgU2tCaXRtYXAmIGNvbnRlbnRzLCBjb25zdCBJbnRSZWN0JiBkaXJ0eVJlY3QsIGNv
bnN0IEludFJlY3QmIHRpbGVSZWN0KQoreworICAgIHNldFRleHR1cmUodGV4dHVyZUNhY2hlQ29t
cG9zaXRpbmdUaHJlYWQoKS0+dXBkYXRlQ29udGVudHMobV90ZXh0dXJlLCBjb250ZW50cywgZGly
dHlSZWN0LCB0aWxlUmVjdCkpOworfQorCit2b2lkIExheWVyVGlsZTo6ZGlzY2FyZENvbnRlbnRz
KCkKK3sKKyAgICBzZXRUZXh0dXJlKDApOworfQorCit2b2lkIExheWVyVGlsZTo6c2V0VmlzaWJs
ZShib29sIHZpc2libGUpCit7CisgICAgaWYgKHZpc2libGUgPT0gbV92aXNpYmxlKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX3Zpc2libGUgPSB2aXNpYmxlOworCisgICAgaWYgKCFtX3RleHR1
cmUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFByb3RlY3QgdGhlIHRleHR1cmUgZnJvbSBi
ZWluZyBldmljdGVkIGZyb20gY2FjaGUKKyAgICAvLyBpZiB3ZSBhcmUgdmlzaWJsZS4KKyAgICBp
ZiAodmlzaWJsZSkKKyAgICAgICAgbV90ZXh0dXJlLT5wcm90ZWN0KCk7CisgICAgZWxzZQorICAg
ICAgICBtX3RleHR1cmUtPnVucHJvdGVjdCgpOworfQorCit2b2lkIExheWVyVGlsZTo6c2V0VGV4
dHVyZShQYXNzUmVmUHRyPFRleHR1cmU+IHRleHR1cmUpCit7CisgICAgLy8gQ2xlYXIgdGhpcyBm
bGFnIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0dXJlIHBhcmFtZXRlci4KKyAg
ICAvLyBJZiBpdCdzIDAsIGlzRGlydHkoKSB3aWxsIHJldHVybiB0cnVlIGFueXdheS4KKyAgICAv
LyBJZiBpdCdzIHRoZSBzYW1lIHRleHR1cmUsIHBlcmhhcHMgdGhlcmUgd2FzIG5vIG1vcmUgZGV0
YWlsZWQgdGV4dHVyZQorICAgIC8vIGF2YWlsYWJsZSB0aGFuIHRoZSBvbmUgd2UgYWxyZWFkeSBo
YWQsIGFuZCBrZWVwaW5nIHRoZSBkaXJ0eSBmbGFnIHdpbGwKKyAgICAvLyByZXN1bHQgaW4gYW4g
ZW5kbGVzcyBsb29wIG9mIHVwZGF0aW5nIHRvIHRoZSBzYW1lIHRleHR1cmUuCisgICAgbV9jb250
ZW50c0RpcnR5ID0gZmFsc2U7CisKKyAgICBpZiAodGV4dHVyZSA9PSBtX3RleHR1cmUpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIE1vdmUgcHJvdGVjdGlvbiBvdmVyIHRvIHRoZSBuZXcgdGV4
dHVyZS4KKyAgICBpZiAobV92aXNpYmxlKSB7CisgICAgICAgIGlmIChtX3RleHR1cmUpCisgICAg
ICAgICAgICBtX3RleHR1cmUtPnVucHJvdGVjdCgpOworICAgICAgICBpZiAodGV4dHVyZSkKKyAg
ICAgICAgICAgIHRleHR1cmUtPnByb3RlY3QoKTsKKyAgICB9CisKKyAgICBtX3RleHR1cmUgPSB0
ZXh0dXJlOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wZWRkY2RhYWU3
MzNkMTNiY2UzNjg1YzA4ZjdhZGZkNDQ2ZGMyMzkxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGUuaApAQCAtMCww
ICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1v
dGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3Jp
dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisK
KyNpZm5kZWYgTGF5ZXJUaWxlX2gKKyNkZWZpbmUgTGF5ZXJUaWxlX2gKKworI2lmIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgIlRleHR1cmUuaCIKKworI2luY2x1ZGUg
PHd0Zi9SZWZQdHIuaD4KKworY2xhc3MgU2tCaXRtYXA7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworY2xhc3MgQ29sb3I7CitjbGFzcyBJbnRSZWN0OworY2xhc3MgVGlsZUluZGV4OworCitjbGFz
cyBMYXllclRpbGVEYXRhIHsKK3B1YmxpYzoKKyAgICBMYXllclRpbGVEYXRhKCkKKyAgICAgICAg
OiBtX3Zpc2libGUoZmFsc2UpCisgICAgeworICAgIH0KKworICAgIGJvb2wgaXNWaXNpYmxlKCkg
Y29uc3QgeyByZXR1cm4gbV92aXNpYmxlOyB9CisKK3Byb3RlY3RlZDoKKyAgICBib29sIG1fdmlz
aWJsZTsKK307CisKK2NsYXNzIExheWVyVGlsZSA6IHB1YmxpYyBMYXllclRpbGVEYXRhIHsKKyAg
ICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBMYXllclRpbGUoKTsKKyAg
ICB+TGF5ZXJUaWxlKCk7CisKKyAgICBUZXh0dXJlKiB0ZXh0dXJlKCkgY29uc3QgeyByZXR1cm4g
bV90ZXh0dXJlLmdldCgpOyB9CisKKyAgICBib29sIGlzVmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJu
IG1fdmlzaWJsZTsgfQorICAgIHZvaWQgc2V0VmlzaWJsZShib29sKTsKKworICAgIGJvb2wgaXNE
aXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudHNEaXJ0eSB8fCAhbV90ZXh0dXJlIHx8IG1f
dGV4dHVyZS0+aXNEaXJ0eSgpOyB9CisKKyAgICBib29sIGhhc1RleHR1cmUoKSBjb25zdCB7IHJl
dHVybiBtX3RleHR1cmUgJiYgbV90ZXh0dXJlLT5oYXNUZXh0dXJlKCk7IH0KKworICAgIHZvaWQg
c2V0Q29udGVudHMoY29uc3QgU2tCaXRtYXAmIGNvbnRlbnRzLCBjb25zdCBJbnRSZWN0JiB0aWxl
UmVjdCwgY29uc3QgVGlsZUluZGV4JiwgYm9vbCBpc09wYXF1ZSk7CisgICAgdm9pZCBzZXRDb250
ZW50c1RvQ29sb3IoY29uc3QgQ29sb3ImKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzKGNvbnN0
IFNrQml0bWFwJiBjb250ZW50cywgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0LCBjb25zdCBJbnRS
ZWN0JiB0aWxlUmVjdCk7CisgICAgdm9pZCBkaXNjYXJkQ29udGVudHMoKTsKKworICAgIC8vIFRo
ZSBjdXJyZW50IHRleHR1cmUgaXMgYW4gYWNjdXJhdGUgcHJldmlldyBvZiB0aGlzIGxheWVyLCBi
dXQgYSBtb3JlCisgICAgLy8gZGV0YWlsZWQgdGV4dHVyZSBjb3VsZCBiZSBvYnRhaW5lZCBieSBy
ZXBhaW50aW5nIHRoZSBsYXllci4gVXNlZCB3aGVuCisgICAgLy8gem9vbSBsZXZlbCBjaGFuZ2Vz
LgorICAgIHZvaWQgc2V0Q29udGVudHNEaXJ0eSgpIHsgbV9jb250ZW50c0RpcnR5ID0gdHJ1ZTsg
fQorCitwcml2YXRlOgorICAgIHZvaWQgc2V0VGV4dHVyZShQYXNzUmVmUHRyPFRleHR1cmU+KTsK
KworICAgIC8vIE5ldmVyIGFzc2lnbiB0byBtX3RleHR1cmUgZGlyZWN0bHksIHVzZSBzZXRUZXh0
dXJlKCkgYWJvdmUuCisgICAgUmVmUHRyPFRleHR1cmU+IG1fdGV4dHVyZTsKKyAgICBib29sIG1f
Y29udGVudHNEaXJ0eTsKK307CisKK30KKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKKworI2VuZGlmIC8vIFRleHR1cmVfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVJbmRleC5oIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVJbmRleC5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLjUwNzk3YWUxYmFkODAxZWExMzM4NTc4NGQ4NWU1NjRlYzc3MDJmMTQKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5
L0xheWVyVGlsZUluZGV4LmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxp
YnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1B
ICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIExheWVyVGlsZUluZGV4X2gKKyNkZWZp
bmUgTGF5ZXJUaWxlSW5kZXhfaAorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHd0Zi9I
YXNoTWFwLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgVGlsZUluZGV4IHsKK3B1
YmxpYzoKKyAgICBUaWxlSW5kZXgoKQorICAgICAgICA6IG1faShzdGQ6Om51bWVyaWNfbGltaXRz
PHVuc2lnbmVkPjo6bWF4KCkpCisgICAgICAgICwgbV9qKHN0ZDo6bnVtZXJpY19saW1pdHM8dW5z
aWduZWQ+OjptYXgoKSkKKyAgICB7CisgICAgfQorICAgIFRpbGVJbmRleCh1bnNpZ25lZCBpLCB1
bnNpZ25lZCBqKQorICAgICAgICA6IG1faShpKQorICAgICAgICAsIG1faihqKQorICAgIHsKKyAg
ICB9CisgICAgflRpbGVJbmRleCgpIHsgfQorCisgICAgdW5zaWduZWQgaSgpIGNvbnN0IHsgcmV0
dXJuIG1faTsgfQorICAgIHVuc2lnbmVkIGooKSBjb25zdCB7IHJldHVybiBtX2o7IH0KKyAgICB2
b2lkIHNldEluZGV4KHVuc2lnbmVkIGksIHVuc2lnbmVkIGopCisgICAgeworICAgICAgICBtX2kg
PSBpOworICAgICAgICBtX2ogPSBqOworICAgIH0KKworcHJpdmF0ZToKKyAgICB1bnNpZ25lZCBt
X2k7CisgICAgdW5zaWduZWQgbV9qOworfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBXZWJDb3JlOjpUaWxlSW5kZXgmIGEsIGNvbnN0IFdlYkNvcmU6OlRpbGVJbmRleCYgYikKK3sK
KyAgICByZXR1cm4gYS5pKCkgPT0gYi5pKCkgJiYgYS5qKCkgPT0gYi5qKCk7Cit9CisKK2lubGlu
ZSBib29sIG9wZXJhdG9yIT0oY29uc3QgV2ViQ29yZTo6VGlsZUluZGV4JiBhLCBjb25zdCBXZWJD
b3JlOjpUaWxlSW5kZXgmIGIpCit7CisgICAgcmV0dXJuIGEuaSgpICE9IGIuaSgpIHx8IGEuaigp
ICE9IGIuaigpOworfQorCit9CisKK25hbWVzcGFjZSBXVEYgeworCit0ZW1wbGF0ZTw+IHN0cnVj
dCBJbnRIYXNoPFdlYkNvcmU6OlRpbGVJbmRleD4geworICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNo
KGNvbnN0IFdlYkNvcmU6OlRpbGVJbmRleCYga2V5KSB7IHJldHVybiBpbnRIYXNoKChzdGF0aWNf
Y2FzdDx1aW50NjRfdD4oa2V5LmkoKSkgPDwgMzIgfCBrZXkuaigpKSk7IH0KKyAgICBzdGF0aWMg
Ym9vbCBlcXVhbChjb25zdCBXZWJDb3JlOjpUaWxlSW5kZXgmIGEsIGNvbnN0IFdlYkNvcmU6OlRp
bGVJbmRleCYgYikgeyByZXR1cm4gYSA9PSBiOyB9CisgICAgc3RhdGljIGNvbnN0IGJvb2wgc2Fm
ZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVlOworfTsKK3RlbXBsYXRlPD4gc3RydWN0
IERlZmF1bHRIYXNoPFdlYkNvcmU6OlRpbGVJbmRleD4geworICAgIHR5cGVkZWYgSW50SGFzaDxX
ZWJDb3JlOjpUaWxlSW5kZXg+IEhhc2g7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBIYXNoVHJh
aXRzPFdlYkNvcmU6OlRpbGVJbmRleD4gOiBHZW5lcmljSGFzaFRyYWl0czxXZWJDb3JlOjpUaWxl
SW5kZXg+IHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBlbXB0eVZhbHVlSXNaZXJvID0gZmFsc2U7
CisgICAgc3RhdGljIGNvbnN0IGJvb2wgbmVlZHNEZXN0cnVjdGlvbiA9IGZhbHNlOworICAgIHN0
YXRpYyBXZWJDb3JlOjpUaWxlSW5kZXggZW1wdHlWYWx1ZSgpIHsgcmV0dXJuIFdlYkNvcmU6OlRp
bGVJbmRleCgpOyB9CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0RGVsZXRlZFZhbHVlKFdlYkNv
cmU6OlRpbGVJbmRleCYgc2xvdCkKKyAgICB7CisgICAgICAgIG5ldyAoJnNsb3QpIFdlYkNvcmU6
OlRpbGVJbmRleChzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgLSAxLCBzdGQ6
Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgLSAxKTsKKyAgICB9CisgICAgc3RhdGlj
IGJvb2wgaXNEZWxldGVkVmFsdWUoY29uc3QgV2ViQ29yZTo6VGlsZUluZGV4JiB2YWx1ZSkKKyAg
ICB7CisgICAgICAgIHJldHVybiB2YWx1ZS5pKCkgPT0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNp
Z25lZD46Om1heCgpIC0gMSAmJiB2YWx1ZS5qKCkgPT0gc3RkOjpudW1lcmljX2xpbWl0czx1bnNp
Z25lZD46Om1heCgpIC0gMTsKKyAgICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBXVEYKKworI2Vu
ZGlmIC8vIExheWVyVGlsZUluZGV4X2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZXIuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjhl
M2IxZmU3MDI0NWYyNzkwYjQ5ZTVkODUyM2Y5MzJjZjFkOTE0ZTMKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZXIu
Y3BwCkBAIC0wLDAgKzEsNzQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJl
c2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEg
IFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKworI2luY2x1ZGUgIkxheWVyVGlsZXIuaCIKKworI2luY2x1ZGUgIkJpdG1h
cEltYWdlLmgiCisjaW5jbHVkZSAiTGF5ZXJDb21wb3NpdGluZ1RocmVhZC5oIgorI2luY2x1ZGUg
IkxheWVyTWVzc2FnZS5oIgorI2luY2x1ZGUgIkxheWVyV2ViS2l0VGhyZWFkLmgiCisjaW5jbHVk
ZSAiTmF0aXZlSW1hZ2VTa2lhLmgiCisjaW5jbHVkZSAiVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdU
aHJlYWQuaCIKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVNjcmVlbi5oPgorI2luY2x1
ZGUgPEdMRVMyL2dsMi5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKKy8vIFRoaXMgaXMgdXNlZCB0byBtYWtlIHRoZSB2aWV3cG9ydCBhcyB1c2VkIGlu
IHRleHR1cmUgdmlzaWJpbGl0eSBjYWxjdWxhdGlvbnMKKy8vIHNsaWdodGx5IGxhcmdlciBzbyB0
ZXh0dXJlcyBhcmUgdXBsb2FkZWQgYmVmb3JlIGJlY29taW5nIHJlYWxseSB2aXNpYmxlLgorY29u
c3QgZmxvYXQgdmlld3BvcnRJbmZsYXRpb25GYWN0b3IgPSAxLjFmOworCisvLyBUaGUgdGlsZU11
bHRpcGxpZXIgaW5kaWNhdGVzIGhvdyBtYW55IHRpbGVzIHdpbGwgZml0IGluIHRoZSBsYXJnZXN0
IGRpbWVuc2lvbgorLy8gb2YgdGhlIHNjcmVlbiwgaWYgZHJhd24gdXNpbmcgaWRlbnRpdHkgdHJh
bnNmb3JtLgorLy8gV2UgdXNlIGhhbGYgdGhlIHNjcmVlbiBzaXplIGFzIHRpbGUgc2l6ZSwgdG8g
cmVkdWNlIHRoZSB0ZXh0dXJlIHVwbG9hZCB0aW1lCisvLyBmb3Igc21hbGwgcmVwYWludCByZWN0
cy4gQ29tcGFyZWQgdG8gdXNpbmcgc2NyZWVuIHNpemUgZGlyZWN0bHksIHRoaXMgc2hvdWxkCisv
LyBtYWtlIG1vc3Qgc21hbGwgaW52YWxpZGF0aW9ucyAxNnggZmFzdGVyLCB1bmxlc3MgdGhleSdy
ZSB1bmZvcnR1bmF0ZSBlbm91Z2gKKy8vIHRvIGludGVyc2VjdCB0d28gb3IgbW9yZSB0aWxlcywg
d2hlcmUgaXQgd291bGQgYmUgOHgtMXggZmFzdGVyLgorY29uc3QgaW50IHRpbGVNdWx0aXBsaWVy
ID0gNDsKKworc3RhdGljIHZvaWQgdHJhbnNmb3JtUG9pbnQoZmxvYXQgeCwgZmxvYXQgeSwgY29u
c3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG0sIGZsb2F0KiByZXN1bHQpCit7CisgICAgLy8gU3F1
YXNoIHRoZSBaIGNvb3JkaW5hdGUgc28gdGhhdCBsYXllcnMgYXJlbid0IGNsaXBwZWQgYWdhaW5z
dCB0aGUgbmVhciBhbmQKKyAgICAvLyBmYXIgcGxhbmUuIE5vdGUgdGhhdCB0aGUgcGVyc3BlY3Rp
dmUgaXMgbWFpbnRhaW5lZCBhcyB3ZSdyZSBzdGlsbCBwYXNzaW5nCisgICAgLy8gZG93biB0aGUg
VyBjb29yZGluYXRlLgorICAgIHJlc3VsdFswXSA9IHggKiBtLm0xMSgpICsgeSAqIG0ubTIxKCkg
KyBtLm00MSgpOworICAgIHJlc3VsdFsxXSA9IHggKiBtLm0xMigpICsgeSAqIG0ubTIyKCkgKyBt
Lm00MigpOworICAgIHJlc3VsdFsyXSA9IDA7CisgICAgcmVzdWx0WzNdID0geCAqIG0ubTE0KCkg
KyB5ICogbS5tMjQoKSArIG0ubTQ0KCk7Cit9CisKK0xheWVyVGlsZXI6OkxheWVyVGlsZXIoTGF5
ZXJXZWJLaXRUaHJlYWQqIGxheWVyKQorICAgIDogbV9sYXllcihsYXllcikKKyAgICAsIG1fdGls
aW5nRGlzYWJsZWQoZmFsc2UpCisgICAgLCBtX2NvbnRlbnRzRGlydHkoZmFsc2UpCisgICAgLCBt
X3RpbGVTaXplKGRlZmF1bHRUaWxlU2l6ZSgpKQorICAgICwgbV9jbGVhclRleHR1cmVKb2JzKGZh
bHNlKQorICAgICwgbV9oYXNNaXNzaW5nVGV4dHVyZXMoZmFsc2UpCisgICAgLCBtX2NvbnRlbnRz
U2NhbGUoMC4wKQoreworfQorCitMYXllclRpbGVyOjp+TGF5ZXJUaWxlcigpCit7CisgICAgLy8g
U29tZW9uZSBzaG91bGQgaGF2ZSBjYWxsZWQgTGF5ZXJUaWxlcjo6ZGVsZXRlVGV4dHVyZXMoKQor
ICAgIC8vIGJlZm9yZSBub3cuIFdlIGNhbid0IGNhbGwgaXQgaGVyZSBiZWNhdXNlIHdlIGhhdmUg
bm8KKyAgICAvLyBPcGVuR0wgY29udGV4dC4KKyAgICBBU1NFUlQobV90aWxlc0NvbXBvc2l0aW5n
VGhyZWFkLmlzRW1wdHkoKSk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6bGF5ZXJXZWJLaXRUaHJl
YWREZXN0cm95ZWQoKQoreworICAgIG1fbGF5ZXIgPSAwOworfQorCit2b2lkIExheWVyVGlsZXI6
OmxheWVyQ29tcG9zaXRpbmdUaHJlYWREZXN0cm95ZWQoKQoreworICAgIEFTU0VSVChpc0NvbXBv
c2l0aW5nVGhyZWFkKCkpOworfQorCit2b2lkIExheWVyVGlsZXI6OnNldE5lZWRzRGlzcGxheShj
b25zdCBGbG9hdFJlY3QmIGRpcnR5UmVjdCkKK3sKKyAgICBtX2RpcnR5UmVjdC51bml0ZShkaXJ0
eVJlY3QpOworICAgIG1fY29udGVudHNEaXJ0eSA9IHRydWU7Cit9CisKK3ZvaWQgTGF5ZXJUaWxl
cjo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAgICBtX2RpcnR5UmVjdC5zZXRMb2NhdGlvbihGbG9h
dFBvaW50KCkpOworICAgIG1fZGlydHlSZWN0LnNldFNpemUobV9sYXllci0+Ym91bmRzKCkpOwor
ICAgIG1fY29udGVudHNEaXJ0eSA9IHRydWU7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6dXBkYXRl
VGV4dHVyZUNvbnRlbnRzSWZOZWVkZWQoZG91YmxlIHNjYWxlKQoreworICAgIHVwZGF0ZVRpbGVT
aXplKCk7CisKKyAgICBIYXNoU2V0PFRpbGVJbmRleD4gcmVuZGVySm9iczsKKyAgICB7CisgICAg
ICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX3JlbmRlckpvYnNNdXRleCk7CisgICAgICAgIGlmICgh
bV9jb250ZW50c0RpcnR5ICYmIG1fcmVuZGVySm9icy5pc0VtcHR5KCkpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIHJlbmRlckpvYnMgPSBtX3JlbmRlckpvYnM7CisgICAgfQorCisgICAg
Ym9vbCBpc1pvb21Kb2IgPSBmYWxzZTsKKyAgICBpZiAoc2NhbGUgIT0gbV9jb250ZW50c1NjYWxl
KSB7CisgICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIGFyb3VuZCwgaXQgZG9lcyBub3QgY291bnQg
YXMgYSB6b29tIGpvYi4KKyAgICAgICAgaWYgKG1fY29udGVudHNTY2FsZSkKKyAgICAgICAgICAg
IGlzWm9vbUpvYiA9IHRydWU7CisgICAgICAgIG1fY29udGVudHNTY2FsZSA9IHNjYWxlOworICAg
IH0KKworICAgIEludFJlY3QgZGlydHlSZWN0ID0gZW5jbG9zaW5nSW50UmVjdChtX2RpcnR5UmVj
dCk7CisgICAgSW50U2l6ZSByZXF1aXJlZFRleHR1cmVTaXplOworCisgICAgaWYgKG1fbGF5ZXIt
PmRyYXdzQ29udGVudCgpKSB7CisgICAgICAgIC8vIExheWVyIGNvbnRlbnRzIG11c3QgYmUgZHJh
d24gaW50byBhIGNhbnZhcy4KKyAgICAgICAgSW50UmVjdCB1bnRyYW5zZm9ybWVkRGlydHlSZWN0
KGRpcnR5UmVjdCk7CisgICAgICAgIEludFJlY3QgYm91bmRzUmVjdChJbnRQb2ludDo6emVybygp
LCBtX2xheWVyLT5ib3VuZHMoKSk7CisgICAgICAgIEludFJlY3QgdW50cmFuc2Zvcm1lZEJvdW5k
c1JlY3QoYm91bmRzUmVjdCk7CisgICAgICAgIHJlcXVpcmVkVGV4dHVyZVNpemUgPSBib3VuZHNS
ZWN0LnNpemUoKTsKKworICAgICAgICBpZiAoc2NhbGUgIT0gMS4wKSB7CisgICAgICAgICAgICBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCBtYXRyaXg7CisgICAgICAgICAgICBtYXRyaXguc2NhbGUoc2Nh
bGUpOworCisgICAgICAgICAgICBkaXJ0eVJlY3QgPSBtYXRyaXgubWFwUmVjdCh1bnRyYW5zZm9y
bWVkRGlydHlSZWN0KTsKKyAgICAgICAgICAgIHJlcXVpcmVkVGV4dHVyZVNpemUgPSBtYXRyaXgu
bWFwUmVjdChJbnRSZWN0KEludFBvaW50Ojp6ZXJvKCksIHJlcXVpcmVkVGV4dHVyZVNpemUpKS5z
aXplKCk7CisgICAgICAgICAgICBib3VuZHNSZWN0ID0gbWF0cml4Lm1hcFJlY3QodW50cmFuc2Zv
cm1lZEJvdW5kc1JlY3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVpcmVkVGV4dHVy
ZVNpemUgIT0gbV9wZW5kaW5nVGV4dHVyZVNpemUpCisgICAgICAgICAgICBkaXJ0eVJlY3QgPSBi
b3VuZHNSZWN0OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIENsaXAgdGhlIGRpcnR5
UmVjdCB0byB0aGUgc2l6ZSBvZiB0aGUgbGF5ZXIgdG8gYXZvaWQgZHJhd2luZworICAgICAgICAg
ICAgLy8gb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBiYWNraW5nIHRleHR1cmUuCisgICAgICAg
ICAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KGJvdW5kc1JlY3QpOworICAgICAgICB9CisgICAgfSBl
bHNlIGlmIChtX2xheWVyLT5jb250ZW50cygpKSB7CisgICAgICAgIC8vIExheWVyIGlzIGEgY29u
dGFpbmVyLCBhbmQgaXQgY29udGFpbnMgYW4gSW1hZ2UuCisgICAgICAgIHJlcXVpcmVkVGV4dHVy
ZVNpemUgPSBtX2xheWVyLT5jb250ZW50cygpLT5zaXplKCk7CisgICAgICAgIGRpcnR5UmVjdCA9
IEludFJlY3QoSW50UG9pbnQoKSwgcmVxdWlyZWRUZXh0dXJlU2l6ZSk7CisgICAgfQorCisgICAg
Ly8gSWYgd2UgbmVlZCBkaXNwbGF5IGJlY2F1c2Ugd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gYmUgZGlz
cGxheWVkLCBkdWUgdG8gdGV4dHVyZSBzaXplIGJlY29taW5nIDAgeCAwLAorICAgIC8vIG9yIGlm
IHdlJ3JlIHJlLXJlbmRlcmluZyB0aGUgd2hvbGUgdGhpbmcgYW55d2F5LCBjbGVhciBvbGQgdGV4
dHVyZSBqb2JzLgorICAgIEhhc2hTZXQ8VGlsZUluZGV4PiBmaW5pc2hlZEpvYnM7CisgICAgaWYg
KHJlcXVpcmVkVGV4dHVyZVNpemUuaXNFbXB0eSgpIHx8IGRpcnR5UmVjdCA9PSBJbnRSZWN0KElu
dFBvaW50KCksIHJlcXVpcmVkVGV4dHVyZVNpemUpKSB7CisgICAgICAgIHsKKyAgICAgICAgICAg
IE11dGV4TG9ja2VyIGxvY2tlcihtX3JlbmRlckpvYnNNdXRleCk7CisgICAgICAgICAgICBtX3Jl
bmRlckpvYnMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBjbGVhclRleHR1cmVKb2JzKCk7
CisgICAgfSBlbHNlIGlmICghcmVuZGVySm9icy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKElt
YWdlKiBpbWFnZSA9IG1fbGF5ZXItPmNvbnRlbnRzKCkpIHsKKyAgICAgICAgICAgIGJvb2wgaXNP
cGFxdWUgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChpbWFnZS0+aXNCaXRtYXBJbWFnZSgpKQor
ICAgICAgICAgICAgICAgIGlzT3BhcXVlID0gIXN0YXRpY19jYXN0PEJpdG1hcEltYWdlKj4oaW1h
Z2UpLT5jdXJyZW50RnJhbWVIYXNBbHBoYSgpOworICAgICAgICAgICAgaWYgKE5hdGl2ZUltYWdl
UHRyIG5hdGl2ZUltYWdlID0gaW1hZ2UtPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCkpIHsK
KyAgICAgICAgICAgICAgICBTa0JpdG1hcCBiaXRtYXAgPSBTa0JpdG1hcCgqbmF0aXZlSW1hZ2Up
OworICAgICAgICAgICAgICAgIGFkZFRleHR1cmVKb2IoVGV4dHVyZUpvYjo6c2V0Q29udGVudHMo
Yml0bWFwLCBpc09wYXF1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgLy8gVGhlcmUgbWlnaHQgc3RpbGwgYmUgc29tZSBwZW5kaW5nIHJlbmRlciBqb2Jz
IGR1ZSB0byB2aXNpYmlsaXR5IGNoYW5nZXMuCisgICAgICAgICAgICBmb3IgKEhhc2hTZXQ8VGls
ZUluZGV4Pjo6aXRlcmF0b3IgaXQgPSByZW5kZXJKb2JzLmJlZ2luKCk7IGl0ICE9IHJlbmRlckpv
YnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAg
IC8vIENoZWNrIGlmIHRoZSBqb2IgaGFzIGJlZW4gY2FuY2VsbGVkLgorICAgICAgICAgICAgICAg
ICAgICBNdXRleExvY2tlciBsb2NrZXIobV9yZW5kZXJKb2JzTXV0ZXgpOworICAgICAgICAgICAg
ICAgICAgICBpZiAoIW1fcmVuZGVySm9icy5jb250YWlucygqaXQpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIG1fcmVuZGVySm9icy5yZW1v
dmUoKml0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJbnRSZWN0IHRp
bGVSZWN0ID0gcmVjdEZvclRpbGUoKml0LCByZXF1aXJlZFRleHR1cmVTaXplKTsKKyAgICAgICAg
ICAgICAgICBpZiAodGlsZVJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKKworICAgICAgICAgICAgICAgIGJvb2wgaXNTb2xpZENvbG9yID0gZmFsc2U7CisgICAg
ICAgICAgICAgICAgQ29sb3IgY29sb3I7CisgICAgICAgICAgICAgICAgU2tCaXRtYXAgYml0bWFw
ID0gbV9sYXllci0+cGFpbnRDb250ZW50cyh0aWxlUmVjdCwgc2NhbGUsICZpc1NvbGlkQ29sb3Is
ICZjb2xvcik7CisgICAgICAgICAgICAgICAgLy8gYml0bWFwIGNhbiBiZSBudWxsIGhlcmUuIE1h
a2UgcmVxdWlyZWRUZXh0dXJlU2l6ZSBlbXB0eSBzbyB0aGF0IHdlCisgICAgICAgICAgICAgICAg
Ly8gd2lsbCBub3QgdHJ5IHRvIHVwZGF0ZSBhbmQgZHJhdyB0aGUgbGF5ZXIuCisgICAgICAgICAg
ICAgICAgaWYgKCFiaXRtYXAuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlz
U29saWRDb2xvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRleHR1cmVKb2IoVGV4dHVy
ZUpvYjo6c2V0Q29udGVudHNUb0NvbG9yKGNvbG9yLCAqaXQpKTsKKyAgICAgICAgICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkVGV4dHVyZUpvYihUZXh0dXJlSm9i
Ojp1cGRhdGVDb250ZW50cyhiaXRtYXAsIHRpbGVSZWN0KSk7CisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgZmluaXNoZWRKb2JzLmFkZCgqaXQpOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBkaWRSZXNpemUgPSBmYWxzZTsKKyAgICBpZiAo
bV9wZW5kaW5nVGV4dHVyZVNpemUgIT0gcmVxdWlyZWRUZXh0dXJlU2l6ZSkgeworICAgICAgICBk
aWRSZXNpemUgPSB0cnVlOworICAgICAgICBtX3BlbmRpbmdUZXh0dXJlU2l6ZSA9IHJlcXVpcmVk
VGV4dHVyZVNpemU7CisgICAgICAgIGFkZFRleHR1cmVKb2IoVGV4dHVyZUpvYjo6cmVzaXplQ29u
dGVudHMobV9wZW5kaW5nVGV4dHVyZVNpemUpKTsKKyAgICB9CisgICAgbV9jb250ZW50c0RpcnR5
ID0gZmFsc2U7CisgICAgbV9kaXJ0eVJlY3QgPSBGbG9hdFJlY3QoKTsKKworICAgIGlmIChkaXJ0
eVJlY3QuaXNFbXB0eSgpIHx8IHJlcXVpcmVkVGV4dHVyZVNpemUuaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBpZiAoSW1hZ2UqIGltYWdlID0gbV9sYXllci0+Y29udGVudHMoKSkg
eworICAgICAgICBib29sIGlzT3BhcXVlID0gZmFsc2U7CisgICAgICAgIGlmIChpbWFnZS0+aXNC
aXRtYXBJbWFnZSgpKQorICAgICAgICAgICAgaXNPcGFxdWUgPSAhc3RhdGljX2Nhc3Q8Qml0bWFw
SW1hZ2UqPihpbWFnZSktPmN1cnJlbnRGcmFtZUhhc0FscGhhKCk7CisgICAgICAgIC8vIE5vIHBv
aW50IGluIHRpbGluZyBhbiBpbWFnZSBsYXllciwgdGhlIGltYWdlIGlzIGFscmVhZHkgc3RvcmVk
IGFzIGFuIFNrQml0bWFwCisgICAgICAgIE5hdGl2ZUltYWdlUHRyIG5hdGl2ZUltYWdlID0gbV9s
YXllci0+Y29udGVudHMoKS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICAgICAg
aWYgKG5hdGl2ZUltYWdlKSB7CisgICAgICAgICAgICBTa0JpdG1hcCBiaXRtYXAgPSBTa0JpdG1h
cCgqbmF0aXZlSW1hZ2UpOworICAgICAgICAgICAgYWRkVGV4dHVyZUpvYihUZXh0dXJlSm9iOjpz
ZXRDb250ZW50cyhiaXRtYXAsIGlzT3BhcXVlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIEludFBvaW50IHRvcExlZnQgPSBkaXJ0eVJlY3QubWluWE1pbllDb3Ju
ZXIoKTsKKyAgICBJbnRQb2ludCBib3R0b21SaWdodCA9IGRpcnR5UmVjdC5tYXhYTWF4WUNvcm5l
cigpOyAvLyBUaGlzIGlzIGFjdHVhbGx5IGEgcGl4ZWwgYmVsb3cgYW5kIHRvIHRoZSByaWdodCBv
ZiB0aGUgZGlydHlSZWN0LgorCisgICAgSW50U2l6ZSB0aWxlTWF4aW11bVNpemUgPSB0aWxlU2l6
ZSgpOworICAgIGJvb2wgd2FzT25lVGlsZSA9IG1fdGlsZXNXZWJLaXRUaHJlYWQuc2l6ZSgpID09
IDE7CisgICAgYm9vbCBpc09uZVRpbGUgPSBtX3BlbmRpbmdUZXh0dXJlU2l6ZS53aWR0aCgpIDw9
IHRpbGVNYXhpbXVtU2l6ZS53aWR0aCgpICYmIG1fcGVuZGluZ1RleHR1cmVTaXplLmhlaWdodCgp
IDw9IHRpbGVNYXhpbXVtU2l6ZS5oZWlnaHQoKTsKKyAgICBJbnRQb2ludCBvcmlnaW4gPSBvcmln
aW5PZlRpbGUoaW5kZXhPZlRpbGUodG9wTGVmdCkpOworICAgIEludFJlY3QgdGlsZVJlY3Q7Cisg
ICAgZm9yICh0aWxlUmVjdC5zZXRYKG9yaWdpbi54KCkpOyB0aWxlUmVjdC54KCkgPCBib3R0b21S
aWdodC54KCk7IHRpbGVSZWN0LnNldFgodGlsZVJlY3QueCgpICsgdGlsZU1heGltdW1TaXplLndp
ZHRoKCkpKSB7CisgICAgICAgIGZvciAodGlsZVJlY3Quc2V0WShvcmlnaW4ueSgpKTsgdGlsZVJl
Y3QueSgpIDwgYm90dG9tUmlnaHQueSgpOyB0aWxlUmVjdC5zZXRZKHRpbGVSZWN0LnkoKSArIHRp
bGVNYXhpbXVtU2l6ZS5oZWlnaHQoKSkpIHsKKyAgICAgICAgICAgIHRpbGVSZWN0LnNldFdpZHRo
KG1pbihyZXF1aXJlZFRleHR1cmVTaXplLndpZHRoKCkgLSB0aWxlUmVjdC54KCksIHRpbGVNYXhp
bXVtU2l6ZS53aWR0aCgpKSk7CisgICAgICAgICAgICB0aWxlUmVjdC5zZXRIZWlnaHQobWluKHJl
cXVpcmVkVGV4dHVyZVNpemUuaGVpZ2h0KCkgLSB0aWxlUmVjdC55KCksIHRpbGVNYXhpbXVtU2l6
ZS5oZWlnaHQoKSkpOworCisgICAgICAgICAgICBJbnRSZWN0IGxvY2FsRGlydHlSZWN0KGRpcnR5
UmVjdCk7CisgICAgICAgICAgICBsb2NhbERpcnR5UmVjdC5pbnRlcnNlY3QodGlsZVJlY3QpOwor
ICAgICAgICAgICAgaWYgKGxvY2FsRGlydHlSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICAgICAgVGlsZUluZGV4IGluZGV4ID0gaW5kZXhPZlRpbGUo
dGlsZVJlY3QubG9jYXRpb24oKSk7CisKKyAgICAgICAgICAgIC8vIElmIHdlIGFscmVhZHkgZGlk
IHRoaXMgYXMgcGFydCBvZiBvbmUgb2YgdGhlIHJlbmRlciBqb2JzIGR1ZSB0bworICAgICAgICAg
ICAgLy8gdmlzaWJpbGl0eSBjaGFuZ2VzLCBkb24ndCByZW5kZXIgdGhhdCB0aWxlIGFnYWluLgor
ICAgICAgICAgICAgaWYgKGZpbmlzaGVkSm9icy5jb250YWlucyhpbmRleCkpCisgICAgICAgICAg
ICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmICghc2hvdWxkUGVyZm9ybVJlbmRlckpv
YihpbmRleCwgIWlzWm9vbUpvYikpIHsKKyAgICAgICAgICAgICAgICAvLyBBdm9pZCBjaGVja2Vy
Ym9hcmRpbmcgdW5sZXNzIHRoZSBsYXllciBpcyByZXNpemVkLiBXaGVuCisgICAgICAgICAgICAg
ICAgLy8gcmVzaXplZCwgdGhlIGNvbnRlbnRzIGFyZSBsaWtlbHkgdG8gY2hhbmdlIGFwcGVhcmFu
Y2UsIGZvcgorICAgICAgICAgICAgICAgIC8vIGV4YW1wbGUgZHVlIHRvIGFzcGVjdCByYXRpbyBj
aGFuZ2UuIEhvd2V2ZXIsIGlmIGl0IGlzIGEKKyAgICAgICAgICAgICAgICAvLyByZXNpemUgZHVl
IHRvIHpvb21pbmcsIHRoZSBhc3BlY3QgcmF0aW8gYW5kIGNvbnRlbnQgd2lsbAorICAgICAgICAg
ICAgICAgIC8vIHN0YXkgdGhlIHNhbWUsIGFuZCB3ZSBjYW4ga2VlcCB0aGUgb2xkIHRleHR1cmUg
Y29udGVudCBhcyBhCisgICAgICAgICAgICAgICAgLy8gcHJldmlldy4KKyAgICAgICAgICAgICAg
ICAvLyBGSVhNRTogdGhlIHpvb20gcHJldmlldyBvbmx5IHdvcmtzIGlmIHdlIGRvbid0IHJlLXRp
bGUgdGhlCisgICAgICAgICAgICAgICAgLy8gbGF5ZXIuIFdlIG5lZWQgdG8gc3RvcmUgdGV4dHVy
ZSBjb29yZGluYXRlcyBpbgorICAgICAgICAgICAgICAgIC8vIFdlYkNvcmU6OlRleHR1cmUgdG8g
YmUgYWJsZSB0byBmaXggdGhhdC4KKyAgICAgICAgICAgICAgICBpZiAoZGlkUmVzaXplICYmICEo
aXNab29tSm9iICYmIHdhc09uZVRpbGUgJiYgaXNPbmVUaWxlKSkKKyAgICAgICAgICAgICAgICAg
ICAgYWRkVGV4dHVyZUpvYihUZXh0dXJlSm9iOjpkaXNjYXJkQ29udGVudHModGlsZVJlY3QpKTsK
KyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGFkZFRleHR1cmVKb2Io
VGV4dHVyZUpvYjo6ZGlydHlDb250ZW50cyh0aWxlUmVjdCkpOworICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBKdXN0IGluIGNhc2UgYSBu
ZXcgam9iIGZvciB0aGlzIHRpbGUgaGFzIGp1c3QgYmVlbiBpbnNlcnRlZCBieSBjb21wb3NpdGlu
ZyB0aHJlYWQuCisgICAgICAgICAgICByZW1vdmVSZW5kZXJKb2IoaW5kZXgpOworCisgICAgICAg
ICAgICAvLyBGSVhNRTogV2UgYXJlIGFsd2F5cyBkcmF3aW5nIHdob2xlIHRpbGVzIGF0IHRoZSBt
b21lbnQsIGJlY2F1c2UKKyAgICAgICAgICAgIC8vIHdlIGN1cnJlbnRseSBjYW4ndCBrZWVwIHRy
YWNrIG9mIHdoaWNoIHBhcnQgb2YgYSB0aWxlIGlzCisgICAgICAgICAgICAvLyByZW5kZXJlZCBh
bmQgd2hpY2ggaXMgbm90LiBTZW5kaW5nIG9ubHkgYSBzdWJyZWN0YW5nbGUgb2YgYSB0aWxlCisg
ICAgICAgICAgICAvLyB0byB0aGUgY29tcG9zaXRpbmcgdGhyZWFkIG1pZ2h0IGNhdXNlIGl0IHRv
IGJlIHVwbG9hZGVkIHVzaW5nCisgICAgICAgICAgICAvLyBnbFRleEltYWdlLCBpZiB0aGUgdGV4
dHVyZSB3YXMgcHJldmlvdXNseSBldmljdGVkIGZyb20gdGhlIGNhY2hlLgorICAgICAgICAgICAg
Ly8gVGhlIHJlc3VsdCB3b3VsZCBiZSB0aGF0IGEgc3VicmVjdGFuZ2xlIG9mIHRoZSB0aWxlIHdh
cyBzdHJldGNoZWQKKyAgICAgICAgICAgIC8vIHRvIGZpdCB0aGUgdGlsZSBnZW9tZXRyeSwgYXBw
ZWFyaW5nIGFzIGEgZ2xhcmluZyBtaXNyZW5kZXJpbmcgb2YKKyAgICAgICAgICAgIC8vIHRoZSB3
ZWIgcGFnZS4KKyAgICAgICAgICAgIGJvb2wgaXNTb2xpZENvbG9yID0gZmFsc2U7CisgICAgICAg
ICAgICBDb2xvciBjb2xvcjsKKyAgICAgICAgICAgIFNrQml0bWFwIGJpdG1hcCA9IG1fbGF5ZXIt
PnBhaW50Q29udGVudHModGlsZVJlY3QsIHNjYWxlLCAmaXNTb2xpZENvbG9yLCAmY29sb3IpOwor
ICAgICAgICAgICAgLy8gYml0bWFwIGNhbiBiZSBudWxsIGhlcmUuIE1ha2UgcmVxdWlyZWRUZXh0
dXJlU2l6ZSBlbXB0eSBzbyB0aGF0IHdlCisgICAgICAgICAgICAvLyB3aWxsIG5vdCB0cnkgdG8g
dXBkYXRlIGFuZCBkcmF3IHRoZSBsYXllci4KKyAgICAgICAgICAgIGlmICghYml0bWFwLmlzTnVs
bCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzU29saWRDb2xvcikKKyAgICAgICAgICAgICAg
ICAgICAgYWRkVGV4dHVyZUpvYihUZXh0dXJlSm9iOjpzZXRDb250ZW50c1RvQ29sb3IoY29sb3Is
IGluZGV4KSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBhZGRU
ZXh0dXJlSm9iKFRleHR1cmVKb2I6OnVwZGF0ZUNvbnRlbnRzKGJpdG1hcCwgdGlsZVJlY3QpKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBMYXllclRpbGVyOjpz
aG91bGRQZXJmb3JtUmVuZGVySm9iKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIGJvb2wgYWxsb3dQ
cmVmaWxsKQoreworICAgIC8vIElmIHRoZSB2aXNpYmlsaXR5IGluZm9ybWF0aW9uIHdhcyBwcm9w
YWdhdGVkIGZyb20gdGhlIGNvbXBvc2l0aW5nCisgICAgLy8gdGhyZWFkLCB1c2UgdGhhdCBpbmZv
cm1hdGlvbi4KKyAgICAvLyBIb3dldmVyLCB3ZSBhcmUgYWJvdXQgdG8gY29tbWl0IG5ldyBsYXll
ciBwcm9wZXJ0aWVzIHRoYXQgbWF5IG1ha2UKKyAgICAvLyBjdXJyZW50bHkgaGlkZGVuIGxheWVy
cyB2aXNpYmxlLiBUbyBhdm9pZCBmYWxzZSBuZWdhdGl2ZXMsIHdlIG9ubHkgYWxsb3cKKyAgICAv
LyB0aGUgY3VycmVudCBzdGF0ZSB0byBiZSB1c2VkIHRvIGFjY2VwdCByZW5kZXIgam9icywgbm90
IHRvIHJlamVjdCB0aGVtLgorICAgIGlmIChtX3RpbGVzV2ViS2l0VGhyZWFkLmdldChpbmRleCku
aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gVGlsZXMgdGhhdCBh
cmUgbm90IGN1cnJlbnRseSB2aXNpYmxlIG9uIHRoZSBjb21wb3NpdGluZyB0aHJlYWQgbWF5IHN0
aWxsCisgICAgLy8gZGVzZXJ2ZSB0byBiZSByZW5kZXJlZCBpZiB0aGV5IHNob3VsZCBiZSBwcmVm
aWxsZWQuLi4KKyAgICBpZiAoYWxsb3dQcmVmaWxsICYmICFtX3RpbGVzV2ViS2l0VGhyZWFkLmNv
bnRhaW5zKGluZGV4KSAmJiBzaG91bGRQcmVmaWxsVGlsZShpbmRleCkpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgLy8gT3IgaWYgdGhleSBhcmUgdmlzaWJsZSBhY2NvcmRpbmcgdG8gdGhl
IHN0YXRlIHRoYXQncyBhYm91dCB0byBiZQorICAgIC8vIGNvbW1pdHRlZC4gV2UgZG8gYSB2aXNp
YmlsaXR5IHRlc3QgdXNpbmcgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIHN0YXRlLgorICAgIEludFJl
Y3QgY29udGVudFJlY3QgPSByZWN0Rm9yVGlsZShpbmRleCwgbV9wZW5kaW5nVGV4dHVyZVNpemUp
OworICAgIHJldHVybiBtX2xheWVyLT5jb250ZW50c1Zpc2libGUoY29udGVudFJlY3QpOworfQor
Cit2b2lkIExheWVyVGlsZXI6OmFkZFRleHR1cmVKb2IoY29uc3QgVGV4dHVyZUpvYiYgam9iKQor
eworICAgIG1fcGVuZGluZ1RleHR1cmVKb2JzLmFwcGVuZChqb2IpOworfQorCit2b2lkIExheWVy
VGlsZXI6OmNsZWFyVGV4dHVyZUpvYnMoKQoreworICAgIC8vIENsZWFyIGFueSBjb21taXR0ZWQg
dGV4dHVyZSBqb2JzIG9uIG5leHQgaW52b2NhdGlvbiBvZiBMYXllclRpbGVyOjpjb21taXRQZW5k
aW5nVGV4dHVyZVVwbG9hZHMoKS4KKyAgICBtX2NsZWFyVGV4dHVyZUpvYnMgPSB0cnVlOworCisg
ICAgcmVtb3ZlVXBkYXRlQ29udGVudHNKb2JzKG1fcGVuZGluZ1RleHR1cmVKb2JzKTsKK30KKwor
dm9pZCBMYXllclRpbGVyOjpjb21taXRQZW5kaW5nVGV4dHVyZVVwbG9hZHMoKQoreworICAgIGlm
IChtX2NsZWFyVGV4dHVyZUpvYnMpIHsKKyAgICAgICAgcmVtb3ZlVXBkYXRlQ29udGVudHNKb2Jz
KG1fdGV4dHVyZUpvYnMpOworICAgICAgICBtX2NsZWFyVGV4dHVyZUpvYnMgPSBmYWxzZTsKKyAg
ICB9CisKKyAgICBmb3IgKFZlY3RvcjxUZXh0dXJlSm9iPjo6aXRlcmF0b3IgaXQgPSBtX3BlbmRp
bmdUZXh0dXJlSm9icy5iZWdpbigpOyBpdCAhPSBtX3BlbmRpbmdUZXh0dXJlSm9icy5lbmQoKTsg
KytpdCkKKyAgICAgICAgbV90ZXh0dXJlSm9icy5hcHBlbmQoKml0KTsKKyAgICBtX3BlbmRpbmdU
ZXh0dXJlSm9icy5jbGVhcigpOworfQorCit2b2lkIExheWVyVGlsZXI6OmxheWVyVmlzaWJpbGl0
eUNoYW5nZWQoYm9vbCB2aXNpYmxlKQoreworICAgIC8vIEZvciB2aXNpYmxlIGxheWVycywgd2Ug
aGFuZGxlIHRoZSB0aWxlLWxldmVsIHZpc2liaWxpdHkKKyAgICAvLyBpbiB0aGUgZHJhdyBsb29w
LCBzZWUgTGF5ZXJUaWxlcjo6ZHJhd1RleHR1cmVzKCkuCisgICAgaWYgKHZpc2libGUpCisgICAg
ICAgIHJldHVybjsKKworICAgIHsKKyAgICAgICAgLy8gQWxsIHRpbGVzIGFyZSBpbnZpc2libGUg
bm93LgorICAgICAgICBNdXRleExvY2tlciBsb2NrZXIobV9yZW5kZXJKb2JzTXV0ZXgpOworICAg
ICAgICBtX3JlbmRlckpvYnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBmb3IgKFRpbGVNYXA6Oml0
ZXJhdG9yIGl0ID0gbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFkLmJlZ2luKCk7IGl0ICE9IG1fdGls
ZXNDb21wb3NpdGluZ1RocmVhZC5lbmQoKTsgKytpdCkgeworICAgICAgICBUaWxlSW5kZXggaW5k
ZXggPSAoKml0KS5maXJzdDsKKyAgICAgICAgTGF5ZXJUaWxlKiB0aWxlID0gKCppdCkuc2Vjb25k
OworICAgICAgICB0aWxlLT5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgTGF5
ZXJUaWxlcjo6dXBsb2FkVGV4dHVyZXNJZk5lZWRlZCgpCit7CisgICAgVGlsZUpvYnNNYXAgdGls
ZUpvYnNNYXA7CisgICAgRGVxdWU8VGV4dHVyZUpvYj46OmNvbnN0X2l0ZXJhdG9yIHRleHR1cmVK
b2JJdGVyRW5kID0gbV90ZXh0dXJlSm9icy5lbmQoKTsKKyAgICBmb3IgKERlcXVlPFRleHR1cmVK
b2I+Ojpjb25zdF9pdGVyYXRvciB0ZXh0dXJlSm9iSXRlciA9IG1fdGV4dHVyZUpvYnMuYmVnaW4o
KTsgdGV4dHVyZUpvYkl0ZXIgIT0gdGV4dHVyZUpvYkl0ZXJFbmQ7ICsrdGV4dHVyZUpvYkl0ZXIp
CisgICAgICAgIHByb2Nlc3NUZXh0dXJlSm9iKCp0ZXh0dXJlSm9iSXRlciwgdGlsZUpvYnNNYXAp
OworCisgICAgVGlsZUpvYnNNYXA6OmNvbnN0X2l0ZXJhdG9yIHRpbGVKb2JzSXRlckVuZCA9IHRp
bGVKb2JzTWFwLmVuZCgpOworICAgIGZvciAoVGlsZUpvYnNNYXA6OmNvbnN0X2l0ZXJhdG9yIHRp
bGVKb2JzSXRlciA9IHRpbGVKb2JzTWFwLmJlZ2luKCk7IHRpbGVKb2JzSXRlciAhPSB0aWxlSm9i
c0l0ZXJFbmQ7ICsrdGlsZUpvYnNJdGVyKSB7CisgICAgICAgIEludFBvaW50IG9yaWdpbiA9IG9y
aWdpbk9mVGlsZSh0aWxlSm9ic0l0ZXItPmZpcnN0KTsKKworICAgICAgICBMYXllclRpbGUqIHRp
bGUgPSBtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuZ2V0KHRpbGVKb2JzSXRlci0+Zmlyc3QpOwor
ICAgICAgICBpZiAoIXRpbGUpIHsKKyAgICAgICAgICAgIGlmIChvcmlnaW4ueCgpID49IG1fcmVx
dWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgpIHx8IG9yaWdpbi55KCkgPj0gbV9yZXF1aXJlZFRleHR1
cmVTaXplLmhlaWdodCgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
dGlsZSA9IG5ldyBMYXllclRpbGUoKTsKKyAgICAgICAgICAgIG1fdGlsZXNDb21wb3NpdGluZ1Ro
cmVhZC5hZGQodGlsZUpvYnNJdGVyLT5maXJzdCwgdGlsZSk7CisgICAgICAgIH0KKworICAgICAg
ICBJbnRSZWN0IHRpbGVSZWN0KG9yaWdpbiwgdGlsZVNpemUoKSk7CisgICAgICAgIHRpbGVSZWN0
LnNldFdpZHRoKG1pbihtX3JlcXVpcmVkVGV4dHVyZVNpemUud2lkdGgoKSAtIHRpbGVSZWN0Lngo
KSwgdGlsZVJlY3Qud2lkdGgoKSkpOworICAgICAgICB0aWxlUmVjdC5zZXRIZWlnaHQobWluKG1f
cmVxdWlyZWRUZXh0dXJlU2l6ZS5oZWlnaHQoKSAtIHRpbGVSZWN0LnkoKSwgdGlsZVJlY3QuaGVp
Z2h0KCkpKTsKKworICAgICAgICBwZXJmb3JtVGlsZUpvYih0aWxlLCAqdGlsZUpvYnNJdGVyLT5z
ZWNvbmQsIHRpbGVSZWN0KTsKKyAgICB9CisKKyAgICBtX3RleHR1cmVKb2JzLmNsZWFyKCk7Cit9
CisKK3ZvaWQgTGF5ZXJUaWxlcjo6cHJvY2Vzc1RleHR1cmVKb2IoY29uc3QgVGV4dHVyZUpvYiYg
am9iLCBUaWxlSm9ic01hcCYgdGlsZUpvYnNNYXApCit7CisgICAgaWYgKGpvYi50eXBlID09IFRl
eHR1cmVKb2I6OlJlc2l6ZUNvbnRlbnRzKSB7CisgICAgICAgIEludFNpemUgcGVuZGluZ1RleHR1
cmVTaXplID0gam9iLmRpcnR5UmVjdC5zaXplKCk7CisgICAgICAgIGlmIChwZW5kaW5nVGV4dHVy
ZVNpemUud2lkdGgoKSA8IG1fcmVxdWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgpIHx8IHBlbmRpbmdU
ZXh0dXJlU2l6ZS5oZWlnaHQoKSA8IG1fcmVxdWlyZWRUZXh0dXJlU2l6ZS5oZWlnaHQoKSkKKyAg
ICAgICAgICAgIHBydW5lVGV4dHVyZXMoKTsKKworICAgICAgICBtX3JlcXVpcmVkVGV4dHVyZVNp
emUgPSBwZW5kaW5nVGV4dHVyZVNpemU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBp
ZiAoam9iLnR5cGUgPT0gVGV4dHVyZUpvYjo6U2V0Q29udGVudHNUb0NvbG9yKSB7CisgICAgICAg
IGFkZFRpbGVKb2Ioam9iLmluZGV4LCBqb2IsIHRpbGVKb2JzTWFwKTsKKyAgICAgICAgcmV0dXJu
OworICAgICB9CisKKyAgICBJbnRTaXplIHRpbGVNYXhpbXVtU2l6ZSA9IHRpbGVTaXplKCk7Cisg
ICAgSW50UG9pbnQgdG9wTGVmdCA9IGpvYi5kaXJ0eVJlY3QubWluWE1pbllDb3JuZXIoKTsKKyAg
ICBJbnRQb2ludCBib3R0b21SaWdodCA9IGpvYi5kaXJ0eVJlY3QubWF4WE1heFlDb3JuZXIoKTsg
Ly8gVGhpcyBpcyBhY3R1YWxseSBhIHBpeGVsIGJlbG93IGFuZCB0byB0aGUgcmlnaHQgb2YgdGhl
IGRpcnR5UmVjdC4KKyAgICBJbnRQb2ludCBvcmlnaW4gPSBvcmlnaW5PZlRpbGUoaW5kZXhPZlRp
bGUodG9wTGVmdCkpOworICAgIEludFJlY3QgdGlsZVJlY3Q7CisgICAgZm9yICh0aWxlUmVjdC5z
ZXRYKG9yaWdpbi54KCkpOyB0aWxlUmVjdC54KCkgPCBib3R0b21SaWdodC54KCk7IHRpbGVSZWN0
LnNldFgodGlsZVJlY3QueCgpICsgdGlsZU1heGltdW1TaXplLndpZHRoKCkpKSB7CisgICAgICAg
IGZvciAodGlsZVJlY3Quc2V0WShvcmlnaW4ueSgpKTsgdGlsZVJlY3QueSgpIDwgYm90dG9tUmln
aHQueSgpOyB0aWxlUmVjdC5zZXRZKHRpbGVSZWN0LnkoKSArIHRpbGVNYXhpbXVtU2l6ZS5oZWln
aHQoKSkpCisgICAgICAgICAgICBhZGRUaWxlSm9iKGluZGV4T2ZUaWxlKHRpbGVSZWN0LmxvY2F0
aW9uKCkpLCBqb2IsIHRpbGVKb2JzTWFwKTsKKyAgICB9Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6
YWRkVGlsZUpvYihjb25zdCBUaWxlSW5kZXgmIGluZGV4LCBjb25zdCBUZXh0dXJlSm9iJiBqb2Is
IFRpbGVKb2JzTWFwJiB0aWxlSm9ic01hcCkKK3sKKyAgICAvLyBIYXNoTWFwOjphZGQgYWx3YXlz
IHJldHVybnMgYSB2YWxpZCBpdGVyYXRvciBldmVuIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMuCisg
ICAgcGFpcjxUaWxlSm9ic01hcDo6aXRlcmF0b3IsIGJvb2w+IHJlc3VsdCA9IHRpbGVKb2JzTWFw
LmFkZChpbmRleCwgJmpvYik7CisKKyAgICAvLyBTdWNjZXNzZnVsbHkgYWRkZWQgdGhlIG5ldyBq
b2IuCisgICAgaWYgKHJlc3VsdC5zZWNvbmQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIElu
IHRoaXMgY2FzZSB3ZSBsZWF2ZSB0aGUgcHJldmlvdXMgam9iLgorICAgIGlmIChqb2IudHlwZSA9
PSBUZXh0dXJlSm9iOjpEaXJ0eUNvbnRlbnRzICYmIHJlc3VsdC5maXJzdC0+c2Vjb25kLT50eXBl
ID09IFRleHR1cmVKb2I6OkRpc2NhcmRDb250ZW50cykKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gT3ZlcnJpZGUgdGhlIHByZXZpb3VzIGpvYi4KKyAgICByZXN1bHQuZmlyc3QtPnNlY29uZCA9
ICZqb2I7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6cGVyZm9ybVRpbGVKb2IoTGF5ZXJUaWxlKiB0
aWxlLCBjb25zdCBUZXh0dXJlSm9iJiBqb2IsIGNvbnN0IEludFJlY3QmIHRpbGVSZWN0KQorewor
ICAgIHN3aXRjaCAoam9iLnR5cGUpIHsKKyAgICBjYXNlIFRleHR1cmVKb2I6OlNldENvbnRlbnRz
VG9Db2xvcjoKKyAgICAgICAgdGlsZS0+c2V0Q29udGVudHNUb0NvbG9yKGpvYi5jb2xvcik7Cisg
ICAgICAgIHJldHVybjsKKyAgICBjYXNlIFRleHR1cmVKb2I6OlNldENvbnRlbnRzOgorICAgICAg
ICB0aWxlLT5zZXRDb250ZW50cyhqb2IuY29udGVudHMsIHRpbGVSZWN0LCBpbmRleE9mVGlsZSh0
aWxlUmVjdC5sb2NhdGlvbigpKSwgam9iLmlzT3BhcXVlKTsKKyAgICAgICAgcmV0dXJuOworICAg
IGNhc2UgVGV4dHVyZUpvYjo6VXBkYXRlQ29udGVudHM6CisgICAgICAgIHRpbGUtPnVwZGF0ZUNv
bnRlbnRzKGpvYi5jb250ZW50cywgam9iLmRpcnR5UmVjdCwgdGlsZVJlY3QpOworICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBUZXh0dXJlSm9iOjpEaXNjYXJkQ29udGVudHM6CisgICAgICAgIHRp
bGUtPmRpc2NhcmRDb250ZW50cygpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBUZXh0dXJl
Sm9iOjpEaXJ0eUNvbnRlbnRzOgorICAgICAgICB0aWxlLT5zZXRDb250ZW50c0RpcnR5KCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICBjYXNlIFRleHR1cmVKb2I6OlVua25vd246CisgICAgY2FzZSBU
ZXh0dXJlSm9iOjpSZXNpemVDb250ZW50czoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisK
K3ZvaWQgTGF5ZXJUaWxlcjo6ZHJhd1RleHR1cmVzKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIGxh
eWVyLCBpbnQgcG9zLCBpbnQgdGV4Q29vcmQpCit7CisgICAgZHJhd1RleHR1cmVzSW50ZXJuYWwo
bGF5ZXIsIHBvcywgdGV4Q29vcmQsIGZhbHNlIC8qIGRyYXdNaXNzaW5nICovKTsKK30KKwordm9p
ZCBMYXllclRpbGVyOjpkcmF3TWlzc2luZ1RleHR1cmVzKExheWVyQ29tcG9zaXRpbmdUaHJlYWQq
IGxheWVyLCBpbnQgcG9zLCBpbnQgdGV4Q29vcmQpCit7CisgICAgZHJhd1RleHR1cmVzSW50ZXJu
YWwobGF5ZXIsIHBvcywgdGV4Q29vcmQsIHRydWUgLyogZHJhd01pc3NpbmcgKi8pOworfQorCit2
b2lkIExheWVyVGlsZXI6OmRyYXdUZXh0dXJlc0ludGVybmFsKExheWVyQ29tcG9zaXRpbmdUaHJl
YWQqIGxheWVyLCBpbnQgcG9zaXRpb25Mb2NhdGlvbiwgaW50IHRleENvb3JkTG9jYXRpb24sIGJv
b2wgZHJhd01pc3NpbmcpCit7CisgICAgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIGRyYXdU
cmFuc2Zvcm0gPSBsYXllci0+ZHJhd1RyYW5zZm9ybSgpOworICAgIEludFNpemUgYm91bmRzID0g
bGF5ZXItPmJvdW5kcygpOworCisgICAgZmxvYXQgdGV4Y29vcmRzWzQgKiAyXSA9IHsgMCwgMCwg
IDAsIDEsICAxLCAxLCAgMSwgMCB9OworICAgIGZsb2F0IHZlcnRpY2VzWzQgKiA0XTsKKworICAg
IGdsVmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkxvY2F0aW9uLCA0LCBHTF9GTE9BVCwgR0xf
RkFMU0UsIDAsIHZlcnRpY2VzKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIodGV4Q29vcmRM
b2NhdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCB0ZXhjb29yZHMpOworCisgICAgbV9o
YXNNaXNzaW5nVGV4dHVyZXMgPSBmYWxzZTsKKworICAgIGludCBtYXh3ID0gdGlsZVNpemUoKS53
aWR0aCgpOworICAgIGludCBtYXhoID0gdGlsZVNpemUoKS5oZWlnaHQoKTsKKyAgICBmbG9hdCBz
eCA9IHN0YXRpY19jYXN0PGZsb2F0Pihib3VuZHMud2lkdGgoKSkgLyBtX3JlcXVpcmVkVGV4dHVy
ZVNpemUud2lkdGgoKTsKKyAgICBmbG9hdCBzeSA9IHN0YXRpY19jYXN0PGZsb2F0Pihib3VuZHMu
aGVpZ2h0KCkpIC8gbV9yZXF1aXJlZFRleHR1cmVTaXplLmhlaWdodCgpOworCisgICAgYm9vbCBu
ZWVkc0Rpc3BsYXkgPSBmYWxzZTsKKworICAgIGJvb2wgYmxlbmRpbmcgPSAhZHJhd01pc3Npbmc7
CisKKyAgICBJbnRSZWN0IHRpbGVSZWN0OworICAgIGZvciAodGlsZVJlY3Quc2V0WCgwKTsgdGls
ZVJlY3QueCgpIDwgbV9yZXF1aXJlZFRleHR1cmVTaXplLndpZHRoKCk7IHRpbGVSZWN0LnNldFgo
dGlsZVJlY3QueCgpICsgbWF4dykpIHsKKyAgICAgICAgZm9yICh0aWxlUmVjdC5zZXRZKDApOyB0
aWxlUmVjdC55KCkgPCBtX3JlcXVpcmVkVGV4dHVyZVNpemUuaGVpZ2h0KCk7IHRpbGVSZWN0LnNl
dFkodGlsZVJlY3QueSgpICsgbWF4aCkpIHsKKyAgICAgICAgICAgIFRpbGVJbmRleCBpbmRleCA9
IGluZGV4T2ZUaWxlKHRpbGVSZWN0LmxvY2F0aW9uKCkpOworICAgICAgICAgICAgTGF5ZXJUaWxl
KiB0aWxlID0gbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFkLmdldChpbmRleCk7CisgICAgICAgICAg
ICBpZiAoIXRpbGUpIHsKKyAgICAgICAgICAgICAgICB0aWxlID0gbmV3IExheWVyVGlsZSgpOwor
ICAgICAgICAgICAgICAgIG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5hZGQoaW5kZXgsIHRpbGUp
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmbG9hdCB4ID0gaW5kZXguaSgpICogbWF4
dyAqIHN4OworICAgICAgICAgICAgZmxvYXQgeSA9IGluZGV4LmooKSAqIG1heGggKiBzeTsKKyAg
ICAgICAgICAgIGZsb2F0IHcgPSBtaW4oYm91bmRzLndpZHRoKCkgLSB4LCBtYXh3ICogc3gpOwor
ICAgICAgICAgICAgZmxvYXQgaCA9IG1pbihib3VuZHMuaGVpZ2h0KCkgLSB5LCBtYXhoICogc3kp
OworICAgICAgICAgICAgZmxvYXQgb3ggPSB4IC0gYm91bmRzLndpZHRoKCkgLyAyLjA7CisgICAg
ICAgICAgICBmbG9hdCBveSA9IHkgLSBib3VuZHMuaGVpZ2h0KCkgLyAyLjA7CisKKyAgICAgICAg
ICAgIC8vIFdlIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbiBieSBoYW5kLCBzaW5jZSB3ZSBuZWVk
IHRoZSB6IGNvb3JkaW5hdGUKKyAgICAgICAgICAgIC8vIGFzIHdlbGwgKHRvIGRvIHBlcnNwZWN0
aXZlIGNvcnJlY3QgdGV4dHVyaW5nKSBhbmQgd2UgZG9uJ3QgbmVlZAorICAgICAgICAgICAgLy8g
dG8gZGl2aWRlIGJ5IHcgYnkgaGFuZCwgdGhlIEdQVSB3aWxsIGRvIHRoYXQgZm9yIHVzCisgICAg
ICAgICAgICB0cmFuc2Zvcm1Qb2ludChveCwgb3ksIGRyYXdUcmFuc2Zvcm0sICZ2ZXJ0aWNlc1sw
XSk7CisgICAgICAgICAgICB0cmFuc2Zvcm1Qb2ludChveCwgb3kgKyBoLCBkcmF3VHJhbnNmb3Jt
LCAmdmVydGljZXNbNF0pOworICAgICAgICAgICAgdHJhbnNmb3JtUG9pbnQob3ggKyB3LCBveSAr
IGgsIGRyYXdUcmFuc2Zvcm0sICZ2ZXJ0aWNlc1s4XSk7CisgICAgICAgICAgICB0cmFuc2Zvcm1Q
b2ludChveCArIHcsIG95LCBkcmF3VHJhbnNmb3JtLCAmdmVydGljZXNbMTJdKTsKKworICAgICAg
ICAgICAgLy8gSW5mbGF0ZSB0aGUgcmVjdCBzb21ld2hhdCB0byBhdHRlbXB0IHRvIG1ha2UgdGV4
dHVyZXMgcmVuZGVyIGJlZm9yZSB0aGV5IHNob3cKKyAgICAgICAgICAgIC8vIHVwIG9uIHNjcmVl
bi4KKyAgICAgICAgICAgIGZsb2F0IGQgPSB2aWV3cG9ydEluZmxhdGlvbkZhY3RvcjsKKyAgICAg
ICAgICAgIEZsb2F0UmVjdCByZWN0KC1kLCAtZCwgMiAqIGQsIDIgKiBkKTsKKyAgICAgICAgICAg
IEZsb2F0UXVhZCBxdWFkKEZsb2F0UG9pbnQodmVydGljZXNbMF0gLyB2ZXJ0aWNlc1szXSwgdmVy
dGljZXNbMV0gLyB2ZXJ0aWNlc1szXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9h
dFBvaW50KHZlcnRpY2VzWzRdIC8gdmVydGljZXNbN10sIHZlcnRpY2VzWzVdIC8gdmVydGljZXNb
N10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXRQb2ludCh2ZXJ0aWNlc1s4XSAv
IHZlcnRpY2VzWzExXSwgdmVydGljZXNbOV0gLyB2ZXJ0aWNlc1sxMV0pLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgRmxvYXRQb2ludCh2ZXJ0aWNlc1sxMl0gLyB2ZXJ0aWNlc1sxNV0sIHZl
cnRpY2VzWzEzXSAvIHZlcnRpY2VzWzE1XSkpOworICAgICAgICAgICAgYm9vbCB2aXNpYmxlID0g
cXVhZC5ib3VuZGluZ0JveCgpLmludGVyc2VjdHMocmVjdCk7CisKKyAgICAgICAgICAgIGJvb2wg
d2FzVmlzaWJsZSA9IHRpbGUtPmlzVmlzaWJsZSgpOworICAgICAgICAgICAgdGlsZS0+c2V0Vmlz
aWJsZSh2aXNpYmxlKTsKKworICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlu
IHR3byBwYXNzZXMuIFRoZSBmaXJzdCBwYXNzIGRyYXdzIGFsbAorICAgICAgICAgICAgLy8gdmlz
aWJsZSB0aWxlcyB3aXRoIHRleHR1cmVzLgorICAgICAgICAgICAgLy8gSWYgYSB2aXNpYmxlIHRp
bGUgaGFzIG5vIHRleHR1cmUsIHNldCB0aGUgbV9oYXNNaXNzaW5nVGV4dHVyZXMKKyAgICAgICAg
ICAgIC8vIGZsYWcsIHRvIGluZGljYXRlIHRoYXQgd2UgbmVlZCBhIHNlY29uZCBwYXNzLgorICAg
ICAgICAgICAgLy8gVGhlIHNlY29uZCAiZHJhd01pc3NpbmciIHBhc3MgZHJhd3MgYWxsIHZpc2li
bGUgdGlsZXMgd2l0aG91dAorICAgICAgICAgICAgLy8gdGV4dHVyZXMgYXMgY2hlY2tlcmJvYXJk
LgorICAgICAgICAgICAgLy8gSG93ZXZlciwgZG9uJ3QgZHJhdyBicmFuZCBuZXcgdGlsZXMgYXMg
Y2hlY2tlcmJvYXJkLiBUaGUgY2hlY2tlci0KKyAgICAgICAgICAgIC8vIGJvYXJkIGluZGljYXRl
cyB0aGF0IGEgdGlsZSBoYXMgZGlydHkgY29udGVudHMsIGJ1dCB0aGF0J3Mgbm90CisgICAgICAg
ICAgICAvLyB0aGUgY2FzZSBpZiBpdCdzIGJyYW5kIG5ldy4KKyAgICAgICAgICAgIGlmICh2aXNp
YmxlKSB7CisgICAgICAgICAgICAgICAgYm9vbCBoYXNUZXh0dXJlID0gdGlsZS0+aGFzVGV4dHVy
ZSgpOworICAgICAgICAgICAgICAgIGlmICghaGFzVGV4dHVyZSkKKyAgICAgICAgICAgICAgICAg
ICAgbV9oYXNNaXNzaW5nVGV4dHVyZXMgPSB0cnVlOworCisgICAgICAgICAgICAgICAgaWYgKGhh
c1RleHR1cmUgJiYgIWRyYXdNaXNzaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIFRleHR1cmUq
IHRleHR1cmUgPSB0aWxlLT50ZXh0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0
dXJlLT5pc09wYXF1ZSgpICYmIGxheWVyLT5kcmF3T3BhY2l0eSgpID09IDEuMGYgJiYgIWxheWVy
LT5tYXNrTGF5ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsZW5kaW5nKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFibGVuZGluZykgewor
ICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAg
ICAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2xC
bGVuZEZ1bmMoR0xfT05FLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhy
ZWFkKCktPnRleHR1cmVBY2Nlc3NlZCh0ZXh0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgZ2xC
aW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT50ZXh0dXJlSWQoKSk7CisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGhhc1RleHR1cmUgIT0gZHJhd01pc3Np
bmcpCisgICAgICAgICAgICAgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAs
IDQpOworCisgICAgICAgICAgICAgICAgaWYgKHRpbGUtPmlzRGlydHkoKSkgeworICAgICAgICAg
ICAgICAgICAgICBhZGRSZW5kZXJKb2IoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBuZWVk
c0Rpc3BsYXkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAod2FzVmlzaWJsZSkKKyAgICAgICAgICAgICAgICByZW1vdmVSZW5kZXJKb2IoaW5kZXgpOwor
ICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJuIGVhcmx5IGZvciB0aGUgZHJhd01pc3Np
bmcgY2FzZSwgZG9uJ3QgZmxhZyB1cyBhcyBuZWVkaW5nIGNvbW1pdC4KKyAgICBpZiAoZHJhd01p
c3NpbmcpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFN3aXRjaCBvbiBibGVuZGluZyBhZ2Fp
biAod2Uga25vdyB0aGF0IGRyYXdNaXNzaW5nID09IGZhbHNlKS4KKyAgICBpZiAoIWJsZW5kaW5n
KSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMoR0xf
T05FLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBzY2hl
ZHVsZSBhIGNvbW1pdCwgdmlzaWJpbGl0eSB3aWxsIGJlIHVwZGF0ZWQsIGFuZCBkaXNwbGF5IHdp
bGwKKyAgICAvLyBoYXBwZW4gaWYgdGhlcmUgYXJlIGFueSB2aXNpYmxlIGFuZCBkaXJ0eSB0ZXh0
dXJlcy4KKyAgICBpZiAobmVlZHNEaXNwbGF5KQorICAgICAgICBsYXllci0+c2V0TmVlZHNDb21t
aXQoKTsKK30KKwordm9pZCBMYXllclRpbGVyOjphZGRSZW5kZXJKb2IoY29uc3QgVGlsZUluZGV4
JiBpbmRleCkKK3sKKyAgICBBU1NFUlQoaXNDb21wb3NpdGluZ1RocmVhZCgpKTsKKworICAgIE11
dGV4TG9ja2VyIGxvY2tlcihtX3JlbmRlckpvYnNNdXRleCk7CisgICAgbV9yZW5kZXJKb2JzLmFk
ZChpbmRleCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6cmVtb3ZlUmVuZGVySm9iKGNvbnN0IFRp
bGVJbmRleCYgaW5kZXgpCit7CisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fcmVuZGVySm9ic011
dGV4KTsKKyAgICBtX3JlbmRlckpvYnMucmVtb3ZlKGluZGV4KTsKK30KKwordm9pZCBMYXllclRp
bGVyOjpkZWxldGVUZXh0dXJlcygpCit7CisgICAgLy8gU2luY2UgdGV4dHVyZXMgYXJlIGRlbGV0
ZWQgYnkgYSBzeW5jaHJvbm91cyBtZXNzYWdlCisgICAgLy8gZnJvbSBXZWJLaXQgdGhyZWFkIHRv
IGNvbXBvc2l0aW5nIHRocmVhZCwgd2UgZG9uJ3QgbmVlZAorICAgIC8vIGFueSBzeW5jaHJvbml6
YXRpb24gbWVjaGFuaXNtIGhlcmUsIGV2ZW4gdGhvdWdoIHdlIGFyZQorICAgIC8vIHRvdWNoaW5n
IHNvbWUgV2ViS2l0IHRocmVhZCBzdGF0ZS4KKyAgICBtX3RpbGVzV2ViS2l0VGhyZWFkLmNsZWFy
KCk7CisKKyAgICBpZiAobV90aWxlc0NvbXBvc2l0aW5nVGhyZWFkLnNpemUoKSkgeworICAgICAg
ICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFkLmJl
Z2luKCk7IGl0ICE9IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5lbmQoKTsgKytpdCkKKyAgICAg
ICAgICAgICgqaXQpLnNlY29uZC0+ZGlzY2FyZENvbnRlbnRzKCk7CisgICAgICAgIG1fdGlsZXND
b21wb3NpdGluZ1RocmVhZC5jbGVhcigpOworCisgICAgICAgIG1fY29udGVudHNEaXJ0eSA9IHRy
dWU7CisgICAgfQorCisgICAgLy8gRm9yIHZhcmlvdXMgcmVhc29ucywgZS5nLiBwYWdlIGNhY2hl
LCBzb21lb25lIG1heSB0cnkKKyAgICAvLyB0byByZW5kZXIgdXMgYWZ0ZXIgdGhlIHRleHR1cmVz
IHdlcmUgZGVsZXRlZC4KKyAgICBtX3BlbmRpbmdUZXh0dXJlU2l6ZSA9IEludFNpemUoKTsKKyAg
ICBtX3JlcXVpcmVkVGV4dHVyZVNpemUgPSBJbnRTaXplKCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxl
cjo6cHJ1bmVUZXh0dXJlcygpCit7CisgICAgLy8gUHJ1bmUgdGlsZXMgdGhhdCBhcmUgbm8gbG9u
Z2VyIG5lZWRlZC4KKyAgICBWZWN0b3I8VGlsZUluZGV4PiB0aWxlc1RvRGVsZXRlOworICAgIGZv
ciAoVGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuYmVnaW4o
KTsgaXQgIT0gbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFkLmVuZCgpOyArK2l0KSB7CisgICAgICAg
IFRpbGVJbmRleCBpbmRleCA9ICgqaXQpLmZpcnN0OworCisgICAgICAgIEludFBvaW50IG9yaWdp
biA9IG9yaWdpbk9mVGlsZShpbmRleCk7CisgICAgICAgIGlmIChvcmlnaW4ueCgpID49IG1fcmVx
dWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgpIHx8IG9yaWdpbi55KCkgPj0gbV9yZXF1aXJlZFRleHR1
cmVTaXplLmhlaWdodCgpKQorICAgICAgICAgICAgdGlsZXNUb0RlbGV0ZS5hcHBlbmQoaW5kZXgp
OworICAgIH0KKworICAgIGZvciAoVmVjdG9yPFRpbGVJbmRleD46Oml0ZXJhdG9yIGl0ID0gdGls
ZXNUb0RlbGV0ZS5iZWdpbigpOyBpdCAhPSB0aWxlc1RvRGVsZXRlLmVuZCgpOyArK2l0KSB7Cisg
ICAgICAgIExheWVyVGlsZSogdGlsZSA9IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC50YWtlKCpp
dCk7CisgICAgICAgIHRpbGUtPmRpc2NhcmRDb250ZW50cygpOworICAgICAgICBkZWxldGUgdGls
ZTsKKyAgICB9Cit9CisKK0ludFNpemUgTGF5ZXJUaWxlcjo6ZGVmYXVsdFRpbGVTaXplKCkKK3sK
KyAgICBzdGF0aWMgSW50U2l6ZSBzY3JlZW5TaXplID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06Okdy
YXBoaWNzOjpTY3JlZW46OnByaW1hcnlTY3JlZW4oKS0+bmF0aXZlU2l6ZSgpOworICAgIHN0YXRp
YyBpbnQgZGltID0gbWF4KHNjcmVlblNpemUud2lkdGgoKSwgc2NyZWVuU2l6ZS5oZWlnaHQoKSkg
LyB0aWxlTXVsdGlwbGllcjsKKyAgICByZXR1cm4gSW50U2l6ZShkaW0sIGRpbSk7Cit9CisKK3Zv
aWQgTGF5ZXJUaWxlcjo6dXBkYXRlVGlsZVNpemUoKQoreworICAgIEludFNpemUgc2l6ZSA9IG1f
dGlsaW5nRGlzYWJsZWQgPyBtX2xheWVyLT5ib3VuZHMoKSA6IGRlZmF1bHRUaWxlU2l6ZSgpOwor
ICAgIGNvbnN0IEludFNpemUgbWF4VGV4dHVyZVNpemUoMjA0OCwgMjA0OCk7CisgICAgc2l6ZSA9
IHNpemUuc2hydW5rVG8obWF4VGV4dHVyZVNpemUpOworCisgICAgaWYgKG1fdGlsZVNpemUgPT0g
c2l6ZSB8fCBzaXplLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSW52YWxp
ZGF0ZSB0aGUgd2hvbGUgbGF5ZXIgaWYgdGlsZSBzaXplIGNoYW5nZXMuCisgICAgc2V0TmVlZHNE
aXNwbGF5KCk7CisgICAgbV90aWxlU2l6ZSA9IHNpemU7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6
ZGlzYWJsZVRpbGluZyhib29sIGRpc2FibGUpCit7CisgICAgaWYgKG1fdGlsaW5nRGlzYWJsZWQg
PT0gZGlzYWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV90aWxpbmdEaXNhYmxlZCA9IGRp
c2FibGU7CisgICAgdXBkYXRlVGlsZVNpemUoKTsKK30KKworYm9vbCBMYXllclRpbGVyOjpzaG91
bGRQcmVmaWxsVGlsZShjb25zdCBUaWxlSW5kZXgmIGluZGV4KQoreworICAgIC8vIEZvciBub3cs
IHdlIHVzZSB0aGUgaGV1cmlzdGljIG9mIHByZWZpbGxpbmcgdGhlIGZpcnN0IHNjcmVlbmZ1bCBv
ZiB0aWxlcy4KKyAgICAvLyBUaGlzIGdpdmVzIHRoZSBjb3JyZWN0IHJlc3VsdCBvbmx5IGZvciBs
YXllcnMgd2l0aCBpZGVudGl0eSB0cmFuc2Zvcm0sCisgICAgLy8gd2hpY2ggaXMgd2h5IGl0J3Mg
Y2FsbGVkIGEgaGV1cmlzdGljIGhlcmUuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgY2FzZQorICAg
IC8vIHdoZXJlIHRoZSBkZXZlbG9wZXIgYWN0dWFsbHkgZGVzaWduZWQgdGhlaXIgd2ViIHBhZ2Ug
YXJvdW5kIHRoZSB1c2Ugb2YKKyAgICAvLyBhY2NlbGVyYXRlZCBjb21wb3NpdGluZywgYW5kIGV4
cGVjdHMgZXZlbiBvZmZzY3JlZW4gbGF5ZXJzIHRvIGhhdmUgY29udGVudC4KKyAgICAvLyBXZSBv
YmxpZ2UgdGhlbSB0byBzb21lIGRlZ3JlZSBieSBwcmVmaWxsaW5nIGEgc2NyZWVuZnVsIG9mIHRp
bGVzLgorICAgIC8vIFRoaXMgaXMgcmVkdW5kYW50IGluIHNvbWUgb3RoZXIgc2NlbmFyaW9zLCBp
LmUuIHdoZW4gYW4gb2Zmc2NyZWVuIGxheWVyCisgICAgLy8gaXMgY29tcG9zaXRlZCBvbmx5IGJl
Y2F1c2Ugb2Ygb3ZlcmxhcHBpbmcgYSBmbGFzaCBhZCBvciBzb21ldGhpbmcgbGlrZQorICAgIC8v
IHRoYXQsIGJ1dCB3ZSdyZSB3aWxsaW5nIHRvIG1ha2UgdGhpcyB0cmFkZW9mZi4KKworICAgIC8v
IFNpbmNlIHRoZSB0aWxlTXVsdGlwbGllciBpbmRpY2F0ZXMgaG93IG1hbnkgdGlsZXMgZml0IG9u
IHRoZSBzY3JlZW4sCisgICAgLy8gdGhlIGZvbGxvd2luZyBmb3JtdWxhIGNhbiBiZSB1c2VkOgor
ICAgIHJldHVybiBpbmRleC5pKCkgPCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odGlsZU11bHRpcGxp
ZXIpICYmIGluZGV4LmooKSA8IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aWxlTXVsdGlwbGllcik7
Cit9CisKK1RpbGVJbmRleCBMYXllclRpbGVyOjppbmRleE9mVGlsZShjb25zdCBXZWJDb3JlOjpJ
bnRQb2ludCYgb3JpZ2luKQoreworICAgIGludCBvZmZzZXRYID0gb3JpZ2luLngoKTsKKyAgICBp
bnQgb2Zmc2V0WSA9IG9yaWdpbi55KCk7CisgICAgaWYgKG9mZnNldFgpCisgICAgICAgIG9mZnNl
dFggPSBvZmZzZXRYIC8gdGlsZVNpemUoKS53aWR0aCgpOworICAgIGlmIChvZmZzZXRZKQorICAg
ICAgICBvZmZzZXRZID0gb2Zmc2V0WSAvIHRpbGVTaXplKCkuaGVpZ2h0KCk7CisgICAgcmV0dXJu
IFRpbGVJbmRleChvZmZzZXRYLCBvZmZzZXRZKTsKK30KKworSW50UG9pbnQgTGF5ZXJUaWxlcjo6
b3JpZ2luT2ZUaWxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgpCit7CisgICAgcmV0dXJuIEludFBv
aW50KGluZGV4LmkoKSAqIHRpbGVTaXplKCkud2lkdGgoKSwgaW5kZXguaigpICogdGlsZVNpemUo
KS5oZWlnaHQoKSk7Cit9CisKK0ludFJlY3QgTGF5ZXJUaWxlcjo6cmVjdEZvclRpbGUoY29uc3Qg
VGlsZUluZGV4JiBpbmRleCwgY29uc3QgSW50U2l6ZSYgYm91bmRzKQoreworICAgIEludFBvaW50
IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShpbmRleCk7CisgICAgSW50U2l6ZSBvZmZzZXQob3JpZ2lu
LngoKSwgb3JpZ2luLnkoKSk7CisgICAgSW50U2l6ZSBzaXplID0gdGlsZVNpemUoKS5zaHJ1bmtU
byhib3VuZHMgLSBvZmZzZXQpOworICAgIHJldHVybiBJbnRSZWN0KG9yaWdpbiwgc2l6ZSk7Cit9
CisKK2Jvb2wgTGF5ZXJUaWxlcjo6aGFzRGlydHlUaWxlcygpIGNvbnN0Cit7CisgICAgZm9yIChU
aWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5iZWdp
bigpOyBpdCAhPSBtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuZW5kKCk7ICsraXQpIHsKKyAgICAg
ICAgY29uc3QgTGF5ZXJUaWxlKiB0aWxlID0gKCppdCkuc2Vjb25kOworICAgICAgICBpZiAodGls
ZS0+aXNEaXJ0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0
dXJuIGZhbHNlOworfQorCit2b2lkIExheWVyVGlsZXI6OmJpbmRDb250ZW50c1RleHR1cmUoKQor
eworICAgIEFTU0VSVChtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuc2l6ZSgpID09IDEpOworICAg
IGlmIChtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuc2l6ZSgpICE9IDEpCisgICAgICAgIHJldHVy
bjsKKworICAgIGNvbnN0IExheWVyVGlsZSogdGlsZSA9IG1fdGlsZXNDb21wb3NpdGluZ1RocmVh
ZC5iZWdpbigpLT5zZWNvbmQ7CisKKyAgICBBU1NFUlQodGlsZS0+aGFzVGV4dHVyZSgpKTsKKyAg
ICBpZiAoIXRpbGUtPmhhc1RleHR1cmUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZ2xCaW5k
VGV4dHVyZShHTF9URVhUVVJFXzJELCB0aWxlLT50ZXh0dXJlKCktPnRleHR1cmVJZCgpKTsKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlci5oIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVyLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uOGE3NDcyNWQwODNjM2ZiNmM4ZWVhZWIxZDE2MzVmNDViYmRiMzNiYQotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5
ZXJUaWxlci5oCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAy
MDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24s
IEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEw
LTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgTGF5ZXJUaWxlcl9oCisjZGVmaW5lIExheWVyVGls
ZXJfaAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiQ29s
b3IuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5j
bHVkZSAiTGF5ZXJUaWxlLmgiCisjaW5jbHVkZSAiTGF5ZXJUaWxlSW5kZXguaCIKKworI2luY2x1
ZGUgPFNrQml0bWFwLmg+CisjaW5jbHVkZSA8d3RmL0RlcXVlLmg+CisjaW5jbHVkZSA8d3RmL0hh
c2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRT
YWZlUmVmQ291bnRlZC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIExheWVyQ29t
cG9zaXRpbmdUaHJlYWQ7CitjbGFzcyBMYXllcldlYktpdFRocmVhZDsKKworY2xhc3MgTGF5ZXJU
aWxlciA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxMYXllclRpbGVyPiB7CitwdWJsaWM6
CisgICAgVGlsZUluZGV4IGluZGV4T2ZUaWxlKGNvbnN0IEludFBvaW50JiBvcmlnaW4pOworICAg
IEludFBvaW50IG9yaWdpbk9mVGlsZShjb25zdCBUaWxlSW5kZXgmKTsKKyAgICBJbnRSZWN0IHJl
Y3RGb3JUaWxlKGNvbnN0IFRpbGVJbmRleCYsIGNvbnN0IEludFNpemUmIGJvdW5kcyk7CisKKyAg
ICBzdGF0aWMgUGFzc1JlZlB0cjxMYXllclRpbGVyPiBjcmVhdGUoTGF5ZXJXZWJLaXRUaHJlYWQq
IGxheWVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBMYXllclRpbGVyKGxh
eWVyKSk7CisgICAgfQorCisgICAgdmlydHVhbCB+TGF5ZXJUaWxlcigpOworCisgICAgLy8gV2Vi
S2l0IHRocmVhZAorICAgIExheWVyV2ViS2l0VGhyZWFkKiBsYXllcigpIGNvbnN0IHsgcmV0dXJu
IG1fbGF5ZXI7IH0KKyAgICB2b2lkIGxheWVyV2ViS2l0VGhyZWFkRGVzdHJveWVkKCk7CisgICAg
dm9pZCBzZXROZWVkc0Rpc3BsYXkoY29uc3QgRmxvYXRSZWN0JiBkaXJ0eVJlY3QpOworICAgIHZv
aWQgc2V0TmVlZHNEaXNwbGF5KCk7CisgICAgdm9pZCB1cGRhdGVUZXh0dXJlQ29udGVudHNJZk5l
ZWRlZChkb3VibGUgc2NhbGUpOworICAgIHZvaWQgZGlzYWJsZVRpbGluZyhib29sKTsKKworICAg
IC8vIENvbXBvc2l0aW5nIHRocmVhZAorICAgIHZvaWQgbGF5ZXJDb21wb3NpdGluZ1RocmVhZERl
c3Ryb3llZCgpOworICAgIHZvaWQgdXBsb2FkVGV4dHVyZXNJZk5lZWRlZCgpOworICAgIHZvaWQg
ZHJhd1RleHR1cmVzKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqLCBpbnQgcG9zaXRpb25Mb2NhdGlv
biwgaW50IHRleENvb3JkTG9jYXRpb24pOworICAgIGJvb2wgaGFzTWlzc2luZ1RleHR1cmVzKCkg
Y29uc3QgeyByZXR1cm4gbV9oYXNNaXNzaW5nVGV4dHVyZXM7IH0KKyAgICB2b2lkIGRyYXdNaXNz
aW5nVGV4dHVyZXMoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCosIGludCBwb3NpdGlvbkxvY2F0aW9u
LCBpbnQgdGV4Q29vcmRMb2NhdGlvbik7CisgICAgdm9pZCBkZWxldGVUZXh0dXJlcygpOworICAg
IHZvaWQgY29tbWl0UGVuZGluZ1RleHR1cmVVcGxvYWRzKCk7CisgICAgdm9pZCBsYXllclZpc2li
aWxpdHlDaGFuZ2VkKGJvb2wgdmlzaWJsZSk7CisgICAgYm9vbCBoYXNEaXJ0eVRpbGVzKCkgY29u
c3Q7CisgICAgdm9pZCBiaW5kQ29udGVudHNUZXh0dXJlKCk7CisKKyAgICAvLyBUaHJlYWQgc2Fm
ZQorICAgIHZvaWQgYWRkUmVuZGVySm9iKGNvbnN0IFRpbGVJbmRleCYpOworICAgIHZvaWQgcmVt
b3ZlUmVuZGVySm9iKGNvbnN0IFRpbGVJbmRleCYpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBU
ZXh0dXJlSm9iIHsKKyAgICAgICAgZW51bSBUeXBlIHsgVW5rbm93biwgU2V0Q29udGVudHMsIFNl
dENvbnRlbnRzVG9Db2xvciwgVXBkYXRlQ29udGVudHMsIERpc2NhcmRDb250ZW50cywgUmVzaXpl
Q29udGVudHMsIERpcnR5Q29udGVudHMgfTsKKworICAgICAgICBUZXh0dXJlSm9iKCkKKyAgICAg
ICAgICAgIDogdHlwZShVbmtub3duKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBU
ZXh0dXJlSm9iKFR5cGUgdHlwZSwgY29uc3QgSW50U2l6ZSYgbmV3U2l6ZSkKKyAgICAgICAgICAg
IDogdHlwZSh0eXBlKQorICAgICAgICAgICAgLCBpc09wYXF1ZShmYWxzZSkKKyAgICAgICAgICAg
ICwgZGlydHlSZWN0KEludFBvaW50KCksIG5ld1NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAg
IEFTU0VSVCh0eXBlID09IFJlc2l6ZUNvbnRlbnRzKTsKKyAgICAgICAgfQorCisgICAgICAgIFRl
eHR1cmVKb2IoVHlwZSB0eXBlLCBjb25zdCBJbnRSZWN0JiBkaXJ0eVJlY3QpCisgICAgICAgICAg
ICA6IHR5cGUodHlwZSkKKyAgICAgICAgICAgICwgaXNPcGFxdWUoZmFsc2UpCisgICAgICAgICAg
ICAsIGRpcnR5UmVjdChkaXJ0eVJlY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCh0
eXBlID09IERpc2NhcmRDb250ZW50cyB8fCB0eXBlID09IERpcnR5Q29udGVudHMpOworICAgICAg
ICB9CisKKyAgICAgICAgVGV4dHVyZUpvYihUeXBlIHR5cGUsIGNvbnN0IFNrQml0bWFwJiBjb250
ZW50cywgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0LCBib29sIGlzT3BhcXVlID0gZmFsc2UpCisg
ICAgICAgICAgICA6IHR5cGUodHlwZSkKKyAgICAgICAgICAgICwgY29udGVudHMoY29udGVudHMp
CisgICAgICAgICAgICAsIGlzT3BhcXVlKGlzT3BhcXVlKQorICAgICAgICAgICAgLCBkaXJ0eVJl
Y3QoZGlydHlSZWN0KQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBVcGRh
dGVDb250ZW50cyB8fCB0eXBlID09IFNldENvbnRlbnRzKTsKKyAgICAgICAgICAgIEFTU0VSVCgh
Y29udGVudHMuaXNOdWxsKCkpOworICAgICAgICB9CisKKyAgICAgICAgVGV4dHVyZUpvYihUeXBl
IHR5cGUsIGNvbnN0IENvbG9yJiBjb2xvciwgY29uc3QgVGlsZUluZGV4JiBpbmRleCkKKyAgICAg
ICAgICAgIDogdHlwZSh0eXBlKQorICAgICAgICAgICAgLCBpc09wYXF1ZShmYWxzZSkKKyAgICAg
ICAgICAgICwgY29sb3IoY29sb3IpCisgICAgICAgICAgICAsIGluZGV4KGluZGV4KQorICAgICAg
ICB7CisgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBTZXRDb250ZW50c1RvQ29sb3IpOworICAg
ICAgICB9CisKKyAgICAgICAgc3RhdGljIFRleHR1cmVKb2Igc2V0Q29udGVudHMoY29uc3QgU2tC
aXRtYXAmIGNvbnRlbnRzLCBib29sIGlzT3BhcXVlKSB7IHJldHVybiBUZXh0dXJlSm9iKFNldENv
bnRlbnRzLCBjb250ZW50cywgSW50UmVjdChJbnRQb2ludCgpLCBJbnRTaXplKGNvbnRlbnRzLndp
ZHRoKCksIGNvbnRlbnRzLmhlaWdodCgpKSksIGlzT3BhcXVlKTsgfQorICAgICAgICBzdGF0aWMg
VGV4dHVyZUpvYiBzZXRDb250ZW50c1RvQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yLCBjb25zdCBU
aWxlSW5kZXgmIGluZGV4KSB7IHJldHVybiBUZXh0dXJlSm9iKFNldENvbnRlbnRzVG9Db2xvciwg
Y29sb3IsIGluZGV4KTsgfQorICAgICAgICBzdGF0aWMgVGV4dHVyZUpvYiB1cGRhdGVDb250ZW50
cyhjb25zdCBTa0JpdG1hcCYgY29udGVudHMsIGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCkgeyBy
ZXR1cm4gVGV4dHVyZUpvYihVcGRhdGVDb250ZW50cywgY29udGVudHMsIGRpcnR5UmVjdCk7IH0K
KyAgICAgICAgc3RhdGljIFRleHR1cmVKb2IgZGlzY2FyZENvbnRlbnRzKGNvbnN0IEludFJlY3Qm
IGRpcnR5UmVjdCkgeyByZXR1cm4gVGV4dHVyZUpvYihEaXNjYXJkQ29udGVudHMsIGRpcnR5UmVj
dCk7IH0KKyAgICAgICAgc3RhdGljIFRleHR1cmVKb2IgcmVzaXplQ29udGVudHMoY29uc3QgSW50
U2l6ZSYgbmV3U2l6ZSkgeyByZXR1cm4gVGV4dHVyZUpvYihSZXNpemVDb250ZW50cywgbmV3U2l6
ZSk7IH0KKyAgICAgICAgc3RhdGljIFRleHR1cmVKb2IgZGlydHlDb250ZW50cyhjb25zdCBJbnRS
ZWN0JiBkaXJ0eVJlY3QpIHsgcmV0dXJuIFRleHR1cmVKb2IoRGlydHlDb250ZW50cywgZGlydHlS
ZWN0KTsgfQorCisgICAgICAgIGJvb2wgaXNOdWxsKCkgeyByZXR1cm4gdHlwZSA9PSBVbmtub3du
OyB9CisKKyAgICAgICAgVHlwZSB0eXBlOworICAgICAgICBTa0JpdG1hcCBjb250ZW50czsKKyAg
ICAgICAgYm9vbCBpc09wYXF1ZTsKKyAgICAgICAgSW50UmVjdCBkaXJ0eVJlY3Q7CisgICAgICAg
IENvbG9yIGNvbG9yOworICAgICAgICBUaWxlSW5kZXggaW5kZXg7CisgICAgfTsKKworICAgIHR5
cGVkZWYgSGFzaE1hcDxUaWxlSW5kZXgsIExheWVyVGlsZSo+IFRpbGVNYXA7CisgICAgdHlwZWRl
ZiBIYXNoTWFwPFRpbGVJbmRleCwgTGF5ZXJUaWxlRGF0YT4gVmlzaWJpbGl0eU1hcDsKKyAgICB0
eXBlZGVmIEhhc2hNYXA8VGlsZUluZGV4LCBjb25zdCBUZXh0dXJlSm9iKj4gVGlsZUpvYnNNYXA7
CisKKyAgICBzdGF0aWMgSW50U2l6ZSBkZWZhdWx0VGlsZVNpemUoKTsKKyAgICBJbnRTaXplIHRp
bGVTaXplKCkgY29uc3QgeyByZXR1cm4gbV90aWxlU2l6ZTsgfQorICAgIHZvaWQgdXBkYXRlVGls
ZVNpemUoKTsKKworICAgIExheWVyVGlsZXIoTGF5ZXJXZWJLaXRUaHJlYWQqKTsKKworICAgIC8v
IFdlYktpdCB0aHJlYWQKKyAgICB2b2lkIGFkZFRleHR1cmVKb2IoY29uc3QgVGV4dHVyZUpvYiYp
OworICAgIHZvaWQgY2xlYXJUZXh0dXJlSm9icygpOworICAgIGJvb2wgc2hvdWxkUGVyZm9ybVJl
bmRlckpvYihjb25zdCBUaWxlSW5kZXgmLCBib29sIGFsbG93UHJlZmlsbCk7CisgICAgYm9vbCBz
aG91bGRQcmVmaWxsVGlsZShjb25zdCBUaWxlSW5kZXgmKTsKKworICAgIC8vIENvbXBvc2l0aW5n
IHRocmVhZAorICAgIHZvaWQgdXBkYXRlVGlsZUNvbnRlbnRzKGNvbnN0IFRleHR1cmVKb2ImLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgdm9pZCBhZGRUaWxlSm9iKGNvbnN0IFRpbGVJbmRleCYsIGNv
bnN0IFRleHR1cmVKb2ImLCBUaWxlSm9ic01hcCYpOworICAgIHZvaWQgcGVyZm9ybVRpbGVKb2Io
TGF5ZXJUaWxlKiwgY29uc3QgVGV4dHVyZUpvYiYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2b2lk
IHByb2Nlc3NUZXh0dXJlSm9iKGNvbnN0IFRleHR1cmVKb2ImLCBUaWxlSm9ic01hcCYpOworICAg
IHZvaWQgZHJhd1RleHR1cmVzSW50ZXJuYWwoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCosIGludCBw
b3NpdGlvbkxvY2F0aW9uLCBpbnQgdGV4Q29vcmRMb2NhdGlvbiwgYm9vbCBtaXNzaW5nKTsKKyAg
ICB2b2lkIHBydW5lVGV4dHVyZXMoKTsKKyAgICB2b2lkIHZpc2liaWxpdHlDaGFuZ2VkKGJvb2wg
bmVlZHNEaXNwbGF5KTsKKworICAgIC8vIENsZWFyIGFsbCBwZW5kaW5nIHVwZGF0ZSBjb250ZW50
IHRleHR1cmUgam9icworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIHZvaWQg
cmVtb3ZlVXBkYXRlQ29udGVudHNKb2JzKFQmIGpvYnMpCisgICAgeworICAgICAgICAvLyBDbGVh
ciBhbGwgcGVuZGluZyB1cGRhdGUgY29udGVudCBqb2JzCisgICAgICAgIFQgbGlzdDsKKyAgICAg
ICAgZm9yICh0eXBlbmFtZSBUOjppdGVyYXRvciBpdCA9IGpvYnMuYmVnaW4oKTsgaXQgIT0gam9i
cy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKCgqaXQpLnR5cGUgIT0gVGV4dHVyZUpv
Yjo6VXBkYXRlQ29udGVudHMpCisgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoKml0KTsKKyAg
ICAgICAgfQorICAgICAgICBqb2JzID0gbGlzdDsKKyAgICB9CisKKyAgICBMYXllcldlYktpdFRo
cmVhZCogbV9sYXllcjsKKworICAgIFRpbGVNYXAgbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFkOwor
CisgICAgVmlzaWJpbGl0eU1hcCBtX3RpbGVzV2ViS2l0VGhyZWFkOworCisgICAgYm9vbCBtX3Rp
bGluZ0Rpc2FibGVkOworCisgICAgYm9vbCBtX2NvbnRlbnRzRGlydHk7CisgICAgRmxvYXRSZWN0
IG1fZGlydHlSZWN0OworCisgICAgSW50U2l6ZSBtX3BlbmRpbmdUZXh0dXJlU2l6ZTsgLy8gUmVz
aXplZCwgYnV0IG5vdCBjb21taXR0ZWQgeWV0LgorICAgIEludFNpemUgbV9yZXF1aXJlZFRleHR1
cmVTaXplOworICAgIEludFNpemUgbV90aWxlU2l6ZTsKKworICAgIGJvb2wgbV9jbGVhclRleHR1
cmVKb2JzOworICAgIFZlY3RvcjxUZXh0dXJlSm9iPiBtX3BlbmRpbmdUZXh0dXJlSm9iczsgLy8g
QWRkZWQsIGJ1dCBub3QgY29tbWl0dGVkIHlldC4KKyAgICBEZXF1ZTxUZXh0dXJlSm9iPiBtX3Rl
eHR1cmVKb2JzOworICAgIGJvb2wgbV9oYXNNaXNzaW5nVGV4dHVyZXM7CisKKyAgICBIYXNoU2V0
PFRpbGVJbmRleD4gbV9yZW5kZXJKb2JzOworICAgIE11dGV4IG1fcmVuZGVySm9ic011dGV4Owor
ICAgIGRvdWJsZSBtX2NvbnRlbnRzU2NhbGU7Cit9OworCit9CisKKyNlbmRpZiAvLyBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZiAvLyBMYXllclRpbGVyX2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>131001</attachid>
            <date>2012-03-09 00:45:57 -0800</date>
            <delta_ts>2012-03-09 09:31:00 -0800</delta_ts>
            <desc>patch-v4</desc>
            <filename>bug-79875-20120309164559.patch</filename>
            <type>text/plain</type>
            <size>51124</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEwMjcyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNjgwNjJjYTI1OWRjZmJk
MWVjMTMzOWVmZWE2ZTJhYmQ3MmE5ZGI3OS4uYWZjOTViNGUzYmU4NzhkNjU3NGFhYmY4YjVjYmQz
ZTA0ZDI2YWU1MiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDk2IEBACisyMDEyLTAzLTA5ICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBjbGFzc2VzIHRoYXQgaGFuZGxlIGxheWVyIHRpbGluZworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzk4NzUKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtaW5n
LCBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5
L0xheWVyVGlsZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJD
b3JlOjpMYXllclRpbGU6OkxheWVyVGlsZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6
On5MYXllclRpbGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlOjpzZXRDb250ZW50cyk6
CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnNldENvbnRlbnRzVG9Db2xvcik6CisgICAg
ICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnVwZGF0ZUNvbnRlbnRzKToKKyAgICAgICAgKFdlYkNv
cmU6OkxheWVyVGlsZTo6ZGlzY2FyZENvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
VGlsZTo6c2V0VmlzaWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnNldFRleHR1
cmUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlLmg6
IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChMYXllclRpbGVEYXRhKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZURhdGE6OkxheWVyVGlsZURhdGEpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJUaWxlRGF0YTo6aXNWaXNpYmxlKToKKyAgICAgICAgKExheWVyVGlsZSk6
CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnRleHR1cmUpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJUaWxlOjppc1Zpc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlOjpp
c0RpcnR5KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZTo6aGFzVGV4dHVyZSk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXllclRpbGU6OnNldENvbnRlbnRzRGlydHkpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlSW5kZXguaDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFRpbGVJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpU
aWxlSW5kZXg6OlRpbGVJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpUaWxlSW5kZXg6On5UaWxl
SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6VGlsZUluZGV4OjppKToKKyAgICAgICAgKFdlYkNv
cmU6OlRpbGVJbmRleDo6aik6CisgICAgICAgIChXZWJDb3JlOjpUaWxlSW5kZXg6OnNldEluZGV4
KToKKyAgICAgICAgKFdlYkNvcmU6Om9wZXJhdG9yPT0pOgorICAgICAgICAoV2ViQ29yZTo6b3Bl
cmF0b3IhPSk6CisgICAgICAgIChXVEYpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Js
YWNrYmVycnkvTGF5ZXJUaWxlci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAg
ICAgIChXZWJDb3JlOjp0cmFuc2Zvcm1Qb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpkZWZhdWx0
VGlsZVNpemUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6TGF5ZXJUaWxlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjp+TGF5ZXJUaWxlcik6CisgICAgICAgIChXZWJD
b3JlOjpMYXllclRpbGVyOjpsYXllcldlYktpdFRocmVhZERlc3Ryb3llZCk6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllclRpbGVyOjpsYXllckNvbXBvc2l0aW5nVGhyZWFkRGVzdHJveWVkKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnNldE5lZWRzRGlzcGxheSk6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllclRpbGVyOjp1cGRhdGVUZXh0dXJlQ29udGVudHNJZk5lZWRlZCk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpzaG91bGRQZXJmb3JtUmVuZGVySm9iKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmFkZFRleHR1cmVKb2IpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJUaWxlcjo6Y2xlYXJUZXh0dXJlSm9icyk6CisgICAgICAgIChXZWJDb3JlOjpMYXll
clRpbGVyOjpjb21taXRQZW5kaW5nVGV4dHVyZVVwbG9hZHMpOgorICAgICAgICAoV2ViQ29yZTo6
TGF5ZXJUaWxlcjo6bGF5ZXJWaXNpYmlsaXR5Q2hhbmdlZCk6CisgICAgICAgIChXZWJDb3JlOjpM
YXllclRpbGVyOjp1cGxvYWRUZXh0dXJlc0lmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyVGlsZXI6OnByb2Nlc3NUZXh0dXJlSm9iKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGls
ZXI6OmFkZFRpbGVKb2IpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6cGVyZm9ybVRp
bGVKb2IpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6ZHJhd1RleHR1cmVzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmRyYXdNaXNzaW5nVGV4dHVyZXMpOgorICAgICAg
ICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6ZHJhd1RleHR1cmVzSW50ZXJuYWwpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJUaWxlcjo6YWRkUmVuZGVySm9iKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyVGlsZXI6OnJlbW92ZVJlbmRlckpvYik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVy
OjpkZWxldGVUZXh0dXJlcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpwcnVuZVRl
eHR1cmVzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnVwZGF0ZVRpbGVTaXplKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OmRpc2FibGVUaWxpbmcpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJUaWxlcjo6c2hvdWxkUHJlZmlsbFRpbGUpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJUaWxlcjo6aW5kZXhPZlRpbGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxl
cjo6b3JpZ2luT2ZUaWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OnJlY3RGb3JU
aWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6Omhhc0RpcnR5VGlsZXMpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6YmluZENvbnRlbnRzVGV4dHVyZSk6CisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVyLmg6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChMYXllclRpbGVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkxheWVyVGlsZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpsYXll
cik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyOjpoYXNNaXNzaW5nVGV4dHVyZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6VGV4dHVyZUpvYjo6VGV4dHVyZUpvYik6Cisg
ICAgICAgIChUZXh0dXJlSm9iKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OlRleHR1
cmVKb2I6OnNldENvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXI6OlRleHR1
cmVKb2I6OnNldENvbnRlbnRzVG9Db2xvcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVy
OjpUZXh0dXJlSm9iOjp1cGRhdGVDb250ZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRp
bGVyOjpUZXh0dXJlSm9iOjpkaXNjYXJkQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5
ZXJUaWxlcjo6VGV4dHVyZUpvYjo6cmVzaXplQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6
TGF5ZXJUaWxlcjo6VGV4dHVyZUpvYjo6ZGlydHlDb250ZW50cyk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclRpbGVyOjpUZXh0dXJlSm9iOjppc051bGwpOgorICAgICAgICAoV2ViQ29yZTo6TGF5
ZXJUaWxlcjo6dGlsZVNpemUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlcjo6cmVtb3Zl
VXBkYXRlQ29udGVudHNKb2JzKToKKwogMjAxMi0wMy0wOCAgQmVuamFtaW4gUG91bGFpbiAgPGJw
b3VsYWluQGFwcGxlLmNvbT4KIAogICAgICAgICBCYXNlIHRoZSBhY2Nlc3MgdG8gQ1NTU3R5bGVE
ZWNsYXJhdGlvbiBvbiB0aGUgQ1NTUHJvcGVydHlJRCBpbnN0ZWFkIG9mIHRoZSBQcm9wZXJ0eU5h
bWUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVy
cnkvTGF5ZXJUaWxlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNr
YmVycnkvTGF5ZXJUaWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mMjFlYTk0OGU4Yzg2YmUxZGJmZmExZGQ4
MGMzMzU3ZTdiNjA4YmY1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGUuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVk
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy
ZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUg
IkxheWVyVGlsZS5oIgorCisjaW5jbHVkZSAiVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitMYXllclRpbGU6OkxheWVyVGlsZSgpCisgICAg
OiBtX2NvbnRlbnRzRGlydHkoZmFsc2UpCit7Cit9CisKK0xheWVyVGlsZTo6fkxheWVyVGlsZSgp
Cit7CisgICAgLy8gTWFrZSBzdXJlIHRvIHVucHJvdGVjdCB0aGUgdGV4dHVyZSBpZiBuZWVkZWQu
CisgICAgc2V0VmlzaWJsZShmYWxzZSk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlOjpzZXRDb250ZW50
cyhjb25zdCBTa0JpdG1hcCYgY29udGVudHMsIGNvbnN0IEludFJlY3QmIHRpbGVSZWN0LCBjb25z
dCBUaWxlSW5kZXgmIGluZGV4LCBib29sIGlzT3BhcXVlKQoreworICAgIHNldFRleHR1cmUodGV4
dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKS0+dGV4dHVyZUZvclRpbGVkQ29udGVudHMoY29u
dGVudHMsIHRpbGVSZWN0LCBpbmRleCwgaXNPcGFxdWUpKTsKK30KKwordm9pZCBMYXllclRpbGU6
OnNldENvbnRlbnRzVG9Db2xvcihjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgc2V0VGV4dHVy
ZSh0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT50ZXh0dXJlRm9yQ29sb3IoY29sb3Ip
KTsKK30KKwordm9pZCBMYXllclRpbGU6OnVwZGF0ZUNvbnRlbnRzKGNvbnN0IFNrQml0bWFwJiBj
b250ZW50cywgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0LCBjb25zdCBJbnRSZWN0JiB0aWxlUmVj
dCkKK3sKKyAgICBzZXRUZXh0dXJlKHRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCktPnVw
ZGF0ZUNvbnRlbnRzKG1fdGV4dHVyZSwgY29udGVudHMsIGRpcnR5UmVjdCwgdGlsZVJlY3QpKTsK
K30KKwordm9pZCBMYXllclRpbGU6OmRpc2NhcmRDb250ZW50cygpCit7CisgICAgc2V0VGV4dHVy
ZSgwKTsKK30KKwordm9pZCBMYXllclRpbGU6OnNldFZpc2libGUoYm9vbCB2aXNpYmxlKQorewor
ICAgIGlmICh2aXNpYmxlID09IG1fdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV92
aXNpYmxlID0gdmlzaWJsZTsKKworICAgIGlmICghbV90ZXh0dXJlKQorICAgICAgICByZXR1cm47
CisKKyAgICAvLyBQcm90ZWN0IHRoZSB0ZXh0dXJlIGZyb20gYmVpbmcgZXZpY3RlZCBmcm9tIGNh
Y2hlCisgICAgLy8gaWYgd2UgYXJlIHZpc2libGUuCisgICAgaWYgKHZpc2libGUpCisgICAgICAg
IG1fdGV4dHVyZS0+cHJvdGVjdCgpOworICAgIGVsc2UKKyAgICAgICAgbV90ZXh0dXJlLT51bnBy
b3RlY3QoKTsKK30KKwordm9pZCBMYXllclRpbGU6OnNldFRleHR1cmUoUGFzc1JlZlB0cjxUZXh0
dXJlPiB0ZXh0dXJlKQoreworICAgIC8vIENsZWFyIHRoaXMgZmxhZyByZWdhcmRsZXNzIG9mIHRo
ZSB2YWx1ZSBvZiB0aGUgdGV4dHVyZSBwYXJhbWV0ZXIuCisgICAgLy8gSWYgaXQncyAwLCBpc0Rp
cnR5KCkgd2lsbCByZXR1cm4gdHJ1ZSBhbnl3YXkuCisgICAgLy8gSWYgaXQncyB0aGUgc2FtZSB0
ZXh0dXJlLCBwZXJoYXBzIHRoZXJlIHdhcyBubyBtb3JlIGRldGFpbGVkIHRleHR1cmUKKyAgICAv
LyBhdmFpbGFibGUgdGhhbiB0aGUgb25lIHdlIGFscmVhZHkgaGFkLCBhbmQga2VlcGluZyB0aGUg
ZGlydHkgZmxhZyB3aWxsCisgICAgLy8gcmVzdWx0IGluIGFuIGVuZGxlc3MgbG9vcCBvZiB1cGRh
dGluZyB0byB0aGUgc2FtZSB0ZXh0dXJlLgorICAgIG1fY29udGVudHNEaXJ0eSA9IGZhbHNlOwor
CisgICAgaWYgKHRleHR1cmUgPT0gbV90ZXh0dXJlKQorICAgICAgICByZXR1cm47CisKKyAgICAv
LyBNb3ZlIHByb3RlY3Rpb24gb3ZlciB0byB0aGUgbmV3IHRleHR1cmUuCisgICAgaWYgKG1fdmlz
aWJsZSkgeworICAgICAgICBpZiAobV90ZXh0dXJlKQorICAgICAgICAgICAgbV90ZXh0dXJlLT51
bnByb3RlY3QoKTsKKyAgICAgICAgaWYgKHRleHR1cmUpCisgICAgICAgICAgICB0ZXh0dXJlLT5w
cm90ZWN0KCk7CisgICAgfQorCisgICAgbV90ZXh0dXJlID0gdGV4dHVyZTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJy
eS9MYXllclRpbGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVy
cnkvTGF5ZXJUaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGVkZGNkYWFlNzMzZDEzYmNlMzY4NWMwOGY3YWRm
ZDQ0NmRjMjM5MQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3
YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIExheWVyVGlsZV9o
CisjZGVmaW5lIExheWVyVGlsZV9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisKKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKK2Ns
YXNzIFNrQml0bWFwOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENvbG9yOworY2xh
c3MgSW50UmVjdDsKK2NsYXNzIFRpbGVJbmRleDsKKworY2xhc3MgTGF5ZXJUaWxlRGF0YSB7Citw
dWJsaWM6CisgICAgTGF5ZXJUaWxlRGF0YSgpCisgICAgICAgIDogbV92aXNpYmxlKGZhbHNlKQor
ICAgIHsKKyAgICB9CisKKyAgICBib29sIGlzVmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmlz
aWJsZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgYm9vbCBtX3Zpc2libGU7Cit9OworCitjbGFzcyBM
YXllclRpbGUgOiBwdWJsaWMgTGF5ZXJUaWxlRGF0YSB7CisgICAgV1RGX01BS0VfRkFTVF9BTExP
Q0FURUQ7CitwdWJsaWM6CisgICAgTGF5ZXJUaWxlKCk7CisgICAgfkxheWVyVGlsZSgpOworCisg
ICAgVGV4dHVyZSogdGV4dHVyZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGV4dHVyZS5nZXQoKTsgfQor
CisgICAgYm9vbCBpc1Zpc2libGUoKSBjb25zdCB7IHJldHVybiBtX3Zpc2libGU7IH0KKyAgICB2
b2lkIHNldFZpc2libGUoYm9vbCk7CisKKyAgICBib29sIGlzRGlydHkoKSBjb25zdCB7IHJldHVy
biBtX2NvbnRlbnRzRGlydHkgfHwgIW1fdGV4dHVyZSB8fCBtX3RleHR1cmUtPmlzRGlydHkoKTsg
fQorCisgICAgYm9vbCBoYXNUZXh0dXJlKCkgY29uc3QgeyByZXR1cm4gbV90ZXh0dXJlICYmIG1f
dGV4dHVyZS0+aGFzVGV4dHVyZSgpOyB9CisKKyAgICB2b2lkIHNldENvbnRlbnRzKGNvbnN0IFNr
Qml0bWFwJiBjb250ZW50cywgY29uc3QgSW50UmVjdCYgdGlsZVJlY3QsIGNvbnN0IFRpbGVJbmRl
eCYsIGJvb2wgaXNPcGFxdWUpOworICAgIHZvaWQgc2V0Q29udGVudHNUb0NvbG9yKGNvbnN0IENv
bG9yJik7CisgICAgdm9pZCB1cGRhdGVDb250ZW50cyhjb25zdCBTa0JpdG1hcCYgY29udGVudHMs
IGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCwgY29uc3QgSW50UmVjdCYgdGlsZVJlY3QpOworICAg
IHZvaWQgZGlzY2FyZENvbnRlbnRzKCk7CisKKyAgICAvLyBUaGUgY3VycmVudCB0ZXh0dXJlIGlz
IGFuIGFjY3VyYXRlIHByZXZpZXcgb2YgdGhpcyBsYXllciwgYnV0IGEgbW9yZQorICAgIC8vIGRl
dGFpbGVkIHRleHR1cmUgY291bGQgYmUgb2J0YWluZWQgYnkgcmVwYWludGluZyB0aGUgbGF5ZXIu
IFVzZWQgd2hlbgorICAgIC8vIHpvb20gbGV2ZWwgY2hhbmdlcy4KKyAgICB2b2lkIHNldENvbnRl
bnRzRGlydHkoKSB7IG1fY29udGVudHNEaXJ0eSA9IHRydWU7IH0KKworcHJpdmF0ZToKKyAgICB2
b2lkIHNldFRleHR1cmUoUGFzc1JlZlB0cjxUZXh0dXJlPik7CisKKyAgICAvLyBOZXZlciBhc3Np
Z24gdG8gbV90ZXh0dXJlIGRpcmVjdGx5LCB1c2Ugc2V0VGV4dHVyZSgpIGFib3ZlLgorICAgIFJl
ZlB0cjxUZXh0dXJlPiBtX3RleHR1cmU7CisgICAgYm9vbCBtX2NvbnRlbnRzRGlydHk7Cit9Owor
Cit9CisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZiAv
LyBUZXh0dXJlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2JsYWNrYmVycnkvTGF5ZXJUaWxlSW5kZXguaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlSW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40ZGYwMDg3Mjg1
YmRjZDFmODE3YTFjODMyZDI2MzQ5YjFjYTVlNDA3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVJbmRleC5oCkBA
IC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTIgUmVzZWFyY2gg
SW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisg
Ki8KKworI2lmbmRlZiBMYXllclRpbGVJbmRleF9oCisjZGVmaW5lIExheWVyVGlsZUluZGV4X2gK
KworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK2NsYXNzIFRpbGVJbmRleCB7CitwdWJsaWM6CisgICAgVGlsZUluZGV4
KCkKKyAgICAgICAgOiBtX2koc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpKQor
ICAgICAgICAsIG1faihzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpCisgICAg
eworICAgIH0KKyAgICBUaWxlSW5kZXgodW5zaWduZWQgaSwgdW5zaWduZWQgaikKKyAgICAgICAg
OiBtX2koaSkKKyAgICAgICAgLCBtX2ooaikKKyAgICB7CisgICAgfQorICAgIH5UaWxlSW5kZXgo
KSB7IH0KKworICAgIHVuc2lnbmVkIGkoKSBjb25zdCB7IHJldHVybiBtX2k7IH0KKyAgICB1bnNp
Z25lZCBqKCkgY29uc3QgeyByZXR1cm4gbV9qOyB9CisgICAgdm9pZCBzZXRJbmRleCh1bnNpZ25l
ZCBpLCB1bnNpZ25lZCBqKQorICAgIHsKKyAgICAgICAgbV9pID0gaTsKKyAgICAgICAgbV9qID0g
ajsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdW5zaWduZWQgbV9pOworICAgIHVuc2lnbmVkIG1f
ajsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVGlsZUluZGV4JiBhLCBjb25z
dCBUaWxlSW5kZXgmIGIpCit7CisgICAgcmV0dXJuIGEuaSgpID09IGIuaSgpICYmIGEuaigpID09
IGIuaigpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFRpbGVJbmRleCYgYSwg
Y29uc3QgVGlsZUluZGV4JiBiKQoreworICAgIHJldHVybiBhLmkoKSAhPSBiLmkoKSB8fCBhLmoo
KSAhPSBiLmooKTsKK30KKworfQorCituYW1lc3BhY2UgV1RGIHsKKwordGVtcGxhdGU8PiBzdHJ1
Y3QgSW50SGFzaDxXZWJDb3JlOjpUaWxlSW5kZXg+IHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFz
aChjb25zdCBXZWJDb3JlOjpUaWxlSW5kZXgmIGtleSkgeyByZXR1cm4gaW50SGFzaCgoc3RhdGlj
X2Nhc3Q8dWludDY0X3Q+KGtleS5pKCkpIDw8IDMyIHwga2V5LmooKSkpOyB9CisgICAgc3RhdGlj
IGJvb2wgZXF1YWwoY29uc3QgV2ViQ29yZTo6VGlsZUluZGV4JiBhLCBjb25zdCBXZWJDb3JlOjpU
aWxlSW5kZXgmIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQorICAgIHN0YXRpYyBjb25zdCBib29sIHNh
ZmVUb0NvbXBhcmVUb0VtcHR5T3JEZWxldGVkID0gdHJ1ZTsKK307Cit0ZW1wbGF0ZTw+IHN0cnVj
dCBEZWZhdWx0SGFzaDxXZWJDb3JlOjpUaWxlSW5kZXg+IHsKKyAgICB0eXBlZGVmIEludEhhc2g8
V2ViQ29yZTo6VGlsZUluZGV4PiBIYXNoOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgSGFzaFRy
YWl0czxXZWJDb3JlOjpUaWxlSW5kZXg+IDogR2VuZXJpY0hhc2hUcmFpdHM8V2ViQ29yZTo6VGls
ZUluZGV4PiB7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgZW1wdHlWYWx1ZUlzWmVybyA9IGZhbHNl
OworICAgIHN0YXRpYyBjb25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSBmYWxzZTsKKyAgICBz
dGF0aWMgV2ViQ29yZTo6VGlsZUluZGV4IGVtcHR5VmFsdWUoKSB7IHJldHVybiBXZWJDb3JlOjpU
aWxlSW5kZXgoKTsgfQorICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdERlbGV0ZWRWYWx1ZShXZWJD
b3JlOjpUaWxlSW5kZXgmIHNsb3QpCisgICAgeworICAgICAgICBuZXcgKCZzbG90KSBXZWJDb3Jl
OjpUaWxlSW5kZXgoc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpIC0gMSwgc3Rk
OjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpIC0gMSk7CisgICAgfQorICAgIHN0YXRp
YyBib29sIGlzRGVsZXRlZFZhbHVlKGNvbnN0IFdlYkNvcmU6OlRpbGVJbmRleCYgdmFsdWUpCisg
ICAgeworICAgICAgICByZXR1cm4gdmFsdWUuaSgpID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5z
aWduZWQ+OjptYXgoKSAtIDEgJiYgdmFsdWUuaigpID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5z
aWduZWQ+OjptYXgoKSAtIDE7CisgICAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgV1RGCisKKyNl
bmRpZiAvLyBMYXllclRpbGVJbmRleF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyVGlsZXIuY3BwIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVyLmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4z
ZGFkMzk5ZDY1Zjk4YmIxMjNkMGM4ZWM0ZWY1MzBiMTc2MGE3Yjk1Ci0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVy
LmNwcApAQCAtMCwwICsxLDc0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBS
ZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy
YWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAx
ICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJMYXllclRpbGVyLmgiCisKKyNpbmNsdWRlICJCaXRt
YXBJbWFnZS5oIgorI2luY2x1ZGUgIkxheWVyQ29tcG9zaXRpbmdUaHJlYWQuaCIKKyNpbmNsdWRl
ICJMYXllck1lc3NhZ2UuaCIKKyNpbmNsdWRlICJMYXllcldlYktpdFRocmVhZC5oIgorI2luY2x1
ZGUgIk5hdGl2ZUltYWdlU2tpYS5oIgorI2luY2x1ZGUgIlRleHR1cmVDYWNoZUNvbXBvc2l0aW5n
VGhyZWFkLmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1TY3JlZW4uaD4KKyNpbmNs
dWRlIDxHTEVTMi9nbDIuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCisvLyBUaGlzIGlzIHVzZWQgdG8gbWFrZSB0aGUgdmlld3BvcnQgYXMgdXNlZCBp
biB0ZXh0dXJlIHZpc2liaWxpdHkgY2FsY3VsYXRpb25zCisvLyBzbGlnaHRseSBsYXJnZXIgc28g
dGV4dHVyZXMgYXJlIHVwbG9hZGVkIGJlZm9yZSBiZWNvbWluZyByZWFsbHkgdmlzaWJsZS4KK2Nv
bnN0IGZsb2F0IHZpZXdwb3J0SW5mbGF0aW9uRmFjdG9yID0gMS4xZjsKKworLy8gVGhlIHRpbGVN
dWx0aXBsaWVyIGluZGljYXRlcyBob3cgbWFueSB0aWxlcyB3aWxsIGZpdCBpbiB0aGUgbGFyZ2Vz
dCBkaW1lbnNpb24KKy8vIG9mIHRoZSBzY3JlZW4sIGlmIGRyYXduIHVzaW5nIGlkZW50aXR5IHRy
YW5zZm9ybS4KKy8vIFdlIHVzZSBoYWxmIHRoZSBzY3JlZW4gc2l6ZSBhcyB0aWxlIHNpemUsIHRv
IHJlZHVjZSB0aGUgdGV4dHVyZSB1cGxvYWQgdGltZQorLy8gZm9yIHNtYWxsIHJlcGFpbnQgcmVj
dHMuIENvbXBhcmVkIHRvIHVzaW5nIHNjcmVlbiBzaXplIGRpcmVjdGx5LCB0aGlzIHNob3VsZAor
Ly8gbWFrZSBtb3N0IHNtYWxsIGludmFsaWRhdGlvbnMgMTZ4IGZhc3RlciwgdW5sZXNzIHRoZXkn
cmUgdW5mb3J0dW5hdGUgZW5vdWdoCisvLyB0byBpbnRlcnNlY3QgdHdvIG9yIG1vcmUgdGlsZXMs
IHdoZXJlIGl0IHdvdWxkIGJlIDh4LTF4IGZhc3Rlci4KK2NvbnN0IGludCB0aWxlTXVsdGlwbGll
ciA9IDQ7CisKK3N0YXRpYyB2b2lkIHRyYW5zZm9ybVBvaW50KGZsb2F0IHgsIGZsb2F0IHksIGNv
bnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBtLCBmbG9hdCogcmVzdWx0KQoreworICAgIC8vIFNx
dWFzaCB0aGUgWiBjb29yZGluYXRlIHNvIHRoYXQgbGF5ZXJzIGFyZW4ndCBjbGlwcGVkIGFnYWlu
c3QgdGhlIG5lYXIgYW5kCisgICAgLy8gZmFyIHBsYW5lLiBOb3RlIHRoYXQgdGhlIHBlcnNwZWN0
aXZlIGlzIG1haW50YWluZWQgYXMgd2UncmUgc3RpbGwgcGFzc2luZworICAgIC8vIGRvd24gdGhl
IFcgY29vcmRpbmF0ZS4KKyAgICByZXN1bHRbMF0gPSB4ICogbS5tMTEoKSArIHkgKiBtLm0yMSgp
ICsgbS5tNDEoKTsKKyAgICByZXN1bHRbMV0gPSB4ICogbS5tMTIoKSArIHkgKiBtLm0yMigpICsg
bS5tNDIoKTsKKyAgICByZXN1bHRbMl0gPSAwOworICAgIHJlc3VsdFszXSA9IHggKiBtLm0xNCgp
ICsgeSAqIG0ubTI0KCkgKyBtLm00NCgpOworfQorCitzdGF0aWMgSW50U2l6ZSBkZWZhdWx0VGls
ZVNpemUoKQoreworICAgIHN0YXRpYyBJbnRTaXplIHNjcmVlblNpemUgPSBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6cHJpbWFyeVNjcmVlbigpLT5uYXRpdmVTaXplKCk7
CisgICAgc3RhdGljIGludCBkaW0gPSBtYXgoc2NyZWVuU2l6ZS53aWR0aCgpLCBzY3JlZW5TaXpl
LmhlaWdodCgpKSAvIHRpbGVNdWx0aXBsaWVyOworICAgIHJldHVybiBJbnRTaXplKGRpbSwgZGlt
KTsKK30KKworTGF5ZXJUaWxlcjo6TGF5ZXJUaWxlcihMYXllcldlYktpdFRocmVhZCogbGF5ZXIp
CisgICAgOiBtX2xheWVyKGxheWVyKQorICAgICwgbV90aWxpbmdEaXNhYmxlZChmYWxzZSkKKyAg
ICAsIG1fY29udGVudHNEaXJ0eShmYWxzZSkKKyAgICAsIG1fdGlsZVNpemUoZGVmYXVsdFRpbGVT
aXplKCkpCisgICAgLCBtX2NsZWFyVGV4dHVyZUpvYnMoZmFsc2UpCisgICAgLCBtX2hhc01pc3Np
bmdUZXh0dXJlcyhmYWxzZSkKKyAgICAsIG1fY29udGVudHNTY2FsZSgwLjApCit7Cit9CisKK0xh
eWVyVGlsZXI6On5MYXllclRpbGVyKCkKK3sKKyAgICAvLyBTb21lb25lIHNob3VsZCBoYXZlIGNh
bGxlZCBMYXllclRpbGVyOjpkZWxldGVUZXh0dXJlcygpCisgICAgLy8gYmVmb3JlIG5vdy4gV2Ug
Y2FuJ3QgY2FsbCBpdCBoZXJlIGJlY2F1c2Ugd2UgaGF2ZSBubworICAgIC8vIE9wZW5HTCBjb250
ZXh0LgorICAgIEFTU0VSVChtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuaXNFbXB0eSgpKTsKK30K
Kwordm9pZCBMYXllclRpbGVyOjpsYXllcldlYktpdFRocmVhZERlc3Ryb3llZCgpCit7CisgICAg
bV9sYXllciA9IDA7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6bGF5ZXJDb21wb3NpdGluZ1RocmVh
ZERlc3Ryb3llZCgpCit7CisgICAgQVNTRVJUKGlzQ29tcG9zaXRpbmdUaHJlYWQoKSk7Cit9CisK
K3ZvaWQgTGF5ZXJUaWxlcjo6c2V0TmVlZHNEaXNwbGF5KGNvbnN0IEZsb2F0UmVjdCYgZGlydHlS
ZWN0KQoreworICAgIG1fZGlydHlSZWN0LnVuaXRlKGRpcnR5UmVjdCk7CisgICAgbV9jb250ZW50
c0RpcnR5ID0gdHJ1ZTsKK30KKwordm9pZCBMYXllclRpbGVyOjpzZXROZWVkc0Rpc3BsYXkoKQor
eworICAgIG1fZGlydHlSZWN0LnNldExvY2F0aW9uKEZsb2F0UG9pbnQ6Onplcm8oKSk7CisgICAg
bV9kaXJ0eVJlY3Quc2V0U2l6ZShtX2xheWVyLT5ib3VuZHMoKSk7CisgICAgbV9jb250ZW50c0Rp
cnR5ID0gdHJ1ZTsKK30KKwordm9pZCBMYXllclRpbGVyOjp1cGRhdGVUZXh0dXJlQ29udGVudHNJ
Zk5lZWRlZChkb3VibGUgc2NhbGUpCit7CisgICAgdXBkYXRlVGlsZVNpemUoKTsKKworICAgIEhh
c2hTZXQ8VGlsZUluZGV4PiByZW5kZXJKb2JzOworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIg
bG9ja2VyKG1fcmVuZGVySm9ic011dGV4KTsKKyAgICAgICAgaWYgKCFtX2NvbnRlbnRzRGlydHkg
JiYgbV9yZW5kZXJKb2JzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
cmVuZGVySm9icyA9IG1fcmVuZGVySm9iczsKKyAgICB9CisKKyAgICBib29sIGlzWm9vbUpvYiA9
IGZhbHNlOworICAgIGlmIChzY2FsZSAhPSBtX2NvbnRlbnRzU2NhbGUpIHsKKyAgICAgICAgLy8g
VGhlIGZpcnN0IHRpbWUgYXJvdW5kLCBpdCBkb2VzIG5vdCBjb3VudCBhcyBhIHpvb20gam9iLgor
ICAgICAgICBpZiAobV9jb250ZW50c1NjYWxlKQorICAgICAgICAgICAgaXNab29tSm9iID0gdHJ1
ZTsKKyAgICAgICAgbV9jb250ZW50c1NjYWxlID0gc2NhbGU7CisgICAgfQorCisgICAgSW50UmVj
dCBkaXJ0eVJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KG1fZGlydHlSZWN0KTsKKyAgICBJbnRTaXpl
IHJlcXVpcmVkVGV4dHVyZVNpemU7CisKKyAgICBpZiAobV9sYXllci0+ZHJhd3NDb250ZW50KCkp
IHsKKyAgICAgICAgLy8gTGF5ZXIgY29udGVudHMgbXVzdCBiZSBkcmF3biBpbnRvIGEgY2FudmFz
LgorICAgICAgICBJbnRSZWN0IHVudHJhbnNmb3JtZWREaXJ0eVJlY3QoZGlydHlSZWN0KTsKKyAg
ICAgICAgSW50UmVjdCBib3VuZHNSZWN0KEludFBvaW50Ojp6ZXJvKCksIG1fbGF5ZXItPmJvdW5k
cygpKTsKKyAgICAgICAgSW50UmVjdCB1bnRyYW5zZm9ybWVkQm91bmRzUmVjdChib3VuZHNSZWN0
KTsKKyAgICAgICAgcmVxdWlyZWRUZXh0dXJlU2l6ZSA9IGJvdW5kc1JlY3Quc2l6ZSgpOworCisg
ICAgICAgIGlmIChzY2FsZSAhPSAxLjApIHsKKyAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4IG1hdHJpeDsKKyAgICAgICAgICAgIG1hdHJpeC5zY2FsZShzY2FsZSk7CisKKyAgICAgICAg
ICAgIGRpcnR5UmVjdCA9IG1hdHJpeC5tYXBSZWN0KHVudHJhbnNmb3JtZWREaXJ0eVJlY3QpOwor
ICAgICAgICAgICAgcmVxdWlyZWRUZXh0dXJlU2l6ZSA9IG1hdHJpeC5tYXBSZWN0KEludFJlY3Qo
SW50UG9pbnQ6Onplcm8oKSwgcmVxdWlyZWRUZXh0dXJlU2l6ZSkpLnNpemUoKTsKKyAgICAgICAg
ICAgIGJvdW5kc1JlY3QgPSBtYXRyaXgubWFwUmVjdCh1bnRyYW5zZm9ybWVkQm91bmRzUmVjdCk7
CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWlyZWRUZXh0dXJlU2l6ZSAhPSBtX3BlbmRp
bmdUZXh0dXJlU2l6ZSkKKyAgICAgICAgICAgIGRpcnR5UmVjdCA9IGJvdW5kc1JlY3Q7CisgICAg
ICAgIGVsc2UgeworICAgICAgICAgICAgLy8gQ2xpcCB0aGUgZGlydHlSZWN0IHRvIHRoZSBzaXpl
IG9mIHRoZSBsYXllciB0byBhdm9pZCBkcmF3aW5nCisgICAgICAgICAgICAvLyBvdXRzaWRlIHRo
ZSBib3VuZHMgb2YgdGhlIGJhY2tpbmcgdGV4dHVyZS4KKyAgICAgICAgICAgIGRpcnR5UmVjdC5p
bnRlcnNlY3QoYm91bmRzUmVjdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1fbGF5ZXIt
PmNvbnRlbnRzKCkpIHsKKyAgICAgICAgLy8gTGF5ZXIgaXMgYSBjb250YWluZXIsIGFuZCBpdCBj
b250YWlucyBhbiBJbWFnZS4KKyAgICAgICAgcmVxdWlyZWRUZXh0dXJlU2l6ZSA9IG1fbGF5ZXIt
PmNvbnRlbnRzKCktPnNpemUoKTsKKyAgICAgICAgZGlydHlSZWN0ID0gSW50UmVjdChJbnRQb2lu
dDo6emVybygpLCByZXF1aXJlZFRleHR1cmVTaXplKTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBu
ZWVkIGRpc3BsYXkgYmVjYXVzZSB3ZSBubyBsb25nZXIgbmVlZCB0byBiZSBkaXNwbGF5ZWQsIGR1
ZSB0byB0ZXh0dXJlIHNpemUgYmVjb21pbmcgMCB4IDAsCisgICAgLy8gb3IgaWYgd2UncmUgcmUt
cmVuZGVyaW5nIHRoZSB3aG9sZSB0aGluZyBhbnl3YXksIGNsZWFyIG9sZCB0ZXh0dXJlIGpvYnMu
CisgICAgSGFzaFNldDxUaWxlSW5kZXg+IGZpbmlzaGVkSm9iczsKKyAgICBpZiAocmVxdWlyZWRU
ZXh0dXJlU2l6ZS5pc0VtcHR5KCkgfHwgZGlydHlSZWN0ID09IEludFJlY3QoSW50UG9pbnQ6Onpl
cm8oKSwgcmVxdWlyZWRUZXh0dXJlU2l6ZSkpIHsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0
ZXhMb2NrZXIgbG9ja2VyKG1fcmVuZGVySm9ic011dGV4KTsKKyAgICAgICAgICAgIG1fcmVuZGVy
Sm9icy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGNsZWFyVGV4dHVyZUpvYnMoKTsKKyAg
ICB9IGVsc2UgaWYgKCFyZW5kZXJKb2JzLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoSW1hZ2Uq
IGltYWdlID0gbV9sYXllci0+Y29udGVudHMoKSkgeworICAgICAgICAgICAgYm9vbCBpc09wYXF1
ZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGltYWdlLT5pc0JpdG1hcEltYWdlKCkpCisgICAg
ICAgICAgICAgICAgaXNPcGFxdWUgPSAhc3RhdGljX2Nhc3Q8Qml0bWFwSW1hZ2UqPihpbWFnZSkt
PmN1cnJlbnRGcmFtZUhhc0FscGhhKCk7CisgICAgICAgICAgICBpZiAoTmF0aXZlSW1hZ2VQdHIg
bmF0aXZlSW1hZ2UgPSBpbWFnZS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKSkgeworICAg
ICAgICAgICAgICAgIFNrQml0bWFwIGJpdG1hcCA9IFNrQml0bWFwKCpuYXRpdmVJbWFnZSk7Cisg
ICAgICAgICAgICAgICAgYWRkVGV4dHVyZUpvYihUZXh0dXJlSm9iOjpzZXRDb250ZW50cyhiaXRt
YXAsIGlzT3BhcXVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICAvLyBUaGVyZSBtaWdodCBzdGlsbCBiZSBzb21lIHBlbmRpbmcgcmVuZGVyIGpvYnMgZHVl
IHRvIHZpc2liaWxpdHkgY2hhbmdlcy4KKyAgICAgICAgICAgIGZvciAoSGFzaFNldDxUaWxlSW5k
ZXg+OjppdGVyYXRvciBpdCA9IHJlbmRlckpvYnMuYmVnaW4oKTsgaXQgIT0gcmVuZGVySm9icy5l
bmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8g
Q2hlY2sgaWYgdGhlIGpvYiBoYXMgYmVlbiBjYW5jZWxsZWQuCisgICAgICAgICAgICAgICAgICAg
IE11dGV4TG9ja2VyIGxvY2tlcihtX3JlbmRlckpvYnNNdXRleCk7CisgICAgICAgICAgICAgICAg
ICAgIGlmICghbV9yZW5kZXJKb2JzLmNvbnRhaW5zKCppdCkpCisgICAgICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgbV9yZW5kZXJKb2JzLnJlbW92ZSgq
aXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEludFJlY3QgdGlsZVJl
Y3QgPSByZWN0Rm9yVGlsZSgqaXQsIHJlcXVpcmVkVGV4dHVyZVNpemUpOworICAgICAgICAgICAg
ICAgIGlmICh0aWxlUmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgICAgICAgICAgYm9vbCBpc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAg
ICAgICAgICBDb2xvciBjb2xvcjsKKyAgICAgICAgICAgICAgICBTa0JpdG1hcCBiaXRtYXAgPSBt
X2xheWVyLT5wYWludENvbnRlbnRzKHRpbGVSZWN0LCBzY2FsZSwgJmlzU29saWRDb2xvciwgJmNv
bG9yKTsKKyAgICAgICAgICAgICAgICAvLyBiaXRtYXAgY2FuIGJlIG51bGwgaGVyZS4gTWFrZSBy
ZXF1aXJlZFRleHR1cmVTaXplIGVtcHR5IHNvIHRoYXQgd2UKKyAgICAgICAgICAgICAgICAvLyB3
aWxsIG5vdCB0cnkgdG8gdXBkYXRlIGFuZCBkcmF3IHRoZSBsYXllci4KKyAgICAgICAgICAgICAg
ICBpZiAoIWJpdG1hcC5pc051bGwoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNTb2xp
ZENvbG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkVGV4dHVyZUpvYihUZXh0dXJlSm9i
OjpzZXRDb250ZW50c1RvQ29sb3IoY29sb3IsICppdCkpOworICAgICAgICAgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRUZXh0dXJlSm9iKFRleHR1cmVKb2I6OnVw
ZGF0ZUNvbnRlbnRzKGJpdG1hcCwgdGlsZVJlY3QpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICBmaW5pc2hlZEpvYnMuYWRkKCppdCk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBib29sIGRpZFJlc2l6ZSA9IGZhbHNlOworICAgIGlmIChtX3Bl
bmRpbmdUZXh0dXJlU2l6ZSAhPSByZXF1aXJlZFRleHR1cmVTaXplKSB7CisgICAgICAgIGRpZFJl
c2l6ZSA9IHRydWU7CisgICAgICAgIG1fcGVuZGluZ1RleHR1cmVTaXplID0gcmVxdWlyZWRUZXh0
dXJlU2l6ZTsKKyAgICAgICAgYWRkVGV4dHVyZUpvYihUZXh0dXJlSm9iOjpyZXNpemVDb250ZW50
cyhtX3BlbmRpbmdUZXh0dXJlU2l6ZSkpOworICAgIH0KKyAgICBtX2NvbnRlbnRzRGlydHkgPSBm
YWxzZTsKKyAgICBtX2RpcnR5UmVjdCA9IEZsb2F0UmVjdCgpOworCisgICAgaWYgKGRpcnR5UmVj
dC5pc0VtcHR5KCkgfHwgcmVxdWlyZWRUZXh0dXJlU2l6ZS5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmIChJbWFnZSogaW1hZ2UgPSBtX2xheWVyLT5jb250ZW50cygpKSB7Cisg
ICAgICAgIGJvb2wgaXNPcGFxdWUgPSBmYWxzZTsKKyAgICAgICAgaWYgKGltYWdlLT5pc0JpdG1h
cEltYWdlKCkpCisgICAgICAgICAgICBpc09wYXF1ZSA9ICFzdGF0aWNfY2FzdDxCaXRtYXBJbWFn
ZSo+KGltYWdlKS0+Y3VycmVudEZyYW1lSGFzQWxwaGEoKTsKKyAgICAgICAgLy8gTm8gcG9pbnQg
aW4gdGlsaW5nIGFuIGltYWdlIGxheWVyLCB0aGUgaW1hZ2UgaXMgYWxyZWFkeSBzdG9yZWQgYXMg
YW4gU2tCaXRtYXAKKyAgICAgICAgTmF0aXZlSW1hZ2VQdHIgbmF0aXZlSW1hZ2UgPSBtX2xheWVy
LT5jb250ZW50cygpLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgICAgICBpZiAo
bmF0aXZlSW1hZ2UpIHsKKyAgICAgICAgICAgIFNrQml0bWFwIGJpdG1hcCA9IFNrQml0bWFwKCpu
YXRpdmVJbWFnZSk7CisgICAgICAgICAgICBhZGRUZXh0dXJlSm9iKFRleHR1cmVKb2I6OnNldENv
bnRlbnRzKGJpdG1hcCwgaXNPcGFxdWUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgSW50UG9pbnQgdG9wTGVmdCA9IGRpcnR5UmVjdC5taW5YTWluWUNvcm5lcigp
OworICAgIEludFBvaW50IGJvdHRvbVJpZ2h0ID0gZGlydHlSZWN0Lm1heFhNYXhZQ29ybmVyKCk7
IC8vIFRoaXMgaXMgYWN0dWFsbHkgYSBwaXhlbCBiZWxvdyBhbmQgdG8gdGhlIHJpZ2h0IG9mIHRo
ZSBkaXJ0eVJlY3QuCisKKyAgICBJbnRTaXplIHRpbGVNYXhpbXVtU2l6ZSA9IHRpbGVTaXplKCk7
CisgICAgYm9vbCB3YXNPbmVUaWxlID0gbV90aWxlc1dlYktpdFRocmVhZC5zaXplKCkgPT0gMTsK
KyAgICBib29sIGlzT25lVGlsZSA9IG1fcGVuZGluZ1RleHR1cmVTaXplLndpZHRoKCkgPD0gdGls
ZU1heGltdW1TaXplLndpZHRoKCkgJiYgbV9wZW5kaW5nVGV4dHVyZVNpemUuaGVpZ2h0KCkgPD0g
dGlsZU1heGltdW1TaXplLmhlaWdodCgpOworICAgIEludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9m
VGlsZShpbmRleE9mVGlsZSh0b3BMZWZ0KSk7CisgICAgSW50UmVjdCB0aWxlUmVjdDsKKyAgICBm
b3IgKHRpbGVSZWN0LnNldFgob3JpZ2luLngoKSk7IHRpbGVSZWN0LngoKSA8IGJvdHRvbVJpZ2h0
LngoKTsgdGlsZVJlY3Quc2V0WCh0aWxlUmVjdC54KCkgKyB0aWxlTWF4aW11bVNpemUud2lkdGgo
KSkpIHsKKyAgICAgICAgZm9yICh0aWxlUmVjdC5zZXRZKG9yaWdpbi55KCkpOyB0aWxlUmVjdC55
KCkgPCBib3R0b21SaWdodC55KCk7IHRpbGVSZWN0LnNldFkodGlsZVJlY3QueSgpICsgdGlsZU1h
eGltdW1TaXplLmhlaWdodCgpKSkgeworICAgICAgICAgICAgdGlsZVJlY3Quc2V0V2lkdGgobWlu
KHJlcXVpcmVkVGV4dHVyZVNpemUud2lkdGgoKSAtIHRpbGVSZWN0LngoKSwgdGlsZU1heGltdW1T
aXplLndpZHRoKCkpKTsKKyAgICAgICAgICAgIHRpbGVSZWN0LnNldEhlaWdodChtaW4ocmVxdWly
ZWRUZXh0dXJlU2l6ZS5oZWlnaHQoKSAtIHRpbGVSZWN0LnkoKSwgdGlsZU1heGltdW1TaXplLmhl
aWdodCgpKSk7CisKKyAgICAgICAgICAgIEludFJlY3QgbG9jYWxEaXJ0eVJlY3QoZGlydHlSZWN0
KTsKKyAgICAgICAgICAgIGxvY2FsRGlydHlSZWN0LmludGVyc2VjdCh0aWxlUmVjdCk7CisgICAg
ICAgICAgICBpZiAobG9jYWxEaXJ0eVJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgICAgICBUaWxlSW5kZXggaW5kZXggPSBpbmRleE9mVGlsZSh0aWxl
UmVjdC5sb2NhdGlvbigpKTsKKworICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBkaWQgdGhp
cyBhcyBwYXJ0IG9mIG9uZSBvZiB0aGUgcmVuZGVyIGpvYnMgZHVlIHRvCisgICAgICAgICAgICAv
LyB2aXNpYmlsaXR5IGNoYW5nZXMsIGRvbid0IHJlbmRlciB0aGF0IHRpbGUgYWdhaW4uCisgICAg
ICAgICAgICBpZiAoZmluaXNoZWRKb2JzLmNvbnRhaW5zKGluZGV4KSkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKCFzaG91bGRQZXJmb3JtUmVuZGVySm9iKGlu
ZGV4LCAhaXNab29tSm9iKSkgeworICAgICAgICAgICAgICAgIC8vIEF2b2lkIGNoZWNrZXJib2Fy
ZGluZyB1bmxlc3MgdGhlIGxheWVyIGlzIHJlc2l6ZWQuIFdoZW4KKyAgICAgICAgICAgICAgICAv
LyByZXNpemVkLCB0aGUgY29udGVudHMgYXJlIGxpa2VseSB0byBjaGFuZ2UgYXBwZWFyYW5jZSwg
Zm9yCisgICAgICAgICAgICAgICAgLy8gZXhhbXBsZSBkdWUgdG8gYXNwZWN0IHJhdGlvIGNoYW5n
ZS4gSG93ZXZlciwgaWYgaXQgaXMgYQorICAgICAgICAgICAgICAgIC8vIHJlc2l6ZSBkdWUgdG8g
em9vbWluZywgdGhlIGFzcGVjdCByYXRpbyBhbmQgY29udGVudCB3aWxsCisgICAgICAgICAgICAg
ICAgLy8gc3RheSB0aGUgc2FtZSwgYW5kIHdlIGNhbiBrZWVwIHRoZSBvbGQgdGV4dHVyZSBjb250
ZW50IGFzIGEKKyAgICAgICAgICAgICAgICAvLyBwcmV2aWV3LgorICAgICAgICAgICAgICAgIC8v
IEZJWE1FOiB0aGUgem9vbSBwcmV2aWV3IG9ubHkgd29ya3MgaWYgd2UgZG9uJ3QgcmUtdGlsZSB0
aGUKKyAgICAgICAgICAgICAgICAvLyBsYXllci4gV2UgbmVlZCB0byBzdG9yZSB0ZXh0dXJlIGNv
b3JkaW5hdGVzIGluCisgICAgICAgICAgICAgICAgLy8gV2ViQ29yZTo6VGV4dHVyZSB0byBiZSBh
YmxlIHRvIGZpeCB0aGF0LgorICAgICAgICAgICAgICAgIGlmIChkaWRSZXNpemUgJiYgIShpc1pv
b21Kb2IgJiYgd2FzT25lVGlsZSAmJiBpc09uZVRpbGUpKQorICAgICAgICAgICAgICAgICAgICBh
ZGRUZXh0dXJlSm9iKFRleHR1cmVKb2I6OmRpc2NhcmRDb250ZW50cyh0aWxlUmVjdCkpOworICAg
ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYWRkVGV4dHVyZUpvYihUZXh0
dXJlSm9iOjpkaXJ0eUNvbnRlbnRzKHRpbGVSZWN0KSk7CisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEp1c3QgaW4gY2FzZSBhIG5ldyBq
b2IgZm9yIHRoaXMgdGlsZSBoYXMganVzdCBiZWVuIGluc2VydGVkIGJ5IGNvbXBvc2l0aW5nIHRo
cmVhZC4KKyAgICAgICAgICAgIHJlbW92ZVJlbmRlckpvYihpbmRleCk7CisKKyAgICAgICAgICAg
IC8vIEZJWE1FOiBXZSBhcmUgYWx3YXlzIGRyYXdpbmcgd2hvbGUgdGlsZXMgYXQgdGhlIG1vbWVu
dCwgYmVjYXVzZQorICAgICAgICAgICAgLy8gd2UgY3VycmVudGx5IGNhbid0IGtlZXAgdHJhY2sg
b2Ygd2hpY2ggcGFydCBvZiBhIHRpbGUgaXMKKyAgICAgICAgICAgIC8vIHJlbmRlcmVkIGFuZCB3
aGljaCBpcyBub3QuIFNlbmRpbmcgb25seSBhIHN1YnJlY3RhbmdsZSBvZiBhIHRpbGUKKyAgICAg
ICAgICAgIC8vIHRvIHRoZSBjb21wb3NpdGluZyB0aHJlYWQgbWlnaHQgY2F1c2UgaXQgdG8gYmUg
dXBsb2FkZWQgdXNpbmcKKyAgICAgICAgICAgIC8vIGdsVGV4SW1hZ2UsIGlmIHRoZSB0ZXh0dXJl
IHdhcyBwcmV2aW91c2x5IGV2aWN0ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICAgICAgICAvLyBU
aGUgcmVzdWx0IHdvdWxkIGJlIHRoYXQgYSBzdWJyZWN0YW5nbGUgb2YgdGhlIHRpbGUgd2FzIHN0
cmV0Y2hlZAorICAgICAgICAgICAgLy8gdG8gZml0IHRoZSB0aWxlIGdlb21ldHJ5LCBhcHBlYXJp
bmcgYXMgYSBnbGFyaW5nIG1pc3JlbmRlcmluZyBvZgorICAgICAgICAgICAgLy8gdGhlIHdlYiBw
YWdlLgorICAgICAgICAgICAgYm9vbCBpc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgICAg
IENvbG9yIGNvbG9yOworICAgICAgICAgICAgU2tCaXRtYXAgYml0bWFwID0gbV9sYXllci0+cGFp
bnRDb250ZW50cyh0aWxlUmVjdCwgc2NhbGUsICZpc1NvbGlkQ29sb3IsICZjb2xvcik7CisgICAg
ICAgICAgICAvLyBiaXRtYXAgY2FuIGJlIG51bGwgaGVyZS4gTWFrZSByZXF1aXJlZFRleHR1cmVT
aXplIGVtcHR5IHNvIHRoYXQgd2UKKyAgICAgICAgICAgIC8vIHdpbGwgbm90IHRyeSB0byB1cGRh
dGUgYW5kIGRyYXcgdGhlIGxheWVyLgorICAgICAgICAgICAgaWYgKCFiaXRtYXAuaXNOdWxsKCkp
IHsKKyAgICAgICAgICAgICAgICBpZiAoaXNTb2xpZENvbG9yKQorICAgICAgICAgICAgICAgICAg
ICBhZGRUZXh0dXJlSm9iKFRleHR1cmVKb2I6OnNldENvbnRlbnRzVG9Db2xvcihjb2xvciwgaW5k
ZXgpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGFkZFRleHR1
cmVKb2IoVGV4dHVyZUpvYjo6dXBkYXRlQ29udGVudHMoYml0bWFwLCB0aWxlUmVjdCkpOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitib29sIExheWVyVGlsZXI6OnNob3Vs
ZFBlcmZvcm1SZW5kZXJKb2IoY29uc3QgVGlsZUluZGV4JiBpbmRleCwgYm9vbCBhbGxvd1ByZWZp
bGwpCit7CisgICAgLy8gSWYgdGhlIHZpc2liaWxpdHkgaW5mb3JtYXRpb24gd2FzIHByb3BhZ2F0
ZWQgZnJvbSB0aGUgY29tcG9zaXRpbmcKKyAgICAvLyB0aHJlYWQsIHVzZSB0aGF0IGluZm9ybWF0
aW9uLgorICAgIC8vIEhvd2V2ZXIsIHdlIGFyZSBhYm91dCB0byBjb21taXQgbmV3IGxheWVyIHBy
b3BlcnRpZXMgdGhhdCBtYXkgbWFrZQorICAgIC8vIGN1cnJlbnRseSBoaWRkZW4gbGF5ZXJzIHZp
c2libGUuIFRvIGF2b2lkIGZhbHNlIG5lZ2F0aXZlcywgd2Ugb25seSBhbGxvdworICAgIC8vIHRo
ZSBjdXJyZW50IHN0YXRlIHRvIGJlIHVzZWQgdG8gYWNjZXB0IHJlbmRlciBqb2JzLCBub3QgdG8g
cmVqZWN0IHRoZW0uCisgICAgaWYgKG1fdGlsZXNXZWJLaXRUaHJlYWQuZ2V0KGluZGV4KS5pc1Zp
c2libGUoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBUaWxlcyB0aGF0IGFyZSBu
b3QgY3VycmVudGx5IHZpc2libGUgb24gdGhlIGNvbXBvc2l0aW5nIHRocmVhZCBtYXkgc3RpbGwK
KyAgICAvLyBkZXNlcnZlIHRvIGJlIHJlbmRlcmVkIGlmIHRoZXkgc2hvdWxkIGJlIHByZWZpbGxl
ZC4uLgorICAgIGlmIChhbGxvd1ByZWZpbGwgJiYgIW1fdGlsZXNXZWJLaXRUaHJlYWQuY29udGFp
bnMoaW5kZXgpICYmIHNob3VsZFByZWZpbGxUaWxlKGluZGV4KSkKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisKKyAgICAvLyBPciBpZiB0aGV5IGFyZSB2aXNpYmxlIGFjY29yZGluZyB0byB0aGUgc3Rh
dGUgdGhhdCdzIGFib3V0IHRvIGJlCisgICAgLy8gY29tbWl0dGVkLiBXZSBkbyBhIHZpc2liaWxp
dHkgdGVzdCB1c2luZyB0aGUgY3VycmVudCB0cmFuc2Zvcm0gc3RhdGUuCisgICAgSW50UmVjdCBj
b250ZW50UmVjdCA9IHJlY3RGb3JUaWxlKGluZGV4LCBtX3BlbmRpbmdUZXh0dXJlU2l6ZSk7Cisg
ICAgcmV0dXJuIG1fbGF5ZXItPmNvbnRlbnRzVmlzaWJsZShjb250ZW50UmVjdCk7Cit9CisKK3Zv
aWQgTGF5ZXJUaWxlcjo6YWRkVGV4dHVyZUpvYihjb25zdCBUZXh0dXJlSm9iJiBqb2IpCit7Cisg
ICAgbV9wZW5kaW5nVGV4dHVyZUpvYnMuYXBwZW5kKGpvYik7Cit9CisKK3ZvaWQgTGF5ZXJUaWxl
cjo6Y2xlYXJUZXh0dXJlSm9icygpCit7CisgICAgLy8gQ2xlYXIgYW55IGNvbW1pdHRlZCB0ZXh0
dXJlIGpvYnMgb24gbmV4dCBpbnZvY2F0aW9uIG9mIExheWVyVGlsZXI6OmNvbW1pdFBlbmRpbmdU
ZXh0dXJlVXBsb2FkcygpLgorICAgIG1fY2xlYXJUZXh0dXJlSm9icyA9IHRydWU7CisKKyAgICBy
ZW1vdmVVcGRhdGVDb250ZW50c0pvYnMobV9wZW5kaW5nVGV4dHVyZUpvYnMpOworfQorCit2b2lk
IExheWVyVGlsZXI6OmNvbW1pdFBlbmRpbmdUZXh0dXJlVXBsb2FkcygpCit7CisgICAgaWYgKG1f
Y2xlYXJUZXh0dXJlSm9icykgeworICAgICAgICByZW1vdmVVcGRhdGVDb250ZW50c0pvYnMobV90
ZXh0dXJlSm9icyk7CisgICAgICAgIG1fY2xlYXJUZXh0dXJlSm9icyA9IGZhbHNlOworICAgIH0K
KworICAgIGZvciAoVmVjdG9yPFRleHR1cmVKb2I+OjppdGVyYXRvciBpdCA9IG1fcGVuZGluZ1Rl
eHR1cmVKb2JzLmJlZ2luKCk7IGl0ICE9IG1fcGVuZGluZ1RleHR1cmVKb2JzLmVuZCgpOyArK2l0
KQorICAgICAgICBtX3RleHR1cmVKb2JzLmFwcGVuZCgqaXQpOworICAgIG1fcGVuZGluZ1RleHR1
cmVKb2JzLmNsZWFyKCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6bGF5ZXJWaXNpYmlsaXR5Q2hh
bmdlZChib29sIHZpc2libGUpCit7CisgICAgLy8gRm9yIHZpc2libGUgbGF5ZXJzLCB3ZSBoYW5k
bGUgdGhlIHRpbGUtbGV2ZWwgdmlzaWJpbGl0eQorICAgIC8vIGluIHRoZSBkcmF3IGxvb3AsIHNl
ZSBMYXllclRpbGVyOjpkcmF3VGV4dHVyZXMoKS4KKyAgICBpZiAodmlzaWJsZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgeworICAgICAgICAvLyBBbGwgdGlsZXMgYXJlIGludmlzaWJsZSBub3cu
CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX3JlbmRlckpvYnNNdXRleCk7CisgICAgICAg
IG1fcmVuZGVySm9icy5jbGVhcigpOworICAgIH0KKworICAgIGZvciAoVGlsZU1hcDo6aXRlcmF0
b3IgaXQgPSBtX3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuYmVnaW4oKTsgaXQgIT0gbV90aWxlc0Nv
bXBvc2l0aW5nVGhyZWFkLmVuZCgpOyArK2l0KSB7CisgICAgICAgIFRpbGVJbmRleCBpbmRleCA9
ICgqaXQpLmZpcnN0OworICAgICAgICBMYXllclRpbGUqIHRpbGUgPSAoKml0KS5zZWNvbmQ7Cisg
ICAgICAgIHRpbGUtPnNldFZpc2libGUoZmFsc2UpOworICAgIH0KK30KKwordm9pZCBMYXllclRp
bGVyOjp1cGxvYWRUZXh0dXJlc0lmTmVlZGVkKCkKK3sKKyAgICBUaWxlSm9ic01hcCB0aWxlSm9i
c01hcDsKKyAgICBEZXF1ZTxUZXh0dXJlSm9iPjo6Y29uc3RfaXRlcmF0b3IgdGV4dHVyZUpvYkl0
ZXJFbmQgPSBtX3RleHR1cmVKb2JzLmVuZCgpOworICAgIGZvciAoRGVxdWU8VGV4dHVyZUpvYj46
OmNvbnN0X2l0ZXJhdG9yIHRleHR1cmVKb2JJdGVyID0gbV90ZXh0dXJlSm9icy5iZWdpbigpOyB0
ZXh0dXJlSm9iSXRlciAhPSB0ZXh0dXJlSm9iSXRlckVuZDsgKyt0ZXh0dXJlSm9iSXRlcikKKyAg
ICAgICAgcHJvY2Vzc1RleHR1cmVKb2IoKnRleHR1cmVKb2JJdGVyLCB0aWxlSm9ic01hcCk7CisK
KyAgICBUaWxlSm9ic01hcDo6Y29uc3RfaXRlcmF0b3IgdGlsZUpvYnNJdGVyRW5kID0gdGlsZUpv
YnNNYXAuZW5kKCk7CisgICAgZm9yIChUaWxlSm9ic01hcDo6Y29uc3RfaXRlcmF0b3IgdGlsZUpv
YnNJdGVyID0gdGlsZUpvYnNNYXAuYmVnaW4oKTsgdGlsZUpvYnNJdGVyICE9IHRpbGVKb2JzSXRl
ckVuZDsgKyt0aWxlSm9ic0l0ZXIpIHsKKyAgICAgICAgSW50UG9pbnQgb3JpZ2luID0gb3JpZ2lu
T2ZUaWxlKHRpbGVKb2JzSXRlci0+Zmlyc3QpOworCisgICAgICAgIExheWVyVGlsZSogdGlsZSA9
IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5nZXQodGlsZUpvYnNJdGVyLT5maXJzdCk7CisgICAg
ICAgIGlmICghdGlsZSkgeworICAgICAgICAgICAgaWYgKG9yaWdpbi54KCkgPj0gbV9yZXF1aXJl
ZFRleHR1cmVTaXplLndpZHRoKCkgfHwgb3JpZ2luLnkoKSA+PSBtX3JlcXVpcmVkVGV4dHVyZVNp
emUuaGVpZ2h0KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB0aWxl
ID0gbmV3IExheWVyVGlsZSgpOworICAgICAgICAgICAgbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFk
LmFkZCh0aWxlSm9ic0l0ZXItPmZpcnN0LCB0aWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIElu
dFJlY3QgdGlsZVJlY3Qob3JpZ2luLCB0aWxlU2l6ZSgpKTsKKyAgICAgICAgdGlsZVJlY3Quc2V0
V2lkdGgobWluKG1fcmVxdWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgpIC0gdGlsZVJlY3QueCgpLCB0
aWxlUmVjdC53aWR0aCgpKSk7CisgICAgICAgIHRpbGVSZWN0LnNldEhlaWdodChtaW4obV9yZXF1
aXJlZFRleHR1cmVTaXplLmhlaWdodCgpIC0gdGlsZVJlY3QueSgpLCB0aWxlUmVjdC5oZWlnaHQo
KSkpOworCisgICAgICAgIHBlcmZvcm1UaWxlSm9iKHRpbGUsICp0aWxlSm9ic0l0ZXItPnNlY29u
ZCwgdGlsZVJlY3QpOworICAgIH0KKworICAgIG1fdGV4dHVyZUpvYnMuY2xlYXIoKTsKK30KKwor
dm9pZCBMYXllclRpbGVyOjpwcm9jZXNzVGV4dHVyZUpvYihjb25zdCBUZXh0dXJlSm9iJiBqb2Is
IFRpbGVKb2JzTWFwJiB0aWxlSm9ic01hcCkKK3sKKyAgICBpZiAoam9iLm1fdHlwZSA9PSBUZXh0
dXJlSm9iOjpSZXNpemVDb250ZW50cykgeworICAgICAgICBJbnRTaXplIHBlbmRpbmdUZXh0dXJl
U2l6ZSA9IGpvYi5tX2RpcnR5UmVjdC5zaXplKCk7CisgICAgICAgIGlmIChwZW5kaW5nVGV4dHVy
ZVNpemUud2lkdGgoKSA8IG1fcmVxdWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgpIHx8IHBlbmRpbmdU
ZXh0dXJlU2l6ZS5oZWlnaHQoKSA8IG1fcmVxdWlyZWRUZXh0dXJlU2l6ZS5oZWlnaHQoKSkKKyAg
ICAgICAgICAgIHBydW5lVGV4dHVyZXMoKTsKKworICAgICAgICBtX3JlcXVpcmVkVGV4dHVyZVNp
emUgPSBwZW5kaW5nVGV4dHVyZVNpemU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBp
ZiAoam9iLm1fdHlwZSA9PSBUZXh0dXJlSm9iOjpTZXRDb250ZW50c1RvQ29sb3IpIHsKKyAgICAg
ICAgYWRkVGlsZUpvYihqb2IubV9pbmRleCwgam9iLCB0aWxlSm9ic01hcCk7CisgICAgICAgIHJl
dHVybjsKKyAgICAgfQorCisgICAgSW50U2l6ZSB0aWxlTWF4aW11bVNpemUgPSB0aWxlU2l6ZSgp
OworICAgIEludFBvaW50IHRvcExlZnQgPSBqb2IubV9kaXJ0eVJlY3QubWluWE1pbllDb3JuZXIo
KTsKKyAgICBJbnRQb2ludCBib3R0b21SaWdodCA9IGpvYi5tX2RpcnR5UmVjdC5tYXhYTWF4WUNv
cm5lcigpOyAvLyBUaGlzIGlzIGFjdHVhbGx5IGEgcGl4ZWwgYmVsb3cgYW5kIHRvIHRoZSByaWdo
dCBvZiB0aGUgZGlydHlSZWN0LgorICAgIEludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShp
bmRleE9mVGlsZSh0b3BMZWZ0KSk7CisgICAgSW50UmVjdCB0aWxlUmVjdDsKKyAgICBmb3IgKHRp
bGVSZWN0LnNldFgob3JpZ2luLngoKSk7IHRpbGVSZWN0LngoKSA8IGJvdHRvbVJpZ2h0LngoKTsg
dGlsZVJlY3Quc2V0WCh0aWxlUmVjdC54KCkgKyB0aWxlTWF4aW11bVNpemUud2lkdGgoKSkpIHsK
KyAgICAgICAgZm9yICh0aWxlUmVjdC5zZXRZKG9yaWdpbi55KCkpOyB0aWxlUmVjdC55KCkgPCBi
b3R0b21SaWdodC55KCk7IHRpbGVSZWN0LnNldFkodGlsZVJlY3QueSgpICsgdGlsZU1heGltdW1T
aXplLmhlaWdodCgpKSkKKyAgICAgICAgICAgIGFkZFRpbGVKb2IoaW5kZXhPZlRpbGUodGlsZVJl
Y3QubG9jYXRpb24oKSksIGpvYiwgdGlsZUpvYnNNYXApOworICAgIH0KK30KKwordm9pZCBMYXll
clRpbGVyOjphZGRUaWxlSm9iKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIGNvbnN0IFRleHR1cmVK
b2ImIGpvYiwgVGlsZUpvYnNNYXAmIHRpbGVKb2JzTWFwKQoreworICAgIC8vIEhhc2hNYXA6OmFk
ZCBhbHdheXMgcmV0dXJucyBhIHZhbGlkIGl0ZXJhdG9yIGV2ZW4gdGhlIGtleSBhbHJlYWR5IGV4
aXN0cy4KKyAgICBwYWlyPFRpbGVKb2JzTWFwOjppdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0gdGls
ZUpvYnNNYXAuYWRkKGluZGV4LCAmam9iKTsKKworICAgIC8vIFN1Y2Nlc3NmdWxseSBhZGRlZCB0
aGUgbmV3IGpvYi4KKyAgICBpZiAocmVzdWx0LnNlY29uZCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgLy8gSW4gdGhpcyBjYXNlIHdlIGxlYXZlIHRoZSBwcmV2aW91cyBqb2IuCisgICAgaWYgKGpv
Yi5tX3R5cGUgPT0gVGV4dHVyZUpvYjo6RGlydHlDb250ZW50cyAmJiByZXN1bHQuZmlyc3QtPnNl
Y29uZC0+bV90eXBlID09IFRleHR1cmVKb2I6OkRpc2NhcmRDb250ZW50cykKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gT3ZlcnJpZGUgdGhlIHByZXZpb3VzIGpvYi4KKyAgICByZXN1bHQuZmly
c3QtPnNlY29uZCA9ICZqb2I7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6cGVyZm9ybVRpbGVKb2Io
TGF5ZXJUaWxlKiB0aWxlLCBjb25zdCBUZXh0dXJlSm9iJiBqb2IsIGNvbnN0IEludFJlY3QmIHRp
bGVSZWN0KQoreworICAgIHN3aXRjaCAoam9iLm1fdHlwZSkgeworICAgIGNhc2UgVGV4dHVyZUpv
Yjo6U2V0Q29udGVudHNUb0NvbG9yOgorICAgICAgICB0aWxlLT5zZXRDb250ZW50c1RvQ29sb3Io
am9iLm1fY29sb3IpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBUZXh0dXJlSm9iOjpTZXRD
b250ZW50czoKKyAgICAgICAgdGlsZS0+c2V0Q29udGVudHMoam9iLm1fY29udGVudHMsIHRpbGVS
ZWN0LCBpbmRleE9mVGlsZSh0aWxlUmVjdC5sb2NhdGlvbigpKSwgam9iLm1faXNPcGFxdWUpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBUZXh0dXJlSm9iOjpVcGRhdGVDb250ZW50czoKKyAg
ICAgICAgdGlsZS0+dXBkYXRlQ29udGVudHMoam9iLm1fY29udGVudHMsIGpvYi5tX2RpcnR5UmVj
dCwgdGlsZVJlY3QpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBUZXh0dXJlSm9iOjpEaXNj
YXJkQ29udGVudHM6CisgICAgICAgIHRpbGUtPmRpc2NhcmRDb250ZW50cygpOworICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBUZXh0dXJlSm9iOjpEaXJ0eUNvbnRlbnRzOgorICAgICAgICB0aWxl
LT5zZXRDb250ZW50c0RpcnR5KCk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFRleHR1cmVK
b2I6OlVua25vd246CisgICAgY2FzZSBUZXh0dXJlSm9iOjpSZXNpemVDb250ZW50czoKKyAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6ZHJhd1RleHR1cmVzKExh
eWVyQ29tcG9zaXRpbmdUaHJlYWQqIGxheWVyLCBpbnQgcG9zLCBpbnQgdGV4Q29vcmQpCit7Cisg
ICAgZHJhd1RleHR1cmVzSW50ZXJuYWwobGF5ZXIsIHBvcywgdGV4Q29vcmQsIGZhbHNlIC8qIGRy
YXdNaXNzaW5nICovKTsKK30KKwordm9pZCBMYXllclRpbGVyOjpkcmF3TWlzc2luZ1RleHR1cmVz
KExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIGxheWVyLCBpbnQgcG9zLCBpbnQgdGV4Q29vcmQpCit7
CisgICAgZHJhd1RleHR1cmVzSW50ZXJuYWwobGF5ZXIsIHBvcywgdGV4Q29vcmQsIHRydWUgLyog
ZHJhd01pc3NpbmcgKi8pOworfQorCit2b2lkIExheWVyVGlsZXI6OmRyYXdUZXh0dXJlc0ludGVy
bmFsKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIGxheWVyLCBpbnQgcG9zaXRpb25Mb2NhdGlvbiwg
aW50IHRleENvb3JkTG9jYXRpb24sIGJvb2wgZHJhd01pc3NpbmcpCit7CisgICAgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIGRyYXdUcmFuc2Zvcm0gPSBsYXllci0+ZHJhd1RyYW5zZm9ybSgp
OworICAgIEludFNpemUgYm91bmRzID0gbGF5ZXItPmJvdW5kcygpOworCisgICAgZmxvYXQgdGV4
Y29vcmRzWzQgKiAyXSA9IHsgMCwgMCwgIDAsIDEsICAxLCAxLCAgMSwgMCB9OworICAgIGZsb2F0
IHZlcnRpY2VzWzQgKiA0XTsKKworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkxv
Y2F0aW9uLCA0LCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsIHZlcnRpY2VzKTsKKyAgICBnbFZlcnRl
eEF0dHJpYlBvaW50ZXIodGV4Q29vcmRMb2NhdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAw
LCB0ZXhjb29yZHMpOworCisgICAgbV9oYXNNaXNzaW5nVGV4dHVyZXMgPSBmYWxzZTsKKworICAg
IGludCBtYXh3ID0gdGlsZVNpemUoKS53aWR0aCgpOworICAgIGludCBtYXhoID0gdGlsZVNpemUo
KS5oZWlnaHQoKTsKKyAgICBmbG9hdCBzeCA9IHN0YXRpY19jYXN0PGZsb2F0Pihib3VuZHMud2lk
dGgoKSkgLyBtX3JlcXVpcmVkVGV4dHVyZVNpemUud2lkdGgoKTsKKyAgICBmbG9hdCBzeSA9IHN0
YXRpY19jYXN0PGZsb2F0Pihib3VuZHMuaGVpZ2h0KCkpIC8gbV9yZXF1aXJlZFRleHR1cmVTaXpl
LmhlaWdodCgpOworCisgICAgYm9vbCBuZWVkc0Rpc3BsYXkgPSBmYWxzZTsKKworICAgIGJvb2wg
YmxlbmRpbmcgPSAhZHJhd01pc3Npbmc7CisKKyAgICBJbnRSZWN0IHRpbGVSZWN0OworICAgIGZv
ciAodGlsZVJlY3Quc2V0WCgwKTsgdGlsZVJlY3QueCgpIDwgbV9yZXF1aXJlZFRleHR1cmVTaXpl
LndpZHRoKCk7IHRpbGVSZWN0LnNldFgodGlsZVJlY3QueCgpICsgbWF4dykpIHsKKyAgICAgICAg
Zm9yICh0aWxlUmVjdC5zZXRZKDApOyB0aWxlUmVjdC55KCkgPCBtX3JlcXVpcmVkVGV4dHVyZVNp
emUuaGVpZ2h0KCk7IHRpbGVSZWN0LnNldFkodGlsZVJlY3QueSgpICsgbWF4aCkpIHsKKyAgICAg
ICAgICAgIFRpbGVJbmRleCBpbmRleCA9IGluZGV4T2ZUaWxlKHRpbGVSZWN0LmxvY2F0aW9uKCkp
OworICAgICAgICAgICAgTGF5ZXJUaWxlKiB0aWxlID0gbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFk
LmdldChpbmRleCk7CisgICAgICAgICAgICBpZiAoIXRpbGUpIHsKKyAgICAgICAgICAgICAgICB0
aWxlID0gbmV3IExheWVyVGlsZSgpOworICAgICAgICAgICAgICAgIG1fdGlsZXNDb21wb3NpdGlu
Z1RocmVhZC5hZGQoaW5kZXgsIHRpbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBm
bG9hdCB4ID0gaW5kZXguaSgpICogbWF4dyAqIHN4OworICAgICAgICAgICAgZmxvYXQgeSA9IGlu
ZGV4LmooKSAqIG1heGggKiBzeTsKKyAgICAgICAgICAgIGZsb2F0IHcgPSBtaW4oYm91bmRzLndp
ZHRoKCkgLSB4LCBtYXh3ICogc3gpOworICAgICAgICAgICAgZmxvYXQgaCA9IG1pbihib3VuZHMu
aGVpZ2h0KCkgLSB5LCBtYXhoICogc3kpOworICAgICAgICAgICAgZmxvYXQgb3ggPSB4IC0gYm91
bmRzLndpZHRoKCkgLyAyLjA7CisgICAgICAgICAgICBmbG9hdCBveSA9IHkgLSBib3VuZHMuaGVp
Z2h0KCkgLyAyLjA7CisKKyAgICAgICAgICAgIC8vIFdlIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlv
biBieSBoYW5kLCBzaW5jZSB3ZSBuZWVkIHRoZSB6IGNvb3JkaW5hdGUKKyAgICAgICAgICAgIC8v
IGFzIHdlbGwgKHRvIGRvIHBlcnNwZWN0aXZlIGNvcnJlY3QgdGV4dHVyaW5nKSBhbmQgd2UgZG9u
J3QgbmVlZAorICAgICAgICAgICAgLy8gdG8gZGl2aWRlIGJ5IHcgYnkgaGFuZCwgdGhlIEdQVSB3
aWxsIGRvIHRoYXQgZm9yIHVzCisgICAgICAgICAgICB0cmFuc2Zvcm1Qb2ludChveCwgb3ksIGRy
YXdUcmFuc2Zvcm0sICZ2ZXJ0aWNlc1swXSk7CisgICAgICAgICAgICB0cmFuc2Zvcm1Qb2ludChv
eCwgb3kgKyBoLCBkcmF3VHJhbnNmb3JtLCAmdmVydGljZXNbNF0pOworICAgICAgICAgICAgdHJh
bnNmb3JtUG9pbnQob3ggKyB3LCBveSArIGgsIGRyYXdUcmFuc2Zvcm0sICZ2ZXJ0aWNlc1s4XSk7
CisgICAgICAgICAgICB0cmFuc2Zvcm1Qb2ludChveCArIHcsIG95LCBkcmF3VHJhbnNmb3JtLCAm
dmVydGljZXNbMTJdKTsKKworICAgICAgICAgICAgLy8gSW5mbGF0ZSB0aGUgcmVjdCBzb21ld2hh
dCB0byBhdHRlbXB0IHRvIG1ha2UgdGV4dHVyZXMgcmVuZGVyIGJlZm9yZSB0aGV5IHNob3cKKyAg
ICAgICAgICAgIC8vIHVwIG9uIHNjcmVlbi4KKyAgICAgICAgICAgIGZsb2F0IGQgPSB2aWV3cG9y
dEluZmxhdGlvbkZhY3RvcjsKKyAgICAgICAgICAgIEZsb2F0UmVjdCByZWN0KC1kLCAtZCwgMiAq
IGQsIDIgKiBkKTsKKyAgICAgICAgICAgIEZsb2F0UXVhZCBxdWFkKEZsb2F0UG9pbnQodmVydGlj
ZXNbMF0gLyB2ZXJ0aWNlc1szXSwgdmVydGljZXNbMV0gLyB2ZXJ0aWNlc1szXSksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICBGbG9hdFBvaW50KHZlcnRpY2VzWzRdIC8gdmVydGljZXNbN10s
IHZlcnRpY2VzWzVdIC8gdmVydGljZXNbN10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
RmxvYXRQb2ludCh2ZXJ0aWNlc1s4XSAvIHZlcnRpY2VzWzExXSwgdmVydGljZXNbOV0gLyB2ZXJ0
aWNlc1sxMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXRQb2ludCh2ZXJ0aWNl
c1sxMl0gLyB2ZXJ0aWNlc1sxNV0sIHZlcnRpY2VzWzEzXSAvIHZlcnRpY2VzWzE1XSkpOworICAg
ICAgICAgICAgYm9vbCB2aXNpYmxlID0gcXVhZC5ib3VuZGluZ0JveCgpLmludGVyc2VjdHMocmVj
dCk7CisKKyAgICAgICAgICAgIGJvb2wgd2FzVmlzaWJsZSA9IHRpbGUtPmlzVmlzaWJsZSgpOwor
ICAgICAgICAgICAgdGlsZS0+c2V0VmlzaWJsZSh2aXNpYmxlKTsKKworICAgICAgICAgICAgLy8g
VGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHR3byBwYXNzZXMuIFRoZSBmaXJzdCBwYXNzIGRyYXdz
IGFsbAorICAgICAgICAgICAgLy8gdmlzaWJsZSB0aWxlcyB3aXRoIHRleHR1cmVzLgorICAgICAg
ICAgICAgLy8gSWYgYSB2aXNpYmxlIHRpbGUgaGFzIG5vIHRleHR1cmUsIHNldCB0aGUgbV9oYXNN
aXNzaW5nVGV4dHVyZXMKKyAgICAgICAgICAgIC8vIGZsYWcsIHRvIGluZGljYXRlIHRoYXQgd2Ug
bmVlZCBhIHNlY29uZCBwYXNzLgorICAgICAgICAgICAgLy8gVGhlIHNlY29uZCAiZHJhd01pc3Np
bmciIHBhc3MgZHJhd3MgYWxsIHZpc2libGUgdGlsZXMgd2l0aG91dAorICAgICAgICAgICAgLy8g
dGV4dHVyZXMgYXMgY2hlY2tlcmJvYXJkLgorICAgICAgICAgICAgLy8gSG93ZXZlciwgZG9uJ3Qg
ZHJhdyBicmFuZCBuZXcgdGlsZXMgYXMgY2hlY2tlcmJvYXJkLiBUaGUgY2hlY2tlci0KKyAgICAg
ICAgICAgIC8vIGJvYXJkIGluZGljYXRlcyB0aGF0IGEgdGlsZSBoYXMgZGlydHkgY29udGVudHMs
IGJ1dCB0aGF0J3Mgbm90CisgICAgICAgICAgICAvLyB0aGUgY2FzZSBpZiBpdCdzIGJyYW5kIG5l
dy4KKyAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgYm9vbCBoYXNU
ZXh0dXJlID0gdGlsZS0+aGFzVGV4dHVyZSgpOworICAgICAgICAgICAgICAgIGlmICghaGFzVGV4
dHVyZSkKKyAgICAgICAgICAgICAgICAgICAgbV9oYXNNaXNzaW5nVGV4dHVyZXMgPSB0cnVlOwor
CisgICAgICAgICAgICAgICAgaWYgKGhhc1RleHR1cmUgJiYgIWRyYXdNaXNzaW5nKSB7CisgICAg
ICAgICAgICAgICAgICAgIFRleHR1cmUqIHRleHR1cmUgPSB0aWxlLT50ZXh0dXJlKCk7CisgICAg
ICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlLT5pc09wYXF1ZSgpICYmIGxheWVyLT5kcmF3T3Bh
Y2l0eSgpID09IDEuMGYgJiYgIWxheWVyLT5tYXNrTGF5ZXIoKSkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKGJsZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxl
bmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xf
QkxFTkQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9
IGVsc2UgaWYgKCFibGVuZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmcg
PSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAg
ICAgICAgICAgICAgICAgICAgICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9PTkVfTUlOVVNfU1JD
X0FMUEhBKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRl
eHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCktPnRleHR1cmVBY2Nlc3NlZCh0ZXh0dXJlKTsK
KyAgICAgICAgICAgICAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJl
LT50ZXh0dXJlSWQoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYg
KGhhc1RleHR1cmUgIT0gZHJhd01pc3NpbmcpCisgICAgICAgICAgICAgICAgICAgIGdsRHJhd0Fy
cmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOworCisgICAgICAgICAgICAgICAgaWYgKHRpbGUt
PmlzRGlydHkoKSkgeworICAgICAgICAgICAgICAgICAgICBhZGRSZW5kZXJKb2IoaW5kZXgpOwor
ICAgICAgICAgICAgICAgICAgICBuZWVkc0Rpc3BsYXkgPSB0cnVlOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2FzVmlzaWJsZSkKKyAgICAgICAgICAgICAgICBy
ZW1vdmVSZW5kZXJKb2IoaW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJu
IGVhcmx5IGZvciB0aGUgZHJhd01pc3NpbmcgY2FzZSwgZG9uJ3QgZmxhZyB1cyBhcyBuZWVkaW5n
IGNvbW1pdC4KKyAgICBpZiAoZHJhd01pc3NpbmcpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IFN3aXRjaCBvbiBibGVuZGluZyBhZ2FpbiAod2Uga25vdyB0aGF0IGRyYXdNaXNzaW5nID09IGZh
bHNlKS4KKyAgICBpZiAoIWJsZW5kaW5nKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsK
KyAgICAgICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAg
ICB9CisKKyAgICAvLyBJZiB3ZSBzY2hlZHVsZSBhIGNvbW1pdCwgdmlzaWJpbGl0eSB3aWxsIGJl
IHVwZGF0ZWQsIGFuZCBkaXNwbGF5IHdpbGwKKyAgICAvLyBoYXBwZW4gaWYgdGhlcmUgYXJlIGFu
eSB2aXNpYmxlIGFuZCBkaXJ0eSB0ZXh0dXJlcy4KKyAgICBpZiAobmVlZHNEaXNwbGF5KQorICAg
ICAgICBsYXllci0+c2V0TmVlZHNDb21taXQoKTsKK30KKwordm9pZCBMYXllclRpbGVyOjphZGRS
ZW5kZXJKb2IoY29uc3QgVGlsZUluZGV4JiBpbmRleCkKK3sKKyAgICBBU1NFUlQoaXNDb21wb3Np
dGluZ1RocmVhZCgpKTsKKworICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX3JlbmRlckpvYnNNdXRl
eCk7CisgICAgbV9yZW5kZXJKb2JzLmFkZChpbmRleCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6
cmVtb3ZlUmVuZGVySm9iKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgpCit7CisgICAgTXV0ZXhMb2Nr
ZXIgbG9ja2VyKG1fcmVuZGVySm9ic011dGV4KTsKKyAgICBtX3JlbmRlckpvYnMucmVtb3ZlKGlu
ZGV4KTsKK30KKwordm9pZCBMYXllclRpbGVyOjpkZWxldGVUZXh0dXJlcygpCit7CisgICAgLy8g
U2luY2UgdGV4dHVyZXMgYXJlIGRlbGV0ZWQgYnkgYSBzeW5jaHJvbm91cyBtZXNzYWdlCisgICAg
Ly8gZnJvbSBXZWJLaXQgdGhyZWFkIHRvIGNvbXBvc2l0aW5nIHRocmVhZCwgd2UgZG9uJ3QgbmVl
ZAorICAgIC8vIGFueSBzeW5jaHJvbml6YXRpb24gbWVjaGFuaXNtIGhlcmUsIGV2ZW4gdGhvdWdo
IHdlIGFyZQorICAgIC8vIHRvdWNoaW5nIHNvbWUgV2ViS2l0IHRocmVhZCBzdGF0ZS4KKyAgICBt
X3RpbGVzV2ViS2l0VGhyZWFkLmNsZWFyKCk7CisKKyAgICBpZiAobV90aWxlc0NvbXBvc2l0aW5n
VGhyZWFkLnNpemUoKSkgeworICAgICAgICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90
aWxlc0NvbXBvc2l0aW5nVGhyZWFkLmJlZ2luKCk7IGl0ICE9IG1fdGlsZXNDb21wb3NpdGluZ1Ro
cmVhZC5lbmQoKTsgKytpdCkKKyAgICAgICAgICAgICgqaXQpLnNlY29uZC0+ZGlzY2FyZENvbnRl
bnRzKCk7CisgICAgICAgIG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5jbGVhcigpOworCisgICAg
ICAgIG1fY29udGVudHNEaXJ0eSA9IHRydWU7CisgICAgfQorCisgICAgLy8gRm9yIHZhcmlvdXMg
cmVhc29ucywgZS5nLiBwYWdlIGNhY2hlLCBzb21lb25lIG1heSB0cnkKKyAgICAvLyB0byByZW5k
ZXIgdXMgYWZ0ZXIgdGhlIHRleHR1cmVzIHdlcmUgZGVsZXRlZC4KKyAgICBtX3BlbmRpbmdUZXh0
dXJlU2l6ZSA9IEludFNpemUoKTsKKyAgICBtX3JlcXVpcmVkVGV4dHVyZVNpemUgPSBJbnRTaXpl
KCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6cHJ1bmVUZXh0dXJlcygpCit7CisgICAgLy8gUHJ1
bmUgdGlsZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICBWZWN0b3I8VGlsZUluZGV4
PiB0aWxlc1RvRGVsZXRlOworICAgIGZvciAoVGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVz
Q29tcG9zaXRpbmdUaHJlYWQuYmVnaW4oKTsgaXQgIT0gbV90aWxlc0NvbXBvc2l0aW5nVGhyZWFk
LmVuZCgpOyArK2l0KSB7CisgICAgICAgIFRpbGVJbmRleCBpbmRleCA9ICgqaXQpLmZpcnN0Owor
CisgICAgICAgIEludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShpbmRleCk7CisgICAgICAg
IGlmIChvcmlnaW4ueCgpID49IG1fcmVxdWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgpIHx8IG9yaWdp
bi55KCkgPj0gbV9yZXF1aXJlZFRleHR1cmVTaXplLmhlaWdodCgpKQorICAgICAgICAgICAgdGls
ZXNUb0RlbGV0ZS5hcHBlbmQoaW5kZXgpOworICAgIH0KKworICAgIGZvciAoVmVjdG9yPFRpbGVJ
bmRleD46Oml0ZXJhdG9yIGl0ID0gdGlsZXNUb0RlbGV0ZS5iZWdpbigpOyBpdCAhPSB0aWxlc1Rv
RGVsZXRlLmVuZCgpOyArK2l0KSB7CisgICAgICAgIExheWVyVGlsZSogdGlsZSA9IG1fdGlsZXND
b21wb3NpdGluZ1RocmVhZC50YWtlKCppdCk7CisgICAgICAgIHRpbGUtPmRpc2NhcmRDb250ZW50
cygpOworICAgICAgICBkZWxldGUgdGlsZTsKKyAgICB9Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6
dXBkYXRlVGlsZVNpemUoKQoreworICAgIEludFNpemUgc2l6ZSA9IG1fdGlsaW5nRGlzYWJsZWQg
PyBtX2xheWVyLT5ib3VuZHMoKSA6IGRlZmF1bHRUaWxlU2l6ZSgpOworICAgIGNvbnN0IEludFNp
emUgbWF4VGV4dHVyZVNpemUoMjA0OCwgMjA0OCk7CisgICAgc2l6ZSA9IHNpemUuc2hydW5rVG8o
bWF4VGV4dHVyZVNpemUpOworCisgICAgaWYgKG1fdGlsZVNpemUgPT0gc2l6ZSB8fCBzaXplLmlz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSW52YWxpZGF0ZSB0aGUgd2hvbGUg
bGF5ZXIgaWYgdGlsZSBzaXplIGNoYW5nZXMuCisgICAgc2V0TmVlZHNEaXNwbGF5KCk7CisgICAg
bV90aWxlU2l6ZSA9IHNpemU7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlcjo6ZGlzYWJsZVRpbGluZyhi
b29sIGRpc2FibGUpCit7CisgICAgaWYgKG1fdGlsaW5nRGlzYWJsZWQgPT0gZGlzYWJsZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV90aWxpbmdEaXNhYmxlZCA9IGRpc2FibGU7CisgICAgdXBk
YXRlVGlsZVNpemUoKTsKK30KKworYm9vbCBMYXllclRpbGVyOjpzaG91bGRQcmVmaWxsVGlsZShj
b25zdCBUaWxlSW5kZXgmIGluZGV4KQoreworICAgIC8vIEZvciBub3csIHdlIHVzZSB0aGUgaGV1
cmlzdGljIG9mIHByZWZpbGxpbmcgdGhlIGZpcnN0IHNjcmVlbmZ1bCBvZiB0aWxlcy4KKyAgICAv
LyBUaGlzIGdpdmVzIHRoZSBjb3JyZWN0IHJlc3VsdCBvbmx5IGZvciBsYXllcnMgd2l0aCBpZGVu
dGl0eSB0cmFuc2Zvcm0sCisgICAgLy8gd2hpY2ggaXMgd2h5IGl0J3MgY2FsbGVkIGEgaGV1cmlz
dGljIGhlcmUuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgY2FzZQorICAgIC8vIHdoZXJlIHRoZSBk
ZXZlbG9wZXIgYWN0dWFsbHkgZGVzaWduZWQgdGhlaXIgd2ViIHBhZ2UgYXJvdW5kIHRoZSB1c2Ug
b2YKKyAgICAvLyBhY2NlbGVyYXRlZCBjb21wb3NpdGluZywgYW5kIGV4cGVjdHMgZXZlbiBvZmZz
Y3JlZW4gbGF5ZXJzIHRvIGhhdmUgY29udGVudC4KKyAgICAvLyBXZSBvYmxpZ2UgdGhlbSB0byBz
b21lIGRlZ3JlZSBieSBwcmVmaWxsaW5nIGEgc2NyZWVuZnVsIG9mIHRpbGVzLgorICAgIC8vIFRo
aXMgaXMgcmVkdW5kYW50IGluIHNvbWUgb3RoZXIgc2NlbmFyaW9zLCBpLmUuIHdoZW4gYW4gb2Zm
c2NyZWVuIGxheWVyCisgICAgLy8gaXMgY29tcG9zaXRlZCBvbmx5IGJlY2F1c2Ugb2Ygb3Zlcmxh
cHBpbmcgYSBmbGFzaCBhZCBvciBzb21ldGhpbmcgbGlrZQorICAgIC8vIHRoYXQsIGJ1dCB3ZSdy
ZSB3aWxsaW5nIHRvIG1ha2UgdGhpcyB0cmFkZW9mZi4KKworICAgIC8vIFNpbmNlIHRoZSB0aWxl
TXVsdGlwbGllciBpbmRpY2F0ZXMgaG93IG1hbnkgdGlsZXMgZml0IG9uIHRoZSBzY3JlZW4sCisg
ICAgLy8gdGhlIGZvbGxvd2luZyBmb3JtdWxhIGNhbiBiZSB1c2VkOgorICAgIHJldHVybiBpbmRl
eC5pKCkgPCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odGlsZU11bHRpcGxpZXIpICYmIGluZGV4Lmoo
KSA8IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aWxlTXVsdGlwbGllcik7Cit9CisKK1RpbGVJbmRl
eCBMYXllclRpbGVyOjppbmRleE9mVGlsZShjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgb3JpZ2lu
KQoreworICAgIGludCBvZmZzZXRYID0gb3JpZ2luLngoKTsKKyAgICBpbnQgb2Zmc2V0WSA9IG9y
aWdpbi55KCk7CisgICAgaWYgKG9mZnNldFgpCisgICAgICAgIG9mZnNldFggPSBvZmZzZXRYIC8g
dGlsZVNpemUoKS53aWR0aCgpOworICAgIGlmIChvZmZzZXRZKQorICAgICAgICBvZmZzZXRZID0g
b2Zmc2V0WSAvIHRpbGVTaXplKCkuaGVpZ2h0KCk7CisgICAgcmV0dXJuIFRpbGVJbmRleChvZmZz
ZXRYLCBvZmZzZXRZKTsKK30KKworSW50UG9pbnQgTGF5ZXJUaWxlcjo6b3JpZ2luT2ZUaWxlKGNv
bnN0IFRpbGVJbmRleCYgaW5kZXgpCit7CisgICAgcmV0dXJuIEludFBvaW50KGluZGV4LmkoKSAq
IHRpbGVTaXplKCkud2lkdGgoKSwgaW5kZXguaigpICogdGlsZVNpemUoKS5oZWlnaHQoKSk7Cit9
CisKK0ludFJlY3QgTGF5ZXJUaWxlcjo6cmVjdEZvclRpbGUoY29uc3QgVGlsZUluZGV4JiBpbmRl
eCwgY29uc3QgSW50U2l6ZSYgYm91bmRzKQoreworICAgIEludFBvaW50IG9yaWdpbiA9IG9yaWdp
bk9mVGlsZShpbmRleCk7CisgICAgSW50U2l6ZSBvZmZzZXQob3JpZ2luLngoKSwgb3JpZ2luLnko
KSk7CisgICAgSW50U2l6ZSBzaXplID0gdGlsZVNpemUoKS5zaHJ1bmtUbyhib3VuZHMgLSBvZmZz
ZXQpOworICAgIHJldHVybiBJbnRSZWN0KG9yaWdpbiwgc2l6ZSk7Cit9CisKK2Jvb2wgTGF5ZXJU
aWxlcjo6aGFzRGlydHlUaWxlcygpIGNvbnN0Cit7CisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9p
dGVyYXRvciBpdCA9IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5iZWdpbigpOyBpdCAhPSBtX3Rp
bGVzQ29tcG9zaXRpbmdUaHJlYWQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgY29uc3QgTGF5ZXJU
aWxlKiB0aWxlID0gKCppdCkuc2Vjb25kOworICAgICAgICBpZiAodGlsZS0+aXNEaXJ0eSgpKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIExheWVyVGlsZXI6OmJpbmRDb250ZW50c1RleHR1cmUoKQoreworICAgIEFTU0VSVCht
X3RpbGVzQ29tcG9zaXRpbmdUaHJlYWQuc2l6ZSgpID09IDEpOworICAgIGlmIChtX3RpbGVzQ29t
cG9zaXRpbmdUaHJlYWQuc2l6ZSgpICE9IDEpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0
IExheWVyVGlsZSogdGlsZSA9IG1fdGlsZXNDb21wb3NpdGluZ1RocmVhZC5iZWdpbigpLT5zZWNv
bmQ7CisKKyAgICBBU1NFUlQodGlsZS0+aGFzVGV4dHVyZSgpKTsKKyAgICBpZiAoIXRpbGUtPmhh
c1RleHR1cmUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhU
VVJFXzJELCB0aWxlLT50ZXh0dXJlKCktPnRleHR1cmVJZCgpKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllclRpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZWRhOWU2MWQz
MmVkZDEzOGVlODQ1NmJjOTBiNGIwNDJkYjZkN2ZjMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJUaWxlci5oCkBAIC0w
LDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIElu
IE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwg
d3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICov
CisKKyNpZm5kZWYgTGF5ZXJUaWxlcl9oCisjZGVmaW5lIExheWVyVGlsZXJfaAorCisjaWYgVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiQ29sb3IuaCIKKyNpbmNsdWRl
ICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTGF5ZXJUaWxl
LmgiCisjaW5jbHVkZSAiTGF5ZXJUaWxlSW5kZXguaCIKKworI2luY2x1ZGUgPFNrQml0bWFwLmg+
CisjaW5jbHVkZSA8d3RmL0RlcXVlLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNs
dWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ7
CitjbGFzcyBMYXllcldlYktpdFRocmVhZDsKKworY2xhc3MgTGF5ZXJUaWxlciA6IHB1YmxpYyBU
aHJlYWRTYWZlUmVmQ291bnRlZDxMYXllclRpbGVyPiB7CitwdWJsaWM6CisgICAgVGlsZUluZGV4
IGluZGV4T2ZUaWxlKGNvbnN0IEludFBvaW50JiBvcmlnaW4pOworICAgIEludFBvaW50IG9yaWdp
bk9mVGlsZShjb25zdCBUaWxlSW5kZXgmKTsKKyAgICBJbnRSZWN0IHJlY3RGb3JUaWxlKGNvbnN0
IFRpbGVJbmRleCYsIGNvbnN0IEludFNpemUmIGJvdW5kcyk7CisKKyAgICBzdGF0aWMgUGFzc1Jl
ZlB0cjxMYXllclRpbGVyPiBjcmVhdGUoTGF5ZXJXZWJLaXRUaHJlYWQqIGxheWVyKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBMYXllclRpbGVyKGxheWVyKSk7CisgICAgfQor
CisgICAgdmlydHVhbCB+TGF5ZXJUaWxlcigpOworCisgICAgLy8gV2ViS2l0IHRocmVhZAorICAg
IExheWVyV2ViS2l0VGhyZWFkKiBsYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fbGF5ZXI7IH0KKyAg
ICB2b2lkIGxheWVyV2ViS2l0VGhyZWFkRGVzdHJveWVkKCk7CisgICAgdm9pZCBzZXROZWVkc0Rp
c3BsYXkoY29uc3QgRmxvYXRSZWN0JiBkaXJ0eVJlY3QpOworICAgIHZvaWQgc2V0TmVlZHNEaXNw
bGF5KCk7CisgICAgdm9pZCB1cGRhdGVUZXh0dXJlQ29udGVudHNJZk5lZWRlZChkb3VibGUgc2Nh
bGUpOworICAgIHZvaWQgZGlzYWJsZVRpbGluZyhib29sKTsKKworICAgIC8vIENvbXBvc2l0aW5n
IHRocmVhZAorICAgIHZvaWQgbGF5ZXJDb21wb3NpdGluZ1RocmVhZERlc3Ryb3llZCgpOworICAg
IHZvaWQgdXBsb2FkVGV4dHVyZXNJZk5lZWRlZCgpOworICAgIHZvaWQgZHJhd1RleHR1cmVzKExh
eWVyQ29tcG9zaXRpbmdUaHJlYWQqLCBpbnQgcG9zaXRpb25Mb2NhdGlvbiwgaW50IHRleENvb3Jk
TG9jYXRpb24pOworICAgIGJvb2wgaGFzTWlzc2luZ1RleHR1cmVzKCkgY29uc3QgeyByZXR1cm4g
bV9oYXNNaXNzaW5nVGV4dHVyZXM7IH0KKyAgICB2b2lkIGRyYXdNaXNzaW5nVGV4dHVyZXMoTGF5
ZXJDb21wb3NpdGluZ1RocmVhZCosIGludCBwb3NpdGlvbkxvY2F0aW9uLCBpbnQgdGV4Q29vcmRM
b2NhdGlvbik7CisgICAgdm9pZCBkZWxldGVUZXh0dXJlcygpOworICAgIHZvaWQgY29tbWl0UGVu
ZGluZ1RleHR1cmVVcGxvYWRzKCk7CisgICAgdm9pZCBsYXllclZpc2liaWxpdHlDaGFuZ2VkKGJv
b2wgdmlzaWJsZSk7CisgICAgYm9vbCBoYXNEaXJ0eVRpbGVzKCkgY29uc3Q7CisgICAgdm9pZCBi
aW5kQ29udGVudHNUZXh0dXJlKCk7CisKKyAgICAvLyBUaHJlYWQgc2FmZQorICAgIHZvaWQgYWRk
UmVuZGVySm9iKGNvbnN0IFRpbGVJbmRleCYpOworICAgIHZvaWQgcmVtb3ZlUmVuZGVySm9iKGNv
bnN0IFRpbGVJbmRleCYpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBUZXh0dXJlSm9iIHsKKyAg
ICAgICAgZW51bSBUeXBlIHsgVW5rbm93biwgU2V0Q29udGVudHMsIFNldENvbnRlbnRzVG9Db2xv
ciwgVXBkYXRlQ29udGVudHMsIERpc2NhcmRDb250ZW50cywgUmVzaXplQ29udGVudHMsIERpcnR5
Q29udGVudHMgfTsKKworICAgICAgICBUZXh0dXJlSm9iKCkKKyAgICAgICAgICAgIDogbV90eXBl
KFVua25vd24pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIFRleHR1cmVKb2IoVHlw
ZSB0eXBlLCBjb25zdCBJbnRTaXplJiBuZXdTaXplKQorICAgICAgICAgICAgOiBtX3R5cGUodHlw
ZSkKKyAgICAgICAgICAgICwgbV9pc09wYXF1ZShmYWxzZSkKKyAgICAgICAgICAgICwgbV9kaXJ0
eVJlY3QoSW50UG9pbnQ6Onplcm8oKSwgbmV3U2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAg
QVNTRVJUKHR5cGUgPT0gUmVzaXplQ29udGVudHMpOworICAgICAgICB9CisKKyAgICAgICAgVGV4
dHVyZUpvYihUeXBlIHR5cGUsIGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCkKKyAgICAgICAgICAg
IDogbV90eXBlKHR5cGUpCisgICAgICAgICAgICAsIG1faXNPcGFxdWUoZmFsc2UpCisgICAgICAg
ICAgICAsIG1fZGlydHlSZWN0KGRpcnR5UmVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNT
RVJUKHR5cGUgPT0gRGlzY2FyZENvbnRlbnRzIHx8IHR5cGUgPT0gRGlydHlDb250ZW50cyk7Cisg
ICAgICAgIH0KKworICAgICAgICBUZXh0dXJlSm9iKFR5cGUgdHlwZSwgY29uc3QgU2tCaXRtYXAm
IGNvbnRlbnRzLCBjb25zdCBJbnRSZWN0JiBkaXJ0eVJlY3QsIGJvb2wgaXNPcGFxdWUgPSBmYWxz
ZSkKKyAgICAgICAgICAgIDogbV90eXBlKHR5cGUpCisgICAgICAgICAgICAsIG1fY29udGVudHMo
Y29udGVudHMpCisgICAgICAgICAgICAsIG1faXNPcGFxdWUoaXNPcGFxdWUpCisgICAgICAgICAg
ICAsIG1fZGlydHlSZWN0KGRpcnR5UmVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJU
KHR5cGUgPT0gVXBkYXRlQ29udGVudHMgfHwgdHlwZSA9PSBTZXRDb250ZW50cyk7CisgICAgICAg
ICAgICBBU1NFUlQoIWNvbnRlbnRzLmlzTnVsbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFRl
eHR1cmVKb2IoVHlwZSB0eXBlLCBjb25zdCBDb2xvciYgY29sb3IsIGNvbnN0IFRpbGVJbmRleCYg
aW5kZXgpCisgICAgICAgICAgICA6IG1fdHlwZSh0eXBlKQorICAgICAgICAgICAgLCBtX2lzT3Bh
cXVlKGZhbHNlKQorICAgICAgICAgICAgLCBtX2NvbG9yKGNvbG9yKQorICAgICAgICAgICAgLCBt
X2luZGV4KGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQodHlwZSA9PSBTZXRD
b250ZW50c1RvQ29sb3IpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIFRleHR1cmVKb2Ig
c2V0Q29udGVudHMoY29uc3QgU2tCaXRtYXAmIGNvbnRlbnRzLCBib29sIGlzT3BhcXVlKSB7IHJl
dHVybiBUZXh0dXJlSm9iKFNldENvbnRlbnRzLCBjb250ZW50cywgSW50UmVjdChJbnRQb2ludDo6
emVybygpLCBJbnRTaXplKGNvbnRlbnRzLndpZHRoKCksIGNvbnRlbnRzLmhlaWdodCgpKSksIGlz
T3BhcXVlKTsgfQorICAgICAgICBzdGF0aWMgVGV4dHVyZUpvYiBzZXRDb250ZW50c1RvQ29sb3Io
Y29uc3QgQ29sb3ImIGNvbG9yLCBjb25zdCBUaWxlSW5kZXgmIGluZGV4KSB7IHJldHVybiBUZXh0
dXJlSm9iKFNldENvbnRlbnRzVG9Db2xvciwgY29sb3IsIGluZGV4KTsgfQorICAgICAgICBzdGF0
aWMgVGV4dHVyZUpvYiB1cGRhdGVDb250ZW50cyhjb25zdCBTa0JpdG1hcCYgY29udGVudHMsIGNv
bnN0IEludFJlY3QmIGRpcnR5UmVjdCkgeyByZXR1cm4gVGV4dHVyZUpvYihVcGRhdGVDb250ZW50
cywgY29udGVudHMsIGRpcnR5UmVjdCk7IH0KKyAgICAgICAgc3RhdGljIFRleHR1cmVKb2IgZGlz
Y2FyZENvbnRlbnRzKGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCkgeyByZXR1cm4gVGV4dHVyZUpv
YihEaXNjYXJkQ29udGVudHMsIGRpcnR5UmVjdCk7IH0KKyAgICAgICAgc3RhdGljIFRleHR1cmVK
b2IgcmVzaXplQ29udGVudHMoY29uc3QgSW50U2l6ZSYgbmV3U2l6ZSkgeyByZXR1cm4gVGV4dHVy
ZUpvYihSZXNpemVDb250ZW50cywgbmV3U2l6ZSk7IH0KKyAgICAgICAgc3RhdGljIFRleHR1cmVK
b2IgZGlydHlDb250ZW50cyhjb25zdCBJbnRSZWN0JiBkaXJ0eVJlY3QpIHsgcmV0dXJuIFRleHR1
cmVKb2IoRGlydHlDb250ZW50cywgZGlydHlSZWN0KTsgfQorCisgICAgICAgIGJvb2wgaXNOdWxs
KCkgeyByZXR1cm4gbV90eXBlID09IFVua25vd247IH0KKworICAgICAgICBUeXBlIG1fdHlwZTsK
KyAgICAgICAgU2tCaXRtYXAgbV9jb250ZW50czsKKyAgICAgICAgYm9vbCBtX2lzT3BhcXVlOwor
ICAgICAgICBJbnRSZWN0IG1fZGlydHlSZWN0OworICAgICAgICBDb2xvciBtX2NvbG9yOworICAg
ICAgICBUaWxlSW5kZXggbV9pbmRleDsKKyAgICB9OworCisgICAgdHlwZWRlZiBIYXNoTWFwPFRp
bGVJbmRleCwgTGF5ZXJUaWxlKj4gVGlsZU1hcDsKKyAgICB0eXBlZGVmIEhhc2hNYXA8VGlsZUlu
ZGV4LCBMYXllclRpbGVEYXRhPiBWaXNpYmlsaXR5TWFwOworICAgIHR5cGVkZWYgSGFzaE1hcDxU
aWxlSW5kZXgsIGNvbnN0IFRleHR1cmVKb2IqPiBUaWxlSm9ic01hcDsKKworICAgIEludFNpemUg
dGlsZVNpemUoKSBjb25zdCB7IHJldHVybiBtX3RpbGVTaXplOyB9CisgICAgdm9pZCB1cGRhdGVU
aWxlU2l6ZSgpOworCisgICAgTGF5ZXJUaWxlcihMYXllcldlYktpdFRocmVhZCopOworCisgICAg
Ly8gV2ViS2l0IHRocmVhZAorICAgIHZvaWQgYWRkVGV4dHVyZUpvYihjb25zdCBUZXh0dXJlSm9i
Jik7CisgICAgdm9pZCBjbGVhclRleHR1cmVKb2JzKCk7CisgICAgYm9vbCBzaG91bGRQZXJmb3Jt
UmVuZGVySm9iKGNvbnN0IFRpbGVJbmRleCYsIGJvb2wgYWxsb3dQcmVmaWxsKTsKKyAgICBib29s
IHNob3VsZFByZWZpbGxUaWxlKGNvbnN0IFRpbGVJbmRleCYpOworCisgICAgLy8gQ29tcG9zaXRp
bmcgdGhyZWFkCisgICAgdm9pZCB1cGRhdGVUaWxlQ29udGVudHMoY29uc3QgVGV4dHVyZUpvYiYs
IGNvbnN0IEludFJlY3QmKTsKKyAgICB2b2lkIGFkZFRpbGVKb2IoY29uc3QgVGlsZUluZGV4Jiwg
Y29uc3QgVGV4dHVyZUpvYiYsIFRpbGVKb2JzTWFwJik7CisgICAgdm9pZCBwZXJmb3JtVGlsZUpv
YihMYXllclRpbGUqLCBjb25zdCBUZXh0dXJlSm9iJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZv
aWQgcHJvY2Vzc1RleHR1cmVKb2IoY29uc3QgVGV4dHVyZUpvYiYsIFRpbGVKb2JzTWFwJik7Cisg
ICAgdm9pZCBkcmF3VGV4dHVyZXNJbnRlcm5hbChMYXllckNvbXBvc2l0aW5nVGhyZWFkKiwgaW50
IHBvc2l0aW9uTG9jYXRpb24sIGludCB0ZXhDb29yZExvY2F0aW9uLCBib29sIG1pc3NpbmcpOwor
ICAgIHZvaWQgcHJ1bmVUZXh0dXJlcygpOworICAgIHZvaWQgdmlzaWJpbGl0eUNoYW5nZWQoYm9v
bCBuZWVkc0Rpc3BsYXkpOworCisgICAgLy8gQ2xlYXIgYWxsIHBlbmRpbmcgdXBkYXRlIGNvbnRl
bnQgdGV4dHVyZSBqb2JzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgdm9p
ZCByZW1vdmVVcGRhdGVDb250ZW50c0pvYnMoVCYgam9icykKKyAgICB7CisgICAgICAgIC8vIENs
ZWFyIGFsbCBwZW5kaW5nIHVwZGF0ZSBjb250ZW50IGpvYnMKKyAgICAgICAgVCBsaXN0OworICAg
ICAgICBmb3IgKHR5cGVuYW1lIFQ6Oml0ZXJhdG9yIGl0ID0gam9icy5iZWdpbigpOyBpdCAhPSBq
b2JzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoKCppdCkubV90eXBlICE9IFRleHR1
cmVKb2I6OlVwZGF0ZUNvbnRlbnRzKQorICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKCppdCk7
CisgICAgICAgIH0KKyAgICAgICAgam9icyA9IGxpc3Q7CisgICAgfQorCisgICAgTGF5ZXJXZWJL
aXRUaHJlYWQqIG1fbGF5ZXI7CisKKyAgICBUaWxlTWFwIG1fdGlsZXNDb21wb3NpdGluZ1RocmVh
ZDsKKworICAgIFZpc2liaWxpdHlNYXAgbV90aWxlc1dlYktpdFRocmVhZDsKKworICAgIGJvb2wg
bV90aWxpbmdEaXNhYmxlZDsKKworICAgIGJvb2wgbV9jb250ZW50c0RpcnR5OworICAgIEZsb2F0
UmVjdCBtX2RpcnR5UmVjdDsKKworICAgIEludFNpemUgbV9wZW5kaW5nVGV4dHVyZVNpemU7IC8v
IFJlc2l6ZWQsIGJ1dCBub3QgY29tbWl0dGVkIHlldC4KKyAgICBJbnRTaXplIG1fcmVxdWlyZWRU
ZXh0dXJlU2l6ZTsKKyAgICBJbnRTaXplIG1fdGlsZVNpemU7CisKKyAgICBib29sIG1fY2xlYXJU
ZXh0dXJlSm9iczsKKyAgICBWZWN0b3I8VGV4dHVyZUpvYj4gbV9wZW5kaW5nVGV4dHVyZUpvYnM7
IC8vIEFkZGVkLCBidXQgbm90IGNvbW1pdHRlZCB5ZXQuCisgICAgRGVxdWU8VGV4dHVyZUpvYj4g
bV90ZXh0dXJlSm9iczsKKyAgICBib29sIG1faGFzTWlzc2luZ1RleHR1cmVzOworCisgICAgSGFz
aFNldDxUaWxlSW5kZXg+IG1fcmVuZGVySm9iczsKKyAgICBNdXRleCBtX3JlbmRlckpvYnNNdXRl
eDsKKyAgICBkb3VibGUgbV9jb250ZW50c1NjYWxlOworfTsKKworfQorCisjZW5kaWYgLy8gVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gTGF5ZXJUaWxlcl9oCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>