<?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>79873</bug_id>
          
          <creation_ts>2012-02-28 22:27:26 -0800</creation_ts>
          <short_desc>[BlackBerry] Upstream LayerCompositingThread.{h, cpp}</short_desc>
          <delta_ts>2012-03-26 09:25:05 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</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>rwlbuis</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>567380</commentid>
    <comment_count>0</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-02-28 22:27:26 -0800</bug_when>
    <thetext>LayerCompositingThread is the counterpart of LayerWebKitThread, but most of its member functions need to be called from the compositing thread.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567510</commentid>
    <comment_count>1</comment_count>
      <attachid>129415</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-02-29 01:42:57 -0800</bug_when>
    <thetext>Created attachment 129415
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567751</commentid>
    <comment_count>2</comment_count>
      <attachid>129415</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-29 11:08:50 -0800</bug_when>
    <thetext>Comment on attachment 129415
patch

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

Not much wrong, but still some cleanup to do.

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:297
&gt; +        FloatQuad surfaceQuad = getTransformedRect(m_bounds, IntRect(IntPoint(), m_bounds), drawTransform);

Better use IntPoint::zero

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:487
&gt; +    if (layer)

Can combine these two lines.

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:679
&gt; +        ASSERT_NOT_REACHED();

Can combine with AnimatedPropertyBackgroundColor case, they do the same.

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.h:47
&gt; +class SkBitmap;

Not used? Please clean it up and the includes above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568454</commentid>
    <comment_count>3</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-01 01:04:23 -0800</bug_when>
    <thetext>Thanks for the review, all the comments will be addressed in a revised patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568456</commentid>
    <comment_count>4</comment_count>
      <attachid>129659</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-01 01:08:56 -0800</bug_when>
    <thetext>Created attachment 129659
patch v2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570667</commentid>
    <comment_count>5</comment_count>
      <attachid>129659</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-03-05 07:16:36 -0800</bug_when>
    <thetext>Comment on attachment 129659
patch v2

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

Looks good, can be improved some more.

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:39
&gt; +#include &quot;HTMLCanvasElement.h&quot;

Is this one actually used? Please check all includes in general.

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:152
&gt; +    result.setP2(drawTransform.mapPoint(FloatPoint(x, y+h)));

Watch spacing &quot;y + h&quot;

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:153
&gt; +    result.setP3(drawTransform.mapPoint(FloatPoint(x+w, y+h)));

Ditto.

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:162
&gt; +static bool enableVideoClipping = false;

Can be moved into the function below, only used there.

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:240
&gt; +            m_mediaPlayer-&gt;paint(0, IntRect((int)(x+0.5), (int)(y+0.5), m_bounds.width(), m_bounds.height()));

Take care of the spacing please,  x+0.5 -&gt; x + 0.5 etc.

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:285
&gt; +            // FIXME: is this going to happen?

Might require an ASSERT if we are quite sure it will not happen.

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:563
&gt; +// FIXME: Copy pasted from WebCore::KeyframeAnimation!!!

I am seeing this kind of FIXME a lot. Maybe we need a PR to track this?

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.h:57
&gt; +class LayerMessage;

Not used?

&gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.h:155
&gt; +    }

Can be put on one line like above : size_t numSublayers() const { return m_sublayers.size(); }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>587744</commentid>
    <comment_count>6</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-26 07:55:21 -0700</bug_when>
    <thetext>Thanks for the review, comments inlined.

(In reply to comment #5)
&gt; (From update of attachment 129659 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=129659&amp;action=review
&gt; 
&gt; Looks good, can be improved some more.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:39
&gt; &gt; +#include &quot;HTMLCanvasElement.h&quot;
&gt; 
&gt; Is this one actually used? Please check all includes in general.
&gt; 
All unnecessary includes are removed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:152
&gt; &gt; +    result.setP2(drawTransform.mapPoint(FloatPoint(x, y+h)));
&gt; 
&gt; Watch spacing &quot;y + h&quot;
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:153
&gt; &gt; +    result.setP3(drawTransform.mapPoint(FloatPoint(x+w, y+h)));
&gt; 
&gt; Ditto.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:162
&gt; &gt; +static bool enableVideoClipping = false;
&gt; 
&gt; Can be moved into the function below, only used there.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:240
&gt; &gt; +            m_mediaPlayer-&gt;paint(0, IntRect((int)(x+0.5), (int)(y+0.5), m_bounds.width(), m_bounds.height()));
&gt; 
&gt; Take care of the spacing please,  x+0.5 -&gt; x + 0.5 etc.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:285
&gt; &gt; +            // FIXME: is this going to happen?
&gt; 
&gt; Might require an ASSERT if we are quite sure it will not happen.
&gt; 
Replaced with ASSERT_NOT_REACHED();

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.cpp:563
&gt; &gt; +// FIXME: Copy pasted from WebCore::KeyframeAnimation!!!
&gt; 
&gt; I am seeing this kind of FIXME a lot. Maybe we need a PR to track this?
&gt; 
All layer animation related code have been moved to LayerAnimation.cpp.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.h:57
&gt; &gt; +class LayerMessage;
&gt; 
&gt; Not used?
&gt; 
Removed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/LayerCompositingThread.h:155
&gt; &gt; +    }
&gt; 
&gt; Can be put on one line like above : size_t numSublayers() const { return m_sublayers.size(); }
Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>587747</commentid>
    <comment_count>7</comment_count>
      <attachid>133813</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-26 08:03:29 -0700</bug_when>
    <thetext>Created attachment 133813
patch-v3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>587761</commentid>
    <comment_count>8</comment_count>
      <attachid>133813</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-03-26 08:21:40 -0700</bug_when>
    <thetext>Comment on attachment 133813
patch-v3

Looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>587816</commentid>
    <comment_count>9</comment_count>
      <attachid>133813</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-26 09:24:59 -0700</bug_when>
    <thetext>Comment on attachment 133813
patch-v3

Clearing flags on attachment: 133813

Committed r112110: &lt;http://trac.webkit.org/changeset/112110&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>587818</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-26 09:25:05 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129415</attachid>
            <date>2012-02-29 01:42:57 -0800</date>
            <delta_ts>2012-03-01 01:08:47 -0800</delta_ts>
            <desc>patch</desc>
            <filename>bug-79873-20120229174253.patch</filename>
            <type>text/plain</type>
            <size>39185</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5MjAyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYTRmMWIxNTZiNjQyZDc5
NDViNjc0OWM0NDJlOTg3YWVmMjdlYmIyZS4uNzZhM2MyN2IyZTI4MTViNzc5NWI0Zjk0YjJkYmVi
M2FlZjRkMDlmOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDc0IEBACisyMDEyLTAyLTI5ICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBMYXllckNvbXBvc2l0aW5nVGhyZWFkLntoLCBjcHB9CisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03OTg3MworCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5v
IG5ldyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5
ZXJDb21wb3NpdGluZ1RocmVhZC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpjcmVhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZCk6
CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjp+TGF5ZXJDb21wb3Np
dGluZ1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpk
ZXN0cm95T25Db21wb3NpdGluZ1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBv
c2l0aW5nVGhyZWFkOjpzZXRMYXllclJlbmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
Q29tcG9zaXRpbmdUaHJlYWQ6OmRlbGV0ZVRleHR1cmVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldERyYXdUcmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29y
ZTo6Z2V0VHJhbnNmb3JtZWRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRp
bmdUaHJlYWQ6OmdldFRyYW5zZm9ybWVkSG9sZVB1bmNoUmVjdCk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpkcmF3VGV4dHVyZXMpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6ZHJhd1N1cmZhY2UpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6ZHJhd01pc3NpbmdUZXh0dXJlcyk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpyZWxlYXNlVGV4dHVyZVJlc291cmNl
cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRQbHVnaW5W
aWV3KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldE1lZGlh
UGxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmNsZWFy
QW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpy
ZW1vdmVTdWJsYXllcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFk
OjppbmRleE9mU3VibGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZDo6cm9vdExheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJl
YWQ6OnN1cGVybGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVh
ZDo6cmVtb3ZlRnJvbVN1cGVybGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3Np
dGluZ1RocmVhZDo6c2V0U3VibGF5ZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9z
aXRpbmdUaHJlYWQ6OnVwZGF0ZVRleHR1cmVDb250ZW50c0lmTmVlZGVkKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldFZpc2libGUpOgorICAgICAgICAoV2Vi
Q29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0TmVlZHNDb21taXQpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2NoZWR1bGVDb21taXQpOgorICAgICAg
ICAoV2ViQ29yZTo6c29sdmVFcHNpbG9uKToKKyAgICAgICAgKFdlYkNvcmU6OnNvbHZlQ3ViaWNC
ZXppZXJGdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpzb2x2ZVN0ZXBzRnVuY3Rpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6dGltaW5nRnVuY3Rpb25Gb3JBbmltYXRpb25WYWx1ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpwcm9ncmVzcyk6CisgICAgICAgIChXZWJDb3JlOjpmZXRjaEludGVydmFs
RW5kcG9pbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnVw
ZGF0ZUFuaW1hdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVh
ZDo6dXBkYXRlQW5pbWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdU
aHJlYWQ6Omhhc1Zpc2libGVIb2xlUHVuY2hSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
Q29tcG9zaXRpbmdUaHJlYWQ6OmNyZWF0ZVJlbmRlclN1cmZhY2UpOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJDb21wb3NpdGluZ1RocmVhZC5oOiBBZGRlZC4K
KyAgICAgICAgKEdyYXBoaWNzKToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoTGF5ZXJD
b21wb3NpdGluZ1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhy
ZWFkOjpiaW5kQ29udGVudHNUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9z
aXRpbmdUaHJlYWQ6OmdldFN1YmxheWVycyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBv
c2l0aW5nVGhyZWFkOjpzZXRTdXBlcmxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29t
cG9zaXRpbmdUaHJlYWQ6OmRyYXdUcmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJD
b21wb3NpdGluZ1RocmVhZDo6c2V0RHJhd09wYWNpdHkpOgorICAgICAgICAoV2ViQ29yZTo6TGF5
ZXJDb21wb3NpdGluZ1RocmVhZDo6ZHJhd09wYWNpdHkpOgorICAgICAgICAoV2ViQ29yZTo6TGF5
ZXJDb21wb3NpdGluZ1RocmVhZDo6cmVuZGVyU3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjpM
YXllckNvbXBvc2l0aW5nVGhyZWFkOjpjbGVhclJlbmRlclN1cmZhY2UpOgorICAgICAgICAoV2Vi
Q29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0TWFza0xheWVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6Om1hc2tMYXllcik6CisgICAgICAgIChXZWJD
b3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRSZXBsaWNhTGF5ZXIpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6cmVwbGljYUxheWVyKToKKyAgICAgICAg
KFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmdldERyYXdSZWN0KToKKyAgICAgICAg
KFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmdldFRyYW5zZm9ybWVkQm91bmRzKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6Omhhc01pc3NpbmdUZXh0
dXJlcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjppc0RpcnR5
KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmlzVmlzaWJsZSk6
CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpoYXNSdW5uaW5nQW5p
bWF0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpudW1T
dWJsYXllcnMpOgorCiAyMDEyLTAyLTI4ICBBcmtvIFNhaGEgIDxhcmtvQG1vdG9yb2xhLmNvbT4K
IAogICAgICAgICBNaWNyb2RhdGE6IEltcGxlbWVudCBIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24g
Y29sbGVjdGlvbi5uYW1lZEl0ZW0oKS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJDb21wb3NpdGluZ1RocmVhZC5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyQ29tcG9zaXRpbmdU
aHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLmUwNzIxNTVmY2ZmZjMzNjE5Nzc0ZTg5ZTNiMDJkZjVkYTll
ZGQ0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9ibGFja2JlcnJ5L0xheWVyQ29tcG9zaXRpbmdUaHJlYWQuY3BwCkBAIC0wLDAgKzEsNzE0IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlv
biBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIw
MDgsIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisg
KiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2Yg
aXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgIkxheWVyQ29t
cG9zaXRpbmdUaHJlYWQuaCIKKworI2luY2x1ZGUgIkhUTUxDYW52YXNFbGVtZW50LmgiCisjaW5j
bHVkZSAiTGF5ZXJNZXNzYWdlLmgiCisjaW5jbHVkZSAiTGF5ZXJSZW5kZXJlci5oIgorI2luY2x1
ZGUgIkxheWVyV2ViS2l0VGhyZWFkLmgiCisjaWYgRU5BQkxFKFZJREVPKQorI2luY2x1ZGUgIk1l
ZGlhUGxheWVyLmgiCisjaW5jbHVkZSAiTWVkaWFQbGF5ZXJQcml2YXRlQmxhY2tCZXJyeS5oIgor
I2VuZGlmCisjaW5jbHVkZSAiUGx1Z2luVmlldy5oIgorI2luY2x1ZGUgIlRleHR1cmVDYWNoZUNv
bXBvc2l0aW5nVGhyZWFkLmgiCisjaW5jbHVkZSAiVW5pdEJlemllci5oIgorCisjaW5jbHVkZSA8
QmxhY2tCZXJyeVBsYXRmb3JtR3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZv
cm1Mb2cuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMu
aD4KKworI2RlZmluZSBERUJVR19WSURFT19DTElQUElORyAwCisKK3VzaW5nIG5hbWVzcGFjZSBz
dGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGFzc1JlZlB0cjxMYXllckNvbXBvc2l0aW5n
VGhyZWFkPiBMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpjcmVhdGUoTGF5ZXJUeXBlIHR5cGUsIFBh
c3NSZWZQdHI8TGF5ZXJUaWxlcj4gdGlsZXIpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBM
YXllckNvbXBvc2l0aW5nVGhyZWFkKHR5cGUsIHRpbGVyKSk7Cit9CisKK0xheWVyQ29tcG9zaXRp
bmdUaHJlYWQ6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQoTGF5ZXJUeXBlIHR5cGUsIFBhc3NSZWZQ
dHI8TGF5ZXJUaWxlcj4gdGlsZXIpCisgICAgOiBMYXllckRhdGEodHlwZSkKKyAgICAsIG1fbGF5
ZXJSZW5kZXJlcigwKQorICAgICwgbV9zdXBlcmxheWVyKDApCisgICAgLCBtX3BsdWdpbkJ1ZmZl
cigwKQorICAgICwgbV9kcmF3T3BhY2l0eSgwKQorICAgICwgbV92aXNpYmxlKGZhbHNlKQorICAg
ICwgbV9jb21taXRTY2hlZHVsZWQoZmFsc2UpCisgICAgLCBtX3RpbGVyKHRpbGVyKQoreworfQor
CitMYXllckNvbXBvc2l0aW5nVGhyZWFkOjp+TGF5ZXJDb21wb3NpdGluZ1RocmVhZCgpCit7Cisg
ICAgLy8gVW5mb3J0dW5hdGVseSwgVGhyZWFkU2FmZVNoYXJlZDxUPiBpcyBoYXJkd2lyZWQgdG8g
Y2FsbCBUOjp+VCgpLgorICAgIC8vIFRvIHN3aXRjaCB0aHJlYWRzIGluIGNhc2UgdGhlIGxhc3Qg
cmVmZXJlbmNlIGlzIHJlbGVhc2VkIG9uIHRoZQorICAgIC8vIFdlYktpdCB0aHJlYWQsIHdlIHNl
bmQgYSBzeW5jIG1lc3NhZ2UgdG8gdGhlIGNvbXBvc2l0aW5nIHRocmVhZC4KKyAgICBkZXN0cm95
T25Db21wb3NpdGluZ1RocmVhZCgpOworfQorCit2b2lkIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6
OmRlc3Ryb3lPbkNvbXBvc2l0aW5nVGhyZWFkKCkKK3sKKyAgICBpZiAoIWlzQ29tcG9zaXRpbmdU
aHJlYWQoKSkgeworICAgICAgICBkaXNwYXRjaFN5bmNDb21wb3NpdGluZ01lc3NhZ2UoQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKAorICAgICAgICAgICAgJkxh
eWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmRlc3Ryb3lPbkNvbXBvc2l0aW5nVGhyZWFkLAorICAgICAg
ICAgICAgdGhpcykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV90aWxlci0+bGF5
ZXJDb21wb3NpdGluZ1RocmVhZERlc3Ryb3llZCgpOworCisgICAgQVNTRVJUKCFzdXBlcmxheWVy
KCkpOworCisgICAgLy8gUmVtb3ZlIHRoZSBzdXBlcmxheWVyIHJlZmVyZW5jZSBmcm9tIGFsbCBz
dWJsYXllcnMuCisgICAgd2hpbGUgKG1fc3VibGF5ZXJzLnNpemUoKSkKKyAgICAgICAgbV9zdWJs
YXllcnNbMF0tPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisKKyAgICAvLyBEZWxldGUgYWxsIGFs
bG9jYXRlZCB0ZXh0dXJlcworICAgIGRlbGV0ZVRleHR1cmVzKCk7CisKKyAgICAvLyBXZSBqdXN0
IGRlbGV0ZWQgYWxsIG91ciB0ZXh0dXJlcywgbm8gbmVlZCBmb3IgdGhlCisgICAgLy8gbGF5ZXIg
cmVuZGVyZXIgdG8gdHJhY2sgdXMgYW55bW9yZQorICAgIGlmIChtX2xheWVyUmVuZGVyZXIpCisg
ICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+cmVtb3ZlTGF5ZXIodGhpcyk7Cit9CisKK3ZvaWQgTGF5
ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0TGF5ZXJSZW5kZXJlcihMYXllclJlbmRlcmVyKiByZW5k
ZXJlcikKK3sKKyAgICAvLyBJdCdzIG5vdCBleHBlY3RlZCB0aGF0IGxheWVycyB3aWxsIGV2ZXIg
c3dpdGNoIHJlbmRlcmVycy4KKyAgICBBU1NFUlQoIXJlbmRlcmVyIHx8ICFtX2xheWVyUmVuZGVy
ZXIgfHwgcmVuZGVyZXIgPT0gbV9sYXllclJlbmRlcmVyKTsKKworICAgIG1fbGF5ZXJSZW5kZXJl
ciA9IHJlbmRlcmVyOworICAgIGlmIChtX2xheWVyUmVuZGVyZXIpCisgICAgICAgIG1fbGF5ZXJS
ZW5kZXJlci0+YWRkTGF5ZXIodGhpcyk7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVh
ZDo6ZGVsZXRlVGV4dHVyZXMoKQoreworICAgIHJlbGVhc2VUZXh0dXJlUmVzb3VyY2VzKCk7CisK
KyAgICBtX3RpbGVyLT5kZWxldGVUZXh0dXJlcygpOworfQorCit2b2lkIExheWVyQ29tcG9zaXRp
bmdUaHJlYWQ6OnNldERyYXdUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG1h
dHJpeCkKK3sKKyAgICBtX2RyYXdUcmFuc2Zvcm0gPSBtYXRyaXg7CisKKyAgICBmbG9hdCBieCA9
IG1fYm91bmRzLndpZHRoKCkgLyAyLjA7CisgICAgZmxvYXQgYnkgPSBtX2JvdW5kcy5oZWlnaHQo
KSAvIDIuMDsKKyAgICBtX3RyYW5zZm9ybWVkQm91bmRzLnNldFAxKG1hdHJpeC5tYXBQb2ludChG
bG9hdFBvaW50KC1ieCwgLWJ5KSkpOworICAgIG1fdHJhbnNmb3JtZWRCb3VuZHMuc2V0UDIobWF0
cml4Lm1hcFBvaW50KEZsb2F0UG9pbnQoLWJ4LCBieSkpKTsKKyAgICBtX3RyYW5zZm9ybWVkQm91
bmRzLnNldFAzKG1hdHJpeC5tYXBQb2ludChGbG9hdFBvaW50KGJ4LCBieSkpKTsKKyAgICBtX3Ry
YW5zZm9ybWVkQm91bmRzLnNldFA0KG1hdHJpeC5tYXBQb2ludChGbG9hdFBvaW50KGJ4LCAtYnkp
KSk7CisKKyAgICBtX2RyYXdSZWN0ID0gbV90cmFuc2Zvcm1lZEJvdW5kcy5ib3VuZGluZ0JveCgp
OworfQorCitzdGF0aWMgRmxvYXRRdWFkIGdldFRyYW5zZm9ybWVkUmVjdChjb25zdCBJbnRTaXpl
JiBib3VuZHMsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4
JiBkcmF3VHJhbnNmb3JtKQoreworICAgIGZsb2F0IHggPSAtYm91bmRzLndpZHRoKCkgLyAyLjAg
KyByZWN0LngoKTsKKyAgICBmbG9hdCB5ID0gLWJvdW5kcy5oZWlnaHQoKSAvIDIuMCArIHJlY3Qu
eSgpOworICAgIGZsb2F0IHcgPSByZWN0LndpZHRoKCk7CisgICAgZmxvYXQgaCA9IHJlY3QuaGVp
Z2h0KCk7CisgICAgRmxvYXRRdWFkIHJlc3VsdDsKKyAgICByZXN1bHQuc2V0UDEoZHJhd1RyYW5z
Zm9ybS5tYXBQb2ludChGbG9hdFBvaW50KHgsIHkpKSk7CisgICAgcmVzdWx0LnNldFAyKGRyYXdU
cmFuc2Zvcm0ubWFwUG9pbnQoRmxvYXRQb2ludCh4LCB5K2gpKSk7CisgICAgcmVzdWx0LnNldFAz
KGRyYXdUcmFuc2Zvcm0ubWFwUG9pbnQoRmxvYXRQb2ludCh4K3csIHkraCkpKTsKKyAgICByZXN1
bHQuc2V0UDQoZHJhd1RyYW5zZm9ybS5tYXBQb2ludChGbG9hdFBvaW50KHgrdywgeSkpKTsKKwor
ICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEZJWE1FOiB0aGUgZm9sbG93aW5nIGxpbmUgZGlz
YWJsZXMgY2xpcHBpbmcgYSB2aWRlbyBpbiBhbiBpZnJhbWUgaS5lLiB0aGUgZml4IGFzc29jaWF0
ZWQgd2l0aCBQUiA5OTYzOC4KKy8vIFNvbWUgcmV2aXNlZCB0ZXN0IGNhc2UgKGUuZy4gdmlkZW8t
aWZyYW1lLmh0bWwpIHNob3cgdGhhdCB0aGUgb3JpZ2luYWwgZml4IHdvcmtzIGNvcnJlY3RseSB3
aGVuIHNjcm9sbGluZworLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSBmcmFtZSwgYnV0IGZhaWxzIHRv
IGNsaXAgY29ycmVjdGx5IGlmIHRoZSBwYWdlIChtYWluIGZyYW1lKSBpcyBzY3JvbGxlZC4KK3N0
YXRpYyBib29sIGVuYWJsZVZpZGVvQ2xpcHBpbmcgPSBmYWxzZTsKKworRmxvYXRRdWFkIExheWVy
Q29tcG9zaXRpbmdUaHJlYWQ6OmdldFRyYW5zZm9ybWVkSG9sZVB1bmNoUmVjdCgpIGNvbnN0Cit7
CisgICAgaWYgKCFtZWRpYVBsYXllcigpIHx8ICFlbmFibGVWaWRlb0NsaXBwaW5nKSB7CisgICAg
ICAgIC8vIG1faG9sZVB1bmNoQ2xpcFJlY3QgaXMgdmFsaWQgb25seSB3aGVuIHRoZXJlJ3MgYSBt
ZWRpYSBwbGF5ZXIuCisgICAgICAgIHJldHVybiBnZXRUcmFuc2Zvcm1lZFJlY3QobV9ib3VuZHMs
IG1faG9sZVB1bmNoUmVjdCwgbV9kcmF3VHJhbnNmb3JtKTsKKyAgICB9CisKKyAgICAvLyBUaGUg
aG9sZSBwdW5jaCByZWN0YW5nbGUgbWF5IG5lZWQgdG8gYmUgY2xpcHBlZCwKKyAgICAvLyBlLmcu
IGlmIHRoZSA8dmlkZW8+IGlzIG9uIGEgbGF5ZXIgdGhhdCdzIGluY2x1ZGVkIGFuZCBjbGlwcGVk
IGJ5IGFuIDxpZnJhbWU+LgorCisgICAgLy8gSW4gb3JkZXIgdG8gY2xpcCB3ZSBuZWVkIHRvIGRl
dGVybWluZSB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGlzIGxheWVyLCB3aGljaAorICAgIC8v
IGlzIGVuY29kZWQgaW4gdGhlIG1fZHJhd1RyYW5zZm9ybSB2YWx1ZSwgd2hpY2ggd2FzIHVzZWQg
dG8gaW5pdGlhbGl6ZSBtX2RyYXdSZWN0LgorICAgIEludFJlY3QgZHJhd1JlY3QgPSBtX2xheWVy
UmVuZGVyZXItPnRvV2ViS2l0RG9jdW1lbnRDb29yZGluYXRlcyhtX2RyYXdSZWN0KTsKKworICAg
IC8vIEFzc2VydCB0aGF0IGluIHRoaXMgY2FzZSwgd2hlcmUgdGhlIGhvbGUgcHVuY2ggcmVjdGFu
Z2xlIGVxdWFscyB0aGUgc2l6ZSBvZiB0aGUgbGF5ZXIsCisgICAgLy8gdGhlIGRyYXdSZWN0IGhh
cyB0aGUgc2FtZSBzaXplIGFzIHRoZSBob2xlIHB1bmNoLgorICAgIC8vIEFTU0VSVChkcmF3UmVj
dC5zaXplKCkgPT0gbV9ob2xlUHVuY2hSZWN0LnNpemUoKSk7CisgICAgLy8gRG9uJ3QgYXNzZXJ0
IGl0IHByb2dyYW10aWNhbGx5IHRob3VnaCBiZWNhdXNlIHRoZXJlIG1heSBiZSBvZmYtYnktb25l
IGVycm9yIGR1ZSB0byByb3VuZGluZyB3aGVuIHRoZXJlJ3Mgem9vbWluZy4KKworICAgIC8vIFRo
ZSBkaWZmZXJlbmNlIGJldHdlZW4gZHJhd1JlY3QgYW5kIG1faG9sZVB1bmNoUmVjdCBpcyB0aGF0
IGRyYXdSZWN0IGhhcyBhbiBhY2N1cmF0ZSBwb3NpdGlvbgorICAgIC8vIGluIFdlYktpdCBkb2N1
bWVudCBjb29yZGluYXRlcywgd2hlcmVhcyB0aGUgbV9ob2xlUHVuY2hSZWN0IGxvY2F0aW9uIGlz
ICgwLDApIGkuZS4gaXQncyByZWxhdGl2ZSB0byB0aGlzIGxheWVyLgorCisgICAgLy8gQ2xpcCB0
aGUgZHJhd1JlY3QuCisgICAgLy8gQm90aCBkcmF3UmVjdCBhbmQgbV9ob2xlUHVuY2hDbGlwUmVj
dCBhbHJlYWR5IGhhdmUgY29ycmVjdCBsb2NhdGlvbnMsIGluIFdlYktpdCBkb2N1bWVudCBjb29y
ZGluYXRlcy4KKyAgICBJbnRQb2ludCBsb2NhdGlvbiA9IGRyYXdSZWN0LmxvY2F0aW9uKCk7Cisg
ICAgZHJhd1JlY3QuaW50ZXJzZWN0KG1faG9sZVB1bmNoQ2xpcFJlY3QpOworCisgICAgLy8gU2hp
ZnQgdGhlIGNsaXBwZWQgZHJhd1JlY3QgdG8gaGF2ZSB0aGUgc2FtZSBraW5kIG9mIGxvY2F0ZWQt
YXQtemVybyBwb3NpdGlvbiBhcyB0aGUgb3JpZ2luYWwgaG9sZVB1bmNoUmVjdC4KKyAgICBkcmF3
UmVjdC5tb3ZlKC1sb2NhdGlvbi54KCksIC1sb2NhdGlvbi55KCkpOworCisjaWYgREVCVUdfVklE
RU9fQ0xJUFBJTkcKKyAgICAgSW50UmVjdCBkcmF3UmVjdEluV2ViS2l0RG9jdW1lbnRDb29yZGlu
YXRpb24gPSBtX2xheWVyUmVuZGVyZXItPnRvV2ViS2l0RG9jdW1lbnRDb29yZGluYXRlcyhtX2Ry
YXdSZWN0KTsKKyAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6Z2V0VHJhbnNmb3Jt
ZWRIb2xlUHVuY2hSZWN0KCkgLSBkcmF3UmVjdD0oeD0lZCx5PSVkLHdpZHRoPSVkLGhlaWdodD0l
ZCkgY2xpcFJlY3Q9KHg9JWQseT0lZCx3aWR0aD0lZCxoZWlnaHQ9JWQpIGNsaXBwZWRSZWN0PSh4
PSVkLHk9JWQsd2lkdGg9JWQsaGVpZ2h0PSVkKS4iLAorICAgICAgICAgZHJhd1JlY3RJbldlYktp
dERvY3VtZW50Q29vcmRpbmF0aW9uLngoKSwgZHJhd1JlY3RJbldlYktpdERvY3VtZW50Q29vcmRp
bmF0aW9uLnkoKSwgZHJhd1JlY3RJbldlYktpdERvY3VtZW50Q29vcmRpbmF0aW9uLndpZHRoKCks
IGRyYXdSZWN0SW5XZWJLaXREb2N1bWVudENvb3JkaW5hdGlvbi5oZWlnaHQoKSwKKyAgICAgICAg
IG1faG9sZVB1bmNoQ2xpcFJlY3QueCgpLCBtX2hvbGVQdW5jaENsaXBSZWN0LnkoKSwgbV9ob2xl
UHVuY2hDbGlwUmVjdC53aWR0aCgpLCBtX2hvbGVQdW5jaENsaXBSZWN0LmhlaWdodCgpLAorICAg
ICAgICAgZHJhd1JlY3QueCgpLCBkcmF3UmVjdC55KCksIGRyYXdSZWN0LndpZHRoKCksIGRyYXdS
ZWN0LmhlaWdodCgpKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIGdldFRyYW5zZm9ybWVkUmVjdCht
X2JvdW5kcywgZHJhd1JlY3QsIG1fZHJhd1RyYW5zZm9ybSk7Cit9CisKK3ZvaWQgTGF5ZXJDb21w
b3NpdGluZ1RocmVhZDo6ZHJhd1RleHR1cmVzKGludCBwb3NpdGlvbkxvY2F0aW9uLCBpbnQgdGV4
Q29vcmRMb2NhdGlvbiwgY29uc3QgRmxvYXRSZWN0JiB2aXNpYmxlUmVjdCkKK3sKKyAgICBmbG9h
dCB0ZXhjb29yZHNbNCAqIDJdID0geyAwLCAwLCAgMCwgMSwgIDEsIDEsICAxLCAwIH07CisKKyAg
ICBpZiAobV9wbHVnaW5WaWV3KSB7CisgICAgICAgIGlmIChtX2lzVmlzaWJsZSkgeworICAgICAg
ICAgICAgLy8gVGhlIGxheWVyIGNvbnRhaW5zIEZsYXNoLCB2aWRlbywgb3Igb3RoZXIgcGx1Z2lu
IGNvbnRlbnRzLgorICAgICAgICAgICAgbV9wbHVnaW5CdWZmZXIgPSBtX3BsdWdpblZpZXctPmxv
Y2tGcm9udEJ1ZmZlckZvclJlYWQoKTsKKworICAgICAgICAgICAgaWYgKCFtX3BsdWdpbkJ1ZmZl
cikKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlmICghQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkdyYXBoaWNzOjpsb2NrQW5kQmluZEJ1ZmZlckdMVGV4dHVyZShtX3BsdWdp
bkJ1ZmZlciwgR0xfVEVYVFVSRV8yRCkpIHsKKyAgICAgICAgICAgICAgICBtX3BsdWdpblZpZXct
PnVubG9ja0Zyb250QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBtX2xheWVyUmVuZGVyZXItPmFkZExheWVyVG9SZWxlYXNlVGV4
dHVyZVJlc291cmNlc0xpc3QodGhpcyk7CisKKyAgICAgICAgICAgIGdsVmVydGV4QXR0cmliUG9p
bnRlcihwb3NpdGlvbkxvY2F0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsICZtX3RyYW5z
Zm9ybWVkQm91bmRzKTsKKyAgICAgICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29y
ZExvY2F0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsIHRleGNvb3Jkcyk7CisgICAgICAg
ICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm47CisgICAgfQorI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAobV9tZWRpYVBs
YXllcikgeworICAgICAgICBpZiAobV9pc1Zpc2libGUpIHsKKyAgICAgICAgICAgIC8vIFdlIG5l
ZWQgdG8gc3BlY2lmeSB0aGUgbWVkaWEgcGxheWVyIGxvY2F0aW9uIGluIGNvbnRlbnRzIGNvb3Jk
aW5hdGVzLiBUaGUgJ3Zpc2libGVSZWN0JworICAgICAgICAgICAgLy8gc3BlY2lmaWVzIHRoZSBj
b250ZW50IHJlZ2lvbiBjb3ZlcmVkIGJ5IG91ciB2aWV3cG9ydC4gU28gd2UgdHJhbnNmb3JtIGZy
b20gb3VyCisgICAgICAgICAgICAvLyBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlcyBbLTEs
IDFdIHRvIHRoZSAndmlzaWJsZVJlY3QnLgorICAgICAgICAgICAgZmxvYXQgdnJ3MiA9IHZpc2li
bGVSZWN0LndpZHRoKCkgLyAyLjA7CisgICAgICAgICAgICBmbG9hdCB2cmgyID0gdmlzaWJsZVJl
Y3QuaGVpZ2h0KCkgLyAyLjA7CisgICAgICAgICAgICBmbG9hdCB4ID0gbV90cmFuc2Zvcm1lZEJv
dW5kcy5wMSgpLngoKSAqIHZydzIgKyB2cncyICsgdmlzaWJsZVJlY3QueCgpOworICAgICAgICAg
ICAgZmxvYXQgeSA9IC1tX3RyYW5zZm9ybWVkQm91bmRzLnAxKCkueSgpICogdnJoMiArIHZyaDIg
KyB2aXNpYmxlUmVjdC55KCk7CisgICAgICAgICAgICBtX21lZGlhUGxheWVyLT5wYWludCgwLCBJ
bnRSZWN0KChpbnQpKHgrMC41KSwgKGludCkoeSswLjUpLCBtX2JvdW5kcy53aWR0aCgpLCBtX2Jv
dW5kcy5oZWlnaHQoKSkpOworICAgICAgICAgICAgTWVkaWFQbGF5ZXJQcml2YXRlKiBtcHAgPSBz
dGF0aWNfY2FzdDxNZWRpYVBsYXllclByaXZhdGUqPihtX21lZGlhUGxheWVyLT5wbGF0Zm9ybU1l
ZGlhKCkubWVkaWEucW54TWVkaWFQbGF5ZXIpOworICAgICAgICAgICAgbXBwLT5kcmF3QnVmZmVy
aW5nQW5pbWF0aW9uKG1fZHJhd1RyYW5zZm9ybSwgcG9zaXRpb25Mb2NhdGlvbiwgdGV4Q29vcmRM
b2NhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lm
IEVOQUJMRShXRUJHTCkKKyAgICBpZiAobGF5ZXJUeXBlKCkgPT0gTGF5ZXJEYXRhOjpXZWJHTExh
eWVyKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtX2Zyb250QnVmZmVyTG9jayk7Cisg
ICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkxvY2F0aW9uLCAyLCBHTF9GTE9B
VCwgR0xfRkFMU0UsIDAsICZtX3RyYW5zZm9ybWVkQm91bmRzKTsKKyAgICAgICAgZmxvYXQgY2Fu
dmFzV2lkdGhSYXRpbyA9IDEuMGY7CisgICAgICAgIGZsb2F0IGNhbnZhc0hlaWdodFJhdGlvID0g
MS4wZjsKKyAgICAgICAgZmxvYXQgdXBzaWRlRG93bls0ICogMl0gPSB7IDAsIDEsICAwLCAxIC0g
Y2FudmFzSGVpZ2h0UmF0aW8sICBjYW52YXNXaWR0aFJhdGlvLCAxIC0gY2FudmFzSGVpZ2h0UmF0
aW8sICBjYW52YXNXaWR0aFJhdGlvLCAxIH07CisgICAgICAgIC8vIEZsaXAgdGhlIHRleHR1cmUg
WSBheGlzIGJlY2F1c2UgT3BlbkdMIGFuZCBTa2lhIGhhdmUgZGlmZmVyZW50IG9yaWdpbnMKKyAg
ICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3JkTG9jYXRpb24sIDIsIEdMX0ZMT0FU
LCBHTF9GQUxTRSwgMCwgdXBzaWRlRG93bik7CisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVY
VFVSRV8yRCwgbV90ZXhJRCk7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4s
IDAsIDQpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jayhtX2Zyb250QnVmZmVyTG9jayk7
CisgICAgICAgIC8vIEZJWE1FOiBJZiB0aGUgY2FudmFzL3RleHR1cmUgaXMgbGFyZ2VyIHRoYW4g
MjA0OHgyMDQ4LCB0aGVuIHdlJ2xsIGRpZSBoZXJlCisgICAgICAgIHJldHVybjsKKyAgICB9Cisj
ZW5kaWYKKyAgICBpZiAobV90ZXhJRCkgeworICAgICAgICBtX2xheWVyUmVuZGVyZXItPmFkZExh
eWVyVG9SZWxlYXNlVGV4dHVyZVJlc291cmNlc0xpc3QodGhpcyk7CisgICAgICAgIHB0aHJlYWRf
bXV0ZXhfbG9jayhtX2Zyb250QnVmZmVyTG9jayk7CisKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShH
TF9URVhUVVJFXzJELCBtX3RleElEKTsKKyAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHBv
c2l0aW9uTG9jYXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgJm1fdHJhbnNmb3JtZWRC
b3VuZHMpOworICAgICAgICBmbG9hdCBjYW52YXNXaWR0aFJhdGlvID0gKGZsb2F0KW1fY2FudmFz
LT53aWR0aCgpIC8gbV90ZXhXaWR0aDsKKyAgICAgICAgZmxvYXQgY2FudmFzSGVpZ2h0UmF0aW8g
PSAoZmxvYXQpbV9jYW52YXMtPmhlaWdodCgpIC8gbV90ZXhIZWlnaHQ7CisgICAgICAgIGZsb2F0
IHVwc2lkZURvd25bNCAqIDJdID0geyAwLCAxLCAgMCwgMSAtIGNhbnZhc0hlaWdodFJhdGlvLCAg
Y2FudmFzV2lkdGhSYXRpbywgMSAtIGNhbnZhc0hlaWdodFJhdGlvLCAgY2FudmFzV2lkdGhSYXRp
bywgMSB9OworICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIodGV4Q29vcmRMb2NhdGlvbiwg
MiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCB1cHNpZGVEb3duKTsKKyAgICAgICAgZ2xEcmF3QXJy
YXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBtX3RpbGVyLT5kcmF3VGV4dHVyZXModGhpcywgcG9zaXRpb25Mb2NhdGlvbiwgdGV4Q29vcmRM
b2NhdGlvbik7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6ZHJhd1N1cmZhY2Uo
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIGRyYXdUcmFuc2Zvcm0sIExheWVyQ29tcG9zaXRp
bmdUaHJlYWQqIG1hc2ssIGludCBwb3NpdGlvbkxvY2F0aW9uLCBpbnQgdGV4Q29vcmRMb2NhdGlv
bikKK3sKKyAgICBpZiAobV9sYXllclJlbmRlcmVyLT5sYXllckFscmVhZHlPblN1cmZhY2UodGhp
cykpIHsKKyAgICAgICAgdW5zaWduZWQgdGV4SUQgPSByZW5kZXJTdXJmYWNlKCktPnRleHR1cmUo
KS0+dGV4dHVyZUlkKCk7CisgICAgICAgIGlmICghdGV4SUQpIHsKKyAgICAgICAgICAgIC8vIEZJ
WE1FOiBpcyB0aGlzIGdvaW5nIHRvIGhhcHBlbj8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorICAgICAgICB0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT50ZXh0dXJlQWNj
ZXNzZWQocmVuZGVyU3VyZmFjZSgpLT50ZXh0dXJlKCkpOworICAgICAgICBnbEJpbmRUZXh0dXJl
KEdMX1RFWFRVUkVfMkQsIHRleElEKTsKKworICAgICAgICBpZiAobWFzaykgeworICAgICAgICAg
ICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUxKTsKKyAgICAgICAgICAgIG1hc2stPmJpbmRD
b250ZW50c1RleHR1cmUoKTsKKyAgICAgICAgICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJF
MCk7CisgICAgICAgIH0KKworICAgICAgICBGbG9hdFF1YWQgc3VyZmFjZVF1YWQgPSBnZXRUcmFu
c2Zvcm1lZFJlY3QobV9ib3VuZHMsIEludFJlY3QoSW50UG9pbnQoKSwgbV9ib3VuZHMpLCBkcmF3
VHJhbnNmb3JtKTsKKyAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHBvc2l0aW9uTG9jYXRp
b24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgJnN1cmZhY2VRdWFkKTsKKworICAgICAgICBm
bG9hdCB0ZXhjb29yZHNbNCAqIDJdID0geyAwLCAwLCAgMCwgMSwgIDEsIDEsICAxLCAwIH07Cisg
ICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZExvY2F0aW9uLCAyLCBHTF9GTE9B
VCwgR0xfRkFMU0UsIDAsIHRleGNvb3Jkcyk7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklB
TkdMRV9GQU4sIDAsIDQpOworICAgIH0KK30KKwordm9pZCBMYXllckNvbXBvc2l0aW5nVGhyZWFk
OjpkcmF3TWlzc2luZ1RleHR1cmVzKGludCBwb3NpdGlvbkxvY2F0aW9uLCBpbnQgdGV4Q29vcmRM
b2NhdGlvbiwgY29uc3QgRmxvYXRSZWN0JiB2aXNpYmxlUmVjdCkKK3sKKyAgICBpZiAobV9wbHVn
aW5WaWV3IHx8IG1fdGV4SUQpCisgICAgICAgIHJldHVybjsKKworI2lmIEVOQUJMRShWSURFTykK
KyAgICBpZiAobV9tZWRpYVBsYXllcikKKyAgICAgICAgcmV0dXJuOworI2VuZGlmCisKKyAgICBt
X3RpbGVyLT5kcmF3TWlzc2luZ1RleHR1cmVzKHRoaXMsIHBvc2l0aW9uTG9jYXRpb24sIHRleENv
b3JkTG9jYXRpb24pOworfQorCit2b2lkIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnJlbGVhc2VU
ZXh0dXJlUmVzb3VyY2VzKCkKK3sKKyAgICBpZiAobV9wbHVnaW5WaWV3ICYmIG1fcGx1Z2luQnVm
ZmVyKSB7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6cmVsZWFzZUJ1
ZmZlckdMVGV4dHVyZShtX3BsdWdpbkJ1ZmZlcik7CisgICAgICAgIG1fcGx1Z2luQnVmZmVyID0g
MDsKKyAgICAgICAgbV9wbHVnaW5WaWV3LT51bmxvY2tGcm9udEJ1ZmZlcigpOworICAgIH0KKyAg
ICBpZiAobV90ZXhJRCAmJiBtX2Zyb250QnVmZmVyTG9jaykKKyAgICAgICAgcHRocmVhZF9tdXRl
eF91bmxvY2sobV9mcm9udEJ1ZmZlckxvY2spOworfQorCit2b2lkIExheWVyQ29tcG9zaXRpbmdU
aHJlYWQ6OnNldFBsdWdpblZpZXcoUGx1Z2luVmlldyogcGx1Z2luVmlldykKK3sKKyAgICBpZiAo
IWlzQ29tcG9zaXRpbmdUaHJlYWQoKSkgeworICAgICAgICBkaXNwYXRjaFN5bmNDb21wb3NpdGlu
Z01lc3NhZ2UoQmxhY2tCZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKAor
ICAgICAgICAgICAgJkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldFBsdWdpblZpZXcsCisgICAg
ICAgICAgICB0aGlzLAorICAgICAgICAgICAgcGx1Z2luVmlldykpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgbV9wbHVnaW5WaWV3ID0gcGx1Z2luVmlldzsKK30KKworI2lmIEVOQUJM
RShWSURFTykKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0TWVkaWFQbGF5ZXIoTWVk
aWFQbGF5ZXIqIG1lZGlhUGxheWVyKQoreworICAgIGlmICghaXNDb21wb3NpdGluZ1RocmVhZCgp
KSB7CisgICAgICAgIGRpc3BhdGNoU3luY0NvbXBvc2l0aW5nTWVzc2FnZShCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAgICAgICAmTGF5ZXJDb21w
b3NpdGluZ1RocmVhZDo6c2V0TWVkaWFQbGF5ZXIsCisgICAgICAgICAgICB0aGlzLAorICAgICAg
ICAgICAgbWVkaWFQbGF5ZXIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fbWVk
aWFQbGF5ZXIgPSBtZWRpYVBsYXllcjsKK30KKyNlbmRpZgorCit2b2lkIExheWVyQ29tcG9zaXRp
bmdUaHJlYWQ6OmNsZWFyQW5pbWF0aW9ucygpCit7CisgICAgLy8gQW5pbWF0aW9ucyBkb24ndCB1
c2UgdGhyZWFkIHNhZmUgcmVmY291bnRpbmcsIGFuZCBtdXN0IG9ubHkgYmUKKyAgICAvLyB0b3Vj
aGVkIHdoZW4gdGhlIHR3byB0aHJlYWRzIGFyZSBpbiBzeW5jLgorICAgIGlmICghaXNDb21wb3Np
dGluZ1RocmVhZCgpKSB7CisgICAgICAgIGRpc3BhdGNoU3luY0NvbXBvc2l0aW5nTWVzc2FnZShC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAgICAg
ICAmTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6Y2xlYXJBbmltYXRpb25zLAorICAgICAgICAgICAg
dGhpcykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9ydW5uaW5nQW5pbWF0aW9u
cy5jbGVhcigpOworICAgIG1fc3VzcGVuZGVkQW5pbWF0aW9ucy5jbGVhcigpOworfQorCit2b2lk
IExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnJlbW92ZVN1YmxheWVyKExheWVyQ29tcG9zaXRpbmdU
aHJlYWQqIHN1YmxheWVyKQoreworICAgIEFTU0VSVChpc0NvbXBvc2l0aW5nVGhyZWFkKCkpOwor
CisgICAgaW50IGZvdW5kSW5kZXggPSBpbmRleE9mU3VibGF5ZXIoc3VibGF5ZXIpOworICAgIGlm
IChmb3VuZEluZGV4ID09IC0xKQorICAgICAgICByZXR1cm47CisKKyAgICBzdWJsYXllci0+c2V0
U3VwZXJsYXllcigwKTsKKyAgICBtX3N1YmxheWVycy5yZW1vdmUoZm91bmRJbmRleCk7Cit9CisK
K2ludCBMYXllckNvbXBvc2l0aW5nVGhyZWFkOjppbmRleE9mU3VibGF5ZXIoY29uc3QgTGF5ZXJD
b21wb3NpdGluZ1RocmVhZCogcmVmZXJlbmNlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbV9zdWJsYXllcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1fc3VibGF5ZXJzW2ld
ID09IHJlZmVyZW5jZSkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4g
LTE7Cit9CisKK2NvbnN0IExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIExheWVyQ29tcG9zaXRpbmdU
aHJlYWQ6OnJvb3RMYXllcigpIGNvbnN0Cit7CisgICAgY29uc3QgTGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZCogbGF5ZXIgPSB0aGlzOworICAgIGZvciAoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogc3Vw
ZXJsYXllciA9IGxheWVyLT5zdXBlcmxheWVyKCk7IHN1cGVybGF5ZXI7IGxheWVyID0gc3VwZXJs
YXllciwgc3VwZXJsYXllciA9IHN1cGVybGF5ZXItPnN1cGVybGF5ZXIoKSkgeyB9CisgICAgcmV0
dXJuIGxheWVyOworfQorCitMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBMYXllckNvbXBvc2l0aW5n
VGhyZWFkOjpzdXBlcmxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9zdXBlcmxheWVyOwor
fQorCit2b2lkIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnJlbW92ZUZyb21TdXBlcmxheWVyKCkK
K3sKKyAgICBpZiAobV9zdXBlcmxheWVyKQorICAgICAgICBtX3N1cGVybGF5ZXItPnJlbW92ZVN1
YmxheWVyKHRoaXMpOworfQorCit2b2lkIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldFN1Ymxh
eWVycyhjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyQ29tcG9zaXRpbmdUaHJlYWQ+ID4mIHN1Ymxh
eWVycykKK3sKKyAgICBpZiAoc3VibGF5ZXJzID09IG1fc3VibGF5ZXJzKQorICAgICAgICByZXR1
cm47CisKKyAgICB3aGlsZSAobV9zdWJsYXllcnMuc2l6ZSgpKSB7CisgICAgICAgIFJlZlB0cjxM
YXllckNvbXBvc2l0aW5nVGhyZWFkPiBsYXllciA9IG1fc3VibGF5ZXJzWzBdLmdldCgpOworICAg
ICAgICBBU1NFUlQobGF5ZXItPnN1cGVybGF5ZXIoKSk7CisgICAgICAgIGxheWVyLT5yZW1vdmVG
cm9tU3VwZXJsYXllcigpOworICAgIH0KKworICAgIG1fc3VibGF5ZXJzLmNsZWFyKCk7CisKKyAg
ICBzaXplX3QgbGlzdFNpemUgPSBzdWJsYXllcnMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgbGlzdFNpemU7IGkrKykgeworICAgICAgICBSZWZQdHI8TGF5ZXJDb21wb3NpdGlu
Z1RocmVhZD4gc3VibGF5ZXIgPSBzdWJsYXllcnNbaV07CisgICAgICAgIHN1YmxheWVyLT5yZW1v
dmVGcm9tU3VwZXJsYXllcigpOworICAgICAgICBzdWJsYXllci0+c2V0U3VwZXJsYXllcih0aGlz
KTsKKyAgICAgICAgbV9zdWJsYXllcnMuaW5zZXJ0KGksIHN1YmxheWVyKTsKKyAgICB9Cit9CisK
K3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6dXBkYXRlVGV4dHVyZUNvbnRlbnRzSWZOZWVk
ZWQoKQoreworICAgIGlmIChjYW52YXMoKSB8fCBwbHVnaW5WaWV3KCkpCisgICAgICAgIHJldHVy
bjsKKworI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAobWVkaWFQbGF5ZXIoKSkKKyAgICAgICAg
cmV0dXJuOworI2VuZGlmCisKKyAgICBtX3RpbGVyLT51cGxvYWRUZXh0dXJlc0lmTmVlZGVkKCk7
Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0VmlzaWJsZShib29sIHZpc2li
bGUpCit7CisgICAgaWYgKHZpc2libGUgPT0gbV92aXNpYmxlKQorICAgICAgICByZXR1cm47CisK
KyAgICBtX3Zpc2libGUgPSB2aXNpYmxlOworCisgICAgaWYgKGNhbnZhcygpIHx8IHBsdWdpblZp
ZXcoKSkKKyAgICAgICAgcmV0dXJuOworCisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlmIChtZWRp
YVBsYXllcigpKQorICAgICAgICByZXR1cm47CisjZW5kaWYKKworICAgIG1fdGlsZXItPmxheWVy
VmlzaWJpbGl0eUNoYW5nZWQodmlzaWJsZSk7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZDo6c2V0TmVlZHNDb21taXQoKQoreworICAgIGlmIChtX2xheWVyUmVuZGVyZXIpCisgICAg
ICAgIG1fbGF5ZXJSZW5kZXJlci0+c2V0TmVlZHNDb21taXQoKTsKK30KKwordm9pZCBMYXllckNv
bXBvc2l0aW5nVGhyZWFkOjpzY2hlZHVsZUNvbW1pdCgpCit7CisgICAgaWYgKCFpc1dlYktpdFRo
cmVhZCgpKSB7CisgICAgICAgIGlmIChtX2NvbW1pdFNjaGVkdWxlZCkKKyAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICBtX2NvbW1pdFNjaGVkdWxlZCA9IHRydWU7CisKKyAgICAgICAgZGlz
cGF0Y2hXZWJLaXRNZXNzYWdlKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxs
TWVzc2FnZSgmTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2NoZWR1bGVDb21taXQsIHRoaXMpKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fY29tbWl0U2NoZWR1bGVkID0gZmFsc2U7
CisKKyAgICAvLyBGSVhNRTogVGhlIG9ubHkgd2F5IHRvIGdldCBhdCBvdXIgTGF5ZXJXZWJLaXRU
aHJlYWQgaXMgdG8gZ28gdGhyb3VnaCB0aGUgdGlsZXIuCisgICAgTGF5ZXJXZWJLaXRUaHJlYWQq
IGxheWVyID0gbV90aWxlci0+bGF5ZXIoKTsKKyAgICBpZiAobGF5ZXIpCisgICAgICAgIGxheWVy
LT5zZXROZWVkc0NvbW1pdCgpOworfQorCisvLyBGSVhNRTogQ29weSBwYXN0ZWQgZnJvbSBXZWJD
b3JlOjpBbmltYXRpb25CYXNlISEhCisvLyBUaGUgZXBzaWxvbiB2YWx1ZSB3ZSBwYXNzIHRvIFVu
aXRCZXppZXI6OnNvbHZlIGdpdmVuIHRoYXQgdGhlIGFuaW1hdGlvbiBpcyBnb2luZyB0byBydW4g
b3ZlciB8ZHVyfCBzZWNvbmRzLiBUaGUgbG9uZ2VyIHRoZQorLy8gYW5pbWF0aW9uLCB0aGUgbW9y
ZSBwcmVjaXNpb24gd2UgbmVlZCBpbiB0aGUgdGltaW5nIGZ1bmN0aW9uIHJlc3VsdCB0byBhdm9p
ZCB1Z2x5IGRpc2NvbnRpbnVpdGllcy4KK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNvbHZlRXBzaWxv
bihkb3VibGUgZHVyYXRpb24pCit7CisgICAgcmV0dXJuIDEuMCAvICgyMDAuMCAqIGR1cmF0aW9u
KTsKK30KKworLy8gRklYTUU6IENvcHkgcGFzdGVkIGZyb20gV2ViQ29yZTo6QW5pbWF0aW9uQmFz
ZSEhIQorc3RhdGljIGlubGluZSBkb3VibGUgc29sdmVDdWJpY0JlemllckZ1bmN0aW9uKGRvdWJs
ZSBwMXgsIGRvdWJsZSBwMXksIGRvdWJsZSBwMngsIGRvdWJsZSBwMnksIGRvdWJsZSB0LCBkb3Vi
bGUgZHVyYXRpb24pCit7CisgICAgLy8gQ29udmVydCBmcm9tIGlucHV0IHRpbWUgdG8gcGFyYW1l
dHJpYyB2YWx1ZSBpbiBjdXJ2ZSwgdGhlbiBmcm9tCisgICAgLy8gdGhhdCB0byBvdXRwdXQgdGlt
ZS4KKyAgICBVbml0QmV6aWVyIGJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpOworICAgIHJldHVy
biBiZXppZXIuc29sdmUodCwgc29sdmVFcHNpbG9uKGR1cmF0aW9uKSk7Cit9CisKKy8vIEZJWE1F
OiBDb3B5IHBhc3RlZCBmcm9tIFdlYkNvcmU6OkFuaW1hdGlvbkJhc2UhISEKK3N0YXRpYyBpbmxp
bmUgZG91YmxlIHNvbHZlU3RlcHNGdW5jdGlvbihpbnQgbnVtU3RlcHMsIGJvb2wgc3RlcEF0U3Rh
cnQsIGRvdWJsZSB0KQoreworICAgIGlmIChzdGVwQXRTdGFydCkKKyAgICAgICAgcmV0dXJuIG1p
bigxLjAsIChmbG9vcihudW1TdGVwcyAqIHQpICsgMSkgLyBudW1TdGVwcyk7CisgICAgcmV0dXJu
IGZsb29yKG51bVN0ZXBzICogdCkgLyBudW1TdGVwczsKK30KKworLy8gRklYTUU6IENvcHkgcGFz
dGVkIGZyb20gV2ViQ29yZTo6R3JhcGhpY3NMYXllckNBISEhCitzdGF0aWMgY29uc3QgVGltaW5n
RnVuY3Rpb24qIHRpbWluZ0Z1bmN0aW9uRm9yQW5pbWF0aW9uVmFsdWUoY29uc3QgQW5pbWF0aW9u
VmFsdWUqIGFuaW1WYWx1ZSwgY29uc3QgTGF5ZXJBbmltYXRpb24qIGFuaW0pCit7CisgICAgaWYg
KGFuaW1WYWx1ZS0+dGltaW5nRnVuY3Rpb24oKSkKKyAgICAgICAgcmV0dXJuIGFuaW1WYWx1ZS0+
dGltaW5nRnVuY3Rpb24oKTsKKyAgICBpZiAoYW5pbS0+dGltaW5nRnVuY3Rpb24oKSkKKyAgICAg
ICAgcmV0dXJuIGFuaW0tPnRpbWluZ0Z1bmN0aW9uKCk7CisKKyAgICByZXR1cm4gQ3ViaWNCZXpp
ZXJUaW1pbmdGdW5jdGlvbjo6ZGVmYXVsdFRpbWluZ0Z1bmN0aW9uKCk7Cit9CisKKy8vIEZJWE1F
OiBDb3B5IHBhc3RlZCBmcm9tIFdlYkNvcmU6OkFuaW1hdGlvbkJhc2UhISEKK3N0YXRpYyBkb3Vi
bGUgcHJvZ3Jlc3MoZG91YmxlIGVsYXBzZWRUaW1lLCBjb25zdCBMYXllckFuaW1hdGlvbiogbGF5
ZXJBbmltYXRpb24sIGRvdWJsZSBzY2FsZSwgZG91YmxlIG9mZnNldCwgY29uc3QgVGltaW5nRnVu
Y3Rpb24qIHRmKQoreworICAgIGRvdWJsZSBkdXIgPSBsYXllckFuaW1hdGlvbi0+ZHVyYXRpb24o
KTsKKyAgICBpZiAobGF5ZXJBbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCkgPiAwKQorICAgICAg
ICBkdXIgKj0gbGF5ZXJBbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCk7CisKKyAgICBpZiAoIWxh
eWVyQW5pbWF0aW9uLT5kdXJhdGlvbigpKQorICAgICAgICByZXR1cm4gMS4wOworICAgIGlmIChs
YXllckFuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKSA+IDAgJiYgZWxhcHNlZFRpbWUgPj0gZHVy
KQorICAgICAgICByZXR1cm4gKGxheWVyQW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpICUgMikg
PyAxLjAgOiAwLjA7CisKKyAgICAvLyBDb21wdXRlIHRoZSBmcmFjdGlvbmFsIHRpbWUsIHRha2lu
ZyBpbnRvIGFjY291bnQgZGlyZWN0aW9uLgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gd29y
cnkgYWJvdXQgaXRlcmF0aW9ucywgd2UgYXNzdW1lIHRoYXQgd2Ugd291bGQgaGF2ZQorICAgIC8v
IHNob3J0IGNpcmN1aXRlZCBhYm92ZSBpZiB3ZSB3ZXJlIGRvbmUuCisgICAgZG91YmxlIGZyYWN0
aW9uYWxUaW1lID0gZWxhcHNlZFRpbWUgLyBsYXllckFuaW1hdGlvbi0+ZHVyYXRpb24oKTsKKyAg
ICBpbnQgaW50ZWdyYWxUaW1lID0gc3RhdGljX2Nhc3Q8aW50PihmcmFjdGlvbmFsVGltZSk7Cisg
ICAgZnJhY3Rpb25hbFRpbWUgLT0gaW50ZWdyYWxUaW1lOworCisgICAgaWYgKChsYXllckFuaW1h
dGlvbi0+ZGlyZWN0aW9uKCkgPT0gQW5pbWF0aW9uOjpBbmltYXRpb25EaXJlY3Rpb25BbHRlcm5h
dGUpICYmIChpbnRlZ3JhbFRpbWUgJiAxKSkKKyAgICAgICAgZnJhY3Rpb25hbFRpbWUgPSAxIC0g
ZnJhY3Rpb25hbFRpbWU7CisKKyAgICBpZiAoc2NhbGUgIT0gMSB8fCBvZmZzZXQpCisgICAgICAg
IGZyYWN0aW9uYWxUaW1lID0gKGZyYWN0aW9uYWxUaW1lIC0gb2Zmc2V0KSAqIHNjYWxlOworCisg
ICAgaWYgKCF0ZikKKyAgICAgICAgdGYgPSBsYXllckFuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24o
KTsKKworICAgIGlmICh0Zi0+aXNDdWJpY0JlemllclRpbWluZ0Z1bmN0aW9uKCkpIHsKKyAgICAg
ICAgY29uc3QgQ3ViaWNCZXppZXJUaW1pbmdGdW5jdGlvbiogY3RmID0gc3RhdGljX2Nhc3Q8Y29u
c3QgQ3ViaWNCZXppZXJUaW1pbmdGdW5jdGlvbio+KHRmKTsKKyAgICAgICAgcmV0dXJuIHNvbHZl
Q3ViaWNCZXppZXJGdW5jdGlvbihjdGYtPngxKCksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY3RmLT55MSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGN0Zi0+eDIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjdGYtPnkyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZnJhY3Rpb25hbFRpbWUsIGxheWVyQW5pbWF0aW9uLT5kdXJhdGlvbigpKTsKKyAgICB9IGVsc2Ug
aWYgKHRmLT5pc1N0ZXBzVGltaW5nRnVuY3Rpb24oKSkgeworICAgICAgICBjb25zdCBTdGVwc1Rp
bWluZ0Z1bmN0aW9uKiBzdGYgPSBzdGF0aWNfY2FzdDxjb25zdCBTdGVwc1RpbWluZ0Z1bmN0aW9u
Kj4odGYpOworICAgICAgICByZXR1cm4gc29sdmVTdGVwc0Z1bmN0aW9uKHN0Zi0+bnVtYmVyT2ZT
dGVwcygpLCBzdGYtPnN0ZXBBdFN0YXJ0KCksIGZyYWN0aW9uYWxUaW1lKTsKKyAgICB9IGVsc2UK
KyAgICAgICAgcmV0dXJuIGZyYWN0aW9uYWxUaW1lOworfQorCisvLyBGSVhNRTogQ29weSBwYXN0
ZWQgZnJvbSBXZWJDb3JlOjpLZXlmcmFtZUFuaW1hdGlvbiEhIQorc3RhdGljIHZvaWQgZmV0Y2hJ
bnRlcnZhbEVuZHBvaW50cyhkb3VibGUgZWxhcHNlZFRpbWUsIGNvbnN0IExheWVyQW5pbWF0aW9u
KiBsYXllckFuaW1hdGlvbiwgY29uc3QgQW5pbWF0aW9uVmFsdWUqJiBmcm9tVmFsdWUsIGNvbnN0
IEFuaW1hdGlvblZhbHVlKiYgdG9WYWx1ZSwgZG91YmxlJiBwcm9nKQoreworICAgIC8vIEZpbmQg
dGhlIGZpcnN0IGtleQorICAgIGlmIChsYXllckFuaW1hdGlvbi0+ZHVyYXRpb24oKSAmJiBsYXll
ckFuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKSAhPSBBbmltYXRpb246Okl0ZXJhdGlvbkNvdW50
SW5maW5pdGUpCisgICAgICAgIGVsYXBzZWRUaW1lID0gbWluKGVsYXBzZWRUaW1lLCBsYXllckFu
aW1hdGlvbi0+ZHVyYXRpb24oKSAqIGxheWVyQW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpKTsK
KworICAgIGRvdWJsZSBmcmFjdGlvbmFsVGltZSA9IGxheWVyQW5pbWF0aW9uLT5kdXJhdGlvbigp
ID8gKGVsYXBzZWRUaW1lIC8gbGF5ZXJBbmltYXRpb24tPmR1cmF0aW9uKCkpIDogMTsKKworICAg
IC8vIEZJWE1FOiBzdGFydFRpbWUgY2FuIGJlIGJlZm9yZSB0aGUgY3VycmVudCBhbmltYXRpb24g
ImZyYW1lIiB0aW1lLiBUaGlzIGlzIHRvIHN5bmMgd2l0aCB0aGUgZnJhbWUgdGltZQorICAgIC8v
IGNvbmNlcHQgaW4gQW5pbWF0aW9uVGltZUNvbnRyb2xsZXIuIFNvIHdlIG5lZWQgdG8gc29tZWhv
dyBzeW5jIHRoZSB0d28uIFVudGlsIHRoZW4sIHRoZSBwb3NzaWJsZQorICAgIC8vIGVycm9yIGlz
IHNtYWxsIGFuZCB3aWxsIHByb2JhYmx5IG5vdCBiZSBub3RpY2VhYmxlLiBVbnRpbCB3ZSBmaXgg
dGhpcywgcmVtb3ZlIHRoZSBhc3NlcnQuCisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTUyMDM3CisgICAgLy8gQVNTRVJUKGZyYWN0aW9uYWxUaW1lID49IDAp
OworICAgIGlmIChmcmFjdGlvbmFsVGltZSA8IDApCisgICAgICAgIGZyYWN0aW9uYWxUaW1lID0g
MDsKKworICAgIC8vIEZJWE1FOiBzaGFyZSB0aGlzIGNvZGUgd2l0aCBBbmltYXRpb25CYXNlOjpw
cm9ncmVzcygpLgorICAgIGludCBpdGVyYXRpb24gPSBzdGF0aWNfY2FzdDxpbnQ+KGZyYWN0aW9u
YWxUaW1lKTsKKyAgICBpZiAobGF5ZXJBbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCkgIT0gQW5p
bWF0aW9uOjpJdGVyYXRpb25Db3VudEluZmluaXRlKQorICAgICAgICBpdGVyYXRpb24gPSBtaW4o
aXRlcmF0aW9uLCBsYXllckFuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKSAtIDEpOworCisgICAg
ZnJhY3Rpb25hbFRpbWUgLT0gaXRlcmF0aW9uOworCisgICAgYm9vbCByZXZlcnNpbmcgPSAobGF5
ZXJBbmltYXRpb24tPmRpcmVjdGlvbigpID09IEFuaW1hdGlvbjo6QW5pbWF0aW9uRGlyZWN0aW9u
QWx0ZXJuYXRlKSAmJiAoaXRlcmF0aW9uICYgMSk7CisgICAgaWYgKHJldmVyc2luZykKKyAgICAg
ICAgZnJhY3Rpb25hbFRpbWUgPSAxIC0gZnJhY3Rpb25hbFRpbWU7CisKKyAgICBzaXplX3QgbnVt
S2V5ZnJhbWVzID0gbGF5ZXJBbmltYXRpb24tPnZhbHVlQ291bnQoKTsKKyAgICBpZiAoIW51bUtl
eWZyYW1lcykKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKCFsYXllckFuaW1hdGlvbi0+
dmFsdWVBdCgwKS0+a2V5VGltZSgpKTsKKyAgICBBU1NFUlQobGF5ZXJBbmltYXRpb24tPnZhbHVl
QXQobGF5ZXJBbmltYXRpb24tPnZhbHVlQ291bnQoKSAtIDEpLT5rZXlUaW1lKCkgPT0gMSk7CisK
KyAgICBpbnQgcHJldkluZGV4ID0gLTE7CisgICAgaW50IG5leHRJbmRleCA9IC0xOworCisgICAg
Ly8gRklYTUU6IHdpdGggYSBsb3Qgb2Yga2V5cywgdGhpcyBsaW5lYXIgc2VhcmNoIHdpbGwgYmUg
c2xvdy4gV2UgY291bGQgYmluYXJ5IHNlYXJjaC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IG51bUtleWZyYW1lczsgKytpKSB7CisgICAgICAgIGNvbnN0IEFuaW1hdGlvblZhbHVlKiBjdXJy
S2V5ZnJhbWUgPSBsYXllckFuaW1hdGlvbi0+dmFsdWVBdChpKTsKKworICAgICAgICBpZiAoZnJh
Y3Rpb25hbFRpbWUgPCBjdXJyS2V5ZnJhbWUtPmtleVRpbWUoKSkgeworICAgICAgICAgICAgbmV4
dEluZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcHJl
dkluZGV4ID0gaTsKKyAgICB9CisKKyAgICBkb3VibGUgc2NhbGUgPSAxOworICAgIGRvdWJsZSBv
ZmZzZXQgPSAwOworCisgICAgaWYgKHByZXZJbmRleCA9PSAtMSkKKyAgICAgICAgcHJldkluZGV4
ID0gMDsKKworICAgIGlmIChuZXh0SW5kZXggPT0gLTEpCisgICAgICAgIG5leHRJbmRleCA9IGxh
eWVyQW5pbWF0aW9uLT52YWx1ZUNvdW50KCkgLSAxOworCisgICAgY29uc3QgQW5pbWF0aW9uVmFs
dWUqIHByZXZLZXlmcmFtZSA9IGxheWVyQW5pbWF0aW9uLT52YWx1ZUF0KHByZXZJbmRleCk7Cisg
ICAgY29uc3QgQW5pbWF0aW9uVmFsdWUqIG5leHRLZXlmcmFtZSA9IGxheWVyQW5pbWF0aW9uLT52
YWx1ZUF0KG5leHRJbmRleCk7CisKKyAgICBmcm9tVmFsdWUgPSBwcmV2S2V5ZnJhbWU7CisgICAg
dG9WYWx1ZSA9IG5leHRLZXlmcmFtZTsKKworICAgIG9mZnNldCA9IHByZXZLZXlmcmFtZS0+a2V5
VGltZSgpOworICAgIHNjYWxlID0gMS4wIC8gKG5leHRLZXlmcmFtZS0+a2V5VGltZSgpIC0gcHJl
dktleWZyYW1lLT5rZXlUaW1lKCkpOworCisgICAgY29uc3QgVGltaW5nRnVuY3Rpb24qIHRpbWlu
Z0Z1bmN0aW9uID0gdGltaW5nRnVuY3Rpb25Gb3JBbmltYXRpb25WYWx1ZShwcmV2S2V5ZnJhbWUs
IGxheWVyQW5pbWF0aW9uKTsKKworICAgIHByb2cgPSBwcm9ncmVzcyhlbGFwc2VkVGltZSwgbGF5
ZXJBbmltYXRpb24sIHNjYWxlLCBvZmZzZXQsIHRpbWluZ0Z1bmN0aW9uKTsKK30KKworYm9vbCBM
YXllckNvbXBvc2l0aW5nVGhyZWFkOjp1cGRhdGVBbmltYXRpb25zKGRvdWJsZSBjdXJyZW50VGlt
ZSkKK3sKKyAgICAvLyBUaGUgY29tbWl0IG1lY2hhbmlzbSBhbHdheXMgb3ZlcndyaXRlcyBvdXIg
c3RhdGUgd2l0aCBzdGF0ZSBmcm9tIHRoZQorICAgIC8vIFdlYktpdCB0aHJlYWQuIFRoaXMgbWVh
bnMgd2UgaGF2ZSB0byByZXN0b3JlIHRoZSBsYXN0IGFuaW1hdGVkIHZhbHVlIGZvcgorICAgIC8v
IHN1c3BlbmRlZCBhbmltYXRpb25zLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9zdXNw
ZW5kZWRBbmltYXRpb25zLnNpemUoKTsgKytpKSB7CisgICAgICAgIExheWVyQW5pbWF0aW9uKiBh
bmltYXRpb24gPSBtX3N1c3BlbmRlZEFuaW1hdGlvbnNbaV0uZ2V0KCk7CisgICAgICAgIC8vIEZy
b20gbG9va2luZyBhdCB0aGUgV2ViQ29yZSBjb2RlLCBpdCBhcHBlYXJzIHRoYXQgd2hlbiB0aGUg
YW5pbWF0aW9uCisgICAgICAgIC8vIGlzIHBhdXNlZCwgdGhlIHRpbWVPZmZzZXQgaXMgbW9kaWZp
ZWQgc28gaXQgd2lsbCBiZSBhbiBhcHByb3ByaWF0ZQorICAgICAgICAvLyBlbGFwc2VkVGltZS4K
KyAgICAgICAgZG91YmxlIGVsYXBzZWRUaW1lID0gYW5pbWF0aW9uLT50aW1lT2Zmc2V0KCk7Cisg
ICAgICAgIHVwZGF0ZUFuaW1hdGlvbihhbmltYXRpb24sIGVsYXBzZWRUaW1lKTsKKyAgICB9CisK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fcnVubmluZ0FuaW1hdGlvbnMuc2l6ZSgpOyAr
K2kpIHsKKyAgICAgICAgTGF5ZXJBbmltYXRpb24qIGFuaW1hdGlvbiA9IG1fcnVubmluZ0FuaW1h
dGlvbnNbaV0uZ2V0KCk7CisgICAgICAgIGRvdWJsZSBlbGFwc2VkVGltZSA9IChtX3N1c3BlbmRU
aW1lID8gbV9zdXNwZW5kVGltZSA6IGN1cnJlbnRUaW1lKSAtIGFuaW1hdGlvbi0+c3RhcnRUaW1l
KCkgKyBhbmltYXRpb24tPnRpbWVPZmZzZXQoKTsKKyAgICAgICAgdXBkYXRlQW5pbWF0aW9uKGFu
aW1hdGlvbiwgZWxhcHNlZFRpbWUpOworICAgIH0KKworICAgIHJldHVybiAhbV9ydW5uaW5nQW5p
bWF0aW9ucy5pc0VtcHR5KCk7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6dXBk
YXRlQW5pbWF0aW9uKGNvbnN0IExheWVyQW5pbWF0aW9uKiBsYXllckFuaW1hdGlvbiwgZG91Ymxl
IGVsYXBzZWRUaW1lKQoreworICAgIGNvbnN0IEFuaW1hdGlvblZhbHVlKiBmcm9tID0gMDsKKyAg
ICBjb25zdCBBbmltYXRpb25WYWx1ZSogdG8gPSAwOworICAgIGRvdWJsZSBwcm9ncmVzcyA9IDAu
MDsKKworICAgIGZldGNoSW50ZXJ2YWxFbmRwb2ludHMoZWxhcHNlZFRpbWUsIGxheWVyQW5pbWF0
aW9uLCBmcm9tLCB0bywgcHJvZ3Jlc3MpOworCisjaWYgREVCVUdfTEFZRVJfQU5JTUFUSU9OCisg
ICAgZnByaW50ZihzdGRlcnIsICJMYXllckFuaW1hdGlvbiAweCUwOHg6IHByb2dyZXNzID0gJWYs
IGZyb20gPSAlcywgdG8gPSAlc1xuIiwgbGF5ZXJBbmltYXRpb24sIHByb2dyZXNzLCBmcm9tID8g
ZnJvbS0+dG9TdHJpbmcoKS5sYXRpbjEoKS5kYXRhKCkgOiAiIiwgdG8gPyB0by0+dG9TdHJpbmco
KS5sYXRpbjEoKS5kYXRhKCkgOiAiIik7CisjZW5kaWYKKworICAgIHN3aXRjaCAobGF5ZXJBbmlt
YXRpb24tPnByb3BlcnR5KCkpIHsKKyAgICBjYXNlIEFuaW1hdGVkUHJvcGVydHlJbnZhbGlkOgor
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBB
bmltYXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtOgorICAgICAgICBtX3RyYW5zZm9ybSA9IGxh
eWVyQW5pbWF0aW9uLT5ibGVuZFRyYW5zZm9ybShzdGF0aWNfY2FzdDxjb25zdCBUcmFuc2Zvcm1B
bmltYXRpb25WYWx1ZSo+KGZyb20pLT52YWx1ZSgpLCBzdGF0aWNfY2FzdDxjb25zdCBUcmFuc2Zv
cm1BbmltYXRpb25WYWx1ZSo+KHRvKS0+dmFsdWUoKSwgcHJvZ3Jlc3MpOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5OgorICAgICAgICBtX29wYWNpdHkg
PSBsYXllckFuaW1hdGlvbi0+YmxlbmRPcGFjaXR5KHN0YXRpY19jYXN0PGNvbnN0IEZsb2F0QW5p
bWF0aW9uVmFsdWUqPihmcm9tKS0+dmFsdWUoKSwgc3RhdGljX2Nhc3Q8Y29uc3QgRmxvYXRBbmlt
YXRpb25WYWx1ZSo+KHRvKS0+dmFsdWUoKSwgcHJvZ3Jlc3MpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIEFuaW1hdGVkUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2Jvb2wgTGF5ZXJDb21w
b3NpdGluZ1RocmVhZDo6aGFzVmlzaWJsZUhvbGVQdW5jaFJlY3QoKSBjb25zdAoreworICAgIGlm
IChtX3BsdWdpblZpZXcgJiYgIW1faXNWaXNpYmxlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyNpZiBFTkFCTEUoVklERU8pCisgICAgaWYgKG1fbWVkaWFQbGF5ZXIgJiYgIW1faXNWaXNpYmxl
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKworICAgIHJldHVybiBoYXNIb2xlUHVu
Y2hSZWN0KCk7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6Y3JlYXRlUmVuZGVy
U3VyZmFjZSgpCit7CisgICAgQVNTRVJUKCFtX3JlbmRlclN1cmZhY2UpOworICAgIG1fcmVuZGVy
U3VyZmFjZSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJTdXJmYWNlKG1fbGF5ZXJSZW5kZXJlciwgdGhp
cykpOworfQorCit9CisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xh
eWVyQ29tcG9zaXRpbmdUaHJlYWQuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2JsYWNrYmVycnkvTGF5ZXJDb21wb3NpdGluZ1RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQ3NTg1Njg0
NDY4ZGQ4NGQ3ODUwNGEwNGNlMjU4ZGQwNzk1MGExMjUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyQ29tcG9zaXRpbmdU
aHJlYWQuaApAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAx
MSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBk
aXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworI2lm
bmRlZiBMYXllckNvbXBvc2l0aW5nVGhyZWFkX2gKKyNkZWZpbmUgTGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZF9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJG
bG9hdFF1YWQuaCIKKyNpbmNsdWRlICJMYXllckRhdGEuaCIKKyNpbmNsdWRlICJMYXllclRpbGVy
LmgiCisjaW5jbHVkZSAiUmVuZGVyU3VyZmFjZS5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBs
YXRmb3JtR3VhcmRlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDx3dGYvRGVxdWUuaD4KKyNpbmNsdWRl
IDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KKworY2xhc3MgU2tCaXRtYXA7CisKK25hbWVz
cGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBQbGF0Zm9ybSB7CituYW1lc3BhY2UgR3JhcGhp
Y3MgeworY2xhc3MgQnVmZmVyOworfQorfQorfQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Ns
YXNzIERlc3Ryb3lPbkNvbXBvc2l0aW5nVGhyZWFkOworY2xhc3MgTGF5ZXJNZXNzYWdlOworY2xh
c3MgTGF5ZXJSZW5kZXJlcjsKKworY2xhc3MgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCA6IHB1Ymxp
YyBUaHJlYWRTYWZlUmVmQ291bnRlZDxMYXllckNvbXBvc2l0aW5nVGhyZWFkPiwgcHVibGljIExh
eWVyRGF0YSwgcHVibGljIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHdWFyZGVkUG9pbnRlckJhc2Ug
eworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPExheWVyQ29tcG9zaXRpbmdUaHJlYWQ+
IGNyZWF0ZShMYXllclR5cGUsIFBhc3NSZWZQdHI8TGF5ZXJUaWxlcj4pOworCisgICAgfkxheWVy
Q29tcG9zaXRpbmdUaHJlYWQoKTsKKworICAgIC8vIFRocmVhZCBzYWZlCisgICAgdm9pZCBzZXRQ
bHVnaW5WaWV3KFBsdWdpblZpZXcqKTsKKyNpZiBFTkFCTEUoVklERU8pCisgICAgdm9pZCBzZXRN
ZWRpYVBsYXllcihNZWRpYVBsYXllciopOworI2VuZGlmCisgICAgdm9pZCBjbGVhckFuaW1hdGlv
bnMoKTsKKworICAgIC8vIE5vdCB0aHJlYWQgc2FmZQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlm
IHdlIGhhdmUgYW4gYW5pbWF0aW9uCisgICAgYm9vbCB1cGRhdGVBbmltYXRpb25zKGRvdWJsZSBj
dXJyZW50VGltZSk7CisgICAgdm9pZCB1cGRhdGVUZXh0dXJlQ29udGVudHNJZk5lZWRlZCgpOwor
ICAgIHZvaWQgYmluZENvbnRlbnRzVGV4dHVyZSgpCisgICAgeworICAgICAgICBpZiAobV90aWxl
cikKKyAgICAgICAgICAgIG1fdGlsZXItPmJpbmRDb250ZW50c1RleHR1cmUoKTsKKyAgICB9CisK
KyAgICBjb25zdCBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiByb290TGF5ZXIoKSBjb25zdDsKKyAg
ICB2b2lkIHNldFN1YmxheWVycyhjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyQ29tcG9zaXRpbmdU
aHJlYWQ+ID4mKTsKKyAgICBjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyQ29tcG9zaXRpbmdUaHJl
YWQ+ID4mIGdldFN1YmxheWVycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VibGF5ZXJzOyB9CisgICAg
dm9pZCBzZXRTdXBlcmxheWVyKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIHN1cGVybGF5ZXIpIHsg
bV9zdXBlcmxheWVyID0gc3VwZXJsYXllcjsgfQorICAgIExheWVyQ29tcG9zaXRpbmdUaHJlYWQq
IHN1cGVybGF5ZXIoKSBjb25zdDsKKworICAgIC8vIFRoZSBsYXllciByZW5kZXJlciBtdXN0IGJl
IHNldCBpZiB0aGUgbGF5ZXIgaGFzIGJlZW4gcmVuZGVyZWQKKyAgICB2b2lkIHNldExheWVyUmVu
ZGVyZXIoTGF5ZXJSZW5kZXJlciopOworCisgICAgdm9pZCBzZXREcmF3VHJhbnNmb3JtKGNvbnN0
IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7CisgICAgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
IGRyYXdUcmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX2RyYXdUcmFuc2Zvcm07IH0KKworICAg
IHZvaWQgc2V0RHJhd09wYWNpdHkoZmxvYXQgb3BhY2l0eSkgeyBtX2RyYXdPcGFjaXR5ID0gb3Bh
Y2l0eTsgfQorICAgIGZsb2F0IGRyYXdPcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbV9kcmF3T3Bh
Y2l0eTsgfQorCisgICAgdm9pZCBjcmVhdGVSZW5kZXJTdXJmYWNlKCk7CisgICAgUmVuZGVyU3Vy
ZmFjZSogcmVuZGVyU3VyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fcmVuZGVyU3VyZmFjZS5nZXQo
KTsgfQorICAgIHZvaWQgY2xlYXJSZW5kZXJTdXJmYWNlKCkgeyBtX3JlbmRlclN1cmZhY2UuY2xl
YXIoKTsgfQorCisgICAgdm9pZCBzZXRNYXNrTGF5ZXIoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCog
bWFza0xheWVyKSB7IG1fbWFza0xheWVyID0gbWFza0xheWVyOyB9CisgICAgTGF5ZXJDb21wb3Np
dGluZ1RocmVhZCogbWFza0xheWVyKCkgY29uc3QgeyByZXR1cm4gbV9tYXNrTGF5ZXIuZ2V0KCk7
IH0KKworICAgIHZvaWQgc2V0UmVwbGljYUxheWVyKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIGxh
eWVyKSB7IG1fcmVwbGljYUxheWVyID0gbGF5ZXI7IH0KKyAgICBMYXllckNvbXBvc2l0aW5nVGhy
ZWFkKiByZXBsaWNhTGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX3JlcGxpY2FMYXllci5nZXQoKTsg
fQorCisgICAgRmxvYXRSZWN0IGdldERyYXdSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9kcmF3UmVj
dDsgfQorICAgIGNvbnN0IEZsb2F0UXVhZCYgZ2V0VHJhbnNmb3JtZWRCb3VuZHMoKSBjb25zdCB7
IHJldHVybiBtX3RyYW5zZm9ybWVkQm91bmRzOyB9CisgICAgRmxvYXRRdWFkIGdldFRyYW5zZm9y
bWVkSG9sZVB1bmNoUmVjdCgpIGNvbnN0OworCisgICAgdm9pZCBkZWxldGVUZXh0dXJlcygpOwor
CisgICAgdm9pZCBkcmF3VGV4dHVyZXMoaW50IHBvc2l0aW9uTG9jYXRpb24sIGludCB0ZXhDb29y
ZExvY2F0aW9uLCBjb25zdCBGbG9hdFJlY3QmIHZpc2libGVSZWN0KTsKKyAgICBib29sIGhhc01p
c3NpbmdUZXh0dXJlcygpIGNvbnN0IHsgcmV0dXJuIG1fdGlsZXIgPyBtX3RpbGVyLT5oYXNNaXNz
aW5nVGV4dHVyZXMoKSA6IGZhbHNlOyB9CisgICAgdm9pZCBkcmF3TWlzc2luZ1RleHR1cmVzKGlu
dCBwb3NpdGlvbkxvY2F0aW9uLCBpbnQgdGV4Q29vcmRMb2NhdGlvbiwgY29uc3QgRmxvYXRSZWN0
JiB2aXNpYmxlUmVjdCk7CisgICAgdm9pZCBkcmF3U3VyZmFjZShjb25zdCBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCYsIExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIG1hc2ssIGludCBwb3NpdGlvbkxvY2F0
aW9uLCBpbnQgdGV4Q29vcmRMb2NhdGlvbik7CisgICAgYm9vbCBpc0RpcnR5KCkgY29uc3QgeyBy
ZXR1cm4gbV90aWxlciA/IG1fdGlsZXItPmhhc0RpcnR5VGlsZXMoKSA6IGZhbHNlOyB9CisKKyAg
ICB2b2lkIHJlbGVhc2VUZXh0dXJlUmVzb3VyY2VzKCk7CisKKyAgICAvLyBMYXllciB2aXNpYmls
aXR5IGlzIGRldGVybWluZWQgYnkgdGhlIExheWVyUmVuZGVyZXIgd2hlbiBkcmF3aW5nLgorICAg
IC8vIFNvIHdlIGRvbid0IGhhdmUgYW4gYWNjdXJhdGUgdmFsdWUgZm9yIHZpc2liaWxpdHkgdW50
aWwgaXQncyB0b28gbGF0ZSwKKyAgICAvLyBidXQgdGhlIGF0dHJpYnV0ZSBzdGlsbCBpcyB1c2Vm
dWwuCisgICAgYm9vbCBpc1Zpc2libGUoKSBjb25zdCB7IHJldHVybiBtX3Zpc2libGU7IH0KKyAg
ICB2b2lkIHNldFZpc2libGUoYm9vbCk7CisKKyAgICAvLyBUaGlzIHdpbGwgY2F1c2UgYSBjb21t
aXQgb2YgdGhlIHdob2xlIGxheWVyIHRyZWUgb24gdGhlIFdlYktpdCB0aHJlYWQsCisgICAgLy8g
c29tZXRpbWUgYWZ0ZXIgcmVuZGVyaW5nIGlzIGZpbmlzaGVkLiBVc2VkIHdoZW4gcmVuZGVyaW5n
IHJlc3VsdHMgaW4gYQorICAgIC8vIG5lZWQgZm9yIGNvbW1pdCwgZm9yIGV4YW1wbGUgd2hlbiBh
IGRpcnR5IGxheWVyIGJlY29tZXMgdmlzaWJsZS4KKyAgICB2b2lkIHNldE5lZWRzQ29tbWl0KCk7
CisKKyAgICAvLyBOb3JtYWxseSB5b3Ugd291bGQgc2NoZWR1bGUgYSBjb21taXQgZnJvbSB0aGUg
d2Via2l0IHRocmVhZCwgYnV0CisgICAgLy8gdGhpcyBhbGxvd3MgeW91IHRvIGRvIGl0IGZyb20g
dGhlIGNvbXBvc2l0aW5nIHRocmVhZC4KKyAgICB2b2lkIHNjaGVkdWxlQ29tbWl0KCk7CisKKyAg
ICBib29sIGhhc1J1bm5pbmdBbmltYXRpb25zKCkgY29uc3QgeyByZXR1cm4gIW1fcnVubmluZ0Fu
aW1hdGlvbnMuaXNFbXB0eSgpOyB9CisKKyAgICBib29sIGhhc1Zpc2libGVIb2xlUHVuY2hSZWN0
KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgTGF5ZXJDb21wb3NpdGluZ1RocmVhZChMYXllclR5
cGUsIFBhc3NSZWZQdHI8TGF5ZXJUaWxlcj4pOworCisgICAgZnJpZW5kIGNsYXNzIERlc3Ryb3lP
bkNvbXBvc2l0aW5nVGhyZWFkOworICAgIHZvaWQgZGVzdHJveU9uQ29tcG9zaXRpbmdUaHJlYWQo
KTsKKworICAgIHZvaWQgdXBkYXRlVGlsZUNvbnRlbnRzKGNvbnN0IEludFJlY3QmIHRpbGUpOwor
CisgICAgdm9pZCByZW1vdmVGcm9tU3VwZXJsYXllcigpOworCisgICAgc2l6ZV90IG51bVN1Ymxh
eWVycygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9zdWJsYXllcnMuc2l6ZSgpOwor
ICAgIH0KKworICAgIC8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzdWJsYXllciBvciAtMSBp
ZiBub3QgZm91bmQuCisgICAgaW50IGluZGV4T2ZTdWJsYXllcihjb25zdCBMYXllckNvbXBvc2l0
aW5nVGhyZWFkKik7CisKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHJl
bW92ZUZyb21TdXBlcmxheWVyLgorICAgIHZvaWQgcmVtb3ZlU3VibGF5ZXIoTGF5ZXJDb21wb3Np
dGluZ1RocmVhZCopOworCisgICAgdm9pZCB1cGRhdGVBbmltYXRpb24oY29uc3QgTGF5ZXJBbmlt
YXRpb24qLCBkb3VibGUgZWxhcHNlZFRpbWUpOworCisgICAgTGF5ZXJSZW5kZXJlciogbV9sYXll
clJlbmRlcmVyOworCisgICAgdHlwZWRlZiBWZWN0b3I8UmVmUHRyPExheWVyQ29tcG9zaXRpbmdU
aHJlYWQ+ID4gTGF5ZXJMaXN0OworICAgIExheWVyTGlzdCBtX3N1YmxheWVyczsKKyAgICBMYXll
ckNvbXBvc2l0aW5nVGhyZWFkKiBtX3N1cGVybGF5ZXI7CisKKyAgICAvLyBWZXJ0ZXggZGF0YSBm
b3IgdGhlIGJvdW5kcyBvZiB0aGlzIGxheWVyCisgICAgRmxvYXRRdWFkIG1fdHJhbnNmb3JtZWRC
b3VuZHM7CisgICAgLy8gVGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgdHJhbnNmb3JtZWQg
bGF5ZXIKKyAgICBGbG9hdFJlY3QgbV9kcmF3UmVjdDsKKworICAgIE93blB0cjxSZW5kZXJTdXJm
YWNlPiBtX3JlbmRlclN1cmZhY2U7CisKKyAgICBSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1RocmVh
ZD4gbV9tYXNrTGF5ZXI7CisgICAgUmVmUHRyPExheWVyQ29tcG9zaXRpbmdUaHJlYWQ+IG1fcmVw
bGljYUxheWVyOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIq
IG1fcGx1Z2luQnVmZmVyOworCisgICAgLy8gVGhlIGdsb2JhbCBwcm9wZXJ0eSB2YWx1ZXMsIGFm
dGVyIGNvbmNhdGVuYXRpb24gd2l0aCBwYXJlbnQgdmFsdWVzCisgICAgVHJhbnNmb3JtYXRpb25N
YXRyaXggbV9kcmF3VHJhbnNmb3JtOworICAgIGZsb2F0IG1fZHJhd09wYWNpdHk7CisKKyAgICBi
b29sIG1fdmlzaWJsZTsKKyAgICBib29sIG1fY29tbWl0U2NoZWR1bGVkOworCisgICAgUmVmUHRy
PExheWVyVGlsZXI+IG1fdGlsZXI7Cit9OworCit9CisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129659</attachid>
            <date>2012-03-01 01:08:56 -0800</date>
            <delta_ts>2012-03-26 08:03:07 -0700</delta_ts>
            <desc>patch v2</desc>
            <filename>bug-79873-20120301170851.patch</filename>
            <type>text/plain</type>
            <size>38784</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5MzAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNmJjMWIzZmZmMjZjZTY2
ZjM1YTA0YzgyNThiZThlMzZjMWQyYWM3OS4uZTU4NWVmMzU1N2ExNDZiYzM5MmYxMzQzNWMzODU5
ZDQ0MGRlMTBiYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDc0IEBACisyMDEyLTAzLTAxICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBMYXllckNvbXBvc2l0aW5nVGhyZWFkLntoLCBjcHB9CisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03OTg3MworCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5v
IG5ldyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5
ZXJDb21wb3NpdGluZ1RocmVhZC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpjcmVhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZCk6
CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjp+TGF5ZXJDb21wb3Np
dGluZ1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpk
ZXN0cm95T25Db21wb3NpdGluZ1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBv
c2l0aW5nVGhyZWFkOjpzZXRMYXllclJlbmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
Q29tcG9zaXRpbmdUaHJlYWQ6OmRlbGV0ZVRleHR1cmVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldERyYXdUcmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29y
ZTo6Z2V0VHJhbnNmb3JtZWRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRp
bmdUaHJlYWQ6OmdldFRyYW5zZm9ybWVkSG9sZVB1bmNoUmVjdCk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpkcmF3VGV4dHVyZXMpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6ZHJhd1N1cmZhY2UpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6ZHJhd01pc3NpbmdUZXh0dXJlcyk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpyZWxlYXNlVGV4dHVyZVJlc291cmNl
cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRQbHVnaW5W
aWV3KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldE1lZGlh
UGxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmNsZWFy
QW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpy
ZW1vdmVTdWJsYXllcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFk
OjppbmRleE9mU3VibGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZDo6cm9vdExheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJl
YWQ6OnJlbW92ZUZyb21TdXBlcmxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9z
aXRpbmdUaHJlYWQ6OnNldFN1YmxheWVycyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBv
c2l0aW5nVGhyZWFkOjp1cGRhdGVUZXh0dXJlQ29udGVudHNJZk5lZWRlZCk6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRWaXNpYmxlKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldE5lZWRzQ29tbWl0KToKKyAgICAgICAg
KFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNjaGVkdWxlQ29tbWl0KToKKyAgICAg
ICAgKFdlYkNvcmU6OnNvbHZlRXBzaWxvbik6CisgICAgICAgIChXZWJDb3JlOjpzb2x2ZUN1Ymlj
QmV6aWVyRnVuY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6c29sdmVTdGVwc0Z1bmN0aW9uKToK
KyAgICAgICAgKFdlYkNvcmU6OnRpbWluZ0Z1bmN0aW9uRm9yQW5pbWF0aW9uVmFsdWUpOgorICAg
ICAgICAoV2ViQ29yZTo6cHJvZ3Jlc3MpOgorICAgICAgICAoV2ViQ29yZTo6ZmV0Y2hJbnRlcnZh
bEVuZHBvaW50cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjp1
cGRhdGVBbmltYXRpb25zKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJl
YWQ6OnVwZGF0ZUFuaW1hdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5n
VGhyZWFkOjpoYXNWaXNpYmxlSG9sZVB1bmNoUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXll
ckNvbXBvc2l0aW5nVGhyZWFkOjpjcmVhdGVSZW5kZXJTdXJmYWNlKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyQ29tcG9zaXRpbmdUaHJlYWQuaDogQWRkZWQu
CisgICAgICAgIChHcmFwaGljcyk6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKExheWVy
Q29tcG9zaXRpbmdUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZDo6YmluZENvbnRlbnRzVGV4dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBv
c2l0aW5nVGhyZWFkOjpnZXRTdWJsYXllcnMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21w
b3NpdGluZ1RocmVhZDo6c2V0U3VwZXJsYXllcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNv
bXBvc2l0aW5nVGhyZWFkOjpzdXBlcmxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29t
cG9zaXRpbmdUaHJlYWQ6OmRyYXdUcmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJD
b21wb3NpdGluZ1RocmVhZDo6c2V0RHJhd09wYWNpdHkpOgorICAgICAgICAoV2ViQ29yZTo6TGF5
ZXJDb21wb3NpdGluZ1RocmVhZDo6ZHJhd09wYWNpdHkpOgorICAgICAgICAoV2ViQ29yZTo6TGF5
ZXJDb21wb3NpdGluZ1RocmVhZDo6cmVuZGVyU3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjpM
YXllckNvbXBvc2l0aW5nVGhyZWFkOjpjbGVhclJlbmRlclN1cmZhY2UpOgorICAgICAgICAoV2Vi
Q29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0TWFza0xheWVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6Om1hc2tMYXllcik6CisgICAgICAgIChXZWJD
b3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRSZXBsaWNhTGF5ZXIpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6cmVwbGljYUxheWVyKToKKyAgICAgICAg
KFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmdldERyYXdSZWN0KToKKyAgICAgICAg
KFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmdldFRyYW5zZm9ybWVkQm91bmRzKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6Omhhc01pc3NpbmdUZXh0
dXJlcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjppc0RpcnR5
KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmlzVmlzaWJsZSk6
CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpoYXNSdW5uaW5nQW5p
bWF0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpudW1T
dWJsYXllcnMpOgorCiAyMDEyLTAyLTI5ICBKYXNvbiBMaXUgIDxqYXNvbi5saXVAdG9yY2htb2Jp
bGUuY29tLmNuPgogCiAgICAgICAgIFtCbGFja0JlcnJ5XU1ha2UgYWJvdXQ6Y2FjaGUgZmVhdHVy
ZSBhdmFpbGFibGUgaW4gcmVsZWFzZSB2ZXJzaW9uLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllckNvbXBvc2l0aW5nVGhyZWFkLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJDb21w
b3NpdGluZ1RocmVhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZTYwNjNlOWIxM2JjZTA1YWE0YTRjMDY2ZDkx
YjExYTA1NmNiZWNmNAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5ZXJDb21wb3NpdGluZ1RocmVhZC5jcHAKQEAgLTAsMCAr
MSw3MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2gg
SW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwNywgMjAwOCwgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1
dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAi
TGF5ZXJDb21wb3NpdGluZ1RocmVhZC5oIgorCisjaW5jbHVkZSAiSFRNTENhbnZhc0VsZW1lbnQu
aCIKKyNpbmNsdWRlICJMYXllck1lc3NhZ2UuaCIKKyNpbmNsdWRlICJMYXllclJlbmRlcmVyLmgi
CisjaW5jbHVkZSAiTGF5ZXJXZWJLaXRUaHJlYWQuaCIKKyNpZiBFTkFCTEUoVklERU8pCisjaW5j
bHVkZSAiTWVkaWFQbGF5ZXIuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXllclByaXZhdGVCbGFja0Jl
cnJ5LmgiCisjZW5kaWYKKyNpbmNsdWRlICJQbHVnaW5WaWV3LmgiCisjaW5jbHVkZSAiVGV4dHVy
ZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQuaCIKKyNpbmNsdWRlICJVbml0QmV6aWVyLmgiCisKKyNp
bmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HcmFwaGljcy5oPgorI2luY2x1ZGUgPEJsYWNrQmVy
cnlQbGF0Zm9ybUxvZy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx3dGYvQXNz
ZXJ0aW9ucy5oPgorCisjZGVmaW5lIERFQlVHX1ZJREVPX0NMSVBQSU5HIDAKKwordXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzUmVmUHRyPExheWVyQ29t
cG9zaXRpbmdUaHJlYWQ+IExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmNyZWF0ZShMYXllclR5cGUg
dHlwZSwgUGFzc1JlZlB0cjxMYXllclRpbGVyPiB0aWxlcikKK3sKKyAgICByZXR1cm4gYWRvcHRS
ZWYobmV3IExheWVyQ29tcG9zaXRpbmdUaHJlYWQodHlwZSwgdGlsZXIpKTsKK30KKworTGF5ZXJD
b21wb3NpdGluZ1RocmVhZDo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZChMYXllclR5cGUgdHlwZSwg
UGFzc1JlZlB0cjxMYXllclRpbGVyPiB0aWxlcikKKyAgICA6IExheWVyRGF0YSh0eXBlKQorICAg
ICwgbV9sYXllclJlbmRlcmVyKDApCisgICAgLCBtX3N1cGVybGF5ZXIoMCkKKyAgICAsIG1fcGx1
Z2luQnVmZmVyKDApCisgICAgLCBtX2RyYXdPcGFjaXR5KDApCisgICAgLCBtX3Zpc2libGUoZmFs
c2UpCisgICAgLCBtX2NvbW1pdFNjaGVkdWxlZChmYWxzZSkKKyAgICAsIG1fdGlsZXIodGlsZXIp
Cit7Cit9CisKK0xheWVyQ29tcG9zaXRpbmdUaHJlYWQ6On5MYXllckNvbXBvc2l0aW5nVGhyZWFk
KCkKK3sKKyAgICAvLyBVbmZvcnR1bmF0ZWx5LCBUaHJlYWRTYWZlU2hhcmVkPFQ+IGlzIGhhcmR3
aXJlZCB0byBjYWxsIFQ6On5UKCkuCisgICAgLy8gVG8gc3dpdGNoIHRocmVhZHMgaW4gY2FzZSB0
aGUgbGFzdCByZWZlcmVuY2UgaXMgcmVsZWFzZWQgb24gdGhlCisgICAgLy8gV2ViS2l0IHRocmVh
ZCwgd2Ugc2VuZCBhIHN5bmMgbWVzc2FnZSB0byB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLgorICAg
IGRlc3Ryb3lPbkNvbXBvc2l0aW5nVGhyZWFkKCk7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGlu
Z1RocmVhZDo6ZGVzdHJveU9uQ29tcG9zaXRpbmdUaHJlYWQoKQoreworICAgIGlmICghaXNDb21w
b3NpdGluZ1RocmVhZCgpKSB7CisgICAgICAgIGRpc3BhdGNoU3luY0NvbXBvc2l0aW5nTWVzc2Fn
ZShCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAg
ICAgICAmTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6ZGVzdHJveU9uQ29tcG9zaXRpbmdUaHJlYWQs
CisgICAgICAgICAgICB0aGlzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX3Rp
bGVyLT5sYXllckNvbXBvc2l0aW5nVGhyZWFkRGVzdHJveWVkKCk7CisKKyAgICBBU1NFUlQoIXN1
cGVybGF5ZXIoKSk7CisKKyAgICAvLyBSZW1vdmUgdGhlIHN1cGVybGF5ZXIgcmVmZXJlbmNlIGZy
b20gYWxsIHN1YmxheWVycy4KKyAgICB3aGlsZSAobV9zdWJsYXllcnMuc2l6ZSgpKQorICAgICAg
ICBtX3N1YmxheWVyc1swXS0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKworICAgIC8vIERlbGV0
ZSBhbGwgYWxsb2NhdGVkIHRleHR1cmVzCisgICAgZGVsZXRlVGV4dHVyZXMoKTsKKworICAgIC8v
IFdlIGp1c3QgZGVsZXRlZCBhbGwgb3VyIHRleHR1cmVzLCBubyBuZWVkIGZvciB0aGUKKyAgICAv
LyBsYXllciByZW5kZXJlciB0byB0cmFjayB1cyBhbnltb3JlCisgICAgaWYgKG1fbGF5ZXJSZW5k
ZXJlcikKKyAgICAgICAgbV9sYXllclJlbmRlcmVyLT5yZW1vdmVMYXllcih0aGlzKTsKK30KKwor
dm9pZCBMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRMYXllclJlbmRlcmVyKExheWVyUmVuZGVy
ZXIqIHJlbmRlcmVyKQoreworICAgIC8vIEl0J3Mgbm90IGV4cGVjdGVkIHRoYXQgbGF5ZXJzIHdp
bGwgZXZlciBzd2l0Y2ggcmVuZGVyZXJzLgorICAgIEFTU0VSVCghcmVuZGVyZXIgfHwgIW1fbGF5
ZXJSZW5kZXJlciB8fCByZW5kZXJlciA9PSBtX2xheWVyUmVuZGVyZXIpOworCisgICAgbV9sYXll
clJlbmRlcmVyID0gcmVuZGVyZXI7CisgICAgaWYgKG1fbGF5ZXJSZW5kZXJlcikKKyAgICAgICAg
bV9sYXllclJlbmRlcmVyLT5hZGRMYXllcih0aGlzKTsKK30KKwordm9pZCBMYXllckNvbXBvc2l0
aW5nVGhyZWFkOjpkZWxldGVUZXh0dXJlcygpCit7CisgICAgcmVsZWFzZVRleHR1cmVSZXNvdXJj
ZXMoKTsKKworICAgIG1fdGlsZXItPmRlbGV0ZVRleHR1cmVzKCk7Cit9CisKK3ZvaWQgTGF5ZXJD
b21wb3NpdGluZ1RocmVhZDo6c2V0RHJhd1RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgbWF0cml4KQoreworICAgIG1fZHJhd1RyYW5zZm9ybSA9IG1hdHJpeDsKKworICAgIGZs
b2F0IGJ4ID0gbV9ib3VuZHMud2lkdGgoKSAvIDIuMDsKKyAgICBmbG9hdCBieSA9IG1fYm91bmRz
LmhlaWdodCgpIC8gMi4wOworICAgIG1fdHJhbnNmb3JtZWRCb3VuZHMuc2V0UDEobWF0cml4Lm1h
cFBvaW50KEZsb2F0UG9pbnQoLWJ4LCAtYnkpKSk7CisgICAgbV90cmFuc2Zvcm1lZEJvdW5kcy5z
ZXRQMihtYXRyaXgubWFwUG9pbnQoRmxvYXRQb2ludCgtYngsIGJ5KSkpOworICAgIG1fdHJhbnNm
b3JtZWRCb3VuZHMuc2V0UDMobWF0cml4Lm1hcFBvaW50KEZsb2F0UG9pbnQoYngsIGJ5KSkpOwor
ICAgIG1fdHJhbnNmb3JtZWRCb3VuZHMuc2V0UDQobWF0cml4Lm1hcFBvaW50KEZsb2F0UG9pbnQo
YngsIC1ieSkpKTsKKworICAgIG1fZHJhd1JlY3QgPSBtX3RyYW5zZm9ybWVkQm91bmRzLmJvdW5k
aW5nQm94KCk7Cit9CisKK3N0YXRpYyBGbG9hdFF1YWQgZ2V0VHJhbnNmb3JtZWRSZWN0KGNvbnN0
IEludFNpemUmIGJvdW5kcywgY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmIGRyYXdUcmFuc2Zvcm0pCit7CisgICAgZmxvYXQgeCA9IC1ib3VuZHMud2lkdGgo
KSAvIDIuMCArIHJlY3QueCgpOworICAgIGZsb2F0IHkgPSAtYm91bmRzLmhlaWdodCgpIC8gMi4w
ICsgcmVjdC55KCk7CisgICAgZmxvYXQgdyA9IHJlY3Qud2lkdGgoKTsKKyAgICBmbG9hdCBoID0g
cmVjdC5oZWlnaHQoKTsKKyAgICBGbG9hdFF1YWQgcmVzdWx0OworICAgIHJlc3VsdC5zZXRQMShk
cmF3VHJhbnNmb3JtLm1hcFBvaW50KEZsb2F0UG9pbnQoeCwgeSkpKTsKKyAgICByZXN1bHQuc2V0
UDIoZHJhd1RyYW5zZm9ybS5tYXBQb2ludChGbG9hdFBvaW50KHgsIHkraCkpKTsKKyAgICByZXN1
bHQuc2V0UDMoZHJhd1RyYW5zZm9ybS5tYXBQb2ludChGbG9hdFBvaW50KHgrdywgeStoKSkpOwor
ICAgIHJlc3VsdC5zZXRQNChkcmF3VHJhbnNmb3JtLm1hcFBvaW50KEZsb2F0UG9pbnQoeCt3LCB5
KSkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gRklYTUU6IHRoZSBmb2xsb3dpbmcg
bGluZSBkaXNhYmxlcyBjbGlwcGluZyBhIHZpZGVvIGluIGFuIGlmcmFtZSBpLmUuIHRoZSBmaXgg
YXNzb2NpYXRlZCB3aXRoIFBSIDk5NjM4LgorLy8gU29tZSByZXZpc2VkIHRlc3QgY2FzZSAoZS5n
LiB2aWRlby1pZnJhbWUuaHRtbCkgc2hvdyB0aGF0IHRoZSBvcmlnaW5hbCBmaXggd29ya3MgY29y
cmVjdGx5IHdoZW4gc2Nyb2xsaW5nCisvLyB0aGUgY29udGVudHMgb2YgdGhlIGZyYW1lLCBidXQg
ZmFpbHMgdG8gY2xpcCBjb3JyZWN0bHkgaWYgdGhlIHBhZ2UgKG1haW4gZnJhbWUpIGlzIHNjcm9s
bGVkLgorc3RhdGljIGJvb2wgZW5hYmxlVmlkZW9DbGlwcGluZyA9IGZhbHNlOworCitGbG9hdFF1
YWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6Z2V0VHJhbnNmb3JtZWRIb2xlUHVuY2hSZWN0KCkg
Y29uc3QKK3sKKyAgICBpZiAoIW1lZGlhUGxheWVyKCkgfHwgIWVuYWJsZVZpZGVvQ2xpcHBpbmcp
IHsKKyAgICAgICAgLy8gbV9ob2xlUHVuY2hDbGlwUmVjdCBpcyB2YWxpZCBvbmx5IHdoZW4gdGhl
cmUncyBhIG1lZGlhIHBsYXllci4KKyAgICAgICAgcmV0dXJuIGdldFRyYW5zZm9ybWVkUmVjdCht
X2JvdW5kcywgbV9ob2xlUHVuY2hSZWN0LCBtX2RyYXdUcmFuc2Zvcm0pOworICAgIH0KKworICAg
IC8vIFRoZSBob2xlIHB1bmNoIHJlY3RhbmdsZSBtYXkgbmVlZCB0byBiZSBjbGlwcGVkLAorICAg
IC8vIGUuZy4gaWYgdGhlIDx2aWRlbz4gaXMgb24gYSBsYXllciB0aGF0J3MgaW5jbHVkZWQgYW5k
IGNsaXBwZWQgYnkgYW4gPGlmcmFtZT4uCisKKyAgICAvLyBJbiBvcmRlciB0byBjbGlwIHdlIG5l
ZWQgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoaXMgbGF5ZXIsIHdoaWNo
CisgICAgLy8gaXMgZW5jb2RlZCBpbiB0aGUgbV9kcmF3VHJhbnNmb3JtIHZhbHVlLCB3aGljaCB3
YXMgdXNlZCB0byBpbml0aWFsaXplIG1fZHJhd1JlY3QuCisgICAgSW50UmVjdCBkcmF3UmVjdCA9
IG1fbGF5ZXJSZW5kZXJlci0+dG9XZWJLaXREb2N1bWVudENvb3JkaW5hdGVzKG1fZHJhd1JlY3Qp
OworCisgICAgLy8gQXNzZXJ0IHRoYXQgaW4gdGhpcyBjYXNlLCB3aGVyZSB0aGUgaG9sZSBwdW5j
aCByZWN0YW5nbGUgZXF1YWxzIHRoZSBzaXplIG9mIHRoZSBsYXllciwKKyAgICAvLyB0aGUgZHJh
d1JlY3QgaGFzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGhvbGUgcHVuY2guCisgICAgLy8gQVNTRVJU
KGRyYXdSZWN0LnNpemUoKSA9PSBtX2hvbGVQdW5jaFJlY3Quc2l6ZSgpKTsKKyAgICAvLyBEb24n
dCBhc3NlcnQgaXQgcHJvZ3JhbXRpY2FsbHkgdGhvdWdoIGJlY2F1c2UgdGhlcmUgbWF5IGJlIG9m
Zi1ieS1vbmUgZXJyb3IgZHVlIHRvIHJvdW5kaW5nIHdoZW4gdGhlcmUncyB6b29taW5nLgorCisg
ICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBkcmF3UmVjdCBhbmQgbV9ob2xlUHVuY2hSZWN0
IGlzIHRoYXQgZHJhd1JlY3QgaGFzIGFuIGFjY3VyYXRlIHBvc2l0aW9uCisgICAgLy8gaW4gV2Vi
S2l0IGRvY3VtZW50IGNvb3JkaW5hdGVzLCB3aGVyZWFzIHRoZSBtX2hvbGVQdW5jaFJlY3QgbG9j
YXRpb24gaXMgKDAsMCkgaS5lLiBpdCdzIHJlbGF0aXZlIHRvIHRoaXMgbGF5ZXIuCisKKyAgICAv
LyBDbGlwIHRoZSBkcmF3UmVjdC4KKyAgICAvLyBCb3RoIGRyYXdSZWN0IGFuZCBtX2hvbGVQdW5j
aENsaXBSZWN0IGFscmVhZHkgaGF2ZSBjb3JyZWN0IGxvY2F0aW9ucywgaW4gV2ViS2l0IGRvY3Vt
ZW50IGNvb3JkaW5hdGVzLgorICAgIEludFBvaW50IGxvY2F0aW9uID0gZHJhd1JlY3QubG9jYXRp
b24oKTsKKyAgICBkcmF3UmVjdC5pbnRlcnNlY3QobV9ob2xlUHVuY2hDbGlwUmVjdCk7CisKKyAg
ICAvLyBTaGlmdCB0aGUgY2xpcHBlZCBkcmF3UmVjdCB0byBoYXZlIHRoZSBzYW1lIGtpbmQgb2Yg
bG9jYXRlZC1hdC16ZXJvIHBvc2l0aW9uIGFzIHRoZSBvcmlnaW5hbCBob2xlUHVuY2hSZWN0Lgor
ICAgIGRyYXdSZWN0Lm1vdmUoLWxvY2F0aW9uLngoKSwgLWxvY2F0aW9uLnkoKSk7CisKKyNpZiBE
RUJVR19WSURFT19DTElQUElORworICAgICBJbnRSZWN0IGRyYXdSZWN0SW5XZWJLaXREb2N1bWVu
dENvb3JkaW5hdGlvbiA9IG1fbGF5ZXJSZW5kZXJlci0+dG9XZWJLaXREb2N1bWVudENvb3JkaW5h
dGVzKG1fZHJhd1JlY3QpOworICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpnZXRU
cmFuc2Zvcm1lZEhvbGVQdW5jaFJlY3QoKSAtIGRyYXdSZWN0PSh4PSVkLHk9JWQsd2lkdGg9JWQs
aGVpZ2h0PSVkKSBjbGlwUmVjdD0oeD0lZCx5PSVkLHdpZHRoPSVkLGhlaWdodD0lZCkgY2xpcHBl
ZFJlY3Q9KHg9JWQseT0lZCx3aWR0aD0lZCxoZWlnaHQ9JWQpLiIsCisgICAgICAgICBkcmF3UmVj
dEluV2ViS2l0RG9jdW1lbnRDb29yZGluYXRpb24ueCgpLCBkcmF3UmVjdEluV2ViS2l0RG9jdW1l
bnRDb29yZGluYXRpb24ueSgpLCBkcmF3UmVjdEluV2ViS2l0RG9jdW1lbnRDb29yZGluYXRpb24u
d2lkdGgoKSwgZHJhd1JlY3RJbldlYktpdERvY3VtZW50Q29vcmRpbmF0aW9uLmhlaWdodCgpLAor
ICAgICAgICAgbV9ob2xlUHVuY2hDbGlwUmVjdC54KCksIG1faG9sZVB1bmNoQ2xpcFJlY3QueSgp
LCBtX2hvbGVQdW5jaENsaXBSZWN0LndpZHRoKCksIG1faG9sZVB1bmNoQ2xpcFJlY3QuaGVpZ2h0
KCksCisgICAgICAgICBkcmF3UmVjdC54KCksIGRyYXdSZWN0LnkoKSwgZHJhd1JlY3Qud2lkdGgo
KSwgZHJhd1JlY3QuaGVpZ2h0KCkpOworI2VuZGlmCisKKyAgICByZXR1cm4gZ2V0VHJhbnNmb3Jt
ZWRSZWN0KG1fYm91bmRzLCBkcmF3UmVjdCwgbV9kcmF3VHJhbnNmb3JtKTsKK30KKwordm9pZCBM
YXllckNvbXBvc2l0aW5nVGhyZWFkOjpkcmF3VGV4dHVyZXMoaW50IHBvc2l0aW9uTG9jYXRpb24s
IGludCB0ZXhDb29yZExvY2F0aW9uLCBjb25zdCBGbG9hdFJlY3QmIHZpc2libGVSZWN0KQorewor
ICAgIGZsb2F0IHRleGNvb3Jkc1s0ICogMl0gPSB7IDAsIDAsICAwLCAxLCAgMSwgMSwgIDEsIDAg
fTsKKworICAgIGlmIChtX3BsdWdpblZpZXcpIHsKKyAgICAgICAgaWYgKG1faXNWaXNpYmxlKSB7
CisgICAgICAgICAgICAvLyBUaGUgbGF5ZXIgY29udGFpbnMgRmxhc2gsIHZpZGVvLCBvciBvdGhl
ciBwbHVnaW4gY29udGVudHMuCisgICAgICAgICAgICBtX3BsdWdpbkJ1ZmZlciA9IG1fcGx1Z2lu
Vmlldy0+bG9ja0Zyb250QnVmZmVyRm9yUmVhZCgpOworCisgICAgICAgICAgICBpZiAoIW1fcGx1
Z2luQnVmZmVyKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaWYgKCFC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmxvY2tBbmRCaW5kQnVmZmVyR0xUZXh0dXJl
KG1fcGx1Z2luQnVmZmVyLCBHTF9URVhUVVJFXzJEKSkgeworICAgICAgICAgICAgICAgIG1fcGx1
Z2luVmlldy0+dW5sb2NrRnJvbnRCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+YWRkTGF5ZXJUb1Jl
bGVhc2VUZXh0dXJlUmVzb3VyY2VzTGlzdCh0aGlzKTsKKworICAgICAgICAgICAgZ2xWZXJ0ZXhB
dHRyaWJQb2ludGVyKHBvc2l0aW9uTG9jYXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwg
Jm1fdHJhbnNmb3JtZWRCb3VuZHMpOworICAgICAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVy
KHRleENvb3JkTG9jYXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgdGV4Y29vcmRzKTsK
KyAgICAgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOworICAgICAg
ICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlmICht
X21lZGlhUGxheWVyKSB7CisgICAgICAgIGlmIChtX2lzVmlzaWJsZSkgeworICAgICAgICAgICAg
Ly8gV2UgbmVlZCB0byBzcGVjaWZ5IHRoZSBtZWRpYSBwbGF5ZXIgbG9jYXRpb24gaW4gY29udGVu
dHMgY29vcmRpbmF0ZXMuIFRoZSAndmlzaWJsZVJlY3QnCisgICAgICAgICAgICAvLyBzcGVjaWZp
ZXMgdGhlIGNvbnRlbnQgcmVnaW9uIGNvdmVyZWQgYnkgb3VyIHZpZXdwb3J0LiBTbyB3ZSB0cmFu
c2Zvcm0gZnJvbSBvdXIKKyAgICAgICAgICAgIC8vIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5h
dGVzIFstMSwgMV0gdG8gdGhlICd2aXNpYmxlUmVjdCcuCisgICAgICAgICAgICBmbG9hdCB2cncy
ID0gdmlzaWJsZVJlY3Qud2lkdGgoKSAvIDIuMDsKKyAgICAgICAgICAgIGZsb2F0IHZyaDIgPSB2
aXNpYmxlUmVjdC5oZWlnaHQoKSAvIDIuMDsKKyAgICAgICAgICAgIGZsb2F0IHggPSBtX3RyYW5z
Zm9ybWVkQm91bmRzLnAxKCkueCgpICogdnJ3MiArIHZydzIgKyB2aXNpYmxlUmVjdC54KCk7Cisg
ICAgICAgICAgICBmbG9hdCB5ID0gLW1fdHJhbnNmb3JtZWRCb3VuZHMucDEoKS55KCkgKiB2cmgy
ICsgdnJoMiArIHZpc2libGVSZWN0LnkoKTsKKyAgICAgICAgICAgIG1fbWVkaWFQbGF5ZXItPnBh
aW50KDAsIEludFJlY3QoKGludCkoeCswLjUpLCAoaW50KSh5KzAuNSksIG1fYm91bmRzLndpZHRo
KCksIG1fYm91bmRzLmhlaWdodCgpKSk7CisgICAgICAgICAgICBNZWRpYVBsYXllclByaXZhdGUq
IG1wcCA9IHN0YXRpY19jYXN0PE1lZGlhUGxheWVyUHJpdmF0ZSo+KG1fbWVkaWFQbGF5ZXItPnBs
YXRmb3JtTWVkaWEoKS5tZWRpYS5xbnhNZWRpYVBsYXllcik7CisgICAgICAgICAgICBtcHAtPmRy
YXdCdWZmZXJpbmdBbmltYXRpb24obV9kcmF3VHJhbnNmb3JtLCBwb3NpdGlvbkxvY2F0aW9uLCB0
ZXhDb29yZExvY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorI2Vu
ZGlmCisjaWYgRU5BQkxFKFdFQkdMKQorICAgIGlmIChsYXllclR5cGUoKSA9PSBMYXllckRhdGE6
OldlYkdMTGF5ZXIpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKG1fZnJvbnRCdWZmZXJM
b2NrKTsKKyAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHBvc2l0aW9uTG9jYXRpb24sIDIs
IEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgJm1fdHJhbnNmb3JtZWRCb3VuZHMpOworICAgICAgICBm
bG9hdCBjYW52YXNXaWR0aFJhdGlvID0gMS4wZjsKKyAgICAgICAgZmxvYXQgY2FudmFzSGVpZ2h0
UmF0aW8gPSAxLjBmOworICAgICAgICBmbG9hdCB1cHNpZGVEb3duWzQgKiAyXSA9IHsgMCwgMSwg
IDAsIDEgLSBjYW52YXNIZWlnaHRSYXRpbywgIGNhbnZhc1dpZHRoUmF0aW8sIDEgLSBjYW52YXNI
ZWlnaHRSYXRpbywgIGNhbnZhc1dpZHRoUmF0aW8sIDEgfTsKKyAgICAgICAgLy8gRmxpcCB0aGUg
dGV4dHVyZSBZIGF4aXMgYmVjYXVzZSBPcGVuR0wgYW5kIFNraWEgaGF2ZSBkaWZmZXJlbnQgb3Jp
Z2lucworICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIodGV4Q29vcmRMb2NhdGlvbiwgMiwg
R0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCB1cHNpZGVEb3duKTsKKyAgICAgICAgZ2xCaW5kVGV4dHVy
ZShHTF9URVhUVVJFXzJELCBtX3RleElEKTsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFO
R0xFX0ZBTiwgMCwgNCk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG1fZnJvbnRCdWZm
ZXJMb2NrKTsKKyAgICAgICAgLy8gRklYTUU6IElmIHRoZSBjYW52YXMvdGV4dHVyZSBpcyBsYXJn
ZXIgdGhhbiAyMDQ4eDIwNDgsIHRoZW4gd2UnbGwgZGllIGhlcmUKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKyNlbmRpZgorICAgIGlmIChtX3RleElEKSB7CisgICAgICAgIG1fbGF5ZXJSZW5kZXJl
ci0+YWRkTGF5ZXJUb1JlbGVhc2VUZXh0dXJlUmVzb3VyY2VzTGlzdCh0aGlzKTsKKyAgICAgICAg
cHRocmVhZF9tdXRleF9sb2NrKG1fZnJvbnRCdWZmZXJMb2NrKTsKKworICAgICAgICBnbEJpbmRU
ZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1fdGV4SUQpOworICAgICAgICBnbFZlcnRleEF0dHJpYlBv
aW50ZXIocG9zaXRpb25Mb2NhdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCAmbV90cmFu
c2Zvcm1lZEJvdW5kcyk7CisgICAgICAgIGZsb2F0IGNhbnZhc1dpZHRoUmF0aW8gPSAoZmxvYXQp
bV9jYW52YXMtPndpZHRoKCkgLyBtX3RleFdpZHRoOworICAgICAgICBmbG9hdCBjYW52YXNIZWln
aHRSYXRpbyA9IChmbG9hdCltX2NhbnZhcy0+aGVpZ2h0KCkgLyBtX3RleEhlaWdodDsKKyAgICAg
ICAgZmxvYXQgdXBzaWRlRG93bls0ICogMl0gPSB7IDAsIDEsICAwLCAxIC0gY2FudmFzSGVpZ2h0
UmF0aW8sICBjYW52YXNXaWR0aFJhdGlvLCAxIC0gY2FudmFzSGVpZ2h0UmF0aW8sICBjYW52YXNX
aWR0aFJhdGlvLCAxIH07CisgICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZExv
Y2F0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsIHVwc2lkZURvd24pOworICAgICAgICBn
bERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIG1fdGlsZXItPmRyYXdUZXh0dXJlcyh0aGlzLCBwb3NpdGlvbkxvY2F0aW9uLCB0
ZXhDb29yZExvY2F0aW9uKTsKK30KKwordm9pZCBMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpkcmF3
U3VyZmFjZShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgZHJhd1RyYW5zZm9ybSwgTGF5ZXJD
b21wb3NpdGluZ1RocmVhZCogbWFzaywgaW50IHBvc2l0aW9uTG9jYXRpb24sIGludCB0ZXhDb29y
ZExvY2F0aW9uKQoreworICAgIGlmIChtX2xheWVyUmVuZGVyZXItPmxheWVyQWxyZWFkeU9uU3Vy
ZmFjZSh0aGlzKSkgeworICAgICAgICB1bnNpZ25lZCB0ZXhJRCA9IHJlbmRlclN1cmZhY2UoKS0+
dGV4dHVyZSgpLT50ZXh0dXJlSWQoKTsKKyAgICAgICAgaWYgKCF0ZXhJRCkgeworICAgICAgICAg
ICAgLy8gRklYTUU6IGlzIHRoaXMgZ29pbmcgdG8gaGFwcGVuPworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisgICAgICAgIHRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCktPnRl
eHR1cmVBY2Nlc3NlZChyZW5kZXJTdXJmYWNlKCktPnRleHR1cmUoKSk7CisgICAgICAgIGdsQmlu
ZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4SUQpOworCisgICAgICAgIGlmIChtYXNrKSB7Cisg
ICAgICAgICAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTEpOworICAgICAgICAgICAgbWFz
ay0+YmluZENvbnRlbnRzVGV4dHVyZSgpOworICAgICAgICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdM
X1RFWFRVUkUwKTsKKyAgICAgICAgfQorCisgICAgICAgIEZsb2F0UXVhZCBzdXJmYWNlUXVhZCA9
IGdldFRyYW5zZm9ybWVkUmVjdChtX2JvdW5kcywgSW50UmVjdChJbnRQb2ludDo6emVybygpLCBt
X2JvdW5kcyksIGRyYXdUcmFuc2Zvcm0pOworICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIo
cG9zaXRpb25Mb2NhdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCAmc3VyZmFjZVF1YWQp
OworCisgICAgICAgIGZsb2F0IHRleGNvb3Jkc1s0ICogMl0gPSB7IDAsIDAsICAwLCAxLCAgMSwg
MSwgIDEsIDAgfTsKKyAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3JkTG9jYXRp
b24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgdGV4Y29vcmRzKTsKKyAgICAgICAgZ2xEcmF3
QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7CisgICAgfQorfQorCit2b2lkIExheWVyQ29t
cG9zaXRpbmdUaHJlYWQ6OmRyYXdNaXNzaW5nVGV4dHVyZXMoaW50IHBvc2l0aW9uTG9jYXRpb24s
IGludCB0ZXhDb29yZExvY2F0aW9uLCBjb25zdCBGbG9hdFJlY3QmIHZpc2libGVSZWN0KQorewor
ICAgIGlmIChtX3BsdWdpblZpZXcgfHwgbV90ZXhJRCkKKyAgICAgICAgcmV0dXJuOworCisjaWYg
RU5BQkxFKFZJREVPKQorICAgIGlmIChtX21lZGlhUGxheWVyKQorICAgICAgICByZXR1cm47Cisj
ZW5kaWYKKworICAgIG1fdGlsZXItPmRyYXdNaXNzaW5nVGV4dHVyZXModGhpcywgcG9zaXRpb25M
b2NhdGlvbiwgdGV4Q29vcmRMb2NhdGlvbik7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZDo6cmVsZWFzZVRleHR1cmVSZXNvdXJjZXMoKQoreworICAgIGlmIChtX3BsdWdpblZpZXcg
JiYgbV9wbHVnaW5CdWZmZXIpIHsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpyZWxlYXNlQnVmZmVyR0xUZXh0dXJlKG1fcGx1Z2luQnVmZmVyKTsKKyAgICAgICAgbV9w
bHVnaW5CdWZmZXIgPSAwOworICAgICAgICBtX3BsdWdpblZpZXctPnVubG9ja0Zyb250QnVmZmVy
KCk7CisgICAgfQorICAgIGlmIChtX3RleElEICYmIG1fZnJvbnRCdWZmZXJMb2NrKQorICAgICAg
ICBwdGhyZWFkX211dGV4X3VubG9jayhtX2Zyb250QnVmZmVyTG9jayk7Cit9CisKK3ZvaWQgTGF5
ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0UGx1Z2luVmlldyhQbHVnaW5WaWV3KiBwbHVnaW5WaWV3
KQoreworICAgIGlmICghaXNDb21wb3NpdGluZ1RocmVhZCgpKSB7CisgICAgICAgIGRpc3BhdGNo
U3luY0NvbXBvc2l0aW5nTWVzc2FnZShCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9k
Q2FsbE1lc3NhZ2UoCisgICAgICAgICAgICAmTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0UGx1
Z2luVmlldywKKyAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICBwbHVnaW5WaWV3KSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX3BsdWdpblZpZXcgPSBwbHVnaW5WaWV3Owor
fQorCisjaWYgRU5BQkxFKFZJREVPKQordm9pZCBMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRN
ZWRpYVBsYXllcihNZWRpYVBsYXllciogbWVkaWFQbGF5ZXIpCit7CisgICAgaWYgKCFpc0NvbXBv
c2l0aW5nVGhyZWFkKCkpIHsKKyAgICAgICAgZGlzcGF0Y2hTeW5jQ29tcG9zaXRpbmdNZXNzYWdl
KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgKKyAgICAgICAg
ICAgICZMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRNZWRpYVBsYXllciwKKyAgICAgICAgICAg
IHRoaXMsCisgICAgICAgICAgICBtZWRpYVBsYXllcikpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgbV9tZWRpYVBsYXllciA9IG1lZGlhUGxheWVyOworfQorI2VuZGlmCisKK3ZvaWQg
TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6Y2xlYXJBbmltYXRpb25zKCkKK3sKKyAgICAvLyBBbmlt
YXRpb25zIGRvbid0IHVzZSB0aHJlYWQgc2FmZSByZWZjb3VudGluZywgYW5kIG11c3Qgb25seSBi
ZQorICAgIC8vIHRvdWNoZWQgd2hlbiB0aGUgdHdvIHRocmVhZHMgYXJlIGluIHN5bmMuCisgICAg
aWYgKCFpc0NvbXBvc2l0aW5nVGhyZWFkKCkpIHsKKyAgICAgICAgZGlzcGF0Y2hTeW5jQ29tcG9z
aXRpbmdNZXNzYWdlKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2Fn
ZSgKKyAgICAgICAgICAgICZMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpjbGVhckFuaW1hdGlvbnMs
CisgICAgICAgICAgICB0aGlzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX3J1
bm5pbmdBbmltYXRpb25zLmNsZWFyKCk7CisgICAgbV9zdXNwZW5kZWRBbmltYXRpb25zLmNsZWFy
KCk7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6cmVtb3ZlU3VibGF5ZXIoTGF5
ZXJDb21wb3NpdGluZ1RocmVhZCogc3VibGF5ZXIpCit7CisgICAgQVNTRVJUKGlzQ29tcG9zaXRp
bmdUaHJlYWQoKSk7CisKKyAgICBpbnQgZm91bmRJbmRleCA9IGluZGV4T2ZTdWJsYXllcihzdWJs
YXllcik7CisgICAgaWYgKGZvdW5kSW5kZXggPT0gLTEpCisgICAgICAgIHJldHVybjsKKworICAg
IHN1YmxheWVyLT5zZXRTdXBlcmxheWVyKDApOworICAgIG1fc3VibGF5ZXJzLnJlbW92ZShmb3Vu
ZEluZGV4KTsKK30KKworaW50IExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmluZGV4T2ZTdWJsYXll
cihjb25zdCBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiByZWZlcmVuY2UpCit7CisgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBtX3N1YmxheWVycy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAo
bV9zdWJsYXllcnNbaV0gPT0gcmVmZXJlbmNlKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAg
fQorICAgIHJldHVybiAtMTsKK30KKworY29uc3QgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogTGF5
ZXJDb21wb3NpdGluZ1RocmVhZDo6cm9vdExheWVyKCkgY29uc3QKK3sKKyAgICBjb25zdCBMYXll
ckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllciA9IHRoaXM7CisgICAgZm9yIChMYXllckNvbXBvc2l0
aW5nVGhyZWFkKiBzdXBlcmxheWVyID0gbGF5ZXItPnN1cGVybGF5ZXIoKTsgc3VwZXJsYXllcjsg
bGF5ZXIgPSBzdXBlcmxheWVyLCBzdXBlcmxheWVyID0gc3VwZXJsYXllci0+c3VwZXJsYXllcigp
KSB7IH0KKyAgICByZXR1cm4gbGF5ZXI7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVh
ZDo6cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKQoreworICAgIGlmIChtX3N1cGVybGF5ZXIpCisgICAg
ICAgIG1fc3VwZXJsYXllci0+cmVtb3ZlU3VibGF5ZXIodGhpcyk7Cit9CisKK3ZvaWQgTGF5ZXJD
b21wb3NpdGluZ1RocmVhZDo6c2V0U3VibGF5ZXJzKGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJD
b21wb3NpdGluZ1RocmVhZD4gPiYgc3VibGF5ZXJzKQoreworICAgIGlmIChzdWJsYXllcnMgPT0g
bV9zdWJsYXllcnMpCisgICAgICAgIHJldHVybjsKKworICAgIHdoaWxlIChtX3N1YmxheWVycy5z
aXplKCkpIHsKKyAgICAgICAgUmVmUHRyPExheWVyQ29tcG9zaXRpbmdUaHJlYWQ+IGxheWVyID0g
bV9zdWJsYXllcnNbMF0uZ2V0KCk7CisgICAgICAgIEFTU0VSVChsYXllci0+c3VwZXJsYXllcigp
KTsKKyAgICAgICAgbGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgfQorCisgICAg
bV9zdWJsYXllcnMuY2xlYXIoKTsKKworICAgIHNpemVfdCBsaXN0U2l6ZSA9IHN1YmxheWVycy5z
aXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgaSsrKSB7CisgICAg
ICAgIFJlZlB0cjxMYXllckNvbXBvc2l0aW5nVGhyZWFkPiBzdWJsYXllciA9IHN1YmxheWVyc1tp
XTsKKyAgICAgICAgc3VibGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgICAgIHN1
YmxheWVyLT5zZXRTdXBlcmxheWVyKHRoaXMpOworICAgICAgICBtX3N1YmxheWVycy5pbnNlcnQo
aSwgc3VibGF5ZXIpOworICAgIH0KK30KKwordm9pZCBMYXllckNvbXBvc2l0aW5nVGhyZWFkOjp1
cGRhdGVUZXh0dXJlQ29udGVudHNJZk5lZWRlZCgpCit7CisgICAgaWYgKGNhbnZhcygpIHx8IHBs
dWdpblZpZXcoKSkKKyAgICAgICAgcmV0dXJuOworCisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlm
IChtZWRpYVBsYXllcigpKQorICAgICAgICByZXR1cm47CisjZW5kaWYKKworICAgIG1fdGlsZXIt
PnVwbG9hZFRleHR1cmVzSWZOZWVkZWQoKTsKK30KKwordm9pZCBMYXllckNvbXBvc2l0aW5nVGhy
ZWFkOjpzZXRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAodmlzaWJsZSA9PSBtX3Zp
c2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fdmlzaWJsZSA9IHZpc2libGU7CisKKyAg
ICBpZiAoY2FudmFzKCkgfHwgcGx1Z2luVmlldygpKQorICAgICAgICByZXR1cm47CisKKyNpZiBF
TkFCTEUoVklERU8pCisgICAgaWYgKG1lZGlhUGxheWVyKCkpCisgICAgICAgIHJldHVybjsKKyNl
bmRpZgorCisgICAgbV90aWxlci0+bGF5ZXJWaXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmxlKTsKK30K
Kwordm9pZCBMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXROZWVkc0NvbW1pdCgpCit7CisgICAg
aWYgKG1fbGF5ZXJSZW5kZXJlcikKKyAgICAgICAgbV9sYXllclJlbmRlcmVyLT5zZXROZWVkc0Nv
bW1pdCgpOworfQorCit2b2lkIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNjaGVkdWxlQ29tbWl0
KCkKK3sKKyAgICBpZiAoIWlzV2ViS2l0VGhyZWFkKCkpIHsKKyAgICAgICAgaWYgKG1fY29tbWl0
U2NoZWR1bGVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIG1fY29tbWl0U2NoZWR1
bGVkID0gdHJ1ZTsKKworICAgICAgICBkaXNwYXRjaFdlYktpdE1lc3NhZ2UoQmxhY2tCZXJyeTo6
UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKCZMYXllckNvbXBvc2l0aW5nVGhyZWFk
OjpzY2hlZHVsZUNvbW1pdCwgdGhpcykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
bV9jb21taXRTY2hlZHVsZWQgPSBmYWxzZTsKKworICAgIC8vIEZJWE1FOiBUaGUgb25seSB3YXkg
dG8gZ2V0IGF0IG91ciBMYXllcldlYktpdFRocmVhZCBpcyB0byBnbyB0aHJvdWdoIHRoZSB0aWxl
ci4KKyAgICBpZiAoTGF5ZXJXZWJLaXRUaHJlYWQqIGxheWVyID0gbV90aWxlci0+bGF5ZXIoKSkK
KyAgICAgICAgbGF5ZXItPnNldE5lZWRzQ29tbWl0KCk7Cit9CisKKy8vIEZJWE1FOiBDb3B5IHBh
c3RlZCBmcm9tIFdlYkNvcmU6OkFuaW1hdGlvbkJhc2UhISEKKy8vIFRoZSBlcHNpbG9uIHZhbHVl
IHdlIHBhc3MgdG8gVW5pdEJlemllcjo6c29sdmUgZ2l2ZW4gdGhhdCB0aGUgYW5pbWF0aW9uIGlz
IGdvaW5nIHRvIHJ1biBvdmVyIHxkdXJ8IHNlY29uZHMuIFRoZSBsb25nZXIgdGhlCisvLyBhbmlt
YXRpb24sIHRoZSBtb3JlIHByZWNpc2lvbiB3ZSBuZWVkIGluIHRoZSB0aW1pbmcgZnVuY3Rpb24g
cmVzdWx0IHRvIGF2b2lkIHVnbHkgZGlzY29udGludWl0aWVzLgorc3RhdGljIGlubGluZSBkb3Vi
bGUgc29sdmVFcHNpbG9uKGRvdWJsZSBkdXJhdGlvbikKK3sKKyAgICByZXR1cm4gMS4wIC8gKDIw
MC4wICogZHVyYXRpb24pOworfQorCisvLyBGSVhNRTogQ29weSBwYXN0ZWQgZnJvbSBXZWJDb3Jl
OjpBbmltYXRpb25CYXNlISEhCitzdGF0aWMgaW5saW5lIGRvdWJsZSBzb2x2ZUN1YmljQmV6aWVy
RnVuY3Rpb24oZG91YmxlIHAxeCwgZG91YmxlIHAxeSwgZG91YmxlIHAyeCwgZG91YmxlIHAyeSwg
ZG91YmxlIHQsIGRvdWJsZSBkdXJhdGlvbikKK3sKKyAgICAvLyBDb252ZXJ0IGZyb20gaW5wdXQg
dGltZSB0byBwYXJhbWV0cmljIHZhbHVlIGluIGN1cnZlLCB0aGVuIGZyb20KKyAgICAvLyB0aGF0
IHRvIG91dHB1dCB0aW1lLgorICAgIFVuaXRCZXppZXIgYmV6aWVyKHAxeCwgcDF5LCBwMngsIHAy
eSk7CisgICAgcmV0dXJuIGJlemllci5zb2x2ZSh0LCBzb2x2ZUVwc2lsb24oZHVyYXRpb24pKTsK
K30KKworLy8gRklYTUU6IENvcHkgcGFzdGVkIGZyb20gV2ViQ29yZTo6QW5pbWF0aW9uQmFzZSEh
IQorc3RhdGljIGlubGluZSBkb3VibGUgc29sdmVTdGVwc0Z1bmN0aW9uKGludCBudW1TdGVwcywg
Ym9vbCBzdGVwQXRTdGFydCwgZG91YmxlIHQpCit7CisgICAgaWYgKHN0ZXBBdFN0YXJ0KQorICAg
ICAgICByZXR1cm4gbWluKDEuMCwgKGZsb29yKG51bVN0ZXBzICogdCkgKyAxKSAvIG51bVN0ZXBz
KTsKKyAgICByZXR1cm4gZmxvb3IobnVtU3RlcHMgKiB0KSAvIG51bVN0ZXBzOworfQorCisvLyBG
SVhNRTogQ29weSBwYXN0ZWQgZnJvbSBXZWJDb3JlOjpHcmFwaGljc0xheWVyQ0EhISEKK3N0YXRp
YyBjb25zdCBUaW1pbmdGdW5jdGlvbiogdGltaW5nRnVuY3Rpb25Gb3JBbmltYXRpb25WYWx1ZShj
b25zdCBBbmltYXRpb25WYWx1ZSogYW5pbVZhbHVlLCBjb25zdCBMYXllckFuaW1hdGlvbiogYW5p
bSkKK3sKKyAgICBpZiAoYW5pbVZhbHVlLT50aW1pbmdGdW5jdGlvbigpKQorICAgICAgICByZXR1
cm4gYW5pbVZhbHVlLT50aW1pbmdGdW5jdGlvbigpOworICAgIGlmIChhbmltLT50aW1pbmdGdW5j
dGlvbigpKQorICAgICAgICByZXR1cm4gYW5pbS0+dGltaW5nRnVuY3Rpb24oKTsKKworICAgIHJl
dHVybiBDdWJpY0JlemllclRpbWluZ0Z1bmN0aW9uOjpkZWZhdWx0VGltaW5nRnVuY3Rpb24oKTsK
K30KKworLy8gRklYTUU6IENvcHkgcGFzdGVkIGZyb20gV2ViQ29yZTo6QW5pbWF0aW9uQmFzZSEh
IQorc3RhdGljIGRvdWJsZSBwcm9ncmVzcyhkb3VibGUgZWxhcHNlZFRpbWUsIGNvbnN0IExheWVy
QW5pbWF0aW9uKiBsYXllckFuaW1hdGlvbiwgZG91YmxlIHNjYWxlLCBkb3VibGUgb2Zmc2V0LCBj
b25zdCBUaW1pbmdGdW5jdGlvbiogdGYpCit7CisgICAgZG91YmxlIGR1ciA9IGxheWVyQW5pbWF0
aW9uLT5kdXJhdGlvbigpOworICAgIGlmIChsYXllckFuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQo
KSA+IDApCisgICAgICAgIGR1ciAqPSBsYXllckFuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKTsK
KworICAgIGlmICghbGF5ZXJBbmltYXRpb24tPmR1cmF0aW9uKCkpCisgICAgICAgIHJldHVybiAx
LjA7CisgICAgaWYgKGxheWVyQW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpID4gMCAmJiBlbGFw
c2VkVGltZSA+PSBkdXIpCisgICAgICAgIHJldHVybiAobGF5ZXJBbmltYXRpb24tPml0ZXJhdGlv
bkNvdW50KCkgJSAyKSA/IDEuMCA6IDAuMDsKKworICAgIC8vIENvbXB1dGUgdGhlIGZyYWN0aW9u
YWwgdGltZSwgdGFraW5nIGludG8gYWNjb3VudCBkaXJlY3Rpb24uCisgICAgLy8gVGhlcmUgaXMg
bm8gbmVlZCB0byB3b3JyeSBhYm91dCBpdGVyYXRpb25zLCB3ZSBhc3N1bWUgdGhhdCB3ZSB3b3Vs
ZCBoYXZlCisgICAgLy8gc2hvcnQgY2lyY3VpdGVkIGFib3ZlIGlmIHdlIHdlcmUgZG9uZS4KKyAg
ICBkb3VibGUgZnJhY3Rpb25hbFRpbWUgPSBlbGFwc2VkVGltZSAvIGxheWVyQW5pbWF0aW9uLT5k
dXJhdGlvbigpOworICAgIGludCBpbnRlZ3JhbFRpbWUgPSBzdGF0aWNfY2FzdDxpbnQ+KGZyYWN0
aW9uYWxUaW1lKTsKKyAgICBmcmFjdGlvbmFsVGltZSAtPSBpbnRlZ3JhbFRpbWU7CisKKyAgICBp
ZiAoKGxheWVyQW5pbWF0aW9uLT5kaXJlY3Rpb24oKSA9PSBBbmltYXRpb246OkFuaW1hdGlvbkRp
cmVjdGlvbkFsdGVybmF0ZSkgJiYgKGludGVncmFsVGltZSAmIDEpKQorICAgICAgICBmcmFjdGlv
bmFsVGltZSA9IDEgLSBmcmFjdGlvbmFsVGltZTsKKworICAgIGlmIChzY2FsZSAhPSAxIHx8IG9m
ZnNldCkKKyAgICAgICAgZnJhY3Rpb25hbFRpbWUgPSAoZnJhY3Rpb25hbFRpbWUgLSBvZmZzZXQp
ICogc2NhbGU7CisKKyAgICBpZiAoIXRmKQorICAgICAgICB0ZiA9IGxheWVyQW5pbWF0aW9uLT50
aW1pbmdGdW5jdGlvbigpOworCisgICAgaWYgKHRmLT5pc0N1YmljQmV6aWVyVGltaW5nRnVuY3Rp
b24oKSkgeworICAgICAgICBjb25zdCBDdWJpY0JlemllclRpbWluZ0Z1bmN0aW9uKiBjdGYgPSBz
dGF0aWNfY2FzdDxjb25zdCBDdWJpY0JlemllclRpbWluZ0Z1bmN0aW9uKj4odGYpOworICAgICAg
ICByZXR1cm4gc29sdmVDdWJpY0JlemllckZ1bmN0aW9uKGN0Zi0+eDEoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGYtPnkxKCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY3RmLT54MigpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGN0Zi0+eTIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBmcmFjdGlvbmFsVGltZSwgbGF5ZXJBbmltYXRpb24tPmR1cmF0aW9uKCkp
OworICAgIH0gZWxzZSBpZiAodGYtPmlzU3RlcHNUaW1pbmdGdW5jdGlvbigpKSB7CisgICAgICAg
IGNvbnN0IFN0ZXBzVGltaW5nRnVuY3Rpb24qIHN0ZiA9IHN0YXRpY19jYXN0PGNvbnN0IFN0ZXBz
VGltaW5nRnVuY3Rpb24qPih0Zik7CisgICAgICAgIHJldHVybiBzb2x2ZVN0ZXBzRnVuY3Rpb24o
c3RmLT5udW1iZXJPZlN0ZXBzKCksIHN0Zi0+c3RlcEF0U3RhcnQoKSwgZnJhY3Rpb25hbFRpbWUp
OworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gZnJhY3Rpb25hbFRpbWU7Cit9CisKKy8vIEZJ
WE1FOiBDb3B5IHBhc3RlZCBmcm9tIFdlYkNvcmU6OktleWZyYW1lQW5pbWF0aW9uISEhCitzdGF0
aWMgdm9pZCBmZXRjaEludGVydmFsRW5kcG9pbnRzKGRvdWJsZSBlbGFwc2VkVGltZSwgY29uc3Qg
TGF5ZXJBbmltYXRpb24qIGxheWVyQW5pbWF0aW9uLCBjb25zdCBBbmltYXRpb25WYWx1ZSomIGZy
b21WYWx1ZSwgY29uc3QgQW5pbWF0aW9uVmFsdWUqJiB0b1ZhbHVlLCBkb3VibGUmIHByb2cpCit7
CisgICAgLy8gRmluZCB0aGUgZmlyc3Qga2V5CisgICAgaWYgKGxheWVyQW5pbWF0aW9uLT5kdXJh
dGlvbigpICYmIGxheWVyQW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpICE9IEFuaW1hdGlvbjo6
SXRlcmF0aW9uQ291bnRJbmZpbml0ZSkKKyAgICAgICAgZWxhcHNlZFRpbWUgPSBtaW4oZWxhcHNl
ZFRpbWUsIGxheWVyQW5pbWF0aW9uLT5kdXJhdGlvbigpICogbGF5ZXJBbmltYXRpb24tPml0ZXJh
dGlvbkNvdW50KCkpOworCisgICAgZG91YmxlIGZyYWN0aW9uYWxUaW1lID0gbGF5ZXJBbmltYXRp
b24tPmR1cmF0aW9uKCkgPyAoZWxhcHNlZFRpbWUgLyBsYXllckFuaW1hdGlvbi0+ZHVyYXRpb24o
KSkgOiAxOworCisgICAgLy8gRklYTUU6IHN0YXJ0VGltZSBjYW4gYmUgYmVmb3JlIHRoZSBjdXJy
ZW50IGFuaW1hdGlvbiAiZnJhbWUiIHRpbWUuIFRoaXMgaXMgdG8gc3luYyB3aXRoIHRoZSBmcmFt
ZSB0aW1lCisgICAgLy8gY29uY2VwdCBpbiBBbmltYXRpb25UaW1lQ29udHJvbGxlci4gU28gd2Ug
bmVlZCB0byBzb21laG93IHN5bmMgdGhlIHR3by4gVW50aWwgdGhlbiwgdGhlIHBvc3NpYmxlCisg
ICAgLy8gZXJyb3IgaXMgc21hbGwgYW5kIHdpbGwgcHJvYmFibHkgbm90IGJlIG5vdGljZWFibGUu
IFVudGlsIHdlIGZpeCB0aGlzLCByZW1vdmUgdGhlIGFzc2VydC4KKyAgICAvLyBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTIwMzcKKyAgICAvLyBBU1NFUlQoZnJhY3Rp
b25hbFRpbWUgPj0gMCk7CisgICAgaWYgKGZyYWN0aW9uYWxUaW1lIDwgMCkKKyAgICAgICAgZnJh
Y3Rpb25hbFRpbWUgPSAwOworCisgICAgLy8gRklYTUU6IHNoYXJlIHRoaXMgY29kZSB3aXRoIEFu
aW1hdGlvbkJhc2U6OnByb2dyZXNzKCkuCisgICAgaW50IGl0ZXJhdGlvbiA9IHN0YXRpY19jYXN0
PGludD4oZnJhY3Rpb25hbFRpbWUpOworICAgIGlmIChsYXllckFuaW1hdGlvbi0+aXRlcmF0aW9u
Q291bnQoKSAhPSBBbmltYXRpb246Okl0ZXJhdGlvbkNvdW50SW5maW5pdGUpCisgICAgICAgIGl0
ZXJhdGlvbiA9IG1pbihpdGVyYXRpb24sIGxheWVyQW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgp
IC0gMSk7CisKKyAgICBmcmFjdGlvbmFsVGltZSAtPSBpdGVyYXRpb247CisKKyAgICBib29sIHJl
dmVyc2luZyA9IChsYXllckFuaW1hdGlvbi0+ZGlyZWN0aW9uKCkgPT0gQW5pbWF0aW9uOjpBbmlt
YXRpb25EaXJlY3Rpb25BbHRlcm5hdGUpICYmIChpdGVyYXRpb24gJiAxKTsKKyAgICBpZiAocmV2
ZXJzaW5nKQorICAgICAgICBmcmFjdGlvbmFsVGltZSA9IDEgLSBmcmFjdGlvbmFsVGltZTsKKwor
ICAgIHNpemVfdCBudW1LZXlmcmFtZXMgPSBsYXllckFuaW1hdGlvbi0+dmFsdWVDb3VudCgpOwor
ICAgIGlmICghbnVtS2V5ZnJhbWVzKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQoIWxh
eWVyQW5pbWF0aW9uLT52YWx1ZUF0KDApLT5rZXlUaW1lKCkpOworICAgIEFTU0VSVChsYXllckFu
aW1hdGlvbi0+dmFsdWVBdChsYXllckFuaW1hdGlvbi0+dmFsdWVDb3VudCgpIC0gMSktPmtleVRp
bWUoKSA9PSAxKTsKKworICAgIGludCBwcmV2SW5kZXggPSAtMTsKKyAgICBpbnQgbmV4dEluZGV4
ID0gLTE7CisKKyAgICAvLyBGSVhNRTogd2l0aCBhIGxvdCBvZiBrZXlzLCB0aGlzIGxpbmVhciBz
ZWFyY2ggd2lsbCBiZSBzbG93LiBXZSBjb3VsZCBiaW5hcnkgc2VhcmNoLgorICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgY29uc3QgQW5pbWF0
aW9uVmFsdWUqIGN1cnJLZXlmcmFtZSA9IGxheWVyQW5pbWF0aW9uLT52YWx1ZUF0KGkpOworCisg
ICAgICAgIGlmIChmcmFjdGlvbmFsVGltZSA8IGN1cnJLZXlmcmFtZS0+a2V5VGltZSgpKSB7Cisg
ICAgICAgICAgICBuZXh0SW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KworICAgICAgICBwcmV2SW5kZXggPSBpOworICAgIH0KKworICAgIGRvdWJsZSBzY2FsZSA9IDE7
CisgICAgZG91YmxlIG9mZnNldCA9IDA7CisKKyAgICBpZiAocHJldkluZGV4ID09IC0xKQorICAg
ICAgICBwcmV2SW5kZXggPSAwOworCisgICAgaWYgKG5leHRJbmRleCA9PSAtMSkKKyAgICAgICAg
bmV4dEluZGV4ID0gbGF5ZXJBbmltYXRpb24tPnZhbHVlQ291bnQoKSAtIDE7CisKKyAgICBjb25z
dCBBbmltYXRpb25WYWx1ZSogcHJldktleWZyYW1lID0gbGF5ZXJBbmltYXRpb24tPnZhbHVlQXQo
cHJldkluZGV4KTsKKyAgICBjb25zdCBBbmltYXRpb25WYWx1ZSogbmV4dEtleWZyYW1lID0gbGF5
ZXJBbmltYXRpb24tPnZhbHVlQXQobmV4dEluZGV4KTsKKworICAgIGZyb21WYWx1ZSA9IHByZXZL
ZXlmcmFtZTsKKyAgICB0b1ZhbHVlID0gbmV4dEtleWZyYW1lOworCisgICAgb2Zmc2V0ID0gcHJl
dktleWZyYW1lLT5rZXlUaW1lKCk7CisgICAgc2NhbGUgPSAxLjAgLyAobmV4dEtleWZyYW1lLT5r
ZXlUaW1lKCkgLSBwcmV2S2V5ZnJhbWUtPmtleVRpbWUoKSk7CisKKyAgICBjb25zdCBUaW1pbmdG
dW5jdGlvbiogdGltaW5nRnVuY3Rpb24gPSB0aW1pbmdGdW5jdGlvbkZvckFuaW1hdGlvblZhbHVl
KHByZXZLZXlmcmFtZSwgbGF5ZXJBbmltYXRpb24pOworCisgICAgcHJvZyA9IHByb2dyZXNzKGVs
YXBzZWRUaW1lLCBsYXllckFuaW1hdGlvbiwgc2NhbGUsIG9mZnNldCwgdGltaW5nRnVuY3Rpb24p
OworfQorCitib29sIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnVwZGF0ZUFuaW1hdGlvbnMoZG91
YmxlIGN1cnJlbnRUaW1lKQoreworICAgIC8vIFRoZSBjb21taXQgbWVjaGFuaXNtIGFsd2F5cyBv
dmVyd3JpdGVzIG91ciBzdGF0ZSB3aXRoIHN0YXRlIGZyb20gdGhlCisgICAgLy8gV2ViS2l0IHRo
cmVhZC4gVGhpcyBtZWFucyB3ZSBoYXZlIHRvIHJlc3RvcmUgdGhlIGxhc3QgYW5pbWF0ZWQgdmFs
dWUgZm9yCisgICAgLy8gc3VzcGVuZGVkIGFuaW1hdGlvbnMuCisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBtX3N1c3BlbmRlZEFuaW1hdGlvbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgTGF5
ZXJBbmltYXRpb24qIGFuaW1hdGlvbiA9IG1fc3VzcGVuZGVkQW5pbWF0aW9uc1tpXS5nZXQoKTsK
KyAgICAgICAgLy8gRnJvbSBsb29raW5nIGF0IHRoZSBXZWJDb3JlIGNvZGUsIGl0IGFwcGVhcnMg
dGhhdCB3aGVuIHRoZSBhbmltYXRpb24KKyAgICAgICAgLy8gaXMgcGF1c2VkLCB0aGUgdGltZU9m
ZnNldCBpcyBtb2RpZmllZCBzbyBpdCB3aWxsIGJlIGFuIGFwcHJvcHJpYXRlCisgICAgICAgIC8v
IGVsYXBzZWRUaW1lLgorICAgICAgICBkb3VibGUgZWxhcHNlZFRpbWUgPSBhbmltYXRpb24tPnRp
bWVPZmZzZXQoKTsKKyAgICAgICAgdXBkYXRlQW5pbWF0aW9uKGFuaW1hdGlvbiwgZWxhcHNlZFRp
bWUpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9ydW5uaW5nQW5pbWF0
aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBMYXllckFuaW1hdGlvbiogYW5pbWF0aW9uID0g
bV9ydW5uaW5nQW5pbWF0aW9uc1tpXS5nZXQoKTsKKyAgICAgICAgZG91YmxlIGVsYXBzZWRUaW1l
ID0gKG1fc3VzcGVuZFRpbWUgPyBtX3N1c3BlbmRUaW1lIDogY3VycmVudFRpbWUpIC0gYW5pbWF0
aW9uLT5zdGFydFRpbWUoKSArIGFuaW1hdGlvbi0+dGltZU9mZnNldCgpOworICAgICAgICB1cGRh
dGVBbmltYXRpb24oYW5pbWF0aW9uLCBlbGFwc2VkVGltZSk7CisgICAgfQorCisgICAgcmV0dXJu
ICFtX3J1bm5pbmdBbmltYXRpb25zLmlzRW1wdHkoKTsKK30KKwordm9pZCBMYXllckNvbXBvc2l0
aW5nVGhyZWFkOjp1cGRhdGVBbmltYXRpb24oY29uc3QgTGF5ZXJBbmltYXRpb24qIGxheWVyQW5p
bWF0aW9uLCBkb3VibGUgZWxhcHNlZFRpbWUpCit7CisgICAgY29uc3QgQW5pbWF0aW9uVmFsdWUq
IGZyb20gPSAwOworICAgIGNvbnN0IEFuaW1hdGlvblZhbHVlKiB0byA9IDA7CisgICAgZG91Ymxl
IHByb2dyZXNzID0gMC4wOworCisgICAgZmV0Y2hJbnRlcnZhbEVuZHBvaW50cyhlbGFwc2VkVGlt
ZSwgbGF5ZXJBbmltYXRpb24sIGZyb20sIHRvLCBwcm9ncmVzcyk7CisKKyAgICBzd2l0Y2ggKGxh
eWVyQW5pbWF0aW9uLT5wcm9wZXJ0eSgpKSB7CisgICAgY2FzZSBBbmltYXRlZFByb3BlcnR5V2Vi
a2l0VHJhbnNmb3JtOgorICAgICAgICBtX3RyYW5zZm9ybSA9IGxheWVyQW5pbWF0aW9uLT5ibGVu
ZFRyYW5zZm9ybShzdGF0aWNfY2FzdDxjb25zdCBUcmFuc2Zvcm1BbmltYXRpb25WYWx1ZSo+KGZy
b20pLT52YWx1ZSgpLCBzdGF0aWNfY2FzdDxjb25zdCBUcmFuc2Zvcm1BbmltYXRpb25WYWx1ZSo+
KHRvKS0+dmFsdWUoKSwgcHJvZ3Jlc3MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFuaW1h
dGVkUHJvcGVydHlPcGFjaXR5OgorICAgICAgICBtX29wYWNpdHkgPSBsYXllckFuaW1hdGlvbi0+
YmxlbmRPcGFjaXR5KHN0YXRpY19jYXN0PGNvbnN0IEZsb2F0QW5pbWF0aW9uVmFsdWUqPihmcm9t
KS0+dmFsdWUoKSwgc3RhdGljX2Nhc3Q8Y29uc3QgRmxvYXRBbmltYXRpb25WYWx1ZSo+KHRvKS0+
dmFsdWUoKSwgcHJvZ3Jlc3MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFuaW1hdGVkUHJv
cGVydHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgY2FzZSBBbmltYXRlZFByb3BlcnR5SW52YWxpZDoK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30K
KworYm9vbCBMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpoYXNWaXNpYmxlSG9sZVB1bmNoUmVjdCgp
IGNvbnN0Cit7CisgICAgaWYgKG1fcGx1Z2luVmlldyAmJiAhbV9pc1Zpc2libGUpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAobV9tZWRpYVBsYXll
ciAmJiAhbV9pc1Zpc2libGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorCisgICAg
cmV0dXJuIGhhc0hvbGVQdW5jaFJlY3QoKTsKK30KKwordm9pZCBMYXllckNvbXBvc2l0aW5nVGhy
ZWFkOjpjcmVhdGVSZW5kZXJTdXJmYWNlKCkKK3sKKyAgICBBU1NFUlQoIW1fcmVuZGVyU3VyZmFj
ZSk7CisgICAgbV9yZW5kZXJTdXJmYWNlID0gYWRvcHRQdHIobmV3IFJlbmRlclN1cmZhY2UobV9s
YXllclJlbmRlcmVyLCB0aGlzKSk7Cit9CisKK30KKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2JsYWNrYmVycnkvTGF5ZXJDb21wb3NpdGluZ1RocmVhZC5oIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllckNvbXBvc2l0aW5nVGhyZWFkLmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uZWEzMmFlYmE5NWY5OGQxYWU3OTg5MGM3NGI3ZTk2ODBiMzVkNDg1NQotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkv
TGF5ZXJDb21wb3NpdGluZ1RocmVhZC5oCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBt
ZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT
IEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q
WVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICog
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworCisjaWZuZGVmIExheWVyQ29tcG9zaXRpbmdUaHJlYWRfaAorI2RlZmluZSBM
YXllckNvbXBvc2l0aW5nVGhyZWFkX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKworI2luY2x1ZGUgIkZsb2F0UXVhZC5oIgorI2luY2x1ZGUgIkxheWVyRGF0YS5oIgorI2lu
Y2x1ZGUgIkxheWVyVGlsZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJTdXJmYWNlLmgiCisKKyNpbmNs
dWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HdWFyZGVkUG9pbnRlci5oPgorI2luY2x1ZGUgPHd0Zi9U
aHJlYWRTYWZlUmVmQ291bnRlZC5oPgorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3Bh
Y2UgUGxhdGZvcm0geworbmFtZXNwYWNlIEdyYXBoaWNzIHsKK2NsYXNzIEJ1ZmZlcjsKK30KK30K
K30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBEZXN0cm95T25Db21wb3NpdGluZ1Ro
cmVhZDsKK2NsYXNzIExheWVyTWVzc2FnZTsKK2NsYXNzIExheWVyUmVuZGVyZXI7CisKK2NsYXNz
IExheWVyQ29tcG9zaXRpbmdUaHJlYWQgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8TGF5
ZXJDb21wb3NpdGluZ1RocmVhZD4sIHB1YmxpYyBMYXllckRhdGEsIHB1YmxpYyBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6R3VhcmRlZFBvaW50ZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFz
c1JlZlB0cjxMYXllckNvbXBvc2l0aW5nVGhyZWFkPiBjcmVhdGUoTGF5ZXJUeXBlLCBQYXNzUmVm
UHRyPExheWVyVGlsZXI+KTsKKworICAgIH5MYXllckNvbXBvc2l0aW5nVGhyZWFkKCk7CisKKyAg
ICAvLyBUaHJlYWQgc2FmZQorICAgIHZvaWQgc2V0UGx1Z2luVmlldyhQbHVnaW5WaWV3Kik7Cisj
aWYgRU5BQkxFKFZJREVPKQorICAgIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIqKTsK
KyNlbmRpZgorICAgIHZvaWQgY2xlYXJBbmltYXRpb25zKCk7CisKKyAgICAvLyBOb3QgdGhyZWFk
IHNhZmUKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBoYXZlIGFuIGFuaW1hdGlvbgorICAg
IGJvb2wgdXBkYXRlQW5pbWF0aW9ucyhkb3VibGUgY3VycmVudFRpbWUpOworICAgIHZvaWQgdXBk
YXRlVGV4dHVyZUNvbnRlbnRzSWZOZWVkZWQoKTsKKyAgICB2b2lkIGJpbmRDb250ZW50c1RleHR1
cmUoKQorICAgIHsKKyAgICAgICAgaWYgKG1fdGlsZXIpCisgICAgICAgICAgICBtX3RpbGVyLT5i
aW5kQ29udGVudHNUZXh0dXJlKCk7CisgICAgfQorCisgICAgY29uc3QgTGF5ZXJDb21wb3NpdGlu
Z1RocmVhZCogcm9vdExheWVyKCkgY29uc3Q7CisgICAgdm9pZCBzZXRTdWJsYXllcnMoY29uc3Qg
VmVjdG9yPFJlZlB0cjxMYXllckNvbXBvc2l0aW5nVGhyZWFkPiA+Jik7CisgICAgY29uc3QgVmVj
dG9yPFJlZlB0cjxMYXllckNvbXBvc2l0aW5nVGhyZWFkPiA+JiBnZXRTdWJsYXllcnMoKSBjb25z
dCB7IHJldHVybiBtX3N1YmxheWVyczsgfQorICAgIHZvaWQgc2V0U3VwZXJsYXllcihMYXllckNv
bXBvc2l0aW5nVGhyZWFkKiBzdXBlcmxheWVyKSB7IG1fc3VwZXJsYXllciA9IHN1cGVybGF5ZXI7
IH0KKyAgICBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBzdXBlcmxheWVyKCkgY29uc3QgeyByZXR1
cm4gbV9zdXBlcmxheWVyOyB9CisKKyAgICAvLyBUaGUgbGF5ZXIgcmVuZGVyZXIgbXVzdCBiZSBz
ZXQgaWYgdGhlIGxheWVyIGhhcyBiZWVuIHJlbmRlcmVkCisgICAgdm9pZCBzZXRMYXllclJlbmRl
cmVyKExheWVyUmVuZGVyZXIqKTsKKworICAgIHZvaWQgc2V0RHJhd1RyYW5zZm9ybShjb25zdCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYpOworICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBk
cmF3VHJhbnNmb3JtKCkgY29uc3QgeyByZXR1cm4gbV9kcmF3VHJhbnNmb3JtOyB9CisKKyAgICB2
b2lkIHNldERyYXdPcGFjaXR5KGZsb2F0IG9wYWNpdHkpIHsgbV9kcmF3T3BhY2l0eSA9IG9wYWNp
dHk7IH0KKyAgICBmbG9hdCBkcmF3T3BhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZHJhd09wYWNp
dHk7IH0KKworICAgIHZvaWQgY3JlYXRlUmVuZGVyU3VyZmFjZSgpOworICAgIFJlbmRlclN1cmZh
Y2UqIHJlbmRlclN1cmZhY2UoKSBjb25zdCB7IHJldHVybiBtX3JlbmRlclN1cmZhY2UuZ2V0KCk7
IH0KKyAgICB2b2lkIGNsZWFyUmVuZGVyU3VyZmFjZSgpIHsgbV9yZW5kZXJTdXJmYWNlLmNsZWFy
KCk7IH0KKworICAgIHZvaWQgc2V0TWFza0xheWVyKExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIG1h
c2tMYXllcikgeyBtX21hc2tMYXllciA9IG1hc2tMYXllcjsgfQorICAgIExheWVyQ29tcG9zaXRp
bmdUaHJlYWQqIG1hc2tMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fbWFza0xheWVyLmdldCgpOyB9
CisKKyAgICB2b2lkIHNldFJlcGxpY2FMYXllcihMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBsYXll
cikgeyBtX3JlcGxpY2FMYXllciA9IGxheWVyOyB9CisgICAgTGF5ZXJDb21wb3NpdGluZ1RocmVh
ZCogcmVwbGljYUxheWVyKCkgY29uc3QgeyByZXR1cm4gbV9yZXBsaWNhTGF5ZXIuZ2V0KCk7IH0K
KworICAgIEZsb2F0UmVjdCBnZXREcmF3UmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fZHJhd1JlY3Q7
IH0KKyAgICBjb25zdCBGbG9hdFF1YWQmIGdldFRyYW5zZm9ybWVkQm91bmRzKCkgY29uc3QgeyBy
ZXR1cm4gbV90cmFuc2Zvcm1lZEJvdW5kczsgfQorICAgIEZsb2F0UXVhZCBnZXRUcmFuc2Zvcm1l
ZEhvbGVQdW5jaFJlY3QoKSBjb25zdDsKKworICAgIHZvaWQgZGVsZXRlVGV4dHVyZXMoKTsKKwor
ICAgIHZvaWQgZHJhd1RleHR1cmVzKGludCBwb3NpdGlvbkxvY2F0aW9uLCBpbnQgdGV4Q29vcmRM
b2NhdGlvbiwgY29uc3QgRmxvYXRSZWN0JiB2aXNpYmxlUmVjdCk7CisgICAgYm9vbCBoYXNNaXNz
aW5nVGV4dHVyZXMoKSBjb25zdCB7IHJldHVybiBtX3RpbGVyID8gbV90aWxlci0+aGFzTWlzc2lu
Z1RleHR1cmVzKCkgOiBmYWxzZTsgfQorICAgIHZvaWQgZHJhd01pc3NpbmdUZXh0dXJlcyhpbnQg
cG9zaXRpb25Mb2NhdGlvbiwgaW50IHRleENvb3JkTG9jYXRpb24sIGNvbnN0IEZsb2F0UmVjdCYg
dmlzaWJsZVJlY3QpOworICAgIHZvaWQgZHJhd1N1cmZhY2UoY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgmLCBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBtYXNrLCBpbnQgcG9zaXRpb25Mb2NhdGlv
biwgaW50IHRleENvb3JkTG9jYXRpb24pOworICAgIGJvb2wgaXNEaXJ0eSgpIGNvbnN0IHsgcmV0
dXJuIG1fdGlsZXIgPyBtX3RpbGVyLT5oYXNEaXJ0eVRpbGVzKCkgOiBmYWxzZTsgfQorCisgICAg
dm9pZCByZWxlYXNlVGV4dHVyZVJlc291cmNlcygpOworCisgICAgLy8gTGF5ZXIgdmlzaWJpbGl0
eSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBMYXllclJlbmRlcmVyIHdoZW4gZHJhd2luZy4KKyAgICAv
LyBTbyB3ZSBkb24ndCBoYXZlIGFuIGFjY3VyYXRlIHZhbHVlIGZvciB2aXNpYmlsaXR5IHVudGls
IGl0J3MgdG9vIGxhdGUsCisgICAgLy8gYnV0IHRoZSBhdHRyaWJ1dGUgc3RpbGwgaXMgdXNlZnVs
LgorICAgIGJvb2wgaXNWaXNpYmxlKCkgY29uc3QgeyByZXR1cm4gbV92aXNpYmxlOyB9CisgICAg
dm9pZCBzZXRWaXNpYmxlKGJvb2wpOworCisgICAgLy8gVGhpcyB3aWxsIGNhdXNlIGEgY29tbWl0
IG9mIHRoZSB3aG9sZSBsYXllciB0cmVlIG9uIHRoZSBXZWJLaXQgdGhyZWFkLAorICAgIC8vIHNv
bWV0aW1lIGFmdGVyIHJlbmRlcmluZyBpcyBmaW5pc2hlZC4gVXNlZCB3aGVuIHJlbmRlcmluZyBy
ZXN1bHRzIGluIGEKKyAgICAvLyBuZWVkIGZvciBjb21taXQsIGZvciBleGFtcGxlIHdoZW4gYSBk
aXJ0eSBsYXllciBiZWNvbWVzIHZpc2libGUuCisgICAgdm9pZCBzZXROZWVkc0NvbW1pdCgpOwor
CisgICAgLy8gTm9ybWFsbHkgeW91IHdvdWxkIHNjaGVkdWxlIGEgY29tbWl0IGZyb20gdGhlIHdl
YmtpdCB0aHJlYWQsIGJ1dAorICAgIC8vIHRoaXMgYWxsb3dzIHlvdSB0byBkbyBpdCBmcm9tIHRo
ZSBjb21wb3NpdGluZyB0aHJlYWQuCisgICAgdm9pZCBzY2hlZHVsZUNvbW1pdCgpOworCisgICAg
Ym9vbCBoYXNSdW5uaW5nQW5pbWF0aW9ucygpIGNvbnN0IHsgcmV0dXJuICFtX3J1bm5pbmdBbmlt
YXRpb25zLmlzRW1wdHkoKTsgfQorCisgICAgYm9vbCBoYXNWaXNpYmxlSG9sZVB1bmNoUmVjdCgp
IGNvbnN0OworCitwcml2YXRlOgorICAgIExheWVyQ29tcG9zaXRpbmdUaHJlYWQoTGF5ZXJUeXBl
LCBQYXNzUmVmUHRyPExheWVyVGlsZXI+KTsKKworICAgIGZyaWVuZCBjbGFzcyBEZXN0cm95T25D
b21wb3NpdGluZ1RocmVhZDsKKyAgICB2b2lkIGRlc3Ryb3lPbkNvbXBvc2l0aW5nVGhyZWFkKCk7
CisKKyAgICB2b2lkIHVwZGF0ZVRpbGVDb250ZW50cyhjb25zdCBJbnRSZWN0JiB0aWxlKTsKKwor
ICAgIHZvaWQgcmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKworICAgIHNpemVfdCBudW1TdWJsYXll
cnMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fc3VibGF5ZXJzLnNpemUoKTsKKyAg
ICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc3VibGF5ZXIgb3IgLTEgaWYg
bm90IGZvdW5kLgorICAgIGludCBpbmRleE9mU3VibGF5ZXIoY29uc3QgTGF5ZXJDb21wb3NpdGlu
Z1RocmVhZCopOworCisgICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSByZW1v
dmVGcm9tU3VwZXJsYXllci4KKyAgICB2b2lkIHJlbW92ZVN1YmxheWVyKExheWVyQ29tcG9zaXRp
bmdUaHJlYWQqKTsKKworICAgIHZvaWQgdXBkYXRlQW5pbWF0aW9uKGNvbnN0IExheWVyQW5pbWF0
aW9uKiwgZG91YmxlIGVsYXBzZWRUaW1lKTsKKworICAgIExheWVyUmVuZGVyZXIqIG1fbGF5ZXJS
ZW5kZXJlcjsKKworICAgIHR5cGVkZWYgVmVjdG9yPFJlZlB0cjxMYXllckNvbXBvc2l0aW5nVGhy
ZWFkPiA+IExheWVyTGlzdDsKKyAgICBMYXllckxpc3QgbV9zdWJsYXllcnM7CisgICAgTGF5ZXJD
b21wb3NpdGluZ1RocmVhZCogbV9zdXBlcmxheWVyOworCisgICAgLy8gVmVydGV4IGRhdGEgZm9y
IHRoZSBib3VuZHMgb2YgdGhpcyBsYXllcgorICAgIEZsb2F0UXVhZCBtX3RyYW5zZm9ybWVkQm91
bmRzOworICAgIC8vIFRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIHRyYW5zZm9ybWVkIGxh
eWVyCisgICAgRmxvYXRSZWN0IG1fZHJhd1JlY3Q7CisKKyAgICBPd25QdHI8UmVuZGVyU3VyZmFj
ZT4gbV9yZW5kZXJTdXJmYWNlOworCisgICAgUmVmUHRyPExheWVyQ29tcG9zaXRpbmdUaHJlYWQ+
IG1fbWFza0xheWVyOworICAgIFJlZlB0cjxMYXllckNvbXBvc2l0aW5nVGhyZWFkPiBtX3JlcGxp
Y2FMYXllcjsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBt
X3BsdWdpbkJ1ZmZlcjsKKworICAgIC8vIFRoZSBnbG9iYWwgcHJvcGVydHkgdmFsdWVzLCBhZnRl
ciBjb25jYXRlbmF0aW9uIHdpdGggcGFyZW50IHZhbHVlcworICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4IG1fZHJhd1RyYW5zZm9ybTsKKyAgICBmbG9hdCBtX2RyYXdPcGFjaXR5OworCisgICAgYm9v
bCBtX3Zpc2libGU7CisgICAgYm9vbCBtX2NvbW1pdFNjaGVkdWxlZDsKKworICAgIFJlZlB0cjxM
YXllclRpbGVyPiBtX3RpbGVyOworfTsKKworfQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQorCisjZW5kaWYK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>133813</attachid>
            <date>2012-03-26 08:03:29 -0700</date>
            <delta_ts>2012-03-26 09:24:59 -0700</delta_ts>
            <desc>patch-v3</desc>
            <filename>bug-79873-20120326230322.patch</filename>
            <type>text/plain</type>
            <size>31327</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEyMDg3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMjczMjUwOTdhZmYxNTUy
MGU0MWM2MTkyNmFkZjMyZDBkNTM2YzRlYS4uYmE0NTU5Y2Y4NzJjMjIyZmIwZjlkMDc5ZGU4NDU1
NGYyYzMzNTc1YSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY5IEBACisyMDEyLTAzLTI2ICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBMYXllckNvbXBvc2l0aW5nVGhyZWFkLntoLCBjcHB9CisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03OTg3MworCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5v
IG5ldyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvTGF5
ZXJDb21wb3NpdGluZ1RocmVhZC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpjcmVhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZCk6
CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjp+TGF5ZXJDb21wb3Np
dGluZ1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpk
ZXN0cm95T25Db21wb3NpdGluZ1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBv
c2l0aW5nVGhyZWFkOjpzZXRMYXllclJlbmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
Q29tcG9zaXRpbmdUaHJlYWQ6OmRlbGV0ZVRleHR1cmVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldERyYXdUcmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29y
ZTo6Z2V0VHJhbnNmb3JtZWRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRp
bmdUaHJlYWQ6OmdldFRyYW5zZm9ybWVkSG9sZVB1bmNoUmVjdCk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpkcmF3VGV4dHVyZXMpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6ZHJhd1N1cmZhY2UpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6ZHJhd01pc3NpbmdUZXh0dXJlcyk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpyZWxlYXNlVGV4dHVyZVJlc291cmNl
cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRQbHVnaW5W
aWV3KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldE1lZGlh
UGxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmNsZWFy
QW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpy
ZW1vdmVTdWJsYXllcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFk
OjppbmRleE9mU3VibGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZDo6cm9vdExheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJl
YWQ6OnJlbW92ZUZyb21TdXBlcmxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9z
aXRpbmdUaHJlYWQ6OnNldFN1YmxheWVycyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBv
c2l0aW5nVGhyZWFkOjp1cGRhdGVUZXh0dXJlQ29udGVudHNJZk5lZWRlZCk6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRWaXNpYmxlKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldE5lZWRzQ29tbWl0KToKKyAgICAgICAg
KFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNjaGVkdWxlQ29tbWl0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnVwZGF0ZUFuaW1hdGlvbnMpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6aGFzVmlzaWJsZUhvbGVQ
dW5jaFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6Y3Jl
YXRlTGF5ZXJSZW5kZXJlclN1cmZhY2UpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Js
YWNrYmVycnkvTGF5ZXJDb21wb3NpdGluZ1RocmVhZC5oOiBBZGRlZC4KKyAgICAgICAgKEdyYXBo
aWNzKToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoTGF5ZXJDb21wb3NpdGluZ1RocmVh
ZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpiaW5kQ29udGVu
dHNUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6Omdl
dFN1YmxheWVycyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpz
ZXRTdXBlcmxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6
OnN1cGVybGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6
ZHJhd1RyYW5zZm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFk
OjpzZXREcmF3T3BhY2l0eSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhy
ZWFkOjpkcmF3T3BhY2l0eSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhy
ZWFkOjpsYXllclJlbmRlcmVyU3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBv
c2l0aW5nVGhyZWFkOjpjbGVhckxheWVyUmVuZGVyZXJTdXJmYWNlKToKKyAgICAgICAgKFdlYkNv
cmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldE1hc2tMYXllcik6CisgICAgICAgIChXZWJD
b3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjptYXNrTGF5ZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0UmVwbGljYUxheWVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnJlcGxpY2FMYXllcik6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpnZXREcmF3UmVjdCk6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpnZXRUcmFuc2Zvcm1lZEJvdW5kcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpoYXNNaXNzaW5nVGV4dHVy
ZXMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6aXNEaXJ0eSk6
CisgICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjppc1Zpc2libGUpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0T3BhY2l0eSk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRUcmFuc2Zvcm0pOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6aGFzUnVubmluZ0FuaW1h
dGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6bnVtU3Vi
bGF5ZXJzKToKKwogMjAxMi0wMy0yMiAgQWxleGFuZGVyIFBhdmxvdiAgPGFwYXZsb3ZAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IE1pZ3JhdGUgSW5zcGVjdG9yQ1NTQWdl
bnQgdG8gc3RyaWN0IHByb3RvY29sIHR5cGVzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyQ29tcG9zaXRpbmdUaHJlYWQuY3BwIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXllckNvbXBvc2l0
aW5nVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44OWE5Y2Y3NzE2YTRjNDBmOTBjMTdiOWNmZDM4Yjk4
MTRlM2JjNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvYmxhY2tiZXJyeS9MYXllckNvbXBvc2l0aW5nVGhyZWFkLmNwcApAQCAtMCwwICsxLDUy
NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBN
b3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAx
MCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3
LCAyMDA4LCAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9u
LgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVz
IG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElT
IiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICog
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJMYXll
ckNvbXBvc2l0aW5nVGhyZWFkLmgiCisKKyNpbmNsdWRlICJMYXllck1lc3NhZ2UuaCIKKyNpbmNs
dWRlICJMYXllclJlbmRlcmVyLmgiCisjaW5jbHVkZSAiTGF5ZXJXZWJLaXRUaHJlYWQuaCIKKyNp
ZiBFTkFCTEUoVklERU8pCisjaW5jbHVkZSAiTWVkaWFQbGF5ZXIuaCIKKyNpbmNsdWRlICJNZWRp
YVBsYXllclByaXZhdGVCbGFja0JlcnJ5LmgiCisjZW5kaWYKKyNpbmNsdWRlICJQbHVnaW5WaWV3
LmgiCisjaW5jbHVkZSAiVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQuaCIKKworI2luY2x1
ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBs
YXRmb3JtTG9nLmg+CisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKworI2RlZmluZSBERUJV
R19WSURFT19DTElQUElORyAwCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGFzc1JlZlB0cjxM
YXllckNvbXBvc2l0aW5nVGhyZWFkPiBMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpjcmVhdGUoTGF5
ZXJUeXBlIHR5cGUsIFBhc3NSZWZQdHI8TGF5ZXJUaWxlcj4gdGlsZXIpCit7CisgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBMYXllckNvbXBvc2l0aW5nVGhyZWFkKHR5cGUsIHRpbGVyKSk7Cit9CisK
K0xheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OkxheWVyQ29tcG9zaXRpbmdUaHJlYWQoTGF5ZXJUeXBl
IHR5cGUsIFBhc3NSZWZQdHI8TGF5ZXJUaWxlcj4gdGlsZXIpCisgICAgOiBMYXllckRhdGEodHlw
ZSkKKyAgICAsIG1fbGF5ZXJSZW5kZXJlcigwKQorICAgICwgbV9zdXBlcmxheWVyKDApCisgICAg
LCBtX3BsdWdpbkJ1ZmZlcigwKQorICAgICwgbV9kcmF3T3BhY2l0eSgwKQorICAgICwgbV92aXNp
YmxlKGZhbHNlKQorICAgICwgbV9jb21taXRTY2hlZHVsZWQoZmFsc2UpCisgICAgLCBtX3RpbGVy
KHRpbGVyKQoreworfQorCitMYXllckNvbXBvc2l0aW5nVGhyZWFkOjp+TGF5ZXJDb21wb3NpdGlu
Z1RocmVhZCgpCit7CisgICAgLy8gVW5mb3J0dW5hdGVseSwgVGhyZWFkU2FmZVNoYXJlZDxUPiBp
cyBoYXJkd2lyZWQgdG8gY2FsbCBUOjp+VCgpLgorICAgIC8vIFRvIHN3aXRjaCB0aHJlYWRzIGlu
IGNhc2UgdGhlIGxhc3QgcmVmZXJlbmNlIGlzIHJlbGVhc2VkIG9uIHRoZQorICAgIC8vIFdlYktp
dCB0aHJlYWQsIHdlIHNlbmQgYSBzeW5jIG1lc3NhZ2UgdG8gdGhlIGNvbXBvc2l0aW5nIHRocmVh
ZC4KKyAgICBkZXN0cm95T25Db21wb3NpdGluZ1RocmVhZCgpOworfQorCit2b2lkIExheWVyQ29t
cG9zaXRpbmdUaHJlYWQ6OmRlc3Ryb3lPbkNvbXBvc2l0aW5nVGhyZWFkKCkKK3sKKyAgICBpZiAo
IWlzQ29tcG9zaXRpbmdUaHJlYWQoKSkgeworICAgICAgICBkaXNwYXRjaFN5bmNDb21wb3NpdGlu
Z01lc3NhZ2UoQmxhY2tCZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKAor
ICAgICAgICAgICAgJkxheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmRlc3Ryb3lPbkNvbXBvc2l0aW5n
VGhyZWFkLAorICAgICAgICAgICAgdGhpcykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgbV90aWxlci0+bGF5ZXJDb21wb3NpdGluZ1RocmVhZERlc3Ryb3llZCgpOworCisgICAgQVNT
RVJUKCFzdXBlcmxheWVyKCkpOworCisgICAgLy8gUmVtb3ZlIHRoZSBzdXBlcmxheWVyIHJlZmVy
ZW5jZSBmcm9tIGFsbCBzdWJsYXllcnMuCisgICAgd2hpbGUgKG1fc3VibGF5ZXJzLnNpemUoKSkK
KyAgICAgICAgbV9zdWJsYXllcnNbMF0tPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisKKyAgICAv
LyBEZWxldGUgYWxsIGFsbG9jYXRlZCB0ZXh0dXJlcworICAgIGRlbGV0ZVRleHR1cmVzKCk7CisK
KyAgICAvLyBXZSBqdXN0IGRlbGV0ZWQgYWxsIG91ciB0ZXh0dXJlcywgbm8gbmVlZCBmb3IgdGhl
CisgICAgLy8gbGF5ZXIgcmVuZGVyZXIgdG8gdHJhY2sgdXMgYW55bW9yZQorICAgIGlmIChtX2xh
eWVyUmVuZGVyZXIpCisgICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+cmVtb3ZlTGF5ZXIodGhpcyk7
Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0TGF5ZXJSZW5kZXJlcihMYXll
clJlbmRlcmVyKiByZW5kZXJlcikKK3sKKyAgICAvLyBJdCdzIG5vdCBleHBlY3RlZCB0aGF0IGxh
eWVycyB3aWxsIGV2ZXIgc3dpdGNoIHJlbmRlcmVycy4KKyAgICBBU1NFUlQoIXJlbmRlcmVyIHx8
ICFtX2xheWVyUmVuZGVyZXIgfHwgcmVuZGVyZXIgPT0gbV9sYXllclJlbmRlcmVyKTsKKworICAg
IG1fbGF5ZXJSZW5kZXJlciA9IHJlbmRlcmVyOworICAgIGlmIChtX2xheWVyUmVuZGVyZXIpCisg
ICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+YWRkTGF5ZXIodGhpcyk7Cit9CisKK3ZvaWQgTGF5ZXJD
b21wb3NpdGluZ1RocmVhZDo6ZGVsZXRlVGV4dHVyZXMoKQoreworICAgIHJlbGVhc2VUZXh0dXJl
UmVzb3VyY2VzKCk7CisKKyAgICBtX3RpbGVyLT5kZWxldGVUZXh0dXJlcygpOworfQorCit2b2lk
IExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldERyYXdUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIG1hdHJpeCkKK3sKKyAgICBtX2RyYXdUcmFuc2Zvcm0gPSBtYXRyaXg7CisK
KyAgICBmbG9hdCBieCA9IG1fYm91bmRzLndpZHRoKCkgLyAyLjA7CisgICAgZmxvYXQgYnkgPSBt
X2JvdW5kcy5oZWlnaHQoKSAvIDIuMDsKKyAgICBtX3RyYW5zZm9ybWVkQm91bmRzLnNldFAxKG1h
dHJpeC5tYXBQb2ludChGbG9hdFBvaW50KC1ieCwgLWJ5KSkpOworICAgIG1fdHJhbnNmb3JtZWRC
b3VuZHMuc2V0UDIobWF0cml4Lm1hcFBvaW50KEZsb2F0UG9pbnQoLWJ4LCBieSkpKTsKKyAgICBt
X3RyYW5zZm9ybWVkQm91bmRzLnNldFAzKG1hdHJpeC5tYXBQb2ludChGbG9hdFBvaW50KGJ4LCBi
eSkpKTsKKyAgICBtX3RyYW5zZm9ybWVkQm91bmRzLnNldFA0KG1hdHJpeC5tYXBQb2ludChGbG9h
dFBvaW50KGJ4LCAtYnkpKSk7CisKKyAgICBtX2RyYXdSZWN0ID0gbV90cmFuc2Zvcm1lZEJvdW5k
cy5ib3VuZGluZ0JveCgpOworfQorCitzdGF0aWMgRmxvYXRRdWFkIGdldFRyYW5zZm9ybWVkUmVj
dChjb25zdCBJbnRTaXplJiBib3VuZHMsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IFRyYW5z
Zm9ybWF0aW9uTWF0cml4JiBkcmF3VHJhbnNmb3JtKQoreworICAgIGZsb2F0IHggPSAtYm91bmRz
LndpZHRoKCkgLyAyLjAgKyByZWN0LngoKTsKKyAgICBmbG9hdCB5ID0gLWJvdW5kcy5oZWlnaHQo
KSAvIDIuMCArIHJlY3QueSgpOworICAgIGZsb2F0IHcgPSByZWN0LndpZHRoKCk7CisgICAgZmxv
YXQgaCA9IHJlY3QuaGVpZ2h0KCk7CisgICAgRmxvYXRRdWFkIHJlc3VsdDsKKyAgICByZXN1bHQu
c2V0UDEoZHJhd1RyYW5zZm9ybS5tYXBQb2ludChGbG9hdFBvaW50KHgsIHkpKSk7CisgICAgcmVz
dWx0LnNldFAyKGRyYXdUcmFuc2Zvcm0ubWFwUG9pbnQoRmxvYXRQb2ludCh4LCB5ICsgaCkpKTsK
KyAgICByZXN1bHQuc2V0UDMoZHJhd1RyYW5zZm9ybS5tYXBQb2ludChGbG9hdFBvaW50KHggKyB3
LCB5ICsgaCkpKTsKKyAgICByZXN1bHQuc2V0UDQoZHJhd1RyYW5zZm9ybS5tYXBQb2ludChGbG9h
dFBvaW50KHggKyB3LCB5KSkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitGbG9hdFF1
YWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6Z2V0VHJhbnNmb3JtZWRIb2xlUHVuY2hSZWN0KCkg
Y29uc3QKK3sKKyAgICAvLyBGSVhNRTogdGhlIGZvbGxvd2luZyBsaW5lIGRpc2FibGVzIGNsaXBw
aW5nIGEgdmlkZW8gaW4gYW4gaWZyYW1lIGkuZS4gdGhlIGZpeCBhc3NvY2lhdGVkIHdpdGggUFIg
OTk2MzguCisgICAgLy8gU29tZSByZXZpc2VkIHRlc3QgY2FzZSAoZS5nLiB2aWRlby1pZnJhbWUu
aHRtbCkgc2hvdyB0aGF0IHRoZSBvcmlnaW5hbCBmaXggd29ya3MgY29ycmVjdGx5IHdoZW4gc2Ny
b2xsaW5nCisgICAgLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSBmcmFtZSwgYnV0IGZhaWxzIHRvIGNs
aXAgY29ycmVjdGx5IGlmIHRoZSBwYWdlIChtYWluIGZyYW1lKSBpcyBzY3JvbGxlZC4KKyAgICBz
dGF0aWMgYm9vbCBlbmFibGVWaWRlb0NsaXBwaW5nID0gZmFsc2U7CisKKyAgICBpZiAoIW1lZGlh
UGxheWVyKCkgfHwgIWVuYWJsZVZpZGVvQ2xpcHBpbmcpIHsKKyAgICAgICAgLy8gbV9ob2xlUHVu
Y2hDbGlwUmVjdCBpcyB2YWxpZCBvbmx5IHdoZW4gdGhlcmUncyBhIG1lZGlhIHBsYXllci4KKyAg
ICAgICAgcmV0dXJuIGdldFRyYW5zZm9ybWVkUmVjdChtX2JvdW5kcywgbV9ob2xlUHVuY2hSZWN0
LCBtX2RyYXdUcmFuc2Zvcm0pOworICAgIH0KKworICAgIC8vIFRoZSBob2xlIHB1bmNoIHJlY3Rh
bmdsZSBtYXkgbmVlZCB0byBiZSBjbGlwcGVkLAorICAgIC8vIGUuZy4gaWYgdGhlIDx2aWRlbz4g
aXMgb24gYSBsYXllciB0aGF0J3MgaW5jbHVkZWQgYW5kIGNsaXBwZWQgYnkgYW4gPGlmcmFtZT4u
CisKKyAgICAvLyBJbiBvcmRlciB0byBjbGlwIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBjdXJy
ZW50IHBvc2l0aW9uIG9mIHRoaXMgbGF5ZXIsIHdoaWNoCisgICAgLy8gaXMgZW5jb2RlZCBpbiB0
aGUgbV9kcmF3VHJhbnNmb3JtIHZhbHVlLCB3aGljaCB3YXMgdXNlZCB0byBpbml0aWFsaXplIG1f
ZHJhd1JlY3QuCisgICAgSW50UmVjdCBkcmF3UmVjdCA9IG1fbGF5ZXJSZW5kZXJlci0+dG9XZWJL
aXREb2N1bWVudENvb3JkaW5hdGVzKG1fZHJhd1JlY3QpOworCisgICAgLy8gQXNzZXJ0IHRoYXQg
aW4gdGhpcyBjYXNlLCB3aGVyZSB0aGUgaG9sZSBwdW5jaCByZWN0YW5nbGUgZXF1YWxzIHRoZSBz
aXplIG9mIHRoZSBsYXllciwKKyAgICAvLyB0aGUgZHJhd1JlY3QgaGFzIHRoZSBzYW1lIHNpemUg
YXMgdGhlIGhvbGUgcHVuY2guCisgICAgLy8gQVNTRVJUKGRyYXdSZWN0LnNpemUoKSA9PSBtX2hv
bGVQdW5jaFJlY3Quc2l6ZSgpKTsKKyAgICAvLyBEb24ndCBhc3NlcnQgaXQgcHJvZ3JhbXRpY2Fs
bHkgdGhvdWdoIGJlY2F1c2UgdGhlcmUgbWF5IGJlIG9mZi1ieS1vbmUgZXJyb3IgZHVlIHRvIHJv
dW5kaW5nIHdoZW4gdGhlcmUncyB6b29taW5nLgorCisgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0
d2VlbiBkcmF3UmVjdCBhbmQgbV9ob2xlUHVuY2hSZWN0IGlzIHRoYXQgZHJhd1JlY3QgaGFzIGFu
IGFjY3VyYXRlIHBvc2l0aW9uCisgICAgLy8gaW4gV2ViS2l0IGRvY3VtZW50IGNvb3JkaW5hdGVz
LCB3aGVyZWFzIHRoZSBtX2hvbGVQdW5jaFJlY3QgbG9jYXRpb24gaXMgKDAsMCkgaS5lLiBpdCdz
IHJlbGF0aXZlIHRvIHRoaXMgbGF5ZXIuCisKKyAgICAvLyBDbGlwIHRoZSBkcmF3UmVjdC4KKyAg
ICAvLyBCb3RoIGRyYXdSZWN0IGFuZCBtX2hvbGVQdW5jaENsaXBSZWN0IGFscmVhZHkgaGF2ZSBj
b3JyZWN0IGxvY2F0aW9ucywgaW4gV2ViS2l0IGRvY3VtZW50IGNvb3JkaW5hdGVzLgorICAgIElu
dFBvaW50IGxvY2F0aW9uID0gZHJhd1JlY3QubG9jYXRpb24oKTsKKyAgICBkcmF3UmVjdC5pbnRl
cnNlY3QobV9ob2xlUHVuY2hDbGlwUmVjdCk7CisKKyAgICAvLyBTaGlmdCB0aGUgY2xpcHBlZCBk
cmF3UmVjdCB0byBoYXZlIHRoZSBzYW1lIGtpbmQgb2YgbG9jYXRlZC1hdC16ZXJvIHBvc2l0aW9u
IGFzIHRoZSBvcmlnaW5hbCBob2xlUHVuY2hSZWN0LgorICAgIGRyYXdSZWN0Lm1vdmUoLWxvY2F0
aW9uLngoKSwgLWxvY2F0aW9uLnkoKSk7CisKKyNpZiBERUJVR19WSURFT19DTElQUElORworICAg
ICBJbnRSZWN0IGRyYXdSZWN0SW5XZWJLaXREb2N1bWVudENvb3JkaW5hdGlvbiA9IG1fbGF5ZXJS
ZW5kZXJlci0+dG9XZWJLaXREb2N1bWVudENvb3JkaW5hdGVzKG1fZHJhd1JlY3QpOworICAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbElu
Zm8sICJMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpnZXRUcmFuc2Zvcm1lZEhvbGVQdW5jaFJlY3Qo
KSAtIGRyYXdSZWN0PSh4PSVkLHk9JWQsd2lkdGg9JWQsaGVpZ2h0PSVkKSBjbGlwUmVjdD0oeD0l
ZCx5PSVkLHdpZHRoPSVkLGhlaWdodD0lZCkgY2xpcHBlZFJlY3Q9KHg9JWQseT0lZCx3aWR0aD0l
ZCxoZWlnaHQ9JWQpLiIsCisgICAgICAgIGRyYXdSZWN0SW5XZWJLaXREb2N1bWVudENvb3JkaW5h
dGlvbi54KCksIGRyYXdSZWN0SW5XZWJLaXREb2N1bWVudENvb3JkaW5hdGlvbi55KCksIGRyYXdS
ZWN0SW5XZWJLaXREb2N1bWVudENvb3JkaW5hdGlvbi53aWR0aCgpLCBkcmF3UmVjdEluV2ViS2l0
RG9jdW1lbnRDb29yZGluYXRpb24uaGVpZ2h0KCksCisgICAgICAgIG1faG9sZVB1bmNoQ2xpcFJl
Y3QueCgpLCBtX2hvbGVQdW5jaENsaXBSZWN0LnkoKSwgbV9ob2xlUHVuY2hDbGlwUmVjdC53aWR0
aCgpLCBtX2hvbGVQdW5jaENsaXBSZWN0LmhlaWdodCgpLAorICAgICAgICBkcmF3UmVjdC54KCks
IGRyYXdSZWN0LnkoKSwgZHJhd1JlY3Qud2lkdGgoKSwgZHJhd1JlY3QuaGVpZ2h0KCkpOworI2Vu
ZGlmCisKKyAgICByZXR1cm4gZ2V0VHJhbnNmb3JtZWRSZWN0KG1fYm91bmRzLCBkcmF3UmVjdCwg
bV9kcmF3VHJhbnNmb3JtKTsKK30KKwordm9pZCBMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpkcmF3
VGV4dHVyZXMoaW50IHBvc2l0aW9uTG9jYXRpb24sIGludCB0ZXhDb29yZExvY2F0aW9uLCBjb25z
dCBGbG9hdFJlY3QmIHZpc2libGVSZWN0KQoreworICAgIGZsb2F0IHRleGNvb3Jkc1s0ICogMl0g
PSB7IDAsIDAsICAwLCAxLCAgMSwgMSwgIDEsIDAgfTsKKworICAgIGlmIChtX3BsdWdpblZpZXcp
IHsKKyAgICAgICAgaWYgKG1faXNWaXNpYmxlKSB7CisgICAgICAgICAgICAvLyBUaGUgbGF5ZXIg
Y29udGFpbnMgRmxhc2gsIHZpZGVvLCBvciBvdGhlciBwbHVnaW4gY29udGVudHMuCisgICAgICAg
ICAgICBtX3BsdWdpbkJ1ZmZlciA9IG1fcGx1Z2luVmlldy0+bG9ja0Zyb250QnVmZmVyRm9yUmVh
ZCgpOworCisgICAgICAgICAgICBpZiAoIW1fcGx1Z2luQnVmZmVyKQorICAgICAgICAgICAgICAg
IHJldHVybjsKKworICAgICAgICAgICAgaWYgKCFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhp
Y3M6OmxvY2tBbmRCaW5kQnVmZmVyR0xUZXh0dXJlKG1fcGx1Z2luQnVmZmVyLCBHTF9URVhUVVJF
XzJEKSkgeworICAgICAgICAgICAgICAgIG1fcGx1Z2luVmlldy0+dW5sb2NrRnJvbnRCdWZmZXIo
KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IG1fbGF5ZXJSZW5kZXJlci0+YWRkTGF5ZXJUb1JlbGVhc2VUZXh0dXJlUmVzb3VyY2VzTGlzdCh0
aGlzKTsKKworICAgICAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHBvc2l0aW9uTG9jYXRp
b24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgJm1fdHJhbnNmb3JtZWRCb3VuZHMpOworICAg
ICAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3JkTG9jYXRpb24sIDIsIEdMX0ZM
T0FULCBHTF9GQUxTRSwgMCwgdGV4Y29vcmRzKTsKKyAgICAgICAgICAgIGdsRHJhd0FycmF5cyhH
TF9UUklBTkdMRV9GQU4sIDAsIDQpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9
CisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlmIChtX21lZGlhUGxheWVyKSB7CisgICAgICAgIGlm
IChtX2lzVmlzaWJsZSkgeworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzcGVjaWZ5IHRoZSBt
ZWRpYSBwbGF5ZXIgbG9jYXRpb24gaW4gY29udGVudHMgY29vcmRpbmF0ZXMuIFRoZSAndmlzaWJs
ZVJlY3QnCisgICAgICAgICAgICAvLyBzcGVjaWZpZXMgdGhlIGNvbnRlbnQgcmVnaW9uIGNvdmVy
ZWQgYnkgb3VyIHZpZXdwb3J0LiBTbyB3ZSB0cmFuc2Zvcm0gZnJvbSBvdXIKKyAgICAgICAgICAg
IC8vIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGVzIFstMSwgMV0gdG8gdGhlICd2aXNpYmxl
UmVjdCcuCisgICAgICAgICAgICBmbG9hdCB2cncyID0gdmlzaWJsZVJlY3Qud2lkdGgoKSAvIDIu
MDsKKyAgICAgICAgICAgIGZsb2F0IHZyaDIgPSB2aXNpYmxlUmVjdC5oZWlnaHQoKSAvIDIuMDsK
KyAgICAgICAgICAgIGZsb2F0IHggPSBtX3RyYW5zZm9ybWVkQm91bmRzLnAxKCkueCgpICogdnJ3
MiArIHZydzIgKyB2aXNpYmxlUmVjdC54KCk7CisgICAgICAgICAgICBmbG9hdCB5ID0gLW1fdHJh
bnNmb3JtZWRCb3VuZHMucDEoKS55KCkgKiB2cmgyICsgdnJoMiArIHZpc2libGVSZWN0LnkoKTsK
KyAgICAgICAgICAgIG1fbWVkaWFQbGF5ZXItPnBhaW50KDAsIEludFJlY3QoKGludCkoeCArIDAu
NSksIChpbnQpKHkgKyAwLjUpLCBtX2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5oZWlnaHQoKSkp
OworICAgICAgICAgICAgTWVkaWFQbGF5ZXJQcml2YXRlKiBtcHAgPSBzdGF0aWNfY2FzdDxNZWRp
YVBsYXllclByaXZhdGUqPihtX21lZGlhUGxheWVyLT5wbGF0Zm9ybU1lZGlhKCkubWVkaWEucW54
TWVkaWFQbGF5ZXIpOworICAgICAgICAgICAgbXBwLT5kcmF3QnVmZmVyaW5nQW5pbWF0aW9uKG1f
ZHJhd1RyYW5zZm9ybSwgcG9zaXRpb25Mb2NhdGlvbiwgdGV4Q29vcmRMb2NhdGlvbik7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lmIEVOQUJMRShXRUJHTCkK
KyAgICBpZiAobGF5ZXJUeXBlKCkgPT0gTGF5ZXJEYXRhOjpXZWJHTExheWVyKSB7CisgICAgICAg
IHB0aHJlYWRfbXV0ZXhfbG9jayhtX2Zyb250QnVmZmVyTG9jayk7CisgICAgICAgIGdsVmVydGV4
QXR0cmliUG9pbnRlcihwb3NpdGlvbkxvY2F0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAs
ICZtX3RyYW5zZm9ybWVkQm91bmRzKTsKKyAgICAgICAgZmxvYXQgY2FudmFzV2lkdGhSYXRpbyA9
IDEuMGY7CisgICAgICAgIGZsb2F0IGNhbnZhc0hlaWdodFJhdGlvID0gMS4wZjsKKyAgICAgICAg
ZmxvYXQgdXBzaWRlRG93bls0ICogMl0gPSB7IDAsIDEsICAwLCAxIC0gY2FudmFzSGVpZ2h0UmF0
aW8sICBjYW52YXNXaWR0aFJhdGlvLCAxIC0gY2FudmFzSGVpZ2h0UmF0aW8sICBjYW52YXNXaWR0
aFJhdGlvLCAxIH07CisgICAgICAgIC8vIEZsaXAgdGhlIHRleHR1cmUgWSBheGlzIGJlY2F1c2Ug
T3BlbkdMIGFuZCBTa2lhIGhhdmUgZGlmZmVyZW50IG9yaWdpbnMKKyAgICAgICAgZ2xWZXJ0ZXhB
dHRyaWJQb2ludGVyKHRleENvb3JkTG9jYXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwg
dXBzaWRlRG93bik7CisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXhJ
RCk7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOworICAgICAg
ICBwdGhyZWFkX211dGV4X3VubG9jayhtX2Zyb250QnVmZmVyTG9jayk7CisgICAgICAgIC8vIEZJ
WE1FOiBJZiB0aGUgY2FudmFzL3RleHR1cmUgaXMgbGFyZ2VyIHRoYW4gMjA0OHgyMDQ4LCB0aGVu
IHdlJ2xsIGRpZSBoZXJlCisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAo
bV90ZXhJRCkgeworICAgICAgICBtX2xheWVyUmVuZGVyZXItPmFkZExheWVyVG9SZWxlYXNlVGV4
dHVyZVJlc291cmNlc0xpc3QodGhpcyk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtX2Zy
b250QnVmZmVyTG9jayk7CisKKyAgICAgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Cisg
ICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXhJRCk7CisgICAgICAgIGds
VmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkxvY2F0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFM
U0UsIDAsICZtX3RyYW5zZm9ybWVkQm91bmRzKTsKKyAgICAgICAgZmxvYXQgdXBzaWRlRG93bls0
ICogMl0gPSB7IDAsIDEsICAwLCAwLCAgMSwgMCwgIDEsIDEgfTsKKyAgICAgICAgZ2xWZXJ0ZXhB
dHRyaWJQb2ludGVyKHRleENvb3JkTG9jYXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwg
dXBzaWRlRG93bik7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV90aWxlci0+ZHJhd1RleHR1cmVzKHRo
aXMsIHBvc2l0aW9uTG9jYXRpb24sIHRleENvb3JkTG9jYXRpb24pOworfQorCit2b2lkIExheWVy
Q29tcG9zaXRpbmdUaHJlYWQ6OmRyYXdTdXJmYWNlKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4
JiBkcmF3VHJhbnNmb3JtLCBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBtYXNrLCBpbnQgcG9zaXRp
b25Mb2NhdGlvbiwgaW50IHRleENvb3JkTG9jYXRpb24pCit7CisgICAgaWYgKG1fbGF5ZXJSZW5k
ZXJlci0+bGF5ZXJBbHJlYWR5T25TdXJmYWNlKHRoaXMpKSB7CisgICAgICAgIHVuc2lnbmVkIHRl
eElEID0gbGF5ZXJSZW5kZXJlclN1cmZhY2UoKS0+dGV4dHVyZSgpLT50ZXh0dXJlSWQoKTsKKyAg
ICAgICAgaWYgKCF0ZXhJRCkgeworICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdGV4dHVyZUNhY2hlQ29tcG9z
aXRpbmdUaHJlYWQoKS0+dGV4dHVyZUFjY2Vzc2VkKGxheWVyUmVuZGVyZXJTdXJmYWNlKCktPnRl
eHR1cmUoKSk7CisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4SUQpOwor
CisgICAgICAgIGlmIChtYXNrKSB7CisgICAgICAgICAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVY
VFVSRTEpOworICAgICAgICAgICAgbWFzay0+YmluZENvbnRlbnRzVGV4dHVyZSgpOworICAgICAg
ICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICAgICAgfQorCisgICAgICAg
IEZsb2F0UXVhZCBzdXJmYWNlUXVhZCA9IGdldFRyYW5zZm9ybWVkUmVjdChtX2JvdW5kcywgSW50
UmVjdChJbnRQb2ludDo6emVybygpLCBtX2JvdW5kcyksIGRyYXdUcmFuc2Zvcm0pOworICAgICAg
ICBnbFZlcnRleEF0dHJpYlBvaW50ZXIocG9zaXRpb25Mb2NhdGlvbiwgMiwgR0xfRkxPQVQsIEdM
X0ZBTFNFLCAwLCAmc3VyZmFjZVF1YWQpOworCisgICAgICAgIGZsb2F0IHRleGNvb3Jkc1s0ICog
Ml0gPSB7IDAsIDAsICAwLCAxLCAgMSwgMSwgIDEsIDAgfTsKKyAgICAgICAgZ2xWZXJ0ZXhBdHRy
aWJQb2ludGVyKHRleENvb3JkTG9jYXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgdGV4
Y29vcmRzKTsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Cisg
ICAgfQorfQorCit2b2lkIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OmRyYXdNaXNzaW5nVGV4dHVy
ZXMoaW50IHBvc2l0aW9uTG9jYXRpb24sIGludCB0ZXhDb29yZExvY2F0aW9uLCBjb25zdCBGbG9h
dFJlY3QmIHZpc2libGVSZWN0KQoreworICAgIGlmIChtX3BsdWdpblZpZXcgfHwgbV90ZXhJRCkK
KyAgICAgICAgcmV0dXJuOworCisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlmIChtX21lZGlhUGxh
eWVyKQorICAgICAgICByZXR1cm47CisjZW5kaWYKKworICAgIG1fdGlsZXItPmRyYXdNaXNzaW5n
VGV4dHVyZXModGhpcywgcG9zaXRpb25Mb2NhdGlvbiwgdGV4Q29vcmRMb2NhdGlvbik7Cit9CisK
K3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6cmVsZWFzZVRleHR1cmVSZXNvdXJjZXMoKQor
eworICAgIGlmIChtX3BsdWdpblZpZXcgJiYgbV9wbHVnaW5CdWZmZXIpIHsKKyAgICAgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpyZWxlYXNlQnVmZmVyR0xUZXh0dXJlKG1fcGx1
Z2luQnVmZmVyKTsKKyAgICAgICAgbV9wbHVnaW5CdWZmZXIgPSAwOworICAgICAgICBtX3BsdWdp
blZpZXctPnVubG9ja0Zyb250QnVmZmVyKCk7CisgICAgfQorICAgIGlmIChtX3RleElEICYmIG1f
ZnJvbnRCdWZmZXJMb2NrKQorICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jayhtX2Zyb250QnVm
ZmVyTG9jayk7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0UGx1Z2luVmll
dyhQbHVnaW5WaWV3KiBwbHVnaW5WaWV3KQoreworICAgIGlmICghaXNDb21wb3NpdGluZ1RocmVh
ZCgpKSB7CisgICAgICAgIGRpc3BhdGNoU3luY0NvbXBvc2l0aW5nTWVzc2FnZShCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAgICAgICAmTGF5ZXJD
b21wb3NpdGluZ1RocmVhZDo6c2V0UGx1Z2luVmlldywKKyAgICAgICAgICAgIHRoaXMsCisgICAg
ICAgICAgICBwbHVnaW5WaWV3KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX3Bs
dWdpblZpZXcgPSBwbHVnaW5WaWV3OworfQorCisjaWYgRU5BQkxFKFZJREVPKQordm9pZCBMYXll
ckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllciogbWVkaWFQbGF5
ZXIpCit7CisgICAgaWYgKCFpc0NvbXBvc2l0aW5nVGhyZWFkKCkpIHsKKyAgICAgICAgZGlzcGF0
Y2hTeW5jQ29tcG9zaXRpbmdNZXNzYWdlKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpjcmVhdGVNZXRo
b2RDYWxsTWVzc2FnZSgKKyAgICAgICAgICAgICZMYXllckNvbXBvc2l0aW5nVGhyZWFkOjpzZXRN
ZWRpYVBsYXllciwKKyAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICBtZWRpYVBsYXllcikp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9tZWRpYVBsYXllciA9IG1lZGlhUGxh
eWVyOworfQorI2VuZGlmCisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6Y2xlYXJBbmlt
YXRpb25zKCkKK3sKKyAgICAvLyBBbmltYXRpb25zIGRvbid0IHVzZSB0aHJlYWQgc2FmZSByZWZj
b3VudGluZywgYW5kIG11c3Qgb25seSBiZQorICAgIC8vIHRvdWNoZWQgd2hlbiB0aGUgdHdvIHRo
cmVhZHMgYXJlIGluIHN5bmMuCisgICAgaWYgKCFpc0NvbXBvc2l0aW5nVGhyZWFkKCkpIHsKKyAg
ICAgICAgZGlzcGF0Y2hTeW5jQ29tcG9zaXRpbmdNZXNzYWdlKEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgKKyAgICAgICAgICAgICZMYXllckNvbXBvc2l0aW5n
VGhyZWFkOjpjbGVhckFuaW1hdGlvbnMsCisgICAgICAgICAgICB0aGlzKSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBtX3J1bm5pbmdBbmltYXRpb25zLmNsZWFyKCk7CisgICAgbV9z
dXNwZW5kZWRBbmltYXRpb25zLmNsZWFyKCk7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZDo6cmVtb3ZlU3VibGF5ZXIoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogc3VibGF5ZXIpCit7
CisgICAgQVNTRVJUKGlzQ29tcG9zaXRpbmdUaHJlYWQoKSk7CisKKyAgICBpbnQgZm91bmRJbmRl
eCA9IGluZGV4T2ZTdWJsYXllcihzdWJsYXllcik7CisgICAgaWYgKGZvdW5kSW5kZXggPT0gLTEp
CisgICAgICAgIHJldHVybjsKKworICAgIHN1YmxheWVyLT5zZXRTdXBlcmxheWVyKDApOworICAg
IG1fc3VibGF5ZXJzLnJlbW92ZShmb3VuZEluZGV4KTsKK30KKworaW50IExheWVyQ29tcG9zaXRp
bmdUaHJlYWQ6OmluZGV4T2ZTdWJsYXllcihjb25zdCBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBy
ZWZlcmVuY2UpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3N1YmxheWVycy5zaXpl
KCk7IGkrKykgeworICAgICAgICBpZiAobV9zdWJsYXllcnNbaV0gPT0gcmVmZXJlbmNlKQorICAg
ICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworY29uc3QgTGF5
ZXJDb21wb3NpdGluZ1RocmVhZCogTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6cm9vdExheWVyKCkg
Y29uc3QKK3sKKyAgICBjb25zdCBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllciA9IHRoaXM7
CisgICAgZm9yIChMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBzdXBlcmxheWVyID0gbGF5ZXItPnN1
cGVybGF5ZXIoKTsgc3VwZXJsYXllcjsgbGF5ZXIgPSBzdXBlcmxheWVyLCBzdXBlcmxheWVyID0g
c3VwZXJsYXllci0+c3VwZXJsYXllcigpKSB7IH0KKyAgICByZXR1cm4gbGF5ZXI7Cit9CisKK3Zv
aWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKQoreworICAg
IGlmIChtX3N1cGVybGF5ZXIpCisgICAgICAgIG1fc3VwZXJsYXllci0+cmVtb3ZlU3VibGF5ZXIo
dGhpcyk7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0U3VibGF5ZXJzKGNv
bnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1RocmVhZD4gPiYgc3VibGF5ZXJzKQor
eworICAgIGlmIChzdWJsYXllcnMgPT0gbV9zdWJsYXllcnMpCisgICAgICAgIHJldHVybjsKKwor
ICAgIHdoaWxlIChtX3N1YmxheWVycy5zaXplKCkpIHsKKyAgICAgICAgUmVmUHRyPExheWVyQ29t
cG9zaXRpbmdUaHJlYWQ+IGxheWVyID0gbV9zdWJsYXllcnNbMF0uZ2V0KCk7CisgICAgICAgIEFT
U0VSVChsYXllci0+c3VwZXJsYXllcigpKTsKKyAgICAgICAgbGF5ZXItPnJlbW92ZUZyb21TdXBl
cmxheWVyKCk7CisgICAgfQorCisgICAgbV9zdWJsYXllcnMuY2xlYXIoKTsKKworICAgIHNpemVf
dCBsaXN0U2l6ZSA9IHN1YmxheWVycy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBsaXN0U2l6ZTsgaSsrKSB7CisgICAgICAgIFJlZlB0cjxMYXllckNvbXBvc2l0aW5nVGhyZWFk
PiBzdWJsYXllciA9IHN1YmxheWVyc1tpXTsKKyAgICAgICAgc3VibGF5ZXItPnJlbW92ZUZyb21T
dXBlcmxheWVyKCk7CisgICAgICAgIHN1YmxheWVyLT5zZXRTdXBlcmxheWVyKHRoaXMpOworICAg
ICAgICBtX3N1YmxheWVycy5pbnNlcnQoaSwgc3VibGF5ZXIpOworICAgIH0KK30KKwordm9pZCBM
YXllckNvbXBvc2l0aW5nVGhyZWFkOjp1cGRhdGVUZXh0dXJlQ29udGVudHNJZk5lZWRlZCgpCit7
CisgICAgaWYgKG1fdGV4SUQgfHwgcGx1Z2luVmlldygpKQorICAgICAgICByZXR1cm47CisKKyNp
ZiBFTkFCTEUoVklERU8pCisgICAgaWYgKG1lZGlhUGxheWVyKCkpCisgICAgICAgIHJldHVybjsK
KyNlbmRpZgorCisgICAgbV90aWxlci0+dXBsb2FkVGV4dHVyZXNJZk5lZWRlZCgpOworfQorCit2
b2lkIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnNldFZpc2libGUoYm9vbCB2aXNpYmxlKQorewor
ICAgIGlmICh2aXNpYmxlID09IG1fdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV92
aXNpYmxlID0gdmlzaWJsZTsKKworICAgIGlmIChtX3RleElEIHx8IHBsdWdpblZpZXcoKSkKKyAg
ICAgICAgcmV0dXJuOworCisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlmIChtZWRpYVBsYXllcigp
KQorICAgICAgICByZXR1cm47CisjZW5kaWYKKworICAgIG1fdGlsZXItPmxheWVyVmlzaWJpbGl0
eUNoYW5nZWQodmlzaWJsZSk7Cit9CisKK3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2V0
TmVlZHNDb21taXQoKQoreworICAgIGlmIChtX2xheWVyUmVuZGVyZXIpCisgICAgICAgIG1fbGF5
ZXJSZW5kZXJlci0+c2V0TmVlZHNDb21taXQoKTsKK30KKwordm9pZCBMYXllckNvbXBvc2l0aW5n
VGhyZWFkOjpzY2hlZHVsZUNvbW1pdCgpCit7CisgICAgaWYgKCFpc1dlYktpdFRocmVhZCgpKSB7
CisgICAgICAgIGlmIChtX2NvbW1pdFNjaGVkdWxlZCkKKyAgICAgICAgICAgIHJldHVybjsKKwor
ICAgICAgICBtX2NvbW1pdFNjaGVkdWxlZCA9IHRydWU7CisKKyAgICAgICAgZGlzcGF0Y2hXZWJL
aXRNZXNzYWdlKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgm
TGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6c2NoZWR1bGVDb21taXQsIHRoaXMpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIG1fY29tbWl0U2NoZWR1bGVkID0gZmFsc2U7CisKKyAgICAv
LyBGSVhNRTogVGhlIG9ubHkgd2F5IHRvIGdldCBhdCBvdXIgTGF5ZXJXZWJLaXRUaHJlYWQgaXMg
dG8gZ28gdGhyb3VnaCB0aGUgdGlsZXIuCisgICAgaWYgKExheWVyV2ViS2l0VGhyZWFkKiBsYXll
ciA9IG1fdGlsZXItPmxheWVyKCkpCisgICAgICAgIGxheWVyLT5zZXROZWVkc0NvbW1pdCgpOwor
fQorCitib29sIExheWVyQ29tcG9zaXRpbmdUaHJlYWQ6OnVwZGF0ZUFuaW1hdGlvbnMoZG91Ymxl
IGN1cnJlbnRUaW1lKQoreworICAgIC8vIFRoZSBjb21taXQgbWVjaGFuaXNtIGFsd2F5cyBvdmVy
d3JpdGVzIG91ciBzdGF0ZSB3aXRoIHN0YXRlIGZyb20gdGhlCisgICAgLy8gV2ViS2l0IHRocmVh
ZC4gVGhpcyBtZWFucyB3ZSBoYXZlIHRvIHJlc3RvcmUgdGhlIGxhc3QgYW5pbWF0ZWQgdmFsdWUg
Zm9yCisgICAgLy8gc3VzcGVuZGVkIGFuaW1hdGlvbnMuCisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBtX3N1c3BlbmRlZEFuaW1hdGlvbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgTGF5ZXJB
bmltYXRpb24qIGFuaW1hdGlvbiA9IG1fc3VzcGVuZGVkQW5pbWF0aW9uc1tpXS5nZXQoKTsKKyAg
ICAgICAgLy8gRnJvbSBsb29raW5nIGF0IHRoZSBXZWJDb3JlIGNvZGUsIGl0IGFwcGVhcnMgdGhh
dCB3aGVuIHRoZSBhbmltYXRpb24KKyAgICAgICAgLy8gaXMgcGF1c2VkLCB0aGUgdGltZU9mZnNl
dCBpcyBtb2RpZmllZCBzbyBpdCB3aWxsIGJlIGFuIGFwcHJvcHJpYXRlCisgICAgICAgIC8vIGVs
YXBzZWRUaW1lLgorICAgICAgICBkb3VibGUgZWxhcHNlZFRpbWUgPSBhbmltYXRpb24tPnRpbWVP
ZmZzZXQoKTsKKyAgICAgICAgYW5pbWF0aW9uLT5hcHBseSh0aGlzLCBlbGFwc2VkVGltZSk7Cisg
ICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3J1bm5pbmdBbmltYXRpb25zLnNp
emUoKTsgKytpKSB7CisgICAgICAgIExheWVyQW5pbWF0aW9uKiBhbmltYXRpb24gPSBtX3J1bm5p
bmdBbmltYXRpb25zW2ldLmdldCgpOworICAgICAgICBkb3VibGUgZWxhcHNlZFRpbWUgPSAobV9z
dXNwZW5kVGltZSA/IG1fc3VzcGVuZFRpbWUgOiBjdXJyZW50VGltZSkgLSBhbmltYXRpb24tPnN0
YXJ0VGltZSgpICsgYW5pbWF0aW9uLT50aW1lT2Zmc2V0KCk7CisgICAgICAgIGFuaW1hdGlvbi0+
YXBwbHkodGhpcywgZWxhcHNlZFRpbWUpOworICAgIH0KKworICAgIHJldHVybiAhbV9ydW5uaW5n
QW5pbWF0aW9ucy5pc0VtcHR5KCk7Cit9CisKK2Jvb2wgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6
aGFzVmlzaWJsZUhvbGVQdW5jaFJlY3QoKSBjb25zdAoreworICAgIGlmIChtX3BsdWdpblZpZXcg
JiYgIW1faXNWaXNpYmxlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBFTkFCTEUoVklE
RU8pCisgICAgaWYgKG1fbWVkaWFQbGF5ZXIgJiYgIW1faXNWaXNpYmxlKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisjZW5kaWYKKworICAgIHJldHVybiBoYXNIb2xlUHVuY2hSZWN0KCk7Cit9CisK
K3ZvaWQgTGF5ZXJDb21wb3NpdGluZ1RocmVhZDo6Y3JlYXRlTGF5ZXJSZW5kZXJlclN1cmZhY2Uo
KQoreworICAgIEFTU0VSVCghbV9sYXllclJlbmRlcmVyU3VyZmFjZSk7CisgICAgbV9sYXllclJl
bmRlcmVyU3VyZmFjZSA9IGFkb3B0UHRyKG5ldyBMYXllclJlbmRlcmVyU3VyZmFjZShtX2xheWVy
UmVuZGVyZXIsIHRoaXMpKTsKK30KKworfQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
YmxhY2tiZXJyeS9MYXllckNvbXBvc2l0aW5nVGhyZWFkLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0xheWVyQ29tcG9zaXRpbmdUaHJlYWQuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi5lMWRlNzRlOGYxZjBjOTVmYTU1NmU1MTVjYWZjMmRlYTUwMGI2OGRjCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9MYXll
ckNvbXBvc2l0aW5nVGhyZWFkLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoK
KyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisKKyNpZm5kZWYgTGF5ZXJDb21wb3NpdGluZ1RocmVhZF9oCisjZGVmaW5lIExheWVy
Q29tcG9zaXRpbmdUaHJlYWRfaAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQor
CisjaW5jbHVkZSAiRmxvYXRRdWFkLmgiCisjaW5jbHVkZSAiTGF5ZXJEYXRhLmgiCisjaW5jbHVk
ZSAiTGF5ZXJSZW5kZXJlclN1cmZhY2UuaCIKKyNpbmNsdWRlICJMYXllclRpbGVyLmgiCisKKyNp
bmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HdWFyZGVkUG9pbnRlci5oPgorI2luY2x1ZGUgPHd0
Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1l
c3BhY2UgUGxhdGZvcm0geworbmFtZXNwYWNlIEdyYXBoaWNzIHsKK2NsYXNzIEJ1ZmZlcjsKK30K
K30KK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBEZXN0cm95T25Db21wb3NpdGlu
Z1RocmVhZDsKK2NsYXNzIExheWVyUmVuZGVyZXI7CisKK2NsYXNzIExheWVyQ29tcG9zaXRpbmdU
aHJlYWQgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8TGF5ZXJDb21wb3NpdGluZ1RocmVh
ZD4sIHB1YmxpYyBMYXllckRhdGEsIHB1YmxpYyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3VhcmRl
ZFBvaW50ZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxMYXllckNvbXBv
c2l0aW5nVGhyZWFkPiBjcmVhdGUoTGF5ZXJUeXBlLCBQYXNzUmVmUHRyPExheWVyVGlsZXI+KTsK
KworICAgIH5MYXllckNvbXBvc2l0aW5nVGhyZWFkKCk7CisKKyAgICAvLyBUaHJlYWQgc2FmZQor
ICAgIHZvaWQgc2V0UGx1Z2luVmlldyhQbHVnaW5WaWV3Kik7CisjaWYgRU5BQkxFKFZJREVPKQor
ICAgIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIqKTsKKyNlbmRpZgorICAgIHZvaWQg
Y2xlYXJBbmltYXRpb25zKCk7CisKKyAgICAvLyBOb3QgdGhyZWFkIHNhZmUKKworICAgIC8vIFJl
dHVybnMgdHJ1ZSBpZiB3ZSBoYXZlIGFuIGFuaW1hdGlvbgorICAgIGJvb2wgdXBkYXRlQW5pbWF0
aW9ucyhkb3VibGUgY3VycmVudFRpbWUpOworICAgIHZvaWQgdXBkYXRlVGV4dHVyZUNvbnRlbnRz
SWZOZWVkZWQoKTsKKyAgICB2b2lkIGJpbmRDb250ZW50c1RleHR1cmUoKQorICAgIHsKKyAgICAg
ICAgaWYgKG1fdGlsZXIpCisgICAgICAgICAgICBtX3RpbGVyLT5iaW5kQ29udGVudHNUZXh0dXJl
KCk7CisgICAgfQorCisgICAgY29uc3QgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogcm9vdExheWVy
KCkgY29uc3Q7CisgICAgdm9pZCBzZXRTdWJsYXllcnMoY29uc3QgVmVjdG9yPFJlZlB0cjxMYXll
ckNvbXBvc2l0aW5nVGhyZWFkPiA+Jik7CisgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxMYXllckNv
bXBvc2l0aW5nVGhyZWFkPiA+JiBnZXRTdWJsYXllcnMoKSBjb25zdCB7IHJldHVybiBtX3N1Ymxh
eWVyczsgfQorICAgIHZvaWQgc2V0U3VwZXJsYXllcihMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBz
dXBlcmxheWVyKSB7IG1fc3VwZXJsYXllciA9IHN1cGVybGF5ZXI7IH0KKyAgICBMYXllckNvbXBv
c2l0aW5nVGhyZWFkKiBzdXBlcmxheWVyKCkgY29uc3QgeyByZXR1cm4gbV9zdXBlcmxheWVyOyB9
CisKKyAgICAvLyBUaGUgbGF5ZXIgcmVuZGVyZXIgbXVzdCBiZSBzZXQgaWYgdGhlIGxheWVyIGhh
cyBiZWVuIHJlbmRlcmVkCisgICAgdm9pZCBzZXRMYXllclJlbmRlcmVyKExheWVyUmVuZGVyZXIq
KTsKKworICAgIHZvaWQgc2V0RHJhd1RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYpOworICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBkcmF3VHJhbnNmb3JtKCkgY29u
c3QgeyByZXR1cm4gbV9kcmF3VHJhbnNmb3JtOyB9CisKKyAgICB2b2lkIHNldERyYXdPcGFjaXR5
KGZsb2F0IG9wYWNpdHkpIHsgbV9kcmF3T3BhY2l0eSA9IG9wYWNpdHk7IH0KKyAgICBmbG9hdCBk
cmF3T3BhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZHJhd09wYWNpdHk7IH0KKworICAgIHZvaWQg
Y3JlYXRlTGF5ZXJSZW5kZXJlclN1cmZhY2UoKTsKKyAgICBMYXllclJlbmRlcmVyU3VyZmFjZSog
bGF5ZXJSZW5kZXJlclN1cmZhY2UoKSBjb25zdCB7IHJldHVybiBtX2xheWVyUmVuZGVyZXJTdXJm
YWNlLmdldCgpOyB9CisgICAgdm9pZCBjbGVhckxheWVyUmVuZGVyZXJTdXJmYWNlKCkgeyBtX2xh
eWVyUmVuZGVyZXJTdXJmYWNlLmNsZWFyKCk7IH0KKworICAgIHZvaWQgc2V0TWFza0xheWVyKExh
eWVyQ29tcG9zaXRpbmdUaHJlYWQqIG1hc2tMYXllcikgeyBtX21hc2tMYXllciA9IG1hc2tMYXll
cjsgfQorICAgIExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIG1hc2tMYXllcigpIGNvbnN0IHsgcmV0
dXJuIG1fbWFza0xheWVyLmdldCgpOyB9CisKKyAgICB2b2lkIHNldFJlcGxpY2FMYXllcihMYXll
ckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllcikgeyBtX3JlcGxpY2FMYXllciA9IGxheWVyOyB9Cisg
ICAgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogcmVwbGljYUxheWVyKCkgY29uc3QgeyByZXR1cm4g
bV9yZXBsaWNhTGF5ZXIuZ2V0KCk7IH0KKworICAgIEZsb2F0UmVjdCBnZXREcmF3UmVjdCgpIGNv
bnN0IHsgcmV0dXJuIG1fZHJhd1JlY3Q7IH0KKyAgICBjb25zdCBGbG9hdFF1YWQmIGdldFRyYW5z
Zm9ybWVkQm91bmRzKCkgY29uc3QgeyByZXR1cm4gbV90cmFuc2Zvcm1lZEJvdW5kczsgfQorICAg
IEZsb2F0UXVhZCBnZXRUcmFuc2Zvcm1lZEhvbGVQdW5jaFJlY3QoKSBjb25zdDsKKworICAgIHZv
aWQgZGVsZXRlVGV4dHVyZXMoKTsKKworICAgIHZvaWQgZHJhd1RleHR1cmVzKGludCBwb3NpdGlv
bkxvY2F0aW9uLCBpbnQgdGV4Q29vcmRMb2NhdGlvbiwgY29uc3QgRmxvYXRSZWN0JiB2aXNpYmxl
UmVjdCk7CisgICAgYm9vbCBoYXNNaXNzaW5nVGV4dHVyZXMoKSBjb25zdCB7IHJldHVybiBtX3Rp
bGVyID8gbV90aWxlci0+aGFzTWlzc2luZ1RleHR1cmVzKCkgOiBmYWxzZTsgfQorICAgIHZvaWQg
ZHJhd01pc3NpbmdUZXh0dXJlcyhpbnQgcG9zaXRpb25Mb2NhdGlvbiwgaW50IHRleENvb3JkTG9j
YXRpb24sIGNvbnN0IEZsb2F0UmVjdCYgdmlzaWJsZVJlY3QpOworICAgIHZvaWQgZHJhd1N1cmZh
Y2UoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmLCBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBt
YXNrLCBpbnQgcG9zaXRpb25Mb2NhdGlvbiwgaW50IHRleENvb3JkTG9jYXRpb24pOworICAgIGJv
b2wgaXNEaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fdGlsZXIgPyBtX3RpbGVyLT5oYXNEaXJ0eVRp
bGVzKCkgOiBmYWxzZTsgfQorCisgICAgdm9pZCByZWxlYXNlVGV4dHVyZVJlc291cmNlcygpOwor
CisgICAgLy8gTGF5ZXIgdmlzaWJpbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBMYXllclJlbmRl
cmVyIHdoZW4gZHJhd2luZy4KKyAgICAvLyBTbyB3ZSBkb24ndCBoYXZlIGFuIGFjY3VyYXRlIHZh
bHVlIGZvciB2aXNpYmlsaXR5IHVudGlsIGl0J3MgdG9vIGxhdGUsCisgICAgLy8gYnV0IHRoZSBh
dHRyaWJ1dGUgc3RpbGwgaXMgdXNlZnVsLgorICAgIGJvb2wgaXNWaXNpYmxlKCkgY29uc3QgeyBy
ZXR1cm4gbV92aXNpYmxlOyB9CisgICAgdm9pZCBzZXRWaXNpYmxlKGJvb2wpOworCisgICAgLy8g
VGhpcyB3aWxsIGNhdXNlIGEgY29tbWl0IG9mIHRoZSB3aG9sZSBsYXllciB0cmVlIG9uIHRoZSBX
ZWJLaXQgdGhyZWFkLAorICAgIC8vIHNvbWV0aW1lIGFmdGVyIHJlbmRlcmluZyBpcyBmaW5pc2hl
ZC4gVXNlZCB3aGVuIHJlbmRlcmluZyByZXN1bHRzIGluIGEKKyAgICAvLyBuZWVkIGZvciBjb21t
aXQsIGZvciBleGFtcGxlIHdoZW4gYSBkaXJ0eSBsYXllciBiZWNvbWVzIHZpc2libGUuCisgICAg
dm9pZCBzZXROZWVkc0NvbW1pdCgpOworCisgICAgLy8gTm9ybWFsbHkgeW91IHdvdWxkIHNjaGVk
dWxlIGEgY29tbWl0IGZyb20gdGhlIHdlYmtpdCB0aHJlYWQsIGJ1dAorICAgIC8vIHRoaXMgYWxs
b3dzIHlvdSB0byBkbyBpdCBmcm9tIHRoZSBjb21wb3NpdGluZyB0aHJlYWQuCisgICAgdm9pZCBz
Y2hlZHVsZUNvbW1pdCgpOworCisgICAgLy8gVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0
byB1cGRhdGUgYW5pbWF0ZWQgcHJvcGVydGllcyBpbiBMYXllckFuaW1hdGlvbi4KKyAgICB2b2lk
IHNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSkgeyBtX29wYWNpdHkgPSBvcGFjaXR5OyB9CisgICAg
dm9pZCBzZXRUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCkgeyBt
X3RyYW5zZm9ybSA9IG1hdHJpeDsgfQorCisgICAgYm9vbCBoYXNSdW5uaW5nQW5pbWF0aW9ucygp
IGNvbnN0IHsgcmV0dXJuICFtX3J1bm5pbmdBbmltYXRpb25zLmlzRW1wdHkoKTsgfQorCisgICAg
Ym9vbCBoYXNWaXNpYmxlSG9sZVB1bmNoUmVjdCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIExh
eWVyQ29tcG9zaXRpbmdUaHJlYWQoTGF5ZXJUeXBlLCBQYXNzUmVmUHRyPExheWVyVGlsZXI+KTsK
KworICAgIGZyaWVuZCBjbGFzcyBEZXN0cm95T25Db21wb3NpdGluZ1RocmVhZDsKKyAgICB2b2lk
IGRlc3Ryb3lPbkNvbXBvc2l0aW5nVGhyZWFkKCk7CisKKyAgICB2b2lkIHVwZGF0ZVRpbGVDb250
ZW50cyhjb25zdCBJbnRSZWN0JiB0aWxlKTsKKworICAgIHZvaWQgcmVtb3ZlRnJvbVN1cGVybGF5
ZXIoKTsKKworICAgIHNpemVfdCBudW1TdWJsYXllcnMoKSBjb25zdCB7IHJldHVybiBtX3N1Ymxh
eWVycy5zaXplKCk7IH0KKworICAgIC8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzdWJsYXll
ciBvciAtMSBpZiBub3QgZm91bmQuCisgICAgaW50IGluZGV4T2ZTdWJsYXllcihjb25zdCBMYXll
ckNvbXBvc2l0aW5nVGhyZWFkKik7CisKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxl
ZCBmcm9tIHJlbW92ZUZyb21TdXBlcmxheWVyLgorICAgIHZvaWQgcmVtb3ZlU3VibGF5ZXIoTGF5
ZXJDb21wb3NpdGluZ1RocmVhZCopOworCisgICAgTGF5ZXJSZW5kZXJlciogbV9sYXllclJlbmRl
cmVyOworCisgICAgdHlwZWRlZiBWZWN0b3I8UmVmUHRyPExheWVyQ29tcG9zaXRpbmdUaHJlYWQ+
ID4gTGF5ZXJMaXN0OworICAgIExheWVyTGlzdCBtX3N1YmxheWVyczsKKyAgICBMYXllckNvbXBv
c2l0aW5nVGhyZWFkKiBtX3N1cGVybGF5ZXI7CisKKyAgICAvLyBWZXJ0ZXggZGF0YSBmb3IgdGhl
IGJvdW5kcyBvZiB0aGlzIGxheWVyCisgICAgRmxvYXRRdWFkIG1fdHJhbnNmb3JtZWRCb3VuZHM7
CisgICAgLy8gVGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgdHJhbnNmb3JtZWQgbGF5ZXIK
KyAgICBGbG9hdFJlY3QgbV9kcmF3UmVjdDsKKworICAgIE93blB0cjxMYXllclJlbmRlcmVyU3Vy
ZmFjZT4gbV9sYXllclJlbmRlcmVyU3VyZmFjZTsKKworICAgIFJlZlB0cjxMYXllckNvbXBvc2l0
aW5nVGhyZWFkPiBtX21hc2tMYXllcjsKKyAgICBSZWZQdHI8TGF5ZXJDb21wb3NpdGluZ1RocmVh
ZD4gbV9yZXBsaWNhTGF5ZXI7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OkJ1ZmZlciogbV9wbHVnaW5CdWZmZXI7CisKKyAgICAvLyBUaGUgZ2xvYmFsIHByb3BlcnR5IHZh
bHVlcywgYWZ0ZXIgY29uY2F0ZW5hdGlvbiB3aXRoIHBhcmVudCB2YWx1ZXMKKyAgICBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCBtX2RyYXdUcmFuc2Zvcm07CisgICAgZmxvYXQgbV9kcmF3T3BhY2l0eTsK
KworICAgIGJvb2wgbV92aXNpYmxlOworICAgIGJvb2wgbV9jb21taXRTY2hlZHVsZWQ7CisKKyAg
ICBSZWZQdHI8TGF5ZXJUaWxlcj4gbV90aWxlcjsKK307CisKK30KKworI2VuZGlmIC8vIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlmCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>