<?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>80121</bug_id>
          
          <creation_ts>2012-03-02 00:50:16 -0800</creation_ts>
          <short_desc>[BlackBerry] Upstream Texture and TextureCache</short_desc>
          <delta_ts>2012-03-07 02:33:23 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit BlackBerry</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>73119</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Robin Cao">robin.webkit</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>arvid2.nilsson</cc>
    
    <cc>charles.wei</cc>
    
    <cc>leo.yang</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>569386</commentid>
    <comment_count>0</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-02 00:50:16 -0800</bug_when>
    <thetext>Class Texture encapsulates an OpenGL texture, while TextureCache maintains a LRU cache for all OpenGL textures.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>569437</commentid>
    <comment_count>1</comment_count>
      <attachid>129847</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-02 01:58:23 -0800</bug_when>
    <thetext>Created attachment 129847
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570298</commentid>
    <comment_count>2</comment_count>
      <attachid>129847</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-03-04 16:14:10 -0800</bug_when>
    <thetext>Comment on attachment 129847
patch

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

Looks good overall, but can be improved some more.

&gt; Source/WebCore/platform/graphics/blackberry/Texture.h:24
&gt; +#include &quot;Color.h&quot;

A forward reference could be enough.

&gt; Source/WebCore/platform/graphics/blackberry/Texture.h:28
&gt; +#include &lt;SkBitmap.h&gt;

Ditto.

&gt; Source/WebCore/platform/graphics/blackberry/Texture.h:50
&gt; +    }

I think that this would be clearer with an enum. So you could do Texture::create(ColorTexture|NormalTexture) or something and only need one create.

&gt; Source/WebCore/platform/graphics/blackberry/Texture.h:78
&gt; +    // The following method is only called by our dear friend.

Ha ha :) Not the best of comments, I think you can remove it without losing anything.

&gt; Source/WebCore/platform/graphics/blackberry/Texture.h:79
&gt; +    friend class TextureCacheCompositingThread;

Usually this is put just under private.

&gt; Source/WebCore/platform/graphics/blackberry/TextureCacheCompositingThread.cpp:30
&gt; +static const int defaultMemoryLimit = 64 * 1024 * 1024; // Bytes

Comment is a bit short... Maybe // Measured in bytes.

&gt; Source/WebCore/platform/graphics/blackberry/TextureCacheCompositingThread.cpp:97
&gt; +    int delta = (texture-&gt;width() * texture-&gt;height() - oldSize.width() * oldSize.height()) * texture-&gt;bytesPerPixel();

bytesPerPixel is staic, so could as well use Texturee: bytesPerPixel() to make it consistent

&gt; Source/WebCore/platform/graphics/blackberry/TextureCacheCompositingThread.h:77
&gt; +    // The following methods are called by Texture class.

Is this comment really relevant?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570529</commentid>
    <comment_count>3</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-05 02:07:44 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 129847 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=129847&amp;action=review
&gt; 
&gt; Looks good overall, but can be improved some more.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/Texture.h:24
&gt; &gt; +#include &quot;Color.h&quot;
&gt; 
&gt; A forward reference could be enough.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/Texture.h:28
&gt; &gt; +#include &lt;SkBitmap.h&gt;
&gt; 
&gt; Ditto.
&gt; 

Fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/Texture.h:50
&gt; &gt; +    }
&gt; 
&gt; I think that this would be clearer with an enum. So you could do Texture::create(ColorTexture|NormalTexture) or something and only need one create.
&gt; 

I have merge those two functions into one: Texture::create(bool isColor = false)

&gt; &gt; Source/WebCore/platform/graphics/blackberry/Texture.h:78
&gt; &gt; +    // The following method is only called by our dear friend.
&gt; 
&gt; Ha ha :) Not the best of comments, I think you can remove it without losing anything.
&gt; 

Removed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/Texture.h:79
&gt; &gt; +    friend class TextureCacheCompositingThread;
&gt; 
&gt; Usually this is put just under private.
&gt; 

Fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/TextureCacheCompositingThread.cpp:30
&gt; &gt; +static const int defaultMemoryLimit = 64 * 1024 * 1024; // Bytes
&gt; 
&gt; Comment is a bit short... Maybe // Measured in bytes.
&gt; 

Fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/TextureCacheCompositingThread.cpp:97
&gt; &gt; +    int delta = (texture-&gt;width() * texture-&gt;height() - oldSize.width() * oldSize.height()) * texture-&gt;bytesPerPixel();
&gt; 
&gt; bytesPerPixel is staic, so could as well use Texturee: bytesPerPixel() to make it consistent
&gt; 
Good catch, fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/TextureCacheCompositingThread.h:77
&gt; &gt; +    // The following methods are called by Texture class.
&gt; 
&gt; Is this comment really relevant?

I agree this can be removed.

Will update the patch soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570533</commentid>
    <comment_count>4</comment_count>
      <attachid>130084</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-05 02:23:31 -0800</bug_when>
    <thetext>Created attachment 130084
updated patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570651</commentid>
    <comment_count>5</comment_count>
      <attachid>130084</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-03-05 06:55:22 -0800</bug_when>
    <thetext>Comment on attachment 130084
updated patch

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

Looks good, please have a look at my remarks before landing, maybe Leo can set cq+ once that is done.

&gt; Source/WebCore/platform/graphics/blackberry/Texture.cpp:83
&gt; +    bool subImage = (tile.size() == m_size);

Could just be bool subImage = tile.size() == m_size;

&gt; Source/WebCore/platform/graphics/blackberry/Texture.cpp:91
&gt; +    IntSize yeOldeSize = size;

yeOldeSize sounds a bit silly, can just be oldSize.

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

Looks like it can be a forward class reference.

&gt; Source/WebCore/platform/graphics/blackberry/TextureCacheCompositingThread.h:29
&gt; +#include &lt;memory&gt;

Nothing in that file seems needed here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>572538</commentid>
    <comment_count>6</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-06 22:22:38 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 130084 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=130084&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/Texture.cpp:83
&gt; &gt; +    bool subImage = (tile.size() == m_size);
&gt; 
&gt; Could just be bool subImage = tile.size() == m_size;
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/Texture.cpp:91
&gt; &gt; +    IntSize yeOldeSize = size;
&gt; 
&gt; yeOldeSize sounds a bit silly, can just be oldSize.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/Texture.h:24
&gt; &gt; +#include &quot;IntRect.h&quot;
&gt; 
&gt; Looks like it can be a forward class reference.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/TextureCacheCompositingThread.h:29
&gt; &gt; +#include &lt;memory&gt;
&gt; 
&gt; Nothing in that file seems needed here?

Thank you very much! Will fix these before landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>572540</commentid>
    <comment_count>7</comment_count>
      <attachid>130545</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-06 22:27:41 -0800</bug_when>
    <thetext>Created attachment 130545
patch-for-landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>572724</commentid>
    <comment_count>8</comment_count>
      <attachid>130545</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-07 02:33:17 -0800</bug_when>
    <thetext>Comment on attachment 130545
patch-for-landing

Clearing flags on attachment: 130545

Committed r110040: &lt;http://trac.webkit.org/changeset/110040&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>572725</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-07 02:33:23 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129847</attachid>
            <date>2012-03-02 01:58:23 -0800</date>
            <delta_ts>2012-03-05 02:23:03 -0800</delta_ts>
            <desc>patch</desc>
            <filename>bug-80121-20120302175816.patch</filename>
            <type>text/plain</type>
            <size>30547</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5NTMwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggM2IyN2RhMTNkYzc0ODhh
NDc2OThiOTIwMTdhOTA4MjU1ODEzYjVlOS4uY2QyZjA0NGExMDczYTdhNzhlOThmMjIzNDcwMWM2
YTI0NmYwZDljOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDc5IEBACisyMDEyLTAzLTAyICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBUZXh0dXJlIGFuZCBUZXh0dXJlQ2FjaGUKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgwMTIxCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0cmVhbSwgbm8gbmV3IHRl
c3RzLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlJbWFn
ZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6VGV4dHVyZSk6CisgICAgICAgIChX
ZWJDb3JlOjpUZXh0dXJlOjp+VGV4dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjp1
cGRhdGVDb250ZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjpzZXRDb250ZW50c1Rv
Q29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6cHJvdGVjdCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlLmg6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZSk6CisgICAgICAgIChUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmU6
OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjpjcmVhdGVDb2xvcik6CisgICAg
ICAgIChXZWJDb3JlOjpUZXh0dXJlOjp0ZXh0dXJlSWQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dHVyZTo6aXNEaXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjpoYXNUZXh0dXJlKToK
KyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmU6OmlzQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6
VGV4dHVyZTo6aXNPcGFxdWUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6aXNQcm90ZWN0
ZWQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6cHJvdGVjdCk6CisgICAgICAgIChXZWJD
b3JlOjpUZXh0dXJlOjp1bnByb3RlY3QpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6c2l6
ZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjp3aWR0aCk6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0dXJlOjpoZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6Ynl0ZXNQZXJQ
aXhlbCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjpzZXRUZXh0dXJlSWQpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdU
aHJlYWQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoVGV4dHVyZVBy
b3RlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlUHJvdGVjdG9yOjpUZXh0dXJlUHJv
dGVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVQcm90ZWN0b3I6On5UZXh0dXJlUHJv
dGVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFk
OjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6YWxsb2NhdGVUZXh0dXJlSWQpOgorICAgICAgICAo
V2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmZyZWVUZXh0dXJlSWQpOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmNvbGxlY3RH
YXJiYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFk
Ojp0ZXh0dXJlUmVzaXplZCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3Np
dGluZ1RocmVhZDo6dGV4dHVyZURlc3Ryb3llZCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJl
Q2FjaGVDb21wb3NpdGluZ1RocmVhZDo6aW5zdGFsbCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6ZXZpY3QpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OnRleHR1cmVBY2Nlc3NlZCk6CisgICAgICAgIChX
ZWJDb3JlOjp0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCk6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6cHJ1bmUpOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmNsZWFyKToKKyAgICAgICAgKFdlYkNv
cmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpzZXRNZW1vcnlVc2FnZSk6CisgICAg
ICAgIChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6dGV4dHVyZUZvclRp
bGVkQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdU
aHJlYWQ6OnRleHR1cmVGb3JDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVD
b21wb3NpdGluZ1RocmVhZDo6dXBkYXRlQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmtleSk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZC5oOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJl
YWQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmNy
ZWF0ZVRleHR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdU
aHJlYWQ6Om1lbW9yeVVzYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBv
c2l0aW5nVGhyZWFkOjptZW1vcnlMaW1pdCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlQ2Fj
aGVDb21wb3NpdGluZ1RocmVhZDo6c2V0TWVtb3J5TGltaXQpOgorICAgICAgICAoV2ViQ29yZTo6
VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OnBydW5lKToKKyAgICAgICAgKFdlYkNvcmU6
OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpab21iaWVUZXh0dXJlOjpab21iaWVUZXh0
dXJlKToKKyAgICAgICAgKFpvbWJpZVRleHR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVy
ZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmluY01lbW9yeVVzYWdlKToKKyAgICAgICAgKFdlYkNv
cmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpkZWNNZW1vcnlVc2FnZSk6CisgICAg
ICAgIChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6Q29sb3JIYXNoOjpo
YXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpD
b2xvckhhc2g6OmVxdWFsKToKKyAgICAgICAgKENvbG9ySGFzaCk6CisgICAgICAgIChDb2xvckhh
c2hUcmFpdHMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJl
YWQ6OkNvbG9ySGFzaFRyYWl0czo6Y29uc3RydWN0RGVsZXRlZFZhbHVlKToKKyAgICAgICAgKFdl
YkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpDb2xvckhhc2hUcmFpdHM6Omlz
RGVsZXRlZFZhbHVlKToKKwogMjAxMi0wMy0wMiAgTHVrZSBNYWNwaGVyc29uICAgPG1hY3BoZXJz
b25AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIEhhbmRsZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lv
bkJyZWFrQWZ0ZXIsIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtCZWZvcmUgYW5kIENTU1By
b3BlcnR5V2Via2l0UmVnaW9uQnJlYWtJbnNpZGUgaW4gQ1NTU3R5bGVBcHBseVByb3BlcnR5Lgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9U
ZXh0dXJlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkv
VGV4dHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzA5YTIzOTRlNzEyNjg4MWQ2MjI4ZDBkODQzZGE3NzA5
MjhmOWUwMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2JsYWNrYmVycnkvVGV4dHVyZS5jcHAKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy
ZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwg
Qm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIlRleHR1cmUuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KworI2luY2x1ZGUgIlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkLmgiCisKKyNpbmNsdWRl
IDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3
dGYvT3duQXJyYXlQdHIuaD4KKworI2RlZmluZSBERUJVR19URVhUVVJFX1VQTE9BRFMgMAorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyB2b2lkIGNvcHlJbWFnZURhdGEodW5zaWduZWQg
Y2hhciogZHN0LCBpbnQgZHN0U3RyaWRlLCBpbnQgZHN0WCwgaW50IGRzdFksCisgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywgaW50IHNyY1N0cmlkZSwgaW50IHNy
Y1gsIGludCBzcmNZLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgZHN0ICs9IChkc3RZ
ICogZHN0U3RyaWRlKSArIChUZXh0dXJlOjpieXRlc1BlclBpeGVsKCkgKiBkc3RYKTsKKyAgICBz
cmMgKz0gKHNyY1kgKiBzcmNTdHJpZGUpICsgKFRleHR1cmU6OmJ5dGVzUGVyUGl4ZWwoKSAqIHNy
Y1gpOworICAgIGludCBsZW5ndGggPSBUZXh0dXJlOjpieXRlc1BlclBpeGVsKCkgKiB3aWR0aDsK
KworICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgbWVtY3B5
KGRzdCwgc3JjLCBsZW5ndGgpOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlOworICAgICAgICBz
cmMgKz0gc3JjU3RyaWRlOworICAgIH0KK30KKworVGV4dHVyZTo6VGV4dHVyZShib29sIGlzQ29s
b3IpCisgICAgOiBtX3Byb3RlY3Rpb25Db3VudCgwKQorICAgICwgbV90ZXh0dXJlSWQoMCkKKyAg
ICAsIG1faXNDb2xvcihpc0NvbG9yKQorICAgICwgbV9pc09wYXF1ZShmYWxzZSkKK3sKKyAgICB0
ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT5pbnN0YWxsKHRoaXMpOworfQorCitUZXh0
dXJlOjp+VGV4dHVyZSgpCit7CisgICAgdGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKS0+
dGV4dHVyZURlc3Ryb3llZCh0aGlzKTsKK30KKwordm9pZCBUZXh0dXJlOjp1cGRhdGVDb250ZW50
cyhjb25zdCBTa0JpdG1hcCYgY29udGVudHMsIGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCwgY29u
c3QgSW50UmVjdCYgdGlsZSwgYm9vbCBpc09wYXF1ZSkKK3sKKyAgICBJbnRSZWN0IHRpbGVEaXJ0
eVJlY3QoZGlydHlSZWN0KTsKKworICAgIHRpbGVEaXJ0eVJlY3QuaW50ZXJzZWN0KHRpbGUpOwor
ICAgIGlmICh0aWxlRGlydHlSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
bV9pc09wYXF1ZSA9IGlzT3BhcXVlOworCisgICAgaW50IHN0cmlkZSA9IGJ5dGVzUGVyUGl4ZWwo
KSAqIGNvbnRlbnRzLndpZHRoKCk7CisgICAgaW50IHggPSB0aWxlRGlydHlSZWN0LngoKSAtIGRp
cnR5UmVjdC54KCk7CisgICAgaW50IHkgPSB0aWxlRGlydHlSZWN0LnkoKSAtIGRpcnR5UmVjdC55
KCk7CisgICAgU2tBdXRvTG9ja1BpeGVscyBsb2NrKGNvbnRlbnRzKTsKKyAgICB1bnNpZ25lZCBj
aGFyKiBwaXhlbHMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oY29udGVudHMuZ2V0UGl4
ZWxzKCkpOworICAgIHBpeGVscyArPSAoeSAqIHN0cmlkZSkgKyAoYnl0ZXNQZXJQaXhlbCgpICog
eCk7CisgICAgaWYgKCFwaXhlbHMpCisgICAgICAgIHJldHVybjsKKworICAgIGJvb2wgc3ViSW1h
Z2UgPSAodGlsZS5zaXplKCkgPT0gbV9zaXplKTsKKyAgICBJbnRTaXplIHNpemUgPSBzdWJJbWFn
ZSA/IHRpbGVEaXJ0eVJlY3Quc2l6ZSgpIDogdGlsZS5zaXplKCk7CisgICAgSW50U2l6ZSBjb250
ZW50c1NpemUoSW50U2l6ZShjb250ZW50cy53aWR0aCgpLCBjb250ZW50cy5oZWlnaHQoKSkpOwor
CisjaWYgREVCVUdfVEVYVFVSRV9VUExPQURTCisgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwg
c3ViSW1hZ2UgPyAiU1VCSU1BR0UiIDogIklNQUdFIik7CisgICAgZnByaW50ZihzdGRlcnIsICIg
IHRpbGUgPSAoeD0lZCx5PSVkLHdpZHRoPSVkLGhlaWdodD0lZCksIG1fc2l6ZSA9ICglZHglZClc
biIsIHRpbGUueCgpLCB0aWxlLnkoKSwgdGlsZS53aWR0aCgpLCB0aWxlLmhlaWdodCgpLCBtX3Np
emUud2lkdGgoKSwgbV9zaXplLmhlaWdodCgpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgdGls
ZURpcnR5UmVjdCA9ICh4PSVkLHk9JWQsd2lkdGg9JWQsaGVpZ2h0PSVkKSwgY29udGVudHMuc2l6
ZSgpID0gKCVkeCVkKVxuIiwgdGlsZURpcnR5UmVjdC54KCksIHRpbGVEaXJ0eVJlY3QueSgpLCB0
aWxlRGlydHlSZWN0LndpZHRoKCksIHRpbGVEaXJ0eVJlY3QuaGVpZ2h0KCksIGNvbnRlbnRzU2l6
ZS53aWR0aCgpLCBjb250ZW50c1NpemUuaGVpZ2h0KCkpOworICAgIEludFNpemUgeWVPbGRlU2l6
ZSA9IHNpemU7CisjZW5kaWYKKworICAgIHNpemUgPSBzaXplLnNocnVua1RvKGNvbnRlbnRzU2l6
ZSk7CisKKyNpZiBERUJVR19URVhUVVJFX1VQTE9BRFMKKyAgICBpZiAoc2l6ZSAhPSB5ZU9sZGVT
aXplKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgU0hSVU5LISEhIVxuIik7CisjZW5kaWYK
KworICAgIGlmICghaGFzVGV4dHVyZSgpKSB7CisgICAgICAgIC8vIFdlIG1heSBoYXZlIGJlZW4g
ZXZpY3RlZCBieSB0aGUgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQsCisgICAgICAgIC8v
IGF0dGVtcHQgdG8gaW5zdGFsbCB1cyBhZ2Fpbi4KKyAgICAgICAgaWYgKCF0ZXh0dXJlQ2FjaGVD
b21wb3NpdGluZ1RocmVhZCgpLT5pbnN0YWxsKHRoaXMpKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlSWQpOwor
CisgICAgQVNTRVJUKHNpemUud2lkdGgoKSA+PSAwKTsKKyAgICBib29sIGRvZXNUaWxlU3RyaWRl
RXF1YWxUZXh0dXJlU3RyaWRlID0gY29udGVudHMud2lkdGgoKSA9PSBzaXplLndpZHRoKCk7CisK
KyAgICBPd25BcnJheVB0cjx1bnNpZ25lZCBjaGFyPiB0bXA7CisgICAgaWYgKCFkb2VzVGlsZVN0
cmlkZUVxdWFsVGV4dHVyZVN0cmlkZSkgeworI2lmIGRlZmluZWQoR0xfVU5QQUNLX1JPV19MRU5H
VEgpCisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX1JPV19MRU5HVEgsIGNvbnRlbnRz
LndpZHRoKCkpOworI2Vsc2UKKyAgICAgICAgdG1wID0gYWRvcHRBcnJheVB0cihuZXcgdW5zaWdu
ZWQgY2hhcltzaXplLndpZHRoKCkgKiBzaXplLmhlaWdodCgpICogYnl0ZXNQZXJQaXhlbCgpXSk7
CisgICAgICAgIGNvcHlJbWFnZURhdGEodG1wLmdldCgpLCBieXRlc1BlclBpeGVsKCkgKiBzaXpl
LndpZHRoKCksIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzLCBzdHJpZGUsIDAs
IDAsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsK
KyAgICAgICAgcGl4ZWxzID0gdG1wLmdldCgpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKHN1
YkltYWdlKSB7CisjaWYgREVCVUdfVEVYVFVSRV9VUExPQURTCisgICAgICAgIGZwcmludGYoc3Rk
ZXJyLCAiZ2xUZXhTdWJJbWFnZTJEKCVkLCAlZCwgJWQsICVkKVxuIiwgdGlsZURpcnR5UmVjdC54
KCkgLSB0aWxlLngoKSwgdGlsZURpcnR5UmVjdC55KCkgLSB0aWxlLnkoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7CisgICAgICAgIGRvdWJs
ZSB0ID0gY3VycmVudFRpbWUoKTsKKyNlbmRpZgorICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xf
VEVYVFVSRV8yRCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVEaXJ0eVJlY3QueCgp
IC0gdGlsZS54KCksIHRpbGVEaXJ0eVJlY3QueSgpIC0gdGlsZS55KCksCisgICAgICAgICAgICAg
ICAgICAgICAgICBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCksCisgICAgICAgICAgICAgICAg
ICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbHMpOworI2lmIERFQlVHX1RF
WFRVUkVfVVBMT0FEUworICAgICAgICB0ID0gY3VycmVudFRpbWUoKSAtIHQ7CisgICAgICAgIGZw
cmludGYoc3RkZXJyLCAiICAgIHRpbWUgPSAlZiBzICglZCBieXRlcylcbiIsIHQsIHNpemUud2lk
dGgoKSpzaXplLmhlaWdodCgpKjQpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyNpZiBERUJVR19U
RVhUVVJFX1VQTE9BRFMKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnbFRleEltYWdlMkQoJWQs
ICVkKVxuIiwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKKyAgICAgICAgZG91YmxlIHQg
PSBjdXJyZW50VGltZSgpOworI2VuZGlmCisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJF
XzJELCAwLCBHTF9SR0JBLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCksIDAsIEdMX1JHQkEs
IEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7CisjaWYgREVCVUdfVEVYVFVSRV9VUExPQURTCisg
ICAgICAgIHQgPSBjdXJyZW50VGltZSgpIC0gdDsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIg
ICAgdGltZSA9ICVmIHMgKCVkIGJ5dGVzKVxuIiwgdCwgc2l6ZS53aWR0aCgpKnNpemUuaGVpZ2h0
KCkqNCk7CisjZW5kaWYKKyAgICB9CisKKyNpZiBkZWZpbmVkKEdMX1VOUEFDS19ST1dfTEVOR1RI
KQorICAgIGlmICghZG9lc1RpbGVTdHJpZGVFcXVhbFRleHR1cmVTdHJpZGUpCisgICAgICAgIGds
UGl4ZWxTdG9yZWkoR0xfVU5QQUNLX1JPV19MRU5HVEgsIDApOworI2VuZGlmCisKKyAgICBJbnRT
aXplIG9sZFNpemUgPSBtX3NpemU7CisgICAgbV9zaXplID0gdGlsZS5zaXplKCk7CisgICAgaWYg
KG1fc2l6ZSAhPSBvbGRTaXplKQorICAgICAgICB0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVh
ZCgpLT50ZXh0dXJlUmVzaXplZCh0aGlzLCBvbGRTaXplKTsKK30KKwordm9pZCBUZXh0dXJlOjpz
ZXRDb250ZW50c1RvQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIG1faXNPcGFxdWUg
PSAhY29sb3IuaGFzQWxwaGEoKTsKKyAgICBSR0JBMzIgcmdiYSA9IGNvbG9yLnJnYigpOworICAg
IGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlSWQpOworICAgIGdsVGV4SW1h
Z2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCAxLCAxLCAwLCBHTF9SR0JBLCBHTF9VTlNJ
R05FRF9CWVRFLCAmcmdiYSk7CisKKyAgICBJbnRTaXplIG9sZFNpemUgPSBtX3NpemU7CisgICAg
bV9zaXplID0gSW50U2l6ZSgxLCAxKTsKKyAgICBpZiAobV9zaXplICE9IG9sZFNpemUpCisgICAg
ICAgIHRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCktPnRleHR1cmVSZXNpemVkKHRoaXMs
IG9sZFNpemUpOworfQorCitib29sIFRleHR1cmU6OnByb3RlY3QoY29uc3QgSW50U2l6ZSYgc2l6
ZSkKK3sKKyAgICBpZiAoIWhhc1RleHR1cmUoKSkgeworICAgICAgICAvLyBXZSBtYXkgaGF2ZSBi
ZWVuIGV2aWN0ZWQgYnkgdGhlIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkLAorICAgICAg
ICAvLyBhdHRlbXB0IHRvIGluc3RhbGwgdXMgYWdhaW4uCisgICAgICAgIGlmICghdGV4dHVyZUNh
Y2hlQ29tcG9zaXRpbmdUaHJlYWQoKS0+aW5zdGFsbCh0aGlzKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICArK21fcHJvdGVjdGlvbkNvdW50OworCisgICAgaWYgKG1f
c2l6ZSA9PSBzaXplKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIEludFNpemUgb2xkU2l6
ZSA9IG1fc2l6ZTsKKyAgICBtX3NpemUgPSBzaXplOworICAgIHRleHR1cmVDYWNoZUNvbXBvc2l0
aW5nVGhyZWFkKCktPnRleHR1cmVSZXNpemVkKHRoaXMsIG9sZFNpemUpOworCisgICAgZ2xCaW5k
VGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleHR1cmVJZCk7CisgICAgZ2xUZXhJbWFnZTJEKEdM
X1RFWFRVUkVfMkQsIDAgLCBHTF9SR0JBLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCksIDAs
IEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIDApOworICAgIHJldHVybiB0cnVlOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFj
a2JlcnJ5L1RleHR1cmUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNr
YmVycnkvVGV4dHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRhNTYxNzIzMzc2OTJlMjcxY2I4MWRhMGExMzhl
NDM1ZDZlOTc5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9ibGFja2JlcnJ5L1RleHR1cmUuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3
YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFRleHR1cmVfaAor
I2RlZmluZSBUZXh0dXJlX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwor
I2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIkludFNp
emUuaCIKKworI2luY2x1ZGUgPFNrQml0bWFwLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBUZXh0dXJlQ2FjaGVDb21wb3NpdGlu
Z1RocmVhZDsKKworLy8gVGV4dHVyZSBlbmNhcHN1bGF0ZXMgYSB2b2xhdGlsZSB0ZXh0dXJlIC0g
YXQgYW55IHRpbWUsIHRoZSB1bmRlcmx5aW5nIE9wZW5HTAorLy8gdGV4dHVyZSBtYXkgYmUgZGVs
ZXRlZCBieSB0aGUgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQuIFRoZSB1c2VyIG11c3QK
Ky8vIGNoZWNrIHVzaW5nIFRleHR1cmU6OmlzRGlydHkoKSBpbW1lZGlhdGVseSBiZWZvcmUgdXNp
bmcgaXQsIGV2ZXJ5IHRpbWUuCisvLyBUaGUgb25seSB3YXkgdG8gcHJldmVudCBldmljdGlvbiB0
aGlzIGlzIHRvIGNhbGwgVGV4dHVyZTo6cHJvdGVjdCgpLgorLy8gSWYgdGhlIHRleHR1cmUgaXNE
aXJ0eSgpLCB5b3UgbXVzdCB1cGRhdGVDb250ZW50cygpIGJlZm9yZSB5b3UgY2FuIHVzZSBpdC4K
K2NsYXNzIFRleHR1cmUgOiBwdWJsaWMgUmVmQ291bnRlZDxUZXh0dXJlPiB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIFBhc3NSZWZQdHI8VGV4dHVyZT4gY3JlYXRlKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBhZG9wdFJlZihuZXcgVGV4dHVyZSgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgUGFzc1Jl
ZlB0cjxUZXh0dXJlPiBjcmVhdGVDb2xvcigpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRS
ZWYobmV3IFRleHR1cmUodHJ1ZSkpOworICAgIH0KKworICAgIH5UZXh0dXJlKCk7CisKKyAgICB1
bnNpZ25lZCB0ZXh0dXJlSWQoKSBjb25zdCB7IHJldHVybiBtX3RleHR1cmVJZDsgfQorCisgICAg
Ym9vbCBpc0RpcnR5KCkgY29uc3QgeyByZXR1cm4gIW1fdGV4dHVyZUlkOyB9CisgICAgYm9vbCBo
YXNUZXh0dXJlKCkgY29uc3QgeyByZXR1cm4gbV90ZXh0dXJlSWQ7IH0KKworICAgIGJvb2wgaXND
b2xvcigpIGNvbnN0IHsgcmV0dXJuIG1faXNDb2xvcjsgfQorICAgIGJvb2wgaXNPcGFxdWUoKSBj
b25zdCB7IHJldHVybiBtX2lzT3BhcXVlOyB9CisKKyAgICBib29sIGlzUHJvdGVjdGVkKCkgY29u
c3QgeyByZXR1cm4gbV9wcm90ZWN0aW9uQ291bnQgPiAwOyB9CisgICAgdm9pZCBwcm90ZWN0KCkg
eyArK21fcHJvdGVjdGlvbkNvdW50OyB9CisgICAgdm9pZCB1bnByb3RlY3QoKSB7IC0tbV9wcm90
ZWN0aW9uQ291bnQ7IH0KKyAgICBib29sIHByb3RlY3QoY29uc3QgSW50U2l6ZSYpOworCisgICAg
dm9pZCB1cGRhdGVDb250ZW50cyhjb25zdCBTa0JpdG1hcCYgY29udGVudHMsIGNvbnN0IEludFJl
Y3QmIGRpcnR5UmVjdCwgY29uc3QgSW50UmVjdCYgdGlsZSwgYm9vbCBpc09wYXF1ZSA9IGZhbHNl
KTsKKyAgICB2b2lkIHNldENvbnRlbnRzVG9Db2xvcihjb25zdCBDb2xvciYpOworCisgICAgSW50
U2l6ZSBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CisgICAgaW50IHdpZHRoKCkgY29u
c3QgeyByZXR1cm4gbV9zaXplLndpZHRoKCk7IH0KKyAgICBpbnQgaGVpZ2h0KCkgY29uc3QgeyBy
ZXR1cm4gbV9zaXplLmhlaWdodCgpOyB9CisgICAgc3RhdGljIGludCBieXRlc1BlclBpeGVsKCkg
eyByZXR1cm4gNDsgfQorCitwcml2YXRlOgorICAgIFRleHR1cmUoYm9vbCBpc0NvbG9yID0gZmFs
c2UpOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2QgaXMgb25seSBjYWxsZWQgYnkgb3Vy
IGRlYXIgZnJpZW5kLgorICAgIGZyaWVuZCBjbGFzcyBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1Ro
cmVhZDsKKyAgICB2b2lkIHNldFRleHR1cmVJZCh1bnNpZ25lZCBpZCkKKyAgICB7CisgICAgICAg
IG1fdGV4dHVyZUlkID0gaWQ7CisKKyAgICAgICAgLy8gV2UgYXNzdW1lIGl0IGlzIGEgbmV3bHkg
YWxsb2NhdGVkIHRleHR1cmUsCisgICAgICAgIC8vIGFuZCB0aHVzIGVtcHR5LCBvciAwLCB3aGlj
aCB3b3VsZCBvZiBjb3Vyc2UKKyAgICAgICAgLy8gYmUgZW1wdHkuCisgICAgICAgIG1fc2l6ZSA9
IEludFNpemUoKTsKKyAgICB9CisKKyAgICBpbnQgbV9wcm90ZWN0aW9uQ291bnQ7CisgICAgdW5z
aWduZWQgbV90ZXh0dXJlSWQ7CisgICAgSW50U2l6ZSBtX3NpemU7CisgICAgYm9vbCBtX2lzQ29s
b3I7CisgICAgYm9vbCBtX2lzT3BhcXVlOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gVGV4
dHVyZV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFj
a2JlcnJ5L1RleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJl
YWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLmYzZGI3ZWY0YmMxZDAwOTRmOWIyMDVlZWJiMDhmOGJjNmUzZTAz
OGIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9i
bGFja2JlcnJ5L1RleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkLmNwcApAQCAtMCwwICsxLDI5
OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24g
TGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVz
c2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVi
bGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRv
IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQu
aCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgPEdMRVMy
L2dsMi5oPgorCisjZGVmaW5lIERFQlVHX1RFWFRVUkVfTUVNT1JZX1VTQUdFIDAKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRNZW1vcnlMaW1pdCA9IDY0
ICogMTAyNCAqIDEwMjQ7IC8vIEJ5dGVzCisKKy8vIFVzZWQgdG8gcHJvdGVjdCBhIG5ld2x5IGNy
ZWF0ZWQgdGV4dHVyZSBmcm9tIGJlaW5nIGltbWVkaWF0ZWx5IGV2aWN0ZWQKKy8vIGJlZm9yZSBz
b21lb25lIGhhcyBhIGNoYW5jZSB0byBwcm90ZWN0IGl0IGZvciBsZWdpdGltYXRlIHJlYXNvbnMu
CitjbGFzcyBUZXh0dXJlUHJvdGVjdG9yIHsKK3B1YmxpYzoKKyAgICBUZXh0dXJlUHJvdGVjdG9y
KFRleHR1cmUqIHRleHR1cmUpCisgICAgICAgIDogbV90ZXh0dXJlKHRleHR1cmUpCisgICAgewor
ICAgICAgICBtX3RleHR1cmUtPnByb3RlY3QoKTsKKyAgICB9CisKKyAgICB+VGV4dHVyZVByb3Rl
Y3RvcigpCisgICAgeworICAgICAgICBtX3RleHR1cmUtPnVucHJvdGVjdCgpOworICAgIH0KKwor
cHJpdmF0ZToKKyAgICBUZXh0dXJlKiBtX3RleHR1cmU7Cit9OworCitUZXh0dXJlQ2FjaGVDb21w
b3NpdGluZ1RocmVhZDo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKQorICAgIDogbV9t
ZW1vcnlVc2FnZSgwKQorICAgICwgbV9tZW1vcnlMaW1pdChkZWZhdWx0TWVtb3J5TGltaXQpCit7
Cit9CisKK3Vuc2lnbmVkIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjphbGxvY2F0ZVRl
eHR1cmVJZCgpCit7CisgICAgdW5zaWduZWQgdGV4aWQ7CisgICAgZ2xHZW5UZXh0dXJlcygxLCAm
dGV4aWQpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4aWQpOworICAgIGlm
ICghZ2xJc1RleHR1cmUodGV4aWQpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIERvIGJh
c2ljIGxpbmVhciBmaWx0ZXJpbmcgb24gcmVzaXplLgorICAgIGdsVGV4UGFyYW1ldGVyZihHTF9U
RVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQ
YXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFS
KTsKKyAgICAvLyBOUE9UIHRleHR1cmVzIGluIEdMIEVTIG9ubHkgd29yayB3aGVuIHRoZSB3cmFw
IG1vZGUgaXMgc2V0IHRvIEdMX0NMQU1QX1RPX0VER0UuCisgICAgZ2xUZXhQYXJhbWV0ZXJmKEdM
X1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBn
bFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1Q
X1RPX0VER0UpOworICAgIHJldHVybiB0ZXhpZDsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGVDb21w
b3NpdGluZ1RocmVhZDo6ZnJlZVRleHR1cmVJZCh1bnNpZ25lZCBpZCkKK3sKKyAgICBpZiAoaWQp
CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJmlkKTsKK30KKwordm9pZCBUZXh0dXJlQ2Fj
aGVDb21wb3NpdGluZ1RocmVhZDo6Y29sbGVjdEdhcmJhZ2UoKQoreworICAgIGludCBkZWx0YSA9
IDA7CisKKyAgICBmb3IgKEdhcmJhZ2U6Oml0ZXJhdG9yIGl0ID0gbV9nYXJiYWdlLmJlZ2luKCk7
IGl0ICE9IG1fZ2FyYmFnZS5lbmQoKTsgKytpdCkgeworICAgICAgICBab21iaWVUZXh0dXJlJiB6
b21iaWUgPSAqaXQ7CisgICAgICAgIGZyZWVUZXh0dXJlSWQoem9tYmllLmlkKTsKKyAgICAgICAg
ZGVsdGEgKz0gem9tYmllLnNpemUud2lkdGgoKSAqIHpvbWJpZS5zaXplLmhlaWdodCgpICogVGV4
dHVyZTo6Ynl0ZXNQZXJQaXhlbCgpOworICAgIH0KKyAgICBtX2dhcmJhZ2UuY2xlYXIoKTsKKwor
ICAgIGlmIChkZWx0YSkKKyAgICAgICAgZGVjTWVtb3J5VXNhZ2UoZGVsdGEpOworfQorCit2b2lk
IFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjp0ZXh0dXJlUmVzaXplZChUZXh0dXJlKiB0
ZXh0dXJlLCBjb25zdCBJbnRTaXplJiBvbGRTaXplKQoreworICAgIGludCBkZWx0YSA9ICh0ZXh0
dXJlLT53aWR0aCgpICogdGV4dHVyZS0+aGVpZ2h0KCkgLSBvbGRTaXplLndpZHRoKCkgKiBvbGRT
aXplLmhlaWdodCgpKSAqIHRleHR1cmUtPmJ5dGVzUGVyUGl4ZWwoKTsKKyAgICBpbmNNZW1vcnlV
c2FnZShkZWx0YSk7CisgICAgaWYgKGRlbHRhID4gMCkKKyAgICAgICAgcHJ1bmUoKTsKK30KKwor
dm9pZCBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6dGV4dHVyZURlc3Ryb3llZChUZXh0
dXJlKiB0ZXh0dXJlKQoreworICAgIGlmICh0ZXh0dXJlLT5pc0NvbG9yKCkpIHsKKyAgICAgICAg
bV9nYXJiYWdlLmFwcGVuZChab21iaWVUZXh0dXJlKHRleHR1cmUpKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIGV2aWN0KG1fdGV4dHVyZXMuZmluZCh0ZXh0dXJlKSk7Cit9CisKK2Jv
b2wgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6Omluc3RhbGwoVGV4dHVyZSogdGV4dHVy
ZSkKK3sKKyAgICBpZiAoIXRleHR1cmUpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYg
KCF0ZXh0dXJlLT5oYXNUZXh0dXJlKCkpIHsKKyAgICAgICAgdW5zaWduZWQgdGV4dHVyZUlkID0g
YWxsb2NhdGVUZXh0dXJlSWQoKTsKKyAgICAgICAgaWYgKCF0ZXh0dXJlSWQpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdGV4dHVyZS0+c2V0VGV4dHVyZUlkKHRleHR1cmVJ
ZCk7CisgICAgfQorCisgICAgaWYgKCF0ZXh0dXJlLT5pc0NvbG9yKCkpIHsKKyAgICAgICAgaWYg
KCFtX3RleHR1cmVzLmNvbnRhaW5zKHRleHR1cmUpKQorICAgICAgICAgICAgbV90ZXh0dXJlcy5h
ZGQodGV4dHVyZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVGV4dHVy
ZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmV2aWN0KGNvbnN0IFRleHR1cmVTZXQ6Oml0ZXJhdG9y
JiBpdCkKK3sKKyAgICBpZiAoaXQgPT0gbV90ZXh0dXJlcy5lbmQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgVGV4dHVyZSogdGV4dHVyZSA9ICppdDsKKyAgICBpZiAodGV4dHVyZS0+aGFzVGV4
dHVyZSgpKQorICAgICAgICBtX2dhcmJhZ2UuYXBwZW5kKFpvbWJpZVRleHR1cmUodGV4dHVyZSkp
OworCisgICAgdGV4dHVyZS0+c2V0VGV4dHVyZUlkKDApOworCisgICAgbV90ZXh0dXJlcy5yZW1v
dmUoaXQpOworfQorCit2b2lkIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjp0ZXh0dXJl
QWNjZXNzZWQoVGV4dHVyZSogdGV4dHVyZSkKK3sKKyAgICBpZiAodGV4dHVyZS0+aXNDb2xvcigp
KQorICAgICAgICByZXR1cm47CisKKyAgICBUZXh0dXJlU2V0OjppdGVyYXRvciBpdCA9IG1fdGV4
dHVyZXMuZmluZCh0ZXh0dXJlKTsKKyAgICBpZiAoaXQgPT0gbV90ZXh0dXJlcy5lbmQoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV90ZXh0dXJlcy5yZW1vdmUoaXQpOworICAgIG1fdGV4dHVy
ZXMuYWRkKHRleHR1cmUpOworfQorCitUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCogdGV4
dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKQoreworICAgIHN0YXRpYyBUZXh0dXJlQ2FjaGVD
b21wb3NpdGluZ1RocmVhZCogc3RhdGljQ2FjaGUgPSBuZXcgVGV4dHVyZUNhY2hlQ29tcG9zaXRp
bmdUaHJlYWQ7CisgICAgcmV0dXJuIHN0YXRpY0NhY2hlOworfQorCit2b2lkIFRleHR1cmVDYWNo
ZUNvbXBvc2l0aW5nVGhyZWFkOjpwcnVuZShzaXplX3QgbGltaXQpCit7CisgICAgd2hpbGUgKG1f
bWVtb3J5VXNhZ2UgPiBsaW1pdCkgeworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAg
ICAgIGZvciAoVGV4dHVyZVNldDo6aXRlcmF0b3IgaXQgPSBtX3RleHR1cmVzLmJlZ2luKCk7IGl0
ICE9IG1fdGV4dHVyZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIFRleHR1cmUqIHRleHR1
cmUgPSAqaXQ7CisgICAgICAgICAgICBpZiAodGV4dHVyZS0+aXNQcm90ZWN0ZWQoKSkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGV2aWN0KGl0KTsKKyAgICAgICAgICAg
IGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlm
ICghZm91bmQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgVGV4dHVyZUNh
Y2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmNsZWFyKCkKK3sKKyAgICBtX2NhY2hlLmNsZWFyKCk7Cisg
ICAgbV9jb2xvcnMuY2xlYXIoKTsKKyAgICBjb2xsZWN0R2FyYmFnZSgpOworfQorCit2b2lkIFRl
eHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpzZXRNZW1vcnlVc2FnZShzaXplX3QgbWVtb3J5
VXNhZ2UpCit7CisgICAgbV9tZW1vcnlVc2FnZSA9IG1lbW9yeVVzYWdlOworI2lmIERFQlVHX1RF
WFRVUkVfTUVNT1JZX1VTQUdFCisgICAgZnByaW50ZihzdGRlcnIsICJUZXh0dXJlIG1lbW9yeSB1
c2FnZSAldSBrQlxuIiwgbV9tZW1vcnlVc2FnZSAvIDEwMjQpOworI2VuZGlmCit9CisKK1Bhc3NS
ZWZQdHI8VGV4dHVyZT4gVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OnRleHR1cmVGb3JU
aWxlZENvbnRlbnRzKGNvbnN0IFNrQml0bWFwJiBjb250ZW50cywgY29uc3QgSW50UmVjdCYgdGls
ZVJlY3QsIGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIGJvb2wgaXNPcGFxdWUpCit7CisgICAgSGFz
aE1hcDxDb250ZW50c0tleSwgVGV4dHVyZU1hcD46Oml0ZXJhdG9yIGl0ID0gbV9jYWNoZS5hZGQo
a2V5KGNvbnRlbnRzKSwgVGV4dHVyZU1hcCgpKS5maXJzdDsKKyAgICBUZXh0dXJlTWFwJiBtYXAg
PSAoKml0KS5zZWNvbmQ7CisKKyAgICBUZXh0dXJlTWFwOjppdGVyYXRvciBqdCA9IG1hcC5hZGQo
aW5kZXgsIFJlZlB0cjxUZXh0dXJlPigpKS5maXJzdDsKKyAgICBSZWZQdHI8VGV4dHVyZT4gdGV4
dHVyZSA9ICgqanQpLnNlY29uZDsKKyAgICBpZiAoIXRleHR1cmUpIHsKKyAgICAgICAgdGV4dHVy
ZSA9IGNyZWF0ZVRleHR1cmUoKTsKKyNpZiBERUJVR19URVhUVVJFX01FTU9SWV9VU0FHRQorICAg
ICAgICBmcHJpbnRmKHN0ZGVyciwgIkNyZWF0aW5nIHRleHR1cmUgMHgleCBmb3IgMHgleCslZCBA
ICglZCwgJWQpXG4iLCB0ZXh0dXJlLmdldCgpLCBjb250ZW50cy5waXhlbFJlZigpLCBjb250ZW50
cy5waXhlbFJlZk9mZnNldCgpLCBpbmRleC5pKCksIGluZGV4LmooKSk7CisjZW5kaWYKKyAgICAg
ICAgbWFwLnNldChpbmRleCwgdGV4dHVyZSk7CisgICAgfQorCisgICAgLy8gUHJvdGVjdCBuZXds
eSBjcmVhdGVkIHRleHR1cmUgZnJvbSBiZWluZyBldmljdGVkLgorICAgIFRleHR1cmVQcm90ZWN0
b3IgcHJvdGVjdG9yKHRleHR1cmUuZ2V0KCkpOworCisgICAgSW50U2l6ZSBjb250ZW50c1NpemUo
Y29udGVudHMud2lkdGgoKSwgY29udGVudHMuaGVpZ2h0KCkpOworICAgIEludFJlY3QgZGlydHlS
ZWN0KEludFBvaW50KCksIGNvbnRlbnRzU2l6ZSk7CisgICAgaWYgKHRpbGVSZWN0LnNpemUoKSAh
PSB0ZXh0dXJlLT5zaXplKCkpIHsKKyNpZiBERUJVR19URVhUVVJFX01FTU9SWV9VU0FHRQorICAg
ICAgICBmcHJpbnRmKHN0ZGVyciwgIlVwZGF0aW5nIHRleHR1cmUgMHgleCBmb3IgMHgleCslZCBA
ICglZCwgJWQpXG4iLCB0ZXh0dXJlLmdldCgpLCBjb250ZW50cy5waXhlbFJlZigpLCBjb250ZW50
cy5waXhlbFJlZk9mZnNldCgpLCBpbmRleC5pKCksIGluZGV4LmooKSk7CisjZW5kaWYKKyAgICAg
ICAgdGV4dHVyZS0+dXBkYXRlQ29udGVudHMoY29udGVudHMsIGRpcnR5UmVjdCwgdGlsZVJlY3Qs
IGlzT3BhcXVlKTsKKyAgICB9CisgICAgcmV0dXJuIHRleHR1cmUucmVsZWFzZSgpOworfQorCitQ
YXNzUmVmUHRyPFRleHR1cmU+IFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjp0ZXh0dXJl
Rm9yQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIC8vIEp1c3QgdG8gbWFrZSBzdXJl
IHdlIGRvbid0IGdldCBmb29sZWQgYnkgc29tZSBtYWxpY2lvdXMgd2ViIHBhZ2UKKyAgICAvLyBp
bnRvIGNhY2hpbmcgbWlsbGlvbnMgb2YgY29sb3IgdGV4dHVyZXMuCisgICAgaWYgKG1fY29sb3Jz
LnNpemUoKSA+IDEwMCkKKyAgICAgICAgbV9jb2xvcnMuY2xlYXIoKTsKKworICAgIENvbG9yVGV4
dHVyZU1hcDo6aXRlcmF0b3IgaXQgPSBtX2NvbG9ycy5maW5kKGNvbG9yKTsKKyAgICBSZWZQdHI8
VGV4dHVyZT4gdGV4dHVyZTsKKyAgICBpZiAoaXQgPT0gbV9jb2xvcnMuZW5kKCkpIHsKKyAgICAg
ICAgdGV4dHVyZSA9IFRleHR1cmU6OmNyZWF0ZUNvbG9yKCk7CisjaWYgREVCVUdfVEVYVFVSRV9N
RU1PUllfVVNBR0UKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDcmVhdGluZyB0ZXh0dXJlIDB4
JXggZm9yIGNvbG9yIDB4JXhcbiIsIHRleHR1cmUuZ2V0KCksIGNvbG9yLnJnYigpKTsKKyNlbmRp
ZgorICAgICAgICBtX2NvbG9ycy5zZXQoY29sb3IsIHRleHR1cmUpOworICAgIH0gZWxzZQorICAg
ICAgICB0ZXh0dXJlID0gKCppdCkuc2Vjb25kOworCisgICAgLy8gQ29sb3IgdGV4dHVyZXMgY2Fu
J3QgYmUgZXZpY3RlZCwgc28gbm8gbmVlZCBmb3IgVGV4dHVyZVByb3RlY3Rvci4KKworICAgIGlm
ICh0ZXh0dXJlLT5zaXplKCkgIT0gSW50U2l6ZSgxLCAxKSkKKyAgICAgICAgdGV4dHVyZS0+c2V0
Q29udGVudHNUb0NvbG9yKGNvbG9yKTsKKworICAgIHJldHVybiB0ZXh0dXJlLnJlbGVhc2UoKTsK
K30KKworUGFzc1JlZlB0cjxUZXh0dXJlPiBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6
dXBkYXRlQ29udGVudHMoY29uc3QgUmVmUHRyPFRleHR1cmU+JiB0ZXh0dXJlSW4sIGNvbnN0IFNr
Qml0bWFwJiBjb250ZW50cywgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0LCBjb25zdCBJbnRSZWN0
JiB0aWxlUmVjdCkKK3sKKyAgICBSZWZQdHI8VGV4dHVyZT4gdGV4dHVyZSh0ZXh0dXJlSW4pOwor
CisgICAgLy8gSWYgdGhlIHRleHR1cmUgd2FzIDAsIG9yIG5lZWRzIHRvIHRyYW5zaXRpb24gZnJv
bSBhIHNvbGlkIGNvbG9yIHRleHR1cmUgdG8gYSBjb250ZW50cyB0ZXh0dXJlLAorICAgIC8vIGNy
ZWF0ZSBhIG5ldyB0ZXh0dXJlLgorICAgIGlmICghdGV4dHVyZSB8fCB0ZXh0dXJlLT5pc0NvbG9y
KCkpCisgICAgICAgIHRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKCk7CisKKyAgICAvLyBQcm90ZWN0
IG5ld2x5IGNyZWF0ZWQgdGV4dHVyZSBmcm9tIGJlaW5nIGV2aWN0ZWQuCisgICAgVGV4dHVyZVBy
b3RlY3RvciBwcm90ZWN0b3IodGV4dHVyZS5nZXQoKSk7CisKKyAgICB0ZXh0dXJlLT51cGRhdGVD
b250ZW50cyhjb250ZW50cywgZGlydHlSZWN0LCB0aWxlUmVjdCk7CisKKyAgICByZXR1cm4gdGV4
dHVyZS5yZWxlYXNlKCk7Cit9CisKK1RleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpDb250
ZW50c0tleSBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6a2V5KGNvbnN0IFNrQml0bWFw
JiBjb250ZW50cykKK3sKKyAgICAvLyBUaGUgcGl4ZWxSZWYgaXMgYW4gYWRkcmVzcywgYW5kIGFk
ZHJlc3NlcyBjYW4gYmUgcmV1c2VkIGJ5IHRoZSBhbGxvY2F0b3IKKyAgICAvLyBzbyBpdCdzIHVu
c3VpdGFibGUgdG8gdXNlIGFzIGEga2V5LiBJbnN0ZWFkLCBncmFiIHRoZSBnZW5lcmF0aW9uLCB3
aGljaAorICAgIC8vIGlzIGdsb2JhbGx5IHVuaXF1ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQg
aW1wbGVtZW50YXRpb24gaW4KKyAgICAvLyBTa1BpeGVsUmVmLmNwcC4KKyAgICB1aW50MzJfdCBn
ZW5lcmF0aW9uID0gY29udGVudHMuZ2V0R2VuZXJhdGlvbklEKCk7CisKKyAgICAvLyBJZiB0aGUg
Z2VuZXJhdGlvbiBpcyBlcXVhbCB0byB0aGUgZGVsZXRlZCB2YWx1ZSwgdXNlIHNvbWV0aGluZyBl
bHNlIHRoYXQKKyAgICAvLyBpcyB1bmxpa2VseSB0byBjb3JyZXNwb25kIHRvIGEgZ2VuZXJhdGlv
biBjdXJyZW50bHkgaW4gdXNlIG9yIHNvb24gdG8gYmUKKyAgICAvLyBpbiB1c2UuCisgICAgdWlu
dDMyX3QgZGVsZXRlZFZhbHVlID0gMDsKKyAgICBIYXNoVHJhaXRzPHVpbnQzMl90Pjo6Y29uc3Ry
dWN0RGVsZXRlZFZhbHVlKGRlbGV0ZWRWYWx1ZSk7CisgICAgaWYgKGdlbmVyYXRpb24gPT0gZGVs
ZXRlZFZhbHVlKSB7CisgICAgICAgIC8vIFRoaXMgc3RyYXRlZ3kgd29ya3MgYXMgbG9uZyBhcyB0
aGUgZGVsZXRlZCB2YWx1ZSBpcyAtMS4KKyAgICAgICAgQVNTRVJUKGRlbGV0ZWRWYWx1ZSA9PSBz
dGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpKTsKKyAgICAgICAgZ2VuZXJhdGlvbiA9IGRlbGV0ZWRW
YWx1ZSAvIDI7CisgICAgfQorCisgICAgLy8gTm93IHRoZSBnZW5lcmF0aW9uIGFsb25lIGRvZXMg
bm90IHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSB0ZXh0dXJlIGNvbnRlbnRzLgorICAgIC8vIFRoZSBz
YW1lIHBpeGVscmVmIGNhbiBiZSByZXVzZWQgaW4gYW5vdGhlciBiaXRtYXAgYnV0IHdpdGggYSBk
aWZmZXJlbnQKKyAgICAvLyBvZmZzZXQgKHNvbWV3aGF0IGNvbnRyaXZlZCwgYnV0IHBvc3NpYmxl
KS4KKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZ2VuZXJhdGlvbiwgY29udGVudHMucGl4ZWxS
ZWZPZmZzZXQoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1RleHR1
cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9ibGFja2JlcnJ5L1RleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uNDlhMTE4YzhiNzEyMTY1ZWIyMjcwMTQ1Yjk4ZDhhM2M0NjQ4ZGVhYwotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvVGV4dHVy
ZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQuaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFRleHR1cmVDYWNoZUNv
bXBvc2l0aW5nVGhyZWFkX2gKKyNkZWZpbmUgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWRf
aAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiSW50UmVj
dC5oIgorI2luY2x1ZGUgIkxheWVyVGlsZUluZGV4LmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgor
CisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8d3Rm
L0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvTGlzdEhhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYv
Tm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0
Zi9SZWZQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBBIExSVSBjYWNoZSBmb3Ig
T3BlbkdMIHRleHR1cmVzLgorY2xhc3MgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQgewor
ICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKTsK
KyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBmcmllbmQgVGV4dHVy
ZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQqIHRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCk7
CisKKyAgICAvLyBDcmVhdGVzIGEgbmV3IHRleHR1cmUgbWFuYWdlZCBieSB0aGlzIGNhY2hlLgor
ICAgIFBhc3NSZWZQdHI8VGV4dHVyZT4gY3JlYXRlVGV4dHVyZSgpCisgICAgeworICAgICAgICBy
ZXR1cm4gVGV4dHVyZTo6Y3JlYXRlKCk7CisgICAgfQorCisgICAgLy8gUmV0cmlldmUgYSB0ZXh0
dXJlIGZyb20gdGhlIGNhY2hlLgorICAgIFBhc3NSZWZQdHI8VGV4dHVyZT4gdGV4dHVyZUZvclRp
bGVkQ29udGVudHMoY29uc3QgU2tCaXRtYXAmIGNvbnRlbnRzLCBjb25zdCBJbnRSZWN0JiB0aWxl
UmVjdCwgY29uc3QgVGlsZUluZGV4JiwgYm9vbCBpc09wYXF1ZSk7CisgICAgUGFzc1JlZlB0cjxU
ZXh0dXJlPiB0ZXh0dXJlRm9yQ29sb3IoY29uc3QgQ29sb3ImKTsKKworICAgIC8vIFVwZGF0ZSBj
b250ZW50cyBvZiBhbiBleGlzdGluZyB0ZXh0dXJlLCBvciBjcmVhdGUgYSBuZXcgb25lIGlmIHRl
eHR1cmUgaXMgMC4KKyAgICBQYXNzUmVmUHRyPFRleHR1cmU+IHVwZGF0ZUNvbnRlbnRzKGNvbnN0
IFJlZlB0cjxUZXh0dXJlPiYsIGNvbnN0IFNrQml0bWFwJiBjb250ZW50cywgY29uc3QgSW50UmVj
dCYgZGlydHlSZWN0LCBjb25zdCBJbnRSZWN0JiB0aWxlUmVjdCk7CisKKyAgICBzaXplX3QgbWVt
b3J5VXNhZ2UoKSBjb25zdCB7IHJldHVybiBtX21lbW9yeVVzYWdlOyB9CisgICAgc2l6ZV90IG1l
bW9yeUxpbWl0KCkgY29uc3QgeyByZXR1cm4gbV9tZW1vcnlMaW1pdDsgfQorICAgIHZvaWQgc2V0
TWVtb3J5TGltaXQoc2l6ZV90IGxpbWl0KSB7IG1fbWVtb3J5TGltaXQgPSBsaW1pdDsgfQorCisg
ICAgLy8gRXZpY3QgdW5wcm90ZWN0ZWQgdGV4dHVyZXMgdW50aWwgd2UgcmVhY2ggdGhlIGxpbWl0
IHByb3ZpZGVkLgorICAgIHZvaWQgcHJ1bmUoc2l6ZV90IGxpbWl0KTsKKyAgICB2b2lkIHBydW5l
KCkgeyBwcnVuZShtZW1vcnlMaW1pdCgpKTsgfQorCisgICAgLy8gRXZpY3QgYWxsIHRleHR1cmVz
IGZyb20gdGhlIGNhY2hlLgorICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8vIFVwZGF0ZSB0aGUg
TFJVIGxpc3QuCisgICAgdm9pZCB0ZXh0dXJlQWNjZXNzZWQoVGV4dHVyZSopOworCisgICAgLy8g
RGVsZXRpbmcgZGVzdHJveWVkIHRleHR1cmVzIGlzIHByb3ZpZGVkIGFzIGEgc2VwYXJhdGUgbWV0
aG9kLCBiZWNhdXNlCisgICAgLy8gdGhlcmUgbWlnaHQgbm90IGJlIGFuIE9wZW5HTCBjb250ZXh0
IGN1cnJlbnQgd2hlbiB0aGUgdGV4dHVyZSBkZXN0cnVjdG9yCisgICAgLy8gd2FzIGNhbGxlZC4g
Q2FsbGluZyB0aGlzIG1ha2VzIHN1cmUgdG8gZnJlZSBhbnkgc3VjaCB0ZXh0dXJlcy4KKyAgICB2
b2lkIGNvbGxlY3RHYXJiYWdlKCk7CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJl
IGNhbGxlZCBieSBUZXh0dXJlIGNsYXNzLgorICAgIHZvaWQgdGV4dHVyZURlc3Ryb3llZChUZXh0
dXJlKik7CisgICAgdm9pZCB0ZXh0dXJlUmVzaXplZChUZXh0dXJlKiwgY29uc3QgSW50U2l6ZSYg
b2xkU2l6ZSk7CisKKyAgICAvLyBVbmRvIHRoZSBlZmZlY3RzIG9mIGV2aWN0aW9uLCBpZiBwb3Nz
aWJsZS4KKyAgICBib29sIGluc3RhbGwoVGV4dHVyZSopOworCitwcml2YXRlOgorICAgIHN0cnVj
dCBab21iaWVUZXh0dXJlIHsKKyAgICAgICAgZXhwbGljaXQgWm9tYmllVGV4dHVyZShUZXh0dXJl
KiB0ZXh0dXJlKQorICAgICAgICAgICAgOiBpZCh0ZXh0dXJlLT50ZXh0dXJlSWQoKSkKKyAgICAg
ICAgICAgICwgc2l6ZSh0ZXh0dXJlLT5zaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisg
ICAgICAgIHVuc2lnbmVkIGlkOworICAgICAgICBJbnRTaXplIHNpemU7CisgICAgfTsKKyAgICB0
eXBlZGVmIExpc3RIYXNoU2V0PFRleHR1cmUqID4gVGV4dHVyZVNldDsKKyAgICB0eXBlZGVmIHN0
ZDo6cGFpcjx1aW50MzJfdCwgc2l6ZV90PiBDb250ZW50c0tleTsKKyAgICB0eXBlZGVmIEhhc2hN
YXA8VGlsZUluZGV4LCBSZWZQdHI8VGV4dHVyZT4gPiBUZXh0dXJlTWFwOworICAgIHR5cGVkZWYg
VmVjdG9yPFpvbWJpZVRleHR1cmU+IEdhcmJhZ2U7CisKKyAgICBUZXh0dXJlQ2FjaGVDb21wb3Np
dGluZ1RocmVhZCgpOworICAgIH5UZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpOworCisg
ICAgdW5zaWduZWQgYWxsb2NhdGVUZXh0dXJlSWQoKTsKKyAgICB2b2lkIGZyZWVUZXh0dXJlSWQo
dW5zaWduZWQgaWQpOworCisgICAgdm9pZCBpbmNNZW1vcnlVc2FnZShpbnQgZGVsdGEpIHsgc2V0
TWVtb3J5VXNhZ2UobWVtb3J5VXNhZ2UoKSArIGRlbHRhKTsgfQorICAgIHZvaWQgZGVjTWVtb3J5
VXNhZ2UoaW50IGRlbHRhKSB7IHNldE1lbW9yeVVzYWdlKG1lbW9yeVVzYWdlKCkgLSBkZWx0YSk7
IH0KKyAgICB2b2lkIHNldE1lbW9yeVVzYWdlKHNpemVfdCk7CisKKyAgICBDb250ZW50c0tleSBr
ZXkoY29uc3QgU2tCaXRtYXAmIGNvbnRlbnRzKTsKKworICAgIHZvaWQgZXZpY3QoY29uc3QgVGV4
dHVyZVNldDo6aXRlcmF0b3ImKTsKKworICAgIC8vIExSVSBzZXQgb2Ygd2VhayBwb2ludGVycyB0
byB0ZXh0dXJlcy4KKyAgICBUZXh0dXJlU2V0IG1fdGV4dHVyZXM7CisgICAgc2l6ZV90IG1fbWVt
b3J5VXNhZ2U7CisgICAgc2l6ZV90IG1fbWVtb3J5TGltaXQ7CisKKyAgICAvLyBNYXAgb2YgcmVm
Q291bnRlZCBwb2ludGVycyB0byB0ZXh0dXJlcy4KKyAgICBIYXNoTWFwPENvbnRlbnRzS2V5LCBU
ZXh0dXJlTWFwPiBtX2NhY2hlOworICAgIHN0cnVjdCBDb2xvckhhc2ggeworICAgICAgICBzdGF0
aWMgdW5zaWduZWQgaGFzaChjb25zdCBDb2xvciYga2V5KSB7IHJldHVybiBXVEY6OmludEhhc2go
a2V5LnJnYigpKTsgfQorICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBDb2xvciYgYSwg
Y29uc3QgQ29sb3ImIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQorICAgICAgICBzdGF0aWMgY29uc3Qg
Ym9vbCBzYWZlVG9Db21wYXJlVG9FbXB0eU9yRGVsZXRlZCA9IHRydWU7CisgICAgfTsKKyAgICBz
dHJ1Y3QgQ29sb3JIYXNoVHJhaXRzIDogV1RGOjpHZW5lcmljSGFzaFRyYWl0czxDb2xvcj4gewor
ICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBlbXB0eVZhbHVlSXNaZXJvID0gdHJ1ZTsKKyAgICAg
ICAgLy8gVGhlIGRlbGV0ZWQgdmFsdWUgaXMgYW4gaW52YWxpZCBjb2xvciB3aXRoIGFuIFJHQiB2
YWx1ZSBvZiAweEZGRkZGRkZGLgorICAgICAgICAvLyBTdWNoIHZhbHVlcyBkbyBub3QgbmF0dXJh
bGx5IG9jY3VyIGFzIGNvbG9ycy4KKyAgICAgICAgLy8gQW5kIGVtcHR5IHZhbHVlIGlzIGFuIGlu
dmFsaWQgY29sb3Igd2l0aCBhbiBSR0IgdmFsdWUgb2YgMHgwLgorICAgICAgICBzdGF0aWMgdm9p
ZCBjb25zdHJ1Y3REZWxldGVkVmFsdWUoQ29sb3ImIHNsb3QpIHsgbmV3ICgmc2xvdCkgQ29sb3Io
KTsgKnJlaW50ZXJwcmV0X2Nhc3Q8UkdCQTMyKj4oJnNsb3QpID0gQ29sb3I6OndoaXRlOyB9Cisg
ICAgICAgIHN0YXRpYyBib29sIGlzRGVsZXRlZFZhbHVlKGNvbnN0IENvbG9yJiB2YWx1ZSkgeyBy
ZXR1cm4gIXZhbHVlLmlzVmFsaWQoKSAmJiB2YWx1ZS5yZ2IoKSA9PSBDb2xvcjo6d2hpdGU7IH0K
KyAgICB9OworICAgIHR5cGVkZWYgSGFzaE1hcDxDb2xvciwgUmVmUHRyPFRleHR1cmU+LCBDb2xv
ckhhc2gsIENvbG9ySGFzaFRyYWl0cz4gQ29sb3JUZXh0dXJlTWFwOworICAgIENvbG9yVGV4dHVy
ZU1hcCBtX2NvbG9yczsKKyAgICBHYXJiYWdlIG1fZ2FyYmFnZTsKK307CisKK1RleHR1cmVDYWNo
ZUNvbXBvc2l0aW5nVGhyZWFkKiB0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpOworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisKKyNlbmRpZiAvLyBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZF9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>130084</attachid>
            <date>2012-03-05 02:23:31 -0800</date>
            <delta_ts>2012-03-06 22:27:27 -0800</delta_ts>
            <desc>updated patch</desc>
            <filename>bug-80121-20120305182313.patch</filename>
            <type>text/plain</type>
            <size>30347</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5NzI4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzI0OWUyOGUzZGQ3YzIw
N2M2YWM2OWM3NGViNGY3YWUyOGYxMzhlMC4uMjJkNDhiMzQ0OWM3NWFmMWM1ZjBmZWY1ZTdkYjRi
OTcwODk0YmJmYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDc4IEBACisyMDEyLTAzLTA1ICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBUZXh0dXJlIGFuZCBUZXh0dXJlQ2FjaGUKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgwMTIxCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0cmVhbSwgbm8gbmV3IHRl
c3RzLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlJbWFn
ZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6VGV4dHVyZSk6CisgICAgICAgIChX
ZWJDb3JlOjpUZXh0dXJlOjp+VGV4dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjp1
cGRhdGVDb250ZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjpzZXRDb250ZW50c1Rv
Q29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6cHJvdGVjdCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlLmg6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZSk6CisgICAgICAgIChUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmU6
OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjp0ZXh0dXJlSWQpOgorICAgICAg
ICAoV2ViQ29yZTo6VGV4dHVyZTo6aXNEaXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJl
OjpoYXNUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmU6OmlzQ29sb3IpOgorICAg
ICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6aXNPcGFxdWUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dHVyZTo6aXNQcm90ZWN0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6cHJvdGVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjp1bnByb3RlY3QpOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dHVyZTo6c2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjp3aWR0aCk6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjpoZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dHVyZTo6Ynl0ZXNQZXJQaXhlbCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjpzZXRUZXh0
dXJlSWQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvVGV4dHVyZUNh
Y2hlQ29tcG9zaXRpbmdUaHJlYWQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAg
ICAgICAoVGV4dHVyZVByb3RlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlUHJvdGVj
dG9yOjpUZXh0dXJlUHJvdGVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVQcm90ZWN0
b3I6On5UZXh0dXJlUHJvdGVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNv
bXBvc2l0aW5nVGhyZWFkOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCk6CisgICAgICAg
IChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6YWxsb2NhdGVUZXh0dXJl
SWQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmZy
ZWVUZXh0dXJlSWQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdU
aHJlYWQ6OmNvbGxlY3RHYXJiYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNv
bXBvc2l0aW5nVGhyZWFkOjp0ZXh0dXJlUmVzaXplZCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6dGV4dHVyZURlc3Ryb3llZCk6CisgICAgICAgIChX
ZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6aW5zdGFsbCk6CisgICAgICAg
IChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6ZXZpY3QpOgorICAgICAg
ICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OnRleHR1cmVBY2Nlc3Nl
ZCk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6cHJ1bmUpOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmNsZWFyKToK
KyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpzZXRNZW1v
cnlVc2FnZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVh
ZDo6dGV4dHVyZUZvclRpbGVkQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNh
Y2hlQ29tcG9zaXRpbmdUaHJlYWQ6OnRleHR1cmVGb3JDb2xvcik6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6dXBkYXRlQ29udGVudHMpOgorICAgICAg
ICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmtleSk6CisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1Ro
cmVhZC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoVGV4dHVyZUNhY2hl
Q29tcG9zaXRpbmdUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9z
aXRpbmdUaHJlYWQ6OmNyZWF0ZVRleHR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNh
Y2hlQ29tcG9zaXRpbmdUaHJlYWQ6Om1lbW9yeVVzYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjptZW1vcnlMaW1pdCk6CisgICAgICAgIChXZWJD
b3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6c2V0TWVtb3J5TGltaXQpOgorICAg
ICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OnBydW5lKToKKyAg
ICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpab21iaWVUZXh0
dXJlOjpab21iaWVUZXh0dXJlKToKKyAgICAgICAgKFpvbWJpZVRleHR1cmUpOgorICAgICAgICAo
V2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmluY01lbW9yeVVzYWdlKToK
KyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpkZWNNZW1v
cnlVc2FnZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVh
ZDo6Q29sb3JIYXNoOjpoYXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBv
c2l0aW5nVGhyZWFkOjpDb2xvckhhc2g6OmVxdWFsKToKKyAgICAgICAgKENvbG9ySGFzaCk6Cisg
ICAgICAgIChDb2xvckhhc2hUcmFpdHMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hl
Q29tcG9zaXRpbmdUaHJlYWQ6OkNvbG9ySGFzaFRyYWl0czo6Y29uc3RydWN0RGVsZXRlZFZhbHVl
KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpDb2xv
ckhhc2hUcmFpdHM6OmlzRGVsZXRlZFZhbHVlKToKKwogMjAxMi0wMy0wNSAgUGF2ZWwgUG9kaXZp
bG92ICA8cG9kaXZpbG92QGNocm9taXVtLm9yZz4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBm
aXggZXh0ZW5zaW9ucy1yZXNvdXJjZS5odG1sIHRlc3QuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1RleHR1cmUuY3BwIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li4xODg4M2Q3NDQwYzI3OGVlMzIxMDYwYjIzYjA4ZjA0ZjkwZTkyZDAzCi0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJl
LmNwcApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBS
ZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy
YWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAx
ICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiQ29sb3IuaCIK
KyNpbmNsdWRlICJUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZC5oIgorCisjaW5jbHVkZSA8
R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKyNpbmNsdWRlIDx3dGYvQ3VycmVu
dFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYvT3duQXJyYXlQdHIuaD4KKworI2RlZmluZSBERUJVR19U
RVhUVVJFX1VQTE9BRFMgMAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyB2b2lkIGNv
cHlJbWFnZURhdGEodW5zaWduZWQgY2hhciogZHN0LCBpbnQgZHN0U3RyaWRlLCBpbnQgZHN0WCwg
aW50IGRzdFksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywg
aW50IHNyY1N0cmlkZSwgaW50IHNyY1gsIGludCBzcmNZLCBpbnQgd2lkdGgsIGludCBoZWlnaHQp
Cit7CisgICAgZHN0ICs9IChkc3RZICogZHN0U3RyaWRlKSArIChUZXh0dXJlOjpieXRlc1BlclBp
eGVsKCkgKiBkc3RYKTsKKyAgICBzcmMgKz0gKHNyY1kgKiBzcmNTdHJpZGUpICsgKFRleHR1cmU6
OmJ5dGVzUGVyUGl4ZWwoKSAqIHNyY1gpOworICAgIGludCBsZW5ndGggPSBUZXh0dXJlOjpieXRl
c1BlclBpeGVsKCkgKiB3aWR0aDsKKworICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyAr
K3kpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworICAgICAgICBkc3QgKz0g
ZHN0U3RyaWRlOworICAgICAgICBzcmMgKz0gc3JjU3RyaWRlOworICAgIH0KK30KKworVGV4dHVy
ZTo6VGV4dHVyZShib29sIGlzQ29sb3IpCisgICAgOiBtX3Byb3RlY3Rpb25Db3VudCgwKQorICAg
ICwgbV90ZXh0dXJlSWQoMCkKKyAgICAsIG1faXNDb2xvcihpc0NvbG9yKQorICAgICwgbV9pc09w
YXF1ZShmYWxzZSkKK3sKKyAgICB0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT5pbnN0
YWxsKHRoaXMpOworfQorCitUZXh0dXJlOjp+VGV4dHVyZSgpCit7CisgICAgdGV4dHVyZUNhY2hl
Q29tcG9zaXRpbmdUaHJlYWQoKS0+dGV4dHVyZURlc3Ryb3llZCh0aGlzKTsKK30KKwordm9pZCBU
ZXh0dXJlOjp1cGRhdGVDb250ZW50cyhjb25zdCBTa0JpdG1hcCYgY29udGVudHMsIGNvbnN0IElu
dFJlY3QmIGRpcnR5UmVjdCwgY29uc3QgSW50UmVjdCYgdGlsZSwgYm9vbCBpc09wYXF1ZSkKK3sK
KyAgICBJbnRSZWN0IHRpbGVEaXJ0eVJlY3QoZGlydHlSZWN0KTsKKworICAgIHRpbGVEaXJ0eVJl
Y3QuaW50ZXJzZWN0KHRpbGUpOworICAgIGlmICh0aWxlRGlydHlSZWN0LmlzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9pc09wYXF1ZSA9IGlzT3BhcXVlOworCisgICAgaW50IHN0
cmlkZSA9IGJ5dGVzUGVyUGl4ZWwoKSAqIGNvbnRlbnRzLndpZHRoKCk7CisgICAgaW50IHggPSB0
aWxlRGlydHlSZWN0LngoKSAtIGRpcnR5UmVjdC54KCk7CisgICAgaW50IHkgPSB0aWxlRGlydHlS
ZWN0LnkoKSAtIGRpcnR5UmVjdC55KCk7CisgICAgU2tBdXRvTG9ja1BpeGVscyBsb2NrKGNvbnRl
bnRzKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBwaXhlbHMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBj
aGFyKj4oY29udGVudHMuZ2V0UGl4ZWxzKCkpOworICAgIHBpeGVscyArPSAoeSAqIHN0cmlkZSkg
KyAoYnl0ZXNQZXJQaXhlbCgpICogeCk7CisgICAgaWYgKCFwaXhlbHMpCisgICAgICAgIHJldHVy
bjsKKworICAgIGJvb2wgc3ViSW1hZ2UgPSAodGlsZS5zaXplKCkgPT0gbV9zaXplKTsKKyAgICBJ
bnRTaXplIHNpemUgPSBzdWJJbWFnZSA/IHRpbGVEaXJ0eVJlY3Quc2l6ZSgpIDogdGlsZS5zaXpl
KCk7CisgICAgSW50U2l6ZSBjb250ZW50c1NpemUoSW50U2l6ZShjb250ZW50cy53aWR0aCgpLCBj
b250ZW50cy5oZWlnaHQoKSkpOworCisjaWYgREVCVUdfVEVYVFVSRV9VUExPQURTCisgICAgZnBy
aW50ZihzdGRlcnIsICIlc1xuIiwgc3ViSW1hZ2UgPyAiU1VCSU1BR0UiIDogIklNQUdFIik7Cisg
ICAgZnByaW50ZihzdGRlcnIsICIgIHRpbGUgPSAoeD0lZCx5PSVkLHdpZHRoPSVkLGhlaWdodD0l
ZCksIG1fc2l6ZSA9ICglZHglZClcbiIsIHRpbGUueCgpLCB0aWxlLnkoKSwgdGlsZS53aWR0aCgp
LCB0aWxlLmhlaWdodCgpLCBtX3NpemUud2lkdGgoKSwgbV9zaXplLmhlaWdodCgpKTsKKyAgICBm
cHJpbnRmKHN0ZGVyciwgIiAgdGlsZURpcnR5UmVjdCA9ICh4PSVkLHk9JWQsd2lkdGg9JWQsaGVp
Z2h0PSVkKSwgY29udGVudHMuc2l6ZSgpID0gKCVkeCVkKVxuIiwgdGlsZURpcnR5UmVjdC54KCks
IHRpbGVEaXJ0eVJlY3QueSgpLCB0aWxlRGlydHlSZWN0LndpZHRoKCksIHRpbGVEaXJ0eVJlY3Qu
aGVpZ2h0KCksIGNvbnRlbnRzU2l6ZS53aWR0aCgpLCBjb250ZW50c1NpemUuaGVpZ2h0KCkpOwor
ICAgIEludFNpemUgeWVPbGRlU2l6ZSA9IHNpemU7CisjZW5kaWYKKworICAgIHNpemUgPSBzaXpl
LnNocnVua1RvKGNvbnRlbnRzU2l6ZSk7CisKKyNpZiBERUJVR19URVhUVVJFX1VQTE9BRFMKKyAg
ICBpZiAoc2l6ZSAhPSB5ZU9sZGVTaXplKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgU0hS
VU5LISEhIVxuIik7CisjZW5kaWYKKworICAgIGlmICghaGFzVGV4dHVyZSgpKSB7CisgICAgICAg
IC8vIFdlIG1heSBoYXZlIGJlZW4gZXZpY3RlZCBieSB0aGUgVGV4dHVyZUNhY2hlQ29tcG9zaXRp
bmdUaHJlYWQsCisgICAgICAgIC8vIGF0dGVtcHQgdG8gaW5zdGFsbCB1cyBhZ2Fpbi4KKyAgICAg
ICAgaWYgKCF0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT5pbnN0YWxsKHRoaXMpKQor
ICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVS
RV8yRCwgbV90ZXh0dXJlSWQpOworCisgICAgQVNTRVJUKHNpemUud2lkdGgoKSA+PSAwKTsKKyAg
ICBib29sIGRvZXNUaWxlU3RyaWRlRXF1YWxUZXh0dXJlU3RyaWRlID0gY29udGVudHMud2lkdGgo
KSA9PSBzaXplLndpZHRoKCk7CisKKyAgICBPd25BcnJheVB0cjx1bnNpZ25lZCBjaGFyPiB0bXA7
CisgICAgaWYgKCFkb2VzVGlsZVN0cmlkZUVxdWFsVGV4dHVyZVN0cmlkZSkgeworI2lmIGRlZmlu
ZWQoR0xfVU5QQUNLX1JPV19MRU5HVEgpCisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNL
X1JPV19MRU5HVEgsIGNvbnRlbnRzLndpZHRoKCkpOworI2Vsc2UKKyAgICAgICAgdG1wID0gYWRv
cHRBcnJheVB0cihuZXcgdW5zaWduZWQgY2hhcltzaXplLndpZHRoKCkgKiBzaXplLmhlaWdodCgp
ICogYnl0ZXNQZXJQaXhlbCgpXSk7CisgICAgICAgIGNvcHlJbWFnZURhdGEodG1wLmdldCgpLCBi
eXRlc1BlclBpeGVsKCkgKiBzaXplLndpZHRoKCksIDAsIDAsCisgICAgICAgICAgICAgICAgICAg
ICAgcGl4ZWxzLCBzdHJpZGUsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZS53aWR0
aCgpLCBzaXplLmhlaWdodCgpKTsKKyAgICAgICAgcGl4ZWxzID0gdG1wLmdldCgpOworI2VuZGlm
CisgICAgfQorCisgICAgaWYgKHN1YkltYWdlKSB7CisjaWYgREVCVUdfVEVYVFVSRV9VUExPQURT
CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2xUZXhTdWJJbWFnZTJEKCVkLCAlZCwgJWQsICVk
KVxuIiwgdGlsZURpcnR5UmVjdC54KCkgLSB0aWxlLngoKSwgdGlsZURpcnR5UmVjdC55KCkgLSB0
aWxlLnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUud2lkdGgoKSwgc2l6ZS5oZWln
aHQoKSk7CisgICAgICAgIGRvdWJsZSB0ID0gY3VycmVudFRpbWUoKTsKKyNlbmRpZgorICAgICAg
ICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHRpbGVEaXJ0eVJlY3QueCgpIC0gdGlsZS54KCksIHRpbGVEaXJ0eVJlY3QueSgpIC0gdGls
ZS55KCksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0
KCksCisgICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBw
aXhlbHMpOworI2lmIERFQlVHX1RFWFRVUkVfVVBMT0FEUworICAgICAgICB0ID0gY3VycmVudFRp
bWUoKSAtIHQ7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgIHRpbWUgPSAlZiBzICglZCBi
eXRlcylcbiIsIHQsIHNpemUud2lkdGgoKSpzaXplLmhlaWdodCgpKjQpOworI2VuZGlmCisgICAg
fSBlbHNlIHsKKyNpZiBERUJVR19URVhUVVJFX1VQTE9BRFMKKyAgICAgICAgZnByaW50ZihzdGRl
cnIsICJnbFRleEltYWdlMkQoJWQsICVkKVxuIiwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgp
KTsKKyAgICAgICAgZG91YmxlIHQgPSBjdXJyZW50VGltZSgpOworI2VuZGlmCisgICAgICAgIGds
VGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCBzaXplLndpZHRoKCksIHNpemUu
aGVpZ2h0KCksIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7CisjaWYgREVC
VUdfVEVYVFVSRV9VUExPQURTCisgICAgICAgIHQgPSBjdXJyZW50VGltZSgpIC0gdDsKKyAgICAg
ICAgZnByaW50ZihzdGRlcnIsICIgICAgdGltZSA9ICVmIHMgKCVkIGJ5dGVzKVxuIiwgdCwgc2l6
ZS53aWR0aCgpKnNpemUuaGVpZ2h0KCkqNCk7CisjZW5kaWYKKyAgICB9CisKKyNpZiBkZWZpbmVk
KEdMX1VOUEFDS19ST1dfTEVOR1RIKQorICAgIGlmICghZG9lc1RpbGVTdHJpZGVFcXVhbFRleHR1
cmVTdHJpZGUpCisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX1JPV19MRU5HVEgsIDAp
OworI2VuZGlmCisKKyAgICBJbnRTaXplIG9sZFNpemUgPSBtX3NpemU7CisgICAgbV9zaXplID0g
dGlsZS5zaXplKCk7CisgICAgaWYgKG1fc2l6ZSAhPSBvbGRTaXplKQorICAgICAgICB0ZXh0dXJl
Q2FjaGVDb21wb3NpdGluZ1RocmVhZCgpLT50ZXh0dXJlUmVzaXplZCh0aGlzLCBvbGRTaXplKTsK
K30KKwordm9pZCBUZXh0dXJlOjpzZXRDb250ZW50c1RvQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9y
KQoreworICAgIG1faXNPcGFxdWUgPSAhY29sb3IuaGFzQWxwaGEoKTsKKyAgICBSR0JBMzIgcmdi
YSA9IGNvbG9yLnJnYigpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0
dXJlSWQpOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCAxLCAx
LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCAmcmdiYSk7CisKKyAgICBJbnRTaXplIG9s
ZFNpemUgPSBtX3NpemU7CisgICAgbV9zaXplID0gSW50U2l6ZSgxLCAxKTsKKyAgICBpZiAobV9z
aXplICE9IG9sZFNpemUpCisgICAgICAgIHRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCkt
PnRleHR1cmVSZXNpemVkKHRoaXMsIG9sZFNpemUpOworfQorCitib29sIFRleHR1cmU6OnByb3Rl
Y3QoY29uc3QgSW50U2l6ZSYgc2l6ZSkKK3sKKyAgICBpZiAoIWhhc1RleHR1cmUoKSkgeworICAg
ICAgICAvLyBXZSBtYXkgaGF2ZSBiZWVuIGV2aWN0ZWQgYnkgdGhlIFRleHR1cmVDYWNoZUNvbXBv
c2l0aW5nVGhyZWFkLAorICAgICAgICAvLyBhdHRlbXB0IHRvIGluc3RhbGwgdXMgYWdhaW4uCisg
ICAgICAgIGlmICghdGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKS0+aW5zdGFsbCh0aGlz
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICArK21fcHJvdGVjdGlv
bkNvdW50OworCisgICAgaWYgKG1fc2l6ZSA9PSBzaXplKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIEludFNpemUgb2xkU2l6ZSA9IG1fc2l6ZTsKKyAgICBtX3NpemUgPSBzaXplOworICAg
IHRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCktPnRleHR1cmVSZXNpemVkKHRoaXMsIG9s
ZFNpemUpOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleHR1cmVJZCk7
CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAgLCBHTF9SR0JBLCBzaXplLndpZHRo
KCksIHNpemUuaGVpZ2h0KCksIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIDApOworICAg
IHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBV
U0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1RleHR1cmUuaCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvVGV4dHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjgwZGU0YWEw
ZmNlY2UyNWIyZTdkMzk2YmMwNDIzNmRhNTM3ODNjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1RleHR1cmUuaApAQCAtMCww
ICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1v
dGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3Jp
dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisK
KyNpZm5kZWYgVGV4dHVyZV9oCisjZGVmaW5lIFRleHR1cmVfaAorCisjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIkludFNp
emUuaCIKKworI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisKK2NsYXNzIFNrQml0bWFwOwor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENvbG9yOworY2xhc3MgVGV4dHVyZUNhY2hl
Q29tcG9zaXRpbmdUaHJlYWQ7CisKKy8vIFRleHR1cmUgZW5jYXBzdWxhdGVzIGEgdm9sYXRpbGUg
dGV4dHVyZSAtIGF0IGFueSB0aW1lLCB0aGUgdW5kZXJseWluZyBPcGVuR0wKKy8vIHRleHR1cmUg
bWF5IGJlIGRlbGV0ZWQgYnkgdGhlIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkLiBUaGUg
dXNlciBtdXN0CisvLyBjaGVjayB1c2luZyBUZXh0dXJlOjppc0RpcnR5KCkgaW1tZWRpYXRlbHkg
YmVmb3JlIHVzaW5nIGl0LCBldmVyeSB0aW1lLgorLy8gVGhlIG9ubHkgd2F5IHRvIHByZXZlbnQg
ZXZpY3Rpb24gdGhpcyBpcyB0byBjYWxsIFRleHR1cmU6OnByb3RlY3QoKS4KKy8vIElmIHRoZSB0
ZXh0dXJlIGlzRGlydHkoKSwgeW91IG11c3QgdXBkYXRlQ29udGVudHMoKSBiZWZvcmUgeW91IGNh
biB1c2UgaXQuCitjbGFzcyBUZXh0dXJlIDogcHVibGljIFJlZkNvdW50ZWQ8VGV4dHVyZT4gewor
cHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFRleHR1cmU+IGNyZWF0ZShib29sIGlzQ29s
b3IgPSBmYWxzZSkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgVGV4dHVyZShp
c0NvbG9yKSk7CisgICAgfQorCisgICAgflRleHR1cmUoKTsKKworICAgIHVuc2lnbmVkIHRleHR1
cmVJZCgpIGNvbnN0IHsgcmV0dXJuIG1fdGV4dHVyZUlkOyB9CisKKyAgICBib29sIGlzRGlydHko
KSBjb25zdCB7IHJldHVybiAhbV90ZXh0dXJlSWQ7IH0KKyAgICBib29sIGhhc1RleHR1cmUoKSBj
b25zdCB7IHJldHVybiBtX3RleHR1cmVJZDsgfQorCisgICAgYm9vbCBpc0NvbG9yKCkgY29uc3Qg
eyByZXR1cm4gbV9pc0NvbG9yOyB9CisgICAgYm9vbCBpc09wYXF1ZSgpIGNvbnN0IHsgcmV0dXJu
IG1faXNPcGFxdWU7IH0KKworICAgIGJvb2wgaXNQcm90ZWN0ZWQoKSBjb25zdCB7IHJldHVybiBt
X3Byb3RlY3Rpb25Db3VudCA+IDA7IH0KKyAgICB2b2lkIHByb3RlY3QoKSB7ICsrbV9wcm90ZWN0
aW9uQ291bnQ7IH0KKyAgICB2b2lkIHVucHJvdGVjdCgpIHsgLS1tX3Byb3RlY3Rpb25Db3VudDsg
fQorICAgIGJvb2wgcHJvdGVjdChjb25zdCBJbnRTaXplJik7CisKKyAgICB2b2lkIHVwZGF0ZUNv
bnRlbnRzKGNvbnN0IFNrQml0bWFwJiBjb250ZW50cywgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0
LCBjb25zdCBJbnRSZWN0JiB0aWxlLCBib29sIGlzT3BhcXVlID0gZmFsc2UpOworICAgIHZvaWQg
c2V0Q29udGVudHNUb0NvbG9yKGNvbnN0IENvbG9yJik7CisKKyAgICBJbnRTaXplIHNpemUoKSBj
b25zdCB7IHJldHVybiBtX3NpemU7IH0KKyAgICBpbnQgd2lkdGgoKSBjb25zdCB7IHJldHVybiBt
X3NpemUud2lkdGgoKTsgfQorICAgIGludCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX3NpemUu
aGVpZ2h0KCk7IH0KKyAgICBzdGF0aWMgaW50IGJ5dGVzUGVyUGl4ZWwoKSB7IHJldHVybiA0OyB9
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhy
ZWFkOworCisgICAgVGV4dHVyZShib29sIGlzQ29sb3IgPSBmYWxzZSk7CisKKyAgICB2b2lkIHNl
dFRleHR1cmVJZCh1bnNpZ25lZCBpZCkKKyAgICB7CisgICAgICAgIG1fdGV4dHVyZUlkID0gaWQ7
CisKKyAgICAgICAgLy8gV2UgYXNzdW1lIGl0IGlzIGEgbmV3bHkgYWxsb2NhdGVkIHRleHR1cmUs
CisgICAgICAgIC8vIGFuZCB0aHVzIGVtcHR5LCBvciAwLCB3aGljaCB3b3VsZCBvZiBjb3Vyc2UK
KyAgICAgICAgLy8gYmUgZW1wdHkuCisgICAgICAgIG1fc2l6ZSA9IEludFNpemUoKTsKKyAgICB9
CisKKyAgICBpbnQgbV9wcm90ZWN0aW9uQ291bnQ7CisgICAgdW5zaWduZWQgbV90ZXh0dXJlSWQ7
CisgICAgSW50U2l6ZSBtX3NpemU7CisgICAgYm9vbCBtX2lzQ29sb3I7CisgICAgYm9vbCBtX2lz
T3BhcXVlOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gVGV4dHVyZV9oCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1RleHR1cmVDYWNo
ZUNvbXBvc2l0aW5nVGhyZWFkLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2JsYWNrYmVycnkvVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LjMyNTUzMzI5MmMzM2UwYTk1MjE3MjYwNzZjYzMxNmFiYzVjOTE5NGMKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1RleHR1cmVD
YWNoZUNvbXBvc2l0aW5nVGhyZWFkLmNwcApAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQuaCIKKworI2lmIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUg
PFNrQml0bWFwLmg+CisKKyNkZWZpbmUgREVCVUdfVEVYVFVSRV9NRU1PUllfVVNBR0UgMAorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBpbnQgZGVmYXVsdE1lbW9yeUxpbWl0
ID0gNjQgKiAxMDI0ICogMTAyNDsgLy8gTWVhc3VyZWQgaW4gYnl0ZXMuCisKKy8vIFVzZWQgdG8g
cHJvdGVjdCBhIG5ld2x5IGNyZWF0ZWQgdGV4dHVyZSBmcm9tIGJlaW5nIGltbWVkaWF0ZWx5IGV2
aWN0ZWQKKy8vIGJlZm9yZSBzb21lb25lIGhhcyBhIGNoYW5jZSB0byBwcm90ZWN0IGl0IGZvciBs
ZWdpdGltYXRlIHJlYXNvbnMuCitjbGFzcyBUZXh0dXJlUHJvdGVjdG9yIHsKK3B1YmxpYzoKKyAg
ICBUZXh0dXJlUHJvdGVjdG9yKFRleHR1cmUqIHRleHR1cmUpCisgICAgICAgIDogbV90ZXh0dXJl
KHRleHR1cmUpCisgICAgeworICAgICAgICBtX3RleHR1cmUtPnByb3RlY3QoKTsKKyAgICB9CisK
KyAgICB+VGV4dHVyZVByb3RlY3RvcigpCisgICAgeworICAgICAgICBtX3RleHR1cmUtPnVucHJv
dGVjdCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBUZXh0dXJlKiBtX3RleHR1cmU7Cit9Owor
CitUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdU
aHJlYWQoKQorICAgIDogbV9tZW1vcnlVc2FnZSgwKQorICAgICwgbV9tZW1vcnlMaW1pdChkZWZh
dWx0TWVtb3J5TGltaXQpCit7Cit9CisKK3Vuc2lnbmVkIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5n
VGhyZWFkOjphbGxvY2F0ZVRleHR1cmVJZCgpCit7CisgICAgdW5zaWduZWQgdGV4aWQ7CisgICAg
Z2xHZW5UZXh0dXJlcygxLCAmdGV4aWQpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8y
RCwgdGV4aWQpOworICAgIGlmICghZ2xJc1RleHR1cmUodGV4aWQpKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIC8vIERvIGJhc2ljIGxpbmVhciBmaWx0ZXJpbmcgb24gcmVzaXplLgorICAgIGds
VGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJ
TkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFH
X0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAvLyBOUE9UIHRleHR1cmVzIGluIEdMIEVTIG9ubHkg
d29yayB3aGVuIHRoZSB3cmFwIG1vZGUgaXMgc2V0IHRvIEdMX0NMQU1QX1RPX0VER0UuCisgICAg
Z2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFN
UF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVS
RV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIHJldHVybiB0ZXhpZDsKK30KKwordm9p
ZCBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6ZnJlZVRleHR1cmVJZCh1bnNpZ25lZCBp
ZCkKK3sKKyAgICBpZiAoaWQpCisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJmlkKTsKK30K
Kwordm9pZCBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6Y29sbGVjdEdhcmJhZ2UoKQor
eworICAgIGludCBkZWx0YSA9IDA7CisKKyAgICBmb3IgKEdhcmJhZ2U6Oml0ZXJhdG9yIGl0ID0g
bV9nYXJiYWdlLmJlZ2luKCk7IGl0ICE9IG1fZ2FyYmFnZS5lbmQoKTsgKytpdCkgeworICAgICAg
ICBab21iaWVUZXh0dXJlJiB6b21iaWUgPSAqaXQ7CisgICAgICAgIGZyZWVUZXh0dXJlSWQoem9t
YmllLmlkKTsKKyAgICAgICAgZGVsdGEgKz0gem9tYmllLnNpemUud2lkdGgoKSAqIHpvbWJpZS5z
aXplLmhlaWdodCgpICogVGV4dHVyZTo6Ynl0ZXNQZXJQaXhlbCgpOworICAgIH0KKyAgICBtX2dh
cmJhZ2UuY2xlYXIoKTsKKworICAgIGlmIChkZWx0YSkKKyAgICAgICAgZGVjTWVtb3J5VXNhZ2Uo
ZGVsdGEpOworfQorCit2b2lkIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjp0ZXh0dXJl
UmVzaXplZChUZXh0dXJlKiB0ZXh0dXJlLCBjb25zdCBJbnRTaXplJiBvbGRTaXplKQoreworICAg
IGludCBkZWx0YSA9ICh0ZXh0dXJlLT53aWR0aCgpICogdGV4dHVyZS0+aGVpZ2h0KCkgLSBvbGRT
aXplLndpZHRoKCkgKiBvbGRTaXplLmhlaWdodCgpKSAqIFRleHR1cmU6OmJ5dGVzUGVyUGl4ZWwo
KTsKKyAgICBpbmNNZW1vcnlVc2FnZShkZWx0YSk7CisgICAgaWYgKGRlbHRhID4gMCkKKyAgICAg
ICAgcHJ1bmUoKTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6dGV4
dHVyZURlc3Ryb3llZChUZXh0dXJlKiB0ZXh0dXJlKQoreworICAgIGlmICh0ZXh0dXJlLT5pc0Nv
bG9yKCkpIHsKKyAgICAgICAgbV9nYXJiYWdlLmFwcGVuZChab21iaWVUZXh0dXJlKHRleHR1cmUp
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGV2aWN0KG1fdGV4dHVyZXMuZmluZCh0
ZXh0dXJlKSk7Cit9CisKK2Jvb2wgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6Omluc3Rh
bGwoVGV4dHVyZSogdGV4dHVyZSkKK3sKKyAgICBpZiAoIXRleHR1cmUpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgaWYgKCF0ZXh0dXJlLT5oYXNUZXh0dXJlKCkpIHsKKyAgICAgICAgdW5z
aWduZWQgdGV4dHVyZUlkID0gYWxsb2NhdGVUZXh0dXJlSWQoKTsKKyAgICAgICAgaWYgKCF0ZXh0
dXJlSWQpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdGV4dHVyZS0+c2V0
VGV4dHVyZUlkKHRleHR1cmVJZCk7CisgICAgfQorCisgICAgaWYgKCF0ZXh0dXJlLT5pc0NvbG9y
KCkpIHsKKyAgICAgICAgaWYgKCFtX3RleHR1cmVzLmNvbnRhaW5zKHRleHR1cmUpKQorICAgICAg
ICAgICAgbV90ZXh0dXJlcy5hZGQodGV4dHVyZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmV2aWN0KGNvbnN0IFRl
eHR1cmVTZXQ6Oml0ZXJhdG9yJiBpdCkKK3sKKyAgICBpZiAoaXQgPT0gbV90ZXh0dXJlcy5lbmQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVGV4dHVyZSogdGV4dHVyZSA9ICppdDsKKyAgICBp
ZiAodGV4dHVyZS0+aGFzVGV4dHVyZSgpKQorICAgICAgICBtX2dhcmJhZ2UuYXBwZW5kKFpvbWJp
ZVRleHR1cmUodGV4dHVyZSkpOworCisgICAgdGV4dHVyZS0+c2V0VGV4dHVyZUlkKDApOworCisg
ICAgbV90ZXh0dXJlcy5yZW1vdmUoaXQpOworfQorCit2b2lkIFRleHR1cmVDYWNoZUNvbXBvc2l0
aW5nVGhyZWFkOjp0ZXh0dXJlQWNjZXNzZWQoVGV4dHVyZSogdGV4dHVyZSkKK3sKKyAgICBpZiAo
dGV4dHVyZS0+aXNDb2xvcigpKQorICAgICAgICByZXR1cm47CisKKyAgICBUZXh0dXJlU2V0Ojpp
dGVyYXRvciBpdCA9IG1fdGV4dHVyZXMuZmluZCh0ZXh0dXJlKTsKKyAgICBpZiAoaXQgPT0gbV90
ZXh0dXJlcy5lbmQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV90ZXh0dXJlcy5yZW1vdmUo
aXQpOworICAgIG1fdGV4dHVyZXMuYWRkKHRleHR1cmUpOworfQorCitUZXh0dXJlQ2FjaGVDb21w
b3NpdGluZ1RocmVhZCogdGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKQoreworICAgIHN0
YXRpYyBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCogc3RhdGljQ2FjaGUgPSBuZXcgVGV4
dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ7CisgICAgcmV0dXJuIHN0YXRpY0NhY2hlOworfQor
Cit2b2lkIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpwcnVuZShzaXplX3QgbGltaXQp
Cit7CisgICAgd2hpbGUgKG1fbWVtb3J5VXNhZ2UgPiBsaW1pdCkgeworICAgICAgICBib29sIGZv
dW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoVGV4dHVyZVNldDo6aXRlcmF0b3IgaXQgPSBtX3Rl
eHR1cmVzLmJlZ2luKCk7IGl0ICE9IG1fdGV4dHVyZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAg
ICAgIFRleHR1cmUqIHRleHR1cmUgPSAqaXQ7CisgICAgICAgICAgICBpZiAodGV4dHVyZS0+aXNQ
cm90ZWN0ZWQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGV2aWN0
KGl0KTsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9
CisKK3ZvaWQgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmNsZWFyKCkKK3sKKyAgICBt
X2NhY2hlLmNsZWFyKCk7CisgICAgbV9jb2xvcnMuY2xlYXIoKTsKKyAgICBjb2xsZWN0R2FyYmFn
ZSgpOworfQorCit2b2lkIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpzZXRNZW1vcnlV
c2FnZShzaXplX3QgbWVtb3J5VXNhZ2UpCit7CisgICAgbV9tZW1vcnlVc2FnZSA9IG1lbW9yeVVz
YWdlOworI2lmIERFQlVHX1RFWFRVUkVfTUVNT1JZX1VTQUdFCisgICAgZnByaW50ZihzdGRlcnIs
ICJUZXh0dXJlIG1lbW9yeSB1c2FnZSAldSBrQlxuIiwgbV9tZW1vcnlVc2FnZSAvIDEwMjQpOwor
I2VuZGlmCit9CisKK1Bhc3NSZWZQdHI8VGV4dHVyZT4gVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdU
aHJlYWQ6OnRleHR1cmVGb3JUaWxlZENvbnRlbnRzKGNvbnN0IFNrQml0bWFwJiBjb250ZW50cywg
Y29uc3QgSW50UmVjdCYgdGlsZVJlY3QsIGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIGJvb2wgaXNP
cGFxdWUpCit7CisgICAgSGFzaE1hcDxDb250ZW50c0tleSwgVGV4dHVyZU1hcD46Oml0ZXJhdG9y
IGl0ID0gbV9jYWNoZS5hZGQoa2V5KGNvbnRlbnRzKSwgVGV4dHVyZU1hcCgpKS5maXJzdDsKKyAg
ICBUZXh0dXJlTWFwJiBtYXAgPSAoKml0KS5zZWNvbmQ7CisKKyAgICBUZXh0dXJlTWFwOjppdGVy
YXRvciBqdCA9IG1hcC5hZGQoaW5kZXgsIFJlZlB0cjxUZXh0dXJlPigpKS5maXJzdDsKKyAgICBS
ZWZQdHI8VGV4dHVyZT4gdGV4dHVyZSA9ICgqanQpLnNlY29uZDsKKyAgICBpZiAoIXRleHR1cmUp
IHsKKyAgICAgICAgdGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoKTsKKyNpZiBERUJVR19URVhUVVJF
X01FTU9SWV9VU0FHRQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNyZWF0aW5nIHRleHR1cmUg
MHgleCBmb3IgMHgleCslZCBAICglZCwgJWQpXG4iLCB0ZXh0dXJlLmdldCgpLCBjb250ZW50cy5w
aXhlbFJlZigpLCBjb250ZW50cy5waXhlbFJlZk9mZnNldCgpLCBpbmRleC5pKCksIGluZGV4Lmoo
KSk7CisjZW5kaWYKKyAgICAgICAgbWFwLnNldChpbmRleCwgdGV4dHVyZSk7CisgICAgfQorCisg
ICAgLy8gUHJvdGVjdCBuZXdseSBjcmVhdGVkIHRleHR1cmUgZnJvbSBiZWluZyBldmljdGVkLgor
ICAgIFRleHR1cmVQcm90ZWN0b3IgcHJvdGVjdG9yKHRleHR1cmUuZ2V0KCkpOworCisgICAgSW50
U2l6ZSBjb250ZW50c1NpemUoY29udGVudHMud2lkdGgoKSwgY29udGVudHMuaGVpZ2h0KCkpOwor
ICAgIEludFJlY3QgZGlydHlSZWN0KEludFBvaW50KCksIGNvbnRlbnRzU2l6ZSk7CisgICAgaWYg
KHRpbGVSZWN0LnNpemUoKSAhPSB0ZXh0dXJlLT5zaXplKCkpIHsKKyNpZiBERUJVR19URVhUVVJF
X01FTU9SWV9VU0FHRQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVwZGF0aW5nIHRleHR1cmUg
MHgleCBmb3IgMHgleCslZCBAICglZCwgJWQpXG4iLCB0ZXh0dXJlLmdldCgpLCBjb250ZW50cy5w
aXhlbFJlZigpLCBjb250ZW50cy5waXhlbFJlZk9mZnNldCgpLCBpbmRleC5pKCksIGluZGV4Lmoo
KSk7CisjZW5kaWYKKyAgICAgICAgdGV4dHVyZS0+dXBkYXRlQ29udGVudHMoY29udGVudHMsIGRp
cnR5UmVjdCwgdGlsZVJlY3QsIGlzT3BhcXVlKTsKKyAgICB9CisgICAgcmV0dXJuIHRleHR1cmUu
cmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPFRleHR1cmU+IFRleHR1cmVDYWNoZUNvbXBvc2l0
aW5nVGhyZWFkOjp0ZXh0dXJlRm9yQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIC8v
IEp1c3QgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGdldCBmb29sZWQgYnkgc29tZSBtYWxpY2lvdXMg
d2ViIHBhZ2UKKyAgICAvLyBpbnRvIGNhY2hpbmcgbWlsbGlvbnMgb2YgY29sb3IgdGV4dHVyZXMu
CisgICAgaWYgKG1fY29sb3JzLnNpemUoKSA+IDEwMCkKKyAgICAgICAgbV9jb2xvcnMuY2xlYXIo
KTsKKworICAgIENvbG9yVGV4dHVyZU1hcDo6aXRlcmF0b3IgaXQgPSBtX2NvbG9ycy5maW5kKGNv
bG9yKTsKKyAgICBSZWZQdHI8VGV4dHVyZT4gdGV4dHVyZTsKKyAgICBpZiAoaXQgPT0gbV9jb2xv
cnMuZW5kKCkpIHsKKyAgICAgICAgdGV4dHVyZSA9IFRleHR1cmU6OmNyZWF0ZSh0cnVlIC8qIGlz
Q29sb3IgKi8pOworI2lmIERFQlVHX1RFWFRVUkVfTUVNT1JZX1VTQUdFCisgICAgICAgIGZwcmlu
dGYoc3RkZXJyLCAiQ3JlYXRpbmcgdGV4dHVyZSAweCV4IGZvciBjb2xvciAweCV4XG4iLCB0ZXh0
dXJlLmdldCgpLCBjb2xvci5yZ2IoKSk7CisjZW5kaWYKKyAgICAgICAgbV9jb2xvcnMuc2V0KGNv
bG9yLCB0ZXh0dXJlKTsKKyAgICB9IGVsc2UKKyAgICAgICAgdGV4dHVyZSA9ICgqaXQpLnNlY29u
ZDsKKworICAgIC8vIENvbG9yIHRleHR1cmVzIGNhbid0IGJlIGV2aWN0ZWQsIHNvIG5vIG5lZWQg
Zm9yIFRleHR1cmVQcm90ZWN0b3IuCisKKyAgICBpZiAodGV4dHVyZS0+c2l6ZSgpICE9IEludFNp
emUoMSwgMSkpCisgICAgICAgIHRleHR1cmUtPnNldENvbnRlbnRzVG9Db2xvcihjb2xvcik7CisK
KyAgICByZXR1cm4gdGV4dHVyZS5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8VGV4dHVyZT4g
VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OnVwZGF0ZUNvbnRlbnRzKGNvbnN0IFJlZlB0
cjxUZXh0dXJlPiYgdGV4dHVyZUluLCBjb25zdCBTa0JpdG1hcCYgY29udGVudHMsIGNvbnN0IElu
dFJlY3QmIGRpcnR5UmVjdCwgY29uc3QgSW50UmVjdCYgdGlsZVJlY3QpCit7CisgICAgUmVmUHRy
PFRleHR1cmU+IHRleHR1cmUodGV4dHVyZUluKTsKKworICAgIC8vIElmIHRoZSB0ZXh0dXJlIHdh
cyAwLCBvciBuZWVkcyB0byB0cmFuc2l0aW9uIGZyb20gYSBzb2xpZCBjb2xvciB0ZXh0dXJlIHRv
IGEgY29udGVudHMgdGV4dHVyZSwKKyAgICAvLyBjcmVhdGUgYSBuZXcgdGV4dHVyZS4KKyAgICBp
ZiAoIXRleHR1cmUgfHwgdGV4dHVyZS0+aXNDb2xvcigpKQorICAgICAgICB0ZXh0dXJlID0gY3Jl
YXRlVGV4dHVyZSgpOworCisgICAgLy8gUHJvdGVjdCBuZXdseSBjcmVhdGVkIHRleHR1cmUgZnJv
bSBiZWluZyBldmljdGVkLgorICAgIFRleHR1cmVQcm90ZWN0b3IgcHJvdGVjdG9yKHRleHR1cmUu
Z2V0KCkpOworCisgICAgdGV4dHVyZS0+dXBkYXRlQ29udGVudHMoY29udGVudHMsIGRpcnR5UmVj
dCwgdGlsZVJlY3QpOworCisgICAgcmV0dXJuIHRleHR1cmUucmVsZWFzZSgpOworfQorCitUZXh0
dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6Q29udGVudHNLZXkgVGV4dHVyZUNhY2hlQ29tcG9z
aXRpbmdUaHJlYWQ6OmtleShjb25zdCBTa0JpdG1hcCYgY29udGVudHMpCit7CisgICAgLy8gVGhl
IHBpeGVsUmVmIGlzIGFuIGFkZHJlc3MsIGFuZCBhZGRyZXNzZXMgY2FuIGJlIHJldXNlZCBieSB0
aGUgYWxsb2NhdG9yCisgICAgLy8gc28gaXQncyB1bnN1aXRhYmxlIHRvIHVzZSBhcyBhIGtleS4g
SW5zdGVhZCwgZ3JhYiB0aGUgZ2VuZXJhdGlvbiwgd2hpY2gKKyAgICAvLyBpcyBnbG9iYWxseSB1
bmlxdWUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGluCisgICAgLy8g
U2tQaXhlbFJlZi5jcHAuCisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IGNvbnRlbnRzLmdldEdl
bmVyYXRpb25JRCgpOworCisgICAgLy8gSWYgdGhlIGdlbmVyYXRpb24gaXMgZXF1YWwgdG8gdGhl
IGRlbGV0ZWQgdmFsdWUsIHVzZSBzb21ldGhpbmcgZWxzZSB0aGF0CisgICAgLy8gaXMgdW5saWtl
bHkgdG8gY29ycmVzcG9uZCB0byBhIGdlbmVyYXRpb24gY3VycmVudGx5IGluIHVzZSBvciBzb29u
IHRvIGJlCisgICAgLy8gaW4gdXNlLgorICAgIHVpbnQzMl90IGRlbGV0ZWRWYWx1ZSA9IDA7Cisg
ICAgSGFzaFRyYWl0czx1aW50MzJfdD46OmNvbnN0cnVjdERlbGV0ZWRWYWx1ZShkZWxldGVkVmFs
dWUpOworICAgIGlmIChnZW5lcmF0aW9uID09IGRlbGV0ZWRWYWx1ZSkgeworICAgICAgICAvLyBU
aGlzIHN0cmF0ZWd5IHdvcmtzIGFzIGxvbmcgYXMgdGhlIGRlbGV0ZWQgdmFsdWUgaXMgLTEuCisg
ICAgICAgIEFTU0VSVChkZWxldGVkVmFsdWUgPT0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC0xKSk7
CisgICAgICAgIGdlbmVyYXRpb24gPSBkZWxldGVkVmFsdWUgLyAyOworICAgIH0KKworICAgIC8v
IE5vdyB0aGUgZ2VuZXJhdGlvbiBhbG9uZSBkb2VzIG5vdCB1bmlxdWVseSBpZGVudGlmeSB0aGUg
dGV4dHVyZSBjb250ZW50cy4KKyAgICAvLyBUaGUgc2FtZSBwaXhlbHJlZiBjYW4gYmUgcmV1c2Vk
IGluIGFub3RoZXIgYml0bWFwIGJ1dCB3aXRoIGEgZGlmZmVyZW50CisgICAgLy8gb2Zmc2V0IChz
b21ld2hhdCBjb250cml2ZWQsIGJ1dCBwb3NzaWJsZSkuCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9w
YWlyKGdlbmVyYXRpb24sIGNvbnRlbnRzLnBpeGVsUmVmT2Zmc2V0KCkpOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZC5o
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlQ2Fj
aGVDb21wb3NpdGluZ1RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFjMzc0YmQ3Zjc2YjU1Y2JiZjcwMGUy
Y2U5N2M1ODk1MDQ1NDg2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1RleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkLmgK
QEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTIgUmVzZWFy
Y2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYg
bm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNB
CisgKi8KKworI2lmbmRlZiBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZF9oCisjZGVmaW5l
IFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKworI2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgor
I2luY2x1ZGUgIkxheWVyVGlsZUluZGV4LmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorCisjaW5j
bHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL0xp
c3RIYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3Rm
L1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworLy8gQSBMUlUgY2FjaGUgZm9yIE9wZW5HTCB0ZXh0dXJlcy4KK2NsYXNzIFRleHR1
cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShUZXh0
dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCk7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7
CitwdWJsaWM6CisgICAgZnJpZW5kIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKiB0ZXh0
dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpOworCisgICAgLy8gQ3JlYXRlcyBhIG5ldyB0ZXh0
dXJlIG1hbmFnZWQgYnkgdGhpcyBjYWNoZS4KKyAgICBQYXNzUmVmUHRyPFRleHR1cmU+IGNyZWF0
ZVRleHR1cmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRleHR1cmU6OmNyZWF0ZSgpOworICAg
IH0KKworICAgIC8vIFJldHJpZXZlIGEgdGV4dHVyZSBmcm9tIHRoZSBjYWNoZS4KKyAgICBQYXNz
UmVmUHRyPFRleHR1cmU+IHRleHR1cmVGb3JUaWxlZENvbnRlbnRzKGNvbnN0IFNrQml0bWFwJiBj
b250ZW50cywgY29uc3QgSW50UmVjdCYgdGlsZVJlY3QsIGNvbnN0IFRpbGVJbmRleCYsIGJvb2wg
aXNPcGFxdWUpOworICAgIFBhc3NSZWZQdHI8VGV4dHVyZT4gdGV4dHVyZUZvckNvbG9yKGNvbnN0
IENvbG9yJik7CisKKyAgICAvLyBVcGRhdGUgY29udGVudHMgb2YgYW4gZXhpc3RpbmcgdGV4dHVy
ZSwgb3IgY3JlYXRlIGEgbmV3IG9uZSBpZiB0ZXh0dXJlIGlzIDAuCisgICAgUGFzc1JlZlB0cjxU
ZXh0dXJlPiB1cGRhdGVDb250ZW50cyhjb25zdCBSZWZQdHI8VGV4dHVyZT4mLCBjb25zdCBTa0Jp
dG1hcCYgY29udGVudHMsIGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCwgY29uc3QgSW50UmVjdCYg
dGlsZVJlY3QpOworCisgICAgc2l6ZV90IG1lbW9yeVVzYWdlKCkgY29uc3QgeyByZXR1cm4gbV9t
ZW1vcnlVc2FnZTsgfQorICAgIHNpemVfdCBtZW1vcnlMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIG1f
bWVtb3J5TGltaXQ7IH0KKyAgICB2b2lkIHNldE1lbW9yeUxpbWl0KHNpemVfdCBsaW1pdCkgeyBt
X21lbW9yeUxpbWl0ID0gbGltaXQ7IH0KKworICAgIC8vIEV2aWN0IHVucHJvdGVjdGVkIHRleHR1
cmVzIHVudGlsIHdlIHJlYWNoIHRoZSBsaW1pdCBwcm92aWRlZC4KKyAgICB2b2lkIHBydW5lKHNp
emVfdCBsaW1pdCk7CisgICAgdm9pZCBwcnVuZSgpIHsgcHJ1bmUobWVtb3J5TGltaXQoKSk7IH0K
KworICAgIC8vIEV2aWN0IGFsbCB0ZXh0dXJlcyBmcm9tIHRoZSBjYWNoZS4KKyAgICB2b2lkIGNs
ZWFyKCk7CisKKyAgICAvLyBVcGRhdGUgdGhlIExSVSBsaXN0LgorICAgIHZvaWQgdGV4dHVyZUFj
Y2Vzc2VkKFRleHR1cmUqKTsKKworICAgIC8vIERlbGV0aW5nIGRlc3Ryb3llZCB0ZXh0dXJlcyBp
cyBwcm92aWRlZCBhcyBhIHNlcGFyYXRlIG1ldGhvZCwgYmVjYXVzZQorICAgIC8vIHRoZXJlIG1p
Z2h0IG5vdCBiZSBhbiBPcGVuR0wgY29udGV4dCBjdXJyZW50IHdoZW4gdGhlIHRleHR1cmUgZGVz
dHJ1Y3RvcgorICAgIC8vIHdhcyBjYWxsZWQuIENhbGxpbmcgdGhpcyBtYWtlcyBzdXJlIHRvIGZy
ZWUgYW55IHN1Y2ggdGV4dHVyZXMuCisgICAgdm9pZCBjb2xsZWN0R2FyYmFnZSgpOworCisgICAg
Ly8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBjYWxsZWQgYnkgVGV4dHVyZSBjbGFzcy4KKyAg
ICB2b2lkIHRleHR1cmVEZXN0cm95ZWQoVGV4dHVyZSopOworICAgIHZvaWQgdGV4dHVyZVJlc2l6
ZWQoVGV4dHVyZSosIGNvbnN0IEludFNpemUmIG9sZFNpemUpOworCisgICAgLy8gVW5kbyB0aGUg
ZWZmZWN0cyBvZiBldmljdGlvbiwgaWYgcG9zc2libGUuCisgICAgYm9vbCBpbnN0YWxsKFRleHR1
cmUqKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgWm9tYmllVGV4dHVyZSB7CisgICAgICAgIGV4
cGxpY2l0IFpvbWJpZVRleHR1cmUoVGV4dHVyZSogdGV4dHVyZSkKKyAgICAgICAgICAgIDogaWQo
dGV4dHVyZS0+dGV4dHVyZUlkKCkpCisgICAgICAgICAgICAsIHNpemUodGV4dHVyZS0+c2l6ZSgp
KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBpZDsKKyAgICAgICAg
SW50U2l6ZSBzaXplOworICAgIH07CisgICAgdHlwZWRlZiBMaXN0SGFzaFNldDxUZXh0dXJlKiA+
IFRleHR1cmVTZXQ7CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8dWludDMyX3QsIHNpemVfdD4gQ29u
dGVudHNLZXk7CisgICAgdHlwZWRlZiBIYXNoTWFwPFRpbGVJbmRleCwgUmVmUHRyPFRleHR1cmU+
ID4gVGV4dHVyZU1hcDsKKyAgICB0eXBlZGVmIFZlY3Rvcjxab21iaWVUZXh0dXJlPiBHYXJiYWdl
OworCisgICAgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKTsKKyAgICB+VGV4dHVyZUNh
Y2hlQ29tcG9zaXRpbmdUaHJlYWQoKTsKKworICAgIHVuc2lnbmVkIGFsbG9jYXRlVGV4dHVyZUlk
KCk7CisgICAgdm9pZCBmcmVlVGV4dHVyZUlkKHVuc2lnbmVkIGlkKTsKKworICAgIHZvaWQgaW5j
TWVtb3J5VXNhZ2UoaW50IGRlbHRhKSB7IHNldE1lbW9yeVVzYWdlKG1lbW9yeVVzYWdlKCkgKyBk
ZWx0YSk7IH0KKyAgICB2b2lkIGRlY01lbW9yeVVzYWdlKGludCBkZWx0YSkgeyBzZXRNZW1vcnlV
c2FnZShtZW1vcnlVc2FnZSgpIC0gZGVsdGEpOyB9CisgICAgdm9pZCBzZXRNZW1vcnlVc2FnZShz
aXplX3QpOworCisgICAgQ29udGVudHNLZXkga2V5KGNvbnN0IFNrQml0bWFwJiBjb250ZW50cyk7
CisKKyAgICB2b2lkIGV2aWN0KGNvbnN0IFRleHR1cmVTZXQ6Oml0ZXJhdG9yJik7CisKKyAgICAv
LyBMUlUgc2V0IG9mIHdlYWsgcG9pbnRlcnMgdG8gdGV4dHVyZXMuCisgICAgVGV4dHVyZVNldCBt
X3RleHR1cmVzOworICAgIHNpemVfdCBtX21lbW9yeVVzYWdlOworICAgIHNpemVfdCBtX21lbW9y
eUxpbWl0OworCisgICAgLy8gTWFwIG9mIHJlZkNvdW50ZWQgcG9pbnRlcnMgdG8gdGV4dHVyZXMu
CisgICAgSGFzaE1hcDxDb250ZW50c0tleSwgVGV4dHVyZU1hcD4gbV9jYWNoZTsKKyAgICBzdHJ1
Y3QgQ29sb3JIYXNoIHsKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgQ29sb3Im
IGtleSkgeyByZXR1cm4gV1RGOjppbnRIYXNoKGtleS5yZ2IoKSk7IH0KKyAgICAgICAgc3RhdGlj
IGJvb2wgZXF1YWwoY29uc3QgQ29sb3ImIGEsIGNvbnN0IENvbG9yJiBiKSB7IHJldHVybiBhID09
IGI7IH0KKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRl
bGV0ZWQgPSB0cnVlOworICAgIH07CisgICAgc3RydWN0IENvbG9ySGFzaFRyYWl0cyA6IFdURjo6
R2VuZXJpY0hhc2hUcmFpdHM8Q29sb3I+IHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgZW1w
dHlWYWx1ZUlzWmVybyA9IHRydWU7CisgICAgICAgIC8vIFRoZSBkZWxldGVkIHZhbHVlIGlzIGFu
IGludmFsaWQgY29sb3Igd2l0aCBhbiBSR0IgdmFsdWUgb2YgMHhGRkZGRkZGRi4KKyAgICAgICAg
Ly8gU3VjaCB2YWx1ZXMgZG8gbm90IG5hdHVyYWxseSBvY2N1ciBhcyBjb2xvcnMuCisgICAgICAg
IC8vIEFuZCBlbXB0eSB2YWx1ZSBpcyBhbiBpbnZhbGlkIGNvbG9yIHdpdGggYW4gUkdCIHZhbHVl
IG9mIDB4MC4KKyAgICAgICAgc3RhdGljIHZvaWQgY29uc3RydWN0RGVsZXRlZFZhbHVlKENvbG9y
JiBzbG90KSB7IG5ldyAoJnNsb3QpIENvbG9yKCk7ICpyZWludGVycHJldF9jYXN0PFJHQkEzMio+
KCZzbG90KSA9IENvbG9yOjp3aGl0ZTsgfQorICAgICAgICBzdGF0aWMgYm9vbCBpc0RlbGV0ZWRW
YWx1ZShjb25zdCBDb2xvciYgdmFsdWUpIHsgcmV0dXJuICF2YWx1ZS5pc1ZhbGlkKCkgJiYgdmFs
dWUucmdiKCkgPT0gQ29sb3I6OndoaXRlOyB9CisgICAgfTsKKyAgICB0eXBlZGVmIEhhc2hNYXA8
Q29sb3IsIFJlZlB0cjxUZXh0dXJlPiwgQ29sb3JIYXNoLCBDb2xvckhhc2hUcmFpdHM+IENvbG9y
VGV4dHVyZU1hcDsKKyAgICBDb2xvclRleHR1cmVNYXAgbV9jb2xvcnM7CisgICAgR2FyYmFnZSBt
X2dhcmJhZ2U7Cit9OworCitUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCogdGV4dHVyZUNh
Y2hlQ29tcG9zaXRpbmdUaHJlYWQoKTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5k
aWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gVGV4dHVyZUNh
Y2hlQ29tcG9zaXRpbmdUaHJlYWRfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>130545</attachid>
            <date>2012-03-06 22:27:41 -0800</date>
            <delta_ts>2012-03-07 02:33:17 -0800</delta_ts>
            <desc>patch-for-landing</desc>
            <filename>bug-80121-20120307142739.patch</filename>
            <type>text/plain</type>
            <size>30354</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEwMDE1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZTA1M2JmZGIxOTJmNGQ3
NzUwZTExMDFkNmU1NDU0NTVmNTBkNTk4OC4uZGM0ODNlMjAwN2YyZmUzN2Q3ZmMyZDRjZDVkYjEx
YTFjYmQxMTE3ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDc4IEBACisyMDEyLTAzLTA2ICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBUZXh0dXJlIGFuZCBUZXh0dXJlQ2FjaGUKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgwMTIxCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgUm9iIEJ1aXMuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0cmVhbSwgbm8gbmV3IHRlc3RzLgor
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlJbWFnZURhdGEp
OgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6VGV4dHVyZSk6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0dXJlOjp+VGV4dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjp1cGRhdGVD
b250ZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjpzZXRDb250ZW50c1RvQ29sb3Ip
OgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6cHJvdGVjdCk6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZSk6CisgICAgICAgIChUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmU6OmNyZWF0
ZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjp0ZXh0dXJlSWQpOgorICAgICAgICAoV2Vi
Q29yZTo6VGV4dHVyZTo6aXNEaXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjpoYXNU
ZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmU6OmlzQ29sb3IpOgorICAgICAgICAo
V2ViQ29yZTo6VGV4dHVyZTo6aXNPcGFxdWUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6
aXNQcm90ZWN0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6cHJvdGVjdCk6CisgICAg
ICAgIChXZWJDb3JlOjpUZXh0dXJlOjp1bnByb3RlY3QpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dHVyZTo6c2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjp3aWR0aCk6CisgICAgICAg
IChXZWJDb3JlOjpUZXh0dXJlOjpoZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZTo6
Ynl0ZXNQZXJQaXhlbCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlOjpzZXRUZXh0dXJlSWQp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvVGV4dHVyZUNhY2hlQ29t
cG9zaXRpbmdUaHJlYWQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAo
VGV4dHVyZVByb3RlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlUHJvdGVjdG9yOjpU
ZXh0dXJlUHJvdGVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVQcm90ZWN0b3I6On5U
ZXh0dXJlUHJvdGVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0
aW5nVGhyZWFkOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCk6CisgICAgICAgIChXZWJD
b3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6YWxsb2NhdGVUZXh0dXJlSWQpOgor
ICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmZyZWVUZXh0
dXJlSWQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6
OmNvbGxlY3RHYXJiYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0
aW5nVGhyZWFkOjp0ZXh0dXJlUmVzaXplZCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlQ2Fj
aGVDb21wb3NpdGluZ1RocmVhZDo6dGV4dHVyZURlc3Ryb3llZCk6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6aW5zdGFsbCk6CisgICAgICAgIChXZWJD
b3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6ZXZpY3QpOgorICAgICAgICAoV2Vi
Q29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OnRleHR1cmVBY2Nlc3NlZCk6Cisg
ICAgICAgIChXZWJDb3JlOjp0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCk6CisgICAgICAg
IChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6cHJ1bmUpOgorICAgICAg
ICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmNsZWFyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpzZXRNZW1vcnlVc2Fn
ZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6dGV4
dHVyZUZvclRpbGVkQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29t
cG9zaXRpbmdUaHJlYWQ6OnRleHR1cmVGb3JDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6dXBkYXRlQ29udGVudHMpOgorICAgICAgICAoV2Vi
Q29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmtleSk6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZC5o
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoVGV4dHVyZUNhY2hlQ29tcG9z
aXRpbmdUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdU
aHJlYWQ6OmNyZWF0ZVRleHR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29t
cG9zaXRpbmdUaHJlYWQ6Om1lbW9yeVVzYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVD
YWNoZUNvbXBvc2l0aW5nVGhyZWFkOjptZW1vcnlMaW1pdCk6CisgICAgICAgIChXZWJDb3JlOjpU
ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6c2V0TWVtb3J5TGltaXQpOgorICAgICAgICAo
V2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OnBydW5lKToKKyAgICAgICAg
KFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpab21iaWVUZXh0dXJlOjpa
b21iaWVUZXh0dXJlKToKKyAgICAgICAgKFpvbWJpZVRleHR1cmUpOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmluY01lbW9yeVVzYWdlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpkZWNNZW1vcnlVc2Fn
ZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6Q29s
b3JIYXNoOjpoYXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5n
VGhyZWFkOjpDb2xvckhhc2g6OmVxdWFsKToKKyAgICAgICAgKENvbG9ySGFzaCk6CisgICAgICAg
IChDb2xvckhhc2hUcmFpdHMpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZUNhY2hlQ29tcG9z
aXRpbmdUaHJlYWQ6OkNvbG9ySGFzaFRyYWl0czo6Y29uc3RydWN0RGVsZXRlZFZhbHVlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpDb2xvckhhc2hU
cmFpdHM6OmlzRGVsZXRlZFZhbHVlKToKKwogMjAxMi0wMy0wNiAgSGFqaW1lIE1vcnJpdGEgIDxt
b3JyaXRhQGNocm9taXVtLm9yZz4KIAogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9Nzk5MzUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2JsYWNrYmVycnkvVGV4dHVyZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ibGFja2JlcnJ5L1RleHR1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjEzMjRkMTUzNjdl
Zjg5MDdjZDZjNTIyN2E4OTNhMzhiYzA1NjJkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1RleHR1cmUuY3BwCkBAIC0wLDAg
KzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1v
dGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3Jp
dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisKKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJDb2xvci5oIgorI2luY2x1ZGUgIklu
dFJlY3QuaCIKKyNpbmNsdWRlICJUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZC5oIgorCisj
aW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKyNpbmNsdWRlIDx3
dGYvQ3VycmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYvT3duQXJyYXlQdHIuaD4KKworI2RlZmlu
ZSBERUJVR19URVhUVVJFX1VQTE9BRFMgMAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRp
YyB2b2lkIGNvcHlJbWFnZURhdGEodW5zaWduZWQgY2hhciogZHN0LCBpbnQgZHN0U3RyaWRlLCBp
bnQgZHN0WCwgaW50IGRzdFksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNo
YXIqIHNyYywgaW50IHNyY1N0cmlkZSwgaW50IHNyY1gsIGludCBzcmNZLCBpbnQgd2lkdGgsIGlu
dCBoZWlnaHQpCit7CisgICAgZHN0ICs9IChkc3RZICogZHN0U3RyaWRlKSArIChUZXh0dXJlOjpi
eXRlc1BlclBpeGVsKCkgKiBkc3RYKTsKKyAgICBzcmMgKz0gKHNyY1kgKiBzcmNTdHJpZGUpICsg
KFRleHR1cmU6OmJ5dGVzUGVyUGl4ZWwoKSAqIHNyY1gpOworICAgIGludCBsZW5ndGggPSBUZXh0
dXJlOjpieXRlc1BlclBpeGVsKCkgKiB3aWR0aDsKKworICAgIGZvciAoaW50IHkgPSAwOyB5IDwg
aGVpZ2h0OyArK3kpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworICAgICAg
ICBkc3QgKz0gZHN0U3RyaWRlOworICAgICAgICBzcmMgKz0gc3JjU3RyaWRlOworICAgIH0KK30K
KworVGV4dHVyZTo6VGV4dHVyZShib29sIGlzQ29sb3IpCisgICAgOiBtX3Byb3RlY3Rpb25Db3Vu
dCgwKQorICAgICwgbV90ZXh0dXJlSWQoMCkKKyAgICAsIG1faXNDb2xvcihpc0NvbG9yKQorICAg
ICwgbV9pc09wYXF1ZShmYWxzZSkKK3sKKyAgICB0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVh
ZCgpLT5pbnN0YWxsKHRoaXMpOworfQorCitUZXh0dXJlOjp+VGV4dHVyZSgpCit7CisgICAgdGV4
dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKS0+dGV4dHVyZURlc3Ryb3llZCh0aGlzKTsKK30K
Kwordm9pZCBUZXh0dXJlOjp1cGRhdGVDb250ZW50cyhjb25zdCBTa0JpdG1hcCYgY29udGVudHMs
IGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCwgY29uc3QgSW50UmVjdCYgdGlsZSwgYm9vbCBpc09w
YXF1ZSkKK3sKKyAgICBJbnRSZWN0IHRpbGVEaXJ0eVJlY3QoZGlydHlSZWN0KTsKKworICAgIHRp
bGVEaXJ0eVJlY3QuaW50ZXJzZWN0KHRpbGUpOworICAgIGlmICh0aWxlRGlydHlSZWN0LmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9pc09wYXF1ZSA9IGlzT3BhcXVlOworCisg
ICAgaW50IHN0cmlkZSA9IGJ5dGVzUGVyUGl4ZWwoKSAqIGNvbnRlbnRzLndpZHRoKCk7CisgICAg
aW50IHggPSB0aWxlRGlydHlSZWN0LngoKSAtIGRpcnR5UmVjdC54KCk7CisgICAgaW50IHkgPSB0
aWxlRGlydHlSZWN0LnkoKSAtIGRpcnR5UmVjdC55KCk7CisgICAgU2tBdXRvTG9ja1BpeGVscyBs
b2NrKGNvbnRlbnRzKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBwaXhlbHMgPSBzdGF0aWNfY2FzdDx1
bnNpZ25lZCBjaGFyKj4oY29udGVudHMuZ2V0UGl4ZWxzKCkpOworICAgIHBpeGVscyArPSAoeSAq
IHN0cmlkZSkgKyAoYnl0ZXNQZXJQaXhlbCgpICogeCk7CisgICAgaWYgKCFwaXhlbHMpCisgICAg
ICAgIHJldHVybjsKKworICAgIGJvb2wgc3ViSW1hZ2UgPSB0aWxlLnNpemUoKSA9PSBtX3NpemU7
CisgICAgSW50U2l6ZSBzaXplID0gc3ViSW1hZ2UgPyB0aWxlRGlydHlSZWN0LnNpemUoKSA6IHRp
bGUuc2l6ZSgpOworICAgIEludFNpemUgY29udGVudHNTaXplKEludFNpemUoY29udGVudHMud2lk
dGgoKSwgY29udGVudHMuaGVpZ2h0KCkpKTsKKworI2lmIERFQlVHX1RFWFRVUkVfVVBMT0FEUwor
ICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIHN1YkltYWdlID8gIlNVQklNQUdFIiA6ICJJTUFH
RSIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICB0aWxlID0gKHg9JWQseT0lZCx3aWR0aD0lZCxo
ZWlnaHQ9JWQpLCBtX3NpemUgPSAoJWR4JWQpXG4iLCB0aWxlLngoKSwgdGlsZS55KCksIHRpbGUu
d2lkdGgoKSwgdGlsZS5oZWlnaHQoKSwgbV9zaXplLndpZHRoKCksIG1fc2l6ZS5oZWlnaHQoKSk7
CisgICAgZnByaW50ZihzdGRlcnIsICIgIHRpbGVEaXJ0eVJlY3QgPSAoeD0lZCx5PSVkLHdpZHRo
PSVkLGhlaWdodD0lZCksIGNvbnRlbnRzLnNpemUoKSA9ICglZHglZClcbiIsIHRpbGVEaXJ0eVJl
Y3QueCgpLCB0aWxlRGlydHlSZWN0LnkoKSwgdGlsZURpcnR5UmVjdC53aWR0aCgpLCB0aWxlRGly
dHlSZWN0LmhlaWdodCgpLCBjb250ZW50c1NpemUud2lkdGgoKSwgY29udGVudHNTaXplLmhlaWdo
dCgpKTsKKyAgICBJbnRTaXplIHNpemVCZWZvcmVTaHVuayA9IHNpemU7CisjZW5kaWYKKworICAg
IHNpemUgPSBzaXplLnNocnVua1RvKGNvbnRlbnRzU2l6ZSk7CisKKyNpZiBERUJVR19URVhUVVJF
X1VQTE9BRFMKKyAgICBpZiAoc2l6ZSAhPSBzaXplQmVmb3JlU2h1bmspCisgICAgICAgIGZwcmlu
dGYoc3RkZXJyLCAiICBTSFJVTkshISEhXG4iKTsKKyNlbmRpZgorCisgICAgaWYgKCFoYXNUZXh0
dXJlKCkpIHsKKyAgICAgICAgLy8gV2UgbWF5IGhhdmUgYmVlbiBldmljdGVkIGJ5IHRoZSBUZXh0
dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCwKKyAgICAgICAgLy8gYXR0ZW1wdCB0byBpbnN0YWxs
IHVzIGFnYWluLgorICAgICAgICBpZiAoIXRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCkt
Pmluc3RhbGwodGhpcykpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xCaW5k
VGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleHR1cmVJZCk7CisKKyAgICBBU1NFUlQoc2l6ZS53
aWR0aCgpID49IDApOworICAgIGJvb2wgZG9lc1RpbGVTdHJpZGVFcXVhbFRleHR1cmVTdHJpZGUg
PSBjb250ZW50cy53aWR0aCgpID09IHNpemUud2lkdGgoKTsKKworICAgIE93bkFycmF5UHRyPHVu
c2lnbmVkIGNoYXI+IHRtcDsKKyAgICBpZiAoIWRvZXNUaWxlU3RyaWRlRXF1YWxUZXh0dXJlU3Ry
aWRlKSB7CisjaWYgZGVmaW5lZChHTF9VTlBBQ0tfUk9XX0xFTkdUSCkKKyAgICAgICAgZ2xQaXhl
bFN0b3JlaShHTF9VTlBBQ0tfUk9XX0xFTkdUSCwgY29udGVudHMud2lkdGgoKSk7CisjZWxzZQor
ICAgICAgICB0bXAgPSBhZG9wdEFycmF5UHRyKG5ldyB1bnNpZ25lZCBjaGFyW3NpemUud2lkdGgo
KSAqIHNpemUuaGVpZ2h0KCkgKiBieXRlc1BlclBpeGVsKCldKTsKKyAgICAgICAgY29weUltYWdl
RGF0YSh0bXAuZ2V0KCksIGJ5dGVzUGVyUGl4ZWwoKSAqIHNpemUud2lkdGgoKSwgMCwgMCwKKyAg
ICAgICAgICAgICAgICAgICAgICBwaXhlbHMsIHN0cmlkZSwgMCwgMCwKKyAgICAgICAgICAgICAg
ICAgICAgICBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOworICAgICAgICBwaXhlbHMgPSB0
bXAuZ2V0KCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoc3ViSW1hZ2UpIHsKKyNpZiBERUJV
R19URVhUVVJFX1VQTE9BRFMKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnbFRleFN1YkltYWdl
MkQoJWQsICVkLCAlZCwgJWQpXG4iLCB0aWxlRGlydHlSZWN0LngoKSAtIHRpbGUueCgpLCB0aWxl
RGlydHlSZWN0LnkoKSAtIHRpbGUueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS53
aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKKyAgICAgICAgZG91YmxlIHQgPSBjdXJyZW50VGltZSgp
OworI2VuZGlmCisgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLAorICAg
ICAgICAgICAgICAgICAgICAgICAgdGlsZURpcnR5UmVjdC54KCkgLSB0aWxlLngoKSwgdGlsZURp
cnR5UmVjdC55KCkgLSB0aWxlLnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUud2lk
dGgoKSwgc2l6ZS5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdM
X1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7CisjaWYgREVCVUdfVEVYVFVSRV9VUExPQURTCisgICAg
ICAgIHQgPSBjdXJyZW50VGltZSgpIC0gdDsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAg
dGltZSA9ICVmIHMgKCVkIGJ5dGVzKVxuIiwgdCwgc2l6ZS53aWR0aCgpKnNpemUuaGVpZ2h0KCkq
NCk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworI2lmIERFQlVHX1RFWFRVUkVfVVBMT0FEUworICAg
ICAgICBmcHJpbnRmKHN0ZGVyciwgImdsVGV4SW1hZ2UyRCglZCwgJWQpXG4iLCBzaXplLndpZHRo
KCksIHNpemUuaGVpZ2h0KCkpOworICAgICAgICBkb3VibGUgdCA9IGN1cnJlbnRUaW1lKCk7Cisj
ZW5kaWYKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIHNp
emUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwg
cGl4ZWxzKTsKKyNpZiBERUJVR19URVhUVVJFX1VQTE9BRFMKKyAgICAgICAgdCA9IGN1cnJlbnRU
aW1lKCkgLSB0OworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICB0aW1lID0gJWYgcyAoJWQg
Ynl0ZXMpXG4iLCB0LCBzaXplLndpZHRoKCkqc2l6ZS5oZWlnaHQoKSo0KTsKKyNlbmRpZgorICAg
IH0KKworI2lmIGRlZmluZWQoR0xfVU5QQUNLX1JPV19MRU5HVEgpCisgICAgaWYgKCFkb2VzVGls
ZVN0cmlkZUVxdWFsVGV4dHVyZVN0cmlkZSkKKyAgICAgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBB
Q0tfUk9XX0xFTkdUSCwgMCk7CisjZW5kaWYKKworICAgIEludFNpemUgb2xkU2l6ZSA9IG1fc2l6
ZTsKKyAgICBtX3NpemUgPSB0aWxlLnNpemUoKTsKKyAgICBpZiAobV9zaXplICE9IG9sZFNpemUp
CisgICAgICAgIHRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCktPnRleHR1cmVSZXNpemVk
KHRoaXMsIG9sZFNpemUpOworfQorCit2b2lkIFRleHR1cmU6OnNldENvbnRlbnRzVG9Db2xvcihj
b25zdCBDb2xvciYgY29sb3IpCit7CisgICAgbV9pc09wYXF1ZSA9ICFjb2xvci5oYXNBbHBoYSgp
OworICAgIFJHQkEzMiByZ2JhID0gY29sb3IucmdiKCk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9U
RVhUVVJFXzJELCBtX3RleHR1cmVJZCk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQs
IDAsIEdMX1JHQkEsIDEsIDEsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsICZyZ2JhKTsK
KworICAgIEludFNpemUgb2xkU2l6ZSA9IG1fc2l6ZTsKKyAgICBtX3NpemUgPSBJbnRTaXplKDEs
IDEpOworICAgIGlmIChtX3NpemUgIT0gb2xkU2l6ZSkKKyAgICAgICAgdGV4dHVyZUNhY2hlQ29t
cG9zaXRpbmdUaHJlYWQoKS0+dGV4dHVyZVJlc2l6ZWQodGhpcywgb2xkU2l6ZSk7Cit9CisKK2Jv
b2wgVGV4dHVyZTo6cHJvdGVjdChjb25zdCBJbnRTaXplJiBzaXplKQoreworICAgIGlmICghaGFz
VGV4dHVyZSgpKSB7CisgICAgICAgIC8vIFdlIG1heSBoYXZlIGJlZW4gZXZpY3RlZCBieSB0aGUg
VGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQsCisgICAgICAgIC8vIGF0dGVtcHQgdG8gaW5z
dGFsbCB1cyBhZ2Fpbi4KKyAgICAgICAgaWYgKCF0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVh
ZCgpLT5pbnN0YWxsKHRoaXMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgICsrbV9wcm90ZWN0aW9uQ291bnQ7CisKKyAgICBpZiAobV9zaXplID09IHNpemUpCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgSW50U2l6ZSBvbGRTaXplID0gbV9zaXplOworICAgIG1f
c2l6ZSA9IHNpemU7CisgICAgdGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQoKS0+dGV4dHVy
ZVJlc2l6ZWQodGhpcywgb2xkU2l6ZSk7CisKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVf
MkQsIG1fdGV4dHVyZUlkKTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCAsIEdM
X1JHQkEsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgMCwgR0xfUkdCQSwgR0xfVU5TSUdO
RURfQllURSwgMCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvVGV4dHVyZS5oIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlLmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uNGU5OTZkMGQzM2JhNGJlOTJkNWRmYjJlNDRmY2Y5MGM0MGFlZWQ4YgotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkv
VGV4dHVyZS5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIw
MTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChh
dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAt
MTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBUZXh0dXJlX2gKKyNkZWZpbmUgVGV4dHVyZV9oCisK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJJbnRTaXplLmgi
CisKKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVk
Lmg+CisKK2NsYXNzIFNrQml0bWFwOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENv
bG9yOworY2xhc3MgSW50UmVjdDsKK2NsYXNzIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFk
OworCisvLyBUZXh0dXJlIGVuY2Fwc3VsYXRlcyBhIHZvbGF0aWxlIHRleHR1cmUgLSBhdCBhbnkg
dGltZSwgdGhlIHVuZGVybHlpbmcgT3BlbkdMCisvLyB0ZXh0dXJlIG1heSBiZSBkZWxldGVkIGJ5
IHRoZSBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZC4gVGhlIHVzZXIgbXVzdAorLy8gY2hl
Y2sgdXNpbmcgVGV4dHVyZTo6aXNEaXJ0eSgpIGltbWVkaWF0ZWx5IGJlZm9yZSB1c2luZyBpdCwg
ZXZlcnkgdGltZS4KKy8vIFRoZSBvbmx5IHdheSB0byBwcmV2ZW50IGV2aWN0aW9uIHRoaXMgaXMg
dG8gY2FsbCBUZXh0dXJlOjpwcm90ZWN0KCkuCisvLyBJZiB0aGUgdGV4dHVyZSBpc0RpcnR5KCks
IHlvdSBtdXN0IHVwZGF0ZUNvbnRlbnRzKCkgYmVmb3JlIHlvdSBjYW4gdXNlIGl0LgorY2xhc3Mg
VGV4dHVyZSA6IHB1YmxpYyBSZWZDb3VudGVkPFRleHR1cmU+IHsKK3B1YmxpYzoKKyAgICBzdGF0
aWMgUGFzc1JlZlB0cjxUZXh0dXJlPiBjcmVhdGUoYm9vbCBpc0NvbG9yID0gZmFsc2UpCisgICAg
eworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFRleHR1cmUoaXNDb2xvcikpOworICAgIH0K
KworICAgIH5UZXh0dXJlKCk7CisKKyAgICB1bnNpZ25lZCB0ZXh0dXJlSWQoKSBjb25zdCB7IHJl
dHVybiBtX3RleHR1cmVJZDsgfQorCisgICAgYm9vbCBpc0RpcnR5KCkgY29uc3QgeyByZXR1cm4g
IW1fdGV4dHVyZUlkOyB9CisgICAgYm9vbCBoYXNUZXh0dXJlKCkgY29uc3QgeyByZXR1cm4gbV90
ZXh0dXJlSWQ7IH0KKworICAgIGJvb2wgaXNDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1faXNDb2xv
cjsgfQorICAgIGJvb2wgaXNPcGFxdWUoKSBjb25zdCB7IHJldHVybiBtX2lzT3BhcXVlOyB9CisK
KyAgICBib29sIGlzUHJvdGVjdGVkKCkgY29uc3QgeyByZXR1cm4gbV9wcm90ZWN0aW9uQ291bnQg
PiAwOyB9CisgICAgdm9pZCBwcm90ZWN0KCkgeyArK21fcHJvdGVjdGlvbkNvdW50OyB9CisgICAg
dm9pZCB1bnByb3RlY3QoKSB7IC0tbV9wcm90ZWN0aW9uQ291bnQ7IH0KKyAgICBib29sIHByb3Rl
Y3QoY29uc3QgSW50U2l6ZSYpOworCisgICAgdm9pZCB1cGRhdGVDb250ZW50cyhjb25zdCBTa0Jp
dG1hcCYgY29udGVudHMsIGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCwgY29uc3QgSW50UmVjdCYg
dGlsZSwgYm9vbCBpc09wYXF1ZSA9IGZhbHNlKTsKKyAgICB2b2lkIHNldENvbnRlbnRzVG9Db2xv
cihjb25zdCBDb2xvciYpOworCisgICAgSW50U2l6ZSBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9z
aXplOyB9CisgICAgaW50IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9zaXplLndpZHRoKCk7IH0K
KyAgICBpbnQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9zaXplLmhlaWdodCgpOyB9CisgICAg
c3RhdGljIGludCBieXRlc1BlclBpeGVsKCkgeyByZXR1cm4gNDsgfQorCitwcml2YXRlOgorICAg
IGZyaWVuZCBjbGFzcyBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDsKKworICAgIFRleHR1
cmUoYm9vbCBpc0NvbG9yID0gZmFsc2UpOworCisgICAgdm9pZCBzZXRUZXh0dXJlSWQodW5zaWdu
ZWQgaWQpCisgICAgeworICAgICAgICBtX3RleHR1cmVJZCA9IGlkOworCisgICAgICAgIC8vIFdl
IGFzc3VtZSBpdCBpcyBhIG5ld2x5IGFsbG9jYXRlZCB0ZXh0dXJlLAorICAgICAgICAvLyBhbmQg
dGh1cyBlbXB0eSwgb3IgMCwgd2hpY2ggd291bGQgb2YgY291cnNlCisgICAgICAgIC8vIGJlIGVt
cHR5LgorICAgICAgICBtX3NpemUgPSBJbnRTaXplKCk7CisgICAgfQorCisgICAgaW50IG1fcHJv
dGVjdGlvbkNvdW50OworICAgIHVuc2lnbmVkIG1fdGV4dHVyZUlkOworICAgIEludFNpemUgbV9z
aXplOworICAgIGJvb2wgbV9pc0NvbG9yOworICAgIGJvb2wgbV9pc09wYXF1ZTsKK307CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKworI2VuZGlmIC8vIFRleHR1cmVfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVh
ZC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1RleHR1
cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mZTBjM2RhNDk1ZTNjMjhh
ZDRhNmEwOWY4OWY4MmM5ZjcxOTJjNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1Ro
cmVhZC5jcHAKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIw
MTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChh
dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAt
MTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRleHR1cmVD
YWNoZUNvbXBvc2l0aW5nVGhyZWFkLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNp
bmNsdWRlIDxTa0JpdG1hcC5oPgorCisjZGVmaW5lIERFQlVHX1RFWFRVUkVfTUVNT1JZX1VTQUdF
IDAKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRNZW1v
cnlMaW1pdCA9IDY0ICogMTAyNCAqIDEwMjQ7IC8vIE1lYXN1cmVkIGluIGJ5dGVzLgorCisvLyBV
c2VkIHRvIHByb3RlY3QgYSBuZXdseSBjcmVhdGVkIHRleHR1cmUgZnJvbSBiZWluZyBpbW1lZGlh
dGVseSBldmljdGVkCisvLyBiZWZvcmUgc29tZW9uZSBoYXMgYSBjaGFuY2UgdG8gcHJvdGVjdCBp
dCBmb3IgbGVnaXRpbWF0ZSByZWFzb25zLgorY2xhc3MgVGV4dHVyZVByb3RlY3RvciB7CitwdWJs
aWM6CisgICAgVGV4dHVyZVByb3RlY3RvcihUZXh0dXJlKiB0ZXh0dXJlKQorICAgICAgICA6IG1f
dGV4dHVyZSh0ZXh0dXJlKQorICAgIHsKKyAgICAgICAgbV90ZXh0dXJlLT5wcm90ZWN0KCk7Cisg
ICAgfQorCisgICAgflRleHR1cmVQcm90ZWN0b3IoKQorICAgIHsKKyAgICAgICAgbV90ZXh0dXJl
LT51bnByb3RlY3QoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVGV4dHVyZSogbV90ZXh0dXJl
OworfTsKKworVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OlRleHR1cmVDYWNoZUNvbXBv
c2l0aW5nVGhyZWFkKCkKKyAgICA6IG1fbWVtb3J5VXNhZ2UoMCkKKyAgICAsIG1fbWVtb3J5TGlt
aXQoZGVmYXVsdE1lbW9yeUxpbWl0KQoreworfQorCit1bnNpZ25lZCBUZXh0dXJlQ2FjaGVDb21w
b3NpdGluZ1RocmVhZDo6YWxsb2NhdGVUZXh0dXJlSWQoKQoreworICAgIHVuc2lnbmVkIHRleGlk
OworICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleGlkKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RF
WFRVUkVfMkQsIHRleGlkKTsKKyAgICBpZiAoIWdsSXNUZXh0dXJlKHRleGlkKSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICAvLyBEbyBiYXNpYyBsaW5lYXIgZmlsdGVyaW5nIG9uIHJlc2l6ZS4K
KyAgICBnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVS
LCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhU
VVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgLy8gTlBPVCB0ZXh0dXJlcyBpbiBHTCBF
UyBvbmx5IHdvcmsgd2hlbiB0aGUgd3JhcCBtb2RlIGlzIHNldCB0byBHTF9DTEFNUF9UT19FREdF
LgorICAgIGdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywg
R0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdM
X1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICByZXR1cm4gdGV4aWQ7Cit9
CisKK3ZvaWQgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmZyZWVUZXh0dXJlSWQodW5z
aWduZWQgaWQpCit7CisgICAgaWYgKGlkKQorICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZp
ZCk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OmNvbGxlY3RHYXJi
YWdlKCkKK3sKKyAgICBpbnQgZGVsdGEgPSAwOworCisgICAgZm9yIChHYXJiYWdlOjppdGVyYXRv
ciBpdCA9IG1fZ2FyYmFnZS5iZWdpbigpOyBpdCAhPSBtX2dhcmJhZ2UuZW5kKCk7ICsraXQpIHsK
KyAgICAgICAgWm9tYmllVGV4dHVyZSYgem9tYmllID0gKml0OworICAgICAgICBmcmVlVGV4dHVy
ZUlkKHpvbWJpZS5pZCk7CisgICAgICAgIGRlbHRhICs9IHpvbWJpZS5zaXplLndpZHRoKCkgKiB6
b21iaWUuc2l6ZS5oZWlnaHQoKSAqIFRleHR1cmU6OmJ5dGVzUGVyUGl4ZWwoKTsKKyAgICB9Cisg
ICAgbV9nYXJiYWdlLmNsZWFyKCk7CisKKyAgICBpZiAoZGVsdGEpCisgICAgICAgIGRlY01lbW9y
eVVzYWdlKGRlbHRhKTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6
dGV4dHVyZVJlc2l6ZWQoVGV4dHVyZSogdGV4dHVyZSwgY29uc3QgSW50U2l6ZSYgb2xkU2l6ZSkK
K3sKKyAgICBpbnQgZGVsdGEgPSAodGV4dHVyZS0+d2lkdGgoKSAqIHRleHR1cmUtPmhlaWdodCgp
IC0gb2xkU2l6ZS53aWR0aCgpICogb2xkU2l6ZS5oZWlnaHQoKSkgKiBUZXh0dXJlOjpieXRlc1Bl
clBpeGVsKCk7CisgICAgaW5jTWVtb3J5VXNhZ2UoZGVsdGEpOworICAgIGlmIChkZWx0YSA+IDAp
CisgICAgICAgIHBydW5lKCk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJl
YWQ6OnRleHR1cmVEZXN0cm95ZWQoVGV4dHVyZSogdGV4dHVyZSkKK3sKKyAgICBpZiAodGV4dHVy
ZS0+aXNDb2xvcigpKSB7CisgICAgICAgIG1fZ2FyYmFnZS5hcHBlbmQoWm9tYmllVGV4dHVyZSh0
ZXh0dXJlKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBldmljdChtX3RleHR1cmVz
LmZpbmQodGV4dHVyZSkpOworfQorCitib29sIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFk
OjppbnN0YWxsKFRleHR1cmUqIHRleHR1cmUpCit7CisgICAgaWYgKCF0ZXh0dXJlKQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghdGV4dHVyZS0+aGFzVGV4dHVyZSgpKSB7CisgICAg
ICAgIHVuc2lnbmVkIHRleHR1cmVJZCA9IGFsbG9jYXRlVGV4dHVyZUlkKCk7CisgICAgICAgIGlm
ICghdGV4dHVyZUlkKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHRleHR1
cmUtPnNldFRleHR1cmVJZCh0ZXh0dXJlSWQpOworICAgIH0KKworICAgIGlmICghdGV4dHVyZS0+
aXNDb2xvcigpKSB7CisgICAgICAgIGlmICghbV90ZXh0dXJlcy5jb250YWlucyh0ZXh0dXJlKSkK
KyAgICAgICAgICAgIG1fdGV4dHVyZXMuYWRkKHRleHR1cmUpOworICAgIH0KKworICAgIHJldHVy
biB0cnVlOworfQorCit2b2lkIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpldmljdChj
b25zdCBUZXh0dXJlU2V0OjppdGVyYXRvciYgaXQpCit7CisgICAgaWYgKGl0ID09IG1fdGV4dHVy
ZXMuZW5kKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFRleHR1cmUqIHRleHR1cmUgPSAqaXQ7
CisgICAgaWYgKHRleHR1cmUtPmhhc1RleHR1cmUoKSkKKyAgICAgICAgbV9nYXJiYWdlLmFwcGVu
ZChab21iaWVUZXh0dXJlKHRleHR1cmUpKTsKKworICAgIHRleHR1cmUtPnNldFRleHR1cmVJZCgw
KTsKKworICAgIG1fdGV4dHVyZXMucmVtb3ZlKGl0KTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGVD
b21wb3NpdGluZ1RocmVhZDo6dGV4dHVyZUFjY2Vzc2VkKFRleHR1cmUqIHRleHR1cmUpCit7Cisg
ICAgaWYgKHRleHR1cmUtPmlzQ29sb3IoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVGV4dHVy
ZVNldDo6aXRlcmF0b3IgaXQgPSBtX3RleHR1cmVzLmZpbmQodGV4dHVyZSk7CisgICAgaWYgKGl0
ID09IG1fdGV4dHVyZXMuZW5kKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fdGV4dHVyZXMu
cmVtb3ZlKGl0KTsKKyAgICBtX3RleHR1cmVzLmFkZCh0ZXh0dXJlKTsKK30KKworVGV4dHVyZUNh
Y2hlQ29tcG9zaXRpbmdUaHJlYWQqIHRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCkKK3sK
KyAgICBzdGF0aWMgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQqIHN0YXRpY0NhY2hlID0g
bmV3IFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOworICAgIHJldHVybiBzdGF0aWNDYWNo
ZTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6cHJ1bmUoc2l6ZV90
IGxpbWl0KQoreworICAgIHdoaWxlIChtX21lbW9yeVVzYWdlID4gbGltaXQpIHsKKyAgICAgICAg
Ym9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKFRleHR1cmVTZXQ6Oml0ZXJhdG9yIGl0
ID0gbV90ZXh0dXJlcy5iZWdpbigpOyBpdCAhPSBtX3RleHR1cmVzLmVuZCgpOyArK2l0KSB7Cisg
ICAgICAgICAgICBUZXh0dXJlKiB0ZXh0dXJlID0gKml0OworICAgICAgICAgICAgaWYgKHRleHR1
cmUtPmlzUHJvdGVjdGVkKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICBldmljdChpdCk7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgYnJlYWs7Cisg
ICAgfQorfQorCit2b2lkIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjpjbGVhcigpCit7
CisgICAgbV9jYWNoZS5jbGVhcigpOworICAgIG1fY29sb3JzLmNsZWFyKCk7CisgICAgY29sbGVj
dEdhcmJhZ2UoKTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZDo6c2V0
TWVtb3J5VXNhZ2Uoc2l6ZV90IG1lbW9yeVVzYWdlKQoreworICAgIG1fbWVtb3J5VXNhZ2UgPSBt
ZW1vcnlVc2FnZTsKKyNpZiBERUJVR19URVhUVVJFX01FTU9SWV9VU0FHRQorICAgIGZwcmludGYo
c3RkZXJyLCAiVGV4dHVyZSBtZW1vcnkgdXNhZ2UgJXUga0JcbiIsIG1fbWVtb3J5VXNhZ2UgLyAx
MDI0KTsKKyNlbmRpZgorfQorCitQYXNzUmVmUHRyPFRleHR1cmU+IFRleHR1cmVDYWNoZUNvbXBv
c2l0aW5nVGhyZWFkOjp0ZXh0dXJlRm9yVGlsZWRDb250ZW50cyhjb25zdCBTa0JpdG1hcCYgY29u
dGVudHMsIGNvbnN0IEludFJlY3QmIHRpbGVSZWN0LCBjb25zdCBUaWxlSW5kZXgmIGluZGV4LCBi
b29sIGlzT3BhcXVlKQoreworICAgIEhhc2hNYXA8Q29udGVudHNLZXksIFRleHR1cmVNYXA+Ojpp
dGVyYXRvciBpdCA9IG1fY2FjaGUuYWRkKGtleShjb250ZW50cyksIFRleHR1cmVNYXAoKSkuZmly
c3Q7CisgICAgVGV4dHVyZU1hcCYgbWFwID0gKCppdCkuc2Vjb25kOworCisgICAgVGV4dHVyZU1h
cDo6aXRlcmF0b3IganQgPSBtYXAuYWRkKGluZGV4LCBSZWZQdHI8VGV4dHVyZT4oKSkuZmlyc3Q7
CisgICAgUmVmUHRyPFRleHR1cmU+IHRleHR1cmUgPSAoKmp0KS5zZWNvbmQ7CisgICAgaWYgKCF0
ZXh0dXJlKSB7CisgICAgICAgIHRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKCk7CisjaWYgREVCVUdf
VEVYVFVSRV9NRU1PUllfVVNBR0UKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDcmVhdGluZyB0
ZXh0dXJlIDB4JXggZm9yIDB4JXgrJWQgQCAoJWQsICVkKVxuIiwgdGV4dHVyZS5nZXQoKSwgY29u
dGVudHMucGl4ZWxSZWYoKSwgY29udGVudHMucGl4ZWxSZWZPZmZzZXQoKSwgaW5kZXguaSgpLCBp
bmRleC5qKCkpOworI2VuZGlmCisgICAgICAgIG1hcC5zZXQoaW5kZXgsIHRleHR1cmUpOworICAg
IH0KKworICAgIC8vIFByb3RlY3QgbmV3bHkgY3JlYXRlZCB0ZXh0dXJlIGZyb20gYmVpbmcgZXZp
Y3RlZC4KKyAgICBUZXh0dXJlUHJvdGVjdG9yIHByb3RlY3Rvcih0ZXh0dXJlLmdldCgpKTsKKwor
ICAgIEludFNpemUgY29udGVudHNTaXplKGNvbnRlbnRzLndpZHRoKCksIGNvbnRlbnRzLmhlaWdo
dCgpKTsKKyAgICBJbnRSZWN0IGRpcnR5UmVjdChJbnRQb2ludCgpLCBjb250ZW50c1NpemUpOwor
ICAgIGlmICh0aWxlUmVjdC5zaXplKCkgIT0gdGV4dHVyZS0+c2l6ZSgpKSB7CisjaWYgREVCVUdf
VEVYVFVSRV9NRU1PUllfVVNBR0UKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVcGRhdGluZyB0
ZXh0dXJlIDB4JXggZm9yIDB4JXgrJWQgQCAoJWQsICVkKVxuIiwgdGV4dHVyZS5nZXQoKSwgY29u
dGVudHMucGl4ZWxSZWYoKSwgY29udGVudHMucGl4ZWxSZWZPZmZzZXQoKSwgaW5kZXguaSgpLCBp
bmRleC5qKCkpOworI2VuZGlmCisgICAgICAgIHRleHR1cmUtPnVwZGF0ZUNvbnRlbnRzKGNvbnRl
bnRzLCBkaXJ0eVJlY3QsIHRpbGVSZWN0LCBpc09wYXF1ZSk7CisgICAgfQorICAgIHJldHVybiB0
ZXh0dXJlLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxUZXh0dXJlPiBUZXh0dXJlQ2FjaGVD
b21wb3NpdGluZ1RocmVhZDo6dGV4dHVyZUZvckNvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sK
KyAgICAvLyBKdXN0IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgZm9vbGVkIGJ5IHNvbWUgbWFs
aWNpb3VzIHdlYiBwYWdlCisgICAgLy8gaW50byBjYWNoaW5nIG1pbGxpb25zIG9mIGNvbG9yIHRl
eHR1cmVzLgorICAgIGlmIChtX2NvbG9ycy5zaXplKCkgPiAxMDApCisgICAgICAgIG1fY29sb3Jz
LmNsZWFyKCk7CisKKyAgICBDb2xvclRleHR1cmVNYXA6Oml0ZXJhdG9yIGl0ID0gbV9jb2xvcnMu
ZmluZChjb2xvcik7CisgICAgUmVmUHRyPFRleHR1cmU+IHRleHR1cmU7CisgICAgaWYgKGl0ID09
IG1fY29sb3JzLmVuZCgpKSB7CisgICAgICAgIHRleHR1cmUgPSBUZXh0dXJlOjpjcmVhdGUodHJ1
ZSAvKiBpc0NvbG9yICovKTsKKyNpZiBERUJVR19URVhUVVJFX01FTU9SWV9VU0FHRQorICAgICAg
ICBmcHJpbnRmKHN0ZGVyciwgIkNyZWF0aW5nIHRleHR1cmUgMHgleCBmb3IgY29sb3IgMHgleFxu
IiwgdGV4dHVyZS5nZXQoKSwgY29sb3IucmdiKCkpOworI2VuZGlmCisgICAgICAgIG1fY29sb3Jz
LnNldChjb2xvciwgdGV4dHVyZSk7CisgICAgfSBlbHNlCisgICAgICAgIHRleHR1cmUgPSAoKml0
KS5zZWNvbmQ7CisKKyAgICAvLyBDb2xvciB0ZXh0dXJlcyBjYW4ndCBiZSBldmljdGVkLCBzbyBu
byBuZWVkIGZvciBUZXh0dXJlUHJvdGVjdG9yLgorCisgICAgaWYgKHRleHR1cmUtPnNpemUoKSAh
PSBJbnRTaXplKDEsIDEpKQorICAgICAgICB0ZXh0dXJlLT5zZXRDb250ZW50c1RvQ29sb3IoY29s
b3IpOworCisgICAgcmV0dXJuIHRleHR1cmUucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPFRl
eHR1cmU+IFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkOjp1cGRhdGVDb250ZW50cyhjb25z
dCBSZWZQdHI8VGV4dHVyZT4mIHRleHR1cmVJbiwgY29uc3QgU2tCaXRtYXAmIGNvbnRlbnRzLCBj
b25zdCBJbnRSZWN0JiBkaXJ0eVJlY3QsIGNvbnN0IEludFJlY3QmIHRpbGVSZWN0KQoreworICAg
IFJlZlB0cjxUZXh0dXJlPiB0ZXh0dXJlKHRleHR1cmVJbik7CisKKyAgICAvLyBJZiB0aGUgdGV4
dHVyZSB3YXMgMCwgb3IgbmVlZHMgdG8gdHJhbnNpdGlvbiBmcm9tIGEgc29saWQgY29sb3IgdGV4
dHVyZSB0byBhIGNvbnRlbnRzIHRleHR1cmUsCisgICAgLy8gY3JlYXRlIGEgbmV3IHRleHR1cmUu
CisgICAgaWYgKCF0ZXh0dXJlIHx8IHRleHR1cmUtPmlzQ29sb3IoKSkKKyAgICAgICAgdGV4dHVy
ZSA9IGNyZWF0ZVRleHR1cmUoKTsKKworICAgIC8vIFByb3RlY3QgbmV3bHkgY3JlYXRlZCB0ZXh0
dXJlIGZyb20gYmVpbmcgZXZpY3RlZC4KKyAgICBUZXh0dXJlUHJvdGVjdG9yIHByb3RlY3Rvcih0
ZXh0dXJlLmdldCgpKTsKKworICAgIHRleHR1cmUtPnVwZGF0ZUNvbnRlbnRzKGNvbnRlbnRzLCBk
aXJ0eVJlY3QsIHRpbGVSZWN0KTsKKworICAgIHJldHVybiB0ZXh0dXJlLnJlbGVhc2UoKTsKK30K
KworVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQ6OkNvbnRlbnRzS2V5IFRleHR1cmVDYWNo
ZUNvbXBvc2l0aW5nVGhyZWFkOjprZXkoY29uc3QgU2tCaXRtYXAmIGNvbnRlbnRzKQoreworICAg
IC8vIFRoZSBwaXhlbFJlZiBpcyBhbiBhZGRyZXNzLCBhbmQgYWRkcmVzc2VzIGNhbiBiZSByZXVz
ZWQgYnkgdGhlIGFsbG9jYXRvcgorICAgIC8vIHNvIGl0J3MgdW5zdWl0YWJsZSB0byB1c2UgYXMg
YSBrZXkuIEluc3RlYWQsIGdyYWIgdGhlIGdlbmVyYXRpb24sIHdoaWNoCisgICAgLy8gaXMgZ2xv
YmFsbHkgdW5pcXVlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpbgor
ICAgIC8vIFNrUGl4ZWxSZWYuY3BwLgorICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSBjb250ZW50
cy5nZXRHZW5lcmF0aW9uSUQoKTsKKworICAgIC8vIElmIHRoZSBnZW5lcmF0aW9uIGlzIGVxdWFs
IHRvIHRoZSBkZWxldGVkIHZhbHVlLCB1c2Ugc29tZXRoaW5nIGVsc2UgdGhhdAorICAgIC8vIGlz
IHVubGlrZWx5IHRvIGNvcnJlc3BvbmQgdG8gYSBnZW5lcmF0aW9uIGN1cnJlbnRseSBpbiB1c2Ug
b3Igc29vbiB0byBiZQorICAgIC8vIGluIHVzZS4KKyAgICB1aW50MzJfdCBkZWxldGVkVmFsdWUg
PSAwOworICAgIEhhc2hUcmFpdHM8dWludDMyX3Q+Ojpjb25zdHJ1Y3REZWxldGVkVmFsdWUoZGVs
ZXRlZFZhbHVlKTsKKyAgICBpZiAoZ2VuZXJhdGlvbiA9PSBkZWxldGVkVmFsdWUpIHsKKyAgICAg
ICAgLy8gVGhpcyBzdHJhdGVneSB3b3JrcyBhcyBsb25nIGFzIHRoZSBkZWxldGVkIHZhbHVlIGlz
IC0xLgorICAgICAgICBBU1NFUlQoZGVsZXRlZFZhbHVlID09IHN0YXRpY19jYXN0PHVpbnQzMl90
PigtMSkpOworICAgICAgICBnZW5lcmF0aW9uID0gZGVsZXRlZFZhbHVlIC8gMjsKKyAgICB9CisK
KyAgICAvLyBOb3cgdGhlIGdlbmVyYXRpb24gYWxvbmUgZG9lcyBub3QgdW5pcXVlbHkgaWRlbnRp
ZnkgdGhlIHRleHR1cmUgY29udGVudHMuCisgICAgLy8gVGhlIHNhbWUgcGl4ZWxyZWYgY2FuIGJl
IHJldXNlZCBpbiBhbm90aGVyIGJpdG1hcCBidXQgd2l0aCBhIGRpZmZlcmVudAorICAgIC8vIG9m
ZnNldCAoc29tZXdoYXQgY29udHJpdmVkLCBidXQgcG9zc2libGUpLgorICAgIHJldHVybiBzdGQ6
Om1ha2VfcGFpcihnZW5lcmF0aW9uLCBjb250ZW50cy5waXhlbFJlZk9mZnNldCgpKTsKK30KKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdU
aHJlYWQuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvVGV4
dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44MjkwNWI5OTE1ZTEzNTU5
ZWQ3ZjljMDk3MWZjNTVlYjc0MTc0ZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9UZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1Ro
cmVhZC5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEy
IFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEz
MDEgIFVTQQorICovCisKKyNpZm5kZWYgVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWRfaAor
I2RlZmluZSBUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZF9oCisKKyNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJDb2xvci5oIgorI2luY2x1ZGUgIkxheWVy
VGlsZUluZGV4LmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorCisjaW5jbHVkZSA8d3RmL0hhc2hN
YXAuaD4KKyNpbmNsdWRlIDx3dGYvTGlzdEhhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29w
eWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQ
dHIuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Y2xhc3MgSW50UmVjdDsKKworLy8gQSBMUlUgY2FjaGUgZm9yIE9wZW5HTCB0ZXh0dXJlcy4KK2Ns
YXNzIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZ
QUJMRShUZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCk7CisgICAgV1RGX01BS0VfRkFTVF9B
TExPQ0FURUQ7CitwdWJsaWM6CisgICAgZnJpZW5kIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhy
ZWFkKiB0ZXh0dXJlQ2FjaGVDb21wb3NpdGluZ1RocmVhZCgpOworCisgICAgLy8gQ3JlYXRlcyBh
IG5ldyB0ZXh0dXJlIG1hbmFnZWQgYnkgdGhpcyBjYWNoZS4KKyAgICBQYXNzUmVmUHRyPFRleHR1
cmU+IGNyZWF0ZVRleHR1cmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRleHR1cmU6OmNyZWF0
ZSgpOworICAgIH0KKworICAgIC8vIFJldHJpZXZlIGEgdGV4dHVyZSBmcm9tIHRoZSBjYWNoZS4K
KyAgICBQYXNzUmVmUHRyPFRleHR1cmU+IHRleHR1cmVGb3JUaWxlZENvbnRlbnRzKGNvbnN0IFNr
Qml0bWFwJiBjb250ZW50cywgY29uc3QgSW50UmVjdCYgdGlsZVJlY3QsIGNvbnN0IFRpbGVJbmRl
eCYsIGJvb2wgaXNPcGFxdWUpOworICAgIFBhc3NSZWZQdHI8VGV4dHVyZT4gdGV4dHVyZUZvckNv
bG9yKGNvbnN0IENvbG9yJik7CisKKyAgICAvLyBVcGRhdGUgY29udGVudHMgb2YgYW4gZXhpc3Rp
bmcgdGV4dHVyZSwgb3IgY3JlYXRlIGEgbmV3IG9uZSBpZiB0ZXh0dXJlIGlzIDAuCisgICAgUGFz
c1JlZlB0cjxUZXh0dXJlPiB1cGRhdGVDb250ZW50cyhjb25zdCBSZWZQdHI8VGV4dHVyZT4mLCBj
b25zdCBTa0JpdG1hcCYgY29udGVudHMsIGNvbnN0IEludFJlY3QmIGRpcnR5UmVjdCwgY29uc3Qg
SW50UmVjdCYgdGlsZVJlY3QpOworCisgICAgc2l6ZV90IG1lbW9yeVVzYWdlKCkgY29uc3QgeyBy
ZXR1cm4gbV9tZW1vcnlVc2FnZTsgfQorICAgIHNpemVfdCBtZW1vcnlMaW1pdCgpIGNvbnN0IHsg
cmV0dXJuIG1fbWVtb3J5TGltaXQ7IH0KKyAgICB2b2lkIHNldE1lbW9yeUxpbWl0KHNpemVfdCBs
aW1pdCkgeyBtX21lbW9yeUxpbWl0ID0gbGltaXQ7IH0KKworICAgIC8vIEV2aWN0IHVucHJvdGVj
dGVkIHRleHR1cmVzIHVudGlsIHdlIHJlYWNoIHRoZSBsaW1pdCBwcm92aWRlZC4KKyAgICB2b2lk
IHBydW5lKHNpemVfdCBsaW1pdCk7CisgICAgdm9pZCBwcnVuZSgpIHsgcHJ1bmUobWVtb3J5TGlt
aXQoKSk7IH0KKworICAgIC8vIEV2aWN0IGFsbCB0ZXh0dXJlcyBmcm9tIHRoZSBjYWNoZS4KKyAg
ICB2b2lkIGNsZWFyKCk7CisKKyAgICAvLyBVcGRhdGUgdGhlIExSVSBsaXN0LgorICAgIHZvaWQg
dGV4dHVyZUFjY2Vzc2VkKFRleHR1cmUqKTsKKworICAgIC8vIERlbGV0aW5nIGRlc3Ryb3llZCB0
ZXh0dXJlcyBpcyBwcm92aWRlZCBhcyBhIHNlcGFyYXRlIG1ldGhvZCwgYmVjYXVzZQorICAgIC8v
IHRoZXJlIG1pZ2h0IG5vdCBiZSBhbiBPcGVuR0wgY29udGV4dCBjdXJyZW50IHdoZW4gdGhlIHRl
eHR1cmUgZGVzdHJ1Y3RvcgorICAgIC8vIHdhcyBjYWxsZWQuIENhbGxpbmcgdGhpcyBtYWtlcyBz
dXJlIHRvIGZyZWUgYW55IHN1Y2ggdGV4dHVyZXMuCisgICAgdm9pZCBjb2xsZWN0R2FyYmFnZSgp
OworCisgICAgdm9pZCB0ZXh0dXJlRGVzdHJveWVkKFRleHR1cmUqKTsKKyAgICB2b2lkIHRleHR1
cmVSZXNpemVkKFRleHR1cmUqLCBjb25zdCBJbnRTaXplJiBvbGRTaXplKTsKKworICAgIC8vIFVu
ZG8gdGhlIGVmZmVjdHMgb2YgZXZpY3Rpb24sIGlmIHBvc3NpYmxlLgorICAgIGJvb2wgaW5zdGFs
bChUZXh0dXJlKik7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IFpvbWJpZVRleHR1cmUgeworICAg
ICAgICBleHBsaWNpdCBab21iaWVUZXh0dXJlKFRleHR1cmUqIHRleHR1cmUpCisgICAgICAgICAg
ICA6IGlkKHRleHR1cmUtPnRleHR1cmVJZCgpKQorICAgICAgICAgICAgLCBzaXplKHRleHR1cmUt
PnNpemUoKSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgaWQ7Cisg
ICAgICAgIEludFNpemUgc2l6ZTsKKyAgICB9OworICAgIHR5cGVkZWYgTGlzdEhhc2hTZXQ8VGV4
dHVyZSogPiBUZXh0dXJlU2V0OworICAgIHR5cGVkZWYgc3RkOjpwYWlyPHVpbnQzMl90LCBzaXpl
X3Q+IENvbnRlbnRzS2V5OworICAgIHR5cGVkZWYgSGFzaE1hcDxUaWxlSW5kZXgsIFJlZlB0cjxU
ZXh0dXJlPiA+IFRleHR1cmVNYXA7CisgICAgdHlwZWRlZiBWZWN0b3I8Wm9tYmllVGV4dHVyZT4g
R2FyYmFnZTsKKworICAgIFRleHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCk7CisgICAgflRl
eHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCk7CisKKyAgICB1bnNpZ25lZCBhbGxvY2F0ZVRl
eHR1cmVJZCgpOworICAgIHZvaWQgZnJlZVRleHR1cmVJZCh1bnNpZ25lZCBpZCk7CisKKyAgICB2
b2lkIGluY01lbW9yeVVzYWdlKGludCBkZWx0YSkgeyBzZXRNZW1vcnlVc2FnZShtZW1vcnlVc2Fn
ZSgpICsgZGVsdGEpOyB9CisgICAgdm9pZCBkZWNNZW1vcnlVc2FnZShpbnQgZGVsdGEpIHsgc2V0
TWVtb3J5VXNhZ2UobWVtb3J5VXNhZ2UoKSAtIGRlbHRhKTsgfQorICAgIHZvaWQgc2V0TWVtb3J5
VXNhZ2Uoc2l6ZV90KTsKKworICAgIENvbnRlbnRzS2V5IGtleShjb25zdCBTa0JpdG1hcCYgY29u
dGVudHMpOworCisgICAgdm9pZCBldmljdChjb25zdCBUZXh0dXJlU2V0OjppdGVyYXRvciYpOwor
CisgICAgLy8gTFJVIHNldCBvZiB3ZWFrIHBvaW50ZXJzIHRvIHRleHR1cmVzLgorICAgIFRleHR1
cmVTZXQgbV90ZXh0dXJlczsKKyAgICBzaXplX3QgbV9tZW1vcnlVc2FnZTsKKyAgICBzaXplX3Qg
bV9tZW1vcnlMaW1pdDsKKworICAgIC8vIE1hcCBvZiByZWZDb3VudGVkIHBvaW50ZXJzIHRvIHRl
eHR1cmVzLgorICAgIEhhc2hNYXA8Q29udGVudHNLZXksIFRleHR1cmVNYXA+IG1fY2FjaGU7Cisg
ICAgc3RydWN0IENvbG9ySGFzaCB7CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0
IENvbG9yJiBrZXkpIHsgcmV0dXJuIFdURjo6aW50SGFzaChrZXkucmdiKCkpOyB9CisgICAgICAg
IHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IENvbG9yJiBhLCBjb25zdCBDb2xvciYgYikgeyByZXR1
cm4gYSA9PSBiOyB9CisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIHNhZmVUb0NvbXBhcmVUb0Vt
cHR5T3JEZWxldGVkID0gdHJ1ZTsKKyAgICB9OworICAgIHN0cnVjdCBDb2xvckhhc2hUcmFpdHMg
OiBXVEY6OkdlbmVyaWNIYXNoVHJhaXRzPENvbG9yPiB7CisgICAgICAgIHN0YXRpYyBjb25zdCBi
b29sIGVtcHR5VmFsdWVJc1plcm8gPSB0cnVlOworICAgICAgICAvLyBUaGUgZGVsZXRlZCB2YWx1
ZSBpcyBhbiBpbnZhbGlkIGNvbG9yIHdpdGggYW4gUkdCIHZhbHVlIG9mIDB4RkZGRkZGRkYuCisg
ICAgICAgIC8vIFN1Y2ggdmFsdWVzIGRvIG5vdCBuYXR1cmFsbHkgb2NjdXIgYXMgY29sb3JzLgor
ICAgICAgICAvLyBBbmQgZW1wdHkgdmFsdWUgaXMgYW4gaW52YWxpZCBjb2xvciB3aXRoIGFuIFJH
QiB2YWx1ZSBvZiAweDAuCisgICAgICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdERlbGV0ZWRWYWx1
ZShDb2xvciYgc2xvdCkgeyBuZXcgKCZzbG90KSBDb2xvcigpOyAqcmVpbnRlcnByZXRfY2FzdDxS
R0JBMzIqPigmc2xvdCkgPSBDb2xvcjo6d2hpdGU7IH0KKyAgICAgICAgc3RhdGljIGJvb2wgaXNE
ZWxldGVkVmFsdWUoY29uc3QgQ29sb3ImIHZhbHVlKSB7IHJldHVybiAhdmFsdWUuaXNWYWxpZCgp
ICYmIHZhbHVlLnJnYigpID09IENvbG9yOjp3aGl0ZTsgfQorICAgIH07CisgICAgdHlwZWRlZiBI
YXNoTWFwPENvbG9yLCBSZWZQdHI8VGV4dHVyZT4sIENvbG9ySGFzaCwgQ29sb3JIYXNoVHJhaXRz
PiBDb2xvclRleHR1cmVNYXA7CisgICAgQ29sb3JUZXh0dXJlTWFwIG1fY29sb3JzOworICAgIEdh
cmJhZ2UgbV9nYXJiYWdlOworfTsKKworVGV4dHVyZUNhY2hlQ29tcG9zaXRpbmdUaHJlYWQqIHRl
eHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkKCk7CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlmIC8vIFRl
eHR1cmVDYWNoZUNvbXBvc2l0aW5nVGhyZWFkX2gK
</data>

          </attachment>
      

    </bug>

</bugzilla>