<?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>43590</bug_id>
          
          <creation_ts>2010-08-05 16:49:32 -0700</creation_ts>
          <short_desc>Implementing video frame sharing between WebKit and Chromium</short_desc>
          <delta_ts>2010-09-21 12:08:45 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>INVALID</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Victoria Kirst">vrk</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>brettw</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
    
    <cc>hclam</cc>
    
    <cc>jamesr</cc>
    
    <cc>levin</cc>
    
    <cc>scherkus</cc>
    
    <cc>vangelis</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>260945</commentid>
    <comment_count>0</comment_count>
    <who name="Victoria Kirst">vrk</who>
    <bug_when>2010-08-05 16:49:32 -0700</bug_when>
    <thetext>Implementing video frame sharing between WebKit and Chromium</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260948</commentid>
    <comment_count>1</comment_count>
      <attachid>63661</attachid>
    <who name="Victoria Kirst">vrk</who>
    <bug_when>2010-08-05 16:53:51 -0700</bug_when>
    <thetext>Created attachment 63661
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260960</commentid>
    <comment_count>2</comment_count>
    <who name="Victoria Kirst">vrk</who>
    <bug_when>2010-08-05 17:01:42 -0700</bug_when>
    <thetext>This patch is not intended be committed as is; it is composed of a chromium side (http://codereview.chromium.org/3058055) in addition to the WebKit side so I will need to break it up several smaller pieces in order to keep things compiling on both sides.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260963</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-08-05 17:04:33 -0700</bug_when>
    <thetext>Attachment 63661 did not build on chromium:
Build output: http://queues.webkit.org/results/3621550</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>261023</commentid>
    <comment_count>4</comment_count>
    <who name="Victoria Kirst">vrk</who>
    <bug_when>2010-08-05 18:34:45 -0700</bug_when>
    <thetext>This is a patch that contains the proposed plumbing between WebKit and Chromium to give VideoLayerChromium direct access to the video frames in the Chromium side. As a proof of concept, the Y layer is output to a texture, so running this patch (and the corresponding Chromium patch) with --enable-accelerated-compositing should output a black-and-white video to the screen.

Some parts are a bit rough around the edges still, but I wanted to put the patch up for code review/discussion before completely polishing things.

The patch requires a bit of explanation. To remind everyone what we&apos;re doing: In the VideoLayerChromium, we wanted to have direct access to the uncompressed YUV frame data such that we could copy this data directly to textures and use the GPU to do color conversion. The uncompressed YUV frame data lies in the VideoRendererImpl, which is in chromium.

I drew a diagram here to help with the explanation:
* https://docs.google.com/a/google.com/drawings/edit?id=15THug8YVpvTgp0KPkW4mIJG0ZTG-qRL862Ovlf-ciW0&amp;hl=en
(Let me know if you have trouble accessing it.)

VideoLayerChromium needed a way to ask for frames. I wrote an interface called WebCore::VideoFrameProvider that consists of getCurrentFrame and putCurrentFrame methods, analogous to media::VideoFrame&apos;s get/put methods.

WebMediaPlayerClientImpl implements the WebCore::VideoFrameProvider interface, as it has access to VideoRendererImpl indirectly through m_webMediaPlayer, and it creates and stores a reference to VideoLayerChromium. When a VideoLayerChromium is created, it is given a reference to its owning WebMediaPlayerClientImpl and stores it as a VideoFrameProvider* m_provider. It then uses m_provider to get/put frames when needed.

One of the trickiest parts of implementing this plumbing was due to the data type for the VideoFrame and the strict divisions in code between WebKit/WebKit/chromium/public, WebKit/WebCore/, and webkit/glue. VideoLayerChromium needs to be able to access the video frame, so there had to be a WebCore::VideoFrameChromium type. However, WebMediaPlayerClientImpl can only communicate to VideoRendererImpl through m_webMediaPlayer, which implements the WebKit::WebMediaPlayer interface. This WebKit interface cannot use WebCore types, and we also try to avoid WebCore types in chromium. Thus to make the communication possible, I decided to create both a WebCore::VideoFrameChromium interface and a WebKit::WebVideoFrame interface. These interfaces are virtually identical other than their namespaces.

Thus to make all the types happy: I wrote a WebKit::WebVideoFrame interface that is implemented by webkit_glue::WebVideoFrameImpl and is simply a wrapper for media::VideoFrame (takes a VideoFrame* in the constructor). I then wrote a WebCore::VideoFrameChromium interface implemented by WebKit::VideoFrameChromiumImpl that is a wrapper for WebKit::WebVideoFrame (takes a WebVideoFrame* in the constructor).

What this means is there are 3 parts of the code between WebKit, WebCore, and chromium that are unfortunately duplicated: WebKit::WebVideoFrame, WebCore::VideoFrameChromium, and media::VideoFrame. This actually wouldn&apos;t be *that* bad since the method headers copied are not likely going to change, *but* I also have to duplicate the enums and constants. That is really going to suck to try to keep the enums synchronized in the 3 places. Any tips on how to clean this part up would be greatly appreciated!

You can refer to the diagram to see how these pieces all work together. The entire patch is available for review here:
http://codereview.chromium.org/3058055

Since I&apos;m not going to commit this patch as-is anyway, I am not really looking for line-by-line feedback as I am looking for feedback on the overall design (line-by-line nits are welcome if you&apos;re up to it, though!). Please let me know if you have any questions or suggestions. Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262432</commentid>
    <comment_count>5</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-08-09 17:36:22 -0700</bug_when>
    <thetext>I don&apos;t know much about the video stack so I just have some more general questions:

Why does the VideoFrameProvider have both a getCurrentFrame() and a putCurrentFrame()?  I&apos;m having trouble figuring out which way data is going here.  I would guess from the name VideoFrameProvider that it&apos;s an object that gives you something, not that expects to get.

Can getCurrentFrame() return a pointer instead of taking a **?

When the texture rect is resized, is the old texture being deleted somehow?

Declaring static const ints or size_ts in a .h and not providing storage for them in a .cpp is an error and won&apos;t work across all compilers we use.  Either make these enums (ugly) or leave the values out of the .h and define them in a .cpp.  People reading the header file shouldn&apos;t depend on particular values of the constants anyway so hiding them in a .cpp seems better to me.

There aren&apos;t many uses of size_t in the WebKit API except for things that are numbers of bytes.  Can the plane-related constants be unsigneds or ints?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262762</commentid>
    <comment_count>6</comment_count>
      <attachid>63661</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-08-10 10:58:39 -0700</bug_when>
    <thetext>Comment on attachment 63661
Patch

I mostly looked at the platform/graphics/chromium code as that the side I&apos;m most familiar with.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262766</commentid>
    <comment_count>7</comment_count>
      <attachid>63661</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-08-10 11:07:33 -0700</bug_when>
    <thetext>Comment on attachment 63661
Patch

One more try as me previous comments got lost... 

Again, I mostly focused on the platform/graphics/chromium side of the code. I suspect that some of these issues you&apos;re already aware of as you said the code isn&apos;t complete yet, but just in case:


WebCore/platform/graphics/chromium/VideoLayerChromium.cpp:71
 +      requiredTextureSize = m_bounds;
I believe the texture size should match your frame size rather than the bounds of the layer.  The layer could be scaled independent of the video frame.

WebCore/platform/graphics/chromium/VideoLayerChromium.cpp:84
 +      m_provider-&gt;getCurrentFrame(&amp;frame);
Do you need to check the surface type and format before proceeding? 

WebCore/platform/graphics/chromium/VideoLayerChromium.cpp: 
 +          return;
What happens is pixels == NULL ? 

WebCore/platform/graphics/chromium/VideoLayerChromium.cpp:118
 +      void* mem = glMapTexSubImage2D(GL_TEXTURE_2D, 0, updateRect.x(), updateRect.y(), updateRect.width(), updateRect.height(), GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_WRITE_ONLY);
ASSERT(mem) just to be sure ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264531</commentid>
    <comment_count>8</comment_count>
      <attachid>63661</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-08-13 16:02:12 -0700</bug_when>
    <thetext>Comment on attachment 63661
Patch

WebKit/chromium/src/WebMediaPlayerClientImpl.cpp:435
 +          m_webMediaPlayer-&gt;putCurrentFrame(VideoFrameChromiumImpl::toWebVideoFrame(frame));
probably need a &apos;delete frame&apos; here.  should document the memory ownership model.

i have further review comments about style, etc.  will get to those ASAP.

see also AssertMatchingEnums.cpp.  i think you&apos;ll want to extend that for your new enums.

constants should not have a &apos;k&apos; prefix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264538</commentid>
    <comment_count>9</comment_count>
    <who name="Victoria Kirst">vrk</who>
    <bug_when>2010-08-13 16:24:15 -0700</bug_when>
    <thetext>As I mentioned in person, sorry that the code is pretty rough! I didn&apos;t write my code with much care line-by-line as I wanted to get the overall design OKed by everyone first. Because of that, it&apos;d probably be best to comment on overall design instead of on nits since I will have to break up the patch and submit it in pieces before I can commit it anyway, at which time I was planning on polishing up the details. An in-depth code review should make more sense/be less painful then, hopefully. :) Thanks so much!

(In reply to comment #8)
&gt; (From update of attachment 63661 [details])
&gt; WebKit/chromium/src/WebMediaPlayerClientImpl.cpp:435
&gt;  +          m_webMediaPlayer-&gt;putCurrentFrame(VideoFrameChromiumImpl::toWebVideoFrame(frame));
&gt; probably need a &apos;delete frame&apos; here.  should document the memory ownership model.
&gt; 
&gt; i have further review comments about style, etc.  will get to those ASAP.
&gt; 
&gt; see also AssertMatchingEnums.cpp.  i think you&apos;ll want to extend that for your new enums.
&gt; 
&gt; constants should not have a &apos;k&apos; prefix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264613</commentid>
    <comment_count>10</comment_count>
      <attachid>63661</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-08-13 21:29:02 -0700</bug_when>
    <thetext>Comment on attachment 63661
Patch

WebKit/chromium/src/VideoFrameChromiumImpl.cpp:13
 +  WebVideoFrame* VideoFrameChromiumImpl::toWebVideoFrame(WebCore::VideoFrameChromium* frame)
the choice of variable names &quot;frame&quot; and &quot;m_webFrame&quot; is probably
not so great since those are used when we have WebCore::Frame
and WebKit::WebFrame pointers.

WebKit/chromium/public/WebVideoFrame.h:41
 +      // WebKit::WebVideoFrame.
it is fairly unfortunate that we need to replicate all of these constants.

WebCore/platform/graphics/chromium/VideoFrameChromium.h:74
 +      virtual SurfaceType type() const = 0;
i don&apos;t see any usage of type and format methods.  is that an oversight?
or just something that will happen later?

WebKit/chromium/public/WebVideoFrame.h:75
 +      virtual SurfaceType type() const = 0;
instead of exposing all of this information, have you considered
just having a method on this interface that you can call to load
the frame into a GLES2 texture?  how much information about the
frame do you really need to expose to WebKit?

WebCore/platform/graphics/chromium/VideoFrameChromium.h:36
 +  class VideoFrameChromium {
we typically avoid this double thunking by making the WebCore &quot;interface&quot;
use non virtual methods.  then, we just provide the concrete implementation
in WebKit/chromium/src/, and that implementation then calls out to the
WebKit API equivalent which provides the virtual functions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265653</commentid>
    <comment_count>11</comment_count>
    <who name="Victoria Kirst">vrk</who>
    <bug_when>2010-08-17 11:11:01 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 63661 [details])
&gt; WebKit/chromium/src/VideoFrameChromiumImpl.cpp:13
&gt;  +  WebVideoFrame* VideoFrameChromiumImpl::toWebVideoFrame(WebCore::VideoFrameChromium* frame)
&gt; the choice of variable names &quot;frame&quot; and &quot;m_webFrame&quot; is probably
&gt; not so great since those are used when we have WebCore::Frame
&gt; and WebKit::WebFrame pointers.
&gt; 
Good call, thanks!

&gt; WebCore/platform/graphics/chromium/VideoFrameChromium.h:74
&gt;  +      virtual SurfaceType type() const = 0;
&gt; i don&apos;t see any usage of type and format methods.  is that an oversight?
&gt; or just something that will happen later?
&gt; 
In the (near) future, I think it&apos;d be nice to have access to these Format/SurfaceType methods. Right now the code just assumes that the format is YV12 and the surface type is system memory, but these are not good assumptions to be making.

&gt; WebKit/chromium/public/WebVideoFrame.h:75
&gt;  +      virtual SurfaceType type() const = 0;
&gt; instead of exposing all of this information, have you considered
&gt; just having a method on this interface that you can call to load
&gt; the frame into a GLES2 texture?  how much information about the
&gt; frame do you really need to expose to WebKit?
&gt; 
This is a good question. I did think about having a method like that, but the shader requires knowledge of the video frame such as dimensions and stride. So to completely push VideoFrame out of WebKit, the shader logic would have to be pushed out of WebKit as well, which doesn&apos;t seem very consistent with the rest of the design. But I will experiment; it is probably true that I don&apos;t need all this frame information exposed to WebKit and I should be able to strip it down to the bare minimum. The design is also going to morph a bit as I try to eliminate our extra memcopies.


&gt; WebCore/platform/graphics/chromium/VideoFrameChromium.h:36
&gt;  +  class VideoFrameChromium {
&gt; we typically avoid this double thunking by making the WebCore &quot;interface&quot;
&gt; use non virtual methods.  then, we just provide the concrete implementation
&gt; in WebKit/chromium/src/, and that implementation then calls out to the
&gt; WebKit API equivalent which provides the virtual functions.
Perhaps I am misunderstanding (I am still a bit of a C++ novice), but I am not sure if I can do this because VideoFrameChromiumImpl is just a wrapper for WebKit::WebVideoFrame and the constructor needs to take a WebVideoFrame as a parameter. If I got rid of VideoFrameChromiumImpl.h, the VideoFrameChromium.h would need to have that parameter instead, which I believe is no good since it is mixing WebKit types in WebCore. 

Thanks so much for taking a look! I will update with a new patch pretty soon as I play with reducing memcopies.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266224</commentid>
    <comment_count>12</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-08-18 10:43:17 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; &gt; WebCore/platform/graphics/chromium/VideoFrameChromium.h:36
&gt; &gt;  +  class VideoFrameChromium {
&gt; &gt; we typically avoid this double thunking by making the WebCore &quot;interface&quot;
&gt; &gt; use non virtual methods.  then, we just provide the concrete implementation
&gt; &gt; in WebKit/chromium/src/, and that implementation then calls out to the
&gt; &gt; WebKit API equivalent which provides the virtual functions.
&gt; Perhaps I am misunderstanding (I am still a bit of a C++ novice), but I am not sure if I can do this because VideoFrameChromiumImpl is just a wrapper for WebKit::WebVideoFrame and the constructor needs to take a WebVideoFrame as a parameter. If I got rid of VideoFrameChromiumImpl.h, the VideoFrameChromium.h would need to have that parameter instead, which I believe is no good since it is mixing WebKit types in WebCore. 

Good point.  I was just hoping to avoid some extra layers, but perhaps they are necessary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266230</commentid>
    <comment_count>13</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-08-18 10:46:41 -0700</bug_when>
    <thetext>My main concern with the existing patch is that it introduces a lot of redundancy.  My suggestion to move the GL calls out to the embedder was just an effort to reduce the amount of fields that needed to be replicated between WebVideoFrame and VideoFrameChromium.  Maybe there is a better way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282414</commentid>
    <comment_count>14</comment_count>
    <who name="Andrew Scherkus">scherkus</who>
    <bug_when>2010-09-21 10:35:49 -0700</bug_when>
    <thetext>what&apos;s the status of this bug/patch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282471</commentid>
    <comment_count>15</comment_count>
    <who name="Victoria Kirst">vrk</who>
    <bug_when>2010-09-21 12:08:45 -0700</bug_when>
    <thetext>Sorry for the confusion! This patch was a big monster that was not meant to be committed, but just meant to be discussed. The change was broken up into smaller changes that were committed here:
http://trac.webkit.org/changeset/66071
http://src.chromium.org/viewvc/chrome?view=rev&amp;revision=58022

And the third one&apos;s a-coming eventually! :)
https://bugs.webkit.org/show_bug.cgi?id=45069</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63661</attachid>
            <date>2010-08-05 16:53:51 -0700</date>
            <delta_ts>2010-08-13 21:29:02 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-43590-20100805165350.patch</filename>
            <type>text/plain</type>
            <size>29930</size>
            <attacher name="Victoria Kirst">vrk</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MTlhNzM1NjIzYTY4YjZjZTIzNDZmOTQxNzE1OTEwYWRlNjg1YmE1Ni4uMTU2Mzg4YzVmOWFmY2U2
ZWRhNWViYWM2YjZiYTlhODQwMjRmNDVhNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cK
KysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNSBAQAorMjAxMC0wOC0wNSAgVmlj
dG9yaWEgS2lyc3QgIDx2cmtAZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBJbXBsZW1lbnRlZCBhIHdheSB0byBzaGFyZSB1bmNvbXBy
ZXNzZWQgWVVWIHZpZGVvIGZyYW0gZGF0YSBiZXR3ZWVuCisgICAgICAgIFdlYkNvcmUgYW5kIENo
cm9taXVtLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBiZWNhdXNlIHRoZXJlIGFyZSBubyBjaGFu
Z2VzIGluIHVzZXItdmlzaWJsZQorICAgICAgICBmdW5jdGlvbmFsaXR5LCBzaW5jZSBhY2NlbGVy
YXRlZCBjb21wb3NpdGluZyBpcyBub3QgdHVybmVkIG9uICh5ZXQpLgorCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVmlkZW9GcmFtZUNocm9taXVtLmg6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6VmlkZW9GcmFtZUNocm9taXVtOjopOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL1ZpZGVvRnJhbWVQcm92aWRlci5oOiBBZGRlZC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9WaWRlb0xheWVyQ2hyb21pdW0uY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6VmlkZW9MYXllckNocm9taXVtOjpjcmVhdGUpOgorICAgICAgICAoV2Vi
Q29yZTo6VmlkZW9MYXllckNocm9taXVtOjpWaWRlb0xheWVyQ2hyb21pdW0pOgorICAgICAgICAo
V2ViQ29yZTo6VmlkZW9MYXllckNocm9taXVtOjp1cGRhdGVUZXh0dXJlQ29udGVudHMpOgorICAg
ICAgICAoV2ViQ29yZTo6VmlkZW9MYXllckNocm9taXVtOjpjcmVhdGVUZXh0dXJlUmVjdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpWaWRlb0xheWVyQ2hyb21pdW06OnVwZGF0ZVRleHR1cmVSZWN0KToK
KyAgICAgICAgKFdlYkNvcmU6OlZpZGVvTGF5ZXJDaHJvbWl1bTo6dXBkYXRlQ29tcGxldGVkKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9WaWRlb0xheWVyQ2hyb21pdW0u
aDoKKwogMjAxMC0wOC0wNSAgRXJpYyBTZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgTmlrb2xhcyBaaW1tZXJtYW5uLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9WaWRlb0ZyYW1lQ2hyb21pdW0uaCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVmlkZW9GcmFtZUNocm9taXVtLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uMzE5MGJhNGZmM2Y0MjlkN2E2MDdhZmVjZTllODVlZWUyNDVkNDkzMQotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVmlkZW9GcmFtZUNocm9t
aXVtLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVmlkZW9GcmFtZUNocm9taXVtX2gKKyNkZWZp
bmUgVmlkZW9GcmFtZUNocm9taXVtX2gKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBW
aWRlb0ZyYW1lQ2hyb21pdW0geworCitwdWJsaWM6CisgICAgLy8gVGhlc2UgY29uc3RzL2VudW1z
IG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggbWVkaWE6OlZpZGVvRm9ybWF0IGFuZAorICAgIC8v
IFdlYktpdDo6V2ViVmlkZW9GcmFtZS4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhQbGFu
ZXMgPSAzOworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtUkdCUGxhbmVzID0gMTsKKyAg
ICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtSR0JQbGFuZSA9IDA7CisKKyAgICBzdGF0aWMgY29uc3Qg
c2l6ZV90IGtOdW1ZVVZQbGFuZXMgPSAzOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1lQbGFu
ZSA9IDA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVVBsYW5lID0gMTsKKyAgICBzdGF0aWMg
Y29uc3Qgc2l6ZV90IGtWUGxhbmUgPSAyOworCisgICAgZW51bSBGb3JtYXQgeworICAgICAgICBJ
TlZBTElELAorICAgICAgICBSR0I1NTUsCisgICAgICAgIFJHQjU2NSwKKyAgICAgICAgUkdCMjQs
CisgICAgICAgIFJHQjMyLAorICAgICAgICBSR0JBLAorICAgICAgICBZVjEyLAorICAgICAgICBZ
VjE2LAorICAgICAgICBOVjEyLAorICAgICAgICBFTVBUWSwKKyAgICAgICAgQVNDSUksCisgICAg
fTsKKworICAgIGVudW0gU3VyZmFjZVR5cGUgeworICAgICAgICBUWVBFX1NZU1RFTV9NRU1PUlks
CisgICAgICAgIFRZUEVfT01YQlVGRkVSSEVBRCwKKyAgICAgICAgVFlQRV9FR0xfSU1BR0UsCisg
ICAgICAgIFRZUEVfTUZCVUZGRVIsCisgICAgICAgIFRZUEVfRElSRUNUM0RTVVJGQUNFCisgICAg
fTsKKworcHVibGljOgorICAgIHZpcnR1YWwgU3VyZmFjZVR5cGUgdHlwZSgpIGNvbnN0ID0gMDsK
KyAgICB2aXJ0dWFsIEZvcm1hdCBmb3JtYXQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzaXpl
X3Qgd2lkdGgoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzaXplX3QgaGVpZ2h0KCkgY29uc3Qg
PSAwOworICAgIHZpcnR1YWwgc2l6ZV90IHBsYW5lcygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFs
IGludCBzdHJpZGUoc2l6ZV90IHBsYW5lKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkKiBk
YXRhKHNpemVfdCBwbGFuZSkgY29uc3QgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vVmlkZW9GcmFtZVByb3ZpZGVyLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL1ZpZGVvRnJhbWVQcm92aWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjM3ZjU3YmEzYjE5NmY0OWQxMGZj
Njk5MzQyNzMxYzcxZTZkMWZkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL1ZpZGVvRnJhbWVQcm92aWRlci5oCkBAIC0wLDAgKzEsNDcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
ICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIFZpZGVvRnJhbWVQcm92aWRlcl9oCisjZGVmaW5lIFZpZGVvRnJhbWVQcm92aWRlcl9o
CisKKyNpbmNsdWRlICJWaWRlb0ZyYW1lQ2hyb21pdW0uaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitjbGFzcyBWaWRlb0ZyYW1lUHJvdmlkZXIgeworCitwdWJsaWM6CisgICAgdmlydHVhbCB2
b2lkIGdldEN1cnJlbnRGcmFtZShWaWRlb0ZyYW1lQ2hyb21pdW0qKiBmcmFtZU91dCkgPSAwOwor
ICAgIHZpcnR1YWwgdm9pZCBwdXRDdXJyZW50RnJhbWUoVmlkZW9GcmFtZUNocm9taXVtKiBmcmFt
ZSkgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVmlkZW9MYXllckNocm9taXVt
LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVmlkZW9MYXllckNocm9t
aXVtLmNwcAppbmRleCA0NDBiNTAyN2U1NjJlNTdkZTFkNjI0ZTBlMjVjNDcyZTgyNDE1ZDYxLi4x
YmM1MzA0NzA4ODY4OWQ3MzY4NWZjNGM0MDkwOWU4YmZhZjZlMzU3IDEwMDY0NAotLS0gYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1ZpZGVvTGF5ZXJDaHJvbWl1bS5jcHAKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9WaWRlb0xheWVyQ2hyb21pdW0u
Y3BwCkBAIC0zMywzMiArMzMsMjYgQEAKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CiAjaW5jbHVkZSAiVmlkZW9MYXllckNocm9taXVtLmgiCiAKLSNpbmNsdWRlICJMYXllclJlbmRl
cmVyQ2hyb21pdW0uaCIKICNpbmNsdWRlICJSZW5kZXJMYXllckJhY2tpbmcuaCIKLSNpbmNsdWRl
ICJza2lhL2V4dC9wbGF0Zm9ybV9jYW52YXMuaCIKKyNpbmNsdWRlICJWaWRlb0ZyYW1lQ2hyb21p
dW0uaCIKKyNpbmNsdWRlICJWaWRlb0ZyYW1lUHJvdmlkZXIuaCIKIAogI2luY2x1ZGUgPEdMRVMy
L2dsMi5oPgogI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCiAjaW5jbHVkZSA8R0xFUzIvZ2wy
ZXh0Lmg+CiAKLSNpZiBQTEFURk9STShTS0lBKQotI2luY2x1ZGUgIk5hdGl2ZUltYWdlU2tpYS5o
IgotI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKLSNlbmRpZgotCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKLVBhc3NSZWZQdHI8VmlkZW9MYXllckNocm9taXVtPiBWaWRlb0xheWVyQ2hy
b21pdW06OmNyZWF0ZShHcmFwaGljc0xheWVyQ2hyb21pdW0qIG93bmVyKQorUGFzc1JlZlB0cjxW
aWRlb0xheWVyQ2hyb21pdW0+IFZpZGVvTGF5ZXJDaHJvbWl1bTo6Y3JlYXRlKEdyYXBoaWNzTGF5
ZXJDaHJvbWl1bSogb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgVmlkZW9GcmFtZVByb3ZpZGVyKiBwcm92aWRlcikKIHsKLSAg
ICByZXR1cm4gYWRvcHRSZWYobmV3IFZpZGVvTGF5ZXJDaHJvbWl1bShvd25lcikpOworICAgIHJl
dHVybiBhZG9wdFJlZihuZXcgVmlkZW9MYXllckNocm9taXVtKG93bmVyLCBwcm92aWRlcikpOwog
fQogCi1WaWRlb0xheWVyQ2hyb21pdW06OlZpZGVvTGF5ZXJDaHJvbWl1bShHcmFwaGljc0xheWVy
Q2hyb21pdW0qIG93bmVyKQorVmlkZW9MYXllckNocm9taXVtOjpWaWRlb0xheWVyQ2hyb21pdW0o
R3JhcGhpY3NMYXllckNocm9taXVtKiBvd25lciwgVmlkZW9GcmFtZVByb3ZpZGVyKiBwcm92aWRl
cikKICAgICA6IExheWVyQ2hyb21pdW0ob3duZXIpCiAgICAgLCBtX2FsbG9jYXRlZFRleHR1cmVJ
ZCgwKQotICAgICwgbV9jYW52YXMoMCkKLSAgICAsIG1fc2tpYUNvbnRleHQoMCkKLSAgICAsIG1f
Z3JhcGhpY3NDb250ZXh0KDApCisgICAgLCBtX3Byb3ZpZGVyKHByb3ZpZGVyKQogewogfQogCkBA
IC03MCwxMCArNjQsMTAgQEAgdm9pZCBWaWRlb0xheWVyQ2hyb21pdW06OnVwZGF0ZVRleHR1cmVD
b250ZW50cyh1bnNpZ25lZCB0ZXh0dXJlSWQpCiAKICAgICBBU1NFUlQoZHJhd3NDb250ZW50KCkp
OwogCisgICAgVmlkZW9GcmFtZUNocm9taXVtKiBmcmFtZSA9IDA7CiAgICAgSW50UmVjdCBkaXJ0
eVJlY3QobV9kaXJ0eVJlY3QpOwogICAgIEludFNpemUgcmVxdWlyZWRUZXh0dXJlU2l6ZTsKIAot
I2lmIFBMQVRGT1JNKFNLSUEpCiAgICAgcmVxdWlyZWRUZXh0dXJlU2l6ZSA9IG1fYm91bmRzOwog
ICAgIEludFJlY3QgYm91bmRzUmVjdChJbnRQb2ludCgwLCAwKSwgbV9ib3VuZHMpOwogCkBAIC04
Nyw2MSArODEsMjggQEAgdm9pZCBWaWRlb0xheWVyQ2hyb21pdW06OnVwZGF0ZVRleHR1cmVDb250
ZW50cyh1bnNpZ25lZCB0ZXh0dXJlSWQpCiAgICAgICAgIGRpcnR5UmVjdC5pbnRlcnNlY3QoYm91
bmRzUmVjdCk7CiAgICAgfQogCi0gICAgaWYgKCFtX2NhbnZhcy5nZXQoKQotICAgICAgICB8fCBk
aXJ0eVJlY3Qud2lkdGgoKSAhPSBtX2NhbnZhcy0+Z2V0RGV2aWNlKCktPndpZHRoKCkKLSAgICAg
ICAgfHwgZGlydHlSZWN0LmhlaWdodCgpICE9IG1fY2FudmFzLT5nZXREZXZpY2UoKS0+aGVpZ2h0
KCkpIHsKLSAgICAgICAgbV9jYW52YXMgPSBuZXcgc2tpYTo6UGxhdGZvcm1DYW52YXMoZGlydHlS
ZWN0LndpZHRoKCksIGRpcnR5UmVjdC5oZWlnaHQoKSwgdHJ1ZSk7Ci0gICAgICAgIG1fc2tpYUNv
bnRleHQgPSBuZXcgUGxhdGZvcm1Db250ZXh0U2tpYShtX2NhbnZhcy5nZXQoKSk7Ci0KLSNpZiBP
UyhXSU5ET1dTKQotICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBnZXQgdGV4dCB0byBzaG93
IHVwIGNvcnJlY3RseS4gV2l0aG91dCBpdCwKLSAgICAgICAgLy8gR0RJIHJlbmRlcnMgd2l0aCB6
ZXJvIGFscGhhIGFuZCB0aGUgdGV4dCBiZWNvbWVzIGludmlzaWJsZS4KLSAgICAgICAgLy8gVW5m
b3J0dW5hdGVseSwgc2V0dGluZyB0aGlzIHRvIHRydWUgZGlzYWJsZXMgY2xlYXJ0eXBlLgotICAg
ICAgICAvLyBGSVhNRTogRG9lcyB0aGlzIHRha2UgdXMgZG93biBhIHZlcnkgc2xvdyB0ZXh0IHJl
bmRlcmluZyBwYXRoPwotICAgICAgICAvLyBGSVhNRTogV2h5IGlzIHRoaXMgaXMgYSB3aW5kb3dz
LW9ubHkgY2FsbD8KLSAgICAgICAgbV9za2lhQ29udGV4dC0+c2V0RHJhd2luZ1RvSW1hZ2VCdWZm
ZXIodHJ1ZSk7Ci0jZW5kaWYKLSAgICAgICAgbV9ncmFwaGljc0NvbnRleHQgPSBuZXcgR3JhcGhp
Y3NDb250ZXh0KHJlaW50ZXJwcmV0X2Nhc3Q8UGxhdGZvcm1HcmFwaGljc0NvbnRleHQqPihtX3Nr
aWFDb250ZXh0LmdldCgpKSk7CisgICAgbV9wcm92aWRlci0+Z2V0Q3VycmVudEZyYW1lKCZmcmFt
ZSk7CisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIC8vIElmIHRoZSB0ZXh0dXJlIGlkIG9yIHNp
emUgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUsIHRoZW4gd2UgbmVlZCB0byB0ZWxsIEdMCisgICAg
ICAgIC8vIHRvIHJlLWFsbG9jYXRlIGEgdGV4dHVyZS4KKyAgICAgICAgaWYgKG1fYWxsb2NhdGVk
VGV4dHVyZUlkICE9IHRleHR1cmVJZCB8fCByZXF1aXJlZFRleHR1cmVTaXplICE9IG1fYWxsb2Nh
dGVkVGV4dHVyZVNpemUpCisgICAgICAgICAgICBjcmVhdGVUZXh0dXJlUmVjdChmcmFtZSwgcmVx
dWlyZWRUZXh0dXJlU2l6ZSwgZGlydHlSZWN0LCB0ZXh0dXJlSWQpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICB1cGRhdGVUZXh0dXJlUmVjdChmcmFtZSwgZGlydHlSZWN0LCB0ZXh0dXJlSWQp
OwogICAgIH0KLQotICAgIC8vIEJyaW5nIHRoZSBjYW52YXMgaW50byB0aGUgY29vcmRpbmF0ZSBz
eXN0ZW0gb2YgdGhlIHBhaW50IHJlY3QuCi0gICAgbV9jYW52YXMtPnRyYW5zbGF0ZShzdGF0aWNf
Y2FzdDxTa1NjYWxhcj4oLWRpcnR5UmVjdC54KCkpLCBzdGF0aWNfY2FzdDxTa1NjYWxhcj4oLWRp
cnR5UmVjdC55KCkpKTsKLQotICAgIC8vIElmIHRoZSB0ZXh0dXJlIGlkIG9yIHNpemUgY2hhbmdl
ZCBzaW5jZSBsYXN0IHRpbWUsIHRoZW4gd2UgbmVlZCB0byB0ZWxsIEdMCi0gICAgLy8gdG8gcmUt
YWxsb2NhdGUgYSB0ZXh0dXJlLgotICAgIGlmIChtX2FsbG9jYXRlZFRleHR1cmVJZCAhPSB0ZXh0
dXJlSWQgfHwgcmVxdWlyZWRUZXh0dXJlU2l6ZSAhPSBtX2FsbG9jYXRlZFRleHR1cmVTaXplKQot
ICAgICAgICBjcmVhdGVUZXh0dXJlUmVjdChyZXF1aXJlZFRleHR1cmVTaXplLCBkaXJ0eVJlY3Qs
IHRleHR1cmVJZCk7Ci0gICAgZWxzZQotICAgICAgICB1cGRhdGVUZXh0dXJlUmVjdChkaXJ0eVJl
Y3QsIHRleHR1cmVJZCk7Ci0jZWxzZQotI2Vycm9yICJOZWVkIHRvIGltcGxlbWVudCBmb3IgeW91
ciBwbGF0Zm9ybS4iCi0jZW5kaWYKKyAgICBtX3Byb3ZpZGVyLT5wdXRDdXJyZW50RnJhbWUoZnJh
bWUpOwogfQogCi12b2lkIFZpZGVvTGF5ZXJDaHJvbWl1bTo6Y3JlYXRlVGV4dHVyZVJlY3QoY29u
c3QgSW50U2l6ZSYgcmVxdWlyZWRUZXh0dXJlU2l6ZSwgY29uc3QgSW50UmVjdCYgdXBkYXRlUmVj
dCwgdW5zaWduZWQgdGV4dHVyZUlkKQordm9pZCBWaWRlb0xheWVyQ2hyb21pdW06OmNyZWF0ZVRl
eHR1cmVSZWN0KFZpZGVvRnJhbWVDaHJvbWl1bSogZnJhbWUsIGNvbnN0IEludFNpemUmIHJlcXVp
cmVkVGV4dHVyZVNpemUsIGNvbnN0IEludFJlY3QmIHVwZGF0ZVJlY3QsIHVuc2lnbmVkIHRleHR1
cmVJZCkKIHsKLSAgICAvLyBQYWludCBpbnRvIGdyYXBoaWNzIGNvbnRleHQgYW5kIGdldCBiaXRt
YXAuCi0gICAgbV9vd25lci0+cGFpbnRHcmFwaGljc0xheWVyQ29udGVudHMoKm1fZ3JhcGhpY3ND
b250ZXh0LCB1cGRhdGVSZWN0KTsKLSAgICBjb25zdCBTa0JpdG1hcCYgYml0bWFwID0gbV9jYW52
YXMtPmdldERldmljZSgpLT5hY2Nlc3NCaXRtYXAoZmFsc2UpOwotICAgIGNvbnN0IFNrQml0bWFw
KiBza2lhQml0bWFwID0gJmJpdG1hcDsKLSAgICBBU1NFUlQoc2tpYUJpdG1hcCk7Ci0KLSAgICB2
b2lkKiBwaXhlbHMgPSAwOworICAgIEFTU0VSVChmcmFtZSk7CisgICAgdm9pZCogcGl4ZWxzID0g
ZnJhbWUtPmRhdGEoVmlkZW9GcmFtZUNocm9taXVtOjprWVBsYW5lKTsKICAgICBJbnRTaXplIGJp
dG1hcFNpemU7Ci0gICAgU2tBdXRvTG9ja1BpeGVscyBsb2NrKCpza2lhQml0bWFwKTsKLSAgICBT
a0JpdG1hcDo6Q29uZmlnIHNraWFDb25maWcgPSBza2lhQml0bWFwLT5jb25maWcoKTsKLSAgICAv
LyBGSVhNRTogRG8gd2UgbmVlZCB0byBzdXBwb3J0IG1vcmUgaW1hZ2UgY29uZmlndXJhdGlvbnM/
Ci0gICAgaWYgKHNraWFDb25maWcgPT0gU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnKSB7Ci0g
ICAgICAgIHBpeGVscyA9IHNraWFCaXRtYXAtPmdldFBpeGVscygpOwotICAgICAgICBiaXRtYXBT
aXplID0gSW50U2l6ZShza2lhQml0bWFwLT53aWR0aCgpLCBza2lhQml0bWFwLT5oZWlnaHQoKSk7
Ci0gICAgfQotCi0gICAgaWYgKCFwaXhlbHMpCi0gICAgICAgIHJldHVybjsKKyAgICBiaXRtYXBT
aXplID0gSW50U2l6ZShmcmFtZS0+d2lkdGgoKSwgZnJhbWUtPmhlaWdodCgpKTsKKyAgICBBU1NF
UlQoYml0bWFwU2l6ZSA9PSByZXF1aXJlZFRleHR1cmVTaXplKTsKIAogICAgIGdsQmluZFRleHR1
cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZUlkKTsKLSAgICBBU1NFUlQoYml0bWFwU2l6ZSA9PSBy
ZXF1aXJlZFRleHR1cmVTaXplKTsKLSAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwg
R0xfUkdCQSwgcmVxdWlyZWRUZXh0dXJlU2l6ZS53aWR0aCgpLCByZXF1aXJlZFRleHR1cmVTaXpl
LmhlaWdodCgpLCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbHMpOworICAgIGds
VGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0UsIGZyYW1lLT53aWR0aCgp
LCBmcmFtZS0+aGVpZ2h0KCksIDAsIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgcGl4
ZWxzKTsKIAogICAgIG1fYWxsb2NhdGVkVGV4dHVyZUlkID0gdGV4dHVyZUlkOwogICAgIG1fYWxs
b2NhdGVkVGV4dHVyZVNpemUgPSByZXF1aXJlZFRleHR1cmVTaXplOwpAQCAtMTQ5LDIyICsxMTAs
MTQgQEAgdm9pZCBWaWRlb0xheWVyQ2hyb21pdW06OmNyZWF0ZVRleHR1cmVSZWN0KGNvbnN0IElu
dFNpemUmIHJlcXVpcmVkVGV4dHVyZVNpemUsIGMKICAgICB1cGRhdGVDb21wbGV0ZWQoKTsKIH0K
IAotdm9pZCBWaWRlb0xheWVyQ2hyb21pdW06OnVwZGF0ZVRleHR1cmVSZWN0KGNvbnN0IEludFJl
Y3QmIHVwZGF0ZVJlY3QsIHVuc2lnbmVkIHRleHR1cmVJZCkKK3ZvaWQgVmlkZW9MYXllckNocm9t
aXVtOjp1cGRhdGVUZXh0dXJlUmVjdChWaWRlb0ZyYW1lQ2hyb21pdW0qIGZyYW1lLCBjb25zdCBJ
bnRSZWN0JiB1cGRhdGVSZWN0LCB1bnNpZ25lZCB0ZXh0dXJlSWQpCiB7Ci0gICAgY29uc3QgU2tC
aXRtYXAmIGJpdG1hcCA9IG1fY2FudmFzLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKHRydWUp
OwotICAgIFNrQml0bWFwKiBza2lhQml0bWFwID0gY29uc3RfY2FzdDxTa0JpdG1hcCo+KCZiaXRt
YXApOwotICAgIEFTU0VSVChza2lhQml0bWFwKTsKLQotICAgIFNrQXV0b0xvY2tQaXhlbHMgbG9j
aygqc2tpYUJpdG1hcCk7Ci0gICAgU2tCaXRtYXA6OkNvbmZpZyBza2lhQ29uZmlnID0gc2tpYUJp
dG1hcC0+Y29uZmlnKCk7Ci0KLSAgICBpZiAoc2tpYUNvbmZpZyA9PSBTa0JpdG1hcDo6a0FSR0Jf
ODg4OF9Db25maWcpIHsKLSAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0
dXJlSWQpOwotICAgICAgICB2b2lkKiBtZW0gPSBnbE1hcFRleFN1YkltYWdlMkQoR0xfVEVYVFVS
RV8yRCwgMCwgdXBkYXRlUmVjdC54KCksIHVwZGF0ZVJlY3QueSgpLCB1cGRhdGVSZWN0LndpZHRo
KCksIHVwZGF0ZVJlY3QuaGVpZ2h0KCksIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIEdMX1dS
SVRFX09OTFkpOwotICAgICAgICBza2lhQml0bWFwLT5zZXRQaXhlbHMobWVtKTsKLSAgICAgICAg
bV9vd25lci0+cGFpbnRHcmFwaGljc0xheWVyQ29udGVudHMoKm1fZ3JhcGhpY3NDb250ZXh0LCB1
cGRhdGVSZWN0KTsKLSAgICAgICAgZ2xVbm1hcFRleFN1YkltYWdlMkQobWVtKTsKLSAgICB9Cisg
ICAgQVNTRVJUKGZyYW1lKTsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4
dHVyZUlkKTsKKyAgICB2b2lkKiBtZW0gPSBnbE1hcFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8y
RCwgMCwgdXBkYXRlUmVjdC54KCksIHVwZGF0ZVJlY3QueSgpLCB1cGRhdGVSZWN0LndpZHRoKCks
IHVwZGF0ZVJlY3QuaGVpZ2h0KCksIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgR0xf
V1JJVEVfT05MWSk7CisgICAgbWVtY3B5KG1lbSwgZnJhbWUtPmRhdGEoVmlkZW9GcmFtZUNocm9t
aXVtOjprWVBsYW5lKSwgZnJhbWUtPmhlaWdodCgpICogZnJhbWUtPndpZHRoKCkpOworICAgIGds
VW5tYXBUZXhTdWJJbWFnZTJEKG1lbSk7CiAKICAgICB1cGRhdGVDb21wbGV0ZWQoKTsKIH0KZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVmlkZW9MYXllckNo
cm9taXVtLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1ZpZGVvTGF5ZXJD
aHJvbWl1bS5oCmluZGV4IDgwMjQ4ZWI1ZmZmNGIzMTg3ZDg2NjQzMmIzOTI1NTY3NTg1MWU5YmIu
LmI0ODQ1NTM4MmY1YzRhN2EwNzZiM2I5ZmM2YTBhNWRlMWZiNTU5ZTUgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVmlkZW9MYXllckNocm9taXVtLmgKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9WaWRlb0xheWVyQ2hyb21pdW0u
aApAQCAtMzUsMjcgKzM1LDI4IEBACiAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQog
CiAjaW5jbHVkZSAiTGF5ZXJDaHJvbWl1bS5oIgorI2luY2x1ZGUgIlZpZGVvRnJhbWVDaHJvbWl1
bS5oIgorI2luY2x1ZGUgIlZpZGVvRnJhbWVQcm92aWRlci5oIgogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKIC8vIEEgTGF5ZXIgdGhhdCBjb250YWlucyBhIFZpZGVvIGVsZW1lbnQuCiBjbGFzcyBW
aWRlb0xheWVyQ2hyb21pdW0gOiBwdWJsaWMgTGF5ZXJDaHJvbWl1bSB7CiBwdWJsaWM6Ci0gICAg
c3RhdGljIFBhc3NSZWZQdHI8VmlkZW9MYXllckNocm9taXVtPiBjcmVhdGUoR3JhcGhpY3NMYXll
ckNocm9taXVtKiBvd25lciA9IDApOworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFZpZGVvTGF5ZXJD
aHJvbWl1bT4gY3JlYXRlKEdyYXBoaWNzTGF5ZXJDaHJvbWl1bSogb3duZXIgPSAwLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRnJhbWVQcm92
aWRlciogcHJvdmlkZXIgPSAwKTsKICAgICB2aXJ0dWFsIGJvb2wgZHJhd3NDb250ZW50KCkgeyBy
ZXR1cm4gdHJ1ZTsgfQogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVUZXh0dXJlQ29udGVudHModW5z
aWduZWQgdGV4dHVyZUlkKTsKIAogcHJpdmF0ZToKLSAgICBWaWRlb0xheWVyQ2hyb21pdW0oR3Jh
cGhpY3NMYXllckNocm9taXVtKiBvd25lcik7Ci0gICAgdm9pZCBjcmVhdGVUZXh0dXJlUmVjdChj
b25zdCBJbnRTaXplJiByZXF1aXJlZFRleHR1cmVTaXplLCBjb25zdCBJbnRSZWN0JiB1cGRhdGVS
ZWN0LCB1bnNpZ25lZCB0ZXh0dXJlSWQpOwotICAgIHZvaWQgdXBkYXRlVGV4dHVyZVJlY3QoY29u
c3QgSW50UmVjdCYgdXBkYXRlUmVjdCwgdW5zaWduZWQgdGV4dHVyZUlkKTsKKyAgICBWaWRlb0xh
eWVyQ2hyb21pdW0oR3JhcGhpY3NMYXllckNocm9taXVtKiBvd25lciwgVmlkZW9GcmFtZVByb3Zp
ZGVyKiBwcm92aWRlcik7CisgICAgdm9pZCBjcmVhdGVUZXh0dXJlUmVjdChWaWRlb0ZyYW1lQ2hy
b21pdW0qIGZyYW1lLCBjb25zdCBJbnRTaXplJiByZXF1aXJlZFRleHR1cmVTaXplLCBjb25zdCBJ
bnRSZWN0JiB1cGRhdGVSZWN0LCB1bnNpZ25lZCB0ZXh0dXJlSWQpOworICAgIHZvaWQgdXBkYXRl
VGV4dHVyZVJlY3QoVmlkZW9GcmFtZUNocm9taXVtKiBmcmFtZSwgY29uc3QgSW50UmVjdCYgdXBk
YXRlUmVjdCwgdW5zaWduZWQgdGV4dHVyZUlkKTsKICAgICB2b2lkIHVwZGF0ZUNvbXBsZXRlZCgp
OwogCiAgICAgdW5zaWduZWQgbV9hbGxvY2F0ZWRUZXh0dXJlSWQ7CiAgICAgSW50U2l6ZSBtX2Fs
bG9jYXRlZFRleHR1cmVTaXplOwotICAgIE93blB0cjxza2lhOjpQbGF0Zm9ybUNhbnZhcz4gbV9j
YW52YXM7Ci0gICAgT3duUHRyPFBsYXRmb3JtQ29udGV4dFNraWE+IG1fc2tpYUNvbnRleHQ7Ci0g
ICAgT3duUHRyPEdyYXBoaWNzQ29udGV4dD4gbV9ncmFwaGljc0NvbnRleHQ7CisgICAgT3duUHRy
PFZpZGVvRnJhbWVQcm92aWRlcj4gbV9wcm92aWRlcjsKIH07CiAKIH0KZGlmZiAtLWdpdCBhL1dl
YktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cgYi9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4
IDYzMjI0YTFkNzE5M2E5NmU1NzFlZGExMDQxYTA2N2FmZjM3NmY5NGMuLmU1NTRlNWM1MzRiNjk4
ZjQwYWMxMzc1ZGM3ZGRmM2M1OTI2NDcwYzUgMTAwNjQ0Ci0tLSBhL1dlYktpdC9jaHJvbWl1bS9D
aGFuZ2VMb2cKKysrIGIvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM3IEBA
CisyMDEwLTA4LTA1ICBWaWN0b3JpYSBLaXJzdCAgPHZya0Bnb29nbGUuY29tPgorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEltcGxlbWVudGVkIGEgd2F5
IHRvIHNoYXJlIHVuY29tcHJlc3NlZCBZVVYgdmlkZW8gZnJhbWVzIGJldHdlZW4KKyAgICAgICAg
V2ViQ29yZSBhbmQgQ2hyb21pdW0uIEJlY2F1c2UgdGhlIFdlYkNvcmUgdmlkZW8gbGF5ZXIgY29k
ZSB0YWxrcworICAgICAgICB0byBDaHJvbWl1bSB0aHJvdWdoIFdlYktpdCBpbnRlcmZhY2VzLCB3
ZSBuZWVkIHRvIGltcGxlbWVudCBhCisgICAgICAgIGZldyBsYXllcnMgb2YgaW5kaXJlY3Rpb24g
aW4gV2ViS2l0IGFzIHdlbGwuCisKKyAgICAgICAgSW1wbGVtZW50aW5nIHZpZGVvIGZyYW1lIHNo
YXJpbmcgYmV0d2VlbiBXZWJLaXQgYW5kIENocm9taXVtCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MzU5MAorCisgICAgICAgICogV2ViS2l0Lmd5cDoK
KyAgICAgICAgKiBwdWJsaWMvV2ViTWVkaWFQbGF5ZXIuaDoKKyAgICAgICAgKiBwdWJsaWMvV2Vi
VmlkZW9GcmFtZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdDo6V2ViVmlkZW9GcmFtZTo6KToK
KyAgICAgICAgKiBzcmMvVmlkZW9GcmFtZUNocm9taXVtSW1wbC5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViS2l0OjpWaWRlb0ZyYW1lQ2hyb21pdW1JbXBsOjp0b1dlYlZpZGVvRnJhbWUpOgorICAg
ICAgICAoV2ViS2l0OjpWaWRlb0ZyYW1lQ2hyb21pdW1JbXBsOjpWaWRlb0ZyYW1lQ2hyb21pdW1J
bXBsKToKKyAgICAgICAgKFdlYktpdDo6VmlkZW9GcmFtZUNocm9taXVtSW1wbDo6dHlwZSk6Cisg
ICAgICAgIChXZWJLaXQ6OlZpZGVvRnJhbWVDaHJvbWl1bUltcGw6OmZvcm1hdCk6CisgICAgICAg
IChXZWJLaXQ6OlZpZGVvRnJhbWVDaHJvbWl1bUltcGw6OndpZHRoKToKKyAgICAgICAgKFdlYktp
dDo6VmlkZW9GcmFtZUNocm9taXVtSW1wbDo6aGVpZ2h0KToKKyAgICAgICAgKFdlYktpdDo6Vmlk
ZW9GcmFtZUNocm9taXVtSW1wbDo6cGxhbmVzKToKKyAgICAgICAgKFdlYktpdDo6VmlkZW9GcmFt
ZUNocm9taXVtSW1wbDo6c3RyaWRlKToKKyAgICAgICAgKFdlYktpdDo6VmlkZW9GcmFtZUNocm9t
aXVtSW1wbDo6ZGF0YSk6CisgICAgICAgICogc3JjL1ZpZGVvRnJhbWVDaHJvbWl1bUltcGwuaDog
QWRkZWQuCisgICAgICAgICogc3JjL1dlYk1lZGlhUGxheWVyQ2xpZW50SW1wbC5jcHA6CisgICAg
ICAgIChXZWJLaXQ6OldlYk1lZGlhUGxheWVyQ2xpZW50SW1wbDo6cmVwYWludCk6CisgICAgICAg
IChXZWJLaXQ6OldlYk1lZGlhUGxheWVyQ2xpZW50SW1wbDo6Z2V0Q3VycmVudEZyYW1lKToKKyAg
ICAgICAgKFdlYktpdDo6V2ViTWVkaWFQbGF5ZXJDbGllbnRJbXBsOjpwdXRDdXJyZW50RnJhbWUp
OgorICAgICAgICAoV2ViS2l0OjpXZWJNZWRpYVBsYXllckNsaWVudEltcGw6OmNyZWF0ZSk6Cisg
ICAgICAgICogc3JjL1dlYk1lZGlhUGxheWVyQ2xpZW50SW1wbC5oOgorCiAyMDEwLTA4LTA1ICBC
cmV0dCBXaWxzb24gIDxicmV0dHdAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IE5hdGUgQ2hhcGluLgpkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAgYi9X
ZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAppbmRleCAyYTYwNDY3MGI3YTk1ODBlMWE4NzgzNDg5
YjI0NGViNmM3MDQwZTVkLi40ZmZhZTZjNmM2M2MxMjFiYmQzNjRhYTQ3OTI5Mzg4ZTliMzZjZDNi
IDEwMDY0NAotLS0gYS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAorKysgYi9XZWJLaXQvY2hy
b21pdW0vV2ViS2l0Lmd5cApAQCAtMzUxLDYgKzM1MSw4IEBACiAgICAgICAgICAgICAgICAgJ3Ny
Yy9TdG9yYWdlTmFtZXNwYWNlUHJveHkuY3BwJywKICAgICAgICAgICAgICAgICAnc3JjL1N0b3Jh
Z2VOYW1lc3BhY2VQcm94eS5oJywKICAgICAgICAgICAgICAgICAnc3JjL1RlbXBvcmFyeUdsdWUu
aCcsCisgICAgICAgICAgICAgICAgJ3NyYy9WaWRlb0ZyYW1lQ2hyb21pdW1JbXBsLmNwcCcsCisg
ICAgICAgICAgICAgICAgJ3NyYy9WaWRlb0ZyYW1lQ2hyb21pdW1JbXBsLmgnLAogICAgICAgICAg
ICAgICAgICdzcmMvV2ViQWNjZXNzaWJpbGl0eUNhY2hlLmNwcCcsCiAgICAgICAgICAgICAgICAg
J3NyYy9XZWJBY2Nlc3NpYmlsaXR5Q2FjaGVJbXBsLmNwcCcsCiAgICAgICAgICAgICAgICAgJ3Ny
Yy9XZWJBY2Nlc3NpYmlsaXR5Q2FjaGVJbXBsLmgnLApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9t
aXVtL3B1YmxpYy9XZWJNZWRpYVBsYXllci5oIGIvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJN
ZWRpYVBsYXllci5oCmluZGV4IDZmNTEzNDVkMDc0ZWVkZDdjMTk5ZTEwYzM4YTM5OWY5YmQwZGE1
OTUuLjk1NzhkMGQ3NWE4NjVkZWQzM2MwMGJjNTI2MzE3ZGE5N2FjMmMzYjQgMTAwNjQ0Ci0tLSBh
L1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViTWVkaWFQbGF5ZXIuaAorKysgYi9XZWJLaXQvY2hy
b21pdW0vcHVibGljL1dlYk1lZGlhUGxheWVyLmgKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1
ZGUgIldlYkNhbnZhcy5oIgogI2luY2x1ZGUgIldlYlZlY3Rvci5oIgorI2luY2x1ZGUgIldlYlZp
ZGVvRnJhbWUuaCIKIAogbmFtZXNwYWNlIFdlYktpdCB7CiAKQEAgLTEyNyw2ICsxMjgsMTAgQEAg
cHVibGljOgogCiAgICAgdmlydHVhbCBib29sIGhhc1NpbmdsZVNlY3VyaXR5T3JpZ2luKCkgY29u
c3QgPSAwOwogICAgIHZpcnR1YWwgTW92aWVMb2FkVHlwZSBtb3ZpZUxvYWRUeXBlKCkgY29uc3Qg
PSAwOworCisgICAgLy8gRm9yIGdldHRpbmcgZnJhbWVzIHRvIGFuZCBmcm9tIG1lZGlhIHBsYXll
ci4KKyAgICB2aXJ0dWFsIHZvaWQgZ2V0Q3VycmVudEZyYW1lKFdlYlZpZGVvRnJhbWUqKiBvdXRw
dXQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcHV0Q3VycmVudEZyYW1lKFdlYlZpZGVvRnJhbWUq
IGZyYW1lKSA9IDA7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1dl
YktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlkZW9GcmFtZS5oIGIvV2ViS2l0L2Nocm9taXVtL3B1
YmxpYy9XZWJWaWRlb0ZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGM2NWE1Y2QwNmFmYWQyYmM4Y2NmMGQ0
MjAyZjQ4NzliNDc0M2Q0NwotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdC9jaHJvbWl1bS9wdWJs
aWMvV2ViVmlkZW9GcmFtZS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICog
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpZm5kZWYgV2ViVmlkZW9GcmFt
ZV9oCisjZGVmaW5lIFdlYlZpZGVvRnJhbWVfaAorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xh
c3MgV2ViVmlkZW9GcmFtZSB7CisKK3B1YmxpYzoKKyAgICAvLyBUaGVzZSBjb25zdHMvZW51bXMg
bXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBtZWRpYTo6VmlkZW9Gb3JtYXQgYW5kCisgICAgLy8g
V2ViS2l0OjpXZWJWaWRlb0ZyYW1lLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFBsYW5l
cyA9IDM7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1SR0JQbGFuZXMgPSAxOworICAg
IHN0YXRpYyBjb25zdCBzaXplX3Qga1JHQlBsYW5lID0gMDsKKworICAgIHN0YXRpYyBjb25zdCBz
aXplX3Qga051bVlVVlBsYW5lcyA9IDM7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrWVBsYW5l
ID0gMDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtVUGxhbmUgPSAxOworICAgIHN0YXRpYyBj
b25zdCBzaXplX3Qga1ZQbGFuZSA9IDI7CisKKyAgICBlbnVtIEZvcm1hdCB7CisgICAgICAgIElO
VkFMSUQsCisgICAgICAgIFJHQjU1NSwKKyAgICAgICAgUkdCNTY1LAorICAgICAgICBSR0IyNCwK
KyAgICAgICAgUkdCMzIsCisgICAgICAgIFJHQkEsCisgICAgICAgIFlWMTIsCisgICAgICAgIFlW
MTYsCisgICAgICAgIE5WMTIsCisgICAgICAgIEVNUFRZLAorICAgICAgICBBU0NJSSwKKyAgICB9
OworCisgICAgZW51bSBTdXJmYWNlVHlwZSB7CisgICAgICAgIFRZUEVfU1lTVEVNX01FTU9SWSwK
KyAgICAgICAgVFlQRV9PTVhCVUZGRVJIRUFELAorICAgICAgICBUWVBFX0VHTF9JTUFHRSwKKyAg
ICAgICAgVFlQRV9NRkJVRkZFUiwKKyAgICAgICAgVFlQRV9ESVJFQ1QzRFNVUkZBQ0UKKyAgICB9
OworCitwdWJsaWM6CisgICAgdmlydHVhbCBTdXJmYWNlVHlwZSB0eXBlKCkgY29uc3QgPSAwOwor
ICAgIHZpcnR1YWwgRm9ybWF0IGZvcm1hdCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNpemVf
dCB3aWR0aCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNpemVfdCBoZWlnaHQoKSBjb25zdCA9
IDA7CisgICAgdmlydHVhbCBzaXplX3QgcGxhbmVzKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwg
aW50IHN0cmlkZShzaXplX3QgcGxhbmUpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQqIGRh
dGEoc2l6ZV90IHBsYW5lKSBjb25zdCA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQK
KworI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vc3JjL1ZpZGVvRnJhbWVDaHJv
bWl1bUltcGwuY3BwIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9WaWRlb0ZyYW1lQ2hyb21pdW1JbXBs
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi43ZjQ4MTUxM2MxODJlYTYxYmQwOTYxYTMzZWYzNGQyODdiMWJhZjYw
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9WaWRlb0ZyYW1lQ2hyb21p
dW1JbXBsLmNwcApAQCAtMCwwICsxLDc1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgVGhlIENo
cm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3Vy
Y2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisv
LyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiVmlkZW9GcmFtZUNocm9taXVtSW1wbC5oIgorCisjaW5jbHVkZSAiVmlkZW9GcmFtZUNo
cm9taXVtLmgiCisjaW5jbHVkZSAiV2ViVmlkZW9GcmFtZS5oIgorCituYW1lc3BhY2UgV2ViS2l0
IHsKKworV2ViVmlkZW9GcmFtZSogVmlkZW9GcmFtZUNocm9taXVtSW1wbDo6dG9XZWJWaWRlb0Zy
YW1lKFdlYkNvcmU6OlZpZGVvRnJhbWVDaHJvbWl1bSogZnJhbWUpCit7CisgICAgVmlkZW9GcmFt
ZUNocm9taXVtSW1wbCogd3JhcHBlZEZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZUNocm9t
aXVtSW1wbCo+KGZyYW1lKTsKKyAgICBpZiAod3JhcHBlZEZyYW1lKQorICAgICAgICByZXR1cm4g
d3JhcHBlZEZyYW1lLT5tX3dlYkZyYW1lOworICAgIHJldHVybiAwOworfQorCitWaWRlb0ZyYW1l
Q2hyb21pdW1JbXBsOjpWaWRlb0ZyYW1lQ2hyb21pdW1JbXBsKFdlYlZpZGVvRnJhbWUqIGZyYW1l
KSA6CisgICAgbV93ZWJGcmFtZShmcmFtZSkKK3sKK30KKworV2ViQ29yZTo6VmlkZW9GcmFtZUNo
cm9taXVtOjpTdXJmYWNlVHlwZSBWaWRlb0ZyYW1lQ2hyb21pdW1JbXBsOjp0eXBlKCkgY29uc3QK
K3sKKyAgICBpZiAobV93ZWJGcmFtZSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZpZGVv
RnJhbWVDaHJvbWl1bTo6U3VyZmFjZVR5cGU+KG1fd2ViRnJhbWUtPnR5cGUoKSk7CisgICAgcmV0
dXJuIFRZUEVfU1lTVEVNX01FTU9SWTsKK30KKworV2ViQ29yZTo6VmlkZW9GcmFtZUNocm9taXVt
OjpGb3JtYXQgVmlkZW9GcmFtZUNocm9taXVtSW1wbDo6Zm9ybWF0KCkgY29uc3QKK3sKKyAgICBp
ZiAobV93ZWJGcmFtZSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZpZGVvRnJhbWVDaHJv
bWl1bTo6Rm9ybWF0PihtX3dlYkZyYW1lLT5mb3JtYXQoKSk7CisgICAgcmV0dXJuIElOVkFMSUQ7
Cit9CisKK3NpemVfdCBWaWRlb0ZyYW1lQ2hyb21pdW1JbXBsOjp3aWR0aCgpIGNvbnN0Cit7Cisg
ICAgaWYgKG1fd2ViRnJhbWUpCisgICAgICAgIHJldHVybiBtX3dlYkZyYW1lLT53aWR0aCgpOwor
ICAgIHJldHVybiAwOworfQorCitzaXplX3QgVmlkZW9GcmFtZUNocm9taXVtSW1wbDo6aGVpZ2h0
KCkgY29uc3QKK3sKKyAgICBpZiAobV93ZWJGcmFtZSkKKyAgICAgICAgcmV0dXJuIG1fd2ViRnJh
bWUtPmhlaWdodCgpOworICAgIHJldHVybiAwOworfQorCitzaXplX3QgVmlkZW9GcmFtZUNocm9t
aXVtSW1wbDo6cGxhbmVzKCkgY29uc3QKK3sKKyAgICBpZiAobV93ZWJGcmFtZSkKKyAgICAgICAg
cmV0dXJuIG1fd2ViRnJhbWUtPnBsYW5lcygpOworICAgIHJldHVybiAwOworfQorCitpbnQgVmlk
ZW9GcmFtZUNocm9taXVtSW1wbDo6c3RyaWRlKHNpemVfdCBwbGFuZSkgY29uc3QKK3sKKyAgICBp
ZiAobV93ZWJGcmFtZSkKKyAgICAgICAgcmV0dXJuIG1fd2ViRnJhbWUtPnN0cmlkZShwbGFuZSk7
CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQqIFZpZGVvRnJhbWVDaHJvbWl1bUltcGw6OmRhdGEo
c2l6ZV90IHBsYW5lKSBjb25zdAoreworICAgIGlmIChtX3dlYkZyYW1lKQorICAgICAgICByZXR1
cm4gbV93ZWJGcmFtZS0+ZGF0YShwbGFuZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gbmFt
ZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL3NyYy9WaWRlb0ZyYW1l
Q2hyb21pdW1JbXBsLmggYi9XZWJLaXQvY2hyb21pdW0vc3JjL1ZpZGVvRnJhbWVDaHJvbWl1bUlt
cGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi5jMDAxODAwYjQ0M2ZmOGUxYzc0NzQwZWRlMjU5OWE0YWIzMmJmNWUx
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0L2Nocm9taXVtL3NyYy9WaWRlb0ZyYW1lQ2hyb21p
dW1JbXBsLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisg
KiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0
aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZ
UklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVmlkZW9GcmFtZUNocm9taXVtSW1wbF9o
CisjZGVmaW5lIFZpZGVvRnJhbWVDaHJvbWl1bUltcGxfaAorCisjaW5jbHVkZSAiVmlkZW9GcmFt
ZUNocm9taXVtLmgiCisjaW5jbHVkZSAiV2ViVmlkZW9GcmFtZS5oIgorCituYW1lc3BhY2UgV2Vi
S2l0IHsKKworY2xhc3MgVmlkZW9GcmFtZUNocm9taXVtSW1wbCA6IHB1YmxpYyBXZWJDb3JlOjpW
aWRlb0ZyYW1lQ2hyb21pdW0geworCitwdWJsaWM6CisgICAgVmlkZW9GcmFtZUNocm9taXVtSW1w
bChXZWJWaWRlb0ZyYW1lKiB3ZWJfZnJhbWUpOworCisgICAgc3RhdGljIFdlYlZpZGVvRnJhbWUq
IHRvV2ViVmlkZW9GcmFtZShXZWJDb3JlOjpWaWRlb0ZyYW1lQ2hyb21pdW0qIGZyYW1lKTsKKwor
ICAgIHZpcnR1YWwgV2ViQ29yZTo6VmlkZW9GcmFtZUNocm9taXVtOjpTdXJmYWNlVHlwZSB0eXBl
KCkgY29uc3Q7CisgICAgdmlydHVhbCBXZWJDb3JlOjpWaWRlb0ZyYW1lQ2hyb21pdW06OkZvcm1h
dCBmb3JtYXQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNpemVfdCB3aWR0aCgpIGNvbnN0OworICAg
IHZpcnR1YWwgc2l6ZV90IGhlaWdodCgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHBsYW5l
cygpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHN0cmlkZShzaXplX3QgcGxhbmUpIGNvbnN0Owor
ICAgIHZpcnR1YWwgdm9pZCogZGF0YShzaXplX3QgcGxhbmUpIGNvbnN0OworCitwcml2YXRlOgor
ICAgIFdlYlZpZGVvRnJhbWUqIG1fd2ViRnJhbWU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJL
aXQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYk1lZGlhUGxh
eWVyQ2xpZW50SW1wbC5jcHAgYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYk1lZGlhUGxheWVyQ2xp
ZW50SW1wbC5jcHAKaW5kZXggOGYyMTBhMGYzYmU3NzFhZDJhNzIzOWNhY2NkOTQ4NDgyNjYxZDBm
OS4uMGNhYmZkMjM0YWZlOTI3OTM2NWI4YjU2NTc1NDA4ZmE3NTVlY2I2NiAxMDA2NDQKLS0tIGEv
V2ViS2l0L2Nocm9taXVtL3NyYy9XZWJNZWRpYVBsYXllckNsaWVudEltcGwuY3BwCisrKyBiL1dl
YktpdC9jaHJvbWl1bS9zcmMvV2ViTWVkaWFQbGF5ZXJDbGllbnRJbXBsLmNwcApAQCAtMjIsNiAr
MjIsOCBAQAogI2luY2x1ZGUgIlJlbmRlckxheWVyQ29tcG9zaXRvci5oIgogI2VuZGlmCiAKKyNp
bmNsdWRlICJWaWRlb0ZyYW1lQ2hyb21pdW0uaCIKKyNpbmNsdWRlICJWaWRlb0ZyYW1lQ2hyb21p
dW1JbXBsLmgiCiAjaW5jbHVkZSAiV2ViQ2FudmFzLmgiCiAjaW5jbHVkZSAiV2ViQ1N0cmluZy5o
IgogI2luY2x1ZGUgIldlYkZyYW1lQ2xpZW50LmgiCkBAIC00MTYsNiArNDE4LDIzIEBAIE1lZGlh
UGxheWVyOjpNb3ZpZUxvYWRUeXBlIFdlYk1lZGlhUGxheWVyQ2xpZW50SW1wbDo6bW92aWVMb2Fk
VHlwZSgpIGNvbnN0CiAgICAgcmV0dXJuIE1lZGlhUGxheWVyOjpVbmtub3duOwogfQogCit2b2lk
IFdlYk1lZGlhUGxheWVyQ2xpZW50SW1wbDo6Z2V0Q3VycmVudEZyYW1lKFZpZGVvRnJhbWVDaHJv
bWl1bSoqIGZyYW1lT3V0KQoreworICAgICpmcmFtZU91dCA9IDA7CisgICAgaWYgKG1fd2ViTWVk
aWFQbGF5ZXIuZ2V0KCkpIHsKKyAgICAgICAgV2ViVmlkZW9GcmFtZSogd2Via2l0RnJhbWUgPSAw
OworICAgICAgICBtX3dlYk1lZGlhUGxheWVyLT5nZXRDdXJyZW50RnJhbWUoJndlYmtpdEZyYW1l
KTsKKyAgICAgICAgaWYgKHdlYmtpdEZyYW1lKQorICAgICAgICAgICAgKmZyYW1lT3V0ID0gbmV3
IFZpZGVvRnJhbWVDaHJvbWl1bUltcGwod2Via2l0RnJhbWUpOworICAgIH0KK30KKwordm9pZCBX
ZWJNZWRpYVBsYXllckNsaWVudEltcGw6OnB1dEN1cnJlbnRGcmFtZShWaWRlb0ZyYW1lQ2hyb21p
dW0qIGZyYW1lKQoreworICAgIGlmIChtX3dlYk1lZGlhUGxheWVyLmdldCgpKQorICAgICAgICBt
X3dlYk1lZGlhUGxheWVyLT5wdXRDdXJyZW50RnJhbWUoVmlkZW9GcmFtZUNocm9taXVtSW1wbDo6
dG9XZWJWaWRlb0ZyYW1lKGZyYW1lKSk7Cit9CisKIE1lZGlhUGxheWVyUHJpdmF0ZUludGVyZmFj
ZSogV2ViTWVkaWFQbGF5ZXJDbGllbnRJbXBsOjpjcmVhdGUoTWVkaWFQbGF5ZXIqIHBsYXllcikK
IHsKICAgICBXZWJNZWRpYVBsYXllckNsaWVudEltcGwqIGNsaWVudCA9IG5ldyBXZWJNZWRpYVBs
YXllckNsaWVudEltcGwoKTsKQEAgLTQzMyw3ICs0NTIsNyBAQCBNZWRpYVBsYXllclByaXZhdGVJ
bnRlcmZhY2UqIFdlYk1lZGlhUGxheWVyQ2xpZW50SW1wbDo6Y3JlYXRlKE1lZGlhUGxheWVyKiBw
bGF5ZQogICAgICAgICBmcmFtZS0+Y29udGVudFJlbmRlcmVyKCktPmNvbXBvc2l0b3IoKS0+aGFz
QWNjZWxlcmF0ZWRDb21wb3NpdGluZygpOwogCiAgICAgaWYgKGNsaWVudC0+bV9zdXBwb3J0c0Fj
Y2VsZXJhdGVkQ29tcG9zaXRpbmcpCi0gICAgICAgIGNsaWVudC0+bV92aWRlb0xheWVyID0gVmlk
ZW9MYXllckNocm9taXVtOjpjcmVhdGUoMCk7CisgICAgICAgIGNsaWVudC0+bV92aWRlb0xheWVy
ID0gVmlkZW9MYXllckNocm9taXVtOjpjcmVhdGUoMCwgY2xpZW50KTsKICNlbmRpZgogCiAgICAg
cmV0dXJuIGNsaWVudDsKZGlmZiAtLWdpdCBhL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViTWVkaWFQ
bGF5ZXJDbGllbnRJbXBsLmggYi9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYk1lZGlhUGxheWVyQ2xp
ZW50SW1wbC5oCmluZGV4IDBmYWFjMjYzY2EzYjM5MWU3ZjgyYjgzZWFlMjQ3ODQ1MmY4MGZiYjgu
LmNmNWRiMGExZDI2OWRhMjU5ZDk1ZGNhNzA2NWQ2ODFiZThlYWMwNGYgMTAwNjQ0Ci0tLSBhL1dl
YktpdC9jaHJvbWl1bS9zcmMvV2ViTWVkaWFQbGF5ZXJDbGllbnRJbXBsLmgKKysrIGIvV2ViS2l0
L2Nocm9taXVtL3NyYy9XZWJNZWRpYVBsYXllckNsaWVudEltcGwuaApAQCAtMzQsNiArMzQsOCBA
QAogI2lmIEVOQUJMRShWSURFTykKIAogI2luY2x1ZGUgIk1lZGlhUGxheWVyUHJpdmF0ZS5oIgor
I2luY2x1ZGUgIlZpZGVvRnJhbWVDaHJvbWl1bS5oIgorI2luY2x1ZGUgIlZpZGVvRnJhbWVQcm92
aWRlci5oIgogI2luY2x1ZGUgIldlYk1lZGlhUGxheWVyQ2xpZW50LmgiCiAjaW5jbHVkZSA8d3Rm
L093blB0ci5oPgogCkBAIC00NCw4ICs0NiwxMCBAQCBjbGFzcyBXZWJNZWRpYVBsYXllcjsKIAog
Ly8gVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgYSBicmlkZ2UgYmV0d2VlbiBXZWJDb3JlOjpNZWRpYVBs
YXllciBhbmQKIC8vIFdlYktpdDo6V2ViTWVkaWFQbGF5ZXIuCi1jbGFzcyBXZWJNZWRpYVBsYXll
ckNsaWVudEltcGwgOiBwdWJsaWMgV2ViTWVkaWFQbGF5ZXJDbGllbnQKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAsIHB1YmxpYyBXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVJbnRl
cmZhY2UgeworY2xhc3MgV2ViTWVkaWFQbGF5ZXJDbGllbnRJbXBsIDogcHVibGljIFdlYkNvcmU6
Ok1lZGlhUGxheWVyUHJpdmF0ZUludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICwgcHVibGljIFdlYkNvcmU6OlZpZGVvRnJhbWVQcm92aWRlcgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICwgcHVibGljIFdlYk1lZGlhUGxheWVyQ2xpZW50IHsKKwogcHVibGlj
OgogICAgIHN0YXRpYyBib29sIGlzRW5hYmxlZCgpOwogICAgIHN0YXRpYyB2b2lkIHNldElzRW5h
YmxlZChib29sKTsKQEAgLTExMCw2ICsxMTQsMTAgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCBX
ZWJDb3JlOjpNZWRpYVBsYXllcjo6TW92aWVMb2FkVHlwZSBtb3ZpZUxvYWRUeXBlKCkgY29uc3Q7
CiAKKyAgICAvLyBWaWRlb0ZyYW1lUHJvdmlkZXIgaW50ZXJmYWNlCisgICAgdmlydHVhbCB2b2lk
IGdldEN1cnJlbnRGcmFtZShXZWJDb3JlOjpWaWRlb0ZyYW1lQ2hyb21pdW0qKiBmcmFtZU91dCk7
CisgICAgdmlydHVhbCB2b2lkIHB1dEN1cnJlbnRGcmFtZShXZWJDb3JlOjpWaWRlb0ZyYW1lQ2hy
b21pdW0qIGZyYW1lKTsKKwogcHJpdmF0ZToKICAgICBXZWJNZWRpYVBsYXllckNsaWVudEltcGwo
KTsKIAo=
</data>
<flag name="review"
          id="52056"
          type_id="1"
          status="-"
          setter="fishd"
    />
          </attachment>
      

    </bug>

</bugzilla>