<?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>41381</bug_id>
          
          <creation_ts>2010-06-29 16:24:55 -0700</creation_ts>
          <short_desc>Need to track texture completeness</short_desc>
          <delta_ts>2010-07-13 15:54:34 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebGL</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Zhenyao Mo">zmo</reporter>
          <assigned_to name="Zhenyao Mo">zmo</assigned_to>
          <cc>abarth</cc>
    
    <cc>cmarrin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>gman</cc>
    
    <cc>kbr</cc>
    
    <cc>oliver</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>244550</commentid>
    <comment_count>0</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-06-29 16:24:55 -0700</bug_when>
    <thetext>In theory we don&apos;t have to (GL and GLES defines the same behavior), but seems like there is a driver bug in Mac, instead of falling back to (0, 0, 0, 1) texture, it falls back to (0, 0, 0, 0).

Thus, we have to do full tracking as in Chrome command buffer implementation.  Partial tracking (as in NPOT patch, whcih only deals with the difference between GL and GLES) won&apos;t work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>246476</commentid>
    <comment_count>1</comment_count>
      <attachid>60490</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-07-04 20:07:34 -0700</bug_when>
    <thetext>Created attachment 60490
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>246477</commentid>
    <comment_count>2</comment_count>
      <attachid>60490</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2010-07-04 20:09:16 -0700</bug_when>
    <thetext>Comment on attachment 60490
patch

What is meant by texture completeness? -- there should be some description in the changelog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>246478</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-07-04 20:10:06 -0700</bug_when>
    <thetext>Attachment 60490 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/html/canvas/WebGLTexture.cpp:200:  WebGLTexture::_deleteObject is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Total errors found: 1 in 8 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>246483</commentid>
    <comment_count>4</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-07-04 20:32:32 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Attachment 60490 [details] did not pass style-queue:
&gt; 
&gt; Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
&gt; WebCore/html/canvas/WebGLTexture.cpp:200:  WebGLTexture::_deleteObject is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
&gt; Total errors found: 1 in 8 files
&gt; 
&gt; 
&gt; If any of these errors are false positives, please file a bug against check-webkit-style.

I didn&apos;t touch the _deleteObject() function, besides, it&apos;s in all WebGL object classes.  So I won&apos;t fix this style issue in this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>246488</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-07-04 21:08:26 -0700</bug_when>
    <thetext>Can you fix the names in a follow up patch?  This is new code.  It shouldn&apos;t be out of style.  (How did it get past the Not the first time?)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>246502</commentid>
    <comment_count>6</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-07-04 22:05:51 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 60490 [details])
&gt; What is meant by texture completeness? -- there should be some description in the changelog

It&apos;s well defined in ES spec 2.0.24 Section 3.7.l0.  I could add this reference to the log.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>246504</commentid>
    <comment_count>7</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-07-04 22:08:11 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #3)
&gt; &gt; Attachment 60490 [details] [details] did not pass style-queue:
&gt; &gt; 
&gt; &gt; Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
&gt; &gt; WebCore/html/canvas/WebGLTexture.cpp:200:  WebGLTexture::_deleteObject is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
&gt; &gt; Total errors found: 1 in 8 files
&gt; &gt; 
&gt; &gt; 
&gt; &gt; If any of these errors are false positives, please file a bug against check-webkit-style.
&gt; 
&gt; I didn&apos;t touch the _deleteObject() function, besides, it&apos;s in all WebGL object classes.  So I won&apos;t fix this style issue in this patch.

(In reply to comment #5)
&gt; Can you fix the names in a follow up patch?  This is new code.  It shouldn&apos;t be out of style.  (How did it get past the Not the first time?)

The bug has already been created by kbr: https://bugs.webkit.org/show_bug.cgi?id=38761</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>247933</commentid>
    <comment_count>8</comment_count>
      <attachid>60490</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-07-07 18:50:14 -0700</bug_when>
    <thetext>Comment on attachment 60490
patch

Looks good overall. I didn&apos;t compare the logic side-by-side with the command buffer implementation so my review is relying on the fact that this is more or less a straight port. If this test isn&apos;t part of the conformance suite, it should be added. One comment:

WebCore/html/canvas/WebGLTexture.cpp:162
 +              height = std::max(1, height &gt;&gt; 1);
These look wrong. Should these be &quot;width &gt;&gt; level&quot; and &quot;height &gt;&gt; level&quot;? (Actually, I just checked the command buffer code and the same issue is there.) If so, and these errors weren&apos;t caught by a test, can we add a test for them?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>247934</commentid>
    <comment_count>9</comment_count>
      <attachid>60490</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-07-07 18:52:40 -0700</bug_when>
    <thetext>Comment on attachment 60490
patch

WebCore/html/canvas/WebGLTexture.cpp:162
 +              height = std::max(1, height &gt;&gt; 1);
From what I can see, the same error is here (and in the command buffer code as well).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>247936</commentid>
    <comment_count>10</comment_count>
      <attachid>60490</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-07-07 18:53:19 -0700</bug_when>
    <thetext>Comment on attachment 60490
patch

WebCore/html/canvas/WebGLTexture.cpp:291
 +                  height = std::max(1, height &gt;&gt; 1);
Oops; I meant here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>249525</commentid>
    <comment_count>11</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-07-10 09:55:30 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 60490 [details])
&gt; Looks good overall. I didn&apos;t compare the logic side-by-side with the command buffer implementation so my review is relying on the fact that this is more or less a straight port. If this test isn&apos;t part of the conformance suite, it should be added. One comment:
&gt; 
&gt; WebCore/html/canvas/WebGLTexture.cpp:162
&gt;  +              height = std::max(1, height &gt;&gt; 1);
&gt; These look wrong. Should these be &quot;width &gt;&gt; level&quot; and &quot;height &gt;&gt; level&quot;? (Actually, I just checked the command buffer code and the same issue is there.) If so, and these errors weren&apos;t caught by a test, can we add a test for them?

Actually the original code is correct.  This is because we update the width/height at each level, so at level k+1, the width/height is already the width/height for level k, not level 0, so shifting 1 bit right is the correct thing to do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>250165</commentid>
    <comment_count>12</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-07-12 17:10:00 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #8)
&gt; &gt; (From update of attachment 60490 [details] [details])
&gt; &gt; Looks good overall. I didn&apos;t compare the logic side-by-side with the command buffer implementation so my review is relying on the fact that this is more or less a straight port. If this test isn&apos;t part of the conformance suite, it should be added. One comment:
&gt; &gt; 
&gt; &gt; WebCore/html/canvas/WebGLTexture.cpp:162
&gt; &gt;  +              height = std::max(1, height &gt;&gt; 1);
&gt; &gt; These look wrong. Should these be &quot;width &gt;&gt; level&quot; and &quot;height &gt;&gt; level&quot;? (Actually, I just checked the command buffer code and the same issue is there.) If so, and these errors weren&apos;t caught by a test, can we add a test for them?
&gt; 
&gt; Actually the original code is correct.  This is because we update the width/height at each level, so at level k+1, the width/height is already the width/height for level k, not level 0, so shifting 1 bit right is the correct thing to do.

I see. Sorry for not realizing that. Looks good to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>250266</commentid>
    <comment_count>13</comment_count>
      <attachid>60490</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-07-12 20:19:27 -0700</bug_when>
    <thetext>Comment on attachment 60490
patch

WebCore/html/canvas/WebGLRenderingContext.cpp:1072
 +      RefPtr&lt;WebGLTexture&gt; tex = 0;
nit: no need to explicitly initialize a RefPtr.  the default ctor
initializes it to a null value.

WebCore/html/canvas/WebGLTexture.h:63
 +          static bool isNPOT(unsigned, unsigned);
note: the NPOT acronym was a mystery to me.  webkit encourages
minimizing the use of acronyms unless they are commonly known
or pertaining to the name of a protocol, etc.  That said,
&quot;site:khronos.org NPOT&quot; told me what I need to know.
isNotPowerOfTwo would probably be a better function name.

R=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>250521</commentid>
    <comment_count>14</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-07-13 08:27:57 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; (From update of attachment 60490 [details])
&gt; WebCore/html/canvas/WebGLRenderingContext.cpp:1072
&gt;  +      RefPtr&lt;WebGLTexture&gt; tex = 0;
&gt; nit: no need to explicitly initialize a RefPtr.  the default ctor
&gt; initializes it to a null value.

Will fix in the landing patch.

&gt; 
&gt; WebCore/html/canvas/WebGLTexture.h:63
&gt;  +          static bool isNPOT(unsigned, unsigned);
&gt; note: the NPOT acronym was a mystery to me.  webkit encourages
&gt; minimizing the use of acronyms unless they are commonly known
&gt; or pertaining to the name of a protocol, etc.  That said,
&gt; &quot;site:khronos.org NPOT&quot; told me what I need to know.
&gt; isNotPowerOfTwo would probably be a better function name.

I&apos;ll add a comment in the function declaration to explain NPOT.

&gt; 
&gt; R=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>250792</commentid>
    <comment_count>15</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-07-13 15:54:34 -0700</bug_when>
    <thetext>Committed r63253: &lt;http://trac.webkit.org/changeset/63253&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>60490</attachid>
            <date>2010-07-04 20:07:34 -0700</date>
            <delta_ts>2010-07-12 20:19:27 -0700</delta_ts>
            <desc>patch</desc>
            <filename>texture.patch</filename>
            <type>text/plain</type>
            <size>26550</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2MjQ3MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzkgQEAKKzIwMTAtMDctMDQgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBOZWVkIHRv
IHRyYWNrIHRleHR1cmUgY29tcGxldGVuZXNzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD00MTM4MQorCisgICAgICAgIFRlc3Q6IGZhc3QvY2FudmFzL3dl
YmdsL3RleHR1cmUtY29tcGxldGUuaHRtbAorCisgICAgICAgICogaHRtbC9jYW52YXMvV2ViR0xS
ZW5kZXJpbmdDb250ZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMUmVuZGVyaW5nQ29u
dGV4dDo6V2ViR0xSZW5kZXJpbmdDb250ZXh0KTogSW5pdCBtYXggdGV4dHVyZSBsZXZlbC4KKyAg
ICAgICAgKFdlYkNvcmU6OldlYkdMUmVuZGVyaW5nQ29udGV4dDo6YmluZFRleHR1cmUpOiBQYXNz
IG1heCB0ZXh0dXJlIGxldmVsIHRvIHNldFRhcmdldCgpLgorICAgICAgICAoV2ViQ29yZTo6V2Vi
R0xSZW5kZXJpbmdDb250ZXh0Ojpjb3B5VGV4SW1hZ2UyRCk6IENhY2hlIGZ1bGwgdGV4dHVyZSBp
bmZvIHJhdGhlciB0aGFuIHBhcnRpYWwuCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmlu
Z0NvbnRleHQ6OmdlbmVyYXRlTWlwbWFwKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpXZWJH
TFJlbmRlcmluZ0NvbnRleHQ6OnRleEltYWdlMkRCYXNlKTogRGl0dG8uCisgICAgICAgIChXZWJD
b3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRlVGV4RnVuY1BhcmFtZXRlcnMpOiBB
bHNvIHZhbGlkYXRlIGxldmVsLgorICAgICAgICAqIGh0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5n
Q29udGV4dC5oOiBBZGQgbWF4IHRleHR1cmUgbGV2ZWwuCisgICAgICAgICogaHRtbC9jYW52YXMv
V2ViR0xUZXh0dXJlLmNwcDogVXBkYXRlIHRoZSBjbGFzcyB0byBmdWxseSBjYWNoZSB0ZXh0dXJl
IGluZm9ybWF0aW9uIGFuZCB0cmFjayBOUE9UIGFuZCBDT01QTEVURSBzdGF0ZXMuCisgICAgICAg
IChXZWJDb3JlOjpXZWJHTFRleHR1cmU6OldlYkdMVGV4dHVyZSk6CisgICAgICAgIChXZWJDb3Jl
OjpXZWJHTFRleHR1cmU6OnNldFRhcmdldCk6IENoZWNrIHdoZXRoZXIgdGhlIHRleHR1cmUgaXMg
aW5pdGlhbGl6ZWQgb3IgaGFzIGJlZW4gZGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OldlYkdM
VGV4dHVyZTo6c2V0UGFyYW1ldGVyaSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xU
ZXh0dXJlOjpzZXRQYXJhbWV0ZXJmKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFRl
eHR1cmU6OnNldExldmVsSW5mbyk6IFNldCB0ZXh0dXJlIGluZm8uCisgICAgICAgIChXZWJDb3Jl
OjpXZWJHTFRleHR1cmU6OmdlbmVyYXRlTWlwbWFwTGV2ZWxJbmZvKTogR2VuZXJhdGUgdGV4dHVy
ZSBpbmZvIGZvciBhbGwgbGV2ZWxzIGFmdGVyIGdlbmVyYXRlTWlwbWFwcygpIGlzIGNhbGxlZC4K
KyAgICAgICAgKFdlYkNvcmU6OldlYkdMVGV4dHVyZTo6Z2V0SW50ZXJuYWxGb3JtYXQpOiBSZXR1
cm4gaW50ZXJuYWwgZm9ybWF0IG9uIHRleHR1cmUgZmFjZSAwIGxldmVsIDAuCisgICAgICAgIChX
ZWJDb3JlOjpXZWJHTFRleHR1cmU6OmlzTlBPVCk6IENoZWNrIHdoZXRoZXIgdGhlIHRleHR1cmUg
aXMgaW5pdGlhbGl6ZWQgb3IgaGFzIGJlZW4gZGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6Oldl
YkdMVGV4dHVyZTo6bmVlZFRvVXNlQmxhY2tUZXh0dXJlKTogRGl0dG8uCisgICAgICAgIChXZWJD
b3JlOjpXZWJHTFRleHR1cmU6Ol9kZWxldGVPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6V2Vi
R0xUZXh0dXJlOjptYXBUYXJnZXRUb0luZGV4KTogTWFwIHRhcmdldCB0byBpbmRleC4KKyAgICAg
ICAgKFdlYkNvcmU6OldlYkdMVGV4dHVyZTo6Y2FuR2VuZXJhdGVNaXBtYXBzKTogQ2hlY2sgd2hl
dGhlciBNaXBtYXBzIGNhbiBiZSBnZW5lcmF0ZWQuCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFRl
eHR1cmU6OmNvbXB1dGVMZXZlbENvdW50KTogQ29tcHV0ZSB0ZXh0dXJlIGxldmVsIGNvdW50IGZy
b20gd2lkdGgvaGVpZ2h0LgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xUZXh0dXJlOjp1cGRhdGUp
OiBVcGRhdGUgTlBPVC9DT01QTEVURSBzdGF0ZXMuCisgICAgICAgICogaHRtbC9jYW52YXMvV2Vi
R0xUZXh0dXJlLmg6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xUZXh0dXJlOjpMZXZl
bEluZm86OkxldmVsSW5mbyk6IEFkZCBkYXRhIHN0cnVjdHVyZSB0byBmdWxseSBjYWNoZSB0ZXh0
dXJlIGluZm8uCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFRleHR1cmU6OkxldmVsSW5mbzo6c2V0
SW5mbyk6IFNldCBpbmZvcm1hdGlvbi4KKwogMjAxMC0wNy0wNCAgQW5kZXJzIENhcmxzc29uICA8
YW5kZXJzY2FAYXBwbGUuY29tPgogCiAgICAgICAgIEZpeCBXaW5kb3dzIGJ1aWxkLgpJbmRleDog
V2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcAkocmV2aXNp
b24gNjI0NzApCisrKyBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTExNSwxMiArMTE1LDEyIEBAIFdlYkdMUmVuZGVyaW5nQ29u
dGV4dDo6V2ViR0xSZW5kZXJpbmdDb24KICAgICBtX2NvbnRleHQtPmdldEludGVnZXJ2KEdyYXBo
aWNzQ29udGV4dDNEOjpJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUsICZpbXBsZW1lbnRh
dGlvbkNvbG9yUmVhZFR5cGUpOwogICAgIG1faW1wbGVtZW50YXRpb25Db2xvclJlYWRUeXBlID0g
aW1wbGVtZW50YXRpb25Db2xvclJlYWRUeXBlOwogCi0gICAgaW50IG1heFRleHR1cmVTaXplID0g
MDsKLSAgICBtX2NvbnRleHQtPmdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVEVY
VFVSRV9TSVpFLCAmbWF4VGV4dHVyZVNpemUpOwotICAgIG1fbWF4VGV4dHVyZVNpemUgPSBtYXhU
ZXh0dXJlU2l6ZTsKLSAgICBpbnQgbWF4Q3ViZU1hcFRleHR1cmVTaXplID0gMDsKLSAgICBtX2Nv
bnRleHQtPmdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfQ1VCRV9NQVBfVEVYVFVS
RV9TSVpFLCAmbWF4Q3ViZU1hcFRleHR1cmVTaXplKTsKLSAgICBtX21heEN1YmVNYXBUZXh0dXJl
U2l6ZSA9IG1heEN1YmVNYXBUZXh0dXJlU2l6ZTsKKyAgICBtX21heFRleHR1cmVTaXplID0gMDsK
KyAgICBtX2NvbnRleHQtPmdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVEVYVFVS
RV9TSVpFLCAmbV9tYXhUZXh0dXJlU2l6ZSk7CisgICAgbV9tYXhUZXh0dXJlTGV2ZWwgPSBXZWJH
TFRleHR1cmU6OmNvbXB1dGVMZXZlbENvdW50KG1fbWF4VGV4dHVyZVNpemUsIG1fbWF4VGV4dHVy
ZVNpemUpOworICAgIG1fbWF4Q3ViZU1hcFRleHR1cmVTaXplID0gMDsKKyAgICBtX2NvbnRleHQt
PmdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpF
LCAmbV9tYXhDdWJlTWFwVGV4dHVyZVNpemUpOworICAgIG1fbWF4Q3ViZU1hcFRleHR1cmVMZXZl
bCA9IFdlYkdMVGV4dHVyZTo6Y29tcHV0ZUxldmVsQ291bnQobV9tYXhDdWJlTWFwVGV4dHVyZVNp
emUsIG1fbWF4Q3ViZU1hcFRleHR1cmVTaXplKTsKIAogICAgIGlmICghaXNHTEVTMkNvbXBsaWFu
dCgpKSB7CiAgICAgICAgIGNyZWF0ZUZhbGxiYWNrQmxhY2tUZXh0dXJlczF4MSgpOwpAQCAtMjkz
LDE3ICsyOTMsMjAgQEAgdm9pZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmJpbmRUZXh0dXJlKAog
ICAgICAgICBtX2NvbnRleHQtPnN5bnRoZXNpemVHTEVycm9yKEdyYXBoaWNzQ29udGV4dDNEOjpJ
TlZBTElEX09QRVJBVElPTik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgaWYgKHRhcmdl
dCA9PSBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCkKKyAgICBpbnQgbWF4TGV2ZWwgPSAw
OworICAgIGlmICh0YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQpIHsKICAg
ICAgICAgbV90ZXh0dXJlVW5pdHNbbV9hY3RpdmVUZXh0dXJlVW5pdF0ubV90ZXh0dXJlMkRCaW5k
aW5nID0gdGV4dHVyZTsKLSAgICBlbHNlIGlmICh0YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6
OlRFWFRVUkVfQ1VCRV9NQVApCisgICAgICAgIG1heExldmVsID0gbV9tYXhUZXh0dXJlTGV2ZWw7
CisgICAgfSBlbHNlIGlmICh0YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfQ1VC
RV9NQVApIHsKICAgICAgICAgbV90ZXh0dXJlVW5pdHNbbV9hY3RpdmVUZXh0dXJlVW5pdF0ubV90
ZXh0dXJlQ3ViZU1hcEJpbmRpbmcgPSB0ZXh0dXJlOwotICAgIGVsc2UgeworICAgICAgICBtYXhM
ZXZlbCA9IG1fbWF4Q3ViZU1hcFRleHR1cmVMZXZlbDsKKyAgICB9IGVsc2UgewogICAgICAgICBt
X2NvbnRleHQtPnN5bnRoZXNpemVHTEVycm9yKEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX0VO
VU0pOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1fY29udGV4dC0+YmluZFRleHR1cmUo
dGFyZ2V0LCB0ZXh0dXJlKTsKICAgICBpZiAoIWlzR0xFUzJDb21wbGlhbnQoKSAmJiB0ZXh0dXJl
KQotICAgICAgICB0ZXh0dXJlLT5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgdGV4dHVyZS0+
c2V0VGFyZ2V0KHRhcmdldCwgbWF4TGV2ZWwpOwogICAgIGNsZWFudXBBZnRlckdyYXBoaWNzQ2Fs
bChmYWxzZSk7CiB9CiAKQEAgLTQ5MywxMCArNDk2LDggQEAgdm9pZCBXZWJHTFJlbmRlcmluZ0Nv
bnRleHQ6OmNvcHlUZXhJbWFnZQogICAgIC8vIEZJWE1FOiBpZiB0aGUgZnJhbWVidWZmZXIgaXMg
bm90IGNvbXBsZXRlLCBub25lIG9mIHRoZSBiZWxvdyBzaG91bGQgYmUgZXhlY3V0ZWQuCiAgICAg
V2ViR0xUZXh0dXJlKiB0ZXggPSBnZXRUZXh0dXJlQmluZGluZyh0YXJnZXQpOwogICAgIGlmICgh
aXNHTEVTMkNvbXBsaWFudCgpKSB7Ci0gICAgICAgIGlmICh0ZXggJiYgIWxldmVsKSAvLyBvbmx5
IGZvciBsZXZlbCAwCi0gICAgICAgICAgICB0ZXgtPnNldFNpemUodGFyZ2V0LCB3aWR0aCwgaGVp
Z2h0KTsKICAgICAgICAgaWYgKHRleCkKLSAgICAgICAgICAgIHRleC0+c2V0SW50ZXJuYWxGb3Jt
YXQoaW50ZXJuYWxmb3JtYXQpOworICAgICAgICAgICAgdGV4LT5zZXRMZXZlbEluZm8odGFyZ2V0
LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIEdyYXBoaWNzQ29udGV4dDNE
OjpVTlNJR05FRF9CWVRFKTsKICAgICB9CiAgICAgaWYgKG1fZnJhbWVidWZmZXJCaW5kaW5nICYm
IHRleCkKICAgICAgICAgbV9mcmFtZWJ1ZmZlckJpbmRpbmctPm9uQXR0YWNoZWRPYmplY3RDaGFu
Z2UodGV4KTsKQEAgLTEwNjgsMTggKzEwNjksMjIgQEAgdm9pZCBXZWJHTFJlbmRlcmluZ0NvbnRl
eHQ6OmZyb250RmFjZSh1bgogCiB2b2lkIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6Z2VuZXJhdGVN
aXBtYXAodW5zaWduZWQgbG9uZyB0YXJnZXQpCiB7CisgICAgUmVmUHRyPFdlYkdMVGV4dHVyZT4g
dGV4ID0gMDsKICAgICBpZiAoIWlzR0xFUzJDb21wbGlhbnQoKSkgewotICAgICAgICBSZWZQdHI8
V2ViR0xUZXh0dXJlPiB0ZXggPSAwOwogICAgICAgICBpZiAodGFyZ2V0ID09IEdyYXBoaWNzQ29u
dGV4dDNEOjpURVhUVVJFXzJEKQogICAgICAgICAgICAgdGV4ID0gbV90ZXh0dXJlVW5pdHNbbV9h
Y3RpdmVUZXh0dXJlVW5pdF0ubV90ZXh0dXJlMkRCaW5kaW5nOwogICAgICAgICBlbHNlIGlmICh0
YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfQ1VCRV9NQVApCiAgICAgICAgICAg
ICB0ZXggPSBtX3RleHR1cmVVbml0c1ttX2FjdGl2ZVRleHR1cmVVbml0XS5tX3RleHR1cmVDdWJl
TWFwQmluZGluZzsKLSAgICAgICAgaWYgKHRleCAmJiB0ZXgtPmlzTlBPVCgpKSB7CisgICAgICAg
IGlmICh0ZXggJiYgIXRleC0+Y2FuR2VuZXJhdGVNaXBtYXBzKCkpIHsKICAgICAgICAgICAgIG1f
Y29udGV4dC0+c3ludGhlc2l6ZUdMRXJyb3IoR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURfT1BF
UkFUSU9OKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KICAgICBtX2Nv
bnRleHQtPmdlbmVyYXRlTWlwbWFwKHRhcmdldCk7CisgICAgaWYgKCFpc0dMRVMyQ29tcGxpYW50
KCkpIHsKKyAgICAgICAgaWYgKHRleCkKKyAgICAgICAgICAgIHRleC0+Z2VuZXJhdGVNaXBtYXBM
ZXZlbEluZm8oKTsKKyAgICB9CiAgICAgY2xlYW51cEFmdGVyR3JhcGhpY3NDYWxsKGZhbHNlKTsK
IH0KIApAQCAtMjA2NCwxMCArMjA2OSw4IEBAIHZvaWQgV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojp0
ZXhJbWFnZTJEQmEKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLCBmb3JtYXQsIHR5
cGUsIHBpeGVscyk7CiAgICAgV2ViR0xUZXh0dXJlKiB0ZXggPSBnZXRUZXh0dXJlQmluZGluZyh0
YXJnZXQpOwogICAgIGlmICghaXNHTEVTMkNvbXBsaWFudCgpKSB7Ci0gICAgICAgIGlmICh0ZXgg
JiYgIWxldmVsKSAvLyBvbmx5IGZvciBsZXZlbCAwCi0gICAgICAgICAgICB0ZXgtPnNldFNpemUo
dGFyZ2V0LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgaWYgKHRleCkKLSAgICAgICAgICAgIHRl
eC0+c2V0SW50ZXJuYWxGb3JtYXQoaW50ZXJuYWxmb3JtYXQpOworICAgICAgICAgICAgdGV4LT5z
ZXRMZXZlbEluZm8odGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQs
IHR5cGUpOwogICAgIH0KICAgICBpZiAobV9mcmFtZWJ1ZmZlckJpbmRpbmcgJiYgdGV4KQogICAg
ICAgICBtX2ZyYW1lYnVmZmVyQmluZGluZy0+b25BdHRhY2hlZE9iamVjdENoYW5nZSh0ZXgpOwpA
QCAtMzM1MSw5ICszMzU0LDYgQEAgYm9vbCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRl
VGV4RgogICAgIGlmICghdmFsaWRhdGVUZXhGdW5jRm9ybWF0QW5kVHlwZShmb3JtYXQsIHR5cGUp
KQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBpZiAoaXNHTEVTMkNvbXBsaWFudCgpKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLQogICAgIGlmICh3aWR0aCA8IDAgfHwgaGVpZ2h0IDwgMCB8
fCBsZXZlbCA8IDApIHsKICAgICAgICAgbV9jb250ZXh0LT5zeW50aGVzaXplR0xFcnJvcihHcmFw
aGljc0NvbnRleHQzRDo6SU5WQUxJRF9WQUxVRSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAg
LTMzNjEsNyArMzM2MSw3IEBAIGJvb2wgV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZVRl
eEYKIAogICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6
VEVYVFVSRV8yRDoKLSAgICAgICAgaWYgKHdpZHRoID4gbV9tYXhUZXh0dXJlU2l6ZSB8fCBoZWln
aHQgPiBtX21heFRleHR1cmVTaXplKSB7CisgICAgICAgIGlmICh3aWR0aCA+IG1fbWF4VGV4dHVy
ZVNpemUgfHwgaGVpZ2h0ID4gbV9tYXhUZXh0dXJlU2l6ZSB8fCBsZXZlbCA+IG1fbWF4VGV4dHVy
ZUxldmVsKSB7CiAgICAgICAgICAgICBtX2NvbnRleHQtPnN5bnRoZXNpemVHTEVycm9yKEdyYXBo
aWNzQ29udGV4dDNEOjpJTlZBTElEX1ZBTFVFKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICAgICAgfQpAQCAtMzM3Miw3ICszMzcyLDcgQEAgYm9vbCBXZWJHTFJlbmRlcmluZ0NvbnRl
eHQ6OnZhbGlkYXRlVGV4RgogICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfQ1VC
RV9NQVBfTkVHQVRJVkVfWToKICAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX0NV
QkVfTUFQX1BPU0lUSVZFX1o6CiAgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9D
VUJFX01BUF9ORUdBVElWRV9aOgotICAgICAgICBpZiAod2lkdGggIT0gaGVpZ2h0IHx8IHdpZHRo
ID4gbV9tYXhDdWJlTWFwVGV4dHVyZVNpemUpIHsKKyAgICAgICAgaWYgKHdpZHRoICE9IGhlaWdo
dCB8fCB3aWR0aCA+IG1fbWF4Q3ViZU1hcFRleHR1cmVTaXplIHx8IGxldmVsID4gbV9tYXhDdWJl
TWFwVGV4dHVyZUxldmVsKSB7CiAgICAgICAgICAgICBtX2NvbnRleHQtPnN5bnRoZXNpemVHTEVy
cm9yKEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX1ZBTFVFKTsKICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKICAgICAgICAgfQpJbmRleDogV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRl
cmluZ0NvbnRleHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVu
ZGVyaW5nQ29udGV4dC5oCShyZXZpc2lvbiA2MjQ3MCkKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMv
V2ViR0xSZW5kZXJpbmdDb250ZXh0LmgJKHdvcmtpbmcgY29weSkKQEAgLTQxMCw4ICs0MTAsMTAg
QEAgY2xhc3MgV2ViS2l0Q1NTTWF0cml4OwogICAgICAgICBSZWZQdHI8V2ViR0xUZXh0dXJlPiBt
X2JsYWNrVGV4dHVyZTJEOwogICAgICAgICBSZWZQdHI8V2ViR0xUZXh0dXJlPiBtX2JsYWNrVGV4
dHVyZUN1YmVNYXA7CiAKLSAgICAgICAgbG9uZyBtX21heFRleHR1cmVTaXplOwotICAgICAgICBs
b25nIG1fbWF4Q3ViZU1hcFRleHR1cmVTaXplOworICAgICAgICBpbnQgbV9tYXhUZXh0dXJlU2l6
ZTsKKyAgICAgICAgaW50IG1fbWF4Q3ViZU1hcFRleHR1cmVTaXplOworICAgICAgICBpbnQgbV9t
YXhUZXh0dXJlTGV2ZWw7CisgICAgICAgIGludCBtX21heEN1YmVNYXBUZXh0dXJlTGV2ZWw7CiAK
ICAgICAgICAgaW50IG1fcGFja0FsaWdubWVudDsKICAgICAgICAgaW50IG1fdW5wYWNrQWxpZ25t
ZW50OwpJbmRleDogV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFRleHR1cmUuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xUZXh0dXJlLmNwcAkocmV2aXNpb24gNjI0
NzApCisrKyBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMVGV4dHVyZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTQ1LDMyICs0NSwzOSBAQCBXZWJHTFRleHR1cmU6OldlYkdMVGV4dHVyZShXZWJHTFJl
bmRlcmluCiAgICAgLCBtX21hZ0ZpbHRlcihHcmFwaGljc0NvbnRleHQzRDo6TElORUFSKQogICAg
ICwgbV93cmFwUyhHcmFwaGljc0NvbnRleHQzRDo6UkVQRUFUKQogICAgICwgbV93cmFwVChHcmFw
aGljc0NvbnRleHQzRDo6UkVQRUFUKQotICAgICwgbV9pbnRlcm5hbEZvcm1hdCgwKQogICAgICwg
bV9pc05QT1QoZmFsc2UpCisgICAgLCBtX2lzQ29tcGxldGUoZmFsc2UpCiAgICAgLCBtX25lZWRU
b1VzZUJsYWNrVGV4dHVyZShmYWxzZSkKIHsKICAgICBzZXRPYmplY3QoY29udGV4dCgpLT5ncmFw
aGljc0NvbnRleHQzRCgpLT5jcmVhdGVUZXh0dXJlKCkpOwotICAgIGZvciAoaW50IGlpID0gMDsg
aWkgPCA2OyArK2lpKSB7Ci0gICAgICAgIG1fd2lkdGhbaWldID0gMDsKLSAgICAgICAgbV9oZWln
aHRbaWldID0gMDsKLSAgICB9CiB9CiAKLXZvaWQgV2ViR0xUZXh0dXJlOjpzZXRUYXJnZXQodW5z
aWduZWQgbG9uZyB0YXJnZXQpCit2b2lkIFdlYkdMVGV4dHVyZTo6c2V0VGFyZ2V0KHVuc2lnbmVk
IGxvbmcgdGFyZ2V0LCBpbnQgbWF4TGV2ZWwpCiB7CisgICAgaWYgKCFvYmplY3QoKSkKKyAgICAg
ICAgcmV0dXJuOwogICAgIC8vIFRhcmdldCBpcyBmaW5hbGl6ZWQgdGhlIGZpcnN0IHRpbWUgYmlu
ZFRleHR1cmUoKSBpcyBjYWxsZWQuCiAgICAgaWYgKG1fdGFyZ2V0KQogICAgICAgICByZXR1cm47
CiAgICAgc3dpdGNoICh0YXJnZXQpIHsKICAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpURVhU
VVJFXzJEOgorICAgICAgICBtX3RhcmdldCA9IHRhcmdldDsKKyAgICAgICAgbV9pbmZvLnJlc2l6
ZSgxKTsKKyAgICAgICAgbV9pbmZvWzBdLnJlc2l6ZShtYXhMZXZlbCk7CisgICAgICAgIGJyZWFr
OwogICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfQ1VCRV9NQVA6CiAgICAgICAg
IG1fdGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBtX2luZm8ucmVzaXplKDYpOworICAgICAgICBm
b3IgKGludCBpaSA9IDA7IGlpIDwgNjsgKytpaSkKKyAgICAgICAgICAgIG1faW5mb1tpaV0ucmVz
aXplKG1heExldmVsKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCiB2b2lkIFdlYkdMVGV4
dHVyZTo6c2V0UGFyYW1ldGVyaSh1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQgcGFyYW0pCiB7Cisg
ICAgaWYgKCFvYmplY3QoKSB8fCAhbV90YXJnZXQpCisgICAgICAgIHJldHVybjsKICAgICBzd2l0
Y2ggKHBuYW1lKSB7CiAgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9NSU5fRklM
VEVSOgogICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7CkBAIC0xMTMsODggKzEyMCwxOTUgQEAgdm9p
ZCBXZWJHTFRleHR1cmU6OnNldFBhcmFtZXRlcmkodW5zaWduZQogICAgIGRlZmF1bHQ6CiAgICAg
ICAgIHJldHVybjsKICAgICB9Ci0gICAgdXBkYXRlTlBPVFN0YXRlcygpOworICAgIHVwZGF0ZSgp
OwogfQogCiB2b2lkIFdlYkdMVGV4dHVyZTo6c2V0UGFyYW1ldGVyZih1bnNpZ25lZCBsb25nIHBu
YW1lLCBmbG9hdCBwYXJhbSkKIHsKKyAgICBpZiAoIW9iamVjdCgpIHx8ICFtX3RhcmdldCkKKyAg
ICAgICAgcmV0dXJuOwogICAgIGludCBpcGFyYW0gPSBzdGF0aWNfY2FzdDxpbnQ+KHBhcmFtKTsK
ICAgICBzZXRQYXJhbWV0ZXJpKHBuYW1lLCBpcGFyYW0pOwogfQogCi12b2lkIFdlYkdMVGV4dHVy
ZTo6c2V0U2l6ZSh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVk
IGhlaWdodCkKK3ZvaWQgV2ViR0xUZXh0dXJlOjpzZXRMZXZlbEluZm8odW5zaWduZWQgbG9uZyB0
YXJnZXQsIGludCBsZXZlbCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbEZvcm1hdCwgaW50IHdpZHRo
LCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIHR5cGUpCiB7Ci0gICAgaWYgKCF3aWR0aCB8fCAh
aGVpZ2h0KQorICAgIGlmICghb2JqZWN0KCkgfHwgIW1fdGFyZ2V0KQogICAgICAgICByZXR1cm47
Ci0gICAgaW50IGlUYXJnZXQgPSAtMTsKKyAgICAvLyBXZSBhc3N1bWUgbGV2ZWwsIGludGVybmFs
Rm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBhbmQgdHlwZSBoYXZlIGFsbCBiZWVuCisgICAgLy8gdmFs
aWRhdGVkIGFscmVhZHkuCisgICAgaW50IGluZGV4ID0gbWFwVGFyZ2V0VG9JbmRleCh0YXJnZXQp
OworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBtX2luZm9baW5kZXhd
W2xldmVsXS5zZXRJbmZvKGludGVybmFsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCB0eXBlKTsKKyAg
ICB1cGRhdGUoKTsKK30KKwordm9pZCBXZWJHTFRleHR1cmU6OmdlbmVyYXRlTWlwbWFwTGV2ZWxJ
bmZvKCkKK3sKKyAgICBpZiAoIW9iamVjdCgpIHx8ICFtX3RhcmdldCkKKyAgICAgICAgcmV0dXJu
OworICAgIGlmICghY2FuR2VuZXJhdGVNaXBtYXBzKCkpCisgICAgICAgIHJldHVybjsKKyAgICBp
ZiAobV9pc0NvbXBsZXRlKQorICAgICAgICByZXR1cm47CisgICAgZm9yIChzaXplX3QgaWkgPSAw
OyBpaSA8IG1faW5mby5zaXplKCk7ICsraWkpIHsKKyAgICAgICAgY29uc3QgTGV2ZWxJbmZvJiBp
bmZvMCA9IG1faW5mb1tpaV1bMF07CisgICAgICAgIGludCB3aWR0aCA9IGluZm8wLndpZHRoOwor
ICAgICAgICBpbnQgaGVpZ2h0ID0gaW5mbzAuaGVpZ2h0OworICAgICAgICBpbnQgbGV2ZWxDb3Vu
dCA9IGNvbXB1dGVMZXZlbENvdW50KHdpZHRoLCBoZWlnaHQpOworICAgICAgICBmb3IgKGludCBs
ZXZlbCA9IDE7IGxldmVsIDwgbGV2ZWxDb3VudDsgKytsZXZlbCkgeworICAgICAgICAgICAgd2lk
dGggPSBzdGQ6Om1heCgxLCB3aWR0aCA+PiAxKTsKKyAgICAgICAgICAgIGhlaWdodCA9IHN0ZDo6
bWF4KDEsIGhlaWdodCA+PiAxKTsKKyAgICAgICAgICAgIExldmVsSW5mbyYgaW5mbyA9IG1faW5m
b1tpaV1bbGV2ZWxdOworICAgICAgICAgICAgaW5mby5zZXRJbmZvKGluZm8wLmludGVybmFsRm9y
bWF0LCB3aWR0aCwgaGVpZ2h0LCBpbmZvMC50eXBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBt
X2lzQ29tcGxldGUgPSB0cnVlOworfQorCit1bnNpZ25lZCBsb25nIFdlYkdMVGV4dHVyZTo6Z2V0
SW50ZXJuYWxGb3JtYXQoKSBjb25zdAoreworICAgIGlmICghb2JqZWN0KCkgfHwgIW1fdGFyZ2V0
KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gbV9pbmZvWzBdWzBdLmludGVybmFsRm9y
bWF0OworfQorCitib29sIFdlYkdMVGV4dHVyZTo6aXNOUE9UKHVuc2lnbmVkIHdpZHRoLCB1bnNp
Z25lZCBoZWlnaHQpCit7CisgICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgaWYgKCh3aWR0aCAmICh3aWR0aCAtIDEpKSB8fCAoaGVpZ2h0ICYgKGhl
aWdodCAtIDEpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQor
Citib29sIFdlYkdMVGV4dHVyZTo6aXNOUE9UKCkgY29uc3QKK3sKKyAgICBpZiAoIW9iamVjdCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIG1faXNOUE9UOworfQorCitib29s
IFdlYkdMVGV4dHVyZTo6bmVlZFRvVXNlQmxhY2tUZXh0dXJlKCkgY29uc3QKK3sKKyAgICBpZiAo
IW9iamVjdCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIG1fbmVlZFRvVXNl
QmxhY2tUZXh0dXJlOworfQorCit2b2lkIFdlYkdMVGV4dHVyZTo6X2RlbGV0ZU9iamVjdChQbGF0
Zm9ybTNET2JqZWN0IG9iamVjdCkKK3sKKyAgICBjb250ZXh0KCktPmdyYXBoaWNzQ29udGV4dDNE
KCktPmRlbGV0ZVRleHR1cmUob2JqZWN0KTsKK30KKworaW50IFdlYkdMVGV4dHVyZTo6bWFwVGFy
Z2V0VG9JbmRleCh1bnNpZ25lZCBsb25nIHRhcmdldCkKK3sKICAgICBpZiAobV90YXJnZXQgPT0g
R3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQpIHsKICAgICAgICAgaWYgKHRhcmdldCA9PSBH
cmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCkKLSAgICAgICAgICAgIGlUYXJnZXQgPSAwOwot
ICAgIH0gZWxzZSBpZiAobV90YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfQ1VC
RV9NQVAgJiYgd2lkdGggPT0gaGVpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9
IGVsc2UgaWYgKG1fdGFyZ2V0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX0NVQkVfTUFQ
KSB7CiAgICAgICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICAgICAgIGNhc2UgR3JhcGhpY3NDb250
ZXh0M0Q6OlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWDoKLSAgICAgICAgICAgIGlUYXJnZXQg
PSAwOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAg
Y2FzZSBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOgotICAg
ICAgICAgICAgaVRhcmdldCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJl
dHVybiAxOwogICAgICAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX0NVQkVfTUFQ
X1BPU0lUSVZFX1k6Ci0gICAgICAgICAgICBpVGFyZ2V0ID0gMjsKLSAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6
OlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWToKLSAgICAgICAgICAgIGlUYXJnZXQgPSAzOwot
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gMzsKICAgICAgICAgY2FzZSBH
cmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOgotICAgICAgICAg
ICAgaVRhcmdldCA9IDQ7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiA0
OwogICAgICAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX0NVQkVfTUFQX05FR0FU
SVZFX1o6Ci0gICAgICAgICAgICBpVGFyZ2V0ID0gNTsKLSAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgcmV0dXJuIDU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGlUYXJnZXQgPCAw
KQotICAgICAgICByZXR1cm47Ci0gICAgbV93aWR0aFtpVGFyZ2V0XSA9IHdpZHRoOwotICAgIG1f
aGVpZ2h0W2lUYXJnZXRdID0gaGVpZ2h0OwotICAgIHVwZGF0ZU5QT1RTdGF0ZXMoKTsKKyAgICBy
ZXR1cm4gLTE7CiB9CiAKLWJvb2wgV2ViR0xUZXh0dXJlOjppc05QT1QodW5zaWduZWQgd2lkdGgs
IHVuc2lnbmVkIGhlaWdodCkKK2Jvb2wgV2ViR0xUZXh0dXJlOjpjYW5HZW5lcmF0ZU1pcG1hcHMo
KQogewotICAgIGlmICghd2lkdGggfHwgIWhlaWdodCkKKyAgICBpZiAoaXNOUE9UKCkpCiAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoKHdpZHRoICYgKHdpZHRoIC0gMSkpIHx8IChoZWln
aHQgJiAoaGVpZ2h0IC0gMSkpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFs
c2U7CisgICAgY29uc3QgTGV2ZWxJbmZvJiBmaXJzdCA9IG1faW5mb1swXVswXTsKKyAgICBmb3Ig
KHNpemVfdCBpaSA9IDA7IGlpIDwgbV9pbmZvLnNpemUoKTsgKytpaSkgeworICAgICAgICBjb25z
dCBMZXZlbEluZm8mIGluZm8gPSBtX2luZm9baWldWzBdOworICAgICAgICBpZiAoIWluZm8udmFs
aWQKKyAgICAgICAgICAgIHx8IGluZm8ud2lkdGggIT0gZmlyc3Qud2lkdGggfHwgaW5mby5oZWln
aHQgIT0gZmlyc3QuaGVpZ2h0CisgICAgICAgICAgICB8fCBpbmZvLmludGVybmFsRm9ybWF0ICE9
IGZpcnN0LmludGVybmFsRm9ybWF0IHx8IGluZm8udHlwZSAhPSBmaXJzdC50eXBlKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBX
ZWJHTFRleHR1cmU6Ol9kZWxldGVPYmplY3QoUGxhdGZvcm0zRE9iamVjdCBvYmplY3QpCitpbnQg
V2ViR0xUZXh0dXJlOjpjb21wdXRlTGV2ZWxDb3VudChpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7
Ci0gICAgY29udGV4dCgpLT5ncmFwaGljc0NvbnRleHQzRCgpLT5kZWxldGVUZXh0dXJlKG9iamVj
dCk7CisgICAgLy8gcmV0dXJuIDEgKyBsb2cyRmxvb3Ioc3RkOjptYXgod2lkdGgsIGhlaWdodCkp
OworICAgIGludCBuID0gc3RkOjptYXgod2lkdGgsIGhlaWdodCk7CisgICAgaWYgKG4gPD0gMCkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgaW50IGxvZyA9IDA7CisgICAgaW50IHZhbHVlID0gbjsK
KyAgICBmb3IgKGludCBpaSA9IDQ7IGlpID49IDA7IC0taWkpIHsKKyAgICAgICAgaW50IHNoaWZ0
ID0gKDEgPDwgaWkpOworICAgICAgICBpbnQgeCA9ICh2YWx1ZSA+PiBzaGlmdCk7CisgICAgICAg
IGlmICh4KSB7CisgICAgICAgICAgICB2YWx1ZSA9IHg7CisgICAgICAgICAgICBsb2cgKz0gc2hp
ZnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUKHZhbHVlID09IDEpOworICAgIHJldHVy
biBsb2cgKyAxOwogfQogCi12b2lkIFdlYkdMVGV4dHVyZTo6dXBkYXRlTlBPVFN0YXRlcygpCit2
b2lkIFdlYkdMVGV4dHVyZTo6dXBkYXRlKCkKIHsKLSAgICBpbnQgbnVtVGFyZ2V0cyA9IDA7Ci0g
ICAgaWYgKG1fdGFyZ2V0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFXzJEKQotICAgICAg
ICBudW1UYXJnZXRzID0gMTsKLSAgICBlbHNlIGlmIChtX3RhcmdldCA9PSBHcmFwaGljc0NvbnRl
eHQzRDo6VEVYVFVSRV9DVUJFX01BUCkKLSAgICAgICAgbnVtVGFyZ2V0cyA9IDY7CiAgICAgbV9p
c05QT1QgPSBmYWxzZTsKLSAgICB1bnNpZ25lZCB3MCA9IG1fd2lkdGhbMF0sIGgwID0gbV9oZWln
aHRbMF07Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG51bVRhcmdldHM7ICsraWkpIHsKLSAg
ICAgICAgaWYgKGlpICYmICghbV93aWR0aFtpaV0gfHwgIW1faGVpZ2h0W2lpXSB8fCBtX3dpZHRo
W2lpXSAhPSB3MCB8fCBtX2hlaWdodFtpaV0gIT0gaDApKSB7Ci0gICAgICAgICAgICAvLyBXZSBv
bmx5IHNldCBOUE9UIGZvciBjb21wbGV0ZSBjdWJlIG1hcCB0ZXh0dXJlcy4KLSAgICAgICAgICAg
IG1faXNOUE9UID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IG1faW5mby5z
aXplKCk7ICsraWkpIHsKKyAgICAgICAgaWYgKGlzTlBPVChtX2luZm9baWldWzBdLndpZHRoLCBt
X2luZm9baWldWzBdLmhlaWdodCkpIHsKKyAgICAgICAgICAgIG1faXNOUE9UID0gdHJ1ZTsKICAg
ICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpc05QT1QobV93aWR0aFtp
aV0sIG1faGVpZ2h0W2lpXSkpCi0gICAgICAgICAgICBtX2lzTlBPVCA9IHRydWU7CiAgICAgfQor
ICAgIG1faXNDb21wbGV0ZSA9IHRydWU7CisgICAgY29uc3QgTGV2ZWxJbmZvJiBmaXJzdCA9IG1f
aW5mb1swXVswXTsKKyAgICBpbnQgbGV2ZWxDb3VudCA9IGNvbXB1dGVMZXZlbENvdW50KGZpcnN0
LndpZHRoLCBmaXJzdC5oZWlnaHQpOworICAgIGlmIChsZXZlbENvdW50IDwgMSkKKyAgICAgICAg
bV9pc0NvbXBsZXRlID0gZmFsc2U7CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoc2l6ZV90IGlp
ID0gMDsgaWkgPCBtX2luZm8uc2l6ZSgpICYmIG1faXNDb21wbGV0ZTsgKytpaSkgeworICAgICAg
ICAgICAgY29uc3QgTGV2ZWxJbmZvJiBpbmZvMCA9IG1faW5mb1tpaV1bMF07CisgICAgICAgICAg
ICBpZiAoIWluZm8wLnZhbGlkCisgICAgICAgICAgICAgICAgfHwgaW5mbzAud2lkdGggIT0gZmly
c3Qud2lkdGggfHwgaW5mbzAuaGVpZ2h0ICE9IGZpcnN0LmhlaWdodAorICAgICAgICAgICAgICAg
IHx8IGluZm8wLmludGVybmFsRm9ybWF0ICE9IGZpcnN0LmludGVybmFsRm9ybWF0IHx8IGluZm8w
LnR5cGUgIT0gZmlyc3QudHlwZSkgeworICAgICAgICAgICAgICAgIG1faXNDb21wbGV0ZSA9IGZh
bHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
aW50IHdpZHRoID0gaW5mbzAud2lkdGg7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gaW5mbzAu
aGVpZ2h0OworICAgICAgICAgICAgZm9yIChpbnQgbGV2ZWwgPSAxOyBsZXZlbCA8IGxldmVsQ291
bnQ7ICsrbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IHN0ZDo6bWF4KDEsIHdpZHRo
ID4+IDEpOworICAgICAgICAgICAgICAgIGhlaWdodCA9IHN0ZDo6bWF4KDEsIGhlaWdodCA+PiAx
KTsKKyAgICAgICAgICAgICAgICBjb25zdCBMZXZlbEluZm8mIGluZm8gPSBtX2luZm9baWldW2xl
dmVsXTsKKyAgICAgICAgICAgICAgICBpZiAoIWluZm8udmFsaWQKKyAgICAgICAgICAgICAgICAg
ICAgfHwgaW5mby53aWR0aCAhPSB3aWR0aCB8fCBpbmZvLmhlaWdodCAhPSBoZWlnaHQKKyAgICAg
ICAgICAgICAgICAgICAgfHwgaW5mby5pbnRlcm5hbEZvcm1hdCAhPSBpbmZvMC5pbnRlcm5hbEZv
cm1hdCB8fCBpbmZvLnR5cGUgIT0gaW5mbzAudHlwZSkgeworICAgICAgICAgICAgICAgICAgICBt
X2lzQ29tcGxldGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBtX25l
ZWRUb1VzZUJsYWNrVGV4dHVyZSA9IGZhbHNlOworICAgIC8vIE5QT1QKICAgICBpZiAobV9pc05Q
T1QgJiYgKChtX21pbkZpbHRlciAhPSBHcmFwaGljc0NvbnRleHQzRDo6TkVBUkVTVCAmJiBtX21p
bkZpbHRlciAhPSBHcmFwaGljc0NvbnRleHQzRDo6TElORUFSKQogICAgICAgICAgICAgICAgICAg
ICAgfHwgbV93cmFwUyAhPSBHcmFwaGljc0NvbnRleHQzRDo6Q0xBTVBfVE9fRURHRSB8fCBtX3dy
YXBUICE9IEdyYXBoaWNzQ29udGV4dDNEOjpDTEFNUF9UT19FREdFKSkKICAgICAgICAgbV9uZWVk
VG9Vc2VCbGFja1RleHR1cmUgPSB0cnVlOworICAgIC8vIENvbXBsZXRlbmVzcworICAgIGlmICgh
bV9pc0NvbXBsZXRlICYmIG1fbWluRmlsdGVyICE9IEdyYXBoaWNzQ29udGV4dDNEOjpORUFSRVNU
ICYmIG1fbWluRmlsdGVyICE9IEdyYXBoaWNzQ29udGV4dDNEOjpMSU5FQVIpCisgICAgICAgIG1f
bmVlZFRvVXNlQmxhY2tUZXh0dXJlID0gdHJ1ZTsKIH0KIAogfQpJbmRleDogV2ViQ29yZS9odG1s
L2NhbnZhcy9XZWJHTFRleHR1cmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFz
L1dlYkdMVGV4dHVyZS5oCShyZXZpc2lvbiA2MjQ3MCkKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMv
V2ViR0xUZXh0dXJlLmgJKHdvcmtpbmcgY29weSkKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2luY2x1
ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CiAjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNs
dWRlIDx3dGYvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAKQEAgLTQ3LDE5
ICs0OCwyNSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgICAgICBjdWJlTWFwUldyYXBN
b2RlSW5pdGlhbGl6ZWQgPSBpbml0aWFsaXplZDsKICAgICAgICAgfQogCi0gICAgICAgIHZvaWQg
c2V0VGFyZ2V0KHVuc2lnbmVkIGxvbmcpOworICAgICAgICB2b2lkIHNldFRhcmdldCh1bnNpZ25l
ZCBsb25nIHRhcmdldCwgaW50IG1heExldmVsKTsKICAgICAgICAgdm9pZCBzZXRQYXJhbWV0ZXJp
KHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCBwYXJhbSk7CiAgICAgICAgIHZvaWQgc2V0UGFyYW1l
dGVyZih1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0gICAgICAgIHZvaWQgc2V0
U2l6ZSh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdo
dCk7CiAKLSAgICAgICAgdm9pZCBzZXRJbnRlcm5hbEZvcm1hdCh1bnNpZ25lZCBsb25nIGludGVy
bmFsZm9ybWF0KSB7IG1faW50ZXJuYWxGb3JtYXQgPSBpbnRlcm5hbGZvcm1hdDsgfQotICAgICAg
ICB1bnNpZ25lZCBsb25nIGdldEludGVybmFsRm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbV9pbnRl
cm5hbEZvcm1hdDsgfQorICAgICAgICB2b2lkIHNldExldmVsSW5mbyh1bnNpZ25lZCBsb25nIHRh
cmdldCwgaW50IGxldmVsLCB1bnNpZ25lZCBsb25nIGludGVybmFsRm9ybWF0LCBpbnQgd2lkdGgs
IGludCBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgdHlwZSk7CisKKyAgICAgICAgYm9vbCBjYW5HZW5l
cmF0ZU1pcG1hcHMoKTsKKyAgICAgICAgLy8gR2VuZXJhdGUgYWxsIGxldmVsIGluZm9ybWF0aW9u
LgorICAgICAgICB2b2lkIGdlbmVyYXRlTWlwbWFwTGV2ZWxJbmZvKCk7CisKKyAgICAgICAgdW5z
aWduZWQgbG9uZyBnZXRJbnRlcm5hbEZvcm1hdCgpIGNvbnN0OwogCiAgICAgICAgIHN0YXRpYyBi
b29sIGlzTlBPVCh1bnNpZ25lZCwgdW5zaWduZWQpOwogCi0gICAgICAgIGJvb2wgaXNOUE9UKCkg
Y29uc3QgeyByZXR1cm4gbV9pc05QT1Q7IH0KKyAgICAgICAgYm9vbCBpc05QT1QoKSBjb25zdDsK
ICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRleHR1cmUgc2FtcGxpbmcgc2hvdWxkIGFsd2F5cyBy
ZXR1cm4gWzAsIDAsIDAsIDFdIChPcGVuR0wgRVMgMi4wIFNlYyAzLjguMikuCi0gICAgICAgIGJv
b2wgbmVlZFRvVXNlQmxhY2tUZXh0dXJlKCkgY29uc3QgeyByZXR1cm4gbV9uZWVkVG9Vc2VCbGFj
a1RleHR1cmU7IH0KKyAgICAgICAgYm9vbCBuZWVkVG9Vc2VCbGFja1RleHR1cmUoKSBjb25zdDsK
KworICAgICAgICBzdGF0aWMgaW50IGNvbXB1dGVMZXZlbENvdW50KGludCB3aWR0aCwgaW50IGhl
aWdodCk7CiAKICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIFdlYkdMVGV4dHVyZShXZWJHTFJlbmRl
cmluZ0NvbnRleHQqKTsKQEAgLTY5LDcgKzc2LDkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAg
IHByaXZhdGU6CiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc1RleHR1cmUoKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9CiAKLSAgICAgICAgdm9pZCB1cGRhdGVOUE9UU3RhdGVzKCk7CisgICAgICAgIHZv
aWQgdXBkYXRlKCk7CisKKyAgICAgICAgaW50IG1hcFRhcmdldFRvSW5kZXgodW5zaWduZWQgbG9u
Zyk7CiAKICAgICAgICAgYm9vbCBjdWJlTWFwUldyYXBNb2RlSW5pdGlhbGl6ZWQ7CiAKQEAgLTgw
LDEyICs4OSwzNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIGludCBtX3dyYXBTOwog
ICAgICAgICBpbnQgbV93cmFwVDsKIAotICAgICAgICB1bnNpZ25lZCBsb25nIG1faW50ZXJuYWxG
b3JtYXQ7CisgICAgICAgIGNsYXNzIExldmVsSW5mbyB7CisgICAgICAgIHB1YmxpYzoKKyAgICAg
ICAgICAgIExldmVsSW5mbygpCisgICAgICAgICAgICAgICAgOiB2YWxpZChmYWxzZSkKKyAgICAg
ICAgICAgICAgICAsIGludGVybmFsRm9ybWF0KDApCisgICAgICAgICAgICAgICAgLCB3aWR0aCgw
KQorICAgICAgICAgICAgICAgICwgaGVpZ2h0KDApCisgICAgICAgICAgICAgICAgLCB0eXBlKDAp
CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgc2V0SW5m
byh1bnNpZ25lZCBsb25nIGludGVybmFsRm10LCBpbnQgdywgaW50IGgsIHVuc2lnbmVkIGxvbmcg
dHApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAg
ICAgICAgICAgIGludGVybmFsRm9ybWF0ID0gaW50ZXJuYWxGbXQ7CisgICAgICAgICAgICAgICAg
d2lkdGggPSB3OworICAgICAgICAgICAgICAgIGhlaWdodCA9IGg7CisgICAgICAgICAgICAgICAg
dHlwZSA9IHRwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIHZhbGlkOworICAg
ICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnRlcm5hbEZvcm1hdDsKKyAgICAgICAgICAgIGludCB3
aWR0aDsKKyAgICAgICAgICAgIGludCBoZWlnaHQ7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25n
IHR5cGU7CisgICAgICAgIH07CiAKLSAgICAgICAgdW5zaWduZWQgbV93aWR0aFs2XTsKLSAgICAg
ICAgdW5zaWduZWQgbV9oZWlnaHRbNl07CisgICAgICAgIFZlY3RvcjxWZWN0b3I8TGV2ZWxJbmZv
PiA+IG1faW5mbzsKIAogICAgICAgICBib29sIG1faXNOUE9UOworICAgICAgICBib29sIG1faXND
b21wbGV0ZTsKICAgICAgICAgYm9vbCBtX25lZWRUb1VzZUJsYWNrVGV4dHVyZTsKICAgICB9Owog
ICAgIApJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNjI0NzMpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJ
KHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAxMC0wNy0wNCAgWmhlbnlhbyBNbyAg
PHptb0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIE5lZWQgdG8gdHJhY2sgdGV4dHVyZSBjb21wbGV0ZW5lc3MKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQxMzgxCisKKyAgICAgICAgKiBm
YXN0L2NhbnZhcy93ZWJnbC90ZXh0dXJlLWNvbXBsZXRlLWV4cGVjdGVkLnR4dDogQWRkZWQuCisg
ICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wvdGV4dHVyZS1jb21wbGV0ZS5odG1sOiBBZGRlZC4K
KwogMjAxMC0wNy0wNCAgUGV0ZXIgS2FzdGluZyAgPHBrYXN0aW5nQGdvb2dsZS5jb20+CiAKICAg
ICAgICAgVW5yZXZpZXdlZC4gIFVwZGF0ZSBDaHJvbWl1bSB0ZXN0IGV4cGVjdGF0aW9ucy4KSW5k
ZXg6IExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL3RleHR1cmUtY29tcGxldGUtZXhwZWN0
ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL3RleHR1
cmUtY29tcGxldGUtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFz
dC9jYW52YXMvd2ViZ2wvdGV4dHVyZS1jb21wbGV0ZS1leHBlY3RlZC50eHQJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsOCBAQAorIAorQ2hlY2tzIHRoYXQgYSB0ZXh0dXJlIHRoYXQgaXMgbm90IC10
ZXh0dXJlLWNvbXBsZXRlLSBkb2VzIG5vdCBkcmF3IGlmIGZpbHRlcmluZyBuZWVkcyBtaXBzCisK
K1BBU1MgdGV4dHVyZSB0aGF0IGlzIG5vdCAtdGV4dHVyZS1jb21wbGV0ZS0gd2hlbiBURVhUVVJF
X01JTl9GSUxURVIgbm90IE5FQVJFU1Qgb3IgTElORUFSIHNob3VsZCBkcmF3IHdpdGggMCwwLDAs
MjU1CitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJ
bmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvdGV4dHVyZS1jb21wbGV0ZS5odG1s
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL3RleHR1cmUtY29t
cGxldGUuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmds
L3RleHR1cmUtY29tcGxldGUuaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMjMgQEAKKzwh
RE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8v
RU4iCisgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8
aGVhZD4KKzx0aXRsZT5XZWJHTCAiVGV4dHVyZSBDb21wbGV0ZSIgdGV4dHVyZSBjb25mb3JtYW5j
ZSB0ZXN0LjwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2pzL3Jl
c291cmNlcy9qcy10ZXN0LXN0eWxlLmNzcyIvPgorPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL3Jlc291
cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL3V0
aWxzM2QuanMiPiA8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPGNhbnZhcyBpZD0iZXhhbXBs
ZSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiBzdHlsZT0id2lkdGg6IDQwcHg7IGhlaWdodDogNDBw
eDsiPjwvY2FudmFzPgorPGNhbnZhcyBpZD0iY2FudmFzMmQiIHdpZHRoPSIxNiIgaGVpZ2h0PSIx
NiIgc3R5bGU9IndpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7Ij48L2NhbnZhcz4KKzxkaXYgaWQ9
ImRlc2NyaXB0aW9uIj48L2Rpdj4KKzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorPHNjcmlwdCBp
ZD0idnNoYWRlciIgdHlwZT0ieC1zaGFkZXIveC12ZXJ0ZXgiPgorYXR0cmlidXRlIHZlYzQgdlBv
c2l0aW9uOworYXR0cmlidXRlIHZlYzIgdGV4Q29vcmQwOwordmFyeWluZyB2ZWMyIHRleENvb3Jk
Owordm9pZCBtYWluKCkKK3sKKyAgICBnbF9Qb3NpdGlvbiA9IHZQb3NpdGlvbjsKKyAgICB0ZXhD
b29yZCA9IHRleENvb3JkMDsKK30KKzwvc2NyaXB0PgorCis8c2NyaXB0IGlkPSJmc2hhZGVyIiB0
eXBlPSJ4LXNoYWRlci94LWZyYWdtZW50Ij4KK3VuaWZvcm0gc2FtcGxlcjJEIHRleDsKK3Zhcnlp
bmcgdmVjMiB0ZXhDb29yZDsKK3ZvaWQgbWFpbigpCit7CisgICAgZ2xfRnJhZ0NvbG9yID0gdGV4
dHVyZTJEKHRleCwgdGV4Q29vcmQpOworfQorPC9zY3JpcHQ+CisKKzxzY3JpcHQ+CitmdW5jdGlv
biBpbml0KCkKK3sKKyAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgIGxh
eW91dFRlc3RDb250cm9sbGVyLm92ZXJyaWRlUHJlZmVyZW5jZSgiV2ViS2l0V2ViR0xFbmFibGVk
IiwgIjEiKTsKKyAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgIH0KKwor
ICBkZWJ1ZygiQ2hlY2tzIHRoYXQgYSB0ZXh0dXJlIHRoYXQgaXMgbm90IC10ZXh0dXJlLWNvbXBs
ZXRlLSBkb2VzIG5vdCBkcmF3IGlmIisKKyAgICAgICAgIiBmaWx0ZXJpbmcgbmVlZHMgbWlwcyIp
OworICBkZWJ1ZygiIik7CisKKyAgdmFyIGNhbnZhczJkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoImNhbnZhczJkIik7CisgIHZhciBjdHgyZCA9IGNhbnZhczJkLmdldENvbnRleHQoIjJkIik7
CisgIGN0eDJkLmZpbGxTdHlsZSA9ICJyZ2JhKDAsMTkyLDEyOCwyNTUpIjsKKyAgY3R4MmQuZmls
bFJlY3QoMCwgMCwgMTYsIDE2KTsKKworICBnbCA9IGluaXRXZWJHTCgiZXhhbXBsZSIsICJ2c2hh
ZGVyIiwgImZzaGFkZXIiLCBbICJ2UG9zaXRpb24iLCAidGV4Q29vcmQwIl0sCisgICAgICAgICAg
ICAgICAgIFsgMCwgMCwgMCwgMSBdLCAxKTsKKworICBnbC5kaXNhYmxlKGdsLkRFUFRIX1RFU1Qp
OworICBnbC5kaXNhYmxlKGdsLkJMRU5EKTsKKworICB2YXIgdmVydGV4T2JqZWN0ID0gZ2wuY3Jl
YXRlQnVmZmVyKCk7CisgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhPYmpl
Y3QpOworICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICBu
ZXcgRmxvYXQzMkFycmF5KFsgLTEsMSwwLCAxLDEsMCwgLTEsLTEsMCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLTEsLTEsMCwgMSwxLDAsIDEsLTEsMCBdKSwKKyAgICAgICAg
ICAgICAgICBnbC5TVEFUSUNfRFJBVyk7CisgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDAp
OworICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKDAsIDMsIGdsLkZMT0FULCBmYWxzZSwgMCwgMCk7
CisKKyAgdmFyIHZlcnRleE9iamVjdCA9IGdsLmNyZWF0ZUJ1ZmZlcigpOworICBnbC5iaW5kQnVm
ZmVyKGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4T2JqZWN0KTsKKyAgZ2wuYnVmZmVyRGF0YShnbC5B
UlJBWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgbmV3IEZsb2F0MzJBcnJheShbIDAsMCwgMSww
LCAwLDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMSwgMSwwLCAxLDEg
XSksCisgICAgICAgICAgICAgICAgZ2wuU1RBVElDX0RSQVcpOworICBnbC5lbmFibGVWZXJ0ZXhB
dHRyaWJBcnJheSgxKTsKKyAgZ2wudmVydGV4QXR0cmliUG9pbnRlcigxLCAyLCBnbC5GTE9BVCwg
ZmFsc2UsIDAsIDApOworCisgIHZhciB0ZXggPSBnbC5jcmVhdGVUZXh0dXJlKCk7CisgIGdsLmJp
bmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleCk7CisgIC8vIDE2eDE2IHRleHR1cmUgbm8gbWlw
cworICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGds
LlVOU0lHTkVEX0JZVEUsIGNhbnZhczJkKTsKKworICB2YXIgbG9jID0gZ2wuZ2V0VW5pZm9ybUxv
Y2F0aW9uKGdsLnByb2dyYW0sICJ0ZXgiKTsKKyAgZ2wudW5pZm9ybTFpKGxvYywgMCk7CisKKyAg
Y2hlY2tCdWZmZXIoMCwwLDAsMjU1LAorICAgICAgInRleHR1cmUgdGhhdCBpcyBub3QgLXRleHR1
cmUtY29tcGxldGUtIHdoZW4gIiArCisgICAgICAiVEVYVFVSRV9NSU5fRklMVEVSIG5vdCBORUFS
RVNUIG9yIExJTkVBUiBzaG91bGQgZHJhdyB3aXRoIDAsMCwwLDI1NSIpOworCisgIGZ1bmN0aW9u
IGNoZWNrQnVmZmVyKHIsIGcsIGIsIGEsIG1zZykgeworICAgIGdsLmNsZWFyQ29sb3IoMSwxLDEs
MSk7CisgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCB8IGdsLkRFUFRIX0JVRkZFUl9C
SVQpOworICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVTLCAwLCA2KTsKKyAgICBnbC5mbHVz
aCgpOworICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheSg0ICogNCAqIDQpOworICAgIGdsLnJl
YWRQaXhlbHMoMCwgMCwgNCwgNCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgYnVmKTsKKyAg
ICBmb3IgKHZhciBpID0gMDsgaSA8IDQgKiA0OyArK2kpIHsKKyAgICAgIHZhciBvZmZzZXQgPSBp
ICogNDsKKyAgICAgIGlmIChidWZbb2Zmc2V0ICsgMF0gIT0gciB8fAorICAgICAgICAgIGJ1Zltv
ZmZzZXQgKyAxXSAhPSBnIHx8CisgICAgICAgICAgYnVmW29mZnNldCArIDJdICE9IGIgfHwKKyAg
ICAgICAgICBidWZbb2Zmc2V0ICsgM10gIT0gYSkgeworICAgICAgICBkZWJ1ZygnZXhwZWN0ZWQ6
ICcgKyByICsgJywgJyArIGcgKyAnLCAnICsgYiArICcsICcgKyBhICsKKyAgICAgICAgICAgICAg
JyB3YXM6ICcgKworICAgICAgICAgICAgICBidWZbb2Zmc2V0ICsgMF0gKyAnLCAnICsKKyAgICAg
ICAgICAgICAgYnVmW29mZnNldCArIDFdICsgJywgJyArCisgICAgICAgICAgICAgIGJ1ZltvZmZz
ZXQgKyAyXSArICcsICcgKworICAgICAgICAgICAgICBidWZbb2Zmc2V0ICsgM10pOworICAgICAg
ICB0ZXN0RmFpbGVkKG1zZyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAg
dGVzdFBhc3NlZChtc2cpOworICB9Cit9CisKK2luaXQoKTsKK3N1Y2Nlc3NmdWxseVBhcnNlZCA9
IHRydWU7Cis8L3NjcmlwdD4KKworPHNjcmlwdCBzcmM9Ii4uLy4uL2pzL3Jlc291cmNlcy9qcy10
ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorCis8L2JvZHk+Cis8L2h0bWw+CisK
</data>
<flag name="review"
          id="48028"
          type_id="1"
          status="+"
          setter="fishd"
    />
    <flag name="commit-queue"
          id="48029"
          type_id="3"
          status="-"
          setter="zmo"
    />
          </attachment>
      

    </bug>

</bugzilla>