<?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>83382</bug_id>
          
          <creation_ts>2012-04-06 12:01:32 -0700</creation_ts>
          <short_desc>[Chromium] Refactor CCTextureUpdater to contain a raw pointer to a GraphicsContext3D.</short_desc>
          <delta_ts>2012-04-24 20:32:34 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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>81004</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="David Reveman">reveman</reporter>
          <assigned_to name="David Reveman">reveman</assigned_to>
          <cc>jamesr</cc>
    
    <cc>nduca</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>597534</commentid>
    <comment_count>0</comment_count>
    <who name="David Reveman">reveman</who>
    <bug_when>2012-04-06 12:01:32 -0700</bug_when>
    <thetext>Makes it possible for the texture updater class to manage GC3D dependent resources (like query objects for throttling). Also replaces the CCTextureUpdater::update(count) function with updateAll() and updateAtMost(count) to avoid unnecessary complexity from having to deal with both use cases in one function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597538</commentid>
    <comment_count>1</comment_count>
      <attachid>136048</attachid>
    <who name="David Reveman">reveman</who>
    <bug_when>2012-04-06 12:04:18 -0700</bug_when>
    <thetext>Created attachment 136048
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597588</commentid>
    <comment_count>2</comment_count>
      <attachid>136048</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2012-04-06 13:10:16 -0700</bug_when>
    <thetext>Comment on attachment 136048
Patch

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

Looks good. I&apos;d like to hold a ref explicitly in the updater as well, just to be safe (we currently manage the lifetime rather carefully in CCThreadProxy, but somebody might not be so careful about lifetimes in a future refactor and I don&apos;t want to leave the possibility of a dangling pointer).

&gt; Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdater.h:70
&gt; +    GraphicsContext3D* m_context;

can this hold a RefPtr&lt;&gt; ? the lifetime should be maintained by the owner, but it&apos;s safer to keep a ref here as well IMO

&gt; Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp:506
&gt; +    m_currentTextureUpdaterOnImplThread = adoptPtr(new CCTextureUpdater(m_layerTreeHostImpl-&gt;context(), m_layerTreeHostImpl-&gt;contentsTextureAllocator(), m_layerTreeHostImpl-&gt;layerRenderer()-&gt;textureCopier()));

Hm, we reset this on every frame?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>597743</commentid>
    <comment_count>3</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2012-04-06 15:40:15 -0700</bug_when>
    <thetext>This is awesome, thanks for pulling this out from the megapatch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598364</commentid>
    <comment_count>4</comment_count>
    <who name="David Reveman">reveman</who>
    <bug_when>2012-04-09 10:02:51 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 136048 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=136048&amp;action=review
&gt; 
&gt; Looks good. I&apos;d like to hold a ref explicitly in the updater as well, just to be safe (we currently manage the lifetime rather carefully in CCThreadProxy, but somebody might not be so careful about lifetimes in a future refactor and I don&apos;t want to leave the possibility of a dangling pointer).
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdater.h:70
&gt; &gt; +    GraphicsContext3D* m_context;
&gt; 
&gt; can this hold a RefPtr&lt;&gt; ? the lifetime should be maintained by the owner, but it&apos;s safer to keep a ref here as well IMO

I agree. The problem is that the LayerRendererChromium owns the GC3D and currently doesn&apos;t provide anything but raw pointer access to it. The TextureCopier and the TextureAllocator take raw pointers but are owned by the LRC. I think the texture updater should be handled the same way. What makes this confusing right now is that the CCTextureUpdater has become this object that we use to pass TextureCopier and TextureAllocator pointers to updateCompositorResources() implementations. That need to be fixed.

&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp:506
&gt; &gt; +    m_currentTextureUpdaterOnImplThread = adoptPtr(new CCTextureUpdater(m_layerTreeHostImpl-&gt;context(), m_layerTreeHostImpl-&gt;contentsTextureAllocator(), m_layerTreeHostImpl-&gt;layerRenderer()-&gt;textureCopier()));
&gt; 
&gt; Hm, we reset this on every frame?

I averted from actually changing the lifetime of texture updater in this patch and instead keep that change in throttling patch. I can included that in this patch if you prefer that?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598412</commentid>
    <comment_count>5</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2012-04-09 10:40:47 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #2)
&gt; &gt; (From update of attachment 136048 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=136048&amp;action=review
&gt; &gt; 
&gt; &gt; Looks good. I&apos;d like to hold a ref explicitly in the updater as well, just to be safe (we currently manage the lifetime rather carefully in CCThreadProxy, but somebody might not be so careful about lifetimes in a future refactor and I don&apos;t want to leave the possibility of a dangling pointer).
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdater.h:70
&gt; &gt; &gt; +    GraphicsContext3D* m_context;
&gt; &gt; 
&gt; &gt; can this hold a RefPtr&lt;&gt; ? the lifetime should be maintained by the owner, but it&apos;s safer to keep a ref here as well IMO
&gt; 
&gt; I agree. The problem is that the LayerRendererChromium owns the GC3D and currently doesn&apos;t provide anything but raw pointer access to it. The TextureCopier and the TextureAllocator take raw pointers but are owned by the LRC. I think the texture updater should be handled the same way. What makes this confusing right now is that the CCTextureUpdater has become this object that we use to pass TextureCopier and TextureAllocator pointers to updateCompositorResources() implementations. That need to be fixed.

You can take a RefPtr&lt;&gt; from a raw pointer.

&gt; 
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp:506
&gt; &gt; &gt; +    m_currentTextureUpdaterOnImplThread = adoptPtr(new CCTextureUpdater(m_layerTreeHostImpl-&gt;context(), m_layerTreeHostImpl-&gt;contentsTextureAllocator(), m_layerTreeHostImpl-&gt;layerRenderer()-&gt;textureCopier()));
&gt; &gt; 
&gt; &gt; Hm, we reset this on every frame?
&gt; 
&gt; I averted from actually changing the lifetime of texture updater in this patch and instead keep that change in throttling patch. I can included that in this patch if you prefer that?

I think it&apos;s fine to leave as-is for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598499</commentid>
    <comment_count>6</comment_count>
    <who name="David Reveman">reveman</who>
    <bug_when>2012-04-09 12:09:20 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #4)
&gt; &gt; (In reply to comment #2)
&gt; &gt; &gt; (From update of attachment 136048 [details] [details] [details])
&gt; &gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=136048&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; Looks good. I&apos;d like to hold a ref explicitly in the updater as well, just to be safe (we currently manage the lifetime rather carefully in CCThreadProxy, but somebody might not be so careful about lifetimes in a future refactor and I don&apos;t want to leave the possibility of a dangling pointer).
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdater.h:70
&gt; &gt; &gt; &gt; +    GraphicsContext3D* m_context;
&gt; &gt; &gt; 
&gt; &gt; &gt; can this hold a RefPtr&lt;&gt; ? the lifetime should be maintained by the owner, but it&apos;s safer to keep a ref here as well IMO
&gt; &gt; 
&gt; &gt; I agree. The problem is that the LayerRendererChromium owns the GC3D and currently doesn&apos;t provide anything but raw pointer access to it. The TextureCopier and the TextureAllocator take raw pointers but are owned by the LRC. I think the texture updater should be handled the same way. What makes this confusing right now is that the CCTextureUpdater has become this object that we use to pass TextureCopier and TextureAllocator pointers to updateCompositorResources() implementations. That need to be fixed.
&gt; 
&gt; You can take a RefPtr&lt;&gt; from a raw pointer.

Ok, I could do that but wouldn&apos;t it be more appropriate to have a LRC function that returned a PassRefPtr&lt;GraphicsContext3D&gt;? It seems inappropriate to take a RefPtr&lt;&gt; when LRC doesn&apos;t provide an explicit way to give you one. And we also don&apos;t seem to have any GC3D usage on the impl thread that actually rely on it being a reference counted object so I&apos;m a bit uneasy introducing that unless necessary. Should I be less concerned?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598511</commentid>
    <comment_count>7</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2012-04-09 12:21:52 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #5)
&gt; &gt; (In reply to comment #4)
&gt; &gt; &gt; (In reply to comment #2)
&gt; &gt; &gt; &gt; (From update of attachment 136048 [details] [details] [details] [details])
&gt; &gt; &gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=136048&amp;action=review
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Looks good. I&apos;d like to hold a ref explicitly in the updater as well, just to be safe (we currently manage the lifetime rather carefully in CCThreadProxy, but somebody might not be so careful about lifetimes in a future refactor and I don&apos;t want to leave the possibility of a dangling pointer).
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdater.h:70
&gt; &gt; &gt; &gt; &gt; +    GraphicsContext3D* m_context;
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; can this hold a RefPtr&lt;&gt; ? the lifetime should be maintained by the owner, but it&apos;s safer to keep a ref here as well IMO
&gt; &gt; &gt; 
&gt; &gt; &gt; I agree. The problem is that the LayerRendererChromium owns the GC3D and currently doesn&apos;t provide anything but raw pointer access to it. The TextureCopier and the TextureAllocator take raw pointers but are owned by the LRC. I think the texture updater should be handled the same way. What makes this confusing right now is that the CCTextureUpdater has become this object that we use to pass TextureCopier and TextureAllocator pointers to updateCompositorResources() implementations. That need to be fixed.
&gt; &gt; 
&gt; &gt; You can take a RefPtr&lt;&gt; from a raw pointer.
&gt; 
&gt; Ok, I could do that but wouldn&apos;t it be more appropriate to have a LRC function that returned a PassRefPtr&lt;GraphicsContext3D&gt;?

No, PassRefPtr&lt;&gt; return type is used when the caller *has* to take a reference to the object before using it.  It&apos;s fine for LRC to expose a getter that a user can use without having to reference themselves if they don&apos;t retain it.  If a caller does want to retain, they can.

&gt; It seems inappropriate to take a RefPtr&lt;&gt; when LRC doesn&apos;t provide an explicit way to give you one. And we also don&apos;t seem to have any GC3D usage on the impl thread that actually rely on it being a reference counted object so I&apos;m a bit uneasy introducing that unless necessary. Should I be less concerned?

What specifically are you worried about?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598541</commentid>
    <comment_count>8</comment_count>
    <who name="David Reveman">reveman</who>
    <bug_when>2012-04-09 12:47:29 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; &gt; (In reply to comment #5)
&gt; &gt; &gt; (In reply to comment #4)
&gt; &gt; &gt; &gt; (In reply to comment #2)
&gt; &gt; &gt; &gt; &gt; (From update of attachment 136048 [details] [details] [details] [details] [details])
&gt; &gt; &gt; &gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=136048&amp;action=review
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; Looks good. I&apos;d like to hold a ref explicitly in the updater as well, just to be safe (we currently manage the lifetime rather carefully in CCThreadProxy, but somebody might not be so careful about lifetimes in a future refactor and I don&apos;t want to leave the possibility of a dangling pointer).
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCTextureUpdater.h:70
&gt; &gt; &gt; &gt; &gt; &gt; +    GraphicsContext3D* m_context;
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; can this hold a RefPtr&lt;&gt; ? the lifetime should be maintained by the owner, but it&apos;s safer to keep a ref here as well IMO
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; I agree. The problem is that the LayerRendererChromium owns the GC3D and currently doesn&apos;t provide anything but raw pointer access to it. The TextureCopier and the TextureAllocator take raw pointers but are owned by the LRC. I think the texture updater should be handled the same way. What makes this confusing right now is that the CCTextureUpdater has become this object that we use to pass TextureCopier and TextureAllocator pointers to updateCompositorResources() implementations. That need to be fixed.
&gt; &gt; &gt; 
&gt; &gt; &gt; You can take a RefPtr&lt;&gt; from a raw pointer.
&gt; &gt; 
&gt; &gt; Ok, I could do that but wouldn&apos;t it be more appropriate to have a LRC function that returned a PassRefPtr&lt;GraphicsContext3D&gt;?
&gt; 
&gt; No, PassRefPtr&lt;&gt; return type is used when the caller *has* to take a reference to the object before using it.  It&apos;s fine for LRC to expose a getter that a user can use without having to reference themselves if they don&apos;t retain it.  If a caller does want to retain, they can.

Ok.

&gt; 
&gt; &gt; It seems inappropriate to take a RefPtr&lt;&gt; when LRC doesn&apos;t provide an explicit way to give you one. And we also don&apos;t seem to have any GC3D usage on the impl thread that actually rely on it being a reference counted object so I&apos;m a bit uneasy introducing that unless necessary. Should I be less concerned?
&gt; 
&gt; What specifically are you worried about?

I just prefer the OwnPtr usage and think it&apos;s nice if we can use that when possible. This change would break away from that in the case of GC3D usage on the impl thread unless there&apos;s some existing case that I&apos;m not aware of.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>599577</commentid>
    <comment_count>9</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2012-04-10 13:33:12 -0700</bug_when>
    <thetext>Did we get closure here? &lt;peptalk&gt;Lets get this landed.&lt;/pep&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>609429</commentid>
    <comment_count>10</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2012-04-24 20:32:34 -0700</bug_when>
    <thetext>Turns out we don&apos;t need it at all.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>136048</attachid>
            <date>2012-04-06 12:04:18 -0700</date>
            <delta_ts>2012-04-06 13:10:16 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-83382-20120406120417.patch</filename>
            <type>text/plain</type>
            <size>49002</size>
            <attacher name="David Reveman">reveman</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEzNDU2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTc1YjVhZWE5ODQ4ZjM5
ODZhYTliM2QwZjNmM2Q5NjQ5OTIxZGUzZS4uNjllMzIxMTUzNTgwNzUxYjg0YjVhMThlNDE1NGQy
Y2MwNjFiOTZiNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ5IEBACisyMDEyLTA0LTA2ICBEYXZp
ZCBSZXZlbWFuICA8cmV2ZW1hbkBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgW0Nocm9taXVtXSBS
ZWZhY3RvciBDQ1RleHR1cmVVcGRhdGVyIHRvIGNvbnRhaW4gYSByYXcgcG9pbnRlciB0byBhIEdy
YXBoaWNzQ29udGV4dDNELgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9ODMzODIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBNYWtlcyBpdCBwb3NzaWJsZSBmb3IgdGhlIHRleHR1cmUgdXBkYXRlciBjbGFzcyB0
byBtYW5hZ2UgR0MzRAorICAgICAgICBkZXBlbmRlbnQgcmVzb3VyY2VzIChsaWtlIHF1ZXJ5IG9i
amVjdHMgZm9yIHRocm90dGxpbmcpLiBBbHNvCisgICAgICAgIHJlcGxhY2VzIHRoZSBDQ1RleHR1
cmVVcGRhdGVyOjp1cGRhdGUoY291bnQpIGZ1bmN0aW9uIHdpdGgKKyAgICAgICAgdXBkYXRlQWxs
KCkgYW5kIHVwZGF0ZUF0TW9zdChjb3VudCkgdG8gYXZvaWQgdW5uZWNlc3NhcnkgY29tcGxleGl0
eQorICAgICAgICBmcm9tIGhhdmluZyB0byBkZWFsIHdpdGggYm90aCB1c2UgY2FzZXMgaW4gb25l
IGZ1bmN0aW9uLgorCisgICAgICAgIENvdmVyZWQgYnkgZXhpc3RpbmcgdW5pdCB0ZXN0cy4KKwor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhczJETGF5ZXJDaHJvbWl1
bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDYW52YXMyRExheWVyQ2hyb21pdW06OnVwZGF0ZUNv
bXBvc2l0b3JSZXNvdXJjZXMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0NhbnZhczJETGF5ZXJDaHJvbWl1bS5oOgorICAgICAgICAoQ2FudmFzMkRMYXllckNocm9taXVt
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmg6
CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjp1cGRhdGVDb21wb3NpdG9yUmVzb3Vy
Y2VzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaWxlZExheWVyQ2hy
b21pdW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VGlsZWRMYXllckNocm9taXVtOjp1cGRhdGVD
b21wb3NpdG9yUmVzb3VyY2VzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9UaWxlZExheWVyQ2hyb21pdW0uaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9XZWJHTExheWVyQ2hyb21pdW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xMYXll
ckNocm9taXVtOjp1cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9XZWJHTExheWVyQ2hyb21pdW0uaDoKKyAgICAgICAgKFdlYkdM
TGF5ZXJDaHJvbWl1bSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2Mv
Q0NMYXllclRyZWVIb3N0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJUcmVlSG9zdDo6
dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0Lmg6CisgICAgICAgIChDQ0xheWVyVHJlZUhvc3Qp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDU2luZ2xlVGhyZWFk
UHJveHkuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0NTaW5nbGVUaHJlYWRQcm94eTo6ZG9Db21t
aXQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDVGV4dHVyZVVw
ZGF0ZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0NUZXh0dXJlVXBkYXRlcjo6Q0NUZXh0dXJl
VXBkYXRlcik6CisgICAgICAgIChXZWJDb3JlOjpDQ1RleHR1cmVVcGRhdGVyOjp1cGRhdGVBbGwp
OgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjpDQ1RleHR1cmVVcGRhdGVy
Ojp1cGRhdGVBdE1vc3QpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDVGV4dHVyZVVwZGF0ZXIuaDoKKyAgICAgICAgKENDVGV4dHVyZVVwZGF0ZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6Q0NUZXh0dXJlVXBkYXRlcjo6Y29udGV4dCk6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NUaHJlYWRQcm94eS5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpDQ1RocmVhZFByb3h5OjpiZWdpbkZyYW1lQ29tcGxldGVPbkltcGxUaHJlYWQpOgorICAg
ICAgICAoV2ViQ29yZTo6Q0NUaHJlYWRQcm94eTo6c2NoZWR1bGVkQWN0aW9uVXBkYXRlTW9yZVJl
c291cmNlcyk6CisKIDIwMTItMDQtMDYgIERhbmEgSmFuc2VucyAgPGRhbmFrakBjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgW2Nocm9taXVtXSBEcmF3IGRlYnVnIGJvcmRlcnMgZm9yIHRpbGVzIG9u
IGxheWVycyB3aXRoIHNraXBzRHJhdwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1
bS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwppbmRleCBjODFh
MzlkYTYwOWJlNGQ4MDk3MzUxMTIyNjQwMGIzODExZTNlNTRmLi5mYWJhNDI4MzBhN2U3MzY2OGRh
OGZhNjc3NjQzMTI3MzI0NjBiZTQ4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVt
L0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwpAQCAtMSwz
ICsxLDIxIEBACisyMDEyLTA0LTA2ICBEYXZpZCBSZXZlbWFuICA8cmV2ZW1hbkBjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgW0Nocm9taXVtXSBSZWZhY3RvciBDQ1RleHR1cmVVcGRhdGVyIHRvIGNv
bnRhaW4gYSByYXcgcG9pbnRlciB0byBhIEdyYXBoaWNzQ29udGV4dDNELgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODMzODIKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHRlc3RzL0NDTGF5ZXJUcmVlSG9z
dFRlc3QuY3BwOgorICAgICAgICAoV1RGOjpDb250ZW50TGF5ZXJDaHJvbWl1bVdpdGhVcGRhdGVU
cmFja2luZzo6dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyk6CisgICAgICAgICogdGVzdHMvQ0NU
aWxlZExheWVyVGVzdENvbW1vbi5jcHA6CisgICAgICAgIChXZWJLaXRUZXN0czo6RmFrZUNDVGV4
dHVyZVVwZGF0ZXI6OkZha2VDQ1RleHR1cmVVcGRhdGVyKToKKyAgICAgICAgKiB0ZXN0cy9DQ1Rp
bGVkTGF5ZXJUZXN0Q29tbW9uLmg6CisgICAgICAgIChGYWtlQ0NUZXh0dXJlVXBkYXRlcik6Cisg
ICAgICAgICogdGVzdHMvQ2FudmFzMkRMYXllckNocm9taXVtVGVzdC5jcHA6CisgICAgICAgICog
dGVzdHMvVGlsZWRMYXllckNocm9taXVtVGVzdC5jcHA6CisgICAgICAgIChXVEY6OlRFU1QpOgor
ICAgICAgICAoV1RGOjppZGxlUGFpbnRSZXBlYXQpOgorCiAyMDEyLTA0LTA2ICBLZW50IFRhbXVy
YSAgPHRrZW50QGNocm9taXVtLm9yZz4KIAogICAgICAgICBDYWxlbmRhciBQaWNrZXI6IEFkZCBj
b2RlIHRvIG9wZW4vY2xvc2UgdGhlIGNhbGVuZGFyIHBpY2tlcgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVt
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhczJE
TGF5ZXJDaHJvbWl1bS5jcHAKaW5kZXggNWUzNTE2NzYwMmY3NmZmZTc5OTI3YzRhOTM5YWQwOTE3
ZTc2NjMwYi4uZGQ3NTg4OWQ3OGMwYTdhYWIzNDRkODEzODEzZjhmNDgzNGZjNGY3ZSAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRM
YXllckNocm9taXVtLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uY3BwCkBAIC0xMjksMTQgKzEyOSwxNCBAQCB2
b2lkIENhbnZhczJETGF5ZXJDaHJvbWl1bTo6cGFpbnRDb250ZW50c0lmRGlydHkoY29uc3QgQ0NP
Y2NsdXNpb25UcmFja2VyKiAvKiBvYwogICAgIG1fY29udGV4dC0+Zmx1c2goKTsKIH0KIAotdm9p
ZCBDYW52YXMyRExheWVyQ2hyb21pdW06OnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoR3JhcGhp
Y3NDb250ZXh0M0QqIGNvbnRleHQsIENDVGV4dHVyZVVwZGF0ZXImIHVwZGF0ZXIpCit2b2lkIENh
bnZhczJETGF5ZXJDaHJvbWl1bTo6dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhDQ1RleHR1cmVV
cGRhdGVyJiB1cGRhdGVyKQogewogICAgIGlmICghbV9iYWNrVGV4dHVyZUlkIHx8ICFtX2Zyb250
VGV4dHVyZSB8fCAhbV9mcm9udFRleHR1cmUtPmlzVmFsaWQobV9zaXplLCBHcmFwaGljc0NvbnRl
eHQzRDo6UkdCQSkpCiAgICAgICAgIHJldHVybjsKIAogICAgIG1fZnJvbnRUZXh0dXJlLT5hbGxv
Y2F0ZSh1cGRhdGVyLmFsbG9jYXRvcigpKTsKLSAgICB1cGRhdGVyLmNvcGllcigpLT5jb3B5VGV4
dHVyZShjb250ZXh0LCBtX2JhY2tUZXh0dXJlSWQsIG1fZnJvbnRUZXh0dXJlLT50ZXh0dXJlSWQo
KSwgbV9zaXplKTsKLSAgICBHTEMoY29udGV4dCwgY29udGV4dC0+Zmx1c2goKSk7CisgICAgdXBk
YXRlci5jb3BpZXIoKS0+Y29weVRleHR1cmUodXBkYXRlci5jb250ZXh0KCksIG1fYmFja1RleHR1
cmVJZCwgbV9mcm9udFRleHR1cmUtPnRleHR1cmVJZCgpLCBtX3NpemUpOworICAgIEdMQyh1cGRh
dGVyLmNvbnRleHQoKSwgdXBkYXRlci5jb250ZXh0KCktPmZsdXNoKCkpOwogfQogCiB2b2lkIENh
bnZhczJETGF5ZXJDaHJvbWl1bTo6cHVzaFByb3BlcnRpZXNUbyhDQ0xheWVySW1wbCogbGF5ZXIp
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9D
YW52YXMyRExheWVyQ2hyb21pdW0uaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0NhbnZhczJETGF5ZXJDaHJvbWl1bS5oCmluZGV4IGI1ZDBjMjM4OTFmYjA1YjYy
MTgyNDkxMDI1MGQ1OTBiOGI3MmM2NzIuLjYzMTdmMjA0OWE5YTg4OWI2YTU4NDkxMWIyNzY1MDlm
Mzc2N2JhNzAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0NhbnZhczJETGF5ZXJDaHJvbWl1bS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhczJETGF5ZXJDaHJvbWl1bS5oCkBAIC01Nyw3ICs1
Nyw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIGJvb2wgZHJhd3NDb250ZW50KCkgY29uc3Q7CiAg
ICAgdmlydHVhbCB2b2lkIHBhaW50Q29udGVudHNJZkRpcnR5KGNvbnN0IENDT2NjbHVzaW9uVHJh
Y2tlciopOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoR3Jh
cGhpY3NDb250ZXh0M0QqLCBDQ1RleHR1cmVVcGRhdGVyJik7CisgICAgdmlydHVhbCB2b2lkIHVw
ZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoQ0NUZXh0dXJlVXBkYXRlciYpOwogICAgIHZpcnR1YWwg
dm9pZCBwdXNoUHJvcGVydGllc1RvKENDTGF5ZXJJbXBsKik7CiAgICAgdmlydHVhbCB2b2lkIHVu
cmVzZXJ2ZUNvbnRlbnRzVGV4dHVyZSgpOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmggYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgKaW5kZXggYjk4MDIy
YjUyZGE1OGI5MTk3Y2JmNTQ0OGNiNmQ0MGE5YTA3YzI3MC4uMDZjNGRlZWUxOTE4ZjQxYWJmNmVi
MjhjNzYxNTMxYmVhNmFkMDk1MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uaApAQCAtMTczLDcgKzE3Myw3
IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIGJvb2wgZHJhd3NDb250ZW50KCkgY29uc3QgeyByZXR1
cm4gbV9pc0RyYXdhYmxlOyB9CiAgICAgdmlydHVhbCB2b2lkIHBhaW50Q29udGVudHNJZkRpcnR5
KGNvbnN0IENDT2NjbHVzaW9uVHJhY2tlciogLyogb2NjbHVzaW9uICovKSB7IH0KICAgICB2aXJ0
dWFsIHZvaWQgaWRsZVBhaW50Q29udGVudHNJZkRpcnR5KGNvbnN0IENDT2NjbHVzaW9uVHJhY2tl
ciogLyogb2NjbHVzaW9uICovKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlQ29tcG9zaXRv
clJlc291cmNlcyhHcmFwaGljc0NvbnRleHQzRCosIENDVGV4dHVyZVVwZGF0ZXImKSB7IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgdXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhDQ1RleHR1cmVVcGRhdGVy
JikgeyB9CiAgICAgdmlydHVhbCB2b2lkIHNldElzTWFzayhib29sKSB7IH0KICAgICB2aXJ0dWFs
IHZvaWQgdW5yZXNlcnZlQ29udGVudHNUZXh0dXJlKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIGJp
bmRDb250ZW50c1RleHR1cmUoKSB7IH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL1RpbGVkTGF5ZXJDaHJvbWl1bS5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaWxlZExheWVyQ2hyb21pdW0uY3BwCmlu
ZGV4IDEyYjJjNWQ0OWJmYjNjMmFmZDI5NTg1OTc4Y2FiMDdmZDU4NTNiODEuLjAwYWQwNDk1YWY1
N2Y2ZTI1ZTU3YjFhNjA4MjFhMThiMDczZmNkNzIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1RpbGVkTGF5ZXJDaHJvbWl1bS5jcHAKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVGlsZWRMYXllckNocm9t
aXVtLmNwcApAQCAtMTgzLDcgKzE4Myw3IEBAIEludFNpemUgVGlsZWRMYXllckNocm9taXVtOjpj
b250ZW50Qm91bmRzKCkgY29uc3QKICAgICByZXR1cm4gSW50U2l6ZShscm91bmRmKGJvdW5kcygp
LndpZHRoKCkgKiBjb250ZW50c1NjYWxlKCkpLCBscm91bmRmKGJvdW5kcygpLmhlaWdodCgpICog
Y29udGVudHNTY2FsZSgpKSk7CiB9CiAKLXZvaWQgVGlsZWRMYXllckNocm9taXVtOjp1cGRhdGVD
b21wb3NpdG9yUmVzb3VyY2VzKEdyYXBoaWNzQ29udGV4dDNEKiwgQ0NUZXh0dXJlVXBkYXRlciYg
dXBkYXRlcikKK3ZvaWQgVGlsZWRMYXllckNocm9taXVtOjp1cGRhdGVDb21wb3NpdG9yUmVzb3Vy
Y2VzKENDVGV4dHVyZVVwZGF0ZXImIHVwZGF0ZXIpCiB7CiAgICAgLy8gUGFpbnRpbmcgY291bGQg
Y2F1c2UgY29tcG9zaXRpbmcgdG8gZ2V0IHR1cm5lZCBvZmYsIHdoaWNoIG1heSBjYXVzZSB0aGUg
dGlsZXIgdG8gYmVjb21lIGludmFsaWRhdGVkIG1pZC11cGRhdGUuCiAgICAgaWYgKG1fc2tpcHNE
cmF3IHx8IG1fcmVxdWVzdGVkVXBkYXRlVGlsZXNSZWN0LmlzRW1wdHkoKSB8fCBtX3RpbGVyLT5p
c0VtcHR5KCkpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9UaWxlZExheWVyQ2hyb21pdW0uaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL1RpbGVkTGF5ZXJDaHJvbWl1bS5oCmluZGV4IDgxZWUyNDhhNzY4ZmY5
OWRmODZjZWMwZjE4YzRhMzBiYzBhY2M3ZGMuLjc2ODllMWRhZGMxY2IzNjI1ZTlhZjkzYzBlMDE0
NDBkMzRjZjI3YjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL1RpbGVkTGF5ZXJDaHJvbWl1bS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL1RpbGVkTGF5ZXJDaHJvbWl1bS5oCkBAIC00Miw3ICs0Miw3
IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgflRpbGVkTGF5ZXJDaHJvbWl1bSgpOwogCi0gICAg
dmlydHVhbCB2b2lkIHVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoR3JhcGhpY3NDb250ZXh0M0Qq
LCBDQ1RleHR1cmVVcGRhdGVyJik7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUNvbXBvc2l0b3JS
ZXNvdXJjZXMoQ0NUZXh0dXJlVXBkYXRlciYpOwogICAgIHZpcnR1YWwgdm9pZCBzZXRJc01hc2so
Ym9vbCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgcHVzaFByb3BlcnRpZXNUbyhDQ0xheWVySW1wbCop
OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
V2ViR0xMYXllckNocm9taXVtLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL1dlYkdMTGF5ZXJDaHJvbWl1bS5jcHAKaW5kZXggZGE1NWYzYWMwNmM0ZDVjNDZl
ZGFjMTc5ZDg0ZGY2MzhhYzIxOTllYy4uNjBmNjIxNjg4YmFmNmQ3NTNiOGZhNGQzY2EzN2JlMDll
ZDUwMWJmMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vV2ViR0xMYXllckNocm9taXVtLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9XZWJHTExheWVyQ2hyb21pdW0uY3BwCkBAIC00MCw2ICs0MCw3
IEBACiAjaW5jbHVkZSAiVHJhY2VFdmVudC5oIgogI2luY2x1ZGUgImNjL0NDTGF5ZXJUcmVlSG9z
dC5oIgogI2luY2x1ZGUgImNjL0NDVGV4dHVyZUxheWVySW1wbC5oIgorI2luY2x1ZGUgImNjL0ND
VGV4dHVyZVVwZGF0ZXIuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC04Myw4ICs4NCw5
IEBAIHZvaWQgV2ViR0xMYXllckNocm9taXVtOjpwYWludENvbnRlbnRzSWZEaXJ0eShjb25zdCBD
Q09jY2x1c2lvblRyYWNrZXIqIC8qIG9jY2x1CiAgICAgbV9jb250ZXh0TG9zdCA9IGNvbnRleHQo
KS0+Z2V0RXh0ZW5zaW9ucygpLT5nZXRHcmFwaGljc1Jlc2V0U3RhdHVzQVJCKCkgIT0gR3JhcGhp
Y3NDb250ZXh0M0Q6Ok5PX0VSUk9SOwogfQogCi12b2lkIFdlYkdMTGF5ZXJDaHJvbWl1bTo6dXBk
YXRlQ29tcG9zaXRvclJlc291cmNlcyhHcmFwaGljc0NvbnRleHQzRCogcmVuZGVyZXJDb250ZXh0
LCBDQ1RleHR1cmVVcGRhdGVyJikKK3ZvaWQgV2ViR0xMYXllckNocm9taXVtOjp1cGRhdGVDb21w
b3NpdG9yUmVzb3VyY2VzKENDVGV4dHVyZVVwZGF0ZXImIHVwZGF0ZXIpCiB7CisgICAgR3JhcGhp
Y3NDb250ZXh0M0QqIHJlbmRlcmVyQ29udGV4dCA9IHVwZGF0ZXIuY29udGV4dCgpOwogICAgIGlm
IChtX3RleHR1cmVDaGFuZ2VkKSB7CiAgICAgICAgIHJlbmRlcmVyQ29udGV4dC0+YmluZFRleHR1
cmUoR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQsIG1fdGV4dHVyZUlkKTsKICAgICAgICAg
Ly8gU2V0IHRoZSBtaW4tbWFnIGZpbHRlcnMgdG8gbGluZWFyIGFuZCB3cmFwIG1vZGVzIHRvIEdM
X0NMQU1QX1RPX0VER0UKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL1dlYkdMTGF5ZXJDaHJvbWl1bS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vV2ViR0xMYXllckNocm9taXVtLmgKaW5kZXggNjUwOWZiMzU4
ZDk1ZTliMGRmMTcxYWMwYjFjZGZjNWQ1MzU0MTYzZC4uYTE3YWRiYTBmMjY0MzZmOTQzM2ZlZmE3
NjA5NjdjYzY2NzgxODllOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vV2ViR0xMYXllckNocm9taXVtLmgKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vV2ViR0xMYXllckNocm9taXVtLmgKQEAgLTU0LDcg
KzU0LDcgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCBib29sIGRyYXdzQ29udGVudCgpIGNvbnN0
OwogICAgIHZpcnR1YWwgdm9pZCBwYWludENvbnRlbnRzSWZEaXJ0eShjb25zdCBDQ09jY2x1c2lv
blRyYWNrZXIqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhH
cmFwaGljc0NvbnRleHQzRCosIENDVGV4dHVyZVVwZGF0ZXImKTsKKyAgICB2aXJ0dWFsIHZvaWQg
dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhDQ1RleHR1cmVVcGRhdGVyJik7CiAgICAgdmlydHVh
bCB2b2lkIHB1c2hQcm9wZXJ0aWVzVG8oQ0NMYXllckltcGwqKTsKICAgICB2aXJ0dWFsIHZvaWQg
c2V0TmVlZHNEaXNwbGF5UmVjdChjb25zdCBGbG9hdFJlY3QmKTsKICAgICBib29sIHBhaW50UmVu
ZGVyZWRSZXN1bHRzVG9DYW52YXMoSW1hZ2VCdWZmZXIqKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdC5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJl
ZUhvc3QuY3BwCmluZGV4IGQzZmM5NzBiZDM2NzNkNzFjODIwYmEzMzhhNmJkMDZkNDYyMzU2ZWUu
LmU3MTY0MjJlZTE0ZWZhNGY4MzkzYWNkMzljY2EwZWI4ZjEwMzNkNzQgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9z
dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2Mv
Q0NMYXllclRyZWVIb3N0LmNwcApAQCAtNTc1LDcgKzU3NSw3IEBAIHZvaWQgQ0NMYXllclRyZWVI
b3N0OjpwYWludExheWVyQ29udGVudHMoY29uc3QgTGF5ZXJMaXN0JiByZW5kZXJTdXJmYWNlTGF5
ZXJMaXN0CiAgICAgb2NjbHVzaW9uVHJhY2tlci5vdmVyZHJhd01ldHJpY3MoKS5yZWNvcmRNZXRy
aWNzKHRoaXMpOwogfQogCi12b2lkIENDTGF5ZXJUcmVlSG9zdDo6dXBkYXRlQ29tcG9zaXRvclJl
c291cmNlcyhHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCwgQ0NUZXh0dXJlVXBkYXRlciYgdXBk
YXRlcikKK3ZvaWQgQ0NMYXllclRyZWVIb3N0Ojp1cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKEND
VGV4dHVyZVVwZGF0ZXImIHVwZGF0ZXIpCiB7CiAgICAgLy8gVXNlIEJhY2tUb0Zyb250IHNpbmNl
IGl0J3MgY2hlYXAgYW5kIHRoaXMgaXNuJ3Qgb3JkZXItZGVwZW5kZW50LgogICAgIHR5cGVkZWYg
Q0NMYXllckl0ZXJhdG9yPExheWVyQ2hyb21pdW0sIFZlY3RvcjxSZWZQdHI8TGF5ZXJDaHJvbWl1
bT4gPiwgUmVuZGVyU3VyZmFjZUNocm9taXVtLCBDQ0xheWVySXRlcmF0b3JBY3Rpb25zOjpCYWNr
VG9Gcm9udD4gQ0NMYXllckl0ZXJhdG9yVHlwZTsKQEAgLTU4NSwxNSArNTg1LDE1IEBAIHZvaWQg
Q0NMYXllclRyZWVIb3N0Ojp1cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKEdyYXBoaWNzQ29udGV4
dDNEKiBjb250ZXh0LCBDQ1RlCiAgICAgICAgIGlmIChpdC5yZXByZXNlbnRzVGFyZ2V0UmVuZGVy
U3VyZmFjZSgpKSB7CiAgICAgICAgICAgICBBU1NFUlQoaXQtPnJlbmRlclN1cmZhY2UoKS0+ZHJh
d09wYWNpdHkoKSB8fCBpdC0+cmVuZGVyU3VyZmFjZSgpLT5kcmF3T3BhY2l0eUlzQW5pbWF0aW5n
KCkpOwogICAgICAgICAgICAgaWYgKGl0LT5tYXNrTGF5ZXIoKSkKLSAgICAgICAgICAgICAgICBp
dC0+bWFza0xheWVyKCktPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoY29udGV4dCwgdXBkYXRl
cik7CisgICAgICAgICAgICAgICAgaXQtPm1hc2tMYXllcigpLT51cGRhdGVDb21wb3NpdG9yUmVz
b3VyY2VzKHVwZGF0ZXIpOwogCiAgICAgICAgICAgICBpZiAoaXQtPnJlcGxpY2FMYXllcigpKSB7
Ci0gICAgICAgICAgICAgICAgaXQtPnJlcGxpY2FMYXllcigpLT51cGRhdGVDb21wb3NpdG9yUmVz
b3VyY2VzKGNvbnRleHQsIHVwZGF0ZXIpOworICAgICAgICAgICAgICAgIGl0LT5yZXBsaWNhTGF5
ZXIoKS0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyh1cGRhdGVyKTsKICAgICAgICAgICAgICAg
ICBpZiAoaXQtPnJlcGxpY2FMYXllcigpLT5tYXNrTGF5ZXIoKSkKLSAgICAgICAgICAgICAgICAg
ICAgaXQtPnJlcGxpY2FMYXllcigpLT5tYXNrTGF5ZXIoKS0+dXBkYXRlQ29tcG9zaXRvclJlc291
cmNlcyhjb250ZXh0LCB1cGRhdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaXQtPnJlcGxpY2FM
YXllcigpLT5tYXNrTGF5ZXIoKS0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyh1cGRhdGVyKTsK
ICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChpdC5yZXByZXNlbnRzSXRzZWxmKCkp
Ci0gICAgICAgICAgICBpdC0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhjb250ZXh0LCB1cGRh
dGVyKTsKKyAgICAgICAgICAgIGl0LT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKHVwZGF0ZXIp
OwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3QuaAppbmRleCA5Y2ExNGZjMDQ0
ODgzYWIwYzMxMDlhOTdmYjhiZTFiMmJhMjM3MTYxLi5iNjNlMjMxODI0ZjVhNmVmZTVkMTg5MTJl
MTI2ZGNjYmE4ZjU0Zjk4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3QuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3QuaApAQCAtMjA4LDcg
KzIwOCw3IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgc3RhcnRQYWdlU2NhbGVBbmltYXRpb24oY29u
c3QgSW50U2l6ZSYgdGFyZ2V0UG9zaXRpb24sIGJvb2wgdXNlQW5jaG9yLCBmbG9hdCBzY2FsZSwg
ZG91YmxlIGR1cmF0aW9uU2VjKTsKIAotICAgIHZvaWQgdXBkYXRlQ29tcG9zaXRvclJlc291cmNl
cyhHcmFwaGljc0NvbnRleHQzRCosIENDVGV4dHVyZVVwZGF0ZXImKTsKKyAgICB2b2lkIHVwZGF0
ZUNvbXBvc2l0b3JSZXNvdXJjZXMoQ0NUZXh0dXJlVXBkYXRlciYpOwogICAgIHZvaWQgYXBwbHlT
Y3JvbGxBbmRTY2FsZShjb25zdCBDQ1Njcm9sbEFuZFNjYWxlU2V0Jik7CiAgICAgdm9pZCBzdGFy
dFJhdGVMaW1pdGVyKEdyYXBoaWNzQ29udGV4dDNEKik7CiAgICAgdm9pZCBzdG9wUmF0ZUxpbWl0
ZXIoR3JhcGhpY3NDb250ZXh0M0QqKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDU2luZ2xlVGhyZWFkUHJveHkuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NTaW5nbGVUaHJlYWRQcm94
eS5jcHAKaW5kZXggZWM4NDI4ZDY1MDVmYTE5OTcxZjhhYTMyMDE2NjUwMzEzMjdjMjJiNi4uMTRm
MmJhMDZiMDIzYTUyZmVhZGYyMzVlMTU0ZWFmZDUwYTY1OWZkNiAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NTaW5nbGVUaHJlYWRQcm94
eS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2Mv
Q0NTaW5nbGVUaHJlYWRQcm94eS5jcHAKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlICJjYy9D
Q1RleHR1cmVVcGRhdGVyLmgiCiAjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CiAKLXVzaW5n
IG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgV1RGOwogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CkBAIC0yMDAsOSArMTk5LDkgQEAgdm9pZCBDQ1NpbmdsZVRocmVhZFByb3h5Ojpkb0NvbW1p
dCgpCiAgICAgICAgIG1fbGF5ZXJUcmVlSG9zdEltcGwtPmJlZ2luQ29tbWl0KCk7CiAKICAgICAg
ICAgbV9sYXllclRyZWVIb3N0LT5iZWdpbkNvbW1pdE9uSW1wbFRocmVhZChtX2xheWVyVHJlZUhv
c3RJbXBsLmdldCgpKTsKLSAgICAgICAgQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyKG1fbGF5ZXJU
cmVlSG9zdEltcGwtPmNvbnRlbnRzVGV4dHVyZUFsbG9jYXRvcigpLCBtX2xheWVyVHJlZUhvc3RJ
bXBsLT5sYXllclJlbmRlcmVyKCktPnRleHR1cmVDb3BpZXIoKSk7Ci0gICAgICAgIG1fbGF5ZXJU
cmVlSG9zdC0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhtX2xheWVyVHJlZUhvc3RJbXBsLT5j
b250ZXh0KCksIHVwZGF0ZXIpOwotICAgICAgICB1cGRhdGVyLnVwZGF0ZShtX2xheWVyVHJlZUhv
c3RJbXBsLT5jb250ZXh0KCksIG51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpKTsKKyAgICAg
ICAgQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyKG1fbGF5ZXJUcmVlSG9zdEltcGwtPmNvbnRleHQo
KSwgbV9sYXllclRyZWVIb3N0SW1wbC0+Y29udGVudHNUZXh0dXJlQWxsb2NhdG9yKCksIG1fbGF5
ZXJUcmVlSG9zdEltcGwtPmxheWVyUmVuZGVyZXIoKS0+dGV4dHVyZUNvcGllcigpKTsKKyAgICAg
ICAgbV9sYXllclRyZWVIb3N0LT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKHVwZGF0ZXIpOwor
ICAgICAgICB1cGRhdGVyLnVwZGF0ZUFsbCgpOwogICAgICAgICBBU1NFUlQoIXVwZGF0ZXIuaGFz
TW9yZVVwZGF0ZXMoKSk7CiAgICAgICAgIG1fbGF5ZXJUcmVlSG9zdEltcGwtPnNldFZpc2libGUo
bV9sYXllclRyZWVIb3N0LT52aXNpYmxlKCkpOwogICAgICAgICBtX2xheWVyVHJlZUhvc3QtPmZp
bmlzaENvbW1pdE9uSW1wbFRocmVhZChtX2xheWVyVHJlZUhvc3RJbXBsLmdldCgpKTsKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDVGV4
dHVyZVVwZGF0ZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vY2MvQ0NUZXh0dXJlVXBkYXRlci5jcHAKaW5kZXggMGNlMGY2ZDEwOThhNzM5NzdmM2JhZjgy
MzJmNzIxNmIwNWU3YWQ3ZS4uODg1ZTkzYzg5ZmY0ZTE4ZDQzZmZmZGQ0YjMxOTEyYjYzMjRkMmE4
ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Y2MvQ0NUZXh0dXJlVXBkYXRlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vY2MvQ0NUZXh0dXJlVXBkYXRlci5jcHAKQEAgLTM3LDggKzM3LDkgQEAg
dXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1DQ1RleHR1cmVV
cGRhdGVyOjpDQ1RleHR1cmVVcGRhdGVyKFRleHR1cmVBbGxvY2F0b3IqIGFsbG9jYXRvciwgVGV4
dHVyZUNvcGllciogY29waWVyKQotICAgIDogbV9hbGxvY2F0b3IoYWxsb2NhdG9yKQorQ0NUZXh0
dXJlVXBkYXRlcjo6Q0NUZXh0dXJlVXBkYXRlcihHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCwg
VGV4dHVyZUFsbG9jYXRvciogYWxsb2NhdG9yLCBUZXh0dXJlQ29waWVyKiBjb3BpZXIpCisgICAg
OiBtX2NvbnRleHQoY29udGV4dCkKKyAgICAsIG1fYWxsb2NhdG9yKGFsbG9jYXRvcikKICAgICAs
IG1fY29waWVyKGNvcGllcikKICAgICAsIG1fZW50cnlJbmRleCgwKQogewpAQCAtNzUsMTMgKzc2
LDI5IEBAIGJvb2wgQ0NUZXh0dXJlVXBkYXRlcjo6aGFzTW9yZVVwZGF0ZXMoKSBjb25zdAogICAg
IHJldHVybiBtX2VudHJpZXMuc2l6ZSgpIHx8IG1fcGFydGlhbEVudHJpZXMuc2l6ZSgpOwogfQog
Ci1ib29sIENDVGV4dHVyZVVwZGF0ZXI6OnVwZGF0ZShHcmFwaGljc0NvbnRleHQzRCogY29udGV4
dCwgc2l6ZV90IGNvdW50KQordm9pZCBDQ1RleHR1cmVVcGRhdGVyOjp1cGRhdGVBbGwoKQorewor
ICAgIHNpemVfdCBpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gbV9lbnRyeUluZGV4OyBpbmRleCA8
IG1fZW50cmllcy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgVXBkYXRlRW50cnkmIGVudHJ5
ID0gbV9lbnRyaWVzW2luZGV4XTsKKyAgICAgICAgZW50cnkubV90ZXh0dXJlLT51cGRhdGVSZWN0
KG1fY29udGV4dCwgbV9hbGxvY2F0b3IsIGVudHJ5Lm1fc291cmNlUmVjdCwgZW50cnkubV9kZXN0
UmVjdCk7CisgICAgfQorICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1fcGFydGlhbEVudHJp
ZXMuc2l6ZSgpOyArK2luZGV4KSB7CisgICAgICAgIFVwZGF0ZUVudHJ5JiBlbnRyeSA9IG1fcGFy
dGlhbEVudHJpZXNbaW5kZXhdOworICAgICAgICBlbnRyeS5tX3RleHR1cmUtPnVwZGF0ZVJlY3Qo
bV9jb250ZXh0LCBtX2FsbG9jYXRvciwgZW50cnkubV9zb3VyY2VSZWN0LCBlbnRyeS5tX2Rlc3RS
ZWN0KTsKKyAgICB9CisKKyAgICAvLyBJZiBubyBlbnRyaWVzIGxlZnQgdG8gcHJvY2VzcywgYXV0
by1jbGVhci4KKyAgICBjbGVhcigpOworfQorCit2b2lkIENDVGV4dHVyZVVwZGF0ZXI6OnVwZGF0
ZUF0TW9zdChzaXplX3QgY291bnQpCiB7CiAgICAgc2l6ZV90IGluZGV4OwogICAgIHNpemVfdCBt
YXhJbmRleCA9IG1pbihtX2VudHJ5SW5kZXggKyBjb3VudCwgbV9lbnRyaWVzLnNpemUoKSk7CiAg
ICAgZm9yIChpbmRleCA9IG1fZW50cnlJbmRleDsgaW5kZXggPCBtYXhJbmRleDsgKytpbmRleCkg
ewogICAgICAgICBVcGRhdGVFbnRyeSYgZW50cnkgPSBtX2VudHJpZXNbaW5kZXhdOwotICAgICAg
ICBlbnRyeS5tX3RleHR1cmUtPnVwZGF0ZVJlY3QoY29udGV4dCwgbV9hbGxvY2F0b3IsIGVudHJ5
Lm1fc291cmNlUmVjdCwgZW50cnkubV9kZXN0UmVjdCk7CisgICAgICAgIGVudHJ5Lm1fdGV4dHVy
ZS0+dXBkYXRlUmVjdChtX2NvbnRleHQsIG1fYWxsb2NhdG9yLCBlbnRyeS5tX3NvdXJjZVJlY3Qs
IGVudHJ5Lm1fZGVzdFJlY3QpOwogICAgIH0KIAogICAgIGJvb2wgbW9yZVVwZGF0ZXMgPSBtYXhJ
bmRleCA8IG1fZW50cmllcy5zaXplKCk7CkBAIC05NCwxNyArMTExLDE2IEBAIGJvb2wgQ0NUZXh0
dXJlVXBkYXRlcjo6dXBkYXRlKEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0LCBzaXplX3QgY291
bnQpCiAKICAgICBpZiAobW9yZVVwZGF0ZXMpIHsKICAgICAgICAgbV9lbnRyeUluZGV4ID0gaW5k
ZXg7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAg
Zm9yIChpbmRleCA9IDA7IGluZGV4IDwgbV9wYXJ0aWFsRW50cmllcy5zaXplKCk7ICsraW5kZXgp
IHsKICAgICAgICAgVXBkYXRlRW50cnkmIGVudHJ5ID0gbV9wYXJ0aWFsRW50cmllc1tpbmRleF07
Ci0gICAgICAgIGVudHJ5Lm1fdGV4dHVyZS0+dXBkYXRlUmVjdChjb250ZXh0LCBtX2FsbG9jYXRv
ciwgZW50cnkubV9zb3VyY2VSZWN0LCBlbnRyeS5tX2Rlc3RSZWN0KTsKKyAgICAgICAgZW50cnku
bV90ZXh0dXJlLT51cGRhdGVSZWN0KG1fY29udGV4dCwgbV9hbGxvY2F0b3IsIGVudHJ5Lm1fc291
cmNlUmVjdCwgZW50cnkubV9kZXN0UmVjdCk7CiAgICAgfQogCiAgICAgLy8gSWYgbm8gZW50cmll
cyBsZWZ0IHRvIHByb2Nlc3MsIGF1dG8tY2xlYXIuCiAgICAgY2xlYXIoKTsKLSAgICByZXR1cm4g
ZmFsc2U7CiB9CiAKIHZvaWQgQ0NUZXh0dXJlVXBkYXRlcjo6Y2xlYXIoKQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NUZXh0dXJlVXBk
YXRlci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NU
ZXh0dXJlVXBkYXRlci5oCmluZGV4IGQyOWM2NTg2MWU5MzIzZWNmZjgyZGU0MGJjZGJmN2UyNDZi
NDk3MDcuLjcyZjQ2NWU0MTkzYjY2MWY5YWI1Nzg1NDU0YTllMTY2NzQxNDg1NDcgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDVGV4dHVy
ZVVwZGF0ZXIuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9jYy9DQ1RleHR1cmVVcGRhdGVyLmgKQEAgLTM4LDcgKzM4LDcgQEAgY2xhc3MgVGV4dHVyZUNv
cGllcjsKIAogY2xhc3MgQ0NUZXh0dXJlVXBkYXRlciB7CiBwdWJsaWM6Ci0gICAgQ0NUZXh0dXJl
VXBkYXRlcihUZXh0dXJlQWxsb2NhdG9yKiwgVGV4dHVyZUNvcGllciopOworICAgIENDVGV4dHVy
ZVVwZGF0ZXIoR3JhcGhpY3NDb250ZXh0M0QqLCBUZXh0dXJlQWxsb2NhdG9yKiwgVGV4dHVyZUNv
cGllciopOwogICAgIH5DQ1RleHR1cmVVcGRhdGVyKCk7CiAKICAgICB2b2lkIGFwcGVuZChMYXll
clRleHR1cmVVcGRhdGVyOjpUZXh0dXJlKiwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29u
c3QgSW50UmVjdCYgZGVzdFJlY3QpOwpAQCAtNDYsMTEgKzQ2LDE1IEBAIHB1YmxpYzoKIAogICAg
IGJvb2wgaGFzTW9yZVVwZGF0ZXMoKSBjb25zdDsKIAotICAgIC8vIFVwZGF0ZSBzb21lIHRleHR1
cmVzLiBSZXR1cm5zIHRydWUgaWYgbW9yZSB0ZXh0dXJlcyBsZWZ0IHRvIHByb2Nlc3MuCi0gICAg
Ym9vbCB1cGRhdGUoR3JhcGhpY3NDb250ZXh0M0QqLCBzaXplX3QgY291bnQpOworICAgIC8vIFVw
ZGF0ZSBhbGwgdGV4dHVyZXMuCisgICAgdm9pZCB1cGRhdGVBbGwoKTsKKworICAgIC8vIFVwZGF0
ZSBhdCBtb3N0IHxjb3VudHwgdGV4dHVyZXMuCisgICAgdm9pZCB1cGRhdGVBdE1vc3Qoc2l6ZV90
IGNvdW50KTsKIAogICAgIHZvaWQgY2xlYXIoKTsKIAorICAgIEdyYXBoaWNzQ29udGV4dDNEKiBj
b250ZXh0KCkgeyByZXR1cm4gbV9jb250ZXh0OyB9CiAgICAgVGV4dHVyZUFsbG9jYXRvciogYWxs
b2NhdG9yKCkgeyByZXR1cm4gbV9hbGxvY2F0b3I7IH0KICAgICBUZXh0dXJlQ29waWVyKiBjb3Bp
ZXIoKSB7IHJldHVybiBtX2NvcGllcjsgfQogCkBAIC02Myw2ICs2Nyw3IEBAIHByaXZhdGU6CiAK
ICAgICBzdGF0aWMgdm9pZCBhcHBlbmQoTGF5ZXJUZXh0dXJlVXBkYXRlcjo6VGV4dHVyZSosIGNv
bnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFJlY3QmIGRlc3RSZWN0LCBWZWN0b3I8
VXBkYXRlRW50cnk+Jik7CiAKKyAgICBHcmFwaGljc0NvbnRleHQzRCogbV9jb250ZXh0OwogICAg
IFRleHR1cmVBbGxvY2F0b3IqIG1fYWxsb2NhdG9yOwogICAgIFRleHR1cmVDb3BpZXIqIG1fY29w
aWVyOwogICAgIHNpemVfdCBtX2VudHJ5SW5kZXg7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1RocmVhZFByb3h5LmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDVGhyZWFkUHJveHkuY3Bw
CmluZGV4IDQ1ODRmMTVmYmNhMmU1YmU0ODk5NmRhZDVmMDlmM2NhYzhhM2E5NzYuLjU3YjVmZmY4
NGU4NmIyNDkyMDRjN2NkZTY0NmE5NzI1ODc2MzY5MmYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDVGhyZWFkUHJveHkuY3BwCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDVGhyZWFkUHJv
eHkuY3BwCkBAIC01MDMsOCArNTAzLDggQEAgdm9pZCBDQ1RocmVhZFByb3h5OjpiZWdpbkZyYW1l
Q29tcGxldGVPbkltcGxUaHJlYWQoQ0NDb21wbGV0aW9uRXZlbnQqIGNvbXBsZXRpb24KICAgICBt
X2NvbW1pdENvbXBsZXRpb25FdmVudE9uSW1wbFRocmVhZCA9IGNvbXBsZXRpb247CiAKICAgICBB
U1NFUlQoIW1fY3VycmVudFRleHR1cmVVcGRhdGVyT25JbXBsVGhyZWFkKTsKLSAgICBtX2N1cnJl
bnRUZXh0dXJlVXBkYXRlck9uSW1wbFRocmVhZCA9IGFkb3B0UHRyKG5ldyBDQ1RleHR1cmVVcGRh
dGVyKG1fbGF5ZXJUcmVlSG9zdEltcGwtPmNvbnRlbnRzVGV4dHVyZUFsbG9jYXRvcigpLCBtX2xh
eWVyVHJlZUhvc3RJbXBsLT5sYXllclJlbmRlcmVyKCktPnRleHR1cmVDb3BpZXIoKSkpOwotICAg
IG1fbGF5ZXJUcmVlSG9zdC0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhtX2xheWVyVHJlZUhv
c3RJbXBsLT5jb250ZXh0KCksICptX2N1cnJlbnRUZXh0dXJlVXBkYXRlck9uSW1wbFRocmVhZCk7
CisgICAgbV9jdXJyZW50VGV4dHVyZVVwZGF0ZXJPbkltcGxUaHJlYWQgPSBhZG9wdFB0cihuZXcg
Q0NUZXh0dXJlVXBkYXRlcihtX2xheWVyVHJlZUhvc3RJbXBsLT5jb250ZXh0KCksIG1fbGF5ZXJU
cmVlSG9zdEltcGwtPmNvbnRlbnRzVGV4dHVyZUFsbG9jYXRvcigpLCBtX2xheWVyVHJlZUhvc3RJ
bXBsLT5sYXllclJlbmRlcmVyKCktPnRleHR1cmVDb3BpZXIoKSkpOworICAgIG1fbGF5ZXJUcmVl
SG9zdC0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcygqbV9jdXJyZW50VGV4dHVyZVVwZGF0ZXJP
bkltcGxUaHJlYWQpOwogCiAgICAgbV9zY2hlZHVsZXJPbkltcGxUaHJlYWQtPmJlZ2luRnJhbWVD
b21wbGV0ZSgpOwogfQpAQCAtNTI4LDcgKzUyOCw3IEBAIHZvaWQgQ0NUaHJlYWRQcm94eTo6c2No
ZWR1bGVkQWN0aW9uVXBkYXRlTW9yZVJlc291cmNlcygpCiB7CiAgICAgVFJBQ0VfRVZFTlQoIkND
VGhyZWFkUHJveHk6OnNjaGVkdWxlZEFjdGlvblVwZGF0ZU1vcmVSZXNvdXJjZXMiLCB0aGlzLCAw
KTsKICAgICBBU1NFUlQobV9jdXJyZW50VGV4dHVyZVVwZGF0ZXJPbkltcGxUaHJlYWQpOwotICAg
IG1fY3VycmVudFRleHR1cmVVcGRhdGVyT25JbXBsVGhyZWFkLT51cGRhdGUobV9sYXllclRyZWVI
b3N0SW1wbC0+Y29udGV4dCgpLCB0ZXh0dXJlVXBkYXRlc1BlckZyYW1lKTsKKyAgICBtX2N1cnJl
bnRUZXh0dXJlVXBkYXRlck9uSW1wbFRocmVhZC0+dXBkYXRlQXRNb3N0KHRleHR1cmVVcGRhdGVz
UGVyRnJhbWUpOwogfQogCiB2b2lkIENDVGhyZWFkUHJveHk6OnNjaGVkdWxlZEFjdGlvbkNvbW1p
dCgpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVl
SG9zdFRlc3QuY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVyVHJlZUhv
c3RUZXN0LmNwcAppbmRleCBlMjI1ZDI2ZGIyYjkyOTU4ZWViY2UzMmZkOTVjMWQ2NTcyZDI1M2Fm
Li5mZWUyMGRlY2MxY2NiZTg4OTlkYWM1YmMzZWUzY2I4NTBlNzRjZDA1IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVlSG9zdFRlc3QuY3BwCisrKyBi
L1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvQ0NMYXllclRyZWVIb3N0VGVzdC5jcHAKQEAg
LTE0MTIsOSArMTQxMiw5IEBAIHB1YmxpYzoKICAgICAgICAgbV9pZGxlUGFpbnRDb250ZW50c0Nv
dW50Kys7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJj
ZXMoR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQsIENDVGV4dHVyZVVwZGF0ZXImIHVwZGF0ZXIp
CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoQ0NUZXh0dXJlVXBk
YXRlciYgdXBkYXRlcikKICAgICB7Ci0gICAgICAgIENvbnRlbnRMYXllckNocm9taXVtOjp1cGRh
dGVDb21wb3NpdG9yUmVzb3VyY2VzKGNvbnRleHQsIHVwZGF0ZXIpOworICAgICAgICBDb250ZW50
TGF5ZXJDaHJvbWl1bTo6dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyh1cGRhdGVyKTsKICAgICAg
ICAgbV91cGRhdGVDb3VudCsrOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9j
aHJvbWl1bS90ZXN0cy9DQ1RpbGVkTGF5ZXJUZXN0Q29tbW9uLmNwcCBiL1NvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vdGVzdHMvQ0NUaWxlZExheWVyVGVzdENvbW1vbi5jcHAKaW5kZXggNjAzZDQyMTYw
MDA2Y2JjYzBjMGZkNjg1ZGU0OGU1OTllNjM4YTE0Yy4uYzQ0NWJhNmYxZWExNTk0OGFlNGM0YzVl
YTUzNDY4NTM5MDBmYjVjOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0
cy9DQ1RpbGVkTGF5ZXJUZXN0Q29tbW9uLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVt
L3Rlc3RzL0NDVGlsZWRMYXllclRlc3RDb21tb24uY3BwCkBAIC0xMjYsOCArMTI2LDggQEAgRmFr
ZVRpbGVkTGF5ZXJXaXRoU2NhbGVkQm91bmRzOjpGYWtlVGlsZWRMYXllcldpdGhTY2FsZWRCb3Vu
ZHMoVGV4dHVyZU1hbmFnZXIqIHQKIHsKIH0KIAotRmFrZUNDVGV4dHVyZVVwZGF0ZXI6OkZha2VD
Q1RleHR1cmVVcGRhdGVyKCkKLSAgICA6IENDVGV4dHVyZVVwZGF0ZXIoJm1fdGV4dHVyZUFsbG9j
YXRvciwgJm1fdGV4dHVyZUNvcGllcikKK0Zha2VDQ1RleHR1cmVVcGRhdGVyOjpGYWtlQ0NUZXh0
dXJlVXBkYXRlcihXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCkKKyAgICA6IEND
VGV4dHVyZVVwZGF0ZXIoY29udGV4dCwgJm1fdGV4dHVyZUFsbG9jYXRvciwgJm1fdGV4dHVyZUNv
cGllcikKIHsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9D
Q1RpbGVkTGF5ZXJUZXN0Q29tbW9uLmggYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0ND
VGlsZWRMYXllclRlc3RDb21tb24uaAppbmRleCBlZmI4YWU4NWNhYzZlZWUxZDU3YjViMDhjZjRi
OWNjNjBjNGIxZDZjLi5kNzMzMzdiZjYzYjg4NjI0OWU1NjdhNmRjZmE4ZGVlZGQ4NTk2YWM1IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDVGlsZWRMYXllclRlc3RD
b21tb24uaAorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDVGlsZWRMYXllclRl
c3RDb21tb24uaApAQCAtMjUsNiArMjUsNyBAQAogI2lmbmRlZiBDQ1RpbGVkTGF5ZXJUZXN0Q29t
bW9uX2gKICNkZWZpbmUgQ0NUaWxlZExheWVyVGVzdENvbW1vbl9oCiAKKyNpbmNsdWRlICJGYWtl
V2ViR3JhcGhpY3NDb250ZXh0M0QuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRC5oIgog
I2luY2x1ZGUgIkludFJlY3QuaCIKICNpbmNsdWRlICJJbnRTaXplLmgiCkBAIC0xNjAsNyArMTYx
LDcgQEAgcHVibGljOgogCiBjbGFzcyBGYWtlQ0NUZXh0dXJlVXBkYXRlciA6IHB1YmxpYyBXZWJD
b3JlOjpDQ1RleHR1cmVVcGRhdGVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBGYWtlQ0NUZXh0
dXJlVXBkYXRlcigpOworICAgIGV4cGxpY2l0IEZha2VDQ1RleHR1cmVVcGRhdGVyKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEKik7CiAKICAgICBGYWtlVGV4dHVyZUFsbG9jYXRvciYgdGV4dHVy
ZUFsbG9jYXRvcigpIHsgcmV0dXJuIG1fdGV4dHVyZUFsbG9jYXRvcjsgfQogCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NhbnZhczJETGF5ZXJDaHJvbWl1bVRlc3Qu
Y3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DYW52YXMyRExheWVyQ2hyb21pdW1U
ZXN0LmNwcAppbmRleCAyNjQ3NWNlMzY5ZTVlMjMzNzIwMjEyMWM4NjdiMDJjNDJkMWI2Mzk4Li5l
MjFmZGM3YmZhMGU1NWNkOTBhZDM4ZDZlZmZmMjdiOWZmNmZhMTdmIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NhbnZhczJETGF5ZXJDaHJvbWl1bVRlc3QuY3BwCisr
KyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvQ2FudmFzMkRMYXllckNocm9taXVtVGVz
dC5jcHAKQEAgLTEwMiw3ICsxMDIsNyBAQCBwcm90ZWN0ZWQ6CiAKICAgICAgICAgTW9ja1RleHR1
cmVBbGxvY2F0b3IgYWxsb2NhdG9yTW9jazsKICAgICAgICAgTW9ja1RleHR1cmVDb3BpZXIgY29w
aWVyTW9jazsKLSAgICAgICAgQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyKCZhbGxvY2F0b3JNb2Nr
LCAmY29waWVyTW9jayk7CisgICAgICAgIENDVGV4dHVyZVVwZGF0ZXIgdXBkYXRlcihpbXBsQ29u
dGV4dC5nZXQoKSwgJmFsbG9jYXRvck1vY2ssICZjb3BpZXJNb2NrKTsKIAogICAgICAgICBjb25z
dCBJbnRTaXplIHNpemUoMzAwLCAxNTApOwogCkBAIC0xNTMsNyArMTUzLDcgQEAgcHJvdGVjdGVk
OgogICAgICAgICAgICAgT3duUHRyPENDTGF5ZXJJbXBsPiBsYXllckltcGwgPSBjYW52YXMtPmNy
ZWF0ZUNDTGF5ZXJJbXBsKCk7CiAgICAgICAgICAgICBFWFBFQ1RfRVEoMHUsIHN0YXRpY19jYXN0
PENDVGV4dHVyZUxheWVySW1wbCo+KGxheWVySW1wbC5nZXQoKSktPnRleHR1cmVJZCgpKTsKIAot
ICAgICAgICAgICAgY2FudmFzLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKGltcGxDb250ZXh0
LmdldCgpLCB1cGRhdGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy0+dXBkYXRlQ29tcG9zaXRvclJl
c291cmNlcyh1cGRhdGVyKTsKICAgICAgICAgICAgIGNhbnZhcy0+cHVzaFByb3BlcnRpZXNUbyhs
YXllckltcGwuZ2V0KCkpOwogCiAgICAgICAgICAgICBpZiAodGhyZWFkZWQpCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL1RpbGVkTGF5ZXJDaHJvbWl1bVRlc3QuY3Bw
IGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9UaWxlZExheWVyQ2hyb21pdW1UZXN0LmNw
cAppbmRleCA3NjA0YTA0NTE1NTBjYjk4Y2Q4YTU4MDlkMTlkMTQzYmE0MjJmNGQyLi41MDA2Mzcw
YWJlMGU1NGM5N2VjNmU4OTE5MDcyNGJlZjViYzM5NjJmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
S2l0L2Nocm9taXVtL3Rlc3RzL1RpbGVkTGF5ZXJDaHJvbWl1bVRlc3QuY3BwCisrKyBiL1NvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvVGlsZWRMYXllckNocm9taXVtVGVzdC5jcHAKQEAgLTcy
LDEzICs3MiwxMyBAQCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3QsIHB1c2hEaXJ0eVRpbGVz
KQogICAgIERlYnVnU2NvcGVkU2V0SW1wbFRocmVhZCBpbXBsVGhyZWFkOwogICAgIE93blB0cjxG
YWtlQ0NUaWxlZExheWVySW1wbD4gbGF5ZXJJbXBsKGFkb3B0UHRyKG5ldyBGYWtlQ0NUaWxlZExh
eWVySW1wbCgwKSkpOwogCi0gICAgRmFrZUNDVGV4dHVyZVVwZGF0ZXIgdXBkYXRlcjsKKyAgICBG
YWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyKDApOwogCiAgICAgLy8gVGhlIHRpbGUgc2l6ZSBp
cyAxMDB4MTAwLCBzbyB0aGlzIGludmFsaWRhdGVzIGFuZCB0aGVuIHBhaW50cyB0d28gdGlsZXMu
CiAgICAgbGF5ZXItPnNldEJvdW5kcyhJbnRTaXplKDEwMCwgMjAwKSk7CiAgICAgbGF5ZXItPmlu
dmFsaWRhdGVSZWN0KEludFJlY3QoMCwgMCwgMTAwLCAyMDApKTsKICAgICBsYXllci0+cHJlcGFy
ZVRvVXBkYXRlKEludFJlY3QoMCwgMCwgMTAwLCAyMDApLCAwKTsKLSAgICBsYXllci0+dXBkYXRl
Q29tcG9zaXRvclJlc291cmNlcygwLCB1cGRhdGVyKTsKKyAgICBsYXllci0+dXBkYXRlQ29tcG9z
aXRvclJlc291cmNlcyh1cGRhdGVyKTsKICAgICBsYXllci0+cHVzaFByb3BlcnRpZXNUbyhsYXll
ckltcGwuZ2V0KCkpOwogCiAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYm90aCB0aWxlcyBvbiB0aGUg
aW1wbCBzaWRlLgpAQCAtOTEsNyArOTEsNyBAQCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3Qs
IHB1c2hEaXJ0eVRpbGVzKQogICAgIGxheWVyLT5pbnZhbGlkYXRlUmVjdChJbnRSZWN0KDAsIDAs
IDEwMCwgMjAwKSk7CiAgICAgLy8gLi4uLmJ1dCB0aGVuIG9ubHkgdXBkYXRlIG9uZSBvZiB0aGVt
LgogICAgIGxheWVyLT5wcmVwYXJlVG9VcGRhdGUoSW50UmVjdCgwLCAwLCAxMDAsIDEwMCksIDAp
OwotICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKDAsIHVwZGF0ZXIpOworICAg
IGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKHVwZGF0ZXIpOwogICAgIGxheWVyLT5w
dXNoUHJvcGVydGllc1RvKGxheWVySW1wbC5nZXQoKSk7CiAKICAgICAvLyBXZSBzaG91bGQgb25s
eSBoYXZlIHRoZSBmaXJzdCB0aWxlIHNpbmNlIHRoZSBvdGhlciB0aWxlIHdhcyBpbnZhbGlkYXRl
ZCBidXQgbm90IHBhaW50ZWQuCkBAIC0xMDcsNyArMTA3LDcgQEAgVEVTVChUaWxlZExheWVyQ2hy
b21pdW1UZXN0LCBwdXNoT2NjbHVkZWREaXJ0eVRpbGVzKQogICAgIE93blB0cjxGYWtlQ0NUaWxl
ZExheWVySW1wbD4gbGF5ZXJJbXBsKGFkb3B0UHRyKG5ldyBGYWtlQ0NUaWxlZExheWVySW1wbCgw
KSkpOwogICAgIFRlc3RDQ09jY2x1c2lvblRyYWNrZXIgb2NjbHVkZWQ7CiAKLSAgICBGYWtlQ0NU
ZXh0dXJlVXBkYXRlciB1cGRhdGVyOworICAgIEZha2VDQ1RleHR1cmVVcGRhdGVyIHVwZGF0ZXIo
MCk7CiAKICAgICAvLyBUaGUgdGlsZSBzaXplIGlzIDEwMHgxMDAsIHNvIHRoaXMgaW52YWxpZGF0
ZXMgYW5kIHRoZW4gcGFpbnRzIHR3byB0aWxlcy4KICAgICBsYXllci0+c2V0Qm91bmRzKEludFNp
emUoMTAwLCAyMDApKTsKQEAgLTExNSw3ICsxMTUsNyBAQCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1
bVRlc3QsIHB1c2hPY2NsdWRlZERpcnR5VGlsZXMpCiAgICAgbGF5ZXItPnNldFZpc2libGVMYXll
clJlY3QoSW50UmVjdCgwLCAwLCAxMDAsIDIwMCkpOwogICAgIGxheWVyLT5pbnZhbGlkYXRlUmVj
dChJbnRSZWN0KDAsIDAsIDEwMCwgMjAwKSk7CiAgICAgbGF5ZXItPnByZXBhcmVUb1VwZGF0ZShJ
bnRSZWN0KDAsIDAsIDEwMCwgMjAwKSwgJm9jY2x1ZGVkKTsKLSAgICBsYXllci0+dXBkYXRlQ29t
cG9zaXRvclJlc291cmNlcygwLCB1cGRhdGVyKTsKKyAgICBsYXllci0+dXBkYXRlQ29tcG9zaXRv
clJlc291cmNlcyh1cGRhdGVyKTsKICAgICBsYXllci0+cHVzaFByb3BlcnRpZXNUbyhsYXllcklt
cGwuZ2V0KCkpOwogCiAgICAgRVhQRUNUX05FQVIob2NjbHVkZWQub3ZlcmRyYXdNZXRyaWNzKCku
cGl4ZWxzVXBsb2FkZWRPcGFxdWUoKSwgMCwgMSk7CkBAIC0xMzMsNyArMTMzLDcgQEAgVEVTVChU
aWxlZExheWVyQ2hyb21pdW1UZXN0LCBwdXNoT2NjbHVkZWREaXJ0eVRpbGVzKQogICAgIC8vIC4u
Li5idXQgdGhlIGFyZWEgaXMgb2NjbHVkZWQuCiAgICAgb2NjbHVkZWQuc2V0T2NjbHVzaW9uKElu
dFJlY3QoMCwgMCwgNTAsIDUwKSk7CiAgICAgbGF5ZXItPnByZXBhcmVUb1VwZGF0ZShJbnRSZWN0
KDAsIDAsIDEwMCwgMTAwKSwgJm9jY2x1ZGVkKTsKLSAgICBsYXllci0+dXBkYXRlQ29tcG9zaXRv
clJlc291cmNlcygwLCB1cGRhdGVyKTsKKyAgICBsYXllci0+dXBkYXRlQ29tcG9zaXRvclJlc291
cmNlcyh1cGRhdGVyKTsKICAgICBsYXllci0+cHVzaFByb3BlcnRpZXNUbyhsYXllckltcGwuZ2V0
KCkpOwogCiAgICAgRVhQRUNUX05FQVIob2NjbHVkZWQub3ZlcmRyYXdNZXRyaWNzKCkucGl4ZWxz
VXBsb2FkZWRPcGFxdWUoKSwgMCwgMSk7CkBAIC0xNTIsMTMgKzE1MiwxMyBAQCBURVNUKFRpbGVk
TGF5ZXJDaHJvbWl1bVRlc3QsIHB1c2hEZWxldGVkVGlsZXMpCiAgICAgRGVidWdTY29wZWRTZXRJ
bXBsVGhyZWFkIGltcGxUaHJlYWQ7CiAgICAgT3duUHRyPEZha2VDQ1RpbGVkTGF5ZXJJbXBsPiBs
YXllckltcGwoYWRvcHRQdHIobmV3IEZha2VDQ1RpbGVkTGF5ZXJJbXBsKDApKSk7CiAKLSAgICBG
YWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyOworICAgIEZha2VDQ1RleHR1cmVVcGRhdGVyIHVw
ZGF0ZXIoMCk7CiAKICAgICAvLyBUaGUgdGlsZSBzaXplIGlzIDEwMHgxMDAsIHNvIHRoaXMgaW52
YWxpZGF0ZXMgYW5kIHRoZW4gcGFpbnRzIHR3byB0aWxlcy4KICAgICBsYXllci0+c2V0Qm91bmRz
KEludFNpemUoMTAwLCAyMDApKTsKICAgICBsYXllci0+aW52YWxpZGF0ZVJlY3QoSW50UmVjdCgw
LCAwLCAxMDAsIDIwMCkpOwogICAgIGxheWVyLT5wcmVwYXJlVG9VcGRhdGUoSW50UmVjdCgwLCAw
LCAxMDAsIDIwMCksIDApOwotICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKDAs
IHVwZGF0ZXIpOworICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKHVwZGF0ZXIp
OwogICAgIGxheWVyLT5wdXNoUHJvcGVydGllc1RvKGxheWVySW1wbC5nZXQoKSk7CiAKICAgICAv
LyBXZSBzaG91bGQgaGF2ZSBib3RoIHRpbGVzIG9uIHRoZSBpbXBsIHNpZGUuCkBAIC0xNzgsNyAr
MTc4LDcgQEAgVEVTVChUaWxlZExheWVyQ2hyb21pdW1UZXN0LCBwdXNoRGVsZXRlZFRpbGVzKQog
CiAgICAgLy8gVGhpcyBzaG91bGQgcmVjcmVhdGUgYW5kIHVwZGF0ZSB0aGUgZGVsZXRlZCB0ZXh0
dXJlcy4KICAgICBsYXllci0+cHJlcGFyZVRvVXBkYXRlKEludFJlY3QoMCwgMCwgMTAwLCAxMDAp
LCAwKTsKLSAgICBsYXllci0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcygwLCB1cGRhdGVyKTsK
KyAgICBsYXllci0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyh1cGRhdGVyKTsKICAgICBsYXll
ci0+cHVzaFByb3BlcnRpZXNUbyhsYXllckltcGwuZ2V0KCkpOwogCiAgICAgLy8gV2Ugc2hvdWxk
IG9ubHkgaGF2ZSB0aGUgZmlyc3QgdGlsZSBzaW5jZSB0aGUgb3RoZXIgdGlsZSB3YXMgaW52YWxp
ZGF0ZWQgYnV0IG5vdCBwYWludGVkLgpAQCAtMTkzLDcgKzE5Myw3IEBAIFRFU1QoVGlsZWRMYXll
ckNocm9taXVtVGVzdCwgcHVzaElkbGVQYWludFRpbGVzKQogICAgIERlYnVnU2NvcGVkU2V0SW1w
bFRocmVhZCBpbXBsVGhyZWFkOwogICAgIE93blB0cjxGYWtlQ0NUaWxlZExheWVySW1wbD4gbGF5
ZXJJbXBsKGFkb3B0UHRyKG5ldyBGYWtlQ0NUaWxlZExheWVySW1wbCgwKSkpOwogCi0gICAgRmFr
ZUNDVGV4dHVyZVVwZGF0ZXIgdXBkYXRlcjsKKyAgICBGYWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRh
dGVyKDApOwogCiAgICAgLy8gVGhlIHRpbGUgc2l6ZSBpcyAxMDB4MTAwLiBTZXR1cCA1eDUgdGls
ZXMgd2l0aCBvbmUgdmlzaWJsZSB0aWxlIGluIHRoZSBjZW50ZXIuCiAgICAgSW50U2l6ZSBjb250
ZW50Qm91bmRzKDUwMCwgNTAwKTsKQEAgLTIwOSw3ICsyMDksNyBAQCBURVNUKFRpbGVkTGF5ZXJD
aHJvbWl1bVRlc3QsIHB1c2hJZGxlUGFpbnRUaWxlcykKICAgICAvLyBXZSBzaG91bGQgbmVlZCBp
ZGxlLXBhaW50aW5nIGZvciAzeDMgdGlsZXMgaW4gdGhlIGNlbnRlci4KICAgICBFWFBFQ1RfVFJV
RShsYXllci0+bmVlZHNJZGxlUGFpbnQodmlzaWJsZVJlY3QpKTsKIAotICAgIGxheWVyLT51cGRh
dGVDb21wb3NpdG9yUmVzb3VyY2VzKDAsIHVwZGF0ZXIpOworICAgIGxheWVyLT51cGRhdGVDb21w
b3NpdG9yUmVzb3VyY2VzKHVwZGF0ZXIpOwogICAgIGxheWVyLT5wdXNoUHJvcGVydGllc1RvKGxh
eWVySW1wbC5nZXQoKSk7CiAKICAgICAvLyBXZSBzaG91bGQgaGF2ZSBvbmUgdGlsZSBvbiB0aGUg
aW1wbCBzaWRlLgpAQCAtMjIyLDcgKzIyMiw3IEBAIFRFU1QoVGlsZWRMYXllckNocm9taXVtVGVz
dCwgcHVzaElkbGVQYWludFRpbGVzKQogICAgICAgICBsYXllci0+cHJlcGFyZVRvVXBkYXRlKHZp
c2libGVSZWN0LCAwKTsKICAgICAgICAgRVhQRUNUX1RSVUUobGF5ZXItPm5lZWRzSWRsZVBhaW50
KHZpc2libGVSZWN0KSk7CiAgICAgICAgIGxheWVyLT5wcmVwYXJlVG9VcGRhdGVJZGxlKHZpc2li
bGVSZWN0LCAwKTsKLSAgICAgICAgbGF5ZXItPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoMCwg
dXBkYXRlcik7CisgICAgICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKHVwZGF0
ZXIpOwogICAgICAgICBsYXllci0+cHVzaFByb3BlcnRpZXNUbyhsYXllckltcGwuZ2V0KCkpOwog
ICAgICAgICB0ZXh0dXJlTWFuYWdlci0+dW5wcm90ZWN0QWxsVGV4dHVyZXMoKTsKICAgICB9CkBA
IC0yNTEsNyArMjUxLDcgQEAgVEVTVChUaWxlZExheWVyQ2hyb21pdW1UZXN0LCBwdXNoVGlsZXNB
ZnRlcklkbGVQYWludEZhaWxlZCkKICAgICBSZWZQdHI8RmFrZVRpbGVkTGF5ZXJDaHJvbWl1bT4g
bGF5ZXIyID0gYWRvcHRSZWYobmV3IEZha2VUaWxlZExheWVyQ2hyb21pdW0odGV4dHVyZU1hbmFn
ZXIuZ2V0KCkpKTsKICAgICBPd25QdHI8RmFrZUNDVGlsZWRMYXllckltcGw+IGxheWVySW1wbDIo
YWRvcHRQdHIobmV3IEZha2VDQ1RpbGVkTGF5ZXJJbXBsKDApKSk7CiAKLSAgICBGYWtlQ0NUZXh0
dXJlVXBkYXRlciB1cGRhdGVyOworICAgIEZha2VDQ1RleHR1cmVVcGRhdGVyIHVwZGF0ZXIoMCk7
CiAKICAgICAvLyBGb3IgdGhpcyB0ZXN0IHdlIGhhdmUgdHdvIGxheWVycy4gbGF5ZXIxIGV4aGF1
c3RzIG1vc3QgdGV4dHVyZSBtZW1vcnksIGxlYXZpbmcgcm9vbSBmb3IgMiBtb3JlIHRpbGVzIGZy
b20KICAgICAvLyBsYXllcjIsIGJ1dCBub3QgYWxsIHRocmVlIHRpbGVzLiBGaXJzdCB3ZSBwYWlu
dCBsYXllcjEsIGFuZCBvbmUgdGlsZSBmcm9tIGxheWVyMi4gVGhlbiB3aGVuIHdlIGlkbGUgcGFp
bnQKQEAgLTI3Nyw5ICsyNzcsOSBAQCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3QsIHB1c2hU
aWxlc0FmdGVySWRsZVBhaW50RmFpbGVkKQogICAgIEVYUEVDVF9UUlVFKGxheWVyMi0+bmVlZHNJ
ZGxlUGFpbnQobGF5ZXIyUmVjdCkpOwogCiAgICAgLy8gQ29tbWl0IHRoZSBmcmFtZSBvdmVyIHRv
IGltcGwuCi0gICAgbGF5ZXIxLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKDAsIHVwZGF0ZXIp
OwotICAgIGxheWVyMi0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcygwLCB1cGRhdGVyKTsKLSAg
ICB1cGRhdGVyLnVwZGF0ZSgwLCA1MDAwKTsKKyAgICBsYXllcjEtPnVwZGF0ZUNvbXBvc2l0b3JS
ZXNvdXJjZXModXBkYXRlcik7CisgICAgbGF5ZXIyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2Vz
KHVwZGF0ZXIpOworICAgIHVwZGF0ZXIudXBkYXRlQWxsKCk7CiAgICAgbGF5ZXIxLT5wdXNoUHJv
cGVydGllc1RvKGxheWVySW1wbDEuZ2V0KCkpOwogICAgIGxheWVyMi0+cHVzaFByb3BlcnRpZXNU
byhsYXllckltcGwyLmdldCgpKTsKIApAQCAtMjg4LDkgKzI4OCw5IEBAIFRFU1QoVGlsZWRMYXll
ckNocm9taXVtVGVzdCwgcHVzaFRpbGVzQWZ0ZXJJZGxlUGFpbnRGYWlsZWQpCiAgICAgbGF5ZXIy
LT5wcmVwYXJlVG9VcGRhdGVJZGxlKGxheWVyMlJlY3QsIDApOwogCiAgICAgLy8gT2ggd2VsbCwg
Y29tbWl0IHRoZSBmcmFtZSBhbmQgcHVzaC4KLSAgICBsYXllcjEtPnVwZGF0ZUNvbXBvc2l0b3JS
ZXNvdXJjZXMoMCwgdXBkYXRlcik7Ci0gICAgbGF5ZXIyLT51cGRhdGVDb21wb3NpdG9yUmVzb3Vy
Y2VzKDAsIHVwZGF0ZXIpOwotICAgIHVwZGF0ZXIudXBkYXRlKDAsIDUwMDApOworICAgIGxheWVy
MS0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyh1cGRhdGVyKTsKKyAgICBsYXllcjItPnVwZGF0
ZUNvbXBvc2l0b3JSZXNvdXJjZXModXBkYXRlcik7CisgICAgdXBkYXRlci51cGRhdGVBbGwoKTsK
ICAgICBsYXllcjEtPnB1c2hQcm9wZXJ0aWVzVG8obGF5ZXJJbXBsMS5nZXQoKSk7CiAgICAgbGF5
ZXIyLT5wdXNoUHJvcGVydGllc1RvKGxheWVySW1wbDIuZ2V0KCkpOwogCkBAIC0zMDksOSArMzA5
LDkgQEAgVEVTVChUaWxlZExheWVyQ2hyb21pdW1UZXN0LCBwdXNoVGlsZXNBZnRlcklkbGVQYWlu
dEZhaWxlZCkKICAgICBsYXllcjItPnByZXBhcmVUb1VwZGF0ZShsYXllcjJSZWN0LCAwKTsKICAg
ICBsYXllcjEtPnByZXBhcmVUb1VwZGF0ZShJbnRSZWN0KCksIDApOwogCi0gICAgbGF5ZXIxLT51
cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKDAsIHVwZGF0ZXIpOwotICAgIGxheWVyMi0+dXBkYXRl
Q29tcG9zaXRvclJlc291cmNlcygwLCB1cGRhdGVyKTsKLSAgICB1cGRhdGVyLnVwZGF0ZSgwLCA1
MDAwKTsKKyAgICBsYXllcjEtPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXModXBkYXRlcik7Cisg
ICAgbGF5ZXIyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKHVwZGF0ZXIpOworICAgIHVwZGF0
ZXIudXBkYXRlQWxsKCk7CiAgICAgbGF5ZXIxLT5wdXNoUHJvcGVydGllc1RvKGxheWVySW1wbDEu
Z2V0KCkpOwogICAgIGxheWVyMi0+cHVzaFByb3BlcnRpZXNUbyhsYXllckltcGwyLmdldCgpKTsK
IApAQCAtMzMxLDcgKzMzMSw3IEBAIFRFU1QoVGlsZWRMYXllckNocm9taXVtVGVzdCwgcHVzaElk
bGVQYWludGVkT2NjbHVkZWRUaWxlcykKICAgICBPd25QdHI8RmFrZUNDVGlsZWRMYXllckltcGw+
IGxheWVySW1wbChhZG9wdFB0cihuZXcgRmFrZUNDVGlsZWRMYXllckltcGwoMCkpKTsKICAgICBU
ZXN0Q0NPY2NsdXNpb25UcmFja2VyIG9jY2x1ZGVkOwogCi0gICAgRmFrZUNDVGV4dHVyZVVwZGF0
ZXIgdXBkYXRlcjsKKyAgICBGYWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyKDApOwogCiAgICAg
Ly8gVGhlIHRpbGUgc2l6ZSBpcyAxMDB4MTAwLCBzbyB0aGlzIGludmFsaWRhdGVzIG9uZSBvY2Ns
dWRlZCB0aWxlLCBjdWxscyBpdCBkdXJpbmcgcGFpbnQsIGJ1dCBwcmVwYWludHMgaXQuCiAgICAg
b2NjbHVkZWQuc2V0T2NjbHVzaW9uKEludFJlY3QoMCwgMCwgMTAwLCAxMDApKTsKQEAgLTM0Miw3
ICszNDIsNyBAQCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3QsIHB1c2hJZGxlUGFpbnRlZE9j
Y2x1ZGVkVGlsZXMpCiAgICAgbGF5ZXItPmludmFsaWRhdGVSZWN0KEludFJlY3QoMCwgMCwgMTAw
LCAxMDApKTsKICAgICBsYXllci0+cHJlcGFyZVRvVXBkYXRlKEludFJlY3QoMCwgMCwgMTAwLCAx
MDApLCAmb2NjbHVkZWQpOwogICAgIGxheWVyLT5wcmVwYXJlVG9VcGRhdGVJZGxlKEludFJlY3Qo
MCwgMCwgMTAwLCAxMDApLCAmb2NjbHVkZWQpOwotICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9y
UmVzb3VyY2VzKDAsIHVwZGF0ZXIpOworICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3Vy
Y2VzKHVwZGF0ZXIpOwogICAgIGxheWVyLT5wdXNoUHJvcGVydGllc1RvKGxheWVySW1wbC5nZXQo
KSk7CiAKICAgICAvLyBXZSBzaG91bGQgaGF2ZSB0aGUgcHJlcGFpbnRlZCB0aWxlIG9uIHRoZSBp
bXBsIHNpZGUuCkBAIC0zNTYsNyArMzU2LDcgQEAgVEVTVChUaWxlZExheWVyQ2hyb21pdW1UZXN0
LCBwdXNoVGlsZXNNYXJrZWREaXJ0eUR1cmluZ1BhaW50KQogICAgIERlYnVnU2NvcGVkU2V0SW1w
bFRocmVhZCBpbXBsVGhyZWFkOwogICAgIE93blB0cjxGYWtlQ0NUaWxlZExheWVySW1wbD4gbGF5
ZXJJbXBsKGFkb3B0UHRyKG5ldyBGYWtlQ0NUaWxlZExheWVySW1wbCgwKSkpOwogCi0gICAgRmFr
ZUNDVGV4dHVyZVVwZGF0ZXIgdXBkYXRlcjsKKyAgICBGYWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRh
dGVyKDApOwogCiAgICAgLy8gVGhlIHRpbGUgc2l6ZSBpcyAxMDB4MTAwLCBzbyB0aGlzIGludmFs
aWRhdGVzIGFuZCB0aGVuIHBhaW50cyB0d28gdGlsZXMuCiAgICAgLy8gSG93ZXZlciwgZHVyaW5n
IHRoZSBwYWludCwgd2UgaW52YWxpZGF0ZSBvbmUgb2YgdGhlIHRpbGVzLiBUaGlzIHNob3VsZApA
QCAtMzY1LDcgKzM2NSw3IEBAIFRFU1QoVGlsZWRMYXllckNocm9taXVtVGVzdCwgcHVzaFRpbGVz
TWFya2VkRGlydHlEdXJpbmdQYWludCkKICAgICBsYXllci0+aW52YWxpZGF0ZVJlY3QoSW50UmVj
dCgwLCAwLCAxMDAsIDIwMCkpOwogICAgIGxheWVyLT5mYWtlTGF5ZXJUZXh0dXJlVXBkYXRlcigp
LT5zZXRSZWN0VG9JbnZhbGlkYXRlKEludFJlY3QoMCwgNTAsIDEwMCwgNTApLCBsYXllci5nZXQo
KSk7CiAgICAgbGF5ZXItPnByZXBhcmVUb1VwZGF0ZShJbnRSZWN0KDAsIDAsIDEwMCwgMjAwKSwg
MCk7Ci0gICAgbGF5ZXItPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoMCwgdXBkYXRlcik7Cisg
ICAgbGF5ZXItPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXModXBkYXRlcik7CiAgICAgbGF5ZXIt
PnB1c2hQcm9wZXJ0aWVzVG8obGF5ZXJJbXBsLmdldCgpKTsKIAogICAgIC8vIFdlIHNob3VsZCBo
YXZlIGJvdGggdGlsZXMgb24gdGhlIGltcGwgc2lkZS4KQEAgLTM4Miw3ICszODIsNyBAQCBURVNU
KFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3QsIHB1c2hUaWxlc0xheWVyTWFya2VkRGlydHlEdXJpbmdQ
YWludE9uTmV4dExheWVyKQogICAgIE93blB0cjxGYWtlQ0NUaWxlZExheWVySW1wbD4gbGF5ZXIx
SW1wbChhZG9wdFB0cihuZXcgRmFrZUNDVGlsZWRMYXllckltcGwoMCkpKTsKICAgICBPd25QdHI8
RmFrZUNDVGlsZWRMYXllckltcGw+IGxheWVyMkltcGwoYWRvcHRQdHIobmV3IEZha2VDQ1RpbGVk
TGF5ZXJJbXBsKDApKSk7CiAKLSAgICBGYWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyOworICAg
IEZha2VDQ1RleHR1cmVVcGRhdGVyIHVwZGF0ZXIoMCk7CiAKICAgICBsYXllcjEtPnNldEJvdW5k
cyhJbnRTaXplKDEwMCwgMjAwKSk7CiAgICAgbGF5ZXIxLT5pbnZhbGlkYXRlUmVjdChJbnRSZWN0
KDAsIDAsIDEwMCwgMjAwKSk7CkBAIC0zOTUsOCArMzk1LDggQEAgVEVTVChUaWxlZExheWVyQ2hy
b21pdW1UZXN0LCBwdXNoVGlsZXNMYXllck1hcmtlZERpcnR5RHVyaW5nUGFpbnRPbk5leHRMYXll
cikKICAgICBsYXllcjItPmZha2VMYXllclRleHR1cmVVcGRhdGVyKCktPnNldFJlY3RUb0ludmFs
aWRhdGUoSW50UmVjdCgwLCA1MCwgMTAwLCA1MCksIGxheWVyMS5nZXQoKSk7CiAgICAgbGF5ZXIy
LT5wcmVwYXJlVG9VcGRhdGUoSW50UmVjdCgwLCAwLCAxMDAsIDIwMCksIDApOwogCi0gICAgbGF5
ZXIxLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKDAsIHVwZGF0ZXIpOwotICAgIGxheWVyMi0+
dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcygwLCB1cGRhdGVyKTsKKyAgICBsYXllcjEtPnVwZGF0
ZUNvbXBvc2l0b3JSZXNvdXJjZXModXBkYXRlcik7CisgICAgbGF5ZXIyLT51cGRhdGVDb21wb3Np
dG9yUmVzb3VyY2VzKHVwZGF0ZXIpOwogCiAgICAgbGF5ZXIxLT5wdXNoUHJvcGVydGllc1RvKGxh
eWVyMUltcGwuZ2V0KCkpOwogICAgIGxheWVyMi0+cHVzaFByb3BlcnRpZXNUbyhsYXllcjJJbXBs
LmdldCgpKTsKQEAgLTQxNyw3ICs0MTcsNyBAQCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3Qs
IHB1c2hUaWxlc0xheWVyTWFya2VkRGlydHlEdXJpbmdQYWludE9uUHJldmlvdXNMYXllcgogICAg
IE93blB0cjxGYWtlQ0NUaWxlZExheWVySW1wbD4gbGF5ZXIxSW1wbChhZG9wdFB0cihuZXcgRmFr
ZUNDVGlsZWRMYXllckltcGwoMCkpKTsKICAgICBPd25QdHI8RmFrZUNDVGlsZWRMYXllckltcGw+
IGxheWVyMkltcGwoYWRvcHRQdHIobmV3IEZha2VDQ1RpbGVkTGF5ZXJJbXBsKDApKSk7CiAKLSAg
ICBGYWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyOworICAgIEZha2VDQ1RleHR1cmVVcGRhdGVy
IHVwZGF0ZXIoMCk7CiAKICAgICBsYXllcjEtPnNldEJvdW5kcyhJbnRTaXplKDEwMCwgMjAwKSk7
CiAgICAgbGF5ZXIxLT5pbnZhbGlkYXRlUmVjdChJbnRSZWN0KDAsIDAsIDEwMCwgMjAwKSk7CkBA
IC00MzAsOCArNDMwLDggQEAgVEVTVChUaWxlZExheWVyQ2hyb21pdW1UZXN0LCBwdXNoVGlsZXNM
YXllck1hcmtlZERpcnR5RHVyaW5nUGFpbnRPblByZXZpb3VzTGF5ZXIKIAogICAgIGxheWVyMi0+
cHJlcGFyZVRvVXBkYXRlKEludFJlY3QoMCwgMCwgMTAwLCAyMDApLCAwKTsKIAotICAgIGxheWVy
MS0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcygwLCB1cGRhdGVyKTsKLSAgICBsYXllcjItPnVw
ZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoMCwgdXBkYXRlcik7CisgICAgbGF5ZXIxLT51cGRhdGVD
b21wb3NpdG9yUmVzb3VyY2VzKHVwZGF0ZXIpOworICAgIGxheWVyMi0+dXBkYXRlQ29tcG9zaXRv
clJlc291cmNlcyh1cGRhdGVyKTsKIAogICAgIGxheWVyMS0+cHVzaFByb3BlcnRpZXNUbyhsYXll
cjFJbXBsLmdldCgpKTsKICAgICBsYXllcjItPnB1c2hQcm9wZXJ0aWVzVG8obGF5ZXIySW1wbC5n
ZXQoKSk7CkBAIC00NTgsNyArNDU4LDcgQEAgVEVTVChUaWxlZExheWVyQ2hyb21pdW1UZXN0LCBp
ZGxlUGFpbnRPdXRPZk1lbW9yeSkKICAgICBEZWJ1Z1Njb3BlZFNldEltcGxUaHJlYWQgaW1wbFRo
cmVhZDsKICAgICBPd25QdHI8RmFrZUNDVGlsZWRMYXllckltcGw+IGxheWVySW1wbChhZG9wdFB0
cihuZXcgRmFrZUNDVGlsZWRMYXllckltcGwoMCkpKTsKIAotICAgIEZha2VDQ1RleHR1cmVVcGRh
dGVyIHVwZGF0ZXI7CisgICAgRmFrZUNDVGV4dHVyZVVwZGF0ZXIgdXBkYXRlcigwKTsKIAogICAg
IC8vIFRoaXMgaW52YWxpZGF0ZXMgOSB0aWxlcyBhbmQgdGhlbiBwYWludHMgb25lIHZpc2libGUg
dGlsZS4KICAgICBsYXllci0+c2V0Qm91bmRzKGNvbnRlbnRCb3VuZHMpOwpAQCAtNDY5LDcgKzQ2
OSw3IEBAIFRFU1QoVGlsZWRMYXllckNocm9taXVtVGVzdCwgaWRsZVBhaW50T3V0T2ZNZW1vcnkp
CiAgICAgLy8gV2Ugc2hvdWxkIG5lZWQgaWRsZS1wYWludGluZyBmb3IgM3gzIHRpbGVzIHN1cm91
bmRpbmcgdmlzaWJsZSB0aWxlLgogICAgIEVYUEVDVF9UUlVFKGxheWVyLT5uZWVkc0lkbGVQYWlu
dCh2aXNpYmxlUmVjdCkpOwogCi0gICAgbGF5ZXItPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMo
MCwgdXBkYXRlcik7CisgICAgbGF5ZXItPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXModXBkYXRl
cik7CiAgICAgbGF5ZXItPnB1c2hQcm9wZXJ0aWVzVG8obGF5ZXJJbXBsLmdldCgpKTsKIAogICAg
IC8vIFdlIHNob3VsZCBoYXZlIG9uZSB0aWxlIG9uIHRoZSBpbXBsIHNpZGUuCkBAIC00ODIsNyAr
NDgyLDcgQEAgVEVTVChUaWxlZExheWVyQ2hyb21pdW1UZXN0LCBpZGxlUGFpbnRPdXRPZk1lbW9y
eSkKICAgICAvLyBXZSBzaG91bGRuJ3Qgc2lnbmFsIHdlIG5lZWQgYW5vdGhlciBpZGxlIHBhaW50
IGFmdGVyIHdlIHJ1biBvdXQgb2YgbWVtb3J5LgogICAgIEVYUEVDVF9GQUxTRShsYXllci0+bmVl
ZHNJZGxlUGFpbnQodmlzaWJsZVJlY3QpKTsKIAotICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9y
UmVzb3VyY2VzKDAsIHVwZGF0ZXIpOworICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3Vy
Y2VzKHVwZGF0ZXIpOwogICAgIGxheWVyLT5wdXNoUHJvcGVydGllc1RvKGxheWVySW1wbC5nZXQo
KSk7CiB9CiAKQEAgLTQ5Myw3ICs0OTMsNyBAQCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3Qs
IGlkbGVQYWludFplcm9TaXplZExheWVyKQogICAgIERlYnVnU2NvcGVkU2V0SW1wbFRocmVhZCBp
bXBsVGhyZWFkOwogICAgIE93blB0cjxGYWtlQ0NUaWxlZExheWVySW1wbD4gbGF5ZXJJbXBsKGFk
b3B0UHRyKG5ldyBGYWtlQ0NUaWxlZExheWVySW1wbCgwKSkpOwogCi0gICAgRmFrZUNDVGV4dHVy
ZVVwZGF0ZXIgdXBkYXRlcjsKKyAgICBGYWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyKDApOwog
CiAgICAgLy8gVGhlIGxheWVyJ3MgYm91bmRzIGFyZSBlbXB0eS4KICAgICBJbnRSZWN0IGNvbnRl
bnRSZWN0OwpAQCAtNTA5LDcgKzUwOSw3IEBAIFRFU1QoVGlsZWRMYXllckNocm9taXVtVGVzdCwg
aWRsZVBhaW50WmVyb1NpemVkTGF5ZXIpCiAgICAgLy8gRW1wdHkgbGF5ZXJzIGRvbid0IG5lZWQg
cHJlcGFpbnQuCiAgICAgRVhQRUNUX0ZBTFNFKGxheWVyLT5uZWVkc0lkbGVQYWludChjb250ZW50
UmVjdCkpOwogCi0gICAgbGF5ZXItPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoMCwgdXBkYXRl
cik7CisgICAgbGF5ZXItPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXModXBkYXRlcik7CiAgICAg
bGF5ZXItPnB1c2hQcm9wZXJ0aWVzVG8obGF5ZXJJbXBsLmdldCgpKTsKIAogICAgIC8vIEVtcHR5
IGxheWVycyBkb24ndCBoYXZlIHRpbGVzLgpAQCAtNTIxLDcgKzUyMSw3IEBAIFRFU1QoVGlsZWRM
YXllckNocm9taXVtVGVzdCwgaWRsZVBhaW50WmVyb1NpemVkTGF5ZXIpCiAgICAgLy8gRW1wdHkg
bGF5ZXJzIGRvbid0IGhhdmUgdGlsZXMuCiAgICAgRVhQRUNUX0VRKDB1LCBsYXllci0+bnVtUGFp
bnRlZFRpbGVzKCkpOwogCi0gICAgbGF5ZXItPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoMCwg
dXBkYXRlcik7CisgICAgbGF5ZXItPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXModXBkYXRlcik7
CiAgICAgbGF5ZXItPnB1c2hQcm9wZXJ0aWVzVG8obGF5ZXJJbXBsLmdldCgpKTsKIAogICAgIC8v
IEVtcHR5IGxheWVycyBkb24ndCBoYXZlIHRpbGVzLgpAQCAtNTM1LDcgKzUzNSw3IEBAIFRFU1Qo
VGlsZWRMYXllckNocm9taXVtVGVzdCwgaWRsZVBhaW50WmVyb1NpemVkQW5pbWF0aW5nTGF5ZXIp
CiAgICAgRGVidWdTY29wZWRTZXRJbXBsVGhyZWFkIGltcGxUaHJlYWQ7CiAgICAgT3duUHRyPEZh
a2VDQ1RpbGVkTGF5ZXJJbXBsPiBsYXllckltcGwoYWRvcHRQdHIobmV3IEZha2VDQ1RpbGVkTGF5
ZXJJbXBsKDApKSk7CiAKLSAgICBGYWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyOworICAgIEZh
a2VDQ1RleHR1cmVVcGRhdGVyIHVwZGF0ZXIoMCk7CiAKICAgICAvLyBQcmV0ZW5kIHRoZSBsYXll
ciBpcyBhbmltYXRpbmcuCiAgICAgbGF5ZXItPnNldERyYXdUcmFuc2Zvcm1Jc0FuaW1hdGluZyh0
cnVlKTsKQEAgLTU1NCw3ICs1NTQsNyBAQCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3QsIGlk
bGVQYWludFplcm9TaXplZEFuaW1hdGluZ0xheWVyKQogICAgIC8vIEVtcHR5IGxheWVycyBkb24n
dCBuZWVkIHByZXBhaW50LgogICAgIEVYUEVDVF9GQUxTRShsYXllci0+bmVlZHNJZGxlUGFpbnQo
Y29udGVudFJlY3QpKTsKIAotICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKDAs
IHVwZGF0ZXIpOworICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKHVwZGF0ZXIp
OwogICAgIGxheWVyLT5wdXNoUHJvcGVydGllc1RvKGxheWVySW1wbC5nZXQoKSk7CiAKICAgICAv
LyBFbXB0eSBsYXllcnMgZG9uJ3QgaGF2ZSB0aWxlcy4KQEAgLTU2Niw3ICs1NjYsNyBAQCBURVNU
KFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3QsIGlkbGVQYWludFplcm9TaXplZEFuaW1hdGluZ0xheWVy
KQogICAgIC8vIEVtcHR5IGxheWVycyBkb24ndCBoYXZlIHRpbGVzLgogICAgIEVYUEVDVF9FUSgw
dSwgbGF5ZXItPm51bVBhaW50ZWRUaWxlcygpKTsKIAotICAgIGxheWVyLT51cGRhdGVDb21wb3Np
dG9yUmVzb3VyY2VzKDAsIHVwZGF0ZXIpOworICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVz
b3VyY2VzKHVwZGF0ZXIpOwogICAgIGxheWVyLT5wdXNoUHJvcGVydGllc1RvKGxheWVySW1wbC5n
ZXQoKSk7CiAKICAgICAvLyBFbXB0eSBsYXllcnMgZG9uJ3QgaGF2ZSB0aWxlcy4KQEAgLTU4Myw3
ICs1ODMsNyBAQCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3QsIGlkbGVQYWludE5vblZpc2li
bGVMYXllcnMpCiAgICAgRGVidWdTY29wZWRTZXRJbXBsVGhyZWFkIGltcGxUaHJlYWQ7CiAgICAg
T3duUHRyPEZha2VDQ1RpbGVkTGF5ZXJJbXBsPiBsYXllckltcGwoYWRvcHRQdHIobmV3IEZha2VD
Q1RpbGVkTGF5ZXJJbXBsKDApKSk7CiAKLSAgICBGYWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVy
OworICAgIEZha2VDQ1RleHR1cmVVcGRhdGVyIHVwZGF0ZXIoMCk7CiAKICAgICAvLyBJbnZhbGlk
YXRlIHRoZSBsYXllciBidXQgbWFrZSBub25lIG9mIGl0IHZpc2libGUsIHNvIG5vdGhpbmcgcGFp
bnRzLgogICAgIEludFJlY3QgdmlzaWJsZVJlY3Q7CkBAIC01OTYsNyArNTk2LDcgQEAgVEVTVChU
aWxlZExheWVyQ2hyb21pdW1UZXN0LCBpZGxlUGFpbnROb25WaXNpYmxlTGF5ZXJzKQogICAgIC8v
IE5vbi12aXNpYmxlIGxheWVycyBkb24ndCBuZWVkIGlkbGUgcGFpbnQuCiAgICAgRVhQRUNUX0ZB
TFNFKGxheWVyLT5uZWVkc0lkbGVQYWludCh2aXNpYmxlUmVjdCkpOwogCi0gICAgbGF5ZXItPnVw
ZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoMCwgdXBkYXRlcik7CisgICAgbGF5ZXItPnVwZGF0ZUNv
bXBvc2l0b3JSZXNvdXJjZXModXBkYXRlcik7CiAgICAgbGF5ZXItPnB1c2hQcm9wZXJ0aWVzVG8o
bGF5ZXJJbXBsLmdldCgpKTsKIAogICAgIC8vIFdlIHNob3VsZCBub3QgaGF2ZSBhbnkgdGlsZXMg
cHVzaGVkIHNpbmNlIHRoZSBsYXllciBpcyBub3QgdmlzaWJsZS4KQEAgLTYwNSw3ICs2MDUsNyBA
QCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3QsIGlkbGVQYWludE5vblZpc2libGVMYXllcnMp
CiAgICAgLy8gTm9uLXZpc2libGUgbGF5ZXJzIGRvbid0IGlkbGUgcGFpbnQuCiAgICAgbGF5ZXIt
PnByZXBhcmVUb1VwZGF0ZUlkbGUodmlzaWJsZVJlY3QsIDApOwogCi0gICAgbGF5ZXItPnVwZGF0
ZUNvbXBvc2l0b3JSZXNvdXJjZXMoMCwgdXBkYXRlcik7CisgICAgbGF5ZXItPnVwZGF0ZUNvbXBv
c2l0b3JSZXNvdXJjZXModXBkYXRlcik7CiAgICAgbGF5ZXItPnB1c2hQcm9wZXJ0aWVzVG8obGF5
ZXJJbXBsLmdldCgpKTsKIAogICAgIC8vIFdlIHNob3VsZCBub3QgaGF2ZSBhbnkgdGlsZXMgcHVz
aGVkIHNpbmNlIHRoZSBsYXllciBpcyBub3QgdmlzaWJsZS4KQEAgLTYxNyw3ICs2MTcsNyBAQCBz
dGF0aWMgdm9pZCBpZGxlUGFpbnRSZXBlYXQoaW50IHJlcGVhdFRpbWVzLCBGYWtlVGlsZWRMYXll
ckNocm9taXVtKiBsYXllciwgRmFrZQogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0VGlt
ZXM7ICsraSkgewogICAgICAgICBsYXllci0+cHJlcGFyZVRvVXBkYXRlKHZpc2libGVSZWN0LCAw
KTsKICAgICAgICAgbGF5ZXItPnByZXBhcmVUb1VwZGF0ZUlkbGUodmlzaWJsZVJlY3QsIDApOwot
ICAgICAgICBsYXllci0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcygwLCB1cGRhdGVyKTsKKyAg
ICAgICAgbGF5ZXItPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXModXBkYXRlcik7CiAgICAgICAg
IGxheWVyLT5wdXNoUHJvcGVydGllc1RvKGxheWVySW1wbCk7CiAgICAgfQogfQpAQCAtNjM3LDcg
KzYzNyw3IEBAIFRFU1QoVGlsZWRMYXllckNocm9taXVtVGVzdCwgaWRsZVBhaW50Tm9uVmlzaWJs
ZUFuaW1hdGluZ0xheWVycykKICAgICBPd25QdHI8VGV4dHVyZU1hbmFnZXI+IHRleHR1cmVNYW5h
Z2VyID0gVGV4dHVyZU1hbmFnZXI6OmNyZWF0ZSg4MDAwKjgwMDAqOCwgODAwMCo4MDAwKjQsIDEw
MjQpOwogICAgIERlYnVnU2NvcGVkU2V0SW1wbFRocmVhZCBpbXBsVGhyZWFkOwogCi0gICAgRmFr
ZUNDVGV4dHVyZVVwZGF0ZXIgdXBkYXRlcjsKKyAgICBGYWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRh
dGVyKDApOwogCiAgICAgaW50IHRpbGVXaWR0aCA9IEZha2VUaWxlZExheWVyQ2hyb21pdW06OnRp
bGVTaXplKCkud2lkdGgoKTsKICAgICBpbnQgdGlsZUhlaWdodCA9IEZha2VUaWxlZExheWVyQ2hy
b21pdW06OnRpbGVTaXplKCkuaGVpZ2h0KCk7CkBAIC02NjYsNyArNjY2LDcgQEAgVEVTVChUaWxl
ZExheWVyQ2hyb21pdW1UZXN0LCBpZGxlUGFpbnROb25WaXNpYmxlQW5pbWF0aW5nTGF5ZXJzKQog
CiAgICAgICAgICAgICAvLyBUaGlzIHBhaW50cyB0aGUgbGF5ZXIgYnV0IHRoZXJlJ3Mgbm90aGlu
ZyB2aXNpYmxlIHNvIGl0J3MgYSBuby1vcC4KICAgICAgICAgICAgIGxheWVyLT5wcmVwYXJlVG9V
cGRhdGUodmlzaWJsZVJlY3QsIDApOwotICAgICAgICAgICAgbGF5ZXItPnVwZGF0ZUNvbXBvc2l0
b3JSZXNvdXJjZXMoMCwgdXBkYXRlcik7CisgICAgICAgICAgICBsYXllci0+dXBkYXRlQ29tcG9z
aXRvclJlc291cmNlcyh1cGRhdGVyKTsKICAgICAgICAgICAgIGxheWVyLT5wdXNoUHJvcGVydGll
c1RvKGxheWVySW1wbC5nZXQoKSk7CiAKICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgaGF2
ZSBhbnkgdGlsZXMgcHVzaGVkIHlldCBzaW5jZSB0aGUgbGF5ZXIgaXMgbm90IHZpc2libGUgYW5k
IHdlJ3ZlIG5vdCBwcmVwYWludGVkLgpAQCAtNjk0LDEzICs2OTQsMTMgQEAgVEVTVChUaWxlZExh
eWVyQ2hyb21pdW1UZXN0LCBpbnZhbGlkYXRlRnJvbVByZXBhcmUpCiAgICAgRGVidWdTY29wZWRT
ZXRJbXBsVGhyZWFkIGltcGxUaHJlYWQ7CiAgICAgT3duUHRyPEZha2VDQ1RpbGVkTGF5ZXJJbXBs
PiBsYXllckltcGwoYWRvcHRQdHIobmV3IEZha2VDQ1RpbGVkTGF5ZXJJbXBsKDApKSk7CiAKLSAg
ICBGYWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyOworICAgIEZha2VDQ1RleHR1cmVVcGRhdGVy
IHVwZGF0ZXIoMCk7CiAKICAgICAvLyBUaGUgdGlsZSBzaXplIGlzIDEwMHgxMDAsIHNvIHRoaXMg
aW52YWxpZGF0ZXMgYW5kIHRoZW4gcGFpbnRzIHR3byB0aWxlcy4KICAgICBsYXllci0+c2V0Qm91
bmRzKEludFNpemUoMTAwLCAyMDApKTsKICAgICBsYXllci0+aW52YWxpZGF0ZVJlY3QoSW50UmVj
dCgwLCAwLCAxMDAsIDIwMCkpOwogICAgIGxheWVyLT5wcmVwYXJlVG9VcGRhdGUoSW50UmVjdCgw
LCAwLCAxMDAsIDIwMCksIDApOwotICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2Vz
KDAsIHVwZGF0ZXIpOworICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKHVwZGF0
ZXIpOwogICAgIGxheWVyLT5wdXNoUHJvcGVydGllc1RvKGxheWVySW1wbC5nZXQoKSk7CiAKICAg
ICAvLyBXZSBzaG91bGQgaGF2ZSBib3RoIHRpbGVzIG9uIHRoZSBpbXBsIHNpZGUuCkBAIC03MzUs
NyArNzM1LDcgQEAgVEVTVChUaWxlZExheWVyQ2hyb21pdW1UZXN0LCB2ZXJpZnlVcGRhdGVSZWN0
V2hlbkNvbnRlbnRCb3VuZHNBcmVTY2FsZWQpCiAgICAgT3duUHRyPFRleHR1cmVNYW5hZ2VyPiB0
ZXh0dXJlTWFuYWdlciA9IFRleHR1cmVNYW5hZ2VyOjpjcmVhdGUoNCoxMDI0KjEwMjQsIDIqMTAy
NCoxMDI0LCAxMDI0KTsKICAgICBSZWZQdHI8RmFrZVRpbGVkTGF5ZXJXaXRoU2NhbGVkQm91bmRz
PiBsYXllciA9IGFkb3B0UmVmKG5ldyBGYWtlVGlsZWRMYXllcldpdGhTY2FsZWRCb3VuZHModGV4
dHVyZU1hbmFnZXIuZ2V0KCkpKTsKIAotICAgIEZha2VDQ1RleHR1cmVVcGRhdGVyIHVwZGF0ZXI7
CisgICAgRmFrZUNDVGV4dHVyZVVwZGF0ZXIgdXBkYXRlcigwKTsKIAogICAgIEludFJlY3QgbGF5
ZXJCb3VuZHMoMCwgMCwgMzAwLCAyMDApOwogICAgIEludFJlY3QgY29udGVudEJvdW5kcygwLCAw
LCAyMDAsIDI1MCk7CkBAIC03NDgsMjAgKzc0OCwyMCBAQCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1
bVRlc3QsIHZlcmlmeVVwZGF0ZVJlY3RXaGVuQ29udGVudEJvdW5kc0FyZVNjYWxlZCkKICAgICAv
LyBIb3dldmVyLCBpdCBzaG91bGQgc3RpbGwgYmUgaW4gbGF5ZXIgc3BhY2UsIG5vdCBjb250ZW50
IHNwYWNlLgogICAgIGxheWVyLT5pbnZhbGlkYXRlUmVjdChjb250ZW50Qm91bmRzKTsKICAgICBs
YXllci0+cHJlcGFyZVRvVXBkYXRlKGNvbnRlbnRCb3VuZHMsIDApOwotICAgIGxheWVyLT51cGRh
dGVDb21wb3NpdG9yUmVzb3VyY2VzKDAsIHVwZGF0ZXIpOworICAgIGxheWVyLT51cGRhdGVDb21w
b3NpdG9yUmVzb3VyY2VzKHVwZGF0ZXIpOwogICAgIEVYUEVDVF9GTE9BVF9SRUNUX0VRKEZsb2F0
UmVjdCgwLCAwLCAzMDAsIDMwMCAqIDAuOCksIGxheWVyLT51cGRhdGVSZWN0KCkpOwogCiAgICAg
Ly8gQWZ0ZXIgdGhlIHRpbGVzIGFyZSB1cGRhdGVkIG9uY2UsIGFub3RoZXIgaW52YWxpZGF0ZSBv
bmx5IG5lZWRzIHRvIHVwZGF0ZSB0aGUgYm91bmRzIG9mIHRoZSBsYXllci4KICAgICBsYXllci0+
aW52YWxpZGF0ZVJlY3QoY29udGVudEJvdW5kcyk7CiAgICAgbGF5ZXItPnByZXBhcmVUb1VwZGF0
ZShjb250ZW50Qm91bmRzLCAwKTsKLSAgICBsYXllci0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNl
cygwLCB1cGRhdGVyKTsKKyAgICBsYXllci0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyh1cGRh
dGVyKTsKICAgICBFWFBFQ1RfRkxPQVRfUkVDVF9FUShGbG9hdFJlY3QobGF5ZXJCb3VuZHMpLCBs
YXllci0+dXBkYXRlUmVjdCgpKTsKIAogICAgIC8vIFBhcnRpYWwgcmUtcGFpbnQgc2hvdWxkIGFs
c28gYmUgcmVwcmVzZW50ZWQgYnkgdGhlIHVwZGF0ZVJlY3QgaW4gbGF5ZXIgc3BhY2UsIG5vdCBj
b250ZW50IHNwYWNlLgogICAgIEludFJlY3QgcGFydGlhbERhbWFnZSgzMCwgMTAwLCAxMCwgMTAp
OwogICAgIGxheWVyLT5pbnZhbGlkYXRlUmVjdChwYXJ0aWFsRGFtYWdlKTsKICAgICBsYXllci0+
cHJlcGFyZVRvVXBkYXRlKGNvbnRlbnRCb3VuZHMsIDApOwotICAgIGxheWVyLT51cGRhdGVDb21w
b3NpdG9yUmVzb3VyY2VzKDAsIHVwZGF0ZXIpOworICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9y
UmVzb3VyY2VzKHVwZGF0ZXIpOwogICAgIEVYUEVDVF9GTE9BVF9SRUNUX0VRKEZsb2F0UmVjdCg0
NSwgODAsIDE1LCA4KSwgbGF5ZXItPnVwZGF0ZVJlY3QoKSk7CiB9CiAKQEAgLTc3Miw3ICs3NzIs
NyBAQCBURVNUKFRpbGVkTGF5ZXJDaHJvbWl1bVRlc3QsIHZlcmlmeUludmFsaWRhdGlvbldoZW5D
b250ZW50c1NjYWxlQ2hhbmdlcykKICAgICBEZWJ1Z1Njb3BlZFNldEltcGxUaHJlYWQgaW1wbFRo
cmVhZDsKICAgICBPd25QdHI8RmFrZUNDVGlsZWRMYXllckltcGw+IGxheWVySW1wbChhZG9wdFB0
cihuZXcgRmFrZUNDVGlsZWRMYXllckltcGwoMCkpKTsKIAotICAgIEZha2VDQ1RleHR1cmVVcGRh
dGVyIHVwZGF0ZXI7CisgICAgRmFrZUNDVGV4dHVyZVVwZGF0ZXIgdXBkYXRlcigwKTsKIAogICAg
IC8vIENyZWF0ZSBhIGxheWVyIHdpdGggb25lIHRpbGUuCiAgICAgbGF5ZXItPnNldEJvdW5kcyhJ
bnRTaXplKDEwMCwgMTAwKSk7CkBAIC03ODMsNyArNzgzLDcgQEAgVEVTVChUaWxlZExheWVyQ2hy
b21pdW1UZXN0LCB2ZXJpZnlJbnZhbGlkYXRpb25XaGVuQ29udGVudHNTY2FsZUNoYW5nZXMpCiAK
ICAgICAvLyBQdXNoIHRoZSB0aWxlcyB0byB0aGUgaW1wbCBzaWRlIGFuZCBjaGVjayB0aGF0IHRo
ZXJlIGlzIGV4YWN0bHkgb25lLgogICAgIGxheWVyLT5wcmVwYXJlVG9VcGRhdGUoSW50UmVjdCgw
LCAwLCAxMDAsIDEwMCksIDApOwotICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2Vz
KDAsIHVwZGF0ZXIpOworICAgIGxheWVyLT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKHVwZGF0
ZXIpOwogICAgIGxheWVyLT5wdXNoUHJvcGVydGllc1RvKGxheWVySW1wbC5nZXQoKSk7CiAgICAg
RVhQRUNUX1RSVUUobGF5ZXJJbXBsLT5oYXNUaWxlQXQoMCwgMCkpOwogICAgIEVYUEVDVF9GQUxT
RShsYXllckltcGwtPmhhc1RpbGVBdCgwLCAxKSk7CkBAIC03OTcsNyArNzk3LDcgQEAgVEVTVChU
aWxlZExheWVyQ2hyb21pdW1UZXN0LCB2ZXJpZnlJbnZhbGlkYXRpb25XaGVuQ29udGVudHNTY2Fs
ZUNoYW5nZXMpCiAKICAgICAvLyBUaGUgaW1wbCBzaWRlIHNob3VsZCBnZXQgMngyIHRpbGVzIG5v
dy4KICAgICBsYXllci0+cHJlcGFyZVRvVXBkYXRlKEludFJlY3QoMCwgMCwgMjAwLCAyMDApLCAw
KTsKLSAgICBsYXllci0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcygwLCB1cGRhdGVyKTsKKyAg
ICBsYXllci0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyh1cGRhdGVyKTsKICAgICBsYXllci0+
cHVzaFByb3BlcnRpZXNUbyhsYXllckltcGwuZ2V0KCkpOwogICAgIEVYUEVDVF9UUlVFKGxheWVy
SW1wbC0+aGFzVGlsZUF0KDAsIDApKTsKICAgICBFWFBFQ1RfVFJVRShsYXllckltcGwtPmhhc1Rp
bGVBdCgwLCAxKSk7CkBAIC04MDgsNyArODA4LDcgQEAgVEVTVChUaWxlZExheWVyQ2hyb21pdW1U
ZXN0LCB2ZXJpZnlJbnZhbGlkYXRpb25XaGVuQ29udGVudHNTY2FsZUNoYW5nZXMpCiAgICAgLy8g
aW1wbCBzaWRlLgogICAgIGxheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKICAgICBsYXllci0+cHJl
cGFyZVRvVXBkYXRlKEludFJlY3QoMSwgMCwgMCwgMSksIDApOwotICAgIGxheWVyLT51cGRhdGVD
b21wb3NpdG9yUmVzb3VyY2VzKDAsIHVwZGF0ZXIpOworICAgIGxheWVyLT51cGRhdGVDb21wb3Np
dG9yUmVzb3VyY2VzKHVwZGF0ZXIpOwogICAgIGxheWVyLT5wdXNoUHJvcGVydGllc1RvKGxheWVy
SW1wbC5nZXQoKSk7CiAgICAgRVhQRUNUX0ZBTFNFKGxheWVySW1wbC0+aGFzVGlsZUF0KDAsIDAp
KTsKICAgICBFWFBFQ1RfRkFMU0UobGF5ZXJJbXBsLT5oYXNUaWxlQXQoMCwgMSkpOwpAQCAtODQy
LDEzICs4NDIsMTMgQEAgVEVTVChUaWxlZExheWVyQ2hyb21pdW1UZXN0LCBza2lwc0RyYXdHZXRz
UmVzZXQpCiAgICAgcm9vdExheWVyLT5pbnZhbGlkYXRlUmVjdChjb250ZW50UmVjdCk7CiAgICAg
Y2hpbGRMYXllci0+aW52YWxpZGF0ZVJlY3QoY29udGVudFJlY3QpOwogCi0gICAgRmFrZUNDVGV4
dHVyZVVwZGF0ZXIgdXBkYXRlcjsKKyAgICBGYWtlQ0NUZXh0dXJlVXBkYXRlciB1cGRhdGVyKGNj
TGF5ZXJUcmVlSG9zdC0+Y29udGV4dCgpKTsKIAogICAgIGNjTGF5ZXJUcmVlSG9zdC0+c2V0Um9v
dExheWVyKHJvb3RMYXllcik7CiAgICAgY2NMYXllclRyZWVIb3N0LT5zZXRWaWV3cG9ydFNpemUo
SW50U2l6ZSgzMDAsIDMwMCkpOwogICAgIHRleHR1cmVNYW5hZ2VyLT5zZXRNYXhNZW1vcnlMaW1p
dEJ5dGVzKG1lbW9yeUxpbWl0KTsKICAgICBjY0xheWVyVHJlZUhvc3QtPnVwZGF0ZUxheWVycygp
OwotICAgIGNjTGF5ZXJUcmVlSG9zdC0+dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhjY0xheWVy
VHJlZUhvc3QtPmNvbnRleHQoKSwgdXBkYXRlcik7CisgICAgY2NMYXllclRyZWVIb3N0LT51cGRh
dGVDb21wb3NpdG9yUmVzb3VyY2VzKHVwZGF0ZXIpOwogCiAgICAgLy8gV2UnbGwgc2tpcCB0aGUg
cm9vdCBsYXllci4KICAgICBFWFBFQ1RfVFJVRShyb290TGF5ZXItPnNraXBzRHJhdygpKTsKQEAg
LTkxMyw1MiArOTEzLDUzIEBAIFRFU1QoVGlsZWRMYXllckNocm9taXVtVGVzdCwgcGFydGlhbFVw
ZGF0ZXMpCiAgICAgbGF5ZXItPnNldFBvc2l0aW9uKEZsb2F0UG9pbnQoMTUwLCAxNTApKTsKICAg
ICBsYXllci0+aW52YWxpZGF0ZVJlY3QoY29udGVudFJlY3QpOwogCi0gICAgRmFrZUNDVGV4dHVy
ZVVwZGF0ZXIgdXBkYXRlcjsKKyAgICBPd25QdHI8RmFrZUNDVGV4dHVyZVVwZGF0ZXI+IHVwZGF0
ZXIgPSBhZG9wdFB0cihuZXcgRmFrZUNDVGV4dHVyZVVwZGF0ZXIoY2NMYXllclRyZWVIb3N0LT5j
b250ZXh0KCkpKTsKIAogICAgIGNjTGF5ZXJUcmVlSG9zdC0+c2V0Um9vdExheWVyKGxheWVyKTsK
ICAgICBjY0xheWVyVHJlZUhvc3QtPnNldFZpZXdwb3J0U2l6ZShJbnRTaXplKDMwMCwgMjAwKSk7
CiAKICAgICAvLyBGdWxsIHVwZGF0ZSBvZiBhbGwgNiB0aWxlcy4KICAgICBjY0xheWVyVHJlZUhv
c3QtPnVwZGF0ZUxheWVycygpOwotICAgIGNjTGF5ZXJUcmVlSG9zdC0+dXBkYXRlQ29tcG9zaXRv
clJlc291cmNlcyhjY0xheWVyVHJlZUhvc3QtPmNvbnRleHQoKSwgdXBkYXRlcik7Ci0gICAgdXBk
YXRlci51cGRhdGUoMCwgNCk7CisgICAgY2NMYXllclRyZWVIb3N0LT51cGRhdGVDb21wb3NpdG9y
UmVzb3VyY2VzKCp1cGRhdGVyLmdldCgpKTsKKyAgICB1cGRhdGVyLT51cGRhdGVBdE1vc3QoNCk7
CiAgICAgRVhQRUNUX0VRKDQsIGxheWVyLT5mYWtlTGF5ZXJUZXh0dXJlVXBkYXRlcigpLT51cGRh
dGVDb3VudCgpKTsKLSAgICBFWFBFQ1RfVFJVRSh1cGRhdGVyLmhhc01vcmVVcGRhdGVzKCkpOwor
ICAgIEVYUEVDVF9UUlVFKHVwZGF0ZXItPmhhc01vcmVVcGRhdGVzKCkpOwogICAgIGxheWVyLT5m
YWtlTGF5ZXJUZXh0dXJlVXBkYXRlcigpLT5jbGVhclVwZGF0ZUNvdW50KCk7Ci0gICAgdXBkYXRl
ci51cGRhdGUoMCwgNCk7CisgICAgdXBkYXRlci0+dXBkYXRlQXRNb3N0KDQpOwogICAgIEVYUEVD
VF9FUSgyLCBsYXllci0+ZmFrZUxheWVyVGV4dHVyZVVwZGF0ZXIoKS0+dXBkYXRlQ291bnQoKSk7
Ci0gICAgRVhQRUNUX0ZBTFNFKHVwZGF0ZXIuaGFzTW9yZVVwZGF0ZXMoKSk7CisgICAgRVhQRUNU
X0ZBTFNFKHVwZGF0ZXItPmhhc01vcmVVcGRhdGVzKCkpOwogICAgIGxheWVyLT5mYWtlTGF5ZXJU
ZXh0dXJlVXBkYXRlcigpLT5jbGVhclVwZGF0ZUNvdW50KCk7CiAgICAgY2NMYXllclRyZWVIb3N0
LT5jb21taXRDb21wbGV0ZSgpOwogCiAgICAgLy8gRnVsbCB1cGRhdGUgb2YgMyB0aWxlcyBhbmQg
cGFydGlhbCB1cGRhdGUgb2YgMyB0aWxlcy4KICAgICBsYXllci0+aW52YWxpZGF0ZVJlY3QoSW50
UmVjdCgwLCAwLCAzMDAsIDE1MCkpOwogICAgIGNjTGF5ZXJUcmVlSG9zdC0+dXBkYXRlTGF5ZXJz
KCk7Ci0gICAgY2NMYXllclRyZWVIb3N0LT51cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKGNjTGF5
ZXJUcmVlSG9zdC0+Y29udGV4dCgpLCB1cGRhdGVyKTsKLSAgICB1cGRhdGVyLnVwZGF0ZSgwLCA0
KTsKKyAgICBjY0xheWVyVHJlZUhvc3QtPnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoKnVwZGF0
ZXIuZ2V0KCkpOworICAgIHVwZGF0ZXItPnVwZGF0ZUF0TW9zdCg0KTsKICAgICBFWFBFQ1RfRVEo
MywgbGF5ZXItPmZha2VMYXllclRleHR1cmVVcGRhdGVyKCktPnVwZGF0ZUNvdW50KCkpOwotICAg
IEVYUEVDVF9UUlVFKHVwZGF0ZXIuaGFzTW9yZVVwZGF0ZXMoKSk7CisgICAgRVhQRUNUX1RSVUUo
dXBkYXRlci0+aGFzTW9yZVVwZGF0ZXMoKSk7CiAgICAgbGF5ZXItPmZha2VMYXllclRleHR1cmVV
cGRhdGVyKCktPmNsZWFyVXBkYXRlQ291bnQoKTsKLSAgICB1cGRhdGVyLnVwZGF0ZSgwLCA0KTsK
KyAgICB1cGRhdGVyLT51cGRhdGVBdE1vc3QoNCk7CiAgICAgRVhQRUNUX0VRKDMsIGxheWVyLT5m
YWtlTGF5ZXJUZXh0dXJlVXBkYXRlcigpLT51cGRhdGVDb3VudCgpKTsKLSAgICBFWFBFQ1RfRkFM
U0UodXBkYXRlci5oYXNNb3JlVXBkYXRlcygpKTsKKyAgICBFWFBFQ1RfRkFMU0UodXBkYXRlci0+
aGFzTW9yZVVwZGF0ZXMoKSk7CiAgICAgbGF5ZXItPmZha2VMYXllclRleHR1cmVVcGRhdGVyKCkt
PmNsZWFyVXBkYXRlQ291bnQoKTsKICAgICBjY0xheWVyVHJlZUhvc3QtPmNvbW1pdENvbXBsZXRl
KCk7CiAKICAgICAvLyBQYXJ0aWFsIHVwZGF0ZSBvZiA2IHRpbGVzLgogICAgIGxheWVyLT5pbnZh
bGlkYXRlUmVjdChJbnRSZWN0KDUwLCA1MCwgMjAwLCAxMDApKTsKICAgICBjY0xheWVyVHJlZUhv
c3QtPnVwZGF0ZUxheWVycygpOwotICAgIGNjTGF5ZXJUcmVlSG9zdC0+dXBkYXRlQ29tcG9zaXRv
clJlc291cmNlcyhjY0xheWVyVHJlZUhvc3QtPmNvbnRleHQoKSwgdXBkYXRlcik7Ci0gICAgdXBk
YXRlci51cGRhdGUoMCwgNCk7CisgICAgY2NMYXllclRyZWVIb3N0LT51cGRhdGVDb21wb3NpdG9y
UmVzb3VyY2VzKCp1cGRhdGVyLmdldCgpKTsKKyAgICB1cGRhdGVyLT51cGRhdGVBdE1vc3QoNCk7
CiAgICAgRVhQRUNUX0VRKDIsIGxheWVyLT5mYWtlTGF5ZXJUZXh0dXJlVXBkYXRlcigpLT51cGRh
dGVDb3VudCgpKTsKLSAgICBFWFBFQ1RfVFJVRSh1cGRhdGVyLmhhc01vcmVVcGRhdGVzKCkpOwor
ICAgIEVYUEVDVF9UUlVFKHVwZGF0ZXItPmhhc01vcmVVcGRhdGVzKCkpOwogICAgIGxheWVyLT5m
YWtlTGF5ZXJUZXh0dXJlVXBkYXRlcigpLT5jbGVhclVwZGF0ZUNvdW50KCk7Ci0gICAgdXBkYXRl
ci51cGRhdGUoMCwgNCk7CisgICAgdXBkYXRlci0+dXBkYXRlQXRNb3N0KDQpOwogICAgIEVYUEVD
VF9FUSg0LCBsYXllci0+ZmFrZUxheWVyVGV4dHVyZVVwZGF0ZXIoKS0+dXBkYXRlQ291bnQoKSk7
Ci0gICAgRVhQRUNUX0ZBTFNFKHVwZGF0ZXIuaGFzTW9yZVVwZGF0ZXMoKSk7CisgICAgRVhQRUNU
X0ZBTFNFKHVwZGF0ZXItPmhhc01vcmVVcGRhdGVzKCkpOwogICAgIGxheWVyLT5mYWtlTGF5ZXJU
ZXh0dXJlVXBkYXRlcigpLT5jbGVhclVwZGF0ZUNvdW50KCk7CiAgICAgY2NMYXllclRyZWVIb3N0
LT5jb21taXRDb21wbGV0ZSgpOwogCisgICAgdXBkYXRlci5jbGVhcigpOwogICAgIGNjTGF5ZXJU
cmVlSG9zdC0+c2V0Um9vdExheWVyKDApOwogICAgIGNjTGF5ZXJUcmVlSG9zdC5jbGVhcigpOwog
ICAgIFdlYktpdDo6V2ViQ29tcG9zaXRvcjo6c2h1dGRvd24oKTsK
</data>
<flag name="review"
          id="140723"
          type_id="1"
          status="+"
          setter="jamesr"
    />
          </attachment>
      

    </bug>

</bugzilla>