<?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>27511</bug_id>
          
          <creation_ts>2009-07-21 12:44:00 -0700</creation_ts>
          <short_desc>Add WinCE specific platform/graphics files to WebCore</short_desc>
          <delta_ts>2012-04-17 08:51:30 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</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>
          <dependson>28150</dependson>
    
    <dependson>28167</dependson>
    
    <dependson>28178</dependson>
    
    <dependson>28188</dependson>
    
    <dependson>28272</dependson>
          <blocked>23154</blocked>
    
    <blocked>27561</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Yong Li">yong.li.webkit</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>manyoso</cc>
    
    <cc>mjs</cc>
    
    <cc>pkasting</cc>
    
    <cc>staikos</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>133561</commentid>
    <comment_count>0</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-21 12:44:00 -0700</bug_when>
    <thetext>not including font-related files. font-related files is added through bug 27509</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133564</commentid>
    <comment_count>1</comment_count>
      <attachid>33202</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-21 13:00:40 -0700</bug_when>
    <thetext>Created attachment 33202
graphics files for WINCE port

not including font-related files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133571</commentid>
    <comment_count>2</comment_count>
      <attachid>33202</attachid>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-07-21 13:08:31 -0700</bug_when>
    <thetext>Comment on attachment 33202
graphics files for WINCE port

Same issue here - LGPL license on files that are entirely new by Torch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133765</commentid>
    <comment_count>3</comment_count>
      <attachid>33262</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-22 07:34:15 -0700</bug_when>
    <thetext>Created attachment 33262
fixed style errors reported by cpplint and added correct license text</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133917</commentid>
    <comment_count>4</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-22 14:52:56 -0700</bug_when>
    <thetext>Seems like some of these would be better suited for platform/image-decoders/wince/ ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133931</commentid>
    <comment_count>5</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-22 15:06:28 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; Seems like some of these would be better suited for
&gt; platform/image-decoders/wince/ ?

You mean ImageDecoderUtilities.*? Hm... seems I should remove them and replace ByteBuffer with Vector&lt;char&gt; in where it&apos;s referenced.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134106</commentid>
    <comment_count>6</comment_count>
      <attachid>33331</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-23 08:27:58 -0700</bug_when>
    <thetext>Created attachment 33331
removed unnecessary files

removed unnecessary files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134139</commentid>
    <comment_count>7</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-23 10:12:14 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Created an attachment (id=33331) [details]
&gt; removed unnecessary files

Your ChangeLog comment is now out-of-date.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134602</commentid>
    <comment_count>8</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-24 10:55:19 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Created an attachment (id=33331) [details]

You probably want to put PNGEncoder.* and JPEGEncoder.* in platform/image-encoders/wince/ (see the skia/ directory that is already there, and contains a PNGImageEncoder.cpp that is very similar to your PNGEncoder.cpp).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134653</commentid>
    <comment_count>9</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-24 14:04:47 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #6)
&gt; &gt; Created an attachment (id=33331) [details] [details]
&gt; 
&gt; You probably want to put PNGEncoder.* and JPEGEncoder.* in
&gt; platform/image-encoders/wince/ (see the skia/ directory that is already there,
&gt; and contains a PNGImageEncoder.cpp that is very similar to your
&gt; PNGEncoder.cpp).

Yes, I copied PNGEncoder code from theirs and did some modifications. JPEGEncoder is written by me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134654</commentid>
    <comment_count>10</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-24 14:07:12 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; Yes, I copied PNGEncoder code from theirs and did some modifications.
&gt; JPEGEncoder is written by me.

Right; putting these alongside the others makes it easier to realize there are multiple copies so we can refactor in a more cross-platform way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134922</commentid>
    <comment_count>11</comment_count>
      <attachid>33546</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-27 08:17:21 -0700</bug_when>
    <thetext>Created attachment 33546
move encoder files to platform/image_encoders/wince</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135961</commentid>
    <comment_count>12</comment_count>
      <attachid>33813</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:11:12 -0700</bug_when>
    <thetext>Created attachment 33813
1) image encoders</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135962</commentid>
    <comment_count>13</comment_count>
      <attachid>33814</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:12:19 -0700</bug_when>
    <thetext>Created attachment 33814
2) SharedBitmap</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135964</commentid>
    <comment_count>14</comment_count>
      <attachid>33815</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:13:13 -0700</bug_when>
    <thetext>Created attachment 33815
3) ImageBuffer</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135965</commentid>
    <comment_count>15</comment_count>
      <attachid>33816</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:13:46 -0700</bug_when>
    <thetext>Created attachment 33816
4) ImageFrameSink</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135966</commentid>
    <comment_count>16</comment_count>
      <attachid>33817</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:14:16 -0700</bug_when>
    <thetext>Created attachment 33817
5) MediaPlayer</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135967</commentid>
    <comment_count>17</comment_count>
      <attachid>33818</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:14:46 -0700</bug_when>
    <thetext>Created attachment 33818
6) Path</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135968</commentid>
    <comment_count>18</comment_count>
      <attachid>33819</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:15:13 -0700</bug_when>
    <thetext>Created attachment 33819
7) Color, Gradient, Image</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135971</commentid>
    <comment_count>19</comment_count>
      <attachid>33820</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:17:20 -0700</bug_when>
    <thetext>Created attachment 33820
7) Color, Gradient, Image</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135975</commentid>
    <comment_count>20</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-30 13:24:21 -0700</bug_when>
    <thetext>Your first patch contains a ChangeLog listing all the files you&apos;ve changed in
total, and your other patches don&apos;t have any ChangeLogs.

ImageFrameSink is basically a copy of the cross-platform ImageDecoder with one
or two small changes.  Would it be better to write this as a patch to
ImageDecoder?

Your implementation of BitmapImage::draw() is incorrect.  StartAnimation() needs to be called before drawing, not after.  Seems like maybe you wrote this implementation a year or two ago.  You might want to go study how the CG or Skia implementations have been modified since then.

Some of your files have vim formatting comments at bottom.  Seems like these should be stripped.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135989</commentid>
    <comment_count>21</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:45:29 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; Your first patch contains a ChangeLog listing all the files you&apos;ve changed in
&gt; total, and your other patches don&apos;t have any ChangeLogs.

I split them for easier review. Hope they can be committed at one time.

&gt; 
&gt; ImageFrameSink is basically a copy of the cross-platform ImageDecoder with one
&gt; or two small changes.  Would it be better to write this as a patch to
&gt; ImageDecoder?
&gt; 

Do you mean RGBA32Buffer? Don&apos;t want to mess it up. Also, I think RGBA32Buffer should be extracted to a separate header.

Hm... just found a problem there: setRGBA there is actuallly set to ARGB. (32bit Bitmap is ARGB by default on windows)

&gt; Your implementation of BitmapImage::draw() is incorrect.  StartAnimation()
&gt; needs to be called before drawing, not after.  Seems like maybe you wrote this
&gt; implementation a year or two ago.  You might want to go study how the CG or
&gt; Skia implementations have been modified since then.

You&apos;re right. Thanks.

&gt; 
&gt; Some of your files have vim formatting comments at bottom.  Seems like these
&gt; should be stripped.

what&apos;s that?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135997</commentid>
    <comment_count>22</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-30 13:58:41 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; (In reply to comment #20)
&gt; &gt; Your first patch contains a ChangeLog listing all the files you&apos;ve changed in
&gt; &gt; total, and your other patches don&apos;t have any ChangeLogs.
&gt; 
&gt; I split them for easier review. Hope they can be committed at one time.

It would be easier for reviewers and anyone landing the patch if each patch was self-contained...

&gt; &gt; ImageFrameSink is basically a copy of the cross-platform ImageDecoder with one
&gt; &gt; or two small changes.  Would it be better to write this as a patch to
&gt; &gt; ImageDecoder?
&gt; &gt; 
&gt; 
&gt; Do you mean RGBA32Buffer? Don&apos;t want to mess it up. Also, I think RGBA32Buffer
&gt; should be extracted to a separate header.

Yes, the RGBA32Buffer inside ImageDecoder.h.

I agree that eventually it should be moved into its own place, but for now it&apos;s not there, and it&apos;s hard to remember that the WinCE port happens to have a completely differently-named implementation living off in a separate place.  When I make changes to the cross-platform version, I&apos;ll likely break your build.

&gt; &gt; Some of your files have vim formatting comments at bottom.  Seems like these
&gt; &gt; should be stripped.
&gt; 
&gt; what&apos;s that?

I guess it&apos;s only ImageSourceWince.cpp.  &quot;// vim: ts=4 sw=4 et&quot; at bottom.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136013</commentid>
    <comment_count>23</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 14:40:45 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; (In reply to comment #21)
&gt; &gt; (In reply to comment #20)

&gt; &gt; 
&gt; &gt; Do you mean RGBA32Buffer? Don&apos;t want to mess it up. Also, I think RGBA32Buffer
&gt; &gt; should be extracted to a separate header.
&gt; 
&gt; Yes, the RGBA32Buffer inside ImageDecoder.h.
&gt; 
&gt; I agree that eventually it should be moved into its own place, but for now it&apos;s
&gt; not there, and it&apos;s hard to remember that the WinCE port happens to have a
&gt; completely differently-named implementation living off in a separate place. 
&gt; When I make changes to the cross-platform version, I&apos;ll likely break your
&gt; build.
&gt; 

OK. I&apos;ll make it shared code with RGBA32Buffer. But, this bug is supposed to only contain new files. The changes in ImageDecoder.h will go to another bug. To reduce the naming change, I&apos;ll &quot;typedef RGBA32Buffer ImageFrameSink;&quot;, what do you think?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136029</commentid>
    <comment_count>24</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-07-30 14:54:14 -0700</bug_when>
    <thetext>(In reply to comment #23)
&gt; OK. I&apos;ll make it shared code with RGBA32Buffer. But, this bug is supposed to
&gt; only contain new files. The changes in ImageDecoder.h will go to another bug.
&gt; To reduce the naming change, I&apos;ll &quot;typedef RGBA32Buffer ImageFrameSink;&quot;, what
&gt; do you think?

Hmm... I&apos;m trying to figure out what the best landing sequence here is, since those ImageDecoder changes might take a while to work through.

Seems like there are a lot of options:

* Land ImageFrameSink as-is, in graphics/wince.  Perhaps add comments atop ImageDecoder.h/ImageFrameSink.h noting the similarities between the two, in hopes that people won&apos;t break your port.  File a new bug about merging the two together.

* Break RGBA32Buffer out of ImageDecoder.h into its own header, but don&apos;t change anything else about it.  Put your versions alongside this header/implementation.  Not sure what the names of each should be at that point.  Hope that this provides enough motivation for people to combine the two eventually.

* Wait until RGBA32Buffer gets pulled out of ImageDecoder and moved over to graphics/.  Modify RGBA32Buffer directly, and rename it something more accurate.  (Although TBH I despise the name &quot;ImageFrameSink&quot; as it feels somewhere between meaningless and inaccurate.  Just &quot;ImageFrame&quot; would probably be better.)

* Various other combinations of the above

It doesn&apos;t seem fair to either force you to refactor all the image classes or make you wait on somebody else to do it (although it would be nice to have help refactoring things...).  Perhaps the first option is the best thing for the WinCE port.  Even though I suggested modifying RGBA32Buffer, I have the feeling it&apos;s going to take some time and effort to examine the changes you&apos;ve made and figure out how to best merge them in to the code everyone else is using (hopefully with few if any #ifdefs).  So maybe a strategy that gets your files into the tree is better...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137014</commentid>
    <comment_count>25</comment_count>
      <attachid>34068</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-04 09:08:56 -0700</bug_when>
    <thetext>Created attachment 34068
7) Color, Gradient, Image

call startAnimation() first</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137016</commentid>
    <comment_count>26</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-04 09:13:52 -0700</bug_when>
    <thetext>(In reply to comment #24)

Yes, the image frame sink stuff is a very big change. We tried to separate it out to avoid affecting other platforms badly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137052</commentid>
    <comment_count>27</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-04 10:43:45 -0700</bug_when>
    <thetext>(In reply to comment #26)
&gt; Yes, the image frame sink stuff is a very big change. We tried to separate it
&gt; out to avoid affecting other platforms badly.

FWIW, I&apos;m in the midst of actively working on the Image subsystem, and I have speculative plans to split RGBA32Buffer out of ImageDecoder.h, rename it, and move it to graphics/ in a week or two.  That might make it slightly easier to modify so that it will work for WinCE too (or it might not help much, not sure).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137066</commentid>
    <comment_count>28</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-04 11:13:24 -0700</bug_when>
    <thetext>(In reply to comment #27)
&gt; (In reply to comment #26)
&gt; &gt; Yes, the image frame sink stuff is a very big change. We tried to separate it
&gt; &gt; out to avoid affecting other platforms badly.
&gt; 
&gt; FWIW, I&apos;m in the midst of actively working on the Image subsystem, and I have
&gt; speculative plans to split RGBA32Buffer out of ImageDecoder.h, rename it, and
&gt; move it to graphics/ in a week or two.  That might make it slightly easier to
&gt; modify so that it will work for WinCE too (or it might not help much, not
&gt; sure).

It&apos;s good to split RGBA32Buffer out, create more generic interface as image decoding buffer, and allow different implementations for different ports or products. Actually our ImageFrameSink is such an interface, and it should be very easy to implement ImageFrameSink with current RGBA32Buffer or Vector&lt;char&gt;. Would you please consider making new RGBA32Buffer as close to ImageFrameSink.h as possible? That could make merging my code easier :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137069</commentid>
    <comment_count>29</comment_count>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-04 11:25:41 -0700</bug_when>
    <thetext>(In reply to comment #28)
&gt; It&apos;s good to split RGBA32Buffer out, create more generic interface as image
&gt; decoding buffer, and allow different implementations for different ports or
&gt; products. Actually our ImageFrameSink is such an interface, and it should be
&gt; very easy to implement ImageFrameSink with current RGBA32Buffer or
&gt; Vector&lt;char&gt;. Would you please consider making new RGBA32Buffer as close to
&gt; ImageFrameSink.h as possible? That could make merging my code easier :)

   If Peter wants to have this, and your patch provides this, then breaking it out into a separate patch should be sufficient to solve everyones&apos; problems I think.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137076</commentid>
    <comment_count>30</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-04 11:46:23 -0700</bug_when>
    <thetext>(In reply to comment #28)
&gt; It&apos;s good to split RGBA32Buffer out, create more generic interface as image
&gt; decoding buffer, and allow different implementations for different ports or
&gt; products.

The very first patch will just move it somewhere without changing the implementation.  The next thing I&apos;d like to do afterward is take a hard look at your ImageFrameSink and see if I can figure out how to add those capabilities to the existing cross-plaform code in a way that doesn&apos;t require tons of #ifdefs.

&gt; it should be
&gt; very easy to implement ImageFrameSink with current RGBA32Buffer

Yes, one possibility before this functionality gets included directly (or perhaps in place of doing that?) would be to make your ImageFrameSink a subclass of this other class and simply extend it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138075</commentid>
    <comment_count>31</comment_count>
      <attachid>33813</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-07 13:05:10 -0700</bug_when>
    <thetext>Comment on attachment 33813
1) image encoders

Why do you need image encoders?  More information is needed in your ChangeLog. Also, you should get pkasting to look at this as he&apos;s most familiar with our encoder/decoder stuff.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138082</commentid>
    <comment_count>32</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-07 13:12:25 -0700</bug_when>
    <thetext>(In reply to comment #31)
&gt; (From update of attachment 33813 [details])
&gt; Why do you need image encoders?  More information is needed in your ChangeLog.

I think this is obvious. We need image encoders to support the canvas feature of saving image buffer to data url. See platform/image-encoders. There&apos;s already a &quot;skia&quot; folder.

&gt; Also, you should get pkasting to look at this as he&apos;s most familiar with our
&gt; encoder/decoder stuff.

Yes, we had talks. He suggested to move wince image encoders to this folder.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138092</commentid>
    <comment_count>33</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-07 13:19:07 -0700</bug_when>
    <thetext>(In reply to comment #32)
&gt; (In reply to comment #31)
&gt; &gt; Also, you should get pkasting to look at this as he&apos;s most familiar with our
&gt; &gt; encoder/decoder stuff.
&gt; 
&gt; Yes, we had talks. He suggested to move wince image encoders to this folder.

Note that I never actually looked at the code.

It would be even more awesome if the cross-platform bits were factored into a common file and then you had platform-specific extensions for skia and wince.  If you&apos;re not planning on doing that before landing, are you planning to do it after landing?  (I did a similar &quot;refactor after landing&quot; with the skia image decoders.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138094</commentid>
    <comment_count>34</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-07 13:25:20 -0700</bug_when>
    <thetext>(In reply to comment #33)
&gt; (In reply to comment #32)
&gt; &gt; (In reply to comment #31)
&gt; &gt; &gt; Also, you should get pkasting to look at this as he&apos;s most familiar with our
&gt; &gt; &gt; encoder/decoder stuff.
&gt; &gt; 
&gt; &gt; Yes, we had talks. He suggested to move wince image encoders to this folder.
&gt; 
&gt; Note that I never actually looked at the code.
&gt; 
&gt; It would be even more awesome if the cross-platform bits were factored into a
&gt; common file and then you had platform-specific extensions for skia and wince. 
&gt; If you&apos;re not planning on doing that before landing, are you planning to do it
&gt; after landing?  (I did a similar &quot;refactor after landing&quot; with the skia image
&gt; decoders.)

Yes, that would be awesome. The platform-specific issue is that the image format in source buffer is differently. Except that, our png encoder is just a clone of the skia png encoder. And our jpeg encoder can be used for other ports with a little bit modification, too. I would like to do it when I get time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138154</commentid>
    <comment_count>35</comment_count>
      <attachid>33814</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-07 14:35:42 -0700</bug_when>
    <thetext>Comment on attachment 33814
2) SharedBitmap

r- for lack of ChagneLog.

Please run check-webkit-style.

g_ is not a pattern we use:
 static SharedBitmap::DrawPatternFunc g_drawPattern = 0;
 52 static SharedBitmap::DrawImageFunc g_drawImage = 0;


This can&apos;t be the only place in the project we need this?
 54 static inline int stableRound(double d)
please look for other implementations.

What is this class even for?  Please explain in a ChagneLog.

Why crateInstance instead of create?
 77 PassRefPtr&lt;SharedBitmap&gt; SharedBitmap::createInstance(bool is16bit, int w, int h, bool initPixels)

Indent:
SharedBitmap::SharedBitmap(const BitmapInfo&amp; bmpInfo, HBITMAP hbmp, void* pixels)
 88 : m_bmpInfo(bmpInfo)
 89 , m_locked(false)
 90 

Please have george review your patches before posting again.  These are not nearly ready.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138155</commentid>
    <comment_count>36</comment_count>
      <attachid>33815</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-07 14:37:31 -0700</bug_when>
    <thetext>Comment on attachment 33815
3) ImageBuffer

No ChangeLog.  r-

Please have George review your patches before posting again.  As demonstrated by the previous 2 patches, these are not ready for real review yet and posting them for review with George at least looking at them is just wasting other folks time.  George should be helping his contractors to follow the WebKit process, not depending on reviewers to teach you all.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138156</commentid>
    <comment_count>37</comment_count>
      <attachid>33816</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-07 14:38:29 -0700</bug_when>
    <thetext>Comment on attachment 33816
4) ImageFrameSink

No ChangeLog.  r-.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138157</commentid>
    <comment_count>38</comment_count>
      <attachid>33817</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-07 14:38:37 -0700</bug_when>
    <thetext>Comment on attachment 33817
5) MediaPlayer

No ChangeLog.  r-.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138158</commentid>
    <comment_count>39</comment_count>
      <attachid>33818</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-07 14:38:42 -0700</bug_when>
    <thetext>Comment on attachment 33818
6) Path

No ChangeLog.  r-.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138159</commentid>
    <comment_count>40</comment_count>
      <attachid>34068</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-07 14:38:49 -0700</bug_when>
    <thetext>Comment on attachment 34068
7) Color, Gradient, Image

No ChangeLog.  r-.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138160</commentid>
    <comment_count>41</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-07 14:39:46 -0700</bug_when>
    <thetext>Please do this in multiple bugs, not just one bug.  And please make sure that you have George, or Nikolas, or some other experienced TorchMobile WebKit contributer work with you before posting these again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138170</commentid>
    <comment_count>42</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-07 14:51:07 -0700</bug_when>
    <thetext>(In reply to comment #36)
&gt; (From update of attachment 33815 [details])
&gt; No ChangeLog.  r-
&gt; 
&gt; Please have George review your patches before posting again.  As demonstrated
&gt; by the previous 2 patches, these are not ready for real review yet and posting
&gt; them for review with George at least looking at them is just wasting other
&gt; folks time.  George should be helping his contractors to follow the WebKit
&gt; process, not depending on reviewers to teach you all.

Sorry for wasting your time</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138174</commentid>
    <comment_count>43</comment_count>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-07 14:55:43 -0700</bug_when>
    <thetext>(In reply to comment #36)
&gt; (From update of attachment 33815 [details])
&gt; No ChangeLog.  r-
&gt; 
&gt; Please have George review your patches before posting again.  As demonstrated
&gt; by the previous 2 patches, these are not ready for real review yet and posting
&gt; them for review with George at least looking at them is just wasting other
&gt; folks time.  George should be helping his contractors to follow the WebKit
&gt; process, not depending on reviewers to teach you all.

I can review all I want but they&apos;re here because other people should see them.  I&apos;m not a babysitter and I don&apos;t work for you.  If it&apos;s such a problem, don&apos;t review them and leave them for someone else.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138178</commentid>
    <comment_count>44</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-07 15:01:57 -0700</bug_when>
    <thetext>(In reply to comment #43)
&gt; (In reply to comment #36)
&gt; &gt; (From update of attachment 33815 [details] [details])
&gt; &gt; No ChangeLog.  r-
&gt; &gt; 
&gt; &gt; Please have George review your patches before posting again.  As demonstrated
&gt; &gt; by the previous 2 patches, these are not ready for real review yet and posting
&gt; &gt; them for review with George at least looking at them is just wasting other
&gt; &gt; folks time.  George should be helping his contractors to follow the WebKit
&gt; &gt; process, not depending on reviewers to teach you all.
&gt; 
&gt; I can review all I want but they&apos;re here because other people should see them. 
&gt; I&apos;m not a babysitter and I don&apos;t work for you.  If it&apos;s such a problem, don&apos;t
&gt; review them and leave them for someone else.

I don&apos;t work for you either. :)  You are paying these people to contribute to WebKit.  The WinCE patches have been an undue burden on the WebKit review queue as of late.  I know, because I just read through it twice in 2 days and reviewed most of the 50 bugs we just closed out. :)

I just ask that you work with the people you hire to improve the quality of patches posted to the review queue.  I&apos;m very happy to review patches form the WinCE folks.  I just ask that they have a prayer of passing review before being posted.  In the case of this bug none of the patches even had ChangeLogs, let alone passing WebKit style.  In other bugs much of my r-ing of WinCE patches was about copy/paste code and patch size.

It seems that at least the lack of ChangeLogs, style issues (check-webkit-style) and patch size should be easy for you to work with the people you&apos;ve hired to work on WebKit to solve.  Just as I work actively with the Google contributers to make sure that they are following WebKit process. :)

Thanks for your understanding.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138181</commentid>
    <comment_count>45</comment_count>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-07 15:09:40 -0700</bug_when>
    <thetext>(In reply to comment #44)
&gt; It seems that at least the lack of ChangeLogs, style issues
&gt; (check-webkit-style) and patch size should be easy for you to work with the
&gt; people you&apos;ve hired to work on WebKit to solve.  Just as I work actively with
&gt; the Google contributers to make sure that they are following WebKit process. :)
&gt; 
&gt; Thanks for your understanding.

I would like to say that your repeated notes of check-webkit-style seem out of place to me.  I know that Yong has been using this tool in submitting these patches. What&apos;s more, we have contributed an equal or greater amount of the current check-webkit-style checks and bugfixes as anyone else in the process of this upstreaming project.

In spite of all this, you should note that check-webkit-style is just a tool and an error prone one at that.  It has many false positives and it doesn&apos;t catch lots of style violations that it should.  We&apos;re trying to improve the tool and our code at the same time.

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138184</commentid>
    <comment_count>46</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-07 15:14:08 -0700</bug_when>
    <thetext>(In reply to comment #44)
&gt; (In reply to comment #43)
&gt; &gt; (In reply to comment #36)
&gt; &gt; &gt; (From update of attachment 33815 [details] [details] [details])
&gt; &gt; &gt; No ChangeLog.  r-
&gt; &gt; &gt; 
&gt; &gt; &gt; Please have George review your patches before posting again.  As demonstrated
&gt; &gt; &gt; by the previous 2 patches, these are not ready for real review yet and posting
&gt; &gt; &gt; them for review with George at least looking at them is just wasting other
&gt; &gt; &gt; folks time.  George should be helping his contractors to follow the WebKit
&gt; &gt; &gt; process, not depending on reviewers to teach you all.
&gt; &gt; 
&gt; &gt; I can review all I want but they&apos;re here because other people should see them. 
&gt; &gt; I&apos;m not a babysitter and I don&apos;t work for you.  If it&apos;s such a problem, don&apos;t
&gt; &gt; review them and leave them for someone else.
&gt; 
&gt; I don&apos;t work for you either. :)  You are paying these people to contribute to
&gt; WebKit.  The WinCE patches have been an undue burden on the WebKit review queue
&gt; as of late. I know, because I just read through it twice in 2 days and
&gt; reviewed most of the 50 bugs we just closed out. :)
&gt; 
&gt; I just ask that you work with the people you hire to improve the quality of
&gt; patches posted to the review queue.  I&apos;m very happy to review patches form the
&gt; WinCE folks.  I just ask that they have a prayer of passing review before being
&gt; posted.  In the case of this bug none of the patches even had ChangeLogs, let
&gt; alone passing WebKit style.  In other bugs much of my r-ing of WinCE patches
&gt; was about copy/paste code and patch size.
&gt; 
&gt; It seems that at least the lack of ChangeLogs, style issues
&gt; (check-webkit-style) and patch size should be easy for you to work with the
&gt; people you&apos;ve hired to work on WebKit to solve.  Just as I work actively with
&gt; the Google contributers to make sure that they are following WebKit process. :)
&gt; 
&gt; Thanks for your understanding.

The ChangeLog is all in the first patch. Peter Kasting has pointed out that we should split the ChangeLog into different patches. We&apos;re going to do that anyway. But the source files are still good to review. Recently we post a lot of patches for WINCE port, because we have worked on this for more than 1.5 years, and just started upstreaming. But we don&apos;t expect that they can be committed in short time. We&apos;re not pushing you. But this kind of review ( r- with &quot;No ChangeLog&quot; ) won&apos;t take more than 0.5 min, right? Thanks for reviewing and commenting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138193</commentid>
    <comment_count>47</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2009-08-07 15:38:40 -0700</bug_when>
    <thetext>Eric has a good point that the system works better if patches are submitted with simple structural issues addressed. However, we should also make an effort to be courteous to new contributors, even if their first few patches have some basic mistakes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138412</commentid>
    <comment_count>48</comment_count>
      <attachid>34391</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 13:12:31 -0700</bug_when>
    <thetext>Created attachment 34391
1) Image encoders</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138413</commentid>
    <comment_count>49</comment_count>
      <attachid>34392</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 13:27:45 -0700</bug_when>
    <thetext>Created attachment 34392
2) SharedBitmap</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138414</commentid>
    <comment_count>50</comment_count>
      <attachid>34393</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 13:29:07 -0700</bug_when>
    <thetext>Created attachment 34393
2) SharedBitmap</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138415</commentid>
    <comment_count>51</comment_count>
      <attachid>34394</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 13:32:28 -0700</bug_when>
    <thetext>Created attachment 34394
3) ImageBuffer</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138416</commentid>
    <comment_count>52</comment_count>
      <attachid>34395</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 13:36:52 -0700</bug_when>
    <thetext>Created attachment 34395
4) ImageFrameSink (used as image decoding buffer)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138419</commentid>
    <comment_count>53</comment_count>
      <attachid>34396</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 13:40:48 -0700</bug_when>
    <thetext>Created attachment 34396
5) MediaPlayer

Written by Crystal Zhang</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138423</commentid>
    <comment_count>54</comment_count>
      <attachid>34398</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 13:47:12 -0700</bug_when>
    <thetext>Created attachment 34398
6) Path PlatformPath</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138425</commentid>
    <comment_count>55</comment_count>
      <attachid>34400</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 13:53:55 -0700</bug_when>
    <thetext>Created attachment 34400
7) Image ImageSource</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138426</commentid>
    <comment_count>56</comment_count>
      <attachid>34401</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 13:54:27 -0700</bug_when>
    <thetext>Created attachment 34401
8) Color Gradient</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138457</commentid>
    <comment_count>57</comment_count>
      <attachid>34391</attachid>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-08 17:27:07 -0700</bug_when>
    <thetext>Comment on attachment 34391
1) Image encoders

Since Eric has asked for some of my comments in the past, I decided to comment on the first patch on here as if I were a reviewer.  Perhaps you&apos;ll find these useful.

&gt; +struct jpeg_dest_mgr {
&gt; +    struct jpeg_destination_mgr pub;
&gt; +    Vector&lt;char&gt; buffer;
&gt; +    Vector&lt;char&gt;* dump;
&gt; +};

Naming style (here and below)

&gt; +void jpeg_init_destination(j_compress_ptr compressData)
&gt; +{
&gt; +    jpeg_dest_mgr* dest = (jpeg_dest_mgr*)compressData-&gt;dest;
&gt; +    dest-&gt;buffer.resize(4096);
&gt; +    dest-&gt;pub.next_output_byte  = (JOCTET*)dest-&gt;buffer.data();
&gt; +    dest-&gt;pub.free_in_buffer    = dest-&gt;buffer.size();
&gt; +}

Please use C++-style casts (here and below)

&gt; +bool compressBitmapToJpeg(SharedBitmap* bmp, Vector&lt;char&gt;&amp; jpegData)
&gt; +{
&gt; +    struct jpeg_compress_struct compressData= {0};

Spacing (here and below)

&gt; +    Vector&lt;JSAMPLE, 2048&gt; rowBuffer;
&gt; +    if (setjmp(err.setjmp_buffer)) {
&gt; +        jpeg_destroy_compress(&amp;compressData);
&gt; +        return false;
&gt; +    }
&gt; +
&gt; +    jpeg_start_compress(&amp;compressData, TRUE);
&gt; +
&gt; +    rowBuffer.resize(compressData.image_width * 3);

Why not declare rowBuffer just above this last line?

Also, the 2k capacity value seems arbitrary.  How do we know that that&apos;s a good value?  Why not just:
    Vector&lt;JSAMPLE&gt; rowBuffer(compressData.image_width * 3);
?

&gt; +    if (bmp-&gt;is16bit()) {
&gt; +        int paddedWidth = bmp-&gt;bitmapInfo().paddedWidth();
&gt; +        int skip = paddedWidth - compressData.image_width;

A more descriptive name might be |scanlinePadding| or similar.

&gt; +        for (; pixel &lt; pixelEnd; pixel += skip) {
&gt; +            JSAMPLE* dst = rowBuffer.data();
&gt; +            for (const unsigned short* rowEnd = pixel + compressData.image_width; pixel &lt; rowEnd;) {
&gt; +                unsigned short value = *pixel++;

Might be a little clearer to do:
for (...; ...; ++pixel) {
    unsigned short value = *pixel;

&gt; +#if IMAGE_NO_ALPHA_USE_RGB555
&gt; +                *dst++ = JSAMPLE((value &gt;&gt; 7) &amp; 0xF8);
&gt; +                *dst++ = JSAMPLE((value &gt;&gt; 2) &amp; 0xF8);
&gt; +                *dst++ = JSAMPLE((value &lt;&lt; 3) &amp; 0xF8);
&gt; +#else

Might want an end-of-line comment on each #if with the bit format for clarity, e.g. // xrrrrrgg gggbbbbb
And perhaps one on each write to *dst with which component is being written, e.g. // R

&gt; +        for (; pixel &lt; pixelEnd; ) {

I find &quot;while (pixel &lt; pixelEnd) {&quot; clearer.

&gt; --- /dev/null
&gt; +++ b/WebCore/platform/image-encoders/wince/PNGEncoder.cpp
&gt; @@ -0,0 +1,167 @@
&gt; +/*
&gt; + * Copyright (c) 2006-2009, Google Inc. All rights reserved.
&gt; + * Copyright (c) 2009 Torch Mobile, Inc. All rights reserved.

Food for thought: One thing that might make this easier to review would be to first land a direct copy of the Skia files, then land a patch with your diffs.

&gt; +    int byteDepth = bmp-&gt;is16bit() ? 3 : 4;
&gt; +    Vector&lt;unsigned char, 2048&gt; rowBuffer;
&gt; +    rowBuffer.resize(bmp-&gt;width() * byteDepth);

Same capacity/size comment as in JPEG encoder.

&gt; +    if (bmp-&gt;is16bit()) {
&gt; +        unsigned short* src = (unsigned short*)bmp-&gt;bytes();
&gt; +        for (int y = 0; y &lt; (int)bmp-&gt;height(); ++y) {

C++-style casts please (here and below)

&gt; +#if IMAGE_NO_ALPHA_USE_RGB555
&gt; +                *dst++ = unsigned char((value &gt;&gt; 7) &amp; 0xF8);
&gt; +                *dst++ = unsigned char((value &gt;&gt; 2) &amp; 0xF8);
&gt; +                *dst++ = unsigned char((value &lt;&lt; 3) &amp; 0xF8);
&gt; +#else
&gt; +                *dst++ = unsigned char((value &gt;&gt; 8) &amp; 0xF8);
&gt; +                *dst++ = unsigned char((value &gt;&gt; 3) &amp; 0xFC);
&gt; +                *dst++ = unsigned char((value &lt;&lt; 3) &amp; 0xF8);
&gt; +#endif

Same suggestions re: EOL comments as in JPEG encoder.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138462</commentid>
    <comment_count>58</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 18:28:21 -0700</bug_when>
    <thetext>(In reply to comment #57)
&gt; (From update of attachment 34391 [details])
&gt; Since Eric has asked for some of my comments in the past, I decided to comment
&gt; on the first patch on here as if I were a reviewer.  Perhaps you&apos;ll find these
&gt; useful.

Yes, very useful. Thanks.

&gt; 
&gt; &gt; +struct jpeg_dest_mgr {
&gt; &gt; +    struct jpeg_destination_mgr pub;
&gt; &gt; +    Vector&lt;char&gt; buffer;
&gt; &gt; +    Vector&lt;char&gt;* dump;
&gt; &gt; +};
&gt; 
&gt; Naming style (here and below)

I see { should be in the next line here. I&apos;m told that &quot;m_&quot; should not be used for &quot;struct&quot;

&gt; 
&gt; &gt; +void jpeg_init_destination(j_compress_ptr compressData)
&gt; &gt; +{
&gt; &gt; +    jpeg_dest_mgr* dest = (jpeg_dest_mgr*)compressData-&gt;dest;
&gt; &gt; +    dest-&gt;buffer.resize(4096);
&gt; &gt; +    dest-&gt;pub.next_output_byte  = (JOCTET*)dest-&gt;buffer.data();
&gt; &gt; +    dest-&gt;pub.free_in_buffer    = dest-&gt;buffer.size();
&gt; &gt; +}
&gt; 
&gt; Please use C++-style casts (here and below)
&gt; 

ok.

&gt; &gt; +bool compressBitmapToJpeg(SharedBitmap* bmp, Vector&lt;char&gt;&amp; jpegData)
&gt; &gt; +{
&gt; &gt; +    struct jpeg_compress_struct compressData= {0};
&gt; 
&gt; Spacing (here and below)

ok. Maybe we found a bug of check_webkit_style? :)

&gt; 
&gt; &gt; +    Vector&lt;JSAMPLE, 2048&gt; rowBuffer;
&gt; &gt; +    if (setjmp(err.setjmp_buffer)) {
&gt; &gt; +        jpeg_destroy_compress(&amp;compressData);
&gt; &gt; +        return false;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    jpeg_start_compress(&amp;compressData, TRUE);
&gt; &gt; +
&gt; &gt; +    rowBuffer.resize(compressData.image_width * 3);
&gt; 
&gt; Why not declare rowBuffer just above this last line?

Good catch
&gt; 
&gt; Also, the 2k capacity value seems arbitrary.  How do we know that that&apos;s a good
&gt; value?  Why not just:
&gt;     Vector&lt;JSAMPLE&gt; rowBuffer(compressData.image_width * 3);
&gt; ?
try to benefit from inline vector. if total bytes of a row is less than 2k, we don&apos;t need to allocate memory from heap.

&gt; 
&gt; &gt; +    if (bmp-&gt;is16bit()) {
&gt; &gt; +        int paddedWidth = bmp-&gt;bitmapInfo().paddedWidth();
&gt; &gt; +        int skip = paddedWidth - compressData.image_width;
&gt; 
&gt; A more descriptive name might be |scanlinePadding| or similar.
&gt; 
&gt; &gt; +        for (; pixel &lt; pixelEnd; pixel += skip) {
&gt; &gt; +            JSAMPLE* dst = rowBuffer.data();
&gt; &gt; +            for (const unsigned short* rowEnd = pixel + compressData.image_width; pixel &lt; rowEnd;) {
&gt; &gt; +                unsigned short value = *pixel++;
&gt; 
&gt; Might be a little clearer to do:
&gt; for (...; ...; ++pixel) {
&gt;     unsigned short value = *pixel;

*foo++ is very popular in image processing code. Not sure if it can help compiler optimization.

&gt; 
&gt; &gt; +#if IMAGE_NO_ALPHA_USE_RGB555
&gt; &gt; +                *dst++ = JSAMPLE((value &gt;&gt; 7) &amp; 0xF8);
&gt; &gt; +                *dst++ = JSAMPLE((value &gt;&gt; 2) &amp; 0xF8);
&gt; &gt; +                *dst++ = JSAMPLE((value &lt;&lt; 3) &amp; 0xF8);
&gt; &gt; +#else
&gt; 
&gt; Might want an end-of-line comment on each #if with the bit format for clarity,
&gt; e.g. // xrrrrrgg gggbbbbb
&gt; And perhaps one on each write to *dst with which component is being written,
&gt; e.g. // R
&gt; 
&gt; &gt; +        for (; pixel &lt; pixelEnd; ) {
&gt; 
&gt; I find &quot;while (pixel &lt; pixelEnd) {&quot; clearer.

Seems webkit prefer &quot;while&quot; to &quot;for&quot;. Somehow I started hating &quot;while&quot; a few years ago.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138467</commentid>
    <comment_count>59</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-08 22:27:11 -0700</bug_when>
    <thetext>(In reply to comment #58)
&gt; &gt; &gt; +struct jpeg_dest_mgr {
&gt; &gt; &gt; +    struct jpeg_destination_mgr pub;
&gt; &gt; &gt; +    Vector&lt;char&gt; buffer;
&gt; &gt; &gt; +    Vector&lt;char&gt;* dump;
&gt; &gt; &gt; +};
&gt; &gt; 
&gt; &gt; Naming style (here and below)
&gt; 
&gt; I see { should be in the next line here. I&apos;m told that &quot;m_&quot; should not be used
&gt; for &quot;struct&quot;

Based on http://webkit.org/coding/coding-style.html , the struct name should be CamelCase (with the first letter capitalized), and the members should have m_ (I don&apos;t see an exception for structs and haven&apos;t heard this before).  Also the names should be more descriptive than &quot;dest_mgr&quot; or &quot;pub&quot;; use full words where possible.

&gt; &gt; Also, the 2k capacity value seems arbitrary.  How do we know that that&apos;s a good
&gt; &gt; value?  Why not just:
&gt; &gt;     Vector&lt;JSAMPLE&gt; rowBuffer(compressData.image_width * 3);
&gt; &gt; ?
&gt; try to benefit from inline vector. if total bytes of a row is less than 2k, we
&gt; don&apos;t need to allocate memory from heap.

I haven&apos;t used this technique with the WTF library so I&apos;m pretty ignorant of its implementation detail.  If you don&apos;t declare the 2k capacity, is the vector guaranteed to heap-allocate no matter the size, or would it still do something smart for you under the hood?  How was 2k picked here -- was it arbitrary, or based on some data?  Is there a downside other than stack usage?  Comments would be helpful.

&gt; &gt; &gt; +            for (const unsigned short* rowEnd = pixel + compressData.image_width; pixel &lt; rowEnd;) {
&gt; &gt; &gt; +                unsigned short value = *pixel++;
&gt; &gt; 
&gt; &gt; Might be a little clearer to do:
&gt; &gt; for (...; ...; ++pixel) {
&gt; &gt;     unsigned short value = *pixel;
&gt; 
&gt; *foo++ is very popular in image processing code. Not sure if it can help
&gt; compiler optimization.

I cannot speak with perfect authority, but I did spend five years as a compiler engineer, and my impression is that your code is if anything less likely to be optimized than my suggestion.  (It&apos;s very likely the two generate the same code.)

It would be awesome if you had some sort of testcase that exercised a lot of this code in a way that could be timed.  Of course benchmarking inner loops is tricky given the effects of processor caches and the like, but such a thing would be immensely valuable in the future, where I believe we&apos;ll try to rearchitect the Image system to include the capabilities you need more directly, instead of as something of a fork (like you&apos;ve had to maintain until now).  It would help reassure me that, for example, replacing some particular pixel-writing loop with a call to an inlined function did not actually hurt performance.  Otherwise, the best we can do is probably manual assembly inspection which is pretty error-prone when determining real perf.

&gt; &gt; &gt; +        for (; pixel &lt; pixelEnd; ) {
&gt; &gt; 
&gt; &gt; I find &quot;while (pixel &lt; pixelEnd) {&quot; clearer.
&gt; 
&gt; Seems webkit prefer &quot;while&quot; to &quot;for&quot;. Somehow I started hating &quot;while&quot; a few
&gt; years ago.

I think I&apos;m a bigger fan of for() (over while()) than most, since I tend to get nitpicky about minimizing variable scopes.  But in the case where there is no index variable declared and no iteration clause, while() means precisely what you&apos;re doing, whereas for() just results in adding ; ; and making things more opaque.  Precision in syntax is a virtue...

Anyway, glad you found the comments helpful.  I haven&apos;t reviewed the other patches, other things might arise there.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138495</commentid>
    <comment_count>60</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-09 06:36:50 -0700</bug_when>
    <thetext>(In reply to comment #59)
&gt; (In reply to comment #58)
&gt; &gt; &gt; &gt; +struct jpeg_dest_mgr {
&gt; &gt; &gt; &gt; +    struct jpeg_destination_mgr pub;
&gt; &gt; &gt; &gt; +    Vector&lt;char&gt; buffer;
&gt; &gt; &gt; &gt; +    Vector&lt;char&gt;* dump;
&gt; &gt; &gt; &gt; +};
&gt; &gt; &gt; 
&gt; &gt; &gt; Naming style (here and below)
&gt; &gt; 
&gt; &gt; I see { should be in the next line here. I&apos;m told that &quot;m_&quot; should not be used
&gt; &gt; for &quot;struct&quot;
&gt; 
&gt; Based on http://webkit.org/coding/coding-style.html , the struct name should be
&gt; CamelCase (with the first letter capitalized), and the members should have m_
&gt; (I don&apos;t see an exception for structs and haven&apos;t heard this before).  Also the
&gt; names should be more descriptive than &quot;dest_mgr&quot; or &quot;pub&quot;; use full words where
&gt; possible.
&gt; 
&gt; &gt; &gt; Also, the 2k capacity value seems arbitrary.  How do we know that that&apos;s a good
&gt; &gt; &gt; value?  Why not just:
&gt; &gt; &gt;     Vector&lt;JSAMPLE&gt; rowBuffer(compressData.image_width * 3);
&gt; &gt; &gt; ?
&gt; &gt; try to benefit from inline vector. if total bytes of a row is less than 2k, we
&gt; &gt; don&apos;t need to allocate memory from heap.
&gt; 
&gt; I haven&apos;t used this technique with the WTF library so I&apos;m pretty ignorant of
&gt; its implementation detail.  If you don&apos;t declare the 2k capacity, is the vector
&gt; guaranteed to heap-allocate no matter the size, or would it still do something
&gt; smart for you under the hood?  How was 2k picked here -- was it arbitrary, or
&gt; based on some data?  Is there a downside other than stack usage?  Comments
&gt; would be helpful.
&gt; 
Heap allocation is slower than stack allocation. 2K is arbitrary.

&gt; &gt; &gt; &gt; +            for (const unsigned short* rowEnd = pixel + compressData.image_width; pixel &lt; rowEnd;) {
&gt; &gt; &gt; &gt; +                unsigned short value = *pixel++;
&gt; &gt; &gt; 
&gt; &gt; &gt; Might be a little clearer to do:
&gt; &gt; &gt; for (...; ...; ++pixel) {
&gt; &gt; &gt;     unsigned short value = *pixel;
&gt; &gt; 
&gt; &gt; *foo++ is very popular in image processing code. Not sure if it can help
&gt; &gt; compiler optimization.
&gt; 
&gt; I cannot speak with perfect authority, but I did spend five years as a compiler
&gt; engineer, and my impression is that your code is if anything less likely to be
&gt; optimized than my suggestion.  (It&apos;s very likely the two generate the same
&gt; code.)
&gt; 
&gt; It would be awesome if you had some sort of testcase that exercised a lot of
&gt; this code in a way that could be timed.  Of course benchmarking inner loops is
&gt; tricky given the effects of processor caches and the like, but such a thing
&gt; would be immensely valuable in the future, where I believe we&apos;ll try to
&gt; rearchitect the Image system to include the capabilities you need more
&gt; directly, instead of as something of a fork (like you&apos;ve had to maintain until
&gt; now).  It would help reassure me that, for example, replacing some particular
&gt; pixel-writing loop with a call to an inlined function did not actually hurt
&gt; performance.  Otherwise, the best we can do is probably manual assembly
&gt; inspection which is pretty error-prone when determining real perf.

In the case that compiler doesn&apos;t optimize, *foo++ may result this kind of machine code 
1) move foo to register
2) save *foo to register or some variable
3) increase the register by one that keeps foo
4) save the register back to stack

But if ++foo is called later, then = *foo moves foo to register once, and later ++foo does that again.

Of course, most compilers may be smart enough to optimize this when they find foo is not used in-between *foo and ++foo. Long time ago, it was said smaller C/C++ code could result fast machine code. This may be the reason why there&apos;s &quot;++&quot; operator in C. Because &quot;foo += 1&quot; is even more readable.

But the point is not that, I have no problem with choosing either one. I just think it may be a time waste on such small things. Each C++ programmer has his personal programming style, because everyone has different mind. I agree with that some basic coding style rules do help, but too many brainwashing things just reduce the fun of C++ programming and waste time. I believe that you would write very different code if you implemented it. If the reviewer was me, probably you would be asked to change *foo and ++foo to *foo++.

&gt; 
&gt; &gt; &gt; &gt; +        for (; pixel &lt; pixelEnd; ) {
&gt; &gt; &gt; 
&gt; &gt; &gt; I find &quot;while (pixel &lt; pixelEnd) {&quot; clearer.
&gt; &gt; 
&gt; &gt; Seems webkit prefer &quot;while&quot; to &quot;for&quot;. Somehow I started hating &quot;while&quot; a few
&gt; &gt; years ago.
&gt; 
&gt; I think I&apos;m a bigger fan of for() (over while()) than most, since I tend to get
&gt; nitpicky about minimizing variable scopes.  But in the case where there is no
&gt; index variable declared and no iteration clause, while() means precisely what
&gt; you&apos;re doing, whereas for() just results in adding ; ; and making things more
&gt; opaque.  Precision in syntax is a virtue...

In this case, I agree that while() is better. But what&apos;s your opinion about &quot;while(true)&quot; vs. &quot;for(;;)&quot;?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138503</commentid>
    <comment_count>61</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-09 07:22:31 -0700</bug_when>
    <thetext>(In reply to comment #59)
&gt; (In reply to comment #58)
&gt; &gt; &gt; &gt; +struct jpeg_dest_mgr {
&gt; &gt; &gt; &gt; +    struct jpeg_destination_mgr pub;
&gt; &gt; &gt; &gt; +    Vector&lt;char&gt; buffer;
&gt; &gt; &gt; &gt; +    Vector&lt;char&gt;* dump;
&gt; &gt; &gt; &gt; +};
&gt; &gt; &gt; 
&gt; &gt; &gt; Naming style (here and below)
&gt; &gt; 
&gt; &gt; I see { should be in the next line here. I&apos;m told that &quot;m_&quot; should not be used
&gt; &gt; for &quot;struct&quot;
&gt; 
&gt; Based on http://webkit.org/coding/coding-style.html , the struct name should be
&gt; CamelCase (with the first letter capitalized), and the members should have m_
&gt; (I don&apos;t see an exception for structs and haven&apos;t heard this before).  Also the
&gt; names should be more descriptive than &quot;dest_mgr&quot; or &quot;pub&quot;; use full words where
&gt; possible.
&gt; 

The struct name &quot;jpeg_dest_mgr&quot; follows libjpeg style. The existing JPEGImageDecoder.cpp does the same:

struct decoder_error_mgr {
    struct jpeg_error_mgr pub;  /* &quot;public&quot; fields for IJG library*/
    jmp_buf setjmp_buffer;      /* For handling catastropic errors */
};

About &quot;m_&quot; for the members in struct: this is a good example that one reviewer says this, but another says opposite. Sigh...

I&apos;m going to use:

class JpegDestinationManager
{
public:
    Foo m_foo;
    ...
};

Will anyone say that the data member shouldn&apos;t be public? or suggest me to change back to struct?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138505</commentid>
    <comment_count>62</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-09 07:34:47 -0700</bug_when>
    <thetext>Seems the style guide needs some updating:
http://webkit.org/coding/coding-style.html
it does not cover the struct Foo { int bar; } case.  (Whether it should be &quot;bar&quot; vs. &quot;m_bar&quot;).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138556</commentid>
    <comment_count>63</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-09 14:25:40 -0700</bug_when>
    <thetext>(In reply to comment #60)
&gt; Heap allocation is slower than stack allocation. 2K is arbitrary.

I know heap allocation is slower :).  You didn&apos;t answer my question.  Does WTF::Vector have any code in it to automatically stack-allocate for smaller vectors?  (There are certainly Gecko classes that do...)

I would definitely comment in the code about 2k being arbitrary, and why you&apos;re doing it.

&gt; In the case that compiler doesn&apos;t optimize, *foo++ may result this kind of
&gt; machine code 
&gt; 1) move foo to register
&gt; 2) save *foo to register or some variable
&gt; 3) increase the register by one that keeps foo
&gt; 4) save the register back to stack
&gt; 
&gt; But if ++foo is called later, then = *foo moves foo to register once, and later
&gt; ++foo does that again.

For RISC chips that need to have something in a register to update it, the compiler will allocate |foo| to a register for the body of the loop because it&apos;s the loop index.  For chips (like x86, IIRC... x86 assembly is not my strong suit) that can directly modify stack variables, no movement in and out of a register is necessary.

The reason I suggest putting ++pixel in the for() declaration is that it&apos;s much clearer to a reader what&apos;s happening in the loop -- you see the test and iteration on one line, not broken into pieces and hidden in a later statement&apos;s side effect.  From an optimization perspective, this kind of code helps the compiler convert the loop into a decrementing loop, unroll it, etc.

&gt; But the point is not that, I have no problem with choosing either one. I just
&gt; think it may be a time waste on such small things.

There is no WebKit style rule on this one, but I don&apos;t consider clarity a small thing, and I&apos;ll always suggest what I think is the clearest code.  Statements with side effects are inherently less clear, even if (as in this case) the code is simple enough that it&apos;s not too much more difficult to determine what the code is doing.

Note that writing your loop iteration as suggested also makes it slightly easier if we convert the code to use some kind of iterator or other interface to get at the source data -- which we will likely need to do when we combine this code with the other platforms&apos;.  See also how the image decoders changed to not using direct memory access in their inner loops, in favor of an inline function in the header to do the right thing depending on the platform.

&gt; In this case, I agree that while() is better. But what&apos;s your opinion about
&gt; &quot;while(true)&quot; vs. &quot;for(;;)&quot;?

I have used both.  while(true) is significantly more common, and thus easier for most people to read, and therefore slightly better IMO.

(In reply to comment #61)
&gt; About &quot;m_&quot; for the members in struct: this is a good example that one reviewer
&gt; says this, but another says opposite. Sigh...
&gt; 
&gt; I&apos;m going to use:
&gt; 
&gt; class JpegDestinationManager
&gt; {
&gt; public:
&gt;     Foo m_foo;
&gt;     ...
&gt; };
&gt; 
&gt; Will anyone say that the data member shouldn&apos;t be public? or suggest me to
&gt; change back to struct?

I don&apos;t know what WebKit style is on that last question.  Google style (which I only mention because it&apos;s the set of style rules I happen to know well) would suggest you use a struct rather than a class for something that&apos;s purely a container of public members, and personally I agree; I would leave it as a struct and change the names as you suggested.  Someone like Eric should have the last word on that kind of thing, though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138572</commentid>
    <comment_count>64</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-09 16:50:36 -0700</bug_when>
    <thetext>(In reply to comment #63)
&gt; (In reply to comment #60)
&gt; &gt; Heap allocation is slower than stack allocation. 2K is arbitrary.
&gt; 
&gt; I know heap allocation is slower :).  You didn&apos;t answer my question.  Does
&gt; WTF::Vector have any code in it to automatically stack-allocate for smaller
&gt; vectors?  (There are certainly Gecko classes that do...)

No. I&apos;m kind of familiar with Vector (I modified it a little bit, but the patch has not been post yet)

&gt; 
&gt; I would definitely comment in the code about 2k being arbitrary, and why you&apos;re
&gt; doing it.

Just a guess, no other reason. 2K seems not too big, compared to other big buffer on stack, and canvas objects narrower than 683 can benefit.
&gt; 
&gt; There is no WebKit style rule on this one, but I don&apos;t consider clarity a small
&gt; thing, and I&apos;ll always suggest what I think is the clearest code.  Statements
&gt; with side effects are inherently less clear, even if (as in this case) the code
&gt; is simple enough that it&apos;s not too much more difficult to determine what the
&gt; code is doing.

Well, as I mentioned, += 1 might be clearer that ++. Making code too much readable just makes me feel that I&apos;m not doing C++, or I&apos;m doing C++ in MS style :) I may be sick at the point. But still, too many restrictions and requirements on such things make programming no more interesting, because one tries to write code as he was another person, tries to follow another person&apos;s mind. Although he can still do it, but there&apos;s no fun.

&gt; 
&gt; 
&gt; &gt; In this case, I agree that while() is better. But what&apos;s your opinion about
&gt; &gt; &quot;while(true)&quot; vs. &quot;for(;;)&quot;?
&gt; 
&gt; I have used both.  while(true) is significantly more common, and thus easier
&gt; for most people to read, and therefore slightly better IMO.

Sigh. I don&apos;t know why &quot;while(true)&quot; is more common. Probably it&apos;s written in some programming books? Yeah, there&apos;s no such powerful &quot;for(;;)&quot; in languages other than C/C++, that may be the reason.

&gt; 
&gt; (In reply to comment #61)
&gt; &gt; About &quot;m_&quot; for the members in struct: this is a good example that one reviewer
&gt; &gt; says this, but another says opposite. Sigh...
&gt; &gt; 
&gt; &gt; I&apos;m going to use:
&gt; &gt; 
&gt; &gt; class JpegDestinationManager
&gt; &gt; {
&gt; &gt; public:
&gt; &gt;     Foo m_foo;
&gt; &gt;     ...
&gt; &gt; };
&gt; &gt; 
&gt; &gt; Will anyone say that the data member shouldn&apos;t be public? or suggest me to
&gt; &gt; change back to struct?
&gt; 
&gt; I don&apos;t know what WebKit style is on that last question.  Google style (which I
&gt; only mention because it&apos;s the set of style rules I happen to know well) would
&gt; suggest you use a struct rather than a class for something that&apos;s purely a
&gt; container of public members, and personally I agree; I would leave it as a
&gt; struct and change the names as you suggested.  Someone like Eric should have
&gt; the last word on that kind of thing, though.

It should be struct in this case, because it&apos;s used by libjpeg, like a C struct. Probably it should better be wrapped with &quot;extern &quot;C&quot;&quot;, although it doesn&apos;t really change anything. And at the point, jpeg_dest_mgr is a better name.

&quot;pub&quot; acts as the base class of jpeg_dest_mgr. Another idea is:

struct JpegDestinationManager: jpeg_destination_mgr
{
};

What do you think?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138580</commentid>
    <comment_count>65</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-09 17:48:55 -0700</bug_when>
    <thetext>(In reply to comment #64)
&gt; Making code too much
&gt; readable just makes me feel that I&apos;m not doing C++, or I&apos;m doing C++ in MS
&gt; style :) I may be sick at the point. But still, too many restrictions and
&gt; requirements on such things make programming no more interesting, because one
&gt; tries to write code as he was another person, tries to follow another person&apos;s
&gt; mind. Although he can still do it, but there&apos;s no fun.

I don&apos;t really know what to say.  In general style guides aren&apos;t designed around what you find fun.  But like I said, there&apos;s no WebKit style rule on this one.  I was giving my personal opinion.

If there was a style rule, and you said it wasn&apos;t very fun, I don&apos;t think it&apos;d earn much sympathy...

&gt; Sigh. I don&apos;t know why &quot;while(true)&quot; is more common.

Probably because &quot;while&quot; was designed for the case when you don&apos;t need a loop initializer or increment.

&gt; It should be struct in this case, because it&apos;s used by libjpeg, like a C
&gt; struct.

I don&apos;t have the contents of libjpeg.h in front of me so it&apos;s hard for me to say exactly how something is used, but it looks to me like this struct is entirely your own, set up in compressBitmapToJpeg() and then read in the various helper functions you define.  And I can&apos;t see how the libjpeg sources could make use of a type defined in your code rather than theirs.  From context here it looks like they let you stick some user data on the jpeg_compress_struct they define.  In that case, you should define the struct in a way that matches WebKit style.

&gt; &quot;pub&quot; acts as the base class of jpeg_dest_mgr. Another idea is:
&gt; 
&gt; struct JpegDestinationManager: jpeg_destination_mgr
&gt; {
&gt; };
&gt; 
&gt; What do you think?

I think that is not good practice if the libjpeg C code expects to access a jpeg_destination_mgr struct at offset 0 in this object.  It probably works, but passing C++ classes with inheritance into C code to use makes me uneasy.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138583</commentid>
    <comment_count>66</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-09 19:05:39 -0700</bug_when>
    <thetext>(In reply to comment #65)
&gt; 
&gt; Probably because &quot;while&quot; was designed for the case when you don&apos;t need a loop
&gt; initializer or increment.

where &quot;for&quot; is designed for all the cases, including the case that no condition check is needed. isn&apos;t empty expression better than &quot;true&quot;? :)

&gt; 
&gt; &gt; It should be struct in this case, because it&apos;s used by libjpeg, like a C
&gt; &gt; struct.
&gt; 
&gt; &gt; &quot;pub&quot; acts as the base class of jpeg_dest_mgr. Another idea is:
&gt; &gt; 
&gt; &gt; struct JpegDestinationManager: jpeg_destination_mgr
&gt; &gt; {
&gt; &gt; };
&gt; &gt; 
&gt; &gt; What do you think?
&gt; 
&gt; I think that is not good practice if the libjpeg C code expects to access a
&gt; jpeg_destination_mgr struct at offset 0 in this object.  It probably works, but
&gt; passing C++ classes with inheritance into C code to use makes me uneasy.

Using class inheritance can save a reinterpret_cast, and also a weird member &quot;pub&quot;. Only thing I should take care is providing a constructor to zero the base class memory. Hm..., I find a bug: using fastCalloc to construct jpeg_dest_mgr is wrong, those Vector members might not be happy with memory zeroed although it works in reality.

going to update the patch tomorrow.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138586</commentid>
    <comment_count>67</comment_count>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-09 20:53:44 -0700</bug_when>
    <thetext>(In reply to comment #66)
&gt; (In reply to comment #65)
&gt; &gt; 
&gt; &gt; Probably because &quot;while&quot; was designed for the case when you don&apos;t need a loop
&gt; &gt; initializer or increment.
&gt; 
&gt; where &quot;for&quot; is designed for all the cases, including the case that no condition
&gt; check is needed. isn&apos;t empty expression better than &quot;true&quot;? :)

Yong, pkasting: this kind of conversation should be done at the pub over a beer or in an IRC private message if the subject matter really is that fascinating to you guys.  Personally, I find the debate to be void of any real signal and really high on the noise.

This bug report should focus on the actual substantive code.  Not trivial issues like this.  The whole purpose of review is to make the code better and to (hopefully) make ourselves better at what we do, not to devolve into ridiculous arguments over absolutely trivial and personal coding styles.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138590</commentid>
    <comment_count>68</comment_count>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-09 21:33:21 -0700</bug_when>
    <thetext>(In reply to comment #67)
&gt; (In reply to comment #66)
&gt; &gt; (In reply to comment #65)
&gt; &gt; &gt; 
&gt; &gt; &gt; Probably because &quot;while&quot; was designed for the case when you don&apos;t need a loop
&gt; &gt; &gt; initializer or increment.
&gt; &gt; 
&gt; &gt; where &quot;for&quot; is designed for all the cases, including the case that no condition
&gt; &gt; check is needed. isn&apos;t empty expression better than &quot;true&quot;? :)
&gt; 
&gt; Yong, pkasting: this kind of conversation should be done at the pub over a beer
&gt; or in an IRC private message if the subject matter really is that fascinating
&gt; to you guys.  Personally, I find the debate to be void of any real signal and
&gt; really high on the noise.
&gt; 
&gt; This bug report should focus on the actual substantive code.  Not trivial
&gt; issues like this.  The whole purpose of review is to make the code better and
&gt; to (hopefully) make ourselves better at what we do, not to devolve into
&gt; ridiculous arguments over absolutely trivial and personal coding styles.

Uhm, I&apos;m sorry. That came off way harsh...  Rather, in the interest of being positive let me just say that after 60+ comments it&apos;d probably be a good idea to refocus on more substantive parts. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138595</commentid>
    <comment_count>69</comment_count>
      <attachid>34394</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-09 21:51:17 -0700</bug_when>
    <thetext>Comment on attachment 34394
3) ImageBuffer

The ChangeLog really should have more information on what these classes are for, what they do.  Why does the WinCE port use this new &quot;SharedBitmap&quot; and what is it for?  It seems ImageBufferData is just to allow ImageBuffer to be backed by a SharedBitmap, the question is why? ;)  Likewise BufferedImage seems to exist so that Image can be backed by a ImageBufferData.  Why wouldn&apos;t WinCE have used the BitmapImage abstraction that other classes use?  Image exists to abstract between SVGImage, PDFDocumentImage and BitmapImage.  Seems you have created a duplicate/parallel BitmapImage-like subclass, no?

(Not necessarily giving objection here, just seeking more information!) :)

Need more info in the ChangeLog to perform a good review.  Also, I think given how comment-full this bug is now, these patches really should be each on their own bugs so they can be discussed where folks have some prayer of being able to read all the relevant comments. :)

Indent:
+: m_data(size)
+, m_size(size)

UNUSED_ARG is what you want:
+    grayScale; // Currently not used

c++ casts:
+    const unsigned char* src = (unsigned char*)m_data.m_bitmap-&gt;bytes();

r-, mostly for the lack of ChangeLog information.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138596</commentid>
    <comment_count>70</comment_count>
      <attachid>34401</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-09 21:52:27 -0700</bug_when>
    <thetext>Comment on attachment 34401
8) Color Gradient

OK.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138598</commentid>
    <comment_count>71</comment_count>
      <attachid>34398</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-09 21:59:25 -0700</bug_when>
    <thetext>Comment on attachment 34398
6) Path PlatformPath

Neat that you wrote your own Path implementation.  Sad that you had to. :(

We avoid using &quot;default:&quot; when switching enums so that the compiler can catch modifications to that enum/missing case statements:
15     //case PathCloseSubpath:
 316     default:

I would have broken &quot;contains&quot; up into static-inline helper functions.

Again here:
65     //case PathCloseSubpath:
 466     default:

Indent:
 472 : m_penLifted(true)

I&apos;ll have to read this more closely later.  Probably needs its own bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138599</commentid>
    <comment_count>72</comment_count>
      <attachid>34393</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-09 22:02:39 -0700</bug_when>
    <thetext>Comment on attachment 34393
2) SharedBitmap

_set/_clear is not normal WK style naming.

indents for:
+: m_bmpInfo(bmpInfo)
+, m_locked(false)
etc.

naming
+    SharedBitmap* rtn = new SharedBitmap(is16bit, w, h, initPixels);

I&apos;ll have to look closer later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138600</commentid>
    <comment_count>73</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-09 22:04:46 -0700</bug_when>
    <thetext>I think especially after Peter and Yong&apos;s long discussion about one of these patches, we should land the approved patches and push the rest of onto their own bugs.  Some of these are certain to generate further commentary since there is a lot of new code to be reviewed here.  It&apos;s nice to see more of the &quot;meat&quot; of the WinCE port landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138642</commentid>
    <comment_count>74</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-10 07:32:59 -0700</bug_when>
    <thetext>(In reply to comment #71)
&gt; (From update of attachment 34398 [details])
&gt; Neat that you wrote your own Path implementation.  Sad that you had to. :(
&gt; 
&gt; We avoid using &quot;default:&quot; when switching enums so that the compiler can catch
&gt; modifications to that enum/missing case statements:
&gt; 15     //case PathCloseSubpath:
&gt;  316     default:
&gt; 

Not all ports use same compiler. I&apos;ve seen some coding rules (not webkit one) saying &quot;default:&quot; should always present in a switch block, and like this idea. In this case, the compiler won&apos;t generate code to compare the value with PathCloseSubpath. Condition checks are expensive on ARM. Probably I should add ASSERT ( ... == PathCloseSubpath); after &quot;default:&quot;. Then that looks perfect.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138645</commentid>
    <comment_count>75</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-10 07:41:16 -0700</bug_when>
    <thetext>(In reply to comment #74)
&gt; (In reply to comment #71)
&gt; &gt; (From update of attachment 34398 [details] [details])
&gt; &gt; Neat that you wrote your own Path implementation.  Sad that you had to. :(
&gt; &gt; 
&gt; &gt; We avoid using &quot;default:&quot; when switching enums so that the compiler can catch
&gt; &gt; modifications to that enum/missing case statements:
&gt; &gt; 15     //case PathCloseSubpath:
&gt; &gt;  316     default:
&gt; &gt; 
&gt; 
&gt; Not all ports use same compiler. I&apos;ve seen some coding rules (not webkit one)
&gt; saying &quot;default:&quot; should always present in a switch block, and like this idea.
&gt; In this case, the compiler won&apos;t generate code to compare the value with
&gt; PathCloseSubpath. Condition checks are expensive on ARM. Probably I should add
&gt; ASSERT ( ... == PathCloseSubpath); after &quot;default:&quot;. Then that looks perfect.

Sounds like pre-mature optimization to me. :)

The &quot;default:&quot; logic used in WebKit is about trying to catch errors at runtime instead of compile time.

I don&apos;t think it&apos;s a big deal either way.  But I don&apos;t think optimizing for some one compiler that you&apos;ve used at one point in your lifetime is ever good plan.  This code will be read by many people (hence the style guidelines), compiled by many different compilers and run on many different CPUs before it&apos;s removed form the WebKit repository. :)  If testing show that this is slow in a certain configuration then we certainly should change it.  But before then, I wouldn&apos;t worry about the compiler much.  Perf testing is likely to show that we have much larger fish to fry.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138646</commentid>
    <comment_count>76</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-10 07:44:35 -0700</bug_when>
    <thetext>(In reply to comment #69)
&gt; (From update of attachment 34394 [details])
&gt; The ChangeLog really should have more information on what these classes are
&gt; for, what they do.  Why does the WinCE port use this new &quot;SharedBitmap&quot; and
&gt; what is it for?  It seems ImageBufferData is just to allow ImageBuffer to be
&gt; backed by a SharedBitmap, the question is why? ;)  Likewise BufferedImage seems
&gt; to exist so that Image can be backed by a ImageBufferData.  Why wouldn&apos;t WinCE
&gt; have used the BitmapImage abstraction that other classes use?  Image exists to
&gt; abstract between SVGImage, PDFDocumentImage and BitmapImage.  Seems you have
&gt; created a duplicate/parallel BitmapImage-like subclass, no?
&gt; 
&gt; (Not necessarily giving objection here, just seeking more information!) :)
&gt; 
&gt; Need more info in the ChangeLog to perform a good review.  Also, I think given
&gt; how comment-full this bug is now, these patches really should be each on their
&gt; own bugs so they can be discussed where folks have some prayer of being able to
&gt; read all the relevant comments. :)
&gt; 

All ports use BitmapImage class, including WINCE port. But platform image type (defined as &quot;NativeImagePtr&quot;) is still required. On Windows platform, it can be HBITMAP. SharedBitmap is a replacement of HBITMAP, and is more flexible and useful than HBITMAP.

I don&apos;t think this basic acknowledge of WebCore should go to ChangeLog. I&apos;ve mentioned NativeImagePtr in there, and I think people who are familiar with WebCore image stuff can understand it with no problem.

If we need more description to help new webkit developers understand webkit source code, ChangeLog is not a good place to hold it.

(BTW, could you please give more info to bug 28019 why you think it&apos;s a wrong approach?)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138647</commentid>
    <comment_count>77</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-10 07:55:24 -0700</bug_when>
    <thetext>(In reply to comment #76)
&gt; (In reply to comment #69)
&gt; &gt; (From update of attachment 34394 [details] [details])
&gt; All ports use BitmapImage class, including WINCE port. But platform image type
&gt; (defined as &quot;NativeImagePtr&quot;) is still required. On Windows platform, it can be
&gt; HBITMAP. SharedBitmap is a replacement of HBITMAP, and is more flexible and
&gt; useful than HBITMAP.
&gt; 
&gt; I don&apos;t think this basic acknowledge of WebCore should go to ChangeLog. I&apos;ve
&gt; mentioned NativeImagePtr in there, and I think people who are familiar with
&gt; WebCore image stuff can understand it with no problem.

I&apos;m about as familiar with WebKit Images as you can expect from a reviewer. :)  I&apos;ve worked on the Image stuff several times, including the most recent re-factoring splitting out BitmapImage from Image.   Why does WinCE need a NativeImagePtr Image wrapper and other ports don&apos;t?  I guess other ports use BitmapImage to wrap their NativeImagePtr, no?

&gt; If we need more description to help new webkit developers understand webkit
&gt; source code, ChangeLog is not a good place to hold it.

Agreed.  The ChangeLog is about making your change understandable to those reviewing it and later people reading it.  If the code itself needs explanation that needs to go in the code.

ChangeLogs are in part about making your reviews obviously correct to those reviewing them.  Anything that seems non-obvious should be explained in plain english.

Non-obvious reviews tend to get r-&apos;d or more likely just ignored until they rot.  As others (more famous than I) have noted, ones code is read many more times than it is written, and it&apos;s important to make it obviously correct to each of those people reading it. :)  This is part of why we have reviews and style guidelines.

I think we need to move these into separate bugs given how much parallel discussion is going on.  (Small bugs, with small patches is part of trying to make your patches obviously correct for quick review.  Once bugs or patches get to a certain size, reviewers tend to ignore them or r- them.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138648</commentid>
    <comment_count>78</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-10 07:58:10 -0700</bug_when>
    <thetext>(In reply to comment #77)
&gt; (In reply to comment #76)
&gt; &gt; (In reply to comment #69)
&gt; &gt; &gt; (From update of attachment 34394 [details] [details] [details])
&gt; &gt; All ports use BitmapImage class, including WINCE port. But platform image type
&gt; &gt; (defined as &quot;NativeImagePtr&quot;) is still required. On Windows platform, it can be
&gt; &gt; HBITMAP. SharedBitmap is a replacement of HBITMAP, and is more flexible and
&gt; &gt; useful than HBITMAP.
&gt; &gt; 
&gt; &gt; I don&apos;t think this basic acknowledge of WebCore should go to ChangeLog. I&apos;ve
&gt; &gt; mentioned NativeImagePtr in there, and I think people who are familiar with
&gt; &gt; WebCore image stuff can understand it with no problem.
&gt; 
&gt; I&apos;m about as familiar with WebKit Images as you can expect from a reviewer. :) 
&gt; I&apos;ve worked on the Image stuff several times, including the most recent
&gt; re-factoring splitting out BitmapImage from Image.   Why does WinCE need a
&gt; NativeImagePtr Image wrapper and other ports don&apos;t?  I guess other ports use
&gt; BitmapImage to wrap their NativeImagePtr, no?
&gt; 

#if PLATFORM(WX)
class wxBitmap;
class wxGraphicsBitmap;
#elif PLATFORM(CG)
typedef struct CGImageSource* CGImageSourceRef;
typedef struct CGImage* CGImageRef;
typedef const struct __CFData* CFDataRef;
#elif PLATFORM(QT)
#include &lt;qglobal.h&gt;
QT_BEGIN_NAMESPACE
class QPixmap;
QT_END_NAMESPACE
#elif PLATFORM(CAIRO)
struct _cairo_surface;
typedef struct _cairo_surface cairo_surface_t;
#elif PLATFORM(SKIA)
class NativeImageSkia;
#elif PLATFORM(WINCE)
#include &quot;SharedBitmap.h&quot;
#endif</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138650</commentid>
    <comment_count>79</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-10 07:59:30 -0700</bug_when>
    <thetext>(In reply to comment #78)
&gt; (In reply to comment #77)
&gt; &gt; (In reply to comment #76)
&gt; &gt; &gt; (In reply to comment #69)
&gt; &gt; &gt; &gt; (From update of attachment 34394 [details] [details] [details] [details])
&gt; &gt; &gt; All ports use BitmapImage class, including WINCE port. But platform image type
&gt; &gt; &gt; (defined as &quot;NativeImagePtr&quot;) is still required. On Windows platform, it can be
&gt; &gt; &gt; HBITMAP. SharedBitmap is a replacement of HBITMAP, and is more flexible and
&gt; &gt; &gt; useful than HBITMAP.
&gt; &gt; &gt; 
&gt; &gt; &gt; I don&apos;t think this basic acknowledge of WebCore should go to ChangeLog. I&apos;ve
&gt; &gt; &gt; mentioned NativeImagePtr in there, and I think people who are familiar with
&gt; &gt; &gt; WebCore image stuff can understand it with no problem.
&gt; &gt; 
&gt; &gt; I&apos;m about as familiar with WebKit Images as you can expect from a reviewer. :) 
&gt; &gt; I&apos;ve worked on the Image stuff several times, including the most recent
&gt; &gt; re-factoring splitting out BitmapImage from Image.   Why does WinCE need a
&gt; &gt; NativeImagePtr Image wrapper and other ports don&apos;t?  I guess other ports use
&gt; &gt; BitmapImage to wrap their NativeImagePtr, no?
&gt; &gt; 
&gt; 
#if PLATFORM(WX)
class ImageDecoder;
typedef ImageDecoder* NativeImageSourcePtr;
typedef const Vector&lt;char&gt;* NativeBytePtr;
#if USE(WXGC)
typedef wxGraphicsBitmap* NativeImagePtr;
#else
typedef wxBitmap* NativeImagePtr;
#endif
#elif PLATFORM(CG)
typedef CGImageSourceRef NativeImageSourcePtr;
typedef CGImageRef NativeImagePtr;
#elif PLATFORM(QT)
class ImageDecoderQt;
typedef ImageDecoderQt* NativeImageSourcePtr;
typedef QPixmap* NativeImagePtr;
#elif PLATFORM(CAIRO)
class ImageDecoder;
typedef ImageDecoder* NativeImageSourcePtr;
typedef cairo_surface_t* NativeImagePtr;
#elif PLATFORM(SKIA)
class ImageDecoder;
typedef ImageDecoder* NativeImageSourcePtr;
typedef NativeImageSkia* NativeImagePtr;
#elif PLATFORM(WINCE)
class ImageDecoder;
typedef ImageDecoder* NativeImageSourcePtr;
typedef RefPtr&lt;SharedBitmap&gt; NativeImagePtr;
#endif</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138682</commentid>
    <comment_count>80</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-10 09:03:56 -0700</bug_when>
    <thetext>Going to create a new bug for this. Just want to mention:

(In reply to comment #57)
&gt; 
&gt; &gt; +    Vector&lt;JSAMPLE, 2048&gt; rowBuffer;
&gt; &gt; +    if (setjmp(err.setjmp_buffer)) {
&gt; &gt; +        jpeg_destroy_compress(&amp;compressData);
&gt; &gt; +        return false;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    jpeg_start_compress(&amp;compressData, TRUE);
&gt; &gt; +
&gt; &gt; +    rowBuffer.resize(compressData.image_width * 3);

&gt; Why not declare rowBuffer just above this last line?

I just remember that this is necessary. If I declare rowBuffer below &quot;setjmp&quot;, then when the block in &quot;setjmp&quot; is reached, the destructor of rowBuffer won&apos;t be called. So it leaks. going to add a comment</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138707</commentid>
    <comment_count>81</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-10 10:17:31 -0700</bug_when>
    <thetext>(In reply to comment #79)
&gt; &gt; &gt; &gt; I don&apos;t think this basic acknowledge of WebCore should go to ChangeLog. I&apos;ve
&gt; &gt; &gt; &gt; mentioned NativeImagePtr in there, and I think people who are familiar with
&gt; &gt; &gt; &gt; WebCore image stuff can understand it with no problem.
&gt; &gt; &gt; 
&gt; &gt; &gt; I&apos;m about as familiar with WebKit Images as you can expect from a 

FWIW, I agree with Eric.  I&apos;ve worked on the Image code as much as anyone (probably more) lately, and I don&apos;t understand why you&apos;re doing this.

&gt; #elif PLATFORM(WINCE)
&gt; class ImageDecoder;
&gt; typedef ImageDecoder* NativeImageSourcePtr;
&gt; typedef RefPtr&lt;SharedBitmap&gt; NativeImagePtr;
&gt; #endif

The RefPtr&lt;&gt; here really scares me.  Every other port uses a raw pointer.  I fought for weeks (spread over two years) with memory problems in the Skia port before we managed to understand and precisely duplicate the CG and Cairo models of memory management for this object.  (For reference, we originally did things much like you&apos;re doing here.)  I am not sure if the cross-platform code will be both correct and efficient with this kind of usage, and it will definitely be difficult for others to understand what you&apos;re doing.  I strongly recommend you use a raw pointer and allocate/free it at the same points the other ports do.

In order to avoid deep copying, your native image object can internally refcount.  That&apos;s how the other ports address this issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138713</commentid>
    <comment_count>82</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-10 10:42:31 -0700</bug_when>
    <thetext>(In reply to comment #81)
&gt; (In reply to comment #79)
&gt; &gt; &gt; &gt; &gt; I don&apos;t think this basic acknowledge of WebCore should go to ChangeLog. I&apos;ve
&gt; &gt; &gt; &gt; &gt; mentioned NativeImagePtr in there, and I think people who are familiar with
&gt; &gt; &gt; &gt; &gt; WebCore image stuff can understand it with no problem.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; I&apos;m about as familiar with WebKit Images as you can expect from a 
&gt; 
&gt; FWIW, I agree with Eric.  I&apos;ve worked on the Image code as much as anyone
&gt; (probably more) lately, and I don&apos;t understand why you&apos;re doing this.

We are not using Qt, CG, Cairo or any other graphics library. We just use native WINCE API. HBITMAP is ugly and some GDI APIs doesn&apos;t even exist on WINCE. Think about QPixmap, CGImageRef...

&gt; 
&gt; &gt; #elif PLATFORM(WINCE)
&gt; &gt; class ImageDecoder;
&gt; &gt; typedef ImageDecoder* NativeImageSourcePtr;
&gt; &gt; typedef RefPtr&lt;SharedBitmap&gt; NativeImagePtr;
&gt; &gt; #endif
&gt; 
&gt; The RefPtr&lt;&gt; here really scares me.  Every other port uses a raw pointer.  I
&gt; fought for weeks (spread over two years) with memory problems in the Skia port
&gt; before we managed to understand and precisely duplicate the CG and Cairo models
&gt; of memory management for this object.  (For reference, we originally did things
&gt; much like you&apos;re doing here.)  I am not sure if the cross-platform code will be
&gt; both correct and efficient with this kind of usage, and it will definitely be
&gt; difficult for others to understand what you&apos;re doing.  I strongly recommend you
&gt; use a raw pointer and allocate/free it at the same points the other ports do.
&gt; 
&gt; In order to avoid deep copying, your native image object can internally
&gt; refcount.  That&apos;s how the other ports address this issue.

Every other port? What is this?

typedef CGImageRef NativeImagePtr;

Using smart pointers is definitely an advantage, for example, it can avoid memory leaks (about 1.5 year ago, there was a bug that FrameData leaked. Now it has been fixed. but if all platform NativeImagePtr were reference counted, it wouldn&apos;t even be a problem, and &quot;clear(true)&quot; wouldn&apos;t necessary in ~FrameData()). Not mentioning that we use SharedBitmap as both decoding buffer and rendering buffer so that no extra memory copying is requried.

Generally, I don&apos;t think it&apos;s a good idea to throw away helpful changes just because we want to be same as other ports. It is supposed to be platform-specific in this case. If we do everything in the same way, why do we need ports?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138735</commentid>
    <comment_count>83</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-10 11:12:02 -0700</bug_when>
    <thetext>Please follow Eric&apos;s suggestion and split these patches into their own bugs.  This is getting unwieldy.

(In reply to comment #82)
&gt; Every other port? What is this?
&gt; 
&gt; typedef CGImageRef NativeImagePtr;

From the way the CG code uses that it seems like it works like a typedef to a pointer to a refcounting object.  They&apos;re certainly still explicitly releasing it: see the CGImageRelease() call in ImageCG.cpp:FrameData::clear().

But perhaps I am mistaken about what that type is.  

&gt; Using smart pointers is definitely an advantage, for example, it can avoid
&gt; memory leaks (about 1.5 year ago, there was a bug that FrameData leaked. Now it
&gt; has been fixed. but if all platform NativeImagePtr were reference counted, it
&gt; wouldn&apos;t even be a problem, and &quot;clear(true)&quot; wouldn&apos;t necessary in
&gt; ~FrameData()).

As noted above, even CG does an explicit release here.  I am not assuaged.

&gt; Not mentioning that we use SharedBitmap as both decoding buffer
&gt; and rendering buffer so that no extra memory copying is requried.

Yes, that is how other ports e.g. CG and Skia work too.  For Skia, for example, the setRGBA() call in ImageDecoder.h writes directly to the buffer inside the SkBitmap.

&gt; Generally, I don&apos;t think it&apos;s a good idea to throw away helpful changes just
&gt; because we want to be same as other ports.

Generally, things that one port does differently from everyone else raise red flags for people trying to read the code.

&gt; If we do everything in the same way, why do we
&gt; need ports?

Because all the ports are built atop cross-platform code.  They should only be different where they must, and we&apos;re in the process of trying to reduce the differences further.

I wasn&apos;t saying your code is guaranteed to be wrong.  I was saying I&apos;m unable to tell for sure that it&apos;s right, whereas if your NativeImage type internally refcounted, and NativeImagePtr was a raw pointer, I wouldn&apos;t even have to worry, because the idiom is the same.  All I&apos;d need to check is that you allocated and freed in the right places.  The strength of copying other ports is that we can review your code and guarantee it&apos;s correct, and others can read and understand what you&apos;re doing.  It&apos;s the same reason we have style guides.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138827</commentid>
    <comment_count>84</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-10 14:47:11 -0700</bug_when>
    <thetext>(In reply to comment #69)
&gt; (From update of attachment 34394 [details])
&gt; The ChangeLog really should have more information on what these classes are
&gt; for, what they do.  Why does the WinCE port use this new &quot;SharedBitmap&quot; and
&gt; what is it for?  It seems ImageBufferData is just to allow ImageBuffer to be
&gt; backed by a SharedBitmap, the question is why? ;)  Likewise BufferedImage seems
&gt; to exist so that Image can be backed by a ImageBufferData.  Why wouldn&apos;t WinCE
&gt; have used the BitmapImage abstraction that other classes use?  Image exists to
&gt; abstract between SVGImage, PDFDocumentImage and BitmapImage.  Seems you have
&gt; created a duplicate/parallel BitmapImage-like subclass, no?
&gt; 
&gt; (Not necessarily giving objection here, just seeking more information!) :)
&gt; 
&gt; Need more info in the ChangeLog to perform a good review.  Also, I think given
&gt; how comment-full this bug is now, these patches really should be each on their
&gt; own bugs so they can be discussed where folks have some prayer of being able to
&gt; read all the relevant comments. :)
&gt; 
&gt; Indent:
&gt; +: m_data(size)
&gt; +, m_size(size)
&gt; 
&gt; UNUSED_ARG is what you want:
&gt; +    grayScale; // Currently not used
&gt; 
&gt; c++ casts:
&gt; +    const unsigned char* src = (unsigned char*)m_data.m_bitmap-&gt;bytes();
&gt; 
&gt; r-, mostly for the lack of ChangeLog information.

Sorry, I misunderstood your question. Yes, BufferedImage is parallel to BitmapImage. The reason we use BufferedImage is that BitmapImage is too expensive in this case. Another option is to implement BitmapImage(NativeImagePtr, ImageObserver* = 0) as other ports do.

ImageBuffer::image() is supposed to return an Image interface which is used only for render. BufferedImage is very thin, and I think it makes things much simpler than doing it in another way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138848</commentid>
    <comment_count>85</comment_count>
      <attachid>34396</attachid>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-10 15:54:30 -0700</bug_when>
    <thetext>Comment on attachment 34396
5) MediaPlayer

&gt; diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
&gt; index 3afc825..2facda8 100644
&gt; --- a/WebCore/ChangeLog
&gt; +++ b/WebCore/ChangeLog
&gt; @@ -1,3 +1,16 @@
&gt; +2009-08-08  Yong Li  &lt;yong.li@torchmobile.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        WINCE PORT: MediaPlayerProxy and MediaPlayerPrivate
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=27511
&gt; +
&gt; +        Written by Crystal Zhang &lt;crystal.zhang@torchmobile.com&gt;
&gt; +
&gt; +        * platform/graphics/wince/MediaPlayerPrivateWince.h: Added.
&gt; +        * platform/graphics/wince/MediaPlayerProxy.cpp: Added.
&gt; +        * platform/graphics/wince/MediaPlayerProxy.h: Added.


  Should probably put Crystal&apos;s name in the ChangeLog entry instead.


&gt; +WebMediaPlayerProxy::WebMediaPlayerProxy(MediaPlayer* player)
&gt; +: m_mediaPlayer(player)
&gt; +, m_init(false)
&gt; +, m_hasSentResponseToPlugin(false)

   Need indenting


&gt; +WebMediaPlayerProxy::~WebMediaPlayerProxy()
&gt; +{
&gt; +    m_instance.release();
&gt; +}
&gt; +ScriptInstance WebMediaPlayerProxy::pluginInstance()

  Needs a blank line


&gt; +}
&gt; +void WebMediaPlayerProxy::load(const String&amp; url)
&gt; +{
&gt; +    if (!m_init)
&gt; +        initEngine();
&gt; +    if (m_init)
&gt; +        invokeMethod(&quot;play&quot;);
&gt; +}
&gt; +void WebMediaPlayerProxy::initEngine()

  More blank lines missing


&gt; +    NamedNodeMap* a = element-&gt;attributes();
&gt; +    if (a) {
&gt; +        for (unsigned i = 0; i &lt; a-&gt;length(); ++i) {
&gt; +            Attribute* it = a-&gt;attributeItem(i);
&gt; +            paramNames.append(it-&gt;name().localName().string());
&gt; +            paramValues.append(it-&gt;value().string());
&gt; +        }
&gt; +    }

   I guess you should remove the braces around the if, as ugly as it becomes.


&gt; +HTMLMediaElement* WebMediaPlayerProxy::element()
&gt; +{
&gt; +    return static_cast&lt;HTMLMediaElement*&gt;(m_mediaPlayer-&gt;mediaPlayerClient());
&gt; +
&gt; +}

   Extra blank line here

&gt; +
&gt; +void WebMediaPlayerProxy::invokeMethod(const String&amp; methodName)
&gt; +{
&gt; +    Frame* frame = element()-&gt;document()-&gt;frame();
&gt; +    RootObject *root = frame-&gt;script()-&gt;bindingRootObject();
&gt; +    if (!root)
&gt; +        return;
&gt; +    ExecState *exec = root-&gt;globalObject()-&gt;globalExec();
&gt; +    Instance* instance = pluginInstance().get();
&gt; +    if (!instance)
&gt; +        return;
&gt; +
&gt; +    instance-&gt;begin();
&gt; +    Class *aClass = instance-&gt;getClass();
&gt; +    Identifier iden(exec, methodName);
&gt; +    MethodList methodList = aClass-&gt;methodsNamed(iden, instance);
&gt; +    ArgList args;
&gt; +    /*JSValuePtr result =*/
&gt; +    instance-&gt;invokeMethod(exec, methodList , args);
&gt; +    instance-&gt;end();


   This needs a comment to indicate why the result variable is commented out I think.


   After those minor cleanups it will be good to go.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138849</commentid>
    <comment_count>86</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-08-10 15:57:45 -0700</bug_when>
    <thetext>&gt; &gt; +    NamedNodeMap* a = element-&gt;attributes();
&gt; &gt; +    if (a) {
&gt; &gt; +        for (unsigned i = 0; i &lt; a-&gt;length(); ++i) {
&gt; &gt; +            Attribute* it = a-&gt;attributeItem(i);
&gt; &gt; +            paramNames.append(it-&gt;name().localName().string());
&gt; &gt; +            paramValues.append(it-&gt;value().string());
&gt; &gt; +        }
&gt; &gt; +    }
&gt; 
&gt;    I guess you should remove the braces around the if, as ugly as it becomes.

If I understand you correctly, I think you&apos;re saying that you think the WebKit coding style requires removing these braces.

That&apos;s wrong. The WebKit coding style says braces should be omitted from one-line bodies, and this is more than one line. Perhaps you were thinking it said to omit them from one-statement bodies?

The braces should stay.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138850</commentid>
    <comment_count>87</comment_count>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-10 16:01:02 -0700</bug_when>
    <thetext>(In reply to comment #86)
&gt; &gt; &gt; +    NamedNodeMap* a = element-&gt;attributes();
&gt; &gt; &gt; +    if (a) {
&gt; &gt; &gt; +        for (unsigned i = 0; i &lt; a-&gt;length(); ++i) {
&gt; &gt; &gt; +            Attribute* it = a-&gt;attributeItem(i);
&gt; &gt; &gt; +            paramNames.append(it-&gt;name().localName().string());
&gt; &gt; &gt; +            paramValues.append(it-&gt;value().string());
&gt; &gt; &gt; +        }
&gt; &gt; &gt; +    }
&gt; &gt; 
&gt; &gt;    I guess you should remove the braces around the if, as ugly as it becomes.
&gt; 
&gt; If I understand you correctly, I think you&apos;re saying that you think the WebKit
&gt; coding style requires removing these braces.
&gt; 
&gt; That&apos;s wrong. The WebKit coding style says braces should be omitted from
&gt; one-line bodies, and this is more than one line. Perhaps you were thinking it
&gt; said to omit them from one-statement bodies?
&gt; 
&gt; The braces should stay.

 +1!

That&apos;s not clear from my reading but I definitely approve.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138854</commentid>
    <comment_count>88</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-08-10 16:17:18 -0700</bug_when>
    <thetext>(In reply to comment #87)
&gt; That&apos;s not clear from my reading but I definitely approve.

Did you look at the examples?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138860</commentid>
    <comment_count>89</comment_count>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-10 16:43:27 -0700</bug_when>
    <thetext>(In reply to comment #88)
&gt; (In reply to comment #87)
&gt; &gt; That&apos;s not clear from my reading but I definitely approve.
&gt; 
&gt; Did you look at the examples?

Yes, and it doesn&apos;t strictly fit into the &quot;braces&quot; example by my read, but I know what you&apos;re implying.  On another note I have seen the &quot;if + comment + one liner&quot; rule being applied in reverse but I don&apos;t remember where at the moment.  Thankfully the compiler is forgiving. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139305</commentid>
    <comment_count>90</comment_count>
      <attachid>34400</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-12 06:03:32 -0700</bug_when>
    <thetext>Comment on attachment 34400
7) Image ImageSource

ImageSource is no longer a forked file for each port.  Rather, all ports that are use the built-in image decoders are moving to a cross-platform ImageSource.cpp file.  Please refactor to use this new file and (only if necessary) add #if/#else for any behavior changes need by WINCE port for this file.  See: https://bugs.webkit.org/show_bug.cgi?id=27965</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139371</commentid>
    <comment_count>91</comment_count>
    <who name="Peter Kasting">pkasting</who>
    <bug_when>2009-08-12 09:46:52 -0700</bug_when>
    <thetext>(In reply to comment #90)
&gt; ImageSource is no longer a forked file for each port.  Rather, all ports that
&gt; are use the built-in image decoders are moving to a cross-platform
&gt; ImageSource.cpp file.  Please refactor to use this new file and (only if
&gt; necessary) add #if/#else for any behavior changes need by WINCE port for this
&gt; file.  See: https://bugs.webkit.org/show_bug.cgi?id=27965

And if behavior differences are needed, chat with me/Adam; maybe we can find a better way than #ifdefs (one or two virtual functions, or splitting ImageSource.cpp into a couple pieces, for example).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139627</commentid>
    <comment_count>92</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-12 16:03:58 -0700</bug_when>
    <thetext>Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	A	WebCore/platform/graphics/wince/ColorWince.cpp
	A	WebCore/platform/graphics/wince/GradientWince.cpp
Committed r47158
	M	WebCore/ChangeLog
	A	WebCore/platform/graphics/wince/ColorWince.cpp
	A	WebCore/platform/graphics/wince/GradientWince.cpp
r47158 = 4c84387c23d3b46cd7698b406d8ce9d740430bcd (trunk)
No changes between current HEAD and refs/remotes/trunk
Resetting to the latest refs/remotes/trunk
http://trac.webkit.org/changeset/47158</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139637</commentid>
    <comment_count>93</comment_count>
      <attachid>34401</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-12 16:14:30 -0700</bug_when>
    <thetext>Comment on attachment 34401
8) Color Gradient

Hit bug 28230 again.  multi-patch bugs still confuse our tools. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139638</commentid>
    <comment_count>94</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-12 16:14:59 -0700</bug_when>
    <thetext>Hit bug 28230 again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140337</commentid>
    <comment_count>95</comment_count>
      <attachid>34401</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-14 14:16:02 -0700</bug_when>
    <thetext>Comment on attachment 34401
8) Color Gradient

seems already landed?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140353</commentid>
    <comment_count>96</comment_count>
      <attachid>34401</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-14 15:05:55 -0700</bug_when>
    <thetext>Comment on attachment 34401
8) Color Gradient

bugzilla-tool isn&apos;t quite smart enough to know how to reject this patch yet.  It is smart enough to know that you&apos;re not a reviewer however. :)  Only reviewers can set r+.

Exception: Committer &quot;Yong Li&quot; &lt;yong.li@torchmobile.com&gt; does not have review rights.

Documentation of the review process is part of the committer agreement that you signed. :)

http://webkit.org/quality/lifecycle.html has more information if you need.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140355</commentid>
    <comment_count>97</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-14 15:10:50 -0700</bug_when>
    <thetext>(In reply to comment #96)
&gt; (From update of attachment 34401 [details])
&gt; bugzilla-tool isn&apos;t quite smart enough to know how to reject this patch yet. 
&gt; It is smart enough to know that you&apos;re not a reviewer however. :)  Only
&gt; reviewers can set r+.
&gt; 
&gt; Exception: Committer &quot;Yong Li&quot; &lt;yong.li@torchmobile.com&gt; does not have review
&gt; rights.
&gt; 
&gt; Documentation of the review process is part of the committer agreement that you
&gt; signed. :)
&gt; 
&gt; http://webkit.org/quality/lifecycle.html has more information if you need.

that patch is already landed. just want to mark it with something other than &quot;No flag&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140362</commentid>
    <comment_count>98</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-14 15:24:02 -0700</bug_when>
    <thetext>Closing bug since all patches have been landed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140373</commentid>
    <comment_count>99</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-14 16:05:48 -0700</bug_when>
    <thetext>apparently it depends on 3 child bugs</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33202</attachid>
            <date>2009-07-21 13:00:40 -0700</date>
            <delta_ts>2009-07-22 07:34:15 -0700</delta_ts>
            <desc>graphics files for WINCE port</desc>
            <filename>27511.patch</filename>
            <type>text/plain</type>
            <size>139339</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NzE3OTg2YS4uNTE3ZjljOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNiBAQAorMjAwOS0wNy0yMSAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y
NzUxMQorICAgICAgICBBZGQgV0lOQ0Ugc3BlY2lmaWMgcGxhdGZvcm0vZ3JhcGhpY3MgZmlsZXMg
Zm9yIHRoZSBXaW5DRSBwb3J0LgorCisgICAgICAgIFdyaXR0ZW4gYnkgWW9uZyBMaSA8eW9uZy5s
aUB0b3JjaG1vYmlsZS5jb20+LCBHZW9yZ2UgU3RhaWtvcyA8Z2VvcmdlLnN0YWlrb3NAdG9yY2ht
b2JpbGUuY29tPiwgQ3J5c3RhbCBaaGFuZyA8Y3J5c3RhbC56aGFuZ0B0b3JjaG1vYmlsZS5jb20+
CisgICAgICAgIGFuZCBMeW9uIENoZW4gPGx5b24uY2hlbkB0b3JjaG1vYmlsZS5jb20+CisKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Db2xvcldpbmNlLmNwcDogQWRkZWQuCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhZGllbnRXaW5jZS5jcHA6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyRGF0YS5oOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbmNl
LmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VEZWNv
ZGVyVXRpbGl0aWVzLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvSW1hZ2VEZWNvZGVyVXRpbGl0aWVzLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVNvdXJjZVdpbmNlLmNwcDogQWRkZWQuCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5jZS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNvZGVyLmNwcDogQWRkZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSlBFR0VuY29kZXIuaDogQWRkZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2lu
Y2UuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5
ZXJQcm94eS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01l
ZGlhUGxheWVyUHJveHkuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvUE5HRW5jb2Rlci5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BOR0VuY29kZXIuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvUGF0aFdpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvUGxhdGZvcm1QYXRoV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaDogQWRkZWQuCisKIDIwMDktMDctMjEg
IEFkYW0gUm9iZW4gIDxhcm9iZW5AYXBwbGUuY29tPgogCiAgICAgICAgIFJvbGwgb3V0IHI0NjE1
MywgcjQ2MTU0LCBhbmQgcjQ2MTU1CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL0NvbG9yV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9Db2xvcldpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjBi
OWQyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9D
b2xvcldpbmNlLmNwcApAQCAtMCwwICsxLDM4IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAw
Ny0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
ICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
ICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkNvbG9yLmgiCisKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0NvbG9yIGZvY3VzUmluZ0NvbG9yKCkKK3sKKyAgICBy
ZXR1cm4gQ29sb3IoMCwgMCwgMCk7Cit9CisKK3ZvaWQgc2V0Rm9jdXNSaW5nQ29sb3JDaGFuZ2VG
dW5jdGlvbih2b2lkICgqKSgpKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvR3JhZGllbnRXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0dyYWRpZW50V2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRl
YmQzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0dyYWRpZW50V2luY2UuY3BwCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkdyYWRpZW50LmgiCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIEdyYWRpZW50OjpwbGF0Zm9ybURlc3Ryb3koKQorewor
fQorCitzdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVN0b3BzKGNvbnN0IEdyYWRpZW50OjpDb2xv
clN0b3AmIGEsIGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AmIGIpCit7CisgICAgcmV0dXJuIGEu
c3RvcCA8IGIuc3RvcDsKK30KKworY29uc3QgVmVjdG9yPEdyYWRpZW50OjpDb2xvclN0b3A+JiBH
cmFkaWVudDo6Z2V0U3RvcHMoKSBjb25zdAoreworICAgIGlmICghbV9zdG9wc1NvcnRlZCkgewor
ICAgICAgICBpZiAobV9zdG9wcy5zaXplKCkpCisgICAgICAgICAgICBzdGQ6OnN0YWJsZV9zb3J0
KG1fc3RvcHMuYmVnaW4oKSwgbV9zdG9wcy5lbmQoKSwgY29tcGFyZVN0b3BzKTsKKyAgICAgICAg
bV9zdG9wc1NvcnRlZCA9IHRydWU7CisgICAgfQorCXJldHVybiBtX3N0b3BzOworfQorCit2b2lk
IEdyYWRpZW50OjpmaWxsKEdyYXBoaWNzQ29udGV4dCogYywgY29uc3QgRmxvYXRSZWN0JiByKQor
eworICAgIGMtPmZpbGxSZWN0KHIsIHRoaXMpOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyRGF0YS5oIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlckRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi43YzU0OTdjCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlckRhdGEuaApAQCAtMCwwICsxLDQyIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBV
VEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBJbWFnZUJ1ZmZlckRhdGFfaAorI2RlZmluZSBJbWFnZUJ1ZmZlckRh
dGFfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEludFNpemU7CisKK2NsYXNzIElt
YWdlQnVmZmVyRGF0YSB7CitwdWJsaWM6CisgICAgSW1hZ2VCdWZmZXJEYXRhKGNvbnN0IEludFNp
emUmIHNpemUpOworCisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gbV9iaXRtYXA7Cit9OworCit9
ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIEltYWdlQnVmZmVyRGF0YV9oCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2lu
Y2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbmNl
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODIxODNjCi0tLSAvZGV2
L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldp
bmNlLmNwcApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5
IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
ICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpIHdpbGwgYmUg
dXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZm
ZXIuaCIKKworI2luY2x1ZGUgIkJhc2U2NC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5o
IgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAiSW1hZ2VEYXRhLmgiCisjaW5jbHVkZSAi
SlBFR0VuY29kZXIuaCIKKyNpbmNsdWRlICJQTkdFbmNvZGVyLmgiCisjaW5jbHVkZSAiU2hhcmVk
Qml0bWFwLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlCit7CisKK2NsYXNzIEJ1ZmZlcmVkSW1hZ2U6
IHB1YmxpYyBJbWFnZQoreworcHVibGljOgorICAgIEJ1ZmZlcmVkSW1hZ2UoY29uc3QgSW1hZ2VC
dWZmZXJEYXRhKiBkYXRhKQorICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgIHsKKyAgICB9CisK
KyAgICB2aXJ0dWFsIEludFNpemUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEludFNpemUobV9kYXRh
LT5tX2JpdG1hcC0+d2lkdGgoKSwgbV9kYXRhLT5tX2JpdG1hcC0+aGVpZ2h0KCkpOyB9CisgICAg
dmlydHVhbCB2b2lkIGRlc3Ryb3lEZWNvZGVkRGF0YShib29sIGRlc3Ryb3lBbGwgPSB0cnVlKSB7
fQorICAgIHZpcnR1YWwgdW5zaWduZWQgZGVjb2RlZFNpemUoKSBjb25zdCB7IHJldHVybiAwOyB9
CisgICAgdmlydHVhbCB2b2lkIGRyYXcoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0
JiBkc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yKTsK
KyAgICB2aXJ0dWFsIHZvaWQgZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxv
YXRSZWN0JiBzcmNSZWN0LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5z
Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhh
c2UsIENvbXBvc2l0ZU9wZXJhdG9yLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KTsKKworICAg
IGNvbnN0IEltYWdlQnVmZmVyRGF0YSogbV9kYXRhOworfTsKKwordm9pZCBCdWZmZXJlZEltYWdl
OjpkcmF3KEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBj
b25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQor
eworICAgIEludFJlY3QgaW50RHN0UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoZHN0UmVjdCk7Cisg
ICAgSW50UmVjdCBpbnRTcmNSZWN0KHNyY1JlY3QpOworICAgIG1fZGF0YS0+bV9iaXRtYXAtPmRy
YXcoY3R4dCwgaW50RHN0UmVjdCwgaW50U3JjUmVjdCwgY29tcG9zaXRlT3ApOworfQorCit2b2lk
IEJ1ZmZlcmVkSW1hZ2U6OmRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3Qg
RmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVy
blRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2lu
dCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0
KQoreworICAgIG1fZGF0YS0+bV9iaXRtYXAtPmRyYXdQYXR0ZXJuKGN0eHQsIHRpbGVSZWN0SW4s
IHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNlLCBvcCwgZGVzdFJlY3QsIHNpemUoKSk7Cit9CisKK0lt
YWdlQnVmZmVyRGF0YTo6SW1hZ2VCdWZmZXJEYXRhKGNvbnN0IEludFNpemUmIHNpemUpCis6IG1f
Yml0bWFwKFNoYXJlZEJpdG1hcDo6Y3JlYXRlSW5zdGFuY2UoZmFsc2UsIHNpemUud2lkdGgoKSwg
c2l6ZS5oZWlnaHQoKSwgZmFsc2UpKQoreworICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIw
MDkvV0QtaHRtbDUtMjAwOTAyMTIvdGhlLWNhbnZhcy1lbGVtZW50Lmh0bWwjY2FudmFzcGl4ZWxh
cnJheQorICAgIC8vICJXaGVuIHRoZSBjYW52YXMgaXMgaW5pdGlhbGl6ZWQgaXQgbXVzdCBiZSBz
ZXQgdG8gZnVsbHkgdHJhbnNwYXJlbnQgYmxhY2suIgorICAgIG1fYml0bWFwLT5yZXNldFBpeGVs
cyh0cnVlKTsKKyAgICBtX2JpdG1hcC0+c2V0SGFzQWxwaGEodHJ1ZSk7Cit9CisKK0ltYWdlQnVm
ZmVyOjpJbWFnZUJ1ZmZlcihjb25zdCBJbnRTaXplJiBzaXplLCBib29sIGdyYXlTY2FsZSwgYm9v
bCYgc3VjY2VzcykKKzogbV9kYXRhKHNpemUpCissIG1fc2l6ZShzaXplKQoreworICAgIGdyYXlT
Y2FsZTsgLy8gQ3VycmVudGx5IG5vdCB1c2VkCisgICAgbV9jb250ZXh0LnNldChuZXcgR3JhcGhp
Y3NDb250ZXh0KDApKTsKKyAgICBtX2NvbnRleHQtPnNldEJpdG1hcChtX2RhdGEubV9iaXRtYXAp
OworICAgIHN1Y2Nlc3MgPSB0cnVlOworfQorCitJbWFnZUJ1ZmZlcjo6fkltYWdlQnVmZmVyKCkK
K3sKK30KKworR3JhcGhpY3NDb250ZXh0KiBJbWFnZUJ1ZmZlcjo6Y29udGV4dCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fY29udGV4dC5nZXQoKTsKK30KKworSW1hZ2UqIEltYWdlQnVmZmVyOjpp
bWFnZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2ltYWdlKQorICAgICAgICBtX2ltYWdlID0gYWRv
cHRSZWYobmV3IEJ1ZmZlcmVkSW1hZ2UoJm1fZGF0YSkpOworICAgIAorICAgIHJldHVybiBtX2lt
YWdlLmdldCgpOworfQorCitQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldElt
YWdlRGF0YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIFBhc3NSZWZQdHI8SW1h
Z2VEYXRhPiBpbWFnZURhdGEgPSBJbWFnZURhdGE6OmNyZWF0ZShyZWN0LndpZHRoKCksIHJlY3Qu
aGVpZ2h0KCkpOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjID0gKHVuc2lnbmVkIGNo
YXIqKW1fZGF0YS5tX2JpdG1hcC0+Ynl0ZXMoKTsKKyAgICBpZiAoIXNyYykKKyAgICAgICAgcmV0
dXJuIGltYWdlRGF0YTsKKworICAgIEludFJlY3Qgc291cmNlUmVjdCgwLCAwLCBtX2RhdGEubV9i
aXRtYXAtPndpZHRoKCksIG1fZGF0YS5tX2JpdG1hcC0+aGVpZ2h0KCkpOworICAgIHNvdXJjZVJl
Y3QuaW50ZXJzZWN0KHJlY3QpOworICAgIGlmIChzb3VyY2VSZWN0LmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIGltYWdlRGF0YTsKKworICAgIHVuc2lnbmVkIGNoYXIqIGRzdCA9IGltYWdlRGF0
YS0+ZGF0YSgpLT5kYXRhKCktPmRhdGEoKTsKKyAgICBtZW1zZXQoZHN0LCAwLCBpbWFnZURhdGEt
PmRhdGEoKS0+ZGF0YSgpLT5sZW5ndGgoKSk7CisgICAgc3JjICs9IChzb3VyY2VSZWN0LnkoKSAq
IG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSArIHNvdXJjZVJlY3QueCgpKSAqIDQ7CisgICAgZHN0
ICs9ICgoc291cmNlUmVjdC55KCkgLSByZWN0LnkoKSkgKiBpbWFnZURhdGEtPndpZHRoKCkgKyBz
b3VyY2VSZWN0LngoKSAtIHJlY3QueCgpKSAqIDQ7CisgICAgaW50IGJ5dGVzVG9Db3B5ID0gc291
cmNlUmVjdC53aWR0aCgpICogNDsKKyAgICBpbnQgc3JjU2tpcCA9IChtX2RhdGEubV9iaXRtYXAt
PndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICogNDsKKyAgICBpbnQgZHN0U2tpcCA9IChp
bWFnZURhdGEtPndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICogNDsKKyAgICBjb25zdCB1
bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBkc3QgKyBzb3VyY2VSZWN0LmhlaWdodCgpICogaW1hZ2VE
YXRhLT53aWR0aCgpICogNDsKKyAgICB3aGlsZSAoZHN0IDwgZHN0RW5kKSB7CisgICAgICAgIGNv
bnN0IHVuc2lnbmVkIGNoYXIqIGRzdFJvd0VuZCA9IGRzdCArIGJ5dGVzVG9Db3B5OworICAgICAg
ICB3aGlsZSAoZHN0IDwgZHN0Um93RW5kKSB7CisgICAgICAgICAgICAqZHN0KysgPSBzcmNbM107
IC8vIEEKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsgLy8gQgorICAgICAgICAgICAgKmRz
dCsrID0gKnNyYysrOyAvLyBHCisgICAgICAgICAgICAqZHN0KysgPSAqc3JjKys7IC8vIFIKKyAg
ICAgICAgICAgICsrc3JjOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBzcmNTa2lwOworICAg
ICAgICBkc3QgKz0gZHN0U2tpcDsKKyAgICB9CisKKyAgICByZXR1cm4gaW1hZ2VEYXRhOworfQor
Cit2b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEoSW1hZ2VEYXRhKiBzb3VyY2UsIGNvbnN0
IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50JiBkZXN0UG9pbnQpCit7CisgICAg
dW5zaWduZWQgY2hhciogZHN0ID0gKHVuc2lnbmVkIGNoYXIqKW1fZGF0YS5tX2JpdG1hcC0+Ynl0
ZXMoKTsKKyAgICBpZiAoIWRzdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBkZXN0
UmVjdChkZXN0UG9pbnQsIHNvdXJjZVJlY3Quc2l6ZSgpKTsKKyAgICBkZXN0UmVjdC5pbnRlcnNl
Y3QoSW50UmVjdCgwLCAwLCBtX2RhdGEubV9iaXRtYXAtPndpZHRoKCksIG1fZGF0YS5tX2JpdG1h
cC0+aGVpZ2h0KCkpKTsKKworICAgIGlmIChkZXN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYyA9IHNvdXJjZS0+ZGF0YSgpLT5k
YXRhKCktPmRhdGEoKTsKKyAgICBkc3QgKz0gKGRlc3RSZWN0LnkoKSAqIG1fZGF0YS5tX2JpdG1h
cC0+d2lkdGgoKSArIGRlc3RSZWN0LngoKSkgKiA0OworICAgIHNyYyArPSAoc291cmNlUmVjdC55
KCkgKiBzb3VyY2UtPndpZHRoKCkgKyBzb3VyY2VSZWN0LngoKSkgKiA0OworICAgIGludCBieXRl
c1RvQ29weSA9IGRlc3RSZWN0LndpZHRoKCkgKiA0OworICAgIGludCBkc3RTa2lwID0gKG1fZGF0
YS5tX2JpdG1hcC0+d2lkdGgoKSAtIGRlc3RSZWN0LndpZHRoKCkpICogNDsKKyAgICBpbnQgc3Jj
U2tpcCA9IChzb3VyY2UtPndpZHRoKCkgLSBkZXN0UmVjdC53aWR0aCgpKSAqIDQ7CisgICAgY29u
c3QgdW5zaWduZWQgY2hhciogZHN0RW5kID0gZHN0ICsgZGVzdFJlY3QuaGVpZ2h0KCkgKiBtX2Rh
dGEubV9iaXRtYXAtPndpZHRoKCkgKiA0OworICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAg
ICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZHN0Um93RW5kID0gZHN0ICsgYnl0ZXNUb0NvcHk7
CisgICAgICAgIHdoaWxlIChkc3QgPCBkc3RSb3dFbmQpIHsKKyAgICAgICAgICAgIHVuc2lnbmVk
IGNoYXIgYWxwaGEgPSAqc3JjKys7CisgICAgICAgICAgICAqZHN0KysgPSAqc3JjKys7IC8vIEIK
KyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsgLy8gRworICAgICAgICAgICAgKmRzdCsrID0g
KnNyYysrOyAvLyBSCisgICAgICAgICAgICAqZHN0KysgPSBhbHBoYTsKKyAgICAgICAgfQorICAg
ICAgICBzcmMgKz0gc3JjU2tpcDsKKyAgICAgICAgZHN0ICs9IGRzdFNraXA7CisgICAgfQorfQor
CitTdHJpbmcgSW1hZ2VCdWZmZXI6OnRvRGF0YVVSTChjb25zdCBTdHJpbmcmIG1pbWVUeXBlKSBj
b25zdAoreworICAgIGlmICghbV9kYXRhLm1fYml0bWFwLT5ieXRlcygpKQorICAgICAgICByZXR1
cm4gImRhdGE6LCI7CisKKyAgICBWZWN0b3I8Y2hhcj4gb3V0cHV0OworICAgIGNvbnN0IGNoYXIq
IGhlYWRlcjsKKyAgICBpZiAobWltZVR5cGUubG93ZXIoKSA9PSAiaW1hZ2UvcG5nIikgeworICAg
ICAgICBpZiAoIWNvbXByZXNzQml0bWFwVG9QbmcobV9kYXRhLm1fYml0bWFwLmdldCgpLCBvdXRw
dXQpKQorICAgICAgICAgICAgcmV0dXJuICJkYXRhOiwiOworICAgICAgICBoZWFkZXIgPSAiZGF0
YTppbWFnZS9wbmc7YmFzZTY0LCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFjb21wcmVz
c0JpdG1hcFRvSnBlZyhtX2RhdGEubV9iaXRtYXAuZ2V0KCksIG91dHB1dCkpCisgICAgICAgICAg
ICByZXR1cm4gImRhdGE6LCI7CisgICAgICAgIGhlYWRlciA9ICJkYXRhOmltYWdlL2pwZWc7YmFz
ZTY0LCI7CisgICAgfQorCisgICAgVmVjdG9yPGNoYXI+IGJhc2U2NDsKKyAgICBiYXNlNjRFbmNv
ZGUob3V0cHV0LCBiYXNlNjQpOworICAgIAorICAgIG91dHB1dC5jbGVhcigpOworCisgICAgVmVj
dG9yPGNoYXI+IHVybDsKKyAgICB1cmwuYXBwZW5kKGhlYWRlciwgc3RybGVuKGhlYWRlcikpOwor
ICAgIHVybC5hcHBlbmQoYmFzZTY0KTsKKworICAgIHJldHVybiBTdHJpbmcodXJsLmRhdGEoKSwg
dXJsLnNpemUoKSk7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvSW1hZ2VEZWNvZGVyVXRpbGl0aWVzLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvSW1hZ2VEZWNvZGVyVXRpbGl0aWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi4zZGYwNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZURlY29kZXJVdGlsaXRpZXMuY3BwCkBAIC0wLDAgKzEs
NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZURlY29kZXJVdGlsaXRpZXMu
aCIKKworI2luY2x1ZGUgIndpbmNlL01lbW9yeU1hbmFnZXIuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUKK3sKK2Jvb2wgQnl0ZUJ1ZmZlcjo6YXBwZW5kKGNvbnN0IGNoYXIqIGRhdGEsIHVuc2lnbmVk
IHNpemUpCit7CisgICAgYm9vbCBydG47CisgICAgY2hhciogb2xkQnVmZmVyID0gbV9kYXRhOyAK
KyAgICBpbnQgbmV3U2l6ZSA9IG1fc2l6ZSArIHNpemU7CisgICAgbV9kYXRhID0gKGNoYXIqKW1h
bGxvYyhuZXdTaXplKTsKKyAgICBpZiAobV9kYXRhKSB7CisgICAgICAgIG1lbWNweShtX2RhdGEs
IG9sZEJ1ZmZlciwgbV9zaXplKTsKKyAgICAgICAgbWVtY3B5KG1fZGF0YSArIG1fc2l6ZSwgZGF0
YSwgc2l6ZSk7CisgICAgICAgIG1fc2l6ZSA9IG5ld1NpemU7CisgICAgICAgIHJ0biA9IHRydWU7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9zaXplID0gMDsKKyAgICAgICAgcnRuID0gZmFsc2U7
CisgICAgfQorICAgIGZyZWUob2xkQnVmZmVyKTsKKyAgICByZXR1cm4gcnRuOworfQorfQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZURlY29kZXJVdGls
aXRpZXMuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VEZWNvZGVyVXRp
bGl0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyYzRkYQotLS0g
L2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VEZWNv
ZGVyVXRpbGl0aWVzLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI3ByYWdtYSBvbmNlCisKK25hbWVzcGFjZSBX
ZWJDb3JlCit7CisgICAgY2xhc3MgQnl0ZUJ1ZmZlciB7CisgICAgcHVibGljOgorICAgICAgICBC
eXRlQnVmZmVyKCkgOiBtX2RhdGEoMCksIG1fc2l6ZSgwKSB7fQorICAgICAgICB+Qnl0ZUJ1ZmZl
cigpIHsgZnJlZShtX2RhdGEpOyB9CisgICAgICAgIHZvaWQgY2xlYXIoKSB7IGZyZWUobV9kYXRh
KTsgbV9kYXRhID0gMDsgbV9zaXplID0gMDsgfQorICAgICAgICBib29sIGFwcGVuZChjb25zdCBj
aGFyKiBkYXRhLCB1bnNpZ25lZCBzaXplKTsKKyAgICAgICAgY2hhciogZGF0YSgpIGNvbnN0IHsg
cmV0dXJuIG1fZGF0YTsgfQorICAgICAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4g
bV9zaXplOyB9CisgICAgICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFtX2RhdGE7
IH0KKyAgICBwcml2YXRlOgorICAgICAgICBjaGFyKiBtX2RhdGE7CisgICAgICAgIHVuc2lnbmVk
IG1fc2l6ZTsKKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9JbWFnZUZyYW1lU2luay5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9JbWFnZUZyYW1lU2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3
ZDk4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0ltYWdlRnJhbWVTaW5rLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3aWxsIGJlIHVz
ZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAq
ICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCisgKi8KKworI2lmbmRlZiBJTUFHRV9GUkFNRV9TSU5LX0hfCisjZGVmaW5lIElNQUdF
X0ZSQU1FX1NJTktfSF8KKworI2luY2x1ZGUgIkludFJlY3QuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCituYW1lc3BhY2UgUkdCQTMyQnVmZmVyIHsNCisgICAgZW51bSBGcmFtZVN0YXR1cyB7
IEZyYW1lRW1wdHksIEZyYW1lUGFydGlhbCwgRnJhbWVDb21wbGV0ZSB9Ow0KKyAgICBlbnVtIEZy
YW1lRGlzcG9zYWxNZXRob2Qgew0KKyAgICAgICAgLy8gSWYgeW91IGNoYW5nZSB0aGUgbnVtZXJp
YyB2YWx1ZXMgb2YgdGhlc2UsIG1ha2Ugc3VyZSB5b3UgYXVkaXQgYWxsDQorICAgICAgICAvLyB1
c2VycywgYXMgc29tZSB1c2VycyBtYXkgY2FzdCByYXcgdmFsdWVzIHRvL2Zyb20gdGhlc2UgY29u
c3RhbnRzLg0KKyAgICAgICAgRGlzcG9zZU5vdFNwZWNpZmllZCA9IDAsICAgICAgIC8vIExlYXZl
IGZyYW1lIGluIGZyYW1lYnVmZmVyDQorICAgICAgICBEaXNwb3NlS2VlcCA9IDEsICAgICAgICAg
ICAgICAgLy8gTGVhdmUgZnJhbWUgaW4gZnJhbWVidWZmZXINCisgICAgICAgIERpc3Bvc2VPdmVy
d3JpdGVCZ2NvbG9yID0gMiwgICAvLyBDbGVhciBmcmFtZSB0byB0cmFuc3BhcmVudA0KKyAgICAg
ICAgRGlzcG9zZU92ZXJ3cml0ZVByZXZpb3VzID0gMywgIC8vIENsZWFyIGZyYW1lIHRvIHByZXZp
b3VzIGZyYW1lYnVmZmVyIGNvbnRlbnRzDQorICAgIH07DQorfQ0KKworY2xhc3MgSW1hZ2VGcmFt
ZVNpbmsgeworcHVibGljOgorICAgIEltYWdlRnJhbWVTaW5rKGJvb2wgY2FuRnJlZUJ1ZmZlcikK
KyAgICAgICAgOiBtXzE2Yml0KGZhbHNlKQorICAgICAgICAsIG1faW1hZ2VXaWR0aCgwKQorICAg
ICAgICAsIG1fYnVmZmVyV2lkdGgoMCkKKyAgICAgICAgLCBtX2hlaWdodCgwKQorICAgICAgICAs
IG1fZXhwZWN0ZWRIZWlnaHQoMCkKKyAgICAgICAgLCBtX3N0YXR1cyhSR0JBMzJCdWZmZXI6OkZy
YW1lRW1wdHkpCisgICAgICAgICwgbV9kaXNwb3NhbE1ldGhvZChSR0JBMzJCdWZmZXI6OkRpc3Bv
c2VOb3RTcGVjaWZpZWQpCisgICAgICAgICwgbV9kdXJhdGlvbigwKQorICAgICAgICAsIG1faGFz
QWxwaGEoZmFsc2UpCisgICAgICAgICwgbV9jYW5GcmVlQnVmZmVyKGNhbkZyZWVCdWZmZXIpCisg
ICAgICAgICwgbV9zaG91bGRGcmVlQnVmZmVyKGZhbHNlKQorICAgICAgICAsIG1fdXNlc1RyYW5z
cGFyZW50Q29sb3IoZmFsc2UpCisgICAgICAgICwgbV90cmFuc3BhcmVudENvbG9yKDApCisgICAg
ICAgICwgbV9jb21wb3NpdGVkV2l0aFByZXZpb3VzRnJhbWUoZmFsc2UpCisgICAge30gCisKKyAg
ICB+SW1hZ2VGcmFtZVNpbmsoKSB7IGZyZWVCdWZmZXIoKTsgfQorCisgICAgY29uc3Qgdm9pZCog
Ynl0ZXMoKSBjb25zdDsKKyAgICB2b2lkKiBieXRlcygpOworICAgIGJvb2wgYWxsb2NhdGVCdWZm
ZXIoKTsKKyAgICBOYXRpdmVJbWFnZVB0ciBnZXRGcmFtZSgpOworICAgIGJvb2wgaXNCdWZmZXJS
ZWFkeSgpIGNvbnN0OworICAgIHZvaWQgZnJlZUJ1ZmZlcigpOworCisgICAgYm9vbCBzaG91bGRG
cmVlQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9zaG91bGRGcmVlQnVmZmVyOyB9CisgICAgYm9v
bCBjYW5GcmVlQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9jYW5GcmVlQnVmZmVyOyB9CisgICAg
Ym9vbCBpczE2Yml0KCkgY29uc3QgeyByZXR1cm4gbV8xNmJpdDsgfQorICAgIGNvbnN0IEludFJl
Y3QmIHJlY3QoKSBjb25zdCB7IHJldHVybiBtX3JlY3Q7IH0KKyAgICB1bnNpZ25lZCBoZWlnaHQo
KSBjb25zdCB7IHJldHVybiBtX2hlaWdodDsgfQorICAgIHVuc2lnbmVkIGJ1ZmZlcldpZHRoKCkg
Y29uc3QgeyByZXR1cm4gbV9idWZmZXJXaWR0aDsgfQorICAgIHVuc2lnbmVkIGltYWdlV2lkdGgo
KSBjb25zdCB7IHJldHVybiBtX2ltYWdlV2lkdGg7IH0KKyAgICBSR0JBMzJCdWZmZXI6OkZyYW1l
U3RhdHVzIHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdHVzOyB9CisgICAgdW5zaWduZWQg
ZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtX2R1cmF0aW9uOyB9CisgICAgYm9vbCBoYXNBbHBo
YSgpIGNvbnN0IHsgcmV0dXJuIG1faGFzQWxwaGE7IH0KKyAgICB1bnNpZ25lZCB0b3RhbEJ5dGVz
KCkgY29uc3QgeyByZXR1cm4gbV9idWZmZXJXaWR0aCAqIG1fZXhwZWN0ZWRIZWlnaHQgPDwgKG1f
MTZiaXQgPyAxIDogMik7IH0KKworICAgIHZvaWQgc2V0Q2FuRnJlZUJ1ZmZlcihib29sIGNhbik7
CisgICAgYm9vbCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBpczE2Yml0KSB7
IAorICAgICAgICBtXzE2Yml0ID0gaXMxNmJpdDsgbV9pbWFnZVdpZHRoID0gd2lkdGg7IG1fZXhw
ZWN0ZWRIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHJldHVybiBhbGxvY2F0ZUJ1ZmZlcigpOwor
ICAgIH0KKyAgICB2b2lkIHNldFJlY3QoY29uc3QgSW50UmVjdCYgcikgeyBtX3JlY3QgPSByOyB9
CisgICAgdm9pZCBlbnN1cmVIZWlnaHQoaW50IHJvd0luZGV4KTsKKyAgICB2b2lkIHNldFN0YXR1
cyhSR0JBMzJCdWZmZXI6OkZyYW1lU3RhdHVzIHMpIHsgbV9zdGF0dXMgPSBzOyB9CisgICAgdm9p
ZCBzZXREdXJhdGlvbih1bnNpZ25lZCBkdXJhdGlvbikgeyBtX2R1cmF0aW9uID0gZHVyYXRpb247
IH0KKyAgICB2b2lkIHNldEhhc0FscGhhKGJvb2wgYWxwaGEpIHsgbV9oYXNBbHBoYSA9IGFscGhh
OyB9CisgICAgYm9vbCB1c2VzVHJhbnNwYXJlbnRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdXNl
c1RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICB1bnNpZ25lZCBzaG9ydCB0cmFuc3BhcmVudENvbG9y
KCkgY29uc3QgeyByZXR1cm4gbV90cmFuc3BhcmVudENvbG9yOyB9CisgICAgdm9pZCBzZXRUcmFu
c3BhcmVudENvbG9yKHVuc2lnbmVkIHNob3J0IGNvbG9yKSB7IG1fdHJhbnNwYXJlbnRDb2xvciA9
IGNvbG9yOyBtX3VzZXNUcmFuc3BhcmVudENvbG9yID0gdHJ1ZTsgfQorICAgIHZvaWQgY2xlYXJU
cmFuc3BhcmVudENvbG9yKCkgeyBtX3VzZXNUcmFuc3BhcmVudENvbG9yID0gZmFsc2U7IH0KKyAg
ICBSR0JBMzJCdWZmZXI6OkZyYW1lRGlzcG9zYWxNZXRob2QgZGlzcG9zYWxNZXRob2QoKSBjb25z
dCB7IHJldHVybiBtX2Rpc3Bvc2FsTWV0aG9kOyB9DQorICAgIHZvaWQgc2V0RGlzcG9zYWxNZXRo
b2QoUkdCQTMyQnVmZmVyOjpGcmFtZURpc3Bvc2FsTWV0aG9kIG1ldGhvZCkgeyBtX2Rpc3Bvc2Fs
TWV0aG9kID0gbWV0aG9kOyB9DQorICAgIGJvb2wgY29tcG9zaXRlZFdpdGhQcmV2aW91c0ZyYW1l
KCkgY29uc3QgeyByZXR1cm4gbV9jb21wb3NpdGVkV2l0aFByZXZpb3VzRnJhbWU7IH0NCisgICAg
dm9pZCBzZXRDb21wb3NpdGVkV2l0aFByZXZpb3VzRnJhbWUoKSB7IG1fY29tcG9zaXRlZFdpdGhQ
cmV2aW91c0ZyYW1lID0gdHJ1ZTsgfQ0KKworICAgIHN0YXRpYyB2b2lkIHNldFJHQkEodW5zaWdu
ZWQmIHBvcywgdW5zaWduZWQgciwgdW5zaWduZWQgZywgdW5zaWduZWQgYiwgdW5zaWduZWQgYSkK
KyAgICB7CisgICAgICAgIC8vIFdlIHN0b3JlIHRoaXMgZGF0YSBwcmUtbXVsdGlwbGllZC4KKyAg
ICAgICAgaWYgKGEgPT0gMCkKKyAgICAgICAgICAgIHBvcyA9IChyIDw8IDE2IHwgZyA8PCA4IHwg
Yik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGEgPCAyNTUpIHsKKyAgICAgICAg
ICAgICAgICBmbG9hdCBhbHBoYVBlcmNlbnQgPSBhIC8gMjU1LjBmOworICAgICAgICAgICAgICAg
IHIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4ociAqIGFscGhhUGVyY2VudCk7CisgICAgICAgICAg
ICAgICAgZyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihnICogYWxwaGFQZXJjZW50KTsKKyAgICAg
ICAgICAgICAgICBiID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGIgKiBhbHBoYVBlcmNlbnQpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zID0gKGEgPDwgMjQgfCByIDw8IDE2IHwgZyA8
PCA4IHwgYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzZXRSR0IxNih1
bnNpZ25lZCBzaG9ydCYgcG9zLCB1bnNpZ25lZCByLCB1bnNpZ25lZCBnLCB1bnNpZ25lZCBiKQor
ICAgIHsKKyNpZiBJTUFHRV9OT19BTFBIQV9VU0VfUkdCNTU1CisgICAgICAgIHBvcyA9IHVuc2ln
bmVkIHNob3J0KChyID4+IDMgPDwgMTApIHwgKGcgPj4gMyA8PCA1KSB8IChiID4+IDMpKTsKKyNl
bHNlCisgICAgICAgIHBvcyA9IHVuc2lnbmVkIHNob3J0KChyID4+IDMgPDwgMTEpIHwgKGcgPj4g
MiA8PCA1KSB8IChiID4+IDMpKTsKKyNlbmRpZgorICAgIH0KKworICAgIHN0YXRpYyBJbWFnZUZy
YW1lU2luayogY3JlYXRlSW5zdGFuY2UoYm9vbCBjYW5GcmVlQnVmZmVyKTsKKyAgICBzdGF0aWMg
dm9pZCBkZWxldGVJbnN0YW5jZShJbWFnZUZyYW1lU2luayopOworCitwcm90ZWN0ZWQ6CisgICAg
SW50UmVjdCBtX3JlY3Q7ICAgIC8vIFRoZSByZWN0IG9mIHRoZSBvcmlnaW5hbCBzcGVjaWZpZWQg
ZnJhbWUgd2l0aGluIHRoZSBvdmVyYWxsIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAg
Ly8gVGhpcyB3aWxsIGFsd2F5cyBqdXN0IGJlIHRoZSBlbnRpcmUgYnVmZmVyIGV4Y2VwdCBmb3Ig
R0lGIGZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9zZSBvcmlnaW5hbCByZWN0
IHdhcyBzbWFsbGVyIHRoYW4gdGhlIG92ZXJhbGwgaW1hZ2Ugc2l6ZS4KKyAgICBpbnQgbV9pbWFn
ZVdpZHRoOworICAgIGludCBtX2J1ZmZlcldpZHRoOworICAgIGludCBtX2hlaWdodDsgLy8gVGhl
IGhlaWdodCAodGhlIG51bWJlciBvZiByb3dzIHdlJ3ZlIGZ1bGx5IGRlY29kZWQpLgorICAgIGlu
dCBtX2V4cGVjdGVkSGVpZ2h0OworICAgIFJHQkEzMkJ1ZmZlcjo6RnJhbWVTdGF0dXMgbV9zdGF0
dXM7IC8vIFdoZXRoZXIgb3Igbm90IHRoaXMgZnJhbWUgaXMgY29tcGxldGVseSBmaW5pc2hlZCBk
ZWNvZGluZy4KKyAgICBSR0JBMzJCdWZmZXI6OkZyYW1lRGlzcG9zYWxNZXRob2QgbV9kaXNwb3Nh
bE1ldGhvZDsgLy8gV2hhdCB0byBkbyB3aXRoIHRoaXMgZnJhbWUncyBkYXRhIHdoZW4gaW5pdGlh
bGl6aW5nIHRoZSBuZXh0IGZyYW1lLg0KKyAgICB1bnNpZ25lZCBtX2R1cmF0aW9uOyAvLyBUaGUg
YW5pbWF0aW9uIGRlbGF5LgorICAgIHVuc2lnbmVkIHNob3J0IG1fdHJhbnNwYXJlbnRDb2xvcjsg
Ly8gcGl4ZWwgdmFsdWUKKyAgICBib29sIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7CisgICAgYm9v
bCBtX2hhc0FscGhhOyAvLyBXaGV0aGVyIG9yIG5vdCBhbnkgb2YgdGhlIHBpeGVscyBpbiB0aGUg
YnVmZmVyIGhhdmUgdHJhbnNwYXJlbmN5LgorICAgIGJvb2wgbV9jYW5GcmVlQnVmZmVyOworICAg
IGJvb2wgbV9zaG91bGRGcmVlQnVmZmVyOworICAgIGJvb2wgbV8xNmJpdDsKKyAgICBib29sIG1f
Y29tcG9zaXRlZFdpdGhQcmV2aW91c0ZyYW1lOworI2lmIFBMQVRGT1JNKFdJTkNFKQorICAgIFJl
ZlB0cjxTaGFyZWRCaXRtYXA+IG1fYm1wOworICAgIHZvaWQgZmluaXNoQml0bWFwKCk7CisjZW5k
aWYKK307CisKK30KKworI2VuZGlmIC8vIElNQUdFX0ZSQU1FX1NJTktfSF8KZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFtZVNpbmtXaW5jZS5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rV2luY2UuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNDMzOWUKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rV2lu
Y2UuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkg
VG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZUZyYW1lU2luay5oIgorCisjaW5jbHVkZSA8d3Rm
L093blB0ci5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2lmIElNQUdFX05PX0FMUEhBX1VT
RV9SR0I1NTUKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY29udmVydDE2VG9SR0IodW5zaWduZWQg
c2hvcnQgcGl4ZWwpCit7CisgICAgdW5zaWduZWQgciA9IChwaXhlbCA+PiA3KSAmIDB4Rjg7Cisg
ICAgdW5zaWduZWQgZyA9IChwaXhlbCA+PiAyKSAmIDB4Rjg7CisgICAgdW5zaWduZWQgYiA9IChw
aXhlbCA8PCAzKSAmIDB4Rjg7CisgICAgcmV0dXJuIFJHQihyLCBnLCBiKTsKK30KKyNlbHNlIC8v
IFJHQjU2NQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjb252ZXJ0MTZUb1JHQih1bnNpZ25lZCBz
aG9ydCBwaXhlbCkKK3sKKyAgICB1bnNpZ25lZCByID0gKHBpeGVsID4+IDgpICYgMHhGODsKKyAg
ICB1bnNpZ25lZCBnID0gKHBpeGVsID4+IDMpICYgMHhGQzsKKyAgICB1bnNpZ25lZCBiID0gKHBp
eGVsIDw8IDMpICYgMHhGODsKKyAgICByZXR1cm4gUkdCKHIsIGcsIGIpOworfQorI2VuZGlmCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3Qgdm9pZCogSW1hZ2VGcmFtZVNpbms6OmJ5dGVz
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9ibXAgPyBtX2JtcC0+Ynl0ZXMoKSA6IDA7Cit9CisK
K3ZvaWQqIEltYWdlRnJhbWVTaW5rOjpieXRlcygpCit7CisgICAgcmV0dXJuIG1fYm1wID8gbV9i
bXAtPmJ5dGVzKCkgOiAwOworfQorCitib29sIEltYWdlRnJhbWVTaW5rOjphbGxvY2F0ZUJ1ZmZl
cigpCit7CisgICAgZnJlZUJ1ZmZlcigpOworCisgICAgaWYgKG1faW1hZ2VXaWR0aCA8PSAwIHx8
IG1fZXhwZWN0ZWRIZWlnaHQgPD0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYg
KG1fMTZiaXQpIHsKKyAgICAgICAgbV9idWZmZXJXaWR0aCA9IG1faW1hZ2VXaWR0aCA+PiAxIDw8
IDE7CisgICAgICAgIGlmIChtX2J1ZmZlcldpZHRoICE9IG1faW1hZ2VXaWR0aCkKKyAgICAgICAg
ICAgIG1fYnVmZmVyV2lkdGggKz0gMjsKKyAgICB9IGVsc2UKKyAgICAgICAgbV9idWZmZXJXaWR0
aCA9IG1faW1hZ2VXaWR0aDsKKworICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7
CisKKyAgICBpZiAobV9ibXAgPSBTaGFyZWRCaXRtYXA6OmNyZWF0ZUluc3RhbmNlKG1fMTZiaXQs
IG1faW1hZ2VXaWR0aCwgbV9leHBlY3RlZEhlaWdodCwgdHJ1ZSkpIHsKKyAgICAgICAgbV9ibXAt
PmxvY2soKTsKKyAgICAgICAgbV9ibXAtPnNldFZhbGlkSGVpZ2h0KDApOworICAgICAgICBpZiAo
bV8xNmJpdCAmJiBtX3VzZXNUcmFuc3BhcmVudENvbG9yICYmICFtX2JtcC0+dXNlc1RyYW5zcGFy
ZW50Q29sb3IoKSkKKyAgICAgICAgICAgIG1fYm1wLT5zZXRUcmFuc3BhcmVudENvbG9yKGNvbnZl
cnQxNlRvUkdCKG1fdHJhbnNwYXJlbnRDb2xvcikpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSW1hZ2VGcmFtZVNpbms6OmlzQnVm
ZmVyUmVhZHkoKSBjb25zdCB7IHJldHVybiAhIW1fYm1wOyB9Cit2b2lkIEltYWdlRnJhbWVTaW5r
OjpmcmVlQnVmZmVyKCkKK3sgCisgICAgaWYgKG1fYm1wKSB7CisgICAgICAgIGlmICghbV9ibXAt
Pmhhc09uZVJlZigpKQorICAgICAgICAgICAgZmluaXNoQml0bWFwKCk7CisgICAgICAgIG1fYm1w
ID0gMDsKKyAgICB9Cit9CisKK05hdGl2ZUltYWdlUHRyIEltYWdlRnJhbWVTaW5rOjpnZXRGcmFt
ZSgpCit7CisgICAgaWYgKG1fc3RhdHVzID09IFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSB8fCAh
bV9ibXApCisgICAgICAgIHJldHVybiAwOworCisgICAgbV9ibXAtPnNldEhhc0FscGhhKGhhc0Fs
cGhhKCkpOworICAgIG1fc2hvdWxkRnJlZUJ1ZmZlciA9IG1fc3RhdHVzID09IFJHQkEzMkJ1ZmZl
cjo6RnJhbWVDb21wbGV0ZTsKKyAgICBpZiAobV9jYW5GcmVlQnVmZmVyICYmIG1fc2hvdWxkRnJl
ZUJ1ZmZlcikKKyAgICAgICAgZmluaXNoQml0bWFwKCk7CisKKyAgICByZXR1cm4gbV9ibXA7Cit9
CisKK3ZvaWQgSW1hZ2VGcmFtZVNpbms6OnNldENhbkZyZWVCdWZmZXIoYm9vbCBjYW4pCit7Cisg
ICAgbV9jYW5GcmVlQnVmZmVyID0gY2FuOworICAgIGlmIChtX2NhbkZyZWVCdWZmZXIgJiYgbV9z
aG91bGRGcmVlQnVmZmVyKQorICAgICAgICBmaW5pc2hCaXRtYXAoKTsKK30KKwordm9pZCBJbWFn
ZUZyYW1lU2luazo6ZmluaXNoQml0bWFwKCkKK3sKKyAgICBpZiAobV9ibXAgJiYgbV9ibXAtPmxv
Y2tlZCgpKSB7CisgICAgICAgIG1fYm1wLT51bmxvY2soKTsKKyAgICAgICAgaWYgKG1fdXNlc1Ry
YW5zcGFyZW50Q29sb3IpCisgICAgICAgICAgICBtX2JtcC0+c2V0VHJhbnNwYXJlbnRDb2xvcihj
b252ZXJ0MTZUb1JHQihtX3RyYW5zcGFyZW50Q29sb3IpKTsKKyAgICAgICAgaWYgKCFtXzE2Yml0
ICYmICghbV9oYXNBbHBoYSB8fCBtX3VzZXNUcmFuc3BhcmVudENvbG9yKSkgeworICAgICAgICAg
ICAgbV9ibXAtPnNldEhhc0FscGhhKGZhbHNlKTsKKyAgICAgICAgICAgIG1fMTZiaXQgPSBtX2Jt
cC0+dG8xNmJpdCgpOworICAgICAgICB9CisgICAgICAgIGlmIChtXzE2Yml0KQorICAgICAgICAg
ICAgc2V0SGFzQWxwaGEoZmFsc2UpOworICAgICAgICBtX2JtcC0+c2V0SGFzQWxwaGEoaGFzQWxw
aGEoKSk7CisgICAgfQorfTsKKwordm9pZCBJbWFnZUZyYW1lU2luazo6ZW5zdXJlSGVpZ2h0KGlu
dCByb3dJbmRleCkKK3sKKyAgICBpZiAocm93SW5kZXggPiBtX2hlaWdodCkgeworICAgICAgICBt
X2hlaWdodCA9IHJvd0luZGV4OworICAgICAgICBpZiAobV9ibXApCisgICAgICAgICAgICBtX2Jt
cC0+c2V0VmFsaWRIZWlnaHQobV9oZWlnaHQpOworICAgIH0KK30KKworSW1hZ2VGcmFtZVNpbmsq
IEltYWdlRnJhbWVTaW5rOjpjcmVhdGVJbnN0YW5jZShib29sIGNhbkZyZWVCdWZmZXIpCit7Cisg
ICAgcmV0dXJuIG5ldyBJbWFnZUZyYW1lU2luayhjYW5GcmVlQnVmZmVyKTsKK30KKwordm9pZCBJ
bWFnZUZyYW1lU2luazo6ZGVsZXRlSW5zdGFuY2UoSW1hZ2VGcmFtZVNpbmsqIGkpCit7CisgICAg
ZGVsZXRlIGk7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvSW1hZ2VTb3VyY2VXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL0ltYWdlU291cmNlV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLmZmNjBlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL0ltYWdlU291cmNlV2luY2UuY3BwCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwLnRva2VyQGNvbGxhYm9yYS5j
by51az4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkltYWdlU291cmNlLmgiCisKKyNp
bmNsdWRlICJHSUZJbWFnZURlY29kZXIuaCIKKyNpbmNsdWRlICJJbWFnZURlY29kZXIuaCIKKyNp
bmNsdWRlICJKUEVHSW1hZ2VEZWNvZGVyLmgiCisjaW5jbHVkZSAiUE5HSW1hZ2VEZWNvZGVyLmgi
CisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2lu
Y2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordHlwZWRlZiBIYXNoU2V0PFNoYXJlZEJpdG1hcCo+IEJpdG1hcE1hcDsK
K2V4dGVybiBCaXRtYXBNYXAgZ19iaXRtYXBNYXA7CisKK2ludCBkaXNjYXJkQml0bWFwSGFuZGxl
cygpCit7CisgICAgaW50IGRlbGV0ZWQgPSAwOworICAgIGZvciAoQml0bWFwTWFwOjppdGVyYXRv
ciBpID0gZ19iaXRtYXBNYXAuYmVnaW4oKTsgaSAhPSBnX2JpdG1hcE1hcC5lbmQoKTsgKytpKSB7
CisgICAgICAgIGlmICgoKmkpLT5mcmVlTWVtb3J5KCkpCisgICAgICAgICAgICArK2RlbGV0ZWQ7
CisgICAgfQorICAgIHJldHVybiBkZWxldGVkOworfQorCitzdGF0aWMgSW1hZ2VEZWNvZGVyKiBj
cmVhdGVEZWNvZGVyKGNvbnN0IFNoYXJlZEJ1ZmZlciogYnVmZmVyKQoreworICAgIE1lbW9yeUFs
bG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7CisKKyAgICAvLyBXZSBuZWVkIGF0IGxlYXN0IDQgYnl0
ZXMgdG8gZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgaW1hZ2Ugd2UncmUgZGVhbGluZyB3aXRoLgor
ICAgIFNoYXJlZEJ1ZmZlclNlZ21lbnQgc2VnbWVudCgqYnVmZmVyKTsKKyAgICBpbnQgbGVuZ3Ro
ID0gc2VnbWVudC5sZW5ndGgoKTsKKyAgICBpZiAobGVuZ3RoIDwgNCkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICAvLyBHSUZzIGJlZ2luIHdpdGggR0lGOCg3IG9yIDkpLgorICAgIGlmIChzdHJu
Y21wKHNlZ21lbnQuZGF0YSgpLCAiR0lGOCIsIDQpID09IDApIHsKKyAgICAgICAgR0lGSW1hZ2VE
ZWNvZGVyKiBydG4gPSBuZXcgR0lGSW1hZ2VEZWNvZGVyKCk7CisgICAgICAgIGlmIChydG4pCisg
ICAgICAgICAgICBydG4tPnNldE1heE51bVBpeGVscygxMDI0ICogMTAyNCk7CisgICAgICAgIHJl
dHVybiBydG47CisgICAgfQorCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogdUNvbnRlbnRzID0g
KGNvbnN0IHVuc2lnbmVkIGNoYXIqKXNlZ21lbnQuZGF0YSgpOworCisgICAgLy8gVGVzdCBmb3Ig
UE5HLgorICAgIGlmICh1Q29udGVudHNbMF09PTB4ODkgJiYKKyAgICAgICAgdUNvbnRlbnRzWzFd
PT0weDUwICYmCisgICAgICAgIHVDb250ZW50c1syXT09MHg0RSAmJgorICAgICAgICB1Q29udGVu
dHNbM109PTB4NDcKKyAgICApIHsKKyAgICAgICAgUE5HSW1hZ2VEZWNvZGVyKiBydG4gPSBuZXcg
UE5HSW1hZ2VEZWNvZGVyKCk7CisgICAgICAgIGlmIChydG4pCisgICAgICAgICAgICBydG4tPnNl
dE1heE51bVBpeGVscygxMDI0ICogMTAyNCk7CisgICAgICAgIHJldHVybiBydG47CisgICAgfQor
CisgICAgLy8gSlBFRworICAgIGlmICh1Q29udGVudHNbMF09PTB4RkYgJiYKKyAgICAgICAgdUNv
bnRlbnRzWzFdPT0weEQ4ICYmCisgICAgICAgIHVDb250ZW50c1syXT09MHhGRgorICAgICkgewor
ICAgICAgICBKUEVHSW1hZ2VEZWNvZGVyKiBydG4gPSBuZXcgSlBFR0ltYWdlRGVjb2RlcigpOwor
ICAgICAgICBpZiAocnRuKQorICAgICAgICAgICAgcnRuLT5zZXRNYXhOdW1QaXhlbHMoMTAyNCAq
IDEwMjQpOworICAgICAgICByZXR1cm4gcnRuOworICAgIH0KKworI2lmIDAKKyAgICAvLyBCTVAK
KyAgICBpZiAoc3RybmNtcChjb250ZW50cywgIkJNIiwgMikgPT0gMCkKKyAgICAgICAgcmV0dXJu
IG5ldyBCTVBJbWFnZURlY29kZXIoKTsKKworICAgIC8vIElDT3MgYWx3YXlzIGJlZ2luIHdpdGgg
YSAyLWJ5dGUgMCBmb2xsb3dlZCBieSBhIDItYnl0ZSAxLgorICAgIC8vIENVUnMgYmVnaW4gd2l0
aCAyLWJ5dGUgMCBmb2xsb3dlZCBieSAyLWJ5dGUgMi4KKyAgICBpZiAoIW1lbWNtcChjb250ZW50
cywgIlwwMDBcMDAwXDAwMVwwMDAiLCA0KSB8fAorICAgICAgICAhbWVtY21wKGNvbnRlbnRzLCAi
XDAwMFwwMDBcMDAyXDAwMCIsIDQpKQorICAgICAgICByZXR1cm4gbmV3IElDT0ltYWdlRGVjb2Rl
cigpOworICAgCisgICAgLy8gWEJNcyByZXF1aXJlIDggYnl0ZXMgb2YgaW5mby4KKyAgICBpZiAo
bGVuZ3RoID49IDggJiYgc3RybmNtcChjb250ZW50cywgIiNkZWZpbmUgIiwgOCkgPT0gMCkKKyAg
ICAgICAgcmV0dXJuIG5ldyBYQk1JbWFnZURlY29kZXIoKTsKKyNlbmRpZgorCisgICAgLy8gR2l2
ZSB1cC4gV2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBoZWNrIHRoaXMgaXMuCisgICAgcmV0dXJuIDA7
Cit9CisKK0ltYWdlU291cmNlOjpJbWFnZVNvdXJjZSgpCisgIDogbV9kZWNvZGVyKDApCisgICwg
bV9hbGxEYXRhUmVjZWl2ZWQoZmFsc2UpCit7Cit9CisKK0ltYWdlU291cmNlOjp+SW1hZ2VTb3Vy
Y2UoKQoreworICAgIGRlbGV0ZSBtX2RlY29kZXI7Cit9CisKK3ZvaWQgSW1hZ2VTb3VyY2U6OmNs
ZWFyKGJvb2wgZGVzdHJveUFsbCwgc2l6ZV90IGNsZWFyQmVmb3JlRnJhbWUsIFNoYXJlZEJ1ZmZl
ciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpCit7CisgICAgaWYgKGRlc3Ryb3lBbGwpIHsK
KyAgICAgICAgZGVsZXRlIG1fZGVjb2RlcjsKKyAgICAgICAgbV9kZWNvZGVyID0gMDsKKyAgICAg
ICAgaWYgKGRhdGEpCisgICAgICAgICAgc2V0RGF0YShkYXRhLCBhbGxEYXRhUmVjZWl2ZWQpOw0K
KyAgICB9IGVsc2UgaWYgKG1fZGVjb2RlcikNCisgICAgICAgIG1fZGVjb2Rlci0+Y2xlYXJGcmFt
ZUJ1ZmZlckNhY2hlKGNsZWFyQmVmb3JlRnJhbWUpOworfQorCitib29sIEltYWdlU291cmNlOjpp
bml0aWFsaXplZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuICEhbV9kZWNvZGVyOworfQorCit2b2lk
IEltYWdlU291cmNlOjpzZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVj
ZWl2ZWQpCit7CisgICAgLy8gTWFrZSB0aGUgZGVjb2RlciBieSBzbmlmZmluZyB0aGUgYnl0ZXMu
CisgICAgLy8gVGhpcyBtZXRob2Qgd2lsbCBleGFtaW5lIHRoZSBkYXRhIGFuZCBpbnN0YW50aWF0
ZSBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgZGVjb2RlciBwbHVnaW4uCisgICAgLy8g
SWYgaW5zdWZmaWNpZW50IGJ5dGVzIGFyZSBhdmFpbGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBpbWFn
ZSB0eXBlLCBubyBkZWNvZGVyIHBsdWdpbiB3aWxsIGJlCisgICAgLy8gbWFkZS4KKyAgICBtX2Fs
bERhdGFSZWNlaXZlZCA9IGFsbERhdGFSZWNlaXZlZDsKKyAgICBpZiAobV9hbGxEYXRhUmVjZWl2
ZWQgJiYgIW1fZGVjb2RlcikKKyAgICAgICAgbV9kZWNvZGVyID0gY3JlYXRlRGVjb2RlcihkYXRh
KTsKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuOworICAgIG1fZGVjb2Rlci0+
c2V0RGF0YShkYXRhLCBhbGxEYXRhUmVjZWl2ZWQpOworfQorCitib29sIEltYWdlU291cmNlOjpp
c1NpemVBdmFpbGFibGUoKQoreworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICByZXR1cm4gbV9kZWNvZGVyLT5pc1NpemVBdmFpbGFibGUoKTsKK30KKwor
SW50U2l6ZSBJbWFnZVNvdXJjZTo6c2l6ZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2RlY29kZXIp
CisgICAgICAgIHJldHVybiBJbnRTaXplKCk7CisKKyAgICByZXR1cm4gbV9kZWNvZGVyLT5zaXpl
KCk7Cit9CisKK2ludCBJbWFnZVNvdXJjZTo6cmVwZXRpdGlvbkNvdW50KCkKK3sKKyAgICBpZiAo
IW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIGNBbmltYXRpb25Ob25lOworCisgICAgcmV0dXJu
IG1fZGVjb2Rlci0+cmVwZXRpdGlvbkNvdW50KCk7Cit9CisKK3NpemVfdCBJbWFnZVNvdXJjZTo6
ZnJhbWVDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGVjb2RlciA/IG1fZGVjb2Rlci0+
ZnJhbWVDb3VudCgpIDogMDsKK30KKworTmF0aXZlSW1hZ2VQdHIgSW1hZ2VTb3VyY2U6OmNyZWF0
ZUZyYW1lQXRJbmRleChzaXplX3QgaW5kZXgpCit7CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9IG1fZGVjb2Rlci0+
ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKworICAgIGlmICghYnVmZmVyIHx8IGJ1ZmZlci0+
c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5KQorICAgICAgICByZXR1cm4gMDsK
KworICAgIHJldHVybiBidWZmZXItPmdldEZyYW1lKCk7Cit9CisKK2Jvb2wgSW1hZ2VTb3VyY2U6
OmZyYW1lSXNDb21wbGV0ZUF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIGlmICghbV9kZWNv
ZGVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1
ZmZlciA9IG1fZGVjb2Rlci0+ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKyAgICByZXR1cm4g
YnVmZmVyICYmIGJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRl
OworfQorCitmbG9hdCBJbWFnZVNvdXJjZTo6ZnJhbWVEdXJhdGlvbkF0SW5kZXgoc2l6ZV90IGlu
ZGV4KQoreworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZs
b2F0IGR1cmF0aW9uOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9IG1fZGVjb2Rlci0+
ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBkdXJhdGlvbiA9IGJ1ZmZlci0+ZHVyYXRpb24oKSAvIDEwMDAuMGY7CisK
KyAgICAvLyBNYW55IGFubm95aW5nIGFkcyBzcGVjaWZ5IGEgMCBkdXJhdGlvbiB0byBtYWtlIGFu
IGltYWdlIGZsYXNoIGFzIHF1aWNrbHkKKyAgICAvLyBhcyBwb3NzaWJsZS4gIFdlIGZvbGxvdyBX
aW5JRSdzIGJlaGF2aW9yIGFuZCB1c2UgYSBkdXJhdGlvbiBvZiAxMDAgbXMKKyAgICAvLyBmb3Ig
YW55IGZyYW1lcyB0aGF0IHNwZWNpZnkgYSBkdXJhdGlvbiBvZiA8PSA1MCBtcy4gIFNlZQorICAg
IC8vIDxodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDQxMz4gb3IgUmFk
YXIgNDA1MTM4OSBmb3IKKyAgICAvLyBtb3JlLgorICAgIHJldHVybiAoZHVyYXRpb24gPCAwLjA1
MWYpID8gMC4xMDBmIDogZHVyYXRpb247Cit9CisKK2Jvb2wgSW1hZ2VTb3VyY2U6OmZyYW1lSGFz
QWxwaGFBdEluZGV4KHNpemVfdCBpbmRleCkKK3sKKyAgICBpZiAoIW1fZGVjb2RlciB8fCAhbV9k
ZWNvZGVyLT5zdXBwb3J0c0FscGhhKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIElt
YWdlRnJhbWVTaW5rKiBidWZmZXIgPSBtX2RlY29kZXItPmZyYW1lQnVmZmVyQXRJbmRleChpbmRl
eCk7CisgICAgaWYgKCFidWZmZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVy
biBidWZmZXItPmhhc0FscGhhKCk7Cit9CisKK0ludFNpemUgSW1hZ2VTb3VyY2U6OmZyYW1lU2l6
ZUF0SW5kZXgoc2l6ZV90KSBjb25zdAoreworICAgIHJldHVybiBzaXplKCk7Cit9CisKK1N0cmlu
ZyBJbWFnZVNvdXJjZTo6ZmlsZW5hbWVFeHRlbnNpb24oKSBjb25zdAoreworICAgIGlmICghbV9k
ZWNvZGVyKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgcmV0dXJuIG1fZGVjb2Rlci0+
ZmlsZW5hbWVFeHRlbnNpb24oKTsKK30KKworfQorCisvLyB2aW06IHRzPTQgc3c9NCBldApkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVdpbmNlLmNwcCBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5jZS5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3MTliZQotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5jZS5jcHAKQEAgLTAsMCArMSwy
MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSBJ
bmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisKKyNp
bmNsdWRlICJCaXRtYXBJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2lu
Y2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNp
bmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5o
IgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworc3Rh
dGljIGlubGluZSBpbnQgc3RhYmxlUm91bmQoZG91YmxlIGQpCit7CisgICAgaWYgKGQgPiAwKQor
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkICsgMC41KTsKKworICAgIGludCBpID0g
c3RhdGljX2Nhc3Q8aW50PihkKTsKKyAgICByZXR1cm4gaSAtIGQgPiAwLjUgPyBpIC0gMSA6IGk7
Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gbG9hZHMgcmVzb3VyY2VzIGZyb20gV2ViS2l0CitQYXNz
UmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gbG9hZFJlc291cmNlSW50b0J1ZmZlcihjb25z
dCBjaGFyKiBuYW1lKTsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitib29sIEZyYW1lRGF0YTo6
Y2xlYXIoYm9vbCBjbGVhck1ldGFEYXRhKQoreworICAgIGlmIChjbGVhck1ldGFEYXRhKQ0KKyAg
ICAgICAgbV9oYXZlTWV0YWRhdGEgPSBmYWxzZTsNCisNCisgICAgaWYgKG1fZnJhbWUpIHsNCisg
ICAgICAgIG1fZnJhbWUgPSAwOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0KKworICAg
IHJldHVybiBmYWxzZTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6aW5pdFBsYXRmb3JtRGF0YSgp
Cit7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmludmFsaWRhdGVQbGF0Zm9ybURhdGEoKQorewor
fQorCitib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQKEhCSVRNQVAgYm1wKQoreworICAgIHJl
dHVybiBnZXRIQklUTUFQT2ZTaXplKGJtcCwgMCk7Cit9CisKK2Jvb2wgQml0bWFwSW1hZ2U6Omdl
dEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAsIExQU0laRSBzaXplKQoreworICAgIGlmICghYm1w
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBCSVRNQVAgYm1wSW5mbzsKKyAgICBHZXRP
YmplY3QoYm1wLCBzaXplb2YoQklUTUFQKSwgJmJtcEluZm8pOworCisgICAgQVNTRVJUKGJtcElu
Zm8uYm1CaXRzUGl4ZWwgPT0gMzIpOworICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5ibVdp
ZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OworCisgICAgT3duUHRyPEhEQz4gaGRjKENyZWF0
ZUNvbXBhdGlibGVEQyhOVUxMKSk7CisgICAgSEdESU9CSiBoT2xkQm1wID0gU2VsZWN0T2JqZWN0
KGhkYy5nZXQoKSwgYm1wKTsKKworICAgIHsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0IGdjKGhk
Yy5nZXQoKSk7CisKKyAgICAgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6
ZSgpOworICAgICAgICBpZiAoc2l6ZSkKKyAgICAgICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291
cmNlU2l6ZSgmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1I
ZWlnaHQpLCBJbnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIGRyYXcoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJ
bmZvLmJtSGVpZ2h0KSwgRmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNp
emUuaGVpZ2h0KCkpLCBDb21wb3NpdGVDb3B5KTsKKyAgICB9CisKKyAgICBTZWxlY3RPYmplY3Qo
aGRjLmdldCgpLCBoT2xkQm1wKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEJpdG1h
cEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoR3JhcGhpY3NDb250ZXh0KiBjdHh0
LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFNpemUmIHNyY1NpemUsIENvbXBv
c2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGludCBmcmFtZXMgPSBmcmFtZUNvdW50
KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAgICBSZWZQ
dHI8U2hhcmVkQml0bWFwPiBibXAgPSBmcmFtZUF0SW5kZXgoaSk7CisgICAgICAgIGlmIChibXAg
JiYgYm1wLT5oZWlnaHQoKSA9PSAoc2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgYm1wLT53aWR0
aCgpID09IChzaXplX3Qpc3JjU2l6ZS53aWR0aCgpKSB7CisgICAgICAgICAgICBzaXplX3QgY3Vy
cmVudEZyYW1lID0gbV9jdXJyZW50RnJhbWU7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9
IGk7CisgICAgICAgICAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBzcmNT
aXplLndpZHRoKCksIHNyY1NpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CisgICAgICAgICAg
ICBtX2N1cnJlbnRGcmFtZSA9IGN1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIC8vIE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0IHNpemUgd2Fz
IGZvdW5kLCBmYWxsYmFjayB0byBkcmF3aW5nIHRoZSBjdXJyZW50IGZyYW1lCisgICAgSW50U2l6
ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOworICAgIGRyYXcoY3R4dCwgZHN0UmVj
dCwgRmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkp
LCBjb21wb3NpdGVPcCk7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXcoR3JhcGhpY3NDb250
ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3Jj
UmVjdEluLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fc291
cmNlLmluaXRpYWxpemVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBSZWZQdHI8U2hh
cmVkQml0bWFwPiBibXAgPSBmcmFtZUF0SW5kZXgobV9jdXJyZW50RnJhbWUpOworICAgIGlmICht
YXlGaWxsV2l0aFNvbGlkQ29sb3IoKSkKKyAgICAgICAgZmlsbFdpdGhTb2xpZENvbG9yKGN0eHQs
IGRzdFJlY3QsIHNvbGlkQ29sb3IoKSwgY29tcG9zaXRlT3ApOworICAgIGVsc2UgeworICAgICAg
ICBJbnRSZWN0IGludFNyY1JlY3Qoc3JjUmVjdEluKTsKKworICAgICAgICBpZiAoYm1wLT53aWR0
aCgpICE9IG1fc291cmNlLnNpemUoKS53aWR0aCgpKSB7CisgICAgICAgICAgICBkb3VibGUgcmF0
ZSA9IChkb3VibGUpYm1wLT53aWR0aCgpIC8gbV9zb3VyY2Uuc2l6ZSgpLndpZHRoKCk7CisgICAg
ICAgICAgICBpbnQgdGVtcCA9IHN0YWJsZVJvdW5kKHNyY1JlY3RJbi5yaWdodCgpICogcmF0ZSk7
CisgICAgICAgICAgICBpbnRTcmNSZWN0LnNldFgoc3RhYmxlUm91bmQoc3JjUmVjdEluLngoKSAq
IHJhdGUpKTsKKyAgICAgICAgICAgIGludFNyY1JlY3Quc2V0V2lkdGgodGVtcCAtIGludFNyY1Jl
Y3QueCgpKTsKKyAgICAgICAgICAgIHRlbXAgPSBzdGFibGVSb3VuZChzcmNSZWN0SW4uYm90dG9t
KCkgKiByYXRlKTsKKyAgICAgICAgICAgIGludFNyY1JlY3Quc2V0WShzdGFibGVSb3VuZChzcmNS
ZWN0SW4ueSgpICogcmF0ZSkpOworICAgICAgICAgICAgaW50U3JjUmVjdC5zZXRIZWlnaHQodGVt
cCAtIGludFNyY1JlY3QueSgpKTsKKyAgICAgICAgfQorICAgICAgICBibXAtPmRyYXcoY3R4dCwg
ZW5jbG9zaW5nSW50UmVjdChkc3RSZWN0KSwgaW50U3JjUmVjdCwgY29tcG9zaXRlT3ApOworICAg
IH0KKworICAgIHN0YXJ0QW5pbWF0aW9uKCk7Cit9CisKK1Bhc3NSZWZQdHI8SW1hZ2U+IEltYWdl
Ojpsb2FkUGxhdGZvcm1SZXNvdXJjZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIFJlZlB0cjxT
aGFyZWRCdWZmZXI+IGJ1ZmZlciA9IGxvYWRSZXNvdXJjZUludG9CdWZmZXIobmFtZSk7CisgICAg
UmVmUHRyPEJpdG1hcEltYWdlPiBpbWcgPSBCaXRtYXBJbWFnZTo6Y3JlYXRlKCk7CisgICAgaW1n
LT5zZXREYXRhKGJ1ZmZlci5yZWxlYXNlKCksIHRydWUpOworICAgIHJldHVybiBpbWc7Cit9CisK
K3ZvaWQgSW1hZ2U6OmRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxv
YXRSZWN0JiB0aWxlUmVjdCwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFu
c2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwg
Q29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QpCit7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhd1BhdHRlcm4oR3Jh
cGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25z
dCBGbG9hdFJlY3QmIGRlc3RSZWN0KQoreworICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCA9
IG5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAgaWYgKGJtcCkKKyAgICAgICAgYm1w
LT5kcmF3UGF0dGVybihjdHh0LCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwg
b3AsIGRlc3RSZWN0LCBtX3NvdXJjZS5zaXplKCkpOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpj
aGVja0ZvclNvbGlkQ29sb3IoKQoreworICAgIGlmIChtX2NoZWNrZWRGb3JTb2xpZENvbG9yKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZnJhbWVDb3VudCgpICE9IDEpIHsKKyAgICAgICAg
bV9pc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgbV9jaGVja2VkRm9yU29saWRDb2xvciA9
IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSZWZQdHI8U2hhcmVkQml0bWFw
PiBibXAgPSBmcmFtZUF0SW5kZXgoMCk7CisgICAgaWYgKCFibXAgfHwgYm1wLT52YWxpZEhlaWdo
dCgpID09IDApIHsKKyAgICAgICAgbV9pc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIGlmIChibXAtPndpZHRoKCkgPT0gMSAmJiBibXAtPnZhbGlkSGVp
Z2h0KCkgPT0gMSkgeworICAgICAgICBtX2lzU29saWRDb2xvciA9IHRydWU7CisKKyAgICAgICAg
aWYgKGJtcC0+aXMxNmJpdCgpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBjID0gKCh1
bnNpZ25lZCBzaG9ydCAqKWJtcC0+Ynl0ZXMoKSlbMF07CisjaWYgSU1BR0VfTk9fQUxQSEFfVVNF
X1JHQjU1NQorICAgICAgICAgICAgaW50IHIgPSAoYyA+PiA3KSAmIDB4Rjg7CisgICAgICAgICAg
ICBpbnQgZyA9IChjID4+IDIpICYgMHhGODsKKyAgICAgICAgICAgIGludCBiID0gKGMgPDwgMykg
JiAweEY4OworI2Vsc2UKKyAgICAgICAgICAgIGludCByID0gKGMgPj4gOCkgJiAweEY4OworICAg
ICAgICAgICAgaW50IGcgPSAoYyA+PiAzKSAmIDB4RkM7CisgICAgICAgICAgICBpbnQgYiA9IChj
IDw8IDMpICYgMHhGODsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGJtcC0+dXNlc1RyYW5zcGFy
ZW50Q29sb3IoKSAmJiBibXAtPnRyYW5zcGFyZW50Q29sb3IoKSA9PSBSR0IociwgZywgYikpCisg
ICAgICAgICAgICAgICAgbV9zb2xpZENvbG9yID0gQ29sb3IociwgZywgYiwgMCk7CisgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9zb2xpZENvbG9yID0gQ29sb3IociwgZywgYik7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjID0gKCh1bnNpZ25lZCAq
KWJtcC0+Ynl0ZXMoKSlbMF07CisgICAgICAgICAgICBtX3NvbGlkQ29sb3IgPSBDb2xvcihjKTsK
KyAgICAgICAgfQorCisgICAgICAgIGlmIChibXAtPnZhbGlkSGVpZ2h0KCkgPT0gYm1wLT5oZWln
aHQoKSkKKyAgICAgICAgICAgIG1fY2hlY2tlZEZvclNvbGlkQ29sb3IgPSB0cnVlOworICAgIH0g
ZWxzZSB7CisgICAgICAgIG1faXNTb2xpZENvbG9yID0gZmFsc2U7CisgICAgICAgIG1fY2hlY2tl
ZEZvclNvbGlkQ29sb3IgPSB0cnVlOworICAgIH0KK30KKworCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNv
ZGVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSlBFR0VuY29kZXIuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NDYzNTkKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNvZGVyLmNwcApA
QCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUs
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3aWxsIGJlIHVzZWZ1bCwKKyAqICBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkpQRUdFbmNvZGVyLmgiCisKKyNpbmNs
dWRlICJTaGFyZWRCaXRtYXAuaCIKKworI2RlZmluZSBYTURfSAorI2RlZmluZSBWVEtfSlBFR19Y
TURfSAorI3VuZGVmIEZBUgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJqcGVnbGliLmgiCit9
CisKK25hbWVzcGFjZSBXZWJDb3JlCit7CisKK3N0cnVjdCBqcGVnX2Rlc3RfbWdyDQorew0KKwlz
dHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgcHViOw0KKyAgICBWZWN0b3I8Y2hhcj4gYnVmZmVy
Ow0KKyAgICBWZWN0b3I8Y2hhcj4qIGR1bXA7DQorfTsNCisNCitzdHJ1Y3QganBlZ19jb21wcmVz
c19lcnJvcl9tZ3IKK3sKKyAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgcHViOyAKKyAgICBqbXBf
YnVmIHNldGptcF9idWZmZXI7Cit9OworDQordm9pZCBqcGVnX2luaXRfZGVzdGluYXRpb24oal9j
b21wcmVzc19wdHIgY29tcHJlc3NEYXRhKQ0KK3sNCisJanBlZ19kZXN0X21nciogZGVzdCA9IChq
cGVnX2Rlc3RfbWdyKiljb21wcmVzc0RhdGEtPmRlc3Q7DQorICAgIGRlc3QtPmJ1ZmZlci5yZXNp
emUoNDA5Nik7DQorICAgIGRlc3QtPnB1Yi5uZXh0X291dHB1dF9ieXRlICA9IChKT0NURVQqKWRl
c3QtPmJ1ZmZlci5kYXRhKCk7DQorCWRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlcgk9IGRlc3QtPmJ1
ZmZlci5zaXplKCk7DQorfQ0KKw0KK2Jvb2xlYW4ganBlZ19lbXB0eV9vdXRwdXRfYnVmZmVyKGpf
Y29tcHJlc3NfcHRyIGNvbXByZXNzRGF0YSkNCit7DQorCWpwZWdfZGVzdF9tZ3IqIGRlc3QgPSAo
anBlZ19kZXN0X21nciopY29tcHJlc3NEYXRhLT5kZXN0Ow0KKyAgICBkZXN0LT5kdW1wLT5hcHBl
bmQoZGVzdC0+YnVmZmVyLmRhdGEoKSwgZGVzdC0+YnVmZmVyLnNpemUoKSAtIGRlc3QtPnB1Yi5m
cmVlX2luX2J1ZmZlcik7DQorICAgIGRlc3QtPnB1Yi5uZXh0X291dHB1dF9ieXRlICA9IChKT0NU
RVQqKWRlc3QtPmJ1ZmZlci5kYXRhKCk7DQorCWRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlcgk9IGRl
c3QtPmJ1ZmZlci5zaXplKCk7DQorCXJldHVybiBUUlVFOw0KK30NCisNCit2b2lkIGpwZWdfdGVy
bV9kZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjb21wcmVzc0RhdGEpDQorew0KKwlqcGVnX2Rl
c3RfbWdyKiBkZXN0ID0gKGpwZWdfZGVzdF9tZ3IqKWNvbXByZXNzRGF0YS0+ZGVzdDsNCisgICAg
ZGVzdC0+ZHVtcC0+YXBwZW5kKGRlc3QtPmJ1ZmZlci5kYXRhKCksIGRlc3QtPmJ1ZmZlci5zaXpl
KCkgLSBkZXN0LT5wdWIuZnJlZV9pbl9idWZmZXIpOw0KK30NCisNCit2b2lkIGpwZWdfZXJyb3Jf
ZXhpdChqX2NvbW1vbl9wdHIgY29tcHJlc3NEYXRhKQoreworICAgIGpwZWdfY29tcHJlc3NfZXJy
b3JfbWdyICplcnIgPSAoanBlZ19jb21wcmVzc19lcnJvcl9tZ3IqKWNvbXByZXNzRGF0YS0+ZXJy
OworICAgIGxvbmdqbXAoZXJyLT5zZXRqbXBfYnVmZmVyLCAtMSk7Cit9CisNCitib29sIGNvbXBy
ZXNzQml0bWFwVG9KcGVnKFNoYXJlZEJpdG1hcCogYm1wLCBWZWN0b3I8Y2hhcj4mIGpwZWdEYXRh
KQoreworICAgIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjb21wcmVzc0RhdGE9IHswfTsN
CisgICAganBlZ19jb21wcmVzc19lcnJvcl9tZ3IgZXJyOw0KKyAgICBjb21wcmVzc0RhdGEuZXJy
ID0ganBlZ19zdGRfZXJyb3IoKGpwZWdfZXJyb3JfbWdyKikmZXJyKTsNCisgICAgZXJyLnB1Yi5l
cnJvcl9leGl0ID0ganBlZ19lcnJvcl9leGl0OworDQorICAgIGpwZWdfY3JlYXRlX2NvbXByZXNz
KCZjb21wcmVzc0RhdGEpOw0KKw0KKyAgICBqcGVnX2Rlc3RfbWdyKiBkZXN0ID0gKGpwZWdfZGVz
dF9tZ3IqKWZhc3RDYWxsb2Moc2l6ZW9mKGpwZWdfZGVzdF9tZ3IpLCAxKTsNCisgICAgZGVzdC0+
ZHVtcCA9ICZqcGVnRGF0YTsNCisgICAgY29tcHJlc3NEYXRhLmRlc3QgPSAoc3RydWN0IGpwZWdf
ZGVzdGluYXRpb25fbWdyKilkZXN0Ow0KKwlkZXN0LT5wdWIuaW5pdF9kZXN0aW5hdGlvbiA9IGpw
ZWdfaW5pdF9kZXN0aW5hdGlvbjsNCisJZGVzdC0+cHViLmVtcHR5X291dHB1dF9idWZmZXIgPSBq
cGVnX2VtcHR5X291dHB1dF9idWZmZXI7DQorCWRlc3QtPnB1Yi50ZXJtX2Rlc3RpbmF0aW9uID0g
anBlZ190ZXJtX2Rlc3RpbmF0aW9uOw0KKw0KKyAgICBjb21wcmVzc0RhdGEuaW1hZ2Vfd2lkdGgg
PSBibXAtPndpZHRoKCk7DQorICAgIGNvbXByZXNzRGF0YS5pbWFnZV9oZWlnaHQgPSBibXAtPmhl
aWdodCgpOw0KKyAgICBjb21wcmVzc0RhdGEuaW5wdXRfY29tcG9uZW50cyA9IDM7DQorICAgIGNv
bXByZXNzRGF0YS5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7DQorICAgIGpwZWdfc2V0X2RlZmF1
bHRzKCZjb21wcmVzc0RhdGEpOw0KKyAgICBqcGVnX3NldF9xdWFsaXR5KCZjb21wcmVzc0RhdGEs
IDY1LCBGQUxTRSk7DQorCisgICAgVmVjdG9yPEpTQU1QTEUsIDIwNDg+IHJvd0J1ZmZlcjsNCisg
ICAgaWYgKHNldGptcChlcnIuc2V0am1wX2J1ZmZlcikpIHsKKyAgICAgICAganBlZ19kZXN0cm95
X2NvbXByZXNzKCZjb21wcmVzc0RhdGEpOw0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
Kw0KKyAgICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjb21wcmVzc0RhdGEsIFRSVUUpOw0KKw0KKyAg
ICByb3dCdWZmZXIucmVzaXplKGNvbXByZXNzRGF0YS5pbWFnZV93aWR0aCAqIDMpOw0KKyAgICBp
ZiAoYm1wLT5pczE2Yml0KCkpIHsNCisgICAgICAgIGludCBwYWRkZWRXaWR0aCA9IGJtcC0+Yml0
bWFwSW5mbygpLnBhZGRlZFdpZHRoKCk7DQorICAgICAgICBpbnQgc2tpcCA9IHBhZGRlZFdpZHRo
IC0gY29tcHJlc3NEYXRhLmltYWdlX3dpZHRoOw0KKyAgICAgICAgY29uc3QgdW5zaWduZWQgc2hv
cnQqIHBpeGVsID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgc2hvcnQqPihibXAtPmJ5dGVz
KCkpOw0KKyAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIHBpeGVsRW5kID0gcGl4ZWwgKyBw
YWRkZWRXaWR0aCAqIGNvbXByZXNzRGF0YS5pbWFnZV9oZWlnaHQ7DQorICAgICAgICBmb3IgKDsg
cGl4ZWwgPCBwaXhlbEVuZDsgcGl4ZWwgKz0gc2tpcCkgew0KKyAgICAgICAgICAgIEpTQU1QTEUq
IGRzdCA9IHJvd0J1ZmZlci5kYXRhKCk7DQorICAgICAgICAgICAgZm9yIChjb25zdCB1bnNpZ25l
ZCBzaG9ydCogcm93RW5kID0gcGl4ZWwgKyBjb21wcmVzc0RhdGEuaW1hZ2Vfd2lkdGg7IHBpeGVs
IDwgcm93RW5kOykgew0KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZSA9ICpw
aXhlbCsrOw0KKyNpZiBJTUFHRV9OT19BTFBIQV9VU0VfUkdCNTU1CisgICAgICAgICAgICAgICAg
KmRzdCsrID0gSlNBTVBMRSgodmFsdWUgPj4gNykgJiAweEY4KTsKKyAgICAgICAgICAgICAgICAq
ZHN0KysgPSBKU0FNUExFKCh2YWx1ZSA+PiAyKSAmIDB4RjgpOworICAgICAgICAgICAgICAgICpk
c3QrKyA9IEpTQU1QTEUoKHZhbHVlIDw8IDMpICYgMHhGOCk7CisjZWxzZQorICAgICAgICAgICAg
ICAgICpkc3QrKyA9IEpTQU1QTEUoKHZhbHVlID4+IDgpICYgMHhGOCk7CisgICAgICAgICAgICAg
ICAgKmRzdCsrID0gSlNBTVBMRSgodmFsdWUgPj4gMykgJiAweEZDKTsKKyAgICAgICAgICAgICAg
ICAqZHN0KysgPSBKU0FNUExFKCh2YWx1ZSA8PCAzKSAmIDB4RjgpOw0KKyNlbmRpZg0KKyAgICAg
ICAgICAgIH0NCisgICAgICAgICAgICBkc3QgPSByb3dCdWZmZXIuZGF0YSgpOw0KKyAgICAgICAg
ICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjb21wcmVzc0RhdGEsICZkc3QsIDEpOw0KKyAgICAg
ICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgY29uc3QgdW5zaWduZWQqIHBpeGVsID0gc3Rh
dGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQqPihibXAtPmJ5dGVzKCkpOw0KKyAgICAgICAgY29uc3Qg
dW5zaWduZWQqIHBpeGVsRW5kID0gcGl4ZWwgKyBjb21wcmVzc0RhdGEuaW1hZ2Vfd2lkdGggKiBj
b21wcmVzc0RhdGEuaW1hZ2VfaGVpZ2h0Ow0KKyAgICAgICAgZm9yICg7IHBpeGVsIDwgcGl4ZWxF
bmQ7ICkgew0KKyAgICAgICAgICAgIEpTQU1QTEUqIGRzdCA9IHJvd0J1ZmZlci5kYXRhKCk7DQor
ICAgICAgICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCogcm93RW5kID0gcGl4ZWwgKyBjb21wcmVz
c0RhdGEuaW1hZ2Vfd2lkdGg7IHBpeGVsIDwgcm93RW5kOykgew0KKyAgICAgICAgICAgICAgICB1
bnNpZ25lZCB2YWx1ZSA9ICpwaXhlbCsrOw0KKyAgICAgICAgICAgICAgICAqZHN0KysgPSBKU0FN
UExFKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBKU0FN
UExFKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IEpTQU1Q
TEUoKHZhbHVlKSAmIDB4RkYpOworICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRzdCA9IHJv
d0J1ZmZlci5kYXRhKCk7DQorICAgICAgICAgICAganBlZ193cml0ZV9zY2FubGluZXMoJmNvbXBy
ZXNzRGF0YSwgJmRzdCwgMSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAganBlZ19maW5p
c2hfY29tcHJlc3MoJmNvbXByZXNzRGF0YSk7DQorICAgIGpwZWdfZGVzdHJveV9jb21wcmVzcygm
Y29tcHJlc3NEYXRhKTsNCisgICAgcmV0dXJuIHRydWU7DQorfQorCit9ClwgTm8gbmV3bGluZSBh
dCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9KUEVHRW5jb2Rlci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9KUEVHRW5j
b2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyM2Y3M2UKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNvZGVy
LmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2Jp
bGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3aWxsIGJlIHVzZWZ1bCwKKyAq
ICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisg
Ki8KKworI2lmbmRlZiBKUEVHX0VOQ09ERVJfSAorI2RlZmluZSBKUEVHX0VOQ09ERVJfSAorCitu
YW1lc3BhY2UgV2ViQ29yZQoreworICAgIGJvb2wgY29tcHJlc3NCaXRtYXBUb0pwZWcoU2hhcmVk
Qml0bWFwKiBibXAsIFZlY3RvcjxjaGFyPiYganBlZ0RhdGEpOworfQorCisjZW5kaWYgLy8gSlBF
R19FTkNPREVSX0gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2Uv
TWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvTWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi43NGU5MTg3Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9NZWRpYVBsYXllclByaXZhdGVXaW5jZS5oCkBAIC0wLDAgKzEsMTI5IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIE1lZGlhUGxheWVyUHJpdmF0ZVdpbmNl
X2gKKyNkZWZpbmUgTWVkaWFQbGF5ZXJQcml2YXRlV2luY2VfaAorCisjaWYgRU5BQkxFKFZJREVP
KQorCisjaW5jbHVkZSAiTWVkaWFQbGF5ZXJQcml2YXRlLmgiCisjaW5jbHVkZSAiVGltZXIuaCIK
KyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3Mg
R3JhcGhpY3NDb250ZXh0OworY2xhc3MgSW50U2l6ZTsKK2NsYXNzIEludFJlY3Q7CitjbGFzcyBT
dHJpbmc7CisKK2NsYXNzIE1lZGlhUGxheWVyUHJpdmF0ZSA6IHB1YmxpYyBNZWRpYVBsYXllclBy
aXZhdGVJbnRlcmZhY2UgeworcHVibGljOgorICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTWVkaWFF
bmdpbmUoTWVkaWFFbmdpbmVSZWdpc3RyYXIpOworCisgICAgfk1lZGlhUGxheWVyUHJpdmF0ZSgp
OworICAgIAorICAgIEludFNpemUgbmF0dXJhbFNpemUoKSBjb25zdDsKKyAgICBib29sIGhhc1Zp
ZGVvKCkgY29uc3Q7CisgICAgCisgICAgdm9pZCBsb2FkKGNvbnN0IFN0cmluZyYgdXJsKTsKKyAg
ICB2b2lkIGNhbmNlbExvYWQoKTsKKyAgICAKKyAgICB2b2lkIHBsYXkoKTsKKyAgICB2b2lkIHBh
dXNlKCk7ICAgIAorICAgIAorICAgIGJvb2wgcGF1c2VkKCkgY29uc3Q7CisgICAgYm9vbCBzZWVr
aW5nKCkgY29uc3Q7CisgICAgCisgICAgZmxvYXQgZHVyYXRpb24oKSBjb25zdDsKKyAgICBmbG9h
dCBjdXJyZW50VGltZSgpIGNvbnN0OworICAgIHZvaWQgc2VlayhmbG9hdCB0aW1lKTsKKyAgICB2
b2lkIHNldEVuZFRpbWUoZmxvYXQpOworICAgIAorICAgIHZvaWQgc2V0UmF0ZShmbG9hdCk7Cisg
ICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQpOworICAgIAorICAgIGludCBkYXRhUmF0ZSgpIGNvbnN0
OworICAgIAorICAgIE1lZGlhUGxheWVyOjpOZXR3b3JrU3RhdGUgbmV0d29ya1N0YXRlKCkgY29u
c3QgeyByZXR1cm4gbV9uZXR3b3JrU3RhdGU7IH0KKyAgICBNZWRpYVBsYXllcjo6UmVhZHlTdGF0
ZSByZWFkeVN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9yZWFkeVN0YXRlOyB9CisgICAgCisgICAg
ZmxvYXQgbWF4VGltZUJ1ZmZlcmVkKCkgY29uc3Q7CisgICAgZmxvYXQgbWF4VGltZVNlZWthYmxl
KCkgY29uc3Q7CisgICAgdW5zaWduZWQgYnl0ZXNMb2FkZWQoKSBjb25zdDsKKyAgICBib29sIHRv
dGFsQnl0ZXNLbm93bigpIGNvbnN0OworICAgIHVuc2lnbmVkIHRvdGFsQnl0ZXMoKSBjb25zdDsK
KyAgICAKKyAgICB2b2lkIHNldFZpc2libGUoYm9vbCk7CisgICAgdm9pZCBzZXRTaXplKGNvbnN0
IEludFNpemUmKTsKKyAgICAKKyAgICB2b2lkIGxvYWRTdGF0ZUNoYW5nZWQoKTsKKyAgICB2b2lk
IGRpZEVuZCgpOworICAgIAorICAgIHZvaWQgcGFpbnQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3Qg
SW50UmVjdCYpOworICAgIAorCitwcml2YXRlOgorICAgIE1lZGlhUGxheWVyUHJpdmF0ZShNZWRp
YVBsYXllciopOworCisgICAgdm9pZCB1cGRhdGVTdGF0ZXMoKTsKKyAgICB2b2lkIGRvU2Vlaygp
OworICAgIHZvaWQgY2FuY2VsU2VlaygpOworICAgIHZvaWQgc2Vla1RpbWVyRmlyZWQoVGltZXI8
TWVkaWFQbGF5ZXJQcml2YXRlPiopOworICAgIGZsb2F0IG1heFRpbWVMb2FkZWQoKSBjb25zdDsK
KyAgICB2b2lkIHNhd1Vuc3VwcG9ydGVkVHJhY2tzKCk7CisjaWYgRU5BQkxFKFBMVUdJTl9QUk9Y
WV9GT1JfVklERU8pCisgICAgdm9pZCBzZXRNZWRpYVBsYXllclByb3h5KFdlYk1lZGlhUGxheWVy
UHJveHkqKTsKKyAgICB2b2lkIHNldFBvc3Rlcihjb25zdCBTdHJpbmcmIHVybCk7CisgICAgdm9p
ZCBkZWxpdmVyTm90aWZpY2F0aW9uKE1lZGlhUGxheWVyUHJveHlOb3RpZmljYXRpb25UeXBlKTsK
KyNlbmRpZgorCisgICAgLy8gZW5naW5lIHN1cHBvcnQKKyAgICBzdGF0aWMgTWVkaWFQbGF5ZXJQ
cml2YXRlSW50ZXJmYWNlKiBjcmVhdGUoTWVkaWFQbGF5ZXIqKTsKKyAgICBzdGF0aWMgdm9pZCBn
ZXRTdXBwb3J0ZWRUeXBlcyhIYXNoU2V0PFN0cmluZz4mIHR5cGVzKTsKKyAgICBzdGF0aWMgTWVk
aWFQbGF5ZXI6OlN1cHBvcnRzVHlwZSBzdXBwb3J0c1R5cGUoY29uc3QgU3RyaW5nJiB0eXBlLCBj
b25zdCBTdHJpbmcmIGNvZGVjcyk7CisgICAgc3RhdGljIGJvb2wgaXNBdmFpbGFibGUoKTsKKwor
ICAgIE1lZGlhUGxheWVyKiBtX3BsYXllcjsKKyAgICBmbG9hdCBtX3NlZWtUbzsKKyAgICBmbG9h
dCBtX2VuZFRpbWU7CisgICAgVGltZXI8TWVkaWFQbGF5ZXJQcml2YXRlPiBtX3NlZWtUaW1lcjsK
KyAgICBNZWRpYVBsYXllcjo6TmV0d29ya1N0YXRlIG1fbmV0d29ya1N0YXRlOworICAgIE1lZGlh
UGxheWVyOjpSZWFkeVN0YXRlIG1fcmVhZHlTdGF0ZTsKKyAgICB1bnNpZ25lZCBtX2VuYWJsZWRU
cmFja0NvdW50OworICAgIHVuc2lnbmVkIG1fdG90YWxUcmFja0NvdW50OworICAgIGJvb2wgbV9o
YXNVbnN1cHBvcnRlZFRyYWNrczsKKyAgICBib29sIG1fc3RhcnRlZFBsYXlpbmc7CisgICAgYm9v
bCBtX2lzU3RyZWFtaW5nOworI2lmIEVOQUJMRShQTFVHSU5fUFJPWFlfRk9SX1ZJREVPKQorICAg
IFdlYk1lZGlhUGxheWVyUHJveHkqIG1fcHJveHk7CisjZW5kaWYKK307CisKK30KKworI2VuZGlm
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVk
aWFQbGF5ZXJQcm94eS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlh
UGxheWVyUHJveHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MzQ4
YWIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01l
ZGlhUGxheWVyUHJveHkuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpIHdp
bGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUo
VklERU8pCisjaW5jbHVkZSAiTWVkaWFQbGF5ZXIuaCIKKworI2luY2x1ZGUgImNfY2xhc3MuaCIK
KyNpbmNsdWRlICJjX2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY19ydW50aW1lLmgiCisjaW5jbHVk
ZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJIVE1MVmlkZW9FbGVtZW50LmgiCisjaW5j
bHVkZSAiSFRNTFBsdWdJbkVsZW1lbnQuaCIKKyNpbmNsdWRlICJKU0RPTUJpbmRpbmcuaCIKKyNp
bmNsdWRlICJKU1BsdWdpbkVsZW1lbnRGdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXll
clByb3h5LmgiCisjaW5jbHVkZSAiTm9kZS5oIgorI2luY2x1ZGUgIm5wcnVudGltZV9pbXBsLmgi
CisjaW5jbHVkZSAiUGx1Z2luVmlldy5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisj
aW5jbHVkZSAiUmVuZGVyUGFydE9iamVjdC5oIgorI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgor
I2luY2x1ZGUgInJ1bnRpbWUuaCIKKyNpbmNsdWRlICJXaWRnZXQuaCIKKyNpbmNsdWRlIDxydW50
aW1lL0lkZW50aWZpZXIuaD4KKworCit1c2luZyBuYW1lc3BhY2UgSlNDOworbmFtZXNwYWNlIFdl
YkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgQmluZGluZ3M7Cit1c2luZyBuYW1lc3BhY2UgSFRN
TE5hbWVzOworCitXZWJNZWRpYVBsYXllclByb3h5OjpXZWJNZWRpYVBsYXllclByb3h5KE1lZGlh
UGxheWVyKiBwbGF5ZXIpCis6IG1fbWVkaWFQbGF5ZXIocGxheWVyKQorLCBtX2luaXQoZmFsc2Up
CissIG1faGFzU2VudFJlc3BvbnNlVG9QbHVnaW4oZmFsc2UpCit7CisgICAgaWYoIW1faW5pdCkK
KyAgICAgICAgaW5pdEVuZ2luZSgpOworfQorCitXZWJNZWRpYVBsYXllclByb3h5Ojp+V2ViTWVk
aWFQbGF5ZXJQcm94eSgpCit7CisgICAgbV9pbnN0YW5jZS5yZWxlYXNlKCk7Cit9CitTY3JpcHRJ
bnN0YW5jZSBXZWJNZWRpYVBsYXllclByb3h5OjpwbHVnaW5JbnN0YW5jZSgpCit7CisgICAgaWYo
IW1faW5zdGFuY2UpeworICAgICAgICBSZW5kZXJPYmplY3QqIHIgPSBlbGVtZW50KCktPnJlbmRl
cmVyKCk7CisgICAgICAgIGlmICghciB8fCAhci0+aXNXaWRnZXQoKSkKKyAgICAgICAgICAgIHJl
dHVybiAwOworCisgICAgICAgIEZyYW1lKiBmcmFtZSA9IGVsZW1lbnQoKS0+ZG9jdW1lbnQoKS0+
ZnJhbWUoKTsKKworICAgICAgICBSZW5kZXJXaWRnZXQqIHJlbmRlcldpZGdldCA9IHN0YXRpY19j
YXN0PFJlbmRlcldpZGdldCo+KGVsZW1lbnQoKS0+cmVuZGVyZXIoKSk7CisgICAgICAgIGlmIChy
ZW5kZXJXaWRnZXQgJiYgcmVuZGVyV2lkZ2V0LT53aWRnZXQoKSkKKyAgICAgICAgICAgIG1faW5z
dGFuY2UgPSBmcmFtZS0+c2NyaXB0KCktPmNyZWF0ZVNjcmlwdEluc3RhbmNlRm9yV2lkZ2V0KHJl
bmRlcldpZGdldC0+d2lkZ2V0KCkpOworICAgIH0KKworICAgIHJldHVybiBtX2luc3RhbmNlOwor
fQordm9pZCBXZWJNZWRpYVBsYXllclByb3h5Ojpsb2FkKGNvbnN0IFN0cmluZyYgdXJsKQorewor
ICAgIGlmKCFtX2luaXQpCisgICAgICAgIGluaXRFbmdpbmUoKTsKKyAgICBpZihtX2luaXQpCisg
ICAgICAgIGludm9rZU1ldGhvZCgicGxheSIpOworfQordm9pZCBXZWJNZWRpYVBsYXllclByb3h5
Ojppbml0RW5naW5lKCkKK3sKKyAgICBIVE1MTWVkaWFFbGVtZW50KiBlbGVtZW50ID0gc3RhdGlj
X2Nhc3Q8SFRNTE1lZGlhRWxlbWVudCo+KG1fbWVkaWFQbGF5ZXItPm1lZGlhUGxheWVyQ2xpZW50
KCkpOworICAgIFZlY3RvcjxTdHJpbmc+IHBhcmFtTmFtZXM7CisgICAgVmVjdG9yPFN0cmluZz4g
cGFyYW1WYWx1ZXM7ICAKKyAgICBTdHJpbmcgc2VydmljZVR5cGU7CisgICAgU3RyaW5nIHVybCA9
IGVsZW1lbnQtPmluaXRpYWxVUkwoKTsKKworICAgIGlmKHVybC5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybjsKKworICAgIEZyYW1lKiBmcmFtZSA9IGVsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1l
KCk7CisgICAgCisgICAgLy8gYWRkIGFsbCBhdHRyaWJ1dGVzIHNldCBvbiB0aGUgZW1iZWQgb2Jq
ZWN0CisgICAgTmFtZWROb2RlTWFwKiBhID0gZWxlbWVudC0+YXR0cmlidXRlcygpOworICAgIGlm
IChhKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhLT5sZW5ndGgoKTsgKytp
KSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUqIGl0ID0gYS0+YXR0cmlidXRlSXRlbShpKTsKKyAg
ICAgICAgICAgIHBhcmFtTmFtZXMuYXBwZW5kKGl0LT5uYW1lKCkubG9jYWxOYW1lKCkuc3RyaW5n
KCkpOworICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYXBwZW5kKGl0LT52YWx1ZSgpLnN0cmluZygp
KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZXJ2aWNlVHlwZSA9ICJhcHBsaWNhdGlvbi94LW1w
bGF5ZXIyIjsKKyAgICBmcmFtZS0+bG9hZGVyKCktPnJlcXVlc3RPYmplY3Qoc3RhdGljX2Nhc3Q8
UmVuZGVyUGFydE9iamVjdCo+KGVsZW1lbnQtPnJlbmRlcmVyKCkpLCB1cmwsIG51bGxBdG9tLCBz
ZXJ2aWNlVHlwZSwgcGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMpOworICAgIG1faW5pdCA9IHRydWU7
CisgICAgcGFyYW1OYW1lcy5jbGVhcigpOworICAgIHBhcmFtVmFsdWVzLmNsZWFyKCk7CisKK30K
KworSFRNTE1lZGlhRWxlbWVudCogV2ViTWVkaWFQbGF5ZXJQcm94eTo6ZWxlbWVudCgpCit7Cisg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1lbnQqPihtX21lZGlhUGxheWVyLT5t
ZWRpYVBsYXllckNsaWVudCgpKTsKKworfQorCit2b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6Omlu
dm9rZU1ldGhvZChjb25zdCBTdHJpbmcmIG1ldGhvZE5hbWUpCit7CisgICAgRnJhbWUqIGZyYW1l
ID0gZWxlbWVudCgpLT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAgIFJvb3RPYmplY3QgKnJvb3Qg
PSBmcmFtZS0+c2NyaXB0KCktPmJpbmRpbmdSb290T2JqZWN0KCk7CisgICAgaWYgKCFyb290KQor
ICAgICAgICByZXR1cm4gOworICAgIEV4ZWNTdGF0ZSAqZXhlYyA9IHJvb3QtPmdsb2JhbE9iamVj
dCgpLT5nbG9iYWxFeGVjKCk7CisgICAgSW5zdGFuY2UqIGluc3RhbmNlID0gcGx1Z2luSW5zdGFu
Y2UoKS5nZXQoKTsKKyAgICBpZighaW5zdGFuY2UpCisgICAgICAgIHJldHVybjsKKworICAgIGlu
c3RhbmNlLT5iZWdpbigpOworICAgIENsYXNzICphQ2xhc3MgPSBpbnN0YW5jZS0+Z2V0Q2xhc3Mo
KTsKKyAgICBJZGVudGlmaWVyIGlkZW4oZXhlYywgbWV0aG9kTmFtZSk7CisgICAgTWV0aG9kTGlz
dCBtZXRob2RMaXN0ID0gYUNsYXNzLT5tZXRob2RzTmFtZWQoaWRlbiwgaW5zdGFuY2UpOworICAg
IEFyZ0xpc3QgYXJnczsKKyAgICAvKkpTVmFsdWVQdHIgcmVzdWx0ID0qLyBpbnN0YW5jZS0+aW52
b2tlTWV0aG9kKGV4ZWMsIG1ldGhvZExpc3QgLCBhcmdzKTsKKyAgICBpbnN0YW5jZS0+ZW5kKCk7
CisgICAgLy9pbnN0YW5jZS0+ZGVyZWYoKTsKKyAgICAvL3JldHVybiByZXN1bHQ7CisKK30KKwor
Cit9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJveHkuaCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcm94eS5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZDllNTQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJveHkuaApAQCAtMCwwICsxLDY1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpIHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIE1l
ZGlhUGxheWVyUHJveHlfaAorI2RlZmluZSBNZWRpYVBsYXllclByb3h5X2gKKworI2luY2x1ZGUg
IlNjcmlwdEluc3RhbmNlLmgiCisKKyNpZiBFTkFCTEUoVklERU8pCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgSW50UmVjdDsKK2NsYXNzIEludFNpemU7CitjbGFzcyBTdHJpbmc7Citj
bGFzcyBNZWRpYVBsYXllcjsKK2NsYXNzIFBsdWdpblZpZXc7CitjbGFzcyBIVE1MTWVkaWFFbGVt
ZW50OworCitlbnVtIE1lZGlhUGxheWVyUHJveHlOb3RpZmljYXRpb25UeXBlIHsgTWVkaWFQbGF5
ZXJOb3RpZmljYXRpb25QbGF5UGF1c2VCdXR0b25QcmVzc2VkLCBJZGxlLCBMb2FkaW5nLCBMb2Fk
ZWQsIEZvcm1hdEVycm9yLCBOZXR3b3JrRXJyb3IsIERlY29kZUVycm9yIH07CisKK2NsYXNzIFdl
Yk1lZGlhUGxheWVyUHJveHkgeworcHVibGljOgorICAgIFdlYk1lZGlhUGxheWVyUHJveHkoTWVk
aWFQbGF5ZXIqIHBsYXllcik7CisgICAgfldlYk1lZGlhUGxheWVyUHJveHkoKTsKKworICAgIE1l
ZGlhUGxheWVyKiBtZWRpYVBsYXllcigpIHtyZXR1cm4gbV9tZWRpYVBsYXllcjt9CisgICAgdm9p
ZCBpbml0RW5naW5lKCk7CisgICAgdm9pZCBsb2FkKGNvbnN0IFN0cmluZyYgdXJsKTsKKyAgICBI
VE1MTWVkaWFFbGVtZW50KiBlbGVtZW50KCk7CisgICAgdm9pZCBpbnZva2VNZXRob2QoY29uc3Qg
U3RyaW5nJiBtZXRob2ROYW1lKTsKKyAgICBTY3JpcHRJbnN0YW5jZSBwbHVnaW5JbnN0YW5jZSgp
OworCitwcml2YXRlOgorICAgIE1lZGlhUGxheWVyKiBtX21lZGlhUGxheWVyOworICAgIGJvb2wg
bV9pbml0OworICAgIFdlYkNvcmU6OlBsdWdpblZpZXcqIG1fcGx1Z2luVmlldzsKKyAgICBib29s
IG1faGFzU2VudFJlc3BvbnNlVG9QbHVnaW47CisgICAgU2NyaXB0SW5zdGFuY2UgbV9pbnN0YW5j
ZTsKKyAgICAKK307Cit9CisjZW5kaWYgLy8gRU5BQkxFKFZJREVPKQorCisjZW5kaWYKXCBObyBu
ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL1BOR0VuY29kZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9QTkdFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTkx
NzYwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Q
TkdFbmNvZGVyLmNwcApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAw
Ni0yMDA5LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChj
KSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1
dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJQTkdFbmNvZGVyLmgiCisKKyNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInBuZy5oIgorfQorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKKy8vIEVuY29kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIHNlY3Rpb24gb2Yg
dGhlIGNvZGUgaXMgYmFzZWQgb24gbnNQTkdFbmNvZGVyLmNwcCBpbiBNb3ppbGxhCisvLyAoQ29w
eXJpZ2h0IDIwMDUgR29vZ2xlIEluYy4pCisKKy8vIFBhc3NlZCBhcm91bmQgYXMgdGhlIGlvX3B0
ciBpbiB0aGUgcG5nIHN0cnVjdHMgc28gb3VyIGNhbGxiYWNrcyBrbm93IHdoZXJlCisvLyB0byB3
cml0ZSBkYXRhLgorc3RydWN0IFBOR0VuY29kZXJTdGF0ZSB7CisgICAgUE5HRW5jb2RlclN0YXRl
KFZlY3RvcjxjaGFyPiogbykgOiBtX291dChvKSB7fQorICAgIFZlY3RvcjxjaGFyPiogbV9vdXQ7
Cit9OworCisvLyBDYWxsZWQgYnkgbGlicG5nIHRvIGZsdXNoIGl0cyBpbnRlcm5hbCBidWZmZXIg
dG8gb3Vycy4KK3ZvaWQgZW5jb2RlcldyaXRlQ2FsbGJhY2socG5nX3N0cnVjdHAgcG5nLCBwbmdf
Ynl0ZXAgZGF0YSwgcG5nX3NpemVfdCBzaXplKQoreworICAgIFBOR0VuY29kZXJTdGF0ZSogc3Rh
dGUgPSBzdGF0aWNfY2FzdDxQTkdFbmNvZGVyU3RhdGUqPihwbmdfZ2V0X2lvX3B0cihwbmcpKTsK
KyAgICBBU1NFUlQoc3RhdGUtPm1fb3V0KTsKKworICAgIHNpemVfdCBvbGRTaXplID0gc3RhdGUt
Pm1fb3V0LT5zaXplKCk7CisgICAgc3RhdGUtPm1fb3V0LT5yZXNpemUob2xkU2l6ZSArIHNpemUp
OworICAgIG1lbWNweSgmKCpzdGF0ZS0+bV9vdXQpW29sZFNpemVdLCBkYXRhLCBzaXplKTsKK30K
KworLy8gQXV0b21hdGljYWxseSBkZXN0cm95cyB0aGUgZ2l2ZW4gd3JpdGUgc3RydWN0cyBvbiBk
ZXN0cnVjdGlvbiB0byBtYWtlCisvLyBjbGVhbnVwIGFuZCBlcnJvciBoYW5kbGluZyBjb2RlIGNs
ZWFuZXIuCitjbGFzcyBQTkdXcml0ZVN0cnVjdERlc3Ryb3llciB7CitwdWJsaWM6CisgICAgUE5H
V3JpdGVTdHJ1Y3REZXN0cm95ZXIocG5nX3N0cnVjdCoqIHBzLCBwbmdfaW5mbyoqIHBpKQorICAg
ICAgICA6IG1fcG5nU3RydWN0KHBzKQorICAgICAgICAsIG1fcG5nSW5mbyhwaSkgeworICAgIH0K
KworICAgIH5QTkdXcml0ZVN0cnVjdERlc3Ryb3llcigpIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lf
d3JpdGVfc3RydWN0KG1fcG5nU3RydWN0LCBtX3BuZ0luZm8pOworICAgIH0KKworcHJpdmF0ZToK
KyAgICBwbmdfc3RydWN0KiogbV9wbmdTdHJ1Y3Q7CisgICAgcG5nX2luZm8qKiBtX3BuZ0luZm87
Cit9OworCitib29sIGNvbXByZXNzQml0bWFwVG9QbmcoU2hhcmVkQml0bWFwKiBibXAsIFZlY3Rv
cjxjaGFyPiYgcG5nRGF0YSkKK3sKKyAgICBpZiAoIWJtcC0+Ynl0ZXMoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgcG5nX3N0cnVjdCogcG5nUHRyID0gcG5nX2NyZWF0ZV93cml0ZV9z
dHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBuZ192b2lkcF9OVUxMLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcl9wdHJfTlVMTCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfZXJyb3JfcHRy
X05VTEwpOworICAgIGlmICghcG5nUHRyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBw
bmdfaW5mbyogaW5mb1B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nUHRyKTsKKyAgICBp
ZiAoIWluZm9QdHIpIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdQdHIs
IE5VTEwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFBOR1dyaXRlU3RydWN0
RGVzdHJveWVyIGRlc3Ryb3llcigmcG5nUHRyLCAmaW5mb1B0cik7CisKKyAgICBpbnQgYnl0ZURl
cHRoID0gYm1wLT5pczE2Yml0KCkgPyAzIDogNDsKKyAgICBWZWN0b3I8dW5zaWduZWQgY2hhciwg
MjA0OD4gcm93QnVmZmVyOw0KKyAgICByb3dCdWZmZXIucmVzaXplKGJtcC0+d2lkdGgoKSAqIGJ5
dGVEZXB0aCk7DQorDQorICAgIC8vIFRoZSBkZXN0cm95ZXIgd2lsbCBlbnN1cmUgdGhhdCB0aGUg
c3RydWN0dXJlcyBhcmUgY2xlYW5lZCB1cCBpbiB0aGlzCisgICAgLy8gY2FzZSwgZXZlbiB0aG91
Z2ggd2UgbWF5IGdldCBoZXJlIGFzIGEganVtcCBmcm9tIHJhbmRvbSBwYXJ0cyBvZiB0aGUKKyAg
ICAvLyBQTkcgbGlicmFyeSBjYWxsZWQgYmVsb3cuCisgICAgaWYgKHNldGptcChwbmdfam1wYnVm
KHBuZ1B0cikpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBTZXQgb3VyIGNhbGxi
YWNrIGZvciBsaWJwbmcgdG8gZ2l2ZSB1cyB0aGUgZGF0YS4KKyAgICBQTkdFbmNvZGVyU3RhdGUg
c3RhdGUoJnBuZ0RhdGEpOworICAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nUHRyLCAmc3RhdGUsIGVu
Y29kZXJXcml0ZUNhbGxiYWNrLCBOVUxMKTsKKworICAgIGludCBwbmdPdXRwdXRDb2xvclR5cGUg
PSBibXAtPmlzMTZiaXQoKSA/IFBOR19DT0xPUl9UWVBFX1JHQiA6IFBOR19DT0xPUl9UWVBFX1JH
Ql9BTFBIQTsKKyAgIAorICAgIHBuZ19zZXRfSUhEUihwbmdQdHIsIGluZm9QdHIsIGJtcC0+d2lk
dGgoKSwgYm1wLT5oZWlnaHQoKSwgOCwgcG5nT3V0cHV0Q29sb3JUeXBlLAorICAgICAgICAgICAg
ICAgICBQTkdfSU5URVJMQUNFX05PTkUsIFBOR19DT01QUkVTU0lPTl9UWVBFX0RFRkFVTFQsCisg
ICAgICAgICAgICAgICAgIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUKTsKKyAgICBwbmdfd3JpdGVf
aW5mbyhwbmdQdHIsIGluZm9QdHIpOworCisgICAgaWYgKGJtcC0+aXMxNmJpdCgpKSB7CisgICAg
ICAgIHVuc2lnbmVkIHNob3J0KiBzcmMgPSAodW5zaWduZWQgc2hvcnQqKWJtcC0+Ynl0ZXMoKTsK
KyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAoaW50KWJtcC0+aGVpZ2h0KCk7ICsreSkgewor
ICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAg
ICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgKGludClibXAtPndpZHRoKCk7ICsreCkgeworICAg
ICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlID0gKnNyYysrOw0KKyNpZiBJTUFHRV9O
T19BTFBIQV9VU0VfUkdCNTU1CisgICAgICAgICAgICAgICAgKmRzdCsrID0gdW5zaWduZWQgY2hh
cigodmFsdWUgPj4gNykgJiAweEY4KTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSB1bnNpZ25l
ZCBjaGFyKCh2YWx1ZSA+PiAyKSAmIDB4RjgpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IHVu
c2lnbmVkIGNoYXIoKHZhbHVlIDw8IDMpICYgMHhGOCk7CisjZWxzZQorICAgICAgICAgICAgICAg
ICpkc3QrKyA9IHVuc2lnbmVkIGNoYXIoKHZhbHVlID4+IDgpICYgMHhGOCk7CisgICAgICAgICAg
ICAgICAgKmRzdCsrID0gdW5zaWduZWQgY2hhcigodmFsdWUgPj4gMykgJiAweEZDKTsKKyAgICAg
ICAgICAgICAgICAqZHN0KysgPSB1bnNpZ25lZCBjaGFyKCh2YWx1ZSA8PCAzKSAmIDB4RjgpOw0K
KyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG5nX3dyaXRlX3JvdyhwbmdQdHIs
IHJvd0J1ZmZlci5kYXRhKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdW5z
aWduZWQgY2hhciogc3JjID0gKHVuc2lnbmVkIGNoYXIqKWJtcC0+Ynl0ZXMoKTsKKyAgICAgICAg
Zm9yIChpbnQgeSA9IDA7IHkgPCAoaW50KWJtcC0+aGVpZ2h0KCk7ICsreSkgeworICAgICAgICAg
ICAgdW5zaWduZWQgY2hhciogZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIGZv
ciAoaW50IHggPSAwOyB4IDwgKGludClibXAtPndpZHRoKCk7ICsreCkgeworICAgICAgICAgICAg
ICAgIC8vIE5vdGU6IFBORyBpcyBpbiBiaWcgZW5kaWFuCisgICAgICAgICAgICAgICAgdW5zaWdu
ZWQgY2hhciBiID0gKnNyYysrOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZyA9ICpz
cmMrKzsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHIgPSAqc3JjKys7CisgICAgICAg
ICAgICAgICAgdW5zaWduZWQgY2hhciBhID0gKnNyYysrOworICAgICAgICAgICAgICAgICpkc3Qr
KyA9IHI7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gZzsKKyAgICAgICAgICAgICAgICAqZHN0
KysgPSBiOworICAgICAgICAgICAgICAgICpkc3QrKyA9IGE7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBwbmdfd3JpdGVfcm93KHBuZ1B0ciwgcm93QnVmZmVyLmRhdGEoKSk7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICBwbmdfd3JpdGVfZW5kKHBuZ1B0ciwgaW5mb1B0cik7CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BOR0VuY29kZXIuaCBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvUE5HRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjQ1M2M5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL1BOR0VuY29kZXIuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpIHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24s
IE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFBOR19FTkNPREVSX0gKKyNkZWZp
bmUgUE5HX0VOQ09ERVJfSAorCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZQoreworICAgIGJvb2wgY29tcHJlc3NCaXRtYXBUb1BuZyhTaGFyZWRCaXRtYXAqIGJt
cCwgVmVjdG9yPGNoYXI+JiBwbmdEYXRhKTsKK30KKworI2VuZGlmIC8vIFBOR19FTkNPREVSX0gK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbmNlLmNw
cCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbmNlLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTEwZWEwCi0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwCkBAIC0wLDAgKzEs
MTU3IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5j
LgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaSBhbmQvb3IKKyAqICBtb2RpZnkgaSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpIHdpbGwgYmUgdXNlZnVs
LAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVT
QS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBhdGguaCIKKwor
I2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1QYXRoV2luY2UuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgor
I2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1BhdGg6OlBhdGgoKQorOiBtX3BhdGgobmV3IFBs
YXRmb3JtUGF0aCgpKQoreworfQorCitQYXRoOjp+UGF0aCgpCit7CisgICAgZGVsZXRlIG1fcGF0
aDsKK30KKworUGF0aDo6UGF0aChjb25zdCBQYXRoJiBvdGhlcikKKzogbV9wYXRoKG5ldyBQbGF0
Zm9ybVBhdGgoKm90aGVyLm1fcGF0aCkpCit7Cit9CisKK1BhdGgmIFBhdGg6Om9wZXJhdG9yPShj
b25zdCBQYXRoJiBvdGhlcikKK3sKKyAgICBtX3BhdGggPSBuZXcgUGxhdGZvcm1QYXRoKCpvdGhl
ci5tX3BhdGgpOworICAgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBQYXRoOjpjb250YWlucyhj
b25zdCBGbG9hdFBvaW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9wYXRoLT5jb250YWlucyhwb2ludCwgcnVsZSk7Cit9CisKK3ZvaWQgUGF0aDo6dHJhbnNs
YXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBtX3BhdGgtPnRyYW5zbGF0ZShzaXpl
KTsKK30KKworRmxvYXRSZWN0IFBhdGg6OmJvdW5kaW5nUmVjdCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fcGF0aC0+Ym91bmRpbmdSZWN0KCk7Cit9CisKK3ZvaWQgUGF0aDo6bW92ZVRvKGNvbnN0
IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIG1fcGF0aC0+bW92ZVRvKHBvaW50KTsKK30KKwor
dm9pZCBQYXRoOjphZGRMaW5lVG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgbV9w
YXRoLT5hZGRMaW5lVG8ocG9pbnQpOworfQorCit2b2lkIFBhdGg6OmFkZFF1YWRDdXJ2ZVRvKGNv
bnN0IEZsb2F0UG9pbnQmIGNwLCBjb25zdCBGbG9hdFBvaW50JiBwKQoreworICAgIG1fcGF0aC0+
YWRkUXVhZEN1cnZlVG8oY3AsIHApOworfQorCit2b2lkIFBhdGg6OmFkZEJlemllckN1cnZlVG8o
Y29uc3QgRmxvYXRQb2ludCYgY3AxLCBjb25zdCBGbG9hdFBvaW50JiBjcDIsIGNvbnN0IEZsb2F0
UG9pbnQmIHApCit7CisgICAgbV9wYXRoLT5hZGRCZXppZXJDdXJ2ZVRvKGNwMSwgY3AyLCBwKTsK
K30KKwordm9pZCBQYXRoOjphZGRBcmNUbyhjb25zdCBGbG9hdFBvaW50JiBwMSwgY29uc3QgRmxv
YXRQb2ludCYgcDIsIGZsb2F0IHJhZGl1cykKK3sKKyAgICBtX3BhdGgtPmFkZEFyY1RvKHAxLCBw
MiwgcmFkaXVzKTsKK30KKwordm9pZCBQYXRoOjpjbG9zZVN1YnBhdGgoKQoreworICAgIG1fcGF0
aC0+Y2xvc2VTdWJwYXRoKCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQXJjKGNvbnN0IEZsb2F0UG9p
bnQmIHAsIGZsb2F0IHIsIGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9ja3dpc2Up
Cit7CisgICAgbV9wYXRoLT5hZGRFbGxpcHNlKHAsIHIsIHIsIHNhciwgZWFyLCBhbnRpY2xvY2t3
aXNlKTsKK30KKwordm9pZCBQYXRoOjphZGRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAg
ICBtX3BhdGgtPmFkZFJlY3Qocik7Cit9CisKK3ZvaWQgUGF0aDo6YWRkRWxsaXBzZShjb25zdCBG
bG9hdFJlY3QmIHIpCit7CisgICAgRmxvYXRTaXplIHJhZGl1cyhyLndpZHRoKCkgKiAwLjUsIHIu
aGVpZ2h0KCkgKiAwLjUpOworICAgIG1fcGF0aC0+YWRkRWxsaXBzZShyKTsKK30KKwordm9pZCBQ
YXRoOjpjbGVhcigpCit7CisgICAgbV9wYXRoLT5jbGVhcigpOworfQorCitib29sIFBhdGg6Omlz
RW1wdHkoKSBjb25zdAoreworICAgIHJldHVybiBtX3BhdGgtPmlzRW1wdHkoKTsKK30KKworU3Ry
aW5nIFBhdGg6OmRlYnVnU3RyaW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYXRoLT5kZWJ1
Z1N0cmluZygpOworfQorCit2b2lkIFBhdGg6OmFwcGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVy
RnVuY3Rpb24gZnVuY3Rpb24pIGNvbnN0Cit7CisgICAgbV9wYXRoLT5hcHBseShpbmZvLCBmdW5j
dGlvbik7Cit9CisKK3ZvaWQgUGF0aDo6dHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0
cml4JiB0KQoreworICAgIG1fcGF0aC0+dHJhbnNmb3JtKHQpOworfQorCitGbG9hdFJlY3QgUGF0
aDo6c3Ryb2tlQm91bmRpbmdSZWN0KFN0cm9rZVN0eWxlQXBwbGllciAqKQoreworICAgIG5vdElt
cGxlbWVudGVkKCk7CisgICAgcmV0dXJuIEZsb2F0UmVjdCgpOworfQorCitib29sIFBhdGg6OnN0
cm9rZUNvbnRhaW5zKFN0cm9rZVN0eWxlQXBwbGllciosIGNvbnN0IEZsb2F0UG9pbnQmKSBjb25z
dAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29s
IFBhdGg6Omhhc0N1cnJlbnRQb2ludCgpIGNvbnN0Cit7CisgICAgcmV0dXJuICFpc0VtcHR5KCk7
Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxh
dGZvcm1QYXRoV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0
Zm9ybVBhdGhXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNm
MmJmYgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2Uv
UGxhdGZvcm1QYXRoV2luY2UuY3BwCkBAIC0wLDAgKzEsODAzIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGkgd2lsbCBiZSB1c2VmdWws
CisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVBhdGhXaW5j
ZS5oIgorCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCisjaW5jbHVkZSAiUGF0aC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5j
bHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisK
KyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gSW1wbGVt
ZW50ZWQgaW4gR3JhcGhpY3NDb250ZXh0V2luY2UuY3BwCit2b2lkIGdldEVsbGlwc2VQb2ludEJ5
QW5nbGUoZG91YmxlIGFuZ2xlLCBkb3VibGUgYSwgZG91YmxlIGIsIGZsb2F0JiB4LCBmbG9hdCYg
eSk7CisKK3N0YXRpYyB2b2lkIHF1YWRDdXJ2ZShpbnQgc2VnbWVudHMsIFZlY3RvcjxQYXRoUG9p
bnQ+JiBwdHMsIGNvbnN0IFBhdGhQb2ludCogY29udHJvbCkKK3sKKyAgICBjb25zdCBmbG9hdCBz
dGVwID0gMS4wIC8gc2VnbWVudHM7CisgICAgcmVnaXN0ZXIgZmxvYXQgdEEgPSAwLjA7CisgICAg
cmVnaXN0ZXIgZmxvYXQgdEIgPSAxLjA7CisKKyAgICBmbG9hdCBjMXggPSBjb250cm9sWzBdLngo
KTsKKyAgICBmbG9hdCBjMXkgPSBjb250cm9sWzBdLnkoKTsKKyAgICBmbG9hdCBjMnggPSBjb250
cm9sWzFdLngoKTsKKyAgICBmbG9hdCBjMnkgPSBjb250cm9sWzFdLnkoKTsKKyAgICBmbG9hdCBj
M3ggPSBjb250cm9sWzJdLngoKTsKKyAgICBmbG9hdCBjM3kgPSBjb250cm9sWzJdLnkoKTsKKwor
ICAgIGNvbnN0IGludCBvZmZzZXQgPSBwdHMuc2l6ZSgpOworICAgIHB0cy5yZXNpemUob2Zmc2V0
ICsgc2VnbWVudHMpOworICAgIFBhdGhQb2ludCBwcDsKKyAgICBwcC5tX3ggPSBjMXg7CisgICAg
cHAubV95ID0gYzF5OworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50czsgKytpKSB7
CisgICAgICAgIHRBICs9IHN0ZXA7CisgICAgICAgIHRCIC09IHN0ZXA7CisKKyAgICAgICAgY29u
c3QgZmxvYXQgYSA9IHRCICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAyLjAgKiB0QSAq
IHRCOworICAgICAgICBjb25zdCBmbG9hdCBjID0gdEEgKiB0QTsKKworICAgICAgICBwcC5tX3gg
PSBjMXggKiBhICsgYzJ4ICogYiArIGMzeCAqIGM7CisgICAgICAgIHBwLm1feSA9IGMxeSAqIGEg
KyBjMnkgKiBiICsgYzN5ICogYzsKKworICAgICAgICBwdHNbb2Zmc2V0ICsgaSAtIDFdID0gcHA7
CisgICAgfQorCisgICAgcHAubV94ID0gYzN4OworICAgIHBwLm1feSA9IGMzeTsKKyAgICBwdHNb
b2Zmc2V0ICsgc2VnbWVudHMgLSAxXSA9IHBwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmV6
aWVyKGludCBzZWdtZW50cywgVmVjdG9yPFBhdGhQb2ludD4mIHB0cywgY29uc3QgUGF0aFBvaW50
KiBjb250cm9sKQoreworICAgIGNvbnN0IGZsb2F0IHN0ZXAgPSAxLjAgLyBzZWdtZW50czsKKyAg
ICByZWdpc3RlciBmbG9hdCB0QSA9IDAuMDsKKyAgICByZWdpc3RlciBmbG9hdCB0QiA9IDEuMDsK
KworICAgIGZsb2F0IGMxeCA9IGNvbnRyb2xbMF0ueCgpOworICAgIGZsb2F0IGMxeSA9IGNvbnRy
b2xbMF0ueSgpOworICAgIGZsb2F0IGMyeCA9IGNvbnRyb2xbMV0ueCgpOworICAgIGZsb2F0IGMy
eSA9IGNvbnRyb2xbMV0ueSgpOworICAgIGZsb2F0IGMzeCA9IGNvbnRyb2xbMl0ueCgpOworICAg
IGZsb2F0IGMzeSA9IGNvbnRyb2xbMl0ueSgpOworICAgIGZsb2F0IGM0eCA9IGNvbnRyb2xbM10u
eCgpOworICAgIGZsb2F0IGM0eSA9IGNvbnRyb2xbM10ueSgpOworCisgICAgY29uc3QgaW50IG9m
ZnNldCA9IHB0cy5zaXplKCk7CisgICAgcHRzLnJlc2l6ZShvZmZzZXQgKyBzZWdtZW50cyk7Cisg
ICAgUGF0aFBvaW50IHBwOworICAgIHBwLm1feCA9IGMxeDsKKyAgICBwcC5tX3kgPSBjMXk7CisK
KyAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlZ21lbnRzOyArK2kpIHsKKyAgICAgICAgdEEgKz0g
c3RlcDsKKyAgICAgICAgdEIgLT0gc3RlcDsKKyAgICAgICAgY29uc3QgZmxvYXQgdEFzcSA9IHRB
ICogdEE7CisgICAgICAgIGNvbnN0IGZsb2F0IHRCc3EgPSB0QiAqIHRCOworCisgICAgICAgIGNv
bnN0IGZsb2F0IGEgPSB0QnNxICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAzLjAgKiB0
QSAqIHRCc3E7CisgICAgICAgIGNvbnN0IGZsb2F0IGMgPSAzLjAgKiB0QiAqIHRBc3E7CisgICAg
ICAgIGNvbnN0IGZsb2F0IGQgPSB0QXNxICogdEE7CisKKyAgICAgICAgcHAubV94ID0gYzF4ICog
YSArIGMyeCAqIGIgKyBjM3ggKiBjICsgYzR4ICogZDsKKyAgICAgICAgcHAubV95ID0gYzF5ICog
YSArIGMyeSAqIGIgKyBjM3kgKiBjICsgYzR5ICogZDsKKworICAgICAgICBwdHNbb2Zmc2V0ICsg
aSAtIDFdID0gcHA7CisgICAgfQorCisgICAgcHAubV94ID0gYzR4OworICAgIHBwLm1feSA9IGM0
eTsKKyAgICBwdHNbb2Zmc2V0ICsgc2VnbWVudHMgLSAxXSA9IHBwOworfQorCitzdGF0aWMgaW5s
aW5lIGludCBzdGFibGVSb3VuZChkb3VibGUgZCkKK3sKKyAgICBpZiAoZCA+IDApCisgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGQgKyAwLjUpOworCisgICAgaW50IGkgPSBzdGF0aWNf
Y2FzdDxpbnQ+KGQpOworICAgIHJldHVybiBpIC0gZCA+IDAuNSA/IGkgLSAxIDogaTsKK30KKwor
c3RhdGljIGJvb2wgY29udGFpbnNQb2ludChjb25zdCBGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0
UG9pbnQmIHApCit7CisgICAgcmV0dXJuIHAueCgpID49IHIueCgpICYmIHAueSgpID49IHIueSgp
ICYmIHAueCgpIDwgci5yaWdodCgpICYmIHAueSgpIDwgci5ib3R0b20oKTsKK30KKworI2RlZmlu
ZSBQSSAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorCitzdGF0aWMgdm9pZCBub3JtYWxp
emVBbmdsZShmbG9hdCYgYW5nbGUpCit7CisgICAgd2hpbGUgKGFuZ2xlIDwgMCkgCisgICAgICAg
IGFuZ2xlICs9IDIgKiBQSTsKKyAgICB3aGlsZSAoYW5nbGUgPj0gMiAqIFBJKQorICAgICAgICBh
bmdsZSAtPSAyICogUEk7CisgICAgaWYgKGFuZ2xlIDwgMC4wMDAwMSkKKyAgICAgICAgYW5nbGUg
PSAwOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1BcmNQb2ludChmbG9hdCYgeCwgZmxvYXQm
IHksIGNvbnN0IEZsb2F0UG9pbnQmIGMpCit7CisgICAgeCArPSBjLngoKTsKKyAgICB5ICs9IGMu
eSgpOworfQorCitzdGF0aWMgdm9pZCBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KEZsb2F0UmVj
dCYgciwgZmxvYXQgeCwgZmxvYXQgeSkKK3sKKyAgICBpZiAoci5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgci5zZXRYKHgpOworICAgICAgICByLnNldFkoeSk7CisgICAgICAgIHIuc2V0U2l6ZShGbG9h
dFNpemUoMSwgMSkpOworICAgICAgICByZXR1cm47CisgICAgfSAKKyAgICBpZiAoeCA8IHIueCgp
KSB7CisgICAgICAgIHIuc2V0V2lkdGgoci5yaWdodCgpIC0geCk7CisgICAgICAgIHIuc2V0WCh4
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCB3ID0geCAtIHIueCgpICsgMTsKKyAgICAg
ICAgaWYgKHcgPiByLndpZHRoKCkpCisgICAgICAgICAgICByLnNldFdpZHRoKHcpOworICAgIH0K
KyAgICBpZiAoeSA8IHIueSgpKSB7CisgICAgICAgIHIuc2V0SGVpZ2h0KHIuYm90dG9tKCkgLSB5
KTsKKyAgICAgICAgci5zZXRZKHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IGggPSAg
eSAtIHIueSgpICsgMTsKKyAgICAgICAgaWYgKGggPiByLmhlaWdodCgpKQorICAgICAgICAgICAg
ci5zZXRIZWlnaHQoaCk7CisgICAgfQorfQorCisvLyByZXR1cm4gMC1iYXNlZCB2YWx1ZTogMCAt
IGZpcnN0IFF1YWRyYW50ICggMCAtIDkwIGRlZ3JlZSkKK3N0YXRpYyBpbmxpbmUgaW50IHF1YWRy
YW50KGNvbnN0IFBhdGhQb2ludCYgcG9pbnQsIGNvbnN0IFBhdGhQb2ludCYgb3JpZ1BvaW50KQor
eworICAgIHJldHVybiBwb2ludC5tX3ggPCBvcmlnUG9pbnQubV94ID8gCisgICAgICAgIChwb2lu
dC5tX3kgPCBvcmlnUG9pbnQubV95ID8gMiA6IDEpCisgICAgICAgIDogKHBvaW50Lm1feSA8IG9y
aWdQb2ludC5tX3kgPyAzIDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50
T25MZWZ0KGludCBxKSB7IHJldHVybiBxID09IDEgfHwgcSA9PSAyOyB9CitzdGF0aWMgaW5saW5l
IGJvb2wgaXNRdWFkcmFudE9uUmlnaHQoaW50IHEpIHsgcmV0dXJuIHEgPT0gMCB8fCBxID09IDM7
IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25Ub3AoaW50IHEpIHsgcmV0dXJuIHEg
PT0gMiB8fCBxID09IDM7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25Cb3R0b20o
aW50IHEpIHsgcmV0dXJuIHEgPT0gMCB8fCBxID09IDE7IH0KKworc3RhdGljIGlubGluZSBpbnQg
bmV4dFF1YWRyYW50KGludCBxKSB7IHJldHVybiBxID09IDMgPyAwIDogcSArIDE7IH0KK3N0YXRp
YyBpbmxpbmUgaW50IHF1YWRyYW50RGlmZihpbnQgcTEsIGludCBxMikgeyBpbnQgZCA9IHExIC0g
cTI7IHdoaWxlIChkIDwgMCkgZCArPSA0OyByZXR1cm4gZDsgfQorCitzdHJ1Y3QgUGF0aFZlY3Rv
ciB7CisgICAgZmxvYXQgbV94OworICAgIGZsb2F0IG1feTsKKworICAgIFBhdGhWZWN0b3IoKSA6
IG1feCgwKSwgbV95KDApIHt9CisgICAgUGF0aFZlY3RvcihmbG9hdCB4LCBmbG9hdCB5KSA6IG1f
eCh4KSwgbV95KHkpIHt9CisgICAgZG91YmxlIGFuZ2xlKCkgY29uc3QgeyByZXR1cm4gYXRhbjIo
bV95LCBtX3gpOyB9CisgICAgb3BlcmF0b3IgZG91YmxlICgpIGNvbnN0IHsgcmV0dXJuIGFuZ2xl
KCk7IH0KKyAgICBkb3VibGUgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gX2h5cG90KG1feCwgbV95
KTsgfQorfTsKKworUGF0aFZlY3RvciBvcGVyYXRvci0oY29uc3QgUGF0aFBvaW50JiBwMSwgY29u
c3QgUGF0aFBvaW50JiBwMikgeyByZXR1cm4gUGF0aFZlY3RvcihwMS5tX3ggLSBwMi5tX3gsIHAx
Lm1feSAtIHAyLm1feSk7IH0KKworc3RhdGljIHZvaWQgYWRkQXJjUG9pbnQoUGF0aFBvbHlnb24m
IHBvbHksIGNvbnN0IFBhdGhQb2ludCYgY2VudGVyLCBjb25zdCBQYXRoUG9pbnQmIHJhZGl1cywg
ZG91YmxlIGFuZ2xlKQoreworICAgIFBhdGhQb2ludCBwOworICAgIGdldEVsbGlwc2VQb2ludEJ5
QW5nbGUoYW5nbGUsIHJhZGl1cy5tX3gsIHJhZGl1cy5tX3ksIHAubV94LCBwLm1feSk7CisgICAg
dHJhbnNmb3JtQXJjUG9pbnQocC5tX3gsIHAubV95LCBjZW50ZXIpOworICAgIGlmIChwb2x5Lmlz
RW1wdHkoKSB8fCBwb2x5Lmxhc3QoKSAhPSBwKQorICAgICAgICBwb2x5LmFwcGVuZChwKTsKK30K
Kworc3RhdGljIHZvaWQgYWRkQXJjUG9pbnRzKFBhdGhQb2x5Z29uJiBwb2x5LCBjb25zdCBQbGF0
Zm9ybVBhdGhFbGVtZW50OjpBcmNUbyYgZGF0YSkKK3sKKyAgICBjb25zdCBQYXRoUG9pbnQmIHN0
YXJ0UG9pbnQgPSBwb2x5Lmxhc3QoKTsKKyAgICBkb3VibGUgY3VyQW5nbGUgPSBzdGFydFBvaW50
IC0gZGF0YS5tX2NlbnRlcjsKKyAgICBkb3VibGUgZW5kQW5nbGUgPSBkYXRhLm1fZW5kIC0gZGF0
YS5tX2NlbnRlcjsKKyAgICBkb3VibGUgYW5nbGVTdGVwID0gMi4gLyBzdGQ6Om1heChkYXRhLm1f
cmFkaXVzLm1feCwgZGF0YS5tX3JhZGl1cy5tX3kpOworICAgIGlmIChkYXRhLm1fY2xvY2t3aXNl
KSB7CisgICAgICAgIGlmIChlbmRBbmdsZSA8PSBjdXJBbmdsZSB8fCBzdGFydFBvaW50ID09IGRh
dGEubV9lbmQpCisgICAgICAgICAgICBlbmRBbmdsZSArPSAyICogUEk7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgYW5nbGVTdGVwID0gLWFuZ2xlU3RlcDsKKyAgICAgICAgaWYgKGVuZEFuZ2xlID49
IGN1ckFuZ2xlIHx8IHN0YXJ0UG9pbnQgPT0gZGF0YS5tX2VuZCkKKyAgICAgICAgICAgIGVuZEFu
Z2xlIC09IDIgKiBQSTsKKyAgICB9CisKKyAgICBmb3IgKGN1ckFuZ2xlICs9IGFuZ2xlU3RlcDsg
ZGF0YS5tX2Nsb2Nrd2lzZSA/IGN1ckFuZ2xlIDwgZW5kQW5nbGUgOiBjdXJBbmdsZSA+IGVuZEFu
Z2xlOyBjdXJBbmdsZSArPSBhbmdsZVN0ZXApCisgICAgICAgIGFkZEFyY1BvaW50KHBvbHksIGRh
dGEubV9jZW50ZXIsIGRhdGEubV9yYWRpdXMsIGN1ckFuZ2xlKTsKKworICAgIGlmIChwb2x5Lmlz
RW1wdHkoKSB8fCBwb2x5Lmxhc3QoKSAhPSBkYXRhLm1fZW5kKQorICAgICAgICBwb2x5LmFwcGVu
ZChkYXRhLm1fZW5kKTsKK30KKworc3RhdGljIHZvaWQgZHJhd1BvbHlnb25zKEhEQyBkYywgY29u
c3QgVmVjdG9yPFBhdGhQb2x5Z29uPiYgcG9seWdvbnMsIGJvb2wgZmlsbCwgY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgqIHRyKQoreworICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZh
aWw7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvbHlnb24+Ojpjb25zdF9pdGVyYXRvciBpID0gcG9s
eWdvbnMuYmVnaW4oKTsgaSAhPSBwb2x5Z29ucy5lbmQoKTsgKytpKSB7CisgICAgICAgIGludCBu
cG9pbnRzID0gaS0+c2l6ZSgpOworICAgICAgICBpZiAoIW5wb2ludHMpCisgICAgICAgICAgICBj
b250aW51ZTsKKworICAgICAgICBQT0lOVCogd2luUG9pbnRzID0gMDsKKyAgICAgICAgaWYgKGZp
bGwpIHsKKyAgICAgICAgICAgIGlmIChucG9pbnRzID4gMikKKyAgICAgICAgICAgICAgICB3aW5Q
b2ludHMgPSBuZXcgUE9JTlRbbnBvaW50cyArIDFdOworICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgIHdpblBvaW50cyA9IG5ldyBQT0lOVFtucG9pbnRzXTsKKworICAgICAgICBpZiAod2luUG9p
bnRzKSB7CisgICAgICAgICAgICBpZiAodHIpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBp
MiA9IDA7IGkyIDwgbnBvaW50czsgKytpMikgeworICAgICAgICAgICAgICAgICAgICBGbG9hdFBv
aW50IHRyUG9pbnQgPSB0ci0+bWFwUG9pbnQoaS0+YXQoaTIpKTsKKyAgICAgICAgICAgICAgICAg
ICAgd2luUG9pbnRzW2kyXS54ID0gc3RhYmxlUm91bmQodHJQb2ludC54KCkpOworICAgICAgICAg
ICAgICAgICAgICB3aW5Qb2ludHNbaTJdLnkgPSBzdGFibGVSb3VuZCh0clBvaW50LnkoKSk7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBm
b3IgKGludCBpMiA9IDA7IGkyIDwgbnBvaW50czsgKytpMikgeworICAgICAgICAgICAgICAgICAg
ICB3aW5Qb2ludHNbaTJdLnggPSBzdGFibGVSb3VuZChpLT5hdChpMikueCgpKTsKKyAgICAgICAg
ICAgICAgICAgICAgd2luUG9pbnRzW2kyXS55ID0gc3RhYmxlUm91bmQoaS0+YXQoaTIpLnkoKSk7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmls
bCAmJiB3aW5Qb2ludHNbbnBvaW50cyAtIDFdICE9IHdpblBvaW50c1swXSkgeworICAgICAgICAg
ICAgICAgIHdpblBvaW50c1tucG9pbnRzXS54ID0gd2luUG9pbnRzWzBdLng7CisgICAgICAgICAg
ICAgICAgd2luUG9pbnRzW25wb2ludHNdLnkgPSB3aW5Qb2ludHNbMF0ueTsKKyAgICAgICAgICAg
ICAgICArK25wb2ludHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWxsKSAK
KyAgICAgICAgICAgICAgICA6OlBvbHlnb24oZGMsIHdpblBvaW50cywgbnBvaW50cyk7CisgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgOjpQb2x5bGluZShkYywgd2luUG9pbnRzLCBu
cG9pbnRzKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIHdpblBvaW50czsKKyAgICAgICAgfQorICAg
IH0KK30KKworCitpbnQgUGxhdGZvcm1QYXRoRWxlbWVudDo6bnVtQ29udHJvbFBvaW50cygpIGNv
bnN0Cit7CisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICAgICAgY2FzZSBQYXRoTW92ZVRvOgor
ICAgICAgICBjYXNlIFBhdGhMaW5lVG86CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAg
Y2FzZSBQYXRoUXVhZEN1cnZlVG86CisgICAgICAgIGNhc2UgUGF0aEFyY1RvOgorICAgICAgICAg
ICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgUGF0aEJlemllckN1cnZlVG86CisgICAgICAgICAg
ICByZXR1cm4gMzsKKyAgICAgICAgLy9jYXNlIFBhdGhDbG9zZVN1YnBhdGg6CisgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK2ludCBQbGF0Zm9ybVBh
dGhFbGVtZW50OjpudW1Qb2ludHMoKSBjb25zdAoreworICAgIHN3aXRjaCAobV90eXBlKSB7Cisg
ICAgICAgIGNhc2UgUGF0aE1vdmVUbzoKKyAgICAgICAgY2FzZSBQYXRoTGluZVRvOgorICAgICAg
ICBjYXNlIFBhdGhBcmNUbzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFBh
dGhRdWFkQ3VydmVUbzoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIFBhdGhC
ZXppZXJDdXJ2ZVRvOgorICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIC8vY2FzZSBQYXRo
Q2xvc2VTdWJwYXRoOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorfQorCit2b2lkIFBhdGhQb2x5Z29uOjptb3ZlKGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0
KQoreworICAgIGZvciAoVmVjdG9yPFBhdGhQb2ludD46Oml0ZXJhdG9yIGkgPSBiZWdpbigpOyBp
IDwgZW5kKCk7ICsraSkKKyAgICAgICAgaS0+bW92ZShvZmZzZXQpOworfQorCit2b2lkIFBhdGhQ
b2x5Z29uOjp0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpCit7CisgICAg
Zm9yIChWZWN0b3I8UGF0aFBvaW50Pjo6aXRlcmF0b3IgaSA9IGJlZ2luKCk7IGkgPCBlbmQoKTsg
KytpKSB7CisgICAgICAgICppID0gdC5tYXBQb2ludCgqaSk7CisgICAgfQorfQorCitib29sIFBh
dGhQb2x5Z29uOjpjb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAg
ICBpZiAoc2l6ZSgpIDwgMykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50IGludGVy
c2VjdGVkID0gMDsKKyAgICBjb25zdCBQYXRoUG9pbnQqIHBvaW50MSA9ICZsYXN0KCk7CisgICAg
VmVjdG9yPFBhdGhQb2ludD46OmNvbnN0X2l0ZXJhdG9yIGxhc3QgPSBlbmQoKTsKKyAgICBpbnQg
d2FzTmVnYXRpdmUgPSAyOworICAgIGZvciAoVmVjdG9yPFBhdGhQb2ludD46OmNvbnN0X2l0ZXJh
dG9yIGkgPSBiZWdpbigpOyBpICE9IGxhc3Q7ICsraSkgeworICAgICAgICBjb25zdCBQYXRoUG9p
bnQmIHBvaW50MiA9ICppOworICAgICAgICBpZiAocG9pbnQxLT54KCkgIT0gcG9pbnQueCgpKSB7
CisgICAgICAgICAgICBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkpCisgICAgICAgICAgICAg
ICAgd2FzTmVnYXRpdmUgPSBwb2ludDEtPngoKSA8IHBvaW50LngoKSA/IDEgOiAwOworICAgICAg
ICAgICAgZWxzZSBpZiAocG9pbnQyLngoKSA8IHBvaW50LngoKSAhPSBwb2ludDEtPngoKSA8IHBv
aW50LngoKSkgeworICAgICAgICAgICAgICAgIGZsb2F0IHkgPSAocG9pbnQyLnkoKSAtIHBvaW50
MS0+eSgpKSAvIChwb2ludDIueCgpIC0gcG9pbnQxLT54KCkpICogKHBvaW50LngoKSAtIHBvaW50
MS0+eCgpKSArIHBvaW50MS0+eSgpOworICAgICAgICAgICAgICAgIGlmICh5ID49IHBvaW50Lnko
KSkKKyAgICAgICAgICAgICAgICAgICAgKytpbnRlcnNlY3RlZDsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwb2ludDEtPnkoKSA9PSBwb2ludC55KCkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IGlmIChwb2ludDEtPnkoKSA+IHBvaW50LnkoKSkgeworICAgICAgICAgICAgICAgIGlmIChwb2lu
dDIueCgpID09IHBvaW50LngoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnQyLnko
KSA8PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAod2FzTmVnYXRp
dmUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFBhdGhQb2ludD46OmNv
bnN0X2l0ZXJhdG9yIGpMYXN0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxQ
YXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBiZWdpbigpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbGFzdDsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tajsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoai0+eCgpICE9IHBvaW50LngoKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoai0+eCgpID4gcG9pbnQueCgpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzTmVnYXRpdmUgPSAwOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB3YXNOZWdhdGl2ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0gd2hpbGUgKGogIT0gakxhc3QpOworCisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAod2FzTmVnYXRpdmUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYg
KHdhc05lZ2F0aXZlID8gcG9pbnQyLngoKSA+IHBvaW50LngoKSA6IHBvaW50Mi54KCkgPCBwb2lu
dC54KCkpCisgICAgICAgICAgICAgICAgICAgICAgICArK2ludGVyc2VjdGVkOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkg
JiYgcG9pbnQyLnkoKSA+PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIH0KKyAgICAgICAgcG9pbnQxID0gJnBvaW50MjsKKyAgICB9CisKKyAgICByZXR1
cm4gaW50ZXJzZWN0ZWQgJiAxOworfQorCit2b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6Om1vdmUo
Y29uc3QgRmxvYXRTaXplJiBvZmZzZXQpIHsKKyAgICBpbnQgbiA9IG51bUNvbnRyb2xQb2ludHMo
KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgbV9kYXRhLm1fcG9p
bnRzW2ldLm1vdmUob2Zmc2V0KTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGhFbGVtZW50Ojp0cmFu
c2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpIHsKKyAgICBpbnQgbiA9IG51bUNv
bnRyb2xQb2ludHMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAg
ICBGbG9hdFBvaW50IHAgPSB0Lm1hcFBvaW50KG1fZGF0YS5tX3BvaW50c1tpXSk7CisgICAgICAg
IG1fZGF0YS5tX3BvaW50c1tpXS5zZXQocC54KCksIHAueSgpKTsKKyAgICB9Cit9CisKK3ZvaWQg
UGxhdGZvcm1QYXRoRWxlbWVudDo6aW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShGbG9hdFJlY3QmIHIs
IGNvbnN0IEZsb2F0UG9pbnQmIGxhc3RQb2ludCkgY29uc3QgeworICAgIGlmIChtX3R5cGUgPT0g
UGF0aEFyY1RvKSB7CisgICAgICAgIGNvbnN0IEFyY1RvJiBkYXRhID0gbV9kYXRhLm1fYXJjVG9E
YXRhOworICAgICAgICBQYXRoUG9pbnQgc3RhcnRQb2ludDsKKyAgICAgICAgc3RhcnRQb2ludCA9
IGxhc3RQb2ludDsKKyAgICAgICAgUGF0aFBvaW50IGVuZFBvaW50ID0gZGF0YS5tX2VuZDsKKyAg
ICAgICAgaWYgKCFkYXRhLm1fY2xvY2t3aXNlKQorICAgICAgICAgICAgc3RkOjpzd2FwKHN0YXJ0
UG9pbnQsIGVuZFBvaW50KTsKKworICAgICAgICBpbnQgcTAgPSBxdWFkcmFudChzdGFydFBvaW50
LCBkYXRhLm1fY2VudGVyKTsKKyAgICAgICAgaW50IHExID0gcXVhZHJhbnQoZW5kUG9pbnQsIGRh
dGEubV9jZW50ZXIpOworICAgICAgICBib29sIGNvbnRhaW5zRXh0cmVtZXNbNF0gPSB7IGZhbHNl
IH07IC8vIGJvdHRvbSwgbGVmdCwgdG9wLCByaWdodAorICAgICAgICBzdGF0aWMgY29uc3QgUGF0
aFBvaW50IGV4dHJlbWVWZWN0b3JzWzRdID0geyB7IDAsIDEgfSwgeyAtMSwgMCB9LCB7IDAsIC0x
IH0sIHsgMSwgMCB9IH07CisgICAgICAgIGlmIChxMCA9PSBxMSkgeworICAgICAgICAgICAgaWYg
KHN0YXJ0UG9pbnQubV94ID09IGVuZFBvaW50Lm1feCB8fCBpc1F1YWRyYW50T25Cb3R0b20ocTAp
ICE9IHN0YXJ0UG9pbnQubV94ID4gZW5kUG9pbnQubV94KSB7CisgICAgICAgICAgICAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zRXh0
cmVtZXNbaV0gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgaW50IGV4dHJlbWUgPSBxMDsKKyAgICAgICAgICAgIGludCBkaWZmID0gcXVhZHJhbnRE
aWZmKHExLCBxMCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZmY7ICsraSkg
eworICAgICAgICAgICAgICAgIGNvbnRhaW5zRXh0cmVtZXNbZXh0cmVtZV0gPSB0cnVlOworICAg
ICAgICAgICAgICAgIGV4dHJlbWUgPSBuZXh0UXVhZHJhbnQoZXh0cmVtZSk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIHN0
YXJ0UG9pbnQubV94LCBzdGFydFBvaW50Lm1feSk7CisgICAgICAgIGluZmxhdGVSZWN0VG9Db250
YWluUG9pbnQociwgZW5kUG9pbnQubV94LCBlbmRQb2ludC5tX3kpOworICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5zRXh0cmVtZXNb
aV0pIHsKKyAgICAgICAgICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIGRhdGEu
bV9jZW50ZXIubV94ICsgZGF0YS5tX3JhZGl1cy5tX3ggKiBleHRyZW1lVmVjdG9yc1tpXS5tX3gs
IGRhdGEubV9jZW50ZXIubV95ICsgZGF0YS5tX3JhZGl1cy5tX3kgKiBleHRyZW1lVmVjdG9yc1tp
XS5tX3kpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAg
aW50IG4gPSBudW1Qb2ludHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kp
CisgICAgICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIG1fZGF0YS5tX3BvaW50
c1tpXS5tX3gsIG1fZGF0YS5tX3BvaW50c1tpXS5tX3kpOworICAgIH0KK30KKworUGF0aEVsZW1l
bnRUeXBlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OnR5cGUoKSBjb25zdCB7CisgICAgc3dpdGNoICht
X3R5cGUpIHsKKyAgICAgICAgY2FzZSBQYXRoTW92ZVRvOgorICAgICAgICAgICAgcmV0dXJuIFBh
dGhFbGVtZW50TW92ZVRvUG9pbnQ7CisgICAgICAgIGNhc2UgUGF0aExpbmVUbzoKKyAgICAgICAg
ICAgIHJldHVybiBQYXRoRWxlbWVudEFkZExpbmVUb1BvaW50OworICAgICAgICBjYXNlIFBhdGhB
cmNUbzoKKyAgICAgICAgICAgIC8vIEZJWE1FOiB0aGVyZSdzIG5vIGFyY1RvIHR5cGUgZm9yIFBh
dGhFbGVtZW50CisgICAgICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRMaW5lVG9Qb2ludDsK
KyAgICAgICAgICAgIC8vIHJldHVybiBQYXRoRWxlbWVudEFkZFF1YWRDdXJ2ZVRvUG9pbnQ7Cisg
ICAgICAgIGNhc2UgUGF0aFF1YWRDdXJ2ZVRvOgorICAgICAgICAgICAgcmV0dXJuIFBhdGhFbGVt
ZW50QWRkUXVhZEN1cnZlVG9Qb2ludDsKKyAgICAgICAgY2FzZSBQYXRoQmV6aWVyQ3VydmVUbzoK
KyAgICAgICAgICAgIHJldHVybiBQYXRoRWxlbWVudEFkZEN1cnZlVG9Qb2ludDsKKyAgICAgICAg
Ly9jYXNlIFBhdGhDbG9zZVN1YnBhdGg6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gUGF0aEVsZW1lbnRDbG9zZVN1YnBhdGg7CisgICAgfQorfQorCitQbGF0Zm9ybVBhdGg6
OlBsYXRmb3JtUGF0aCgpCis6IG1fcGVuTGlmdGVkKHRydWUpCit7CisgICAgbV9jdXJyZW50UG9p
bnQuY2xlYXIoKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmVuc3VyZVN1YnBhdGgoKQorewor
ICAgIGlmIChtX3BlbkxpZnRlZCkgeworICAgICAgICBtX3BlbkxpZnRlZCA9IGZhbHNlOworICAg
ICAgICBtX3N1YnBhdGhzLmFwcGVuZChQYXRoUG9seWdvbigpKTsKKyAgICAgICAgbV9zdWJwYXRo
cy5sYXN0KCkuYXBwZW5kKG1fY3VycmVudFBvaW50KTsKKyAgICB9IGVsc2UKKyAgICAgICAgQVNT
RVJUKCFtX3N1YnBhdGhzLmlzRW1wdHkoKSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRU
b1N1YnBhdGgoY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudCYgZSkKK3sKKyAgICBpZiAoZS5wbGF0
Zm9ybVR5cGUoKSA9PSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoTW92ZVRvKSB7CisgICAgICAg
IG1fcGVuTGlmdGVkID0gdHJ1ZTsKKyAgICAgICAgbV9jdXJyZW50UG9pbnQgPSBlLnBvaW50QXQo
MCk7CisgICAgfSBlbHNlIGlmIChlLnBsYXRmb3JtVHlwZSgpID09IFBsYXRmb3JtUGF0aEVsZW1l
bnQ6OlBhdGhDbG9zZVN1YnBhdGgpIHsKKyAgICAgICAgbV9wZW5MaWZ0ZWQgPSB0cnVlOworICAg
ICAgICBpZiAoIW1fc3VicGF0aHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAobV9jdXJy
ZW50UG9pbnQgIT0gbV9zdWJwYXRocy5sYXN0KClbMF0pIHsKKyAgICAgICAgICAgICAgICAvLyBB
Y2NvcmRpbmcgdG8gVzNDLCB3ZSBoYXZlIHRvIGRyYXcgYSBsaW5lIGZyb20gY3VycmVudCBwb2lu
dCB0byB0aGUgaW5pdGlhbCBwb2ludAorICAgICAgICAgICAgICAgIG1fc3VicGF0aHMubGFzdCgp
LmFwcGVuZChtX3N1YnBhdGhzLmxhc3QoKVswXSk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50
UG9pbnQgPSBtX3N1YnBhdGhzLmxhc3QoKVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIGVuc3VyZVN1YnBhdGgoKTsKKyAgICAgICAgc3dpdGNoIChlLnBsYXRmb3JtVHlwZSgp
KSB7CisgICAgICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhMaW5lVG86Cisg
ICAgICAgICAgICAgICAgbV9zdWJwYXRocy5sYXN0KCkuYXBwZW5kKGUucG9pbnRBdCgwKSk7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1l
bnQ6OlBhdGhBcmNUbzoKKyAgICAgICAgICAgICAgICBhZGRBcmNQb2ludHMobV9zdWJwYXRocy5s
YXN0KCksIGUuYXJjVG8oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBj
YXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhRdWFkQ3VydmVUbzoKKyAgICAgICAgICAgICAg
ICB7CisgICAgICAgICAgICAgICAgICAgIFBhdGhQb2ludCBjb250cm9sW10gPSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBtX2N1cnJlbnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAg
IGUucG9pbnRBdCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgxKSwKKyAg
ICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2lj
IG51bWJlcj8KKyAgICAgICAgICAgICAgICAgICAgcXVhZEN1cnZlKDUwLCBtX3N1YnBhdGhzLmxh
c3QoKSwgY29udHJvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQmV6aWVyQ3VydmVU
bzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBhdGhQb2ludCBjb250
cm9sW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRQb2ludCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
IGUucG9pbnRBdCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgyKSwKKyAg
ICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2lj
IG51bWJlcj8KKyAgICAgICAgICAgICAgICAgICAgYmV6aWVyKDEwMCwgbV9zdWJwYXRocy5sYXN0
KCksIGNvbnRyb2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICAgICAgbV9jdXJyZW50UG9pbnQgPSBtX3N1YnBhdGhzLmxhc3QoKS5sYXN0KCk7CisgICAg
fQorfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1l
bnQmIGUpCit7CisgICAgZS5pbmZsYXRlUmVjdFRvQ29udGFpbk1lKG1fYm91bmRpbmdSZWN0LCBs
YXN0UG9pbnQoKSk7CisgICAgYWRkVG9TdWJwYXRoKGUpOworICAgIG1fZWxlbWVudHMuYXBwZW5k
KGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aCYg
cCkKK3sKKyAgICBjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50cyYgZSA9IHAuZWxlbWVudHMoKTsK
KyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVyYXRvciBpdChlLmJlZ2lu
KCkpOyBpdCAhPSBlLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGFkZFRvU3VicGF0aCgqaXQpOwor
ICAgICAgICBpdC0+aW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShtX2JvdW5kaW5nUmVjdCwgbGFzdFBv
aW50KCkpOworICAgICAgICBtX2VsZW1lbnRzLmFwcGVuZCgqaXQpOworICAgIH0KK30KKwordm9p
ZCBQbGF0Zm9ybVBhdGg6OmNsZWFyKCkKK3sgCisgICAgbV9lbGVtZW50cy5jbGVhcigpOyAKKyAg
ICBtX2JvdW5kaW5nUmVjdCA9IEZsb2F0UmVjdCgpOworICAgIG1fc3VicGF0aHMuY2xlYXIoKTsK
KyAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigpOworICAgIG1fcGVuTGlmdGVkID0gdHJ1ZTsKK30K
Kwordm9pZCBQbGF0Zm9ybVBhdGg6OnN0cm9rZVBhdGgoSERDIGRjLCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCogdHIpIGNvbnN0Cit7CisgICAgZHJhd1BvbHlnb25zKGRjLCBtX3N1YnBhdGhz
LCBmYWxzZSwgdHIpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6ZmlsbFBhdGgoSERDIGRjLCBj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogdHIpIGNvbnN0Cit7CisgICAgSEdESU9CSiBvbGRQ
ZW4gPSBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfUEVOKSk7CisgICAgZHJh
d1BvbHlnb25zKGRjLCBtX3N1YnBhdGhzLCB0cnVlLCB0cik7CisgICAgU2VsZWN0T2JqZWN0KGRj
LCBvbGRQZW4pOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6dHJhbnNsYXRlKGNvbnN0IEZsb2F0
U2l6ZSYgc2l6ZSkKK3sKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjppdGVyYXRvciBp
dChtX2VsZW1lbnRzLmJlZ2luKCkpOyBpdCAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2l0KSB7Cisg
ICAgICAgIGl0LT5tb3ZlKHNpemUpOworICAgIH0KKworICAgIG1fYm91bmRpbmdSZWN0Lm1vdmUo
c2l6ZSk7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvbHlnb24+OjppdGVyYXRvciBpdCA9IG1fc3Vi
cGF0aHMuYmVnaW4oKTsgaXQgIT0gbV9zdWJwYXRocy5lbmQoKTsgKytpdCkgeworICAgICAgICBp
dC0+bW92ZShzaXplKTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjp0cmFuc2Zvcm0o
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpCit7CisgICAgZm9yIChQbGF0Zm9ybVBhdGhF
bGVtZW50czo6aXRlcmF0b3IgaXQobV9lbGVtZW50cy5iZWdpbigpKTsgaXQgIT0gbV9lbGVtZW50
cy5lbmQoKTsgKytpdCkgeworICAgICAgICBpdC0+dHJhbnNmb3JtKHQpOworICAgIH0KKyAgICBt
X2JvdW5kaW5nUmVjdCA9IHQubWFwUmVjdChtX2JvdW5kaW5nUmVjdCk7CisgICAgZm9yIChWZWN0
b3I8UGF0aFBvbHlnb24+OjppdGVyYXRvciBpdCA9IG1fc3VicGF0aHMuYmVnaW4oKTsgaXQgIT0g
bV9zdWJwYXRocy5lbmQoKTsgKytpdCkgeworICAgICAgICBpdC0+dHJhbnNmb3JtKHQpOworICAg
IH0KK30KKworYm9vbCBQbGF0Zm9ybVBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAoreworICAgIC8vIG9wdGltaXphdGlvbjogY2hlY2sg
dGhlIGJvdW5kaW5nIHJlY3QgZmlyc3QKKyAgICBpZiAoIWNvbnRhaW5zUG9pbnQobV9ib3VuZGlu
Z1JlY3QsIHBvaW50KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9y
IChWZWN0b3I8UGF0aFBvbHlnb24+Ojpjb25zdF9pdGVyYXRvciBpID0gbV9zdWJwYXRocy5iZWdp
bigpOyBpICE9IG1fc3VicGF0aHMuZW5kKCk7ICsraSkgeworICAgICAgICBpZiAoaS0+Y29udGFp
bnMocG9pbnQpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJu
IGZhbHNlOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50KQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6Ok1vdmVUbyBkYXRhID0geyB7IHBv
aW50LngoKSwgcG9pbnQueSgpIH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEp
OworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRMaW5lVG8oY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6TGluZVRv
IGRhdGEgPSB7IHsgcG9pbnQueCgpLCBwb2ludC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVs
ZW1lbnQgcGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6
OmFkZFF1YWRDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNwLCBjb25zdCBGbG9hdFBvaW50JiBw
KQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlF1YWRDdXJ2ZVRvIGRhdGEgPSB7IHsgY3Au
eCgpLCBjcC55KCkgfSwgeyBwLngoKSwgcC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1l
bnQgcGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFk
ZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AxLCBjb25zdCBGbG9hdFBvaW50JiBj
cDIsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QmV6
aWVyQ3VydmVUbyBkYXRhID0geyB7IGNwMS54KCksIGNwMS55KCkgfSwgeyBjcDIueCgpLCBjcDIu
eSgpIH0sIHsgcC54KCksIHAueSgpIH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRh
dGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRBcmNUbyhj
b25zdCBGbG9hdFBvaW50JiBmcDEsIGNvbnN0IEZsb2F0UG9pbnQmIGZwMiwgZmxvYXQgcmFkaXVz
KQoreworICAgIGNvbnN0IFBhdGhQb2ludCYgcDAgPSBtX2N1cnJlbnRQb2ludDsKKyAgICBQYXRo
UG9pbnQgcDE7CisgICAgcDEgPSBmcDE7CisgICAgUGF0aFBvaW50IHAyOworICAgIHAyID0gZnAy
OworICAgIGlmICghcmFkaXVzIHx8IHAwID09IHAxIHx8IHAxID09IHAyKSB7CisgICAgICAgIGFk
ZExpbmVUbyhwMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQYXRoVmVjdG9yIHYw
MSA9IHAwIC0gcDE7CisgICAgUGF0aFZlY3RvciB2MjEgPSBwMiAtIHAxOworCisgICAgLy8gc2lu
KEEgLSBCKSA9IHNpbihBKSAqIGNvcyhCKSAtIHNpbihCKSAqIGNvcyhBKQorICAgIGRvdWJsZSBj
cm9zcyA9IHYwMS5tX3ggKiB2MjEubV95IC0gdjAxLm1feSAqIHYyMS5tX3g7CisKKyAgICBpZiAo
ZmFicyhjcm9zcykgPCAxRS0xMCkgeworICAgICAgICAvLyBvbiBvbmUgbGluZQorICAgICAgICBh
ZGRMaW5lVG8ocDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG91YmxlIGQwMSA9
IHYwMS5sZW5ndGgoKTsKKyAgICBkb3VibGUgZDIxID0gdjIxLmxlbmd0aCgpOworICAgIGRvdWJs
ZSBhbmdsZSA9IChQSSAtIGFicyhhc2luKGNyb3NzIC8gKGQwMSAqIGQyMSkpKSkgKiAwLjU7Cisg
ICAgZG91YmxlIHNwYW4gPSByYWRpdXMgKiB0YW4oYW5nbGUpOworICAgIGRvdWJsZSByYXRlID0g
c3BhbiAvIGQwMTsKKyAgICBQYXRoUG9pbnQgc3RhcnRQb2ludDsKKyAgICBzdGFydFBvaW50Lm1f
eCA9IHAxLm1feCArIHYwMS5tX3ggKiByYXRlOworICAgIHN0YXJ0UG9pbnQubV95ID0gcDEubV95
ICsgdjAxLm1feSAqIHJhdGU7CisKKyAgICBhZGRMaW5lVG8oc3RhcnRQb2ludCk7CisKKyAgICBQ
YXRoUG9pbnQgZW5kUG9pbnQ7CisgICAgcmF0ZSA9IHNwYW4gLyBkMjE7CisgICAgZW5kUG9pbnQu
bV94ID0gcDEubV94ICsgdjIxLm1feCAqIHJhdGU7CisgICAgZW5kUG9pbnQubV95ID0gcDEubV95
ICsgdjIxLm1feSAqIHJhdGU7CisKKyAgICBQYXRoUG9pbnQgbWlkUG9pbnQ7CisgICAgbWlkUG9p
bnQubV94ID0gKHN0YXJ0UG9pbnQubV94ICsgZW5kUG9pbnQubV94KSAqIDAuNTsKKyAgICBtaWRQ
b2ludC5tX3kgPSAoc3RhcnRQb2ludC5tX3kgKyBlbmRQb2ludC5tX3kpICogMC41OworCisgICAg
UGF0aFZlY3RvciB2bTEgPSBtaWRQb2ludCAtIHAxOworICAgIGRvdWJsZSBkbTEgPSB2bTEubGVu
Z3RoKCk7CisgICAgZG91YmxlIGQgPSBfaHlwb3QocmFkaXVzLCBzcGFuKTsKKworICAgIFBhdGhQ
b2ludCBjZW50ZXJQb2ludDsKKyAgICByYXRlID0gZCAvIGRtMTsKKyAgICBjZW50ZXJQb2ludC5t
X3ggPSBwMS5tX3ggKyB2bTEubV94ICogcmF0ZTsKKyAgICBjZW50ZXJQb2ludC5tX3kgPSBwMS5t
X3kgKyB2bTEubV95ICogcmF0ZTsKKworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvIGRh
dGEgPSB7CisgICAgICAgIGVuZFBvaW50LAorICAgICAgICBjZW50ZXJQb2ludCwgCisgICAgICAg
IHsgcmFkaXVzLCByYWRpdXMgfSwKKyAgICAgICAgY3Jvc3MgPCAwCisgICAgfTsKKyAgICBQbGF0
Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1QYXRoOjpjbG9zZVN1YnBhdGgoKQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGU7
CisgICAgYXBwZW5kKHBlKTsKK30KKworLy8gYWRkIGEgY2lyY3VsYXIgYXJjIGNlbnRyZWQgYXQg
cCB3aXRoIHJhZGl1cyByIGZyb20gc3RhcnQgYW5nbGUgc2FyIChyYWRpYW5zKSB0byBlbmQgYW5n
bGUgZWFyCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkRWxsaXBzZShjb25zdCBGbG9hdFBvaW50JiBw
LCBmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBzYXIsIGZsb2F0IGVhciwgYm9vbCBhbnRpY2xvY2t3
aXNlKQoreworICAgIGZsb2F0IHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZOworCisgICAgbm9y
bWFsaXplQW5nbGUoc2FyKTsKKyAgICBub3JtYWxpemVBbmdsZShlYXIpOworCisgICAgZ2V0RWxs
aXBzZVBvaW50QnlBbmdsZShzYXIsIGEsIGIsIHN0YXJ0WCwgc3RhcnRZKTsKKyAgICBnZXRFbGxp
cHNlUG9pbnRCeUFuZ2xlKGVhciwgYSwgYiwgZW5kWCwgZW5kWSk7CisKKyAgICB0cmFuc2Zvcm1B
cmNQb2ludChzdGFydFgsIHN0YXJ0WSwgcCk7CisgICAgdHJhbnNmb3JtQXJjUG9pbnQoZW5kWCwg
ZW5kWSwgcCk7CisKKyAgICBGbG9hdFBvaW50IHN0YXJ0KHN0YXJ0WCwgc3RhcnRZKTsKKyAgICBt
b3ZlVG8oc3RhcnQpOworCisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QXJjVG8gZGF0YSA9IHsg
eyBlbmRYLCBlbmRZIH0sIHsgcC54KCksIHAueSgpIH0sICB7IGEsIGIgfSwgIWFudGljbG9ja3dp
c2UgfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7
Cit9CisKKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQor
eworICAgIG1vdmVUbyhyLmxvY2F0aW9uKCkpOworCisgICAgZmxvYXQgcmlnaHQgPSByLnJpZ2h0
KCkgLSAxOworICAgIGZsb2F0IGJvdHRvbSA9IHIuYm90dG9tKCkgLSAxOworICAgIGFkZExpbmVU
byhGbG9hdFBvaW50KHJpZ2h0LCByLnkoKSkpOworICAgIGFkZExpbmVUbyhGbG9hdFBvaW50KHJp
Z2h0LCBib3R0b20pKTsKKyAgICBhZGRMaW5lVG8oRmxvYXRQb2ludChyLngoKSwgYm90dG9tKSk7
CisgICAgYWRkTGluZVRvKHIubG9jYXRpb24oKSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjph
ZGRFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICBGbG9hdFNpemUgcmFkaXVzKHIu
d2lkdGgoKSAqIDAuNSwgci5oZWlnaHQoKSAqIDAuNSk7CisgICAgYWRkRWxsaXBzZShyLmxvY2F0
aW9uKCkgKyByYWRpdXMsIHJhZGl1cy53aWR0aCgpLCByYWRpdXMuaGVpZ2h0KCksIDAsIDAsIHRy
dWUpOworfQorCitTdHJpbmcgUGxhdGZvcm1QYXRoOjpkZWJ1Z1N0cmluZygpIGNvbnN0Cit7Cisg
ICAgU3RyaW5nIHJldDsKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVy
YXRvciBpKG1fZWxlbWVudHMuYmVnaW4oKSk7IGkgIT0gbV9lbGVtZW50cy5lbmQoKTsgKytpKSB7
CisgICAgICAgIHN3aXRjaCAoaS0+cGxhdGZvcm1UeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2Ug
UGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aE1vdmVUbzoKKyAgICAgICAgICAgIGNhc2UgUGxhdGZv
cm1QYXRoRWxlbWVudDo6UGF0aExpbmVUbzoKKyAgICAgICAgICAgICAgICByZXQgKz0gU3RyaW5n
Ojpmb3JtYXQoIk0gJWYgJWZcbiIsIGktPnBvaW50QXQoMCkubV94LCBpLT5wb2ludEF0KDApLm1f
eSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBsYXRmb3JtUGF0
aEVsZW1lbnQ6OlBhdGhBcmNUbzoKKyAgICAgICAgICAgICAgICByZXQgKz0gU3RyaW5nOjpmb3Jt
YXQoIkEgJWYgJWYgJWYgJWYgJWYgJWYgJWNcbiIKKyAgICAgICAgICAgICAgICAgICAgLCBpLT5h
cmNUbygpLm1fZW5kLm1feCwgaS0+YXJjVG8oKS5tX2VuZC5tX3kKKyAgICAgICAgICAgICAgICAg
ICAgLCBpLT5hcmNUbygpLm1fY2VudGVyLm1feCwgaS0+YXJjVG8oKS5tX2NlbnRlci5tX3kKKyAg
ICAgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fcmFkaXVzLm1feCwgaS0+YXJjVG8oKS5t
X3JhZGl1cy5tX3kKKyAgICAgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fY2xvY2t3aXNl
PyAnWScgOiAnTicpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQ
bGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoUXVhZEN1cnZlVG86CisgICAgICAgICAgICAgICAgcmV0
ICs9IFN0cmluZzo6Zm9ybWF0KCJRICVmICVmICVmICVmXG4iCisgICAgICAgICAgICAgICAgICAg
ICwgaS0+cG9pbnRBdCgwKS5tX3gsIGktPnBvaW50QXQoMCkubV95CisgICAgICAgICAgICAgICAg
ICAgICwgaS0+cG9pbnRBdCgxKS5tX3gsIGktPnBvaW50QXQoMSkubV95KTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aEJl
emllckN1cnZlVG86CisgICAgICAgICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJCICVm
ICVmICVmICVmICVmICVmXG4iCisgICAgICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgwKS5t
X3gsIGktPnBvaW50QXQoMCkubV95CisgICAgICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgx
KS5tX3gsIGktPnBvaW50QXQoMSkubV95CisgICAgICAgICAgICAgICAgICAgICwgaS0+cG9pbnRB
dCgyKS5tX3gsIGktPnBvaW50QXQoMikubV95KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aENsb3NlU3VicGF0aDoKKyAg
ICAgICAgICAgICAgICByZXQgKz0gIlNcbiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6
YXBwbHkodm9pZCogaW5mbywgUGF0aEFwcGxpZXJGdW5jdGlvbiBmdW5jdGlvbikgY29uc3QKK3sK
KyAgICBQYXRoRWxlbWVudCBwZWxlbWVudDsKKyAgICBGbG9hdFBvaW50IHBvaW50c1szXTsKKyAg
ICBwZWxlbWVudC5wb2ludHMgPSBwb2ludHM7CisKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1l
bnRzOjpjb25zdF9pdGVyYXRvciBpdChtX2VsZW1lbnRzLmJlZ2luKCkpOyBpdCAhPSBtX2VsZW1l
bnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHBlbGVtZW50LnR5cGUgPSBpdC0+dHlwZSgpOwor
ICAgICAgICBpbnQgbiA9IGl0LT5udW1Qb2ludHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBuOyArK2kpCisgICAgICAgICAgICBwb2ludHNbaV0gPSBpdC0+cG9pbnRBdChpKTsKKyAg
ICAgICAgZnVuY3Rpb24oaW5mbywgJnBlbGVtZW50KTsKKyAgICB9Cit9CisKKworfSAvLyBuYW1l
c3BhY2UgV2ViY29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9QbGF0Zm9ybVBhdGhXaW5jZS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Q
bGF0Zm9ybVBhdGhXaW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdk
ZGQ5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L1BsYXRmb3JtUGF0aFdpbmNlLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBQbGF0Zm9y
bVBhdGhXaW5jZV9oCisjZGVmaW5lIFBsYXRmb3JtUGF0aFdpbmNlX2gKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OworCisgICAgc3RydWN0IFBhdGhQ
b2ludCB7CisgICAgICAgIGZsb2F0IG1feDsKKyAgICAgICAgZmxvYXQgbV95OworICAgICAgICBj
b25zdCBmbG9hdCYgeCgpIGNvbnN0IHsgcmV0dXJuIG1feDsgfQorICAgICAgICBjb25zdCBmbG9h
dCYgeSgpIGNvbnN0IHsgcmV0dXJuIG1feTsgfQorICAgICAgICB2b2lkIHNldChmbG9hdCB4LCBm
bG9hdCB5KSB7IG1feCA9IHg7IG1feSA9IHk7IH07CisgICAgICAgIG9wZXJhdG9yIEZsb2F0UG9p
bnQoKSBjb25zdCB7IHJldHVybiBGbG9hdFBvaW50KG1feCwgbV95KTsgfQorICAgICAgICB2b2lk
IG1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpIHsgbV94ICs9IG9mZnNldC53aWR0aCgpOyBt
X3kgKz0gb2Zmc2V0LmhlaWdodCgpOyB9CisgICAgICAgIFBhdGhQb2ludCYgb3BlcmF0b3I9KGNv
bnN0IEZsb2F0UG9pbnQmIHApIHsgbV94ID0gcC54KCk7IG1feSA9IHAueSgpOyByZXR1cm4gKnRo
aXM7IH0KKyAgICAgICAgdm9pZCBjbGVhcigpIHsgbV94ID0gbV95ID0gMDsgfQorICAgIH07CisK
KyAgICBzdHJ1Y3QgUGF0aFBvbHlnb246IHB1YmxpYyBWZWN0b3I8UGF0aFBvaW50PiB7CisgICAg
ICAgIHZvaWQgbW92ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCk7CisgICAgICAgIHZvaWQgdHJh
bnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICAgICAgYm9vbCBjb250
YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3Q7CisgICAgfTsKKworICAgIGNsYXNz
IFBsYXRmb3JtUGF0aEVsZW1lbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBQbGFmb3Jt
UGF0aEVsZW1lbnRUeXBlIHsKKyAgICAgICAgICAgIFBhdGhNb3ZlVG8sCisgICAgICAgICAgICBQ
YXRoTGluZVRvLAorICAgICAgICAgICAgUGF0aEFyY1RvLAorICAgICAgICAgICAgUGF0aFF1YWRD
dXJ2ZVRvLAorICAgICAgICAgICAgUGF0aEJlemllckN1cnZlVG8sCisgICAgICAgICAgICBQYXRo
Q2xvc2VTdWJwYXRoLAorICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBNb3ZlVG8geworICAg
ICAgICAgICAgUGF0aFBvaW50IG1fZW5kOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBM
aW5lVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fZW5kOworICAgICAgICB9OworCisgICAg
ICAgIHN0cnVjdCBBcmNUbyB7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9lbmQ7CisgICAgICAg
ICAgICBQYXRoUG9pbnQgbV9jZW50ZXI7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9yYWRpdXM7
CisgICAgICAgICAgICBib29sIG1fY2xvY2t3aXNlOworICAgICAgICB9OworCisgICAgICAgIHN0
cnVjdCBRdWFkQ3VydmVUbyB7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDA7CisgICAg
ICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDE7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0
IEJlemllckN1cnZlVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQwOworICAgICAg
ICAgICAgUGF0aFBvaW50IG1fcG9pbnQxOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQy
OworICAgICAgICB9OworCisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoKTogbV90eXBlKFBh
dGhDbG9zZVN1YnBhdGgpIHsgbV9kYXRhLm1fcG9pbnRzWzBdLnNldCgwLCAwKTsgICAgfQorICAg
ICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IE1vdmVUbyYgZGF0YSk6IG1fdHlwZShQYXRo
TW92ZVRvKSB7IG1fZGF0YS5tX21vdmVUb0RhdGEgPSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3Jt
UGF0aEVsZW1lbnQoY29uc3QgTGluZVRvJiBkYXRhKTogbV90eXBlKFBhdGhMaW5lVG8pIHsgbV9k
YXRhLm1fbGluZVRvRGF0YSA9IGRhdGE7IH0KKyAgICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudChj
b25zdCBBcmNUbyYgZGF0YSk6IG1fdHlwZShQYXRoQXJjVG8pIHsgbV9kYXRhLm1fYXJjVG9EYXRh
ID0gZGF0YTsgfQorICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IFF1YWRDdXJ2ZVRv
JiBkYXRhKTogbV90eXBlKFBhdGhRdWFkQ3VydmVUbykgeyBtX2RhdGEubV9xdWFkQ3VydmVUb0Rh
dGEgPSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgQmV6aWVyQ3Vy
dmVUbyYgZGF0YSk6IG1fdHlwZShQYXRoQmV6aWVyQ3VydmVUbykgeyBtX2RhdGEubV9iZXppZXJD
dXJ2ZVRvRGF0YSA9IGRhdGE7IH0KKworICAgICAgICBjb25zdCBNb3ZlVG8mIG1vdmVUbygpIGNv
bnN0IHsgcmV0dXJuIG1fZGF0YS5tX21vdmVUb0RhdGE7IH0KKyAgICAgICAgY29uc3QgTGluZVRv
JiBsaW5lVG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9saW5lVG9EYXRhOyB9CisgICAgICAg
IGNvbnN0IEFyY1RvJiBhcmNUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX2FyY1RvRGF0YTsg
fQorICAgICAgICBjb25zdCBRdWFkQ3VydmVUbyYgcXVhZEN1cnZlVG8oKSBjb25zdCB7IHJldHVy
biBtX2RhdGEubV9xdWFkQ3VydmVUb0RhdGE7IH0KKyAgICAgICAgY29uc3QgQmV6aWVyQ3VydmVU
byYgYmV6aWVyQ3VydmVUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX2JlemllckN1cnZlVG9E
YXRhOyB9CisgICAgICAgIGNvbnN0IFBhdGhQb2ludCYgbGFzdFBvaW50KCkgY29uc3QgeyBpbnQg
biA9IG51bVBvaW50cygpOyByZXR1cm4gbiA+IDEgPyBtX2RhdGEubV9wb2ludHNbbiAtIDFdIDog
bV9kYXRhLm1fcG9pbnRzWzBdOyB9CisgICAgICAgIGNvbnN0IFBhdGhQb2ludCYgcG9pbnRBdChp
bnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX3BvaW50c1tpbmRleF07IH0KKyAgICAg
ICAgaW50IG51bVBvaW50cygpIGNvbnN0OworICAgICAgICBpbnQgbnVtQ29udHJvbFBvaW50cygp
IGNvbnN0OworICAgICAgICB2b2lkIG1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpOworICAg
ICAgICB2b2lkIHRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisgICAg
ICAgIFBhdGhFbGVtZW50VHlwZSB0eXBlKCkgY29uc3Q7CisgICAgICAgIFBsYWZvcm1QYXRoRWxl
bWVudFR5cGUgcGxhdGZvcm1UeXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9CisgICAgICAg
IHZvaWQgaW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9p
bnQmIGxhc3RQb2ludCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBQbGFmb3JtUGF0
aEVsZW1lbnRUeXBlIG1fdHlwZTsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgTW92ZVRv
IG1fbW92ZVRvRGF0YTsKKyAgICAgICAgICAgIExpbmVUbyBtX2xpbmVUb0RhdGE7CisgICAgICAg
ICAgICBBcmNUbyBtX2FyY1RvRGF0YTsKKyAgICAgICAgICAgIFF1YWRDdXJ2ZVRvIG1fcXVhZEN1
cnZlVG9EYXRhOworICAgICAgICAgICAgQmV6aWVyQ3VydmVUbyBtX2JlemllckN1cnZlVG9EYXRh
OworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnRzWzRdOworICAgICAgICB9IG1fZGF0YTsK
KyAgICB9OworCisgICAgdHlwZWRlZiBWZWN0b3I8UGxhdGZvcm1QYXRoRWxlbWVudD4gUGxhdGZv
cm1QYXRoRWxlbWVudHM7CisKKyAgICBjbGFzcyBQbGF0Zm9ybVBhdGggeworICAgIHB1YmxpYzoK
KyAgICAgICAgUGxhdGZvcm1QYXRoKCk7CisgICAgICAgIGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1l
bnRzJiBlbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudHM7IH0KKyAgICAgICAgdm9p
ZCBhcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudCYgZSk7CisgICAgICAgIHZvaWQgYXBw
ZW5kKGNvbnN0IFBsYXRmb3JtUGF0aCYgcCk7CisgICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAg
ICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50cy5pc0VtcHR5KCk7IH0K
KworICAgICAgICB2b2lkIHN0cm9rZVBhdGgoSERDLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCogdHIpIGNvbnN0OworICAgICAgICB2b2lkIGZpbGxQYXRoKEhEQywgY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgqIHRyKSBjb25zdDsKKyAgICAgICAgRmxvYXRQb2ludCBsYXN0UG9pbnQoKSBj
b25zdCB7IHJldHVybiBtX2VsZW1lbnRzLmlzRW1wdHkoKSA/IEZsb2F0UG9pbnQoMCwwKSA6IG1f
ZWxlbWVudHMubGFzdCgpLmxhc3RQb2ludCgpOyB9CisKKyAgICAgICAgY29uc3QgRmxvYXRSZWN0
JiBib3VuZGluZ1JlY3QoKSBjb25zdCB7IHJldHVybiBtX2JvdW5kaW5nUmVjdDsgfQorICAgICAg
ICBib29sIGNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBj
b25zdDsKKyAgICAgICAgdm9pZCB0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXplJiBzaXplKTsKKyAg
ICAgICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpOworCisg
ICAgICAgIHZvaWQgbW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICAgICAgdm9pZCBhZGRM
aW5lVG8oY29uc3QgRmxvYXRQb2ludCYpOworICAgICAgICB2b2lkIGFkZFF1YWRDdXJ2ZVRvKGNv
bnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludCwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpOwor
ICAgICAgICB2b2lkIGFkZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY29udHJvbFBv
aW50MSwgY29uc3QgRmxvYXRQb2ludCYgY29udHJvbFBvaW50MiwgY29uc3QgRmxvYXRQb2ludCYp
OworICAgICAgICB2b2lkIGFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmLCBjb25zdCBGbG9hdFBv
aW50JiwgZmxvYXQgcmFkaXVzKTsKKyAgICAgICAgdm9pZCBjbG9zZVN1YnBhdGgoKTsKKyAgICAg
ICAgdm9pZCBhZGRFbGxpcHNlKGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0IGEsIGZsb2F0IGIs
IGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9ja3dpc2UpOworICAgICAgICB2b2lk
IGFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKTsKKyAgICAgICAgdm9pZCBhZGRFbGxpcHNlKGNv
bnN0IEZsb2F0UmVjdCYgcik7CisgICAgICAgIFN0cmluZyBkZWJ1Z1N0cmluZygpIGNvbnN0Owor
ICAgICAgICB2b2lkIGFwcGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24gZnVuY3Rp
b24pIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBlbnN1cmVTdWJwYXRoKCk7
CisgICAgICAgIHZvaWQgYWRkVG9TdWJwYXRoKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQmIGUp
OworCisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnRzIG1fZWxlbWVudHM7CisgICAgICAgIEZs
b2F0UmVjdCBtX2JvdW5kaW5nUmVjdDsKKyAgICAgICAgVmVjdG9yPFBhdGhQb2x5Z29uPiBtX3N1
YnBhdGhzOworICAgICAgICBQYXRoUG9pbnQgbV9jdXJyZW50UG9pbnQ7CisgICAgICAgIGJvb2wg
bV9wZW5MaWZ0ZWQ7CisgICAgfTsKKworfQorCisjZW5kaWYgLy8gUGxhdGZvcm1QYXRoV2luY2Vf
aApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRt
YXAuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZThmNDkKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5jcHAK
QEAgLTAsMCArMSw3MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBN
b2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3aWxsIGJlIHVzZWZ1bCwK
KyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNoYXJlZEJpdG1hcC5oIgor
CisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NUeXBlcy5o
IgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hT
ZXQuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworI2lmbmRlZiBOREVCVUcKK3N0cnVjdCBTaGFyZWRCaXRt
YXBMZWFrQ291bnRlciB7CisgICAgflNoYXJlZEJpdG1hcExlYWtDb3VudGVyKCk7Cit9Oworc3Rh
dGljIFNoYXJlZEJpdG1hcExlYWtDb3VudGVyIHNoYXJlZEJpdG1hcExlYWtDb3VudGVyOworI2Vu
ZGlmCisKK3R5cGVkZWYgSGFzaFNldDxTaGFyZWRCaXRtYXAqPiBCaXRtYXBNYXA7CitCaXRtYXBN
YXAgZ19iaXRtYXBNYXA7CisKKyNpZm5kZWYgTkRFQlVHCitTaGFyZWRCaXRtYXBMZWFrQ291bnRl
cjo6flNoYXJlZEJpdG1hcExlYWtDb3VudGVyKCkKK3sKKyAgICBpZiAoIWdfYml0bWFwTWFwLmlz
RW1wdHkoKSkKKyAgICAgICAgcHJpbnRmKCJcbkxFQUs6ICV1ICVzXG5cbiIsIGdfYml0bWFwTWFw
LnNpemUoKSwgIlNoYXJlZEJpdG1hcCBvYmplY3RzIik7Cit9CisjZW5kaWYKKworc3RhdGljIFNo
YXJlZEJpdG1hcDo6RHJhd1BhdHRlcm5GdW5jIGdfZHJhd1BhdHRlcm4gPSAwOworc3RhdGljIFNo
YXJlZEJpdG1hcDo6RHJhd0ltYWdlRnVuYyBnX2RyYXdJbWFnZSA9IDA7CisKK3N0YXRpYyBpbmxp
bmUgaW50IHN0YWJsZVJvdW5kKGRvdWJsZSBkKQoreworICAgIGlmIChkID4gMCkKKyAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCArIDAuNSk7CisKKyAgICBpbnQgaSA9IHN0YXRpY19j
YXN0PGludD4oZCk7CisgICAgcmV0dXJuIGkgLSBkID4gMC41ID8gaSAtIDEgOiBpOworfQorCitT
aGFyZWRCaXRtYXA6OkRyYXdJbWFnZUZ1bmMgU2hhcmVkQml0bWFwOjpzZXREcmF3SW1hZ2VGdW5j
KERyYXdJbWFnZUZ1bmMgZnVuYykKK3sKKyAgICBEcmF3SW1hZ2VGdW5jIG9sZEZ1bmMgPSBnX2Ry
YXdJbWFnZTsKKyAgICBnX2RyYXdJbWFnZSA9IGZ1bmM7CisgICAgcmV0dXJuIG9sZEZ1bmM7Cit9
CisKK1NoYXJlZEJpdG1hcDo6RHJhd1BhdHRlcm5GdW5jIFNoYXJlZEJpdG1hcDo6c2V0RHJhd1Bh
dHRlcm5GdW5jKERyYXdQYXR0ZXJuRnVuYyBmdW5jKQoreworICAgIERyYXdQYXR0ZXJuRnVuYyBv
bGRGdW5jID0gZ19kcmF3UGF0dGVybjsKKyAgICBnX2RyYXdQYXR0ZXJuID0gZnVuYzsKKyAgICBy
ZXR1cm4gb2xkRnVuYzsKK30KKworUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJlZEJpdG1h
cDo6Y3JlYXRlSW5zdGFuY2UoYm9vbCBpczE2Yml0LCBpbnQgdywgaW50IGgsIGJvb2wgaW5pdFBp
eGVscykKK3sKKyAgICBTaGFyZWRCaXRtYXAqIHJ0biA9IG5ldyBTaGFyZWRCaXRtYXAoaXMxNmJp
dCwgdywgaCwgaW5pdFBpeGVscyk7CisgICAgaWYgKHJ0biAmJiAhcnRuLT5ieXRlcygpKSB7Cisg
ICAgICAgIGRlbGV0ZSBydG47CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4g
YWRvcHRSZWYocnRuKTsKK30KKworU2hhcmVkQml0bWFwOjpTaGFyZWRCaXRtYXAoY29uc3QgQml0
bWFwSW5mbyYgYm1wSW5mbywgSEJJVE1BUCBoYm1wLCB2b2lkKiBwaXhlbHMpCis6IG1fYm1wSW5m
byhibXBJbmZvKQorLCBtX2xvY2tlZChmYWxzZSkKKywgbV91c2VzVHJhbnNwYXJlbnRDb2xvcihm
YWxzZSkKKywgbV90cmFuc3BhcmVudENvbG9yKFJHQigwLCAwLCAwKSkKKywgbV9waXhlbHMocGl4
ZWxzKQorLCBtX2hiaXRtYXAoaGJtcCkKKywgbV9oYXNBbHBoYShmYWxzZSkKKywgbV92YWxpZEhl
aWdodChibXBJbmZvLmhlaWdodCgpKQoreworICAgIGdfYml0bWFwTWFwLmFkZCh0aGlzKTsKK30K
KworU2hhcmVkQml0bWFwOjpTaGFyZWRCaXRtYXAoYm9vbCBfaXMxNmJpdCwgaW50IHcsIGludCBo
LCBib29sIGluaXRQaXhlbHMpCis6IG1fYm1wSW5mbyhfaXMxNmJpdCwgdywgaCkKKywgbV9yZWZl
cmVuY2UoMSkKKywgbV9sb2NrZWQoZmFsc2UpCissIG1fdXNlc1RyYW5zcGFyZW50Q29sb3IoZmFs
c2UpCissIG1fdHJhbnNwYXJlbnRDb2xvcihSR0IoMCwgMCwgMCkpCissIG1fcGl4ZWxzKDApCiss
IG1faGFzQWxwaGEoZmFsc2UpCissIG1fdmFsaWRIZWlnaHQoYWJzKGgpKQorLCBtX2hiaXRtYXAo
MCkKK3sKKyAgICBnX2JpdG1hcE1hcC5hZGQodGhpcyk7CisKKyAgICB1bnNpZ25lZCBidWZmZXJT
aXplID0gbV9ibXBJbmZvLm51bVBpeGVscygpOworICAgIGlmIChfaXMxNmJpdCkKKyAgICAgICAg
YnVmZmVyU2l6ZSAvPSAyOworCisgICAgbV9waXhlbHMgPSBuZXcgdW5zaWduZWQgW2J1ZmZlclNp
emVdOworCisgICAgaWYgKGluaXRQaXhlbHMpCisgICAgICAgIHJlc2V0UGl4ZWxzKCk7Cit9CitT
aGFyZWRCaXRtYXA6On5TaGFyZWRCaXRtYXAoKQoreworICAgIGdfYml0bWFwTWFwLnJlbW92ZSh0
aGlzKTsKKyAgICBpZiAobV9oYml0bWFwKQorICAgICAgICBEZWxldGVPYmplY3QobV9oYml0bWFw
KTsKKyAgICBlbHNlCisgICAgICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworfQorCit2b2lkIFNoYXJl
ZEJpdG1hcDo6cmVzZXRQaXhlbHMoYm9vbCBibGFjaykKK3sKKyAgICBpZiAobV9waXhlbHMpIHsK
KyAgICAgICAgdW5zaWduZWQgYnVmZmVyU2l6ZSA9IG1fYm1wSW5mby5udW1QaXhlbHMoKTsKKyAg
ICAgICAgaWYgKGJsYWNrKQorICAgICAgICAgICAgbWVtc2V0KG1fcGl4ZWxzLCAwLCBidWZmZXJT
aXplICogKGlzMTZiaXQoKSA/IDIgOiA0KSk7CisgICAgICAgIGVsc2UgaWYgKGlzMTZiaXQoKSkg
eworICAgICAgICAgICAgLy8gRmlsbCBpdCB3aXRoIHdoaXRlIGNvbG9yCisjaWYgSU1BR0VfTk9f
QUxQSEFfVVNFX1JHQjU1NQorICAgICAgICAgICAgd21lbXNldCgod2NoYXJfdCopbV9waXhlbHMs
IDB4N0ZGRiwgYnVmZmVyU2l6ZSk7CisjZWxzZQorICAgICAgICAgICAgd21lbXNldCgod2NoYXJf
dCopbV9waXhlbHMsIDB4RkZGRiwgYnVmZmVyU2l6ZSk7CisjZW5kaWYKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIC8vIE1ha2UgaXQgd2hpdGUgYnV0IHRyYW5zcGFyZW50CisgICAgICAg
ICAgICB1bnNpZ25lZCogcGl4ZWwgPSAodW5zaWduZWQqKW1fcGl4ZWxzOworICAgICAgICAgICAg
Y29uc3QgdW5zaWduZWQqIGNvbnN0IGJ1ZmZlckVuZCA9IHBpeGVsICsgYnVmZmVyU2l6ZTsKKyAg
ICAgICAgICAgIHdoaWxlIChwaXhlbCA8IGJ1ZmZlckVuZCkgeworICAgICAgICAgICAgICAgICpw
aXhlbCsrID0gMHgwMEZGRkZGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30K
Kworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBjb252ZXJ0MzJUbzE2KHVuc2lnbmVkIHBp
eGVsKQoreworI2lmIElNQUdFX05PX0FMUEhBX1VTRV9SR0I1NTUKKyAgICB1bnNpZ25lZCBzaG9y
dCByID0gdW5zaWduZWQgc2hvcnQoKHBpeGVsICYgMHgwMEY4MDAwMCkgPj4gOSk7CisgICAgdW5z
aWduZWQgc2hvcnQgZyA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAmIDB4MDAwMEY4MDApID4+IDYp
OworICAgIHVuc2lnbmVkIHNob3J0IGIgPSB1bnNpZ25lZCBzaG9ydCgocGl4ZWwgJiAweDAwMDAw
MEY4KSA+PiAzKTsKKyNlbHNlIC8vIFJHQjU2NQorICAgIHVuc2lnbmVkIHNob3J0IHIgPSB1bnNp
Z25lZCBzaG9ydCgocGl4ZWwgJiAweDAwRjgwMDAwKSA+PiA4KTsKKyAgICB1bnNpZ25lZCBzaG9y
dCBnID0gdW5zaWduZWQgc2hvcnQoKHBpeGVsICYgMHgwMDAwRkMwMCkgPj4gNSk7CisgICAgdW5z
aWduZWQgc2hvcnQgYiA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAmIDB4MDAwMDAwRjgpID4+IDMp
OworI2VuZGlmCisgICAgcmV0dXJuIHIgfCBnIHwgYjsKK30KKworYm9vbCBTaGFyZWRCaXRtYXA6
OnRvMTZiaXQoKQoreworICAgIGlmIChtX2xvY2tlZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChpczE2Yml0KCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgQml0bWFwSW5m
byBuZXdCbXBJbmZvKHRydWUsIG1fYm1wSW5mby53aWR0aCgpLCBtX2JtcEluZm8uaGVpZ2h0KCkp
OworCisgICAgTWVtb3J5QWxsb2NhdGlvbkNhbkZhaWwgY2FuRmFpbDsKKyAgICBpbnQgd2lkdGgg
PSBuZXdCbXBJbmZvLndpZHRoKCk7CisgICAgaW50IHBhZGRlZFdpZHRoID0gbmV3Qm1wSW5mby5w
YWRkZWRXaWR0aCgpOworICAgIGludCBidWZmZXJTaXplID0gcGFkZGVkV2lkdGggKiBuZXdCbXBJ
bmZvLmhlaWdodCgpOworICAgIHZvaWQqIG5ld1BpeGVscyA9IG5ldyB1bnNpZ25lZCBbYnVmZmVy
U2l6ZSAvIDJdOworCisgICAgaWYgKCFuZXdQaXhlbHMpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIHVuc2lnbmVkIHNob3J0KiBwMTYgPSAodW5zaWduZWQgc2hvcnQqKW5ld1BpeGVsczsK
KyAgICBjb25zdCB1bnNpZ25lZCogcDMyID0gKGNvbnN0IHVuc2lnbmVkKiltX3BpeGVsczsKKwor
ICAgIGNvbnN0IGJvb2wgc2tpcHMgPSBwYWRkZWRXaWR0aCAhPSB3aWR0aDsKKworICAgIGNvbnN0
IHVuc2lnbmVkIHNob3J0KiBjb25zdCBwMTZlbmQgPSBwMTYgKyBidWZmZXJTaXplOworICAgIHdo
aWxlIChwMTYgPCBwMTZlbmQpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBzaG9ydCogcDE2bGlu
ZUVuZCA9IHAxNiArIHdpZHRoOyBwMTYgPCBwMTZsaW5lRW5kOyApCisgICAgICAgICAgICAqcDE2
KysgPSBjb252ZXJ0MzJUbzE2KCpwMzIrKyk7CisKKyAgICAgICAgaWYgKHNraXBzKQorICAgICAg
ICAgICAgKnAxNisrID0gMDsKKyAgICB9CisKKworICAgIGlmIChtX2hiaXRtYXApIHsKKyAgICAg
ICAgRGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7CisgICAgICAgIG1faGJpdG1hcCA9IDA7CisgICAg
fSBlbHNlCisgICAgICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworCisgICAgbV9waXhlbHMgPSBuZXdQ
aXhlbHM7CisgICAgbV9ibXBJbmZvID0gbmV3Qm1wSW5mbzsKKworICAgIHNldEhhc0FscGhhKGZh
bHNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGFyZWRCaXRtYXA6OmZyZWVNZW1v
cnkoKQoreworICAgIGlmICghbV9sb2NrZWQpIHsKKyAgICAgICAgaWYgKG1faGJpdG1hcCkgewor
ICAgICAgICAgICAgRGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7CisgICAgICAgICAgICBtX2hiaXRt
YXAgPSAwOworICAgICAgICAgICAgbV9waXhlbHMgPSAwOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0gZWxzZSBpZiAobV9waXhlbHMpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtd
IG1fcGl4ZWxzOworICAgICAgICAgICAgbV9waXhlbHMgPSAwOworICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitIQklUTUFQ
IFNoYXJlZEJpdG1hcDo6Y3JlYXRlSGFuZGxlKHZvaWQqKiBwaXhlbHMsIEJpdG1hcEluZm8qIGJt
cEluZm8sIGludCBoLCBib29sIHVzZTE2Yml0KSBjb25zdAoreworICAgIGlmICghbV9waXhlbHMp
CisgICAgICAgIHJldHVybiAwOworCisgICAgTWVtb3J5QWxsb2NhdGlvbkNhbkZhaWwgY2FuRmFp
bDsKKworICAgIGlmIChoID09IC0xKQorICAgICAgICBoID0gaGVpZ2h0KCk7CisgICAgKmJtcElu
Zm8gPSBCaXRtYXBJbmZvKHVzZTE2Yml0IHx8IGlzMTZiaXQoKSwgd2lkdGgoKSwgaCk7CisKKyAg
ICBIQklUTUFQIGhibXAgPSBNZW1vcnlNYW5hZ2VyOjpjcmVhdGVESUJTZWN0aW9uKGJtcEluZm8s
IHBpeGVscyk7CisKKyAgICBpZiAoIWhibXApCisgICAgICAgIHJldHVybiAwOworCisgICAgT3du
UHRyPEhEQz4gYm1wREMoQ3JlYXRlQ29tcGF0aWJsZURDKDApKTsKKyAgICBIR0RJT0JKIGhPbGRC
bXAgPSBTZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhibXApOworCisgICAgU3RyZXRjaERJQml0
cworICAgICAgICAoIGJtcERDLmdldCgpCisgICAgICAgICwgMAorICAgICAgICAsIDAKKyAgICAg
ICAgLCB3aWR0aCgpCisgICAgICAgICwgaAorICAgICAgICAsIDAKKyAgICAgICAgLCAwCisgICAg
ICAgICwgd2lkdGgoKQorICAgICAgICAsIGgKKyAgICAgICAgLCBtX3BpeGVscworICAgICAgICAs
ICZtX2JtcEluZm8KKyAgICAgICAgLCBESUJfUkdCX0NPTE9SUworICAgICAgICAsIFNSQ0NPUFkK
KyAgICAgICAgKTsKKworICAgIFNlbGVjdE9iamVjdChibXBEQy5nZXQoKSwgaE9sZEJtcCk7CisK
KyAgICByZXR1cm4gaGJtcDsKK30KKworYm9vbCBTaGFyZWRCaXRtYXA6OmVuc3VyZUhhbmRsZSgp
Cit7CisgICAgaWYgKG1faGJpdG1hcCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAo
IW1fcGl4ZWxzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9sb2NrZWQpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICB2b2lk
KiBwaXhlbHM7CisgICAgbV9oYml0bWFwID0gY3JlYXRlSGFuZGxlKCZwaXhlbHMsICZibXBJbmZv
LCAtMSwgIWhhc0FscGhhKCkpOworCisgICAgaWYgKCFtX2hiaXRtYXApCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworICAgIG1fcGl4ZWxzID0gcGl4ZWxz
OworICAgIG1fYm1wSW5mbyA9IGJtcEluZm87CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9p
ZCBTaGFyZWRCaXRtYXA6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRSZWN0
JiBkc3RSZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21w
b3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisgICAgY3R4
dC0+ZHJhd0JpdG1hcCh0aGlzLCBkc3RSZWN0LCBzcmNSZWN0LCBjb21wb3NpdGVPcCk7Cit9CisK
K3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3Qs
IGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQor
eworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChkc3RSZWN0
LmlzRW1wdHkoKSB8fCBzcmNSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
aWYgKGdfZHJhd0ltYWdlICYmIGdfZHJhd0ltYWdlKHRoaXMsIGhkYywgZHN0UmVjdCwgc3JjUmVj
dCwgY29tcG9zaXRlT3ApKQorICAgICAgICByZXR1cm47CisKKyAgICBIQklUTUFQIGhiaXRtYXAg
PSAwOworICAgIGJvb2wgdXNpbmdIYW5kbGUgPSBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVTb3Vy
Y2VPdmVyICYmICgKKyNpZiAhIGRlZmluZWQoTk9fQUxQSEFCTEVORCkKKyAgICAgICAgaGFzQWxw
aGEoKSB8fCAKKyNlbmRpZgorICAgICAgICB1c2VzVHJhbnNwYXJlbnRDb2xvcigpKTsKKworICAg
IGlmICh1c2luZ0hhbmRsZSkgeworICAgICAgICBpZiAoZW5zdXJlSGFuZGxlKCkpCisgICAgICAg
ICAgICBoYml0bWFwID0gbV9oYml0bWFwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHZv
aWQqIHBpeGVsczsKKyAgICAgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAgICAg
IGhiaXRtYXAgPSBjcmVhdGVIYW5kbGUoJnBpeGVscywgJmJtcEluZm8sIC0xLCB1c2VzVHJhbnNw
YXJlbnRDb2xvcigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWhiaXRtYXApIHsKKyAg
ICAgICAgLy8gRklYTUU6IGhhbmRsZSBvdGhlciBjb21wb3NpdGUgb3BlcmF0aW9uIHR5cGVzPwor
ICAgICAgICBEV09SRCByb3AgPSBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVDb3B5ID8gU1JDQ09Q
WQorICAgICAgICAgICAgOiBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVYT1IgPyBQQVRJTlZFUlQK
KyAgICAgICAgICAgIDogY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlQ2xlYXIgPyBXSElURU5FU1MK
KyAgICAgICAgICAgIDogU1JDQ09QWTsKKworICAgICAgICBTdHJldGNoRElCaXRzKGhkYywgZHN0
UmVjdC54KCksIGRzdFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCkK
KyAgICAgICAgICAgICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCks
IHNyY1JlY3QuaGVpZ2h0KCksIG1fcGl4ZWxzLCAmbV9ibXBJbmZvLCBESUJfUkdCX0NPTE9SUywg
cm9wKTsgCisgICAgfSBlbHNlIHsKKyAgICAgICAgT3duUHRyPEhEQz4gaG1lbWRjKENyZWF0ZUNv
bXBhdGlibGVEQyhoZGMpKTsKKyAgICAgICAgSEdESU9CSiBoT2xkQm1wID0gU2VsZWN0T2JqZWN0
KGhtZW1kYy5nZXQoKSwgaGJpdG1hcCk7CisKKyNpZiAhIGRlZmluZWQoTk9fQUxQSEFCTEVORCkK
KyAgICAgICAgaWYgKCF1c2VzVHJhbnNwYXJlbnRDb2xvcigpKSB7CisgICAgICAgICAgICBzdGF0
aWMgY29uc3QgQkxFTkRGVU5DVElPTiBibGVuZCA9IHsgQUNfU1JDX09WRVIsIDAsIDI1NSwgQUNf
U1JDX0FMUEhBIH07CisgICAgICAgICAgICBBbHBoYUJsZW5kKGhkYywgZHN0UmVjdC54KCksIGRz
dFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCksIGhtZW1kYy5nZXQo
KQorICAgICAgICAgICAgICAgICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0Lndp
ZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIGJsZW5kKTsgCisgICAgICAgIH0gZWxzZQorI2VuZGlm
CisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zcGFyZW50Qmx0KGhkYywgZHN0UmVjdC54KCks
IGRzdFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCksIGhtZW1kYy5n
ZXQoKQorICAgICAgICAgICAgICAgICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0
LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIHRyYW5zcGFyZW50Q29sb3IoKSk7IAorICAgICAg
ICB9CisKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgaE9sZEJtcCk7CisgICAg
ICAgIGlmIChoYml0bWFwICE9IG1faGJpdG1hcCkKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdCho
Yml0bWFwKTsKKyAgICB9Cit9CisKKworSEJJVE1BUCBTaGFyZWRCaXRtYXA6OmNsaXBCaXRtYXAo
Y29uc3QgSW50UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgdXNlQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXBJbmZv
JiBibXBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHBpeGVs
cykKK3sKKyAgICBpZiAoIWJ5dGVzKCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaW50
IG9sZFdpZHRoID0gd2lkdGgoKTsKKyAgICBpbnQgb2xkSGVpZ2h0ID0gaGVpZ2h0KCk7CisgICAg
aW50IGNvcHlXaWR0aCA9IHN0ZDo6bWluPGludD4ocmVjdC53aWR0aCgpLCBvbGRXaWR0aCAtIHJl
Y3QueCgpKTsKKyAgICBpbnQgY29weUhlaWdodCA9IHN0ZDo6bWluPGludD4ocmVjdC5oZWlnaHQo
KSwgb2xkSGVpZ2h0IC0gcmVjdC55KCkpOworICAgIGlmICghY29weVdpZHRoIHx8ICFjb3B5SGVp
Z2h0KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGJtcEluZm8gPSBCaXRtYXBJbmZvKCEo
dXNlQWxwaGEgJiYgaXMzMmJpdCgpKSwgY29weVdpZHRoLCBjb3B5SGVpZ2h0KTsKKyAgICBIQklU
TUFQIG5ld0JtcCA9IE1lbW9yeU1hbmFnZXI6OmNyZWF0ZURJQlNlY3Rpb24oJmJtcEluZm8sICZw
aXhlbHMpOworCisgICAgaWYgKG5ld0JtcCkgeworICAgICAgICBPd25QdHI8SERDPiBkY05ldyg6
OkNyZWF0ZUNvbXBhdGlibGVEQygwKSk7CisgICAgICAgIEhHRElPQkogdG1wTmV3ID0gOjpTZWxl
Y3RPYmplY3QoZGNOZXcuZ2V0KCksIG5ld0JtcCk7CisKKyAgICAgICAgU3RyZXRjaERJQml0cyhk
Y05ldy5nZXQoKSwgMCwgMCwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LCByZWN0LngoKSwgcmVjdC55
KCksIGNvcHlXaWR0aCwgY29weUhlaWdodAorICAgICAgICAgICAgLCBieXRlcygpLCAmYml0bWFw
SW5mbygpLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAgICAgICAgU2VsZWN0T2JqZWN0
KGRjTmV3LmdldCgpLCB0bXBOZXcpOworICAgIH0KKworICAgIHJldHVybiBuZXdCbXA7Cit9CisK
KworUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y2xpcEJpdG1hcChjb25z
dCBJbnRSZWN0JiByZWN0LCBib29sIHVzZUFscGhhKQoreworICAgIGludCBvbGRXaWR0aCA9IHdp
ZHRoKCk7CisgICAgaW50IG9sZEhlaWdodCA9IGhlaWdodCgpOworICAgIGludCBjb3B5V2lkdGgg
PSBzdGQ6Om1pbjxpbnQ+KHJlY3Qud2lkdGgoKSwgb2xkV2lkdGggLSByZWN0LngoKSk7CisgICAg
aW50IGNvcHlIZWlnaHQgPSBzdGQ6Om1pbjxpbnQ+KHJlY3QuaGVpZ2h0KCksIG9sZEhlaWdodCAt
IHJlY3QueSgpKTsKKyAgICBpZiAoIWNvcHlXaWR0aCB8fCAhY29weUhlaWdodCkKKyAgICAgICAg
cmV0dXJuIE5VTEw7CisKKyAgICBTaGFyZWRCaXRtYXAqIG5ld0JtcCA9IG5ldyBTaGFyZWRCaXRt
YXAoISh1c2VBbHBoYSAmJiBpczMyYml0KCkpLCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQsIGZhbHNl
KTsKKyAgICAKKyAgICBpZiAoIW5ld0JtcCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAo
IW5ld0JtcC0+Ynl0ZXMoKSkgeworICAgICAgICBkZWxldGUgbmV3Qm1wOworICAgICAgICByZXR1
cm4gMDsKKyAgICB9CisKKyAgICBEQ0hvbGRlciBkY05ldyhuZXdCbXApOworCisgICAgU3RyZXRj
aERJQml0cyhkY05ldy5nZXQoKSwgMCwgMCwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LCByZWN0Lngo
KSwgcmVjdC55KCksIGNvcHlXaWR0aCwgY29weUhlaWdodAorICAgICAgICAsIGJ5dGVzKCksICZi
aXRtYXBJbmZvKCksIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKKworICAgIHJldHVybiBhZG9w
dFJlZihuZXdCbXApOworfQorCitzdGF0aWMgdm9pZCBkcmF3UGF0dGVyblNpbXBsZShIREMgaGRj
LCBjb25zdCBSRUNUJiBkZXN0UmVjdCwgSEJJVE1BUCBoYm1wLCBjb25zdCBQT0lOVCYgcGhhc2Up
Cit7CisgICAgSEJSVVNIIGhCcnVzaCA9IENyZWF0ZVBhdHRlcm5CcnVzaChoYm1wKTsKKyAgICBp
ZiAoaEJydXNoKSB7CisgICAgICAgIFBPSU5UIG9sZE9yZzsKKyAgICAgICAgU2V0QnJ1c2hPcmdF
eChoZGMsIGRlc3RSZWN0LmxlZnQgLSBwaGFzZS54LCBkZXN0UmVjdC50b3AgLSBwaGFzZS55LCAm
b2xkT3JnKTsKKyAgICAgICAgRmlsbFJlY3QoaGRjLCAmZGVzdFJlY3QsIGhCcnVzaCk7CisgICAg
ICAgIERlbGV0ZU9iamVjdChoQnJ1c2gpOworICAgICAgICBTZXRCcnVzaE9yZ0V4KGhkYywgb2xk
T3JnLngsIG9sZE9yZy55LCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdQYXR0ZXJu
U2ltcGxlKEhEQyBoZGMsIGNvbnN0IFJFQ1QmIGRlc3RSZWN0LCBjb25zdCBTaGFyZWRCaXRtYXAq
IGJtcCwgY29uc3QgU0laRSYgYm1wU2l6ZSwgY29uc3QgUE9JTlQmIHBoYXNlKQoreworICAgIGlu
dCBkc3RZID0gZGVzdFJlY3QudG9wOworICAgIGZvciAoaW50IHNvdXJjZVkgPSBwaGFzZS55OyBk
c3RZIDwgZGVzdFJlY3QuYm90dG9tOyApIHsKKyAgICAgICAgaW50IHNvdXJjZUggPSBzdGQ6Om1p
bjxpbnQ+KGJtcFNpemUuY3kgLSBzb3VyY2VZLCBkZXN0UmVjdC5ib3R0b20gLSBkc3RZKTsKKyAg
ICAgICAgaW50IGRzdFggPSBkZXN0UmVjdC5sZWZ0OworICAgICAgICBmb3IgKGludCBzb3VyY2VY
ID0gcGhhc2UueDsgZHN0WCA8IGRlc3RSZWN0LnJpZ2h0OyApIHsKKyAgICAgICAgICAgIGludCBz
b3VyY2VXID0gc3RkOjptaW48aW50PihibXBTaXplLmN4IC0gc291cmNlWCwgZGVzdFJlY3Qucmln
aHQgLSBkc3RYKTsKKworICAgICAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFgsIGRzdFks
IHNvdXJjZVcsIHNvdXJjZUgsIHNvdXJjZVgsIHNvdXJjZVksIHNvdXJjZVcsIHNvdXJjZUgKKyAg
ICAgICAgICAgICAgICAsIGJtcC0+Ynl0ZXMoKSwgJmJtcC0+Yml0bWFwSW5mbygpLCBESUJfUkdC
X0NPTE9SUywgU1JDQ09QWSk7IAorCisgICAgICAgICAgICBkc3RYICs9IHNvdXJjZVc7CisgICAg
ICAgICAgICBzb3VyY2VYID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdFkgKz0gc291cmNl
SDsKKyAgICAgICAgc291cmNlWSA9IDA7CisgICAgfQorfQorCit2b2lkIG5vcm1hbGl6ZVBoYXNl
KExPTkcmIHBoYXNlLCBpbnQgbGltaXQpCit7CisgICAgaWYgKHBoYXNlID09IDApCisgICAgICAg
IHJldHVybjsKKyAgICBpZiAobGltaXQgPCAyKSB7CisgICAgICAgIHBoYXNlID0gMDsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobGltaXQgPT0gMikgeworICAgICAgICBwaGFzZSA9
IHBoYXNlICYgMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocGhhc2UgPCAwKSB7
CisgICAgICAgIHBoYXNlID0gLXBoYXNlOworICAgICAgICBpZiAocGhhc2UgPiBsaW1pdCkKKyAg
ICAgICAgICAgIHBoYXNlID0gKExPTkcpKCh1bnNpZ25lZClwaGFzZSAlICh1bnNpZ25lZClsaW1p
dCk7CisgICAgICAgIGlmIChwaGFzZSkKKyAgICAgICAgICAgIHBoYXNlID0gbGltaXQgLSBwaGFz
ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocGhhc2UgPCBsaW1pdCkKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgcGhhc2UgPSAoTE9ORykoKHVuc2lnbmVkKXBoYXNlICUgKHVuc2ln
bmVkKWxpbWl0KTsKKyAgICB9Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3UGF0dGVybihH
cmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3Qg
VHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNv
bnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKQor
eworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKyAgICBjdHh0LT5kcmF3Qml0
bWFwUGF0dGVybih0aGlzLCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgb3As
IGRlc3RSZWN0LCBvcmlnU291cmNlU2l6ZSk7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3
UGF0dGVybihIREMgaGRjLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBj
b25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBw
YXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2lu
dCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0
LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZ19kcmF3UGF0dGVybikgeworICAgICAgICBnX2Ry
YXdQYXR0ZXJuKHRoaXMsIGhkYywgdHJhbnNmb3JtLCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNm
b3JtLCBwaGFzZSwgb3AsIGRlc3RSZWN0LCBvcmlnU291cmNlU2l6ZSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAodGlsZVJlY3RJbi53aWR0aCgpIDw9IDAgfHwgdGlsZVJlY3RJ
bi5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBib29sIHVzZUFscGhhID0g
b3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAmJiBoYXNBbHBoYSgpICYmIGlzMzJiaXQoKTsKKwor
ICAgIGludCBibXBXaWR0aCA9IHdpZHRoKCk7CisgICAgaW50IGJtcEhlaWdodCA9IGhlaWdodCgp
OworCisgICAgRmxvYXRSZWN0IHRpbGVSZWN0KHRpbGVSZWN0SW4pOworICAgIGlmIChibXBXaWR0
aCAhPSBvcmlnU291cmNlU2l6ZS53aWR0aCgpKSB7CisgICAgICAgIGRvdWJsZSByYXRlID0gKGRv
dWJsZSlibXBXaWR0aCAvIG9yaWdTb3VyY2VTaXplLndpZHRoKCk7CisgICAgICAgIGRvdWJsZSB0
ZW1wID0gdGlsZVJlY3Qud2lkdGgoKSAqIHJhdGU7CisgICAgICAgIHRpbGVSZWN0LnNldFgodGls
ZVJlY3QueCgpICogcmF0ZSk7CisgICAgICAgIHRpbGVSZWN0LnNldFdpZHRoKHRlbXApOworICAg
ICAgICB0ZW1wID0gdGlsZVJlY3QuaGVpZ2h0KCkgKiByYXRlOworICAgICAgICB0aWxlUmVjdC5z
ZXRZKHRpbGVSZWN0LnkoKSAqIHJhdGUpOworICAgICAgICB0aWxlUmVjdC5zZXRIZWlnaHQodGVt
cCk7CisgICAgfQorCisgICAgT3duUHRyPEhCSVRNQVA+IGNsaXBwZWRCbXA7CisKKyAgICBpZiAo
dGlsZVJlY3QueCgpIHx8IHRpbGVSZWN0LnkoKSB8fCB0aWxlUmVjdC53aWR0aCgpICE9IGJtcFdp
ZHRoIHx8IHRpbGVSZWN0LmhlaWdodCgpICE9IGJtcEhlaWdodCkgeworICAgICAgICBCaXRtYXBJ
bmZvIHBhdHRlcm5CbXBJbmZvOworICAgICAgICB2b2lkKiBwYXR0ZXJuUGl4ZWxzOworICAgICAg
ICBjbGlwcGVkQm1wLnNldChjbGlwQml0bWFwKEludFJlY3QodGlsZVJlY3QpLCB1c2VBbHBoYSwg
cGF0dGVybkJtcEluZm8sIHBhdHRlcm5QaXhlbHMpKTsKKyAgICAgICAgaWYgKGNsaXBwZWRCbXAg
PT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBibXBXaWR0aCA9IHRpbGVS
ZWN0LndpZHRoKCk7CisgICAgICAgIGJtcEhlaWdodCA9IHRpbGVSZWN0LmhlaWdodCgpOworICAg
IH0KKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRmID0gdHJhbnNmb3JtOworICAgIHRmICo9
IHBhdHRlcm5UcmFuc2Zvcm07CisKKyAgICBGbG9hdFJlY3QgdHJSZWN0ID0gdGYubWFwUmVjdChk
ZXN0UmVjdCk7CisKKyAgICBSRUNUIGNsaXBCb3g7CisgICAgaW50IGNsaXBUeXBlID0gR2V0Q2xp
cEJveChoZGMsICZjbGlwQm94KTsKKyAgICBpZiAoY2xpcFR5cGUgPT0gU0lNUExFUkVHSU9OKQor
ICAgICAgICB0clJlY3QuaW50ZXJzZWN0KEZsb2F0UmVjdChjbGlwQm94LmxlZnQsIGNsaXBCb3gu
dG9wLCBjbGlwQm94LnJpZ2h0IC0gY2xpcEJveC5sZWZ0LCBjbGlwQm94LmJvdHRvbSAtIGNsaXBC
b3gudG9wKSk7CisgICAgZWxzZSBpZiAoY2xpcFR5cGUgPT0gQ09NUExFWFJFR0lPTikgeworICAg
ICAgICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDApKTsKKyAg
ICAgICAgaWYgKEdldENsaXBSZ24oaGRjLCBjbGlwUmduLmdldCgpKSA+IDApIHsKKyAgICAgICAg
ICAgIERXT1JEIHJlZ2lvbkRhdGFTaXplID0gR2V0UmVnaW9uRGF0YShjbGlwUmduLmdldCgpLCBz
aXplb2YoUkdOREFUQSksIE5VTEwpOworICAgICAgICAgICAgaWYgKHJlZ2lvbkRhdGFTaXplKSB7
CisgICAgICAgICAgICAgICAgUkdOREFUQSogcmVnaW9uRGF0YSA9IG5ldyBSR05EQVRBW3JlZ2lv
bkRhdGFTaXplXTsKKyAgICAgICAgICAgICAgICBHZXRSZWdpb25EYXRhKGNsaXBSZ24uZ2V0KCks
IHJlZ2lvbkRhdGFTaXplLCByZWdpb25EYXRhKTsKKyAgICAgICAgICAgICAgICBSRUNUKiByZWN0
ID0gKFJFQ1QqKXJlZ2lvbkRhdGEtPkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgcmVnaW9uRGF0YS0+cmRoLm5Db3VudDsgKytpLCArK3JlY3QpCisgICAg
ICAgICAgICAgICAgICAgIHRyUmVjdC5pbnRlcnNlY3QoRmxvYXRSZWN0KHJlY3QtPmxlZnQsIHJl
Y3QtPnRvcCwgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSByZWN0LT50
b3ApKTsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSByZWdpb25EYXRhOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyUmVjdC53aWR0aCgpIDw9IDAgfHwgdHJS
ZWN0LmhlaWdodCgpIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIHRyUmVjdC5pbmZsYXRl
KDEpOworICAgIEludFJlY3QgdmlzaWJsZURzdFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHRmLmlu
dmVyc2UoKS5tYXBSZWN0KHRyUmVjdCkpOworICAgIHZpc2libGVEc3RSZWN0LmludGVyc2VjdChJ
bnRSZWN0KGRlc3RSZWN0KSk7CisKKyAgICBpZiAodmlzaWJsZURzdFJlY3Qud2lkdGgoKSA8PSAw
IHx8IHZpc2libGVEc3RSZWN0LmhlaWdodCgpIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAg
IHRyUmVjdCA9IHRmLm1hcFJlY3QodmlzaWJsZURzdFJlY3QpOworICAgIFJFQ1QgZHN0UmVjdFdp
biA9CisgICAgeworICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QueCgpKSwKKyAgICAgICAgc3Rh
YmxlUm91bmQodHJSZWN0LnkoKSksCisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC5yaWdodCgp
KSwKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LmJvdHRvbSgpKSwKKyAgICB9OworICAgIGlm
IChkc3RSZWN0V2luLnJpZ2h0IDw9IGRzdFJlY3RXaW4ubGVmdCB8fCBkc3RSZWN0V2luLmJvdHRv
bSA8PSBkc3RSZWN0V2luLnRvcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgU0laRSBibXBTaXpl
ID0geyBibXBXaWR0aCwgYm1wSGVpZ2h0IH07CisKKyAgICAvLyBSZWxhdGl2ZSB0byBkZXN0aW5h
dGlvbiwgaW4gYml0bWFwIHBpeGVscworICAgIFBPSU5UIHBoYXNlV2luID0geyBzdGFibGVSb3Vu
ZCh2aXNpYmxlRHN0UmVjdC54KCkgLSBwaGFzZS54KCkpLCBzdGFibGVSb3VuZCh2aXNpYmxlRHN0
UmVjdC55KCkgLSBwaGFzZS55KCkpIH07CisgICAgbm9ybWFsaXplUGhhc2UocGhhc2VXaW4ueCwg
Ym1wU2l6ZS5jeCk7CisgICAgbm9ybWFsaXplUGhhc2UocGhhc2VXaW4ueSwgYm1wU2l6ZS5jeSk7
CisgICAgCisgICAgeworICAgICAgICBSRUNUIHNyY1JlY3RXaW4gPQorICAgICAgICB7CisgICAg
ICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIHN0YWJsZVJvdW5kKHZpc2li
bGVEc3RSZWN0LnJpZ2h0KCkpIC0gc3RhYmxlUm91bmQodmlzaWJsZURzdFJlY3QueCgpKSwKKyAg
ICAgICAgICAgIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LmJvdHRvbSgpKSAtIHN0YWJsZVJv
dW5kKHZpc2libGVEc3RSZWN0LnkoKSkKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKHNyY1JlY3RX
aW4ucmlnaHQgPD0gMCB8fCBzcmNSZWN0V2luLmJvdHRvbSA8PSAwKQorICAgICAgICAgICAgcmV0
dXJuOworCisgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbyghdXNlQWxwaGEsIHNyY1JlY3RXaW4u
cmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tKTsKKyAgICAgICAgdm9pZCogcGl4ZWxzOworICAgICAg
ICBPd25QdHI8SEJJVE1BUD4gaGJtcFRlbXAoTWVtb3J5TWFuYWdlcjo6Y3JlYXRlRElCU2VjdGlv
bigmYm1wSW5mbywgJnBpeGVscykpOworCisgICAgICAgIGlmIChoYm1wVGVtcCkgeworICAgICAg
ICAgICAgT3duUHRyPEhEQz4gaG1lbWRjKENyZWF0ZUNvbXBhdGlibGVEQyhoZGMpKTsKKyAgICAg
ICAgICAgIEhHRElPQkogb2xkQm1wID0gU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgaGJtcFRl
bXAuZ2V0KCkpOworICAgICAgICAgICAgaWYgKGNsaXBwZWRCbXApCisgICAgICAgICAgICAgICAg
ZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0V2luLCBjbGlwcGVkQm1wLmdl
dCgpLCBwaGFzZVdpbik7CisgICAgICAgICAgICBlbHNlIGlmICgob3AgIT0gQ29tcG9zaXRlU291
cmNlT3ZlciB8fCBjYW5Vc2VESUJpdHMoKSkgJiYgc3JjUmVjdFdpbi5yaWdodCA8PSBibXBTaXpl
LmN4ICogMiAmJiBzcmNSZWN0V2luLmJvdHRvbSA8PSBibXBTaXplLmN5ICogMikKKyAgICAgICAg
ICAgICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RXaW4sIHRoaXMs
IGJtcFNpemUsIHBoYXNlV2luKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGVuc3VyZUhhbmRsZSgp
KQorICAgICAgICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3JjUmVj
dFdpbiwgZ2V0SGFuZGxlKCksIHBoYXNlV2luKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAg
ICAgICAgICAgIHZvaWQqIHBpeGVsczsKKyAgICAgICAgICAgICAgICBCaXRtYXBJbmZvIGJtcElu
Zm87CisgICAgICAgICAgICAgICAgaWYgKEhCSVRNQVAgaGJtcCA9IGNyZWF0ZUhhbmRsZSgmcGl4
ZWxzLCAmYm1wSW5mbywgLTEsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICBkcmF3UGF0
dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RXaW4sIGhibXAsIHBoYXNlV2luKTsKKyAg
ICAgICAgICAgICAgICAgICAgRGVsZXRlT2JqZWN0KGhibXApOworICAgICAgICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIG9s
ZEJtcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisKKyNpZiBkZWZpbmVkKE5PX0FMUEhBQkxFTkQpCisgICAgICAgICAgICBp
ZiAodXNlQWxwaGEgfHwob3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAmJiB1c2VzVHJhbnNwYXJl
bnRDb2xvcigpKSkKKyNlbHNlCisgICAgICAgICAgICBpZiAodXNlQWxwaGEpIHsKKyAgICAgICAg
ICAgICAgICBzdGF0aWMgY29uc3QgQkxFTkRGVU5DVElPTiBibGVuZCA9IHsgQUNfU1JDX09WRVIs
IDAsIDI1NSwgQUNfU1JDX0FMUEhBIH07CisgICAgICAgICAgICAgICAgQWxwaGFCbGVuZChoZGMs
IGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RS
ZWN0V2luLmxlZnQsIGRzdFJlY3RXaW4uYm90dG9tIC0gZHN0UmVjdFdpbi50b3AKKyAgICAgICAg
ICAgICAgICAgICAgLCBobWVtZGMuZ2V0KCksIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1Jl
Y3RXaW4uYm90dG9tLCBibGVuZCk7IAorICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBDb21w
b3NpdGVTb3VyY2VPdmVyICYmIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpCisjZW5kaWYKKyAgICAg
ICAgICAgICAgICBUcmFuc3BhcmVudEJsdChoZGMsIGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdp
bi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0V2luLmxlZnQKKyAgICAgICAgICAgICAg
ICAgICAgLCBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9wLCBobWVtZGMuZ2V0KCks
IDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tLCB0cmFuc3BhcmVudENv
bG9yKCkpOyAKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIERXT1JEIGJtcE9w
ID0gb3AgPT0gQ29tcG9zaXRlQ29weSA/IFNSQ0NPUFkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICA6IG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgPyBTUkNDT1BZCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgOiBvcCA9PSBDb21wb3NpdGVYT1IgPyBQQVRJTlZFUlQKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICA6IG9wID09IENvbXBvc2l0ZUNsZWFyID8gV0hJVEVORVNTCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTUkNDT1BZOyAvLyBGSVhFTUU6IG90aGVyIHR5
cGVzPworCisgICAgICAgICAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFJlY3RXaW4ubGVm
dCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0V2luLmxlZnQKKyAg
ICAgICAgICAgICAgICAgICAgLCBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9wLCAw
LCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbQorICAgICAgICAgICAgICAg
ICAgICAsIHBpeGVscywgJmJtcEluZm8sIERJQl9SR0JfQ09MT1JTLCBibXBPcCk7IAorICAgICAg
ICAgICAgfQorICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgb2xkQm1wKTsK
KyAgICAgICAgfQorICAgIH0KK30KKworU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyIGdfZGNQcm92
aWRlcjsKK1NoYXJlZEJpdG1hcDo6RENQcm92aWRlciogU2hhcmVkQml0bWFwOjptX2RjUHJvdmlk
ZXIgPSAmZ19kY1Byb3ZpZGVyOworCitIREMgU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyOjpnZXRE
QyhTaGFyZWRCaXRtYXAqIGJtcCwgdW5zaWduZWQqIGtleTEsIHVuc2lnbmVkKiBrZXkyKQorewor
ICAgIGlmICghYm1wIHx8ICFibXAtPmVuc3VyZUhhbmRsZSgpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIEhEQyBoZGMgPSA6OkNyZWF0ZUNvbXBhdGlibGVEQygwKTsKKyAgICBpZiAoaGRjKSB7
CisgICAgICAgICprZXkxID0gKHVuc2lnbmVkKVNlbGVjdE9iamVjdChoZGMsIGJtcC0+Z2V0SGFu
ZGxlKCkpOworICAgICAgICBSRUNUIHJlY3QgPSB7IDAsIDAsIGJtcC0+d2lkdGgoKSwgYm1wLT5o
ZWlnaHQoKSB9OworICAgICAgICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVhdGVSZWN0UmduSW5k
aXJlY3QoJnJlY3QpKTsKKyAgICAgICAgU2VsZWN0Q2xpcFJnbihoZGMsIGNsaXBSZ24uZ2V0KCkp
OworICAgIH0KKworICAgIHJldHVybiBoZGM7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpEQ1By
b3ZpZGVyOjpyZWxlYXNlREMoU2hhcmVkQml0bWFwKiwgSERDIGhkYywgdW5zaWduZWQga2V5MSwg
dW5zaWduZWQga2V5MikKK3sKKyAgICBpZiAoIWhkYykKKyAgICAgICAgcmV0dXJuOworCisgICAg
U2VsZWN0T2JqZWN0KGhkYywgKEhHRElPQkopa2V5MSk7CisgICAgRGVsZXRlREMoaGRjKTsKK30K
Kwordm9pZCBTaGFyZWRCaXRtYXA6OmNsZWFyUGl4ZWxzKGNvbnN0IEludFJlY3QmIHIpCit7Cisg
ICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBibXBSZWN0
KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBibXBSZWN0LmludGVyc2VjdChyKTsKKyAg
ICBpZiAoaXMxNmJpdCgpKSB7CisgICAgICAgIGludCB3ID0gbV9ibXBJbmZvLnBhZGRlZFdpZHRo
KCk7CisgICAgICAgIHVuc2lnbmVkIHNob3J0KiBkc3QgPSAodW5zaWduZWQgc2hvcnQqKW1fcGl4
ZWxzOworICAgICAgICBkc3QgKz0gYm1wUmVjdC55KCkgKiB3ICsgYm1wUmVjdC54KCk7CisgICAg
ICAgIGludCB3b3Jkc1RvU2V0ID0gYm1wUmVjdC53aWR0aCgpOworICAgICAgICBjb25zdCB1bnNp
Z25lZCBzaG9ydCogZHN0RW5kID0gZHN0ICsgYm1wUmVjdC5oZWlnaHQoKSAqIHc7CisgICAgICAg
IHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAgICAgICAgICAgIHdtZW1zZXQoKHdjaGFyX3QqKWRz
dCwgMCwgd29yZHNUb1NldCk7CisgICAgICAgICAgICBkc3QgKz0gdzsKKyAgICAgICAgfQorICAg
IH0gZWxzZSB7CisgICAgICAgIGludCB3ID0gd2lkdGgoKTsKKyAgICAgICAgdW5zaWduZWQqIGRz
dCA9ICh1bnNpZ25lZCopbV9waXhlbHM7CisgICAgICAgIGRzdCArPSBibXBSZWN0LnkoKSAqIHcg
KyBibXBSZWN0LngoKTsKKyAgICAgICAgaW50IHdvcmRzVG9TZXQgPSBibXBSZWN0LndpZHRoKCkg
KiAyOworICAgICAgICBjb25zdCB1bnNpZ25lZCogZHN0RW5kID0gZHN0ICsgYm1wUmVjdC5oZWln
aHQoKSAqIHc7CisgICAgICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAgICAgICAgICAgIHdt
ZW1zZXQoKHdjaGFyX3QqKWRzdCwgMCwgd29yZHNUb1NldCk7CisgICAgICAgICAgICBkc3QgKz0g
dzsKKyAgICAgICAgfQorICAgIH0KK30KKworfQorCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi41ZjMyZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9TaGFyZWRCaXRtYXAuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpIHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUg
IkJpdG1hcEluZm8uaCIKKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0
Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d2luZ2RpLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworICAgIGVudW0gQ29tcG9zaXRlT3BlcmF0b3I7CisgICAgY2xhc3MgRmxvYXRQb2ludDsK
KyAgICBjbGFzcyBGbG9hdFJlY3Q7CisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OworICAgIGNs
YXNzIEludFJlY3Q7CisgICAgY2xhc3MgSW50U2l6ZTsKKyAgICBjbGFzcyBUcmFuc2Zvcm1hdGlv
bk1hdHJpeDsKKworICAgIGNsYXNzIFNoYXJlZEJpdG1hcDogcHVibGljIFJlZkNvdW50ZWQ8U2hh
cmVkQml0bWFwPiB7CisgICAgcHVibGljOgorICAgICAgICB+U2hhcmVkQml0bWFwKCk7CisgICAg
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4gY3JlYXRlSW5zdGFuY2UoYm9vbCBp
czE2Yml0LCBpbnQgdywgaW50IGgsIGJvb2wgaW5pdFBpeGVscyk7CisgICAgICAgIGNvbnN0IEJp
dG1hcEluZm8mIGJpdG1hcEluZm8oKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm87IH0KKyAgICAg
ICAgdm9pZCogYnl0ZXMoKSB7IHJldHVybiBtX3BpeGVsczsgfQorICAgICAgICBjb25zdCB2b2lk
KiBieXRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcGl4ZWxzOyB9CisgICAgICAgIHVuc2lnbmVkIHdp
ZHRoKCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLndpZHRoKCk7IH0KKyAgICAgICAgdW5zaWdu
ZWQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmhlaWdodCgpOyB9CisgICAgICAg
IHVuc2lnbmVkIHZhbGlkSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV92YWxpZEhlaWdodDsgfQor
ICAgICAgICB2b2lkIHNldFZhbGlkSGVpZ2h0KHVuc2lnbmVkIHZhbGlkSGVpZ2h0KSB7IG1fdmFs
aWRIZWlnaHQgPSB2YWxpZEhlaWdodDsgfQorICAgICAgICB2b2lkIHJlc2V0UGl4ZWxzKGJvb2wg
YmxhY2sgPSBmYWxzZSk7CisgICAgICAgIHZvaWQgY2xlYXJQaXhlbHMoY29uc3QgSW50UmVjdCYg
cik7CisgICAgICAgIGJvb2wgbG9ja2VkKCkgY29uc3QgeyByZXR1cm4gbV9sb2NrZWQ7IH0KKyAg
ICAgICAgdm9pZCBsb2NrKCkgeyBtX2xvY2tlZCA9IHRydWU7IH0KKyAgICAgICAgdm9pZCB1bmxv
Y2soKSB7IG1fbG9ja2VkID0gZmFsc2U7IH0KKyAgICAgICAgYm9vbCBmcmVlTWVtb3J5KCk7Cisg
ICAgICAgIGJvb2wgaXMxNmJpdCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mby5pczE2Yml0KCk7
IH0KKyAgICAgICAgYm9vbCBpczMyYml0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmlzMzJi
aXQoKTsgfQorICAgICAgICBib29sIHRvMTZiaXQoKTsKKyAgICAgICAgYm9vbCBoYXNBbHBoYSgp
IGNvbnN0IHsgcmV0dXJuIG1faGFzQWxwaGE7IH0KKyAgICAgICAgdm9pZCBzZXRIYXNBbHBoYShi
b29sIGFscGhhKSB7IG1faGFzQWxwaGEgPSBhbHBoYTsgfQorICAgICAgICBib29sIGVuc3VyZUhh
bmRsZSgpOworICAgICAgICBIQklUTUFQIGdldEhhbmRsZSgpIHsgcmV0dXJuIG1faGJpdG1hcDsg
fQorICAgICAgICBIQklUTUFQIGNyZWF0ZUhhbmRsZSh2b2lkKiogcGl4ZWxzLCBCaXRtYXBJbmZv
KiBibXBJbmZvLCBpbnQgaCA9IC0xLCBib29sIHVzZTE2Yml0ID0gdHJ1ZSkgY29uc3Q7CisgICAg
ICAgIGJvb2wgdXNlc1RyYW5zcGFyZW50Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX3VzZXNUcmFu
c3BhcmVudENvbG9yOyB9CisgICAgICAgIENPTE9SUkVGIHRyYW5zcGFyZW50Q29sb3IoKSBjb25z
dCB7IHJldHVybiBtX3RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICAgICAgdm9pZCBzZXRUcmFuc3Bh
cmVudENvbG9yKENPTE9SUkVGIGMpIHsgbV91c2VzVHJhbnNwYXJlbnRDb2xvciA9IHRydWU7IG1f
dHJhbnNwYXJlbnRDb2xvciA9IGM7IH0KKyAgICAgICAgYm9vbCBjYW5Vc2VESUJpdHMoKSBjb25z
dCB7IHJldHVybiAhaGFzQWxwaGEoKSAmJiAhdXNlc1RyYW5zcGFyZW50Q29sb3IoKTsgfQorCisg
ICAgICAgIEhCSVRNQVAgY2xpcEJpdG1hcChjb25zdCBJbnRSZWN0JiByZWN0LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYm9vbCB1c2VBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEJpdG1hcEluZm8mIGJtcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lk
KiYgcGl4ZWxzKTsKKyAgICAgICAgCisgICAgICAgIFBhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBj
bGlwQml0bWFwKGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgdXNlQWxwaGEpOworCisgICAgICAg
IHZvaWQgZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEludFJlY3QmIGRzdFJlY3Qs
IGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsK
KyAgICAgICAgdm9pZCBkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZs
b2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5U
cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFz
ZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0
IEludFNpemUmIG9yaWdTb3VyY2VTaXplKTsKKyAgICAgICAgdm9pZCBkcmF3KEhEQywgY29uc3Qg
SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0
b3IgY29tcG9zaXRlT3ApOworICAgICAgICB2b2lkIGRyYXdQYXR0ZXJuKEhEQywgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmLCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25z
dCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSk7CisK
KyAgICAgICAgdHlwZWRlZiB2b2lkICgqRHJhd1BhdHRlcm5GdW5jKShTaGFyZWRCaXRtYXAqIGJt
cCwgSERDLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEZsb2F0UmVjdCYgdGls
ZVJlY3RJbiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRl
T3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9y
aWdTb3VyY2VTaXplKTsKKyAgICAgICAgdHlwZWRlZiBib29sICgqRHJhd0ltYWdlRnVuYykgKFNo
YXJlZEJpdG1hcCogYm1wLCBIREMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJl
Y3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsKKworICAgICAgICBz
dGF0aWMgRHJhd1BhdHRlcm5GdW5jIHNldERyYXdQYXR0ZXJuRnVuYyhEcmF3UGF0dGVybkZ1bmMg
ZnVuYyk7CisgICAgICAgIHN0YXRpYyBEcmF3SW1hZ2VGdW5jIHNldERyYXdJbWFnZUZ1bmMoRHJh
d0ltYWdlRnVuYyBmdW5jKTsKKworICAgICAgICBjbGFzcyBEQ1Byb3ZpZGVyIHsKKyAgICAgICAg
cHVibGljOgorICAgICAgICAgICAgdmlydHVhbCBIREMgZ2V0REMoU2hhcmVkQml0bWFwKiwgdW5z
aWduZWQqIGtleTEsIHVuc2lnbmVkKiBrZXkyKTsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBy
ZWxlYXNlREMoU2hhcmVkQml0bWFwKiwgSERDIGhkYywgdW5zaWduZWQga2V5MSwgdW5zaWduZWQg
a2V5Mik7CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIERDUHJvdmlkZXIqIG1fZGNQcm92
aWRlcjsKKworICAgICAgICBIREMgZ2V0REModW5zaWduZWQqIGtleTEsIHVuc2lnbmVkKiBrZXky
KSB7IHJldHVybiBtX2RjUHJvdmlkZXItPmdldERDKHRoaXMsIGtleTEsIGtleTIpOyB9CisgICAg
ICAgIHZvaWQgcmVsZWFzZURDKEhEQyBoZGMsIHVuc2lnbmVkIGtleTEsIHVuc2lnbmVkIGtleTIp
IHsgbV9kY1Byb3ZpZGVyLT5yZWxlYXNlREModGhpcywgaGRjLCBrZXkxLCBrZXkyKTsgfQorCisg
ICAgICAgIGNsYXNzIERDSG9sZGVyIHsNCisgICAgICAgIHB1YmxpYzoNCisgICAgICAgICAgICBE
Q0hvbGRlcihTaGFyZWRCaXRtYXAqIGJtcCA9IDApIHsgX3NldChibXApOyB9DQorICAgICAgICAg
ICAgfkRDSG9sZGVyKCkgeyBfY2xlYXIoKTsgfQ0KKyAgICAgICAgICAgIHZvaWQgc2V0KFNoYXJl
ZEJpdG1hcCogYm1wID0gMCkgeyBfY2xlYXIoKTsgX3NldChibXApOyB9DQorICAgICAgICAgICAg
SERDIGdldCgpIGNvbnN0IHsgcmV0dXJuIG1faGRjOyB9DQorICAgICAgICBwcml2YXRlOg0KKyAg
ICAgICAgICAgIERDSG9sZGVyJiBvcGVyYXRvcj0oY29uc3QgRENIb2xkZXImKTsNCisgICAgICAg
ICAgICBEQ0hvbGRlcihjb25zdCBEQ0hvbGRlciYpOw0KKyAgICAgICAgICAgIHZvaWQgX2NsZWFy
KCkgeyBpZiAobV9oZGMpIHsgbV9iaXRtYXAtPnJlbGVhc2VEQyhtX2hkYywgbV9rZXkxLCBtX2tl
eTIpOyB9IH0NCisgICAgICAgICAgICB2b2lkIF9zZXQoU2hhcmVkQml0bWFwKiBibXApIHsgbV9i
aXRtYXAgPSBibXA7IG1faGRjID0gYm1wID8gYm1wLT5nZXREQygmbV9rZXkxLCAmbV9rZXkyKSA6
IDA7IH0NCisgICAgICAgICAgICBTaGFyZWRCaXRtYXAqIG1fYml0bWFwOw0KKyAgICAgICAgICAg
IEhEQyBtX2hkYzsNCisgICAgICAgICAgICB1bnNpZ25lZCBtX2tleTE7DQorICAgICAgICAgICAg
dW5zaWduZWQgbV9rZXkyOw0KKyAgICAgICAgfTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGV4
cGxpY2l0IFNoYXJlZEJpdG1hcChib29sIGlzMTZiaXQsIGludCB3LCBpbnQgaCwgYm9vbCBpbml0
UGl4ZWxzKTsKKyAgICAgICAgZXhwbGljaXQgU2hhcmVkQml0bWFwKGNvbnN0IEJpdG1hcEluZm8m
IGJtcEluZm8sIEhCSVRNQVAgaGJtcCwgdm9pZCogcGl4ZWxzKTsKKyAgICAgICAgQml0bWFwSW5m
byBtX2JtcEluZm87CisgICAgICAgIGludCBtX3JlZmVyZW5jZTsKKyAgICAgICAgSEJJVE1BUCBt
X2hiaXRtYXA7CisgICAgICAgIHZvaWQqIG1fcGl4ZWxzOworICAgICAgICBDT0xPUlJFRiBtX3Ry
YW5zcGFyZW50Q29sb3I7CisgICAgICAgIGludCBtX3ZhbGlkSGVpZ2h0OworICAgICAgICBib29s
IG1fbG9ja2VkOworICAgICAgICBib29sIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7CisgICAgICAg
IGJvb2wgbV9oYXNBbHBoYTsKKyAgICB9OworCit9Cg==
</data>
<flag name="review"
          id="17517"
          type_id="1"
          status="-"
          setter="staikos"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33262</attachid>
            <date>2009-07-22 07:34:15 -0700</date>
            <delta_ts>2009-07-23 08:27:58 -0700</delta_ts>
            <desc>fixed style errors reported by cpplint and added correct license text</desc>
            <filename>27511.patch</filename>
            <type>text/plain</type>
            <size>139339</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NzE3OTg2YS4uNTE3ZjljOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNiBAQAorMjAwOS0wNy0yMSAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y
NzUxMQorICAgICAgICBBZGQgV0lOQ0Ugc3BlY2lmaWMgcGxhdGZvcm0vZ3JhcGhpY3MgZmlsZXMg
Zm9yIHRoZSBXaW5DRSBwb3J0LgorCisgICAgICAgIFdyaXR0ZW4gYnkgWW9uZyBMaSA8eW9uZy5s
aUB0b3JjaG1vYmlsZS5jb20+LCBHZW9yZ2UgU3RhaWtvcyA8Z2VvcmdlLnN0YWlrb3NAdG9yY2ht
b2JpbGUuY29tPiwgQ3J5c3RhbCBaaGFuZyA8Y3J5c3RhbC56aGFuZ0B0b3JjaG1vYmlsZS5jb20+
CisgICAgICAgIGFuZCBMeW9uIENoZW4gPGx5b24uY2hlbkB0b3JjaG1vYmlsZS5jb20+CisKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Db2xvcldpbmNlLmNwcDogQWRkZWQuCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhZGllbnRXaW5jZS5jcHA6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyRGF0YS5oOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbmNl
LmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VEZWNv
ZGVyVXRpbGl0aWVzLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvSW1hZ2VEZWNvZGVyVXRpbGl0aWVzLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVNvdXJjZVdpbmNlLmNwcDogQWRkZWQuCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5jZS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNvZGVyLmNwcDogQWRkZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSlBFR0VuY29kZXIuaDogQWRkZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2lu
Y2UuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5
ZXJQcm94eS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01l
ZGlhUGxheWVyUHJveHkuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvUE5HRW5jb2Rlci5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BOR0VuY29kZXIuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvUGF0aFdpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvUGxhdGZvcm1QYXRoV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaDogQWRkZWQuCisKIDIwMDktMDctMjEg
IEFkYW0gUm9iZW4gIDxhcm9iZW5AYXBwbGUuY29tPgogCiAgICAgICAgIFJvbGwgb3V0IHI0NjE1
MywgcjQ2MTU0LCBhbmQgcjQ2MTU1CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL0NvbG9yV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9Db2xvcldpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjBi
OWQyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9D
b2xvcldpbmNlLmNwcApAQCAtMCwwICsxLDM4IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAw
Ny0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
ICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
ICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkNvbG9yLmgiCisKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0NvbG9yIGZvY3VzUmluZ0NvbG9yKCkKK3sKKyAgICBy
ZXR1cm4gQ29sb3IoMCwgMCwgMCk7Cit9CisKK3ZvaWQgc2V0Rm9jdXNSaW5nQ29sb3JDaGFuZ2VG
dW5jdGlvbih2b2lkICgqKSgpKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvR3JhZGllbnRXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0dyYWRpZW50V2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRl
YmQzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0dyYWRpZW50V2luY2UuY3BwCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkdyYWRpZW50LmgiCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIEdyYWRpZW50OjpwbGF0Zm9ybURlc3Ryb3koKQorewor
fQorCitzdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVN0b3BzKGNvbnN0IEdyYWRpZW50OjpDb2xv
clN0b3AmIGEsIGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AmIGIpCit7CisgICAgcmV0dXJuIGEu
c3RvcCA8IGIuc3RvcDsKK30KKworY29uc3QgVmVjdG9yPEdyYWRpZW50OjpDb2xvclN0b3A+JiBH
cmFkaWVudDo6Z2V0U3RvcHMoKSBjb25zdAoreworICAgIGlmICghbV9zdG9wc1NvcnRlZCkgewor
ICAgICAgICBpZiAobV9zdG9wcy5zaXplKCkpCisgICAgICAgICAgICBzdGQ6OnN0YWJsZV9zb3J0
KG1fc3RvcHMuYmVnaW4oKSwgbV9zdG9wcy5lbmQoKSwgY29tcGFyZVN0b3BzKTsKKyAgICAgICAg
bV9zdG9wc1NvcnRlZCA9IHRydWU7CisgICAgfQorCXJldHVybiBtX3N0b3BzOworfQorCit2b2lk
IEdyYWRpZW50OjpmaWxsKEdyYXBoaWNzQ29udGV4dCogYywgY29uc3QgRmxvYXRSZWN0JiByKQor
eworICAgIGMtPmZpbGxSZWN0KHIsIHRoaXMpOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyRGF0YS5oIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlckRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi43YzU0OTdjCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlckRhdGEuaApAQCAtMCwwICsxLDQyIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBV
VEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBJbWFnZUJ1ZmZlckRhdGFfaAorI2RlZmluZSBJbWFnZUJ1ZmZlckRh
dGFfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEludFNpemU7CisKK2NsYXNzIElt
YWdlQnVmZmVyRGF0YSB7CitwdWJsaWM6CisgICAgSW1hZ2VCdWZmZXJEYXRhKGNvbnN0IEludFNp
emUmIHNpemUpOworCisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gbV9iaXRtYXA7Cit9OworCit9
ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIEltYWdlQnVmZmVyRGF0YV9oCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2lu
Y2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbmNl
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODIxODNjCi0tLSAvZGV2
L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldp
bmNlLmNwcApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5
IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
ICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpIHdpbGwgYmUg
dXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZm
ZXIuaCIKKworI2luY2x1ZGUgIkJhc2U2NC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5o
IgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAiSW1hZ2VEYXRhLmgiCisjaW5jbHVkZSAi
SlBFR0VuY29kZXIuaCIKKyNpbmNsdWRlICJQTkdFbmNvZGVyLmgiCisjaW5jbHVkZSAiU2hhcmVk
Qml0bWFwLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlCit7CisKK2NsYXNzIEJ1ZmZlcmVkSW1hZ2U6
IHB1YmxpYyBJbWFnZQoreworcHVibGljOgorICAgIEJ1ZmZlcmVkSW1hZ2UoY29uc3QgSW1hZ2VC
dWZmZXJEYXRhKiBkYXRhKQorICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgIHsKKyAgICB9CisK
KyAgICB2aXJ0dWFsIEludFNpemUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEludFNpemUobV9kYXRh
LT5tX2JpdG1hcC0+d2lkdGgoKSwgbV9kYXRhLT5tX2JpdG1hcC0+aGVpZ2h0KCkpOyB9CisgICAg
dmlydHVhbCB2b2lkIGRlc3Ryb3lEZWNvZGVkRGF0YShib29sIGRlc3Ryb3lBbGwgPSB0cnVlKSB7
fQorICAgIHZpcnR1YWwgdW5zaWduZWQgZGVjb2RlZFNpemUoKSBjb25zdCB7IHJldHVybiAwOyB9
CisgICAgdmlydHVhbCB2b2lkIGRyYXcoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0
JiBkc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yKTsK
KyAgICB2aXJ0dWFsIHZvaWQgZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxv
YXRSZWN0JiBzcmNSZWN0LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5z
Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhh
c2UsIENvbXBvc2l0ZU9wZXJhdG9yLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KTsKKworICAg
IGNvbnN0IEltYWdlQnVmZmVyRGF0YSogbV9kYXRhOworfTsKKwordm9pZCBCdWZmZXJlZEltYWdl
OjpkcmF3KEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBj
b25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQor
eworICAgIEludFJlY3QgaW50RHN0UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoZHN0UmVjdCk7Cisg
ICAgSW50UmVjdCBpbnRTcmNSZWN0KHNyY1JlY3QpOworICAgIG1fZGF0YS0+bV9iaXRtYXAtPmRy
YXcoY3R4dCwgaW50RHN0UmVjdCwgaW50U3JjUmVjdCwgY29tcG9zaXRlT3ApOworfQorCit2b2lk
IEJ1ZmZlcmVkSW1hZ2U6OmRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3Qg
RmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVy
blRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2lu
dCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0
KQoreworICAgIG1fZGF0YS0+bV9iaXRtYXAtPmRyYXdQYXR0ZXJuKGN0eHQsIHRpbGVSZWN0SW4s
IHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNlLCBvcCwgZGVzdFJlY3QsIHNpemUoKSk7Cit9CisKK0lt
YWdlQnVmZmVyRGF0YTo6SW1hZ2VCdWZmZXJEYXRhKGNvbnN0IEludFNpemUmIHNpemUpCis6IG1f
Yml0bWFwKFNoYXJlZEJpdG1hcDo6Y3JlYXRlSW5zdGFuY2UoZmFsc2UsIHNpemUud2lkdGgoKSwg
c2l6ZS5oZWlnaHQoKSwgZmFsc2UpKQoreworICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIw
MDkvV0QtaHRtbDUtMjAwOTAyMTIvdGhlLWNhbnZhcy1lbGVtZW50Lmh0bWwjY2FudmFzcGl4ZWxh
cnJheQorICAgIC8vICJXaGVuIHRoZSBjYW52YXMgaXMgaW5pdGlhbGl6ZWQgaXQgbXVzdCBiZSBz
ZXQgdG8gZnVsbHkgdHJhbnNwYXJlbnQgYmxhY2suIgorICAgIG1fYml0bWFwLT5yZXNldFBpeGVs
cyh0cnVlKTsKKyAgICBtX2JpdG1hcC0+c2V0SGFzQWxwaGEodHJ1ZSk7Cit9CisKK0ltYWdlQnVm
ZmVyOjpJbWFnZUJ1ZmZlcihjb25zdCBJbnRTaXplJiBzaXplLCBib29sIGdyYXlTY2FsZSwgYm9v
bCYgc3VjY2VzcykKKzogbV9kYXRhKHNpemUpCissIG1fc2l6ZShzaXplKQoreworICAgIGdyYXlT
Y2FsZTsgLy8gQ3VycmVudGx5IG5vdCB1c2VkCisgICAgbV9jb250ZXh0LnNldChuZXcgR3JhcGhp
Y3NDb250ZXh0KDApKTsKKyAgICBtX2NvbnRleHQtPnNldEJpdG1hcChtX2RhdGEubV9iaXRtYXAp
OworICAgIHN1Y2Nlc3MgPSB0cnVlOworfQorCitJbWFnZUJ1ZmZlcjo6fkltYWdlQnVmZmVyKCkK
K3sKK30KKworR3JhcGhpY3NDb250ZXh0KiBJbWFnZUJ1ZmZlcjo6Y29udGV4dCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fY29udGV4dC5nZXQoKTsKK30KKworSW1hZ2UqIEltYWdlQnVmZmVyOjpp
bWFnZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2ltYWdlKQorICAgICAgICBtX2ltYWdlID0gYWRv
cHRSZWYobmV3IEJ1ZmZlcmVkSW1hZ2UoJm1fZGF0YSkpOworICAgIAorICAgIHJldHVybiBtX2lt
YWdlLmdldCgpOworfQorCitQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldElt
YWdlRGF0YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIFBhc3NSZWZQdHI8SW1h
Z2VEYXRhPiBpbWFnZURhdGEgPSBJbWFnZURhdGE6OmNyZWF0ZShyZWN0LndpZHRoKCksIHJlY3Qu
aGVpZ2h0KCkpOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjID0gKHVuc2lnbmVkIGNo
YXIqKW1fZGF0YS5tX2JpdG1hcC0+Ynl0ZXMoKTsKKyAgICBpZiAoIXNyYykKKyAgICAgICAgcmV0
dXJuIGltYWdlRGF0YTsKKworICAgIEludFJlY3Qgc291cmNlUmVjdCgwLCAwLCBtX2RhdGEubV9i
aXRtYXAtPndpZHRoKCksIG1fZGF0YS5tX2JpdG1hcC0+aGVpZ2h0KCkpOworICAgIHNvdXJjZVJl
Y3QuaW50ZXJzZWN0KHJlY3QpOworICAgIGlmIChzb3VyY2VSZWN0LmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIGltYWdlRGF0YTsKKworICAgIHVuc2lnbmVkIGNoYXIqIGRzdCA9IGltYWdlRGF0
YS0+ZGF0YSgpLT5kYXRhKCktPmRhdGEoKTsKKyAgICBtZW1zZXQoZHN0LCAwLCBpbWFnZURhdGEt
PmRhdGEoKS0+ZGF0YSgpLT5sZW5ndGgoKSk7CisgICAgc3JjICs9IChzb3VyY2VSZWN0LnkoKSAq
IG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSArIHNvdXJjZVJlY3QueCgpKSAqIDQ7CisgICAgZHN0
ICs9ICgoc291cmNlUmVjdC55KCkgLSByZWN0LnkoKSkgKiBpbWFnZURhdGEtPndpZHRoKCkgKyBz
b3VyY2VSZWN0LngoKSAtIHJlY3QueCgpKSAqIDQ7CisgICAgaW50IGJ5dGVzVG9Db3B5ID0gc291
cmNlUmVjdC53aWR0aCgpICogNDsKKyAgICBpbnQgc3JjU2tpcCA9IChtX2RhdGEubV9iaXRtYXAt
PndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICogNDsKKyAgICBpbnQgZHN0U2tpcCA9IChp
bWFnZURhdGEtPndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICogNDsKKyAgICBjb25zdCB1
bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBkc3QgKyBzb3VyY2VSZWN0LmhlaWdodCgpICogaW1hZ2VE
YXRhLT53aWR0aCgpICogNDsKKyAgICB3aGlsZSAoZHN0IDwgZHN0RW5kKSB7CisgICAgICAgIGNv
bnN0IHVuc2lnbmVkIGNoYXIqIGRzdFJvd0VuZCA9IGRzdCArIGJ5dGVzVG9Db3B5OworICAgICAg
ICB3aGlsZSAoZHN0IDwgZHN0Um93RW5kKSB7CisgICAgICAgICAgICAqZHN0KysgPSBzcmNbM107
IC8vIEEKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsgLy8gQgorICAgICAgICAgICAgKmRz
dCsrID0gKnNyYysrOyAvLyBHCisgICAgICAgICAgICAqZHN0KysgPSAqc3JjKys7IC8vIFIKKyAg
ICAgICAgICAgICsrc3JjOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBzcmNTa2lwOworICAg
ICAgICBkc3QgKz0gZHN0U2tpcDsKKyAgICB9CisKKyAgICByZXR1cm4gaW1hZ2VEYXRhOworfQor
Cit2b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEoSW1hZ2VEYXRhKiBzb3VyY2UsIGNvbnN0
IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50JiBkZXN0UG9pbnQpCit7CisgICAg
dW5zaWduZWQgY2hhciogZHN0ID0gKHVuc2lnbmVkIGNoYXIqKW1fZGF0YS5tX2JpdG1hcC0+Ynl0
ZXMoKTsKKyAgICBpZiAoIWRzdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBkZXN0
UmVjdChkZXN0UG9pbnQsIHNvdXJjZVJlY3Quc2l6ZSgpKTsKKyAgICBkZXN0UmVjdC5pbnRlcnNl
Y3QoSW50UmVjdCgwLCAwLCBtX2RhdGEubV9iaXRtYXAtPndpZHRoKCksIG1fZGF0YS5tX2JpdG1h
cC0+aGVpZ2h0KCkpKTsKKworICAgIGlmIChkZXN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYyA9IHNvdXJjZS0+ZGF0YSgpLT5k
YXRhKCktPmRhdGEoKTsKKyAgICBkc3QgKz0gKGRlc3RSZWN0LnkoKSAqIG1fZGF0YS5tX2JpdG1h
cC0+d2lkdGgoKSArIGRlc3RSZWN0LngoKSkgKiA0OworICAgIHNyYyArPSAoc291cmNlUmVjdC55
KCkgKiBzb3VyY2UtPndpZHRoKCkgKyBzb3VyY2VSZWN0LngoKSkgKiA0OworICAgIGludCBieXRl
c1RvQ29weSA9IGRlc3RSZWN0LndpZHRoKCkgKiA0OworICAgIGludCBkc3RTa2lwID0gKG1fZGF0
YS5tX2JpdG1hcC0+d2lkdGgoKSAtIGRlc3RSZWN0LndpZHRoKCkpICogNDsKKyAgICBpbnQgc3Jj
U2tpcCA9IChzb3VyY2UtPndpZHRoKCkgLSBkZXN0UmVjdC53aWR0aCgpKSAqIDQ7CisgICAgY29u
c3QgdW5zaWduZWQgY2hhciogZHN0RW5kID0gZHN0ICsgZGVzdFJlY3QuaGVpZ2h0KCkgKiBtX2Rh
dGEubV9iaXRtYXAtPndpZHRoKCkgKiA0OworICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAg
ICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZHN0Um93RW5kID0gZHN0ICsgYnl0ZXNUb0NvcHk7
CisgICAgICAgIHdoaWxlIChkc3QgPCBkc3RSb3dFbmQpIHsKKyAgICAgICAgICAgIHVuc2lnbmVk
IGNoYXIgYWxwaGEgPSAqc3JjKys7CisgICAgICAgICAgICAqZHN0KysgPSAqc3JjKys7IC8vIEIK
KyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsgLy8gRworICAgICAgICAgICAgKmRzdCsrID0g
KnNyYysrOyAvLyBSCisgICAgICAgICAgICAqZHN0KysgPSBhbHBoYTsKKyAgICAgICAgfQorICAg
ICAgICBzcmMgKz0gc3JjU2tpcDsKKyAgICAgICAgZHN0ICs9IGRzdFNraXA7CisgICAgfQorfQor
CitTdHJpbmcgSW1hZ2VCdWZmZXI6OnRvRGF0YVVSTChjb25zdCBTdHJpbmcmIG1pbWVUeXBlKSBj
b25zdAoreworICAgIGlmICghbV9kYXRhLm1fYml0bWFwLT5ieXRlcygpKQorICAgICAgICByZXR1
cm4gImRhdGE6LCI7CisKKyAgICBWZWN0b3I8Y2hhcj4gb3V0cHV0OworICAgIGNvbnN0IGNoYXIq
IGhlYWRlcjsKKyAgICBpZiAobWltZVR5cGUubG93ZXIoKSA9PSAiaW1hZ2UvcG5nIikgeworICAg
ICAgICBpZiAoIWNvbXByZXNzQml0bWFwVG9QbmcobV9kYXRhLm1fYml0bWFwLmdldCgpLCBvdXRw
dXQpKQorICAgICAgICAgICAgcmV0dXJuICJkYXRhOiwiOworICAgICAgICBoZWFkZXIgPSAiZGF0
YTppbWFnZS9wbmc7YmFzZTY0LCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFjb21wcmVz
c0JpdG1hcFRvSnBlZyhtX2RhdGEubV9iaXRtYXAuZ2V0KCksIG91dHB1dCkpCisgICAgICAgICAg
ICByZXR1cm4gImRhdGE6LCI7CisgICAgICAgIGhlYWRlciA9ICJkYXRhOmltYWdlL2pwZWc7YmFz
ZTY0LCI7CisgICAgfQorCisgICAgVmVjdG9yPGNoYXI+IGJhc2U2NDsKKyAgICBiYXNlNjRFbmNv
ZGUob3V0cHV0LCBiYXNlNjQpOworICAgIAorICAgIG91dHB1dC5jbGVhcigpOworCisgICAgVmVj
dG9yPGNoYXI+IHVybDsKKyAgICB1cmwuYXBwZW5kKGhlYWRlciwgc3RybGVuKGhlYWRlcikpOwor
ICAgIHVybC5hcHBlbmQoYmFzZTY0KTsKKworICAgIHJldHVybiBTdHJpbmcodXJsLmRhdGEoKSwg
dXJsLnNpemUoKSk7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvSW1hZ2VEZWNvZGVyVXRpbGl0aWVzLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvSW1hZ2VEZWNvZGVyVXRpbGl0aWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi4zZGYwNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZURlY29kZXJVdGlsaXRpZXMuY3BwCkBAIC0wLDAgKzEs
NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZURlY29kZXJVdGlsaXRpZXMu
aCIKKworI2luY2x1ZGUgIndpbmNlL01lbW9yeU1hbmFnZXIuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUKK3sKK2Jvb2wgQnl0ZUJ1ZmZlcjo6YXBwZW5kKGNvbnN0IGNoYXIqIGRhdGEsIHVuc2lnbmVk
IHNpemUpCit7CisgICAgYm9vbCBydG47CisgICAgY2hhciogb2xkQnVmZmVyID0gbV9kYXRhOyAK
KyAgICBpbnQgbmV3U2l6ZSA9IG1fc2l6ZSArIHNpemU7CisgICAgbV9kYXRhID0gKGNoYXIqKW1h
bGxvYyhuZXdTaXplKTsKKyAgICBpZiAobV9kYXRhKSB7CisgICAgICAgIG1lbWNweShtX2RhdGEs
IG9sZEJ1ZmZlciwgbV9zaXplKTsKKyAgICAgICAgbWVtY3B5KG1fZGF0YSArIG1fc2l6ZSwgZGF0
YSwgc2l6ZSk7CisgICAgICAgIG1fc2l6ZSA9IG5ld1NpemU7CisgICAgICAgIHJ0biA9IHRydWU7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9zaXplID0gMDsKKyAgICAgICAgcnRuID0gZmFsc2U7
CisgICAgfQorICAgIGZyZWUob2xkQnVmZmVyKTsKKyAgICByZXR1cm4gcnRuOworfQorfQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZURlY29kZXJVdGls
aXRpZXMuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VEZWNvZGVyVXRp
bGl0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyYzRkYQotLS0g
L2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VEZWNv
ZGVyVXRpbGl0aWVzLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI3ByYWdtYSBvbmNlCisKK25hbWVzcGFjZSBX
ZWJDb3JlCit7CisgICAgY2xhc3MgQnl0ZUJ1ZmZlciB7CisgICAgcHVibGljOgorICAgICAgICBC
eXRlQnVmZmVyKCkgOiBtX2RhdGEoMCksIG1fc2l6ZSgwKSB7fQorICAgICAgICB+Qnl0ZUJ1ZmZl
cigpIHsgZnJlZShtX2RhdGEpOyB9CisgICAgICAgIHZvaWQgY2xlYXIoKSB7IGZyZWUobV9kYXRh
KTsgbV9kYXRhID0gMDsgbV9zaXplID0gMDsgfQorICAgICAgICBib29sIGFwcGVuZChjb25zdCBj
aGFyKiBkYXRhLCB1bnNpZ25lZCBzaXplKTsKKyAgICAgICAgY2hhciogZGF0YSgpIGNvbnN0IHsg
cmV0dXJuIG1fZGF0YTsgfQorICAgICAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4g
bV9zaXplOyB9CisgICAgICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFtX2RhdGE7
IH0KKyAgICBwcml2YXRlOgorICAgICAgICBjaGFyKiBtX2RhdGE7CisgICAgICAgIHVuc2lnbmVk
IG1fc2l6ZTsKKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9JbWFnZUZyYW1lU2luay5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9JbWFnZUZyYW1lU2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3
ZDk4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0ltYWdlRnJhbWVTaW5rLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3aWxsIGJlIHVz
ZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAq
ICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCisgKi8KKworI2lmbmRlZiBJTUFHRV9GUkFNRV9TSU5LX0hfCisjZGVmaW5lIElNQUdF
X0ZSQU1FX1NJTktfSF8KKworI2luY2x1ZGUgIkludFJlY3QuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCituYW1lc3BhY2UgUkdCQTMyQnVmZmVyIHsNCisgICAgZW51bSBGcmFtZVN0YXR1cyB7
IEZyYW1lRW1wdHksIEZyYW1lUGFydGlhbCwgRnJhbWVDb21wbGV0ZSB9Ow0KKyAgICBlbnVtIEZy
YW1lRGlzcG9zYWxNZXRob2Qgew0KKyAgICAgICAgLy8gSWYgeW91IGNoYW5nZSB0aGUgbnVtZXJp
YyB2YWx1ZXMgb2YgdGhlc2UsIG1ha2Ugc3VyZSB5b3UgYXVkaXQgYWxsDQorICAgICAgICAvLyB1
c2VycywgYXMgc29tZSB1c2VycyBtYXkgY2FzdCByYXcgdmFsdWVzIHRvL2Zyb20gdGhlc2UgY29u
c3RhbnRzLg0KKyAgICAgICAgRGlzcG9zZU5vdFNwZWNpZmllZCA9IDAsICAgICAgIC8vIExlYXZl
IGZyYW1lIGluIGZyYW1lYnVmZmVyDQorICAgICAgICBEaXNwb3NlS2VlcCA9IDEsICAgICAgICAg
ICAgICAgLy8gTGVhdmUgZnJhbWUgaW4gZnJhbWVidWZmZXINCisgICAgICAgIERpc3Bvc2VPdmVy
d3JpdGVCZ2NvbG9yID0gMiwgICAvLyBDbGVhciBmcmFtZSB0byB0cmFuc3BhcmVudA0KKyAgICAg
ICAgRGlzcG9zZU92ZXJ3cml0ZVByZXZpb3VzID0gMywgIC8vIENsZWFyIGZyYW1lIHRvIHByZXZp
b3VzIGZyYW1lYnVmZmVyIGNvbnRlbnRzDQorICAgIH07DQorfQ0KKworY2xhc3MgSW1hZ2VGcmFt
ZVNpbmsgeworcHVibGljOgorICAgIEltYWdlRnJhbWVTaW5rKGJvb2wgY2FuRnJlZUJ1ZmZlcikK
KyAgICAgICAgOiBtXzE2Yml0KGZhbHNlKQorICAgICAgICAsIG1faW1hZ2VXaWR0aCgwKQorICAg
ICAgICAsIG1fYnVmZmVyV2lkdGgoMCkKKyAgICAgICAgLCBtX2hlaWdodCgwKQorICAgICAgICAs
IG1fZXhwZWN0ZWRIZWlnaHQoMCkKKyAgICAgICAgLCBtX3N0YXR1cyhSR0JBMzJCdWZmZXI6OkZy
YW1lRW1wdHkpCisgICAgICAgICwgbV9kaXNwb3NhbE1ldGhvZChSR0JBMzJCdWZmZXI6OkRpc3Bv
c2VOb3RTcGVjaWZpZWQpCisgICAgICAgICwgbV9kdXJhdGlvbigwKQorICAgICAgICAsIG1faGFz
QWxwaGEoZmFsc2UpCisgICAgICAgICwgbV9jYW5GcmVlQnVmZmVyKGNhbkZyZWVCdWZmZXIpCisg
ICAgICAgICwgbV9zaG91bGRGcmVlQnVmZmVyKGZhbHNlKQorICAgICAgICAsIG1fdXNlc1RyYW5z
cGFyZW50Q29sb3IoZmFsc2UpCisgICAgICAgICwgbV90cmFuc3BhcmVudENvbG9yKDApCisgICAg
ICAgICwgbV9jb21wb3NpdGVkV2l0aFByZXZpb3VzRnJhbWUoZmFsc2UpCisgICAge30gCisKKyAg
ICB+SW1hZ2VGcmFtZVNpbmsoKSB7IGZyZWVCdWZmZXIoKTsgfQorCisgICAgY29uc3Qgdm9pZCog
Ynl0ZXMoKSBjb25zdDsKKyAgICB2b2lkKiBieXRlcygpOworICAgIGJvb2wgYWxsb2NhdGVCdWZm
ZXIoKTsKKyAgICBOYXRpdmVJbWFnZVB0ciBnZXRGcmFtZSgpOworICAgIGJvb2wgaXNCdWZmZXJS
ZWFkeSgpIGNvbnN0OworICAgIHZvaWQgZnJlZUJ1ZmZlcigpOworCisgICAgYm9vbCBzaG91bGRG
cmVlQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9zaG91bGRGcmVlQnVmZmVyOyB9CisgICAgYm9v
bCBjYW5GcmVlQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9jYW5GcmVlQnVmZmVyOyB9CisgICAg
Ym9vbCBpczE2Yml0KCkgY29uc3QgeyByZXR1cm4gbV8xNmJpdDsgfQorICAgIGNvbnN0IEludFJl
Y3QmIHJlY3QoKSBjb25zdCB7IHJldHVybiBtX3JlY3Q7IH0KKyAgICB1bnNpZ25lZCBoZWlnaHQo
KSBjb25zdCB7IHJldHVybiBtX2hlaWdodDsgfQorICAgIHVuc2lnbmVkIGJ1ZmZlcldpZHRoKCkg
Y29uc3QgeyByZXR1cm4gbV9idWZmZXJXaWR0aDsgfQorICAgIHVuc2lnbmVkIGltYWdlV2lkdGgo
KSBjb25zdCB7IHJldHVybiBtX2ltYWdlV2lkdGg7IH0KKyAgICBSR0JBMzJCdWZmZXI6OkZyYW1l
U3RhdHVzIHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdHVzOyB9CisgICAgdW5zaWduZWQg
ZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtX2R1cmF0aW9uOyB9CisgICAgYm9vbCBoYXNBbHBo
YSgpIGNvbnN0IHsgcmV0dXJuIG1faGFzQWxwaGE7IH0KKyAgICB1bnNpZ25lZCB0b3RhbEJ5dGVz
KCkgY29uc3QgeyByZXR1cm4gbV9idWZmZXJXaWR0aCAqIG1fZXhwZWN0ZWRIZWlnaHQgPDwgKG1f
MTZiaXQgPyAxIDogMik7IH0KKworICAgIHZvaWQgc2V0Q2FuRnJlZUJ1ZmZlcihib29sIGNhbik7
CisgICAgYm9vbCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBpczE2Yml0KSB7
IAorICAgICAgICBtXzE2Yml0ID0gaXMxNmJpdDsgbV9pbWFnZVdpZHRoID0gd2lkdGg7IG1fZXhw
ZWN0ZWRIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHJldHVybiBhbGxvY2F0ZUJ1ZmZlcigpOwor
ICAgIH0KKyAgICB2b2lkIHNldFJlY3QoY29uc3QgSW50UmVjdCYgcikgeyBtX3JlY3QgPSByOyB9
CisgICAgdm9pZCBlbnN1cmVIZWlnaHQoaW50IHJvd0luZGV4KTsKKyAgICB2b2lkIHNldFN0YXR1
cyhSR0JBMzJCdWZmZXI6OkZyYW1lU3RhdHVzIHMpIHsgbV9zdGF0dXMgPSBzOyB9CisgICAgdm9p
ZCBzZXREdXJhdGlvbih1bnNpZ25lZCBkdXJhdGlvbikgeyBtX2R1cmF0aW9uID0gZHVyYXRpb247
IH0KKyAgICB2b2lkIHNldEhhc0FscGhhKGJvb2wgYWxwaGEpIHsgbV9oYXNBbHBoYSA9IGFscGhh
OyB9CisgICAgYm9vbCB1c2VzVHJhbnNwYXJlbnRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdXNl
c1RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICB1bnNpZ25lZCBzaG9ydCB0cmFuc3BhcmVudENvbG9y
KCkgY29uc3QgeyByZXR1cm4gbV90cmFuc3BhcmVudENvbG9yOyB9CisgICAgdm9pZCBzZXRUcmFu
c3BhcmVudENvbG9yKHVuc2lnbmVkIHNob3J0IGNvbG9yKSB7IG1fdHJhbnNwYXJlbnRDb2xvciA9
IGNvbG9yOyBtX3VzZXNUcmFuc3BhcmVudENvbG9yID0gdHJ1ZTsgfQorICAgIHZvaWQgY2xlYXJU
cmFuc3BhcmVudENvbG9yKCkgeyBtX3VzZXNUcmFuc3BhcmVudENvbG9yID0gZmFsc2U7IH0KKyAg
ICBSR0JBMzJCdWZmZXI6OkZyYW1lRGlzcG9zYWxNZXRob2QgZGlzcG9zYWxNZXRob2QoKSBjb25z
dCB7IHJldHVybiBtX2Rpc3Bvc2FsTWV0aG9kOyB9DQorICAgIHZvaWQgc2V0RGlzcG9zYWxNZXRo
b2QoUkdCQTMyQnVmZmVyOjpGcmFtZURpc3Bvc2FsTWV0aG9kIG1ldGhvZCkgeyBtX2Rpc3Bvc2Fs
TWV0aG9kID0gbWV0aG9kOyB9DQorICAgIGJvb2wgY29tcG9zaXRlZFdpdGhQcmV2aW91c0ZyYW1l
KCkgY29uc3QgeyByZXR1cm4gbV9jb21wb3NpdGVkV2l0aFByZXZpb3VzRnJhbWU7IH0NCisgICAg
dm9pZCBzZXRDb21wb3NpdGVkV2l0aFByZXZpb3VzRnJhbWUoKSB7IG1fY29tcG9zaXRlZFdpdGhQ
cmV2aW91c0ZyYW1lID0gdHJ1ZTsgfQ0KKworICAgIHN0YXRpYyB2b2lkIHNldFJHQkEodW5zaWdu
ZWQmIHBvcywgdW5zaWduZWQgciwgdW5zaWduZWQgZywgdW5zaWduZWQgYiwgdW5zaWduZWQgYSkK
KyAgICB7CisgICAgICAgIC8vIFdlIHN0b3JlIHRoaXMgZGF0YSBwcmUtbXVsdGlwbGllZC4KKyAg
ICAgICAgaWYgKGEgPT0gMCkKKyAgICAgICAgICAgIHBvcyA9IChyIDw8IDE2IHwgZyA8PCA4IHwg
Yik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGEgPCAyNTUpIHsKKyAgICAgICAg
ICAgICAgICBmbG9hdCBhbHBoYVBlcmNlbnQgPSBhIC8gMjU1LjBmOworICAgICAgICAgICAgICAg
IHIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4ociAqIGFscGhhUGVyY2VudCk7CisgICAgICAgICAg
ICAgICAgZyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihnICogYWxwaGFQZXJjZW50KTsKKyAgICAg
ICAgICAgICAgICBiID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGIgKiBhbHBoYVBlcmNlbnQpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zID0gKGEgPDwgMjQgfCByIDw8IDE2IHwgZyA8
PCA4IHwgYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzZXRSR0IxNih1
bnNpZ25lZCBzaG9ydCYgcG9zLCB1bnNpZ25lZCByLCB1bnNpZ25lZCBnLCB1bnNpZ25lZCBiKQor
ICAgIHsKKyNpZiBJTUFHRV9OT19BTFBIQV9VU0VfUkdCNTU1CisgICAgICAgIHBvcyA9IHVuc2ln
bmVkIHNob3J0KChyID4+IDMgPDwgMTApIHwgKGcgPj4gMyA8PCA1KSB8IChiID4+IDMpKTsKKyNl
bHNlCisgICAgICAgIHBvcyA9IHVuc2lnbmVkIHNob3J0KChyID4+IDMgPDwgMTEpIHwgKGcgPj4g
MiA8PCA1KSB8IChiID4+IDMpKTsKKyNlbmRpZgorICAgIH0KKworICAgIHN0YXRpYyBJbWFnZUZy
YW1lU2luayogY3JlYXRlSW5zdGFuY2UoYm9vbCBjYW5GcmVlQnVmZmVyKTsKKyAgICBzdGF0aWMg
dm9pZCBkZWxldGVJbnN0YW5jZShJbWFnZUZyYW1lU2luayopOworCitwcm90ZWN0ZWQ6CisgICAg
SW50UmVjdCBtX3JlY3Q7ICAgIC8vIFRoZSByZWN0IG9mIHRoZSBvcmlnaW5hbCBzcGVjaWZpZWQg
ZnJhbWUgd2l0aGluIHRoZSBvdmVyYWxsIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAg
Ly8gVGhpcyB3aWxsIGFsd2F5cyBqdXN0IGJlIHRoZSBlbnRpcmUgYnVmZmVyIGV4Y2VwdCBmb3Ig
R0lGIGZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9zZSBvcmlnaW5hbCByZWN0
IHdhcyBzbWFsbGVyIHRoYW4gdGhlIG92ZXJhbGwgaW1hZ2Ugc2l6ZS4KKyAgICBpbnQgbV9pbWFn
ZVdpZHRoOworICAgIGludCBtX2J1ZmZlcldpZHRoOworICAgIGludCBtX2hlaWdodDsgLy8gVGhl
IGhlaWdodCAodGhlIG51bWJlciBvZiByb3dzIHdlJ3ZlIGZ1bGx5IGRlY29kZWQpLgorICAgIGlu
dCBtX2V4cGVjdGVkSGVpZ2h0OworICAgIFJHQkEzMkJ1ZmZlcjo6RnJhbWVTdGF0dXMgbV9zdGF0
dXM7IC8vIFdoZXRoZXIgb3Igbm90IHRoaXMgZnJhbWUgaXMgY29tcGxldGVseSBmaW5pc2hlZCBk
ZWNvZGluZy4KKyAgICBSR0JBMzJCdWZmZXI6OkZyYW1lRGlzcG9zYWxNZXRob2QgbV9kaXNwb3Nh
bE1ldGhvZDsgLy8gV2hhdCB0byBkbyB3aXRoIHRoaXMgZnJhbWUncyBkYXRhIHdoZW4gaW5pdGlh
bGl6aW5nIHRoZSBuZXh0IGZyYW1lLg0KKyAgICB1bnNpZ25lZCBtX2R1cmF0aW9uOyAvLyBUaGUg
YW5pbWF0aW9uIGRlbGF5LgorICAgIHVuc2lnbmVkIHNob3J0IG1fdHJhbnNwYXJlbnRDb2xvcjsg
Ly8gcGl4ZWwgdmFsdWUKKyAgICBib29sIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7CisgICAgYm9v
bCBtX2hhc0FscGhhOyAvLyBXaGV0aGVyIG9yIG5vdCBhbnkgb2YgdGhlIHBpeGVscyBpbiB0aGUg
YnVmZmVyIGhhdmUgdHJhbnNwYXJlbmN5LgorICAgIGJvb2wgbV9jYW5GcmVlQnVmZmVyOworICAg
IGJvb2wgbV9zaG91bGRGcmVlQnVmZmVyOworICAgIGJvb2wgbV8xNmJpdDsKKyAgICBib29sIG1f
Y29tcG9zaXRlZFdpdGhQcmV2aW91c0ZyYW1lOworI2lmIFBMQVRGT1JNKFdJTkNFKQorICAgIFJl
ZlB0cjxTaGFyZWRCaXRtYXA+IG1fYm1wOworICAgIHZvaWQgZmluaXNoQml0bWFwKCk7CisjZW5k
aWYKK307CisKK30KKworI2VuZGlmIC8vIElNQUdFX0ZSQU1FX1NJTktfSF8KZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFtZVNpbmtXaW5jZS5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rV2luY2UuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNDMzOWUKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rV2lu
Y2UuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkg
VG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZUZyYW1lU2luay5oIgorCisjaW5jbHVkZSA8d3Rm
L093blB0ci5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2lmIElNQUdFX05PX0FMUEhBX1VT
RV9SR0I1NTUKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY29udmVydDE2VG9SR0IodW5zaWduZWQg
c2hvcnQgcGl4ZWwpCit7CisgICAgdW5zaWduZWQgciA9IChwaXhlbCA+PiA3KSAmIDB4Rjg7Cisg
ICAgdW5zaWduZWQgZyA9IChwaXhlbCA+PiAyKSAmIDB4Rjg7CisgICAgdW5zaWduZWQgYiA9IChw
aXhlbCA8PCAzKSAmIDB4Rjg7CisgICAgcmV0dXJuIFJHQihyLCBnLCBiKTsKK30KKyNlbHNlIC8v
IFJHQjU2NQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjb252ZXJ0MTZUb1JHQih1bnNpZ25lZCBz
aG9ydCBwaXhlbCkKK3sKKyAgICB1bnNpZ25lZCByID0gKHBpeGVsID4+IDgpICYgMHhGODsKKyAg
ICB1bnNpZ25lZCBnID0gKHBpeGVsID4+IDMpICYgMHhGQzsKKyAgICB1bnNpZ25lZCBiID0gKHBp
eGVsIDw8IDMpICYgMHhGODsKKyAgICByZXR1cm4gUkdCKHIsIGcsIGIpOworfQorI2VuZGlmCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3Qgdm9pZCogSW1hZ2VGcmFtZVNpbms6OmJ5dGVz
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9ibXAgPyBtX2JtcC0+Ynl0ZXMoKSA6IDA7Cit9CisK
K3ZvaWQqIEltYWdlRnJhbWVTaW5rOjpieXRlcygpCit7CisgICAgcmV0dXJuIG1fYm1wID8gbV9i
bXAtPmJ5dGVzKCkgOiAwOworfQorCitib29sIEltYWdlRnJhbWVTaW5rOjphbGxvY2F0ZUJ1ZmZl
cigpCit7CisgICAgZnJlZUJ1ZmZlcigpOworCisgICAgaWYgKG1faW1hZ2VXaWR0aCA8PSAwIHx8
IG1fZXhwZWN0ZWRIZWlnaHQgPD0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYg
KG1fMTZiaXQpIHsKKyAgICAgICAgbV9idWZmZXJXaWR0aCA9IG1faW1hZ2VXaWR0aCA+PiAxIDw8
IDE7CisgICAgICAgIGlmIChtX2J1ZmZlcldpZHRoICE9IG1faW1hZ2VXaWR0aCkKKyAgICAgICAg
ICAgIG1fYnVmZmVyV2lkdGggKz0gMjsKKyAgICB9IGVsc2UKKyAgICAgICAgbV9idWZmZXJXaWR0
aCA9IG1faW1hZ2VXaWR0aDsKKworICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7
CisKKyAgICBpZiAobV9ibXAgPSBTaGFyZWRCaXRtYXA6OmNyZWF0ZUluc3RhbmNlKG1fMTZiaXQs
IG1faW1hZ2VXaWR0aCwgbV9leHBlY3RlZEhlaWdodCwgdHJ1ZSkpIHsKKyAgICAgICAgbV9ibXAt
PmxvY2soKTsKKyAgICAgICAgbV9ibXAtPnNldFZhbGlkSGVpZ2h0KDApOworICAgICAgICBpZiAo
bV8xNmJpdCAmJiBtX3VzZXNUcmFuc3BhcmVudENvbG9yICYmICFtX2JtcC0+dXNlc1RyYW5zcGFy
ZW50Q29sb3IoKSkKKyAgICAgICAgICAgIG1fYm1wLT5zZXRUcmFuc3BhcmVudENvbG9yKGNvbnZl
cnQxNlRvUkdCKG1fdHJhbnNwYXJlbnRDb2xvcikpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSW1hZ2VGcmFtZVNpbms6OmlzQnVm
ZmVyUmVhZHkoKSBjb25zdCB7IHJldHVybiAhIW1fYm1wOyB9Cit2b2lkIEltYWdlRnJhbWVTaW5r
OjpmcmVlQnVmZmVyKCkKK3sgCisgICAgaWYgKG1fYm1wKSB7CisgICAgICAgIGlmICghbV9ibXAt
Pmhhc09uZVJlZigpKQorICAgICAgICAgICAgZmluaXNoQml0bWFwKCk7CisgICAgICAgIG1fYm1w
ID0gMDsKKyAgICB9Cit9CisKK05hdGl2ZUltYWdlUHRyIEltYWdlRnJhbWVTaW5rOjpnZXRGcmFt
ZSgpCit7CisgICAgaWYgKG1fc3RhdHVzID09IFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSB8fCAh
bV9ibXApCisgICAgICAgIHJldHVybiAwOworCisgICAgbV9ibXAtPnNldEhhc0FscGhhKGhhc0Fs
cGhhKCkpOworICAgIG1fc2hvdWxkRnJlZUJ1ZmZlciA9IG1fc3RhdHVzID09IFJHQkEzMkJ1ZmZl
cjo6RnJhbWVDb21wbGV0ZTsKKyAgICBpZiAobV9jYW5GcmVlQnVmZmVyICYmIG1fc2hvdWxkRnJl
ZUJ1ZmZlcikKKyAgICAgICAgZmluaXNoQml0bWFwKCk7CisKKyAgICByZXR1cm4gbV9ibXA7Cit9
CisKK3ZvaWQgSW1hZ2VGcmFtZVNpbms6OnNldENhbkZyZWVCdWZmZXIoYm9vbCBjYW4pCit7Cisg
ICAgbV9jYW5GcmVlQnVmZmVyID0gY2FuOworICAgIGlmIChtX2NhbkZyZWVCdWZmZXIgJiYgbV9z
aG91bGRGcmVlQnVmZmVyKQorICAgICAgICBmaW5pc2hCaXRtYXAoKTsKK30KKwordm9pZCBJbWFn
ZUZyYW1lU2luazo6ZmluaXNoQml0bWFwKCkKK3sKKyAgICBpZiAobV9ibXAgJiYgbV9ibXAtPmxv
Y2tlZCgpKSB7CisgICAgICAgIG1fYm1wLT51bmxvY2soKTsKKyAgICAgICAgaWYgKG1fdXNlc1Ry
YW5zcGFyZW50Q29sb3IpCisgICAgICAgICAgICBtX2JtcC0+c2V0VHJhbnNwYXJlbnRDb2xvcihj
b252ZXJ0MTZUb1JHQihtX3RyYW5zcGFyZW50Q29sb3IpKTsKKyAgICAgICAgaWYgKCFtXzE2Yml0
ICYmICghbV9oYXNBbHBoYSB8fCBtX3VzZXNUcmFuc3BhcmVudENvbG9yKSkgeworICAgICAgICAg
ICAgbV9ibXAtPnNldEhhc0FscGhhKGZhbHNlKTsKKyAgICAgICAgICAgIG1fMTZiaXQgPSBtX2Jt
cC0+dG8xNmJpdCgpOworICAgICAgICB9CisgICAgICAgIGlmIChtXzE2Yml0KQorICAgICAgICAg
ICAgc2V0SGFzQWxwaGEoZmFsc2UpOworICAgICAgICBtX2JtcC0+c2V0SGFzQWxwaGEoaGFzQWxw
aGEoKSk7CisgICAgfQorfTsKKwordm9pZCBJbWFnZUZyYW1lU2luazo6ZW5zdXJlSGVpZ2h0KGlu
dCByb3dJbmRleCkKK3sKKyAgICBpZiAocm93SW5kZXggPiBtX2hlaWdodCkgeworICAgICAgICBt
X2hlaWdodCA9IHJvd0luZGV4OworICAgICAgICBpZiAobV9ibXApCisgICAgICAgICAgICBtX2Jt
cC0+c2V0VmFsaWRIZWlnaHQobV9oZWlnaHQpOworICAgIH0KK30KKworSW1hZ2VGcmFtZVNpbmsq
IEltYWdlRnJhbWVTaW5rOjpjcmVhdGVJbnN0YW5jZShib29sIGNhbkZyZWVCdWZmZXIpCit7Cisg
ICAgcmV0dXJuIG5ldyBJbWFnZUZyYW1lU2luayhjYW5GcmVlQnVmZmVyKTsKK30KKwordm9pZCBJ
bWFnZUZyYW1lU2luazo6ZGVsZXRlSW5zdGFuY2UoSW1hZ2VGcmFtZVNpbmsqIGkpCit7CisgICAg
ZGVsZXRlIGk7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvSW1hZ2VTb3VyY2VXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL0ltYWdlU291cmNlV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLmZmNjBlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL0ltYWdlU291cmNlV2luY2UuY3BwCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwLnRva2VyQGNvbGxhYm9yYS5j
by51az4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkltYWdlU291cmNlLmgiCisKKyNp
bmNsdWRlICJHSUZJbWFnZURlY29kZXIuaCIKKyNpbmNsdWRlICJJbWFnZURlY29kZXIuaCIKKyNp
bmNsdWRlICJKUEVHSW1hZ2VEZWNvZGVyLmgiCisjaW5jbHVkZSAiUE5HSW1hZ2VEZWNvZGVyLmgi
CisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2lu
Y2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordHlwZWRlZiBIYXNoU2V0PFNoYXJlZEJpdG1hcCo+IEJpdG1hcE1hcDsK
K2V4dGVybiBCaXRtYXBNYXAgZ19iaXRtYXBNYXA7CisKK2ludCBkaXNjYXJkQml0bWFwSGFuZGxl
cygpCit7CisgICAgaW50IGRlbGV0ZWQgPSAwOworICAgIGZvciAoQml0bWFwTWFwOjppdGVyYXRv
ciBpID0gZ19iaXRtYXBNYXAuYmVnaW4oKTsgaSAhPSBnX2JpdG1hcE1hcC5lbmQoKTsgKytpKSB7
CisgICAgICAgIGlmICgoKmkpLT5mcmVlTWVtb3J5KCkpCisgICAgICAgICAgICArK2RlbGV0ZWQ7
CisgICAgfQorICAgIHJldHVybiBkZWxldGVkOworfQorCitzdGF0aWMgSW1hZ2VEZWNvZGVyKiBj
cmVhdGVEZWNvZGVyKGNvbnN0IFNoYXJlZEJ1ZmZlciogYnVmZmVyKQoreworICAgIE1lbW9yeUFs
bG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7CisKKyAgICAvLyBXZSBuZWVkIGF0IGxlYXN0IDQgYnl0
ZXMgdG8gZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgaW1hZ2Ugd2UncmUgZGVhbGluZyB3aXRoLgor
ICAgIFNoYXJlZEJ1ZmZlclNlZ21lbnQgc2VnbWVudCgqYnVmZmVyKTsKKyAgICBpbnQgbGVuZ3Ro
ID0gc2VnbWVudC5sZW5ndGgoKTsKKyAgICBpZiAobGVuZ3RoIDwgNCkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICAvLyBHSUZzIGJlZ2luIHdpdGggR0lGOCg3IG9yIDkpLgorICAgIGlmIChzdHJu
Y21wKHNlZ21lbnQuZGF0YSgpLCAiR0lGOCIsIDQpID09IDApIHsKKyAgICAgICAgR0lGSW1hZ2VE
ZWNvZGVyKiBydG4gPSBuZXcgR0lGSW1hZ2VEZWNvZGVyKCk7CisgICAgICAgIGlmIChydG4pCisg
ICAgICAgICAgICBydG4tPnNldE1heE51bVBpeGVscygxMDI0ICogMTAyNCk7CisgICAgICAgIHJl
dHVybiBydG47CisgICAgfQorCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogdUNvbnRlbnRzID0g
KGNvbnN0IHVuc2lnbmVkIGNoYXIqKXNlZ21lbnQuZGF0YSgpOworCisgICAgLy8gVGVzdCBmb3Ig
UE5HLgorICAgIGlmICh1Q29udGVudHNbMF09PTB4ODkgJiYKKyAgICAgICAgdUNvbnRlbnRzWzFd
PT0weDUwICYmCisgICAgICAgIHVDb250ZW50c1syXT09MHg0RSAmJgorICAgICAgICB1Q29udGVu
dHNbM109PTB4NDcKKyAgICApIHsKKyAgICAgICAgUE5HSW1hZ2VEZWNvZGVyKiBydG4gPSBuZXcg
UE5HSW1hZ2VEZWNvZGVyKCk7CisgICAgICAgIGlmIChydG4pCisgICAgICAgICAgICBydG4tPnNl
dE1heE51bVBpeGVscygxMDI0ICogMTAyNCk7CisgICAgICAgIHJldHVybiBydG47CisgICAgfQor
CisgICAgLy8gSlBFRworICAgIGlmICh1Q29udGVudHNbMF09PTB4RkYgJiYKKyAgICAgICAgdUNv
bnRlbnRzWzFdPT0weEQ4ICYmCisgICAgICAgIHVDb250ZW50c1syXT09MHhGRgorICAgICkgewor
ICAgICAgICBKUEVHSW1hZ2VEZWNvZGVyKiBydG4gPSBuZXcgSlBFR0ltYWdlRGVjb2RlcigpOwor
ICAgICAgICBpZiAocnRuKQorICAgICAgICAgICAgcnRuLT5zZXRNYXhOdW1QaXhlbHMoMTAyNCAq
IDEwMjQpOworICAgICAgICByZXR1cm4gcnRuOworICAgIH0KKworI2lmIDAKKyAgICAvLyBCTVAK
KyAgICBpZiAoc3RybmNtcChjb250ZW50cywgIkJNIiwgMikgPT0gMCkKKyAgICAgICAgcmV0dXJu
IG5ldyBCTVBJbWFnZURlY29kZXIoKTsKKworICAgIC8vIElDT3MgYWx3YXlzIGJlZ2luIHdpdGgg
YSAyLWJ5dGUgMCBmb2xsb3dlZCBieSBhIDItYnl0ZSAxLgorICAgIC8vIENVUnMgYmVnaW4gd2l0
aCAyLWJ5dGUgMCBmb2xsb3dlZCBieSAyLWJ5dGUgMi4KKyAgICBpZiAoIW1lbWNtcChjb250ZW50
cywgIlwwMDBcMDAwXDAwMVwwMDAiLCA0KSB8fAorICAgICAgICAhbWVtY21wKGNvbnRlbnRzLCAi
XDAwMFwwMDBcMDAyXDAwMCIsIDQpKQorICAgICAgICByZXR1cm4gbmV3IElDT0ltYWdlRGVjb2Rl
cigpOworICAgCisgICAgLy8gWEJNcyByZXF1aXJlIDggYnl0ZXMgb2YgaW5mby4KKyAgICBpZiAo
bGVuZ3RoID49IDggJiYgc3RybmNtcChjb250ZW50cywgIiNkZWZpbmUgIiwgOCkgPT0gMCkKKyAg
ICAgICAgcmV0dXJuIG5ldyBYQk1JbWFnZURlY29kZXIoKTsKKyNlbmRpZgorCisgICAgLy8gR2l2
ZSB1cC4gV2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBoZWNrIHRoaXMgaXMuCisgICAgcmV0dXJuIDA7
Cit9CisKK0ltYWdlU291cmNlOjpJbWFnZVNvdXJjZSgpCisgIDogbV9kZWNvZGVyKDApCisgICwg
bV9hbGxEYXRhUmVjZWl2ZWQoZmFsc2UpCit7Cit9CisKK0ltYWdlU291cmNlOjp+SW1hZ2VTb3Vy
Y2UoKQoreworICAgIGRlbGV0ZSBtX2RlY29kZXI7Cit9CisKK3ZvaWQgSW1hZ2VTb3VyY2U6OmNs
ZWFyKGJvb2wgZGVzdHJveUFsbCwgc2l6ZV90IGNsZWFyQmVmb3JlRnJhbWUsIFNoYXJlZEJ1ZmZl
ciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpCit7CisgICAgaWYgKGRlc3Ryb3lBbGwpIHsK
KyAgICAgICAgZGVsZXRlIG1fZGVjb2RlcjsKKyAgICAgICAgbV9kZWNvZGVyID0gMDsKKyAgICAg
ICAgaWYgKGRhdGEpCisgICAgICAgICAgc2V0RGF0YShkYXRhLCBhbGxEYXRhUmVjZWl2ZWQpOw0K
KyAgICB9IGVsc2UgaWYgKG1fZGVjb2RlcikNCisgICAgICAgIG1fZGVjb2Rlci0+Y2xlYXJGcmFt
ZUJ1ZmZlckNhY2hlKGNsZWFyQmVmb3JlRnJhbWUpOworfQorCitib29sIEltYWdlU291cmNlOjpp
bml0aWFsaXplZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuICEhbV9kZWNvZGVyOworfQorCit2b2lk
IEltYWdlU291cmNlOjpzZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVj
ZWl2ZWQpCit7CisgICAgLy8gTWFrZSB0aGUgZGVjb2RlciBieSBzbmlmZmluZyB0aGUgYnl0ZXMu
CisgICAgLy8gVGhpcyBtZXRob2Qgd2lsbCBleGFtaW5lIHRoZSBkYXRhIGFuZCBpbnN0YW50aWF0
ZSBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgZGVjb2RlciBwbHVnaW4uCisgICAgLy8g
SWYgaW5zdWZmaWNpZW50IGJ5dGVzIGFyZSBhdmFpbGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBpbWFn
ZSB0eXBlLCBubyBkZWNvZGVyIHBsdWdpbiB3aWxsIGJlCisgICAgLy8gbWFkZS4KKyAgICBtX2Fs
bERhdGFSZWNlaXZlZCA9IGFsbERhdGFSZWNlaXZlZDsKKyAgICBpZiAobV9hbGxEYXRhUmVjZWl2
ZWQgJiYgIW1fZGVjb2RlcikKKyAgICAgICAgbV9kZWNvZGVyID0gY3JlYXRlRGVjb2RlcihkYXRh
KTsKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuOworICAgIG1fZGVjb2Rlci0+
c2V0RGF0YShkYXRhLCBhbGxEYXRhUmVjZWl2ZWQpOworfQorCitib29sIEltYWdlU291cmNlOjpp
c1NpemVBdmFpbGFibGUoKQoreworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICByZXR1cm4gbV9kZWNvZGVyLT5pc1NpemVBdmFpbGFibGUoKTsKK30KKwor
SW50U2l6ZSBJbWFnZVNvdXJjZTo6c2l6ZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2RlY29kZXIp
CisgICAgICAgIHJldHVybiBJbnRTaXplKCk7CisKKyAgICByZXR1cm4gbV9kZWNvZGVyLT5zaXpl
KCk7Cit9CisKK2ludCBJbWFnZVNvdXJjZTo6cmVwZXRpdGlvbkNvdW50KCkKK3sKKyAgICBpZiAo
IW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIGNBbmltYXRpb25Ob25lOworCisgICAgcmV0dXJu
IG1fZGVjb2Rlci0+cmVwZXRpdGlvbkNvdW50KCk7Cit9CisKK3NpemVfdCBJbWFnZVNvdXJjZTo6
ZnJhbWVDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGVjb2RlciA/IG1fZGVjb2Rlci0+
ZnJhbWVDb3VudCgpIDogMDsKK30KKworTmF0aXZlSW1hZ2VQdHIgSW1hZ2VTb3VyY2U6OmNyZWF0
ZUZyYW1lQXRJbmRleChzaXplX3QgaW5kZXgpCit7CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9IG1fZGVjb2Rlci0+
ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKworICAgIGlmICghYnVmZmVyIHx8IGJ1ZmZlci0+
c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5KQorICAgICAgICByZXR1cm4gMDsK
KworICAgIHJldHVybiBidWZmZXItPmdldEZyYW1lKCk7Cit9CisKK2Jvb2wgSW1hZ2VTb3VyY2U6
OmZyYW1lSXNDb21wbGV0ZUF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIGlmICghbV9kZWNv
ZGVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1
ZmZlciA9IG1fZGVjb2Rlci0+ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKyAgICByZXR1cm4g
YnVmZmVyICYmIGJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRl
OworfQorCitmbG9hdCBJbWFnZVNvdXJjZTo6ZnJhbWVEdXJhdGlvbkF0SW5kZXgoc2l6ZV90IGlu
ZGV4KQoreworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZs
b2F0IGR1cmF0aW9uOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9IG1fZGVjb2Rlci0+
ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBkdXJhdGlvbiA9IGJ1ZmZlci0+ZHVyYXRpb24oKSAvIDEwMDAuMGY7CisK
KyAgICAvLyBNYW55IGFubm95aW5nIGFkcyBzcGVjaWZ5IGEgMCBkdXJhdGlvbiB0byBtYWtlIGFu
IGltYWdlIGZsYXNoIGFzIHF1aWNrbHkKKyAgICAvLyBhcyBwb3NzaWJsZS4gIFdlIGZvbGxvdyBX
aW5JRSdzIGJlaGF2aW9yIGFuZCB1c2UgYSBkdXJhdGlvbiBvZiAxMDAgbXMKKyAgICAvLyBmb3Ig
YW55IGZyYW1lcyB0aGF0IHNwZWNpZnkgYSBkdXJhdGlvbiBvZiA8PSA1MCBtcy4gIFNlZQorICAg
IC8vIDxodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDQxMz4gb3IgUmFk
YXIgNDA1MTM4OSBmb3IKKyAgICAvLyBtb3JlLgorICAgIHJldHVybiAoZHVyYXRpb24gPCAwLjA1
MWYpID8gMC4xMDBmIDogZHVyYXRpb247Cit9CisKK2Jvb2wgSW1hZ2VTb3VyY2U6OmZyYW1lSGFz
QWxwaGFBdEluZGV4KHNpemVfdCBpbmRleCkKK3sKKyAgICBpZiAoIW1fZGVjb2RlciB8fCAhbV9k
ZWNvZGVyLT5zdXBwb3J0c0FscGhhKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIElt
YWdlRnJhbWVTaW5rKiBidWZmZXIgPSBtX2RlY29kZXItPmZyYW1lQnVmZmVyQXRJbmRleChpbmRl
eCk7CisgICAgaWYgKCFidWZmZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVy
biBidWZmZXItPmhhc0FscGhhKCk7Cit9CisKK0ludFNpemUgSW1hZ2VTb3VyY2U6OmZyYW1lU2l6
ZUF0SW5kZXgoc2l6ZV90KSBjb25zdAoreworICAgIHJldHVybiBzaXplKCk7Cit9CisKK1N0cmlu
ZyBJbWFnZVNvdXJjZTo6ZmlsZW5hbWVFeHRlbnNpb24oKSBjb25zdAoreworICAgIGlmICghbV9k
ZWNvZGVyKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgcmV0dXJuIG1fZGVjb2Rlci0+
ZmlsZW5hbWVFeHRlbnNpb24oKTsKK30KKworfQorCisvLyB2aW06IHRzPTQgc3c9NCBldApkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVdpbmNlLmNwcCBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5jZS5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3MTliZQotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5jZS5jcHAKQEAgLTAsMCArMSwy
MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSBJ
bmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisKKyNp
bmNsdWRlICJCaXRtYXBJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2lu
Y2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNp
bmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5o
IgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworc3Rh
dGljIGlubGluZSBpbnQgc3RhYmxlUm91bmQoZG91YmxlIGQpCit7CisgICAgaWYgKGQgPiAwKQor
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkICsgMC41KTsKKworICAgIGludCBpID0g
c3RhdGljX2Nhc3Q8aW50PihkKTsKKyAgICByZXR1cm4gaSAtIGQgPiAwLjUgPyBpIC0gMSA6IGk7
Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gbG9hZHMgcmVzb3VyY2VzIGZyb20gV2ViS2l0CitQYXNz
UmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gbG9hZFJlc291cmNlSW50b0J1ZmZlcihjb25z
dCBjaGFyKiBuYW1lKTsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitib29sIEZyYW1lRGF0YTo6
Y2xlYXIoYm9vbCBjbGVhck1ldGFEYXRhKQoreworICAgIGlmIChjbGVhck1ldGFEYXRhKQ0KKyAg
ICAgICAgbV9oYXZlTWV0YWRhdGEgPSBmYWxzZTsNCisNCisgICAgaWYgKG1fZnJhbWUpIHsNCisg
ICAgICAgIG1fZnJhbWUgPSAwOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0KKworICAg
IHJldHVybiBmYWxzZTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6aW5pdFBsYXRmb3JtRGF0YSgp
Cit7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmludmFsaWRhdGVQbGF0Zm9ybURhdGEoKQorewor
fQorCitib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQKEhCSVRNQVAgYm1wKQoreworICAgIHJl
dHVybiBnZXRIQklUTUFQT2ZTaXplKGJtcCwgMCk7Cit9CisKK2Jvb2wgQml0bWFwSW1hZ2U6Omdl
dEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAsIExQU0laRSBzaXplKQoreworICAgIGlmICghYm1w
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBCSVRNQVAgYm1wSW5mbzsKKyAgICBHZXRP
YmplY3QoYm1wLCBzaXplb2YoQklUTUFQKSwgJmJtcEluZm8pOworCisgICAgQVNTRVJUKGJtcElu
Zm8uYm1CaXRzUGl4ZWwgPT0gMzIpOworICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5ibVdp
ZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OworCisgICAgT3duUHRyPEhEQz4gaGRjKENyZWF0
ZUNvbXBhdGlibGVEQyhOVUxMKSk7CisgICAgSEdESU9CSiBoT2xkQm1wID0gU2VsZWN0T2JqZWN0
KGhkYy5nZXQoKSwgYm1wKTsKKworICAgIHsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0IGdjKGhk
Yy5nZXQoKSk7CisKKyAgICAgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6
ZSgpOworICAgICAgICBpZiAoc2l6ZSkKKyAgICAgICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291
cmNlU2l6ZSgmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1I
ZWlnaHQpLCBJbnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIGRyYXcoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJ
bmZvLmJtSGVpZ2h0KSwgRmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNp
emUuaGVpZ2h0KCkpLCBDb21wb3NpdGVDb3B5KTsKKyAgICB9CisKKyAgICBTZWxlY3RPYmplY3Qo
aGRjLmdldCgpLCBoT2xkQm1wKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEJpdG1h
cEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoR3JhcGhpY3NDb250ZXh0KiBjdHh0
LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFNpemUmIHNyY1NpemUsIENvbXBv
c2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGludCBmcmFtZXMgPSBmcmFtZUNvdW50
KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAgICBSZWZQ
dHI8U2hhcmVkQml0bWFwPiBibXAgPSBmcmFtZUF0SW5kZXgoaSk7CisgICAgICAgIGlmIChibXAg
JiYgYm1wLT5oZWlnaHQoKSA9PSAoc2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgYm1wLT53aWR0
aCgpID09IChzaXplX3Qpc3JjU2l6ZS53aWR0aCgpKSB7CisgICAgICAgICAgICBzaXplX3QgY3Vy
cmVudEZyYW1lID0gbV9jdXJyZW50RnJhbWU7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9
IGk7CisgICAgICAgICAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBzcmNT
aXplLndpZHRoKCksIHNyY1NpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CisgICAgICAgICAg
ICBtX2N1cnJlbnRGcmFtZSA9IGN1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIC8vIE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0IHNpemUgd2Fz
IGZvdW5kLCBmYWxsYmFjayB0byBkcmF3aW5nIHRoZSBjdXJyZW50IGZyYW1lCisgICAgSW50U2l6
ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOworICAgIGRyYXcoY3R4dCwgZHN0UmVj
dCwgRmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkp
LCBjb21wb3NpdGVPcCk7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXcoR3JhcGhpY3NDb250
ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3Jj
UmVjdEluLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fc291
cmNlLmluaXRpYWxpemVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBSZWZQdHI8U2hh
cmVkQml0bWFwPiBibXAgPSBmcmFtZUF0SW5kZXgobV9jdXJyZW50RnJhbWUpOworICAgIGlmICht
YXlGaWxsV2l0aFNvbGlkQ29sb3IoKSkKKyAgICAgICAgZmlsbFdpdGhTb2xpZENvbG9yKGN0eHQs
IGRzdFJlY3QsIHNvbGlkQ29sb3IoKSwgY29tcG9zaXRlT3ApOworICAgIGVsc2UgeworICAgICAg
ICBJbnRSZWN0IGludFNyY1JlY3Qoc3JjUmVjdEluKTsKKworICAgICAgICBpZiAoYm1wLT53aWR0
aCgpICE9IG1fc291cmNlLnNpemUoKS53aWR0aCgpKSB7CisgICAgICAgICAgICBkb3VibGUgcmF0
ZSA9IChkb3VibGUpYm1wLT53aWR0aCgpIC8gbV9zb3VyY2Uuc2l6ZSgpLndpZHRoKCk7CisgICAg
ICAgICAgICBpbnQgdGVtcCA9IHN0YWJsZVJvdW5kKHNyY1JlY3RJbi5yaWdodCgpICogcmF0ZSk7
CisgICAgICAgICAgICBpbnRTcmNSZWN0LnNldFgoc3RhYmxlUm91bmQoc3JjUmVjdEluLngoKSAq
IHJhdGUpKTsKKyAgICAgICAgICAgIGludFNyY1JlY3Quc2V0V2lkdGgodGVtcCAtIGludFNyY1Jl
Y3QueCgpKTsKKyAgICAgICAgICAgIHRlbXAgPSBzdGFibGVSb3VuZChzcmNSZWN0SW4uYm90dG9t
KCkgKiByYXRlKTsKKyAgICAgICAgICAgIGludFNyY1JlY3Quc2V0WShzdGFibGVSb3VuZChzcmNS
ZWN0SW4ueSgpICogcmF0ZSkpOworICAgICAgICAgICAgaW50U3JjUmVjdC5zZXRIZWlnaHQodGVt
cCAtIGludFNyY1JlY3QueSgpKTsKKyAgICAgICAgfQorICAgICAgICBibXAtPmRyYXcoY3R4dCwg
ZW5jbG9zaW5nSW50UmVjdChkc3RSZWN0KSwgaW50U3JjUmVjdCwgY29tcG9zaXRlT3ApOworICAg
IH0KKworICAgIHN0YXJ0QW5pbWF0aW9uKCk7Cit9CisKK1Bhc3NSZWZQdHI8SW1hZ2U+IEltYWdl
Ojpsb2FkUGxhdGZvcm1SZXNvdXJjZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIFJlZlB0cjxT
aGFyZWRCdWZmZXI+IGJ1ZmZlciA9IGxvYWRSZXNvdXJjZUludG9CdWZmZXIobmFtZSk7CisgICAg
UmVmUHRyPEJpdG1hcEltYWdlPiBpbWcgPSBCaXRtYXBJbWFnZTo6Y3JlYXRlKCk7CisgICAgaW1n
LT5zZXREYXRhKGJ1ZmZlci5yZWxlYXNlKCksIHRydWUpOworICAgIHJldHVybiBpbWc7Cit9CisK
K3ZvaWQgSW1hZ2U6OmRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxv
YXRSZWN0JiB0aWxlUmVjdCwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFu
c2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwg
Q29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QpCit7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhd1BhdHRlcm4oR3Jh
cGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25z
dCBGbG9hdFJlY3QmIGRlc3RSZWN0KQoreworICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCA9
IG5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAgaWYgKGJtcCkKKyAgICAgICAgYm1w
LT5kcmF3UGF0dGVybihjdHh0LCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwg
b3AsIGRlc3RSZWN0LCBtX3NvdXJjZS5zaXplKCkpOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpj
aGVja0ZvclNvbGlkQ29sb3IoKQoreworICAgIGlmIChtX2NoZWNrZWRGb3JTb2xpZENvbG9yKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZnJhbWVDb3VudCgpICE9IDEpIHsKKyAgICAgICAg
bV9pc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgbV9jaGVja2VkRm9yU29saWRDb2xvciA9
IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSZWZQdHI8U2hhcmVkQml0bWFw
PiBibXAgPSBmcmFtZUF0SW5kZXgoMCk7CisgICAgaWYgKCFibXAgfHwgYm1wLT52YWxpZEhlaWdo
dCgpID09IDApIHsKKyAgICAgICAgbV9pc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIGlmIChibXAtPndpZHRoKCkgPT0gMSAmJiBibXAtPnZhbGlkSGVp
Z2h0KCkgPT0gMSkgeworICAgICAgICBtX2lzU29saWRDb2xvciA9IHRydWU7CisKKyAgICAgICAg
aWYgKGJtcC0+aXMxNmJpdCgpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBjID0gKCh1
bnNpZ25lZCBzaG9ydCAqKWJtcC0+Ynl0ZXMoKSlbMF07CisjaWYgSU1BR0VfTk9fQUxQSEFfVVNF
X1JHQjU1NQorICAgICAgICAgICAgaW50IHIgPSAoYyA+PiA3KSAmIDB4Rjg7CisgICAgICAgICAg
ICBpbnQgZyA9IChjID4+IDIpICYgMHhGODsKKyAgICAgICAgICAgIGludCBiID0gKGMgPDwgMykg
JiAweEY4OworI2Vsc2UKKyAgICAgICAgICAgIGludCByID0gKGMgPj4gOCkgJiAweEY4OworICAg
ICAgICAgICAgaW50IGcgPSAoYyA+PiAzKSAmIDB4RkM7CisgICAgICAgICAgICBpbnQgYiA9IChj
IDw8IDMpICYgMHhGODsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGJtcC0+dXNlc1RyYW5zcGFy
ZW50Q29sb3IoKSAmJiBibXAtPnRyYW5zcGFyZW50Q29sb3IoKSA9PSBSR0IociwgZywgYikpCisg
ICAgICAgICAgICAgICAgbV9zb2xpZENvbG9yID0gQ29sb3IociwgZywgYiwgMCk7CisgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9zb2xpZENvbG9yID0gQ29sb3IociwgZywgYik7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjID0gKCh1bnNpZ25lZCAq
KWJtcC0+Ynl0ZXMoKSlbMF07CisgICAgICAgICAgICBtX3NvbGlkQ29sb3IgPSBDb2xvcihjKTsK
KyAgICAgICAgfQorCisgICAgICAgIGlmIChibXAtPnZhbGlkSGVpZ2h0KCkgPT0gYm1wLT5oZWln
aHQoKSkKKyAgICAgICAgICAgIG1fY2hlY2tlZEZvclNvbGlkQ29sb3IgPSB0cnVlOworICAgIH0g
ZWxzZSB7CisgICAgICAgIG1faXNTb2xpZENvbG9yID0gZmFsc2U7CisgICAgICAgIG1fY2hlY2tl
ZEZvclNvbGlkQ29sb3IgPSB0cnVlOworICAgIH0KK30KKworCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNv
ZGVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSlBFR0VuY29kZXIuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NDYzNTkKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNvZGVyLmNwcApA
QCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUs
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3aWxsIGJlIHVzZWZ1bCwKKyAqICBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkpQRUdFbmNvZGVyLmgiCisKKyNpbmNs
dWRlICJTaGFyZWRCaXRtYXAuaCIKKworI2RlZmluZSBYTURfSAorI2RlZmluZSBWVEtfSlBFR19Y
TURfSAorI3VuZGVmIEZBUgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJqcGVnbGliLmgiCit9
CisKK25hbWVzcGFjZSBXZWJDb3JlCit7CisKK3N0cnVjdCBqcGVnX2Rlc3RfbWdyDQorew0KKwlz
dHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgcHViOw0KKyAgICBWZWN0b3I8Y2hhcj4gYnVmZmVy
Ow0KKyAgICBWZWN0b3I8Y2hhcj4qIGR1bXA7DQorfTsNCisNCitzdHJ1Y3QganBlZ19jb21wcmVz
c19lcnJvcl9tZ3IKK3sKKyAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgcHViOyAKKyAgICBqbXBf
YnVmIHNldGptcF9idWZmZXI7Cit9OworDQordm9pZCBqcGVnX2luaXRfZGVzdGluYXRpb24oal9j
b21wcmVzc19wdHIgY29tcHJlc3NEYXRhKQ0KK3sNCisJanBlZ19kZXN0X21nciogZGVzdCA9IChq
cGVnX2Rlc3RfbWdyKiljb21wcmVzc0RhdGEtPmRlc3Q7DQorICAgIGRlc3QtPmJ1ZmZlci5yZXNp
emUoNDA5Nik7DQorICAgIGRlc3QtPnB1Yi5uZXh0X291dHB1dF9ieXRlICA9IChKT0NURVQqKWRl
c3QtPmJ1ZmZlci5kYXRhKCk7DQorCWRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlcgk9IGRlc3QtPmJ1
ZmZlci5zaXplKCk7DQorfQ0KKw0KK2Jvb2xlYW4ganBlZ19lbXB0eV9vdXRwdXRfYnVmZmVyKGpf
Y29tcHJlc3NfcHRyIGNvbXByZXNzRGF0YSkNCit7DQorCWpwZWdfZGVzdF9tZ3IqIGRlc3QgPSAo
anBlZ19kZXN0X21nciopY29tcHJlc3NEYXRhLT5kZXN0Ow0KKyAgICBkZXN0LT5kdW1wLT5hcHBl
bmQoZGVzdC0+YnVmZmVyLmRhdGEoKSwgZGVzdC0+YnVmZmVyLnNpemUoKSAtIGRlc3QtPnB1Yi5m
cmVlX2luX2J1ZmZlcik7DQorICAgIGRlc3QtPnB1Yi5uZXh0X291dHB1dF9ieXRlICA9IChKT0NU
RVQqKWRlc3QtPmJ1ZmZlci5kYXRhKCk7DQorCWRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlcgk9IGRl
c3QtPmJ1ZmZlci5zaXplKCk7DQorCXJldHVybiBUUlVFOw0KK30NCisNCit2b2lkIGpwZWdfdGVy
bV9kZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjb21wcmVzc0RhdGEpDQorew0KKwlqcGVnX2Rl
c3RfbWdyKiBkZXN0ID0gKGpwZWdfZGVzdF9tZ3IqKWNvbXByZXNzRGF0YS0+ZGVzdDsNCisgICAg
ZGVzdC0+ZHVtcC0+YXBwZW5kKGRlc3QtPmJ1ZmZlci5kYXRhKCksIGRlc3QtPmJ1ZmZlci5zaXpl
KCkgLSBkZXN0LT5wdWIuZnJlZV9pbl9idWZmZXIpOw0KK30NCisNCit2b2lkIGpwZWdfZXJyb3Jf
ZXhpdChqX2NvbW1vbl9wdHIgY29tcHJlc3NEYXRhKQoreworICAgIGpwZWdfY29tcHJlc3NfZXJy
b3JfbWdyICplcnIgPSAoanBlZ19jb21wcmVzc19lcnJvcl9tZ3IqKWNvbXByZXNzRGF0YS0+ZXJy
OworICAgIGxvbmdqbXAoZXJyLT5zZXRqbXBfYnVmZmVyLCAtMSk7Cit9CisNCitib29sIGNvbXBy
ZXNzQml0bWFwVG9KcGVnKFNoYXJlZEJpdG1hcCogYm1wLCBWZWN0b3I8Y2hhcj4mIGpwZWdEYXRh
KQoreworICAgIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjb21wcmVzc0RhdGE9IHswfTsN
CisgICAganBlZ19jb21wcmVzc19lcnJvcl9tZ3IgZXJyOw0KKyAgICBjb21wcmVzc0RhdGEuZXJy
ID0ganBlZ19zdGRfZXJyb3IoKGpwZWdfZXJyb3JfbWdyKikmZXJyKTsNCisgICAgZXJyLnB1Yi5l
cnJvcl9leGl0ID0ganBlZ19lcnJvcl9leGl0OworDQorICAgIGpwZWdfY3JlYXRlX2NvbXByZXNz
KCZjb21wcmVzc0RhdGEpOw0KKw0KKyAgICBqcGVnX2Rlc3RfbWdyKiBkZXN0ID0gKGpwZWdfZGVz
dF9tZ3IqKWZhc3RDYWxsb2Moc2l6ZW9mKGpwZWdfZGVzdF9tZ3IpLCAxKTsNCisgICAgZGVzdC0+
ZHVtcCA9ICZqcGVnRGF0YTsNCisgICAgY29tcHJlc3NEYXRhLmRlc3QgPSAoc3RydWN0IGpwZWdf
ZGVzdGluYXRpb25fbWdyKilkZXN0Ow0KKwlkZXN0LT5wdWIuaW5pdF9kZXN0aW5hdGlvbiA9IGpw
ZWdfaW5pdF9kZXN0aW5hdGlvbjsNCisJZGVzdC0+cHViLmVtcHR5X291dHB1dF9idWZmZXIgPSBq
cGVnX2VtcHR5X291dHB1dF9idWZmZXI7DQorCWRlc3QtPnB1Yi50ZXJtX2Rlc3RpbmF0aW9uID0g
anBlZ190ZXJtX2Rlc3RpbmF0aW9uOw0KKw0KKyAgICBjb21wcmVzc0RhdGEuaW1hZ2Vfd2lkdGgg
PSBibXAtPndpZHRoKCk7DQorICAgIGNvbXByZXNzRGF0YS5pbWFnZV9oZWlnaHQgPSBibXAtPmhl
aWdodCgpOw0KKyAgICBjb21wcmVzc0RhdGEuaW5wdXRfY29tcG9uZW50cyA9IDM7DQorICAgIGNv
bXByZXNzRGF0YS5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7DQorICAgIGpwZWdfc2V0X2RlZmF1
bHRzKCZjb21wcmVzc0RhdGEpOw0KKyAgICBqcGVnX3NldF9xdWFsaXR5KCZjb21wcmVzc0RhdGEs
IDY1LCBGQUxTRSk7DQorCisgICAgVmVjdG9yPEpTQU1QTEUsIDIwNDg+IHJvd0J1ZmZlcjsNCisg
ICAgaWYgKHNldGptcChlcnIuc2V0am1wX2J1ZmZlcikpIHsKKyAgICAgICAganBlZ19kZXN0cm95
X2NvbXByZXNzKCZjb21wcmVzc0RhdGEpOw0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
Kw0KKyAgICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjb21wcmVzc0RhdGEsIFRSVUUpOw0KKw0KKyAg
ICByb3dCdWZmZXIucmVzaXplKGNvbXByZXNzRGF0YS5pbWFnZV93aWR0aCAqIDMpOw0KKyAgICBp
ZiAoYm1wLT5pczE2Yml0KCkpIHsNCisgICAgICAgIGludCBwYWRkZWRXaWR0aCA9IGJtcC0+Yml0
bWFwSW5mbygpLnBhZGRlZFdpZHRoKCk7DQorICAgICAgICBpbnQgc2tpcCA9IHBhZGRlZFdpZHRo
IC0gY29tcHJlc3NEYXRhLmltYWdlX3dpZHRoOw0KKyAgICAgICAgY29uc3QgdW5zaWduZWQgc2hv
cnQqIHBpeGVsID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgc2hvcnQqPihibXAtPmJ5dGVz
KCkpOw0KKyAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIHBpeGVsRW5kID0gcGl4ZWwgKyBw
YWRkZWRXaWR0aCAqIGNvbXByZXNzRGF0YS5pbWFnZV9oZWlnaHQ7DQorICAgICAgICBmb3IgKDsg
cGl4ZWwgPCBwaXhlbEVuZDsgcGl4ZWwgKz0gc2tpcCkgew0KKyAgICAgICAgICAgIEpTQU1QTEUq
IGRzdCA9IHJvd0J1ZmZlci5kYXRhKCk7DQorICAgICAgICAgICAgZm9yIChjb25zdCB1bnNpZ25l
ZCBzaG9ydCogcm93RW5kID0gcGl4ZWwgKyBjb21wcmVzc0RhdGEuaW1hZ2Vfd2lkdGg7IHBpeGVs
IDwgcm93RW5kOykgew0KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZSA9ICpw
aXhlbCsrOw0KKyNpZiBJTUFHRV9OT19BTFBIQV9VU0VfUkdCNTU1CisgICAgICAgICAgICAgICAg
KmRzdCsrID0gSlNBTVBMRSgodmFsdWUgPj4gNykgJiAweEY4KTsKKyAgICAgICAgICAgICAgICAq
ZHN0KysgPSBKU0FNUExFKCh2YWx1ZSA+PiAyKSAmIDB4RjgpOworICAgICAgICAgICAgICAgICpk
c3QrKyA9IEpTQU1QTEUoKHZhbHVlIDw8IDMpICYgMHhGOCk7CisjZWxzZQorICAgICAgICAgICAg
ICAgICpkc3QrKyA9IEpTQU1QTEUoKHZhbHVlID4+IDgpICYgMHhGOCk7CisgICAgICAgICAgICAg
ICAgKmRzdCsrID0gSlNBTVBMRSgodmFsdWUgPj4gMykgJiAweEZDKTsKKyAgICAgICAgICAgICAg
ICAqZHN0KysgPSBKU0FNUExFKCh2YWx1ZSA8PCAzKSAmIDB4RjgpOw0KKyNlbmRpZg0KKyAgICAg
ICAgICAgIH0NCisgICAgICAgICAgICBkc3QgPSByb3dCdWZmZXIuZGF0YSgpOw0KKyAgICAgICAg
ICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjb21wcmVzc0RhdGEsICZkc3QsIDEpOw0KKyAgICAg
ICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgY29uc3QgdW5zaWduZWQqIHBpeGVsID0gc3Rh
dGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQqPihibXAtPmJ5dGVzKCkpOw0KKyAgICAgICAgY29uc3Qg
dW5zaWduZWQqIHBpeGVsRW5kID0gcGl4ZWwgKyBjb21wcmVzc0RhdGEuaW1hZ2Vfd2lkdGggKiBj
b21wcmVzc0RhdGEuaW1hZ2VfaGVpZ2h0Ow0KKyAgICAgICAgZm9yICg7IHBpeGVsIDwgcGl4ZWxF
bmQ7ICkgew0KKyAgICAgICAgICAgIEpTQU1QTEUqIGRzdCA9IHJvd0J1ZmZlci5kYXRhKCk7DQor
ICAgICAgICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCogcm93RW5kID0gcGl4ZWwgKyBjb21wcmVz
c0RhdGEuaW1hZ2Vfd2lkdGg7IHBpeGVsIDwgcm93RW5kOykgew0KKyAgICAgICAgICAgICAgICB1
bnNpZ25lZCB2YWx1ZSA9ICpwaXhlbCsrOw0KKyAgICAgICAgICAgICAgICAqZHN0KysgPSBKU0FN
UExFKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBKU0FN
UExFKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IEpTQU1Q
TEUoKHZhbHVlKSAmIDB4RkYpOworICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRzdCA9IHJv
d0J1ZmZlci5kYXRhKCk7DQorICAgICAgICAgICAganBlZ193cml0ZV9zY2FubGluZXMoJmNvbXBy
ZXNzRGF0YSwgJmRzdCwgMSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAganBlZ19maW5p
c2hfY29tcHJlc3MoJmNvbXByZXNzRGF0YSk7DQorICAgIGpwZWdfZGVzdHJveV9jb21wcmVzcygm
Y29tcHJlc3NEYXRhKTsNCisgICAgcmV0dXJuIHRydWU7DQorfQorCit9ClwgTm8gbmV3bGluZSBh
dCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9KUEVHRW5jb2Rlci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9KUEVHRW5j
b2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyM2Y3M2UKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNvZGVy
LmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2Jp
bGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3aWxsIGJlIHVzZWZ1bCwKKyAq
ICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisg
Ki8KKworI2lmbmRlZiBKUEVHX0VOQ09ERVJfSAorI2RlZmluZSBKUEVHX0VOQ09ERVJfSAorCitu
YW1lc3BhY2UgV2ViQ29yZQoreworICAgIGJvb2wgY29tcHJlc3NCaXRtYXBUb0pwZWcoU2hhcmVk
Qml0bWFwKiBibXAsIFZlY3RvcjxjaGFyPiYganBlZ0RhdGEpOworfQorCisjZW5kaWYgLy8gSlBF
R19FTkNPREVSX0gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2Uv
TWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvTWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi43NGU5MTg3Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9NZWRpYVBsYXllclByaXZhdGVXaW5jZS5oCkBAIC0wLDAgKzEsMTI5IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIE1lZGlhUGxheWVyUHJpdmF0ZVdpbmNl
X2gKKyNkZWZpbmUgTWVkaWFQbGF5ZXJQcml2YXRlV2luY2VfaAorCisjaWYgRU5BQkxFKFZJREVP
KQorCisjaW5jbHVkZSAiTWVkaWFQbGF5ZXJQcml2YXRlLmgiCisjaW5jbHVkZSAiVGltZXIuaCIK
KyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3Mg
R3JhcGhpY3NDb250ZXh0OworY2xhc3MgSW50U2l6ZTsKK2NsYXNzIEludFJlY3Q7CitjbGFzcyBT
dHJpbmc7CisKK2NsYXNzIE1lZGlhUGxheWVyUHJpdmF0ZSA6IHB1YmxpYyBNZWRpYVBsYXllclBy
aXZhdGVJbnRlcmZhY2UgeworcHVibGljOgorICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTWVkaWFF
bmdpbmUoTWVkaWFFbmdpbmVSZWdpc3RyYXIpOworCisgICAgfk1lZGlhUGxheWVyUHJpdmF0ZSgp
OworICAgIAorICAgIEludFNpemUgbmF0dXJhbFNpemUoKSBjb25zdDsKKyAgICBib29sIGhhc1Zp
ZGVvKCkgY29uc3Q7CisgICAgCisgICAgdm9pZCBsb2FkKGNvbnN0IFN0cmluZyYgdXJsKTsKKyAg
ICB2b2lkIGNhbmNlbExvYWQoKTsKKyAgICAKKyAgICB2b2lkIHBsYXkoKTsKKyAgICB2b2lkIHBh
dXNlKCk7ICAgIAorICAgIAorICAgIGJvb2wgcGF1c2VkKCkgY29uc3Q7CisgICAgYm9vbCBzZWVr
aW5nKCkgY29uc3Q7CisgICAgCisgICAgZmxvYXQgZHVyYXRpb24oKSBjb25zdDsKKyAgICBmbG9h
dCBjdXJyZW50VGltZSgpIGNvbnN0OworICAgIHZvaWQgc2VlayhmbG9hdCB0aW1lKTsKKyAgICB2
b2lkIHNldEVuZFRpbWUoZmxvYXQpOworICAgIAorICAgIHZvaWQgc2V0UmF0ZShmbG9hdCk7Cisg
ICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQpOworICAgIAorICAgIGludCBkYXRhUmF0ZSgpIGNvbnN0
OworICAgIAorICAgIE1lZGlhUGxheWVyOjpOZXR3b3JrU3RhdGUgbmV0d29ya1N0YXRlKCkgY29u
c3QgeyByZXR1cm4gbV9uZXR3b3JrU3RhdGU7IH0KKyAgICBNZWRpYVBsYXllcjo6UmVhZHlTdGF0
ZSByZWFkeVN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9yZWFkeVN0YXRlOyB9CisgICAgCisgICAg
ZmxvYXQgbWF4VGltZUJ1ZmZlcmVkKCkgY29uc3Q7CisgICAgZmxvYXQgbWF4VGltZVNlZWthYmxl
KCkgY29uc3Q7CisgICAgdW5zaWduZWQgYnl0ZXNMb2FkZWQoKSBjb25zdDsKKyAgICBib29sIHRv
dGFsQnl0ZXNLbm93bigpIGNvbnN0OworICAgIHVuc2lnbmVkIHRvdGFsQnl0ZXMoKSBjb25zdDsK
KyAgICAKKyAgICB2b2lkIHNldFZpc2libGUoYm9vbCk7CisgICAgdm9pZCBzZXRTaXplKGNvbnN0
IEludFNpemUmKTsKKyAgICAKKyAgICB2b2lkIGxvYWRTdGF0ZUNoYW5nZWQoKTsKKyAgICB2b2lk
IGRpZEVuZCgpOworICAgIAorICAgIHZvaWQgcGFpbnQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3Qg
SW50UmVjdCYpOworICAgIAorCitwcml2YXRlOgorICAgIE1lZGlhUGxheWVyUHJpdmF0ZShNZWRp
YVBsYXllciopOworCisgICAgdm9pZCB1cGRhdGVTdGF0ZXMoKTsKKyAgICB2b2lkIGRvU2Vlaygp
OworICAgIHZvaWQgY2FuY2VsU2VlaygpOworICAgIHZvaWQgc2Vla1RpbWVyRmlyZWQoVGltZXI8
TWVkaWFQbGF5ZXJQcml2YXRlPiopOworICAgIGZsb2F0IG1heFRpbWVMb2FkZWQoKSBjb25zdDsK
KyAgICB2b2lkIHNhd1Vuc3VwcG9ydGVkVHJhY2tzKCk7CisjaWYgRU5BQkxFKFBMVUdJTl9QUk9Y
WV9GT1JfVklERU8pCisgICAgdm9pZCBzZXRNZWRpYVBsYXllclByb3h5KFdlYk1lZGlhUGxheWVy
UHJveHkqKTsKKyAgICB2b2lkIHNldFBvc3Rlcihjb25zdCBTdHJpbmcmIHVybCk7CisgICAgdm9p
ZCBkZWxpdmVyTm90aWZpY2F0aW9uKE1lZGlhUGxheWVyUHJveHlOb3RpZmljYXRpb25UeXBlKTsK
KyNlbmRpZgorCisgICAgLy8gZW5naW5lIHN1cHBvcnQKKyAgICBzdGF0aWMgTWVkaWFQbGF5ZXJQ
cml2YXRlSW50ZXJmYWNlKiBjcmVhdGUoTWVkaWFQbGF5ZXIqKTsKKyAgICBzdGF0aWMgdm9pZCBn
ZXRTdXBwb3J0ZWRUeXBlcyhIYXNoU2V0PFN0cmluZz4mIHR5cGVzKTsKKyAgICBzdGF0aWMgTWVk
aWFQbGF5ZXI6OlN1cHBvcnRzVHlwZSBzdXBwb3J0c1R5cGUoY29uc3QgU3RyaW5nJiB0eXBlLCBj
b25zdCBTdHJpbmcmIGNvZGVjcyk7CisgICAgc3RhdGljIGJvb2wgaXNBdmFpbGFibGUoKTsKKwor
ICAgIE1lZGlhUGxheWVyKiBtX3BsYXllcjsKKyAgICBmbG9hdCBtX3NlZWtUbzsKKyAgICBmbG9h
dCBtX2VuZFRpbWU7CisgICAgVGltZXI8TWVkaWFQbGF5ZXJQcml2YXRlPiBtX3NlZWtUaW1lcjsK
KyAgICBNZWRpYVBsYXllcjo6TmV0d29ya1N0YXRlIG1fbmV0d29ya1N0YXRlOworICAgIE1lZGlh
UGxheWVyOjpSZWFkeVN0YXRlIG1fcmVhZHlTdGF0ZTsKKyAgICB1bnNpZ25lZCBtX2VuYWJsZWRU
cmFja0NvdW50OworICAgIHVuc2lnbmVkIG1fdG90YWxUcmFja0NvdW50OworICAgIGJvb2wgbV9o
YXNVbnN1cHBvcnRlZFRyYWNrczsKKyAgICBib29sIG1fc3RhcnRlZFBsYXlpbmc7CisgICAgYm9v
bCBtX2lzU3RyZWFtaW5nOworI2lmIEVOQUJMRShQTFVHSU5fUFJPWFlfRk9SX1ZJREVPKQorICAg
IFdlYk1lZGlhUGxheWVyUHJveHkqIG1fcHJveHk7CisjZW5kaWYKK307CisKK30KKworI2VuZGlm
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVk
aWFQbGF5ZXJQcm94eS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlh
UGxheWVyUHJveHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MzQ4
YWIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01l
ZGlhUGxheWVyUHJveHkuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpIHdp
bGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUo
VklERU8pCisjaW5jbHVkZSAiTWVkaWFQbGF5ZXIuaCIKKworI2luY2x1ZGUgImNfY2xhc3MuaCIK
KyNpbmNsdWRlICJjX2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY19ydW50aW1lLmgiCisjaW5jbHVk
ZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJIVE1MVmlkZW9FbGVtZW50LmgiCisjaW5j
bHVkZSAiSFRNTFBsdWdJbkVsZW1lbnQuaCIKKyNpbmNsdWRlICJKU0RPTUJpbmRpbmcuaCIKKyNp
bmNsdWRlICJKU1BsdWdpbkVsZW1lbnRGdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXll
clByb3h5LmgiCisjaW5jbHVkZSAiTm9kZS5oIgorI2luY2x1ZGUgIm5wcnVudGltZV9pbXBsLmgi
CisjaW5jbHVkZSAiUGx1Z2luVmlldy5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisj
aW5jbHVkZSAiUmVuZGVyUGFydE9iamVjdC5oIgorI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgor
I2luY2x1ZGUgInJ1bnRpbWUuaCIKKyNpbmNsdWRlICJXaWRnZXQuaCIKKyNpbmNsdWRlIDxydW50
aW1lL0lkZW50aWZpZXIuaD4KKworCit1c2luZyBuYW1lc3BhY2UgSlNDOworbmFtZXNwYWNlIFdl
YkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgQmluZGluZ3M7Cit1c2luZyBuYW1lc3BhY2UgSFRN
TE5hbWVzOworCitXZWJNZWRpYVBsYXllclByb3h5OjpXZWJNZWRpYVBsYXllclByb3h5KE1lZGlh
UGxheWVyKiBwbGF5ZXIpCis6IG1fbWVkaWFQbGF5ZXIocGxheWVyKQorLCBtX2luaXQoZmFsc2Up
CissIG1faGFzU2VudFJlc3BvbnNlVG9QbHVnaW4oZmFsc2UpCit7CisgICAgaWYoIW1faW5pdCkK
KyAgICAgICAgaW5pdEVuZ2luZSgpOworfQorCitXZWJNZWRpYVBsYXllclByb3h5Ojp+V2ViTWVk
aWFQbGF5ZXJQcm94eSgpCit7CisgICAgbV9pbnN0YW5jZS5yZWxlYXNlKCk7Cit9CitTY3JpcHRJ
bnN0YW5jZSBXZWJNZWRpYVBsYXllclByb3h5OjpwbHVnaW5JbnN0YW5jZSgpCit7CisgICAgaWYo
IW1faW5zdGFuY2UpeworICAgICAgICBSZW5kZXJPYmplY3QqIHIgPSBlbGVtZW50KCktPnJlbmRl
cmVyKCk7CisgICAgICAgIGlmICghciB8fCAhci0+aXNXaWRnZXQoKSkKKyAgICAgICAgICAgIHJl
dHVybiAwOworCisgICAgICAgIEZyYW1lKiBmcmFtZSA9IGVsZW1lbnQoKS0+ZG9jdW1lbnQoKS0+
ZnJhbWUoKTsKKworICAgICAgICBSZW5kZXJXaWRnZXQqIHJlbmRlcldpZGdldCA9IHN0YXRpY19j
YXN0PFJlbmRlcldpZGdldCo+KGVsZW1lbnQoKS0+cmVuZGVyZXIoKSk7CisgICAgICAgIGlmIChy
ZW5kZXJXaWRnZXQgJiYgcmVuZGVyV2lkZ2V0LT53aWRnZXQoKSkKKyAgICAgICAgICAgIG1faW5z
dGFuY2UgPSBmcmFtZS0+c2NyaXB0KCktPmNyZWF0ZVNjcmlwdEluc3RhbmNlRm9yV2lkZ2V0KHJl
bmRlcldpZGdldC0+d2lkZ2V0KCkpOworICAgIH0KKworICAgIHJldHVybiBtX2luc3RhbmNlOwor
fQordm9pZCBXZWJNZWRpYVBsYXllclByb3h5Ojpsb2FkKGNvbnN0IFN0cmluZyYgdXJsKQorewor
ICAgIGlmKCFtX2luaXQpCisgICAgICAgIGluaXRFbmdpbmUoKTsKKyAgICBpZihtX2luaXQpCisg
ICAgICAgIGludm9rZU1ldGhvZCgicGxheSIpOworfQordm9pZCBXZWJNZWRpYVBsYXllclByb3h5
Ojppbml0RW5naW5lKCkKK3sKKyAgICBIVE1MTWVkaWFFbGVtZW50KiBlbGVtZW50ID0gc3RhdGlj
X2Nhc3Q8SFRNTE1lZGlhRWxlbWVudCo+KG1fbWVkaWFQbGF5ZXItPm1lZGlhUGxheWVyQ2xpZW50
KCkpOworICAgIFZlY3RvcjxTdHJpbmc+IHBhcmFtTmFtZXM7CisgICAgVmVjdG9yPFN0cmluZz4g
cGFyYW1WYWx1ZXM7ICAKKyAgICBTdHJpbmcgc2VydmljZVR5cGU7CisgICAgU3RyaW5nIHVybCA9
IGVsZW1lbnQtPmluaXRpYWxVUkwoKTsKKworICAgIGlmKHVybC5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybjsKKworICAgIEZyYW1lKiBmcmFtZSA9IGVsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1l
KCk7CisgICAgCisgICAgLy8gYWRkIGFsbCBhdHRyaWJ1dGVzIHNldCBvbiB0aGUgZW1iZWQgb2Jq
ZWN0CisgICAgTmFtZWROb2RlTWFwKiBhID0gZWxlbWVudC0+YXR0cmlidXRlcygpOworICAgIGlm
IChhKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhLT5sZW5ndGgoKTsgKytp
KSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUqIGl0ID0gYS0+YXR0cmlidXRlSXRlbShpKTsKKyAg
ICAgICAgICAgIHBhcmFtTmFtZXMuYXBwZW5kKGl0LT5uYW1lKCkubG9jYWxOYW1lKCkuc3RyaW5n
KCkpOworICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYXBwZW5kKGl0LT52YWx1ZSgpLnN0cmluZygp
KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZXJ2aWNlVHlwZSA9ICJhcHBsaWNhdGlvbi94LW1w
bGF5ZXIyIjsKKyAgICBmcmFtZS0+bG9hZGVyKCktPnJlcXVlc3RPYmplY3Qoc3RhdGljX2Nhc3Q8
UmVuZGVyUGFydE9iamVjdCo+KGVsZW1lbnQtPnJlbmRlcmVyKCkpLCB1cmwsIG51bGxBdG9tLCBz
ZXJ2aWNlVHlwZSwgcGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMpOworICAgIG1faW5pdCA9IHRydWU7
CisgICAgcGFyYW1OYW1lcy5jbGVhcigpOworICAgIHBhcmFtVmFsdWVzLmNsZWFyKCk7CisKK30K
KworSFRNTE1lZGlhRWxlbWVudCogV2ViTWVkaWFQbGF5ZXJQcm94eTo6ZWxlbWVudCgpCit7Cisg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1lbnQqPihtX21lZGlhUGxheWVyLT5t
ZWRpYVBsYXllckNsaWVudCgpKTsKKworfQorCit2b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6Omlu
dm9rZU1ldGhvZChjb25zdCBTdHJpbmcmIG1ldGhvZE5hbWUpCit7CisgICAgRnJhbWUqIGZyYW1l
ID0gZWxlbWVudCgpLT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAgIFJvb3RPYmplY3QgKnJvb3Qg
PSBmcmFtZS0+c2NyaXB0KCktPmJpbmRpbmdSb290T2JqZWN0KCk7CisgICAgaWYgKCFyb290KQor
ICAgICAgICByZXR1cm4gOworICAgIEV4ZWNTdGF0ZSAqZXhlYyA9IHJvb3QtPmdsb2JhbE9iamVj
dCgpLT5nbG9iYWxFeGVjKCk7CisgICAgSW5zdGFuY2UqIGluc3RhbmNlID0gcGx1Z2luSW5zdGFu
Y2UoKS5nZXQoKTsKKyAgICBpZighaW5zdGFuY2UpCisgICAgICAgIHJldHVybjsKKworICAgIGlu
c3RhbmNlLT5iZWdpbigpOworICAgIENsYXNzICphQ2xhc3MgPSBpbnN0YW5jZS0+Z2V0Q2xhc3Mo
KTsKKyAgICBJZGVudGlmaWVyIGlkZW4oZXhlYywgbWV0aG9kTmFtZSk7CisgICAgTWV0aG9kTGlz
dCBtZXRob2RMaXN0ID0gYUNsYXNzLT5tZXRob2RzTmFtZWQoaWRlbiwgaW5zdGFuY2UpOworICAg
IEFyZ0xpc3QgYXJnczsKKyAgICAvKkpTVmFsdWVQdHIgcmVzdWx0ID0qLyBpbnN0YW5jZS0+aW52
b2tlTWV0aG9kKGV4ZWMsIG1ldGhvZExpc3QgLCBhcmdzKTsKKyAgICBpbnN0YW5jZS0+ZW5kKCk7
CisgICAgLy9pbnN0YW5jZS0+ZGVyZWYoKTsKKyAgICAvL3JldHVybiByZXN1bHQ7CisKK30KKwor
Cit9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJveHkuaCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcm94eS5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZDllNTQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJveHkuaApAQCAtMCwwICsxLDY1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpIHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIE1l
ZGlhUGxheWVyUHJveHlfaAorI2RlZmluZSBNZWRpYVBsYXllclByb3h5X2gKKworI2luY2x1ZGUg
IlNjcmlwdEluc3RhbmNlLmgiCisKKyNpZiBFTkFCTEUoVklERU8pCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgSW50UmVjdDsKK2NsYXNzIEludFNpemU7CitjbGFzcyBTdHJpbmc7Citj
bGFzcyBNZWRpYVBsYXllcjsKK2NsYXNzIFBsdWdpblZpZXc7CitjbGFzcyBIVE1MTWVkaWFFbGVt
ZW50OworCitlbnVtIE1lZGlhUGxheWVyUHJveHlOb3RpZmljYXRpb25UeXBlIHsgTWVkaWFQbGF5
ZXJOb3RpZmljYXRpb25QbGF5UGF1c2VCdXR0b25QcmVzc2VkLCBJZGxlLCBMb2FkaW5nLCBMb2Fk
ZWQsIEZvcm1hdEVycm9yLCBOZXR3b3JrRXJyb3IsIERlY29kZUVycm9yIH07CisKK2NsYXNzIFdl
Yk1lZGlhUGxheWVyUHJveHkgeworcHVibGljOgorICAgIFdlYk1lZGlhUGxheWVyUHJveHkoTWVk
aWFQbGF5ZXIqIHBsYXllcik7CisgICAgfldlYk1lZGlhUGxheWVyUHJveHkoKTsKKworICAgIE1l
ZGlhUGxheWVyKiBtZWRpYVBsYXllcigpIHtyZXR1cm4gbV9tZWRpYVBsYXllcjt9CisgICAgdm9p
ZCBpbml0RW5naW5lKCk7CisgICAgdm9pZCBsb2FkKGNvbnN0IFN0cmluZyYgdXJsKTsKKyAgICBI
VE1MTWVkaWFFbGVtZW50KiBlbGVtZW50KCk7CisgICAgdm9pZCBpbnZva2VNZXRob2QoY29uc3Qg
U3RyaW5nJiBtZXRob2ROYW1lKTsKKyAgICBTY3JpcHRJbnN0YW5jZSBwbHVnaW5JbnN0YW5jZSgp
OworCitwcml2YXRlOgorICAgIE1lZGlhUGxheWVyKiBtX21lZGlhUGxheWVyOworICAgIGJvb2wg
bV9pbml0OworICAgIFdlYkNvcmU6OlBsdWdpblZpZXcqIG1fcGx1Z2luVmlldzsKKyAgICBib29s
IG1faGFzU2VudFJlc3BvbnNlVG9QbHVnaW47CisgICAgU2NyaXB0SW5zdGFuY2UgbV9pbnN0YW5j
ZTsKKyAgICAKK307Cit9CisjZW5kaWYgLy8gRU5BQkxFKFZJREVPKQorCisjZW5kaWYKXCBObyBu
ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL1BOR0VuY29kZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9QTkdFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTkx
NzYwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Q
TkdFbmNvZGVyLmNwcApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAw
Ni0yMDA5LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChj
KSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1
dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJQTkdFbmNvZGVyLmgiCisKKyNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInBuZy5oIgorfQorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKKy8vIEVuY29kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIHNlY3Rpb24gb2Yg
dGhlIGNvZGUgaXMgYmFzZWQgb24gbnNQTkdFbmNvZGVyLmNwcCBpbiBNb3ppbGxhCisvLyAoQ29w
eXJpZ2h0IDIwMDUgR29vZ2xlIEluYy4pCisKKy8vIFBhc3NlZCBhcm91bmQgYXMgdGhlIGlvX3B0
ciBpbiB0aGUgcG5nIHN0cnVjdHMgc28gb3VyIGNhbGxiYWNrcyBrbm93IHdoZXJlCisvLyB0byB3
cml0ZSBkYXRhLgorc3RydWN0IFBOR0VuY29kZXJTdGF0ZSB7CisgICAgUE5HRW5jb2RlclN0YXRl
KFZlY3RvcjxjaGFyPiogbykgOiBtX291dChvKSB7fQorICAgIFZlY3RvcjxjaGFyPiogbV9vdXQ7
Cit9OworCisvLyBDYWxsZWQgYnkgbGlicG5nIHRvIGZsdXNoIGl0cyBpbnRlcm5hbCBidWZmZXIg
dG8gb3Vycy4KK3ZvaWQgZW5jb2RlcldyaXRlQ2FsbGJhY2socG5nX3N0cnVjdHAgcG5nLCBwbmdf
Ynl0ZXAgZGF0YSwgcG5nX3NpemVfdCBzaXplKQoreworICAgIFBOR0VuY29kZXJTdGF0ZSogc3Rh
dGUgPSBzdGF0aWNfY2FzdDxQTkdFbmNvZGVyU3RhdGUqPihwbmdfZ2V0X2lvX3B0cihwbmcpKTsK
KyAgICBBU1NFUlQoc3RhdGUtPm1fb3V0KTsKKworICAgIHNpemVfdCBvbGRTaXplID0gc3RhdGUt
Pm1fb3V0LT5zaXplKCk7CisgICAgc3RhdGUtPm1fb3V0LT5yZXNpemUob2xkU2l6ZSArIHNpemUp
OworICAgIG1lbWNweSgmKCpzdGF0ZS0+bV9vdXQpW29sZFNpemVdLCBkYXRhLCBzaXplKTsKK30K
KworLy8gQXV0b21hdGljYWxseSBkZXN0cm95cyB0aGUgZ2l2ZW4gd3JpdGUgc3RydWN0cyBvbiBk
ZXN0cnVjdGlvbiB0byBtYWtlCisvLyBjbGVhbnVwIGFuZCBlcnJvciBoYW5kbGluZyBjb2RlIGNs
ZWFuZXIuCitjbGFzcyBQTkdXcml0ZVN0cnVjdERlc3Ryb3llciB7CitwdWJsaWM6CisgICAgUE5H
V3JpdGVTdHJ1Y3REZXN0cm95ZXIocG5nX3N0cnVjdCoqIHBzLCBwbmdfaW5mbyoqIHBpKQorICAg
ICAgICA6IG1fcG5nU3RydWN0KHBzKQorICAgICAgICAsIG1fcG5nSW5mbyhwaSkgeworICAgIH0K
KworICAgIH5QTkdXcml0ZVN0cnVjdERlc3Ryb3llcigpIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lf
d3JpdGVfc3RydWN0KG1fcG5nU3RydWN0LCBtX3BuZ0luZm8pOworICAgIH0KKworcHJpdmF0ZToK
KyAgICBwbmdfc3RydWN0KiogbV9wbmdTdHJ1Y3Q7CisgICAgcG5nX2luZm8qKiBtX3BuZ0luZm87
Cit9OworCitib29sIGNvbXByZXNzQml0bWFwVG9QbmcoU2hhcmVkQml0bWFwKiBibXAsIFZlY3Rv
cjxjaGFyPiYgcG5nRGF0YSkKK3sKKyAgICBpZiAoIWJtcC0+Ynl0ZXMoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgcG5nX3N0cnVjdCogcG5nUHRyID0gcG5nX2NyZWF0ZV93cml0ZV9z
dHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBuZ192b2lkcF9OVUxMLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcl9wdHJfTlVMTCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfZXJyb3JfcHRy
X05VTEwpOworICAgIGlmICghcG5nUHRyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBw
bmdfaW5mbyogaW5mb1B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nUHRyKTsKKyAgICBp
ZiAoIWluZm9QdHIpIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdQdHIs
IE5VTEwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFBOR1dyaXRlU3RydWN0
RGVzdHJveWVyIGRlc3Ryb3llcigmcG5nUHRyLCAmaW5mb1B0cik7CisKKyAgICBpbnQgYnl0ZURl
cHRoID0gYm1wLT5pczE2Yml0KCkgPyAzIDogNDsKKyAgICBWZWN0b3I8dW5zaWduZWQgY2hhciwg
MjA0OD4gcm93QnVmZmVyOw0KKyAgICByb3dCdWZmZXIucmVzaXplKGJtcC0+d2lkdGgoKSAqIGJ5
dGVEZXB0aCk7DQorDQorICAgIC8vIFRoZSBkZXN0cm95ZXIgd2lsbCBlbnN1cmUgdGhhdCB0aGUg
c3RydWN0dXJlcyBhcmUgY2xlYW5lZCB1cCBpbiB0aGlzCisgICAgLy8gY2FzZSwgZXZlbiB0aG91
Z2ggd2UgbWF5IGdldCBoZXJlIGFzIGEganVtcCBmcm9tIHJhbmRvbSBwYXJ0cyBvZiB0aGUKKyAg
ICAvLyBQTkcgbGlicmFyeSBjYWxsZWQgYmVsb3cuCisgICAgaWYgKHNldGptcChwbmdfam1wYnVm
KHBuZ1B0cikpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBTZXQgb3VyIGNhbGxi
YWNrIGZvciBsaWJwbmcgdG8gZ2l2ZSB1cyB0aGUgZGF0YS4KKyAgICBQTkdFbmNvZGVyU3RhdGUg
c3RhdGUoJnBuZ0RhdGEpOworICAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nUHRyLCAmc3RhdGUsIGVu
Y29kZXJXcml0ZUNhbGxiYWNrLCBOVUxMKTsKKworICAgIGludCBwbmdPdXRwdXRDb2xvclR5cGUg
PSBibXAtPmlzMTZiaXQoKSA/IFBOR19DT0xPUl9UWVBFX1JHQiA6IFBOR19DT0xPUl9UWVBFX1JH
Ql9BTFBIQTsKKyAgIAorICAgIHBuZ19zZXRfSUhEUihwbmdQdHIsIGluZm9QdHIsIGJtcC0+d2lk
dGgoKSwgYm1wLT5oZWlnaHQoKSwgOCwgcG5nT3V0cHV0Q29sb3JUeXBlLAorICAgICAgICAgICAg
ICAgICBQTkdfSU5URVJMQUNFX05PTkUsIFBOR19DT01QUkVTU0lPTl9UWVBFX0RFRkFVTFQsCisg
ICAgICAgICAgICAgICAgIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUKTsKKyAgICBwbmdfd3JpdGVf
aW5mbyhwbmdQdHIsIGluZm9QdHIpOworCisgICAgaWYgKGJtcC0+aXMxNmJpdCgpKSB7CisgICAg
ICAgIHVuc2lnbmVkIHNob3J0KiBzcmMgPSAodW5zaWduZWQgc2hvcnQqKWJtcC0+Ynl0ZXMoKTsK
KyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAoaW50KWJtcC0+aGVpZ2h0KCk7ICsreSkgewor
ICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAg
ICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgKGludClibXAtPndpZHRoKCk7ICsreCkgeworICAg
ICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlID0gKnNyYysrOw0KKyNpZiBJTUFHRV9O
T19BTFBIQV9VU0VfUkdCNTU1CisgICAgICAgICAgICAgICAgKmRzdCsrID0gdW5zaWduZWQgY2hh
cigodmFsdWUgPj4gNykgJiAweEY4KTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSB1bnNpZ25l
ZCBjaGFyKCh2YWx1ZSA+PiAyKSAmIDB4RjgpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IHVu
c2lnbmVkIGNoYXIoKHZhbHVlIDw8IDMpICYgMHhGOCk7CisjZWxzZQorICAgICAgICAgICAgICAg
ICpkc3QrKyA9IHVuc2lnbmVkIGNoYXIoKHZhbHVlID4+IDgpICYgMHhGOCk7CisgICAgICAgICAg
ICAgICAgKmRzdCsrID0gdW5zaWduZWQgY2hhcigodmFsdWUgPj4gMykgJiAweEZDKTsKKyAgICAg
ICAgICAgICAgICAqZHN0KysgPSB1bnNpZ25lZCBjaGFyKCh2YWx1ZSA8PCAzKSAmIDB4RjgpOw0K
KyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG5nX3dyaXRlX3JvdyhwbmdQdHIs
IHJvd0J1ZmZlci5kYXRhKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdW5z
aWduZWQgY2hhciogc3JjID0gKHVuc2lnbmVkIGNoYXIqKWJtcC0+Ynl0ZXMoKTsKKyAgICAgICAg
Zm9yIChpbnQgeSA9IDA7IHkgPCAoaW50KWJtcC0+aGVpZ2h0KCk7ICsreSkgeworICAgICAgICAg
ICAgdW5zaWduZWQgY2hhciogZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIGZv
ciAoaW50IHggPSAwOyB4IDwgKGludClibXAtPndpZHRoKCk7ICsreCkgeworICAgICAgICAgICAg
ICAgIC8vIE5vdGU6IFBORyBpcyBpbiBiaWcgZW5kaWFuCisgICAgICAgICAgICAgICAgdW5zaWdu
ZWQgY2hhciBiID0gKnNyYysrOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZyA9ICpz
cmMrKzsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHIgPSAqc3JjKys7CisgICAgICAg
ICAgICAgICAgdW5zaWduZWQgY2hhciBhID0gKnNyYysrOworICAgICAgICAgICAgICAgICpkc3Qr
KyA9IHI7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gZzsKKyAgICAgICAgICAgICAgICAqZHN0
KysgPSBiOworICAgICAgICAgICAgICAgICpkc3QrKyA9IGE7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBwbmdfd3JpdGVfcm93KHBuZ1B0ciwgcm93QnVmZmVyLmRhdGEoKSk7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICBwbmdfd3JpdGVfZW5kKHBuZ1B0ciwgaW5mb1B0cik7CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BOR0VuY29kZXIuaCBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvUE5HRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjQ1M2M5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL1BOR0VuY29kZXIuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpIHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24s
IE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFBOR19FTkNPREVSX0gKKyNkZWZp
bmUgUE5HX0VOQ09ERVJfSAorCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZQoreworICAgIGJvb2wgY29tcHJlc3NCaXRtYXBUb1BuZyhTaGFyZWRCaXRtYXAqIGJt
cCwgVmVjdG9yPGNoYXI+JiBwbmdEYXRhKTsKK30KKworI2VuZGlmIC8vIFBOR19FTkNPREVSX0gK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbmNlLmNw
cCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbmNlLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTEwZWEwCi0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwCkBAIC0wLDAgKzEs
MTU3IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5j
LgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaSBhbmQvb3IKKyAqICBtb2RpZnkgaSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpIHdpbGwgYmUgdXNlZnVs
LAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVT
QS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBhdGguaCIKKwor
I2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1QYXRoV2luY2UuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgor
I2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1BhdGg6OlBhdGgoKQorOiBtX3BhdGgobmV3IFBs
YXRmb3JtUGF0aCgpKQoreworfQorCitQYXRoOjp+UGF0aCgpCit7CisgICAgZGVsZXRlIG1fcGF0
aDsKK30KKworUGF0aDo6UGF0aChjb25zdCBQYXRoJiBvdGhlcikKKzogbV9wYXRoKG5ldyBQbGF0
Zm9ybVBhdGgoKm90aGVyLm1fcGF0aCkpCit7Cit9CisKK1BhdGgmIFBhdGg6Om9wZXJhdG9yPShj
b25zdCBQYXRoJiBvdGhlcikKK3sKKyAgICBtX3BhdGggPSBuZXcgUGxhdGZvcm1QYXRoKCpvdGhl
ci5tX3BhdGgpOworICAgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBQYXRoOjpjb250YWlucyhj
b25zdCBGbG9hdFBvaW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9wYXRoLT5jb250YWlucyhwb2ludCwgcnVsZSk7Cit9CisKK3ZvaWQgUGF0aDo6dHJhbnNs
YXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBtX3BhdGgtPnRyYW5zbGF0ZShzaXpl
KTsKK30KKworRmxvYXRSZWN0IFBhdGg6OmJvdW5kaW5nUmVjdCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fcGF0aC0+Ym91bmRpbmdSZWN0KCk7Cit9CisKK3ZvaWQgUGF0aDo6bW92ZVRvKGNvbnN0
IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIG1fcGF0aC0+bW92ZVRvKHBvaW50KTsKK30KKwor
dm9pZCBQYXRoOjphZGRMaW5lVG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgbV9w
YXRoLT5hZGRMaW5lVG8ocG9pbnQpOworfQorCit2b2lkIFBhdGg6OmFkZFF1YWRDdXJ2ZVRvKGNv
bnN0IEZsb2F0UG9pbnQmIGNwLCBjb25zdCBGbG9hdFBvaW50JiBwKQoreworICAgIG1fcGF0aC0+
YWRkUXVhZEN1cnZlVG8oY3AsIHApOworfQorCit2b2lkIFBhdGg6OmFkZEJlemllckN1cnZlVG8o
Y29uc3QgRmxvYXRQb2ludCYgY3AxLCBjb25zdCBGbG9hdFBvaW50JiBjcDIsIGNvbnN0IEZsb2F0
UG9pbnQmIHApCit7CisgICAgbV9wYXRoLT5hZGRCZXppZXJDdXJ2ZVRvKGNwMSwgY3AyLCBwKTsK
K30KKwordm9pZCBQYXRoOjphZGRBcmNUbyhjb25zdCBGbG9hdFBvaW50JiBwMSwgY29uc3QgRmxv
YXRQb2ludCYgcDIsIGZsb2F0IHJhZGl1cykKK3sKKyAgICBtX3BhdGgtPmFkZEFyY1RvKHAxLCBw
MiwgcmFkaXVzKTsKK30KKwordm9pZCBQYXRoOjpjbG9zZVN1YnBhdGgoKQoreworICAgIG1fcGF0
aC0+Y2xvc2VTdWJwYXRoKCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQXJjKGNvbnN0IEZsb2F0UG9p
bnQmIHAsIGZsb2F0IHIsIGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9ja3dpc2Up
Cit7CisgICAgbV9wYXRoLT5hZGRFbGxpcHNlKHAsIHIsIHIsIHNhciwgZWFyLCBhbnRpY2xvY2t3
aXNlKTsKK30KKwordm9pZCBQYXRoOjphZGRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAg
ICBtX3BhdGgtPmFkZFJlY3Qocik7Cit9CisKK3ZvaWQgUGF0aDo6YWRkRWxsaXBzZShjb25zdCBG
bG9hdFJlY3QmIHIpCit7CisgICAgRmxvYXRTaXplIHJhZGl1cyhyLndpZHRoKCkgKiAwLjUsIHIu
aGVpZ2h0KCkgKiAwLjUpOworICAgIG1fcGF0aC0+YWRkRWxsaXBzZShyKTsKK30KKwordm9pZCBQ
YXRoOjpjbGVhcigpCit7CisgICAgbV9wYXRoLT5jbGVhcigpOworfQorCitib29sIFBhdGg6Omlz
RW1wdHkoKSBjb25zdAoreworICAgIHJldHVybiBtX3BhdGgtPmlzRW1wdHkoKTsKK30KKworU3Ry
aW5nIFBhdGg6OmRlYnVnU3RyaW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYXRoLT5kZWJ1
Z1N0cmluZygpOworfQorCit2b2lkIFBhdGg6OmFwcGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVy
RnVuY3Rpb24gZnVuY3Rpb24pIGNvbnN0Cit7CisgICAgbV9wYXRoLT5hcHBseShpbmZvLCBmdW5j
dGlvbik7Cit9CisKK3ZvaWQgUGF0aDo6dHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0
cml4JiB0KQoreworICAgIG1fcGF0aC0+dHJhbnNmb3JtKHQpOworfQorCitGbG9hdFJlY3QgUGF0
aDo6c3Ryb2tlQm91bmRpbmdSZWN0KFN0cm9rZVN0eWxlQXBwbGllciAqKQoreworICAgIG5vdElt
cGxlbWVudGVkKCk7CisgICAgcmV0dXJuIEZsb2F0UmVjdCgpOworfQorCitib29sIFBhdGg6OnN0
cm9rZUNvbnRhaW5zKFN0cm9rZVN0eWxlQXBwbGllciosIGNvbnN0IEZsb2F0UG9pbnQmKSBjb25z
dAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29s
IFBhdGg6Omhhc0N1cnJlbnRQb2ludCgpIGNvbnN0Cit7CisgICAgcmV0dXJuICFpc0VtcHR5KCk7
Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxh
dGZvcm1QYXRoV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0
Zm9ybVBhdGhXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNm
MmJmYgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2Uv
UGxhdGZvcm1QYXRoV2luY2UuY3BwCkBAIC0wLDAgKzEsODAzIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGkgd2lsbCBiZSB1c2VmdWws
CisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVBhdGhXaW5j
ZS5oIgorCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCisjaW5jbHVkZSAiUGF0aC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5j
bHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisK
KyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gSW1wbGVt
ZW50ZWQgaW4gR3JhcGhpY3NDb250ZXh0V2luY2UuY3BwCit2b2lkIGdldEVsbGlwc2VQb2ludEJ5
QW5nbGUoZG91YmxlIGFuZ2xlLCBkb3VibGUgYSwgZG91YmxlIGIsIGZsb2F0JiB4LCBmbG9hdCYg
eSk7CisKK3N0YXRpYyB2b2lkIHF1YWRDdXJ2ZShpbnQgc2VnbWVudHMsIFZlY3RvcjxQYXRoUG9p
bnQ+JiBwdHMsIGNvbnN0IFBhdGhQb2ludCogY29udHJvbCkKK3sKKyAgICBjb25zdCBmbG9hdCBz
dGVwID0gMS4wIC8gc2VnbWVudHM7CisgICAgcmVnaXN0ZXIgZmxvYXQgdEEgPSAwLjA7CisgICAg
cmVnaXN0ZXIgZmxvYXQgdEIgPSAxLjA7CisKKyAgICBmbG9hdCBjMXggPSBjb250cm9sWzBdLngo
KTsKKyAgICBmbG9hdCBjMXkgPSBjb250cm9sWzBdLnkoKTsKKyAgICBmbG9hdCBjMnggPSBjb250
cm9sWzFdLngoKTsKKyAgICBmbG9hdCBjMnkgPSBjb250cm9sWzFdLnkoKTsKKyAgICBmbG9hdCBj
M3ggPSBjb250cm9sWzJdLngoKTsKKyAgICBmbG9hdCBjM3kgPSBjb250cm9sWzJdLnkoKTsKKwor
ICAgIGNvbnN0IGludCBvZmZzZXQgPSBwdHMuc2l6ZSgpOworICAgIHB0cy5yZXNpemUob2Zmc2V0
ICsgc2VnbWVudHMpOworICAgIFBhdGhQb2ludCBwcDsKKyAgICBwcC5tX3ggPSBjMXg7CisgICAg
cHAubV95ID0gYzF5OworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50czsgKytpKSB7
CisgICAgICAgIHRBICs9IHN0ZXA7CisgICAgICAgIHRCIC09IHN0ZXA7CisKKyAgICAgICAgY29u
c3QgZmxvYXQgYSA9IHRCICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAyLjAgKiB0QSAq
IHRCOworICAgICAgICBjb25zdCBmbG9hdCBjID0gdEEgKiB0QTsKKworICAgICAgICBwcC5tX3gg
PSBjMXggKiBhICsgYzJ4ICogYiArIGMzeCAqIGM7CisgICAgICAgIHBwLm1feSA9IGMxeSAqIGEg
KyBjMnkgKiBiICsgYzN5ICogYzsKKworICAgICAgICBwdHNbb2Zmc2V0ICsgaSAtIDFdID0gcHA7
CisgICAgfQorCisgICAgcHAubV94ID0gYzN4OworICAgIHBwLm1feSA9IGMzeTsKKyAgICBwdHNb
b2Zmc2V0ICsgc2VnbWVudHMgLSAxXSA9IHBwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmV6
aWVyKGludCBzZWdtZW50cywgVmVjdG9yPFBhdGhQb2ludD4mIHB0cywgY29uc3QgUGF0aFBvaW50
KiBjb250cm9sKQoreworICAgIGNvbnN0IGZsb2F0IHN0ZXAgPSAxLjAgLyBzZWdtZW50czsKKyAg
ICByZWdpc3RlciBmbG9hdCB0QSA9IDAuMDsKKyAgICByZWdpc3RlciBmbG9hdCB0QiA9IDEuMDsK
KworICAgIGZsb2F0IGMxeCA9IGNvbnRyb2xbMF0ueCgpOworICAgIGZsb2F0IGMxeSA9IGNvbnRy
b2xbMF0ueSgpOworICAgIGZsb2F0IGMyeCA9IGNvbnRyb2xbMV0ueCgpOworICAgIGZsb2F0IGMy
eSA9IGNvbnRyb2xbMV0ueSgpOworICAgIGZsb2F0IGMzeCA9IGNvbnRyb2xbMl0ueCgpOworICAg
IGZsb2F0IGMzeSA9IGNvbnRyb2xbMl0ueSgpOworICAgIGZsb2F0IGM0eCA9IGNvbnRyb2xbM10u
eCgpOworICAgIGZsb2F0IGM0eSA9IGNvbnRyb2xbM10ueSgpOworCisgICAgY29uc3QgaW50IG9m
ZnNldCA9IHB0cy5zaXplKCk7CisgICAgcHRzLnJlc2l6ZShvZmZzZXQgKyBzZWdtZW50cyk7Cisg
ICAgUGF0aFBvaW50IHBwOworICAgIHBwLm1feCA9IGMxeDsKKyAgICBwcC5tX3kgPSBjMXk7CisK
KyAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlZ21lbnRzOyArK2kpIHsKKyAgICAgICAgdEEgKz0g
c3RlcDsKKyAgICAgICAgdEIgLT0gc3RlcDsKKyAgICAgICAgY29uc3QgZmxvYXQgdEFzcSA9IHRB
ICogdEE7CisgICAgICAgIGNvbnN0IGZsb2F0IHRCc3EgPSB0QiAqIHRCOworCisgICAgICAgIGNv
bnN0IGZsb2F0IGEgPSB0QnNxICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAzLjAgKiB0
QSAqIHRCc3E7CisgICAgICAgIGNvbnN0IGZsb2F0IGMgPSAzLjAgKiB0QiAqIHRBc3E7CisgICAg
ICAgIGNvbnN0IGZsb2F0IGQgPSB0QXNxICogdEE7CisKKyAgICAgICAgcHAubV94ID0gYzF4ICog
YSArIGMyeCAqIGIgKyBjM3ggKiBjICsgYzR4ICogZDsKKyAgICAgICAgcHAubV95ID0gYzF5ICog
YSArIGMyeSAqIGIgKyBjM3kgKiBjICsgYzR5ICogZDsKKworICAgICAgICBwdHNbb2Zmc2V0ICsg
aSAtIDFdID0gcHA7CisgICAgfQorCisgICAgcHAubV94ID0gYzR4OworICAgIHBwLm1feSA9IGM0
eTsKKyAgICBwdHNbb2Zmc2V0ICsgc2VnbWVudHMgLSAxXSA9IHBwOworfQorCitzdGF0aWMgaW5s
aW5lIGludCBzdGFibGVSb3VuZChkb3VibGUgZCkKK3sKKyAgICBpZiAoZCA+IDApCisgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGQgKyAwLjUpOworCisgICAgaW50IGkgPSBzdGF0aWNf
Y2FzdDxpbnQ+KGQpOworICAgIHJldHVybiBpIC0gZCA+IDAuNSA/IGkgLSAxIDogaTsKK30KKwor
c3RhdGljIGJvb2wgY29udGFpbnNQb2ludChjb25zdCBGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0
UG9pbnQmIHApCit7CisgICAgcmV0dXJuIHAueCgpID49IHIueCgpICYmIHAueSgpID49IHIueSgp
ICYmIHAueCgpIDwgci5yaWdodCgpICYmIHAueSgpIDwgci5ib3R0b20oKTsKK30KKworI2RlZmlu
ZSBQSSAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorCitzdGF0aWMgdm9pZCBub3JtYWxp
emVBbmdsZShmbG9hdCYgYW5nbGUpCit7CisgICAgd2hpbGUgKGFuZ2xlIDwgMCkgCisgICAgICAg
IGFuZ2xlICs9IDIgKiBQSTsKKyAgICB3aGlsZSAoYW5nbGUgPj0gMiAqIFBJKQorICAgICAgICBh
bmdsZSAtPSAyICogUEk7CisgICAgaWYgKGFuZ2xlIDwgMC4wMDAwMSkKKyAgICAgICAgYW5nbGUg
PSAwOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1BcmNQb2ludChmbG9hdCYgeCwgZmxvYXQm
IHksIGNvbnN0IEZsb2F0UG9pbnQmIGMpCit7CisgICAgeCArPSBjLngoKTsKKyAgICB5ICs9IGMu
eSgpOworfQorCitzdGF0aWMgdm9pZCBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KEZsb2F0UmVj
dCYgciwgZmxvYXQgeCwgZmxvYXQgeSkKK3sKKyAgICBpZiAoci5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgci5zZXRYKHgpOworICAgICAgICByLnNldFkoeSk7CisgICAgICAgIHIuc2V0U2l6ZShGbG9h
dFNpemUoMSwgMSkpOworICAgICAgICByZXR1cm47CisgICAgfSAKKyAgICBpZiAoeCA8IHIueCgp
KSB7CisgICAgICAgIHIuc2V0V2lkdGgoci5yaWdodCgpIC0geCk7CisgICAgICAgIHIuc2V0WCh4
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCB3ID0geCAtIHIueCgpICsgMTsKKyAgICAg
ICAgaWYgKHcgPiByLndpZHRoKCkpCisgICAgICAgICAgICByLnNldFdpZHRoKHcpOworICAgIH0K
KyAgICBpZiAoeSA8IHIueSgpKSB7CisgICAgICAgIHIuc2V0SGVpZ2h0KHIuYm90dG9tKCkgLSB5
KTsKKyAgICAgICAgci5zZXRZKHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IGggPSAg
eSAtIHIueSgpICsgMTsKKyAgICAgICAgaWYgKGggPiByLmhlaWdodCgpKQorICAgICAgICAgICAg
ci5zZXRIZWlnaHQoaCk7CisgICAgfQorfQorCisvLyByZXR1cm4gMC1iYXNlZCB2YWx1ZTogMCAt
IGZpcnN0IFF1YWRyYW50ICggMCAtIDkwIGRlZ3JlZSkKK3N0YXRpYyBpbmxpbmUgaW50IHF1YWRy
YW50KGNvbnN0IFBhdGhQb2ludCYgcG9pbnQsIGNvbnN0IFBhdGhQb2ludCYgb3JpZ1BvaW50KQor
eworICAgIHJldHVybiBwb2ludC5tX3ggPCBvcmlnUG9pbnQubV94ID8gCisgICAgICAgIChwb2lu
dC5tX3kgPCBvcmlnUG9pbnQubV95ID8gMiA6IDEpCisgICAgICAgIDogKHBvaW50Lm1feSA8IG9y
aWdQb2ludC5tX3kgPyAzIDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50
T25MZWZ0KGludCBxKSB7IHJldHVybiBxID09IDEgfHwgcSA9PSAyOyB9CitzdGF0aWMgaW5saW5l
IGJvb2wgaXNRdWFkcmFudE9uUmlnaHQoaW50IHEpIHsgcmV0dXJuIHEgPT0gMCB8fCBxID09IDM7
IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25Ub3AoaW50IHEpIHsgcmV0dXJuIHEg
PT0gMiB8fCBxID09IDM7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25Cb3R0b20o
aW50IHEpIHsgcmV0dXJuIHEgPT0gMCB8fCBxID09IDE7IH0KKworc3RhdGljIGlubGluZSBpbnQg
bmV4dFF1YWRyYW50KGludCBxKSB7IHJldHVybiBxID09IDMgPyAwIDogcSArIDE7IH0KK3N0YXRp
YyBpbmxpbmUgaW50IHF1YWRyYW50RGlmZihpbnQgcTEsIGludCBxMikgeyBpbnQgZCA9IHExIC0g
cTI7IHdoaWxlIChkIDwgMCkgZCArPSA0OyByZXR1cm4gZDsgfQorCitzdHJ1Y3QgUGF0aFZlY3Rv
ciB7CisgICAgZmxvYXQgbV94OworICAgIGZsb2F0IG1feTsKKworICAgIFBhdGhWZWN0b3IoKSA6
IG1feCgwKSwgbV95KDApIHt9CisgICAgUGF0aFZlY3RvcihmbG9hdCB4LCBmbG9hdCB5KSA6IG1f
eCh4KSwgbV95KHkpIHt9CisgICAgZG91YmxlIGFuZ2xlKCkgY29uc3QgeyByZXR1cm4gYXRhbjIo
bV95LCBtX3gpOyB9CisgICAgb3BlcmF0b3IgZG91YmxlICgpIGNvbnN0IHsgcmV0dXJuIGFuZ2xl
KCk7IH0KKyAgICBkb3VibGUgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gX2h5cG90KG1feCwgbV95
KTsgfQorfTsKKworUGF0aFZlY3RvciBvcGVyYXRvci0oY29uc3QgUGF0aFBvaW50JiBwMSwgY29u
c3QgUGF0aFBvaW50JiBwMikgeyByZXR1cm4gUGF0aFZlY3RvcihwMS5tX3ggLSBwMi5tX3gsIHAx
Lm1feSAtIHAyLm1feSk7IH0KKworc3RhdGljIHZvaWQgYWRkQXJjUG9pbnQoUGF0aFBvbHlnb24m
IHBvbHksIGNvbnN0IFBhdGhQb2ludCYgY2VudGVyLCBjb25zdCBQYXRoUG9pbnQmIHJhZGl1cywg
ZG91YmxlIGFuZ2xlKQoreworICAgIFBhdGhQb2ludCBwOworICAgIGdldEVsbGlwc2VQb2ludEJ5
QW5nbGUoYW5nbGUsIHJhZGl1cy5tX3gsIHJhZGl1cy5tX3ksIHAubV94LCBwLm1feSk7CisgICAg
dHJhbnNmb3JtQXJjUG9pbnQocC5tX3gsIHAubV95LCBjZW50ZXIpOworICAgIGlmIChwb2x5Lmlz
RW1wdHkoKSB8fCBwb2x5Lmxhc3QoKSAhPSBwKQorICAgICAgICBwb2x5LmFwcGVuZChwKTsKK30K
Kworc3RhdGljIHZvaWQgYWRkQXJjUG9pbnRzKFBhdGhQb2x5Z29uJiBwb2x5LCBjb25zdCBQbGF0
Zm9ybVBhdGhFbGVtZW50OjpBcmNUbyYgZGF0YSkKK3sKKyAgICBjb25zdCBQYXRoUG9pbnQmIHN0
YXJ0UG9pbnQgPSBwb2x5Lmxhc3QoKTsKKyAgICBkb3VibGUgY3VyQW5nbGUgPSBzdGFydFBvaW50
IC0gZGF0YS5tX2NlbnRlcjsKKyAgICBkb3VibGUgZW5kQW5nbGUgPSBkYXRhLm1fZW5kIC0gZGF0
YS5tX2NlbnRlcjsKKyAgICBkb3VibGUgYW5nbGVTdGVwID0gMi4gLyBzdGQ6Om1heChkYXRhLm1f
cmFkaXVzLm1feCwgZGF0YS5tX3JhZGl1cy5tX3kpOworICAgIGlmIChkYXRhLm1fY2xvY2t3aXNl
KSB7CisgICAgICAgIGlmIChlbmRBbmdsZSA8PSBjdXJBbmdsZSB8fCBzdGFydFBvaW50ID09IGRh
dGEubV9lbmQpCisgICAgICAgICAgICBlbmRBbmdsZSArPSAyICogUEk7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgYW5nbGVTdGVwID0gLWFuZ2xlU3RlcDsKKyAgICAgICAgaWYgKGVuZEFuZ2xlID49
IGN1ckFuZ2xlIHx8IHN0YXJ0UG9pbnQgPT0gZGF0YS5tX2VuZCkKKyAgICAgICAgICAgIGVuZEFu
Z2xlIC09IDIgKiBQSTsKKyAgICB9CisKKyAgICBmb3IgKGN1ckFuZ2xlICs9IGFuZ2xlU3RlcDsg
ZGF0YS5tX2Nsb2Nrd2lzZSA/IGN1ckFuZ2xlIDwgZW5kQW5nbGUgOiBjdXJBbmdsZSA+IGVuZEFu
Z2xlOyBjdXJBbmdsZSArPSBhbmdsZVN0ZXApCisgICAgICAgIGFkZEFyY1BvaW50KHBvbHksIGRh
dGEubV9jZW50ZXIsIGRhdGEubV9yYWRpdXMsIGN1ckFuZ2xlKTsKKworICAgIGlmIChwb2x5Lmlz
RW1wdHkoKSB8fCBwb2x5Lmxhc3QoKSAhPSBkYXRhLm1fZW5kKQorICAgICAgICBwb2x5LmFwcGVu
ZChkYXRhLm1fZW5kKTsKK30KKworc3RhdGljIHZvaWQgZHJhd1BvbHlnb25zKEhEQyBkYywgY29u
c3QgVmVjdG9yPFBhdGhQb2x5Z29uPiYgcG9seWdvbnMsIGJvb2wgZmlsbCwgY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgqIHRyKQoreworICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZh
aWw7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvbHlnb24+Ojpjb25zdF9pdGVyYXRvciBpID0gcG9s
eWdvbnMuYmVnaW4oKTsgaSAhPSBwb2x5Z29ucy5lbmQoKTsgKytpKSB7CisgICAgICAgIGludCBu
cG9pbnRzID0gaS0+c2l6ZSgpOworICAgICAgICBpZiAoIW5wb2ludHMpCisgICAgICAgICAgICBj
b250aW51ZTsKKworICAgICAgICBQT0lOVCogd2luUG9pbnRzID0gMDsKKyAgICAgICAgaWYgKGZp
bGwpIHsKKyAgICAgICAgICAgIGlmIChucG9pbnRzID4gMikKKyAgICAgICAgICAgICAgICB3aW5Q
b2ludHMgPSBuZXcgUE9JTlRbbnBvaW50cyArIDFdOworICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgIHdpblBvaW50cyA9IG5ldyBQT0lOVFtucG9pbnRzXTsKKworICAgICAgICBpZiAod2luUG9p
bnRzKSB7CisgICAgICAgICAgICBpZiAodHIpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBp
MiA9IDA7IGkyIDwgbnBvaW50czsgKytpMikgeworICAgICAgICAgICAgICAgICAgICBGbG9hdFBv
aW50IHRyUG9pbnQgPSB0ci0+bWFwUG9pbnQoaS0+YXQoaTIpKTsKKyAgICAgICAgICAgICAgICAg
ICAgd2luUG9pbnRzW2kyXS54ID0gc3RhYmxlUm91bmQodHJQb2ludC54KCkpOworICAgICAgICAg
ICAgICAgICAgICB3aW5Qb2ludHNbaTJdLnkgPSBzdGFibGVSb3VuZCh0clBvaW50LnkoKSk7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBm
b3IgKGludCBpMiA9IDA7IGkyIDwgbnBvaW50czsgKytpMikgeworICAgICAgICAgICAgICAgICAg
ICB3aW5Qb2ludHNbaTJdLnggPSBzdGFibGVSb3VuZChpLT5hdChpMikueCgpKTsKKyAgICAgICAg
ICAgICAgICAgICAgd2luUG9pbnRzW2kyXS55ID0gc3RhYmxlUm91bmQoaS0+YXQoaTIpLnkoKSk7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmls
bCAmJiB3aW5Qb2ludHNbbnBvaW50cyAtIDFdICE9IHdpblBvaW50c1swXSkgeworICAgICAgICAg
ICAgICAgIHdpblBvaW50c1tucG9pbnRzXS54ID0gd2luUG9pbnRzWzBdLng7CisgICAgICAgICAg
ICAgICAgd2luUG9pbnRzW25wb2ludHNdLnkgPSB3aW5Qb2ludHNbMF0ueTsKKyAgICAgICAgICAg
ICAgICArK25wb2ludHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWxsKSAK
KyAgICAgICAgICAgICAgICA6OlBvbHlnb24oZGMsIHdpblBvaW50cywgbnBvaW50cyk7CisgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgOjpQb2x5bGluZShkYywgd2luUG9pbnRzLCBu
cG9pbnRzKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIHdpblBvaW50czsKKyAgICAgICAgfQorICAg
IH0KK30KKworCitpbnQgUGxhdGZvcm1QYXRoRWxlbWVudDo6bnVtQ29udHJvbFBvaW50cygpIGNv
bnN0Cit7CisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICAgICAgY2FzZSBQYXRoTW92ZVRvOgor
ICAgICAgICBjYXNlIFBhdGhMaW5lVG86CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAg
Y2FzZSBQYXRoUXVhZEN1cnZlVG86CisgICAgICAgIGNhc2UgUGF0aEFyY1RvOgorICAgICAgICAg
ICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgUGF0aEJlemllckN1cnZlVG86CisgICAgICAgICAg
ICByZXR1cm4gMzsKKyAgICAgICAgLy9jYXNlIFBhdGhDbG9zZVN1YnBhdGg6CisgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK2ludCBQbGF0Zm9ybVBh
dGhFbGVtZW50OjpudW1Qb2ludHMoKSBjb25zdAoreworICAgIHN3aXRjaCAobV90eXBlKSB7Cisg
ICAgICAgIGNhc2UgUGF0aE1vdmVUbzoKKyAgICAgICAgY2FzZSBQYXRoTGluZVRvOgorICAgICAg
ICBjYXNlIFBhdGhBcmNUbzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFBh
dGhRdWFkQ3VydmVUbzoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIFBhdGhC
ZXppZXJDdXJ2ZVRvOgorICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIC8vY2FzZSBQYXRo
Q2xvc2VTdWJwYXRoOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorfQorCit2b2lkIFBhdGhQb2x5Z29uOjptb3ZlKGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0
KQoreworICAgIGZvciAoVmVjdG9yPFBhdGhQb2ludD46Oml0ZXJhdG9yIGkgPSBiZWdpbigpOyBp
IDwgZW5kKCk7ICsraSkKKyAgICAgICAgaS0+bW92ZShvZmZzZXQpOworfQorCit2b2lkIFBhdGhQ
b2x5Z29uOjp0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpCit7CisgICAg
Zm9yIChWZWN0b3I8UGF0aFBvaW50Pjo6aXRlcmF0b3IgaSA9IGJlZ2luKCk7IGkgPCBlbmQoKTsg
KytpKSB7CisgICAgICAgICppID0gdC5tYXBQb2ludCgqaSk7CisgICAgfQorfQorCitib29sIFBh
dGhQb2x5Z29uOjpjb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAg
ICBpZiAoc2l6ZSgpIDwgMykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50IGludGVy
c2VjdGVkID0gMDsKKyAgICBjb25zdCBQYXRoUG9pbnQqIHBvaW50MSA9ICZsYXN0KCk7CisgICAg
VmVjdG9yPFBhdGhQb2ludD46OmNvbnN0X2l0ZXJhdG9yIGxhc3QgPSBlbmQoKTsKKyAgICBpbnQg
d2FzTmVnYXRpdmUgPSAyOworICAgIGZvciAoVmVjdG9yPFBhdGhQb2ludD46OmNvbnN0X2l0ZXJh
dG9yIGkgPSBiZWdpbigpOyBpICE9IGxhc3Q7ICsraSkgeworICAgICAgICBjb25zdCBQYXRoUG9p
bnQmIHBvaW50MiA9ICppOworICAgICAgICBpZiAocG9pbnQxLT54KCkgIT0gcG9pbnQueCgpKSB7
CisgICAgICAgICAgICBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkpCisgICAgICAgICAgICAg
ICAgd2FzTmVnYXRpdmUgPSBwb2ludDEtPngoKSA8IHBvaW50LngoKSA/IDEgOiAwOworICAgICAg
ICAgICAgZWxzZSBpZiAocG9pbnQyLngoKSA8IHBvaW50LngoKSAhPSBwb2ludDEtPngoKSA8IHBv
aW50LngoKSkgeworICAgICAgICAgICAgICAgIGZsb2F0IHkgPSAocG9pbnQyLnkoKSAtIHBvaW50
MS0+eSgpKSAvIChwb2ludDIueCgpIC0gcG9pbnQxLT54KCkpICogKHBvaW50LngoKSAtIHBvaW50
MS0+eCgpKSArIHBvaW50MS0+eSgpOworICAgICAgICAgICAgICAgIGlmICh5ID49IHBvaW50Lnko
KSkKKyAgICAgICAgICAgICAgICAgICAgKytpbnRlcnNlY3RlZDsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwb2ludDEtPnkoKSA9PSBwb2ludC55KCkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IGlmIChwb2ludDEtPnkoKSA+IHBvaW50LnkoKSkgeworICAgICAgICAgICAgICAgIGlmIChwb2lu
dDIueCgpID09IHBvaW50LngoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnQyLnko
KSA8PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAod2FzTmVnYXRp
dmUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFBhdGhQb2ludD46OmNv
bnN0X2l0ZXJhdG9yIGpMYXN0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxQ
YXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBiZWdpbigpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbGFzdDsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tajsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoai0+eCgpICE9IHBvaW50LngoKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoai0+eCgpID4gcG9pbnQueCgpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzTmVnYXRpdmUgPSAwOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB3YXNOZWdhdGl2ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0gd2hpbGUgKGogIT0gakxhc3QpOworCisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAod2FzTmVnYXRpdmUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYg
KHdhc05lZ2F0aXZlID8gcG9pbnQyLngoKSA+IHBvaW50LngoKSA6IHBvaW50Mi54KCkgPCBwb2lu
dC54KCkpCisgICAgICAgICAgICAgICAgICAgICAgICArK2ludGVyc2VjdGVkOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkg
JiYgcG9pbnQyLnkoKSA+PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIH0KKyAgICAgICAgcG9pbnQxID0gJnBvaW50MjsKKyAgICB9CisKKyAgICByZXR1
cm4gaW50ZXJzZWN0ZWQgJiAxOworfQorCit2b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6Om1vdmUo
Y29uc3QgRmxvYXRTaXplJiBvZmZzZXQpIHsKKyAgICBpbnQgbiA9IG51bUNvbnRyb2xQb2ludHMo
KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgbV9kYXRhLm1fcG9p
bnRzW2ldLm1vdmUob2Zmc2V0KTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGhFbGVtZW50Ojp0cmFu
c2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpIHsKKyAgICBpbnQgbiA9IG51bUNv
bnRyb2xQb2ludHMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAg
ICBGbG9hdFBvaW50IHAgPSB0Lm1hcFBvaW50KG1fZGF0YS5tX3BvaW50c1tpXSk7CisgICAgICAg
IG1fZGF0YS5tX3BvaW50c1tpXS5zZXQocC54KCksIHAueSgpKTsKKyAgICB9Cit9CisKK3ZvaWQg
UGxhdGZvcm1QYXRoRWxlbWVudDo6aW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShGbG9hdFJlY3QmIHIs
IGNvbnN0IEZsb2F0UG9pbnQmIGxhc3RQb2ludCkgY29uc3QgeworICAgIGlmIChtX3R5cGUgPT0g
UGF0aEFyY1RvKSB7CisgICAgICAgIGNvbnN0IEFyY1RvJiBkYXRhID0gbV9kYXRhLm1fYXJjVG9E
YXRhOworICAgICAgICBQYXRoUG9pbnQgc3RhcnRQb2ludDsKKyAgICAgICAgc3RhcnRQb2ludCA9
IGxhc3RQb2ludDsKKyAgICAgICAgUGF0aFBvaW50IGVuZFBvaW50ID0gZGF0YS5tX2VuZDsKKyAg
ICAgICAgaWYgKCFkYXRhLm1fY2xvY2t3aXNlKQorICAgICAgICAgICAgc3RkOjpzd2FwKHN0YXJ0
UG9pbnQsIGVuZFBvaW50KTsKKworICAgICAgICBpbnQgcTAgPSBxdWFkcmFudChzdGFydFBvaW50
LCBkYXRhLm1fY2VudGVyKTsKKyAgICAgICAgaW50IHExID0gcXVhZHJhbnQoZW5kUG9pbnQsIGRh
dGEubV9jZW50ZXIpOworICAgICAgICBib29sIGNvbnRhaW5zRXh0cmVtZXNbNF0gPSB7IGZhbHNl
IH07IC8vIGJvdHRvbSwgbGVmdCwgdG9wLCByaWdodAorICAgICAgICBzdGF0aWMgY29uc3QgUGF0
aFBvaW50IGV4dHJlbWVWZWN0b3JzWzRdID0geyB7IDAsIDEgfSwgeyAtMSwgMCB9LCB7IDAsIC0x
IH0sIHsgMSwgMCB9IH07CisgICAgICAgIGlmIChxMCA9PSBxMSkgeworICAgICAgICAgICAgaWYg
KHN0YXJ0UG9pbnQubV94ID09IGVuZFBvaW50Lm1feCB8fCBpc1F1YWRyYW50T25Cb3R0b20ocTAp
ICE9IHN0YXJ0UG9pbnQubV94ID4gZW5kUG9pbnQubV94KSB7CisgICAgICAgICAgICAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zRXh0
cmVtZXNbaV0gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgaW50IGV4dHJlbWUgPSBxMDsKKyAgICAgICAgICAgIGludCBkaWZmID0gcXVhZHJhbnRE
aWZmKHExLCBxMCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZmY7ICsraSkg
eworICAgICAgICAgICAgICAgIGNvbnRhaW5zRXh0cmVtZXNbZXh0cmVtZV0gPSB0cnVlOworICAg
ICAgICAgICAgICAgIGV4dHJlbWUgPSBuZXh0UXVhZHJhbnQoZXh0cmVtZSk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIHN0
YXJ0UG9pbnQubV94LCBzdGFydFBvaW50Lm1feSk7CisgICAgICAgIGluZmxhdGVSZWN0VG9Db250
YWluUG9pbnQociwgZW5kUG9pbnQubV94LCBlbmRQb2ludC5tX3kpOworICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5zRXh0cmVtZXNb
aV0pIHsKKyAgICAgICAgICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIGRhdGEu
bV9jZW50ZXIubV94ICsgZGF0YS5tX3JhZGl1cy5tX3ggKiBleHRyZW1lVmVjdG9yc1tpXS5tX3gs
IGRhdGEubV9jZW50ZXIubV95ICsgZGF0YS5tX3JhZGl1cy5tX3kgKiBleHRyZW1lVmVjdG9yc1tp
XS5tX3kpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAg
aW50IG4gPSBudW1Qb2ludHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kp
CisgICAgICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIG1fZGF0YS5tX3BvaW50
c1tpXS5tX3gsIG1fZGF0YS5tX3BvaW50c1tpXS5tX3kpOworICAgIH0KK30KKworUGF0aEVsZW1l
bnRUeXBlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OnR5cGUoKSBjb25zdCB7CisgICAgc3dpdGNoICht
X3R5cGUpIHsKKyAgICAgICAgY2FzZSBQYXRoTW92ZVRvOgorICAgICAgICAgICAgcmV0dXJuIFBh
dGhFbGVtZW50TW92ZVRvUG9pbnQ7CisgICAgICAgIGNhc2UgUGF0aExpbmVUbzoKKyAgICAgICAg
ICAgIHJldHVybiBQYXRoRWxlbWVudEFkZExpbmVUb1BvaW50OworICAgICAgICBjYXNlIFBhdGhB
cmNUbzoKKyAgICAgICAgICAgIC8vIEZJWE1FOiB0aGVyZSdzIG5vIGFyY1RvIHR5cGUgZm9yIFBh
dGhFbGVtZW50CisgICAgICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRMaW5lVG9Qb2ludDsK
KyAgICAgICAgICAgIC8vIHJldHVybiBQYXRoRWxlbWVudEFkZFF1YWRDdXJ2ZVRvUG9pbnQ7Cisg
ICAgICAgIGNhc2UgUGF0aFF1YWRDdXJ2ZVRvOgorICAgICAgICAgICAgcmV0dXJuIFBhdGhFbGVt
ZW50QWRkUXVhZEN1cnZlVG9Qb2ludDsKKyAgICAgICAgY2FzZSBQYXRoQmV6aWVyQ3VydmVUbzoK
KyAgICAgICAgICAgIHJldHVybiBQYXRoRWxlbWVudEFkZEN1cnZlVG9Qb2ludDsKKyAgICAgICAg
Ly9jYXNlIFBhdGhDbG9zZVN1YnBhdGg6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gUGF0aEVsZW1lbnRDbG9zZVN1YnBhdGg7CisgICAgfQorfQorCitQbGF0Zm9ybVBhdGg6
OlBsYXRmb3JtUGF0aCgpCis6IG1fcGVuTGlmdGVkKHRydWUpCit7CisgICAgbV9jdXJyZW50UG9p
bnQuY2xlYXIoKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmVuc3VyZVN1YnBhdGgoKQorewor
ICAgIGlmIChtX3BlbkxpZnRlZCkgeworICAgICAgICBtX3BlbkxpZnRlZCA9IGZhbHNlOworICAg
ICAgICBtX3N1YnBhdGhzLmFwcGVuZChQYXRoUG9seWdvbigpKTsKKyAgICAgICAgbV9zdWJwYXRo
cy5sYXN0KCkuYXBwZW5kKG1fY3VycmVudFBvaW50KTsKKyAgICB9IGVsc2UKKyAgICAgICAgQVNT
RVJUKCFtX3N1YnBhdGhzLmlzRW1wdHkoKSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRU
b1N1YnBhdGgoY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudCYgZSkKK3sKKyAgICBpZiAoZS5wbGF0
Zm9ybVR5cGUoKSA9PSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoTW92ZVRvKSB7CisgICAgICAg
IG1fcGVuTGlmdGVkID0gdHJ1ZTsKKyAgICAgICAgbV9jdXJyZW50UG9pbnQgPSBlLnBvaW50QXQo
MCk7CisgICAgfSBlbHNlIGlmIChlLnBsYXRmb3JtVHlwZSgpID09IFBsYXRmb3JtUGF0aEVsZW1l
bnQ6OlBhdGhDbG9zZVN1YnBhdGgpIHsKKyAgICAgICAgbV9wZW5MaWZ0ZWQgPSB0cnVlOworICAg
ICAgICBpZiAoIW1fc3VicGF0aHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAobV9jdXJy
ZW50UG9pbnQgIT0gbV9zdWJwYXRocy5sYXN0KClbMF0pIHsKKyAgICAgICAgICAgICAgICAvLyBB
Y2NvcmRpbmcgdG8gVzNDLCB3ZSBoYXZlIHRvIGRyYXcgYSBsaW5lIGZyb20gY3VycmVudCBwb2lu
dCB0byB0aGUgaW5pdGlhbCBwb2ludAorICAgICAgICAgICAgICAgIG1fc3VicGF0aHMubGFzdCgp
LmFwcGVuZChtX3N1YnBhdGhzLmxhc3QoKVswXSk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50
UG9pbnQgPSBtX3N1YnBhdGhzLmxhc3QoKVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIGVuc3VyZVN1YnBhdGgoKTsKKyAgICAgICAgc3dpdGNoIChlLnBsYXRmb3JtVHlwZSgp
KSB7CisgICAgICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhMaW5lVG86Cisg
ICAgICAgICAgICAgICAgbV9zdWJwYXRocy5sYXN0KCkuYXBwZW5kKGUucG9pbnRBdCgwKSk7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1l
bnQ6OlBhdGhBcmNUbzoKKyAgICAgICAgICAgICAgICBhZGRBcmNQb2ludHMobV9zdWJwYXRocy5s
YXN0KCksIGUuYXJjVG8oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBj
YXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhRdWFkQ3VydmVUbzoKKyAgICAgICAgICAgICAg
ICB7CisgICAgICAgICAgICAgICAgICAgIFBhdGhQb2ludCBjb250cm9sW10gPSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBtX2N1cnJlbnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAg
IGUucG9pbnRBdCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgxKSwKKyAg
ICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2lj
IG51bWJlcj8KKyAgICAgICAgICAgICAgICAgICAgcXVhZEN1cnZlKDUwLCBtX3N1YnBhdGhzLmxh
c3QoKSwgY29udHJvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQmV6aWVyQ3VydmVU
bzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBhdGhQb2ludCBjb250
cm9sW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRQb2ludCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
IGUucG9pbnRBdCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgyKSwKKyAg
ICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2lj
IG51bWJlcj8KKyAgICAgICAgICAgICAgICAgICAgYmV6aWVyKDEwMCwgbV9zdWJwYXRocy5sYXN0
KCksIGNvbnRyb2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICAgICAgbV9jdXJyZW50UG9pbnQgPSBtX3N1YnBhdGhzLmxhc3QoKS5sYXN0KCk7CisgICAg
fQorfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1l
bnQmIGUpCit7CisgICAgZS5pbmZsYXRlUmVjdFRvQ29udGFpbk1lKG1fYm91bmRpbmdSZWN0LCBs
YXN0UG9pbnQoKSk7CisgICAgYWRkVG9TdWJwYXRoKGUpOworICAgIG1fZWxlbWVudHMuYXBwZW5k
KGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aCYg
cCkKK3sKKyAgICBjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50cyYgZSA9IHAuZWxlbWVudHMoKTsK
KyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVyYXRvciBpdChlLmJlZ2lu
KCkpOyBpdCAhPSBlLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGFkZFRvU3VicGF0aCgqaXQpOwor
ICAgICAgICBpdC0+aW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShtX2JvdW5kaW5nUmVjdCwgbGFzdFBv
aW50KCkpOworICAgICAgICBtX2VsZW1lbnRzLmFwcGVuZCgqaXQpOworICAgIH0KK30KKwordm9p
ZCBQbGF0Zm9ybVBhdGg6OmNsZWFyKCkKK3sgCisgICAgbV9lbGVtZW50cy5jbGVhcigpOyAKKyAg
ICBtX2JvdW5kaW5nUmVjdCA9IEZsb2F0UmVjdCgpOworICAgIG1fc3VicGF0aHMuY2xlYXIoKTsK
KyAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigpOworICAgIG1fcGVuTGlmdGVkID0gdHJ1ZTsKK30K
Kwordm9pZCBQbGF0Zm9ybVBhdGg6OnN0cm9rZVBhdGgoSERDIGRjLCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCogdHIpIGNvbnN0Cit7CisgICAgZHJhd1BvbHlnb25zKGRjLCBtX3N1YnBhdGhz
LCBmYWxzZSwgdHIpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6ZmlsbFBhdGgoSERDIGRjLCBj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogdHIpIGNvbnN0Cit7CisgICAgSEdESU9CSiBvbGRQ
ZW4gPSBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfUEVOKSk7CisgICAgZHJh
d1BvbHlnb25zKGRjLCBtX3N1YnBhdGhzLCB0cnVlLCB0cik7CisgICAgU2VsZWN0T2JqZWN0KGRj
LCBvbGRQZW4pOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6dHJhbnNsYXRlKGNvbnN0IEZsb2F0
U2l6ZSYgc2l6ZSkKK3sKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjppdGVyYXRvciBp
dChtX2VsZW1lbnRzLmJlZ2luKCkpOyBpdCAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2l0KSB7Cisg
ICAgICAgIGl0LT5tb3ZlKHNpemUpOworICAgIH0KKworICAgIG1fYm91bmRpbmdSZWN0Lm1vdmUo
c2l6ZSk7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvbHlnb24+OjppdGVyYXRvciBpdCA9IG1fc3Vi
cGF0aHMuYmVnaW4oKTsgaXQgIT0gbV9zdWJwYXRocy5lbmQoKTsgKytpdCkgeworICAgICAgICBp
dC0+bW92ZShzaXplKTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjp0cmFuc2Zvcm0o
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpCit7CisgICAgZm9yIChQbGF0Zm9ybVBhdGhF
bGVtZW50czo6aXRlcmF0b3IgaXQobV9lbGVtZW50cy5iZWdpbigpKTsgaXQgIT0gbV9lbGVtZW50
cy5lbmQoKTsgKytpdCkgeworICAgICAgICBpdC0+dHJhbnNmb3JtKHQpOworICAgIH0KKyAgICBt
X2JvdW5kaW5nUmVjdCA9IHQubWFwUmVjdChtX2JvdW5kaW5nUmVjdCk7CisgICAgZm9yIChWZWN0
b3I8UGF0aFBvbHlnb24+OjppdGVyYXRvciBpdCA9IG1fc3VicGF0aHMuYmVnaW4oKTsgaXQgIT0g
bV9zdWJwYXRocy5lbmQoKTsgKytpdCkgeworICAgICAgICBpdC0+dHJhbnNmb3JtKHQpOworICAg
IH0KK30KKworYm9vbCBQbGF0Zm9ybVBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAoreworICAgIC8vIG9wdGltaXphdGlvbjogY2hlY2sg
dGhlIGJvdW5kaW5nIHJlY3QgZmlyc3QKKyAgICBpZiAoIWNvbnRhaW5zUG9pbnQobV9ib3VuZGlu
Z1JlY3QsIHBvaW50KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9y
IChWZWN0b3I8UGF0aFBvbHlnb24+Ojpjb25zdF9pdGVyYXRvciBpID0gbV9zdWJwYXRocy5iZWdp
bigpOyBpICE9IG1fc3VicGF0aHMuZW5kKCk7ICsraSkgeworICAgICAgICBpZiAoaS0+Y29udGFp
bnMocG9pbnQpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJu
IGZhbHNlOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50KQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6Ok1vdmVUbyBkYXRhID0geyB7IHBv
aW50LngoKSwgcG9pbnQueSgpIH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEp
OworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRMaW5lVG8oY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6TGluZVRv
IGRhdGEgPSB7IHsgcG9pbnQueCgpLCBwb2ludC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVs
ZW1lbnQgcGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6
OmFkZFF1YWRDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNwLCBjb25zdCBGbG9hdFBvaW50JiBw
KQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlF1YWRDdXJ2ZVRvIGRhdGEgPSB7IHsgY3Au
eCgpLCBjcC55KCkgfSwgeyBwLngoKSwgcC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1l
bnQgcGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFk
ZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AxLCBjb25zdCBGbG9hdFBvaW50JiBj
cDIsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QmV6
aWVyQ3VydmVUbyBkYXRhID0geyB7IGNwMS54KCksIGNwMS55KCkgfSwgeyBjcDIueCgpLCBjcDIu
eSgpIH0sIHsgcC54KCksIHAueSgpIH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRh
dGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRBcmNUbyhj
b25zdCBGbG9hdFBvaW50JiBmcDEsIGNvbnN0IEZsb2F0UG9pbnQmIGZwMiwgZmxvYXQgcmFkaXVz
KQoreworICAgIGNvbnN0IFBhdGhQb2ludCYgcDAgPSBtX2N1cnJlbnRQb2ludDsKKyAgICBQYXRo
UG9pbnQgcDE7CisgICAgcDEgPSBmcDE7CisgICAgUGF0aFBvaW50IHAyOworICAgIHAyID0gZnAy
OworICAgIGlmICghcmFkaXVzIHx8IHAwID09IHAxIHx8IHAxID09IHAyKSB7CisgICAgICAgIGFk
ZExpbmVUbyhwMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQYXRoVmVjdG9yIHYw
MSA9IHAwIC0gcDE7CisgICAgUGF0aFZlY3RvciB2MjEgPSBwMiAtIHAxOworCisgICAgLy8gc2lu
KEEgLSBCKSA9IHNpbihBKSAqIGNvcyhCKSAtIHNpbihCKSAqIGNvcyhBKQorICAgIGRvdWJsZSBj
cm9zcyA9IHYwMS5tX3ggKiB2MjEubV95IC0gdjAxLm1feSAqIHYyMS5tX3g7CisKKyAgICBpZiAo
ZmFicyhjcm9zcykgPCAxRS0xMCkgeworICAgICAgICAvLyBvbiBvbmUgbGluZQorICAgICAgICBh
ZGRMaW5lVG8ocDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG91YmxlIGQwMSA9
IHYwMS5sZW5ndGgoKTsKKyAgICBkb3VibGUgZDIxID0gdjIxLmxlbmd0aCgpOworICAgIGRvdWJs
ZSBhbmdsZSA9IChQSSAtIGFicyhhc2luKGNyb3NzIC8gKGQwMSAqIGQyMSkpKSkgKiAwLjU7Cisg
ICAgZG91YmxlIHNwYW4gPSByYWRpdXMgKiB0YW4oYW5nbGUpOworICAgIGRvdWJsZSByYXRlID0g
c3BhbiAvIGQwMTsKKyAgICBQYXRoUG9pbnQgc3RhcnRQb2ludDsKKyAgICBzdGFydFBvaW50Lm1f
eCA9IHAxLm1feCArIHYwMS5tX3ggKiByYXRlOworICAgIHN0YXJ0UG9pbnQubV95ID0gcDEubV95
ICsgdjAxLm1feSAqIHJhdGU7CisKKyAgICBhZGRMaW5lVG8oc3RhcnRQb2ludCk7CisKKyAgICBQ
YXRoUG9pbnQgZW5kUG9pbnQ7CisgICAgcmF0ZSA9IHNwYW4gLyBkMjE7CisgICAgZW5kUG9pbnQu
bV94ID0gcDEubV94ICsgdjIxLm1feCAqIHJhdGU7CisgICAgZW5kUG9pbnQubV95ID0gcDEubV95
ICsgdjIxLm1feSAqIHJhdGU7CisKKyAgICBQYXRoUG9pbnQgbWlkUG9pbnQ7CisgICAgbWlkUG9p
bnQubV94ID0gKHN0YXJ0UG9pbnQubV94ICsgZW5kUG9pbnQubV94KSAqIDAuNTsKKyAgICBtaWRQ
b2ludC5tX3kgPSAoc3RhcnRQb2ludC5tX3kgKyBlbmRQb2ludC5tX3kpICogMC41OworCisgICAg
UGF0aFZlY3RvciB2bTEgPSBtaWRQb2ludCAtIHAxOworICAgIGRvdWJsZSBkbTEgPSB2bTEubGVu
Z3RoKCk7CisgICAgZG91YmxlIGQgPSBfaHlwb3QocmFkaXVzLCBzcGFuKTsKKworICAgIFBhdGhQ
b2ludCBjZW50ZXJQb2ludDsKKyAgICByYXRlID0gZCAvIGRtMTsKKyAgICBjZW50ZXJQb2ludC5t
X3ggPSBwMS5tX3ggKyB2bTEubV94ICogcmF0ZTsKKyAgICBjZW50ZXJQb2ludC5tX3kgPSBwMS5t
X3kgKyB2bTEubV95ICogcmF0ZTsKKworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvIGRh
dGEgPSB7CisgICAgICAgIGVuZFBvaW50LAorICAgICAgICBjZW50ZXJQb2ludCwgCisgICAgICAg
IHsgcmFkaXVzLCByYWRpdXMgfSwKKyAgICAgICAgY3Jvc3MgPCAwCisgICAgfTsKKyAgICBQbGF0
Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1QYXRoOjpjbG9zZVN1YnBhdGgoKQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGU7
CisgICAgYXBwZW5kKHBlKTsKK30KKworLy8gYWRkIGEgY2lyY3VsYXIgYXJjIGNlbnRyZWQgYXQg
cCB3aXRoIHJhZGl1cyByIGZyb20gc3RhcnQgYW5nbGUgc2FyIChyYWRpYW5zKSB0byBlbmQgYW5n
bGUgZWFyCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkRWxsaXBzZShjb25zdCBGbG9hdFBvaW50JiBw
LCBmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBzYXIsIGZsb2F0IGVhciwgYm9vbCBhbnRpY2xvY2t3
aXNlKQoreworICAgIGZsb2F0IHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZOworCisgICAgbm9y
bWFsaXplQW5nbGUoc2FyKTsKKyAgICBub3JtYWxpemVBbmdsZShlYXIpOworCisgICAgZ2V0RWxs
aXBzZVBvaW50QnlBbmdsZShzYXIsIGEsIGIsIHN0YXJ0WCwgc3RhcnRZKTsKKyAgICBnZXRFbGxp
cHNlUG9pbnRCeUFuZ2xlKGVhciwgYSwgYiwgZW5kWCwgZW5kWSk7CisKKyAgICB0cmFuc2Zvcm1B
cmNQb2ludChzdGFydFgsIHN0YXJ0WSwgcCk7CisgICAgdHJhbnNmb3JtQXJjUG9pbnQoZW5kWCwg
ZW5kWSwgcCk7CisKKyAgICBGbG9hdFBvaW50IHN0YXJ0KHN0YXJ0WCwgc3RhcnRZKTsKKyAgICBt
b3ZlVG8oc3RhcnQpOworCisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QXJjVG8gZGF0YSA9IHsg
eyBlbmRYLCBlbmRZIH0sIHsgcC54KCksIHAueSgpIH0sICB7IGEsIGIgfSwgIWFudGljbG9ja3dp
c2UgfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7
Cit9CisKKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQor
eworICAgIG1vdmVUbyhyLmxvY2F0aW9uKCkpOworCisgICAgZmxvYXQgcmlnaHQgPSByLnJpZ2h0
KCkgLSAxOworICAgIGZsb2F0IGJvdHRvbSA9IHIuYm90dG9tKCkgLSAxOworICAgIGFkZExpbmVU
byhGbG9hdFBvaW50KHJpZ2h0LCByLnkoKSkpOworICAgIGFkZExpbmVUbyhGbG9hdFBvaW50KHJp
Z2h0LCBib3R0b20pKTsKKyAgICBhZGRMaW5lVG8oRmxvYXRQb2ludChyLngoKSwgYm90dG9tKSk7
CisgICAgYWRkTGluZVRvKHIubG9jYXRpb24oKSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjph
ZGRFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICBGbG9hdFNpemUgcmFkaXVzKHIu
d2lkdGgoKSAqIDAuNSwgci5oZWlnaHQoKSAqIDAuNSk7CisgICAgYWRkRWxsaXBzZShyLmxvY2F0
aW9uKCkgKyByYWRpdXMsIHJhZGl1cy53aWR0aCgpLCByYWRpdXMuaGVpZ2h0KCksIDAsIDAsIHRy
dWUpOworfQorCitTdHJpbmcgUGxhdGZvcm1QYXRoOjpkZWJ1Z1N0cmluZygpIGNvbnN0Cit7Cisg
ICAgU3RyaW5nIHJldDsKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVy
YXRvciBpKG1fZWxlbWVudHMuYmVnaW4oKSk7IGkgIT0gbV9lbGVtZW50cy5lbmQoKTsgKytpKSB7
CisgICAgICAgIHN3aXRjaCAoaS0+cGxhdGZvcm1UeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2Ug
UGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aE1vdmVUbzoKKyAgICAgICAgICAgIGNhc2UgUGxhdGZv
cm1QYXRoRWxlbWVudDo6UGF0aExpbmVUbzoKKyAgICAgICAgICAgICAgICByZXQgKz0gU3RyaW5n
Ojpmb3JtYXQoIk0gJWYgJWZcbiIsIGktPnBvaW50QXQoMCkubV94LCBpLT5wb2ludEF0KDApLm1f
eSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBsYXRmb3JtUGF0
aEVsZW1lbnQ6OlBhdGhBcmNUbzoKKyAgICAgICAgICAgICAgICByZXQgKz0gU3RyaW5nOjpmb3Jt
YXQoIkEgJWYgJWYgJWYgJWYgJWYgJWYgJWNcbiIKKyAgICAgICAgICAgICAgICAgICAgLCBpLT5h
cmNUbygpLm1fZW5kLm1feCwgaS0+YXJjVG8oKS5tX2VuZC5tX3kKKyAgICAgICAgICAgICAgICAg
ICAgLCBpLT5hcmNUbygpLm1fY2VudGVyLm1feCwgaS0+YXJjVG8oKS5tX2NlbnRlci5tX3kKKyAg
ICAgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fcmFkaXVzLm1feCwgaS0+YXJjVG8oKS5t
X3JhZGl1cy5tX3kKKyAgICAgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fY2xvY2t3aXNl
PyAnWScgOiAnTicpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQ
bGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoUXVhZEN1cnZlVG86CisgICAgICAgICAgICAgICAgcmV0
ICs9IFN0cmluZzo6Zm9ybWF0KCJRICVmICVmICVmICVmXG4iCisgICAgICAgICAgICAgICAgICAg
ICwgaS0+cG9pbnRBdCgwKS5tX3gsIGktPnBvaW50QXQoMCkubV95CisgICAgICAgICAgICAgICAg
ICAgICwgaS0+cG9pbnRBdCgxKS5tX3gsIGktPnBvaW50QXQoMSkubV95KTsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aEJl
emllckN1cnZlVG86CisgICAgICAgICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJCICVm
ICVmICVmICVmICVmICVmXG4iCisgICAgICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgwKS5t
X3gsIGktPnBvaW50QXQoMCkubV95CisgICAgICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgx
KS5tX3gsIGktPnBvaW50QXQoMSkubV95CisgICAgICAgICAgICAgICAgICAgICwgaS0+cG9pbnRB
dCgyKS5tX3gsIGktPnBvaW50QXQoMikubV95KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aENsb3NlU3VicGF0aDoKKyAg
ICAgICAgICAgICAgICByZXQgKz0gIlNcbiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6
YXBwbHkodm9pZCogaW5mbywgUGF0aEFwcGxpZXJGdW5jdGlvbiBmdW5jdGlvbikgY29uc3QKK3sK
KyAgICBQYXRoRWxlbWVudCBwZWxlbWVudDsKKyAgICBGbG9hdFBvaW50IHBvaW50c1szXTsKKyAg
ICBwZWxlbWVudC5wb2ludHMgPSBwb2ludHM7CisKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1l
bnRzOjpjb25zdF9pdGVyYXRvciBpdChtX2VsZW1lbnRzLmJlZ2luKCkpOyBpdCAhPSBtX2VsZW1l
bnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHBlbGVtZW50LnR5cGUgPSBpdC0+dHlwZSgpOwor
ICAgICAgICBpbnQgbiA9IGl0LT5udW1Qb2ludHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBuOyArK2kpCisgICAgICAgICAgICBwb2ludHNbaV0gPSBpdC0+cG9pbnRBdChpKTsKKyAg
ICAgICAgZnVuY3Rpb24oaW5mbywgJnBlbGVtZW50KTsKKyAgICB9Cit9CisKKworfSAvLyBuYW1l
c3BhY2UgV2ViY29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9QbGF0Zm9ybVBhdGhXaW5jZS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Q
bGF0Zm9ybVBhdGhXaW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdk
ZGQ5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L1BsYXRmb3JtUGF0aFdpbmNlLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBQbGF0Zm9y
bVBhdGhXaW5jZV9oCisjZGVmaW5lIFBsYXRmb3JtUGF0aFdpbmNlX2gKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OworCisgICAgc3RydWN0IFBhdGhQ
b2ludCB7CisgICAgICAgIGZsb2F0IG1feDsKKyAgICAgICAgZmxvYXQgbV95OworICAgICAgICBj
b25zdCBmbG9hdCYgeCgpIGNvbnN0IHsgcmV0dXJuIG1feDsgfQorICAgICAgICBjb25zdCBmbG9h
dCYgeSgpIGNvbnN0IHsgcmV0dXJuIG1feTsgfQorICAgICAgICB2b2lkIHNldChmbG9hdCB4LCBm
bG9hdCB5KSB7IG1feCA9IHg7IG1feSA9IHk7IH07CisgICAgICAgIG9wZXJhdG9yIEZsb2F0UG9p
bnQoKSBjb25zdCB7IHJldHVybiBGbG9hdFBvaW50KG1feCwgbV95KTsgfQorICAgICAgICB2b2lk
IG1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpIHsgbV94ICs9IG9mZnNldC53aWR0aCgpOyBt
X3kgKz0gb2Zmc2V0LmhlaWdodCgpOyB9CisgICAgICAgIFBhdGhQb2ludCYgb3BlcmF0b3I9KGNv
bnN0IEZsb2F0UG9pbnQmIHApIHsgbV94ID0gcC54KCk7IG1feSA9IHAueSgpOyByZXR1cm4gKnRo
aXM7IH0KKyAgICAgICAgdm9pZCBjbGVhcigpIHsgbV94ID0gbV95ID0gMDsgfQorICAgIH07CisK
KyAgICBzdHJ1Y3QgUGF0aFBvbHlnb246IHB1YmxpYyBWZWN0b3I8UGF0aFBvaW50PiB7CisgICAg
ICAgIHZvaWQgbW92ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCk7CisgICAgICAgIHZvaWQgdHJh
bnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICAgICAgYm9vbCBjb250
YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3Q7CisgICAgfTsKKworICAgIGNsYXNz
IFBsYXRmb3JtUGF0aEVsZW1lbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBQbGFmb3Jt
UGF0aEVsZW1lbnRUeXBlIHsKKyAgICAgICAgICAgIFBhdGhNb3ZlVG8sCisgICAgICAgICAgICBQ
YXRoTGluZVRvLAorICAgICAgICAgICAgUGF0aEFyY1RvLAorICAgICAgICAgICAgUGF0aFF1YWRD
dXJ2ZVRvLAorICAgICAgICAgICAgUGF0aEJlemllckN1cnZlVG8sCisgICAgICAgICAgICBQYXRo
Q2xvc2VTdWJwYXRoLAorICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBNb3ZlVG8geworICAg
ICAgICAgICAgUGF0aFBvaW50IG1fZW5kOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBM
aW5lVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fZW5kOworICAgICAgICB9OworCisgICAg
ICAgIHN0cnVjdCBBcmNUbyB7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9lbmQ7CisgICAgICAg
ICAgICBQYXRoUG9pbnQgbV9jZW50ZXI7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9yYWRpdXM7
CisgICAgICAgICAgICBib29sIG1fY2xvY2t3aXNlOworICAgICAgICB9OworCisgICAgICAgIHN0
cnVjdCBRdWFkQ3VydmVUbyB7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDA7CisgICAg
ICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDE7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0
IEJlemllckN1cnZlVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQwOworICAgICAg
ICAgICAgUGF0aFBvaW50IG1fcG9pbnQxOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQy
OworICAgICAgICB9OworCisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoKTogbV90eXBlKFBh
dGhDbG9zZVN1YnBhdGgpIHsgbV9kYXRhLm1fcG9pbnRzWzBdLnNldCgwLCAwKTsgICAgfQorICAg
ICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IE1vdmVUbyYgZGF0YSk6IG1fdHlwZShQYXRo
TW92ZVRvKSB7IG1fZGF0YS5tX21vdmVUb0RhdGEgPSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3Jt
UGF0aEVsZW1lbnQoY29uc3QgTGluZVRvJiBkYXRhKTogbV90eXBlKFBhdGhMaW5lVG8pIHsgbV9k
YXRhLm1fbGluZVRvRGF0YSA9IGRhdGE7IH0KKyAgICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudChj
b25zdCBBcmNUbyYgZGF0YSk6IG1fdHlwZShQYXRoQXJjVG8pIHsgbV9kYXRhLm1fYXJjVG9EYXRh
ID0gZGF0YTsgfQorICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IFF1YWRDdXJ2ZVRv
JiBkYXRhKTogbV90eXBlKFBhdGhRdWFkQ3VydmVUbykgeyBtX2RhdGEubV9xdWFkQ3VydmVUb0Rh
dGEgPSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgQmV6aWVyQ3Vy
dmVUbyYgZGF0YSk6IG1fdHlwZShQYXRoQmV6aWVyQ3VydmVUbykgeyBtX2RhdGEubV9iZXppZXJD
dXJ2ZVRvRGF0YSA9IGRhdGE7IH0KKworICAgICAgICBjb25zdCBNb3ZlVG8mIG1vdmVUbygpIGNv
bnN0IHsgcmV0dXJuIG1fZGF0YS5tX21vdmVUb0RhdGE7IH0KKyAgICAgICAgY29uc3QgTGluZVRv
JiBsaW5lVG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9saW5lVG9EYXRhOyB9CisgICAgICAg
IGNvbnN0IEFyY1RvJiBhcmNUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX2FyY1RvRGF0YTsg
fQorICAgICAgICBjb25zdCBRdWFkQ3VydmVUbyYgcXVhZEN1cnZlVG8oKSBjb25zdCB7IHJldHVy
biBtX2RhdGEubV9xdWFkQ3VydmVUb0RhdGE7IH0KKyAgICAgICAgY29uc3QgQmV6aWVyQ3VydmVU
byYgYmV6aWVyQ3VydmVUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX2JlemllckN1cnZlVG9E
YXRhOyB9CisgICAgICAgIGNvbnN0IFBhdGhQb2ludCYgbGFzdFBvaW50KCkgY29uc3QgeyBpbnQg
biA9IG51bVBvaW50cygpOyByZXR1cm4gbiA+IDEgPyBtX2RhdGEubV9wb2ludHNbbiAtIDFdIDog
bV9kYXRhLm1fcG9pbnRzWzBdOyB9CisgICAgICAgIGNvbnN0IFBhdGhQb2ludCYgcG9pbnRBdChp
bnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX3BvaW50c1tpbmRleF07IH0KKyAgICAg
ICAgaW50IG51bVBvaW50cygpIGNvbnN0OworICAgICAgICBpbnQgbnVtQ29udHJvbFBvaW50cygp
IGNvbnN0OworICAgICAgICB2b2lkIG1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpOworICAg
ICAgICB2b2lkIHRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisgICAg
ICAgIFBhdGhFbGVtZW50VHlwZSB0eXBlKCkgY29uc3Q7CisgICAgICAgIFBsYWZvcm1QYXRoRWxl
bWVudFR5cGUgcGxhdGZvcm1UeXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9CisgICAgICAg
IHZvaWQgaW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9p
bnQmIGxhc3RQb2ludCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBQbGFmb3JtUGF0
aEVsZW1lbnRUeXBlIG1fdHlwZTsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgTW92ZVRv
IG1fbW92ZVRvRGF0YTsKKyAgICAgICAgICAgIExpbmVUbyBtX2xpbmVUb0RhdGE7CisgICAgICAg
ICAgICBBcmNUbyBtX2FyY1RvRGF0YTsKKyAgICAgICAgICAgIFF1YWRDdXJ2ZVRvIG1fcXVhZEN1
cnZlVG9EYXRhOworICAgICAgICAgICAgQmV6aWVyQ3VydmVUbyBtX2JlemllckN1cnZlVG9EYXRh
OworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnRzWzRdOworICAgICAgICB9IG1fZGF0YTsK
KyAgICB9OworCisgICAgdHlwZWRlZiBWZWN0b3I8UGxhdGZvcm1QYXRoRWxlbWVudD4gUGxhdGZv
cm1QYXRoRWxlbWVudHM7CisKKyAgICBjbGFzcyBQbGF0Zm9ybVBhdGggeworICAgIHB1YmxpYzoK
KyAgICAgICAgUGxhdGZvcm1QYXRoKCk7CisgICAgICAgIGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1l
bnRzJiBlbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudHM7IH0KKyAgICAgICAgdm9p
ZCBhcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudCYgZSk7CisgICAgICAgIHZvaWQgYXBw
ZW5kKGNvbnN0IFBsYXRmb3JtUGF0aCYgcCk7CisgICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAg
ICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50cy5pc0VtcHR5KCk7IH0K
KworICAgICAgICB2b2lkIHN0cm9rZVBhdGgoSERDLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCogdHIpIGNvbnN0OworICAgICAgICB2b2lkIGZpbGxQYXRoKEhEQywgY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgqIHRyKSBjb25zdDsKKyAgICAgICAgRmxvYXRQb2ludCBsYXN0UG9pbnQoKSBj
b25zdCB7IHJldHVybiBtX2VsZW1lbnRzLmlzRW1wdHkoKSA/IEZsb2F0UG9pbnQoMCwwKSA6IG1f
ZWxlbWVudHMubGFzdCgpLmxhc3RQb2ludCgpOyB9CisKKyAgICAgICAgY29uc3QgRmxvYXRSZWN0
JiBib3VuZGluZ1JlY3QoKSBjb25zdCB7IHJldHVybiBtX2JvdW5kaW5nUmVjdDsgfQorICAgICAg
ICBib29sIGNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBj
b25zdDsKKyAgICAgICAgdm9pZCB0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXplJiBzaXplKTsKKyAg
ICAgICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpOworCisg
ICAgICAgIHZvaWQgbW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICAgICAgdm9pZCBhZGRM
aW5lVG8oY29uc3QgRmxvYXRQb2ludCYpOworICAgICAgICB2b2lkIGFkZFF1YWRDdXJ2ZVRvKGNv
bnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludCwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpOwor
ICAgICAgICB2b2lkIGFkZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY29udHJvbFBv
aW50MSwgY29uc3QgRmxvYXRQb2ludCYgY29udHJvbFBvaW50MiwgY29uc3QgRmxvYXRQb2ludCYp
OworICAgICAgICB2b2lkIGFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmLCBjb25zdCBGbG9hdFBv
aW50JiwgZmxvYXQgcmFkaXVzKTsKKyAgICAgICAgdm9pZCBjbG9zZVN1YnBhdGgoKTsKKyAgICAg
ICAgdm9pZCBhZGRFbGxpcHNlKGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0IGEsIGZsb2F0IGIs
IGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9ja3dpc2UpOworICAgICAgICB2b2lk
IGFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKTsKKyAgICAgICAgdm9pZCBhZGRFbGxpcHNlKGNv
bnN0IEZsb2F0UmVjdCYgcik7CisgICAgICAgIFN0cmluZyBkZWJ1Z1N0cmluZygpIGNvbnN0Owor
ICAgICAgICB2b2lkIGFwcGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24gZnVuY3Rp
b24pIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBlbnN1cmVTdWJwYXRoKCk7
CisgICAgICAgIHZvaWQgYWRkVG9TdWJwYXRoKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQmIGUp
OworCisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnRzIG1fZWxlbWVudHM7CisgICAgICAgIEZs
b2F0UmVjdCBtX2JvdW5kaW5nUmVjdDsKKyAgICAgICAgVmVjdG9yPFBhdGhQb2x5Z29uPiBtX3N1
YnBhdGhzOworICAgICAgICBQYXRoUG9pbnQgbV9jdXJyZW50UG9pbnQ7CisgICAgICAgIGJvb2wg
bV9wZW5MaWZ0ZWQ7CisgICAgfTsKKworfQorCisjZW5kaWYgLy8gUGxhdGZvcm1QYXRoV2luY2Vf
aApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRt
YXAuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZThmNDkKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5jcHAK
QEAgLTAsMCArMSw3MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBN
b2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3aWxsIGJlIHVzZWZ1bCwK
KyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNoYXJlZEJpdG1hcC5oIgor
CisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NUeXBlcy5o
IgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hT
ZXQuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworI2lmbmRlZiBOREVCVUcKK3N0cnVjdCBTaGFyZWRCaXRt
YXBMZWFrQ291bnRlciB7CisgICAgflNoYXJlZEJpdG1hcExlYWtDb3VudGVyKCk7Cit9Oworc3Rh
dGljIFNoYXJlZEJpdG1hcExlYWtDb3VudGVyIHNoYXJlZEJpdG1hcExlYWtDb3VudGVyOworI2Vu
ZGlmCisKK3R5cGVkZWYgSGFzaFNldDxTaGFyZWRCaXRtYXAqPiBCaXRtYXBNYXA7CitCaXRtYXBN
YXAgZ19iaXRtYXBNYXA7CisKKyNpZm5kZWYgTkRFQlVHCitTaGFyZWRCaXRtYXBMZWFrQ291bnRl
cjo6flNoYXJlZEJpdG1hcExlYWtDb3VudGVyKCkKK3sKKyAgICBpZiAoIWdfYml0bWFwTWFwLmlz
RW1wdHkoKSkKKyAgICAgICAgcHJpbnRmKCJcbkxFQUs6ICV1ICVzXG5cbiIsIGdfYml0bWFwTWFw
LnNpemUoKSwgIlNoYXJlZEJpdG1hcCBvYmplY3RzIik7Cit9CisjZW5kaWYKKworc3RhdGljIFNo
YXJlZEJpdG1hcDo6RHJhd1BhdHRlcm5GdW5jIGdfZHJhd1BhdHRlcm4gPSAwOworc3RhdGljIFNo
YXJlZEJpdG1hcDo6RHJhd0ltYWdlRnVuYyBnX2RyYXdJbWFnZSA9IDA7CisKK3N0YXRpYyBpbmxp
bmUgaW50IHN0YWJsZVJvdW5kKGRvdWJsZSBkKQoreworICAgIGlmIChkID4gMCkKKyAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCArIDAuNSk7CisKKyAgICBpbnQgaSA9IHN0YXRpY19j
YXN0PGludD4oZCk7CisgICAgcmV0dXJuIGkgLSBkID4gMC41ID8gaSAtIDEgOiBpOworfQorCitT
aGFyZWRCaXRtYXA6OkRyYXdJbWFnZUZ1bmMgU2hhcmVkQml0bWFwOjpzZXREcmF3SW1hZ2VGdW5j
KERyYXdJbWFnZUZ1bmMgZnVuYykKK3sKKyAgICBEcmF3SW1hZ2VGdW5jIG9sZEZ1bmMgPSBnX2Ry
YXdJbWFnZTsKKyAgICBnX2RyYXdJbWFnZSA9IGZ1bmM7CisgICAgcmV0dXJuIG9sZEZ1bmM7Cit9
CisKK1NoYXJlZEJpdG1hcDo6RHJhd1BhdHRlcm5GdW5jIFNoYXJlZEJpdG1hcDo6c2V0RHJhd1Bh
dHRlcm5GdW5jKERyYXdQYXR0ZXJuRnVuYyBmdW5jKQoreworICAgIERyYXdQYXR0ZXJuRnVuYyBv
bGRGdW5jID0gZ19kcmF3UGF0dGVybjsKKyAgICBnX2RyYXdQYXR0ZXJuID0gZnVuYzsKKyAgICBy
ZXR1cm4gb2xkRnVuYzsKK30KKworUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJlZEJpdG1h
cDo6Y3JlYXRlSW5zdGFuY2UoYm9vbCBpczE2Yml0LCBpbnQgdywgaW50IGgsIGJvb2wgaW5pdFBp
eGVscykKK3sKKyAgICBTaGFyZWRCaXRtYXAqIHJ0biA9IG5ldyBTaGFyZWRCaXRtYXAoaXMxNmJp
dCwgdywgaCwgaW5pdFBpeGVscyk7CisgICAgaWYgKHJ0biAmJiAhcnRuLT5ieXRlcygpKSB7Cisg
ICAgICAgIGRlbGV0ZSBydG47CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4g
YWRvcHRSZWYocnRuKTsKK30KKworU2hhcmVkQml0bWFwOjpTaGFyZWRCaXRtYXAoY29uc3QgQml0
bWFwSW5mbyYgYm1wSW5mbywgSEJJVE1BUCBoYm1wLCB2b2lkKiBwaXhlbHMpCis6IG1fYm1wSW5m
byhibXBJbmZvKQorLCBtX2xvY2tlZChmYWxzZSkKKywgbV91c2VzVHJhbnNwYXJlbnRDb2xvcihm
YWxzZSkKKywgbV90cmFuc3BhcmVudENvbG9yKFJHQigwLCAwLCAwKSkKKywgbV9waXhlbHMocGl4
ZWxzKQorLCBtX2hiaXRtYXAoaGJtcCkKKywgbV9oYXNBbHBoYShmYWxzZSkKKywgbV92YWxpZEhl
aWdodChibXBJbmZvLmhlaWdodCgpKQoreworICAgIGdfYml0bWFwTWFwLmFkZCh0aGlzKTsKK30K
KworU2hhcmVkQml0bWFwOjpTaGFyZWRCaXRtYXAoYm9vbCBfaXMxNmJpdCwgaW50IHcsIGludCBo
LCBib29sIGluaXRQaXhlbHMpCis6IG1fYm1wSW5mbyhfaXMxNmJpdCwgdywgaCkKKywgbV9yZWZl
cmVuY2UoMSkKKywgbV9sb2NrZWQoZmFsc2UpCissIG1fdXNlc1RyYW5zcGFyZW50Q29sb3IoZmFs
c2UpCissIG1fdHJhbnNwYXJlbnRDb2xvcihSR0IoMCwgMCwgMCkpCissIG1fcGl4ZWxzKDApCiss
IG1faGFzQWxwaGEoZmFsc2UpCissIG1fdmFsaWRIZWlnaHQoYWJzKGgpKQorLCBtX2hiaXRtYXAo
MCkKK3sKKyAgICBnX2JpdG1hcE1hcC5hZGQodGhpcyk7CisKKyAgICB1bnNpZ25lZCBidWZmZXJT
aXplID0gbV9ibXBJbmZvLm51bVBpeGVscygpOworICAgIGlmIChfaXMxNmJpdCkKKyAgICAgICAg
YnVmZmVyU2l6ZSAvPSAyOworCisgICAgbV9waXhlbHMgPSBuZXcgdW5zaWduZWQgW2J1ZmZlclNp
emVdOworCisgICAgaWYgKGluaXRQaXhlbHMpCisgICAgICAgIHJlc2V0UGl4ZWxzKCk7Cit9CitT
aGFyZWRCaXRtYXA6On5TaGFyZWRCaXRtYXAoKQoreworICAgIGdfYml0bWFwTWFwLnJlbW92ZSh0
aGlzKTsKKyAgICBpZiAobV9oYml0bWFwKQorICAgICAgICBEZWxldGVPYmplY3QobV9oYml0bWFw
KTsKKyAgICBlbHNlCisgICAgICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworfQorCit2b2lkIFNoYXJl
ZEJpdG1hcDo6cmVzZXRQaXhlbHMoYm9vbCBibGFjaykKK3sKKyAgICBpZiAobV9waXhlbHMpIHsK
KyAgICAgICAgdW5zaWduZWQgYnVmZmVyU2l6ZSA9IG1fYm1wSW5mby5udW1QaXhlbHMoKTsKKyAg
ICAgICAgaWYgKGJsYWNrKQorICAgICAgICAgICAgbWVtc2V0KG1fcGl4ZWxzLCAwLCBidWZmZXJT
aXplICogKGlzMTZiaXQoKSA/IDIgOiA0KSk7CisgICAgICAgIGVsc2UgaWYgKGlzMTZiaXQoKSkg
eworICAgICAgICAgICAgLy8gRmlsbCBpdCB3aXRoIHdoaXRlIGNvbG9yCisjaWYgSU1BR0VfTk9f
QUxQSEFfVVNFX1JHQjU1NQorICAgICAgICAgICAgd21lbXNldCgod2NoYXJfdCopbV9waXhlbHMs
IDB4N0ZGRiwgYnVmZmVyU2l6ZSk7CisjZWxzZQorICAgICAgICAgICAgd21lbXNldCgod2NoYXJf
dCopbV9waXhlbHMsIDB4RkZGRiwgYnVmZmVyU2l6ZSk7CisjZW5kaWYKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIC8vIE1ha2UgaXQgd2hpdGUgYnV0IHRyYW5zcGFyZW50CisgICAgICAg
ICAgICB1bnNpZ25lZCogcGl4ZWwgPSAodW5zaWduZWQqKW1fcGl4ZWxzOworICAgICAgICAgICAg
Y29uc3QgdW5zaWduZWQqIGNvbnN0IGJ1ZmZlckVuZCA9IHBpeGVsICsgYnVmZmVyU2l6ZTsKKyAg
ICAgICAgICAgIHdoaWxlIChwaXhlbCA8IGJ1ZmZlckVuZCkgeworICAgICAgICAgICAgICAgICpw
aXhlbCsrID0gMHgwMEZGRkZGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30K
Kworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBjb252ZXJ0MzJUbzE2KHVuc2lnbmVkIHBp
eGVsKQoreworI2lmIElNQUdFX05PX0FMUEhBX1VTRV9SR0I1NTUKKyAgICB1bnNpZ25lZCBzaG9y
dCByID0gdW5zaWduZWQgc2hvcnQoKHBpeGVsICYgMHgwMEY4MDAwMCkgPj4gOSk7CisgICAgdW5z
aWduZWQgc2hvcnQgZyA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAmIDB4MDAwMEY4MDApID4+IDYp
OworICAgIHVuc2lnbmVkIHNob3J0IGIgPSB1bnNpZ25lZCBzaG9ydCgocGl4ZWwgJiAweDAwMDAw
MEY4KSA+PiAzKTsKKyNlbHNlIC8vIFJHQjU2NQorICAgIHVuc2lnbmVkIHNob3J0IHIgPSB1bnNp
Z25lZCBzaG9ydCgocGl4ZWwgJiAweDAwRjgwMDAwKSA+PiA4KTsKKyAgICB1bnNpZ25lZCBzaG9y
dCBnID0gdW5zaWduZWQgc2hvcnQoKHBpeGVsICYgMHgwMDAwRkMwMCkgPj4gNSk7CisgICAgdW5z
aWduZWQgc2hvcnQgYiA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAmIDB4MDAwMDAwRjgpID4+IDMp
OworI2VuZGlmCisgICAgcmV0dXJuIHIgfCBnIHwgYjsKK30KKworYm9vbCBTaGFyZWRCaXRtYXA6
OnRvMTZiaXQoKQoreworICAgIGlmIChtX2xvY2tlZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChpczE2Yml0KCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgQml0bWFwSW5m
byBuZXdCbXBJbmZvKHRydWUsIG1fYm1wSW5mby53aWR0aCgpLCBtX2JtcEluZm8uaGVpZ2h0KCkp
OworCisgICAgTWVtb3J5QWxsb2NhdGlvbkNhbkZhaWwgY2FuRmFpbDsKKyAgICBpbnQgd2lkdGgg
PSBuZXdCbXBJbmZvLndpZHRoKCk7CisgICAgaW50IHBhZGRlZFdpZHRoID0gbmV3Qm1wSW5mby5w
YWRkZWRXaWR0aCgpOworICAgIGludCBidWZmZXJTaXplID0gcGFkZGVkV2lkdGggKiBuZXdCbXBJ
bmZvLmhlaWdodCgpOworICAgIHZvaWQqIG5ld1BpeGVscyA9IG5ldyB1bnNpZ25lZCBbYnVmZmVy
U2l6ZSAvIDJdOworCisgICAgaWYgKCFuZXdQaXhlbHMpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIHVuc2lnbmVkIHNob3J0KiBwMTYgPSAodW5zaWduZWQgc2hvcnQqKW5ld1BpeGVsczsK
KyAgICBjb25zdCB1bnNpZ25lZCogcDMyID0gKGNvbnN0IHVuc2lnbmVkKiltX3BpeGVsczsKKwor
ICAgIGNvbnN0IGJvb2wgc2tpcHMgPSBwYWRkZWRXaWR0aCAhPSB3aWR0aDsKKworICAgIGNvbnN0
IHVuc2lnbmVkIHNob3J0KiBjb25zdCBwMTZlbmQgPSBwMTYgKyBidWZmZXJTaXplOworICAgIHdo
aWxlIChwMTYgPCBwMTZlbmQpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBzaG9ydCogcDE2bGlu
ZUVuZCA9IHAxNiArIHdpZHRoOyBwMTYgPCBwMTZsaW5lRW5kOyApCisgICAgICAgICAgICAqcDE2
KysgPSBjb252ZXJ0MzJUbzE2KCpwMzIrKyk7CisKKyAgICAgICAgaWYgKHNraXBzKQorICAgICAg
ICAgICAgKnAxNisrID0gMDsKKyAgICB9CisKKworICAgIGlmIChtX2hiaXRtYXApIHsKKyAgICAg
ICAgRGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7CisgICAgICAgIG1faGJpdG1hcCA9IDA7CisgICAg
fSBlbHNlCisgICAgICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworCisgICAgbV9waXhlbHMgPSBuZXdQ
aXhlbHM7CisgICAgbV9ibXBJbmZvID0gbmV3Qm1wSW5mbzsKKworICAgIHNldEhhc0FscGhhKGZh
bHNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGFyZWRCaXRtYXA6OmZyZWVNZW1v
cnkoKQoreworICAgIGlmICghbV9sb2NrZWQpIHsKKyAgICAgICAgaWYgKG1faGJpdG1hcCkgewor
ICAgICAgICAgICAgRGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7CisgICAgICAgICAgICBtX2hiaXRt
YXAgPSAwOworICAgICAgICAgICAgbV9waXhlbHMgPSAwOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0gZWxzZSBpZiAobV9waXhlbHMpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtd
IG1fcGl4ZWxzOworICAgICAgICAgICAgbV9waXhlbHMgPSAwOworICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitIQklUTUFQ
IFNoYXJlZEJpdG1hcDo6Y3JlYXRlSGFuZGxlKHZvaWQqKiBwaXhlbHMsIEJpdG1hcEluZm8qIGJt
cEluZm8sIGludCBoLCBib29sIHVzZTE2Yml0KSBjb25zdAoreworICAgIGlmICghbV9waXhlbHMp
CisgICAgICAgIHJldHVybiAwOworCisgICAgTWVtb3J5QWxsb2NhdGlvbkNhbkZhaWwgY2FuRmFp
bDsKKworICAgIGlmIChoID09IC0xKQorICAgICAgICBoID0gaGVpZ2h0KCk7CisgICAgKmJtcElu
Zm8gPSBCaXRtYXBJbmZvKHVzZTE2Yml0IHx8IGlzMTZiaXQoKSwgd2lkdGgoKSwgaCk7CisKKyAg
ICBIQklUTUFQIGhibXAgPSBNZW1vcnlNYW5hZ2VyOjpjcmVhdGVESUJTZWN0aW9uKGJtcEluZm8s
IHBpeGVscyk7CisKKyAgICBpZiAoIWhibXApCisgICAgICAgIHJldHVybiAwOworCisgICAgT3du
UHRyPEhEQz4gYm1wREMoQ3JlYXRlQ29tcGF0aWJsZURDKDApKTsKKyAgICBIR0RJT0JKIGhPbGRC
bXAgPSBTZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhibXApOworCisgICAgU3RyZXRjaERJQml0
cworICAgICAgICAoIGJtcERDLmdldCgpCisgICAgICAgICwgMAorICAgICAgICAsIDAKKyAgICAg
ICAgLCB3aWR0aCgpCisgICAgICAgICwgaAorICAgICAgICAsIDAKKyAgICAgICAgLCAwCisgICAg
ICAgICwgd2lkdGgoKQorICAgICAgICAsIGgKKyAgICAgICAgLCBtX3BpeGVscworICAgICAgICAs
ICZtX2JtcEluZm8KKyAgICAgICAgLCBESUJfUkdCX0NPTE9SUworICAgICAgICAsIFNSQ0NPUFkK
KyAgICAgICAgKTsKKworICAgIFNlbGVjdE9iamVjdChibXBEQy5nZXQoKSwgaE9sZEJtcCk7CisK
KyAgICByZXR1cm4gaGJtcDsKK30KKworYm9vbCBTaGFyZWRCaXRtYXA6OmVuc3VyZUhhbmRsZSgp
Cit7CisgICAgaWYgKG1faGJpdG1hcCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAo
IW1fcGl4ZWxzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9sb2NrZWQpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICB2b2lk
KiBwaXhlbHM7CisgICAgbV9oYml0bWFwID0gY3JlYXRlSGFuZGxlKCZwaXhlbHMsICZibXBJbmZv
LCAtMSwgIWhhc0FscGhhKCkpOworCisgICAgaWYgKCFtX2hiaXRtYXApCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworICAgIG1fcGl4ZWxzID0gcGl4ZWxz
OworICAgIG1fYm1wSW5mbyA9IGJtcEluZm87CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9p
ZCBTaGFyZWRCaXRtYXA6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRSZWN0
JiBkc3RSZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21w
b3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisgICAgY3R4
dC0+ZHJhd0JpdG1hcCh0aGlzLCBkc3RSZWN0LCBzcmNSZWN0LCBjb21wb3NpdGVPcCk7Cit9CisK
K3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3Qs
IGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQor
eworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChkc3RSZWN0
LmlzRW1wdHkoKSB8fCBzcmNSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
aWYgKGdfZHJhd0ltYWdlICYmIGdfZHJhd0ltYWdlKHRoaXMsIGhkYywgZHN0UmVjdCwgc3JjUmVj
dCwgY29tcG9zaXRlT3ApKQorICAgICAgICByZXR1cm47CisKKyAgICBIQklUTUFQIGhiaXRtYXAg
PSAwOworICAgIGJvb2wgdXNpbmdIYW5kbGUgPSBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVTb3Vy
Y2VPdmVyICYmICgKKyNpZiAhIGRlZmluZWQoTk9fQUxQSEFCTEVORCkKKyAgICAgICAgaGFzQWxw
aGEoKSB8fCAKKyNlbmRpZgorICAgICAgICB1c2VzVHJhbnNwYXJlbnRDb2xvcigpKTsKKworICAg
IGlmICh1c2luZ0hhbmRsZSkgeworICAgICAgICBpZiAoZW5zdXJlSGFuZGxlKCkpCisgICAgICAg
ICAgICBoYml0bWFwID0gbV9oYml0bWFwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHZv
aWQqIHBpeGVsczsKKyAgICAgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAgICAg
IGhiaXRtYXAgPSBjcmVhdGVIYW5kbGUoJnBpeGVscywgJmJtcEluZm8sIC0xLCB1c2VzVHJhbnNw
YXJlbnRDb2xvcigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWhiaXRtYXApIHsKKyAg
ICAgICAgLy8gRklYTUU6IGhhbmRsZSBvdGhlciBjb21wb3NpdGUgb3BlcmF0aW9uIHR5cGVzPwor
ICAgICAgICBEV09SRCByb3AgPSBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVDb3B5ID8gU1JDQ09Q
WQorICAgICAgICAgICAgOiBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVYT1IgPyBQQVRJTlZFUlQK
KyAgICAgICAgICAgIDogY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlQ2xlYXIgPyBXSElURU5FU1MK
KyAgICAgICAgICAgIDogU1JDQ09QWTsKKworICAgICAgICBTdHJldGNoRElCaXRzKGhkYywgZHN0
UmVjdC54KCksIGRzdFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCkK
KyAgICAgICAgICAgICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCks
IHNyY1JlY3QuaGVpZ2h0KCksIG1fcGl4ZWxzLCAmbV9ibXBJbmZvLCBESUJfUkdCX0NPTE9SUywg
cm9wKTsgCisgICAgfSBlbHNlIHsKKyAgICAgICAgT3duUHRyPEhEQz4gaG1lbWRjKENyZWF0ZUNv
bXBhdGlibGVEQyhoZGMpKTsKKyAgICAgICAgSEdESU9CSiBoT2xkQm1wID0gU2VsZWN0T2JqZWN0
KGhtZW1kYy5nZXQoKSwgaGJpdG1hcCk7CisKKyNpZiAhIGRlZmluZWQoTk9fQUxQSEFCTEVORCkK
KyAgICAgICAgaWYgKCF1c2VzVHJhbnNwYXJlbnRDb2xvcigpKSB7CisgICAgICAgICAgICBzdGF0
aWMgY29uc3QgQkxFTkRGVU5DVElPTiBibGVuZCA9IHsgQUNfU1JDX09WRVIsIDAsIDI1NSwgQUNf
U1JDX0FMUEhBIH07CisgICAgICAgICAgICBBbHBoYUJsZW5kKGhkYywgZHN0UmVjdC54KCksIGRz
dFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCksIGhtZW1kYy5nZXQo
KQorICAgICAgICAgICAgICAgICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0Lndp
ZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIGJsZW5kKTsgCisgICAgICAgIH0gZWxzZQorI2VuZGlm
CisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zcGFyZW50Qmx0KGhkYywgZHN0UmVjdC54KCks
IGRzdFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCksIGhtZW1kYy5n
ZXQoKQorICAgICAgICAgICAgICAgICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0
LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIHRyYW5zcGFyZW50Q29sb3IoKSk7IAorICAgICAg
ICB9CisKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgaE9sZEJtcCk7CisgICAg
ICAgIGlmIChoYml0bWFwICE9IG1faGJpdG1hcCkKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdCho
Yml0bWFwKTsKKyAgICB9Cit9CisKKworSEJJVE1BUCBTaGFyZWRCaXRtYXA6OmNsaXBCaXRtYXAo
Y29uc3QgSW50UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgdXNlQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXBJbmZv
JiBibXBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHBpeGVs
cykKK3sKKyAgICBpZiAoIWJ5dGVzKCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaW50
IG9sZFdpZHRoID0gd2lkdGgoKTsKKyAgICBpbnQgb2xkSGVpZ2h0ID0gaGVpZ2h0KCk7CisgICAg
aW50IGNvcHlXaWR0aCA9IHN0ZDo6bWluPGludD4ocmVjdC53aWR0aCgpLCBvbGRXaWR0aCAtIHJl
Y3QueCgpKTsKKyAgICBpbnQgY29weUhlaWdodCA9IHN0ZDo6bWluPGludD4ocmVjdC5oZWlnaHQo
KSwgb2xkSGVpZ2h0IC0gcmVjdC55KCkpOworICAgIGlmICghY29weVdpZHRoIHx8ICFjb3B5SGVp
Z2h0KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGJtcEluZm8gPSBCaXRtYXBJbmZvKCEo
dXNlQWxwaGEgJiYgaXMzMmJpdCgpKSwgY29weVdpZHRoLCBjb3B5SGVpZ2h0KTsKKyAgICBIQklU
TUFQIG5ld0JtcCA9IE1lbW9yeU1hbmFnZXI6OmNyZWF0ZURJQlNlY3Rpb24oJmJtcEluZm8sICZw
aXhlbHMpOworCisgICAgaWYgKG5ld0JtcCkgeworICAgICAgICBPd25QdHI8SERDPiBkY05ldyg6
OkNyZWF0ZUNvbXBhdGlibGVEQygwKSk7CisgICAgICAgIEhHRElPQkogdG1wTmV3ID0gOjpTZWxl
Y3RPYmplY3QoZGNOZXcuZ2V0KCksIG5ld0JtcCk7CisKKyAgICAgICAgU3RyZXRjaERJQml0cyhk
Y05ldy5nZXQoKSwgMCwgMCwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LCByZWN0LngoKSwgcmVjdC55
KCksIGNvcHlXaWR0aCwgY29weUhlaWdodAorICAgICAgICAgICAgLCBieXRlcygpLCAmYml0bWFw
SW5mbygpLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAgICAgICAgU2VsZWN0T2JqZWN0
KGRjTmV3LmdldCgpLCB0bXBOZXcpOworICAgIH0KKworICAgIHJldHVybiBuZXdCbXA7Cit9CisK
KworUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y2xpcEJpdG1hcChjb25z
dCBJbnRSZWN0JiByZWN0LCBib29sIHVzZUFscGhhKQoreworICAgIGludCBvbGRXaWR0aCA9IHdp
ZHRoKCk7CisgICAgaW50IG9sZEhlaWdodCA9IGhlaWdodCgpOworICAgIGludCBjb3B5V2lkdGgg
PSBzdGQ6Om1pbjxpbnQ+KHJlY3Qud2lkdGgoKSwgb2xkV2lkdGggLSByZWN0LngoKSk7CisgICAg
aW50IGNvcHlIZWlnaHQgPSBzdGQ6Om1pbjxpbnQ+KHJlY3QuaGVpZ2h0KCksIG9sZEhlaWdodCAt
IHJlY3QueSgpKTsKKyAgICBpZiAoIWNvcHlXaWR0aCB8fCAhY29weUhlaWdodCkKKyAgICAgICAg
cmV0dXJuIE5VTEw7CisKKyAgICBTaGFyZWRCaXRtYXAqIG5ld0JtcCA9IG5ldyBTaGFyZWRCaXRt
YXAoISh1c2VBbHBoYSAmJiBpczMyYml0KCkpLCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQsIGZhbHNl
KTsKKyAgICAKKyAgICBpZiAoIW5ld0JtcCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAo
IW5ld0JtcC0+Ynl0ZXMoKSkgeworICAgICAgICBkZWxldGUgbmV3Qm1wOworICAgICAgICByZXR1
cm4gMDsKKyAgICB9CisKKyAgICBEQ0hvbGRlciBkY05ldyhuZXdCbXApOworCisgICAgU3RyZXRj
aERJQml0cyhkY05ldy5nZXQoKSwgMCwgMCwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LCByZWN0Lngo
KSwgcmVjdC55KCksIGNvcHlXaWR0aCwgY29weUhlaWdodAorICAgICAgICAsIGJ5dGVzKCksICZi
aXRtYXBJbmZvKCksIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKKworICAgIHJldHVybiBhZG9w
dFJlZihuZXdCbXApOworfQorCitzdGF0aWMgdm9pZCBkcmF3UGF0dGVyblNpbXBsZShIREMgaGRj
LCBjb25zdCBSRUNUJiBkZXN0UmVjdCwgSEJJVE1BUCBoYm1wLCBjb25zdCBQT0lOVCYgcGhhc2Up
Cit7CisgICAgSEJSVVNIIGhCcnVzaCA9IENyZWF0ZVBhdHRlcm5CcnVzaChoYm1wKTsKKyAgICBp
ZiAoaEJydXNoKSB7CisgICAgICAgIFBPSU5UIG9sZE9yZzsKKyAgICAgICAgU2V0QnJ1c2hPcmdF
eChoZGMsIGRlc3RSZWN0LmxlZnQgLSBwaGFzZS54LCBkZXN0UmVjdC50b3AgLSBwaGFzZS55LCAm
b2xkT3JnKTsKKyAgICAgICAgRmlsbFJlY3QoaGRjLCAmZGVzdFJlY3QsIGhCcnVzaCk7CisgICAg
ICAgIERlbGV0ZU9iamVjdChoQnJ1c2gpOworICAgICAgICBTZXRCcnVzaE9yZ0V4KGhkYywgb2xk
T3JnLngsIG9sZE9yZy55LCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdQYXR0ZXJu
U2ltcGxlKEhEQyBoZGMsIGNvbnN0IFJFQ1QmIGRlc3RSZWN0LCBjb25zdCBTaGFyZWRCaXRtYXAq
IGJtcCwgY29uc3QgU0laRSYgYm1wU2l6ZSwgY29uc3QgUE9JTlQmIHBoYXNlKQoreworICAgIGlu
dCBkc3RZID0gZGVzdFJlY3QudG9wOworICAgIGZvciAoaW50IHNvdXJjZVkgPSBwaGFzZS55OyBk
c3RZIDwgZGVzdFJlY3QuYm90dG9tOyApIHsKKyAgICAgICAgaW50IHNvdXJjZUggPSBzdGQ6Om1p
bjxpbnQ+KGJtcFNpemUuY3kgLSBzb3VyY2VZLCBkZXN0UmVjdC5ib3R0b20gLSBkc3RZKTsKKyAg
ICAgICAgaW50IGRzdFggPSBkZXN0UmVjdC5sZWZ0OworICAgICAgICBmb3IgKGludCBzb3VyY2VY
ID0gcGhhc2UueDsgZHN0WCA8IGRlc3RSZWN0LnJpZ2h0OyApIHsKKyAgICAgICAgICAgIGludCBz
b3VyY2VXID0gc3RkOjptaW48aW50PihibXBTaXplLmN4IC0gc291cmNlWCwgZGVzdFJlY3Qucmln
aHQgLSBkc3RYKTsKKworICAgICAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFgsIGRzdFks
IHNvdXJjZVcsIHNvdXJjZUgsIHNvdXJjZVgsIHNvdXJjZVksIHNvdXJjZVcsIHNvdXJjZUgKKyAg
ICAgICAgICAgICAgICAsIGJtcC0+Ynl0ZXMoKSwgJmJtcC0+Yml0bWFwSW5mbygpLCBESUJfUkdC
X0NPTE9SUywgU1JDQ09QWSk7IAorCisgICAgICAgICAgICBkc3RYICs9IHNvdXJjZVc7CisgICAg
ICAgICAgICBzb3VyY2VYID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdFkgKz0gc291cmNl
SDsKKyAgICAgICAgc291cmNlWSA9IDA7CisgICAgfQorfQorCit2b2lkIG5vcm1hbGl6ZVBoYXNl
KExPTkcmIHBoYXNlLCBpbnQgbGltaXQpCit7CisgICAgaWYgKHBoYXNlID09IDApCisgICAgICAg
IHJldHVybjsKKyAgICBpZiAobGltaXQgPCAyKSB7CisgICAgICAgIHBoYXNlID0gMDsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobGltaXQgPT0gMikgeworICAgICAgICBwaGFzZSA9
IHBoYXNlICYgMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocGhhc2UgPCAwKSB7
CisgICAgICAgIHBoYXNlID0gLXBoYXNlOworICAgICAgICBpZiAocGhhc2UgPiBsaW1pdCkKKyAg
ICAgICAgICAgIHBoYXNlID0gKExPTkcpKCh1bnNpZ25lZClwaGFzZSAlICh1bnNpZ25lZClsaW1p
dCk7CisgICAgICAgIGlmIChwaGFzZSkKKyAgICAgICAgICAgIHBoYXNlID0gbGltaXQgLSBwaGFz
ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocGhhc2UgPCBsaW1pdCkKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgcGhhc2UgPSAoTE9ORykoKHVuc2lnbmVkKXBoYXNlICUgKHVuc2ln
bmVkKWxpbWl0KTsKKyAgICB9Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3UGF0dGVybihH
cmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3Qg
VHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNv
bnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKQor
eworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKyAgICBjdHh0LT5kcmF3Qml0
bWFwUGF0dGVybih0aGlzLCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgb3As
IGRlc3RSZWN0LCBvcmlnU291cmNlU2l6ZSk7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3
UGF0dGVybihIREMgaGRjLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBj
b25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBw
YXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2lu
dCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0
LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZ19kcmF3UGF0dGVybikgeworICAgICAgICBnX2Ry
YXdQYXR0ZXJuKHRoaXMsIGhkYywgdHJhbnNmb3JtLCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNm
b3JtLCBwaGFzZSwgb3AsIGRlc3RSZWN0LCBvcmlnU291cmNlU2l6ZSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAodGlsZVJlY3RJbi53aWR0aCgpIDw9IDAgfHwgdGlsZVJlY3RJ
bi5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBib29sIHVzZUFscGhhID0g
b3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAmJiBoYXNBbHBoYSgpICYmIGlzMzJiaXQoKTsKKwor
ICAgIGludCBibXBXaWR0aCA9IHdpZHRoKCk7CisgICAgaW50IGJtcEhlaWdodCA9IGhlaWdodCgp
OworCisgICAgRmxvYXRSZWN0IHRpbGVSZWN0KHRpbGVSZWN0SW4pOworICAgIGlmIChibXBXaWR0
aCAhPSBvcmlnU291cmNlU2l6ZS53aWR0aCgpKSB7CisgICAgICAgIGRvdWJsZSByYXRlID0gKGRv
dWJsZSlibXBXaWR0aCAvIG9yaWdTb3VyY2VTaXplLndpZHRoKCk7CisgICAgICAgIGRvdWJsZSB0
ZW1wID0gdGlsZVJlY3Qud2lkdGgoKSAqIHJhdGU7CisgICAgICAgIHRpbGVSZWN0LnNldFgodGls
ZVJlY3QueCgpICogcmF0ZSk7CisgICAgICAgIHRpbGVSZWN0LnNldFdpZHRoKHRlbXApOworICAg
ICAgICB0ZW1wID0gdGlsZVJlY3QuaGVpZ2h0KCkgKiByYXRlOworICAgICAgICB0aWxlUmVjdC5z
ZXRZKHRpbGVSZWN0LnkoKSAqIHJhdGUpOworICAgICAgICB0aWxlUmVjdC5zZXRIZWlnaHQodGVt
cCk7CisgICAgfQorCisgICAgT3duUHRyPEhCSVRNQVA+IGNsaXBwZWRCbXA7CisKKyAgICBpZiAo
dGlsZVJlY3QueCgpIHx8IHRpbGVSZWN0LnkoKSB8fCB0aWxlUmVjdC53aWR0aCgpICE9IGJtcFdp
ZHRoIHx8IHRpbGVSZWN0LmhlaWdodCgpICE9IGJtcEhlaWdodCkgeworICAgICAgICBCaXRtYXBJ
bmZvIHBhdHRlcm5CbXBJbmZvOworICAgICAgICB2b2lkKiBwYXR0ZXJuUGl4ZWxzOworICAgICAg
ICBjbGlwcGVkQm1wLnNldChjbGlwQml0bWFwKEludFJlY3QodGlsZVJlY3QpLCB1c2VBbHBoYSwg
cGF0dGVybkJtcEluZm8sIHBhdHRlcm5QaXhlbHMpKTsKKyAgICAgICAgaWYgKGNsaXBwZWRCbXAg
PT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBibXBXaWR0aCA9IHRpbGVS
ZWN0LndpZHRoKCk7CisgICAgICAgIGJtcEhlaWdodCA9IHRpbGVSZWN0LmhlaWdodCgpOworICAg
IH0KKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRmID0gdHJhbnNmb3JtOworICAgIHRmICo9
IHBhdHRlcm5UcmFuc2Zvcm07CisKKyAgICBGbG9hdFJlY3QgdHJSZWN0ID0gdGYubWFwUmVjdChk
ZXN0UmVjdCk7CisKKyAgICBSRUNUIGNsaXBCb3g7CisgICAgaW50IGNsaXBUeXBlID0gR2V0Q2xp
cEJveChoZGMsICZjbGlwQm94KTsKKyAgICBpZiAoY2xpcFR5cGUgPT0gU0lNUExFUkVHSU9OKQor
ICAgICAgICB0clJlY3QuaW50ZXJzZWN0KEZsb2F0UmVjdChjbGlwQm94LmxlZnQsIGNsaXBCb3gu
dG9wLCBjbGlwQm94LnJpZ2h0IC0gY2xpcEJveC5sZWZ0LCBjbGlwQm94LmJvdHRvbSAtIGNsaXBC
b3gudG9wKSk7CisgICAgZWxzZSBpZiAoY2xpcFR5cGUgPT0gQ09NUExFWFJFR0lPTikgeworICAg
ICAgICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDApKTsKKyAg
ICAgICAgaWYgKEdldENsaXBSZ24oaGRjLCBjbGlwUmduLmdldCgpKSA+IDApIHsKKyAgICAgICAg
ICAgIERXT1JEIHJlZ2lvbkRhdGFTaXplID0gR2V0UmVnaW9uRGF0YShjbGlwUmduLmdldCgpLCBz
aXplb2YoUkdOREFUQSksIE5VTEwpOworICAgICAgICAgICAgaWYgKHJlZ2lvbkRhdGFTaXplKSB7
CisgICAgICAgICAgICAgICAgUkdOREFUQSogcmVnaW9uRGF0YSA9IG5ldyBSR05EQVRBW3JlZ2lv
bkRhdGFTaXplXTsKKyAgICAgICAgICAgICAgICBHZXRSZWdpb25EYXRhKGNsaXBSZ24uZ2V0KCks
IHJlZ2lvbkRhdGFTaXplLCByZWdpb25EYXRhKTsKKyAgICAgICAgICAgICAgICBSRUNUKiByZWN0
ID0gKFJFQ1QqKXJlZ2lvbkRhdGEtPkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgcmVnaW9uRGF0YS0+cmRoLm5Db3VudDsgKytpLCArK3JlY3QpCisgICAg
ICAgICAgICAgICAgICAgIHRyUmVjdC5pbnRlcnNlY3QoRmxvYXRSZWN0KHJlY3QtPmxlZnQsIHJl
Y3QtPnRvcCwgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSByZWN0LT50
b3ApKTsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSByZWdpb25EYXRhOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyUmVjdC53aWR0aCgpIDw9IDAgfHwgdHJS
ZWN0LmhlaWdodCgpIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIHRyUmVjdC5pbmZsYXRl
KDEpOworICAgIEludFJlY3QgdmlzaWJsZURzdFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHRmLmlu
dmVyc2UoKS5tYXBSZWN0KHRyUmVjdCkpOworICAgIHZpc2libGVEc3RSZWN0LmludGVyc2VjdChJ
bnRSZWN0KGRlc3RSZWN0KSk7CisKKyAgICBpZiAodmlzaWJsZURzdFJlY3Qud2lkdGgoKSA8PSAw
IHx8IHZpc2libGVEc3RSZWN0LmhlaWdodCgpIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAg
IHRyUmVjdCA9IHRmLm1hcFJlY3QodmlzaWJsZURzdFJlY3QpOworICAgIFJFQ1QgZHN0UmVjdFdp
biA9CisgICAgeworICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QueCgpKSwKKyAgICAgICAgc3Rh
YmxlUm91bmQodHJSZWN0LnkoKSksCisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC5yaWdodCgp
KSwKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LmJvdHRvbSgpKSwKKyAgICB9OworICAgIGlm
IChkc3RSZWN0V2luLnJpZ2h0IDw9IGRzdFJlY3RXaW4ubGVmdCB8fCBkc3RSZWN0V2luLmJvdHRv
bSA8PSBkc3RSZWN0V2luLnRvcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgU0laRSBibXBTaXpl
ID0geyBibXBXaWR0aCwgYm1wSGVpZ2h0IH07CisKKyAgICAvLyBSZWxhdGl2ZSB0byBkZXN0aW5h
dGlvbiwgaW4gYml0bWFwIHBpeGVscworICAgIFBPSU5UIHBoYXNlV2luID0geyBzdGFibGVSb3Vu
ZCh2aXNpYmxlRHN0UmVjdC54KCkgLSBwaGFzZS54KCkpLCBzdGFibGVSb3VuZCh2aXNpYmxlRHN0
UmVjdC55KCkgLSBwaGFzZS55KCkpIH07CisgICAgbm9ybWFsaXplUGhhc2UocGhhc2VXaW4ueCwg
Ym1wU2l6ZS5jeCk7CisgICAgbm9ybWFsaXplUGhhc2UocGhhc2VXaW4ueSwgYm1wU2l6ZS5jeSk7
CisgICAgCisgICAgeworICAgICAgICBSRUNUIHNyY1JlY3RXaW4gPQorICAgICAgICB7CisgICAg
ICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIHN0YWJsZVJvdW5kKHZpc2li
bGVEc3RSZWN0LnJpZ2h0KCkpIC0gc3RhYmxlUm91bmQodmlzaWJsZURzdFJlY3QueCgpKSwKKyAg
ICAgICAgICAgIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LmJvdHRvbSgpKSAtIHN0YWJsZVJv
dW5kKHZpc2libGVEc3RSZWN0LnkoKSkKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKHNyY1JlY3RX
aW4ucmlnaHQgPD0gMCB8fCBzcmNSZWN0V2luLmJvdHRvbSA8PSAwKQorICAgICAgICAgICAgcmV0
dXJuOworCisgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbyghdXNlQWxwaGEsIHNyY1JlY3RXaW4u
cmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tKTsKKyAgICAgICAgdm9pZCogcGl4ZWxzOworICAgICAg
ICBPd25QdHI8SEJJVE1BUD4gaGJtcFRlbXAoTWVtb3J5TWFuYWdlcjo6Y3JlYXRlRElCU2VjdGlv
bigmYm1wSW5mbywgJnBpeGVscykpOworCisgICAgICAgIGlmIChoYm1wVGVtcCkgeworICAgICAg
ICAgICAgT3duUHRyPEhEQz4gaG1lbWRjKENyZWF0ZUNvbXBhdGlibGVEQyhoZGMpKTsKKyAgICAg
ICAgICAgIEhHRElPQkogb2xkQm1wID0gU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgaGJtcFRl
bXAuZ2V0KCkpOworICAgICAgICAgICAgaWYgKGNsaXBwZWRCbXApCisgICAgICAgICAgICAgICAg
ZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0V2luLCBjbGlwcGVkQm1wLmdl
dCgpLCBwaGFzZVdpbik7CisgICAgICAgICAgICBlbHNlIGlmICgob3AgIT0gQ29tcG9zaXRlU291
cmNlT3ZlciB8fCBjYW5Vc2VESUJpdHMoKSkgJiYgc3JjUmVjdFdpbi5yaWdodCA8PSBibXBTaXpl
LmN4ICogMiAmJiBzcmNSZWN0V2luLmJvdHRvbSA8PSBibXBTaXplLmN5ICogMikKKyAgICAgICAg
ICAgICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RXaW4sIHRoaXMs
IGJtcFNpemUsIHBoYXNlV2luKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGVuc3VyZUhhbmRsZSgp
KQorICAgICAgICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3JjUmVj
dFdpbiwgZ2V0SGFuZGxlKCksIHBoYXNlV2luKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAg
ICAgICAgICAgIHZvaWQqIHBpeGVsczsKKyAgICAgICAgICAgICAgICBCaXRtYXBJbmZvIGJtcElu
Zm87CisgICAgICAgICAgICAgICAgaWYgKEhCSVRNQVAgaGJtcCA9IGNyZWF0ZUhhbmRsZSgmcGl4
ZWxzLCAmYm1wSW5mbywgLTEsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICBkcmF3UGF0
dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RXaW4sIGhibXAsIHBoYXNlV2luKTsKKyAg
ICAgICAgICAgICAgICAgICAgRGVsZXRlT2JqZWN0KGhibXApOworICAgICAgICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIG9s
ZEJtcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisKKyNpZiBkZWZpbmVkKE5PX0FMUEhBQkxFTkQpCisgICAgICAgICAgICBp
ZiAodXNlQWxwaGEgfHwob3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAmJiB1c2VzVHJhbnNwYXJl
bnRDb2xvcigpKSkKKyNlbHNlCisgICAgICAgICAgICBpZiAodXNlQWxwaGEpIHsKKyAgICAgICAg
ICAgICAgICBzdGF0aWMgY29uc3QgQkxFTkRGVU5DVElPTiBibGVuZCA9IHsgQUNfU1JDX09WRVIs
IDAsIDI1NSwgQUNfU1JDX0FMUEhBIH07CisgICAgICAgICAgICAgICAgQWxwaGFCbGVuZChoZGMs
IGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RS
ZWN0V2luLmxlZnQsIGRzdFJlY3RXaW4uYm90dG9tIC0gZHN0UmVjdFdpbi50b3AKKyAgICAgICAg
ICAgICAgICAgICAgLCBobWVtZGMuZ2V0KCksIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1Jl
Y3RXaW4uYm90dG9tLCBibGVuZCk7IAorICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBDb21w
b3NpdGVTb3VyY2VPdmVyICYmIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpCisjZW5kaWYKKyAgICAg
ICAgICAgICAgICBUcmFuc3BhcmVudEJsdChoZGMsIGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdp
bi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0V2luLmxlZnQKKyAgICAgICAgICAgICAg
ICAgICAgLCBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9wLCBobWVtZGMuZ2V0KCks
IDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tLCB0cmFuc3BhcmVudENv
bG9yKCkpOyAKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIERXT1JEIGJtcE9w
ID0gb3AgPT0gQ29tcG9zaXRlQ29weSA/IFNSQ0NPUFkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICA6IG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgPyBTUkNDT1BZCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgOiBvcCA9PSBDb21wb3NpdGVYT1IgPyBQQVRJTlZFUlQKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICA6IG9wID09IENvbXBvc2l0ZUNsZWFyID8gV0hJVEVORVNTCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTUkNDT1BZOyAvLyBGSVhFTUU6IG90aGVyIHR5
cGVzPworCisgICAgICAgICAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFJlY3RXaW4ubGVm
dCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0V2luLmxlZnQKKyAg
ICAgICAgICAgICAgICAgICAgLCBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9wLCAw
LCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbQorICAgICAgICAgICAgICAg
ICAgICAsIHBpeGVscywgJmJtcEluZm8sIERJQl9SR0JfQ09MT1JTLCBibXBPcCk7IAorICAgICAg
ICAgICAgfQorICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgb2xkQm1wKTsK
KyAgICAgICAgfQorICAgIH0KK30KKworU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyIGdfZGNQcm92
aWRlcjsKK1NoYXJlZEJpdG1hcDo6RENQcm92aWRlciogU2hhcmVkQml0bWFwOjptX2RjUHJvdmlk
ZXIgPSAmZ19kY1Byb3ZpZGVyOworCitIREMgU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyOjpnZXRE
QyhTaGFyZWRCaXRtYXAqIGJtcCwgdW5zaWduZWQqIGtleTEsIHVuc2lnbmVkKiBrZXkyKQorewor
ICAgIGlmICghYm1wIHx8ICFibXAtPmVuc3VyZUhhbmRsZSgpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIEhEQyBoZGMgPSA6OkNyZWF0ZUNvbXBhdGlibGVEQygwKTsKKyAgICBpZiAoaGRjKSB7
CisgICAgICAgICprZXkxID0gKHVuc2lnbmVkKVNlbGVjdE9iamVjdChoZGMsIGJtcC0+Z2V0SGFu
ZGxlKCkpOworICAgICAgICBSRUNUIHJlY3QgPSB7IDAsIDAsIGJtcC0+d2lkdGgoKSwgYm1wLT5o
ZWlnaHQoKSB9OworICAgICAgICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVhdGVSZWN0UmduSW5k
aXJlY3QoJnJlY3QpKTsKKyAgICAgICAgU2VsZWN0Q2xpcFJnbihoZGMsIGNsaXBSZ24uZ2V0KCkp
OworICAgIH0KKworICAgIHJldHVybiBoZGM7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpEQ1By
b3ZpZGVyOjpyZWxlYXNlREMoU2hhcmVkQml0bWFwKiwgSERDIGhkYywgdW5zaWduZWQga2V5MSwg
dW5zaWduZWQga2V5MikKK3sKKyAgICBpZiAoIWhkYykKKyAgICAgICAgcmV0dXJuOworCisgICAg
U2VsZWN0T2JqZWN0KGhkYywgKEhHRElPQkopa2V5MSk7CisgICAgRGVsZXRlREMoaGRjKTsKK30K
Kwordm9pZCBTaGFyZWRCaXRtYXA6OmNsZWFyUGl4ZWxzKGNvbnN0IEludFJlY3QmIHIpCit7Cisg
ICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBibXBSZWN0
KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBibXBSZWN0LmludGVyc2VjdChyKTsKKyAg
ICBpZiAoaXMxNmJpdCgpKSB7CisgICAgICAgIGludCB3ID0gbV9ibXBJbmZvLnBhZGRlZFdpZHRo
KCk7CisgICAgICAgIHVuc2lnbmVkIHNob3J0KiBkc3QgPSAodW5zaWduZWQgc2hvcnQqKW1fcGl4
ZWxzOworICAgICAgICBkc3QgKz0gYm1wUmVjdC55KCkgKiB3ICsgYm1wUmVjdC54KCk7CisgICAg
ICAgIGludCB3b3Jkc1RvU2V0ID0gYm1wUmVjdC53aWR0aCgpOworICAgICAgICBjb25zdCB1bnNp
Z25lZCBzaG9ydCogZHN0RW5kID0gZHN0ICsgYm1wUmVjdC5oZWlnaHQoKSAqIHc7CisgICAgICAg
IHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAgICAgICAgICAgIHdtZW1zZXQoKHdjaGFyX3QqKWRz
dCwgMCwgd29yZHNUb1NldCk7CisgICAgICAgICAgICBkc3QgKz0gdzsKKyAgICAgICAgfQorICAg
IH0gZWxzZSB7CisgICAgICAgIGludCB3ID0gd2lkdGgoKTsKKyAgICAgICAgdW5zaWduZWQqIGRz
dCA9ICh1bnNpZ25lZCopbV9waXhlbHM7CisgICAgICAgIGRzdCArPSBibXBSZWN0LnkoKSAqIHcg
KyBibXBSZWN0LngoKTsKKyAgICAgICAgaW50IHdvcmRzVG9TZXQgPSBibXBSZWN0LndpZHRoKCkg
KiAyOworICAgICAgICBjb25zdCB1bnNpZ25lZCogZHN0RW5kID0gZHN0ICsgYm1wUmVjdC5oZWln
aHQoKSAqIHc7CisgICAgICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAgICAgICAgICAgIHdt
ZW1zZXQoKHdjaGFyX3QqKWRzdCwgMCwgd29yZHNUb1NldCk7CisgICAgICAgICAgICBkc3QgKz0g
dzsKKyAgICAgICAgfQorICAgIH0KK30KKworfQorCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi41ZjMyZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9TaGFyZWRCaXRtYXAuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpIHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUg
IkJpdG1hcEluZm8uaCIKKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0
Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d2luZ2RpLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworICAgIGVudW0gQ29tcG9zaXRlT3BlcmF0b3I7CisgICAgY2xhc3MgRmxvYXRQb2ludDsK
KyAgICBjbGFzcyBGbG9hdFJlY3Q7CisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OworICAgIGNs
YXNzIEludFJlY3Q7CisgICAgY2xhc3MgSW50U2l6ZTsKKyAgICBjbGFzcyBUcmFuc2Zvcm1hdGlv
bk1hdHJpeDsKKworICAgIGNsYXNzIFNoYXJlZEJpdG1hcDogcHVibGljIFJlZkNvdW50ZWQ8U2hh
cmVkQml0bWFwPiB7CisgICAgcHVibGljOgorICAgICAgICB+U2hhcmVkQml0bWFwKCk7CisgICAg
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4gY3JlYXRlSW5zdGFuY2UoYm9vbCBp
czE2Yml0LCBpbnQgdywgaW50IGgsIGJvb2wgaW5pdFBpeGVscyk7CisgICAgICAgIGNvbnN0IEJp
dG1hcEluZm8mIGJpdG1hcEluZm8oKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm87IH0KKyAgICAg
ICAgdm9pZCogYnl0ZXMoKSB7IHJldHVybiBtX3BpeGVsczsgfQorICAgICAgICBjb25zdCB2b2lk
KiBieXRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcGl4ZWxzOyB9CisgICAgICAgIHVuc2lnbmVkIHdp
ZHRoKCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLndpZHRoKCk7IH0KKyAgICAgICAgdW5zaWdu
ZWQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmhlaWdodCgpOyB9CisgICAgICAg
IHVuc2lnbmVkIHZhbGlkSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV92YWxpZEhlaWdodDsgfQor
ICAgICAgICB2b2lkIHNldFZhbGlkSGVpZ2h0KHVuc2lnbmVkIHZhbGlkSGVpZ2h0KSB7IG1fdmFs
aWRIZWlnaHQgPSB2YWxpZEhlaWdodDsgfQorICAgICAgICB2b2lkIHJlc2V0UGl4ZWxzKGJvb2wg
YmxhY2sgPSBmYWxzZSk7CisgICAgICAgIHZvaWQgY2xlYXJQaXhlbHMoY29uc3QgSW50UmVjdCYg
cik7CisgICAgICAgIGJvb2wgbG9ja2VkKCkgY29uc3QgeyByZXR1cm4gbV9sb2NrZWQ7IH0KKyAg
ICAgICAgdm9pZCBsb2NrKCkgeyBtX2xvY2tlZCA9IHRydWU7IH0KKyAgICAgICAgdm9pZCB1bmxv
Y2soKSB7IG1fbG9ja2VkID0gZmFsc2U7IH0KKyAgICAgICAgYm9vbCBmcmVlTWVtb3J5KCk7Cisg
ICAgICAgIGJvb2wgaXMxNmJpdCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mby5pczE2Yml0KCk7
IH0KKyAgICAgICAgYm9vbCBpczMyYml0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmlzMzJi
aXQoKTsgfQorICAgICAgICBib29sIHRvMTZiaXQoKTsKKyAgICAgICAgYm9vbCBoYXNBbHBoYSgp
IGNvbnN0IHsgcmV0dXJuIG1faGFzQWxwaGE7IH0KKyAgICAgICAgdm9pZCBzZXRIYXNBbHBoYShi
b29sIGFscGhhKSB7IG1faGFzQWxwaGEgPSBhbHBoYTsgfQorICAgICAgICBib29sIGVuc3VyZUhh
bmRsZSgpOworICAgICAgICBIQklUTUFQIGdldEhhbmRsZSgpIHsgcmV0dXJuIG1faGJpdG1hcDsg
fQorICAgICAgICBIQklUTUFQIGNyZWF0ZUhhbmRsZSh2b2lkKiogcGl4ZWxzLCBCaXRtYXBJbmZv
KiBibXBJbmZvLCBpbnQgaCA9IC0xLCBib29sIHVzZTE2Yml0ID0gdHJ1ZSkgY29uc3Q7CisgICAg
ICAgIGJvb2wgdXNlc1RyYW5zcGFyZW50Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX3VzZXNUcmFu
c3BhcmVudENvbG9yOyB9CisgICAgICAgIENPTE9SUkVGIHRyYW5zcGFyZW50Q29sb3IoKSBjb25z
dCB7IHJldHVybiBtX3RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICAgICAgdm9pZCBzZXRUcmFuc3Bh
cmVudENvbG9yKENPTE9SUkVGIGMpIHsgbV91c2VzVHJhbnNwYXJlbnRDb2xvciA9IHRydWU7IG1f
dHJhbnNwYXJlbnRDb2xvciA9IGM7IH0KKyAgICAgICAgYm9vbCBjYW5Vc2VESUJpdHMoKSBjb25z
dCB7IHJldHVybiAhaGFzQWxwaGEoKSAmJiAhdXNlc1RyYW5zcGFyZW50Q29sb3IoKTsgfQorCisg
ICAgICAgIEhCSVRNQVAgY2xpcEJpdG1hcChjb25zdCBJbnRSZWN0JiByZWN0LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYm9vbCB1c2VBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEJpdG1hcEluZm8mIGJtcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lk
KiYgcGl4ZWxzKTsKKyAgICAgICAgCisgICAgICAgIFBhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBj
bGlwQml0bWFwKGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgdXNlQWxwaGEpOworCisgICAgICAg
IHZvaWQgZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEludFJlY3QmIGRzdFJlY3Qs
IGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsK
KyAgICAgICAgdm9pZCBkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZs
b2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5U
cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFz
ZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0
IEludFNpemUmIG9yaWdTb3VyY2VTaXplKTsKKyAgICAgICAgdm9pZCBkcmF3KEhEQywgY29uc3Qg
SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0
b3IgY29tcG9zaXRlT3ApOworICAgICAgICB2b2lkIGRyYXdQYXR0ZXJuKEhEQywgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmLCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25z
dCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSk7CisK
KyAgICAgICAgdHlwZWRlZiB2b2lkICgqRHJhd1BhdHRlcm5GdW5jKShTaGFyZWRCaXRtYXAqIGJt
cCwgSERDLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEZsb2F0UmVjdCYgdGls
ZVJlY3RJbiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRl
T3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9y
aWdTb3VyY2VTaXplKTsKKyAgICAgICAgdHlwZWRlZiBib29sICgqRHJhd0ltYWdlRnVuYykgKFNo
YXJlZEJpdG1hcCogYm1wLCBIREMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJl
Y3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsKKworICAgICAgICBz
dGF0aWMgRHJhd1BhdHRlcm5GdW5jIHNldERyYXdQYXR0ZXJuRnVuYyhEcmF3UGF0dGVybkZ1bmMg
ZnVuYyk7CisgICAgICAgIHN0YXRpYyBEcmF3SW1hZ2VGdW5jIHNldERyYXdJbWFnZUZ1bmMoRHJh
d0ltYWdlRnVuYyBmdW5jKTsKKworICAgICAgICBjbGFzcyBEQ1Byb3ZpZGVyIHsKKyAgICAgICAg
cHVibGljOgorICAgICAgICAgICAgdmlydHVhbCBIREMgZ2V0REMoU2hhcmVkQml0bWFwKiwgdW5z
aWduZWQqIGtleTEsIHVuc2lnbmVkKiBrZXkyKTsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBy
ZWxlYXNlREMoU2hhcmVkQml0bWFwKiwgSERDIGhkYywgdW5zaWduZWQga2V5MSwgdW5zaWduZWQg
a2V5Mik7CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIERDUHJvdmlkZXIqIG1fZGNQcm92
aWRlcjsKKworICAgICAgICBIREMgZ2V0REModW5zaWduZWQqIGtleTEsIHVuc2lnbmVkKiBrZXky
KSB7IHJldHVybiBtX2RjUHJvdmlkZXItPmdldERDKHRoaXMsIGtleTEsIGtleTIpOyB9CisgICAg
ICAgIHZvaWQgcmVsZWFzZURDKEhEQyBoZGMsIHVuc2lnbmVkIGtleTEsIHVuc2lnbmVkIGtleTIp
IHsgbV9kY1Byb3ZpZGVyLT5yZWxlYXNlREModGhpcywgaGRjLCBrZXkxLCBrZXkyKTsgfQorCisg
ICAgICAgIGNsYXNzIERDSG9sZGVyIHsNCisgICAgICAgIHB1YmxpYzoNCisgICAgICAgICAgICBE
Q0hvbGRlcihTaGFyZWRCaXRtYXAqIGJtcCA9IDApIHsgX3NldChibXApOyB9DQorICAgICAgICAg
ICAgfkRDSG9sZGVyKCkgeyBfY2xlYXIoKTsgfQ0KKyAgICAgICAgICAgIHZvaWQgc2V0KFNoYXJl
ZEJpdG1hcCogYm1wID0gMCkgeyBfY2xlYXIoKTsgX3NldChibXApOyB9DQorICAgICAgICAgICAg
SERDIGdldCgpIGNvbnN0IHsgcmV0dXJuIG1faGRjOyB9DQorICAgICAgICBwcml2YXRlOg0KKyAg
ICAgICAgICAgIERDSG9sZGVyJiBvcGVyYXRvcj0oY29uc3QgRENIb2xkZXImKTsNCisgICAgICAg
ICAgICBEQ0hvbGRlcihjb25zdCBEQ0hvbGRlciYpOw0KKyAgICAgICAgICAgIHZvaWQgX2NsZWFy
KCkgeyBpZiAobV9oZGMpIHsgbV9iaXRtYXAtPnJlbGVhc2VEQyhtX2hkYywgbV9rZXkxLCBtX2tl
eTIpOyB9IH0NCisgICAgICAgICAgICB2b2lkIF9zZXQoU2hhcmVkQml0bWFwKiBibXApIHsgbV9i
aXRtYXAgPSBibXA7IG1faGRjID0gYm1wID8gYm1wLT5nZXREQygmbV9rZXkxLCAmbV9rZXkyKSA6
IDA7IH0NCisgICAgICAgICAgICBTaGFyZWRCaXRtYXAqIG1fYml0bWFwOw0KKyAgICAgICAgICAg
IEhEQyBtX2hkYzsNCisgICAgICAgICAgICB1bnNpZ25lZCBtX2tleTE7DQorICAgICAgICAgICAg
dW5zaWduZWQgbV9rZXkyOw0KKyAgICAgICAgfTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGV4
cGxpY2l0IFNoYXJlZEJpdG1hcChib29sIGlzMTZiaXQsIGludCB3LCBpbnQgaCwgYm9vbCBpbml0
UGl4ZWxzKTsKKyAgICAgICAgZXhwbGljaXQgU2hhcmVkQml0bWFwKGNvbnN0IEJpdG1hcEluZm8m
IGJtcEluZm8sIEhCSVRNQVAgaGJtcCwgdm9pZCogcGl4ZWxzKTsKKyAgICAgICAgQml0bWFwSW5m
byBtX2JtcEluZm87CisgICAgICAgIGludCBtX3JlZmVyZW5jZTsKKyAgICAgICAgSEJJVE1BUCBt
X2hiaXRtYXA7CisgICAgICAgIHZvaWQqIG1fcGl4ZWxzOworICAgICAgICBDT0xPUlJFRiBtX3Ry
YW5zcGFyZW50Q29sb3I7CisgICAgICAgIGludCBtX3ZhbGlkSGVpZ2h0OworICAgICAgICBib29s
IG1fbG9ja2VkOworICAgICAgICBib29sIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7CisgICAgICAg
IGJvb2wgbV9oYXNBbHBoYTsKKyAgICB9OworCit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33331</attachid>
            <date>2009-07-23 08:27:58 -0700</date>
            <delta_ts>2009-07-27 08:17:21 -0700</delta_ts>
            <desc>removed unnecessary files</desc>
            <filename>27511.patch</filename>
            <type>text/plain</type>
            <size>130712</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZDYyYjIzMi4uODQ5M2MwMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNiBAQAorMjAwOS0wNy0yMyAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAgKE9P
UFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
Mjc1MTEKKyAgICAgICAgQWRkIFdJTkNFIHNwZWNpZmljIHBsYXRmb3JtL2dyYXBoaWNzIGZpbGVz
IGZvciB0aGUgV2luQ0UgcG9ydC4KKworICAgICAgICBXcml0dGVuIGJ5IFlvbmcgTGkgPHlvbmcu
bGlAdG9yY2htb2JpbGUuY29tPiwgR2VvcmdlIFN0YWlrb3MgPGdlb3JnZS5zdGFpa29zQHRvcmNo
bW9iaWxlLmNvbT4sIENyeXN0YWwgWmhhbmcgPGNyeXN0YWwuemhhbmdAdG9yY2htb2JpbGUuY29t
PgorICAgICAgICBhbmQgTHlvbiBDaGVuIDxseW9uLmNoZW5AdG9yY2htb2JpbGUuY29tPgorCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvQ29sb3JXaW5jZS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dyYWRpZW50V2luY2UuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlckRhdGEuaDog
QWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJXaW5j
ZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRGVj
b2RlclV0aWxpdGllcy5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL0ltYWdlRGVjb2RlclV0aWxpdGllcy5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9JbWFnZUZyYW1lU2luay5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9JbWFnZUZyYW1lU2lua1dpbmNlLmNwcDogQWRkZWQuCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VTb3VyY2VXaW5jZS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlV2luY2UuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9KUEVHRW5jb2Rlci5jcHA6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNvZGVyLmg6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJpdmF0ZVdp
bmNlLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxh
eWVyUHJveHkuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9N
ZWRpYVBsYXllclByb3h5Lmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BOR0VuY29kZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93
aW5jZS9QTkdFbmNvZGVyLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BhdGhXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmg6IEFkZGVkLgorCiAyMDA5LTA3LTIy
ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IEVyaWMgU2VpZGVsLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9Db2xvcldpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvQ29sb3JX
aW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwYjlkMgotLS0g
L2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvQ29sb3JXaW5j
ZS5jcHAKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBU
b3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9u
LCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJDb2xvci5oIgorCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitDb2xvciBmb2N1c1JpbmdDb2xvcigpCit7CisgICAgcmV0dXJuIENv
bG9yKDAsIDAsIDApOworfQorCit2b2lkIHNldEZvY3VzUmluZ0NvbG9yQ2hhbmdlRnVuY3Rpb24o
dm9pZCAoKikoKSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dy
YWRpZW50V2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVu
dFdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWZhOTcwCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVu
dFdpbmNlLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRv
cmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAg
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFkaWVudC5oIgorCisjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBHcmFkaWVudDo6cGxh
dGZvcm1EZXN0cm95KCkKK3sKK30KKworc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVTdG9wcyhj
b25zdCBHcmFkaWVudDo6Q29sb3JTdG9wJiBhLCBjb25zdCBHcmFkaWVudDo6Q29sb3JTdG9wJiBi
KQoreworICAgIHJldHVybiBhLnN0b3AgPCBiLnN0b3A7Cit9CisKK2NvbnN0IFZlY3RvcjxHcmFk
aWVudDo6Q29sb3JTdG9wPiYgR3JhZGllbnQ6OmdldFN0b3BzKCkgY29uc3QKK3sKKyAgICBpZiAo
IW1fc3RvcHNTb3J0ZWQpIHsKKyAgICAgICAgaWYgKG1fc3RvcHMuc2l6ZSgpKQorICAgICAgICAg
ICAgc3RkOjpzdGFibGVfc29ydChtX3N0b3BzLmJlZ2luKCksIG1fc3RvcHMuZW5kKCksIGNvbXBh
cmVTdG9wcyk7CisgICAgICAgIG1fc3RvcHNTb3J0ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1
cm4gbV9zdG9wczsKK30KKwordm9pZCBHcmFkaWVudDo6ZmlsbChHcmFwaGljc0NvbnRleHQqIGMs
IGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICBjLT5maWxsUmVjdChyLCB0aGlzKTsKK30KKwor
fQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZl
ckRhdGEuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJEYXRh
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiN2QwNgotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJEYXRh
LmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2Jp
bGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAg
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
CisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBJbWFnZUJ1
ZmZlckRhdGFfaAorI2RlZmluZSBJbWFnZUJ1ZmZlckRhdGFfaAorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKKyAgICBjbGFzcyBJbnRTaXplOworICAgIGNsYXNzIEltYWdlQnVmZmVyRGF0YSB7Cisg
ICAgcHVibGljOgorICAgICAgICBJbWFnZUJ1ZmZlckRhdGEoY29uc3QgSW50U2l6ZSYgc2l6ZSk7
CisgICAgICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IG1fYml0bWFwOworICAgIH07CisKK30gIC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAgLy8gSW1hZ2VCdWZmZXJEYXRhX2gKZGlmZiAt
LWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJXaW5jZS5j
cHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2luY2UuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODEzZTMKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2luY2Uu
Y3BwCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1v
YmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
ICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
KyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBz
ZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v
ciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKKworI2luY2x1ZGUgIkJhc2U2NC5oIgor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVk
ZSAiSW1hZ2VEYXRhLmgiCisjaW5jbHVkZSAiSlBFR0VuY29kZXIuaCIKKyNpbmNsdWRlICJQTkdF
bmNvZGVyLmgiCisjaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgiCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgQnVmZmVyZWRJbWFnZTogcHVibGljIEltYWdlIHsKKworcHVibGljOgorICAg
IEJ1ZmZlcmVkSW1hZ2UoY29uc3QgSW1hZ2VCdWZmZXJEYXRhKiBkYXRhKQorICAgICAgICA6IG1f
ZGF0YShkYXRhKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEludFNpemUgc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIEludFNpemUobV9kYXRhLT5tX2JpdG1hcC0+d2lkdGgoKSwgbV9kYXRhLT5t
X2JpdG1hcC0+aGVpZ2h0KCkpOyB9CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3lEZWNvZGVkRGF0
YShib29sIGRlc3Ryb3lBbGwgPSB0cnVlKSB7fQorICAgIHZpcnR1YWwgdW5zaWduZWQgZGVjb2Rl
ZFNpemUoKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCB2b2lkIGRyYXcoR3JhcGhp
Y3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNy
Y1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yKTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd1BhdHRlcm4o
R3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yLCBjb25zdCBG
bG9hdFJlY3QmIGRlc3RSZWN0KTsKKworICAgIGNvbnN0IEltYWdlQnVmZmVyRGF0YSogbV9kYXRh
OworfTsKKwordm9pZCBCdWZmZXJlZEltYWdlOjpkcmF3KEdyYXBoaWNzQ29udGV4dCogY3R4dCwg
Y29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBv
c2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIEludFJlY3QgaW50RHN0UmVjdCA9IGVu
Y2xvc2luZ0ludFJlY3QoZHN0UmVjdCk7CisgICAgSW50UmVjdCBpbnRTcmNSZWN0KHNyY1JlY3Qp
OworICAgIG1fZGF0YS0+bV9iaXRtYXAtPmRyYXcoY3R4dCwgaW50RHN0UmVjdCwgaW50U3JjUmVj
dCwgY29tcG9zaXRlT3ApOworfQorCit2b2lkIEJ1ZmZlcmVkSW1hZ2U6OmRyYXdQYXR0ZXJuKEdy
YXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9w
LCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KQoreworICAgIG1fZGF0YS0+bV9iaXRtYXAtPmRy
YXdQYXR0ZXJuKGN0eHQsIHRpbGVSZWN0SW4sIHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNlLCBvcCwg
ZGVzdFJlY3QsIHNpemUoKSk7Cit9CisKK0ltYWdlQnVmZmVyRGF0YTo6SW1hZ2VCdWZmZXJEYXRh
KGNvbnN0IEludFNpemUmIHNpemUpCis6IG1fYml0bWFwKFNoYXJlZEJpdG1hcDo6Y3JlYXRlSW5z
dGFuY2UoZmFsc2UsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgZmFsc2UpKQoreworICAg
IC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtaHRtbDUtMjAwOTAyMTIvdGhlLWNhbnZh
cy1lbGVtZW50Lmh0bWwjY2FudmFzcGl4ZWxhcnJheQorICAgIC8vICJXaGVuIHRoZSBjYW52YXMg
aXMgaW5pdGlhbGl6ZWQgaXQgbXVzdCBiZSBzZXQgdG8gZnVsbHkgdHJhbnNwYXJlbnQgYmxhY2su
IgorICAgIG1fYml0bWFwLT5yZXNldFBpeGVscyh0cnVlKTsKKyAgICBtX2JpdG1hcC0+c2V0SGFz
QWxwaGEodHJ1ZSk7Cit9CisKK0ltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcihjb25zdCBJbnRTaXpl
JiBzaXplLCBib29sIGdyYXlTY2FsZSwgYm9vbCYgc3VjY2VzcykKKzogbV9kYXRhKHNpemUpCiss
IG1fc2l6ZShzaXplKQoreworICAgIGdyYXlTY2FsZTsgLy8gQ3VycmVudGx5IG5vdCB1c2VkCisg
ICAgbV9jb250ZXh0LnNldChuZXcgR3JhcGhpY3NDb250ZXh0KDApKTsKKyAgICBtX2NvbnRleHQt
PnNldEJpdG1hcChtX2RhdGEubV9iaXRtYXApOworICAgIHN1Y2Nlc3MgPSB0cnVlOworfQorCitJ
bWFnZUJ1ZmZlcjo6fkltYWdlQnVmZmVyKCkKK3sKK30KKworR3JhcGhpY3NDb250ZXh0KiBJbWFn
ZUJ1ZmZlcjo6Y29udGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY29udGV4dC5nZXQoKTsK
K30KKworSW1hZ2UqIEltYWdlQnVmZmVyOjppbWFnZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2lt
YWdlKQorICAgICAgICBtX2ltYWdlID0gYWRvcHRSZWYobmV3IEJ1ZmZlcmVkSW1hZ2UoJm1fZGF0
YSkpOworCisgICAgcmV0dXJuIG1faW1hZ2UuZ2V0KCk7Cit9CisKK1Bhc3NSZWZQdHI8SW1hZ2VE
YXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0
Cit7CisgICAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IGltYWdlRGF0YSA9IEltYWdlRGF0YTo6Y3Jl
YXRlKHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBj
aGFyKiBzcmMgPSAodW5zaWduZWQgY2hhciopbV9kYXRhLm1fYml0bWFwLT5ieXRlcygpOworICAg
IGlmICghc3JjKQorICAgICAgICByZXR1cm4gaW1hZ2VEYXRhOworCisgICAgSW50UmVjdCBzb3Vy
Y2VSZWN0KDAsIDAsIG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSwgbV9kYXRhLm1fYml0bWFwLT5o
ZWlnaHQoKSk7CisgICAgc291cmNlUmVjdC5pbnRlcnNlY3QocmVjdCk7CisgICAgaWYgKHNvdXJj
ZVJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gaW1hZ2VEYXRhOworCisgICAgdW5zaWdu
ZWQgY2hhciogZHN0ID0gaW1hZ2VEYXRhLT5kYXRhKCktPmRhdGEoKS0+ZGF0YSgpOworICAgIG1l
bXNldChkc3QsIDAsIGltYWdlRGF0YS0+ZGF0YSgpLT5kYXRhKCktPmxlbmd0aCgpKTsKKyAgICBz
cmMgKz0gKHNvdXJjZVJlY3QueSgpICogbV9kYXRhLm1fYml0bWFwLT53aWR0aCgpICsgc291cmNl
UmVjdC54KCkpICogNDsKKyAgICBkc3QgKz0gKChzb3VyY2VSZWN0LnkoKSAtIHJlY3QueSgpKSAq
IGltYWdlRGF0YS0+d2lkdGgoKSArIHNvdXJjZVJlY3QueCgpIC0gcmVjdC54KCkpICogNDsKKyAg
ICBpbnQgYnl0ZXNUb0NvcHkgPSBzb3VyY2VSZWN0LndpZHRoKCkgKiA0OworICAgIGludCBzcmNT
a2lwID0gKG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSAtIHNvdXJjZVJlY3Qud2lkdGgoKSkgKiA0
OworICAgIGludCBkc3RTa2lwID0gKGltYWdlRGF0YS0+d2lkdGgoKSAtIHNvdXJjZVJlY3Qud2lk
dGgoKSkgKiA0OworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRzdEVuZCA9IGRzdCArIHNvdXJj
ZVJlY3QuaGVpZ2h0KCkgKiBpbWFnZURhdGEtPndpZHRoKCkgKiA0OworICAgIHdoaWxlIChkc3Qg
PCBkc3RFbmQpIHsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZHN0Um93RW5kID0gZHN0
ICsgYnl0ZXNUb0NvcHk7CisgICAgICAgIHdoaWxlIChkc3QgPCBkc3RSb3dFbmQpIHsKKyAgICAg
ICAgICAgICpkc3QrKyA9IHNyY1szXTsgLy8gQQorICAgICAgICAgICAgKmRzdCsrID0gKnNyYysr
OyAvLyBCCisgICAgICAgICAgICAqZHN0KysgPSAqc3JjKys7IC8vIEcKKyAgICAgICAgICAgICpk
c3QrKyA9ICpzcmMrKzsgLy8gUgorICAgICAgICAgICAgKytzcmM7CisgICAgICAgIH0KKyAgICAg
ICAgc3JjICs9IHNyY1NraXA7CisgICAgICAgIGRzdCArPSBkc3RTa2lwOworICAgIH0KKworICAg
IHJldHVybiBpbWFnZURhdGE7Cit9CisKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJ
bWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9p
bnQmIGRlc3RQb2ludCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyKiBkc3QgPSAodW5zaWduZWQgY2hh
ciopbV9kYXRhLm1fYml0bWFwLT5ieXRlcygpOworICAgIGlmICghZHN0KQorICAgICAgICByZXR1
cm47CisKKyAgICBJbnRSZWN0IGRlc3RSZWN0KGRlc3RQb2ludCwgc291cmNlUmVjdC5zaXplKCkp
OworICAgIGRlc3RSZWN0LmludGVyc2VjdChJbnRSZWN0KDAsIDAsIG1fZGF0YS5tX2JpdG1hcC0+
d2lkdGgoKSwgbV9kYXRhLm1fYml0bWFwLT5oZWlnaHQoKSkpOworCisgICAgaWYgKGRlc3RSZWN0
LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciog
c3JjID0gc291cmNlLT5kYXRhKCktPmRhdGEoKS0+ZGF0YSgpOworICAgIGRzdCArPSAoZGVzdFJl
Y3QueSgpICogbV9kYXRhLm1fYml0bWFwLT53aWR0aCgpICsgZGVzdFJlY3QueCgpKSAqIDQ7Cisg
ICAgc3JjICs9IChzb3VyY2VSZWN0LnkoKSAqIHNvdXJjZS0+d2lkdGgoKSArIHNvdXJjZVJlY3Qu
eCgpKSAqIDQ7CisgICAgaW50IGJ5dGVzVG9Db3B5ID0gZGVzdFJlY3Qud2lkdGgoKSAqIDQ7Cisg
ICAgaW50IGRzdFNraXAgPSAobV9kYXRhLm1fYml0bWFwLT53aWR0aCgpIC0gZGVzdFJlY3Qud2lk
dGgoKSkgKiA0OworICAgIGludCBzcmNTa2lwID0gKHNvdXJjZS0+d2lkdGgoKSAtIGRlc3RSZWN0
LndpZHRoKCkpICogNDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBkc3QgKyBk
ZXN0UmVjdC5oZWlnaHQoKSAqIG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSAqIDQ7CisgICAgd2hp
bGUgKGRzdCA8IGRzdEVuZCkgeworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkc3RSb3dF
bmQgPSBkc3QgKyBieXRlc1RvQ29weTsKKyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdFJvd0VuZCkg
eworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhbHBoYSA9ICpzcmMrKzsKKyAgICAgICAgICAg
ICpkc3QrKyA9ICpzcmMrKzsgLy8gQgorICAgICAgICAgICAgKmRzdCsrID0gKnNyYysrOyAvLyBH
CisgICAgICAgICAgICAqZHN0KysgPSAqc3JjKys7IC8vIFIKKyAgICAgICAgICAgICpkc3QrKyA9
IGFscGhhOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBzcmNTa2lwOworICAgICAgICBkc3Qg
Kz0gZHN0U2tpcDsKKyAgICB9Cit9CisKK1N0cmluZyBJbWFnZUJ1ZmZlcjo6dG9EYXRhVVJMKGNv
bnN0IFN0cmluZyYgbWltZVR5cGUpIGNvbnN0Cit7CisgICAgaWYgKCFtX2RhdGEubV9iaXRtYXAt
PmJ5dGVzKCkpCisgICAgICAgIHJldHVybiAiZGF0YTosIjsKKworICAgIFZlY3RvcjxjaGFyPiBv
dXRwdXQ7CisgICAgY29uc3QgY2hhciogaGVhZGVyOworICAgIGlmIChtaW1lVHlwZS5sb3dlcigp
ID09ICJpbWFnZS9wbmciKSB7CisgICAgICAgIGlmICghY29tcHJlc3NCaXRtYXBUb1BuZyhtX2Rh
dGEubV9iaXRtYXAuZ2V0KCksIG91dHB1dCkpCisgICAgICAgICAgICByZXR1cm4gImRhdGE6LCI7
CisgICAgICAgIGhlYWRlciA9ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsIjsKKyAgICB9IGVsc2Ug
eworICAgICAgICBpZiAoIWNvbXByZXNzQml0bWFwVG9KcGVnKG1fZGF0YS5tX2JpdG1hcC5nZXQo
KSwgb3V0cHV0KSkKKyAgICAgICAgICAgIHJldHVybiAiZGF0YTosIjsKKyAgICAgICAgaGVhZGVy
ID0gImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsIjsKKyAgICB9CisKKyAgICBWZWN0b3I8Y2hhcj4g
YmFzZTY0OworICAgIGJhc2U2NEVuY29kZShvdXRwdXQsIGJhc2U2NCk7CisKKyAgICBvdXRwdXQu
Y2xlYXIoKTsKKworICAgIFZlY3RvcjxjaGFyPiB1cmw7CisgICAgdXJsLmFwcGVuZChoZWFkZXIs
IHN0cmxlbihoZWFkZXIpKTsKKyAgICB1cmwuYXBwZW5kKGJhc2U2NCk7CisKKyAgICByZXR1cm4g
U3RyaW5nKHVybC5kYXRhKCksIHVybC5zaXplKCkpOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rLmggYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uNGYxYjk3ZAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFtZVNpbmsuaApAQCAtMCwwICsxLDE2OSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFRvcmNoIE1vYmlsZSwgSW5j
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpIHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAg
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIElNQUdFX0ZSQU1FX1NJ
TktfSF8KKyNkZWZpbmUgSU1BR0VfRlJBTUVfU0lOS19IXworCisjaW5jbHVkZSAiSW50UmVjdC5o
IgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBuYW1lc3BhY2UgUkdCQTMyQnVmZmVyIHsK
KyAgICAgICAgZW51bSBGcmFtZVN0YXR1cyB7CisgICAgICAgICAgICBGcmFtZUVtcHR5LAorICAg
ICAgICAgICAgRnJhbWVQYXJ0aWFsLAorICAgICAgICAgICAgRnJhbWVDb21wbGV0ZQorICAgICAg
ICB9OworICAgICAgICBlbnVtIEZyYW1lRGlzcG9zYWxNZXRob2QgeworICAgICAgICAgICAgLy8g
SWYgeW91IGNoYW5nZSB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgdGhlc2UsIG1ha2Ugc3VyZSB5b3Ug
YXVkaXQgYWxsCisgICAgICAgICAgICAvLyB1c2VycywgYXMgc29tZSB1c2VycyBtYXkgY2FzdCBy
YXcgdmFsdWVzIHRvL2Zyb20gdGhlc2UgY29uc3RhbnRzLgorICAgICAgICAgICAgRGlzcG9zZU5v
dFNwZWNpZmllZCA9IDAsICAgICAgIC8vIExlYXZlIGZyYW1lIGluIGZyYW1lYnVmZmVyCisgICAg
ICAgICAgICBEaXNwb3NlS2VlcCA9IDEsICAgICAgICAgICAgICAgLy8gTGVhdmUgZnJhbWUgaW4g
ZnJhbWVidWZmZXIKKyAgICAgICAgICAgIERpc3Bvc2VPdmVyd3JpdGVCZ2NvbG9yID0gMiwgICAv
LyBDbGVhciBmcmFtZSB0byB0cmFuc3BhcmVudAorICAgICAgICAgICAgRGlzcG9zZU92ZXJ3cml0
ZVByZXZpb3VzID0gMywgIC8vIENsZWFyIGZyYW1lIHRvIHByZXZpb3VzIGZyYW1lYnVmZmVyIGNv
bnRlbnRzCisgICAgICAgIH07CisgICAgfQorCisgICAgY2xhc3MgSW1hZ2VGcmFtZVNpbmsgewor
ICAgIHB1YmxpYzoKKyAgICAgICAgSW1hZ2VGcmFtZVNpbmsoYm9vbCBjYW5GcmVlQnVmZmVyKQor
ICAgICAgICAgICAgOiBtXzE2Yml0KGZhbHNlKQorICAgICAgICAgICAgLCBtX2ltYWdlV2lkdGgo
MCkKKyAgICAgICAgICAgICwgbV9idWZmZXJXaWR0aCgwKQorICAgICAgICAgICAgLCBtX2hlaWdo
dCgwKQorICAgICAgICAgICAgLCBtX2V4cGVjdGVkSGVpZ2h0KDApCisgICAgICAgICAgICAsIG1f
c3RhdHVzKFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSkKKyAgICAgICAgICAgICwgbV9kaXNwb3Nh
bE1ldGhvZChSR0JBMzJCdWZmZXI6OkRpc3Bvc2VOb3RTcGVjaWZpZWQpCisgICAgICAgICAgICAs
IG1fZHVyYXRpb24oMCkKKyAgICAgICAgICAgICwgbV9oYXNBbHBoYShmYWxzZSkKKyAgICAgICAg
ICAgICwgbV9jYW5GcmVlQnVmZmVyKGNhbkZyZWVCdWZmZXIpCisgICAgICAgICAgICAsIG1fc2hv
dWxkRnJlZUJ1ZmZlcihmYWxzZSkKKyAgICAgICAgICAgICwgbV91c2VzVHJhbnNwYXJlbnRDb2xv
cihmYWxzZSkKKyAgICAgICAgICAgICwgbV90cmFuc3BhcmVudENvbG9yKDApCisgICAgICAgICAg
ICAsIG1fY29tcG9zaXRlZFdpdGhQcmV2aW91c0ZyYW1lKGZhbHNlKQorICAgICAgICB7CisgICAg
ICAgIH0KKworICAgICAgICB+SW1hZ2VGcmFtZVNpbmsoKSB7IGZyZWVCdWZmZXIoKTsgfQorCisg
ICAgICAgIGNvbnN0IHZvaWQqIGJ5dGVzKCkgY29uc3Q7CisgICAgICAgIHZvaWQqIGJ5dGVzKCk7
CisgICAgICAgIGJvb2wgYWxsb2NhdGVCdWZmZXIoKTsKKyAgICAgICAgTmF0aXZlSW1hZ2VQdHIg
Z2V0RnJhbWUoKTsKKyAgICAgICAgYm9vbCBpc0J1ZmZlclJlYWR5KCkgY29uc3Q7CisgICAgICAg
IHZvaWQgZnJlZUJ1ZmZlcigpOworCisgICAgICAgIGJvb2wgc2hvdWxkRnJlZUJ1ZmZlcigpIGNv
bnN0IHsgcmV0dXJuIG1fc2hvdWxkRnJlZUJ1ZmZlcjsgfQorICAgICAgICBib29sIGNhbkZyZWVC
dWZmZXIoKSBjb25zdCB7IHJldHVybiBtX2NhbkZyZWVCdWZmZXI7IH0KKyAgICAgICAgYm9vbCBp
czE2Yml0KCkgY29uc3QgeyByZXR1cm4gbV8xNmJpdDsgfQorICAgICAgICBjb25zdCBJbnRSZWN0
JiByZWN0KCkgY29uc3QgeyByZXR1cm4gbV9yZWN0OyB9CisgICAgICAgIHVuc2lnbmVkIGhlaWdo
dCgpIGNvbnN0IHsgcmV0dXJuIG1faGVpZ2h0OyB9CisgICAgICAgIHVuc2lnbmVkIGJ1ZmZlcldp
ZHRoKCkgY29uc3QgeyByZXR1cm4gbV9idWZmZXJXaWR0aDsgfQorICAgICAgICB1bnNpZ25lZCBp
bWFnZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9pbWFnZVdpZHRoOyB9CisgICAgICAgIFJHQkEz
MkJ1ZmZlcjo6RnJhbWVTdGF0dXMgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0dXM7IH0K
KyAgICAgICAgdW5zaWduZWQgZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtX2R1cmF0aW9uOyB9
CisgICAgICAgIGJvb2wgaGFzQWxwaGEoKSBjb25zdCB7IHJldHVybiBtX2hhc0FscGhhOyB9Cisg
ICAgICAgIHVuc2lnbmVkIHRvdGFsQnl0ZXMoKSBjb25zdCB7IHJldHVybiBtX2J1ZmZlcldpZHRo
ICogbV9leHBlY3RlZEhlaWdodCA8PCAobV8xNmJpdCA/IDEgOiAyKTsgfQorCisgICAgICAgIHZv
aWQgc2V0Q2FuRnJlZUJ1ZmZlcihib29sIGNhbik7CisgICAgICAgIGJvb2wgc2V0U2l6ZShpbnQg
d2lkdGgsIGludCBoZWlnaHQsIGJvb2wgaXMxNmJpdCkKKyAgICAgICAgeworICAgICAgICAgICAg
bV8xNmJpdCA9IGlzMTZiaXQ7CisgICAgICAgICAgICBtX2ltYWdlV2lkdGggPSB3aWR0aDsKKyAg
ICAgICAgICAgIG1fZXhwZWN0ZWRIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICByZXR1cm4g
YWxsb2NhdGVCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldFJlY3QoY29uc3Qg
SW50UmVjdCYgcikgeyBtX3JlY3QgPSByOyB9CisgICAgICAgIHZvaWQgZW5zdXJlSGVpZ2h0KGlu
dCByb3dJbmRleCk7CisgICAgICAgIHZvaWQgc2V0U3RhdHVzKFJHQkEzMkJ1ZmZlcjo6RnJhbWVT
dGF0dXMgcykgeyBtX3N0YXR1cyA9IHM7IH0KKyAgICAgICAgdm9pZCBzZXREdXJhdGlvbih1bnNp
Z25lZCBkdXJhdGlvbikgeyBtX2R1cmF0aW9uID0gZHVyYXRpb247IH0KKyAgICAgICAgdm9pZCBz
ZXRIYXNBbHBoYShib29sIGFscGhhKSB7IG1faGFzQWxwaGEgPSBhbHBoYTsgfQorICAgICAgICBi
b29sIHVzZXNUcmFuc3BhcmVudENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV91c2VzVHJhbnNwYXJl
bnRDb2xvcjsgfQorICAgICAgICB1bnNpZ25lZCBzaG9ydCB0cmFuc3BhcmVudENvbG9yKCkgY29u
c3QgeyByZXR1cm4gbV90cmFuc3BhcmVudENvbG9yOyB9CisgICAgICAgIHZvaWQgc2V0VHJhbnNw
YXJlbnRDb2xvcih1bnNpZ25lZCBzaG9ydCBjb2xvcikKKyAgICAgICAgeworICAgICAgICAgICAg
bV90cmFuc3BhcmVudENvbG9yID0gY29sb3I7CisgICAgICAgICAgICBtX3VzZXNUcmFuc3BhcmVu
dENvbG9yID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNsZWFyVHJhbnNwYXJlbnRD
b2xvcigpIHsgbV91c2VzVHJhbnNwYXJlbnRDb2xvciA9IGZhbHNlOyB9CisgICAgICAgIFJHQkEz
MkJ1ZmZlcjo6RnJhbWVEaXNwb3NhbE1ldGhvZCBkaXNwb3NhbE1ldGhvZCgpIGNvbnN0IHsgcmV0
dXJuIG1fZGlzcG9zYWxNZXRob2Q7IH0KKyAgICAgICAgdm9pZCBzZXREaXNwb3NhbE1ldGhvZChS
R0JBMzJCdWZmZXI6OkZyYW1lRGlzcG9zYWxNZXRob2QgbWV0aG9kKSB7IG1fZGlzcG9zYWxNZXRo
b2QgPSBtZXRob2Q7IH0KKyAgICAgICAgYm9vbCBjb21wb3NpdGVkV2l0aFByZXZpb3VzRnJhbWUo
KSBjb25zdCB7IHJldHVybiBtX2NvbXBvc2l0ZWRXaXRoUHJldmlvdXNGcmFtZTsgfQorICAgICAg
ICB2b2lkIHNldENvbXBvc2l0ZWRXaXRoUHJldmlvdXNGcmFtZSgpIHsgbV9jb21wb3NpdGVkV2l0
aFByZXZpb3VzRnJhbWUgPSB0cnVlOyB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgc2V0UkdCQSh1
bnNpZ25lZCYgcG9zLCB1bnNpZ25lZCByLCB1bnNpZ25lZCBnLCB1bnNpZ25lZCBiLCB1bnNpZ25l
ZCBhKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBzdG9yZSB0aGlzIGRhdGEgcHJlLW11
bHRpcGxpZWQuCisgICAgICAgICAgICBpZiAoIWEpCisgICAgICAgICAgICAgICAgcG9zID0gKHIg
PDwgMTYgfCBnIDw8IDggfCBiKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAg
IGlmIChhIDwgMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhUGVyY2VudCA9
IGEgLyAyNTUuMGY7CisgICAgICAgICAgICAgICAgICAgIHIgPSBzdGF0aWNfY2FzdDx1bnNpZ25l
ZD4ociAqIGFscGhhUGVyY2VudCk7CisgICAgICAgICAgICAgICAgICAgIGcgPSBzdGF0aWNfY2Fz
dDx1bnNpZ25lZD4oZyAqIGFscGhhUGVyY2VudCk7CisgICAgICAgICAgICAgICAgICAgIGIgPSBz
dGF0aWNfY2FzdDx1bnNpZ25lZD4oYiAqIGFscGhhUGVyY2VudCk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIHBvcyA9IChhIDw8IDI0IHwgciA8PCAxNiB8IGcgPDwgOCB8IGIp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgc2V0UkdC
MTYodW5zaWduZWQgc2hvcnQmIHBvcywgdW5zaWduZWQgciwgdW5zaWduZWQgZywgdW5zaWduZWQg
YikKKyAgICAgICAgeworI2lmIElNQUdFX05PX0FMUEhBX1VTRV9SR0I1NTUKKyAgICAgICAgICAg
IHBvcyA9IHVuc2lnbmVkIHNob3J0KChyID4+IDMgPDwgMTApIHwgKGcgPj4gMyA8PCA1KSB8IChi
ID4+IDMpKTsKKyNlbHNlCisgICAgICAgICAgICBwb3MgPSB1bnNpZ25lZCBzaG9ydCgociA+PiAz
IDw8IDExKSB8IChnID4+IDIgPDwgNSkgfCAoYiA+PiAzKSk7CisjZW5kaWYKKyAgICAgICAgfQor
CisgICAgICAgIHN0YXRpYyBJbWFnZUZyYW1lU2luayogY3JlYXRlSW5zdGFuY2UoYm9vbCBjYW5G
cmVlQnVmZmVyKTsKKyAgICAgICAgc3RhdGljIHZvaWQgZGVsZXRlSW5zdGFuY2UoSW1hZ2VGcmFt
ZVNpbmsqKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgSW50UmVjdCBtX3JlY3Q7ICAgIC8v
IFRoZSByZWN0IG9mIHRoZSBvcmlnaW5hbCBzcGVjaWZpZWQgZnJhbWUgd2l0aGluIHRoZSBvdmVy
YWxsIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBhbHdh
eXMganVzdCBiZSB0aGUgZW50aXJlIGJ1ZmZlciBleGNlcHQgZm9yIEdJRiBmcmFtZXMKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIHdob3NlIG9yaWdpbmFsIHJlY3Qgd2FzIHNtYWxsZXIg
dGhhbiB0aGUgb3ZlcmFsbCBpbWFnZSBzaXplLgorICAgICAgICBpbnQgbV9pbWFnZVdpZHRoOwor
ICAgICAgICBpbnQgbV9idWZmZXJXaWR0aDsKKyAgICAgICAgaW50IG1faGVpZ2h0OyAvLyBUaGUg
aGVpZ2h0ICh0aGUgbnVtYmVyIG9mIHJvd3Mgd2UndmUgZnVsbHkgZGVjb2RlZCkuCisgICAgICAg
IGludCBtX2V4cGVjdGVkSGVpZ2h0OworICAgICAgICBSR0JBMzJCdWZmZXI6OkZyYW1lU3RhdHVz
IG1fc3RhdHVzOyAvLyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZyYW1lIGlzIGNvbXBsZXRlbHkgZmlu
aXNoZWQgZGVjb2RpbmcuCisgICAgICAgIFJHQkEzMkJ1ZmZlcjo6RnJhbWVEaXNwb3NhbE1ldGhv
ZCBtX2Rpc3Bvc2FsTWV0aG9kOyAvLyBXaGF0IHRvIGRvIHdpdGggdGhpcyBmcmFtZSdzIGRhdGEg
d2hlbiBpbml0aWFsaXppbmcgdGhlIG5leHQgZnJhbWUuCisgICAgICAgIHVuc2lnbmVkIG1fZHVy
YXRpb247IC8vIFRoZSBhbmltYXRpb24gZGVsYXkuCisgICAgICAgIHVuc2lnbmVkIHNob3J0IG1f
dHJhbnNwYXJlbnRDb2xvcjsgLy8gcGl4ZWwgdmFsdWUKKyAgICAgICAgYm9vbCBtX3VzZXNUcmFu
c3BhcmVudENvbG9yOworICAgICAgICBib29sIG1faGFzQWxwaGE7IC8vIFdoZXRoZXIgb3Igbm90
IGFueSBvZiB0aGUgcGl4ZWxzIGluIHRoZSBidWZmZXIgaGF2ZSB0cmFuc3BhcmVuY3kuCisgICAg
ICAgIGJvb2wgbV9jYW5GcmVlQnVmZmVyOworICAgICAgICBib29sIG1fc2hvdWxkRnJlZUJ1ZmZl
cjsKKyAgICAgICAgYm9vbCBtXzE2Yml0OworICAgICAgICBib29sIG1fY29tcG9zaXRlZFdpdGhQ
cmV2aW91c0ZyYW1lOworI2lmIFBMQVRGT1JNKFdJTkNFKQorICAgICAgICBSZWZQdHI8U2hhcmVk
Qml0bWFwPiBtX2JtcDsKKyAgICAgICAgdm9pZCBmaW5pc2hCaXRtYXAoKTsKKyNlbmRpZgorICAg
IH07CisKK30KKworI2VuZGlmIC8vIElNQUdFX0ZSQU1FX1NJTktfSF8KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFtZVNpbmtXaW5jZS5jcHAgYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rV2luY2UuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzRmOTgKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rV2luY2Uu
Y3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9y
Y2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZUZyYW1lU2luay5oIgorCisjaW5jbHVkZSA8d3Rm
L093blB0ci5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2lmIElNQUdFX05PX0FMUEhBX1VT
RV9SR0I1NTUKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY29udmVydDE2VG9SR0IodW5zaWduZWQg
c2hvcnQgcGl4ZWwpCit7CisgICAgdW5zaWduZWQgciA9IChwaXhlbCA+PiA3KSAmIDB4Rjg7Cisg
ICAgdW5zaWduZWQgZyA9IChwaXhlbCA+PiAyKSAmIDB4Rjg7CisgICAgdW5zaWduZWQgYiA9IChw
aXhlbCA8PCAzKSAmIDB4Rjg7CisgICAgcmV0dXJuIFJHQihyLCBnLCBiKTsKK30KKyNlbHNlIC8v
IFJHQjU2NQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjb252ZXJ0MTZUb1JHQih1bnNpZ25lZCBz
aG9ydCBwaXhlbCkKK3sKKyAgICB1bnNpZ25lZCByID0gKHBpeGVsID4+IDgpICYgMHhGODsKKyAg
ICB1bnNpZ25lZCBnID0gKHBpeGVsID4+IDMpICYgMHhGQzsKKyAgICB1bnNpZ25lZCBiID0gKHBp
eGVsIDw8IDMpICYgMHhGODsKKyAgICByZXR1cm4gUkdCKHIsIGcsIGIpOworfQorI2VuZGlmCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3Qgdm9pZCogSW1hZ2VGcmFtZVNpbms6OmJ5dGVz
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9ibXAgPyBtX2JtcC0+Ynl0ZXMoKSA6IDA7Cit9CisK
K3ZvaWQqIEltYWdlRnJhbWVTaW5rOjpieXRlcygpCit7CisgICAgcmV0dXJuIG1fYm1wID8gbV9i
bXAtPmJ5dGVzKCkgOiAwOworfQorCitib29sIEltYWdlRnJhbWVTaW5rOjphbGxvY2F0ZUJ1ZmZl
cigpCit7CisgICAgZnJlZUJ1ZmZlcigpOworCisgICAgaWYgKG1faW1hZ2VXaWR0aCA8PSAwIHx8
IG1fZXhwZWN0ZWRIZWlnaHQgPD0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYg
KG1fMTZiaXQpIHsKKyAgICAgICAgbV9idWZmZXJXaWR0aCA9IG1faW1hZ2VXaWR0aCA+PiAxIDw8
IDE7CisgICAgICAgIGlmIChtX2J1ZmZlcldpZHRoICE9IG1faW1hZ2VXaWR0aCkKKyAgICAgICAg
ICAgIG1fYnVmZmVyV2lkdGggKz0gMjsKKyAgICB9IGVsc2UKKyAgICAgICAgbV9idWZmZXJXaWR0
aCA9IG1faW1hZ2VXaWR0aDsKKworICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7
CisKKyAgICBpZiAobV9ibXAgPSBTaGFyZWRCaXRtYXA6OmNyZWF0ZUluc3RhbmNlKG1fMTZiaXQs
IG1faW1hZ2VXaWR0aCwgbV9leHBlY3RlZEhlaWdodCwgdHJ1ZSkpIHsKKyAgICAgICAgbV9ibXAt
PmxvY2soKTsKKyAgICAgICAgbV9ibXAtPnNldFZhbGlkSGVpZ2h0KDApOworICAgICAgICBpZiAo
bV8xNmJpdCAmJiBtX3VzZXNUcmFuc3BhcmVudENvbG9yICYmICFtX2JtcC0+dXNlc1RyYW5zcGFy
ZW50Q29sb3IoKSkKKyAgICAgICAgICAgIG1fYm1wLT5zZXRUcmFuc3BhcmVudENvbG9yKGNvbnZl
cnQxNlRvUkdCKG1fdHJhbnNwYXJlbnRDb2xvcikpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSW1hZ2VGcmFtZVNpbms6OmlzQnVm
ZmVyUmVhZHkoKSBjb25zdCB7IHJldHVybiAhIW1fYm1wOyB9Cit2b2lkIEltYWdlRnJhbWVTaW5r
OjpmcmVlQnVmZmVyKCkKK3sKKyAgICBpZiAobV9ibXApIHsKKyAgICAgICAgaWYgKCFtX2JtcC0+
aGFzT25lUmVmKCkpCisgICAgICAgICAgICBmaW5pc2hCaXRtYXAoKTsKKyAgICAgICAgbV9ibXAg
PSAwOworICAgIH0KK30KKworTmF0aXZlSW1hZ2VQdHIgSW1hZ2VGcmFtZVNpbms6OmdldEZyYW1l
KCkKK3sKKyAgICBpZiAobV9zdGF0dXMgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5IHx8ICFt
X2JtcCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtX2JtcC0+c2V0SGFzQWxwaGEoaGFzQWxw
aGEoKSk7CisgICAgbV9zaG91bGRGcmVlQnVmZmVyID0gbV9zdGF0dXMgPT0gUkdCQTMyQnVmZmVy
OjpGcmFtZUNvbXBsZXRlOworICAgIGlmIChtX2NhbkZyZWVCdWZmZXIgJiYgbV9zaG91bGRGcmVl
QnVmZmVyKQorICAgICAgICBmaW5pc2hCaXRtYXAoKTsKKworICAgIHJldHVybiBtX2JtcDsKK30K
Kwordm9pZCBJbWFnZUZyYW1lU2luazo6c2V0Q2FuRnJlZUJ1ZmZlcihib29sIGNhbikKK3sKKyAg
ICBtX2NhbkZyZWVCdWZmZXIgPSBjYW47CisgICAgaWYgKG1fY2FuRnJlZUJ1ZmZlciAmJiBtX3No
b3VsZEZyZWVCdWZmZXIpCisgICAgICAgIGZpbmlzaEJpdG1hcCgpOworfQorCit2b2lkIEltYWdl
RnJhbWVTaW5rOjpmaW5pc2hCaXRtYXAoKQoreworICAgIGlmIChtX2JtcCAmJiBtX2JtcC0+bG9j
a2VkKCkpIHsKKyAgICAgICAgbV9ibXAtPnVubG9jaygpOworICAgICAgICBpZiAobV91c2VzVHJh
bnNwYXJlbnRDb2xvcikKKyAgICAgICAgICAgIG1fYm1wLT5zZXRUcmFuc3BhcmVudENvbG9yKGNv
bnZlcnQxNlRvUkdCKG1fdHJhbnNwYXJlbnRDb2xvcikpOworICAgICAgICBpZiAoIW1fMTZiaXQg
JiYgKCFtX2hhc0FscGhhIHx8IG1fdXNlc1RyYW5zcGFyZW50Q29sb3IpKSB7CisgICAgICAgICAg
ICBtX2JtcC0+c2V0SGFzQWxwaGEoZmFsc2UpOworICAgICAgICAgICAgbV8xNmJpdCA9IG1fYm1w
LT50bzE2Yml0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fMTZiaXQpCisgICAgICAgICAg
ICBzZXRIYXNBbHBoYShmYWxzZSk7CisgICAgICAgIG1fYm1wLT5zZXRIYXNBbHBoYShoYXNBbHBo
YSgpKTsKKyAgICB9Cit9OworCit2b2lkIEltYWdlRnJhbWVTaW5rOjplbnN1cmVIZWlnaHQoaW50
IHJvd0luZGV4KQoreworICAgIGlmIChyb3dJbmRleCA+IG1faGVpZ2h0KSB7CisgICAgICAgIG1f
aGVpZ2h0ID0gcm93SW5kZXg7CisgICAgICAgIGlmIChtX2JtcCkKKyAgICAgICAgICAgIG1fYm1w
LT5zZXRWYWxpZEhlaWdodChtX2hlaWdodCk7CisgICAgfQorfQorCitJbWFnZUZyYW1lU2luayog
SW1hZ2VGcmFtZVNpbms6OmNyZWF0ZUluc3RhbmNlKGJvb2wgY2FuRnJlZUJ1ZmZlcikKK3sKKyAg
ICByZXR1cm4gbmV3IEltYWdlRnJhbWVTaW5rKGNhbkZyZWVCdWZmZXIpOworfQorCit2b2lkIElt
YWdlRnJhbWVTaW5rOjpkZWxldGVJbnN0YW5jZShJbWFnZUZyYW1lU2luayogaSkKK3sKKyAgICBk
ZWxldGUgaTsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW5jZS9JbWFnZVNvdXJjZVdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvSW1hZ2VTb3VyY2VXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uZTY4NjAzOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvSW1hZ2VTb3VyY2VXaW5jZS5jcHAKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHAudG9rZXJAY29sbGFib3JhLmNv
LnVrPgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMKKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2VTb3VyY2UuaCIKKworI2lu
Y2x1ZGUgIkdJRkltYWdlRGVjb2Rlci5oIgorI2luY2x1ZGUgIkltYWdlRGVjb2Rlci5oIgorI2lu
Y2x1ZGUgIkpQRUdJbWFnZURlY29kZXIuaCIKKyNpbmNsdWRlICJQTkdJbWFnZURlY29kZXIuaCIK
KyNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5j
bHVkZSA8d3RmL0hhc2hTZXQuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCit0eXBlZGVmIEhhc2hTZXQ8U2hhcmVkQml0bWFwKj4gQml0bWFwTWFwOwor
ZXh0ZXJuIEJpdG1hcE1hcCBnX2JpdG1hcE1hcDsKKworaW50IGRpc2NhcmRCaXRtYXBIYW5kbGVz
KCkKK3sKKyAgICBpbnQgZGVsZXRlZCA9IDA7CisgICAgZm9yIChCaXRtYXBNYXA6Oml0ZXJhdG9y
IGkgPSBnX2JpdG1hcE1hcC5iZWdpbigpOyBpICE9IGdfYml0bWFwTWFwLmVuZCgpOyArK2kpIHsK
KyAgICAgICAgaWYgKCgqaSktPmZyZWVNZW1vcnkoKSkKKyAgICAgICAgICAgICsrZGVsZXRlZDsK
KyAgICB9CisgICAgcmV0dXJuIGRlbGV0ZWQ7Cit9CisKK3N0YXRpYyBJbWFnZURlY29kZXIqIGNy
ZWF0ZURlY29kZXIoY29uc3QgU2hhcmVkQnVmZmVyKiBidWZmZXIpCit7CisgICAgTWVtb3J5QWxs
b2NhdGlvbkNhbkZhaWwgY2FuRmFpbDsKKworICAgIC8vIFdlIG5lZWQgYXQgbGVhc3QgNCBieXRl
cyB0byBmaWd1cmUgb3V0IHdoYXQga2luZCBvZiBpbWFnZSB3ZSdyZSBkZWFsaW5nIHdpdGguCisg
ICAgU2hhcmVkQnVmZmVyU2VnbWVudCBzZWdtZW50KCpidWZmZXIpOworICAgIGludCBsZW5ndGgg
PSBzZWdtZW50Lmxlbmd0aCgpOworICAgIGlmIChsZW5ndGggPCA0KQorICAgICAgICByZXR1cm4g
MDsKKworICAgIC8vIEdJRnMgYmVnaW4gd2l0aCBHSUY4KDcgb3IgOSkuCisgICAgaWYgKHN0cm5j
bXAoc2VnbWVudC5kYXRhKCksICJHSUY4IiwgNCkgPT0gMCkgeworICAgICAgICBHSUZJbWFnZURl
Y29kZXIqIHJ0biA9IG5ldyBHSUZJbWFnZURlY29kZXIoKTsKKyAgICAgICAgaWYgKHJ0bikKKyAg
ICAgICAgICAgIHJ0bi0+c2V0TWF4TnVtUGl4ZWxzKDEwMjQgKiAxMDI0KTsKKyAgICAgICAgcmV0
dXJuIHJ0bjsKKyAgICB9CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiB1Q29udGVudHMgPSAo
Y29uc3QgdW5zaWduZWQgY2hhciopc2VnbWVudC5kYXRhKCk7CisKKyAgICAvLyBUZXN0IGZvciBQ
TkcuCisgICAgaWYgKHVDb250ZW50c1swXSA9PSAweDg5ICYmIHVDb250ZW50c1sxXSA9PSAweDUw
ICYmIHVDb250ZW50c1syXSA9PSAweDRFICYmIHVDb250ZW50c1szXSA9PSAweDQ3ICkgeworICAg
ICAgICBQTkdJbWFnZURlY29kZXIqIHJ0biA9IG5ldyBQTkdJbWFnZURlY29kZXIoKTsKKyAgICAg
ICAgaWYgKHJ0bikKKyAgICAgICAgICAgIHJ0bi0+c2V0TWF4TnVtUGl4ZWxzKDEwMjQgKiAxMDI0
KTsKKyAgICAgICAgcmV0dXJuIHJ0bjsKKyAgICB9CisKKyAgICAvLyBKUEVHCisgICAgaWYgKHVD
b250ZW50c1swXSA9PSAweEZGICYmIHVDb250ZW50c1sxXSA9PSAweEQ4ICYmIHVDb250ZW50c1sy
XSA9PSAweEZGKSB7CisgICAgICAgIEpQRUdJbWFnZURlY29kZXIqIHJ0biA9IG5ldyBKUEVHSW1h
Z2VEZWNvZGVyKCk7CisgICAgICAgIGlmIChydG4pCisgICAgICAgICAgICBydG4tPnNldE1heE51
bVBpeGVscygxMDI0ICogMTAyNCk7CisgICAgICAgIHJldHVybiBydG47CisgICAgfQorCisgICAg
Ly8gRklYTUU6IG5vdCBzdXBwb3J0aW5nIEJNUCwgSUNPIGFuZCBYQk0gZm9yIG5vdy4KKworICAg
IC8vIEdpdmUgdXAuIFdlIGRvbid0IGtub3cgd2hhdCB0aGUgaGVjayB0aGlzIGlzLgorICAgIHJl
dHVybiAwOworfQorCitJbWFnZVNvdXJjZTo6SW1hZ2VTb3VyY2UoKQorICAgIDogbV9kZWNvZGVy
KDApCisgICAgLCBtX2FsbERhdGFSZWNlaXZlZChmYWxzZSkKK3sKK30KKworSW1hZ2VTb3VyY2U6
On5JbWFnZVNvdXJjZSgpCit7CisgICAgZGVsZXRlIG1fZGVjb2RlcjsKK30KKwordm9pZCBJbWFn
ZVNvdXJjZTo6Y2xlYXIoYm9vbCBkZXN0cm95QWxsLCBzaXplX3QgY2xlYXJCZWZvcmVGcmFtZSwg
U2hhcmVkQnVmZmVyKiBkYXRhLCBib29sIGFsbERhdGFSZWNlaXZlZCkKK3sKKyAgICBpZiAoZGVz
dHJveUFsbCkgeworICAgICAgICBkZWxldGUgbV9kZWNvZGVyOworICAgICAgICBtX2RlY29kZXIg
PSAwOworICAgICAgICBpZiAoZGF0YSkKKyAgICAgICAgICBzZXREYXRhKGRhdGEsIGFsbERhdGFS
ZWNlaXZlZCk7CisgICAgfSBlbHNlIGlmIChtX2RlY29kZXIpCisgICAgICAgIG1fZGVjb2Rlci0+
Y2xlYXJGcmFtZUJ1ZmZlckNhY2hlKGNsZWFyQmVmb3JlRnJhbWUpOworfQorCitib29sIEltYWdl
U291cmNlOjppbml0aWFsaXplZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuICEhbV9kZWNvZGVyOwor
fQorCit2b2lkIEltYWdlU291cmNlOjpzZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBh
bGxEYXRhUmVjZWl2ZWQpCit7CisgICAgLy8gTWFrZSB0aGUgZGVjb2RlciBieSBzbmlmZmluZyB0
aGUgYnl0ZXMuCisgICAgLy8gVGhpcyBtZXRob2Qgd2lsbCBleGFtaW5lIHRoZSBkYXRhIGFuZCBp
bnN0YW50aWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgZGVjb2RlciBwbHVnaW4u
CisgICAgLy8gSWYgaW5zdWZmaWNpZW50IGJ5dGVzIGFyZSBhdmFpbGFibGUgdG8gZGV0ZXJtaW5l
IHRoZSBpbWFnZSB0eXBlLCBubyBkZWNvZGVyIHBsdWdpbiB3aWxsIGJlCisgICAgLy8gbWFkZS4K
KyAgICBtX2FsbERhdGFSZWNlaXZlZCA9IGFsbERhdGFSZWNlaXZlZDsKKyAgICBpZiAobV9hbGxE
YXRhUmVjZWl2ZWQgJiYgIW1fZGVjb2RlcikKKyAgICAgICAgbV9kZWNvZGVyID0gY3JlYXRlRGVj
b2RlcihkYXRhKTsKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuOworICAgIG1f
ZGVjb2Rlci0+c2V0RGF0YShkYXRhLCBhbGxEYXRhUmVjZWl2ZWQpOworfQorCitib29sIEltYWdl
U291cmNlOjppc1NpemVBdmFpbGFibGUoKQoreworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gbV9kZWNvZGVyLT5pc1NpemVBdmFpbGFibGUo
KTsKK30KKworSW50U2l6ZSBJbWFnZVNvdXJjZTo6c2l6ZSgpIGNvbnN0Cit7CisgICAgaWYgKCFt
X2RlY29kZXIpCisgICAgICAgIHJldHVybiBJbnRTaXplKCk7CisKKyAgICByZXR1cm4gbV9kZWNv
ZGVyLT5zaXplKCk7Cit9CisKK2ludCBJbWFnZVNvdXJjZTo6cmVwZXRpdGlvbkNvdW50KCkKK3sK
KyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIGNBbmltYXRpb25Ob25lOworCisg
ICAgcmV0dXJuIG1fZGVjb2Rlci0+cmVwZXRpdGlvbkNvdW50KCk7Cit9CisKK3NpemVfdCBJbWFn
ZVNvdXJjZTo6ZnJhbWVDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGVjb2RlciA/IG1f
ZGVjb2Rlci0+ZnJhbWVDb3VudCgpIDogMDsKK30KKworTmF0aXZlSW1hZ2VQdHIgSW1hZ2VTb3Vy
Y2U6OmNyZWF0ZUZyYW1lQXRJbmRleChzaXplX3QgaW5kZXgpCit7CisgICAgaWYgKCFtX2RlY29k
ZXIpCisgICAgICAgIHJldHVybiAwOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9IG1f
ZGVjb2Rlci0+ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKworICAgIGlmICghYnVmZmVyIHx8
IGJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5KQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIHJldHVybiBidWZmZXItPmdldEZyYW1lKCk7Cit9CisKK2Jvb2wgSW1h
Z2VTb3VyY2U6OmZyYW1lSXNDb21wbGV0ZUF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIGlm
ICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBJbWFnZUZyYW1lU2lu
ayogYnVmZmVyID0gbV9kZWNvZGVyLT5mcmFtZUJ1ZmZlckF0SW5kZXgoaW5kZXgpOworICAgIHJl
dHVybiBidWZmZXIgJiYgYnVmZmVyLT5zdGF0dXMoKSA9PSBSR0JBMzJCdWZmZXI6OkZyYW1lQ29t
cGxldGU7Cit9CisKK2Zsb2F0IEltYWdlU291cmNlOjpmcmFtZUR1cmF0aW9uQXRJbmRleChzaXpl
X3QgaW5kZXgpCit7CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgZmxvYXQgZHVyYXRpb247CisKKyAgICBJbWFnZUZyYW1lU2luayogYnVmZmVyID0gbV9kZWNv
ZGVyLT5mcmFtZUJ1ZmZlckF0SW5kZXgoaW5kZXgpOworICAgIGlmICghYnVmZmVyKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIGR1cmF0aW9uID0gYnVmZmVyLT5kdXJhdGlvbigpIC8gMTAwMC4w
ZjsKKworICAgIC8vIE1hbnkgYW5ub3lpbmcgYWRzIHNwZWNpZnkgYSAwIGR1cmF0aW9uIHRvIG1h
a2UgYW4gaW1hZ2UgZmxhc2ggYXMgcXVpY2tseQorICAgIC8vIGFzIHBvc3NpYmxlLiAgV2UgZm9s
bG93IFdpbklFJ3MgYmVoYXZpb3IgYW5kIHVzZSBhIGR1cmF0aW9uIG9mIDEwMCBtcworICAgIC8v
IGZvciBhbnkgZnJhbWVzIHRoYXQgc3BlY2lmeSBhIGR1cmF0aW9uIG9mIDw9IDUwIG1zLiAgU2Vl
CisgICAgLy8gPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NDEzPiBv
ciBSYWRhciA0MDUxMzg5IGZvcgorICAgIC8vIG1vcmUuCisgICAgcmV0dXJuIChkdXJhdGlvbiA8
IDAuMDUxZikgPyAwLjEwMGYgOiBkdXJhdGlvbjsKK30KKworYm9vbCBJbWFnZVNvdXJjZTo6ZnJh
bWVIYXNBbHBoYUF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIGlmICghbV9kZWNvZGVyIHx8
ICFtX2RlY29kZXItPnN1cHBvcnRzQWxwaGEoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9IG1fZGVjb2Rlci0+ZnJhbWVCdWZmZXJBdEluZGV4
KGluZGV4KTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
cmV0dXJuIGJ1ZmZlci0+aGFzQWxwaGEoKTsKK30KKworSW50U2l6ZSBJbWFnZVNvdXJjZTo6ZnJh
bWVTaXplQXRJbmRleChzaXplX3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIHNpemUoKTsKK30KKwor
U3RyaW5nIEltYWdlU291cmNlOjpmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0Cit7CisgICAgaWYg
KCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICByZXR1cm4gbV9kZWNv
ZGVyLT5maWxlbmFtZUV4dGVuc2lvbigpOworfQorCit9CisKKy8vIHZpbTogdHM9NCBzdz00IGV0
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlV2luY2Uu
Y3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVdpbmNlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNiMTZhCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVdpbmNlLmNwcApAQCAtMCww
ICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9i
aWxlIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIK
KworI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5o
IgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0
cml4LmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgor
CitzdGF0aWMgaW5saW5lIGludCBzdGFibGVSb3VuZChkb3VibGUgZCkKK3sKKyAgICBpZiAoZCA+
IDApCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGQgKyAwLjUpOworCisgICAgaW50
IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGQpOworICAgIHJldHVybiBpIC0gZCA+IDAuNSA/IGkgLSAx
IDogaTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJvbSBXZWJLaXQK
K1Bhc3NSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBsb2FkUmVzb3VyY2VJbnRvQnVmZmVy
KGNvbnN0IGNoYXIqIG5hbWUpOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Jvb2wgRnJhbWVE
YXRhOjpjbGVhcihib29sIGNsZWFyTWV0YURhdGEpCit7CisgICAgaWYgKGNsZWFyTWV0YURhdGEp
CisgICAgICAgIG1faGF2ZU1ldGFkYXRhID0gZmFsc2U7CisKKyAgICBpZiAobV9mcmFtZSkgewor
ICAgICAgICBtX2ZyYW1lID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAg
cmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJpdG1hcEltYWdlOjppbml0UGxhdGZvcm1EYXRhKCkK
K3sKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6aW52YWxpZGF0ZVBsYXRmb3JtRGF0YSgpCit7Cit9
CisKK2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVAoSEJJVE1BUCBibXApCit7CisgICAgcmV0
dXJuIGdldEhCSVRNQVBPZlNpemUoYm1wLCAwKTsKK30KKworYm9vbCBCaXRtYXBJbWFnZTo6Z2V0
SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwgTFBTSVpFIHNpemUpCit7CisgICAgaWYgKCFibXAp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEJJVE1BUCBibXBJbmZvOworICAgIEdldE9i
amVjdChibXAsIHNpemVvZihCSVRNQVApLCAmYm1wSW5mbyk7CisKKyAgICBBU1NFUlQoYm1wSW5m
by5ibUJpdHNQaXhlbCA9PSAzMik7CisgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lk
dGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CisKKyAgICBPd25QdHI8SERDPiBoZGMoQ3JlYXRl
Q29tcGF0aWJsZURDKDApKTsKKyAgICBIR0RJT0JKIGhPbGRCbXAgPSBTZWxlY3RPYmplY3QoaGRj
LmdldCgpLCBibXApOworCisgICAgeworICAgICAgICBHcmFwaGljc0NvbnRleHQgZ2MoaGRjLmdl
dCgpKTsKKworICAgICAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7
CisgICAgICAgIGlmIChzaXplKQorICAgICAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VT
aXplKCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdo
dCksIEludFNpemUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8u
Ym1IZWlnaHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5o
ZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOworICAgIH0KKworICAgIFNlbGVjdE9iamVjdChoZGMu
Z2V0KCksIGhPbGRCbXApOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQml0bWFwSW1h
Z2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNv
bnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29tcG9zaXRl
T3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsK
KyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7CisgICAgICAgIFJlZlB0cjxT
aGFyZWRCaXRtYXA+IGJtcCA9IGZyYW1lQXRJbmRleChpKTsKKyAgICAgICAgaWYgKGJtcCAmJiBi
bXAtPmhlaWdodCgpID09IChzaXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAmJiBibXAtPndpZHRoKCkg
PT0gKHNpemVfdClzcmNTaXplLndpZHRoKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBjdXJyZW50
RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsK
KyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1NpemUu
d2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAgIG1f
Y3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisgICAgfQorCisgICAgLy8gTm8gaW1hZ2Ugb2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91
bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBJbnRTaXplIGlt
YWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBG
bG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNv
bXBvc2l0ZU9wKTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhdyhHcmFwaGljc0NvbnRleHQq
IGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0
SW4sIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGlmICghbV9zb3VyY2Uu
aW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUmVmUHRyPFNoYXJlZEJpdG1h
cD4gYm1wID0gZnJhbWVBdEluZGV4KG1fY3VycmVudEZyYW1lKTsKKyAgICBpZiAobWF5RmlsbFdp
dGhTb2xpZENvbG9yKCkpCisgICAgICAgIGZpbGxXaXRoU29saWRDb2xvcihjdHh0LCBkc3RSZWN0
LCBzb2xpZENvbG9yKCksIGNvbXBvc2l0ZU9wKTsKKyAgICBlbHNlIHsKKyAgICAgICAgSW50UmVj
dCBpbnRTcmNSZWN0KHNyY1JlY3RJbik7CisKKyAgICAgICAgaWYgKGJtcC0+d2lkdGgoKSAhPSBt
X3NvdXJjZS5zaXplKCkud2lkdGgoKSkgeworICAgICAgICAgICAgZG91YmxlIHJhdGUgPSAoZG91
YmxlKWJtcC0+d2lkdGgoKSAvIG1fc291cmNlLnNpemUoKS53aWR0aCgpOworICAgICAgICAgICAg
aW50IHRlbXAgPSBzdGFibGVSb3VuZChzcmNSZWN0SW4ucmlnaHQoKSAqIHJhdGUpOworICAgICAg
ICAgICAgaW50U3JjUmVjdC5zZXRYKHN0YWJsZVJvdW5kKHNyY1JlY3RJbi54KCkgKiByYXRlKSk7
CisgICAgICAgICAgICBpbnRTcmNSZWN0LnNldFdpZHRoKHRlbXAgLSBpbnRTcmNSZWN0LngoKSk7
CisgICAgICAgICAgICB0ZW1wID0gc3RhYmxlUm91bmQoc3JjUmVjdEluLmJvdHRvbSgpICogcmF0
ZSk7CisgICAgICAgICAgICBpbnRTcmNSZWN0LnNldFkoc3RhYmxlUm91bmQoc3JjUmVjdEluLnko
KSAqIHJhdGUpKTsKKyAgICAgICAgICAgIGludFNyY1JlY3Quc2V0SGVpZ2h0KHRlbXAgLSBpbnRT
cmNSZWN0LnkoKSk7CisgICAgICAgIH0KKyAgICAgICAgYm1wLT5kcmF3KGN0eHQsIGVuY2xvc2lu
Z0ludFJlY3QoZHN0UmVjdCksIGludFNyY1JlY3QsIGNvbXBvc2l0ZU9wKTsKKyAgICB9CisKKyAg
ICBzdGFydEFuaW1hdGlvbigpOworfQorCitQYXNzUmVmUHRyPEltYWdlPiBJbWFnZTo6bG9hZFBs
YXRmb3JtUmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBSZWZQdHI8U2hhcmVkQnVm
ZmVyPiBidWZmZXIgPSBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKG5hbWUpOworICAgIFJlZlB0cjxC
aXRtYXBJbWFnZT4gaW1nID0gQml0bWFwSW1hZ2U6OmNyZWF0ZSgpOworICAgIGltZy0+c2V0RGF0
YShidWZmZXIucmVsZWFzZSgpLCB0cnVlKTsKKyAgICByZXR1cm4gaW1nOworfQorCit2b2lkIElt
YWdlOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYg
dGlsZVJlY3QsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAor
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0
ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29u
dGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRS
ZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBSZWZQdHI8U2hhcmVkQml0bWFwPiBibXAgPSBuYXRpdmVJ
bWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgIGlmIChibXApCisgICAgICAgIGJtcC0+ZHJhd1Bh
dHRlcm4oY3R4dCwgdGlsZVJlY3RJbiwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIG9wLCBkZXN0
UmVjdCwgbV9zb3VyY2Uuc2l6ZSgpKTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6Y2hlY2tGb3JT
b2xpZENvbG9yKCkKK3sKKyAgICBpZiAobV9jaGVja2VkRm9yU29saWRDb2xvcikKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKGZyYW1lQ291bnQoKSAhPSAxKSB7CisgICAgICAgIG1faXNTb2xp
ZENvbG9yID0gZmFsc2U7CisgICAgICAgIG1fY2hlY2tlZEZvclNvbGlkQ29sb3IgPSB0cnVlOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gYm1wID0g
ZnJhbWVBdEluZGV4KDApOworICAgIGlmICghYm1wIHx8ICFibXAtPnZhbGlkSGVpZ2h0KCkpIHsK
KyAgICAgICAgbV9pc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIGlmIChibXAtPndpZHRoKCkgPT0gMSAmJiBibXAtPnZhbGlkSGVpZ2h0KCkgPT0gMSkg
eworICAgICAgICBtX2lzU29saWRDb2xvciA9IHRydWU7CisKKyAgICAgICAgaWYgKGJtcC0+aXMx
NmJpdCgpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBjID0gKCh1bnNpZ25lZCBzaG9y
dCAqKWJtcC0+Ynl0ZXMoKSlbMF07CisjaWYgSU1BR0VfTk9fQUxQSEFfVVNFX1JHQjU1NQorICAg
ICAgICAgICAgaW50IHIgPSAoYyA+PiA3KSAmIDB4Rjg7CisgICAgICAgICAgICBpbnQgZyA9IChj
ID4+IDIpICYgMHhGODsKKyAgICAgICAgICAgIGludCBiID0gKGMgPDwgMykgJiAweEY4OworI2Vs
c2UKKyAgICAgICAgICAgIGludCByID0gKGMgPj4gOCkgJiAweEY4OworICAgICAgICAgICAgaW50
IGcgPSAoYyA+PiAzKSAmIDB4RkM7CisgICAgICAgICAgICBpbnQgYiA9IChjIDw8IDMpICYgMHhG
ODsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGJtcC0+dXNlc1RyYW5zcGFyZW50Q29sb3IoKSAm
JiBibXAtPnRyYW5zcGFyZW50Q29sb3IoKSA9PSBSR0IociwgZywgYikpCisgICAgICAgICAgICAg
ICAgbV9zb2xpZENvbG9yID0gQ29sb3IociwgZywgYiwgMCk7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgbV9zb2xpZENvbG9yID0gQ29sb3IociwgZywgYik7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjID0gKCh1bnNpZ25lZCAqKWJtcC0+Ynl0ZXMo
KSlbMF07CisgICAgICAgICAgICBtX3NvbGlkQ29sb3IgPSBDb2xvcihjKTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmIChibXAtPnZhbGlkSGVpZ2h0KCkgPT0gYm1wLT5oZWlnaHQoKSkKKyAgICAg
ICAgICAgIG1fY2hlY2tlZEZvclNvbGlkQ29sb3IgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAg
ICAgIG1faXNTb2xpZENvbG9yID0gZmFsc2U7CisgICAgICAgIG1fY2hlY2tlZEZvclNvbGlkQ29s
b3IgPSB0cnVlOworICAgIH0KK30KKworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNvZGVyLmNwcCBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSlBFR0VuY29kZXIuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzN2E4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNvZGVyLmNwcApAQCAtMCwwICsxLDE1
MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJ
TkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiSlBFR0VuY29kZXIuaCIKKworI2luY2x1ZGUgIlNoYXJlZEJpdG1hcC5oIgorCisjZGVmaW5l
IFhNRF9ICisjZGVmaW5lIFZUS19KUEVHX1hNRF9ICisjdW5kZWYgRkFSCisKK2V4dGVybiAiQyIg
eworI2luY2x1ZGUgImpwZWdsaWIuaCIKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdHJ1
Y3QganBlZ19kZXN0X21nciB7CisgICAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHB1YjsK
KyAgICBWZWN0b3I8Y2hhcj4gYnVmZmVyOworICAgIFZlY3RvcjxjaGFyPiogZHVtcDsKK307CisK
K3N0cnVjdCBqcGVnX2NvbXByZXNzX2Vycm9yX21nciB7CisgICAgc3RydWN0IGpwZWdfZXJyb3Jf
bWdyIHB1YjsKKyAgICBqbXBfYnVmIHNldGptcF9idWZmZXI7Cit9OworCit2b2lkIGpwZWdfaW5p
dF9kZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjb21wcmVzc0RhdGEpCit7CisgICAganBlZ19k
ZXN0X21nciogZGVzdCA9IChqcGVnX2Rlc3RfbWdyKiljb21wcmVzc0RhdGEtPmRlc3Q7CisgICAg
ZGVzdC0+YnVmZmVyLnJlc2l6ZSg0MDk2KTsKKyAgICBkZXN0LT5wdWIubmV4dF9vdXRwdXRfYnl0
ZSAgPSAoSk9DVEVUKilkZXN0LT5idWZmZXIuZGF0YSgpOworICAgIGRlc3QtPnB1Yi5mcmVlX2lu
X2J1ZmZlciAgICA9IGRlc3QtPmJ1ZmZlci5zaXplKCk7Cit9CisKK2Jvb2xlYW4ganBlZ19lbXB0
eV9vdXRwdXRfYnVmZmVyKGpfY29tcHJlc3NfcHRyIGNvbXByZXNzRGF0YSkKK3sKKyAgICBqcGVn
X2Rlc3RfbWdyKiBkZXN0ID0gKGpwZWdfZGVzdF9tZ3IqKWNvbXByZXNzRGF0YS0+ZGVzdDsKKyAg
ICBkZXN0LT5kdW1wLT5hcHBlbmQoZGVzdC0+YnVmZmVyLmRhdGEoKSwgZGVzdC0+YnVmZmVyLnNp
emUoKSAtIGRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlcik7CisgICAgZGVzdC0+cHViLm5leHRfb3V0
cHV0X2J5dGUgID0gKEpPQ1RFVCopZGVzdC0+YnVmZmVyLmRhdGEoKTsKKyAgICBkZXN0LT5wdWIu
ZnJlZV9pbl9idWZmZXIgICAgPSBkZXN0LT5idWZmZXIuc2l6ZSgpOworICAgIHJldHVybiBUUlVF
OworfQorCit2b2lkIGpwZWdfdGVybV9kZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjb21wcmVz
c0RhdGEpCit7CisgICAganBlZ19kZXN0X21nciogZGVzdCA9IChqcGVnX2Rlc3RfbWdyKiljb21w
cmVzc0RhdGEtPmRlc3Q7CisgICAgZGVzdC0+ZHVtcC0+YXBwZW5kKGRlc3QtPmJ1ZmZlci5kYXRh
KCksIGRlc3QtPmJ1ZmZlci5zaXplKCkgLSBkZXN0LT5wdWIuZnJlZV9pbl9idWZmZXIpOworfQor
Cit2b2lkIGpwZWdfZXJyb3JfZXhpdChqX2NvbW1vbl9wdHIgY29tcHJlc3NEYXRhKQoreworICAg
IGpwZWdfY29tcHJlc3NfZXJyb3JfbWdyICplcnIgPSAoanBlZ19jb21wcmVzc19lcnJvcl9tZ3Iq
KWNvbXByZXNzRGF0YS0+ZXJyOworICAgIGxvbmdqbXAoZXJyLT5zZXRqbXBfYnVmZmVyLCAtMSk7
Cit9CisKK2Jvb2wgY29tcHJlc3NCaXRtYXBUb0pwZWcoU2hhcmVkQml0bWFwKiBibXAsIFZlY3Rv
cjxjaGFyPiYganBlZ0RhdGEpCit7CisgICAgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNv
bXByZXNzRGF0YT0gezB9OworICAgIGpwZWdfY29tcHJlc3NfZXJyb3JfbWdyIGVycjsKKyAgICBj
b21wcmVzc0RhdGEuZXJyID0ganBlZ19zdGRfZXJyb3IoKGpwZWdfZXJyb3JfbWdyKikmZXJyKTsK
KyAgICBlcnIucHViLmVycm9yX2V4aXQgPSBqcGVnX2Vycm9yX2V4aXQ7CisKKyAgICBqcGVnX2Ny
ZWF0ZV9jb21wcmVzcygmY29tcHJlc3NEYXRhKTsKKworICAgIGpwZWdfZGVzdF9tZ3IqIGRlc3Qg
PSAoanBlZ19kZXN0X21nciopZmFzdENhbGxvYyhzaXplb2YoanBlZ19kZXN0X21nciksIDEpOwor
ICAgIGRlc3QtPmR1bXAgPSAmanBlZ0RhdGE7CisgICAgY29tcHJlc3NEYXRhLmRlc3QgPSAoc3Ry
dWN0IGpwZWdfZGVzdGluYXRpb25fbWdyKilkZXN0OworICAgIGRlc3QtPnB1Yi5pbml0X2Rlc3Rp
bmF0aW9uID0ganBlZ19pbml0X2Rlc3RpbmF0aW9uOworICAgIGRlc3QtPnB1Yi5lbXB0eV9vdXRw
dXRfYnVmZmVyID0ganBlZ19lbXB0eV9vdXRwdXRfYnVmZmVyOworICAgIGRlc3QtPnB1Yi50ZXJt
X2Rlc3RpbmF0aW9uID0ganBlZ190ZXJtX2Rlc3RpbmF0aW9uOworCisgICAgY29tcHJlc3NEYXRh
LmltYWdlX3dpZHRoID0gYm1wLT53aWR0aCgpOworICAgIGNvbXByZXNzRGF0YS5pbWFnZV9oZWln
aHQgPSBibXAtPmhlaWdodCgpOworICAgIGNvbXByZXNzRGF0YS5pbnB1dF9jb21wb25lbnRzID0g
MzsKKyAgICBjb21wcmVzc0RhdGEuaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworICAgIGpwZWdf
c2V0X2RlZmF1bHRzKCZjb21wcmVzc0RhdGEpOworICAgIGpwZWdfc2V0X3F1YWxpdHkoJmNvbXBy
ZXNzRGF0YSwgNjUsIEZBTFNFKTsKKworICAgIFZlY3RvcjxKU0FNUExFLCAyMDQ4PiByb3dCdWZm
ZXI7CisgICAgaWYgKHNldGptcChlcnIuc2V0am1wX2J1ZmZlcikpIHsKKyAgICAgICAganBlZ19k
ZXN0cm95X2NvbXByZXNzKCZjb21wcmVzc0RhdGEpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAganBlZ19zdGFydF9jb21wcmVzcygmY29tcHJlc3NEYXRhLCBUUlVFKTsKKwor
ICAgIHJvd0J1ZmZlci5yZXNpemUoY29tcHJlc3NEYXRhLmltYWdlX3dpZHRoICogMyk7CisgICAg
aWYgKGJtcC0+aXMxNmJpdCgpKSB7CisgICAgICAgIGludCBwYWRkZWRXaWR0aCA9IGJtcC0+Yml0
bWFwSW5mbygpLnBhZGRlZFdpZHRoKCk7CisgICAgICAgIGludCBza2lwID0gcGFkZGVkV2lkdGgg
LSBjb21wcmVzc0RhdGEuaW1hZ2Vfd2lkdGg7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0
KiBwaXhlbCA9IHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIHNob3J0Kj4oYm1wLT5ieXRlcygp
KTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIHBpeGVsRW5kID0gcGl4ZWwgKyBwYWRk
ZWRXaWR0aCAqIGNvbXByZXNzRGF0YS5pbWFnZV9oZWlnaHQ7CisgICAgICAgIGZvciAoOyBwaXhl
bCA8IHBpeGVsRW5kOyBwaXhlbCArPSBza2lwKSB7CisgICAgICAgICAgICBKU0FNUExFKiBkc3Qg
PSByb3dCdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCBzaG9y
dCogcm93RW5kID0gcGl4ZWwgKyBjb21wcmVzc0RhdGEuaW1hZ2Vfd2lkdGg7IHBpeGVsIDwgcm93
RW5kOykgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlID0gKnBpeGVsKys7
CisjaWYgSU1BR0VfTk9fQUxQSEFfVVNFX1JHQjU1NQorICAgICAgICAgICAgICAgICpkc3QrKyA9
IEpTQU1QTEUoKHZhbHVlID4+IDcpICYgMHhGOCk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0g
SlNBTVBMRSgodmFsdWUgPj4gMikgJiAweEY4KTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBK
U0FNUExFKCh2YWx1ZSA8PCAzKSAmIDB4RjgpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAqZHN0
KysgPSBKU0FNUExFKCh2YWx1ZSA+PiA4KSAmIDB4RjgpOworICAgICAgICAgICAgICAgICpkc3Qr
KyA9IEpTQU1QTEUoKHZhbHVlID4+IDMpICYgMHhGQyk7CisgICAgICAgICAgICAgICAgKmRzdCsr
ID0gSlNBTVBMRSgodmFsdWUgPDwgMykgJiAweEY4KTsKKyNlbmRpZgorICAgICAgICAgICAgfQor
ICAgICAgICAgICAgZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIGpwZWdfd3Jp
dGVfc2NhbmxpbmVzKCZjb21wcmVzc0RhdGEsICZkc3QsIDEpOworICAgICAgICB9CisgICAgfSBl
bHNlIHsKKyAgICAgICAgY29uc3QgdW5zaWduZWQqIHBpeGVsID0gc3RhdGljX2Nhc3Q8Y29uc3Qg
dW5zaWduZWQqPihibXAtPmJ5dGVzKCkpOworICAgICAgICBjb25zdCB1bnNpZ25lZCogcGl4ZWxF
bmQgPSBwaXhlbCArIGNvbXByZXNzRGF0YS5pbWFnZV93aWR0aCAqIGNvbXByZXNzRGF0YS5pbWFn
ZV9oZWlnaHQ7CisgICAgICAgIGZvciAoOyBwaXhlbCA8IHBpeGVsRW5kOyApIHsKKyAgICAgICAg
ICAgIEpTQU1QTEUqIGRzdCA9IHJvd0J1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICBmb3IgKGNv
bnN0IHVuc2lnbmVkKiByb3dFbmQgPSBwaXhlbCArIGNvbXByZXNzRGF0YS5pbWFnZV93aWR0aDsg
cGl4ZWwgPCByb3dFbmQ7KSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsdWUgPSAqcGl4
ZWwrKzsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBKU0FNUExFKCh2YWx1ZSA+PiAxNikgJiAw
eEZGKTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBKU0FNUExFKCh2YWx1ZSA+PiA4KSAmIDB4
RkYpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IEpTQU1QTEUoKHZhbHVlKSAmIDB4RkYpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAg
ICAgICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjb21wcmVzc0RhdGEsICZkc3QsIDEpOworICAg
ICAgICB9CisgICAgfQorCisgICAganBlZ19maW5pc2hfY29tcHJlc3MoJmNvbXByZXNzRGF0YSk7
CisgICAganBlZ19kZXN0cm95X2NvbXByZXNzKCZjb21wcmVzc0RhdGEpOworICAgIHJldHVybiB0
cnVlOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0pQRUdFbmNvZGVyLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNv
ZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4N2M3ZQotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSlBFR0VuY29kZXIu
aApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmls
ZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
KyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgSlBFR19F
TkNPREVSX0gKKyNkZWZpbmUgSlBFR19FTkNPREVSX0gKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
ICAgIGJvb2wgY29tcHJlc3NCaXRtYXBUb0pwZWcoU2hhcmVkQml0bWFwKiBibXAsIFZlY3Rvcjxj
aGFyPiYganBlZ0RhdGEpOworfQorCisjZW5kaWYgLy8gSlBFR19FTkNPREVSX0gKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2lu
Y2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRl
V2luY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjM4YWRhCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9NZWRpYVBsYXll
clByaXZhdGVXaW5jZS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA3LCAyMDA4LCAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIs
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaWZuZGVmIE1lZGlhUGxheWVyUHJpdmF0ZVdpbmNlX2gKKyNkZWZpbmUgTWVkaWFQbGF5
ZXJQcml2YXRlV2luY2VfaAorCisjaWYgRU5BQkxFKFZJREVPKQorCisjaW5jbHVkZSAiTWVkaWFQ
bGF5ZXJQcml2YXRlLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRy
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsK
KyAgICBjbGFzcyBJbnRTaXplOworICAgIGNsYXNzIEludFJlY3Q7CisgICAgY2xhc3MgU3RyaW5n
OworCisgICAgY2xhc3MgTWVkaWFQbGF5ZXJQcml2YXRlIDogcHVibGljIE1lZGlhUGxheWVyUHJp
dmF0ZUludGVyZmFjZSB7CisgICAgcHVibGljOgorICAgICAgICBzdGF0aWMgdm9pZCByZWdpc3Rl
ck1lZGlhRW5naW5lKE1lZGlhRW5naW5lUmVnaXN0cmFyKTsKKworICAgICAgICB+TWVkaWFQbGF5
ZXJQcml2YXRlKCk7CisKKyAgICAgICAgSW50U2l6ZSBuYXR1cmFsU2l6ZSgpIGNvbnN0OworICAg
ICAgICBib29sIGhhc1ZpZGVvKCkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBsb2FkKGNvbnN0IFN0
cmluZyYgdXJsKTsKKyAgICAgICAgdm9pZCBjYW5jZWxMb2FkKCk7CisKKyAgICAgICAgdm9pZCBw
bGF5KCk7CisgICAgICAgIHZvaWQgcGF1c2UoKTsKKworICAgICAgICBib29sIHBhdXNlZCgpIGNv
bnN0OworICAgICAgICBib29sIHNlZWtpbmcoKSBjb25zdDsKKworICAgICAgICBmbG9hdCBkdXJh
dGlvbigpIGNvbnN0OworICAgICAgICBmbG9hdCBjdXJyZW50VGltZSgpIGNvbnN0OworICAgICAg
ICB2b2lkIHNlZWsoZmxvYXQgdGltZSk7CisgICAgICAgIHZvaWQgc2V0RW5kVGltZShmbG9hdCk7
CisKKyAgICAgICAgdm9pZCBzZXRSYXRlKGZsb2F0KTsKKyAgICAgICAgdm9pZCBzZXRWb2x1bWUo
ZmxvYXQpOworCisgICAgICAgIGludCBkYXRhUmF0ZSgpIGNvbnN0OworCisgICAgICAgIE1lZGlh
UGxheWVyOjpOZXR3b3JrU3RhdGUgbmV0d29ya1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9uZXR3
b3JrU3RhdGU7IH0KKyAgICAgICAgTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgcmVhZHlTdGF0ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fcmVhZHlTdGF0ZTsgfQorCisgICAgICAgIGZsb2F0IG1heFRpbWVC
dWZmZXJlZCgpIGNvbnN0OworICAgICAgICBmbG9hdCBtYXhUaW1lU2Vla2FibGUoKSBjb25zdDsK
KyAgICAgICAgdW5zaWduZWQgYnl0ZXNMb2FkZWQoKSBjb25zdDsKKyAgICAgICAgYm9vbCB0b3Rh
bEJ5dGVzS25vd24oKSBjb25zdDsKKyAgICAgICAgdW5zaWduZWQgdG90YWxCeXRlcygpIGNvbnN0
OworCisgICAgICAgIHZvaWQgc2V0VmlzaWJsZShib29sKTsKKyAgICAgICAgdm9pZCBzZXRTaXpl
KGNvbnN0IEludFNpemUmKTsKKworICAgICAgICB2b2lkIGxvYWRTdGF0ZUNoYW5nZWQoKTsKKyAg
ICAgICAgdm9pZCBkaWRFbmQoKTsKKworICAgICAgICB2b2lkIHBhaW50KEdyYXBoaWNzQ29udGV4
dCosIGNvbnN0IEludFJlY3QmKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIE1lZGlhUGxheWVy
UHJpdmF0ZShNZWRpYVBsYXllciopOworCisgICAgICAgIHZvaWQgdXBkYXRlU3RhdGVzKCk7Cisg
ICAgICAgIHZvaWQgZG9TZWVrKCk7CisgICAgICAgIHZvaWQgY2FuY2VsU2VlaygpOworICAgICAg
ICB2b2lkIHNlZWtUaW1lckZpcmVkKFRpbWVyPE1lZGlhUGxheWVyUHJpdmF0ZT4qKTsKKyAgICAg
ICAgZmxvYXQgbWF4VGltZUxvYWRlZCgpIGNvbnN0OworICAgICAgICB2b2lkIHNhd1Vuc3VwcG9y
dGVkVHJhY2tzKCk7CisjaWYgRU5BQkxFKFBMVUdJTl9QUk9YWV9GT1JfVklERU8pCisgICAgICAg
IHZvaWQgc2V0TWVkaWFQbGF5ZXJQcm94eShXZWJNZWRpYVBsYXllclByb3h5Kik7CisgICAgICAg
IHZvaWQgc2V0UG9zdGVyKGNvbnN0IFN0cmluZyYgdXJsKTsKKyAgICAgICAgdm9pZCBkZWxpdmVy
Tm90aWZpY2F0aW9uKE1lZGlhUGxheWVyUHJveHlOb3RpZmljYXRpb25UeXBlKTsKKyNlbmRpZgor
CisgICAgICAgIC8vIGVuZ2luZSBzdXBwb3J0CisgICAgICAgIHN0YXRpYyBNZWRpYVBsYXllclBy
aXZhdGVJbnRlcmZhY2UqIGNyZWF0ZShNZWRpYVBsYXllciopOworICAgICAgICBzdGF0aWMgdm9p
ZCBnZXRTdXBwb3J0ZWRUeXBlcyhIYXNoU2V0PFN0cmluZz4mIHR5cGVzKTsKKyAgICAgICAgc3Rh
dGljIE1lZGlhUGxheWVyOjpTdXBwb3J0c1R5cGUgc3VwcG9ydHNUeXBlKGNvbnN0IFN0cmluZyYg
dHlwZSwgY29uc3QgU3RyaW5nJiBjb2RlY3MpOworICAgICAgICBzdGF0aWMgYm9vbCBpc0F2YWls
YWJsZSgpOworCisgICAgICAgIE1lZGlhUGxheWVyKiBtX3BsYXllcjsKKyAgICAgICAgZmxvYXQg
bV9zZWVrVG87CisgICAgICAgIGZsb2F0IG1fZW5kVGltZTsKKyAgICAgICAgVGltZXI8TWVkaWFQ
bGF5ZXJQcml2YXRlPiBtX3NlZWtUaW1lcjsKKyAgICAgICAgTWVkaWFQbGF5ZXI6Ok5ldHdvcmtT
dGF0ZSBtX25ldHdvcmtTdGF0ZTsKKyAgICAgICAgTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgbV9y
ZWFkeVN0YXRlOworICAgICAgICB1bnNpZ25lZCBtX2VuYWJsZWRUcmFja0NvdW50OworICAgICAg
ICB1bnNpZ25lZCBtX3RvdGFsVHJhY2tDb3VudDsKKyAgICAgICAgYm9vbCBtX2hhc1Vuc3VwcG9y
dGVkVHJhY2tzOworICAgICAgICBib29sIG1fc3RhcnRlZFBsYXlpbmc7CisgICAgICAgIGJvb2wg
bV9pc1N0cmVhbWluZzsKKyNpZiBFTkFCTEUoUExVR0lOX1BST1hZX0ZPUl9WSURFTykKKyAgICAg
ICAgV2ViTWVkaWFQbGF5ZXJQcm94eSogbV9wcm94eTsKKyNlbmRpZgorICAgIH07CisKK30KKwor
I2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW5jZS9NZWRpYVBsYXllclByb3h5LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvTWVkaWFQbGF5ZXJQcm94eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uOGM5MmQ0MAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvTWVkaWFQbGF5ZXJQcm94eS5jcHAKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICovCisKKyNpZiBFTkFCTEUoVklERU8pCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJNZWRpYVBsYXllclByb3h5LmgiCisKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgor
I2luY2x1ZGUgIkhUTUxQbHVnSW5FbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFZpZGVvRWxlbWVu
dC5oIgorI2luY2x1ZGUgIkpTRE9NQmluZGluZy5oIgorI2luY2x1ZGUgIkpTUGx1Z2luRWxlbWVu
dEZ1bmN0aW9ucy5oIgorI2luY2x1ZGUgIk1lZGlhUGxheWVyLmgiCisjaW5jbHVkZSAiTm9kZS5o
IgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiUGx1Z2luVmlldy5oIgor
I2luY2x1ZGUgIlJlbmRlclBhcnRPYmplY3QuaCIKKyNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIK
KyNpbmNsdWRlICJXaWRnZXQuaCIKKyNpbmNsdWRlICJjX2NsYXNzLmgiCisjaW5jbHVkZSAiY19p
bnN0YW5jZS5oIgorI2luY2x1ZGUgImNfcnVudGltZS5oIgorI2luY2x1ZGUgIm5wcnVudGltZV9p
bXBsLmgiCisjaW5jbHVkZSAicnVudGltZS5oIgorI2luY2x1ZGUgPHJ1bnRpbWUvSWRlbnRpZmll
ci5oPgorCit1c2luZyBuYW1lc3BhY2UgSlNDOworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2lu
ZyBuYW1lc3BhY2UgQmluZGluZ3M7Cit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCitXZWJN
ZWRpYVBsYXllclByb3h5OjpXZWJNZWRpYVBsYXllclByb3h5KE1lZGlhUGxheWVyKiBwbGF5ZXIp
Cis6IG1fbWVkaWFQbGF5ZXIocGxheWVyKQorLCBtX2luaXQoZmFsc2UpCissIG1faGFzU2VudFJl
c3BvbnNlVG9QbHVnaW4oZmFsc2UpCit7CisgICAgaWYgKCFtX2luaXQpCisgICAgICAgIGluaXRF
bmdpbmUoKTsKK30KKworV2ViTWVkaWFQbGF5ZXJQcm94eTo6fldlYk1lZGlhUGxheWVyUHJveHko
KQoreworICAgIG1faW5zdGFuY2UucmVsZWFzZSgpOworfQorU2NyaXB0SW5zdGFuY2UgV2ViTWVk
aWFQbGF5ZXJQcm94eTo6cGx1Z2luSW5zdGFuY2UoKQoreworICAgIGlmICghbV9pbnN0YW5jZSkg
eworICAgICAgICBSZW5kZXJPYmplY3QqIHIgPSBlbGVtZW50KCktPnJlbmRlcmVyKCk7CisgICAg
ICAgIGlmICghciB8fCAhci0+aXNXaWRnZXQoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisg
ICAgICAgIEZyYW1lKiBmcmFtZSA9IGVsZW1lbnQoKS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKKwor
ICAgICAgICBSZW5kZXJXaWRnZXQqIHJlbmRlcldpZGdldCA9IHN0YXRpY19jYXN0PFJlbmRlcldp
ZGdldCo+KGVsZW1lbnQoKS0+cmVuZGVyZXIoKSk7CisgICAgICAgIGlmIChyZW5kZXJXaWRnZXQg
JiYgcmVuZGVyV2lkZ2V0LT53aWRnZXQoKSkKKyAgICAgICAgICAgIG1faW5zdGFuY2UgPSBmcmFt
ZS0+c2NyaXB0KCktPmNyZWF0ZVNjcmlwdEluc3RhbmNlRm9yV2lkZ2V0KHJlbmRlcldpZGdldC0+
d2lkZ2V0KCkpOworICAgIH0KKworICAgIHJldHVybiBtX2luc3RhbmNlOworfQordm9pZCBXZWJN
ZWRpYVBsYXllclByb3h5Ojpsb2FkKGNvbnN0IFN0cmluZyYgdXJsKQoreworICAgIGlmICghbV9p
bml0KQorICAgICAgICBpbml0RW5naW5lKCk7CisgICAgaWYgKG1faW5pdCkKKyAgICAgICAgaW52
b2tlTWV0aG9kKCJwbGF5Iik7Cit9Cit2b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6OmluaXRFbmdp
bmUoKQoreworICAgIEhUTUxNZWRpYUVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1M
TWVkaWFFbGVtZW50Kj4obV9tZWRpYVBsYXllci0+bWVkaWFQbGF5ZXJDbGllbnQoKSk7CisgICAg
VmVjdG9yPFN0cmluZz4gcGFyYW1OYW1lczsKKyAgICBWZWN0b3I8U3RyaW5nPiBwYXJhbVZhbHVl
czsKKyAgICBTdHJpbmcgc2VydmljZVR5cGU7CisgICAgU3RyaW5nIHVybCA9IGVsZW1lbnQtPmlu
aXRpYWxVUkwoKTsKKworICAgIGlmICh1cmwuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBGcmFtZSogZnJhbWUgPSBlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpOworCisgICAg
Ly8gYWRkIGFsbCBhdHRyaWJ1dGVzIHNldCBvbiB0aGUgZW1iZWQgb2JqZWN0CisgICAgTmFtZWRO
b2RlTWFwKiBhID0gZWxlbWVudC0+YXR0cmlidXRlcygpOworICAgIGlmIChhKSB7CisgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhLT5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAg
ICBBdHRyaWJ1dGUqIGl0ID0gYS0+YXR0cmlidXRlSXRlbShpKTsKKyAgICAgICAgICAgIHBhcmFt
TmFtZXMuYXBwZW5kKGl0LT5uYW1lKCkubG9jYWxOYW1lKCkuc3RyaW5nKCkpOworICAgICAgICAg
ICAgcGFyYW1WYWx1ZXMuYXBwZW5kKGl0LT52YWx1ZSgpLnN0cmluZygpKTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICBzZXJ2aWNlVHlwZSA9ICJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyIjsKKyAgICBm
cmFtZS0+bG9hZGVyKCktPnJlcXVlc3RPYmplY3Qoc3RhdGljX2Nhc3Q8UmVuZGVyUGFydE9iamVj
dCo+KGVsZW1lbnQtPnJlbmRlcmVyKCkpLCB1cmwsIG51bGxBdG9tLCBzZXJ2aWNlVHlwZSwgcGFy
YW1OYW1lcywgcGFyYW1WYWx1ZXMpOworICAgIG1faW5pdCA9IHRydWU7CisgICAgcGFyYW1OYW1l
cy5jbGVhcigpOworICAgIHBhcmFtVmFsdWVzLmNsZWFyKCk7CisKK30KKworSFRNTE1lZGlhRWxl
bWVudCogV2ViTWVkaWFQbGF5ZXJQcm94eTo6ZWxlbWVudCgpCit7CisgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PEhUTUxNZWRpYUVsZW1lbnQqPihtX21lZGlhUGxheWVyLT5tZWRpYVBsYXllckNsaWVu
dCgpKTsKKworfQorCit2b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6Omludm9rZU1ldGhvZChjb25z
dCBTdHJpbmcmIG1ldGhvZE5hbWUpCit7CisgICAgRnJhbWUqIGZyYW1lID0gZWxlbWVudCgpLT5k
b2N1bWVudCgpLT5mcmFtZSgpOworICAgIFJvb3RPYmplY3QgKnJvb3QgPSBmcmFtZS0+c2NyaXB0
KCktPmJpbmRpbmdSb290T2JqZWN0KCk7CisgICAgaWYgKCFyb290KQorICAgICAgICByZXR1cm47
CisgICAgRXhlY1N0YXRlICpleGVjID0gcm9vdC0+Z2xvYmFsT2JqZWN0KCktPmdsb2JhbEV4ZWMo
KTsKKyAgICBJbnN0YW5jZSogaW5zdGFuY2UgPSBwbHVnaW5JbnN0YW5jZSgpLmdldCgpOworICAg
IGlmICghaW5zdGFuY2UpCisgICAgICAgIHJldHVybjsKKworICAgIGluc3RhbmNlLT5iZWdpbigp
OworICAgIENsYXNzICphQ2xhc3MgPSBpbnN0YW5jZS0+Z2V0Q2xhc3MoKTsKKyAgICBJZGVudGlm
aWVyIGlkZW4oZXhlYywgbWV0aG9kTmFtZSk7CisgICAgTWV0aG9kTGlzdCBtZXRob2RMaXN0ID0g
YUNsYXNzLT5tZXRob2RzTmFtZWQoaWRlbiwgaW5zdGFuY2UpOworICAgIEFyZ0xpc3QgYXJnczsK
KyAgICAvKkpTVmFsdWVQdHIgcmVzdWx0ID0qLworICAgIGluc3RhbmNlLT5pbnZva2VNZXRob2Qo
ZXhlYywgbWV0aG9kTGlzdCAsIGFyZ3MpOworICAgIGluc3RhbmNlLT5lbmQoKTsKK30KKworfQor
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVk
aWFQbGF5ZXJQcm94eS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9NZWRpYVBs
YXllclByb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2ZWQ5ZQot
LS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQ
bGF5ZXJQcm94eS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkg
VG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAq
ICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lm
bmRlZiBNZWRpYVBsYXllclByb3h5X2gKKyNkZWZpbmUgTWVkaWFQbGF5ZXJQcm94eV9oCisKKyNp
bmNsdWRlICJTY3JpcHRJbnN0YW5jZS5oIgorCisjaWYgRU5BQkxFKFZJREVPKQorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBJbnRSZWN0OworICAgIGNsYXNzIEludFNpemU7Cisg
ICAgY2xhc3MgU3RyaW5nOworICAgIGNsYXNzIE1lZGlhUGxheWVyOworICAgIGNsYXNzIFBsdWdp
blZpZXc7CisgICAgY2xhc3MgSFRNTE1lZGlhRWxlbWVudDsKKworICAgIGVudW0gTWVkaWFQbGF5
ZXJQcm94eU5vdGlmaWNhdGlvblR5cGUgeworICAgICAgICBNZWRpYVBsYXllck5vdGlmaWNhdGlv
blBsYXlQYXVzZUJ1dHRvblByZXNzZWQsCisgICAgICAgIElkbGUsCisgICAgICAgIExvYWRpbmcs
CisgICAgICAgIExvYWRlZCwKKyAgICAgICAgRm9ybWF0RXJyb3IsCisgICAgICAgIE5ldHdvcmtF
cnJvciwKKyAgICAgICAgRGVjb2RlRXJyb3IKKyAgICB9OworCisgICAgY2xhc3MgV2ViTWVkaWFQ
bGF5ZXJQcm94eSB7CisgICAgcHVibGljOgorICAgICAgICBXZWJNZWRpYVBsYXllclByb3h5KE1l
ZGlhUGxheWVyKiBwbGF5ZXIpOworICAgICAgICB+V2ViTWVkaWFQbGF5ZXJQcm94eSgpOworCisg
ICAgICAgIE1lZGlhUGxheWVyKiBtZWRpYVBsYXllcigpIHtyZXR1cm4gbV9tZWRpYVBsYXllcjt9
CisgICAgICAgIHZvaWQgaW5pdEVuZ2luZSgpOworICAgICAgICB2b2lkIGxvYWQoY29uc3QgU3Ry
aW5nJiB1cmwpOworICAgICAgICBIVE1MTWVkaWFFbGVtZW50KiBlbGVtZW50KCk7CisgICAgICAg
IHZvaWQgaW52b2tlTWV0aG9kKGNvbnN0IFN0cmluZyYgbWV0aG9kTmFtZSk7CisgICAgICAgIFNj
cmlwdEluc3RhbmNlIHBsdWdpbkluc3RhbmNlKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBN
ZWRpYVBsYXllciogbV9tZWRpYVBsYXllcjsKKyAgICAgICAgYm9vbCBtX2luaXQ7CisgICAgICAg
IFdlYkNvcmU6OlBsdWdpblZpZXcqIG1fcGx1Z2luVmlldzsKKyAgICAgICAgYm9vbCBtX2hhc1Nl
bnRSZXNwb25zZVRvUGx1Z2luOworICAgICAgICBTY3JpcHRJbnN0YW5jZSBtX2luc3RhbmNlOwor
ICAgIH07CisKK30KKyNlbmRpZiAvLyBFTkFCTEUoVklERU8pCisKKyNlbmRpZgpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QTkdFbmNvZGVyLmNwcCBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUE5HRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5ZGVlMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUE5HRW5jb2Rlci5jcHAKQEAgLTAsMCArMSwxNjcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBt
ZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1l
IG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICog
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERF
UlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBD
T1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisg
KiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUE5HRW5jb2Rlci5o
IgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJwbmcuaCIKK30KKworI2luY2x1ZGUgPHd0Zi9W
ZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBFbmNvZGVyIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CisvLworLy8gVGhpcyBzZWN0aW9uIG9mIHRoZSBjb2RlIGlzIGJhc2VkIG9uIG5zUE5HRW5jb2Rl
ci5jcHAgaW4gTW96aWxsYQorLy8gKENvcHlyaWdodCAyMDA1IEdvb2dsZSBJbmMuKQorCisvLyBQ
YXNzZWQgYXJvdW5kIGFzIHRoZSBpb19wdHIgaW4gdGhlIHBuZyBzdHJ1Y3RzIHNvIG91ciBjYWxs
YmFja3Mga25vdyB3aGVyZQorLy8gdG8gd3JpdGUgZGF0YS4KK3N0cnVjdCBQTkdFbmNvZGVyU3Rh
dGUgeworICAgIFBOR0VuY29kZXJTdGF0ZShWZWN0b3I8Y2hhcj4qIG8pIDogbV9vdXQobykge30K
KyAgICBWZWN0b3I8Y2hhcj4qIG1fb3V0OworfTsKKworLy8gQ2FsbGVkIGJ5IGxpYnBuZyB0byBm
bHVzaCBpdHMgaW50ZXJuYWwgYnVmZmVyIHRvIG91cnMuCit2b2lkIGVuY29kZXJXcml0ZUNhbGxi
YWNrKHBuZ19zdHJ1Y3RwIHBuZywgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3Qgc2l6ZSkKK3sK
KyAgICBQTkdFbmNvZGVyU3RhdGUqIHN0YXRlID0gc3RhdGljX2Nhc3Q8UE5HRW5jb2RlclN0YXRl
Kj4ocG5nX2dldF9pb19wdHIocG5nKSk7CisgICAgQVNTRVJUKHN0YXRlLT5tX291dCk7CisKKyAg
ICBzaXplX3Qgb2xkU2l6ZSA9IHN0YXRlLT5tX291dC0+c2l6ZSgpOworICAgIHN0YXRlLT5tX291
dC0+cmVzaXplKG9sZFNpemUgKyBzaXplKTsKKyAgICBtZW1jcHkoJigqc3RhdGUtPm1fb3V0KVtv
bGRTaXplXSwgZGF0YSwgc2l6ZSk7Cit9CisKKy8vIEF1dG9tYXRpY2FsbHkgZGVzdHJveXMgdGhl
IGdpdmVuIHdyaXRlIHN0cnVjdHMgb24gZGVzdHJ1Y3Rpb24gdG8gbWFrZQorLy8gY2xlYW51cCBh
bmQgZXJyb3IgaGFuZGxpbmcgY29kZSBjbGVhbmVyLgorY2xhc3MgUE5HV3JpdGVTdHJ1Y3REZXN0
cm95ZXIgeworcHVibGljOgorICAgIFBOR1dyaXRlU3RydWN0RGVzdHJveWVyKHBuZ19zdHJ1Y3Qq
KiBwcywgcG5nX2luZm8qKiBwaSkKKyAgICAgICAgOiBtX3BuZ1N0cnVjdChwcykKKyAgICAgICAg
LCBtX3BuZ0luZm8ocGkpCisgICAgeworICAgIH0KKworICAgIH5QTkdXcml0ZVN0cnVjdERlc3Ry
b3llcigpCisgICAgeworICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QobV9wbmdTdHJ1
Y3QsIG1fcG5nSW5mbyk7CisgICAgfQorCitwcml2YXRlOgorICAgIHBuZ19zdHJ1Y3QqKiBtX3Bu
Z1N0cnVjdDsKKyAgICBwbmdfaW5mbyoqIG1fcG5nSW5mbzsKK307CisKK2Jvb2wgY29tcHJlc3NC
aXRtYXBUb1BuZyhTaGFyZWRCaXRtYXAqIGJtcCwgVmVjdG9yPGNoYXI+JiBwbmdEYXRhKQorewor
ICAgIGlmICghYm1wLT5ieXRlcygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBwbmdf
c3RydWN0KiBwbmdQdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9T
VFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cG5nX3ZvaWRwX05VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcG5nX2Vycm9yX3B0cl9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcl9wdHJfTlVMTCk7CisgICAgaWYgKCFwbmdQ
dHIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHBuZ19pbmZvKiBpbmZvUHRyID0gcG5n
X2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdQdHIpOworICAgIGlmICghaW5mb1B0cikgeworICAgICAg
ICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZ1B0ciwgMCk7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisgICAgUE5HV3JpdGVTdHJ1Y3REZXN0cm95ZXIgZGVzdHJveWVyKCZwbmdQ
dHIsICZpbmZvUHRyKTsKKworICAgIGludCBieXRlRGVwdGggPSBibXAtPmlzMTZiaXQoKSA/IDMg
OiA0OworICAgIFZlY3Rvcjx1bnNpZ25lZCBjaGFyLCAyMDQ4PiByb3dCdWZmZXI7CisgICAgcm93
QnVmZmVyLnJlc2l6ZShibXAtPndpZHRoKCkgKiBieXRlRGVwdGgpOworCisgICAgLy8gVGhlIGRl
c3Ryb3llciB3aWxsIGVuc3VyZSB0aGF0IHRoZSBzdHJ1Y3R1cmVzIGFyZSBjbGVhbmVkIHVwIGlu
IHRoaXMKKyAgICAvLyBjYXNlLCBldmVuIHRob3VnaCB3ZSBtYXkgZ2V0IGhlcmUgYXMgYSBqdW1w
IGZyb20gcmFuZG9tIHBhcnRzIG9mIHRoZQorICAgIC8vIFBORyBsaWJyYXJ5IGNhbGxlZCBiZWxv
dy4KKyAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nUHRyKSkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIC8vIFNldCBvdXIgY2FsbGJhY2sgZm9yIGxpYnBuZyB0byBnaXZlIHVzIHRo
ZSBkYXRhLgorICAgIFBOR0VuY29kZXJTdGF0ZSBzdGF0ZSgmcG5nRGF0YSk7CisgICAgcG5nX3Nl
dF93cml0ZV9mbihwbmdQdHIsICZzdGF0ZSwgZW5jb2RlcldyaXRlQ2FsbGJhY2ssIDApOworCisg
ICAgaW50IHBuZ091dHB1dENvbG9yVHlwZSA9IGJtcC0+aXMxNmJpdCgpID8gUE5HX0NPTE9SX1RZ
UEVfUkdCIDogUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOworCisgICAgcG5nX3NldF9JSERSKHBu
Z1B0ciwgaW5mb1B0ciwgYm1wLT53aWR0aCgpLCBibXAtPmhlaWdodCgpLCA4LCBwbmdPdXRwdXRD
b2xvclR5cGUsCisgICAgICAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0NPTVBS
RVNTSU9OX1RZUEVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9UWVBFX0RF
RkFVTFQpOworICAgIHBuZ193cml0ZV9pbmZvKHBuZ1B0ciwgaW5mb1B0cik7CisKKyAgICBpZiAo
Ym1wLT5pczE2Yml0KCkpIHsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQqIHNyYyA9ICh1bnNpZ25l
ZCBzaG9ydCopYm1wLT5ieXRlcygpOworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IChpbnQp
Ym1wLT5oZWlnaHQoKTsgKyt5KSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBkc3QgPSBy
b3dCdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAoaW50KWJt
cC0+d2lkdGgoKTsgKyt4KSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdmFsdWUg
PSAqc3JjKys7CisjaWYgSU1BR0VfTk9fQUxQSEFfVVNFX1JHQjU1NQorICAgICAgICAgICAgICAg
ICpkc3QrKyA9IHVuc2lnbmVkIGNoYXIoKHZhbHVlID4+IDcpICYgMHhGOCk7CisgICAgICAgICAg
ICAgICAgKmRzdCsrID0gdW5zaWduZWQgY2hhcigodmFsdWUgPj4gMikgJiAweEY4KTsKKyAgICAg
ICAgICAgICAgICAqZHN0KysgPSB1bnNpZ25lZCBjaGFyKCh2YWx1ZSA8PCAzKSAmIDB4RjgpOwor
I2Vsc2UKKyAgICAgICAgICAgICAgICAqZHN0KysgPSB1bnNpZ25lZCBjaGFyKCh2YWx1ZSA+PiA4
KSAmIDB4RjgpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IHVuc2lnbmVkIGNoYXIoKHZhbHVl
ID4+IDMpICYgMHhGQyk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gdW5zaWduZWQgY2hhcigo
dmFsdWUgPDwgMykgJiAweEY4KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAg
cG5nX3dyaXRlX3JvdyhwbmdQdHIsIHJvd0J1ZmZlci5kYXRhKCkpOworICAgICAgICB9CisgICAg
fSBlbHNlIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciogc3JjID0gKHVuc2lnbmVkIGNoYXIqKWJt
cC0+Ynl0ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAoaW50KWJtcC0+aGVpZ2h0
KCk7ICsreSkgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZHN0ID0gcm93QnVmZmVyLmRh
dGEoKTsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgKGludClibXAtPndpZHRoKCk7
ICsreCkgeworICAgICAgICAgICAgICAgIC8vIE5vdGU6IFBORyBpcyBpbiBiaWcgZW5kaWFuCisg
ICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiID0gKnNyYysrOworICAgICAgICAgICAgICAg
IHVuc2lnbmVkIGNoYXIgZyA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFy
IHIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhID0gKnNyYysrOwor
ICAgICAgICAgICAgICAgICpkc3QrKyA9IHI7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gZzsK
KyAgICAgICAgICAgICAgICAqZHN0KysgPSBiOworICAgICAgICAgICAgICAgICpkc3QrKyA9IGE7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwbmdfd3JpdGVfcm93KHBuZ1B0ciwgcm93QnVm
ZmVyLmRhdGEoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwbmdfd3JpdGVfZW5kKHBuZ1B0
ciwgaW5mb1B0cik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBXZWJD
b3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BOR0VuY29k
ZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUE5HRW5jb2Rlci5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDU2NmUKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BOR0VuY29kZXIuaApAQCAtMCwwICsx
LDI5IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5j
LgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICog
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyAqLworCisjaWZuZGVmIFBOR19FTkNPREVSX0gKKyNkZWZpbmUgUE5HX0VOQ09ERVJf
SAorCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAg
Ym9vbCBjb21wcmVzc0JpdG1hcFRvUG5nKFNoYXJlZEJpdG1hcCogYm1wLCBWZWN0b3I8Y2hhcj4m
IHBuZ0RhdGEpOworfQorCisjZW5kaWYgLy8gUE5HX0VOQ09ERVJfSApkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLmJmZGFiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL1BhdGhXaW5jZS5jcHAKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiAg
Q29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
KyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisKKyNpbmNsdWRlICJGbG9hdFJl
Y3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtUGF0
aFdpbmNlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJUcmFuc2Zv
cm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitQYXRoOjpQYXRoKCkKKzogbV9wYXRoKG5ldyBQbGF0Zm9ybVBhdGgoKSkKK3sK
K30KKworUGF0aDo6flBhdGgoKQoreworICAgIGRlbGV0ZSBtX3BhdGg7Cit9CisKK1BhdGg6OlBh
dGgoY29uc3QgUGF0aCYgb3RoZXIpCis6IG1fcGF0aChuZXcgUGxhdGZvcm1QYXRoKCpvdGhlci5t
X3BhdGgpKQoreworfQorCitQYXRoJiBQYXRoOjpvcGVyYXRvcj0oY29uc3QgUGF0aCYgb3RoZXIp
Cit7CisgICAgbV9wYXRoID0gbmV3IFBsYXRmb3JtUGF0aCgqb3RoZXIubV9wYXRoKTsKKyAgICBy
ZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgUGF0aDo6Y29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYg
cG9pbnQsIFdpbmRSdWxlIHJ1bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+Y29udGFp
bnMocG9pbnQsIHJ1bGUpOworfQorCit2b2lkIFBhdGg6OnRyYW5zbGF0ZShjb25zdCBGbG9hdFNp
emUmIHNpemUpCit7CisgICAgbV9wYXRoLT50cmFuc2xhdGUoc2l6ZSk7Cit9CisKK0Zsb2F0UmVj
dCBQYXRoOjpib3VuZGluZ1JlY3QoKSBjb25zdAoreworICAgIHJldHVybiBtX3BhdGgtPmJvdW5k
aW5nUmVjdCgpOworfQorCit2b2lkIFBhdGg6Om1vdmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2lu
dCkKK3sKKyAgICBtX3BhdGgtPm1vdmVUbyhwb2ludCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkTGlu
ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIG1fcGF0aC0+YWRkTGluZVRvKHBv
aW50KTsKK30KKwordm9pZCBQYXRoOjphZGRRdWFkQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBj
cCwgY29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAgICBtX3BhdGgtPmFkZFF1YWRDdXJ2ZVRvKGNw
LCBwKTsKK30KKwordm9pZCBQYXRoOjphZGRCZXppZXJDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQm
IGNwMSwgY29uc3QgRmxvYXRQb2ludCYgY3AyLCBjb25zdCBGbG9hdFBvaW50JiBwKQoreworICAg
IG1fcGF0aC0+YWRkQmV6aWVyQ3VydmVUbyhjcDEsIGNwMiwgcCk7Cit9CisKK3ZvaWQgUGF0aDo6
YWRkQXJjVG8oY29uc3QgRmxvYXRQb2ludCYgcDEsIGNvbnN0IEZsb2F0UG9pbnQmIHAyLCBmbG9h
dCByYWRpdXMpCit7CisgICAgbV9wYXRoLT5hZGRBcmNUbyhwMSwgcDIsIHJhZGl1cyk7Cit9CisK
K3ZvaWQgUGF0aDo6Y2xvc2VTdWJwYXRoKCkKK3sKKyAgICBtX3BhdGgtPmNsb3NlU3VicGF0aCgp
OworfQorCit2b2lkIFBhdGg6OmFkZEFyYyhjb25zdCBGbG9hdFBvaW50JiBwLCBmbG9hdCByLCBm
bG9hdCBzYXIsIGZsb2F0IGVhciwgYm9vbCBhbnRpY2xvY2t3aXNlKQoreworICAgIG1fcGF0aC0+
YWRkRWxsaXBzZShwLCByLCByLCBzYXIsIGVhciwgYW50aWNsb2Nrd2lzZSk7Cit9CisKK3ZvaWQg
UGF0aDo6YWRkUmVjdChjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAgbV9wYXRoLT5hZGRSZWN0
KHIpOworfQorCit2b2lkIFBhdGg6OmFkZEVsbGlwc2UoY29uc3QgRmxvYXRSZWN0JiByKQorewor
ICAgIEZsb2F0U2l6ZSByYWRpdXMoci53aWR0aCgpICogMC41LCByLmhlaWdodCgpICogMC41KTsK
KyAgICBtX3BhdGgtPmFkZEVsbGlwc2Uocik7Cit9CisKK3ZvaWQgUGF0aDo6Y2xlYXIoKQorewor
ICAgIG1fcGF0aC0+Y2xlYXIoKTsKK30KKworYm9vbCBQYXRoOjppc0VtcHR5KCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9wYXRoLT5pc0VtcHR5KCk7Cit9CisKK1N0cmluZyBQYXRoOjpkZWJ1Z1N0
cmluZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+ZGVidWdTdHJpbmcoKTsKK30KKwor
dm9pZCBQYXRoOjphcHBseSh2b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9u
KSBjb25zdAoreworICAgIG1fcGF0aC0+YXBwbHkoaW5mbywgZnVuY3Rpb24pOworfQorCit2b2lk
IFBhdGg6OnRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBt
X3BhdGgtPnRyYW5zZm9ybSh0KTsKK30KKworRmxvYXRSZWN0IFBhdGg6OnN0cm9rZUJvdW5kaW5n
UmVjdChTdHJva2VTdHlsZUFwcGxpZXIgKikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAg
IHJldHVybiBGbG9hdFJlY3QoKTsKK30KKworYm9vbCBQYXRoOjpzdHJva2VDb250YWlucyhTdHJv
a2VTdHlsZUFwcGxpZXIqLCBjb25zdCBGbG9hdFBvaW50JikgY29uc3QKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBQYXRoOjpoYXNDdXJyZW50
UG9pbnQoKSBjb25zdAoreworICAgIHJldHVybiAhaXNFbXB0eSgpOworfQorCit9CmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNw
cCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ODk2NGEKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNl
LmNwcApAQCAtMCwwICsxLDgwMyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBU
b3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9u
LCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIlBsYXRmb3JtUGF0aFdpbmNlLmgiCisKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSAiUGxh
dGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1
ZGUgPHd0Zi9Pd25QdHIuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCisvLyBJbXBsZW1lbnRlZCBpbiBHcmFwaGljc0NvbnRleHRXaW5jZS5jcHAKK3Zv
aWQgZ2V0RWxsaXBzZVBvaW50QnlBbmdsZShkb3VibGUgYW5nbGUsIGRvdWJsZSBhLCBkb3VibGUg
YiwgZmxvYXQmIHgsIGZsb2F0JiB5KTsKKworc3RhdGljIHZvaWQgcXVhZEN1cnZlKGludCBzZWdt
ZW50cywgVmVjdG9yPFBhdGhQb2ludD4mIHB0cywgY29uc3QgUGF0aFBvaW50KiBjb250cm9sKQor
eworICAgIGNvbnN0IGZsb2F0IHN0ZXAgPSAxLjAgLyBzZWdtZW50czsKKyAgICByZWdpc3RlciBm
bG9hdCB0QSA9IDAuMDsKKyAgICByZWdpc3RlciBmbG9hdCB0QiA9IDEuMDsKKworICAgIGZsb2F0
IGMxeCA9IGNvbnRyb2xbMF0ueCgpOworICAgIGZsb2F0IGMxeSA9IGNvbnRyb2xbMF0ueSgpOwor
ICAgIGZsb2F0IGMyeCA9IGNvbnRyb2xbMV0ueCgpOworICAgIGZsb2F0IGMyeSA9IGNvbnRyb2xb
MV0ueSgpOworICAgIGZsb2F0IGMzeCA9IGNvbnRyb2xbMl0ueCgpOworICAgIGZsb2F0IGMzeSA9
IGNvbnRyb2xbMl0ueSgpOworCisgICAgY29uc3QgaW50IG9mZnNldCA9IHB0cy5zaXplKCk7Cisg
ICAgcHRzLnJlc2l6ZShvZmZzZXQgKyBzZWdtZW50cyk7CisgICAgUGF0aFBvaW50IHBwOworICAg
IHBwLm1feCA9IGMxeDsKKyAgICBwcC5tX3kgPSBjMXk7CisKKyAgICBmb3IgKGludCBpID0gMTsg
aSA8IHNlZ21lbnRzOyArK2kpIHsKKyAgICAgICAgdEEgKz0gc3RlcDsKKyAgICAgICAgdEIgLT0g
c3RlcDsKKworICAgICAgICBjb25zdCBmbG9hdCBhID0gdEIgKiB0QjsKKyAgICAgICAgY29uc3Qg
ZmxvYXQgYiA9IDIuMCAqIHRBICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGMgPSB0QSAqIHRB
OworCisgICAgICAgIHBwLm1feCA9IGMxeCAqIGEgKyBjMnggKiBiICsgYzN4ICogYzsKKyAgICAg
ICAgcHAubV95ID0gYzF5ICogYSArIGMyeSAqIGIgKyBjM3kgKiBjOworCisgICAgICAgIHB0c1tv
ZmZzZXQgKyBpIC0gMV0gPSBwcDsKKyAgICB9CisKKyAgICBwcC5tX3ggPSBjM3g7CisgICAgcHAu
bV95ID0gYzN5OworICAgIHB0c1tvZmZzZXQgKyBzZWdtZW50cyAtIDFdID0gcHA7Cit9CisKK3N0
YXRpYyBpbmxpbmUgdm9pZCBiZXppZXIoaW50IHNlZ21lbnRzLCBWZWN0b3I8UGF0aFBvaW50PiYg
cHRzLCBjb25zdCBQYXRoUG9pbnQqIGNvbnRyb2wpCit7CisgICAgY29uc3QgZmxvYXQgc3RlcCA9
IDEuMCAvIHNlZ21lbnRzOworICAgIHJlZ2lzdGVyIGZsb2F0IHRBID0gMC4wOworICAgIHJlZ2lz
dGVyIGZsb2F0IHRCID0gMS4wOworCisgICAgZmxvYXQgYzF4ID0gY29udHJvbFswXS54KCk7Cisg
ICAgZmxvYXQgYzF5ID0gY29udHJvbFswXS55KCk7CisgICAgZmxvYXQgYzJ4ID0gY29udHJvbFsx
XS54KCk7CisgICAgZmxvYXQgYzJ5ID0gY29udHJvbFsxXS55KCk7CisgICAgZmxvYXQgYzN4ID0g
Y29udHJvbFsyXS54KCk7CisgICAgZmxvYXQgYzN5ID0gY29udHJvbFsyXS55KCk7CisgICAgZmxv
YXQgYzR4ID0gY29udHJvbFszXS54KCk7CisgICAgZmxvYXQgYzR5ID0gY29udHJvbFszXS55KCk7
CisKKyAgICBjb25zdCBpbnQgb2Zmc2V0ID0gcHRzLnNpemUoKTsKKyAgICBwdHMucmVzaXplKG9m
ZnNldCArIHNlZ21lbnRzKTsKKyAgICBQYXRoUG9pbnQgcHA7CisgICAgcHAubV94ID0gYzF4Owor
ICAgIHBwLm1feSA9IGMxeTsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudHM7ICsr
aSkgeworICAgICAgICB0QSArPSBzdGVwOworICAgICAgICB0QiAtPSBzdGVwOworICAgICAgICBj
b25zdCBmbG9hdCB0QXNxID0gdEEgKiB0QTsKKyAgICAgICAgY29uc3QgZmxvYXQgdEJzcSA9IHRC
ICogdEI7CisKKyAgICAgICAgY29uc3QgZmxvYXQgYSA9IHRCc3EgKiB0QjsKKyAgICAgICAgY29u
c3QgZmxvYXQgYiA9IDMuMCAqIHRBICogdEJzcTsKKyAgICAgICAgY29uc3QgZmxvYXQgYyA9IDMu
MCAqIHRCICogdEFzcTsKKyAgICAgICAgY29uc3QgZmxvYXQgZCA9IHRBc3EgKiB0QTsKKworICAg
ICAgICBwcC5tX3ggPSBjMXggKiBhICsgYzJ4ICogYiArIGMzeCAqIGMgKyBjNHggKiBkOworICAg
ICAgICBwcC5tX3kgPSBjMXkgKiBhICsgYzJ5ICogYiArIGMzeSAqIGMgKyBjNHkgKiBkOworCisg
ICAgICAgIHB0c1tvZmZzZXQgKyBpIC0gMV0gPSBwcDsKKyAgICB9CisKKyAgICBwcC5tX3ggPSBj
NHg7CisgICAgcHAubV95ID0gYzR5OworICAgIHB0c1tvZmZzZXQgKyBzZWdtZW50cyAtIDFdID0g
cHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN0YWJsZVJvdW5kKGRvdWJsZSBkKQoreworICAg
IGlmIChkID4gMCkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCArIDAuNSk7CisK
KyAgICBpbnQgaSA9IHN0YXRpY19jYXN0PGludD4oZCk7CisgICAgcmV0dXJuIGkgLSBkID4gMC41
ID8gaSAtIDEgOiBpOworfQorCitzdGF0aWMgYm9vbCBjb250YWluc1BvaW50KGNvbnN0IEZsb2F0
UmVjdCYgciwgY29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAgICByZXR1cm4gcC54KCkgPj0gci54
KCkgJiYgcC55KCkgPj0gci55KCkgJiYgcC54KCkgPCByLnJpZ2h0KCkgJiYgcC55KCkgPCByLmJv
dHRvbSgpOworfQorCisjZGVmaW5lIFBJICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisK
K3N0YXRpYyB2b2lkIG5vcm1hbGl6ZUFuZ2xlKGZsb2F0JiBhbmdsZSkKK3sKKyAgICB3aGlsZSAo
YW5nbGUgPCAwKQorICAgICAgICBhbmdsZSArPSAyICogUEk7CisgICAgd2hpbGUgKGFuZ2xlID49
IDIgKiBQSSkKKyAgICAgICAgYW5nbGUgLT0gMiAqIFBJOworICAgIGlmIChhbmdsZSA8IDAuMDAw
MDEpCisgICAgICAgIGFuZ2xlID0gMDsKK30KKworc3RhdGljIHZvaWQgdHJhbnNmb3JtQXJjUG9p
bnQoZmxvYXQmIHgsIGZsb2F0JiB5LCBjb25zdCBGbG9hdFBvaW50JiBjKQoreworICAgIHggKz0g
Yy54KCk7CisgICAgeSArPSBjLnkoKTsKK30KKworc3RhdGljIHZvaWQgaW5mbGF0ZVJlY3RUb0Nv
bnRhaW5Qb2ludChGbG9hdFJlY3QmIHIsIGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgaWYgKHIu
aXNFbXB0eSgpKSB7CisgICAgICAgIHIuc2V0WCh4KTsKKyAgICAgICAgci5zZXRZKHkpOworICAg
ICAgICByLnNldFNpemUoRmxvYXRTaXplKDEsIDEpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyAgICBpZiAoeCA8IHIueCgpKSB7CisgICAgICAgIHIuc2V0V2lkdGgoci5yaWdodCgpIC0geCk7
CisgICAgICAgIHIuc2V0WCh4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCB3ID0geCAt
IHIueCgpICsgMTsKKyAgICAgICAgaWYgKHcgPiByLndpZHRoKCkpCisgICAgICAgICAgICByLnNl
dFdpZHRoKHcpOworICAgIH0KKyAgICBpZiAoeSA8IHIueSgpKSB7CisgICAgICAgIHIuc2V0SGVp
Z2h0KHIuYm90dG9tKCkgLSB5KTsKKyAgICAgICAgci5zZXRZKHkpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIGZsb2F0IGggPSAgeSAtIHIueSgpICsgMTsKKyAgICAgICAgaWYgKGggPiByLmhlaWdo
dCgpKQorICAgICAgICAgICAgci5zZXRIZWlnaHQoaCk7CisgICAgfQorfQorCisvLyByZXR1cm4g
MC1iYXNlZCB2YWx1ZTogMCAtIGZpcnN0IFF1YWRyYW50ICggMCAtIDkwIGRlZ3JlZSkKK3N0YXRp
YyBpbmxpbmUgaW50IHF1YWRyYW50KGNvbnN0IFBhdGhQb2ludCYgcG9pbnQsIGNvbnN0IFBhdGhQ
b2ludCYgb3JpZ1BvaW50KQoreworICAgIHJldHVybiBwb2ludC5tX3ggPCBvcmlnUG9pbnQubV94
ID8KKyAgICAgICAgKHBvaW50Lm1feSA8IG9yaWdQb2ludC5tX3kgPyAyIDogMSkKKyAgICAgICAg
OiAocG9pbnQubV95IDwgb3JpZ1BvaW50Lm1feSA/IDMgOiAwKTsKK30KKworc3RhdGljIGlubGlu
ZSBib29sIGlzUXVhZHJhbnRPbkxlZnQoaW50IHEpIHsgcmV0dXJuIHEgPT0gMSB8fCBxID09IDI7
IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25SaWdodChpbnQgcSkgeyByZXR1cm4g
cSA9PSAwIHx8IHEgPT0gMzsgfQorc3RhdGljIGlubGluZSBib29sIGlzUXVhZHJhbnRPblRvcChp
bnQgcSkgeyByZXR1cm4gcSA9PSAyIHx8IHEgPT0gMzsgfQorc3RhdGljIGlubGluZSBib29sIGlz
UXVhZHJhbnRPbkJvdHRvbShpbnQgcSkgeyByZXR1cm4gcSA9PSAwIHx8IHEgPT0gMTsgfQorCitz
dGF0aWMgaW5saW5lIGludCBuZXh0UXVhZHJhbnQoaW50IHEpIHsgcmV0dXJuIHEgPT0gMyA/IDAg
OiBxICsgMTsgfQorc3RhdGljIGlubGluZSBpbnQgcXVhZHJhbnREaWZmKGludCBxMSwgaW50IHEy
KQoreworICAgIGludCBkID0gcTEgLSBxMjsKKyAgICB3aGlsZSAoZCA8IDApCisgICAgICAgIGQg
Kz0gNDsKKyAgICByZXR1cm4gZDsKK30KKworc3RydWN0IFBhdGhWZWN0b3IgeworICAgIGZsb2F0
IG1feDsKKyAgICBmbG9hdCBtX3k7CisKKyAgICBQYXRoVmVjdG9yKCkgOiBtX3goMCksIG1feSgw
KSB7fQorICAgIFBhdGhWZWN0b3IoZmxvYXQgeCwgZmxvYXQgeSkgOiBtX3goeCksIG1feSh5KSB7
fQorICAgIGRvdWJsZSBhbmdsZSgpIGNvbnN0IHsgcmV0dXJuIGF0YW4yKG1feSwgbV94KTsgfQor
ICAgIG9wZXJhdG9yIGRvdWJsZSAoKSBjb25zdCB7IHJldHVybiBhbmdsZSgpOyB9CisgICAgZG91
YmxlIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIF9oeXBvdChtX3gsIG1feSk7IH0KK307CisKK1Bh
dGhWZWN0b3Igb3BlcmF0b3ItKGNvbnN0IFBhdGhQb2ludCYgcDEsIGNvbnN0IFBhdGhQb2ludCYg
cDIpIHsgcmV0dXJuIFBhdGhWZWN0b3IocDEubV94IC0gcDIubV94LCBwMS5tX3kgLSBwMi5tX3kp
OyB9CisKK3N0YXRpYyB2b2lkIGFkZEFyY1BvaW50KFBhdGhQb2x5Z29uJiBwb2x5LCBjb25zdCBQ
YXRoUG9pbnQmIGNlbnRlciwgY29uc3QgUGF0aFBvaW50JiByYWRpdXMsIGRvdWJsZSBhbmdsZSkK
K3sKKyAgICBQYXRoUG9pbnQgcDsKKyAgICBnZXRFbGxpcHNlUG9pbnRCeUFuZ2xlKGFuZ2xlLCBy
YWRpdXMubV94LCByYWRpdXMubV95LCBwLm1feCwgcC5tX3kpOworICAgIHRyYW5zZm9ybUFyY1Bv
aW50KHAubV94LCBwLm1feSwgY2VudGVyKTsKKyAgICBpZiAocG9seS5pc0VtcHR5KCkgfHwgcG9s
eS5sYXN0KCkgIT0gcCkKKyAgICAgICAgcG9seS5hcHBlbmQocCk7Cit9CisKK3N0YXRpYyB2b2lk
IGFkZEFyY1BvaW50cyhQYXRoUG9seWdvbiYgcG9seSwgY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVu
dDo6QXJjVG8mIGRhdGEpCit7CisgICAgY29uc3QgUGF0aFBvaW50JiBzdGFydFBvaW50ID0gcG9s
eS5sYXN0KCk7CisgICAgZG91YmxlIGN1ckFuZ2xlID0gc3RhcnRQb2ludCAtIGRhdGEubV9jZW50
ZXI7CisgICAgZG91YmxlIGVuZEFuZ2xlID0gZGF0YS5tX2VuZCAtIGRhdGEubV9jZW50ZXI7Cisg
ICAgZG91YmxlIGFuZ2xlU3RlcCA9IDIuIC8gc3RkOjptYXgoZGF0YS5tX3JhZGl1cy5tX3gsIGRh
dGEubV9yYWRpdXMubV95KTsKKyAgICBpZiAoZGF0YS5tX2Nsb2Nrd2lzZSkgeworICAgICAgICBp
ZiAoZW5kQW5nbGUgPD0gY3VyQW5nbGUgfHwgc3RhcnRQb2ludCA9PSBkYXRhLm1fZW5kKQorICAg
ICAgICAgICAgZW5kQW5nbGUgKz0gMiAqIFBJOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZ2xl
U3RlcCA9IC1hbmdsZVN0ZXA7CisgICAgICAgIGlmIChlbmRBbmdsZSA+PSBjdXJBbmdsZSB8fCBz
dGFydFBvaW50ID09IGRhdGEubV9lbmQpCisgICAgICAgICAgICBlbmRBbmdsZSAtPSAyICogUEk7
CisgICAgfQorCisgICAgZm9yIChjdXJBbmdsZSArPSBhbmdsZVN0ZXA7IGRhdGEubV9jbG9ja3dp
c2UgPyBjdXJBbmdsZSA8IGVuZEFuZ2xlIDogY3VyQW5nbGUgPiBlbmRBbmdsZTsgY3VyQW5nbGUg
Kz0gYW5nbGVTdGVwKQorICAgICAgICBhZGRBcmNQb2ludChwb2x5LCBkYXRhLm1fY2VudGVyLCBk
YXRhLm1fcmFkaXVzLCBjdXJBbmdsZSk7CisKKyAgICBpZiAocG9seS5pc0VtcHR5KCkgfHwgcG9s
eS5sYXN0KCkgIT0gZGF0YS5tX2VuZCkKKyAgICAgICAgcG9seS5hcHBlbmQoZGF0YS5tX2VuZCk7
Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdQb2x5Z29ucyhIREMgZGMsIGNvbnN0IFZlY3RvcjxQYXRo
UG9seWdvbj4mIHBvbHlnb25zLCBib29sIGZpbGwsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4
KiB0cikKK3sKKyAgICBNZW1vcnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOworICAgIGZvciAo
VmVjdG9yPFBhdGhQb2x5Z29uPjo6Y29uc3RfaXRlcmF0b3IgaSA9IHBvbHlnb25zLmJlZ2luKCk7
IGkgIT0gcG9seWdvbnMuZW5kKCk7ICsraSkgeworICAgICAgICBpbnQgbnBvaW50cyA9IGktPnNp
emUoKTsKKyAgICAgICAgaWYgKCFucG9pbnRzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAg
ICAgICAgUE9JTlQqIHdpblBvaW50cyA9IDA7CisgICAgICAgIGlmIChmaWxsKSB7CisgICAgICAg
ICAgICBpZiAobnBvaW50cyA+IDIpCisgICAgICAgICAgICAgICAgd2luUG9pbnRzID0gbmV3IFBP
SU5UW25wb2ludHMgKyAxXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB3aW5Qb2ludHMg
PSBuZXcgUE9JTlRbbnBvaW50c107CisKKyAgICAgICAgaWYgKHdpblBvaW50cykgeworICAgICAg
ICAgICAgaWYgKHRyKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaTIgPSAwOyBpMiA8IG5w
b2ludHM7ICsraTIpIHsKKyAgICAgICAgICAgICAgICAgICAgRmxvYXRQb2ludCB0clBvaW50ID0g
dHItPm1hcFBvaW50KGktPmF0KGkyKSk7CisgICAgICAgICAgICAgICAgICAgIHdpblBvaW50c1tp
Ml0ueCA9IHN0YWJsZVJvdW5kKHRyUG9pbnQueCgpKTsKKyAgICAgICAgICAgICAgICAgICAgd2lu
UG9pbnRzW2kyXS55ID0gc3RhYmxlUm91bmQodHJQb2ludC55KCkpOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaTIgPSAw
OyBpMiA8IG5wb2ludHM7ICsraTIpIHsKKyAgICAgICAgICAgICAgICAgICAgd2luUG9pbnRzW2ky
XS54ID0gc3RhYmxlUm91bmQoaS0+YXQoaTIpLngoKSk7CisgICAgICAgICAgICAgICAgICAgIHdp
blBvaW50c1tpMl0ueSA9IHN0YWJsZVJvdW5kKGktPmF0KGkyKS55KCkpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpbGwgJiYgd2luUG9pbnRz
W25wb2ludHMgLSAxXSAhPSB3aW5Qb2ludHNbMF0pIHsKKyAgICAgICAgICAgICAgICB3aW5Qb2lu
dHNbbnBvaW50c10ueCA9IHdpblBvaW50c1swXS54OworICAgICAgICAgICAgICAgIHdpblBvaW50
c1tucG9pbnRzXS55ID0gd2luUG9pbnRzWzBdLnk7CisgICAgICAgICAgICAgICAgKytucG9pbnRz
OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmlsbCkKKyAgICAgICAgICAgICAg
ICA6OlBvbHlnb24oZGMsIHdpblBvaW50cywgbnBvaW50cyk7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgOjpQb2x5bGluZShkYywgd2luUG9pbnRzLCBucG9pbnRzKTsKKyAgICAg
ICAgICAgIGRlbGV0ZVtdIHdpblBvaW50czsKKyAgICAgICAgfQorICAgIH0KK30KKworCitpbnQg
UGxhdGZvcm1QYXRoRWxlbWVudDo6bnVtQ29udHJvbFBvaW50cygpIGNvbnN0Cit7CisgICAgc3dp
dGNoIChtX3R5cGUpIHsKKyAgICBjYXNlIFBhdGhNb3ZlVG86CisgICAgY2FzZSBQYXRoTGluZVRv
OgorICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIFBhdGhRdWFkQ3VydmVUbzoKKyAgICBjYXNl
IFBhdGhBcmNUbzoKKyAgICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBQYXRoQmV6aWVyQ3VydmVU
bzoKKyAgICAgICAgcmV0dXJuIDM7CisgICAgLy9jYXNlIFBhdGhDbG9zZVN1YnBhdGg6CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitpbnQgUGxhdGZvcm1QYXRo
RWxlbWVudDo6bnVtUG9pbnRzKCkgY29uc3QKK3sKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAg
IGNhc2UgUGF0aE1vdmVUbzoKKyAgICBjYXNlIFBhdGhMaW5lVG86CisgICAgY2FzZSBQYXRoQXJj
VG86CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgUGF0aFF1YWRDdXJ2ZVRvOgorICAgICAg
ICByZXR1cm4gMjsKKyAgICBjYXNlIFBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICByZXR1cm4g
MzsKKyAgICAvL2Nhc2UgUGF0aENsb3NlU3VicGF0aDoKKyAgICBkZWZhdWx0OgorICAgICAgICBy
ZXR1cm4gMDsKKyAgICB9Cit9CisKK3ZvaWQgUGF0aFBvbHlnb246Om1vdmUoY29uc3QgRmxvYXRT
aXplJiBvZmZzZXQpCit7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvaW50Pjo6aXRlcmF0b3IgaSA9
IGJlZ2luKCk7IGkgPCBlbmQoKTsgKytpKQorICAgICAgICBpLT5tb3ZlKG9mZnNldCk7Cit9CisK
K3ZvaWQgUGF0aFBvbHlnb246OnRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYg
dCkKK3sKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9pbnQ+OjppdGVyYXRvciBpID0gYmVnaW4oKTsg
aSA8IGVuZCgpOyArK2kpCisgICAgICAgICppID0gdC5tYXBQb2ludCgqaSk7Cit9CisKK2Jvb2wg
UGF0aFBvbHlnb246OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAorewor
ICAgIGlmIChzaXplKCkgPCAzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQgaW50
ZXJzZWN0ZWQgPSAwOworICAgIGNvbnN0IFBhdGhQb2ludCogcG9pbnQxID0gJmxhc3QoKTsKKyAg
ICBWZWN0b3I8UGF0aFBvaW50Pjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IGVuZCgpOworICAgIGlu
dCB3YXNOZWdhdGl2ZSA9IDI7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvaW50Pjo6Y29uc3RfaXRl
cmF0b3IgaSA9IGJlZ2luKCk7IGkgIT0gbGFzdDsgKytpKSB7CisgICAgICAgIGNvbnN0IFBhdGhQ
b2ludCYgcG9pbnQyID0gKmk7CisgICAgICAgIGlmIChwb2ludDEtPngoKSAhPSBwb2ludC54KCkp
IHsKKyAgICAgICAgICAgIGlmIChwb2ludDIueCgpID09IHBvaW50LngoKSkKKyAgICAgICAgICAg
ICAgICB3YXNOZWdhdGl2ZSA9IHBvaW50MS0+eCgpIDwgcG9pbnQueCgpID8gMSA6IDA7CisgICAg
ICAgICAgICBlbHNlIGlmIChwb2ludDIueCgpIDwgcG9pbnQueCgpICE9IHBvaW50MS0+eCgpIDwg
cG9pbnQueCgpKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgeSA9IChwb2ludDIueSgpIC0gcG9p
bnQxLT55KCkpIC8gKHBvaW50Mi54KCkgLSBwb2ludDEtPngoKSkgKiAocG9pbnQueCgpIC0gcG9p
bnQxLT54KCkpICsgcG9pbnQxLT55KCk7CisgICAgICAgICAgICAgICAgaWYgKHkgPj0gcG9pbnQu
eSgpKQorICAgICAgICAgICAgICAgICAgICArK2ludGVyc2VjdGVkOworICAgICAgICAgICAgfQor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBvaW50MS0+eSgpID09IHBvaW50Lnko
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKHBvaW50
MS0+eSgpID4gcG9pbnQueSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvaW50Mi54KCkgPT0g
cG9pbnQueCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb2ludDIueSgpIDw9IHBvaW50
LnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3YXNOZWdhdGl2ZSA9PSAyKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8UGF0aFBvaW50Pjo6Y29uc3RfaXRlcmF0
b3Igakxhc3QgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFBhdGhQb2ludD46
OmNvbnN0X2l0ZXJhdG9yIGogPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IGJlZ2luKCkpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGogPSBsYXN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1qOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChqLT54KCkgIT0gcG9pbnQueCgpKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChqLT54KCkgPiBwb2ludC54KCkpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB3YXNOZWdhdGl2ZSA9IDA7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHdhc05lZ2F0aXZlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAg
fSB3aGlsZSAoaiAhPSBqTGFzdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YXNO
ZWdhdGl2ZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAod2FzTmVnYXRp
dmUgPyBwb2ludDIueCgpID4gcG9pbnQueCgpIDogcG9pbnQyLngoKSA8IHBvaW50LngoKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICsraW50ZXJzZWN0ZWQ7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfSBlbHNlIGlmIChwb2ludDIueCgpID09IHBvaW50LngoKSAmJiBwb2ludDIu
eSgpID49IHBvaW50LnkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
fQorICAgICAgICBwb2ludDEgPSAmcG9pbnQyOworICAgIH0KKworICAgIHJldHVybiBpbnRlcnNl
Y3RlZCAmIDE7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoRWxlbWVudDo6bW92ZShjb25zdCBGbG9h
dFNpemUmIG9mZnNldCkKK3sKKyAgICBpbnQgbiA9IG51bUNvbnRyb2xQb2ludHMoKTsKKyAgICBm
b3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgbV9kYXRhLm1fcG9pbnRzW2ldLm1v
dmUob2Zmc2V0KTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGhFbGVtZW50Ojp0cmFuc2Zvcm0oY29u
c3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpCit7CisgICAgaW50IG4gPSBudW1Db250cm9sUG9p
bnRzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgRmxvYXRQ
b2ludCBwID0gdC5tYXBQb2ludChtX2RhdGEubV9wb2ludHNbaV0pOworICAgICAgICBtX2RhdGEu
bV9wb2ludHNbaV0uc2V0KHAueCgpLCBwLnkoKSk7CisgICAgfQorfQorCit2b2lkIFBsYXRmb3Jt
UGF0aEVsZW1lbnQ6OmluZmxhdGVSZWN0VG9Db250YWluTWUoRmxvYXRSZWN0JiByLCBjb25zdCBG
bG9hdFBvaW50JiBsYXN0UG9pbnQpIGNvbnN0Cit7CisgICAgaWYgKG1fdHlwZSA9PSBQYXRoQXJj
VG8pIHsKKyAgICAgICAgY29uc3QgQXJjVG8mIGRhdGEgPSBtX2RhdGEubV9hcmNUb0RhdGE7Cisg
ICAgICAgIFBhdGhQb2ludCBzdGFydFBvaW50OworICAgICAgICBzdGFydFBvaW50ID0gbGFzdFBv
aW50OworICAgICAgICBQYXRoUG9pbnQgZW5kUG9pbnQgPSBkYXRhLm1fZW5kOworICAgICAgICBp
ZiAoIWRhdGEubV9jbG9ja3dpc2UpCisgICAgICAgICAgICBzdGQ6OnN3YXAoc3RhcnRQb2ludCwg
ZW5kUG9pbnQpOworCisgICAgICAgIGludCBxMCA9IHF1YWRyYW50KHN0YXJ0UG9pbnQsIGRhdGEu
bV9jZW50ZXIpOworICAgICAgICBpbnQgcTEgPSBxdWFkcmFudChlbmRQb2ludCwgZGF0YS5tX2Nl
bnRlcik7CisgICAgICAgIGJvb2wgY29udGFpbnNFeHRyZW1lc1s0XSA9IHsgZmFsc2UgfTsgLy8g
Ym90dG9tLCBsZWZ0LCB0b3AsIHJpZ2h0CisgICAgICAgIHN0YXRpYyBjb25zdCBQYXRoUG9pbnQg
ZXh0cmVtZVZlY3RvcnNbNF0gPSB7IHsgMCwgMSB9LCB7IC0xLCAwIH0sIHsgMCwgLTEgfSwgeyAx
LCAwIH0gfTsKKyAgICAgICAgaWYgKHEwID09IHExKSB7CisgICAgICAgICAgICBpZiAoc3RhcnRQ
b2ludC5tX3ggPT0gZW5kUG9pbnQubV94IHx8IGlzUXVhZHJhbnRPbkJvdHRvbShxMCkgIT0gc3Rh
cnRQb2ludC5tX3ggPiBlbmRQb2ludC5tX3gpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IDQ7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbnNFeHRyZW1lc1tp
XSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBp
bnQgZXh0cmVtZSA9IHEwOworICAgICAgICAgICAgaW50IGRpZmYgPSBxdWFkcmFudERpZmYocTEs
IHEwKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlmZjsgKytpKSB7CisgICAg
ICAgICAgICAgICAgY29udGFpbnNFeHRyZW1lc1tleHRyZW1lXSA9IHRydWU7CisgICAgICAgICAg
ICAgICAgZXh0cmVtZSA9IG5leHRRdWFkcmFudChleHRyZW1lKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorCisgICAgICAgIGluZmxhdGVSZWN0VG9Db250YWluUG9pbnQociwgc3RhcnRQb2lu
dC5tX3gsIHN0YXJ0UG9pbnQubV95KTsKKyAgICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2lu
dChyLCBlbmRQb2ludC5tX3gsIGVuZFBvaW50Lm1feSk7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbnNFeHRyZW1lc1tpXSkKKyAg
ICAgICAgICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIGRhdGEubV9jZW50ZXIu
bV94ICsgZGF0YS5tX3JhZGl1cy5tX3ggKiBleHRyZW1lVmVjdG9yc1tpXS5tX3gsIGRhdGEubV9j
ZW50ZXIubV95ICsgZGF0YS5tX3JhZGl1cy5tX3kgKiBleHRyZW1lVmVjdG9yc1tpXS5tX3kpOwor
ICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IG4gPSBudW1Qb2ludHMoKTsKKyAg
ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICAgICAgICBpbmZsYXRlUmVj
dFRvQ29udGFpblBvaW50KHIsIG1fZGF0YS5tX3BvaW50c1tpXS5tX3gsIG1fZGF0YS5tX3BvaW50
c1tpXS5tX3kpOworICAgIH0KK30KKworUGF0aEVsZW1lbnRUeXBlIFBsYXRmb3JtUGF0aEVsZW1l
bnQ6OnR5cGUoKSBjb25zdAoreworICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgY2FzZSBQYXRo
TW92ZVRvOgorICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRNb3ZlVG9Qb2ludDsKKyAgICBjYXNl
IFBhdGhMaW5lVG86CisgICAgICAgIHJldHVybiBQYXRoRWxlbWVudEFkZExpbmVUb1BvaW50Owor
ICAgIGNhc2UgUGF0aEFyY1RvOgorICAgICAgICAvLyBGSVhNRTogdGhlcmUncyBubyBhcmNUbyB0
eXBlIGZvciBQYXRoRWxlbWVudAorICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRMaW5lVG9Q
b2ludDsKKyAgICAgICAgLy8gcmV0dXJuIFBhdGhFbGVtZW50QWRkUXVhZEN1cnZlVG9Qb2ludDsK
KyAgICBjYXNlIFBhdGhRdWFkQ3VydmVUbzoKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRk
UXVhZEN1cnZlVG9Qb2ludDsKKyAgICBjYXNlIFBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICBy
ZXR1cm4gUGF0aEVsZW1lbnRBZGRDdXJ2ZVRvUG9pbnQ7CisgICAgLy9jYXNlIFBhdGhDbG9zZVN1
YnBhdGg6CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50Q2xvc2VTdWJw
YXRoOworICAgIH0KK30KKworUGxhdGZvcm1QYXRoOjpQbGF0Zm9ybVBhdGgoKQorOiBtX3Blbkxp
ZnRlZCh0cnVlKQoreworICAgIG1fY3VycmVudFBvaW50LmNsZWFyKCk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1QYXRoOjplbnN1cmVTdWJwYXRoKCkKK3sKKyAgICBpZiAobV9wZW5MaWZ0ZWQpIHsKKyAg
ICAgICAgbV9wZW5MaWZ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbV9zdWJwYXRocy5hcHBlbmQoUGF0
aFBvbHlnb24oKSk7CisgICAgICAgIG1fc3VicGF0aHMubGFzdCgpLmFwcGVuZChtX2N1cnJlbnRQ
b2ludCk7CisgICAgfSBlbHNlCisgICAgICAgIEFTU0VSVCghbV9zdWJwYXRocy5pc0VtcHR5KCkp
OworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkVG9TdWJwYXRoKGNvbnN0IFBsYXRmb3JtUGF0
aEVsZW1lbnQmIGUpCit7CisgICAgaWYgKGUucGxhdGZvcm1UeXBlKCkgPT0gUGxhdGZvcm1QYXRo
RWxlbWVudDo6UGF0aE1vdmVUbykgeworICAgICAgICBtX3BlbkxpZnRlZCA9IHRydWU7CisgICAg
ICAgIG1fY3VycmVudFBvaW50ID0gZS5wb2ludEF0KDApOworICAgIH0gZWxzZSBpZiAoZS5wbGF0
Zm9ybVR5cGUoKSA9PSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQ2xvc2VTdWJwYXRoKSB7Cisg
ICAgICAgIG1fcGVuTGlmdGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtX3N1YnBhdGhzLmlzRW1w
dHkoKSkgeworICAgICAgICAgICAgaWYgKG1fY3VycmVudFBvaW50ICE9IG1fc3VicGF0aHMubGFz
dCgpWzBdKSB7CisgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIFczQywgd2UgaGF2ZSB0
byBkcmF3IGEgbGluZSBmcm9tIGN1cnJlbnQgcG9pbnQgdG8gdGhlIGluaXRpYWwgcG9pbnQKKyAg
ICAgICAgICAgICAgICBtX3N1YnBhdGhzLmxhc3QoKS5hcHBlbmQobV9zdWJwYXRocy5sYXN0KClb
MF0pOworICAgICAgICAgICAgICAgIG1fY3VycmVudFBvaW50ID0gbV9zdWJwYXRocy5sYXN0KClb
MF07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV9jdXJyZW50
UG9pbnQuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnN1cmVTdWJwYXRoKCk7Cisg
ICAgICAgIHN3aXRjaCAoZS5wbGF0Zm9ybVR5cGUoKSkgeworICAgICAgICBjYXNlIFBsYXRmb3Jt
UGF0aEVsZW1lbnQ6OlBhdGhMaW5lVG86CisgICAgICAgICAgICBtX3N1YnBhdGhzLmxhc3QoKS5h
cHBlbmQoZS5wb2ludEF0KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBs
YXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhBcmNUbzoKKyAgICAgICAgICAgIGFkZEFyY1BvaW50cyht
X3N1YnBhdGhzLmxhc3QoKSwgZS5hcmNUbygpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhRdWFkQ3VydmVUbzoKKyAgICAgICAgICAg
IHsKKyAgICAgICAgICAgICAgICBQYXRoUG9pbnQgY29udHJvbFtdID0geworICAgICAgICAgICAg
ICAgICAgICBtX2N1cnJlbnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgZS5wb2ludEF0KDAp
LAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMSksCisgICAgICAgICAgICAgICAgfTsK
KyAgICAgICAgICAgICAgICAvLyBGSVhNRTogbWFnaWMgbnVtYmVyPworICAgICAgICAgICAgICAg
IHF1YWRDdXJ2ZSg1MCwgbV9zdWJwYXRocy5sYXN0KCksIGNvbnRyb2wpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6
UGF0aEJlemllckN1cnZlVG86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGF0aFBv
aW50IGNvbnRyb2xbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50UG9pbnQsCisg
ICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgwKSwKKyAgICAgICAgICAgICAgICAgICAgZS5w
b2ludEF0KDEpLAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMiksCisgICAgICAgICAg
ICAgICAgfTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogbWFnaWMgbnVtYmVyPworICAgICAg
ICAgICAgICAgIGJlemllcigxMDAsIG1fc3VicGF0aHMubGFzdCgpLCBjb250cm9sKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbV9jdXJyZW50UG9pbnQgPSBtX3N1YnBhdGhz
Lmxhc3QoKS5sYXN0KCk7CisgICAgfQorfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5kKGNv
bnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQmIGUpCit7CisgICAgZS5pbmZsYXRlUmVjdFRvQ29udGFp
bk1lKG1fYm91bmRpbmdSZWN0LCBsYXN0UG9pbnQoKSk7CisgICAgYWRkVG9TdWJwYXRoKGUpOwor
ICAgIG1fZWxlbWVudHMuYXBwZW5kKGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5k
KGNvbnN0IFBsYXRmb3JtUGF0aCYgcCkKK3sKKyAgICBjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50
cyYgZSA9IHAuZWxlbWVudHMoKTsKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25z
dF9pdGVyYXRvciBpdChlLmJlZ2luKCkpOyBpdCAhPSBlLmVuZCgpOyArK2l0KSB7CisgICAgICAg
IGFkZFRvU3VicGF0aCgqaXQpOworICAgICAgICBpdC0+aW5mbGF0ZVJlY3RUb0NvbnRhaW5NZSht
X2JvdW5kaW5nUmVjdCwgbGFzdFBvaW50KCkpOworICAgICAgICBtX2VsZW1lbnRzLmFwcGVuZCgq
aXQpOworICAgIH0KK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmNsZWFyKCkKK3sKKyAgICBtX2Vs
ZW1lbnRzLmNsZWFyKCk7CisgICAgbV9ib3VuZGluZ1JlY3QgPSBGbG9hdFJlY3QoKTsKKyAgICBt
X3N1YnBhdGhzLmNsZWFyKCk7CisgICAgbV9jdXJyZW50UG9pbnQuY2xlYXIoKTsKKyAgICBtX3Bl
bkxpZnRlZCA9IHRydWU7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjpzdHJva2VQYXRoKEhEQyBk
YywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgqIHRyKSBjb25zdAoreworICAgIGRyYXdQb2x5
Z29ucyhkYywgbV9zdWJwYXRocywgZmFsc2UsIHRyKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6
OmZpbGxQYXRoKEhEQyBkYywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgqIHRyKSBjb25zdAor
eworICAgIEhHRElPQkogb2xkUGVuID0gU2VsZWN0T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChO
VUxMX1BFTikpOworICAgIGRyYXdQb2x5Z29ucyhkYywgbV9zdWJwYXRocywgdHJ1ZSwgdHIpOwor
ICAgIFNlbGVjdE9iamVjdChkYywgb2xkUGVuKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OnRy
YW5zbGF0ZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgZm9yIChQbGF0Zm9ybVBhdGhF
bGVtZW50czo6aXRlcmF0b3IgaXQobV9lbGVtZW50cy5iZWdpbigpKTsgaXQgIT0gbV9lbGVtZW50
cy5lbmQoKTsgKytpdCkKKyAgICAgICAgaXQtPm1vdmUoc2l6ZSk7CisKKyAgICBtX2JvdW5kaW5n
UmVjdC5tb3ZlKHNpemUpOworICAgIGZvciAoVmVjdG9yPFBhdGhQb2x5Z29uPjo6aXRlcmF0b3Ig
aXQgPSBtX3N1YnBhdGhzLmJlZ2luKCk7IGl0ICE9IG1fc3VicGF0aHMuZW5kKCk7ICsraXQpCisg
ICAgICAgIGl0LT5tb3ZlKHNpemUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6dHJhbnNmb3Jt
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIGZvciAoUGxhdGZvcm1QYXRo
RWxlbWVudHM6Oml0ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVnaW4oKSk7IGl0ICE9IG1fZWxlbWVu
dHMuZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT50cmFuc2Zvcm0odCk7CisKKyAgICBtX2JvdW5k
aW5nUmVjdCA9IHQubWFwUmVjdChtX2JvdW5kaW5nUmVjdCk7CisgICAgZm9yIChWZWN0b3I8UGF0
aFBvbHlnb24+OjppdGVyYXRvciBpdCA9IG1fc3VicGF0aHMuYmVnaW4oKTsgaXQgIT0gbV9zdWJw
YXRocy5lbmQoKTsgKytpdCkKKyAgICAgICAgaXQtPnRyYW5zZm9ybSh0KTsKK30KKworYm9vbCBQ
bGF0Zm9ybVBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBy
dWxlKSBjb25zdAoreworICAgIC8vIG9wdGltaXphdGlvbjogY2hlY2sgdGhlIGJvdW5kaW5nIHJl
Y3QgZmlyc3QKKyAgICBpZiAoIWNvbnRhaW5zUG9pbnQobV9ib3VuZGluZ1JlY3QsIHBvaW50KSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChWZWN0b3I8UGF0aFBvbHlnb24+Ojpj
b25zdF9pdGVyYXRvciBpID0gbV9zdWJwYXRocy5iZWdpbigpOyBpICE9IG1fc3VicGF0aHMuZW5k
KCk7ICsraSkgeworICAgICAgICBpZiAoaS0+Y29udGFpbnMocG9pbnQpKQorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFBsYXRm
b3JtUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIFBsYXRmb3Jt
UGF0aEVsZW1lbnQ6Ok1vdmVUbyBkYXRhID0geyB7IHBvaW50LngoKSwgcG9pbnQueSgpIH0gfTsK
KyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7Cit9CisK
K3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRMaW5lVG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7
CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6TGluZVRvIGRhdGEgPSB7IHsgcG9pbnQueCgpLCBw
b2ludC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7CisgICAgYXBw
ZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFF1YWRDdXJ2ZVRvKGNvbnN0IEZs
b2F0UG9pbnQmIGNwLCBjb25zdCBGbG9hdFBvaW50JiBwKQoreworICAgIFBsYXRmb3JtUGF0aEVs
ZW1lbnQ6OlF1YWRDdXJ2ZVRvIGRhdGEgPSB7IHsgY3AueCgpLCBjcC55KCkgfSwgeyBwLngoKSwg
cC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7CisgICAgYXBwZW5k
KHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEJlemllckN1cnZlVG8oY29uc3QgRmxv
YXRQb2ludCYgY3AxLCBjb25zdCBGbG9hdFBvaW50JiBjcDIsIGNvbnN0IEZsb2F0UG9pbnQmIHAp
Cit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QmV6aWVyQ3VydmVUbyBkYXRhID0geyB7IGNw
MS54KCksIGNwMS55KCkgfSwgeyBjcDIueCgpLCBjcDIueSgpIH0sIHsgcC54KCksIHAueSgpIH0g
fTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7Cit9
CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRBcmNUbyhjb25zdCBGbG9hdFBvaW50JiBmcDEsIGNv
bnN0IEZsb2F0UG9pbnQmIGZwMiwgZmxvYXQgcmFkaXVzKQoreworICAgIGNvbnN0IFBhdGhQb2lu
dCYgcDAgPSBtX2N1cnJlbnRQb2ludDsKKyAgICBQYXRoUG9pbnQgcDE7CisgICAgcDEgPSBmcDE7
CisgICAgUGF0aFBvaW50IHAyOworICAgIHAyID0gZnAyOworICAgIGlmICghcmFkaXVzIHx8IHAw
ID09IHAxIHx8IHAxID09IHAyKSB7CisgICAgICAgIGFkZExpbmVUbyhwMSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBQYXRoVmVjdG9yIHYwMSA9IHAwIC0gcDE7CisgICAgUGF0aFZl
Y3RvciB2MjEgPSBwMiAtIHAxOworCisgICAgLy8gc2luKEEgLSBCKSA9IHNpbihBKSAqIGNvcyhC
KSAtIHNpbihCKSAqIGNvcyhBKQorICAgIGRvdWJsZSBjcm9zcyA9IHYwMS5tX3ggKiB2MjEubV95
IC0gdjAxLm1feSAqIHYyMS5tX3g7CisKKyAgICBpZiAoZmFicyhjcm9zcykgPCAxRS0xMCkgewor
ICAgICAgICAvLyBvbiBvbmUgbGluZQorICAgICAgICBhZGRMaW5lVG8ocDEpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgZG91YmxlIGQwMSA9IHYwMS5sZW5ndGgoKTsKKyAgICBkb3Vi
bGUgZDIxID0gdjIxLmxlbmd0aCgpOworICAgIGRvdWJsZSBhbmdsZSA9IChQSSAtIGFicyhhc2lu
KGNyb3NzIC8gKGQwMSAqIGQyMSkpKSkgKiAwLjU7CisgICAgZG91YmxlIHNwYW4gPSByYWRpdXMg
KiB0YW4oYW5nbGUpOworICAgIGRvdWJsZSByYXRlID0gc3BhbiAvIGQwMTsKKyAgICBQYXRoUG9p
bnQgc3RhcnRQb2ludDsKKyAgICBzdGFydFBvaW50Lm1feCA9IHAxLm1feCArIHYwMS5tX3ggKiBy
YXRlOworICAgIHN0YXJ0UG9pbnQubV95ID0gcDEubV95ICsgdjAxLm1feSAqIHJhdGU7CisKKyAg
ICBhZGRMaW5lVG8oc3RhcnRQb2ludCk7CisKKyAgICBQYXRoUG9pbnQgZW5kUG9pbnQ7CisgICAg
cmF0ZSA9IHNwYW4gLyBkMjE7CisgICAgZW5kUG9pbnQubV94ID0gcDEubV94ICsgdjIxLm1feCAq
IHJhdGU7CisgICAgZW5kUG9pbnQubV95ID0gcDEubV95ICsgdjIxLm1feSAqIHJhdGU7CisKKyAg
ICBQYXRoUG9pbnQgbWlkUG9pbnQ7CisgICAgbWlkUG9pbnQubV94ID0gKHN0YXJ0UG9pbnQubV94
ICsgZW5kUG9pbnQubV94KSAqIDAuNTsKKyAgICBtaWRQb2ludC5tX3kgPSAoc3RhcnRQb2ludC5t
X3kgKyBlbmRQb2ludC5tX3kpICogMC41OworCisgICAgUGF0aFZlY3RvciB2bTEgPSBtaWRQb2lu
dCAtIHAxOworICAgIGRvdWJsZSBkbTEgPSB2bTEubGVuZ3RoKCk7CisgICAgZG91YmxlIGQgPSBf
aHlwb3QocmFkaXVzLCBzcGFuKTsKKworICAgIFBhdGhQb2ludCBjZW50ZXJQb2ludDsKKyAgICBy
YXRlID0gZCAvIGRtMTsKKyAgICBjZW50ZXJQb2ludC5tX3ggPSBwMS5tX3ggKyB2bTEubV94ICog
cmF0ZTsKKyAgICBjZW50ZXJQb2ludC5tX3kgPSBwMS5tX3kgKyB2bTEubV95ICogcmF0ZTsKKwor
ICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvIGRhdGEgPSB7CisgICAgICAgIGVuZFBvaW50
LAorICAgICAgICBjZW50ZXJQb2ludCwKKyAgICAgICAgeyByYWRpdXMsIHJhZGl1cyB9LAorICAg
ICAgICBjcm9zcyA8IDAKKyAgICB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7
CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmNsb3NlU3VicGF0aCgp
Cit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZTsKKyAgICBhcHBlbmQocGUpOworfQorCisv
LyBhZGQgYSBjaXJjdWxhciBhcmMgY2VudHJlZCBhdCBwIHdpdGggcmFkaXVzIHIgZnJvbSBzdGFy
dCBhbmdsZSBzYXIgKHJhZGlhbnMpIHRvIGVuZCBhbmdsZSBlYXIKK3ZvaWQgUGxhdGZvcm1QYXRo
OjphZGRFbGxpcHNlKGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0
IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9ja3dpc2UpCit7CisgICAgZmxvYXQgc3RhcnRY
LCBzdGFydFksIGVuZFgsIGVuZFk7CisKKyAgICBub3JtYWxpemVBbmdsZShzYXIpOworICAgIG5v
cm1hbGl6ZUFuZ2xlKGVhcik7CisKKyAgICBnZXRFbGxpcHNlUG9pbnRCeUFuZ2xlKHNhciwgYSwg
Yiwgc3RhcnRYLCBzdGFydFkpOworICAgIGdldEVsbGlwc2VQb2ludEJ5QW5nbGUoZWFyLCBhLCBi
LCBlbmRYLCBlbmRZKTsKKworICAgIHRyYW5zZm9ybUFyY1BvaW50KHN0YXJ0WCwgc3RhcnRZLCBw
KTsKKyAgICB0cmFuc2Zvcm1BcmNQb2ludChlbmRYLCBlbmRZLCBwKTsKKworICAgIEZsb2F0UG9p
bnQgc3RhcnQoc3RhcnRYLCBzdGFydFkpOworICAgIG1vdmVUbyhzdGFydCk7CisKKyAgICBQbGF0
Zm9ybVBhdGhFbGVtZW50OjpBcmNUbyBkYXRhID0geyB7IGVuZFgsIGVuZFkgfSwgeyBwLngoKSwg
cC55KCkgfSwgIHsgYSwgYiB9LCAhYW50aWNsb2Nrd2lzZSB9OworICAgIFBsYXRmb3JtUGF0aEVs
ZW1lbnQgcGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKworCit2b2lkIFBsYXRmb3JtUGF0
aDo6YWRkUmVjdChjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAgbW92ZVRvKHIubG9jYXRpb24o
KSk7CisKKyAgICBmbG9hdCByaWdodCA9IHIucmlnaHQoKSAtIDE7CisgICAgZmxvYXQgYm90dG9t
ID0gci5ib3R0b20oKSAtIDE7CisgICAgYWRkTGluZVRvKEZsb2F0UG9pbnQocmlnaHQsIHIueSgp
KSk7CisgICAgYWRkTGluZVRvKEZsb2F0UG9pbnQocmlnaHQsIGJvdHRvbSkpOworICAgIGFkZExp
bmVUbyhGbG9hdFBvaW50KHIueCgpLCBib3R0b20pKTsKKyAgICBhZGRMaW5lVG8oci5sb2NhdGlv
bigpKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEVsbGlwc2UoY29uc3QgRmxvYXRSZWN0
JiByKQoreworICAgIEZsb2F0U2l6ZSByYWRpdXMoci53aWR0aCgpICogMC41LCByLmhlaWdodCgp
ICogMC41KTsKKyAgICBhZGRFbGxpcHNlKHIubG9jYXRpb24oKSArIHJhZGl1cywgcmFkaXVzLndp
ZHRoKCksIHJhZGl1cy5oZWlnaHQoKSwgMCwgMCwgdHJ1ZSk7Cit9CisKK1N0cmluZyBQbGF0Zm9y
bVBhdGg6OmRlYnVnU3RyaW5nKCkgY29uc3QKK3sKKyAgICBTdHJpbmcgcmV0OworICAgIGZvciAo
UGxhdGZvcm1QYXRoRWxlbWVudHM6OmNvbnN0X2l0ZXJhdG9yIGkobV9lbGVtZW50cy5iZWdpbigp
KTsgaSAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2kpIHsKKyAgICAgICAgc3dpdGNoIChpLT5wbGF0
Zm9ybVR5cGUoKSkgeworICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhNb3Zl
VG86CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aExpbmVUbzoKKyAgICAg
ICAgICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgiTSAlZiAlZlxuIiwgaS0+cG9pbnRBdCgwKS5t
X3gsIGktPnBvaW50QXQoMCkubV95KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhBcmNUbzoKKyAgICAgICAgICAgIHJldCArPSBTdHJp
bmc6OmZvcm1hdCgiQSAlZiAlZiAlZiAlZiAlZiAlZiAlY1xuIgorICAgICAgICAgICAgICAgICwg
aS0+YXJjVG8oKS5tX2VuZC5tX3gsIGktPmFyY1RvKCkubV9lbmQubV95CisgICAgICAgICAgICAg
ICAgLCBpLT5hcmNUbygpLm1fY2VudGVyLm1feCwgaS0+YXJjVG8oKS5tX2NlbnRlci5tX3kKKyAg
ICAgICAgICAgICAgICAsIGktPmFyY1RvKCkubV9yYWRpdXMubV94LCBpLT5hcmNUbygpLm1fcmFk
aXVzLm1feQorICAgICAgICAgICAgICAgICwgaS0+YXJjVG8oKS5tX2Nsb2Nrd2lzZT8gJ1knIDog
J04nKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1l
bnQ6OlBhdGhRdWFkQ3VydmVUbzoKKyAgICAgICAgICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgi
USAlZiAlZiAlZiAlZlxuIgorICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgwKS5tX3gsIGkt
PnBvaW50QXQoMCkubV95CisgICAgICAgICAgICAgICAgLCBpLT5wb2ludEF0KDEpLm1feCwgaS0+
cG9pbnRBdCgxKS5tX3kpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZv
cm1QYXRoRWxlbWVudDo6UGF0aEJlemllckN1cnZlVG86CisgICAgICAgICAgICByZXQgKz0gU3Ry
aW5nOjpmb3JtYXQoIkIgJWYgJWYgJWYgJWYgJWYgJWZcbiIKKyAgICAgICAgICAgICAgICAsIGkt
PnBvaW50QXQoMCkubV94LCBpLT5wb2ludEF0KDApLm1feQorICAgICAgICAgICAgICAgICwgaS0+
cG9pbnRBdCgxKS5tX3gsIGktPnBvaW50QXQoMSkubV95CisgICAgICAgICAgICAgICAgLCBpLT5w
b2ludEF0KDIpLm1feCwgaS0+cG9pbnRBdCgyKS5tX3kpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aENsb3NlU3VicGF0aDoKKyAgICAg
ICAgICAgIHJldCArPSAiU1xuIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
fQorCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFwcGx5KHZvaWQq
IGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24gZnVuY3Rpb24pIGNvbnN0Cit7CisgICAgUGF0aEVs
ZW1lbnQgcGVsZW1lbnQ7CisgICAgRmxvYXRQb2ludCBwb2ludHNbM107CisgICAgcGVsZW1lbnQu
cG9pbnRzID0gcG9pbnRzOworCisgICAgZm9yIChQbGF0Zm9ybVBhdGhFbGVtZW50czo6Y29uc3Rf
aXRlcmF0b3IgaXQobV9lbGVtZW50cy5iZWdpbigpKTsgaXQgIT0gbV9lbGVtZW50cy5lbmQoKTsg
KytpdCkgeworICAgICAgICBwZWxlbWVudC50eXBlID0gaXQtPnR5cGUoKTsKKyAgICAgICAgaW50
IG4gPSBpdC0+bnVtUG9pbnRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytp
KQorICAgICAgICAgICAgcG9pbnRzW2ldID0gaXQtPnBvaW50QXQoaSk7CisgICAgICAgIGZ1bmN0
aW9uKGluZm8sICZwZWxlbWVudCk7CisgICAgfQorfQorCisKK30gLy8gbmFtZXNwYWNlIFdlYmNv
cmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1Q
YXRoV2luY2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRo
V2luY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2EwMGE3Ci0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBh
dGhXaW5jZS5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0y
MDA5IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
ICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAg
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFBsYXRmb3JtUGF0aFdp
bmNlX2gKKyNkZWZpbmUgUGxhdGZvcm1QYXRoV2luY2VfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKKyAgICBjbGFzcyBHcmFwaGljc0NvbnRleHQ7CisKKyAgICBzdHJ1Y3QgUGF0aFBvaW50IHsK
KyAgICAgICAgZmxvYXQgbV94OworICAgICAgICBmbG9hdCBtX3k7CisgICAgICAgIGNvbnN0IGZs
b2F0JiB4KCkgY29uc3QgeyByZXR1cm4gbV94OyB9CisgICAgICAgIGNvbnN0IGZsb2F0JiB5KCkg
Y29uc3QgeyByZXR1cm4gbV95OyB9CisgICAgICAgIHZvaWQgc2V0KGZsb2F0IHgsIGZsb2F0IHkp
CisgICAgICAgIHsKKyAgICAgICAgICAgIG1feCA9IHg7CisgICAgICAgICAgICBtX3kgPSB5Owor
ICAgICAgICB9OworICAgICAgICBvcGVyYXRvciBGbG9hdFBvaW50KCkgY29uc3QgeyByZXR1cm4g
RmxvYXRQb2ludChtX3gsIG1feSk7IH0KKyAgICAgICAgdm9pZCBtb3ZlKGNvbnN0IEZsb2F0U2l6
ZSYgb2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBtX3ggKz0gb2Zmc2V0LndpZHRoKCk7
CisgICAgICAgICAgICBtX3kgKz0gb2Zmc2V0LmhlaWdodCgpOworICAgICAgICB9CisgICAgICAg
IFBhdGhQb2ludCYgb3BlcmF0b3I9KGNvbnN0IEZsb2F0UG9pbnQmIHApCisgICAgICAgIHsKKyAg
ICAgICAgICAgIG1feCA9IHAueCgpOworICAgICAgICAgICAgbV95ID0gcC55KCk7CisgICAgICAg
ICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBjbGVhcigpIHsgbV94
ID0gbV95ID0gMDsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgUGF0aFBvbHlnb246IHB1YmxpYyBW
ZWN0b3I8UGF0aFBvaW50PiB7CisgICAgICAgIHZvaWQgbW92ZShjb25zdCBGbG9hdFNpemUmIG9m
ZnNldCk7CisgICAgICAgIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4
JiB0KTsKKyAgICAgICAgYm9vbCBjb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29u
c3Q7CisgICAgfTsKKworICAgIGNsYXNzIFBsYXRmb3JtUGF0aEVsZW1lbnQgeworICAgIHB1Ymxp
YzoKKyAgICAgICAgZW51bSBQbGFmb3JtUGF0aEVsZW1lbnRUeXBlIHsKKyAgICAgICAgICAgIFBh
dGhNb3ZlVG8sCisgICAgICAgICAgICBQYXRoTGluZVRvLAorICAgICAgICAgICAgUGF0aEFyY1Rv
LAorICAgICAgICAgICAgUGF0aFF1YWRDdXJ2ZVRvLAorICAgICAgICAgICAgUGF0aEJlemllckN1
cnZlVG8sCisgICAgICAgICAgICBQYXRoQ2xvc2VTdWJwYXRoLAorICAgICAgICB9OworCisgICAg
ICAgIHN0cnVjdCBNb3ZlVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fZW5kOworICAgICAg
ICB9OworCisgICAgICAgIHN0cnVjdCBMaW5lVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1f
ZW5kOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBBcmNUbyB7CisgICAgICAgICAgICBQ
YXRoUG9pbnQgbV9lbmQ7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9jZW50ZXI7CisgICAgICAg
ICAgICBQYXRoUG9pbnQgbV9yYWRpdXM7CisgICAgICAgICAgICBib29sIG1fY2xvY2t3aXNlOwor
ICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBRdWFkQ3VydmVUbyB7CisgICAgICAgICAgICBQ
YXRoUG9pbnQgbV9wb2ludDA7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDE7CisgICAg
ICAgIH07CisKKyAgICAgICAgc3RydWN0IEJlemllckN1cnZlVG8geworICAgICAgICAgICAgUGF0
aFBvaW50IG1fcG9pbnQwOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQxOworICAgICAg
ICAgICAgUGF0aFBvaW50IG1fcG9pbnQyOworICAgICAgICB9OworCisgICAgICAgIFBsYXRmb3Jt
UGF0aEVsZW1lbnQoKTogbV90eXBlKFBhdGhDbG9zZVN1YnBhdGgpIHsgbV9kYXRhLm1fcG9pbnRz
WzBdLnNldCgwLCAwKTsgICAgfQorICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IE1v
dmVUbyYgZGF0YSk6IG1fdHlwZShQYXRoTW92ZVRvKSB7IG1fZGF0YS5tX21vdmVUb0RhdGEgPSBk
YXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgTGluZVRvJiBkYXRhKTog
bV90eXBlKFBhdGhMaW5lVG8pIHsgbV9kYXRhLm1fbGluZVRvRGF0YSA9IGRhdGE7IH0KKyAgICAg
ICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25zdCBBcmNUbyYgZGF0YSk6IG1fdHlwZShQYXRoQXJj
VG8pIHsgbV9kYXRhLm1fYXJjVG9EYXRhID0gZGF0YTsgfQorICAgICAgICBQbGF0Zm9ybVBhdGhF
bGVtZW50KGNvbnN0IFF1YWRDdXJ2ZVRvJiBkYXRhKTogbV90eXBlKFBhdGhRdWFkQ3VydmVUbykg
eyBtX2RhdGEubV9xdWFkQ3VydmVUb0RhdGEgPSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0
aEVsZW1lbnQoY29uc3QgQmV6aWVyQ3VydmVUbyYgZGF0YSk6IG1fdHlwZShQYXRoQmV6aWVyQ3Vy
dmVUbykgeyBtX2RhdGEubV9iZXppZXJDdXJ2ZVRvRGF0YSA9IGRhdGE7IH0KKworICAgICAgICBj
b25zdCBNb3ZlVG8mIG1vdmVUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX21vdmVUb0RhdGE7
IH0KKyAgICAgICAgY29uc3QgTGluZVRvJiBsaW5lVG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEu
bV9saW5lVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IEFyY1RvJiBhcmNUbygpIGNvbnN0IHsgcmV0
dXJuIG1fZGF0YS5tX2FyY1RvRGF0YTsgfQorICAgICAgICBjb25zdCBRdWFkQ3VydmVUbyYgcXVh
ZEN1cnZlVG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9xdWFkQ3VydmVUb0RhdGE7IH0KKyAg
ICAgICAgY29uc3QgQmV6aWVyQ3VydmVUbyYgYmV6aWVyQ3VydmVUbygpIGNvbnN0IHsgcmV0dXJu
IG1fZGF0YS5tX2JlemllckN1cnZlVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IFBhdGhQb2ludCYg
bGFzdFBvaW50KCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSBudW1Qb2lu
dHMoKTsKKyAgICAgICAgICAgIHJldHVybiBuID4gMSA/IG1fZGF0YS5tX3BvaW50c1tuIC0gMV0g
OiBtX2RhdGEubV9wb2ludHNbMF07CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgUGF0aFBvaW50
JiBwb2ludEF0KGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm1fcG9pbnRzW2luZGV4
XTsgfQorICAgICAgICBpbnQgbnVtUG9pbnRzKCkgY29uc3Q7CisgICAgICAgIGludCBudW1Db250
cm9sUG9pbnRzKCkgY29uc3Q7CisgICAgICAgIHZvaWQgbW92ZShjb25zdCBGbG9hdFNpemUmIG9m
ZnNldCk7CisgICAgICAgIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4
JiB0KTsKKyAgICAgICAgUGF0aEVsZW1lbnRUeXBlIHR5cGUoKSBjb25zdDsKKyAgICAgICAgUGxh
Zm9ybVBhdGhFbGVtZW50VHlwZSBwbGF0Zm9ybVR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7
IH0KKyAgICAgICAgdm9pZCBpbmZsYXRlUmVjdFRvQ29udGFpbk1lKEZsb2F0UmVjdCYgciwgY29u
c3QgRmxvYXRQb2ludCYgbGFzdFBvaW50KSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAg
IFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgbV90eXBlOworICAgICAgICB1bmlvbiB7CisgICAgICAg
ICAgICBNb3ZlVG8gbV9tb3ZlVG9EYXRhOworICAgICAgICAgICAgTGluZVRvIG1fbGluZVRvRGF0
YTsKKyAgICAgICAgICAgIEFyY1RvIG1fYXJjVG9EYXRhOworICAgICAgICAgICAgUXVhZEN1cnZl
VG8gbV9xdWFkQ3VydmVUb0RhdGE7CisgICAgICAgICAgICBCZXppZXJDdXJ2ZVRvIG1fYmV6aWVy
Q3VydmVUb0RhdGE7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludHNbNF07CisgICAgICAg
IH0gbV9kYXRhOworICAgIH07CisKKyAgICB0eXBlZGVmIFZlY3RvcjxQbGF0Zm9ybVBhdGhFbGVt
ZW50PiBQbGF0Zm9ybVBhdGhFbGVtZW50czsKKworICAgIGNsYXNzIFBsYXRmb3JtUGF0aCB7Cisg
ICAgcHVibGljOgorICAgICAgICBQbGF0Zm9ybVBhdGgoKTsKKyAgICAgICAgY29uc3QgUGxhdGZv
cm1QYXRoRWxlbWVudHMmIGVsZW1lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50czsgfQor
ICAgICAgICB2b2lkIGFwcGVuZChjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBlKTsKKyAgICAg
ICAgdm9pZCBhcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoJiBwKTsKKyAgICAgICAgdm9pZCBjbGVh
cigpOworICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRzLmlz
RW1wdHkoKTsgfQorCisgICAgICAgIHZvaWQgc3Ryb2tlUGF0aChIREMsIGNvbnN0IFRyYW5zZm9y
bWF0aW9uTWF0cml4KiB0cikgY29uc3Q7CisgICAgICAgIHZvaWQgZmlsbFBhdGgoSERDLCBjb25z
dCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogdHIpIGNvbnN0OworICAgICAgICBGbG9hdFBvaW50IGxh
c3RQb2ludCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudHMuaXNFbXB0eSgpID8gRmxvYXRQb2lu
dCgwLCAwKSA6IG1fZWxlbWVudHMubGFzdCgpLmxhc3RQb2ludCgpOyB9CisKKyAgICAgICAgY29u
c3QgRmxvYXRSZWN0JiBib3VuZGluZ1JlY3QoKSBjb25zdCB7IHJldHVybiBtX2JvdW5kaW5nUmVj
dDsgfQorICAgICAgICBib29sIGNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5k
UnVsZSBydWxlKSBjb25zdDsKKyAgICAgICAgdm9pZCB0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXpl
JiBzaXplKTsKKyAgICAgICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRy
aXgmIHQpOworCisgICAgICAgIHZvaWQgbW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICAg
ICAgdm9pZCBhZGRMaW5lVG8oY29uc3QgRmxvYXRQb2ludCYpOworICAgICAgICB2b2lkIGFkZFF1
YWRDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludCwgY29uc3QgRmxvYXRQb2lu
dCYgcG9pbnQpOworICAgICAgICB2b2lkIGFkZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2lu
dCYgY29udHJvbFBvaW50MSwgY29uc3QgRmxvYXRQb2ludCYgY29udHJvbFBvaW50MiwgY29uc3Qg
RmxvYXRQb2ludCYpOworICAgICAgICB2b2lkIGFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmLCBj
b25zdCBGbG9hdFBvaW50JiwgZmxvYXQgcmFkaXVzKTsKKyAgICAgICAgdm9pZCBjbG9zZVN1YnBh
dGgoKTsKKyAgICAgICAgdm9pZCBhZGRFbGxpcHNlKGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0
IGEsIGZsb2F0IGIsIGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9ja3dpc2UpOwor
ICAgICAgICB2b2lkIGFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKTsKKyAgICAgICAgdm9pZCBh
ZGRFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYgcik7CisgICAgICAgIFN0cmluZyBkZWJ1Z1N0cmlu
ZygpIGNvbnN0OworICAgICAgICB2b2lkIGFwcGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVyRnVu
Y3Rpb24gZnVuY3Rpb24pIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBlbnN1
cmVTdWJwYXRoKCk7CisgICAgICAgIHZvaWQgYWRkVG9TdWJwYXRoKGNvbnN0IFBsYXRmb3JtUGF0
aEVsZW1lbnQmIGUpOworCisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnRzIG1fZWxlbWVudHM7
CisgICAgICAgIEZsb2F0UmVjdCBtX2JvdW5kaW5nUmVjdDsKKyAgICAgICAgVmVjdG9yPFBhdGhQ
b2x5Z29uPiBtX3N1YnBhdGhzOworICAgICAgICBQYXRoUG9pbnQgbV9jdXJyZW50UG9pbnQ7Cisg
ICAgICAgIGJvb2wgbV9wZW5MaWZ0ZWQ7CisgICAgfTsKKworfQorCisjZW5kaWYgLy8gUGxhdGZv
cm1QYXRoV2luY2VfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9TaGFyZWRCaXRtYXAuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFy
ZWRCaXRtYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjc2NTUK
LS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJl
ZEJpdG1hcC5jcHAKQEAgLTAsMCArMSw2OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDct
MjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwor
ICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNoYXJlZEJpdG1hcC5oIgorCisjaW5jbHVk
ZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NUeXBlcy5oIgorI2luY2x1
ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNp
bmNsdWRlIDx3dGYvT3duUHRyLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworI2lmbmRlZiBOREVCVUcKK3N0cnVjdCBTaGFyZWRCaXRtYXBMZWFrQ291
bnRlciB7CisgICAgflNoYXJlZEJpdG1hcExlYWtDb3VudGVyKCk7Cit9Oworc3RhdGljIFNoYXJl
ZEJpdG1hcExlYWtDb3VudGVyIHNoYXJlZEJpdG1hcExlYWtDb3VudGVyOworI2VuZGlmCisKK3R5
cGVkZWYgSGFzaFNldDxTaGFyZWRCaXRtYXAqPiBCaXRtYXBNYXA7CitCaXRtYXBNYXAgZ19iaXRt
YXBNYXA7CisKKyNpZm5kZWYgTkRFQlVHCitTaGFyZWRCaXRtYXBMZWFrQ291bnRlcjo6flNoYXJl
ZEJpdG1hcExlYWtDb3VudGVyKCkKK3sKKyAgICBpZiAoIWdfYml0bWFwTWFwLmlzRW1wdHkoKSkK
KyAgICAgICAgcHJpbnRmKCJcbkxFQUs6ICV1ICVzXG5cbiIsIGdfYml0bWFwTWFwLnNpemUoKSwg
IlNoYXJlZEJpdG1hcCBvYmplY3RzIik7Cit9CisjZW5kaWYKKworc3RhdGljIFNoYXJlZEJpdG1h
cDo6RHJhd1BhdHRlcm5GdW5jIGdfZHJhd1BhdHRlcm4gPSAwOworc3RhdGljIFNoYXJlZEJpdG1h
cDo6RHJhd0ltYWdlRnVuYyBnX2RyYXdJbWFnZSA9IDA7CisKK3N0YXRpYyBpbmxpbmUgaW50IHN0
YWJsZVJvdW5kKGRvdWJsZSBkKQoreworICAgIGlmIChkID4gMCkKKyAgICAgICAgcmV0dXJuIHN0
YXRpY19jYXN0PGludD4oZCArIDAuNSk7CisKKyAgICBpbnQgaSA9IHN0YXRpY19jYXN0PGludD4o
ZCk7CisgICAgcmV0dXJuIGkgLSBkID4gMC41ID8gaSAtIDEgOiBpOworfQorCitTaGFyZWRCaXRt
YXA6OkRyYXdJbWFnZUZ1bmMgU2hhcmVkQml0bWFwOjpzZXREcmF3SW1hZ2VGdW5jKERyYXdJbWFn
ZUZ1bmMgZnVuYykKK3sKKyAgICBEcmF3SW1hZ2VGdW5jIG9sZEZ1bmMgPSBnX2RyYXdJbWFnZTsK
KyAgICBnX2RyYXdJbWFnZSA9IGZ1bmM7CisgICAgcmV0dXJuIG9sZEZ1bmM7Cit9CisKK1NoYXJl
ZEJpdG1hcDo6RHJhd1BhdHRlcm5GdW5jIFNoYXJlZEJpdG1hcDo6c2V0RHJhd1BhdHRlcm5GdW5j
KERyYXdQYXR0ZXJuRnVuYyBmdW5jKQoreworICAgIERyYXdQYXR0ZXJuRnVuYyBvbGRGdW5jID0g
Z19kcmF3UGF0dGVybjsKKyAgICBnX2RyYXdQYXR0ZXJuID0gZnVuYzsKKyAgICByZXR1cm4gb2xk
RnVuYzsKK30KKworUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y3JlYXRl
SW5zdGFuY2UoYm9vbCBpczE2Yml0LCBpbnQgdywgaW50IGgsIGJvb2wgaW5pdFBpeGVscykKK3sK
KyAgICBTaGFyZWRCaXRtYXAqIHJ0biA9IG5ldyBTaGFyZWRCaXRtYXAoaXMxNmJpdCwgdywgaCwg
aW5pdFBpeGVscyk7CisgICAgaWYgKHJ0biAmJiAhcnRuLT5ieXRlcygpKSB7CisgICAgICAgIGRl
bGV0ZSBydG47CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gYWRvcHRSZWYo
cnRuKTsKK30KKworU2hhcmVkQml0bWFwOjpTaGFyZWRCaXRtYXAoY29uc3QgQml0bWFwSW5mbyYg
Ym1wSW5mbywgSEJJVE1BUCBoYm1wLCB2b2lkKiBwaXhlbHMpCis6IG1fYm1wSW5mbyhibXBJbmZv
KQorLCBtX2xvY2tlZChmYWxzZSkKKywgbV91c2VzVHJhbnNwYXJlbnRDb2xvcihmYWxzZSkKKywg
bV90cmFuc3BhcmVudENvbG9yKFJHQigwLCAwLCAwKSkKKywgbV9waXhlbHMocGl4ZWxzKQorLCBt
X2hiaXRtYXAoaGJtcCkKKywgbV9oYXNBbHBoYShmYWxzZSkKKywgbV92YWxpZEhlaWdodChibXBJ
bmZvLmhlaWdodCgpKQoreworICAgIGdfYml0bWFwTWFwLmFkZCh0aGlzKTsKK30KKworU2hhcmVk
Qml0bWFwOjpTaGFyZWRCaXRtYXAoYm9vbCBfaXMxNmJpdCwgaW50IHcsIGludCBoLCBib29sIGlu
aXRQaXhlbHMpCis6IG1fYm1wSW5mbyhfaXMxNmJpdCwgdywgaCkKKywgbV9yZWZlcmVuY2UoMSkK
KywgbV9sb2NrZWQoZmFsc2UpCissIG1fdXNlc1RyYW5zcGFyZW50Q29sb3IoZmFsc2UpCissIG1f
dHJhbnNwYXJlbnRDb2xvcihSR0IoMCwgMCwgMCkpCissIG1fcGl4ZWxzKDApCissIG1faGFzQWxw
aGEoZmFsc2UpCissIG1fdmFsaWRIZWlnaHQoYWJzKGgpKQorLCBtX2hiaXRtYXAoMCkKK3sKKyAg
ICBnX2JpdG1hcE1hcC5hZGQodGhpcyk7CisKKyAgICB1bnNpZ25lZCBidWZmZXJTaXplID0gbV9i
bXBJbmZvLm51bVBpeGVscygpOworICAgIGlmIChfaXMxNmJpdCkKKyAgICAgICAgYnVmZmVyU2l6
ZSAvPSAyOworCisgICAgbV9waXhlbHMgPSBuZXcgdW5zaWduZWRbYnVmZmVyU2l6ZV07CisKKyAg
ICBpZiAoaW5pdFBpeGVscykKKyAgICAgICAgcmVzZXRQaXhlbHMoKTsKK30KK1NoYXJlZEJpdG1h
cDo6flNoYXJlZEJpdG1hcCgpCit7CisgICAgZ19iaXRtYXBNYXAucmVtb3ZlKHRoaXMpOworICAg
IGlmIChtX2hiaXRtYXApCisgICAgICAgIERlbGV0ZU9iamVjdChtX2hiaXRtYXApOworICAgIGVs
c2UKKyAgICAgICAgZGVsZXRlW10gbV9waXhlbHM7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpy
ZXNldFBpeGVscyhib29sIGJsYWNrKQoreworICAgIGlmIChtX3BpeGVscykgeworICAgICAgICB1
bnNpZ25lZCBidWZmZXJTaXplID0gbV9ibXBJbmZvLm51bVBpeGVscygpOworICAgICAgICBpZiAo
YmxhY2spCisgICAgICAgICAgICBtZW1zZXQobV9waXhlbHMsIDAsIGJ1ZmZlclNpemUgKiAoaXMx
NmJpdCgpID8gMiA6IDQpKTsKKyAgICAgICAgZWxzZSBpZiAoaXMxNmJpdCgpKSB7CisgICAgICAg
ICAgICAvLyBGaWxsIGl0IHdpdGggd2hpdGUgY29sb3IKKyNpZiBJTUFHRV9OT19BTFBIQV9VU0Vf
UkdCNTU1CisgICAgICAgICAgICB3bWVtc2V0KCh3Y2hhcl90KiltX3BpeGVscywgMHg3RkZGLCBi
dWZmZXJTaXplKTsKKyNlbHNlCisgICAgICAgICAgICB3bWVtc2V0KCh3Y2hhcl90KiltX3BpeGVs
cywgMHhGRkZGLCBidWZmZXJTaXplKTsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgLy8gTWFrZSBpdCB3aGl0ZSBidXQgdHJhbnNwYXJlbnQKKyAgICAgICAgICAgIHVuc2ln
bmVkKiBwaXhlbCA9ICh1bnNpZ25lZCopbV9waXhlbHM7CisgICAgICAgICAgICBjb25zdCB1bnNp
Z25lZCogY29uc3QgYnVmZmVyRW5kID0gcGl4ZWwgKyBidWZmZXJTaXplOworICAgICAgICAgICAg
d2hpbGUgKHBpeGVsIDwgYnVmZmVyRW5kKQorICAgICAgICAgICAgICAgICpwaXhlbCsrID0gMHgw
MEZGRkZGRjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBz
aG9ydCBjb252ZXJ0MzJUbzE2KHVuc2lnbmVkIHBpeGVsKQoreworI2lmIElNQUdFX05PX0FMUEhB
X1VTRV9SR0I1NTUKKyAgICB1bnNpZ25lZCBzaG9ydCByID0gdW5zaWduZWQgc2hvcnQoKHBpeGVs
ICYgMHgwMEY4MDAwMCkgPj4gOSk7CisgICAgdW5zaWduZWQgc2hvcnQgZyA9IHVuc2lnbmVkIHNo
b3J0KChwaXhlbCAmIDB4MDAwMEY4MDApID4+IDYpOworICAgIHVuc2lnbmVkIHNob3J0IGIgPSB1
bnNpZ25lZCBzaG9ydCgocGl4ZWwgJiAweDAwMDAwMEY4KSA+PiAzKTsKKyNlbHNlIC8vIFJHQjU2
NQorICAgIHVuc2lnbmVkIHNob3J0IHIgPSB1bnNpZ25lZCBzaG9ydCgocGl4ZWwgJiAweDAwRjgw
MDAwKSA+PiA4KTsKKyAgICB1bnNpZ25lZCBzaG9ydCBnID0gdW5zaWduZWQgc2hvcnQoKHBpeGVs
ICYgMHgwMDAwRkMwMCkgPj4gNSk7CisgICAgdW5zaWduZWQgc2hvcnQgYiA9IHVuc2lnbmVkIHNo
b3J0KChwaXhlbCAmIDB4MDAwMDAwRjgpID4+IDMpOworI2VuZGlmCisgICAgcmV0dXJuIHIgfCBn
IHwgYjsKK30KKworYm9vbCBTaGFyZWRCaXRtYXA6OnRvMTZiaXQoKQoreworICAgIGlmIChtX2xv
Y2tlZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChpczE2Yml0KCkpCisgICAgICAg
IHJldHVybiB0cnVlOworCisgICAgQml0bWFwSW5mbyBuZXdCbXBJbmZvKHRydWUsIG1fYm1wSW5m
by53aWR0aCgpLCBtX2JtcEluZm8uaGVpZ2h0KCkpOworCisgICAgTWVtb3J5QWxsb2NhdGlvbkNh
bkZhaWwgY2FuRmFpbDsKKyAgICBpbnQgd2lkdGggPSBuZXdCbXBJbmZvLndpZHRoKCk7CisgICAg
aW50IHBhZGRlZFdpZHRoID0gbmV3Qm1wSW5mby5wYWRkZWRXaWR0aCgpOworICAgIGludCBidWZm
ZXJTaXplID0gcGFkZGVkV2lkdGggKiBuZXdCbXBJbmZvLmhlaWdodCgpOworICAgIHZvaWQqIG5l
d1BpeGVscyA9IG5ldyB1bnNpZ25lZFtidWZmZXJTaXplIC8gMl07CisKKyAgICBpZiAoIW5ld1Bp
eGVscykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgc2hvcnQqIHAxNiA9
ICh1bnNpZ25lZCBzaG9ydCopbmV3UGl4ZWxzOworICAgIGNvbnN0IHVuc2lnbmVkKiBwMzIgPSAo
Y29uc3QgdW5zaWduZWQqKW1fcGl4ZWxzOworCisgICAgY29uc3QgYm9vbCBza2lwcyA9IHBhZGRl
ZFdpZHRoICE9IHdpZHRoOworCisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIGNvbnN0IHAxNmVu
ZCA9IHAxNiArIGJ1ZmZlclNpemU7CisgICAgd2hpbGUgKHAxNiA8IHAxNmVuZCkgeworICAgICAg
ICBmb3IgKHVuc2lnbmVkIHNob3J0KiBwMTZsaW5lRW5kID0gcDE2ICsgd2lkdGg7IHAxNiA8IHAx
NmxpbmVFbmQ7ICkKKyAgICAgICAgICAgICpwMTYrKyA9IGNvbnZlcnQzMlRvMTYoKnAzMisrKTsK
KworICAgICAgICBpZiAoc2tpcHMpCisgICAgICAgICAgICAqcDE2KysgPSAwOworICAgIH0KKwor
CisgICAgaWYgKG1faGJpdG1hcCkgeworICAgICAgICBEZWxldGVPYmplY3QobV9oYml0bWFwKTsK
KyAgICAgICAgbV9oYml0bWFwID0gMDsKKyAgICB9IGVsc2UKKyAgICAgICAgZGVsZXRlW10gbV9w
aXhlbHM7CisKKyAgICBtX3BpeGVscyA9IG5ld1BpeGVsczsKKyAgICBtX2JtcEluZm8gPSBuZXdC
bXBJbmZvOworCisgICAgc2V0SGFzQWxwaGEoZmFsc2UpOworICAgIHJldHVybiB0cnVlOworfQor
Citib29sIFNoYXJlZEJpdG1hcDo6ZnJlZU1lbW9yeSgpCit7CisgICAgaWYgKCFtX2xvY2tlZCkg
eworICAgICAgICBpZiAobV9oYml0bWFwKSB7CisgICAgICAgICAgICBEZWxldGVPYmplY3QobV9o
Yml0bWFwKTsKKyAgICAgICAgICAgIG1faGJpdG1hcCA9IDA7CisgICAgICAgICAgICBtX3BpeGVs
cyA9IDA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChtX3Bp
eGVscykgeworICAgICAgICAgICAgZGVsZXRlW10gbV9waXhlbHM7CisgICAgICAgICAgICBtX3Bp
eGVscyA9IDA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK0hCSVRNQVAgU2hhcmVkQml0bWFwOjpjcmVhdGVIYW5kbGUo
dm9pZCoqIHBpeGVscywgQml0bWFwSW5mbyogYm1wSW5mbywgaW50IGgsIGJvb2wgdXNlMTZiaXQp
IGNvbnN0Cit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBN
ZW1vcnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOworCisgICAgaWYgKGggPT0gLTEpCisgICAg
ICAgIGggPSBoZWlnaHQoKTsKKyAgICAqYm1wSW5mbyA9IEJpdG1hcEluZm8odXNlMTZiaXQgfHwg
aXMxNmJpdCgpLCB3aWR0aCgpLCBoKTsKKworICAgIEhCSVRNQVAgaGJtcCA9IE1lbW9yeU1hbmFn
ZXI6OmNyZWF0ZURJQlNlY3Rpb24oYm1wSW5mbywgcGl4ZWxzKTsKKworICAgIGlmICghaGJtcCkK
KyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBPd25QdHI8SERDPiBibXBEQyhDcmVhdGVDb21wYXRp
YmxlREMoMCkpOworICAgIEhHRElPQkogaE9sZEJtcCA9IFNlbGVjdE9iamVjdChibXBEQy5nZXQo
KSwgaGJtcCk7CisKKyAgICBTdHJldGNoRElCaXRzKGJtcERDLmdldCgpLCAwLCAwLCB3aWR0aCgp
LCBoLCAwLCAwLCB3aWR0aCgpLCBoCisgICAgICAgICwgbV9waXhlbHMsICZtX2JtcEluZm8sIERJ
Ql9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKKworICAgIFNlbGVjdE9iamVjdChibXBEQy5nZXQoKSwg
aE9sZEJtcCk7CisKKyAgICByZXR1cm4gaGJtcDsKK30KKworYm9vbCBTaGFyZWRCaXRtYXA6OmVu
c3VyZUhhbmRsZSgpCit7CisgICAgaWYgKG1faGJpdG1hcCkKKyAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAo
bV9sb2NrZWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEJpdG1hcEluZm8gYm1wSW5m
bzsKKyAgICB2b2lkKiBwaXhlbHM7CisgICAgbV9oYml0bWFwID0gY3JlYXRlSGFuZGxlKCZwaXhl
bHMsICZibXBJbmZvLCAtMSwgIWhhc0FscGhhKCkpOworCisgICAgaWYgKCFtX2hiaXRtYXApCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworICAgIG1fcGl4
ZWxzID0gcGl4ZWxzOworICAgIG1fYm1wSW5mbyA9IGJtcEluZm87CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKwordm9pZCBTaGFyZWRCaXRtYXA6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBj
b25zdCBJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVP
cGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1
cm47CisgICAgY3R4dC0+ZHJhd0JpdG1hcCh0aGlzLCBkc3RSZWN0LCBzcmNSZWN0LCBjb21wb3Np
dGVPcCk7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3KEhEQyBoZGMsIGNvbnN0IEludFJl
Y3QmIGRzdFJlY3QsIGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNv
bXBvc2l0ZU9wKQoreworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmIChkc3RSZWN0LmlzRW1wdHkoKSB8fCBzcmNSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKGdfZHJhd0ltYWdlICYmIGdfZHJhd0ltYWdlKHRoaXMsIGhkYywgZHN0
UmVjdCwgc3JjUmVjdCwgY29tcG9zaXRlT3ApKQorICAgICAgICByZXR1cm47CisKKyAgICBIQklU
TUFQIGhiaXRtYXAgPSAwOworICAgIGJvb2wgdXNpbmdIYW5kbGUgPSBjb21wb3NpdGVPcCA9PSBD
b21wb3NpdGVTb3VyY2VPdmVyICYmICgKKyNpZiAhZGVmaW5lZChOT19BTFBIQUJMRU5EKQorICAg
ICAgICBoYXNBbHBoYSgpIHx8CisjZW5kaWYKKyAgICAgICAgdXNlc1RyYW5zcGFyZW50Q29sb3Io
KSk7CisKKyAgICBpZiAodXNpbmdIYW5kbGUpIHsKKyAgICAgICAgaWYgKGVuc3VyZUhhbmRsZSgp
KQorICAgICAgICAgICAgaGJpdG1hcCA9IG1faGJpdG1hcDsKKyAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICB2b2lkKiBwaXhlbHM7CisgICAgICAgICAgICBCaXRtYXBJbmZvIGJtcEluZm87Cisg
ICAgICAgICAgICBoYml0bWFwID0gY3JlYXRlSGFuZGxlKCZwaXhlbHMsICZibXBJbmZvLCAtMSwg
dXNlc1RyYW5zcGFyZW50Q29sb3IoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFoYml0
bWFwKSB7CisgICAgICAgIC8vIEZJWE1FOiBoYW5kbGUgb3RoZXIgY29tcG9zaXRlIG9wZXJhdGlv
biB0eXBlcz8KKyAgICAgICAgRFdPUkQgcm9wID0gY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlQ29w
eSA/IFNSQ0NPUFkKKyAgICAgICAgICAgIDogY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlWE9SID8g
UEFUSU5WRVJUCisgICAgICAgICAgICA6IGNvbXBvc2l0ZU9wID09IENvbXBvc2l0ZUNsZWFyID8g
V0hJVEVORVNTCisgICAgICAgICAgICA6IFNSQ0NPUFk7CisKKyAgICAgICAgU3RyZXRjaERJQml0
cyhoZGMsIGRzdFJlY3QueCgpLCBkc3RSZWN0LnkoKSwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0
LmhlaWdodCgpCisgICAgICAgICAgICAsIHNyY1JlY3QueCgpLCBzcmNSZWN0LnkoKSwgc3JjUmVj
dC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpLCBtX3BpeGVscywgJm1fYm1wSW5mbywgRElCX1JH
Ql9DT0xPUlMsIHJvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgT3duUHRyPEhEQz4gaG1lbWRj
KENyZWF0ZUNvbXBhdGlibGVEQyhoZGMpKTsKKyAgICAgICAgSEdESU9CSiBoT2xkQm1wID0gU2Vs
ZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgaGJpdG1hcCk7CisKKyNpZiAhZGVmaW5lZChOT19BTFBI
QUJMRU5EKQorICAgICAgICBpZiAoIXVzZXNUcmFuc3BhcmVudENvbG9yKCkpIHsKKyAgICAgICAg
ICAgIHN0YXRpYyBjb25zdCBCTEVOREZVTkNUSU9OIGJsZW5kID0geyBBQ19TUkNfT1ZFUiwgMCwg
MjU1LCBBQ19TUkNfQUxQSEEgfTsKKyAgICAgICAgICAgIEFscGhhQmxlbmQoaGRjLCBkc3RSZWN0
LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgaG1l
bWRjLmdldCgpCisgICAgICAgICAgICAgICAgLCBzcmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNy
Y1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWlnaHQoKSwgYmxlbmQpOworICAgICAgICB9IGVsc2UK
KyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc3BhcmVudEJsdChoZGMsIGRzdFJl
Y3QueCgpLCBkc3RSZWN0LnkoKSwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpLCBo
bWVtZGMuZ2V0KCkKKyAgICAgICAgICAgICAgICAsIHNyY1JlY3QueCgpLCBzcmNSZWN0LnkoKSwg
c3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpLCB0cmFuc3BhcmVudENvbG9yKCkpOwor
ICAgICAgICB9CisKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgaE9sZEJtcCk7
CisgICAgICAgIGlmIChoYml0bWFwICE9IG1faGJpdG1hcCkKKyAgICAgICAgICAgIERlbGV0ZU9i
amVjdChoYml0bWFwKTsKKyAgICB9Cit9CisKKworSEJJVE1BUCBTaGFyZWRCaXRtYXA6OmNsaXBC
aXRtYXAoY29uc3QgSW50UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJvb2wgdXNlQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRt
YXBJbmZvJiBibXBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCom
IHBpeGVscykKK3sKKyAgICBpZiAoIWJ5dGVzKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAg
aW50IG9sZFdpZHRoID0gd2lkdGgoKTsKKyAgICBpbnQgb2xkSGVpZ2h0ID0gaGVpZ2h0KCk7Cisg
ICAgaW50IGNvcHlXaWR0aCA9IHN0ZDo6bWluPGludD4ocmVjdC53aWR0aCgpLCBvbGRXaWR0aCAt
IHJlY3QueCgpKTsKKyAgICBpbnQgY29weUhlaWdodCA9IHN0ZDo6bWluPGludD4ocmVjdC5oZWln
aHQoKSwgb2xkSGVpZ2h0IC0gcmVjdC55KCkpOworICAgIGlmICghY29weVdpZHRoIHx8ICFjb3B5
SGVpZ2h0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGJtcEluZm8gPSBCaXRtYXBJbmZvKCEo
dXNlQWxwaGEgJiYgaXMzMmJpdCgpKSwgY29weVdpZHRoLCBjb3B5SGVpZ2h0KTsKKyAgICBIQklU
TUFQIG5ld0JtcCA9IE1lbW9yeU1hbmFnZXI6OmNyZWF0ZURJQlNlY3Rpb24oJmJtcEluZm8sICZw
aXhlbHMpOworCisgICAgaWYgKG5ld0JtcCkgeworICAgICAgICBPd25QdHI8SERDPiBkY05ldyg6
OkNyZWF0ZUNvbXBhdGlibGVEQygwKSk7CisgICAgICAgIEhHRElPQkogdG1wTmV3ID0gOjpTZWxl
Y3RPYmplY3QoZGNOZXcuZ2V0KCksIG5ld0JtcCk7CisKKyAgICAgICAgU3RyZXRjaERJQml0cyhk
Y05ldy5nZXQoKSwgMCwgMCwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LCByZWN0LngoKSwgcmVjdC55
KCksIGNvcHlXaWR0aCwgY29weUhlaWdodAorICAgICAgICAgICAgLCBieXRlcygpLCAmYml0bWFw
SW5mbygpLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAgICAgICAgU2VsZWN0T2JqZWN0
KGRjTmV3LmdldCgpLCB0bXBOZXcpOworICAgIH0KKworICAgIHJldHVybiBuZXdCbXA7Cit9CisK
KworUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y2xpcEJpdG1hcChjb25z
dCBJbnRSZWN0JiByZWN0LCBib29sIHVzZUFscGhhKQoreworICAgIGludCBvbGRXaWR0aCA9IHdp
ZHRoKCk7CisgICAgaW50IG9sZEhlaWdodCA9IGhlaWdodCgpOworICAgIGludCBjb3B5V2lkdGgg
PSBzdGQ6Om1pbjxpbnQ+KHJlY3Qud2lkdGgoKSwgb2xkV2lkdGggLSByZWN0LngoKSk7CisgICAg
aW50IGNvcHlIZWlnaHQgPSBzdGQ6Om1pbjxpbnQ+KHJlY3QuaGVpZ2h0KCksIG9sZEhlaWdodCAt
IHJlY3QueSgpKTsKKyAgICBpZiAoIWNvcHlXaWR0aCB8fCAhY29weUhlaWdodCkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBTaGFyZWRCaXRtYXAqIG5ld0JtcCA9IG5ldyBTaGFyZWRCaXRtYXAo
ISh1c2VBbHBoYSAmJiBpczMyYml0KCkpLCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQsIGZhbHNlKTsK
KworICAgIGlmICghbmV3Qm1wKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghbmV3Qm1w
LT5ieXRlcygpKSB7CisgICAgICAgIGRlbGV0ZSBuZXdCbXA7CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0KKworICAgIERDSG9sZGVyIGRjTmV3KG5ld0JtcCk7CisKKyAgICBTdHJldGNoRElCaXRz
KGRjTmV3LmdldCgpLCAwLCAwLCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQsIHJlY3QueCgpLCByZWN0
LnkoKSwgY29weVdpZHRoLCBjb3B5SGVpZ2h0CisgICAgICAgICwgYnl0ZXMoKSwgJmJpdG1hcElu
Zm8oKSwgRElCX1JHQl9DT0xPUlMsIFNSQ0NPUFkpOworCisgICAgcmV0dXJuIGFkb3B0UmVmKG5l
d0JtcCk7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdQYXR0ZXJuU2ltcGxlKEhEQyBoZGMsIGNvbnN0
IFJFQ1QmIGRlc3RSZWN0LCBIQklUTUFQIGhibXAsIGNvbnN0IFBPSU5UJiBwaGFzZSkKK3sKKyAg
ICBIQlJVU0ggaEJydXNoID0gQ3JlYXRlUGF0dGVybkJydXNoKGhibXApOworICAgIGlmIChoQnJ1
c2gpIHsKKyAgICAgICAgUE9JTlQgb2xkT3JnOworICAgICAgICBTZXRCcnVzaE9yZ0V4KGhkYywg
ZGVzdFJlY3QubGVmdCAtIHBoYXNlLngsIGRlc3RSZWN0LnRvcCAtIHBoYXNlLnksICZvbGRPcmcp
OworICAgICAgICBGaWxsUmVjdChoZGMsICZkZXN0UmVjdCwgaEJydXNoKTsKKyAgICAgICAgRGVs
ZXRlT2JqZWN0KGhCcnVzaCk7CisgICAgICAgIFNldEJydXNoT3JnRXgoaGRjLCBvbGRPcmcueCwg
b2xkT3JnLnksIDApOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZHJhd1BhdHRlcm5TaW1wbGUo
SERDIGhkYywgY29uc3QgUkVDVCYgZGVzdFJlY3QsIGNvbnN0IFNoYXJlZEJpdG1hcCogYm1wLCBj
b25zdCBTSVpFJiBibXBTaXplLCBjb25zdCBQT0lOVCYgcGhhc2UpCit7CisgICAgaW50IGRzdFkg
PSBkZXN0UmVjdC50b3A7CisgICAgZm9yIChpbnQgc291cmNlWSA9IHBoYXNlLnk7IGRzdFkgPCBk
ZXN0UmVjdC5ib3R0b207ICkgeworICAgICAgICBpbnQgc291cmNlSCA9IHN0ZDo6bWluPGludD4o
Ym1wU2l6ZS5jeSAtIHNvdXJjZVksIGRlc3RSZWN0LmJvdHRvbSAtIGRzdFkpOworICAgICAgICBp
bnQgZHN0WCA9IGRlc3RSZWN0LmxlZnQ7CisgICAgICAgIGZvciAoaW50IHNvdXJjZVggPSBwaGFz
ZS54OyBkc3RYIDwgZGVzdFJlY3QucmlnaHQ7ICkgeworICAgICAgICAgICAgaW50IHNvdXJjZVcg
PSBzdGQ6Om1pbjxpbnQ+KGJtcFNpemUuY3ggLSBzb3VyY2VYLCBkZXN0UmVjdC5yaWdodCAtIGRz
dFgpOworCisgICAgICAgICAgICBTdHJldGNoRElCaXRzKGhkYywgZHN0WCwgZHN0WSwgc291cmNl
Vywgc291cmNlSCwgc291cmNlWCwgc291cmNlWSwgc291cmNlVywgc291cmNlSAorICAgICAgICAg
ICAgICAgICwgYm1wLT5ieXRlcygpLCAmYm1wLT5iaXRtYXBJbmZvKCksIERJQl9SR0JfQ09MT1JT
LCBTUkNDT1BZKTsKKworICAgICAgICAgICAgZHN0WCArPSBzb3VyY2VXOworICAgICAgICAgICAg
c291cmNlWCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBkc3RZICs9IHNvdXJjZUg7CisgICAg
ICAgIHNvdXJjZVkgPSAwOworICAgIH0KK30KKwordm9pZCBub3JtYWxpemVQaGFzZShMT05HJiBw
aGFzZSwgaW50IGxpbWl0KQoreworICAgIGlmICghcGhhc2UpCisgICAgICAgIHJldHVybjsKKyAg
ICBpZiAobGltaXQgPCAyKSB7CisgICAgICAgIHBoYXNlID0gMDsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICBpZiAobGltaXQgPT0gMikgeworICAgICAgICBwaGFzZSA9IHBoYXNlICYgMTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocGhhc2UgPCAwKSB7CisgICAgICAgIHBo
YXNlID0gLXBoYXNlOworICAgICAgICBpZiAocGhhc2UgPiBsaW1pdCkKKyAgICAgICAgICAgIHBo
YXNlID0gKExPTkcpKCh1bnNpZ25lZClwaGFzZSAlICh1bnNpZ25lZClsaW1pdCk7CisgICAgICAg
IGlmIChwaGFzZSkKKyAgICAgICAgICAgIHBoYXNlID0gbGltaXQgLSBwaGFzZTsKKyAgICB9IGVs
c2UgeworICAgICAgICBpZiAocGhhc2UgPCBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgcGhhc2UgPSAoTE9ORykoKHVuc2lnbmVkKXBoYXNlICUgKHVuc2lnbmVkKWxpbWl0KTsK
KyAgICB9Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRl
eHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVj
dCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKQoreworICAgIGlmICgh
bV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKyAgICBjdHh0LT5kcmF3Qml0bWFwUGF0dGVybih0
aGlzLCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgb3AsIGRlc3RSZWN0LCBv
cmlnU291cmNlU2l6ZSk7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3UGF0dGVybihIREMg
aGRjLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9hdFJl
Y3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNm
b3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENv
bXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBJbnRT
aXplJiBvcmlnU291cmNlU2l6ZSkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAoZ19kcmF3UGF0dGVybikgeworICAgICAgICBnX2RyYXdQYXR0ZXJuKHRo
aXMsIGhkYywgdHJhbnNmb3JtLCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwg
b3AsIGRlc3RSZWN0LCBvcmlnU291cmNlU2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBpZiAodGlsZVJlY3RJbi53aWR0aCgpIDw9IDAgfHwgdGlsZVJlY3RJbi5oZWlnaHQoKSA8
PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBib29sIHVzZUFscGhhID0gb3AgPT0gQ29tcG9z
aXRlU291cmNlT3ZlciAmJiBoYXNBbHBoYSgpICYmIGlzMzJiaXQoKTsKKworICAgIGludCBibXBX
aWR0aCA9IHdpZHRoKCk7CisgICAgaW50IGJtcEhlaWdodCA9IGhlaWdodCgpOworCisgICAgRmxv
YXRSZWN0IHRpbGVSZWN0KHRpbGVSZWN0SW4pOworICAgIGlmIChibXBXaWR0aCAhPSBvcmlnU291
cmNlU2l6ZS53aWR0aCgpKSB7CisgICAgICAgIGRvdWJsZSByYXRlID0gKGRvdWJsZSlibXBXaWR0
aCAvIG9yaWdTb3VyY2VTaXplLndpZHRoKCk7CisgICAgICAgIGRvdWJsZSB0ZW1wID0gdGlsZVJl
Y3Qud2lkdGgoKSAqIHJhdGU7CisgICAgICAgIHRpbGVSZWN0LnNldFgodGlsZVJlY3QueCgpICog
cmF0ZSk7CisgICAgICAgIHRpbGVSZWN0LnNldFdpZHRoKHRlbXApOworICAgICAgICB0ZW1wID0g
dGlsZVJlY3QuaGVpZ2h0KCkgKiByYXRlOworICAgICAgICB0aWxlUmVjdC5zZXRZKHRpbGVSZWN0
LnkoKSAqIHJhdGUpOworICAgICAgICB0aWxlUmVjdC5zZXRIZWlnaHQodGVtcCk7CisgICAgfQor
CisgICAgT3duUHRyPEhCSVRNQVA+IGNsaXBwZWRCbXA7CisKKyAgICBpZiAodGlsZVJlY3QueCgp
IHx8IHRpbGVSZWN0LnkoKSB8fCB0aWxlUmVjdC53aWR0aCgpICE9IGJtcFdpZHRoIHx8IHRpbGVS
ZWN0LmhlaWdodCgpICE9IGJtcEhlaWdodCkgeworICAgICAgICBCaXRtYXBJbmZvIHBhdHRlcm5C
bXBJbmZvOworICAgICAgICB2b2lkKiBwYXR0ZXJuUGl4ZWxzOworICAgICAgICBjbGlwcGVkQm1w
LnNldChjbGlwQml0bWFwKEludFJlY3QodGlsZVJlY3QpLCB1c2VBbHBoYSwgcGF0dGVybkJtcElu
Zm8sIHBhdHRlcm5QaXhlbHMpKTsKKyAgICAgICAgaWYgKCFjbGlwcGVkQm1wKQorICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgIGJtcFdpZHRoID0gdGlsZVJlY3Qud2lkdGgoKTsKKyAgICAg
ICAgYm1wSGVpZ2h0ID0gdGlsZVJlY3QuaGVpZ2h0KCk7CisgICAgfQorCisgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggdGYgPSB0cmFuc2Zvcm07CisgICAgdGYgKj0gcGF0dGVyblRyYW5zZm9ybTsK
KworICAgIEZsb2F0UmVjdCB0clJlY3QgPSB0Zi5tYXBSZWN0KGRlc3RSZWN0KTsKKworICAgIFJF
Q1QgY2xpcEJveDsKKyAgICBpbnQgY2xpcFR5cGUgPSBHZXRDbGlwQm94KGhkYywgJmNsaXBCb3gp
OworICAgIGlmIChjbGlwVHlwZSA9PSBTSU1QTEVSRUdJT04pCisgICAgICAgIHRyUmVjdC5pbnRl
cnNlY3QoRmxvYXRSZWN0KGNsaXBCb3gubGVmdCwgY2xpcEJveC50b3AsIGNsaXBCb3gucmlnaHQg
LSBjbGlwQm94LmxlZnQsIGNsaXBCb3guYm90dG9tIC0gY2xpcEJveC50b3ApKTsKKyAgICBlbHNl
IGlmIChjbGlwVHlwZSA9PSBDT01QTEVYUkVHSU9OKSB7CisgICAgICAgIE93blB0cjxIUkdOPiBj
bGlwUmduKENyZWF0ZVJlY3RSZ24oMCwgMCwgMCwgMCkpOworICAgICAgICBpZiAoR2V0Q2xpcFJn
bihoZGMsIGNsaXBSZ24uZ2V0KCkpID4gMCkgeworICAgICAgICAgICAgRFdPUkQgcmVnaW9uRGF0
YVNpemUgPSBHZXRSZWdpb25EYXRhKGNsaXBSZ24uZ2V0KCksIHNpemVvZihSR05EQVRBKSwgMCk7
CisgICAgICAgICAgICBpZiAocmVnaW9uRGF0YVNpemUpIHsKKyAgICAgICAgICAgICAgICBSR05E
QVRBKiByZWdpb25EYXRhID0gbmV3IFJHTkRBVEFbcmVnaW9uRGF0YVNpemVdOworICAgICAgICAg
ICAgICAgIEdldFJlZ2lvbkRhdGEoY2xpcFJnbi5nZXQoKSwgcmVnaW9uRGF0YVNpemUsIHJlZ2lv
bkRhdGEpOworICAgICAgICAgICAgICAgIFJFQ1QqIHJlY3QgPSAoUkVDVCopcmVnaW9uRGF0YS0+
QnVmZmVyOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByZWdpb25E
YXRhLT5yZGgubkNvdW50OyArK2ksICsrcmVjdCkKKyAgICAgICAgICAgICAgICAgICAgdHJSZWN0
LmludGVyc2VjdChGbG9hdFJlY3QocmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5yaWdodCAt
IHJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcCkpOworICAgICAgICAgICAgICAg
IGRlbGV0ZVtdIHJlZ2lvbkRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBpZiAodHJSZWN0LndpZHRoKCkgPD0gMCB8fCB0clJlY3QuaGVpZ2h0KCkgPD0gMCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgdHJSZWN0LmluZmxhdGUoMSk7CisgICAgSW50UmVjdCB2aXNp
YmxlRHN0UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QodGYuaW52ZXJzZSgpLm1hcFJlY3QodHJSZWN0
KSk7CisgICAgdmlzaWJsZURzdFJlY3QuaW50ZXJzZWN0KEludFJlY3QoZGVzdFJlY3QpKTsKKwor
ICAgIGlmICh2aXNpYmxlRHN0UmVjdC53aWR0aCgpIDw9IDAgfHwgdmlzaWJsZURzdFJlY3QuaGVp
Z2h0KCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdHJSZWN0ID0gdGYubWFwUmVjdCh2
aXNpYmxlRHN0UmVjdCk7CisgICAgUkVDVCBkc3RSZWN0V2luID0KKyAgICB7CisgICAgICAgIHN0
YWJsZVJvdW5kKHRyUmVjdC54KCkpLAorICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QueSgpKSwK
KyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LnJpZ2h0KCkpLAorICAgICAgICBzdGFibGVSb3Vu
ZCh0clJlY3QuYm90dG9tKCkpLAorICAgIH07CisgICAgaWYgKGRzdFJlY3RXaW4ucmlnaHQgPD0g
ZHN0UmVjdFdpbi5sZWZ0IHx8IGRzdFJlY3RXaW4uYm90dG9tIDw9IGRzdFJlY3RXaW4udG9wKQor
ICAgICAgICByZXR1cm47CisKKyAgICBTSVpFIGJtcFNpemUgPSB7IGJtcFdpZHRoLCBibXBIZWln
aHQgfTsKKworICAgIC8vIFJlbGF0aXZlIHRvIGRlc3RpbmF0aW9uLCBpbiBiaXRtYXAgcGl4ZWxz
CisgICAgUE9JTlQgcGhhc2VXaW4gPSB7IHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LngoKSAt
IHBoYXNlLngoKSksIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LnkoKSAtIHBoYXNlLnkoKSkg
fTsKKyAgICBub3JtYWxpemVQaGFzZShwaGFzZVdpbi54LCBibXBTaXplLmN4KTsKKyAgICBub3Jt
YWxpemVQaGFzZShwaGFzZVdpbi55LCBibXBTaXplLmN5KTsKKworICAgIHsKKyAgICAgICAgUkVD
VCBzcmNSZWN0V2luID0KKyAgICAgICAgeworICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAs
CisgICAgICAgICAgICBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC5yaWdodCgpKSAtIHN0YWJs
ZVJvdW5kKHZpc2libGVEc3RSZWN0LngoKSksCisgICAgICAgICAgICBzdGFibGVSb3VuZCh2aXNp
YmxlRHN0UmVjdC5ib3R0b20oKSkgLSBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC55KCkpCisg
ICAgICAgIH07CisgICAgICAgIGlmIChzcmNSZWN0V2luLnJpZ2h0IDw9IDAgfHwgc3JjUmVjdFdp
bi5ib3R0b20gPD0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBCaXRtYXBJbmZv
IGJtcEluZm8oIXVzZUFscGhhLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSk7
CisgICAgICAgIHZvaWQqIHBpeGVsczsKKyAgICAgICAgT3duUHRyPEhCSVRNQVA+IGhibXBUZW1w
KE1lbW9yeU1hbmFnZXI6OmNyZWF0ZURJQlNlY3Rpb24oJmJtcEluZm8sICZwaXhlbHMpKTsKKwor
ICAgICAgICBpZiAoaGJtcFRlbXApIHsKKyAgICAgICAgICAgIE93blB0cjxIREM+IGhtZW1kYyhD
cmVhdGVDb21wYXRpYmxlREMoaGRjKSk7CisgICAgICAgICAgICBIR0RJT0JKIG9sZEJtcCA9IFNl
bGVjdE9iamVjdChobWVtZGMuZ2V0KCksIGhibXBUZW1wLmdldCgpKTsKKyAgICAgICAgICAgIGlm
IChjbGlwcGVkQm1wKQorICAgICAgICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5n
ZXQoKSwgc3JjUmVjdFdpbiwgY2xpcHBlZEJtcC5nZXQoKSwgcGhhc2VXaW4pOworICAgICAgICAg
ICAgZWxzZSBpZiAoKG9wICE9IENvbXBvc2l0ZVNvdXJjZU92ZXIgfHwgY2FuVXNlRElCaXRzKCkp
ICYmIHNyY1JlY3RXaW4ucmlnaHQgPD0gYm1wU2l6ZS5jeCAqIDIgJiYgc3JjUmVjdFdpbi5ib3R0
b20gPD0gYm1wU2l6ZS5jeSAqIDIpCisgICAgICAgICAgICAgICAgZHJhd1BhdHRlcm5TaW1wbGUo
aG1lbWRjLmdldCgpLCBzcmNSZWN0V2luLCB0aGlzLCBibXBTaXplLCBwaGFzZVdpbik7CisgICAg
ICAgICAgICBlbHNlIGlmIChlbnN1cmVIYW5kbGUoKSkKKyAgICAgICAgICAgICAgICBkcmF3UGF0
dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RXaW4sIGdldEhhbmRsZSgpLCBwaGFzZVdp
bik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB2b2lkKiBwaXhlbHM7Cisg
ICAgICAgICAgICAgICAgQml0bWFwSW5mbyBibXBJbmZvOworICAgICAgICAgICAgICAgIGlmIChI
QklUTUFQIGhibXAgPSBjcmVhdGVIYW5kbGUoJnBpeGVscywgJmJtcEluZm8sIC0xLCBmYWxzZSkp
IHsKKyAgICAgICAgICAgICAgICAgICAgZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBz
cmNSZWN0V2luLCBoYm1wLCBwaGFzZVdpbik7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZU9i
amVjdChoYm1wKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAg
ICBTZWxlY3RPYmplY3QoaG1lbWRjLmdldCgpLCBvbGRCbXApOworICAgICAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisjaWYgZGVmaW5l
ZChOT19BTFBIQUJMRU5EKQorICAgICAgICAgICAgaWYgKHVzZUFscGhhIHx8KG9wID09IENvbXBv
c2l0ZVNvdXJjZU92ZXIgJiYgdXNlc1RyYW5zcGFyZW50Q29sb3IoKSkpCisjZWxzZQorICAgICAg
ICAgICAgaWYgKHVzZUFscGhhKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IEJMRU5E
RlVOQ1RJT04gYmxlbmQgPSB7IEFDX1NSQ19PVkVSLCAwLCAyNTUsIEFDX1NSQ19BTFBIQSB9Owor
ICAgICAgICAgICAgICAgIEFscGhhQmxlbmQoaGRjLCBkc3RSZWN0V2luLmxlZnQsIGRzdFJlY3RX
aW4udG9wLCBkc3RSZWN0V2luLnJpZ2h0IC0gZHN0UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2luLmJv
dHRvbSAtIGRzdFJlY3RXaW4udG9wCisgICAgICAgICAgICAgICAgICAgICwgaG1lbWRjLmdldCgp
LCAwLCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSwgYmxlbmQpOworICAg
ICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVyICYmIHVzZXNUcmFu
c3BhcmVudENvbG9yKCkpCisjZW5kaWYKKyAgICAgICAgICAgICAgICBUcmFuc3BhcmVudEJsdCho
ZGMsIGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBk
c3RSZWN0V2luLmxlZnQKKyAgICAgICAgICAgICAgICAgICAgLCBkc3RSZWN0V2luLmJvdHRvbSAt
IGRzdFJlY3RXaW4udG9wLCBobWVtZGMuZ2V0KCksIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNy
Y1JlY3RXaW4uYm90dG9tLCB0cmFuc3BhcmVudENvbG9yKCkpOworICAgICAgICAgICAgZWxzZSB7
CisgICAgICAgICAgICAgICAgRFdPUkQgYm1wT3AgPSBvcCA9PSBDb21wb3NpdGVDb3B5ID8gU1JD
Q09QWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3AgPT0gQ29tcG9zaXRlU291cmNl
T3ZlciA/IFNSQ0NPUFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wID09IENvbXBv
c2l0ZVhPUiA/IFBBVElOVkVSVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3AgPT0g
Q29tcG9zaXRlQ2xlYXIgPyBXSElURU5FU1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6
IFNSQ0NPUFk7IC8vIEZJWEVNRTogb3RoZXIgdHlwZXM/CisKKyAgICAgICAgICAgICAgICBTdHJl
dGNoRElCaXRzKGhkYywgZHN0UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2luLnRvcCwgZHN0UmVjdFdp
bi5yaWdodCAtIGRzdFJlY3RXaW4ubGVmdAorICAgICAgICAgICAgICAgICAgICAsIGRzdFJlY3RX
aW4uYm90dG9tIC0gZHN0UmVjdFdpbi50b3AsIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1Jl
Y3RXaW4uYm90dG9tCisgICAgICAgICAgICAgICAgICAgICwgcGl4ZWxzLCAmYm1wSW5mbywgRElC
X1JHQl9DT0xPUlMsIGJtcE9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNlbGVjdE9i
amVjdChobWVtZGMuZ2V0KCksIG9sZEJtcCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1NoYXJl
ZEJpdG1hcDo6RENQcm92aWRlciBnX2RjUHJvdmlkZXI7CitTaGFyZWRCaXRtYXA6OkRDUHJvdmlk
ZXIqIFNoYXJlZEJpdG1hcDo6bV9kY1Byb3ZpZGVyID0gJmdfZGNQcm92aWRlcjsKKworSERDIFNo
YXJlZEJpdG1hcDo6RENQcm92aWRlcjo6Z2V0REMoU2hhcmVkQml0bWFwKiBibXAsIHVuc2lnbmVk
KiBrZXkxLCB1bnNpZ25lZCoga2V5MikKK3sKKyAgICBpZiAoIWJtcCB8fCAhYm1wLT5lbnN1cmVI
YW5kbGUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBIREMgaGRjID0gOjpDcmVhdGVDb21w
YXRpYmxlREMoMCk7CisgICAgaWYgKGhkYykgeworICAgICAgICAqa2V5MSA9ICh1bnNpZ25lZClT
ZWxlY3RPYmplY3QoaGRjLCBibXAtPmdldEhhbmRsZSgpKTsKKyAgICAgICAgUkVDVCByZWN0ID0g
eyAwLCAwLCBibXAtPndpZHRoKCksIGJtcC0+aGVpZ2h0KCkgfTsKKyAgICAgICAgT3duUHRyPEhS
R04+IGNsaXBSZ24oQ3JlYXRlUmVjdFJnbkluZGlyZWN0KCZyZWN0KSk7CisgICAgICAgIFNlbGVj
dENsaXBSZ24oaGRjLCBjbGlwUmduLmdldCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gaGRjOwor
fQorCit2b2lkIFNoYXJlZEJpdG1hcDo6RENQcm92aWRlcjo6cmVsZWFzZURDKFNoYXJlZEJpdG1h
cCosIEhEQyBoZGMsIHVuc2lnbmVkIGtleTEsIHVuc2lnbmVkIGtleTIpCit7CisgICAgaWYgKCFo
ZGMpCisgICAgICAgIHJldHVybjsKKworICAgIFNlbGVjdE9iamVjdChoZGMsIChIR0RJT0JKKWtl
eTEpOworICAgIERlbGV0ZURDKGhkYyk7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpjbGVhclBp
eGVscyhjb25zdCBJbnRSZWN0JiByKQoreworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJl
dHVybjsKKworICAgIEludFJlY3QgYm1wUmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSk7Cisg
ICAgYm1wUmVjdC5pbnRlcnNlY3Qocik7CisgICAgaWYgKGlzMTZiaXQoKSkgeworICAgICAgICBp
bnQgdyA9IG1fYm1wSW5mby5wYWRkZWRXaWR0aCgpOworICAgICAgICB1bnNpZ25lZCBzaG9ydCog
ZHN0ID0gKHVuc2lnbmVkIHNob3J0KiltX3BpeGVsczsKKyAgICAgICAgZHN0ICs9IGJtcFJlY3Qu
eSgpICogdyArIGJtcFJlY3QueCgpOworICAgICAgICBpbnQgd29yZHNUb1NldCA9IGJtcFJlY3Qu
d2lkdGgoKTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIGRzdEVuZCA9IGRzdCArIGJt
cFJlY3QuaGVpZ2h0KCkgKiB3OworICAgICAgICB3aGlsZSAoZHN0IDwgZHN0RW5kKSB7CisgICAg
ICAgICAgICB3bWVtc2V0KCh3Y2hhcl90Kilkc3QsIDAsIHdvcmRzVG9TZXQpOworICAgICAgICAg
ICAgZHN0ICs9IHc7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgdyA9IHdp
ZHRoKCk7CisgICAgICAgIHVuc2lnbmVkKiBkc3QgPSAodW5zaWduZWQqKW1fcGl4ZWxzOworICAg
ICAgICBkc3QgKz0gYm1wUmVjdC55KCkgKiB3ICsgYm1wUmVjdC54KCk7CisgICAgICAgIGludCB3
b3Jkc1RvU2V0ID0gYm1wUmVjdC53aWR0aCgpICogMjsKKyAgICAgICAgY29uc3QgdW5zaWduZWQq
IGRzdEVuZCA9IGRzdCArIGJtcFJlY3QuaGVpZ2h0KCkgKiB3OworICAgICAgICB3aGlsZSAoZHN0
IDwgZHN0RW5kKSB7CisgICAgICAgICAgICB3bWVtc2V0KCh3Y2hhcl90Kilkc3QsIDAsIHdvcmRz
VG9TZXQpOworICAgICAgICAgICAgZHN0ICs9IHc7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30K
KwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRt
YXAuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmgKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2NzY0MwotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmgKQEAgLTAs
MCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUs
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNp
bmNsdWRlICJCaXRtYXBJbmZvLmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNs
dWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHdpbmdkaS5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKKyAgICBlbnVtIENvbXBvc2l0ZU9wZXJhdG9yOworICAgIGNsYXNzIEZsb2F0
UG9pbnQ7CisgICAgY2xhc3MgRmxvYXRSZWN0OworICAgIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsK
KyAgICBjbGFzcyBJbnRSZWN0OworICAgIGNsYXNzIEludFNpemU7CisgICAgY2xhc3MgVHJhbnNm
b3JtYXRpb25NYXRyaXg7CisKKyAgICBjbGFzcyBTaGFyZWRCaXRtYXA6IHB1YmxpYyBSZWZDb3Vu
dGVkPFNoYXJlZEJpdG1hcD4geworICAgIHB1YmxpYzoKKyAgICAgICAgflNoYXJlZEJpdG1hcCgp
OworICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IGNyZWF0ZUluc3RhbmNl
KGJvb2wgaXMxNmJpdCwgaW50IHcsIGludCBoLCBib29sIGluaXRQaXhlbHMpOworICAgICAgICBj
b25zdCBCaXRtYXBJbmZvJiBiaXRtYXBJbmZvKCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvOyB9
CisgICAgICAgIHZvaWQqIGJ5dGVzKCkgeyByZXR1cm4gbV9waXhlbHM7IH0KKyAgICAgICAgY29u
c3Qgdm9pZCogYnl0ZXMoKSBjb25zdCB7IHJldHVybiBtX3BpeGVsczsgfQorICAgICAgICB1bnNp
Z25lZCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mby53aWR0aCgpOyB9CisgICAgICAg
IHVuc2lnbmVkIGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mby5oZWlnaHQoKTsgfQor
ICAgICAgICB1bnNpZ25lZCB2YWxpZEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsaWRIZWln
aHQ7IH0KKyAgICAgICAgdm9pZCBzZXRWYWxpZEhlaWdodCh1bnNpZ25lZCB2YWxpZEhlaWdodCkg
eyBtX3ZhbGlkSGVpZ2h0ID0gdmFsaWRIZWlnaHQ7IH0KKyAgICAgICAgdm9pZCByZXNldFBpeGVs
cyhib29sIGJsYWNrID0gZmFsc2UpOworICAgICAgICB2b2lkIGNsZWFyUGl4ZWxzKGNvbnN0IElu
dFJlY3QmIHIpOworICAgICAgICBib29sIGxvY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9ja2Vk
OyB9CisgICAgICAgIHZvaWQgbG9jaygpIHsgbV9sb2NrZWQgPSB0cnVlOyB9CisgICAgICAgIHZv
aWQgdW5sb2NrKCkgeyBtX2xvY2tlZCA9IGZhbHNlOyB9CisgICAgICAgIGJvb2wgZnJlZU1lbW9y
eSgpOworICAgICAgICBib29sIGlzMTZiaXQoKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8uaXMx
NmJpdCgpOyB9CisgICAgICAgIGJvb2wgaXMzMmJpdCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5m
by5pczMyYml0KCk7IH0KKyAgICAgICAgYm9vbCB0bzE2Yml0KCk7CisgICAgICAgIGJvb2wgaGFz
QWxwaGEoKSBjb25zdCB7IHJldHVybiBtX2hhc0FscGhhOyB9CisgICAgICAgIHZvaWQgc2V0SGFz
QWxwaGEoYm9vbCBhbHBoYSkgeyBtX2hhc0FscGhhID0gYWxwaGE7IH0KKyAgICAgICAgYm9vbCBl
bnN1cmVIYW5kbGUoKTsKKyAgICAgICAgSEJJVE1BUCBnZXRIYW5kbGUoKSB7IHJldHVybiBtX2hi
aXRtYXA7IH0KKyAgICAgICAgSEJJVE1BUCBjcmVhdGVIYW5kbGUodm9pZCoqIHBpeGVscywgQml0
bWFwSW5mbyogYm1wSW5mbywgaW50IGggPSAtMSwgYm9vbCB1c2UxNmJpdCA9IHRydWUpIGNvbnN0
OworICAgICAgICBib29sIHVzZXNUcmFuc3BhcmVudENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV91
c2VzVHJhbnNwYXJlbnRDb2xvcjsgfQorICAgICAgICBDT0xPUlJFRiB0cmFuc3BhcmVudENvbG9y
KCkgY29uc3QgeyByZXR1cm4gbV90cmFuc3BhcmVudENvbG9yOyB9CisgICAgICAgIHZvaWQgc2V0
VHJhbnNwYXJlbnRDb2xvcihDT0xPUlJFRiBjKQorICAgICAgICB7CisgICAgICAgICAgICBtX3Vz
ZXNUcmFuc3BhcmVudENvbG9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fdHJhbnNwYXJlbnRDb2xv
ciA9IGM7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBjYW5Vc2VESUJpdHMoKSBjb25zdCB7IHJl
dHVybiAhaGFzQWxwaGEoKSAmJiAhdXNlc1RyYW5zcGFyZW50Q29sb3IoKTsgfQorCisgICAgICAg
IEhCSVRNQVAgY2xpcEJpdG1hcChjb25zdCBJbnRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYm9vbCB1c2VBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJp
dG1hcEluZm8mIGJtcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgcGl4
ZWxzKTsKKworICAgICAgICBQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4gY2xpcEJpdG1hcChjb25z
dCBJbnRSZWN0JiByZWN0LCBib29sIHVzZUFscGhhKTsKKworICAgICAgICB2b2lkIGRyYXcoR3Jh
cGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRSZWN0
JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCk7CisgICAgICAgIHZvaWQg
ZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVS
ZWN0SW4sIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9w
ZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBJbnRTaXplJiBvcmln
U291cmNlU2l6ZSk7CisgICAgICAgIHZvaWQgZHJhdyhIREMsIGNvbnN0IEludFJlY3QmIGRzdFJl
Y3QsIGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9w
KTsKKyAgICAgICAgdm9pZCBkcmF3UGF0dGVybihIREMsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0
cml4JiwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZs
b2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBk
ZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpOworCisgICAgICAgIHR5cGVk
ZWYgdm9pZCAoKkRyYXdQYXR0ZXJuRnVuYykoU2hhcmVkQml0bWFwKiBibXAsIEhEQywgY29uc3Qg
VHJhbnNmb3JtYXRpb25NYXRyaXgmLCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0
IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBj
b25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSk7
CisgICAgICAgIHR5cGVkZWYgYm9vbCAoKkRyYXdJbWFnZUZ1bmMpIChTaGFyZWRCaXRtYXAqIGJt
cCwgSERDLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBD
b21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCk7CisKKyAgICAgICAgc3RhdGljIERyYXdQYXR0
ZXJuRnVuYyBzZXREcmF3UGF0dGVybkZ1bmMoRHJhd1BhdHRlcm5GdW5jIGZ1bmMpOworICAgICAg
ICBzdGF0aWMgRHJhd0ltYWdlRnVuYyBzZXREcmF3SW1hZ2VGdW5jKERyYXdJbWFnZUZ1bmMgZnVu
Yyk7CisKKyAgICAgICAgY2xhc3MgRENQcm92aWRlciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAg
ICAgICAgIHZpcnR1YWwgSERDIGdldERDKFNoYXJlZEJpdG1hcCosIHVuc2lnbmVkKiBrZXkxLCB1
bnNpZ25lZCoga2V5Mik7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZURDKFNoYXJl
ZEJpdG1hcCosIEhEQyBoZGMsIHVuc2lnbmVkIGtleTEsIHVuc2lnbmVkIGtleTIpOworICAgICAg
ICB9OworCisgICAgICAgIHN0YXRpYyBEQ1Byb3ZpZGVyKiBtX2RjUHJvdmlkZXI7CisKKyAgICAg
ICAgSERDIGdldERDKHVuc2lnbmVkKiBrZXkxLCB1bnNpZ25lZCoga2V5MikgeyByZXR1cm4gbV9k
Y1Byb3ZpZGVyLT5nZXREQyh0aGlzLCBrZXkxLCBrZXkyKTsgfQorICAgICAgICB2b2lkIHJlbGVh
c2VEQyhIREMgaGRjLCB1bnNpZ25lZCBrZXkxLCB1bnNpZ25lZCBrZXkyKSB7IG1fZGNQcm92aWRl
ci0+cmVsZWFzZURDKHRoaXMsIGhkYywga2V5MSwga2V5Mik7IH0KKworICAgICAgICBjbGFzcyBE
Q0hvbGRlciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIERDSG9sZGVyKFNoYXJlZEJp
dG1hcCogYm1wID0gMCkgeyBfc2V0KGJtcCk7IH0KKyAgICAgICAgICAgIH5EQ0hvbGRlcigpIHsg
X2NsZWFyKCk7IH0KKyAgICAgICAgICAgIHZvaWQgc2V0KFNoYXJlZEJpdG1hcCogYm1wID0gMCkK
KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2xlYXIoKTsKKyAgICAgICAgICAgICAg
ICBfc2V0KGJtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIREMgZ2V0KCkgY29uc3Qg
eyByZXR1cm4gbV9oZGM7IH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIERDSG9sZGVy
JiBvcGVyYXRvcj0oY29uc3QgRENIb2xkZXImKTsKKyAgICAgICAgICAgIERDSG9sZGVyKGNvbnN0
IERDSG9sZGVyJik7CisgICAgICAgICAgICB2b2lkIF9jbGVhcigpCisgICAgICAgICAgICB7Cisg
ICAgICAgICAgICAgICAgaWYgKG1faGRjKQorICAgICAgICAgICAgICAgICAgICBtX2JpdG1hcC0+
cmVsZWFzZURDKG1faGRjLCBtX2tleTEsIG1fa2V5Mik7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICB2b2lkIF9zZXQoU2hhcmVkQml0bWFwKiBibXApCisgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgbV9iaXRtYXAgPSBibXA7CisgICAgICAgICAgICAgICAgbV9oZGMgPSBibXAgPyBi
bXAtPmdldERDKCZtX2tleTEsICZtX2tleTIpIDogMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIFNoYXJlZEJpdG1hcCogbV9iaXRtYXA7CisgICAgICAgICAgICBIREMgbV9oZGM7CisgICAg
ICAgICAgICB1bnNpZ25lZCBtX2tleTE7CisgICAgICAgICAgICB1bnNpZ25lZCBtX2tleTI7Cisg
ICAgICAgIH07CisKKyAgICBwcml2YXRlOgorICAgICAgICBleHBsaWNpdCBTaGFyZWRCaXRtYXAo
Ym9vbCBpczE2Yml0LCBpbnQgdywgaW50IGgsIGJvb2wgaW5pdFBpeGVscyk7CisgICAgICAgIGV4
cGxpY2l0IFNoYXJlZEJpdG1hcChjb25zdCBCaXRtYXBJbmZvJiBibXBJbmZvLCBIQklUTUFQIGhi
bXAsIHZvaWQqIHBpeGVscyk7CisgICAgICAgIEJpdG1hcEluZm8gbV9ibXBJbmZvOworICAgICAg
ICBpbnQgbV9yZWZlcmVuY2U7CisgICAgICAgIEhCSVRNQVAgbV9oYml0bWFwOworICAgICAgICB2
b2lkKiBtX3BpeGVsczsKKyAgICAgICAgQ09MT1JSRUYgbV90cmFuc3BhcmVudENvbG9yOworICAg
ICAgICBpbnQgbV92YWxpZEhlaWdodDsKKyAgICAgICAgYm9vbCBtX2xvY2tlZDsKKyAgICAgICAg
Ym9vbCBtX3VzZXNUcmFuc3BhcmVudENvbG9yOworICAgICAgICBib29sIG1faGFzQWxwaGE7Cisg
ICAgfTsKKworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33546</attachid>
            <date>2009-07-27 08:17:21 -0700</date>
            <delta_ts>2009-07-30 13:11:12 -0700</delta_ts>
            <desc>move encoder files to platform/image_encoders/wince</desc>
            <filename>27511.patch</filename>
            <type>text/plain</type>
            <size>130859</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OGU4ODg0Zi4uMWI3YzRkMiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsNSArMSwzOCBAQAogMjAwOS0wNy0yNyAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgogCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAgKE9P
UFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
Mjc1MTEKKyAgICAgICAgQWRkIFdJTkNFIHNwZWNpZmljIHBsYXRmb3JtL2dyYXBoaWNzIGZpbGVz
IGZvciB0aGUgV2luQ0UgcG9ydC4KKworICAgICAgICBXcml0dGVuIGJ5IFlvbmcgTGkgPHlvbmcu
bGlAdG9yY2htb2JpbGUuY29tPiwgR2VvcmdlIFN0YWlrb3MgPGdlb3JnZS5zdGFpa29zQHRvcmNo
bW9iaWxlLmNvbT4sIENyeXN0YWwgWmhhbmcgPGNyeXN0YWwuemhhbmdAdG9yY2htb2JpbGUuY29t
PgorICAgICAgICBhbmQgTHlvbiBDaGVuIDxseW9uLmNoZW5AdG9yY2htb2JpbGUuY29tPgorCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvQ29sb3JXaW5jZS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dyYWRpZW50V2luY2UuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlckRhdGEuaDog
QWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJXaW5j
ZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRGVj
b2RlclV0aWxpdGllcy5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL0ltYWdlRGVjb2RlclV0aWxpdGllcy5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9JbWFnZUZyYW1lU2luay5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9JbWFnZUZyYW1lU2lua1dpbmNlLmNwcDogQWRkZWQuCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VTb3VyY2VXaW5jZS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlV2luY2UuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9NZWRpYVBsYXllclByaXZhdGVXaW5j
ZS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9NZWRpYVBsYXll
clByb3h5LmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVk
aWFQbGF5ZXJQcm94eS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9QYXRoV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9QbGF0Zm9ybVBhdGhXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0
Zm9ybS9pbWFnZV9lbmNvZGVycy93aW5jZS9KUEVHRW5jb2Rlci5jcHA6IEFkZGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL2ltYWdlX2VuY29kZXJzL3dpbmNlL0pQRUdFbmNvZGVyLmg6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2ltYWdlX2VuY29kZXJzL3dpbmNlL1BOR0VuY29kZXIuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZV9lbmNvZGVycy93aW5jZS9QTkdFbmNvZGVy
Lmg6IEFkZGVkLgorCisyMDA5LTA3LTIxICBZb25nIExpICA8eW9uZy5saUB0b3JjaG1vYmlsZS5j
b20+CisKICAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCiAKICAgICAgICAgTWFr
ZSBwbHVnaW4gd29yayBvbiBXSU5DRSBwbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9Db2xvcldpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvQ29sb3JXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uODIwYjlkMgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvQ29sb3JXaW5jZS5jcHAKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqICBDb3B5cmln
aHQgKEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb2xvci5oIgorCisjaW5jbHVkZSAiTm90SW1wbGVt
ZW50ZWQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDb2xvciBmb2N1c1JpbmdDb2xvcigp
Cit7CisgICAgcmV0dXJuIENvbG9yKDAsIDAsIDApOworfQorCit2b2lkIHNldEZvY3VzUmluZ0Nv
bG9yQ2hhbmdlRnVuY3Rpb24odm9pZCAoKikoKSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
fQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL0dyYWRpZW50V2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9HcmFkaWVudFdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi40OWZhOTcwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9HcmFkaWVudFdpbmNlLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVT
QS4KKyAqLworCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFkaWVudC5oIgor
CisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
dm9pZCBHcmFkaWVudDo6cGxhdGZvcm1EZXN0cm95KCkKK3sKK30KKworc3RhdGljIGlubGluZSBi
b29sIGNvbXBhcmVTdG9wcyhjb25zdCBHcmFkaWVudDo6Q29sb3JTdG9wJiBhLCBjb25zdCBHcmFk
aWVudDo6Q29sb3JTdG9wJiBiKQoreworICAgIHJldHVybiBhLnN0b3AgPCBiLnN0b3A7Cit9CisK
K2NvbnN0IFZlY3RvcjxHcmFkaWVudDo6Q29sb3JTdG9wPiYgR3JhZGllbnQ6OmdldFN0b3BzKCkg
Y29uc3QKK3sKKyAgICBpZiAoIW1fc3RvcHNTb3J0ZWQpIHsKKyAgICAgICAgaWYgKG1fc3RvcHMu
c2l6ZSgpKQorICAgICAgICAgICAgc3RkOjpzdGFibGVfc29ydChtX3N0b3BzLmJlZ2luKCksIG1f
c3RvcHMuZW5kKCksIGNvbXBhcmVTdG9wcyk7CisgICAgICAgIG1fc3RvcHNTb3J0ZWQgPSB0cnVl
OworICAgIH0KKyAgICByZXR1cm4gbV9zdG9wczsKK30KKwordm9pZCBHcmFkaWVudDo6ZmlsbChH
cmFwaGljc0NvbnRleHQqIGMsIGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICBjLT5maWxsUmVj
dChyLCB0aGlzKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9JbWFnZUJ1ZmZlckRhdGEuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvSW1hZ2VCdWZmZXJEYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
MDFiN2QwNgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvSW1hZ2VCdWZmZXJEYXRhLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAg
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8K
KworI2lmbmRlZiBJbWFnZUJ1ZmZlckRhdGFfaAorI2RlZmluZSBJbWFnZUJ1ZmZlckRhdGFfaAor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBJbnRTaXplOworICAgIGNsYXNzIElt
YWdlQnVmZmVyRGF0YSB7CisgICAgcHVibGljOgorICAgICAgICBJbWFnZUJ1ZmZlckRhdGEoY29u
c3QgSW50U2l6ZSYgc2l6ZSk7CisgICAgICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IG1fYml0bWFw
OworICAgIH07CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAgLy8gSW1hZ2VC
dWZmZXJEYXRhX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2Uv
SW1hZ2VCdWZmZXJXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0lt
YWdlQnVmZmVyV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZh
ODEzZTMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0ltYWdlQnVmZmVyV2luY2UuY3BwCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
ICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKKworI2lu
Y2x1ZGUgIkJhc2U2NC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
IkltYWdlLmgiCisjaW5jbHVkZSAiSW1hZ2VEYXRhLmgiCisjaW5jbHVkZSAiSlBFR0VuY29kZXIu
aCIKKyNpbmNsdWRlICJQTkdFbmNvZGVyLmgiCisjaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQnVmZmVyZWRJbWFnZTogcHVibGljIEltYWdl
IHsKKworcHVibGljOgorICAgIEJ1ZmZlcmVkSW1hZ2UoY29uc3QgSW1hZ2VCdWZmZXJEYXRhKiBk
YXRhKQorICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFs
IEludFNpemUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEludFNpemUobV9kYXRhLT5tX2JpdG1hcC0+
d2lkdGgoKSwgbV9kYXRhLT5tX2JpdG1hcC0+aGVpZ2h0KCkpOyB9CisgICAgdmlydHVhbCB2b2lk
IGRlc3Ryb3lEZWNvZGVkRGF0YShib29sIGRlc3Ryb3lBbGwgPSB0cnVlKSB7fQorICAgIHZpcnR1
YWwgdW5zaWduZWQgZGVjb2RlZFNpemUoKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgdmlydHVh
bCB2b2lkIGRyYXcoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBj
b25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yKTsKKyAgICB2aXJ0dWFs
IHZvaWQgZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiBzcmNS
ZWN0LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0
ZU9wZXJhdG9yLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KTsKKworICAgIGNvbnN0IEltYWdl
QnVmZmVyRGF0YSogbV9kYXRhOworfTsKKwordm9pZCBCdWZmZXJlZEltYWdlOjpkcmF3KEdyYXBo
aWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBGbG9hdFJl
Y3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIEludFJl
Y3QgaW50RHN0UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoZHN0UmVjdCk7CisgICAgSW50UmVjdCBp
bnRTcmNSZWN0KHNyY1JlY3QpOworICAgIG1fZGF0YS0+bV9iaXRtYXAtPmRyYXcoY3R4dCwgaW50
RHN0UmVjdCwgaW50U3JjUmVjdCwgY29tcG9zaXRlT3ApOworfQorCit2b2lkIEJ1ZmZlcmVkSW1h
Z2U6OmRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiB0
aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENv
bXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KQoreworICAgIG1f
ZGF0YS0+bV9iaXRtYXAtPmRyYXdQYXR0ZXJuKGN0eHQsIHRpbGVSZWN0SW4sIHBhdHRlcm5UcmFu
c2Zvcm0sIHBoYXNlLCBvcCwgZGVzdFJlY3QsIHNpemUoKSk7Cit9CisKK0ltYWdlQnVmZmVyRGF0
YTo6SW1hZ2VCdWZmZXJEYXRhKGNvbnN0IEludFNpemUmIHNpemUpCis6IG1fYml0bWFwKFNoYXJl
ZEJpdG1hcDo6Y3JlYXRlSW5zdGFuY2UoZmFsc2UsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQo
KSwgZmFsc2UpKQoreworICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtaHRtbDUt
MjAwOTAyMTIvdGhlLWNhbnZhcy1lbGVtZW50Lmh0bWwjY2FudmFzcGl4ZWxhcnJheQorICAgIC8v
ICJXaGVuIHRoZSBjYW52YXMgaXMgaW5pdGlhbGl6ZWQgaXQgbXVzdCBiZSBzZXQgdG8gZnVsbHkg
dHJhbnNwYXJlbnQgYmxhY2suIgorICAgIG1fYml0bWFwLT5yZXNldFBpeGVscyh0cnVlKTsKKyAg
ICBtX2JpdG1hcC0+c2V0SGFzQWxwaGEodHJ1ZSk7Cit9CisKK0ltYWdlQnVmZmVyOjpJbWFnZUJ1
ZmZlcihjb25zdCBJbnRTaXplJiBzaXplLCBib29sIGdyYXlTY2FsZSwgYm9vbCYgc3VjY2VzcykK
KzogbV9kYXRhKHNpemUpCissIG1fc2l6ZShzaXplKQoreworICAgIGdyYXlTY2FsZTsgLy8gQ3Vy
cmVudGx5IG5vdCB1c2VkCisgICAgbV9jb250ZXh0LnNldChuZXcgR3JhcGhpY3NDb250ZXh0KDAp
KTsKKyAgICBtX2NvbnRleHQtPnNldEJpdG1hcChtX2RhdGEubV9iaXRtYXApOworICAgIHN1Y2Nl
c3MgPSB0cnVlOworfQorCitJbWFnZUJ1ZmZlcjo6fkltYWdlQnVmZmVyKCkKK3sKK30KKworR3Jh
cGhpY3NDb250ZXh0KiBJbWFnZUJ1ZmZlcjo6Y29udGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fY29udGV4dC5nZXQoKTsKK30KKworSW1hZ2UqIEltYWdlQnVmZmVyOjppbWFnZSgpIGNvbnN0
Cit7CisgICAgaWYgKCFtX2ltYWdlKQorICAgICAgICBtX2ltYWdlID0gYWRvcHRSZWYobmV3IEJ1
ZmZlcmVkSW1hZ2UoJm1fZGF0YSkpOworCisgICAgcmV0dXJuIG1faW1hZ2UuZ2V0KCk7Cit9CisK
K1Bhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRhKGNvbnN0IElu
dFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IGltYWdlRGF0
YSA9IEltYWdlRGF0YTo6Y3JlYXRlKHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisKKyAg
ICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmMgPSAodW5zaWduZWQgY2hhciopbV9kYXRhLm1fYml0
bWFwLT5ieXRlcygpOworICAgIGlmICghc3JjKQorICAgICAgICByZXR1cm4gaW1hZ2VEYXRhOwor
CisgICAgSW50UmVjdCBzb3VyY2VSZWN0KDAsIDAsIG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSwg
bV9kYXRhLm1fYml0bWFwLT5oZWlnaHQoKSk7CisgICAgc291cmNlUmVjdC5pbnRlcnNlY3QocmVj
dCk7CisgICAgaWYgKHNvdXJjZVJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gaW1hZ2VE
YXRhOworCisgICAgdW5zaWduZWQgY2hhciogZHN0ID0gaW1hZ2VEYXRhLT5kYXRhKCktPmRhdGEo
KS0+ZGF0YSgpOworICAgIG1lbXNldChkc3QsIDAsIGltYWdlRGF0YS0+ZGF0YSgpLT5kYXRhKCkt
Pmxlbmd0aCgpKTsKKyAgICBzcmMgKz0gKHNvdXJjZVJlY3QueSgpICogbV9kYXRhLm1fYml0bWFw
LT53aWR0aCgpICsgc291cmNlUmVjdC54KCkpICogNDsKKyAgICBkc3QgKz0gKChzb3VyY2VSZWN0
LnkoKSAtIHJlY3QueSgpKSAqIGltYWdlRGF0YS0+d2lkdGgoKSArIHNvdXJjZVJlY3QueCgpIC0g
cmVjdC54KCkpICogNDsKKyAgICBpbnQgYnl0ZXNUb0NvcHkgPSBzb3VyY2VSZWN0LndpZHRoKCkg
KiA0OworICAgIGludCBzcmNTa2lwID0gKG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSAtIHNvdXJj
ZVJlY3Qud2lkdGgoKSkgKiA0OworICAgIGludCBkc3RTa2lwID0gKGltYWdlRGF0YS0+d2lkdGgo
KSAtIHNvdXJjZVJlY3Qud2lkdGgoKSkgKiA0OworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRz
dEVuZCA9IGRzdCArIHNvdXJjZVJlY3QuaGVpZ2h0KCkgKiBpbWFnZURhdGEtPndpZHRoKCkgKiA0
OworICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hh
ciogZHN0Um93RW5kID0gZHN0ICsgYnl0ZXNUb0NvcHk7CisgICAgICAgIHdoaWxlIChkc3QgPCBk
c3RSb3dFbmQpIHsKKyAgICAgICAgICAgICpkc3QrKyA9IHNyY1szXTsgLy8gQQorICAgICAgICAg
ICAgKmRzdCsrID0gKnNyYysrOyAvLyBCCisgICAgICAgICAgICAqZHN0KysgPSAqc3JjKys7IC8v
IEcKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsgLy8gUgorICAgICAgICAgICAgKytzcmM7
CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IHNyY1NraXA7CisgICAgICAgIGRzdCArPSBkc3RT
a2lwOworICAgIH0KKworICAgIHJldHVybiBpbWFnZURhdGE7Cit9CisKK3ZvaWQgSW1hZ2VCdWZm
ZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNl
UmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyKiBk
c3QgPSAodW5zaWduZWQgY2hhciopbV9kYXRhLm1fYml0bWFwLT5ieXRlcygpOworICAgIGlmICgh
ZHN0KQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IGRlc3RSZWN0KGRlc3RQb2ludCwg
c291cmNlUmVjdC5zaXplKCkpOworICAgIGRlc3RSZWN0LmludGVyc2VjdChJbnRSZWN0KDAsIDAs
IG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSwgbV9kYXRhLm1fYml0bWFwLT5oZWlnaHQoKSkpOwor
CisgICAgaWYgKGRlc3RSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29u
c3QgdW5zaWduZWQgY2hhciogc3JjID0gc291cmNlLT5kYXRhKCktPmRhdGEoKS0+ZGF0YSgpOwor
ICAgIGRzdCArPSAoZGVzdFJlY3QueSgpICogbV9kYXRhLm1fYml0bWFwLT53aWR0aCgpICsgZGVz
dFJlY3QueCgpKSAqIDQ7CisgICAgc3JjICs9IChzb3VyY2VSZWN0LnkoKSAqIHNvdXJjZS0+d2lk
dGgoKSArIHNvdXJjZVJlY3QueCgpKSAqIDQ7CisgICAgaW50IGJ5dGVzVG9Db3B5ID0gZGVzdFJl
Y3Qud2lkdGgoKSAqIDQ7CisgICAgaW50IGRzdFNraXAgPSAobV9kYXRhLm1fYml0bWFwLT53aWR0
aCgpIC0gZGVzdFJlY3Qud2lkdGgoKSkgKiA0OworICAgIGludCBzcmNTa2lwID0gKHNvdXJjZS0+
d2lkdGgoKSAtIGRlc3RSZWN0LndpZHRoKCkpICogNDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFy
KiBkc3RFbmQgPSBkc3QgKyBkZXN0UmVjdC5oZWlnaHQoKSAqIG1fZGF0YS5tX2JpdG1hcC0+d2lk
dGgoKSAqIDQ7CisgICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkgeworICAgICAgICBjb25zdCB1bnNp
Z25lZCBjaGFyKiBkc3RSb3dFbmQgPSBkc3QgKyBieXRlc1RvQ29weTsKKyAgICAgICAgd2hpbGUg
KGRzdCA8IGRzdFJvd0VuZCkgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhbHBoYSA9ICpz
cmMrKzsKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsgLy8gQgorICAgICAgICAgICAgKmRz
dCsrID0gKnNyYysrOyAvLyBHCisgICAgICAgICAgICAqZHN0KysgPSAqc3JjKys7IC8vIFIKKyAg
ICAgICAgICAgICpkc3QrKyA9IGFscGhhOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBzcmNT
a2lwOworICAgICAgICBkc3QgKz0gZHN0U2tpcDsKKyAgICB9Cit9CisKK1N0cmluZyBJbWFnZUJ1
ZmZlcjo6dG9EYXRhVVJMKGNvbnN0IFN0cmluZyYgbWltZVR5cGUpIGNvbnN0Cit7CisgICAgaWYg
KCFtX2RhdGEubV9iaXRtYXAtPmJ5dGVzKCkpCisgICAgICAgIHJldHVybiAiZGF0YTosIjsKKwor
ICAgIFZlY3RvcjxjaGFyPiBvdXRwdXQ7CisgICAgY29uc3QgY2hhciogaGVhZGVyOworICAgIGlm
IChtaW1lVHlwZS5sb3dlcigpID09ICJpbWFnZS9wbmciKSB7CisgICAgICAgIGlmICghY29tcHJl
c3NCaXRtYXBUb1BuZyhtX2RhdGEubV9iaXRtYXAuZ2V0KCksIG91dHB1dCkpCisgICAgICAgICAg
ICByZXR1cm4gImRhdGE6LCI7CisgICAgICAgIGhlYWRlciA9ICJkYXRhOmltYWdlL3BuZztiYXNl
NjQsIjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWNvbXByZXNzQml0bWFwVG9KcGVnKG1f
ZGF0YS5tX2JpdG1hcC5nZXQoKSwgb3V0cHV0KSkKKyAgICAgICAgICAgIHJldHVybiAiZGF0YTos
IjsKKyAgICAgICAgaGVhZGVyID0gImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsIjsKKyAgICB9CisK
KyAgICBWZWN0b3I8Y2hhcj4gYmFzZTY0OworICAgIGJhc2U2NEVuY29kZShvdXRwdXQsIGJhc2U2
NCk7CisKKyAgICBvdXRwdXQuY2xlYXIoKTsKKworICAgIFZlY3RvcjxjaGFyPiB1cmw7CisgICAg
dXJsLmFwcGVuZChoZWFkZXIsIHN0cmxlbihoZWFkZXIpKTsKKyAgICB1cmwuYXBwZW5kKGJhc2U2
NCk7CisKKyAgICByZXR1cm4gU3RyaW5nKHVybC5kYXRhKCksIHVybC5zaXplKCkpOworfQorCit9
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVT
aW5rLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rLmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxYjk3ZAotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFtZVNpbmsuaApA
QCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRl
ciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5
IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpIHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZu
ZGVmIElNQUdFX0ZSQU1FX1NJTktfSF8KKyNkZWZpbmUgSU1BR0VfRlJBTUVfU0lOS19IXworCisj
aW5jbHVkZSAiSW50UmVjdC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBuYW1lc3Bh
Y2UgUkdCQTMyQnVmZmVyIHsKKyAgICAgICAgZW51bSBGcmFtZVN0YXR1cyB7CisgICAgICAgICAg
ICBGcmFtZUVtcHR5LAorICAgICAgICAgICAgRnJhbWVQYXJ0aWFsLAorICAgICAgICAgICAgRnJh
bWVDb21wbGV0ZQorICAgICAgICB9OworICAgICAgICBlbnVtIEZyYW1lRGlzcG9zYWxNZXRob2Qg
eworICAgICAgICAgICAgLy8gSWYgeW91IGNoYW5nZSB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgdGhl
c2UsIG1ha2Ugc3VyZSB5b3UgYXVkaXQgYWxsCisgICAgICAgICAgICAvLyB1c2VycywgYXMgc29t
ZSB1c2VycyBtYXkgY2FzdCByYXcgdmFsdWVzIHRvL2Zyb20gdGhlc2UgY29uc3RhbnRzLgorICAg
ICAgICAgICAgRGlzcG9zZU5vdFNwZWNpZmllZCA9IDAsICAgICAgIC8vIExlYXZlIGZyYW1lIGlu
IGZyYW1lYnVmZmVyCisgICAgICAgICAgICBEaXNwb3NlS2VlcCA9IDEsICAgICAgICAgICAgICAg
Ly8gTGVhdmUgZnJhbWUgaW4gZnJhbWVidWZmZXIKKyAgICAgICAgICAgIERpc3Bvc2VPdmVyd3Jp
dGVCZ2NvbG9yID0gMiwgICAvLyBDbGVhciBmcmFtZSB0byB0cmFuc3BhcmVudAorICAgICAgICAg
ICAgRGlzcG9zZU92ZXJ3cml0ZVByZXZpb3VzID0gMywgIC8vIENsZWFyIGZyYW1lIHRvIHByZXZp
b3VzIGZyYW1lYnVmZmVyIGNvbnRlbnRzCisgICAgICAgIH07CisgICAgfQorCisgICAgY2xhc3Mg
SW1hZ2VGcmFtZVNpbmsgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW1hZ2VGcmFtZVNpbmsoYm9v
bCBjYW5GcmVlQnVmZmVyKQorICAgICAgICAgICAgOiBtXzE2Yml0KGZhbHNlKQorICAgICAgICAg
ICAgLCBtX2ltYWdlV2lkdGgoMCkKKyAgICAgICAgICAgICwgbV9idWZmZXJXaWR0aCgwKQorICAg
ICAgICAgICAgLCBtX2hlaWdodCgwKQorICAgICAgICAgICAgLCBtX2V4cGVjdGVkSGVpZ2h0KDAp
CisgICAgICAgICAgICAsIG1fc3RhdHVzKFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSkKKyAgICAg
ICAgICAgICwgbV9kaXNwb3NhbE1ldGhvZChSR0JBMzJCdWZmZXI6OkRpc3Bvc2VOb3RTcGVjaWZp
ZWQpCisgICAgICAgICAgICAsIG1fZHVyYXRpb24oMCkKKyAgICAgICAgICAgICwgbV9oYXNBbHBo
YShmYWxzZSkKKyAgICAgICAgICAgICwgbV9jYW5GcmVlQnVmZmVyKGNhbkZyZWVCdWZmZXIpCisg
ICAgICAgICAgICAsIG1fc2hvdWxkRnJlZUJ1ZmZlcihmYWxzZSkKKyAgICAgICAgICAgICwgbV91
c2VzVHJhbnNwYXJlbnRDb2xvcihmYWxzZSkKKyAgICAgICAgICAgICwgbV90cmFuc3BhcmVudENv
bG9yKDApCisgICAgICAgICAgICAsIG1fY29tcG9zaXRlZFdpdGhQcmV2aW91c0ZyYW1lKGZhbHNl
KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICB+SW1hZ2VGcmFtZVNpbmsoKSB7IGZy
ZWVCdWZmZXIoKTsgfQorCisgICAgICAgIGNvbnN0IHZvaWQqIGJ5dGVzKCkgY29uc3Q7CisgICAg
ICAgIHZvaWQqIGJ5dGVzKCk7CisgICAgICAgIGJvb2wgYWxsb2NhdGVCdWZmZXIoKTsKKyAgICAg
ICAgTmF0aXZlSW1hZ2VQdHIgZ2V0RnJhbWUoKTsKKyAgICAgICAgYm9vbCBpc0J1ZmZlclJlYWR5
KCkgY29uc3Q7CisgICAgICAgIHZvaWQgZnJlZUJ1ZmZlcigpOworCisgICAgICAgIGJvb2wgc2hv
dWxkRnJlZUJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1fc2hvdWxkRnJlZUJ1ZmZlcjsgfQorICAg
ICAgICBib29sIGNhbkZyZWVCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX2NhbkZyZWVCdWZmZXI7
IH0KKyAgICAgICAgYm9vbCBpczE2Yml0KCkgY29uc3QgeyByZXR1cm4gbV8xNmJpdDsgfQorICAg
ICAgICBjb25zdCBJbnRSZWN0JiByZWN0KCkgY29uc3QgeyByZXR1cm4gbV9yZWN0OyB9CisgICAg
ICAgIHVuc2lnbmVkIGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1faGVpZ2h0OyB9CisgICAgICAg
IHVuc2lnbmVkIGJ1ZmZlcldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9idWZmZXJXaWR0aDsgfQor
ICAgICAgICB1bnNpZ25lZCBpbWFnZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9pbWFnZVdpZHRo
OyB9CisgICAgICAgIFJHQkEzMkJ1ZmZlcjo6RnJhbWVTdGF0dXMgc3RhdHVzKCkgY29uc3QgeyBy
ZXR1cm4gbV9zdGF0dXM7IH0KKyAgICAgICAgdW5zaWduZWQgZHVyYXRpb24oKSBjb25zdCB7IHJl
dHVybiBtX2R1cmF0aW9uOyB9CisgICAgICAgIGJvb2wgaGFzQWxwaGEoKSBjb25zdCB7IHJldHVy
biBtX2hhc0FscGhhOyB9CisgICAgICAgIHVuc2lnbmVkIHRvdGFsQnl0ZXMoKSBjb25zdCB7IHJl
dHVybiBtX2J1ZmZlcldpZHRoICogbV9leHBlY3RlZEhlaWdodCA8PCAobV8xNmJpdCA/IDEgOiAy
KTsgfQorCisgICAgICAgIHZvaWQgc2V0Q2FuRnJlZUJ1ZmZlcihib29sIGNhbik7CisgICAgICAg
IGJvb2wgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgaXMxNmJpdCkKKyAgICAg
ICAgeworICAgICAgICAgICAgbV8xNmJpdCA9IGlzMTZiaXQ7CisgICAgICAgICAgICBtX2ltYWdl
V2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgIG1fZXhwZWN0ZWRIZWlnaHQgPSBoZWlnaHQ7Cisg
ICAgICAgICAgICByZXR1cm4gYWxsb2NhdGVCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICB2
b2lkIHNldFJlY3QoY29uc3QgSW50UmVjdCYgcikgeyBtX3JlY3QgPSByOyB9CisgICAgICAgIHZv
aWQgZW5zdXJlSGVpZ2h0KGludCByb3dJbmRleCk7CisgICAgICAgIHZvaWQgc2V0U3RhdHVzKFJH
QkEzMkJ1ZmZlcjo6RnJhbWVTdGF0dXMgcykgeyBtX3N0YXR1cyA9IHM7IH0KKyAgICAgICAgdm9p
ZCBzZXREdXJhdGlvbih1bnNpZ25lZCBkdXJhdGlvbikgeyBtX2R1cmF0aW9uID0gZHVyYXRpb247
IH0KKyAgICAgICAgdm9pZCBzZXRIYXNBbHBoYShib29sIGFscGhhKSB7IG1faGFzQWxwaGEgPSBh
bHBoYTsgfQorICAgICAgICBib29sIHVzZXNUcmFuc3BhcmVudENvbG9yKCkgY29uc3QgeyByZXR1
cm4gbV91c2VzVHJhbnNwYXJlbnRDb2xvcjsgfQorICAgICAgICB1bnNpZ25lZCBzaG9ydCB0cmFu
c3BhcmVudENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV90cmFuc3BhcmVudENvbG9yOyB9CisgICAg
ICAgIHZvaWQgc2V0VHJhbnNwYXJlbnRDb2xvcih1bnNpZ25lZCBzaG9ydCBjb2xvcikKKyAgICAg
ICAgeworICAgICAgICAgICAgbV90cmFuc3BhcmVudENvbG9yID0gY29sb3I7CisgICAgICAgICAg
ICBtX3VzZXNUcmFuc3BhcmVudENvbG9yID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2b2lk
IGNsZWFyVHJhbnNwYXJlbnRDb2xvcigpIHsgbV91c2VzVHJhbnNwYXJlbnRDb2xvciA9IGZhbHNl
OyB9CisgICAgICAgIFJHQkEzMkJ1ZmZlcjo6RnJhbWVEaXNwb3NhbE1ldGhvZCBkaXNwb3NhbE1l
dGhvZCgpIGNvbnN0IHsgcmV0dXJuIG1fZGlzcG9zYWxNZXRob2Q7IH0KKyAgICAgICAgdm9pZCBz
ZXREaXNwb3NhbE1ldGhvZChSR0JBMzJCdWZmZXI6OkZyYW1lRGlzcG9zYWxNZXRob2QgbWV0aG9k
KSB7IG1fZGlzcG9zYWxNZXRob2QgPSBtZXRob2Q7IH0KKyAgICAgICAgYm9vbCBjb21wb3NpdGVk
V2l0aFByZXZpb3VzRnJhbWUoKSBjb25zdCB7IHJldHVybiBtX2NvbXBvc2l0ZWRXaXRoUHJldmlv
dXNGcmFtZTsgfQorICAgICAgICB2b2lkIHNldENvbXBvc2l0ZWRXaXRoUHJldmlvdXNGcmFtZSgp
IHsgbV9jb21wb3NpdGVkV2l0aFByZXZpb3VzRnJhbWUgPSB0cnVlOyB9CisKKyAgICAgICAgc3Rh
dGljIHZvaWQgc2V0UkdCQSh1bnNpZ25lZCYgcG9zLCB1bnNpZ25lZCByLCB1bnNpZ25lZCBnLCB1
bnNpZ25lZCBiLCB1bnNpZ25lZCBhKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBzdG9y
ZSB0aGlzIGRhdGEgcHJlLW11bHRpcGxpZWQuCisgICAgICAgICAgICBpZiAoIWEpCisgICAgICAg
ICAgICAgICAgcG9zID0gKHIgPDwgMTYgfCBnIDw8IDggfCBiKTsKKyAgICAgICAgICAgIGVsc2Ug
eworICAgICAgICAgICAgICAgIGlmIChhIDwgMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIGZs
b2F0IGFscGhhUGVyY2VudCA9IGEgLyAyNTUuMGY7CisgICAgICAgICAgICAgICAgICAgIHIgPSBz
dGF0aWNfY2FzdDx1bnNpZ25lZD4ociAqIGFscGhhUGVyY2VudCk7CisgICAgICAgICAgICAgICAg
ICAgIGcgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZyAqIGFscGhhUGVyY2VudCk7CisgICAgICAg
ICAgICAgICAgICAgIGIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYiAqIGFscGhhUGVyY2VudCk7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvcyA9IChhIDw8IDI0IHwgciA8
PCAxNiB8IGcgPDwgOCB8IGIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
c3RhdGljIHZvaWQgc2V0UkdCMTYodW5zaWduZWQgc2hvcnQmIHBvcywgdW5zaWduZWQgciwgdW5z
aWduZWQgZywgdW5zaWduZWQgYikKKyAgICAgICAgeworI2lmIElNQUdFX05PX0FMUEhBX1VTRV9S
R0I1NTUKKyAgICAgICAgICAgIHBvcyA9IHVuc2lnbmVkIHNob3J0KChyID4+IDMgPDwgMTApIHwg
KGcgPj4gMyA8PCA1KSB8IChiID4+IDMpKTsKKyNlbHNlCisgICAgICAgICAgICBwb3MgPSB1bnNp
Z25lZCBzaG9ydCgociA+PiAzIDw8IDExKSB8IChnID4+IDIgPDwgNSkgfCAoYiA+PiAzKSk7Cisj
ZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBJbWFnZUZyYW1lU2luayogY3JlYXRl
SW5zdGFuY2UoYm9vbCBjYW5GcmVlQnVmZmVyKTsKKyAgICAgICAgc3RhdGljIHZvaWQgZGVsZXRl
SW5zdGFuY2UoSW1hZ2VGcmFtZVNpbmsqKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgSW50
UmVjdCBtX3JlY3Q7ICAgIC8vIFRoZSByZWN0IG9mIHRoZSBvcmlnaW5hbCBzcGVjaWZpZWQgZnJh
bWUgd2l0aGluIHRoZSBvdmVyYWxsIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IC8vIFRoaXMgd2lsbCBhbHdheXMganVzdCBiZSB0aGUgZW50aXJlIGJ1ZmZlciBleGNlcHQgZm9y
IEdJRiBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdob3NlIG9yaWdpbmFs
IHJlY3Qgd2FzIHNtYWxsZXIgdGhhbiB0aGUgb3ZlcmFsbCBpbWFnZSBzaXplLgorICAgICAgICBp
bnQgbV9pbWFnZVdpZHRoOworICAgICAgICBpbnQgbV9idWZmZXJXaWR0aDsKKyAgICAgICAgaW50
IG1faGVpZ2h0OyAvLyBUaGUgaGVpZ2h0ICh0aGUgbnVtYmVyIG9mIHJvd3Mgd2UndmUgZnVsbHkg
ZGVjb2RlZCkuCisgICAgICAgIGludCBtX2V4cGVjdGVkSGVpZ2h0OworICAgICAgICBSR0JBMzJC
dWZmZXI6OkZyYW1lU3RhdHVzIG1fc3RhdHVzOyAvLyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZyYW1l
IGlzIGNvbXBsZXRlbHkgZmluaXNoZWQgZGVjb2RpbmcuCisgICAgICAgIFJHQkEzMkJ1ZmZlcjo6
RnJhbWVEaXNwb3NhbE1ldGhvZCBtX2Rpc3Bvc2FsTWV0aG9kOyAvLyBXaGF0IHRvIGRvIHdpdGgg
dGhpcyBmcmFtZSdzIGRhdGEgd2hlbiBpbml0aWFsaXppbmcgdGhlIG5leHQgZnJhbWUuCisgICAg
ICAgIHVuc2lnbmVkIG1fZHVyYXRpb247IC8vIFRoZSBhbmltYXRpb24gZGVsYXkuCisgICAgICAg
IHVuc2lnbmVkIHNob3J0IG1fdHJhbnNwYXJlbnRDb2xvcjsgLy8gcGl4ZWwgdmFsdWUKKyAgICAg
ICAgYm9vbCBtX3VzZXNUcmFuc3BhcmVudENvbG9yOworICAgICAgICBib29sIG1faGFzQWxwaGE7
IC8vIFdoZXRoZXIgb3Igbm90IGFueSBvZiB0aGUgcGl4ZWxzIGluIHRoZSBidWZmZXIgaGF2ZSB0
cmFuc3BhcmVuY3kuCisgICAgICAgIGJvb2wgbV9jYW5GcmVlQnVmZmVyOworICAgICAgICBib29s
IG1fc2hvdWxkRnJlZUJ1ZmZlcjsKKyAgICAgICAgYm9vbCBtXzE2Yml0OworICAgICAgICBib29s
IG1fY29tcG9zaXRlZFdpdGhQcmV2aW91c0ZyYW1lOworI2lmIFBMQVRGT1JNKFdJTkNFKQorICAg
ICAgICBSZWZQdHI8U2hhcmVkQml0bWFwPiBtX2JtcDsKKyAgICAgICAgdm9pZCBmaW5pc2hCaXRt
YXAoKTsKKyNlbmRpZgorICAgIH07CisKK30KKworI2VuZGlmIC8vIElNQUdFX0ZSQU1FX1NJTktf
SF8KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFt
ZVNpbmtXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJh
bWVTaW5rV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzRm
OTgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0lt
YWdlRnJhbWVTaW5rV2luY2UuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZUZyYW1lU2luay5o
IgorCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2lm
IElNQUdFX05PX0FMUEhBX1VTRV9SR0I1NTUKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY29udmVy
dDE2VG9SR0IodW5zaWduZWQgc2hvcnQgcGl4ZWwpCit7CisgICAgdW5zaWduZWQgciA9IChwaXhl
bCA+PiA3KSAmIDB4Rjg7CisgICAgdW5zaWduZWQgZyA9IChwaXhlbCA+PiAyKSAmIDB4Rjg7Cisg
ICAgdW5zaWduZWQgYiA9IChwaXhlbCA8PCAzKSAmIDB4Rjg7CisgICAgcmV0dXJuIFJHQihyLCBn
LCBiKTsKK30KKyNlbHNlIC8vIFJHQjU2NQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjb252ZXJ0
MTZUb1JHQih1bnNpZ25lZCBzaG9ydCBwaXhlbCkKK3sKKyAgICB1bnNpZ25lZCByID0gKHBpeGVs
ID4+IDgpICYgMHhGODsKKyAgICB1bnNpZ25lZCBnID0gKHBpeGVsID4+IDMpICYgMHhGQzsKKyAg
ICB1bnNpZ25lZCBiID0gKHBpeGVsIDw8IDMpICYgMHhGODsKKyAgICByZXR1cm4gUkdCKHIsIGcs
IGIpOworfQorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3Qgdm9pZCogSW1h
Z2VGcmFtZVNpbms6OmJ5dGVzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9ibXAgPyBtX2JtcC0+
Ynl0ZXMoKSA6IDA7Cit9CisKK3ZvaWQqIEltYWdlRnJhbWVTaW5rOjpieXRlcygpCit7CisgICAg
cmV0dXJuIG1fYm1wID8gbV9ibXAtPmJ5dGVzKCkgOiAwOworfQorCitib29sIEltYWdlRnJhbWVT
aW5rOjphbGxvY2F0ZUJ1ZmZlcigpCit7CisgICAgZnJlZUJ1ZmZlcigpOworCisgICAgaWYgKG1f
aW1hZ2VXaWR0aCA8PSAwIHx8IG1fZXhwZWN0ZWRIZWlnaHQgPD0gMCkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKG1fMTZiaXQpIHsKKyAgICAgICAgbV9idWZmZXJXaWR0aCA9IG1f
aW1hZ2VXaWR0aCA+PiAxIDw8IDE7CisgICAgICAgIGlmIChtX2J1ZmZlcldpZHRoICE9IG1faW1h
Z2VXaWR0aCkKKyAgICAgICAgICAgIG1fYnVmZmVyV2lkdGggKz0gMjsKKyAgICB9IGVsc2UKKyAg
ICAgICAgbV9idWZmZXJXaWR0aCA9IG1faW1hZ2VXaWR0aDsKKworICAgIE1lbW9yeUFsbG9jYXRp
b25DYW5GYWlsIGNhbkZhaWw7CisKKyAgICBpZiAobV9ibXAgPSBTaGFyZWRCaXRtYXA6OmNyZWF0
ZUluc3RhbmNlKG1fMTZiaXQsIG1faW1hZ2VXaWR0aCwgbV9leHBlY3RlZEhlaWdodCwgdHJ1ZSkp
IHsKKyAgICAgICAgbV9ibXAtPmxvY2soKTsKKyAgICAgICAgbV9ibXAtPnNldFZhbGlkSGVpZ2h0
KDApOworICAgICAgICBpZiAobV8xNmJpdCAmJiBtX3VzZXNUcmFuc3BhcmVudENvbG9yICYmICFt
X2JtcC0+dXNlc1RyYW5zcGFyZW50Q29sb3IoKSkKKyAgICAgICAgICAgIG1fYm1wLT5zZXRUcmFu
c3BhcmVudENvbG9yKGNvbnZlcnQxNlRvUkdCKG1fdHJhbnNwYXJlbnRDb2xvcikpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSW1h
Z2VGcmFtZVNpbms6OmlzQnVmZmVyUmVhZHkoKSBjb25zdCB7IHJldHVybiAhIW1fYm1wOyB9Cit2
b2lkIEltYWdlRnJhbWVTaW5rOjpmcmVlQnVmZmVyKCkKK3sKKyAgICBpZiAobV9ibXApIHsKKyAg
ICAgICAgaWYgKCFtX2JtcC0+aGFzT25lUmVmKCkpCisgICAgICAgICAgICBmaW5pc2hCaXRtYXAo
KTsKKyAgICAgICAgbV9ibXAgPSAwOworICAgIH0KK30KKworTmF0aXZlSW1hZ2VQdHIgSW1hZ2VG
cmFtZVNpbms6OmdldEZyYW1lKCkKK3sKKyAgICBpZiAobV9zdGF0dXMgPT0gUkdCQTMyQnVmZmVy
OjpGcmFtZUVtcHR5IHx8ICFtX2JtcCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtX2JtcC0+
c2V0SGFzQWxwaGEoaGFzQWxwaGEoKSk7CisgICAgbV9zaG91bGRGcmVlQnVmZmVyID0gbV9zdGF0
dXMgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlOworICAgIGlmIChtX2NhbkZyZWVCdWZm
ZXIgJiYgbV9zaG91bGRGcmVlQnVmZmVyKQorICAgICAgICBmaW5pc2hCaXRtYXAoKTsKKworICAg
IHJldHVybiBtX2JtcDsKK30KKwordm9pZCBJbWFnZUZyYW1lU2luazo6c2V0Q2FuRnJlZUJ1ZmZl
cihib29sIGNhbikKK3sKKyAgICBtX2NhbkZyZWVCdWZmZXIgPSBjYW47CisgICAgaWYgKG1fY2Fu
RnJlZUJ1ZmZlciAmJiBtX3Nob3VsZEZyZWVCdWZmZXIpCisgICAgICAgIGZpbmlzaEJpdG1hcCgp
OworfQorCit2b2lkIEltYWdlRnJhbWVTaW5rOjpmaW5pc2hCaXRtYXAoKQoreworICAgIGlmICht
X2JtcCAmJiBtX2JtcC0+bG9ja2VkKCkpIHsKKyAgICAgICAgbV9ibXAtPnVubG9jaygpOworICAg
ICAgICBpZiAobV91c2VzVHJhbnNwYXJlbnRDb2xvcikKKyAgICAgICAgICAgIG1fYm1wLT5zZXRU
cmFuc3BhcmVudENvbG9yKGNvbnZlcnQxNlRvUkdCKG1fdHJhbnNwYXJlbnRDb2xvcikpOworICAg
ICAgICBpZiAoIW1fMTZiaXQgJiYgKCFtX2hhc0FscGhhIHx8IG1fdXNlc1RyYW5zcGFyZW50Q29s
b3IpKSB7CisgICAgICAgICAgICBtX2JtcC0+c2V0SGFzQWxwaGEoZmFsc2UpOworICAgICAgICAg
ICAgbV8xNmJpdCA9IG1fYm1wLT50bzE2Yml0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1f
MTZiaXQpCisgICAgICAgICAgICBzZXRIYXNBbHBoYShmYWxzZSk7CisgICAgICAgIG1fYm1wLT5z
ZXRIYXNBbHBoYShoYXNBbHBoYSgpKTsKKyAgICB9Cit9OworCit2b2lkIEltYWdlRnJhbWVTaW5r
OjplbnN1cmVIZWlnaHQoaW50IHJvd0luZGV4KQoreworICAgIGlmIChyb3dJbmRleCA+IG1faGVp
Z2h0KSB7CisgICAgICAgIG1faGVpZ2h0ID0gcm93SW5kZXg7CisgICAgICAgIGlmIChtX2JtcCkK
KyAgICAgICAgICAgIG1fYm1wLT5zZXRWYWxpZEhlaWdodChtX2hlaWdodCk7CisgICAgfQorfQor
CitJbWFnZUZyYW1lU2luayogSW1hZ2VGcmFtZVNpbms6OmNyZWF0ZUluc3RhbmNlKGJvb2wgY2Fu
RnJlZUJ1ZmZlcikKK3sKKyAgICByZXR1cm4gbmV3IEltYWdlRnJhbWVTaW5rKGNhbkZyZWVCdWZm
ZXIpOworfQorCit2b2lkIEltYWdlRnJhbWVTaW5rOjpkZWxldGVJbnN0YW5jZShJbWFnZUZyYW1l
U2luayogaSkKK3sKKyAgICBkZWxldGUgaTsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVNvdXJjZVdpbmNlLmNwcCBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VTb3VyY2VXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4NjAzOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VTb3VyY2VXaW5jZS5jcHAKQEAgLTAsMCArMSwy
MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHAu
dG9rZXJAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2gg
TW9iaWxlLCBJbmMKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1h
Z2VTb3VyY2UuaCIKKworI2luY2x1ZGUgIkdJRkltYWdlRGVjb2Rlci5oIgorI2luY2x1ZGUgIklt
YWdlRGVjb2Rlci5oIgorI2luY2x1ZGUgIkpQRUdJbWFnZURlY29kZXIuaCIKKyNpbmNsdWRlICJQ
TkdJbWFnZURlY29kZXIuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKKyNpbmNsdWRlIDx3
dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKworI2luY2x1ZGUgPHdpbmRv
d3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit0eXBlZGVmIEhhc2hTZXQ8U2hhcmVkQml0
bWFwKj4gQml0bWFwTWFwOworZXh0ZXJuIEJpdG1hcE1hcCBnX2JpdG1hcE1hcDsKKworaW50IGRp
c2NhcmRCaXRtYXBIYW5kbGVzKCkKK3sKKyAgICBpbnQgZGVsZXRlZCA9IDA7CisgICAgZm9yIChC
aXRtYXBNYXA6Oml0ZXJhdG9yIGkgPSBnX2JpdG1hcE1hcC5iZWdpbigpOyBpICE9IGdfYml0bWFw
TWFwLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYgKCgqaSktPmZyZWVNZW1vcnkoKSkKKyAgICAg
ICAgICAgICsrZGVsZXRlZDsKKyAgICB9CisgICAgcmV0dXJuIGRlbGV0ZWQ7Cit9CisKK3N0YXRp
YyBJbWFnZURlY29kZXIqIGNyZWF0ZURlY29kZXIoY29uc3QgU2hhcmVkQnVmZmVyKiBidWZmZXIp
Cit7CisgICAgTWVtb3J5QWxsb2NhdGlvbkNhbkZhaWwgY2FuRmFpbDsKKworICAgIC8vIFdlIG5l
ZWQgYXQgbGVhc3QgNCBieXRlcyB0byBmaWd1cmUgb3V0IHdoYXQga2luZCBvZiBpbWFnZSB3ZSdy
ZSBkZWFsaW5nIHdpdGguCisgICAgU2hhcmVkQnVmZmVyU2VnbWVudCBzZWdtZW50KCpidWZmZXIp
OworICAgIGludCBsZW5ndGggPSBzZWdtZW50Lmxlbmd0aCgpOworICAgIGlmIChsZW5ndGggPCA0
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIEdJRnMgYmVnaW4gd2l0aCBHSUY4KDcgb3Ig
OSkuCisgICAgaWYgKHN0cm5jbXAoc2VnbWVudC5kYXRhKCksICJHSUY4IiwgNCkgPT0gMCkgewor
ICAgICAgICBHSUZJbWFnZURlY29kZXIqIHJ0biA9IG5ldyBHSUZJbWFnZURlY29kZXIoKTsKKyAg
ICAgICAgaWYgKHJ0bikKKyAgICAgICAgICAgIHJ0bi0+c2V0TWF4TnVtUGl4ZWxzKDEwMjQgKiAx
MDI0KTsKKyAgICAgICAgcmV0dXJuIHJ0bjsKKyAgICB9CisKKyAgICBjb25zdCB1bnNpZ25lZCBj
aGFyKiB1Q29udGVudHMgPSAoY29uc3QgdW5zaWduZWQgY2hhciopc2VnbWVudC5kYXRhKCk7CisK
KyAgICAvLyBUZXN0IGZvciBQTkcuCisgICAgaWYgKHVDb250ZW50c1swXSA9PSAweDg5ICYmIHVD
b250ZW50c1sxXSA9PSAweDUwICYmIHVDb250ZW50c1syXSA9PSAweDRFICYmIHVDb250ZW50c1sz
XSA9PSAweDQ3ICkgeworICAgICAgICBQTkdJbWFnZURlY29kZXIqIHJ0biA9IG5ldyBQTkdJbWFn
ZURlY29kZXIoKTsKKyAgICAgICAgaWYgKHJ0bikKKyAgICAgICAgICAgIHJ0bi0+c2V0TWF4TnVt
UGl4ZWxzKDEwMjQgKiAxMDI0KTsKKyAgICAgICAgcmV0dXJuIHJ0bjsKKyAgICB9CisKKyAgICAv
LyBKUEVHCisgICAgaWYgKHVDb250ZW50c1swXSA9PSAweEZGICYmIHVDb250ZW50c1sxXSA9PSAw
eEQ4ICYmIHVDb250ZW50c1syXSA9PSAweEZGKSB7CisgICAgICAgIEpQRUdJbWFnZURlY29kZXIq
IHJ0biA9IG5ldyBKUEVHSW1hZ2VEZWNvZGVyKCk7CisgICAgICAgIGlmIChydG4pCisgICAgICAg
ICAgICBydG4tPnNldE1heE51bVBpeGVscygxMDI0ICogMTAyNCk7CisgICAgICAgIHJldHVybiBy
dG47CisgICAgfQorCisgICAgLy8gRklYTUU6IG5vdCBzdXBwb3J0aW5nIEJNUCwgSUNPIGFuZCBY
Qk0gZm9yIG5vdy4KKworICAgIC8vIEdpdmUgdXAuIFdlIGRvbid0IGtub3cgd2hhdCB0aGUgaGVj
ayB0aGlzIGlzLgorICAgIHJldHVybiAwOworfQorCitJbWFnZVNvdXJjZTo6SW1hZ2VTb3VyY2Uo
KQorICAgIDogbV9kZWNvZGVyKDApCisgICAgLCBtX2FsbERhdGFSZWNlaXZlZChmYWxzZSkKK3sK
K30KKworSW1hZ2VTb3VyY2U6On5JbWFnZVNvdXJjZSgpCit7CisgICAgZGVsZXRlIG1fZGVjb2Rl
cjsKK30KKwordm9pZCBJbWFnZVNvdXJjZTo6Y2xlYXIoYm9vbCBkZXN0cm95QWxsLCBzaXplX3Qg
Y2xlYXJCZWZvcmVGcmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhLCBib29sIGFsbERhdGFSZWNlaXZl
ZCkKK3sKKyAgICBpZiAoZGVzdHJveUFsbCkgeworICAgICAgICBkZWxldGUgbV9kZWNvZGVyOwor
ICAgICAgICBtX2RlY29kZXIgPSAwOworICAgICAgICBpZiAoZGF0YSkKKyAgICAgICAgICBzZXRE
YXRhKGRhdGEsIGFsbERhdGFSZWNlaXZlZCk7CisgICAgfSBlbHNlIGlmIChtX2RlY29kZXIpCisg
ICAgICAgIG1fZGVjb2Rlci0+Y2xlYXJGcmFtZUJ1ZmZlckNhY2hlKGNsZWFyQmVmb3JlRnJhbWUp
OworfQorCitib29sIEltYWdlU291cmNlOjppbml0aWFsaXplZCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuICEhbV9kZWNvZGVyOworfQorCit2b2lkIEltYWdlU291cmNlOjpzZXREYXRhKFNoYXJlZEJ1
ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpCit7CisgICAgLy8gTWFrZSB0aGUgZGVj
b2RlciBieSBzbmlmZmluZyB0aGUgYnl0ZXMuCisgICAgLy8gVGhpcyBtZXRob2Qgd2lsbCBleGFt
aW5lIHRoZSBkYXRhIGFuZCBpbnN0YW50aWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlh
dGUgZGVjb2RlciBwbHVnaW4uCisgICAgLy8gSWYgaW5zdWZmaWNpZW50IGJ5dGVzIGFyZSBhdmFp
bGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBpbWFnZSB0eXBlLCBubyBkZWNvZGVyIHBsdWdpbiB3aWxs
IGJlCisgICAgLy8gbWFkZS4KKyAgICBtX2FsbERhdGFSZWNlaXZlZCA9IGFsbERhdGFSZWNlaXZl
ZDsKKyAgICBpZiAobV9hbGxEYXRhUmVjZWl2ZWQgJiYgIW1fZGVjb2RlcikKKyAgICAgICAgbV9k
ZWNvZGVyID0gY3JlYXRlRGVjb2RlcihkYXRhKTsKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAg
ICAgcmV0dXJuOworICAgIG1fZGVjb2Rlci0+c2V0RGF0YShkYXRhLCBhbGxEYXRhUmVjZWl2ZWQp
OworfQorCitib29sIEltYWdlU291cmNlOjppc1NpemVBdmFpbGFibGUoKQoreworICAgIGlmICgh
bV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gbV9kZWNvZGVy
LT5pc1NpemVBdmFpbGFibGUoKTsKK30KKworSW50U2l6ZSBJbWFnZVNvdXJjZTo6c2l6ZSgpIGNv
bnN0Cit7CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybiBJbnRTaXplKCk7CisK
KyAgICByZXR1cm4gbV9kZWNvZGVyLT5zaXplKCk7Cit9CisKK2ludCBJbWFnZVNvdXJjZTo6cmVw
ZXRpdGlvbkNvdW50KCkKK3sKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIGNB
bmltYXRpb25Ob25lOworCisgICAgcmV0dXJuIG1fZGVjb2Rlci0+cmVwZXRpdGlvbkNvdW50KCk7
Cit9CisKK3NpemVfdCBJbWFnZVNvdXJjZTo6ZnJhbWVDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fZGVjb2RlciA/IG1fZGVjb2Rlci0+ZnJhbWVDb3VudCgpIDogMDsKK30KKworTmF0aXZl
SW1hZ2VQdHIgSW1hZ2VTb3VyY2U6OmNyZWF0ZUZyYW1lQXRJbmRleChzaXplX3QgaW5kZXgpCit7
CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybiAwOworCisgICAgSW1hZ2VGcmFt
ZVNpbmsqIGJ1ZmZlciA9IG1fZGVjb2Rlci0+ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKwor
ICAgIGlmICghYnVmZmVyIHx8IGJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFt
ZUVtcHR5KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBidWZmZXItPmdldEZyYW1l
KCk7Cit9CisKK2Jvb2wgSW1hZ2VTb3VyY2U6OmZyYW1lSXNDb21wbGV0ZUF0SW5kZXgoc2l6ZV90
IGluZGV4KQoreworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBJbWFnZUZyYW1lU2luayogYnVmZmVyID0gbV9kZWNvZGVyLT5mcmFtZUJ1ZmZlckF0SW5k
ZXgoaW5kZXgpOworICAgIHJldHVybiBidWZmZXIgJiYgYnVmZmVyLT5zdGF0dXMoKSA9PSBSR0JB
MzJCdWZmZXI6OkZyYW1lQ29tcGxldGU7Cit9CisKK2Zsb2F0IEltYWdlU291cmNlOjpmcmFtZUR1
cmF0aW9uQXRJbmRleChzaXplX3QgaW5kZXgpCit7CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgZmxvYXQgZHVyYXRpb247CisKKyAgICBJbWFnZUZyYW1lU2lu
ayogYnVmZmVyID0gbV9kZWNvZGVyLT5mcmFtZUJ1ZmZlckF0SW5kZXgoaW5kZXgpOworICAgIGlm
ICghYnVmZmVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGR1cmF0aW9uID0gYnVmZmVyLT5k
dXJhdGlvbigpIC8gMTAwMC4wZjsKKworICAgIC8vIE1hbnkgYW5ub3lpbmcgYWRzIHNwZWNpZnkg
YSAwIGR1cmF0aW9uIHRvIG1ha2UgYW4gaW1hZ2UgZmxhc2ggYXMgcXVpY2tseQorICAgIC8vIGFz
IHBvc3NpYmxlLiAgV2UgZm9sbG93IFdpbklFJ3MgYmVoYXZpb3IgYW5kIHVzZSBhIGR1cmF0aW9u
IG9mIDEwMCBtcworICAgIC8vIGZvciBhbnkgZnJhbWVzIHRoYXQgc3BlY2lmeSBhIGR1cmF0aW9u
IG9mIDw9IDUwIG1zLiAgU2VlCisgICAgLy8gPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTE0NDEzPiBvciBSYWRhciA0MDUxMzg5IGZvcgorICAgIC8vIG1vcmUuCisgICAg
cmV0dXJuIChkdXJhdGlvbiA8IDAuMDUxZikgPyAwLjEwMGYgOiBkdXJhdGlvbjsKK30KKworYm9v
bCBJbWFnZVNvdXJjZTo6ZnJhbWVIYXNBbHBoYUF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAg
IGlmICghbV9kZWNvZGVyIHx8ICFtX2RlY29kZXItPnN1cHBvcnRzQWxwaGEoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9IG1fZGVjb2Rlci0+
ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGJ1ZmZlci0+aGFzQWxwaGEoKTsKK30KKworSW50U2l6
ZSBJbWFnZVNvdXJjZTo6ZnJhbWVTaXplQXRJbmRleChzaXplX3QpIGNvbnN0Cit7CisgICAgcmV0
dXJuIHNpemUoKTsKK30KKworU3RyaW5nIEltYWdlU291cmNlOjpmaWxlbmFtZUV4dGVuc2lvbigp
IGNvbnN0Cit7CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsK
KyAgICByZXR1cm4gbV9kZWNvZGVyLT5maWxlbmFtZUV4dGVuc2lvbigpOworfQorCit9CisKKy8v
IHZpbTogdHM9NCBzdz00IGV0CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL0ltYWdlV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9J
bWFnZVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNiMTZh
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFn
ZVdpbmNlLmNwcApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwg
MjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAy
MDA3LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiSW1hZ2UuaCIKKworI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRl
ICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorI2luY2x1ZGUg
IlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCisjaW5j
bHVkZSA8d2luZG93cy5oPgorCitzdGF0aWMgaW5saW5lIGludCBzdGFibGVSb3VuZChkb3VibGUg
ZCkKK3sKKyAgICBpZiAoZCA+IDApCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGQg
KyAwLjUpOworCisgICAgaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGQpOworICAgIHJldHVybiBp
IC0gZCA+IDAuNSA/IGkgLSAxIDogaTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNv
dXJjZXMgZnJvbSBXZWJLaXQKK1Bhc3NSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBsb2Fk
UmVzb3VyY2VJbnRvQnVmZmVyKGNvbnN0IGNoYXIqIG5hbWUpOworCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2Jvb2wgRnJhbWVEYXRhOjpjbGVhcihib29sIGNsZWFyTWV0YURhdGEpCit7CisgICAg
aWYgKGNsZWFyTWV0YURhdGEpCisgICAgICAgIG1faGF2ZU1ldGFkYXRhID0gZmFsc2U7CisKKyAg
ICBpZiAobV9mcmFtZSkgeworICAgICAgICBtX2ZyYW1lID0gMDsKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpp
bml0UGxhdGZvcm1EYXRhKCkKK3sKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6aW52YWxpZGF0ZVBs
YXRmb3JtRGF0YSgpCit7Cit9CisKK2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVAoSEJJVE1B
UCBibXApCit7CisgICAgcmV0dXJuIGdldEhCSVRNQVBPZlNpemUoYm1wLCAwKTsKK30KKworYm9v
bCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwgTFBTSVpFIHNpemUp
Cit7CisgICAgaWYgKCFibXApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEJJVE1BUCBi
bXBJbmZvOworICAgIEdldE9iamVjdChibXAsIHNpemVvZihCSVRNQVApLCAmYm1wSW5mbyk7CisK
KyAgICBBU1NFUlQoYm1wSW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisgICAgaW50IGJ1ZmZlclNp
emUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CisKKyAgICBPd25Q
dHI8SERDPiBoZGMoQ3JlYXRlQ29tcGF0aWJsZURDKDApKTsKKyAgICBIR0RJT0JKIGhPbGRCbXAg
PSBTZWxlY3RPYmplY3QoaGRjLmdldCgpLCBibXApOworCisgICAgeworICAgICAgICBHcmFwaGlj
c0NvbnRleHQgZ2MoaGRjLmdldCgpKTsKKworICAgICAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJp
dG1hcEltYWdlOjpzaXplKCk7CisgICAgICAgIGlmIChzaXplKQorICAgICAgICAgICAgZHJhd0Zy
YW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0
aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNpemUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZv
LmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndp
ZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOworICAgIH0KKworICAg
IFNlbGVjdE9iamVjdChoZGMuZ2V0KCksIGhPbGRCbXApOworCisgICAgcmV0dXJuIHRydWU7Cit9
CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZShHcmFwaGlj
c0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50U2l6ZSYg
c3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgaW50IGZyYW1l
cyA9IGZyYW1lQ291bnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7
CisgICAgICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCA9IGZyYW1lQXRJbmRleChpKTsKKyAg
ICAgICAgaWYgKGJtcCAmJiBibXAtPmhlaWdodCgpID09IChzaXplX3Qpc3JjU2l6ZS5oZWlnaHQo
KSAmJiBibXAtPndpZHRoKCkgPT0gKHNpemVfdClzcmNTaXplLndpZHRoKCkpIHsKKyAgICAgICAg
ICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIG1f
Y3VycmVudEZyYW1lID0gaTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRS
ZWN0KDAsIDAsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9w
KTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm8gaW1hZ2Ugb2YgdGhlIGNv
cnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJlbnQgZnJh
bWUKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAgZHJh
dyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdl
U2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJh
dyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3Qg
RmxvYXRSZWN0JiBzcmNSZWN0SW4sIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQorewor
ICAgIGlmICghbV9zb3VyY2UuaW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
UmVmUHRyPFNoYXJlZEJpdG1hcD4gYm1wID0gZnJhbWVBdEluZGV4KG1fY3VycmVudEZyYW1lKTsK
KyAgICBpZiAobWF5RmlsbFdpdGhTb2xpZENvbG9yKCkpCisgICAgICAgIGZpbGxXaXRoU29saWRD
b2xvcihjdHh0LCBkc3RSZWN0LCBzb2xpZENvbG9yKCksIGNvbXBvc2l0ZU9wKTsKKyAgICBlbHNl
IHsKKyAgICAgICAgSW50UmVjdCBpbnRTcmNSZWN0KHNyY1JlY3RJbik7CisKKyAgICAgICAgaWYg
KGJtcC0+d2lkdGgoKSAhPSBtX3NvdXJjZS5zaXplKCkud2lkdGgoKSkgeworICAgICAgICAgICAg
ZG91YmxlIHJhdGUgPSAoZG91YmxlKWJtcC0+d2lkdGgoKSAvIG1fc291cmNlLnNpemUoKS53aWR0
aCgpOworICAgICAgICAgICAgaW50IHRlbXAgPSBzdGFibGVSb3VuZChzcmNSZWN0SW4ucmlnaHQo
KSAqIHJhdGUpOworICAgICAgICAgICAgaW50U3JjUmVjdC5zZXRYKHN0YWJsZVJvdW5kKHNyY1Jl
Y3RJbi54KCkgKiByYXRlKSk7CisgICAgICAgICAgICBpbnRTcmNSZWN0LnNldFdpZHRoKHRlbXAg
LSBpbnRTcmNSZWN0LngoKSk7CisgICAgICAgICAgICB0ZW1wID0gc3RhYmxlUm91bmQoc3JjUmVj
dEluLmJvdHRvbSgpICogcmF0ZSk7CisgICAgICAgICAgICBpbnRTcmNSZWN0LnNldFkoc3RhYmxl
Um91bmQoc3JjUmVjdEluLnkoKSAqIHJhdGUpKTsKKyAgICAgICAgICAgIGludFNyY1JlY3Quc2V0
SGVpZ2h0KHRlbXAgLSBpbnRTcmNSZWN0LnkoKSk7CisgICAgICAgIH0KKyAgICAgICAgYm1wLT5k
cmF3KGN0eHQsIGVuY2xvc2luZ0ludFJlY3QoZHN0UmVjdCksIGludFNyY1JlY3QsIGNvbXBvc2l0
ZU9wKTsKKyAgICB9CisKKyAgICBzdGFydEFuaW1hdGlvbigpOworfQorCitQYXNzUmVmUHRyPElt
YWdlPiBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAg
ICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBidWZmZXIgPSBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKG5h
bWUpOworICAgIFJlZlB0cjxCaXRtYXBJbWFnZT4gaW1nID0gQml0bWFwSW1hZ2U6OmNyZWF0ZSgp
OworICAgIGltZy0+c2V0RGF0YShidWZmZXIucmVsZWFzZSgpLCB0cnVlKTsKKyAgICByZXR1cm4g
aW1nOworfQorCit2b2lkIEltYWdlOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQs
IGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3QsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBw
YXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2lu
dCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0
KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXdQ
YXR0ZXJuKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdElu
LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRv
ciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBSZWZQdHI8U2hhcmVkQml0
bWFwPiBibXAgPSBuYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgIGlmIChibXApCisg
ICAgICAgIGJtcC0+ZHJhd1BhdHRlcm4oY3R4dCwgdGlsZVJlY3RJbiwgcGF0dGVyblRyYW5zZm9y
bSwgcGhhc2UsIG9wLCBkZXN0UmVjdCwgbV9zb3VyY2Uuc2l6ZSgpKTsKK30KKwordm9pZCBCaXRt
YXBJbWFnZTo6Y2hlY2tGb3JTb2xpZENvbG9yKCkKK3sKKyAgICBpZiAobV9jaGVja2VkRm9yU29s
aWRDb2xvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGZyYW1lQ291bnQoKSAhPSAxKSB7
CisgICAgICAgIG1faXNTb2xpZENvbG9yID0gZmFsc2U7CisgICAgICAgIG1fY2hlY2tlZEZvclNv
bGlkQ29sb3IgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUmVmUHRyPFNo
YXJlZEJpdG1hcD4gYm1wID0gZnJhbWVBdEluZGV4KDApOworICAgIGlmICghYm1wIHx8ICFibXAt
PnZhbGlkSGVpZ2h0KCkpIHsKKyAgICAgICAgbV9pc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChibXAtPndpZHRoKCkgPT0gMSAmJiBibXAtPnZh
bGlkSGVpZ2h0KCkgPT0gMSkgeworICAgICAgICBtX2lzU29saWRDb2xvciA9IHRydWU7CisKKyAg
ICAgICAgaWYgKGJtcC0+aXMxNmJpdCgpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBj
ID0gKCh1bnNpZ25lZCBzaG9ydCAqKWJtcC0+Ynl0ZXMoKSlbMF07CisjaWYgSU1BR0VfTk9fQUxQ
SEFfVVNFX1JHQjU1NQorICAgICAgICAgICAgaW50IHIgPSAoYyA+PiA3KSAmIDB4Rjg7CisgICAg
ICAgICAgICBpbnQgZyA9IChjID4+IDIpICYgMHhGODsKKyAgICAgICAgICAgIGludCBiID0gKGMg
PDwgMykgJiAweEY4OworI2Vsc2UKKyAgICAgICAgICAgIGludCByID0gKGMgPj4gOCkgJiAweEY4
OworICAgICAgICAgICAgaW50IGcgPSAoYyA+PiAzKSAmIDB4RkM7CisgICAgICAgICAgICBpbnQg
YiA9IChjIDw8IDMpICYgMHhGODsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGJtcC0+dXNlc1Ry
YW5zcGFyZW50Q29sb3IoKSAmJiBibXAtPnRyYW5zcGFyZW50Q29sb3IoKSA9PSBSR0IociwgZywg
YikpCisgICAgICAgICAgICAgICAgbV9zb2xpZENvbG9yID0gQ29sb3IociwgZywgYiwgMCk7Cisg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9zb2xpZENvbG9yID0gQ29sb3Iociwg
ZywgYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjID0gKCh1bnNp
Z25lZCAqKWJtcC0+Ynl0ZXMoKSlbMF07CisgICAgICAgICAgICBtX3NvbGlkQ29sb3IgPSBDb2xv
cihjKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChibXAtPnZhbGlkSGVpZ2h0KCkgPT0gYm1w
LT5oZWlnaHQoKSkKKyAgICAgICAgICAgIG1fY2hlY2tlZEZvclNvbGlkQ29sb3IgPSB0cnVlOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIG1faXNTb2xpZENvbG9yID0gZmFsc2U7CisgICAgICAgIG1f
Y2hlY2tlZEZvclNvbGlkQ29sb3IgPSB0cnVlOworICAgIH0KK30KKworCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01l
ZGlhUGxheWVyUHJpdmF0ZVdpbmNlLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L01lZGlhUGxheWVyUHJpdmF0ZVdpbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uZmYzOGFkYQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaApAQCAtMCwwICsxLDEyOSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBNZWRpYVBsYXllclByaXZhdGVXaW5jZV9o
CisjZGVmaW5lIE1lZGlhUGxheWVyUHJpdmF0ZVdpbmNlX2gKKworI2lmIEVOQUJMRShWSURFTykK
KworI2luY2x1ZGUgIk1lZGlhUGxheWVyUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisj
aW5jbHVkZSA8d3RmL093blB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFz
cyBHcmFwaGljc0NvbnRleHQ7CisgICAgY2xhc3MgSW50U2l6ZTsKKyAgICBjbGFzcyBJbnRSZWN0
OworICAgIGNsYXNzIFN0cmluZzsKKworICAgIGNsYXNzIE1lZGlhUGxheWVyUHJpdmF0ZSA6IHB1
YmxpYyBNZWRpYVBsYXllclByaXZhdGVJbnRlcmZhY2UgeworICAgIHB1YmxpYzoKKyAgICAgICAg
c3RhdGljIHZvaWQgcmVnaXN0ZXJNZWRpYUVuZ2luZShNZWRpYUVuZ2luZVJlZ2lzdHJhcik7CisK
KyAgICAgICAgfk1lZGlhUGxheWVyUHJpdmF0ZSgpOworCisgICAgICAgIEludFNpemUgbmF0dXJh
bFNpemUoKSBjb25zdDsKKyAgICAgICAgYm9vbCBoYXNWaWRlbygpIGNvbnN0OworCisgICAgICAg
IHZvaWQgbG9hZChjb25zdCBTdHJpbmcmIHVybCk7CisgICAgICAgIHZvaWQgY2FuY2VsTG9hZCgp
OworCisgICAgICAgIHZvaWQgcGxheSgpOworICAgICAgICB2b2lkIHBhdXNlKCk7CisKKyAgICAg
ICAgYm9vbCBwYXVzZWQoKSBjb25zdDsKKyAgICAgICAgYm9vbCBzZWVraW5nKCkgY29uc3Q7CisK
KyAgICAgICAgZmxvYXQgZHVyYXRpb24oKSBjb25zdDsKKyAgICAgICAgZmxvYXQgY3VycmVudFRp
bWUoKSBjb25zdDsKKyAgICAgICAgdm9pZCBzZWVrKGZsb2F0IHRpbWUpOworICAgICAgICB2b2lk
IHNldEVuZFRpbWUoZmxvYXQpOworCisgICAgICAgIHZvaWQgc2V0UmF0ZShmbG9hdCk7CisgICAg
ICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0KTsKKworICAgICAgICBpbnQgZGF0YVJhdGUoKSBjb25z
dDsKKworICAgICAgICBNZWRpYVBsYXllcjo6TmV0d29ya1N0YXRlIG5ldHdvcmtTdGF0ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fbmV0d29ya1N0YXRlOyB9CisgICAgICAgIE1lZGlhUGxheWVyOjpSZWFk
eVN0YXRlIHJlYWR5U3RhdGUoKSBjb25zdCB7IHJldHVybiBtX3JlYWR5U3RhdGU7IH0KKworICAg
ICAgICBmbG9hdCBtYXhUaW1lQnVmZmVyZWQoKSBjb25zdDsKKyAgICAgICAgZmxvYXQgbWF4VGlt
ZVNlZWthYmxlKCkgY29uc3Q7CisgICAgICAgIHVuc2lnbmVkIGJ5dGVzTG9hZGVkKCkgY29uc3Q7
CisgICAgICAgIGJvb2wgdG90YWxCeXRlc0tub3duKCkgY29uc3Q7CisgICAgICAgIHVuc2lnbmVk
IHRvdGFsQnl0ZXMoKSBjb25zdDsKKworICAgICAgICB2b2lkIHNldFZpc2libGUoYm9vbCk7Cisg
ICAgICAgIHZvaWQgc2V0U2l6ZShjb25zdCBJbnRTaXplJik7CisKKyAgICAgICAgdm9pZCBsb2Fk
U3RhdGVDaGFuZ2VkKCk7CisgICAgICAgIHZvaWQgZGlkRW5kKCk7CisKKyAgICAgICAgdm9pZCBw
YWludChHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICBwcml2YXRlOgor
ICAgICAgICBNZWRpYVBsYXllclByaXZhdGUoTWVkaWFQbGF5ZXIqKTsKKworICAgICAgICB2b2lk
IHVwZGF0ZVN0YXRlcygpOworICAgICAgICB2b2lkIGRvU2VlaygpOworICAgICAgICB2b2lkIGNh
bmNlbFNlZWsoKTsKKyAgICAgICAgdm9pZCBzZWVrVGltZXJGaXJlZChUaW1lcjxNZWRpYVBsYXll
clByaXZhdGU+Kik7CisgICAgICAgIGZsb2F0IG1heFRpbWVMb2FkZWQoKSBjb25zdDsKKyAgICAg
ICAgdm9pZCBzYXdVbnN1cHBvcnRlZFRyYWNrcygpOworI2lmIEVOQUJMRShQTFVHSU5fUFJPWFlf
Rk9SX1ZJREVPKQorICAgICAgICB2b2lkIHNldE1lZGlhUGxheWVyUHJveHkoV2ViTWVkaWFQbGF5
ZXJQcm94eSopOworICAgICAgICB2b2lkIHNldFBvc3Rlcihjb25zdCBTdHJpbmcmIHVybCk7Cisg
ICAgICAgIHZvaWQgZGVsaXZlck5vdGlmaWNhdGlvbihNZWRpYVBsYXllclByb3h5Tm90aWZpY2F0
aW9uVHlwZSk7CisjZW5kaWYKKworICAgICAgICAvLyBlbmdpbmUgc3VwcG9ydAorICAgICAgICBz
dGF0aWMgTWVkaWFQbGF5ZXJQcml2YXRlSW50ZXJmYWNlKiBjcmVhdGUoTWVkaWFQbGF5ZXIqKTsK
KyAgICAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkVHlwZXMoSGFzaFNldDxTdHJpbmc+JiB0
eXBlcyk7CisgICAgICAgIHN0YXRpYyBNZWRpYVBsYXllcjo6U3VwcG9ydHNUeXBlIHN1cHBvcnRz
VHlwZShjb25zdCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmluZyYgY29kZWNzKTsKKyAgICAgICAg
c3RhdGljIGJvb2wgaXNBdmFpbGFibGUoKTsKKworICAgICAgICBNZWRpYVBsYXllciogbV9wbGF5
ZXI7CisgICAgICAgIGZsb2F0IG1fc2Vla1RvOworICAgICAgICBmbG9hdCBtX2VuZFRpbWU7Cisg
ICAgICAgIFRpbWVyPE1lZGlhUGxheWVyUHJpdmF0ZT4gbV9zZWVrVGltZXI7CisgICAgICAgIE1l
ZGlhUGxheWVyOjpOZXR3b3JrU3RhdGUgbV9uZXR3b3JrU3RhdGU7CisgICAgICAgIE1lZGlhUGxh
eWVyOjpSZWFkeVN0YXRlIG1fcmVhZHlTdGF0ZTsKKyAgICAgICAgdW5zaWduZWQgbV9lbmFibGVk
VHJhY2tDb3VudDsKKyAgICAgICAgdW5zaWduZWQgbV90b3RhbFRyYWNrQ291bnQ7CisgICAgICAg
IGJvb2wgbV9oYXNVbnN1cHBvcnRlZFRyYWNrczsKKyAgICAgICAgYm9vbCBtX3N0YXJ0ZWRQbGF5
aW5nOworICAgICAgICBib29sIG1faXNTdHJlYW1pbmc7CisjaWYgRU5BQkxFKFBMVUdJTl9QUk9Y
WV9GT1JfVklERU8pCisgICAgICAgIFdlYk1lZGlhUGxheWVyUHJveHkqIG1fcHJveHk7CisjZW5k
aWYKKyAgICB9OworCit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcm94eS5jcHAgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJveHkuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOTJkNDAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJveHkuY3BwCkBAIC0wLDAgKzEs
MTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24s
IE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWYgRU5BQkxFKFZJREVPKQorCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTWVkaWFQbGF5ZXJQcm94eS5oIgorCisjaW5jbHVkZSAi
RG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJIVE1MUGx1Z0luRWxlbWVudC5oIgorI2luY2x1
ZGUgIkhUTUxWaWRlb0VsZW1lbnQuaCIKKyNpbmNsdWRlICJKU0RPTUJpbmRpbmcuaCIKKyNpbmNs
dWRlICJKU1BsdWdpbkVsZW1lbnRGdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXllci5o
IgorI2luY2x1ZGUgIk5vZGUuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1
ZGUgIlBsdWdpblZpZXcuaCIKKyNpbmNsdWRlICJSZW5kZXJQYXJ0T2JqZWN0LmgiCisjaW5jbHVk
ZSAiUmVuZGVyV2lkZ2V0LmgiCisjaW5jbHVkZSAiV2lkZ2V0LmgiCisjaW5jbHVkZSAiY19jbGFz
cy5oIgorI2luY2x1ZGUgImNfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjX3J1bnRpbWUuaCIKKyNp
bmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgorI2luY2x1ZGUgInJ1bnRpbWUuaCIKKyNpbmNsdWRl
IDxydW50aW1lL0lkZW50aWZpZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIEpTQzsKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordXNpbmcgbmFtZXNwYWNlIEJpbmRpbmdzOwordXNpbmcgbmFtZXNwYWNl
IEhUTUxOYW1lczsKKworV2ViTWVkaWFQbGF5ZXJQcm94eTo6V2ViTWVkaWFQbGF5ZXJQcm94eShN
ZWRpYVBsYXllciogcGxheWVyKQorOiBtX21lZGlhUGxheWVyKHBsYXllcikKKywgbV9pbml0KGZh
bHNlKQorLCBtX2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luKGZhbHNlKQoreworICAgIGlmICghbV9p
bml0KQorICAgICAgICBpbml0RW5naW5lKCk7Cit9CisKK1dlYk1lZGlhUGxheWVyUHJveHk6On5X
ZWJNZWRpYVBsYXllclByb3h5KCkKK3sKKyAgICBtX2luc3RhbmNlLnJlbGVhc2UoKTsKK30KK1Nj
cmlwdEluc3RhbmNlIFdlYk1lZGlhUGxheWVyUHJveHk6OnBsdWdpbkluc3RhbmNlKCkKK3sKKyAg
ICBpZiAoIW1faW5zdGFuY2UpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiByID0gZWxlbWVudCgp
LT5yZW5kZXJlcigpOworICAgICAgICBpZiAoIXIgfHwgIXItPmlzV2lkZ2V0KCkpCisgICAgICAg
ICAgICByZXR1cm4gMDsKKworICAgICAgICBGcmFtZSogZnJhbWUgPSBlbGVtZW50KCktPmRvY3Vt
ZW50KCktPmZyYW1lKCk7CisKKyAgICAgICAgUmVuZGVyV2lkZ2V0KiByZW5kZXJXaWRnZXQgPSBz
dGF0aWNfY2FzdDxSZW5kZXJXaWRnZXQqPihlbGVtZW50KCktPnJlbmRlcmVyKCkpOworICAgICAg
ICBpZiAocmVuZGVyV2lkZ2V0ICYmIHJlbmRlcldpZGdldC0+d2lkZ2V0KCkpCisgICAgICAgICAg
ICBtX2luc3RhbmNlID0gZnJhbWUtPnNjcmlwdCgpLT5jcmVhdGVTY3JpcHRJbnN0YW5jZUZvcldp
ZGdldChyZW5kZXJXaWRnZXQtPndpZGdldCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbV9pbnN0
YW5jZTsKK30KK3ZvaWQgV2ViTWVkaWFQbGF5ZXJQcm94eTo6bG9hZChjb25zdCBTdHJpbmcmIHVy
bCkKK3sKKyAgICBpZiAoIW1faW5pdCkKKyAgICAgICAgaW5pdEVuZ2luZSgpOworICAgIGlmICht
X2luaXQpCisgICAgICAgIGludm9rZU1ldGhvZCgicGxheSIpOworfQordm9pZCBXZWJNZWRpYVBs
YXllclByb3h5Ojppbml0RW5naW5lKCkKK3sKKyAgICBIVE1MTWVkaWFFbGVtZW50KiBlbGVtZW50
ID0gc3RhdGljX2Nhc3Q8SFRNTE1lZGlhRWxlbWVudCo+KG1fbWVkaWFQbGF5ZXItPm1lZGlhUGxh
eWVyQ2xpZW50KCkpOworICAgIFZlY3RvcjxTdHJpbmc+IHBhcmFtTmFtZXM7CisgICAgVmVjdG9y
PFN0cmluZz4gcGFyYW1WYWx1ZXM7CisgICAgU3RyaW5nIHNlcnZpY2VUeXBlOworICAgIFN0cmlu
ZyB1cmwgPSBlbGVtZW50LT5pbml0aWFsVVJMKCk7CisKKyAgICBpZiAodXJsLmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWUqIGZyYW1lID0gZWxlbWVudC0+ZG9jdW1lbnQo
KS0+ZnJhbWUoKTsKKworICAgIC8vIGFkZCBhbGwgYXR0cmlidXRlcyBzZXQgb24gdGhlIGVtYmVk
IG9iamVjdAorICAgIE5hbWVkTm9kZU1hcCogYSA9IGVsZW1lbnQtPmF0dHJpYnV0ZXMoKTsKKyAg
ICBpZiAoYSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYS0+bGVuZ3RoKCk7
ICsraSkgeworICAgICAgICAgICAgQXR0cmlidXRlKiBpdCA9IGEtPmF0dHJpYnV0ZUl0ZW0oaSk7
CisgICAgICAgICAgICBwYXJhbU5hbWVzLmFwcGVuZChpdC0+bmFtZSgpLmxvY2FsTmFtZSgpLnN0
cmluZygpKTsKKyAgICAgICAgICAgIHBhcmFtVmFsdWVzLmFwcGVuZChpdC0+dmFsdWUoKS5zdHJp
bmcoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgc2VydmljZVR5cGUgPSAiYXBwbGljYXRpb24v
eC1tcGxheWVyMiI7CisgICAgZnJhbWUtPmxvYWRlcigpLT5yZXF1ZXN0T2JqZWN0KHN0YXRpY19j
YXN0PFJlbmRlclBhcnRPYmplY3QqPihlbGVtZW50LT5yZW5kZXJlcigpKSwgdXJsLCBudWxsQXRv
bSwgc2VydmljZVR5cGUsIHBhcmFtTmFtZXMsIHBhcmFtVmFsdWVzKTsKKyAgICBtX2luaXQgPSB0
cnVlOworICAgIHBhcmFtTmFtZXMuY2xlYXIoKTsKKyAgICBwYXJhbVZhbHVlcy5jbGVhcigpOwor
Cit9CisKK0hUTUxNZWRpYUVsZW1lbnQqIFdlYk1lZGlhUGxheWVyUHJveHk6OmVsZW1lbnQoKQor
eworICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MTWVkaWFFbGVtZW50Kj4obV9tZWRpYVBsYXll
ci0+bWVkaWFQbGF5ZXJDbGllbnQoKSk7CisKK30KKwordm9pZCBXZWJNZWRpYVBsYXllclByb3h5
OjppbnZva2VNZXRob2QoY29uc3QgU3RyaW5nJiBtZXRob2ROYW1lKQoreworICAgIEZyYW1lKiBm
cmFtZSA9IGVsZW1lbnQoKS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKKyAgICBSb290T2JqZWN0ICpy
b290ID0gZnJhbWUtPnNjcmlwdCgpLT5iaW5kaW5nUm9vdE9iamVjdCgpOworICAgIGlmICghcm9v
dCkKKyAgICAgICAgcmV0dXJuOworICAgIEV4ZWNTdGF0ZSAqZXhlYyA9IHJvb3QtPmdsb2JhbE9i
amVjdCgpLT5nbG9iYWxFeGVjKCk7CisgICAgSW5zdGFuY2UqIGluc3RhbmNlID0gcGx1Z2luSW5z
dGFuY2UoKS5nZXQoKTsKKyAgICBpZiAoIWluc3RhbmNlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpbnN0YW5jZS0+YmVnaW4oKTsKKyAgICBDbGFzcyAqYUNsYXNzID0gaW5zdGFuY2UtPmdldENs
YXNzKCk7CisgICAgSWRlbnRpZmllciBpZGVuKGV4ZWMsIG1ldGhvZE5hbWUpOworICAgIE1ldGhv
ZExpc3QgbWV0aG9kTGlzdCA9IGFDbGFzcy0+bWV0aG9kc05hbWVkKGlkZW4sIGluc3RhbmNlKTsK
KyAgICBBcmdMaXN0IGFyZ3M7CisgICAgLypKU1ZhbHVlUHRyIHJlc3VsdCA9Ki8KKyAgICBpbnN0
YW5jZS0+aW52b2tlTWV0aG9kKGV4ZWMsIG1ldGhvZExpc3QgLCBhcmdzKTsKKyAgICBpbnN0YW5j
ZS0+ZW5kKCk7Cit9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJveHkuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcm94eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLmNmNmVkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJveHkuaApAQCAtMCwwICsxLDcwIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICog
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyAqLworCisKKyNpZm5kZWYgTWVkaWFQbGF5ZXJQcm94eV9oCisjZGVmaW5lIE1lZGlh
UGxheWVyUHJveHlfaAorCisjaW5jbHVkZSAiU2NyaXB0SW5zdGFuY2UuaCIKKworI2lmIEVOQUJM
RShWSURFTykKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgSW50UmVjdDsKKyAg
ICBjbGFzcyBJbnRTaXplOworICAgIGNsYXNzIFN0cmluZzsKKyAgICBjbGFzcyBNZWRpYVBsYXll
cjsKKyAgICBjbGFzcyBQbHVnaW5WaWV3OworICAgIGNsYXNzIEhUTUxNZWRpYUVsZW1lbnQ7CisK
KyAgICBlbnVtIE1lZGlhUGxheWVyUHJveHlOb3RpZmljYXRpb25UeXBlIHsKKyAgICAgICAgTWVk
aWFQbGF5ZXJOb3RpZmljYXRpb25QbGF5UGF1c2VCdXR0b25QcmVzc2VkLAorICAgICAgICBJZGxl
LAorICAgICAgICBMb2FkaW5nLAorICAgICAgICBMb2FkZWQsCisgICAgICAgIEZvcm1hdEVycm9y
LAorICAgICAgICBOZXR3b3JrRXJyb3IsCisgICAgICAgIERlY29kZUVycm9yCisgICAgfTsKKwor
ICAgIGNsYXNzIFdlYk1lZGlhUGxheWVyUHJveHkgeworICAgIHB1YmxpYzoKKyAgICAgICAgV2Vi
TWVkaWFQbGF5ZXJQcm94eShNZWRpYVBsYXllciogcGxheWVyKTsKKyAgICAgICAgfldlYk1lZGlh
UGxheWVyUHJveHkoKTsKKworICAgICAgICBNZWRpYVBsYXllciogbWVkaWFQbGF5ZXIoKSB7cmV0
dXJuIG1fbWVkaWFQbGF5ZXI7fQorICAgICAgICB2b2lkIGluaXRFbmdpbmUoKTsKKyAgICAgICAg
dm9pZCBsb2FkKGNvbnN0IFN0cmluZyYgdXJsKTsKKyAgICAgICAgSFRNTE1lZGlhRWxlbWVudCog
ZWxlbWVudCgpOworICAgICAgICB2b2lkIGludm9rZU1ldGhvZChjb25zdCBTdHJpbmcmIG1ldGhv
ZE5hbWUpOworICAgICAgICBTY3JpcHRJbnN0YW5jZSBwbHVnaW5JbnN0YW5jZSgpOworCisgICAg
cHJpdmF0ZToKKyAgICAgICAgTWVkaWFQbGF5ZXIqIG1fbWVkaWFQbGF5ZXI7CisgICAgICAgIGJv
b2wgbV9pbml0OworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3KiBtX3BsdWdpblZpZXc7Cisg
ICAgICAgIGJvb2wgbV9oYXNTZW50UmVzcG9uc2VUb1BsdWdpbjsKKyAgICAgICAgU2NyaXB0SW5z
dGFuY2UgbV9pbnN0YW5jZTsKKyAgICB9OworCit9CisjZW5kaWYgLy8gRU5BQkxFKFZJREVPKQor
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0
aFdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbmNlLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmRhYjljCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwCkBA
IC0wLDAgKzEsMTU2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1v
YmlsZSwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGF0
aC5oIgorCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKKyNpbmNsdWRlICJQbGF0Zm9ybVBhdGhXaW5jZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3Ry
aW5nLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlIDx3dGYv
T3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGF0aDo6UGF0aCgpCis6IG1fcGF0
aChuZXcgUGxhdGZvcm1QYXRoKCkpCit7Cit9CisKK1BhdGg6On5QYXRoKCkKK3sKKyAgICBkZWxl
dGUgbV9wYXRoOworfQorCitQYXRoOjpQYXRoKGNvbnN0IFBhdGgmIG90aGVyKQorOiBtX3BhdGgo
bmV3IFBsYXRmb3JtUGF0aCgqb3RoZXIubV9wYXRoKSkKK3sKK30KKworUGF0aCYgUGF0aDo6b3Bl
cmF0b3I9KGNvbnN0IFBhdGgmIG90aGVyKQoreworICAgIG1fcGF0aCA9IG5ldyBQbGF0Zm9ybVBh
dGgoKm90aGVyLm1fcGF0aCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIFBhdGg6OmNv
bnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAorewor
ICAgIHJldHVybiBtX3BhdGgtPmNvbnRhaW5zKHBvaW50LCBydWxlKTsKK30KKwordm9pZCBQYXRo
Ojp0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIG1fcGF0aC0+dHJhbnNs
YXRlKHNpemUpOworfQorCitGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdSZWN0KCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9wYXRoLT5ib3VuZGluZ1JlY3QoKTsKK30KKwordm9pZCBQYXRoOjptb3Zl
VG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgbV9wYXRoLT5tb3ZlVG8ocG9pbnQp
OworfQorCit2b2lkIFBhdGg6OmFkZExpbmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sK
KyAgICBtX3BhdGgtPmFkZExpbmVUbyhwb2ludCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkUXVhZEN1
cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAg
bV9wYXRoLT5hZGRRdWFkQ3VydmVUbyhjcCwgcCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQmV6aWVy
Q3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjcDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNwMiwgY29u
c3QgRmxvYXRQb2ludCYgcCkKK3sKKyAgICBtX3BhdGgtPmFkZEJlemllckN1cnZlVG8oY3AxLCBj
cDIsIHApOworfQorCit2b2lkIFBhdGg6OmFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmIHAxLCBj
b25zdCBGbG9hdFBvaW50JiBwMiwgZmxvYXQgcmFkaXVzKQoreworICAgIG1fcGF0aC0+YWRkQXJj
VG8ocDEsIHAyLCByYWRpdXMpOworfQorCit2b2lkIFBhdGg6OmNsb3NlU3VicGF0aCgpCit7Cisg
ICAgbV9wYXRoLT5jbG9zZVN1YnBhdGgoKTsKK30KKwordm9pZCBQYXRoOjphZGRBcmMoY29uc3Qg
RmxvYXRQb2ludCYgcCwgZmxvYXQgciwgZmxvYXQgc2FyLCBmbG9hdCBlYXIsIGJvb2wgYW50aWNs
b2Nrd2lzZSkKK3sKKyAgICBtX3BhdGgtPmFkZEVsbGlwc2UocCwgciwgciwgc2FyLCBlYXIsIGFu
dGljbG9ja3dpc2UpOworfQorCit2b2lkIFBhdGg6OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiBy
KQoreworICAgIG1fcGF0aC0+YWRkUmVjdChyKTsKK30KKwordm9pZCBQYXRoOjphZGRFbGxpcHNl
KGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICBGbG9hdFNpemUgcmFkaXVzKHIud2lkdGgoKSAq
IDAuNSwgci5oZWlnaHQoKSAqIDAuNSk7CisgICAgbV9wYXRoLT5hZGRFbGxpcHNlKHIpOworfQor
Cit2b2lkIFBhdGg6OmNsZWFyKCkKK3sKKyAgICBtX3BhdGgtPmNsZWFyKCk7Cit9CisKK2Jvb2wg
UGF0aDo6aXNFbXB0eSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+aXNFbXB0eSgpOwor
fQorCitTdHJpbmcgUGF0aDo6ZGVidWdTdHJpbmcoKSBjb25zdAoreworICAgIHJldHVybiBtX3Bh
dGgtPmRlYnVnU3RyaW5nKCk7Cit9CisKK3ZvaWQgUGF0aDo6YXBwbHkodm9pZCogaW5mbywgUGF0
aEFwcGxpZXJGdW5jdGlvbiBmdW5jdGlvbikgY29uc3QKK3sKKyAgICBtX3BhdGgtPmFwcGx5KGlu
Zm8sIGZ1bmN0aW9uKTsKK30KKwordm9pZCBQYXRoOjp0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIHQpCit7CisgICAgbV9wYXRoLT50cmFuc2Zvcm0odCk7Cit9CisKK0Zsb2F0
UmVjdCBQYXRoOjpzdHJva2VCb3VuZGluZ1JlY3QoU3Ryb2tlU3R5bGVBcHBsaWVyICopCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gRmxvYXRSZWN0KCk7Cit9CisKK2Jvb2wg
UGF0aDo6c3Ryb2tlQ29udGFpbnMoU3Ryb2tlU3R5bGVBcHBsaWVyKiwgY29uc3QgRmxvYXRQb2lu
dCYpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK2Jvb2wgUGF0aDo6aGFzQ3VycmVudFBvaW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gIWlz
RW1wdHkoKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi4wNzg5NjRhCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5jcHAKQEAgLTAsMCArMSw4MDMgQEAKKy8qCisgKiAg
Q29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
KyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVBhdGhXaW5jZS5oIgorCisjaW5j
bHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVk
ZSAiUGF0aC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiVHJhbnNm
b3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKKyNpbmNsdWRlIDx3
aW5kb3dzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gSW1wbGVtZW50ZWQgaW4gR3Jh
cGhpY3NDb250ZXh0V2luY2UuY3BwCit2b2lkIGdldEVsbGlwc2VQb2ludEJ5QW5nbGUoZG91Ymxl
IGFuZ2xlLCBkb3VibGUgYSwgZG91YmxlIGIsIGZsb2F0JiB4LCBmbG9hdCYgeSk7CisKK3N0YXRp
YyB2b2lkIHF1YWRDdXJ2ZShpbnQgc2VnbWVudHMsIFZlY3RvcjxQYXRoUG9pbnQ+JiBwdHMsIGNv
bnN0IFBhdGhQb2ludCogY29udHJvbCkKK3sKKyAgICBjb25zdCBmbG9hdCBzdGVwID0gMS4wIC8g
c2VnbWVudHM7CisgICAgcmVnaXN0ZXIgZmxvYXQgdEEgPSAwLjA7CisgICAgcmVnaXN0ZXIgZmxv
YXQgdEIgPSAxLjA7CisKKyAgICBmbG9hdCBjMXggPSBjb250cm9sWzBdLngoKTsKKyAgICBmbG9h
dCBjMXkgPSBjb250cm9sWzBdLnkoKTsKKyAgICBmbG9hdCBjMnggPSBjb250cm9sWzFdLngoKTsK
KyAgICBmbG9hdCBjMnkgPSBjb250cm9sWzFdLnkoKTsKKyAgICBmbG9hdCBjM3ggPSBjb250cm9s
WzJdLngoKTsKKyAgICBmbG9hdCBjM3kgPSBjb250cm9sWzJdLnkoKTsKKworICAgIGNvbnN0IGlu
dCBvZmZzZXQgPSBwdHMuc2l6ZSgpOworICAgIHB0cy5yZXNpemUob2Zmc2V0ICsgc2VnbWVudHMp
OworICAgIFBhdGhQb2ludCBwcDsKKyAgICBwcC5tX3ggPSBjMXg7CisgICAgcHAubV95ID0gYzF5
OworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50czsgKytpKSB7CisgICAgICAgIHRB
ICs9IHN0ZXA7CisgICAgICAgIHRCIC09IHN0ZXA7CisKKyAgICAgICAgY29uc3QgZmxvYXQgYSA9
IHRCICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAyLjAgKiB0QSAqIHRCOworICAgICAg
ICBjb25zdCBmbG9hdCBjID0gdEEgKiB0QTsKKworICAgICAgICBwcC5tX3ggPSBjMXggKiBhICsg
YzJ4ICogYiArIGMzeCAqIGM7CisgICAgICAgIHBwLm1feSA9IGMxeSAqIGEgKyBjMnkgKiBiICsg
YzN5ICogYzsKKworICAgICAgICBwdHNbb2Zmc2V0ICsgaSAtIDFdID0gcHA7CisgICAgfQorCisg
ICAgcHAubV94ID0gYzN4OworICAgIHBwLm1feSA9IGMzeTsKKyAgICBwdHNbb2Zmc2V0ICsgc2Vn
bWVudHMgLSAxXSA9IHBwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmV6aWVyKGludCBzZWdt
ZW50cywgVmVjdG9yPFBhdGhQb2ludD4mIHB0cywgY29uc3QgUGF0aFBvaW50KiBjb250cm9sKQor
eworICAgIGNvbnN0IGZsb2F0IHN0ZXAgPSAxLjAgLyBzZWdtZW50czsKKyAgICByZWdpc3RlciBm
bG9hdCB0QSA9IDAuMDsKKyAgICByZWdpc3RlciBmbG9hdCB0QiA9IDEuMDsKKworICAgIGZsb2F0
IGMxeCA9IGNvbnRyb2xbMF0ueCgpOworICAgIGZsb2F0IGMxeSA9IGNvbnRyb2xbMF0ueSgpOwor
ICAgIGZsb2F0IGMyeCA9IGNvbnRyb2xbMV0ueCgpOworICAgIGZsb2F0IGMyeSA9IGNvbnRyb2xb
MV0ueSgpOworICAgIGZsb2F0IGMzeCA9IGNvbnRyb2xbMl0ueCgpOworICAgIGZsb2F0IGMzeSA9
IGNvbnRyb2xbMl0ueSgpOworICAgIGZsb2F0IGM0eCA9IGNvbnRyb2xbM10ueCgpOworICAgIGZs
b2F0IGM0eSA9IGNvbnRyb2xbM10ueSgpOworCisgICAgY29uc3QgaW50IG9mZnNldCA9IHB0cy5z
aXplKCk7CisgICAgcHRzLnJlc2l6ZShvZmZzZXQgKyBzZWdtZW50cyk7CisgICAgUGF0aFBvaW50
IHBwOworICAgIHBwLm1feCA9IGMxeDsKKyAgICBwcC5tX3kgPSBjMXk7CisKKyAgICBmb3IgKGlu
dCBpID0gMTsgaSA8IHNlZ21lbnRzOyArK2kpIHsKKyAgICAgICAgdEEgKz0gc3RlcDsKKyAgICAg
ICAgdEIgLT0gc3RlcDsKKyAgICAgICAgY29uc3QgZmxvYXQgdEFzcSA9IHRBICogdEE7CisgICAg
ICAgIGNvbnN0IGZsb2F0IHRCc3EgPSB0QiAqIHRCOworCisgICAgICAgIGNvbnN0IGZsb2F0IGEg
PSB0QnNxICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAzLjAgKiB0QSAqIHRCc3E7Cisg
ICAgICAgIGNvbnN0IGZsb2F0IGMgPSAzLjAgKiB0QiAqIHRBc3E7CisgICAgICAgIGNvbnN0IGZs
b2F0IGQgPSB0QXNxICogdEE7CisKKyAgICAgICAgcHAubV94ID0gYzF4ICogYSArIGMyeCAqIGIg
KyBjM3ggKiBjICsgYzR4ICogZDsKKyAgICAgICAgcHAubV95ID0gYzF5ICogYSArIGMyeSAqIGIg
KyBjM3kgKiBjICsgYzR5ICogZDsKKworICAgICAgICBwdHNbb2Zmc2V0ICsgaSAtIDFdID0gcHA7
CisgICAgfQorCisgICAgcHAubV94ID0gYzR4OworICAgIHBwLm1feSA9IGM0eTsKKyAgICBwdHNb
b2Zmc2V0ICsgc2VnbWVudHMgLSAxXSA9IHBwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdGFi
bGVSb3VuZChkb3VibGUgZCkKK3sKKyAgICBpZiAoZCA+IDApCisgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxpbnQ+KGQgKyAwLjUpOworCisgICAgaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGQp
OworICAgIHJldHVybiBpIC0gZCA+IDAuNSA/IGkgLSAxIDogaTsKK30KKworc3RhdGljIGJvb2wg
Y29udGFpbnNQb2ludChjb25zdCBGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7
CisgICAgcmV0dXJuIHAueCgpID49IHIueCgpICYmIHAueSgpID49IHIueSgpICYmIHAueCgpIDwg
ci5yaWdodCgpICYmIHAueSgpIDwgci5ib3R0b20oKTsKK30KKworI2RlZmluZSBQSSAgICAgICAg
My4xNDE1OTI2NTM1ODk3OTMyMzg0NgorCitzdGF0aWMgdm9pZCBub3JtYWxpemVBbmdsZShmbG9h
dCYgYW5nbGUpCit7CisgICAgd2hpbGUgKGFuZ2xlIDwgMCkKKyAgICAgICAgYW5nbGUgKz0gMiAq
IFBJOworICAgIHdoaWxlIChhbmdsZSA+PSAyICogUEkpCisgICAgICAgIGFuZ2xlIC09IDIgKiBQ
STsKKyAgICBpZiAoYW5nbGUgPCAwLjAwMDAxKQorICAgICAgICBhbmdsZSA9IDA7Cit9CisKK3N0
YXRpYyB2b2lkIHRyYW5zZm9ybUFyY1BvaW50KGZsb2F0JiB4LCBmbG9hdCYgeSwgY29uc3QgRmxv
YXRQb2ludCYgYykKK3sKKyAgICB4ICs9IGMueCgpOworICAgIHkgKz0gYy55KCk7Cit9CisKK3N0
YXRpYyB2b2lkIGluZmxhdGVSZWN0VG9Db250YWluUG9pbnQoRmxvYXRSZWN0JiByLCBmbG9hdCB4
LCBmbG9hdCB5KQoreworICAgIGlmIChyLmlzRW1wdHkoKSkgeworICAgICAgICByLnNldFgoeCk7
CisgICAgICAgIHIuc2V0WSh5KTsKKyAgICAgICAgci5zZXRTaXplKEZsb2F0U2l6ZSgxLCAxKSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHggPCByLngoKSkgeworICAgICAgICBy
LnNldFdpZHRoKHIucmlnaHQoKSAtIHgpOworICAgICAgICByLnNldFgoeCk7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgZmxvYXQgdyA9IHggLSByLngoKSArIDE7CisgICAgICAgIGlmICh3ID4gci53
aWR0aCgpKQorICAgICAgICAgICAgci5zZXRXaWR0aCh3KTsKKyAgICB9CisgICAgaWYgKHkgPCBy
LnkoKSkgeworICAgICAgICByLnNldEhlaWdodChyLmJvdHRvbSgpIC0geSk7CisgICAgICAgIHIu
c2V0WSh5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCBoID0gIHkgLSByLnkoKSArIDE7
CisgICAgICAgIGlmIChoID4gci5oZWlnaHQoKSkKKyAgICAgICAgICAgIHIuc2V0SGVpZ2h0KGgp
OworICAgIH0KK30KKworLy8gcmV0dXJuIDAtYmFzZWQgdmFsdWU6IDAgLSBmaXJzdCBRdWFkcmFu
dCAoIDAgLSA5MCBkZWdyZWUpCitzdGF0aWMgaW5saW5lIGludCBxdWFkcmFudChjb25zdCBQYXRo
UG9pbnQmIHBvaW50LCBjb25zdCBQYXRoUG9pbnQmIG9yaWdQb2ludCkKK3sKKyAgICByZXR1cm4g
cG9pbnQubV94IDwgb3JpZ1BvaW50Lm1feCA/CisgICAgICAgIChwb2ludC5tX3kgPCBvcmlnUG9p
bnQubV95ID8gMiA6IDEpCisgICAgICAgIDogKHBvaW50Lm1feSA8IG9yaWdQb2ludC5tX3kgPyAz
IDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25MZWZ0KGludCBxKSB7
IHJldHVybiBxID09IDEgfHwgcSA9PSAyOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgaXNRdWFkcmFu
dE9uUmlnaHQoaW50IHEpIHsgcmV0dXJuIHEgPT0gMCB8fCBxID09IDM7IH0KK3N0YXRpYyBpbmxp
bmUgYm9vbCBpc1F1YWRyYW50T25Ub3AoaW50IHEpIHsgcmV0dXJuIHEgPT0gMiB8fCBxID09IDM7
IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25Cb3R0b20oaW50IHEpIHsgcmV0dXJu
IHEgPT0gMCB8fCBxID09IDE7IH0KKworc3RhdGljIGlubGluZSBpbnQgbmV4dFF1YWRyYW50KGlu
dCBxKSB7IHJldHVybiBxID09IDMgPyAwIDogcSArIDE7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHF1
YWRyYW50RGlmZihpbnQgcTEsIGludCBxMikKK3sKKyAgICBpbnQgZCA9IHExIC0gcTI7CisgICAg
d2hpbGUgKGQgPCAwKQorICAgICAgICBkICs9IDQ7CisgICAgcmV0dXJuIGQ7Cit9CisKK3N0cnVj
dCBQYXRoVmVjdG9yIHsKKyAgICBmbG9hdCBtX3g7CisgICAgZmxvYXQgbV95OworCisgICAgUGF0
aFZlY3RvcigpIDogbV94KDApLCBtX3koMCkge30KKyAgICBQYXRoVmVjdG9yKGZsb2F0IHgsIGZs
b2F0IHkpIDogbV94KHgpLCBtX3koeSkge30KKyAgICBkb3VibGUgYW5nbGUoKSBjb25zdCB7IHJl
dHVybiBhdGFuMihtX3ksIG1feCk7IH0KKyAgICBvcGVyYXRvciBkb3VibGUgKCkgY29uc3QgeyBy
ZXR1cm4gYW5nbGUoKTsgfQorICAgIGRvdWJsZSBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBfaHlw
b3QobV94LCBtX3kpOyB9Cit9OworCitQYXRoVmVjdG9yIG9wZXJhdG9yLShjb25zdCBQYXRoUG9p
bnQmIHAxLCBjb25zdCBQYXRoUG9pbnQmIHAyKSB7IHJldHVybiBQYXRoVmVjdG9yKHAxLm1feCAt
IHAyLm1feCwgcDEubV95IC0gcDIubV95KTsgfQorCitzdGF0aWMgdm9pZCBhZGRBcmNQb2ludChQ
YXRoUG9seWdvbiYgcG9seSwgY29uc3QgUGF0aFBvaW50JiBjZW50ZXIsIGNvbnN0IFBhdGhQb2lu
dCYgcmFkaXVzLCBkb3VibGUgYW5nbGUpCit7CisgICAgUGF0aFBvaW50IHA7CisgICAgZ2V0RWxs
aXBzZVBvaW50QnlBbmdsZShhbmdsZSwgcmFkaXVzLm1feCwgcmFkaXVzLm1feSwgcC5tX3gsIHAu
bV95KTsKKyAgICB0cmFuc2Zvcm1BcmNQb2ludChwLm1feCwgcC5tX3ksIGNlbnRlcik7CisgICAg
aWYgKHBvbHkuaXNFbXB0eSgpIHx8IHBvbHkubGFzdCgpICE9IHApCisgICAgICAgIHBvbHkuYXBw
ZW5kKHApOworfQorCitzdGF0aWMgdm9pZCBhZGRBcmNQb2ludHMoUGF0aFBvbHlnb24mIHBvbHks
IGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvJiBkYXRhKQoreworICAgIGNvbnN0IFBh
dGhQb2ludCYgc3RhcnRQb2ludCA9IHBvbHkubGFzdCgpOworICAgIGRvdWJsZSBjdXJBbmdsZSA9
IHN0YXJ0UG9pbnQgLSBkYXRhLm1fY2VudGVyOworICAgIGRvdWJsZSBlbmRBbmdsZSA9IGRhdGEu
bV9lbmQgLSBkYXRhLm1fY2VudGVyOworICAgIGRvdWJsZSBhbmdsZVN0ZXAgPSAyLiAvIHN0ZDo6
bWF4KGRhdGEubV9yYWRpdXMubV94LCBkYXRhLm1fcmFkaXVzLm1feSk7CisgICAgaWYgKGRhdGEu
bV9jbG9ja3dpc2UpIHsKKyAgICAgICAgaWYgKGVuZEFuZ2xlIDw9IGN1ckFuZ2xlIHx8IHN0YXJ0
UG9pbnQgPT0gZGF0YS5tX2VuZCkKKyAgICAgICAgICAgIGVuZEFuZ2xlICs9IDIgKiBQSTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBhbmdsZVN0ZXAgPSAtYW5nbGVTdGVwOworICAgICAgICBpZiAo
ZW5kQW5nbGUgPj0gY3VyQW5nbGUgfHwgc3RhcnRQb2ludCA9PSBkYXRhLm1fZW5kKQorICAgICAg
ICAgICAgZW5kQW5nbGUgLT0gMiAqIFBJOworICAgIH0KKworICAgIGZvciAoY3VyQW5nbGUgKz0g
YW5nbGVTdGVwOyBkYXRhLm1fY2xvY2t3aXNlID8gY3VyQW5nbGUgPCBlbmRBbmdsZSA6IGN1ckFu
Z2xlID4gZW5kQW5nbGU7IGN1ckFuZ2xlICs9IGFuZ2xlU3RlcCkKKyAgICAgICAgYWRkQXJjUG9p
bnQocG9seSwgZGF0YS5tX2NlbnRlciwgZGF0YS5tX3JhZGl1cywgY3VyQW5nbGUpOworCisgICAg
aWYgKHBvbHkuaXNFbXB0eSgpIHx8IHBvbHkubGFzdCgpICE9IGRhdGEubV9lbmQpCisgICAgICAg
IHBvbHkuYXBwZW5kKGRhdGEubV9lbmQpOworfQorCitzdGF0aWMgdm9pZCBkcmF3UG9seWdvbnMo
SERDIGRjLCBjb25zdCBWZWN0b3I8UGF0aFBvbHlnb24+JiBwb2x5Z29ucywgYm9vbCBmaWxsLCBj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogdHIpCit7CisgICAgTWVtb3J5QWxsb2NhdGlvbkNh
bkZhaWwgY2FuRmFpbDsKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9seWdvbj46OmNvbnN0X2l0ZXJh
dG9yIGkgPSBwb2x5Z29ucy5iZWdpbigpOyBpICE9IHBvbHlnb25zLmVuZCgpOyArK2kpIHsKKyAg
ICAgICAgaW50IG5wb2ludHMgPSBpLT5zaXplKCk7CisgICAgICAgIGlmICghbnBvaW50cykKKyAg
ICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIFBPSU5UKiB3aW5Qb2ludHMgPSAwOworICAg
ICAgICBpZiAoZmlsbCkgeworICAgICAgICAgICAgaWYgKG5wb2ludHMgPiAyKQorICAgICAgICAg
ICAgICAgIHdpblBvaW50cyA9IG5ldyBQT0lOVFtucG9pbnRzICsgMV07CisgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgd2luUG9pbnRzID0gbmV3IFBPSU5UW25wb2ludHNdOworCisgICAgICAg
IGlmICh3aW5Qb2ludHMpIHsKKyAgICAgICAgICAgIGlmICh0cikgeworICAgICAgICAgICAgICAg
IGZvciAoaW50IGkyID0gMDsgaTIgPCBucG9pbnRzOyArK2kyKSB7CisgICAgICAgICAgICAgICAg
ICAgIEZsb2F0UG9pbnQgdHJQb2ludCA9IHRyLT5tYXBQb2ludChpLT5hdChpMikpOworICAgICAg
ICAgICAgICAgICAgICB3aW5Qb2ludHNbaTJdLnggPSBzdGFibGVSb3VuZCh0clBvaW50LngoKSk7
CisgICAgICAgICAgICAgICAgICAgIHdpblBvaW50c1tpMl0ueSA9IHN0YWJsZVJvdW5kKHRyUG9p
bnQueSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIGZvciAoaW50IGkyID0gMDsgaTIgPCBucG9pbnRzOyArK2kyKSB7CisgICAgICAg
ICAgICAgICAgICAgIHdpblBvaW50c1tpMl0ueCA9IHN0YWJsZVJvdW5kKGktPmF0KGkyKS54KCkp
OworICAgICAgICAgICAgICAgICAgICB3aW5Qb2ludHNbaTJdLnkgPSBzdGFibGVSb3VuZChpLT5h
dChpMikueSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGlmIChmaWxsICYmIHdpblBvaW50c1tucG9pbnRzIC0gMV0gIT0gd2luUG9pbnRzWzBdKSB7
CisgICAgICAgICAgICAgICAgd2luUG9pbnRzW25wb2ludHNdLnggPSB3aW5Qb2ludHNbMF0ueDsK
KyAgICAgICAgICAgICAgICB3aW5Qb2ludHNbbnBvaW50c10ueSA9IHdpblBvaW50c1swXS55Owor
ICAgICAgICAgICAgICAgICsrbnBvaW50czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
aWYgKGZpbGwpCisgICAgICAgICAgICAgICAgOjpQb2x5Z29uKGRjLCB3aW5Qb2ludHMsIG5wb2lu
dHMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIDo6UG9seWxpbmUoZGMsIHdp
blBvaW50cywgbnBvaW50cyk7CisgICAgICAgICAgICBkZWxldGVbXSB3aW5Qb2ludHM7CisgICAg
ICAgIH0KKyAgICB9Cit9CisKKworaW50IFBsYXRmb3JtUGF0aEVsZW1lbnQ6Om51bUNvbnRyb2xQ
b2ludHMoKSBjb25zdAoreworICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgY2FzZSBQYXRoTW92
ZVRvOgorICAgIGNhc2UgUGF0aExpbmVUbzoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBQ
YXRoUXVhZEN1cnZlVG86CisgICAgY2FzZSBQYXRoQXJjVG86CisgICAgICAgIHJldHVybiAyOwor
ICAgIGNhc2UgUGF0aEJlemllckN1cnZlVG86CisgICAgICAgIHJldHVybiAzOworICAgIC8vY2Fz
ZSBQYXRoQ2xvc2VTdWJwYXRoOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAg
IH0KK30KKworaW50IFBsYXRmb3JtUGF0aEVsZW1lbnQ6Om51bVBvaW50cygpIGNvbnN0Cit7Cisg
ICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICBjYXNlIFBhdGhNb3ZlVG86CisgICAgY2FzZSBQYXRo
TGluZVRvOgorICAgIGNhc2UgUGF0aEFyY1RvOgorICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNl
IFBhdGhRdWFkQ3VydmVUbzoKKyAgICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBQYXRoQmV6aWVy
Q3VydmVUbzoKKyAgICAgICAgcmV0dXJuIDM7CisgICAgLy9jYXNlIFBhdGhDbG9zZVN1YnBhdGg6
CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCit2b2lkIFBhdGhQ
b2x5Z29uOjptb3ZlKGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0KQoreworICAgIGZvciAoVmVjdG9y
PFBhdGhQb2ludD46Oml0ZXJhdG9yIGkgPSBiZWdpbigpOyBpIDwgZW5kKCk7ICsraSkKKyAgICAg
ICAgaS0+bW92ZShvZmZzZXQpOworfQorCit2b2lkIFBhdGhQb2x5Z29uOjp0cmFuc2Zvcm0oY29u
c3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpCit7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvaW50
Pjo6aXRlcmF0b3IgaSA9IGJlZ2luKCk7IGkgPCBlbmQoKTsgKytpKQorICAgICAgICAqaSA9IHQu
bWFwUG9pbnQoKmkpOworfQorCitib29sIFBhdGhQb2x5Z29uOjpjb250YWlucyhjb25zdCBGbG9h
dFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBpZiAoc2l6ZSgpIDwgMykKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgaW50IGludGVyc2VjdGVkID0gMDsKKyAgICBjb25zdCBQYXRoUG9p
bnQqIHBvaW50MSA9ICZsYXN0KCk7CisgICAgVmVjdG9yPFBhdGhQb2ludD46OmNvbnN0X2l0ZXJh
dG9yIGxhc3QgPSBlbmQoKTsKKyAgICBpbnQgd2FzTmVnYXRpdmUgPSAyOworICAgIGZvciAoVmVj
dG9yPFBhdGhQb2ludD46OmNvbnN0X2l0ZXJhdG9yIGkgPSBiZWdpbigpOyBpICE9IGxhc3Q7ICsr
aSkgeworICAgICAgICBjb25zdCBQYXRoUG9pbnQmIHBvaW50MiA9ICppOworICAgICAgICBpZiAo
cG9pbnQxLT54KCkgIT0gcG9pbnQueCgpKSB7CisgICAgICAgICAgICBpZiAocG9pbnQyLngoKSA9
PSBwb2ludC54KCkpCisgICAgICAgICAgICAgICAgd2FzTmVnYXRpdmUgPSBwb2ludDEtPngoKSA8
IHBvaW50LngoKSA/IDEgOiAwOworICAgICAgICAgICAgZWxzZSBpZiAocG9pbnQyLngoKSA8IHBv
aW50LngoKSAhPSBwb2ludDEtPngoKSA8IHBvaW50LngoKSkgeworICAgICAgICAgICAgICAgIGZs
b2F0IHkgPSAocG9pbnQyLnkoKSAtIHBvaW50MS0+eSgpKSAvIChwb2ludDIueCgpIC0gcG9pbnQx
LT54KCkpICogKHBvaW50LngoKSAtIHBvaW50MS0+eCgpKSArIHBvaW50MS0+eSgpOworICAgICAg
ICAgICAgICAgIGlmICh5ID49IHBvaW50LnkoKSkKKyAgICAgICAgICAgICAgICAgICAgKytpbnRl
cnNlY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlm
IChwb2ludDEtPnkoKSA9PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICAgICAgICAgIGlmIChwb2ludDEtPnkoKSA+IHBvaW50LnkoKSkgeworICAgICAgICAg
ICAgICAgIGlmIChwb2ludDIueCgpID09IHBvaW50LngoKSkgeworICAgICAgICAgICAgICAgICAg
ICBpZiAocG9pbnQyLnkoKSA8PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAg
ICBpZiAod2FzTmVnYXRpdmUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9y
PFBhdGhQb2ludD46OmNvbnN0X2l0ZXJhdG9yIGpMYXN0ID0gaTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBqID0gaTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9
PSBiZWdpbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbGFzdDsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC0tajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoai0+eCgpICE9IHBv
aW50LngoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoai0+eCgpID4g
cG9pbnQueCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzTmVnYXRp
dmUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNOZWdhdGl2ZSA9IDE7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGogIT0gakxhc3QpOworCisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAod2FzTmVnYXRpdmUgPT0gMikKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgaWYgKHdhc05lZ2F0aXZlID8gcG9pbnQyLngoKSA+IHBvaW50LngoKSA6IHBv
aW50Mi54KCkgPCBwb2ludC54KCkpCisgICAgICAgICAgICAgICAgICAgICAgICArK2ludGVyc2Vj
dGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9pbnQyLngo
KSA9PSBwb2ludC54KCkgJiYgcG9pbnQyLnkoKSA+PSBwb2ludC55KCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcG9pbnQxID0gJnBvaW50MjsKKyAg
ICB9CisKKyAgICByZXR1cm4gaW50ZXJzZWN0ZWQgJiAxOworfQorCit2b2lkIFBsYXRmb3JtUGF0
aEVsZW1lbnQ6Om1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpCit7CisgICAgaW50IG4gPSBu
dW1Db250cm9sUG9pbnRzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAg
ICAgIG1fZGF0YS5tX3BvaW50c1tpXS5tb3ZlKG9mZnNldCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1Q
YXRoRWxlbWVudDo6dHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQorewor
ICAgIGludCBuID0gbnVtQ29udHJvbFBvaW50cygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
bjsgKytpKSB7CisgICAgICAgIEZsb2F0UG9pbnQgcCA9IHQubWFwUG9pbnQobV9kYXRhLm1fcG9p
bnRzW2ldKTsKKyAgICAgICAgbV9kYXRhLm1fcG9pbnRzW2ldLnNldChwLngoKSwgcC55KCkpOwor
ICAgIH0KK30KKwordm9pZCBQbGF0Zm9ybVBhdGhFbGVtZW50OjppbmZsYXRlUmVjdFRvQ29udGFp
bk1lKEZsb2F0UmVjdCYgciwgY29uc3QgRmxvYXRQb2ludCYgbGFzdFBvaW50KSBjb25zdAorewor
ICAgIGlmIChtX3R5cGUgPT0gUGF0aEFyY1RvKSB7CisgICAgICAgIGNvbnN0IEFyY1RvJiBkYXRh
ID0gbV9kYXRhLm1fYXJjVG9EYXRhOworICAgICAgICBQYXRoUG9pbnQgc3RhcnRQb2ludDsKKyAg
ICAgICAgc3RhcnRQb2ludCA9IGxhc3RQb2ludDsKKyAgICAgICAgUGF0aFBvaW50IGVuZFBvaW50
ID0gZGF0YS5tX2VuZDsKKyAgICAgICAgaWYgKCFkYXRhLm1fY2xvY2t3aXNlKQorICAgICAgICAg
ICAgc3RkOjpzd2FwKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTsKKworICAgICAgICBpbnQgcTAgPSBx
dWFkcmFudChzdGFydFBvaW50LCBkYXRhLm1fY2VudGVyKTsKKyAgICAgICAgaW50IHExID0gcXVh
ZHJhbnQoZW5kUG9pbnQsIGRhdGEubV9jZW50ZXIpOworICAgICAgICBib29sIGNvbnRhaW5zRXh0
cmVtZXNbNF0gPSB7IGZhbHNlIH07IC8vIGJvdHRvbSwgbGVmdCwgdG9wLCByaWdodAorICAgICAg
ICBzdGF0aWMgY29uc3QgUGF0aFBvaW50IGV4dHJlbWVWZWN0b3JzWzRdID0geyB7IDAsIDEgfSwg
eyAtMSwgMCB9LCB7IDAsIC0xIH0sIHsgMSwgMCB9IH07CisgICAgICAgIGlmIChxMCA9PSBxMSkg
eworICAgICAgICAgICAgaWYgKHN0YXJ0UG9pbnQubV94ID09IGVuZFBvaW50Lm1feCB8fCBpc1F1
YWRyYW50T25Cb3R0b20ocTApICE9IHN0YXJ0UG9pbnQubV94ID4gZW5kUG9pbnQubV94KSB7Cisg
ICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICAg
ICAgICAgIGNvbnRhaW5zRXh0cmVtZXNbaV0gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGV4dHJlbWUgPSBxMDsKKyAgICAgICAgICAgIGlu
dCBkaWZmID0gcXVhZHJhbnREaWZmKHExLCBxMCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IGRpZmY7ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5zRXh0cmVtZXNbZXh0
cmVtZV0gPSB0cnVlOworICAgICAgICAgICAgICAgIGV4dHJlbWUgPSBuZXh0UXVhZHJhbnQoZXh0
cmVtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbmZsYXRlUmVjdFRv
Q29udGFpblBvaW50KHIsIHN0YXJ0UG9pbnQubV94LCBzdGFydFBvaW50Lm1feSk7CisgICAgICAg
IGluZmxhdGVSZWN0VG9Db250YWluUG9pbnQociwgZW5kUG9pbnQubV94LCBlbmRQb2ludC5tX3kp
OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAgICAgaWYg
KGNvbnRhaW5zRXh0cmVtZXNbaV0pCisgICAgICAgICAgICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRh
aW5Qb2ludChyLCBkYXRhLm1fY2VudGVyLm1feCArIGRhdGEubV9yYWRpdXMubV94ICogZXh0cmVt
ZVZlY3RvcnNbaV0ubV94LCBkYXRhLm1fY2VudGVyLm1feSArIGRhdGEubV9yYWRpdXMubV95ICog
ZXh0cmVtZVZlY3RvcnNbaV0ubV95KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAg
IGludCBuID0gbnVtUG9pbnRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytp
KQorICAgICAgICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChyLCBtX2RhdGEubV9wb2lu
dHNbaV0ubV94LCBtX2RhdGEubV9wb2ludHNbaV0ubV95KTsKKyAgICB9Cit9CisKK1BhdGhFbGVt
ZW50VHlwZSBQbGF0Zm9ybVBhdGhFbGVtZW50Ojp0eXBlKCkgY29uc3QKK3sKKyAgICBzd2l0Y2gg
KG1fdHlwZSkgeworICAgIGNhc2UgUGF0aE1vdmVUbzoKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVt
ZW50TW92ZVRvUG9pbnQ7CisgICAgY2FzZSBQYXRoTGluZVRvOgorICAgICAgICByZXR1cm4gUGF0
aEVsZW1lbnRBZGRMaW5lVG9Qb2ludDsKKyAgICBjYXNlIFBhdGhBcmNUbzoKKyAgICAgICAgLy8g
RklYTUU6IHRoZXJlJ3Mgbm8gYXJjVG8gdHlwZSBmb3IgUGF0aEVsZW1lbnQKKyAgICAgICAgcmV0
dXJuIFBhdGhFbGVtZW50QWRkTGluZVRvUG9pbnQ7CisgICAgICAgIC8vIHJldHVybiBQYXRoRWxl
bWVudEFkZFF1YWRDdXJ2ZVRvUG9pbnQ7CisgICAgY2FzZSBQYXRoUXVhZEN1cnZlVG86CisgICAg
ICAgIHJldHVybiBQYXRoRWxlbWVudEFkZFF1YWRDdXJ2ZVRvUG9pbnQ7CisgICAgY2FzZSBQYXRo
QmV6aWVyQ3VydmVUbzoKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRkQ3VydmVUb1BvaW50
OworICAgIC8vY2FzZSBQYXRoQ2xvc2VTdWJwYXRoOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJl
dHVybiBQYXRoRWxlbWVudENsb3NlU3VicGF0aDsKKyAgICB9Cit9CisKK1BsYXRmb3JtUGF0aDo6
UGxhdGZvcm1QYXRoKCkKKzogbV9wZW5MaWZ0ZWQodHJ1ZSkKK3sKKyAgICBtX2N1cnJlbnRQb2lu
dC5jbGVhcigpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6ZW5zdXJlU3VicGF0aCgpCit7Cisg
ICAgaWYgKG1fcGVuTGlmdGVkKSB7CisgICAgICAgIG1fcGVuTGlmdGVkID0gZmFsc2U7CisgICAg
ICAgIG1fc3VicGF0aHMuYXBwZW5kKFBhdGhQb2x5Z29uKCkpOworICAgICAgICBtX3N1YnBhdGhz
Lmxhc3QoKS5hcHBlbmQobV9jdXJyZW50UG9pbnQpOworICAgIH0gZWxzZQorICAgICAgICBBU1NF
UlQoIW1fc3VicGF0aHMuaXNFbXB0eSgpKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFRv
U3VicGF0aChjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBlKQoreworICAgIGlmIChlLnBsYXRm
b3JtVHlwZSgpID09IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhNb3ZlVG8pIHsKKyAgICAgICAg
bV9wZW5MaWZ0ZWQgPSB0cnVlOworICAgICAgICBtX2N1cnJlbnRQb2ludCA9IGUucG9pbnRBdCgw
KTsKKyAgICB9IGVsc2UgaWYgKGUucGxhdGZvcm1UeXBlKCkgPT0gUGxhdGZvcm1QYXRoRWxlbWVu
dDo6UGF0aENsb3NlU3VicGF0aCkgeworICAgICAgICBtX3BlbkxpZnRlZCA9IHRydWU7CisgICAg
ICAgIGlmICghbV9zdWJwYXRocy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChtX2N1cnJl
bnRQb2ludCAhPSBtX3N1YnBhdGhzLmxhc3QoKVswXSkgeworICAgICAgICAgICAgICAgIC8vIEFj
Y29yZGluZyB0byBXM0MsIHdlIGhhdmUgdG8gZHJhdyBhIGxpbmUgZnJvbSBjdXJyZW50IHBvaW50
IHRvIHRoZSBpbml0aWFsIHBvaW50CisgICAgICAgICAgICAgICAgbV9zdWJwYXRocy5sYXN0KCku
YXBwZW5kKG1fc3VicGF0aHMubGFzdCgpWzBdKTsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRQ
b2ludCA9IG1fc3VicGF0aHMubGFzdCgpWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVs
c2UKKyAgICAgICAgICAgIG1fY3VycmVudFBvaW50LmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgZW5zdXJlU3VicGF0aCgpOworICAgICAgICBzd2l0Y2ggKGUucGxhdGZvcm1UeXBlKCkp
IHsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoTGluZVRvOgorICAgICAg
ICAgICAgbV9zdWJwYXRocy5sYXN0KCkuYXBwZW5kKGUucG9pbnRBdCgwKSk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQXJjVG86Cisg
ICAgICAgICAgICBhZGRBcmNQb2ludHMobV9zdWJwYXRocy5sYXN0KCksIGUuYXJjVG8oKSk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRo
UXVhZEN1cnZlVG86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGF0aFBvaW50IGNv
bnRyb2xbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50UG9pbnQsCisgICAgICAg
ICAgICAgICAgICAgIGUucG9pbnRBdCgwKSwKKyAgICAgICAgICAgICAgICAgICAgZS5wb2ludEF0
KDEpLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2lj
IG51bWJlcj8KKyAgICAgICAgICAgICAgICBxdWFkQ3VydmUoNTAsIG1fc3VicGF0aHMubGFzdCgp
LCBjb250cm9sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIFBhdGhQb2ludCBjb250cm9sW10gPSB7CisgICAgICAgICAgICAg
ICAgICAgIG1fY3VycmVudFBvaW50LAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMCks
CisgICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgxKSwKKyAgICAgICAgICAgICAgICAgICAg
ZS5wb2ludEF0KDIpLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgLy8gRklY
TUU6IG1hZ2ljIG51bWJlcj8KKyAgICAgICAgICAgICAgICBiZXppZXIoMTAwLCBtX3N1YnBhdGhz
Lmxhc3QoKSwgY29udHJvbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1f
Y3VycmVudFBvaW50ID0gbV9zdWJwYXRocy5sYXN0KCkubGFzdCgpOworICAgIH0KK30KKwordm9p
ZCBQbGF0Zm9ybVBhdGg6OmFwcGVuZChjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBlKQorewor
ICAgIGUuaW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShtX2JvdW5kaW5nUmVjdCwgbGFzdFBvaW50KCkp
OworICAgIGFkZFRvU3VicGF0aChlKTsKKyAgICBtX2VsZW1lbnRzLmFwcGVuZChlKTsKK30KKwor
dm9pZCBQbGF0Zm9ybVBhdGg6OmFwcGVuZChjb25zdCBQbGF0Zm9ybVBhdGgmIHApCit7CisgICAg
Y29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudHMmIGUgPSBwLmVsZW1lbnRzKCk7CisgICAgZm9yIChQ
bGF0Zm9ybVBhdGhFbGVtZW50czo6Y29uc3RfaXRlcmF0b3IgaXQoZS5iZWdpbigpKTsgaXQgIT0g
ZS5lbmQoKTsgKytpdCkgeworICAgICAgICBhZGRUb1N1YnBhdGgoKml0KTsKKyAgICAgICAgaXQt
PmluZmxhdGVSZWN0VG9Db250YWluTWUobV9ib3VuZGluZ1JlY3QsIGxhc3RQb2ludCgpKTsKKyAg
ICAgICAgbV9lbGVtZW50cy5hcHBlbmQoKml0KTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1Q
YXRoOjpjbGVhcigpCit7CisgICAgbV9lbGVtZW50cy5jbGVhcigpOworICAgIG1fYm91bmRpbmdS
ZWN0ID0gRmxvYXRSZWN0KCk7CisgICAgbV9zdWJwYXRocy5jbGVhcigpOworICAgIG1fY3VycmVu
dFBvaW50LmNsZWFyKCk7CisgICAgbV9wZW5MaWZ0ZWQgPSB0cnVlOworfQorCit2b2lkIFBsYXRm
b3JtUGF0aDo6c3Ryb2tlUGF0aChIREMgZGMsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4KiB0
cikgY29uc3QKK3sKKyAgICBkcmF3UG9seWdvbnMoZGMsIG1fc3VicGF0aHMsIGZhbHNlLCB0cik7
Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjpmaWxsUGF0aChIREMgZGMsIGNvbnN0IFRyYW5zZm9y
bWF0aW9uTWF0cml4KiB0cikgY29uc3QKK3sKKyAgICBIR0RJT0JKIG9sZFBlbiA9IFNlbGVjdE9i
amVjdChkYywgR2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pKTsKKyAgICBkcmF3UG9seWdvbnMoZGMs
IG1fc3VicGF0aHMsIHRydWUsIHRyKTsKKyAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7Cit9
CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjp0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQor
eworICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6Oml0ZXJhdG9yIGl0KG1fZWxlbWVudHMu
YmVnaW4oKSk7IGl0ICE9IG1fZWxlbWVudHMuZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT5tb3Zl
KHNpemUpOworCisgICAgbV9ib3VuZGluZ1JlY3QubW92ZShzaXplKTsKKyAgICBmb3IgKFZlY3Rv
cjxQYXRoUG9seWdvbj46Oml0ZXJhdG9yIGl0ID0gbV9zdWJwYXRocy5iZWdpbigpOyBpdCAhPSBt
X3N1YnBhdGhzLmVuZCgpOyArK2l0KQorICAgICAgICBpdC0+bW92ZShzaXplKTsKK30KKwordm9p
ZCBQbGF0Zm9ybVBhdGg6OnRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkK
K3sKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjppdGVyYXRvciBpdChtX2VsZW1lbnRz
LmJlZ2luKCkpOyBpdCAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2l0KQorICAgICAgICBpdC0+dHJh
bnNmb3JtKHQpOworCisgICAgbV9ib3VuZGluZ1JlY3QgPSB0Lm1hcFJlY3QobV9ib3VuZGluZ1Jl
Y3QpOworICAgIGZvciAoVmVjdG9yPFBhdGhQb2x5Z29uPjo6aXRlcmF0b3IgaXQgPSBtX3N1YnBh
dGhzLmJlZ2luKCk7IGl0ICE9IG1fc3VicGF0aHMuZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT50
cmFuc2Zvcm0odCk7Cit9CisKK2Jvb2wgUGxhdGZvcm1QYXRoOjpjb250YWlucyhjb25zdCBGbG9h
dFBvaW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkgY29uc3QKK3sKKyAgICAvLyBvcHRpbWl6YXRp
b246IGNoZWNrIHRoZSBib3VuZGluZyByZWN0IGZpcnN0CisgICAgaWYgKCFjb250YWluc1BvaW50
KG1fYm91bmRpbmdSZWN0LCBwb2ludCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZv
ciAoVmVjdG9yPFBhdGhQb2x5Z29uPjo6Y29uc3RfaXRlcmF0b3IgaSA9IG1fc3VicGF0aHMuYmVn
aW4oKTsgaSAhPSBtX3N1YnBhdGhzLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYgKGktPmNvbnRh
aW5zKHBvaW50KSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVy
biBmYWxzZTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6Om1vdmVUbyhjb25zdCBGbG9hdFBvaW50
JiBwb2ludCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpNb3ZlVG8gZGF0YSA9IHsgeyBw
b2ludC54KCksIHBvaW50LnkoKSB9IH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRh
KTsKKyAgICBhcHBlbmQocGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkTGluZVRvKGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkxpbmVU
byBkYXRhID0geyB7IHBvaW50LngoKSwgcG9pbnQueSgpIH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhF
bGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRo
OjphZGRRdWFkQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjcCwgY29uc3QgRmxvYXRQb2ludCYg
cCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpRdWFkQ3VydmVUbyBkYXRhID0geyB7IGNw
LngoKSwgY3AueSgpIH0sIHsgcC54KCksIHAueSgpIH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVt
ZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjph
ZGRCZXppZXJDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNwMSwgY29uc3QgRmxvYXRQb2ludCYg
Y3AyLCBjb25zdCBGbG9hdFBvaW50JiBwKQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkJl
emllckN1cnZlVG8gZGF0YSA9IHsgeyBjcDEueCgpLCBjcDEueSgpIH0sIHsgY3AyLngoKSwgY3Ay
LnkoKSB9LCB7IHAueCgpLCBwLnkoKSB9IH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShk
YXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkQXJjVG8o
Y29uc3QgRmxvYXRQb2ludCYgZnAxLCBjb25zdCBGbG9hdFBvaW50JiBmcDIsIGZsb2F0IHJhZGl1
cykKK3sKKyAgICBjb25zdCBQYXRoUG9pbnQmIHAwID0gbV9jdXJyZW50UG9pbnQ7CisgICAgUGF0
aFBvaW50IHAxOworICAgIHAxID0gZnAxOworICAgIFBhdGhQb2ludCBwMjsKKyAgICBwMiA9IGZw
MjsKKyAgICBpZiAoIXJhZGl1cyB8fCBwMCA9PSBwMSB8fCBwMSA9PSBwMikgeworICAgICAgICBh
ZGRMaW5lVG8ocDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUGF0aFZlY3RvciB2
MDEgPSBwMCAtIHAxOworICAgIFBhdGhWZWN0b3IgdjIxID0gcDIgLSBwMTsKKworICAgIC8vIHNp
bihBIC0gQikgPSBzaW4oQSkgKiBjb3MoQikgLSBzaW4oQikgKiBjb3MoQSkKKyAgICBkb3VibGUg
Y3Jvc3MgPSB2MDEubV94ICogdjIxLm1feSAtIHYwMS5tX3kgKiB2MjEubV94OworCisgICAgaWYg
KGZhYnMoY3Jvc3MpIDwgMUUtMTApIHsKKyAgICAgICAgLy8gb24gb25lIGxpbmUKKyAgICAgICAg
YWRkTGluZVRvKHAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRvdWJsZSBkMDEg
PSB2MDEubGVuZ3RoKCk7CisgICAgZG91YmxlIGQyMSA9IHYyMS5sZW5ndGgoKTsKKyAgICBkb3Vi
bGUgYW5nbGUgPSAoUEkgLSBhYnMoYXNpbihjcm9zcyAvIChkMDEgKiBkMjEpKSkpICogMC41Owor
ICAgIGRvdWJsZSBzcGFuID0gcmFkaXVzICogdGFuKGFuZ2xlKTsKKyAgICBkb3VibGUgcmF0ZSA9
IHNwYW4gLyBkMDE7CisgICAgUGF0aFBvaW50IHN0YXJ0UG9pbnQ7CisgICAgc3RhcnRQb2ludC5t
X3ggPSBwMS5tX3ggKyB2MDEubV94ICogcmF0ZTsKKyAgICBzdGFydFBvaW50Lm1feSA9IHAxLm1f
eSArIHYwMS5tX3kgKiByYXRlOworCisgICAgYWRkTGluZVRvKHN0YXJ0UG9pbnQpOworCisgICAg
UGF0aFBvaW50IGVuZFBvaW50OworICAgIHJhdGUgPSBzcGFuIC8gZDIxOworICAgIGVuZFBvaW50
Lm1feCA9IHAxLm1feCArIHYyMS5tX3ggKiByYXRlOworICAgIGVuZFBvaW50Lm1feSA9IHAxLm1f
eSArIHYyMS5tX3kgKiByYXRlOworCisgICAgUGF0aFBvaW50IG1pZFBvaW50OworICAgIG1pZFBv
aW50Lm1feCA9IChzdGFydFBvaW50Lm1feCArIGVuZFBvaW50Lm1feCkgKiAwLjU7CisgICAgbWlk
UG9pbnQubV95ID0gKHN0YXJ0UG9pbnQubV95ICsgZW5kUG9pbnQubV95KSAqIDAuNTsKKworICAg
IFBhdGhWZWN0b3Igdm0xID0gbWlkUG9pbnQgLSBwMTsKKyAgICBkb3VibGUgZG0xID0gdm0xLmxl
bmd0aCgpOworICAgIGRvdWJsZSBkID0gX2h5cG90KHJhZGl1cywgc3Bhbik7CisKKyAgICBQYXRo
UG9pbnQgY2VudGVyUG9pbnQ7CisgICAgcmF0ZSA9IGQgLyBkbTE7CisgICAgY2VudGVyUG9pbnQu
bV94ID0gcDEubV94ICsgdm0xLm1feCAqIHJhdGU7CisgICAgY2VudGVyUG9pbnQubV95ID0gcDEu
bV95ICsgdm0xLm1feSAqIHJhdGU7CisKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpBcmNUbyBk
YXRhID0geworICAgICAgICBlbmRQb2ludCwKKyAgICAgICAgY2VudGVyUG9pbnQsCisgICAgICAg
IHsgcmFkaXVzLCByYWRpdXMgfSwKKyAgICAgICAgY3Jvc3MgPCAwCisgICAgfTsKKyAgICBQbGF0
Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1QYXRoOjpjbG9zZVN1YnBhdGgoKQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGU7
CisgICAgYXBwZW5kKHBlKTsKK30KKworLy8gYWRkIGEgY2lyY3VsYXIgYXJjIGNlbnRyZWQgYXQg
cCB3aXRoIHJhZGl1cyByIGZyb20gc3RhcnQgYW5nbGUgc2FyIChyYWRpYW5zKSB0byBlbmQgYW5n
bGUgZWFyCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkRWxsaXBzZShjb25zdCBGbG9hdFBvaW50JiBw
LCBmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBzYXIsIGZsb2F0IGVhciwgYm9vbCBhbnRpY2xvY2t3
aXNlKQoreworICAgIGZsb2F0IHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZOworCisgICAgbm9y
bWFsaXplQW5nbGUoc2FyKTsKKyAgICBub3JtYWxpemVBbmdsZShlYXIpOworCisgICAgZ2V0RWxs
aXBzZVBvaW50QnlBbmdsZShzYXIsIGEsIGIsIHN0YXJ0WCwgc3RhcnRZKTsKKyAgICBnZXRFbGxp
cHNlUG9pbnRCeUFuZ2xlKGVhciwgYSwgYiwgZW5kWCwgZW5kWSk7CisKKyAgICB0cmFuc2Zvcm1B
cmNQb2ludChzdGFydFgsIHN0YXJ0WSwgcCk7CisgICAgdHJhbnNmb3JtQXJjUG9pbnQoZW5kWCwg
ZW5kWSwgcCk7CisKKyAgICBGbG9hdFBvaW50IHN0YXJ0KHN0YXJ0WCwgc3RhcnRZKTsKKyAgICBt
b3ZlVG8oc3RhcnQpOworCisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QXJjVG8gZGF0YSA9IHsg
eyBlbmRYLCBlbmRZIH0sIHsgcC54KCksIHAueSgpIH0sICB7IGEsIGIgfSwgIWFudGljbG9ja3dp
c2UgfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7
Cit9CisKKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQor
eworICAgIG1vdmVUbyhyLmxvY2F0aW9uKCkpOworCisgICAgZmxvYXQgcmlnaHQgPSByLnJpZ2h0
KCkgLSAxOworICAgIGZsb2F0IGJvdHRvbSA9IHIuYm90dG9tKCkgLSAxOworICAgIGFkZExpbmVU
byhGbG9hdFBvaW50KHJpZ2h0LCByLnkoKSkpOworICAgIGFkZExpbmVUbyhGbG9hdFBvaW50KHJp
Z2h0LCBib3R0b20pKTsKKyAgICBhZGRMaW5lVG8oRmxvYXRQb2ludChyLngoKSwgYm90dG9tKSk7
CisgICAgYWRkTGluZVRvKHIubG9jYXRpb24oKSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjph
ZGRFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICBGbG9hdFNpemUgcmFkaXVzKHIu
d2lkdGgoKSAqIDAuNSwgci5oZWlnaHQoKSAqIDAuNSk7CisgICAgYWRkRWxsaXBzZShyLmxvY2F0
aW9uKCkgKyByYWRpdXMsIHJhZGl1cy53aWR0aCgpLCByYWRpdXMuaGVpZ2h0KCksIDAsIDAsIHRy
dWUpOworfQorCitTdHJpbmcgUGxhdGZvcm1QYXRoOjpkZWJ1Z1N0cmluZygpIGNvbnN0Cit7Cisg
ICAgU3RyaW5nIHJldDsKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVy
YXRvciBpKG1fZWxlbWVudHMuYmVnaW4oKSk7IGkgIT0gbV9lbGVtZW50cy5lbmQoKTsgKytpKSB7
CisgICAgICAgIHN3aXRjaCAoaS0+cGxhdGZvcm1UeXBlKCkpIHsKKyAgICAgICAgY2FzZSBQbGF0
Zm9ybVBhdGhFbGVtZW50OjpQYXRoTW92ZVRvOgorICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVs
ZW1lbnQ6OlBhdGhMaW5lVG86CisgICAgICAgICAgICByZXQgKz0gU3RyaW5nOjpmb3JtYXQoIk0g
JWYgJWZcbiIsIGktPnBvaW50QXQoMCkubV94LCBpLT5wb2ludEF0KDApLm1feSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQXJjVG86
CisgICAgICAgICAgICByZXQgKz0gU3RyaW5nOjpmb3JtYXQoIkEgJWYgJWYgJWYgJWYgJWYgJWYg
JWNcbiIKKyAgICAgICAgICAgICAgICAsIGktPmFyY1RvKCkubV9lbmQubV94LCBpLT5hcmNUbygp
Lm1fZW5kLm1feQorICAgICAgICAgICAgICAgICwgaS0+YXJjVG8oKS5tX2NlbnRlci5tX3gsIGkt
PmFyY1RvKCkubV9jZW50ZXIubV95CisgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fcmFk
aXVzLm1feCwgaS0+YXJjVG8oKS5tX3JhZGl1cy5tX3kKKyAgICAgICAgICAgICAgICAsIGktPmFy
Y1RvKCkubV9jbG9ja3dpc2U/ICdZJyA6ICdOJyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoUXVhZEN1cnZlVG86CisgICAgICAgICAg
ICByZXQgKz0gU3RyaW5nOjpmb3JtYXQoIlEgJWYgJWYgJWYgJWZcbiIKKyAgICAgICAgICAgICAg
ICAsIGktPnBvaW50QXQoMCkubV94LCBpLT5wb2ludEF0KDApLm1feQorICAgICAgICAgICAgICAg
ICwgaS0+cG9pbnRBdCgxKS5tX3gsIGktPnBvaW50QXQoMSkubV95KTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhCZXppZXJDdXJ2ZVRv
OgorICAgICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJCICVmICVmICVmICVmICVmICVm
XG4iCisgICAgICAgICAgICAgICAgLCBpLT5wb2ludEF0KDApLm1feCwgaS0+cG9pbnRBdCgwKS5t
X3kKKyAgICAgICAgICAgICAgICAsIGktPnBvaW50QXQoMSkubV94LCBpLT5wb2ludEF0KDEpLm1f
eQorICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgyKS5tX3gsIGktPnBvaW50QXQoMikubV95
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6
OlBhdGhDbG9zZVN1YnBhdGg6CisgICAgICAgICAgICByZXQgKz0gIlNcbiI7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQg
UGxhdGZvcm1QYXRoOjphcHBseSh2b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0
aW9uKSBjb25zdAoreworICAgIFBhdGhFbGVtZW50IHBlbGVtZW50OworICAgIEZsb2F0UG9pbnQg
cG9pbnRzWzNdOworICAgIHBlbGVtZW50LnBvaW50cyA9IHBvaW50czsKKworICAgIGZvciAoUGxh
dGZvcm1QYXRoRWxlbWVudHM6OmNvbnN0X2l0ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVnaW4oKSk7
IGl0ICE9IG1fZWxlbWVudHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgcGVsZW1lbnQudHlwZSA9
IGl0LT50eXBlKCk7CisgICAgICAgIGludCBuID0gaXQtPm51bVBvaW50cygpOworICAgICAgICBm
b3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgICAgIHBvaW50c1tpXSA9IGl0LT5w
b2ludEF0KGkpOworICAgICAgICBmdW5jdGlvbihpbmZvLCAmcGVsZW1lbnQpOworICAgIH0KK30K
KworCit9IC8vIG5hbWVzcGFjZSBXZWJjb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uZmNhMDBhNwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuaApAQCAtMCwwICsxLDE3OCBAQAorLyoK
KyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAg
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8K
KworI2lmbmRlZiBQbGF0Zm9ybVBhdGhXaW5jZV9oCisjZGVmaW5lIFBsYXRmb3JtUGF0aFdpbmNl
X2gKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0Owor
CisgICAgc3RydWN0IFBhdGhQb2ludCB7CisgICAgICAgIGZsb2F0IG1feDsKKyAgICAgICAgZmxv
YXQgbV95OworICAgICAgICBjb25zdCBmbG9hdCYgeCgpIGNvbnN0IHsgcmV0dXJuIG1feDsgfQor
ICAgICAgICBjb25zdCBmbG9hdCYgeSgpIGNvbnN0IHsgcmV0dXJuIG1feTsgfQorICAgICAgICB2
b2lkIHNldChmbG9hdCB4LCBmbG9hdCB5KQorICAgICAgICB7CisgICAgICAgICAgICBtX3ggPSB4
OworICAgICAgICAgICAgbV95ID0geTsKKyAgICAgICAgfTsKKyAgICAgICAgb3BlcmF0b3IgRmxv
YXRQb2ludCgpIGNvbnN0IHsgcmV0dXJuIEZsb2F0UG9pbnQobV94LCBtX3kpOyB9CisgICAgICAg
IHZvaWQgbW92ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAg
ICAgbV94ICs9IG9mZnNldC53aWR0aCgpOworICAgICAgICAgICAgbV95ICs9IG9mZnNldC5oZWln
aHQoKTsKKyAgICAgICAgfQorICAgICAgICBQYXRoUG9pbnQmIG9wZXJhdG9yPShjb25zdCBGbG9h
dFBvaW50JiBwKQorICAgICAgICB7CisgICAgICAgICAgICBtX3ggPSBwLngoKTsKKyAgICAgICAg
ICAgIG1feSA9IHAueSgpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9Cisg
ICAgICAgIHZvaWQgY2xlYXIoKSB7IG1feCA9IG1feSA9IDA7IH0KKyAgICB9OworCisgICAgc3Ry
dWN0IFBhdGhQb2x5Z29uOiBwdWJsaWMgVmVjdG9yPFBhdGhQb2ludD4geworICAgICAgICB2b2lk
IG1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpOworICAgICAgICB2b2lkIHRyYW5zZm9ybShj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisgICAgICAgIGJvb2wgY29udGFpbnMoY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0OworICAgIH07CisKKyAgICBjbGFzcyBQbGF0Zm9y
bVBhdGhFbGVtZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gUGxhZm9ybVBhdGhFbGVt
ZW50VHlwZSB7CisgICAgICAgICAgICBQYXRoTW92ZVRvLAorICAgICAgICAgICAgUGF0aExpbmVU
bywKKyAgICAgICAgICAgIFBhdGhBcmNUbywKKyAgICAgICAgICAgIFBhdGhRdWFkQ3VydmVUbywK
KyAgICAgICAgICAgIFBhdGhCZXppZXJDdXJ2ZVRvLAorICAgICAgICAgICAgUGF0aENsb3NlU3Vi
cGF0aCwKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgTW92ZVRvIHsKKyAgICAgICAgICAg
IFBhdGhQb2ludCBtX2VuZDsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgTGluZVRvIHsK
KyAgICAgICAgICAgIFBhdGhQb2ludCBtX2VuZDsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1
Y3QgQXJjVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fZW5kOworICAgICAgICAgICAgUGF0
aFBvaW50IG1fY2VudGVyOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcmFkaXVzOworICAgICAg
ICAgICAgYm9vbCBtX2Nsb2Nrd2lzZTsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgUXVh
ZEN1cnZlVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQwOworICAgICAgICAgICAg
UGF0aFBvaW50IG1fcG9pbnQxOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBCZXppZXJD
dXJ2ZVRvIHsKKyAgICAgICAgICAgIFBhdGhQb2ludCBtX3BvaW50MDsKKyAgICAgICAgICAgIFBh
dGhQb2ludCBtX3BvaW50MTsKKyAgICAgICAgICAgIFBhdGhQb2ludCBtX3BvaW50MjsKKyAgICAg
ICAgfTsKKworICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KCk6IG1fdHlwZShQYXRoQ2xvc2VT
dWJwYXRoKSB7IG1fZGF0YS5tX3BvaW50c1swXS5zZXQoMCwgMCk7ICAgIH0KKyAgICAgICAgUGxh
dGZvcm1QYXRoRWxlbWVudChjb25zdCBNb3ZlVG8mIGRhdGEpOiBtX3R5cGUoUGF0aE1vdmVUbykg
eyBtX2RhdGEubV9tb3ZlVG9EYXRhID0gZGF0YTsgfQorICAgICAgICBQbGF0Zm9ybVBhdGhFbGVt
ZW50KGNvbnN0IExpbmVUbyYgZGF0YSk6IG1fdHlwZShQYXRoTGluZVRvKSB7IG1fZGF0YS5tX2xp
bmVUb0RhdGEgPSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgQXJj
VG8mIGRhdGEpOiBtX3R5cGUoUGF0aEFyY1RvKSB7IG1fZGF0YS5tX2FyY1RvRGF0YSA9IGRhdGE7
IH0KKyAgICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25zdCBRdWFkQ3VydmVUbyYgZGF0YSk6
IG1fdHlwZShQYXRoUXVhZEN1cnZlVG8pIHsgbV9kYXRhLm1fcXVhZEN1cnZlVG9EYXRhID0gZGF0
YTsgfQorICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IEJlemllckN1cnZlVG8mIGRh
dGEpOiBtX3R5cGUoUGF0aEJlemllckN1cnZlVG8pIHsgbV9kYXRhLm1fYmV6aWVyQ3VydmVUb0Rh
dGEgPSBkYXRhOyB9CisKKyAgICAgICAgY29uc3QgTW92ZVRvJiBtb3ZlVG8oKSBjb25zdCB7IHJl
dHVybiBtX2RhdGEubV9tb3ZlVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IExpbmVUbyYgbGluZVRv
KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm1fbGluZVRvRGF0YTsgfQorICAgICAgICBjb25zdCBB
cmNUbyYgYXJjVG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9hcmNUb0RhdGE7IH0KKyAgICAg
ICAgY29uc3QgUXVhZEN1cnZlVG8mIHF1YWRDdXJ2ZVRvKCkgY29uc3QgeyByZXR1cm4gbV9kYXRh
Lm1fcXVhZEN1cnZlVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IEJlemllckN1cnZlVG8mIGJlemll
ckN1cnZlVG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9iZXppZXJDdXJ2ZVRvRGF0YTsgfQor
ICAgICAgICBjb25zdCBQYXRoUG9pbnQmIGxhc3RQb2ludCgpIGNvbnN0CisgICAgICAgIHsKKyAg
ICAgICAgICAgIGludCBuID0gbnVtUG9pbnRzKCk7CisgICAgICAgICAgICByZXR1cm4gbiA+IDEg
PyBtX2RhdGEubV9wb2ludHNbbiAtIDFdIDogbV9kYXRhLm1fcG9pbnRzWzBdOworICAgICAgICB9
CisgICAgICAgIGNvbnN0IFBhdGhQb2ludCYgcG9pbnRBdChpbnQgaW5kZXgpIGNvbnN0IHsgcmV0
dXJuIG1fZGF0YS5tX3BvaW50c1tpbmRleF07IH0KKyAgICAgICAgaW50IG51bVBvaW50cygpIGNv
bnN0OworICAgICAgICBpbnQgbnVtQ29udHJvbFBvaW50cygpIGNvbnN0OworICAgICAgICB2b2lk
IG1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpOworICAgICAgICB2b2lkIHRyYW5zZm9ybShj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisgICAgICAgIFBhdGhFbGVtZW50VHlwZSB0
eXBlKCkgY29uc3Q7CisgICAgICAgIFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgcGxhdGZvcm1UeXBl
KCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9CisgICAgICAgIHZvaWQgaW5mbGF0ZVJlY3RUb0Nv
bnRhaW5NZShGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9pbnQmIGxhc3RQb2ludCkgY29uc3Q7
CisKKyAgICBwcml2YXRlOgorICAgICAgICBQbGFmb3JtUGF0aEVsZW1lbnRUeXBlIG1fdHlwZTsK
KyAgICAgICAgdW5pb24geworICAgICAgICAgICAgTW92ZVRvIG1fbW92ZVRvRGF0YTsKKyAgICAg
ICAgICAgIExpbmVUbyBtX2xpbmVUb0RhdGE7CisgICAgICAgICAgICBBcmNUbyBtX2FyY1RvRGF0
YTsKKyAgICAgICAgICAgIFF1YWRDdXJ2ZVRvIG1fcXVhZEN1cnZlVG9EYXRhOworICAgICAgICAg
ICAgQmV6aWVyQ3VydmVUbyBtX2JlemllckN1cnZlVG9EYXRhOworICAgICAgICAgICAgUGF0aFBv
aW50IG1fcG9pbnRzWzRdOworICAgICAgICB9IG1fZGF0YTsKKyAgICB9OworCisgICAgdHlwZWRl
ZiBWZWN0b3I8UGxhdGZvcm1QYXRoRWxlbWVudD4gUGxhdGZvcm1QYXRoRWxlbWVudHM7CisKKyAg
ICBjbGFzcyBQbGF0Zm9ybVBhdGggeworICAgIHB1YmxpYzoKKyAgICAgICAgUGxhdGZvcm1QYXRo
KCk7CisgICAgICAgIGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnRzJiBlbGVtZW50cygpIGNvbnN0
IHsgcmV0dXJuIG1fZWxlbWVudHM7IH0KKyAgICAgICAgdm9pZCBhcHBlbmQoY29uc3QgUGxhdGZv
cm1QYXRoRWxlbWVudCYgZSk7CisgICAgICAgIHZvaWQgYXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0
aCYgcCk7CisgICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29u
c3QgeyByZXR1cm4gbV9lbGVtZW50cy5pc0VtcHR5KCk7IH0KKworICAgICAgICB2b2lkIHN0cm9r
ZVBhdGgoSERDLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogdHIpIGNvbnN0OworICAgICAg
ICB2b2lkIGZpbGxQYXRoKEhEQywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgqIHRyKSBjb25z
dDsKKyAgICAgICAgRmxvYXRQb2ludCBsYXN0UG9pbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1l
bnRzLmlzRW1wdHkoKSA/IEZsb2F0UG9pbnQoMCwgMCkgOiBtX2VsZW1lbnRzLmxhc3QoKS5sYXN0
UG9pbnQoKTsgfQorCisgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdSZWN0KCkgY29u
c3QgeyByZXR1cm4gbV9ib3VuZGluZ1JlY3Q7IH0KKyAgICAgICAgYm9vbCBjb250YWlucyhjb25z
dCBGbG9hdFBvaW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkgY29uc3Q7CisgICAgICAgIHZvaWQg
dHJhbnNsYXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSk7CisgICAgICAgIHZvaWQgdHJhbnNmb3Jt
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKworICAgICAgICB2b2lkIG1vdmVUbyhj
b25zdCBGbG9hdFBvaW50Jik7CisgICAgICAgIHZvaWQgYWRkTGluZVRvKGNvbnN0IEZsb2F0UG9p
bnQmKTsKKyAgICAgICAgdm9pZCBhZGRRdWFkQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjb250
cm9sUG9pbnQsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KTsKKyAgICAgICAgdm9pZCBhZGRCZXpp
ZXJDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludDEsIGNvbnN0IEZsb2F0UG9p
bnQmIGNvbnRyb2xQb2ludDIsIGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICAgICAgdm9pZCBhZGRB
cmNUbyhjb25zdCBGbG9hdFBvaW50JiwgY29uc3QgRmxvYXRQb2ludCYsIGZsb2F0IHJhZGl1cyk7
CisgICAgICAgIHZvaWQgY2xvc2VTdWJwYXRoKCk7CisgICAgICAgIHZvaWQgYWRkRWxsaXBzZShj
b25zdCBGbG9hdFBvaW50JiBwLCBmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBzYXIsIGZsb2F0IGVh
ciwgYm9vbCBhbnRpY2xvY2t3aXNlKTsKKyAgICAgICAgdm9pZCBhZGRSZWN0KGNvbnN0IEZsb2F0
UmVjdCYgcik7CisgICAgICAgIHZvaWQgYWRkRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHIpOwor
ICAgICAgICBTdHJpbmcgZGVidWdTdHJpbmcoKSBjb25zdDsKKyAgICAgICAgdm9pZCBhcHBseSh2
b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9uKSBjb25zdDsKKworICAgIHBy
aXZhdGU6CisgICAgICAgIHZvaWQgZW5zdXJlU3VicGF0aCgpOworICAgICAgICB2b2lkIGFkZFRv
U3VicGF0aChjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBlKTsKKworICAgICAgICBQbGF0Zm9y
bVBhdGhFbGVtZW50cyBtX2VsZW1lbnRzOworICAgICAgICBGbG9hdFJlY3QgbV9ib3VuZGluZ1Jl
Y3Q7CisgICAgICAgIFZlY3RvcjxQYXRoUG9seWdvbj4gbV9zdWJwYXRoczsKKyAgICAgICAgUGF0
aFBvaW50IG1fY3VycmVudFBvaW50OworICAgICAgICBib29sIG1fcGVuTGlmdGVkOworICAgIH07
CisKK30KKworI2VuZGlmIC8vIFBsYXRmb3JtUGF0aFdpbmNlX2gKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmNwcCBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi45YmY3NjU1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCkBAIC0wLDAgKzEsNjkxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJT
aGFyZWRCaXRtYXAuaCIKKworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
IkdyYXBoaWNzVHlwZXMuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2lu
Y2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCisjaW5jbHVk
ZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyNpZm5kZWYgTkRFQlVHCitz
dHJ1Y3QgU2hhcmVkQml0bWFwTGVha0NvdW50ZXIgeworICAgIH5TaGFyZWRCaXRtYXBMZWFrQ291
bnRlcigpOworfTsKK3N0YXRpYyBTaGFyZWRCaXRtYXBMZWFrQ291bnRlciBzaGFyZWRCaXRtYXBM
ZWFrQ291bnRlcjsKKyNlbmRpZgorCit0eXBlZGVmIEhhc2hTZXQ8U2hhcmVkQml0bWFwKj4gQml0
bWFwTWFwOworQml0bWFwTWFwIGdfYml0bWFwTWFwOworCisjaWZuZGVmIE5ERUJVRworU2hhcmVk
Qml0bWFwTGVha0NvdW50ZXI6On5TaGFyZWRCaXRtYXBMZWFrQ291bnRlcigpCit7CisgICAgaWYg
KCFnX2JpdG1hcE1hcC5pc0VtcHR5KCkpCisgICAgICAgIHByaW50ZigiXG5MRUFLOiAldSAlc1xu
XG4iLCBnX2JpdG1hcE1hcC5zaXplKCksICJTaGFyZWRCaXRtYXAgb2JqZWN0cyIpOworfQorI2Vu
ZGlmCisKK3N0YXRpYyBTaGFyZWRCaXRtYXA6OkRyYXdQYXR0ZXJuRnVuYyBnX2RyYXdQYXR0ZXJu
ID0gMDsKK3N0YXRpYyBTaGFyZWRCaXRtYXA6OkRyYXdJbWFnZUZ1bmMgZ19kcmF3SW1hZ2UgPSAw
OworCitzdGF0aWMgaW5saW5lIGludCBzdGFibGVSb3VuZChkb3VibGUgZCkKK3sKKyAgICBpZiAo
ZCA+IDApCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGQgKyAwLjUpOworCisgICAg
aW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGQpOworICAgIHJldHVybiBpIC0gZCA+IDAuNSA/IGkg
LSAxIDogaTsKK30KKworU2hhcmVkQml0bWFwOjpEcmF3SW1hZ2VGdW5jIFNoYXJlZEJpdG1hcDo6
c2V0RHJhd0ltYWdlRnVuYyhEcmF3SW1hZ2VGdW5jIGZ1bmMpCit7CisgICAgRHJhd0ltYWdlRnVu
YyBvbGRGdW5jID0gZ19kcmF3SW1hZ2U7CisgICAgZ19kcmF3SW1hZ2UgPSBmdW5jOworICAgIHJl
dHVybiBvbGRGdW5jOworfQorCitTaGFyZWRCaXRtYXA6OkRyYXdQYXR0ZXJuRnVuYyBTaGFyZWRC
aXRtYXA6OnNldERyYXdQYXR0ZXJuRnVuYyhEcmF3UGF0dGVybkZ1bmMgZnVuYykKK3sKKyAgICBE
cmF3UGF0dGVybkZ1bmMgb2xkRnVuYyA9IGdfZHJhd1BhdHRlcm47CisgICAgZ19kcmF3UGF0dGVy
biA9IGZ1bmM7CisgICAgcmV0dXJuIG9sZEZ1bmM7Cit9CisKK1Bhc3NSZWZQdHI8U2hhcmVkQml0
bWFwPiBTaGFyZWRCaXRtYXA6OmNyZWF0ZUluc3RhbmNlKGJvb2wgaXMxNmJpdCwgaW50IHcsIGlu
dCBoLCBib29sIGluaXRQaXhlbHMpCit7CisgICAgU2hhcmVkQml0bWFwKiBydG4gPSBuZXcgU2hh
cmVkQml0bWFwKGlzMTZiaXQsIHcsIGgsIGluaXRQaXhlbHMpOworICAgIGlmIChydG4gJiYgIXJ0
bi0+Ynl0ZXMoKSkgeworICAgICAgICBkZWxldGUgcnRuOworICAgICAgICByZXR1cm4gMDsKKyAg
ICB9CisgICAgcmV0dXJuIGFkb3B0UmVmKHJ0bik7Cit9CisKK1NoYXJlZEJpdG1hcDo6U2hhcmVk
Qml0bWFwKGNvbnN0IEJpdG1hcEluZm8mIGJtcEluZm8sIEhCSVRNQVAgaGJtcCwgdm9pZCogcGl4
ZWxzKQorOiBtX2JtcEluZm8oYm1wSW5mbykKKywgbV9sb2NrZWQoZmFsc2UpCissIG1fdXNlc1Ry
YW5zcGFyZW50Q29sb3IoZmFsc2UpCissIG1fdHJhbnNwYXJlbnRDb2xvcihSR0IoMCwgMCwgMCkp
CissIG1fcGl4ZWxzKHBpeGVscykKKywgbV9oYml0bWFwKGhibXApCissIG1faGFzQWxwaGEoZmFs
c2UpCissIG1fdmFsaWRIZWlnaHQoYm1wSW5mby5oZWlnaHQoKSkKK3sKKyAgICBnX2JpdG1hcE1h
cC5hZGQodGhpcyk7Cit9CisKK1NoYXJlZEJpdG1hcDo6U2hhcmVkQml0bWFwKGJvb2wgX2lzMTZi
aXQsIGludCB3LCBpbnQgaCwgYm9vbCBpbml0UGl4ZWxzKQorOiBtX2JtcEluZm8oX2lzMTZiaXQs
IHcsIGgpCissIG1fcmVmZXJlbmNlKDEpCissIG1fbG9ja2VkKGZhbHNlKQorLCBtX3VzZXNUcmFu
c3BhcmVudENvbG9yKGZhbHNlKQorLCBtX3RyYW5zcGFyZW50Q29sb3IoUkdCKDAsIDAsIDApKQor
LCBtX3BpeGVscygwKQorLCBtX2hhc0FscGhhKGZhbHNlKQorLCBtX3ZhbGlkSGVpZ2h0KGFicyho
KSkKKywgbV9oYml0bWFwKDApCit7CisgICAgZ19iaXRtYXBNYXAuYWRkKHRoaXMpOworCisgICAg
dW5zaWduZWQgYnVmZmVyU2l6ZSA9IG1fYm1wSW5mby5udW1QaXhlbHMoKTsKKyAgICBpZiAoX2lz
MTZiaXQpCisgICAgICAgIGJ1ZmZlclNpemUgLz0gMjsKKworICAgIG1fcGl4ZWxzID0gbmV3IHVu
c2lnbmVkW2J1ZmZlclNpemVdOworCisgICAgaWYgKGluaXRQaXhlbHMpCisgICAgICAgIHJlc2V0
UGl4ZWxzKCk7Cit9CitTaGFyZWRCaXRtYXA6On5TaGFyZWRCaXRtYXAoKQoreworICAgIGdfYml0
bWFwTWFwLnJlbW92ZSh0aGlzKTsKKyAgICBpZiAobV9oYml0bWFwKQorICAgICAgICBEZWxldGVP
YmplY3QobV9oYml0bWFwKTsKKyAgICBlbHNlCisgICAgICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOwor
fQorCit2b2lkIFNoYXJlZEJpdG1hcDo6cmVzZXRQaXhlbHMoYm9vbCBibGFjaykKK3sKKyAgICBp
ZiAobV9waXhlbHMpIHsKKyAgICAgICAgdW5zaWduZWQgYnVmZmVyU2l6ZSA9IG1fYm1wSW5mby5u
dW1QaXhlbHMoKTsKKyAgICAgICAgaWYgKGJsYWNrKQorICAgICAgICAgICAgbWVtc2V0KG1fcGl4
ZWxzLCAwLCBidWZmZXJTaXplICogKGlzMTZiaXQoKSA/IDIgOiA0KSk7CisgICAgICAgIGVsc2Ug
aWYgKGlzMTZiaXQoKSkgeworICAgICAgICAgICAgLy8gRmlsbCBpdCB3aXRoIHdoaXRlIGNvbG9y
CisjaWYgSU1BR0VfTk9fQUxQSEFfVVNFX1JHQjU1NQorICAgICAgICAgICAgd21lbXNldCgod2No
YXJfdCopbV9waXhlbHMsIDB4N0ZGRiwgYnVmZmVyU2l6ZSk7CisjZWxzZQorICAgICAgICAgICAg
d21lbXNldCgod2NoYXJfdCopbV9waXhlbHMsIDB4RkZGRiwgYnVmZmVyU2l6ZSk7CisjZW5kaWYK
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE1ha2UgaXQgd2hpdGUgYnV0IHRyYW5z
cGFyZW50CisgICAgICAgICAgICB1bnNpZ25lZCogcGl4ZWwgPSAodW5zaWduZWQqKW1fcGl4ZWxz
OworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQqIGNvbnN0IGJ1ZmZlckVuZCA9IHBpeGVsICsg
YnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIHdoaWxlIChwaXhlbCA8IGJ1ZmZlckVuZCkKKyAgICAg
ICAgICAgICAgICAqcGl4ZWwrKyA9IDB4MDBGRkZGRkY7CisgICAgICAgIH0KKyAgICB9Cit9CisK
K3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgY29udmVydDMyVG8xNih1bnNpZ25lZCBwaXhl
bCkKK3sKKyNpZiBJTUFHRV9OT19BTFBIQV9VU0VfUkdCNTU1CisgICAgdW5zaWduZWQgc2hvcnQg
ciA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAmIDB4MDBGODAwMDApID4+IDkpOworICAgIHVuc2ln
bmVkIHNob3J0IGcgPSB1bnNpZ25lZCBzaG9ydCgocGl4ZWwgJiAweDAwMDBGODAwKSA+PiA2KTsK
KyAgICB1bnNpZ25lZCBzaG9ydCBiID0gdW5zaWduZWQgc2hvcnQoKHBpeGVsICYgMHgwMDAwMDBG
OCkgPj4gMyk7CisjZWxzZSAvLyBSR0I1NjUKKyAgICB1bnNpZ25lZCBzaG9ydCByID0gdW5zaWdu
ZWQgc2hvcnQoKHBpeGVsICYgMHgwMEY4MDAwMCkgPj4gOCk7CisgICAgdW5zaWduZWQgc2hvcnQg
ZyA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAmIDB4MDAwMEZDMDApID4+IDUpOworICAgIHVuc2ln
bmVkIHNob3J0IGIgPSB1bnNpZ25lZCBzaG9ydCgocGl4ZWwgJiAweDAwMDAwMEY4KSA+PiAzKTsK
KyNlbmRpZgorICAgIHJldHVybiByIHwgZyB8IGI7Cit9CisKK2Jvb2wgU2hhcmVkQml0bWFwOjp0
bzE2Yml0KCkKK3sKKyAgICBpZiAobV9sb2NrZWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpZiAoaXMxNmJpdCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIEJpdG1hcEluZm8g
bmV3Qm1wSW5mbyh0cnVlLCBtX2JtcEluZm8ud2lkdGgoKSwgbV9ibXBJbmZvLmhlaWdodCgpKTsK
KworICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7CisgICAgaW50IHdpZHRoID0g
bmV3Qm1wSW5mby53aWR0aCgpOworICAgIGludCBwYWRkZWRXaWR0aCA9IG5ld0JtcEluZm8ucGFk
ZGVkV2lkdGgoKTsKKyAgICBpbnQgYnVmZmVyU2l6ZSA9IHBhZGRlZFdpZHRoICogbmV3Qm1wSW5m
by5oZWlnaHQoKTsKKyAgICB2b2lkKiBuZXdQaXhlbHMgPSBuZXcgdW5zaWduZWRbYnVmZmVyU2l6
ZSAvIDJdOworCisgICAgaWYgKCFuZXdQaXhlbHMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIHVuc2lnbmVkIHNob3J0KiBwMTYgPSAodW5zaWduZWQgc2hvcnQqKW5ld1BpeGVsczsKKyAg
ICBjb25zdCB1bnNpZ25lZCogcDMyID0gKGNvbnN0IHVuc2lnbmVkKiltX3BpeGVsczsKKworICAg
IGNvbnN0IGJvb2wgc2tpcHMgPSBwYWRkZWRXaWR0aCAhPSB3aWR0aDsKKworICAgIGNvbnN0IHVu
c2lnbmVkIHNob3J0KiBjb25zdCBwMTZlbmQgPSBwMTYgKyBidWZmZXJTaXplOworICAgIHdoaWxl
IChwMTYgPCBwMTZlbmQpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBzaG9ydCogcDE2bGluZUVu
ZCA9IHAxNiArIHdpZHRoOyBwMTYgPCBwMTZsaW5lRW5kOyApCisgICAgICAgICAgICAqcDE2Kysg
PSBjb252ZXJ0MzJUbzE2KCpwMzIrKyk7CisKKyAgICAgICAgaWYgKHNraXBzKQorICAgICAgICAg
ICAgKnAxNisrID0gMDsKKyAgICB9CisKKworICAgIGlmIChtX2hiaXRtYXApIHsKKyAgICAgICAg
RGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7CisgICAgICAgIG1faGJpdG1hcCA9IDA7CisgICAgfSBl
bHNlCisgICAgICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworCisgICAgbV9waXhlbHMgPSBuZXdQaXhl
bHM7CisgICAgbV9ibXBJbmZvID0gbmV3Qm1wSW5mbzsKKworICAgIHNldEhhc0FscGhhKGZhbHNl
KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGFyZWRCaXRtYXA6OmZyZWVNZW1vcnko
KQoreworICAgIGlmICghbV9sb2NrZWQpIHsKKyAgICAgICAgaWYgKG1faGJpdG1hcCkgeworICAg
ICAgICAgICAgRGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7CisgICAgICAgICAgICBtX2hiaXRtYXAg
PSAwOworICAgICAgICAgICAgbV9waXhlbHMgPSAwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIH0gZWxzZSBpZiAobV9waXhlbHMpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIG1f
cGl4ZWxzOworICAgICAgICAgICAgbV9waXhlbHMgPSAwOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitIQklUTUFQIFNo
YXJlZEJpdG1hcDo6Y3JlYXRlSGFuZGxlKHZvaWQqKiBwaXhlbHMsIEJpdG1hcEluZm8qIGJtcElu
Zm8sIGludCBoLCBib29sIHVzZTE2Yml0KSBjb25zdAoreworICAgIGlmICghbV9waXhlbHMpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgTWVtb3J5QWxsb2NhdGlvbkNhbkZhaWwgY2FuRmFpbDsK
KworICAgIGlmIChoID09IC0xKQorICAgICAgICBoID0gaGVpZ2h0KCk7CisgICAgKmJtcEluZm8g
PSBCaXRtYXBJbmZvKHVzZTE2Yml0IHx8IGlzMTZiaXQoKSwgd2lkdGgoKSwgaCk7CisKKyAgICBI
QklUTUFQIGhibXAgPSBNZW1vcnlNYW5hZ2VyOjpjcmVhdGVESUJTZWN0aW9uKGJtcEluZm8sIHBp
eGVscyk7CisKKyAgICBpZiAoIWhibXApCisgICAgICAgIHJldHVybiAwOworCisgICAgT3duUHRy
PEhEQz4gYm1wREMoQ3JlYXRlQ29tcGF0aWJsZURDKDApKTsKKyAgICBIR0RJT0JKIGhPbGRCbXAg
PSBTZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhibXApOworCisgICAgU3RyZXRjaERJQml0cyhi
bXBEQy5nZXQoKSwgMCwgMCwgd2lkdGgoKSwgaCwgMCwgMCwgd2lkdGgoKSwgaAorICAgICAgICAs
IG1fcGl4ZWxzLCAmbV9ibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAgICBT
ZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhPbGRCbXApOworCisgICAgcmV0dXJuIGhibXA7Cit9
CisKK2Jvb2wgU2hhcmVkQml0bWFwOjplbnN1cmVIYW5kbGUoKQoreworICAgIGlmIChtX2hiaXRt
YXApCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1fbG9ja2VkKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBCaXRtYXBJbmZvIGJtcEluZm87CisgICAgdm9pZCogcGl4ZWxzOworICAgIG1faGJp
dG1hcCA9IGNyZWF0ZUhhbmRsZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsICFoYXNBbHBoYSgpKTsK
KworICAgIGlmICghbV9oYml0bWFwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBkZWxl
dGVbXSBtX3BpeGVsczsKKyAgICBtX3BpeGVscyA9IHBpeGVsczsKKyAgICBtX2JtcEluZm8gPSBi
bXBJbmZvOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3
KEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50
UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgaWYg
KCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworICAgIGN0eHQtPmRyYXdCaXRtYXAodGhpcywg
ZHN0UmVjdCwgc3JjUmVjdCwgY29tcG9zaXRlT3ApOworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6
ZHJhdyhIREMgaGRjLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNS
ZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fcGl4ZWxz
KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkgfHwgc3JjUmVj
dC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChnX2RyYXdJbWFnZSAmJiBn
X2RyYXdJbWFnZSh0aGlzLCBoZGMsIGRzdFJlY3QsIHNyY1JlY3QsIGNvbXBvc2l0ZU9wKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgSEJJVE1BUCBoYml0bWFwID0gMDsKKyAgICBib29sIHVzaW5n
SGFuZGxlID0gY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAmJiAoCisjaWYgIWRl
ZmluZWQoTk9fQUxQSEFCTEVORCkKKyAgICAgICAgaGFzQWxwaGEoKSB8fAorI2VuZGlmCisgICAg
ICAgIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpOworCisgICAgaWYgKHVzaW5nSGFuZGxlKSB7Cisg
ICAgICAgIGlmIChlbnN1cmVIYW5kbGUoKSkKKyAgICAgICAgICAgIGhiaXRtYXAgPSBtX2hiaXRt
YXA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdm9pZCogcGl4ZWxzOworICAgICAgICAg
ICAgQml0bWFwSW5mbyBibXBJbmZvOworICAgICAgICAgICAgaGJpdG1hcCA9IGNyZWF0ZUhhbmRs
ZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpOworICAgICAg
ICB9CisgICAgfQorICAgIGlmICghaGJpdG1hcCkgeworICAgICAgICAvLyBGSVhNRTogaGFuZGxl
IG90aGVyIGNvbXBvc2l0ZSBvcGVyYXRpb24gdHlwZXM/CisgICAgICAgIERXT1JEIHJvcCA9IGNv
bXBvc2l0ZU9wID09IENvbXBvc2l0ZUNvcHkgPyBTUkNDT1BZCisgICAgICAgICAgICA6IGNvbXBv
c2l0ZU9wID09IENvbXBvc2l0ZVhPUiA/IFBBVElOVkVSVAorICAgICAgICAgICAgOiBjb21wb3Np
dGVPcCA9PSBDb21wb3NpdGVDbGVhciA/IFdISVRFTkVTUworICAgICAgICAgICAgOiBTUkNDT1BZ
OworCisgICAgICAgIFN0cmV0Y2hESUJpdHMoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCks
IGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKQorICAgICAgICAgICAgLCBzcmNSZWN0
LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWlnaHQoKSwgbV9w
aXhlbHMsICZtX2JtcEluZm8sIERJQl9SR0JfQ09MT1JTLCByb3ApOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIE93blB0cjxIREM+IGhtZW1kYyhDcmVhdGVDb21wYXRpYmxlREMoaGRjKSk7CisgICAg
ICAgIEhHRElPQkogaE9sZEJtcCA9IFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIGhiaXRtYXAp
OworCisjaWYgIWRlZmluZWQoTk9fQUxQSEFCTEVORCkKKyAgICAgICAgaWYgKCF1c2VzVHJhbnNw
YXJlbnRDb2xvcigpKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgQkxFTkRGVU5DVElPTiBi
bGVuZCA9IHsgQUNfU1JDX09WRVIsIDAsIDI1NSwgQUNfU1JDX0FMUEhBIH07CisgICAgICAgICAg
ICBBbHBoYUJsZW5kKGhkYywgZHN0UmVjdC54KCksIGRzdFJlY3QueSgpLCBkc3RSZWN0LndpZHRo
KCksIGRzdFJlY3QuaGVpZ2h0KCksIGhtZW1kYy5nZXQoKQorICAgICAgICAgICAgICAgICwgc3Jj
UmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCks
IGJsZW5kKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAg
VHJhbnNwYXJlbnRCbHQoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lk
dGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgaG1lbWRjLmdldCgpCisgICAgICAgICAgICAgICAgLCBz
cmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWlnaHQo
KSwgdHJhbnNwYXJlbnRDb2xvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFNlbGVjdE9iamVj
dChobWVtZGMuZ2V0KCksIGhPbGRCbXApOworICAgICAgICBpZiAoaGJpdG1hcCAhPSBtX2hiaXRt
YXApCisgICAgICAgICAgICBEZWxldGVPYmplY3QoaGJpdG1hcCk7CisgICAgfQorfQorCisKK0hC
SVRNQVAgU2hhcmVkQml0bWFwOjpjbGlwQml0bWFwKGNvbnN0IEludFJlY3QmIHJlY3QsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUFscGhhLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgQml0bWFwSW5mbyYgYm1wSW5mbywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHZvaWQqJiBwaXhlbHMpCit7CisgICAgaWYgKCFieXRlcygpKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIGludCBvbGRXaWR0aCA9IHdpZHRoKCk7CisgICAgaW50
IG9sZEhlaWdodCA9IGhlaWdodCgpOworICAgIGludCBjb3B5V2lkdGggPSBzdGQ6Om1pbjxpbnQ+
KHJlY3Qud2lkdGgoKSwgb2xkV2lkdGggLSByZWN0LngoKSk7CisgICAgaW50IGNvcHlIZWlnaHQg
PSBzdGQ6Om1pbjxpbnQ+KHJlY3QuaGVpZ2h0KCksIG9sZEhlaWdodCAtIHJlY3QueSgpKTsKKyAg
ICBpZiAoIWNvcHlXaWR0aCB8fCAhY29weUhlaWdodCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICBibXBJbmZvID0gQml0bWFwSW5mbyghKHVzZUFscGhhICYmIGlzMzJiaXQoKSksIGNvcHlXaWR0
aCwgY29weUhlaWdodCk7CisgICAgSEJJVE1BUCBuZXdCbXAgPSBNZW1vcnlNYW5hZ2VyOjpjcmVh
dGVESUJTZWN0aW9uKCZibXBJbmZvLCAmcGl4ZWxzKTsKKworICAgIGlmIChuZXdCbXApIHsKKyAg
ICAgICAgT3duUHRyPEhEQz4gZGNOZXcoOjpDcmVhdGVDb21wYXRpYmxlREMoMCkpOworICAgICAg
ICBIR0RJT0JKIHRtcE5ldyA9IDo6U2VsZWN0T2JqZWN0KGRjTmV3LmdldCgpLCBuZXdCbXApOwor
CisgICAgICAgIFN0cmV0Y2hESUJpdHMoZGNOZXcuZ2V0KCksIDAsIDAsIGNvcHlXaWR0aCwgY29w
eUhlaWdodCwgcmVjdC54KCksIHJlY3QueSgpLCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQKKyAgICAg
ICAgICAgICwgYnl0ZXMoKSwgJmJpdG1hcEluZm8oKSwgRElCX1JHQl9DT0xPUlMsIFNSQ0NPUFkp
OworCisgICAgICAgIFNlbGVjdE9iamVjdChkY05ldy5nZXQoKSwgdG1wTmV3KTsKKyAgICB9CisK
KyAgICByZXR1cm4gbmV3Qm1wOworfQorCisKK1Bhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBTaGFy
ZWRCaXRtYXA6OmNsaXBCaXRtYXAoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSkK
K3sKKyAgICBpbnQgb2xkV2lkdGggPSB3aWR0aCgpOworICAgIGludCBvbGRIZWlnaHQgPSBoZWln
aHQoKTsKKyAgICBpbnQgY29weVdpZHRoID0gc3RkOjptaW48aW50PihyZWN0LndpZHRoKCksIG9s
ZFdpZHRoIC0gcmVjdC54KCkpOworICAgIGludCBjb3B5SGVpZ2h0ID0gc3RkOjptaW48aW50Pihy
ZWN0LmhlaWdodCgpLCBvbGRIZWlnaHQgLSByZWN0LnkoKSk7CisgICAgaWYgKCFjb3B5V2lkdGgg
fHwgIWNvcHlIZWlnaHQpCisgICAgICAgIHJldHVybiAwOworCisgICAgU2hhcmVkQml0bWFwKiBu
ZXdCbXAgPSBuZXcgU2hhcmVkQml0bWFwKCEodXNlQWxwaGEgJiYgaXMzMmJpdCgpKSwgY29weVdp
ZHRoLCBjb3B5SGVpZ2h0LCBmYWxzZSk7CisKKyAgICBpZiAoIW5ld0JtcCkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBpZiAoIW5ld0JtcC0+Ynl0ZXMoKSkgeworICAgICAgICBkZWxldGUgbmV3
Qm1wOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBEQ0hvbGRlciBkY05ldyhuZXdC
bXApOworCisgICAgU3RyZXRjaERJQml0cyhkY05ldy5nZXQoKSwgMCwgMCwgY29weVdpZHRoLCBj
b3B5SGVpZ2h0LCByZWN0LngoKSwgcmVjdC55KCksIGNvcHlXaWR0aCwgY29weUhlaWdodAorICAg
ICAgICAsIGJ5dGVzKCksICZiaXRtYXBJbmZvKCksIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsK
KworICAgIHJldHVybiBhZG9wdFJlZihuZXdCbXApOworfQorCitzdGF0aWMgdm9pZCBkcmF3UGF0
dGVyblNpbXBsZShIREMgaGRjLCBjb25zdCBSRUNUJiBkZXN0UmVjdCwgSEJJVE1BUCBoYm1wLCBj
b25zdCBQT0lOVCYgcGhhc2UpCit7CisgICAgSEJSVVNIIGhCcnVzaCA9IENyZWF0ZVBhdHRlcm5C
cnVzaChoYm1wKTsKKyAgICBpZiAoaEJydXNoKSB7CisgICAgICAgIFBPSU5UIG9sZE9yZzsKKyAg
ICAgICAgU2V0QnJ1c2hPcmdFeChoZGMsIGRlc3RSZWN0LmxlZnQgLSBwaGFzZS54LCBkZXN0UmVj
dC50b3AgLSBwaGFzZS55LCAmb2xkT3JnKTsKKyAgICAgICAgRmlsbFJlY3QoaGRjLCAmZGVzdFJl
Y3QsIGhCcnVzaCk7CisgICAgICAgIERlbGV0ZU9iamVjdChoQnJ1c2gpOworICAgICAgICBTZXRC
cnVzaE9yZ0V4KGhkYywgb2xkT3JnLngsIG9sZE9yZy55LCAwKTsKKyAgICB9Cit9CisKK3N0YXRp
YyB2b2lkIGRyYXdQYXR0ZXJuU2ltcGxlKEhEQyBoZGMsIGNvbnN0IFJFQ1QmIGRlc3RSZWN0LCBj
b25zdCBTaGFyZWRCaXRtYXAqIGJtcCwgY29uc3QgU0laRSYgYm1wU2l6ZSwgY29uc3QgUE9JTlQm
IHBoYXNlKQoreworICAgIGludCBkc3RZID0gZGVzdFJlY3QudG9wOworICAgIGZvciAoaW50IHNv
dXJjZVkgPSBwaGFzZS55OyBkc3RZIDwgZGVzdFJlY3QuYm90dG9tOyApIHsKKyAgICAgICAgaW50
IHNvdXJjZUggPSBzdGQ6Om1pbjxpbnQ+KGJtcFNpemUuY3kgLSBzb3VyY2VZLCBkZXN0UmVjdC5i
b3R0b20gLSBkc3RZKTsKKyAgICAgICAgaW50IGRzdFggPSBkZXN0UmVjdC5sZWZ0OworICAgICAg
ICBmb3IgKGludCBzb3VyY2VYID0gcGhhc2UueDsgZHN0WCA8IGRlc3RSZWN0LnJpZ2h0OyApIHsK
KyAgICAgICAgICAgIGludCBzb3VyY2VXID0gc3RkOjptaW48aW50PihibXBTaXplLmN4IC0gc291
cmNlWCwgZGVzdFJlY3QucmlnaHQgLSBkc3RYKTsKKworICAgICAgICAgICAgU3RyZXRjaERJQml0
cyhoZGMsIGRzdFgsIGRzdFksIHNvdXJjZVcsIHNvdXJjZUgsIHNvdXJjZVgsIHNvdXJjZVksIHNv
dXJjZVcsIHNvdXJjZUgKKyAgICAgICAgICAgICAgICAsIGJtcC0+Ynl0ZXMoKSwgJmJtcC0+Yml0
bWFwSW5mbygpLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAgICAgICAgICAgIGRzdFgg
Kz0gc291cmNlVzsKKyAgICAgICAgICAgIHNvdXJjZVggPSAwOworICAgICAgICB9CisKKyAgICAg
ICAgZHN0WSArPSBzb3VyY2VIOworICAgICAgICBzb3VyY2VZID0gMDsKKyAgICB9Cit9CisKK3Zv
aWQgbm9ybWFsaXplUGhhc2UoTE9ORyYgcGhhc2UsIGludCBsaW1pdCkKK3sKKyAgICBpZiAoIXBo
YXNlKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGxpbWl0IDwgMikgeworICAgICAgICBwaGFz
ZSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxpbWl0ID09IDIpIHsKKyAg
ICAgICAgcGhhc2UgPSBwaGFzZSAmIDE7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYg
KHBoYXNlIDwgMCkgeworICAgICAgICBwaGFzZSA9IC1waGFzZTsKKyAgICAgICAgaWYgKHBoYXNl
ID4gbGltaXQpCisgICAgICAgICAgICBwaGFzZSA9IChMT05HKSgodW5zaWduZWQpcGhhc2UgJSAo
dW5zaWduZWQpbGltaXQpOworICAgICAgICBpZiAocGhhc2UpCisgICAgICAgICAgICBwaGFzZSA9
IGxpbWl0IC0gcGhhc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBoYXNlIDwgbGltaXQp
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHBoYXNlID0gKExPTkcpKCh1bnNpZ25lZClw
aGFzZSAlICh1bnNpZ25lZClsaW1pdCk7CisgICAgfQorfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6
ZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVS
ZWN0SW4sIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9w
ZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBJbnRTaXplJiBvcmln
U291cmNlU2l6ZSkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisgICAg
Y3R4dC0+ZHJhd0JpdG1hcFBhdHRlcm4odGhpcywgdGlsZVJlY3RJbiwgcGF0dGVyblRyYW5zZm9y
bSwgcGhhc2UsIG9wLCBkZXN0UmVjdCwgb3JpZ1NvdXJjZVNpemUpOworfQorCit2b2lkIFNoYXJl
ZEJpdG1hcDo6ZHJhd1BhdHRlcm4oSERDIGhkYywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
IHRyYW5zZm9ybSwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRS
ZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpCit7CisgICAgaWYg
KCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGdfZHJhd1BhdHRlcm4pIHsK
KyAgICAgICAgZ19kcmF3UGF0dGVybih0aGlzLCBoZGMsIHRyYW5zZm9ybSwgdGlsZVJlY3RJbiwg
cGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIG9wLCBkZXN0UmVjdCwgb3JpZ1NvdXJjZVNpemUpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRpbGVSZWN0SW4ud2lkdGgoKSA8PSAw
IHx8IHRpbGVSZWN0SW4uaGVpZ2h0KCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgYm9v
bCB1c2VBbHBoYSA9IG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgJiYgaGFzQWxwaGEoKSAmJiBp
czMyYml0KCk7CisKKyAgICBpbnQgYm1wV2lkdGggPSB3aWR0aCgpOworICAgIGludCBibXBIZWln
aHQgPSBoZWlnaHQoKTsKKworICAgIEZsb2F0UmVjdCB0aWxlUmVjdCh0aWxlUmVjdEluKTsKKyAg
ICBpZiAoYm1wV2lkdGggIT0gb3JpZ1NvdXJjZVNpemUud2lkdGgoKSkgeworICAgICAgICBkb3Vi
bGUgcmF0ZSA9IChkb3VibGUpYm1wV2lkdGggLyBvcmlnU291cmNlU2l6ZS53aWR0aCgpOworICAg
ICAgICBkb3VibGUgdGVtcCA9IHRpbGVSZWN0LndpZHRoKCkgKiByYXRlOworICAgICAgICB0aWxl
UmVjdC5zZXRYKHRpbGVSZWN0LngoKSAqIHJhdGUpOworICAgICAgICB0aWxlUmVjdC5zZXRXaWR0
aCh0ZW1wKTsKKyAgICAgICAgdGVtcCA9IHRpbGVSZWN0LmhlaWdodCgpICogcmF0ZTsKKyAgICAg
ICAgdGlsZVJlY3Quc2V0WSh0aWxlUmVjdC55KCkgKiByYXRlKTsKKyAgICAgICAgdGlsZVJlY3Qu
c2V0SGVpZ2h0KHRlbXApOworICAgIH0KKworICAgIE93blB0cjxIQklUTUFQPiBjbGlwcGVkQm1w
OworCisgICAgaWYgKHRpbGVSZWN0LngoKSB8fCB0aWxlUmVjdC55KCkgfHwgdGlsZVJlY3Qud2lk
dGgoKSAhPSBibXBXaWR0aCB8fCB0aWxlUmVjdC5oZWlnaHQoKSAhPSBibXBIZWlnaHQpIHsKKyAg
ICAgICAgQml0bWFwSW5mbyBwYXR0ZXJuQm1wSW5mbzsKKyAgICAgICAgdm9pZCogcGF0dGVyblBp
eGVsczsKKyAgICAgICAgY2xpcHBlZEJtcC5zZXQoY2xpcEJpdG1hcChJbnRSZWN0KHRpbGVSZWN0
KSwgdXNlQWxwaGEsIHBhdHRlcm5CbXBJbmZvLCBwYXR0ZXJuUGl4ZWxzKSk7CisgICAgICAgIGlm
ICghY2xpcHBlZEJtcCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBibXBXaWR0aCA9
IHRpbGVSZWN0LndpZHRoKCk7CisgICAgICAgIGJtcEhlaWdodCA9IHRpbGVSZWN0LmhlaWdodCgp
OworICAgIH0KKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRmID0gdHJhbnNmb3JtOworICAg
IHRmICo9IHBhdHRlcm5UcmFuc2Zvcm07CisKKyAgICBGbG9hdFJlY3QgdHJSZWN0ID0gdGYubWFw
UmVjdChkZXN0UmVjdCk7CisKKyAgICBSRUNUIGNsaXBCb3g7CisgICAgaW50IGNsaXBUeXBlID0g
R2V0Q2xpcEJveChoZGMsICZjbGlwQm94KTsKKyAgICBpZiAoY2xpcFR5cGUgPT0gU0lNUExFUkVH
SU9OKQorICAgICAgICB0clJlY3QuaW50ZXJzZWN0KEZsb2F0UmVjdChjbGlwQm94LmxlZnQsIGNs
aXBCb3gudG9wLCBjbGlwQm94LnJpZ2h0IC0gY2xpcEJveC5sZWZ0LCBjbGlwQm94LmJvdHRvbSAt
IGNsaXBCb3gudG9wKSk7CisgICAgZWxzZSBpZiAoY2xpcFR5cGUgPT0gQ09NUExFWFJFR0lPTikg
eworICAgICAgICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDAp
KTsKKyAgICAgICAgaWYgKEdldENsaXBSZ24oaGRjLCBjbGlwUmduLmdldCgpKSA+IDApIHsKKyAg
ICAgICAgICAgIERXT1JEIHJlZ2lvbkRhdGFTaXplID0gR2V0UmVnaW9uRGF0YShjbGlwUmduLmdl
dCgpLCBzaXplb2YoUkdOREFUQSksIDApOworICAgICAgICAgICAgaWYgKHJlZ2lvbkRhdGFTaXpl
KSB7CisgICAgICAgICAgICAgICAgUkdOREFUQSogcmVnaW9uRGF0YSA9IG5ldyBSR05EQVRBW3Jl
Z2lvbkRhdGFTaXplXTsKKyAgICAgICAgICAgICAgICBHZXRSZWdpb25EYXRhKGNsaXBSZ24uZ2V0
KCksIHJlZ2lvbkRhdGFTaXplLCByZWdpb25EYXRhKTsKKyAgICAgICAgICAgICAgICBSRUNUKiBy
ZWN0ID0gKFJFQ1QqKXJlZ2lvbkRhdGEtPkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgcmVnaW9uRGF0YS0+cmRoLm5Db3VudDsgKytpLCArK3JlY3QpCisg
ICAgICAgICAgICAgICAgICAgIHRyUmVjdC5pbnRlcnNlY3QoRmxvYXRSZWN0KHJlY3QtPmxlZnQs
IHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSByZWN0
LT50b3ApKTsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSByZWdpb25EYXRhOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyUmVjdC53aWR0aCgpIDw9IDAgfHwg
dHJSZWN0LmhlaWdodCgpIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIHRyUmVjdC5pbmZs
YXRlKDEpOworICAgIEludFJlY3QgdmlzaWJsZURzdFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHRm
LmludmVyc2UoKS5tYXBSZWN0KHRyUmVjdCkpOworICAgIHZpc2libGVEc3RSZWN0LmludGVyc2Vj
dChJbnRSZWN0KGRlc3RSZWN0KSk7CisKKyAgICBpZiAodmlzaWJsZURzdFJlY3Qud2lkdGgoKSA8
PSAwIHx8IHZpc2libGVEc3RSZWN0LmhlaWdodCgpIDw9IDApCisgICAgICAgIHJldHVybjsKKwor
ICAgIHRyUmVjdCA9IHRmLm1hcFJlY3QodmlzaWJsZURzdFJlY3QpOworICAgIFJFQ1QgZHN0UmVj
dFdpbiA9CisgICAgeworICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QueCgpKSwKKyAgICAgICAg
c3RhYmxlUm91bmQodHJSZWN0LnkoKSksCisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC5yaWdo
dCgpKSwKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LmJvdHRvbSgpKSwKKyAgICB9OworICAg
IGlmIChkc3RSZWN0V2luLnJpZ2h0IDw9IGRzdFJlY3RXaW4ubGVmdCB8fCBkc3RSZWN0V2luLmJv
dHRvbSA8PSBkc3RSZWN0V2luLnRvcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgU0laRSBibXBT
aXplID0geyBibXBXaWR0aCwgYm1wSGVpZ2h0IH07CisKKyAgICAvLyBSZWxhdGl2ZSB0byBkZXN0
aW5hdGlvbiwgaW4gYml0bWFwIHBpeGVscworICAgIFBPSU5UIHBoYXNlV2luID0geyBzdGFibGVS
b3VuZCh2aXNpYmxlRHN0UmVjdC54KCkgLSBwaGFzZS54KCkpLCBzdGFibGVSb3VuZCh2aXNpYmxl
RHN0UmVjdC55KCkgLSBwaGFzZS55KCkpIH07CisgICAgbm9ybWFsaXplUGhhc2UocGhhc2VXaW4u
eCwgYm1wU2l6ZS5jeCk7CisgICAgbm9ybWFsaXplUGhhc2UocGhhc2VXaW4ueSwgYm1wU2l6ZS5j
eSk7CisKKyAgICB7CisgICAgICAgIFJFQ1Qgc3JjUmVjdFdpbiA9CisgICAgICAgIHsKKyAgICAg
ICAgICAgIDAsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgc3RhYmxlUm91bmQodmlzaWJs
ZURzdFJlY3QucmlnaHQoKSkgLSBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC54KCkpLAorICAg
ICAgICAgICAgc3RhYmxlUm91bmQodmlzaWJsZURzdFJlY3QuYm90dG9tKCkpIC0gc3RhYmxlUm91
bmQodmlzaWJsZURzdFJlY3QueSgpKQorICAgICAgICB9OworICAgICAgICBpZiAoc3JjUmVjdFdp
bi5yaWdodCA8PSAwIHx8IHNyY1JlY3RXaW4uYm90dG9tIDw9IDApCisgICAgICAgICAgICByZXR1
cm47CisKKyAgICAgICAgQml0bWFwSW5mbyBibXBJbmZvKCF1c2VBbHBoYSwgc3JjUmVjdFdpbi5y
aWdodCwgc3JjUmVjdFdpbi5ib3R0b20pOworICAgICAgICB2b2lkKiBwaXhlbHM7CisgICAgICAg
IE93blB0cjxIQklUTUFQPiBoYm1wVGVtcChNZW1vcnlNYW5hZ2VyOjpjcmVhdGVESUJTZWN0aW9u
KCZibXBJbmZvLCAmcGl4ZWxzKSk7CisKKyAgICAgICAgaWYgKGhibXBUZW1wKSB7CisgICAgICAg
ICAgICBPd25QdHI8SERDPiBobWVtZGMoQ3JlYXRlQ29tcGF0aWJsZURDKGhkYykpOworICAgICAg
ICAgICAgSEdESU9CSiBvbGRCbXAgPSBTZWxlY3RPYmplY3QoaG1lbWRjLmdldCgpLCBoYm1wVGVt
cC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoY2xpcHBlZEJtcCkKKyAgICAgICAgICAgICAgICBk
cmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RXaW4sIGNsaXBwZWRCbXAuZ2V0
KCksIHBoYXNlV2luKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChvcCAhPSBDb21wb3NpdGVTb3Vy
Y2VPdmVyIHx8IGNhblVzZURJQml0cygpKSAmJiBzcmNSZWN0V2luLnJpZ2h0IDw9IGJtcFNpemUu
Y3ggKiAyICYmIHNyY1JlY3RXaW4uYm90dG9tIDw9IGJtcFNpemUuY3kgKiAyKQorICAgICAgICAg
ICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3JjUmVjdFdpbiwgdGhpcywg
Ym1wU2l6ZSwgcGhhc2VXaW4pOworICAgICAgICAgICAgZWxzZSBpZiAoZW5zdXJlSGFuZGxlKCkp
CisgICAgICAgICAgICAgICAgZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0
V2luLCBnZXRIYW5kbGUoKSwgcGhhc2VXaW4pOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAg
ICAgICAgICAgdm9pZCogcGl4ZWxzOworICAgICAgICAgICAgICAgIEJpdG1hcEluZm8gYm1wSW5m
bzsKKyAgICAgICAgICAgICAgICBpZiAoSEJJVE1BUCBoYm1wID0gY3JlYXRlSGFuZGxlKCZwaXhl
bHMsICZibXBJbmZvLCAtMSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIGRyYXdQYXR0
ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3JjUmVjdFdpbiwgaGJtcCwgcGhhc2VXaW4pOworICAg
ICAgICAgICAgICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7CisgICAgICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgb2xk
Qm1wKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKworI2lmIGRlZmluZWQoTk9fQUxQSEFCTEVORCkKKyAgICAgICAgICAgIGlm
ICh1c2VBbHBoYSB8fChvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVyICYmIHVzZXNUcmFuc3BhcmVu
dENvbG9yKCkpKQorI2Vsc2UKKyAgICAgICAgICAgIGlmICh1c2VBbHBoYSkgeworICAgICAgICAg
ICAgICAgIHN0YXRpYyBjb25zdCBCTEVOREZVTkNUSU9OIGJsZW5kID0geyBBQ19TUkNfT1ZFUiwg
MCwgMjU1LCBBQ19TUkNfQUxQSEEgfTsKKyAgICAgICAgICAgICAgICBBbHBoYUJsZW5kKGhkYywg
ZHN0UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2luLnRvcCwgZHN0UmVjdFdpbi5yaWdodCAtIGRzdFJl
Y3RXaW4ubGVmdCwgZHN0UmVjdFdpbi5ib3R0b20gLSBkc3RSZWN0V2luLnRvcAorICAgICAgICAg
ICAgICAgICAgICAsIGhtZW1kYy5nZXQoKSwgMCwgMCwgc3JjUmVjdFdpbi5yaWdodCwgc3JjUmVj
dFdpbi5ib3R0b20sIGJsZW5kKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT0gQ29tcG9z
aXRlU291cmNlT3ZlciAmJiB1c2VzVHJhbnNwYXJlbnRDb2xvcigpKQorI2VuZGlmCisgICAgICAg
ICAgICAgICAgVHJhbnNwYXJlbnRCbHQoaGRjLCBkc3RSZWN0V2luLmxlZnQsIGRzdFJlY3RXaW4u
dG9wLCBkc3RSZWN0V2luLnJpZ2h0IC0gZHN0UmVjdFdpbi5sZWZ0CisgICAgICAgICAgICAgICAg
ICAgICwgZHN0UmVjdFdpbi5ib3R0b20gLSBkc3RSZWN0V2luLnRvcCwgaG1lbWRjLmdldCgpLCAw
LCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSwgdHJhbnNwYXJlbnRDb2xv
cigpKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIERXT1JEIGJtcE9wID0g
b3AgPT0gQ29tcG9zaXRlQ29weSA/IFNSQ0NPUFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICA6IG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgPyBTUkNDT1BZCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgOiBvcCA9PSBDb21wb3NpdGVYT1IgPyBQQVRJTlZFUlQKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICA6IG9wID09IENvbXBvc2l0ZUNsZWFyID8gV0hJVEVORVNTCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgOiBTUkNDT1BZOyAvLyBGSVhFTUU6IG90aGVyIHR5cGVz
PworCisgICAgICAgICAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFJlY3RXaW4ubGVmdCwg
ZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0V2luLmxlZnQKKyAgICAg
ICAgICAgICAgICAgICAgLCBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9wLCAwLCAw
LCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbQorICAgICAgICAgICAgICAgICAg
ICAsIHBpeGVscywgJmJtcEluZm8sIERJQl9SR0JfQ09MT1JTLCBibXBPcCk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBTZWxlY3RPYmplY3QoaG1lbWRjLmdldCgpLCBvbGRCbXApOworICAg
ICAgICB9CisgICAgfQorfQorCitTaGFyZWRCaXRtYXA6OkRDUHJvdmlkZXIgZ19kY1Byb3ZpZGVy
OworU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyKiBTaGFyZWRCaXRtYXA6Om1fZGNQcm92aWRlciA9
ICZnX2RjUHJvdmlkZXI7CisKK0hEQyBTaGFyZWRCaXRtYXA6OkRDUHJvdmlkZXI6OmdldERDKFNo
YXJlZEJpdG1hcCogYm1wLCB1bnNpZ25lZCoga2V5MSwgdW5zaWduZWQqIGtleTIpCit7CisgICAg
aWYgKCFibXAgfHwgIWJtcC0+ZW5zdXJlSGFuZGxlKCkpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgSERDIGhkYyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURDKDApOworICAgIGlmIChoZGMpIHsKKyAg
ICAgICAgKmtleTEgPSAodW5zaWduZWQpU2VsZWN0T2JqZWN0KGhkYywgYm1wLT5nZXRIYW5kbGUo
KSk7CisgICAgICAgIFJFQ1QgcmVjdCA9IHsgMCwgMCwgYm1wLT53aWR0aCgpLCBibXAtPmhlaWdo
dCgpIH07CisgICAgICAgIE93blB0cjxIUkdOPiBjbGlwUmduKENyZWF0ZVJlY3RSZ25JbmRpcmVj
dCgmcmVjdCkpOworICAgICAgICBTZWxlY3RDbGlwUmduKGhkYywgY2xpcFJnbi5nZXQoKSk7Cisg
ICAgfQorCisgICAgcmV0dXJuIGhkYzsKK30KKwordm9pZCBTaGFyZWRCaXRtYXA6OkRDUHJvdmlk
ZXI6OnJlbGVhc2VEQyhTaGFyZWRCaXRtYXAqLCBIREMgaGRjLCB1bnNpZ25lZCBrZXkxLCB1bnNp
Z25lZCBrZXkyKQoreworICAgIGlmICghaGRjKQorICAgICAgICByZXR1cm47CisKKyAgICBTZWxl
Y3RPYmplY3QoaGRjLCAoSEdESU9CSilrZXkxKTsKKyAgICBEZWxldGVEQyhoZGMpOworfQorCit2
b2lkIFNoYXJlZEJpdG1hcDo6Y2xlYXJQaXhlbHMoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBp
ZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IGJtcFJlY3QoMCwg
MCwgd2lkdGgoKSwgaGVpZ2h0KCkpOworICAgIGJtcFJlY3QuaW50ZXJzZWN0KHIpOworICAgIGlm
IChpczE2Yml0KCkpIHsKKyAgICAgICAgaW50IHcgPSBtX2JtcEluZm8ucGFkZGVkV2lkdGgoKTsK
KyAgICAgICAgdW5zaWduZWQgc2hvcnQqIGRzdCA9ICh1bnNpZ25lZCBzaG9ydCopbV9waXhlbHM7
CisgICAgICAgIGRzdCArPSBibXBSZWN0LnkoKSAqIHcgKyBibXBSZWN0LngoKTsKKyAgICAgICAg
aW50IHdvcmRzVG9TZXQgPSBibXBSZWN0LndpZHRoKCk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVk
IHNob3J0KiBkc3RFbmQgPSBkc3QgKyBibXBSZWN0LmhlaWdodCgpICogdzsKKyAgICAgICAgd2hp
bGUgKGRzdCA8IGRzdEVuZCkgeworICAgICAgICAgICAgd21lbXNldCgod2NoYXJfdCopZHN0LCAw
LCB3b3Jkc1RvU2V0KTsKKyAgICAgICAgICAgIGRzdCArPSB3OworICAgICAgICB9CisgICAgfSBl
bHNlIHsKKyAgICAgICAgaW50IHcgPSB3aWR0aCgpOworICAgICAgICB1bnNpZ25lZCogZHN0ID0g
KHVuc2lnbmVkKiltX3BpeGVsczsKKyAgICAgICAgZHN0ICs9IGJtcFJlY3QueSgpICogdyArIGJt
cFJlY3QueCgpOworICAgICAgICBpbnQgd29yZHNUb1NldCA9IGJtcFJlY3Qud2lkdGgoKSAqIDI7
CisgICAgICAgIGNvbnN0IHVuc2lnbmVkKiBkc3RFbmQgPSBkc3QgKyBibXBSZWN0LmhlaWdodCgp
ICogdzsKKyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkgeworICAgICAgICAgICAgd21lbXNl
dCgod2NoYXJfdCopZHN0LCAwLCB3b3Jkc1RvU2V0KTsKKyAgICAgICAgICAgIGRzdCArPSB3Owor
ICAgICAgICB9CisgICAgfQorfQorCit9CisKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL1NoYXJlZEJpdG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LjM3Njc2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1NoYXJlZEJpdG1hcC5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQml0bWFwSW5mby5oIgorI2luY2x1ZGUg
PHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRl
IDx3aW5nZGkuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgZW51bSBDb21wb3NpdGVP
cGVyYXRvcjsKKyAgICBjbGFzcyBGbG9hdFBvaW50OworICAgIGNsYXNzIEZsb2F0UmVjdDsKKyAg
ICBjbGFzcyBHcmFwaGljc0NvbnRleHQ7CisgICAgY2xhc3MgSW50UmVjdDsKKyAgICBjbGFzcyBJ
bnRTaXplOworICAgIGNsYXNzIFRyYW5zZm9ybWF0aW9uTWF0cml4OworCisgICAgY2xhc3MgU2hh
cmVkQml0bWFwOiBwdWJsaWMgUmVmQ291bnRlZDxTaGFyZWRCaXRtYXA+IHsKKyAgICBwdWJsaWM6
CisgICAgICAgIH5TaGFyZWRCaXRtYXAoKTsKKyAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8U2hh
cmVkQml0bWFwPiBjcmVhdGVJbnN0YW5jZShib29sIGlzMTZiaXQsIGludCB3LCBpbnQgaCwgYm9v
bCBpbml0UGl4ZWxzKTsKKyAgICAgICAgY29uc3QgQml0bWFwSW5mbyYgYml0bWFwSW5mbygpIGNv
bnN0IHsgcmV0dXJuIG1fYm1wSW5mbzsgfQorICAgICAgICB2b2lkKiBieXRlcygpIHsgcmV0dXJu
IG1fcGl4ZWxzOyB9CisgICAgICAgIGNvbnN0IHZvaWQqIGJ5dGVzKCkgY29uc3QgeyByZXR1cm4g
bV9waXhlbHM7IH0KKyAgICAgICAgdW5zaWduZWQgd2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2Jt
cEluZm8ud2lkdGgoKTsgfQorICAgICAgICB1bnNpZ25lZCBoZWlnaHQoKSBjb25zdCB7IHJldHVy
biBtX2JtcEluZm8uaGVpZ2h0KCk7IH0KKyAgICAgICAgdW5zaWduZWQgdmFsaWRIZWlnaHQoKSBj
b25zdCB7IHJldHVybiBtX3ZhbGlkSGVpZ2h0OyB9CisgICAgICAgIHZvaWQgc2V0VmFsaWRIZWln
aHQodW5zaWduZWQgdmFsaWRIZWlnaHQpIHsgbV92YWxpZEhlaWdodCA9IHZhbGlkSGVpZ2h0OyB9
CisgICAgICAgIHZvaWQgcmVzZXRQaXhlbHMoYm9vbCBibGFjayA9IGZhbHNlKTsKKyAgICAgICAg
dm9pZCBjbGVhclBpeGVscyhjb25zdCBJbnRSZWN0JiByKTsKKyAgICAgICAgYm9vbCBsb2NrZWQo
KSBjb25zdCB7IHJldHVybiBtX2xvY2tlZDsgfQorICAgICAgICB2b2lkIGxvY2soKSB7IG1fbG9j
a2VkID0gdHJ1ZTsgfQorICAgICAgICB2b2lkIHVubG9jaygpIHsgbV9sb2NrZWQgPSBmYWxzZTsg
fQorICAgICAgICBib29sIGZyZWVNZW1vcnkoKTsKKyAgICAgICAgYm9vbCBpczE2Yml0KCkgY29u
c3QgeyByZXR1cm4gbV9ibXBJbmZvLmlzMTZiaXQoKTsgfQorICAgICAgICBib29sIGlzMzJiaXQo
KSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8uaXMzMmJpdCgpOyB9CisgICAgICAgIGJvb2wgdG8x
NmJpdCgpOworICAgICAgICBib29sIGhhc0FscGhhKCkgY29uc3QgeyByZXR1cm4gbV9oYXNBbHBo
YTsgfQorICAgICAgICB2b2lkIHNldEhhc0FscGhhKGJvb2wgYWxwaGEpIHsgbV9oYXNBbHBoYSA9
IGFscGhhOyB9CisgICAgICAgIGJvb2wgZW5zdXJlSGFuZGxlKCk7CisgICAgICAgIEhCSVRNQVAg
Z2V0SGFuZGxlKCkgeyByZXR1cm4gbV9oYml0bWFwOyB9CisgICAgICAgIEhCSVRNQVAgY3JlYXRl
SGFuZGxlKHZvaWQqKiBwaXhlbHMsIEJpdG1hcEluZm8qIGJtcEluZm8sIGludCBoID0gLTEsIGJv
b2wgdXNlMTZiaXQgPSB0cnVlKSBjb25zdDsKKyAgICAgICAgYm9vbCB1c2VzVHJhbnNwYXJlbnRD
b2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICAgICAg
Q09MT1JSRUYgdHJhbnNwYXJlbnRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdHJhbnNwYXJlbnRD
b2xvcjsgfQorICAgICAgICB2b2lkIHNldFRyYW5zcGFyZW50Q29sb3IoQ09MT1JSRUYgYykKKyAg
ICAgICAgeworICAgICAgICAgICAgbV91c2VzVHJhbnNwYXJlbnRDb2xvciA9IHRydWU7CisgICAg
ICAgICAgICBtX3RyYW5zcGFyZW50Q29sb3IgPSBjOworICAgICAgICB9CisgICAgICAgIGJvb2wg
Y2FuVXNlRElCaXRzKCkgY29uc3QgeyByZXR1cm4gIWhhc0FscGhhKCkgJiYgIXVzZXNUcmFuc3Bh
cmVudENvbG9yKCk7IH0KKworICAgICAgICBIQklUTUFQIGNsaXBCaXRtYXAoY29uc3QgSW50UmVj
dCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlQWxwaGEsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXBJbmZvJiBibXBJbmZvLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdm9pZComIHBpeGVscyk7CisKKyAgICAgICAgUGFzc1JlZlB0cjxTaGFy
ZWRCaXRtYXA+IGNsaXBCaXRtYXAoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSk7
CisKKyAgICAgICAgdm9pZCBkcmF3KEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgSW50UmVj
dCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29t
cG9zaXRlT3ApOworICAgICAgICB2b2lkIGRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCogY3R4
dCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0
UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0
UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpOworICAgICAgICB2b2lkIGRyYXco
SERDLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb21w
b3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCk7CisgICAgICAgIHZvaWQgZHJhd1BhdHRlcm4oSERD
LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJ
biwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0
b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3Vy
Y2VTaXplKTsKKworICAgICAgICB0eXBlZGVmIHZvaWQgKCpEcmF3UGF0dGVybkZ1bmMpKFNoYXJl
ZEJpdG1hcCogYm1wLCBIREMsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiwgY29uc3QgRmxv
YXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRy
YW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNl
LCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3Qg
SW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpOworICAgICAgICB0eXBlZGVmIGJvb2wgKCpEcmF3SW1h
Z2VGdW5jKSAoU2hhcmVkQml0bWFwKiBibXAsIEhEQywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwg
Y29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApOwor
CisgICAgICAgIHN0YXRpYyBEcmF3UGF0dGVybkZ1bmMgc2V0RHJhd1BhdHRlcm5GdW5jKERyYXdQ
YXR0ZXJuRnVuYyBmdW5jKTsKKyAgICAgICAgc3RhdGljIERyYXdJbWFnZUZ1bmMgc2V0RHJhd0lt
YWdlRnVuYyhEcmF3SW1hZ2VGdW5jIGZ1bmMpOworCisgICAgICAgIGNsYXNzIERDUHJvdmlkZXIg
eworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2aXJ0dWFsIEhEQyBnZXREQyhTaGFyZWRC
aXRtYXAqLCB1bnNpZ25lZCoga2V5MSwgdW5zaWduZWQqIGtleTIpOworICAgICAgICAgICAgdmly
dHVhbCB2b2lkIHJlbGVhc2VEQyhTaGFyZWRCaXRtYXAqLCBIREMgaGRjLCB1bnNpZ25lZCBrZXkx
LCB1bnNpZ25lZCBrZXkyKTsKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgRENQcm92aWRl
ciogbV9kY1Byb3ZpZGVyOworCisgICAgICAgIEhEQyBnZXREQyh1bnNpZ25lZCoga2V5MSwgdW5z
aWduZWQqIGtleTIpIHsgcmV0dXJuIG1fZGNQcm92aWRlci0+Z2V0REModGhpcywga2V5MSwga2V5
Mik7IH0KKyAgICAgICAgdm9pZCByZWxlYXNlREMoSERDIGhkYywgdW5zaWduZWQga2V5MSwgdW5z
aWduZWQga2V5MikgeyBtX2RjUHJvdmlkZXItPnJlbGVhc2VEQyh0aGlzLCBoZGMsIGtleTEsIGtl
eTIpOyB9CisKKyAgICAgICAgY2xhc3MgRENIb2xkZXIgeworICAgICAgICBwdWJsaWM6CisgICAg
ICAgICAgICBEQ0hvbGRlcihTaGFyZWRCaXRtYXAqIGJtcCA9IDApIHsgX3NldChibXApOyB9Cisg
ICAgICAgICAgICB+RENIb2xkZXIoKSB7IF9jbGVhcigpOyB9CisgICAgICAgICAgICB2b2lkIHNl
dChTaGFyZWRCaXRtYXAqIGJtcCA9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
X2NsZWFyKCk7CisgICAgICAgICAgICAgICAgX3NldChibXApOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgSERDIGdldCgpIGNvbnN0IHsgcmV0dXJuIG1faGRjOyB9CisgICAgICAgIHByaXZh
dGU6CisgICAgICAgICAgICBEQ0hvbGRlciYgb3BlcmF0b3I9KGNvbnN0IERDSG9sZGVyJik7Cisg
ICAgICAgICAgICBEQ0hvbGRlcihjb25zdCBEQ0hvbGRlciYpOworICAgICAgICAgICAgdm9pZCBf
Y2xlYXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtX2hkYykKKyAgICAg
ICAgICAgICAgICAgICAgbV9iaXRtYXAtPnJlbGVhc2VEQyhtX2hkYywgbV9rZXkxLCBtX2tleTIp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBfc2V0KFNoYXJlZEJpdG1hcCogYm1w
KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fYml0bWFwID0gYm1wOworICAgICAg
ICAgICAgICAgIG1faGRjID0gYm1wID8gYm1wLT5nZXREQygmbV9rZXkxLCAmbV9rZXkyKSA6IDA7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTaGFyZWRCaXRtYXAqIG1fYml0bWFwOworICAg
ICAgICAgICAgSERDIG1faGRjOworICAgICAgICAgICAgdW5zaWduZWQgbV9rZXkxOworICAgICAg
ICAgICAgdW5zaWduZWQgbV9rZXkyOworICAgICAgICB9OworCisgICAgcHJpdmF0ZToKKyAgICAg
ICAgZXhwbGljaXQgU2hhcmVkQml0bWFwKGJvb2wgaXMxNmJpdCwgaW50IHcsIGludCBoLCBib29s
IGluaXRQaXhlbHMpOworICAgICAgICBleHBsaWNpdCBTaGFyZWRCaXRtYXAoY29uc3QgQml0bWFw
SW5mbyYgYm1wSW5mbywgSEJJVE1BUCBoYm1wLCB2b2lkKiBwaXhlbHMpOworICAgICAgICBCaXRt
YXBJbmZvIG1fYm1wSW5mbzsKKyAgICAgICAgaW50IG1fcmVmZXJlbmNlOworICAgICAgICBIQklU
TUFQIG1faGJpdG1hcDsKKyAgICAgICAgdm9pZCogbV9waXhlbHM7CisgICAgICAgIENPTE9SUkVG
IG1fdHJhbnNwYXJlbnRDb2xvcjsKKyAgICAgICAgaW50IG1fdmFsaWRIZWlnaHQ7CisgICAgICAg
IGJvb2wgbV9sb2NrZWQ7CisgICAgICAgIGJvb2wgbV91c2VzVHJhbnNwYXJlbnRDb2xvcjsKKyAg
ICAgICAgYm9vbCBtX2hhc0FscGhhOworICAgIH07CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vaW1hZ2UtZW5jb2RlcnMvd2luY2UvSlBFR0VuY29kZXIuY3BwIGIvV2ViQ29yZS9w
bGF0Zm9ybS9pbWFnZS1lbmNvZGVycy93aW5jZS9KUEVHRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3YTg1OQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vaW1hZ2UtZW5jb2RlcnMvd2luY2UvSlBFR0VuY29kZXIuY3BwCkBAIC0wLDAg
KzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJKUEVHRW5jb2Rlci5oIgorCisjaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgiCisKKyNk
ZWZpbmUgWE1EX0gKKyNkZWZpbmUgVlRLX0pQRUdfWE1EX0gKKyN1bmRlZiBGQVIKKworZXh0ZXJu
ICJDIiB7CisjaW5jbHVkZSAianBlZ2xpYi5oIgorfQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3N0cnVjdCBqcGVnX2Rlc3RfbWdyIHsKKyAgICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3Ig
cHViOworICAgIFZlY3RvcjxjaGFyPiBidWZmZXI7CisgICAgVmVjdG9yPGNoYXI+KiBkdW1wOwor
fTsKKworc3RydWN0IGpwZWdfY29tcHJlc3NfZXJyb3JfbWdyIHsKKyAgICBzdHJ1Y3QganBlZ19l
cnJvcl9tZ3IgcHViOworICAgIGptcF9idWYgc2V0am1wX2J1ZmZlcjsKK307CisKK3ZvaWQganBl
Z19pbml0X2Rlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNvbXByZXNzRGF0YSkKK3sKKyAgICBq
cGVnX2Rlc3RfbWdyKiBkZXN0ID0gKGpwZWdfZGVzdF9tZ3IqKWNvbXByZXNzRGF0YS0+ZGVzdDsK
KyAgICBkZXN0LT5idWZmZXIucmVzaXplKDQwOTYpOworICAgIGRlc3QtPnB1Yi5uZXh0X291dHB1
dF9ieXRlICA9IChKT0NURVQqKWRlc3QtPmJ1ZmZlci5kYXRhKCk7CisgICAgZGVzdC0+cHViLmZy
ZWVfaW5fYnVmZmVyICAgID0gZGVzdC0+YnVmZmVyLnNpemUoKTsKK30KKworYm9vbGVhbiBqcGVn
X2VtcHR5X291dHB1dF9idWZmZXIoal9jb21wcmVzc19wdHIgY29tcHJlc3NEYXRhKQoreworICAg
IGpwZWdfZGVzdF9tZ3IqIGRlc3QgPSAoanBlZ19kZXN0X21nciopY29tcHJlc3NEYXRhLT5kZXN0
OworICAgIGRlc3QtPmR1bXAtPmFwcGVuZChkZXN0LT5idWZmZXIuZGF0YSgpLCBkZXN0LT5idWZm
ZXIuc2l6ZSgpIC0gZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyKTsKKyAgICBkZXN0LT5wdWIubmV4
dF9vdXRwdXRfYnl0ZSAgPSAoSk9DVEVUKilkZXN0LT5idWZmZXIuZGF0YSgpOworICAgIGRlc3Qt
PnB1Yi5mcmVlX2luX2J1ZmZlciAgICA9IGRlc3QtPmJ1ZmZlci5zaXplKCk7CisgICAgcmV0dXJu
IFRSVUU7Cit9CisKK3ZvaWQganBlZ190ZXJtX2Rlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNv
bXByZXNzRGF0YSkKK3sKKyAgICBqcGVnX2Rlc3RfbWdyKiBkZXN0ID0gKGpwZWdfZGVzdF9tZ3Iq
KWNvbXByZXNzRGF0YS0+ZGVzdDsKKyAgICBkZXN0LT5kdW1wLT5hcHBlbmQoZGVzdC0+YnVmZmVy
LmRhdGEoKSwgZGVzdC0+YnVmZmVyLnNpemUoKSAtIGRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlcik7
Cit9CisKK3ZvaWQganBlZ19lcnJvcl9leGl0KGpfY29tbW9uX3B0ciBjb21wcmVzc0RhdGEpCit7
CisgICAganBlZ19jb21wcmVzc19lcnJvcl9tZ3IgKmVyciA9IChqcGVnX2NvbXByZXNzX2Vycm9y
X21nciopY29tcHJlc3NEYXRhLT5lcnI7CisgICAgbG9uZ2ptcChlcnItPnNldGptcF9idWZmZXIs
IC0xKTsKK30KKworYm9vbCBjb21wcmVzc0JpdG1hcFRvSnBlZyhTaGFyZWRCaXRtYXAqIGJtcCwg
VmVjdG9yPGNoYXI+JiBqcGVnRGF0YSkKK3sKKyAgICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1
Y3QgY29tcHJlc3NEYXRhPSB7MH07CisgICAganBlZ19jb21wcmVzc19lcnJvcl9tZ3IgZXJyOwor
ICAgIGNvbXByZXNzRGF0YS5lcnIgPSBqcGVnX3N0ZF9lcnJvcigoanBlZ19lcnJvcl9tZ3IqKSZl
cnIpOworICAgIGVyci5wdWIuZXJyb3JfZXhpdCA9IGpwZWdfZXJyb3JfZXhpdDsKKworICAgIGpw
ZWdfY3JlYXRlX2NvbXByZXNzKCZjb21wcmVzc0RhdGEpOworCisgICAganBlZ19kZXN0X21nciog
ZGVzdCA9IChqcGVnX2Rlc3RfbWdyKilmYXN0Q2FsbG9jKHNpemVvZihqcGVnX2Rlc3RfbWdyKSwg
MSk7CisgICAgZGVzdC0+ZHVtcCA9ICZqcGVnRGF0YTsKKyAgICBjb21wcmVzc0RhdGEuZGVzdCA9
IChzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IqKWRlc3Q7CisgICAgZGVzdC0+cHViLmluaXRf
ZGVzdGluYXRpb24gPSBqcGVnX2luaXRfZGVzdGluYXRpb247CisgICAgZGVzdC0+cHViLmVtcHR5
X291dHB1dF9idWZmZXIgPSBqcGVnX2VtcHR5X291dHB1dF9idWZmZXI7CisgICAgZGVzdC0+cHVi
LnRlcm1fZGVzdGluYXRpb24gPSBqcGVnX3Rlcm1fZGVzdGluYXRpb247CisKKyAgICBjb21wcmVz
c0RhdGEuaW1hZ2Vfd2lkdGggPSBibXAtPndpZHRoKCk7CisgICAgY29tcHJlc3NEYXRhLmltYWdl
X2hlaWdodCA9IGJtcC0+aGVpZ2h0KCk7CisgICAgY29tcHJlc3NEYXRhLmlucHV0X2NvbXBvbmVu
dHMgPSAzOworICAgIGNvbXByZXNzRGF0YS5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisgICAg
anBlZ19zZXRfZGVmYXVsdHMoJmNvbXByZXNzRGF0YSk7CisgICAganBlZ19zZXRfcXVhbGl0eSgm
Y29tcHJlc3NEYXRhLCA2NSwgRkFMU0UpOworCisgICAgVmVjdG9yPEpTQU1QTEUsIDIwNDg+IHJv
d0J1ZmZlcjsKKyAgICBpZiAoc2V0am1wKGVyci5zZXRqbXBfYnVmZmVyKSkgeworICAgICAgICBq
cGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmNvbXByZXNzRGF0YSk7CisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9CisKKyAgICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjb21wcmVzc0RhdGEsIFRSVUUp
OworCisgICAgcm93QnVmZmVyLnJlc2l6ZShjb21wcmVzc0RhdGEuaW1hZ2Vfd2lkdGggKiAzKTsK
KyAgICBpZiAoYm1wLT5pczE2Yml0KCkpIHsKKyAgICAgICAgaW50IHBhZGRlZFdpZHRoID0gYm1w
LT5iaXRtYXBJbmZvKCkucGFkZGVkV2lkdGgoKTsKKyAgICAgICAgaW50IHNraXAgPSBwYWRkZWRX
aWR0aCAtIGNvbXByZXNzRGF0YS5pbWFnZV93aWR0aDsKKyAgICAgICAgY29uc3QgdW5zaWduZWQg
c2hvcnQqIHBpeGVsID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgc2hvcnQqPihibXAtPmJ5
dGVzKCkpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogcGl4ZWxFbmQgPSBwaXhlbCAr
IHBhZGRlZFdpZHRoICogY29tcHJlc3NEYXRhLmltYWdlX2hlaWdodDsKKyAgICAgICAgZm9yICg7
IHBpeGVsIDwgcGl4ZWxFbmQ7IHBpeGVsICs9IHNraXApIHsKKyAgICAgICAgICAgIEpTQU1QTEUq
IGRzdCA9IHJvd0J1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVk
IHNob3J0KiByb3dFbmQgPSBwaXhlbCArIGNvbXByZXNzRGF0YS5pbWFnZV93aWR0aDsgcGl4ZWwg
PCByb3dFbmQ7KSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdmFsdWUgPSAqcGl4
ZWwrKzsKKyNpZiBJTUFHRV9OT19BTFBIQV9VU0VfUkdCNTU1CisgICAgICAgICAgICAgICAgKmRz
dCsrID0gSlNBTVBMRSgodmFsdWUgPj4gNykgJiAweEY4KTsKKyAgICAgICAgICAgICAgICAqZHN0
KysgPSBKU0FNUExFKCh2YWx1ZSA+PiAyKSAmIDB4RjgpOworICAgICAgICAgICAgICAgICpkc3Qr
KyA9IEpTQU1QTEUoKHZhbHVlIDw8IDMpICYgMHhGOCk7CisjZWxzZQorICAgICAgICAgICAgICAg
ICpkc3QrKyA9IEpTQU1QTEUoKHZhbHVlID4+IDgpICYgMHhGOCk7CisgICAgICAgICAgICAgICAg
KmRzdCsrID0gSlNBTVBMRSgodmFsdWUgPj4gMykgJiAweEZDKTsKKyAgICAgICAgICAgICAgICAq
ZHN0KysgPSBKU0FNUExFKCh2YWx1ZSA8PCAzKSAmIDB4RjgpOworI2VuZGlmCisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBkc3QgPSByb3dCdWZmZXIuZGF0YSgpOworICAgICAgICAgICAganBl
Z193cml0ZV9zY2FubGluZXMoJmNvbXByZXNzRGF0YSwgJmRzdCwgMSk7CisgICAgICAgIH0KKyAg
ICB9IGVsc2UgeworICAgICAgICBjb25zdCB1bnNpZ25lZCogcGl4ZWwgPSBzdGF0aWNfY2FzdDxj
b25zdCB1bnNpZ25lZCo+KGJtcC0+Ynl0ZXMoKSk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkKiBw
aXhlbEVuZCA9IHBpeGVsICsgY29tcHJlc3NEYXRhLmltYWdlX3dpZHRoICogY29tcHJlc3NEYXRh
LmltYWdlX2hlaWdodDsKKyAgICAgICAgZm9yICg7IHBpeGVsIDwgcGl4ZWxFbmQ7ICkgeworICAg
ICAgICAgICAgSlNBTVBMRSogZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIGZv
ciAoY29uc3QgdW5zaWduZWQqIHJvd0VuZCA9IHBpeGVsICsgY29tcHJlc3NEYXRhLmltYWdlX3dp
ZHRoOyBwaXhlbCA8IHJvd0VuZDspIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWx1ZSA9
ICpwaXhlbCsrOworICAgICAgICAgICAgICAgICpkc3QrKyA9IEpTQU1QTEUoKHZhbHVlID4+IDE2
KSAmIDB4RkYpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IEpTQU1QTEUoKHZhbHVlID4+IDgp
ICYgMHhGRik7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gSlNBTVBMRSgodmFsdWUpICYgMHhG
Rik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3QgPSByb3dCdWZmZXIuZGF0YSgpOwor
ICAgICAgICAgICAganBlZ193cml0ZV9zY2FubGluZXMoJmNvbXByZXNzRGF0YSwgJmRzdCwgMSk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBqcGVnX2ZpbmlzaF9jb21wcmVzcygmY29tcHJlc3NE
YXRhKTsKKyAgICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmNvbXByZXNzRGF0YSk7CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZW5j
b2RlcnMvd2luY2UvSlBFR0VuY29kZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZW5jb2Rl
cnMvd2luY2UvSlBFR0VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li43Mjg3YzdlCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1lbmNv
ZGVycy93aW5jZS9KUEVHRW5jb2Rlci5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICovCisKKworI2lmbmRlZiBKUEVHX0VOQ09ERVJfSAorI2RlZmluZSBKUEVHX0VOQ09ERVJfSAor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgYm9vbCBjb21wcmVzc0JpdG1hcFRvSnBlZyhTaGFy
ZWRCaXRtYXAqIGJtcCwgVmVjdG9yPGNoYXI+JiBqcGVnRGF0YSk7Cit9CisKKyNlbmRpZiAvLyBK
UEVHX0VOQ09ERVJfSApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1lbmNvZGVy
cy93aW5jZS9QTkdFbmNvZGVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZW5jb2RlcnMv
d2luY2UvUE5HRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
NmM5ZGVlMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZW5jb2Rl
cnMvd2luY2UvUE5HRW5jb2Rlci5jcHAKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmln
aHQgKGMpIDIwMDYtMjAwOSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoYykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUE5HRW5jb2Rlci5oIgorCitleHRlcm4gIkMi
IHsKKyNpbmNsdWRlICJwbmcuaCIKK30KKworI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCisvLyBFbmNvZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBz
ZWN0aW9uIG9mIHRoZSBjb2RlIGlzIGJhc2VkIG9uIG5zUE5HRW5jb2Rlci5jcHAgaW4gTW96aWxs
YQorLy8gKENvcHlyaWdodCAyMDA1IEdvb2dsZSBJbmMuKQorCisvLyBQYXNzZWQgYXJvdW5kIGFz
IHRoZSBpb19wdHIgaW4gdGhlIHBuZyBzdHJ1Y3RzIHNvIG91ciBjYWxsYmFja3Mga25vdyB3aGVy
ZQorLy8gdG8gd3JpdGUgZGF0YS4KK3N0cnVjdCBQTkdFbmNvZGVyU3RhdGUgeworICAgIFBOR0Vu
Y29kZXJTdGF0ZShWZWN0b3I8Y2hhcj4qIG8pIDogbV9vdXQobykge30KKyAgICBWZWN0b3I8Y2hh
cj4qIG1fb3V0OworfTsKKworLy8gQ2FsbGVkIGJ5IGxpYnBuZyB0byBmbHVzaCBpdHMgaW50ZXJu
YWwgYnVmZmVyIHRvIG91cnMuCit2b2lkIGVuY29kZXJXcml0ZUNhbGxiYWNrKHBuZ19zdHJ1Y3Rw
IHBuZywgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3Qgc2l6ZSkKK3sKKyAgICBQTkdFbmNvZGVy
U3RhdGUqIHN0YXRlID0gc3RhdGljX2Nhc3Q8UE5HRW5jb2RlclN0YXRlKj4ocG5nX2dldF9pb19w
dHIocG5nKSk7CisgICAgQVNTRVJUKHN0YXRlLT5tX291dCk7CisKKyAgICBzaXplX3Qgb2xkU2l6
ZSA9IHN0YXRlLT5tX291dC0+c2l6ZSgpOworICAgIHN0YXRlLT5tX291dC0+cmVzaXplKG9sZFNp
emUgKyBzaXplKTsKKyAgICBtZW1jcHkoJigqc3RhdGUtPm1fb3V0KVtvbGRTaXplXSwgZGF0YSwg
c2l6ZSk7Cit9CisKKy8vIEF1dG9tYXRpY2FsbHkgZGVzdHJveXMgdGhlIGdpdmVuIHdyaXRlIHN0
cnVjdHMgb24gZGVzdHJ1Y3Rpb24gdG8gbWFrZQorLy8gY2xlYW51cCBhbmQgZXJyb3IgaGFuZGxp
bmcgY29kZSBjbGVhbmVyLgorY2xhc3MgUE5HV3JpdGVTdHJ1Y3REZXN0cm95ZXIgeworcHVibGlj
OgorICAgIFBOR1dyaXRlU3RydWN0RGVzdHJveWVyKHBuZ19zdHJ1Y3QqKiBwcywgcG5nX2luZm8q
KiBwaSkKKyAgICAgICAgOiBtX3BuZ1N0cnVjdChwcykKKyAgICAgICAgLCBtX3BuZ0luZm8ocGkp
CisgICAgeworICAgIH0KKworICAgIH5QTkdXcml0ZVN0cnVjdERlc3Ryb3llcigpCisgICAgewor
ICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QobV9wbmdTdHJ1Y3QsIG1fcG5nSW5mbyk7
CisgICAgfQorCitwcml2YXRlOgorICAgIHBuZ19zdHJ1Y3QqKiBtX3BuZ1N0cnVjdDsKKyAgICBw
bmdfaW5mbyoqIG1fcG5nSW5mbzsKK307CisKK2Jvb2wgY29tcHJlc3NCaXRtYXBUb1BuZyhTaGFy
ZWRCaXRtYXAqIGJtcCwgVmVjdG9yPGNoYXI+JiBwbmdEYXRhKQoreworICAgIGlmICghYm1wLT5i
eXRlcygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBwbmdfc3RydWN0KiBwbmdQdHIg
PSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3ZvaWRwX05VTEws
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2Vy
cm9yX3B0cl9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHBuZ19lcnJvcl9wdHJfTlVMTCk7CisgICAgaWYgKCFwbmdQdHIpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIHBuZ19pbmZvKiBpbmZvUHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0
cnVjdChwbmdQdHIpOworICAgIGlmICghaW5mb1B0cikgeworICAgICAgICBwbmdfZGVzdHJveV93
cml0ZV9zdHJ1Y3QoJnBuZ1B0ciwgMCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cisg
ICAgUE5HV3JpdGVTdHJ1Y3REZXN0cm95ZXIgZGVzdHJveWVyKCZwbmdQdHIsICZpbmZvUHRyKTsK
KworICAgIGludCBieXRlRGVwdGggPSBibXAtPmlzMTZiaXQoKSA/IDMgOiA0OworICAgIFZlY3Rv
cjx1bnNpZ25lZCBjaGFyLCAyMDQ4PiByb3dCdWZmZXI7CisgICAgcm93QnVmZmVyLnJlc2l6ZShi
bXAtPndpZHRoKCkgKiBieXRlRGVwdGgpOworCisgICAgLy8gVGhlIGRlc3Ryb3llciB3aWxsIGVu
c3VyZSB0aGF0IHRoZSBzdHJ1Y3R1cmVzIGFyZSBjbGVhbmVkIHVwIGluIHRoaXMKKyAgICAvLyBj
YXNlLCBldmVuIHRob3VnaCB3ZSBtYXkgZ2V0IGhlcmUgYXMgYSBqdW1wIGZyb20gcmFuZG9tIHBh
cnRzIG9mIHRoZQorICAgIC8vIFBORyBsaWJyYXJ5IGNhbGxlZCBiZWxvdy4KKyAgICBpZiAoc2V0
am1wKHBuZ19qbXBidWYocG5nUHRyKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8v
IFNldCBvdXIgY2FsbGJhY2sgZm9yIGxpYnBuZyB0byBnaXZlIHVzIHRoZSBkYXRhLgorICAgIFBO
R0VuY29kZXJTdGF0ZSBzdGF0ZSgmcG5nRGF0YSk7CisgICAgcG5nX3NldF93cml0ZV9mbihwbmdQ
dHIsICZzdGF0ZSwgZW5jb2RlcldyaXRlQ2FsbGJhY2ssIDApOworCisgICAgaW50IHBuZ091dHB1
dENvbG9yVHlwZSA9IGJtcC0+aXMxNmJpdCgpID8gUE5HX0NPTE9SX1RZUEVfUkdCIDogUE5HX0NP
TE9SX1RZUEVfUkdCX0FMUEhBOworCisgICAgcG5nX3NldF9JSERSKHBuZ1B0ciwgaW5mb1B0ciwg
Ym1wLT53aWR0aCgpLCBibXAtPmhlaWdodCgpLCA4LCBwbmdPdXRwdXRDb2xvclR5cGUsCisgICAg
ICAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0NPTVBSRVNTSU9OX1RZUEVfREVG
QVVMVCwKKyAgICAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQpOworICAgIHBu
Z193cml0ZV9pbmZvKHBuZ1B0ciwgaW5mb1B0cik7CisKKyAgICBpZiAoYm1wLT5pczE2Yml0KCkp
IHsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQqIHNyYyA9ICh1bnNpZ25lZCBzaG9ydCopYm1wLT5i
eXRlcygpOworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IChpbnQpYm1wLT5oZWlnaHQoKTsg
Kyt5KSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBkc3QgPSByb3dCdWZmZXIuZGF0YSgp
OworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAoaW50KWJtcC0+d2lkdGgoKTsgKyt4
KSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdmFsdWUgPSAqc3JjKys7CisjaWYg
SU1BR0VfTk9fQUxQSEFfVVNFX1JHQjU1NQorICAgICAgICAgICAgICAgICpkc3QrKyA9IHVuc2ln
bmVkIGNoYXIoKHZhbHVlID4+IDcpICYgMHhGOCk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0g
dW5zaWduZWQgY2hhcigodmFsdWUgPj4gMikgJiAweEY4KTsKKyAgICAgICAgICAgICAgICAqZHN0
KysgPSB1bnNpZ25lZCBjaGFyKCh2YWx1ZSA8PCAzKSAmIDB4RjgpOworI2Vsc2UKKyAgICAgICAg
ICAgICAgICAqZHN0KysgPSB1bnNpZ25lZCBjaGFyKCh2YWx1ZSA+PiA4KSAmIDB4RjgpOworICAg
ICAgICAgICAgICAgICpkc3QrKyA9IHVuc2lnbmVkIGNoYXIoKHZhbHVlID4+IDMpICYgMHhGQyk7
CisgICAgICAgICAgICAgICAgKmRzdCsrID0gdW5zaWduZWQgY2hhcigodmFsdWUgPDwgMykgJiAw
eEY4KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG5nX3dyaXRlX3Jvdyhw
bmdQdHIsIHJvd0J1ZmZlci5kYXRhKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgdW5zaWduZWQgY2hhciogc3JjID0gKHVuc2lnbmVkIGNoYXIqKWJtcC0+Ynl0ZXMoKTsKKyAg
ICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAoaW50KWJtcC0+aGVpZ2h0KCk7ICsreSkgeworICAg
ICAgICAgICAgdW5zaWduZWQgY2hhciogZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAgICAg
ICAgIGZvciAoaW50IHggPSAwOyB4IDwgKGludClibXAtPndpZHRoKCk7ICsreCkgeworICAgICAg
ICAgICAgICAgIC8vIE5vdGU6IFBORyBpcyBpbiBiaWcgZW5kaWFuCisgICAgICAgICAgICAgICAg
dW5zaWduZWQgY2hhciBiID0gKnNyYysrOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIg
ZyA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHIgPSAqc3JjKys7Cisg
ICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhID0gKnNyYysrOworICAgICAgICAgICAgICAg
ICpkc3QrKyA9IHI7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gZzsKKyAgICAgICAgICAgICAg
ICAqZHN0KysgPSBiOworICAgICAgICAgICAgICAgICpkc3QrKyA9IGE7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBwbmdfd3JpdGVfcm93KHBuZ1B0ciwgcm93QnVmZmVyLmRhdGEoKSk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBwbmdfd3JpdGVfZW5kKHBuZ1B0ciwgaW5mb1B0cik7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQg
YS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWVuY29kZXJzL3dpbmNlL1BOR0VuY29kZXIuaCBiL1dl
YkNvcmUvcGxhdGZvcm0vaW1hZ2UtZW5jb2RlcnMvd2luY2UvUE5HRW5jb2Rlci5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDU2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWVuY29kZXJzL3dpbmNlL1BOR0VuY29kZXIuaApAQCAtMCww
ICsxLDI5IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwg
SW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFBOR19FTkNPREVSX0gKKyNkZWZpbmUgUE5HX0VOQ09E
RVJfSAorCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7Cisg
ICAgYm9vbCBjb21wcmVzc0JpdG1hcFRvUG5nKFNoYXJlZEJpdG1hcCogYm1wLCBWZWN0b3I8Y2hh
cj4mIHBuZ0RhdGEpOworfQorCisjZW5kaWYgLy8gUE5HX0VOQ09ERVJfSAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33813</attachid>
            <date>2009-07-30 13:11:12 -0700</date>
            <delta_ts>2009-08-08 13:12:31 -0700</delta_ts>
            <desc>1) image encoders</desc>
            <filename>27511_1.patch</filename>
            <type>text/plain</type>
            <size>16728</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MWI2YTE1ZC4uN2JmYzY5YSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNiBAQAorMjAwOS0wNy0yMSAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAgKE9P
UFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
Mjc1MTEKKyAgICAgICAgQWRkIFdJTkNFIHNwZWNpZmljIHBsYXRmb3JtL2dyYXBoaWNzIGZpbGVz
IGZvciB0aGUgV2luQ0UgcG9ydC4KKworICAgICAgICBXcml0dGVuIGJ5IFlvbmcgTGkgPHlvbmcu
bGlAdG9yY2htb2JpbGUuY29tPiwgR2VvcmdlIFN0YWlrb3MgPGdlb3JnZS5zdGFpa29zQHRvcmNo
bW9iaWxlLmNvbT4sIENyeXN0YWwgWmhhbmcgPGNyeXN0YWwuemhhbmdAdG9yY2htb2JpbGUuY29t
PgorICAgICAgICBhbmQgTHlvbiBDaGVuIDxseW9uLmNoZW5AdG9yY2htb2JpbGUuY29tPgorCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvQ29sb3JXaW5jZS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dyYWRpZW50V2luY2UuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlckRhdGEuaDog
QWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJXaW5j
ZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRGVj
b2RlclV0aWxpdGllcy5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL0ltYWdlRGVjb2RlclV0aWxpdGllcy5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9JbWFnZUZyYW1lU2luay5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9JbWFnZUZyYW1lU2lua1dpbmNlLmNwcDogQWRkZWQuCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VTb3VyY2VXaW5jZS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlV2luY2UuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9KUEVHRW5jb2Rlci5jcHA6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0pQRUdFbmNvZGVyLmg6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJpdmF0ZVdp
bmNlLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxh
eWVyUHJveHkuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9N
ZWRpYVBsYXllclByb3h5Lmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BOR0VuY29kZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93
aW5jZS9QTkdFbmNvZGVyLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BhdGhXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmg6IEFkZGVkLgorCiAyMDA5LTA3LTMw
ICBZb25nIExpICA8eW9uZy5saUB0b3JjaG1vYmlsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWVu
Y29kZXJzL3dpbmNlL0pQRUdFbmNvZGVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZW5j
b2RlcnMvd2luY2UvSlBFR0VuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLjAzN2E4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2ltYWdl
LWVuY29kZXJzL3dpbmNlL0pQRUdFbmNvZGVyLmNwcApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBU
aGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAq
ICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCisgKi8KKworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSlBFR0VuY29k
ZXIuaCIKKworI2luY2x1ZGUgIlNoYXJlZEJpdG1hcC5oIgorCisjZGVmaW5lIFhNRF9ICisjZGVm
aW5lIFZUS19KUEVHX1hNRF9ICisjdW5kZWYgRkFSCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUg
ImpwZWdsaWIuaCIKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdHJ1Y3QganBlZ19kZXN0
X21nciB7CisgICAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHB1YjsKKyAgICBWZWN0b3I8
Y2hhcj4gYnVmZmVyOworICAgIFZlY3RvcjxjaGFyPiogZHVtcDsKK307CisKK3N0cnVjdCBqcGVn
X2NvbXByZXNzX2Vycm9yX21nciB7CisgICAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIHB1YjsKKyAg
ICBqbXBfYnVmIHNldGptcF9idWZmZXI7Cit9OworCit2b2lkIGpwZWdfaW5pdF9kZXN0aW5hdGlv
bihqX2NvbXByZXNzX3B0ciBjb21wcmVzc0RhdGEpCit7CisgICAganBlZ19kZXN0X21nciogZGVz
dCA9IChqcGVnX2Rlc3RfbWdyKiljb21wcmVzc0RhdGEtPmRlc3Q7CisgICAgZGVzdC0+YnVmZmVy
LnJlc2l6ZSg0MDk2KTsKKyAgICBkZXN0LT5wdWIubmV4dF9vdXRwdXRfYnl0ZSAgPSAoSk9DVEVU
KilkZXN0LT5idWZmZXIuZGF0YSgpOworICAgIGRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlciAgICA9
IGRlc3QtPmJ1ZmZlci5zaXplKCk7Cit9CisKK2Jvb2xlYW4ganBlZ19lbXB0eV9vdXRwdXRfYnVm
ZmVyKGpfY29tcHJlc3NfcHRyIGNvbXByZXNzRGF0YSkKK3sKKyAgICBqcGVnX2Rlc3RfbWdyKiBk
ZXN0ID0gKGpwZWdfZGVzdF9tZ3IqKWNvbXByZXNzRGF0YS0+ZGVzdDsKKyAgICBkZXN0LT5kdW1w
LT5hcHBlbmQoZGVzdC0+YnVmZmVyLmRhdGEoKSwgZGVzdC0+YnVmZmVyLnNpemUoKSAtIGRlc3Qt
PnB1Yi5mcmVlX2luX2J1ZmZlcik7CisgICAgZGVzdC0+cHViLm5leHRfb3V0cHV0X2J5dGUgID0g
KEpPQ1RFVCopZGVzdC0+YnVmZmVyLmRhdGEoKTsKKyAgICBkZXN0LT5wdWIuZnJlZV9pbl9idWZm
ZXIgICAgPSBkZXN0LT5idWZmZXIuc2l6ZSgpOworICAgIHJldHVybiBUUlVFOworfQorCit2b2lk
IGpwZWdfdGVybV9kZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjb21wcmVzc0RhdGEpCit7Cisg
ICAganBlZ19kZXN0X21nciogZGVzdCA9IChqcGVnX2Rlc3RfbWdyKiljb21wcmVzc0RhdGEtPmRl
c3Q7CisgICAgZGVzdC0+ZHVtcC0+YXBwZW5kKGRlc3QtPmJ1ZmZlci5kYXRhKCksIGRlc3QtPmJ1
ZmZlci5zaXplKCkgLSBkZXN0LT5wdWIuZnJlZV9pbl9idWZmZXIpOworfQorCit2b2lkIGpwZWdf
ZXJyb3JfZXhpdChqX2NvbW1vbl9wdHIgY29tcHJlc3NEYXRhKQoreworICAgIGpwZWdfY29tcHJl
c3NfZXJyb3JfbWdyICplcnIgPSAoanBlZ19jb21wcmVzc19lcnJvcl9tZ3IqKWNvbXByZXNzRGF0
YS0+ZXJyOworICAgIGxvbmdqbXAoZXJyLT5zZXRqbXBfYnVmZmVyLCAtMSk7Cit9CisKK2Jvb2wg
Y29tcHJlc3NCaXRtYXBUb0pwZWcoU2hhcmVkQml0bWFwKiBibXAsIFZlY3RvcjxjaGFyPiYganBl
Z0RhdGEpCit7CisgICAgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNvbXByZXNzRGF0YT0g
ezB9OworICAgIGpwZWdfY29tcHJlc3NfZXJyb3JfbWdyIGVycjsKKyAgICBjb21wcmVzc0RhdGEu
ZXJyID0ganBlZ19zdGRfZXJyb3IoKGpwZWdfZXJyb3JfbWdyKikmZXJyKTsKKyAgICBlcnIucHVi
LmVycm9yX2V4aXQgPSBqcGVnX2Vycm9yX2V4aXQ7CisKKyAgICBqcGVnX2NyZWF0ZV9jb21wcmVz
cygmY29tcHJlc3NEYXRhKTsKKworICAgIGpwZWdfZGVzdF9tZ3IqIGRlc3QgPSAoanBlZ19kZXN0
X21nciopZmFzdENhbGxvYyhzaXplb2YoanBlZ19kZXN0X21nciksIDEpOworICAgIGRlc3QtPmR1
bXAgPSAmanBlZ0RhdGE7CisgICAgY29tcHJlc3NEYXRhLmRlc3QgPSAoc3RydWN0IGpwZWdfZGVz
dGluYXRpb25fbWdyKilkZXN0OworICAgIGRlc3QtPnB1Yi5pbml0X2Rlc3RpbmF0aW9uID0ganBl
Z19pbml0X2Rlc3RpbmF0aW9uOworICAgIGRlc3QtPnB1Yi5lbXB0eV9vdXRwdXRfYnVmZmVyID0g
anBlZ19lbXB0eV9vdXRwdXRfYnVmZmVyOworICAgIGRlc3QtPnB1Yi50ZXJtX2Rlc3RpbmF0aW9u
ID0ganBlZ190ZXJtX2Rlc3RpbmF0aW9uOworCisgICAgY29tcHJlc3NEYXRhLmltYWdlX3dpZHRo
ID0gYm1wLT53aWR0aCgpOworICAgIGNvbXByZXNzRGF0YS5pbWFnZV9oZWlnaHQgPSBibXAtPmhl
aWdodCgpOworICAgIGNvbXByZXNzRGF0YS5pbnB1dF9jb21wb25lbnRzID0gMzsKKyAgICBjb21w
cmVzc0RhdGEuaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworICAgIGpwZWdfc2V0X2RlZmF1bHRz
KCZjb21wcmVzc0RhdGEpOworICAgIGpwZWdfc2V0X3F1YWxpdHkoJmNvbXByZXNzRGF0YSwgNjUs
IEZBTFNFKTsKKworICAgIFZlY3RvcjxKU0FNUExFLCAyMDQ4PiByb3dCdWZmZXI7CisgICAgaWYg
KHNldGptcChlcnIuc2V0am1wX2J1ZmZlcikpIHsKKyAgICAgICAganBlZ19kZXN0cm95X2NvbXBy
ZXNzKCZjb21wcmVzc0RhdGEpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
anBlZ19zdGFydF9jb21wcmVzcygmY29tcHJlc3NEYXRhLCBUUlVFKTsKKworICAgIHJvd0J1ZmZl
ci5yZXNpemUoY29tcHJlc3NEYXRhLmltYWdlX3dpZHRoICogMyk7CisgICAgaWYgKGJtcC0+aXMx
NmJpdCgpKSB7CisgICAgICAgIGludCBwYWRkZWRXaWR0aCA9IGJtcC0+Yml0bWFwSW5mbygpLnBh
ZGRlZFdpZHRoKCk7CisgICAgICAgIGludCBza2lwID0gcGFkZGVkV2lkdGggLSBjb21wcmVzc0Rh
dGEuaW1hZ2Vfd2lkdGg7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBwaXhlbCA9IHN0
YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIHNob3J0Kj4oYm1wLT5ieXRlcygpKTsKKyAgICAgICAg
Y29uc3QgdW5zaWduZWQgc2hvcnQqIHBpeGVsRW5kID0gcGl4ZWwgKyBwYWRkZWRXaWR0aCAqIGNv
bXByZXNzRGF0YS5pbWFnZV9oZWlnaHQ7CisgICAgICAgIGZvciAoOyBwaXhlbCA8IHBpeGVsRW5k
OyBwaXhlbCArPSBza2lwKSB7CisgICAgICAgICAgICBKU0FNUExFKiBkc3QgPSByb3dCdWZmZXIu
ZGF0YSgpOworICAgICAgICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCBzaG9ydCogcm93RW5kID0g
cGl4ZWwgKyBjb21wcmVzc0RhdGEuaW1hZ2Vfd2lkdGg7IHBpeGVsIDwgcm93RW5kOykgeworICAg
ICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlID0gKnBpeGVsKys7CisjaWYgSU1BR0Vf
Tk9fQUxQSEFfVVNFX1JHQjU1NQorICAgICAgICAgICAgICAgICpkc3QrKyA9IEpTQU1QTEUoKHZh
bHVlID4+IDcpICYgMHhGOCk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gSlNBTVBMRSgodmFs
dWUgPj4gMikgJiAweEY4KTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBKU0FNUExFKCh2YWx1
ZSA8PCAzKSAmIDB4RjgpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBKU0FNUExF
KCh2YWx1ZSA+PiA4KSAmIDB4RjgpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IEpTQU1QTEUo
KHZhbHVlID4+IDMpICYgMHhGQyk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gSlNBTVBMRSgo
dmFsdWUgPDwgMykgJiAweEY4KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAg
ZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVz
KCZjb21wcmVzc0RhdGEsICZkc3QsIDEpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgY29uc3QgdW5zaWduZWQqIHBpeGVsID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQqPihi
bXAtPmJ5dGVzKCkpOworICAgICAgICBjb25zdCB1bnNpZ25lZCogcGl4ZWxFbmQgPSBwaXhlbCAr
IGNvbXByZXNzRGF0YS5pbWFnZV93aWR0aCAqIGNvbXByZXNzRGF0YS5pbWFnZV9oZWlnaHQ7Cisg
ICAgICAgIGZvciAoOyBwaXhlbCA8IHBpeGVsRW5kOyApIHsKKyAgICAgICAgICAgIEpTQU1QTEUq
IGRzdCA9IHJvd0J1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHVuc2lnbmVk
KiByb3dFbmQgPSBwaXhlbCArIGNvbXByZXNzRGF0YS5pbWFnZV93aWR0aDsgcGl4ZWwgPCByb3dF
bmQ7KSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsdWUgPSAqcGl4ZWwrKzsKKyAgICAg
ICAgICAgICAgICAqZHN0KysgPSBKU0FNUExFKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICAg
ICAgICAgICAgICAqZHN0KysgPSBKU0FNUExFKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgICAg
ICAgICAgICAgICpkc3QrKyA9IEpTQU1QTEUoKHZhbHVlKSAmIDB4RkYpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIGpwZWdf
d3JpdGVfc2NhbmxpbmVzKCZjb21wcmVzc0RhdGEsICZkc3QsIDEpOworICAgICAgICB9CisgICAg
fQorCisgICAganBlZ19maW5pc2hfY29tcHJlc3MoJmNvbXByZXNzRGF0YSk7CisgICAganBlZ19k
ZXN0cm95X2NvbXByZXNzKCZjb21wcmVzc0RhdGEpOworICAgIHJldHVybiB0cnVlOworfQorCit9
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWVuY29kZXJzL3dpbmNlL0pQRUdF
bmNvZGVyLmggYi9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWVuY29kZXJzL3dpbmNlL0pQRUdFbmNv
ZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4N2M3ZQotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZW5jb2RlcnMvd2luY2UvSlBFR0Vu
Y29kZXIuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNo
IE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYg
SlBFR19FTkNPREVSX0gKKyNkZWZpbmUgSlBFR19FTkNPREVSX0gKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworICAgIGJvb2wgY29tcHJlc3NCaXRtYXBUb0pwZWcoU2hhcmVkQml0bWFwKiBibXAsIFZl
Y3RvcjxjaGFyPiYganBlZ0RhdGEpOworfQorCisjZW5kaWYgLy8gSlBFR19FTkNPREVSX0gKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZW5jb2RlcnMvd2luY2UvUE5HRW5jb2Rl
ci5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWVuY29kZXJzL3dpbmNlL1BOR0VuY29kZXIu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOWRlZTMKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWVuY29kZXJzL3dpbmNlL1BOR0VuY29k
ZXIuY3BwCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDks
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkg
VG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgor
ICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9m
IGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIlBOR0VuY29kZXIuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAicG5n
LmgiCit9CisKKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworLy8gRW5jb2RlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgc2VjdGlvbiBvZiB0aGUgY29k
ZSBpcyBiYXNlZCBvbiBuc1BOR0VuY29kZXIuY3BwIGluIE1vemlsbGEKKy8vIChDb3B5cmlnaHQg
MjAwNSBHb29nbGUgSW5jLikKKworLy8gUGFzc2VkIGFyb3VuZCBhcyB0aGUgaW9fcHRyIGluIHRo
ZSBwbmcgc3RydWN0cyBzbyBvdXIgY2FsbGJhY2tzIGtub3cgd2hlcmUKKy8vIHRvIHdyaXRlIGRh
dGEuCitzdHJ1Y3QgUE5HRW5jb2RlclN0YXRlIHsKKyAgICBQTkdFbmNvZGVyU3RhdGUoVmVjdG9y
PGNoYXI+KiBvKSA6IG1fb3V0KG8pIHt9CisgICAgVmVjdG9yPGNoYXI+KiBtX291dDsKK307CisK
Ky8vIENhbGxlZCBieSBsaWJwbmcgdG8gZmx1c2ggaXRzIGludGVybmFsIGJ1ZmZlciB0byBvdXJz
Lgordm9pZCBlbmNvZGVyV3JpdGVDYWxsYmFjayhwbmdfc3RydWN0cCBwbmcsIHBuZ19ieXRlcCBk
YXRhLCBwbmdfc2l6ZV90IHNpemUpCit7CisgICAgUE5HRW5jb2RlclN0YXRlKiBzdGF0ZSA9IHN0
YXRpY19jYXN0PFBOR0VuY29kZXJTdGF0ZSo+KHBuZ19nZXRfaW9fcHRyKHBuZykpOworICAgIEFT
U0VSVChzdGF0ZS0+bV9vdXQpOworCisgICAgc2l6ZV90IG9sZFNpemUgPSBzdGF0ZS0+bV9vdXQt
PnNpemUoKTsKKyAgICBzdGF0ZS0+bV9vdXQtPnJlc2l6ZShvbGRTaXplICsgc2l6ZSk7CisgICAg
bWVtY3B5KCYoKnN0YXRlLT5tX291dClbb2xkU2l6ZV0sIGRhdGEsIHNpemUpOworfQorCisvLyBB
dXRvbWF0aWNhbGx5IGRlc3Ryb3lzIHRoZSBnaXZlbiB3cml0ZSBzdHJ1Y3RzIG9uIGRlc3RydWN0
aW9uIHRvIG1ha2UKKy8vIGNsZWFudXAgYW5kIGVycm9yIGhhbmRsaW5nIGNvZGUgY2xlYW5lci4K
K2NsYXNzIFBOR1dyaXRlU3RydWN0RGVzdHJveWVyIHsKK3B1YmxpYzoKKyAgICBQTkdXcml0ZVN0
cnVjdERlc3Ryb3llcihwbmdfc3RydWN0KiogcHMsIHBuZ19pbmZvKiogcGkpCisgICAgICAgIDog
bV9wbmdTdHJ1Y3QocHMpCisgICAgICAgICwgbV9wbmdJbmZvKHBpKQorICAgIHsKKyAgICB9CisK
KyAgICB+UE5HV3JpdGVTdHJ1Y3REZXN0cm95ZXIoKQorICAgIHsKKyAgICAgICAgcG5nX2Rlc3Ry
b3lfd3JpdGVfc3RydWN0KG1fcG5nU3RydWN0LCBtX3BuZ0luZm8pOworICAgIH0KKworcHJpdmF0
ZToKKyAgICBwbmdfc3RydWN0KiogbV9wbmdTdHJ1Y3Q7CisgICAgcG5nX2luZm8qKiBtX3BuZ0lu
Zm87Cit9OworCitib29sIGNvbXByZXNzQml0bWFwVG9QbmcoU2hhcmVkQml0bWFwKiBibXAsIFZl
Y3RvcjxjaGFyPiYgcG5nRGF0YSkKK3sKKyAgICBpZiAoIWJtcC0+Ynl0ZXMoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgcG5nX3N0cnVjdCogcG5nUHRyID0gcG5nX2NyZWF0ZV93cml0
ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ192b2lkcF9OVUxMLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19lcnJvcl9wdHJfTlVMTCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfZXJyb3Jf
cHRyX05VTEwpOworICAgIGlmICghcG5nUHRyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBwbmdfaW5mbyogaW5mb1B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nUHRyKTsKKyAg
ICBpZiAoIWluZm9QdHIpIHsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdQ
dHIsIDApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFBOR1dyaXRlU3RydWN0
RGVzdHJveWVyIGRlc3Ryb3llcigmcG5nUHRyLCAmaW5mb1B0cik7CisKKyAgICBpbnQgYnl0ZURl
cHRoID0gYm1wLT5pczE2Yml0KCkgPyAzIDogNDsKKyAgICBWZWN0b3I8dW5zaWduZWQgY2hhciwg
MjA0OD4gcm93QnVmZmVyOworICAgIHJvd0J1ZmZlci5yZXNpemUoYm1wLT53aWR0aCgpICogYnl0
ZURlcHRoKTsKKworICAgIC8vIFRoZSBkZXN0cm95ZXIgd2lsbCBlbnN1cmUgdGhhdCB0aGUgc3Ry
dWN0dXJlcyBhcmUgY2xlYW5lZCB1cCBpbiB0aGlzCisgICAgLy8gY2FzZSwgZXZlbiB0aG91Z2gg
d2UgbWF5IGdldCBoZXJlIGFzIGEganVtcCBmcm9tIHJhbmRvbSBwYXJ0cyBvZiB0aGUKKyAgICAv
LyBQTkcgbGlicmFyeSBjYWxsZWQgYmVsb3cuCisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBu
Z1B0cikpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBTZXQgb3VyIGNhbGxiYWNr
IGZvciBsaWJwbmcgdG8gZ2l2ZSB1cyB0aGUgZGF0YS4KKyAgICBQTkdFbmNvZGVyU3RhdGUgc3Rh
dGUoJnBuZ0RhdGEpOworICAgIHBuZ19zZXRfd3JpdGVfZm4ocG5nUHRyLCAmc3RhdGUsIGVuY29k
ZXJXcml0ZUNhbGxiYWNrLCAwKTsKKworICAgIGludCBwbmdPdXRwdXRDb2xvclR5cGUgPSBibXAt
PmlzMTZiaXQoKSA/IFBOR19DT0xPUl9UWVBFX1JHQiA6IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBI
QTsKKworICAgIHBuZ19zZXRfSUhEUihwbmdQdHIsIGluZm9QdHIsIGJtcC0+d2lkdGgoKSwgYm1w
LT5oZWlnaHQoKSwgOCwgcG5nT3V0cHV0Q29sb3JUeXBlLAorICAgICAgICAgICAgICAgICBQTkdf
SU5URVJMQUNFX05PTkUsIFBOR19DT01QUkVTU0lPTl9UWVBFX0RFRkFVTFQsCisgICAgICAgICAg
ICAgICAgIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUKTsKKyAgICBwbmdfd3JpdGVfaW5mbyhwbmdQ
dHIsIGluZm9QdHIpOworCisgICAgaWYgKGJtcC0+aXMxNmJpdCgpKSB7CisgICAgICAgIHVuc2ln
bmVkIHNob3J0KiBzcmMgPSAodW5zaWduZWQgc2hvcnQqKWJtcC0+Ynl0ZXMoKTsKKyAgICAgICAg
Zm9yIChpbnQgeSA9IDA7IHkgPCAoaW50KWJtcC0+aGVpZ2h0KCk7ICsreSkgeworICAgICAgICAg
ICAgdW5zaWduZWQgY2hhciogZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIGZv
ciAoaW50IHggPSAwOyB4IDwgKGludClibXAtPndpZHRoKCk7ICsreCkgeworICAgICAgICAgICAg
ICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlID0gKnNyYysrOworI2lmIElNQUdFX05PX0FMUEhBX1VT
RV9SR0I1NTUKKyAgICAgICAgICAgICAgICAqZHN0KysgPSB1bnNpZ25lZCBjaGFyKCh2YWx1ZSA+
PiA3KSAmIDB4RjgpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IHVuc2lnbmVkIGNoYXIoKHZh
bHVlID4+IDIpICYgMHhGOCk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gdW5zaWduZWQgY2hh
cigodmFsdWUgPDwgMykgJiAweEY4KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgKmRzdCsrID0g
dW5zaWduZWQgY2hhcigodmFsdWUgPj4gOCkgJiAweEY4KTsKKyAgICAgICAgICAgICAgICAqZHN0
KysgPSB1bnNpZ25lZCBjaGFyKCh2YWx1ZSA+PiAzKSAmIDB4RkMpOworICAgICAgICAgICAgICAg
ICpkc3QrKyA9IHVuc2lnbmVkIGNoYXIoKHZhbHVlIDw8IDMpICYgMHhGOCk7CisjZW5kaWYKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIHBuZ193cml0ZV9yb3cocG5nUHRyLCByb3dCdWZmZXIu
ZGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIq
IHNyYyA9ICh1bnNpZ25lZCBjaGFyKilibXAtPmJ5dGVzKCk7CisgICAgICAgIGZvciAoaW50IHkg
PSAwOyB5IDwgKGludClibXAtPmhlaWdodCgpOyArK3kpIHsKKyAgICAgICAgICAgIHVuc2lnbmVk
IGNoYXIqIGRzdCA9IHJvd0J1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICBmb3IgKGludCB4ID0g
MDsgeCA8IChpbnQpYm1wLT53aWR0aCgpOyArK3gpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3Rl
OiBQTkcgaXMgaW4gYmlnIGVuZGlhbgorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYiA9
ICpzcmMrKzsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGcgPSAqc3JjKys7CisgICAg
ICAgICAgICAgICAgdW5zaWduZWQgY2hhciByID0gKnNyYysrOworICAgICAgICAgICAgICAgIHVu
c2lnbmVkIGNoYXIgYSA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSByOworICAg
ICAgICAgICAgICAgICpkc3QrKyA9IGc7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gYjsKKyAg
ICAgICAgICAgICAgICAqZHN0KysgPSBhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG5n
X3dyaXRlX3JvdyhwbmdQdHIsIHJvd0J1ZmZlci5kYXRhKCkpOworICAgICAgICB9CisgICAgfQor
CisgICAgcG5nX3dyaXRlX2VuZChwbmdQdHIsIGluZm9QdHIpOworICAgIHJldHVybiB0cnVlOwor
fQorCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9y
bS9pbWFnZS1lbmNvZGVycy93aW5jZS9QTkdFbmNvZGVyLmggYi9XZWJDb3JlL3BsYXRmb3JtL2lt
YWdlLWVuY29kZXJzL3dpbmNlL1BOR0VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi5hMzA1NjZlCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9p
bWFnZS1lbmNvZGVycy93aW5jZS9QTkdFbmNvZGVyLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAq
ICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwor
ICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKwor
I2lmbmRlZiBQTkdfRU5DT0RFUl9ICisjZGVmaW5lIFBOR19FTkNPREVSX0gKKworI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIGJvb2wgY29tcHJlc3NC
aXRtYXBUb1BuZyhTaGFyZWRCaXRtYXAqIGJtcCwgVmVjdG9yPGNoYXI+JiBwbmdEYXRhKTsKK30K
KworI2VuZGlmIC8vIFBOR19FTkNPREVSX0gK
</data>
<flag name="review"
          id="18012"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33814</attachid>
            <date>2009-07-30 13:12:19 -0700</date>
            <delta_ts>2009-08-08 13:12:31 -0700</delta_ts>
            <desc>2) SharedBitmap</desc>
            <filename>27511_2.patch</filename>
            <type>text/plain</type>
            <size>29067</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFw
LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmY3NjU1Ci0tLSAvZGV2L251bGwK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCkBA
IC0wLDAgKzEsNjkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9i
aWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICog
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNl
ZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJTaGFyZWRCaXRtYXAuaCIKKworI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzVHlwZXMuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1h
dGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL093
blB0ci5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
KyNpZm5kZWYgTkRFQlVHCitzdHJ1Y3QgU2hhcmVkQml0bWFwTGVha0NvdW50ZXIgeworICAgIH5T
aGFyZWRCaXRtYXBMZWFrQ291bnRlcigpOworfTsKK3N0YXRpYyBTaGFyZWRCaXRtYXBMZWFrQ291
bnRlciBzaGFyZWRCaXRtYXBMZWFrQ291bnRlcjsKKyNlbmRpZgorCit0eXBlZGVmIEhhc2hTZXQ8
U2hhcmVkQml0bWFwKj4gQml0bWFwTWFwOworQml0bWFwTWFwIGdfYml0bWFwTWFwOworCisjaWZu
ZGVmIE5ERUJVRworU2hhcmVkQml0bWFwTGVha0NvdW50ZXI6On5TaGFyZWRCaXRtYXBMZWFrQ291
bnRlcigpCit7CisgICAgaWYgKCFnX2JpdG1hcE1hcC5pc0VtcHR5KCkpCisgICAgICAgIHByaW50
ZigiXG5MRUFLOiAldSAlc1xuXG4iLCBnX2JpdG1hcE1hcC5zaXplKCksICJTaGFyZWRCaXRtYXAg
b2JqZWN0cyIpOworfQorI2VuZGlmCisKK3N0YXRpYyBTaGFyZWRCaXRtYXA6OkRyYXdQYXR0ZXJu
RnVuYyBnX2RyYXdQYXR0ZXJuID0gMDsKK3N0YXRpYyBTaGFyZWRCaXRtYXA6OkRyYXdJbWFnZUZ1
bmMgZ19kcmF3SW1hZ2UgPSAwOworCitzdGF0aWMgaW5saW5lIGludCBzdGFibGVSb3VuZChkb3Vi
bGUgZCkKK3sKKyAgICBpZiAoZCA+IDApCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+
KGQgKyAwLjUpOworCisgICAgaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGQpOworICAgIHJldHVy
biBpIC0gZCA+IDAuNSA/IGkgLSAxIDogaTsKK30KKworU2hhcmVkQml0bWFwOjpEcmF3SW1hZ2VG
dW5jIFNoYXJlZEJpdG1hcDo6c2V0RHJhd0ltYWdlRnVuYyhEcmF3SW1hZ2VGdW5jIGZ1bmMpCit7
CisgICAgRHJhd0ltYWdlRnVuYyBvbGRGdW5jID0gZ19kcmF3SW1hZ2U7CisgICAgZ19kcmF3SW1h
Z2UgPSBmdW5jOworICAgIHJldHVybiBvbGRGdW5jOworfQorCitTaGFyZWRCaXRtYXA6OkRyYXdQ
YXR0ZXJuRnVuYyBTaGFyZWRCaXRtYXA6OnNldERyYXdQYXR0ZXJuRnVuYyhEcmF3UGF0dGVybkZ1
bmMgZnVuYykKK3sKKyAgICBEcmF3UGF0dGVybkZ1bmMgb2xkRnVuYyA9IGdfZHJhd1BhdHRlcm47
CisgICAgZ19kcmF3UGF0dGVybiA9IGZ1bmM7CisgICAgcmV0dXJuIG9sZEZ1bmM7Cit9CisKK1Bh
c3NSZWZQdHI8U2hhcmVkQml0bWFwPiBTaGFyZWRCaXRtYXA6OmNyZWF0ZUluc3RhbmNlKGJvb2wg
aXMxNmJpdCwgaW50IHcsIGludCBoLCBib29sIGluaXRQaXhlbHMpCit7CisgICAgU2hhcmVkQml0
bWFwKiBydG4gPSBuZXcgU2hhcmVkQml0bWFwKGlzMTZiaXQsIHcsIGgsIGluaXRQaXhlbHMpOwor
ICAgIGlmIChydG4gJiYgIXJ0bi0+Ynl0ZXMoKSkgeworICAgICAgICBkZWxldGUgcnRuOworICAg
ICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGFkb3B0UmVmKHJ0bik7Cit9CisKK1No
YXJlZEJpdG1hcDo6U2hhcmVkQml0bWFwKGNvbnN0IEJpdG1hcEluZm8mIGJtcEluZm8sIEhCSVRN
QVAgaGJtcCwgdm9pZCogcGl4ZWxzKQorOiBtX2JtcEluZm8oYm1wSW5mbykKKywgbV9sb2NrZWQo
ZmFsc2UpCissIG1fdXNlc1RyYW5zcGFyZW50Q29sb3IoZmFsc2UpCissIG1fdHJhbnNwYXJlbnRD
b2xvcihSR0IoMCwgMCwgMCkpCissIG1fcGl4ZWxzKHBpeGVscykKKywgbV9oYml0bWFwKGhibXAp
CissIG1faGFzQWxwaGEoZmFsc2UpCissIG1fdmFsaWRIZWlnaHQoYm1wSW5mby5oZWlnaHQoKSkK
K3sKKyAgICBnX2JpdG1hcE1hcC5hZGQodGhpcyk7Cit9CisKK1NoYXJlZEJpdG1hcDo6U2hhcmVk
Qml0bWFwKGJvb2wgX2lzMTZiaXQsIGludCB3LCBpbnQgaCwgYm9vbCBpbml0UGl4ZWxzKQorOiBt
X2JtcEluZm8oX2lzMTZiaXQsIHcsIGgpCissIG1fcmVmZXJlbmNlKDEpCissIG1fbG9ja2VkKGZh
bHNlKQorLCBtX3VzZXNUcmFuc3BhcmVudENvbG9yKGZhbHNlKQorLCBtX3RyYW5zcGFyZW50Q29s
b3IoUkdCKDAsIDAsIDApKQorLCBtX3BpeGVscygwKQorLCBtX2hhc0FscGhhKGZhbHNlKQorLCBt
X3ZhbGlkSGVpZ2h0KGFicyhoKSkKKywgbV9oYml0bWFwKDApCit7CisgICAgZ19iaXRtYXBNYXAu
YWRkKHRoaXMpOworCisgICAgdW5zaWduZWQgYnVmZmVyU2l6ZSA9IG1fYm1wSW5mby5udW1QaXhl
bHMoKTsKKyAgICBpZiAoX2lzMTZiaXQpCisgICAgICAgIGJ1ZmZlclNpemUgLz0gMjsKKworICAg
IG1fcGl4ZWxzID0gbmV3IHVuc2lnbmVkW2J1ZmZlclNpemVdOworCisgICAgaWYgKGluaXRQaXhl
bHMpCisgICAgICAgIHJlc2V0UGl4ZWxzKCk7Cit9CitTaGFyZWRCaXRtYXA6On5TaGFyZWRCaXRt
YXAoKQoreworICAgIGdfYml0bWFwTWFwLnJlbW92ZSh0aGlzKTsKKyAgICBpZiAobV9oYml0bWFw
KQorICAgICAgICBEZWxldGVPYmplY3QobV9oYml0bWFwKTsKKyAgICBlbHNlCisgICAgICAgIGRl
bGV0ZVtdIG1fcGl4ZWxzOworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6cmVzZXRQaXhlbHMoYm9v
bCBibGFjaykKK3sKKyAgICBpZiAobV9waXhlbHMpIHsKKyAgICAgICAgdW5zaWduZWQgYnVmZmVy
U2l6ZSA9IG1fYm1wSW5mby5udW1QaXhlbHMoKTsKKyAgICAgICAgaWYgKGJsYWNrKQorICAgICAg
ICAgICAgbWVtc2V0KG1fcGl4ZWxzLCAwLCBidWZmZXJTaXplICogKGlzMTZiaXQoKSA/IDIgOiA0
KSk7CisgICAgICAgIGVsc2UgaWYgKGlzMTZiaXQoKSkgeworICAgICAgICAgICAgLy8gRmlsbCBp
dCB3aXRoIHdoaXRlIGNvbG9yCisjaWYgSU1BR0VfTk9fQUxQSEFfVVNFX1JHQjU1NQorICAgICAg
ICAgICAgd21lbXNldCgod2NoYXJfdCopbV9waXhlbHMsIDB4N0ZGRiwgYnVmZmVyU2l6ZSk7Cisj
ZWxzZQorICAgICAgICAgICAgd21lbXNldCgod2NoYXJfdCopbV9waXhlbHMsIDB4RkZGRiwgYnVm
ZmVyU2l6ZSk7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE1ha2Ug
aXQgd2hpdGUgYnV0IHRyYW5zcGFyZW50CisgICAgICAgICAgICB1bnNpZ25lZCogcGl4ZWwgPSAo
dW5zaWduZWQqKW1fcGl4ZWxzOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQqIGNvbnN0IGJ1
ZmZlckVuZCA9IHBpeGVsICsgYnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIHdoaWxlIChwaXhlbCA8
IGJ1ZmZlckVuZCkKKyAgICAgICAgICAgICAgICAqcGl4ZWwrKyA9IDB4MDBGRkZGRkY7CisgICAg
ICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgY29udmVydDMy
VG8xNih1bnNpZ25lZCBwaXhlbCkKK3sKKyNpZiBJTUFHRV9OT19BTFBIQV9VU0VfUkdCNTU1Cisg
ICAgdW5zaWduZWQgc2hvcnQgciA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAmIDB4MDBGODAwMDAp
ID4+IDkpOworICAgIHVuc2lnbmVkIHNob3J0IGcgPSB1bnNpZ25lZCBzaG9ydCgocGl4ZWwgJiAw
eDAwMDBGODAwKSA+PiA2KTsKKyAgICB1bnNpZ25lZCBzaG9ydCBiID0gdW5zaWduZWQgc2hvcnQo
KHBpeGVsICYgMHgwMDAwMDBGOCkgPj4gMyk7CisjZWxzZSAvLyBSR0I1NjUKKyAgICB1bnNpZ25l
ZCBzaG9ydCByID0gdW5zaWduZWQgc2hvcnQoKHBpeGVsICYgMHgwMEY4MDAwMCkgPj4gOCk7Cisg
ICAgdW5zaWduZWQgc2hvcnQgZyA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAmIDB4MDAwMEZDMDAp
ID4+IDUpOworICAgIHVuc2lnbmVkIHNob3J0IGIgPSB1bnNpZ25lZCBzaG9ydCgocGl4ZWwgJiAw
eDAwMDAwMEY4KSA+PiAzKTsKKyNlbmRpZgorICAgIHJldHVybiByIHwgZyB8IGI7Cit9CisKK2Jv
b2wgU2hhcmVkQml0bWFwOjp0bzE2Yml0KCkKK3sKKyAgICBpZiAobV9sb2NrZWQpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBpZiAoaXMxNmJpdCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIEJpdG1hcEluZm8gbmV3Qm1wSW5mbyh0cnVlLCBtX2JtcEluZm8ud2lkdGgoKSwgbV9i
bXBJbmZvLmhlaWdodCgpKTsKKworICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7
CisgICAgaW50IHdpZHRoID0gbmV3Qm1wSW5mby53aWR0aCgpOworICAgIGludCBwYWRkZWRXaWR0
aCA9IG5ld0JtcEluZm8ucGFkZGVkV2lkdGgoKTsKKyAgICBpbnQgYnVmZmVyU2l6ZSA9IHBhZGRl
ZFdpZHRoICogbmV3Qm1wSW5mby5oZWlnaHQoKTsKKyAgICB2b2lkKiBuZXdQaXhlbHMgPSBuZXcg
dW5zaWduZWRbYnVmZmVyU2l6ZSAvIDJdOworCisgICAgaWYgKCFuZXdQaXhlbHMpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHNob3J0KiBwMTYgPSAodW5zaWduZWQgc2hv
cnQqKW5ld1BpeGVsczsKKyAgICBjb25zdCB1bnNpZ25lZCogcDMyID0gKGNvbnN0IHVuc2lnbmVk
KiltX3BpeGVsczsKKworICAgIGNvbnN0IGJvb2wgc2tpcHMgPSBwYWRkZWRXaWR0aCAhPSB3aWR0
aDsKKworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBjb25zdCBwMTZlbmQgPSBwMTYgKyBidWZm
ZXJTaXplOworICAgIHdoaWxlIChwMTYgPCBwMTZlbmQpIHsKKyAgICAgICAgZm9yICh1bnNpZ25l
ZCBzaG9ydCogcDE2bGluZUVuZCA9IHAxNiArIHdpZHRoOyBwMTYgPCBwMTZsaW5lRW5kOyApCisg
ICAgICAgICAgICAqcDE2KysgPSBjb252ZXJ0MzJUbzE2KCpwMzIrKyk7CisKKyAgICAgICAgaWYg
KHNraXBzKQorICAgICAgICAgICAgKnAxNisrID0gMDsKKyAgICB9CisKKworICAgIGlmIChtX2hi
aXRtYXApIHsKKyAgICAgICAgRGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7CisgICAgICAgIG1faGJp
dG1hcCA9IDA7CisgICAgfSBlbHNlCisgICAgICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworCisgICAg
bV9waXhlbHMgPSBuZXdQaXhlbHM7CisgICAgbV9ibXBJbmZvID0gbmV3Qm1wSW5mbzsKKworICAg
IHNldEhhc0FscGhhKGZhbHNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGFyZWRC
aXRtYXA6OmZyZWVNZW1vcnkoKQoreworICAgIGlmICghbV9sb2NrZWQpIHsKKyAgICAgICAgaWYg
KG1faGJpdG1hcCkgeworICAgICAgICAgICAgRGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7CisgICAg
ICAgICAgICBtX2hiaXRtYXAgPSAwOworICAgICAgICAgICAgbV9waXhlbHMgPSAwOworICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAobV9waXhlbHMpIHsKKyAgICAg
ICAgICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworICAgICAgICAgICAgbV9waXhlbHMgPSAwOworICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNl
OworfQorCitIQklUTUFQIFNoYXJlZEJpdG1hcDo6Y3JlYXRlSGFuZGxlKHZvaWQqKiBwaXhlbHMs
IEJpdG1hcEluZm8qIGJtcEluZm8sIGludCBoLCBib29sIHVzZTE2Yml0KSBjb25zdAoreworICAg
IGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybiAwOworCisgICAgTWVtb3J5QWxsb2NhdGlv
bkNhbkZhaWwgY2FuRmFpbDsKKworICAgIGlmIChoID09IC0xKQorICAgICAgICBoID0gaGVpZ2h0
KCk7CisgICAgKmJtcEluZm8gPSBCaXRtYXBJbmZvKHVzZTE2Yml0IHx8IGlzMTZiaXQoKSwgd2lk
dGgoKSwgaCk7CisKKyAgICBIQklUTUFQIGhibXAgPSBNZW1vcnlNYW5hZ2VyOjpjcmVhdGVESUJT
ZWN0aW9uKGJtcEluZm8sIHBpeGVscyk7CisKKyAgICBpZiAoIWhibXApCisgICAgICAgIHJldHVy
biAwOworCisgICAgT3duUHRyPEhEQz4gYm1wREMoQ3JlYXRlQ29tcGF0aWJsZURDKDApKTsKKyAg
ICBIR0RJT0JKIGhPbGRCbXAgPSBTZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhibXApOworCisg
ICAgU3RyZXRjaERJQml0cyhibXBEQy5nZXQoKSwgMCwgMCwgd2lkdGgoKSwgaCwgMCwgMCwgd2lk
dGgoKSwgaAorICAgICAgICAsIG1fcGl4ZWxzLCAmbV9ibXBJbmZvLCBESUJfUkdCX0NPTE9SUywg
U1JDQ09QWSk7CisKKyAgICBTZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhPbGRCbXApOworCisg
ICAgcmV0dXJuIGhibXA7Cit9CisKK2Jvb2wgU2hhcmVkQml0bWFwOjplbnN1cmVIYW5kbGUoKQor
eworICAgIGlmIChtX2hiaXRtYXApCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFt
X3BpeGVscykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1fbG9ja2VkKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBCaXRtYXBJbmZvIGJtcEluZm87CisgICAgdm9pZCog
cGl4ZWxzOworICAgIG1faGJpdG1hcCA9IGNyZWF0ZUhhbmRsZSgmcGl4ZWxzLCAmYm1wSW5mbywg
LTEsICFoYXNBbHBoYSgpKTsKKworICAgIGlmICghbV9oYml0bWFwKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBkZWxldGVbXSBtX3BpeGVsczsKKyAgICBtX3BpeGVscyA9IHBpeGVsczsK
KyAgICBtX2JtcEluZm8gPSBibXBJbmZvOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
U2hhcmVkQml0bWFwOjpkcmF3KEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgSW50UmVjdCYg
ZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9z
aXRlT3ApCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworICAgIGN0eHQt
PmRyYXdCaXRtYXAodGhpcywgZHN0UmVjdCwgc3JjUmVjdCwgY29tcG9zaXRlT3ApOworfQorCit2
b2lkIFNoYXJlZEJpdG1hcDo6ZHJhdyhIREMgaGRjLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBj
b25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sK
KyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZHN0UmVjdC5p
c0VtcHR5KCkgfHwgc3JjUmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlm
IChnX2RyYXdJbWFnZSAmJiBnX2RyYXdJbWFnZSh0aGlzLCBoZGMsIGRzdFJlY3QsIHNyY1JlY3Qs
IGNvbXBvc2l0ZU9wKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSEJJVE1BUCBoYml0bWFwID0g
MDsKKyAgICBib29sIHVzaW5nSGFuZGxlID0gY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlU291cmNl
T3ZlciAmJiAoCisjaWYgIWRlZmluZWQoTk9fQUxQSEFCTEVORCkKKyAgICAgICAgaGFzQWxwaGEo
KSB8fAorI2VuZGlmCisgICAgICAgIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpOworCisgICAgaWYg
KHVzaW5nSGFuZGxlKSB7CisgICAgICAgIGlmIChlbnN1cmVIYW5kbGUoKSkKKyAgICAgICAgICAg
IGhiaXRtYXAgPSBtX2hiaXRtYXA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdm9pZCog
cGl4ZWxzOworICAgICAgICAgICAgQml0bWFwSW5mbyBibXBJbmZvOworICAgICAgICAgICAgaGJp
dG1hcCA9IGNyZWF0ZUhhbmRsZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsIHVzZXNUcmFuc3BhcmVu
dENvbG9yKCkpOworICAgICAgICB9CisgICAgfQorICAgIGlmICghaGJpdG1hcCkgeworICAgICAg
ICAvLyBGSVhNRTogaGFuZGxlIG90aGVyIGNvbXBvc2l0ZSBvcGVyYXRpb24gdHlwZXM/CisgICAg
ICAgIERXT1JEIHJvcCA9IGNvbXBvc2l0ZU9wID09IENvbXBvc2l0ZUNvcHkgPyBTUkNDT1BZCisg
ICAgICAgICAgICA6IGNvbXBvc2l0ZU9wID09IENvbXBvc2l0ZVhPUiA/IFBBVElOVkVSVAorICAg
ICAgICAgICAgOiBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVDbGVhciA/IFdISVRFTkVTUworICAg
ICAgICAgICAgOiBTUkNDT1BZOworCisgICAgICAgIFN0cmV0Y2hESUJpdHMoaGRjLCBkc3RSZWN0
LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKQorICAg
ICAgICAgICAgLCBzcmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qud2lkdGgoKSwgc3Jj
UmVjdC5oZWlnaHQoKSwgbV9waXhlbHMsICZtX2JtcEluZm8sIERJQl9SR0JfQ09MT1JTLCByb3Ap
OworICAgIH0gZWxzZSB7CisgICAgICAgIE93blB0cjxIREM+IGhtZW1kYyhDcmVhdGVDb21wYXRp
YmxlREMoaGRjKSk7CisgICAgICAgIEhHRElPQkogaE9sZEJtcCA9IFNlbGVjdE9iamVjdChobWVt
ZGMuZ2V0KCksIGhiaXRtYXApOworCisjaWYgIWRlZmluZWQoTk9fQUxQSEFCTEVORCkKKyAgICAg
ICAgaWYgKCF1c2VzVHJhbnNwYXJlbnRDb2xvcigpKSB7CisgICAgICAgICAgICBzdGF0aWMgY29u
c3QgQkxFTkRGVU5DVElPTiBibGVuZCA9IHsgQUNfU1JDX09WRVIsIDAsIDI1NSwgQUNfU1JDX0FM
UEhBIH07CisgICAgICAgICAgICBBbHBoYUJsZW5kKGhkYywgZHN0UmVjdC54KCksIGRzdFJlY3Qu
eSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCksIGhtZW1kYy5nZXQoKQorICAg
ICAgICAgICAgICAgICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCks
IHNyY1JlY3QuaGVpZ2h0KCksIGJsZW5kKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAg
ICAgeworICAgICAgICAgICAgVHJhbnNwYXJlbnRCbHQoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVj
dC55KCksIGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgaG1lbWRjLmdldCgpCisg
ICAgICAgICAgICAgICAgLCBzcmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qud2lkdGgo
KSwgc3JjUmVjdC5oZWlnaHQoKSwgdHJhbnNwYXJlbnRDb2xvcigpKTsKKyAgICAgICAgfQorCisg
ICAgICAgIFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIGhPbGRCbXApOworICAgICAgICBpZiAo
aGJpdG1hcCAhPSBtX2hiaXRtYXApCisgICAgICAgICAgICBEZWxldGVPYmplY3QoaGJpdG1hcCk7
CisgICAgfQorfQorCisKK0hCSVRNQVAgU2hhcmVkQml0bWFwOjpjbGlwQml0bWFwKGNvbnN0IElu
dFJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUFs
cGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwSW5mbyYgYm1wSW5m
bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBwaXhlbHMpCit7Cisg
ICAgaWYgKCFieXRlcygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGludCBvbGRXaWR0aCA9
IHdpZHRoKCk7CisgICAgaW50IG9sZEhlaWdodCA9IGhlaWdodCgpOworICAgIGludCBjb3B5V2lk
dGggPSBzdGQ6Om1pbjxpbnQ+KHJlY3Qud2lkdGgoKSwgb2xkV2lkdGggLSByZWN0LngoKSk7Cisg
ICAgaW50IGNvcHlIZWlnaHQgPSBzdGQ6Om1pbjxpbnQ+KHJlY3QuaGVpZ2h0KCksIG9sZEhlaWdo
dCAtIHJlY3QueSgpKTsKKyAgICBpZiAoIWNvcHlXaWR0aCB8fCAhY29weUhlaWdodCkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBibXBJbmZvID0gQml0bWFwSW5mbyghKHVzZUFscGhhICYmIGlz
MzJiaXQoKSksIGNvcHlXaWR0aCwgY29weUhlaWdodCk7CisgICAgSEJJVE1BUCBuZXdCbXAgPSBN
ZW1vcnlNYW5hZ2VyOjpjcmVhdGVESUJTZWN0aW9uKCZibXBJbmZvLCAmcGl4ZWxzKTsKKworICAg
IGlmIChuZXdCbXApIHsKKyAgICAgICAgT3duUHRyPEhEQz4gZGNOZXcoOjpDcmVhdGVDb21wYXRp
YmxlREMoMCkpOworICAgICAgICBIR0RJT0JKIHRtcE5ldyA9IDo6U2VsZWN0T2JqZWN0KGRjTmV3
LmdldCgpLCBuZXdCbXApOworCisgICAgICAgIFN0cmV0Y2hESUJpdHMoZGNOZXcuZ2V0KCksIDAs
IDAsIGNvcHlXaWR0aCwgY29weUhlaWdodCwgcmVjdC54KCksIHJlY3QueSgpLCBjb3B5V2lkdGgs
IGNvcHlIZWlnaHQKKyAgICAgICAgICAgICwgYnl0ZXMoKSwgJmJpdG1hcEluZm8oKSwgRElCX1JH
Ql9DT0xPUlMsIFNSQ0NPUFkpOworCisgICAgICAgIFNlbGVjdE9iamVjdChkY05ldy5nZXQoKSwg
dG1wTmV3KTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3Qm1wOworfQorCisKK1Bhc3NSZWZQdHI8
U2hhcmVkQml0bWFwPiBTaGFyZWRCaXRtYXA6OmNsaXBCaXRtYXAoY29uc3QgSW50UmVjdCYgcmVj
dCwgYm9vbCB1c2VBbHBoYSkKK3sKKyAgICBpbnQgb2xkV2lkdGggPSB3aWR0aCgpOworICAgIGlu
dCBvbGRIZWlnaHQgPSBoZWlnaHQoKTsKKyAgICBpbnQgY29weVdpZHRoID0gc3RkOjptaW48aW50
PihyZWN0LndpZHRoKCksIG9sZFdpZHRoIC0gcmVjdC54KCkpOworICAgIGludCBjb3B5SGVpZ2h0
ID0gc3RkOjptaW48aW50PihyZWN0LmhlaWdodCgpLCBvbGRIZWlnaHQgLSByZWN0LnkoKSk7Cisg
ICAgaWYgKCFjb3B5V2lkdGggfHwgIWNvcHlIZWlnaHQpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgU2hhcmVkQml0bWFwKiBuZXdCbXAgPSBuZXcgU2hhcmVkQml0bWFwKCEodXNlQWxwaGEgJiYg
aXMzMmJpdCgpKSwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LCBmYWxzZSk7CisKKyAgICBpZiAoIW5l
d0JtcCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIW5ld0JtcC0+Ynl0ZXMoKSkgewor
ICAgICAgICBkZWxldGUgbmV3Qm1wOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBE
Q0hvbGRlciBkY05ldyhuZXdCbXApOworCisgICAgU3RyZXRjaERJQml0cyhkY05ldy5nZXQoKSwg
MCwgMCwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LCByZWN0LngoKSwgcmVjdC55KCksIGNvcHlXaWR0
aCwgY29weUhlaWdodAorICAgICAgICAsIGJ5dGVzKCksICZiaXRtYXBJbmZvKCksIERJQl9SR0Jf
Q09MT1JTLCBTUkNDT1BZKTsKKworICAgIHJldHVybiBhZG9wdFJlZihuZXdCbXApOworfQorCitz
dGF0aWMgdm9pZCBkcmF3UGF0dGVyblNpbXBsZShIREMgaGRjLCBjb25zdCBSRUNUJiBkZXN0UmVj
dCwgSEJJVE1BUCBoYm1wLCBjb25zdCBQT0lOVCYgcGhhc2UpCit7CisgICAgSEJSVVNIIGhCcnVz
aCA9IENyZWF0ZVBhdHRlcm5CcnVzaChoYm1wKTsKKyAgICBpZiAoaEJydXNoKSB7CisgICAgICAg
IFBPSU5UIG9sZE9yZzsKKyAgICAgICAgU2V0QnJ1c2hPcmdFeChoZGMsIGRlc3RSZWN0LmxlZnQg
LSBwaGFzZS54LCBkZXN0UmVjdC50b3AgLSBwaGFzZS55LCAmb2xkT3JnKTsKKyAgICAgICAgRmls
bFJlY3QoaGRjLCAmZGVzdFJlY3QsIGhCcnVzaCk7CisgICAgICAgIERlbGV0ZU9iamVjdChoQnJ1
c2gpOworICAgICAgICBTZXRCcnVzaE9yZ0V4KGhkYywgb2xkT3JnLngsIG9sZE9yZy55LCAwKTsK
KyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdQYXR0ZXJuU2ltcGxlKEhEQyBoZGMsIGNvbnN0
IFJFQ1QmIGRlc3RSZWN0LCBjb25zdCBTaGFyZWRCaXRtYXAqIGJtcCwgY29uc3QgU0laRSYgYm1w
U2l6ZSwgY29uc3QgUE9JTlQmIHBoYXNlKQoreworICAgIGludCBkc3RZID0gZGVzdFJlY3QudG9w
OworICAgIGZvciAoaW50IHNvdXJjZVkgPSBwaGFzZS55OyBkc3RZIDwgZGVzdFJlY3QuYm90dG9t
OyApIHsKKyAgICAgICAgaW50IHNvdXJjZUggPSBzdGQ6Om1pbjxpbnQ+KGJtcFNpemUuY3kgLSBz
b3VyY2VZLCBkZXN0UmVjdC5ib3R0b20gLSBkc3RZKTsKKyAgICAgICAgaW50IGRzdFggPSBkZXN0
UmVjdC5sZWZ0OworICAgICAgICBmb3IgKGludCBzb3VyY2VYID0gcGhhc2UueDsgZHN0WCA8IGRl
c3RSZWN0LnJpZ2h0OyApIHsKKyAgICAgICAgICAgIGludCBzb3VyY2VXID0gc3RkOjptaW48aW50
PihibXBTaXplLmN4IC0gc291cmNlWCwgZGVzdFJlY3QucmlnaHQgLSBkc3RYKTsKKworICAgICAg
ICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFgsIGRzdFksIHNvdXJjZVcsIHNvdXJjZUgsIHNv
dXJjZVgsIHNvdXJjZVksIHNvdXJjZVcsIHNvdXJjZUgKKyAgICAgICAgICAgICAgICAsIGJtcC0+
Ynl0ZXMoKSwgJmJtcC0+Yml0bWFwSW5mbygpLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisK
KyAgICAgICAgICAgIGRzdFggKz0gc291cmNlVzsKKyAgICAgICAgICAgIHNvdXJjZVggPSAwOwor
ICAgICAgICB9CisKKyAgICAgICAgZHN0WSArPSBzb3VyY2VIOworICAgICAgICBzb3VyY2VZID0g
MDsKKyAgICB9Cit9CisKK3ZvaWQgbm9ybWFsaXplUGhhc2UoTE9ORyYgcGhhc2UsIGludCBsaW1p
dCkKK3sKKyAgICBpZiAoIXBoYXNlKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGxpbWl0IDwg
MikgeworICAgICAgICBwaGFzZSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYg
KGxpbWl0ID09IDIpIHsKKyAgICAgICAgcGhhc2UgPSBwaGFzZSAmIDE7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisgICAgaWYgKHBoYXNlIDwgMCkgeworICAgICAgICBwaGFzZSA9IC1waGFzZTsK
KyAgICAgICAgaWYgKHBoYXNlID4gbGltaXQpCisgICAgICAgICAgICBwaGFzZSA9IChMT05HKSgo
dW5zaWduZWQpcGhhc2UgJSAodW5zaWduZWQpbGltaXQpOworICAgICAgICBpZiAocGhhc2UpCisg
ICAgICAgICAgICBwaGFzZSA9IGxpbWl0IC0gcGhhc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAg
aWYgKHBoYXNlIDwgbGltaXQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHBoYXNlID0g
KExPTkcpKCh1bnNpZ25lZClwaGFzZSAlICh1bnNpZ25lZClsaW1pdCk7CisgICAgfQorfQorCit2
b2lkIFNoYXJlZEJpdG1hcDo6ZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25z
dCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0
ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYg
cGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBj
b25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAg
ICAgICByZXR1cm47CisgICAgY3R4dC0+ZHJhd0JpdG1hcFBhdHRlcm4odGhpcywgdGlsZVJlY3RJ
biwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIG9wLCBkZXN0UmVjdCwgb3JpZ1NvdXJjZVNpemUp
OworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6ZHJhd1BhdHRlcm4oSERDIGhkYywgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdElu
LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRv
ciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJj
ZVNpemUpCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYg
KGdfZHJhd1BhdHRlcm4pIHsKKyAgICAgICAgZ19kcmF3UGF0dGVybih0aGlzLCBoZGMsIHRyYW5z
Zm9ybSwgdGlsZVJlY3RJbiwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIG9wLCBkZXN0UmVjdCwg
b3JpZ1NvdXJjZVNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRpbGVS
ZWN0SW4ud2lkdGgoKSA8PSAwIHx8IHRpbGVSZWN0SW4uaGVpZ2h0KCkgPD0gMCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgYm9vbCB1c2VBbHBoYSA9IG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIg
JiYgaGFzQWxwaGEoKSAmJiBpczMyYml0KCk7CisKKyAgICBpbnQgYm1wV2lkdGggPSB3aWR0aCgp
OworICAgIGludCBibXBIZWlnaHQgPSBoZWlnaHQoKTsKKworICAgIEZsb2F0UmVjdCB0aWxlUmVj
dCh0aWxlUmVjdEluKTsKKyAgICBpZiAoYm1wV2lkdGggIT0gb3JpZ1NvdXJjZVNpemUud2lkdGgo
KSkgeworICAgICAgICBkb3VibGUgcmF0ZSA9IChkb3VibGUpYm1wV2lkdGggLyBvcmlnU291cmNl
U2l6ZS53aWR0aCgpOworICAgICAgICBkb3VibGUgdGVtcCA9IHRpbGVSZWN0LndpZHRoKCkgKiBy
YXRlOworICAgICAgICB0aWxlUmVjdC5zZXRYKHRpbGVSZWN0LngoKSAqIHJhdGUpOworICAgICAg
ICB0aWxlUmVjdC5zZXRXaWR0aCh0ZW1wKTsKKyAgICAgICAgdGVtcCA9IHRpbGVSZWN0LmhlaWdo
dCgpICogcmF0ZTsKKyAgICAgICAgdGlsZVJlY3Quc2V0WSh0aWxlUmVjdC55KCkgKiByYXRlKTsK
KyAgICAgICAgdGlsZVJlY3Quc2V0SGVpZ2h0KHRlbXApOworICAgIH0KKworICAgIE93blB0cjxI
QklUTUFQPiBjbGlwcGVkQm1wOworCisgICAgaWYgKHRpbGVSZWN0LngoKSB8fCB0aWxlUmVjdC55
KCkgfHwgdGlsZVJlY3Qud2lkdGgoKSAhPSBibXBXaWR0aCB8fCB0aWxlUmVjdC5oZWlnaHQoKSAh
PSBibXBIZWlnaHQpIHsKKyAgICAgICAgQml0bWFwSW5mbyBwYXR0ZXJuQm1wSW5mbzsKKyAgICAg
ICAgdm9pZCogcGF0dGVyblBpeGVsczsKKyAgICAgICAgY2xpcHBlZEJtcC5zZXQoY2xpcEJpdG1h
cChJbnRSZWN0KHRpbGVSZWN0KSwgdXNlQWxwaGEsIHBhdHRlcm5CbXBJbmZvLCBwYXR0ZXJuUGl4
ZWxzKSk7CisgICAgICAgIGlmICghY2xpcHBlZEJtcCkKKyAgICAgICAgICAgIHJldHVybjsKKwor
ICAgICAgICBibXBXaWR0aCA9IHRpbGVSZWN0LndpZHRoKCk7CisgICAgICAgIGJtcEhlaWdodCA9
IHRpbGVSZWN0LmhlaWdodCgpOworICAgIH0KKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRm
ID0gdHJhbnNmb3JtOworICAgIHRmICo9IHBhdHRlcm5UcmFuc2Zvcm07CisKKyAgICBGbG9hdFJl
Y3QgdHJSZWN0ID0gdGYubWFwUmVjdChkZXN0UmVjdCk7CisKKyAgICBSRUNUIGNsaXBCb3g7Cisg
ICAgaW50IGNsaXBUeXBlID0gR2V0Q2xpcEJveChoZGMsICZjbGlwQm94KTsKKyAgICBpZiAoY2xp
cFR5cGUgPT0gU0lNUExFUkVHSU9OKQorICAgICAgICB0clJlY3QuaW50ZXJzZWN0KEZsb2F0UmVj
dChjbGlwQm94LmxlZnQsIGNsaXBCb3gudG9wLCBjbGlwQm94LnJpZ2h0IC0gY2xpcEJveC5sZWZ0
LCBjbGlwQm94LmJvdHRvbSAtIGNsaXBCb3gudG9wKSk7CisgICAgZWxzZSBpZiAoY2xpcFR5cGUg
PT0gQ09NUExFWFJFR0lPTikgeworICAgICAgICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVhdGVS
ZWN0UmduKDAsIDAsIDAsIDApKTsKKyAgICAgICAgaWYgKEdldENsaXBSZ24oaGRjLCBjbGlwUmdu
LmdldCgpKSA+IDApIHsKKyAgICAgICAgICAgIERXT1JEIHJlZ2lvbkRhdGFTaXplID0gR2V0UmVn
aW9uRGF0YShjbGlwUmduLmdldCgpLCBzaXplb2YoUkdOREFUQSksIDApOworICAgICAgICAgICAg
aWYgKHJlZ2lvbkRhdGFTaXplKSB7CisgICAgICAgICAgICAgICAgUkdOREFUQSogcmVnaW9uRGF0
YSA9IG5ldyBSR05EQVRBW3JlZ2lvbkRhdGFTaXplXTsKKyAgICAgICAgICAgICAgICBHZXRSZWdp
b25EYXRhKGNsaXBSZ24uZ2V0KCksIHJlZ2lvbkRhdGFTaXplLCByZWdpb25EYXRhKTsKKyAgICAg
ICAgICAgICAgICBSRUNUKiByZWN0ID0gKFJFQ1QqKXJlZ2lvbkRhdGEtPkJ1ZmZlcjsKKyAgICAg
ICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVnaW9uRGF0YS0+cmRoLm5Db3Vu
dDsgKytpLCArK3JlY3QpCisgICAgICAgICAgICAgICAgICAgIHRyUmVjdC5pbnRlcnNlY3QoRmxv
YXRSZWN0KHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0LCBy
ZWN0LT5ib3R0b20gLSByZWN0LT50b3ApKTsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSByZWdp
b25EYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyUmVj
dC53aWR0aCgpIDw9IDAgfHwgdHJSZWN0LmhlaWdodCgpIDw9IDApCisgICAgICAgIHJldHVybjsK
KworICAgIHRyUmVjdC5pbmZsYXRlKDEpOworICAgIEludFJlY3QgdmlzaWJsZURzdFJlY3QgPSBl
bmNsb3NpbmdJbnRSZWN0KHRmLmludmVyc2UoKS5tYXBSZWN0KHRyUmVjdCkpOworICAgIHZpc2li
bGVEc3RSZWN0LmludGVyc2VjdChJbnRSZWN0KGRlc3RSZWN0KSk7CisKKyAgICBpZiAodmlzaWJs
ZURzdFJlY3Qud2lkdGgoKSA8PSAwIHx8IHZpc2libGVEc3RSZWN0LmhlaWdodCgpIDw9IDApCisg
ICAgICAgIHJldHVybjsKKworICAgIHRyUmVjdCA9IHRmLm1hcFJlY3QodmlzaWJsZURzdFJlY3Qp
OworICAgIFJFQ1QgZHN0UmVjdFdpbiA9CisgICAgeworICAgICAgICBzdGFibGVSb3VuZCh0clJl
Y3QueCgpKSwKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LnkoKSksCisgICAgICAgIHN0YWJs
ZVJvdW5kKHRyUmVjdC5yaWdodCgpKSwKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LmJvdHRv
bSgpKSwKKyAgICB9OworICAgIGlmIChkc3RSZWN0V2luLnJpZ2h0IDw9IGRzdFJlY3RXaW4ubGVm
dCB8fCBkc3RSZWN0V2luLmJvdHRvbSA8PSBkc3RSZWN0V2luLnRvcCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgU0laRSBibXBTaXplID0geyBibXBXaWR0aCwgYm1wSGVpZ2h0IH07CisKKyAgICAv
LyBSZWxhdGl2ZSB0byBkZXN0aW5hdGlvbiwgaW4gYml0bWFwIHBpeGVscworICAgIFBPSU5UIHBo
YXNlV2luID0geyBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC54KCkgLSBwaGFzZS54KCkpLCBz
dGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC55KCkgLSBwaGFzZS55KCkpIH07CisgICAgbm9ybWFs
aXplUGhhc2UocGhhc2VXaW4ueCwgYm1wU2l6ZS5jeCk7CisgICAgbm9ybWFsaXplUGhhc2UocGhh
c2VXaW4ueSwgYm1wU2l6ZS5jeSk7CisKKyAgICB7CisgICAgICAgIFJFQ1Qgc3JjUmVjdFdpbiA9
CisgICAgICAgIHsKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAg
c3RhYmxlUm91bmQodmlzaWJsZURzdFJlY3QucmlnaHQoKSkgLSBzdGFibGVSb3VuZCh2aXNpYmxl
RHN0UmVjdC54KCkpLAorICAgICAgICAgICAgc3RhYmxlUm91bmQodmlzaWJsZURzdFJlY3QuYm90
dG9tKCkpIC0gc3RhYmxlUm91bmQodmlzaWJsZURzdFJlY3QueSgpKQorICAgICAgICB9OworICAg
ICAgICBpZiAoc3JjUmVjdFdpbi5yaWdodCA8PSAwIHx8IHNyY1JlY3RXaW4uYm90dG9tIDw9IDAp
CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQml0bWFwSW5mbyBibXBJbmZvKCF1c2VB
bHBoYSwgc3JjUmVjdFdpbi5yaWdodCwgc3JjUmVjdFdpbi5ib3R0b20pOworICAgICAgICB2b2lk
KiBwaXhlbHM7CisgICAgICAgIE93blB0cjxIQklUTUFQPiBoYm1wVGVtcChNZW1vcnlNYW5hZ2Vy
OjpjcmVhdGVESUJTZWN0aW9uKCZibXBJbmZvLCAmcGl4ZWxzKSk7CisKKyAgICAgICAgaWYgKGhi
bXBUZW1wKSB7CisgICAgICAgICAgICBPd25QdHI8SERDPiBobWVtZGMoQ3JlYXRlQ29tcGF0aWJs
ZURDKGhkYykpOworICAgICAgICAgICAgSEdESU9CSiBvbGRCbXAgPSBTZWxlY3RPYmplY3QoaG1l
bWRjLmdldCgpLCBoYm1wVGVtcC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoY2xpcHBlZEJtcCkK
KyAgICAgICAgICAgICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RX
aW4sIGNsaXBwZWRCbXAuZ2V0KCksIHBoYXNlV2luKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChv
cCAhPSBDb21wb3NpdGVTb3VyY2VPdmVyIHx8IGNhblVzZURJQml0cygpKSAmJiBzcmNSZWN0V2lu
LnJpZ2h0IDw9IGJtcFNpemUuY3ggKiAyICYmIHNyY1JlY3RXaW4uYm90dG9tIDw9IGJtcFNpemUu
Y3kgKiAyKQorICAgICAgICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwg
c3JjUmVjdFdpbiwgdGhpcywgYm1wU2l6ZSwgcGhhc2VXaW4pOworICAgICAgICAgICAgZWxzZSBp
ZiAoZW5zdXJlSGFuZGxlKCkpCisgICAgICAgICAgICAgICAgZHJhd1BhdHRlcm5TaW1wbGUoaG1l
bWRjLmdldCgpLCBzcmNSZWN0V2luLCBnZXRIYW5kbGUoKSwgcGhhc2VXaW4pOworICAgICAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdm9pZCogcGl4ZWxzOworICAgICAgICAgICAgICAg
IEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAgICAgICAgICBpZiAoSEJJVE1BUCBoYm1wID0g
Y3JlYXRlSGFuZGxlKCZwaXhlbHMsICZibXBJbmZvLCAtMSwgZmFsc2UpKSB7CisgICAgICAgICAg
ICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3JjUmVjdFdpbiwgaGJt
cCwgcGhhc2VXaW4pOworICAgICAgICAgICAgICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7Cisg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0
KGhtZW1kYy5nZXQoKSwgb2xkQm1wKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmIGRlZmluZWQoTk9fQUxQSEFCTEVO
RCkKKyAgICAgICAgICAgIGlmICh1c2VBbHBoYSB8fChvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVy
ICYmIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpKQorI2Vsc2UKKyAgICAgICAgICAgIGlmICh1c2VB
bHBoYSkgeworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBCTEVOREZVTkNUSU9OIGJsZW5k
ID0geyBBQ19TUkNfT1ZFUiwgMCwgMjU1LCBBQ19TUkNfQUxQSEEgfTsKKyAgICAgICAgICAgICAg
ICBBbHBoYUJsZW5kKGhkYywgZHN0UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2luLnRvcCwgZHN0UmVj
dFdpbi5yaWdodCAtIGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi5ib3R0b20gLSBkc3RSZWN0
V2luLnRvcAorICAgICAgICAgICAgICAgICAgICAsIGhtZW1kYy5nZXQoKSwgMCwgMCwgc3JjUmVj
dFdpbi5yaWdodCwgc3JjUmVjdFdpbi5ib3R0b20sIGJsZW5kKTsKKyAgICAgICAgICAgIH0gZWxz
ZSBpZiAob3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAmJiB1c2VzVHJhbnNwYXJlbnRDb2xvcigp
KQorI2VuZGlmCisgICAgICAgICAgICAgICAgVHJhbnNwYXJlbnRCbHQoaGRjLCBkc3RSZWN0V2lu
LmxlZnQsIGRzdFJlY3RXaW4udG9wLCBkc3RSZWN0V2luLnJpZ2h0IC0gZHN0UmVjdFdpbi5sZWZ0
CisgICAgICAgICAgICAgICAgICAgICwgZHN0UmVjdFdpbi5ib3R0b20gLSBkc3RSZWN0V2luLnRv
cCwgaG1lbWRjLmdldCgpLCAwLCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRv
bSwgdHJhbnNwYXJlbnRDb2xvcigpKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
ICAgIERXT1JEIGJtcE9wID0gb3AgPT0gQ29tcG9zaXRlQ29weSA/IFNSQ0NPUFkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICA6IG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgPyBTUkNDT1BZ
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcCA9PSBDb21wb3NpdGVYT1IgPyBQQVRJ
TlZFUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wID09IENvbXBvc2l0ZUNsZWFy
ID8gV0hJVEVORVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTUkNDT1BZOyAvLyBG
SVhFTUU6IG90aGVyIHR5cGVzPworCisgICAgICAgICAgICAgICAgU3RyZXRjaERJQml0cyhoZGMs
IGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RS
ZWN0V2luLmxlZnQKKyAgICAgICAgICAgICAgICAgICAgLCBkc3RSZWN0V2luLmJvdHRvbSAtIGRz
dFJlY3RXaW4udG9wLCAwLCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbQor
ICAgICAgICAgICAgICAgICAgICAsIHBpeGVscywgJmJtcEluZm8sIERJQl9SR0JfQ09MT1JTLCBi
bXBPcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZWxlY3RPYmplY3QoaG1lbWRjLmdl
dCgpLCBvbGRCbXApOworICAgICAgICB9CisgICAgfQorfQorCitTaGFyZWRCaXRtYXA6OkRDUHJv
dmlkZXIgZ19kY1Byb3ZpZGVyOworU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyKiBTaGFyZWRCaXRt
YXA6Om1fZGNQcm92aWRlciA9ICZnX2RjUHJvdmlkZXI7CisKK0hEQyBTaGFyZWRCaXRtYXA6OkRD
UHJvdmlkZXI6OmdldERDKFNoYXJlZEJpdG1hcCogYm1wLCB1bnNpZ25lZCoga2V5MSwgdW5zaWdu
ZWQqIGtleTIpCit7CisgICAgaWYgKCFibXAgfHwgIWJtcC0+ZW5zdXJlSGFuZGxlKCkpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgSERDIGhkYyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURDKDApOwor
ICAgIGlmIChoZGMpIHsKKyAgICAgICAgKmtleTEgPSAodW5zaWduZWQpU2VsZWN0T2JqZWN0KGhk
YywgYm1wLT5nZXRIYW5kbGUoKSk7CisgICAgICAgIFJFQ1QgcmVjdCA9IHsgMCwgMCwgYm1wLT53
aWR0aCgpLCBibXAtPmhlaWdodCgpIH07CisgICAgICAgIE93blB0cjxIUkdOPiBjbGlwUmduKENy
ZWF0ZVJlY3RSZ25JbmRpcmVjdCgmcmVjdCkpOworICAgICAgICBTZWxlY3RDbGlwUmduKGhkYywg
Y2xpcFJnbi5nZXQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGhkYzsKK30KKwordm9pZCBTaGFy
ZWRCaXRtYXA6OkRDUHJvdmlkZXI6OnJlbGVhc2VEQyhTaGFyZWRCaXRtYXAqLCBIREMgaGRjLCB1
bnNpZ25lZCBrZXkxLCB1bnNpZ25lZCBrZXkyKQoreworICAgIGlmICghaGRjKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBTZWxlY3RPYmplY3QoaGRjLCAoSEdESU9CSilrZXkxKTsKKyAgICBEZWxl
dGVEQyhoZGMpOworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6Y2xlYXJQaXhlbHMoY29uc3QgSW50
UmVjdCYgcikKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisKKyAgICBJ
bnRSZWN0IGJtcFJlY3QoMCwgMCwgd2lkdGgoKSwgaGVpZ2h0KCkpOworICAgIGJtcFJlY3QuaW50
ZXJzZWN0KHIpOworICAgIGlmIChpczE2Yml0KCkpIHsKKyAgICAgICAgaW50IHcgPSBtX2JtcElu
Zm8ucGFkZGVkV2lkdGgoKTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQqIGRzdCA9ICh1bnNpZ25l
ZCBzaG9ydCopbV9waXhlbHM7CisgICAgICAgIGRzdCArPSBibXBSZWN0LnkoKSAqIHcgKyBibXBS
ZWN0LngoKTsKKyAgICAgICAgaW50IHdvcmRzVG9TZXQgPSBibXBSZWN0LndpZHRoKCk7CisgICAg
ICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBkc3RFbmQgPSBkc3QgKyBibXBSZWN0LmhlaWdodCgp
ICogdzsKKyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkgeworICAgICAgICAgICAgd21lbXNl
dCgod2NoYXJfdCopZHN0LCAwLCB3b3Jkc1RvU2V0KTsKKyAgICAgICAgICAgIGRzdCArPSB3Owor
ICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHcgPSB3aWR0aCgpOworICAgICAg
ICB1bnNpZ25lZCogZHN0ID0gKHVuc2lnbmVkKiltX3BpeGVsczsKKyAgICAgICAgZHN0ICs9IGJt
cFJlY3QueSgpICogdyArIGJtcFJlY3QueCgpOworICAgICAgICBpbnQgd29yZHNUb1NldCA9IGJt
cFJlY3Qud2lkdGgoKSAqIDI7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkKiBkc3RFbmQgPSBkc3Qg
KyBibXBSZWN0LmhlaWdodCgpICogdzsKKyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkgewor
ICAgICAgICAgICAgd21lbXNldCgod2NoYXJfdCopZHN0LCAwLCB3b3Jkc1RvU2V0KTsKKyAgICAg
ICAgICAgIGRzdCArPSB3OworICAgICAgICB9CisgICAgfQorfQorCit9CisKZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmggYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLjM3Njc2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oCkBAIC0wLDAgKzEsMTQ2IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQml0bWFw
SW5mby5oIgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNv
dW50ZWQuaD4KKyNpbmNsdWRlIDx3aW5nZGkuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisg
ICAgZW51bSBDb21wb3NpdGVPcGVyYXRvcjsKKyAgICBjbGFzcyBGbG9hdFBvaW50OworICAgIGNs
YXNzIEZsb2F0UmVjdDsKKyAgICBjbGFzcyBHcmFwaGljc0NvbnRleHQ7CisgICAgY2xhc3MgSW50
UmVjdDsKKyAgICBjbGFzcyBJbnRTaXplOworICAgIGNsYXNzIFRyYW5zZm9ybWF0aW9uTWF0cml4
OworCisgICAgY2xhc3MgU2hhcmVkQml0bWFwOiBwdWJsaWMgUmVmQ291bnRlZDxTaGFyZWRCaXRt
YXA+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIH5TaGFyZWRCaXRtYXAoKTsKKyAgICAgICAgc3Rh
dGljIFBhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBjcmVhdGVJbnN0YW5jZShib29sIGlzMTZiaXQs
IGludCB3LCBpbnQgaCwgYm9vbCBpbml0UGl4ZWxzKTsKKyAgICAgICAgY29uc3QgQml0bWFwSW5m
byYgYml0bWFwSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mbzsgfQorICAgICAgICB2b2lk
KiBieXRlcygpIHsgcmV0dXJuIG1fcGl4ZWxzOyB9CisgICAgICAgIGNvbnN0IHZvaWQqIGJ5dGVz
KCkgY29uc3QgeyByZXR1cm4gbV9waXhlbHM7IH0KKyAgICAgICAgdW5zaWduZWQgd2lkdGgoKSBj
b25zdCB7IHJldHVybiBtX2JtcEluZm8ud2lkdGgoKTsgfQorICAgICAgICB1bnNpZ25lZCBoZWln
aHQoKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8uaGVpZ2h0KCk7IH0KKyAgICAgICAgdW5zaWdu
ZWQgdmFsaWRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX3ZhbGlkSGVpZ2h0OyB9CisgICAgICAg
IHZvaWQgc2V0VmFsaWRIZWlnaHQodW5zaWduZWQgdmFsaWRIZWlnaHQpIHsgbV92YWxpZEhlaWdo
dCA9IHZhbGlkSGVpZ2h0OyB9CisgICAgICAgIHZvaWQgcmVzZXRQaXhlbHMoYm9vbCBibGFjayA9
IGZhbHNlKTsKKyAgICAgICAgdm9pZCBjbGVhclBpeGVscyhjb25zdCBJbnRSZWN0JiByKTsKKyAg
ICAgICAgYm9vbCBsb2NrZWQoKSBjb25zdCB7IHJldHVybiBtX2xvY2tlZDsgfQorICAgICAgICB2
b2lkIGxvY2soKSB7IG1fbG9ja2VkID0gdHJ1ZTsgfQorICAgICAgICB2b2lkIHVubG9jaygpIHsg
bV9sb2NrZWQgPSBmYWxzZTsgfQorICAgICAgICBib29sIGZyZWVNZW1vcnkoKTsKKyAgICAgICAg
Ym9vbCBpczE2Yml0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmlzMTZiaXQoKTsgfQorICAg
ICAgICBib29sIGlzMzJiaXQoKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8uaXMzMmJpdCgpOyB9
CisgICAgICAgIGJvb2wgdG8xNmJpdCgpOworICAgICAgICBib29sIGhhc0FscGhhKCkgY29uc3Qg
eyByZXR1cm4gbV9oYXNBbHBoYTsgfQorICAgICAgICB2b2lkIHNldEhhc0FscGhhKGJvb2wgYWxw
aGEpIHsgbV9oYXNBbHBoYSA9IGFscGhhOyB9CisgICAgICAgIGJvb2wgZW5zdXJlSGFuZGxlKCk7
CisgICAgICAgIEhCSVRNQVAgZ2V0SGFuZGxlKCkgeyByZXR1cm4gbV9oYml0bWFwOyB9CisgICAg
ICAgIEhCSVRNQVAgY3JlYXRlSGFuZGxlKHZvaWQqKiBwaXhlbHMsIEJpdG1hcEluZm8qIGJtcElu
Zm8sIGludCBoID0gLTEsIGJvb2wgdXNlMTZiaXQgPSB0cnVlKSBjb25zdDsKKyAgICAgICAgYm9v
bCB1c2VzVHJhbnNwYXJlbnRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdXNlc1RyYW5zcGFyZW50
Q29sb3I7IH0KKyAgICAgICAgQ09MT1JSRUYgdHJhbnNwYXJlbnRDb2xvcigpIGNvbnN0IHsgcmV0
dXJuIG1fdHJhbnNwYXJlbnRDb2xvcjsgfQorICAgICAgICB2b2lkIHNldFRyYW5zcGFyZW50Q29s
b3IoQ09MT1JSRUYgYykKKyAgICAgICAgeworICAgICAgICAgICAgbV91c2VzVHJhbnNwYXJlbnRD
b2xvciA9IHRydWU7CisgICAgICAgICAgICBtX3RyYW5zcGFyZW50Q29sb3IgPSBjOworICAgICAg
ICB9CisgICAgICAgIGJvb2wgY2FuVXNlRElCaXRzKCkgY29uc3QgeyByZXR1cm4gIWhhc0FscGhh
KCkgJiYgIXVzZXNUcmFuc3BhcmVudENvbG9yKCk7IH0KKworICAgICAgICBIQklUTUFQIGNsaXBC
aXRtYXAoY29uc3QgSW50UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJv
b2wgdXNlQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXBJbmZvJiBibXBJ
bmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHBpeGVscyk7CisKKyAgICAg
ICAgUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IGNsaXBCaXRtYXAoY29uc3QgSW50UmVjdCYgcmVj
dCwgYm9vbCB1c2VBbHBoYSk7CisKKyAgICAgICAgdm9pZCBkcmF3KEdyYXBoaWNzQ29udGV4dCog
Y3R4dCwgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29t
cG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApOworICAgICAgICB2b2lkIGRyYXdQYXR0ZXJuKEdy
YXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29u
c3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpOwor
ICAgICAgICB2b2lkIGRyYXcoSERDLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRS
ZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCk7CisgICAgICAgIHZv
aWQgZHJhd1BhdHRlcm4oSERDLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEZs
b2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5U
cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFz
ZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0
IEludFNpemUmIG9yaWdTb3VyY2VTaXplKTsKKworICAgICAgICB0eXBlZGVmIHZvaWQgKCpEcmF3
UGF0dGVybkZ1bmMpKFNoYXJlZEJpdG1hcCogYm1wLCBIREMsIGNvbnN0IFRyYW5zZm9ybWF0aW9u
TWF0cml4JiwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0
JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpOworICAgICAgICB0eXBl
ZGVmIGJvb2wgKCpEcmF3SW1hZ2VGdW5jKSAoU2hhcmVkQml0bWFwKiBibXAsIEhEQywgY29uc3Qg
SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0
b3IgY29tcG9zaXRlT3ApOworCisgICAgICAgIHN0YXRpYyBEcmF3UGF0dGVybkZ1bmMgc2V0RHJh
d1BhdHRlcm5GdW5jKERyYXdQYXR0ZXJuRnVuYyBmdW5jKTsKKyAgICAgICAgc3RhdGljIERyYXdJ
bWFnZUZ1bmMgc2V0RHJhd0ltYWdlRnVuYyhEcmF3SW1hZ2VGdW5jIGZ1bmMpOworCisgICAgICAg
IGNsYXNzIERDUHJvdmlkZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2aXJ0dWFs
IEhEQyBnZXREQyhTaGFyZWRCaXRtYXAqLCB1bnNpZ25lZCoga2V5MSwgdW5zaWduZWQqIGtleTIp
OworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VEQyhTaGFyZWRCaXRtYXAqLCBIREMg
aGRjLCB1bnNpZ25lZCBrZXkxLCB1bnNpZ25lZCBrZXkyKTsKKyAgICAgICAgfTsKKworICAgICAg
ICBzdGF0aWMgRENQcm92aWRlciogbV9kY1Byb3ZpZGVyOworCisgICAgICAgIEhEQyBnZXREQyh1
bnNpZ25lZCoga2V5MSwgdW5zaWduZWQqIGtleTIpIHsgcmV0dXJuIG1fZGNQcm92aWRlci0+Z2V0
REModGhpcywga2V5MSwga2V5Mik7IH0KKyAgICAgICAgdm9pZCByZWxlYXNlREMoSERDIGhkYywg
dW5zaWduZWQga2V5MSwgdW5zaWduZWQga2V5MikgeyBtX2RjUHJvdmlkZXItPnJlbGVhc2VEQyh0
aGlzLCBoZGMsIGtleTEsIGtleTIpOyB9CisKKyAgICAgICAgY2xhc3MgRENIb2xkZXIgeworICAg
ICAgICBwdWJsaWM6CisgICAgICAgICAgICBEQ0hvbGRlcihTaGFyZWRCaXRtYXAqIGJtcCA9IDAp
IHsgX3NldChibXApOyB9CisgICAgICAgICAgICB+RENIb2xkZXIoKSB7IF9jbGVhcigpOyB9Cisg
ICAgICAgICAgICB2b2lkIHNldChTaGFyZWRCaXRtYXAqIGJtcCA9IDApCisgICAgICAgICAgICB7
CisgICAgICAgICAgICAgICAgX2NsZWFyKCk7CisgICAgICAgICAgICAgICAgX3NldChibXApOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgSERDIGdldCgpIGNvbnN0IHsgcmV0dXJuIG1faGRj
OyB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBEQ0hvbGRlciYgb3BlcmF0b3I9KGNv
bnN0IERDSG9sZGVyJik7CisgICAgICAgICAgICBEQ0hvbGRlcihjb25zdCBEQ0hvbGRlciYpOwor
ICAgICAgICAgICAgdm9pZCBfY2xlYXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IGlmIChtX2hkYykKKyAgICAgICAgICAgICAgICAgICAgbV9iaXRtYXAtPnJlbGVhc2VEQyhtX2hk
YywgbV9rZXkxLCBtX2tleTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBfc2V0
KFNoYXJlZEJpdG1hcCogYm1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fYml0
bWFwID0gYm1wOworICAgICAgICAgICAgICAgIG1faGRjID0gYm1wID8gYm1wLT5nZXREQygmbV9r
ZXkxLCAmbV9rZXkyKSA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTaGFyZWRCaXRt
YXAqIG1fYml0bWFwOworICAgICAgICAgICAgSERDIG1faGRjOworICAgICAgICAgICAgdW5zaWdu
ZWQgbV9rZXkxOworICAgICAgICAgICAgdW5zaWduZWQgbV9rZXkyOworICAgICAgICB9OworCisg
ICAgcHJpdmF0ZToKKyAgICAgICAgZXhwbGljaXQgU2hhcmVkQml0bWFwKGJvb2wgaXMxNmJpdCwg
aW50IHcsIGludCBoLCBib29sIGluaXRQaXhlbHMpOworICAgICAgICBleHBsaWNpdCBTaGFyZWRC
aXRtYXAoY29uc3QgQml0bWFwSW5mbyYgYm1wSW5mbywgSEJJVE1BUCBoYm1wLCB2b2lkKiBwaXhl
bHMpOworICAgICAgICBCaXRtYXBJbmZvIG1fYm1wSW5mbzsKKyAgICAgICAgaW50IG1fcmVmZXJl
bmNlOworICAgICAgICBIQklUTUFQIG1faGJpdG1hcDsKKyAgICAgICAgdm9pZCogbV9waXhlbHM7
CisgICAgICAgIENPTE9SUkVGIG1fdHJhbnNwYXJlbnRDb2xvcjsKKyAgICAgICAgaW50IG1fdmFs
aWRIZWlnaHQ7CisgICAgICAgIGJvb2wgbV9sb2NrZWQ7CisgICAgICAgIGJvb2wgbV91c2VzVHJh
bnNwYXJlbnRDb2xvcjsKKyAgICAgICAgYm9vbCBtX2hhc0FscGhhOworICAgIH07CisKK30K
</data>
<flag name="review"
          id="18013"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33815</attachid>
            <date>2009-07-30 13:13:13 -0700</date>
            <delta_ts>2009-08-08 13:12:31 -0700</delta_ts>
            <desc>3) ImageBuffer</desc>
            <filename>27511_3.patch</filename>
            <type>text/plain</type>
            <size>8531</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJE
YXRhLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyRGF0YS5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjdkMDYKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyRGF0YS5o
CkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxl
LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor
ICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgSW1hZ2VCdWZm
ZXJEYXRhX2gKKyNkZWZpbmUgSW1hZ2VCdWZmZXJEYXRhX2gKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCisgICAgY2xhc3MgSW50U2l6ZTsKKyAgICBjbGFzcyBJbWFnZUJ1ZmZlckRhdGEgeworICAg
IHB1YmxpYzoKKyAgICAgICAgSW1hZ2VCdWZmZXJEYXRhKGNvbnN0IEludFNpemUmIHNpemUpOwor
ICAgICAgICBSZWZQdHI8U2hhcmVkQml0bWFwPiBtX2JpdG1hcDsKKyAgICB9OworCit9ICAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIEltYWdlQnVmZmVyRGF0YV9oCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2luY2UuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbmNlLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTgxM2UzCi0tLSAvZGV2L251bGwK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbmNlLmNw
cApAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2Jp
bGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAg
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
CisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkltYWdlQnVmZmVyLmgiCisKKyNpbmNsdWRlICJCYXNlNjQuaCIKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUg
IkltYWdlRGF0YS5oIgorI2luY2x1ZGUgIkpQRUdFbmNvZGVyLmgiCisjaW5jbHVkZSAiUE5HRW5j
b2Rlci5oIgorI2luY2x1ZGUgIlNoYXJlZEJpdG1hcC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIEJ1ZmZlcmVkSW1hZ2U6IHB1YmxpYyBJbWFnZSB7CisKK3B1YmxpYzoKKyAgICBC
dWZmZXJlZEltYWdlKGNvbnN0IEltYWdlQnVmZmVyRGF0YSogZGF0YSkKKyAgICAgICAgOiBtX2Rh
dGEoZGF0YSkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBJbnRTaXplIHNpemUoKSBjb25z
dCB7IHJldHVybiBJbnRTaXplKG1fZGF0YS0+bV9iaXRtYXAtPndpZHRoKCksIG1fZGF0YS0+bV9i
aXRtYXAtPmhlaWdodCgpKTsgfQorICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95RGVjb2RlZERhdGEo
Ym9vbCBkZXN0cm95QWxsID0gdHJ1ZSkge30KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGRlY29kZWRT
aXplKCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgdm9pZCBkcmF3KEdyYXBoaWNz
Q29udGV4dCosIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNS
ZWN0LCBDb21wb3NpdGVPcGVyYXRvcik7CisgICAgdmlydHVhbCB2b2lkIGRyYXdQYXR0ZXJuKEdy
YXBoaWNzQ29udGV4dCosIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciwgY29uc3QgRmxv
YXRSZWN0JiBkZXN0UmVjdCk7CisKKyAgICBjb25zdCBJbWFnZUJ1ZmZlckRhdGEqIG1fZGF0YTsK
K307CisKK3ZvaWQgQnVmZmVyZWRJbWFnZTo6ZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNv
bnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3Np
dGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBJbnRSZWN0IGludERzdFJlY3QgPSBlbmNs
b3NpbmdJbnRSZWN0KGRzdFJlY3QpOworICAgIEludFJlY3QgaW50U3JjUmVjdChzcmNSZWN0KTsK
KyAgICBtX2RhdGEtPm1fYml0bWFwLT5kcmF3KGN0eHQsIGludERzdFJlY3QsIGludFNyY1JlY3Qs
IGNvbXBvc2l0ZU9wKTsKK30KKwordm9pZCBCdWZmZXJlZEltYWdlOjpkcmF3UGF0dGVybihHcmFw
aGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwg
Y29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBtX2RhdGEtPm1fYml0bWFwLT5kcmF3
UGF0dGVybihjdHh0LCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgb3AsIGRl
c3RSZWN0LCBzaXplKCkpOworfQorCitJbWFnZUJ1ZmZlckRhdGE6OkltYWdlQnVmZmVyRGF0YShj
b25zdCBJbnRTaXplJiBzaXplKQorOiBtX2JpdG1hcChTaGFyZWRCaXRtYXA6OmNyZWF0ZUluc3Rh
bmNlKGZhbHNlLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCksIGZhbHNlKSkKK3sKKyAgICAv
LyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWh0bWw1LTIwMDkwMjEyL3RoZS1jYW52YXMt
ZWxlbWVudC5odG1sI2NhbnZhc3BpeGVsYXJyYXkKKyAgICAvLyAiV2hlbiB0aGUgY2FudmFzIGlz
IGluaXRpYWxpemVkIGl0IG11c3QgYmUgc2V0IHRvIGZ1bGx5IHRyYW5zcGFyZW50IGJsYWNrLiIK
KyAgICBtX2JpdG1hcC0+cmVzZXRQaXhlbHModHJ1ZSk7CisgICAgbV9iaXRtYXAtPnNldEhhc0Fs
cGhhKHRydWUpOworfQorCitJbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIoY29uc3QgSW50U2l6ZSYg
c2l6ZSwgYm9vbCBncmF5U2NhbGUsIGJvb2wmIHN1Y2Nlc3MpCis6IG1fZGF0YShzaXplKQorLCBt
X3NpemUoc2l6ZSkKK3sKKyAgICBncmF5U2NhbGU7IC8vIEN1cnJlbnRseSBub3QgdXNlZAorICAg
IG1fY29udGV4dC5zZXQobmV3IEdyYXBoaWNzQ29udGV4dCgwKSk7CisgICAgbV9jb250ZXh0LT5z
ZXRCaXRtYXAobV9kYXRhLm1fYml0bWFwKTsKKyAgICBzdWNjZXNzID0gdHJ1ZTsKK30KKworSW1h
Z2VCdWZmZXI6On5JbWFnZUJ1ZmZlcigpCit7Cit9CisKK0dyYXBoaWNzQ29udGV4dCogSW1hZ2VC
dWZmZXI6OmNvbnRleHQoKSBjb25zdAoreworICAgIHJldHVybiBtX2NvbnRleHQuZ2V0KCk7Cit9
CisKK0ltYWdlKiBJbWFnZUJ1ZmZlcjo6aW1hZ2UoKSBjb25zdAoreworICAgIGlmICghbV9pbWFn
ZSkKKyAgICAgICAgbV9pbWFnZSA9IGFkb3B0UmVmKG5ldyBCdWZmZXJlZEltYWdlKCZtX2RhdGEp
KTsKKworICAgIHJldHVybiBtX2ltYWdlLmdldCgpOworfQorCitQYXNzUmVmUHRyPEltYWdlRGF0
YT4gSW1hZ2VCdWZmZXI6OmdldEltYWdlRGF0YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAor
eworICAgIFBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBpbWFnZURhdGEgPSBJbWFnZURhdGE6OmNyZWF0
ZShyZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworCisgICAgY29uc3QgdW5zaWduZWQgY2hh
ciogc3JjID0gKHVuc2lnbmVkIGNoYXIqKW1fZGF0YS5tX2JpdG1hcC0+Ynl0ZXMoKTsKKyAgICBp
ZiAoIXNyYykKKyAgICAgICAgcmV0dXJuIGltYWdlRGF0YTsKKworICAgIEludFJlY3Qgc291cmNl
UmVjdCgwLCAwLCBtX2RhdGEubV9iaXRtYXAtPndpZHRoKCksIG1fZGF0YS5tX2JpdG1hcC0+aGVp
Z2h0KCkpOworICAgIHNvdXJjZVJlY3QuaW50ZXJzZWN0KHJlY3QpOworICAgIGlmIChzb3VyY2VS
ZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGltYWdlRGF0YTsKKworICAgIHVuc2lnbmVk
IGNoYXIqIGRzdCA9IGltYWdlRGF0YS0+ZGF0YSgpLT5kYXRhKCktPmRhdGEoKTsKKyAgICBtZW1z
ZXQoZHN0LCAwLCBpbWFnZURhdGEtPmRhdGEoKS0+ZGF0YSgpLT5sZW5ndGgoKSk7CisgICAgc3Jj
ICs9IChzb3VyY2VSZWN0LnkoKSAqIG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSArIHNvdXJjZVJl
Y3QueCgpKSAqIDQ7CisgICAgZHN0ICs9ICgoc291cmNlUmVjdC55KCkgLSByZWN0LnkoKSkgKiBp
bWFnZURhdGEtPndpZHRoKCkgKyBzb3VyY2VSZWN0LngoKSAtIHJlY3QueCgpKSAqIDQ7CisgICAg
aW50IGJ5dGVzVG9Db3B5ID0gc291cmNlUmVjdC53aWR0aCgpICogNDsKKyAgICBpbnQgc3JjU2tp
cCA9IChtX2RhdGEubV9iaXRtYXAtPndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICogNDsK
KyAgICBpbnQgZHN0U2tpcCA9IChpbWFnZURhdGEtPndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRo
KCkpICogNDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBkc3QgKyBzb3VyY2VS
ZWN0LmhlaWdodCgpICogaW1hZ2VEYXRhLT53aWR0aCgpICogNDsKKyAgICB3aGlsZSAoZHN0IDwg
ZHN0RW5kKSB7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRzdFJvd0VuZCA9IGRzdCAr
IGJ5dGVzVG9Db3B5OworICAgICAgICB3aGlsZSAoZHN0IDwgZHN0Um93RW5kKSB7CisgICAgICAg
ICAgICAqZHN0KysgPSBzcmNbM107IC8vIEEKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsg
Ly8gQgorICAgICAgICAgICAgKmRzdCsrID0gKnNyYysrOyAvLyBHCisgICAgICAgICAgICAqZHN0
KysgPSAqc3JjKys7IC8vIFIKKyAgICAgICAgICAgICsrc3JjOworICAgICAgICB9CisgICAgICAg
IHNyYyArPSBzcmNTa2lwOworICAgICAgICBkc3QgKz0gZHN0U2tpcDsKKyAgICB9CisKKyAgICBy
ZXR1cm4gaW1hZ2VEYXRhOworfQorCit2b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEoSW1h
Z2VEYXRhKiBzb3VyY2UsIGNvbnN0IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50
JiBkZXN0UG9pbnQpCit7CisgICAgdW5zaWduZWQgY2hhciogZHN0ID0gKHVuc2lnbmVkIGNoYXIq
KW1fZGF0YS5tX2JpdG1hcC0+Ynl0ZXMoKTsKKyAgICBpZiAoIWRzdCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgSW50UmVjdCBkZXN0UmVjdChkZXN0UG9pbnQsIHNvdXJjZVJlY3Quc2l6ZSgpKTsK
KyAgICBkZXN0UmVjdC5pbnRlcnNlY3QoSW50UmVjdCgwLCAwLCBtX2RhdGEubV9iaXRtYXAtPndp
ZHRoKCksIG1fZGF0YS5tX2JpdG1hcC0+aGVpZ2h0KCkpKTsKKworICAgIGlmIChkZXN0UmVjdC5p
c0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNy
YyA9IHNvdXJjZS0+ZGF0YSgpLT5kYXRhKCktPmRhdGEoKTsKKyAgICBkc3QgKz0gKGRlc3RSZWN0
LnkoKSAqIG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSArIGRlc3RSZWN0LngoKSkgKiA0OworICAg
IHNyYyArPSAoc291cmNlUmVjdC55KCkgKiBzb3VyY2UtPndpZHRoKCkgKyBzb3VyY2VSZWN0Lngo
KSkgKiA0OworICAgIGludCBieXRlc1RvQ29weSA9IGRlc3RSZWN0LndpZHRoKCkgKiA0OworICAg
IGludCBkc3RTa2lwID0gKG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSAtIGRlc3RSZWN0LndpZHRo
KCkpICogNDsKKyAgICBpbnQgc3JjU2tpcCA9IChzb3VyY2UtPndpZHRoKCkgLSBkZXN0UmVjdC53
aWR0aCgpKSAqIDQ7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogZHN0RW5kID0gZHN0ICsgZGVz
dFJlY3QuaGVpZ2h0KCkgKiBtX2RhdGEubV9iaXRtYXAtPndpZHRoKCkgKiA0OworICAgIHdoaWxl
IChkc3QgPCBkc3RFbmQpIHsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZHN0Um93RW5k
ID0gZHN0ICsgYnl0ZXNUb0NvcHk7CisgICAgICAgIHdoaWxlIChkc3QgPCBkc3RSb3dFbmQpIHsK
KyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYWxwaGEgPSAqc3JjKys7CisgICAgICAgICAgICAq
ZHN0KysgPSAqc3JjKys7IC8vIEIKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsgLy8gRwor
ICAgICAgICAgICAgKmRzdCsrID0gKnNyYysrOyAvLyBSCisgICAgICAgICAgICAqZHN0KysgPSBh
bHBoYTsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gc3JjU2tpcDsKKyAgICAgICAgZHN0ICs9
IGRzdFNraXA7CisgICAgfQorfQorCitTdHJpbmcgSW1hZ2VCdWZmZXI6OnRvRGF0YVVSTChjb25z
dCBTdHJpbmcmIG1pbWVUeXBlKSBjb25zdAoreworICAgIGlmICghbV9kYXRhLm1fYml0bWFwLT5i
eXRlcygpKQorICAgICAgICByZXR1cm4gImRhdGE6LCI7CisKKyAgICBWZWN0b3I8Y2hhcj4gb3V0
cHV0OworICAgIGNvbnN0IGNoYXIqIGhlYWRlcjsKKyAgICBpZiAobWltZVR5cGUubG93ZXIoKSA9
PSAiaW1hZ2UvcG5nIikgeworICAgICAgICBpZiAoIWNvbXByZXNzQml0bWFwVG9QbmcobV9kYXRh
Lm1fYml0bWFwLmdldCgpLCBvdXRwdXQpKQorICAgICAgICAgICAgcmV0dXJuICJkYXRhOiwiOwor
ICAgICAgICBoZWFkZXIgPSAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LCI7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgaWYgKCFjb21wcmVzc0JpdG1hcFRvSnBlZyhtX2RhdGEubV9iaXRtYXAuZ2V0KCks
IG91dHB1dCkpCisgICAgICAgICAgICByZXR1cm4gImRhdGE6LCI7CisgICAgICAgIGhlYWRlciA9
ICJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCI7CisgICAgfQorCisgICAgVmVjdG9yPGNoYXI+IGJh
c2U2NDsKKyAgICBiYXNlNjRFbmNvZGUob3V0cHV0LCBiYXNlNjQpOworCisgICAgb3V0cHV0LmNs
ZWFyKCk7CisKKyAgICBWZWN0b3I8Y2hhcj4gdXJsOworICAgIHVybC5hcHBlbmQoaGVhZGVyLCBz
dHJsZW4oaGVhZGVyKSk7CisgICAgdXJsLmFwcGVuZChiYXNlNjQpOworCisgICAgcmV0dXJuIFN0
cmluZyh1cmwuZGF0YSgpLCB1cmwuc2l6ZSgpKTsKK30KKworfQo=
</data>
<flag name="review"
          id="18014"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33816</attachid>
            <date>2009-07-30 13:13:46 -0700</date>
            <delta_ts>2009-08-08 13:12:31 -0700</delta_ts>
            <desc>4) ImageFrameSink</desc>
            <filename>27511_4.patch</filename>
            <type>text/plain</type>
            <size>11719</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFtZVNp
bmsuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFtZVNpbmsuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjFiOTdkCi0tLSAvZGV2L251bGwK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUZyYW1lU2luay5oCkBA
IC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVy
LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkg
VG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGkgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5k
ZWYgSU1BR0VfRlJBTUVfU0lOS19IXworI2RlZmluZSBJTUFHRV9GUkFNRV9TSU5LX0hfCisKKyNp
bmNsdWRlICJJbnRSZWN0LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIG5hbWVzcGFj
ZSBSR0JBMzJCdWZmZXIgeworICAgICAgICBlbnVtIEZyYW1lU3RhdHVzIHsKKyAgICAgICAgICAg
IEZyYW1lRW1wdHksCisgICAgICAgICAgICBGcmFtZVBhcnRpYWwsCisgICAgICAgICAgICBGcmFt
ZUNvbXBsZXRlCisgICAgICAgIH07CisgICAgICAgIGVudW0gRnJhbWVEaXNwb3NhbE1ldGhvZCB7
CisgICAgICAgICAgICAvLyBJZiB5b3UgY2hhbmdlIHRoZSBudW1lcmljIHZhbHVlcyBvZiB0aGVz
ZSwgbWFrZSBzdXJlIHlvdSBhdWRpdCBhbGwKKyAgICAgICAgICAgIC8vIHVzZXJzLCBhcyBzb21l
IHVzZXJzIG1heSBjYXN0IHJhdyB2YWx1ZXMgdG8vZnJvbSB0aGVzZSBjb25zdGFudHMuCisgICAg
ICAgICAgICBEaXNwb3NlTm90U3BlY2lmaWVkID0gMCwgICAgICAgLy8gTGVhdmUgZnJhbWUgaW4g
ZnJhbWVidWZmZXIKKyAgICAgICAgICAgIERpc3Bvc2VLZWVwID0gMSwgICAgICAgICAgICAgICAv
LyBMZWF2ZSBmcmFtZSBpbiBmcmFtZWJ1ZmZlcgorICAgICAgICAgICAgRGlzcG9zZU92ZXJ3cml0
ZUJnY29sb3IgPSAyLCAgIC8vIENsZWFyIGZyYW1lIHRvIHRyYW5zcGFyZW50CisgICAgICAgICAg
ICBEaXNwb3NlT3ZlcndyaXRlUHJldmlvdXMgPSAzLCAgLy8gQ2xlYXIgZnJhbWUgdG8gcHJldmlv
dXMgZnJhbWVidWZmZXIgY29udGVudHMKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBjbGFzcyBJ
bWFnZUZyYW1lU2luayB7CisgICAgcHVibGljOgorICAgICAgICBJbWFnZUZyYW1lU2luayhib29s
IGNhbkZyZWVCdWZmZXIpCisgICAgICAgICAgICA6IG1fMTZiaXQoZmFsc2UpCisgICAgICAgICAg
ICAsIG1faW1hZ2VXaWR0aCgwKQorICAgICAgICAgICAgLCBtX2J1ZmZlcldpZHRoKDApCisgICAg
ICAgICAgICAsIG1faGVpZ2h0KDApCisgICAgICAgICAgICAsIG1fZXhwZWN0ZWRIZWlnaHQoMCkK
KyAgICAgICAgICAgICwgbV9zdGF0dXMoUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5KQorICAgICAg
ICAgICAgLCBtX2Rpc3Bvc2FsTWV0aG9kKFJHQkEzMkJ1ZmZlcjo6RGlzcG9zZU5vdFNwZWNpZmll
ZCkKKyAgICAgICAgICAgICwgbV9kdXJhdGlvbigwKQorICAgICAgICAgICAgLCBtX2hhc0FscGhh
KGZhbHNlKQorICAgICAgICAgICAgLCBtX2NhbkZyZWVCdWZmZXIoY2FuRnJlZUJ1ZmZlcikKKyAg
ICAgICAgICAgICwgbV9zaG91bGRGcmVlQnVmZmVyKGZhbHNlKQorICAgICAgICAgICAgLCBtX3Vz
ZXNUcmFuc3BhcmVudENvbG9yKGZhbHNlKQorICAgICAgICAgICAgLCBtX3RyYW5zcGFyZW50Q29s
b3IoMCkKKyAgICAgICAgICAgICwgbV9jb21wb3NpdGVkV2l0aFByZXZpb3VzRnJhbWUoZmFsc2Up
CisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIH5JbWFnZUZyYW1lU2luaygpIHsgZnJl
ZUJ1ZmZlcigpOyB9CisKKyAgICAgICAgY29uc3Qgdm9pZCogYnl0ZXMoKSBjb25zdDsKKyAgICAg
ICAgdm9pZCogYnl0ZXMoKTsKKyAgICAgICAgYm9vbCBhbGxvY2F0ZUJ1ZmZlcigpOworICAgICAg
ICBOYXRpdmVJbWFnZVB0ciBnZXRGcmFtZSgpOworICAgICAgICBib29sIGlzQnVmZmVyUmVhZHko
KSBjb25zdDsKKyAgICAgICAgdm9pZCBmcmVlQnVmZmVyKCk7CisKKyAgICAgICAgYm9vbCBzaG91
bGRGcmVlQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9zaG91bGRGcmVlQnVmZmVyOyB9CisgICAg
ICAgIGJvb2wgY2FuRnJlZUJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1fY2FuRnJlZUJ1ZmZlcjsg
fQorICAgICAgICBib29sIGlzMTZiaXQoKSBjb25zdCB7IHJldHVybiBtXzE2Yml0OyB9CisgICAg
ICAgIGNvbnN0IEludFJlY3QmIHJlY3QoKSBjb25zdCB7IHJldHVybiBtX3JlY3Q7IH0KKyAgICAg
ICAgdW5zaWduZWQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9oZWlnaHQ7IH0KKyAgICAgICAg
dW5zaWduZWQgYnVmZmVyV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2J1ZmZlcldpZHRoOyB9Cisg
ICAgICAgIHVuc2lnbmVkIGltYWdlV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2ltYWdlV2lkdGg7
IH0KKyAgICAgICAgUkdCQTMyQnVmZmVyOjpGcmFtZVN0YXR1cyBzdGF0dXMoKSBjb25zdCB7IHJl
dHVybiBtX3N0YXR1czsgfQorICAgICAgICB1bnNpZ25lZCBkdXJhdGlvbigpIGNvbnN0IHsgcmV0
dXJuIG1fZHVyYXRpb247IH0KKyAgICAgICAgYm9vbCBoYXNBbHBoYSgpIGNvbnN0IHsgcmV0dXJu
IG1faGFzQWxwaGE7IH0KKyAgICAgICAgdW5zaWduZWQgdG90YWxCeXRlcygpIGNvbnN0IHsgcmV0
dXJuIG1fYnVmZmVyV2lkdGggKiBtX2V4cGVjdGVkSGVpZ2h0IDw8IChtXzE2Yml0ID8gMSA6IDIp
OyB9CisKKyAgICAgICAgdm9pZCBzZXRDYW5GcmVlQnVmZmVyKGJvb2wgY2FuKTsKKyAgICAgICAg
Ym9vbCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBpczE2Yml0KQorICAgICAg
ICB7CisgICAgICAgICAgICBtXzE2Yml0ID0gaXMxNmJpdDsKKyAgICAgICAgICAgIG1faW1hZ2VX
aWR0aCA9IHdpZHRoOworICAgICAgICAgICAgbV9leHBlY3RlZEhlaWdodCA9IGhlaWdodDsKKyAg
ICAgICAgICAgIHJldHVybiBhbGxvY2F0ZUJ1ZmZlcigpOworICAgICAgICB9CisgICAgICAgIHZv
aWQgc2V0UmVjdChjb25zdCBJbnRSZWN0JiByKSB7IG1fcmVjdCA9IHI7IH0KKyAgICAgICAgdm9p
ZCBlbnN1cmVIZWlnaHQoaW50IHJvd0luZGV4KTsKKyAgICAgICAgdm9pZCBzZXRTdGF0dXMoUkdC
QTMyQnVmZmVyOjpGcmFtZVN0YXR1cyBzKSB7IG1fc3RhdHVzID0gczsgfQorICAgICAgICB2b2lk
IHNldER1cmF0aW9uKHVuc2lnbmVkIGR1cmF0aW9uKSB7IG1fZHVyYXRpb24gPSBkdXJhdGlvbjsg
fQorICAgICAgICB2b2lkIHNldEhhc0FscGhhKGJvb2wgYWxwaGEpIHsgbV9oYXNBbHBoYSA9IGFs
cGhhOyB9CisgICAgICAgIGJvb2wgdXNlc1RyYW5zcGFyZW50Q29sb3IoKSBjb25zdCB7IHJldHVy
biBtX3VzZXNUcmFuc3BhcmVudENvbG9yOyB9CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHRyYW5z
cGFyZW50Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX3RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICAg
ICAgdm9pZCBzZXRUcmFuc3BhcmVudENvbG9yKHVuc2lnbmVkIHNob3J0IGNvbG9yKQorICAgICAg
ICB7CisgICAgICAgICAgICBtX3RyYW5zcGFyZW50Q29sb3IgPSBjb2xvcjsKKyAgICAgICAgICAg
IG1fdXNlc1RyYW5zcGFyZW50Q29sb3IgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHZvaWQg
Y2xlYXJUcmFuc3BhcmVudENvbG9yKCkgeyBtX3VzZXNUcmFuc3BhcmVudENvbG9yID0gZmFsc2U7
IH0KKyAgICAgICAgUkdCQTMyQnVmZmVyOjpGcmFtZURpc3Bvc2FsTWV0aG9kIGRpc3Bvc2FsTWV0
aG9kKCkgY29uc3QgeyByZXR1cm4gbV9kaXNwb3NhbE1ldGhvZDsgfQorICAgICAgICB2b2lkIHNl
dERpc3Bvc2FsTWV0aG9kKFJHQkEzMkJ1ZmZlcjo6RnJhbWVEaXNwb3NhbE1ldGhvZCBtZXRob2Qp
IHsgbV9kaXNwb3NhbE1ldGhvZCA9IG1ldGhvZDsgfQorICAgICAgICBib29sIGNvbXBvc2l0ZWRX
aXRoUHJldmlvdXNGcmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29tcG9zaXRlZFdpdGhQcmV2aW91
c0ZyYW1lOyB9CisgICAgICAgIHZvaWQgc2V0Q29tcG9zaXRlZFdpdGhQcmV2aW91c0ZyYW1lKCkg
eyBtX2NvbXBvc2l0ZWRXaXRoUHJldmlvdXNGcmFtZSA9IHRydWU7IH0KKworICAgICAgICBzdGF0
aWMgdm9pZCBzZXRSR0JBKHVuc2lnbmVkJiBwb3MsIHVuc2lnbmVkIHIsIHVuc2lnbmVkIGcsIHVu
c2lnbmVkIGIsIHVuc2lnbmVkIGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIHN0b3Jl
IHRoaXMgZGF0YSBwcmUtbXVsdGlwbGllZC4KKyAgICAgICAgICAgIGlmICghYSkKKyAgICAgICAg
ICAgICAgICBwb3MgPSAociA8PCAxNiB8IGcgPDwgOCB8IGIpOworICAgICAgICAgICAgZWxzZSB7
CisgICAgICAgICAgICAgICAgaWYgKGEgPCAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxv
YXQgYWxwaGFQZXJjZW50ID0gYSAvIDI1NS4wZjsKKyAgICAgICAgICAgICAgICAgICAgciA9IHN0
YXRpY19jYXN0PHVuc2lnbmVkPihyICogYWxwaGFQZXJjZW50KTsKKyAgICAgICAgICAgICAgICAg
ICAgZyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihnICogYWxwaGFQZXJjZW50KTsKKyAgICAgICAg
ICAgICAgICAgICAgYiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihiICogYWxwaGFQZXJjZW50KTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9zID0gKGEgPDwgMjQgfCByIDw8
IDE2IHwgZyA8PCA4IHwgYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBz
dGF0aWMgdm9pZCBzZXRSR0IxNih1bnNpZ25lZCBzaG9ydCYgcG9zLCB1bnNpZ25lZCByLCB1bnNp
Z25lZCBnLCB1bnNpZ25lZCBiKQorICAgICAgICB7CisjaWYgSU1BR0VfTk9fQUxQSEFfVVNFX1JH
QjU1NQorICAgICAgICAgICAgcG9zID0gdW5zaWduZWQgc2hvcnQoKHIgPj4gMyA8PCAxMCkgfCAo
ZyA+PiAzIDw8IDUpIHwgKGIgPj4gMykpOworI2Vsc2UKKyAgICAgICAgICAgIHBvcyA9IHVuc2ln
bmVkIHNob3J0KChyID4+IDMgPDwgMTEpIHwgKGcgPj4gMiA8PCA1KSB8IChiID4+IDMpKTsKKyNl
bmRpZgorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIEltYWdlRnJhbWVTaW5rKiBjcmVhdGVJ
bnN0YW5jZShib29sIGNhbkZyZWVCdWZmZXIpOworICAgICAgICBzdGF0aWMgdm9pZCBkZWxldGVJ
bnN0YW5jZShJbWFnZUZyYW1lU2luayopOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBJbnRS
ZWN0IG1fcmVjdDsgICAgLy8gVGhlIHJlY3Qgb2YgdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBmcmFt
ZSB3aXRoaW4gdGhlIG92ZXJhbGwgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gVGhpcyB3aWxsIGFsd2F5cyBqdXN0IGJlIHRoZSBlbnRpcmUgYnVmZmVyIGV4Y2VwdCBmb3Ig
R0lGIGZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hvc2Ugb3JpZ2luYWwg
cmVjdCB3YXMgc21hbGxlciB0aGFuIHRoZSBvdmVyYWxsIGltYWdlIHNpemUuCisgICAgICAgIGlu
dCBtX2ltYWdlV2lkdGg7CisgICAgICAgIGludCBtX2J1ZmZlcldpZHRoOworICAgICAgICBpbnQg
bV9oZWlnaHQ7IC8vIFRoZSBoZWlnaHQgKHRoZSBudW1iZXIgb2Ygcm93cyB3ZSd2ZSBmdWxseSBk
ZWNvZGVkKS4KKyAgICAgICAgaW50IG1fZXhwZWN0ZWRIZWlnaHQ7CisgICAgICAgIFJHQkEzMkJ1
ZmZlcjo6RnJhbWVTdGF0dXMgbV9zdGF0dXM7IC8vIFdoZXRoZXIgb3Igbm90IHRoaXMgZnJhbWUg
aXMgY29tcGxldGVseSBmaW5pc2hlZCBkZWNvZGluZy4KKyAgICAgICAgUkdCQTMyQnVmZmVyOjpG
cmFtZURpc3Bvc2FsTWV0aG9kIG1fZGlzcG9zYWxNZXRob2Q7IC8vIFdoYXQgdG8gZG8gd2l0aCB0
aGlzIGZyYW1lJ3MgZGF0YSB3aGVuIGluaXRpYWxpemluZyB0aGUgbmV4dCBmcmFtZS4KKyAgICAg
ICAgdW5zaWduZWQgbV9kdXJhdGlvbjsgLy8gVGhlIGFuaW1hdGlvbiBkZWxheS4KKyAgICAgICAg
dW5zaWduZWQgc2hvcnQgbV90cmFuc3BhcmVudENvbG9yOyAvLyBwaXhlbCB2YWx1ZQorICAgICAg
ICBib29sIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7CisgICAgICAgIGJvb2wgbV9oYXNBbHBoYTsg
Ly8gV2hldGhlciBvciBub3QgYW55IG9mIHRoZSBwaXhlbHMgaW4gdGhlIGJ1ZmZlciBoYXZlIHRy
YW5zcGFyZW5jeS4KKyAgICAgICAgYm9vbCBtX2NhbkZyZWVCdWZmZXI7CisgICAgICAgIGJvb2wg
bV9zaG91bGRGcmVlQnVmZmVyOworICAgICAgICBib29sIG1fMTZiaXQ7CisgICAgICAgIGJvb2wg
bV9jb21wb3NpdGVkV2l0aFByZXZpb3VzRnJhbWU7CisjaWYgUExBVEZPUk0oV0lOQ0UpCisgICAg
ICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IG1fYm1wOworICAgICAgICB2b2lkIGZpbmlzaEJpdG1h
cCgpOworI2VuZGlmCisgICAgfTsKKworfQorCisjZW5kaWYgLy8gSU1BR0VfRlJBTUVfU0lOS19I
XwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUZyYW1l
U2lua1dpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFt
ZVNpbmtXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzNGY5
OAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1h
Z2VGcmFtZVNpbmtXaW5jZS5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxp
YnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkltYWdlRnJhbWVTaW5rLmgi
CisKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaWYg
SU1BR0VfTk9fQUxQSEFfVVNFX1JHQjU1NQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjb252ZXJ0
MTZUb1JHQih1bnNpZ25lZCBzaG9ydCBwaXhlbCkKK3sKKyAgICB1bnNpZ25lZCByID0gKHBpeGVs
ID4+IDcpICYgMHhGODsKKyAgICB1bnNpZ25lZCBnID0gKHBpeGVsID4+IDIpICYgMHhGODsKKyAg
ICB1bnNpZ25lZCBiID0gKHBpeGVsIDw8IDMpICYgMHhGODsKKyAgICByZXR1cm4gUkdCKHIsIGcs
IGIpOworfQorI2Vsc2UgLy8gUkdCNTY1CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNvbnZlcnQx
NlRvUkdCKHVuc2lnbmVkIHNob3J0IHBpeGVsKQoreworICAgIHVuc2lnbmVkIHIgPSAocGl4ZWwg
Pj4gOCkgJiAweEY4OworICAgIHVuc2lnbmVkIGcgPSAocGl4ZWwgPj4gMykgJiAweEZDOworICAg
IHVuc2lnbmVkIGIgPSAocGl4ZWwgPDwgMykgJiAweEY4OworICAgIHJldHVybiBSR0IociwgZywg
Yik7Cit9CisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCB2b2lkKiBJbWFn
ZUZyYW1lU2luazo6Ynl0ZXMoKSBjb25zdAoreworICAgIHJldHVybiBtX2JtcCA/IG1fYm1wLT5i
eXRlcygpIDogMDsKK30KKwordm9pZCogSW1hZ2VGcmFtZVNpbms6OmJ5dGVzKCkKK3sKKyAgICBy
ZXR1cm4gbV9ibXAgPyBtX2JtcC0+Ynl0ZXMoKSA6IDA7Cit9CisKK2Jvb2wgSW1hZ2VGcmFtZVNp
bms6OmFsbG9jYXRlQnVmZmVyKCkKK3sKKyAgICBmcmVlQnVmZmVyKCk7CisKKyAgICBpZiAobV9p
bWFnZVdpZHRoIDw9IDAgfHwgbV9leHBlY3RlZEhlaWdodCA8PSAwKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBpZiAobV8xNmJpdCkgeworICAgICAgICBtX2J1ZmZlcldpZHRoID0gbV9p
bWFnZVdpZHRoID4+IDEgPDwgMTsKKyAgICAgICAgaWYgKG1fYnVmZmVyV2lkdGggIT0gbV9pbWFn
ZVdpZHRoKQorICAgICAgICAgICAgbV9idWZmZXJXaWR0aCArPSAyOworICAgIH0gZWxzZQorICAg
ICAgICBtX2J1ZmZlcldpZHRoID0gbV9pbWFnZVdpZHRoOworCisgICAgTWVtb3J5QWxsb2NhdGlv
bkNhbkZhaWwgY2FuRmFpbDsKKworICAgIGlmIChtX2JtcCA9IFNoYXJlZEJpdG1hcDo6Y3JlYXRl
SW5zdGFuY2UobV8xNmJpdCwgbV9pbWFnZVdpZHRoLCBtX2V4cGVjdGVkSGVpZ2h0LCB0cnVlKSkg
eworICAgICAgICBtX2JtcC0+bG9jaygpOworICAgICAgICBtX2JtcC0+c2V0VmFsaWRIZWlnaHQo
MCk7CisgICAgICAgIGlmIChtXzE2Yml0ICYmIG1fdXNlc1RyYW5zcGFyZW50Q29sb3IgJiYgIW1f
Ym1wLT51c2VzVHJhbnNwYXJlbnRDb2xvcigpKQorICAgICAgICAgICAgbV9ibXAtPnNldFRyYW5z
cGFyZW50Q29sb3IoY29udmVydDE2VG9SR0IobV90cmFuc3BhcmVudENvbG9yKSk7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJbWFn
ZUZyYW1lU2luazo6aXNCdWZmZXJSZWFkeSgpIGNvbnN0IHsgcmV0dXJuICEhbV9ibXA7IH0KK3Zv
aWQgSW1hZ2VGcmFtZVNpbms6OmZyZWVCdWZmZXIoKQoreworICAgIGlmIChtX2JtcCkgeworICAg
ICAgICBpZiAoIW1fYm1wLT5oYXNPbmVSZWYoKSkKKyAgICAgICAgICAgIGZpbmlzaEJpdG1hcCgp
OworICAgICAgICBtX2JtcCA9IDA7CisgICAgfQorfQorCitOYXRpdmVJbWFnZVB0ciBJbWFnZUZy
YW1lU2luazo6Z2V0RnJhbWUoKQoreworICAgIGlmIChtX3N0YXR1cyA9PSBSR0JBMzJCdWZmZXI6
OkZyYW1lRW1wdHkgfHwgIW1fYm1wKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG1fYm1wLT5z
ZXRIYXNBbHBoYShoYXNBbHBoYSgpKTsKKyAgICBtX3Nob3VsZEZyZWVCdWZmZXIgPSBtX3N0YXR1
cyA9PSBSR0JBMzJCdWZmZXI6OkZyYW1lQ29tcGxldGU7CisgICAgaWYgKG1fY2FuRnJlZUJ1ZmZl
ciAmJiBtX3Nob3VsZEZyZWVCdWZmZXIpCisgICAgICAgIGZpbmlzaEJpdG1hcCgpOworCisgICAg
cmV0dXJuIG1fYm1wOworfQorCit2b2lkIEltYWdlRnJhbWVTaW5rOjpzZXRDYW5GcmVlQnVmZmVy
KGJvb2wgY2FuKQoreworICAgIG1fY2FuRnJlZUJ1ZmZlciA9IGNhbjsKKyAgICBpZiAobV9jYW5G
cmVlQnVmZmVyICYmIG1fc2hvdWxkRnJlZUJ1ZmZlcikKKyAgICAgICAgZmluaXNoQml0bWFwKCk7
Cit9CisKK3ZvaWQgSW1hZ2VGcmFtZVNpbms6OmZpbmlzaEJpdG1hcCgpCit7CisgICAgaWYgKG1f
Ym1wICYmIG1fYm1wLT5sb2NrZWQoKSkgeworICAgICAgICBtX2JtcC0+dW5sb2NrKCk7CisgICAg
ICAgIGlmIChtX3VzZXNUcmFuc3BhcmVudENvbG9yKQorICAgICAgICAgICAgbV9ibXAtPnNldFRy
YW5zcGFyZW50Q29sb3IoY29udmVydDE2VG9SR0IobV90cmFuc3BhcmVudENvbG9yKSk7CisgICAg
ICAgIGlmICghbV8xNmJpdCAmJiAoIW1faGFzQWxwaGEgfHwgbV91c2VzVHJhbnNwYXJlbnRDb2xv
cikpIHsKKyAgICAgICAgICAgIG1fYm1wLT5zZXRIYXNBbHBoYShmYWxzZSk7CisgICAgICAgICAg
ICBtXzE2Yml0ID0gbV9ibXAtPnRvMTZiaXQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV8x
NmJpdCkKKyAgICAgICAgICAgIHNldEhhc0FscGhhKGZhbHNlKTsKKyAgICAgICAgbV9ibXAtPnNl
dEhhc0FscGhhKGhhc0FscGhhKCkpOworICAgIH0KK307CisKK3ZvaWQgSW1hZ2VGcmFtZVNpbms6
OmVuc3VyZUhlaWdodChpbnQgcm93SW5kZXgpCit7CisgICAgaWYgKHJvd0luZGV4ID4gbV9oZWln
aHQpIHsKKyAgICAgICAgbV9oZWlnaHQgPSByb3dJbmRleDsKKyAgICAgICAgaWYgKG1fYm1wKQor
ICAgICAgICAgICAgbV9ibXAtPnNldFZhbGlkSGVpZ2h0KG1faGVpZ2h0KTsKKyAgICB9Cit9CisK
K0ltYWdlRnJhbWVTaW5rKiBJbWFnZUZyYW1lU2luazo6Y3JlYXRlSW5zdGFuY2UoYm9vbCBjYW5G
cmVlQnVmZmVyKQoreworICAgIHJldHVybiBuZXcgSW1hZ2VGcmFtZVNpbmsoY2FuRnJlZUJ1ZmZl
cik7Cit9CisKK3ZvaWQgSW1hZ2VGcmFtZVNpbms6OmRlbGV0ZUluc3RhbmNlKEltYWdlRnJhbWVT
aW5rKiBpKQoreworICAgIGRlbGV0ZSBpOworfQorCit9Cg==
</data>
<flag name="review"
          id="18015"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33817</attachid>
            <date>2009-07-30 13:14:16 -0700</date>
            <delta_ts>2009-08-08 13:12:31 -0700</delta_ts>
            <desc>5) MediaPlayer</desc>
            <filename>27511_5.patch</filename>
            <type>text/plain</type>
            <size>11342</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQ
cml2YXRlV2luY2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5
ZXJQcml2YXRlV2luY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjM4
YWRhCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9N
ZWRpYVBsYXllclByaXZhdGVXaW5jZS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
Q09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaWZuZGVmIE1lZGlhUGxheWVyUHJpdmF0ZVdpbmNlX2gKKyNkZWZpbmUg
TWVkaWFQbGF5ZXJQcml2YXRlV2luY2VfaAorCisjaWYgRU5BQkxFKFZJREVPKQorCisjaW5jbHVk
ZSAiTWVkaWFQbGF5ZXJQcml2YXRlLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlIDx3
dGYvT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIEdyYXBoaWNz
Q29udGV4dDsKKyAgICBjbGFzcyBJbnRTaXplOworICAgIGNsYXNzIEludFJlY3Q7CisgICAgY2xh
c3MgU3RyaW5nOworCisgICAgY2xhc3MgTWVkaWFQbGF5ZXJQcml2YXRlIDogcHVibGljIE1lZGlh
UGxheWVyUHJpdmF0ZUludGVyZmFjZSB7CisgICAgcHVibGljOgorICAgICAgICBzdGF0aWMgdm9p
ZCByZWdpc3Rlck1lZGlhRW5naW5lKE1lZGlhRW5naW5lUmVnaXN0cmFyKTsKKworICAgICAgICB+
TWVkaWFQbGF5ZXJQcml2YXRlKCk7CisKKyAgICAgICAgSW50U2l6ZSBuYXR1cmFsU2l6ZSgpIGNv
bnN0OworICAgICAgICBib29sIGhhc1ZpZGVvKCkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBsb2Fk
KGNvbnN0IFN0cmluZyYgdXJsKTsKKyAgICAgICAgdm9pZCBjYW5jZWxMb2FkKCk7CisKKyAgICAg
ICAgdm9pZCBwbGF5KCk7CisgICAgICAgIHZvaWQgcGF1c2UoKTsKKworICAgICAgICBib29sIHBh
dXNlZCgpIGNvbnN0OworICAgICAgICBib29sIHNlZWtpbmcoKSBjb25zdDsKKworICAgICAgICBm
bG9hdCBkdXJhdGlvbigpIGNvbnN0OworICAgICAgICBmbG9hdCBjdXJyZW50VGltZSgpIGNvbnN0
OworICAgICAgICB2b2lkIHNlZWsoZmxvYXQgdGltZSk7CisgICAgICAgIHZvaWQgc2V0RW5kVGlt
ZShmbG9hdCk7CisKKyAgICAgICAgdm9pZCBzZXRSYXRlKGZsb2F0KTsKKyAgICAgICAgdm9pZCBz
ZXRWb2x1bWUoZmxvYXQpOworCisgICAgICAgIGludCBkYXRhUmF0ZSgpIGNvbnN0OworCisgICAg
ICAgIE1lZGlhUGxheWVyOjpOZXR3b3JrU3RhdGUgbmV0d29ya1N0YXRlKCkgY29uc3QgeyByZXR1
cm4gbV9uZXR3b3JrU3RhdGU7IH0KKyAgICAgICAgTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgcmVh
ZHlTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcmVhZHlTdGF0ZTsgfQorCisgICAgICAgIGZsb2F0
IG1heFRpbWVCdWZmZXJlZCgpIGNvbnN0OworICAgICAgICBmbG9hdCBtYXhUaW1lU2Vla2FibGUo
KSBjb25zdDsKKyAgICAgICAgdW5zaWduZWQgYnl0ZXNMb2FkZWQoKSBjb25zdDsKKyAgICAgICAg
Ym9vbCB0b3RhbEJ5dGVzS25vd24oKSBjb25zdDsKKyAgICAgICAgdW5zaWduZWQgdG90YWxCeXRl
cygpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0VmlzaWJsZShib29sKTsKKyAgICAgICAgdm9p
ZCBzZXRTaXplKGNvbnN0IEludFNpemUmKTsKKworICAgICAgICB2b2lkIGxvYWRTdGF0ZUNoYW5n
ZWQoKTsKKyAgICAgICAgdm9pZCBkaWRFbmQoKTsKKworICAgICAgICB2b2lkIHBhaW50KEdyYXBo
aWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIE1l
ZGlhUGxheWVyUHJpdmF0ZShNZWRpYVBsYXllciopOworCisgICAgICAgIHZvaWQgdXBkYXRlU3Rh
dGVzKCk7CisgICAgICAgIHZvaWQgZG9TZWVrKCk7CisgICAgICAgIHZvaWQgY2FuY2VsU2Vlaygp
OworICAgICAgICB2b2lkIHNlZWtUaW1lckZpcmVkKFRpbWVyPE1lZGlhUGxheWVyUHJpdmF0ZT4q
KTsKKyAgICAgICAgZmxvYXQgbWF4VGltZUxvYWRlZCgpIGNvbnN0OworICAgICAgICB2b2lkIHNh
d1Vuc3VwcG9ydGVkVHJhY2tzKCk7CisjaWYgRU5BQkxFKFBMVUdJTl9QUk9YWV9GT1JfVklERU8p
CisgICAgICAgIHZvaWQgc2V0TWVkaWFQbGF5ZXJQcm94eShXZWJNZWRpYVBsYXllclByb3h5Kik7
CisgICAgICAgIHZvaWQgc2V0UG9zdGVyKGNvbnN0IFN0cmluZyYgdXJsKTsKKyAgICAgICAgdm9p
ZCBkZWxpdmVyTm90aWZpY2F0aW9uKE1lZGlhUGxheWVyUHJveHlOb3RpZmljYXRpb25UeXBlKTsK
KyNlbmRpZgorCisgICAgICAgIC8vIGVuZ2luZSBzdXBwb3J0CisgICAgICAgIHN0YXRpYyBNZWRp
YVBsYXllclByaXZhdGVJbnRlcmZhY2UqIGNyZWF0ZShNZWRpYVBsYXllciopOworICAgICAgICBz
dGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWRUeXBlcyhIYXNoU2V0PFN0cmluZz4mIHR5cGVzKTsKKyAg
ICAgICAgc3RhdGljIE1lZGlhUGxheWVyOjpTdXBwb3J0c1R5cGUgc3VwcG9ydHNUeXBlKGNvbnN0
IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBjb2RlY3MpOworICAgICAgICBzdGF0aWMgYm9v
bCBpc0F2YWlsYWJsZSgpOworCisgICAgICAgIE1lZGlhUGxheWVyKiBtX3BsYXllcjsKKyAgICAg
ICAgZmxvYXQgbV9zZWVrVG87CisgICAgICAgIGZsb2F0IG1fZW5kVGltZTsKKyAgICAgICAgVGlt
ZXI8TWVkaWFQbGF5ZXJQcml2YXRlPiBtX3NlZWtUaW1lcjsKKyAgICAgICAgTWVkaWFQbGF5ZXI6
Ok5ldHdvcmtTdGF0ZSBtX25ldHdvcmtTdGF0ZTsKKyAgICAgICAgTWVkaWFQbGF5ZXI6OlJlYWR5
U3RhdGUgbV9yZWFkeVN0YXRlOworICAgICAgICB1bnNpZ25lZCBtX2VuYWJsZWRUcmFja0NvdW50
OworICAgICAgICB1bnNpZ25lZCBtX3RvdGFsVHJhY2tDb3VudDsKKyAgICAgICAgYm9vbCBtX2hh
c1Vuc3VwcG9ydGVkVHJhY2tzOworICAgICAgICBib29sIG1fc3RhcnRlZFBsYXlpbmc7CisgICAg
ICAgIGJvb2wgbV9pc1N0cmVhbWluZzsKKyNpZiBFTkFCTEUoUExVR0lOX1BST1hZX0ZPUl9WSURF
TykKKyAgICAgICAgV2ViTWVkaWFQbGF5ZXJQcm94eSogbV9wcm94eTsKKyNlbmRpZgorICAgIH07
CisKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9NZWRpYVBsYXllclByb3h5LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcm94eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uOGM5MmQ0MAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcm94eS5jcHAKQEAgLTAsMCArMSwxNDUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICovCisKKyNpZiBFTkFCTEUoVklERU8pCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJNZWRpYVBsYXllclByb3h5LmgiCisKKyNpbmNsdWRlICJEb2N1bWVudExv
YWRlci5oIgorI2luY2x1ZGUgIkhUTUxQbHVnSW5FbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFZp
ZGVvRWxlbWVudC5oIgorI2luY2x1ZGUgIkpTRE9NQmluZGluZy5oIgorI2luY2x1ZGUgIkpTUGx1
Z2luRWxlbWVudEZ1bmN0aW9ucy5oIgorI2luY2x1ZGUgIk1lZGlhUGxheWVyLmgiCisjaW5jbHVk
ZSAiTm9kZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiUGx1Z2lu
Vmlldy5oIgorI2luY2x1ZGUgIlJlbmRlclBhcnRPYmplY3QuaCIKKyNpbmNsdWRlICJSZW5kZXJX
aWRnZXQuaCIKKyNpbmNsdWRlICJXaWRnZXQuaCIKKyNpbmNsdWRlICJjX2NsYXNzLmgiCisjaW5j
bHVkZSAiY19pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNfcnVudGltZS5oIgorI2luY2x1ZGUgIm5w
cnVudGltZV9pbXBsLmgiCisjaW5jbHVkZSAicnVudGltZS5oIgorI2luY2x1ZGUgPHJ1bnRpbWUv
SWRlbnRpZmllci5oPgorCit1c2luZyBuYW1lc3BhY2UgSlNDOworbmFtZXNwYWNlIFdlYkNvcmUg
eworCit1c2luZyBuYW1lc3BhY2UgQmluZGluZ3M7Cit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVz
OworCitXZWJNZWRpYVBsYXllclByb3h5OjpXZWJNZWRpYVBsYXllclByb3h5KE1lZGlhUGxheWVy
KiBwbGF5ZXIpCis6IG1fbWVkaWFQbGF5ZXIocGxheWVyKQorLCBtX2luaXQoZmFsc2UpCissIG1f
aGFzU2VudFJlc3BvbnNlVG9QbHVnaW4oZmFsc2UpCit7CisgICAgaWYgKCFtX2luaXQpCisgICAg
ICAgIGluaXRFbmdpbmUoKTsKK30KKworV2ViTWVkaWFQbGF5ZXJQcm94eTo6fldlYk1lZGlhUGxh
eWVyUHJveHkoKQoreworICAgIG1faW5zdGFuY2UucmVsZWFzZSgpOworfQorU2NyaXB0SW5zdGFu
Y2UgV2ViTWVkaWFQbGF5ZXJQcm94eTo6cGx1Z2luSW5zdGFuY2UoKQoreworICAgIGlmICghbV9p
bnN0YW5jZSkgeworICAgICAgICBSZW5kZXJPYmplY3QqIHIgPSBlbGVtZW50KCktPnJlbmRlcmVy
KCk7CisgICAgICAgIGlmICghciB8fCAhci0+aXNXaWRnZXQoKSkKKyAgICAgICAgICAgIHJldHVy
biAwOworCisgICAgICAgIEZyYW1lKiBmcmFtZSA9IGVsZW1lbnQoKS0+ZG9jdW1lbnQoKS0+ZnJh
bWUoKTsKKworICAgICAgICBSZW5kZXJXaWRnZXQqIHJlbmRlcldpZGdldCA9IHN0YXRpY19jYXN0
PFJlbmRlcldpZGdldCo+KGVsZW1lbnQoKS0+cmVuZGVyZXIoKSk7CisgICAgICAgIGlmIChyZW5k
ZXJXaWRnZXQgJiYgcmVuZGVyV2lkZ2V0LT53aWRnZXQoKSkKKyAgICAgICAgICAgIG1faW5zdGFu
Y2UgPSBmcmFtZS0+c2NyaXB0KCktPmNyZWF0ZVNjcmlwdEluc3RhbmNlRm9yV2lkZ2V0KHJlbmRl
cldpZGdldC0+d2lkZ2V0KCkpOworICAgIH0KKworICAgIHJldHVybiBtX2luc3RhbmNlOworfQor
dm9pZCBXZWJNZWRpYVBsYXllclByb3h5Ojpsb2FkKGNvbnN0IFN0cmluZyYgdXJsKQoreworICAg
IGlmICghbV9pbml0KQorICAgICAgICBpbml0RW5naW5lKCk7CisgICAgaWYgKG1faW5pdCkKKyAg
ICAgICAgaW52b2tlTWV0aG9kKCJwbGF5Iik7Cit9Cit2b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6
OmluaXRFbmdpbmUoKQoreworICAgIEhUTUxNZWRpYUVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNf
Y2FzdDxIVE1MTWVkaWFFbGVtZW50Kj4obV9tZWRpYVBsYXllci0+bWVkaWFQbGF5ZXJDbGllbnQo
KSk7CisgICAgVmVjdG9yPFN0cmluZz4gcGFyYW1OYW1lczsKKyAgICBWZWN0b3I8U3RyaW5nPiBw
YXJhbVZhbHVlczsKKyAgICBTdHJpbmcgc2VydmljZVR5cGU7CisgICAgU3RyaW5nIHVybCA9IGVs
ZW1lbnQtPmluaXRpYWxVUkwoKTsKKworICAgIGlmICh1cmwuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBGcmFtZSogZnJhbWUgPSBlbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgp
OworCisgICAgLy8gYWRkIGFsbCBhdHRyaWJ1dGVzIHNldCBvbiB0aGUgZW1iZWQgb2JqZWN0Cisg
ICAgTmFtZWROb2RlTWFwKiBhID0gZWxlbWVudC0+YXR0cmlidXRlcygpOworICAgIGlmIChhKSB7
CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhLT5sZW5ndGgoKTsgKytpKSB7Cisg
ICAgICAgICAgICBBdHRyaWJ1dGUqIGl0ID0gYS0+YXR0cmlidXRlSXRlbShpKTsKKyAgICAgICAg
ICAgIHBhcmFtTmFtZXMuYXBwZW5kKGl0LT5uYW1lKCkubG9jYWxOYW1lKCkuc3RyaW5nKCkpOwor
ICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYXBwZW5kKGl0LT52YWx1ZSgpLnN0cmluZygpKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICBzZXJ2aWNlVHlwZSA9ICJhcHBsaWNhdGlvbi94LW1wbGF5ZXIy
IjsKKyAgICBmcmFtZS0+bG9hZGVyKCktPnJlcXVlc3RPYmplY3Qoc3RhdGljX2Nhc3Q8UmVuZGVy
UGFydE9iamVjdCo+KGVsZW1lbnQtPnJlbmRlcmVyKCkpLCB1cmwsIG51bGxBdG9tLCBzZXJ2aWNl
VHlwZSwgcGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMpOworICAgIG1faW5pdCA9IHRydWU7CisgICAg
cGFyYW1OYW1lcy5jbGVhcigpOworICAgIHBhcmFtVmFsdWVzLmNsZWFyKCk7CisKK30KKworSFRN
TE1lZGlhRWxlbWVudCogV2ViTWVkaWFQbGF5ZXJQcm94eTo6ZWxlbWVudCgpCit7CisgICAgcmV0
dXJuIHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1lbnQqPihtX21lZGlhUGxheWVyLT5tZWRpYVBs
YXllckNsaWVudCgpKTsKKworfQorCit2b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6Omludm9rZU1l
dGhvZChjb25zdCBTdHJpbmcmIG1ldGhvZE5hbWUpCit7CisgICAgRnJhbWUqIGZyYW1lID0gZWxl
bWVudCgpLT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAgIFJvb3RPYmplY3QgKnJvb3QgPSBmcmFt
ZS0+c2NyaXB0KCktPmJpbmRpbmdSb290T2JqZWN0KCk7CisgICAgaWYgKCFyb290KQorICAgICAg
ICByZXR1cm47CisgICAgRXhlY1N0YXRlICpleGVjID0gcm9vdC0+Z2xvYmFsT2JqZWN0KCktPmds
b2JhbEV4ZWMoKTsKKyAgICBJbnN0YW5jZSogaW5zdGFuY2UgPSBwbHVnaW5JbnN0YW5jZSgpLmdl
dCgpOworICAgIGlmICghaW5zdGFuY2UpCisgICAgICAgIHJldHVybjsKKworICAgIGluc3RhbmNl
LT5iZWdpbigpOworICAgIENsYXNzICphQ2xhc3MgPSBpbnN0YW5jZS0+Z2V0Q2xhc3MoKTsKKyAg
ICBJZGVudGlmaWVyIGlkZW4oZXhlYywgbWV0aG9kTmFtZSk7CisgICAgTWV0aG9kTGlzdCBtZXRo
b2RMaXN0ID0gYUNsYXNzLT5tZXRob2RzTmFtZWQoaWRlbiwgaW5zdGFuY2UpOworICAgIEFyZ0xp
c3QgYXJnczsKKyAgICAvKkpTVmFsdWVQdHIgcmVzdWx0ID0qLworICAgIGluc3RhbmNlLT5pbnZv
a2VNZXRob2QoZXhlYywgbWV0aG9kTGlzdCAsIGFyZ3MpOworICAgIGluc3RhbmNlLT5lbmQoKTsK
K30KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvTWVkaWFQbGF5ZXJQcm94eS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9NZWRpYVBsYXllclByb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
Y2Y2ZWQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvTWVkaWFQbGF5ZXJQcm94eS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAg
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUg
dG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICov
CisKKworI2lmbmRlZiBNZWRpYVBsYXllclByb3h5X2gKKyNkZWZpbmUgTWVkaWFQbGF5ZXJQcm94
eV9oCisKKyNpbmNsdWRlICJTY3JpcHRJbnN0YW5jZS5oIgorCisjaWYgRU5BQkxFKFZJREVPKQor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBJbnRSZWN0OworICAgIGNsYXNzIElu
dFNpemU7CisgICAgY2xhc3MgU3RyaW5nOworICAgIGNsYXNzIE1lZGlhUGxheWVyOworICAgIGNs
YXNzIFBsdWdpblZpZXc7CisgICAgY2xhc3MgSFRNTE1lZGlhRWxlbWVudDsKKworICAgIGVudW0g
TWVkaWFQbGF5ZXJQcm94eU5vdGlmaWNhdGlvblR5cGUgeworICAgICAgICBNZWRpYVBsYXllck5v
dGlmaWNhdGlvblBsYXlQYXVzZUJ1dHRvblByZXNzZWQsCisgICAgICAgIElkbGUsCisgICAgICAg
IExvYWRpbmcsCisgICAgICAgIExvYWRlZCwKKyAgICAgICAgRm9ybWF0RXJyb3IsCisgICAgICAg
IE5ldHdvcmtFcnJvciwKKyAgICAgICAgRGVjb2RlRXJyb3IKKyAgICB9OworCisgICAgY2xhc3Mg
V2ViTWVkaWFQbGF5ZXJQcm94eSB7CisgICAgcHVibGljOgorICAgICAgICBXZWJNZWRpYVBsYXll
clByb3h5KE1lZGlhUGxheWVyKiBwbGF5ZXIpOworICAgICAgICB+V2ViTWVkaWFQbGF5ZXJQcm94
eSgpOworCisgICAgICAgIE1lZGlhUGxheWVyKiBtZWRpYVBsYXllcigpIHtyZXR1cm4gbV9tZWRp
YVBsYXllcjt9CisgICAgICAgIHZvaWQgaW5pdEVuZ2luZSgpOworICAgICAgICB2b2lkIGxvYWQo
Y29uc3QgU3RyaW5nJiB1cmwpOworICAgICAgICBIVE1MTWVkaWFFbGVtZW50KiBlbGVtZW50KCk7
CisgICAgICAgIHZvaWQgaW52b2tlTWV0aG9kKGNvbnN0IFN0cmluZyYgbWV0aG9kTmFtZSk7Cisg
ICAgICAgIFNjcmlwdEluc3RhbmNlIHBsdWdpbkluc3RhbmNlKCk7CisKKyAgICBwcml2YXRlOgor
ICAgICAgICBNZWRpYVBsYXllciogbV9tZWRpYVBsYXllcjsKKyAgICAgICAgYm9vbCBtX2luaXQ7
CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXcqIG1fcGx1Z2luVmlldzsKKyAgICAgICAgYm9v
bCBtX2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luOworICAgICAgICBTY3JpcHRJbnN0YW5jZSBtX2lu
c3RhbmNlOworICAgIH07CisKK30KKyNlbmRpZiAvLyBFTkFCTEUoVklERU8pCisKKyNlbmRpZgo=
</data>
<flag name="review"
          id="18016"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33818</attachid>
            <date>2009-07-30 13:14:46 -0700</date>
            <delta_ts>2009-08-08 13:12:31 -0700</delta_ts>
            <desc>6) Path</desc>
            <filename>27511_6.patch</filename>
            <type>text/plain</type>
            <size>35541</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbmNlLmNw
cCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbmNlLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmRhYjljCi0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwCkBAIC0wLDAgKzEs
MTU2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5j
LgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICog
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGF0aC5oIgorCisj
aW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNs
dWRlICJQbGF0Zm9ybVBhdGhXaW5jZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisj
aW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGF0aDo6UGF0aCgpCis6IG1fcGF0aChuZXcgUGxh
dGZvcm1QYXRoKCkpCit7Cit9CisKK1BhdGg6On5QYXRoKCkKK3sKKyAgICBkZWxldGUgbV9wYXRo
OworfQorCitQYXRoOjpQYXRoKGNvbnN0IFBhdGgmIG90aGVyKQorOiBtX3BhdGgobmV3IFBsYXRm
b3JtUGF0aCgqb3RoZXIubV9wYXRoKSkKK3sKK30KKworUGF0aCYgUGF0aDo6b3BlcmF0b3I9KGNv
bnN0IFBhdGgmIG90aGVyKQoreworICAgIG1fcGF0aCA9IG5ldyBQbGF0Zm9ybVBhdGgoKm90aGVy
Lm1fcGF0aCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIFBhdGg6OmNvbnRhaW5zKGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAoreworICAgIHJldHVy
biBtX3BhdGgtPmNvbnRhaW5zKHBvaW50LCBydWxlKTsKK30KKwordm9pZCBQYXRoOjp0cmFuc2xh
dGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIG1fcGF0aC0+dHJhbnNsYXRlKHNpemUp
OworfQorCitGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9wYXRoLT5ib3VuZGluZ1JlY3QoKTsKK30KKwordm9pZCBQYXRoOjptb3ZlVG8oY29uc3Qg
RmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgbV9wYXRoLT5tb3ZlVG8ocG9pbnQpOworfQorCit2
b2lkIFBhdGg6OmFkZExpbmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBtX3Bh
dGgtPmFkZExpbmVUbyhwb2ludCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkUXVhZEN1cnZlVG8oY29u
c3QgRmxvYXRQb2ludCYgY3AsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgbV9wYXRoLT5h
ZGRRdWFkQ3VydmVUbyhjcCwgcCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQmV6aWVyQ3VydmVUbyhj
b25zdCBGbG9hdFBvaW50JiBjcDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNwMiwgY29uc3QgRmxvYXRQ
b2ludCYgcCkKK3sKKyAgICBtX3BhdGgtPmFkZEJlemllckN1cnZlVG8oY3AxLCBjcDIsIHApOwor
fQorCit2b2lkIFBhdGg6OmFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmIHAxLCBjb25zdCBGbG9h
dFBvaW50JiBwMiwgZmxvYXQgcmFkaXVzKQoreworICAgIG1fcGF0aC0+YWRkQXJjVG8ocDEsIHAy
LCByYWRpdXMpOworfQorCit2b2lkIFBhdGg6OmNsb3NlU3VicGF0aCgpCit7CisgICAgbV9wYXRo
LT5jbG9zZVN1YnBhdGgoKTsKK30KKwordm9pZCBQYXRoOjphZGRBcmMoY29uc3QgRmxvYXRQb2lu
dCYgcCwgZmxvYXQgciwgZmxvYXQgc2FyLCBmbG9hdCBlYXIsIGJvb2wgYW50aWNsb2Nrd2lzZSkK
K3sKKyAgICBtX3BhdGgtPmFkZEVsbGlwc2UocCwgciwgciwgc2FyLCBlYXIsIGFudGljbG9ja3dp
c2UpOworfQorCit2b2lkIFBhdGg6OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQoreworICAg
IG1fcGF0aC0+YWRkUmVjdChyKTsKK30KKwordm9pZCBQYXRoOjphZGRFbGxpcHNlKGNvbnN0IEZs
b2F0UmVjdCYgcikKK3sKKyAgICBGbG9hdFNpemUgcmFkaXVzKHIud2lkdGgoKSAqIDAuNSwgci5o
ZWlnaHQoKSAqIDAuNSk7CisgICAgbV9wYXRoLT5hZGRFbGxpcHNlKHIpOworfQorCit2b2lkIFBh
dGg6OmNsZWFyKCkKK3sKKyAgICBtX3BhdGgtPmNsZWFyKCk7Cit9CisKK2Jvb2wgUGF0aDo6aXNF
bXB0eSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+aXNFbXB0eSgpOworfQorCitTdHJp
bmcgUGF0aDo6ZGVidWdTdHJpbmcoKSBjb25zdAoreworICAgIHJldHVybiBtX3BhdGgtPmRlYnVn
U3RyaW5nKCk7Cit9CisKK3ZvaWQgUGF0aDo6YXBwbHkodm9pZCogaW5mbywgUGF0aEFwcGxpZXJG
dW5jdGlvbiBmdW5jdGlvbikgY29uc3QKK3sKKyAgICBtX3BhdGgtPmFwcGx5KGluZm8sIGZ1bmN0
aW9uKTsKK30KKwordm9pZCBQYXRoOjp0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRy
aXgmIHQpCit7CisgICAgbV9wYXRoLT50cmFuc2Zvcm0odCk7Cit9CisKK0Zsb2F0UmVjdCBQYXRo
OjpzdHJva2VCb3VuZGluZ1JlY3QoU3Ryb2tlU3R5bGVBcHBsaWVyICopCit7CisgICAgbm90SW1w
bGVtZW50ZWQoKTsKKyAgICByZXR1cm4gRmxvYXRSZWN0KCk7Cit9CisKK2Jvb2wgUGF0aDo6c3Ry
b2tlQ29udGFpbnMoU3Ryb2tlU3R5bGVBcHBsaWVyKiwgY29uc3QgRmxvYXRQb2ludCYpIGNvbnN0
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wg
UGF0aDo6aGFzQ3VycmVudFBvaW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gIWlzRW1wdHkoKTsK
K30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0
Zm9ybVBhdGhXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRm
b3JtUGF0aFdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzg5
NjRhCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Q
bGF0Zm9ybVBhdGhXaW5jZS5jcHAKQEAgLTAsMCArMSw4MDMgQEAKKy8qCisgKiAgQ29weXJpZ2h0
IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
IEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVBhdGhXaW5jZS5oIgorCisjaW5jbHVkZSAiRmxv
YXRSZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiUGF0aC5o
IgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25N
YXRyaXguaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gSW1wbGVtZW50ZWQgaW4gR3JhcGhpY3NDb250
ZXh0V2luY2UuY3BwCit2b2lkIGdldEVsbGlwc2VQb2ludEJ5QW5nbGUoZG91YmxlIGFuZ2xlLCBk
b3VibGUgYSwgZG91YmxlIGIsIGZsb2F0JiB4LCBmbG9hdCYgeSk7CisKK3N0YXRpYyB2b2lkIHF1
YWRDdXJ2ZShpbnQgc2VnbWVudHMsIFZlY3RvcjxQYXRoUG9pbnQ+JiBwdHMsIGNvbnN0IFBhdGhQ
b2ludCogY29udHJvbCkKK3sKKyAgICBjb25zdCBmbG9hdCBzdGVwID0gMS4wIC8gc2VnbWVudHM7
CisgICAgcmVnaXN0ZXIgZmxvYXQgdEEgPSAwLjA7CisgICAgcmVnaXN0ZXIgZmxvYXQgdEIgPSAx
LjA7CisKKyAgICBmbG9hdCBjMXggPSBjb250cm9sWzBdLngoKTsKKyAgICBmbG9hdCBjMXkgPSBj
b250cm9sWzBdLnkoKTsKKyAgICBmbG9hdCBjMnggPSBjb250cm9sWzFdLngoKTsKKyAgICBmbG9h
dCBjMnkgPSBjb250cm9sWzFdLnkoKTsKKyAgICBmbG9hdCBjM3ggPSBjb250cm9sWzJdLngoKTsK
KyAgICBmbG9hdCBjM3kgPSBjb250cm9sWzJdLnkoKTsKKworICAgIGNvbnN0IGludCBvZmZzZXQg
PSBwdHMuc2l6ZSgpOworICAgIHB0cy5yZXNpemUob2Zmc2V0ICsgc2VnbWVudHMpOworICAgIFBh
dGhQb2ludCBwcDsKKyAgICBwcC5tX3ggPSBjMXg7CisgICAgcHAubV95ID0gYzF5OworCisgICAg
Zm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50czsgKytpKSB7CisgICAgICAgIHRBICs9IHN0ZXA7
CisgICAgICAgIHRCIC09IHN0ZXA7CisKKyAgICAgICAgY29uc3QgZmxvYXQgYSA9IHRCICogdEI7
CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAyLjAgKiB0QSAqIHRCOworICAgICAgICBjb25zdCBm
bG9hdCBjID0gdEEgKiB0QTsKKworICAgICAgICBwcC5tX3ggPSBjMXggKiBhICsgYzJ4ICogYiAr
IGMzeCAqIGM7CisgICAgICAgIHBwLm1feSA9IGMxeSAqIGEgKyBjMnkgKiBiICsgYzN5ICogYzsK
KworICAgICAgICBwdHNbb2Zmc2V0ICsgaSAtIDFdID0gcHA7CisgICAgfQorCisgICAgcHAubV94
ID0gYzN4OworICAgIHBwLm1feSA9IGMzeTsKKyAgICBwdHNbb2Zmc2V0ICsgc2VnbWVudHMgLSAx
XSA9IHBwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmV6aWVyKGludCBzZWdtZW50cywgVmVj
dG9yPFBhdGhQb2ludD4mIHB0cywgY29uc3QgUGF0aFBvaW50KiBjb250cm9sKQoreworICAgIGNv
bnN0IGZsb2F0IHN0ZXAgPSAxLjAgLyBzZWdtZW50czsKKyAgICByZWdpc3RlciBmbG9hdCB0QSA9
IDAuMDsKKyAgICByZWdpc3RlciBmbG9hdCB0QiA9IDEuMDsKKworICAgIGZsb2F0IGMxeCA9IGNv
bnRyb2xbMF0ueCgpOworICAgIGZsb2F0IGMxeSA9IGNvbnRyb2xbMF0ueSgpOworICAgIGZsb2F0
IGMyeCA9IGNvbnRyb2xbMV0ueCgpOworICAgIGZsb2F0IGMyeSA9IGNvbnRyb2xbMV0ueSgpOwor
ICAgIGZsb2F0IGMzeCA9IGNvbnRyb2xbMl0ueCgpOworICAgIGZsb2F0IGMzeSA9IGNvbnRyb2xb
Ml0ueSgpOworICAgIGZsb2F0IGM0eCA9IGNvbnRyb2xbM10ueCgpOworICAgIGZsb2F0IGM0eSA9
IGNvbnRyb2xbM10ueSgpOworCisgICAgY29uc3QgaW50IG9mZnNldCA9IHB0cy5zaXplKCk7Cisg
ICAgcHRzLnJlc2l6ZShvZmZzZXQgKyBzZWdtZW50cyk7CisgICAgUGF0aFBvaW50IHBwOworICAg
IHBwLm1feCA9IGMxeDsKKyAgICBwcC5tX3kgPSBjMXk7CisKKyAgICBmb3IgKGludCBpID0gMTsg
aSA8IHNlZ21lbnRzOyArK2kpIHsKKyAgICAgICAgdEEgKz0gc3RlcDsKKyAgICAgICAgdEIgLT0g
c3RlcDsKKyAgICAgICAgY29uc3QgZmxvYXQgdEFzcSA9IHRBICogdEE7CisgICAgICAgIGNvbnN0
IGZsb2F0IHRCc3EgPSB0QiAqIHRCOworCisgICAgICAgIGNvbnN0IGZsb2F0IGEgPSB0QnNxICog
dEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAzLjAgKiB0QSAqIHRCc3E7CisgICAgICAgIGNv
bnN0IGZsb2F0IGMgPSAzLjAgKiB0QiAqIHRBc3E7CisgICAgICAgIGNvbnN0IGZsb2F0IGQgPSB0
QXNxICogdEE7CisKKyAgICAgICAgcHAubV94ID0gYzF4ICogYSArIGMyeCAqIGIgKyBjM3ggKiBj
ICsgYzR4ICogZDsKKyAgICAgICAgcHAubV95ID0gYzF5ICogYSArIGMyeSAqIGIgKyBjM3kgKiBj
ICsgYzR5ICogZDsKKworICAgICAgICBwdHNbb2Zmc2V0ICsgaSAtIDFdID0gcHA7CisgICAgfQor
CisgICAgcHAubV94ID0gYzR4OworICAgIHBwLm1feSA9IGM0eTsKKyAgICBwdHNbb2Zmc2V0ICsg
c2VnbWVudHMgLSAxXSA9IHBwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdGFibGVSb3VuZChk
b3VibGUgZCkKK3sKKyAgICBpZiAoZCA+IDApCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxp
bnQ+KGQgKyAwLjUpOworCisgICAgaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGQpOworICAgIHJl
dHVybiBpIC0gZCA+IDAuNSA/IGkgLSAxIDogaTsKK30KKworc3RhdGljIGJvb2wgY29udGFpbnNQ
b2ludChjb25zdCBGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgcmV0
dXJuIHAueCgpID49IHIueCgpICYmIHAueSgpID49IHIueSgpICYmIHAueCgpIDwgci5yaWdodCgp
ICYmIHAueSgpIDwgci5ib3R0b20oKTsKK30KKworI2RlZmluZSBQSSAgICAgICAgMy4xNDE1OTI2
NTM1ODk3OTMyMzg0NgorCitzdGF0aWMgdm9pZCBub3JtYWxpemVBbmdsZShmbG9hdCYgYW5nbGUp
Cit7CisgICAgd2hpbGUgKGFuZ2xlIDwgMCkKKyAgICAgICAgYW5nbGUgKz0gMiAqIFBJOworICAg
IHdoaWxlIChhbmdsZSA+PSAyICogUEkpCisgICAgICAgIGFuZ2xlIC09IDIgKiBQSTsKKyAgICBp
ZiAoYW5nbGUgPCAwLjAwMDAxKQorICAgICAgICBhbmdsZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lk
IHRyYW5zZm9ybUFyY1BvaW50KGZsb2F0JiB4LCBmbG9hdCYgeSwgY29uc3QgRmxvYXRQb2ludCYg
YykKK3sKKyAgICB4ICs9IGMueCgpOworICAgIHkgKz0gYy55KCk7Cit9CisKK3N0YXRpYyB2b2lk
IGluZmxhdGVSZWN0VG9Db250YWluUG9pbnQoRmxvYXRSZWN0JiByLCBmbG9hdCB4LCBmbG9hdCB5
KQoreworICAgIGlmIChyLmlzRW1wdHkoKSkgeworICAgICAgICByLnNldFgoeCk7CisgICAgICAg
IHIuc2V0WSh5KTsKKyAgICAgICAgci5zZXRTaXplKEZsb2F0U2l6ZSgxLCAxKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgaWYgKHggPCByLngoKSkgeworICAgICAgICByLnNldFdpZHRo
KHIucmlnaHQoKSAtIHgpOworICAgICAgICByLnNldFgoeCk7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgZmxvYXQgdyA9IHggLSByLngoKSArIDE7CisgICAgICAgIGlmICh3ID4gci53aWR0aCgpKQor
ICAgICAgICAgICAgci5zZXRXaWR0aCh3KTsKKyAgICB9CisgICAgaWYgKHkgPCByLnkoKSkgewor
ICAgICAgICByLnNldEhlaWdodChyLmJvdHRvbSgpIC0geSk7CisgICAgICAgIHIuc2V0WSh5KTsK
KyAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCBoID0gIHkgLSByLnkoKSArIDE7CisgICAgICAg
IGlmIChoID4gci5oZWlnaHQoKSkKKyAgICAgICAgICAgIHIuc2V0SGVpZ2h0KGgpOworICAgIH0K
K30KKworLy8gcmV0dXJuIDAtYmFzZWQgdmFsdWU6IDAgLSBmaXJzdCBRdWFkcmFudCAoIDAgLSA5
MCBkZWdyZWUpCitzdGF0aWMgaW5saW5lIGludCBxdWFkcmFudChjb25zdCBQYXRoUG9pbnQmIHBv
aW50LCBjb25zdCBQYXRoUG9pbnQmIG9yaWdQb2ludCkKK3sKKyAgICByZXR1cm4gcG9pbnQubV94
IDwgb3JpZ1BvaW50Lm1feCA/CisgICAgICAgIChwb2ludC5tX3kgPCBvcmlnUG9pbnQubV95ID8g
MiA6IDEpCisgICAgICAgIDogKHBvaW50Lm1feSA8IG9yaWdQb2ludC5tX3kgPyAzIDogMCk7Cit9
CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25MZWZ0KGludCBxKSB7IHJldHVybiBx
ID09IDEgfHwgcSA9PSAyOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgaXNRdWFkcmFudE9uUmlnaHQo
aW50IHEpIHsgcmV0dXJuIHEgPT0gMCB8fCBxID09IDM7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBp
c1F1YWRyYW50T25Ub3AoaW50IHEpIHsgcmV0dXJuIHEgPT0gMiB8fCBxID09IDM7IH0KK3N0YXRp
YyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25Cb3R0b20oaW50IHEpIHsgcmV0dXJuIHEgPT0gMCB8
fCBxID09IDE7IH0KKworc3RhdGljIGlubGluZSBpbnQgbmV4dFF1YWRyYW50KGludCBxKSB7IHJl
dHVybiBxID09IDMgPyAwIDogcSArIDE7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHF1YWRyYW50RGlm
ZihpbnQgcTEsIGludCBxMikKK3sKKyAgICBpbnQgZCA9IHExIC0gcTI7CisgICAgd2hpbGUgKGQg
PCAwKQorICAgICAgICBkICs9IDQ7CisgICAgcmV0dXJuIGQ7Cit9CisKK3N0cnVjdCBQYXRoVmVj
dG9yIHsKKyAgICBmbG9hdCBtX3g7CisgICAgZmxvYXQgbV95OworCisgICAgUGF0aFZlY3Rvcigp
IDogbV94KDApLCBtX3koMCkge30KKyAgICBQYXRoVmVjdG9yKGZsb2F0IHgsIGZsb2F0IHkpIDog
bV94KHgpLCBtX3koeSkge30KKyAgICBkb3VibGUgYW5nbGUoKSBjb25zdCB7IHJldHVybiBhdGFu
MihtX3ksIG1feCk7IH0KKyAgICBvcGVyYXRvciBkb3VibGUgKCkgY29uc3QgeyByZXR1cm4gYW5n
bGUoKTsgfQorICAgIGRvdWJsZSBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBfaHlwb3QobV94LCBt
X3kpOyB9Cit9OworCitQYXRoVmVjdG9yIG9wZXJhdG9yLShjb25zdCBQYXRoUG9pbnQmIHAxLCBj
b25zdCBQYXRoUG9pbnQmIHAyKSB7IHJldHVybiBQYXRoVmVjdG9yKHAxLm1feCAtIHAyLm1feCwg
cDEubV95IC0gcDIubV95KTsgfQorCitzdGF0aWMgdm9pZCBhZGRBcmNQb2ludChQYXRoUG9seWdv
biYgcG9seSwgY29uc3QgUGF0aFBvaW50JiBjZW50ZXIsIGNvbnN0IFBhdGhQb2ludCYgcmFkaXVz
LCBkb3VibGUgYW5nbGUpCit7CisgICAgUGF0aFBvaW50IHA7CisgICAgZ2V0RWxsaXBzZVBvaW50
QnlBbmdsZShhbmdsZSwgcmFkaXVzLm1feCwgcmFkaXVzLm1feSwgcC5tX3gsIHAubV95KTsKKyAg
ICB0cmFuc2Zvcm1BcmNQb2ludChwLm1feCwgcC5tX3ksIGNlbnRlcik7CisgICAgaWYgKHBvbHku
aXNFbXB0eSgpIHx8IHBvbHkubGFzdCgpICE9IHApCisgICAgICAgIHBvbHkuYXBwZW5kKHApOwor
fQorCitzdGF0aWMgdm9pZCBhZGRBcmNQb2ludHMoUGF0aFBvbHlnb24mIHBvbHksIGNvbnN0IFBs
YXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvJiBkYXRhKQoreworICAgIGNvbnN0IFBhdGhQb2ludCYg
c3RhcnRQb2ludCA9IHBvbHkubGFzdCgpOworICAgIGRvdWJsZSBjdXJBbmdsZSA9IHN0YXJ0UG9p
bnQgLSBkYXRhLm1fY2VudGVyOworICAgIGRvdWJsZSBlbmRBbmdsZSA9IGRhdGEubV9lbmQgLSBk
YXRhLm1fY2VudGVyOworICAgIGRvdWJsZSBhbmdsZVN0ZXAgPSAyLiAvIHN0ZDo6bWF4KGRhdGEu
bV9yYWRpdXMubV94LCBkYXRhLm1fcmFkaXVzLm1feSk7CisgICAgaWYgKGRhdGEubV9jbG9ja3dp
c2UpIHsKKyAgICAgICAgaWYgKGVuZEFuZ2xlIDw9IGN1ckFuZ2xlIHx8IHN0YXJ0UG9pbnQgPT0g
ZGF0YS5tX2VuZCkKKyAgICAgICAgICAgIGVuZEFuZ2xlICs9IDIgKiBQSTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBhbmdsZVN0ZXAgPSAtYW5nbGVTdGVwOworICAgICAgICBpZiAoZW5kQW5nbGUg
Pj0gY3VyQW5nbGUgfHwgc3RhcnRQb2ludCA9PSBkYXRhLm1fZW5kKQorICAgICAgICAgICAgZW5k
QW5nbGUgLT0gMiAqIFBJOworICAgIH0KKworICAgIGZvciAoY3VyQW5nbGUgKz0gYW5nbGVTdGVw
OyBkYXRhLm1fY2xvY2t3aXNlID8gY3VyQW5nbGUgPCBlbmRBbmdsZSA6IGN1ckFuZ2xlID4gZW5k
QW5nbGU7IGN1ckFuZ2xlICs9IGFuZ2xlU3RlcCkKKyAgICAgICAgYWRkQXJjUG9pbnQocG9seSwg
ZGF0YS5tX2NlbnRlciwgZGF0YS5tX3JhZGl1cywgY3VyQW5nbGUpOworCisgICAgaWYgKHBvbHku
aXNFbXB0eSgpIHx8IHBvbHkubGFzdCgpICE9IGRhdGEubV9lbmQpCisgICAgICAgIHBvbHkuYXBw
ZW5kKGRhdGEubV9lbmQpOworfQorCitzdGF0aWMgdm9pZCBkcmF3UG9seWdvbnMoSERDIGRjLCBj
b25zdCBWZWN0b3I8UGF0aFBvbHlnb24+JiBwb2x5Z29ucywgYm9vbCBmaWxsLCBjb25zdCBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCogdHIpCit7CisgICAgTWVtb3J5QWxsb2NhdGlvbkNhbkZhaWwgY2Fu
RmFpbDsKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9seWdvbj46OmNvbnN0X2l0ZXJhdG9yIGkgPSBw
b2x5Z29ucy5iZWdpbigpOyBpICE9IHBvbHlnb25zLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaW50
IG5wb2ludHMgPSBpLT5zaXplKCk7CisgICAgICAgIGlmICghbnBvaW50cykKKyAgICAgICAgICAg
IGNvbnRpbnVlOworCisgICAgICAgIFBPSU5UKiB3aW5Qb2ludHMgPSAwOworICAgICAgICBpZiAo
ZmlsbCkgeworICAgICAgICAgICAgaWYgKG5wb2ludHMgPiAyKQorICAgICAgICAgICAgICAgIHdp
blBvaW50cyA9IG5ldyBQT0lOVFtucG9pbnRzICsgMV07CisgICAgICAgIH0gZWxzZQorICAgICAg
ICAgICAgd2luUG9pbnRzID0gbmV3IFBPSU5UW25wb2ludHNdOworCisgICAgICAgIGlmICh3aW5Q
b2ludHMpIHsKKyAgICAgICAgICAgIGlmICh0cikgeworICAgICAgICAgICAgICAgIGZvciAoaW50
IGkyID0gMDsgaTIgPCBucG9pbnRzOyArK2kyKSB7CisgICAgICAgICAgICAgICAgICAgIEZsb2F0
UG9pbnQgdHJQb2ludCA9IHRyLT5tYXBQb2ludChpLT5hdChpMikpOworICAgICAgICAgICAgICAg
ICAgICB3aW5Qb2ludHNbaTJdLnggPSBzdGFibGVSb3VuZCh0clBvaW50LngoKSk7CisgICAgICAg
ICAgICAgICAgICAgIHdpblBvaW50c1tpMl0ueSA9IHN0YWJsZVJvdW5kKHRyUG9pbnQueSgpKTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
IGZvciAoaW50IGkyID0gMDsgaTIgPCBucG9pbnRzOyArK2kyKSB7CisgICAgICAgICAgICAgICAg
ICAgIHdpblBvaW50c1tpMl0ueCA9IHN0YWJsZVJvdW5kKGktPmF0KGkyKS54KCkpOworICAgICAg
ICAgICAgICAgICAgICB3aW5Qb2ludHNbaTJdLnkgPSBzdGFibGVSb3VuZChpLT5hdChpMikueSgp
KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChm
aWxsICYmIHdpblBvaW50c1tucG9pbnRzIC0gMV0gIT0gd2luUG9pbnRzWzBdKSB7CisgICAgICAg
ICAgICAgICAgd2luUG9pbnRzW25wb2ludHNdLnggPSB3aW5Qb2ludHNbMF0ueDsKKyAgICAgICAg
ICAgICAgICB3aW5Qb2ludHNbbnBvaW50c10ueSA9IHdpblBvaW50c1swXS55OworICAgICAgICAg
ICAgICAgICsrbnBvaW50czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpbGwp
CisgICAgICAgICAgICAgICAgOjpQb2x5Z29uKGRjLCB3aW5Qb2ludHMsIG5wb2ludHMpOworICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIDo6UG9seWxpbmUoZGMsIHdpblBvaW50cywg
bnBvaW50cyk7CisgICAgICAgICAgICBkZWxldGVbXSB3aW5Qb2ludHM7CisgICAgICAgIH0KKyAg
ICB9Cit9CisKKworaW50IFBsYXRmb3JtUGF0aEVsZW1lbnQ6Om51bUNvbnRyb2xQb2ludHMoKSBj
b25zdAoreworICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgY2FzZSBQYXRoTW92ZVRvOgorICAg
IGNhc2UgUGF0aExpbmVUbzoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBQYXRoUXVhZEN1
cnZlVG86CisgICAgY2FzZSBQYXRoQXJjVG86CisgICAgICAgIHJldHVybiAyOworICAgIGNhc2Ug
UGF0aEJlemllckN1cnZlVG86CisgICAgICAgIHJldHVybiAzOworICAgIC8vY2FzZSBQYXRoQ2xv
c2VTdWJwYXRoOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKwor
aW50IFBsYXRmb3JtUGF0aEVsZW1lbnQ6Om51bVBvaW50cygpIGNvbnN0Cit7CisgICAgc3dpdGNo
IChtX3R5cGUpIHsKKyAgICBjYXNlIFBhdGhNb3ZlVG86CisgICAgY2FzZSBQYXRoTGluZVRvOgor
ICAgIGNhc2UgUGF0aEFyY1RvOgorICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIFBhdGhRdWFk
Q3VydmVUbzoKKyAgICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBQYXRoQmV6aWVyQ3VydmVUbzoK
KyAgICAgICAgcmV0dXJuIDM7CisgICAgLy9jYXNlIFBhdGhDbG9zZVN1YnBhdGg6CisgICAgZGVm
YXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCit2b2lkIFBhdGhQb2x5Z29uOjpt
b3ZlKGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0KQoreworICAgIGZvciAoVmVjdG9yPFBhdGhQb2lu
dD46Oml0ZXJhdG9yIGkgPSBiZWdpbigpOyBpIDwgZW5kKCk7ICsraSkKKyAgICAgICAgaS0+bW92
ZShvZmZzZXQpOworfQorCit2b2lkIFBhdGhQb2x5Z29uOjp0cmFuc2Zvcm0oY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgmIHQpCit7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvaW50Pjo6aXRlcmF0
b3IgaSA9IGJlZ2luKCk7IGkgPCBlbmQoKTsgKytpKQorICAgICAgICAqaSA9IHQubWFwUG9pbnQo
KmkpOworfQorCitib29sIFBhdGhQb2x5Z29uOjpjb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBw
b2ludCkgY29uc3QKK3sKKyAgICBpZiAoc2l6ZSgpIDwgMykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgaW50IGludGVyc2VjdGVkID0gMDsKKyAgICBjb25zdCBQYXRoUG9pbnQqIHBvaW50
MSA9ICZsYXN0KCk7CisgICAgVmVjdG9yPFBhdGhQb2ludD46OmNvbnN0X2l0ZXJhdG9yIGxhc3Qg
PSBlbmQoKTsKKyAgICBpbnQgd2FzTmVnYXRpdmUgPSAyOworICAgIGZvciAoVmVjdG9yPFBhdGhQ
b2ludD46OmNvbnN0X2l0ZXJhdG9yIGkgPSBiZWdpbigpOyBpICE9IGxhc3Q7ICsraSkgeworICAg
ICAgICBjb25zdCBQYXRoUG9pbnQmIHBvaW50MiA9ICppOworICAgICAgICBpZiAocG9pbnQxLT54
KCkgIT0gcG9pbnQueCgpKSB7CisgICAgICAgICAgICBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54
KCkpCisgICAgICAgICAgICAgICAgd2FzTmVnYXRpdmUgPSBwb2ludDEtPngoKSA8IHBvaW50Lngo
KSA/IDEgOiAwOworICAgICAgICAgICAgZWxzZSBpZiAocG9pbnQyLngoKSA8IHBvaW50LngoKSAh
PSBwb2ludDEtPngoKSA8IHBvaW50LngoKSkgeworICAgICAgICAgICAgICAgIGZsb2F0IHkgPSAo
cG9pbnQyLnkoKSAtIHBvaW50MS0+eSgpKSAvIChwb2ludDIueCgpIC0gcG9pbnQxLT54KCkpICog
KHBvaW50LngoKSAtIHBvaW50MS0+eCgpKSArIHBvaW50MS0+eSgpOworICAgICAgICAgICAgICAg
IGlmICh5ID49IHBvaW50LnkoKSkKKyAgICAgICAgICAgICAgICAgICAgKytpbnRlcnNlY3RlZDsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwb2ludDEt
PnkoKSA9PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAg
ICAgICAgIGlmIChwb2ludDEtPnkoKSA+IHBvaW50LnkoKSkgeworICAgICAgICAgICAgICAgIGlm
IChwb2ludDIueCgpID09IHBvaW50LngoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9p
bnQyLnkoKSA8PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAod2Fz
TmVnYXRpdmUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFBhdGhQb2lu
dD46OmNvbnN0X2l0ZXJhdG9yIGpMYXN0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZl
Y3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBqID0gaTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBiZWdpbigp
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbGFzdDsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0t
ajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoai0+eCgpICE9IHBvaW50LngoKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoai0+eCgpID4gcG9pbnQueCgp
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzTmVnYXRpdmUgPSAwOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB3YXNOZWdhdGl2ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICAgICAgICAgIH0gd2hpbGUgKGogIT0gakxhc3QpOworCisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAod2FzTmVnYXRpdmUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgaWYgKHdhc05lZ2F0aXZlID8gcG9pbnQyLngoKSA+IHBvaW50LngoKSA6IHBvaW50Mi54KCkg
PCBwb2ludC54KCkpCisgICAgICAgICAgICAgICAgICAgICAgICArK2ludGVyc2VjdGVkOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9pbnQyLngoKSA9PSBwb2lu
dC54KCkgJiYgcG9pbnQyLnkoKSA+PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcG9pbnQxID0gJnBvaW50MjsKKyAgICB9CisKKyAg
ICByZXR1cm4gaW50ZXJzZWN0ZWQgJiAxOworfQorCit2b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6
Om1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpCit7CisgICAgaW50IG4gPSBudW1Db250cm9s
UG9pbnRzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICAgIG1fZGF0
YS5tX3BvaW50c1tpXS5tb3ZlKG9mZnNldCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoRWxlbWVu
dDo6dHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIGludCBu
ID0gbnVtQ29udHJvbFBvaW50cygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7
CisgICAgICAgIEZsb2F0UG9pbnQgcCA9IHQubWFwUG9pbnQobV9kYXRhLm1fcG9pbnRzW2ldKTsK
KyAgICAgICAgbV9kYXRhLm1fcG9pbnRzW2ldLnNldChwLngoKSwgcC55KCkpOworICAgIH0KK30K
Kwordm9pZCBQbGF0Zm9ybVBhdGhFbGVtZW50OjppbmZsYXRlUmVjdFRvQ29udGFpbk1lKEZsb2F0
UmVjdCYgciwgY29uc3QgRmxvYXRQb2ludCYgbGFzdFBvaW50KSBjb25zdAoreworICAgIGlmICht
X3R5cGUgPT0gUGF0aEFyY1RvKSB7CisgICAgICAgIGNvbnN0IEFyY1RvJiBkYXRhID0gbV9kYXRh
Lm1fYXJjVG9EYXRhOworICAgICAgICBQYXRoUG9pbnQgc3RhcnRQb2ludDsKKyAgICAgICAgc3Rh
cnRQb2ludCA9IGxhc3RQb2ludDsKKyAgICAgICAgUGF0aFBvaW50IGVuZFBvaW50ID0gZGF0YS5t
X2VuZDsKKyAgICAgICAgaWYgKCFkYXRhLm1fY2xvY2t3aXNlKQorICAgICAgICAgICAgc3RkOjpz
d2FwKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTsKKworICAgICAgICBpbnQgcTAgPSBxdWFkcmFudChz
dGFydFBvaW50LCBkYXRhLm1fY2VudGVyKTsKKyAgICAgICAgaW50IHExID0gcXVhZHJhbnQoZW5k
UG9pbnQsIGRhdGEubV9jZW50ZXIpOworICAgICAgICBib29sIGNvbnRhaW5zRXh0cmVtZXNbNF0g
PSB7IGZhbHNlIH07IC8vIGJvdHRvbSwgbGVmdCwgdG9wLCByaWdodAorICAgICAgICBzdGF0aWMg
Y29uc3QgUGF0aFBvaW50IGV4dHJlbWVWZWN0b3JzWzRdID0geyB7IDAsIDEgfSwgeyAtMSwgMCB9
LCB7IDAsIC0xIH0sIHsgMSwgMCB9IH07CisgICAgICAgIGlmIChxMCA9PSBxMSkgeworICAgICAg
ICAgICAgaWYgKHN0YXJ0UG9pbnQubV94ID09IGVuZFBvaW50Lm1feCB8fCBpc1F1YWRyYW50T25C
b3R0b20ocTApICE9IHN0YXJ0UG9pbnQubV94ID4gZW5kUG9pbnQubV94KSB7CisgICAgICAgICAg
ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICAgICAgICAgIGNv
bnRhaW5zRXh0cmVtZXNbaV0gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgaW50IGV4dHJlbWUgPSBxMDsKKyAgICAgICAgICAgIGludCBkaWZmID0g
cXVhZHJhbnREaWZmKHExLCBxMCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRp
ZmY7ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5zRXh0cmVtZXNbZXh0cmVtZV0gPSB0
cnVlOworICAgICAgICAgICAgICAgIGV4dHJlbWUgPSBuZXh0UXVhZHJhbnQoZXh0cmVtZSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBv
aW50KHIsIHN0YXJ0UG9pbnQubV94LCBzdGFydFBvaW50Lm1feSk7CisgICAgICAgIGluZmxhdGVS
ZWN0VG9Db250YWluUG9pbnQociwgZW5kUG9pbnQubV94LCBlbmRQb2ludC5tX3kpOworICAgICAg
ICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5z
RXh0cmVtZXNbaV0pCisgICAgICAgICAgICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChy
LCBkYXRhLm1fY2VudGVyLm1feCArIGRhdGEubV9yYWRpdXMubV94ICogZXh0cmVtZVZlY3RvcnNb
aV0ubV94LCBkYXRhLm1fY2VudGVyLm1feSArIGRhdGEubV9yYWRpdXMubV95ICogZXh0cmVtZVZl
Y3RvcnNbaV0ubV95KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBuID0g
bnVtUG9pbnRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQorICAgICAg
ICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChyLCBtX2RhdGEubV9wb2ludHNbaV0ubV94
LCBtX2RhdGEubV9wb2ludHNbaV0ubV95KTsKKyAgICB9Cit9CisKK1BhdGhFbGVtZW50VHlwZSBQ
bGF0Zm9ybVBhdGhFbGVtZW50Ojp0eXBlKCkgY29uc3QKK3sKKyAgICBzd2l0Y2ggKG1fdHlwZSkg
eworICAgIGNhc2UgUGF0aE1vdmVUbzoKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50TW92ZVRv
UG9pbnQ7CisgICAgY2FzZSBQYXRoTGluZVRvOgorICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRB
ZGRMaW5lVG9Qb2ludDsKKyAgICBjYXNlIFBhdGhBcmNUbzoKKyAgICAgICAgLy8gRklYTUU6IHRo
ZXJlJ3Mgbm8gYXJjVG8gdHlwZSBmb3IgUGF0aEVsZW1lbnQKKyAgICAgICAgcmV0dXJuIFBhdGhF
bGVtZW50QWRkTGluZVRvUG9pbnQ7CisgICAgICAgIC8vIHJldHVybiBQYXRoRWxlbWVudEFkZFF1
YWRDdXJ2ZVRvUG9pbnQ7CisgICAgY2FzZSBQYXRoUXVhZEN1cnZlVG86CisgICAgICAgIHJldHVy
biBQYXRoRWxlbWVudEFkZFF1YWRDdXJ2ZVRvUG9pbnQ7CisgICAgY2FzZSBQYXRoQmV6aWVyQ3Vy
dmVUbzoKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRkQ3VydmVUb1BvaW50OworICAgIC8v
Y2FzZSBQYXRoQ2xvc2VTdWJwYXRoOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBQYXRo
RWxlbWVudENsb3NlU3VicGF0aDsKKyAgICB9Cit9CisKK1BsYXRmb3JtUGF0aDo6UGxhdGZvcm1Q
YXRoKCkKKzogbV9wZW5MaWZ0ZWQodHJ1ZSkKK3sKKyAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigp
OworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6ZW5zdXJlU3VicGF0aCgpCit7CisgICAgaWYgKG1f
cGVuTGlmdGVkKSB7CisgICAgICAgIG1fcGVuTGlmdGVkID0gZmFsc2U7CisgICAgICAgIG1fc3Vi
cGF0aHMuYXBwZW5kKFBhdGhQb2x5Z29uKCkpOworICAgICAgICBtX3N1YnBhdGhzLmxhc3QoKS5h
cHBlbmQobV9jdXJyZW50UG9pbnQpOworICAgIH0gZWxzZQorICAgICAgICBBU1NFUlQoIW1fc3Vi
cGF0aHMuaXNFbXB0eSgpKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFRvU3VicGF0aChj
b25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBlKQoreworICAgIGlmIChlLnBsYXRmb3JtVHlwZSgp
ID09IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhNb3ZlVG8pIHsKKyAgICAgICAgbV9wZW5MaWZ0
ZWQgPSB0cnVlOworICAgICAgICBtX2N1cnJlbnRQb2ludCA9IGUucG9pbnRBdCgwKTsKKyAgICB9
IGVsc2UgaWYgKGUucGxhdGZvcm1UeXBlKCkgPT0gUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aENs
b3NlU3VicGF0aCkgeworICAgICAgICBtX3BlbkxpZnRlZCA9IHRydWU7CisgICAgICAgIGlmICgh
bV9zdWJwYXRocy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChtX2N1cnJlbnRQb2ludCAh
PSBtX3N1YnBhdGhzLmxhc3QoKVswXSkgeworICAgICAgICAgICAgICAgIC8vIEFjY29yZGluZyB0
byBXM0MsIHdlIGhhdmUgdG8gZHJhdyBhIGxpbmUgZnJvbSBjdXJyZW50IHBvaW50IHRvIHRoZSBp
bml0aWFsIHBvaW50CisgICAgICAgICAgICAgICAgbV9zdWJwYXRocy5sYXN0KCkuYXBwZW5kKG1f
c3VicGF0aHMubGFzdCgpWzBdKTsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRQb2ludCA9IG1f
c3VicGF0aHMubGFzdCgpWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgIG1fY3VycmVudFBvaW50LmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW5z
dXJlU3VicGF0aCgpOworICAgICAgICBzd2l0Y2ggKGUucGxhdGZvcm1UeXBlKCkpIHsKKyAgICAg
ICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoTGluZVRvOgorICAgICAgICAgICAgbV9z
dWJwYXRocy5sYXN0KCkuYXBwZW5kKGUucG9pbnRBdCgwKSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQXJjVG86CisgICAgICAgICAg
ICBhZGRBcmNQb2ludHMobV9zdWJwYXRocy5sYXN0KCksIGUuYXJjVG8oKSk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoUXVhZEN1cnZl
VG86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGF0aFBvaW50IGNvbnRyb2xbXSA9
IHsKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50UG9pbnQsCisgICAgICAgICAgICAgICAg
ICAgIGUucG9pbnRBdCgwKSwKKyAgICAgICAgICAgICAgICAgICAgZS5wb2ludEF0KDEpLAorICAg
ICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2ljIG51bWJlcj8K
KyAgICAgICAgICAgICAgICBxdWFkQ3VydmUoNTAsIG1fc3VicGF0aHMubGFzdCgpLCBjb250cm9s
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRm
b3JtUGF0aEVsZW1lbnQ6OlBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICAgICAgeworICAgICAg
ICAgICAgICAgIFBhdGhQb2ludCBjb250cm9sW10gPSB7CisgICAgICAgICAgICAgICAgICAgIG1f
Y3VycmVudFBvaW50LAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMCksCisgICAgICAg
ICAgICAgICAgICAgIGUucG9pbnRBdCgxKSwKKyAgICAgICAgICAgICAgICAgICAgZS5wb2ludEF0
KDIpLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2lj
IG51bWJlcj8KKyAgICAgICAgICAgICAgICBiZXppZXIoMTAwLCBtX3N1YnBhdGhzLmxhc3QoKSwg
Y29udHJvbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1fY3VycmVudFBv
aW50ID0gbV9zdWJwYXRocy5sYXN0KCkubGFzdCgpOworICAgIH0KK30KKwordm9pZCBQbGF0Zm9y
bVBhdGg6OmFwcGVuZChjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBlKQoreworICAgIGUuaW5m
bGF0ZVJlY3RUb0NvbnRhaW5NZShtX2JvdW5kaW5nUmVjdCwgbGFzdFBvaW50KCkpOworICAgIGFk
ZFRvU3VicGF0aChlKTsKKyAgICBtX2VsZW1lbnRzLmFwcGVuZChlKTsKK30KKwordm9pZCBQbGF0
Zm9ybVBhdGg6OmFwcGVuZChjb25zdCBQbGF0Zm9ybVBhdGgmIHApCit7CisgICAgY29uc3QgUGxh
dGZvcm1QYXRoRWxlbWVudHMmIGUgPSBwLmVsZW1lbnRzKCk7CisgICAgZm9yIChQbGF0Zm9ybVBh
dGhFbGVtZW50czo6Y29uc3RfaXRlcmF0b3IgaXQoZS5iZWdpbigpKTsgaXQgIT0gZS5lbmQoKTsg
KytpdCkgeworICAgICAgICBhZGRUb1N1YnBhdGgoKml0KTsKKyAgICAgICAgaXQtPmluZmxhdGVS
ZWN0VG9Db250YWluTWUobV9ib3VuZGluZ1JlY3QsIGxhc3RQb2ludCgpKTsKKyAgICAgICAgbV9l
bGVtZW50cy5hcHBlbmQoKml0KTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjpjbGVh
cigpCit7CisgICAgbV9lbGVtZW50cy5jbGVhcigpOworICAgIG1fYm91bmRpbmdSZWN0ID0gRmxv
YXRSZWN0KCk7CisgICAgbV9zdWJwYXRocy5jbGVhcigpOworICAgIG1fY3VycmVudFBvaW50LmNs
ZWFyKCk7CisgICAgbV9wZW5MaWZ0ZWQgPSB0cnVlOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6
c3Ryb2tlUGF0aChIREMgZGMsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4KiB0cikgY29uc3QK
K3sKKyAgICBkcmF3UG9seWdvbnMoZGMsIG1fc3VicGF0aHMsIGZhbHNlLCB0cik7Cit9CisKK3Zv
aWQgUGxhdGZvcm1QYXRoOjpmaWxsUGF0aChIREMgZGMsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0
cml4KiB0cikgY29uc3QKK3sKKyAgICBIR0RJT0JKIG9sZFBlbiA9IFNlbGVjdE9iamVjdChkYywg
R2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pKTsKKyAgICBkcmF3UG9seWdvbnMoZGMsIG1fc3VicGF0
aHMsIHRydWUsIHRyKTsKKyAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7Cit9CisKK3ZvaWQg
UGxhdGZvcm1QYXRoOjp0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIGZv
ciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6Oml0ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVnaW4oKSk7
IGl0ICE9IG1fZWxlbWVudHMuZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT5tb3ZlKHNpemUpOwor
CisgICAgbV9ib3VuZGluZ1JlY3QubW92ZShzaXplKTsKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9s
eWdvbj46Oml0ZXJhdG9yIGl0ID0gbV9zdWJwYXRocy5iZWdpbigpOyBpdCAhPSBtX3N1YnBhdGhz
LmVuZCgpOyArK2l0KQorICAgICAgICBpdC0+bW92ZShzaXplKTsKK30KKwordm9pZCBQbGF0Zm9y
bVBhdGg6OnRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBm
b3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjppdGVyYXRvciBpdChtX2VsZW1lbnRzLmJlZ2luKCkp
OyBpdCAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2l0KQorICAgICAgICBpdC0+dHJhbnNmb3JtKHQp
OworCisgICAgbV9ib3VuZGluZ1JlY3QgPSB0Lm1hcFJlY3QobV9ib3VuZGluZ1JlY3QpOworICAg
IGZvciAoVmVjdG9yPFBhdGhQb2x5Z29uPjo6aXRlcmF0b3IgaXQgPSBtX3N1YnBhdGhzLmJlZ2lu
KCk7IGl0ICE9IG1fc3VicGF0aHMuZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT50cmFuc2Zvcm0o
dCk7Cit9CisKK2Jvb2wgUGxhdGZvcm1QYXRoOjpjb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBw
b2ludCwgV2luZFJ1bGUgcnVsZSkgY29uc3QKK3sKKyAgICAvLyBvcHRpbWl6YXRpb246IGNoZWNr
IHRoZSBib3VuZGluZyByZWN0IGZpcnN0CisgICAgaWYgKCFjb250YWluc1BvaW50KG1fYm91bmRp
bmdSZWN0LCBwb2ludCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAoVmVjdG9y
PFBhdGhQb2x5Z29uPjo6Y29uc3RfaXRlcmF0b3IgaSA9IG1fc3VicGF0aHMuYmVnaW4oKTsgaSAh
PSBtX3N1YnBhdGhzLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYgKGktPmNvbnRhaW5zKHBvaW50
KSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsK
K30KKwordm9pZCBQbGF0Zm9ybVBhdGg6Om1vdmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkK
K3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpNb3ZlVG8gZGF0YSA9IHsgeyBwb2ludC54KCks
IHBvaW50LnkoKSB9IH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBh
cHBlbmQocGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkTGluZVRvKGNvbnN0IEZsb2F0
UG9pbnQmIHBvaW50KQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkxpbmVUbyBkYXRhID0g
eyB7IHBvaW50LngoKSwgcG9pbnQueSgpIH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBl
KGRhdGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRRdWFk
Q3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjcCwgY29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAg
ICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpRdWFkQ3VydmVUbyBkYXRhID0geyB7IGNwLngoKSwgY3Au
eSgpIH0sIHsgcC54KCksIHAueSgpIH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRh
dGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRCZXppZXJD
dXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNwMSwgY29uc3QgRmxvYXRQb2ludCYgY3AyLCBjb25z
dCBGbG9hdFBvaW50JiBwKQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkJlemllckN1cnZl
VG8gZGF0YSA9IHsgeyBjcDEueCgpLCBjcDEueSgpIH0sIHsgY3AyLngoKSwgY3AyLnkoKSB9LCB7
IHAueCgpLCBwLnkoKSB9IH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAg
ICBhcHBlbmQocGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkQXJjVG8oY29uc3QgRmxv
YXRQb2ludCYgZnAxLCBjb25zdCBGbG9hdFBvaW50JiBmcDIsIGZsb2F0IHJhZGl1cykKK3sKKyAg
ICBjb25zdCBQYXRoUG9pbnQmIHAwID0gbV9jdXJyZW50UG9pbnQ7CisgICAgUGF0aFBvaW50IHAx
OworICAgIHAxID0gZnAxOworICAgIFBhdGhQb2ludCBwMjsKKyAgICBwMiA9IGZwMjsKKyAgICBp
ZiAoIXJhZGl1cyB8fCBwMCA9PSBwMSB8fCBwMSA9PSBwMikgeworICAgICAgICBhZGRMaW5lVG8o
cDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUGF0aFZlY3RvciB2MDEgPSBwMCAt
IHAxOworICAgIFBhdGhWZWN0b3IgdjIxID0gcDIgLSBwMTsKKworICAgIC8vIHNpbihBIC0gQikg
PSBzaW4oQSkgKiBjb3MoQikgLSBzaW4oQikgKiBjb3MoQSkKKyAgICBkb3VibGUgY3Jvc3MgPSB2
MDEubV94ICogdjIxLm1feSAtIHYwMS5tX3kgKiB2MjEubV94OworCisgICAgaWYgKGZhYnMoY3Jv
c3MpIDwgMUUtMTApIHsKKyAgICAgICAgLy8gb24gb25lIGxpbmUKKyAgICAgICAgYWRkTGluZVRv
KHAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRvdWJsZSBkMDEgPSB2MDEubGVu
Z3RoKCk7CisgICAgZG91YmxlIGQyMSA9IHYyMS5sZW5ndGgoKTsKKyAgICBkb3VibGUgYW5nbGUg
PSAoUEkgLSBhYnMoYXNpbihjcm9zcyAvIChkMDEgKiBkMjEpKSkpICogMC41OworICAgIGRvdWJs
ZSBzcGFuID0gcmFkaXVzICogdGFuKGFuZ2xlKTsKKyAgICBkb3VibGUgcmF0ZSA9IHNwYW4gLyBk
MDE7CisgICAgUGF0aFBvaW50IHN0YXJ0UG9pbnQ7CisgICAgc3RhcnRQb2ludC5tX3ggPSBwMS5t
X3ggKyB2MDEubV94ICogcmF0ZTsKKyAgICBzdGFydFBvaW50Lm1feSA9IHAxLm1feSArIHYwMS5t
X3kgKiByYXRlOworCisgICAgYWRkTGluZVRvKHN0YXJ0UG9pbnQpOworCisgICAgUGF0aFBvaW50
IGVuZFBvaW50OworICAgIHJhdGUgPSBzcGFuIC8gZDIxOworICAgIGVuZFBvaW50Lm1feCA9IHAx
Lm1feCArIHYyMS5tX3ggKiByYXRlOworICAgIGVuZFBvaW50Lm1feSA9IHAxLm1feSArIHYyMS5t
X3kgKiByYXRlOworCisgICAgUGF0aFBvaW50IG1pZFBvaW50OworICAgIG1pZFBvaW50Lm1feCA9
IChzdGFydFBvaW50Lm1feCArIGVuZFBvaW50Lm1feCkgKiAwLjU7CisgICAgbWlkUG9pbnQubV95
ID0gKHN0YXJ0UG9pbnQubV95ICsgZW5kUG9pbnQubV95KSAqIDAuNTsKKworICAgIFBhdGhWZWN0
b3Igdm0xID0gbWlkUG9pbnQgLSBwMTsKKyAgICBkb3VibGUgZG0xID0gdm0xLmxlbmd0aCgpOwor
ICAgIGRvdWJsZSBkID0gX2h5cG90KHJhZGl1cywgc3Bhbik7CisKKyAgICBQYXRoUG9pbnQgY2Vu
dGVyUG9pbnQ7CisgICAgcmF0ZSA9IGQgLyBkbTE7CisgICAgY2VudGVyUG9pbnQubV94ID0gcDEu
bV94ICsgdm0xLm1feCAqIHJhdGU7CisgICAgY2VudGVyUG9pbnQubV95ID0gcDEubV95ICsgdm0x
Lm1feSAqIHJhdGU7CisKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpBcmNUbyBkYXRhID0gewor
ICAgICAgICBlbmRQb2ludCwKKyAgICAgICAgY2VudGVyUG9pbnQsCisgICAgICAgIHsgcmFkaXVz
LCByYWRpdXMgfSwKKyAgICAgICAgY3Jvc3MgPCAwCisgICAgfTsKKyAgICBQbGF0Zm9ybVBhdGhF
bGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRo
OjpjbG9zZVN1YnBhdGgoKQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGU7CisgICAgYXBw
ZW5kKHBlKTsKK30KKworLy8gYWRkIGEgY2lyY3VsYXIgYXJjIGNlbnRyZWQgYXQgcCB3aXRoIHJh
ZGl1cyByIGZyb20gc3RhcnQgYW5nbGUgc2FyIChyYWRpYW5zKSB0byBlbmQgYW5nbGUgZWFyCit2
b2lkIFBsYXRmb3JtUGF0aDo6YWRkRWxsaXBzZShjb25zdCBGbG9hdFBvaW50JiBwLCBmbG9hdCBh
LCBmbG9hdCBiLCBmbG9hdCBzYXIsIGZsb2F0IGVhciwgYm9vbCBhbnRpY2xvY2t3aXNlKQorewor
ICAgIGZsb2F0IHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZOworCisgICAgbm9ybWFsaXplQW5n
bGUoc2FyKTsKKyAgICBub3JtYWxpemVBbmdsZShlYXIpOworCisgICAgZ2V0RWxsaXBzZVBvaW50
QnlBbmdsZShzYXIsIGEsIGIsIHN0YXJ0WCwgc3RhcnRZKTsKKyAgICBnZXRFbGxpcHNlUG9pbnRC
eUFuZ2xlKGVhciwgYSwgYiwgZW5kWCwgZW5kWSk7CisKKyAgICB0cmFuc2Zvcm1BcmNQb2ludChz
dGFydFgsIHN0YXJ0WSwgcCk7CisgICAgdHJhbnNmb3JtQXJjUG9pbnQoZW5kWCwgZW5kWSwgcCk7
CisKKyAgICBGbG9hdFBvaW50IHN0YXJ0KHN0YXJ0WCwgc3RhcnRZKTsKKyAgICBtb3ZlVG8oc3Rh
cnQpOworCisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QXJjVG8gZGF0YSA9IHsgeyBlbmRYLCBl
bmRZIH0sIHsgcC54KCksIHAueSgpIH0sICB7IGEsIGIgfSwgIWFudGljbG9ja3dpc2UgfTsKKyAg
ICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKKwor
dm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIG1v
dmVUbyhyLmxvY2F0aW9uKCkpOworCisgICAgZmxvYXQgcmlnaHQgPSByLnJpZ2h0KCkgLSAxOwor
ICAgIGZsb2F0IGJvdHRvbSA9IHIuYm90dG9tKCkgLSAxOworICAgIGFkZExpbmVUbyhGbG9hdFBv
aW50KHJpZ2h0LCByLnkoKSkpOworICAgIGFkZExpbmVUbyhGbG9hdFBvaW50KHJpZ2h0LCBib3R0
b20pKTsKKyAgICBhZGRMaW5lVG8oRmxvYXRQb2ludChyLngoKSwgYm90dG9tKSk7CisgICAgYWRk
TGluZVRvKHIubG9jYXRpb24oKSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRFbGxpcHNl
KGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICBGbG9hdFNpemUgcmFkaXVzKHIud2lkdGgoKSAq
IDAuNSwgci5oZWlnaHQoKSAqIDAuNSk7CisgICAgYWRkRWxsaXBzZShyLmxvY2F0aW9uKCkgKyBy
YWRpdXMsIHJhZGl1cy53aWR0aCgpLCByYWRpdXMuaGVpZ2h0KCksIDAsIDAsIHRydWUpOworfQor
CitTdHJpbmcgUGxhdGZvcm1QYXRoOjpkZWJ1Z1N0cmluZygpIGNvbnN0Cit7CisgICAgU3RyaW5n
IHJldDsKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVyYXRvciBpKG1f
ZWxlbWVudHMuYmVnaW4oKSk7IGkgIT0gbV9lbGVtZW50cy5lbmQoKTsgKytpKSB7CisgICAgICAg
IHN3aXRjaCAoaS0+cGxhdGZvcm1UeXBlKCkpIHsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhF
bGVtZW50OjpQYXRoTW92ZVRvOgorICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBh
dGhMaW5lVG86CisgICAgICAgICAgICByZXQgKz0gU3RyaW5nOjpmb3JtYXQoIk0gJWYgJWZcbiIs
IGktPnBvaW50QXQoMCkubV94LCBpLT5wb2ludEF0KDApLm1feSk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQXJjVG86CisgICAgICAg
ICAgICByZXQgKz0gU3RyaW5nOjpmb3JtYXQoIkEgJWYgJWYgJWYgJWYgJWYgJWYgJWNcbiIKKyAg
ICAgICAgICAgICAgICAsIGktPmFyY1RvKCkubV9lbmQubV94LCBpLT5hcmNUbygpLm1fZW5kLm1f
eQorICAgICAgICAgICAgICAgICwgaS0+YXJjVG8oKS5tX2NlbnRlci5tX3gsIGktPmFyY1RvKCku
bV9jZW50ZXIubV95CisgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fcmFkaXVzLm1feCwg
aS0+YXJjVG8oKS5tX3JhZGl1cy5tX3kKKyAgICAgICAgICAgICAgICAsIGktPmFyY1RvKCkubV9j
bG9ja3dpc2U/ICdZJyA6ICdOJyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQ
bGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoUXVhZEN1cnZlVG86CisgICAgICAgICAgICByZXQgKz0g
U3RyaW5nOjpmb3JtYXQoIlEgJWYgJWYgJWYgJWZcbiIKKyAgICAgICAgICAgICAgICAsIGktPnBv
aW50QXQoMCkubV94LCBpLT5wb2ludEF0KDApLm1feQorICAgICAgICAgICAgICAgICwgaS0+cG9p
bnRBdCgxKS5tX3gsIGktPnBvaW50QXQoMSkubV95KTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAg
ICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJCICVmICVmICVmICVmICVmICVmXG4iCisgICAg
ICAgICAgICAgICAgLCBpLT5wb2ludEF0KDApLm1feCwgaS0+cG9pbnRBdCgwKS5tX3kKKyAgICAg
ICAgICAgICAgICAsIGktPnBvaW50QXQoMSkubV94LCBpLT5wb2ludEF0KDEpLm1feQorICAgICAg
ICAgICAgICAgICwgaS0+cG9pbnRBdCgyKS5tX3gsIGktPnBvaW50QXQoMikubV95KTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhDbG9z
ZVN1YnBhdGg6CisgICAgICAgICAgICByZXQgKz0gIlNcbiI7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgUGxhdGZvcm1Q
YXRoOjphcHBseSh2b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9uKSBjb25z
dAoreworICAgIFBhdGhFbGVtZW50IHBlbGVtZW50OworICAgIEZsb2F0UG9pbnQgcG9pbnRzWzNd
OworICAgIHBlbGVtZW50LnBvaW50cyA9IHBvaW50czsKKworICAgIGZvciAoUGxhdGZvcm1QYXRo
RWxlbWVudHM6OmNvbnN0X2l0ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVnaW4oKSk7IGl0ICE9IG1f
ZWxlbWVudHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgcGVsZW1lbnQudHlwZSA9IGl0LT50eXBl
KCk7CisgICAgICAgIGludCBuID0gaXQtPm51bVBvaW50cygpOworICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgICAgIHBvaW50c1tpXSA9IGl0LT5wb2ludEF0KGkp
OworICAgICAgICBmdW5jdGlvbihpbmZvLCAmcGVsZW1lbnQpOworICAgIH0KK30KKworCit9IC8v
IG5hbWVzcGFjZSBXZWJjb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BsYXRmb3JtUGF0aFdpbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uZmNhMDBhNwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvUGxhdGZvcm1QYXRoV2luY2UuaApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqICBDb3B5
cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICog
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRl
ZiBQbGF0Zm9ybVBhdGhXaW5jZV9oCisjZGVmaW5lIFBsYXRmb3JtUGF0aFdpbmNlX2gKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OworCisgICAgc3Ry
dWN0IFBhdGhQb2ludCB7CisgICAgICAgIGZsb2F0IG1feDsKKyAgICAgICAgZmxvYXQgbV95Owor
ICAgICAgICBjb25zdCBmbG9hdCYgeCgpIGNvbnN0IHsgcmV0dXJuIG1feDsgfQorICAgICAgICBj
b25zdCBmbG9hdCYgeSgpIGNvbnN0IHsgcmV0dXJuIG1feTsgfQorICAgICAgICB2b2lkIHNldChm
bG9hdCB4LCBmbG9hdCB5KQorICAgICAgICB7CisgICAgICAgICAgICBtX3ggPSB4OworICAgICAg
ICAgICAgbV95ID0geTsKKyAgICAgICAgfTsKKyAgICAgICAgb3BlcmF0b3IgRmxvYXRQb2ludCgp
IGNvbnN0IHsgcmV0dXJuIEZsb2F0UG9pbnQobV94LCBtX3kpOyB9CisgICAgICAgIHZvaWQgbW92
ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgbV94ICs9
IG9mZnNldC53aWR0aCgpOworICAgICAgICAgICAgbV95ICs9IG9mZnNldC5oZWlnaHQoKTsKKyAg
ICAgICAgfQorICAgICAgICBQYXRoUG9pbnQmIG9wZXJhdG9yPShjb25zdCBGbG9hdFBvaW50JiBw
KQorICAgICAgICB7CisgICAgICAgICAgICBtX3ggPSBwLngoKTsKKyAgICAgICAgICAgIG1feSA9
IHAueSgpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZv
aWQgY2xlYXIoKSB7IG1feCA9IG1feSA9IDA7IH0KKyAgICB9OworCisgICAgc3RydWN0IFBhdGhQ
b2x5Z29uOiBwdWJsaWMgVmVjdG9yPFBhdGhQb2ludD4geworICAgICAgICB2b2lkIG1vdmUoY29u
c3QgRmxvYXRTaXplJiBvZmZzZXQpOworICAgICAgICB2b2lkIHRyYW5zZm9ybShjb25zdCBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisgICAgICAgIGJvb2wgY29udGFpbnMoY29uc3QgRmxvYXRQ
b2ludCYgcG9pbnQpIGNvbnN0OworICAgIH07CisKKyAgICBjbGFzcyBQbGF0Zm9ybVBhdGhFbGVt
ZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gUGxhZm9ybVBhdGhFbGVtZW50VHlwZSB7
CisgICAgICAgICAgICBQYXRoTW92ZVRvLAorICAgICAgICAgICAgUGF0aExpbmVUbywKKyAgICAg
ICAgICAgIFBhdGhBcmNUbywKKyAgICAgICAgICAgIFBhdGhRdWFkQ3VydmVUbywKKyAgICAgICAg
ICAgIFBhdGhCZXppZXJDdXJ2ZVRvLAorICAgICAgICAgICAgUGF0aENsb3NlU3VicGF0aCwKKyAg
ICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgTW92ZVRvIHsKKyAgICAgICAgICAgIFBhdGhQb2lu
dCBtX2VuZDsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgTGluZVRvIHsKKyAgICAgICAg
ICAgIFBhdGhQb2ludCBtX2VuZDsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgQXJjVG8g
eworICAgICAgICAgICAgUGF0aFBvaW50IG1fZW5kOworICAgICAgICAgICAgUGF0aFBvaW50IG1f
Y2VudGVyOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcmFkaXVzOworICAgICAgICAgICAgYm9v
bCBtX2Nsb2Nrd2lzZTsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgUXVhZEN1cnZlVG8g
eworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQwOworICAgICAgICAgICAgUGF0aFBvaW50
IG1fcG9pbnQxOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBCZXppZXJDdXJ2ZVRvIHsK
KyAgICAgICAgICAgIFBhdGhQb2ludCBtX3BvaW50MDsKKyAgICAgICAgICAgIFBhdGhQb2ludCBt
X3BvaW50MTsKKyAgICAgICAgICAgIFBhdGhQb2ludCBtX3BvaW50MjsKKyAgICAgICAgfTsKKwor
ICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KCk6IG1fdHlwZShQYXRoQ2xvc2VTdWJwYXRoKSB7
IG1fZGF0YS5tX3BvaW50c1swXS5zZXQoMCwgMCk7ICAgIH0KKyAgICAgICAgUGxhdGZvcm1QYXRo
RWxlbWVudChjb25zdCBNb3ZlVG8mIGRhdGEpOiBtX3R5cGUoUGF0aE1vdmVUbykgeyBtX2RhdGEu
bV9tb3ZlVG9EYXRhID0gZGF0YTsgfQorICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0
IExpbmVUbyYgZGF0YSk6IG1fdHlwZShQYXRoTGluZVRvKSB7IG1fZGF0YS5tX2xpbmVUb0RhdGEg
PSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgQXJjVG8mIGRhdGEp
OiBtX3R5cGUoUGF0aEFyY1RvKSB7IG1fZGF0YS5tX2FyY1RvRGF0YSA9IGRhdGE7IH0KKyAgICAg
ICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25zdCBRdWFkQ3VydmVUbyYgZGF0YSk6IG1fdHlwZShQ
YXRoUXVhZEN1cnZlVG8pIHsgbV9kYXRhLm1fcXVhZEN1cnZlVG9EYXRhID0gZGF0YTsgfQorICAg
ICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IEJlemllckN1cnZlVG8mIGRhdGEpOiBtX3R5
cGUoUGF0aEJlemllckN1cnZlVG8pIHsgbV9kYXRhLm1fYmV6aWVyQ3VydmVUb0RhdGEgPSBkYXRh
OyB9CisKKyAgICAgICAgY29uc3QgTW92ZVRvJiBtb3ZlVG8oKSBjb25zdCB7IHJldHVybiBtX2Rh
dGEubV9tb3ZlVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IExpbmVUbyYgbGluZVRvKCkgY29uc3Qg
eyByZXR1cm4gbV9kYXRhLm1fbGluZVRvRGF0YTsgfQorICAgICAgICBjb25zdCBBcmNUbyYgYXJj
VG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9hcmNUb0RhdGE7IH0KKyAgICAgICAgY29uc3Qg
UXVhZEN1cnZlVG8mIHF1YWRDdXJ2ZVRvKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm1fcXVhZEN1
cnZlVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IEJlemllckN1cnZlVG8mIGJlemllckN1cnZlVG8o
KSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9iZXppZXJDdXJ2ZVRvRGF0YTsgfQorICAgICAgICBj
b25zdCBQYXRoUG9pbnQmIGxhc3RQb2ludCgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAg
IGludCBuID0gbnVtUG9pbnRzKCk7CisgICAgICAgICAgICByZXR1cm4gbiA+IDEgPyBtX2RhdGEu
bV9wb2ludHNbbiAtIDFdIDogbV9kYXRhLm1fcG9pbnRzWzBdOworICAgICAgICB9CisgICAgICAg
IGNvbnN0IFBhdGhQb2ludCYgcG9pbnRBdChpbnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0
YS5tX3BvaW50c1tpbmRleF07IH0KKyAgICAgICAgaW50IG51bVBvaW50cygpIGNvbnN0OworICAg
ICAgICBpbnQgbnVtQ29udHJvbFBvaW50cygpIGNvbnN0OworICAgICAgICB2b2lkIG1vdmUoY29u
c3QgRmxvYXRTaXplJiBvZmZzZXQpOworICAgICAgICB2b2lkIHRyYW5zZm9ybShjb25zdCBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisgICAgICAgIFBhdGhFbGVtZW50VHlwZSB0eXBlKCkgY29u
c3Q7CisgICAgICAgIFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgcGxhdGZvcm1UeXBlKCkgY29uc3Qg
eyByZXR1cm4gbV90eXBlOyB9CisgICAgICAgIHZvaWQgaW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShG
bG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9pbnQmIGxhc3RQb2ludCkgY29uc3Q7CisKKyAgICBw
cml2YXRlOgorICAgICAgICBQbGFmb3JtUGF0aEVsZW1lbnRUeXBlIG1fdHlwZTsKKyAgICAgICAg
dW5pb24geworICAgICAgICAgICAgTW92ZVRvIG1fbW92ZVRvRGF0YTsKKyAgICAgICAgICAgIExp
bmVUbyBtX2xpbmVUb0RhdGE7CisgICAgICAgICAgICBBcmNUbyBtX2FyY1RvRGF0YTsKKyAgICAg
ICAgICAgIFF1YWRDdXJ2ZVRvIG1fcXVhZEN1cnZlVG9EYXRhOworICAgICAgICAgICAgQmV6aWVy
Q3VydmVUbyBtX2JlemllckN1cnZlVG9EYXRhOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9p
bnRzWzRdOworICAgICAgICB9IG1fZGF0YTsKKyAgICB9OworCisgICAgdHlwZWRlZiBWZWN0b3I8
UGxhdGZvcm1QYXRoRWxlbWVudD4gUGxhdGZvcm1QYXRoRWxlbWVudHM7CisKKyAgICBjbGFzcyBQ
bGF0Zm9ybVBhdGggeworICAgIHB1YmxpYzoKKyAgICAgICAgUGxhdGZvcm1QYXRoKCk7CisgICAg
ICAgIGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnRzJiBlbGVtZW50cygpIGNvbnN0IHsgcmV0dXJu
IG1fZWxlbWVudHM7IH0KKyAgICAgICAgdm9pZCBhcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoRWxl
bWVudCYgZSk7CisgICAgICAgIHZvaWQgYXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aCYgcCk7Cisg
ICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1
cm4gbV9lbGVtZW50cy5pc0VtcHR5KCk7IH0KKworICAgICAgICB2b2lkIHN0cm9rZVBhdGgoSERD
LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogdHIpIGNvbnN0OworICAgICAgICB2b2lkIGZp
bGxQYXRoKEhEQywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgqIHRyKSBjb25zdDsKKyAgICAg
ICAgRmxvYXRQb2ludCBsYXN0UG9pbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRzLmlzRW1w
dHkoKSA/IEZsb2F0UG9pbnQoMCwgMCkgOiBtX2VsZW1lbnRzLmxhc3QoKS5sYXN0UG9pbnQoKTsg
fQorCisgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdSZWN0KCkgY29uc3QgeyByZXR1
cm4gbV9ib3VuZGluZ1JlY3Q7IH0KKyAgICAgICAgYm9vbCBjb250YWlucyhjb25zdCBGbG9hdFBv
aW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkgY29uc3Q7CisgICAgICAgIHZvaWQgdHJhbnNsYXRl
KGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSk7CisgICAgICAgIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKworICAgICAgICB2b2lkIG1vdmVUbyhjb25zdCBGbG9h
dFBvaW50Jik7CisgICAgICAgIHZvaWQgYWRkTGluZVRvKGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAg
ICAgICAgdm9pZCBhZGRRdWFkQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjb250cm9sUG9pbnQs
IGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KTsKKyAgICAgICAgdm9pZCBhZGRCZXppZXJDdXJ2ZVRv
KGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRy
b2xQb2ludDIsIGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICAgICAgdm9pZCBhZGRBcmNUbyhjb25z
dCBGbG9hdFBvaW50JiwgY29uc3QgRmxvYXRQb2ludCYsIGZsb2F0IHJhZGl1cyk7CisgICAgICAg
IHZvaWQgY2xvc2VTdWJwYXRoKCk7CisgICAgICAgIHZvaWQgYWRkRWxsaXBzZShjb25zdCBGbG9h
dFBvaW50JiBwLCBmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBzYXIsIGZsb2F0IGVhciwgYm9vbCBh
bnRpY2xvY2t3aXNlKTsKKyAgICAgICAgdm9pZCBhZGRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcik7
CisgICAgICAgIHZvaWQgYWRkRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHIpOworICAgICAgICBT
dHJpbmcgZGVidWdTdHJpbmcoKSBjb25zdDsKKyAgICAgICAgdm9pZCBhcHBseSh2b2lkKiBpbmZv
LCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9uKSBjb25zdDsKKworICAgIHByaXZhdGU6Cisg
ICAgICAgIHZvaWQgZW5zdXJlU3VicGF0aCgpOworICAgICAgICB2b2lkIGFkZFRvU3VicGF0aChj
b25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBlKTsKKworICAgICAgICBQbGF0Zm9ybVBhdGhFbGVt
ZW50cyBtX2VsZW1lbnRzOworICAgICAgICBGbG9hdFJlY3QgbV9ib3VuZGluZ1JlY3Q7CisgICAg
ICAgIFZlY3RvcjxQYXRoUG9seWdvbj4gbV9zdWJwYXRoczsKKyAgICAgICAgUGF0aFBvaW50IG1f
Y3VycmVudFBvaW50OworICAgICAgICBib29sIG1fcGVuTGlmdGVkOworICAgIH07CisKK30KKwor
I2VuZGlmIC8vIFBsYXRmb3JtUGF0aFdpbmNlX2gK
</data>
<flag name="review"
          id="18017"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33819</attachid>
            <date>2009-07-30 13:15:13 -0700</date>
            <delta_ts>2009-07-30 13:16:07 -0700</delta_ts>
            <desc>7) Color, Gradient, Image</desc>
            <filename>27817.patch</filename>
            <type>text/plain</type>
            <size>1656</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NTNjOWQzMC4uMmYzM2EwNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAwOS0wNy0yOSAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIEZJWDogSERDIGxlYWtzIGluIFBvcHVwTWVudVdpbi5jcHAKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI3ODE3CisKKyAgICAg
ICAgTm8gbmV3IHRlc3RzLiAoT09QUyEpCisKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUG9wdXBN
ZW51V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTWVudTo6flBvcHVwTWVudSk6Cisg
ICAgICAgIChXZWJDb3JlOjpQb3B1cE1lbnU6OnBhaW50KToKKwogMjAwOS0wNy0yOSAgQnJhZHkg
RWlkc29uICA8YmVpZHNvbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgU2FtIFdl
aW5pZy4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luL1BvcHVwTWVudVdpbi5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL3dpbi9Qb3B1cE1lbnVXaW4uY3BwCmluZGV4IGRkMDkxNzMuLjk2
MDgxNmIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vd2luL1BvcHVwTWVudVdpbi5jcHAK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW4vUG9wdXBNZW51V2luLmNwcApAQCAtODQsNyArODQs
NyBAQCBQb3B1cE1lbnU6On5Qb3B1cE1lbnUoKQogICAgIGlmIChtX2JtcCkKICAgICAgICAgOjpE
ZWxldGVPYmplY3QobV9ibXApOwogICAgIGlmIChtX0RDKQotICAgICAgICA6OkRlbGV0ZU9iamVj
dChtX0RDKTsKKyAgICAgICAgOjpEZWxldGVEQyhtX0RDKTsKICAgICBpZiAobV9wb3B1cCkKICAg
ICAgICAgOjpEZXN0cm95V2luZG93KG1fcG9wdXApOwogfQpAQCAtNTI1LDEwICs1MjUsMTIgQEAg
dm9pZCBQb3B1cE1lbnU6OnBhaW50KGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QsIEhEQyBoZGMp
CiAgICAgaWYgKG1fc2Nyb2xsYmFyKQogICAgICAgICBtX3Njcm9sbGJhci0+cGFpbnQoJmNvbnRl
eHQsIGRhbWFnZVJlY3QpOwogCi0gICAgaWYgKCFoZGMpCi0gICAgICAgIGhkYyA9IDo6R2V0REMo
bV9wb3B1cCk7CisgICAgSERDIGxvY2FsREMgPSBoZGMgPyBoZGMgOiA6OkdldERDKG1fcG9wdXAp
OworCisgICAgOjpCaXRCbHQobG9jYWxEQywgZGFtYWdlUmVjdC54KCksIGRhbWFnZVJlY3QueSgp
LCBkYW1hZ2VSZWN0LndpZHRoKCksIGRhbWFnZVJlY3QuaGVpZ2h0KCksIG1fREMsIGRhbWFnZVJl
Y3QueCgpLCBkYW1hZ2VSZWN0LnkoKSwgU1JDQ09QWSk7CiAKLSAgICA6OkJpdEJsdChoZGMsIGRh
bWFnZVJlY3QueCgpLCBkYW1hZ2VSZWN0LnkoKSwgZGFtYWdlUmVjdC53aWR0aCgpLCBkYW1hZ2VS
ZWN0LmhlaWdodCgpLCBtX0RDLCBkYW1hZ2VSZWN0LngoKSwgZGFtYWdlUmVjdC55KCksIFNSQ0NP
UFkpOworICAgIGlmICghaGRjKQorICAgICAgICA6OlJlbGVhc2VEQyhtX3BvcHVwLCBsb2NhbERD
KTsKIH0KIAogdm9pZCBQb3B1cE1lbnU6OnZhbHVlQ2hhbmdlZChTY3JvbGxiYXIqIHNjcm9sbEJh
cikK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33820</attachid>
            <date>2009-07-30 13:17:20 -0700</date>
            <delta_ts>2009-08-04 09:08:56 -0700</delta_ts>
            <desc>7) Color, Gradient, Image</desc>
            <filename>27511_7.patch</filename>
            <type>text/plain</type>
            <size>17785</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvQ29sb3JXaW5jZS5j
cHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0NvbG9yV2luY2UuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMGI5ZDIKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0NvbG9yV2luY2UuY3BwCkBAIC0wLDAg
KzEsMzggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJ
bmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29sb3Iu
aCIKKworI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworQ29sb3IgZm9jdXNSaW5nQ29sb3IoKQoreworICAgIHJldHVybiBDb2xvcigwLCAwLCAwKTsK
K30KKwordm9pZCBzZXRGb2N1c1JpbmdDb2xvckNoYW5nZUZ1bmN0aW9uKHZvaWQgKCopKCkpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVudFdpbmNlLmNw
cCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhZGllbnRXaW5jZS5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmYTk3MAotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhZGllbnRXaW5jZS5jcHAKQEAg
LTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUsIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAg
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiR3JhZGllbnQuaCIKKworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgR3JhZGllbnQ6OnBsYXRmb3JtRGVzdHJveSgp
Cit7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlU3RvcHMoY29uc3QgR3JhZGllbnQ6
OkNvbG9yU3RvcCYgYSwgY29uc3QgR3JhZGllbnQ6OkNvbG9yU3RvcCYgYikKK3sKKyAgICByZXR1
cm4gYS5zdG9wIDwgYi5zdG9wOworfQorCitjb25zdCBWZWN0b3I8R3JhZGllbnQ6OkNvbG9yU3Rv
cD4mIEdyYWRpZW50OjpnZXRTdG9wcygpIGNvbnN0Cit7CisgICAgaWYgKCFtX3N0b3BzU29ydGVk
KSB7CisgICAgICAgIGlmIChtX3N0b3BzLnNpemUoKSkKKyAgICAgICAgICAgIHN0ZDo6c3RhYmxl
X3NvcnQobV9zdG9wcy5iZWdpbigpLCBtX3N0b3BzLmVuZCgpLCBjb21wYXJlU3RvcHMpOworICAg
ICAgICBtX3N0b3BzU29ydGVkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIG1fc3RvcHM7Cit9
CisKK3ZvaWQgR3JhZGllbnQ6OmZpbGwoR3JhcGhpY3NDb250ZXh0KiBjLCBjb25zdCBGbG9hdFJl
Y3QmIHIpCit7CisgICAgYy0+ZmlsbFJlY3QociwgdGhpcyk7Cit9CisKK30KZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VTb3VyY2VXaW5jZS5jcHAgYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlU291cmNlV2luY2UuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNmNjYmQKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlU291cmNlV2luY2UuY3BwCkBA
IC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVy
LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBU
b2tlciA8YWxwLnRva2VyQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0y
MDA5IFRvcmNoIE1vYmlsZSwgSW5jCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkltYWdlU291cmNlLmgiCisKKyNpbmNsdWRlICJHSUZJbWFnZURlY29kZXIuaCIKKyNp
bmNsdWRlICJJbWFnZURlY29kZXIuaCIKKyNpbmNsdWRlICJKUEVHSW1hZ2VEZWNvZGVyLmgiCisj
aW5jbHVkZSAiUE5HSW1hZ2VEZWNvZGVyLmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCisj
aW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisKKyNpbmNs
dWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordHlwZWRlZiBIYXNoU2V0
PFNoYXJlZEJpdG1hcCo+IEJpdG1hcE1hcDsKK2V4dGVybiBCaXRtYXBNYXAgZ19iaXRtYXBNYXA7
CisKK2ludCBkaXNjYXJkQml0bWFwSGFuZGxlcygpCit7CisgICAgaW50IGRlbGV0ZWQgPSAwOwor
ICAgIGZvciAoQml0bWFwTWFwOjppdGVyYXRvciBpID0gZ19iaXRtYXBNYXAuYmVnaW4oKTsgaSAh
PSBnX2JpdG1hcE1hcC5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmICgoKmkpLT5mcmVlTWVtb3J5
KCkpCisgICAgICAgICAgICArK2RlbGV0ZWQ7CisgICAgfQorICAgIHJldHVybiBkZWxldGVkOwor
fQorCitzdGF0aWMgSW1hZ2VEZWNvZGVyKiBjcmVhdGVEZWNvZGVyKGNvbnN0IFNoYXJlZEJ1ZmZl
ciogYnVmZmVyKQoreworICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7CisKKyAg
ICAvLyBXZSBuZWVkIGF0IGxlYXN0IDQgYnl0ZXMgdG8gZmlndXJlIG91dCB3aGF0IGtpbmQgb2Yg
aW1hZ2Ugd2UncmUgZGVhbGluZyB3aXRoLgorICAgIFNoYXJlZEJ1ZmZlclNlZ21lbnQgc2VnbWVu
dCgqYnVmZmVyKTsKKyAgICBpbnQgbGVuZ3RoID0gc2VnbWVudC5sZW5ndGgoKTsKKyAgICBpZiAo
bGVuZ3RoIDwgNCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBHSUZzIGJlZ2luIHdpdGgg
R0lGOCg3IG9yIDkpLgorICAgIGlmIChzdHJuY21wKHNlZ21lbnQuZGF0YSgpLCAiR0lGOCIsIDQp
ID09IDApIHsKKyAgICAgICAgR0lGSW1hZ2VEZWNvZGVyKiBydG4gPSBuZXcgR0lGSW1hZ2VEZWNv
ZGVyKCk7CisgICAgICAgIGlmIChydG4pCisgICAgICAgICAgICBydG4tPnNldE1heE51bVBpeGVs
cygxMDI0ICogMTAyNCk7CisgICAgICAgIHJldHVybiBydG47CisgICAgfQorCisgICAgY29uc3Qg
dW5zaWduZWQgY2hhciogdUNvbnRlbnRzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKXNlZ21lbnQu
ZGF0YSgpOworCisgICAgLy8gVGVzdCBmb3IgUE5HLgorICAgIGlmICh1Q29udGVudHNbMF0gPT0g
MHg4OSAmJiB1Q29udGVudHNbMV0gPT0gMHg1MCAmJiB1Q29udGVudHNbMl0gPT0gMHg0RSAmJiB1
Q29udGVudHNbM10gPT0gMHg0NyApIHsKKyAgICAgICAgUE5HSW1hZ2VEZWNvZGVyKiBydG4gPSBu
ZXcgUE5HSW1hZ2VEZWNvZGVyKCk7CisgICAgICAgIGlmIChydG4pCisgICAgICAgICAgICBydG4t
PnNldE1heE51bVBpeGVscygxMDI0ICogMTAyNCk7CisgICAgICAgIHJldHVybiBydG47CisgICAg
fQorCisgICAgLy8gSlBFRworICAgIGlmICh1Q29udGVudHNbMF0gPT0gMHhGRiAmJiB1Q29udGVu
dHNbMV0gPT0gMHhEOCAmJiB1Q29udGVudHNbMl0gPT0gMHhGRikgeworICAgICAgICBKUEVHSW1h
Z2VEZWNvZGVyKiBydG4gPSBuZXcgSlBFR0ltYWdlRGVjb2RlcigpOworICAgICAgICBpZiAocnRu
KQorICAgICAgICAgICAgcnRuLT5zZXRNYXhOdW1QaXhlbHMoMTAyNCAqIDEwMjQpOworICAgICAg
ICByZXR1cm4gcnRuOworICAgIH0KKworICAgIC8vIEZJWE1FOiBub3Qgc3VwcG9ydGluZyBCTVAs
IElDTyBhbmQgWEJNIGZvciBub3cuCisKKyAgICAvLyBHaXZlIHVwLiBXZSBkb24ndCBrbm93IHdo
YXQgdGhlIGhlY2sgdGhpcyBpcy4KKyAgICByZXR1cm4gMDsKK30KKworSW1hZ2VTb3VyY2U6Oklt
YWdlU291cmNlKCkKKyAgICA6IG1fZGVjb2RlcigwKQoreworfQorCitJbWFnZVNvdXJjZTo6fklt
YWdlU291cmNlKCkKK3sKKyAgICBkZWxldGUgbV9kZWNvZGVyOworfQorCit2b2lkIEltYWdlU291
cmNlOjpjbGVhcihib29sIGRlc3Ryb3lBbGwsIHNpemVfdCBjbGVhckJlZm9yZUZyYW1lLCBTaGFy
ZWRCdWZmZXIqIGRhdGEsIGJvb2wgYWxsRGF0YVJlY2VpdmVkKQoreworICAgIGlmIChkZXN0cm95
QWxsKSB7CisgICAgICAgIGRlbGV0ZSBtX2RlY29kZXI7CisgICAgICAgIG1fZGVjb2RlciA9IDA7
CisgICAgICAgIGlmIChkYXRhKQorICAgICAgICAgIHNldERhdGEoZGF0YSwgYWxsRGF0YVJlY2Vp
dmVkKTsKKyAgICB9IGVsc2UgaWYgKG1fZGVjb2RlcikKKyAgICAgICAgbV9kZWNvZGVyLT5jbGVh
ckZyYW1lQnVmZmVyQ2FjaGUoY2xlYXJCZWZvcmVGcmFtZSk7Cit9CisKK2Jvb2wgSW1hZ2VTb3Vy
Y2U6OmluaXRpYWxpemVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gISFtX2RlY29kZXI7Cit9CisK
K3ZvaWQgSW1hZ2VTb3VyY2U6OnNldERhdGEoU2hhcmVkQnVmZmVyKiBkYXRhLCBib29sIGFsbERh
dGFSZWNlaXZlZCkKK3sKKyAgICAvLyBNYWtlIHRoZSBkZWNvZGVyIGJ5IHNuaWZmaW5nIHRoZSBi
eXRlcy4KKyAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIGV4YW1pbmUgdGhlIGRhdGEgYW5kIGluc3Rh
bnRpYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSBkZWNvZGVyIHBsdWdpbi4KKyAg
ICAvLyBJZiBpbnN1ZmZpY2llbnQgYnl0ZXMgYXJlIGF2YWlsYWJsZSB0byBkZXRlcm1pbmUgdGhl
IGltYWdlIHR5cGUsIG5vIGRlY29kZXIgcGx1Z2luIHdpbGwgYmUKKyAgICAvLyBtYWRlLgorICAg
IGlmIChhbGxEYXRhUmVjZWl2ZWQgJiYgIW1fZGVjb2RlcikKKyAgICAgICAgbV9kZWNvZGVyID0g
Y3JlYXRlRGVjb2RlcihkYXRhKTsKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJu
OworICAgIG1fZGVjb2Rlci0+c2V0RGF0YShkYXRhLCBhbGxEYXRhUmVjZWl2ZWQpOworfQorCiti
b29sIEltYWdlU291cmNlOjppc1NpemVBdmFpbGFibGUoKQoreworICAgIGlmICghbV9kZWNvZGVy
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gbV9kZWNvZGVyLT5pc1NpemVB
dmFpbGFibGUoKTsKK30KKworSW50U2l6ZSBJbWFnZVNvdXJjZTo6c2l6ZSgpIGNvbnN0Cit7Cisg
ICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybiBJbnRTaXplKCk7CisKKyAgICByZXR1
cm4gbV9kZWNvZGVyLT5zaXplKCk7Cit9CisKK2ludCBJbWFnZVNvdXJjZTo6cmVwZXRpdGlvbkNv
dW50KCkKK3sKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIGNBbmltYXRpb25O
b25lOworCisgICAgcmV0dXJuIG1fZGVjb2Rlci0+cmVwZXRpdGlvbkNvdW50KCk7Cit9CisKK3Np
emVfdCBJbWFnZVNvdXJjZTo6ZnJhbWVDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGVj
b2RlciA/IG1fZGVjb2Rlci0+ZnJhbWVDb3VudCgpIDogMDsKK30KKworTmF0aXZlSW1hZ2VQdHIg
SW1hZ2VTb3VyY2U6OmNyZWF0ZUZyYW1lQXRJbmRleChzaXplX3QgaW5kZXgpCit7CisgICAgaWYg
KCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybiAwOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1
ZmZlciA9IG1fZGVjb2Rlci0+ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKworICAgIGlmICgh
YnVmZmVyIHx8IGJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5KQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBidWZmZXItPmdldEZyYW1lKCk7Cit9CisK
K2Jvb2wgSW1hZ2VTb3VyY2U6OmZyYW1lSXNDb21wbGV0ZUF0SW5kZXgoc2l6ZV90IGluZGV4KQor
eworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBJbWFn
ZUZyYW1lU2luayogYnVmZmVyID0gbV9kZWNvZGVyLT5mcmFtZUJ1ZmZlckF0SW5kZXgoaW5kZXgp
OworICAgIHJldHVybiBidWZmZXIgJiYgYnVmZmVyLT5zdGF0dXMoKSA9PSBSR0JBMzJCdWZmZXI6
OkZyYW1lQ29tcGxldGU7Cit9CisKK2Zsb2F0IEltYWdlU291cmNlOjpmcmFtZUR1cmF0aW9uQXRJ
bmRleChzaXplX3QgaW5kZXgpCit7CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVy
biAwOworCisgICAgZmxvYXQgZHVyYXRpb247CisKKyAgICBJbWFnZUZyYW1lU2luayogYnVmZmVy
ID0gbV9kZWNvZGVyLT5mcmFtZUJ1ZmZlckF0SW5kZXgoaW5kZXgpOworICAgIGlmICghYnVmZmVy
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGR1cmF0aW9uID0gYnVmZmVyLT5kdXJhdGlvbigp
IC8gMTAwMC4wZjsKKworICAgIC8vIE1hbnkgYW5ub3lpbmcgYWRzIHNwZWNpZnkgYSAwIGR1cmF0
aW9uIHRvIG1ha2UgYW4gaW1hZ2UgZmxhc2ggYXMgcXVpY2tseQorICAgIC8vIGFzIHBvc3NpYmxl
LiAgV2UgZm9sbG93IFdpbklFJ3MgYmVoYXZpb3IgYW5kIHVzZSBhIGR1cmF0aW9uIG9mIDEwMCBt
cworICAgIC8vIGZvciBhbnkgZnJhbWVzIHRoYXQgc3BlY2lmeSBhIGR1cmF0aW9uIG9mIDw9IDUw
IG1zLiAgU2VlCisgICAgLy8gPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTE0NDEzPiBvciBSYWRhciA0MDUxMzg5IGZvcgorICAgIC8vIG1vcmUuCisgICAgcmV0dXJuIChk
dXJhdGlvbiA8IDAuMDUxZikgPyAwLjEwMGYgOiBkdXJhdGlvbjsKK30KKworYm9vbCBJbWFnZVNv
dXJjZTo6ZnJhbWVIYXNBbHBoYUF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIGlmICghbV9k
ZWNvZGVyIHx8ICFtX2RlY29kZXItPnN1cHBvcnRzQWxwaGEoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9IG1fZGVjb2Rlci0+ZnJhbWVCdWZm
ZXJBdEluZGV4KGluZGV4KTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgcmV0dXJuIGJ1ZmZlci0+aGFzQWxwaGEoKTsKK30KKworSW50U2l6ZSBJbWFnZVNv
dXJjZTo6ZnJhbWVTaXplQXRJbmRleChzaXplX3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIHNpemUo
KTsKK30KKworU3RyaW5nIEltYWdlU291cmNlOjpmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0Cit7
CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICByZXR1
cm4gbV9kZWNvZGVyLT5maWxlbmFtZUV4dGVuc2lvbigpOworfQorCit9CisKKy8vIHZpbTogdHM9
NCBzdz00IGV0CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0lt
YWdlV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVdpbmNl
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNiMTZhCi0tLSAvZGV2
L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVdpbmNlLmNw
cApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBs
ZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkg
VG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
SW1hZ2UuaCIKKworI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9y
bVN0cmluZy5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorI2luY2x1ZGUgIlRyYW5zZm9y
bWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCisjaW5jbHVkZSA8d2lu
ZG93cy5oPgorCitzdGF0aWMgaW5saW5lIGludCBzdGFibGVSb3VuZChkb3VibGUgZCkKK3sKKyAg
ICBpZiAoZCA+IDApCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGQgKyAwLjUpOwor
CisgICAgaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGQpOworICAgIHJldHVybiBpIC0gZCA+IDAu
NSA/IGkgLSAxIDogaTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJv
bSBXZWJLaXQKK1Bhc3NSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBsb2FkUmVzb3VyY2VJ
bnRvQnVmZmVyKGNvbnN0IGNoYXIqIG5hbWUpOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Jv
b2wgRnJhbWVEYXRhOjpjbGVhcihib29sIGNsZWFyTWV0YURhdGEpCit7CisgICAgaWYgKGNsZWFy
TWV0YURhdGEpCisgICAgICAgIG1faGF2ZU1ldGFkYXRhID0gZmFsc2U7CisKKyAgICBpZiAobV9m
cmFtZSkgeworICAgICAgICBtX2ZyYW1lID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
fQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJpdG1hcEltYWdlOjppbml0UGxhdGZv
cm1EYXRhKCkKK3sKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6aW52YWxpZGF0ZVBsYXRmb3JtRGF0
YSgpCit7Cit9CisKK2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVAoSEJJVE1BUCBibXApCit7
CisgICAgcmV0dXJuIGdldEhCSVRNQVBPZlNpemUoYm1wLCAwKTsKK30KKworYm9vbCBCaXRtYXBJ
bWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwgTFBTSVpFIHNpemUpCit7CisgICAg
aWYgKCFibXApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEJJVE1BUCBibXBJbmZvOwor
ICAgIEdldE9iamVjdChibXAsIHNpemVvZihCSVRNQVApLCAmYm1wSW5mbyk7CisKKyAgICBBU1NF
UlQoYm1wSW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJ
bmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CisKKyAgICBPd25QdHI8SERDPiBo
ZGMoQ3JlYXRlQ29tcGF0aWJsZURDKDApKTsKKyAgICBIR0RJT0JKIGhPbGRCbXAgPSBTZWxlY3RP
YmplY3QoaGRjLmdldCgpLCBibXApOworCisgICAgeworICAgICAgICBHcmFwaGljc0NvbnRleHQg
Z2MoaGRjLmdldCgpKTsKKworICAgICAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdl
OjpzaXplKCk7CisgICAgICAgIGlmIChzaXplKQorICAgICAgICAgICAgZHJhd0ZyYW1lTWF0Y2hp
bmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5m
by5ibUhlaWdodCksIEludFNpemUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgs
IGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGlt
YWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOworICAgIH0KKworICAgIFNlbGVjdE9i
amVjdChoZGMuZ2V0KCksIGhPbGRCbXApOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
Qml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQq
IGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwg
Q29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgaW50IGZyYW1lcyA9IGZyYW1l
Q291bnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7CisgICAgICAg
IFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCA9IGZyYW1lQXRJbmRleChpKTsKKyAgICAgICAgaWYg
KGJtcCAmJiBibXAtPmhlaWdodCgpID09IChzaXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAmJiBibXAt
PndpZHRoKCkgPT0gKHNpemVfdClzcmNTaXplLndpZHRoKCkpIHsKKyAgICAgICAgICAgIHNpemVf
dCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIG1fY3VycmVudEZy
YW1lID0gaTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAs
IHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICAg
ICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm8gaW1hZ2Ugb2YgdGhlIGNvcnJlY3Qgc2l6
ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBJ
bnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAgZHJhdyhjdHh0LCBk
c3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWln
aHQoKSksIGNvbXBvc2l0ZU9wKTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhdyhHcmFwaGlj
c0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgRmxvYXRSZWN0
JiBzcmNSZWN0SW4sIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGlmICgh
bV9zb3VyY2UuaW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUmVmUHRyPFNo
YXJlZEJpdG1hcD4gYm1wID0gZnJhbWVBdEluZGV4KG1fY3VycmVudEZyYW1lKTsKKyAgICBpZiAo
bWF5RmlsbFdpdGhTb2xpZENvbG9yKCkpCisgICAgICAgIGZpbGxXaXRoU29saWRDb2xvcihjdHh0
LCBkc3RSZWN0LCBzb2xpZENvbG9yKCksIGNvbXBvc2l0ZU9wKTsKKyAgICBlbHNlIHsKKyAgICAg
ICAgSW50UmVjdCBpbnRTcmNSZWN0KHNyY1JlY3RJbik7CisKKyAgICAgICAgaWYgKGJtcC0+d2lk
dGgoKSAhPSBtX3NvdXJjZS5zaXplKCkud2lkdGgoKSkgeworICAgICAgICAgICAgZG91YmxlIHJh
dGUgPSAoZG91YmxlKWJtcC0+d2lkdGgoKSAvIG1fc291cmNlLnNpemUoKS53aWR0aCgpOworICAg
ICAgICAgICAgaW50IHRlbXAgPSBzdGFibGVSb3VuZChzcmNSZWN0SW4ucmlnaHQoKSAqIHJhdGUp
OworICAgICAgICAgICAgaW50U3JjUmVjdC5zZXRYKHN0YWJsZVJvdW5kKHNyY1JlY3RJbi54KCkg
KiByYXRlKSk7CisgICAgICAgICAgICBpbnRTcmNSZWN0LnNldFdpZHRoKHRlbXAgLSBpbnRTcmNS
ZWN0LngoKSk7CisgICAgICAgICAgICB0ZW1wID0gc3RhYmxlUm91bmQoc3JjUmVjdEluLmJvdHRv
bSgpICogcmF0ZSk7CisgICAgICAgICAgICBpbnRTcmNSZWN0LnNldFkoc3RhYmxlUm91bmQoc3Jj
UmVjdEluLnkoKSAqIHJhdGUpKTsKKyAgICAgICAgICAgIGludFNyY1JlY3Quc2V0SGVpZ2h0KHRl
bXAgLSBpbnRTcmNSZWN0LnkoKSk7CisgICAgICAgIH0KKyAgICAgICAgYm1wLT5kcmF3KGN0eHQs
IGVuY2xvc2luZ0ludFJlY3QoZHN0UmVjdCksIGludFNyY1JlY3QsIGNvbXBvc2l0ZU9wKTsKKyAg
ICB9CisKKyAgICBzdGFydEFuaW1hdGlvbigpOworfQorCitQYXNzUmVmUHRyPEltYWdlPiBJbWFn
ZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBSZWZQdHI8
U2hhcmVkQnVmZmVyPiBidWZmZXIgPSBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKG5hbWUpOworICAg
IFJlZlB0cjxCaXRtYXBJbWFnZT4gaW1nID0gQml0bWFwSW1hZ2U6OmNyZWF0ZSgpOworICAgIGlt
Zy0+c2V0RGF0YShidWZmZXIucmVsZWFzZSgpLCB0cnVlKTsKKyAgICByZXR1cm4gaW1nOworfQor
Cit2b2lkIEltYWdlOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZs
b2F0UmVjdCYgdGlsZVJlY3QsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJh
bnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2Us
IENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KQoreworICAg
IG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXdQYXR0ZXJuKEdy
YXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29u
c3QgRmxvYXRSZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBSZWZQdHI8U2hhcmVkQml0bWFwPiBibXAg
PSBuYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgIGlmIChibXApCisgICAgICAgIGJt
cC0+ZHJhd1BhdHRlcm4oY3R4dCwgdGlsZVJlY3RJbiwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2Us
IG9wLCBkZXN0UmVjdCwgbV9zb3VyY2Uuc2l6ZSgpKTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6
Y2hlY2tGb3JTb2xpZENvbG9yKCkKK3sKKyAgICBpZiAobV9jaGVja2VkRm9yU29saWRDb2xvcikK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGZyYW1lQ291bnQoKSAhPSAxKSB7CisgICAgICAg
IG1faXNTb2xpZENvbG9yID0gZmFsc2U7CisgICAgICAgIG1fY2hlY2tlZEZvclNvbGlkQ29sb3Ig
PSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUmVmUHRyPFNoYXJlZEJpdG1h
cD4gYm1wID0gZnJhbWVBdEluZGV4KDApOworICAgIGlmICghYm1wIHx8ICFibXAtPnZhbGlkSGVp
Z2h0KCkpIHsKKyAgICAgICAgbV9pc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIGlmIChibXAtPndpZHRoKCkgPT0gMSAmJiBibXAtPnZhbGlkSGVpZ2h0
KCkgPT0gMSkgeworICAgICAgICBtX2lzU29saWRDb2xvciA9IHRydWU7CisKKyAgICAgICAgaWYg
KGJtcC0+aXMxNmJpdCgpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBjID0gKCh1bnNp
Z25lZCBzaG9ydCAqKWJtcC0+Ynl0ZXMoKSlbMF07CisjaWYgSU1BR0VfTk9fQUxQSEFfVVNFX1JH
QjU1NQorICAgICAgICAgICAgaW50IHIgPSAoYyA+PiA3KSAmIDB4Rjg7CisgICAgICAgICAgICBp
bnQgZyA9IChjID4+IDIpICYgMHhGODsKKyAgICAgICAgICAgIGludCBiID0gKGMgPDwgMykgJiAw
eEY4OworI2Vsc2UKKyAgICAgICAgICAgIGludCByID0gKGMgPj4gOCkgJiAweEY4OworICAgICAg
ICAgICAgaW50IGcgPSAoYyA+PiAzKSAmIDB4RkM7CisgICAgICAgICAgICBpbnQgYiA9IChjIDw8
IDMpICYgMHhGODsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGJtcC0+dXNlc1RyYW5zcGFyZW50
Q29sb3IoKSAmJiBibXAtPnRyYW5zcGFyZW50Q29sb3IoKSA9PSBSR0IociwgZywgYikpCisgICAg
ICAgICAgICAgICAgbV9zb2xpZENvbG9yID0gQ29sb3IociwgZywgYiwgMCk7CisgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgbV9zb2xpZENvbG9yID0gQ29sb3IociwgZywgYik7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjID0gKCh1bnNpZ25lZCAqKWJt
cC0+Ynl0ZXMoKSlbMF07CisgICAgICAgICAgICBtX3NvbGlkQ29sb3IgPSBDb2xvcihjKTsKKyAg
ICAgICAgfQorCisgICAgICAgIGlmIChibXAtPnZhbGlkSGVpZ2h0KCkgPT0gYm1wLT5oZWlnaHQo
KSkKKyAgICAgICAgICAgIG1fY2hlY2tlZEZvclNvbGlkQ29sb3IgPSB0cnVlOworICAgIH0gZWxz
ZSB7CisgICAgICAgIG1faXNTb2xpZENvbG9yID0gZmFsc2U7CisgICAgICAgIG1fY2hlY2tlZEZv
clNvbGlkQ29sb3IgPSB0cnVlOworICAgIH0KK30KKworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34068</attachid>
            <date>2009-08-04 09:08:56 -0700</date>
            <delta_ts>2009-08-08 13:12:31 -0700</delta_ts>
            <desc>7) Color, Gradient, Image</desc>
            <filename>27511_7.patch</filename>
            <type>text/plain</type>
            <size>17790</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">KiBVbm1lcmdlZCBwYXRoIFdlYkNvcmUvQ2hhbmdlTG9nCmRpZmYgLS1naXQgYS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL0NvbG9yV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9Db2xvcldpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi44MjBiOWQyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9Db2xvcldpbmNlLmNwcApAQCAtMCwwICsxLDM4IEBACisvKgorICogIENvcHly
aWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAg
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbG9yLmgiCisKKyNpbmNsdWRlICJOb3RJbXBs
ZW1lbnRlZC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0NvbG9yIGZvY3VzUmluZ0NvbG9y
KCkKK3sKKyAgICByZXR1cm4gQ29sb3IoMCwgMCwgMCk7Cit9CisKK3ZvaWQgc2V0Rm9jdXNSaW5n
Q29sb3JDaGFuZ2VGdW5jdGlvbih2b2lkICgqKSgpKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvR3JhZGllbnRXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL0dyYWRpZW50V2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjQ5ZmE5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL0dyYWRpZW50V2luY2UuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAg
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5v
dCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG
cmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICovCisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYWRpZW50Lmgi
CisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit2b2lkIEdyYWRpZW50OjpwbGF0Zm9ybURlc3Ryb3koKQoreworfQorCitzdGF0aWMgaW5saW5l
IGJvb2wgY29tcGFyZVN0b3BzKGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AmIGEsIGNvbnN0IEdy
YWRpZW50OjpDb2xvclN0b3AmIGIpCit7CisgICAgcmV0dXJuIGEuc3RvcCA8IGIuc3RvcDsKK30K
KworY29uc3QgVmVjdG9yPEdyYWRpZW50OjpDb2xvclN0b3A+JiBHcmFkaWVudDo6Z2V0U3RvcHMo
KSBjb25zdAoreworICAgIGlmICghbV9zdG9wc1NvcnRlZCkgeworICAgICAgICBpZiAobV9zdG9w
cy5zaXplKCkpCisgICAgICAgICAgICBzdGQ6OnN0YWJsZV9zb3J0KG1fc3RvcHMuYmVnaW4oKSwg
bV9zdG9wcy5lbmQoKSwgY29tcGFyZVN0b3BzKTsKKyAgICAgICAgbV9zdG9wc1NvcnRlZCA9IHRy
dWU7CisgICAgfQorICAgIHJldHVybiBtX3N0b3BzOworfQorCit2b2lkIEdyYWRpZW50OjpmaWxs
KEdyYXBoaWNzQ29udGV4dCogYywgY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIGMtPmZpbGxS
ZWN0KHIsIHRoaXMpOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL0ltYWdlU291cmNlV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9JbWFnZVNvdXJjZVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi5hMzZjY2JkCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9JbWFnZVNvdXJjZVdpbmNlLmNwcApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscC50b2tlckBjb2xsYWJv
cmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYwor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVU
RVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZVNvdXJjZS5oIgor
CisjaW5jbHVkZSAiR0lGSW1hZ2VEZWNvZGVyLmgiCisjaW5jbHVkZSAiSW1hZ2VEZWNvZGVyLmgi
CisjaW5jbHVkZSAiSlBFR0ltYWdlRGVjb2Rlci5oIgorI2luY2x1ZGUgIlBOR0ltYWdlRGVjb2Rl
ci5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4K
KyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK3R5cGVkZWYgSGFzaFNldDxTaGFyZWRCaXRtYXAqPiBCaXRtYXBN
YXA7CitleHRlcm4gQml0bWFwTWFwIGdfYml0bWFwTWFwOworCitpbnQgZGlzY2FyZEJpdG1hcEhh
bmRsZXMoKQoreworICAgIGludCBkZWxldGVkID0gMDsKKyAgICBmb3IgKEJpdG1hcE1hcDo6aXRl
cmF0b3IgaSA9IGdfYml0bWFwTWFwLmJlZ2luKCk7IGkgIT0gZ19iaXRtYXBNYXAuZW5kKCk7ICsr
aSkgeworICAgICAgICBpZiAoKCppKS0+ZnJlZU1lbW9yeSgpKQorICAgICAgICAgICAgKytkZWxl
dGVkOworICAgIH0KKyAgICByZXR1cm4gZGVsZXRlZDsKK30KKworc3RhdGljIEltYWdlRGVjb2Rl
ciogY3JlYXRlRGVjb2Rlcihjb25zdCBTaGFyZWRCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBNZW1v
cnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOworCisgICAgLy8gV2UgbmVlZCBhdCBsZWFzdCA0
IGJ5dGVzIHRvIGZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIGltYWdlIHdlJ3JlIGRlYWxpbmcgd2l0
aC4KKyAgICBTaGFyZWRCdWZmZXJTZWdtZW50IHNlZ21lbnQoKmJ1ZmZlcik7CisgICAgaW50IGxl
bmd0aCA9IHNlZ21lbnQubGVuZ3RoKCk7CisgICAgaWYgKGxlbmd0aCA8IDQpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgLy8gR0lGcyBiZWdpbiB3aXRoIEdJRjgoNyBvciA5KS4KKyAgICBpZiAo
c3RybmNtcChzZWdtZW50LmRhdGEoKSwgIkdJRjgiLCA0KSA9PSAwKSB7CisgICAgICAgIEdJRklt
YWdlRGVjb2RlciogcnRuID0gbmV3IEdJRkltYWdlRGVjb2RlcigpOworICAgICAgICBpZiAocnRu
KQorICAgICAgICAgICAgcnRuLT5zZXRNYXhOdW1QaXhlbHMoMTAyNCAqIDEwMjQpOworICAgICAg
ICByZXR1cm4gcnRuOworICAgIH0KKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHVDb250ZW50
cyA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilzZWdtZW50LmRhdGEoKTsKKworICAgIC8vIFRlc3Qg
Zm9yIFBORy4KKyAgICBpZiAodUNvbnRlbnRzWzBdID09IDB4ODkgJiYgdUNvbnRlbnRzWzFdID09
IDB4NTAgJiYgdUNvbnRlbnRzWzJdID09IDB4NEUgJiYgdUNvbnRlbnRzWzNdID09IDB4NDcgKSB7
CisgICAgICAgIFBOR0ltYWdlRGVjb2RlciogcnRuID0gbmV3IFBOR0ltYWdlRGVjb2RlcigpOwor
ICAgICAgICBpZiAocnRuKQorICAgICAgICAgICAgcnRuLT5zZXRNYXhOdW1QaXhlbHMoMTAyNCAq
IDEwMjQpOworICAgICAgICByZXR1cm4gcnRuOworICAgIH0KKworICAgIC8vIEpQRUcKKyAgICBp
ZiAodUNvbnRlbnRzWzBdID09IDB4RkYgJiYgdUNvbnRlbnRzWzFdID09IDB4RDggJiYgdUNvbnRl
bnRzWzJdID09IDB4RkYpIHsKKyAgICAgICAgSlBFR0ltYWdlRGVjb2RlciogcnRuID0gbmV3IEpQ
RUdJbWFnZURlY29kZXIoKTsKKyAgICAgICAgaWYgKHJ0bikKKyAgICAgICAgICAgIHJ0bi0+c2V0
TWF4TnVtUGl4ZWxzKDEwMjQgKiAxMDI0KTsKKyAgICAgICAgcmV0dXJuIHJ0bjsKKyAgICB9CisK
KyAgICAvLyBGSVhNRTogbm90IHN1cHBvcnRpbmcgQk1QLCBJQ08gYW5kIFhCTSBmb3Igbm93Lgor
CisgICAgLy8gR2l2ZSB1cC4gV2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBoZWNrIHRoaXMgaXMuCisg
ICAgcmV0dXJuIDA7Cit9CisKK0ltYWdlU291cmNlOjpJbWFnZVNvdXJjZSgpCisgICAgOiBtX2Rl
Y29kZXIoMCkKK3sKK30KKworSW1hZ2VTb3VyY2U6On5JbWFnZVNvdXJjZSgpCit7CisgICAgZGVs
ZXRlIG1fZGVjb2RlcjsKK30KKwordm9pZCBJbWFnZVNvdXJjZTo6Y2xlYXIoYm9vbCBkZXN0cm95
QWxsLCBzaXplX3QgY2xlYXJCZWZvcmVGcmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhLCBib29sIGFs
bERhdGFSZWNlaXZlZCkKK3sKKyAgICBpZiAoZGVzdHJveUFsbCkgeworICAgICAgICBkZWxldGUg
bV9kZWNvZGVyOworICAgICAgICBtX2RlY29kZXIgPSAwOworICAgICAgICBpZiAoZGF0YSkKKyAg
ICAgICAgICBzZXREYXRhKGRhdGEsIGFsbERhdGFSZWNlaXZlZCk7CisgICAgfSBlbHNlIGlmICht
X2RlY29kZXIpCisgICAgICAgIG1fZGVjb2Rlci0+Y2xlYXJGcmFtZUJ1ZmZlckNhY2hlKGNsZWFy
QmVmb3JlRnJhbWUpOworfQorCitib29sIEltYWdlU291cmNlOjppbml0aWFsaXplZCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuICEhbV9kZWNvZGVyOworfQorCit2b2lkIEltYWdlU291cmNlOjpzZXRE
YXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpCit7CisgICAgLy8g
TWFrZSB0aGUgZGVjb2RlciBieSBzbmlmZmluZyB0aGUgYnl0ZXMuCisgICAgLy8gVGhpcyBtZXRo
b2Qgd2lsbCBleGFtaW5lIHRoZSBkYXRhIGFuZCBpbnN0YW50aWF0ZSBhbiBpbnN0YW5jZSBvZiB0
aGUgYXBwcm9wcmlhdGUgZGVjb2RlciBwbHVnaW4uCisgICAgLy8gSWYgaW5zdWZmaWNpZW50IGJ5
dGVzIGFyZSBhdmFpbGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBpbWFnZSB0eXBlLCBubyBkZWNvZGVy
IHBsdWdpbiB3aWxsIGJlCisgICAgLy8gbWFkZS4KKyAgICBpZiAoYWxsRGF0YVJlY2VpdmVkICYm
ICFtX2RlY29kZXIpCisgICAgICAgIG1fZGVjb2RlciA9IGNyZWF0ZURlY29kZXIoZGF0YSk7Cisg
ICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybjsKKyAgICBtX2RlY29kZXItPnNldERh
dGEoZGF0YSwgYWxsRGF0YVJlY2VpdmVkKTsKK30KKworYm9vbCBJbWFnZVNvdXJjZTo6aXNTaXpl
QXZhaWxhYmxlKCkKK3sKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgcmV0dXJuIG1fZGVjb2Rlci0+aXNTaXplQXZhaWxhYmxlKCk7Cit9CisKK0ludFNp
emUgSW1hZ2VTb3VyY2U6OnNpemUoKSBjb25zdAoreworICAgIGlmICghbV9kZWNvZGVyKQorICAg
ICAgICByZXR1cm4gSW50U2l6ZSgpOworCisgICAgcmV0dXJuIG1fZGVjb2Rlci0+c2l6ZSgpOwor
fQorCitpbnQgSW1hZ2VTb3VyY2U6OnJlcGV0aXRpb25Db3VudCgpCit7CisgICAgaWYgKCFtX2Rl
Y29kZXIpCisgICAgICAgIHJldHVybiBjQW5pbWF0aW9uTm9uZTsKKworICAgIHJldHVybiBtX2Rl
Y29kZXItPnJlcGV0aXRpb25Db3VudCgpOworfQorCitzaXplX3QgSW1hZ2VTb3VyY2U6OmZyYW1l
Q291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtX2RlY29kZXIgPyBtX2RlY29kZXItPmZyYW1l
Q291bnQoKSA6IDA7Cit9CisKK05hdGl2ZUltYWdlUHRyIEltYWdlU291cmNlOjpjcmVhdGVGcmFt
ZUF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIEltYWdlRnJhbWVTaW5rKiBidWZmZXIgPSBtX2RlY29kZXItPmZyYW1l
QnVmZmVyQXRJbmRleChpbmRleCk7CisKKyAgICBpZiAoIWJ1ZmZlciB8fCBidWZmZXItPnN0YXR1
cygpID09IFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICByZXR1cm4gYnVmZmVyLT5nZXRGcmFtZSgpOworfQorCitib29sIEltYWdlU291cmNlOjpmcmFt
ZUlzQ29tcGxldGVBdEluZGV4KHNpemVfdCBpbmRleCkKK3sKKyAgICBpZiAoIW1fZGVjb2RlcikK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9IG1f
ZGVjb2Rlci0+ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKyAgICByZXR1cm4gYnVmZmVyICYm
IGJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlOworfQorCitm
bG9hdCBJbWFnZVNvdXJjZTo6ZnJhbWVEdXJhdGlvbkF0SW5kZXgoc2l6ZV90IGluZGV4KQorewor
ICAgIGlmICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZsb2F0IGR1cmF0
aW9uOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9IG1fZGVjb2Rlci0+ZnJhbWVCdWZm
ZXJBdEluZGV4KGluZGV4KTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBkdXJhdGlvbiA9IGJ1ZmZlci0+ZHVyYXRpb24oKSAvIDEwMDAuMGY7CisKKyAgICAvLyBN
YW55IGFubm95aW5nIGFkcyBzcGVjaWZ5IGEgMCBkdXJhdGlvbiB0byBtYWtlIGFuIGltYWdlIGZs
YXNoIGFzIHF1aWNrbHkKKyAgICAvLyBhcyBwb3NzaWJsZS4gIFdlIGZvbGxvdyBXaW5JRSdzIGJl
aGF2aW9yIGFuZCB1c2UgYSBkdXJhdGlvbiBvZiAxMDAgbXMKKyAgICAvLyBmb3IgYW55IGZyYW1l
cyB0aGF0IHNwZWNpZnkgYSBkdXJhdGlvbiBvZiA8PSA1MCBtcy4gIFNlZQorICAgIC8vIDxodHRw
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDQxMz4gb3IgUmFkYXIgNDA1MTM4
OSBmb3IKKyAgICAvLyBtb3JlLgorICAgIHJldHVybiAoZHVyYXRpb24gPCAwLjA1MWYpID8gMC4x
MDBmIDogZHVyYXRpb247Cit9CisKK2Jvb2wgSW1hZ2VTb3VyY2U6OmZyYW1lSGFzQWxwaGFBdElu
ZGV4KHNpemVfdCBpbmRleCkKK3sKKyAgICBpZiAoIW1fZGVjb2RlciB8fCAhbV9kZWNvZGVyLT5z
dXBwb3J0c0FscGhhKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEltYWdlRnJhbWVT
aW5rKiBidWZmZXIgPSBtX2RlY29kZXItPmZyYW1lQnVmZmVyQXRJbmRleChpbmRleCk7CisgICAg
aWYgKCFidWZmZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBidWZmZXIt
Pmhhc0FscGhhKCk7Cit9CisKK0ludFNpemUgSW1hZ2VTb3VyY2U6OmZyYW1lU2l6ZUF0SW5kZXgo
c2l6ZV90KSBjb25zdAoreworICAgIHJldHVybiBzaXplKCk7Cit9CisKK1N0cmluZyBJbWFnZVNv
dXJjZTo6ZmlsZW5hbWVFeHRlbnNpb24oKSBjb25zdAoreworICAgIGlmICghbV9kZWNvZGVyKQor
ICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgcmV0dXJuIG1fZGVjb2Rlci0+ZmlsZW5hbWVF
eHRlbnNpb24oKTsKK30KKworfQorCisvLyB2aW06IHRzPTQgc3c9NCBldApkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVdpbmNlLmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uMzJmNzdhMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5jZS5jcHAKQEAgLTAsMCArMSwyMjcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisKKyNpbmNsdWRlICJC
aXRtYXBJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIk5v
dEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJT
aGFyZWRCdWZmZXIuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1
ZGUgPHd0Zi9Pd25QdHIuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworc3RhdGljIGlubGlu
ZSBpbnQgc3RhYmxlUm91bmQoZG91YmxlIGQpCit7CisgICAgaWYgKGQgPiAwKQorICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkICsgMC41KTsKKworICAgIGludCBpID0gc3RhdGljX2Nh
c3Q8aW50PihkKTsKKyAgICByZXR1cm4gaSAtIGQgPiAwLjUgPyBpIC0gMSA6IGk7Cit9CisKKy8v
IFRoaXMgZnVuY3Rpb24gbG9hZHMgcmVzb3VyY2VzIGZyb20gV2ViS2l0CitQYXNzUmVmUHRyPFdl
YkNvcmU6OlNoYXJlZEJ1ZmZlcj4gbG9hZFJlc291cmNlSW50b0J1ZmZlcihjb25zdCBjaGFyKiBu
YW1lKTsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitib29sIEZyYW1lRGF0YTo6Y2xlYXIoYm9v
bCBjbGVhck1ldGFEYXRhKQoreworICAgIGlmIChjbGVhck1ldGFEYXRhKQorICAgICAgICBtX2hh
dmVNZXRhZGF0YSA9IGZhbHNlOworCisgICAgaWYgKG1fZnJhbWUpIHsKKyAgICAgICAgbV9mcmFt
ZSA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsK
K30KKwordm9pZCBCaXRtYXBJbWFnZTo6aW5pdFBsYXRmb3JtRGF0YSgpCit7Cit9CisKK3ZvaWQg
Qml0bWFwSW1hZ2U6OmludmFsaWRhdGVQbGF0Zm9ybURhdGEoKQoreworfQorCitib29sIEJpdG1h
cEltYWdlOjpnZXRIQklUTUFQKEhCSVRNQVAgYm1wKQoreworICAgIHJldHVybiBnZXRIQklUTUFQ
T2ZTaXplKGJtcCwgMCk7Cit9CisKK2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUo
SEJJVE1BUCBibXAsIExQU0laRSBzaXplKQoreworICAgIGlmICghYm1wKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBCSVRNQVAgYm1wSW5mbzsKKyAgICBHZXRPYmplY3QoYm1wLCBzaXpl
b2YoQklUTUFQKSwgJmJtcEluZm8pOworCisgICAgQVNTRVJUKGJtcEluZm8uYm1CaXRzUGl4ZWwg
PT0gMzIpOworICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMgKiBibXBJ
bmZvLmJtSGVpZ2h0OworCisgICAgT3duUHRyPEhEQz4gaGRjKENyZWF0ZUNvbXBhdGlibGVEQygw
KSk7CisgICAgSEdESU9CSiBoT2xkQm1wID0gU2VsZWN0T2JqZWN0KGhkYy5nZXQoKSwgYm1wKTsK
KworICAgIHsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0IGdjKGhkYy5nZXQoKSk7CisKKyAgICAg
ICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOworICAgICAgICBpZiAo
c2l6ZSkKKyAgICAgICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSgmZ2MsIEZsb2F0
UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBJbnRTaXplKCpz
aXplKSwgQ29tcG9zaXRlQ29weSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRyYXcoJmdj
LCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxv
YXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21w
b3NpdGVDb3B5KTsKKyAgICB9CisKKyAgICBTZWxlY3RPYmplY3QoaGRjLmdldCgpLCBoT2xkQm1w
KTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVN
YXRjaGluZ1NvdXJjZVNpemUoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3Qm
IGRzdFJlY3QsIGNvbnN0IEludFNpemUmIHNyY1NpemUsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBv
c2l0ZU9wKQoreworICAgIGludCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7CisgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAgICBSZWZQdHI8U2hhcmVkQml0bWFwPiBi
bXAgPSBmcmFtZUF0SW5kZXgoaSk7CisgICAgICAgIGlmIChibXAgJiYgYm1wLT5oZWlnaHQoKSA9
PSAoc2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgYm1wLT53aWR0aCgpID09IChzaXplX3Qpc3Jj
U2l6ZS53aWR0aCgpKSB7CisgICAgICAgICAgICBzaXplX3QgY3VycmVudEZyYW1lID0gbV9jdXJy
ZW50RnJhbWU7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGk7CisgICAgICAgICAgICBk
cmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBzcmNTaXplLndpZHRoKCksIHNyY1Np
emUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9
IGN1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIC8vIE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0IHNpemUgd2FzIGZvdW5kLCBmYWxsYmFjayB0
byBkcmF3aW5nIHRoZSBjdXJyZW50IGZyYW1lCisgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRt
YXBJbWFnZTo6c2l6ZSgpOworICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAs
IGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7Cit9
CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBG
bG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdEluLCBDb21wb3NpdGVP
cGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fc291cmNlLmluaXRpYWxpemVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIHN0YXJ0QW5pbWF0aW9uKCk7CisKKyAgICBpZiAobWF5
RmlsbFdpdGhTb2xpZENvbG9yKCkpIHsKKyAgICAgICAgZmlsbFdpdGhTb2xpZENvbG9yKGN0eHQs
IGRzdFJlY3QsIHNvbGlkQ29sb3IoKSwgY29tcG9zaXRlT3ApOworICAgICAgICByZXR1cm47Cisg
ICAgfQorICAgIAorICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCA9IGZyYW1lQXRJbmRleCht
X2N1cnJlbnRGcmFtZSk7CisKKyAgICBJbnRSZWN0IGludFNyY1JlY3Qoc3JjUmVjdEluKTsKKyAg
ICBpZiAoYm1wLT53aWR0aCgpICE9IG1fc291cmNlLnNpemUoKS53aWR0aCgpKSB7CisgICAgICAg
IGRvdWJsZSByYXRlID0gKGRvdWJsZSlibXAtPndpZHRoKCkgLyBtX3NvdXJjZS5zaXplKCkud2lk
dGgoKTsKKyAgICAgICAgaW50IHRlbXAgPSBzdGFibGVSb3VuZChzcmNSZWN0SW4ucmlnaHQoKSAq
IHJhdGUpOworICAgICAgICBpbnRTcmNSZWN0LnNldFgoc3RhYmxlUm91bmQoc3JjUmVjdEluLngo
KSAqIHJhdGUpKTsKKyAgICAgICAgaW50U3JjUmVjdC5zZXRXaWR0aCh0ZW1wIC0gaW50U3JjUmVj
dC54KCkpOworICAgICAgICB0ZW1wID0gc3RhYmxlUm91bmQoc3JjUmVjdEluLmJvdHRvbSgpICog
cmF0ZSk7CisgICAgICAgIGludFNyY1JlY3Quc2V0WShzdGFibGVSb3VuZChzcmNSZWN0SW4ueSgp
ICogcmF0ZSkpOworICAgICAgICBpbnRTcmNSZWN0LnNldEhlaWdodCh0ZW1wIC0gaW50U3JjUmVj
dC55KCkpOworICAgIH0KKworICAgIGJtcC0+ZHJhdyhjdHh0LCBlbmNsb3NpbmdJbnRSZWN0KGRz
dFJlY3QpLCBpbnRTcmNSZWN0LCBjb21wb3NpdGVPcCk7Cit9CisKK1Bhc3NSZWZQdHI8SW1hZ2U+
IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIFJl
ZlB0cjxTaGFyZWRCdWZmZXI+IGJ1ZmZlciA9IGxvYWRSZXNvdXJjZUludG9CdWZmZXIobmFtZSk7
CisgICAgUmVmUHRyPEJpdG1hcEltYWdlPiBpbWcgPSBCaXRtYXBJbWFnZTo6Y3JlYXRlKCk7Cisg
ICAgaW1nLT5zZXREYXRhKGJ1ZmZlci5yZWxlYXNlKCksIHRydWUpOworICAgIHJldHVybiBpbWc7
Cit9CisKK3ZvaWQgSW1hZ2U6OmRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29u
c3QgRmxvYXRSZWN0JiB0aWxlUmVjdCwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRl
cm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBw
aGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhd1BhdHRl
cm4oR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNv
bnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9w
LCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KQoreworICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+
IGJtcCA9IG5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAgaWYgKGJtcCkKKyAgICAg
ICAgYm1wLT5kcmF3UGF0dGVybihjdHh0LCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBw
aGFzZSwgb3AsIGRlc3RSZWN0LCBtX3NvdXJjZS5zaXplKCkpOworfQorCit2b2lkIEJpdG1hcElt
YWdlOjpjaGVja0ZvclNvbGlkQ29sb3IoKQoreworICAgIGlmIChtX2NoZWNrZWRGb3JTb2xpZENv
bG9yKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZnJhbWVDb3VudCgpICE9IDEpIHsKKyAg
ICAgICAgbV9pc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgbV9jaGVja2VkRm9yU29saWRD
b2xvciA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSZWZQdHI8U2hhcmVk
Qml0bWFwPiBibXAgPSBmcmFtZUF0SW5kZXgoMCk7CisgICAgaWYgKCFibXAgfHwgIWJtcC0+dmFs
aWRIZWlnaHQoKSkgeworICAgICAgICBtX2lzU29saWRDb2xvciA9IGZhbHNlOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaWYgKGJtcC0+d2lkdGgoKSA9PSAxICYmIGJtcC0+dmFsaWRI
ZWlnaHQoKSA9PSAxKSB7CisgICAgICAgIG1faXNTb2xpZENvbG9yID0gdHJ1ZTsKKworICAgICAg
ICBpZiAoYm1wLT5pczE2Yml0KCkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGMgPSAo
KHVuc2lnbmVkIHNob3J0ICopYm1wLT5ieXRlcygpKVswXTsKKyNpZiBJTUFHRV9OT19BTFBIQV9V
U0VfUkdCNTU1CisgICAgICAgICAgICBpbnQgciA9IChjID4+IDcpICYgMHhGODsKKyAgICAgICAg
ICAgIGludCBnID0gKGMgPj4gMikgJiAweEY4OworICAgICAgICAgICAgaW50IGIgPSAoYyA8PCAz
KSAmIDB4Rjg7CisjZWxzZQorICAgICAgICAgICAgaW50IHIgPSAoYyA+PiA4KSAmIDB4Rjg7Cisg
ICAgICAgICAgICBpbnQgZyA9IChjID4+IDMpICYgMHhGQzsKKyAgICAgICAgICAgIGludCBiID0g
KGMgPDwgMykgJiAweEY4OworI2VuZGlmCisgICAgICAgICAgICBpZiAoYm1wLT51c2VzVHJhbnNw
YXJlbnRDb2xvcigpICYmIGJtcC0+dHJhbnNwYXJlbnRDb2xvcigpID09IFJHQihyLCBnLCBiKSkK
KyAgICAgICAgICAgICAgICBtX3NvbGlkQ29sb3IgPSBDb2xvcihyLCBnLCBiLCAwKTsKKyAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX3NvbGlkQ29sb3IgPSBDb2xvcihyLCBnLCBi
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGMgPSAoKHVuc2lnbmVk
ICopYm1wLT5ieXRlcygpKVswXTsKKyAgICAgICAgICAgIG1fc29saWRDb2xvciA9IENvbG9yKGMp
OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJtcC0+dmFsaWRIZWlnaHQoKSA9PSBibXAtPmhl
aWdodCgpKQorICAgICAgICAgICAgbV9jaGVja2VkRm9yU29saWRDb2xvciA9IHRydWU7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgbV9pc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgbV9jaGVj
a2VkRm9yU29saWRDb2xvciA9IHRydWU7CisgICAgfQorfQorCisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUK
</data>
<flag name="review"
          id="18237"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34391</attachid>
            <date>2009-08-08 13:12:31 -0700</date>
            <delta_ts>2009-08-10 13:30:48 -0700</delta_ts>
            <desc>1) Image encoders</desc>
            <filename>27511_1.patch</filename>
            <type>text/plain</type>
            <size>15619</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uOTAyZWE4NCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOCBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IGltYWdlIGVuY29kZXJzLiAoUE5HRW5jb2RlciBp
cyBvcmlnaW5hbGx5IHRha2VuIGZyb20gc2tpYSBwb3J0LAorICAgICAgICBKUEVHRW5jb2RlciBp
cyB3cml0dGVuIGZyb20gc2NyYXRjaC4gSW4gdGhlIGZ1dHVyZSwgV2Ugc2hvdWxkIGV4dHJhY3Qg
CisgICAgICAgIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhcnRzIG9mIHRoZSAyIGVuY29kZXJzIGFu
ZCBsZXQgZGlmZmVyZW50IHBsYXRmb3JtcyBzaGFyZSAKKyAgICAgICAgdGhlbS4pCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzUxMQorCisgICAgICAg
ICogcGxhdGZvcm0vaW1hZ2UtZW5jb2RlcnMvd2luY2UvSlBFR0VuY29kZXIuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1lbmNvZGVycy93aW5jZS9KUEVHRW5jb2Rlci5oOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFnZS1lbmNvZGVycy93aW5jZS9QTkdFbmNvZGVy
LmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZW5jb2RlcnMvd2luY2UvUE5H
RW5jb2Rlci5oOiBBZGRlZC4KKwogMjAwOS0wOC0wNiAgWW9uZyBMaSAgPHlvbmcubGlAdG9yY2ht
b2JpbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1lbmNvZGVycy93aW5jZS9KUEVHRW5jb2Rlci5j
cHAgYi9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWVuY29kZXJzL3dpbmNlL0pQRUdFbmNvZGVyLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzdhODU5Ci0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1lbmNvZGVycy93aW5jZS9KUEVHRW5jb2Rl
ci5jcHAKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2gg
TW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
IEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkpQRUdFbmNvZGVyLmgiCisKKyNpbmNsdWRlICJTaGFyZWRC
aXRtYXAuaCIKKworI2RlZmluZSBYTURfSAorI2RlZmluZSBWVEtfSlBFR19YTURfSAorI3VuZGVm
IEZBUgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJqcGVnbGliLmgiCit9CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworc3RydWN0IGpwZWdfZGVzdF9tZ3IgeworICAgIHN0cnVjdCBqcGVnX2Rl
c3RpbmF0aW9uX21nciBwdWI7CisgICAgVmVjdG9yPGNoYXI+IGJ1ZmZlcjsKKyAgICBWZWN0b3I8
Y2hhcj4qIGR1bXA7Cit9OworCitzdHJ1Y3QganBlZ19jb21wcmVzc19lcnJvcl9tZ3IgeworICAg
IHN0cnVjdCBqcGVnX2Vycm9yX21nciBwdWI7CisgICAgam1wX2J1ZiBzZXRqbXBfYnVmZmVyOwor
fTsKKwordm9pZCBqcGVnX2luaXRfZGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY29tcHJlc3NE
YXRhKQoreworICAgIGpwZWdfZGVzdF9tZ3IqIGRlc3QgPSAoanBlZ19kZXN0X21nciopY29tcHJl
c3NEYXRhLT5kZXN0OworICAgIGRlc3QtPmJ1ZmZlci5yZXNpemUoNDA5Nik7CisgICAgZGVzdC0+
cHViLm5leHRfb3V0cHV0X2J5dGUgID0gKEpPQ1RFVCopZGVzdC0+YnVmZmVyLmRhdGEoKTsKKyAg
ICBkZXN0LT5wdWIuZnJlZV9pbl9idWZmZXIgICAgPSBkZXN0LT5idWZmZXIuc2l6ZSgpOworfQor
Citib29sZWFuIGpwZWdfZW1wdHlfb3V0cHV0X2J1ZmZlcihqX2NvbXByZXNzX3B0ciBjb21wcmVz
c0RhdGEpCit7CisgICAganBlZ19kZXN0X21nciogZGVzdCA9IChqcGVnX2Rlc3RfbWdyKiljb21w
cmVzc0RhdGEtPmRlc3Q7CisgICAgZGVzdC0+ZHVtcC0+YXBwZW5kKGRlc3QtPmJ1ZmZlci5kYXRh
KCksIGRlc3QtPmJ1ZmZlci5zaXplKCkgLSBkZXN0LT5wdWIuZnJlZV9pbl9idWZmZXIpOworICAg
IGRlc3QtPnB1Yi5uZXh0X291dHB1dF9ieXRlICA9IChKT0NURVQqKWRlc3QtPmJ1ZmZlci5kYXRh
KCk7CisgICAgZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyICAgID0gZGVzdC0+YnVmZmVyLnNpemUo
KTsKKyAgICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBqcGVnX3Rlcm1fZGVzdGluYXRpb24oal9j
b21wcmVzc19wdHIgY29tcHJlc3NEYXRhKQoreworICAgIGpwZWdfZGVzdF9tZ3IqIGRlc3QgPSAo
anBlZ19kZXN0X21nciopY29tcHJlc3NEYXRhLT5kZXN0OworICAgIGRlc3QtPmR1bXAtPmFwcGVu
ZChkZXN0LT5idWZmZXIuZGF0YSgpLCBkZXN0LT5idWZmZXIuc2l6ZSgpIC0gZGVzdC0+cHViLmZy
ZWVfaW5fYnVmZmVyKTsKK30KKwordm9pZCBqcGVnX2Vycm9yX2V4aXQoal9jb21tb25fcHRyIGNv
bXByZXNzRGF0YSkKK3sKKyAgICBqcGVnX2NvbXByZXNzX2Vycm9yX21nciAqZXJyID0gKGpwZWdf
Y29tcHJlc3NfZXJyb3JfbWdyKiljb21wcmVzc0RhdGEtPmVycjsKKyAgICBsb25nam1wKGVyci0+
c2V0am1wX2J1ZmZlciwgLTEpOworfQorCitib29sIGNvbXByZXNzQml0bWFwVG9KcGVnKFNoYXJl
ZEJpdG1hcCogYm1wLCBWZWN0b3I8Y2hhcj4mIGpwZWdEYXRhKQoreworICAgIHN0cnVjdCBqcGVn
X2NvbXByZXNzX3N0cnVjdCBjb21wcmVzc0RhdGE9IHswfTsKKyAgICBqcGVnX2NvbXByZXNzX2Vy
cm9yX21nciBlcnI7CisgICAgY29tcHJlc3NEYXRhLmVyciA9IGpwZWdfc3RkX2Vycm9yKChqcGVn
X2Vycm9yX21nciopJmVycik7CisgICAgZXJyLnB1Yi5lcnJvcl9leGl0ID0ganBlZ19lcnJvcl9l
eGl0OworCisgICAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNvbXByZXNzRGF0YSk7CisKKyAgICBq
cGVnX2Rlc3RfbWdyKiBkZXN0ID0gKGpwZWdfZGVzdF9tZ3IqKWZhc3RDYWxsb2Moc2l6ZW9mKGpw
ZWdfZGVzdF9tZ3IpLCAxKTsKKyAgICBkZXN0LT5kdW1wID0gJmpwZWdEYXRhOworICAgIGNvbXBy
ZXNzRGF0YS5kZXN0ID0gKHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciopZGVzdDsKKyAgICBk
ZXN0LT5wdWIuaW5pdF9kZXN0aW5hdGlvbiA9IGpwZWdfaW5pdF9kZXN0aW5hdGlvbjsKKyAgICBk
ZXN0LT5wdWIuZW1wdHlfb3V0cHV0X2J1ZmZlciA9IGpwZWdfZW1wdHlfb3V0cHV0X2J1ZmZlcjsK
KyAgICBkZXN0LT5wdWIudGVybV9kZXN0aW5hdGlvbiA9IGpwZWdfdGVybV9kZXN0aW5hdGlvbjsK
KworICAgIGNvbXByZXNzRGF0YS5pbWFnZV93aWR0aCA9IGJtcC0+d2lkdGgoKTsKKyAgICBjb21w
cmVzc0RhdGEuaW1hZ2VfaGVpZ2h0ID0gYm1wLT5oZWlnaHQoKTsKKyAgICBjb21wcmVzc0RhdGEu
aW5wdXRfY29tcG9uZW50cyA9IDM7CisgICAgY29tcHJlc3NEYXRhLmluX2NvbG9yX3NwYWNlID0g
SkNTX1JHQjsKKyAgICBqcGVnX3NldF9kZWZhdWx0cygmY29tcHJlc3NEYXRhKTsKKyAgICBqcGVn
X3NldF9xdWFsaXR5KCZjb21wcmVzc0RhdGEsIDY1LCBGQUxTRSk7CisKKyAgICBWZWN0b3I8SlNB
TVBMRSwgMjA0OD4gcm93QnVmZmVyOworICAgIGlmIChzZXRqbXAoZXJyLnNldGptcF9idWZmZXIp
KSB7CisgICAgICAgIGpwZWdfZGVzdHJveV9jb21wcmVzcygmY29tcHJlc3NEYXRhKTsKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNvbXBy
ZXNzRGF0YSwgVFJVRSk7CisKKyAgICByb3dCdWZmZXIucmVzaXplKGNvbXByZXNzRGF0YS5pbWFn
ZV93aWR0aCAqIDMpOworICAgIGlmIChibXAtPmlzMTZiaXQoKSkgeworICAgICAgICBpbnQgcGFk
ZGVkV2lkdGggPSBibXAtPmJpdG1hcEluZm8oKS5wYWRkZWRXaWR0aCgpOworICAgICAgICBpbnQg
c2tpcCA9IHBhZGRlZFdpZHRoIC0gY29tcHJlc3NEYXRhLmltYWdlX3dpZHRoOworICAgICAgICBj
b25zdCB1bnNpZ25lZCBzaG9ydCogcGl4ZWwgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBz
aG9ydCo+KGJtcC0+Ynl0ZXMoKSk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBwaXhl
bEVuZCA9IHBpeGVsICsgcGFkZGVkV2lkdGggKiBjb21wcmVzc0RhdGEuaW1hZ2VfaGVpZ2h0Owor
ICAgICAgICBmb3IgKDsgcGl4ZWwgPCBwaXhlbEVuZDsgcGl4ZWwgKz0gc2tpcCkgeworICAgICAg
ICAgICAgSlNBTVBMRSogZHN0ID0gcm93QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIGZvciAo
Y29uc3QgdW5zaWduZWQgc2hvcnQqIHJvd0VuZCA9IHBpeGVsICsgY29tcHJlc3NEYXRhLmltYWdl
X3dpZHRoOyBwaXhlbCA8IHJvd0VuZDspIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9y
dCB2YWx1ZSA9ICpwaXhlbCsrOworI2lmIElNQUdFX05PX0FMUEhBX1VTRV9SR0I1NTUKKyAgICAg
ICAgICAgICAgICAqZHN0KysgPSBKU0FNUExFKCh2YWx1ZSA+PiA3KSAmIDB4RjgpOworICAgICAg
ICAgICAgICAgICpkc3QrKyA9IEpTQU1QTEUoKHZhbHVlID4+IDIpICYgMHhGOCk7CisgICAgICAg
ICAgICAgICAgKmRzdCsrID0gSlNBTVBMRSgodmFsdWUgPDwgMykgJiAweEY4KTsKKyNlbHNlCisg
ICAgICAgICAgICAgICAgKmRzdCsrID0gSlNBTVBMRSgodmFsdWUgPj4gOCkgJiAweEY4KTsKKyAg
ICAgICAgICAgICAgICAqZHN0KysgPSBKU0FNUExFKCh2YWx1ZSA+PiAzKSAmIDB4RkMpOworICAg
ICAgICAgICAgICAgICpkc3QrKyA9IEpTQU1QTEUoKHZhbHVlIDw8IDMpICYgMHhGOCk7CisjZW5k
aWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCA9IHJvd0J1ZmZlci5kYXRhKCk7Cisg
ICAgICAgICAgICBqcGVnX3dyaXRlX3NjYW5saW5lcygmY29tcHJlc3NEYXRhLCAmZHN0LCAxKTsK
KyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkKiBwaXhlbCA9
IHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkKj4oYm1wLT5ieXRlcygpKTsKKyAgICAgICAgY29u
c3QgdW5zaWduZWQqIHBpeGVsRW5kID0gcGl4ZWwgKyBjb21wcmVzc0RhdGEuaW1hZ2Vfd2lkdGgg
KiBjb21wcmVzc0RhdGEuaW1hZ2VfaGVpZ2h0OworICAgICAgICBmb3IgKDsgcGl4ZWwgPCBwaXhl
bEVuZDsgKSB7CisgICAgICAgICAgICBKU0FNUExFKiBkc3QgPSByb3dCdWZmZXIuZGF0YSgpOwor
ICAgICAgICAgICAgZm9yIChjb25zdCB1bnNpZ25lZCogcm93RW5kID0gcGl4ZWwgKyBjb21wcmVz
c0RhdGEuaW1hZ2Vfd2lkdGg7IHBpeGVsIDwgcm93RW5kOykgeworICAgICAgICAgICAgICAgIHVu
c2lnbmVkIHZhbHVlID0gKnBpeGVsKys7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gSlNBTVBM
RSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gSlNBTVBM
RSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBKU0FNUExF
KCh2YWx1ZSkgJiAweEZGKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCA9IHJvd0J1
ZmZlci5kYXRhKCk7CisgICAgICAgICAgICBqcGVnX3dyaXRlX3NjYW5saW5lcygmY29tcHJlc3NE
YXRhLCAmZHN0LCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGpwZWdfZmluaXNoX2NvbXBy
ZXNzKCZjb21wcmVzc0RhdGEpOworICAgIGpwZWdfZGVzdHJveV9jb21wcmVzcygmY29tcHJlc3NE
YXRhKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0
Zm9ybS9pbWFnZS1lbmNvZGVycy93aW5jZS9KUEVHRW5jb2Rlci5oIGIvV2ViQ29yZS9wbGF0Zm9y
bS9pbWFnZS1lbmNvZGVycy93aW5jZS9KUEVHRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjcyODdjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2ltYWdlLWVuY29kZXJzL3dpbmNlL0pQRUdFbmNvZGVyLmgKQEAgLTAsMCArMSwyOCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIEpQRUdfRU5DT0RFUl9ICisjZGVmaW5lIEpQ
RUdfRU5DT0RFUl9ICisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKyAgICBib29sIGNvbXByZXNzQml0
bWFwVG9KcGVnKFNoYXJlZEJpdG1hcCogYm1wLCBWZWN0b3I8Y2hhcj4mIGpwZWdEYXRhKTsKK30K
KworI2VuZGlmIC8vIEpQRUdfRU5DT0RFUl9ICmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L2ltYWdlLWVuY29kZXJzL3dpbmNlL1BOR0VuY29kZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9p
bWFnZS1lbmNvZGVycy93aW5jZS9QTkdFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi42YzlkZWUzCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9y
bS9pbWFnZS1lbmNvZGVycy93aW5jZS9QTkdFbmNvZGVyLmNwcApAQCAtMCwwICsxLDE2NyBAQAor
LyoKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAq
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQTkdFbmNvZGVyLmgi
CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInBuZy5oIgorfQorCisjaW5jbHVkZSA8d3RmL1Zl
Y3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIEVuY29kZXIgLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
Ky8vCisvLyBUaGlzIHNlY3Rpb24gb2YgdGhlIGNvZGUgaXMgYmFzZWQgb24gbnNQTkdFbmNvZGVy
LmNwcCBpbiBNb3ppbGxhCisvLyAoQ29weXJpZ2h0IDIwMDUgR29vZ2xlIEluYy4pCisKKy8vIFBh
c3NlZCBhcm91bmQgYXMgdGhlIGlvX3B0ciBpbiB0aGUgcG5nIHN0cnVjdHMgc28gb3VyIGNhbGxi
YWNrcyBrbm93IHdoZXJlCisvLyB0byB3cml0ZSBkYXRhLgorc3RydWN0IFBOR0VuY29kZXJTdGF0
ZSB7CisgICAgUE5HRW5jb2RlclN0YXRlKFZlY3RvcjxjaGFyPiogbykgOiBtX291dChvKSB7fQor
ICAgIFZlY3RvcjxjaGFyPiogbV9vdXQ7Cit9OworCisvLyBDYWxsZWQgYnkgbGlicG5nIHRvIGZs
dXNoIGl0cyBpbnRlcm5hbCBidWZmZXIgdG8gb3Vycy4KK3ZvaWQgZW5jb2RlcldyaXRlQ2FsbGJh
Y2socG5nX3N0cnVjdHAgcG5nLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBzaXplKQorewor
ICAgIFBOR0VuY29kZXJTdGF0ZSogc3RhdGUgPSBzdGF0aWNfY2FzdDxQTkdFbmNvZGVyU3RhdGUq
PihwbmdfZ2V0X2lvX3B0cihwbmcpKTsKKyAgICBBU1NFUlQoc3RhdGUtPm1fb3V0KTsKKworICAg
IHNpemVfdCBvbGRTaXplID0gc3RhdGUtPm1fb3V0LT5zaXplKCk7CisgICAgc3RhdGUtPm1fb3V0
LT5yZXNpemUob2xkU2l6ZSArIHNpemUpOworICAgIG1lbWNweSgmKCpzdGF0ZS0+bV9vdXQpW29s
ZFNpemVdLCBkYXRhLCBzaXplKTsKK30KKworLy8gQXV0b21hdGljYWxseSBkZXN0cm95cyB0aGUg
Z2l2ZW4gd3JpdGUgc3RydWN0cyBvbiBkZXN0cnVjdGlvbiB0byBtYWtlCisvLyBjbGVhbnVwIGFu
ZCBlcnJvciBoYW5kbGluZyBjb2RlIGNsZWFuZXIuCitjbGFzcyBQTkdXcml0ZVN0cnVjdERlc3Ry
b3llciB7CitwdWJsaWM6CisgICAgUE5HV3JpdGVTdHJ1Y3REZXN0cm95ZXIocG5nX3N0cnVjdCoq
IHBzLCBwbmdfaW5mbyoqIHBpKQorICAgICAgICA6IG1fcG5nU3RydWN0KHBzKQorICAgICAgICAs
IG1fcG5nSW5mbyhwaSkKKyAgICB7CisgICAgfQorCisgICAgflBOR1dyaXRlU3RydWN0RGVzdHJv
eWVyKCkKKyAgICB7CisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdChtX3BuZ1N0cnVj
dCwgbV9wbmdJbmZvKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgcG5nX3N0cnVjdCoqIG1fcG5n
U3RydWN0OworICAgIHBuZ19pbmZvKiogbV9wbmdJbmZvOworfTsKKworYm9vbCBjb21wcmVzc0Jp
dG1hcFRvUG5nKFNoYXJlZEJpdG1hcCogYm1wLCBWZWN0b3I8Y2hhcj4mIHBuZ0RhdGEpCit7Cisg
ICAgaWYgKCFibXAtPmJ5dGVzKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHBuZ19z
dHJ1Y3QqIHBuZ1B0ciA9IHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NU
UklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw
bmdfdm9pZHBfTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBwbmdfZXJyb3JfcHRyX05VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcG5nX2Vycm9yX3B0cl9OVUxMKTsKKyAgICBpZiAoIXBuZ1B0
cikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcG5nX2luZm8qIGluZm9QdHIgPSBwbmdf
Y3JlYXRlX2luZm9fc3RydWN0KHBuZ1B0cik7CisgICAgaWYgKCFpbmZvUHRyKSB7CisgICAgICAg
IHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nUHRyLCAwKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKyAgICBQTkdXcml0ZVN0cnVjdERlc3Ryb3llciBkZXN0cm95ZXIoJnBuZ1B0
ciwgJmluZm9QdHIpOworCisgICAgaW50IGJ5dGVEZXB0aCA9IGJtcC0+aXMxNmJpdCgpID8gMyA6
IDQ7CisgICAgVmVjdG9yPHVuc2lnbmVkIGNoYXIsIDIwNDg+IHJvd0J1ZmZlcjsKKyAgICByb3dC
dWZmZXIucmVzaXplKGJtcC0+d2lkdGgoKSAqIGJ5dGVEZXB0aCk7CisKKyAgICAvLyBUaGUgZGVz
dHJveWVyIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHN0cnVjdHVyZXMgYXJlIGNsZWFuZWQgdXAgaW4g
dGhpcworICAgIC8vIGNhc2UsIGV2ZW4gdGhvdWdoIHdlIG1heSBnZXQgaGVyZSBhcyBhIGp1bXAg
ZnJvbSByYW5kb20gcGFydHMgb2YgdGhlCisgICAgLy8gUE5HIGxpYnJhcnkgY2FsbGVkIGJlbG93
LgorICAgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdQdHIpKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgLy8gU2V0IG91ciBjYWxsYmFjayBmb3IgbGlicG5nIHRvIGdpdmUgdXMgdGhl
IGRhdGEuCisgICAgUE5HRW5jb2RlclN0YXRlIHN0YXRlKCZwbmdEYXRhKTsKKyAgICBwbmdfc2V0
X3dyaXRlX2ZuKHBuZ1B0ciwgJnN0YXRlLCBlbmNvZGVyV3JpdGVDYWxsYmFjaywgMCk7CisKKyAg
ICBpbnQgcG5nT3V0cHV0Q29sb3JUeXBlID0gYm1wLT5pczE2Yml0KCkgPyBQTkdfQ09MT1JfVFlQ
RV9SR0IgOiBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE7CisKKyAgICBwbmdfc2V0X0lIRFIocG5n
UHRyLCBpbmZvUHRyLCBibXAtPndpZHRoKCksIGJtcC0+aGVpZ2h0KCksIDgsIHBuZ091dHB1dENv
bG9yVHlwZSwKKyAgICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfQ09NUFJF
U1NJT05fVFlQRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICBQTkdfRklMVEVSX1RZUEVfREVG
QVVMVCk7CisgICAgcG5nX3dyaXRlX2luZm8ocG5nUHRyLCBpbmZvUHRyKTsKKworICAgIGlmIChi
bXAtPmlzMTZiaXQoKSkgeworICAgICAgICB1bnNpZ25lZCBzaG9ydCogc3JjID0gKHVuc2lnbmVk
IHNob3J0KilibXAtPmJ5dGVzKCk7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgKGludCli
bXAtPmhlaWdodCgpOyArK3kpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGRzdCA9IHJv
d0J1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IChpbnQpYm1w
LT53aWR0aCgpOyArK3gpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZSA9
ICpzcmMrKzsKKyNpZiBJTUFHRV9OT19BTFBIQV9VU0VfUkdCNTU1CisgICAgICAgICAgICAgICAg
KmRzdCsrID0gdW5zaWduZWQgY2hhcigodmFsdWUgPj4gNykgJiAweEY4KTsKKyAgICAgICAgICAg
ICAgICAqZHN0KysgPSB1bnNpZ25lZCBjaGFyKCh2YWx1ZSA+PiAyKSAmIDB4RjgpOworICAgICAg
ICAgICAgICAgICpkc3QrKyA9IHVuc2lnbmVkIGNoYXIoKHZhbHVlIDw8IDMpICYgMHhGOCk7Cisj
ZWxzZQorICAgICAgICAgICAgICAgICpkc3QrKyA9IHVuc2lnbmVkIGNoYXIoKHZhbHVlID4+IDgp
ICYgMHhGOCk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gdW5zaWduZWQgY2hhcigodmFsdWUg
Pj4gMykgJiAweEZDKTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSB1bnNpZ25lZCBjaGFyKCh2
YWx1ZSA8PCAzKSAmIDB4RjgpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBw
bmdfd3JpdGVfcm93KHBuZ1B0ciwgcm93QnVmZmVyLmRhdGEoKSk7CisgICAgICAgIH0KKyAgICB9
IGVsc2UgeworICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmMgPSAodW5zaWduZWQgY2hhciopYm1w
LT5ieXRlcygpOworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IChpbnQpYm1wLT5oZWlnaHQo
KTsgKyt5KSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBkc3QgPSByb3dCdWZmZXIuZGF0
YSgpOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAoaW50KWJtcC0+d2lkdGgoKTsg
Kyt4KSB7CisgICAgICAgICAgICAgICAgLy8gTm90ZTogUE5HIGlzIGluIGJpZyBlbmRpYW4KKyAg
ICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGIgPSAqc3JjKys7CisgICAgICAgICAgICAgICAg
dW5zaWduZWQgY2hhciBnID0gKnNyYysrOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIg
ciA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGEgPSAqc3JjKys7Cisg
ICAgICAgICAgICAgICAgKmRzdCsrID0gcjsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBnOwor
ICAgICAgICAgICAgICAgICpkc3QrKyA9IGI7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gYTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBuZ193cml0ZV9yb3cocG5nUHRyLCByb3dCdWZm
ZXIuZGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBuZ193cml0ZV9lbmQocG5nUHRy
LCBpbmZvUHRyKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIFdlYkNv
cmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZW5jb2RlcnMvd2luY2UvUE5H
RW5jb2Rlci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1lbmNvZGVycy93aW5jZS9QTkdFbmNv
ZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwNTY2ZQotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZW5jb2RlcnMvd2luY2UvUE5HRW5j
b2Rlci5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkg
VG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgUE5HX0VOQ09ERVJfSAorI2Rl
ZmluZSBQTkdfRU5DT0RFUl9ICisKKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKyAgICBib29sIGNvbXByZXNzQml0bWFwVG9QbmcoU2hhcmVkQml0bWFwKiBi
bXAsIFZlY3RvcjxjaGFyPiYgcG5nRGF0YSk7Cit9CisKKyNlbmRpZiAvLyBQTkdfRU5DT0RFUl9I
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34392</attachid>
            <date>2009-08-08 13:27:45 -0700</date>
            <delta_ts>2009-08-08 13:28:38 -0700</delta_ts>
            <desc>2) SharedBitmap</desc>
            <filename>27511_2.patch</filename>
            <type>text/plain</type>
            <size>29804</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uMjc4YWMxMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IFNoYXJlZEJpdG1hcCBpcyB1c2VkIGFzIE5hdGl2
ZUltYWdlUHRyCisgICAgICAgIGZvciBmcmFtZXMgaW4gQml0bWFwSW1hZ2UsIGFuZCBpcyB3aWRl
IHVzZWQgaW4gV0lOQ0UgCisgICAgICAgIFBPUlQgZmlsZXMuIEEgU2hhcmVkQml0bWFwIGhvbGRz
IGEgMTZiaXQgb3IgMzJiaXQKKyAgICAgICAgV2luZG93cyBESUIgd2l0aCBvciB3aXRob3V0IGFu
IEhCSVRNQVAgaGFuZGxlLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9Mjc1MTEKKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJl
ZEJpdG1hcC5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1No
YXJlZEJpdG1hcC5oOiBBZGRlZC4KKwogMjAwOS0wOC0wNiAgWW9uZyBMaSAgPHlvbmcubGlAdG9y
Y2htb2JpbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjc2NTUKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5jcHAKQEAgLTAs
MCArMSw2OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUs
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIlNoYXJlZEJpdG1hcC5oIgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NUeXBlcy5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9u
TWF0cml4LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRy
Lmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworI2lm
bmRlZiBOREVCVUcKK3N0cnVjdCBTaGFyZWRCaXRtYXBMZWFrQ291bnRlciB7CisgICAgflNoYXJl
ZEJpdG1hcExlYWtDb3VudGVyKCk7Cit9Oworc3RhdGljIFNoYXJlZEJpdG1hcExlYWtDb3VudGVy
IHNoYXJlZEJpdG1hcExlYWtDb3VudGVyOworI2VuZGlmCisKK3R5cGVkZWYgSGFzaFNldDxTaGFy
ZWRCaXRtYXAqPiBCaXRtYXBNYXA7CitCaXRtYXBNYXAgZ19iaXRtYXBNYXA7CisKKyNpZm5kZWYg
TkRFQlVHCitTaGFyZWRCaXRtYXBMZWFrQ291bnRlcjo6flNoYXJlZEJpdG1hcExlYWtDb3VudGVy
KCkKK3sKKyAgICBpZiAoIWdfYml0bWFwTWFwLmlzRW1wdHkoKSkKKyAgICAgICAgcHJpbnRmKCJc
bkxFQUs6ICV1ICVzXG5cbiIsIGdfYml0bWFwTWFwLnNpemUoKSwgIlNoYXJlZEJpdG1hcCBvYmpl
Y3RzIik7Cit9CisjZW5kaWYKKworc3RhdGljIFNoYXJlZEJpdG1hcDo6RHJhd1BhdHRlcm5GdW5j
IGdfZHJhd1BhdHRlcm4gPSAwOworc3RhdGljIFNoYXJlZEJpdG1hcDo6RHJhd0ltYWdlRnVuYyBn
X2RyYXdJbWFnZSA9IDA7CisKK3N0YXRpYyBpbmxpbmUgaW50IHN0YWJsZVJvdW5kKGRvdWJsZSBk
KQoreworICAgIGlmIChkID4gMCkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCAr
IDAuNSk7CisKKyAgICBpbnQgaSA9IHN0YXRpY19jYXN0PGludD4oZCk7CisgICAgcmV0dXJuIGkg
LSBkID4gMC41ID8gaSAtIDEgOiBpOworfQorCitTaGFyZWRCaXRtYXA6OkRyYXdJbWFnZUZ1bmMg
U2hhcmVkQml0bWFwOjpzZXREcmF3SW1hZ2VGdW5jKERyYXdJbWFnZUZ1bmMgZnVuYykKK3sKKyAg
ICBEcmF3SW1hZ2VGdW5jIG9sZEZ1bmMgPSBnX2RyYXdJbWFnZTsKKyAgICBnX2RyYXdJbWFnZSA9
IGZ1bmM7CisgICAgcmV0dXJuIG9sZEZ1bmM7Cit9CisKK1NoYXJlZEJpdG1hcDo6RHJhd1BhdHRl
cm5GdW5jIFNoYXJlZEJpdG1hcDo6c2V0RHJhd1BhdHRlcm5GdW5jKERyYXdQYXR0ZXJuRnVuYyBm
dW5jKQoreworICAgIERyYXdQYXR0ZXJuRnVuYyBvbGRGdW5jID0gZ19kcmF3UGF0dGVybjsKKyAg
ICBnX2RyYXdQYXR0ZXJuID0gZnVuYzsKKyAgICByZXR1cm4gb2xkRnVuYzsKK30KKworUGFzc1Jl
ZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y3JlYXRlSW5zdGFuY2UoYm9vbCBpczE2
Yml0LCBpbnQgdywgaW50IGgsIGJvb2wgaW5pdFBpeGVscykKK3sKKyAgICBTaGFyZWRCaXRtYXAq
IHJ0biA9IG5ldyBTaGFyZWRCaXRtYXAoaXMxNmJpdCwgdywgaCwgaW5pdFBpeGVscyk7CisgICAg
aWYgKHJ0biAmJiAhcnRuLT5ieXRlcygpKSB7CisgICAgICAgIGRlbGV0ZSBydG47CisgICAgICAg
IHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gYWRvcHRSZWYocnRuKTsKK30KKworU2hhcmVk
Qml0bWFwOjpTaGFyZWRCaXRtYXAoY29uc3QgQml0bWFwSW5mbyYgYm1wSW5mbywgSEJJVE1BUCBo
Ym1wLCB2b2lkKiBwaXhlbHMpCis6IG1fYm1wSW5mbyhibXBJbmZvKQorLCBtX2xvY2tlZChmYWxz
ZSkKKywgbV91c2VzVHJhbnNwYXJlbnRDb2xvcihmYWxzZSkKKywgbV90cmFuc3BhcmVudENvbG9y
KFJHQigwLCAwLCAwKSkKKywgbV9waXhlbHMocGl4ZWxzKQorLCBtX2hiaXRtYXAoaGJtcCkKKywg
bV9oYXNBbHBoYShmYWxzZSkKKywgbV92YWxpZEhlaWdodChibXBJbmZvLmhlaWdodCgpKQorewor
ICAgIGdfYml0bWFwTWFwLmFkZCh0aGlzKTsKK30KKworU2hhcmVkQml0bWFwOjpTaGFyZWRCaXRt
YXAoYm9vbCBfaXMxNmJpdCwgaW50IHcsIGludCBoLCBib29sIGluaXRQaXhlbHMpCis6IG1fYm1w
SW5mbyhfaXMxNmJpdCwgdywgaCkKKywgbV9yZWZlcmVuY2UoMSkKKywgbV9sb2NrZWQoZmFsc2Up
CissIG1fdXNlc1RyYW5zcGFyZW50Q29sb3IoZmFsc2UpCissIG1fdHJhbnNwYXJlbnRDb2xvcihS
R0IoMCwgMCwgMCkpCissIG1fcGl4ZWxzKDApCissIG1faGFzQWxwaGEoZmFsc2UpCissIG1fdmFs
aWRIZWlnaHQoYWJzKGgpKQorLCBtX2hiaXRtYXAoMCkKK3sKKyAgICBnX2JpdG1hcE1hcC5hZGQo
dGhpcyk7CisKKyAgICB1bnNpZ25lZCBidWZmZXJTaXplID0gbV9ibXBJbmZvLm51bVBpeGVscygp
OworICAgIGlmIChfaXMxNmJpdCkKKyAgICAgICAgYnVmZmVyU2l6ZSAvPSAyOworCisgICAgbV9w
aXhlbHMgPSBuZXcgdW5zaWduZWRbYnVmZmVyU2l6ZV07CisKKyAgICBpZiAoaW5pdFBpeGVscykK
KyAgICAgICAgcmVzZXRQaXhlbHMoKTsKK30KK1NoYXJlZEJpdG1hcDo6flNoYXJlZEJpdG1hcCgp
Cit7CisgICAgZ19iaXRtYXBNYXAucmVtb3ZlKHRoaXMpOworICAgIGlmIChtX2hiaXRtYXApCisg
ICAgICAgIERlbGV0ZU9iamVjdChtX2hiaXRtYXApOworICAgIGVsc2UKKyAgICAgICAgZGVsZXRl
W10gbV9waXhlbHM7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpyZXNldFBpeGVscyhib29sIGJs
YWNrKQoreworICAgIGlmIChtX3BpeGVscykgeworICAgICAgICB1bnNpZ25lZCBidWZmZXJTaXpl
ID0gbV9ibXBJbmZvLm51bVBpeGVscygpOworICAgICAgICBpZiAoYmxhY2spCisgICAgICAgICAg
ICBtZW1zZXQobV9waXhlbHMsIDAsIGJ1ZmZlclNpemUgKiAoaXMxNmJpdCgpID8gMiA6IDQpKTsK
KyAgICAgICAgZWxzZSBpZiAoaXMxNmJpdCgpKSB7CisgICAgICAgICAgICAvLyBGaWxsIGl0IHdp
dGggd2hpdGUgY29sb3IKKyNpZiBJTUFHRV9OT19BTFBIQV9VU0VfUkdCNTU1CisgICAgICAgICAg
ICB3bWVtc2V0KCh3Y2hhcl90KiltX3BpeGVscywgMHg3RkZGLCBidWZmZXJTaXplKTsKKyNlbHNl
CisgICAgICAgICAgICB3bWVtc2V0KCh3Y2hhcl90KiltX3BpeGVscywgMHhGRkZGLCBidWZmZXJT
aXplKTsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTWFrZSBpdCB3
aGl0ZSBidXQgdHJhbnNwYXJlbnQKKyAgICAgICAgICAgIHVuc2lnbmVkKiBwaXhlbCA9ICh1bnNp
Z25lZCopbV9waXhlbHM7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCogY29uc3QgYnVmZmVy
RW5kID0gcGl4ZWwgKyBidWZmZXJTaXplOworICAgICAgICAgICAgd2hpbGUgKHBpeGVsIDwgYnVm
ZmVyRW5kKQorICAgICAgICAgICAgICAgICpwaXhlbCsrID0gMHgwMEZGRkZGRjsKKyAgICAgICAg
fQorICAgIH0KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBjb252ZXJ0MzJUbzE2
KHVuc2lnbmVkIHBpeGVsKQoreworI2lmIElNQUdFX05PX0FMUEhBX1VTRV9SR0I1NTUKKyAgICB1
bnNpZ25lZCBzaG9ydCByID0gdW5zaWduZWQgc2hvcnQoKHBpeGVsICYgMHgwMEY4MDAwMCkgPj4g
OSk7CisgICAgdW5zaWduZWQgc2hvcnQgZyA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAmIDB4MDAw
MEY4MDApID4+IDYpOworICAgIHVuc2lnbmVkIHNob3J0IGIgPSB1bnNpZ25lZCBzaG9ydCgocGl4
ZWwgJiAweDAwMDAwMEY4KSA+PiAzKTsKKyNlbHNlIC8vIFJHQjU2NQorICAgIHVuc2lnbmVkIHNo
b3J0IHIgPSB1bnNpZ25lZCBzaG9ydCgocGl4ZWwgJiAweDAwRjgwMDAwKSA+PiA4KTsKKyAgICB1
bnNpZ25lZCBzaG9ydCBnID0gdW5zaWduZWQgc2hvcnQoKHBpeGVsICYgMHgwMDAwRkMwMCkgPj4g
NSk7CisgICAgdW5zaWduZWQgc2hvcnQgYiA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAmIDB4MDAw
MDAwRjgpID4+IDMpOworI2VuZGlmCisgICAgcmV0dXJuIHIgfCBnIHwgYjsKK30KKworYm9vbCBT
aGFyZWRCaXRtYXA6OnRvMTZiaXQoKQoreworICAgIGlmIChtX2xvY2tlZCkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIGlmIChpczE2Yml0KCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisg
ICAgQml0bWFwSW5mbyBuZXdCbXBJbmZvKHRydWUsIG1fYm1wSW5mby53aWR0aCgpLCBtX2JtcElu
Zm8uaGVpZ2h0KCkpOworCisgICAgTWVtb3J5QWxsb2NhdGlvbkNhbkZhaWwgY2FuRmFpbDsKKyAg
ICBpbnQgd2lkdGggPSBuZXdCbXBJbmZvLndpZHRoKCk7CisgICAgaW50IHBhZGRlZFdpZHRoID0g
bmV3Qm1wSW5mby5wYWRkZWRXaWR0aCgpOworICAgIGludCBidWZmZXJTaXplID0gcGFkZGVkV2lk
dGggKiBuZXdCbXBJbmZvLmhlaWdodCgpOworICAgIHZvaWQqIG5ld1BpeGVscyA9IG5ldyB1bnNp
Z25lZFtidWZmZXJTaXplIC8gMl07CisKKyAgICBpZiAoIW5ld1BpeGVscykKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgc2hvcnQqIHAxNiA9ICh1bnNpZ25lZCBzaG9ydCop
bmV3UGl4ZWxzOworICAgIGNvbnN0IHVuc2lnbmVkKiBwMzIgPSAoY29uc3QgdW5zaWduZWQqKW1f
cGl4ZWxzOworCisgICAgY29uc3QgYm9vbCBza2lwcyA9IHBhZGRlZFdpZHRoICE9IHdpZHRoOwor
CisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIGNvbnN0IHAxNmVuZCA9IHAxNiArIGJ1ZmZlclNp
emU7CisgICAgd2hpbGUgKHAxNiA8IHAxNmVuZCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIHNo
b3J0KiBwMTZsaW5lRW5kID0gcDE2ICsgd2lkdGg7IHAxNiA8IHAxNmxpbmVFbmQ7ICkKKyAgICAg
ICAgICAgICpwMTYrKyA9IGNvbnZlcnQzMlRvMTYoKnAzMisrKTsKKworICAgICAgICBpZiAoc2tp
cHMpCisgICAgICAgICAgICAqcDE2KysgPSAwOworICAgIH0KKworCisgICAgaWYgKG1faGJpdG1h
cCkgeworICAgICAgICBEZWxldGVPYmplY3QobV9oYml0bWFwKTsKKyAgICAgICAgbV9oYml0bWFw
ID0gMDsKKyAgICB9IGVsc2UKKyAgICAgICAgZGVsZXRlW10gbV9waXhlbHM7CisKKyAgICBtX3Bp
eGVscyA9IG5ld1BpeGVsczsKKyAgICBtX2JtcEluZm8gPSBuZXdCbXBJbmZvOworCisgICAgc2V0
SGFzQWxwaGEoZmFsc2UpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNoYXJlZEJpdG1h
cDo6ZnJlZU1lbW9yeSgpCit7CisgICAgaWYgKCFtX2xvY2tlZCkgeworICAgICAgICBpZiAobV9o
Yml0bWFwKSB7CisgICAgICAgICAgICBEZWxldGVPYmplY3QobV9oYml0bWFwKTsKKyAgICAgICAg
ICAgIG1faGJpdG1hcCA9IDA7CisgICAgICAgICAgICBtX3BpeGVscyA9IDA7CisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChtX3BpeGVscykgeworICAgICAgICAg
ICAgZGVsZXRlW10gbV9waXhlbHM7CisgICAgICAgICAgICBtX3BpeGVscyA9IDA7CisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK0hCSVRNQVAgU2hhcmVkQml0bWFwOjpjcmVhdGVIYW5kbGUodm9pZCoqIHBpeGVscywgQml0
bWFwSW5mbyogYm1wSW5mbywgaW50IGgsIGJvb2wgdXNlMTZiaXQpIGNvbnN0Cit7CisgICAgaWYg
KCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBNZW1vcnlBbGxvY2F0aW9uQ2Fu
RmFpbCBjYW5GYWlsOworCisgICAgaWYgKGggPT0gLTEpCisgICAgICAgIGggPSBoZWlnaHQoKTsK
KyAgICAqYm1wSW5mbyA9IEJpdG1hcEluZm8odXNlMTZiaXQgfHwgaXMxNmJpdCgpLCB3aWR0aCgp
LCBoKTsKKworICAgIEhCSVRNQVAgaGJtcCA9IE1lbW9yeU1hbmFnZXI6OmNyZWF0ZURJQlNlY3Rp
b24oYm1wSW5mbywgcGl4ZWxzKTsKKworICAgIGlmICghaGJtcCkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBPd25QdHI8SERDPiBibXBEQyhDcmVhdGVDb21wYXRpYmxlREMoMCkpOworICAgIEhH
RElPQkogaE9sZEJtcCA9IFNlbGVjdE9iamVjdChibXBEQy5nZXQoKSwgaGJtcCk7CisKKyAgICBT
dHJldGNoRElCaXRzKGJtcERDLmdldCgpLCAwLCAwLCB3aWR0aCgpLCBoLCAwLCAwLCB3aWR0aCgp
LCBoCisgICAgICAgICwgbV9waXhlbHMsICZtX2JtcEluZm8sIERJQl9SR0JfQ09MT1JTLCBTUkND
T1BZKTsKKworICAgIFNlbGVjdE9iamVjdChibXBEQy5nZXQoKSwgaE9sZEJtcCk7CisKKyAgICBy
ZXR1cm4gaGJtcDsKK30KKworYm9vbCBTaGFyZWRCaXRtYXA6OmVuc3VyZUhhbmRsZSgpCit7Cisg
ICAgaWYgKG1faGJpdG1hcCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoIW1fcGl4
ZWxzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9sb2NrZWQpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICB2b2lkKiBwaXhl
bHM7CisgICAgbV9oYml0bWFwID0gY3JlYXRlSGFuZGxlKCZwaXhlbHMsICZibXBJbmZvLCAtMSwg
IWhhc0FscGhhKCkpOworCisgICAgaWYgKCFtX2hiaXRtYXApCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworICAgIG1fcGl4ZWxzID0gcGl4ZWxzOworICAg
IG1fYm1wSW5mbyA9IGJtcEluZm87CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaGFy
ZWRCaXRtYXA6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRSZWN0JiBkc3RS
ZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVP
cCkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisgICAgY3R4dC0+ZHJh
d0JpdG1hcCh0aGlzLCBkc3RSZWN0LCBzcmNSZWN0LCBjb21wb3NpdGVPcCk7Cit9CisKK3ZvaWQg
U2hhcmVkQml0bWFwOjpkcmF3KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0
IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAg
IGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChkc3RSZWN0LmlzRW1w
dHkoKSB8fCBzcmNSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGdf
ZHJhd0ltYWdlICYmIGdfZHJhd0ltYWdlKHRoaXMsIGhkYywgZHN0UmVjdCwgc3JjUmVjdCwgY29t
cG9zaXRlT3ApKQorICAgICAgICByZXR1cm47CisKKyAgICBIQklUTUFQIGhiaXRtYXAgPSAwOwor
ICAgIGJvb2wgdXNpbmdIYW5kbGUgPSBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVy
ICYmICgKKyNpZiAhZGVmaW5lZChOT19BTFBIQUJMRU5EKQorICAgICAgICBoYXNBbHBoYSgpIHx8
CisjZW5kaWYKKyAgICAgICAgdXNlc1RyYW5zcGFyZW50Q29sb3IoKSk7CisKKyAgICBpZiAodXNp
bmdIYW5kbGUpIHsKKyAgICAgICAgaWYgKGVuc3VyZUhhbmRsZSgpKQorICAgICAgICAgICAgaGJp
dG1hcCA9IG1faGJpdG1hcDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2b2lkKiBwaXhl
bHM7CisgICAgICAgICAgICBCaXRtYXBJbmZvIGJtcEluZm87CisgICAgICAgICAgICBoYml0bWFw
ID0gY3JlYXRlSGFuZGxlKCZwaXhlbHMsICZibXBJbmZvLCAtMSwgdXNlc1RyYW5zcGFyZW50Q29s
b3IoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFoYml0bWFwKSB7CisgICAgICAgIC8v
IEZJWE1FOiBoYW5kbGUgb3RoZXIgY29tcG9zaXRlIG9wZXJhdGlvbiB0eXBlcz8KKyAgICAgICAg
RFdPUkQgcm9wID0gY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlQ29weSA/IFNSQ0NPUFkKKyAgICAg
ICAgICAgIDogY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlWE9SID8gUEFUSU5WRVJUCisgICAgICAg
ICAgICA6IGNvbXBvc2l0ZU9wID09IENvbXBvc2l0ZUNsZWFyID8gV0hJVEVORVNTCisgICAgICAg
ICAgICA6IFNSQ0NPUFk7CisKKyAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFJlY3QueCgp
LCBkc3RSZWN0LnkoKSwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpCisgICAgICAg
ICAgICAsIHNyY1JlY3QueCgpLCBzcmNSZWN0LnkoKSwgc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0
LmhlaWdodCgpLCBtX3BpeGVscywgJm1fYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsIHJvcCk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgT3duUHRyPEhEQz4gaG1lbWRjKENyZWF0ZUNvbXBhdGlibGVE
QyhoZGMpKTsKKyAgICAgICAgSEdESU9CSiBoT2xkQm1wID0gU2VsZWN0T2JqZWN0KGhtZW1kYy5n
ZXQoKSwgaGJpdG1hcCk7CisKKyNpZiAhZGVmaW5lZChOT19BTFBIQUJMRU5EKQorICAgICAgICBp
ZiAoIXVzZXNUcmFuc3BhcmVudENvbG9yKCkpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBC
TEVOREZVTkNUSU9OIGJsZW5kID0geyBBQ19TUkNfT1ZFUiwgMCwgMjU1LCBBQ19TUkNfQUxQSEEg
fTsKKyAgICAgICAgICAgIEFscGhhQmxlbmQoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCks
IGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgaG1lbWRjLmdldCgpCisgICAgICAg
ICAgICAgICAgLCBzcmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qud2lkdGgoKSwgc3Jj
UmVjdC5oZWlnaHQoKSwgYmxlbmQpOworICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICB7
CisgICAgICAgICAgICBUcmFuc3BhcmVudEJsdChoZGMsIGRzdFJlY3QueCgpLCBkc3RSZWN0Lnko
KSwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpLCBobWVtZGMuZ2V0KCkKKyAgICAg
ICAgICAgICAgICAsIHNyY1JlY3QueCgpLCBzcmNSZWN0LnkoKSwgc3JjUmVjdC53aWR0aCgpLCBz
cmNSZWN0LmhlaWdodCgpLCB0cmFuc3BhcmVudENvbG9yKCkpOworICAgICAgICB9CisKKyAgICAg
ICAgU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgaE9sZEJtcCk7CisgICAgICAgIGlmIChoYml0
bWFwICE9IG1faGJpdG1hcCkKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdChoYml0bWFwKTsKKyAg
ICB9Cit9CisKKworSEJJVE1BUCBTaGFyZWRCaXRtYXA6OmNsaXBCaXRtYXAoY29uc3QgSW50UmVj
dCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlQWxwaGEs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXBJbmZvJiBibXBJbmZvLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHBpeGVscykKK3sKKyAgICBp
ZiAoIWJ5dGVzKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaW50IG9sZFdpZHRoID0gd2lk
dGgoKTsKKyAgICBpbnQgb2xkSGVpZ2h0ID0gaGVpZ2h0KCk7CisgICAgaW50IGNvcHlXaWR0aCA9
IHN0ZDo6bWluPGludD4ocmVjdC53aWR0aCgpLCBvbGRXaWR0aCAtIHJlY3QueCgpKTsKKyAgICBp
bnQgY29weUhlaWdodCA9IHN0ZDo6bWluPGludD4ocmVjdC5oZWlnaHQoKSwgb2xkSGVpZ2h0IC0g
cmVjdC55KCkpOworICAgIGlmICghY29weVdpZHRoIHx8ICFjb3B5SGVpZ2h0KQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIGJtcEluZm8gPSBCaXRtYXBJbmZvKCEodXNlQWxwaGEgJiYgaXMzMmJp
dCgpKSwgY29weVdpZHRoLCBjb3B5SGVpZ2h0KTsKKyAgICBIQklUTUFQIG5ld0JtcCA9IE1lbW9y
eU1hbmFnZXI6OmNyZWF0ZURJQlNlY3Rpb24oJmJtcEluZm8sICZwaXhlbHMpOworCisgICAgaWYg
KG5ld0JtcCkgeworICAgICAgICBPd25QdHI8SERDPiBkY05ldyg6OkNyZWF0ZUNvbXBhdGlibGVE
QygwKSk7CisgICAgICAgIEhHRElPQkogdG1wTmV3ID0gOjpTZWxlY3RPYmplY3QoZGNOZXcuZ2V0
KCksIG5ld0JtcCk7CisKKyAgICAgICAgU3RyZXRjaERJQml0cyhkY05ldy5nZXQoKSwgMCwgMCwg
Y29weVdpZHRoLCBjb3B5SGVpZ2h0LCByZWN0LngoKSwgcmVjdC55KCksIGNvcHlXaWR0aCwgY29w
eUhlaWdodAorICAgICAgICAgICAgLCBieXRlcygpLCAmYml0bWFwSW5mbygpLCBESUJfUkdCX0NP
TE9SUywgU1JDQ09QWSk7CisKKyAgICAgICAgU2VsZWN0T2JqZWN0KGRjTmV3LmdldCgpLCB0bXBO
ZXcpOworICAgIH0KKworICAgIHJldHVybiBuZXdCbXA7Cit9CisKKworUGFzc1JlZlB0cjxTaGFy
ZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y2xpcEJpdG1hcChjb25zdCBJbnRSZWN0JiByZWN0LCBi
b29sIHVzZUFscGhhKQoreworICAgIGludCBvbGRXaWR0aCA9IHdpZHRoKCk7CisgICAgaW50IG9s
ZEhlaWdodCA9IGhlaWdodCgpOworICAgIGludCBjb3B5V2lkdGggPSBzdGQ6Om1pbjxpbnQ+KHJl
Y3Qud2lkdGgoKSwgb2xkV2lkdGggLSByZWN0LngoKSk7CisgICAgaW50IGNvcHlIZWlnaHQgPSBz
dGQ6Om1pbjxpbnQ+KHJlY3QuaGVpZ2h0KCksIG9sZEhlaWdodCAtIHJlY3QueSgpKTsKKyAgICBp
ZiAoIWNvcHlXaWR0aCB8fCAhY29weUhlaWdodCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBT
aGFyZWRCaXRtYXAqIG5ld0JtcCA9IG5ldyBTaGFyZWRCaXRtYXAoISh1c2VBbHBoYSAmJiBpczMy
Yml0KCkpLCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQsIGZhbHNlKTsKKworICAgIGlmICghbmV3Qm1w
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghbmV3Qm1wLT5ieXRlcygpKSB7CisgICAg
ICAgIGRlbGV0ZSBuZXdCbXA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIERDSG9s
ZGVyIGRjTmV3KG5ld0JtcCk7CisKKyAgICBTdHJldGNoRElCaXRzKGRjTmV3LmdldCgpLCAwLCAw
LCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQsIHJlY3QueCgpLCByZWN0LnkoKSwgY29weVdpZHRoLCBj
b3B5SGVpZ2h0CisgICAgICAgICwgYnl0ZXMoKSwgJmJpdG1hcEluZm8oKSwgRElCX1JHQl9DT0xP
UlMsIFNSQ0NPUFkpOworCisgICAgcmV0dXJuIGFkb3B0UmVmKG5ld0JtcCk7Cit9CisKK3N0YXRp
YyB2b2lkIGRyYXdQYXR0ZXJuU2ltcGxlKEhEQyBoZGMsIGNvbnN0IFJFQ1QmIGRlc3RSZWN0LCBI
QklUTUFQIGhibXAsIGNvbnN0IFBPSU5UJiBwaGFzZSkKK3sKKyAgICBIQlJVU0ggaEJydXNoID0g
Q3JlYXRlUGF0dGVybkJydXNoKGhibXApOworICAgIGlmIChoQnJ1c2gpIHsKKyAgICAgICAgUE9J
TlQgb2xkT3JnOworICAgICAgICBTZXRCcnVzaE9yZ0V4KGhkYywgZGVzdFJlY3QubGVmdCAtIHBo
YXNlLngsIGRlc3RSZWN0LnRvcCAtIHBoYXNlLnksICZvbGRPcmcpOworICAgICAgICBGaWxsUmVj
dChoZGMsICZkZXN0UmVjdCwgaEJydXNoKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0KGhCcnVzaCk7
CisgICAgICAgIFNldEJydXNoT3JnRXgoaGRjLCBvbGRPcmcueCwgb2xkT3JnLnksIDApOworICAg
IH0KK30KKworc3RhdGljIHZvaWQgZHJhd1BhdHRlcm5TaW1wbGUoSERDIGhkYywgY29uc3QgUkVD
VCYgZGVzdFJlY3QsIGNvbnN0IFNoYXJlZEJpdG1hcCogYm1wLCBjb25zdCBTSVpFJiBibXBTaXpl
LCBjb25zdCBQT0lOVCYgcGhhc2UpCit7CisgICAgaW50IGRzdFkgPSBkZXN0UmVjdC50b3A7Cisg
ICAgZm9yIChpbnQgc291cmNlWSA9IHBoYXNlLnk7IGRzdFkgPCBkZXN0UmVjdC5ib3R0b207ICkg
eworICAgICAgICBpbnQgc291cmNlSCA9IHN0ZDo6bWluPGludD4oYm1wU2l6ZS5jeSAtIHNvdXJj
ZVksIGRlc3RSZWN0LmJvdHRvbSAtIGRzdFkpOworICAgICAgICBpbnQgZHN0WCA9IGRlc3RSZWN0
LmxlZnQ7CisgICAgICAgIGZvciAoaW50IHNvdXJjZVggPSBwaGFzZS54OyBkc3RYIDwgZGVzdFJl
Y3QucmlnaHQ7ICkgeworICAgICAgICAgICAgaW50IHNvdXJjZVcgPSBzdGQ6Om1pbjxpbnQ+KGJt
cFNpemUuY3ggLSBzb3VyY2VYLCBkZXN0UmVjdC5yaWdodCAtIGRzdFgpOworCisgICAgICAgICAg
ICBTdHJldGNoRElCaXRzKGhkYywgZHN0WCwgZHN0WSwgc291cmNlVywgc291cmNlSCwgc291cmNl
WCwgc291cmNlWSwgc291cmNlVywgc291cmNlSAorICAgICAgICAgICAgICAgICwgYm1wLT5ieXRl
cygpLCAmYm1wLT5iaXRtYXBJbmZvKCksIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKKworICAg
ICAgICAgICAgZHN0WCArPSBzb3VyY2VXOworICAgICAgICAgICAgc291cmNlWCA9IDA7CisgICAg
ICAgIH0KKworICAgICAgICBkc3RZICs9IHNvdXJjZUg7CisgICAgICAgIHNvdXJjZVkgPSAwOwor
ICAgIH0KK30KKwordm9pZCBub3JtYWxpemVQaGFzZShMT05HJiBwaGFzZSwgaW50IGxpbWl0KQor
eworICAgIGlmICghcGhhc2UpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAobGltaXQgPCAyKSB7
CisgICAgICAgIHBoYXNlID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobGlt
aXQgPT0gMikgeworICAgICAgICBwaGFzZSA9IHBoYXNlICYgMTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICBpZiAocGhhc2UgPCAwKSB7CisgICAgICAgIHBoYXNlID0gLXBoYXNlOworICAg
ICAgICBpZiAocGhhc2UgPiBsaW1pdCkKKyAgICAgICAgICAgIHBoYXNlID0gKExPTkcpKCh1bnNp
Z25lZClwaGFzZSAlICh1bnNpZ25lZClsaW1pdCk7CisgICAgICAgIGlmIChwaGFzZSkKKyAgICAg
ICAgICAgIHBoYXNlID0gbGltaXQgLSBwaGFzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAo
cGhhc2UgPCBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcGhhc2UgPSAoTE9O
RykoKHVuc2lnbmVkKXBoYXNlICUgKHVuc2lnbmVkKWxpbWl0KTsKKyAgICB9Cit9CisKK3ZvaWQg
U2hhcmVkQml0bWFwOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZs
b2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5U
cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFz
ZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0
IEludFNpemUmIG9yaWdTb3VyY2VTaXplKQoreworICAgIGlmICghbV9waXhlbHMpCisgICAgICAg
IHJldHVybjsKKyAgICBjdHh0LT5kcmF3Qml0bWFwUGF0dGVybih0aGlzLCB0aWxlUmVjdEluLCBw
YXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgb3AsIGRlc3RSZWN0LCBvcmlnU291cmNlU2l6ZSk7Cit9
CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3UGF0dGVybihIREMgaGRjLCBjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNv
bnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9w
LCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6
ZSkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZ19k
cmF3UGF0dGVybikgeworICAgICAgICBnX2RyYXdQYXR0ZXJuKHRoaXMsIGhkYywgdHJhbnNmb3Jt
LCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgb3AsIGRlc3RSZWN0LCBvcmln
U291cmNlU2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGlsZVJlY3RJ
bi53aWR0aCgpIDw9IDAgfHwgdGlsZVJlY3RJbi5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1
cm47CisKKyAgICBib29sIHVzZUFscGhhID0gb3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAmJiBo
YXNBbHBoYSgpICYmIGlzMzJiaXQoKTsKKworICAgIGludCBibXBXaWR0aCA9IHdpZHRoKCk7Cisg
ICAgaW50IGJtcEhlaWdodCA9IGhlaWdodCgpOworCisgICAgRmxvYXRSZWN0IHRpbGVSZWN0KHRp
bGVSZWN0SW4pOworICAgIGlmIChibXBXaWR0aCAhPSBvcmlnU291cmNlU2l6ZS53aWR0aCgpKSB7
CisgICAgICAgIGRvdWJsZSByYXRlID0gKGRvdWJsZSlibXBXaWR0aCAvIG9yaWdTb3VyY2VTaXpl
LndpZHRoKCk7CisgICAgICAgIGRvdWJsZSB0ZW1wID0gdGlsZVJlY3Qud2lkdGgoKSAqIHJhdGU7
CisgICAgICAgIHRpbGVSZWN0LnNldFgodGlsZVJlY3QueCgpICogcmF0ZSk7CisgICAgICAgIHRp
bGVSZWN0LnNldFdpZHRoKHRlbXApOworICAgICAgICB0ZW1wID0gdGlsZVJlY3QuaGVpZ2h0KCkg
KiByYXRlOworICAgICAgICB0aWxlUmVjdC5zZXRZKHRpbGVSZWN0LnkoKSAqIHJhdGUpOworICAg
ICAgICB0aWxlUmVjdC5zZXRIZWlnaHQodGVtcCk7CisgICAgfQorCisgICAgT3duUHRyPEhCSVRN
QVA+IGNsaXBwZWRCbXA7CisKKyAgICBpZiAodGlsZVJlY3QueCgpIHx8IHRpbGVSZWN0LnkoKSB8
fCB0aWxlUmVjdC53aWR0aCgpICE9IGJtcFdpZHRoIHx8IHRpbGVSZWN0LmhlaWdodCgpICE9IGJt
cEhlaWdodCkgeworICAgICAgICBCaXRtYXBJbmZvIHBhdHRlcm5CbXBJbmZvOworICAgICAgICB2
b2lkKiBwYXR0ZXJuUGl4ZWxzOworICAgICAgICBjbGlwcGVkQm1wLnNldChjbGlwQml0bWFwKElu
dFJlY3QodGlsZVJlY3QpLCB1c2VBbHBoYSwgcGF0dGVybkJtcEluZm8sIHBhdHRlcm5QaXhlbHMp
KTsKKyAgICAgICAgaWYgKCFjbGlwcGVkQm1wKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgIGJtcFdpZHRoID0gdGlsZVJlY3Qud2lkdGgoKTsKKyAgICAgICAgYm1wSGVpZ2h0ID0gdGls
ZVJlY3QuaGVpZ2h0KCk7CisgICAgfQorCisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdGYgPSB0
cmFuc2Zvcm07CisgICAgdGYgKj0gcGF0dGVyblRyYW5zZm9ybTsKKworICAgIEZsb2F0UmVjdCB0
clJlY3QgPSB0Zi5tYXBSZWN0KGRlc3RSZWN0KTsKKworICAgIFJFQ1QgY2xpcEJveDsKKyAgICBp
bnQgY2xpcFR5cGUgPSBHZXRDbGlwQm94KGhkYywgJmNsaXBCb3gpOworICAgIGlmIChjbGlwVHlw
ZSA9PSBTSU1QTEVSRUdJT04pCisgICAgICAgIHRyUmVjdC5pbnRlcnNlY3QoRmxvYXRSZWN0KGNs
aXBCb3gubGVmdCwgY2xpcEJveC50b3AsIGNsaXBCb3gucmlnaHQgLSBjbGlwQm94LmxlZnQsIGNs
aXBCb3guYm90dG9tIC0gY2xpcEJveC50b3ApKTsKKyAgICBlbHNlIGlmIChjbGlwVHlwZSA9PSBD
T01QTEVYUkVHSU9OKSB7CisgICAgICAgIE93blB0cjxIUkdOPiBjbGlwUmduKENyZWF0ZVJlY3RS
Z24oMCwgMCwgMCwgMCkpOworICAgICAgICBpZiAoR2V0Q2xpcFJnbihoZGMsIGNsaXBSZ24uZ2V0
KCkpID4gMCkgeworICAgICAgICAgICAgRFdPUkQgcmVnaW9uRGF0YVNpemUgPSBHZXRSZWdpb25E
YXRhKGNsaXBSZ24uZ2V0KCksIHNpemVvZihSR05EQVRBKSwgMCk7CisgICAgICAgICAgICBpZiAo
cmVnaW9uRGF0YVNpemUpIHsKKyAgICAgICAgICAgICAgICBSR05EQVRBKiByZWdpb25EYXRhID0g
bmV3IFJHTkRBVEFbcmVnaW9uRGF0YVNpemVdOworICAgICAgICAgICAgICAgIEdldFJlZ2lvbkRh
dGEoY2xpcFJnbi5nZXQoKSwgcmVnaW9uRGF0YVNpemUsIHJlZ2lvbkRhdGEpOworICAgICAgICAg
ICAgICAgIFJFQ1QqIHJlY3QgPSAoUkVDVCopcmVnaW9uRGF0YS0+QnVmZmVyOworICAgICAgICAg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByZWdpb25EYXRhLT5yZGgubkNvdW50OyAr
K2ksICsrcmVjdCkKKyAgICAgICAgICAgICAgICAgICAgdHJSZWN0LmludGVyc2VjdChGbG9hdFJl
Y3QocmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5yaWdodCAtIHJlY3QtPmxlZnQsIHJlY3Qt
PmJvdHRvbSAtIHJlY3QtPnRvcCkpOworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIHJlZ2lvbkRh
dGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHJSZWN0Lndp
ZHRoKCkgPD0gMCB8fCB0clJlY3QuaGVpZ2h0KCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgdHJSZWN0LmluZmxhdGUoMSk7CisgICAgSW50UmVjdCB2aXNpYmxlRHN0UmVjdCA9IGVuY2xv
c2luZ0ludFJlY3QodGYuaW52ZXJzZSgpLm1hcFJlY3QodHJSZWN0KSk7CisgICAgdmlzaWJsZURz
dFJlY3QuaW50ZXJzZWN0KEludFJlY3QoZGVzdFJlY3QpKTsKKworICAgIGlmICh2aXNpYmxlRHN0
UmVjdC53aWR0aCgpIDw9IDAgfHwgdmlzaWJsZURzdFJlY3QuaGVpZ2h0KCkgPD0gMCkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgdHJSZWN0ID0gdGYubWFwUmVjdCh2aXNpYmxlRHN0UmVjdCk7Cisg
ICAgUkVDVCBkc3RSZWN0V2luID0KKyAgICB7CisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC54
KCkpLAorICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QueSgpKSwKKyAgICAgICAgc3RhYmxlUm91
bmQodHJSZWN0LnJpZ2h0KCkpLAorICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QuYm90dG9tKCkp
LAorICAgIH07CisgICAgaWYgKGRzdFJlY3RXaW4ucmlnaHQgPD0gZHN0UmVjdFdpbi5sZWZ0IHx8
IGRzdFJlY3RXaW4uYm90dG9tIDw9IGRzdFJlY3RXaW4udG9wKQorICAgICAgICByZXR1cm47CisK
KyAgICBTSVpFIGJtcFNpemUgPSB7IGJtcFdpZHRoLCBibXBIZWlnaHQgfTsKKworICAgIC8vIFJl
bGF0aXZlIHRvIGRlc3RpbmF0aW9uLCBpbiBiaXRtYXAgcGl4ZWxzCisgICAgUE9JTlQgcGhhc2VX
aW4gPSB7IHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LngoKSAtIHBoYXNlLngoKSksIHN0YWJs
ZVJvdW5kKHZpc2libGVEc3RSZWN0LnkoKSAtIHBoYXNlLnkoKSkgfTsKKyAgICBub3JtYWxpemVQ
aGFzZShwaGFzZVdpbi54LCBibXBTaXplLmN4KTsKKyAgICBub3JtYWxpemVQaGFzZShwaGFzZVdp
bi55LCBibXBTaXplLmN5KTsKKworICAgIHsKKyAgICAgICAgUkVDVCBzcmNSZWN0V2luID0KKyAg
ICAgICAgeworICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBzdGFi
bGVSb3VuZCh2aXNpYmxlRHN0UmVjdC5yaWdodCgpKSAtIHN0YWJsZVJvdW5kKHZpc2libGVEc3RS
ZWN0LngoKSksCisgICAgICAgICAgICBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC5ib3R0b20o
KSkgLSBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC55KCkpCisgICAgICAgIH07CisgICAgICAg
IGlmIChzcmNSZWN0V2luLnJpZ2h0IDw9IDAgfHwgc3JjUmVjdFdpbi5ib3R0b20gPD0gMCkKKyAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICBCaXRtYXBJbmZvIGJtcEluZm8oIXVzZUFscGhh
LCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSk7CisgICAgICAgIHZvaWQqIHBp
eGVsczsKKyAgICAgICAgT3duUHRyPEhCSVRNQVA+IGhibXBUZW1wKE1lbW9yeU1hbmFnZXI6OmNy
ZWF0ZURJQlNlY3Rpb24oJmJtcEluZm8sICZwaXhlbHMpKTsKKworICAgICAgICBpZiAoaGJtcFRl
bXApIHsKKyAgICAgICAgICAgIE93blB0cjxIREM+IGhtZW1kYyhDcmVhdGVDb21wYXRpYmxlREMo
aGRjKSk7CisgICAgICAgICAgICBIR0RJT0JKIG9sZEJtcCA9IFNlbGVjdE9iamVjdChobWVtZGMu
Z2V0KCksIGhibXBUZW1wLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChjbGlwcGVkQm1wKQorICAg
ICAgICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3JjUmVjdFdpbiwg
Y2xpcHBlZEJtcC5nZXQoKSwgcGhhc2VXaW4pOworICAgICAgICAgICAgZWxzZSBpZiAoKG9wICE9
IENvbXBvc2l0ZVNvdXJjZU92ZXIgfHwgY2FuVXNlRElCaXRzKCkpICYmIHNyY1JlY3RXaW4ucmln
aHQgPD0gYm1wU2l6ZS5jeCAqIDIgJiYgc3JjUmVjdFdpbi5ib3R0b20gPD0gYm1wU2l6ZS5jeSAq
IDIpCisgICAgICAgICAgICAgICAgZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNS
ZWN0V2luLCB0aGlzLCBibXBTaXplLCBwaGFzZVdpbik7CisgICAgICAgICAgICBlbHNlIGlmIChl
bnN1cmVIYW5kbGUoKSkKKyAgICAgICAgICAgICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMu
Z2V0KCksIHNyY1JlY3RXaW4sIGdldEhhbmRsZSgpLCBwaGFzZVdpbik7CisgICAgICAgICAgICBl
bHNlIHsKKyAgICAgICAgICAgICAgICB2b2lkKiBwaXhlbHM7CisgICAgICAgICAgICAgICAgQml0
bWFwSW5mbyBibXBJbmZvOworICAgICAgICAgICAgICAgIGlmIChIQklUTUFQIGhibXAgPSBjcmVh
dGVIYW5kbGUoJnBpeGVscywgJmJtcEluZm8sIC0xLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0V2luLCBoYm1wLCBw
aGFzZVdpbik7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZU9iamVjdChoYm1wKTsKKyAgICAg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTZWxlY3RPYmplY3QoaG1l
bWRjLmdldCgpLCBvbGRCbXApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorCisjaWYgZGVmaW5lZChOT19BTFBIQUJMRU5EKQor
ICAgICAgICAgICAgaWYgKHVzZUFscGhhIHx8KG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgJiYg
dXNlc1RyYW5zcGFyZW50Q29sb3IoKSkpCisjZWxzZQorICAgICAgICAgICAgaWYgKHVzZUFscGhh
KSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IEJMRU5ERlVOQ1RJT04gYmxlbmQgPSB7
IEFDX1NSQ19PVkVSLCAwLCAyNTUsIEFDX1NSQ19BTFBIQSB9OworICAgICAgICAgICAgICAgIEFs
cGhhQmxlbmQoaGRjLCBkc3RSZWN0V2luLmxlZnQsIGRzdFJlY3RXaW4udG9wLCBkc3RSZWN0V2lu
LnJpZ2h0IC0gZHN0UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4u
dG9wCisgICAgICAgICAgICAgICAgICAgICwgaG1lbWRjLmdldCgpLCAwLCAwLCBzcmNSZWN0V2lu
LnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSwgYmxlbmQpOworICAgICAgICAgICAgfSBlbHNlIGlm
IChvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVyICYmIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpCisj
ZW5kaWYKKyAgICAgICAgICAgICAgICBUcmFuc3BhcmVudEJsdChoZGMsIGRzdFJlY3RXaW4ubGVm
dCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0V2luLmxlZnQKKyAg
ICAgICAgICAgICAgICAgICAgLCBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9wLCBo
bWVtZGMuZ2V0KCksIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tLCB0
cmFuc3BhcmVudENvbG9yKCkpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAg
RFdPUkQgYm1wT3AgPSBvcCA9PSBDb21wb3NpdGVDb3B5ID8gU1JDQ09QWQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIDogb3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciA/IFNSQ0NPUFkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wID09IENvbXBvc2l0ZVhPUiA/IFBBVElOVkVS
VAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3AgPT0gQ29tcG9zaXRlQ2xlYXIgPyBX
SElURU5FU1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNSQ0NPUFk7IC8vIEZJWEVN
RTogb3RoZXIgdHlwZXM/CisKKyAgICAgICAgICAgICAgICBTdHJldGNoRElCaXRzKGhkYywgZHN0
UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2luLnRvcCwgZHN0UmVjdFdpbi5yaWdodCAtIGRzdFJlY3RX
aW4ubGVmdAorICAgICAgICAgICAgICAgICAgICAsIGRzdFJlY3RXaW4uYm90dG9tIC0gZHN0UmVj
dFdpbi50b3AsIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tCisgICAg
ICAgICAgICAgICAgICAgICwgcGl4ZWxzLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsIGJtcE9w
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCks
IG9sZEJtcCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1NoYXJlZEJpdG1hcDo6RENQcm92aWRl
ciBnX2RjUHJvdmlkZXI7CitTaGFyZWRCaXRtYXA6OkRDUHJvdmlkZXIqIFNoYXJlZEJpdG1hcDo6
bV9kY1Byb3ZpZGVyID0gJmdfZGNQcm92aWRlcjsKKworSERDIFNoYXJlZEJpdG1hcDo6RENQcm92
aWRlcjo6Z2V0REMoU2hhcmVkQml0bWFwKiBibXAsIHVuc2lnbmVkKiBrZXkxLCB1bnNpZ25lZCog
a2V5MikKK3sKKyAgICBpZiAoIWJtcCB8fCAhYm1wLT5lbnN1cmVIYW5kbGUoKSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBIREMgaGRjID0gOjpDcmVhdGVDb21wYXRpYmxlREMoMCk7CisgICAg
aWYgKGhkYykgeworICAgICAgICAqa2V5MSA9ICh1bnNpZ25lZClTZWxlY3RPYmplY3QoaGRjLCBi
bXAtPmdldEhhbmRsZSgpKTsKKyAgICAgICAgUkVDVCByZWN0ID0geyAwLCAwLCBibXAtPndpZHRo
KCksIGJtcC0+aGVpZ2h0KCkgfTsKKyAgICAgICAgT3duUHRyPEhSR04+IGNsaXBSZ24oQ3JlYXRl
UmVjdFJnbkluZGlyZWN0KCZyZWN0KSk7CisgICAgICAgIFNlbGVjdENsaXBSZ24oaGRjLCBjbGlw
UmduLmdldCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gaGRjOworfQorCit2b2lkIFNoYXJlZEJp
dG1hcDo6RENQcm92aWRlcjo6cmVsZWFzZURDKFNoYXJlZEJpdG1hcCosIEhEQyBoZGMsIHVuc2ln
bmVkIGtleTEsIHVuc2lnbmVkIGtleTIpCit7CisgICAgaWYgKCFoZGMpCisgICAgICAgIHJldHVy
bjsKKworICAgIFNlbGVjdE9iamVjdChoZGMsIChIR0RJT0JKKWtleTEpOworICAgIERlbGV0ZURD
KGhkYyk7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpjbGVhclBpeGVscyhjb25zdCBJbnRSZWN0
JiByKQoreworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJl
Y3QgYm1wUmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSk7CisgICAgYm1wUmVjdC5pbnRlcnNl
Y3Qocik7CisgICAgaWYgKGlzMTZiaXQoKSkgeworICAgICAgICBpbnQgdyA9IG1fYm1wSW5mby5w
YWRkZWRXaWR0aCgpOworICAgICAgICB1bnNpZ25lZCBzaG9ydCogZHN0ID0gKHVuc2lnbmVkIHNo
b3J0KiltX3BpeGVsczsKKyAgICAgICAgZHN0ICs9IGJtcFJlY3QueSgpICogdyArIGJtcFJlY3Qu
eCgpOworICAgICAgICBpbnQgd29yZHNUb1NldCA9IGJtcFJlY3Qud2lkdGgoKTsKKyAgICAgICAg
Y29uc3QgdW5zaWduZWQgc2hvcnQqIGRzdEVuZCA9IGRzdCArIGJtcFJlY3QuaGVpZ2h0KCkgKiB3
OworICAgICAgICB3aGlsZSAoZHN0IDwgZHN0RW5kKSB7CisgICAgICAgICAgICB3bWVtc2V0KCh3
Y2hhcl90Kilkc3QsIDAsIHdvcmRzVG9TZXQpOworICAgICAgICAgICAgZHN0ICs9IHc7CisgICAg
ICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgdyA9IHdpZHRoKCk7CisgICAgICAgIHVu
c2lnbmVkKiBkc3QgPSAodW5zaWduZWQqKW1fcGl4ZWxzOworICAgICAgICBkc3QgKz0gYm1wUmVj
dC55KCkgKiB3ICsgYm1wUmVjdC54KCk7CisgICAgICAgIGludCB3b3Jkc1RvU2V0ID0gYm1wUmVj
dC53aWR0aCgpICogMjsKKyAgICAgICAgY29uc3QgdW5zaWduZWQqIGRzdEVuZCA9IGRzdCArIGJt
cFJlY3QuaGVpZ2h0KCkgKiB3OworICAgICAgICB3aGlsZSAoZHN0IDwgZHN0RW5kKSB7CisgICAg
ICAgICAgICB3bWVtc2V0KCh3Y2hhcl90Kilkc3QsIDAsIHdvcmRzVG9TZXQpOworICAgICAgICAg
ICAgZHN0ICs9IHc7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30KKwpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaCBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uMzc2NzY0MwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJCaXRtYXBJbmZv
LmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRl
ZC5oPgorI2luY2x1ZGUgPHdpbmdkaS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBl
bnVtIENvbXBvc2l0ZU9wZXJhdG9yOworICAgIGNsYXNzIEZsb2F0UG9pbnQ7CisgICAgY2xhc3Mg
RmxvYXRSZWN0OworICAgIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKKyAgICBjbGFzcyBJbnRSZWN0
OworICAgIGNsYXNzIEludFNpemU7CisgICAgY2xhc3MgVHJhbnNmb3JtYXRpb25NYXRyaXg7CisK
KyAgICBjbGFzcyBTaGFyZWRCaXRtYXA6IHB1YmxpYyBSZWZDb3VudGVkPFNoYXJlZEJpdG1hcD4g
eworICAgIHB1YmxpYzoKKyAgICAgICAgflNoYXJlZEJpdG1hcCgpOworICAgICAgICBzdGF0aWMg
UGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IGNyZWF0ZUluc3RhbmNlKGJvb2wgaXMxNmJpdCwgaW50
IHcsIGludCBoLCBib29sIGluaXRQaXhlbHMpOworICAgICAgICBjb25zdCBCaXRtYXBJbmZvJiBi
aXRtYXBJbmZvKCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvOyB9CisgICAgICAgIHZvaWQqIGJ5
dGVzKCkgeyByZXR1cm4gbV9waXhlbHM7IH0KKyAgICAgICAgY29uc3Qgdm9pZCogYnl0ZXMoKSBj
b25zdCB7IHJldHVybiBtX3BpeGVsczsgfQorICAgICAgICB1bnNpZ25lZCB3aWR0aCgpIGNvbnN0
IHsgcmV0dXJuIG1fYm1wSW5mby53aWR0aCgpOyB9CisgICAgICAgIHVuc2lnbmVkIGhlaWdodCgp
IGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mby5oZWlnaHQoKTsgfQorICAgICAgICB1bnNpZ25lZCB2
YWxpZEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsaWRIZWlnaHQ7IH0KKyAgICAgICAgdm9p
ZCBzZXRWYWxpZEhlaWdodCh1bnNpZ25lZCB2YWxpZEhlaWdodCkgeyBtX3ZhbGlkSGVpZ2h0ID0g
dmFsaWRIZWlnaHQ7IH0KKyAgICAgICAgdm9pZCByZXNldFBpeGVscyhib29sIGJsYWNrID0gZmFs
c2UpOworICAgICAgICB2b2lkIGNsZWFyUGl4ZWxzKGNvbnN0IEludFJlY3QmIHIpOworICAgICAg
ICBib29sIGxvY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9ja2VkOyB9CisgICAgICAgIHZvaWQg
bG9jaygpIHsgbV9sb2NrZWQgPSB0cnVlOyB9CisgICAgICAgIHZvaWQgdW5sb2NrKCkgeyBtX2xv
Y2tlZCA9IGZhbHNlOyB9CisgICAgICAgIGJvb2wgZnJlZU1lbW9yeSgpOworICAgICAgICBib29s
IGlzMTZiaXQoKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8uaXMxNmJpdCgpOyB9CisgICAgICAg
IGJvb2wgaXMzMmJpdCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mby5pczMyYml0KCk7IH0KKyAg
ICAgICAgYm9vbCB0bzE2Yml0KCk7CisgICAgICAgIGJvb2wgaGFzQWxwaGEoKSBjb25zdCB7IHJl
dHVybiBtX2hhc0FscGhhOyB9CisgICAgICAgIHZvaWQgc2V0SGFzQWxwaGEoYm9vbCBhbHBoYSkg
eyBtX2hhc0FscGhhID0gYWxwaGE7IH0KKyAgICAgICAgYm9vbCBlbnN1cmVIYW5kbGUoKTsKKyAg
ICAgICAgSEJJVE1BUCBnZXRIYW5kbGUoKSB7IHJldHVybiBtX2hiaXRtYXA7IH0KKyAgICAgICAg
SEJJVE1BUCBjcmVhdGVIYW5kbGUodm9pZCoqIHBpeGVscywgQml0bWFwSW5mbyogYm1wSW5mbywg
aW50IGggPSAtMSwgYm9vbCB1c2UxNmJpdCA9IHRydWUpIGNvbnN0OworICAgICAgICBib29sIHVz
ZXNUcmFuc3BhcmVudENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV91c2VzVHJhbnNwYXJlbnRDb2xv
cjsgfQorICAgICAgICBDT0xPUlJFRiB0cmFuc3BhcmVudENvbG9yKCkgY29uc3QgeyByZXR1cm4g
bV90cmFuc3BhcmVudENvbG9yOyB9CisgICAgICAgIHZvaWQgc2V0VHJhbnNwYXJlbnRDb2xvcihD
T0xPUlJFRiBjKQorICAgICAgICB7CisgICAgICAgICAgICBtX3VzZXNUcmFuc3BhcmVudENvbG9y
ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fdHJhbnNwYXJlbnRDb2xvciA9IGM7CisgICAgICAgIH0K
KyAgICAgICAgYm9vbCBjYW5Vc2VESUJpdHMoKSBjb25zdCB7IHJldHVybiAhaGFzQWxwaGEoKSAm
JiAhdXNlc1RyYW5zcGFyZW50Q29sb3IoKTsgfQorCisgICAgICAgIEhCSVRNQVAgY2xpcEJpdG1h
cChjb25zdCBJbnRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1
c2VBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcEluZm8mIGJtcEluZm8s
CisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgcGl4ZWxzKTsKKworICAgICAgICBQ
YXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4gY2xpcEJpdG1hcChjb25zdCBJbnRSZWN0JiByZWN0LCBi
b29sIHVzZUFscGhhKTsKKworICAgICAgICB2b2lkIGRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0
LCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb21wb3Np
dGVPcGVyYXRvciBjb21wb3NpdGVPcCk7CisgICAgICAgIHZvaWQgZHJhd1BhdHRlcm4oR3JhcGhp
Y3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRyYW5z
Zm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBG
bG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSk7CisgICAg
ICAgIHZvaWQgZHJhdyhIREMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJlY3Qm
IHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgdm9pZCBk
cmF3UGF0dGVybihIREMsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiwgY29uc3QgRmxvYXRS
ZWN0JiB0aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5z
Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBD
b21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50
U2l6ZSYgb3JpZ1NvdXJjZVNpemUpOworCisgICAgICAgIHR5cGVkZWYgdm9pZCAoKkRyYXdQYXR0
ZXJuRnVuYykoU2hhcmVkQml0bWFwKiBibXAsIEhEQywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRy
aXgmLCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0
cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxv
YXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRl
c3RSZWN0LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSk7CisgICAgICAgIHR5cGVkZWYg
Ym9vbCAoKkRyYXdJbWFnZUZ1bmMpIChTaGFyZWRCaXRtYXAqIGJtcCwgSERDLCBjb25zdCBJbnRS
ZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBj
b21wb3NpdGVPcCk7CisKKyAgICAgICAgc3RhdGljIERyYXdQYXR0ZXJuRnVuYyBzZXREcmF3UGF0
dGVybkZ1bmMoRHJhd1BhdHRlcm5GdW5jIGZ1bmMpOworICAgICAgICBzdGF0aWMgRHJhd0ltYWdl
RnVuYyBzZXREcmF3SW1hZ2VGdW5jKERyYXdJbWFnZUZ1bmMgZnVuYyk7CisKKyAgICAgICAgY2xh
c3MgRENQcm92aWRlciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHZpcnR1YWwgSERD
IGdldERDKFNoYXJlZEJpdG1hcCosIHVuc2lnbmVkKiBrZXkxLCB1bnNpZ25lZCoga2V5Mik7Cisg
ICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZURDKFNoYXJlZEJpdG1hcCosIEhEQyBoZGMs
IHVuc2lnbmVkIGtleTEsIHVuc2lnbmVkIGtleTIpOworICAgICAgICB9OworCisgICAgICAgIHN0
YXRpYyBEQ1Byb3ZpZGVyKiBtX2RjUHJvdmlkZXI7CisKKyAgICAgICAgSERDIGdldERDKHVuc2ln
bmVkKiBrZXkxLCB1bnNpZ25lZCoga2V5MikgeyByZXR1cm4gbV9kY1Byb3ZpZGVyLT5nZXREQyh0
aGlzLCBrZXkxLCBrZXkyKTsgfQorICAgICAgICB2b2lkIHJlbGVhc2VEQyhIREMgaGRjLCB1bnNp
Z25lZCBrZXkxLCB1bnNpZ25lZCBrZXkyKSB7IG1fZGNQcm92aWRlci0+cmVsZWFzZURDKHRoaXMs
IGhkYywga2V5MSwga2V5Mik7IH0KKworICAgICAgICBjbGFzcyBEQ0hvbGRlciB7CisgICAgICAg
IHB1YmxpYzoKKyAgICAgICAgICAgIERDSG9sZGVyKFNoYXJlZEJpdG1hcCogYm1wID0gMCkgeyBf
c2V0KGJtcCk7IH0KKyAgICAgICAgICAgIH5EQ0hvbGRlcigpIHsgX2NsZWFyKCk7IH0KKyAgICAg
ICAgICAgIHZvaWQgc2V0KFNoYXJlZEJpdG1hcCogYm1wID0gMCkKKyAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICBfY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBfc2V0KGJtcCk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBIREMgZ2V0KCkgY29uc3QgeyByZXR1cm4gbV9oZGM7IH0K
KyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIERDSG9sZGVyJiBvcGVyYXRvcj0oY29uc3Qg
RENIb2xkZXImKTsKKyAgICAgICAgICAgIERDSG9sZGVyKGNvbnN0IERDSG9sZGVyJik7CisgICAg
ICAgICAgICB2b2lkIF9jbGVhcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYg
KG1faGRjKQorICAgICAgICAgICAgICAgICAgICBtX2JpdG1hcC0+cmVsZWFzZURDKG1faGRjLCBt
X2tleTEsIG1fa2V5Mik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIF9zZXQoU2hh
cmVkQml0bWFwKiBibXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9iaXRtYXAg
PSBibXA7CisgICAgICAgICAgICAgICAgbV9oZGMgPSBibXAgPyBibXAtPmdldERDKCZtX2tleTEs
ICZtX2tleTIpIDogMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNoYXJlZEJpdG1hcCog
bV9iaXRtYXA7CisgICAgICAgICAgICBIREMgbV9oZGM7CisgICAgICAgICAgICB1bnNpZ25lZCBt
X2tleTE7CisgICAgICAgICAgICB1bnNpZ25lZCBtX2tleTI7CisgICAgICAgIH07CisKKyAgICBw
cml2YXRlOgorICAgICAgICBleHBsaWNpdCBTaGFyZWRCaXRtYXAoYm9vbCBpczE2Yml0LCBpbnQg
dywgaW50IGgsIGJvb2wgaW5pdFBpeGVscyk7CisgICAgICAgIGV4cGxpY2l0IFNoYXJlZEJpdG1h
cChjb25zdCBCaXRtYXBJbmZvJiBibXBJbmZvLCBIQklUTUFQIGhibXAsIHZvaWQqIHBpeGVscyk7
CisgICAgICAgIEJpdG1hcEluZm8gbV9ibXBJbmZvOworICAgICAgICBpbnQgbV9yZWZlcmVuY2U7
CisgICAgICAgIEhCSVRNQVAgbV9oYml0bWFwOworICAgICAgICB2b2lkKiBtX3BpeGVsczsKKyAg
ICAgICAgQ09MT1JSRUYgbV90cmFuc3BhcmVudENvbG9yOworICAgICAgICBpbnQgbV92YWxpZEhl
aWdodDsKKyAgICAgICAgYm9vbCBtX2xvY2tlZDsKKyAgICAgICAgYm9vbCBtX3VzZXNUcmFuc3Bh
cmVudENvbG9yOworICAgICAgICBib29sIG1faGFzQWxwaGE7CisgICAgfTsKKworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34393</attachid>
            <date>2009-08-08 13:29:07 -0700</date>
            <delta_ts>2009-08-14 14:15:33 -0700</delta_ts>
            <desc>2) SharedBitmap</desc>
            <filename>27511_2.patch</filename>
            <type>text/plain</type>
            <size>29806</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uMjc4YWMxMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IFNoYXJlZEJpdG1hcCBpcyB1c2VkIGFzIE5hdGl2
ZUltYWdlUHRyCisgICAgICAgIGZvciBmcmFtZXMgaW4gQml0bWFwSW1hZ2UsIGFuZCBpcyB3aWRl
bHkgdXNlZCBpbiBXSU5DRSAKKyAgICAgICAgUE9SVCBmaWxlcy4gQSBTaGFyZWRCaXRtYXAgaG9s
ZHMgYSAxNmJpdCBvciAzMmJpdAorICAgICAgICBXaW5kb3dzIERJQiB3aXRoIG9yIHdpdGhvdXQg
YW4gSEJJVE1BUCBoYW5kbGUuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yNzUxMQorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hh
cmVkQml0bWFwLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2Uv
U2hhcmVkQml0bWFwLmg6IEFkZGVkLgorCiAyMDA5LTA4LTA2ICBZb25nIExpICA8eW9uZy5saUB0
b3JjaG1vYmlsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5j
cHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmNzY1NQotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmNwcApAQCAt
MCwwICsxLDY5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmls
ZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
KyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgiCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJHcmFwaGljc1R5cGVzLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRp
b25NYXRyaXguaCIKKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9Pd25Q
dHIuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisj
aWZuZGVmIE5ERUJVRworc3RydWN0IFNoYXJlZEJpdG1hcExlYWtDb3VudGVyIHsKKyAgICB+U2hh
cmVkQml0bWFwTGVha0NvdW50ZXIoKTsKK307CitzdGF0aWMgU2hhcmVkQml0bWFwTGVha0NvdW50
ZXIgc2hhcmVkQml0bWFwTGVha0NvdW50ZXI7CisjZW5kaWYKKwordHlwZWRlZiBIYXNoU2V0PFNo
YXJlZEJpdG1hcCo+IEJpdG1hcE1hcDsKK0JpdG1hcE1hcCBnX2JpdG1hcE1hcDsKKworI2lmbmRl
ZiBOREVCVUcKK1NoYXJlZEJpdG1hcExlYWtDb3VudGVyOjp+U2hhcmVkQml0bWFwTGVha0NvdW50
ZXIoKQoreworICAgIGlmICghZ19iaXRtYXBNYXAuaXNFbXB0eSgpKQorICAgICAgICBwcmludGYo
IlxuTEVBSzogJXUgJXNcblxuIiwgZ19iaXRtYXBNYXAuc2l6ZSgpLCAiU2hhcmVkQml0bWFwIG9i
amVjdHMiKTsKK30KKyNlbmRpZgorCitzdGF0aWMgU2hhcmVkQml0bWFwOjpEcmF3UGF0dGVybkZ1
bmMgZ19kcmF3UGF0dGVybiA9IDA7CitzdGF0aWMgU2hhcmVkQml0bWFwOjpEcmF3SW1hZ2VGdW5j
IGdfZHJhd0ltYWdlID0gMDsKKworc3RhdGljIGlubGluZSBpbnQgc3RhYmxlUm91bmQoZG91Ymxl
IGQpCit7CisgICAgaWYgKGQgPiAwKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihk
ICsgMC41KTsKKworICAgIGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihkKTsKKyAgICByZXR1cm4g
aSAtIGQgPiAwLjUgPyBpIC0gMSA6IGk7Cit9CisKK1NoYXJlZEJpdG1hcDo6RHJhd0ltYWdlRnVu
YyBTaGFyZWRCaXRtYXA6OnNldERyYXdJbWFnZUZ1bmMoRHJhd0ltYWdlRnVuYyBmdW5jKQorewor
ICAgIERyYXdJbWFnZUZ1bmMgb2xkRnVuYyA9IGdfZHJhd0ltYWdlOworICAgIGdfZHJhd0ltYWdl
ID0gZnVuYzsKKyAgICByZXR1cm4gb2xkRnVuYzsKK30KKworU2hhcmVkQml0bWFwOjpEcmF3UGF0
dGVybkZ1bmMgU2hhcmVkQml0bWFwOjpzZXREcmF3UGF0dGVybkZ1bmMoRHJhd1BhdHRlcm5GdW5j
IGZ1bmMpCit7CisgICAgRHJhd1BhdHRlcm5GdW5jIG9sZEZ1bmMgPSBnX2RyYXdQYXR0ZXJuOwor
ICAgIGdfZHJhd1BhdHRlcm4gPSBmdW5jOworICAgIHJldHVybiBvbGRGdW5jOworfQorCitQYXNz
UmVmUHRyPFNoYXJlZEJpdG1hcD4gU2hhcmVkQml0bWFwOjpjcmVhdGVJbnN0YW5jZShib29sIGlz
MTZiaXQsIGludCB3LCBpbnQgaCwgYm9vbCBpbml0UGl4ZWxzKQoreworICAgIFNoYXJlZEJpdG1h
cCogcnRuID0gbmV3IFNoYXJlZEJpdG1hcChpczE2Yml0LCB3LCBoLCBpbml0UGl4ZWxzKTsKKyAg
ICBpZiAocnRuICYmICFydG4tPmJ5dGVzKCkpIHsKKyAgICAgICAgZGVsZXRlIHJ0bjsKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBhZG9wdFJlZihydG4pOworfQorCitTaGFy
ZWRCaXRtYXA6OlNoYXJlZEJpdG1hcChjb25zdCBCaXRtYXBJbmZvJiBibXBJbmZvLCBIQklUTUFQ
IGhibXAsIHZvaWQqIHBpeGVscykKKzogbV9ibXBJbmZvKGJtcEluZm8pCissIG1fbG9ja2VkKGZh
bHNlKQorLCBtX3VzZXNUcmFuc3BhcmVudENvbG9yKGZhbHNlKQorLCBtX3RyYW5zcGFyZW50Q29s
b3IoUkdCKDAsIDAsIDApKQorLCBtX3BpeGVscyhwaXhlbHMpCissIG1faGJpdG1hcChoYm1wKQor
LCBtX2hhc0FscGhhKGZhbHNlKQorLCBtX3ZhbGlkSGVpZ2h0KGJtcEluZm8uaGVpZ2h0KCkpCit7
CisgICAgZ19iaXRtYXBNYXAuYWRkKHRoaXMpOworfQorCitTaGFyZWRCaXRtYXA6OlNoYXJlZEJp
dG1hcChib29sIF9pczE2Yml0LCBpbnQgdywgaW50IGgsIGJvb2wgaW5pdFBpeGVscykKKzogbV9i
bXBJbmZvKF9pczE2Yml0LCB3LCBoKQorLCBtX3JlZmVyZW5jZSgxKQorLCBtX2xvY2tlZChmYWxz
ZSkKKywgbV91c2VzVHJhbnNwYXJlbnRDb2xvcihmYWxzZSkKKywgbV90cmFuc3BhcmVudENvbG9y
KFJHQigwLCAwLCAwKSkKKywgbV9waXhlbHMoMCkKKywgbV9oYXNBbHBoYShmYWxzZSkKKywgbV92
YWxpZEhlaWdodChhYnMoaCkpCissIG1faGJpdG1hcCgwKQoreworICAgIGdfYml0bWFwTWFwLmFk
ZCh0aGlzKTsKKworICAgIHVuc2lnbmVkIGJ1ZmZlclNpemUgPSBtX2JtcEluZm8ubnVtUGl4ZWxz
KCk7CisgICAgaWYgKF9pczE2Yml0KQorICAgICAgICBidWZmZXJTaXplIC89IDI7CisKKyAgICBt
X3BpeGVscyA9IG5ldyB1bnNpZ25lZFtidWZmZXJTaXplXTsKKworICAgIGlmIChpbml0UGl4ZWxz
KQorICAgICAgICByZXNldFBpeGVscygpOworfQorU2hhcmVkQml0bWFwOjp+U2hhcmVkQml0bWFw
KCkKK3sKKyAgICBnX2JpdG1hcE1hcC5yZW1vdmUodGhpcyk7CisgICAgaWYgKG1faGJpdG1hcCkK
KyAgICAgICAgRGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7CisgICAgZWxzZQorICAgICAgICBkZWxl
dGVbXSBtX3BpeGVsczsKK30KKwordm9pZCBTaGFyZWRCaXRtYXA6OnJlc2V0UGl4ZWxzKGJvb2wg
YmxhY2spCit7CisgICAgaWYgKG1fcGl4ZWxzKSB7CisgICAgICAgIHVuc2lnbmVkIGJ1ZmZlclNp
emUgPSBtX2JtcEluZm8ubnVtUGl4ZWxzKCk7CisgICAgICAgIGlmIChibGFjaykKKyAgICAgICAg
ICAgIG1lbXNldChtX3BpeGVscywgMCwgYnVmZmVyU2l6ZSAqIChpczE2Yml0KCkgPyAyIDogNCkp
OworICAgICAgICBlbHNlIGlmIChpczE2Yml0KCkpIHsKKyAgICAgICAgICAgIC8vIEZpbGwgaXQg
d2l0aCB3aGl0ZSBjb2xvcgorI2lmIElNQUdFX05PX0FMUEhBX1VTRV9SR0I1NTUKKyAgICAgICAg
ICAgIHdtZW1zZXQoKHdjaGFyX3QqKW1fcGl4ZWxzLCAweDdGRkYsIGJ1ZmZlclNpemUpOworI2Vs
c2UKKyAgICAgICAgICAgIHdtZW1zZXQoKHdjaGFyX3QqKW1fcGl4ZWxzLCAweEZGRkYsIGJ1ZmZl
clNpemUpOworI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBNYWtlIGl0
IHdoaXRlIGJ1dCB0cmFuc3BhcmVudAorICAgICAgICAgICAgdW5zaWduZWQqIHBpeGVsID0gKHVu
c2lnbmVkKiltX3BpeGVsczsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkKiBjb25zdCBidWZm
ZXJFbmQgPSBwaXhlbCArIGJ1ZmZlclNpemU7CisgICAgICAgICAgICB3aGlsZSAocGl4ZWwgPCBi
dWZmZXJFbmQpCisgICAgICAgICAgICAgICAgKnBpeGVsKysgPSAweDAwRkZGRkZGOworICAgICAg
ICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGNvbnZlcnQzMlRv
MTYodW5zaWduZWQgcGl4ZWwpCit7CisjaWYgSU1BR0VfTk9fQUxQSEFfVVNFX1JHQjU1NQorICAg
IHVuc2lnbmVkIHNob3J0IHIgPSB1bnNpZ25lZCBzaG9ydCgocGl4ZWwgJiAweDAwRjgwMDAwKSA+
PiA5KTsKKyAgICB1bnNpZ25lZCBzaG9ydCBnID0gdW5zaWduZWQgc2hvcnQoKHBpeGVsICYgMHgw
MDAwRjgwMCkgPj4gNik7CisgICAgdW5zaWduZWQgc2hvcnQgYiA9IHVuc2lnbmVkIHNob3J0KChw
aXhlbCAmIDB4MDAwMDAwRjgpID4+IDMpOworI2Vsc2UgLy8gUkdCNTY1CisgICAgdW5zaWduZWQg
c2hvcnQgciA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAmIDB4MDBGODAwMDApID4+IDgpOworICAg
IHVuc2lnbmVkIHNob3J0IGcgPSB1bnNpZ25lZCBzaG9ydCgocGl4ZWwgJiAweDAwMDBGQzAwKSA+
PiA1KTsKKyAgICB1bnNpZ25lZCBzaG9ydCBiID0gdW5zaWduZWQgc2hvcnQoKHBpeGVsICYgMHgw
MDAwMDBGOCkgPj4gMyk7CisjZW5kaWYKKyAgICByZXR1cm4gciB8IGcgfCBiOworfQorCitib29s
IFNoYXJlZEJpdG1hcDo6dG8xNmJpdCgpCit7CisgICAgaWYgKG1fbG9ja2VkKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgaWYgKGlzMTZiaXQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICBCaXRtYXBJbmZvIG5ld0JtcEluZm8odHJ1ZSwgbV9ibXBJbmZvLndpZHRoKCksIG1fYm1w
SW5mby5oZWlnaHQoKSk7CisKKyAgICBNZW1vcnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOwor
ICAgIGludCB3aWR0aCA9IG5ld0JtcEluZm8ud2lkdGgoKTsKKyAgICBpbnQgcGFkZGVkV2lkdGgg
PSBuZXdCbXBJbmZvLnBhZGRlZFdpZHRoKCk7CisgICAgaW50IGJ1ZmZlclNpemUgPSBwYWRkZWRX
aWR0aCAqIG5ld0JtcEluZm8uaGVpZ2h0KCk7CisgICAgdm9pZCogbmV3UGl4ZWxzID0gbmV3IHVu
c2lnbmVkW2J1ZmZlclNpemUgLyAyXTsKKworICAgIGlmICghbmV3UGl4ZWxzKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBzaG9ydCogcDE2ID0gKHVuc2lnbmVkIHNob3J0
KiluZXdQaXhlbHM7CisgICAgY29uc3QgdW5zaWduZWQqIHAzMiA9IChjb25zdCB1bnNpZ25lZCop
bV9waXhlbHM7CisKKyAgICBjb25zdCBib29sIHNraXBzID0gcGFkZGVkV2lkdGggIT0gd2lkdGg7
CisKKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogY29uc3QgcDE2ZW5kID0gcDE2ICsgYnVmZmVy
U2l6ZTsKKyAgICB3aGlsZSAocDE2IDwgcDE2ZW5kKSB7CisgICAgICAgIGZvciAodW5zaWduZWQg
c2hvcnQqIHAxNmxpbmVFbmQgPSBwMTYgKyB3aWR0aDsgcDE2IDwgcDE2bGluZUVuZDsgKQorICAg
ICAgICAgICAgKnAxNisrID0gY29udmVydDMyVG8xNigqcDMyKyspOworCisgICAgICAgIGlmIChz
a2lwcykKKyAgICAgICAgICAgICpwMTYrKyA9IDA7CisgICAgfQorCisKKyAgICBpZiAobV9oYml0
bWFwKSB7CisgICAgICAgIERlbGV0ZU9iamVjdChtX2hiaXRtYXApOworICAgICAgICBtX2hiaXRt
YXAgPSAwOworICAgIH0gZWxzZQorICAgICAgICBkZWxldGVbXSBtX3BpeGVsczsKKworICAgIG1f
cGl4ZWxzID0gbmV3UGl4ZWxzOworICAgIG1fYm1wSW5mbyA9IG5ld0JtcEluZm87CisKKyAgICBz
ZXRIYXNBbHBoYShmYWxzZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2hhcmVkQml0
bWFwOjpmcmVlTWVtb3J5KCkKK3sKKyAgICBpZiAoIW1fbG9ja2VkKSB7CisgICAgICAgIGlmICht
X2hiaXRtYXApIHsKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdChtX2hiaXRtYXApOworICAgICAg
ICAgICAgbV9oYml0bWFwID0gMDsKKyAgICAgICAgICAgIG1fcGl4ZWxzID0gMDsKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKG1fcGl4ZWxzKSB7CisgICAgICAg
ICAgICBkZWxldGVbXSBtX3BpeGVsczsKKyAgICAgICAgICAgIG1fcGl4ZWxzID0gMDsKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsK
K30KKworSEJJVE1BUCBTaGFyZWRCaXRtYXA6OmNyZWF0ZUhhbmRsZSh2b2lkKiogcGl4ZWxzLCBC
aXRtYXBJbmZvKiBibXBJbmZvLCBpbnQgaCwgYm9vbCB1c2UxNmJpdCkgY29uc3QKK3sKKyAgICBp
ZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIE1lbW9yeUFsbG9jYXRpb25D
YW5GYWlsIGNhbkZhaWw7CisKKyAgICBpZiAoaCA9PSAtMSkKKyAgICAgICAgaCA9IGhlaWdodCgp
OworICAgICpibXBJbmZvID0gQml0bWFwSW5mbyh1c2UxNmJpdCB8fCBpczE2Yml0KCksIHdpZHRo
KCksIGgpOworCisgICAgSEJJVE1BUCBoYm1wID0gTWVtb3J5TWFuYWdlcjo6Y3JlYXRlRElCU2Vj
dGlvbihibXBJbmZvLCBwaXhlbHMpOworCisgICAgaWYgKCFoYm1wKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIE93blB0cjxIREM+IGJtcERDKENyZWF0ZUNvbXBhdGlibGVEQygwKSk7CisgICAg
SEdESU9CSiBoT2xkQm1wID0gU2VsZWN0T2JqZWN0KGJtcERDLmdldCgpLCBoYm1wKTsKKworICAg
IFN0cmV0Y2hESUJpdHMoYm1wREMuZ2V0KCksIDAsIDAsIHdpZHRoKCksIGgsIDAsIDAsIHdpZHRo
KCksIGgKKyAgICAgICAgLCBtX3BpeGVscywgJm1fYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsIFNS
Q0NPUFkpOworCisgICAgU2VsZWN0T2JqZWN0KGJtcERDLmdldCgpLCBoT2xkQm1wKTsKKworICAg
IHJldHVybiBoYm1wOworfQorCitib29sIFNoYXJlZEJpdG1hcDo6ZW5zdXJlSGFuZGxlKCkKK3sK
KyAgICBpZiAobV9oYml0bWFwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghbV9w
aXhlbHMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChtX2xvY2tlZCkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgQml0bWFwSW5mbyBibXBJbmZvOworICAgIHZvaWQqIHBp
eGVsczsKKyAgICBtX2hiaXRtYXAgPSBjcmVhdGVIYW5kbGUoJnBpeGVscywgJmJtcEluZm8sIC0x
LCAhaGFzQWxwaGEoKSk7CisKKyAgICBpZiAoIW1faGJpdG1hcCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgZGVsZXRlW10gbV9waXhlbHM7CisgICAgbV9waXhlbHMgPSBwaXhlbHM7Cisg
ICAgbV9ibXBJbmZvID0gYm1wSW5mbzsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNo
YXJlZEJpdG1hcDo6ZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEludFJlY3QmIGRz
dFJlY3QsIGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0
ZU9wKQoreworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKyAgICBjdHh0LT5k
cmF3Qml0bWFwKHRoaXMsIGRzdFJlY3QsIHNyY1JlY3QsIGNvbXBvc2l0ZU9wKTsKK30KKwordm9p
ZCBTaGFyZWRCaXRtYXA6OmRyYXcoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgY29u
c3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7Cisg
ICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGRzdFJlY3QuaXNF
bXB0eSgpIHx8IHNyY1JlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
Z19kcmF3SW1hZ2UgJiYgZ19kcmF3SW1hZ2UodGhpcywgaGRjLCBkc3RSZWN0LCBzcmNSZWN0LCBj
b21wb3NpdGVPcCkpCisgICAgICAgIHJldHVybjsKKworICAgIEhCSVRNQVAgaGJpdG1hcCA9IDA7
CisgICAgYm9vbCB1c2luZ0hhbmRsZSA9IGNvbXBvc2l0ZU9wID09IENvbXBvc2l0ZVNvdXJjZU92
ZXIgJiYgKAorI2lmICFkZWZpbmVkKE5PX0FMUEhBQkxFTkQpCisgICAgICAgIGhhc0FscGhhKCkg
fHwKKyNlbmRpZgorICAgICAgICB1c2VzVHJhbnNwYXJlbnRDb2xvcigpKTsKKworICAgIGlmICh1
c2luZ0hhbmRsZSkgeworICAgICAgICBpZiAoZW5zdXJlSGFuZGxlKCkpCisgICAgICAgICAgICBo
Yml0bWFwID0gbV9oYml0bWFwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHZvaWQqIHBp
eGVsczsKKyAgICAgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAgICAgIGhiaXRt
YXAgPSBjcmVhdGVIYW5kbGUoJnBpeGVscywgJmJtcEluZm8sIC0xLCB1c2VzVHJhbnNwYXJlbnRD
b2xvcigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWhiaXRtYXApIHsKKyAgICAgICAg
Ly8gRklYTUU6IGhhbmRsZSBvdGhlciBjb21wb3NpdGUgb3BlcmF0aW9uIHR5cGVzPworICAgICAg
ICBEV09SRCByb3AgPSBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVDb3B5ID8gU1JDQ09QWQorICAg
ICAgICAgICAgOiBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVYT1IgPyBQQVRJTlZFUlQKKyAgICAg
ICAgICAgIDogY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlQ2xlYXIgPyBXSElURU5FU1MKKyAgICAg
ICAgICAgIDogU1JDQ09QWTsKKworICAgICAgICBTdHJldGNoRElCaXRzKGhkYywgZHN0UmVjdC54
KCksIGRzdFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCkKKyAgICAg
ICAgICAgICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCksIHNyY1Jl
Y3QuaGVpZ2h0KCksIG1fcGl4ZWxzLCAmbV9ibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgcm9wKTsK
KyAgICB9IGVsc2UgeworICAgICAgICBPd25QdHI8SERDPiBobWVtZGMoQ3JlYXRlQ29tcGF0aWJs
ZURDKGhkYykpOworICAgICAgICBIR0RJT0JKIGhPbGRCbXAgPSBTZWxlY3RPYmplY3QoaG1lbWRj
LmdldCgpLCBoYml0bWFwKTsKKworI2lmICFkZWZpbmVkKE5PX0FMUEhBQkxFTkQpCisgICAgICAg
IGlmICghdXNlc1RyYW5zcGFyZW50Q29sb3IoKSkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0
IEJMRU5ERlVOQ1RJT04gYmxlbmQgPSB7IEFDX1NSQ19PVkVSLCAwLCAyNTUsIEFDX1NSQ19BTFBI
QSB9OworICAgICAgICAgICAgQWxwaGFCbGVuZChoZGMsIGRzdFJlY3QueCgpLCBkc3RSZWN0Lnko
KSwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpLCBobWVtZGMuZ2V0KCkKKyAgICAg
ICAgICAgICAgICAsIHNyY1JlY3QueCgpLCBzcmNSZWN0LnkoKSwgc3JjUmVjdC53aWR0aCgpLCBz
cmNSZWN0LmhlaWdodCgpLCBibGVuZCk7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAg
IHsKKyAgICAgICAgICAgIFRyYW5zcGFyZW50Qmx0KGhkYywgZHN0UmVjdC54KCksIGRzdFJlY3Qu
eSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCksIGhtZW1kYy5nZXQoKQorICAg
ICAgICAgICAgICAgICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCks
IHNyY1JlY3QuaGVpZ2h0KCksIHRyYW5zcGFyZW50Q29sb3IoKSk7CisgICAgICAgIH0KKworICAg
ICAgICBTZWxlY3RPYmplY3QoaG1lbWRjLmdldCgpLCBoT2xkQm1wKTsKKyAgICAgICAgaWYgKGhi
aXRtYXAgIT0gbV9oYml0bWFwKQorICAgICAgICAgICAgRGVsZXRlT2JqZWN0KGhiaXRtYXApOwor
ICAgIH0KK30KKworCitIQklUTUFQIFNoYXJlZEJpdG1hcDo6Y2xpcEJpdG1hcChjb25zdCBJbnRS
ZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VBbHBo
YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcEluZm8mIGJtcEluZm8s
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgcGl4ZWxzKQoreworICAg
IGlmICghYnl0ZXMoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbnQgb2xkV2lkdGggPSB3
aWR0aCgpOworICAgIGludCBvbGRIZWlnaHQgPSBoZWlnaHQoKTsKKyAgICBpbnQgY29weVdpZHRo
ID0gc3RkOjptaW48aW50PihyZWN0LndpZHRoKCksIG9sZFdpZHRoIC0gcmVjdC54KCkpOworICAg
IGludCBjb3B5SGVpZ2h0ID0gc3RkOjptaW48aW50PihyZWN0LmhlaWdodCgpLCBvbGRIZWlnaHQg
LSByZWN0LnkoKSk7CisgICAgaWYgKCFjb3B5V2lkdGggfHwgIWNvcHlIZWlnaHQpCisgICAgICAg
IHJldHVybiAwOworCisgICAgYm1wSW5mbyA9IEJpdG1hcEluZm8oISh1c2VBbHBoYSAmJiBpczMy
Yml0KCkpLCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQpOworICAgIEhCSVRNQVAgbmV3Qm1wID0gTWVt
b3J5TWFuYWdlcjo6Y3JlYXRlRElCU2VjdGlvbigmYm1wSW5mbywgJnBpeGVscyk7CisKKyAgICBp
ZiAobmV3Qm1wKSB7CisgICAgICAgIE93blB0cjxIREM+IGRjTmV3KDo6Q3JlYXRlQ29tcGF0aWJs
ZURDKDApKTsKKyAgICAgICAgSEdESU9CSiB0bXBOZXcgPSA6OlNlbGVjdE9iamVjdChkY05ldy5n
ZXQoKSwgbmV3Qm1wKTsKKworICAgICAgICBTdHJldGNoRElCaXRzKGRjTmV3LmdldCgpLCAwLCAw
LCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQsIHJlY3QueCgpLCByZWN0LnkoKSwgY29weVdpZHRoLCBj
b3B5SGVpZ2h0CisgICAgICAgICAgICAsIGJ5dGVzKCksICZiaXRtYXBJbmZvKCksIERJQl9SR0Jf
Q09MT1JTLCBTUkNDT1BZKTsKKworICAgICAgICBTZWxlY3RPYmplY3QoZGNOZXcuZ2V0KCksIHRt
cE5ldyk7CisgICAgfQorCisgICAgcmV0dXJuIG5ld0JtcDsKK30KKworCitQYXNzUmVmUHRyPFNo
YXJlZEJpdG1hcD4gU2hhcmVkQml0bWFwOjpjbGlwQml0bWFwKGNvbnN0IEludFJlY3QmIHJlY3Qs
IGJvb2wgdXNlQWxwaGEpCit7CisgICAgaW50IG9sZFdpZHRoID0gd2lkdGgoKTsKKyAgICBpbnQg
b2xkSGVpZ2h0ID0gaGVpZ2h0KCk7CisgICAgaW50IGNvcHlXaWR0aCA9IHN0ZDo6bWluPGludD4o
cmVjdC53aWR0aCgpLCBvbGRXaWR0aCAtIHJlY3QueCgpKTsKKyAgICBpbnQgY29weUhlaWdodCA9
IHN0ZDo6bWluPGludD4ocmVjdC5oZWlnaHQoKSwgb2xkSGVpZ2h0IC0gcmVjdC55KCkpOworICAg
IGlmICghY29weVdpZHRoIHx8ICFjb3B5SGVpZ2h0KQorICAgICAgICByZXR1cm4gMDsKKworICAg
IFNoYXJlZEJpdG1hcCogbmV3Qm1wID0gbmV3IFNoYXJlZEJpdG1hcCghKHVzZUFscGhhICYmIGlz
MzJiaXQoKSksIGNvcHlXaWR0aCwgY29weUhlaWdodCwgZmFsc2UpOworCisgICAgaWYgKCFuZXdC
bXApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFuZXdCbXAtPmJ5dGVzKCkpIHsKKyAg
ICAgICAgZGVsZXRlIG5ld0JtcDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgRENI
b2xkZXIgZGNOZXcobmV3Qm1wKTsKKworICAgIFN0cmV0Y2hESUJpdHMoZGNOZXcuZ2V0KCksIDAs
IDAsIGNvcHlXaWR0aCwgY29weUhlaWdodCwgcmVjdC54KCksIHJlY3QueSgpLCBjb3B5V2lkdGgs
IGNvcHlIZWlnaHQKKyAgICAgICAgLCBieXRlcygpLCAmYml0bWFwSW5mbygpLCBESUJfUkdCX0NP
TE9SUywgU1JDQ09QWSk7CisKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3Qm1wKTsKK30KKworc3Rh
dGljIHZvaWQgZHJhd1BhdHRlcm5TaW1wbGUoSERDIGhkYywgY29uc3QgUkVDVCYgZGVzdFJlY3Qs
IEhCSVRNQVAgaGJtcCwgY29uc3QgUE9JTlQmIHBoYXNlKQoreworICAgIEhCUlVTSCBoQnJ1c2gg
PSBDcmVhdGVQYXR0ZXJuQnJ1c2goaGJtcCk7CisgICAgaWYgKGhCcnVzaCkgeworICAgICAgICBQ
T0lOVCBvbGRPcmc7CisgICAgICAgIFNldEJydXNoT3JnRXgoaGRjLCBkZXN0UmVjdC5sZWZ0IC0g
cGhhc2UueCwgZGVzdFJlY3QudG9wIC0gcGhhc2UueSwgJm9sZE9yZyk7CisgICAgICAgIEZpbGxS
ZWN0KGhkYywgJmRlc3RSZWN0LCBoQnJ1c2gpOworICAgICAgICBEZWxldGVPYmplY3QoaEJydXNo
KTsKKyAgICAgICAgU2V0QnJ1c2hPcmdFeChoZGMsIG9sZE9yZy54LCBvbGRPcmcueSwgMCk7Cisg
ICAgfQorfQorCitzdGF0aWMgdm9pZCBkcmF3UGF0dGVyblNpbXBsZShIREMgaGRjLCBjb25zdCBS
RUNUJiBkZXN0UmVjdCwgY29uc3QgU2hhcmVkQml0bWFwKiBibXAsIGNvbnN0IFNJWkUmIGJtcFNp
emUsIGNvbnN0IFBPSU5UJiBwaGFzZSkKK3sKKyAgICBpbnQgZHN0WSA9IGRlc3RSZWN0LnRvcDsK
KyAgICBmb3IgKGludCBzb3VyY2VZID0gcGhhc2UueTsgZHN0WSA8IGRlc3RSZWN0LmJvdHRvbTsg
KSB7CisgICAgICAgIGludCBzb3VyY2VIID0gc3RkOjptaW48aW50PihibXBTaXplLmN5IC0gc291
cmNlWSwgZGVzdFJlY3QuYm90dG9tIC0gZHN0WSk7CisgICAgICAgIGludCBkc3RYID0gZGVzdFJl
Y3QubGVmdDsKKyAgICAgICAgZm9yIChpbnQgc291cmNlWCA9IHBoYXNlLng7IGRzdFggPCBkZXN0
UmVjdC5yaWdodDsgKSB7CisgICAgICAgICAgICBpbnQgc291cmNlVyA9IHN0ZDo6bWluPGludD4o
Ym1wU2l6ZS5jeCAtIHNvdXJjZVgsIGRlc3RSZWN0LnJpZ2h0IC0gZHN0WCk7CisKKyAgICAgICAg
ICAgIFN0cmV0Y2hESUJpdHMoaGRjLCBkc3RYLCBkc3RZLCBzb3VyY2VXLCBzb3VyY2VILCBzb3Vy
Y2VYLCBzb3VyY2VZLCBzb3VyY2VXLCBzb3VyY2VICisgICAgICAgICAgICAgICAgLCBibXAtPmJ5
dGVzKCksICZibXAtPmJpdG1hcEluZm8oKSwgRElCX1JHQl9DT0xPUlMsIFNSQ0NPUFkpOworCisg
ICAgICAgICAgICBkc3RYICs9IHNvdXJjZVc7CisgICAgICAgICAgICBzb3VyY2VYID0gMDsKKyAg
ICAgICAgfQorCisgICAgICAgIGRzdFkgKz0gc291cmNlSDsKKyAgICAgICAgc291cmNlWSA9IDA7
CisgICAgfQorfQorCit2b2lkIG5vcm1hbGl6ZVBoYXNlKExPTkcmIHBoYXNlLCBpbnQgbGltaXQp
Cit7CisgICAgaWYgKCFwaGFzZSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChsaW1pdCA8IDIp
IHsKKyAgICAgICAgcGhhc2UgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChs
aW1pdCA9PSAyKSB7CisgICAgICAgIHBoYXNlID0gcGhhc2UgJiAxOworICAgICAgICByZXR1cm47
CisgICAgfQorICAgIGlmIChwaGFzZSA8IDApIHsKKyAgICAgICAgcGhhc2UgPSAtcGhhc2U7Cisg
ICAgICAgIGlmIChwaGFzZSA+IGxpbWl0KQorICAgICAgICAgICAgcGhhc2UgPSAoTE9ORykoKHVu
c2lnbmVkKXBoYXNlICUgKHVuc2lnbmVkKWxpbWl0KTsKKyAgICAgICAgaWYgKHBoYXNlKQorICAg
ICAgICAgICAgcGhhc2UgPSBsaW1pdCAtIHBoYXNlOworICAgIH0gZWxzZSB7CisgICAgICAgIGlm
IChwaGFzZSA8IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBwaGFzZSA9IChM
T05HKSgodW5zaWduZWQpcGhhc2UgJSAodW5zaWduZWQpbGltaXQpOworICAgIH0KK30KKwordm9p
ZCBTaGFyZWRCaXRtYXA6OmRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3Qg
RmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVy
blRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBo
YXNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29u
c3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAg
ICAgcmV0dXJuOworICAgIGN0eHQtPmRyYXdCaXRtYXBQYXR0ZXJuKHRoaXMsIHRpbGVSZWN0SW4s
IHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNlLCBvcCwgZGVzdFJlY3QsIG9yaWdTb3VyY2VTaXplKTsK
K30KKwordm9pZCBTaGFyZWRCaXRtYXA6OmRyYXdQYXR0ZXJuKEhEQyBoZGMsIGNvbnN0IFRyYW5z
Zm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0sIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwg
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Ig
b3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VT
aXplKQoreworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChn
X2RyYXdQYXR0ZXJuKSB7CisgICAgICAgIGdfZHJhd1BhdHRlcm4odGhpcywgaGRjLCB0cmFuc2Zv
cm0sIHRpbGVSZWN0SW4sIHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNlLCBvcCwgZGVzdFJlY3QsIG9y
aWdTb3VyY2VTaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0aWxlUmVj
dEluLndpZHRoKCkgPD0gMCB8fCB0aWxlUmVjdEluLmhlaWdodCgpIDw9IDApCisgICAgICAgIHJl
dHVybjsKKworICAgIGJvb2wgdXNlQWxwaGEgPSBvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVyICYm
IGhhc0FscGhhKCkgJiYgaXMzMmJpdCgpOworCisgICAgaW50IGJtcFdpZHRoID0gd2lkdGgoKTsK
KyAgICBpbnQgYm1wSGVpZ2h0ID0gaGVpZ2h0KCk7CisKKyAgICBGbG9hdFJlY3QgdGlsZVJlY3Qo
dGlsZVJlY3RJbik7CisgICAgaWYgKGJtcFdpZHRoICE9IG9yaWdTb3VyY2VTaXplLndpZHRoKCkp
IHsKKyAgICAgICAgZG91YmxlIHJhdGUgPSAoZG91YmxlKWJtcFdpZHRoIC8gb3JpZ1NvdXJjZVNp
emUud2lkdGgoKTsKKyAgICAgICAgZG91YmxlIHRlbXAgPSB0aWxlUmVjdC53aWR0aCgpICogcmF0
ZTsKKyAgICAgICAgdGlsZVJlY3Quc2V0WCh0aWxlUmVjdC54KCkgKiByYXRlKTsKKyAgICAgICAg
dGlsZVJlY3Quc2V0V2lkdGgodGVtcCk7CisgICAgICAgIHRlbXAgPSB0aWxlUmVjdC5oZWlnaHQo
KSAqIHJhdGU7CisgICAgICAgIHRpbGVSZWN0LnNldFkodGlsZVJlY3QueSgpICogcmF0ZSk7Cisg
ICAgICAgIHRpbGVSZWN0LnNldEhlaWdodCh0ZW1wKTsKKyAgICB9CisKKyAgICBPd25QdHI8SEJJ
VE1BUD4gY2xpcHBlZEJtcDsKKworICAgIGlmICh0aWxlUmVjdC54KCkgfHwgdGlsZVJlY3QueSgp
IHx8IHRpbGVSZWN0LndpZHRoKCkgIT0gYm1wV2lkdGggfHwgdGlsZVJlY3QuaGVpZ2h0KCkgIT0g
Ym1wSGVpZ2h0KSB7CisgICAgICAgIEJpdG1hcEluZm8gcGF0dGVybkJtcEluZm87CisgICAgICAg
IHZvaWQqIHBhdHRlcm5QaXhlbHM7CisgICAgICAgIGNsaXBwZWRCbXAuc2V0KGNsaXBCaXRtYXAo
SW50UmVjdCh0aWxlUmVjdCksIHVzZUFscGhhLCBwYXR0ZXJuQm1wSW5mbywgcGF0dGVyblBpeGVs
cykpOworICAgICAgICBpZiAoIWNsaXBwZWRCbXApCisgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgYm1wV2lkdGggPSB0aWxlUmVjdC53aWR0aCgpOworICAgICAgICBibXBIZWlnaHQgPSB0
aWxlUmVjdC5oZWlnaHQoKTsKKyAgICB9CisKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0ZiA9
IHRyYW5zZm9ybTsKKyAgICB0ZiAqPSBwYXR0ZXJuVHJhbnNmb3JtOworCisgICAgRmxvYXRSZWN0
IHRyUmVjdCA9IHRmLm1hcFJlY3QoZGVzdFJlY3QpOworCisgICAgUkVDVCBjbGlwQm94OworICAg
IGludCBjbGlwVHlwZSA9IEdldENsaXBCb3goaGRjLCAmY2xpcEJveCk7CisgICAgaWYgKGNsaXBU
eXBlID09IFNJTVBMRVJFR0lPTikKKyAgICAgICAgdHJSZWN0LmludGVyc2VjdChGbG9hdFJlY3Qo
Y2xpcEJveC5sZWZ0LCBjbGlwQm94LnRvcCwgY2xpcEJveC5yaWdodCAtIGNsaXBCb3gubGVmdCwg
Y2xpcEJveC5ib3R0b20gLSBjbGlwQm94LnRvcCkpOworICAgIGVsc2UgaWYgKGNsaXBUeXBlID09
IENPTVBMRVhSRUdJT04pIHsKKyAgICAgICAgT3duUHRyPEhSR04+IGNsaXBSZ24oQ3JlYXRlUmVj
dFJnbigwLCAwLCAwLCAwKSk7CisgICAgICAgIGlmIChHZXRDbGlwUmduKGhkYywgY2xpcFJnbi5n
ZXQoKSkgPiAwKSB7CisgICAgICAgICAgICBEV09SRCByZWdpb25EYXRhU2l6ZSA9IEdldFJlZ2lv
bkRhdGEoY2xpcFJnbi5nZXQoKSwgc2l6ZW9mKFJHTkRBVEEpLCAwKTsKKyAgICAgICAgICAgIGlm
IChyZWdpb25EYXRhU2l6ZSkgeworICAgICAgICAgICAgICAgIFJHTkRBVEEqIHJlZ2lvbkRhdGEg
PSBuZXcgUkdOREFUQVtyZWdpb25EYXRhU2l6ZV07CisgICAgICAgICAgICAgICAgR2V0UmVnaW9u
RGF0YShjbGlwUmduLmdldCgpLCByZWdpb25EYXRhU2l6ZSwgcmVnaW9uRGF0YSk7CisgICAgICAg
ICAgICAgICAgUkVDVCogcmVjdCA9IChSRUNUKilyZWdpb25EYXRhLT5CdWZmZXI7CisgICAgICAg
ICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlZ2lvbkRhdGEtPnJkaC5uQ291bnQ7
ICsraSwgKytyZWN0KQorICAgICAgICAgICAgICAgICAgICB0clJlY3QuaW50ZXJzZWN0KEZsb2F0
UmVjdChyZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgcmVj
dC0+Ym90dG9tIC0gcmVjdC0+dG9wKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gcmVnaW9u
RGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0clJlY3Qu
d2lkdGgoKSA8PSAwIHx8IHRyUmVjdC5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisK
KyAgICB0clJlY3QuaW5mbGF0ZSgxKTsKKyAgICBJbnRSZWN0IHZpc2libGVEc3RSZWN0ID0gZW5j
bG9zaW5nSW50UmVjdCh0Zi5pbnZlcnNlKCkubWFwUmVjdCh0clJlY3QpKTsKKyAgICB2aXNpYmxl
RHN0UmVjdC5pbnRlcnNlY3QoSW50UmVjdChkZXN0UmVjdCkpOworCisgICAgaWYgKHZpc2libGVE
c3RSZWN0LndpZHRoKCkgPD0gMCB8fCB2aXNpYmxlRHN0UmVjdC5oZWlnaHQoKSA8PSAwKQorICAg
ICAgICByZXR1cm47CisKKyAgICB0clJlY3QgPSB0Zi5tYXBSZWN0KHZpc2libGVEc3RSZWN0KTsK
KyAgICBSRUNUIGRzdFJlY3RXaW4gPQorICAgIHsKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0
LngoKSksCisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC55KCkpLAorICAgICAgICBzdGFibGVS
b3VuZCh0clJlY3QucmlnaHQoKSksCisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC5ib3R0b20o
KSksCisgICAgfTsKKyAgICBpZiAoZHN0UmVjdFdpbi5yaWdodCA8PSBkc3RSZWN0V2luLmxlZnQg
fHwgZHN0UmVjdFdpbi5ib3R0b20gPD0gZHN0UmVjdFdpbi50b3ApCisgICAgICAgIHJldHVybjsK
KworICAgIFNJWkUgYm1wU2l6ZSA9IHsgYm1wV2lkdGgsIGJtcEhlaWdodCB9OworCisgICAgLy8g
UmVsYXRpdmUgdG8gZGVzdGluYXRpb24sIGluIGJpdG1hcCBwaXhlbHMKKyAgICBQT0lOVCBwaGFz
ZVdpbiA9IHsgc3RhYmxlUm91bmQodmlzaWJsZURzdFJlY3QueCgpIC0gcGhhc2UueCgpKSwgc3Rh
YmxlUm91bmQodmlzaWJsZURzdFJlY3QueSgpIC0gcGhhc2UueSgpKSB9OworICAgIG5vcm1hbGl6
ZVBoYXNlKHBoYXNlV2luLngsIGJtcFNpemUuY3gpOworICAgIG5vcm1hbGl6ZVBoYXNlKHBoYXNl
V2luLnksIGJtcFNpemUuY3kpOworCisgICAgeworICAgICAgICBSRUNUIHNyY1JlY3RXaW4gPQor
ICAgICAgICB7CisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIHN0
YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LnJpZ2h0KCkpIC0gc3RhYmxlUm91bmQodmlzaWJsZURz
dFJlY3QueCgpKSwKKyAgICAgICAgICAgIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LmJvdHRv
bSgpKSAtIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LnkoKSkKKyAgICAgICAgfTsKKyAgICAg
ICAgaWYgKHNyY1JlY3RXaW4ucmlnaHQgPD0gMCB8fCBzcmNSZWN0V2luLmJvdHRvbSA8PSAwKQor
ICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbyghdXNlQWxw
aGEsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tKTsKKyAgICAgICAgdm9pZCog
cGl4ZWxzOworICAgICAgICBPd25QdHI8SEJJVE1BUD4gaGJtcFRlbXAoTWVtb3J5TWFuYWdlcjo6
Y3JlYXRlRElCU2VjdGlvbigmYm1wSW5mbywgJnBpeGVscykpOworCisgICAgICAgIGlmIChoYm1w
VGVtcCkgeworICAgICAgICAgICAgT3duUHRyPEhEQz4gaG1lbWRjKENyZWF0ZUNvbXBhdGlibGVE
QyhoZGMpKTsKKyAgICAgICAgICAgIEhHRElPQkogb2xkQm1wID0gU2VsZWN0T2JqZWN0KGhtZW1k
Yy5nZXQoKSwgaGJtcFRlbXAuZ2V0KCkpOworICAgICAgICAgICAgaWYgKGNsaXBwZWRCbXApCisg
ICAgICAgICAgICAgICAgZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0V2lu
LCBjbGlwcGVkQm1wLmdldCgpLCBwaGFzZVdpbik7CisgICAgICAgICAgICBlbHNlIGlmICgob3Ag
IT0gQ29tcG9zaXRlU291cmNlT3ZlciB8fCBjYW5Vc2VESUJpdHMoKSkgJiYgc3JjUmVjdFdpbi5y
aWdodCA8PSBibXBTaXplLmN4ICogMiAmJiBzcmNSZWN0V2luLmJvdHRvbSA8PSBibXBTaXplLmN5
ICogMikKKyAgICAgICAgICAgICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNy
Y1JlY3RXaW4sIHRoaXMsIGJtcFNpemUsIHBoYXNlV2luKTsKKyAgICAgICAgICAgIGVsc2UgaWYg
KGVuc3VyZUhhbmRsZSgpKQorICAgICAgICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1k
Yy5nZXQoKSwgc3JjUmVjdFdpbiwgZ2V0SGFuZGxlKCksIHBoYXNlV2luKTsKKyAgICAgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgICAgIHZvaWQqIHBpeGVsczsKKyAgICAgICAgICAgICAgICBC
aXRtYXBJbmZvIGJtcEluZm87CisgICAgICAgICAgICAgICAgaWYgKEhCSVRNQVAgaGJtcCA9IGNy
ZWF0ZUhhbmRsZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsIGZhbHNlKSkgeworICAgICAgICAgICAg
ICAgICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RXaW4sIGhibXAs
IHBoYXNlV2luKTsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlT2JqZWN0KGhibXApOworICAg
ICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFNlbGVjdE9iamVjdCho
bWVtZGMuZ2V0KCksIG9sZEJtcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNpZiBkZWZpbmVkKE5PX0FMUEhBQkxFTkQp
CisgICAgICAgICAgICBpZiAodXNlQWxwaGEgfHwob3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAm
JiB1c2VzVHJhbnNwYXJlbnRDb2xvcigpKSkKKyNlbHNlCisgICAgICAgICAgICBpZiAodXNlQWxw
aGEpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgQkxFTkRGVU5DVElPTiBibGVuZCA9
IHsgQUNfU1JDX09WRVIsIDAsIDI1NSwgQUNfU1JDX0FMUEhBIH07CisgICAgICAgICAgICAgICAg
QWxwaGFCbGVuZChoZGMsIGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RX
aW4ucmlnaHQgLSBkc3RSZWN0V2luLmxlZnQsIGRzdFJlY3RXaW4uYm90dG9tIC0gZHN0UmVjdFdp
bi50b3AKKyAgICAgICAgICAgICAgICAgICAgLCBobWVtZGMuZ2V0KCksIDAsIDAsIHNyY1JlY3RX
aW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tLCBibGVuZCk7CisgICAgICAgICAgICB9IGVsc2Ug
aWYgKG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgJiYgdXNlc1RyYW5zcGFyZW50Q29sb3IoKSkK
KyNlbmRpZgorICAgICAgICAgICAgICAgIFRyYW5zcGFyZW50Qmx0KGhkYywgZHN0UmVjdFdpbi5s
ZWZ0LCBkc3RSZWN0V2luLnRvcCwgZHN0UmVjdFdpbi5yaWdodCAtIGRzdFJlY3RXaW4ubGVmdAor
ICAgICAgICAgICAgICAgICAgICAsIGRzdFJlY3RXaW4uYm90dG9tIC0gZHN0UmVjdFdpbi50b3As
IGhtZW1kYy5nZXQoKSwgMCwgMCwgc3JjUmVjdFdpbi5yaWdodCwgc3JjUmVjdFdpbi5ib3R0b20s
IHRyYW5zcGFyZW50Q29sb3IoKSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAg
ICBEV09SRCBibXBPcCA9IG9wID09IENvbXBvc2l0ZUNvcHkgPyBTUkNDT1BZCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgOiBvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVyID8gU1JDQ09QWQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3AgPT0gQ29tcG9zaXRlWE9SID8gUEFUSU5W
RVJUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcCA9PSBDb21wb3NpdGVDbGVhciA/
IFdISVRFTkVTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU1JDQ09QWTsgLy8gRklY
RU1FOiBvdGhlciB0eXBlcz8KKworICAgICAgICAgICAgICAgIFN0cmV0Y2hESUJpdHMoaGRjLCBk
c3RSZWN0V2luLmxlZnQsIGRzdFJlY3RXaW4udG9wLCBkc3RSZWN0V2luLnJpZ2h0IC0gZHN0UmVj
dFdpbi5sZWZ0CisgICAgICAgICAgICAgICAgICAgICwgZHN0UmVjdFdpbi5ib3R0b20gLSBkc3RS
ZWN0V2luLnRvcCwgMCwgMCwgc3JjUmVjdFdpbi5yaWdodCwgc3JjUmVjdFdpbi5ib3R0b20KKyAg
ICAgICAgICAgICAgICAgICAgLCBwaXhlbHMsICZibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgYm1w
T3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQo
KSwgb2xkQm1wKTsKKyAgICAgICAgfQorICAgIH0KK30KKworU2hhcmVkQml0bWFwOjpEQ1Byb3Zp
ZGVyIGdfZGNQcm92aWRlcjsKK1NoYXJlZEJpdG1hcDo6RENQcm92aWRlciogU2hhcmVkQml0bWFw
OjptX2RjUHJvdmlkZXIgPSAmZ19kY1Byb3ZpZGVyOworCitIREMgU2hhcmVkQml0bWFwOjpEQ1By
b3ZpZGVyOjpnZXREQyhTaGFyZWRCaXRtYXAqIGJtcCwgdW5zaWduZWQqIGtleTEsIHVuc2lnbmVk
KiBrZXkyKQoreworICAgIGlmICghYm1wIHx8ICFibXAtPmVuc3VyZUhhbmRsZSgpKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIEhEQyBoZGMgPSA6OkNyZWF0ZUNvbXBhdGlibGVEQygwKTsKKyAg
ICBpZiAoaGRjKSB7CisgICAgICAgICprZXkxID0gKHVuc2lnbmVkKVNlbGVjdE9iamVjdChoZGMs
IGJtcC0+Z2V0SGFuZGxlKCkpOworICAgICAgICBSRUNUIHJlY3QgPSB7IDAsIDAsIGJtcC0+d2lk
dGgoKSwgYm1wLT5oZWlnaHQoKSB9OworICAgICAgICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVh
dGVSZWN0UmduSW5kaXJlY3QoJnJlY3QpKTsKKyAgICAgICAgU2VsZWN0Q2xpcFJnbihoZGMsIGNs
aXBSZ24uZ2V0KCkpOworICAgIH0KKworICAgIHJldHVybiBoZGM7Cit9CisKK3ZvaWQgU2hhcmVk
Qml0bWFwOjpEQ1Byb3ZpZGVyOjpyZWxlYXNlREMoU2hhcmVkQml0bWFwKiwgSERDIGhkYywgdW5z
aWduZWQga2V5MSwgdW5zaWduZWQga2V5MikKK3sKKyAgICBpZiAoIWhkYykKKyAgICAgICAgcmV0
dXJuOworCisgICAgU2VsZWN0T2JqZWN0KGhkYywgKEhHRElPQkopa2V5MSk7CisgICAgRGVsZXRl
REMoaGRjKTsKK30KKwordm9pZCBTaGFyZWRCaXRtYXA6OmNsZWFyUGl4ZWxzKGNvbnN0IEludFJl
Y3QmIHIpCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50
UmVjdCBibXBSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBibXBSZWN0LmludGVy
c2VjdChyKTsKKyAgICBpZiAoaXMxNmJpdCgpKSB7CisgICAgICAgIGludCB3ID0gbV9ibXBJbmZv
LnBhZGRlZFdpZHRoKCk7CisgICAgICAgIHVuc2lnbmVkIHNob3J0KiBkc3QgPSAodW5zaWduZWQg
c2hvcnQqKW1fcGl4ZWxzOworICAgICAgICBkc3QgKz0gYm1wUmVjdC55KCkgKiB3ICsgYm1wUmVj
dC54KCk7CisgICAgICAgIGludCB3b3Jkc1RvU2V0ID0gYm1wUmVjdC53aWR0aCgpOworICAgICAg
ICBjb25zdCB1bnNpZ25lZCBzaG9ydCogZHN0RW5kID0gZHN0ICsgYm1wUmVjdC5oZWlnaHQoKSAq
IHc7CisgICAgICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAgICAgICAgICAgIHdtZW1zZXQo
KHdjaGFyX3QqKWRzdCwgMCwgd29yZHNUb1NldCk7CisgICAgICAgICAgICBkc3QgKz0gdzsKKyAg
ICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCB3ID0gd2lkdGgoKTsKKyAgICAgICAg
dW5zaWduZWQqIGRzdCA9ICh1bnNpZ25lZCopbV9waXhlbHM7CisgICAgICAgIGRzdCArPSBibXBS
ZWN0LnkoKSAqIHcgKyBibXBSZWN0LngoKTsKKyAgICAgICAgaW50IHdvcmRzVG9TZXQgPSBibXBS
ZWN0LndpZHRoKCkgKiAyOworICAgICAgICBjb25zdCB1bnNpZ25lZCogZHN0RW5kID0gZHN0ICsg
Ym1wUmVjdC5oZWlnaHQoKSAqIHc7CisgICAgICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAg
ICAgICAgICAgIHdtZW1zZXQoKHdjaGFyX3QqKWRzdCwgMCwgd29yZHNUb1NldCk7CisgICAgICAg
ICAgICBkc3QgKz0gdzsKKyAgICAgICAgfQorICAgIH0KK30KKworfQorCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi4zNzY3NjQzCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaApAQCAtMCwwICsxLDE0NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkJpdG1hcElu
Zm8uaCIKKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3Vu
dGVkLmg+CisjaW5jbHVkZSA8d2luZ2RpLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAg
IGVudW0gQ29tcG9zaXRlT3BlcmF0b3I7CisgICAgY2xhc3MgRmxvYXRQb2ludDsKKyAgICBjbGFz
cyBGbG9hdFJlY3Q7CisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OworICAgIGNsYXNzIEludFJl
Y3Q7CisgICAgY2xhc3MgSW50U2l6ZTsKKyAgICBjbGFzcyBUcmFuc2Zvcm1hdGlvbk1hdHJpeDsK
KworICAgIGNsYXNzIFNoYXJlZEJpdG1hcDogcHVibGljIFJlZkNvdW50ZWQ8U2hhcmVkQml0bWFw
PiB7CisgICAgcHVibGljOgorICAgICAgICB+U2hhcmVkQml0bWFwKCk7CisgICAgICAgIHN0YXRp
YyBQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4gY3JlYXRlSW5zdGFuY2UoYm9vbCBpczE2Yml0LCBp
bnQgdywgaW50IGgsIGJvb2wgaW5pdFBpeGVscyk7CisgICAgICAgIGNvbnN0IEJpdG1hcEluZm8m
IGJpdG1hcEluZm8oKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm87IH0KKyAgICAgICAgdm9pZCog
Ynl0ZXMoKSB7IHJldHVybiBtX3BpeGVsczsgfQorICAgICAgICBjb25zdCB2b2lkKiBieXRlcygp
IGNvbnN0IHsgcmV0dXJuIG1fcGl4ZWxzOyB9CisgICAgICAgIHVuc2lnbmVkIHdpZHRoKCkgY29u
c3QgeyByZXR1cm4gbV9ibXBJbmZvLndpZHRoKCk7IH0KKyAgICAgICAgdW5zaWduZWQgaGVpZ2h0
KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmhlaWdodCgpOyB9CisgICAgICAgIHVuc2lnbmVk
IHZhbGlkSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV92YWxpZEhlaWdodDsgfQorICAgICAgICB2
b2lkIHNldFZhbGlkSGVpZ2h0KHVuc2lnbmVkIHZhbGlkSGVpZ2h0KSB7IG1fdmFsaWRIZWlnaHQg
PSB2YWxpZEhlaWdodDsgfQorICAgICAgICB2b2lkIHJlc2V0UGl4ZWxzKGJvb2wgYmxhY2sgPSBm
YWxzZSk7CisgICAgICAgIHZvaWQgY2xlYXJQaXhlbHMoY29uc3QgSW50UmVjdCYgcik7CisgICAg
ICAgIGJvb2wgbG9ja2VkKCkgY29uc3QgeyByZXR1cm4gbV9sb2NrZWQ7IH0KKyAgICAgICAgdm9p
ZCBsb2NrKCkgeyBtX2xvY2tlZCA9IHRydWU7IH0KKyAgICAgICAgdm9pZCB1bmxvY2soKSB7IG1f
bG9ja2VkID0gZmFsc2U7IH0KKyAgICAgICAgYm9vbCBmcmVlTWVtb3J5KCk7CisgICAgICAgIGJv
b2wgaXMxNmJpdCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mby5pczE2Yml0KCk7IH0KKyAgICAg
ICAgYm9vbCBpczMyYml0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmlzMzJiaXQoKTsgfQor
ICAgICAgICBib29sIHRvMTZiaXQoKTsKKyAgICAgICAgYm9vbCBoYXNBbHBoYSgpIGNvbnN0IHsg
cmV0dXJuIG1faGFzQWxwaGE7IH0KKyAgICAgICAgdm9pZCBzZXRIYXNBbHBoYShib29sIGFscGhh
KSB7IG1faGFzQWxwaGEgPSBhbHBoYTsgfQorICAgICAgICBib29sIGVuc3VyZUhhbmRsZSgpOwor
ICAgICAgICBIQklUTUFQIGdldEhhbmRsZSgpIHsgcmV0dXJuIG1faGJpdG1hcDsgfQorICAgICAg
ICBIQklUTUFQIGNyZWF0ZUhhbmRsZSh2b2lkKiogcGl4ZWxzLCBCaXRtYXBJbmZvKiBibXBJbmZv
LCBpbnQgaCA9IC0xLCBib29sIHVzZTE2Yml0ID0gdHJ1ZSkgY29uc3Q7CisgICAgICAgIGJvb2wg
dXNlc1RyYW5zcGFyZW50Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX3VzZXNUcmFuc3BhcmVudENv
bG9yOyB9CisgICAgICAgIENPTE9SUkVGIHRyYW5zcGFyZW50Q29sb3IoKSBjb25zdCB7IHJldHVy
biBtX3RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICAgICAgdm9pZCBzZXRUcmFuc3BhcmVudENvbG9y
KENPTE9SUkVGIGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fdXNlc1RyYW5zcGFyZW50Q29s
b3IgPSB0cnVlOworICAgICAgICAgICAgbV90cmFuc3BhcmVudENvbG9yID0gYzsKKyAgICAgICAg
fQorICAgICAgICBib29sIGNhblVzZURJQml0cygpIGNvbnN0IHsgcmV0dXJuICFoYXNBbHBoYSgp
ICYmICF1c2VzVHJhbnNwYXJlbnRDb2xvcigpOyB9CisKKyAgICAgICAgSEJJVE1BUCBjbGlwQml0
bWFwKGNvbnN0IEludFJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29s
IHVzZUFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwSW5mbyYgYm1wSW5m
bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBwaXhlbHMpOworCisgICAgICAg
IFBhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBjbGlwQml0bWFwKGNvbnN0IEludFJlY3QmIHJlY3Qs
IGJvb2wgdXNlQWxwaGEpOworCisgICAgICAgIHZvaWQgZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0
eHQsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBv
c2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgdm9pZCBkcmF3UGF0dGVybihHcmFw
aGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0
IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKTsKKyAg
ICAgICAgdm9pZCBkcmF3KEhEQywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVj
dCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApOworICAgICAgICB2b2lk
IGRyYXdQYXR0ZXJuKEhEQywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmLCBjb25zdCBGbG9h
dFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJh
bnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2Us
IENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBJ
bnRTaXplJiBvcmlnU291cmNlU2l6ZSk7CisKKyAgICAgICAgdHlwZWRlZiB2b2lkICgqRHJhd1Bh
dHRlcm5GdW5jKShTaGFyZWRCaXRtYXAqIGJtcCwgSERDLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBG
bG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYg
ZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKTsKKyAgICAgICAgdHlwZWRl
ZiBib29sICgqRHJhd0ltYWdlRnVuYykgKFNoYXJlZEJpdG1hcCogYm1wLCBIREMsIGNvbnN0IElu
dFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9y
IGNvbXBvc2l0ZU9wKTsKKworICAgICAgICBzdGF0aWMgRHJhd1BhdHRlcm5GdW5jIHNldERyYXdQ
YXR0ZXJuRnVuYyhEcmF3UGF0dGVybkZ1bmMgZnVuYyk7CisgICAgICAgIHN0YXRpYyBEcmF3SW1h
Z2VGdW5jIHNldERyYXdJbWFnZUZ1bmMoRHJhd0ltYWdlRnVuYyBmdW5jKTsKKworICAgICAgICBj
bGFzcyBEQ1Byb3ZpZGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgdmlydHVhbCBI
REMgZ2V0REMoU2hhcmVkQml0bWFwKiwgdW5zaWduZWQqIGtleTEsIHVuc2lnbmVkKiBrZXkyKTsK
KyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlREMoU2hhcmVkQml0bWFwKiwgSERDIGhk
YywgdW5zaWduZWQga2V5MSwgdW5zaWduZWQga2V5Mik7CisgICAgICAgIH07CisKKyAgICAgICAg
c3RhdGljIERDUHJvdmlkZXIqIG1fZGNQcm92aWRlcjsKKworICAgICAgICBIREMgZ2V0REModW5z
aWduZWQqIGtleTEsIHVuc2lnbmVkKiBrZXkyKSB7IHJldHVybiBtX2RjUHJvdmlkZXItPmdldERD
KHRoaXMsIGtleTEsIGtleTIpOyB9CisgICAgICAgIHZvaWQgcmVsZWFzZURDKEhEQyBoZGMsIHVu
c2lnbmVkIGtleTEsIHVuc2lnbmVkIGtleTIpIHsgbV9kY1Byb3ZpZGVyLT5yZWxlYXNlREModGhp
cywgaGRjLCBrZXkxLCBrZXkyKTsgfQorCisgICAgICAgIGNsYXNzIERDSG9sZGVyIHsKKyAgICAg
ICAgcHVibGljOgorICAgICAgICAgICAgRENIb2xkZXIoU2hhcmVkQml0bWFwKiBibXAgPSAwKSB7
IF9zZXQoYm1wKTsgfQorICAgICAgICAgICAgfkRDSG9sZGVyKCkgeyBfY2xlYXIoKTsgfQorICAg
ICAgICAgICAgdm9pZCBzZXQoU2hhcmVkQml0bWFwKiBibXAgPSAwKQorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIF9jbGVhcigpOworICAgICAgICAgICAgICAgIF9zZXQoYm1wKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIEhEQyBnZXQoKSBjb25zdCB7IHJldHVybiBtX2hkYzsg
fQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgRENIb2xkZXImIG9wZXJhdG9yPShjb25z
dCBEQ0hvbGRlciYpOworICAgICAgICAgICAgRENIb2xkZXIoY29uc3QgRENIb2xkZXImKTsKKyAg
ICAgICAgICAgIHZvaWQgX2NsZWFyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBp
ZiAobV9oZGMpCisgICAgICAgICAgICAgICAgICAgIG1fYml0bWFwLT5yZWxlYXNlREMobV9oZGMs
IG1fa2V5MSwgbV9rZXkyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgX3NldChT
aGFyZWRCaXRtYXAqIGJtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2JpdG1h
cCA9IGJtcDsKKyAgICAgICAgICAgICAgICBtX2hkYyA9IGJtcCA/IGJtcC0+Z2V0REMoJm1fa2V5
MSwgJm1fa2V5MikgOiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2hhcmVkQml0bWFw
KiBtX2JpdG1hcDsKKyAgICAgICAgICAgIEhEQyBtX2hkYzsKKyAgICAgICAgICAgIHVuc2lnbmVk
IG1fa2V5MTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1fa2V5MjsKKyAgICAgICAgfTsKKworICAg
IHByaXZhdGU6CisgICAgICAgIGV4cGxpY2l0IFNoYXJlZEJpdG1hcChib29sIGlzMTZiaXQsIGlu
dCB3LCBpbnQgaCwgYm9vbCBpbml0UGl4ZWxzKTsKKyAgICAgICAgZXhwbGljaXQgU2hhcmVkQml0
bWFwKGNvbnN0IEJpdG1hcEluZm8mIGJtcEluZm8sIEhCSVRNQVAgaGJtcCwgdm9pZCogcGl4ZWxz
KTsKKyAgICAgICAgQml0bWFwSW5mbyBtX2JtcEluZm87CisgICAgICAgIGludCBtX3JlZmVyZW5j
ZTsKKyAgICAgICAgSEJJVE1BUCBtX2hiaXRtYXA7CisgICAgICAgIHZvaWQqIG1fcGl4ZWxzOwor
ICAgICAgICBDT0xPUlJFRiBtX3RyYW5zcGFyZW50Q29sb3I7CisgICAgICAgIGludCBtX3ZhbGlk
SGVpZ2h0OworICAgICAgICBib29sIG1fbG9ja2VkOworICAgICAgICBib29sIG1fdXNlc1RyYW5z
cGFyZW50Q29sb3I7CisgICAgICAgIGJvb2wgbV9oYXNBbHBoYTsKKyAgICB9OworCit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34394</attachid>
            <date>2009-08-08 13:32:28 -0700</date>
            <delta_ts>2009-08-10 15:05:06 -0700</delta_ts>
            <desc>3) ImageBuffer</desc>
            <filename>27511_3.patch</filename>
            <type>text/plain</type>
            <size>9080</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uMjQxMjcxYyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEltcGxlbWVudCBJbWFnZUJ1ZmZlcgorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1MTEKKworICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyRGF0YS5oOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbmNlLmNwcDogQWRk
ZWQuCisKIDIwMDktMDgtMDYgIFlvbmcgTGkgIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJEYXRhLmggYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyRGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjAxYjdkMDYKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyRGF0YS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgSW1hZ2VCdWZmZXJEYXRhX2gKKyNkZWZpbmUgSW1h
Z2VCdWZmZXJEYXRhX2gKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgSW50U2l6
ZTsKKyAgICBjbGFzcyBJbWFnZUJ1ZmZlckRhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW1h
Z2VCdWZmZXJEYXRhKGNvbnN0IEludFNpemUmIHNpemUpOworICAgICAgICBSZWZQdHI8U2hhcmVk
Qml0bWFwPiBtX2JpdG1hcDsKKyAgICB9OworCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgIC8vIEltYWdlQnVmZmVyRGF0YV9oCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi5mYTgxM2UzCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbmNlLmNwcApAQCAtMCwwICsxLDE5OSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkltYWdl
QnVmZmVyLmgiCisKKyNpbmNsdWRlICJCYXNlNjQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIkltYWdlRGF0YS5oIgorI2luY2x1
ZGUgIkpQRUdFbmNvZGVyLmgiCisjaW5jbHVkZSAiUE5HRW5jb2Rlci5oIgorI2luY2x1ZGUgIlNo
YXJlZEJpdG1hcC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEJ1ZmZlcmVkSW1h
Z2U6IHB1YmxpYyBJbWFnZSB7CisKK3B1YmxpYzoKKyAgICBCdWZmZXJlZEltYWdlKGNvbnN0IElt
YWdlQnVmZmVyRGF0YSogZGF0YSkKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkKKyAgICB7CisgICAg
fQorCisgICAgdmlydHVhbCBJbnRTaXplIHNpemUoKSBjb25zdCB7IHJldHVybiBJbnRTaXplKG1f
ZGF0YS0+bV9iaXRtYXAtPndpZHRoKCksIG1fZGF0YS0+bV9iaXRtYXAtPmhlaWdodCgpKTsgfQor
ICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95RGVjb2RlZERhdGEoYm9vbCBkZXN0cm95QWxsID0gdHJ1
ZSkge30KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGRlY29kZWRTaXplKCkgY29uc3QgeyByZXR1cm4g
MDsgfQorICAgIHZpcnR1YWwgdm9pZCBkcmF3KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEZsb2F0
UmVjdCYgZHN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRv
cik7CisgICAgdmlydHVhbCB2b2lkIGRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0
IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5U
cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQm
IHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCk7CisK
KyAgICBjb25zdCBJbWFnZUJ1ZmZlckRhdGEqIG1fZGF0YTsKK307CisKK3ZvaWQgQnVmZmVyZWRJ
bWFnZTo6ZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVj
dCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVP
cCkKK3sKKyAgICBJbnRSZWN0IGludERzdFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGRzdFJlY3Qp
OworICAgIEludFJlY3QgaW50U3JjUmVjdChzcmNSZWN0KTsKKyAgICBtX2RhdGEtPm1fYml0bWFw
LT5kcmF3KGN0eHQsIGludERzdFJlY3QsIGludFNyY1JlY3QsIGNvbXBvc2l0ZU9wKTsKK30KKwor
dm9pZCBCdWZmZXJlZEltYWdlOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNv
bnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBh
dHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0
UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0
UmVjdCkKK3sKKyAgICBtX2RhdGEtPm1fYml0bWFwLT5kcmF3UGF0dGVybihjdHh0LCB0aWxlUmVj
dEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgb3AsIGRlc3RSZWN0LCBzaXplKCkpOworfQor
CitJbWFnZUJ1ZmZlckRhdGE6OkltYWdlQnVmZmVyRGF0YShjb25zdCBJbnRTaXplJiBzaXplKQor
OiBtX2JpdG1hcChTaGFyZWRCaXRtYXA6OmNyZWF0ZUluc3RhbmNlKGZhbHNlLCBzaXplLndpZHRo
KCksIHNpemUuaGVpZ2h0KCksIGZhbHNlKSkKK3sKKyAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9U
Ui8yMDA5L1dELWh0bWw1LTIwMDkwMjEyL3RoZS1jYW52YXMtZWxlbWVudC5odG1sI2NhbnZhc3Bp
eGVsYXJyYXkKKyAgICAvLyAiV2hlbiB0aGUgY2FudmFzIGlzIGluaXRpYWxpemVkIGl0IG11c3Qg
YmUgc2V0IHRvIGZ1bGx5IHRyYW5zcGFyZW50IGJsYWNrLiIKKyAgICBtX2JpdG1hcC0+cmVzZXRQ
aXhlbHModHJ1ZSk7CisgICAgbV9iaXRtYXAtPnNldEhhc0FscGhhKHRydWUpOworfQorCitJbWFn
ZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIoY29uc3QgSW50U2l6ZSYgc2l6ZSwgYm9vbCBncmF5U2NhbGUs
IGJvb2wmIHN1Y2Nlc3MpCis6IG1fZGF0YShzaXplKQorLCBtX3NpemUoc2l6ZSkKK3sKKyAgICBn
cmF5U2NhbGU7IC8vIEN1cnJlbnRseSBub3QgdXNlZAorICAgIG1fY29udGV4dC5zZXQobmV3IEdy
YXBoaWNzQ29udGV4dCgwKSk7CisgICAgbV9jb250ZXh0LT5zZXRCaXRtYXAobV9kYXRhLm1fYml0
bWFwKTsKKyAgICBzdWNjZXNzID0gdHJ1ZTsKK30KKworSW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZl
cigpCit7Cit9CisKK0dyYXBoaWNzQ29udGV4dCogSW1hZ2VCdWZmZXI6OmNvbnRleHQoKSBjb25z
dAoreworICAgIHJldHVybiBtX2NvbnRleHQuZ2V0KCk7Cit9CisKK0ltYWdlKiBJbWFnZUJ1ZmZl
cjo6aW1hZ2UoKSBjb25zdAoreworICAgIGlmICghbV9pbWFnZSkKKyAgICAgICAgbV9pbWFnZSA9
IGFkb3B0UmVmKG5ldyBCdWZmZXJlZEltYWdlKCZtX2RhdGEpKTsKKworICAgIHJldHVybiBtX2lt
YWdlLmdldCgpOworfQorCitQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldElt
YWdlRGF0YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIFBhc3NSZWZQdHI8SW1h
Z2VEYXRhPiBpbWFnZURhdGEgPSBJbWFnZURhdGE6OmNyZWF0ZShyZWN0LndpZHRoKCksIHJlY3Qu
aGVpZ2h0KCkpOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjID0gKHVuc2lnbmVkIGNo
YXIqKW1fZGF0YS5tX2JpdG1hcC0+Ynl0ZXMoKTsKKyAgICBpZiAoIXNyYykKKyAgICAgICAgcmV0
dXJuIGltYWdlRGF0YTsKKworICAgIEludFJlY3Qgc291cmNlUmVjdCgwLCAwLCBtX2RhdGEubV9i
aXRtYXAtPndpZHRoKCksIG1fZGF0YS5tX2JpdG1hcC0+aGVpZ2h0KCkpOworICAgIHNvdXJjZVJl
Y3QuaW50ZXJzZWN0KHJlY3QpOworICAgIGlmIChzb3VyY2VSZWN0LmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIGltYWdlRGF0YTsKKworICAgIHVuc2lnbmVkIGNoYXIqIGRzdCA9IGltYWdlRGF0
YS0+ZGF0YSgpLT5kYXRhKCktPmRhdGEoKTsKKyAgICBtZW1zZXQoZHN0LCAwLCBpbWFnZURhdGEt
PmRhdGEoKS0+ZGF0YSgpLT5sZW5ndGgoKSk7CisgICAgc3JjICs9IChzb3VyY2VSZWN0LnkoKSAq
IG1fZGF0YS5tX2JpdG1hcC0+d2lkdGgoKSArIHNvdXJjZVJlY3QueCgpKSAqIDQ7CisgICAgZHN0
ICs9ICgoc291cmNlUmVjdC55KCkgLSByZWN0LnkoKSkgKiBpbWFnZURhdGEtPndpZHRoKCkgKyBz
b3VyY2VSZWN0LngoKSAtIHJlY3QueCgpKSAqIDQ7CisgICAgaW50IGJ5dGVzVG9Db3B5ID0gc291
cmNlUmVjdC53aWR0aCgpICogNDsKKyAgICBpbnQgc3JjU2tpcCA9IChtX2RhdGEubV9iaXRtYXAt
PndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICogNDsKKyAgICBpbnQgZHN0U2tpcCA9IChp
bWFnZURhdGEtPndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICogNDsKKyAgICBjb25zdCB1
bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBkc3QgKyBzb3VyY2VSZWN0LmhlaWdodCgpICogaW1hZ2VE
YXRhLT53aWR0aCgpICogNDsKKyAgICB3aGlsZSAoZHN0IDwgZHN0RW5kKSB7CisgICAgICAgIGNv
bnN0IHVuc2lnbmVkIGNoYXIqIGRzdFJvd0VuZCA9IGRzdCArIGJ5dGVzVG9Db3B5OworICAgICAg
ICB3aGlsZSAoZHN0IDwgZHN0Um93RW5kKSB7CisgICAgICAgICAgICAqZHN0KysgPSBzcmNbM107
IC8vIEEKKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsgLy8gQgorICAgICAgICAgICAgKmRz
dCsrID0gKnNyYysrOyAvLyBHCisgICAgICAgICAgICAqZHN0KysgPSAqc3JjKys7IC8vIFIKKyAg
ICAgICAgICAgICsrc3JjOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBzcmNTa2lwOworICAg
ICAgICBkc3QgKz0gZHN0U2tpcDsKKyAgICB9CisKKyAgICByZXR1cm4gaW1hZ2VEYXRhOworfQor
Cit2b2lkIEltYWdlQnVmZmVyOjpwdXRJbWFnZURhdGEoSW1hZ2VEYXRhKiBzb3VyY2UsIGNvbnN0
IEludFJlY3QmIHNvdXJjZVJlY3QsIGNvbnN0IEludFBvaW50JiBkZXN0UG9pbnQpCit7CisgICAg
dW5zaWduZWQgY2hhciogZHN0ID0gKHVuc2lnbmVkIGNoYXIqKW1fZGF0YS5tX2JpdG1hcC0+Ynl0
ZXMoKTsKKyAgICBpZiAoIWRzdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBkZXN0
UmVjdChkZXN0UG9pbnQsIHNvdXJjZVJlY3Quc2l6ZSgpKTsKKyAgICBkZXN0UmVjdC5pbnRlcnNl
Y3QoSW50UmVjdCgwLCAwLCBtX2RhdGEubV9iaXRtYXAtPndpZHRoKCksIG1fZGF0YS5tX2JpdG1h
cC0+aGVpZ2h0KCkpKTsKKworICAgIGlmIChkZXN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYyA9IHNvdXJjZS0+ZGF0YSgpLT5k
YXRhKCktPmRhdGEoKTsKKyAgICBkc3QgKz0gKGRlc3RSZWN0LnkoKSAqIG1fZGF0YS5tX2JpdG1h
cC0+d2lkdGgoKSArIGRlc3RSZWN0LngoKSkgKiA0OworICAgIHNyYyArPSAoc291cmNlUmVjdC55
KCkgKiBzb3VyY2UtPndpZHRoKCkgKyBzb3VyY2VSZWN0LngoKSkgKiA0OworICAgIGludCBieXRl
c1RvQ29weSA9IGRlc3RSZWN0LndpZHRoKCkgKiA0OworICAgIGludCBkc3RTa2lwID0gKG1fZGF0
YS5tX2JpdG1hcC0+d2lkdGgoKSAtIGRlc3RSZWN0LndpZHRoKCkpICogNDsKKyAgICBpbnQgc3Jj
U2tpcCA9IChzb3VyY2UtPndpZHRoKCkgLSBkZXN0UmVjdC53aWR0aCgpKSAqIDQ7CisgICAgY29u
c3QgdW5zaWduZWQgY2hhciogZHN0RW5kID0gZHN0ICsgZGVzdFJlY3QuaGVpZ2h0KCkgKiBtX2Rh
dGEubV9iaXRtYXAtPndpZHRoKCkgKiA0OworICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAg
ICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZHN0Um93RW5kID0gZHN0ICsgYnl0ZXNUb0NvcHk7
CisgICAgICAgIHdoaWxlIChkc3QgPCBkc3RSb3dFbmQpIHsKKyAgICAgICAgICAgIHVuc2lnbmVk
IGNoYXIgYWxwaGEgPSAqc3JjKys7CisgICAgICAgICAgICAqZHN0KysgPSAqc3JjKys7IC8vIEIK
KyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKzsgLy8gRworICAgICAgICAgICAgKmRzdCsrID0g
KnNyYysrOyAvLyBSCisgICAgICAgICAgICAqZHN0KysgPSBhbHBoYTsKKyAgICAgICAgfQorICAg
ICAgICBzcmMgKz0gc3JjU2tpcDsKKyAgICAgICAgZHN0ICs9IGRzdFNraXA7CisgICAgfQorfQor
CitTdHJpbmcgSW1hZ2VCdWZmZXI6OnRvRGF0YVVSTChjb25zdCBTdHJpbmcmIG1pbWVUeXBlKSBj
b25zdAoreworICAgIGlmICghbV9kYXRhLm1fYml0bWFwLT5ieXRlcygpKQorICAgICAgICByZXR1
cm4gImRhdGE6LCI7CisKKyAgICBWZWN0b3I8Y2hhcj4gb3V0cHV0OworICAgIGNvbnN0IGNoYXIq
IGhlYWRlcjsKKyAgICBpZiAobWltZVR5cGUubG93ZXIoKSA9PSAiaW1hZ2UvcG5nIikgeworICAg
ICAgICBpZiAoIWNvbXByZXNzQml0bWFwVG9QbmcobV9kYXRhLm1fYml0bWFwLmdldCgpLCBvdXRw
dXQpKQorICAgICAgICAgICAgcmV0dXJuICJkYXRhOiwiOworICAgICAgICBoZWFkZXIgPSAiZGF0
YTppbWFnZS9wbmc7YmFzZTY0LCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFjb21wcmVz
c0JpdG1hcFRvSnBlZyhtX2RhdGEubV9iaXRtYXAuZ2V0KCksIG91dHB1dCkpCisgICAgICAgICAg
ICByZXR1cm4gImRhdGE6LCI7CisgICAgICAgIGhlYWRlciA9ICJkYXRhOmltYWdlL2pwZWc7YmFz
ZTY0LCI7CisgICAgfQorCisgICAgVmVjdG9yPGNoYXI+IGJhc2U2NDsKKyAgICBiYXNlNjRFbmNv
ZGUob3V0cHV0LCBiYXNlNjQpOworCisgICAgb3V0cHV0LmNsZWFyKCk7CisKKyAgICBWZWN0b3I8
Y2hhcj4gdXJsOworICAgIHVybC5hcHBlbmQoaGVhZGVyLCBzdHJsZW4oaGVhZGVyKSk7CisgICAg
dXJsLmFwcGVuZChiYXNlNjQpOworCisgICAgcmV0dXJuIFN0cmluZyh1cmwuZGF0YSgpLCB1cmwu
c2l6ZSgpKTsKK30KKworfQo=
</data>
<flag name="review"
          id="18575"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34395</attachid>
            <date>2009-08-08 13:36:52 -0700</date>
            <delta_ts>2009-08-14 14:14:53 -0700</delta_ts>
            <desc>4) ImageFrameSink (used as image decoding buffer)</desc>
            <filename>27511_4.patch</filename>
            <type>text/plain</type>
            <size>12335</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uNTdiMjM2YSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNCBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEltYWdlRnJhbWVTaW5rLCB1c2VkIGFzIGltYWdl
IGRlY29kaW5nIGJ1ZmZlcgorICAgICAgICBzdXBwb3J0aW5nIGJvdGggMTZiaXQgYW5kIDMyYml0
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzUxMQor
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFtZVNpbmsuaDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFtZVNpbmtXaW5j
ZS5jcHA6IEFkZGVkLgorCiAyMDA5LTA4LTA2ICBZb25nIExpICA8eW9uZy5saUB0b3JjaG1vYmls
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQg
YS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rLmggYi9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxYjk3ZAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFtZVNpbmsuaApAQCAtMCwwICsxLDE2
OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFRvcmNoIE1vYmls
ZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpIHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
KyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIElNQUdFX0ZS
QU1FX1NJTktfSF8KKyNkZWZpbmUgSU1BR0VfRlJBTUVfU0lOS19IXworCisjaW5jbHVkZSAiSW50
UmVjdC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBuYW1lc3BhY2UgUkdCQTMyQnVm
ZmVyIHsKKyAgICAgICAgZW51bSBGcmFtZVN0YXR1cyB7CisgICAgICAgICAgICBGcmFtZUVtcHR5
LAorICAgICAgICAgICAgRnJhbWVQYXJ0aWFsLAorICAgICAgICAgICAgRnJhbWVDb21wbGV0ZQor
ICAgICAgICB9OworICAgICAgICBlbnVtIEZyYW1lRGlzcG9zYWxNZXRob2QgeworICAgICAgICAg
ICAgLy8gSWYgeW91IGNoYW5nZSB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgdGhlc2UsIG1ha2Ugc3Vy
ZSB5b3UgYXVkaXQgYWxsCisgICAgICAgICAgICAvLyB1c2VycywgYXMgc29tZSB1c2VycyBtYXkg
Y2FzdCByYXcgdmFsdWVzIHRvL2Zyb20gdGhlc2UgY29uc3RhbnRzLgorICAgICAgICAgICAgRGlz
cG9zZU5vdFNwZWNpZmllZCA9IDAsICAgICAgIC8vIExlYXZlIGZyYW1lIGluIGZyYW1lYnVmZmVy
CisgICAgICAgICAgICBEaXNwb3NlS2VlcCA9IDEsICAgICAgICAgICAgICAgLy8gTGVhdmUgZnJh
bWUgaW4gZnJhbWVidWZmZXIKKyAgICAgICAgICAgIERpc3Bvc2VPdmVyd3JpdGVCZ2NvbG9yID0g
MiwgICAvLyBDbGVhciBmcmFtZSB0byB0cmFuc3BhcmVudAorICAgICAgICAgICAgRGlzcG9zZU92
ZXJ3cml0ZVByZXZpb3VzID0gMywgIC8vIENsZWFyIGZyYW1lIHRvIHByZXZpb3VzIGZyYW1lYnVm
ZmVyIGNvbnRlbnRzCisgICAgICAgIH07CisgICAgfQorCisgICAgY2xhc3MgSW1hZ2VGcmFtZVNp
bmsgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW1hZ2VGcmFtZVNpbmsoYm9vbCBjYW5GcmVlQnVm
ZmVyKQorICAgICAgICAgICAgOiBtXzE2Yml0KGZhbHNlKQorICAgICAgICAgICAgLCBtX2ltYWdl
V2lkdGgoMCkKKyAgICAgICAgICAgICwgbV9idWZmZXJXaWR0aCgwKQorICAgICAgICAgICAgLCBt
X2hlaWdodCgwKQorICAgICAgICAgICAgLCBtX2V4cGVjdGVkSGVpZ2h0KDApCisgICAgICAgICAg
ICAsIG1fc3RhdHVzKFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSkKKyAgICAgICAgICAgICwgbV9k
aXNwb3NhbE1ldGhvZChSR0JBMzJCdWZmZXI6OkRpc3Bvc2VOb3RTcGVjaWZpZWQpCisgICAgICAg
ICAgICAsIG1fZHVyYXRpb24oMCkKKyAgICAgICAgICAgICwgbV9oYXNBbHBoYShmYWxzZSkKKyAg
ICAgICAgICAgICwgbV9jYW5GcmVlQnVmZmVyKGNhbkZyZWVCdWZmZXIpCisgICAgICAgICAgICAs
IG1fc2hvdWxkRnJlZUJ1ZmZlcihmYWxzZSkKKyAgICAgICAgICAgICwgbV91c2VzVHJhbnNwYXJl
bnRDb2xvcihmYWxzZSkKKyAgICAgICAgICAgICwgbV90cmFuc3BhcmVudENvbG9yKDApCisgICAg
ICAgICAgICAsIG1fY29tcG9zaXRlZFdpdGhQcmV2aW91c0ZyYW1lKGZhbHNlKQorICAgICAgICB7
CisgICAgICAgIH0KKworICAgICAgICB+SW1hZ2VGcmFtZVNpbmsoKSB7IGZyZWVCdWZmZXIoKTsg
fQorCisgICAgICAgIGNvbnN0IHZvaWQqIGJ5dGVzKCkgY29uc3Q7CisgICAgICAgIHZvaWQqIGJ5
dGVzKCk7CisgICAgICAgIGJvb2wgYWxsb2NhdGVCdWZmZXIoKTsKKyAgICAgICAgTmF0aXZlSW1h
Z2VQdHIgZ2V0RnJhbWUoKTsKKyAgICAgICAgYm9vbCBpc0J1ZmZlclJlYWR5KCkgY29uc3Q7Cisg
ICAgICAgIHZvaWQgZnJlZUJ1ZmZlcigpOworCisgICAgICAgIGJvb2wgc2hvdWxkRnJlZUJ1ZmZl
cigpIGNvbnN0IHsgcmV0dXJuIG1fc2hvdWxkRnJlZUJ1ZmZlcjsgfQorICAgICAgICBib29sIGNh
bkZyZWVCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX2NhbkZyZWVCdWZmZXI7IH0KKyAgICAgICAg
Ym9vbCBpczE2Yml0KCkgY29uc3QgeyByZXR1cm4gbV8xNmJpdDsgfQorICAgICAgICBjb25zdCBJ
bnRSZWN0JiByZWN0KCkgY29uc3QgeyByZXR1cm4gbV9yZWN0OyB9CisgICAgICAgIHVuc2lnbmVk
IGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1faGVpZ2h0OyB9CisgICAgICAgIHVuc2lnbmVkIGJ1
ZmZlcldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9idWZmZXJXaWR0aDsgfQorICAgICAgICB1bnNp
Z25lZCBpbWFnZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9pbWFnZVdpZHRoOyB9CisgICAgICAg
IFJHQkEzMkJ1ZmZlcjo6RnJhbWVTdGF0dXMgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0
dXM7IH0KKyAgICAgICAgdW5zaWduZWQgZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtX2R1cmF0
aW9uOyB9CisgICAgICAgIGJvb2wgaGFzQWxwaGEoKSBjb25zdCB7IHJldHVybiBtX2hhc0FscGhh
OyB9CisgICAgICAgIHVuc2lnbmVkIHRvdGFsQnl0ZXMoKSBjb25zdCB7IHJldHVybiBtX2J1ZmZl
cldpZHRoICogbV9leHBlY3RlZEhlaWdodCA8PCAobV8xNmJpdCA/IDEgOiAyKTsgfQorCisgICAg
ICAgIHZvaWQgc2V0Q2FuRnJlZUJ1ZmZlcihib29sIGNhbik7CisgICAgICAgIGJvb2wgc2V0U2l6
ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgaXMxNmJpdCkKKyAgICAgICAgeworICAgICAg
ICAgICAgbV8xNmJpdCA9IGlzMTZiaXQ7CisgICAgICAgICAgICBtX2ltYWdlV2lkdGggPSB3aWR0
aDsKKyAgICAgICAgICAgIG1fZXhwZWN0ZWRIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICBy
ZXR1cm4gYWxsb2NhdGVCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldFJlY3Qo
Y29uc3QgSW50UmVjdCYgcikgeyBtX3JlY3QgPSByOyB9CisgICAgICAgIHZvaWQgZW5zdXJlSGVp
Z2h0KGludCByb3dJbmRleCk7CisgICAgICAgIHZvaWQgc2V0U3RhdHVzKFJHQkEzMkJ1ZmZlcjo6
RnJhbWVTdGF0dXMgcykgeyBtX3N0YXR1cyA9IHM7IH0KKyAgICAgICAgdm9pZCBzZXREdXJhdGlv
bih1bnNpZ25lZCBkdXJhdGlvbikgeyBtX2R1cmF0aW9uID0gZHVyYXRpb247IH0KKyAgICAgICAg
dm9pZCBzZXRIYXNBbHBoYShib29sIGFscGhhKSB7IG1faGFzQWxwaGEgPSBhbHBoYTsgfQorICAg
ICAgICBib29sIHVzZXNUcmFuc3BhcmVudENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV91c2VzVHJh
bnNwYXJlbnRDb2xvcjsgfQorICAgICAgICB1bnNpZ25lZCBzaG9ydCB0cmFuc3BhcmVudENvbG9y
KCkgY29uc3QgeyByZXR1cm4gbV90cmFuc3BhcmVudENvbG9yOyB9CisgICAgICAgIHZvaWQgc2V0
VHJhbnNwYXJlbnRDb2xvcih1bnNpZ25lZCBzaG9ydCBjb2xvcikKKyAgICAgICAgeworICAgICAg
ICAgICAgbV90cmFuc3BhcmVudENvbG9yID0gY29sb3I7CisgICAgICAgICAgICBtX3VzZXNUcmFu
c3BhcmVudENvbG9yID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNsZWFyVHJhbnNw
YXJlbnRDb2xvcigpIHsgbV91c2VzVHJhbnNwYXJlbnRDb2xvciA9IGZhbHNlOyB9CisgICAgICAg
IFJHQkEzMkJ1ZmZlcjo6RnJhbWVEaXNwb3NhbE1ldGhvZCBkaXNwb3NhbE1ldGhvZCgpIGNvbnN0
IHsgcmV0dXJuIG1fZGlzcG9zYWxNZXRob2Q7IH0KKyAgICAgICAgdm9pZCBzZXREaXNwb3NhbE1l
dGhvZChSR0JBMzJCdWZmZXI6OkZyYW1lRGlzcG9zYWxNZXRob2QgbWV0aG9kKSB7IG1fZGlzcG9z
YWxNZXRob2QgPSBtZXRob2Q7IH0KKyAgICAgICAgYm9vbCBjb21wb3NpdGVkV2l0aFByZXZpb3Vz
RnJhbWUoKSBjb25zdCB7IHJldHVybiBtX2NvbXBvc2l0ZWRXaXRoUHJldmlvdXNGcmFtZTsgfQor
ICAgICAgICB2b2lkIHNldENvbXBvc2l0ZWRXaXRoUHJldmlvdXNGcmFtZSgpIHsgbV9jb21wb3Np
dGVkV2l0aFByZXZpb3VzRnJhbWUgPSB0cnVlOyB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgc2V0
UkdCQSh1bnNpZ25lZCYgcG9zLCB1bnNpZ25lZCByLCB1bnNpZ25lZCBnLCB1bnNpZ25lZCBiLCB1
bnNpZ25lZCBhKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBzdG9yZSB0aGlzIGRhdGEg
cHJlLW11bHRpcGxpZWQuCisgICAgICAgICAgICBpZiAoIWEpCisgICAgICAgICAgICAgICAgcG9z
ID0gKHIgPDwgMTYgfCBnIDw8IDggfCBiKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAg
ICAgICAgIGlmIChhIDwgMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhUGVy
Y2VudCA9IGEgLyAyNTUuMGY7CisgICAgICAgICAgICAgICAgICAgIHIgPSBzdGF0aWNfY2FzdDx1
bnNpZ25lZD4ociAqIGFscGhhUGVyY2VudCk7CisgICAgICAgICAgICAgICAgICAgIGcgPSBzdGF0
aWNfY2FzdDx1bnNpZ25lZD4oZyAqIGFscGhhUGVyY2VudCk7CisgICAgICAgICAgICAgICAgICAg
IGIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYiAqIGFscGhhUGVyY2VudCk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIHBvcyA9IChhIDw8IDI0IHwgciA8PCAxNiB8IGcgPDwg
OCB8IGIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQg
c2V0UkdCMTYodW5zaWduZWQgc2hvcnQmIHBvcywgdW5zaWduZWQgciwgdW5zaWduZWQgZywgdW5z
aWduZWQgYikKKyAgICAgICAgeworI2lmIElNQUdFX05PX0FMUEhBX1VTRV9SR0I1NTUKKyAgICAg
ICAgICAgIHBvcyA9IHVuc2lnbmVkIHNob3J0KChyID4+IDMgPDwgMTApIHwgKGcgPj4gMyA8PCA1
KSB8IChiID4+IDMpKTsKKyNlbHNlCisgICAgICAgICAgICBwb3MgPSB1bnNpZ25lZCBzaG9ydCgo
ciA+PiAzIDw8IDExKSB8IChnID4+IDIgPDwgNSkgfCAoYiA+PiAzKSk7CisjZW5kaWYKKyAgICAg
ICAgfQorCisgICAgICAgIHN0YXRpYyBJbWFnZUZyYW1lU2luayogY3JlYXRlSW5zdGFuY2UoYm9v
bCBjYW5GcmVlQnVmZmVyKTsKKyAgICAgICAgc3RhdGljIHZvaWQgZGVsZXRlSW5zdGFuY2UoSW1h
Z2VGcmFtZVNpbmsqKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgSW50UmVjdCBtX3JlY3Q7
ICAgIC8vIFRoZSByZWN0IG9mIHRoZSBvcmlnaW5hbCBzcGVjaWZpZWQgZnJhbWUgd2l0aGluIHRo
ZSBvdmVyYWxsIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2ls
bCBhbHdheXMganVzdCBiZSB0aGUgZW50aXJlIGJ1ZmZlciBleGNlcHQgZm9yIEdJRiBmcmFtZXMK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdob3NlIG9yaWdpbmFsIHJlY3Qgd2FzIHNt
YWxsZXIgdGhhbiB0aGUgb3ZlcmFsbCBpbWFnZSBzaXplLgorICAgICAgICBpbnQgbV9pbWFnZVdp
ZHRoOworICAgICAgICBpbnQgbV9idWZmZXJXaWR0aDsKKyAgICAgICAgaW50IG1faGVpZ2h0OyAv
LyBUaGUgaGVpZ2h0ICh0aGUgbnVtYmVyIG9mIHJvd3Mgd2UndmUgZnVsbHkgZGVjb2RlZCkuCisg
ICAgICAgIGludCBtX2V4cGVjdGVkSGVpZ2h0OworICAgICAgICBSR0JBMzJCdWZmZXI6OkZyYW1l
U3RhdHVzIG1fc3RhdHVzOyAvLyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZyYW1lIGlzIGNvbXBsZXRl
bHkgZmluaXNoZWQgZGVjb2RpbmcuCisgICAgICAgIFJHQkEzMkJ1ZmZlcjo6RnJhbWVEaXNwb3Nh
bE1ldGhvZCBtX2Rpc3Bvc2FsTWV0aG9kOyAvLyBXaGF0IHRvIGRvIHdpdGggdGhpcyBmcmFtZSdz
IGRhdGEgd2hlbiBpbml0aWFsaXppbmcgdGhlIG5leHQgZnJhbWUuCisgICAgICAgIHVuc2lnbmVk
IG1fZHVyYXRpb247IC8vIFRoZSBhbmltYXRpb24gZGVsYXkuCisgICAgICAgIHVuc2lnbmVkIHNo
b3J0IG1fdHJhbnNwYXJlbnRDb2xvcjsgLy8gcGl4ZWwgdmFsdWUKKyAgICAgICAgYm9vbCBtX3Vz
ZXNUcmFuc3BhcmVudENvbG9yOworICAgICAgICBib29sIG1faGFzQWxwaGE7IC8vIFdoZXRoZXIg
b3Igbm90IGFueSBvZiB0aGUgcGl4ZWxzIGluIHRoZSBidWZmZXIgaGF2ZSB0cmFuc3BhcmVuY3ku
CisgICAgICAgIGJvb2wgbV9jYW5GcmVlQnVmZmVyOworICAgICAgICBib29sIG1fc2hvdWxkRnJl
ZUJ1ZmZlcjsKKyAgICAgICAgYm9vbCBtXzE2Yml0OworICAgICAgICBib29sIG1fY29tcG9zaXRl
ZFdpdGhQcmV2aW91c0ZyYW1lOworI2lmIFBMQVRGT1JNKFdJTkNFKQorICAgICAgICBSZWZQdHI8
U2hhcmVkQml0bWFwPiBtX2JtcDsKKyAgICAgICAgdm9pZCBmaW5pc2hCaXRtYXAoKTsKKyNlbmRp
ZgorICAgIH07CisKK30KKworI2VuZGlmIC8vIElNQUdFX0ZSQU1FX1NJTktfSF8KZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VGcmFtZVNpbmtXaW5jZS5j
cHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5rV2luY2Uu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzRmOTgKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlRnJhbWVTaW5r
V2luY2UuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIw
MDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
KyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZUZyYW1lU2luay5oIgorCisjaW5jbHVk
ZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2lmIElNQUdFX05PX0FM
UEhBX1VTRV9SR0I1NTUKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY29udmVydDE2VG9SR0IodW5z
aWduZWQgc2hvcnQgcGl4ZWwpCit7CisgICAgdW5zaWduZWQgciA9IChwaXhlbCA+PiA3KSAmIDB4
Rjg7CisgICAgdW5zaWduZWQgZyA9IChwaXhlbCA+PiAyKSAmIDB4Rjg7CisgICAgdW5zaWduZWQg
YiA9IChwaXhlbCA8PCAzKSAmIDB4Rjg7CisgICAgcmV0dXJuIFJHQihyLCBnLCBiKTsKK30KKyNl
bHNlIC8vIFJHQjU2NQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjb252ZXJ0MTZUb1JHQih1bnNp
Z25lZCBzaG9ydCBwaXhlbCkKK3sKKyAgICB1bnNpZ25lZCByID0gKHBpeGVsID4+IDgpICYgMHhG
ODsKKyAgICB1bnNpZ25lZCBnID0gKHBpeGVsID4+IDMpICYgMHhGQzsKKyAgICB1bnNpZ25lZCBi
ID0gKHBpeGVsIDw8IDMpICYgMHhGODsKKyAgICByZXR1cm4gUkdCKHIsIGcsIGIpOworfQorI2Vu
ZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3Qgdm9pZCogSW1hZ2VGcmFtZVNpbms6
OmJ5dGVzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9ibXAgPyBtX2JtcC0+Ynl0ZXMoKSA6IDA7
Cit9CisKK3ZvaWQqIEltYWdlRnJhbWVTaW5rOjpieXRlcygpCit7CisgICAgcmV0dXJuIG1fYm1w
ID8gbV9ibXAtPmJ5dGVzKCkgOiAwOworfQorCitib29sIEltYWdlRnJhbWVTaW5rOjphbGxvY2F0
ZUJ1ZmZlcigpCit7CisgICAgZnJlZUJ1ZmZlcigpOworCisgICAgaWYgKG1faW1hZ2VXaWR0aCA8
PSAwIHx8IG1fZXhwZWN0ZWRIZWlnaHQgPD0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgaWYgKG1fMTZiaXQpIHsKKyAgICAgICAgbV9idWZmZXJXaWR0aCA9IG1faW1hZ2VXaWR0aCA+
PiAxIDw8IDE7CisgICAgICAgIGlmIChtX2J1ZmZlcldpZHRoICE9IG1faW1hZ2VXaWR0aCkKKyAg
ICAgICAgICAgIG1fYnVmZmVyV2lkdGggKz0gMjsKKyAgICB9IGVsc2UKKyAgICAgICAgbV9idWZm
ZXJXaWR0aCA9IG1faW1hZ2VXaWR0aDsKKworICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNh
bkZhaWw7CisKKyAgICBpZiAobV9ibXAgPSBTaGFyZWRCaXRtYXA6OmNyZWF0ZUluc3RhbmNlKG1f
MTZiaXQsIG1faW1hZ2VXaWR0aCwgbV9leHBlY3RlZEhlaWdodCwgdHJ1ZSkpIHsKKyAgICAgICAg
bV9ibXAtPmxvY2soKTsKKyAgICAgICAgbV9ibXAtPnNldFZhbGlkSGVpZ2h0KDApOworICAgICAg
ICBpZiAobV8xNmJpdCAmJiBtX3VzZXNUcmFuc3BhcmVudENvbG9yICYmICFtX2JtcC0+dXNlc1Ry
YW5zcGFyZW50Q29sb3IoKSkKKyAgICAgICAgICAgIG1fYm1wLT5zZXRUcmFuc3BhcmVudENvbG9y
KGNvbnZlcnQxNlRvUkdCKG1fdHJhbnNwYXJlbnRDb2xvcikpOworICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSW1hZ2VGcmFtZVNpbms6
OmlzQnVmZmVyUmVhZHkoKSBjb25zdCB7IHJldHVybiAhIW1fYm1wOyB9Cit2b2lkIEltYWdlRnJh
bWVTaW5rOjpmcmVlQnVmZmVyKCkKK3sKKyAgICBpZiAobV9ibXApIHsKKyAgICAgICAgaWYgKCFt
X2JtcC0+aGFzT25lUmVmKCkpCisgICAgICAgICAgICBmaW5pc2hCaXRtYXAoKTsKKyAgICAgICAg
bV9ibXAgPSAwOworICAgIH0KK30KKworTmF0aXZlSW1hZ2VQdHIgSW1hZ2VGcmFtZVNpbms6Omdl
dEZyYW1lKCkKK3sKKyAgICBpZiAobV9zdGF0dXMgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUVtcHR5
IHx8ICFtX2JtcCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtX2JtcC0+c2V0SGFzQWxwaGEo
aGFzQWxwaGEoKSk7CisgICAgbV9zaG91bGRGcmVlQnVmZmVyID0gbV9zdGF0dXMgPT0gUkdCQTMy
QnVmZmVyOjpGcmFtZUNvbXBsZXRlOworICAgIGlmIChtX2NhbkZyZWVCdWZmZXIgJiYgbV9zaG91
bGRGcmVlQnVmZmVyKQorICAgICAgICBmaW5pc2hCaXRtYXAoKTsKKworICAgIHJldHVybiBtX2Jt
cDsKK30KKwordm9pZCBJbWFnZUZyYW1lU2luazo6c2V0Q2FuRnJlZUJ1ZmZlcihib29sIGNhbikK
K3sKKyAgICBtX2NhbkZyZWVCdWZmZXIgPSBjYW47CisgICAgaWYgKG1fY2FuRnJlZUJ1ZmZlciAm
JiBtX3Nob3VsZEZyZWVCdWZmZXIpCisgICAgICAgIGZpbmlzaEJpdG1hcCgpOworfQorCit2b2lk
IEltYWdlRnJhbWVTaW5rOjpmaW5pc2hCaXRtYXAoKQoreworICAgIGlmIChtX2JtcCAmJiBtX2Jt
cC0+bG9ja2VkKCkpIHsKKyAgICAgICAgbV9ibXAtPnVubG9jaygpOworICAgICAgICBpZiAobV91
c2VzVHJhbnNwYXJlbnRDb2xvcikKKyAgICAgICAgICAgIG1fYm1wLT5zZXRUcmFuc3BhcmVudENv
bG9yKGNvbnZlcnQxNlRvUkdCKG1fdHJhbnNwYXJlbnRDb2xvcikpOworICAgICAgICBpZiAoIW1f
MTZiaXQgJiYgKCFtX2hhc0FscGhhIHx8IG1fdXNlc1RyYW5zcGFyZW50Q29sb3IpKSB7CisgICAg
ICAgICAgICBtX2JtcC0+c2V0SGFzQWxwaGEoZmFsc2UpOworICAgICAgICAgICAgbV8xNmJpdCA9
IG1fYm1wLT50bzE2Yml0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fMTZiaXQpCisgICAg
ICAgICAgICBzZXRIYXNBbHBoYShmYWxzZSk7CisgICAgICAgIG1fYm1wLT5zZXRIYXNBbHBoYSho
YXNBbHBoYSgpKTsKKyAgICB9Cit9OworCit2b2lkIEltYWdlRnJhbWVTaW5rOjplbnN1cmVIZWln
aHQoaW50IHJvd0luZGV4KQoreworICAgIGlmIChyb3dJbmRleCA+IG1faGVpZ2h0KSB7CisgICAg
ICAgIG1faGVpZ2h0ID0gcm93SW5kZXg7CisgICAgICAgIGlmIChtX2JtcCkKKyAgICAgICAgICAg
IG1fYm1wLT5zZXRWYWxpZEhlaWdodChtX2hlaWdodCk7CisgICAgfQorfQorCitJbWFnZUZyYW1l
U2luayogSW1hZ2VGcmFtZVNpbms6OmNyZWF0ZUluc3RhbmNlKGJvb2wgY2FuRnJlZUJ1ZmZlcikK
K3sKKyAgICByZXR1cm4gbmV3IEltYWdlRnJhbWVTaW5rKGNhbkZyZWVCdWZmZXIpOworfQorCit2
b2lkIEltYWdlRnJhbWVTaW5rOjpkZWxldGVJbnN0YW5jZShJbWFnZUZyYW1lU2luayogaSkKK3sK
KyAgICBkZWxldGUgaTsKK30KKworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34396</attachid>
            <date>2009-08-08 13:40:48 -0700</date>
            <delta_ts>2009-08-11 09:45:14 -0700</delta_ts>
            <desc>5) MediaPlayer</desc>
            <filename>27511_5.patch</filename>
            <type>text/plain</type>
            <size>12047</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uMmZhY2RhOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IE1lZGlhUGxheWVyUHJveHkgYW5kIE1lZGlhUGxh
eWVyUHJpdmF0ZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9Mjc1MTEKKworICAgICAgICBXcml0dGVuIGJ5IENyeXN0YWwgWmhhbmcgPGNyeXN0YWwuemhh
bmdAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2Uv
TWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcm94eS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJveHkuaDogQWRkZWQuCisKIDIwMDktMDgt
MDYgIFlvbmcgTGkgIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4KIAogICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi5mZjM4YWRhCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9NZWRpYVBsYXllclByaXZhdGVXaW5jZS5oCkBAIC0wLDAgKzEs
MTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIE1lZGlhUGxheWVyUHJp
dmF0ZVdpbmNlX2gKKyNkZWZpbmUgTWVkaWFQbGF5ZXJQcml2YXRlV2luY2VfaAorCisjaWYgRU5B
QkxFKFZJREVPKQorCisjaW5jbHVkZSAiTWVkaWFQbGF5ZXJQcml2YXRlLmgiCisjaW5jbHVkZSAi
VGltZXIuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworICAgIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKKyAgICBjbGFzcyBJbnRTaXplOworICAgIGNs
YXNzIEludFJlY3Q7CisgICAgY2xhc3MgU3RyaW5nOworCisgICAgY2xhc3MgTWVkaWFQbGF5ZXJQ
cml2YXRlIDogcHVibGljIE1lZGlhUGxheWVyUHJpdmF0ZUludGVyZmFjZSB7CisgICAgcHVibGlj
OgorICAgICAgICBzdGF0aWMgdm9pZCByZWdpc3Rlck1lZGlhRW5naW5lKE1lZGlhRW5naW5lUmVn
aXN0cmFyKTsKKworICAgICAgICB+TWVkaWFQbGF5ZXJQcml2YXRlKCk7CisKKyAgICAgICAgSW50
U2l6ZSBuYXR1cmFsU2l6ZSgpIGNvbnN0OworICAgICAgICBib29sIGhhc1ZpZGVvKCkgY29uc3Q7
CisKKyAgICAgICAgdm9pZCBsb2FkKGNvbnN0IFN0cmluZyYgdXJsKTsKKyAgICAgICAgdm9pZCBj
YW5jZWxMb2FkKCk7CisKKyAgICAgICAgdm9pZCBwbGF5KCk7CisgICAgICAgIHZvaWQgcGF1c2Uo
KTsKKworICAgICAgICBib29sIHBhdXNlZCgpIGNvbnN0OworICAgICAgICBib29sIHNlZWtpbmco
KSBjb25zdDsKKworICAgICAgICBmbG9hdCBkdXJhdGlvbigpIGNvbnN0OworICAgICAgICBmbG9h
dCBjdXJyZW50VGltZSgpIGNvbnN0OworICAgICAgICB2b2lkIHNlZWsoZmxvYXQgdGltZSk7Cisg
ICAgICAgIHZvaWQgc2V0RW5kVGltZShmbG9hdCk7CisKKyAgICAgICAgdm9pZCBzZXRSYXRlKGZs
b2F0KTsKKyAgICAgICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQpOworCisgICAgICAgIGludCBkYXRh
UmF0ZSgpIGNvbnN0OworCisgICAgICAgIE1lZGlhUGxheWVyOjpOZXR3b3JrU3RhdGUgbmV0d29y
a1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9uZXR3b3JrU3RhdGU7IH0KKyAgICAgICAgTWVkaWFQ
bGF5ZXI6OlJlYWR5U3RhdGUgcmVhZHlTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcmVhZHlTdGF0
ZTsgfQorCisgICAgICAgIGZsb2F0IG1heFRpbWVCdWZmZXJlZCgpIGNvbnN0OworICAgICAgICBm
bG9hdCBtYXhUaW1lU2Vla2FibGUoKSBjb25zdDsKKyAgICAgICAgdW5zaWduZWQgYnl0ZXNMb2Fk
ZWQoKSBjb25zdDsKKyAgICAgICAgYm9vbCB0b3RhbEJ5dGVzS25vd24oKSBjb25zdDsKKyAgICAg
ICAgdW5zaWduZWQgdG90YWxCeXRlcygpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0VmlzaWJs
ZShib29sKTsKKyAgICAgICAgdm9pZCBzZXRTaXplKGNvbnN0IEludFNpemUmKTsKKworICAgICAg
ICB2b2lkIGxvYWRTdGF0ZUNoYW5nZWQoKTsKKyAgICAgICAgdm9pZCBkaWRFbmQoKTsKKworICAg
ICAgICB2b2lkIHBhaW50KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsKKworICAg
IHByaXZhdGU6CisgICAgICAgIE1lZGlhUGxheWVyUHJpdmF0ZShNZWRpYVBsYXllciopOworCisg
ICAgICAgIHZvaWQgdXBkYXRlU3RhdGVzKCk7CisgICAgICAgIHZvaWQgZG9TZWVrKCk7CisgICAg
ICAgIHZvaWQgY2FuY2VsU2VlaygpOworICAgICAgICB2b2lkIHNlZWtUaW1lckZpcmVkKFRpbWVy
PE1lZGlhUGxheWVyUHJpdmF0ZT4qKTsKKyAgICAgICAgZmxvYXQgbWF4VGltZUxvYWRlZCgpIGNv
bnN0OworICAgICAgICB2b2lkIHNhd1Vuc3VwcG9ydGVkVHJhY2tzKCk7CisjaWYgRU5BQkxFKFBM
VUdJTl9QUk9YWV9GT1JfVklERU8pCisgICAgICAgIHZvaWQgc2V0TWVkaWFQbGF5ZXJQcm94eShX
ZWJNZWRpYVBsYXllclByb3h5Kik7CisgICAgICAgIHZvaWQgc2V0UG9zdGVyKGNvbnN0IFN0cmlu
ZyYgdXJsKTsKKyAgICAgICAgdm9pZCBkZWxpdmVyTm90aWZpY2F0aW9uKE1lZGlhUGxheWVyUHJv
eHlOb3RpZmljYXRpb25UeXBlKTsKKyNlbmRpZgorCisgICAgICAgIC8vIGVuZ2luZSBzdXBwb3J0
CisgICAgICAgIHN0YXRpYyBNZWRpYVBsYXllclByaXZhdGVJbnRlcmZhY2UqIGNyZWF0ZShNZWRp
YVBsYXllciopOworICAgICAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWRUeXBlcyhIYXNoU2V0
PFN0cmluZz4mIHR5cGVzKTsKKyAgICAgICAgc3RhdGljIE1lZGlhUGxheWVyOjpTdXBwb3J0c1R5
cGUgc3VwcG9ydHNUeXBlKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBjb2RlY3Mp
OworICAgICAgICBzdGF0aWMgYm9vbCBpc0F2YWlsYWJsZSgpOworCisgICAgICAgIE1lZGlhUGxh
eWVyKiBtX3BsYXllcjsKKyAgICAgICAgZmxvYXQgbV9zZWVrVG87CisgICAgICAgIGZsb2F0IG1f
ZW5kVGltZTsKKyAgICAgICAgVGltZXI8TWVkaWFQbGF5ZXJQcml2YXRlPiBtX3NlZWtUaW1lcjsK
KyAgICAgICAgTWVkaWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBtX25ldHdvcmtTdGF0ZTsKKyAgICAg
ICAgTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgbV9yZWFkeVN0YXRlOworICAgICAgICB1bnNpZ25l
ZCBtX2VuYWJsZWRUcmFja0NvdW50OworICAgICAgICB1bnNpZ25lZCBtX3RvdGFsVHJhY2tDb3Vu
dDsKKyAgICAgICAgYm9vbCBtX2hhc1Vuc3VwcG9ydGVkVHJhY2tzOworICAgICAgICBib29sIG1f
c3RhcnRlZFBsYXlpbmc7CisgICAgICAgIGJvb2wgbV9pc1N0cmVhbWluZzsKKyNpZiBFTkFCTEUo
UExVR0lOX1BST1hZX0ZPUl9WSURFTykKKyAgICAgICAgV2ViTWVkaWFQbGF5ZXJQcm94eSogbV9w
cm94eTsKKyNlbmRpZgorICAgIH07CisKK30KKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9NZWRpYVBsYXllclByb3h5LmNwcCBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcm94eS5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5MmQ0MAotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcm94eS5jcHAK
QEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxl
LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor
ICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZiBFTkFCTEUoVklERU8p
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXllclByb3h5LmgiCisK
KyNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgorI2luY2x1ZGUgIkhUTUxQbHVnSW5FbGVtZW50
LmgiCisjaW5jbHVkZSAiSFRNTFZpZGVvRWxlbWVudC5oIgorI2luY2x1ZGUgIkpTRE9NQmluZGlu
Zy5oIgorI2luY2x1ZGUgIkpTUGx1Z2luRWxlbWVudEZ1bmN0aW9ucy5oIgorI2luY2x1ZGUgIk1l
ZGlhUGxheWVyLmgiCisjaW5jbHVkZSAiTm9kZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5n
LmgiCisjaW5jbHVkZSAiUGx1Z2luVmlldy5oIgorI2luY2x1ZGUgIlJlbmRlclBhcnRPYmplY3Qu
aCIKKyNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIKKyNpbmNsdWRlICJXaWRnZXQuaCIKKyNpbmNs
dWRlICJjX2NsYXNzLmgiCisjaW5jbHVkZSAiY19pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNfcnVu
dGltZS5oIgorI2luY2x1ZGUgIm5wcnVudGltZV9pbXBsLmgiCisjaW5jbHVkZSAicnVudGltZS5o
IgorI2luY2x1ZGUgPHJ1bnRpbWUvSWRlbnRpZmllci5oPgorCit1c2luZyBuYW1lc3BhY2UgSlND
OworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgQmluZGluZ3M7Cit1c2lu
ZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCitXZWJNZWRpYVBsYXllclByb3h5OjpXZWJNZWRpYVBs
YXllclByb3h5KE1lZGlhUGxheWVyKiBwbGF5ZXIpCis6IG1fbWVkaWFQbGF5ZXIocGxheWVyKQor
LCBtX2luaXQoZmFsc2UpCissIG1faGFzU2VudFJlc3BvbnNlVG9QbHVnaW4oZmFsc2UpCit7Cisg
ICAgaWYgKCFtX2luaXQpCisgICAgICAgIGluaXRFbmdpbmUoKTsKK30KKworV2ViTWVkaWFQbGF5
ZXJQcm94eTo6fldlYk1lZGlhUGxheWVyUHJveHkoKQoreworICAgIG1faW5zdGFuY2UucmVsZWFz
ZSgpOworfQorU2NyaXB0SW5zdGFuY2UgV2ViTWVkaWFQbGF5ZXJQcm94eTo6cGx1Z2luSW5zdGFu
Y2UoKQoreworICAgIGlmICghbV9pbnN0YW5jZSkgeworICAgICAgICBSZW5kZXJPYmplY3QqIHIg
PSBlbGVtZW50KCktPnJlbmRlcmVyKCk7CisgICAgICAgIGlmICghciB8fCAhci0+aXNXaWRnZXQo
KSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIEZyYW1lKiBmcmFtZSA9IGVsZW1l
bnQoKS0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKKworICAgICAgICBSZW5kZXJXaWRnZXQqIHJlbmRl
cldpZGdldCA9IHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KGVsZW1lbnQoKS0+cmVuZGVyZXIo
KSk7CisgICAgICAgIGlmIChyZW5kZXJXaWRnZXQgJiYgcmVuZGVyV2lkZ2V0LT53aWRnZXQoKSkK
KyAgICAgICAgICAgIG1faW5zdGFuY2UgPSBmcmFtZS0+c2NyaXB0KCktPmNyZWF0ZVNjcmlwdElu
c3RhbmNlRm9yV2lkZ2V0KHJlbmRlcldpZGdldC0+d2lkZ2V0KCkpOworICAgIH0KKworICAgIHJl
dHVybiBtX2luc3RhbmNlOworfQordm9pZCBXZWJNZWRpYVBsYXllclByb3h5Ojpsb2FkKGNvbnN0
IFN0cmluZyYgdXJsKQoreworICAgIGlmICghbV9pbml0KQorICAgICAgICBpbml0RW5naW5lKCk7
CisgICAgaWYgKG1faW5pdCkKKyAgICAgICAgaW52b2tlTWV0aG9kKCJwbGF5Iik7Cit9Cit2b2lk
IFdlYk1lZGlhUGxheWVyUHJveHk6OmluaXRFbmdpbmUoKQoreworICAgIEhUTUxNZWRpYUVsZW1l
bnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MTWVkaWFFbGVtZW50Kj4obV9tZWRpYVBsYXll
ci0+bWVkaWFQbGF5ZXJDbGllbnQoKSk7CisgICAgVmVjdG9yPFN0cmluZz4gcGFyYW1OYW1lczsK
KyAgICBWZWN0b3I8U3RyaW5nPiBwYXJhbVZhbHVlczsKKyAgICBTdHJpbmcgc2VydmljZVR5cGU7
CisgICAgU3RyaW5nIHVybCA9IGVsZW1lbnQtPmluaXRpYWxVUkwoKTsKKworICAgIGlmICh1cmwu
aXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBGcmFtZSogZnJhbWUgPSBlbGVtZW50
LT5kb2N1bWVudCgpLT5mcmFtZSgpOworCisgICAgLy8gYWRkIGFsbCBhdHRyaWJ1dGVzIHNldCBv
biB0aGUgZW1iZWQgb2JqZWN0CisgICAgTmFtZWROb2RlTWFwKiBhID0gZWxlbWVudC0+YXR0cmli
dXRlcygpOworICAgIGlmIChhKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBh
LT5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUqIGl0ID0gYS0+YXR0cmli
dXRlSXRlbShpKTsKKyAgICAgICAgICAgIHBhcmFtTmFtZXMuYXBwZW5kKGl0LT5uYW1lKCkubG9j
YWxOYW1lKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYXBwZW5kKGl0LT52
YWx1ZSgpLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZXJ2aWNlVHlwZSA9ICJh
cHBsaWNhdGlvbi94LW1wbGF5ZXIyIjsKKyAgICBmcmFtZS0+bG9hZGVyKCktPnJlcXVlc3RPYmpl
Y3Qoc3RhdGljX2Nhc3Q8UmVuZGVyUGFydE9iamVjdCo+KGVsZW1lbnQtPnJlbmRlcmVyKCkpLCB1
cmwsIG51bGxBdG9tLCBzZXJ2aWNlVHlwZSwgcGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMpOworICAg
IG1faW5pdCA9IHRydWU7CisgICAgcGFyYW1OYW1lcy5jbGVhcigpOworICAgIHBhcmFtVmFsdWVz
LmNsZWFyKCk7CisKK30KKworSFRNTE1lZGlhRWxlbWVudCogV2ViTWVkaWFQbGF5ZXJQcm94eTo6
ZWxlbWVudCgpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1lbnQqPiht
X21lZGlhUGxheWVyLT5tZWRpYVBsYXllckNsaWVudCgpKTsKKworfQorCit2b2lkIFdlYk1lZGlh
UGxheWVyUHJveHk6Omludm9rZU1ldGhvZChjb25zdCBTdHJpbmcmIG1ldGhvZE5hbWUpCit7Cisg
ICAgRnJhbWUqIGZyYW1lID0gZWxlbWVudCgpLT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAgIFJv
b3RPYmplY3QgKnJvb3QgPSBmcmFtZS0+c2NyaXB0KCktPmJpbmRpbmdSb290T2JqZWN0KCk7Cisg
ICAgaWYgKCFyb290KQorICAgICAgICByZXR1cm47CisgICAgRXhlY1N0YXRlICpleGVjID0gcm9v
dC0+Z2xvYmFsT2JqZWN0KCktPmdsb2JhbEV4ZWMoKTsKKyAgICBJbnN0YW5jZSogaW5zdGFuY2Ug
PSBwbHVnaW5JbnN0YW5jZSgpLmdldCgpOworICAgIGlmICghaW5zdGFuY2UpCisgICAgICAgIHJl
dHVybjsKKworICAgIGluc3RhbmNlLT5iZWdpbigpOworICAgIENsYXNzICphQ2xhc3MgPSBpbnN0
YW5jZS0+Z2V0Q2xhc3MoKTsKKyAgICBJZGVudGlmaWVyIGlkZW4oZXhlYywgbWV0aG9kTmFtZSk7
CisgICAgTWV0aG9kTGlzdCBtZXRob2RMaXN0ID0gYUNsYXNzLT5tZXRob2RzTmFtZWQoaWRlbiwg
aW5zdGFuY2UpOworICAgIEFyZ0xpc3QgYXJnczsKKyAgICAvKkpTVmFsdWVQdHIgcmVzdWx0ID0q
LworICAgIGluc3RhbmNlLT5pbnZva2VNZXRob2QoZXhlYywgbWV0aG9kTGlzdCAsIGFyZ3MpOwor
ICAgIGluc3RhbmNlLT5lbmQoKTsKK30KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcm94eS5oIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW5jZS9NZWRpYVBsYXllclByb3h5LmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2ZWQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcm94eS5oCkBAIC0wLDAgKzEsNzAg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBNZWRpYVBsYXllclByb3h5X2gKKyNk
ZWZpbmUgTWVkaWFQbGF5ZXJQcm94eV9oCisKKyNpbmNsdWRlICJTY3JpcHRJbnN0YW5jZS5oIgor
CisjaWYgRU5BQkxFKFZJREVPKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBJ
bnRSZWN0OworICAgIGNsYXNzIEludFNpemU7CisgICAgY2xhc3MgU3RyaW5nOworICAgIGNsYXNz
IE1lZGlhUGxheWVyOworICAgIGNsYXNzIFBsdWdpblZpZXc7CisgICAgY2xhc3MgSFRNTE1lZGlh
RWxlbWVudDsKKworICAgIGVudW0gTWVkaWFQbGF5ZXJQcm94eU5vdGlmaWNhdGlvblR5cGUgewor
ICAgICAgICBNZWRpYVBsYXllck5vdGlmaWNhdGlvblBsYXlQYXVzZUJ1dHRvblByZXNzZWQsCisg
ICAgICAgIElkbGUsCisgICAgICAgIExvYWRpbmcsCisgICAgICAgIExvYWRlZCwKKyAgICAgICAg
Rm9ybWF0RXJyb3IsCisgICAgICAgIE5ldHdvcmtFcnJvciwKKyAgICAgICAgRGVjb2RlRXJyb3IK
KyAgICB9OworCisgICAgY2xhc3MgV2ViTWVkaWFQbGF5ZXJQcm94eSB7CisgICAgcHVibGljOgor
ICAgICAgICBXZWJNZWRpYVBsYXllclByb3h5KE1lZGlhUGxheWVyKiBwbGF5ZXIpOworICAgICAg
ICB+V2ViTWVkaWFQbGF5ZXJQcm94eSgpOworCisgICAgICAgIE1lZGlhUGxheWVyKiBtZWRpYVBs
YXllcigpIHtyZXR1cm4gbV9tZWRpYVBsYXllcjt9CisgICAgICAgIHZvaWQgaW5pdEVuZ2luZSgp
OworICAgICAgICB2b2lkIGxvYWQoY29uc3QgU3RyaW5nJiB1cmwpOworICAgICAgICBIVE1MTWVk
aWFFbGVtZW50KiBlbGVtZW50KCk7CisgICAgICAgIHZvaWQgaW52b2tlTWV0aG9kKGNvbnN0IFN0
cmluZyYgbWV0aG9kTmFtZSk7CisgICAgICAgIFNjcmlwdEluc3RhbmNlIHBsdWdpbkluc3RhbmNl
KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBNZWRpYVBsYXllciogbV9tZWRpYVBsYXllcjsK
KyAgICAgICAgYm9vbCBtX2luaXQ7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXcqIG1fcGx1
Z2luVmlldzsKKyAgICAgICAgYm9vbCBtX2hhc1NlbnRSZXNwb25zZVRvUGx1Z2luOworICAgICAg
ICBTY3JpcHRJbnN0YW5jZSBtX2luc3RhbmNlOworICAgIH07CisKK30KKyNlbmRpZiAvLyBFTkFC
TEUoVklERU8pCisKKyNlbmRpZgo=
</data>
<flag name="review"
          id="18577"
          type_id="1"
          status="-"
          setter="staikos"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34398</attachid>
            <date>2009-08-08 13:47:12 -0700</date>
            <delta_ts>2009-08-11 14:31:15 -0700</delta_ts>
            <desc>6) Path PlatformPath</desc>
            <filename>27511_6.patch</filename>
            <type>text/plain</type>
            <size>36367</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uYzgwMjUwNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOCBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEltcGxlbWVudCBQYXRoIGZvciBXSU5DRS4gTW9z
dCBjb2RlIGNhbiBiZSAKKyAgICAgICAgcmV1c2VkIGZvciBvdGhlciBwb3J0cyB0aGF0IGRvbid0
IGhhdmUgbmF0aXZlIHBhdGggc3VwcG9ydAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1MTEKKworICAgICAgICBBIGxvdCBvZiBjb250cmlidXRpb25z
IG1hZGUgYnkgR2VvcmdlIFN0YWlrb3MgPHN0YWlrb3NAa2RlLm9yZz4sIGVzcGVjaWFsbHkKKyAg
ICAgICAgb24gcXVhZCBjdXJ2ZSBhbmQgYmV6aWVyIGN1cnZlCisKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmg6IEFkZGVkLgorCiAy
MDA5LTA4LTA2ICBZb25nIExpICA8eW9uZy5saUB0b3JjaG1vYmlsZS5jb20+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL1BhdGhXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL1BhdGhXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
YmZkYWI5YwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvUGF0aFdpbmNlLmNwcApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMp
IDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAg
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
CisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIlBhdGguaCIKKworI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1
ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1QYXRoV2luY2UuaCIKKyNp
bmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4
LmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Bh
dGg6OlBhdGgoKQorOiBtX3BhdGgobmV3IFBsYXRmb3JtUGF0aCgpKQoreworfQorCitQYXRoOjp+
UGF0aCgpCit7CisgICAgZGVsZXRlIG1fcGF0aDsKK30KKworUGF0aDo6UGF0aChjb25zdCBQYXRo
JiBvdGhlcikKKzogbV9wYXRoKG5ldyBQbGF0Zm9ybVBhdGgoKm90aGVyLm1fcGF0aCkpCit7Cit9
CisKK1BhdGgmIFBhdGg6Om9wZXJhdG9yPShjb25zdCBQYXRoJiBvdGhlcikKK3sKKyAgICBtX3Bh
dGggPSBuZXcgUGxhdGZvcm1QYXRoKCpvdGhlci5tX3BhdGgpOworICAgIHJldHVybiAqdGhpczsK
K30KKworYm9vbCBQYXRoOjpjb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgV2luZFJ1
bGUgcnVsZSkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYXRoLT5jb250YWlucyhwb2ludCwgcnVs
ZSk7Cit9CisKK3ZvaWQgUGF0aDo6dHJhbnNsYXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sK
KyAgICBtX3BhdGgtPnRyYW5zbGF0ZShzaXplKTsKK30KKworRmxvYXRSZWN0IFBhdGg6OmJvdW5k
aW5nUmVjdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+Ym91bmRpbmdSZWN0KCk7Cit9
CisKK3ZvaWQgUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIG1f
cGF0aC0+bW92ZVRvKHBvaW50KTsKK30KKwordm9pZCBQYXRoOjphZGRMaW5lVG8oY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQpCit7CisgICAgbV9wYXRoLT5hZGRMaW5lVG8ocG9pbnQpOworfQorCit2
b2lkIFBhdGg6OmFkZFF1YWRDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNwLCBjb25zdCBGbG9h
dFBvaW50JiBwKQoreworICAgIG1fcGF0aC0+YWRkUXVhZEN1cnZlVG8oY3AsIHApOworfQorCit2
b2lkIFBhdGg6OmFkZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AxLCBjb25zdCBG
bG9hdFBvaW50JiBjcDIsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgbV9wYXRoLT5hZGRC
ZXppZXJDdXJ2ZVRvKGNwMSwgY3AyLCBwKTsKK30KKwordm9pZCBQYXRoOjphZGRBcmNUbyhjb25z
dCBGbG9hdFBvaW50JiBwMSwgY29uc3QgRmxvYXRQb2ludCYgcDIsIGZsb2F0IHJhZGl1cykKK3sK
KyAgICBtX3BhdGgtPmFkZEFyY1RvKHAxLCBwMiwgcmFkaXVzKTsKK30KKwordm9pZCBQYXRoOjpj
bG9zZVN1YnBhdGgoKQoreworICAgIG1fcGF0aC0+Y2xvc2VTdWJwYXRoKCk7Cit9CisKK3ZvaWQg
UGF0aDo6YWRkQXJjKGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0IHIsIGZsb2F0IHNhciwgZmxv
YXQgZWFyLCBib29sIGFudGljbG9ja3dpc2UpCit7CisgICAgbV9wYXRoLT5hZGRFbGxpcHNlKHAs
IHIsIHIsIHNhciwgZWFyLCBhbnRpY2xvY2t3aXNlKTsKK30KKwordm9pZCBQYXRoOjphZGRSZWN0
KGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICBtX3BhdGgtPmFkZFJlY3Qocik7Cit9CisKK3Zv
aWQgUGF0aDo6YWRkRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAgRmxvYXRTaXpl
IHJhZGl1cyhyLndpZHRoKCkgKiAwLjUsIHIuaGVpZ2h0KCkgKiAwLjUpOworICAgIG1fcGF0aC0+
YWRkRWxsaXBzZShyKTsKK30KKwordm9pZCBQYXRoOjpjbGVhcigpCit7CisgICAgbV9wYXRoLT5j
bGVhcigpOworfQorCitib29sIFBhdGg6OmlzRW1wdHkoKSBjb25zdAoreworICAgIHJldHVybiBt
X3BhdGgtPmlzRW1wdHkoKTsKK30KKworU3RyaW5nIFBhdGg6OmRlYnVnU3RyaW5nKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV9wYXRoLT5kZWJ1Z1N0cmluZygpOworfQorCit2b2lkIFBhdGg6OmFw
cGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24gZnVuY3Rpb24pIGNvbnN0Cit7Cisg
ICAgbV9wYXRoLT5hcHBseShpbmZvLCBmdW5jdGlvbik7Cit9CisKK3ZvaWQgUGF0aDo6dHJhbnNm
b3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIG1fcGF0aC0+dHJhbnNm
b3JtKHQpOworfQorCitGbG9hdFJlY3QgUGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KFN0cm9rZVN0
eWxlQXBwbGllciAqKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIEZsb2F0
UmVjdCgpOworfQorCitib29sIFBhdGg6OnN0cm9rZUNvbnRhaW5zKFN0cm9rZVN0eWxlQXBwbGll
ciosIGNvbnN0IEZsb2F0UG9pbnQmKSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cisg
ICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFBhdGg6Omhhc0N1cnJlbnRQb2ludCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuICFpc0VtcHR5KCk7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuY3BwIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4OTY0YQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuY3BwCkBAIC0wLDAg
KzEsODAzIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwg
SW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Q
YXRoV2luY2UuaCIKKworI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dC5oIgorI2luY2x1ZGUgIlBhdGguaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5o
IgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSA8d3RmL093blB0
ci5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8v
IEltcGxlbWVudGVkIGluIEdyYXBoaWNzQ29udGV4dFdpbmNlLmNwcAordm9pZCBnZXRFbGxpcHNl
UG9pbnRCeUFuZ2xlKGRvdWJsZSBhbmdsZSwgZG91YmxlIGEsIGRvdWJsZSBiLCBmbG9hdCYgeCwg
ZmxvYXQmIHkpOworCitzdGF0aWMgdm9pZCBxdWFkQ3VydmUoaW50IHNlZ21lbnRzLCBWZWN0b3I8
UGF0aFBvaW50PiYgcHRzLCBjb25zdCBQYXRoUG9pbnQqIGNvbnRyb2wpCit7CisgICAgY29uc3Qg
ZmxvYXQgc3RlcCA9IDEuMCAvIHNlZ21lbnRzOworICAgIHJlZ2lzdGVyIGZsb2F0IHRBID0gMC4w
OworICAgIHJlZ2lzdGVyIGZsb2F0IHRCID0gMS4wOworCisgICAgZmxvYXQgYzF4ID0gY29udHJv
bFswXS54KCk7CisgICAgZmxvYXQgYzF5ID0gY29udHJvbFswXS55KCk7CisgICAgZmxvYXQgYzJ4
ID0gY29udHJvbFsxXS54KCk7CisgICAgZmxvYXQgYzJ5ID0gY29udHJvbFsxXS55KCk7CisgICAg
ZmxvYXQgYzN4ID0gY29udHJvbFsyXS54KCk7CisgICAgZmxvYXQgYzN5ID0gY29udHJvbFsyXS55
KCk7CisKKyAgICBjb25zdCBpbnQgb2Zmc2V0ID0gcHRzLnNpemUoKTsKKyAgICBwdHMucmVzaXpl
KG9mZnNldCArIHNlZ21lbnRzKTsKKyAgICBQYXRoUG9pbnQgcHA7CisgICAgcHAubV94ID0gYzF4
OworICAgIHBwLm1feSA9IGMxeTsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudHM7
ICsraSkgeworICAgICAgICB0QSArPSBzdGVwOworICAgICAgICB0QiAtPSBzdGVwOworCisgICAg
ICAgIGNvbnN0IGZsb2F0IGEgPSB0QiAqIHRCOworICAgICAgICBjb25zdCBmbG9hdCBiID0gMi4w
ICogdEEgKiB0QjsKKyAgICAgICAgY29uc3QgZmxvYXQgYyA9IHRBICogdEE7CisKKyAgICAgICAg
cHAubV94ID0gYzF4ICogYSArIGMyeCAqIGIgKyBjM3ggKiBjOworICAgICAgICBwcC5tX3kgPSBj
MXkgKiBhICsgYzJ5ICogYiArIGMzeSAqIGM7CisKKyAgICAgICAgcHRzW29mZnNldCArIGkgLSAx
XSA9IHBwOworICAgIH0KKworICAgIHBwLm1feCA9IGMzeDsKKyAgICBwcC5tX3kgPSBjM3k7Cisg
ICAgcHRzW29mZnNldCArIHNlZ21lbnRzIC0gMV0gPSBwcDsKK30KKworc3RhdGljIGlubGluZSB2
b2lkIGJlemllcihpbnQgc2VnbWVudHMsIFZlY3RvcjxQYXRoUG9pbnQ+JiBwdHMsIGNvbnN0IFBh
dGhQb2ludCogY29udHJvbCkKK3sKKyAgICBjb25zdCBmbG9hdCBzdGVwID0gMS4wIC8gc2VnbWVu
dHM7CisgICAgcmVnaXN0ZXIgZmxvYXQgdEEgPSAwLjA7CisgICAgcmVnaXN0ZXIgZmxvYXQgdEIg
PSAxLjA7CisKKyAgICBmbG9hdCBjMXggPSBjb250cm9sWzBdLngoKTsKKyAgICBmbG9hdCBjMXkg
PSBjb250cm9sWzBdLnkoKTsKKyAgICBmbG9hdCBjMnggPSBjb250cm9sWzFdLngoKTsKKyAgICBm
bG9hdCBjMnkgPSBjb250cm9sWzFdLnkoKTsKKyAgICBmbG9hdCBjM3ggPSBjb250cm9sWzJdLngo
KTsKKyAgICBmbG9hdCBjM3kgPSBjb250cm9sWzJdLnkoKTsKKyAgICBmbG9hdCBjNHggPSBjb250
cm9sWzNdLngoKTsKKyAgICBmbG9hdCBjNHkgPSBjb250cm9sWzNdLnkoKTsKKworICAgIGNvbnN0
IGludCBvZmZzZXQgPSBwdHMuc2l6ZSgpOworICAgIHB0cy5yZXNpemUob2Zmc2V0ICsgc2VnbWVu
dHMpOworICAgIFBhdGhQb2ludCBwcDsKKyAgICBwcC5tX3ggPSBjMXg7CisgICAgcHAubV95ID0g
YzF5OworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50czsgKytpKSB7CisgICAgICAg
IHRBICs9IHN0ZXA7CisgICAgICAgIHRCIC09IHN0ZXA7CisgICAgICAgIGNvbnN0IGZsb2F0IHRB
c3EgPSB0QSAqIHRBOworICAgICAgICBjb25zdCBmbG9hdCB0QnNxID0gdEIgKiB0QjsKKworICAg
ICAgICBjb25zdCBmbG9hdCBhID0gdEJzcSAqIHRCOworICAgICAgICBjb25zdCBmbG9hdCBiID0g
My4wICogdEEgKiB0QnNxOworICAgICAgICBjb25zdCBmbG9hdCBjID0gMy4wICogdEIgKiB0QXNx
OworICAgICAgICBjb25zdCBmbG9hdCBkID0gdEFzcSAqIHRBOworCisgICAgICAgIHBwLm1feCA9
IGMxeCAqIGEgKyBjMnggKiBiICsgYzN4ICogYyArIGM0eCAqIGQ7CisgICAgICAgIHBwLm1feSA9
IGMxeSAqIGEgKyBjMnkgKiBiICsgYzN5ICogYyArIGM0eSAqIGQ7CisKKyAgICAgICAgcHRzW29m
ZnNldCArIGkgLSAxXSA9IHBwOworICAgIH0KKworICAgIHBwLm1feCA9IGM0eDsKKyAgICBwcC5t
X3kgPSBjNHk7CisgICAgcHRzW29mZnNldCArIHNlZ21lbnRzIC0gMV0gPSBwcDsKK30KKworc3Rh
dGljIGlubGluZSBpbnQgc3RhYmxlUm91bmQoZG91YmxlIGQpCit7CisgICAgaWYgKGQgPiAwKQor
ICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkICsgMC41KTsKKworICAgIGludCBpID0g
c3RhdGljX2Nhc3Q8aW50PihkKTsKKyAgICByZXR1cm4gaSAtIGQgPiAwLjUgPyBpIC0gMSA6IGk7
Cit9CisKK3N0YXRpYyBib29sIGNvbnRhaW5zUG9pbnQoY29uc3QgRmxvYXRSZWN0JiByLCBjb25z
dCBGbG9hdFBvaW50JiBwKQoreworICAgIHJldHVybiBwLngoKSA+PSByLngoKSAmJiBwLnkoKSA+
PSByLnkoKSAmJiBwLngoKSA8IHIucmlnaHQoKSAmJiBwLnkoKSA8IHIuYm90dG9tKCk7Cit9CisK
KyNkZWZpbmUgUEkgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKworc3RhdGljIHZvaWQg
bm9ybWFsaXplQW5nbGUoZmxvYXQmIGFuZ2xlKQoreworICAgIHdoaWxlIChhbmdsZSA8IDApCisg
ICAgICAgIGFuZ2xlICs9IDIgKiBQSTsKKyAgICB3aGlsZSAoYW5nbGUgPj0gMiAqIFBJKQorICAg
ICAgICBhbmdsZSAtPSAyICogUEk7CisgICAgaWYgKGFuZ2xlIDwgMC4wMDAwMSkKKyAgICAgICAg
YW5nbGUgPSAwOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1BcmNQb2ludChmbG9hdCYgeCwg
ZmxvYXQmIHksIGNvbnN0IEZsb2F0UG9pbnQmIGMpCit7CisgICAgeCArPSBjLngoKTsKKyAgICB5
ICs9IGMueSgpOworfQorCitzdGF0aWMgdm9pZCBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KEZs
b2F0UmVjdCYgciwgZmxvYXQgeCwgZmxvYXQgeSkKK3sKKyAgICBpZiAoci5pc0VtcHR5KCkpIHsK
KyAgICAgICAgci5zZXRYKHgpOworICAgICAgICByLnNldFkoeSk7CisgICAgICAgIHIuc2V0U2l6
ZShGbG9hdFNpemUoMSwgMSkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh4IDwg
ci54KCkpIHsKKyAgICAgICAgci5zZXRXaWR0aChyLnJpZ2h0KCkgLSB4KTsKKyAgICAgICAgci5z
ZXRYKHgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IHcgPSB4IC0gci54KCkgKyAxOwor
ICAgICAgICBpZiAodyA+IHIud2lkdGgoKSkKKyAgICAgICAgICAgIHIuc2V0V2lkdGgodyk7Cisg
ICAgfQorICAgIGlmICh5IDwgci55KCkpIHsKKyAgICAgICAgci5zZXRIZWlnaHQoci5ib3R0b20o
KSAtIHkpOworICAgICAgICByLnNldFkoeSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmxvYXQg
aCA9ICB5IC0gci55KCkgKyAxOworICAgICAgICBpZiAoaCA+IHIuaGVpZ2h0KCkpCisgICAgICAg
ICAgICByLnNldEhlaWdodChoKTsKKyAgICB9Cit9CisKKy8vIHJldHVybiAwLWJhc2VkIHZhbHVl
OiAwIC0gZmlyc3QgUXVhZHJhbnQgKCAwIC0gOTAgZGVncmVlKQorc3RhdGljIGlubGluZSBpbnQg
cXVhZHJhbnQoY29uc3QgUGF0aFBvaW50JiBwb2ludCwgY29uc3QgUGF0aFBvaW50JiBvcmlnUG9p
bnQpCit7CisgICAgcmV0dXJuIHBvaW50Lm1feCA8IG9yaWdQb2ludC5tX3ggPworICAgICAgICAo
cG9pbnQubV95IDwgb3JpZ1BvaW50Lm1feSA/IDIgOiAxKQorICAgICAgICA6IChwb2ludC5tX3kg
PCBvcmlnUG9pbnQubV95ID8gMyA6IDApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNRdWFk
cmFudE9uTGVmdChpbnQgcSkgeyByZXR1cm4gcSA9PSAxIHx8IHEgPT0gMjsgfQorc3RhdGljIGlu
bGluZSBib29sIGlzUXVhZHJhbnRPblJpZ2h0KGludCBxKSB7IHJldHVybiBxID09IDAgfHwgcSA9
PSAzOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgaXNRdWFkcmFudE9uVG9wKGludCBxKSB7IHJldHVy
biBxID09IDIgfHwgcSA9PSAzOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgaXNRdWFkcmFudE9uQm90
dG9tKGludCBxKSB7IHJldHVybiBxID09IDAgfHwgcSA9PSAxOyB9CisKK3N0YXRpYyBpbmxpbmUg
aW50IG5leHRRdWFkcmFudChpbnQgcSkgeyByZXR1cm4gcSA9PSAzID8gMCA6IHEgKyAxOyB9Citz
dGF0aWMgaW5saW5lIGludCBxdWFkcmFudERpZmYoaW50IHExLCBpbnQgcTIpCit7CisgICAgaW50
IGQgPSBxMSAtIHEyOworICAgIHdoaWxlIChkIDwgMCkKKyAgICAgICAgZCArPSA0OworICAgIHJl
dHVybiBkOworfQorCitzdHJ1Y3QgUGF0aFZlY3RvciB7CisgICAgZmxvYXQgbV94OworICAgIGZs
b2F0IG1feTsKKworICAgIFBhdGhWZWN0b3IoKSA6IG1feCgwKSwgbV95KDApIHt9CisgICAgUGF0
aFZlY3RvcihmbG9hdCB4LCBmbG9hdCB5KSA6IG1feCh4KSwgbV95KHkpIHt9CisgICAgZG91Ymxl
IGFuZ2xlKCkgY29uc3QgeyByZXR1cm4gYXRhbjIobV95LCBtX3gpOyB9CisgICAgb3BlcmF0b3Ig
ZG91YmxlICgpIGNvbnN0IHsgcmV0dXJuIGFuZ2xlKCk7IH0KKyAgICBkb3VibGUgbGVuZ3RoKCkg
Y29uc3QgeyByZXR1cm4gX2h5cG90KG1feCwgbV95KTsgfQorfTsKKworUGF0aFZlY3RvciBvcGVy
YXRvci0oY29uc3QgUGF0aFBvaW50JiBwMSwgY29uc3QgUGF0aFBvaW50JiBwMikgeyByZXR1cm4g
UGF0aFZlY3RvcihwMS5tX3ggLSBwMi5tX3gsIHAxLm1feSAtIHAyLm1feSk7IH0KKworc3RhdGlj
IHZvaWQgYWRkQXJjUG9pbnQoUGF0aFBvbHlnb24mIHBvbHksIGNvbnN0IFBhdGhQb2ludCYgY2Vu
dGVyLCBjb25zdCBQYXRoUG9pbnQmIHJhZGl1cywgZG91YmxlIGFuZ2xlKQoreworICAgIFBhdGhQ
b2ludCBwOworICAgIGdldEVsbGlwc2VQb2ludEJ5QW5nbGUoYW5nbGUsIHJhZGl1cy5tX3gsIHJh
ZGl1cy5tX3ksIHAubV94LCBwLm1feSk7CisgICAgdHJhbnNmb3JtQXJjUG9pbnQocC5tX3gsIHAu
bV95LCBjZW50ZXIpOworICAgIGlmIChwb2x5LmlzRW1wdHkoKSB8fCBwb2x5Lmxhc3QoKSAhPSBw
KQorICAgICAgICBwb2x5LmFwcGVuZChwKTsKK30KKworc3RhdGljIHZvaWQgYWRkQXJjUG9pbnRz
KFBhdGhQb2x5Z29uJiBwb2x5LCBjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50OjpBcmNUbyYgZGF0
YSkKK3sKKyAgICBjb25zdCBQYXRoUG9pbnQmIHN0YXJ0UG9pbnQgPSBwb2x5Lmxhc3QoKTsKKyAg
ICBkb3VibGUgY3VyQW5nbGUgPSBzdGFydFBvaW50IC0gZGF0YS5tX2NlbnRlcjsKKyAgICBkb3Vi
bGUgZW5kQW5nbGUgPSBkYXRhLm1fZW5kIC0gZGF0YS5tX2NlbnRlcjsKKyAgICBkb3VibGUgYW5n
bGVTdGVwID0gMi4gLyBzdGQ6Om1heChkYXRhLm1fcmFkaXVzLm1feCwgZGF0YS5tX3JhZGl1cy5t
X3kpOworICAgIGlmIChkYXRhLm1fY2xvY2t3aXNlKSB7CisgICAgICAgIGlmIChlbmRBbmdsZSA8
PSBjdXJBbmdsZSB8fCBzdGFydFBvaW50ID09IGRhdGEubV9lbmQpCisgICAgICAgICAgICBlbmRB
bmdsZSArPSAyICogUEk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYW5nbGVTdGVwID0gLWFuZ2xl
U3RlcDsKKyAgICAgICAgaWYgKGVuZEFuZ2xlID49IGN1ckFuZ2xlIHx8IHN0YXJ0UG9pbnQgPT0g
ZGF0YS5tX2VuZCkKKyAgICAgICAgICAgIGVuZEFuZ2xlIC09IDIgKiBQSTsKKyAgICB9CisKKyAg
ICBmb3IgKGN1ckFuZ2xlICs9IGFuZ2xlU3RlcDsgZGF0YS5tX2Nsb2Nrd2lzZSA/IGN1ckFuZ2xl
IDwgZW5kQW5nbGUgOiBjdXJBbmdsZSA+IGVuZEFuZ2xlOyBjdXJBbmdsZSArPSBhbmdsZVN0ZXAp
CisgICAgICAgIGFkZEFyY1BvaW50KHBvbHksIGRhdGEubV9jZW50ZXIsIGRhdGEubV9yYWRpdXMs
IGN1ckFuZ2xlKTsKKworICAgIGlmIChwb2x5LmlzRW1wdHkoKSB8fCBwb2x5Lmxhc3QoKSAhPSBk
YXRhLm1fZW5kKQorICAgICAgICBwb2x5LmFwcGVuZChkYXRhLm1fZW5kKTsKK30KKworc3RhdGlj
IHZvaWQgZHJhd1BvbHlnb25zKEhEQyBkYywgY29uc3QgVmVjdG9yPFBhdGhQb2x5Z29uPiYgcG9s
eWdvbnMsIGJvb2wgZmlsbCwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgqIHRyKQoreworICAg
IE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7CisgICAgZm9yIChWZWN0b3I8UGF0aFBv
bHlnb24+Ojpjb25zdF9pdGVyYXRvciBpID0gcG9seWdvbnMuYmVnaW4oKTsgaSAhPSBwb2x5Z29u
cy5lbmQoKTsgKytpKSB7CisgICAgICAgIGludCBucG9pbnRzID0gaS0+c2l6ZSgpOworICAgICAg
ICBpZiAoIW5wb2ludHMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBQT0lOVCog
d2luUG9pbnRzID0gMDsKKyAgICAgICAgaWYgKGZpbGwpIHsKKyAgICAgICAgICAgIGlmIChucG9p
bnRzID4gMikKKyAgICAgICAgICAgICAgICB3aW5Qb2ludHMgPSBuZXcgUE9JTlRbbnBvaW50cyAr
IDFdOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHdpblBvaW50cyA9IG5ldyBQT0lOVFtu
cG9pbnRzXTsKKworICAgICAgICBpZiAod2luUG9pbnRzKSB7CisgICAgICAgICAgICBpZiAodHIp
IHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpMiA9IDA7IGkyIDwgbnBvaW50czsgKytpMikg
eworICAgICAgICAgICAgICAgICAgICBGbG9hdFBvaW50IHRyUG9pbnQgPSB0ci0+bWFwUG9pbnQo
aS0+YXQoaTIpKTsKKyAgICAgICAgICAgICAgICAgICAgd2luUG9pbnRzW2kyXS54ID0gc3RhYmxl
Um91bmQodHJQb2ludC54KCkpOworICAgICAgICAgICAgICAgICAgICB3aW5Qb2ludHNbaTJdLnkg
PSBzdGFibGVSb3VuZCh0clBvaW50LnkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpMiA9IDA7IGkyIDwgbnBvaW50
czsgKytpMikgeworICAgICAgICAgICAgICAgICAgICB3aW5Qb2ludHNbaTJdLnggPSBzdGFibGVS
b3VuZChpLT5hdChpMikueCgpKTsKKyAgICAgICAgICAgICAgICAgICAgd2luUG9pbnRzW2kyXS55
ID0gc3RhYmxlUm91bmQoaS0+YXQoaTIpLnkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmlsbCAmJiB3aW5Qb2ludHNbbnBvaW50cyAtIDFd
ICE9IHdpblBvaW50c1swXSkgeworICAgICAgICAgICAgICAgIHdpblBvaW50c1tucG9pbnRzXS54
ID0gd2luUG9pbnRzWzBdLng7CisgICAgICAgICAgICAgICAgd2luUG9pbnRzW25wb2ludHNdLnkg
PSB3aW5Qb2ludHNbMF0ueTsKKyAgICAgICAgICAgICAgICArK25wb2ludHM7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGlmIChmaWxsKQorICAgICAgICAgICAgICAgIDo6UG9seWdvbihk
Yywgd2luUG9pbnRzLCBucG9pbnRzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICA6OlBvbHlsaW5lKGRjLCB3aW5Qb2ludHMsIG5wb2ludHMpOworICAgICAgICAgICAgZGVsZXRl
W10gd2luUG9pbnRzOworICAgICAgICB9CisgICAgfQorfQorCisKK2ludCBQbGF0Zm9ybVBhdGhF
bGVtZW50OjpudW1Db250cm9sUG9pbnRzKCkgY29uc3QKK3sKKyAgICBzd2l0Y2ggKG1fdHlwZSkg
eworICAgIGNhc2UgUGF0aE1vdmVUbzoKKyAgICBjYXNlIFBhdGhMaW5lVG86CisgICAgICAgIHJl
dHVybiAxOworICAgIGNhc2UgUGF0aFF1YWRDdXJ2ZVRvOgorICAgIGNhc2UgUGF0aEFyY1RvOgor
ICAgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIFBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICBy
ZXR1cm4gMzsKKyAgICAvL2Nhc2UgUGF0aENsb3NlU3VicGF0aDoKKyAgICBkZWZhdWx0OgorICAg
ICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK2ludCBQbGF0Zm9ybVBhdGhFbGVtZW50OjpudW1Q
b2ludHMoKSBjb25zdAoreworICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgY2FzZSBQYXRoTW92
ZVRvOgorICAgIGNhc2UgUGF0aExpbmVUbzoKKyAgICBjYXNlIFBhdGhBcmNUbzoKKyAgICAgICAg
cmV0dXJuIDE7CisgICAgY2FzZSBQYXRoUXVhZEN1cnZlVG86CisgICAgICAgIHJldHVybiAyOwor
ICAgIGNhc2UgUGF0aEJlemllckN1cnZlVG86CisgICAgICAgIHJldHVybiAzOworICAgIC8vY2Fz
ZSBQYXRoQ2xvc2VTdWJwYXRoOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAg
IH0KK30KKwordm9pZCBQYXRoUG9seWdvbjo6bW92ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCkK
K3sKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9pbnQ+OjppdGVyYXRvciBpID0gYmVnaW4oKTsgaSA8
IGVuZCgpOyArK2kpCisgICAgICAgIGktPm1vdmUob2Zmc2V0KTsKK30KKwordm9pZCBQYXRoUG9s
eWdvbjo6dHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIGZv
ciAoVmVjdG9yPFBhdGhQb2ludD46Oml0ZXJhdG9yIGkgPSBiZWdpbigpOyBpIDwgZW5kKCk7ICsr
aSkKKyAgICAgICAgKmkgPSB0Lm1hcFBvaW50KCppKTsKK30KKworYm9vbCBQYXRoUG9seWdvbjo6
Y29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgaWYgKHNpemUo
KSA8IDMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGludCBpbnRlcnNlY3RlZCA9IDA7
CisgICAgY29uc3QgUGF0aFBvaW50KiBwb2ludDEgPSAmbGFzdCgpOworICAgIFZlY3RvcjxQYXRo
UG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBsYXN0ID0gZW5kKCk7CisgICAgaW50IHdhc05lZ2F0aXZl
ID0gMjsKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBpID0gYmVn
aW4oKTsgaSAhPSBsYXN0OyArK2kpIHsKKyAgICAgICAgY29uc3QgUGF0aFBvaW50JiBwb2ludDIg
PSAqaTsKKyAgICAgICAgaWYgKHBvaW50MS0+eCgpICE9IHBvaW50LngoKSkgeworICAgICAgICAg
ICAgaWYgKHBvaW50Mi54KCkgPT0gcG9pbnQueCgpKQorICAgICAgICAgICAgICAgIHdhc05lZ2F0
aXZlID0gcG9pbnQxLT54KCkgPCBwb2ludC54KCkgPyAxIDogMDsKKyAgICAgICAgICAgIGVsc2Ug
aWYgKHBvaW50Mi54KCkgPCBwb2ludC54KCkgIT0gcG9pbnQxLT54KCkgPCBwb2ludC54KCkpIHsK
KyAgICAgICAgICAgICAgICBmbG9hdCB5ID0gKHBvaW50Mi55KCkgLSBwb2ludDEtPnkoKSkgLyAo
cG9pbnQyLngoKSAtIHBvaW50MS0+eCgpKSAqIChwb2ludC54KCkgLSBwb2ludDEtPngoKSkgKyBw
b2ludDEtPnkoKTsKKyAgICAgICAgICAgICAgICBpZiAoeSA+PSBwb2ludC55KCkpCisgICAgICAg
ICAgICAgICAgICAgICsraW50ZXJzZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBpZiAocG9pbnQxLT55KCkgPT0gcG9pbnQueSgpKQorICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICBpZiAocG9pbnQxLT55KCkgPiBwb2lu
dC55KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50Mi55KCkgPD0gcG9pbnQueSgpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKHdhc05lZ2F0aXZlID09IDIpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBqTGFzdCA9IGk7
CisgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8UGF0aFBvaW50Pjo6Y29uc3RfaXRlcmF0
b3IgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGogPT0gYmVnaW4oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaiA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAtLWo7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKGotPngoKSAhPSBwb2ludC54KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKGotPngoKSA+IHBvaW50LngoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHdhc05lZ2F0aXZlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzTmVnYXRpdmUg
PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChqICE9
IGpMYXN0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhc05lZ2F0aXZlID09IDIp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh3YXNOZWdhdGl2ZSA/IHBvaW50Mi54
KCkgPiBwb2ludC54KCkgOiBwb2ludDIueCgpIDwgcG9pbnQueCgpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgKytpbnRlcnNlY3RlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
IGVsc2UgaWYgKHBvaW50Mi54KCkgPT0gcG9pbnQueCgpICYmIHBvaW50Mi55KCkgPj0gcG9pbnQu
eSgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHBv
aW50MSA9ICZwb2ludDI7CisgICAgfQorCisgICAgcmV0dXJuIGludGVyc2VjdGVkICYgMTsKK30K
Kwordm9pZCBQbGF0Zm9ybVBhdGhFbGVtZW50Ojptb3ZlKGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0
KQoreworICAgIGludCBuID0gbnVtQ29udHJvbFBvaW50cygpOworICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbjsgKytpKQorICAgICAgICBtX2RhdGEubV9wb2ludHNbaV0ubW92ZShvZmZzZXQpOwor
fQorCit2b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OnRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgdCkKK3sKKyAgICBpbnQgbiA9IG51bUNvbnRyb2xQb2ludHMoKTsKKyAgICBm
b3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBGbG9hdFBvaW50IHAgPSB0Lm1h
cFBvaW50KG1fZGF0YS5tX3BvaW50c1tpXSk7CisgICAgICAgIG1fZGF0YS5tX3BvaW50c1tpXS5z
ZXQocC54KCksIHAueSgpKTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoRWxlbWVudDo6
aW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9pbnQmIGxh
c3RQb2ludCkgY29uc3QKK3sKKyAgICBpZiAobV90eXBlID09IFBhdGhBcmNUbykgeworICAgICAg
ICBjb25zdCBBcmNUbyYgZGF0YSA9IG1fZGF0YS5tX2FyY1RvRGF0YTsKKyAgICAgICAgUGF0aFBv
aW50IHN0YXJ0UG9pbnQ7CisgICAgICAgIHN0YXJ0UG9pbnQgPSBsYXN0UG9pbnQ7CisgICAgICAg
IFBhdGhQb2ludCBlbmRQb2ludCA9IGRhdGEubV9lbmQ7CisgICAgICAgIGlmICghZGF0YS5tX2Ns
b2Nrd2lzZSkKKyAgICAgICAgICAgIHN0ZDo6c3dhcChzdGFydFBvaW50LCBlbmRQb2ludCk7CisK
KyAgICAgICAgaW50IHEwID0gcXVhZHJhbnQoc3RhcnRQb2ludCwgZGF0YS5tX2NlbnRlcik7Cisg
ICAgICAgIGludCBxMSA9IHF1YWRyYW50KGVuZFBvaW50LCBkYXRhLm1fY2VudGVyKTsKKyAgICAg
ICAgYm9vbCBjb250YWluc0V4dHJlbWVzWzRdID0geyBmYWxzZSB9OyAvLyBib3R0b20sIGxlZnQs
IHRvcCwgcmlnaHQKKyAgICAgICAgc3RhdGljIGNvbnN0IFBhdGhQb2ludCBleHRyZW1lVmVjdG9y
c1s0XSA9IHsgeyAwLCAxIH0sIHsgLTEsIDAgfSwgeyAwLCAtMSB9LCB7IDEsIDAgfSB9OworICAg
ICAgICBpZiAocTAgPT0gcTEpIHsKKyAgICAgICAgICAgIGlmIChzdGFydFBvaW50Lm1feCA9PSBl
bmRQb2ludC5tX3ggfHwgaXNRdWFkcmFudE9uQm90dG9tKHEwKSAhPSBzdGFydFBvaW50Lm1feCA+
IGVuZFBvaW50Lm1feCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsg
KytpKQorICAgICAgICAgICAgICAgICAgICBjb250YWluc0V4dHJlbWVzW2ldID0gdHJ1ZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBleHRyZW1lID0g
cTA7CisgICAgICAgICAgICBpbnQgZGlmZiA9IHF1YWRyYW50RGlmZihxMSwgcTApOworICAgICAg
ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWZmOyArK2kpIHsKKyAgICAgICAgICAgICAgICBj
b250YWluc0V4dHJlbWVzW2V4dHJlbWVdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBleHRyZW1l
ID0gbmV4dFF1YWRyYW50KGV4dHJlbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg
ICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChyLCBzdGFydFBvaW50Lm1feCwgc3RhcnRQ
b2ludC5tX3kpOworICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIGVuZFBvaW50
Lm1feCwgZW5kUG9pbnQubV95KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kp
IHsKKyAgICAgICAgICAgIGlmIChjb250YWluc0V4dHJlbWVzW2ldKQorICAgICAgICAgICAgICAg
IGluZmxhdGVSZWN0VG9Db250YWluUG9pbnQociwgZGF0YS5tX2NlbnRlci5tX3ggKyBkYXRhLm1f
cmFkaXVzLm1feCAqIGV4dHJlbWVWZWN0b3JzW2ldLm1feCwgZGF0YS5tX2NlbnRlci5tX3kgKyBk
YXRhLm1fcmFkaXVzLm1feSAqIGV4dHJlbWVWZWN0b3JzW2ldLm1feSk7CisgICAgICAgIH0KKyAg
ICB9IGVsc2UgeworICAgICAgICBpbnQgbiA9IG51bVBvaW50cygpOworICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgICAgIGluZmxhdGVSZWN0VG9Db250YWluUG9p
bnQociwgbV9kYXRhLm1fcG9pbnRzW2ldLm1feCwgbV9kYXRhLm1fcG9pbnRzW2ldLm1feSk7Cisg
ICAgfQorfQorCitQYXRoRWxlbWVudFR5cGUgUGxhdGZvcm1QYXRoRWxlbWVudDo6dHlwZSgpIGNv
bnN0Cit7CisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICBjYXNlIFBhdGhNb3ZlVG86CisgICAg
ICAgIHJldHVybiBQYXRoRWxlbWVudE1vdmVUb1BvaW50OworICAgIGNhc2UgUGF0aExpbmVUbzoK
KyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRkTGluZVRvUG9pbnQ7CisgICAgY2FzZSBQYXRo
QXJjVG86CisgICAgICAgIC8vIEZJWE1FOiB0aGVyZSdzIG5vIGFyY1RvIHR5cGUgZm9yIFBhdGhF
bGVtZW50CisgICAgICAgIHJldHVybiBQYXRoRWxlbWVudEFkZExpbmVUb1BvaW50OworICAgICAg
ICAvLyByZXR1cm4gUGF0aEVsZW1lbnRBZGRRdWFkQ3VydmVUb1BvaW50OworICAgIGNhc2UgUGF0
aFF1YWRDdXJ2ZVRvOgorICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRRdWFkQ3VydmVUb1Bv
aW50OworICAgIGNhc2UgUGF0aEJlemllckN1cnZlVG86CisgICAgICAgIHJldHVybiBQYXRoRWxl
bWVudEFkZEN1cnZlVG9Qb2ludDsKKyAgICAvL2Nhc2UgUGF0aENsb3NlU3VicGF0aDoKKyAgICBk
ZWZhdWx0OgorICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRDbG9zZVN1YnBhdGg7CisgICAgfQor
fQorCitQbGF0Zm9ybVBhdGg6OlBsYXRmb3JtUGF0aCgpCis6IG1fcGVuTGlmdGVkKHRydWUpCit7
CisgICAgbV9jdXJyZW50UG9pbnQuY2xlYXIoKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmVu
c3VyZVN1YnBhdGgoKQoreworICAgIGlmIChtX3BlbkxpZnRlZCkgeworICAgICAgICBtX3Blbkxp
ZnRlZCA9IGZhbHNlOworICAgICAgICBtX3N1YnBhdGhzLmFwcGVuZChQYXRoUG9seWdvbigpKTsK
KyAgICAgICAgbV9zdWJwYXRocy5sYXN0KCkuYXBwZW5kKG1fY3VycmVudFBvaW50KTsKKyAgICB9
IGVsc2UKKyAgICAgICAgQVNTRVJUKCFtX3N1YnBhdGhzLmlzRW1wdHkoKSk7Cit9CisKK3ZvaWQg
UGxhdGZvcm1QYXRoOjphZGRUb1N1YnBhdGgoY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudCYgZSkK
K3sKKyAgICBpZiAoZS5wbGF0Zm9ybVR5cGUoKSA9PSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRo
TW92ZVRvKSB7CisgICAgICAgIG1fcGVuTGlmdGVkID0gdHJ1ZTsKKyAgICAgICAgbV9jdXJyZW50
UG9pbnQgPSBlLnBvaW50QXQoMCk7CisgICAgfSBlbHNlIGlmIChlLnBsYXRmb3JtVHlwZSgpID09
IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhDbG9zZVN1YnBhdGgpIHsKKyAgICAgICAgbV9wZW5M
aWZ0ZWQgPSB0cnVlOworICAgICAgICBpZiAoIW1fc3VicGF0aHMuaXNFbXB0eSgpKSB7CisgICAg
ICAgICAgICBpZiAobV9jdXJyZW50UG9pbnQgIT0gbV9zdWJwYXRocy5sYXN0KClbMF0pIHsKKyAg
ICAgICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gVzNDLCB3ZSBoYXZlIHRvIGRyYXcgYSBsaW5l
IGZyb20gY3VycmVudCBwb2ludCB0byB0aGUgaW5pdGlhbCBwb2ludAorICAgICAgICAgICAgICAg
IG1fc3VicGF0aHMubGFzdCgpLmFwcGVuZChtX3N1YnBhdGhzLmxhc3QoKVswXSk7CisgICAgICAg
ICAgICAgICAgbV9jdXJyZW50UG9pbnQgPSBtX3N1YnBhdGhzLmxhc3QoKVswXTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigp
OworICAgIH0gZWxzZSB7CisgICAgICAgIGVuc3VyZVN1YnBhdGgoKTsKKyAgICAgICAgc3dpdGNo
IChlLnBsYXRmb3JtVHlwZSgpKSB7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6
UGF0aExpbmVUbzoKKyAgICAgICAgICAgIG1fc3VicGF0aHMubGFzdCgpLmFwcGVuZChlLnBvaW50
QXQoMCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxl
bWVudDo6UGF0aEFyY1RvOgorICAgICAgICAgICAgYWRkQXJjUG9pbnRzKG1fc3VicGF0aHMubGFz
dCgpLCBlLmFyY1RvKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZv
cm1QYXRoRWxlbWVudDo6UGF0aFF1YWRDdXJ2ZVRvOgorICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgIFBhdGhQb2ludCBjb250cm9sW10gPSB7CisgICAgICAgICAgICAgICAgICAgIG1fY3Vy
cmVudFBvaW50LAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMCksCisgICAgICAgICAg
ICAgICAgICAgIGUucG9pbnRBdCgxKSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAg
ICAgIC8vIEZJWE1FOiBtYWdpYyBudW1iZXI/CisgICAgICAgICAgICAgICAgcXVhZEN1cnZlKDUw
LCBtX3N1YnBhdGhzLmxhc3QoKSwgY29udHJvbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQmV6aWVyQ3Vy
dmVUbzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQYXRoUG9pbnQgY29udHJvbFtd
ID0geworICAgICAgICAgICAgICAgICAgICBtX2N1cnJlbnRQb2ludCwKKyAgICAgICAgICAgICAg
ICAgICAgZS5wb2ludEF0KDApLAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMSksCisg
ICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgyKSwKKyAgICAgICAgICAgICAgICB9OworICAg
ICAgICAgICAgICAgIC8vIEZJWE1FOiBtYWdpYyBudW1iZXI/CisgICAgICAgICAgICAgICAgYmV6
aWVyKDEwMCwgbV9zdWJwYXRocy5sYXN0KCksIGNvbnRyb2wpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBtX2N1cnJlbnRQb2ludCA9IG1fc3VicGF0aHMubGFzdCgpLmxhc3Qo
KTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphcHBlbmQoY29uc3QgUGxhdGZvcm1Q
YXRoRWxlbWVudCYgZSkKK3sKKyAgICBlLmluZmxhdGVSZWN0VG9Db250YWluTWUobV9ib3VuZGlu
Z1JlY3QsIGxhc3RQb2ludCgpKTsKKyAgICBhZGRUb1N1YnBhdGgoZSk7CisgICAgbV9lbGVtZW50
cy5hcHBlbmQoZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphcHBlbmQoY29uc3QgUGxhdGZv
cm1QYXRoJiBwKQoreworICAgIGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnRzJiBlID0gcC5lbGVt
ZW50cygpOworICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6OmNvbnN0X2l0ZXJhdG9yIGl0
KGUuYmVnaW4oKSk7IGl0ICE9IGUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgYWRkVG9TdWJwYXRo
KCppdCk7CisgICAgICAgIGl0LT5pbmZsYXRlUmVjdFRvQ29udGFpbk1lKG1fYm91bmRpbmdSZWN0
LCBsYXN0UG9pbnQoKSk7CisgICAgICAgIG1fZWxlbWVudHMuYXBwZW5kKCppdCk7CisgICAgfQor
fQorCit2b2lkIFBsYXRmb3JtUGF0aDo6Y2xlYXIoKQoreworICAgIG1fZWxlbWVudHMuY2xlYXIo
KTsKKyAgICBtX2JvdW5kaW5nUmVjdCA9IEZsb2F0UmVjdCgpOworICAgIG1fc3VicGF0aHMuY2xl
YXIoKTsKKyAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigpOworICAgIG1fcGVuTGlmdGVkID0gdHJ1
ZTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OnN0cm9rZVBhdGgoSERDIGRjLCBjb25zdCBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCogdHIpIGNvbnN0Cit7CisgICAgZHJhd1BvbHlnb25zKGRjLCBtX3N1
YnBhdGhzLCBmYWxzZSwgdHIpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6ZmlsbFBhdGgoSERD
IGRjLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogdHIpIGNvbnN0Cit7CisgICAgSEdESU9C
SiBvbGRQZW4gPSBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfUEVOKSk7Cisg
ICAgZHJhd1BvbHlnb25zKGRjLCBtX3N1YnBhdGhzLCB0cnVlLCB0cik7CisgICAgU2VsZWN0T2Jq
ZWN0KGRjLCBvbGRQZW4pOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6dHJhbnNsYXRlKGNvbnN0
IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjppdGVy
YXRvciBpdChtX2VsZW1lbnRzLmJlZ2luKCkpOyBpdCAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2l0
KQorICAgICAgICBpdC0+bW92ZShzaXplKTsKKworICAgIG1fYm91bmRpbmdSZWN0Lm1vdmUoc2l6
ZSk7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvbHlnb24+OjppdGVyYXRvciBpdCA9IG1fc3VicGF0
aHMuYmVnaW4oKTsgaXQgIT0gbV9zdWJwYXRocy5lbmQoKTsgKytpdCkKKyAgICAgICAgaXQtPm1v
dmUoc2l6ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjp0cmFuc2Zvcm0oY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgmIHQpCit7CisgICAgZm9yIChQbGF0Zm9ybVBhdGhFbGVtZW50czo6aXRl
cmF0b3IgaXQobV9lbGVtZW50cy5iZWdpbigpKTsgaXQgIT0gbV9lbGVtZW50cy5lbmQoKTsgKytp
dCkKKyAgICAgICAgaXQtPnRyYW5zZm9ybSh0KTsKKworICAgIG1fYm91bmRpbmdSZWN0ID0gdC5t
YXBSZWN0KG1fYm91bmRpbmdSZWN0KTsKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9seWdvbj46Oml0
ZXJhdG9yIGl0ID0gbV9zdWJwYXRocy5iZWdpbigpOyBpdCAhPSBtX3N1YnBhdGhzLmVuZCgpOyAr
K2l0KQorICAgICAgICBpdC0+dHJhbnNmb3JtKHQpOworfQorCitib29sIFBsYXRmb3JtUGF0aDo6
Y29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIFdpbmRSdWxlIHJ1bGUpIGNvbnN0Cit7
CisgICAgLy8gb3B0aW1pemF0aW9uOiBjaGVjayB0aGUgYm91bmRpbmcgcmVjdCBmaXJzdAorICAg
IGlmICghY29udGFpbnNQb2ludChtX2JvdW5kaW5nUmVjdCwgcG9pbnQpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9seWdvbj46OmNvbnN0X2l0ZXJhdG9y
IGkgPSBtX3N1YnBhdGhzLmJlZ2luKCk7IGkgIT0gbV9zdWJwYXRocy5lbmQoKTsgKytpKSB7Cisg
ICAgICAgIGlmIChpLT5jb250YWlucyhwb2ludCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjptb3Zl
VG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6
TW92ZVRvIGRhdGEgPSB7IHsgcG9pbnQueCgpLCBwb2ludC55KCkgfSB9OworICAgIFBsYXRmb3Jt
UGF0aEVsZW1lbnQgcGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9y
bVBhdGg6OmFkZExpbmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBQbGF0Zm9y
bVBhdGhFbGVtZW50OjpMaW5lVG8gZGF0YSA9IHsgeyBwb2ludC54KCksIHBvaW50LnkoKSB9IH07
CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQor
Cit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkUXVhZEN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3As
IGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6UXVhZEN1
cnZlVG8gZGF0YSA9IHsgeyBjcC54KCksIGNwLnkoKSB9LCB7IHAueCgpLCBwLnkoKSB9IH07Cisg
ICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2
b2lkIFBsYXRmb3JtUGF0aDo6YWRkQmV6aWVyQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjcDEs
IGNvbnN0IEZsb2F0UG9pbnQmIGNwMiwgY29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAgICBQbGF0
Zm9ybVBhdGhFbGVtZW50OjpCZXppZXJDdXJ2ZVRvIGRhdGEgPSB7IHsgY3AxLngoKSwgY3AxLnko
KSB9LCB7IGNwMi54KCksIGNwMi55KCkgfSwgeyBwLngoKSwgcC55KCkgfSB9OworICAgIFBsYXRm
b3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0
Zm9ybVBhdGg6OmFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmIGZwMSwgY29uc3QgRmxvYXRQb2lu
dCYgZnAyLCBmbG9hdCByYWRpdXMpCit7CisgICAgY29uc3QgUGF0aFBvaW50JiBwMCA9IG1fY3Vy
cmVudFBvaW50OworICAgIFBhdGhQb2ludCBwMTsKKyAgICBwMSA9IGZwMTsKKyAgICBQYXRoUG9p
bnQgcDI7CisgICAgcDIgPSBmcDI7CisgICAgaWYgKCFyYWRpdXMgfHwgcDAgPT0gcDEgfHwgcDEg
PT0gcDIpIHsKKyAgICAgICAgYWRkTGluZVRvKHAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIFBhdGhWZWN0b3IgdjAxID0gcDAgLSBwMTsKKyAgICBQYXRoVmVjdG9yIHYyMSA9IHAy
IC0gcDE7CisKKyAgICAvLyBzaW4oQSAtIEIpID0gc2luKEEpICogY29zKEIpIC0gc2luKEIpICog
Y29zKEEpCisgICAgZG91YmxlIGNyb3NzID0gdjAxLm1feCAqIHYyMS5tX3kgLSB2MDEubV95ICog
djIxLm1feDsKKworICAgIGlmIChmYWJzKGNyb3NzKSA8IDFFLTEwKSB7CisgICAgICAgIC8vIG9u
IG9uZSBsaW5lCisgICAgICAgIGFkZExpbmVUbyhwMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBkb3VibGUgZDAxID0gdjAxLmxlbmd0aCgpOworICAgIGRvdWJsZSBkMjEgPSB2MjEu
bGVuZ3RoKCk7CisgICAgZG91YmxlIGFuZ2xlID0gKFBJIC0gYWJzKGFzaW4oY3Jvc3MgLyAoZDAx
ICogZDIxKSkpKSAqIDAuNTsKKyAgICBkb3VibGUgc3BhbiA9IHJhZGl1cyAqIHRhbihhbmdsZSk7
CisgICAgZG91YmxlIHJhdGUgPSBzcGFuIC8gZDAxOworICAgIFBhdGhQb2ludCBzdGFydFBvaW50
OworICAgIHN0YXJ0UG9pbnQubV94ID0gcDEubV94ICsgdjAxLm1feCAqIHJhdGU7CisgICAgc3Rh
cnRQb2ludC5tX3kgPSBwMS5tX3kgKyB2MDEubV95ICogcmF0ZTsKKworICAgIGFkZExpbmVUbyhz
dGFydFBvaW50KTsKKworICAgIFBhdGhQb2ludCBlbmRQb2ludDsKKyAgICByYXRlID0gc3BhbiAv
IGQyMTsKKyAgICBlbmRQb2ludC5tX3ggPSBwMS5tX3ggKyB2MjEubV94ICogcmF0ZTsKKyAgICBl
bmRQb2ludC5tX3kgPSBwMS5tX3kgKyB2MjEubV95ICogcmF0ZTsKKworICAgIFBhdGhQb2ludCBt
aWRQb2ludDsKKyAgICBtaWRQb2ludC5tX3ggPSAoc3RhcnRQb2ludC5tX3ggKyBlbmRQb2ludC5t
X3gpICogMC41OworICAgIG1pZFBvaW50Lm1feSA9IChzdGFydFBvaW50Lm1feSArIGVuZFBvaW50
Lm1feSkgKiAwLjU7CisKKyAgICBQYXRoVmVjdG9yIHZtMSA9IG1pZFBvaW50IC0gcDE7CisgICAg
ZG91YmxlIGRtMSA9IHZtMS5sZW5ndGgoKTsKKyAgICBkb3VibGUgZCA9IF9oeXBvdChyYWRpdXMs
IHNwYW4pOworCisgICAgUGF0aFBvaW50IGNlbnRlclBvaW50OworICAgIHJhdGUgPSBkIC8gZG0x
OworICAgIGNlbnRlclBvaW50Lm1feCA9IHAxLm1feCArIHZtMS5tX3ggKiByYXRlOworICAgIGNl
bnRlclBvaW50Lm1feSA9IHAxLm1feSArIHZtMS5tX3kgKiByYXRlOworCisgICAgUGxhdGZvcm1Q
YXRoRWxlbWVudDo6QXJjVG8gZGF0YSA9IHsKKyAgICAgICAgZW5kUG9pbnQsCisgICAgICAgIGNl
bnRlclBvaW50LAorICAgICAgICB7IHJhZGl1cywgcmFkaXVzIH0sCisgICAgICAgIGNyb3NzIDwg
MAorICAgIH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQo
cGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6Y2xvc2VTdWJwYXRoKCkKK3sKKyAgICBQbGF0
Zm9ybVBhdGhFbGVtZW50IHBlOworICAgIGFwcGVuZChwZSk7Cit9CisKKy8vIGFkZCBhIGNpcmN1
bGFyIGFyYyBjZW50cmVkIGF0IHAgd2l0aCByYWRpdXMgciBmcm9tIHN0YXJ0IGFuZ2xlIHNhciAo
cmFkaWFucykgdG8gZW5kIGFuZ2xlIGVhcgordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEVsbGlwc2Uo
Y29uc3QgRmxvYXRQb2ludCYgcCwgZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgc2FyLCBmbG9hdCBl
YXIsIGJvb2wgYW50aWNsb2Nrd2lzZSkKK3sKKyAgICBmbG9hdCBzdGFydFgsIHN0YXJ0WSwgZW5k
WCwgZW5kWTsKKworICAgIG5vcm1hbGl6ZUFuZ2xlKHNhcik7CisgICAgbm9ybWFsaXplQW5nbGUo
ZWFyKTsKKworICAgIGdldEVsbGlwc2VQb2ludEJ5QW5nbGUoc2FyLCBhLCBiLCBzdGFydFgsIHN0
YXJ0WSk7CisgICAgZ2V0RWxsaXBzZVBvaW50QnlBbmdsZShlYXIsIGEsIGIsIGVuZFgsIGVuZFkp
OworCisgICAgdHJhbnNmb3JtQXJjUG9pbnQoc3RhcnRYLCBzdGFydFksIHApOworICAgIHRyYW5z
Zm9ybUFyY1BvaW50KGVuZFgsIGVuZFksIHApOworCisgICAgRmxvYXRQb2ludCBzdGFydChzdGFy
dFgsIHN0YXJ0WSk7CisgICAgbW92ZVRvKHN0YXJ0KTsKKworICAgIFBsYXRmb3JtUGF0aEVsZW1l
bnQ6OkFyY1RvIGRhdGEgPSB7IHsgZW5kWCwgZW5kWSB9LCB7IHAueCgpLCBwLnkoKSB9LCAgeyBh
LCBiIH0sICFhbnRpY2xvY2t3aXNlIH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRh
KTsKKyAgICBhcHBlbmQocGUpOworfQorCisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRSZWN0KGNv
bnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICBtb3ZlVG8oci5sb2NhdGlvbigpKTsKKworICAgIGZs
b2F0IHJpZ2h0ID0gci5yaWdodCgpIC0gMTsKKyAgICBmbG9hdCBib3R0b20gPSByLmJvdHRvbSgp
IC0gMTsKKyAgICBhZGRMaW5lVG8oRmxvYXRQb2ludChyaWdodCwgci55KCkpKTsKKyAgICBhZGRM
aW5lVG8oRmxvYXRQb2ludChyaWdodCwgYm90dG9tKSk7CisgICAgYWRkTGluZVRvKEZsb2F0UG9p
bnQoci54KCksIGJvdHRvbSkpOworICAgIGFkZExpbmVUbyhyLmxvY2F0aW9uKCkpOworfQorCit2
b2lkIFBsYXRmb3JtUGF0aDo6YWRkRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAg
RmxvYXRTaXplIHJhZGl1cyhyLndpZHRoKCkgKiAwLjUsIHIuaGVpZ2h0KCkgKiAwLjUpOworICAg
IGFkZEVsbGlwc2Uoci5sb2NhdGlvbigpICsgcmFkaXVzLCByYWRpdXMud2lkdGgoKSwgcmFkaXVz
LmhlaWdodCgpLCAwLCAwLCB0cnVlKTsKK30KKworU3RyaW5nIFBsYXRmb3JtUGF0aDo6ZGVidWdT
dHJpbmcoKSBjb25zdAoreworICAgIFN0cmluZyByZXQ7CisgICAgZm9yIChQbGF0Zm9ybVBhdGhF
bGVtZW50czo6Y29uc3RfaXRlcmF0b3IgaShtX2VsZW1lbnRzLmJlZ2luKCkpOyBpICE9IG1fZWxl
bWVudHMuZW5kKCk7ICsraSkgeworICAgICAgICBzd2l0Y2ggKGktPnBsYXRmb3JtVHlwZSgpKSB7
CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aE1vdmVUbzoKKyAgICAgICAg
Y2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoTGluZVRvOgorICAgICAgICAgICAgcmV0ICs9
IFN0cmluZzo6Zm9ybWF0KCJNICVmICVmXG4iLCBpLT5wb2ludEF0KDApLm1feCwgaS0+cG9pbnRB
dCgwKS5tX3kpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRo
RWxlbWVudDo6UGF0aEFyY1RvOgorICAgICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJB
ICVmICVmICVmICVmICVmICVmICVjXG4iCisgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1f
ZW5kLm1feCwgaS0+YXJjVG8oKS5tX2VuZC5tX3kKKyAgICAgICAgICAgICAgICAsIGktPmFyY1Rv
KCkubV9jZW50ZXIubV94LCBpLT5hcmNUbygpLm1fY2VudGVyLm1feQorICAgICAgICAgICAgICAg
ICwgaS0+YXJjVG8oKS5tX3JhZGl1cy5tX3gsIGktPmFyY1RvKCkubV9yYWRpdXMubV95CisgICAg
ICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fY2xvY2t3aXNlPyAnWScgOiAnTicpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aFF1YWRD
dXJ2ZVRvOgorICAgICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJRICVmICVmICVmICVm
XG4iCisgICAgICAgICAgICAgICAgLCBpLT5wb2ludEF0KDApLm1feCwgaS0+cG9pbnRBdCgwKS5t
X3kKKyAgICAgICAgICAgICAgICAsIGktPnBvaW50QXQoMSkubV94LCBpLT5wb2ludEF0KDEpLm1f
eSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50
OjpQYXRoQmV6aWVyQ3VydmVUbzoKKyAgICAgICAgICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgi
QiAlZiAlZiAlZiAlZiAlZiAlZlxuIgorICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgwKS5t
X3gsIGktPnBvaW50QXQoMCkubV95CisgICAgICAgICAgICAgICAgLCBpLT5wb2ludEF0KDEpLm1f
eCwgaS0+cG9pbnRBdCgxKS5tX3kKKyAgICAgICAgICAgICAgICAsIGktPnBvaW50QXQoMikubV94
LCBpLT5wb2ludEF0KDIpLm1feSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQ
bGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQ2xvc2VTdWJwYXRoOgorICAgICAgICAgICAgcmV0ICs9
ICJTXG4iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1
cm4gcmV0OworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YXBwbHkodm9pZCogaW5mbywgUGF0aEFw
cGxpZXJGdW5jdGlvbiBmdW5jdGlvbikgY29uc3QKK3sKKyAgICBQYXRoRWxlbWVudCBwZWxlbWVu
dDsKKyAgICBGbG9hdFBvaW50IHBvaW50c1szXTsKKyAgICBwZWxlbWVudC5wb2ludHMgPSBwb2lu
dHM7CisKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVyYXRvciBpdCht
X2VsZW1lbnRzLmJlZ2luKCkpOyBpdCAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2l0KSB7CisgICAg
ICAgIHBlbGVtZW50LnR5cGUgPSBpdC0+dHlwZSgpOworICAgICAgICBpbnQgbiA9IGl0LT5udW1Q
b2ludHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICAgICAg
ICBwb2ludHNbaV0gPSBpdC0+cG9pbnRBdChpKTsKKyAgICAgICAgZnVuY3Rpb24oaW5mbywgJnBl
bGVtZW50KTsKKyAgICB9Cit9CisKKworfSAvLyBuYW1lc3BhY2UgV2ViY29yZQpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5oIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTAwYTcKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmgKQEAg
LTAsMCArMSwxNzggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9i
aWxlLCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgUGxhdGZvcm1QYXRoV2luY2VfaAorI2RlZmlu
ZSBQbGF0Zm9ybVBhdGhXaW5jZV9oCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNz
IEdyYXBoaWNzQ29udGV4dDsKKworICAgIHN0cnVjdCBQYXRoUG9pbnQgeworICAgICAgICBmbG9h
dCBtX3g7CisgICAgICAgIGZsb2F0IG1feTsKKyAgICAgICAgY29uc3QgZmxvYXQmIHgoKSBjb25z
dCB7IHJldHVybiBtX3g7IH0KKyAgICAgICAgY29uc3QgZmxvYXQmIHkoKSBjb25zdCB7IHJldHVy
biBtX3k7IH0KKyAgICAgICAgdm9pZCBzZXQoZmxvYXQgeCwgZmxvYXQgeSkKKyAgICAgICAgewor
ICAgICAgICAgICAgbV94ID0geDsKKyAgICAgICAgICAgIG1feSA9IHk7CisgICAgICAgIH07Cisg
ICAgICAgIG9wZXJhdG9yIEZsb2F0UG9pbnQoKSBjb25zdCB7IHJldHVybiBGbG9hdFBvaW50KG1f
eCwgbV95KTsgfQorICAgICAgICB2b2lkIG1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIG1feCArPSBvZmZzZXQud2lkdGgoKTsKKyAgICAgICAgICAg
IG1feSArPSBvZmZzZXQuaGVpZ2h0KCk7CisgICAgICAgIH0KKyAgICAgICAgUGF0aFBvaW50JiBv
cGVyYXRvcj0oY29uc3QgRmxvYXRQb2ludCYgcCkKKyAgICAgICAgeworICAgICAgICAgICAgbV94
ID0gcC54KCk7CisgICAgICAgICAgICBtX3kgPSBwLnkoKTsKKyAgICAgICAgICAgIHJldHVybiAq
dGhpczsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNsZWFyKCkgeyBtX3ggPSBtX3kgPSAwOyB9
CisgICAgfTsKKworICAgIHN0cnVjdCBQYXRoUG9seWdvbjogcHVibGljIFZlY3RvcjxQYXRoUG9p
bnQ+IHsKKyAgICAgICAgdm9pZCBtb3ZlKGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0KTsKKyAgICAg
ICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpOworICAgICAg
ICBib29sIGNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdDsKKyAgICB9Owor
CisgICAgY2xhc3MgUGxhdGZvcm1QYXRoRWxlbWVudCB7CisgICAgcHVibGljOgorICAgICAgICBl
bnVtIFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgeworICAgICAgICAgICAgUGF0aE1vdmVUbywKKyAg
ICAgICAgICAgIFBhdGhMaW5lVG8sCisgICAgICAgICAgICBQYXRoQXJjVG8sCisgICAgICAgICAg
ICBQYXRoUXVhZEN1cnZlVG8sCisgICAgICAgICAgICBQYXRoQmV6aWVyQ3VydmVUbywKKyAgICAg
ICAgICAgIFBhdGhDbG9zZVN1YnBhdGgsCisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IE1v
dmVUbyB7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9lbmQ7CisgICAgICAgIH07CisKKyAgICAg
ICAgc3RydWN0IExpbmVUbyB7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9lbmQ7CisgICAgICAg
IH07CisKKyAgICAgICAgc3RydWN0IEFyY1RvIHsKKyAgICAgICAgICAgIFBhdGhQb2ludCBtX2Vu
ZDsKKyAgICAgICAgICAgIFBhdGhQb2ludCBtX2NlbnRlcjsKKyAgICAgICAgICAgIFBhdGhQb2lu
dCBtX3JhZGl1czsKKyAgICAgICAgICAgIGJvb2wgbV9jbG9ja3dpc2U7CisgICAgICAgIH07CisK
KyAgICAgICAgc3RydWN0IFF1YWRDdXJ2ZVRvIHsKKyAgICAgICAgICAgIFBhdGhQb2ludCBtX3Bv
aW50MDsKKyAgICAgICAgICAgIFBhdGhQb2ludCBtX3BvaW50MTsKKyAgICAgICAgfTsKKworICAg
ICAgICBzdHJ1Y3QgQmV6aWVyQ3VydmVUbyB7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2lu
dDA7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDE7CisgICAgICAgICAgICBQYXRoUG9p
bnQgbV9wb2ludDI7CisgICAgICAgIH07CisKKyAgICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudCgp
OiBtX3R5cGUoUGF0aENsb3NlU3VicGF0aCkgeyBtX2RhdGEubV9wb2ludHNbMF0uc2V0KDAsIDAp
OyAgICB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgTW92ZVRvJiBkYXRhKTog
bV90eXBlKFBhdGhNb3ZlVG8pIHsgbV9kYXRhLm1fbW92ZVRvRGF0YSA9IGRhdGE7IH0KKyAgICAg
ICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25zdCBMaW5lVG8mIGRhdGEpOiBtX3R5cGUoUGF0aExp
bmVUbykgeyBtX2RhdGEubV9saW5lVG9EYXRhID0gZGF0YTsgfQorICAgICAgICBQbGF0Zm9ybVBh
dGhFbGVtZW50KGNvbnN0IEFyY1RvJiBkYXRhKTogbV90eXBlKFBhdGhBcmNUbykgeyBtX2RhdGEu
bV9hcmNUb0RhdGEgPSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3Qg
UXVhZEN1cnZlVG8mIGRhdGEpOiBtX3R5cGUoUGF0aFF1YWRDdXJ2ZVRvKSB7IG1fZGF0YS5tX3F1
YWRDdXJ2ZVRvRGF0YSA9IGRhdGE7IH0KKyAgICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25z
dCBCZXppZXJDdXJ2ZVRvJiBkYXRhKTogbV90eXBlKFBhdGhCZXppZXJDdXJ2ZVRvKSB7IG1fZGF0
YS5tX2JlemllckN1cnZlVG9EYXRhID0gZGF0YTsgfQorCisgICAgICAgIGNvbnN0IE1vdmVUbyYg
bW92ZVRvKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm1fbW92ZVRvRGF0YTsgfQorICAgICAgICBj
b25zdCBMaW5lVG8mIGxpbmVUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX2xpbmVUb0RhdGE7
IH0KKyAgICAgICAgY29uc3QgQXJjVG8mIGFyY1RvKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm1f
YXJjVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IFF1YWRDdXJ2ZVRvJiBxdWFkQ3VydmVUbygpIGNv
bnN0IHsgcmV0dXJuIG1fZGF0YS5tX3F1YWRDdXJ2ZVRvRGF0YTsgfQorICAgICAgICBjb25zdCBC
ZXppZXJDdXJ2ZVRvJiBiZXppZXJDdXJ2ZVRvKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm1fYmV6
aWVyQ3VydmVUb0RhdGE7IH0KKyAgICAgICAgY29uc3QgUGF0aFBvaW50JiBsYXN0UG9pbnQoKSBj
b25zdAorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IG51bVBvaW50cygpOworICAgICAg
ICAgICAgcmV0dXJuIG4gPiAxID8gbV9kYXRhLm1fcG9pbnRzW24gLSAxXSA6IG1fZGF0YS5tX3Bv
aW50c1swXTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBQYXRoUG9pbnQmIHBvaW50QXQoaW50
IGluZGV4KSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9wb2ludHNbaW5kZXhdOyB9CisgICAgICAg
IGludCBudW1Qb2ludHMoKSBjb25zdDsKKyAgICAgICAgaW50IG51bUNvbnRyb2xQb2ludHMoKSBj
b25zdDsKKyAgICAgICAgdm9pZCBtb3ZlKGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0KTsKKyAgICAg
ICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpOworICAgICAg
ICBQYXRoRWxlbWVudFR5cGUgdHlwZSgpIGNvbnN0OworICAgICAgICBQbGFmb3JtUGF0aEVsZW1l
bnRUeXBlIHBsYXRmb3JtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQorICAgICAgICB2
b2lkIGluZmxhdGVSZWN0VG9Db250YWluTWUoRmxvYXRSZWN0JiByLCBjb25zdCBGbG9hdFBvaW50
JiBsYXN0UG9pbnQpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUGxhZm9ybVBhdGhF
bGVtZW50VHlwZSBtX3R5cGU7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIE1vdmVUbyBt
X21vdmVUb0RhdGE7CisgICAgICAgICAgICBMaW5lVG8gbV9saW5lVG9EYXRhOworICAgICAgICAg
ICAgQXJjVG8gbV9hcmNUb0RhdGE7CisgICAgICAgICAgICBRdWFkQ3VydmVUbyBtX3F1YWRDdXJ2
ZVRvRGF0YTsKKyAgICAgICAgICAgIEJlemllckN1cnZlVG8gbV9iZXppZXJDdXJ2ZVRvRGF0YTsK
KyAgICAgICAgICAgIFBhdGhQb2ludCBtX3BvaW50c1s0XTsKKyAgICAgICAgfSBtX2RhdGE7Cisg
ICAgfTsKKworICAgIHR5cGVkZWYgVmVjdG9yPFBsYXRmb3JtUGF0aEVsZW1lbnQ+IFBsYXRmb3Jt
UGF0aEVsZW1lbnRzOworCisgICAgY2xhc3MgUGxhdGZvcm1QYXRoIHsKKyAgICBwdWJsaWM6Cisg
ICAgICAgIFBsYXRmb3JtUGF0aCgpOworICAgICAgICBjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50
cyYgZWxlbWVudHMoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRzOyB9CisgICAgICAgIHZvaWQg
YXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQmIGUpOworICAgICAgICB2b2lkIGFwcGVu
ZChjb25zdCBQbGF0Zm9ybVBhdGgmIHApOworICAgICAgICB2b2lkIGNsZWFyKCk7CisgICAgICAg
IGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudHMuaXNFbXB0eSgpOyB9CisK
KyAgICAgICAgdm9pZCBzdHJva2VQYXRoKEhEQywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgq
IHRyKSBjb25zdDsKKyAgICAgICAgdm9pZCBmaWxsUGF0aChIREMsIGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4KiB0cikgY29uc3Q7CisgICAgICAgIEZsb2F0UG9pbnQgbGFzdFBvaW50KCkgY29u
c3QgeyByZXR1cm4gbV9lbGVtZW50cy5pc0VtcHR5KCkgPyBGbG9hdFBvaW50KDAsIDApIDogbV9l
bGVtZW50cy5sYXN0KCkubGFzdFBvaW50KCk7IH0KKworICAgICAgICBjb25zdCBGbG9hdFJlY3Qm
IGJvdW5kaW5nUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fYm91bmRpbmdSZWN0OyB9CisgICAgICAg
IGJvb2wgY29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIFdpbmRSdWxlIHJ1bGUpIGNv
bnN0OworICAgICAgICB2b2lkIHRyYW5zbGF0ZShjb25zdCBGbG9hdFNpemUmIHNpemUpOworICAg
ICAgICB2b2lkIHRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisKKyAg
ICAgICAgdm9pZCBtb3ZlVG8oY29uc3QgRmxvYXRQb2ludCYpOworICAgICAgICB2b2lkIGFkZExp
bmVUbyhjb25zdCBGbG9hdFBvaW50Jik7CisgICAgICAgIHZvaWQgYWRkUXVhZEN1cnZlVG8oY29u
c3QgRmxvYXRQb2ludCYgY29udHJvbFBvaW50LCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCk7Cisg
ICAgICAgIHZvaWQgYWRkQmV6aWVyQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjb250cm9sUG9p
bnQxLCBjb25zdCBGbG9hdFBvaW50JiBjb250cm9sUG9pbnQyLCBjb25zdCBGbG9hdFBvaW50Jik7
CisgICAgICAgIHZvaWQgYWRkQXJjVG8oY29uc3QgRmxvYXRQb2ludCYsIGNvbnN0IEZsb2F0UG9p
bnQmLCBmbG9hdCByYWRpdXMpOworICAgICAgICB2b2lkIGNsb3NlU3VicGF0aCgpOworICAgICAg
ICB2b2lkIGFkZEVsbGlwc2UoY29uc3QgRmxvYXRQb2ludCYgcCwgZmxvYXQgYSwgZmxvYXQgYiwg
ZmxvYXQgc2FyLCBmbG9hdCBlYXIsIGJvb2wgYW50aWNsb2Nrd2lzZSk7CisgICAgICAgIHZvaWQg
YWRkUmVjdChjb25zdCBGbG9hdFJlY3QmIHIpOworICAgICAgICB2b2lkIGFkZEVsbGlwc2UoY29u
c3QgRmxvYXRSZWN0JiByKTsKKyAgICAgICAgU3RyaW5nIGRlYnVnU3RyaW5nKCkgY29uc3Q7Cisg
ICAgICAgIHZvaWQgYXBwbHkodm9pZCogaW5mbywgUGF0aEFwcGxpZXJGdW5jdGlvbiBmdW5jdGlv
bikgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIGVuc3VyZVN1YnBhdGgoKTsK
KyAgICAgICAgdm9pZCBhZGRUb1N1YnBhdGgoY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudCYgZSk7
CisKKyAgICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudHMgbV9lbGVtZW50czsKKyAgICAgICAgRmxv
YXRSZWN0IG1fYm91bmRpbmdSZWN0OworICAgICAgICBWZWN0b3I8UGF0aFBvbHlnb24+IG1fc3Vi
cGF0aHM7CisgICAgICAgIFBhdGhQb2ludCBtX2N1cnJlbnRQb2ludDsKKyAgICAgICAgYm9vbCBt
X3BlbkxpZnRlZDsKKyAgICB9OworCit9CisKKyNlbmRpZiAvLyBQbGF0Zm9ybVBhdGhXaW5jZV9o
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34400</attachid>
            <date>2009-08-08 13:53:55 -0700</date>
            <delta_ts>2009-08-14 14:14:38 -0700</delta_ts>
            <desc>7) Image ImageSource</desc>
            <filename>27511_7.patch</filename>
            <type>text/plain</type>
            <size>15228</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uMTUzZWZmYSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNSBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEltYWdlU291cmNlIGFuZCBJbWFnZQorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1MTEKKworICAgICAg
ICBXcml0dGVuIGJ5IEdlb3JnZSBTdGFpa29zIGFuZCBZb25nIExpCisKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVNvdXJjZVdpbmNlLmNwcDogQWRkZWQuCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5jZS5jcHA6IEFkZGVkLgorCiAyMDA5
LTA4LTA2ICBZb25nIExpICA8eW9uZy5saUB0b3JjaG1vYmlsZS5jb20+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL0ltYWdlU291cmNlV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9JbWFnZVNvdXJjZVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi5hMzZjY2JkCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9JbWFnZVNvdXJjZVdpbmNlLmNwcApAQCAtMCwwICsxLDIzNiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscC50b2tlckBjb2xs
YWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIElu
YworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09N
UFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZVNvdXJjZS5o
IgorCisjaW5jbHVkZSAiR0lGSW1hZ2VEZWNvZGVyLmgiCisjaW5jbHVkZSAiSW1hZ2VEZWNvZGVy
LmgiCisjaW5jbHVkZSAiSlBFR0ltYWdlRGVjb2Rlci5oIgorI2luY2x1ZGUgIlBOR0ltYWdlRGVj
b2Rlci5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIu
aD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK3R5cGVkZWYgSGFzaFNldDxTaGFyZWRCaXRtYXAqPiBCaXRt
YXBNYXA7CitleHRlcm4gQml0bWFwTWFwIGdfYml0bWFwTWFwOworCitpbnQgZGlzY2FyZEJpdG1h
cEhhbmRsZXMoKQoreworICAgIGludCBkZWxldGVkID0gMDsKKyAgICBmb3IgKEJpdG1hcE1hcDo6
aXRlcmF0b3IgaSA9IGdfYml0bWFwTWFwLmJlZ2luKCk7IGkgIT0gZ19iaXRtYXBNYXAuZW5kKCk7
ICsraSkgeworICAgICAgICBpZiAoKCppKS0+ZnJlZU1lbW9yeSgpKQorICAgICAgICAgICAgKytk
ZWxldGVkOworICAgIH0KKyAgICByZXR1cm4gZGVsZXRlZDsKK30KKworc3RhdGljIEltYWdlRGVj
b2RlciogY3JlYXRlRGVjb2Rlcihjb25zdCBTaGFyZWRCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBN
ZW1vcnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOworCisgICAgLy8gV2UgbmVlZCBhdCBsZWFz
dCA0IGJ5dGVzIHRvIGZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIGltYWdlIHdlJ3JlIGRlYWxpbmcg
d2l0aC4KKyAgICBTaGFyZWRCdWZmZXJTZWdtZW50IHNlZ21lbnQoKmJ1ZmZlcik7CisgICAgaW50
IGxlbmd0aCA9IHNlZ21lbnQubGVuZ3RoKCk7CisgICAgaWYgKGxlbmd0aCA8IDQpCisgICAgICAg
IHJldHVybiAwOworCisgICAgLy8gR0lGcyBiZWdpbiB3aXRoIEdJRjgoNyBvciA5KS4KKyAgICBp
ZiAoc3RybmNtcChzZWdtZW50LmRhdGEoKSwgIkdJRjgiLCA0KSA9PSAwKSB7CisgICAgICAgIEdJ
RkltYWdlRGVjb2RlciogcnRuID0gbmV3IEdJRkltYWdlRGVjb2RlcigpOworICAgICAgICBpZiAo
cnRuKQorICAgICAgICAgICAgcnRuLT5zZXRNYXhOdW1QaXhlbHMoMTAyNCAqIDEwMjQpOworICAg
ICAgICByZXR1cm4gcnRuOworICAgIH0KKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHVDb250
ZW50cyA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilzZWdtZW50LmRhdGEoKTsKKworICAgIC8vIFRl
c3QgZm9yIFBORy4KKyAgICBpZiAodUNvbnRlbnRzWzBdID09IDB4ODkgJiYgdUNvbnRlbnRzWzFd
ID09IDB4NTAgJiYgdUNvbnRlbnRzWzJdID09IDB4NEUgJiYgdUNvbnRlbnRzWzNdID09IDB4NDcg
KSB7CisgICAgICAgIFBOR0ltYWdlRGVjb2RlciogcnRuID0gbmV3IFBOR0ltYWdlRGVjb2Rlcigp
OworICAgICAgICBpZiAocnRuKQorICAgICAgICAgICAgcnRuLT5zZXRNYXhOdW1QaXhlbHMoMTAy
NCAqIDEwMjQpOworICAgICAgICByZXR1cm4gcnRuOworICAgIH0KKworICAgIC8vIEpQRUcKKyAg
ICBpZiAodUNvbnRlbnRzWzBdID09IDB4RkYgJiYgdUNvbnRlbnRzWzFdID09IDB4RDggJiYgdUNv
bnRlbnRzWzJdID09IDB4RkYpIHsKKyAgICAgICAgSlBFR0ltYWdlRGVjb2RlciogcnRuID0gbmV3
IEpQRUdJbWFnZURlY29kZXIoKTsKKyAgICAgICAgaWYgKHJ0bikKKyAgICAgICAgICAgIHJ0bi0+
c2V0TWF4TnVtUGl4ZWxzKDEwMjQgKiAxMDI0KTsKKyAgICAgICAgcmV0dXJuIHJ0bjsKKyAgICB9
CisKKyAgICAvLyBGSVhNRTogbm90IHN1cHBvcnRpbmcgQk1QLCBJQ08gYW5kIFhCTSBmb3Igbm93
LgorCisgICAgLy8gR2l2ZSB1cC4gV2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBoZWNrIHRoaXMgaXMu
CisgICAgcmV0dXJuIDA7Cit9CisKK0ltYWdlU291cmNlOjpJbWFnZVNvdXJjZSgpCisgICAgOiBt
X2RlY29kZXIoMCkKK3sKK30KKworSW1hZ2VTb3VyY2U6On5JbWFnZVNvdXJjZSgpCit7CisgICAg
ZGVsZXRlIG1fZGVjb2RlcjsKK30KKwordm9pZCBJbWFnZVNvdXJjZTo6Y2xlYXIoYm9vbCBkZXN0
cm95QWxsLCBzaXplX3QgY2xlYXJCZWZvcmVGcmFtZSwgU2hhcmVkQnVmZmVyKiBkYXRhLCBib29s
IGFsbERhdGFSZWNlaXZlZCkKK3sKKyAgICBpZiAoZGVzdHJveUFsbCkgeworICAgICAgICBkZWxl
dGUgbV9kZWNvZGVyOworICAgICAgICBtX2RlY29kZXIgPSAwOworICAgICAgICBpZiAoZGF0YSkK
KyAgICAgICAgICBzZXREYXRhKGRhdGEsIGFsbERhdGFSZWNlaXZlZCk7CisgICAgfSBlbHNlIGlm
IChtX2RlY29kZXIpCisgICAgICAgIG1fZGVjb2Rlci0+Y2xlYXJGcmFtZUJ1ZmZlckNhY2hlKGNs
ZWFyQmVmb3JlRnJhbWUpOworfQorCitib29sIEltYWdlU291cmNlOjppbml0aWFsaXplZCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuICEhbV9kZWNvZGVyOworfQorCit2b2lkIEltYWdlU291cmNlOjpz
ZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpCit7CisgICAg
Ly8gTWFrZSB0aGUgZGVjb2RlciBieSBzbmlmZmluZyB0aGUgYnl0ZXMuCisgICAgLy8gVGhpcyBt
ZXRob2Qgd2lsbCBleGFtaW5lIHRoZSBkYXRhIGFuZCBpbnN0YW50aWF0ZSBhbiBpbnN0YW5jZSBv
ZiB0aGUgYXBwcm9wcmlhdGUgZGVjb2RlciBwbHVnaW4uCisgICAgLy8gSWYgaW5zdWZmaWNpZW50
IGJ5dGVzIGFyZSBhdmFpbGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBpbWFnZSB0eXBlLCBubyBkZWNv
ZGVyIHBsdWdpbiB3aWxsIGJlCisgICAgLy8gbWFkZS4KKyAgICBpZiAoYWxsRGF0YVJlY2VpdmVk
ICYmICFtX2RlY29kZXIpCisgICAgICAgIG1fZGVjb2RlciA9IGNyZWF0ZURlY29kZXIoZGF0YSk7
CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybjsKKyAgICBtX2RlY29kZXItPnNl
dERhdGEoZGF0YSwgYWxsRGF0YVJlY2VpdmVkKTsKK30KKworYm9vbCBJbWFnZVNvdXJjZTo6aXNT
aXplQXZhaWxhYmxlKCkKK3sKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgcmV0dXJuIG1fZGVjb2Rlci0+aXNTaXplQXZhaWxhYmxlKCk7Cit9CisKK0lu
dFNpemUgSW1hZ2VTb3VyY2U6OnNpemUoKSBjb25zdAoreworICAgIGlmICghbV9kZWNvZGVyKQor
ICAgICAgICByZXR1cm4gSW50U2l6ZSgpOworCisgICAgcmV0dXJuIG1fZGVjb2Rlci0+c2l6ZSgp
OworfQorCitpbnQgSW1hZ2VTb3VyY2U6OnJlcGV0aXRpb25Db3VudCgpCit7CisgICAgaWYgKCFt
X2RlY29kZXIpCisgICAgICAgIHJldHVybiBjQW5pbWF0aW9uTm9uZTsKKworICAgIHJldHVybiBt
X2RlY29kZXItPnJlcGV0aXRpb25Db3VudCgpOworfQorCitzaXplX3QgSW1hZ2VTb3VyY2U6OmZy
YW1lQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtX2RlY29kZXIgPyBtX2RlY29kZXItPmZy
YW1lQ291bnQoKSA6IDA7Cit9CisKK05hdGl2ZUltYWdlUHRyIEltYWdlU291cmNlOjpjcmVhdGVG
cmFtZUF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIEltYWdlRnJhbWVTaW5rKiBidWZmZXIgPSBtX2RlY29kZXItPmZy
YW1lQnVmZmVyQXRJbmRleChpbmRleCk7CisKKyAgICBpZiAoIWJ1ZmZlciB8fCBidWZmZXItPnN0
YXR1cygpID09IFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICByZXR1cm4gYnVmZmVyLT5nZXRGcmFtZSgpOworfQorCitib29sIEltYWdlU291cmNlOjpm
cmFtZUlzQ29tcGxldGVBdEluZGV4KHNpemVfdCBpbmRleCkKK3sKKyAgICBpZiAoIW1fZGVjb2Rl
cikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9
IG1fZGVjb2Rlci0+ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKyAgICByZXR1cm4gYnVmZmVy
ICYmIGJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlOworfQor
CitmbG9hdCBJbWFnZVNvdXJjZTo6ZnJhbWVEdXJhdGlvbkF0SW5kZXgoc2l6ZV90IGluZGV4KQor
eworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZsb2F0IGR1
cmF0aW9uOworCisgICAgSW1hZ2VGcmFtZVNpbmsqIGJ1ZmZlciA9IG1fZGVjb2Rlci0+ZnJhbWVC
dWZmZXJBdEluZGV4KGluZGV4KTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBkdXJhdGlvbiA9IGJ1ZmZlci0+ZHVyYXRpb24oKSAvIDEwMDAuMGY7CisKKyAgICAv
LyBNYW55IGFubm95aW5nIGFkcyBzcGVjaWZ5IGEgMCBkdXJhdGlvbiB0byBtYWtlIGFuIGltYWdl
IGZsYXNoIGFzIHF1aWNrbHkKKyAgICAvLyBhcyBwb3NzaWJsZS4gIFdlIGZvbGxvdyBXaW5JRSdz
IGJlaGF2aW9yIGFuZCB1c2UgYSBkdXJhdGlvbiBvZiAxMDAgbXMKKyAgICAvLyBmb3IgYW55IGZy
YW1lcyB0aGF0IHNwZWNpZnkgYSBkdXJhdGlvbiBvZiA8PSA1MCBtcy4gIFNlZQorICAgIC8vIDxo
dHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDQxMz4gb3IgUmFkYXIgNDA1
MTM4OSBmb3IKKyAgICAvLyBtb3JlLgorICAgIHJldHVybiAoZHVyYXRpb24gPCAwLjA1MWYpID8g
MC4xMDBmIDogZHVyYXRpb247Cit9CisKK2Jvb2wgSW1hZ2VTb3VyY2U6OmZyYW1lSGFzQWxwaGFB
dEluZGV4KHNpemVfdCBpbmRleCkKK3sKKyAgICBpZiAoIW1fZGVjb2RlciB8fCAhbV9kZWNvZGVy
LT5zdXBwb3J0c0FscGhhKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEltYWdlRnJh
bWVTaW5rKiBidWZmZXIgPSBtX2RlY29kZXItPmZyYW1lQnVmZmVyQXRJbmRleChpbmRleCk7Cisg
ICAgaWYgKCFidWZmZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBidWZm
ZXItPmhhc0FscGhhKCk7Cit9CisKK0ludFNpemUgSW1hZ2VTb3VyY2U6OmZyYW1lU2l6ZUF0SW5k
ZXgoc2l6ZV90KSBjb25zdAoreworICAgIHJldHVybiBzaXplKCk7Cit9CisKK1N0cmluZyBJbWFn
ZVNvdXJjZTo6ZmlsZW5hbWVFeHRlbnNpb24oKSBjb25zdAoreworICAgIGlmICghbV9kZWNvZGVy
KQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgcmV0dXJuIG1fZGVjb2Rlci0+ZmlsZW5h
bWVFeHRlbnNpb24oKTsKK30KKworfQorCisvLyB2aW06IHRzPTQgc3c9NCBldApkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVdpbmNlLmNwcCBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmNzdhMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5jZS5jcHAKQEAgLTAsMCArMSwyMjcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRF
UiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisKKyNpbmNsdWRl
ICJCaXRtYXBJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
Ik5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRl
ICJTaGFyZWRCdWZmZXIuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2lu
Y2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworc3RhdGljIGlu
bGluZSBpbnQgc3RhYmxlUm91bmQoZG91YmxlIGQpCit7CisgICAgaWYgKGQgPiAwKQorICAgICAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkICsgMC41KTsKKworICAgIGludCBpID0gc3RhdGlj
X2Nhc3Q8aW50PihkKTsKKyAgICByZXR1cm4gaSAtIGQgPiAwLjUgPyBpIC0gMSA6IGk7Cit9CisK
Ky8vIFRoaXMgZnVuY3Rpb24gbG9hZHMgcmVzb3VyY2VzIGZyb20gV2ViS2l0CitQYXNzUmVmUHRy
PFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gbG9hZFJlc291cmNlSW50b0J1ZmZlcihjb25zdCBjaGFy
KiBuYW1lKTsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitib29sIEZyYW1lRGF0YTo6Y2xlYXIo
Ym9vbCBjbGVhck1ldGFEYXRhKQoreworICAgIGlmIChjbGVhck1ldGFEYXRhKQorICAgICAgICBt
X2hhdmVNZXRhZGF0YSA9IGZhbHNlOworCisgICAgaWYgKG1fZnJhbWUpIHsKKyAgICAgICAgbV9m
cmFtZSA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxz
ZTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6aW5pdFBsYXRmb3JtRGF0YSgpCit7Cit9CisKK3Zv
aWQgQml0bWFwSW1hZ2U6OmludmFsaWRhdGVQbGF0Zm9ybURhdGEoKQoreworfQorCitib29sIEJp
dG1hcEltYWdlOjpnZXRIQklUTUFQKEhCSVRNQVAgYm1wKQoreworICAgIHJldHVybiBnZXRIQklU
TUFQT2ZTaXplKGJtcCwgMCk7Cit9CisKK2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNp
emUoSEJJVE1BUCBibXAsIExQU0laRSBzaXplKQoreworICAgIGlmICghYm1wKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBCSVRNQVAgYm1wSW5mbzsKKyAgICBHZXRPYmplY3QoYm1wLCBz
aXplb2YoQklUTUFQKSwgJmJtcEluZm8pOworCisgICAgQVNTRVJUKGJtcEluZm8uYm1CaXRzUGl4
ZWwgPT0gMzIpOworICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMgKiBi
bXBJbmZvLmJtSGVpZ2h0OworCisgICAgT3duUHRyPEhEQz4gaGRjKENyZWF0ZUNvbXBhdGlibGVE
QygwKSk7CisgICAgSEdESU9CSiBoT2xkQm1wID0gU2VsZWN0T2JqZWN0KGhkYy5nZXQoKSwgYm1w
KTsKKworICAgIHsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0IGdjKGhkYy5nZXQoKSk7CisKKyAg
ICAgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOworICAgICAgICBp
ZiAoc2l6ZSkKKyAgICAgICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSgmZ2MsIEZs
b2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBJbnRTaXpl
KCpzaXplKSwgQ29tcG9zaXRlQ29weSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRyYXco
JmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwg
RmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBD
b21wb3NpdGVDb3B5KTsKKyAgICB9CisKKyAgICBTZWxlY3RPYmplY3QoaGRjLmdldCgpLCBoT2xk
Qm1wKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJh
bWVNYXRjaGluZ1NvdXJjZVNpemUoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJl
Y3QmIGRzdFJlY3QsIGNvbnN0IEludFNpemUmIHNyY1NpemUsIENvbXBvc2l0ZU9wZXJhdG9yIGNv
bXBvc2l0ZU9wKQoreworICAgIGludCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7CisgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAgICBSZWZQdHI8U2hhcmVkQml0bWFw
PiBibXAgPSBmcmFtZUF0SW5kZXgoaSk7CisgICAgICAgIGlmIChibXAgJiYgYm1wLT5oZWlnaHQo
KSA9PSAoc2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgYm1wLT53aWR0aCgpID09IChzaXplX3Qp
c3JjU2l6ZS53aWR0aCgpKSB7CisgICAgICAgICAgICBzaXplX3QgY3VycmVudEZyYW1lID0gbV9j
dXJyZW50RnJhbWU7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGk7CisgICAgICAgICAg
ICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBzcmNTaXplLndpZHRoKCksIHNy
Y1NpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFt
ZSA9IGN1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0K
KworICAgIC8vIE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0IHNpemUgd2FzIGZvdW5kLCBmYWxsYmFj
ayB0byBkcmF3aW5nIHRoZSBjdXJyZW50IGZyYW1lCisgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBC
aXRtYXBJbWFnZTo6c2l6ZSgpOworICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAs
IDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7
Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25z
dCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdEluLCBDb21wb3Np
dGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fc291cmNlLmluaXRpYWxpemVk
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHN0YXJ0QW5pbWF0aW9uKCk7CisKKyAgICBpZiAo
bWF5RmlsbFdpdGhTb2xpZENvbG9yKCkpIHsKKyAgICAgICAgZmlsbFdpdGhTb2xpZENvbG9yKGN0
eHQsIGRzdFJlY3QsIHNvbGlkQ29sb3IoKSwgY29tcG9zaXRlT3ApOworICAgICAgICByZXR1cm47
CisgICAgfQorICAgIAorICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCA9IGZyYW1lQXRJbmRl
eChtX2N1cnJlbnRGcmFtZSk7CisKKyAgICBJbnRSZWN0IGludFNyY1JlY3Qoc3JjUmVjdEluKTsK
KyAgICBpZiAoYm1wLT53aWR0aCgpICE9IG1fc291cmNlLnNpemUoKS53aWR0aCgpKSB7CisgICAg
ICAgIGRvdWJsZSByYXRlID0gKGRvdWJsZSlibXAtPndpZHRoKCkgLyBtX3NvdXJjZS5zaXplKCku
d2lkdGgoKTsKKyAgICAgICAgaW50IHRlbXAgPSBzdGFibGVSb3VuZChzcmNSZWN0SW4ucmlnaHQo
KSAqIHJhdGUpOworICAgICAgICBpbnRTcmNSZWN0LnNldFgoc3RhYmxlUm91bmQoc3JjUmVjdElu
LngoKSAqIHJhdGUpKTsKKyAgICAgICAgaW50U3JjUmVjdC5zZXRXaWR0aCh0ZW1wIC0gaW50U3Jj
UmVjdC54KCkpOworICAgICAgICB0ZW1wID0gc3RhYmxlUm91bmQoc3JjUmVjdEluLmJvdHRvbSgp
ICogcmF0ZSk7CisgICAgICAgIGludFNyY1JlY3Quc2V0WShzdGFibGVSb3VuZChzcmNSZWN0SW4u
eSgpICogcmF0ZSkpOworICAgICAgICBpbnRTcmNSZWN0LnNldEhlaWdodCh0ZW1wIC0gaW50U3Jj
UmVjdC55KCkpOworICAgIH0KKworICAgIGJtcC0+ZHJhdyhjdHh0LCBlbmNsb3NpbmdJbnRSZWN0
KGRzdFJlY3QpLCBpbnRTcmNSZWN0LCBjb21wb3NpdGVPcCk7Cit9CisKK1Bhc3NSZWZQdHI8SW1h
Z2U+IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShjb25zdCBjaGFyICpuYW1lKQoreworICAg
IFJlZlB0cjxTaGFyZWRCdWZmZXI+IGJ1ZmZlciA9IGxvYWRSZXNvdXJjZUludG9CdWZmZXIobmFt
ZSk7CisgICAgUmVmUHRyPEJpdG1hcEltYWdlPiBpbWcgPSBCaXRtYXBJbWFnZTo6Y3JlYXRlKCk7
CisgICAgaW1nLT5zZXREYXRhKGJ1ZmZlci5yZWxlYXNlKCksIHRydWUpOworICAgIHJldHVybiBp
bWc7Cit9CisKK3ZvaWQgSW1hZ2U6OmRyYXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCogY3R4dCwg
Y29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdCwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHBh
dHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50
JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3Qp
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhd1Bh
dHRlcm4oR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4s
IGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9y
IG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KQoreworICAgIFJlZlB0cjxTaGFyZWRCaXRt
YXA+IGJtcCA9IG5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAgaWYgKGJtcCkKKyAg
ICAgICAgYm1wLT5kcmF3UGF0dGVybihjdHh0LCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNmb3Jt
LCBwaGFzZSwgb3AsIGRlc3RSZWN0LCBtX3NvdXJjZS5zaXplKCkpOworfQorCit2b2lkIEJpdG1h
cEltYWdlOjpjaGVja0ZvclNvbGlkQ29sb3IoKQoreworICAgIGlmIChtX2NoZWNrZWRGb3JTb2xp
ZENvbG9yKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZnJhbWVDb3VudCgpICE9IDEpIHsK
KyAgICAgICAgbV9pc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgbV9jaGVja2VkRm9yU29s
aWRDb2xvciA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSZWZQdHI8U2hh
cmVkQml0bWFwPiBibXAgPSBmcmFtZUF0SW5kZXgoMCk7CisgICAgaWYgKCFibXAgfHwgIWJtcC0+
dmFsaWRIZWlnaHQoKSkgeworICAgICAgICBtX2lzU29saWRDb2xvciA9IGZhbHNlOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGJtcC0+d2lkdGgoKSA9PSAxICYmIGJtcC0+dmFs
aWRIZWlnaHQoKSA9PSAxKSB7CisgICAgICAgIG1faXNTb2xpZENvbG9yID0gdHJ1ZTsKKworICAg
ICAgICBpZiAoYm1wLT5pczE2Yml0KCkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGMg
PSAoKHVuc2lnbmVkIHNob3J0ICopYm1wLT5ieXRlcygpKVswXTsKKyNpZiBJTUFHRV9OT19BTFBI
QV9VU0VfUkdCNTU1CisgICAgICAgICAgICBpbnQgciA9IChjID4+IDcpICYgMHhGODsKKyAgICAg
ICAgICAgIGludCBnID0gKGMgPj4gMikgJiAweEY4OworICAgICAgICAgICAgaW50IGIgPSAoYyA8
PCAzKSAmIDB4Rjg7CisjZWxzZQorICAgICAgICAgICAgaW50IHIgPSAoYyA+PiA4KSAmIDB4Rjg7
CisgICAgICAgICAgICBpbnQgZyA9IChjID4+IDMpICYgMHhGQzsKKyAgICAgICAgICAgIGludCBi
ID0gKGMgPDwgMykgJiAweEY4OworI2VuZGlmCisgICAgICAgICAgICBpZiAoYm1wLT51c2VzVHJh
bnNwYXJlbnRDb2xvcigpICYmIGJtcC0+dHJhbnNwYXJlbnRDb2xvcigpID09IFJHQihyLCBnLCBi
KSkKKyAgICAgICAgICAgICAgICBtX3NvbGlkQ29sb3IgPSBDb2xvcihyLCBnLCBiLCAwKTsKKyAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX3NvbGlkQ29sb3IgPSBDb2xvcihyLCBn
LCBiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGMgPSAoKHVuc2ln
bmVkICopYm1wLT5ieXRlcygpKVswXTsKKyAgICAgICAgICAgIG1fc29saWRDb2xvciA9IENvbG9y
KGMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJtcC0+dmFsaWRIZWlnaHQoKSA9PSBibXAt
PmhlaWdodCgpKQorICAgICAgICAgICAgbV9jaGVja2VkRm9yU29saWRDb2xvciA9IHRydWU7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgbV9pc1NvbGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgbV9j
aGVja2VkRm9yU29saWRDb2xvciA9IHRydWU7CisgICAgfQorfQorCisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUK
</data>
<flag name="review"
          id="18580"
          type_id="1"
          status="-"
          setter="manyoso"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34401</attachid>
            <date>2009-08-08 13:54:27 -0700</date>
            <delta_ts>2009-09-02 09:55:23 -0700</delta_ts>
            <desc>8) Color Gradient</desc>
            <filename>27511_8.patch</filename>
            <type>text/plain</type>
            <size>3717</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MTUzZWZmYS4uYjUyMDlmYSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTIsNiArMiwxNiBAQAogCiAgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgogCisgICAgICAgIFdJTkNFIFBPUlQ6IENvbG9yIGFuZCBHcmFkaWVudAor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1MTEKKwor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0NvbG9yV2luY2UuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVudFdpbmNlLmNwcDogQWRk
ZWQuCisKKzIwMDktMDgtMDggIFlvbmcgTGkgIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwogICAgICAgICBXSU5DRSBQT1JU
OiBJbWFnZVNvdXJjZSBhbmQgSW1hZ2UKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTI3NTExCiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvQ29sb3JXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL0NvbG9yV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgy
MGI5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0NvbG9yV2luY2UuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAy
MDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor
ICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiQ29sb3IuaCIKKworI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgi
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ29sb3IgZm9jdXNSaW5nQ29sb3IoKQoreworICAg
IHJldHVybiBDb2xvcigwLCAwLCAwKTsKK30KKwordm9pZCBzZXRGb2N1c1JpbmdDb2xvckNoYW5n
ZUZ1bmN0aW9uKHZvaWQgKCopKCkpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9HcmFkaWVudFdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvR3JhZGllbnRXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
NDlmYTk3MAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvR3JhZGllbnRXaW5jZS5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAg
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8K
KworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhZGllbnQuaCIKKworI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgR3Jh
ZGllbnQ6OnBsYXRmb3JtRGVzdHJveSgpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjb21w
YXJlU3RvcHMoY29uc3QgR3JhZGllbnQ6OkNvbG9yU3RvcCYgYSwgY29uc3QgR3JhZGllbnQ6OkNv
bG9yU3RvcCYgYikKK3sKKyAgICByZXR1cm4gYS5zdG9wIDwgYi5zdG9wOworfQorCitjb25zdCBW
ZWN0b3I8R3JhZGllbnQ6OkNvbG9yU3RvcD4mIEdyYWRpZW50OjpnZXRTdG9wcygpIGNvbnN0Cit7
CisgICAgaWYgKCFtX3N0b3BzU29ydGVkKSB7CisgICAgICAgIGlmIChtX3N0b3BzLnNpemUoKSkK
KyAgICAgICAgICAgIHN0ZDo6c3RhYmxlX3NvcnQobV9zdG9wcy5iZWdpbigpLCBtX3N0b3BzLmVu
ZCgpLCBjb21wYXJlU3RvcHMpOworICAgICAgICBtX3N0b3BzU29ydGVkID0gdHJ1ZTsKKyAgICB9
CisgICAgcmV0dXJuIG1fc3RvcHM7Cit9CisKK3ZvaWQgR3JhZGllbnQ6OmZpbGwoR3JhcGhpY3ND
b250ZXh0KiBjLCBjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAgYy0+ZmlsbFJlY3QociwgdGhp
cyk7Cit9CisKK30K
</data>

          </attachment>
      

    </bug>

</bugzilla>