<?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>82114</bug_id>
          
          <creation_ts>2012-03-23 19:06:49 -0700</creation_ts>
          <short_desc>[chromium] Simplify and fix CCLayerSorter</short_desc>
          <delta_ts>2012-03-26 17:17:57 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Vangelis Kokkevis">vangelis</reporter>
          <assigned_to name="Vangelis Kokkevis">vangelis</assigned_to>
          <cc>cc-bugs</cc>
    
    <cc>enne</cc>
    
    <cc>jamesr</cc>
    
    <cc>kbr</cc>
    
    <cc>shawnsingh</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>586969</commentid>
    <comment_count>0</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2012-03-23 19:06:49 -0700</bug_when>
    <thetext>CCLayerSorter is unnecessarily complex and doesn&apos;t work quite correctly.  The code can be greatly simplified by taking advantage of some of the existing datastructures in WebCore.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>587200</commentid>
    <comment_count>1</comment_count>
      <attachid>133660</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2012-03-24 16:09:19 -0700</bug_when>
    <thetext>Created attachment 133660
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>588252</commentid>
    <comment_count>2</comment_count>
      <attachid>133660</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2012-03-26 16:02:48 -0700</bug_when>
    <thetext>Comment on attachment 133660
Patch

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

Looks good overall. A couple of minor comments. r=me

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerSorter.cpp:86
&gt; +CCLayerSorter::ABCompareResult CCLayerSorter::checkOverlap(LayerShape* a, LayerShape* b, float zThreshold, float* weight)

I&apos;m pretty sure that the preferred style in WebKit would be to use a reference rather than a pointer for the outgoing argument &quot;weight&quot;.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerSorter.cpp:242
&gt; +    float zThreshold = m_zRange * 0.01;

Magic constant? Should this be defined somewhere above and named?

&gt; Source/WebKit/chromium/tests/CCLayerSorterTest.cpp:37
&gt; +TEST(CCLayerSorterTest, CheckOverlap)

These tests should be split up for finer grained reporting of results.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>588349</commentid>
    <comment_count>3</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2012-03-26 17:16:43 -0700</bug_when>
    <thetext>Committed r112182: &lt;http://trac.webkit.org/changeset/112182&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>588351</commentid>
    <comment_count>4</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2012-03-26 17:17:57 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 133660 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=133660&amp;action=review
&gt; 
&gt; Looks good overall. A couple of minor comments. r=me
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerSorter.cpp:86
&gt; &gt; +CCLayerSorter::ABCompareResult CCLayerSorter::checkOverlap(LayerShape* a, LayerShape* b, float zThreshold, float* weight)
&gt; 
&gt; I&apos;m pretty sure that the preferred style in WebKit would be to use a reference rather than a pointer for the outgoing argument &quot;weight&quot;.

Done.

&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerSorter.cpp:242
&gt; &gt; +    float zThreshold = m_zRange * 0.01;
&gt; 
&gt; Magic constant? Should this be defined somewhere above and named?
&gt;

Done.
 
&gt; &gt; Source/WebKit/chromium/tests/CCLayerSorterTest.cpp:37
&gt; &gt; +TEST(CCLayerSorterTest, CheckOverlap)
&gt; 
&gt; These tests should be split up for finer grained reporting of results.

Done.

Modified and landed.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>133660</attachid>
            <date>2012-03-24 16:09:19 -0700</date>
            <delta_ts>2012-03-26 16:02:48 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-82114-20120324160848.patch</filename>
            <type>text/plain</type>
            <size>36509</size>
            <attacher name="Vangelis Kokkevis">vangelis</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMTk2NSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU0IEBACisyMDEyLTAzLTIzICBWYW5nZWxp
cyBLb2trZXZpcyAgPHZhbmdlbGlzQGNocm9taXVtLm9yZz4KKworICAgICAgICBbY2hyb21pdW1d
IFNpbXBsaWZ5IGFuZCBmaXggQ0NMYXllclNvcnRlcgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODIxMTQKKworICAgICAgICBBIHNpZ25pZmljYW50IGNs
ZWFudXAsIHNpbXBsaWZpY2F0aW9uIGFuZCBpbXByb3ZlbWVudCBvZiB0aGUgQ0NMYXllclNvcnRl
ciBjb2RlLgorICAgICAgICBTaW1wbGlmaWVkIHRoZSBMYXllclNoYXBlIHN0cnVjdHVyZSB0byB1
c2UgV2ViQ29yZSdzIEZsb2F0UXVhZCBmb3IgYWxsIG92ZXJsYXAgdGVzdHMuCisgICAgICAgIEJ5
IHRyZWF0aW5nIGV2ZXJ5IGxheWVyIGFzIHR3byB0cmlhbmdsZXMsIHRoZSBvbGQgb3ZlcmxhcCBj
b2RlIGRpZCBhIGxvdCBvZiByZWR1bmRhbnQgd29yaworICAgICAgICBpbmNsdWRpbmcgdGVzdGlu
ZyB0d28gb2YgdGhlIHZlcnRpY2VzIG9mIHRoZSBsYXllciBhbmQgaXRzIGRpYWdvbmFsIHR3aWNl
LiBUaGUgbmV3IG92ZXJsYXAKKyAgICAgICAgdGVzdHMgY2hlY2s6CisgICAgICAgIDEuIFRoZSBm
b3VyIGNvcm5lcnMgb2YgZWFjaCBvZiB0aGUgdHdvIGxheWVycyBhZ2FpbnN0IHRoZSBvdGhlciBs
YXllci4KKyAgICAgICAgMi4gVGhlIGZvdXIgZWRnZXMgb2YgZWFjaCBsYXllciBhZ2FpbnN0IHRo
ZSBlZGdlcyBvZiB0aGUgb3RoZXIgbGF5ZXIuCisgICAgICAgIFVubGlrZSB0aGUgb2xkIGNvZGUs
IHRoZSBuZXcgY29kZSBoYXMgbm8gZWFybHktb3V0cyBpbiB0aGUgb3ZlcmxhcCB0ZXN0cyBhcyB0
aG9zZSB3aGVyZSBjYXVzaW5nCisgICAgICAgIHVzIHRvIG1pc3MgbGVnaXRpbWF0ZSBvdmVybGFw
cy4KKyAgICAgICAgQSBuZXcgdGVjaG5pcXVlIGZvciBicmVha2luZyBkZXBlbmRlbmN5IGN5Y2xl
cyBpbnRyb2R1Y2VkIGJ5IGludGVyc2VjdGluZyBsYXllcnMgaXMgaW1wbGVtZW50ZWQuCisgICAg
ICAgIEluc3RlYWQgb2YgYXJiaXRyYXJpbHkgYnJlYWtpbmcgY3ljbGVzIGJ5IGNob29zaW5nIHRo
ZSBub2RlIGluIHRoZSBncmFwaCB3aXRoIHRoZSBzbWFsbGVzdCBudW1iZXIgb2YKKyAgICAgICAg
aW5jb21pbmcgZWRnZXMgKGkuZS4gbGF5ZXJzIHRoYXQgbmVlZCB0byBiZSBkcmF3biBiZWZvcmUg
aXQpIHdlIGNob3NlIHRoZSBvbmUgd2l0aCB0aGUgc21hbGxlc3Qgc3VtCisgICAgICAgIG9mIGdy
YXBoIGVkZ2Ugd2VpZ2h0cyAoZGVmaW5lZCBhcyB0aGUgbWF4IGRlcHRoIGRpZmZlcmVuY2UgYmV0
d2VlbiB0d28gbGF5ZXJzKS4gTGF5ZXJzIHRoYXQgaW50ZXJzZWN0CisgICAgICAgIGhhdmUgdGhl
aXIgcmVzcGVjdGl2ZSBncmFwaCBlZGdlIHdlaWdodCBzZXQgdG8gemVybywgbWFraW5nIHRoZW0g
bW9yZSBsaWtlbHkgdG8gYmUgcGlja2VkIGZvciBicmVha2luZworICAgICAgICB0aGUgY3ljbGVz
IChpdCdzIG5vdCBhIHBlcmZlY3Qgc29sdXRpb24gYnV0IGl0IHNlZW1zIHRvIHBlcmZvcm0gbXVj
aCBiZXR0ZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lKS4KKworICAgICAgICBJbiBhZGRpdGlvbiB0
byBiZWluZyBvdmVybHkgY29tcGxleCBhbmQgZG9pbmcgcmVkdW50YW50IHdvcmssIHRoZSBvbGQg
Y29kZSB3YXMgbWlzc2luZyBhCisgICAgICAgIHBlcnNwZWN0aXZlIGRpdmlkZSB3aGVuIGNvbXB1
dGluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGxheWVyJ3MgY29ybmVycyBpbiB0aGUgcHJvamVj
dGVkIHBsYW5lCisgICAgICAgIHdoaWNoIHdhcyB0aGUgc291cmNlIG9mIGEgbG90IG9mIG1pcy1z
b3J0ZWQgcmVzdWx0cy4KKworICAgICAgICBJbiBhbGwsIHRoZXNlIGltcHJvdmVtZW50cywgZml4
IGEgbG90IG9mIG91dHN0YW5kaW5nIGlzc3VlcyB3aXRoIGxheWVyIHNvcnRpbmcsIG9uIHBhZ2Vz
IHN1Y2ggYXM6CisgICAgICAgIGh0dHA6Ly93d3cua2VpdGhjbGFyay5jby51ay9sYWJzLzNkY3Nz
L2RlbW8vCisgICAgICAgIGh0cHA6Ly8yMDEyLmJlZXJjYW1wLmNvbQorICAgICAgICBodHRwczov
L2RldmVsb3Blci5tb3ppbGxhLm9yZy9mci9kZW1vcy9kZXRhaWwvdGhlLWJveC9sYXVuY2gKKwor
ICAgICAgICBUZXN0czogQ0NMYXllclNvcnRlciB1bml0IHRlc3RzLgorCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclNvcnRlci5jcHA6CisgICAgICAgIChX
ZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OnBlcnBQcm9kdWN0KToKKyAgICAgICAgKFdlYkNv
cmU6OmVkZ2VFZGdlVGVzdCk6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVyU29ydGVyOjpjaGVj
a092ZXJsYXApOgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclNvcnRlcjo6TGF5ZXJTaGFwZTo6
TGF5ZXJTaGFwZSk6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVyU29ydGVyOjpMYXllclNoYXBl
OjpsYXllclpGcm9tUHJvamVjdGVkUG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclNv
cnRlcjo6Y3JlYXRlR3JhcGhOb2Rlcyk6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVyU29ydGVy
OjpjcmVhdGVHcmFwaEVkZ2VzKToKKyAgICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJTb3J0ZXI6OnNv
cnQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJTb3J0
ZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJTb3J0ZXI6OkNDTGF5ZXJTb3J0ZXIpOgor
ICAgICAgICAoQ0NMYXllclNvcnRlcik6CisgICAgICAgIChMYXllclNoYXBlKToKKyAgICAgICAg
KFdlYkNvcmU6OkNDTGF5ZXJTb3J0ZXI6OkdyYXBoTm9kZTo6R3JhcGhOb2RlKToKKyAgICAgICAg
KEdyYXBoTm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVyU29ydGVyOjpHcmFwaEVkZ2U6
OkdyYXBoRWRnZSk6CisgICAgICAgIChHcmFwaEVkZ2UpOgorCiAyMDEyLTAzLTIzICBTaGF3biBT
aW5naCAgPHNoYXduc2luZ2hAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtjaHJvbWl1bV0gRml4
IHJhY2UgYnVnIHRoYXQgY2xvYmJlcnMgQ0NMYXllckltcGwgdXBkYXRlUmVjdApJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclNvcnRlci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vY2MvQ0NMYXllclNvcnRlci5jcHAJKHJldmlzaW9uIDExMTYxMSkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJTb3J0ZXIuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC00Niw1NiArNDYsMTEgQEAgc3RhdGljIFdURkxvZ0NoYW5uZWwgTG9nQ0NM
YXllclNvcnRlciA9CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotYm9vbCBDQ0xheWVyU29ydGVy
Ojpwb2ludEluVHJpYW5nbGUoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBhLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgYiwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIGMpCi17Ci0gICAgLy8g
QWxnb3JpdGhtIGZyb20gaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BvaW50aW5wb2x5
L2RlZmF1bHQuaHRtbAotICAgIGZsb2F0IHgwID0gYy54KCkgLSBhLngoKTsKLSAgICBmbG9hdCB5
MCA9IGMueSgpIC0gYS55KCk7Ci0gICAgZmxvYXQgeDEgPSBiLngoKSAtIGEueCgpOwotICAgIGZs
b2F0IHkxID0gYi55KCkgLSBhLnkoKTsKLSAgICBmbG9hdCB4MiA9IHBvaW50LngoKSAtIGEueCgp
OwotICAgIGZsb2F0IHkyID0gcG9pbnQueSgpIC0gYS55KCk7Ci0KLSAgICBmbG9hdCBkb3QwMCA9
IHgwICogeDAgKyB5MCAqIHkwOwotICAgIGZsb2F0IGRvdDAxID0geDAgKiB4MSArIHkwICogeTE7
Ci0gICAgZmxvYXQgZG90MDIgPSB4MCAqIHgyICsgeTAgKiB5MjsKLSAgICBmbG9hdCBkb3QxMSA9
IHgxICogeDEgKyB5MSAqIHkxOwotICAgIGZsb2F0IGRvdDEyID0geDEgKiB4MiArIHkxICogeTI7
Ci0gICAgZmxvYXQgZGVub21pbmF0b3IgPSBkb3QwMCAqIGRvdDExIC0gZG90MDEgKiBkb3QwMTsK
LSAgICBpZiAoIWRlbm9taW5hdG9yKQotICAgICAgICAvLyBUcmlhbmdsZSBpcyB6ZXJvLWFyZWEu
IFRyZWF0IHF1ZXJ5IHBvaW50IGFzIG5vdCBiZWluZyBpbnNpZGUuCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICAvLyBDb21wdXRlCi0gICAgZmxvYXQgaW52ZXJzZURlbm9taW5hdG9yID0gMS4w
ZiAvIGRlbm9taW5hdG9yOwotICAgIGZsb2F0IHUgPSAoZG90MTEgKiBkb3QwMiAtIGRvdDAxICog
ZG90MTIpICogaW52ZXJzZURlbm9taW5hdG9yOwotICAgIGZsb2F0IHYgPSAoZG90MDAgKiBkb3Qx
MiAtIGRvdDAxICogZG90MDIpICogaW52ZXJzZURlbm9taW5hdG9yOwotCi0gICAgcmV0dXJuICh1
ID4gMC4wZikgJiYgKHYgPiAwLjBmKSAmJiAodSArIHYgPCAxLjBmKTsKLX0KLQogaW5saW5lIHN0
YXRpYyBmbG9hdCBwZXJwUHJvZHVjdChjb25zdCBGbG9hdFNpemUmIHUsIGNvbnN0IEZsb2F0U2l6
ZSYgdikKIHsKICAgICByZXR1cm4gdS53aWR0aCgpICogdi5oZWlnaHQoKSAtIHUuaGVpZ2h0KCkg
KiB2LndpZHRoKCk7CiB9CiAKLWlubGluZSBzdGF0aWMgZmxvYXQgaW5uZXJQcm9kdWN0KGNvbnN0
IEZsb2F0U2l6ZSYgdSwgY29uc3QgRmxvYXRTaXplJiB2KQotewotICAgIHJldHVybiB1LndpZHRo
KCkgKiB2LndpZHRoKCkgKyB1LmhlaWdodCgpICogdi5oZWlnaHQoKTsKLX0KLQotCi1pbmxpbmUg
c3RhdGljIGJvb2wgcG9pbnRJbkNvbGluZWFyRWRnZShjb25zdCBGbG9hdFBvaW50JiBwLCBjb25z
dCBGbG9hdFBvaW50JiBhLCBjb25zdCBGbG9hdFBvaW50JiBiKQotewotICAgIC8vIGlmIGFiIGlz
IG5vdCB2ZXJ0aWNhbC4KLSAgICBpZiAoYS54KCkgIT0gYi54KCkpCi0gICAgICAgIHJldHVybiAo
cC54KCkgPj0gbWluKGEueCgpLCBiLngoKSkgJiYgcC54KCkgPD0gbWF4KGEueCgpLCBiLngoKSkp
OwotCi0gICAgcmV0dXJuIChwLnkoKSA+PSBtaW4oYS55KCksIGIueSgpKSAmJiBwLnkoKSA8PSBt
YXgoYS55KCksIGIueSgpKSk7Ci19Ci0KIC8vIFRlc3RzIGlmIHR3byBlZGdlcyBkZWZpbmVkIGJ5
IHRoZWlyIGVuZHBvaW50cyAoYSxiKSBhbmQgKGMsZCkgaW50ZXJzZWN0LiBSZXR1cm5zIHRydWUg
YW5kIHRoZQogLy8gcG9pbnQgb2YgaW50ZXJzZWN0aW9uIGlmIHRoZXkgZG8gYW5kIGZhbHNlIG90
aGVyd2lzZS4KIHN0YXRpYyBib29sIGVkZ2VFZGdlVGVzdChjb25zdCBGbG9hdFBvaW50JiBhLCBj
b25zdCBGbG9hdFBvaW50JiBiLCBjb25zdCBGbG9hdFBvaW50JiBjLCBjb25zdCBGbG9hdFBvaW50
JiBkLCBGbG9hdFBvaW50JiByKQpAQCAtMTA2LDMxICs2MSwxMiBAQCBzdGF0aWMgYm9vbCBlZGdl
RWRnZVRlc3QoY29uc3QgRmxvYXRQb2luCiAKICAgICBmbG9hdCBkZW5vbSA9IHBlcnBQcm9kdWN0
KHUsIHYpOwogCi0gICAgLy8gSWYgZGVub20gPT0gMCB0aGVuIHRoZSBlZGdlcyBhcmUgcGFyYWxs
ZWwuCi0gICAgaWYgKCFkZW5vbSkgewotICAgICAgICAvLyBJZiB0aGUgZWRnZXMgYXJlIG5vdCBj
b2xpbmVhciB0aGVuIHRoZXJlJ3Mgbm8gaW50ZXJzZWN0aW9uLgotICAgICAgICBpZiAocGVycFBy
b2R1Y3QodSwgdykgfHwgcGVycFByb2R1Y3QodiwgdykpCi0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICAgICAgaWYgKHBvaW50SW5Db2xpbmVhckVkZ2UoYSwgYywgZCkpIHsKLSAgICAg
ICAgICAgIHIgPSBhOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKHBvaW50SW5Db2xpbmVhckVkZ2UoYiwgYywgZCkpIHsKLSAgICAgICAgICAgIHIgPSBi
OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvaW50
SW5Db2xpbmVhckVkZ2UoYywgYSwgYikpIHsKLSAgICAgICAgICAgIHIgPSBjOwotICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvaW50SW5Db2xpbmVhckVk
Z2UoZCwgYSwgYikpIHsKLSAgICAgICAgICAgIHIgPSBkOwotICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgICAgIH0KLQorICAgIC8vIElmIGRlbm9tID09IDAgdGhlbiB0aGUgZWRnZXMgYXJl
IHBhcmFsbGVsLiBXaGlsZSB0aGV5IGNvdWxkIGJlIG92ZXJsYXBwaW5nCisgICAgLy8gd2UgZG9u
J3QgYm90aGVyIHRvIGNoZWNrIGhlcmUgYXMgdGhlIHdlJ2xsIGZpbmQgdGhlaXIgaW50ZXJzZWN0
aW9ucyBmcm9tIHRoZQorICAgIC8vIGNvcm5lciB0byBxdWFkIHRlc3RzLgorICAgIGlmICghZGVu
b20pCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisKICAgICBmbG9hdCBzID0gcGVycFBy
b2R1Y3QodiwgdykgLyBkZW5vbTsKICAgICBpZiAocyA8IDAgfHwgcyA+IDEpCiAgICAgICAgIHJl
dHVybiBmYWxzZTsKQEAgLTE0NCwxMDUgKzgwLDExNCBAQCBzdGF0aWMgYm9vbCBlZGdlRWRnZVRl
c3QoY29uc3QgRmxvYXRQb2luCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWZsb2F0IENDTGF5ZXJT
b3J0ZXI6OmNhbGN1bGF0ZVpEaWZmKGNvbnN0IExheWVyU2hhcGUmIGxheWVyQSwgY29uc3QgTGF5
ZXJTaGFwZSYgbGF5ZXJCLCBmbG9hdCBlYXJseUV4aXRUaHJlc2hvbGQpCisvLyBDaGVja3Mgd2hl
dGhlciBsYXllciAiYSIgZHJhd3Mgb24gdG9wIG9mIGxheWVyICJiIi4gVGhlIHdlaWdodCB2YWx1
ZSByZXR1cm5lZCBpcyBhbiBpbmRpY2F0aW9uIG9mCisvLyB0aGUgbWF4aW11bSB6LWRlcHRoIGRp
ZmZlcmVuY2UgYmV0d2VlbiB0aGUgbGF5ZXJzIG9yIHplcm8gaWYgdGhlIGxheWVycyBhcmUgZm91
bmQgdG8gYmUgaW50ZXNlY3RpbmcKKy8vIChzb21lIGZlYXR1cmVzIGFyZSBpbiBmcm9udCBhbmQg
c29tZSBhcmUgYmVoaW5kKS4KK0NDTGF5ZXJTb3J0ZXI6OkFCQ29tcGFyZVJlc3VsdCBDQ0xheWVy
U29ydGVyOjpjaGVja092ZXJsYXAoTGF5ZXJTaGFwZSogYSwgTGF5ZXJTaGFwZSogYiwgZmxvYXQg
elRocmVzaG9sZCwgZmxvYXQqIHdlaWdodCkKIHsKLSAgICBMYXllckludGVyc2VjdG9yIGludGVy
c2VjdG9yKGxheWVyQSwgbGF5ZXJCLCBlYXJseUV4aXRUaHJlc2hvbGQpOwotICAgIGludGVyc2Vj
dG9yLmdvKCk7Ci0gICAgcmV0dXJuIGludGVyc2VjdG9yLnpEaWZmOwotfQorICAgICp3ZWlnaHQg
PSAwOwogCi1DQ0xheWVyU29ydGVyOjpMYXllckludGVyc2VjdG9yOjpMYXllckludGVyc2VjdG9y
KGNvbnN0IExheWVyU2hhcGUmIGxheWVyQSwgY29uc3QgTGF5ZXJTaGFwZSYgbGF5ZXJCLCBmbG9h
dCBlYXJseUV4aXRUaHJlc2hvbGQpCi0gICAgOiBsYXllckEobGF5ZXJBKQotICAgICwgbGF5ZXJC
KGxheWVyQikKLSAgICAsIHpEaWZmKDApCi0gICAgLCBlYXJseUV4aXRUaHJlc2hvbGQoZWFybHlF
eGl0VGhyZXNob2xkKQotewotfQorICAgIC8vIEVhcmx5IG91dCBpZiB0aGUgcHJvamVjdGVkIGJv
dW5kcyBkb24ndCBvdmVybGFwLgorICAgIGlmICghYS0+cHJvamVjdGVkQm91bmRzLmludGVyc2Vj
dHMoYi0+cHJvamVjdGVkQm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5vbmU7CiAKLXZvaWQgQ0NM
YXllclNvcnRlcjo6TGF5ZXJJbnRlcnNlY3Rvcjo6Z28oKQotewotICAgICh0cmlhbmdsZVRyaWFu
Z2xlVGVzdChsYXllckEuYzEsIGxheWVyQS5jMiwgbGF5ZXJBLmMzLCBsYXllckIuYzEsIGxheWVy
Qi5jMiwgbGF5ZXJCLmMzKQotICAgICB8fCB0cmlhbmdsZVRyaWFuZ2xlVGVzdChsYXllckEuYzMs
IGxheWVyQS5jNCwgbGF5ZXJBLmMxLCBsYXllckIuYzEsIGxheWVyQi5jMiwgbGF5ZXJCLmMzKQot
ICAgICB8fCB0cmlhbmdsZVRyaWFuZ2xlVGVzdChsYXllckEuYzEsIGxheWVyQS5jMiwgbGF5ZXJB
LmMzLCBsYXllckIuYzMsIGxheWVyQi5jNCwgbGF5ZXJCLmMxKQotICAgICB8fCB0cmlhbmdsZVRy
aWFuZ2xlVGVzdChsYXllckEuYzMsIGxheWVyQS5jNCwgbGF5ZXJBLmMxLCBsYXllckIuYzMsIGxh
eWVyQi5jNCwgbGF5ZXJCLmMxKSk7Ci19CisgICAgRmxvYXRQb2ludCBhUG9pbnRzWzRdID0ge2Et
PnByb2plY3RlZFF1YWQucDEoKSwgYS0+cHJvamVjdGVkUXVhZC5wMigpLCBhLT5wcm9qZWN0ZWRR
dWFkLnAzKCksIGEtPnByb2plY3RlZFF1YWQucDQoKSB9OworICAgIEZsb2F0UG9pbnQgYlBvaW50
c1s0XSA9IHtiLT5wcm9qZWN0ZWRRdWFkLnAxKCksIGItPnByb2plY3RlZFF1YWQucDIoKSwgYi0+
cHJvamVjdGVkUXVhZC5wMygpLCBiLT5wcm9qZWN0ZWRRdWFkLnA0KCkgfTsKIAotLy8gQ2hlY2tz
IGlmIHNlZ21lbnQgcHEgaW50ZXJzZWN0cyBhbnkgb2YgdGhlIHNpZGVzIG9mIHRyaWFuZ2xlIGFi
Yy4KLWJvb2wgQ0NMYXllclNvcnRlcjo6TGF5ZXJJbnRlcnNlY3Rvcjo6ZWRnZVRyaWFuZ2xlVGVz
dChjb25zdCBGbG9hdFBvaW50JiBwLCBjb25zdCBGbG9hdFBvaW50JiBxLCBjb25zdCBGbG9hdFBv
aW50JiBhLCBjb25zdCBGbG9hdFBvaW50JiBiLCBjb25zdCBGbG9hdFBvaW50JiBjKQoteworICAg
IC8vIE1ha2UgYSBsaXN0IG9mIHBvaW50cyB0aGF0IGluc2lkZSBib3RoIGxheWVyIHF1YWQgcHJv
amVjdGlvbnMuCisgICAgVmVjdG9yPEZsb2F0UG9pbnQ+IG92ZXJsYXBQb2ludHM7CisKKyAgICAv
LyBDaGVjayBhbGwgZm91ciBjb3JuZXJzIG9mIG9uZSBsYXllciBhZ2FpbnN0IHRoZSBvdGhlciBs
YXllcidzIHF1YWQuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAg
aWYgKGEtPnByb2plY3RlZFF1YWQuY29udGFpbnNQb2ludChiUG9pbnRzW2ldKSkKKyAgICAgICAg
ICAgIG92ZXJsYXBQb2ludHMuYXBwZW5kKGJQb2ludHNbaV0pOworICAgICAgICBpZiAoYi0+cHJv
amVjdGVkUXVhZC5jb250YWluc1BvaW50KGFQb2ludHNbaV0pKQorICAgICAgICAgICAgb3Zlcmxh
cFBvaW50cy5hcHBlbmQoYVBvaW50c1tpXSk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgYWxsIHRo
ZSBlZGdlcyBvZiBvbmUgbGF5ZXIgZm9yIGludGVyc2VjdGlvbiB3aXRoIHRoZSBvdGhlciBsYXll
cidzIGVkZ2VzLgogICAgIEZsb2F0UG9pbnQgcjsKLSAgICBpZiAoKGVkZ2VFZGdlVGVzdChwLCBx
LCBhLCBiLCByKSAmJiBjaGVja1pEaWZmKHIpKQotICAgICAgICB8fCAoZWRnZUVkZ2VUZXN0KHAs
IHEsIGEsIGMsIHIpICYmIGNoZWNrWkRpZmYocikpCi0gICAgICAgIHx8IChlZGdlRWRnZVRlc3Qo
cCwgcSwgYiwgYywgcikgJiYgY2hlY2taRGlmZihyKSkpCi0gICAgICAgIHJldHVybiB0cnVlOwor
ICAgIGZvciAoaW50IGVhID0gMDsgZWEgPCA0OyArK2VhKQorICAgICAgICBmb3IgKGludCBlYiA9
IDA7IGViIDwgNDsgKytlYikKKyAgICAgICAgICAgIGlmIChlZGdlRWRnZVRlc3QoYVBvaW50c1tl
YV0sIGFQb2ludHNbKGVhICsgMSkgJSA0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YlBvaW50c1tlYl0sIGJQb2ludHNbKGViICsgMSkgJSA0XSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcikpCisgICAgICAgICAgICAgICAgb3ZlcmxhcFBvaW50cy5hcHBlbmQocik7CiAK
LSAgICByZXR1cm4gZmFsc2U7Ci19CisgICAgaWYgKCFvdmVybGFwUG9pbnRzLnNpemUoKSkKKyAg
ICAgICAgcmV0dXJuIE5vbmU7CiAKLS8vIENoZWNrcyBpZiB0d28gY28tcGxhbmFyIHRyaWFuZ2xl
cyBpbnRlcnNlY3QuCi1ib29sIENDTGF5ZXJTb3J0ZXI6OkxheWVySW50ZXJzZWN0b3I6OnRyaWFu
Z2xlVHJpYW5nbGVUZXN0KGNvbnN0IEZsb2F0UG9pbnQmIGExLCBjb25zdCBGbG9hdFBvaW50JiBi
MSwgY29uc3QgRmxvYXRQb2ludCYgYzEsIGNvbnN0IEZsb2F0UG9pbnQmIGEyLCBjb25zdCBGbG9h
dFBvaW50JiBiMiwgY29uc3QgRmxvYXRQb2ludCYgYzIpCi17Ci0gICAgLy8gQ2hlY2sgYWxsIGVk
Z2VzIG9mIGZpcnN0IHRyaWFuZ2xlIHdpdGggZWRnZXMgb2YgdGhlIHNlY29uZCBvbmUuCi0gICAg
aWYgKGVkZ2VUcmlhbmdsZVRlc3QoYTEsIGIxLCBhMiwgYjIsIGMyKQotICAgICAgICB8fCBlZGdl
VHJpYW5nbGVUZXN0KGExLCBjMSwgYTIsIGIyLCBjMikKLSAgICAgICAgfHwgZWRnZVRyaWFuZ2xl
VGVzdChiMSwgYzEsIGEyLCBiMiwgYzIpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8v
IENoZWNrIGFsbCBwb2ludHMgb2YgdGhlIGZpcnN0IHRyaWFuZ2xlIGZvciBpbmNsdXNpb24gaW4g
dGhlIHNlY29uZCB0cmlhbmdsZS4KLSAgICBpZiAoKHBvaW50SW5UcmlhbmdsZShhMSwgYTIsIGIy
LCBjMikgJiYgY2hlY2taRGlmZihhMSkpCi0gICAgICAgIHx8IChwb2ludEluVHJpYW5nbGUoYjEs
IGEyLCBiMiwgYzIpICYmIGNoZWNrWkRpZmYoYjEpKQotICAgICAgICB8fCAocG9pbnRJblRyaWFu
Z2xlKGMxLCBhMiwgYjIsIGMyKSAmJiBjaGVja1pEaWZmKGMxKSkpCi0gICAgICAgIHJldHVybiB0
cnVlOwotCi0gICAgLy8gQ2hlY2sgYWxsIHBvaW50cyBvZiB0aGUgc2Vjb25kIHRyaWFuZ2xlIGZv
ciBpbmNsdXNpb24gaW4gdGhlIGZpcnN0IHRyaWFuZ2xlLgotICAgIGlmICgocG9pbnRJblRyaWFu
Z2xlKGEyLCBhMSwgYjEsIGMxKSAmJiBjaGVja1pEaWZmKGEyKSkKLSAgICAgICAgfHwgKHBvaW50
SW5UcmlhbmdsZShiMiwgYTEsIGIxLCBjMSkgJiYgY2hlY2taRGlmZihiMikpCi0gICAgICAgIHx8
IChwb2ludEluVHJpYW5nbGUoYzIsIGExLCBiMSwgYzEpICYmIGNoZWNrWkRpZmYoYzIpKSkKLSAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gQ2hlY2sgdGhlIGNvcnJlc3BvbmRpbmcgbGF5ZXIg
ZGVwdGggdmFsdWUgZm9yIGFsbCBvdmVybGFwIHBvaW50cyB0byBkZXRlcm1pbmUKKyAgICAvLyB3
aGljaCBsYXllciBpcyBpbiBmcm9udC4KKyAgICBmbG9hdCBtYXhQb3NpdGl2ZSA9IDA7CisgICAg
ZmxvYXQgbWF4TmVnYXRpdmUgPSAwOworICAgIGZvciAodW5zaWduZWQgbyA9IDA7IG8gPCBvdmVy
bGFwUG9pbnRzLnNpemUoKTsgbysrKSB7CisgICAgICAgIGZsb2F0IHphID0gYS0+bGF5ZXJaRnJv
bVByb2plY3RlZFBvaW50KG92ZXJsYXBQb2ludHNbb10pOworICAgICAgICBmbG9hdCB6YiA9IGIt
PmxheWVyWkZyb21Qcm9qZWN0ZWRQb2ludChvdmVybGFwUG9pbnRzW29dKTsKKworICAgICAgICBm
bG9hdCBkaWZmID0gemEgLSB6YjsKKyAgICAgICAgaWYgKGRpZmYgPiBtYXhQb3NpdGl2ZSkKKyAg
ICAgICAgICAgIG1heFBvc2l0aXZlID0gZGlmZjsKKyAgICAgICAgaWYgKGRpZmYgPCBtYXhOZWdh
dGl2ZSkKKyAgICAgICAgICAgIG1heE5lZ2F0aXZlID0gZGlmZjsKKyAgICB9CisKKyAgICBmbG9h
dCBtYXhEaWZmID0gKGZhYnNmKG1heFBvc2l0aXZlKSA+IGZhYnNmKG1heE5lZ2F0aXZlKSA/IG1h
eFBvc2l0aXZlIDogbWF4TmVnYXRpdmUpOwogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIC8vIElm
IHRoZSByZXN1bHRzIGFyZSBpbmNvbnNpc3RlbnQgKGFuZCB0aGUgeiBkaWZmZXJlbmNlIHN1YnN0
YW50aWFsIHRvIHJ1bGUgb3V0CisgICAgLy8gbnVtZXJpY2FsIGVycm9ycykgdGhlbiB0aGUgbGF5
ZXJzIGFyZSBpbnRlcnNlY3RpbmcuIFdlIHdpbGwgc3RpbGwgcmV0dXJuIGFuCisgICAgLy8gb3Jk
ZXIgYmFzZWQgb24gdGhlIG1heGltdW0gZGVwdGggZGlmZmVyZW5jZSBidXQgd2l0aCBhbiBlZGdl
IHdlaWdodCBvZiB6ZXJvCisgICAgLy8gdGhlc2UgbGF5ZXJzIHdpbGwgZ2V0IHByaW9yaXR5IGlm
IGEgZ3JhcGggY3ljbGUgaXMgcHJlc2VudCBhbmQgbmVlZHMgdG8gYmUgYnJva2VuLgorICAgIGlm
IChtYXhQb3NpdGl2ZSA+IHpUaHJlc2hvbGQgJiYgbWF4TmVnYXRpdmUgPCAtelRocmVzaG9sZCkK
KyAgICAgICAgKndlaWdodCA9IDA7CisgICAgZWxzZQorICAgICAgICAqd2VpZ2h0ID0gZmFic2Yo
bWF4RGlmZik7CisKKyAgICAvLyBNYWludGFpbiByZWxhdGl2ZSBvcmRlciBpZiB0aGUgbGF5ZXJz
IGhhdmUgdGhlIHNhbWUgZGVwdGggYXQgYWxsIGludGVyc2VjdGlvbiBwb2ludHMuCisgICAgaWYg
KG1heERpZmYgPD0gMCkKKyAgICAgICAgcmV0dXJuIEFCZWZvcmVCOworCisgICAgcmV0dXJuIEJC
ZWZvcmVBOwogfQogCi0vLyBDb21wdXRlcyB0aGUgeiBkaWZmZXJlbmNlIGJldHdlZW4gcG9pbnQg
cCBwcm9qZWN0ZWQgb250byB0aGUgdHdvIGxheWVycyB0byBkZXRlcm1pbmUKLS8vIHdoaWNoIGxh
eWVyIGlzIGluIGZyb250LiBJZiB0aGUgbmV3IHogZGlmZmVyZW5jZSBpcyBoaWdoZXIgdGhhbiB0
aGUgY3VycmVudGx5Ci0vLyByZWNvcmRlZCBvbmUgdGhlIHRoaXMgYmVjb21lcyB0aGUgcG9pbnQg
b2YgY2hvaWNlIGZvciBkb2luZyB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSAKLS8vIGxheWVy
cy4gSWYgdGhlIHZhbHVlIG9mIGRpZmZlcmVuY2UgaXMgaGlnaGVyIHRoYW4gb3VyIGVhcmx5IGV4
aXQgdGhyZXNob2xkIHRoZW4KLS8vIGl0IG1lYW5zIHRoYXQgdGhlIHogZGlmZmVyZW5jZSBpcyBj
b25jbHVzaXZlIGVub3VnaCB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2hlY2sKLS8vIG90aGVyIGlu
dGVyc2VjdGlvbiBwb2ludHMuCi1ib29sIENDTGF5ZXJTb3J0ZXI6OkxheWVySW50ZXJzZWN0b3I6
OmNoZWNrWkRpZmYoY29uc3QgRmxvYXRQb2ludCYgcCkKK0NDTGF5ZXJTb3J0ZXI6OkxheWVyU2hh
cGU6OkxheWVyU2hhcGUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIGRyYXdUcmFuc2Zvcm0pCiB7Ci0gICAgZmxvYXQgemEgPSBsYXllclpGcm9t
UHJvamVjdGVkUG9pbnQobGF5ZXJBLCBwKTsKLSAgICBmbG9hdCB6YiA9IGxheWVyWkZyb21Qcm9q
ZWN0ZWRQb2ludChsYXllckIsIHApOworICAgIEZsb2F0UXVhZCBsYXllclF1YWQoRmxvYXRQb2lu
dCgtd2lkdGggKiAwLjUsIGhlaWdodCAqIDAuNSksCisgICAgICAgICAgICAgICAgICAgICAgICBG
bG9hdFBvaW50KHdpZHRoICogMC41LCBoZWlnaHQgKiAwLjUpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgRmxvYXRQb2ludCh3aWR0aCAqIDAuNSwgLWhlaWdodCAqIDAuNSksCisgICAgICAgICAg
ICAgICAgICAgICAgICBGbG9hdFBvaW50KC13aWR0aCAqIDAuNSwgLWhlaWdodCAqIDAuNSkpOwog
Ci0gICAgZmxvYXQgZGlmZiA9IHphIC0gemI7Ci0gICAgZmxvYXQgYWJzRGlmZiA9IGZhYnNmKGRp
ZmYpOwotICAgIGlmICgoYWJzRGlmZikgPiBmYWJzZih6RGlmZikpIHsKLSAgICAgICAgaW50ZXJz
ZWN0aW9uUG9pbnQgPSBwOwotICAgICAgICB6RGlmZiA9IGRpZmY7Ci0gICAgfQorICAgIC8vIENv
bXB1dGUgdGhlIHByb2plY3Rpb24gb2YgdGhlIGxheWVyIHF1YWQgb250byB0aGUgeiA9IDAgcGxh
bmUuCisgICAgcHJvamVjdGVkUXVhZCA9IGRyYXdUcmFuc2Zvcm0ubWFwUXVhZChsYXllclF1YWQp
OworICAgIHByb2plY3RlZEJvdW5kcyA9IHByb2plY3RlZFF1YWQuYm91bmRpbmdCb3goKTsKIAot
ICAgIGlmIChhYnNEaWZmID4gZWFybHlFeGl0VGhyZXNob2xkKQotICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAvLyBDb21wdXRlIHRoZSBub3JtYWwgb2YgdGhlIGxheWVyJ3MgcGxhbmUuCisgICAg
RmxvYXRQb2ludDNEIGMxID0gZHJhd1RyYW5zZm9ybS5tYXBQb2ludChGbG9hdFBvaW50M0QoMCwg
MCwgMCkpOworICAgIEZsb2F0UG9pbnQzRCBjMiA9IGRyYXdUcmFuc2Zvcm0ubWFwUG9pbnQoRmxv
YXRQb2ludDNEKDAsIDEsIDApKTsKKyAgICBGbG9hdFBvaW50M0QgYzMgPSBkcmF3VHJhbnNmb3Jt
Lm1hcFBvaW50KEZsb2F0UG9pbnQzRCgxLCAwLCAwKSk7CisgICAgRmxvYXRQb2ludDNEIGMxMiA9
IGMyIC0gYzE7CisgICAgRmxvYXRQb2ludDNEIGMxMyA9IGMzIC0gYzE7CisgICAgbGF5ZXJOb3Jt
YWwgPSBjMTMuY3Jvc3MoYzEyKTsKIAotICAgIHJldHVybiBmYWxzZTsKKyAgICB0cmFuc2Zvcm1P
cmlnaW4gPSBjMTsKIH0KIAotCi0vLyBSZXR1cm5zIHRoZSBaIGNvb3JkaW5hdGUgb2YgYSBwb2lu
dCBvbiB0aGUgZ2l2ZW4gbGF5ZXIgdGhhdCBwcm9qZWN0cworLy8gUmV0dXJucyB0aGUgWiBjb29y
ZGluYXRlIG9mIGEgcG9pbnQgb24gdGhlIGxheWVyIHRoYXQgcHJvamVjdHMKIC8vIHRvIHBvaW50
IHAgd2hpY2ggbGllcyBvbiB0aGUgeiA9IDAgcGxhbmUuIEl0IGRvZXMgaXQgYnkgY29tcHV0aW5n
IHRoZQogLy8gaW50ZXJzZWN0aW9uIG9mIGEgbGluZSBzdGFydGluZyBmcm9tIHAgYWxvbmcgdGhl
IFogYXhpcyBhbmQgdGhlIHBsYW5lCiAvLyBvZiB0aGUgbGF5ZXIuCi1mbG9hdCBDQ0xheWVyU29y
dGVyOjpMYXllckludGVyc2VjdG9yOjpsYXllclpGcm9tUHJvamVjdGVkUG9pbnQoY29uc3QgTGF5
ZXJTaGFwZSYgbGF5ZXIsIGNvbnN0IEZsb2F0UG9pbnQmIHApCitmbG9hdCBDQ0xheWVyU29ydGVy
OjpMYXllclNoYXBlOjpsYXllclpGcm9tUHJvamVjdGVkUG9pbnQoY29uc3QgRmxvYXRQb2ludCYg
cCkgY29uc3QKIHsKICAgICBjb25zdCBGbG9hdFBvaW50M0QgekF4aXMoMCwgMCwgMSk7Ci0gICAg
RmxvYXRQb2ludDNEIHcgPSBGbG9hdFBvaW50M0QocC54KCksIHAueSgpLCAwKSAtIGxheWVyLm9y
aWdpbjsKKyAgICBGbG9hdFBvaW50M0QgdyA9IEZsb2F0UG9pbnQzRChwKSAtIHRyYW5zZm9ybU9y
aWdpbjsKIAotICAgIGZsb2F0IGQgPSBsYXllci5ub3JtYWwuZG90KHpBeGlzKTsKLSAgICBmbG9h
dCBuID0gLWxheWVyLm5vcm1hbC5kb3Qodyk7CisgICAgZmxvYXQgZCA9IGxheWVyTm9ybWFsLmRv
dCh6QXhpcyk7CisgICAgZmxvYXQgbiA9IC1sYXllck5vcm1hbC5kb3Qodyk7CiAKLSAgICAvLyBD
aGVjayBpZiBsYXllciBpcyBwYXJhbGxlbCB0byB0aGUgeiA9IDAgYXhpcworICAgIC8vIENoZWNr
IGlmIGxheWVyIGlzIHBhcmFsbGVsIHRvIHRoZSB6ID0gMCBheGlzIHdoaWNoIHdpbGwgbWFrZSBp
dAorICAgIC8vIGludmlzaWJsZSBhbmQgaGVuY2UgcmV0dXJuaW5nIHplcm8gaXMgZmluZS4KICAg
ICBpZiAoIWQpCi0gICAgICAgIHJldHVybiBsYXllci5vcmlnaW4ueigpOworICAgICAgICByZXR1
cm4gMDsKIAogICAgIC8vIFRoZSBpbnRlcnNlY3Rpb24gcG9pbnQgd291bGQgYmUgZ2l2ZW4gYnk6
CiAgICAgLy8gcCArIChuIC8gZCkgKiB1ICBidXQgc2luY2Ugd2UgYXJlIG9ubHkgaW50ZXJlc3Rl
ZCBpbiB0aGUgCkBAIC0yNTAsNDMgKzE5NSw2IEBAIGZsb2F0IENDTGF5ZXJTb3J0ZXI6OkxheWVy
SW50ZXJzZWN0b3I6OmwKICAgICByZXR1cm4gbiAvIGQ7CiB9CiAKLUNDTGF5ZXJTb3J0ZXI6OkND
TGF5ZXJTb3J0ZXIoKQotICAgIDogbV96UmFuZ2UoMCkKLXsKLX0KLQotQ0NMYXllclNvcnRlcjo6
QUJDb21wYXJlUmVzdWx0IENDTGF5ZXJTb3J0ZXI6OmNoZWNrT3ZlcmxhcChHcmFwaE5vZGUqIGEs
IEdyYXBoTm9kZSogYikKLXsKLSAgICBpZiAoIWEtPnNoYXBlLmJvdW5kaW5nQm94LmludGVyc2Vj
dHMoYi0+c2hhcGUuYm91bmRpbmdCb3gpKQotICAgICAgICByZXR1cm4gTm9uZTsKLQotICAgIC8v
IFRoZXNlIHRocmVzaG9sZHMgYXJlIGRlZmluZWQgcmVsYXRpdmUgdG8gdGhlIHRvdGFsIFogcmFu
Z2UuIElmIGZ1cnRoZXIgWi1maWdodGluZwotICAgIC8vIGJ1Z3MgY29tZSB1cCBkdWUgdG8gcHJl
Y2lzaW9uIGVycm9ycywgaXQgbWF5IGJlIHdvcnRoIGNvbnNpZGVyaW5nIGRvaW5nIGFuIHVscAot
ICAgIC8vIGVycm9yIG1lYXN1cmVtZW50IGluc3RlYWQuCi0gICAgZmxvYXQgZXhpdFRocmVzaG9s
ZCA9IG1felJhbmdlICogMC4wMTsKLSAgICBmbG9hdCBub25aZXJvVGhyZXNob2xkID0gbWF4KGV4
aXRUaHJlc2hvbGQsIDAuMDAxZik7Ci0KLSAgICBmbG9hdCB6RGlmZiA9IGNhbGN1bGF0ZVpEaWZm
KGEtPnNoYXBlLCBiLT5zaGFwZSwgZXhpdFRocmVzaG9sZCk7Ci0KLSAgICBpZiAoekRpZmYgPiBu
b25aZXJvVGhyZXNob2xkKQotICAgICAgICByZXR1cm4gQkJlZm9yZUE7Ci0gICAgaWYgKHpEaWZm
IDwgLW5vblplcm9UaHJlc2hvbGQpCi0gICAgICAgIHJldHVybiBBQmVmb3JlQjsKLQotICAgIHJl
dHVybiBOb25lOwotfQotCi1DQ0xheWVyU29ydGVyOjpMYXllclNoYXBlOjpMYXllclNoYXBlKGNv
bnN0IEZsb2F0UG9pbnQzRCYgcDEsIGNvbnN0IEZsb2F0UG9pbnQzRCYgcDIsIGNvbnN0IEZsb2F0
UG9pbnQzRCYgcDMsIGNvbnN0IEZsb2F0UG9pbnQzRCYgcDQpCi0gICAgOiBub3JtYWwoKHAyIC0g
cDEpLmNyb3NzKHAzIC0gcDEpKQotICAgICwgYzEoRmxvYXRQb2ludChwMS54KCksIHAxLnkoKSkp
Ci0gICAgLCBjMihGbG9hdFBvaW50KHAyLngoKSwgcDIueSgpKSkKLSAgICAsIGMzKEZsb2F0UG9p
bnQocDMueCgpLCBwMy55KCkpKQotICAgICwgYzQoRmxvYXRQb2ludChwNC54KCksIHA0LnkoKSkp
Ci0gICAgLCBvcmlnaW4ocDEpCi17Ci0gICAgYm91bmRpbmdCb3guZml0VG9Qb2ludHMoYzEsIGMy
LCBjMywgYzQpOwotfQotCiB2b2lkIENDTGF5ZXJTb3J0ZXI6OmNyZWF0ZUdyYXBoTm9kZXMoTGF5
ZXJMaXN0OjppdGVyYXRvciBmaXJzdCwgTGF5ZXJMaXN0OjppdGVyYXRvciBsYXN0KQogewogI2lm
ICFkZWZpbmVkKCBOREVCVUcgKQpAQCAtMzA5LDI1ICsyMTcsMjEgQEAgdm9pZCBDQ0xheWVyU29y
dGVyOjpjcmVhdGVHcmFwaE5vZGVzKExheQogICAgICAgICBmbG9hdCBsYXllcldpZHRoLCBsYXll
ckhlaWdodDsKICAgICAgICAgaWYgKHJlbmRlclN1cmZhY2UpIHsKICAgICAgICAgICAgIGRyYXdU
cmFuc2Zvcm0gPSByZW5kZXJTdXJmYWNlLT5kcmF3VHJhbnNmb3JtKCk7Ci0gICAgICAgICAgICBs
YXllcldpZHRoID0gMC41ICogcmVuZGVyU3VyZmFjZS0+Y29udGVudFJlY3QoKS53aWR0aCgpOwot
ICAgICAgICAgICAgbGF5ZXJIZWlnaHQgPSAwLjUgKiByZW5kZXJTdXJmYWNlLT5jb250ZW50UmVj
dCgpLmhlaWdodCgpOworICAgICAgICAgICAgbGF5ZXJXaWR0aCA9IHJlbmRlclN1cmZhY2UtPmNv
bnRlbnRSZWN0KCkud2lkdGgoKTsKKyAgICAgICAgICAgIGxheWVySGVpZ2h0ID0gcmVuZGVyU3Vy
ZmFjZS0+Y29udGVudFJlY3QoKS5oZWlnaHQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAg
ICAgIGRyYXdUcmFuc2Zvcm0gPSBub2RlLmxheWVyLT5kcmF3VHJhbnNmb3JtKCk7Ci0gICAgICAg
ICAgICBsYXllcldpZHRoID0gMC41ICogbm9kZS5sYXllci0+Ym91bmRzKCkud2lkdGgoKTsKLSAg
ICAgICAgICAgIGxheWVySGVpZ2h0ID0gMC41ICogbm9kZS5sYXllci0+Ym91bmRzKCkuaGVpZ2h0
KCk7CisgICAgICAgICAgICBsYXllcldpZHRoID0gbm9kZS5sYXllci0+Ym91bmRzKCkud2lkdGgo
KTsKKyAgICAgICAgICAgIGxheWVySGVpZ2h0ID0gbm9kZS5sYXllci0+Ym91bmRzKCkuaGVpZ2h0
KCk7CiAgICAgICAgIH0KIAotICAgICAgICBGbG9hdFBvaW50M0QgYzEgPSBkcmF3VHJhbnNmb3Jt
Lm1hcFBvaW50KEZsb2F0UG9pbnQzRCgtbGF5ZXJXaWR0aCwgbGF5ZXJIZWlnaHQsIDApKTsKLSAg
ICAgICAgRmxvYXRQb2ludDNEIGMyID0gZHJhd1RyYW5zZm9ybS5tYXBQb2ludChGbG9hdFBvaW50
M0QobGF5ZXJXaWR0aCwgbGF5ZXJIZWlnaHQsIDApKTsKLSAgICAgICAgRmxvYXRQb2ludDNEIGMz
ID0gZHJhd1RyYW5zZm9ybS5tYXBQb2ludChGbG9hdFBvaW50M0QobGF5ZXJXaWR0aCwgLWxheWVy
SGVpZ2h0LCAwKSk7Ci0gICAgICAgIEZsb2F0UG9pbnQzRCBjNCA9IGRyYXdUcmFuc2Zvcm0ubWFw
UG9pbnQoRmxvYXRQb2ludDNEKC1sYXllcldpZHRoLCAtbGF5ZXJIZWlnaHQsIDApKTsKLSAgICAg
ICAgbm9kZS5zaGFwZSA9IExheWVyU2hhcGUoYzEsIGMyLCBjMywgYzQpOwotICAgIAotICAgICAg
ICBtYXhaID0gbWF4KGM0LnooKSwgbWF4KGMzLnooKSwgbWF4KGMyLnooKSwgbWF4KG1heFosIGMx
LnooKSkpKSk7Ci0gICAgICAgIG1pblogPSBtaW4oYzQueigpLCBtaW4oYzMueigpLCBtaW4oYzIu
eigpLCBtaW4obWluWiwgYzEueigpKSkpKTsKKyAgICAgICAgbm9kZS5zaGFwZSA9IExheWVyU2hh
cGUobGF5ZXJXaWR0aCwgbGF5ZXJIZWlnaHQsIGRyYXdUcmFuc2Zvcm0pOworCisgICAgICAgIG1h
eFogPSBtYXgobWF4Wiwgbm9kZS5zaGFwZS50cmFuc2Zvcm1PcmlnaW4ueigpKTsKKyAgICAgICAg
bWluWiA9IG1pbihtaW5aLCBub2RlLnNoYXBlLnRyYW5zZm9ybU9yaWdpbi56KCkpOwogICAgIH0K
LSAgICBpZiAobGFzdCAtIGZpcnN0KQotICAgICAgICBtX3pSYW5nZSA9IGZhYnNmKG1heFogLSBt
aW5aKTsKKworICAgIG1felJhbmdlID0gZmFic2YobWF4WiAtIG1pblopOwogfQogCiB2b2lkIEND
TGF5ZXJTb3J0ZXI6OmNyZWF0ZUdyYXBoRWRnZXMoKQpAQCAtMzM1LDYgKzIzOSw3IEBAIHZvaWQg
Q0NMYXllclNvcnRlcjo6Y3JlYXRlR3JhcGhFZGdlcygpCiAjaWYgIWRlZmluZWQoIE5ERUJVRyAp
CiAgICAgTE9HKENDTGF5ZXJTb3J0ZXIsICJFZGdlczpcbiIpOwogI2VuZGlmCisgICAgZmxvYXQg
elRocmVzaG9sZCA9IG1felJhbmdlICogMC4wMTsKICAgICBmb3IgKHVuc2lnbmVkIG5hID0gMDsg
bmEgPCBtX25vZGVzLnNpemUoKTsgbmErKykgewogICAgICAgICBHcmFwaE5vZGUmIG5vZGVBID0g
bV9ub2Rlc1tuYV07CiAgICAgICAgIGlmICghbm9kZUEubGF5ZXItPmRyYXdzQ29udGVudCgpICYm
ICFub2RlQS5sYXllci0+cmVuZGVyU3VyZmFjZSgpKQpAQCAtMzQzLDcgKzI0OCw4IEBAIHZvaWQg
Q0NMYXllclNvcnRlcjo6Y3JlYXRlR3JhcGhFZGdlcygpCiAgICAgICAgICAgICBHcmFwaE5vZGUm
IG5vZGVCID0gbV9ub2Rlc1tuYl07CiAgICAgICAgICAgICBpZiAoIW5vZGVCLmxheWVyLT5kcmF3
c0NvbnRlbnQoKSAmJiAhbm9kZUIubGF5ZXItPnJlbmRlclN1cmZhY2UoKSkKICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIEFCQ29tcGFyZVJlc3VsdCBvdmVybGFwUmVzdWx0
ID0gY2hlY2tPdmVybGFwKCZub2RlQSwgJm5vZGVCKTsKKyAgICAgICAgICAgIGZsb2F0IHdlaWdo
dCA9IDA7CisgICAgICAgICAgICBBQkNvbXBhcmVSZXN1bHQgb3ZlcmxhcFJlc3VsdCA9IGNoZWNr
T3ZlcmxhcCgmbm9kZUEuc2hhcGUsICZub2RlQi5zaGFwZSwgelRocmVzaG9sZCwgJndlaWdodCk7
CiAgICAgICAgICAgICBHcmFwaE5vZGUqIHN0YXJ0Tm9kZSA9IDA7CiAgICAgICAgICAgICBHcmFw
aE5vZGUqIGVuZE5vZGUgPSAwOwogICAgICAgICAgICAgaWYgKG92ZXJsYXBSZXN1bHQgPT0gQUJl
Zm9yZUIpIHsKQEAgLTM1OCw3ICsyNjQsNyBAQCB2b2lkIENDTGF5ZXJTb3J0ZXI6OmNyZWF0ZUdy
YXBoRWRnZXMoKQogI2lmICFkZWZpbmVkKCBOREVCVUcgKQogICAgICAgICAgICAgICAgIExPRyhD
Q0xheWVyU29ydGVyLCAiJWQgLT4gJWRcbiIsIHN0YXJ0Tm9kZS0+bGF5ZXItPmRlYnVnSUQoKSwg
ZW5kTm9kZS0+bGF5ZXItPmRlYnVnSUQoKSk7CiAjZW5kaWYKLSAgICAgICAgICAgICAgICBtX2Vk
Z2VzLmFwcGVuZChHcmFwaEVkZ2Uoc3RhcnROb2RlLCBlbmROb2RlKSk7CisgICAgICAgICAgICAg
ICAgbV9lZGdlcy5hcHBlbmQoR3JhcGhFZGdlKHN0YXJ0Tm9kZSwgZW5kTm9kZSwgd2VpZ2h0KSk7
CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zNjgsNiArMjc0LDcgQEAgdm9p
ZCBDQ0xheWVyU29ydGVyOjpjcmVhdGVHcmFwaEVkZ2VzKCkKICAgICAgICAgbV9hY3RpdmVFZGdl
cy5hZGQoJmVkZ2UsICZlZGdlKTsKICAgICAgICAgZWRnZS5mcm9tLT5vdXRnb2luZy5hcHBlbmQo
JmVkZ2UpOwogICAgICAgICBlZGdlLnRvLT5pbmNvbWluZy5hcHBlbmQoJmVkZ2UpOworICAgICAg
ICBlZGdlLnRvLT5pbmNvbWluZ0VkZ2VXZWlnaHQgKz0gZWRnZS53ZWlnaHQ7CiAgICAgfQogfQog
CkBAIC0zOTAsNyArMjk3LDcgQEAgdm9pZCBDQ0xheWVyU29ydGVyOjpyZW1vdmVFZGdlRnJvbUxp
c3QoRwogCiAvLyBTb3J0cyB0aGUgZ2l2ZW4gbGlzdCBvZiBsYXllcnMgc3VjaCB0aGF0IHRoZXkg
Y2FuIGJlIHBhaW50ZWQgaW4gYSBiYWNrLXRvLWZyb250CiAvLyBvcmRlci4gU29ydGluZyBwcm9k
dWNlcyBjb3JyZWN0IHJlc3VsdHMgZm9yIG5vbi1pbnRlcnNlY3RpbmcgbGF5ZXJzIHRoYXQgZG9u
J3QgaGF2ZQotLy8gY3ljbGljYWwgb3JkZXIgZGVwZW5kZW5jaWVzLiBDeWNsZXMgYW5kIGludGVy
c2VjdGlvbnMgYXJlIGJyb2tlbiBhcmlidHJhcmlseS4KKy8vIGN5Y2xpY2FsIG9yZGVyIGRlcGVu
ZGVuY2llcy4gQ3ljbGVzIGFuZCBpbnRlcnNlY3Rpb25zIGFyZSBicm9rZW4gKHNvbWV3aGF0KSBh
cmlidHJhcmlseS4KIC8vIFNvcnRpbmcgb2YgbGF5ZXJzIGlzIGRvbmUgdmlhIGEgdG9wb2xvZ2lj
YWwgc29ydCBvZiBhIGRpcmVjdGVkIGdyYXBoIHdob3NlIG5vZGVzIGFyZQogLy8gdGhlIGxheWVy
cyB0aGVtc2VsdmVzLiBBbiBlZGdlIGZyb20gbm9kZSBBIHRvIG5vZGUgQiBzaWduaWZpZXMgdGhh
dCBsYXllciBBIG5lZWRzIHRvCiAvLyBiZSBkcmF3biBiZWZvcmUgbGF5ZXIgQi4gSWYgQSBhbmQg
QiBoYXZlIG5vIGRlcGVuZGVuY3kgYmV0d2VlbiBlYWNoIG90aGVyLCB0aGVuIHdlCkBAIC00NTAs
NiArMzU3LDcgQEAgdm9pZCBDQ0xheWVyU29ydGVyOjpzb3J0KExheWVyTGlzdDo6aXRlcgogCiAg
ICAgICAgICAgICAgICAgbV9hY3RpdmVFZGdlcy5yZW1vdmUob3V0Z29pbmdFZGdlKTsKICAgICAg
ICAgICAgICAgICByZW1vdmVFZGdlRnJvbUxpc3Qob3V0Z29pbmdFZGdlLCBvdXRnb2luZ0VkZ2Ut
PnRvLT5pbmNvbWluZyk7CisgICAgICAgICAgICAgICAgb3V0Z29pbmdFZGdlLT50by0+aW5jb21p
bmdFZGdlV2VpZ2h0IC09IG91dGdvaW5nRWRnZS0+d2VpZ2h0OwogCiAgICAgICAgICAgICAgICAg
aWYgKCFvdXRnb2luZ0VkZ2UtPnRvLT5pbmNvbWluZy5zaXplKCkpCiAgICAgICAgICAgICAgICAg
ICAgIG5vSW5jb21pbmdFZGdlTm9kZUxpc3QuYXBwZW5kKG91dGdvaW5nRWRnZS0+dG8pOwpAQCAt
NDYyLDEyICszNzAsMTQgQEAgdm9pZCBDQ0xheWVyU29ydGVyOjpzb3J0KExheWVyTGlzdDo6aXRl
cgogCiAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBzdGlsbCBhY3RpdmUgZWRnZXMgYnV0IHRoZSBs
aXN0IG9mIG5vZGVzIHdpdGhvdXQgaW5jb21pbmcgZWRnZXMKICAgICAgICAgLy8gaXMgZW1wdHkg
dGhlbiB3ZSBoYXZlIHJ1biBpbnRvIGEgY3ljbGUuIEJyZWFrIHRoZSBjeWNsZSBieSBmaW5kaW5n
IHRoZSBub2RlCi0gICAgICAgIC8vIHdpdGggdGhlIGxlYXN0IG51bWJlciBpbmNvbWluZyBlZGdl
cyBhbmQgcmVtb3ZlIHRoZW0gYWxsLgotICAgICAgICB1bnNpZ25lZCBtaW5JbmNvbWluZ0VkZ2VD
b3VudCA9IFVJTlRfTUFYOworICAgICAgICAvLyB3aXRoIHRoZSBzbWFsbGVzdCBvdmVyYWxsIGlu
Y29taW5nIGVkZ2Ugd2VpZ2h0IGFuZCB1c2UgaXQuIFRoaXMgd2lsbCBmYXZvcgorICAgICAgICAv
LyBub2RlcyB0aGF0IGhhdmUgemVyby13ZWlnaHQgaW5jb21pbmcgZWRnZXMgaS5lLiBsYXllcnMg
dGhhdCBhcmUgYmVpbmcKKyAgICAgICAgLy8gb2NjbHVkZWQgYnkgYSBsYXllciB0aGF0IGludGVy
c2VjdHMgdGhlbS4KKyAgICAgICAgZmxvYXQgbWluSW5jb21pbmdFZGdlV2VpZ2h0ID0gRkxUX01B
WDsKICAgICAgICAgR3JhcGhOb2RlKiBuZXh0Tm9kZSA9IDA7CiAgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBtX25vZGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobV9u
b2Rlc1tpXS5pbmNvbWluZy5zaXplKCkgJiYgKG1fbm9kZXNbaV0uaW5jb21pbmcuc2l6ZSgpIDwg
bWluSW5jb21pbmdFZGdlQ291bnQpKSB7Ci0gICAgICAgICAgICAgICAgbWluSW5jb21pbmdFZGdl
Q291bnQgPSBtX25vZGVzW2ldLmluY29taW5nLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChtX25v
ZGVzW2ldLmluY29taW5nLnNpemUoKSAmJiBtX25vZGVzW2ldLmluY29taW5nRWRnZVdlaWdodCA8
IG1pbkluY29taW5nRWRnZVdlaWdodCkgeworICAgICAgICAgICAgICAgIG1pbkluY29taW5nRWRn
ZVdlaWdodCA9IG1fbm9kZXNbaV0uaW5jb21pbmdFZGdlV2VpZ2h0OwogICAgICAgICAgICAgICAg
IG5leHROb2RlID0gJm1fbm9kZXNbaV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ4
MCw5ICszOTAsMTAgQEAgdm9pZCBDQ0xheWVyU29ydGVyOjpzb3J0KExheWVyTGlzdDo6aXRlcgog
ICAgICAgICAgICAgcmVtb3ZlRWRnZUZyb21MaXN0KGluY29taW5nRWRnZSwgaW5jb21pbmdFZGdl
LT5mcm9tLT5vdXRnb2luZyk7CiAgICAgICAgIH0KICAgICAgICAgbmV4dE5vZGUtPmluY29taW5n
LmNsZWFyKCk7CisgICAgICAgIG5leHROb2RlLT5pbmNvbWluZ0VkZ2VXZWlnaHQgPSAwOwogICAg
ICAgICBub0luY29taW5nRWRnZU5vZGVMaXN0LmFwcGVuZChuZXh0Tm9kZSk7CiAjaWYgIWRlZmlu
ZWQoIE5ERUJVRyApCi0gICAgICAgIExPRyhDQ0xheWVyU29ydGVyLCAiQnJlYWtpbmcgY3ljbGUg
YnkgY2xlYW5pbmcgdXAgJWQgZWRnZXMgZnJvbSAlZFxuIiwgbWluSW5jb21pbmdFZGdlQ291bnQs
IG5leHROb2RlLT5sYXllci0+ZGVidWdJRCgpKTsKKyAgICAgICAgTE9HKENDTGF5ZXJTb3J0ZXIs
ICJCcmVha2luZyBjeWNsZSBieSBjbGVhbmluZyB1cCBpbmNvbWluZyBlZGdlcyBmcm9tICVkICh3
ZWlnaHQgPSAlZilcbiIsIG5leHROb2RlLT5sYXllci0+ZGVidWdJRCgpLCBtaW5JbmNvbWluZ0Vk
Z2VXZWlnaHQpOwogI2VuZGlmCiAgICAgfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyU29ydGVyLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclNvcnRlci5o
CShyZXZpc2lvbiAxMTE2MTEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ0xheWVyU29ydGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTI2LDYgKzI2LDcg
QEAKICNkZWZpbmUgQ0NMYXllclNvcnRlcl9oCiAKICNpbmNsdWRlICJGbG9hdFBvaW50M0QuaCIK
KyNpbmNsdWRlICJGbG9hdFF1YWQuaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKICNpbmNsdWRl
ICJjYy9DQ0xheWVySW1wbC5oIgogI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CkBAIC0zNyw2MiAr
MzgsNTIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogY2xhc3MgQ0NMYXllclNvcnRlciB7CiAgICAg
V1RGX01BS0VfTk9OQ09QWUFCTEUoQ0NMYXllclNvcnRlcik7CiBwdWJsaWM6Ci0gICAgQ0NMYXll
clNvcnRlcigpOworICAgIENDTGF5ZXJTb3J0ZXIoKSA6IG1felJhbmdlKDApIHsgfQogCiAgICAg
dHlwZWRlZiBWZWN0b3I8Q0NMYXllckltcGwqPiBMYXllckxpc3Q7CiAKICAgICB2b2lkIHNvcnQo
TGF5ZXJMaXN0OjppdGVyYXRvciBmaXJzdCwgTGF5ZXJMaXN0OjppdGVyYXRvciBsYXN0KTsKIAot
ICAgIC8vIEhlbHBlciBtZXRob2RzLCBwdWJsaWMgZm9yIHVuaXQgdGVzdGluZy4KLSAgICBzdGF0
aWMgYm9vbCBwb2ludEluVHJpYW5nbGUoY29uc3QgRmxvYXRQb2ludCYsIGNvbnN0IEZsb2F0UG9p
bnQmLCBjb25zdCBGbG9hdFBvaW50JiwgY29uc3QgRmxvYXRQb2ludCYpOwotCiAgICAgLy8gSG9s
ZHMgdmFyaW91cyB1c2VmdWwgcHJvcGVydGllcyBkZXJpdmVkIGZyb20gYSBsYXllcidzIDNEIG91
dGxpbmUuCiAgICAgc3RydWN0IExheWVyU2hhcGUgewogICAgICAgICBMYXllclNoYXBlKCkgeyB9
Ci0gICAgICAgIExheWVyU2hhcGUoY29uc3QgRmxvYXRQb2ludDNEJiwgY29uc3QgRmxvYXRQb2lu
dDNEJiwgY29uc3QgRmxvYXRQb2ludDNEJiwgY29uc3QgRmxvYXRQb2ludDNEJik7CisgICAgICAg
IExheWVyU2hhcGUoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmIGRyYXdUcmFuc2Zvcm0pOworCisgICAgICAgIGZsb2F0IGxheWVyWkZyb21Qcm9q
ZWN0ZWRQb2ludChjb25zdCBGbG9hdFBvaW50JikgY29uc3Q7CiAKLSAgICAgICAgRmxvYXRQb2lu
dDNEIG5vcm1hbDsKLSAgICAgICAgRmxvYXRQb2ludCBjMSwgYzIsIGMzLCBjNDsKLSAgICAgICAg
RmxvYXRQb2ludDNEIG9yaWdpbjsKLSAgICAgICAgRmxvYXRSZWN0IGJvdW5kaW5nQm94OworICAg
ICAgICBGbG9hdFBvaW50M0QgbGF5ZXJOb3JtYWw7CisgICAgICAgIEZsb2F0UG9pbnQzRCB0cmFu
c2Zvcm1PcmlnaW47CisgICAgICAgIEZsb2F0UXVhZCBwcm9qZWN0ZWRRdWFkOworICAgICAgICBG
bG9hdFJlY3QgcHJvamVjdGVkQm91bmRzOworICAgIH07CisKKyAgICBlbnVtIEFCQ29tcGFyZVJl
c3VsdCB7CisgICAgICAgIEFCZWZvcmVCLAorICAgICAgICBCQmVmb3JlQSwKKyAgICAgICAgTm9u
ZQogICAgIH07CiAKLSAgICBzdGF0aWMgZmxvYXQgY2FsY3VsYXRlWkRpZmYoY29uc3QgTGF5ZXJT
aGFwZSYsIGNvbnN0IExheWVyU2hhcGUmLCBmbG9hdCBlYXJseUV4aXRUaHJlc2hvbGQpOworICAg
IHN0YXRpYyBBQkNvbXBhcmVSZXN1bHQgY2hlY2tPdmVybGFwKExheWVyU2hhcGUqLCBMYXllclNo
YXBlKiwgZmxvYXQgelRocmVzaG9sZCwgZmxvYXQqIHdlaWdodCk7CiAKIHByaXZhdGU6CiAgICAg
c3RydWN0IEdyYXBoRWRnZTsKIAogICAgIHN0cnVjdCBHcmFwaE5vZGUgewotICAgICAgICBleHBs
aWNpdCBHcmFwaE5vZGUoQ0NMYXllckltcGwqIGNjbGF5ZXIpIDogbGF5ZXIoY2NsYXllcikgeyB9
CisgICAgICAgIGV4cGxpY2l0IEdyYXBoTm9kZShDQ0xheWVySW1wbCogY2NsYXllcikgOiBsYXll
cihjY2xheWVyKSwgaW5jb21pbmdFZGdlV2VpZ2h0KDApIHsgfQogCiAgICAgICAgIENDTGF5ZXJJ
bXBsKiBsYXllcjsKICAgICAgICAgTGF5ZXJTaGFwZSBzaGFwZTsKICAgICAgICAgVmVjdG9yPEdy
YXBoRWRnZSo+IGluY29taW5nOwogICAgICAgICBWZWN0b3I8R3JhcGhFZGdlKj4gb3V0Z29pbmc7
CisgICAgICAgIGZsb2F0IGluY29taW5nRWRnZVdlaWdodDsKICAgICB9OwogCiAgICAgc3RydWN0
IEdyYXBoRWRnZSB7Ci0gICAgICAgIEdyYXBoRWRnZShHcmFwaE5vZGUqIGZyb21Ob2RlLCBHcmFw
aE5vZGUqIHRvTm9kZSkgOiBmcm9tKGZyb21Ob2RlKSwgdG8odG9Ob2RlKSB7IH07CisgICAgICAg
IEdyYXBoRWRnZShHcmFwaE5vZGUqIGZyb21Ob2RlLCBHcmFwaE5vZGUqIHRvTm9kZSwgZmxvYXQg
d2VpZ2h0KSA6IGZyb20oZnJvbU5vZGUpLCB0byh0b05vZGUpLCB3ZWlnaHQod2VpZ2h0KSB7IH07
CiAKICAgICAgICAgR3JhcGhOb2RlKiBmcm9tOwogICAgICAgICBHcmFwaE5vZGUqIHRvOwotICAg
IH07Ci0KLSAgICBzdHJ1Y3QgTGF5ZXJJbnRlcnNlY3RvciB7Ci0gICAgICAgIExheWVySW50ZXJz
ZWN0b3IoY29uc3QgTGF5ZXJTaGFwZSYsIGNvbnN0IExheWVyU2hhcGUmLCBmbG9hdCk7Ci0KLSAg
ICAgICAgdm9pZCBnbygpOwotCi0gICAgICAgIGZsb2F0IGxheWVyWkZyb21Qcm9qZWN0ZWRQb2lu
dChjb25zdCBMYXllclNoYXBlJiwgY29uc3QgRmxvYXRQb2ludCYpOwotICAgICAgICBib29sIHRy
aWFuZ2xlVHJpYW5nbGVUZXN0KGNvbnN0IEZsb2F0UG9pbnQmLCBjb25zdCBGbG9hdFBvaW50Jiwg
Y29uc3QgRmxvYXRQb2ludCYsIGNvbnN0IEZsb2F0UG9pbnQmLCBjb25zdCBGbG9hdFBvaW50Jiwg
Y29uc3QgRmxvYXRQb2ludCYpOwotICAgICAgICBib29sIGVkZ2VUcmlhbmdsZVRlc3QoY29uc3Qg
RmxvYXRQb2ludCYsIGNvbnN0IEZsb2F0UG9pbnQmLCBjb25zdCBGbG9hdFBvaW50JiwgY29uc3Qg
RmxvYXRQb2ludCYsIGNvbnN0IEZsb2F0UG9pbnQmKTsKLSAgICAgICAgYm9vbCBjaGVja1pEaWZm
KGNvbnN0IEZsb2F0UG9pbnQmKTsKLQotICAgICAgICBGbG9hdFBvaW50IGludGVyc2VjdGlvblBv
aW50OwotICAgICAgICBjb25zdCBMYXllclNoYXBlJiBsYXllckE7Ci0gICAgICAgIGNvbnN0IExh
eWVyU2hhcGUmIGxheWVyQjsKLSAgICAgICAgZmxvYXQgekRpZmY7Ci0gICAgICAgIGZsb2F0IGVh
cmx5RXhpdFRocmVzaG9sZDsKKyAgICAgICAgZmxvYXQgd2VpZ2h0OwogICAgIH07CiAKICAgICB0
eXBlZGVmIFZlY3RvcjxHcmFwaE5vZGU+IE5vZGVMaXN0OwpAQCAtMTA0LDE4ICs5NSw5IEBAIHBy
aXZhdGU6CiAgICAgdHlwZWRlZiBIYXNoTWFwPEdyYXBoRWRnZSosIEdyYXBoRWRnZSo+IEVkZ2VN
YXA7CiAgICAgRWRnZU1hcCBtX2FjdGl2ZUVkZ2VzOwogCi0gICAgZmxvYXQgbV96RGlmZkVwc2ls
b247Ci0KICAgICB2b2lkIGNyZWF0ZUdyYXBoTm9kZXMoTGF5ZXJMaXN0OjppdGVyYXRvciBmaXJz
dCwgTGF5ZXJMaXN0OjppdGVyYXRvciBsYXN0KTsKICAgICB2b2lkIGNyZWF0ZUdyYXBoRWRnZXMo
KTsKICAgICB2b2lkIHJlbW92ZUVkZ2VGcm9tTGlzdChHcmFwaEVkZ2UqLCBWZWN0b3I8R3JhcGhF
ZGdlKj4mKTsKLQotICAgIGVudW0gQUJDb21wYXJlUmVzdWx0IHsKLSAgICAgICAgQUJlZm9yZUIs
Ci0gICAgICAgIEJCZWZvcmVBLAotICAgICAgICBOb25lCi0gICAgfTsKLSAgICBBQkNvbXBhcmVS
ZXN1bHQgY2hlY2tPdmVybGFwKEdyYXBoTm9kZSosIEdyYXBoTm9kZSopOwogfTsKIAogfQpJbmRl
eDogU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDExMTk2NSkKKysrIFNvdXJjZS9X
ZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAK
KzIwMTItMDMtMjMgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNAY2hyb21pdW0ub3JnPgor
CisgICAgICAgIFtjaHJvbWl1bV0gU2ltcGxpZnkgYW5kIGZpeCBDQ0xheWVyU29ydGVyCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MjExNAorCisgICAg
ICAgIEFkanVzdG1lbnRzIHRvIHRoZSBDQ0xheWVyU29ydGVyIHVuaXQgdGVzdHMgdG8gYWNjb3Vu
dCBmb3IgQVBJIGNoYW5nZXMgaW4gdGhlCisgICAgICAgIENDTGF5ZXJTb3J0ZXIgY2xhc3MuCisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiB0ZXN0cy9D
Q0xheWVyU29ydGVyVGVzdC5jcHA6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNv
cmU6OlRFU1QpOgorCiAyMDEyLTAzLTIzICBTaGF3biBTaW5naCAgPHNoYXduc2luZ2hAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFtjaHJvbWl1bV0gRml4IHJhY2UgYnVnIHRoYXQgY2xvYmJlcnMg
Q0NMYXllckltcGwgdXBkYXRlUmVjdApJbmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0
cy9DQ0xheWVyU29ydGVyVGVzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9jaHJv
bWl1bS90ZXN0cy9DQ0xheWVyU29ydGVyVGVzdC5jcHAJKHJldmlzaW9uIDExMTYxMSkKKysrIFNv
dXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvQ0NMYXllclNvcnRlclRlc3QuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zNCw4MSArMzQsNjUgQEAgdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIG5h
bWVzcGFjZSB7CiAKLVRFU1QoQ0NMYXllclNvcnRlclRlc3QsIFBvaW50SW5UcmlhbmdsZSkKK1RF
U1QoQ0NMYXllclNvcnRlclRlc3QsIENoZWNrT3ZlcmxhcCkKIHsKLSAgICBGbG9hdFBvaW50IGEo
MTAuMCwgMTAuMCk7Ci0gICAgRmxvYXRQb2ludCBiKDMwLjAsIDEwLjApOwotICAgIEZsb2F0UG9p
bnQgYygyMC4wLCAyMC4wKTsKLQotICAgIC8vIFBvaW50IGluIHRoZSBjZW50ZXIgaXMgaW4gdGhl
IHRyaWFuZ2xlLgotICAgIEVYUEVDVF9UUlVFKENDTGF5ZXJTb3J0ZXI6OnBvaW50SW5Ucmlhbmds
ZShGbG9hdFBvaW50KDIwLjAsIDE1LjApLCBhLCBiLCBjKSk7Ci0KLSAgICAvLyBQZXJtdXRpbmcg
dGhlIGNvcm5lcnMgZG9lc24ndCBjaGFuZ2UgdGhlIHJlc3VsdC4KLSAgICBFWFBFQ1RfVFJVRShD
Q0xheWVyU29ydGVyOjpwb2ludEluVHJpYW5nbGUoRmxvYXRQb2ludCgyMC4wLCAxNS4wKSwgYSwg
YywgYikpOwotICAgIEVYUEVDVF9UUlVFKENDTGF5ZXJTb3J0ZXI6OnBvaW50SW5UcmlhbmdsZShG
bG9hdFBvaW50KDIwLjAsIDE1LjApLCBiLCBhLCBjKSk7Ci0gICAgRVhQRUNUX1RSVUUoQ0NMYXll
clNvcnRlcjo6cG9pbnRJblRyaWFuZ2xlKEZsb2F0UG9pbnQoMjAuMCwgMTUuMCksIGIsIGMsIGEp
KTsKLSAgICBFWFBFQ1RfVFJVRShDQ0xheWVyU29ydGVyOjpwb2ludEluVHJpYW5nbGUoRmxvYXRQ
b2ludCgyMC4wLCAxNS4wKSwgYywgYSwgYikpOwotICAgIEVYUEVDVF9UUlVFKENDTGF5ZXJTb3J0
ZXI6OnBvaW50SW5UcmlhbmdsZShGbG9hdFBvaW50KDIwLjAsIDE1LjApLCBjLCBiLCBhKSk7Ci0K
LSAgICAvLyBQb2ludHMgb24gdGhlIGVkZ2VzIGFyZSBub3QgaW4gdGhlIHRyaWFuZ2xlLgotICAg
IEVYUEVDVF9GQUxTRShDQ0xheWVyU29ydGVyOjpwb2ludEluVHJpYW5nbGUoRmxvYXRQb2ludCgy
MC4wLCAxMC4wKSwgYSwgYiwgYykpOwotICAgIEVYUEVDVF9GQUxTRShDQ0xheWVyU29ydGVyOjpw
b2ludEluVHJpYW5nbGUoRmxvYXRQb2ludCgxNS4wLCAxNS4wKSwgYSwgYiwgYykpOwotICAgIEVY
UEVDVF9GQUxTRShDQ0xheWVyU29ydGVyOjpwb2ludEluVHJpYW5nbGUoRmxvYXRQb2ludCgyNS4w
LCAxNS4wKSwgYSwgYiwgYykpOwotCi0gICAgLy8gUG9pbnRzIGp1c3QgaW5zaWRlIHRoZSBlZGdl
cyBhcmUgaW4gdGhlIHRyaWFuZ2xlLgotICAgIEVYUEVDVF9UUlVFKENDTGF5ZXJTb3J0ZXI6OnBv
aW50SW5UcmlhbmdsZShGbG9hdFBvaW50KDIwLjAsIDEwLjAxKSwgYSwgYiwgYykpOwotICAgIEVY
UEVDVF9UUlVFKENDTGF5ZXJTb3J0ZXI6OnBvaW50SW5UcmlhbmdsZShGbG9hdFBvaW50KDE1LjAx
LCAxNS4wKSwgYSwgYiwgYykpOwotICAgIEVYUEVDVF9UUlVFKENDTGF5ZXJTb3J0ZXI6OnBvaW50
SW5UcmlhbmdsZShGbG9hdFBvaW50KDI0Ljk5LCAxNS4wKSwgYSwgYiwgYykpOwotCi0gICAgLy8g
WmVyby1hcmVhIHRyaWFuZ2xlIGRvZXNuJ3QgaW50ZXJzZWN0IGFueSBwb2ludC4KLSAgICBFWFBF
Q1RfRkFMU0UoQ0NMYXllclNvcnRlcjo6cG9pbnRJblRyaWFuZ2xlKEZsb2F0UG9pbnQoMTUuMCwg
MTAuMCksIGEsIGIsIEZsb2F0UG9pbnQoMjAuMCwgMTAuMCkpKTsKLX0KLQotVEVTVChDQ0xheWVy
U29ydGVyVGVzdCwgQ2FsY3VsYXRlWkRpZmYpCi17Ci0gICAgLy8gVGhpcyBzaG91bGQgYmUgYmln
Z2VyIHRoYW4gdGhlIHJhbmdlIG9mIHogdmFsdWVzIHVzZWQuCi0gICAgY29uc3QgZmxvYXQgdGhy
ZXNob2xkID0gMTAuMDsKKyAgICAvLyBOb3RlOiBUaGUgImNhbWVyYSIgaXMgbG9va2luZyBkb3du
IHRoZSBuZWdhdGl2ZSBaIGF4aXMsIG1lYW5pbmcgdGhhdCBsYXllcnMgd2l0aAorICAgIC8vIHNt
YWxsZXIgeiB2YWx1ZXMgKG1vcmUgbmVnYXRpdmUpIGFyZSBmdXJ0aGVyIGZyb20gdGhlIGNhbWVy
YSBhbmQgdGhlcmVmb3JlIG11c3QKKyAgICAvLyBiZSBkcmF3biBiZWZvcmUgbGF5ZXJzIHdpdGgg
aGlnaGVyIHogdmFsdWVzLgorICAgIENDTGF5ZXJTb3J0ZXI6OkFCQ29tcGFyZVJlc3VsdCBvdmVy
bGFwUmVzdWx0OworICAgIGNvbnN0IGZsb2F0IHpUaHJlc2hvbGQgPSAwLjFmOwogCiAgICAgLy8g
VHJpdmlhbCB0ZXN0LCB3aXRoIG9uZSBsYXllciBkaXJlY3RseSBvYnNjdXJpbmcgdGhlIG90aGVy
LgotCi0gICAgQ0NMYXllclNvcnRlcjo6TGF5ZXJTaGFwZSBmcm9udCgKLSAgICAgICAgRmxvYXRQ
b2ludDNEKC0xLjAsIDEuMCwgNS4wKSwKLSAgICAgICAgRmxvYXRQb2ludDNEKDEuMCwgMS4wLCA1
LjApLAotICAgICAgICBGbG9hdFBvaW50M0QoMS4wLCAtMS4wLCA1LjApLAotICAgICAgICBGbG9h
dFBvaW50M0QoLTEuMCwgLTEuMCwgNS4wKSk7Ci0KLSAgICBDQ0xheWVyU29ydGVyOjpMYXllclNo
YXBlIGJhY2soCi0gICAgICAgIEZsb2F0UG9pbnQzRCgtMS4wLCAxLjAsIDQuMCksCi0gICAgICAg
IEZsb2F0UG9pbnQzRCgxLjAsIDEuMCwgNC4wKSwKLSAgICAgICAgRmxvYXRQb2ludDNEKDEuMCwg
LTEuMCwgNC4wKSwKLSAgICAgICAgRmxvYXRQb2ludDNEKC0xLjAsIC0xLjAsIDQuMCkpOwotCi0g
ICAgRVhQRUNUX0dUKENDTGF5ZXJTb3J0ZXI6OmNhbGN1bGF0ZVpEaWZmKGZyb250LCBiYWNrLCB0
aHJlc2hvbGQpLCAwLjApOwotICAgIEVYUEVDVF9MVChDQ0xheWVyU29ydGVyOjpjYWxjdWxhdGVa
RGlmZihiYWNrLCBmcm9udCwgdGhyZXNob2xkKSwgMC4wKTsKLQotICAgIC8vIFdoZW4gY29tcGFy
aW5nIGEgbGF5ZXIgd2l0aCBpdHNlbGYsIHpEaWZmIGlzIGFsd2F5cyAwLgotICAgIEVYUEVDVF9F
UShDQ0xheWVyU29ydGVyOjpjYWxjdWxhdGVaRGlmZihmcm9udCwgZnJvbnQsIHRocmVzaG9sZCks
IDAuMCk7Ci0gICAgRVhQRUNUX0VRKENDTGF5ZXJTb3J0ZXI6OmNhbGN1bGF0ZVpEaWZmKGJhY2ss
IGJhY2ssIHRocmVzaG9sZCksIDAuMCk7Ci0KLSAgICAvLyBTYW1lIGFnYWluIGJ1dCB3aXRoIHR3
byBsYXllcnMgdGhhdCBpbnRlcnNlY3Qgb25seSBhdCBvbmUgcG9pbnQgKDAsMCkuCi0gICAgLy8g
VGhpcyAqZG9lcyogY291bnQgYXMgb2JzY3VyaW5nLCBzbyB3ZSBzaG91bGQgZ2V0IHRoZSBzYW1l
IHJlc3VsdHMuCi0KLSAgICBmcm9udCA9IENDTGF5ZXJTb3J0ZXI6OkxheWVyU2hhcGUoCi0gICAg
ICAgIEZsb2F0UG9pbnQzRCgtMS4wLCAwLjAsIDUuMCksCi0gICAgICAgIEZsb2F0UG9pbnQzRCgw
LjAsIDAuMCwgNS4wKSwKLSAgICAgICAgRmxvYXRQb2ludDNEKDAuMCwgLTEuMCwgNS4wKSwKLSAg
ICAgICAgRmxvYXRQb2ludDNEKC0xLjAsIC0xLjAsIDUuMCkpOwotCi0gICAgYmFjayA9IENDTGF5
ZXJTb3J0ZXI6OkxheWVyU2hhcGUoCi0gICAgICAgIEZsb2F0UG9pbnQzRCgwLjAsIDEuMCwgNC4w
KSwKLSAgICAgICAgRmxvYXRQb2ludDNEKDEuMCwgMS4wLCA0LjApLAotICAgICAgICBGbG9hdFBv
aW50M0QoMS4wLCAwLjAsIDQuMCksCi0gICAgICAgIEZsb2F0UG9pbnQzRCgwLjAsIDAuMCwgNC4w
KSk7Ci0KLSAgICBFWFBFQ1RfR1QoQ0NMYXllclNvcnRlcjo6Y2FsY3VsYXRlWkRpZmYoZnJvbnQs
IGJhY2ssIHRocmVzaG9sZCksIDAuMCk7Ci0gICAgRVhQRUNUX0xUKENDTGF5ZXJTb3J0ZXI6OmNh
bGN1bGF0ZVpEaWZmKGJhY2ssIGZyb250LCB0aHJlc2hvbGQpLCAwLjApOwotICAgIEVYUEVDVF9F
UShDQ0xheWVyU29ydGVyOjpjYWxjdWxhdGVaRGlmZihmcm9udCwgZnJvbnQsIHRocmVzaG9sZCks
IDAuMCk7Ci0gICAgRVhQRUNUX0VRKENDTGF5ZXJTb3J0ZXI6OmNhbGN1bGF0ZVpEaWZmKGJhY2ss
IGJhY2ssIHRocmVzaG9sZCksIDAuMCk7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbmVnNFRy
YW5zbGF0ZTsKKyAgICBuZWc0VHJhbnNsYXRlLnRyYW5zbGF0ZTNkKDAsIDAsIC00KTsKKyAgICBD
Q0xheWVyU29ydGVyOjpMYXllclNoYXBlIGZyb250KDIsIDIsIG5lZzRUcmFuc2xhdGUpOworCisg
ICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbmVnNVRyYW5zbGF0ZTsKKyAgICBuZWc1VHJhbnNsYXRl
LnRyYW5zbGF0ZTNkKDAsIDAsIC01KTsKKyAgICBDQ0xheWVyU29ydGVyOjpMYXllclNoYXBlIGJh
Y2soMiwgMiwgbmVnNVRyYW5zbGF0ZSk7CisKKyAgICBmbG9hdCB3ZWlnaHQ7CisgICAgb3Zlcmxh
cFJlc3VsdCA9IENDTGF5ZXJTb3J0ZXI6OmNoZWNrT3ZlcmxhcCgmZnJvbnQsICZiYWNrLCB6VGhy
ZXNob2xkLCAmd2VpZ2h0KTsKKyAgICBFWFBFQ1RfRVEoQ0NMYXllclNvcnRlcjo6QkJlZm9yZUEs
IG92ZXJsYXBSZXN1bHQpOworICAgIEVYUEVDVF9FUSgxLCB3ZWlnaHQpOworCisgICAgb3Zlcmxh
cFJlc3VsdCA9IENDTGF5ZXJTb3J0ZXI6OmNoZWNrT3ZlcmxhcCgmYmFjaywgJmZyb250LCB6VGhy
ZXNob2xkLCAmd2VpZ2h0KTsKKyAgICBFWFBFQ1RfRVEoQ0NMYXllclNvcnRlcjo6QUJlZm9yZUIs
IG92ZXJsYXBSZXN1bHQpOworICAgIEVYUEVDVF9FUSgxLCB3ZWlnaHQpOworCisgICAgLy8gT25l
IGxheWVyIHRyYW5zbGF0ZWQgb2ZmIHRvIHRoZSByaWdodC4gTm8gb3ZlcmxhcCBzaG91bGQgYmUg
ZGV0ZWN0ZWQuCisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggcmlnaHRUcmFuc2xhdGU7CisgICAg
cmlnaHRUcmFuc2xhdGUudHJhbnNsYXRlM2QoMTAsIDAsIC01KTsKKyAgICBDQ0xheWVyU29ydGVy
OjpMYXllclNoYXBlIGJhY2tSaWdodCgyLCAyLCByaWdodFRyYW5zbGF0ZSk7CisgICAgb3Zlcmxh
cFJlc3VsdCA9IENDTGF5ZXJTb3J0ZXI6OmNoZWNrT3ZlcmxhcCgmZnJvbnQsICZiYWNrUmlnaHQs
IHpUaHJlc2hvbGQsICZ3ZWlnaHQpOworICAgIEVYUEVDVF9FUShDQ0xheWVyU29ydGVyOjpOb25l
LCBvdmVybGFwUmVzdWx0KTsKKworICAgIC8vIFdoZW4gY29tcGFyaW5nIGEgbGF5ZXIgd2l0aCBp
dHNlbGYsIHogZGlmZmVyZW5jZSBpcyBhbHdheXMgMC4KKyAgICBvdmVybGFwUmVzdWx0ID0gQ0NM
YXllclNvcnRlcjo6Y2hlY2tPdmVybGFwKCZmcm9udCwgJmZyb250LCB6VGhyZXNob2xkLCAmd2Vp
Z2h0KTsKKyAgICBFWFBFQ1RfRVEoMCwgd2VpZ2h0KTsKKworICAgIC8vIFR3byBsYXllcnMgZm9y
bWluZyBhIHJpZ2h0IGFuZ2xlIHdpdGggYSBwZXJzcGVjdGl2ZSB2aWV3aW5nIHRyYW5zZm9ybS4K
KyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBwZXJzcGVjdGl2ZU1hdHJpeDsKKyAgICBwZXJzcGVj
dGl2ZU1hdHJpeC5hcHBseVBlcnNwZWN0aXZlKDEwMDApOworCisgICAgVHJhbnNmb3JtYXRpb25N
YXRyaXggbGVmdEZhY2VNYXRyaXg7CisgICAgbGVmdEZhY2VNYXRyaXgucm90YXRlM2QoMCwgMSwg
MCwgLTkwKS50cmFuc2xhdGVSaWdodDNkKC0xLCAwLCAtNSk7CisgICAgQ0NMYXllclNvcnRlcjo6
TGF5ZXJTaGFwZSBsZWZ0RmFjZSgyLCAyLCBwZXJzcGVjdGl2ZU1hdHJpeCAqIGxlZnRGYWNlTWF0
cml4KTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBmcm9udEZhY2VNYXRyaXg7CisgICAgZnJv
bnRGYWNlTWF0cml4LnRyYW5zbGF0ZTNkKDAsIDAsIC00KTsKKyAgICBDQ0xheWVyU29ydGVyOjpM
YXllclNoYXBlIGZyb250RmFjZSgyLCAyLCBwZXJzcGVjdGl2ZU1hdHJpeCAqIGZyb250RmFjZU1h
dHJpeCk7CisKKyAgICBvdmVybGFwUmVzdWx0ID0gQ0NMYXllclNvcnRlcjo6Y2hlY2tPdmVybGFw
KCZmcm9udEZhY2UsICZsZWZ0RmFjZSwgelRocmVzaG9sZCwgJndlaWdodCk7CisgICAgRVhQRUNU
X0VRKENDTGF5ZXJTb3J0ZXI6OkJCZWZvcmVBLCBvdmVybGFwUmVzdWx0KTsKKworICAgIC8vIElu
dGVyc2VjdGluZyBsYXllcnMuIEFuIGV4cGxpY2l0IG9yZGVyIHdpbGwgYmUgcmV0dXJuZWQgYmFz
ZWQgb24gcmVsYXRpdmUgegorICAgIC8vIHZhbHVlcyBhdCB0aGUgb3ZlcmxhcHBpbmcgZmVhdHVy
ZXMgYnV0IHRoZSB3ZWlnaHQgcmV0dXJuZWQgc2hvdWxkIGJlIHplcm8uCisgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggdGhyb3VnaE1hdHJpeDsKKyAgICB0aHJvdWdoTWF0cml4LnJvdGF0ZTNkKDAs
IDEsIDAsIDQ1KS50cmFuc2xhdGVSaWdodDNkKDAsIDAsIC00KTsKKyAgICBDQ0xheWVyU29ydGVy
OjpMYXllclNoYXBlIHJvdGF0ZWRGYWNlKDIsIDIsIHBlcnNwZWN0aXZlTWF0cml4ICogdGhyb3Vn
aE1hdHJpeCk7CisgICAgb3ZlcmxhcFJlc3VsdCA9IENDTGF5ZXJTb3J0ZXI6OmNoZWNrT3Zlcmxh
cCgmZnJvbnRGYWNlLCAmcm90YXRlZEZhY2UsIHpUaHJlc2hvbGQsICZ3ZWlnaHQpOworICAgIEVY
UEVDVF9ORShDQ0xheWVyU29ydGVyOjpOb25lLCBvdmVybGFwUmVzdWx0KTsKKyAgICBFWFBFQ1Rf
RVEoMCwgd2VpZ2h0KTsKIAogICAgIC8vIFRyaWNraWVyIHRlc3Qgd2l0aCBsYXllcnMgYXQgYW4g
YW5nbGUuCiAgICAgLy8KQEAgLTEyMCw0MiArMTA0LDI2IEBAIFRFU1QoQ0NMYXllclNvcnRlclRl
c3QsIENhbGN1bGF0ZVpEaWZmKQogICAgIC8vICt6ICAgICAgICAgLwogICAgIC8vCiAgICAgLy8g
QyBpcyBpbiBmcm9udCBvZiBBIGFuZCBiZWhpbmQgQiAobm90IHdoYXQgeW91J2QgZXhwZWN0IGJ5
IGNvbXBhcmluZyBjZW50ZXJzKS4KLSAgICAvLyBBIGFuZCBCIGRvbid0IG92ZXJsYXAsIHNvIHRo
ZXkncmUgaW5jb21wYXJhYmxlICh6RGlmZiA9IDApLgorICAgIC8vIEEgYW5kIEIgZG9uJ3Qgb3Zl
cmxhcCwgc28gdGhleSdyZSBpbmNvbXBhcmFibGUuCiAKLSAgICBjb25zdCBmbG9hdCB5SGkgPSAx
MC4wOwotICAgIGNvbnN0IGZsb2F0IHlMbyA9IC0xMC4wOwotICAgIGNvbnN0IGZsb2F0IHpBID0g
MS4wOwotICAgIGNvbnN0IGZsb2F0IHpCID0gLTEuMDsKLQotICAgIENDTGF5ZXJTb3J0ZXI6Okxh
eWVyU2hhcGUgbGF5ZXJBKAotICAgICAgICBGbG9hdFBvaW50M0QoLTEwLjAsIHlIaSwgekEpLAot
ICAgICAgICBGbG9hdFBvaW50M0QoLTIuMCwgeUhpLCB6QSksCi0gICAgICAgIEZsb2F0UG9pbnQz
RCgtMi4wLCB5TG8sIHpBKSwKLSAgICAgICAgRmxvYXRQb2ludDNEKC0xMC4wLCB5TG8sIHpBKSk7
Ci0KLSAgICBDQ0xheWVyU29ydGVyOjpMYXllclNoYXBlIGxheWVyQigKLSAgICAgICAgRmxvYXRQ
b2ludDNEKDIuMCwgeUhpLCB6QiksCi0gICAgICAgIEZsb2F0UG9pbnQzRCgxMC4wLCB5SGksIHpC
KSwKLSAgICAgICAgRmxvYXRQb2ludDNEKDEwLjAsIHlMbywgekIpLAotICAgICAgICBGbG9hdFBv
aW50M0QoMi4wLCB5TG8sIHpCKSk7Ci0KLSAgICBDQ0xheWVyU29ydGVyOjpMYXllclNoYXBlIGxh
eWVyQygKLSAgICAgICAgRmxvYXRQb2ludDNEKC01LjAsIHlIaSwgNS4wKSwKLSAgICAgICAgRmxv
YXRQb2ludDNEKDUuMCwgeUhpLCAtNS4wKSwKLSAgICAgICAgRmxvYXRQb2ludDNEKDUuMCwgeUxv
LCAtNS4wKSwKLSAgICAgICAgRmxvYXRQb2ludDNEKC01LjAsIHlMbywgNS4wKSk7Ci0KLSAgICBF
WFBFQ1RfRVEoQ0NMYXllclNvcnRlcjo6Y2FsY3VsYXRlWkRpZmYobGF5ZXJBLCBsYXllckEsIHRo
cmVzaG9sZCksIDAuMCk7Ci0gICAgRVhQRUNUX0VRKENDTGF5ZXJTb3J0ZXI6OmNhbGN1bGF0ZVpE
aWZmKGxheWVyQSwgbGF5ZXJCLCB0aHJlc2hvbGQpLCAwLjApOwotICAgIEVYUEVDVF9MVChDQ0xh
eWVyU29ydGVyOjpjYWxjdWxhdGVaRGlmZihsYXllckEsIGxheWVyQywgdGhyZXNob2xkKSwgMC4w
KTsKLQotICAgIEVYUEVDVF9FUShDQ0xheWVyU29ydGVyOjpjYWxjdWxhdGVaRGlmZihsYXllckIs
IGxheWVyQSwgdGhyZXNob2xkKSwgMC4wKTsKLSAgICBFWFBFQ1RfRVEoQ0NMYXllclNvcnRlcjo6
Y2FsY3VsYXRlWkRpZmYobGF5ZXJCLCBsYXllckIsIHRocmVzaG9sZCksIDAuMCk7Ci0gICAgRVhQ
RUNUX0dUKENDTGF5ZXJTb3J0ZXI6OmNhbGN1bGF0ZVpEaWZmKGxheWVyQiwgbGF5ZXJDLCB0aHJl
c2hvbGQpLCAwLjApOwotCi0gICAgRVhQRUNUX0dUKENDTGF5ZXJTb3J0ZXI6OmNhbGN1bGF0ZVpE
aWZmKGxheWVyQywgbGF5ZXJBLCB0aHJlc2hvbGQpLCAwLjApOwotICAgIEVYUEVDVF9MVChDQ0xh
eWVyU29ydGVyOjpjYWxjdWxhdGVaRGlmZihsYXllckMsIGxheWVyQiwgdGhyZXNob2xkKSwgMC4w
KTsKLSAgICBFWFBFQ1RfRVEoQ0NMYXllclNvcnRlcjo6Y2FsY3VsYXRlWkRpZmYobGF5ZXJDLCBs
YXllckMsIHRocmVzaG9sZCksIDAuMCk7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNm
b3JtQTsKKyAgICB0cmFuc2Zvcm1BLnRyYW5zbGF0ZTNkKC02LCAwLCAxKTsKKyAgICBDQ0xheWVy
U29ydGVyOjpMYXllclNoYXBlIGxheWVyQSg4LCAyMCwgdHJhbnNmb3JtQSk7CisKKyAgICBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm1COworICAgIHRyYW5zZm9ybUIudHJhbnNsYXRlM2Qo
NiwgMCwgLTEpOworICAgIENDTGF5ZXJTb3J0ZXI6OkxheWVyU2hhcGUgbGF5ZXJCKDgsIDIwLCB0
cmFuc2Zvcm1CKTsKKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybUM7CisgICAg
dHJhbnNmb3JtQy5yb3RhdGUzZCgwLCAxLCAwLCA0MCk7CisgICAgQ0NMYXllclNvcnRlcjo6TGF5
ZXJTaGFwZSBsYXllckMoOCwgMjAsIHRyYW5zZm9ybUMpOworCisgICAgb3ZlcmxhcFJlc3VsdCA9
IENDTGF5ZXJTb3J0ZXI6OmNoZWNrT3ZlcmxhcCgmbGF5ZXJBLCAmbGF5ZXJDLCB6VGhyZXNob2xk
LCAmd2VpZ2h0KTsKKyAgICBFWFBFQ1RfRVEoQ0NMYXllclNvcnRlcjo6QUJlZm9yZUIsIG92ZXJs
YXBSZXN1bHQpOworICAgIG92ZXJsYXBSZXN1bHQgPSBDQ0xheWVyU29ydGVyOjpjaGVja092ZXJs
YXAoJmxheWVyQywgJmxheWVyQiwgelRocmVzaG9sZCwgJndlaWdodCk7CisgICAgRVhQRUNUX0VR
KENDTGF5ZXJTb3J0ZXI6OkFCZWZvcmVCLCBvdmVybGFwUmVzdWx0KTsKKyAgICBvdmVybGFwUmVz
dWx0ID0gQ0NMYXllclNvcnRlcjo6Y2hlY2tPdmVybGFwKCZsYXllckEsICZsYXllckIsIHpUaHJl
c2hvbGQsICZ3ZWlnaHQpOworICAgIEVYUEVDVF9FUShDQ0xheWVyU29ydGVyOjpOb25lLCBvdmVy
bGFwUmVzdWx0KTsKIH0KIAogVEVTVChDQ0xheWVyU29ydGVyVGVzdCwgdmVyaWZ5RXhpc3RpbmdP
cmRlcmluZ1ByZXNlcnZlZFdoZW5Ob1pEaWZmKQo=
</data>
<flag name="review"
          id="137718"
          type_id="1"
          status="+"
          setter="kbr"
    />
          </attachment>
      

    </bug>

</bugzilla>