<?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>188846</bug_id>
          
          <creation_ts>2018-08-22 07:42:51 -0700</creation_ts>
          <short_desc>[LFC][Floating] Move files to a dedicated directory.</short_desc>
          <delta_ts>2018-08-22 10:13:07 -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>Layout and Rendering</component>
          <version>WebKit 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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="alan">zalan</reporter>
          <assigned_to name="alan">zalan</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>commit-queue</cc>
    
    <cc>koivisto</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>zalan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1452619</commentid>
    <comment_count>0</comment_count>
    <who name="alan">zalan</who>
    <bug_when>2018-08-22 07:42:51 -0700</bug_when>
    <thetext>-&gt;floatformatting</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1452620</commentid>
    <comment_count>1</comment_count>
      <attachid>347790</attachid>
    <who name="alan">zalan</who>
    <bug_when>2018-08-22 07:46:19 -0700</bug_when>
    <thetext>Created attachment 347790
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1452623</commentid>
    <comment_count>2</comment_count>
      <attachid>347791</attachid>
    <who name="alan">zalan</who>
    <bug_when>2018-08-22 07:54:49 -0700</bug_when>
    <thetext>Created attachment 347791
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1452632</commentid>
    <comment_count>3</comment_count>
      <attachid>347791</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2018-08-22 08:27:01 -0700</bug_when>
    <thetext>Comment on attachment 347791
Patch

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

&gt; Source/WebCore/ChangeLog:8
&gt; +        layout/Float* -&gt; layout/floatformatting

floatformatting is a bit of a mouthful. Maybe layout/floats?

I see you have blockformatting now, so maybe that should be layout/block too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1452649</commentid>
    <comment_count>4</comment_count>
      <attachid>347801</attachid>
    <who name="alan">zalan</who>
    <bug_when>2018-08-22 09:07:48 -0700</bug_when>
    <thetext>Created attachment 347801
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1452662</commentid>
    <comment_count>5</comment_count>
      <attachid>347806</attachid>
    <who name="alan">zalan</who>
    <bug_when>2018-08-22 09:30:26 -0700</bug_when>
    <thetext>Created attachment 347806
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1452690</commentid>
    <comment_count>6</comment_count>
      <attachid>347806</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2018-08-22 10:10:41 -0700</bug_when>
    <thetext>Comment on attachment 347806
Patch

Clearing flags on attachment: 347806

Committed r235178: &lt;https://trac.webkit.org/changeset/235178&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1452691</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2018-08-22 10:10:42 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1452694</commentid>
    <comment_count>8</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2018-08-22 10:13:07 -0700</bug_when>
    <thetext>&lt;rdar://problem/43609708&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>347790</attachid>
            <date>2018-08-22 07:46:19 -0700</date>
            <delta_ts>2018-08-22 07:51:42 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-188846-20180822074616.patch</filename>
            <type>text/plain</type>
            <size>76354</size>
            <attacher name="alan">zalan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjM1MTcwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGE4NTY3MjZlMjVkZDEy
ZGI4Y2IyOTc2NWUxZjRmMmY2OGM2YWU5Yy4uYTA4NDRmYzU5OGMxMzFmYTQ5ZWZiN2Y0ZmRkNmMw
YzdhZWYzNTkyOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY0IEBACisyMDE4LTA4LTIyICBaYWxh
biBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CisKKyAgICAgICAgW0xGQ11bRmxvYXRpbmddIE1v
dmUgZmlsZXMgdG8gYSBkZWRpY2F0ZWQgZGlyZWN0b3J5LgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg4ODQ2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgbGF5b3V0L0Zsb2F0KiAtPiBsYXlvdXQvZmxvYXRm
b3JtYXR0aW5nCisKKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6
CisgICAgICAgICogbGF5b3V0L2Zsb2F0Zm9ybWF0dGluZy9GbG9hdGluZ0NvbnRleHQuY3BwOiBS
ZW5hbWVkIGZyb20gU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nQ29udGV4dC5jcHAuCisg
ICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFpcjo6aXNFbXB0eSBjb25zdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFpcjo6dmVydGljYWxQb3NpdGlvbiBj
b25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6Okl0ZXJhdG9yOjpvcGVyYXRvciogY29u
c3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpiZWdpbik6CisgICAgICAgIChXZWJDb3Jl
OjpMYXlvdXQ6OmVuZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4
dDo6RmxvYXRpbmdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdD
b250ZXh0Ojpwb3NpdGlvbkZvckZsb2F0IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91
dDo6RmxvYXRpbmdDb250ZXh0Ojp2ZXJ0aWNhbFBvc2l0aW9uV2l0aENsZWFyYW5jZSBjb25zdCk6
CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4dDo6ZmxvYXRpbmdQb3Np
dGlvbiBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4dDo6
aW5pdGlhbFZlcnRpY2FsUG9zaXRpb24gY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0
OjpGbG9hdGluZ0NvbnRleHQ6OmFsaWduV2l0aENvbnRhaW5pbmdCbG9jayBjb25zdCk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4dDo6YWxpZ25XaXRoRmxvYXRpbmdz
IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdDb250ZXh0Ojp0b0Nv
bnRhaW5pbmdCbG9jayBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5n
UGFpcjo6RmxvYXRpbmdQYWlyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdQ
YWlyOjpsZWZ0IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdQYWly
OjpyaWdodCBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFpcjo6
aW50ZXJzZWN0cyBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFp
cjo6b3BlcmF0b3IgPT0gY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGlu
Z1BhaXI6OmJvdHRvbSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6Okl0ZXJhdG9y
OjpJdGVyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OnByZXZpb3VzRmxvYXRpbmdJ
bmRleCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6Okl0ZXJhdG9yOjpvcGVyYXRvcisrKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6SXRlcmF0b3I6OnNldCk6CisgICAgICAgIChXZWJD
b3JlOjpMYXlvdXQ6Okl0ZXJhdG9yOjpvcGVyYXRvcj09IGNvbnN0KToKKyAgICAgICAgKFdlYkNv
cmU6OkxheW91dDo6SXRlcmF0b3I6Om9wZXJhdG9yIT0gY29uc3QpOgorICAgICAgICAqIGxheW91
dC9mbG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdDb250ZXh0Lmg6IFJlbmFtZWQgZnJvbSBTb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdDb250ZXh0LmguCisgICAgICAgIChXZWJDb3JlOjpMYXlv
dXQ6OkZsb2F0aW5nQ29udGV4dDo6ZmxvYXRpbmdTdGF0ZSBjb25zdCk6CisgICAgICAgIChXZWJD
b3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4dDo6bGF5b3V0Q29udGV4dCBjb25zdCk6CisgICAg
ICAgICogbGF5b3V0L2Zsb2F0Zm9ybWF0dGluZy9GbG9hdGluZ1N0YXRlLmNwcDogUmVuYW1lZCBm
cm9tIFNvdXJjZS9XZWJDb3JlL2xheW91dC9GbG9hdGluZ1N0YXRlLmNwcC4KKyAgICAgICAgKFdl
YkNvcmU6OkxheW91dDo6RmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtOjpGbG9hdEl0ZW0pOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpGbG9hdGluZ1N0YXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheW91dDo6YmVsb25nc1RvVGhpc0Zsb2F0aW5nQ29udGV4dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OnJlbW92ZSk6CisgICAgICAg
IChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OmFwcGVuZCk6CisgICAgICAgIChXZWJD
b3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OmJvdHRvbSBjb25zdCk6CisgICAgICAgICogbGF5
b3V0L2Zsb2F0Zm9ybWF0dGluZy9GbG9hdGluZ1N0YXRlLmg6IFJlbmFtZWQgZnJvbSBTb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdTdGF0ZS5oLgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0
OjpGbG9hdGluZ1N0YXRlOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9h
dGluZ1N0YXRlOjppc0VtcHR5IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Rmxv
YXRpbmdTdGF0ZTo6RmxvYXRJdGVtOjpsYXlvdXRCb3ggY29uc3QpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW06OmNvbnRhaW5pbmdCbG9jayBjb25z
dCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbTo6
ZGlzcGxheUJveCBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3Rh
dGU6OkZsb2F0SXRlbTo6Y29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCBjb25zdCk6CisgICAgICAg
IChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OmZsb2F0cyBjb25zdCk6CisgICAgICAg
IChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6Omxhc3QgY29uc3QpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpsYXlvdXRDb250ZXh0IGNvbnN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdTdGF0ZTo6cm9vdCBjb25zdCk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OmxlZnRCb3R0b20gY29uc3QpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpyaWdodEJvdHRvbSBjb25z
dCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OmJvdHRvbSBjb25z
dCk6CisKIDIwMTgtMDgtMjIgIFphbGFuIEJ1anRhcyAgPHphbGFuQGFwcGxlLmNvbT4KIAogICAg
ICAgICBBZGQgY2hhbmdlcyBtaXNzaW5nIGZyb20gcjIzNDkyNS4KZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJD
b3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCAxZDY0YjMyZjRhMTMy
MDgyM2E1ODY3ZDBhNWYxZGQ0MWE0YjhlNmIzLi5lODc5YTRmMmI2NmI3NDYyMzNlMzNlYzBkNDc1
YjMyMmQ4NWY4YjFhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qCkBAIC0xOTg5LDYgKzE5ODksOCBAQAogCQk2Rjk5NUEzODFBNzA4MzM3
MDBBNzM1RjQgLyogSlNXZWJHTFRyYW5zZm9ybUZlZWRiYWNrLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2Rjk5NUEyRTFBNzA4MzM3MDBBNzM1RjQgLyog
SlNXZWJHTFRyYW5zZm9ybUZlZWRiYWNrLmggKi87IH07CiAJCTZGOTk1QTNBMUE3MDgzMzcwMEE3
MzVGNCAvKiBKU1dlYkdMVmVydGV4QXJyYXlPYmplY3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZGOTk1QTMwMUE3MDgzMzcwMEE3MzVGNCAvKiBKU1dl
YkdMVmVydGV4QXJyYXlPYmplY3QuaCAqLzsgfTsKIAkJNkZBNDQ1NEU4OThGMkZDMTY4QkMzOEMx
IC8qIEpTQmVmb3JlVW5sb2FkRXZlbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDI5RTA0QTI3QkVEMkY4MUY5OEU5MDIyQiAvKiBKU0JlZm9yZVVubG9h
ZEV2ZW50LmggKi87IH07CisJCTZGQ0ZDMDU3MjEyREFENjEwMDc2OTVEMiAvKiBGbG9hdGluZ1N0
YXRlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDEx
NUNGQTgxMjA4QjhFREEwMDFFNjk5MSAvKiBGbG9hdGluZ1N0YXRlLmNwcCAqLzsgfTsKKwkJNkZD
RkMwNTgyMTJEQUQ4MzAwNzY5NUQyIC8qIEZsb2F0aW5nQ29udGV4dC5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxMTVDRkE4NTIwOEI5MDY2MDAxRTY5
OTEgLyogRmxvYXRpbmdDb250ZXh0LmNwcCAqLzsgfTsKIAkJNzA5QTAxRkUxRTNEMEJERDAwNkIw
RDRDIC8qIE1vZHVsZUZldGNoRmFpbHVyZUtpbmQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDcwOUEwMUZEMUUzRDBCQ0MwMDZCMEQ0QyAvKiBNb2R1bGVG
ZXRjaEZhaWx1cmVLaW5kLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwg
KTsgfTsgfTsKIAkJNzEwMjVFQ0QxRjk5RjBDRTAwNEEyNTBDIC8qIEFuaW1hdGlvblRpbWVsaW5l
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3MTAyNUVD
NzFGOTlGMDk2MDA0QTI1MEMgLyogQW5pbWF0aW9uVGltZWxpbmUuaCAqLzsgc2V0dGluZ3MgPSB7
QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk3MTAyNUVEMDFGOTlGMENFMDA0QTI1
MEMgLyogRG9jdW1lbnRUaW1lbGluZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gNzEwMjVFQzUxRjk5RjA5NjAwNEEyNTBDIC8qIERvY3VtZW50VGltZWxp
bmUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwpAQCAt
MTU2NjUsMTIgKzE1NjY3LDkgQEAKIAkJCWNoaWxkcmVuID0gKAogCQkJCTExNUNGQTk5MjA4QkMw
OUEwMDFFNjk5MSAvKiBibG9ja2Zvcm1hdHRpbmcgKi8sCiAJCQkJMTE5OUZBNTgyMDhFM0M0QzAw
MjM1OENDIC8qIGRpc3BsYXl0cmVlICovLAorCQkJCTZGQ0ZDMDU1MjEyREFDQzIwMDc2OTVEMiAv
KiBmbG9hdGZvcm1hdHRpbmcgKi8sCiAJCQkJMTE1Q0ZBOUEyMDhCQzE0MDAwMUU2OTkxIC8qIGlu
bGluZWZvcm1hdHRpbmcgKi8sCiAJCQkJMTE1Q0ZBOTAyMDhCOTQ0MTAwMUU2OTkxIC8qIGxheW91
dHRyZWUgKi8sCi0JCQkJMTE1Q0ZBODUyMDhCOTA2NjAwMUU2OTkxIC8qIEZsb2F0aW5nQ29udGV4
dC5jcHAgKi8sCi0JCQkJMTE1Q0ZBODQyMDhCOTA2NjAwMUU2OTkxIC8qIEZsb2F0aW5nQ29udGV4
dC5oICovLAotCQkJCTExNUNGQTgxMjA4QjhFREEwMDFFNjk5MSAvKiBGbG9hdGluZ1N0YXRlLmNw
cCAqLywKLQkJCQkxMTVDRkE4MDIwOEI4RURBMDAxRTY5OTEgLyogRmxvYXRpbmdTdGF0ZS5oICov
LAogCQkJCTExNUNGQTY5MjA4QUY3RDAwMDFFNjk5MSAvKiBGb3JtYXR0aW5nQ29udGV4dC5jcHAg
Ki8sCiAJCQkJMTE1Q0ZBNjgyMDhBRjdEMDAwMUU2OTkxIC8qIEZvcm1hdHRpbmdDb250ZXh0Lmgg
Ki8sCiAJCQkJNkZCQjg2MDUyMEI0NjRCNjAwREFEOTM4IC8qIEZvcm1hdHRpbmdDb250ZXh0R2Vv
bWV0cnkuY3BwICovLApAQCAtMTk0NzEsNiArMTk0NzAsMTcgQEAKIAkJCXBhdGggPSBzaW1wbGU7
CiAJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwogCQl9OworCQk2RkNGQzA1NTIxMkRBQ0MyMDA3
Njk1RDIgLyogZmxvYXRmb3JtYXR0aW5nICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQlj
aGlsZHJlbiA9ICgKKwkJCQkxMTVDRkE4NTIwOEI5MDY2MDAxRTY5OTEgLyogRmxvYXRpbmdDb250
ZXh0LmNwcCAqLywKKwkJCQkxMTVDRkE4NDIwOEI5MDY2MDAxRTY5OTEgLyogRmxvYXRpbmdDb250
ZXh0LmggKi8sCisJCQkJMTE1Q0ZBODEyMDhCOEVEQTAwMUU2OTkxIC8qIEZsb2F0aW5nU3RhdGUu
Y3BwICovLAorCQkJCTExNUNGQTgwMjA4QjhFREEwMDFFNjk5MSAvKiBGbG9hdGluZ1N0YXRlLmgg
Ki8sCisJCQkpOworCQkJcGF0aCA9IGZsb2F0Zm9ybWF0dGluZzsKKwkJCXNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7CisJCX07CiAJCTZGRTdEREREMjBFQzZFOEIwMDhCNUI0RSAvKiB0ZXh0bGF5b3V0
ICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKQEAgLTMxMzY5LDYg
KzMxMzc5LDggQEAKIAkJCQk1QzQzMDRCMDE5MUFDOTA4MDAwRTJCQzAgLyogRVhUU2hhZGVyVGV4
dHVyZUxPRC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk3MjdBRkVENDFBMkVBNkFFMDAwNDQyRTgg
LyogRVhUc1JHQi5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk3NzI4Njk0RTE0Rjg4ODI1MDBGNDg0
REMgLyogRVhUVGV4dHVyZUZpbHRlckFuaXNvdHJvcGljLmNwcCBpbiBTb3VyY2VzICovLAorCQkJ
CTZGQ0ZDMDU4MjEyREFEODMwMDc2OTVEMiAvKiBGbG9hdGluZ0NvbnRleHQuY3BwIGluIFNvdXJj
ZXMgKi8sCisJCQkJNkZDRkMwNTcyMTJEQUQ2MTAwNzY5NUQyIC8qIEZsb2F0aW5nU3RhdGUuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJN0NFNkNCRkQxODdGMzk0OTAwRDQ2QkY1IC8qIEZvcm1hdENv
bnZlcnRlci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk1MUE0QkIwQTE5NTRENjE2MDBGQTVDMkUg
LyogR2FtZXBhZC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk1MThGNEZGNjE5NENBNEU2MDA4MUJB
QUUgLyogR2FtZXBhZEJ1dHRvbi5jcHAgaW4gU291cmNlcyAqLywKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9GbG9hdGluZ0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5
b3V0L0Zsb2F0aW5nQ29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRm
ZWFlYTI3YmUxODBjNWMxMGY0ZWQ5MjU4YjBhYmY0MmMzOGE3N2EuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0
aW5nQ29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MTYgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0g
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQot
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJGbG9hdGluZ0NvbnRleHQuaCIKLQot
I2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5jbHVkZSAiRGlzcGxh
eUJveC5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dENvbnRhaW5l
ci5oIgotI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9j
SW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQot
V1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEZsb2F0aW5nQ29udGV4dCk7Ci0KLS8vIEZpbmRp
bmcgdGhlIHRvcC9sZWZ0IHBvc2l0aW9uIGZvciBhIG5ldyBmbG9hdGluZyhGKQotLy8gIF9fX18g
IF9fX18gIF9fX19fICAgICAgICAgICAgICAgX19fX19fXwotLy8gfCAgICB8fCBMMiB8fCAgICAg
fCA8LS0tLS0xLS0tLT58ICAgICAgIHwKLS8vIHwgICAgfHxfX19ffHwgIEwzIHwgICAgICAgICAg
ICAgfCAgIFIxICB8Ci0vLyB8IEwxIHwgICAgICB8X19fX198ICAgICAgICAgICAgIHwgICAgICAg
fAotLy8gfF9fX198IDwtLS0tLS0tLS0tLS0tMi0tLS0tLS0tLT58ICAgICAgIHwKLS8vICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8Ci0vLyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHxfX19fX19ffAotLy8KLS8vIDEuIENvbXB1dGUgdGhlIGluaXRpYWwg
dmVydGljYWwgcG9zaXRpb24gZm9yIChGKSAtPiAoMSkKLS8vIDIuIEZpbmQgdGhlIGNvcnJlc3Bv
bmRpbmcgZmxvYXRpbmcgcGFpciAoTDMtUjEpCi0vLyAzLiBBbGlnbiAoRikgaG9yaXpvbnRhbGx5
IHdpdGggKEwzLVIxKSBkZXBlbmRpbmcgd2hldGhlciAoRikgaXMgbGVmdC9yaWdodCBwb3NpdGlv
bmVkCi0vLyA0LiBJbnRlcnNlY3QgKEYpIHdpdGggKEwzLVIxKQotLy8gNS4gSWYgKEYpIGRvZXMg
bm90IGZpdCwgZmluZCB0aGUgbmV4dCBmbG9hdGluZyBwYWlyIChMMS1SMSkKLS8vIDYuIFJlcGVh
dCB1bnRpbCBlaXRoZXIgKEYpIGZpdHMvbm8gbW9yZSBmbG9hdHMuCi0vLyBOb3RlIHRoYXQgYWxs
IGNvb3JkaW5hdGVzIGFyZSBpbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIGZvcm1hdHRp
bmcgcm9vdC4KLS8vIFRoZSBmb3JtYXR0aW5nIHJvb3QgaGVyZSBpcyBhbHdheXMgdGhlIG9uZSB0
aGF0IGVzdGFibGlzaGVzIHRoZSBmbG9hdGluZyBjb250ZXh0IChzZWUgaW5oZXJpdGVkIGZsb2F0
aW5nIGNvbnRleHQpLgotLy8gKEl0IHNpbXBseSBtZWFucyB0aGF0IHRoZSBmbG9hdCBib3gncyBm
b3JtYXR0aW5nIHJvb3QgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBGb3JtYXR0
aW5nQ29udGV4dCdzIHJvb3QuKQotCi1jbGFzcyBJdGVyYXRvcjsKLQotY2xhc3MgRmxvYXRpbmdQ
YWlyIHsKLXB1YmxpYzoKLSAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhbV9sZWZ0
SW5kZXggJiYgIW1fcmlnaHRJbmRleDsgfQotICAgIGNvbnN0IERpc3BsYXk6OkJveCogbGVmdCgp
IGNvbnN0OwotICAgIGNvbnN0IERpc3BsYXk6OkJveCogcmlnaHQoKSBjb25zdDsKLSAgICBib29s
IGludGVyc2VjdHMoY29uc3QgRGlzcGxheTo6Qm94OjpSZWN0JikgY29uc3Q7Ci0gICAgTGF5b3V0
VW5pdCB2ZXJ0aWNhbFBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV92ZXJ0aWNhbFBvc2l0aW9u
OyB9Ci0gICAgTGF5b3V0VW5pdCBib3R0b20oKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yPT0o
Y29uc3QgRmxvYXRpbmdQYWlyJikgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNz
IEl0ZXJhdG9yOwotICAgIEZsb2F0aW5nUGFpcihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExp
c3QmKTsKLQotICAgIGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgbV9mbG9hdHM7Ci0K
LSAgICBzdGQ6Om9wdGlvbmFsPHVuc2lnbmVkPiBtX2xlZnRJbmRleDsKLSAgICBzdGQ6Om9wdGlv
bmFsPHVuc2lnbmVkPiBtX3JpZ2h0SW5kZXg7Ci0gICAgTGF5b3V0VW5pdCBtX3ZlcnRpY2FsUG9z
aXRpb247Ci19OwotCi1jbGFzcyBJdGVyYXRvciB7Ci1wdWJsaWM6Ci0gICAgSXRlcmF0b3IoY29u
c3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRMaXN0Jiwgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiB2
ZXJ0aWNhbFBvc2l0aW9uKTsKLQotICAgIGNvbnN0IEZsb2F0aW5nUGFpciYgb3BlcmF0b3IqKCkg
Y29uc3QgeyByZXR1cm4gbV9jdXJyZW50OyB9Ci0gICAgSXRlcmF0b3ImIG9wZXJhdG9yKysoKTsK
LSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3ImKSBjb25zdDsKLSAgICBib29sIG9w
ZXJhdG9yIT0oY29uc3QgSXRlcmF0b3ImKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB2b2lkIHNl
dChMYXlvdXRVbml0IHZlcnRpY2FsUG9zaXRpb24pOwotCi0gICAgY29uc3QgRmxvYXRpbmdTdGF0
ZTo6RmxvYXRMaXN0JiBtX2Zsb2F0czsKLSAgICBGbG9hdGluZ1BhaXIgbV9jdXJyZW50OwotfTsK
LQotc3RhdGljIEl0ZXJhdG9yIGJlZ2luKGNvbnN0IEZsb2F0aW5nU3RhdGUmIGZsb2F0aW5nU3Rh
dGUsIExheW91dFVuaXQgaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24pCi17Ci0gICAgLy8gU3RhcnQg
d2l0aCB0aGUgaW5uZXItbW9zdCBmbG9hdGluZyBwYWlyIGZvciB0aGUgaW5pdGlhbCB2ZXJ0aWNh
bCBwb3NpdGlvbi4KLSAgICByZXR1cm4gSXRlcmF0b3IoZmxvYXRpbmdTdGF0ZS5mbG9hdHMoKSwg
aW5pdGlhbFZlcnRpY2FsUG9zaXRpb24pOwotfQotCi1zdGF0aWMgSXRlcmF0b3IgZW5kKGNvbnN0
IEZsb2F0aW5nU3RhdGUmIGZsb2F0aW5nU3RhdGUpCi17Ci0gICAgcmV0dXJuIEl0ZXJhdG9yKGZs
b2F0aW5nU3RhdGUuZmxvYXRzKCksIHN0ZDo6bnVsbG9wdCk7Ci19Ci0KLUZsb2F0aW5nQ29udGV4
dDo6RmxvYXRpbmdDb250ZXh0KEZsb2F0aW5nU3RhdGUmIGZsb2F0aW5nU3RhdGUpCi0gICAgOiBt
X2Zsb2F0aW5nU3RhdGUoZmxvYXRpbmdTdGF0ZSkKLXsKLX0KLQotUG9zaXRpb24gRmxvYXRpbmdD
b250ZXh0Ojpwb3NpdGlvbkZvckZsb2F0KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAotewot
ICAgIEFTU0VSVChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7Ci0gICAgRmxvYXRp
bmdTdGF0ZTo6RmxvYXRJdGVtIGZsb2F0SXRlbSA9IHsgbGF5b3V0Qm94LCBtX2Zsb2F0aW5nU3Rh
dGUgfTsKLQotICAgIFBvc2l0aW9uIGZsb2F0UG9zaXRpb247Ci0gICAgaWYgKG1fZmxvYXRpbmdT
dGF0ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgLy8gTm8gZmxvYXQgYm94IG9uIHRoZSBjb250ZXh0
IHlldCAtPiBhbGlnbiBpdCB3aXRoIHRoZSBjb250YWluaW5nIGJsb2NrJ3MgbGVmdC9yaWdodCBl
ZGdlLgotICAgICAgICBhdXRvJiBkaXNwbGF5Qm94ID0gZmxvYXRJdGVtLmRpc3BsYXlCb3goKTsK
LSAgICAgICAgZmxvYXRQb3NpdGlvbiA9IHsgYWxpZ25XaXRoQ29udGFpbmluZ0Jsb2NrKGZsb2F0
SXRlbSkgKyBkaXNwbGF5Qm94Lm1hcmdpbkxlZnQoKSwgZGlzcGxheUJveC50b3AoKSB9OwotICAg
IH0gZWxzZSB7Ci0gICAgICAgIC8vIEZpbmQgdGhlIHRvcCBtb3N0IHBvc2l0aW9uIHdoZXJlIHRo
ZSBmbG9hdCBib3ggZml0cy4KLSAgICAgICAgZmxvYXRQb3NpdGlvbiA9IGZsb2F0aW5nUG9zaXRp
b24oZmxvYXRJdGVtKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdG9Db250YWluaW5nQmxvY2soZmxv
YXRJdGVtLCBmbG9hdFBvc2l0aW9uKTsKLX0KLQotc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBG
bG9hdGluZ0NvbnRleHQ6OnZlcnRpY2FsUG9zaXRpb25XaXRoQ2xlYXJhbmNlKGNvbnN0IEJveCYg
bGF5b3V0Qm94KSBjb25zdAotewotICAgIEFTU0VSVChsYXlvdXRCb3guaGFzRmxvYXRDbGVhcigp
KTsKLSAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKLQotICAgIGlmICht
X2Zsb2F0aW5nU3RhdGUuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4geyB9OwotCi0gICAgYXV0
byBib3R0b20gPSBbJl0oc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBmbG9hdEJvdHRvbSkgLT4g
c3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiB7Ci0gICAgICAgIC8vICdib3R0b20nIGlzIGluIHRo
ZSBmb3JtYXR0aW5nIHJvb3QncyBjb29yZGluYXRlIHN5c3RlbS4KLSAgICAgICAgaWYgKCFmbG9h
dEJvdHRvbSkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAgICAgLy8gOS41LjIgQ29u
dHJvbGxpbmcgZmxvdyBuZXh0IHRvIGZsb2F0czogdGhlICdjbGVhcicgcHJvcGVydHkKLSAgICAg
ICAgLy8gVGhlbiB0aGUgYW1vdW50IG9mIGNsZWFyYW5jZSBpcyBzZXQgdG8gdGhlIGdyZWF0ZXIg
b2Y6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIDEuIFRoZSBhbW91bnQgbmVjZXNzYXJ5IHRvIHBs
YWNlIHRoZSBib3JkZXIgZWRnZSBvZiB0aGUgYmxvY2sgZXZlbiB3aXRoIHRoZSBib3R0b20gb3V0
ZXIgZWRnZSBvZiB0aGUgbG93ZXN0IGZsb2F0IHRoYXQgaXMgdG8gYmUgY2xlYXJlZC4KLSAgICAg
ICAgLy8gMi4gVGhlIGFtb3VudCBuZWNlc3NhcnkgdG8gcGxhY2UgdGhlIHRvcCBib3JkZXIgZWRn
ZSBvZiB0aGUgYmxvY2sgYXQgaXRzIGh5cG90aGV0aWNhbCBwb3NpdGlvbi4KLQotICAgICAgICBh
dXRvJiBsYXlvdXRDb250ZXh0ID0gdGhpcy0+bGF5b3V0Q29udGV4dCgpOwotICAgICAgICBhdXRv
JiBkaXNwbGF5Qm94ID0gKmxheW91dENvbnRleHQuZGlzcGxheUJveEZvckxheW91dEJveChsYXlv
dXRCb3gpOwotICAgICAgICBhdXRvIHJvb3RSZWxhdGl2ZVRvcCA9IEZvcm1hdHRpbmdDb250ZXh0
OjptYXBUb3BMZWZ0VG9BbmNlc3RvcihsYXlvdXRDb250ZXh0LCBsYXlvdXRCb3gsIGRvd25jYXN0
PENvbnRhaW5lcj4obV9mbG9hdGluZ1N0YXRlLnJvb3QoKSkpLnk7Ci0gICAgICAgIGF1dG8gY2xl
YXJhbmNlID0gKmZsb2F0Qm90dG9tIC0gcm9vdFJlbGF0aXZlVG9wOwotICAgICAgICBpZiAoY2xl
YXJhbmNlIDw9IDApCi0gICAgICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAgIC8vIENsZWFy
YW5jZSBpbmhpYml0cyBtYXJnaW4gY29sbGFwc2luZy4gTGV0J3MgcmVzZXQgdGhlIHJlbGV2YW50
IGFkam9pbmluZyBtYXJnaW5zLgotICAgICAgICBpZiAoYXV0byogcHJldmlvdXNJbkZsb3dTaWJs
aW5nID0gbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpKSB7Ci0gICAgICAgICAgICBh
dXRvJiBwcmV2aW91c0luRmxvd0Rpc3BsYXlCb3ggPSAqbGF5b3V0Q29udGV4dC5kaXNwbGF5Qm94
Rm9yTGF5b3V0Qm94KCpwcmV2aW91c0luRmxvd1NpYmxpbmcpOwotCi0gICAgICAgICAgICAvLyBT
aW5jZSB0aGUgcHJldmlvdXMgaW5mbG93IHNpYmxpbmcgaGFzIGFscmVhZHkgYmVlbiBsYWlkIG91
dCwgaXRzIG1hcmdpbiBpcyBjb2xsYXBzZWQgYnkgbm93LgotICAgICAgICAgICAgQVNTRVJUKCFw
cmV2aW91c0luRmxvd0Rpc3BsYXlCb3gubWFyZ2luQm90dG9tKCkpOwotICAgICAgICAgICAgYXV0
byBjb2xsYXBzZWRNYXJnaW4gPSBkaXNwbGF5Qm94Lm1hcmdpblRvcCgpOwotCi0gICAgICAgICAg
ICAvLyBSZXNldCBwcmV2aW91cyBib3R0b20gYW5kIGN1cnJlbnQgdG9wIG1hcmdpbnMgdG8gbm9u
LWNvbGxhcHNpbmcuCi0gICAgICAgICAgICBwcmV2aW91c0luRmxvd0Rpc3BsYXlCb3guc2V0VmVy
dGljYWxNYXJnaW4oeyBwcmV2aW91c0luRmxvd0Rpc3BsYXlCb3gubWFyZ2luVG9wKCksIHByZXZp
b3VzSW5GbG93RGlzcGxheUJveC5ub25Db2xsYXBzZWRNYXJnaW5Cb3R0b20oKSB9KTsKLSAgICAg
ICAgICAgIGRpc3BsYXlCb3guc2V0VmVydGljYWxNYXJnaW4oeyBkaXNwbGF5Qm94Lm5vbkNvbGxh
cHNlZE1hcmdpblRvcCgpLCBkaXNwbGF5Qm94Lm1hcmdpbkJvdHRvbSgpIH0pOwotCi0gICAgICAg
ICAgICBhdXRvIG5vbkNvbGxhcHNlZE1hcmdpbiA9IHByZXZpb3VzSW5GbG93RGlzcGxheUJveC5t
YXJnaW5Cb3R0b20oKSArIGRpc3BsYXlCb3gubWFyZ2luVG9wKCk7Ci0gICAgICAgICAgICBhdXRv
IG1hcmdpbk9mZnNldCA9IG5vbkNvbGxhcHNlZE1hcmdpbiAtIGNvbGxhcHNlZE1hcmdpbjsKLSAg
ICAgICAgICAgIC8vIE1vdmUgdGhlIGJveCB0byB0aGUgcG9zaXRpb24gd2hlcmUgaXQgd291bGQg
YmUgd2l0aCBub24tY29sbGFwc2VkIG1hcmdpbnMuCi0gICAgICAgICAgICByb290UmVsYXRpdmVU
b3AgKz0gbWFyZ2luT2Zmc2V0OwotCi0gICAgICAgICAgICAvLyBIYXZpbmcgbmVnYXRpdmUgY2xl
YXJhbmNlIGlzIGFsc28gbm9ybWFsLiBJdCBqdXN0IG1lYW5zIHRoYXQgdGhlIGJveCB3aXRoIHRo
ZSBub24tY29sbGFwc2VkIG1hcmdpbnMgaXMgbm93IGxvd2VyIHRoYW4gaXQgbmVlZHMgdG8gYmUu
Ci0gICAgICAgICAgICBjbGVhcmFuY2UgLT0gbWFyZ2luT2Zmc2V0OwotICAgICAgICB9Ci0gICAg
ICAgIC8vIE5vdyBhZGp1c3QgdGhlIGJveCdzIHBvc2l0aW9uIHdpdGggdGhlIGNsZWFyYW5jZS4K
LSAgICAgICAgcm9vdFJlbGF0aXZlVG9wICs9IGNsZWFyYW5jZTsKLSAgICAgICAgQVNTRVJUKCpm
bG9hdEJvdHRvbSA9PSByb290UmVsYXRpdmVUb3ApOwotCi0gICAgICAgIC8vIFRoZSByZXR1cm4g
dmVydGljYWwgcG9zaXRpb24gaXMgaW4gdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBjb29yZGluYXRl
IHN5c3RlbS4KLSAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tSb290UmVsYXRpdmVUb3AgPSBG
b3JtYXR0aW5nQ29udGV4dDo6bWFwVG9wTGVmdFRvQW5jZXN0b3IobGF5b3V0Q29udGV4dCwgKmxh
eW91dEJveC5jb250YWluaW5nQmxvY2soKSwgZG93bmNhc3Q8Q29udGFpbmVyPihtX2Zsb2F0aW5n
U3RhdGUucm9vdCgpKSkueTsKLSAgICAgICAgcmV0dXJuIHJvb3RSZWxhdGl2ZVRvcCAtIGNvbnRh
aW5pbmdCbG9ja1Jvb3RSZWxhdGl2ZVRvcDsKLSAgICB9OwotCi0gICAgYXV0byBjbGVhciA9IGxh
eW91dEJveC5zdHlsZSgpLmNsZWFyKCk7Ci0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHRSb290
ID0gbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpOwotCi0gICAgaWYgKGNsZWFyID09
IENsZWFyOjpMZWZ0KQotICAgICAgICByZXR1cm4gYm90dG9tKG1fZmxvYXRpbmdTdGF0ZS5sZWZ0
Qm90dG9tKGZvcm1hdHRpbmdDb250ZXh0Um9vdCkpOwotCi0gICAgaWYgKGNsZWFyID09IENsZWFy
OjpSaWdodCkKLSAgICAgICAgcmV0dXJuIGJvdHRvbShtX2Zsb2F0aW5nU3RhdGUucmlnaHRCb3R0
b20oZm9ybWF0dGluZ0NvbnRleHRSb290KSk7Ci0KLSAgICBpZiAoY2xlYXIgPT0gQ2xlYXI6OkJv
dGgpCi0gICAgICAgIHJldHVybiBib3R0b20obV9mbG9hdGluZ1N0YXRlLmJvdHRvbShmb3JtYXR0
aW5nQ29udGV4dFJvb3QpKTsKLQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVy
biB7IH07Ci19Ci0KLVBvc2l0aW9uIEZsb2F0aW5nQ29udGV4dDo6ZmxvYXRpbmdQb3NpdGlvbihj
b25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mIGZsb2F0SXRlbSkgY29uc3QKLXsKLSAgICBh
dXRvIGluaXRpYWxWZXJ0aWNhbFBvc2l0aW9uID0gdGhpcy0+aW5pdGlhbFZlcnRpY2FsUG9zaXRp
b24oZmxvYXRJdGVtKTsKLSAgICBhdXRvJiBkaXNwbGF5Qm94ID0gZmxvYXRJdGVtLmRpc3BsYXlC
b3goKTsKLSAgICBhdXRvIG1hcmdpbkJveFNpemUgPSBkaXNwbGF5Qm94Lm1hcmdpbkJveCgpLnNp
emUoKTsKLQotICAgIGF1dG8gZW5kID0gTGF5b3V0OjplbmQobV9mbG9hdGluZ1N0YXRlKTsKLSAg
ICBhdXRvIHRvcCA9IGluaXRpYWxWZXJ0aWNhbFBvc2l0aW9uOwotICAgIGF1dG8gYm90dG9tTW9z
dCA9IHRvcDsKLSAgICBmb3IgKGF1dG8gaXRlcmF0b3IgPSBiZWdpbihtX2Zsb2F0aW5nU3RhdGUs
IGluaXRpYWxWZXJ0aWNhbFBvc2l0aW9uKTsgaXRlcmF0b3IgIT0gZW5kOyArK2l0ZXJhdG9yKSB7
Ci0gICAgICAgIEFTU0VSVCghKCppdGVyYXRvcikuaXNFbXB0eSgpKTsKLQotICAgICAgICBhdXRv
IGZsb2F0cyA9ICppdGVyYXRvcjsKLSAgICAgICAgdG9wID0gZmxvYXRzLnZlcnRpY2FsUG9zaXRp
b24oKTsKLQotICAgICAgICAvLyBNb3ZlIHRoZSBib3ggaG9yaXpvbnRhbGx5IHNvIHRoYXQgaXQg
YWxpZ25zIHdpdGggdGhlIGN1cnJlbnQgZmxvYXRpbmcgcGFpci4KLSAgICAgICAgYXV0byBsZWZ0
ID0gYWxpZ25XaXRoRmxvYXRpbmdzKGZsb2F0cywgZmxvYXRJdGVtKTsKLSAgICAgICAgLy8gQ2hl
Y2sgaWYgdGhlIGJveCBmaXRzIGF0IHRoaXMgdmVydGljYWwgcG9zaXRpb24uCi0gICAgICAgIGlm
ICghZmxvYXRzLmludGVyc2VjdHMoeyB0b3AsIGxlZnQsIG1hcmdpbkJveFNpemUud2lkdGgoKSwg
bWFyZ2luQm94U2l6ZS5oZWlnaHQoKSB9KSkKLSAgICAgICAgICAgIHJldHVybiB7IGxlZnQgKyBk
aXNwbGF5Qm94Lm1hcmdpbkxlZnQoKSwgdG9wICsgZGlzcGxheUJveC5tYXJnaW5Ub3AoKSB9Owot
Ci0gICAgICAgIGJvdHRvbU1vc3QgPSBmbG9hdHMuYm90dG9tKCk7Ci0gICAgICAgIC8vIE1vdmUg
dG8gdGhlIG5leHQgZmxvYXRpbmcgcGFpci4KLSAgICB9Ci0KLSAgICAvLyBQYXNzZWQgYWxsIHRo
ZSBmbG9hdHMgYW5kIHN0aWxsIGRvZXMgbm90IGZpdD8KLSAgICByZXR1cm4geyBhbGlnbldpdGhD
b250YWluaW5nQmxvY2soZmxvYXRJdGVtKSArIGRpc3BsYXlCb3gubWFyZ2luTGVmdCgpLCBib3R0
b21Nb3N0ICsgZGlzcGxheUJveC5tYXJnaW5Ub3AoKSB9OwotfQotCi1MYXlvdXRVbml0IEZsb2F0
aW5nQ29udGV4dDo6aW5pdGlhbFZlcnRpY2FsUG9zaXRpb24oY29uc3QgRmxvYXRpbmdTdGF0ZTo6
RmxvYXRJdGVtJiBmbG9hdEl0ZW0pIGNvbnN0Ci17Ci0gICAgLy8gSW5jb21pbmcgZmxvYXRpbmcg
Y2Fubm90IGJlIHBsYWNlZCBoaWdoZXIgdGhhbiBleGlzdGluZyBmbG9hdHMuCi0gICAgLy8gVGFr
ZSB0aGUgc3RhdGljIHBvc2l0aW9uICh3aGVyZSB0aGUgYm94IHdvdWxkIGdvIGlmIGl0IHdhc24n
dCBmbG9hdGluZykgYW5kIGFkanVzdCBpdCB3aXRoIHRoZSBsYXN0IGZsb2F0aW5nLgotICAgIGF1
dG8gbWFyZ2luQm94VG9wID0gZmxvYXRJdGVtLmRpc3BsYXlCb3goKS5yZWN0V2l0aE1hcmdpbigp
LnRvcCgpOwotCi0gICAgaWYgKGF1dG8gbGFzdEZsb2F0ID0gbV9mbG9hdGluZ1N0YXRlLmxhc3Qo
KSkKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KG1hcmdpbkJveFRvcCwgbGFzdEZsb2F0LT5kaXNw
bGF5Qm94KCkucmVjdFdpdGhNYXJnaW4oKS50b3AoKSk7Ci0KLSAgICByZXR1cm4gbWFyZ2luQm94
VG9wOwotfQotCi1MYXlvdXRVbml0IEZsb2F0aW5nQ29udGV4dDo6YWxpZ25XaXRoQ29udGFpbmlu
Z0Jsb2NrKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYgZmxvYXRJdGVtKSBjb25zdAot
ewotICAgIC8vIElmIHRoZXJlIGlzIG5vIGZsb2F0aW5nIHRvIGFsaWduIHdpdGgsIHB1c2ggdGhl
IGJveCB0byB0aGUgbGVmdC9yaWdodCBlZGdlIG9mIGl0cyBjb250YWluaW5nIGJsb2NrJ3MgY29u
dGVudCBib3guCi0gICAgLy8gKEVpdGhlciB0aGVyZSdzIG5vIGZsb2F0cyBhdCBhbGwgb3IgdGhp
cyBib3ggZG9lcyBub3QgZml0IGF0IGFueSB2ZXJ0aWNhbCBwb3NpdGlvbnMgd2hlcmUgdGhlIGZs
b2F0cyBhcmUuKQotICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3ggPSBmbG9hdEl0
ZW0uY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCgpOwotICAgIGF1dG8gY29udGFpbmluZ0Jsb2Nr
Q29udGVudEJveExlZnQgPSBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LmxlZnQoKSArIGNvbnRh
aW5pbmdCbG9ja0Rpc3BsYXlCb3guY29udGVudEJveExlZnQoKTsKLQotICAgIGlmIChmbG9hdEl0
ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVy
biBjb250YWluaW5nQmxvY2tDb250ZW50Qm94TGVmdDsKLQotICAgIHJldHVybiBjb250YWluaW5n
QmxvY2tDb250ZW50Qm94TGVmdCArIGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3guY29udGVudEJv
eFdpZHRoKCkgLSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpLm1hcmdpbkJveCgpLndpZHRoKCk7Ci19
Ci0KLUxheW91dFVuaXQgRmxvYXRpbmdDb250ZXh0OjphbGlnbldpdGhGbG9hdGluZ3MoY29uc3Qg
RmxvYXRpbmdQYWlyJiBmbG9hdGluZ1BhaXIsIGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRl
bSYgZmxvYXRJdGVtKSBjb25zdAotewotICAgIC8vIENvbXB1dGUgdGhlIGhvcml6b250YWwgcG9z
aXRpb24gZm9yIHRoZSBuZXcgZmxvYXRpbmcgYnkgdGFraW5nIGJvdGggdGhlIGNvbnRpbmluZyBi
bG9jayBhbmQgdGhlIGN1cnJlbnQgbGVmdC9yaWdodCBmbG9hdHMgaW50byBhY2NvdW50LgotICAg
IGF1dG8mIGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3ggPSBmbG9hdEl0ZW0uY29udGFpbmluZ0Js
b2NrRGlzcGxheUJveCgpOwotICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrQ29udGVudEJveExlZnQg
PSBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LmxlZnQoKSArIGNvbnRhaW5pbmdCbG9ja0Rpc3Bs
YXlCb3guY29udGVudEJveExlZnQoKTsKLSAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRC
b3hSaWdodCA9IGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gubGVmdCgpICsgY29udGFpbmluZ0Js
b2NrRGlzcGxheUJveC5jb250ZW50Qm94UmlnaHQoKTsKLSAgICBhdXRvIG1hcmdpbkJveFdpZHRo
ID0gZmxvYXRJdGVtLmRpc3BsYXlCb3goKS5tYXJnaW5Cb3goKS53aWR0aCgpOwotCi0gICAgYXV0
byBsZWZ0QWxpZ25lZEJveExlZnQgPSBjb250YWluaW5nQmxvY2tDb250ZW50Qm94TGVmdDsKLSAg
ICBhdXRvIHJpZ2h0QWxpZ25lZEJveExlZnQgPSBjb250YWluaW5nQmxvY2tDb250ZW50Qm94Umln
aHQgLSBtYXJnaW5Cb3hXaWR0aDsKLQotICAgIGlmIChmbG9hdGluZ1BhaXIuaXNFbXB0eSgpKSB7
Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gZmxvYXRJdGVt
LmxheW91dEJveCgpLmlzTGVmdEZsb2F0aW5nUG9zaXRpb25lZCgpID8gbGVmdEFsaWduZWRCb3hM
ZWZ0IDogcmlnaHRBbGlnbmVkQm94TGVmdDsKLSAgICB9Ci0KLSAgICBpZiAoZmxvYXRJdGVtLmxh
eW91dEJveCgpLmlzTGVmdEZsb2F0aW5nUG9zaXRpb25lZCgpKSB7Ci0gICAgICAgIGlmIChhdXRv
KiBsZWZ0RGlzcGxheUJveCA9IGZsb2F0aW5nUGFpci5sZWZ0KCkpIHsKLSAgICAgICAgICAgIGF1
dG8gbGVmdEZsb2F0aW5nQm94UmlnaHQgPSBsZWZ0RGlzcGxheUJveC0+cmVjdFdpdGhNYXJnaW4o
KS5yaWdodCgpOwotICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWluKHN0ZDo6bWF4KGxlZnRBbGln
bmVkQm94TGVmdCwgbGVmdEZsb2F0aW5nQm94UmlnaHQpLCByaWdodEFsaWduZWRCb3hMZWZ0KTsK
LSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxlZnRBbGlnbmVkQm94TGVmdDsK
LSAgICB9Ci0KLSAgICBBU1NFUlQoZmxvYXRJdGVtLmxheW91dEJveCgpLmlzUmlnaHRGbG9hdGlu
Z1Bvc2l0aW9uZWQoKSk7Ci0KLSAgICBpZiAoYXV0byogcmlnaHREaXNwbGF5Qm94ID0gZmxvYXRp
bmdQYWlyLnJpZ2h0KCkpIHsKLSAgICAgICAgYXV0byByaWdodEZsb2F0aW5nQm94TGVmdCA9IHJp
Z2h0RGlzcGxheUJveC0+cmVjdFdpdGhNYXJnaW4oKS5sZWZ0KCk7Ci0gICAgICAgIHJldHVybiBz
dGQ6Om1heChzdGQ6Om1pbihyaWdodEFsaWduZWRCb3hMZWZ0LCByaWdodEZsb2F0aW5nQm94TGVm
dCAtIG1hcmdpbkJveFdpZHRoKSwgbGVmdEFsaWduZWRCb3hMZWZ0KTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gcmlnaHRBbGlnbmVkQm94TGVmdDsKLX0KLQotLy8gRklYTUU6IGZpbmQgYSBiZXR0ZXIg
cGxhY2UgZm9yIHRoaXMuCi1Qb3NpdGlvbiBGbG9hdGluZ0NvbnRleHQ6OnRvQ29udGFpbmluZ0Js
b2NrKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYgZmxvYXRJdGVtLCBQb3NpdGlvbiBw
b3NpdGlvbikgY29uc3QKLXsKLSAgICAvLyBGcm9tIGZvcm1hdHRpbmcgcm9vdCBjb29yZGluYXRl
IHN5c3RlbSBiYWNrIHRvIGNvbnRhaW5pbmcgYmxvY2sncy4KLSAgICBpZiAoJmZsb2F0SXRlbS5j
b250YWluaW5nQmxvY2soKSA9PSAmbV9mbG9hdGluZ1N0YXRlLnJvb3QoKSkKLSAgICAgICAgcmV0
dXJuIHBvc2l0aW9uOwotCi0gICAgYXV0byYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCA9IGZs
b2F0SXRlbS5jb250YWluaW5nQmxvY2tEaXNwbGF5Qm94KCk7Ci0gICAgcmV0dXJuIHsgcG9zaXRp
b24ueCAtIGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gubGVmdCgpLCBwb3NpdGlvbi55IC0gY29u
dGFpbmluZ0Jsb2NrRGlzcGxheUJveC50b3AoKSB9OwotfQotCi1GbG9hdGluZ1BhaXI6OkZsb2F0
aW5nUGFpcihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmIGZsb2F0cykKLSAgICA6IG1f
ZmxvYXRzKGZsb2F0cykKLXsKLX0KLQotY29uc3QgRGlzcGxheTo6Qm94KiBGbG9hdGluZ1BhaXI6
OmxlZnQoKSBjb25zdAotewotICAgIGlmICghbV9sZWZ0SW5kZXgpCi0gICAgICAgIHJldHVybiBu
dWxscHRyOwotCi0gICAgQVNTRVJUKG1fZmxvYXRzWyptX2xlZnRJbmRleF0ubGF5b3V0Qm94KCku
aXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpOwotICAgIHJldHVybiAmbV9mbG9hdHNbKm1fbGVm
dEluZGV4XS5kaXNwbGF5Qm94KCk7Ci19Ci0KLWNvbnN0IERpc3BsYXk6OkJveCogRmxvYXRpbmdQ
YWlyOjpyaWdodCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3JpZ2h0SW5kZXgpCi0gICAgICAgIHJl
dHVybiBudWxscHRyOwotCi0gICAgQVNTRVJUKG1fZmxvYXRzWyptX3JpZ2h0SW5kZXhdLmxheW91
dEJveCgpLmlzUmlnaHRGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7Ci0gICAgcmV0dXJuICZtX2Zsb2F0
c1sqbV9yaWdodEluZGV4XS5kaXNwbGF5Qm94KCk7Ci19Ci0KLWJvb2wgRmxvYXRpbmdQYWlyOjpp
bnRlcnNlY3RzKGNvbnN0IERpc3BsYXk6OkJveDo6UmVjdCYgY2FuZGlkYXRlUmVjdCkgY29uc3QK
LXsKLSAgICBhdXRvIGludGVyc2VjdHMgPSBbJl0oY29uc3QgRGlzcGxheTo6Qm94KiBmbG9hdGlu
ZywgRmxvYXQgZmxvYXRpbmdUeXBlKSB7Ci0gICAgICAgIGlmICghZmxvYXRpbmcpCi0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgYXV0byBtYXJnaW5SZWN0ID0gZmxvYXRpbmct
PnJlY3RXaXRoTWFyZ2luKCk7Ci0gICAgICAgIC8vIEJlZm9yZSBpbnRlcnNlY3RpbmcsIGNoZWNr
IGlmIHRoZSBjYW5kaWRhdGUgcG9zaXRpb24gaXMgdG9vIGZhciB0byB0aGUgbGVmdC9yaWdodC4K
LSAgICAgICAgLy8gVGhlIG5ldyBmbG9hdCdzIGNvbnRhaW5pbmcgYmxvY2sgY291bGQgcHVzaCB0
aGUgY2FuZGlkYXRlIHBvc2l0aW9uIGJleW9uZCB0aGUgY3VycmVudCBmbG9hdCBob3Jpem9udGFs
bHkuCi0gICAgICAgIGlmICgoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpMZWZ0ICYmIGNhbmRpZGF0
ZVJlY3QubGVmdCgpIDwgbWFyZ2luUmVjdC5yaWdodCgpKQotICAgICAgICAgICAgfHwgKGZsb2F0
aW5nVHlwZSA9PSBGbG9hdDo6UmlnaHQgJiYgY2FuZGlkYXRlUmVjdC5yaWdodCgpID4gbWFyZ2lu
UmVjdC5sZWZ0KCkpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBt
YXJnaW5SZWN0LmludGVyc2VjdHMoY2FuZGlkYXRlUmVjdCk7Ci0gICAgfTsKLQotICAgIGlmICgh
bV9sZWZ0SW5kZXggJiYgIW1fcmlnaHRJbmRleCkgewotICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChpbnRlcnNlY3Rz
KGxlZnQoKSwgRmxvYXQ6OkxlZnQpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChp
bnRlcnNlY3RzKHJpZ2h0KCksIEZsb2F0OjpSaWdodCkpCi0gICAgICAgIHJldHVybiB0cnVlOwot
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEZsb2F0aW5nUGFpcjo6b3BlcmF0b3IgPT0o
Y29uc3QgRmxvYXRpbmdQYWlyJiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gbV9sZWZ0SW5k
ZXggPT0gb3RoZXIubV9sZWZ0SW5kZXggJiYgbV9yaWdodEluZGV4ID09IG90aGVyLm1fcmlnaHRJ
bmRleDsKLX0KLQotTGF5b3V0VW5pdCBGbG9hdGluZ1BhaXI6OmJvdHRvbSgpIGNvbnN0Ci17Ci0g
ICAgYXV0byogbGVmdCA9IHRoaXMtPmxlZnQoKTsKLSAgICBhdXRvKiByaWdodCA9IHRoaXMtPnJp
Z2h0KCk7Ci0gICAgQVNTRVJUKGxlZnQgfHwgcmlnaHQpOwotCi0gICAgYXV0byBsZWZ0Qm90dG9t
ID0gbGVmdCA/IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4obGVmdC0+cmVjdFdpdGhNYXJnaW4o
KS5ib3R0b20oKSkgOiBzdGQ6Om51bGxvcHQ7Ci0gICAgYXV0byByaWdodEJvdHRvbSA9IHJpZ2h0
ID8gc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PihyaWdodC0+cmVjdFdpdGhNYXJnaW4oKS5ib3R0
b20oKSkgOiBzdGQ6Om51bGxvcHQ7Ci0KLSAgICBpZiAobGVmdEJvdHRvbSAmJiByaWdodEJvdHRv
bSkKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KCpsZWZ0Qm90dG9tLCAqcmlnaHRCb3R0b20pOwot
Ci0gICAgaWYgKGxlZnRCb3R0b20pCi0gICAgICAgIHJldHVybiAqbGVmdEJvdHRvbTsKLQotICAg
IHJldHVybiAqcmlnaHRCb3R0b207Ci19Ci0KLUl0ZXJhdG9yOjpJdGVyYXRvcihjb25zdCBGbG9h
dGluZ1N0YXRlOjpGbG9hdExpc3QmIGZsb2F0cywgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiB2
ZXJ0aWNhbFBvc2l0aW9uKQotICAgIDogbV9mbG9hdHMoZmxvYXRzKQotICAgICwgbV9jdXJyZW50
KGZsb2F0cykKLXsKLSAgICBpZiAodmVydGljYWxQb3NpdGlvbikKLSAgICAgICAgc2V0KCp2ZXJ0
aWNhbFBvc2l0aW9uKTsKLX0KLQotaW5saW5lIHN0YXRpYyBzdGQ6Om9wdGlvbmFsPHVuc2lnbmVk
PiBwcmV2aW91c0Zsb2F0aW5nSW5kZXgoRmxvYXQgZmxvYXRpbmdUeXBlLCBjb25zdCBGbG9hdGlu
Z1N0YXRlOjpGbG9hdExpc3QmIGZsb2F0cywgdW5zaWduZWQgY3VycmVudEluZGV4KQotewotICAg
IFJFTEVBU0VfQVNTRVJUKGN1cnJlbnRJbmRleCA8PSBmbG9hdHMuc2l6ZSgpKTsKLQotICAgIHdo
aWxlIChjdXJyZW50SW5kZXgpIHsKLSAgICAgICAgYXV0byYgZmxvYXRpbmcgPSBmbG9hdHNbLS1j
dXJyZW50SW5kZXhdLmxheW91dEJveCgpOwotICAgICAgICBpZiAoKGZsb2F0aW5nVHlwZSA9PSBG
bG9hdDo6TGVmdCAmJiBmbG9hdGluZy5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSkgfHwgKGZs
b2F0aW5nVHlwZSA9PSBGbG9hdDo6UmlnaHQgJiYgZmxvYXRpbmcuaXNSaWdodEZsb2F0aW5nUG9z
aXRpb25lZCgpKSkKLSAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7Ci0gICAgfQotCi0g
ICAgcmV0dXJuIHsgfTsKLX0KLQotSXRlcmF0b3ImIEl0ZXJhdG9yOjpvcGVyYXRvcisrKCkKLXsK
LSAgICBpZiAobV9jdXJyZW50LmlzRW1wdHkoKSkgewotICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIGF1dG8gZmluZFByZXZp
b3VzRmxvYXRpbmdXaXRoTG93ZXJCb3R0b20gPSBbJl0oRmxvYXQgZmxvYXRpbmdUeXBlLCB1bnNp
Z25lZCBjdXJyZW50SW5kZXgpIC0+IHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IHsKLQotICAgICAg
ICBSRUxFQVNFX0FTU0VSVChjdXJyZW50SW5kZXggPCBtX2Zsb2F0cy5zaXplKCkpOwotCi0gICAg
ICAgIC8vIExhc3QgZmxvYXRpbmc/IFRoZXJlJ3MgY2VydGFpbmx5IG5vIHByZXZpb3VzIGZsb2F0
aW5nIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgIGlmICghY3VycmVudEluZGV4KQotICAgICAgICAg
ICAgcmV0dXJuIHsgfTsKLQotICAgICAgICBhdXRvIGN1cnJlbnRCb3R0b20gPSBtX2Zsb2F0c1tj
dXJyZW50SW5kZXhdLmRpc3BsYXlCb3goKS5yZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgpOwotCi0g
ICAgICAgIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IGluZGV4ID0gY3VycmVudEluZGV4OwotICAg
ICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaW5kZXggPSBwcmV2aW91c0Zsb2F0aW5n
SW5kZXgoZmxvYXRpbmdUeXBlLCBtX2Zsb2F0cywgKmluZGV4KTsKLSAgICAgICAgICAgIGlmICgh
aW5kZXgpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgICAgICAgICAgaWYgKG1f
ZmxvYXRzWyppbmRleF0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCkuYm90dG9tKCkgPiBj
dXJyZW50Qm90dG9tKQotICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgfQot
Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4geyB9OwotICAg
IH07Ci0KLSAgICAvLyAxLiBUYWtlIHRoZSBjdXJyZW50IGZsb2F0aW5nIGZyb20gbGVmdCBhbmQg
cmlnaHQgYW5kIGNoZWNrIHdoaWNoIG9uZSdzIGJvdHRvbSBlZGdlIGlzIHBvc2l0aW9uZWQgaGln
aGVyICh0aGV5IGNvdWxkIGJlIG9uIHRoZSBzYW1lIHZlcnRpY2FsIHBvc2l0aW9uIHRvbykuCi0g
ICAgLy8gVGhlIGN1cnJlbnQgZmxvYXRzIGZyb20gbGVmdCBhbmQgcmlnaHQgYXJlIGNvbnNpZGVy
ZWQgdGhlIGlubmVyLW1vc3QgcGFpciBmb3IgdGhlIGN1cnJlbnQgdmVydGljYWwgcG9zaXRpb24u
Ci0gICAgLy8gMi4gTW92ZSBhd2F5IGZyb20gaW5uZXItbW9zdCBwYWlyIGJ5IHBpY2tpbmcgb25l
IG9mIHRoZSBwcmV2aW91cyBmbG9hdHMgaW4gdGhlIGxpc3QoIzEpCi0gICAgLy8gRW5zdXJlIHRo
YXQgdGhlIG5ldyBmbG9hdGluZydzIGJvdHRvbSBlZGdlIGlzIHBvc2l0aW9uZWQgbG93ZXIgdGhh
biB0aGUgY3VycmVudCBvbmUgLXdoaWNoIGVzc2VudGlhbGx5IG1lYW5zIHNraXBwaW5nIGluLWJl
dHdlZW4gZmxvYXRzIHRoYXQgYXJlIHBvc2l0aW9uZWQgaGlnaGVyKS4KLSAgICAvLyAzLiBSZXNl
dCB0aGUgdmVydGljYWwgcG9zaXRpb24gYW5kIGFsaWduIGl0IHdpdGggdGhlIG5ldyBsZWZ0LXJp
Z2h0IHBhaXIuIFRoZXNlIGZsb2F0cyBhcmUgbm93IHRoZSBpbm5lci1tb3N0IGJveGVzIGZvciB0
aGUgY3VycmVudCB2ZXJ0aWNhbCBwb3NpdGlvbi4KLSAgICAvLyBBcyB0aGUgcmVzdWx0IHdlIGhh
dmUgbW9yZSBob3Jpem9udGFsIHNwYWNlIG9uIHRoZSBjdXJyZW50IHZlcnRpY2FsIHBvc2l0aW9u
LgotICAgIGF1dG8gbGVmdEJvdHRvbSA9IG1fY3VycmVudC5sZWZ0KCkgPyBzdGQ6Om9wdGlvbmFs
PExheW91dFVuaXQ+KG1fY3VycmVudC5sZWZ0KCktPmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsK
LSAgICBhdXRvIHJpZ2h0Qm90dG9tID0gbV9jdXJyZW50LnJpZ2h0KCkgPyBzdGQ6Om9wdGlvbmFs
PExheW91dFVuaXQ+KG1fY3VycmVudC5yaWdodCgpLT5ib3R0b20oKSkgOiBzdGQ6Om51bGxvcHQ7
Ci0KLSAgICBhdXRvIHVwZGF0ZUxlZnQgPSAobGVmdEJvdHRvbSA9PSByaWdodEJvdHRvbSkgfHwg
KCFyaWdodEJvdHRvbSB8fCAobGVmdEJvdHRvbSAmJiBsZWZ0Qm90dG9tIDwgcmlnaHRCb3R0b20p
KTsgCi0gICAgYXV0byB1cGRhdGVSaWdodCA9IChsZWZ0Qm90dG9tID09IHJpZ2h0Qm90dG9tKSB8
fCAoIWxlZnRCb3R0b20gfHwgKHJpZ2h0Qm90dG9tICYmIGxlZnRCb3R0b20gPiByaWdodEJvdHRv
bSkpOyAKLQotICAgIGlmICh1cGRhdGVMZWZ0KSB7Ci0gICAgICAgIEFTU0VSVChtX2N1cnJlbnQu
bV9sZWZ0SW5kZXgpOwotICAgICAgICBtX2N1cnJlbnQubV92ZXJ0aWNhbFBvc2l0aW9uID0gKmxl
ZnRCb3R0b207Ci0gICAgICAgIG1fY3VycmVudC5tX2xlZnRJbmRleCA9IGZpbmRQcmV2aW91c0Zs
b2F0aW5nV2l0aExvd2VyQm90dG9tKEZsb2F0OjpMZWZ0LCAqbV9jdXJyZW50Lm1fbGVmdEluZGV4
KTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHVwZGF0ZVJpZ2h0KSB7Ci0gICAgICAgIEFTU0VSVCht
X2N1cnJlbnQubV9yaWdodEluZGV4KTsKLSAgICAgICAgbV9jdXJyZW50Lm1fdmVydGljYWxQb3Np
dGlvbiA9ICpyaWdodEJvdHRvbTsKLSAgICAgICAgbV9jdXJyZW50Lm1fcmlnaHRJbmRleCA9IGZp
bmRQcmV2aW91c0Zsb2F0aW5nV2l0aExvd2VyQm90dG9tKEZsb2F0OjpSaWdodCwgKm1fY3VycmVu
dC5tX3JpZ2h0SW5kZXgpOwotICAgIH0KLQotICAgIHJldHVybiAqdGhpczsKLX0KLQotdm9pZCBJ
dGVyYXRvcjo6c2V0KExheW91dFVuaXQgdmVydGljYWxQb3NpdGlvbikKLXsKLSAgICAvLyBNb3Zl
IHRoZSBpdGVyYXRvciB0byB0aGUgaW5pdGlhbCB2ZXJ0aWNhbCBwb3NpdGlvbiBieSBzdGFydGlu
ZyBhdCB0aGUgaW5uZXItbW9zdCBmbG9hdGluZyBwYWlyIChsYXN0IGZsb2F0cyBvbiBsZWZ0L3Jp
Z2h0KS4KLSAgICAvLyAxLiBDaGVjayBpZiB0aGUgaW5uZXItbW9zdCBwYWlyIGNvdmVycyB0aGUg
dmVydGljYWwgcG9zaXRpb24uCi0gICAgLy8gMi4gTW92ZSBvdXR3YXJkcyBmcm9tIHRoZSBpbm5l
ci1tb3N0IHBhaXIgdW50aWwgdGhlIHZlcnRpY2FsIHBvc3Rpb24gaW50ZXJzZWN0cy4KLSAgICAv
LyAoTm90ZSB0aGF0IHZlcnRpY2FsUG9zaXRpb24gaGFzIGFscmVhZHkgYmVlbiBhZGp1c3RlZCB3
aXRoIHRoZSB0b3Agb2YgdGhlIGxhc3QgZmxvYXQuKQotCi0gICAgbV9jdXJyZW50Lm1fdmVydGlj
YWxQb3NpdGlvbiA9IHZlcnRpY2FsUG9zaXRpb247Ci0gICAgLy8gTm8gZmxvYXRzIGF0IGFsbD8K
LSAgICBpZiAobV9mbG9hdHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotCi0gICAgICAgIG1fY3VycmVudC5tX2xlZnRJbmRleCA9IHsgfTsKLSAgICAgICAgbV9j
dXJyZW50Lm1fcmlnaHRJbmRleCA9IHsgfTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IGF1dG8gZmluZEZsb2F0aW5nQmVsb3cgPSBbJl0oRmxvYXQgZmxvYXRpbmdUeXBlKSAtPiBzdGQ6
Om9wdGlvbmFsPHVuc2lnbmVkPiB7Ci0KLSAgICAgICAgQVNTRVJUKCFtX2Zsb2F0cy5pc0VtcHR5
KCkpOwotCi0gICAgICAgIGF1dG8gaW5kZXggPSBmbG9hdGluZ1R5cGUgPT0gRmxvYXQ6OkxlZnQg
PyBtX2N1cnJlbnQubV9sZWZ0SW5kZXggOiBtX2N1cnJlbnQubV9yaWdodEluZGV4OwotICAgICAg
ICAvLyBTdGFydCBmcm9tIHRoZSBlbmQgaWYgd2UgZG9uJ3QgaGF2ZSBjdXJyZW50IHlldC4KLSAg
ICAgICAgaW5kZXggPSBpbmRleC52YWx1ZV9vcihtX2Zsb2F0cy5zaXplKCkpOwotICAgICAgICB3
aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaW5kZXggPSBwcmV2aW91c0Zsb2F0aW5nSW5kZXgo
ZmxvYXRpbmdUeXBlLCBtX2Zsb2F0cywgKmluZGV4KTsKLSAgICAgICAgICAgIGlmICghaW5kZXgp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgICAgICAgICAgYXV0byBib3R0b20g
PSBtX2Zsb2F0c1sqaW5kZXhdLmRpc3BsYXlCb3goKS5yZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgp
OwotICAgICAgICAgICAgLy8gSXMgdGhpcyBmbG9hdGluZyBpbnRydXNpdmUgb24gdGhpcyBwb3Np
dGlvbj8KLSAgICAgICAgICAgIGlmIChib3R0b20gPiB2ZXJ0aWNhbFBvc2l0aW9uKQotICAgICAg
ICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB7IH07
Ci0gICAgfTsKLQotICAgIG1fY3VycmVudC5tX2xlZnRJbmRleCA9IGZpbmRGbG9hdGluZ0JlbG93
KEZsb2F0OjpMZWZ0KTsKLSAgICBtX2N1cnJlbnQubV9yaWdodEluZGV4ID0gZmluZEZsb2F0aW5n
QmVsb3coRmxvYXQ6OlJpZ2h0KTsKLQotICAgIEFTU0VSVCghbV9jdXJyZW50Lm1fbGVmdEluZGV4
IHx8ICgqbV9jdXJyZW50Lm1fbGVmdEluZGV4IDwgbV9mbG9hdHMuc2l6ZSgpICYmIG1fZmxvYXRz
WyptX2N1cnJlbnQubV9sZWZ0SW5kZXhdLmxheW91dEJveCgpLmlzTGVmdEZsb2F0aW5nUG9zaXRp
b25lZCgpKSk7Ci0gICAgQVNTRVJUKCFtX2N1cnJlbnQubV9yaWdodEluZGV4IHx8ICgqbV9jdXJy
ZW50Lm1fcmlnaHRJbmRleCA8IG1fZmxvYXRzLnNpemUoKSAmJiBtX2Zsb2F0c1sqbV9jdXJyZW50
Lm1fcmlnaHRJbmRleF0ubGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgpKSk7
Ci19Ci0KLWJvb2wgSXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3ImIG90aGVyKSBj
b25zdAotewotICAgIHJldHVybiBtX2N1cnJlbnQgPT0gb3RoZXIubV9jdXJyZW50OwotfQotCi1i
b29sIEl0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikgY29uc3QKLXsK
LSAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nQ29udGV4dC5oIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L0Zsb2F0aW5nQ29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCBkOTAzYTkzZGEzMzJjNjIyYmQ1YzdhM2Y0NzIzZjEyZmE5NTY5NmE5Li4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9GbG9hdGluZ0NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
LSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05U
RVhUKQotCi0jaW5jbHVkZSAiRmxvYXRpbmdTdGF0ZS5oIgotI2luY2x1ZGUgIkxheW91dFVuaXRz
LmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0K
LW5hbWVzcGFjZSBMYXlvdXQgewotCi1jbGFzcyBCb3g7Ci1jbGFzcyBDb250YWluZXI7Ci1jbGFz
cyBGbG9hdGluZ1BhaXI7Ci1jbGFzcyBMYXlvdXRDb250ZXh0OwotCi0vLyBGbG9hdGluZ0NvbnRl
eHQgaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdGluZyB0aGUgcG9zaXRpb24gb2YgYSBib3ggaW4g
dGhlIGN1cnJlbnQgZm9ybWF0dGluZyBjb250ZXh0Ci0vLyBieSB0YWtpbmcgdGhlIGZsb2F0aW5n
IGJveGVzIGludG8gYWNjb3VudC4KLWNsYXNzIEZsb2F0aW5nQ29udGV4dCB7Ci0gICAgV1RGX01B
S0VfSVNPX0FMTE9DQVRFRChGbG9hdGluZ0NvbnRleHQpOwotcHVibGljOgotICAgIEZsb2F0aW5n
Q29udGV4dChGbG9hdGluZ1N0YXRlJik7Ci0KLSAgICBGbG9hdGluZ1N0YXRlJiBmbG9hdGluZ1N0
YXRlKCkgY29uc3QgeyByZXR1cm4gbV9mbG9hdGluZ1N0YXRlOyB9Ci0KLSAgICBQb3NpdGlvbiBw
b3NpdGlvbkZvckZsb2F0KGNvbnN0IEJveCYpIGNvbnN0OwotICAgIHN0ZDo6b3B0aW9uYWw8TGF5
b3V0VW5pdD4gdmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UoY29uc3QgQm94JikgY29uc3Q7
Ci0KLXByaXZhdGU6Ci0gICAgTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCgpIGNvbnN0IHsg
cmV0dXJuIG1fZmxvYXRpbmdTdGF0ZS5sYXlvdXRDb250ZXh0KCk7IH0KLQotICAgIFBvc2l0aW9u
IGZsb2F0aW5nUG9zaXRpb24oY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJikgY29uc3Q7
Ci0KLSAgICBMYXlvdXRVbml0IGluaXRpYWxWZXJ0aWNhbFBvc2l0aW9uKGNvbnN0IEZsb2F0aW5n
U3RhdGU6OkZsb2F0SXRlbSYpIGNvbnN0OwotICAgIExheW91dFVuaXQgYWxpZ25XaXRoQ29udGFp
bmluZ0Jsb2NrKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYpIGNvbnN0OwotICAgIExh
eW91dFVuaXQgYWxpZ25XaXRoRmxvYXRpbmdzKGNvbnN0IEZsb2F0aW5nUGFpciYsIGNvbnN0IEZs
b2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYpIGNvbnN0OwotICAgIFBvc2l0aW9uIHRvQ29udGFpbmlu
Z0Jsb2NrKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYsIFBvc2l0aW9uKSBjb25zdDsK
LQotICAgIEZsb2F0aW5nU3RhdGUmIG1fZmxvYXRpbmdTdGF0ZTsKLX07Ci0KLX0KLX0KLSNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nU3RhdGUuY3BwIGIv
U291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nU3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCA0MWQzZWNlZGNiZjUzYTMwMGM4ZjE5NWI5OTFkMzQ1YjZmZGJlMDA4Li4w
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9GbG9hdGluZ1N0YXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkZsb2F0aW5n
U3RhdGUuaCIKLQotI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQotCi0jaW5j
bHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJMYXlvdXRCb3guaCIKLSNpbmNs
dWRlICJMYXlvdXRDb250ZXh0LmgiCi0jaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4K
LQotbmFtZXNwYWNlIFdlYkNvcmUgewotbmFtZXNwYWNlIExheW91dCB7Ci0KLVdURl9NQUtFX0lT
T19BTExPQ0FURURfSU1QTChGbG9hdGluZ1N0YXRlKTsKLQotRmxvYXRpbmdTdGF0ZTo6RmxvYXRJ
dGVtOjpGbG9hdEl0ZW0oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEZsb2F0aW5nU3RhdGUm
IGZsb2F0aW5nU3RhdGUpCi0gICAgOiBtX2xheW91dEJveChtYWtlV2Vha1B0cihjb25zdF9jYXN0
PEJveCY+KGxheW91dEJveCkpKQotICAgICwgbV9jb250YWluaW5nQmxvY2sobWFrZVdlYWtQdHIo
Y29uc3RfY2FzdDxDb250YWluZXImPigqbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpKSkpCi0g
ICAgLCBtX2Fic29sdXRlRGlzcGxheUJveChGb3JtYXR0aW5nQ29udGV4dDo6bWFwQm94VG9BbmNl
c3RvcihmbG9hdGluZ1N0YXRlLmxheW91dENvbnRleHQoKSwgbGF5b3V0Qm94LCBkb3duY2FzdDxD
b250YWluZXI+KGZsb2F0aW5nU3RhdGUucm9vdCgpKSkpCi0gICAgLCBtX2NvbnRhaW5pbmdCbG9j
a0Fic29sdXRlRGlzcGxheUJveChGb3JtYXR0aW5nQ29udGV4dDo6bWFwQm94VG9BbmNlc3Rvcihm
bG9hdGluZ1N0YXRlLmxheW91dENvbnRleHQoKSwgKm1fY29udGFpbmluZ0Jsb2NrLCBkb3duY2Fz
dDxDb250YWluZXI+KGZsb2F0aW5nU3RhdGUucm9vdCgpKSkpCi17Ci19Ci0KLUZsb2F0aW5nU3Rh
dGU6OkZsb2F0aW5nU3RhdGUoTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCwgY29uc3QgQm94
JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpCi0gICAgOiBtX2xheW91dENvbnRleHQobGF5b3V0Q29u
dGV4dCkKLSAgICAsIG1fZm9ybWF0dGluZ0NvbnRleHRSb290KG1ha2VXZWFrUHRyKGNvbnN0X2Nh
c3Q8Qm94Jj4oZm9ybWF0dGluZ0NvbnRleHRSb290KSkpCi17Ci19Ci0KLSNpZm5kZWYgTkRFQlVH
Ci1zdGF0aWMgYm9vbCBiZWxvbmdzVG9UaGlzRmxvYXRpbmdDb250ZXh0KGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBjb25zdCBCb3gmIGZsb2F0aW5nU3RhdGVSb290KQotewotICAgIGF1dG8mIGZvcm1h
dHRpbmdDb250ZXh0Um9vdCA9IGxheW91dEJveC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKLSAg
ICBpZiAoJmZvcm1hdHRpbmdDb250ZXh0Um9vdCA9PSAmZmxvYXRpbmdTdGF0ZVJvb3QpCi0gICAg
ICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gTWF5YmUgdGhlIGxheW91dCBib3ggYmVsb25ncyB0
byBhbiBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0IHRoYXQgaW5oZXJpdHMgdGhlIGZsb2F0aW5n
IHN0YXRlIGZyb20gdGhlIHBhcmVudCAoYmxvY2spIGZvcm1hdHRpbmcgY29udGV4dC4gCi0gICAg
aWYgKCFmb3JtYXR0aW5nQ29udGV4dFJvb3QuZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gJmZvcm1hdHRpbmdD
b250ZXh0Um9vdC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKSA9PSAmZmxvYXRpbmdTdGF0ZVJvb3Q7
Ci19Ci0jZW5kaWYKLQotdm9pZCBGbG9hdGluZ1N0YXRlOjpyZW1vdmUoY29uc3QgQm94JiBsYXlv
dXRCb3gpCi17Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IG1fZmxvYXRzLnNp
emUoKTsgKytpbmRleCkgewotICAgICAgICBpZiAoJm1fZmxvYXRzW2luZGV4XS5sYXlvdXRCb3go
KSA9PSAmbGF5b3V0Qm94KSB7Ci0gICAgICAgICAgICBtX2Zsb2F0cy5yZW1vdmUoaW5kZXgpOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOwotfQotCi12b2lkIEZsb2F0aW5nU3RhdGU6OmFwcGVuZChjb25zdCBCb3gmIGxheW91
dEJveCkKLXsKLSAgICBBU1NFUlQoaXM8Q29udGFpbmVyPigqbV9mb3JtYXR0aW5nQ29udGV4dFJv
b3QpKTsKLSAgICBBU1NFUlQoYmVsb25nc1RvVGhpc0Zsb2F0aW5nQ29udGV4dChsYXlvdXRCb3gs
ICptX2Zvcm1hdHRpbmdDb250ZXh0Um9vdCkpOwotCi0gICAgLy8gRmxvYXRpbmcgc3RhdGUgc2hv
dWxkIGhvbGQgYm94ZXMgd2l0aCBjb21wdXRlZCBwb3NpdGlvbi9zaXplLgotICAgIEFTU0VSVCht
X2xheW91dENvbnRleHQuZGlzcGxheUJveEZvckxheW91dEJveChsYXlvdXRCb3gpKTsKLSAgICBB
U1NFUlQoaXM8Q29udGFpbmVyPigqbV9mb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsKLQotICAgIG1f
ZmxvYXRzLmFwcGVuZCh7IGxheW91dEJveCwgKnRoaXMgfSk7Ci19Ci0KLXN0ZDo6b3B0aW9uYWw8
TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6Ym90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGluZ0Nv
bnRleHRSb290LCBDbGVhciB0eXBlKSBjb25zdAotewotICAgIGlmIChtX2Zsb2F0cy5pc0VtcHR5
KCkpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAvLyBUT0RPOiBDdXJyZW50bHkgdGhpcyBp
cyBvbmx5IGNhbGxlZCBvbmNlIGZvciBlYWNoIGZvcm1hdHRpbmcgY29udGV4dCByb290IHdpdGgg
ZmxvYXRzIHBlciBsYXlvdXQuCi0gICAgLy8gQ2FjaGUgdGhlIHZhbHVlIGlmIHdlIGVuZCB1cCBj
YWxsaW5nIGl0IG1vcmUgZnJlcXVlbnRseSAoYW5kIHVwZGF0ZSBpdCBhdCBhcHBlbmQvcmVtb3Zl
KS4KLSAgICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IGJvdHRvbTsKLSAgICBmb3IgKGF1dG8m
IGZsb2F0SXRlbSA6IG1fZmxvYXRzKSB7Ci0gICAgICAgIC8vIElnbm9yZSBmbG9hdHMgZnJvbSBv
dGhlciBmb3JtYXR0aW5nIGNvbnRleHRzIHdoZW4gdGhlIGZsb2F0aW5nIHN0YXRlIGlzIGluaGVy
aXRlZC4KLSAgICAgICAgaWYgKCZmb3JtYXR0aW5nQ29udGV4dFJvb3QgIT0gJmZsb2F0SXRlbS5s
YXlvdXRCb3goKS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKSkKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotCi0gICAgICAgIGlmICgodHlwZSA9PSBDbGVhcjo6TGVmdCAmJiAhZmxvYXRJdGVtLmxheW91
dEJveCgpLmlzTGVmdEZsb2F0aW5nUG9zaXRpb25lZCgpKQotICAgICAgICAgICAgfHwgKHR5cGUg
PT0gQ2xlYXI6OlJpZ2h0ICYmICFmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5n
UG9zaXRpb25lZCgpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGF1dG8gZmxv
YXRzQm90dG9tID0gZmxvYXRJdGVtLmRpc3BsYXlCb3goKS5yZWN0V2l0aE1hcmdpbigpLmJvdHRv
bSgpOwotICAgICAgICBpZiAoYm90dG9tKSB7Ci0gICAgICAgICAgICBib3R0b20gPSBzdGQ6Om1h
eCgqYm90dG9tLCBmbG9hdHNCb3R0b20pOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
IH0KLSAgICAgICAgYm90dG9tID0gZmxvYXRzQm90dG9tOwotICAgIH0KLSAgICByZXR1cm4gYm90
dG9tOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9GbG9hdGluZ1N0YXRlLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdTdGF0ZS5o
CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTdlMmI0MjRmOGM3OWU0NDIzYWQzNjky
YmRjYTY5YzJiMTcyYjc3Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9GbG9hdGluZ1N0YXRlLmgKKysrIC9kZXYvbnVs
bApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAq
IGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5B
QkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJEaXNwbGF5Qm94Lmgi
Ci0jaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgotI2luY2x1ZGUgPHd0Zi9SZWYuaD4KLSNpbmNs
dWRlIDx3dGYvV2Vha1B0ci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLW5hbWVzcGFjZSBM
YXlvdXQgewotCi1jbGFzcyBCb3g7Ci1jbGFzcyBDb250YWluZXI7Ci1jbGFzcyBGb3JtYXR0aW5n
U3RhdGU7Ci1jbGFzcyBMYXlvdXRDb250ZXh0OwotCi0vLyBGbG9hdGluZ1N0YXRlIGhvbGRzIHRo
ZSBmbG9hdGluZyBib3hlcyBwZXIgZm9ybWF0dGluZyBjb250ZXh0LgotY2xhc3MgRmxvYXRpbmdT
dGF0ZSA6IHB1YmxpYyBSZWZDb3VudGVkPEZsb2F0aW5nU3RhdGU+IHsKLSAgICBXVEZfTUFLRV9J
U09fQUxMT0NBVEVEKEZsb2F0aW5nU3RhdGUpOwotcHVibGljOgotICAgIHN0YXRpYyBSZWY8Rmxv
YXRpbmdTdGF0ZT4gY3JlYXRlKExheW91dENvbnRleHQmIGxheW91dENvbnRleHQsIGNvbnN0IEJv
eCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSB7IHJldHVybiBhZG9wdFJlZigqbmV3IEZsb2F0aW5n
U3RhdGUobGF5b3V0Q29udGV4dCwgZm9ybWF0dGluZ0NvbnRleHRSb290KSk7IH0KLQotICAgIHZv
aWQgYXBwZW5kKGNvbnN0IEJveCYgbGF5b3V0Qm94KTsKLSAgICB2b2lkIHJlbW92ZShjb25zdCBC
b3gmIGxheW91dEJveCk7Ci0KLSAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2Zs
b2F0cy5pc0VtcHR5KCk7IH0KLQotICAgIHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gbGVmdEJv
dHRvbShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3Q7Ci0gICAgc3RkOjpv
cHRpb25hbDxMYXlvdXRVbml0PiByaWdodEJvdHRvbShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250
ZXh0Um9vdCkgY29uc3Q7Ci0gICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBib3R0b20oY29u
c3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpIGNvbnN0OwotCi0gICAgY2xhc3MgRmxvYXRJ
dGVtIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEZsb2F0SXRlbShjb25zdCBCb3gmLCBjb25zdCBG
bG9hdGluZ1N0YXRlJik7Ci0KLSAgICAgICAgY29uc3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7
IHJldHVybiAqbV9sYXlvdXRCb3g7IH0KLSAgICAgICAgY29uc3QgQ29udGFpbmVyJiBjb250YWlu
aW5nQmxvY2soKSBjb25zdCB7IHJldHVybiAqbV9jb250YWluaW5nQmxvY2s7IH0KLQotICAgICAg
ICBjb25zdCBEaXNwbGF5OjpCb3gmIGRpc3BsYXlCb3goKSBjb25zdCB7IHJldHVybiBtX2Fic29s
dXRlRGlzcGxheUJveDsgfQotICAgICAgICBjb25zdCBEaXNwbGF5OjpCb3gmIGNvbnRhaW5pbmdC
bG9ja0Rpc3BsYXlCb3goKSBjb25zdCB7IHJldHVybiBtX2NvbnRhaW5pbmdCbG9ja0Fic29sdXRl
RGlzcGxheUJveDsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgV2Vha1B0cjxCb3g+IG1fbGF5
b3V0Qm94OwotICAgICAgICBXZWFrUHRyPENvbnRhaW5lcj4gbV9jb250YWluaW5nQmxvY2s7Ci0K
LSAgICAgICAgRGlzcGxheTo6Qm94IG1fYWJzb2x1dGVEaXNwbGF5Qm94OwotICAgICAgICBEaXNw
bGF5OjpCb3ggbV9jb250YWluaW5nQmxvY2tBYnNvbHV0ZURpc3BsYXlCb3g7Ci0gICAgfTsKLSAg
ICB1c2luZyBGbG9hdExpc3QgPSBWZWN0b3I8RmxvYXRJdGVtPjsKLSAgICBjb25zdCBGbG9hdExp
c3QmIGZsb2F0cygpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRzOyB9Ci0gICAgY29uc3QgRmxvYXRJ
dGVtKiBsYXN0KCkgY29uc3QgeyByZXR1cm4gaXNFbXB0eSgpID8gbnVsbHB0ciA6ICZtX2Zsb2F0
cy5sYXN0KCk7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRmxvYXRpbmdDb250ZXh0
OwotICAgIEZsb2F0aW5nU3RhdGUoTGF5b3V0Q29udGV4dCYsIGNvbnN0IEJveCYgZm9ybWF0dGlu
Z0NvbnRleHRSb290KTsKLQotICAgIExheW91dENvbnRleHQmIGxheW91dENvbnRleHQoKSBjb25z
dCB7IHJldHVybiBtX2xheW91dENvbnRleHQ7IH0KLSAgICBjb25zdCBCb3gmIHJvb3QoKSBjb25z
dCB7IHJldHVybiAqbV9mb3JtYXR0aW5nQ29udGV4dFJvb3Q7IH0KLQotICAgIHN0ZDo6b3B0aW9u
YWw8TGF5b3V0VW5pdD4gYm90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBD
bGVhcikgY29uc3Q7Ci0KLSAgICBMYXlvdXRDb250ZXh0JiBtX2xheW91dENvbnRleHQ7Ci0gICAg
V2Vha1B0cjxCb3g+IG1fZm9ybWF0dGluZ0NvbnRleHRSb290OwotICAgIEZsb2F0TGlzdCBtX2Zs
b2F0czsKLX07Ci0KLWlubGluZSBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0aW5nU3Rh
dGU6OmxlZnRCb3R0b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpIGNvbnN0Ci17
IAotICAgIHJldHVybiBib3R0b20oZm9ybWF0dGluZ0NvbnRleHRSb290LCBDbGVhcjo6TGVmdCk7
Ci19Ci0KLWlubGluZSBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0aW5nU3RhdGU6OnJp
Z2h0Qm90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSBjb25zdAotewotICAg
IHJldHVybiBib3R0b20oZm9ybWF0dGluZ0NvbnRleHRSb290LCBDbGVhcjo6UmlnaHQpOwotfQot
Ci1pbmxpbmUgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBGbG9hdGluZ1N0YXRlOjpib3R0b20o
Y29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGJv
dHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyOjpCb3RoKTsKLX0KLQotfQotfQotI2Vu
ZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxvYXRmb3JtYXR0aW5nL0Zs
b2F0aW5nQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxvYXRmb3JtYXR0aW5n
L0Zsb2F0aW5nQ29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNGZlYWVhMjdiZTE4MGM1YzEwZjRlZDky
NThiMGFiZjQyYzM4YTc3YQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mbG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdDb250ZXh0LmNwcApAQCAtMCwwICsxLDUxNiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGbG9hdGluZ0NvbnRl
eHQuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVk
ZSAiRGlzcGxheUJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveC5oIgorI2luY2x1ZGUgIkxheW91
dENvbnRhaW5lci5oIgorI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKKyNpbmNsdWRlIDx3dGYv
SXNvTWFsbG9jSW5saW5lcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgTGF5
b3V0IHsKKworV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEZsb2F0aW5nQ29udGV4dCk7CisK
Ky8vIEZpbmRpbmcgdGhlIHRvcC9sZWZ0IHBvc2l0aW9uIGZvciBhIG5ldyBmbG9hdGluZyhGKQor
Ly8gIF9fX18gIF9fX18gIF9fX19fICAgICAgICAgICAgICAgX19fX19fXworLy8gfCAgICB8fCBM
MiB8fCAgICAgfCA8LS0tLS0xLS0tLT58ICAgICAgIHwKKy8vIHwgICAgfHxfX19ffHwgIEwzIHwg
ICAgICAgICAgICAgfCAgIFIxICB8CisvLyB8IEwxIHwgICAgICB8X19fX198ICAgICAgICAgICAg
IHwgICAgICAgfAorLy8gfF9fX198IDwtLS0tLS0tLS0tLS0tMi0tLS0tLS0tLT58ICAgICAgIHwK
Ky8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8CisvLyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19ffAorLy8KKy8vIDEuIENvbXB1dGUgdGhl
IGluaXRpYWwgdmVydGljYWwgcG9zaXRpb24gZm9yIChGKSAtPiAoMSkKKy8vIDIuIEZpbmQgdGhl
IGNvcnJlc3BvbmRpbmcgZmxvYXRpbmcgcGFpciAoTDMtUjEpCisvLyAzLiBBbGlnbiAoRikgaG9y
aXpvbnRhbGx5IHdpdGggKEwzLVIxKSBkZXBlbmRpbmcgd2hldGhlciAoRikgaXMgbGVmdC9yaWdo
dCBwb3NpdGlvbmVkCisvLyA0LiBJbnRlcnNlY3QgKEYpIHdpdGggKEwzLVIxKQorLy8gNS4gSWYg
KEYpIGRvZXMgbm90IGZpdCwgZmluZCB0aGUgbmV4dCBmbG9hdGluZyBwYWlyIChMMS1SMSkKKy8v
IDYuIFJlcGVhdCB1bnRpbCBlaXRoZXIgKEYpIGZpdHMvbm8gbW9yZSBmbG9hdHMuCisvLyBOb3Rl
IHRoYXQgYWxsIGNvb3JkaW5hdGVzIGFyZSBpbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhl
IGZvcm1hdHRpbmcgcm9vdC4KKy8vIFRoZSBmb3JtYXR0aW5nIHJvb3QgaGVyZSBpcyBhbHdheXMg
dGhlIG9uZSB0aGF0IGVzdGFibGlzaGVzIHRoZSBmbG9hdGluZyBjb250ZXh0IChzZWUgaW5oZXJp
dGVkIGZsb2F0aW5nIGNvbnRleHQpLgorLy8gKEl0IHNpbXBseSBtZWFucyB0aGF0IHRoZSBmbG9h
dCBib3gncyBmb3JtYXR0aW5nIHJvb3QgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRo
ZSBGb3JtYXR0aW5nQ29udGV4dCdzIHJvb3QuKQorCitjbGFzcyBJdGVyYXRvcjsKKworY2xhc3Mg
RmxvYXRpbmdQYWlyIHsKK3B1YmxpYzoKKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVy
biAhbV9sZWZ0SW5kZXggJiYgIW1fcmlnaHRJbmRleDsgfQorICAgIGNvbnN0IERpc3BsYXk6OkJv
eCogbGVmdCgpIGNvbnN0OworICAgIGNvbnN0IERpc3BsYXk6OkJveCogcmlnaHQoKSBjb25zdDsK
KyAgICBib29sIGludGVyc2VjdHMoY29uc3QgRGlzcGxheTo6Qm94OjpSZWN0JikgY29uc3Q7Cisg
ICAgTGF5b3V0VW5pdCB2ZXJ0aWNhbFBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV92ZXJ0aWNh
bFBvc2l0aW9uOyB9CisgICAgTGF5b3V0VW5pdCBib3R0b20oKSBjb25zdDsKKyAgICBib29sIG9w
ZXJhdG9yPT0oY29uc3QgRmxvYXRpbmdQYWlyJikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJp
ZW5kIGNsYXNzIEl0ZXJhdG9yOworICAgIEZsb2F0aW5nUGFpcihjb25zdCBGbG9hdGluZ1N0YXRl
OjpGbG9hdExpc3QmKTsKKworICAgIGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgbV9m
bG9hdHM7CisKKyAgICBzdGQ6Om9wdGlvbmFsPHVuc2lnbmVkPiBtX2xlZnRJbmRleDsKKyAgICBz
dGQ6Om9wdGlvbmFsPHVuc2lnbmVkPiBtX3JpZ2h0SW5kZXg7CisgICAgTGF5b3V0VW5pdCBtX3Zl
cnRpY2FsUG9zaXRpb247Cit9OworCitjbGFzcyBJdGVyYXRvciB7CitwdWJsaWM6CisgICAgSXRl
cmF0b3IoY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRMaXN0Jiwgc3RkOjpvcHRpb25hbDxMYXlv
dXRVbml0PiB2ZXJ0aWNhbFBvc2l0aW9uKTsKKworICAgIGNvbnN0IEZsb2F0aW5nUGFpciYgb3Bl
cmF0b3IqKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50OyB9CisgICAgSXRlcmF0b3ImIG9wZXJh
dG9yKysoKTsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3ImKSBjb25zdDsKKyAg
ICBib29sIG9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3ImKSBjb25zdDsKKworcHJpdmF0ZToKKyAg
ICB2b2lkIHNldChMYXlvdXRVbml0IHZlcnRpY2FsUG9zaXRpb24pOworCisgICAgY29uc3QgRmxv
YXRpbmdTdGF0ZTo6RmxvYXRMaXN0JiBtX2Zsb2F0czsKKyAgICBGbG9hdGluZ1BhaXIgbV9jdXJy
ZW50OworfTsKKworc3RhdGljIEl0ZXJhdG9yIGJlZ2luKGNvbnN0IEZsb2F0aW5nU3RhdGUmIGZs
b2F0aW5nU3RhdGUsIExheW91dFVuaXQgaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24pCit7CisgICAg
Ly8gU3RhcnQgd2l0aCB0aGUgaW5uZXItbW9zdCBmbG9hdGluZyBwYWlyIGZvciB0aGUgaW5pdGlh
bCB2ZXJ0aWNhbCBwb3NpdGlvbi4KKyAgICByZXR1cm4gSXRlcmF0b3IoZmxvYXRpbmdTdGF0ZS5m
bG9hdHMoKSwgaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24pOworfQorCitzdGF0aWMgSXRlcmF0b3Ig
ZW5kKGNvbnN0IEZsb2F0aW5nU3RhdGUmIGZsb2F0aW5nU3RhdGUpCit7CisgICAgcmV0dXJuIEl0
ZXJhdG9yKGZsb2F0aW5nU3RhdGUuZmxvYXRzKCksIHN0ZDo6bnVsbG9wdCk7Cit9CisKK0Zsb2F0
aW5nQ29udGV4dDo6RmxvYXRpbmdDb250ZXh0KEZsb2F0aW5nU3RhdGUmIGZsb2F0aW5nU3RhdGUp
CisgICAgOiBtX2Zsb2F0aW5nU3RhdGUoZmxvYXRpbmdTdGF0ZSkKK3sKK30KKworUG9zaXRpb24g
RmxvYXRpbmdDb250ZXh0Ojpwb3NpdGlvbkZvckZsb2F0KGNvbnN0IEJveCYgbGF5b3V0Qm94KSBj
b25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaXNGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7Cisg
ICAgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtIGZsb2F0SXRlbSA9IHsgbGF5b3V0Qm94LCBtX2Zs
b2F0aW5nU3RhdGUgfTsKKworICAgIFBvc2l0aW9uIGZsb2F0UG9zaXRpb247CisgICAgaWYgKG1f
ZmxvYXRpbmdTdGF0ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gTm8gZmxvYXQgYm94IG9uIHRo
ZSBjb250ZXh0IHlldCAtPiBhbGlnbiBpdCB3aXRoIHRoZSBjb250YWluaW5nIGJsb2NrJ3MgbGVm
dC9yaWdodCBlZGdlLgorICAgICAgICBhdXRvJiBkaXNwbGF5Qm94ID0gZmxvYXRJdGVtLmRpc3Bs
YXlCb3goKTsKKyAgICAgICAgZmxvYXRQb3NpdGlvbiA9IHsgYWxpZ25XaXRoQ29udGFpbmluZ0Js
b2NrKGZsb2F0SXRlbSkgKyBkaXNwbGF5Qm94Lm1hcmdpbkxlZnQoKSwgZGlzcGxheUJveC50b3Ao
KSB9OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZpbmQgdGhlIHRvcCBtb3N0IHBvc2l0aW9u
IHdoZXJlIHRoZSBmbG9hdCBib3ggZml0cy4KKyAgICAgICAgZmxvYXRQb3NpdGlvbiA9IGZsb2F0
aW5nUG9zaXRpb24oZmxvYXRJdGVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gdG9Db250YWluaW5n
QmxvY2soZmxvYXRJdGVtLCBmbG9hdFBvc2l0aW9uKTsKK30KKworc3RkOjpvcHRpb25hbDxMYXlv
dXRVbml0PiBGbG9hdGluZ0NvbnRleHQ6OnZlcnRpY2FsUG9zaXRpb25XaXRoQ2xlYXJhbmNlKGNv
bnN0IEJveCYgbGF5b3V0Qm94KSBjb25zdAoreworICAgIEFTU0VSVChsYXlvdXRCb3guaGFzRmxv
YXRDbGVhcigpKTsKKyAgICBBU1NFUlQobGF5b3V0Qm94LmlzQmxvY2tMZXZlbEJveCgpKTsKKwor
ICAgIGlmIChtX2Zsb2F0aW5nU3RhdGUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4geyB9Owor
CisgICAgYXV0byBib3R0b20gPSBbJl0oc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBmbG9hdEJv
dHRvbSkgLT4gc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiB7CisgICAgICAgIC8vICdib3R0b20n
IGlzIGluIHRoZSBmb3JtYXR0aW5nIHJvb3QncyBjb29yZGluYXRlIHN5c3RlbS4KKyAgICAgICAg
aWYgKCFmbG9hdEJvdHRvbSkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisKKyAgICAgICAgLy8g
OS41LjIgQ29udHJvbGxpbmcgZmxvdyBuZXh0IHRvIGZsb2F0czogdGhlICdjbGVhcicgcHJvcGVy
dHkKKyAgICAgICAgLy8gVGhlbiB0aGUgYW1vdW50IG9mIGNsZWFyYW5jZSBpcyBzZXQgdG8gdGhl
IGdyZWF0ZXIgb2Y6CisgICAgICAgIC8vCisgICAgICAgIC8vIDEuIFRoZSBhbW91bnQgbmVjZXNz
YXJ5IHRvIHBsYWNlIHRoZSBib3JkZXIgZWRnZSBvZiB0aGUgYmxvY2sgZXZlbiB3aXRoIHRoZSBi
b3R0b20gb3V0ZXIgZWRnZSBvZiB0aGUgbG93ZXN0IGZsb2F0IHRoYXQgaXMgdG8gYmUgY2xlYXJl
ZC4KKyAgICAgICAgLy8gMi4gVGhlIGFtb3VudCBuZWNlc3NhcnkgdG8gcGxhY2UgdGhlIHRvcCBi
b3JkZXIgZWRnZSBvZiB0aGUgYmxvY2sgYXQgaXRzIGh5cG90aGV0aWNhbCBwb3NpdGlvbi4KKwor
ICAgICAgICBhdXRvJiBsYXlvdXRDb250ZXh0ID0gdGhpcy0+bGF5b3V0Q29udGV4dCgpOworICAg
ICAgICBhdXRvJiBkaXNwbGF5Qm94ID0gKmxheW91dENvbnRleHQuZGlzcGxheUJveEZvckxheW91
dEJveChsYXlvdXRCb3gpOworICAgICAgICBhdXRvIHJvb3RSZWxhdGl2ZVRvcCA9IEZvcm1hdHRp
bmdDb250ZXh0OjptYXBUb3BMZWZ0VG9BbmNlc3RvcihsYXlvdXRDb250ZXh0LCBsYXlvdXRCb3gs
IGRvd25jYXN0PENvbnRhaW5lcj4obV9mbG9hdGluZ1N0YXRlLnJvb3QoKSkpLnk7CisgICAgICAg
IGF1dG8gY2xlYXJhbmNlID0gKmZsb2F0Qm90dG9tIC0gcm9vdFJlbGF0aXZlVG9wOworICAgICAg
ICBpZiAoY2xlYXJhbmNlIDw9IDApCisgICAgICAgICAgICByZXR1cm4geyB9OworCisgICAgICAg
IC8vIENsZWFyYW5jZSBpbmhpYml0cyBtYXJnaW4gY29sbGFwc2luZy4gTGV0J3MgcmVzZXQgdGhl
IHJlbGV2YW50IGFkam9pbmluZyBtYXJnaW5zLgorICAgICAgICBpZiAoYXV0byogcHJldmlvdXNJ
bkZsb3dTaWJsaW5nID0gbGF5b3V0Qm94LnByZXZpb3VzSW5GbG93U2libGluZygpKSB7CisgICAg
ICAgICAgICBhdXRvJiBwcmV2aW91c0luRmxvd0Rpc3BsYXlCb3ggPSAqbGF5b3V0Q29udGV4dC5k
aXNwbGF5Qm94Rm9yTGF5b3V0Qm94KCpwcmV2aW91c0luRmxvd1NpYmxpbmcpOworCisgICAgICAg
ICAgICAvLyBTaW5jZSB0aGUgcHJldmlvdXMgaW5mbG93IHNpYmxpbmcgaGFzIGFscmVhZHkgYmVl
biBsYWlkIG91dCwgaXRzIG1hcmdpbiBpcyBjb2xsYXBzZWQgYnkgbm93LgorICAgICAgICAgICAg
QVNTRVJUKCFwcmV2aW91c0luRmxvd0Rpc3BsYXlCb3gubWFyZ2luQm90dG9tKCkpOworICAgICAg
ICAgICAgYXV0byBjb2xsYXBzZWRNYXJnaW4gPSBkaXNwbGF5Qm94Lm1hcmdpblRvcCgpOworCisg
ICAgICAgICAgICAvLyBSZXNldCBwcmV2aW91cyBib3R0b20gYW5kIGN1cnJlbnQgdG9wIG1hcmdp
bnMgdG8gbm9uLWNvbGxhcHNpbmcuCisgICAgICAgICAgICBwcmV2aW91c0luRmxvd0Rpc3BsYXlC
b3guc2V0VmVydGljYWxNYXJnaW4oeyBwcmV2aW91c0luRmxvd0Rpc3BsYXlCb3gubWFyZ2luVG9w
KCksIHByZXZpb3VzSW5GbG93RGlzcGxheUJveC5ub25Db2xsYXBzZWRNYXJnaW5Cb3R0b20oKSB9
KTsKKyAgICAgICAgICAgIGRpc3BsYXlCb3guc2V0VmVydGljYWxNYXJnaW4oeyBkaXNwbGF5Qm94
Lm5vbkNvbGxhcHNlZE1hcmdpblRvcCgpLCBkaXNwbGF5Qm94Lm1hcmdpbkJvdHRvbSgpIH0pOwor
CisgICAgICAgICAgICBhdXRvIG5vbkNvbGxhcHNlZE1hcmdpbiA9IHByZXZpb3VzSW5GbG93RGlz
cGxheUJveC5tYXJnaW5Cb3R0b20oKSArIGRpc3BsYXlCb3gubWFyZ2luVG9wKCk7CisgICAgICAg
ICAgICBhdXRvIG1hcmdpbk9mZnNldCA9IG5vbkNvbGxhcHNlZE1hcmdpbiAtIGNvbGxhcHNlZE1h
cmdpbjsKKyAgICAgICAgICAgIC8vIE1vdmUgdGhlIGJveCB0byB0aGUgcG9zaXRpb24gd2hlcmUg
aXQgd291bGQgYmUgd2l0aCBub24tY29sbGFwc2VkIG1hcmdpbnMuCisgICAgICAgICAgICByb290
UmVsYXRpdmVUb3AgKz0gbWFyZ2luT2Zmc2V0OworCisgICAgICAgICAgICAvLyBIYXZpbmcgbmVn
YXRpdmUgY2xlYXJhbmNlIGlzIGFsc28gbm9ybWFsLiBJdCBqdXN0IG1lYW5zIHRoYXQgdGhlIGJv
eCB3aXRoIHRoZSBub24tY29sbGFwc2VkIG1hcmdpbnMgaXMgbm93IGxvd2VyIHRoYW4gaXQgbmVl
ZHMgdG8gYmUuCisgICAgICAgICAgICBjbGVhcmFuY2UgLT0gbWFyZ2luT2Zmc2V0OworICAgICAg
ICB9CisgICAgICAgIC8vIE5vdyBhZGp1c3QgdGhlIGJveCdzIHBvc2l0aW9uIHdpdGggdGhlIGNs
ZWFyYW5jZS4KKyAgICAgICAgcm9vdFJlbGF0aXZlVG9wICs9IGNsZWFyYW5jZTsKKyAgICAgICAg
QVNTRVJUKCpmbG9hdEJvdHRvbSA9PSByb290UmVsYXRpdmVUb3ApOworCisgICAgICAgIC8vIFRo
ZSByZXR1cm4gdmVydGljYWwgcG9zaXRpb24gaXMgaW4gdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBj
b29yZGluYXRlIHN5c3RlbS4KKyAgICAgICAgYXV0byBjb250YWluaW5nQmxvY2tSb290UmVsYXRp
dmVUb3AgPSBGb3JtYXR0aW5nQ29udGV4dDo6bWFwVG9wTGVmdFRvQW5jZXN0b3IobGF5b3V0Q29u
dGV4dCwgKmxheW91dEJveC5jb250YWluaW5nQmxvY2soKSwgZG93bmNhc3Q8Q29udGFpbmVyPiht
X2Zsb2F0aW5nU3RhdGUucm9vdCgpKSkueTsKKyAgICAgICAgcmV0dXJuIHJvb3RSZWxhdGl2ZVRv
cCAtIGNvbnRhaW5pbmdCbG9ja1Jvb3RSZWxhdGl2ZVRvcDsKKyAgICB9OworCisgICAgYXV0byBj
bGVhciA9IGxheW91dEJveC5zdHlsZSgpLmNsZWFyKCk7CisgICAgYXV0byYgZm9ybWF0dGluZ0Nv
bnRleHRSb290ID0gbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpOworCisgICAgaWYg
KGNsZWFyID09IENsZWFyOjpMZWZ0KQorICAgICAgICByZXR1cm4gYm90dG9tKG1fZmxvYXRpbmdT
dGF0ZS5sZWZ0Qm90dG9tKGZvcm1hdHRpbmdDb250ZXh0Um9vdCkpOworCisgICAgaWYgKGNsZWFy
ID09IENsZWFyOjpSaWdodCkKKyAgICAgICAgcmV0dXJuIGJvdHRvbShtX2Zsb2F0aW5nU3RhdGUu
cmlnaHRCb3R0b20oZm9ybWF0dGluZ0NvbnRleHRSb290KSk7CisKKyAgICBpZiAoY2xlYXIgPT0g
Q2xlYXI6OkJvdGgpCisgICAgICAgIHJldHVybiBib3R0b20obV9mbG9hdGluZ1N0YXRlLmJvdHRv
bShmb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsKKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgIHJldHVybiB7IH07Cit9CisKK1Bvc2l0aW9uIEZsb2F0aW5nQ29udGV4dDo6ZmxvYXRpbmdQ
b3NpdGlvbihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mIGZsb2F0SXRlbSkgY29uc3QK
K3sKKyAgICBhdXRvIGluaXRpYWxWZXJ0aWNhbFBvc2l0aW9uID0gdGhpcy0+aW5pdGlhbFZlcnRp
Y2FsUG9zaXRpb24oZmxvYXRJdGVtKTsKKyAgICBhdXRvJiBkaXNwbGF5Qm94ID0gZmxvYXRJdGVt
LmRpc3BsYXlCb3goKTsKKyAgICBhdXRvIG1hcmdpbkJveFNpemUgPSBkaXNwbGF5Qm94Lm1hcmdp
bkJveCgpLnNpemUoKTsKKworICAgIGF1dG8gZW5kID0gTGF5b3V0OjplbmQobV9mbG9hdGluZ1N0
YXRlKTsKKyAgICBhdXRvIHRvcCA9IGluaXRpYWxWZXJ0aWNhbFBvc2l0aW9uOworICAgIGF1dG8g
Ym90dG9tTW9zdCA9IHRvcDsKKyAgICBmb3IgKGF1dG8gaXRlcmF0b3IgPSBiZWdpbihtX2Zsb2F0
aW5nU3RhdGUsIGluaXRpYWxWZXJ0aWNhbFBvc2l0aW9uKTsgaXRlcmF0b3IgIT0gZW5kOyArK2l0
ZXJhdG9yKSB7CisgICAgICAgIEFTU0VSVCghKCppdGVyYXRvcikuaXNFbXB0eSgpKTsKKworICAg
ICAgICBhdXRvIGZsb2F0cyA9ICppdGVyYXRvcjsKKyAgICAgICAgdG9wID0gZmxvYXRzLnZlcnRp
Y2FsUG9zaXRpb24oKTsKKworICAgICAgICAvLyBNb3ZlIHRoZSBib3ggaG9yaXpvbnRhbGx5IHNv
IHRoYXQgaXQgYWxpZ25zIHdpdGggdGhlIGN1cnJlbnQgZmxvYXRpbmcgcGFpci4KKyAgICAgICAg
YXV0byBsZWZ0ID0gYWxpZ25XaXRoRmxvYXRpbmdzKGZsb2F0cywgZmxvYXRJdGVtKTsKKyAgICAg
ICAgLy8gQ2hlY2sgaWYgdGhlIGJveCBmaXRzIGF0IHRoaXMgdmVydGljYWwgcG9zaXRpb24uCisg
ICAgICAgIGlmICghZmxvYXRzLmludGVyc2VjdHMoeyB0b3AsIGxlZnQsIG1hcmdpbkJveFNpemUu
d2lkdGgoKSwgbWFyZ2luQm94U2l6ZS5oZWlnaHQoKSB9KSkKKyAgICAgICAgICAgIHJldHVybiB7
IGxlZnQgKyBkaXNwbGF5Qm94Lm1hcmdpbkxlZnQoKSwgdG9wICsgZGlzcGxheUJveC5tYXJnaW5U
b3AoKSB9OworCisgICAgICAgIGJvdHRvbU1vc3QgPSBmbG9hdHMuYm90dG9tKCk7CisgICAgICAg
IC8vIE1vdmUgdG8gdGhlIG5leHQgZmxvYXRpbmcgcGFpci4KKyAgICB9CisKKyAgICAvLyBQYXNz
ZWQgYWxsIHRoZSBmbG9hdHMgYW5kIHN0aWxsIGRvZXMgbm90IGZpdD8KKyAgICByZXR1cm4geyBh
bGlnbldpdGhDb250YWluaW5nQmxvY2soZmxvYXRJdGVtKSArIGRpc3BsYXlCb3gubWFyZ2luTGVm
dCgpLCBib3R0b21Nb3N0ICsgZGlzcGxheUJveC5tYXJnaW5Ub3AoKSB9OworfQorCitMYXlvdXRV
bml0IEZsb2F0aW5nQ29udGV4dDo6aW5pdGlhbFZlcnRpY2FsUG9zaXRpb24oY29uc3QgRmxvYXRp
bmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9hdEl0ZW0pIGNvbnN0Cit7CisgICAgLy8gSW5jb21pbmcg
ZmxvYXRpbmcgY2Fubm90IGJlIHBsYWNlZCBoaWdoZXIgdGhhbiBleGlzdGluZyBmbG9hdHMuCisg
ICAgLy8gVGFrZSB0aGUgc3RhdGljIHBvc2l0aW9uICh3aGVyZSB0aGUgYm94IHdvdWxkIGdvIGlm
IGl0IHdhc24ndCBmbG9hdGluZykgYW5kIGFkanVzdCBpdCB3aXRoIHRoZSBsYXN0IGZsb2F0aW5n
LgorICAgIGF1dG8gbWFyZ2luQm94VG9wID0gZmxvYXRJdGVtLmRpc3BsYXlCb3goKS5yZWN0V2l0
aE1hcmdpbigpLnRvcCgpOworCisgICAgaWYgKGF1dG8gbGFzdEZsb2F0ID0gbV9mbG9hdGluZ1N0
YXRlLmxhc3QoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KG1hcmdpbkJveFRvcCwgbGFzdEZs
b2F0LT5kaXNwbGF5Qm94KCkucmVjdFdpdGhNYXJnaW4oKS50b3AoKSk7CisKKyAgICByZXR1cm4g
bWFyZ2luQm94VG9wOworfQorCitMYXlvdXRVbml0IEZsb2F0aW5nQ29udGV4dDo6YWxpZ25XaXRo
Q29udGFpbmluZ0Jsb2NrKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYgZmxvYXRJdGVt
KSBjb25zdAoreworICAgIC8vIElmIHRoZXJlIGlzIG5vIGZsb2F0aW5nIHRvIGFsaWduIHdpdGgs
IHB1c2ggdGhlIGJveCB0byB0aGUgbGVmdC9yaWdodCBlZGdlIG9mIGl0cyBjb250YWluaW5nIGJs
b2NrJ3MgY29udGVudCBib3guCisgICAgLy8gKEVpdGhlciB0aGVyZSdzIG5vIGZsb2F0cyBhdCBh
bGwgb3IgdGhpcyBib3ggZG9lcyBub3QgZml0IGF0IGFueSB2ZXJ0aWNhbCBwb3NpdGlvbnMgd2hl
cmUgdGhlIGZsb2F0cyBhcmUuKQorICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gg
PSBmbG9hdEl0ZW0uY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCgpOworICAgIGF1dG8gY29udGFp
bmluZ0Jsb2NrQ29udGVudEJveExlZnQgPSBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LmxlZnQo
KSArIGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3guY29udGVudEJveExlZnQoKTsKKworICAgIGlm
IChmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpCisgICAg
ICAgIHJldHVybiBjb250YWluaW5nQmxvY2tDb250ZW50Qm94TGVmdDsKKworICAgIHJldHVybiBj
b250YWluaW5nQmxvY2tDb250ZW50Qm94TGVmdCArIGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gu
Y29udGVudEJveFdpZHRoKCkgLSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpLm1hcmdpbkJveCgpLndp
ZHRoKCk7Cit9CisKK0xheW91dFVuaXQgRmxvYXRpbmdDb250ZXh0OjphbGlnbldpdGhGbG9hdGlu
Z3MoY29uc3QgRmxvYXRpbmdQYWlyJiBmbG9hdGluZ1BhaXIsIGNvbnN0IEZsb2F0aW5nU3RhdGU6
OkZsb2F0SXRlbSYgZmxvYXRJdGVtKSBjb25zdAoreworICAgIC8vIENvbXB1dGUgdGhlIGhvcml6
b250YWwgcG9zaXRpb24gZm9yIHRoZSBuZXcgZmxvYXRpbmcgYnkgdGFraW5nIGJvdGggdGhlIGNv
bnRpbmluZyBibG9jayBhbmQgdGhlIGN1cnJlbnQgbGVmdC9yaWdodCBmbG9hdHMgaW50byBhY2Nv
dW50LgorICAgIGF1dG8mIGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3ggPSBmbG9hdEl0ZW0uY29u
dGFpbmluZ0Jsb2NrRGlzcGxheUJveCgpOworICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrQ29udGVu
dEJveExlZnQgPSBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LmxlZnQoKSArIGNvbnRhaW5pbmdC
bG9ja0Rpc3BsYXlCb3guY29udGVudEJveExlZnQoKTsKKyAgICBhdXRvIGNvbnRhaW5pbmdCbG9j
a0NvbnRlbnRCb3hSaWdodCA9IGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gubGVmdCgpICsgY29u
dGFpbmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94UmlnaHQoKTsKKyAgICBhdXRvIG1hcmdp
bkJveFdpZHRoID0gZmxvYXRJdGVtLmRpc3BsYXlCb3goKS5tYXJnaW5Cb3goKS53aWR0aCgpOwor
CisgICAgYXV0byBsZWZ0QWxpZ25lZEJveExlZnQgPSBjb250YWluaW5nQmxvY2tDb250ZW50Qm94
TGVmdDsKKyAgICBhdXRvIHJpZ2h0QWxpZ25lZEJveExlZnQgPSBjb250YWluaW5nQmxvY2tDb250
ZW50Qm94UmlnaHQgLSBtYXJnaW5Cb3hXaWR0aDsKKworICAgIGlmIChmbG9hdGluZ1BhaXIuaXNF
bXB0eSgpKSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4g
ZmxvYXRJdGVtLmxheW91dEJveCgpLmlzTGVmdEZsb2F0aW5nUG9zaXRpb25lZCgpID8gbGVmdEFs
aWduZWRCb3hMZWZ0IDogcmlnaHRBbGlnbmVkQm94TGVmdDsKKyAgICB9CisKKyAgICBpZiAoZmxv
YXRJdGVtLmxheW91dEJveCgpLmlzTGVmdEZsb2F0aW5nUG9zaXRpb25lZCgpKSB7CisgICAgICAg
IGlmIChhdXRvKiBsZWZ0RGlzcGxheUJveCA9IGZsb2F0aW5nUGFpci5sZWZ0KCkpIHsKKyAgICAg
ICAgICAgIGF1dG8gbGVmdEZsb2F0aW5nQm94UmlnaHQgPSBsZWZ0RGlzcGxheUJveC0+cmVjdFdp
dGhNYXJnaW4oKS5yaWdodCgpOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWluKHN0ZDo6bWF4
KGxlZnRBbGlnbmVkQm94TGVmdCwgbGVmdEZsb2F0aW5nQm94UmlnaHQpLCByaWdodEFsaWduZWRC
b3hMZWZ0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGxlZnRBbGlnbmVk
Qm94TGVmdDsKKyAgICB9CisKKyAgICBBU1NFUlQoZmxvYXRJdGVtLmxheW91dEJveCgpLmlzUmln
aHRGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7CisKKyAgICBpZiAoYXV0byogcmlnaHREaXNwbGF5Qm94
ID0gZmxvYXRpbmdQYWlyLnJpZ2h0KCkpIHsKKyAgICAgICAgYXV0byByaWdodEZsb2F0aW5nQm94
TGVmdCA9IHJpZ2h0RGlzcGxheUJveC0+cmVjdFdpdGhNYXJnaW4oKS5sZWZ0KCk7CisgICAgICAg
IHJldHVybiBzdGQ6Om1heChzdGQ6Om1pbihyaWdodEFsaWduZWRCb3hMZWZ0LCByaWdodEZsb2F0
aW5nQm94TGVmdCAtIG1hcmdpbkJveFdpZHRoKSwgbGVmdEFsaWduZWRCb3hMZWZ0KTsKKyAgICB9
CisKKyAgICByZXR1cm4gcmlnaHRBbGlnbmVkQm94TGVmdDsKK30KKworLy8gRklYTUU6IGZpbmQg
YSBiZXR0ZXIgcGxhY2UgZm9yIHRoaXMuCitQb3NpdGlvbiBGbG9hdGluZ0NvbnRleHQ6OnRvQ29u
dGFpbmluZ0Jsb2NrKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYgZmxvYXRJdGVtLCBQ
b3NpdGlvbiBwb3NpdGlvbikgY29uc3QKK3sKKyAgICAvLyBGcm9tIGZvcm1hdHRpbmcgcm9vdCBj
b29yZGluYXRlIHN5c3RlbSBiYWNrIHRvIGNvbnRhaW5pbmcgYmxvY2sncy4KKyAgICBpZiAoJmZs
b2F0SXRlbS5jb250YWluaW5nQmxvY2soKSA9PSAmbV9mbG9hdGluZ1N0YXRlLnJvb3QoKSkKKyAg
ICAgICAgcmV0dXJuIHBvc2l0aW9uOworCisgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrRGlzcGxh
eUJveCA9IGZsb2F0SXRlbS5jb250YWluaW5nQmxvY2tEaXNwbGF5Qm94KCk7CisgICAgcmV0dXJu
IHsgcG9zaXRpb24ueCAtIGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gubGVmdCgpLCBwb3NpdGlv
bi55IC0gY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC50b3AoKSB9OworfQorCitGbG9hdGluZ1Bh
aXI6OkZsb2F0aW5nUGFpcihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmIGZsb2F0cykK
KyAgICA6IG1fZmxvYXRzKGZsb2F0cykKK3sKK30KKworY29uc3QgRGlzcGxheTo6Qm94KiBGbG9h
dGluZ1BhaXI6OmxlZnQoKSBjb25zdAoreworICAgIGlmICghbV9sZWZ0SW5kZXgpCisgICAgICAg
IHJldHVybiBudWxscHRyOworCisgICAgQVNTRVJUKG1fZmxvYXRzWyptX2xlZnRJbmRleF0ubGF5
b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpOworICAgIHJldHVybiAmbV9mbG9h
dHNbKm1fbGVmdEluZGV4XS5kaXNwbGF5Qm94KCk7Cit9CisKK2NvbnN0IERpc3BsYXk6OkJveCog
RmxvYXRpbmdQYWlyOjpyaWdodCgpIGNvbnN0Cit7CisgICAgaWYgKCFtX3JpZ2h0SW5kZXgpCisg
ICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgQVNTRVJUKG1fZmxvYXRzWyptX3JpZ2h0SW5k
ZXhdLmxheW91dEJveCgpLmlzUmlnaHRGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7CisgICAgcmV0dXJu
ICZtX2Zsb2F0c1sqbV9yaWdodEluZGV4XS5kaXNwbGF5Qm94KCk7Cit9CisKK2Jvb2wgRmxvYXRp
bmdQYWlyOjppbnRlcnNlY3RzKGNvbnN0IERpc3BsYXk6OkJveDo6UmVjdCYgY2FuZGlkYXRlUmVj
dCkgY29uc3QKK3sKKyAgICBhdXRvIGludGVyc2VjdHMgPSBbJl0oY29uc3QgRGlzcGxheTo6Qm94
KiBmbG9hdGluZywgRmxvYXQgZmxvYXRpbmdUeXBlKSB7CisgICAgICAgIGlmICghZmxvYXRpbmcp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgYXV0byBtYXJnaW5SZWN0ID0g
ZmxvYXRpbmctPnJlY3RXaXRoTWFyZ2luKCk7CisgICAgICAgIC8vIEJlZm9yZSBpbnRlcnNlY3Rp
bmcsIGNoZWNrIGlmIHRoZSBjYW5kaWRhdGUgcG9zaXRpb24gaXMgdG9vIGZhciB0byB0aGUgbGVm
dC9yaWdodC4KKyAgICAgICAgLy8gVGhlIG5ldyBmbG9hdCdzIGNvbnRhaW5pbmcgYmxvY2sgY291
bGQgcHVzaCB0aGUgY2FuZGlkYXRlIHBvc2l0aW9uIGJleW9uZCB0aGUgY3VycmVudCBmbG9hdCBo
b3Jpem9udGFsbHkuCisgICAgICAgIGlmICgoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpMZWZ0ICYm
IGNhbmRpZGF0ZVJlY3QubGVmdCgpIDwgbWFyZ2luUmVjdC5yaWdodCgpKQorICAgICAgICAgICAg
fHwgKGZsb2F0aW5nVHlwZSA9PSBGbG9hdDo6UmlnaHQgJiYgY2FuZGlkYXRlUmVjdC5yaWdodCgp
ID4gbWFyZ2luUmVjdC5sZWZ0KCkpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IHJldHVybiBtYXJnaW5SZWN0LmludGVyc2VjdHMoY2FuZGlkYXRlUmVjdCk7CisgICAgfTsKKwor
ICAgIGlmICghbV9sZWZ0SW5kZXggJiYgIW1fcmlnaHRJbmRleCkgeworICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChp
bnRlcnNlY3RzKGxlZnQoKSwgRmxvYXQ6OkxlZnQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgIGlmIChpbnRlcnNlY3RzKHJpZ2h0KCksIEZsb2F0OjpSaWdodCkpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEZsb2F0aW5nUGFpcjo6b3Bl
cmF0b3IgPT0oY29uc3QgRmxvYXRpbmdQYWlyJiBvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9sZWZ0SW5kZXggPT0gb3RoZXIubV9sZWZ0SW5kZXggJiYgbV9yaWdodEluZGV4ID09IG90aGVy
Lm1fcmlnaHRJbmRleDsKK30KKworTGF5b3V0VW5pdCBGbG9hdGluZ1BhaXI6OmJvdHRvbSgpIGNv
bnN0Cit7CisgICAgYXV0byogbGVmdCA9IHRoaXMtPmxlZnQoKTsKKyAgICBhdXRvKiByaWdodCA9
IHRoaXMtPnJpZ2h0KCk7CisgICAgQVNTRVJUKGxlZnQgfHwgcmlnaHQpOworCisgICAgYXV0byBs
ZWZ0Qm90dG9tID0gbGVmdCA/IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4obGVmdC0+cmVjdFdp
dGhNYXJnaW4oKS5ib3R0b20oKSkgOiBzdGQ6Om51bGxvcHQ7CisgICAgYXV0byByaWdodEJvdHRv
bSA9IHJpZ2h0ID8gc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PihyaWdodC0+cmVjdFdpdGhNYXJn
aW4oKS5ib3R0b20oKSkgOiBzdGQ6Om51bGxvcHQ7CisKKyAgICBpZiAobGVmdEJvdHRvbSAmJiBy
aWdodEJvdHRvbSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KCpsZWZ0Qm90dG9tLCAqcmlnaHRC
b3R0b20pOworCisgICAgaWYgKGxlZnRCb3R0b20pCisgICAgICAgIHJldHVybiAqbGVmdEJvdHRv
bTsKKworICAgIHJldHVybiAqcmlnaHRCb3R0b207Cit9CisKK0l0ZXJhdG9yOjpJdGVyYXRvcihj
b25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmIGZsb2F0cywgc3RkOjpvcHRpb25hbDxMYXlv
dXRVbml0PiB2ZXJ0aWNhbFBvc2l0aW9uKQorICAgIDogbV9mbG9hdHMoZmxvYXRzKQorICAgICwg
bV9jdXJyZW50KGZsb2F0cykKK3sKKyAgICBpZiAodmVydGljYWxQb3NpdGlvbikKKyAgICAgICAg
c2V0KCp2ZXJ0aWNhbFBvc2l0aW9uKTsKK30KKworaW5saW5lIHN0YXRpYyBzdGQ6Om9wdGlvbmFs
PHVuc2lnbmVkPiBwcmV2aW91c0Zsb2F0aW5nSW5kZXgoRmxvYXQgZmxvYXRpbmdUeXBlLCBjb25z
dCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmIGZsb2F0cywgdW5zaWduZWQgY3VycmVudEluZGV4
KQoreworICAgIFJFTEVBU0VfQVNTRVJUKGN1cnJlbnRJbmRleCA8PSBmbG9hdHMuc2l6ZSgpKTsK
KworICAgIHdoaWxlIChjdXJyZW50SW5kZXgpIHsKKyAgICAgICAgYXV0byYgZmxvYXRpbmcgPSBm
bG9hdHNbLS1jdXJyZW50SW5kZXhdLmxheW91dEJveCgpOworICAgICAgICBpZiAoKGZsb2F0aW5n
VHlwZSA9PSBGbG9hdDo6TGVmdCAmJiBmbG9hdGluZy5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQo
KSkgfHwgKGZsb2F0aW5nVHlwZSA9PSBGbG9hdDo6UmlnaHQgJiYgZmxvYXRpbmcuaXNSaWdodEZs
b2F0aW5nUG9zaXRpb25lZCgpKSkKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7Cisg
ICAgfQorCisgICAgcmV0dXJuIHsgfTsKK30KKworSXRlcmF0b3ImIEl0ZXJhdG9yOjpvcGVyYXRv
cisrKCkKK3sKKyAgICBpZiAobV9jdXJyZW50LmlzRW1wdHkoKSkgeworICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGF1dG8g
ZmluZFByZXZpb3VzRmxvYXRpbmdXaXRoTG93ZXJCb3R0b20gPSBbJl0oRmxvYXQgZmxvYXRpbmdU
eXBlLCB1bnNpZ25lZCBjdXJyZW50SW5kZXgpIC0+IHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IHsK
KworICAgICAgICBSRUxFQVNFX0FTU0VSVChjdXJyZW50SW5kZXggPCBtX2Zsb2F0cy5zaXplKCkp
OworCisgICAgICAgIC8vIExhc3QgZmxvYXRpbmc/IFRoZXJlJ3MgY2VydGFpbmx5IG5vIHByZXZp
b3VzIGZsb2F0aW5nIGF0IHRoaXMgcG9pbnQuCisgICAgICAgIGlmICghY3VycmVudEluZGV4KQor
ICAgICAgICAgICAgcmV0dXJuIHsgfTsKKworICAgICAgICBhdXRvIGN1cnJlbnRCb3R0b20gPSBt
X2Zsb2F0c1tjdXJyZW50SW5kZXhdLmRpc3BsYXlCb3goKS5yZWN0V2l0aE1hcmdpbigpLmJvdHRv
bSgpOworCisgICAgICAgIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IGluZGV4ID0gY3VycmVudElu
ZGV4OworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW5kZXggPSBwcmV2aW91
c0Zsb2F0aW5nSW5kZXgoZmxvYXRpbmdUeXBlLCBtX2Zsb2F0cywgKmluZGV4KTsKKyAgICAgICAg
ICAgIGlmICghaW5kZXgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKKworICAgICAgICAg
ICAgaWYgKG1fZmxvYXRzWyppbmRleF0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCkuYm90
dG9tKCkgPiBjdXJyZW50Qm90dG9tKQorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAg
ICAgICAgfQorCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4g
eyB9OworICAgIH07CisKKyAgICAvLyAxLiBUYWtlIHRoZSBjdXJyZW50IGZsb2F0aW5nIGZyb20g
bGVmdCBhbmQgcmlnaHQgYW5kIGNoZWNrIHdoaWNoIG9uZSdzIGJvdHRvbSBlZGdlIGlzIHBvc2l0
aW9uZWQgaGlnaGVyICh0aGV5IGNvdWxkIGJlIG9uIHRoZSBzYW1lIHZlcnRpY2FsIHBvc2l0aW9u
IHRvbykuCisgICAgLy8gVGhlIGN1cnJlbnQgZmxvYXRzIGZyb20gbGVmdCBhbmQgcmlnaHQgYXJl
IGNvbnNpZGVyZWQgdGhlIGlubmVyLW1vc3QgcGFpciBmb3IgdGhlIGN1cnJlbnQgdmVydGljYWwg
cG9zaXRpb24uCisgICAgLy8gMi4gTW92ZSBhd2F5IGZyb20gaW5uZXItbW9zdCBwYWlyIGJ5IHBp
Y2tpbmcgb25lIG9mIHRoZSBwcmV2aW91cyBmbG9hdHMgaW4gdGhlIGxpc3QoIzEpCisgICAgLy8g
RW5zdXJlIHRoYXQgdGhlIG5ldyBmbG9hdGluZydzIGJvdHRvbSBlZGdlIGlzIHBvc2l0aW9uZWQg
bG93ZXIgdGhhbiB0aGUgY3VycmVudCBvbmUgLXdoaWNoIGVzc2VudGlhbGx5IG1lYW5zIHNraXBw
aW5nIGluLWJldHdlZW4gZmxvYXRzIHRoYXQgYXJlIHBvc2l0aW9uZWQgaGlnaGVyKS4KKyAgICAv
LyAzLiBSZXNldCB0aGUgdmVydGljYWwgcG9zaXRpb24gYW5kIGFsaWduIGl0IHdpdGggdGhlIG5l
dyBsZWZ0LXJpZ2h0IHBhaXIuIFRoZXNlIGZsb2F0cyBhcmUgbm93IHRoZSBpbm5lci1tb3N0IGJv
eGVzIGZvciB0aGUgY3VycmVudCB2ZXJ0aWNhbCBwb3NpdGlvbi4KKyAgICAvLyBBcyB0aGUgcmVz
dWx0IHdlIGhhdmUgbW9yZSBob3Jpem9udGFsIHNwYWNlIG9uIHRoZSBjdXJyZW50IHZlcnRpY2Fs
IHBvc2l0aW9uLgorICAgIGF1dG8gbGVmdEJvdHRvbSA9IG1fY3VycmVudC5sZWZ0KCkgPyBzdGQ6
Om9wdGlvbmFsPExheW91dFVuaXQ+KG1fY3VycmVudC5sZWZ0KCktPmJvdHRvbSgpKSA6IHN0ZDo6
bnVsbG9wdDsKKyAgICBhdXRvIHJpZ2h0Qm90dG9tID0gbV9jdXJyZW50LnJpZ2h0KCkgPyBzdGQ6
Om9wdGlvbmFsPExheW91dFVuaXQ+KG1fY3VycmVudC5yaWdodCgpLT5ib3R0b20oKSkgOiBzdGQ6
Om51bGxvcHQ7CisKKyAgICBhdXRvIHVwZGF0ZUxlZnQgPSAobGVmdEJvdHRvbSA9PSByaWdodEJv
dHRvbSkgfHwgKCFyaWdodEJvdHRvbSB8fCAobGVmdEJvdHRvbSAmJiBsZWZ0Qm90dG9tIDwgcmln
aHRCb3R0b20pKTsgCisgICAgYXV0byB1cGRhdGVSaWdodCA9IChsZWZ0Qm90dG9tID09IHJpZ2h0
Qm90dG9tKSB8fCAoIWxlZnRCb3R0b20gfHwgKHJpZ2h0Qm90dG9tICYmIGxlZnRCb3R0b20gPiBy
aWdodEJvdHRvbSkpOyAKKworICAgIGlmICh1cGRhdGVMZWZ0KSB7CisgICAgICAgIEFTU0VSVCht
X2N1cnJlbnQubV9sZWZ0SW5kZXgpOworICAgICAgICBtX2N1cnJlbnQubV92ZXJ0aWNhbFBvc2l0
aW9uID0gKmxlZnRCb3R0b207CisgICAgICAgIG1fY3VycmVudC5tX2xlZnRJbmRleCA9IGZpbmRQ
cmV2aW91c0Zsb2F0aW5nV2l0aExvd2VyQm90dG9tKEZsb2F0OjpMZWZ0LCAqbV9jdXJyZW50Lm1f
bGVmdEluZGV4KTsKKyAgICB9CisgICAgCisgICAgaWYgKHVwZGF0ZVJpZ2h0KSB7CisgICAgICAg
IEFTU0VSVChtX2N1cnJlbnQubV9yaWdodEluZGV4KTsKKyAgICAgICAgbV9jdXJyZW50Lm1fdmVy
dGljYWxQb3NpdGlvbiA9ICpyaWdodEJvdHRvbTsKKyAgICAgICAgbV9jdXJyZW50Lm1fcmlnaHRJ
bmRleCA9IGZpbmRQcmV2aW91c0Zsb2F0aW5nV2l0aExvd2VyQm90dG9tKEZsb2F0OjpSaWdodCwg
Km1fY3VycmVudC5tX3JpZ2h0SW5kZXgpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30K
Kwordm9pZCBJdGVyYXRvcjo6c2V0KExheW91dFVuaXQgdmVydGljYWxQb3NpdGlvbikKK3sKKyAg
ICAvLyBNb3ZlIHRoZSBpdGVyYXRvciB0byB0aGUgaW5pdGlhbCB2ZXJ0aWNhbCBwb3NpdGlvbiBi
eSBzdGFydGluZyBhdCB0aGUgaW5uZXItbW9zdCBmbG9hdGluZyBwYWlyIChsYXN0IGZsb2F0cyBv
biBsZWZ0L3JpZ2h0KS4KKyAgICAvLyAxLiBDaGVjayBpZiB0aGUgaW5uZXItbW9zdCBwYWlyIGNv
dmVycyB0aGUgdmVydGljYWwgcG9zaXRpb24uCisgICAgLy8gMi4gTW92ZSBvdXR3YXJkcyBmcm9t
IHRoZSBpbm5lci1tb3N0IHBhaXIgdW50aWwgdGhlIHZlcnRpY2FsIHBvc3Rpb24gaW50ZXJzZWN0
cy4KKyAgICAvLyAoTm90ZSB0aGF0IHZlcnRpY2FsUG9zaXRpb24gaGFzIGFscmVhZHkgYmVlbiBh
ZGp1c3RlZCB3aXRoIHRoZSB0b3Agb2YgdGhlIGxhc3QgZmxvYXQuKQorCisgICAgbV9jdXJyZW50
Lm1fdmVydGljYWxQb3NpdGlvbiA9IHZlcnRpY2FsUG9zaXRpb247CisgICAgLy8gTm8gZmxvYXRz
IGF0IGFsbD8KKyAgICBpZiAobV9mbG9hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworCisgICAgICAgIG1fY3VycmVudC5tX2xlZnRJbmRleCA9IHsgfTsKKyAg
ICAgICAgbV9jdXJyZW50Lm1fcmlnaHRJbmRleCA9IHsgfTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIGF1dG8gZmluZEZsb2F0aW5nQmVsb3cgPSBbJl0oRmxvYXQgZmxvYXRpbmdUeXBl
KSAtPiBzdGQ6Om9wdGlvbmFsPHVuc2lnbmVkPiB7CisKKyAgICAgICAgQVNTRVJUKCFtX2Zsb2F0
cy5pc0VtcHR5KCkpOworCisgICAgICAgIGF1dG8gaW5kZXggPSBmbG9hdGluZ1R5cGUgPT0gRmxv
YXQ6OkxlZnQgPyBtX2N1cnJlbnQubV9sZWZ0SW5kZXggOiBtX2N1cnJlbnQubV9yaWdodEluZGV4
OworICAgICAgICAvLyBTdGFydCBmcm9tIHRoZSBlbmQgaWYgd2UgZG9uJ3QgaGF2ZSBjdXJyZW50
IHlldC4KKyAgICAgICAgaW5kZXggPSBpbmRleC52YWx1ZV9vcihtX2Zsb2F0cy5zaXplKCkpOwor
ICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW5kZXggPSBwcmV2aW91c0Zsb2F0
aW5nSW5kZXgoZmxvYXRpbmdUeXBlLCBtX2Zsb2F0cywgKmluZGV4KTsKKyAgICAgICAgICAgIGlm
ICghaW5kZXgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHsgfTsKKworICAgICAgICAgICAgYXV0
byBib3R0b20gPSBtX2Zsb2F0c1sqaW5kZXhdLmRpc3BsYXlCb3goKS5yZWN0V2l0aE1hcmdpbigp
LmJvdHRvbSgpOworICAgICAgICAgICAgLy8gSXMgdGhpcyBmbG9hdGluZyBpbnRydXNpdmUgb24g
dGhpcyBwb3NpdGlvbj8KKyAgICAgICAgICAgIGlmIChib3R0b20gPiB2ZXJ0aWNhbFBvc2l0aW9u
KQorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHJl
dHVybiB7IH07CisgICAgfTsKKworICAgIG1fY3VycmVudC5tX2xlZnRJbmRleCA9IGZpbmRGbG9h
dGluZ0JlbG93KEZsb2F0OjpMZWZ0KTsKKyAgICBtX2N1cnJlbnQubV9yaWdodEluZGV4ID0gZmlu
ZEZsb2F0aW5nQmVsb3coRmxvYXQ6OlJpZ2h0KTsKKworICAgIEFTU0VSVCghbV9jdXJyZW50Lm1f
bGVmdEluZGV4IHx8ICgqbV9jdXJyZW50Lm1fbGVmdEluZGV4IDwgbV9mbG9hdHMuc2l6ZSgpICYm
IG1fZmxvYXRzWyptX2N1cnJlbnQubV9sZWZ0SW5kZXhdLmxheW91dEJveCgpLmlzTGVmdEZsb2F0
aW5nUG9zaXRpb25lZCgpKSk7CisgICAgQVNTRVJUKCFtX2N1cnJlbnQubV9yaWdodEluZGV4IHx8
ICgqbV9jdXJyZW50Lm1fcmlnaHRJbmRleCA8IG1fZmxvYXRzLnNpemUoKSAmJiBtX2Zsb2F0c1sq
bV9jdXJyZW50Lm1fcmlnaHRJbmRleF0ubGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRp
b25lZCgpKSk7Cit9CisKK2Jvb2wgSXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3Im
IG90aGVyKSBjb25zdAoreworICAgIHJldHVybiBtX2N1cnJlbnQgPT0gb3RoZXIubV9jdXJyZW50
OworfQorCitib29sIEl0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yJiBvdGhlcikg
Y29uc3QKK3sKKyAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Cit9CisKK30KK30KKyNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zsb2F0Zm9ybWF0dGluZy9GbG9h
dGluZ0NvbnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbG9hdGZvcm1hdHRpbmcvRmxv
YXRpbmdDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDkwM2E5M2RhMzMyYzYyMmJkNWM3YTNmNDcyM2Yx
MmZhOTU2OTZhOQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbG9h
dGZvcm1hdHRpbmcvRmxvYXRpbmdDb250ZXh0LmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisg
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQor
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQp
CisKKyNpbmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIK
KyNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFt
ZXNwYWNlIExheW91dCB7CisKK2NsYXNzIEJveDsKK2NsYXNzIENvbnRhaW5lcjsKK2NsYXNzIEZs
b2F0aW5nUGFpcjsKK2NsYXNzIExheW91dENvbnRleHQ7CisKKy8vIEZsb2F0aW5nQ29udGV4dCBp
cyByZXNwb25zaWJsZSBmb3IgYWRqdXN0aW5nIHRoZSBwb3NpdGlvbiBvZiBhIGJveCBpbiB0aGUg
Y3VycmVudCBmb3JtYXR0aW5nIGNvbnRleHQKKy8vIGJ5IHRha2luZyB0aGUgZmxvYXRpbmcgYm94
ZXMgaW50byBhY2NvdW50LgorY2xhc3MgRmxvYXRpbmdDb250ZXh0IHsKKyAgICBXVEZfTUFLRV9J
U09fQUxMT0NBVEVEKEZsb2F0aW5nQ29udGV4dCk7CitwdWJsaWM6CisgICAgRmxvYXRpbmdDb250
ZXh0KEZsb2F0aW5nU3RhdGUmKTsKKworICAgIEZsb2F0aW5nU3RhdGUmIGZsb2F0aW5nU3RhdGUo
KSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nU3RhdGU7IH0KKworICAgIFBvc2l0aW9uIHBvc2l0
aW9uRm9yRmxvYXQoY29uc3QgQm94JikgY29uc3Q7CisgICAgc3RkOjpvcHRpb25hbDxMYXlvdXRV
bml0PiB2ZXJ0aWNhbFBvc2l0aW9uV2l0aENsZWFyYW5jZShjb25zdCBCb3gmKSBjb25zdDsKKwor
cHJpdmF0ZToKKyAgICBMYXlvdXRDb250ZXh0JiBsYXlvdXRDb250ZXh0KCkgY29uc3QgeyByZXR1
cm4gbV9mbG9hdGluZ1N0YXRlLmxheW91dENvbnRleHQoKTsgfQorCisgICAgUG9zaXRpb24gZmxv
YXRpbmdQb3NpdGlvbihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mKSBjb25zdDsKKwor
ICAgIExheW91dFVuaXQgaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24oY29uc3QgRmxvYXRpbmdTdGF0
ZTo6RmxvYXRJdGVtJikgY29uc3Q7CisgICAgTGF5b3V0VW5pdCBhbGlnbldpdGhDb250YWluaW5n
QmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJikgY29uc3Q7CisgICAgTGF5b3V0
VW5pdCBhbGlnbldpdGhGbG9hdGluZ3MoY29uc3QgRmxvYXRpbmdQYWlyJiwgY29uc3QgRmxvYXRp
bmdTdGF0ZTo6RmxvYXRJdGVtJikgY29uc3Q7CisgICAgUG9zaXRpb24gdG9Db250YWluaW5nQmxv
Y2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiwgUG9zaXRpb24pIGNvbnN0OworCisg
ICAgRmxvYXRpbmdTdGF0ZSYgbV9mbG9hdGluZ1N0YXRlOworfTsKKworfQorfQorI2VuZGlmCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxvYXRmb3JtYXR0aW5nL0Zsb2F0aW5n
U3RhdGUuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zsb2F0Zm9ybWF0dGluZy9GbG9hdGlu
Z1N0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40MWQzZWNlZGNiZjUzYTMwMGM4ZjE5NWI5OTFkMzQ1YjZm
ZGJlMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zsb2F0Zm9y
bWF0dGluZy9GbG9hdGluZ1N0YXRlLmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCisKKyNpZiBF
TkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZvcm1hdHRpbmdD
b250ZXh0LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGV4
dC5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwo
RmxvYXRpbmdTdGF0ZSk7CisKK0Zsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbTo6RmxvYXRJdGVtKGNv
bnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBGbG9hdGluZ1N0YXRlJiBmbG9hdGluZ1N0YXRlKQor
ICAgIDogbV9sYXlvdXRCb3gobWFrZVdlYWtQdHIoY29uc3RfY2FzdDxCb3gmPihsYXlvdXRCb3gp
KSkKKyAgICAsIG1fY29udGFpbmluZ0Jsb2NrKG1ha2VXZWFrUHRyKGNvbnN0X2Nhc3Q8Q29udGFp
bmVyJj4oKmxheW91dEJveC5jb250YWluaW5nQmxvY2soKSkpKQorICAgICwgbV9hYnNvbHV0ZURp
c3BsYXlCb3goRm9ybWF0dGluZ0NvbnRleHQ6Om1hcEJveFRvQW5jZXN0b3IoZmxvYXRpbmdTdGF0
ZS5sYXlvdXRDb250ZXh0KCksIGxheW91dEJveCwgZG93bmNhc3Q8Q29udGFpbmVyPihmbG9hdGlu
Z1N0YXRlLnJvb3QoKSkpKQorICAgICwgbV9jb250YWluaW5nQmxvY2tBYnNvbHV0ZURpc3BsYXlC
b3goRm9ybWF0dGluZ0NvbnRleHQ6Om1hcEJveFRvQW5jZXN0b3IoZmxvYXRpbmdTdGF0ZS5sYXlv
dXRDb250ZXh0KCksICptX2NvbnRhaW5pbmdCbG9jaywgZG93bmNhc3Q8Q29udGFpbmVyPihmbG9h
dGluZ1N0YXRlLnJvb3QoKSkpKQoreworfQorCitGbG9hdGluZ1N0YXRlOjpGbG9hdGluZ1N0YXRl
KExheW91dENvbnRleHQmIGxheW91dENvbnRleHQsIGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRl
eHRSb290KQorICAgIDogbV9sYXlvdXRDb250ZXh0KGxheW91dENvbnRleHQpCisgICAgLCBtX2Zv
cm1hdHRpbmdDb250ZXh0Um9vdChtYWtlV2Vha1B0cihjb25zdF9jYXN0PEJveCY+KGZvcm1hdHRp
bmdDb250ZXh0Um9vdCkpKQoreworfQorCisjaWZuZGVmIE5ERUJVRworc3RhdGljIGJvb2wgYmVs
b25nc1RvVGhpc0Zsb2F0aW5nQ29udGV4dChjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgQm94
JiBmbG9hdGluZ1N0YXRlUm9vdCkKK3sKKyAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dFJvb3Qg
PSBsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCk7CisgICAgaWYgKCZmb3JtYXR0aW5n
Q29udGV4dFJvb3QgPT0gJmZsb2F0aW5nU3RhdGVSb290KQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIC8vIE1heWJlIHRoZSBsYXlvdXQgYm94IGJlbG9uZ3MgdG8gYW4gaW5saW5lIGZvcm1h
dHRpbmcgY29udGV4dCB0aGF0IGluaGVyaXRzIHRoZSBmbG9hdGluZyBzdGF0ZSBmcm9tIHRoZSBw
YXJlbnQgKGJsb2NrKSBmb3JtYXR0aW5nIGNvbnRleHQuIAorICAgIGlmICghZm9ybWF0dGluZ0Nv
bnRleHRSb290LmVzdGFibGlzaGVzSW5saW5lRm9ybWF0dGluZ0NvbnRleHQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuICZmb3JtYXR0aW5nQ29udGV4dFJvb3QuZm9ybWF0
dGluZ0NvbnRleHRSb290KCkgPT0gJmZsb2F0aW5nU3RhdGVSb290OworfQorI2VuZGlmCisKK3Zv
aWQgRmxvYXRpbmdTdGF0ZTo6cmVtb3ZlKGNvbnN0IEJveCYgbGF5b3V0Qm94KQoreworICAgIGZv
ciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtX2Zsb2F0cy5zaXplKCk7ICsraW5kZXgpIHsK
KyAgICAgICAgaWYgKCZtX2Zsb2F0c1tpbmRleF0ubGF5b3V0Qm94KCkgPT0gJmxheW91dEJveCkg
eworICAgICAgICAgICAgbV9mbG9hdHMucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKwordm9p
ZCBGbG9hdGluZ1N0YXRlOjphcHBlbmQoY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgQVNT
RVJUKGlzPENvbnRhaW5lcj4oKm1fZm9ybWF0dGluZ0NvbnRleHRSb290KSk7CisgICAgQVNTRVJU
KGJlbG9uZ3NUb1RoaXNGbG9hdGluZ0NvbnRleHQobGF5b3V0Qm94LCAqbV9mb3JtYXR0aW5nQ29u
dGV4dFJvb3QpKTsKKworICAgIC8vIEZsb2F0aW5nIHN0YXRlIHNob3VsZCBob2xkIGJveGVzIHdp
dGggY29tcHV0ZWQgcG9zaXRpb24vc2l6ZS4KKyAgICBBU1NFUlQobV9sYXlvdXRDb250ZXh0LmRp
c3BsYXlCb3hGb3JMYXlvdXRCb3gobGF5b3V0Qm94KSk7CisgICAgQVNTRVJUKGlzPENvbnRhaW5l
cj4oKm1fZm9ybWF0dGluZ0NvbnRleHRSb290KSk7CisKKyAgICBtX2Zsb2F0cy5hcHBlbmQoeyBs
YXlvdXRCb3gsICp0aGlzIH0pOworfQorCitzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0
aW5nU3RhdGU6OmJvdHRvbShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgQ2xlYXIg
dHlwZSkgY29uc3QKK3sKKyAgICBpZiAobV9mbG9hdHMuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4geyB9OworCisgICAgLy8gVE9ETzogQ3VycmVudGx5IHRoaXMgaXMgb25seSBjYWxsZWQgb25j
ZSBmb3IgZWFjaCBmb3JtYXR0aW5nIGNvbnRleHQgcm9vdCB3aXRoIGZsb2F0cyBwZXIgbGF5b3V0
LgorICAgIC8vIENhY2hlIHRoZSB2YWx1ZSBpZiB3ZSBlbmQgdXAgY2FsbGluZyBpdCBtb3JlIGZy
ZXF1ZW50bHkgKGFuZCB1cGRhdGUgaXQgYXQgYXBwZW5kL3JlbW92ZSkuCisgICAgc3RkOjpvcHRp
b25hbDxMYXlvdXRVbml0PiBib3R0b207CisgICAgZm9yIChhdXRvJiBmbG9hdEl0ZW0gOiBtX2Zs
b2F0cykgeworICAgICAgICAvLyBJZ25vcmUgZmxvYXRzIGZyb20gb3RoZXIgZm9ybWF0dGluZyBj
b250ZXh0cyB3aGVuIHRoZSBmbG9hdGluZyBzdGF0ZSBpcyBpbmhlcml0ZWQuCisgICAgICAgIGlm
ICgmZm9ybWF0dGluZ0NvbnRleHRSb290ICE9ICZmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuZm9ybWF0
dGluZ0NvbnRleHRSb290KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAo
KHR5cGUgPT0gQ2xlYXI6OkxlZnQgJiYgIWZsb2F0SXRlbS5sYXlvdXRCb3goKS5pc0xlZnRGbG9h
dGluZ1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHx8ICh0eXBlID09IENsZWFyOjpSaWdodCAm
JiAhZmxvYXRJdGVtLmxheW91dEJveCgpLmlzUmlnaHRGbG9hdGluZ1Bvc2l0aW9uZWQoKSkpCisg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBhdXRvIGZsb2F0c0JvdHRvbSA9IGZsb2F0
SXRlbS5kaXNwbGF5Qm94KCkucmVjdFdpdGhNYXJnaW4oKS5ib3R0b20oKTsKKyAgICAgICAgaWYg
KGJvdHRvbSkgeworICAgICAgICAgICAgYm90dG9tID0gc3RkOjptYXgoKmJvdHRvbSwgZmxvYXRz
Qm90dG9tKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJvdHRv
bSA9IGZsb2F0c0JvdHRvbTsKKyAgICB9CisgICAgcmV0dXJuIGJvdHRvbTsKK30KKworfQorfQor
I2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxvYXRmb3JtYXR0aW5n
L0Zsb2F0aW5nU3RhdGUuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbG9hdGZvcm1hdHRpbmcv
RmxvYXRpbmdTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjlhN2UyYjQyNGY4Yzc5ZTQ0MjNhZDM2OTJiZGNh
NjljMmIxNzJiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxv
YXRmb3JtYXR0aW5nL0Zsb2F0aW5nU3RhdGUuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisg
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQor
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQp
CisKKyNpbmNsdWRlICJEaXNwbGF5Qm94LmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvYy5oPgor
I2luY2x1ZGUgPHd0Zi9SZWYuaD4KKyNpbmNsdWRlIDx3dGYvV2Vha1B0ci5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK25hbWVzcGFjZSBMYXlvdXQgeworCitjbGFzcyBCb3g7CitjbGFzcyBD
b250YWluZXI7CitjbGFzcyBGb3JtYXR0aW5nU3RhdGU7CitjbGFzcyBMYXlvdXRDb250ZXh0Owor
CisvLyBGbG9hdGluZ1N0YXRlIGhvbGRzIHRoZSBmbG9hdGluZyBib3hlcyBwZXIgZm9ybWF0dGlu
ZyBjb250ZXh0LgorY2xhc3MgRmxvYXRpbmdTdGF0ZSA6IHB1YmxpYyBSZWZDb3VudGVkPEZsb2F0
aW5nU3RhdGU+IHsKKyAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKEZsb2F0aW5nU3RhdGUpOwor
cHVibGljOgorICAgIHN0YXRpYyBSZWY8RmxvYXRpbmdTdGF0ZT4gY3JlYXRlKExheW91dENvbnRl
eHQmIGxheW91dENvbnRleHQsIGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSB7IHJl
dHVybiBhZG9wdFJlZigqbmV3IEZsb2F0aW5nU3RhdGUobGF5b3V0Q29udGV4dCwgZm9ybWF0dGlu
Z0NvbnRleHRSb290KSk7IH0KKworICAgIHZvaWQgYXBwZW5kKGNvbnN0IEJveCYgbGF5b3V0Qm94
KTsKKyAgICB2b2lkIHJlbW92ZShjb25zdCBCb3gmIGxheW91dEJveCk7CisKKyAgICBib29sIGlz
RW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0cy5pc0VtcHR5KCk7IH0KKworICAgIHN0ZDo6
b3B0aW9uYWw8TGF5b3V0VW5pdD4gbGVmdEJvdHRvbShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250
ZXh0Um9vdCkgY29uc3Q7CisgICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiByaWdodEJvdHRv
bShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3Q7CisgICAgc3RkOjpvcHRp
b25hbDxMYXlvdXRVbml0PiBib3R0b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3Qp
IGNvbnN0OworCisgICAgY2xhc3MgRmxvYXRJdGVtIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEZs
b2F0SXRlbShjb25zdCBCb3gmLCBjb25zdCBGbG9hdGluZ1N0YXRlJik7CisKKyAgICAgICAgY29u
c3QgQm94JiBsYXlvdXRCb3goKSBjb25zdCB7IHJldHVybiAqbV9sYXlvdXRCb3g7IH0KKyAgICAg
ICAgY29uc3QgQ29udGFpbmVyJiBjb250YWluaW5nQmxvY2soKSBjb25zdCB7IHJldHVybiAqbV9j
b250YWluaW5nQmxvY2s7IH0KKworICAgICAgICBjb25zdCBEaXNwbGF5OjpCb3gmIGRpc3BsYXlC
b3goKSBjb25zdCB7IHJldHVybiBtX2Fic29sdXRlRGlzcGxheUJveDsgfQorICAgICAgICBjb25z
dCBEaXNwbGF5OjpCb3gmIGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3goKSBjb25zdCB7IHJldHVy
biBtX2NvbnRhaW5pbmdCbG9ja0Fic29sdXRlRGlzcGxheUJveDsgfQorCisgICAgcHJpdmF0ZToK
KyAgICAgICAgV2Vha1B0cjxCb3g+IG1fbGF5b3V0Qm94OworICAgICAgICBXZWFrUHRyPENvbnRh
aW5lcj4gbV9jb250YWluaW5nQmxvY2s7CisKKyAgICAgICAgRGlzcGxheTo6Qm94IG1fYWJzb2x1
dGVEaXNwbGF5Qm94OworICAgICAgICBEaXNwbGF5OjpCb3ggbV9jb250YWluaW5nQmxvY2tBYnNv
bHV0ZURpc3BsYXlCb3g7CisgICAgfTsKKyAgICB1c2luZyBGbG9hdExpc3QgPSBWZWN0b3I8Rmxv
YXRJdGVtPjsKKyAgICBjb25zdCBGbG9hdExpc3QmIGZsb2F0cygpIGNvbnN0IHsgcmV0dXJuIG1f
ZmxvYXRzOyB9CisgICAgY29uc3QgRmxvYXRJdGVtKiBsYXN0KCkgY29uc3QgeyByZXR1cm4gaXNF
bXB0eSgpID8gbnVsbHB0ciA6ICZtX2Zsb2F0cy5sYXN0KCk7IH0KKworcHJpdmF0ZToKKyAgICBm
cmllbmQgY2xhc3MgRmxvYXRpbmdDb250ZXh0OworICAgIEZsb2F0aW5nU3RhdGUoTGF5b3V0Q29u
dGV4dCYsIGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290KTsKKworICAgIExheW91dENv
bnRleHQmIGxheW91dENvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2xheW91dENvbnRleHQ7IH0K
KyAgICBjb25zdCBCb3gmIHJvb3QoKSBjb25zdCB7IHJldHVybiAqbV9mb3JtYXR0aW5nQ29udGV4
dFJvb3Q7IH0KKworICAgIHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gYm90dG9tKGNvbnN0IEJv
eCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBDbGVhcikgY29uc3Q7CisKKyAgICBMYXlvdXRDb250
ZXh0JiBtX2xheW91dENvbnRleHQ7CisgICAgV2Vha1B0cjxCb3g+IG1fZm9ybWF0dGluZ0NvbnRl
eHRSb290OworICAgIEZsb2F0TGlzdCBtX2Zsb2F0czsKK307CisKK2lubGluZSBzdGQ6Om9wdGlv
bmFsPExheW91dFVuaXQ+IEZsb2F0aW5nU3RhdGU6OmxlZnRCb3R0b20oY29uc3QgQm94JiBmb3Jt
YXR0aW5nQ29udGV4dFJvb3QpIGNvbnN0Cit7IAorICAgIHJldHVybiBib3R0b20oZm9ybWF0dGlu
Z0NvbnRleHRSb290LCBDbGVhcjo6TGVmdCk7Cit9CisKK2lubGluZSBzdGQ6Om9wdGlvbmFsPExh
eW91dFVuaXQ+IEZsb2F0aW5nU3RhdGU6OnJpZ2h0Qm90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGlu
Z0NvbnRleHRSb290KSBjb25zdAoreworICAgIHJldHVybiBib3R0b20oZm9ybWF0dGluZ0NvbnRl
eHRSb290LCBDbGVhcjo6UmlnaHQpOworfQorCitpbmxpbmUgc3RkOjpvcHRpb25hbDxMYXlvdXRV
bml0PiBGbG9hdGluZ1N0YXRlOjpib3R0b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJv
b3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENs
ZWFyOjpCb3RoKTsKK30KKworfQorfQorI2VuZGlmCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>347791</attachid>
            <date>2018-08-22 07:54:49 -0700</date>
            <delta_ts>2018-08-22 09:07:45 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-188846-20180822075446.patch</filename>
            <type>text/plain</type>
            <size>77340</size>
            <attacher name="alan">zalan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjM1MTcwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGE4NTY3MjZlMjVkZDEy
ZGI4Y2IyOTc2NWUxZjRmMmY2OGM2YWU5Yy4uYTA4NDRmYzU5OGMxMzFmYTQ5ZWZiN2Y0ZmRkNmMw
YzdhZWYzNTkyOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY0IEBACisyMDE4LTA4LTIyICBaYWxh
biBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CisKKyAgICAgICAgW0xGQ11bRmxvYXRpbmddIE1v
dmUgZmlsZXMgdG8gYSBkZWRpY2F0ZWQgZGlyZWN0b3J5LgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg4ODQ2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgbGF5b3V0L0Zsb2F0KiAtPiBsYXlvdXQvZmxvYXRm
b3JtYXR0aW5nCisKKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6
CisgICAgICAgICogbGF5b3V0L2Zsb2F0Zm9ybWF0dGluZy9GbG9hdGluZ0NvbnRleHQuY3BwOiBS
ZW5hbWVkIGZyb20gU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nQ29udGV4dC5jcHAuCisg
ICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFpcjo6aXNFbXB0eSBjb25zdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFpcjo6dmVydGljYWxQb3NpdGlvbiBj
b25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6Okl0ZXJhdG9yOjpvcGVyYXRvciogY29u
c3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpiZWdpbik6CisgICAgICAgIChXZWJDb3Jl
OjpMYXlvdXQ6OmVuZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4
dDo6RmxvYXRpbmdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdD
b250ZXh0Ojpwb3NpdGlvbkZvckZsb2F0IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91
dDo6RmxvYXRpbmdDb250ZXh0Ojp2ZXJ0aWNhbFBvc2l0aW9uV2l0aENsZWFyYW5jZSBjb25zdCk6
CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4dDo6ZmxvYXRpbmdQb3Np
dGlvbiBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4dDo6
aW5pdGlhbFZlcnRpY2FsUG9zaXRpb24gY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0
OjpGbG9hdGluZ0NvbnRleHQ6OmFsaWduV2l0aENvbnRhaW5pbmdCbG9jayBjb25zdCk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4dDo6YWxpZ25XaXRoRmxvYXRpbmdz
IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdDb250ZXh0Ojp0b0Nv
bnRhaW5pbmdCbG9jayBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5n
UGFpcjo6RmxvYXRpbmdQYWlyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdQ
YWlyOjpsZWZ0IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdQYWly
OjpyaWdodCBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFpcjo6
aW50ZXJzZWN0cyBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFp
cjo6b3BlcmF0b3IgPT0gY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGlu
Z1BhaXI6OmJvdHRvbSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6Okl0ZXJhdG9y
OjpJdGVyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OnByZXZpb3VzRmxvYXRpbmdJ
bmRleCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6Okl0ZXJhdG9yOjpvcGVyYXRvcisrKToK
KyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6SXRlcmF0b3I6OnNldCk6CisgICAgICAgIChXZWJD
b3JlOjpMYXlvdXQ6Okl0ZXJhdG9yOjpvcGVyYXRvcj09IGNvbnN0KToKKyAgICAgICAgKFdlYkNv
cmU6OkxheW91dDo6SXRlcmF0b3I6Om9wZXJhdG9yIT0gY29uc3QpOgorICAgICAgICAqIGxheW91
dC9mbG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdDb250ZXh0Lmg6IFJlbmFtZWQgZnJvbSBTb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdDb250ZXh0LmguCisgICAgICAgIChXZWJDb3JlOjpMYXlv
dXQ6OkZsb2F0aW5nQ29udGV4dDo6ZmxvYXRpbmdTdGF0ZSBjb25zdCk6CisgICAgICAgIChXZWJD
b3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4dDo6bGF5b3V0Q29udGV4dCBjb25zdCk6CisgICAg
ICAgICogbGF5b3V0L2Zsb2F0Zm9ybWF0dGluZy9GbG9hdGluZ1N0YXRlLmNwcDogUmVuYW1lZCBm
cm9tIFNvdXJjZS9XZWJDb3JlL2xheW91dC9GbG9hdGluZ1N0YXRlLmNwcC4KKyAgICAgICAgKFdl
YkNvcmU6OkxheW91dDo6RmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtOjpGbG9hdEl0ZW0pOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpGbG9hdGluZ1N0YXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheW91dDo6YmVsb25nc1RvVGhpc0Zsb2F0aW5nQ29udGV4dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OnJlbW92ZSk6CisgICAgICAg
IChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OmFwcGVuZCk6CisgICAgICAgIChXZWJD
b3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OmJvdHRvbSBjb25zdCk6CisgICAgICAgICogbGF5
b3V0L2Zsb2F0Zm9ybWF0dGluZy9GbG9hdGluZ1N0YXRlLmg6IFJlbmFtZWQgZnJvbSBTb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdTdGF0ZS5oLgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0
OjpGbG9hdGluZ1N0YXRlOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9h
dGluZ1N0YXRlOjppc0VtcHR5IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Rmxv
YXRpbmdTdGF0ZTo6RmxvYXRJdGVtOjpsYXlvdXRCb3ggY29uc3QpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW06OmNvbnRhaW5pbmdCbG9jayBjb25z
dCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbTo6
ZGlzcGxheUJveCBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3Rh
dGU6OkZsb2F0SXRlbTo6Y29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCBjb25zdCk6CisgICAgICAg
IChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OmZsb2F0cyBjb25zdCk6CisgICAgICAg
IChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6Omxhc3QgY29uc3QpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpsYXlvdXRDb250ZXh0IGNvbnN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdTdGF0ZTo6cm9vdCBjb25zdCk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OmxlZnRCb3R0b20gY29uc3QpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpyaWdodEJvdHRvbSBjb25z
dCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OmJvdHRvbSBjb25z
dCk6CisKIDIwMTgtMDgtMjIgIFphbGFuIEJ1anRhcyAgPHphbGFuQGFwcGxlLmNvbT4KIAogICAg
ICAgICBBZGQgY2hhbmdlcyBtaXNzaW5nIGZyb20gcjIzNDkyNS4KZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL1NvdXJjZXMudHh0IGIvU291cmNlL1dlYkNvcmUvU291cmNlcy50eHQKaW5kZXgg
ZjBlZjc4NjEwZGQwNDZiMzY3MjcyYzA1YWFjNjc0NDU4NWM5MzhhMi4uYzVkZTNmOGY1YTg5ZmQ1
ZjA5Y2Q3YjlkZGIxZTU0N2U3OGNkYWE1NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvU291
cmNlcy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvU291cmNlcy50eHQKQEAgLTEyMTcsOCArMTIx
Nyw2IEBAIGluc3BlY3Rvci9hZ2VudHMvd29ya2VyL1dvcmtlckRlYnVnZ2VyQWdlbnQuY3BwCiBp
bnNwZWN0b3IvYWdlbnRzL3dvcmtlci9Xb3JrZXJOZXR3b3JrQWdlbnQuY3BwCiBpbnNwZWN0b3Iv
YWdlbnRzL3dvcmtlci9Xb3JrZXJSdW50aW1lQWdlbnQuY3BwCiAKLWxheW91dC9GbG9hdGluZ0Nv
bnRleHQuY3BwCi1sYXlvdXQvRmxvYXRpbmdTdGF0ZS5jcHAKIGxheW91dC9Gb3JtYXR0aW5nQ29u
dGV4dC5jcHAKIGxheW91dC9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAogbGF5b3V0L0Zv
cm1hdHRpbmdTdGF0ZS5jcHAKQEAgLTEyMzAsNiArMTIyOCw4IEBAIGxheW91dC9ibG9ja2Zvcm1h
dHRpbmcvQmxvY2tGb3JtYXR0aW5nU3RhdGUuY3BwCiBsYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Js
b2NrTWFyZ2luQ29sbGFwc2UuY3BwCiBsYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2NrSW52YWxp
ZGF0aW9uLmNwcAogbGF5b3V0L2Rpc3BsYXl0cmVlL0Rpc3BsYXlCb3guY3BwCitsYXlvdXQvZmxv
YXRmb3JtYXR0aW5nL0Zsb2F0aW5nQ29udGV4dC5jcHAKK2xheW91dC9mbG9hdGZvcm1hdHRpbmcv
RmxvYXRpbmdTdGF0ZS5jcHAKIGxheW91dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRp
bmdDb250ZXh0LmNwcAogbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lRm9ybWF0dGluZ1N0
YXRlLmNwcAogbGF5b3V0L2lubGluZWZvcm1hdHRpbmcvSW5saW5lSW52YWxpZGF0aW9uLmNwcApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmlu
ZGV4IDFkNjRiMzJmNGExMzIwODIzYTU4NjdkMGE1ZjFkZDQxYTRiOGU2YjMuLmU4NzlhNGYyYjY2
Yjc0NjIzM2UzM2VjMGQ0NzViMzIyZDg1ZjhiMWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9X
ZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTE5ODksNiArMTk4OSw4IEBACiAJ
CTZGOTk1QTM4MUE3MDgzMzcwMEE3MzVGNCAvKiBKU1dlYkdMVHJhbnNmb3JtRmVlZGJhY2suaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDZGOTk1QTJFMUE3
MDgzMzcwMEE3MzVGNCAvKiBKU1dlYkdMVHJhbnNmb3JtRmVlZGJhY2suaCAqLzsgfTsKIAkJNkY5
OTVBM0ExQTcwODMzNzAwQTczNUY0IC8qIEpTV2ViR0xWZXJ0ZXhBcnJheU9iamVjdC5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNkY5OTVBMzAxQTcwODMz
NzAwQTczNUY0IC8qIEpTV2ViR0xWZXJ0ZXhBcnJheU9iamVjdC5oICovOyB9OwogCQk2RkE0NDU0
RTg5OEYyRkMxNjhCQzM4QzEgLyogSlNCZWZvcmVVbmxvYWRFdmVudC5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMjlFMDRBMjdCRUQyRjgxRjk4RTkwMjJC
IC8qIEpTQmVmb3JlVW5sb2FkRXZlbnQuaCAqLzsgfTsKKwkJNkZDRkMwNTcyMTJEQUQ2MTAwNzY5
NUQyIC8qIEZsb2F0aW5nU3RhdGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gMTE1Q0ZBODEyMDhCOEVEQTAwMUU2OTkxIC8qIEZsb2F0aW5nU3RhdGUu
Y3BwICovOyB9OworCQk2RkNGQzA1ODIxMkRBRDgzMDA3Njk1RDIgLyogRmxvYXRpbmdDb250ZXh0
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDExNUNG
QTg1MjA4QjkwNjYwMDFFNjk5MSAvKiBGbG9hdGluZ0NvbnRleHQuY3BwICovOyB9OwogCQk3MDlB
MDFGRTFFM0QwQkREMDA2QjBENEMgLyogTW9kdWxlRmV0Y2hGYWlsdXJlS2luZC5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzA5QTAxRkQxRTNEMEJDQzAw
NkIwRDRDIC8qIE1vZHVsZUZldGNoRmFpbHVyZUtpbmQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklC
VVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk3MTAyNUVDRDFGOTlGMENFMDA0QTI1MEMgLyog
QW5pbWF0aW9uVGltZWxpbmUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDcxMDI1RUM3MUY5OUYwOTYwMDRBMjUwQyAvKiBBbmltYXRpb25UaW1lbGluZS5o
ICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTcxMDI1
RUQwMUY5OUYwQ0UwMDRBMjUwQyAvKiBEb2N1bWVudFRpbWVsaW5lLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3MTAyNUVDNTFGOTlGMDk2MDA0QTI1MEMg
LyogRG9jdW1lbnRUaW1lbGluZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZh
dGUsICk7IH07IH07CkBAIC0xNTY2NSwxMiArMTU2NjcsOSBAQAogCQkJY2hpbGRyZW4gPSAoCiAJ
CQkJMTE1Q0ZBOTkyMDhCQzA5QTAwMUU2OTkxIC8qIGJsb2NrZm9ybWF0dGluZyAqLywKIAkJCQkx
MTk5RkE1ODIwOEUzQzRDMDAyMzU4Q0MgLyogZGlzcGxheXRyZWUgKi8sCisJCQkJNkZDRkMwNTUy
MTJEQUNDMjAwNzY5NUQyIC8qIGZsb2F0Zm9ybWF0dGluZyAqLywKIAkJCQkxMTVDRkE5QTIwOEJD
MTQwMDAxRTY5OTEgLyogaW5saW5lZm9ybWF0dGluZyAqLywKIAkJCQkxMTVDRkE5MDIwOEI5NDQx
MDAxRTY5OTEgLyogbGF5b3V0dHJlZSAqLywKLQkJCQkxMTVDRkE4NTIwOEI5MDY2MDAxRTY5OTEg
LyogRmxvYXRpbmdDb250ZXh0LmNwcCAqLywKLQkJCQkxMTVDRkE4NDIwOEI5MDY2MDAxRTY5OTEg
LyogRmxvYXRpbmdDb250ZXh0LmggKi8sCi0JCQkJMTE1Q0ZBODEyMDhCOEVEQTAwMUU2OTkxIC8q
IEZsb2F0aW5nU3RhdGUuY3BwICovLAotCQkJCTExNUNGQTgwMjA4QjhFREEwMDFFNjk5MSAvKiBG
bG9hdGluZ1N0YXRlLmggKi8sCiAJCQkJMTE1Q0ZBNjkyMDhBRjdEMDAwMUU2OTkxIC8qIEZvcm1h
dHRpbmdDb250ZXh0LmNwcCAqLywKIAkJCQkxMTVDRkE2ODIwOEFGN0QwMDAxRTY5OTEgLyogRm9y
bWF0dGluZ0NvbnRleHQuaCAqLywKIAkJCQk2RkJCODYwNTIwQjQ2NEI2MDBEQUQ5MzggLyogRm9y
bWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAgKi8sCkBAIC0xOTQ3MSw2ICsxOTQ3MCwxNyBAQAog
CQkJcGF0aCA9IHNpbXBsZTsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CiAJCX07CisJCTZG
Q0ZDMDU1MjEyREFDQzIwMDc2OTVEMiAvKiBmbG9hdGZvcm1hdHRpbmcgKi8gPSB7CisJCQlpc2Eg
PSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTExNUNGQTg1MjA4QjkwNjYwMDFFNjk5
MSAvKiBGbG9hdGluZ0NvbnRleHQuY3BwICovLAorCQkJCTExNUNGQTg0MjA4QjkwNjYwMDFFNjk5
MSAvKiBGbG9hdGluZ0NvbnRleHQuaCAqLywKKwkJCQkxMTVDRkE4MTIwOEI4RURBMDAxRTY5OTEg
LyogRmxvYXRpbmdTdGF0ZS5jcHAgKi8sCisJCQkJMTE1Q0ZBODAyMDhCOEVEQTAwMUU2OTkxIC8q
IEZsb2F0aW5nU3RhdGUuaCAqLywKKwkJCSk7CisJCQlwYXRoID0gZmxvYXRmb3JtYXR0aW5nOwor
CQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKIAkJNkZFN0REREQyMEVDNkU4QjAwOEI1
QjRFIC8qIHRleHRsYXlvdXQgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVu
ID0gKApAQCAtMzEzNjksNiArMzEzNzksOCBAQAogCQkJCTVDNDMwNEIwMTkxQUM5MDgwMDBFMkJD
MCAvKiBFWFRTaGFkZXJUZXh0dXJlTE9ELmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTcyN0FGRUQ0
MUEyRUE2QUUwMDA0NDJFOCAvKiBFWFRzUkdCLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTc3Mjg2
OTRFMTRGODg4MjUwMEY0ODREQyAvKiBFWFRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMuY3BwIGlu
IFNvdXJjZXMgKi8sCisJCQkJNkZDRkMwNTgyMTJEQUQ4MzAwNzY5NUQyIC8qIEZsb2F0aW5nQ29u
dGV4dC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk2RkNGQzA1NzIxMkRBRDYxMDA3Njk1RDIgLyog
RmxvYXRpbmdTdGF0ZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk3Q0U2Q0JGRDE4N0YzOTQ5MDBE
NDZCRjUgLyogRm9ybWF0Q29udmVydGVyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTUxQTRCQjBB
MTk1NEQ2MTYwMEZBNUMyRSAvKiBHYW1lcGFkLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTUxOEY0
RkY2MTk0Q0E0RTYwMDgxQkFBRSAvKiBHYW1lcGFkQnV0dG9uLmNwcCBpbiBTb3VyY2VzICovLApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nQ29udGV4dC5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdDb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggNGZlYWVhMjdiZTE4MGM1YzEwZjRlZDkyNThiMGFiZjQyYzM4YTc3YS4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvRmxvYXRpbmdDb250ZXh0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUxNiAr
MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgot
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkZsb2F0
aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0K
LSNpbmNsdWRlICJEaXNwbGF5Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVk
ZSAiTGF5b3V0Q29udGFpbmVyLmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1
ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVz
cGFjZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoRmxvYXRpbmdDb250
ZXh0KTsKLQotLy8gRmluZGluZyB0aGUgdG9wL2xlZnQgcG9zaXRpb24gZm9yIGEgbmV3IGZsb2F0
aW5nKEYpCi0vLyAgX19fXyAgX19fXyAgX19fX18gICAgICAgICAgICAgICBfX19fX19fCi0vLyB8
ICAgIHx8IEwyIHx8ICAgICB8IDwtLS0tLTEtLS0tPnwgICAgICAgfAotLy8gfCAgICB8fF9fX198
fCAgTDMgfCAgICAgICAgICAgICB8ICAgUjEgIHwKLS8vIHwgTDEgfCAgICAgIHxfX19fX3wgICAg
ICAgICAgICAgfCAgICAgICB8Ci0vLyB8X19fX3wgPC0tLS0tLS0tLS0tLS0yLS0tLS0tLS0tPnwg
ICAgICAgfAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKLS8v
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX198Ci0vLwotLy8gMS4gQ29t
cHV0ZSB0aGUgaW5pdGlhbCB2ZXJ0aWNhbCBwb3NpdGlvbiBmb3IgKEYpIC0+ICgxKQotLy8gMi4g
RmluZCB0aGUgY29ycmVzcG9uZGluZyBmbG9hdGluZyBwYWlyIChMMy1SMSkKLS8vIDMuIEFsaWdu
IChGKSBob3Jpem9udGFsbHkgd2l0aCAoTDMtUjEpIGRlcGVuZGluZyB3aGV0aGVyIChGKSBpcyBs
ZWZ0L3JpZ2h0IHBvc2l0aW9uZWQKLS8vIDQuIEludGVyc2VjdCAoRikgd2l0aCAoTDMtUjEpCi0v
LyA1LiBJZiAoRikgZG9lcyBub3QgZml0LCBmaW5kIHRoZSBuZXh0IGZsb2F0aW5nIHBhaXIgKEwx
LVIxKQotLy8gNi4gUmVwZWF0IHVudGlsIGVpdGhlciAoRikgZml0cy9ubyBtb3JlIGZsb2F0cy4K
LS8vIE5vdGUgdGhhdCBhbGwgY29vcmRpbmF0ZXMgYXJlIGluIHRoZSBjb29yZGluYXRlIHN5c3Rl
bSBvZiB0aGUgZm9ybWF0dGluZyByb290LgotLy8gVGhlIGZvcm1hdHRpbmcgcm9vdCBoZXJlIGlz
IGFsd2F5cyB0aGUgb25lIHRoYXQgZXN0YWJsaXNoZXMgdGhlIGZsb2F0aW5nIGNvbnRleHQgKHNl
ZSBpbmhlcml0ZWQgZmxvYXRpbmcgY29udGV4dCkuCi0vLyAoSXQgc2ltcGx5IG1lYW5zIHRoYXQg
dGhlIGZsb2F0IGJveCdzIGZvcm1hdHRpbmcgcm9vdCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNh
bWUgYXMgdGhlIEZvcm1hdHRpbmdDb250ZXh0J3Mgcm9vdC4pCi0KLWNsYXNzIEl0ZXJhdG9yOwot
Ci1jbGFzcyBGbG9hdGluZ1BhaXIgewotcHVibGljOgotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0
IHsgcmV0dXJuICFtX2xlZnRJbmRleCAmJiAhbV9yaWdodEluZGV4OyB9Ci0gICAgY29uc3QgRGlz
cGxheTo6Qm94KiBsZWZ0KCkgY29uc3Q7Ci0gICAgY29uc3QgRGlzcGxheTo6Qm94KiByaWdodCgp
IGNvbnN0OwotICAgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBEaXNwbGF5OjpCb3g6OlJlY3QmKSBj
b25zdDsKLSAgICBMYXlvdXRVbml0IHZlcnRpY2FsUG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBt
X3ZlcnRpY2FsUG9zaXRpb247IH0KLSAgICBMYXlvdXRVbml0IGJvdHRvbSgpIGNvbnN0OwotICAg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBGbG9hdGluZ1BhaXImKSBjb25zdDsKLQotcHJpdmF0ZToK
LSAgICBmcmllbmQgY2xhc3MgSXRlcmF0b3I7Ci0gICAgRmxvYXRpbmdQYWlyKGNvbnN0IEZsb2F0
aW5nU3RhdGU6OkZsb2F0TGlzdCYpOwotCi0gICAgY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRM
aXN0JiBtX2Zsb2F0czsKLQotICAgIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IG1fbGVmdEluZGV4
OwotICAgIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IG1fcmlnaHRJbmRleDsKLSAgICBMYXlvdXRV
bml0IG1fdmVydGljYWxQb3NpdGlvbjsKLX07Ci0KLWNsYXNzIEl0ZXJhdG9yIHsKLXB1YmxpYzoK
LSAgICBJdGVyYXRvcihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmLCBzdGQ6Om9wdGlv
bmFsPExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRpb24pOwotCi0gICAgY29uc3QgRmxvYXRpbmdQ
YWlyJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBtX2N1cnJlbnQ7IH0KLSAgICBJdGVyYXRv
ciYgb3BlcmF0b3IrKygpOwotICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciYpIGNv
bnN0OwotICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciYpIGNvbnN0OwotCi1wcml2
YXRlOgotICAgIHZvaWQgc2V0KExheW91dFVuaXQgdmVydGljYWxQb3NpdGlvbik7Ci0KLSAgICBj
b25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmIG1fZmxvYXRzOwotICAgIEZsb2F0aW5nUGFp
ciBtX2N1cnJlbnQ7Ci19OwotCi1zdGF0aWMgSXRlcmF0b3IgYmVnaW4oY29uc3QgRmxvYXRpbmdT
dGF0ZSYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0VW5pdCBpbml0aWFsVmVydGljYWxQb3NpdGlvbikK
LXsKLSAgICAvLyBTdGFydCB3aXRoIHRoZSBpbm5lci1tb3N0IGZsb2F0aW5nIHBhaXIgZm9yIHRo
ZSBpbml0aWFsIHZlcnRpY2FsIHBvc2l0aW9uLgotICAgIHJldHVybiBJdGVyYXRvcihmbG9hdGlu
Z1N0YXRlLmZsb2F0cygpLCBpbml0aWFsVmVydGljYWxQb3NpdGlvbik7Ci19Ci0KLXN0YXRpYyBJ
dGVyYXRvciBlbmQoY29uc3QgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSkKLXsKLSAgICBy
ZXR1cm4gSXRlcmF0b3IoZmxvYXRpbmdTdGF0ZS5mbG9hdHMoKSwgc3RkOjpudWxsb3B0KTsKLX0K
LQotRmxvYXRpbmdDb250ZXh0OjpGbG9hdGluZ0NvbnRleHQoRmxvYXRpbmdTdGF0ZSYgZmxvYXRp
bmdTdGF0ZSkKLSAgICA6IG1fZmxvYXRpbmdTdGF0ZShmbG9hdGluZ1N0YXRlKQotewotfQotCi1Q
b3NpdGlvbiBGbG9hdGluZ0NvbnRleHQ6OnBvc2l0aW9uRm9yRmxvYXQoY29uc3QgQm94JiBsYXlv
dXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25l
ZCgpKTsKLSAgICBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0gZmxvYXRJdGVtID0geyBsYXlvdXRC
b3gsIG1fZmxvYXRpbmdTdGF0ZSB9OwotCi0gICAgUG9zaXRpb24gZmxvYXRQb3NpdGlvbjsKLSAg
ICBpZiAobV9mbG9hdGluZ1N0YXRlLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBObyBmbG9hdCBi
b3ggb24gdGhlIGNvbnRleHQgeWV0IC0+IGFsaWduIGl0IHdpdGggdGhlIGNvbnRhaW5pbmcgYmxv
Y2sncyBsZWZ0L3JpZ2h0IGVkZ2UuCi0gICAgICAgIGF1dG8mIGRpc3BsYXlCb3ggPSBmbG9hdEl0
ZW0uZGlzcGxheUJveCgpOwotICAgICAgICBmbG9hdFBvc2l0aW9uID0geyBhbGlnbldpdGhDb250
YWluaW5nQmxvY2soZmxvYXRJdGVtKSArIGRpc3BsYXlCb3gubWFyZ2luTGVmdCgpLCBkaXNwbGF5
Qm94LnRvcCgpIH07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRmluZCB0aGUgdG9wIG1vc3Qg
cG9zaXRpb24gd2hlcmUgdGhlIGZsb2F0IGJveCBmaXRzLgotICAgICAgICBmbG9hdFBvc2l0aW9u
ID0gZmxvYXRpbmdQb3NpdGlvbihmbG9hdEl0ZW0pOwotICAgIH0KLQotICAgIHJldHVybiB0b0Nv
bnRhaW5pbmdCbG9jayhmbG9hdEl0ZW0sIGZsb2F0UG9zaXRpb24pOwotfQotCi1zdGQ6Om9wdGlv
bmFsPExheW91dFVuaXQ+IEZsb2F0aW5nQ29udGV4dDo6dmVydGljYWxQb3NpdGlvbldpdGhDbGVh
cmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJv
eC5oYXNGbG9hdENsZWFyKCkpOwotICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94
KCkpOwotCi0gICAgaWYgKG1fZmxvYXRpbmdTdGF0ZS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
biB7IH07Ci0KLSAgICBhdXRvIGJvdHRvbSA9IFsmXShzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+
IGZsb2F0Qm90dG9tKSAtPiBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHsKLSAgICAgICAgLy8g
J2JvdHRvbScgaXMgaW4gdGhlIGZvcm1hdHRpbmcgcm9vdCdzIGNvb3JkaW5hdGUgc3lzdGVtLgot
ICAgICAgICBpZiAoIWZsb2F0Qm90dG9tKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLQotICAg
ICAgICAvLyA5LjUuMiBDb250cm9sbGluZyBmbG93IG5leHQgdG8gZmxvYXRzOiB0aGUgJ2NsZWFy
JyBwcm9wZXJ0eQotICAgICAgICAvLyBUaGVuIHRoZSBhbW91bnQgb2YgY2xlYXJhbmNlIGlzIHNl
dCB0byB0aGUgZ3JlYXRlciBvZjoKLSAgICAgICAgLy8KLSAgICAgICAgLy8gMS4gVGhlIGFtb3Vu
dCBuZWNlc3NhcnkgdG8gcGxhY2UgdGhlIGJvcmRlciBlZGdlIG9mIHRoZSBibG9jayBldmVuIHdp
dGggdGhlIGJvdHRvbSBvdXRlciBlZGdlIG9mIHRoZSBsb3dlc3QgZmxvYXQgdGhhdCBpcyB0byBi
ZSBjbGVhcmVkLgotICAgICAgICAvLyAyLiBUaGUgYW1vdW50IG5lY2Vzc2FyeSB0byBwbGFjZSB0
aGUgdG9wIGJvcmRlciBlZGdlIG9mIHRoZSBibG9jayBhdCBpdHMgaHlwb3RoZXRpY2FsIHBvc2l0
aW9uLgotCi0gICAgICAgIGF1dG8mIGxheW91dENvbnRleHQgPSB0aGlzLT5sYXlvdXRDb250ZXh0
KCk7Ci0gICAgICAgIGF1dG8mIGRpc3BsYXlCb3ggPSAqbGF5b3V0Q29udGV4dC5kaXNwbGF5Qm94
Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0gICAgICAgIGF1dG8gcm9vdFJlbGF0aXZlVG9wID0g
Rm9ybWF0dGluZ0NvbnRleHQ6Om1hcFRvcExlZnRUb0FuY2VzdG9yKGxheW91dENvbnRleHQsIGxh
eW91dEJveCwgZG93bmNhc3Q8Q29udGFpbmVyPihtX2Zsb2F0aW5nU3RhdGUucm9vdCgpKSkueTsK
LSAgICAgICAgYXV0byBjbGVhcmFuY2UgPSAqZmxvYXRCb3R0b20gLSByb290UmVsYXRpdmVUb3A7
Ci0gICAgICAgIGlmIChjbGVhcmFuY2UgPD0gMCkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0K
LSAgICAgICAgLy8gQ2xlYXJhbmNlIGluaGliaXRzIG1hcmdpbiBjb2xsYXBzaW5nLiBMZXQncyBy
ZXNldCB0aGUgcmVsZXZhbnQgYWRqb2luaW5nIG1hcmdpbnMuCi0gICAgICAgIGlmIChhdXRvKiBw
cmV2aW91c0luRmxvd1NpYmxpbmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkp
IHsKLSAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93RGlzcGxheUJveCA9ICpsYXlvdXRD
b250ZXh0LmRpc3BsYXlCb3hGb3JMYXlvdXRCb3goKnByZXZpb3VzSW5GbG93U2libGluZyk7Ci0K
LSAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBwcmV2aW91cyBpbmZsb3cgc2libGluZyBoYXMgYWxy
ZWFkeSBiZWVuIGxhaWQgb3V0LCBpdHMgbWFyZ2luIGlzIGNvbGxhcHNlZCBieSBub3cuCi0gICAg
ICAgICAgICBBU1NFUlQoIXByZXZpb3VzSW5GbG93RGlzcGxheUJveC5tYXJnaW5Cb3R0b20oKSk7
Ci0gICAgICAgICAgICBhdXRvIGNvbGxhcHNlZE1hcmdpbiA9IGRpc3BsYXlCb3gubWFyZ2luVG9w
KCk7Ci0KLSAgICAgICAgICAgIC8vIFJlc2V0IHByZXZpb3VzIGJvdHRvbSBhbmQgY3VycmVudCB0
b3AgbWFyZ2lucyB0byBub24tY29sbGFwc2luZy4KLSAgICAgICAgICAgIHByZXZpb3VzSW5GbG93
RGlzcGxheUJveC5zZXRWZXJ0aWNhbE1hcmdpbih7IHByZXZpb3VzSW5GbG93RGlzcGxheUJveC5t
YXJnaW5Ub3AoKSwgcHJldmlvdXNJbkZsb3dEaXNwbGF5Qm94Lm5vbkNvbGxhcHNlZE1hcmdpbkJv
dHRvbSgpIH0pOwotICAgICAgICAgICAgZGlzcGxheUJveC5zZXRWZXJ0aWNhbE1hcmdpbih7IGRp
c3BsYXlCb3gubm9uQ29sbGFwc2VkTWFyZ2luVG9wKCksIGRpc3BsYXlCb3gubWFyZ2luQm90dG9t
KCkgfSk7Ci0KLSAgICAgICAgICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0gcHJldmlvdXNJ
bkZsb3dEaXNwbGF5Qm94Lm1hcmdpbkJvdHRvbSgpICsgZGlzcGxheUJveC5tYXJnaW5Ub3AoKTsK
LSAgICAgICAgICAgIGF1dG8gbWFyZ2luT2Zmc2V0ID0gbm9uQ29sbGFwc2VkTWFyZ2luIC0gY29s
bGFwc2VkTWFyZ2luOwotICAgICAgICAgICAgLy8gTW92ZSB0aGUgYm94IHRvIHRoZSBwb3NpdGlv
biB3aGVyZSBpdCB3b3VsZCBiZSB3aXRoIG5vbi1jb2xsYXBzZWQgbWFyZ2lucy4KLSAgICAgICAg
ICAgIHJvb3RSZWxhdGl2ZVRvcCArPSBtYXJnaW5PZmZzZXQ7Ci0KLSAgICAgICAgICAgIC8vIEhh
dmluZyBuZWdhdGl2ZSBjbGVhcmFuY2UgaXMgYWxzbyBub3JtYWwuIEl0IGp1c3QgbWVhbnMgdGhh
dCB0aGUgYm94IHdpdGggdGhlIG5vbi1jb2xsYXBzZWQgbWFyZ2lucyBpcyBub3cgbG93ZXIgdGhh
biBpdCBuZWVkcyB0byBiZS4KLSAgICAgICAgICAgIGNsZWFyYW5jZSAtPSBtYXJnaW5PZmZzZXQ7
Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm93IGFkanVzdCB0aGUgYm94J3MgcG9zaXRpb24gd2l0
aCB0aGUgY2xlYXJhbmNlLgotICAgICAgICByb290UmVsYXRpdmVUb3AgKz0gY2xlYXJhbmNlOwot
ICAgICAgICBBU1NFUlQoKmZsb2F0Qm90dG9tID09IHJvb3RSZWxhdGl2ZVRvcCk7Ci0KLSAgICAg
ICAgLy8gVGhlIHJldHVybiB2ZXJ0aWNhbCBwb3NpdGlvbiBpcyBpbiB0aGUgY29udGFpbmluZyBi
bG9jaydzIGNvb3JkaW5hdGUgc3lzdGVtLgotICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1Jv
b3RSZWxhdGl2ZVRvcCA9IEZvcm1hdHRpbmdDb250ZXh0OjptYXBUb3BMZWZ0VG9BbmNlc3Rvcihs
YXlvdXRDb250ZXh0LCAqbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLCBkb3duY2FzdDxDb250
YWluZXI+KG1fZmxvYXRpbmdTdGF0ZS5yb290KCkpKS55OwotICAgICAgICByZXR1cm4gcm9vdFJl
bGF0aXZlVG9wIC0gY29udGFpbmluZ0Jsb2NrUm9vdFJlbGF0aXZlVG9wOwotICAgIH07Ci0KLSAg
ICBhdXRvIGNsZWFyID0gbGF5b3V0Qm94LnN0eWxlKCkuY2xlYXIoKTsKLSAgICBhdXRvJiBmb3Jt
YXR0aW5nQ29udGV4dFJvb3QgPSBsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCk7Ci0K
LSAgICBpZiAoY2xlYXIgPT0gQ2xlYXI6OkxlZnQpCi0gICAgICAgIHJldHVybiBib3R0b20obV9m
bG9hdGluZ1N0YXRlLmxlZnRCb3R0b20oZm9ybWF0dGluZ0NvbnRleHRSb290KSk7Ci0KLSAgICBp
ZiAoY2xlYXIgPT0gQ2xlYXI6OlJpZ2h0KQotICAgICAgICByZXR1cm4gYm90dG9tKG1fZmxvYXRp
bmdTdGF0ZS5yaWdodEJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsKLQotICAgIGlmIChj
bGVhciA9PSBDbGVhcjo6Qm90aCkKLSAgICAgICAgcmV0dXJuIGJvdHRvbShtX2Zsb2F0aW5nU3Rh
dGUuYm90dG9tKGZvcm1hdHRpbmdDb250ZXh0Um9vdCkpOwotCi0gICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7Ci0gICAgcmV0dXJuIHsgfTsKLX0KLQotUG9zaXRpb24gRmxvYXRpbmdDb250ZXh0Ojpm
bG9hdGluZ1Bvc2l0aW9uKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYgZmxvYXRJdGVt
KSBjb25zdAotewotICAgIGF1dG8gaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24gPSB0aGlzLT5pbml0
aWFsVmVydGljYWxQb3NpdGlvbihmbG9hdEl0ZW0pOwotICAgIGF1dG8mIGRpc3BsYXlCb3ggPSBm
bG9hdEl0ZW0uZGlzcGxheUJveCgpOwotICAgIGF1dG8gbWFyZ2luQm94U2l6ZSA9IGRpc3BsYXlC
b3gubWFyZ2luQm94KCkuc2l6ZSgpOwotCi0gICAgYXV0byBlbmQgPSBMYXlvdXQ6OmVuZChtX2Zs
b2F0aW5nU3RhdGUpOwotICAgIGF1dG8gdG9wID0gaW5pdGlhbFZlcnRpY2FsUG9zaXRpb247Ci0g
ICAgYXV0byBib3R0b21Nb3N0ID0gdG9wOwotICAgIGZvciAoYXV0byBpdGVyYXRvciA9IGJlZ2lu
KG1fZmxvYXRpbmdTdGF0ZSwgaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24pOyBpdGVyYXRvciAhPSBl
bmQ7ICsraXRlcmF0b3IpIHsKLSAgICAgICAgQVNTRVJUKCEoKml0ZXJhdG9yKS5pc0VtcHR5KCkp
OwotCi0gICAgICAgIGF1dG8gZmxvYXRzID0gKml0ZXJhdG9yOwotICAgICAgICB0b3AgPSBmbG9h
dHMudmVydGljYWxQb3NpdGlvbigpOwotCi0gICAgICAgIC8vIE1vdmUgdGhlIGJveCBob3Jpem9u
dGFsbHkgc28gdGhhdCBpdCBhbGlnbnMgd2l0aCB0aGUgY3VycmVudCBmbG9hdGluZyBwYWlyLgot
ICAgICAgICBhdXRvIGxlZnQgPSBhbGlnbldpdGhGbG9hdGluZ3MoZmxvYXRzLCBmbG9hdEl0ZW0p
OwotICAgICAgICAvLyBDaGVjayBpZiB0aGUgYm94IGZpdHMgYXQgdGhpcyB2ZXJ0aWNhbCBwb3Np
dGlvbi4KLSAgICAgICAgaWYgKCFmbG9hdHMuaW50ZXJzZWN0cyh7IHRvcCwgbGVmdCwgbWFyZ2lu
Qm94U2l6ZS53aWR0aCgpLCBtYXJnaW5Cb3hTaXplLmhlaWdodCgpIH0pKQotICAgICAgICAgICAg
cmV0dXJuIHsgbGVmdCArIGRpc3BsYXlCb3gubWFyZ2luTGVmdCgpLCB0b3AgKyBkaXNwbGF5Qm94
Lm1hcmdpblRvcCgpIH07Ci0KLSAgICAgICAgYm90dG9tTW9zdCA9IGZsb2F0cy5ib3R0b20oKTsK
LSAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBmbG9hdGluZyBwYWlyLgotICAgIH0KLQotICAg
IC8vIFBhc3NlZCBhbGwgdGhlIGZsb2F0cyBhbmQgc3RpbGwgZG9lcyBub3QgZml0PwotICAgIHJl
dHVybiB7IGFsaWduV2l0aENvbnRhaW5pbmdCbG9jayhmbG9hdEl0ZW0pICsgZGlzcGxheUJveC5t
YXJnaW5MZWZ0KCksIGJvdHRvbU1vc3QgKyBkaXNwbGF5Qm94Lm1hcmdpblRvcCgpIH07Ci19Ci0K
LUxheW91dFVuaXQgRmxvYXRpbmdDb250ZXh0Ojppbml0aWFsVmVydGljYWxQb3NpdGlvbihjb25z
dCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mIGZsb2F0SXRlbSkgY29uc3QKLXsKLSAgICAvLyBJ
bmNvbWluZyBmbG9hdGluZyBjYW5ub3QgYmUgcGxhY2VkIGhpZ2hlciB0aGFuIGV4aXN0aW5nIGZs
b2F0cy4KLSAgICAvLyBUYWtlIHRoZSBzdGF0aWMgcG9zaXRpb24gKHdoZXJlIHRoZSBib3ggd291
bGQgZ28gaWYgaXQgd2Fzbid0IGZsb2F0aW5nKSBhbmQgYWRqdXN0IGl0IHdpdGggdGhlIGxhc3Qg
ZmxvYXRpbmcuCi0gICAgYXV0byBtYXJnaW5Cb3hUb3AgPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgp
LnJlY3RXaXRoTWFyZ2luKCkudG9wKCk7Ci0KLSAgICBpZiAoYXV0byBsYXN0RmxvYXQgPSBtX2Zs
b2F0aW5nU3RhdGUubGFzdCgpKQotICAgICAgICByZXR1cm4gc3RkOjptYXgobWFyZ2luQm94VG9w
LCBsYXN0RmxvYXQtPmRpc3BsYXlCb3goKS5yZWN0V2l0aE1hcmdpbigpLnRvcCgpKTsKLQotICAg
IHJldHVybiBtYXJnaW5Cb3hUb3A7Ci19Ci0KLUxheW91dFVuaXQgRmxvYXRpbmdDb250ZXh0Ojph
bGlnbldpdGhDb250YWluaW5nQmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBm
bG9hdEl0ZW0pIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhlcmUgaXMgbm8gZmxvYXRpbmcgdG8gYWxp
Z24gd2l0aCwgcHVzaCB0aGUgYm94IHRvIHRoZSBsZWZ0L3JpZ2h0IGVkZ2Ugb2YgaXRzIGNvbnRh
aW5pbmcgYmxvY2sncyBjb250ZW50IGJveC4KLSAgICAvLyAoRWl0aGVyIHRoZXJlJ3Mgbm8gZmxv
YXRzIGF0IGFsbCBvciB0aGlzIGJveCBkb2VzIG5vdCBmaXQgYXQgYW55IHZlcnRpY2FsIHBvc2l0
aW9ucyB3aGVyZSB0aGUgZmxvYXRzIGFyZS4pCi0gICAgYXV0byYgY29udGFpbmluZ0Jsb2NrRGlz
cGxheUJveCA9IGZsb2F0SXRlbS5jb250YWluaW5nQmxvY2tEaXNwbGF5Qm94KCk7Ci0gICAgYXV0
byBjb250YWluaW5nQmxvY2tDb250ZW50Qm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlC
b3gubGVmdCgpICsgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94TGVmdCgpOwot
Ci0gICAgaWYgKGZsb2F0SXRlbS5sYXlvdXRCb3goKS5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQo
KSkKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hMZWZ0OwotCi0gICAg
cmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hMZWZ0ICsgY29udGFpbmluZ0Jsb2NrRGlz
cGxheUJveC5jb250ZW50Qm94V2lkdGgoKSAtIGZsb2F0SXRlbS5kaXNwbGF5Qm94KCkubWFyZ2lu
Qm94KCkud2lkdGgoKTsKLX0KLQotTGF5b3V0VW5pdCBGbG9hdGluZ0NvbnRleHQ6OmFsaWduV2l0
aEZsb2F0aW5ncyhjb25zdCBGbG9hdGluZ1BhaXImIGZsb2F0aW5nUGFpciwgY29uc3QgRmxvYXRp
bmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9hdEl0ZW0pIGNvbnN0Ci17Ci0gICAgLy8gQ29tcHV0ZSB0
aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBmb3IgdGhlIG5ldyBmbG9hdGluZyBieSB0YWtpbmcgYm90
aCB0aGUgY29udGluaW5nIGJsb2NrIGFuZCB0aGUgY3VycmVudCBsZWZ0L3JpZ2h0IGZsb2F0cyBp
bnRvIGFjY291bnQuCi0gICAgYXV0byYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCA9IGZsb2F0
SXRlbS5jb250YWluaW5nQmxvY2tEaXNwbGF5Qm94KCk7Ci0gICAgYXV0byBjb250YWluaW5nQmxv
Y2tDb250ZW50Qm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gubGVmdCgpICsgY29u
dGFpbmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94TGVmdCgpOwotICAgIGF1dG8gY29udGFp
bmluZ0Jsb2NrQ29udGVudEJveFJpZ2h0ID0gY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5sZWZ0
KCkgKyBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LmNvbnRlbnRCb3hSaWdodCgpOwotICAgIGF1
dG8gbWFyZ2luQm94V2lkdGggPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpLm1hcmdpbkJveCgpLndp
ZHRoKCk7Ci0KLSAgICBhdXRvIGxlZnRBbGlnbmVkQm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0Nv
bnRlbnRCb3hMZWZ0OwotICAgIGF1dG8gcmlnaHRBbGlnbmVkQm94TGVmdCA9IGNvbnRhaW5pbmdC
bG9ja0NvbnRlbnRCb3hSaWdodCAtIG1hcmdpbkJveFdpZHRoOwotCi0gICAgaWYgKGZsb2F0aW5n
UGFpci5pc0VtcHR5KCkpIHsKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAg
IHJldHVybiBmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkg
PyBsZWZ0QWxpZ25lZEJveExlZnQgOiByaWdodEFsaWduZWRCb3hMZWZ0OwotICAgIH0KLQotICAg
IGlmIChmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsK
LSAgICAgICAgaWYgKGF1dG8qIGxlZnREaXNwbGF5Qm94ID0gZmxvYXRpbmdQYWlyLmxlZnQoKSkg
ewotICAgICAgICAgICAgYXV0byBsZWZ0RmxvYXRpbmdCb3hSaWdodCA9IGxlZnREaXNwbGF5Qm94
LT5yZWN0V2l0aE1hcmdpbigpLnJpZ2h0KCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RkOjptaW4o
c3RkOjptYXgobGVmdEFsaWduZWRCb3hMZWZ0LCBsZWZ0RmxvYXRpbmdCb3hSaWdodCksIHJpZ2h0
QWxpZ25lZEJveExlZnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbGVm
dEFsaWduZWRCb3hMZWZ0OwotICAgIH0KLQotICAgIEFTU0VSVChmbG9hdEl0ZW0ubGF5b3V0Qm94
KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgpKTsKLQotICAgIGlmIChhdXRvKiByaWdodERp
c3BsYXlCb3ggPSBmbG9hdGluZ1BhaXIucmlnaHQoKSkgewotICAgICAgICBhdXRvIHJpZ2h0Rmxv
YXRpbmdCb3hMZWZ0ID0gcmlnaHREaXNwbGF5Qm94LT5yZWN0V2l0aE1hcmdpbigpLmxlZnQoKTsK
LSAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KHN0ZDo6bWluKHJpZ2h0QWxpZ25lZEJveExlZnQsIHJp
Z2h0RmxvYXRpbmdCb3hMZWZ0IC0gbWFyZ2luQm94V2lkdGgpLCBsZWZ0QWxpZ25lZEJveExlZnQp
OwotICAgIH0KLQotICAgIHJldHVybiByaWdodEFsaWduZWRCb3hMZWZ0OwotfQotCi0vLyBGSVhN
RTogZmluZCBhIGJldHRlciBwbGFjZSBmb3IgdGhpcy4KLVBvc2l0aW9uIEZsb2F0aW5nQ29udGV4
dDo6dG9Db250YWluaW5nQmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9h
dEl0ZW0sIFBvc2l0aW9uIHBvc2l0aW9uKSBjb25zdAotewotICAgIC8vIEZyb20gZm9ybWF0dGlu
ZyByb290IGNvb3JkaW5hdGUgc3lzdGVtIGJhY2sgdG8gY29udGFpbmluZyBibG9jaydzLgotICAg
IGlmICgmZmxvYXRJdGVtLmNvbnRhaW5pbmdCbG9jaygpID09ICZtX2Zsb2F0aW5nU3RhdGUucm9v
dCgpKQotICAgICAgICByZXR1cm4gcG9zaXRpb247Ci0KLSAgICBhdXRvJiBjb250YWluaW5nQmxv
Y2tEaXNwbGF5Qm94ID0gZmxvYXRJdGVtLmNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3goKTsKLSAg
ICByZXR1cm4geyBwb3NpdGlvbi54IC0gY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5sZWZ0KCks
IHBvc2l0aW9uLnkgLSBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LnRvcCgpIH07Ci19Ci0KLUZs
b2F0aW5nUGFpcjo6RmxvYXRpbmdQYWlyKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYg
ZmxvYXRzKQotICAgIDogbV9mbG9hdHMoZmxvYXRzKQotewotfQotCi1jb25zdCBEaXNwbGF5OjpC
b3gqIEZsb2F0aW5nUGFpcjo6bGVmdCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2xlZnRJbmRleCkK
LSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBBU1NFUlQobV9mbG9hdHNbKm1fbGVmdElu
ZGV4XS5sYXlvdXRCb3goKS5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7Ci0gICAgcmV0dXJu
ICZtX2Zsb2F0c1sqbV9sZWZ0SW5kZXhdLmRpc3BsYXlCb3goKTsKLX0KLQotY29uc3QgRGlzcGxh
eTo6Qm94KiBGbG9hdGluZ1BhaXI6OnJpZ2h0KCkgY29uc3QKLXsKLSAgICBpZiAoIW1fcmlnaHRJ
bmRleCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBBU1NFUlQobV9mbG9hdHNbKm1f
cmlnaHRJbmRleF0ubGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgpKTsKLSAg
ICByZXR1cm4gJm1fZmxvYXRzWyptX3JpZ2h0SW5kZXhdLmRpc3BsYXlCb3goKTsKLX0KLQotYm9v
bCBGbG9hdGluZ1BhaXI6OmludGVyc2VjdHMoY29uc3QgRGlzcGxheTo6Qm94OjpSZWN0JiBjYW5k
aWRhdGVSZWN0KSBjb25zdAotewotICAgIGF1dG8gaW50ZXJzZWN0cyA9IFsmXShjb25zdCBEaXNw
bGF5OjpCb3gqIGZsb2F0aW5nLCBGbG9hdCBmbG9hdGluZ1R5cGUpIHsKLSAgICAgICAgaWYgKCFm
bG9hdGluZykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBhdXRvIG1hcmdp
blJlY3QgPSBmbG9hdGluZy0+cmVjdFdpdGhNYXJnaW4oKTsKLSAgICAgICAgLy8gQmVmb3JlIGlu
dGVyc2VjdGluZywgY2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBwb3NpdGlvbiBpcyB0b28gZmFyIHRv
IHRoZSBsZWZ0L3JpZ2h0LgotICAgICAgICAvLyBUaGUgbmV3IGZsb2F0J3MgY29udGFpbmluZyBi
bG9jayBjb3VsZCBwdXNoIHRoZSBjYW5kaWRhdGUgcG9zaXRpb24gYmV5b25kIHRoZSBjdXJyZW50
IGZsb2F0IGhvcml6b250YWxseS4KLSAgICAgICAgaWYgKChmbG9hdGluZ1R5cGUgPT0gRmxvYXQ6
OkxlZnQgJiYgY2FuZGlkYXRlUmVjdC5sZWZ0KCkgPCBtYXJnaW5SZWN0LnJpZ2h0KCkpCi0gICAg
ICAgICAgICB8fCAoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpSaWdodCAmJiBjYW5kaWRhdGVSZWN0
LnJpZ2h0KCkgPiBtYXJnaW5SZWN0LmxlZnQoKSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAgICAgcmV0dXJuIG1hcmdpblJlY3QuaW50ZXJzZWN0cyhjYW5kaWRhdGVSZWN0KTsKLSAg
ICB9OwotCi0gICAgaWYgKCFtX2xlZnRJbmRleCAmJiAhbV9yaWdodEluZGV4KSB7Ci0gICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0g
ICAgaWYgKGludGVyc2VjdHMobGVmdCgpLCBGbG9hdDo6TGVmdCkpCi0gICAgICAgIHJldHVybiB0
cnVlOwotCi0gICAgaWYgKGludGVyc2VjdHMocmlnaHQoKSwgRmxvYXQ6OlJpZ2h0KSkKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRmxvYXRpbmdQ
YWlyOjpvcGVyYXRvciA9PShjb25zdCBGbG9hdGluZ1BhaXImIG90aGVyKSBjb25zdAotewotICAg
IHJldHVybiBtX2xlZnRJbmRleCA9PSBvdGhlci5tX2xlZnRJbmRleCAmJiBtX3JpZ2h0SW5kZXgg
PT0gb3RoZXIubV9yaWdodEluZGV4OwotfQotCi1MYXlvdXRVbml0IEZsb2F0aW5nUGFpcjo6Ym90
dG9tKCkgY29uc3QKLXsKLSAgICBhdXRvKiBsZWZ0ID0gdGhpcy0+bGVmdCgpOwotICAgIGF1dG8q
IHJpZ2h0ID0gdGhpcy0+cmlnaHQoKTsKLSAgICBBU1NFUlQobGVmdCB8fCByaWdodCk7Ci0KLSAg
ICBhdXRvIGxlZnRCb3R0b20gPSBsZWZ0ID8gc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PihsZWZ0
LT5yZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKLSAgICBhdXRvIHJp
Z2h0Qm90dG9tID0gcmlnaHQgPyBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+KHJpZ2h0LT5yZWN0
V2l0aE1hcmdpbigpLmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKLQotICAgIGlmIChsZWZ0Qm90
dG9tICYmIHJpZ2h0Qm90dG9tKQotICAgICAgICByZXR1cm4gc3RkOjptYXgoKmxlZnRCb3R0b20s
ICpyaWdodEJvdHRvbSk7Ci0KLSAgICBpZiAobGVmdEJvdHRvbSkKLSAgICAgICAgcmV0dXJuICps
ZWZ0Qm90dG9tOwotCi0gICAgcmV0dXJuICpyaWdodEJvdHRvbTsKLX0KLQotSXRlcmF0b3I6Okl0
ZXJhdG9yKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzLCBzdGQ6Om9wdGlv
bmFsPExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRpb24pCi0gICAgOiBtX2Zsb2F0cyhmbG9hdHMp
Ci0gICAgLCBtX2N1cnJlbnQoZmxvYXRzKQotewotICAgIGlmICh2ZXJ0aWNhbFBvc2l0aW9uKQot
ICAgICAgICBzZXQoKnZlcnRpY2FsUG9zaXRpb24pOwotfQotCi1pbmxpbmUgc3RhdGljIHN0ZDo6
b3B0aW9uYWw8dW5zaWduZWQ+IHByZXZpb3VzRmxvYXRpbmdJbmRleChGbG9hdCBmbG9hdGluZ1R5
cGUsIGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzLCB1bnNpZ25lZCBjdXJy
ZW50SW5kZXgpCi17Ci0gICAgUkVMRUFTRV9BU1NFUlQoY3VycmVudEluZGV4IDw9IGZsb2F0cy5z
aXplKCkpOwotCi0gICAgd2hpbGUgKGN1cnJlbnRJbmRleCkgewotICAgICAgICBhdXRvJiBmbG9h
dGluZyA9IGZsb2F0c1stLWN1cnJlbnRJbmRleF0ubGF5b3V0Qm94KCk7Ci0gICAgICAgIGlmICgo
ZmxvYXRpbmdUeXBlID09IEZsb2F0OjpMZWZ0ICYmIGZsb2F0aW5nLmlzTGVmdEZsb2F0aW5nUG9z
aXRpb25lZCgpKSB8fCAoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpSaWdodCAmJiBmbG9hdGluZy5p
c1JpZ2h0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJ
bmRleDsKLSAgICB9Ci0KLSAgICByZXR1cm4geyB9OwotfQotCi1JdGVyYXRvciYgSXRlcmF0b3I6
Om9wZXJhdG9yKysoKQotewotICAgIGlmIChtX2N1cnJlbnQuaXNFbXB0eSgpKSB7Ci0gICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0g
ICAgYXV0byBmaW5kUHJldmlvdXNGbG9hdGluZ1dpdGhMb3dlckJvdHRvbSA9IFsmXShGbG9hdCBm
bG9hdGluZ1R5cGUsIHVuc2lnbmVkIGN1cnJlbnRJbmRleCkgLT4gc3RkOjpvcHRpb25hbDx1bnNp
Z25lZD4gewotCi0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGN1cnJlbnRJbmRleCA8IG1fZmxvYXRz
LnNpemUoKSk7Ci0KLSAgICAgICAgLy8gTGFzdCBmbG9hdGluZz8gVGhlcmUncyBjZXJ0YWlubHkg
bm8gcHJldmlvdXMgZmxvYXRpbmcgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgaWYgKCFjdXJyZW50
SW5kZXgpCi0gICAgICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAgIGF1dG8gY3VycmVudEJv
dHRvbSA9IG1fZmxvYXRzW2N1cnJlbnRJbmRleF0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2lu
KCkuYm90dG9tKCk7Ci0KLSAgICAgICAgc3RkOjpvcHRpb25hbDx1bnNpZ25lZD4gaW5kZXggPSBj
dXJyZW50SW5kZXg7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpbmRleCA9
IHByZXZpb3VzRmxvYXRpbmdJbmRleChmbG9hdGluZ1R5cGUsIG1fZmxvYXRzLCAqaW5kZXgpOwot
ICAgICAgICAgICAgaWYgKCFpbmRleCkKLSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotCi0g
ICAgICAgICAgICBpZiAobV9mbG9hdHNbKmluZGV4XS5kaXNwbGF5Qm94KCkucmVjdFdpdGhNYXJn
aW4oKS5ib3R0b20oKSA+IGN1cnJlbnRCb3R0b20pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGlu
ZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAg
IHJldHVybiB7IH07Ci0gICAgfTsKLQotICAgIC8vIDEuIFRha2UgdGhlIGN1cnJlbnQgZmxvYXRp
bmcgZnJvbSBsZWZ0IGFuZCByaWdodCBhbmQgY2hlY2sgd2hpY2ggb25lJ3MgYm90dG9tIGVkZ2Ug
aXMgcG9zaXRpb25lZCBoaWdoZXIgKHRoZXkgY291bGQgYmUgb24gdGhlIHNhbWUgdmVydGljYWwg
cG9zaXRpb24gdG9vKS4KLSAgICAvLyBUaGUgY3VycmVudCBmbG9hdHMgZnJvbSBsZWZ0IGFuZCBy
aWdodCBhcmUgY29uc2lkZXJlZCB0aGUgaW5uZXItbW9zdCBwYWlyIGZvciB0aGUgY3VycmVudCB2
ZXJ0aWNhbCBwb3NpdGlvbi4KLSAgICAvLyAyLiBNb3ZlIGF3YXkgZnJvbSBpbm5lci1tb3N0IHBh
aXIgYnkgcGlja2luZyBvbmUgb2YgdGhlIHByZXZpb3VzIGZsb2F0cyBpbiB0aGUgbGlzdCgjMSkK
LSAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbmV3IGZsb2F0aW5nJ3MgYm90dG9tIGVkZ2UgaXMgcG9z
aXRpb25lZCBsb3dlciB0aGFuIHRoZSBjdXJyZW50IG9uZSAtd2hpY2ggZXNzZW50aWFsbHkgbWVh
bnMgc2tpcHBpbmcgaW4tYmV0d2VlbiBmbG9hdHMgdGhhdCBhcmUgcG9zaXRpb25lZCBoaWdoZXIp
LgotICAgIC8vIDMuIFJlc2V0IHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBhbmQgYWxpZ24gaXQgd2l0
aCB0aGUgbmV3IGxlZnQtcmlnaHQgcGFpci4gVGhlc2UgZmxvYXRzIGFyZSBub3cgdGhlIGlubmVy
LW1vc3QgYm94ZXMgZm9yIHRoZSBjdXJyZW50IHZlcnRpY2FsIHBvc2l0aW9uLgotICAgIC8vIEFz
IHRoZSByZXN1bHQgd2UgaGF2ZSBtb3JlIGhvcml6b250YWwgc3BhY2Ugb24gdGhlIGN1cnJlbnQg
dmVydGljYWwgcG9zaXRpb24uCi0gICAgYXV0byBsZWZ0Qm90dG9tID0gbV9jdXJyZW50LmxlZnQo
KSA/IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4obV9jdXJyZW50LmxlZnQoKS0+Ym90dG9tKCkp
IDogc3RkOjpudWxsb3B0OwotICAgIGF1dG8gcmlnaHRCb3R0b20gPSBtX2N1cnJlbnQucmlnaHQo
KSA/IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4obV9jdXJyZW50LnJpZ2h0KCktPmJvdHRvbSgp
KSA6IHN0ZDo6bnVsbG9wdDsKLQotICAgIGF1dG8gdXBkYXRlTGVmdCA9IChsZWZ0Qm90dG9tID09
IHJpZ2h0Qm90dG9tKSB8fCAoIXJpZ2h0Qm90dG9tIHx8IChsZWZ0Qm90dG9tICYmIGxlZnRCb3R0
b20gPCByaWdodEJvdHRvbSkpOyAKLSAgICBhdXRvIHVwZGF0ZVJpZ2h0ID0gKGxlZnRCb3R0b20g
PT0gcmlnaHRCb3R0b20pIHx8ICghbGVmdEJvdHRvbSB8fCAocmlnaHRCb3R0b20gJiYgbGVmdEJv
dHRvbSA+IHJpZ2h0Qm90dG9tKSk7IAotCi0gICAgaWYgKHVwZGF0ZUxlZnQpIHsKLSAgICAgICAg
QVNTRVJUKG1fY3VycmVudC5tX2xlZnRJbmRleCk7Ci0gICAgICAgIG1fY3VycmVudC5tX3ZlcnRp
Y2FsUG9zaXRpb24gPSAqbGVmdEJvdHRvbTsKLSAgICAgICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4
ID0gZmluZFByZXZpb3VzRmxvYXRpbmdXaXRoTG93ZXJCb3R0b20oRmxvYXQ6OkxlZnQsICptX2N1
cnJlbnQubV9sZWZ0SW5kZXgpOwotICAgIH0KLSAgICAKLSAgICBpZiAodXBkYXRlUmlnaHQpIHsK
LSAgICAgICAgQVNTRVJUKG1fY3VycmVudC5tX3JpZ2h0SW5kZXgpOwotICAgICAgICBtX2N1cnJl
bnQubV92ZXJ0aWNhbFBvc2l0aW9uID0gKnJpZ2h0Qm90dG9tOwotICAgICAgICBtX2N1cnJlbnQu
bV9yaWdodEluZGV4ID0gZmluZFByZXZpb3VzRmxvYXRpbmdXaXRoTG93ZXJCb3R0b20oRmxvYXQ6
OlJpZ2h0LCAqbV9jdXJyZW50Lm1fcmlnaHRJbmRleCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICp0
aGlzOwotfQotCi12b2lkIEl0ZXJhdG9yOjpzZXQoTGF5b3V0VW5pdCB2ZXJ0aWNhbFBvc2l0aW9u
KQotewotICAgIC8vIE1vdmUgdGhlIGl0ZXJhdG9yIHRvIHRoZSBpbml0aWFsIHZlcnRpY2FsIHBv
c2l0aW9uIGJ5IHN0YXJ0aW5nIGF0IHRoZSBpbm5lci1tb3N0IGZsb2F0aW5nIHBhaXIgKGxhc3Qg
ZmxvYXRzIG9uIGxlZnQvcmlnaHQpLgotICAgIC8vIDEuIENoZWNrIGlmIHRoZSBpbm5lci1tb3N0
IHBhaXIgY292ZXJzIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbi4KLSAgICAvLyAyLiBNb3ZlIG91dHdh
cmRzIGZyb20gdGhlIGlubmVyLW1vc3QgcGFpciB1bnRpbCB0aGUgdmVydGljYWwgcG9zdGlvbiBp
bnRlcnNlY3RzLgotICAgIC8vIChOb3RlIHRoYXQgdmVydGljYWxQb3NpdGlvbiBoYXMgYWxyZWFk
eSBiZWVuIGFkanVzdGVkIHdpdGggdGhlIHRvcCBvZiB0aGUgbGFzdCBmbG9hdC4pCi0KLSAgICBt
X2N1cnJlbnQubV92ZXJ0aWNhbFBvc2l0aW9uID0gdmVydGljYWxQb3NpdGlvbjsKLSAgICAvLyBO
byBmbG9hdHMgYXQgYWxsPwotICAgIGlmIChtX2Zsb2F0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0KLSAgICAgICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4ID0g
eyB9OwotICAgICAgICBtX2N1cnJlbnQubV9yaWdodEluZGV4ID0geyB9OwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgYXV0byBmaW5kRmxvYXRpbmdCZWxvdyA9IFsmXShGbG9hdCBmbG9h
dGluZ1R5cGUpIC0+IHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IHsKLQotICAgICAgICBBU1NFUlQo
IW1fZmxvYXRzLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgYXV0byBpbmRleCA9IGZsb2F0aW5nVHlw
ZSA9PSBGbG9hdDo6TGVmdCA/IG1fY3VycmVudC5tX2xlZnRJbmRleCA6IG1fY3VycmVudC5tX3Jp
Z2h0SW5kZXg7Ci0gICAgICAgIC8vIFN0YXJ0IGZyb20gdGhlIGVuZCBpZiB3ZSBkb24ndCBoYXZl
IGN1cnJlbnQgeWV0LgotICAgICAgICBpbmRleCA9IGluZGV4LnZhbHVlX29yKG1fZmxvYXRzLnNp
emUoKSk7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpbmRleCA9IHByZXZp
b3VzRmxvYXRpbmdJbmRleChmbG9hdGluZ1R5cGUsIG1fZmxvYXRzLCAqaW5kZXgpOwotICAgICAg
ICAgICAgaWYgKCFpbmRleCkKLSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAg
ICAgICBhdXRvIGJvdHRvbSA9IG1fZmxvYXRzWyppbmRleF0uZGlzcGxheUJveCgpLnJlY3RXaXRo
TWFyZ2luKCkuYm90dG9tKCk7Ci0gICAgICAgICAgICAvLyBJcyB0aGlzIGZsb2F0aW5nIGludHJ1
c2l2ZSBvbiB0aGlzIHBvc2l0aW9uPwotICAgICAgICAgICAgaWYgKGJvdHRvbSA+IHZlcnRpY2Fs
UG9zaXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0KLSAg
ICAgICAgcmV0dXJuIHsgfTsKLSAgICB9OwotCi0gICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4ID0g
ZmluZEZsb2F0aW5nQmVsb3coRmxvYXQ6OkxlZnQpOwotICAgIG1fY3VycmVudC5tX3JpZ2h0SW5k
ZXggPSBmaW5kRmxvYXRpbmdCZWxvdyhGbG9hdDo6UmlnaHQpOwotCi0gICAgQVNTRVJUKCFtX2N1
cnJlbnQubV9sZWZ0SW5kZXggfHwgKCptX2N1cnJlbnQubV9sZWZ0SW5kZXggPCBtX2Zsb2F0cy5z
aXplKCkgJiYgbV9mbG9hdHNbKm1fY3VycmVudC5tX2xlZnRJbmRleF0ubGF5b3V0Qm94KCkuaXNM
ZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKTsKLSAgICBBU1NFUlQoIW1fY3VycmVudC5tX3JpZ2h0
SW5kZXggfHwgKCptX2N1cnJlbnQubV9yaWdodEluZGV4IDwgbV9mbG9hdHMuc2l6ZSgpICYmIG1f
ZmxvYXRzWyptX2N1cnJlbnQubV9yaWdodEluZGV4XS5sYXlvdXRCb3goKS5pc1JpZ2h0RmxvYXRp
bmdQb3NpdGlvbmVkKCkpKTsKLX0KLQotYm9vbCBJdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBJ
dGVyYXRvciYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fY3VycmVudCA9PSBvdGhlci5t
X2N1cnJlbnQ7Ci19Ci0KLWJvb2wgSXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3Im
IG90aGVyKSBjb25zdAotewotICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLX0KLQotfQot
fQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdDb250
ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdDb250ZXh0LmgKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDNhOTNkYTMzMmM2MjJiZDVjN2EzZjQ3MjNmMTJmYTk1
Njk2YTkuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nQ29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEs
NzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
Ci0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9V
VF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCi0jaW5j
bHVkZSAiTGF5b3V0VW5pdHMuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0KLW5hbWVz
cGFjZSBXZWJDb3JlIHsKLQotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIEJveDsKLWNsYXNz
IENvbnRhaW5lcjsKLWNsYXNzIEZsb2F0aW5nUGFpcjsKLWNsYXNzIExheW91dENvbnRleHQ7Ci0K
LS8vIEZsb2F0aW5nQ29udGV4dCBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0aW5nIHRoZSBwb3Np
dGlvbiBvZiBhIGJveCBpbiB0aGUgY3VycmVudCBmb3JtYXR0aW5nIGNvbnRleHQKLS8vIGJ5IHRh
a2luZyB0aGUgZmxvYXRpbmcgYm94ZXMgaW50byBhY2NvdW50LgotY2xhc3MgRmxvYXRpbmdDb250
ZXh0IHsKLSAgICBXVEZfTUFLRV9JU09fQUxMT0NBVEVEKEZsb2F0aW5nQ29udGV4dCk7Ci1wdWJs
aWM6Ci0gICAgRmxvYXRpbmdDb250ZXh0KEZsb2F0aW5nU3RhdGUmKTsKLQotICAgIEZsb2F0aW5n
U3RhdGUmIGZsb2F0aW5nU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nU3RhdGU7IH0K
LQotICAgIFBvc2l0aW9uIHBvc2l0aW9uRm9yRmxvYXQoY29uc3QgQm94JikgY29uc3Q7Ci0gICAg
c3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiB2ZXJ0aWNhbFBvc2l0aW9uV2l0aENsZWFyYW5jZShj
b25zdCBCb3gmKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBMYXlvdXRDb250ZXh0JiBsYXlvdXRD
b250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9mbG9hdGluZ1N0YXRlLmxheW91dENvbnRleHQoKTsg
fQotCi0gICAgUG9zaXRpb24gZmxvYXRpbmdQb3NpdGlvbihjb25zdCBGbG9hdGluZ1N0YXRlOjpG
bG9hdEl0ZW0mKSBjb25zdDsKLQotICAgIExheW91dFVuaXQgaW5pdGlhbFZlcnRpY2FsUG9zaXRp
b24oY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJikgY29uc3Q7Ci0gICAgTGF5b3V0VW5p
dCBhbGlnbldpdGhDb250YWluaW5nQmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVt
JikgY29uc3Q7Ci0gICAgTGF5b3V0VW5pdCBhbGlnbldpdGhGbG9hdGluZ3MoY29uc3QgRmxvYXRp
bmdQYWlyJiwgY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJikgY29uc3Q7Ci0gICAgUG9z
aXRpb24gdG9Db250YWluaW5nQmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiwg
UG9zaXRpb24pIGNvbnN0OwotCi0gICAgRmxvYXRpbmdTdGF0ZSYgbV9mbG9hdGluZ1N0YXRlOwot
fTsKLQotfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxv
YXRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdTdGF0ZS5jcHAK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDNlY2VkY2JmNTNhMzAwYzhmMTk1Yjk5
MWQzNDViNmZkYmUwMDguLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nU3RhdGUuY3BwCisrKyAvZGV2L251
bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0g
KiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0j
aW5jbHVkZSAiRmxvYXRpbmdTdGF0ZS5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5H
X0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIkxh
eW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dENvbnRleHQuaCIKLSNpbmNsdWRlIDx3dGYvSXNv
TWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0
IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9JTVBMKEZsb2F0aW5nU3RhdGUpOwotCi1GbG9h
dGluZ1N0YXRlOjpGbG9hdEl0ZW06OkZsb2F0SXRlbShjb25zdCBCb3gmIGxheW91dEJveCwgY29u
c3QgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSkKLSAgICA6IG1fbGF5b3V0Qm94KG1ha2VX
ZWFrUHRyKGNvbnN0X2Nhc3Q8Qm94Jj4obGF5b3V0Qm94KSkpCi0gICAgLCBtX2NvbnRhaW5pbmdC
bG9jayhtYWtlV2Vha1B0cihjb25zdF9jYXN0PENvbnRhaW5lciY+KCpsYXlvdXRCb3guY29udGFp
bmluZ0Jsb2NrKCkpKSkKLSAgICAsIG1fYWJzb2x1dGVEaXNwbGF5Qm94KEZvcm1hdHRpbmdDb250
ZXh0OjptYXBCb3hUb0FuY2VzdG9yKGZsb2F0aW5nU3RhdGUubGF5b3V0Q29udGV4dCgpLCBsYXlv
dXRCb3gsIGRvd25jYXN0PENvbnRhaW5lcj4oZmxvYXRpbmdTdGF0ZS5yb290KCkpKSkKLSAgICAs
IG1fY29udGFpbmluZ0Jsb2NrQWJzb2x1dGVEaXNwbGF5Qm94KEZvcm1hdHRpbmdDb250ZXh0Ojpt
YXBCb3hUb0FuY2VzdG9yKGZsb2F0aW5nU3RhdGUubGF5b3V0Q29udGV4dCgpLCAqbV9jb250YWlu
aW5nQmxvY2ssIGRvd25jYXN0PENvbnRhaW5lcj4oZmxvYXRpbmdTdGF0ZS5yb290KCkpKSkKLXsK
LX0KLQotRmxvYXRpbmdTdGF0ZTo6RmxvYXRpbmdTdGF0ZShMYXlvdXRDb250ZXh0JiBsYXlvdXRD
b250ZXh0LCBjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkKLSAgICA6IG1fbGF5b3V0
Q29udGV4dChsYXlvdXRDb250ZXh0KQotICAgICwgbV9mb3JtYXR0aW5nQ29udGV4dFJvb3QobWFr
ZVdlYWtQdHIoY29uc3RfY2FzdDxCb3gmPihmb3JtYXR0aW5nQ29udGV4dFJvb3QpKSkKLXsKLX0K
LQotI2lmbmRlZiBOREVCVUcKLXN0YXRpYyBib29sIGJlbG9uZ3NUb1RoaXNGbG9hdGluZ0NvbnRl
eHQoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEJveCYgZmxvYXRpbmdTdGF0ZVJvb3QpCi17
Ci0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHRSb290ID0gbGF5b3V0Qm94LmZvcm1hdHRpbmdD
b250ZXh0Um9vdCgpOwotICAgIGlmICgmZm9ybWF0dGluZ0NvbnRleHRSb290ID09ICZmbG9hdGlu
Z1N0YXRlUm9vdCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBNYXliZSB0aGUgbGF5
b3V0IGJveCBiZWxvbmdzIHRvIGFuIGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgdGhhdCBpbmhl
cml0cyB0aGUgZmxvYXRpbmcgc3RhdGUgZnJvbSB0aGUgcGFyZW50IChibG9jaykgZm9ybWF0dGlu
ZyBjb250ZXh0LiAKLSAgICBpZiAoIWZvcm1hdHRpbmdDb250ZXh0Um9vdC5lc3RhYmxpc2hlc0lu
bGluZUZvcm1hdHRpbmdDb250ZXh0KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJl
dHVybiAmZm9ybWF0dGluZ0NvbnRleHRSb290LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpID09ICZm
bG9hdGluZ1N0YXRlUm9vdDsKLX0KLSNlbmRpZgotCi12b2lkIEZsb2F0aW5nU3RhdGU6OnJlbW92
ZShjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGlu
ZGV4IDwgbV9mbG9hdHMuc2l6ZSgpOyArK2luZGV4KSB7Ci0gICAgICAgIGlmICgmbV9mbG9hdHNb
aW5kZXhdLmxheW91dEJveCgpID09ICZsYXlvdXRCb3gpIHsKLSAgICAgICAgICAgIG1fZmxvYXRz
LnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci19Ci0KLXZvaWQgRmxvYXRpbmdTdGF0ZTo6YXBwZW5k
KGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAgIEFTU0VSVChpczxDb250YWluZXI+KCptX2Zv
cm1hdHRpbmdDb250ZXh0Um9vdCkpOwotICAgIEFTU0VSVChiZWxvbmdzVG9UaGlzRmxvYXRpbmdD
b250ZXh0KGxheW91dEJveCwgKm1fZm9ybWF0dGluZ0NvbnRleHRSb290KSk7Ci0KLSAgICAvLyBG
bG9hdGluZyBzdGF0ZSBzaG91bGQgaG9sZCBib3hlcyB3aXRoIGNvbXB1dGVkIHBvc2l0aW9uL3Np
emUuCi0gICAgQVNTRVJUKG1fbGF5b3V0Q29udGV4dC5kaXNwbGF5Qm94Rm9yTGF5b3V0Qm94KGxh
eW91dEJveCkpOwotICAgIEFTU0VSVChpczxDb250YWluZXI+KCptX2Zvcm1hdHRpbmdDb250ZXh0
Um9vdCkpOwotCi0gICAgbV9mbG9hdHMuYXBwZW5kKHsgbGF5b3V0Qm94LCAqdGhpcyB9KTsKLX0K
LQotc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBGbG9hdGluZ1N0YXRlOjpib3R0b20oY29uc3Qg
Qm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyIHR5cGUpIGNvbnN0Ci17Ci0gICAgaWYg
KG1fZmxvYXRzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgIC8vIFRPRE86
IEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgY2FsbGVkIG9uY2UgZm9yIGVhY2ggZm9ybWF0dGluZyBj
b250ZXh0IHJvb3Qgd2l0aCBmbG9hdHMgcGVyIGxheW91dC4KLSAgICAvLyBDYWNoZSB0aGUgdmFs
dWUgaWYgd2UgZW5kIHVwIGNhbGxpbmcgaXQgbW9yZSBmcmVxdWVudGx5IChhbmQgdXBkYXRlIGl0
IGF0IGFwcGVuZC9yZW1vdmUpLgotICAgIHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gYm90dG9t
OwotICAgIGZvciAoYXV0byYgZmxvYXRJdGVtIDogbV9mbG9hdHMpIHsKLSAgICAgICAgLy8gSWdu
b3JlIGZsb2F0cyBmcm9tIG90aGVyIGZvcm1hdHRpbmcgY29udGV4dHMgd2hlbiB0aGUgZmxvYXRp
bmcgc3RhdGUgaXMgaW5oZXJpdGVkLgotICAgICAgICBpZiAoJmZvcm1hdHRpbmdDb250ZXh0Um9v
dCAhPSAmZmxvYXRJdGVtLmxheW91dEJveCgpLmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpKQotICAg
ICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKCh0eXBlID09IENsZWFyOjpMZWZ0ICYm
ICFmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAg
ICAgICAgICB8fCAodHlwZSA9PSBDbGVhcjo6UmlnaHQgJiYgIWZsb2F0SXRlbS5sYXlvdXRCb3go
KS5pc1JpZ2h0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKQotICAgICAgICAgICAgY29udGludWU7Ci0K
LSAgICAgICAgYXV0byBmbG9hdHNCb3R0b20gPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpLnJlY3RX
aXRoTWFyZ2luKCkuYm90dG9tKCk7Ci0gICAgICAgIGlmIChib3R0b20pIHsKLSAgICAgICAgICAg
IGJvdHRvbSA9IHN0ZDo6bWF4KCpib3R0b20sIGZsb2F0c0JvdHRvbSk7Ci0gICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBib3R0b20gPSBmbG9hdHNCb3R0b207Ci0gICAg
fQotICAgIHJldHVybiBib3R0b207Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nU3RhdGUuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9GbG9hdGluZ1N0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhN2UyYjQy
NGY4Yzc5ZTQ0MjNhZDM2OTJiZGNhNjljMmIxNzJiNzcuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nU3Rh
dGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdt
YSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1
ZGUgIkRpc3BsYXlCb3guaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0jaW5jbHVkZSA8
d3RmL1JlZi5oPgotI2luY2x1ZGUgPHd0Zi9XZWFrUHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3Jl
IHsKLQotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIEJveDsKLWNsYXNzIENvbnRhaW5lcjsK
LWNsYXNzIEZvcm1hdHRpbmdTdGF0ZTsKLWNsYXNzIExheW91dENvbnRleHQ7Ci0KLS8vIEZsb2F0
aW5nU3RhdGUgaG9sZHMgdGhlIGZsb2F0aW5nIGJveGVzIHBlciBmb3JtYXR0aW5nIGNvbnRleHQu
Ci1jbGFzcyBGbG9hdGluZ1N0YXRlIDogcHVibGljIFJlZkNvdW50ZWQ8RmxvYXRpbmdTdGF0ZT4g
ewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoRmxvYXRpbmdTdGF0ZSk7Ci1wdWJsaWM6Ci0g
ICAgc3RhdGljIFJlZjxGbG9hdGluZ1N0YXRlPiBjcmVhdGUoTGF5b3V0Q29udGV4dCYgbGF5b3V0
Q29udGV4dCwgY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpIHsgcmV0dXJuIGFkb3B0
UmVmKCpuZXcgRmxvYXRpbmdTdGF0ZShsYXlvdXRDb250ZXh0LCBmb3JtYXR0aW5nQ29udGV4dFJv
b3QpKTsgfQotCi0gICAgdm9pZCBhcHBlbmQoY29uc3QgQm94JiBsYXlvdXRCb3gpOwotICAgIHZv
aWQgcmVtb3ZlKGNvbnN0IEJveCYgbGF5b3V0Qm94KTsKLQotICAgIGJvb2wgaXNFbXB0eSgpIGNv
bnN0IHsgcmV0dXJuIG1fZmxvYXRzLmlzRW1wdHkoKTsgfQotCi0gICAgc3RkOjpvcHRpb25hbDxM
YXlvdXRVbml0PiBsZWZ0Qm90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSBj
b25zdDsKLSAgICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHJpZ2h0Qm90dG9tKGNvbnN0IEJv
eCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSBjb25zdDsKLSAgICBzdGQ6Om9wdGlvbmFsPExheW91
dFVuaXQ+IGJvdHRvbShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3Q7Ci0K
LSAgICBjbGFzcyBGbG9hdEl0ZW0gewotICAgIHB1YmxpYzoKLSAgICAgICAgRmxvYXRJdGVtKGNv
bnN0IEJveCYsIGNvbnN0IEZsb2F0aW5nU3RhdGUmKTsKLQotICAgICAgICBjb25zdCBCb3gmIGxh
eW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJveDsgfQotICAgICAgICBjb25zdCBD
b250YWluZXImIGNvbnRhaW5pbmdCbG9jaygpIGNvbnN0IHsgcmV0dXJuICptX2NvbnRhaW5pbmdC
bG9jazsgfQotCi0gICAgICAgIGNvbnN0IERpc3BsYXk6OkJveCYgZGlzcGxheUJveCgpIGNvbnN0
IHsgcmV0dXJuIG1fYWJzb2x1dGVEaXNwbGF5Qm94OyB9Ci0gICAgICAgIGNvbnN0IERpc3BsYXk6
OkJveCYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGFp
bmluZ0Jsb2NrQWJzb2x1dGVEaXNwbGF5Qm94OyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBX
ZWFrUHRyPEJveD4gbV9sYXlvdXRCb3g7Ci0gICAgICAgIFdlYWtQdHI8Q29udGFpbmVyPiBtX2Nv
bnRhaW5pbmdCbG9jazsKLQotICAgICAgICBEaXNwbGF5OjpCb3ggbV9hYnNvbHV0ZURpc3BsYXlC
b3g7Ci0gICAgICAgIERpc3BsYXk6OkJveCBtX2NvbnRhaW5pbmdCbG9ja0Fic29sdXRlRGlzcGxh
eUJveDsKLSAgICB9OwotICAgIHVzaW5nIEZsb2F0TGlzdCA9IFZlY3RvcjxGbG9hdEl0ZW0+Owot
ICAgIGNvbnN0IEZsb2F0TGlzdCYgZmxvYXRzKCkgY29uc3QgeyByZXR1cm4gbV9mbG9hdHM7IH0K
LSAgICBjb25zdCBGbG9hdEl0ZW0qIGxhc3QoKSBjb25zdCB7IHJldHVybiBpc0VtcHR5KCkgPyBu
dWxscHRyIDogJm1fZmxvYXRzLmxhc3QoKTsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFz
cyBGbG9hdGluZ0NvbnRleHQ7Ci0gICAgRmxvYXRpbmdTdGF0ZShMYXlvdXRDb250ZXh0JiwgY29u
c3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpOwotCi0gICAgTGF5b3V0Q29udGV4dCYgbGF5
b3V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fbGF5b3V0Q29udGV4dDsgfQotICAgIGNvbnN0
IEJveCYgcm9vdCgpIGNvbnN0IHsgcmV0dXJuICptX2Zvcm1hdHRpbmdDb250ZXh0Um9vdDsgfQot
Ci0gICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBib3R0b20oY29uc3QgQm94JiBmb3JtYXR0
aW5nQ29udGV4dFJvb3QsIENsZWFyKSBjb25zdDsKLQotICAgIExheW91dENvbnRleHQmIG1fbGF5
b3V0Q29udGV4dDsKLSAgICBXZWFrUHRyPEJveD4gbV9mb3JtYXR0aW5nQ29udGV4dFJvb3Q7Ci0g
ICAgRmxvYXRMaXN0IG1fZmxvYXRzOwotfTsKLQotaW5saW5lIHN0ZDo6b3B0aW9uYWw8TGF5b3V0
VW5pdD4gRmxvYXRpbmdTdGF0ZTo6bGVmdEJvdHRvbShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250
ZXh0Um9vdCkgY29uc3QKLXsgCi0gICAgcmV0dXJuIGJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJv
b3QsIENsZWFyOjpMZWZ0KTsKLX0KLQotaW5saW5lIHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4g
RmxvYXRpbmdTdGF0ZTo6cmlnaHRCb3R0b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJv
b3QpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENs
ZWFyOjpSaWdodCk7Ci19Ci0KLWlubGluZSBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0
aW5nU3RhdGU6OmJvdHRvbShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3QK
LXsKLSAgICByZXR1cm4gYm90dG9tKGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgQ2xlYXI6OkJvdGgp
OwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9m
bG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mbG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40ZmVhZWEy
N2JlMTgwYzVjMTBmNGVkOTI1OGIwYWJmNDJjMzhhNzdhCi0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvbGF5b3V0L2Zsb2F0Zm9ybWF0dGluZy9GbG9hdGluZ0NvbnRleHQuY3BwCkBA
IC0wLDAgKzEsNTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NP
TlRFWFQpCisKKyNpbmNsdWRlICJEaXNwbGF5Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94Lmgi
CisjaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyLmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5o
IgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKK25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoRmxv
YXRpbmdDb250ZXh0KTsKKworLy8gRmluZGluZyB0aGUgdG9wL2xlZnQgcG9zaXRpb24gZm9yIGEg
bmV3IGZsb2F0aW5nKEYpCisvLyAgX19fXyAgX19fXyAgX19fX18gICAgICAgICAgICAgICBfX19f
X19fCisvLyB8ICAgIHx8IEwyIHx8ICAgICB8IDwtLS0tLTEtLS0tPnwgICAgICAgfAorLy8gfCAg
ICB8fF9fX198fCAgTDMgfCAgICAgICAgICAgICB8ICAgUjEgIHwKKy8vIHwgTDEgfCAgICAgIHxf
X19fX3wgICAgICAgICAgICAgfCAgICAgICB8CisvLyB8X19fX3wgPC0tLS0tLS0tLS0tLS0yLS0t
LS0tLS0tPnwgICAgICAgfAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg
ICAgIHwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX198CisvLwor
Ly8gMS4gQ29tcHV0ZSB0aGUgaW5pdGlhbCB2ZXJ0aWNhbCBwb3NpdGlvbiBmb3IgKEYpIC0+ICgx
KQorLy8gMi4gRmluZCB0aGUgY29ycmVzcG9uZGluZyBmbG9hdGluZyBwYWlyIChMMy1SMSkKKy8v
IDMuIEFsaWduIChGKSBob3Jpem9udGFsbHkgd2l0aCAoTDMtUjEpIGRlcGVuZGluZyB3aGV0aGVy
IChGKSBpcyBsZWZ0L3JpZ2h0IHBvc2l0aW9uZWQKKy8vIDQuIEludGVyc2VjdCAoRikgd2l0aCAo
TDMtUjEpCisvLyA1LiBJZiAoRikgZG9lcyBub3QgZml0LCBmaW5kIHRoZSBuZXh0IGZsb2F0aW5n
IHBhaXIgKEwxLVIxKQorLy8gNi4gUmVwZWF0IHVudGlsIGVpdGhlciAoRikgZml0cy9ubyBtb3Jl
IGZsb2F0cy4KKy8vIE5vdGUgdGhhdCBhbGwgY29vcmRpbmF0ZXMgYXJlIGluIHRoZSBjb29yZGlu
YXRlIHN5c3RlbSBvZiB0aGUgZm9ybWF0dGluZyByb290LgorLy8gVGhlIGZvcm1hdHRpbmcgcm9v
dCBoZXJlIGlzIGFsd2F5cyB0aGUgb25lIHRoYXQgZXN0YWJsaXNoZXMgdGhlIGZsb2F0aW5nIGNv
bnRleHQgKHNlZSBpbmhlcml0ZWQgZmxvYXRpbmcgY29udGV4dCkuCisvLyAoSXQgc2ltcGx5IG1l
YW5zIHRoYXQgdGhlIGZsb2F0IGJveCdzIGZvcm1hdHRpbmcgcm9vdCBpcyBub3QgbmVjZXNzYXJp
bHkgdGhlIHNhbWUgYXMgdGhlIEZvcm1hdHRpbmdDb250ZXh0J3Mgcm9vdC4pCisKK2NsYXNzIEl0
ZXJhdG9yOworCitjbGFzcyBGbG9hdGluZ1BhaXIgeworcHVibGljOgorICAgIGJvb2wgaXNFbXB0
eSgpIGNvbnN0IHsgcmV0dXJuICFtX2xlZnRJbmRleCAmJiAhbV9yaWdodEluZGV4OyB9CisgICAg
Y29uc3QgRGlzcGxheTo6Qm94KiBsZWZ0KCkgY29uc3Q7CisgICAgY29uc3QgRGlzcGxheTo6Qm94
KiByaWdodCgpIGNvbnN0OworICAgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBEaXNwbGF5OjpCb3g6
OlJlY3QmKSBjb25zdDsKKyAgICBMYXlvdXRVbml0IHZlcnRpY2FsUG9zaXRpb24oKSBjb25zdCB7
IHJldHVybiBtX3ZlcnRpY2FsUG9zaXRpb247IH0KKyAgICBMYXlvdXRVbml0IGJvdHRvbSgpIGNv
bnN0OworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGbG9hdGluZ1BhaXImKSBjb25zdDsKKwor
cHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgSXRlcmF0b3I7CisgICAgRmxvYXRpbmdQYWlyKGNv
bnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYpOworCisgICAgY29uc3QgRmxvYXRpbmdTdGF0
ZTo6RmxvYXRMaXN0JiBtX2Zsb2F0czsKKworICAgIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IG1f
bGVmdEluZGV4OworICAgIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IG1fcmlnaHRJbmRleDsKKyAg
ICBMYXlvdXRVbml0IG1fdmVydGljYWxQb3NpdGlvbjsKK307CisKK2NsYXNzIEl0ZXJhdG9yIHsK
K3B1YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmLCBz
dGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRpb24pOworCisgICAgY29uc3Qg
RmxvYXRpbmdQYWlyJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBtX2N1cnJlbnQ7IH0KKyAg
ICBJdGVyYXRvciYgb3BlcmF0b3IrKygpOworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVy
YXRvciYpIGNvbnN0OworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciYpIGNvbnN0
OworCitwcml2YXRlOgorICAgIHZvaWQgc2V0KExheW91dFVuaXQgdmVydGljYWxQb3NpdGlvbik7
CisKKyAgICBjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmIG1fZmxvYXRzOworICAgIEZs
b2F0aW5nUGFpciBtX2N1cnJlbnQ7Cit9OworCitzdGF0aWMgSXRlcmF0b3IgYmVnaW4oY29uc3Qg
RmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0VW5pdCBpbml0aWFsVmVydGljYWxQ
b3NpdGlvbikKK3sKKyAgICAvLyBTdGFydCB3aXRoIHRoZSBpbm5lci1tb3N0IGZsb2F0aW5nIHBh
aXIgZm9yIHRoZSBpbml0aWFsIHZlcnRpY2FsIHBvc2l0aW9uLgorICAgIHJldHVybiBJdGVyYXRv
cihmbG9hdGluZ1N0YXRlLmZsb2F0cygpLCBpbml0aWFsVmVydGljYWxQb3NpdGlvbik7Cit9CisK
K3N0YXRpYyBJdGVyYXRvciBlbmQoY29uc3QgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSkK
K3sKKyAgICByZXR1cm4gSXRlcmF0b3IoZmxvYXRpbmdTdGF0ZS5mbG9hdHMoKSwgc3RkOjpudWxs
b3B0KTsKK30KKworRmxvYXRpbmdDb250ZXh0OjpGbG9hdGluZ0NvbnRleHQoRmxvYXRpbmdTdGF0
ZSYgZmxvYXRpbmdTdGF0ZSkKKyAgICA6IG1fZmxvYXRpbmdTdGF0ZShmbG9hdGluZ1N0YXRlKQor
eworfQorCitQb3NpdGlvbiBGbG9hdGluZ0NvbnRleHQ6OnBvc2l0aW9uRm9yRmxvYXQoY29uc3Qg
Qm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0aW5n
UG9zaXRpb25lZCgpKTsKKyAgICBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0gZmxvYXRJdGVtID0g
eyBsYXlvdXRCb3gsIG1fZmxvYXRpbmdTdGF0ZSB9OworCisgICAgUG9zaXRpb24gZmxvYXRQb3Np
dGlvbjsKKyAgICBpZiAobV9mbG9hdGluZ1N0YXRlLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBO
byBmbG9hdCBib3ggb24gdGhlIGNvbnRleHQgeWV0IC0+IGFsaWduIGl0IHdpdGggdGhlIGNvbnRh
aW5pbmcgYmxvY2sncyBsZWZ0L3JpZ2h0IGVkZ2UuCisgICAgICAgIGF1dG8mIGRpc3BsYXlCb3gg
PSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpOworICAgICAgICBmbG9hdFBvc2l0aW9uID0geyBhbGln
bldpdGhDb250YWluaW5nQmxvY2soZmxvYXRJdGVtKSArIGRpc3BsYXlCb3gubWFyZ2luTGVmdCgp
LCBkaXNwbGF5Qm94LnRvcCgpIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRmluZCB0aGUg
dG9wIG1vc3QgcG9zaXRpb24gd2hlcmUgdGhlIGZsb2F0IGJveCBmaXRzLgorICAgICAgICBmbG9h
dFBvc2l0aW9uID0gZmxvYXRpbmdQb3NpdGlvbihmbG9hdEl0ZW0pOworICAgIH0KKworICAgIHJl
dHVybiB0b0NvbnRhaW5pbmdCbG9jayhmbG9hdEl0ZW0sIGZsb2F0UG9zaXRpb24pOworfQorCitz
dGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0aW5nQ29udGV4dDo6dmVydGljYWxQb3NpdGlv
bldpdGhDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJU
KGxheW91dEJveC5oYXNGbG9hdENsZWFyKCkpOworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9j
a0xldmVsQm94KCkpOworCisgICAgaWYgKG1fZmxvYXRpbmdTdGF0ZS5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiB7IH07CisKKyAgICBhdXRvIGJvdHRvbSA9IFsmXShzdGQ6Om9wdGlvbmFsPExh
eW91dFVuaXQ+IGZsb2F0Qm90dG9tKSAtPiBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHsKKyAg
ICAgICAgLy8gJ2JvdHRvbScgaXMgaW4gdGhlIGZvcm1hdHRpbmcgcm9vdCdzIGNvb3JkaW5hdGUg
c3lzdGVtLgorICAgICAgICBpZiAoIWZsb2F0Qm90dG9tKQorICAgICAgICAgICAgcmV0dXJuIHsg
fTsKKworICAgICAgICAvLyA5LjUuMiBDb250cm9sbGluZyBmbG93IG5leHQgdG8gZmxvYXRzOiB0
aGUgJ2NsZWFyJyBwcm9wZXJ0eQorICAgICAgICAvLyBUaGVuIHRoZSBhbW91bnQgb2YgY2xlYXJh
bmNlIGlzIHNldCB0byB0aGUgZ3JlYXRlciBvZjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gMS4g
VGhlIGFtb3VudCBuZWNlc3NhcnkgdG8gcGxhY2UgdGhlIGJvcmRlciBlZGdlIG9mIHRoZSBibG9j
ayBldmVuIHdpdGggdGhlIGJvdHRvbSBvdXRlciBlZGdlIG9mIHRoZSBsb3dlc3QgZmxvYXQgdGhh
dCBpcyB0byBiZSBjbGVhcmVkLgorICAgICAgICAvLyAyLiBUaGUgYW1vdW50IG5lY2Vzc2FyeSB0
byBwbGFjZSB0aGUgdG9wIGJvcmRlciBlZGdlIG9mIHRoZSBibG9jayBhdCBpdHMgaHlwb3RoZXRp
Y2FsIHBvc2l0aW9uLgorCisgICAgICAgIGF1dG8mIGxheW91dENvbnRleHQgPSB0aGlzLT5sYXlv
dXRDb250ZXh0KCk7CisgICAgICAgIGF1dG8mIGRpc3BsYXlCb3ggPSAqbGF5b3V0Q29udGV4dC5k
aXNwbGF5Qm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7CisgICAgICAgIGF1dG8gcm9vdFJlbGF0
aXZlVG9wID0gRm9ybWF0dGluZ0NvbnRleHQ6Om1hcFRvcExlZnRUb0FuY2VzdG9yKGxheW91dENv
bnRleHQsIGxheW91dEJveCwgZG93bmNhc3Q8Q29udGFpbmVyPihtX2Zsb2F0aW5nU3RhdGUucm9v
dCgpKSkueTsKKyAgICAgICAgYXV0byBjbGVhcmFuY2UgPSAqZmxvYXRCb3R0b20gLSByb290UmVs
YXRpdmVUb3A7CisgICAgICAgIGlmIChjbGVhcmFuY2UgPD0gMCkKKyAgICAgICAgICAgIHJldHVy
biB7IH07CisKKyAgICAgICAgLy8gQ2xlYXJhbmNlIGluaGliaXRzIG1hcmdpbiBjb2xsYXBzaW5n
LiBMZXQncyByZXNldCB0aGUgcmVsZXZhbnQgYWRqb2luaW5nIG1hcmdpbnMuCisgICAgICAgIGlm
IChhdXRvKiBwcmV2aW91c0luRmxvd1NpYmxpbmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dT
aWJsaW5nKCkpIHsKKyAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93RGlzcGxheUJveCA9
ICpsYXlvdXRDb250ZXh0LmRpc3BsYXlCb3hGb3JMYXlvdXRCb3goKnByZXZpb3VzSW5GbG93U2li
bGluZyk7CisKKyAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBwcmV2aW91cyBpbmZsb3cgc2libGlu
ZyBoYXMgYWxyZWFkeSBiZWVuIGxhaWQgb3V0LCBpdHMgbWFyZ2luIGlzIGNvbGxhcHNlZCBieSBu
b3cuCisgICAgICAgICAgICBBU1NFUlQoIXByZXZpb3VzSW5GbG93RGlzcGxheUJveC5tYXJnaW5C
b3R0b20oKSk7CisgICAgICAgICAgICBhdXRvIGNvbGxhcHNlZE1hcmdpbiA9IGRpc3BsYXlCb3gu
bWFyZ2luVG9wKCk7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IHByZXZpb3VzIGJvdHRvbSBhbmQg
Y3VycmVudCB0b3AgbWFyZ2lucyB0byBub24tY29sbGFwc2luZy4KKyAgICAgICAgICAgIHByZXZp
b3VzSW5GbG93RGlzcGxheUJveC5zZXRWZXJ0aWNhbE1hcmdpbih7IHByZXZpb3VzSW5GbG93RGlz
cGxheUJveC5tYXJnaW5Ub3AoKSwgcHJldmlvdXNJbkZsb3dEaXNwbGF5Qm94Lm5vbkNvbGxhcHNl
ZE1hcmdpbkJvdHRvbSgpIH0pOworICAgICAgICAgICAgZGlzcGxheUJveC5zZXRWZXJ0aWNhbE1h
cmdpbih7IGRpc3BsYXlCb3gubm9uQ29sbGFwc2VkTWFyZ2luVG9wKCksIGRpc3BsYXlCb3gubWFy
Z2luQm90dG9tKCkgfSk7CisKKyAgICAgICAgICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0g
cHJldmlvdXNJbkZsb3dEaXNwbGF5Qm94Lm1hcmdpbkJvdHRvbSgpICsgZGlzcGxheUJveC5tYXJn
aW5Ub3AoKTsKKyAgICAgICAgICAgIGF1dG8gbWFyZ2luT2Zmc2V0ID0gbm9uQ29sbGFwc2VkTWFy
Z2luIC0gY29sbGFwc2VkTWFyZ2luOworICAgICAgICAgICAgLy8gTW92ZSB0aGUgYm94IHRvIHRo
ZSBwb3NpdGlvbiB3aGVyZSBpdCB3b3VsZCBiZSB3aXRoIG5vbi1jb2xsYXBzZWQgbWFyZ2lucy4K
KyAgICAgICAgICAgIHJvb3RSZWxhdGl2ZVRvcCArPSBtYXJnaW5PZmZzZXQ7CisKKyAgICAgICAg
ICAgIC8vIEhhdmluZyBuZWdhdGl2ZSBjbGVhcmFuY2UgaXMgYWxzbyBub3JtYWwuIEl0IGp1c3Qg
bWVhbnMgdGhhdCB0aGUgYm94IHdpdGggdGhlIG5vbi1jb2xsYXBzZWQgbWFyZ2lucyBpcyBub3cg
bG93ZXIgdGhhbiBpdCBuZWVkcyB0byBiZS4KKyAgICAgICAgICAgIGNsZWFyYW5jZSAtPSBtYXJn
aW5PZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IGFkanVzdCB0aGUgYm94J3MgcG9z
aXRpb24gd2l0aCB0aGUgY2xlYXJhbmNlLgorICAgICAgICByb290UmVsYXRpdmVUb3AgKz0gY2xl
YXJhbmNlOworICAgICAgICBBU1NFUlQoKmZsb2F0Qm90dG9tID09IHJvb3RSZWxhdGl2ZVRvcCk7
CisKKyAgICAgICAgLy8gVGhlIHJldHVybiB2ZXJ0aWNhbCBwb3NpdGlvbiBpcyBpbiB0aGUgY29u
dGFpbmluZyBibG9jaydzIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAgICBhdXRvIGNvbnRhaW5p
bmdCbG9ja1Jvb3RSZWxhdGl2ZVRvcCA9IEZvcm1hdHRpbmdDb250ZXh0OjptYXBUb3BMZWZ0VG9B
bmNlc3RvcihsYXlvdXRDb250ZXh0LCAqbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLCBkb3du
Y2FzdDxDb250YWluZXI+KG1fZmxvYXRpbmdTdGF0ZS5yb290KCkpKS55OworICAgICAgICByZXR1
cm4gcm9vdFJlbGF0aXZlVG9wIC0gY29udGFpbmluZ0Jsb2NrUm9vdFJlbGF0aXZlVG9wOworICAg
IH07CisKKyAgICBhdXRvIGNsZWFyID0gbGF5b3V0Qm94LnN0eWxlKCkuY2xlYXIoKTsKKyAgICBh
dXRvJiBmb3JtYXR0aW5nQ29udGV4dFJvb3QgPSBsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRS
b290KCk7CisKKyAgICBpZiAoY2xlYXIgPT0gQ2xlYXI6OkxlZnQpCisgICAgICAgIHJldHVybiBi
b3R0b20obV9mbG9hdGluZ1N0YXRlLmxlZnRCb3R0b20oZm9ybWF0dGluZ0NvbnRleHRSb290KSk7
CisKKyAgICBpZiAoY2xlYXIgPT0gQ2xlYXI6OlJpZ2h0KQorICAgICAgICByZXR1cm4gYm90dG9t
KG1fZmxvYXRpbmdTdGF0ZS5yaWdodEJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsKKwor
ICAgIGlmIChjbGVhciA9PSBDbGVhcjo6Qm90aCkKKyAgICAgICAgcmV0dXJuIGJvdHRvbShtX2Zs
b2F0aW5nU3RhdGUuYm90dG9tKGZvcm1hdHRpbmdDb250ZXh0Um9vdCkpOworCisgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIHsgfTsKK30KKworUG9zaXRpb24gRmxvYXRpbmdD
b250ZXh0OjpmbG9hdGluZ1Bvc2l0aW9uKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYg
ZmxvYXRJdGVtKSBjb25zdAoreworICAgIGF1dG8gaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24gPSB0
aGlzLT5pbml0aWFsVmVydGljYWxQb3NpdGlvbihmbG9hdEl0ZW0pOworICAgIGF1dG8mIGRpc3Bs
YXlCb3ggPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpOworICAgIGF1dG8gbWFyZ2luQm94U2l6ZSA9
IGRpc3BsYXlCb3gubWFyZ2luQm94KCkuc2l6ZSgpOworCisgICAgYXV0byBlbmQgPSBMYXlvdXQ6
OmVuZChtX2Zsb2F0aW5nU3RhdGUpOworICAgIGF1dG8gdG9wID0gaW5pdGlhbFZlcnRpY2FsUG9z
aXRpb247CisgICAgYXV0byBib3R0b21Nb3N0ID0gdG9wOworICAgIGZvciAoYXV0byBpdGVyYXRv
ciA9IGJlZ2luKG1fZmxvYXRpbmdTdGF0ZSwgaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24pOyBpdGVy
YXRvciAhPSBlbmQ7ICsraXRlcmF0b3IpIHsKKyAgICAgICAgQVNTRVJUKCEoKml0ZXJhdG9yKS5p
c0VtcHR5KCkpOworCisgICAgICAgIGF1dG8gZmxvYXRzID0gKml0ZXJhdG9yOworICAgICAgICB0
b3AgPSBmbG9hdHMudmVydGljYWxQb3NpdGlvbigpOworCisgICAgICAgIC8vIE1vdmUgdGhlIGJv
eCBob3Jpem9udGFsbHkgc28gdGhhdCBpdCBhbGlnbnMgd2l0aCB0aGUgY3VycmVudCBmbG9hdGlu
ZyBwYWlyLgorICAgICAgICBhdXRvIGxlZnQgPSBhbGlnbldpdGhGbG9hdGluZ3MoZmxvYXRzLCBm
bG9hdEl0ZW0pOworICAgICAgICAvLyBDaGVjayBpZiB0aGUgYm94IGZpdHMgYXQgdGhpcyB2ZXJ0
aWNhbCBwb3NpdGlvbi4KKyAgICAgICAgaWYgKCFmbG9hdHMuaW50ZXJzZWN0cyh7IHRvcCwgbGVm
dCwgbWFyZ2luQm94U2l6ZS53aWR0aCgpLCBtYXJnaW5Cb3hTaXplLmhlaWdodCgpIH0pKQorICAg
ICAgICAgICAgcmV0dXJuIHsgbGVmdCArIGRpc3BsYXlCb3gubWFyZ2luTGVmdCgpLCB0b3AgKyBk
aXNwbGF5Qm94Lm1hcmdpblRvcCgpIH07CisKKyAgICAgICAgYm90dG9tTW9zdCA9IGZsb2F0cy5i
b3R0b20oKTsKKyAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBmbG9hdGluZyBwYWlyLgorICAg
IH0KKworICAgIC8vIFBhc3NlZCBhbGwgdGhlIGZsb2F0cyBhbmQgc3RpbGwgZG9lcyBub3QgZml0
PworICAgIHJldHVybiB7IGFsaWduV2l0aENvbnRhaW5pbmdCbG9jayhmbG9hdEl0ZW0pICsgZGlz
cGxheUJveC5tYXJnaW5MZWZ0KCksIGJvdHRvbU1vc3QgKyBkaXNwbGF5Qm94Lm1hcmdpblRvcCgp
IH07Cit9CisKK0xheW91dFVuaXQgRmxvYXRpbmdDb250ZXh0Ojppbml0aWFsVmVydGljYWxQb3Np
dGlvbihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mIGZsb2F0SXRlbSkgY29uc3QKK3sK
KyAgICAvLyBJbmNvbWluZyBmbG9hdGluZyBjYW5ub3QgYmUgcGxhY2VkIGhpZ2hlciB0aGFuIGV4
aXN0aW5nIGZsb2F0cy4KKyAgICAvLyBUYWtlIHRoZSBzdGF0aWMgcG9zaXRpb24gKHdoZXJlIHRo
ZSBib3ggd291bGQgZ28gaWYgaXQgd2Fzbid0IGZsb2F0aW5nKSBhbmQgYWRqdXN0IGl0IHdpdGgg
dGhlIGxhc3QgZmxvYXRpbmcuCisgICAgYXV0byBtYXJnaW5Cb3hUb3AgPSBmbG9hdEl0ZW0uZGlz
cGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCkudG9wKCk7CisKKyAgICBpZiAoYXV0byBsYXN0Rmxv
YXQgPSBtX2Zsb2F0aW5nU3RhdGUubGFzdCgpKQorICAgICAgICByZXR1cm4gc3RkOjptYXgobWFy
Z2luQm94VG9wLCBsYXN0RmxvYXQtPmRpc3BsYXlCb3goKS5yZWN0V2l0aE1hcmdpbigpLnRvcCgp
KTsKKworICAgIHJldHVybiBtYXJnaW5Cb3hUb3A7Cit9CisKK0xheW91dFVuaXQgRmxvYXRpbmdD
b250ZXh0OjphbGlnbldpdGhDb250YWluaW5nQmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6Rmxv
YXRJdGVtJiBmbG9hdEl0ZW0pIGNvbnN0Cit7CisgICAgLy8gSWYgdGhlcmUgaXMgbm8gZmxvYXRp
bmcgdG8gYWxpZ24gd2l0aCwgcHVzaCB0aGUgYm94IHRvIHRoZSBsZWZ0L3JpZ2h0IGVkZ2Ugb2Yg
aXRzIGNvbnRhaW5pbmcgYmxvY2sncyBjb250ZW50IGJveC4KKyAgICAvLyAoRWl0aGVyIHRoZXJl
J3Mgbm8gZmxvYXRzIGF0IGFsbCBvciB0aGlzIGJveCBkb2VzIG5vdCBmaXQgYXQgYW55IHZlcnRp
Y2FsIHBvc2l0aW9ucyB3aGVyZSB0aGUgZmxvYXRzIGFyZS4pCisgICAgYXV0byYgY29udGFpbmlu
Z0Jsb2NrRGlzcGxheUJveCA9IGZsb2F0SXRlbS5jb250YWluaW5nQmxvY2tEaXNwbGF5Qm94KCk7
CisgICAgYXV0byBjb250YWluaW5nQmxvY2tDb250ZW50Qm94TGVmdCA9IGNvbnRhaW5pbmdCbG9j
a0Rpc3BsYXlCb3gubGVmdCgpICsgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94
TGVmdCgpOworCisgICAgaWYgKGZsb2F0SXRlbS5sYXlvdXRCb3goKS5pc0xlZnRGbG9hdGluZ1Bv
c2l0aW9uZWQoKSkKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hMZWZ0
OworCisgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hMZWZ0ICsgY29udGFpbmlu
Z0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94V2lkdGgoKSAtIGZsb2F0SXRlbS5kaXNwbGF5Qm94
KCkubWFyZ2luQm94KCkud2lkdGgoKTsKK30KKworTGF5b3V0VW5pdCBGbG9hdGluZ0NvbnRleHQ6
OmFsaWduV2l0aEZsb2F0aW5ncyhjb25zdCBGbG9hdGluZ1BhaXImIGZsb2F0aW5nUGFpciwgY29u
c3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9hdEl0ZW0pIGNvbnN0Cit7CisgICAgLy8g
Q29tcHV0ZSB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBmb3IgdGhlIG5ldyBmbG9hdGluZyBieSB0
YWtpbmcgYm90aCB0aGUgY29udGluaW5nIGJsb2NrIGFuZCB0aGUgY3VycmVudCBsZWZ0L3JpZ2h0
IGZsb2F0cyBpbnRvIGFjY291bnQuCisgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJv
eCA9IGZsb2F0SXRlbS5jb250YWluaW5nQmxvY2tEaXNwbGF5Qm94KCk7CisgICAgYXV0byBjb250
YWluaW5nQmxvY2tDb250ZW50Qm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gubGVm
dCgpICsgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94TGVmdCgpOworICAgIGF1
dG8gY29udGFpbmluZ0Jsb2NrQ29udGVudEJveFJpZ2h0ID0gY29udGFpbmluZ0Jsb2NrRGlzcGxh
eUJveC5sZWZ0KCkgKyBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LmNvbnRlbnRCb3hSaWdodCgp
OworICAgIGF1dG8gbWFyZ2luQm94V2lkdGggPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpLm1hcmdp
bkJveCgpLndpZHRoKCk7CisKKyAgICBhdXRvIGxlZnRBbGlnbmVkQm94TGVmdCA9IGNvbnRhaW5p
bmdCbG9ja0NvbnRlbnRCb3hMZWZ0OworICAgIGF1dG8gcmlnaHRBbGlnbmVkQm94TGVmdCA9IGNv
bnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hSaWdodCAtIG1hcmdpbkJveFdpZHRoOworCisgICAgaWYg
KGZsb2F0aW5nUGFpci5pc0VtcHR5KCkpIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgIHJldHVybiBmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3Np
dGlvbmVkKCkgPyBsZWZ0QWxpZ25lZEJveExlZnQgOiByaWdodEFsaWduZWRCb3hMZWZ0OworICAg
IH0KKworICAgIGlmIChmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlv
bmVkKCkpIHsKKyAgICAgICAgaWYgKGF1dG8qIGxlZnREaXNwbGF5Qm94ID0gZmxvYXRpbmdQYWly
LmxlZnQoKSkgeworICAgICAgICAgICAgYXV0byBsZWZ0RmxvYXRpbmdCb3hSaWdodCA9IGxlZnRE
aXNwbGF5Qm94LT5yZWN0V2l0aE1hcmdpbigpLnJpZ2h0KCk7CisgICAgICAgICAgICByZXR1cm4g
c3RkOjptaW4oc3RkOjptYXgobGVmdEFsaWduZWRCb3hMZWZ0LCBsZWZ0RmxvYXRpbmdCb3hSaWdo
dCksIHJpZ2h0QWxpZ25lZEJveExlZnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBy
ZXR1cm4gbGVmdEFsaWduZWRCb3hMZWZ0OworICAgIH0KKworICAgIEFTU0VSVChmbG9hdEl0ZW0u
bGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgpKTsKKworICAgIGlmIChhdXRv
KiByaWdodERpc3BsYXlCb3ggPSBmbG9hdGluZ1BhaXIucmlnaHQoKSkgeworICAgICAgICBhdXRv
IHJpZ2h0RmxvYXRpbmdCb3hMZWZ0ID0gcmlnaHREaXNwbGF5Qm94LT5yZWN0V2l0aE1hcmdpbigp
LmxlZnQoKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KHN0ZDo6bWluKHJpZ2h0QWxpZ25lZEJv
eExlZnQsIHJpZ2h0RmxvYXRpbmdCb3hMZWZ0IC0gbWFyZ2luQm94V2lkdGgpLCBsZWZ0QWxpZ25l
ZEJveExlZnQpOworICAgIH0KKworICAgIHJldHVybiByaWdodEFsaWduZWRCb3hMZWZ0OworfQor
CisvLyBGSVhNRTogZmluZCBhIGJldHRlciBwbGFjZSBmb3IgdGhpcy4KK1Bvc2l0aW9uIEZsb2F0
aW5nQ29udGV4dDo6dG9Db250YWluaW5nQmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJ
dGVtJiBmbG9hdEl0ZW0sIFBvc2l0aW9uIHBvc2l0aW9uKSBjb25zdAoreworICAgIC8vIEZyb20g
Zm9ybWF0dGluZyByb290IGNvb3JkaW5hdGUgc3lzdGVtIGJhY2sgdG8gY29udGFpbmluZyBibG9j
aydzLgorICAgIGlmICgmZmxvYXRJdGVtLmNvbnRhaW5pbmdCbG9jaygpID09ICZtX2Zsb2F0aW5n
U3RhdGUucm9vdCgpKQorICAgICAgICByZXR1cm4gcG9zaXRpb247CisKKyAgICBhdXRvJiBjb250
YWluaW5nQmxvY2tEaXNwbGF5Qm94ID0gZmxvYXRJdGVtLmNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlC
b3goKTsKKyAgICByZXR1cm4geyBwb3NpdGlvbi54IC0gY29udGFpbmluZ0Jsb2NrRGlzcGxheUJv
eC5sZWZ0KCksIHBvc2l0aW9uLnkgLSBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LnRvcCgpIH07
Cit9CisKK0Zsb2F0aW5nUGFpcjo6RmxvYXRpbmdQYWlyKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZs
b2F0TGlzdCYgZmxvYXRzKQorICAgIDogbV9mbG9hdHMoZmxvYXRzKQoreworfQorCitjb25zdCBE
aXNwbGF5OjpCb3gqIEZsb2F0aW5nUGFpcjo6bGVmdCgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2xl
ZnRJbmRleCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBBU1NFUlQobV9mbG9hdHNb
Km1fbGVmdEluZGV4XS5sYXlvdXRCb3goKS5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7Cisg
ICAgcmV0dXJuICZtX2Zsb2F0c1sqbV9sZWZ0SW5kZXhdLmRpc3BsYXlCb3goKTsKK30KKworY29u
c3QgRGlzcGxheTo6Qm94KiBGbG9hdGluZ1BhaXI6OnJpZ2h0KCkgY29uc3QKK3sKKyAgICBpZiAo
IW1fcmlnaHRJbmRleCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBBU1NFUlQobV9m
bG9hdHNbKm1fcmlnaHRJbmRleF0ubGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25l
ZCgpKTsKKyAgICByZXR1cm4gJm1fZmxvYXRzWyptX3JpZ2h0SW5kZXhdLmRpc3BsYXlCb3goKTsK
K30KKworYm9vbCBGbG9hdGluZ1BhaXI6OmludGVyc2VjdHMoY29uc3QgRGlzcGxheTo6Qm94OjpS
ZWN0JiBjYW5kaWRhdGVSZWN0KSBjb25zdAoreworICAgIGF1dG8gaW50ZXJzZWN0cyA9IFsmXShj
b25zdCBEaXNwbGF5OjpCb3gqIGZsb2F0aW5nLCBGbG9hdCBmbG9hdGluZ1R5cGUpIHsKKyAgICAg
ICAgaWYgKCFmbG9hdGluZykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBh
dXRvIG1hcmdpblJlY3QgPSBmbG9hdGluZy0+cmVjdFdpdGhNYXJnaW4oKTsKKyAgICAgICAgLy8g
QmVmb3JlIGludGVyc2VjdGluZywgY2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBwb3NpdGlvbiBpcyB0
b28gZmFyIHRvIHRoZSBsZWZ0L3JpZ2h0LgorICAgICAgICAvLyBUaGUgbmV3IGZsb2F0J3MgY29u
dGFpbmluZyBibG9jayBjb3VsZCBwdXNoIHRoZSBjYW5kaWRhdGUgcG9zaXRpb24gYmV5b25kIHRo
ZSBjdXJyZW50IGZsb2F0IGhvcml6b250YWxseS4KKyAgICAgICAgaWYgKChmbG9hdGluZ1R5cGUg
PT0gRmxvYXQ6OkxlZnQgJiYgY2FuZGlkYXRlUmVjdC5sZWZ0KCkgPCBtYXJnaW5SZWN0LnJpZ2h0
KCkpCisgICAgICAgICAgICB8fCAoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpSaWdodCAmJiBjYW5k
aWRhdGVSZWN0LnJpZ2h0KCkgPiBtYXJnaW5SZWN0LmxlZnQoKSkpCisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG1hcmdpblJlY3QuaW50ZXJzZWN0cyhjYW5kaWRhdGVS
ZWN0KTsKKyAgICB9OworCisgICAgaWYgKCFtX2xlZnRJbmRleCAmJiAhbV9yaWdodEluZGV4KSB7
CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgaWYgKGludGVyc2VjdHMobGVmdCgpLCBGbG9hdDo6TGVmdCkpCisgICAgICAg
IHJldHVybiB0cnVlOworCisgICAgaWYgKGludGVyc2VjdHMocmlnaHQoKSwgRmxvYXQ6OlJpZ2h0
KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wg
RmxvYXRpbmdQYWlyOjpvcGVyYXRvciA9PShjb25zdCBGbG9hdGluZ1BhaXImIG90aGVyKSBjb25z
dAoreworICAgIHJldHVybiBtX2xlZnRJbmRleCA9PSBvdGhlci5tX2xlZnRJbmRleCAmJiBtX3Jp
Z2h0SW5kZXggPT0gb3RoZXIubV9yaWdodEluZGV4OworfQorCitMYXlvdXRVbml0IEZsb2F0aW5n
UGFpcjo6Ym90dG9tKCkgY29uc3QKK3sKKyAgICBhdXRvKiBsZWZ0ID0gdGhpcy0+bGVmdCgpOwor
ICAgIGF1dG8qIHJpZ2h0ID0gdGhpcy0+cmlnaHQoKTsKKyAgICBBU1NFUlQobGVmdCB8fCByaWdo
dCk7CisKKyAgICBhdXRvIGxlZnRCb3R0b20gPSBsZWZ0ID8gc3RkOjpvcHRpb25hbDxMYXlvdXRV
bml0PihsZWZ0LT5yZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKKyAg
ICBhdXRvIHJpZ2h0Qm90dG9tID0gcmlnaHQgPyBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+KHJp
Z2h0LT5yZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKKworICAgIGlm
IChsZWZ0Qm90dG9tICYmIHJpZ2h0Qm90dG9tKQorICAgICAgICByZXR1cm4gc3RkOjptYXgoKmxl
ZnRCb3R0b20sICpyaWdodEJvdHRvbSk7CisKKyAgICBpZiAobGVmdEJvdHRvbSkKKyAgICAgICAg
cmV0dXJuICpsZWZ0Qm90dG9tOworCisgICAgcmV0dXJuICpyaWdodEJvdHRvbTsKK30KKworSXRl
cmF0b3I6Okl0ZXJhdG9yKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzLCBz
dGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRpb24pCisgICAgOiBtX2Zsb2F0
cyhmbG9hdHMpCisgICAgLCBtX2N1cnJlbnQoZmxvYXRzKQoreworICAgIGlmICh2ZXJ0aWNhbFBv
c2l0aW9uKQorICAgICAgICBzZXQoKnZlcnRpY2FsUG9zaXRpb24pOworfQorCitpbmxpbmUgc3Rh
dGljIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IHByZXZpb3VzRmxvYXRpbmdJbmRleChGbG9hdCBm
bG9hdGluZ1R5cGUsIGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzLCB1bnNp
Z25lZCBjdXJyZW50SW5kZXgpCit7CisgICAgUkVMRUFTRV9BU1NFUlQoY3VycmVudEluZGV4IDw9
IGZsb2F0cy5zaXplKCkpOworCisgICAgd2hpbGUgKGN1cnJlbnRJbmRleCkgeworICAgICAgICBh
dXRvJiBmbG9hdGluZyA9IGZsb2F0c1stLWN1cnJlbnRJbmRleF0ubGF5b3V0Qm94KCk7CisgICAg
ICAgIGlmICgoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpMZWZ0ICYmIGZsb2F0aW5nLmlzTGVmdEZs
b2F0aW5nUG9zaXRpb25lZCgpKSB8fCAoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpSaWdodCAmJiBm
bG9hdGluZy5pc1JpZ2h0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKQorICAgICAgICAgICAgcmV0dXJu
IGN1cnJlbnRJbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4geyB9OworfQorCitJdGVyYXRvciYg
SXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreworICAgIGlmIChtX2N1cnJlbnQuaXNFbXB0eSgpKSB7
CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gKnRoaXM7Cisg
ICAgfQorCisgICAgYXV0byBmaW5kUHJldmlvdXNGbG9hdGluZ1dpdGhMb3dlckJvdHRvbSA9IFsm
XShGbG9hdCBmbG9hdGluZ1R5cGUsIHVuc2lnbmVkIGN1cnJlbnRJbmRleCkgLT4gc3RkOjpvcHRp
b25hbDx1bnNpZ25lZD4geworCisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGN1cnJlbnRJbmRleCA8
IG1fZmxvYXRzLnNpemUoKSk7CisKKyAgICAgICAgLy8gTGFzdCBmbG9hdGluZz8gVGhlcmUncyBj
ZXJ0YWlubHkgbm8gcHJldmlvdXMgZmxvYXRpbmcgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgaWYg
KCFjdXJyZW50SW5kZXgpCisgICAgICAgICAgICByZXR1cm4geyB9OworCisgICAgICAgIGF1dG8g
Y3VycmVudEJvdHRvbSA9IG1fZmxvYXRzW2N1cnJlbnRJbmRleF0uZGlzcGxheUJveCgpLnJlY3RX
aXRoTWFyZ2luKCkuYm90dG9tKCk7CisKKyAgICAgICAgc3RkOjpvcHRpb25hbDx1bnNpZ25lZD4g
aW5kZXggPSBjdXJyZW50SW5kZXg7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAg
ICBpbmRleCA9IHByZXZpb3VzRmxvYXRpbmdJbmRleChmbG9hdGluZ1R5cGUsIG1fZmxvYXRzLCAq
aW5kZXgpOworICAgICAgICAgICAgaWYgKCFpbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4g
eyB9OworCisgICAgICAgICAgICBpZiAobV9mbG9hdHNbKmluZGV4XS5kaXNwbGF5Qm94KCkucmVj
dFdpdGhNYXJnaW4oKS5ib3R0b20oKSA+IGN1cnJlbnRCb3R0b20pCisgICAgICAgICAgICAgICAg
cmV0dXJuIGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgIHJldHVybiB7IH07CisgICAgfTsKKworICAgIC8vIDEuIFRha2UgdGhlIGN1cnJl
bnQgZmxvYXRpbmcgZnJvbSBsZWZ0IGFuZCByaWdodCBhbmQgY2hlY2sgd2hpY2ggb25lJ3MgYm90
dG9tIGVkZ2UgaXMgcG9zaXRpb25lZCBoaWdoZXIgKHRoZXkgY291bGQgYmUgb24gdGhlIHNhbWUg
dmVydGljYWwgcG9zaXRpb24gdG9vKS4KKyAgICAvLyBUaGUgY3VycmVudCBmbG9hdHMgZnJvbSBs
ZWZ0IGFuZCByaWdodCBhcmUgY29uc2lkZXJlZCB0aGUgaW5uZXItbW9zdCBwYWlyIGZvciB0aGUg
Y3VycmVudCB2ZXJ0aWNhbCBwb3NpdGlvbi4KKyAgICAvLyAyLiBNb3ZlIGF3YXkgZnJvbSBpbm5l
ci1tb3N0IHBhaXIgYnkgcGlja2luZyBvbmUgb2YgdGhlIHByZXZpb3VzIGZsb2F0cyBpbiB0aGUg
bGlzdCgjMSkKKyAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbmV3IGZsb2F0aW5nJ3MgYm90dG9tIGVk
Z2UgaXMgcG9zaXRpb25lZCBsb3dlciB0aGFuIHRoZSBjdXJyZW50IG9uZSAtd2hpY2ggZXNzZW50
aWFsbHkgbWVhbnMgc2tpcHBpbmcgaW4tYmV0d2VlbiBmbG9hdHMgdGhhdCBhcmUgcG9zaXRpb25l
ZCBoaWdoZXIpLgorICAgIC8vIDMuIFJlc2V0IHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBhbmQgYWxp
Z24gaXQgd2l0aCB0aGUgbmV3IGxlZnQtcmlnaHQgcGFpci4gVGhlc2UgZmxvYXRzIGFyZSBub3cg
dGhlIGlubmVyLW1vc3QgYm94ZXMgZm9yIHRoZSBjdXJyZW50IHZlcnRpY2FsIHBvc2l0aW9uLgor
ICAgIC8vIEFzIHRoZSByZXN1bHQgd2UgaGF2ZSBtb3JlIGhvcml6b250YWwgc3BhY2Ugb24gdGhl
IGN1cnJlbnQgdmVydGljYWwgcG9zaXRpb24uCisgICAgYXV0byBsZWZ0Qm90dG9tID0gbV9jdXJy
ZW50LmxlZnQoKSA/IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4obV9jdXJyZW50LmxlZnQoKS0+
Ym90dG9tKCkpIDogc3RkOjpudWxsb3B0OworICAgIGF1dG8gcmlnaHRCb3R0b20gPSBtX2N1cnJl
bnQucmlnaHQoKSA/IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4obV9jdXJyZW50LnJpZ2h0KCkt
PmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKKworICAgIGF1dG8gdXBkYXRlTGVmdCA9IChsZWZ0
Qm90dG9tID09IHJpZ2h0Qm90dG9tKSB8fCAoIXJpZ2h0Qm90dG9tIHx8IChsZWZ0Qm90dG9tICYm
IGxlZnRCb3R0b20gPCByaWdodEJvdHRvbSkpOyAKKyAgICBhdXRvIHVwZGF0ZVJpZ2h0ID0gKGxl
ZnRCb3R0b20gPT0gcmlnaHRCb3R0b20pIHx8ICghbGVmdEJvdHRvbSB8fCAocmlnaHRCb3R0b20g
JiYgbGVmdEJvdHRvbSA+IHJpZ2h0Qm90dG9tKSk7IAorCisgICAgaWYgKHVwZGF0ZUxlZnQpIHsK
KyAgICAgICAgQVNTRVJUKG1fY3VycmVudC5tX2xlZnRJbmRleCk7CisgICAgICAgIG1fY3VycmVu
dC5tX3ZlcnRpY2FsUG9zaXRpb24gPSAqbGVmdEJvdHRvbTsKKyAgICAgICAgbV9jdXJyZW50Lm1f
bGVmdEluZGV4ID0gZmluZFByZXZpb3VzRmxvYXRpbmdXaXRoTG93ZXJCb3R0b20oRmxvYXQ6Okxl
ZnQsICptX2N1cnJlbnQubV9sZWZ0SW5kZXgpOworICAgIH0KKyAgICAKKyAgICBpZiAodXBkYXRl
UmlnaHQpIHsKKyAgICAgICAgQVNTRVJUKG1fY3VycmVudC5tX3JpZ2h0SW5kZXgpOworICAgICAg
ICBtX2N1cnJlbnQubV92ZXJ0aWNhbFBvc2l0aW9uID0gKnJpZ2h0Qm90dG9tOworICAgICAgICBt
X2N1cnJlbnQubV9yaWdodEluZGV4ID0gZmluZFByZXZpb3VzRmxvYXRpbmdXaXRoTG93ZXJCb3R0
b20oRmxvYXQ6OlJpZ2h0LCAqbV9jdXJyZW50Lm1fcmlnaHRJbmRleCk7CisgICAgfQorCisgICAg
cmV0dXJuICp0aGlzOworfQorCit2b2lkIEl0ZXJhdG9yOjpzZXQoTGF5b3V0VW5pdCB2ZXJ0aWNh
bFBvc2l0aW9uKQoreworICAgIC8vIE1vdmUgdGhlIGl0ZXJhdG9yIHRvIHRoZSBpbml0aWFsIHZl
cnRpY2FsIHBvc2l0aW9uIGJ5IHN0YXJ0aW5nIGF0IHRoZSBpbm5lci1tb3N0IGZsb2F0aW5nIHBh
aXIgKGxhc3QgZmxvYXRzIG9uIGxlZnQvcmlnaHQpLgorICAgIC8vIDEuIENoZWNrIGlmIHRoZSBp
bm5lci1tb3N0IHBhaXIgY292ZXJzIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbi4KKyAgICAvLyAyLiBN
b3ZlIG91dHdhcmRzIGZyb20gdGhlIGlubmVyLW1vc3QgcGFpciB1bnRpbCB0aGUgdmVydGljYWwg
cG9zdGlvbiBpbnRlcnNlY3RzLgorICAgIC8vIChOb3RlIHRoYXQgdmVydGljYWxQb3NpdGlvbiBo
YXMgYWxyZWFkeSBiZWVuIGFkanVzdGVkIHdpdGggdGhlIHRvcCBvZiB0aGUgbGFzdCBmbG9hdC4p
CisKKyAgICBtX2N1cnJlbnQubV92ZXJ0aWNhbFBvc2l0aW9uID0gdmVydGljYWxQb3NpdGlvbjsK
KyAgICAvLyBObyBmbG9hdHMgYXQgYWxsPworICAgIGlmIChtX2Zsb2F0cy5pc0VtcHR5KCkpIHsK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisKKyAgICAgICAgbV9jdXJyZW50Lm1fbGVm
dEluZGV4ID0geyB9OworICAgICAgICBtX2N1cnJlbnQubV9yaWdodEluZGV4ID0geyB9OworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBmaW5kRmxvYXRpbmdCZWxvdyA9IFsmXShG
bG9hdCBmbG9hdGluZ1R5cGUpIC0+IHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IHsKKworICAgICAg
ICBBU1NFUlQoIW1fZmxvYXRzLmlzRW1wdHkoKSk7CisKKyAgICAgICAgYXV0byBpbmRleCA9IGZs
b2F0aW5nVHlwZSA9PSBGbG9hdDo6TGVmdCA/IG1fY3VycmVudC5tX2xlZnRJbmRleCA6IG1fY3Vy
cmVudC5tX3JpZ2h0SW5kZXg7CisgICAgICAgIC8vIFN0YXJ0IGZyb20gdGhlIGVuZCBpZiB3ZSBk
b24ndCBoYXZlIGN1cnJlbnQgeWV0LgorICAgICAgICBpbmRleCA9IGluZGV4LnZhbHVlX29yKG1f
ZmxvYXRzLnNpemUoKSk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbmRl
eCA9IHByZXZpb3VzRmxvYXRpbmdJbmRleChmbG9hdGluZ1R5cGUsIG1fZmxvYXRzLCAqaW5kZXgp
OworICAgICAgICAgICAgaWYgKCFpbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4geyB9Owor
CisgICAgICAgICAgICBhdXRvIGJvdHRvbSA9IG1fZmxvYXRzWyppbmRleF0uZGlzcGxheUJveCgp
LnJlY3RXaXRoTWFyZ2luKCkuYm90dG9tKCk7CisgICAgICAgICAgICAvLyBJcyB0aGlzIGZsb2F0
aW5nIGludHJ1c2l2ZSBvbiB0aGlzIHBvc2l0aW9uPworICAgICAgICAgICAgaWYgKGJvdHRvbSA+
IHZlcnRpY2FsUG9zaXRpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAg
ICB9CisKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICB9OworCisgICAgbV9jdXJyZW50Lm1fbGVm
dEluZGV4ID0gZmluZEZsb2F0aW5nQmVsb3coRmxvYXQ6OkxlZnQpOworICAgIG1fY3VycmVudC5t
X3JpZ2h0SW5kZXggPSBmaW5kRmxvYXRpbmdCZWxvdyhGbG9hdDo6UmlnaHQpOworCisgICAgQVNT
RVJUKCFtX2N1cnJlbnQubV9sZWZ0SW5kZXggfHwgKCptX2N1cnJlbnQubV9sZWZ0SW5kZXggPCBt
X2Zsb2F0cy5zaXplKCkgJiYgbV9mbG9hdHNbKm1fY3VycmVudC5tX2xlZnRJbmRleF0ubGF5b3V0
Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKTsKKyAgICBBU1NFUlQoIW1fY3VycmVu
dC5tX3JpZ2h0SW5kZXggfHwgKCptX2N1cnJlbnQubV9yaWdodEluZGV4IDwgbV9mbG9hdHMuc2l6
ZSgpICYmIG1fZmxvYXRzWyptX2N1cnJlbnQubV9yaWdodEluZGV4XS5sYXlvdXRCb3goKS5pc1Jp
Z2h0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKTsKK30KKworYm9vbCBJdGVyYXRvcjo6b3BlcmF0b3I9
PShjb25zdCBJdGVyYXRvciYgb3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY3VycmVudCA9
PSBvdGhlci5tX2N1cnJlbnQ7Cit9CisKK2Jvb2wgSXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3Qg
SXRlcmF0b3ImIG90aGVyKSBjb25zdAoreworICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsK
K30KKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxv
YXRmb3JtYXR0aW5nL0Zsb2F0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zs
b2F0Zm9ybWF0dGluZy9GbG9hdGluZ0NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kOTAzYTkzZGEzMzJj
NjIyYmQ1YzdhM2Y0NzIzZjEyZmE5NTY5NmE5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zsb2F0Zm9ybWF0dGluZy9GbG9hdGluZ0NvbnRleHQuaApAQCAtMCwwICsx
LDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgor
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZP
Uk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKKyNpbmNsdWRl
ICJMYXlvdXRVbml0cy5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2MuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xhc3MgQm94OworY2xhc3MgQ29u
dGFpbmVyOworY2xhc3MgRmxvYXRpbmdQYWlyOworY2xhc3MgTGF5b3V0Q29udGV4dDsKKworLy8g
RmxvYXRpbmdDb250ZXh0IGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3RpbmcgdGhlIHBvc2l0aW9u
IG9mIGEgYm94IGluIHRoZSBjdXJyZW50IGZvcm1hdHRpbmcgY29udGV4dAorLy8gYnkgdGFraW5n
IHRoZSBmbG9hdGluZyBib3hlcyBpbnRvIGFjY291bnQuCitjbGFzcyBGbG9hdGluZ0NvbnRleHQg
eworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoRmxvYXRpbmdDb250ZXh0KTsKK3B1YmxpYzoK
KyAgICBGbG9hdGluZ0NvbnRleHQoRmxvYXRpbmdTdGF0ZSYpOworCisgICAgRmxvYXRpbmdTdGF0
ZSYgZmxvYXRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRpbmdTdGF0ZTsgfQorCisg
ICAgUG9zaXRpb24gcG9zaXRpb25Gb3JGbG9hdChjb25zdCBCb3gmKSBjb25zdDsKKyAgICBzdGQ6
Om9wdGlvbmFsPExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRpb25XaXRoQ2xlYXJhbmNlKGNvbnN0
IEJveCYpIGNvbnN0OworCitwcml2YXRlOgorICAgIExheW91dENvbnRleHQmIGxheW91dENvbnRl
eHQoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nU3RhdGUubGF5b3V0Q29udGV4dCgpOyB9CisK
KyAgICBQb3NpdGlvbiBmbG9hdGluZ1Bvc2l0aW9uKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0
SXRlbSYpIGNvbnN0OworCisgICAgTGF5b3V0VW5pdCBpbml0aWFsVmVydGljYWxQb3NpdGlvbihj
b25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mKSBjb25zdDsKKyAgICBMYXlvdXRVbml0IGFs
aWduV2l0aENvbnRhaW5pbmdCbG9jayhjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mKSBj
b25zdDsKKyAgICBMYXlvdXRVbml0IGFsaWduV2l0aEZsb2F0aW5ncyhjb25zdCBGbG9hdGluZ1Bh
aXImLCBjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mKSBjb25zdDsKKyAgICBQb3NpdGlv
biB0b0NvbnRhaW5pbmdCbG9jayhjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mLCBQb3Np
dGlvbikgY29uc3Q7CisKKyAgICBGbG9hdGluZ1N0YXRlJiBtX2Zsb2F0aW5nU3RhdGU7Cit9Owor
Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbG9hdGZv
cm1hdHRpbmcvRmxvYXRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxvYXRm
b3JtYXR0aW5nL0Zsb2F0aW5nU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQxZDNlY2VkY2JmNTNhMzAw
YzhmMTk1Yjk5MWQzNDViNmZkYmUwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZmxvYXRmb3JtYXR0aW5nL0Zsb2F0aW5nU3RhdGUuY3BwCkBAIC0wLDAgKzEsMTIy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZsb2F0aW5n
U3RhdGUuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5j
bHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNs
dWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lT
T19BTExPQ0FURURfSU1QTChGbG9hdGluZ1N0YXRlKTsKKworRmxvYXRpbmdTdGF0ZTo6RmxvYXRJ
dGVtOjpGbG9hdEl0ZW0oY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0IEZsb2F0aW5nU3RhdGUm
IGZsb2F0aW5nU3RhdGUpCisgICAgOiBtX2xheW91dEJveChtYWtlV2Vha1B0cihjb25zdF9jYXN0
PEJveCY+KGxheW91dEJveCkpKQorICAgICwgbV9jb250YWluaW5nQmxvY2sobWFrZVdlYWtQdHIo
Y29uc3RfY2FzdDxDb250YWluZXImPigqbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpKSkpCisg
ICAgLCBtX2Fic29sdXRlRGlzcGxheUJveChGb3JtYXR0aW5nQ29udGV4dDo6bWFwQm94VG9BbmNl
c3RvcihmbG9hdGluZ1N0YXRlLmxheW91dENvbnRleHQoKSwgbGF5b3V0Qm94LCBkb3duY2FzdDxD
b250YWluZXI+KGZsb2F0aW5nU3RhdGUucm9vdCgpKSkpCisgICAgLCBtX2NvbnRhaW5pbmdCbG9j
a0Fic29sdXRlRGlzcGxheUJveChGb3JtYXR0aW5nQ29udGV4dDo6bWFwQm94VG9BbmNlc3Rvcihm
bG9hdGluZ1N0YXRlLmxheW91dENvbnRleHQoKSwgKm1fY29udGFpbmluZ0Jsb2NrLCBkb3duY2Fz
dDxDb250YWluZXI+KGZsb2F0aW5nU3RhdGUucm9vdCgpKSkpCit7Cit9CisKK0Zsb2F0aW5nU3Rh
dGU6OkZsb2F0aW5nU3RhdGUoTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCwgY29uc3QgQm94
JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpCisgICAgOiBtX2xheW91dENvbnRleHQobGF5b3V0Q29u
dGV4dCkKKyAgICAsIG1fZm9ybWF0dGluZ0NvbnRleHRSb290KG1ha2VXZWFrUHRyKGNvbnN0X2Nh
c3Q8Qm94Jj4oZm9ybWF0dGluZ0NvbnRleHRSb290KSkpCit7Cit9CisKKyNpZm5kZWYgTkRFQlVH
CitzdGF0aWMgYm9vbCBiZWxvbmdzVG9UaGlzRmxvYXRpbmdDb250ZXh0KGNvbnN0IEJveCYgbGF5
b3V0Qm94LCBjb25zdCBCb3gmIGZsb2F0aW5nU3RhdGVSb290KQoreworICAgIGF1dG8mIGZvcm1h
dHRpbmdDb250ZXh0Um9vdCA9IGxheW91dEJveC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKKyAg
ICBpZiAoJmZvcm1hdHRpbmdDb250ZXh0Um9vdCA9PSAmZmxvYXRpbmdTdGF0ZVJvb3QpCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgLy8gTWF5YmUgdGhlIGxheW91dCBib3ggYmVsb25ncyB0
byBhbiBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0IHRoYXQgaW5oZXJpdHMgdGhlIGZsb2F0aW5n
IHN0YXRlIGZyb20gdGhlIHBhcmVudCAoYmxvY2spIGZvcm1hdHRpbmcgY29udGV4dC4gCisgICAg
aWYgKCFmb3JtYXR0aW5nQ29udGV4dFJvb3QuZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29u
dGV4dCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gJmZvcm1hdHRpbmdD
b250ZXh0Um9vdC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKSA9PSAmZmxvYXRpbmdTdGF0ZVJvb3Q7
Cit9CisjZW5kaWYKKwordm9pZCBGbG9hdGluZ1N0YXRlOjpyZW1vdmUoY29uc3QgQm94JiBsYXlv
dXRCb3gpCit7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IG1fZmxvYXRzLnNp
emUoKTsgKytpbmRleCkgeworICAgICAgICBpZiAoJm1fZmxvYXRzW2luZGV4XS5sYXlvdXRCb3go
KSA9PSAmbGF5b3V0Qm94KSB7CisgICAgICAgICAgICBtX2Zsb2F0cy5yZW1vdmUoaW5kZXgpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOworfQorCit2b2lkIEZsb2F0aW5nU3RhdGU6OmFwcGVuZChjb25zdCBCb3gmIGxheW91
dEJveCkKK3sKKyAgICBBU1NFUlQoaXM8Q29udGFpbmVyPigqbV9mb3JtYXR0aW5nQ29udGV4dFJv
b3QpKTsKKyAgICBBU1NFUlQoYmVsb25nc1RvVGhpc0Zsb2F0aW5nQ29udGV4dChsYXlvdXRCb3gs
ICptX2Zvcm1hdHRpbmdDb250ZXh0Um9vdCkpOworCisgICAgLy8gRmxvYXRpbmcgc3RhdGUgc2hv
dWxkIGhvbGQgYm94ZXMgd2l0aCBjb21wdXRlZCBwb3NpdGlvbi9zaXplLgorICAgIEFTU0VSVCht
X2xheW91dENvbnRleHQuZGlzcGxheUJveEZvckxheW91dEJveChsYXlvdXRCb3gpKTsKKyAgICBB
U1NFUlQoaXM8Q29udGFpbmVyPigqbV9mb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsKKworICAgIG1f
ZmxvYXRzLmFwcGVuZCh7IGxheW91dEJveCwgKnRoaXMgfSk7Cit9CisKK3N0ZDo6b3B0aW9uYWw8
TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6Ym90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGluZ0Nv
bnRleHRSb290LCBDbGVhciB0eXBlKSBjb25zdAoreworICAgIGlmIChtX2Zsb2F0cy5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICAvLyBUT0RPOiBDdXJyZW50bHkgdGhpcyBp
cyBvbmx5IGNhbGxlZCBvbmNlIGZvciBlYWNoIGZvcm1hdHRpbmcgY29udGV4dCByb290IHdpdGgg
ZmxvYXRzIHBlciBsYXlvdXQuCisgICAgLy8gQ2FjaGUgdGhlIHZhbHVlIGlmIHdlIGVuZCB1cCBj
YWxsaW5nIGl0IG1vcmUgZnJlcXVlbnRseSAoYW5kIHVwZGF0ZSBpdCBhdCBhcHBlbmQvcmVtb3Zl
KS4KKyAgICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IGJvdHRvbTsKKyAgICBmb3IgKGF1dG8m
IGZsb2F0SXRlbSA6IG1fZmxvYXRzKSB7CisgICAgICAgIC8vIElnbm9yZSBmbG9hdHMgZnJvbSBv
dGhlciBmb3JtYXR0aW5nIGNvbnRleHRzIHdoZW4gdGhlIGZsb2F0aW5nIHN0YXRlIGlzIGluaGVy
aXRlZC4KKyAgICAgICAgaWYgKCZmb3JtYXR0aW5nQ29udGV4dFJvb3QgIT0gJmZsb2F0SXRlbS5s
YXlvdXRCb3goKS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgIGlmICgodHlwZSA9PSBDbGVhcjo6TGVmdCAmJiAhZmxvYXRJdGVtLmxheW91
dEJveCgpLmlzTGVmdEZsb2F0aW5nUG9zaXRpb25lZCgpKQorICAgICAgICAgICAgfHwgKHR5cGUg
PT0gQ2xlYXI6OlJpZ2h0ICYmICFmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5n
UG9zaXRpb25lZCgpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGF1dG8gZmxv
YXRzQm90dG9tID0gZmxvYXRJdGVtLmRpc3BsYXlCb3goKS5yZWN0V2l0aE1hcmdpbigpLmJvdHRv
bSgpOworICAgICAgICBpZiAoYm90dG9tKSB7CisgICAgICAgICAgICBib3R0b20gPSBzdGQ6Om1h
eCgqYm90dG9tLCBmbG9hdHNCb3R0b20pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IH0KKyAgICAgICAgYm90dG9tID0gZmxvYXRzQm90dG9tOworICAgIH0KKyAgICByZXR1cm4gYm90
dG9tOworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91
dC9mbG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdTdGF0ZS5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0
L2Zsb2F0Zm9ybWF0dGluZy9GbG9hdGluZ1N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOWE3ZTJiNDI0Zjhj
NzllNDQyM2FkMzY5MmJkY2E2OWMyYjE3MmI3NwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9mbG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdTdGF0ZS5oCkBAIC0wLDAgKzEs
MTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgor
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZP
Uk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkRpc3BsYXlCb3guaCIKKyNpbmNsdWRlIDx3
dGYvSXNvTWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL1JlZi5oPgorI2luY2x1ZGUgPHd0Zi9XZWFr
UHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIExheW91dCB7CisKK2Ns
YXNzIEJveDsKK2NsYXNzIENvbnRhaW5lcjsKK2NsYXNzIEZvcm1hdHRpbmdTdGF0ZTsKK2NsYXNz
IExheW91dENvbnRleHQ7CisKKy8vIEZsb2F0aW5nU3RhdGUgaG9sZHMgdGhlIGZsb2F0aW5nIGJv
eGVzIHBlciBmb3JtYXR0aW5nIGNvbnRleHQuCitjbGFzcyBGbG9hdGluZ1N0YXRlIDogcHVibGlj
IFJlZkNvdW50ZWQ8RmxvYXRpbmdTdGF0ZT4geworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQo
RmxvYXRpbmdTdGF0ZSk7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxGbG9hdGluZ1N0YXRlPiBj
cmVhdGUoTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCwgY29uc3QgQm94JiBmb3JtYXR0aW5n
Q29udGV4dFJvb3QpIHsgcmV0dXJuIGFkb3B0UmVmKCpuZXcgRmxvYXRpbmdTdGF0ZShsYXlvdXRD
b250ZXh0LCBmb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsgfQorCisgICAgdm9pZCBhcHBlbmQoY29u
c3QgQm94JiBsYXlvdXRCb3gpOworICAgIHZvaWQgcmVtb3ZlKGNvbnN0IEJveCYgbGF5b3V0Qm94
KTsKKworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRzLmlzRW1wdHko
KTsgfQorCisgICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBsZWZ0Qm90dG9tKGNvbnN0IEJv
eCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSBjb25zdDsKKyAgICBzdGQ6Om9wdGlvbmFsPExheW91
dFVuaXQ+IHJpZ2h0Qm90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSBjb25z
dDsKKyAgICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IGJvdHRvbShjb25zdCBCb3gmIGZvcm1h
dHRpbmdDb250ZXh0Um9vdCkgY29uc3Q7CisKKyAgICBjbGFzcyBGbG9hdEl0ZW0geworICAgIHB1
YmxpYzoKKyAgICAgICAgRmxvYXRJdGVtKGNvbnN0IEJveCYsIGNvbnN0IEZsb2F0aW5nU3RhdGUm
KTsKKworICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xh
eW91dEJveDsgfQorICAgICAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5pbmdCbG9jaygpIGNv
bnN0IHsgcmV0dXJuICptX2NvbnRhaW5pbmdCbG9jazsgfQorCisgICAgICAgIGNvbnN0IERpc3Bs
YXk6OkJveCYgZGlzcGxheUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYWJzb2x1dGVEaXNwbGF5Qm94
OyB9CisgICAgICAgIGNvbnN0IERpc3BsYXk6OkJveCYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJv
eCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGFpbmluZ0Jsb2NrQWJzb2x1dGVEaXNwbGF5Qm94OyB9
CisKKyAgICBwcml2YXRlOgorICAgICAgICBXZWFrUHRyPEJveD4gbV9sYXlvdXRCb3g7CisgICAg
ICAgIFdlYWtQdHI8Q29udGFpbmVyPiBtX2NvbnRhaW5pbmdCbG9jazsKKworICAgICAgICBEaXNw
bGF5OjpCb3ggbV9hYnNvbHV0ZURpc3BsYXlCb3g7CisgICAgICAgIERpc3BsYXk6OkJveCBtX2Nv
bnRhaW5pbmdCbG9ja0Fic29sdXRlRGlzcGxheUJveDsKKyAgICB9OworICAgIHVzaW5nIEZsb2F0
TGlzdCA9IFZlY3RvcjxGbG9hdEl0ZW0+OworICAgIGNvbnN0IEZsb2F0TGlzdCYgZmxvYXRzKCkg
Y29uc3QgeyByZXR1cm4gbV9mbG9hdHM7IH0KKyAgICBjb25zdCBGbG9hdEl0ZW0qIGxhc3QoKSBj
b25zdCB7IHJldHVybiBpc0VtcHR5KCkgPyBudWxscHRyIDogJm1fZmxvYXRzLmxhc3QoKTsgfQor
Citwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBGbG9hdGluZ0NvbnRleHQ7CisgICAgRmxvYXRp
bmdTdGF0ZShMYXlvdXRDb250ZXh0JiwgY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3Qp
OworCisgICAgTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1f
bGF5b3V0Q29udGV4dDsgfQorICAgIGNvbnN0IEJveCYgcm9vdCgpIGNvbnN0IHsgcmV0dXJuICpt
X2Zvcm1hdHRpbmdDb250ZXh0Um9vdDsgfQorCisgICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0
PiBib3R0b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyKSBjb25zdDsK
KworICAgIExheW91dENvbnRleHQmIG1fbGF5b3V0Q29udGV4dDsKKyAgICBXZWFrUHRyPEJveD4g
bV9mb3JtYXR0aW5nQ29udGV4dFJvb3Q7CisgICAgRmxvYXRMaXN0IG1fZmxvYXRzOworfTsKKwor
aW5saW5lIHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6bGVmdEJvdHRv
bShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3QKK3sgCisgICAgcmV0dXJu
IGJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyOjpMZWZ0KTsKK30KKworaW5saW5l
IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6cmlnaHRCb3R0b20oY29u
c3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGJvdHRv
bShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyOjpSaWdodCk7Cit9CisKK2lubGluZSBzdGQ6
Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0aW5nU3RhdGU6OmJvdHRvbShjb25zdCBCb3gmIGZv
cm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3QKK3sKKyAgICByZXR1cm4gYm90dG9tKGZvcm1hdHRp
bmdDb250ZXh0Um9vdCwgQ2xlYXI6OkJvdGgpOworfQorCit9Cit9CisjZW5kaWYK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>347801</attachid>
            <date>2018-08-22 09:07:48 -0700</date>
            <delta_ts>2018-08-22 09:30:24 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-188846-20180822090745.patch</filename>
            <type>text/plain</type>
            <size>75861</size>
            <attacher name="alan">zalan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjM1MTcwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGE4NTY3MjZlMjVkZDEy
ZGI4Y2IyOTc2NWUxZjRmMmY2OGM2YWU5Yy4uMzAwMmE1ZGI2YTJiMTQzMzQ0YzAxNDE4MmY4MjRi
MDJkY2M0NTQ4OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY0IEBACisyMDE4LTA4LTIyICBaYWxh
biBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CisKKyAgICAgICAgW0xGQ11bRmxvYXRpbmddIE1v
dmUgZmlsZXMgdG8gYSBkZWRpY2F0ZWQgZGlyZWN0b3J5LgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg4ODQ2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
U2ltb24gRnJhc2VyLgorCisgICAgICAgIGxheW91dC9GbG9hdCogLT4gbGF5b3V0L2Zsb2F0Zm9y
bWF0dGluZworCisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgor
ICAgICAgICAqIGxheW91dC9mbG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdDb250ZXh0LmNwcDogUmVu
YW1lZCBmcm9tIFNvdXJjZS9XZWJDb3JlL2xheW91dC9GbG9hdGluZ0NvbnRleHQuY3BwLgorICAg
ICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1BhaXI6OmlzRW1wdHkgY29uc3QpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1BhaXI6OnZlcnRpY2FsUG9zaXRpb24gY29u
c3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpJdGVyYXRvcjo6b3BlcmF0b3IqIGNvbnN0
KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6YmVnaW4pOgorICAgICAgICAoV2ViQ29yZTo6
TGF5b3V0OjplbmQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ0NvbnRleHQ6
OkZsb2F0aW5nQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29u
dGV4dDo6cG9zaXRpb25Gb3JGbG9hdCBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6
OkZsb2F0aW5nQ29udGV4dDo6dmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UgY29uc3QpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ0NvbnRleHQ6OmZsb2F0aW5nUG9zaXRp
b24gY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ0NvbnRleHQ6Omlu
aXRpYWxWZXJ0aWNhbFBvc2l0aW9uIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6
RmxvYXRpbmdDb250ZXh0OjphbGlnbldpdGhDb250YWluaW5nQmxvY2sgY29uc3QpOgorICAgICAg
ICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ0NvbnRleHQ6OmFsaWduV2l0aEZsb2F0aW5ncyBj
b25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4dDo6dG9Db250
YWluaW5nQmxvY2sgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1Bh
aXI6OkZsb2F0aW5nUGFpcik6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFp
cjo6bGVmdCBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFpcjo6
cmlnaHQgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1BhaXI6Omlu
dGVyc2VjdHMgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1BhaXI6
Om9wZXJhdG9yID09IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdQ
YWlyOjpib3R0b20gY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpJdGVyYXRvcjo6
SXRlcmF0b3IpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpwcmV2aW91c0Zsb2F0aW5nSW5k
ZXgpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpJdGVyYXRvcjo6b3BlcmF0b3IrKyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6Okl0ZXJhdG9yOjpzZXQpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5b3V0OjpJdGVyYXRvcjo6b3BlcmF0b3I9PSBjb25zdCk6CisgICAgICAgIChXZWJDb3Jl
OjpMYXlvdXQ6Okl0ZXJhdG9yOjpvcGVyYXRvciE9IGNvbnN0KToKKyAgICAgICAgKiBsYXlvdXQv
ZmxvYXRmb3JtYXR0aW5nL0Zsb2F0aW5nQ29udGV4dC5oOiBSZW5hbWVkIGZyb20gU291cmNlL1dl
YkNvcmUvbGF5b3V0L0Zsb2F0aW5nQ29udGV4dC5oLgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0
OjpGbG9hdGluZ0NvbnRleHQ6OmZsb2F0aW5nU3RhdGUgY29uc3QpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5b3V0OjpGbG9hdGluZ0NvbnRleHQ6OmxheW91dENvbnRleHQgY29uc3QpOgorICAgICAg
ICAqIGxheW91dC9mbG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdTdGF0ZS5jcHA6IFJlbmFtZWQgZnJv
bSBTb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdTdGF0ZS5jcHAuCisgICAgICAgIChXZWJD
b3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbTo6RmxvYXRJdGVtKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdTdGF0ZTo6RmxvYXRpbmdTdGF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXlvdXQ6OmJlbG9uZ3NUb1RoaXNGbG9hdGluZ0NvbnRleHQpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpyZW1vdmUpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjphcHBlbmQpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpib3R0b20gY29uc3QpOgorICAgICAgICAqIGxheW91
dC9mbG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdTdGF0ZS5oOiBSZW5hbWVkIGZyb20gU291cmNlL1dl
YkNvcmUvbGF5b3V0L0Zsb2F0aW5nU3RhdGUuaC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6
RmxvYXRpbmdTdGF0ZTo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRp
bmdTdGF0ZTo6aXNFbXB0eSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0
aW5nU3RhdGU6OkZsb2F0SXRlbTo6bGF5b3V0Qm94IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6
OkxheW91dDo6RmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtOjpjb250YWluaW5nQmxvY2sgY29uc3Qp
OgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW06OmRp
c3BsYXlCb3ggY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRl
OjpGbG9hdEl0ZW06OmNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3ggY29uc3QpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpmbG9hdHMgY29uc3QpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpsYXN0IGNvbnN0KToKKyAgICAgICAgKFdl
YkNvcmU6OkxheW91dDo6RmxvYXRpbmdTdGF0ZTo6bGF5b3V0Q29udGV4dCBjb25zdCk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OnJvb3QgY29uc3QpOgorICAgICAg
ICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpsZWZ0Qm90dG9tIGNvbnN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdTdGF0ZTo6cmlnaHRCb3R0b20gY29uc3Qp
OgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpib3R0b20gY29uc3Qp
OgorCiAyMDE4LTA4LTIyICBaYWxhbiBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CiAKICAgICAg
ICAgQWRkIGNoYW5nZXMgbWlzc2luZyBmcm9tIHIyMzQ5MjUuCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9Tb3VyY2VzLnR4dCBiL1NvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0CmluZGV4IGYw
ZWY3ODYxMGRkMDQ2YjM2NzI3MmMwNWFhYzY3NDQ1ODVjOTM4YTIuLjJkMTE0MDVlZDFhMDViNzhl
NDE3NzZlZGQ2N2ZiZDk2NzliNDZiZmUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1NvdXJj
ZXMudHh0CisrKyBiL1NvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0CkBAIC0xMjE3LDggKzEyMTcs
NiBAQCBpbnNwZWN0b3IvYWdlbnRzL3dvcmtlci9Xb3JrZXJEZWJ1Z2dlckFnZW50LmNwcAogaW5z
cGVjdG9yL2FnZW50cy93b3JrZXIvV29ya2VyTmV0d29ya0FnZW50LmNwcAogaW5zcGVjdG9yL2Fn
ZW50cy93b3JrZXIvV29ya2VyUnVudGltZUFnZW50LmNwcAogCi1sYXlvdXQvRmxvYXRpbmdDb250
ZXh0LmNwcAotbGF5b3V0L0Zsb2F0aW5nU3RhdGUuY3BwCiBsYXlvdXQvRm9ybWF0dGluZ0NvbnRl
eHQuY3BwCiBsYXlvdXQvRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKIGxheW91dC9Gb3Jt
YXR0aW5nU3RhdGUuY3BwCkBAIC0xMjMwLDYgKzEyMjgsOCBAQCBsYXlvdXQvYmxvY2tmb3JtYXR0
aW5nL0Jsb2NrRm9ybWF0dGluZ1N0YXRlLmNwcAogbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9j
a01hcmdpbkNvbGxhcHNlLmNwcAogbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0ludmFsaWRh
dGlvbi5jcHAKIGxheW91dC9kaXNwbGF5dHJlZS9EaXNwbGF5Qm94LmNwcAorbGF5b3V0L2Zsb2F0
cy9GbG9hdGluZ0NvbnRleHQuY3BwCitsYXlvdXQvZmxvYXRzL0Zsb2F0aW5nU3RhdGUuY3BwCiBs
YXlvdXQvaW5saW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5jcHAKIGxheW91
dC9pbmxpbmVmb3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKIGxheW91dC9pbmxp
bmVmb3JtYXR0aW5nL0lubGluZUludmFsaWRhdGlvbi5jcHAKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCAxZDY0YjMyZjRhMTMyMDgy
M2E1ODY3ZDBhNWYxZGQ0MWE0YjhlNmIzLi4xMTU2MjJkZTRkYjQwMmQ2Y2Y0MTA4ZjBhYzYxMWMz
ZDJiNjUzMTVmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCkBAIC0xNTY2NSwxMiArMTU2NjUsOSBAQAogCQkJY2hpbGRyZW4gPSAoCiAJ
CQkJMTE1Q0ZBOTkyMDhCQzA5QTAwMUU2OTkxIC8qIGJsb2NrZm9ybWF0dGluZyAqLywKIAkJCQkx
MTk5RkE1ODIwOEUzQzRDMDAyMzU4Q0MgLyogZGlzcGxheXRyZWUgKi8sCisJCQkJNkZDRkMwNTUy
MTJEQUNDMjAwNzY5NUQyIC8qIGZsb2F0cyAqLywKIAkJCQkxMTVDRkE5QTIwOEJDMTQwMDAxRTY5
OTEgLyogaW5saW5lZm9ybWF0dGluZyAqLywKIAkJCQkxMTVDRkE5MDIwOEI5NDQxMDAxRTY5OTEg
LyogbGF5b3V0dHJlZSAqLywKLQkJCQkxMTVDRkE4NTIwOEI5MDY2MDAxRTY5OTEgLyogRmxvYXRp
bmdDb250ZXh0LmNwcCAqLywKLQkJCQkxMTVDRkE4NDIwOEI5MDY2MDAxRTY5OTEgLyogRmxvYXRp
bmdDb250ZXh0LmggKi8sCi0JCQkJMTE1Q0ZBODEyMDhCOEVEQTAwMUU2OTkxIC8qIEZsb2F0aW5n
U3RhdGUuY3BwICovLAotCQkJCTExNUNGQTgwMjA4QjhFREEwMDFFNjk5MSAvKiBGbG9hdGluZ1N0
YXRlLmggKi8sCiAJCQkJMTE1Q0ZBNjkyMDhBRjdEMDAwMUU2OTkxIC8qIEZvcm1hdHRpbmdDb250
ZXh0LmNwcCAqLywKIAkJCQkxMTVDRkE2ODIwOEFGN0QwMDAxRTY5OTEgLyogRm9ybWF0dGluZ0Nv
bnRleHQuaCAqLywKIAkJCQk2RkJCODYwNTIwQjQ2NEI2MDBEQUQ5MzggLyogRm9ybWF0dGluZ0Nv
bnRleHRHZW9tZXRyeS5jcHAgKi8sCkBAIC0xOTQ3MSw2ICsxOTQ2OCwxNyBAQAogCQkJcGF0aCA9
IHNpbXBsZTsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CiAJCX07CisJCTZGQ0ZDMDU1MjEy
REFDQzIwMDc2OTVEMiAvKiBmbG9hdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNo
aWxkcmVuID0gKAorCQkJCTExNUNGQTg1MjA4QjkwNjYwMDFFNjk5MSAvKiBGbG9hdGluZ0NvbnRl
eHQuY3BwICovLAorCQkJCTExNUNGQTg0MjA4QjkwNjYwMDFFNjk5MSAvKiBGbG9hdGluZ0NvbnRl
eHQuaCAqLywKKwkJCQkxMTVDRkE4MTIwOEI4RURBMDAxRTY5OTEgLyogRmxvYXRpbmdTdGF0ZS5j
cHAgKi8sCisJCQkJMTE1Q0ZBODAyMDhCOEVEQTAwMUU2OTkxIC8qIEZsb2F0aW5nU3RhdGUuaCAq
LywKKwkJCSk7CisJCQlwYXRoID0gZmxvYXRzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsK
KwkJfTsKIAkJNkZFN0REREQyMEVDNkU4QjAwOEI1QjRFIC8qIHRleHRsYXlvdXQgKi8gPSB7CiAJ
CQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKApkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvbGF5b3V0L0Zsb2F0aW5nQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
RmxvYXRpbmdDb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlYWVh
MjdiZTE4MGM1YzEwZjRlZDkyNThiMGFiZjQyYzM4YTc3YS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdD
b250ZXh0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUxNiArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
Ci0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAq
Ci0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQot
I2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgotCi0jaWYg
RU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJEaXNwbGF5Qm94
LmgiCi0jaW5jbHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyLmgi
Ci0jaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxp
bmVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1XVEZf
TUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoRmxvYXRpbmdDb250ZXh0KTsKLQotLy8gRmluZGluZyB0
aGUgdG9wL2xlZnQgcG9zaXRpb24gZm9yIGEgbmV3IGZsb2F0aW5nKEYpCi0vLyAgX19fXyAgX19f
XyAgX19fX18gICAgICAgICAgICAgICBfX19fX19fCi0vLyB8ICAgIHx8IEwyIHx8ICAgICB8IDwt
LS0tLTEtLS0tPnwgICAgICAgfAotLy8gfCAgICB8fF9fX198fCAgTDMgfCAgICAgICAgICAgICB8
ICAgUjEgIHwKLS8vIHwgTDEgfCAgICAgIHxfX19fX3wgICAgICAgICAgICAgfCAgICAgICB8Ci0v
LyB8X19fX3wgPC0tLS0tLS0tLS0tLS0yLS0tLS0tLS0tPnwgICAgICAgfAotLy8gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKLS8vICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfF9fX19fX198Ci0vLwotLy8gMS4gQ29tcHV0ZSB0aGUgaW5pdGlhbCB2ZXJ0
aWNhbCBwb3NpdGlvbiBmb3IgKEYpIC0+ICgxKQotLy8gMi4gRmluZCB0aGUgY29ycmVzcG9uZGlu
ZyBmbG9hdGluZyBwYWlyIChMMy1SMSkKLS8vIDMuIEFsaWduIChGKSBob3Jpem9udGFsbHkgd2l0
aCAoTDMtUjEpIGRlcGVuZGluZyB3aGV0aGVyIChGKSBpcyBsZWZ0L3JpZ2h0IHBvc2l0aW9uZWQK
LS8vIDQuIEludGVyc2VjdCAoRikgd2l0aCAoTDMtUjEpCi0vLyA1LiBJZiAoRikgZG9lcyBub3Qg
Zml0LCBmaW5kIHRoZSBuZXh0IGZsb2F0aW5nIHBhaXIgKEwxLVIxKQotLy8gNi4gUmVwZWF0IHVu
dGlsIGVpdGhlciAoRikgZml0cy9ubyBtb3JlIGZsb2F0cy4KLS8vIE5vdGUgdGhhdCBhbGwgY29v
cmRpbmF0ZXMgYXJlIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgZm9ybWF0dGluZyBy
b290LgotLy8gVGhlIGZvcm1hdHRpbmcgcm9vdCBoZXJlIGlzIGFsd2F5cyB0aGUgb25lIHRoYXQg
ZXN0YWJsaXNoZXMgdGhlIGZsb2F0aW5nIGNvbnRleHQgKHNlZSBpbmhlcml0ZWQgZmxvYXRpbmcg
Y29udGV4dCkuCi0vLyAoSXQgc2ltcGx5IG1lYW5zIHRoYXQgdGhlIGZsb2F0IGJveCdzIGZvcm1h
dHRpbmcgcm9vdCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIEZvcm1hdHRpbmdD
b250ZXh0J3Mgcm9vdC4pCi0KLWNsYXNzIEl0ZXJhdG9yOwotCi1jbGFzcyBGbG9hdGluZ1BhaXIg
ewotcHVibGljOgotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFtX2xlZnRJbmRl
eCAmJiAhbV9yaWdodEluZGV4OyB9Ci0gICAgY29uc3QgRGlzcGxheTo6Qm94KiBsZWZ0KCkgY29u
c3Q7Ci0gICAgY29uc3QgRGlzcGxheTo6Qm94KiByaWdodCgpIGNvbnN0OwotICAgIGJvb2wgaW50
ZXJzZWN0cyhjb25zdCBEaXNwbGF5OjpCb3g6OlJlY3QmKSBjb25zdDsKLSAgICBMYXlvdXRVbml0
IHZlcnRpY2FsUG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBtX3ZlcnRpY2FsUG9zaXRpb247IH0K
LSAgICBMYXlvdXRVbml0IGJvdHRvbSgpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBGbG9hdGluZ1BhaXImKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgSXRl
cmF0b3I7Ci0gICAgRmxvYXRpbmdQYWlyKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYp
OwotCi0gICAgY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRMaXN0JiBtX2Zsb2F0czsKLQotICAg
IHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IG1fbGVmdEluZGV4OwotICAgIHN0ZDo6b3B0aW9uYWw8
dW5zaWduZWQ+IG1fcmlnaHRJbmRleDsKLSAgICBMYXlvdXRVbml0IG1fdmVydGljYWxQb3NpdGlv
bjsKLX07Ci0KLWNsYXNzIEl0ZXJhdG9yIHsKLXB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBG
bG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmLCBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHZlcnRp
Y2FsUG9zaXRpb24pOwotCi0gICAgY29uc3QgRmxvYXRpbmdQYWlyJiBvcGVyYXRvciooKSBjb25z
dCB7IHJldHVybiBtX2N1cnJlbnQ7IH0KLSAgICBJdGVyYXRvciYgb3BlcmF0b3IrKygpOwotICAg
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciYpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBJdGVyYXRvciYpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHZvaWQgc2V0KExh
eW91dFVuaXQgdmVydGljYWxQb3NpdGlvbik7Ci0KLSAgICBjb25zdCBGbG9hdGluZ1N0YXRlOjpG
bG9hdExpc3QmIG1fZmxvYXRzOwotICAgIEZsb2F0aW5nUGFpciBtX2N1cnJlbnQ7Ci19OwotCi1z
dGF0aWMgSXRlcmF0b3IgYmVnaW4oY29uc3QgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSwg
TGF5b3V0VW5pdCBpbml0aWFsVmVydGljYWxQb3NpdGlvbikKLXsKLSAgICAvLyBTdGFydCB3aXRo
IHRoZSBpbm5lci1tb3N0IGZsb2F0aW5nIHBhaXIgZm9yIHRoZSBpbml0aWFsIHZlcnRpY2FsIHBv
c2l0aW9uLgotICAgIHJldHVybiBJdGVyYXRvcihmbG9hdGluZ1N0YXRlLmZsb2F0cygpLCBpbml0
aWFsVmVydGljYWxQb3NpdGlvbik7Ci19Ci0KLXN0YXRpYyBJdGVyYXRvciBlbmQoY29uc3QgRmxv
YXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSkKLXsKLSAgICByZXR1cm4gSXRlcmF0b3IoZmxvYXRp
bmdTdGF0ZS5mbG9hdHMoKSwgc3RkOjpudWxsb3B0KTsKLX0KLQotRmxvYXRpbmdDb250ZXh0OjpG
bG9hdGluZ0NvbnRleHQoRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSkKLSAgICA6IG1fZmxv
YXRpbmdTdGF0ZShmbG9hdGluZ1N0YXRlKQotewotfQotCi1Qb3NpdGlvbiBGbG9hdGluZ0NvbnRl
eHQ6OnBvc2l0aW9uRm9yRmxvYXQoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAg
QVNTRVJUKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsKLSAgICBGbG9hdGluZ1N0
YXRlOjpGbG9hdEl0ZW0gZmxvYXRJdGVtID0geyBsYXlvdXRCb3gsIG1fZmxvYXRpbmdTdGF0ZSB9
OwotCi0gICAgUG9zaXRpb24gZmxvYXRQb3NpdGlvbjsKLSAgICBpZiAobV9mbG9hdGluZ1N0YXRl
LmlzRW1wdHkoKSkgewotICAgICAgICAvLyBObyBmbG9hdCBib3ggb24gdGhlIGNvbnRleHQgeWV0
IC0+IGFsaWduIGl0IHdpdGggdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBsZWZ0L3JpZ2h0IGVkZ2Uu
Ci0gICAgICAgIGF1dG8mIGRpc3BsYXlCb3ggPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpOwotICAg
ICAgICBmbG9hdFBvc2l0aW9uID0geyBhbGlnbldpdGhDb250YWluaW5nQmxvY2soZmxvYXRJdGVt
KSArIGRpc3BsYXlCb3gubWFyZ2luTGVmdCgpLCBkaXNwbGF5Qm94LnRvcCgpIH07Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgLy8gRmluZCB0aGUgdG9wIG1vc3QgcG9zaXRpb24gd2hlcmUgdGhlIGZs
b2F0IGJveCBmaXRzLgotICAgICAgICBmbG9hdFBvc2l0aW9uID0gZmxvYXRpbmdQb3NpdGlvbihm
bG9hdEl0ZW0pOwotICAgIH0KLQotICAgIHJldHVybiB0b0NvbnRhaW5pbmdCbG9jayhmbG9hdEl0
ZW0sIGZsb2F0UG9zaXRpb24pOwotfQotCi1zdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0
aW5nQ29udGV4dDo6dmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlv
dXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5oYXNGbG9hdENsZWFyKCkpOwot
ICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotCi0gICAgaWYgKG1fZmxv
YXRpbmdTdGF0ZS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICBhdXRvIGJv
dHRvbSA9IFsmXShzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IGZsb2F0Qm90dG9tKSAtPiBzdGQ6
Om9wdGlvbmFsPExheW91dFVuaXQ+IHsKLSAgICAgICAgLy8gJ2JvdHRvbScgaXMgaW4gdGhlIGZv
cm1hdHRpbmcgcm9vdCdzIGNvb3JkaW5hdGUgc3lzdGVtLgotICAgICAgICBpZiAoIWZsb2F0Qm90
dG9tKQotICAgICAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgICAgICAvLyA5LjUuMiBDb250cm9s
bGluZyBmbG93IG5leHQgdG8gZmxvYXRzOiB0aGUgJ2NsZWFyJyBwcm9wZXJ0eQotICAgICAgICAv
LyBUaGVuIHRoZSBhbW91bnQgb2YgY2xlYXJhbmNlIGlzIHNldCB0byB0aGUgZ3JlYXRlciBvZjoK
LSAgICAgICAgLy8KLSAgICAgICAgLy8gMS4gVGhlIGFtb3VudCBuZWNlc3NhcnkgdG8gcGxhY2Ug
dGhlIGJvcmRlciBlZGdlIG9mIHRoZSBibG9jayBldmVuIHdpdGggdGhlIGJvdHRvbSBvdXRlciBl
ZGdlIG9mIHRoZSBsb3dlc3QgZmxvYXQgdGhhdCBpcyB0byBiZSBjbGVhcmVkLgotICAgICAgICAv
LyAyLiBUaGUgYW1vdW50IG5lY2Vzc2FyeSB0byBwbGFjZSB0aGUgdG9wIGJvcmRlciBlZGdlIG9m
IHRoZSBibG9jayBhdCBpdHMgaHlwb3RoZXRpY2FsIHBvc2l0aW9uLgotCi0gICAgICAgIGF1dG8m
IGxheW91dENvbnRleHQgPSB0aGlzLT5sYXlvdXRDb250ZXh0KCk7Ci0gICAgICAgIGF1dG8mIGRp
c3BsYXlCb3ggPSAqbGF5b3V0Q29udGV4dC5kaXNwbGF5Qm94Rm9yTGF5b3V0Qm94KGxheW91dEJv
eCk7Ci0gICAgICAgIGF1dG8gcm9vdFJlbGF0aXZlVG9wID0gRm9ybWF0dGluZ0NvbnRleHQ6Om1h
cFRvcExlZnRUb0FuY2VzdG9yKGxheW91dENvbnRleHQsIGxheW91dEJveCwgZG93bmNhc3Q8Q29u
dGFpbmVyPihtX2Zsb2F0aW5nU3RhdGUucm9vdCgpKSkueTsKLSAgICAgICAgYXV0byBjbGVhcmFu
Y2UgPSAqZmxvYXRCb3R0b20gLSByb290UmVsYXRpdmVUb3A7Ci0gICAgICAgIGlmIChjbGVhcmFu
Y2UgPD0gMCkKLSAgICAgICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAgICAgLy8gQ2xlYXJhbmNl
IGluaGliaXRzIG1hcmdpbiBjb2xsYXBzaW5nLiBMZXQncyByZXNldCB0aGUgcmVsZXZhbnQgYWRq
b2luaW5nIG1hcmdpbnMuCi0gICAgICAgIGlmIChhdXRvKiBwcmV2aW91c0luRmxvd1NpYmxpbmcg
PSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGF1dG8m
IHByZXZpb3VzSW5GbG93RGlzcGxheUJveCA9ICpsYXlvdXRDb250ZXh0LmRpc3BsYXlCb3hGb3JM
YXlvdXRCb3goKnByZXZpb3VzSW5GbG93U2libGluZyk7Ci0KLSAgICAgICAgICAgIC8vIFNpbmNl
IHRoZSBwcmV2aW91cyBpbmZsb3cgc2libGluZyBoYXMgYWxyZWFkeSBiZWVuIGxhaWQgb3V0LCBp
dHMgbWFyZ2luIGlzIGNvbGxhcHNlZCBieSBub3cuCi0gICAgICAgICAgICBBU1NFUlQoIXByZXZp
b3VzSW5GbG93RGlzcGxheUJveC5tYXJnaW5Cb3R0b20oKSk7Ci0gICAgICAgICAgICBhdXRvIGNv
bGxhcHNlZE1hcmdpbiA9IGRpc3BsYXlCb3gubWFyZ2luVG9wKCk7Ci0KLSAgICAgICAgICAgIC8v
IFJlc2V0IHByZXZpb3VzIGJvdHRvbSBhbmQgY3VycmVudCB0b3AgbWFyZ2lucyB0byBub24tY29s
bGFwc2luZy4KLSAgICAgICAgICAgIHByZXZpb3VzSW5GbG93RGlzcGxheUJveC5zZXRWZXJ0aWNh
bE1hcmdpbih7IHByZXZpb3VzSW5GbG93RGlzcGxheUJveC5tYXJnaW5Ub3AoKSwgcHJldmlvdXNJ
bkZsb3dEaXNwbGF5Qm94Lm5vbkNvbGxhcHNlZE1hcmdpbkJvdHRvbSgpIH0pOwotICAgICAgICAg
ICAgZGlzcGxheUJveC5zZXRWZXJ0aWNhbE1hcmdpbih7IGRpc3BsYXlCb3gubm9uQ29sbGFwc2Vk
TWFyZ2luVG9wKCksIGRpc3BsYXlCb3gubWFyZ2luQm90dG9tKCkgfSk7Ci0KLSAgICAgICAgICAg
IGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0gcHJldmlvdXNJbkZsb3dEaXNwbGF5Qm94Lm1hcmdp
bkJvdHRvbSgpICsgZGlzcGxheUJveC5tYXJnaW5Ub3AoKTsKLSAgICAgICAgICAgIGF1dG8gbWFy
Z2luT2Zmc2V0ID0gbm9uQ29sbGFwc2VkTWFyZ2luIC0gY29sbGFwc2VkTWFyZ2luOwotICAgICAg
ICAgICAgLy8gTW92ZSB0aGUgYm94IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSBpdCB3b3VsZCBiZSB3
aXRoIG5vbi1jb2xsYXBzZWQgbWFyZ2lucy4KLSAgICAgICAgICAgIHJvb3RSZWxhdGl2ZVRvcCAr
PSBtYXJnaW5PZmZzZXQ7Ci0KLSAgICAgICAgICAgIC8vIEhhdmluZyBuZWdhdGl2ZSBjbGVhcmFu
Y2UgaXMgYWxzbyBub3JtYWwuIEl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgYm94IHdpdGggdGhlIG5v
bi1jb2xsYXBzZWQgbWFyZ2lucyBpcyBub3cgbG93ZXIgdGhhbiBpdCBuZWVkcyB0byBiZS4KLSAg
ICAgICAgICAgIGNsZWFyYW5jZSAtPSBtYXJnaW5PZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAg
Ly8gTm93IGFkanVzdCB0aGUgYm94J3MgcG9zaXRpb24gd2l0aCB0aGUgY2xlYXJhbmNlLgotICAg
ICAgICByb290UmVsYXRpdmVUb3AgKz0gY2xlYXJhbmNlOwotICAgICAgICBBU1NFUlQoKmZsb2F0
Qm90dG9tID09IHJvb3RSZWxhdGl2ZVRvcCk7Ci0KLSAgICAgICAgLy8gVGhlIHJldHVybiB2ZXJ0
aWNhbCBwb3NpdGlvbiBpcyBpbiB0aGUgY29udGFpbmluZyBibG9jaydzIGNvb3JkaW5hdGUgc3lz
dGVtLgotICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1Jvb3RSZWxhdGl2ZVRvcCA9IEZvcm1h
dHRpbmdDb250ZXh0OjptYXBUb3BMZWZ0VG9BbmNlc3RvcihsYXlvdXRDb250ZXh0LCAqbGF5b3V0
Qm94LmNvbnRhaW5pbmdCbG9jaygpLCBkb3duY2FzdDxDb250YWluZXI+KG1fZmxvYXRpbmdTdGF0
ZS5yb290KCkpKS55OwotICAgICAgICByZXR1cm4gcm9vdFJlbGF0aXZlVG9wIC0gY29udGFpbmlu
Z0Jsb2NrUm9vdFJlbGF0aXZlVG9wOwotICAgIH07Ci0KLSAgICBhdXRvIGNsZWFyID0gbGF5b3V0
Qm94LnN0eWxlKCkuY2xlYXIoKTsKLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dFJvb3QgPSBs
YXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCk7Ci0KLSAgICBpZiAoY2xlYXIgPT0gQ2xl
YXI6OkxlZnQpCi0gICAgICAgIHJldHVybiBib3R0b20obV9mbG9hdGluZ1N0YXRlLmxlZnRCb3R0
b20oZm9ybWF0dGluZ0NvbnRleHRSb290KSk7Ci0KLSAgICBpZiAoY2xlYXIgPT0gQ2xlYXI6OlJp
Z2h0KQotICAgICAgICByZXR1cm4gYm90dG9tKG1fZmxvYXRpbmdTdGF0ZS5yaWdodEJvdHRvbShm
b3JtYXR0aW5nQ29udGV4dFJvb3QpKTsKLQotICAgIGlmIChjbGVhciA9PSBDbGVhcjo6Qm90aCkK
LSAgICAgICAgcmV0dXJuIGJvdHRvbShtX2Zsb2F0aW5nU3RhdGUuYm90dG9tKGZvcm1hdHRpbmdD
b250ZXh0Um9vdCkpOwotCi0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIHsg
fTsKLX0KLQotUG9zaXRpb24gRmxvYXRpbmdDb250ZXh0OjpmbG9hdGluZ1Bvc2l0aW9uKGNvbnN0
IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYgZmxvYXRJdGVtKSBjb25zdAotewotICAgIGF1dG8g
aW5pdGlhbFZlcnRpY2FsUG9zaXRpb24gPSB0aGlzLT5pbml0aWFsVmVydGljYWxQb3NpdGlvbihm
bG9hdEl0ZW0pOwotICAgIGF1dG8mIGRpc3BsYXlCb3ggPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgp
OwotICAgIGF1dG8gbWFyZ2luQm94U2l6ZSA9IGRpc3BsYXlCb3gubWFyZ2luQm94KCkuc2l6ZSgp
OwotCi0gICAgYXV0byBlbmQgPSBMYXlvdXQ6OmVuZChtX2Zsb2F0aW5nU3RhdGUpOwotICAgIGF1
dG8gdG9wID0gaW5pdGlhbFZlcnRpY2FsUG9zaXRpb247Ci0gICAgYXV0byBib3R0b21Nb3N0ID0g
dG9wOwotICAgIGZvciAoYXV0byBpdGVyYXRvciA9IGJlZ2luKG1fZmxvYXRpbmdTdGF0ZSwgaW5p
dGlhbFZlcnRpY2FsUG9zaXRpb24pOyBpdGVyYXRvciAhPSBlbmQ7ICsraXRlcmF0b3IpIHsKLSAg
ICAgICAgQVNTRVJUKCEoKml0ZXJhdG9yKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIGF1dG8gZmxv
YXRzID0gKml0ZXJhdG9yOwotICAgICAgICB0b3AgPSBmbG9hdHMudmVydGljYWxQb3NpdGlvbigp
OwotCi0gICAgICAgIC8vIE1vdmUgdGhlIGJveCBob3Jpem9udGFsbHkgc28gdGhhdCBpdCBhbGln
bnMgd2l0aCB0aGUgY3VycmVudCBmbG9hdGluZyBwYWlyLgotICAgICAgICBhdXRvIGxlZnQgPSBh
bGlnbldpdGhGbG9hdGluZ3MoZmxvYXRzLCBmbG9hdEl0ZW0pOwotICAgICAgICAvLyBDaGVjayBp
ZiB0aGUgYm94IGZpdHMgYXQgdGhpcyB2ZXJ0aWNhbCBwb3NpdGlvbi4KLSAgICAgICAgaWYgKCFm
bG9hdHMuaW50ZXJzZWN0cyh7IHRvcCwgbGVmdCwgbWFyZ2luQm94U2l6ZS53aWR0aCgpLCBtYXJn
aW5Cb3hTaXplLmhlaWdodCgpIH0pKQotICAgICAgICAgICAgcmV0dXJuIHsgbGVmdCArIGRpc3Bs
YXlCb3gubWFyZ2luTGVmdCgpLCB0b3AgKyBkaXNwbGF5Qm94Lm1hcmdpblRvcCgpIH07Ci0KLSAg
ICAgICAgYm90dG9tTW9zdCA9IGZsb2F0cy5ib3R0b20oKTsKLSAgICAgICAgLy8gTW92ZSB0byB0
aGUgbmV4dCBmbG9hdGluZyBwYWlyLgotICAgIH0KLQotICAgIC8vIFBhc3NlZCBhbGwgdGhlIGZs
b2F0cyBhbmQgc3RpbGwgZG9lcyBub3QgZml0PwotICAgIHJldHVybiB7IGFsaWduV2l0aENvbnRh
aW5pbmdCbG9jayhmbG9hdEl0ZW0pICsgZGlzcGxheUJveC5tYXJnaW5MZWZ0KCksIGJvdHRvbU1v
c3QgKyBkaXNwbGF5Qm94Lm1hcmdpblRvcCgpIH07Ci19Ci0KLUxheW91dFVuaXQgRmxvYXRpbmdD
b250ZXh0Ojppbml0aWFsVmVydGljYWxQb3NpdGlvbihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9h
dEl0ZW0mIGZsb2F0SXRlbSkgY29uc3QKLXsKLSAgICAvLyBJbmNvbWluZyBmbG9hdGluZyBjYW5u
b3QgYmUgcGxhY2VkIGhpZ2hlciB0aGFuIGV4aXN0aW5nIGZsb2F0cy4KLSAgICAvLyBUYWtlIHRo
ZSBzdGF0aWMgcG9zaXRpb24gKHdoZXJlIHRoZSBib3ggd291bGQgZ28gaWYgaXQgd2Fzbid0IGZs
b2F0aW5nKSBhbmQgYWRqdXN0IGl0IHdpdGggdGhlIGxhc3QgZmxvYXRpbmcuCi0gICAgYXV0byBt
YXJnaW5Cb3hUb3AgPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCkudG9w
KCk7Ci0KLSAgICBpZiAoYXV0byBsYXN0RmxvYXQgPSBtX2Zsb2F0aW5nU3RhdGUubGFzdCgpKQot
ICAgICAgICByZXR1cm4gc3RkOjptYXgobWFyZ2luQm94VG9wLCBsYXN0RmxvYXQtPmRpc3BsYXlC
b3goKS5yZWN0V2l0aE1hcmdpbigpLnRvcCgpKTsKLQotICAgIHJldHVybiBtYXJnaW5Cb3hUb3A7
Ci19Ci0KLUxheW91dFVuaXQgRmxvYXRpbmdDb250ZXh0OjphbGlnbldpdGhDb250YWluaW5nQmxv
Y2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9hdEl0ZW0pIGNvbnN0Ci17Ci0g
ICAgLy8gSWYgdGhlcmUgaXMgbm8gZmxvYXRpbmcgdG8gYWxpZ24gd2l0aCwgcHVzaCB0aGUgYm94
IHRvIHRoZSBsZWZ0L3JpZ2h0IGVkZ2Ugb2YgaXRzIGNvbnRhaW5pbmcgYmxvY2sncyBjb250ZW50
IGJveC4KLSAgICAvLyAoRWl0aGVyIHRoZXJlJ3Mgbm8gZmxvYXRzIGF0IGFsbCBvciB0aGlzIGJv
eCBkb2VzIG5vdCBmaXQgYXQgYW55IHZlcnRpY2FsIHBvc2l0aW9ucyB3aGVyZSB0aGUgZmxvYXRz
IGFyZS4pCi0gICAgYXV0byYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCA9IGZsb2F0SXRlbS5j
b250YWluaW5nQmxvY2tEaXNwbGF5Qm94KCk7Ci0gICAgYXV0byBjb250YWluaW5nQmxvY2tDb250
ZW50Qm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gubGVmdCgpICsgY29udGFpbmlu
Z0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94TGVmdCgpOwotCi0gICAgaWYgKGZsb2F0SXRlbS5s
YXlvdXRCb3goKS5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGNv
bnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hMZWZ0OwotCi0gICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9j
a0NvbnRlbnRCb3hMZWZ0ICsgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94V2lk
dGgoKSAtIGZsb2F0SXRlbS5kaXNwbGF5Qm94KCkubWFyZ2luQm94KCkud2lkdGgoKTsKLX0KLQot
TGF5b3V0VW5pdCBGbG9hdGluZ0NvbnRleHQ6OmFsaWduV2l0aEZsb2F0aW5ncyhjb25zdCBGbG9h
dGluZ1BhaXImIGZsb2F0aW5nUGFpciwgY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBm
bG9hdEl0ZW0pIGNvbnN0Ci17Ci0gICAgLy8gQ29tcHV0ZSB0aGUgaG9yaXpvbnRhbCBwb3NpdGlv
biBmb3IgdGhlIG5ldyBmbG9hdGluZyBieSB0YWtpbmcgYm90aCB0aGUgY29udGluaW5nIGJsb2Nr
IGFuZCB0aGUgY3VycmVudCBsZWZ0L3JpZ2h0IGZsb2F0cyBpbnRvIGFjY291bnQuCi0gICAgYXV0
byYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCA9IGZsb2F0SXRlbS5jb250YWluaW5nQmxvY2tE
aXNwbGF5Qm94KCk7Ci0gICAgYXV0byBjb250YWluaW5nQmxvY2tDb250ZW50Qm94TGVmdCA9IGNv
bnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gubGVmdCgpICsgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJv
eC5jb250ZW50Qm94TGVmdCgpOwotICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrQ29udGVudEJveFJp
Z2h0ID0gY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5sZWZ0KCkgKyBjb250YWluaW5nQmxvY2tE
aXNwbGF5Qm94LmNvbnRlbnRCb3hSaWdodCgpOwotICAgIGF1dG8gbWFyZ2luQm94V2lkdGggPSBm
bG9hdEl0ZW0uZGlzcGxheUJveCgpLm1hcmdpbkJveCgpLndpZHRoKCk7Ci0KLSAgICBhdXRvIGxl
ZnRBbGlnbmVkQm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hMZWZ0OwotICAgIGF1
dG8gcmlnaHRBbGlnbmVkQm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hSaWdodCAt
IG1hcmdpbkJveFdpZHRoOwotCi0gICAgaWYgKGZsb2F0aW5nUGFpci5pc0VtcHR5KCkpIHsKLSAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBmbG9hdEl0ZW0ubGF5
b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkgPyBsZWZ0QWxpZ25lZEJveExlZnQg
OiByaWdodEFsaWduZWRCb3hMZWZ0OwotICAgIH0KLQotICAgIGlmIChmbG9hdEl0ZW0ubGF5b3V0
Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgaWYgKGF1dG8qIGxl
ZnREaXNwbGF5Qm94ID0gZmxvYXRpbmdQYWlyLmxlZnQoKSkgewotICAgICAgICAgICAgYXV0byBs
ZWZ0RmxvYXRpbmdCb3hSaWdodCA9IGxlZnREaXNwbGF5Qm94LT5yZWN0V2l0aE1hcmdpbigpLnJp
Z2h0KCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RkOjptaW4oc3RkOjptYXgobGVmdEFsaWduZWRC
b3hMZWZ0LCBsZWZ0RmxvYXRpbmdCb3hSaWdodCksIHJpZ2h0QWxpZ25lZEJveExlZnQpOwotICAg
ICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbGVmdEFsaWduZWRCb3hMZWZ0OwotICAg
IH0KLQotICAgIEFTU0VSVChmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9z
aXRpb25lZCgpKTsKLQotICAgIGlmIChhdXRvKiByaWdodERpc3BsYXlCb3ggPSBmbG9hdGluZ1Bh
aXIucmlnaHQoKSkgewotICAgICAgICBhdXRvIHJpZ2h0RmxvYXRpbmdCb3hMZWZ0ID0gcmlnaHRE
aXNwbGF5Qm94LT5yZWN0V2l0aE1hcmdpbigpLmxlZnQoKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6
bWF4KHN0ZDo6bWluKHJpZ2h0QWxpZ25lZEJveExlZnQsIHJpZ2h0RmxvYXRpbmdCb3hMZWZ0IC0g
bWFyZ2luQm94V2lkdGgpLCBsZWZ0QWxpZ25lZEJveExlZnQpOwotICAgIH0KLQotICAgIHJldHVy
biByaWdodEFsaWduZWRCb3hMZWZ0OwotfQotCi0vLyBGSVhNRTogZmluZCBhIGJldHRlciBwbGFj
ZSBmb3IgdGhpcy4KLVBvc2l0aW9uIEZsb2F0aW5nQ29udGV4dDo6dG9Db250YWluaW5nQmxvY2so
Y29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9hdEl0ZW0sIFBvc2l0aW9uIHBvc2l0
aW9uKSBjb25zdAotewotICAgIC8vIEZyb20gZm9ybWF0dGluZyByb290IGNvb3JkaW5hdGUgc3lz
dGVtIGJhY2sgdG8gY29udGFpbmluZyBibG9jaydzLgotICAgIGlmICgmZmxvYXRJdGVtLmNvbnRh
aW5pbmdCbG9jaygpID09ICZtX2Zsb2F0aW5nU3RhdGUucm9vdCgpKQotICAgICAgICByZXR1cm4g
cG9zaXRpb247Ci0KLSAgICBhdXRvJiBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94ID0gZmxvYXRJ
dGVtLmNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3goKTsKLSAgICByZXR1cm4geyBwb3NpdGlvbi54
IC0gY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5sZWZ0KCksIHBvc2l0aW9uLnkgLSBjb250YWlu
aW5nQmxvY2tEaXNwbGF5Qm94LnRvcCgpIH07Ci19Ci0KLUZsb2F0aW5nUGFpcjo6RmxvYXRpbmdQ
YWlyKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzKQotICAgIDogbV9mbG9h
dHMoZmxvYXRzKQotewotfQotCi1jb25zdCBEaXNwbGF5OjpCb3gqIEZsb2F0aW5nUGFpcjo6bGVm
dCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2xlZnRJbmRleCkKLSAgICAgICAgcmV0dXJuIG51bGxw
dHI7Ci0KLSAgICBBU1NFUlQobV9mbG9hdHNbKm1fbGVmdEluZGV4XS5sYXlvdXRCb3goKS5pc0xl
ZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7Ci0gICAgcmV0dXJuICZtX2Zsb2F0c1sqbV9sZWZ0SW5k
ZXhdLmRpc3BsYXlCb3goKTsKLX0KLQotY29uc3QgRGlzcGxheTo6Qm94KiBGbG9hdGluZ1BhaXI6
OnJpZ2h0KCkgY29uc3QKLXsKLSAgICBpZiAoIW1fcmlnaHRJbmRleCkKLSAgICAgICAgcmV0dXJu
IG51bGxwdHI7Ci0KLSAgICBBU1NFUlQobV9mbG9hdHNbKm1fcmlnaHRJbmRleF0ubGF5b3V0Qm94
KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgpKTsKLSAgICByZXR1cm4gJm1fZmxvYXRzWypt
X3JpZ2h0SW5kZXhdLmRpc3BsYXlCb3goKTsKLX0KLQotYm9vbCBGbG9hdGluZ1BhaXI6OmludGVy
c2VjdHMoY29uc3QgRGlzcGxheTo6Qm94OjpSZWN0JiBjYW5kaWRhdGVSZWN0KSBjb25zdAotewot
ICAgIGF1dG8gaW50ZXJzZWN0cyA9IFsmXShjb25zdCBEaXNwbGF5OjpCb3gqIGZsb2F0aW5nLCBG
bG9hdCBmbG9hdGluZ1R5cGUpIHsKLSAgICAgICAgaWYgKCFmbG9hdGluZykKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgICAgICBhdXRvIG1hcmdpblJlY3QgPSBmbG9hdGluZy0+cmVj
dFdpdGhNYXJnaW4oKTsKLSAgICAgICAgLy8gQmVmb3JlIGludGVyc2VjdGluZywgY2hlY2sgaWYg
dGhlIGNhbmRpZGF0ZSBwb3NpdGlvbiBpcyB0b28gZmFyIHRvIHRoZSBsZWZ0L3JpZ2h0LgotICAg
ICAgICAvLyBUaGUgbmV3IGZsb2F0J3MgY29udGFpbmluZyBibG9jayBjb3VsZCBwdXNoIHRoZSBj
YW5kaWRhdGUgcG9zaXRpb24gYmV5b25kIHRoZSBjdXJyZW50IGZsb2F0IGhvcml6b250YWxseS4K
LSAgICAgICAgaWYgKChmbG9hdGluZ1R5cGUgPT0gRmxvYXQ6OkxlZnQgJiYgY2FuZGlkYXRlUmVj
dC5sZWZ0KCkgPCBtYXJnaW5SZWN0LnJpZ2h0KCkpCi0gICAgICAgICAgICB8fCAoZmxvYXRpbmdU
eXBlID09IEZsb2F0OjpSaWdodCAmJiBjYW5kaWRhdGVSZWN0LnJpZ2h0KCkgPiBtYXJnaW5SZWN0
LmxlZnQoKSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIG1hcmdp
blJlY3QuaW50ZXJzZWN0cyhjYW5kaWRhdGVSZWN0KTsKLSAgICB9OwotCi0gICAgaWYgKCFtX2xl
ZnRJbmRleCAmJiAhbV9yaWdodEluZGV4KSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGludGVyc2VjdHMobGVm
dCgpLCBGbG9hdDo6TGVmdCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKGludGVy
c2VjdHMocmlnaHQoKSwgRmxvYXQ6OlJpZ2h0KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRmxvYXRpbmdQYWlyOjpvcGVyYXRvciA9PShjb25z
dCBGbG9hdGluZ1BhaXImIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBtX2xlZnRJbmRleCA9
PSBvdGhlci5tX2xlZnRJbmRleCAmJiBtX3JpZ2h0SW5kZXggPT0gb3RoZXIubV9yaWdodEluZGV4
OwotfQotCi1MYXlvdXRVbml0IEZsb2F0aW5nUGFpcjo6Ym90dG9tKCkgY29uc3QKLXsKLSAgICBh
dXRvKiBsZWZ0ID0gdGhpcy0+bGVmdCgpOwotICAgIGF1dG8qIHJpZ2h0ID0gdGhpcy0+cmlnaHQo
KTsKLSAgICBBU1NFUlQobGVmdCB8fCByaWdodCk7Ci0KLSAgICBhdXRvIGxlZnRCb3R0b20gPSBs
ZWZ0ID8gc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PihsZWZ0LT5yZWN0V2l0aE1hcmdpbigpLmJv
dHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKLSAgICBhdXRvIHJpZ2h0Qm90dG9tID0gcmlnaHQgPyBz
dGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+KHJpZ2h0LT5yZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgp
KSA6IHN0ZDo6bnVsbG9wdDsKLQotICAgIGlmIChsZWZ0Qm90dG9tICYmIHJpZ2h0Qm90dG9tKQot
ICAgICAgICByZXR1cm4gc3RkOjptYXgoKmxlZnRCb3R0b20sICpyaWdodEJvdHRvbSk7Ci0KLSAg
ICBpZiAobGVmdEJvdHRvbSkKLSAgICAgICAgcmV0dXJuICpsZWZ0Qm90dG9tOwotCi0gICAgcmV0
dXJuICpyaWdodEJvdHRvbTsKLX0KLQotSXRlcmF0b3I6Okl0ZXJhdG9yKGNvbnN0IEZsb2F0aW5n
U3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzLCBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHZlcnRp
Y2FsUG9zaXRpb24pCi0gICAgOiBtX2Zsb2F0cyhmbG9hdHMpCi0gICAgLCBtX2N1cnJlbnQoZmxv
YXRzKQotewotICAgIGlmICh2ZXJ0aWNhbFBvc2l0aW9uKQotICAgICAgICBzZXQoKnZlcnRpY2Fs
UG9zaXRpb24pOwotfQotCi1pbmxpbmUgc3RhdGljIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IHBy
ZXZpb3VzRmxvYXRpbmdJbmRleChGbG9hdCBmbG9hdGluZ1R5cGUsIGNvbnN0IEZsb2F0aW5nU3Rh
dGU6OkZsb2F0TGlzdCYgZmxvYXRzLCB1bnNpZ25lZCBjdXJyZW50SW5kZXgpCi17Ci0gICAgUkVM
RUFTRV9BU1NFUlQoY3VycmVudEluZGV4IDw9IGZsb2F0cy5zaXplKCkpOwotCi0gICAgd2hpbGUg
KGN1cnJlbnRJbmRleCkgewotICAgICAgICBhdXRvJiBmbG9hdGluZyA9IGZsb2F0c1stLWN1cnJl
bnRJbmRleF0ubGF5b3V0Qm94KCk7Ci0gICAgICAgIGlmICgoZmxvYXRpbmdUeXBlID09IEZsb2F0
OjpMZWZ0ICYmIGZsb2F0aW5nLmlzTGVmdEZsb2F0aW5nUG9zaXRpb25lZCgpKSB8fCAoZmxvYXRp
bmdUeXBlID09IEZsb2F0OjpSaWdodCAmJiBmbG9hdGluZy5pc1JpZ2h0RmxvYXRpbmdQb3NpdGlv
bmVkKCkpKQotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4geyB9OwotfQotCi1JdGVyYXRvciYgSXRlcmF0b3I6Om9wZXJhdG9yKysoKQotewotICAg
IGlmIChtX2N1cnJlbnQuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgYXV0byBmaW5kUHJldmlvdXNG
bG9hdGluZ1dpdGhMb3dlckJvdHRvbSA9IFsmXShGbG9hdCBmbG9hdGluZ1R5cGUsIHVuc2lnbmVk
IGN1cnJlbnRJbmRleCkgLT4gc3RkOjpvcHRpb25hbDx1bnNpZ25lZD4gewotCi0gICAgICAgIFJF
TEVBU0VfQVNTRVJUKGN1cnJlbnRJbmRleCA8IG1fZmxvYXRzLnNpemUoKSk7Ci0KLSAgICAgICAg
Ly8gTGFzdCBmbG9hdGluZz8gVGhlcmUncyBjZXJ0YWlubHkgbm8gcHJldmlvdXMgZmxvYXRpbmcg
YXQgdGhpcyBwb2ludC4KLSAgICAgICAgaWYgKCFjdXJyZW50SW5kZXgpCi0gICAgICAgICAgICBy
ZXR1cm4geyB9OwotCi0gICAgICAgIGF1dG8gY3VycmVudEJvdHRvbSA9IG1fZmxvYXRzW2N1cnJl
bnRJbmRleF0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCkuYm90dG9tKCk7Ci0KLSAgICAg
ICAgc3RkOjpvcHRpb25hbDx1bnNpZ25lZD4gaW5kZXggPSBjdXJyZW50SW5kZXg7Ci0gICAgICAg
IHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpbmRleCA9IHByZXZpb3VzRmxvYXRpbmdJbmRl
eChmbG9hdGluZ1R5cGUsIG1fZmxvYXRzLCAqaW5kZXgpOwotICAgICAgICAgICAgaWYgKCFpbmRl
eCkKLSAgICAgICAgICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAgICAgICBpZiAobV9mbG9h
dHNbKmluZGV4XS5kaXNwbGF5Qm94KCkucmVjdFdpdGhNYXJnaW4oKS5ib3R0b20oKSA+IGN1cnJl
bnRCb3R0b20pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0KLSAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiB7IH07Ci0gICAgfTsK
LQotICAgIC8vIDEuIFRha2UgdGhlIGN1cnJlbnQgZmxvYXRpbmcgZnJvbSBsZWZ0IGFuZCByaWdo
dCBhbmQgY2hlY2sgd2hpY2ggb25lJ3MgYm90dG9tIGVkZ2UgaXMgcG9zaXRpb25lZCBoaWdoZXIg
KHRoZXkgY291bGQgYmUgb24gdGhlIHNhbWUgdmVydGljYWwgcG9zaXRpb24gdG9vKS4KLSAgICAv
LyBUaGUgY3VycmVudCBmbG9hdHMgZnJvbSBsZWZ0IGFuZCByaWdodCBhcmUgY29uc2lkZXJlZCB0
aGUgaW5uZXItbW9zdCBwYWlyIGZvciB0aGUgY3VycmVudCB2ZXJ0aWNhbCBwb3NpdGlvbi4KLSAg
ICAvLyAyLiBNb3ZlIGF3YXkgZnJvbSBpbm5lci1tb3N0IHBhaXIgYnkgcGlja2luZyBvbmUgb2Yg
dGhlIHByZXZpb3VzIGZsb2F0cyBpbiB0aGUgbGlzdCgjMSkKLSAgICAvLyBFbnN1cmUgdGhhdCB0
aGUgbmV3IGZsb2F0aW5nJ3MgYm90dG9tIGVkZ2UgaXMgcG9zaXRpb25lZCBsb3dlciB0aGFuIHRo
ZSBjdXJyZW50IG9uZSAtd2hpY2ggZXNzZW50aWFsbHkgbWVhbnMgc2tpcHBpbmcgaW4tYmV0d2Vl
biBmbG9hdHMgdGhhdCBhcmUgcG9zaXRpb25lZCBoaWdoZXIpLgotICAgIC8vIDMuIFJlc2V0IHRo
ZSB2ZXJ0aWNhbCBwb3NpdGlvbiBhbmQgYWxpZ24gaXQgd2l0aCB0aGUgbmV3IGxlZnQtcmlnaHQg
cGFpci4gVGhlc2UgZmxvYXRzIGFyZSBub3cgdGhlIGlubmVyLW1vc3QgYm94ZXMgZm9yIHRoZSBj
dXJyZW50IHZlcnRpY2FsIHBvc2l0aW9uLgotICAgIC8vIEFzIHRoZSByZXN1bHQgd2UgaGF2ZSBt
b3JlIGhvcml6b250YWwgc3BhY2Ugb24gdGhlIGN1cnJlbnQgdmVydGljYWwgcG9zaXRpb24uCi0g
ICAgYXV0byBsZWZ0Qm90dG9tID0gbV9jdXJyZW50LmxlZnQoKSA/IHN0ZDo6b3B0aW9uYWw8TGF5
b3V0VW5pdD4obV9jdXJyZW50LmxlZnQoKS0+Ym90dG9tKCkpIDogc3RkOjpudWxsb3B0OwotICAg
IGF1dG8gcmlnaHRCb3R0b20gPSBtX2N1cnJlbnQucmlnaHQoKSA/IHN0ZDo6b3B0aW9uYWw8TGF5
b3V0VW5pdD4obV9jdXJyZW50LnJpZ2h0KCktPmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKLQot
ICAgIGF1dG8gdXBkYXRlTGVmdCA9IChsZWZ0Qm90dG9tID09IHJpZ2h0Qm90dG9tKSB8fCAoIXJp
Z2h0Qm90dG9tIHx8IChsZWZ0Qm90dG9tICYmIGxlZnRCb3R0b20gPCByaWdodEJvdHRvbSkpOyAK
LSAgICBhdXRvIHVwZGF0ZVJpZ2h0ID0gKGxlZnRCb3R0b20gPT0gcmlnaHRCb3R0b20pIHx8ICgh
bGVmdEJvdHRvbSB8fCAocmlnaHRCb3R0b20gJiYgbGVmdEJvdHRvbSA+IHJpZ2h0Qm90dG9tKSk7
IAotCi0gICAgaWYgKHVwZGF0ZUxlZnQpIHsKLSAgICAgICAgQVNTRVJUKG1fY3VycmVudC5tX2xl
ZnRJbmRleCk7Ci0gICAgICAgIG1fY3VycmVudC5tX3ZlcnRpY2FsUG9zaXRpb24gPSAqbGVmdEJv
dHRvbTsKLSAgICAgICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4ID0gZmluZFByZXZpb3VzRmxvYXRp
bmdXaXRoTG93ZXJCb3R0b20oRmxvYXQ6OkxlZnQsICptX2N1cnJlbnQubV9sZWZ0SW5kZXgpOwot
ICAgIH0KLSAgICAKLSAgICBpZiAodXBkYXRlUmlnaHQpIHsKLSAgICAgICAgQVNTRVJUKG1fY3Vy
cmVudC5tX3JpZ2h0SW5kZXgpOwotICAgICAgICBtX2N1cnJlbnQubV92ZXJ0aWNhbFBvc2l0aW9u
ID0gKnJpZ2h0Qm90dG9tOwotICAgICAgICBtX2N1cnJlbnQubV9yaWdodEluZGV4ID0gZmluZFBy
ZXZpb3VzRmxvYXRpbmdXaXRoTG93ZXJCb3R0b20oRmxvYXQ6OlJpZ2h0LCAqbV9jdXJyZW50Lm1f
cmlnaHRJbmRleCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICp0aGlzOwotfQotCi12b2lkIEl0ZXJh
dG9yOjpzZXQoTGF5b3V0VW5pdCB2ZXJ0aWNhbFBvc2l0aW9uKQotewotICAgIC8vIE1vdmUgdGhl
IGl0ZXJhdG9yIHRvIHRoZSBpbml0aWFsIHZlcnRpY2FsIHBvc2l0aW9uIGJ5IHN0YXJ0aW5nIGF0
IHRoZSBpbm5lci1tb3N0IGZsb2F0aW5nIHBhaXIgKGxhc3QgZmxvYXRzIG9uIGxlZnQvcmlnaHQp
LgotICAgIC8vIDEuIENoZWNrIGlmIHRoZSBpbm5lci1tb3N0IHBhaXIgY292ZXJzIHRoZSB2ZXJ0
aWNhbCBwb3NpdGlvbi4KLSAgICAvLyAyLiBNb3ZlIG91dHdhcmRzIGZyb20gdGhlIGlubmVyLW1v
c3QgcGFpciB1bnRpbCB0aGUgdmVydGljYWwgcG9zdGlvbiBpbnRlcnNlY3RzLgotICAgIC8vIChO
b3RlIHRoYXQgdmVydGljYWxQb3NpdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGFkanVzdGVkIHdpdGgg
dGhlIHRvcCBvZiB0aGUgbGFzdCBmbG9hdC4pCi0KLSAgICBtX2N1cnJlbnQubV92ZXJ0aWNhbFBv
c2l0aW9uID0gdmVydGljYWxQb3NpdGlvbjsKLSAgICAvLyBObyBmbG9hdHMgYXQgYWxsPwotICAg
IGlmIChtX2Zsb2F0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
Ci0KLSAgICAgICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4ID0geyB9OwotICAgICAgICBtX2N1cnJl
bnQubV9yaWdodEluZGV4ID0geyB9OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0
byBmaW5kRmxvYXRpbmdCZWxvdyA9IFsmXShGbG9hdCBmbG9hdGluZ1R5cGUpIC0+IHN0ZDo6b3B0
aW9uYWw8dW5zaWduZWQ+IHsKLQotICAgICAgICBBU1NFUlQoIW1fZmxvYXRzLmlzRW1wdHkoKSk7
Ci0KLSAgICAgICAgYXV0byBpbmRleCA9IGZsb2F0aW5nVHlwZSA9PSBGbG9hdDo6TGVmdCA/IG1f
Y3VycmVudC5tX2xlZnRJbmRleCA6IG1fY3VycmVudC5tX3JpZ2h0SW5kZXg7Ci0gICAgICAgIC8v
IFN0YXJ0IGZyb20gdGhlIGVuZCBpZiB3ZSBkb24ndCBoYXZlIGN1cnJlbnQgeWV0LgotICAgICAg
ICBpbmRleCA9IGluZGV4LnZhbHVlX29yKG1fZmxvYXRzLnNpemUoKSk7Ci0gICAgICAgIHdoaWxl
ICh0cnVlKSB7Ci0gICAgICAgICAgICBpbmRleCA9IHByZXZpb3VzRmxvYXRpbmdJbmRleChmbG9h
dGluZ1R5cGUsIG1fZmxvYXRzLCAqaW5kZXgpOwotICAgICAgICAgICAgaWYgKCFpbmRleCkKLSAg
ICAgICAgICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAgICAgICBhdXRvIGJvdHRvbSA9IG1f
ZmxvYXRzWyppbmRleF0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCkuYm90dG9tKCk7Ci0g
ICAgICAgICAgICAvLyBJcyB0aGlzIGZsb2F0aW5nIGludHJ1c2l2ZSBvbiB0aGlzIHBvc2l0aW9u
PwotICAgICAgICAgICAgaWYgKGJvdHRvbSA+IHZlcnRpY2FsUG9zaXRpb24pCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHsgfTsKLSAg
ICB9OwotCi0gICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4ID0gZmluZEZsb2F0aW5nQmVsb3coRmxv
YXQ6OkxlZnQpOwotICAgIG1fY3VycmVudC5tX3JpZ2h0SW5kZXggPSBmaW5kRmxvYXRpbmdCZWxv
dyhGbG9hdDo6UmlnaHQpOwotCi0gICAgQVNTRVJUKCFtX2N1cnJlbnQubV9sZWZ0SW5kZXggfHwg
KCptX2N1cnJlbnQubV9sZWZ0SW5kZXggPCBtX2Zsb2F0cy5zaXplKCkgJiYgbV9mbG9hdHNbKm1f
Y3VycmVudC5tX2xlZnRJbmRleF0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVk
KCkpKTsKLSAgICBBU1NFUlQoIW1fY3VycmVudC5tX3JpZ2h0SW5kZXggfHwgKCptX2N1cnJlbnQu
bV9yaWdodEluZGV4IDwgbV9mbG9hdHMuc2l6ZSgpICYmIG1fZmxvYXRzWyptX2N1cnJlbnQubV9y
aWdodEluZGV4XS5sYXlvdXRCb3goKS5pc1JpZ2h0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKTsKLX0K
LQotYm9vbCBJdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciYgb3RoZXIpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fY3VycmVudCA9PSBvdGhlci5tX2N1cnJlbnQ7Ci19Ci0KLWJvb2wg
SXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3ImIG90aGVyKSBjb25zdAotewotICAg
IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLX0KLQotfQotfQotI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvRmxvYXRpbmdDb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IGQ5MDNhOTNkYTMzMmM2MjJiZDVjN2EzZjQ3MjNmMTJmYTk1Njk2YTkuLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zs
b2F0aW5nQ29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0g
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQot
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNwcmFnbWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQp
Ci0KLSNpbmNsdWRlICJGbG9hdGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIK
LSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotbmFt
ZXNwYWNlIExheW91dCB7Ci0KLWNsYXNzIEJveDsKLWNsYXNzIENvbnRhaW5lcjsKLWNsYXNzIEZs
b2F0aW5nUGFpcjsKLWNsYXNzIExheW91dENvbnRleHQ7Ci0KLS8vIEZsb2F0aW5nQ29udGV4dCBp
cyByZXNwb25zaWJsZSBmb3IgYWRqdXN0aW5nIHRoZSBwb3NpdGlvbiBvZiBhIGJveCBpbiB0aGUg
Y3VycmVudCBmb3JtYXR0aW5nIGNvbnRleHQKLS8vIGJ5IHRha2luZyB0aGUgZmxvYXRpbmcgYm94
ZXMgaW50byBhY2NvdW50LgotY2xhc3MgRmxvYXRpbmdDb250ZXh0IHsKLSAgICBXVEZfTUFLRV9J
U09fQUxMT0NBVEVEKEZsb2F0aW5nQ29udGV4dCk7Ci1wdWJsaWM6Ci0gICAgRmxvYXRpbmdDb250
ZXh0KEZsb2F0aW5nU3RhdGUmKTsKLQotICAgIEZsb2F0aW5nU3RhdGUmIGZsb2F0aW5nU3RhdGUo
KSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nU3RhdGU7IH0KLQotICAgIFBvc2l0aW9uIHBvc2l0
aW9uRm9yRmxvYXQoY29uc3QgQm94JikgY29uc3Q7Ci0gICAgc3RkOjpvcHRpb25hbDxMYXlvdXRV
bml0PiB2ZXJ0aWNhbFBvc2l0aW9uV2l0aENsZWFyYW5jZShjb25zdCBCb3gmKSBjb25zdDsKLQot
cHJpdmF0ZToKLSAgICBMYXlvdXRDb250ZXh0JiBsYXlvdXRDb250ZXh0KCkgY29uc3QgeyByZXR1
cm4gbV9mbG9hdGluZ1N0YXRlLmxheW91dENvbnRleHQoKTsgfQotCi0gICAgUG9zaXRpb24gZmxv
YXRpbmdQb3NpdGlvbihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mKSBjb25zdDsKLQot
ICAgIExheW91dFVuaXQgaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24oY29uc3QgRmxvYXRpbmdTdGF0
ZTo6RmxvYXRJdGVtJikgY29uc3Q7Ci0gICAgTGF5b3V0VW5pdCBhbGlnbldpdGhDb250YWluaW5n
QmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJikgY29uc3Q7Ci0gICAgTGF5b3V0
VW5pdCBhbGlnbldpdGhGbG9hdGluZ3MoY29uc3QgRmxvYXRpbmdQYWlyJiwgY29uc3QgRmxvYXRp
bmdTdGF0ZTo6RmxvYXRJdGVtJikgY29uc3Q7Ci0gICAgUG9zaXRpb24gdG9Db250YWluaW5nQmxv
Y2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiwgUG9zaXRpb24pIGNvbnN0OwotCi0g
ICAgRmxvYXRpbmdTdGF0ZSYgbV9mbG9hdGluZ1N0YXRlOwotfTsKLQotfQotfQotI2VuZGlmCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdTdGF0ZS5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdTdGF0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDQxZDNlY2VkY2JmNTNhMzAwYzhmMTk1Yjk5MWQzNDViNmZkYmUwMDguLjAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUv
bGF5b3V0L0Zsb2F0aW5nU3RhdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAK
LS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRmxvYXRpbmdTdGF0
ZS5oIgotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRl
ICJGb3JtYXR0aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUg
IkxheW91dENvbnRleHQuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FM
TE9DQVRFRF9JTVBMKEZsb2F0aW5nU3RhdGUpOwotCi1GbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW06
OkZsb2F0SXRlbShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgRmxvYXRpbmdTdGF0ZSYgZmxv
YXRpbmdTdGF0ZSkKLSAgICA6IG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKGNvbnN0X2Nhc3Q8Qm94
Jj4obGF5b3V0Qm94KSkpCi0gICAgLCBtX2NvbnRhaW5pbmdCbG9jayhtYWtlV2Vha1B0cihjb25z
dF9jYXN0PENvbnRhaW5lciY+KCpsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkpKSkKLSAgICAs
IG1fYWJzb2x1dGVEaXNwbGF5Qm94KEZvcm1hdHRpbmdDb250ZXh0OjptYXBCb3hUb0FuY2VzdG9y
KGZsb2F0aW5nU3RhdGUubGF5b3V0Q29udGV4dCgpLCBsYXlvdXRCb3gsIGRvd25jYXN0PENvbnRh
aW5lcj4oZmxvYXRpbmdTdGF0ZS5yb290KCkpKSkKLSAgICAsIG1fY29udGFpbmluZ0Jsb2NrQWJz
b2x1dGVEaXNwbGF5Qm94KEZvcm1hdHRpbmdDb250ZXh0OjptYXBCb3hUb0FuY2VzdG9yKGZsb2F0
aW5nU3RhdGUubGF5b3V0Q29udGV4dCgpLCAqbV9jb250YWluaW5nQmxvY2ssIGRvd25jYXN0PENv
bnRhaW5lcj4oZmxvYXRpbmdTdGF0ZS5yb290KCkpKSkKLXsKLX0KLQotRmxvYXRpbmdTdGF0ZTo6
RmxvYXRpbmdTdGF0ZShMYXlvdXRDb250ZXh0JiBsYXlvdXRDb250ZXh0LCBjb25zdCBCb3gmIGZv
cm1hdHRpbmdDb250ZXh0Um9vdCkKLSAgICA6IG1fbGF5b3V0Q29udGV4dChsYXlvdXRDb250ZXh0
KQotICAgICwgbV9mb3JtYXR0aW5nQ29udGV4dFJvb3QobWFrZVdlYWtQdHIoY29uc3RfY2FzdDxC
b3gmPihmb3JtYXR0aW5nQ29udGV4dFJvb3QpKSkKLXsKLX0KLQotI2lmbmRlZiBOREVCVUcKLXN0
YXRpYyBib29sIGJlbG9uZ3NUb1RoaXNGbG9hdGluZ0NvbnRleHQoY29uc3QgQm94JiBsYXlvdXRC
b3gsIGNvbnN0IEJveCYgZmxvYXRpbmdTdGF0ZVJvb3QpCi17Ci0gICAgYXV0byYgZm9ybWF0dGlu
Z0NvbnRleHRSb290ID0gbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpOwotICAgIGlm
ICgmZm9ybWF0dGluZ0NvbnRleHRSb290ID09ICZmbG9hdGluZ1N0YXRlUm9vdCkKLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0KLSAgICAvLyBNYXliZSB0aGUgbGF5b3V0IGJveCBiZWxvbmdzIHRvIGFu
IGlubGluZSBmb3JtYXR0aW5nIGNvbnRleHQgdGhhdCBpbmhlcml0cyB0aGUgZmxvYXRpbmcgc3Rh
dGUgZnJvbSB0aGUgcGFyZW50IChibG9jaykgZm9ybWF0dGluZyBjb250ZXh0LiAKLSAgICBpZiAo
IWZvcm1hdHRpbmdDb250ZXh0Um9vdC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiAmZm9ybWF0dGluZ0NvbnRl
eHRSb290LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpID09ICZmbG9hdGluZ1N0YXRlUm9vdDsKLX0K
LSNlbmRpZgotCi12b2lkIEZsb2F0aW5nU3RhdGU6OnJlbW92ZShjb25zdCBCb3gmIGxheW91dEJv
eCkKLXsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbV9mbG9hdHMuc2l6ZSgp
OyArK2luZGV4KSB7Ci0gICAgICAgIGlmICgmbV9mbG9hdHNbaW5kZXhdLmxheW91dEJveCgpID09
ICZsYXlvdXRCb3gpIHsKLSAgICAgICAgICAgIG1fZmxvYXRzLnJlbW92ZShpbmRleCk7Ci0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7Ci19Ci0KLXZvaWQgRmxvYXRpbmdTdGF0ZTo6YXBwZW5kKGNvbnN0IEJveCYgbGF5b3V0Qm94
KQotewotICAgIEFTU0VSVChpczxDb250YWluZXI+KCptX2Zvcm1hdHRpbmdDb250ZXh0Um9vdCkp
OwotICAgIEFTU0VSVChiZWxvbmdzVG9UaGlzRmxvYXRpbmdDb250ZXh0KGxheW91dEJveCwgKm1f
Zm9ybWF0dGluZ0NvbnRleHRSb290KSk7Ci0KLSAgICAvLyBGbG9hdGluZyBzdGF0ZSBzaG91bGQg
aG9sZCBib3hlcyB3aXRoIGNvbXB1dGVkIHBvc2l0aW9uL3NpemUuCi0gICAgQVNTRVJUKG1fbGF5
b3V0Q29udGV4dC5kaXNwbGF5Qm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCkpOwotICAgIEFTU0VS
VChpczxDb250YWluZXI+KCptX2Zvcm1hdHRpbmdDb250ZXh0Um9vdCkpOwotCi0gICAgbV9mbG9h
dHMuYXBwZW5kKHsgbGF5b3V0Qm94LCAqdGhpcyB9KTsKLX0KLQotc3RkOjpvcHRpb25hbDxMYXlv
dXRVbml0PiBGbG9hdGluZ1N0YXRlOjpib3R0b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4
dFJvb3QsIENsZWFyIHR5cGUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fZmxvYXRzLmlzRW1wdHkoKSkK
LSAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgIC8vIFRPRE86IEN1cnJlbnRseSB0aGlzIGlzIG9u
bHkgY2FsbGVkIG9uY2UgZm9yIGVhY2ggZm9ybWF0dGluZyBjb250ZXh0IHJvb3Qgd2l0aCBmbG9h
dHMgcGVyIGxheW91dC4KLSAgICAvLyBDYWNoZSB0aGUgdmFsdWUgaWYgd2UgZW5kIHVwIGNhbGxp
bmcgaXQgbW9yZSBmcmVxdWVudGx5IChhbmQgdXBkYXRlIGl0IGF0IGFwcGVuZC9yZW1vdmUpLgot
ICAgIHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gYm90dG9tOwotICAgIGZvciAoYXV0byYgZmxv
YXRJdGVtIDogbV9mbG9hdHMpIHsKLSAgICAgICAgLy8gSWdub3JlIGZsb2F0cyBmcm9tIG90aGVy
IGZvcm1hdHRpbmcgY29udGV4dHMgd2hlbiB0aGUgZmxvYXRpbmcgc3RhdGUgaXMgaW5oZXJpdGVk
LgotICAgICAgICBpZiAoJmZvcm1hdHRpbmdDb250ZXh0Um9vdCAhPSAmZmxvYXRJdGVtLmxheW91
dEJveCgpLmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0K
LSAgICAgICAgaWYgKCh0eXBlID09IENsZWFyOjpMZWZ0ICYmICFmbG9hdEl0ZW0ubGF5b3V0Qm94
KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICB8fCAodHlwZSA9PSBD
bGVhcjo6UmlnaHQgJiYgIWZsb2F0SXRlbS5sYXlvdXRCb3goKS5pc1JpZ2h0RmxvYXRpbmdQb3Np
dGlvbmVkKCkpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgYXV0byBmbG9hdHNC
b3R0b20gPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCkuYm90dG9tKCk7
Ci0gICAgICAgIGlmIChib3R0b20pIHsKLSAgICAgICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4KCpi
b3R0b20sIGZsb2F0c0JvdHRvbSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQot
ICAgICAgICBib3R0b20gPSBmbG9hdHNCb3R0b207Ci0gICAgfQotICAgIHJldHVybiBib3R0b207
Ci19Ci0KLX0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zs
b2F0aW5nU3RhdGUuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9GbG9hdGluZ1N0YXRlLmgKZGVs
ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhN2UyYjQyNGY4Yzc5ZTQ0MjNhZDM2OTJiZGNh
NjljMmIxNzJiNzcuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0t
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nU3RhdGUuaAorKysgL2Rldi9udWxsCkBA
IC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUo
TEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkRpc3BsYXlCb3guaCIKLSNp
bmNsdWRlIDx3dGYvSXNvTWFsbG9jLmg+Ci0jaW5jbHVkZSA8d3RmL1JlZi5oPgotI2luY2x1ZGUg
PHd0Zi9XZWFrUHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotbmFtZXNwYWNlIExheW91
dCB7Ci0KLWNsYXNzIEJveDsKLWNsYXNzIENvbnRhaW5lcjsKLWNsYXNzIEZvcm1hdHRpbmdTdGF0
ZTsKLWNsYXNzIExheW91dENvbnRleHQ7Ci0KLS8vIEZsb2F0aW5nU3RhdGUgaG9sZHMgdGhlIGZs
b2F0aW5nIGJveGVzIHBlciBmb3JtYXR0aW5nIGNvbnRleHQuCi1jbGFzcyBGbG9hdGluZ1N0YXRl
IDogcHVibGljIFJlZkNvdW50ZWQ8RmxvYXRpbmdTdGF0ZT4gewotICAgIFdURl9NQUtFX0lTT19B
TExPQ0FURUQoRmxvYXRpbmdTdGF0ZSk7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxGbG9hdGlu
Z1N0YXRlPiBjcmVhdGUoTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCwgY29uc3QgQm94JiBm
b3JtYXR0aW5nQ29udGV4dFJvb3QpIHsgcmV0dXJuIGFkb3B0UmVmKCpuZXcgRmxvYXRpbmdTdGF0
ZShsYXlvdXRDb250ZXh0LCBmb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsgfQotCi0gICAgdm9pZCBh
cHBlbmQoY29uc3QgQm94JiBsYXlvdXRCb3gpOwotICAgIHZvaWQgcmVtb3ZlKGNvbnN0IEJveCYg
bGF5b3V0Qm94KTsKLQotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRz
LmlzRW1wdHkoKTsgfQotCi0gICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBsZWZ0Qm90dG9t
KGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSBjb25zdDsKLSAgICBzdGQ6Om9wdGlv
bmFsPExheW91dFVuaXQ+IHJpZ2h0Qm90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRS
b290KSBjb25zdDsKLSAgICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IGJvdHRvbShjb25zdCBC
b3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3Q7Ci0KLSAgICBjbGFzcyBGbG9hdEl0ZW0g
ewotICAgIHB1YmxpYzoKLSAgICAgICAgRmxvYXRJdGVtKGNvbnN0IEJveCYsIGNvbnN0IEZsb2F0
aW5nU3RhdGUmKTsKLQotICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0
dXJuICptX2xheW91dEJveDsgfQotICAgICAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5pbmdC
bG9jaygpIGNvbnN0IHsgcmV0dXJuICptX2NvbnRhaW5pbmdCbG9jazsgfQotCi0gICAgICAgIGNv
bnN0IERpc3BsYXk6OkJveCYgZGlzcGxheUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYWJzb2x1dGVE
aXNwbGF5Qm94OyB9Ci0gICAgICAgIGNvbnN0IERpc3BsYXk6OkJveCYgY29udGFpbmluZ0Jsb2Nr
RGlzcGxheUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGFpbmluZ0Jsb2NrQWJzb2x1dGVEaXNw
bGF5Qm94OyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBXZWFrUHRyPEJveD4gbV9sYXlvdXRC
b3g7Ci0gICAgICAgIFdlYWtQdHI8Q29udGFpbmVyPiBtX2NvbnRhaW5pbmdCbG9jazsKLQotICAg
ICAgICBEaXNwbGF5OjpCb3ggbV9hYnNvbHV0ZURpc3BsYXlCb3g7Ci0gICAgICAgIERpc3BsYXk6
OkJveCBtX2NvbnRhaW5pbmdCbG9ja0Fic29sdXRlRGlzcGxheUJveDsKLSAgICB9OwotICAgIHVz
aW5nIEZsb2F0TGlzdCA9IFZlY3RvcjxGbG9hdEl0ZW0+OwotICAgIGNvbnN0IEZsb2F0TGlzdCYg
ZmxvYXRzKCkgY29uc3QgeyByZXR1cm4gbV9mbG9hdHM7IH0KLSAgICBjb25zdCBGbG9hdEl0ZW0q
IGxhc3QoKSBjb25zdCB7IHJldHVybiBpc0VtcHR5KCkgPyBudWxscHRyIDogJm1fZmxvYXRzLmxh
c3QoKTsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBGbG9hdGluZ0NvbnRleHQ7Ci0g
ICAgRmxvYXRpbmdTdGF0ZShMYXlvdXRDb250ZXh0JiwgY29uc3QgQm94JiBmb3JtYXR0aW5nQ29u
dGV4dFJvb3QpOwotCi0gICAgTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCgpIGNvbnN0IHsg
cmV0dXJuIG1fbGF5b3V0Q29udGV4dDsgfQotICAgIGNvbnN0IEJveCYgcm9vdCgpIGNvbnN0IHsg
cmV0dXJuICptX2Zvcm1hdHRpbmdDb250ZXh0Um9vdDsgfQotCi0gICAgc3RkOjpvcHRpb25hbDxM
YXlvdXRVbml0PiBib3R0b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFy
KSBjb25zdDsKLQotICAgIExheW91dENvbnRleHQmIG1fbGF5b3V0Q29udGV4dDsKLSAgICBXZWFr
UHRyPEJveD4gbV9mb3JtYXR0aW5nQ29udGV4dFJvb3Q7Ci0gICAgRmxvYXRMaXN0IG1fZmxvYXRz
OwotfTsKLQotaW5saW5lIHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6
bGVmdEJvdHRvbShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3QKLXsgCi0g
ICAgcmV0dXJuIGJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyOjpMZWZ0KTsKLX0K
LQotaW5saW5lIHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6cmlnaHRC
b3R0b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyOjpSaWdodCk7Ci19Ci0KLWlu
bGluZSBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0aW5nU3RhdGU6OmJvdHRvbShjb25z
dCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3QKLXsKLSAgICByZXR1cm4gYm90dG9t
KGZvcm1hdHRpbmdDb250ZXh0Um9vdCwgQ2xlYXI6OkJvdGgpOwotfQotCi19Ci19Ci0jZW5kaWYK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dEdlb21l
dHJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5
LmNwcAppbmRleCBjODMzYjE4MTNkMjc0NTZhZTEyMDcxZGQwMzU5YzYyYmViYjY1YmY0Li5jYzZk
ODBhMjkwYmQ3Mjg3MDc2NDliNDQ0YjQ1NThjNjcyMmQ3YTZmIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKKysrIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCkBAIC0yNCwxMiAr
MjQsMTMgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRmxvYXRpbmdT
dGF0ZS5oIgogI2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiRm9ybWF0
dGluZ1N0YXRlLmgiCiAKICNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKIAor
I2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIK
KwogbmFtZXNwYWNlIFdlYkNvcmUgewogbmFtZXNwYWNlIExheW91dCB7CiAKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbG9hdHMvRmxvYXRpbmdDb250ZXh0LmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mbG9hdHMvRmxvYXRpbmdDb250ZXh0LmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40
ZmVhZWEyN2JlMTgwYzVjMTBmNGVkOTI1OGIwYWJmNDJjMzhhNzdhCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zsb2F0cy9GbG9hdGluZ0NvbnRleHQuY3BwCkBAIC0w
LDAgKzEsNTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkZsb2F0aW5nQ29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRF
WFQpCisKKyNpbmNsdWRlICJEaXNwbGF5Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisj
aW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyLmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgor
I2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K25hbWVzcGFjZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoRmxvYXRp
bmdDb250ZXh0KTsKKworLy8gRmluZGluZyB0aGUgdG9wL2xlZnQgcG9zaXRpb24gZm9yIGEgbmV3
IGZsb2F0aW5nKEYpCisvLyAgX19fXyAgX19fXyAgX19fX18gICAgICAgICAgICAgICBfX19fX19f
CisvLyB8ICAgIHx8IEwyIHx8ICAgICB8IDwtLS0tLTEtLS0tPnwgICAgICAgfAorLy8gfCAgICB8
fF9fX198fCAgTDMgfCAgICAgICAgICAgICB8ICAgUjEgIHwKKy8vIHwgTDEgfCAgICAgIHxfX19f
X3wgICAgICAgICAgICAgfCAgICAgICB8CisvLyB8X19fX3wgPC0tLS0tLS0tLS0tLS0yLS0tLS0t
LS0tPnwgICAgICAgfAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAg
IHwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX198CisvLworLy8g
MS4gQ29tcHV0ZSB0aGUgaW5pdGlhbCB2ZXJ0aWNhbCBwb3NpdGlvbiBmb3IgKEYpIC0+ICgxKQor
Ly8gMi4gRmluZCB0aGUgY29ycmVzcG9uZGluZyBmbG9hdGluZyBwYWlyIChMMy1SMSkKKy8vIDMu
IEFsaWduIChGKSBob3Jpem9udGFsbHkgd2l0aCAoTDMtUjEpIGRlcGVuZGluZyB3aGV0aGVyIChG
KSBpcyBsZWZ0L3JpZ2h0IHBvc2l0aW9uZWQKKy8vIDQuIEludGVyc2VjdCAoRikgd2l0aCAoTDMt
UjEpCisvLyA1LiBJZiAoRikgZG9lcyBub3QgZml0LCBmaW5kIHRoZSBuZXh0IGZsb2F0aW5nIHBh
aXIgKEwxLVIxKQorLy8gNi4gUmVwZWF0IHVudGlsIGVpdGhlciAoRikgZml0cy9ubyBtb3JlIGZs
b2F0cy4KKy8vIE5vdGUgdGhhdCBhbGwgY29vcmRpbmF0ZXMgYXJlIGluIHRoZSBjb29yZGluYXRl
IHN5c3RlbSBvZiB0aGUgZm9ybWF0dGluZyByb290LgorLy8gVGhlIGZvcm1hdHRpbmcgcm9vdCBo
ZXJlIGlzIGFsd2F5cyB0aGUgb25lIHRoYXQgZXN0YWJsaXNoZXMgdGhlIGZsb2F0aW5nIGNvbnRl
eHQgKHNlZSBpbmhlcml0ZWQgZmxvYXRpbmcgY29udGV4dCkuCisvLyAoSXQgc2ltcGx5IG1lYW5z
IHRoYXQgdGhlIGZsb2F0IGJveCdzIGZvcm1hdHRpbmcgcm9vdCBpcyBub3QgbmVjZXNzYXJpbHkg
dGhlIHNhbWUgYXMgdGhlIEZvcm1hdHRpbmdDb250ZXh0J3Mgcm9vdC4pCisKK2NsYXNzIEl0ZXJh
dG9yOworCitjbGFzcyBGbG9hdGluZ1BhaXIgeworcHVibGljOgorICAgIGJvb2wgaXNFbXB0eSgp
IGNvbnN0IHsgcmV0dXJuICFtX2xlZnRJbmRleCAmJiAhbV9yaWdodEluZGV4OyB9CisgICAgY29u
c3QgRGlzcGxheTo6Qm94KiBsZWZ0KCkgY29uc3Q7CisgICAgY29uc3QgRGlzcGxheTo6Qm94KiBy
aWdodCgpIGNvbnN0OworICAgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBEaXNwbGF5OjpCb3g6OlJl
Y3QmKSBjb25zdDsKKyAgICBMYXlvdXRVbml0IHZlcnRpY2FsUG9zaXRpb24oKSBjb25zdCB7IHJl
dHVybiBtX3ZlcnRpY2FsUG9zaXRpb247IH0KKyAgICBMYXlvdXRVbml0IGJvdHRvbSgpIGNvbnN0
OworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGbG9hdGluZ1BhaXImKSBjb25zdDsKKworcHJp
dmF0ZToKKyAgICBmcmllbmQgY2xhc3MgSXRlcmF0b3I7CisgICAgRmxvYXRpbmdQYWlyKGNvbnN0
IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYpOworCisgICAgY29uc3QgRmxvYXRpbmdTdGF0ZTo6
RmxvYXRMaXN0JiBtX2Zsb2F0czsKKworICAgIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IG1fbGVm
dEluZGV4OworICAgIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IG1fcmlnaHRJbmRleDsKKyAgICBM
YXlvdXRVbml0IG1fdmVydGljYWxQb3NpdGlvbjsKK307CisKK2NsYXNzIEl0ZXJhdG9yIHsKK3B1
YmxpYzoKKyAgICBJdGVyYXRvcihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmLCBzdGQ6
Om9wdGlvbmFsPExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRpb24pOworCisgICAgY29uc3QgRmxv
YXRpbmdQYWlyJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBtX2N1cnJlbnQ7IH0KKyAgICBJ
dGVyYXRvciYgb3BlcmF0b3IrKygpOworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRv
ciYpIGNvbnN0OworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciYpIGNvbnN0Owor
Citwcml2YXRlOgorICAgIHZvaWQgc2V0KExheW91dFVuaXQgdmVydGljYWxQb3NpdGlvbik7CisK
KyAgICBjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmIG1fZmxvYXRzOworICAgIEZsb2F0
aW5nUGFpciBtX2N1cnJlbnQ7Cit9OworCitzdGF0aWMgSXRlcmF0b3IgYmVnaW4oY29uc3QgRmxv
YXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0VW5pdCBpbml0aWFsVmVydGljYWxQb3Np
dGlvbikKK3sKKyAgICAvLyBTdGFydCB3aXRoIHRoZSBpbm5lci1tb3N0IGZsb2F0aW5nIHBhaXIg
Zm9yIHRoZSBpbml0aWFsIHZlcnRpY2FsIHBvc2l0aW9uLgorICAgIHJldHVybiBJdGVyYXRvcihm
bG9hdGluZ1N0YXRlLmZsb2F0cygpLCBpbml0aWFsVmVydGljYWxQb3NpdGlvbik7Cit9CisKK3N0
YXRpYyBJdGVyYXRvciBlbmQoY29uc3QgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSkKK3sK
KyAgICByZXR1cm4gSXRlcmF0b3IoZmxvYXRpbmdTdGF0ZS5mbG9hdHMoKSwgc3RkOjpudWxsb3B0
KTsKK30KKworRmxvYXRpbmdDb250ZXh0OjpGbG9hdGluZ0NvbnRleHQoRmxvYXRpbmdTdGF0ZSYg
ZmxvYXRpbmdTdGF0ZSkKKyAgICA6IG1fZmxvYXRpbmdTdGF0ZShmbG9hdGluZ1N0YXRlKQorewor
fQorCitQb3NpdGlvbiBGbG9hdGluZ0NvbnRleHQ6OnBvc2l0aW9uRm9yRmxvYXQoY29uc3QgQm94
JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0aW5nUG9z
aXRpb25lZCgpKTsKKyAgICBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0gZmxvYXRJdGVtID0geyBs
YXlvdXRCb3gsIG1fZmxvYXRpbmdTdGF0ZSB9OworCisgICAgUG9zaXRpb24gZmxvYXRQb3NpdGlv
bjsKKyAgICBpZiAobV9mbG9hdGluZ1N0YXRlLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBObyBm
bG9hdCBib3ggb24gdGhlIGNvbnRleHQgeWV0IC0+IGFsaWduIGl0IHdpdGggdGhlIGNvbnRhaW5p
bmcgYmxvY2sncyBsZWZ0L3JpZ2h0IGVkZ2UuCisgICAgICAgIGF1dG8mIGRpc3BsYXlCb3ggPSBm
bG9hdEl0ZW0uZGlzcGxheUJveCgpOworICAgICAgICBmbG9hdFBvc2l0aW9uID0geyBhbGlnbldp
dGhDb250YWluaW5nQmxvY2soZmxvYXRJdGVtKSArIGRpc3BsYXlCb3gubWFyZ2luTGVmdCgpLCBk
aXNwbGF5Qm94LnRvcCgpIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRmluZCB0aGUgdG9w
IG1vc3QgcG9zaXRpb24gd2hlcmUgdGhlIGZsb2F0IGJveCBmaXRzLgorICAgICAgICBmbG9hdFBv
c2l0aW9uID0gZmxvYXRpbmdQb3NpdGlvbihmbG9hdEl0ZW0pOworICAgIH0KKworICAgIHJldHVy
biB0b0NvbnRhaW5pbmdCbG9jayhmbG9hdEl0ZW0sIGZsb2F0UG9zaXRpb24pOworfQorCitzdGQ6
Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0aW5nQ29udGV4dDo6dmVydGljYWxQb3NpdGlvbldp
dGhDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxh
eW91dEJveC5oYXNGbG9hdENsZWFyKCkpOworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xl
dmVsQm94KCkpOworCisgICAgaWYgKG1fZmxvYXRpbmdTdGF0ZS5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiB7IH07CisKKyAgICBhdXRvIGJvdHRvbSA9IFsmXShzdGQ6Om9wdGlvbmFsPExheW91
dFVuaXQ+IGZsb2F0Qm90dG9tKSAtPiBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHsKKyAgICAg
ICAgLy8gJ2JvdHRvbScgaXMgaW4gdGhlIGZvcm1hdHRpbmcgcm9vdCdzIGNvb3JkaW5hdGUgc3lz
dGVtLgorICAgICAgICBpZiAoIWZsb2F0Qm90dG9tKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsK
KworICAgICAgICAvLyA5LjUuMiBDb250cm9sbGluZyBmbG93IG5leHQgdG8gZmxvYXRzOiB0aGUg
J2NsZWFyJyBwcm9wZXJ0eQorICAgICAgICAvLyBUaGVuIHRoZSBhbW91bnQgb2YgY2xlYXJhbmNl
IGlzIHNldCB0byB0aGUgZ3JlYXRlciBvZjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gMS4gVGhl
IGFtb3VudCBuZWNlc3NhcnkgdG8gcGxhY2UgdGhlIGJvcmRlciBlZGdlIG9mIHRoZSBibG9jayBl
dmVuIHdpdGggdGhlIGJvdHRvbSBvdXRlciBlZGdlIG9mIHRoZSBsb3dlc3QgZmxvYXQgdGhhdCBp
cyB0byBiZSBjbGVhcmVkLgorICAgICAgICAvLyAyLiBUaGUgYW1vdW50IG5lY2Vzc2FyeSB0byBw
bGFjZSB0aGUgdG9wIGJvcmRlciBlZGdlIG9mIHRoZSBibG9jayBhdCBpdHMgaHlwb3RoZXRpY2Fs
IHBvc2l0aW9uLgorCisgICAgICAgIGF1dG8mIGxheW91dENvbnRleHQgPSB0aGlzLT5sYXlvdXRD
b250ZXh0KCk7CisgICAgICAgIGF1dG8mIGRpc3BsYXlCb3ggPSAqbGF5b3V0Q29udGV4dC5kaXNw
bGF5Qm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7CisgICAgICAgIGF1dG8gcm9vdFJlbGF0aXZl
VG9wID0gRm9ybWF0dGluZ0NvbnRleHQ6Om1hcFRvcExlZnRUb0FuY2VzdG9yKGxheW91dENvbnRl
eHQsIGxheW91dEJveCwgZG93bmNhc3Q8Q29udGFpbmVyPihtX2Zsb2F0aW5nU3RhdGUucm9vdCgp
KSkueTsKKyAgICAgICAgYXV0byBjbGVhcmFuY2UgPSAqZmxvYXRCb3R0b20gLSByb290UmVsYXRp
dmVUb3A7CisgICAgICAgIGlmIChjbGVhcmFuY2UgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiB7
IH07CisKKyAgICAgICAgLy8gQ2xlYXJhbmNlIGluaGliaXRzIG1hcmdpbiBjb2xsYXBzaW5nLiBM
ZXQncyByZXNldCB0aGUgcmVsZXZhbnQgYWRqb2luaW5nIG1hcmdpbnMuCisgICAgICAgIGlmIChh
dXRvKiBwcmV2aW91c0luRmxvd1NpYmxpbmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJs
aW5nKCkpIHsKKyAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93RGlzcGxheUJveCA9ICps
YXlvdXRDb250ZXh0LmRpc3BsYXlCb3hGb3JMYXlvdXRCb3goKnByZXZpb3VzSW5GbG93U2libGlu
Zyk7CisKKyAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBwcmV2aW91cyBpbmZsb3cgc2libGluZyBo
YXMgYWxyZWFkeSBiZWVuIGxhaWQgb3V0LCBpdHMgbWFyZ2luIGlzIGNvbGxhcHNlZCBieSBub3cu
CisgICAgICAgICAgICBBU1NFUlQoIXByZXZpb3VzSW5GbG93RGlzcGxheUJveC5tYXJnaW5Cb3R0
b20oKSk7CisgICAgICAgICAgICBhdXRvIGNvbGxhcHNlZE1hcmdpbiA9IGRpc3BsYXlCb3gubWFy
Z2luVG9wKCk7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IHByZXZpb3VzIGJvdHRvbSBhbmQgY3Vy
cmVudCB0b3AgbWFyZ2lucyB0byBub24tY29sbGFwc2luZy4KKyAgICAgICAgICAgIHByZXZpb3Vz
SW5GbG93RGlzcGxheUJveC5zZXRWZXJ0aWNhbE1hcmdpbih7IHByZXZpb3VzSW5GbG93RGlzcGxh
eUJveC5tYXJnaW5Ub3AoKSwgcHJldmlvdXNJbkZsb3dEaXNwbGF5Qm94Lm5vbkNvbGxhcHNlZE1h
cmdpbkJvdHRvbSgpIH0pOworICAgICAgICAgICAgZGlzcGxheUJveC5zZXRWZXJ0aWNhbE1hcmdp
bih7IGRpc3BsYXlCb3gubm9uQ29sbGFwc2VkTWFyZ2luVG9wKCksIGRpc3BsYXlCb3gubWFyZ2lu
Qm90dG9tKCkgfSk7CisKKyAgICAgICAgICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0gcHJl
dmlvdXNJbkZsb3dEaXNwbGF5Qm94Lm1hcmdpbkJvdHRvbSgpICsgZGlzcGxheUJveC5tYXJnaW5U
b3AoKTsKKyAgICAgICAgICAgIGF1dG8gbWFyZ2luT2Zmc2V0ID0gbm9uQ29sbGFwc2VkTWFyZ2lu
IC0gY29sbGFwc2VkTWFyZ2luOworICAgICAgICAgICAgLy8gTW92ZSB0aGUgYm94IHRvIHRoZSBw
b3NpdGlvbiB3aGVyZSBpdCB3b3VsZCBiZSB3aXRoIG5vbi1jb2xsYXBzZWQgbWFyZ2lucy4KKyAg
ICAgICAgICAgIHJvb3RSZWxhdGl2ZVRvcCArPSBtYXJnaW5PZmZzZXQ7CisKKyAgICAgICAgICAg
IC8vIEhhdmluZyBuZWdhdGl2ZSBjbGVhcmFuY2UgaXMgYWxzbyBub3JtYWwuIEl0IGp1c3QgbWVh
bnMgdGhhdCB0aGUgYm94IHdpdGggdGhlIG5vbi1jb2xsYXBzZWQgbWFyZ2lucyBpcyBub3cgbG93
ZXIgdGhhbiBpdCBuZWVkcyB0byBiZS4KKyAgICAgICAgICAgIGNsZWFyYW5jZSAtPSBtYXJnaW5P
ZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IGFkanVzdCB0aGUgYm94J3MgcG9zaXRp
b24gd2l0aCB0aGUgY2xlYXJhbmNlLgorICAgICAgICByb290UmVsYXRpdmVUb3AgKz0gY2xlYXJh
bmNlOworICAgICAgICBBU1NFUlQoKmZsb2F0Qm90dG9tID09IHJvb3RSZWxhdGl2ZVRvcCk7CisK
KyAgICAgICAgLy8gVGhlIHJldHVybiB2ZXJ0aWNhbCBwb3NpdGlvbiBpcyBpbiB0aGUgY29udGFp
bmluZyBibG9jaydzIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAgICBhdXRvIGNvbnRhaW5pbmdC
bG9ja1Jvb3RSZWxhdGl2ZVRvcCA9IEZvcm1hdHRpbmdDb250ZXh0OjptYXBUb3BMZWZ0VG9BbmNl
c3RvcihsYXlvdXRDb250ZXh0LCAqbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLCBkb3duY2Fz
dDxDb250YWluZXI+KG1fZmxvYXRpbmdTdGF0ZS5yb290KCkpKS55OworICAgICAgICByZXR1cm4g
cm9vdFJlbGF0aXZlVG9wIC0gY29udGFpbmluZ0Jsb2NrUm9vdFJlbGF0aXZlVG9wOworICAgIH07
CisKKyAgICBhdXRvIGNsZWFyID0gbGF5b3V0Qm94LnN0eWxlKCkuY2xlYXIoKTsKKyAgICBhdXRv
JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QgPSBsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290
KCk7CisKKyAgICBpZiAoY2xlYXIgPT0gQ2xlYXI6OkxlZnQpCisgICAgICAgIHJldHVybiBib3R0
b20obV9mbG9hdGluZ1N0YXRlLmxlZnRCb3R0b20oZm9ybWF0dGluZ0NvbnRleHRSb290KSk7CisK
KyAgICBpZiAoY2xlYXIgPT0gQ2xlYXI6OlJpZ2h0KQorICAgICAgICByZXR1cm4gYm90dG9tKG1f
ZmxvYXRpbmdTdGF0ZS5yaWdodEJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsKKworICAg
IGlmIChjbGVhciA9PSBDbGVhcjo6Qm90aCkKKyAgICAgICAgcmV0dXJuIGJvdHRvbShtX2Zsb2F0
aW5nU3RhdGUuYm90dG9tKGZvcm1hdHRpbmdDb250ZXh0Um9vdCkpOworCisgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIHsgfTsKK30KKworUG9zaXRpb24gRmxvYXRpbmdDb250
ZXh0OjpmbG9hdGluZ1Bvc2l0aW9uKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYgZmxv
YXRJdGVtKSBjb25zdAoreworICAgIGF1dG8gaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24gPSB0aGlz
LT5pbml0aWFsVmVydGljYWxQb3NpdGlvbihmbG9hdEl0ZW0pOworICAgIGF1dG8mIGRpc3BsYXlC
b3ggPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpOworICAgIGF1dG8gbWFyZ2luQm94U2l6ZSA9IGRp
c3BsYXlCb3gubWFyZ2luQm94KCkuc2l6ZSgpOworCisgICAgYXV0byBlbmQgPSBMYXlvdXQ6OmVu
ZChtX2Zsb2F0aW5nU3RhdGUpOworICAgIGF1dG8gdG9wID0gaW5pdGlhbFZlcnRpY2FsUG9zaXRp
b247CisgICAgYXV0byBib3R0b21Nb3N0ID0gdG9wOworICAgIGZvciAoYXV0byBpdGVyYXRvciA9
IGJlZ2luKG1fZmxvYXRpbmdTdGF0ZSwgaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24pOyBpdGVyYXRv
ciAhPSBlbmQ7ICsraXRlcmF0b3IpIHsKKyAgICAgICAgQVNTRVJUKCEoKml0ZXJhdG9yKS5pc0Vt
cHR5KCkpOworCisgICAgICAgIGF1dG8gZmxvYXRzID0gKml0ZXJhdG9yOworICAgICAgICB0b3Ag
PSBmbG9hdHMudmVydGljYWxQb3NpdGlvbigpOworCisgICAgICAgIC8vIE1vdmUgdGhlIGJveCBo
b3Jpem9udGFsbHkgc28gdGhhdCBpdCBhbGlnbnMgd2l0aCB0aGUgY3VycmVudCBmbG9hdGluZyBw
YWlyLgorICAgICAgICBhdXRvIGxlZnQgPSBhbGlnbldpdGhGbG9hdGluZ3MoZmxvYXRzLCBmbG9h
dEl0ZW0pOworICAgICAgICAvLyBDaGVjayBpZiB0aGUgYm94IGZpdHMgYXQgdGhpcyB2ZXJ0aWNh
bCBwb3NpdGlvbi4KKyAgICAgICAgaWYgKCFmbG9hdHMuaW50ZXJzZWN0cyh7IHRvcCwgbGVmdCwg
bWFyZ2luQm94U2l6ZS53aWR0aCgpLCBtYXJnaW5Cb3hTaXplLmhlaWdodCgpIH0pKQorICAgICAg
ICAgICAgcmV0dXJuIHsgbGVmdCArIGRpc3BsYXlCb3gubWFyZ2luTGVmdCgpLCB0b3AgKyBkaXNw
bGF5Qm94Lm1hcmdpblRvcCgpIH07CisKKyAgICAgICAgYm90dG9tTW9zdCA9IGZsb2F0cy5ib3R0
b20oKTsKKyAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBmbG9hdGluZyBwYWlyLgorICAgIH0K
KworICAgIC8vIFBhc3NlZCBhbGwgdGhlIGZsb2F0cyBhbmQgc3RpbGwgZG9lcyBub3QgZml0Pwor
ICAgIHJldHVybiB7IGFsaWduV2l0aENvbnRhaW5pbmdCbG9jayhmbG9hdEl0ZW0pICsgZGlzcGxh
eUJveC5tYXJnaW5MZWZ0KCksIGJvdHRvbU1vc3QgKyBkaXNwbGF5Qm94Lm1hcmdpblRvcCgpIH07
Cit9CisKK0xheW91dFVuaXQgRmxvYXRpbmdDb250ZXh0Ojppbml0aWFsVmVydGljYWxQb3NpdGlv
bihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mIGZsb2F0SXRlbSkgY29uc3QKK3sKKyAg
ICAvLyBJbmNvbWluZyBmbG9hdGluZyBjYW5ub3QgYmUgcGxhY2VkIGhpZ2hlciB0aGFuIGV4aXN0
aW5nIGZsb2F0cy4KKyAgICAvLyBUYWtlIHRoZSBzdGF0aWMgcG9zaXRpb24gKHdoZXJlIHRoZSBi
b3ggd291bGQgZ28gaWYgaXQgd2Fzbid0IGZsb2F0aW5nKSBhbmQgYWRqdXN0IGl0IHdpdGggdGhl
IGxhc3QgZmxvYXRpbmcuCisgICAgYXV0byBtYXJnaW5Cb3hUb3AgPSBmbG9hdEl0ZW0uZGlzcGxh
eUJveCgpLnJlY3RXaXRoTWFyZ2luKCkudG9wKCk7CisKKyAgICBpZiAoYXV0byBsYXN0RmxvYXQg
PSBtX2Zsb2F0aW5nU3RhdGUubGFzdCgpKQorICAgICAgICByZXR1cm4gc3RkOjptYXgobWFyZ2lu
Qm94VG9wLCBsYXN0RmxvYXQtPmRpc3BsYXlCb3goKS5yZWN0V2l0aE1hcmdpbigpLnRvcCgpKTsK
KworICAgIHJldHVybiBtYXJnaW5Cb3hUb3A7Cit9CisKK0xheW91dFVuaXQgRmxvYXRpbmdDb250
ZXh0OjphbGlnbldpdGhDb250YWluaW5nQmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJ
dGVtJiBmbG9hdEl0ZW0pIGNvbnN0Cit7CisgICAgLy8gSWYgdGhlcmUgaXMgbm8gZmxvYXRpbmcg
dG8gYWxpZ24gd2l0aCwgcHVzaCB0aGUgYm94IHRvIHRoZSBsZWZ0L3JpZ2h0IGVkZ2Ugb2YgaXRz
IGNvbnRhaW5pbmcgYmxvY2sncyBjb250ZW50IGJveC4KKyAgICAvLyAoRWl0aGVyIHRoZXJlJ3Mg
bm8gZmxvYXRzIGF0IGFsbCBvciB0aGlzIGJveCBkb2VzIG5vdCBmaXQgYXQgYW55IHZlcnRpY2Fs
IHBvc2l0aW9ucyB3aGVyZSB0aGUgZmxvYXRzIGFyZS4pCisgICAgYXV0byYgY29udGFpbmluZ0Js
b2NrRGlzcGxheUJveCA9IGZsb2F0SXRlbS5jb250YWluaW5nQmxvY2tEaXNwbGF5Qm94KCk7Cisg
ICAgYXV0byBjb250YWluaW5nQmxvY2tDb250ZW50Qm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0Rp
c3BsYXlCb3gubGVmdCgpICsgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94TGVm
dCgpOworCisgICAgaWYgKGZsb2F0SXRlbS5sYXlvdXRCb3goKS5pc0xlZnRGbG9hdGluZ1Bvc2l0
aW9uZWQoKSkKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hMZWZ0Owor
CisgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hMZWZ0ICsgY29udGFpbmluZ0Js
b2NrRGlzcGxheUJveC5jb250ZW50Qm94V2lkdGgoKSAtIGZsb2F0SXRlbS5kaXNwbGF5Qm94KCku
bWFyZ2luQm94KCkud2lkdGgoKTsKK30KKworTGF5b3V0VW5pdCBGbG9hdGluZ0NvbnRleHQ6OmFs
aWduV2l0aEZsb2F0aW5ncyhjb25zdCBGbG9hdGluZ1BhaXImIGZsb2F0aW5nUGFpciwgY29uc3Qg
RmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9hdEl0ZW0pIGNvbnN0Cit7CisgICAgLy8gQ29t
cHV0ZSB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBmb3IgdGhlIG5ldyBmbG9hdGluZyBieSB0YWtp
bmcgYm90aCB0aGUgY29udGluaW5nIGJsb2NrIGFuZCB0aGUgY3VycmVudCBsZWZ0L3JpZ2h0IGZs
b2F0cyBpbnRvIGFjY291bnQuCisgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCA9
IGZsb2F0SXRlbS5jb250YWluaW5nQmxvY2tEaXNwbGF5Qm94KCk7CisgICAgYXV0byBjb250YWlu
aW5nQmxvY2tDb250ZW50Qm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gubGVmdCgp
ICsgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94TGVmdCgpOworICAgIGF1dG8g
Y29udGFpbmluZ0Jsb2NrQ29udGVudEJveFJpZ2h0ID0gY29udGFpbmluZ0Jsb2NrRGlzcGxheUJv
eC5sZWZ0KCkgKyBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LmNvbnRlbnRCb3hSaWdodCgpOwor
ICAgIGF1dG8gbWFyZ2luQm94V2lkdGggPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpLm1hcmdpbkJv
eCgpLndpZHRoKCk7CisKKyAgICBhdXRvIGxlZnRBbGlnbmVkQm94TGVmdCA9IGNvbnRhaW5pbmdC
bG9ja0NvbnRlbnRCb3hMZWZ0OworICAgIGF1dG8gcmlnaHRBbGlnbmVkQm94TGVmdCA9IGNvbnRh
aW5pbmdCbG9ja0NvbnRlbnRCb3hSaWdodCAtIG1hcmdpbkJveFdpZHRoOworCisgICAgaWYgKGZs
b2F0aW5nUGFpci5pc0VtcHR5KCkpIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgIHJldHVybiBmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlv
bmVkKCkgPyBsZWZ0QWxpZ25lZEJveExlZnQgOiByaWdodEFsaWduZWRCb3hMZWZ0OworICAgIH0K
KworICAgIGlmIChmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVk
KCkpIHsKKyAgICAgICAgaWYgKGF1dG8qIGxlZnREaXNwbGF5Qm94ID0gZmxvYXRpbmdQYWlyLmxl
ZnQoKSkgeworICAgICAgICAgICAgYXV0byBsZWZ0RmxvYXRpbmdCb3hSaWdodCA9IGxlZnREaXNw
bGF5Qm94LT5yZWN0V2l0aE1hcmdpbigpLnJpZ2h0KCk7CisgICAgICAgICAgICByZXR1cm4gc3Rk
OjptaW4oc3RkOjptYXgobGVmdEFsaWduZWRCb3hMZWZ0LCBsZWZ0RmxvYXRpbmdCb3hSaWdodCks
IHJpZ2h0QWxpZ25lZEJveExlZnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1
cm4gbGVmdEFsaWduZWRCb3hMZWZ0OworICAgIH0KKworICAgIEFTU0VSVChmbG9hdEl0ZW0ubGF5
b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgpKTsKKworICAgIGlmIChhdXRvKiBy
aWdodERpc3BsYXlCb3ggPSBmbG9hdGluZ1BhaXIucmlnaHQoKSkgeworICAgICAgICBhdXRvIHJp
Z2h0RmxvYXRpbmdCb3hMZWZ0ID0gcmlnaHREaXNwbGF5Qm94LT5yZWN0V2l0aE1hcmdpbigpLmxl
ZnQoKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KHN0ZDo6bWluKHJpZ2h0QWxpZ25lZEJveExl
ZnQsIHJpZ2h0RmxvYXRpbmdCb3hMZWZ0IC0gbWFyZ2luQm94V2lkdGgpLCBsZWZ0QWxpZ25lZEJv
eExlZnQpOworICAgIH0KKworICAgIHJldHVybiByaWdodEFsaWduZWRCb3hMZWZ0OworfQorCisv
LyBGSVhNRTogZmluZCBhIGJldHRlciBwbGFjZSBmb3IgdGhpcy4KK1Bvc2l0aW9uIEZsb2F0aW5n
Q29udGV4dDo6dG9Db250YWluaW5nQmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVt
JiBmbG9hdEl0ZW0sIFBvc2l0aW9uIHBvc2l0aW9uKSBjb25zdAoreworICAgIC8vIEZyb20gZm9y
bWF0dGluZyByb290IGNvb3JkaW5hdGUgc3lzdGVtIGJhY2sgdG8gY29udGFpbmluZyBibG9jaydz
LgorICAgIGlmICgmZmxvYXRJdGVtLmNvbnRhaW5pbmdCbG9jaygpID09ICZtX2Zsb2F0aW5nU3Rh
dGUucm9vdCgpKQorICAgICAgICByZXR1cm4gcG9zaXRpb247CisKKyAgICBhdXRvJiBjb250YWlu
aW5nQmxvY2tEaXNwbGF5Qm94ID0gZmxvYXRJdGVtLmNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3go
KTsKKyAgICByZXR1cm4geyBwb3NpdGlvbi54IC0gY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5s
ZWZ0KCksIHBvc2l0aW9uLnkgLSBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LnRvcCgpIH07Cit9
CisKK0Zsb2F0aW5nUGFpcjo6RmxvYXRpbmdQYWlyKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0
TGlzdCYgZmxvYXRzKQorICAgIDogbV9mbG9hdHMoZmxvYXRzKQoreworfQorCitjb25zdCBEaXNw
bGF5OjpCb3gqIEZsb2F0aW5nUGFpcjo6bGVmdCgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2xlZnRJ
bmRleCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBBU1NFUlQobV9mbG9hdHNbKm1f
bGVmdEluZGV4XS5sYXlvdXRCb3goKS5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7CisgICAg
cmV0dXJuICZtX2Zsb2F0c1sqbV9sZWZ0SW5kZXhdLmRpc3BsYXlCb3goKTsKK30KKworY29uc3Qg
RGlzcGxheTo6Qm94KiBGbG9hdGluZ1BhaXI6OnJpZ2h0KCkgY29uc3QKK3sKKyAgICBpZiAoIW1f
cmlnaHRJbmRleCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBBU1NFUlQobV9mbG9h
dHNbKm1fcmlnaHRJbmRleF0ubGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgp
KTsKKyAgICByZXR1cm4gJm1fZmxvYXRzWyptX3JpZ2h0SW5kZXhdLmRpc3BsYXlCb3goKTsKK30K
KworYm9vbCBGbG9hdGluZ1BhaXI6OmludGVyc2VjdHMoY29uc3QgRGlzcGxheTo6Qm94OjpSZWN0
JiBjYW5kaWRhdGVSZWN0KSBjb25zdAoreworICAgIGF1dG8gaW50ZXJzZWN0cyA9IFsmXShjb25z
dCBEaXNwbGF5OjpCb3gqIGZsb2F0aW5nLCBGbG9hdCBmbG9hdGluZ1R5cGUpIHsKKyAgICAgICAg
aWYgKCFmbG9hdGluZykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBhdXRv
IG1hcmdpblJlY3QgPSBmbG9hdGluZy0+cmVjdFdpdGhNYXJnaW4oKTsKKyAgICAgICAgLy8gQmVm
b3JlIGludGVyc2VjdGluZywgY2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBwb3NpdGlvbiBpcyB0b28g
ZmFyIHRvIHRoZSBsZWZ0L3JpZ2h0LgorICAgICAgICAvLyBUaGUgbmV3IGZsb2F0J3MgY29udGFp
bmluZyBibG9jayBjb3VsZCBwdXNoIHRoZSBjYW5kaWRhdGUgcG9zaXRpb24gYmV5b25kIHRoZSBj
dXJyZW50IGZsb2F0IGhvcml6b250YWxseS4KKyAgICAgICAgaWYgKChmbG9hdGluZ1R5cGUgPT0g
RmxvYXQ6OkxlZnQgJiYgY2FuZGlkYXRlUmVjdC5sZWZ0KCkgPCBtYXJnaW5SZWN0LnJpZ2h0KCkp
CisgICAgICAgICAgICB8fCAoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpSaWdodCAmJiBjYW5kaWRh
dGVSZWN0LnJpZ2h0KCkgPiBtYXJnaW5SZWN0LmxlZnQoKSkpCisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgcmV0dXJuIG1hcmdpblJlY3QuaW50ZXJzZWN0cyhjYW5kaWRhdGVSZWN0
KTsKKyAgICB9OworCisgICAgaWYgKCFtX2xlZnRJbmRleCAmJiAhbV9yaWdodEluZGV4KSB7Cisg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorCisgICAgaWYgKGludGVyc2VjdHMobGVmdCgpLCBGbG9hdDo6TGVmdCkpCisgICAgICAgIHJl
dHVybiB0cnVlOworCisgICAgaWYgKGludGVyc2VjdHMocmlnaHQoKSwgRmxvYXQ6OlJpZ2h0KSkK
KyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRmxv
YXRpbmdQYWlyOjpvcGVyYXRvciA9PShjb25zdCBGbG9hdGluZ1BhaXImIG90aGVyKSBjb25zdAor
eworICAgIHJldHVybiBtX2xlZnRJbmRleCA9PSBvdGhlci5tX2xlZnRJbmRleCAmJiBtX3JpZ2h0
SW5kZXggPT0gb3RoZXIubV9yaWdodEluZGV4OworfQorCitMYXlvdXRVbml0IEZsb2F0aW5nUGFp
cjo6Ym90dG9tKCkgY29uc3QKK3sKKyAgICBhdXRvKiBsZWZ0ID0gdGhpcy0+bGVmdCgpOworICAg
IGF1dG8qIHJpZ2h0ID0gdGhpcy0+cmlnaHQoKTsKKyAgICBBU1NFUlQobGVmdCB8fCByaWdodCk7
CisKKyAgICBhdXRvIGxlZnRCb3R0b20gPSBsZWZ0ID8gc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0
PihsZWZ0LT5yZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKKyAgICBh
dXRvIHJpZ2h0Qm90dG9tID0gcmlnaHQgPyBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+KHJpZ2h0
LT5yZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKKworICAgIGlmIChs
ZWZ0Qm90dG9tICYmIHJpZ2h0Qm90dG9tKQorICAgICAgICByZXR1cm4gc3RkOjptYXgoKmxlZnRC
b3R0b20sICpyaWdodEJvdHRvbSk7CisKKyAgICBpZiAobGVmdEJvdHRvbSkKKyAgICAgICAgcmV0
dXJuICpsZWZ0Qm90dG9tOworCisgICAgcmV0dXJuICpyaWdodEJvdHRvbTsKK30KKworSXRlcmF0
b3I6Okl0ZXJhdG9yKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzLCBzdGQ6
Om9wdGlvbmFsPExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRpb24pCisgICAgOiBtX2Zsb2F0cyhm
bG9hdHMpCisgICAgLCBtX2N1cnJlbnQoZmxvYXRzKQoreworICAgIGlmICh2ZXJ0aWNhbFBvc2l0
aW9uKQorICAgICAgICBzZXQoKnZlcnRpY2FsUG9zaXRpb24pOworfQorCitpbmxpbmUgc3RhdGlj
IHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IHByZXZpb3VzRmxvYXRpbmdJbmRleChGbG9hdCBmbG9h
dGluZ1R5cGUsIGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzLCB1bnNpZ25l
ZCBjdXJyZW50SW5kZXgpCit7CisgICAgUkVMRUFTRV9BU1NFUlQoY3VycmVudEluZGV4IDw9IGZs
b2F0cy5zaXplKCkpOworCisgICAgd2hpbGUgKGN1cnJlbnRJbmRleCkgeworICAgICAgICBhdXRv
JiBmbG9hdGluZyA9IGZsb2F0c1stLWN1cnJlbnRJbmRleF0ubGF5b3V0Qm94KCk7CisgICAgICAg
IGlmICgoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpMZWZ0ICYmIGZsb2F0aW5nLmlzTGVmdEZsb2F0
aW5nUG9zaXRpb25lZCgpKSB8fCAoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpSaWdodCAmJiBmbG9h
dGluZy5pc1JpZ2h0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKQorICAgICAgICAgICAgcmV0dXJuIGN1
cnJlbnRJbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4geyB9OworfQorCitJdGVyYXRvciYgSXRl
cmF0b3I6Om9wZXJhdG9yKysoKQoreworICAgIGlmIChtX2N1cnJlbnQuaXNFbXB0eSgpKSB7Cisg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAg
fQorCisgICAgYXV0byBmaW5kUHJldmlvdXNGbG9hdGluZ1dpdGhMb3dlckJvdHRvbSA9IFsmXShG
bG9hdCBmbG9hdGluZ1R5cGUsIHVuc2lnbmVkIGN1cnJlbnRJbmRleCkgLT4gc3RkOjpvcHRpb25h
bDx1bnNpZ25lZD4geworCisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGN1cnJlbnRJbmRleCA8IG1f
ZmxvYXRzLnNpemUoKSk7CisKKyAgICAgICAgLy8gTGFzdCBmbG9hdGluZz8gVGhlcmUncyBjZXJ0
YWlubHkgbm8gcHJldmlvdXMgZmxvYXRpbmcgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgaWYgKCFj
dXJyZW50SW5kZXgpCisgICAgICAgICAgICByZXR1cm4geyB9OworCisgICAgICAgIGF1dG8gY3Vy
cmVudEJvdHRvbSA9IG1fZmxvYXRzW2N1cnJlbnRJbmRleF0uZGlzcGxheUJveCgpLnJlY3RXaXRo
TWFyZ2luKCkuYm90dG9tKCk7CisKKyAgICAgICAgc3RkOjpvcHRpb25hbDx1bnNpZ25lZD4gaW5k
ZXggPSBjdXJyZW50SW5kZXg7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBp
bmRleCA9IHByZXZpb3VzRmxvYXRpbmdJbmRleChmbG9hdGluZ1R5cGUsIG1fZmxvYXRzLCAqaW5k
ZXgpOworICAgICAgICAgICAgaWYgKCFpbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4geyB9
OworCisgICAgICAgICAgICBpZiAobV9mbG9hdHNbKmluZGV4XS5kaXNwbGF5Qm94KCkucmVjdFdp
dGhNYXJnaW4oKS5ib3R0b20oKSA+IGN1cnJlbnRCb3R0b20pCisgICAgICAgICAgICAgICAgcmV0
dXJuIGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgIHJldHVybiB7IH07CisgICAgfTsKKworICAgIC8vIDEuIFRha2UgdGhlIGN1cnJlbnQg
ZmxvYXRpbmcgZnJvbSBsZWZ0IGFuZCByaWdodCBhbmQgY2hlY2sgd2hpY2ggb25lJ3MgYm90dG9t
IGVkZ2UgaXMgcG9zaXRpb25lZCBoaWdoZXIgKHRoZXkgY291bGQgYmUgb24gdGhlIHNhbWUgdmVy
dGljYWwgcG9zaXRpb24gdG9vKS4KKyAgICAvLyBUaGUgY3VycmVudCBmbG9hdHMgZnJvbSBsZWZ0
IGFuZCByaWdodCBhcmUgY29uc2lkZXJlZCB0aGUgaW5uZXItbW9zdCBwYWlyIGZvciB0aGUgY3Vy
cmVudCB2ZXJ0aWNhbCBwb3NpdGlvbi4KKyAgICAvLyAyLiBNb3ZlIGF3YXkgZnJvbSBpbm5lci1t
b3N0IHBhaXIgYnkgcGlja2luZyBvbmUgb2YgdGhlIHByZXZpb3VzIGZsb2F0cyBpbiB0aGUgbGlz
dCgjMSkKKyAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbmV3IGZsb2F0aW5nJ3MgYm90dG9tIGVkZ2Ug
aXMgcG9zaXRpb25lZCBsb3dlciB0aGFuIHRoZSBjdXJyZW50IG9uZSAtd2hpY2ggZXNzZW50aWFs
bHkgbWVhbnMgc2tpcHBpbmcgaW4tYmV0d2VlbiBmbG9hdHMgdGhhdCBhcmUgcG9zaXRpb25lZCBo
aWdoZXIpLgorICAgIC8vIDMuIFJlc2V0IHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBhbmQgYWxpZ24g
aXQgd2l0aCB0aGUgbmV3IGxlZnQtcmlnaHQgcGFpci4gVGhlc2UgZmxvYXRzIGFyZSBub3cgdGhl
IGlubmVyLW1vc3QgYm94ZXMgZm9yIHRoZSBjdXJyZW50IHZlcnRpY2FsIHBvc2l0aW9uLgorICAg
IC8vIEFzIHRoZSByZXN1bHQgd2UgaGF2ZSBtb3JlIGhvcml6b250YWwgc3BhY2Ugb24gdGhlIGN1
cnJlbnQgdmVydGljYWwgcG9zaXRpb24uCisgICAgYXV0byBsZWZ0Qm90dG9tID0gbV9jdXJyZW50
LmxlZnQoKSA/IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4obV9jdXJyZW50LmxlZnQoKS0+Ym90
dG9tKCkpIDogc3RkOjpudWxsb3B0OworICAgIGF1dG8gcmlnaHRCb3R0b20gPSBtX2N1cnJlbnQu
cmlnaHQoKSA/IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4obV9jdXJyZW50LnJpZ2h0KCktPmJv
dHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKKworICAgIGF1dG8gdXBkYXRlTGVmdCA9IChsZWZ0Qm90
dG9tID09IHJpZ2h0Qm90dG9tKSB8fCAoIXJpZ2h0Qm90dG9tIHx8IChsZWZ0Qm90dG9tICYmIGxl
ZnRCb3R0b20gPCByaWdodEJvdHRvbSkpOyAKKyAgICBhdXRvIHVwZGF0ZVJpZ2h0ID0gKGxlZnRC
b3R0b20gPT0gcmlnaHRCb3R0b20pIHx8ICghbGVmdEJvdHRvbSB8fCAocmlnaHRCb3R0b20gJiYg
bGVmdEJvdHRvbSA+IHJpZ2h0Qm90dG9tKSk7IAorCisgICAgaWYgKHVwZGF0ZUxlZnQpIHsKKyAg
ICAgICAgQVNTRVJUKG1fY3VycmVudC5tX2xlZnRJbmRleCk7CisgICAgICAgIG1fY3VycmVudC5t
X3ZlcnRpY2FsUG9zaXRpb24gPSAqbGVmdEJvdHRvbTsKKyAgICAgICAgbV9jdXJyZW50Lm1fbGVm
dEluZGV4ID0gZmluZFByZXZpb3VzRmxvYXRpbmdXaXRoTG93ZXJCb3R0b20oRmxvYXQ6OkxlZnQs
ICptX2N1cnJlbnQubV9sZWZ0SW5kZXgpOworICAgIH0KKyAgICAKKyAgICBpZiAodXBkYXRlUmln
aHQpIHsKKyAgICAgICAgQVNTRVJUKG1fY3VycmVudC5tX3JpZ2h0SW5kZXgpOworICAgICAgICBt
X2N1cnJlbnQubV92ZXJ0aWNhbFBvc2l0aW9uID0gKnJpZ2h0Qm90dG9tOworICAgICAgICBtX2N1
cnJlbnQubV9yaWdodEluZGV4ID0gZmluZFByZXZpb3VzRmxvYXRpbmdXaXRoTG93ZXJCb3R0b20o
RmxvYXQ6OlJpZ2h0LCAqbV9jdXJyZW50Lm1fcmlnaHRJbmRleCk7CisgICAgfQorCisgICAgcmV0
dXJuICp0aGlzOworfQorCit2b2lkIEl0ZXJhdG9yOjpzZXQoTGF5b3V0VW5pdCB2ZXJ0aWNhbFBv
c2l0aW9uKQoreworICAgIC8vIE1vdmUgdGhlIGl0ZXJhdG9yIHRvIHRoZSBpbml0aWFsIHZlcnRp
Y2FsIHBvc2l0aW9uIGJ5IHN0YXJ0aW5nIGF0IHRoZSBpbm5lci1tb3N0IGZsb2F0aW5nIHBhaXIg
KGxhc3QgZmxvYXRzIG9uIGxlZnQvcmlnaHQpLgorICAgIC8vIDEuIENoZWNrIGlmIHRoZSBpbm5l
ci1tb3N0IHBhaXIgY292ZXJzIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbi4KKyAgICAvLyAyLiBNb3Zl
IG91dHdhcmRzIGZyb20gdGhlIGlubmVyLW1vc3QgcGFpciB1bnRpbCB0aGUgdmVydGljYWwgcG9z
dGlvbiBpbnRlcnNlY3RzLgorICAgIC8vIChOb3RlIHRoYXQgdmVydGljYWxQb3NpdGlvbiBoYXMg
YWxyZWFkeSBiZWVuIGFkanVzdGVkIHdpdGggdGhlIHRvcCBvZiB0aGUgbGFzdCBmbG9hdC4pCisK
KyAgICBtX2N1cnJlbnQubV92ZXJ0aWNhbFBvc2l0aW9uID0gdmVydGljYWxQb3NpdGlvbjsKKyAg
ICAvLyBObyBmbG9hdHMgYXQgYWxsPworICAgIGlmIChtX2Zsb2F0cy5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisKKyAgICAgICAgbV9jdXJyZW50Lm1fbGVmdElu
ZGV4ID0geyB9OworICAgICAgICBtX2N1cnJlbnQubV9yaWdodEluZGV4ID0geyB9OworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBmaW5kRmxvYXRpbmdCZWxvdyA9IFsmXShGbG9h
dCBmbG9hdGluZ1R5cGUpIC0+IHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IHsKKworICAgICAgICBB
U1NFUlQoIW1fZmxvYXRzLmlzRW1wdHkoKSk7CisKKyAgICAgICAgYXV0byBpbmRleCA9IGZsb2F0
aW5nVHlwZSA9PSBGbG9hdDo6TGVmdCA/IG1fY3VycmVudC5tX2xlZnRJbmRleCA6IG1fY3VycmVu
dC5tX3JpZ2h0SW5kZXg7CisgICAgICAgIC8vIFN0YXJ0IGZyb20gdGhlIGVuZCBpZiB3ZSBkb24n
dCBoYXZlIGN1cnJlbnQgeWV0LgorICAgICAgICBpbmRleCA9IGluZGV4LnZhbHVlX29yKG1fZmxv
YXRzLnNpemUoKSk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbmRleCA9
IHByZXZpb3VzRmxvYXRpbmdJbmRleChmbG9hdGluZ1R5cGUsIG1fZmxvYXRzLCAqaW5kZXgpOwor
ICAgICAgICAgICAgaWYgKCFpbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4geyB9OworCisg
ICAgICAgICAgICBhdXRvIGJvdHRvbSA9IG1fZmxvYXRzWyppbmRleF0uZGlzcGxheUJveCgpLnJl
Y3RXaXRoTWFyZ2luKCkuYm90dG9tKCk7CisgICAgICAgICAgICAvLyBJcyB0aGlzIGZsb2F0aW5n
IGludHJ1c2l2ZSBvbiB0aGlzIHBvc2l0aW9uPworICAgICAgICAgICAgaWYgKGJvdHRvbSA+IHZl
cnRpY2FsUG9zaXRpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9
CisKKyAgICAgICAgcmV0dXJuIHsgfTsKKyAgICB9OworCisgICAgbV9jdXJyZW50Lm1fbGVmdElu
ZGV4ID0gZmluZEZsb2F0aW5nQmVsb3coRmxvYXQ6OkxlZnQpOworICAgIG1fY3VycmVudC5tX3Jp
Z2h0SW5kZXggPSBmaW5kRmxvYXRpbmdCZWxvdyhGbG9hdDo6UmlnaHQpOworCisgICAgQVNTRVJU
KCFtX2N1cnJlbnQubV9sZWZ0SW5kZXggfHwgKCptX2N1cnJlbnQubV9sZWZ0SW5kZXggPCBtX2Zs
b2F0cy5zaXplKCkgJiYgbV9mbG9hdHNbKm1fY3VycmVudC5tX2xlZnRJbmRleF0ubGF5b3V0Qm94
KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKTsKKyAgICBBU1NFUlQoIW1fY3VycmVudC5t
X3JpZ2h0SW5kZXggfHwgKCptX2N1cnJlbnQubV9yaWdodEluZGV4IDwgbV9mbG9hdHMuc2l6ZSgp
ICYmIG1fZmxvYXRzWyptX2N1cnJlbnQubV9yaWdodEluZGV4XS5sYXlvdXRCb3goKS5pc1JpZ2h0
RmxvYXRpbmdQb3NpdGlvbmVkKCkpKTsKK30KKworYm9vbCBJdGVyYXRvcjo6b3BlcmF0b3I9PShj
b25zdCBJdGVyYXRvciYgb3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY3VycmVudCA9PSBv
dGhlci5tX2N1cnJlbnQ7Cit9CisKK2Jvb2wgSXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgSXRl
cmF0b3ImIG90aGVyKSBjb25zdAoreworICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKK30K
KworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxvYXRz
L0Zsb2F0aW5nQ29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zsb2F0cy9GbG9hdGlu
Z0NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kOTAzYTkzZGEzMzJjNjIyYmQ1YzdhM2Y0NzIzZjEyZmE5
NTY5NmE5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zsb2F0cy9G
bG9hdGluZ0NvbnRleHQuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBv
bmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUg
IkZsb2F0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgorI2luY2x1ZGUgPHd0
Zi9Jc29NYWxsb2MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCituYW1lc3BhY2UgTGF5b3V0
IHsKKworY2xhc3MgQm94OworY2xhc3MgQ29udGFpbmVyOworY2xhc3MgRmxvYXRpbmdQYWlyOwor
Y2xhc3MgTGF5b3V0Q29udGV4dDsKKworLy8gRmxvYXRpbmdDb250ZXh0IGlzIHJlc3BvbnNpYmxl
IGZvciBhZGp1c3RpbmcgdGhlIHBvc2l0aW9uIG9mIGEgYm94IGluIHRoZSBjdXJyZW50IGZvcm1h
dHRpbmcgY29udGV4dAorLy8gYnkgdGFraW5nIHRoZSBmbG9hdGluZyBib3hlcyBpbnRvIGFjY291
bnQuCitjbGFzcyBGbG9hdGluZ0NvbnRleHQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQo
RmxvYXRpbmdDb250ZXh0KTsKK3B1YmxpYzoKKyAgICBGbG9hdGluZ0NvbnRleHQoRmxvYXRpbmdT
dGF0ZSYpOworCisgICAgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fZmxvYXRpbmdTdGF0ZTsgfQorCisgICAgUG9zaXRpb24gcG9zaXRpb25Gb3JGbG9hdChj
b25zdCBCb3gmKSBjb25zdDsKKyAgICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHZlcnRpY2Fs
UG9zaXRpb25XaXRoQ2xlYXJhbmNlKGNvbnN0IEJveCYpIGNvbnN0OworCitwcml2YXRlOgorICAg
IExheW91dENvbnRleHQmIGxheW91dENvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5n
U3RhdGUubGF5b3V0Q29udGV4dCgpOyB9CisKKyAgICBQb3NpdGlvbiBmbG9hdGluZ1Bvc2l0aW9u
KGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYpIGNvbnN0OworCisgICAgTGF5b3V0VW5p
dCBpbml0aWFsVmVydGljYWxQb3NpdGlvbihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0m
KSBjb25zdDsKKyAgICBMYXlvdXRVbml0IGFsaWduV2l0aENvbnRhaW5pbmdCbG9jayhjb25zdCBG
bG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mKSBjb25zdDsKKyAgICBMYXlvdXRVbml0IGFsaWduV2l0
aEZsb2F0aW5ncyhjb25zdCBGbG9hdGluZ1BhaXImLCBjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9h
dEl0ZW0mKSBjb25zdDsKKyAgICBQb3NpdGlvbiB0b0NvbnRhaW5pbmdCbG9jayhjb25zdCBGbG9h
dGluZ1N0YXRlOjpGbG9hdEl0ZW0mLCBQb3NpdGlvbikgY29uc3Q7CisKKyAgICBGbG9hdGluZ1N0
YXRlJiBtX2Zsb2F0aW5nU3RhdGU7Cit9OworCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC9mbG9hdHMvRmxvYXRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvZmxvYXRzL0Zsb2F0aW5nU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmE4MmZmOGFk
MmI4NjJiZDE1Y2RlZTc1Y2Y2OWNiMjIxMDA3N2IzODYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvZmxvYXRzL0Zsb2F0aW5nU3RhdGUuY3BwCkBAIC0wLDAgKzEsMTIz
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZsb2F0aW5n
U3RhdGUuaCIKKworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5j
bHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNs
dWRlICJMYXlvdXRDb250YWluZXIuaCIKKyNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5j
bHVkZSA8d3RmL0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFt
ZXNwYWNlIExheW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChGbG9hdGluZ1N0
YXRlKTsKKworRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtOjpGbG9hdEl0ZW0oY29uc3QgQm94JiBs
YXlvdXRCb3gsIGNvbnN0IEZsb2F0aW5nU3RhdGUmIGZsb2F0aW5nU3RhdGUpCisgICAgOiBtX2xh
eW91dEJveChtYWtlV2Vha1B0cihjb25zdF9jYXN0PEJveCY+KGxheW91dEJveCkpKQorICAgICwg
bV9jb250YWluaW5nQmxvY2sobWFrZVdlYWtQdHIoY29uc3RfY2FzdDxDb250YWluZXImPigqbGF5
b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpKSkpCisgICAgLCBtX2Fic29sdXRlRGlzcGxheUJveChG
b3JtYXR0aW5nQ29udGV4dDo6bWFwQm94VG9BbmNlc3RvcihmbG9hdGluZ1N0YXRlLmxheW91dENv
bnRleHQoKSwgbGF5b3V0Qm94LCBkb3duY2FzdDxDb250YWluZXI+KGZsb2F0aW5nU3RhdGUucm9v
dCgpKSkpCisgICAgLCBtX2NvbnRhaW5pbmdCbG9ja0Fic29sdXRlRGlzcGxheUJveChGb3JtYXR0
aW5nQ29udGV4dDo6bWFwQm94VG9BbmNlc3RvcihmbG9hdGluZ1N0YXRlLmxheW91dENvbnRleHQo
KSwgKm1fY29udGFpbmluZ0Jsb2NrLCBkb3duY2FzdDxDb250YWluZXI+KGZsb2F0aW5nU3RhdGUu
cm9vdCgpKSkpCit7Cit9CisKK0Zsb2F0aW5nU3RhdGU6OkZsb2F0aW5nU3RhdGUoTGF5b3V0Q29u
dGV4dCYgbGF5b3V0Q29udGV4dCwgY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpCisg
ICAgOiBtX2xheW91dENvbnRleHQobGF5b3V0Q29udGV4dCkKKyAgICAsIG1fZm9ybWF0dGluZ0Nv
bnRleHRSb290KG1ha2VXZWFrUHRyKGNvbnN0X2Nhc3Q8Qm94Jj4oZm9ybWF0dGluZ0NvbnRleHRS
b290KSkpCit7Cit9CisKKyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgYm9vbCBiZWxvbmdzVG9UaGlz
RmxvYXRpbmdDb250ZXh0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBCb3gmIGZsb2F0aW5n
U3RhdGVSb290KQoreworICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0Um9vdCA9IGxheW91dEJv
eC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKTsKKyAgICBpZiAoJmZvcm1hdHRpbmdDb250ZXh0Um9v
dCA9PSAmZmxvYXRpbmdTdGF0ZVJvb3QpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8g
TWF5YmUgdGhlIGxheW91dCBib3ggYmVsb25ncyB0byBhbiBpbmxpbmUgZm9ybWF0dGluZyBjb250
ZXh0IHRoYXQgaW5oZXJpdHMgdGhlIGZsb2F0aW5nIHN0YXRlIGZyb20gdGhlIHBhcmVudCAoYmxv
Y2spIGZvcm1hdHRpbmcgY29udGV4dC4gCisgICAgaWYgKCFmb3JtYXR0aW5nQ29udGV4dFJvb3Qu
ZXN0YWJsaXNoZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICByZXR1cm4gJmZvcm1hdHRpbmdDb250ZXh0Um9vdC5mb3JtYXR0aW5nQ29udGV4
dFJvb3QoKSA9PSAmZmxvYXRpbmdTdGF0ZVJvb3Q7Cit9CisjZW5kaWYKKwordm9pZCBGbG9hdGlu
Z1N0YXRlOjpyZW1vdmUoY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgZm9yIChzaXplX3Qg
aW5kZXggPSAwOyBpbmRleCA8IG1fZmxvYXRzLnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBp
ZiAoJm1fZmxvYXRzW2luZGV4XS5sYXlvdXRCb3goKSA9PSAmbGF5b3V0Qm94KSB7CisgICAgICAg
ICAgICBtX2Zsb2F0cy5yZW1vdmUoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit2b2lkIEZsb2F0aW5n
U3RhdGU6OmFwcGVuZChjb25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICBBU1NFUlQoaXM8Q29u
dGFpbmVyPigqbV9mb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsKKyAgICBBU1NFUlQoYmVsb25nc1Rv
VGhpc0Zsb2F0aW5nQ29udGV4dChsYXlvdXRCb3gsICptX2Zvcm1hdHRpbmdDb250ZXh0Um9vdCkp
OworCisgICAgLy8gRmxvYXRpbmcgc3RhdGUgc2hvdWxkIGhvbGQgYm94ZXMgd2l0aCBjb21wdXRl
ZCBwb3NpdGlvbi9zaXplLgorICAgIEFTU0VSVChtX2xheW91dENvbnRleHQuZGlzcGxheUJveEZv
ckxheW91dEJveChsYXlvdXRCb3gpKTsKKyAgICBBU1NFUlQoaXM8Q29udGFpbmVyPigqbV9mb3Jt
YXR0aW5nQ29udGV4dFJvb3QpKTsKKworICAgIG1fZmxvYXRzLmFwcGVuZCh7IGxheW91dEJveCwg
KnRoaXMgfSk7Cit9CisKK3N0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6
Ym90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBDbGVhciB0eXBlKSBjb25z
dAoreworICAgIGlmIChtX2Zsb2F0cy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB7IH07CisK
KyAgICAvLyBUT0RPOiBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IGNhbGxlZCBvbmNlIGZvciBlYWNo
IGZvcm1hdHRpbmcgY29udGV4dCByb290IHdpdGggZmxvYXRzIHBlciBsYXlvdXQuCisgICAgLy8g
Q2FjaGUgdGhlIHZhbHVlIGlmIHdlIGVuZCB1cCBjYWxsaW5nIGl0IG1vcmUgZnJlcXVlbnRseSAo
YW5kIHVwZGF0ZSBpdCBhdCBhcHBlbmQvcmVtb3ZlKS4KKyAgICBzdGQ6Om9wdGlvbmFsPExheW91
dFVuaXQ+IGJvdHRvbTsKKyAgICBmb3IgKGF1dG8mIGZsb2F0SXRlbSA6IG1fZmxvYXRzKSB7Cisg
ICAgICAgIC8vIElnbm9yZSBmbG9hdHMgZnJvbSBvdGhlciBmb3JtYXR0aW5nIGNvbnRleHRzIHdo
ZW4gdGhlIGZsb2F0aW5nIHN0YXRlIGlzIGluaGVyaXRlZC4KKyAgICAgICAgaWYgKCZmb3JtYXR0
aW5nQ29udGV4dFJvb3QgIT0gJmZsb2F0SXRlbS5sYXlvdXRCb3goKS5mb3JtYXR0aW5nQ29udGV4
dFJvb3QoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICgodHlwZSA9PSBD
bGVhcjo6TGVmdCAmJiAhZmxvYXRJdGVtLmxheW91dEJveCgpLmlzTGVmdEZsb2F0aW5nUG9zaXRp
b25lZCgpKQorICAgICAgICAgICAgfHwgKHR5cGUgPT0gQ2xlYXI6OlJpZ2h0ICYmICFmbG9hdEl0
ZW0ubGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgpKSkKKyAgICAgICAgICAg
IGNvbnRpbnVlOworCisgICAgICAgIGF1dG8gZmxvYXRzQm90dG9tID0gZmxvYXRJdGVtLmRpc3Bs
YXlCb3goKS5yZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgpOworICAgICAgICBpZiAoYm90dG9tKSB7
CisgICAgICAgICAgICBib3R0b20gPSBzdGQ6Om1heCgqYm90dG9tLCBmbG9hdHNCb3R0b20pOwor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYm90dG9tID0gZmxvYXRz
Qm90dG9tOworICAgIH0KKyAgICByZXR1cm4gYm90dG9tOworfQorCit9Cit9CisjZW5kaWYKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbG9hdHMvRmxvYXRpbmdTdGF0ZS5oIGIv
U291cmNlL1dlYkNvcmUvbGF5b3V0L2Zsb2F0cy9GbG9hdGluZ1N0YXRlLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
OWE3ZTJiNDI0ZjhjNzllNDQyM2FkMzY5MmJkY2E2OWMyYjE3MmI3NwotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbG9hdHMvRmxvYXRpbmdTdGF0ZS5oCkBAIC0wLDAg
KzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4K
KyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VU
X0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkRpc3BsYXlCb3guaCIKKyNpbmNsdWRl
IDx3dGYvSXNvTWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL1JlZi5oPgorI2luY2x1ZGUgPHd0Zi9X
ZWFrUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIExheW91dCB7CisK
K2NsYXNzIEJveDsKK2NsYXNzIENvbnRhaW5lcjsKK2NsYXNzIEZvcm1hdHRpbmdTdGF0ZTsKK2Ns
YXNzIExheW91dENvbnRleHQ7CisKKy8vIEZsb2F0aW5nU3RhdGUgaG9sZHMgdGhlIGZsb2F0aW5n
IGJveGVzIHBlciBmb3JtYXR0aW5nIGNvbnRleHQuCitjbGFzcyBGbG9hdGluZ1N0YXRlIDogcHVi
bGljIFJlZkNvdW50ZWQ8RmxvYXRpbmdTdGF0ZT4geworICAgIFdURl9NQUtFX0lTT19BTExPQ0FU
RUQoRmxvYXRpbmdTdGF0ZSk7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxGbG9hdGluZ1N0YXRl
PiBjcmVhdGUoTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCwgY29uc3QgQm94JiBmb3JtYXR0
aW5nQ29udGV4dFJvb3QpIHsgcmV0dXJuIGFkb3B0UmVmKCpuZXcgRmxvYXRpbmdTdGF0ZShsYXlv
dXRDb250ZXh0LCBmb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsgfQorCisgICAgdm9pZCBhcHBlbmQo
Y29uc3QgQm94JiBsYXlvdXRCb3gpOworICAgIHZvaWQgcmVtb3ZlKGNvbnN0IEJveCYgbGF5b3V0
Qm94KTsKKworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRzLmlzRW1w
dHkoKTsgfQorCisgICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBsZWZ0Qm90dG9tKGNvbnN0
IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSBjb25zdDsKKyAgICBzdGQ6Om9wdGlvbmFsPExh
eW91dFVuaXQ+IHJpZ2h0Qm90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSBj
b25zdDsKKyAgICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IGJvdHRvbShjb25zdCBCb3gmIGZv
cm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3Q7CisKKyAgICBjbGFzcyBGbG9hdEl0ZW0geworICAg
IHB1YmxpYzoKKyAgICAgICAgRmxvYXRJdGVtKGNvbnN0IEJveCYsIGNvbnN0IEZsb2F0aW5nU3Rh
dGUmKTsKKworICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICpt
X2xheW91dEJveDsgfQorICAgICAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5pbmdCbG9jaygp
IGNvbnN0IHsgcmV0dXJuICptX2NvbnRhaW5pbmdCbG9jazsgfQorCisgICAgICAgIGNvbnN0IERp
c3BsYXk6OkJveCYgZGlzcGxheUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYWJzb2x1dGVEaXNwbGF5
Qm94OyB9CisgICAgICAgIGNvbnN0IERpc3BsYXk6OkJveCYgY29udGFpbmluZ0Jsb2NrRGlzcGxh
eUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGFpbmluZ0Jsb2NrQWJzb2x1dGVEaXNwbGF5Qm94
OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBXZWFrUHRyPEJveD4gbV9sYXlvdXRCb3g7Cisg
ICAgICAgIFdlYWtQdHI8Q29udGFpbmVyPiBtX2NvbnRhaW5pbmdCbG9jazsKKworICAgICAgICBE
aXNwbGF5OjpCb3ggbV9hYnNvbHV0ZURpc3BsYXlCb3g7CisgICAgICAgIERpc3BsYXk6OkJveCBt
X2NvbnRhaW5pbmdCbG9ja0Fic29sdXRlRGlzcGxheUJveDsKKyAgICB9OworICAgIHVzaW5nIEZs
b2F0TGlzdCA9IFZlY3RvcjxGbG9hdEl0ZW0+OworICAgIGNvbnN0IEZsb2F0TGlzdCYgZmxvYXRz
KCkgY29uc3QgeyByZXR1cm4gbV9mbG9hdHM7IH0KKyAgICBjb25zdCBGbG9hdEl0ZW0qIGxhc3Qo
KSBjb25zdCB7IHJldHVybiBpc0VtcHR5KCkgPyBudWxscHRyIDogJm1fZmxvYXRzLmxhc3QoKTsg
fQorCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBGbG9hdGluZ0NvbnRleHQ7CisgICAgRmxv
YXRpbmdTdGF0ZShMYXlvdXRDb250ZXh0JiwgY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJv
b3QpOworCisgICAgTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJu
IG1fbGF5b3V0Q29udGV4dDsgfQorICAgIGNvbnN0IEJveCYgcm9vdCgpIGNvbnN0IHsgcmV0dXJu
ICptX2Zvcm1hdHRpbmdDb250ZXh0Um9vdDsgfQorCisgICAgc3RkOjpvcHRpb25hbDxMYXlvdXRV
bml0PiBib3R0b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyKSBjb25z
dDsKKworICAgIExheW91dENvbnRleHQmIG1fbGF5b3V0Q29udGV4dDsKKyAgICBXZWFrUHRyPEJv
eD4gbV9mb3JtYXR0aW5nQ29udGV4dFJvb3Q7CisgICAgRmxvYXRMaXN0IG1fZmxvYXRzOworfTsK
KworaW5saW5lIHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6bGVmdEJv
dHRvbShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3QKK3sgCisgICAgcmV0
dXJuIGJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyOjpMZWZ0KTsKK30KKworaW5s
aW5lIHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6cmlnaHRCb3R0b20o
Y29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGJv
dHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyOjpSaWdodCk7Cit9CisKK2lubGluZSBz
dGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0aW5nU3RhdGU6OmJvdHRvbShjb25zdCBCb3gm
IGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3QKK3sKKyAgICByZXR1cm4gYm90dG9tKGZvcm1h
dHRpbmdDb250ZXh0Um9vdCwgQ2xlYXI6OkJvdGgpOworfQorCit9Cit9CisjZW5kaWYK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>347806</attachid>
            <date>2018-08-22 09:30:26 -0700</date>
            <delta_ts>2018-08-22 10:10:41 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-188846-20180822093024.patch</filename>
            <type>text/plain</type>
            <size>75852</size>
            <attacher name="alan">zalan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjM1MTcwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGE4NTY3MjZlMjVkZDEy
ZGI4Y2IyOTc2NWUxZjRmMmY2OGM2YWU5Yy4uMWY0OWM1ZjRmNmUwZThkMDkxYTc4NWM5MGUwZmY0
NjlhYzU0YmFhYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY0IEBACisyMDE4LTA4LTIyICBaYWxh
biBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CisKKyAgICAgICAgW0xGQ11bRmxvYXRpbmddIE1v
dmUgZmlsZXMgdG8gYSBkZWRpY2F0ZWQgZGlyZWN0b3J5LgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg4ODQ2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
U2ltb24gRnJhc2VyLgorCisgICAgICAgIGxheW91dC9GbG9hdCogLT4gbGF5b3V0L2Zsb2F0cwor
CisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAq
IGxheW91dC9mbG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdDb250ZXh0LmNwcDogUmVuYW1lZCBmcm9t
IFNvdXJjZS9XZWJDb3JlL2xheW91dC9GbG9hdGluZ0NvbnRleHQuY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6TGF5b3V0OjpGbG9hdGluZ1BhaXI6OmlzRW1wdHkgY29uc3QpOgorICAgICAgICAoV2Vi
Q29yZTo6TGF5b3V0OjpGbG9hdGluZ1BhaXI6OnZlcnRpY2FsUG9zaXRpb24gY29uc3QpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5b3V0OjpJdGVyYXRvcjo6b3BlcmF0b3IqIGNvbnN0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheW91dDo6YmVnaW4pOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0Ojpl
bmQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ0NvbnRleHQ6OkZsb2F0aW5n
Q29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4dDo6cG9z
aXRpb25Gb3JGbG9hdCBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5n
Q29udGV4dDo6dmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UgY29uc3QpOgorICAgICAgICAo
V2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ0NvbnRleHQ6OmZsb2F0aW5nUG9zaXRpb24gY29uc3Qp
OgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ0NvbnRleHQ6OmluaXRpYWxWZXJ0
aWNhbFBvc2l0aW9uIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdD
b250ZXh0OjphbGlnbldpdGhDb250YWluaW5nQmxvY2sgY29uc3QpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5b3V0OjpGbG9hdGluZ0NvbnRleHQ6OmFsaWduV2l0aEZsb2F0aW5ncyBjb25zdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nQ29udGV4dDo6dG9Db250YWluaW5nQmxv
Y2sgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1BhaXI6OkZsb2F0
aW5nUGFpcik6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFpcjo6bGVmdCBj
b25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nUGFpcjo6cmlnaHQgY29u
c3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1BhaXI6OmludGVyc2VjdHMg
Y29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1BhaXI6Om9wZXJhdG9y
ID09IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdQYWlyOjpib3R0
b20gY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpJdGVyYXRvcjo6SXRlcmF0b3Ip
OgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpwcmV2aW91c0Zsb2F0aW5nSW5kZXgpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5b3V0OjpJdGVyYXRvcjo6b3BlcmF0b3IrKyk6CisgICAgICAgIChX
ZWJDb3JlOjpMYXlvdXQ6Okl0ZXJhdG9yOjpzZXQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0
OjpJdGVyYXRvcjo6b3BlcmF0b3I9PSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6
Okl0ZXJhdG9yOjpvcGVyYXRvciE9IGNvbnN0KToKKyAgICAgICAgKiBsYXlvdXQvZmxvYXRmb3Jt
YXR0aW5nL0Zsb2F0aW5nQ29udGV4dC5oOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYkNvcmUvbGF5
b3V0L0Zsb2F0aW5nQ29udGV4dC5oLgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGlu
Z0NvbnRleHQ6OmZsb2F0aW5nU3RhdGUgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0
OjpGbG9hdGluZ0NvbnRleHQ6OmxheW91dENvbnRleHQgY29uc3QpOgorICAgICAgICAqIGxheW91
dC9mbG9hdGZvcm1hdHRpbmcvRmxvYXRpbmdTdGF0ZS5jcHA6IFJlbmFtZWQgZnJvbSBTb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdTdGF0ZS5jcHAuCisgICAgICAgIChXZWJDb3JlOjpMYXlv
dXQ6OkZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbTo6RmxvYXRJdGVtKToKKyAgICAgICAgKFdlYkNv
cmU6OkxheW91dDo6RmxvYXRpbmdTdGF0ZTo6RmxvYXRpbmdTdGF0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpMYXlvdXQ6OmJlbG9uZ3NUb1RoaXNGbG9hdGluZ0NvbnRleHQpOgorICAgICAgICAoV2Vi
Q29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpyZW1vdmUpOgorICAgICAgICAoV2ViQ29yZTo6
TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjphcHBlbmQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0
OjpGbG9hdGluZ1N0YXRlOjpib3R0b20gY29uc3QpOgorICAgICAgICAqIGxheW91dC9mbG9hdGZv
cm1hdHRpbmcvRmxvYXRpbmdTdGF0ZS5oOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYkNvcmUvbGF5
b3V0L0Zsb2F0aW5nU3RhdGUuaC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdT
dGF0ZTo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6RmxvYXRpbmdTdGF0ZTo6
aXNFbXB0eSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6
OkZsb2F0SXRlbTo6bGF5b3V0Qm94IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6
RmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtOjpjb250YWluaW5nQmxvY2sgY29uc3QpOgorICAgICAg
ICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW06OmRpc3BsYXlCb3gg
Y29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpGbG9hdEl0
ZW06OmNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3ggY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6
TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpmbG9hdHMgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6
TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpsYXN0IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eW91dDo6RmxvYXRpbmdTdGF0ZTo6bGF5b3V0Q29udGV4dCBjb25zdCk6CisgICAgICAgIChXZWJD
b3JlOjpMYXlvdXQ6OkZsb2F0aW5nU3RhdGU6OnJvb3QgY29uc3QpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpsZWZ0Qm90dG9tIGNvbnN0KToKKyAgICAgICAgKFdl
YkNvcmU6OkxheW91dDo6RmxvYXRpbmdTdGF0ZTo6cmlnaHRCb3R0b20gY29uc3QpOgorICAgICAg
ICAoV2ViQ29yZTo6TGF5b3V0OjpGbG9hdGluZ1N0YXRlOjpib3R0b20gY29uc3QpOgorCiAyMDE4
LTA4LTIyICBaYWxhbiBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CiAKICAgICAgICAgQWRkIGNo
YW5nZXMgbWlzc2luZyBmcm9tIHIyMzQ5MjUuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9T
b3VyY2VzLnR4dCBiL1NvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0CmluZGV4IGYwZWY3ODYxMGRk
MDQ2YjM2NzI3MmMwNWFhYzY3NDQ1ODVjOTM4YTIuLjJkMTE0MDVlZDFhMDViNzhlNDE3NzZlZGQ2
N2ZiZDk2NzliNDZiZmUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0Cisr
KyBiL1NvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0CkBAIC0xMjE3LDggKzEyMTcsNiBAQCBpbnNw
ZWN0b3IvYWdlbnRzL3dvcmtlci9Xb3JrZXJEZWJ1Z2dlckFnZW50LmNwcAogaW5zcGVjdG9yL2Fn
ZW50cy93b3JrZXIvV29ya2VyTmV0d29ya0FnZW50LmNwcAogaW5zcGVjdG9yL2FnZW50cy93b3Jr
ZXIvV29ya2VyUnVudGltZUFnZW50LmNwcAogCi1sYXlvdXQvRmxvYXRpbmdDb250ZXh0LmNwcAot
bGF5b3V0L0Zsb2F0aW5nU3RhdGUuY3BwCiBsYXlvdXQvRm9ybWF0dGluZ0NvbnRleHQuY3BwCiBs
YXlvdXQvRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKIGxheW91dC9Gb3JtYXR0aW5nU3Rh
dGUuY3BwCkBAIC0xMjMwLDYgKzEyMjgsOCBAQCBsYXlvdXQvYmxvY2tmb3JtYXR0aW5nL0Jsb2Nr
Rm9ybWF0dGluZ1N0YXRlLmNwcAogbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja01hcmdpbkNv
bGxhcHNlLmNwcAogbGF5b3V0L2Jsb2NrZm9ybWF0dGluZy9CbG9ja0ludmFsaWRhdGlvbi5jcHAK
IGxheW91dC9kaXNwbGF5dHJlZS9EaXNwbGF5Qm94LmNwcAorbGF5b3V0L2Zsb2F0cy9GbG9hdGlu
Z0NvbnRleHQuY3BwCitsYXlvdXQvZmxvYXRzL0Zsb2F0aW5nU3RhdGUuY3BwCiBsYXlvdXQvaW5s
aW5lZm9ybWF0dGluZy9JbmxpbmVGb3JtYXR0aW5nQ29udGV4dC5jcHAKIGxheW91dC9pbmxpbmVm
b3JtYXR0aW5nL0lubGluZUZvcm1hdHRpbmdTdGF0ZS5jcHAKIGxheW91dC9pbmxpbmVmb3JtYXR0
aW5nL0lubGluZUludmFsaWRhdGlvbi5jcHAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCAxZDY0YjMyZjRhMTMyMDgyM2E1ODY3ZDBh
NWYxZGQ0MWE0YjhlNmIzLi4xMTU2MjJkZTRkYjQwMmQ2Y2Y0MTA4ZjBhYzYxMWMzZDJiNjUzMTVm
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCkBAIC0xNTY2NSwxMiArMTU2NjUsOSBAQAogCQkJY2hpbGRyZW4gPSAoCiAJCQkJMTE1Q0ZB
OTkyMDhCQzA5QTAwMUU2OTkxIC8qIGJsb2NrZm9ybWF0dGluZyAqLywKIAkJCQkxMTk5RkE1ODIw
OEUzQzRDMDAyMzU4Q0MgLyogZGlzcGxheXRyZWUgKi8sCisJCQkJNkZDRkMwNTUyMTJEQUNDMjAw
NzY5NUQyIC8qIGZsb2F0cyAqLywKIAkJCQkxMTVDRkE5QTIwOEJDMTQwMDAxRTY5OTEgLyogaW5s
aW5lZm9ybWF0dGluZyAqLywKIAkJCQkxMTVDRkE5MDIwOEI5NDQxMDAxRTY5OTEgLyogbGF5b3V0
dHJlZSAqLywKLQkJCQkxMTVDRkE4NTIwOEI5MDY2MDAxRTY5OTEgLyogRmxvYXRpbmdDb250ZXh0
LmNwcCAqLywKLQkJCQkxMTVDRkE4NDIwOEI5MDY2MDAxRTY5OTEgLyogRmxvYXRpbmdDb250ZXh0
LmggKi8sCi0JCQkJMTE1Q0ZBODEyMDhCOEVEQTAwMUU2OTkxIC8qIEZsb2F0aW5nU3RhdGUuY3Bw
ICovLAotCQkJCTExNUNGQTgwMjA4QjhFREEwMDFFNjk5MSAvKiBGbG9hdGluZ1N0YXRlLmggKi8s
CiAJCQkJMTE1Q0ZBNjkyMDhBRjdEMDAwMUU2OTkxIC8qIEZvcm1hdHRpbmdDb250ZXh0LmNwcCAq
LywKIAkJCQkxMTVDRkE2ODIwOEFGN0QwMDAxRTY5OTEgLyogRm9ybWF0dGluZ0NvbnRleHQuaCAq
LywKIAkJCQk2RkJCODYwNTIwQjQ2NEI2MDBEQUQ5MzggLyogRm9ybWF0dGluZ0NvbnRleHRHZW9t
ZXRyeS5jcHAgKi8sCkBAIC0xOTQ3MSw2ICsxOTQ2OCwxNyBAQAogCQkJcGF0aCA9IHNpbXBsZTsK
IAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CiAJCX07CisJCTZGQ0ZDMDU1MjEyREFDQzIwMDc2
OTVEMiAvKiBmbG9hdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0g
KAorCQkJCTExNUNGQTg1MjA4QjkwNjYwMDFFNjk5MSAvKiBGbG9hdGluZ0NvbnRleHQuY3BwICov
LAorCQkJCTExNUNGQTg0MjA4QjkwNjYwMDFFNjk5MSAvKiBGbG9hdGluZ0NvbnRleHQuaCAqLywK
KwkJCQkxMTVDRkE4MTIwOEI4RURBMDAxRTY5OTEgLyogRmxvYXRpbmdTdGF0ZS5jcHAgKi8sCisJ
CQkJMTE1Q0ZBODAyMDhCOEVEQTAwMUU2OTkxIC8qIEZsb2F0aW5nU3RhdGUuaCAqLywKKwkJCSk7
CisJCQlwYXRoID0gZmxvYXRzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKIAkJ
NkZFN0REREQyMEVDNkU4QjAwOEI1QjRFIC8qIHRleHRsYXlvdXQgKi8gPSB7CiAJCQlpc2EgPSBQ
QlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L0Zsb2F0aW5nQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdD
b250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlYWVhMjdiZTE4MGM1
YzEwZjRlZDkyNThiMGFiZjQyYzM4YTc3YS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdDb250ZXh0LmNw
cAorKysgL2Rldi9udWxsCkBAIC0xLDUxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAy
MDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUg
ImNvbmZpZy5oIgotI2luY2x1ZGUgIkZsb2F0aW5nQ29udGV4dC5oIgotCi0jaWYgRU5BQkxFKExB
WU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJEaXNwbGF5Qm94LmgiCi0jaW5j
bHVkZSAiTGF5b3V0Qm94LmgiCi0jaW5jbHVkZSAiTGF5b3V0Q29udGFpbmVyLmgiCi0jaW5jbHVk
ZSAiTGF5b3V0Q29udGV4dC5oIgotI2luY2x1ZGUgPHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+Ci0K
LW5hbWVzcGFjZSBXZWJDb3JlIHsKLW5hbWVzcGFjZSBMYXlvdXQgewotCi1XVEZfTUFLRV9JU09f
QUxMT0NBVEVEX0lNUEwoRmxvYXRpbmdDb250ZXh0KTsKLQotLy8gRmluZGluZyB0aGUgdG9wL2xl
ZnQgcG9zaXRpb24gZm9yIGEgbmV3IGZsb2F0aW5nKEYpCi0vLyAgX19fXyAgX19fXyAgX19fX18g
ICAgICAgICAgICAgICBfX19fX19fCi0vLyB8ICAgIHx8IEwyIHx8ICAgICB8IDwtLS0tLTEtLS0t
PnwgICAgICAgfAotLy8gfCAgICB8fF9fX198fCAgTDMgfCAgICAgICAgICAgICB8ICAgUjEgIHwK
LS8vIHwgTDEgfCAgICAgIHxfX19fX3wgICAgICAgICAgICAgfCAgICAgICB8Ci0vLyB8X19fX3wg
PC0tLS0tLS0tLS0tLS0yLS0tLS0tLS0tPnwgICAgICAgfAotLy8gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB8ICAgICAgIHwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfF9fX19fX198Ci0vLwotLy8gMS4gQ29tcHV0ZSB0aGUgaW5pdGlhbCB2ZXJ0aWNhbCBwb3Np
dGlvbiBmb3IgKEYpIC0+ICgxKQotLy8gMi4gRmluZCB0aGUgY29ycmVzcG9uZGluZyBmbG9hdGlu
ZyBwYWlyIChMMy1SMSkKLS8vIDMuIEFsaWduIChGKSBob3Jpem9udGFsbHkgd2l0aCAoTDMtUjEp
IGRlcGVuZGluZyB3aGV0aGVyIChGKSBpcyBsZWZ0L3JpZ2h0IHBvc2l0aW9uZWQKLS8vIDQuIElu
dGVyc2VjdCAoRikgd2l0aCAoTDMtUjEpCi0vLyA1LiBJZiAoRikgZG9lcyBub3QgZml0LCBmaW5k
IHRoZSBuZXh0IGZsb2F0aW5nIHBhaXIgKEwxLVIxKQotLy8gNi4gUmVwZWF0IHVudGlsIGVpdGhl
ciAoRikgZml0cy9ubyBtb3JlIGZsb2F0cy4KLS8vIE5vdGUgdGhhdCBhbGwgY29vcmRpbmF0ZXMg
YXJlIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgZm9ybWF0dGluZyByb290LgotLy8g
VGhlIGZvcm1hdHRpbmcgcm9vdCBoZXJlIGlzIGFsd2F5cyB0aGUgb25lIHRoYXQgZXN0YWJsaXNo
ZXMgdGhlIGZsb2F0aW5nIGNvbnRleHQgKHNlZSBpbmhlcml0ZWQgZmxvYXRpbmcgY29udGV4dCku
Ci0vLyAoSXQgc2ltcGx5IG1lYW5zIHRoYXQgdGhlIGZsb2F0IGJveCdzIGZvcm1hdHRpbmcgcm9v
dCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIEZvcm1hdHRpbmdDb250ZXh0J3Mg
cm9vdC4pCi0KLWNsYXNzIEl0ZXJhdG9yOwotCi1jbGFzcyBGbG9hdGluZ1BhaXIgewotcHVibGlj
OgotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFtX2xlZnRJbmRleCAmJiAhbV9y
aWdodEluZGV4OyB9Ci0gICAgY29uc3QgRGlzcGxheTo6Qm94KiBsZWZ0KCkgY29uc3Q7Ci0gICAg
Y29uc3QgRGlzcGxheTo6Qm94KiByaWdodCgpIGNvbnN0OwotICAgIGJvb2wgaW50ZXJzZWN0cyhj
b25zdCBEaXNwbGF5OjpCb3g6OlJlY3QmKSBjb25zdDsKLSAgICBMYXlvdXRVbml0IHZlcnRpY2Fs
UG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBtX3ZlcnRpY2FsUG9zaXRpb247IH0KLSAgICBMYXlv
dXRVbml0IGJvdHRvbSgpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGbG9hdGlu
Z1BhaXImKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgSXRlcmF0b3I7Ci0g
ICAgRmxvYXRpbmdQYWlyKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYpOwotCi0gICAg
Y29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRMaXN0JiBtX2Zsb2F0czsKLQotICAgIHN0ZDo6b3B0
aW9uYWw8dW5zaWduZWQ+IG1fbGVmdEluZGV4OwotICAgIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+
IG1fcmlnaHRJbmRleDsKLSAgICBMYXlvdXRVbml0IG1fdmVydGljYWxQb3NpdGlvbjsKLX07Ci0K
LWNsYXNzIEl0ZXJhdG9yIHsKLXB1YmxpYzoKLSAgICBJdGVyYXRvcihjb25zdCBGbG9hdGluZ1N0
YXRlOjpGbG9hdExpc3QmLCBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRp
b24pOwotCi0gICAgY29uc3QgRmxvYXRpbmdQYWlyJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVy
biBtX2N1cnJlbnQ7IH0KLSAgICBJdGVyYXRvciYgb3BlcmF0b3IrKygpOwotICAgIGJvb2wgb3Bl
cmF0b3I9PShjb25zdCBJdGVyYXRvciYpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3IhPShjb25z
dCBJdGVyYXRvciYpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHZvaWQgc2V0KExheW91dFVuaXQg
dmVydGljYWxQb3NpdGlvbik7Ci0KLSAgICBjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3Qm
IG1fZmxvYXRzOwotICAgIEZsb2F0aW5nUGFpciBtX2N1cnJlbnQ7Ci19OwotCi1zdGF0aWMgSXRl
cmF0b3IgYmVnaW4oY29uc3QgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0VW5p
dCBpbml0aWFsVmVydGljYWxQb3NpdGlvbikKLXsKLSAgICAvLyBTdGFydCB3aXRoIHRoZSBpbm5l
ci1tb3N0IGZsb2F0aW5nIHBhaXIgZm9yIHRoZSBpbml0aWFsIHZlcnRpY2FsIHBvc2l0aW9uLgot
ICAgIHJldHVybiBJdGVyYXRvcihmbG9hdGluZ1N0YXRlLmZsb2F0cygpLCBpbml0aWFsVmVydGlj
YWxQb3NpdGlvbik7Ci19Ci0KLXN0YXRpYyBJdGVyYXRvciBlbmQoY29uc3QgRmxvYXRpbmdTdGF0
ZSYgZmxvYXRpbmdTdGF0ZSkKLXsKLSAgICByZXR1cm4gSXRlcmF0b3IoZmxvYXRpbmdTdGF0ZS5m
bG9hdHMoKSwgc3RkOjpudWxsb3B0KTsKLX0KLQotRmxvYXRpbmdDb250ZXh0OjpGbG9hdGluZ0Nv
bnRleHQoRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSkKLSAgICA6IG1fZmxvYXRpbmdTdGF0
ZShmbG9hdGluZ1N0YXRlKQotewotfQotCi1Qb3NpdGlvbiBGbG9hdGluZ0NvbnRleHQ6OnBvc2l0
aW9uRm9yRmxvYXQoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKGxh
eW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgpKTsKLSAgICBGbG9hdGluZ1N0YXRlOjpGbG9h
dEl0ZW0gZmxvYXRJdGVtID0geyBsYXlvdXRCb3gsIG1fZmxvYXRpbmdTdGF0ZSB9OwotCi0gICAg
UG9zaXRpb24gZmxvYXRQb3NpdGlvbjsKLSAgICBpZiAobV9mbG9hdGluZ1N0YXRlLmlzRW1wdHko
KSkgewotICAgICAgICAvLyBObyBmbG9hdCBib3ggb24gdGhlIGNvbnRleHQgeWV0IC0+IGFsaWdu
IGl0IHdpdGggdGhlIGNvbnRhaW5pbmcgYmxvY2sncyBsZWZ0L3JpZ2h0IGVkZ2UuCi0gICAgICAg
IGF1dG8mIGRpc3BsYXlCb3ggPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpOwotICAgICAgICBmbG9h
dFBvc2l0aW9uID0geyBhbGlnbldpdGhDb250YWluaW5nQmxvY2soZmxvYXRJdGVtKSArIGRpc3Bs
YXlCb3gubWFyZ2luTGVmdCgpLCBkaXNwbGF5Qm94LnRvcCgpIH07Ci0gICAgfSBlbHNlIHsKLSAg
ICAgICAgLy8gRmluZCB0aGUgdG9wIG1vc3QgcG9zaXRpb24gd2hlcmUgdGhlIGZsb2F0IGJveCBm
aXRzLgotICAgICAgICBmbG9hdFBvc2l0aW9uID0gZmxvYXRpbmdQb3NpdGlvbihmbG9hdEl0ZW0p
OwotICAgIH0KLQotICAgIHJldHVybiB0b0NvbnRhaW5pbmdCbG9jayhmbG9hdEl0ZW0sIGZsb2F0
UG9zaXRpb24pOwotfQotCi1zdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0aW5nQ29udGV4
dDo6dmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFuY2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNv
bnN0Ci17Ci0gICAgQVNTRVJUKGxheW91dEJveC5oYXNGbG9hdENsZWFyKCkpOwotICAgIEFTU0VS
VChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkpOwotCi0gICAgaWYgKG1fZmxvYXRpbmdTdGF0
ZS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICBhdXRvIGJvdHRvbSA9IFsm
XShzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IGZsb2F0Qm90dG9tKSAtPiBzdGQ6Om9wdGlvbmFs
PExheW91dFVuaXQ+IHsKLSAgICAgICAgLy8gJ2JvdHRvbScgaXMgaW4gdGhlIGZvcm1hdHRpbmcg
cm9vdCdzIGNvb3JkaW5hdGUgc3lzdGVtLgotICAgICAgICBpZiAoIWZsb2F0Qm90dG9tKQotICAg
ICAgICAgICAgcmV0dXJuIHsgfTsKLQotICAgICAgICAvLyA5LjUuMiBDb250cm9sbGluZyBmbG93
IG5leHQgdG8gZmxvYXRzOiB0aGUgJ2NsZWFyJyBwcm9wZXJ0eQotICAgICAgICAvLyBUaGVuIHRo
ZSBhbW91bnQgb2YgY2xlYXJhbmNlIGlzIHNldCB0byB0aGUgZ3JlYXRlciBvZjoKLSAgICAgICAg
Ly8KLSAgICAgICAgLy8gMS4gVGhlIGFtb3VudCBuZWNlc3NhcnkgdG8gcGxhY2UgdGhlIGJvcmRl
ciBlZGdlIG9mIHRoZSBibG9jayBldmVuIHdpdGggdGhlIGJvdHRvbSBvdXRlciBlZGdlIG9mIHRo
ZSBsb3dlc3QgZmxvYXQgdGhhdCBpcyB0byBiZSBjbGVhcmVkLgotICAgICAgICAvLyAyLiBUaGUg
YW1vdW50IG5lY2Vzc2FyeSB0byBwbGFjZSB0aGUgdG9wIGJvcmRlciBlZGdlIG9mIHRoZSBibG9j
ayBhdCBpdHMgaHlwb3RoZXRpY2FsIHBvc2l0aW9uLgotCi0gICAgICAgIGF1dG8mIGxheW91dENv
bnRleHQgPSB0aGlzLT5sYXlvdXRDb250ZXh0KCk7Ci0gICAgICAgIGF1dG8mIGRpc3BsYXlCb3gg
PSAqbGF5b3V0Q29udGV4dC5kaXNwbGF5Qm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCk7Ci0gICAg
ICAgIGF1dG8gcm9vdFJlbGF0aXZlVG9wID0gRm9ybWF0dGluZ0NvbnRleHQ6Om1hcFRvcExlZnRU
b0FuY2VzdG9yKGxheW91dENvbnRleHQsIGxheW91dEJveCwgZG93bmNhc3Q8Q29udGFpbmVyPiht
X2Zsb2F0aW5nU3RhdGUucm9vdCgpKSkueTsKLSAgICAgICAgYXV0byBjbGVhcmFuY2UgPSAqZmxv
YXRCb3R0b20gLSByb290UmVsYXRpdmVUb3A7Ci0gICAgICAgIGlmIChjbGVhcmFuY2UgPD0gMCkK
LSAgICAgICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAgICAgLy8gQ2xlYXJhbmNlIGluaGliaXRz
IG1hcmdpbiBjb2xsYXBzaW5nLiBMZXQncyByZXNldCB0aGUgcmVsZXZhbnQgYWRqb2luaW5nIG1h
cmdpbnMuCi0gICAgICAgIGlmIChhdXRvKiBwcmV2aW91c0luRmxvd1NpYmxpbmcgPSBsYXlvdXRC
b3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGF1dG8mIHByZXZpb3Vz
SW5GbG93RGlzcGxheUJveCA9ICpsYXlvdXRDb250ZXh0LmRpc3BsYXlCb3hGb3JMYXlvdXRCb3go
KnByZXZpb3VzSW5GbG93U2libGluZyk7Ci0KLSAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBwcmV2
aW91cyBpbmZsb3cgc2libGluZyBoYXMgYWxyZWFkeSBiZWVuIGxhaWQgb3V0LCBpdHMgbWFyZ2lu
IGlzIGNvbGxhcHNlZCBieSBub3cuCi0gICAgICAgICAgICBBU1NFUlQoIXByZXZpb3VzSW5GbG93
RGlzcGxheUJveC5tYXJnaW5Cb3R0b20oKSk7Ci0gICAgICAgICAgICBhdXRvIGNvbGxhcHNlZE1h
cmdpbiA9IGRpc3BsYXlCb3gubWFyZ2luVG9wKCk7Ci0KLSAgICAgICAgICAgIC8vIFJlc2V0IHBy
ZXZpb3VzIGJvdHRvbSBhbmQgY3VycmVudCB0b3AgbWFyZ2lucyB0byBub24tY29sbGFwc2luZy4K
LSAgICAgICAgICAgIHByZXZpb3VzSW5GbG93RGlzcGxheUJveC5zZXRWZXJ0aWNhbE1hcmdpbih7
IHByZXZpb3VzSW5GbG93RGlzcGxheUJveC5tYXJnaW5Ub3AoKSwgcHJldmlvdXNJbkZsb3dEaXNw
bGF5Qm94Lm5vbkNvbGxhcHNlZE1hcmdpbkJvdHRvbSgpIH0pOwotICAgICAgICAgICAgZGlzcGxh
eUJveC5zZXRWZXJ0aWNhbE1hcmdpbih7IGRpc3BsYXlCb3gubm9uQ29sbGFwc2VkTWFyZ2luVG9w
KCksIGRpc3BsYXlCb3gubWFyZ2luQm90dG9tKCkgfSk7Ci0KLSAgICAgICAgICAgIGF1dG8gbm9u
Q29sbGFwc2VkTWFyZ2luID0gcHJldmlvdXNJbkZsb3dEaXNwbGF5Qm94Lm1hcmdpbkJvdHRvbSgp
ICsgZGlzcGxheUJveC5tYXJnaW5Ub3AoKTsKLSAgICAgICAgICAgIGF1dG8gbWFyZ2luT2Zmc2V0
ID0gbm9uQ29sbGFwc2VkTWFyZ2luIC0gY29sbGFwc2VkTWFyZ2luOwotICAgICAgICAgICAgLy8g
TW92ZSB0aGUgYm94IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSBpdCB3b3VsZCBiZSB3aXRoIG5vbi1j
b2xsYXBzZWQgbWFyZ2lucy4KLSAgICAgICAgICAgIHJvb3RSZWxhdGl2ZVRvcCArPSBtYXJnaW5P
ZmZzZXQ7Ci0KLSAgICAgICAgICAgIC8vIEhhdmluZyBuZWdhdGl2ZSBjbGVhcmFuY2UgaXMgYWxz
byBub3JtYWwuIEl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgYm94IHdpdGggdGhlIG5vbi1jb2xsYXBz
ZWQgbWFyZ2lucyBpcyBub3cgbG93ZXIgdGhhbiBpdCBuZWVkcyB0byBiZS4KLSAgICAgICAgICAg
IGNsZWFyYW5jZSAtPSBtYXJnaW5PZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm93IGFk
anVzdCB0aGUgYm94J3MgcG9zaXRpb24gd2l0aCB0aGUgY2xlYXJhbmNlLgotICAgICAgICByb290
UmVsYXRpdmVUb3AgKz0gY2xlYXJhbmNlOwotICAgICAgICBBU1NFUlQoKmZsb2F0Qm90dG9tID09
IHJvb3RSZWxhdGl2ZVRvcCk7Ci0KLSAgICAgICAgLy8gVGhlIHJldHVybiB2ZXJ0aWNhbCBwb3Np
dGlvbiBpcyBpbiB0aGUgY29udGFpbmluZyBibG9jaydzIGNvb3JkaW5hdGUgc3lzdGVtLgotICAg
ICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1Jvb3RSZWxhdGl2ZVRvcCA9IEZvcm1hdHRpbmdDb250
ZXh0OjptYXBUb3BMZWZ0VG9BbmNlc3RvcihsYXlvdXRDb250ZXh0LCAqbGF5b3V0Qm94LmNvbnRh
aW5pbmdCbG9jaygpLCBkb3duY2FzdDxDb250YWluZXI+KG1fZmxvYXRpbmdTdGF0ZS5yb290KCkp
KS55OwotICAgICAgICByZXR1cm4gcm9vdFJlbGF0aXZlVG9wIC0gY29udGFpbmluZ0Jsb2NrUm9v
dFJlbGF0aXZlVG9wOwotICAgIH07Ci0KLSAgICBhdXRvIGNsZWFyID0gbGF5b3V0Qm94LnN0eWxl
KCkuY2xlYXIoKTsKLSAgICBhdXRvJiBmb3JtYXR0aW5nQ29udGV4dFJvb3QgPSBsYXlvdXRCb3gu
Zm9ybWF0dGluZ0NvbnRleHRSb290KCk7Ci0KLSAgICBpZiAoY2xlYXIgPT0gQ2xlYXI6OkxlZnQp
Ci0gICAgICAgIHJldHVybiBib3R0b20obV9mbG9hdGluZ1N0YXRlLmxlZnRCb3R0b20oZm9ybWF0
dGluZ0NvbnRleHRSb290KSk7Ci0KLSAgICBpZiAoY2xlYXIgPT0gQ2xlYXI6OlJpZ2h0KQotICAg
ICAgICByZXR1cm4gYm90dG9tKG1fZmxvYXRpbmdTdGF0ZS5yaWdodEJvdHRvbShmb3JtYXR0aW5n
Q29udGV4dFJvb3QpKTsKLQotICAgIGlmIChjbGVhciA9PSBDbGVhcjo6Qm90aCkKLSAgICAgICAg
cmV0dXJuIGJvdHRvbShtX2Zsb2F0aW5nU3RhdGUuYm90dG9tKGZvcm1hdHRpbmdDb250ZXh0Um9v
dCkpOwotCi0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIHsgfTsKLX0KLQot
UG9zaXRpb24gRmxvYXRpbmdDb250ZXh0OjpmbG9hdGluZ1Bvc2l0aW9uKGNvbnN0IEZsb2F0aW5n
U3RhdGU6OkZsb2F0SXRlbSYgZmxvYXRJdGVtKSBjb25zdAotewotICAgIGF1dG8gaW5pdGlhbFZl
cnRpY2FsUG9zaXRpb24gPSB0aGlzLT5pbml0aWFsVmVydGljYWxQb3NpdGlvbihmbG9hdEl0ZW0p
OwotICAgIGF1dG8mIGRpc3BsYXlCb3ggPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpOwotICAgIGF1
dG8gbWFyZ2luQm94U2l6ZSA9IGRpc3BsYXlCb3gubWFyZ2luQm94KCkuc2l6ZSgpOwotCi0gICAg
YXV0byBlbmQgPSBMYXlvdXQ6OmVuZChtX2Zsb2F0aW5nU3RhdGUpOwotICAgIGF1dG8gdG9wID0g
aW5pdGlhbFZlcnRpY2FsUG9zaXRpb247Ci0gICAgYXV0byBib3R0b21Nb3N0ID0gdG9wOwotICAg
IGZvciAoYXV0byBpdGVyYXRvciA9IGJlZ2luKG1fZmxvYXRpbmdTdGF0ZSwgaW5pdGlhbFZlcnRp
Y2FsUG9zaXRpb24pOyBpdGVyYXRvciAhPSBlbmQ7ICsraXRlcmF0b3IpIHsKLSAgICAgICAgQVNT
RVJUKCEoKml0ZXJhdG9yKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIGF1dG8gZmxvYXRzID0gKml0
ZXJhdG9yOwotICAgICAgICB0b3AgPSBmbG9hdHMudmVydGljYWxQb3NpdGlvbigpOwotCi0gICAg
ICAgIC8vIE1vdmUgdGhlIGJveCBob3Jpem9udGFsbHkgc28gdGhhdCBpdCBhbGlnbnMgd2l0aCB0
aGUgY3VycmVudCBmbG9hdGluZyBwYWlyLgotICAgICAgICBhdXRvIGxlZnQgPSBhbGlnbldpdGhG
bG9hdGluZ3MoZmxvYXRzLCBmbG9hdEl0ZW0pOwotICAgICAgICAvLyBDaGVjayBpZiB0aGUgYm94
IGZpdHMgYXQgdGhpcyB2ZXJ0aWNhbCBwb3NpdGlvbi4KLSAgICAgICAgaWYgKCFmbG9hdHMuaW50
ZXJzZWN0cyh7IHRvcCwgbGVmdCwgbWFyZ2luQm94U2l6ZS53aWR0aCgpLCBtYXJnaW5Cb3hTaXpl
LmhlaWdodCgpIH0pKQotICAgICAgICAgICAgcmV0dXJuIHsgbGVmdCArIGRpc3BsYXlCb3gubWFy
Z2luTGVmdCgpLCB0b3AgKyBkaXNwbGF5Qm94Lm1hcmdpblRvcCgpIH07Ci0KLSAgICAgICAgYm90
dG9tTW9zdCA9IGZsb2F0cy5ib3R0b20oKTsKLSAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBm
bG9hdGluZyBwYWlyLgotICAgIH0KLQotICAgIC8vIFBhc3NlZCBhbGwgdGhlIGZsb2F0cyBhbmQg
c3RpbGwgZG9lcyBub3QgZml0PwotICAgIHJldHVybiB7IGFsaWduV2l0aENvbnRhaW5pbmdCbG9j
ayhmbG9hdEl0ZW0pICsgZGlzcGxheUJveC5tYXJnaW5MZWZ0KCksIGJvdHRvbU1vc3QgKyBkaXNw
bGF5Qm94Lm1hcmdpblRvcCgpIH07Ci19Ci0KLUxheW91dFVuaXQgRmxvYXRpbmdDb250ZXh0Ojpp
bml0aWFsVmVydGljYWxQb3NpdGlvbihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mIGZs
b2F0SXRlbSkgY29uc3QKLXsKLSAgICAvLyBJbmNvbWluZyBmbG9hdGluZyBjYW5ub3QgYmUgcGxh
Y2VkIGhpZ2hlciB0aGFuIGV4aXN0aW5nIGZsb2F0cy4KLSAgICAvLyBUYWtlIHRoZSBzdGF0aWMg
cG9zaXRpb24gKHdoZXJlIHRoZSBib3ggd291bGQgZ28gaWYgaXQgd2Fzbid0IGZsb2F0aW5nKSBh
bmQgYWRqdXN0IGl0IHdpdGggdGhlIGxhc3QgZmxvYXRpbmcuCi0gICAgYXV0byBtYXJnaW5Cb3hU
b3AgPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCkudG9wKCk7Ci0KLSAg
ICBpZiAoYXV0byBsYXN0RmxvYXQgPSBtX2Zsb2F0aW5nU3RhdGUubGFzdCgpKQotICAgICAgICBy
ZXR1cm4gc3RkOjptYXgobWFyZ2luQm94VG9wLCBsYXN0RmxvYXQtPmRpc3BsYXlCb3goKS5yZWN0
V2l0aE1hcmdpbigpLnRvcCgpKTsKLQotICAgIHJldHVybiBtYXJnaW5Cb3hUb3A7Ci19Ci0KLUxh
eW91dFVuaXQgRmxvYXRpbmdDb250ZXh0OjphbGlnbldpdGhDb250YWluaW5nQmxvY2soY29uc3Qg
RmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9hdEl0ZW0pIGNvbnN0Ci17Ci0gICAgLy8gSWYg
dGhlcmUgaXMgbm8gZmxvYXRpbmcgdG8gYWxpZ24gd2l0aCwgcHVzaCB0aGUgYm94IHRvIHRoZSBs
ZWZ0L3JpZ2h0IGVkZ2Ugb2YgaXRzIGNvbnRhaW5pbmcgYmxvY2sncyBjb250ZW50IGJveC4KLSAg
ICAvLyAoRWl0aGVyIHRoZXJlJ3Mgbm8gZmxvYXRzIGF0IGFsbCBvciB0aGlzIGJveCBkb2VzIG5v
dCBmaXQgYXQgYW55IHZlcnRpY2FsIHBvc2l0aW9ucyB3aGVyZSB0aGUgZmxvYXRzIGFyZS4pCi0g
ICAgYXV0byYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCA9IGZsb2F0SXRlbS5jb250YWluaW5n
QmxvY2tEaXNwbGF5Qm94KCk7Ci0gICAgYXV0byBjb250YWluaW5nQmxvY2tDb250ZW50Qm94TGVm
dCA9IGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gubGVmdCgpICsgY29udGFpbmluZ0Jsb2NrRGlz
cGxheUJveC5jb250ZW50Qm94TGVmdCgpOwotCi0gICAgaWYgKGZsb2F0SXRlbS5sYXlvdXRCb3go
KS5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdC
bG9ja0NvbnRlbnRCb3hMZWZ0OwotCi0gICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRC
b3hMZWZ0ICsgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94V2lkdGgoKSAtIGZs
b2F0SXRlbS5kaXNwbGF5Qm94KCkubWFyZ2luQm94KCkud2lkdGgoKTsKLX0KLQotTGF5b3V0VW5p
dCBGbG9hdGluZ0NvbnRleHQ6OmFsaWduV2l0aEZsb2F0aW5ncyhjb25zdCBGbG9hdGluZ1BhaXIm
IGZsb2F0aW5nUGFpciwgY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9hdEl0ZW0p
IGNvbnN0Ci17Ci0gICAgLy8gQ29tcHV0ZSB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBmb3IgdGhl
IG5ldyBmbG9hdGluZyBieSB0YWtpbmcgYm90aCB0aGUgY29udGluaW5nIGJsb2NrIGFuZCB0aGUg
Y3VycmVudCBsZWZ0L3JpZ2h0IGZsb2F0cyBpbnRvIGFjY291bnQuCi0gICAgYXV0byYgY29udGFp
bmluZ0Jsb2NrRGlzcGxheUJveCA9IGZsb2F0SXRlbS5jb250YWluaW5nQmxvY2tEaXNwbGF5Qm94
KCk7Ci0gICAgYXV0byBjb250YWluaW5nQmxvY2tDb250ZW50Qm94TGVmdCA9IGNvbnRhaW5pbmdC
bG9ja0Rpc3BsYXlCb3gubGVmdCgpICsgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50
Qm94TGVmdCgpOwotICAgIGF1dG8gY29udGFpbmluZ0Jsb2NrQ29udGVudEJveFJpZ2h0ID0gY29u
dGFpbmluZ0Jsb2NrRGlzcGxheUJveC5sZWZ0KCkgKyBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94
LmNvbnRlbnRCb3hSaWdodCgpOwotICAgIGF1dG8gbWFyZ2luQm94V2lkdGggPSBmbG9hdEl0ZW0u
ZGlzcGxheUJveCgpLm1hcmdpbkJveCgpLndpZHRoKCk7Ci0KLSAgICBhdXRvIGxlZnRBbGlnbmVk
Qm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hMZWZ0OwotICAgIGF1dG8gcmlnaHRB
bGlnbmVkQm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hSaWdodCAtIG1hcmdpbkJv
eFdpZHRoOwotCi0gICAgaWYgKGZsb2F0aW5nUGFpci5pc0VtcHR5KCkpIHsKLSAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBmbG9hdEl0ZW0ubGF5b3V0Qm94KCku
aXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkgPyBsZWZ0QWxpZ25lZEJveExlZnQgOiByaWdodEFs
aWduZWRCb3hMZWZ0OwotICAgIH0KLQotICAgIGlmIChmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNM
ZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgaWYgKGF1dG8qIGxlZnREaXNwbGF5
Qm94ID0gZmxvYXRpbmdQYWlyLmxlZnQoKSkgewotICAgICAgICAgICAgYXV0byBsZWZ0RmxvYXRp
bmdCb3hSaWdodCA9IGxlZnREaXNwbGF5Qm94LT5yZWN0V2l0aE1hcmdpbigpLnJpZ2h0KCk7Ci0g
ICAgICAgICAgICByZXR1cm4gc3RkOjptaW4oc3RkOjptYXgobGVmdEFsaWduZWRCb3hMZWZ0LCBs
ZWZ0RmxvYXRpbmdCb3hSaWdodCksIHJpZ2h0QWxpZ25lZEJveExlZnQpOwotICAgICAgICB9Ci0g
ICAgICAgIAotICAgICAgICByZXR1cm4gbGVmdEFsaWduZWRCb3hMZWZ0OwotICAgIH0KLQotICAg
IEFTU0VSVChmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgp
KTsKLQotICAgIGlmIChhdXRvKiByaWdodERpc3BsYXlCb3ggPSBmbG9hdGluZ1BhaXIucmlnaHQo
KSkgewotICAgICAgICBhdXRvIHJpZ2h0RmxvYXRpbmdCb3hMZWZ0ID0gcmlnaHREaXNwbGF5Qm94
LT5yZWN0V2l0aE1hcmdpbigpLmxlZnQoKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWF4KHN0ZDo6
bWluKHJpZ2h0QWxpZ25lZEJveExlZnQsIHJpZ2h0RmxvYXRpbmdCb3hMZWZ0IC0gbWFyZ2luQm94
V2lkdGgpLCBsZWZ0QWxpZ25lZEJveExlZnQpOwotICAgIH0KLQotICAgIHJldHVybiByaWdodEFs
aWduZWRCb3hMZWZ0OwotfQotCi0vLyBGSVhNRTogZmluZCBhIGJldHRlciBwbGFjZSBmb3IgdGhp
cy4KLVBvc2l0aW9uIEZsb2F0aW5nQ29udGV4dDo6dG9Db250YWluaW5nQmxvY2soY29uc3QgRmxv
YXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9hdEl0ZW0sIFBvc2l0aW9uIHBvc2l0aW9uKSBjb25z
dAotewotICAgIC8vIEZyb20gZm9ybWF0dGluZyByb290IGNvb3JkaW5hdGUgc3lzdGVtIGJhY2sg
dG8gY29udGFpbmluZyBibG9jaydzLgotICAgIGlmICgmZmxvYXRJdGVtLmNvbnRhaW5pbmdCbG9j
aygpID09ICZtX2Zsb2F0aW5nU3RhdGUucm9vdCgpKQotICAgICAgICByZXR1cm4gcG9zaXRpb247
Ci0KLSAgICBhdXRvJiBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94ID0gZmxvYXRJdGVtLmNvbnRh
aW5pbmdCbG9ja0Rpc3BsYXlCb3goKTsKLSAgICByZXR1cm4geyBwb3NpdGlvbi54IC0gY29udGFp
bmluZ0Jsb2NrRGlzcGxheUJveC5sZWZ0KCksIHBvc2l0aW9uLnkgLSBjb250YWluaW5nQmxvY2tE
aXNwbGF5Qm94LnRvcCgpIH07Ci19Ci0KLUZsb2F0aW5nUGFpcjo6RmxvYXRpbmdQYWlyKGNvbnN0
IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzKQotICAgIDogbV9mbG9hdHMoZmxvYXRz
KQotewotfQotCi1jb25zdCBEaXNwbGF5OjpCb3gqIEZsb2F0aW5nUGFpcjo6bGVmdCgpIGNvbnN0
Ci17Ci0gICAgaWYgKCFtX2xlZnRJbmRleCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAg
ICBBU1NFUlQobV9mbG9hdHNbKm1fbGVmdEluZGV4XS5sYXlvdXRCb3goKS5pc0xlZnRGbG9hdGlu
Z1Bvc2l0aW9uZWQoKSk7Ci0gICAgcmV0dXJuICZtX2Zsb2F0c1sqbV9sZWZ0SW5kZXhdLmRpc3Bs
YXlCb3goKTsKLX0KLQotY29uc3QgRGlzcGxheTo6Qm94KiBGbG9hdGluZ1BhaXI6OnJpZ2h0KCkg
Y29uc3QKLXsKLSAgICBpZiAoIW1fcmlnaHRJbmRleCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7
Ci0KLSAgICBBU1NFUlQobV9mbG9hdHNbKm1fcmlnaHRJbmRleF0ubGF5b3V0Qm94KCkuaXNSaWdo
dEZsb2F0aW5nUG9zaXRpb25lZCgpKTsKLSAgICByZXR1cm4gJm1fZmxvYXRzWyptX3JpZ2h0SW5k
ZXhdLmRpc3BsYXlCb3goKTsKLX0KLQotYm9vbCBGbG9hdGluZ1BhaXI6OmludGVyc2VjdHMoY29u
c3QgRGlzcGxheTo6Qm94OjpSZWN0JiBjYW5kaWRhdGVSZWN0KSBjb25zdAotewotICAgIGF1dG8g
aW50ZXJzZWN0cyA9IFsmXShjb25zdCBEaXNwbGF5OjpCb3gqIGZsb2F0aW5nLCBGbG9hdCBmbG9h
dGluZ1R5cGUpIHsKLSAgICAgICAgaWYgKCFmbG9hdGluZykKLSAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgICAgICBhdXRvIG1hcmdpblJlY3QgPSBmbG9hdGluZy0+cmVjdFdpdGhNYXJn
aW4oKTsKLSAgICAgICAgLy8gQmVmb3JlIGludGVyc2VjdGluZywgY2hlY2sgaWYgdGhlIGNhbmRp
ZGF0ZSBwb3NpdGlvbiBpcyB0b28gZmFyIHRvIHRoZSBsZWZ0L3JpZ2h0LgotICAgICAgICAvLyBU
aGUgbmV3IGZsb2F0J3MgY29udGFpbmluZyBibG9jayBjb3VsZCBwdXNoIHRoZSBjYW5kaWRhdGUg
cG9zaXRpb24gYmV5b25kIHRoZSBjdXJyZW50IGZsb2F0IGhvcml6b250YWxseS4KLSAgICAgICAg
aWYgKChmbG9hdGluZ1R5cGUgPT0gRmxvYXQ6OkxlZnQgJiYgY2FuZGlkYXRlUmVjdC5sZWZ0KCkg
PCBtYXJnaW5SZWN0LnJpZ2h0KCkpCi0gICAgICAgICAgICB8fCAoZmxvYXRpbmdUeXBlID09IEZs
b2F0OjpSaWdodCAmJiBjYW5kaWRhdGVSZWN0LnJpZ2h0KCkgPiBtYXJnaW5SZWN0LmxlZnQoKSkp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIG1hcmdpblJlY3QuaW50
ZXJzZWN0cyhjYW5kaWRhdGVSZWN0KTsKLSAgICB9OwotCi0gICAgaWYgKCFtX2xlZnRJbmRleCAm
JiAhbV9yaWdodEluZGV4KSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGludGVyc2VjdHMobGVmdCgpLCBGbG9h
dDo6TGVmdCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKGludGVyc2VjdHMocmln
aHQoKSwgRmxvYXQ6OlJpZ2h0KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLWJvb2wgRmxvYXRpbmdQYWlyOjpvcGVyYXRvciA9PShjb25zdCBGbG9hdGlu
Z1BhaXImIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBtX2xlZnRJbmRleCA9PSBvdGhlci5t
X2xlZnRJbmRleCAmJiBtX3JpZ2h0SW5kZXggPT0gb3RoZXIubV9yaWdodEluZGV4OwotfQotCi1M
YXlvdXRVbml0IEZsb2F0aW5nUGFpcjo6Ym90dG9tKCkgY29uc3QKLXsKLSAgICBhdXRvKiBsZWZ0
ID0gdGhpcy0+bGVmdCgpOwotICAgIGF1dG8qIHJpZ2h0ID0gdGhpcy0+cmlnaHQoKTsKLSAgICBB
U1NFUlQobGVmdCB8fCByaWdodCk7Ci0KLSAgICBhdXRvIGxlZnRCb3R0b20gPSBsZWZ0ID8gc3Rk
OjpvcHRpb25hbDxMYXlvdXRVbml0PihsZWZ0LT5yZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgpKSA6
IHN0ZDo6bnVsbG9wdDsKLSAgICBhdXRvIHJpZ2h0Qm90dG9tID0gcmlnaHQgPyBzdGQ6Om9wdGlv
bmFsPExheW91dFVuaXQ+KHJpZ2h0LT5yZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgpKSA6IHN0ZDo6
bnVsbG9wdDsKLQotICAgIGlmIChsZWZ0Qm90dG9tICYmIHJpZ2h0Qm90dG9tKQotICAgICAgICBy
ZXR1cm4gc3RkOjptYXgoKmxlZnRCb3R0b20sICpyaWdodEJvdHRvbSk7Ci0KLSAgICBpZiAobGVm
dEJvdHRvbSkKLSAgICAgICAgcmV0dXJuICpsZWZ0Qm90dG9tOwotCi0gICAgcmV0dXJuICpyaWdo
dEJvdHRvbTsKLX0KLQotSXRlcmF0b3I6Okl0ZXJhdG9yKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZs
b2F0TGlzdCYgZmxvYXRzLCBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRp
b24pCi0gICAgOiBtX2Zsb2F0cyhmbG9hdHMpCi0gICAgLCBtX2N1cnJlbnQoZmxvYXRzKQotewot
ICAgIGlmICh2ZXJ0aWNhbFBvc2l0aW9uKQotICAgICAgICBzZXQoKnZlcnRpY2FsUG9zaXRpb24p
OwotfQotCi1pbmxpbmUgc3RhdGljIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IHByZXZpb3VzRmxv
YXRpbmdJbmRleChGbG9hdCBmbG9hdGluZ1R5cGUsIGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0
TGlzdCYgZmxvYXRzLCB1bnNpZ25lZCBjdXJyZW50SW5kZXgpCi17Ci0gICAgUkVMRUFTRV9BU1NF
UlQoY3VycmVudEluZGV4IDw9IGZsb2F0cy5zaXplKCkpOwotCi0gICAgd2hpbGUgKGN1cnJlbnRJ
bmRleCkgewotICAgICAgICBhdXRvJiBmbG9hdGluZyA9IGZsb2F0c1stLWN1cnJlbnRJbmRleF0u
bGF5b3V0Qm94KCk7Ci0gICAgICAgIGlmICgoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpMZWZ0ICYm
IGZsb2F0aW5nLmlzTGVmdEZsb2F0aW5nUG9zaXRpb25lZCgpKSB8fCAoZmxvYXRpbmdUeXBlID09
IEZsb2F0OjpSaWdodCAmJiBmbG9hdGluZy5pc1JpZ2h0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKQot
ICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDsKLSAgICB9Ci0KLSAgICByZXR1cm4geyB9
OwotfQotCi1JdGVyYXRvciYgSXRlcmF0b3I6Om9wZXJhdG9yKysoKQotewotICAgIGlmIChtX2N1
cnJlbnQuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAg
ICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgYXV0byBmaW5kUHJldmlvdXNGbG9hdGluZ1dp
dGhMb3dlckJvdHRvbSA9IFsmXShGbG9hdCBmbG9hdGluZ1R5cGUsIHVuc2lnbmVkIGN1cnJlbnRJ
bmRleCkgLT4gc3RkOjpvcHRpb25hbDx1bnNpZ25lZD4gewotCi0gICAgICAgIFJFTEVBU0VfQVNT
RVJUKGN1cnJlbnRJbmRleCA8IG1fZmxvYXRzLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gTGFzdCBm
bG9hdGluZz8gVGhlcmUncyBjZXJ0YWlubHkgbm8gcHJldmlvdXMgZmxvYXRpbmcgYXQgdGhpcyBw
b2ludC4KLSAgICAgICAgaWYgKCFjdXJyZW50SW5kZXgpCi0gICAgICAgICAgICByZXR1cm4geyB9
OwotCi0gICAgICAgIGF1dG8gY3VycmVudEJvdHRvbSA9IG1fZmxvYXRzW2N1cnJlbnRJbmRleF0u
ZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCkuYm90dG9tKCk7Ci0KLSAgICAgICAgc3RkOjpv
cHRpb25hbDx1bnNpZ25lZD4gaW5kZXggPSBjdXJyZW50SW5kZXg7Ci0gICAgICAgIHdoaWxlICh0
cnVlKSB7Ci0gICAgICAgICAgICBpbmRleCA9IHByZXZpb3VzRmxvYXRpbmdJbmRleChmbG9hdGlu
Z1R5cGUsIG1fZmxvYXRzLCAqaW5kZXgpOwotICAgICAgICAgICAgaWYgKCFpbmRleCkKLSAgICAg
ICAgICAgICAgICByZXR1cm4geyB9OwotCi0gICAgICAgICAgICBpZiAobV9mbG9hdHNbKmluZGV4
XS5kaXNwbGF5Qm94KCkucmVjdFdpdGhNYXJnaW4oKS5ib3R0b20oKSA+IGN1cnJlbnRCb3R0b20p
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiB7IH07Ci0gICAgfTsKLQotICAgIC8v
IDEuIFRha2UgdGhlIGN1cnJlbnQgZmxvYXRpbmcgZnJvbSBsZWZ0IGFuZCByaWdodCBhbmQgY2hl
Y2sgd2hpY2ggb25lJ3MgYm90dG9tIGVkZ2UgaXMgcG9zaXRpb25lZCBoaWdoZXIgKHRoZXkgY291
bGQgYmUgb24gdGhlIHNhbWUgdmVydGljYWwgcG9zaXRpb24gdG9vKS4KLSAgICAvLyBUaGUgY3Vy
cmVudCBmbG9hdHMgZnJvbSBsZWZ0IGFuZCByaWdodCBhcmUgY29uc2lkZXJlZCB0aGUgaW5uZXIt
bW9zdCBwYWlyIGZvciB0aGUgY3VycmVudCB2ZXJ0aWNhbCBwb3NpdGlvbi4KLSAgICAvLyAyLiBN
b3ZlIGF3YXkgZnJvbSBpbm5lci1tb3N0IHBhaXIgYnkgcGlja2luZyBvbmUgb2YgdGhlIHByZXZp
b3VzIGZsb2F0cyBpbiB0aGUgbGlzdCgjMSkKLSAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbmV3IGZs
b2F0aW5nJ3MgYm90dG9tIGVkZ2UgaXMgcG9zaXRpb25lZCBsb3dlciB0aGFuIHRoZSBjdXJyZW50
IG9uZSAtd2hpY2ggZXNzZW50aWFsbHkgbWVhbnMgc2tpcHBpbmcgaW4tYmV0d2VlbiBmbG9hdHMg
dGhhdCBhcmUgcG9zaXRpb25lZCBoaWdoZXIpLgotICAgIC8vIDMuIFJlc2V0IHRoZSB2ZXJ0aWNh
bCBwb3NpdGlvbiBhbmQgYWxpZ24gaXQgd2l0aCB0aGUgbmV3IGxlZnQtcmlnaHQgcGFpci4gVGhl
c2UgZmxvYXRzIGFyZSBub3cgdGhlIGlubmVyLW1vc3QgYm94ZXMgZm9yIHRoZSBjdXJyZW50IHZl
cnRpY2FsIHBvc2l0aW9uLgotICAgIC8vIEFzIHRoZSByZXN1bHQgd2UgaGF2ZSBtb3JlIGhvcml6
b250YWwgc3BhY2Ugb24gdGhlIGN1cnJlbnQgdmVydGljYWwgcG9zaXRpb24uCi0gICAgYXV0byBs
ZWZ0Qm90dG9tID0gbV9jdXJyZW50LmxlZnQoKSA/IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4o
bV9jdXJyZW50LmxlZnQoKS0+Ym90dG9tKCkpIDogc3RkOjpudWxsb3B0OwotICAgIGF1dG8gcmln
aHRCb3R0b20gPSBtX2N1cnJlbnQucmlnaHQoKSA/IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4o
bV9jdXJyZW50LnJpZ2h0KCktPmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKLQotICAgIGF1dG8g
dXBkYXRlTGVmdCA9IChsZWZ0Qm90dG9tID09IHJpZ2h0Qm90dG9tKSB8fCAoIXJpZ2h0Qm90dG9t
IHx8IChsZWZ0Qm90dG9tICYmIGxlZnRCb3R0b20gPCByaWdodEJvdHRvbSkpOyAKLSAgICBhdXRv
IHVwZGF0ZVJpZ2h0ID0gKGxlZnRCb3R0b20gPT0gcmlnaHRCb3R0b20pIHx8ICghbGVmdEJvdHRv
bSB8fCAocmlnaHRCb3R0b20gJiYgbGVmdEJvdHRvbSA+IHJpZ2h0Qm90dG9tKSk7IAotCi0gICAg
aWYgKHVwZGF0ZUxlZnQpIHsKLSAgICAgICAgQVNTRVJUKG1fY3VycmVudC5tX2xlZnRJbmRleCk7
Ci0gICAgICAgIG1fY3VycmVudC5tX3ZlcnRpY2FsUG9zaXRpb24gPSAqbGVmdEJvdHRvbTsKLSAg
ICAgICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4ID0gZmluZFByZXZpb3VzRmxvYXRpbmdXaXRoTG93
ZXJCb3R0b20oRmxvYXQ6OkxlZnQsICptX2N1cnJlbnQubV9sZWZ0SW5kZXgpOwotICAgIH0KLSAg
ICAKLSAgICBpZiAodXBkYXRlUmlnaHQpIHsKLSAgICAgICAgQVNTRVJUKG1fY3VycmVudC5tX3Jp
Z2h0SW5kZXgpOwotICAgICAgICBtX2N1cnJlbnQubV92ZXJ0aWNhbFBvc2l0aW9uID0gKnJpZ2h0
Qm90dG9tOwotICAgICAgICBtX2N1cnJlbnQubV9yaWdodEluZGV4ID0gZmluZFByZXZpb3VzRmxv
YXRpbmdXaXRoTG93ZXJCb3R0b20oRmxvYXQ6OlJpZ2h0LCAqbV9jdXJyZW50Lm1fcmlnaHRJbmRl
eCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICp0aGlzOwotfQotCi12b2lkIEl0ZXJhdG9yOjpzZXQo
TGF5b3V0VW5pdCB2ZXJ0aWNhbFBvc2l0aW9uKQotewotICAgIC8vIE1vdmUgdGhlIGl0ZXJhdG9y
IHRvIHRoZSBpbml0aWFsIHZlcnRpY2FsIHBvc2l0aW9uIGJ5IHN0YXJ0aW5nIGF0IHRoZSBpbm5l
ci1tb3N0IGZsb2F0aW5nIHBhaXIgKGxhc3QgZmxvYXRzIG9uIGxlZnQvcmlnaHQpLgotICAgIC8v
IDEuIENoZWNrIGlmIHRoZSBpbm5lci1tb3N0IHBhaXIgY292ZXJzIHRoZSB2ZXJ0aWNhbCBwb3Np
dGlvbi4KLSAgICAvLyAyLiBNb3ZlIG91dHdhcmRzIGZyb20gdGhlIGlubmVyLW1vc3QgcGFpciB1
bnRpbCB0aGUgdmVydGljYWwgcG9zdGlvbiBpbnRlcnNlY3RzLgotICAgIC8vIChOb3RlIHRoYXQg
dmVydGljYWxQb3NpdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGFkanVzdGVkIHdpdGggdGhlIHRvcCBv
ZiB0aGUgbGFzdCBmbG9hdC4pCi0KLSAgICBtX2N1cnJlbnQubV92ZXJ0aWNhbFBvc2l0aW9uID0g
dmVydGljYWxQb3NpdGlvbjsKLSAgICAvLyBObyBmbG9hdHMgYXQgYWxsPwotICAgIGlmIChtX2Zs
b2F0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0KLSAgICAg
ICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4ID0geyB9OwotICAgICAgICBtX2N1cnJlbnQubV9yaWdo
dEluZGV4ID0geyB9OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXV0byBmaW5kRmxv
YXRpbmdCZWxvdyA9IFsmXShGbG9hdCBmbG9hdGluZ1R5cGUpIC0+IHN0ZDo6b3B0aW9uYWw8dW5z
aWduZWQ+IHsKLQotICAgICAgICBBU1NFUlQoIW1fZmxvYXRzLmlzRW1wdHkoKSk7Ci0KLSAgICAg
ICAgYXV0byBpbmRleCA9IGZsb2F0aW5nVHlwZSA9PSBGbG9hdDo6TGVmdCA/IG1fY3VycmVudC5t
X2xlZnRJbmRleCA6IG1fY3VycmVudC5tX3JpZ2h0SW5kZXg7Ci0gICAgICAgIC8vIFN0YXJ0IGZy
b20gdGhlIGVuZCBpZiB3ZSBkb24ndCBoYXZlIGN1cnJlbnQgeWV0LgotICAgICAgICBpbmRleCA9
IGluZGV4LnZhbHVlX29yKG1fZmxvYXRzLnNpemUoKSk7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7
Ci0gICAgICAgICAgICBpbmRleCA9IHByZXZpb3VzRmxvYXRpbmdJbmRleChmbG9hdGluZ1R5cGUs
IG1fZmxvYXRzLCAqaW5kZXgpOwotICAgICAgICAgICAgaWYgKCFpbmRleCkKLSAgICAgICAgICAg
ICAgICByZXR1cm4geyB9OwotCi0gICAgICAgICAgICBhdXRvIGJvdHRvbSA9IG1fZmxvYXRzWypp
bmRleF0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCkuYm90dG9tKCk7Ci0gICAgICAgICAg
ICAvLyBJcyB0aGlzIGZsb2F0aW5nIGludHJ1c2l2ZSBvbiB0aGlzIHBvc2l0aW9uPwotICAgICAg
ICAgICAgaWYgKGJvdHRvbSA+IHZlcnRpY2FsUG9zaXRpb24pCi0gICAgICAgICAgICAgICAgcmV0
dXJuIGluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHsgfTsKLSAgICB9OwotCi0g
ICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4ID0gZmluZEZsb2F0aW5nQmVsb3coRmxvYXQ6OkxlZnQp
OwotICAgIG1fY3VycmVudC5tX3JpZ2h0SW5kZXggPSBmaW5kRmxvYXRpbmdCZWxvdyhGbG9hdDo6
UmlnaHQpOwotCi0gICAgQVNTRVJUKCFtX2N1cnJlbnQubV9sZWZ0SW5kZXggfHwgKCptX2N1cnJl
bnQubV9sZWZ0SW5kZXggPCBtX2Zsb2F0cy5zaXplKCkgJiYgbV9mbG9hdHNbKm1fY3VycmVudC5t
X2xlZnRJbmRleF0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKTsKLSAg
ICBBU1NFUlQoIW1fY3VycmVudC5tX3JpZ2h0SW5kZXggfHwgKCptX2N1cnJlbnQubV9yaWdodElu
ZGV4IDwgbV9mbG9hdHMuc2l6ZSgpICYmIG1fZmxvYXRzWyptX2N1cnJlbnQubV9yaWdodEluZGV4
XS5sYXlvdXRCb3goKS5pc1JpZ2h0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKTsKLX0KLQotYm9vbCBJ
dGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciYgb3RoZXIpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1fY3VycmVudCA9PSBvdGhlci5tX2N1cnJlbnQ7Ci19Ci0KLWJvb2wgSXRlcmF0b3I6
Om9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3ImIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsKLX0KLQotfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQv
RmxvYXRpbmdDb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDNhOTNk
YTMzMmM2MjJiZDVjN2EzZjQ3MjNmMTJmYTk1Njk2YTkuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nQ29u
dGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAxOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFn
bWEgb25jZQotCi0jaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNs
dWRlICJGbG9hdGluZ1N0YXRlLmgiCi0jaW5jbHVkZSAiTGF5b3V0VW5pdHMuaCIKLSNpbmNsdWRl
IDx3dGYvSXNvTWFsbG9jLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotbmFtZXNwYWNlIExh
eW91dCB7Ci0KLWNsYXNzIEJveDsKLWNsYXNzIENvbnRhaW5lcjsKLWNsYXNzIEZsb2F0aW5nUGFp
cjsKLWNsYXNzIExheW91dENvbnRleHQ7Ci0KLS8vIEZsb2F0aW5nQ29udGV4dCBpcyByZXNwb25z
aWJsZSBmb3IgYWRqdXN0aW5nIHRoZSBwb3NpdGlvbiBvZiBhIGJveCBpbiB0aGUgY3VycmVudCBm
b3JtYXR0aW5nIGNvbnRleHQKLS8vIGJ5IHRha2luZyB0aGUgZmxvYXRpbmcgYm94ZXMgaW50byBh
Y2NvdW50LgotY2xhc3MgRmxvYXRpbmdDb250ZXh0IHsKLSAgICBXVEZfTUFLRV9JU09fQUxMT0NB
VEVEKEZsb2F0aW5nQ29udGV4dCk7Ci1wdWJsaWM6Ci0gICAgRmxvYXRpbmdDb250ZXh0KEZsb2F0
aW5nU3RhdGUmKTsKLQotICAgIEZsb2F0aW5nU3RhdGUmIGZsb2F0aW5nU3RhdGUoKSBjb25zdCB7
IHJldHVybiBtX2Zsb2F0aW5nU3RhdGU7IH0KLQotICAgIFBvc2l0aW9uIHBvc2l0aW9uRm9yRmxv
YXQoY29uc3QgQm94JikgY29uc3Q7Ci0gICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiB2ZXJ0
aWNhbFBvc2l0aW9uV2l0aENsZWFyYW5jZShjb25zdCBCb3gmKSBjb25zdDsKLQotcHJpdmF0ZToK
LSAgICBMYXlvdXRDb250ZXh0JiBsYXlvdXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9mbG9h
dGluZ1N0YXRlLmxheW91dENvbnRleHQoKTsgfQotCi0gICAgUG9zaXRpb24gZmxvYXRpbmdQb3Np
dGlvbihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mKSBjb25zdDsKLQotICAgIExheW91
dFVuaXQgaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24oY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJ
dGVtJikgY29uc3Q7Ci0gICAgTGF5b3V0VW5pdCBhbGlnbldpdGhDb250YWluaW5nQmxvY2soY29u
c3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJikgY29uc3Q7Ci0gICAgTGF5b3V0VW5pdCBhbGln
bldpdGhGbG9hdGluZ3MoY29uc3QgRmxvYXRpbmdQYWlyJiwgY29uc3QgRmxvYXRpbmdTdGF0ZTo6
RmxvYXRJdGVtJikgY29uc3Q7Ci0gICAgUG9zaXRpb24gdG9Db250YWluaW5nQmxvY2soY29uc3Qg
RmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiwgUG9zaXRpb24pIGNvbnN0OwotCi0gICAgRmxvYXRp
bmdTdGF0ZSYgbV9mbG9hdGluZ1N0YXRlOwotfTsKLQotfQotfQotI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvRmxvYXRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvRmxvYXRpbmdTdGF0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDQxZDNlY2VkY2JmNTNhMzAwYzhmMTk1Yjk5MWQzNDViNmZkYmUwMDguLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zs
b2F0aW5nU3RhdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgot
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
LSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRmxvYXRpbmdTdGF0ZS5oIgotCi0j
aWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCi0KLSNpbmNsdWRlICJGb3JtYXR0
aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIkxheW91dEJveC5oIgotI2luY2x1ZGUgIkxheW91dENv
bnRleHQuaCIKLSNpbmNsdWRlIDx3dGYvSXNvTWFsbG9jSW5saW5lcy5oPgotCi1uYW1lc3BhY2Ug
V2ViQ29yZSB7Ci1uYW1lc3BhY2UgTGF5b3V0IHsKLQotV1RGX01BS0VfSVNPX0FMTE9DQVRFRF9J
TVBMKEZsb2F0aW5nU3RhdGUpOwotCi1GbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW06OkZsb2F0SXRl
bShjb25zdCBCb3gmIGxheW91dEJveCwgY29uc3QgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0
ZSkKLSAgICA6IG1fbGF5b3V0Qm94KG1ha2VXZWFrUHRyKGNvbnN0X2Nhc3Q8Qm94Jj4obGF5b3V0
Qm94KSkpCi0gICAgLCBtX2NvbnRhaW5pbmdCbG9jayhtYWtlV2Vha1B0cihjb25zdF9jYXN0PENv
bnRhaW5lciY+KCpsYXlvdXRCb3guY29udGFpbmluZ0Jsb2NrKCkpKSkKLSAgICAsIG1fYWJzb2x1
dGVEaXNwbGF5Qm94KEZvcm1hdHRpbmdDb250ZXh0OjptYXBCb3hUb0FuY2VzdG9yKGZsb2F0aW5n
U3RhdGUubGF5b3V0Q29udGV4dCgpLCBsYXlvdXRCb3gsIGRvd25jYXN0PENvbnRhaW5lcj4oZmxv
YXRpbmdTdGF0ZS5yb290KCkpKSkKLSAgICAsIG1fY29udGFpbmluZ0Jsb2NrQWJzb2x1dGVEaXNw
bGF5Qm94KEZvcm1hdHRpbmdDb250ZXh0OjptYXBCb3hUb0FuY2VzdG9yKGZsb2F0aW5nU3RhdGUu
bGF5b3V0Q29udGV4dCgpLCAqbV9jb250YWluaW5nQmxvY2ssIGRvd25jYXN0PENvbnRhaW5lcj4o
ZmxvYXRpbmdTdGF0ZS5yb290KCkpKSkKLXsKLX0KLQotRmxvYXRpbmdTdGF0ZTo6RmxvYXRpbmdT
dGF0ZShMYXlvdXRDb250ZXh0JiBsYXlvdXRDb250ZXh0LCBjb25zdCBCb3gmIGZvcm1hdHRpbmdD
b250ZXh0Um9vdCkKLSAgICA6IG1fbGF5b3V0Q29udGV4dChsYXlvdXRDb250ZXh0KQotICAgICwg
bV9mb3JtYXR0aW5nQ29udGV4dFJvb3QobWFrZVdlYWtQdHIoY29uc3RfY2FzdDxCb3gmPihmb3Jt
YXR0aW5nQ29udGV4dFJvb3QpKSkKLXsKLX0KLQotI2lmbmRlZiBOREVCVUcKLXN0YXRpYyBib29s
IGJlbG9uZ3NUb1RoaXNGbG9hdGluZ0NvbnRleHQoY29uc3QgQm94JiBsYXlvdXRCb3gsIGNvbnN0
IEJveCYgZmxvYXRpbmdTdGF0ZVJvb3QpCi17Ci0gICAgYXV0byYgZm9ybWF0dGluZ0NvbnRleHRS
b290ID0gbGF5b3V0Qm94LmZvcm1hdHRpbmdDb250ZXh0Um9vdCgpOwotICAgIGlmICgmZm9ybWF0
dGluZ0NvbnRleHRSb290ID09ICZmbG9hdGluZ1N0YXRlUm9vdCkKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0KLSAgICAvLyBNYXliZSB0aGUgbGF5b3V0IGJveCBiZWxvbmdzIHRvIGFuIGlubGluZSBm
b3JtYXR0aW5nIGNvbnRleHQgdGhhdCBpbmhlcml0cyB0aGUgZmxvYXRpbmcgc3RhdGUgZnJvbSB0
aGUgcGFyZW50IChibG9jaykgZm9ybWF0dGluZyBjb250ZXh0LiAKLSAgICBpZiAoIWZvcm1hdHRp
bmdDb250ZXh0Um9vdC5lc3RhYmxpc2hlc0lubGluZUZvcm1hdHRpbmdDb250ZXh0KCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiAmZm9ybWF0dGluZ0NvbnRleHRSb290LmZv
cm1hdHRpbmdDb250ZXh0Um9vdCgpID09ICZmbG9hdGluZ1N0YXRlUm9vdDsKLX0KLSNlbmRpZgot
Ci12b2lkIEZsb2F0aW5nU3RhdGU6OnJlbW92ZShjb25zdCBCb3gmIGxheW91dEJveCkKLXsKLSAg
ICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbV9mbG9hdHMuc2l6ZSgpOyArK2luZGV4
KSB7Ci0gICAgICAgIGlmICgmbV9mbG9hdHNbaW5kZXhdLmxheW91dEJveCgpID09ICZsYXlvdXRC
b3gpIHsKLSAgICAgICAgICAgIG1fZmxvYXRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci19Ci0K
LXZvaWQgRmxvYXRpbmdTdGF0ZTo6YXBwZW5kKGNvbnN0IEJveCYgbGF5b3V0Qm94KQotewotICAg
IEFTU0VSVChpczxDb250YWluZXI+KCptX2Zvcm1hdHRpbmdDb250ZXh0Um9vdCkpOwotICAgIEFT
U0VSVChiZWxvbmdzVG9UaGlzRmxvYXRpbmdDb250ZXh0KGxheW91dEJveCwgKm1fZm9ybWF0dGlu
Z0NvbnRleHRSb290KSk7Ci0KLSAgICAvLyBGbG9hdGluZyBzdGF0ZSBzaG91bGQgaG9sZCBib3hl
cyB3aXRoIGNvbXB1dGVkIHBvc2l0aW9uL3NpemUuCi0gICAgQVNTRVJUKG1fbGF5b3V0Q29udGV4
dC5kaXNwbGF5Qm94Rm9yTGF5b3V0Qm94KGxheW91dEJveCkpOwotICAgIEFTU0VSVChpczxDb250
YWluZXI+KCptX2Zvcm1hdHRpbmdDb250ZXh0Um9vdCkpOwotCi0gICAgbV9mbG9hdHMuYXBwZW5k
KHsgbGF5b3V0Qm94LCAqdGhpcyB9KTsKLX0KLQotc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBG
bG9hdGluZ1N0YXRlOjpib3R0b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENs
ZWFyIHR5cGUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fZmxvYXRzLmlzRW1wdHkoKSkKLSAgICAgICAg
cmV0dXJuIHsgfTsKLQotICAgIC8vIFRPRE86IEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgY2FsbGVk
IG9uY2UgZm9yIGVhY2ggZm9ybWF0dGluZyBjb250ZXh0IHJvb3Qgd2l0aCBmbG9hdHMgcGVyIGxh
eW91dC4KLSAgICAvLyBDYWNoZSB0aGUgdmFsdWUgaWYgd2UgZW5kIHVwIGNhbGxpbmcgaXQgbW9y
ZSBmcmVxdWVudGx5IChhbmQgdXBkYXRlIGl0IGF0IGFwcGVuZC9yZW1vdmUpLgotICAgIHN0ZDo6
b3B0aW9uYWw8TGF5b3V0VW5pdD4gYm90dG9tOwotICAgIGZvciAoYXV0byYgZmxvYXRJdGVtIDog
bV9mbG9hdHMpIHsKLSAgICAgICAgLy8gSWdub3JlIGZsb2F0cyBmcm9tIG90aGVyIGZvcm1hdHRp
bmcgY29udGV4dHMgd2hlbiB0aGUgZmxvYXRpbmcgc3RhdGUgaXMgaW5oZXJpdGVkLgotICAgICAg
ICBpZiAoJmZvcm1hdHRpbmdDb250ZXh0Um9vdCAhPSAmZmxvYXRJdGVtLmxheW91dEJveCgpLmZv
cm1hdHRpbmdDb250ZXh0Um9vdCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg
aWYgKCh0eXBlID09IENsZWFyOjpMZWZ0ICYmICFmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0
RmxvYXRpbmdQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICB8fCAodHlwZSA9PSBDbGVhcjo6Umln
aHQgJiYgIWZsb2F0SXRlbS5sYXlvdXRCb3goKS5pc1JpZ2h0RmxvYXRpbmdQb3NpdGlvbmVkKCkp
KQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgYXV0byBmbG9hdHNCb3R0b20gPSBm
bG9hdEl0ZW0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCkuYm90dG9tKCk7Ci0gICAgICAg
IGlmIChib3R0b20pIHsKLSAgICAgICAgICAgIGJvdHRvbSA9IHN0ZDo6bWF4KCpib3R0b20sIGZs
b2F0c0JvdHRvbSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBi
b3R0b20gPSBmbG9hdHNCb3R0b207Ci0gICAgfQotICAgIHJldHVybiBib3R0b207Ci19Ci0KLX0K
LX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nU3Rh
dGUuaCBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC9GbG9hdGluZ1N0YXRlLmgKZGVsZXRlZCBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDlhN2UyYjQyNGY4Yzc5ZTQ0MjNhZDM2OTJiZGNhNjljMmIxNzJi
NzcuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNl
L1dlYkNvcmUvbGF5b3V0L0Zsb2F0aW5nU3RhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSAr
MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgot
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZiBFTkFCTEUoTEFZT1VUX0ZP
Uk1BVFRJTkdfQ09OVEVYVCkKLQotI2luY2x1ZGUgIkRpc3BsYXlCb3guaCIKLSNpbmNsdWRlIDx3
dGYvSXNvTWFsbG9jLmg+Ci0jaW5jbHVkZSA8d3RmL1JlZi5oPgotI2luY2x1ZGUgPHd0Zi9XZWFr
UHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotbmFtZXNwYWNlIExheW91dCB7Ci0KLWNs
YXNzIEJveDsKLWNsYXNzIENvbnRhaW5lcjsKLWNsYXNzIEZvcm1hdHRpbmdTdGF0ZTsKLWNsYXNz
IExheW91dENvbnRleHQ7Ci0KLS8vIEZsb2F0aW5nU3RhdGUgaG9sZHMgdGhlIGZsb2F0aW5nIGJv
eGVzIHBlciBmb3JtYXR0aW5nIGNvbnRleHQuCi1jbGFzcyBGbG9hdGluZ1N0YXRlIDogcHVibGlj
IFJlZkNvdW50ZWQ8RmxvYXRpbmdTdGF0ZT4gewotICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQo
RmxvYXRpbmdTdGF0ZSk7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxGbG9hdGluZ1N0YXRlPiBj
cmVhdGUoTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCwgY29uc3QgQm94JiBmb3JtYXR0aW5n
Q29udGV4dFJvb3QpIHsgcmV0dXJuIGFkb3B0UmVmKCpuZXcgRmxvYXRpbmdTdGF0ZShsYXlvdXRD
b250ZXh0LCBmb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsgfQotCi0gICAgdm9pZCBhcHBlbmQoY29u
c3QgQm94JiBsYXlvdXRCb3gpOwotICAgIHZvaWQgcmVtb3ZlKGNvbnN0IEJveCYgbGF5b3V0Qm94
KTsKLQotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRzLmlzRW1wdHko
KTsgfQotCi0gICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBsZWZ0Qm90dG9tKGNvbnN0IEJv
eCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSBjb25zdDsKLSAgICBzdGQ6Om9wdGlvbmFsPExheW91
dFVuaXQ+IHJpZ2h0Qm90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSBjb25z
dDsKLSAgICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IGJvdHRvbShjb25zdCBCb3gmIGZvcm1h
dHRpbmdDb250ZXh0Um9vdCkgY29uc3Q7Ci0KLSAgICBjbGFzcyBGbG9hdEl0ZW0gewotICAgIHB1
YmxpYzoKLSAgICAgICAgRmxvYXRJdGVtKGNvbnN0IEJveCYsIGNvbnN0IEZsb2F0aW5nU3RhdGUm
KTsKLQotICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xh
eW91dEJveDsgfQotICAgICAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5pbmdCbG9jaygpIGNv
bnN0IHsgcmV0dXJuICptX2NvbnRhaW5pbmdCbG9jazsgfQotCi0gICAgICAgIGNvbnN0IERpc3Bs
YXk6OkJveCYgZGlzcGxheUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYWJzb2x1dGVEaXNwbGF5Qm94
OyB9Ci0gICAgICAgIGNvbnN0IERpc3BsYXk6OkJveCYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJv
eCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGFpbmluZ0Jsb2NrQWJzb2x1dGVEaXNwbGF5Qm94OyB9
Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBXZWFrUHRyPEJveD4gbV9sYXlvdXRCb3g7Ci0gICAg
ICAgIFdlYWtQdHI8Q29udGFpbmVyPiBtX2NvbnRhaW5pbmdCbG9jazsKLQotICAgICAgICBEaXNw
bGF5OjpCb3ggbV9hYnNvbHV0ZURpc3BsYXlCb3g7Ci0gICAgICAgIERpc3BsYXk6OkJveCBtX2Nv
bnRhaW5pbmdCbG9ja0Fic29sdXRlRGlzcGxheUJveDsKLSAgICB9OwotICAgIHVzaW5nIEZsb2F0
TGlzdCA9IFZlY3RvcjxGbG9hdEl0ZW0+OwotICAgIGNvbnN0IEZsb2F0TGlzdCYgZmxvYXRzKCkg
Y29uc3QgeyByZXR1cm4gbV9mbG9hdHM7IH0KLSAgICBjb25zdCBGbG9hdEl0ZW0qIGxhc3QoKSBj
b25zdCB7IHJldHVybiBpc0VtcHR5KCkgPyBudWxscHRyIDogJm1fZmxvYXRzLmxhc3QoKTsgfQot
Ci1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBGbG9hdGluZ0NvbnRleHQ7Ci0gICAgRmxvYXRp
bmdTdGF0ZShMYXlvdXRDb250ZXh0JiwgY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3Qp
OwotCi0gICAgTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1f
bGF5b3V0Q29udGV4dDsgfQotICAgIGNvbnN0IEJveCYgcm9vdCgpIGNvbnN0IHsgcmV0dXJuICpt
X2Zvcm1hdHRpbmdDb250ZXh0Um9vdDsgfQotCi0gICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0
PiBib3R0b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyKSBjb25zdDsK
LQotICAgIExheW91dENvbnRleHQmIG1fbGF5b3V0Q29udGV4dDsKLSAgICBXZWFrUHRyPEJveD4g
bV9mb3JtYXR0aW5nQ29udGV4dFJvb3Q7Ci0gICAgRmxvYXRMaXN0IG1fZmxvYXRzOwotfTsKLQot
aW5saW5lIHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6bGVmdEJvdHRv
bShjb25zdCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3QKLXsgCi0gICAgcmV0dXJu
IGJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyOjpMZWZ0KTsKLX0KLQotaW5saW5l
IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6cmlnaHRCb3R0b20oY29u
c3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGJvdHRv
bShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyOjpSaWdodCk7Ci19Ci0KLWlubGluZSBzdGQ6
Om9wdGlvbmFsPExheW91dFVuaXQ+IEZsb2F0aW5nU3RhdGU6OmJvdHRvbShjb25zdCBCb3gmIGZv
cm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3QKLXsKLSAgICByZXR1cm4gYm90dG9tKGZvcm1hdHRp
bmdDb250ZXh0Um9vdCwgQ2xlYXI6OkJvdGgpOwotfQotCi19Ci19Ci0jZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9Gb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAppbmRl
eCBjODMzYjE4MTNkMjc0NTZhZTEyMDcxZGQwMzU5YzYyYmViYjY1YmY0Li5jYzZkODBhMjkwYmQ3
Mjg3MDc2NDliNDQ0YjQ1NThjNjcyMmQ3YTZmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvRm9ybWF0dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
bGF5b3V0L0Zvcm1hdHRpbmdDb250ZXh0R2VvbWV0cnkuY3BwCkBAIC0yNCwxMiArMjQsMTMgQEAK
ICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRmxvYXRpbmdTdGF0ZS5oIgog
I2luY2x1ZGUgIkZvcm1hdHRpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiRm9ybWF0dGluZ1N0YXRl
LmgiCiAKICNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKIAorI2luY2x1ZGUg
IkZsb2F0aW5nU3RhdGUuaCIKKyNpbmNsdWRlICJGb3JtYXR0aW5nU3RhdGUuaCIKKwogbmFtZXNw
YWNlIFdlYkNvcmUgewogbmFtZXNwYWNlIExheW91dCB7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC9mbG9hdHMvRmxvYXRpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2xheW91dC9mbG9hdHMvRmxvYXRpbmdDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40ZmVhZWEyN2Jl
MTgwYzVjMTBmNGVkOTI1OGIwYWJmNDJjMzhhNzdhCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvbGF5b3V0L2Zsb2F0cy9GbG9hdGluZ0NvbnRleHQuY3BwCkBAIC0wLDAgKzEsNTE2
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZsb2F0aW5n
Q29udGV4dC5oIgorCisjaWYgRU5BQkxFKExBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFQpCisKKyNp
bmNsdWRlICJEaXNwbGF5Qm94LmgiCisjaW5jbHVkZSAiTGF5b3V0Qm94LmgiCisjaW5jbHVkZSAi
TGF5b3V0Q29udGFpbmVyLmgiCisjaW5jbHVkZSAiTGF5b3V0Q29udGV4dC5oIgorI2luY2x1ZGUg
PHd0Zi9Jc29NYWxsb2NJbmxpbmVzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFj
ZSBMYXlvdXQgeworCitXVEZfTUFLRV9JU09fQUxMT0NBVEVEX0lNUEwoRmxvYXRpbmdDb250ZXh0
KTsKKworLy8gRmluZGluZyB0aGUgdG9wL2xlZnQgcG9zaXRpb24gZm9yIGEgbmV3IGZsb2F0aW5n
KEYpCisvLyAgX19fXyAgX19fXyAgX19fX18gICAgICAgICAgICAgICBfX19fX19fCisvLyB8ICAg
IHx8IEwyIHx8ICAgICB8IDwtLS0tLTEtLS0tPnwgICAgICAgfAorLy8gfCAgICB8fF9fX198fCAg
TDMgfCAgICAgICAgICAgICB8ICAgUjEgIHwKKy8vIHwgTDEgfCAgICAgIHxfX19fX3wgICAgICAg
ICAgICAgfCAgICAgICB8CisvLyB8X19fX3wgPC0tLS0tLS0tLS0tLS0yLS0tLS0tLS0tPnwgICAg
ICAgfAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKy8vICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX198CisvLworLy8gMS4gQ29tcHV0
ZSB0aGUgaW5pdGlhbCB2ZXJ0aWNhbCBwb3NpdGlvbiBmb3IgKEYpIC0+ICgxKQorLy8gMi4gRmlu
ZCB0aGUgY29ycmVzcG9uZGluZyBmbG9hdGluZyBwYWlyIChMMy1SMSkKKy8vIDMuIEFsaWduIChG
KSBob3Jpem9udGFsbHkgd2l0aCAoTDMtUjEpIGRlcGVuZGluZyB3aGV0aGVyIChGKSBpcyBsZWZ0
L3JpZ2h0IHBvc2l0aW9uZWQKKy8vIDQuIEludGVyc2VjdCAoRikgd2l0aCAoTDMtUjEpCisvLyA1
LiBJZiAoRikgZG9lcyBub3QgZml0LCBmaW5kIHRoZSBuZXh0IGZsb2F0aW5nIHBhaXIgKEwxLVIx
KQorLy8gNi4gUmVwZWF0IHVudGlsIGVpdGhlciAoRikgZml0cy9ubyBtb3JlIGZsb2F0cy4KKy8v
IE5vdGUgdGhhdCBhbGwgY29vcmRpbmF0ZXMgYXJlIGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBv
ZiB0aGUgZm9ybWF0dGluZyByb290LgorLy8gVGhlIGZvcm1hdHRpbmcgcm9vdCBoZXJlIGlzIGFs
d2F5cyB0aGUgb25lIHRoYXQgZXN0YWJsaXNoZXMgdGhlIGZsb2F0aW5nIGNvbnRleHQgKHNlZSBp
bmhlcml0ZWQgZmxvYXRpbmcgY29udGV4dCkuCisvLyAoSXQgc2ltcGx5IG1lYW5zIHRoYXQgdGhl
IGZsb2F0IGJveCdzIGZvcm1hdHRpbmcgcm9vdCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUg
YXMgdGhlIEZvcm1hdHRpbmdDb250ZXh0J3Mgcm9vdC4pCisKK2NsYXNzIEl0ZXJhdG9yOworCitj
bGFzcyBGbG9hdGluZ1BhaXIgeworcHVibGljOgorICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsg
cmV0dXJuICFtX2xlZnRJbmRleCAmJiAhbV9yaWdodEluZGV4OyB9CisgICAgY29uc3QgRGlzcGxh
eTo6Qm94KiBsZWZ0KCkgY29uc3Q7CisgICAgY29uc3QgRGlzcGxheTo6Qm94KiByaWdodCgpIGNv
bnN0OworICAgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBEaXNwbGF5OjpCb3g6OlJlY3QmKSBjb25z
dDsKKyAgICBMYXlvdXRVbml0IHZlcnRpY2FsUG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBtX3Zl
cnRpY2FsUG9zaXRpb247IH0KKyAgICBMYXlvdXRVbml0IGJvdHRvbSgpIGNvbnN0OworICAgIGJv
b2wgb3BlcmF0b3I9PShjb25zdCBGbG9hdGluZ1BhaXImKSBjb25zdDsKKworcHJpdmF0ZToKKyAg
ICBmcmllbmQgY2xhc3MgSXRlcmF0b3I7CisgICAgRmxvYXRpbmdQYWlyKGNvbnN0IEZsb2F0aW5n
U3RhdGU6OkZsb2F0TGlzdCYpOworCisgICAgY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRMaXN0
JiBtX2Zsb2F0czsKKworICAgIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IG1fbGVmdEluZGV4Owor
ICAgIHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IG1fcmlnaHRJbmRleDsKKyAgICBMYXlvdXRVbml0
IG1fdmVydGljYWxQb3NpdGlvbjsKK307CisKK2NsYXNzIEl0ZXJhdG9yIHsKK3B1YmxpYzoKKyAg
ICBJdGVyYXRvcihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmLCBzdGQ6Om9wdGlvbmFs
PExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRpb24pOworCisgICAgY29uc3QgRmxvYXRpbmdQYWly
JiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBtX2N1cnJlbnQ7IH0KKyAgICBJdGVyYXRvciYg
b3BlcmF0b3IrKygpOworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciYpIGNvbnN0
OworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciYpIGNvbnN0OworCitwcml2YXRl
OgorICAgIHZvaWQgc2V0KExheW91dFVuaXQgdmVydGljYWxQb3NpdGlvbik7CisKKyAgICBjb25z
dCBGbG9hdGluZ1N0YXRlOjpGbG9hdExpc3QmIG1fZmxvYXRzOworICAgIEZsb2F0aW5nUGFpciBt
X2N1cnJlbnQ7Cit9OworCitzdGF0aWMgSXRlcmF0b3IgYmVnaW4oY29uc3QgRmxvYXRpbmdTdGF0
ZSYgZmxvYXRpbmdTdGF0ZSwgTGF5b3V0VW5pdCBpbml0aWFsVmVydGljYWxQb3NpdGlvbikKK3sK
KyAgICAvLyBTdGFydCB3aXRoIHRoZSBpbm5lci1tb3N0IGZsb2F0aW5nIHBhaXIgZm9yIHRoZSBp
bml0aWFsIHZlcnRpY2FsIHBvc2l0aW9uLgorICAgIHJldHVybiBJdGVyYXRvcihmbG9hdGluZ1N0
YXRlLmZsb2F0cygpLCBpbml0aWFsVmVydGljYWxQb3NpdGlvbik7Cit9CisKK3N0YXRpYyBJdGVy
YXRvciBlbmQoY29uc3QgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSkKK3sKKyAgICByZXR1
cm4gSXRlcmF0b3IoZmxvYXRpbmdTdGF0ZS5mbG9hdHMoKSwgc3RkOjpudWxsb3B0KTsKK30KKwor
RmxvYXRpbmdDb250ZXh0OjpGbG9hdGluZ0NvbnRleHQoRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdT
dGF0ZSkKKyAgICA6IG1fZmxvYXRpbmdTdGF0ZShmbG9hdGluZ1N0YXRlKQoreworfQorCitQb3Np
dGlvbiBGbG9hdGluZ0NvbnRleHQ6OnBvc2l0aW9uRm9yRmxvYXQoY29uc3QgQm94JiBsYXlvdXRC
b3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5pc0Zsb2F0aW5nUG9zaXRpb25lZCgp
KTsKKyAgICBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0gZmxvYXRJdGVtID0geyBsYXlvdXRCb3gs
IG1fZmxvYXRpbmdTdGF0ZSB9OworCisgICAgUG9zaXRpb24gZmxvYXRQb3NpdGlvbjsKKyAgICBp
ZiAobV9mbG9hdGluZ1N0YXRlLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBObyBmbG9hdCBib3gg
b24gdGhlIGNvbnRleHQgeWV0IC0+IGFsaWduIGl0IHdpdGggdGhlIGNvbnRhaW5pbmcgYmxvY2sn
cyBsZWZ0L3JpZ2h0IGVkZ2UuCisgICAgICAgIGF1dG8mIGRpc3BsYXlCb3ggPSBmbG9hdEl0ZW0u
ZGlzcGxheUJveCgpOworICAgICAgICBmbG9hdFBvc2l0aW9uID0geyBhbGlnbldpdGhDb250YWlu
aW5nQmxvY2soZmxvYXRJdGVtKSArIGRpc3BsYXlCb3gubWFyZ2luTGVmdCgpLCBkaXNwbGF5Qm94
LnRvcCgpIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRmluZCB0aGUgdG9wIG1vc3QgcG9z
aXRpb24gd2hlcmUgdGhlIGZsb2F0IGJveCBmaXRzLgorICAgICAgICBmbG9hdFBvc2l0aW9uID0g
ZmxvYXRpbmdQb3NpdGlvbihmbG9hdEl0ZW0pOworICAgIH0KKworICAgIHJldHVybiB0b0NvbnRh
aW5pbmdCbG9jayhmbG9hdEl0ZW0sIGZsb2F0UG9zaXRpb24pOworfQorCitzdGQ6Om9wdGlvbmFs
PExheW91dFVuaXQ+IEZsb2F0aW5nQ29udGV4dDo6dmVydGljYWxQb3NpdGlvbldpdGhDbGVhcmFu
Y2UoY29uc3QgQm94JiBsYXlvdXRCb3gpIGNvbnN0Cit7CisgICAgQVNTRVJUKGxheW91dEJveC5o
YXNGbG9hdENsZWFyKCkpOworICAgIEFTU0VSVChsYXlvdXRCb3guaXNCbG9ja0xldmVsQm94KCkp
OworCisgICAgaWYgKG1fZmxvYXRpbmdTdGF0ZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB7
IH07CisKKyAgICBhdXRvIGJvdHRvbSA9IFsmXShzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IGZs
b2F0Qm90dG9tKSAtPiBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHsKKyAgICAgICAgLy8gJ2Jv
dHRvbScgaXMgaW4gdGhlIGZvcm1hdHRpbmcgcm9vdCdzIGNvb3JkaW5hdGUgc3lzdGVtLgorICAg
ICAgICBpZiAoIWZsb2F0Qm90dG9tKQorICAgICAgICAgICAgcmV0dXJuIHsgfTsKKworICAgICAg
ICAvLyA5LjUuMiBDb250cm9sbGluZyBmbG93IG5leHQgdG8gZmxvYXRzOiB0aGUgJ2NsZWFyJyBw
cm9wZXJ0eQorICAgICAgICAvLyBUaGVuIHRoZSBhbW91bnQgb2YgY2xlYXJhbmNlIGlzIHNldCB0
byB0aGUgZ3JlYXRlciBvZjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gMS4gVGhlIGFtb3VudCBu
ZWNlc3NhcnkgdG8gcGxhY2UgdGhlIGJvcmRlciBlZGdlIG9mIHRoZSBibG9jayBldmVuIHdpdGgg
dGhlIGJvdHRvbSBvdXRlciBlZGdlIG9mIHRoZSBsb3dlc3QgZmxvYXQgdGhhdCBpcyB0byBiZSBj
bGVhcmVkLgorICAgICAgICAvLyAyLiBUaGUgYW1vdW50IG5lY2Vzc2FyeSB0byBwbGFjZSB0aGUg
dG9wIGJvcmRlciBlZGdlIG9mIHRoZSBibG9jayBhdCBpdHMgaHlwb3RoZXRpY2FsIHBvc2l0aW9u
LgorCisgICAgICAgIGF1dG8mIGxheW91dENvbnRleHQgPSB0aGlzLT5sYXlvdXRDb250ZXh0KCk7
CisgICAgICAgIGF1dG8mIGRpc3BsYXlCb3ggPSAqbGF5b3V0Q29udGV4dC5kaXNwbGF5Qm94Rm9y
TGF5b3V0Qm94KGxheW91dEJveCk7CisgICAgICAgIGF1dG8gcm9vdFJlbGF0aXZlVG9wID0gRm9y
bWF0dGluZ0NvbnRleHQ6Om1hcFRvcExlZnRUb0FuY2VzdG9yKGxheW91dENvbnRleHQsIGxheW91
dEJveCwgZG93bmNhc3Q8Q29udGFpbmVyPihtX2Zsb2F0aW5nU3RhdGUucm9vdCgpKSkueTsKKyAg
ICAgICAgYXV0byBjbGVhcmFuY2UgPSAqZmxvYXRCb3R0b20gLSByb290UmVsYXRpdmVUb3A7Cisg
ICAgICAgIGlmIChjbGVhcmFuY2UgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiB7IH07CisKKyAg
ICAgICAgLy8gQ2xlYXJhbmNlIGluaGliaXRzIG1hcmdpbiBjb2xsYXBzaW5nLiBMZXQncyByZXNl
dCB0aGUgcmVsZXZhbnQgYWRqb2luaW5nIG1hcmdpbnMuCisgICAgICAgIGlmIChhdXRvKiBwcmV2
aW91c0luRmxvd1NpYmxpbmcgPSBsYXlvdXRCb3gucHJldmlvdXNJbkZsb3dTaWJsaW5nKCkpIHsK
KyAgICAgICAgICAgIGF1dG8mIHByZXZpb3VzSW5GbG93RGlzcGxheUJveCA9ICpsYXlvdXRDb250
ZXh0LmRpc3BsYXlCb3hGb3JMYXlvdXRCb3goKnByZXZpb3VzSW5GbG93U2libGluZyk7CisKKyAg
ICAgICAgICAgIC8vIFNpbmNlIHRoZSBwcmV2aW91cyBpbmZsb3cgc2libGluZyBoYXMgYWxyZWFk
eSBiZWVuIGxhaWQgb3V0LCBpdHMgbWFyZ2luIGlzIGNvbGxhcHNlZCBieSBub3cuCisgICAgICAg
ICAgICBBU1NFUlQoIXByZXZpb3VzSW5GbG93RGlzcGxheUJveC5tYXJnaW5Cb3R0b20oKSk7Cisg
ICAgICAgICAgICBhdXRvIGNvbGxhcHNlZE1hcmdpbiA9IGRpc3BsYXlCb3gubWFyZ2luVG9wKCk7
CisKKyAgICAgICAgICAgIC8vIFJlc2V0IHByZXZpb3VzIGJvdHRvbSBhbmQgY3VycmVudCB0b3Ag
bWFyZ2lucyB0byBub24tY29sbGFwc2luZy4KKyAgICAgICAgICAgIHByZXZpb3VzSW5GbG93RGlz
cGxheUJveC5zZXRWZXJ0aWNhbE1hcmdpbih7IHByZXZpb3VzSW5GbG93RGlzcGxheUJveC5tYXJn
aW5Ub3AoKSwgcHJldmlvdXNJbkZsb3dEaXNwbGF5Qm94Lm5vbkNvbGxhcHNlZE1hcmdpbkJvdHRv
bSgpIH0pOworICAgICAgICAgICAgZGlzcGxheUJveC5zZXRWZXJ0aWNhbE1hcmdpbih7IGRpc3Bs
YXlCb3gubm9uQ29sbGFwc2VkTWFyZ2luVG9wKCksIGRpc3BsYXlCb3gubWFyZ2luQm90dG9tKCkg
fSk7CisKKyAgICAgICAgICAgIGF1dG8gbm9uQ29sbGFwc2VkTWFyZ2luID0gcHJldmlvdXNJbkZs
b3dEaXNwbGF5Qm94Lm1hcmdpbkJvdHRvbSgpICsgZGlzcGxheUJveC5tYXJnaW5Ub3AoKTsKKyAg
ICAgICAgICAgIGF1dG8gbWFyZ2luT2Zmc2V0ID0gbm9uQ29sbGFwc2VkTWFyZ2luIC0gY29sbGFw
c2VkTWFyZ2luOworICAgICAgICAgICAgLy8gTW92ZSB0aGUgYm94IHRvIHRoZSBwb3NpdGlvbiB3
aGVyZSBpdCB3b3VsZCBiZSB3aXRoIG5vbi1jb2xsYXBzZWQgbWFyZ2lucy4KKyAgICAgICAgICAg
IHJvb3RSZWxhdGl2ZVRvcCArPSBtYXJnaW5PZmZzZXQ7CisKKyAgICAgICAgICAgIC8vIEhhdmlu
ZyBuZWdhdGl2ZSBjbGVhcmFuY2UgaXMgYWxzbyBub3JtYWwuIEl0IGp1c3QgbWVhbnMgdGhhdCB0
aGUgYm94IHdpdGggdGhlIG5vbi1jb2xsYXBzZWQgbWFyZ2lucyBpcyBub3cgbG93ZXIgdGhhbiBp
dCBuZWVkcyB0byBiZS4KKyAgICAgICAgICAgIGNsZWFyYW5jZSAtPSBtYXJnaW5PZmZzZXQ7Cisg
ICAgICAgIH0KKyAgICAgICAgLy8gTm93IGFkanVzdCB0aGUgYm94J3MgcG9zaXRpb24gd2l0aCB0
aGUgY2xlYXJhbmNlLgorICAgICAgICByb290UmVsYXRpdmVUb3AgKz0gY2xlYXJhbmNlOworICAg
ICAgICBBU1NFUlQoKmZsb2F0Qm90dG9tID09IHJvb3RSZWxhdGl2ZVRvcCk7CisKKyAgICAgICAg
Ly8gVGhlIHJldHVybiB2ZXJ0aWNhbCBwb3NpdGlvbiBpcyBpbiB0aGUgY29udGFpbmluZyBibG9j
aydzIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAgICBhdXRvIGNvbnRhaW5pbmdCbG9ja1Jvb3RS
ZWxhdGl2ZVRvcCA9IEZvcm1hdHRpbmdDb250ZXh0OjptYXBUb3BMZWZ0VG9BbmNlc3RvcihsYXlv
dXRDb250ZXh0LCAqbGF5b3V0Qm94LmNvbnRhaW5pbmdCbG9jaygpLCBkb3duY2FzdDxDb250YWlu
ZXI+KG1fZmxvYXRpbmdTdGF0ZS5yb290KCkpKS55OworICAgICAgICByZXR1cm4gcm9vdFJlbGF0
aXZlVG9wIC0gY29udGFpbmluZ0Jsb2NrUm9vdFJlbGF0aXZlVG9wOworICAgIH07CisKKyAgICBh
dXRvIGNsZWFyID0gbGF5b3V0Qm94LnN0eWxlKCkuY2xlYXIoKTsKKyAgICBhdXRvJiBmb3JtYXR0
aW5nQ29udGV4dFJvb3QgPSBsYXlvdXRCb3guZm9ybWF0dGluZ0NvbnRleHRSb290KCk7CisKKyAg
ICBpZiAoY2xlYXIgPT0gQ2xlYXI6OkxlZnQpCisgICAgICAgIHJldHVybiBib3R0b20obV9mbG9h
dGluZ1N0YXRlLmxlZnRCb3R0b20oZm9ybWF0dGluZ0NvbnRleHRSb290KSk7CisKKyAgICBpZiAo
Y2xlYXIgPT0gQ2xlYXI6OlJpZ2h0KQorICAgICAgICByZXR1cm4gYm90dG9tKG1fZmxvYXRpbmdT
dGF0ZS5yaWdodEJvdHRvbShmb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsKKworICAgIGlmIChjbGVh
ciA9PSBDbGVhcjo6Qm90aCkKKyAgICAgICAgcmV0dXJuIGJvdHRvbShtX2Zsb2F0aW5nU3RhdGUu
Ym90dG9tKGZvcm1hdHRpbmdDb250ZXh0Um9vdCkpOworCisgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgcmV0dXJuIHsgfTsKK30KKworUG9zaXRpb24gRmxvYXRpbmdDb250ZXh0OjpmbG9h
dGluZ1Bvc2l0aW9uKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYgZmxvYXRJdGVtKSBj
b25zdAoreworICAgIGF1dG8gaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24gPSB0aGlzLT5pbml0aWFs
VmVydGljYWxQb3NpdGlvbihmbG9hdEl0ZW0pOworICAgIGF1dG8mIGRpc3BsYXlCb3ggPSBmbG9h
dEl0ZW0uZGlzcGxheUJveCgpOworICAgIGF1dG8gbWFyZ2luQm94U2l6ZSA9IGRpc3BsYXlCb3gu
bWFyZ2luQm94KCkuc2l6ZSgpOworCisgICAgYXV0byBlbmQgPSBMYXlvdXQ6OmVuZChtX2Zsb2F0
aW5nU3RhdGUpOworICAgIGF1dG8gdG9wID0gaW5pdGlhbFZlcnRpY2FsUG9zaXRpb247CisgICAg
YXV0byBib3R0b21Nb3N0ID0gdG9wOworICAgIGZvciAoYXV0byBpdGVyYXRvciA9IGJlZ2luKG1f
ZmxvYXRpbmdTdGF0ZSwgaW5pdGlhbFZlcnRpY2FsUG9zaXRpb24pOyBpdGVyYXRvciAhPSBlbmQ7
ICsraXRlcmF0b3IpIHsKKyAgICAgICAgQVNTRVJUKCEoKml0ZXJhdG9yKS5pc0VtcHR5KCkpOwor
CisgICAgICAgIGF1dG8gZmxvYXRzID0gKml0ZXJhdG9yOworICAgICAgICB0b3AgPSBmbG9hdHMu
dmVydGljYWxQb3NpdGlvbigpOworCisgICAgICAgIC8vIE1vdmUgdGhlIGJveCBob3Jpem9udGFs
bHkgc28gdGhhdCBpdCBhbGlnbnMgd2l0aCB0aGUgY3VycmVudCBmbG9hdGluZyBwYWlyLgorICAg
ICAgICBhdXRvIGxlZnQgPSBhbGlnbldpdGhGbG9hdGluZ3MoZmxvYXRzLCBmbG9hdEl0ZW0pOwor
ICAgICAgICAvLyBDaGVjayBpZiB0aGUgYm94IGZpdHMgYXQgdGhpcyB2ZXJ0aWNhbCBwb3NpdGlv
bi4KKyAgICAgICAgaWYgKCFmbG9hdHMuaW50ZXJzZWN0cyh7IHRvcCwgbGVmdCwgbWFyZ2luQm94
U2l6ZS53aWR0aCgpLCBtYXJnaW5Cb3hTaXplLmhlaWdodCgpIH0pKQorICAgICAgICAgICAgcmV0
dXJuIHsgbGVmdCArIGRpc3BsYXlCb3gubWFyZ2luTGVmdCgpLCB0b3AgKyBkaXNwbGF5Qm94Lm1h
cmdpblRvcCgpIH07CisKKyAgICAgICAgYm90dG9tTW9zdCA9IGZsb2F0cy5ib3R0b20oKTsKKyAg
ICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBmbG9hdGluZyBwYWlyLgorICAgIH0KKworICAgIC8v
IFBhc3NlZCBhbGwgdGhlIGZsb2F0cyBhbmQgc3RpbGwgZG9lcyBub3QgZml0PworICAgIHJldHVy
biB7IGFsaWduV2l0aENvbnRhaW5pbmdCbG9jayhmbG9hdEl0ZW0pICsgZGlzcGxheUJveC5tYXJn
aW5MZWZ0KCksIGJvdHRvbU1vc3QgKyBkaXNwbGF5Qm94Lm1hcmdpblRvcCgpIH07Cit9CisKK0xh
eW91dFVuaXQgRmxvYXRpbmdDb250ZXh0Ojppbml0aWFsVmVydGljYWxQb3NpdGlvbihjb25zdCBG
bG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mIGZsb2F0SXRlbSkgY29uc3QKK3sKKyAgICAvLyBJbmNv
bWluZyBmbG9hdGluZyBjYW5ub3QgYmUgcGxhY2VkIGhpZ2hlciB0aGFuIGV4aXN0aW5nIGZsb2F0
cy4KKyAgICAvLyBUYWtlIHRoZSBzdGF0aWMgcG9zaXRpb24gKHdoZXJlIHRoZSBib3ggd291bGQg
Z28gaWYgaXQgd2Fzbid0IGZsb2F0aW5nKSBhbmQgYWRqdXN0IGl0IHdpdGggdGhlIGxhc3QgZmxv
YXRpbmcuCisgICAgYXV0byBtYXJnaW5Cb3hUb3AgPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpLnJl
Y3RXaXRoTWFyZ2luKCkudG9wKCk7CisKKyAgICBpZiAoYXV0byBsYXN0RmxvYXQgPSBtX2Zsb2F0
aW5nU3RhdGUubGFzdCgpKQorICAgICAgICByZXR1cm4gc3RkOjptYXgobWFyZ2luQm94VG9wLCBs
YXN0RmxvYXQtPmRpc3BsYXlCb3goKS5yZWN0V2l0aE1hcmdpbigpLnRvcCgpKTsKKworICAgIHJl
dHVybiBtYXJnaW5Cb3hUb3A7Cit9CisKK0xheW91dFVuaXQgRmxvYXRpbmdDb250ZXh0OjphbGln
bldpdGhDb250YWluaW5nQmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9h
dEl0ZW0pIGNvbnN0Cit7CisgICAgLy8gSWYgdGhlcmUgaXMgbm8gZmxvYXRpbmcgdG8gYWxpZ24g
d2l0aCwgcHVzaCB0aGUgYm94IHRvIHRoZSBsZWZ0L3JpZ2h0IGVkZ2Ugb2YgaXRzIGNvbnRhaW5p
bmcgYmxvY2sncyBjb250ZW50IGJveC4KKyAgICAvLyAoRWl0aGVyIHRoZXJlJ3Mgbm8gZmxvYXRz
IGF0IGFsbCBvciB0aGlzIGJveCBkb2VzIG5vdCBmaXQgYXQgYW55IHZlcnRpY2FsIHBvc2l0aW9u
cyB3aGVyZSB0aGUgZmxvYXRzIGFyZS4pCisgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrRGlzcGxh
eUJveCA9IGZsb2F0SXRlbS5jb250YWluaW5nQmxvY2tEaXNwbGF5Qm94KCk7CisgICAgYXV0byBj
b250YWluaW5nQmxvY2tDb250ZW50Qm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gu
bGVmdCgpICsgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94TGVmdCgpOworCisg
ICAgaWYgKGZsb2F0SXRlbS5sYXlvdXRCb3goKS5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSkK
KyAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hMZWZ0OworCisgICAgcmV0
dXJuIGNvbnRhaW5pbmdCbG9ja0NvbnRlbnRCb3hMZWZ0ICsgY29udGFpbmluZ0Jsb2NrRGlzcGxh
eUJveC5jb250ZW50Qm94V2lkdGgoKSAtIGZsb2F0SXRlbS5kaXNwbGF5Qm94KCkubWFyZ2luQm94
KCkud2lkdGgoKTsKK30KKworTGF5b3V0VW5pdCBGbG9hdGluZ0NvbnRleHQ6OmFsaWduV2l0aEZs
b2F0aW5ncyhjb25zdCBGbG9hdGluZ1BhaXImIGZsb2F0aW5nUGFpciwgY29uc3QgRmxvYXRpbmdT
dGF0ZTo6RmxvYXRJdGVtJiBmbG9hdEl0ZW0pIGNvbnN0Cit7CisgICAgLy8gQ29tcHV0ZSB0aGUg
aG9yaXpvbnRhbCBwb3NpdGlvbiBmb3IgdGhlIG5ldyBmbG9hdGluZyBieSB0YWtpbmcgYm90aCB0
aGUgY29udGluaW5nIGJsb2NrIGFuZCB0aGUgY3VycmVudCBsZWZ0L3JpZ2h0IGZsb2F0cyBpbnRv
IGFjY291bnQuCisgICAgYXV0byYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCA9IGZsb2F0SXRl
bS5jb250YWluaW5nQmxvY2tEaXNwbGF5Qm94KCk7CisgICAgYXV0byBjb250YWluaW5nQmxvY2tD
b250ZW50Qm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3gubGVmdCgpICsgY29udGFp
bmluZ0Jsb2NrRGlzcGxheUJveC5jb250ZW50Qm94TGVmdCgpOworICAgIGF1dG8gY29udGFpbmlu
Z0Jsb2NrQ29udGVudEJveFJpZ2h0ID0gY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5sZWZ0KCkg
KyBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LmNvbnRlbnRCb3hSaWdodCgpOworICAgIGF1dG8g
bWFyZ2luQm94V2lkdGggPSBmbG9hdEl0ZW0uZGlzcGxheUJveCgpLm1hcmdpbkJveCgpLndpZHRo
KCk7CisKKyAgICBhdXRvIGxlZnRBbGlnbmVkQm94TGVmdCA9IGNvbnRhaW5pbmdCbG9ja0NvbnRl
bnRCb3hMZWZ0OworICAgIGF1dG8gcmlnaHRBbGlnbmVkQm94TGVmdCA9IGNvbnRhaW5pbmdCbG9j
a0NvbnRlbnRCb3hSaWdodCAtIG1hcmdpbkJveFdpZHRoOworCisgICAgaWYgKGZsb2F0aW5nUGFp
ci5pc0VtcHR5KCkpIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJl
dHVybiBmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkgPyBs
ZWZ0QWxpZ25lZEJveExlZnQgOiByaWdodEFsaWduZWRCb3hMZWZ0OworICAgIH0KKworICAgIGlm
IChmbG9hdEl0ZW0ubGF5b3V0Qm94KCkuaXNMZWZ0RmxvYXRpbmdQb3NpdGlvbmVkKCkpIHsKKyAg
ICAgICAgaWYgKGF1dG8qIGxlZnREaXNwbGF5Qm94ID0gZmxvYXRpbmdQYWlyLmxlZnQoKSkgewor
ICAgICAgICAgICAgYXV0byBsZWZ0RmxvYXRpbmdCb3hSaWdodCA9IGxlZnREaXNwbGF5Qm94LT5y
ZWN0V2l0aE1hcmdpbigpLnJpZ2h0KCk7CisgICAgICAgICAgICByZXR1cm4gc3RkOjptaW4oc3Rk
OjptYXgobGVmdEFsaWduZWRCb3hMZWZ0LCBsZWZ0RmxvYXRpbmdCb3hSaWdodCksIHJpZ2h0QWxp
Z25lZEJveExlZnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbGVmdEFs
aWduZWRCb3hMZWZ0OworICAgIH0KKworICAgIEFTU0VSVChmbG9hdEl0ZW0ubGF5b3V0Qm94KCku
aXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgpKTsKKworICAgIGlmIChhdXRvKiByaWdodERpc3Bs
YXlCb3ggPSBmbG9hdGluZ1BhaXIucmlnaHQoKSkgeworICAgICAgICBhdXRvIHJpZ2h0RmxvYXRp
bmdCb3hMZWZ0ID0gcmlnaHREaXNwbGF5Qm94LT5yZWN0V2l0aE1hcmdpbigpLmxlZnQoKTsKKyAg
ICAgICAgcmV0dXJuIHN0ZDo6bWF4KHN0ZDo6bWluKHJpZ2h0QWxpZ25lZEJveExlZnQsIHJpZ2h0
RmxvYXRpbmdCb3hMZWZ0IC0gbWFyZ2luQm94V2lkdGgpLCBsZWZ0QWxpZ25lZEJveExlZnQpOwor
ICAgIH0KKworICAgIHJldHVybiByaWdodEFsaWduZWRCb3hMZWZ0OworfQorCisvLyBGSVhNRTog
ZmluZCBhIGJldHRlciBwbGFjZSBmb3IgdGhpcy4KK1Bvc2l0aW9uIEZsb2F0aW5nQ29udGV4dDo6
dG9Db250YWluaW5nQmxvY2soY29uc3QgRmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtJiBmbG9hdEl0
ZW0sIFBvc2l0aW9uIHBvc2l0aW9uKSBjb25zdAoreworICAgIC8vIEZyb20gZm9ybWF0dGluZyBy
b290IGNvb3JkaW5hdGUgc3lzdGVtIGJhY2sgdG8gY29udGFpbmluZyBibG9jaydzLgorICAgIGlm
ICgmZmxvYXRJdGVtLmNvbnRhaW5pbmdCbG9jaygpID09ICZtX2Zsb2F0aW5nU3RhdGUucm9vdCgp
KQorICAgICAgICByZXR1cm4gcG9zaXRpb247CisKKyAgICBhdXRvJiBjb250YWluaW5nQmxvY2tE
aXNwbGF5Qm94ID0gZmxvYXRJdGVtLmNvbnRhaW5pbmdCbG9ja0Rpc3BsYXlCb3goKTsKKyAgICBy
ZXR1cm4geyBwb3NpdGlvbi54IC0gY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveC5sZWZ0KCksIHBv
c2l0aW9uLnkgLSBjb250YWluaW5nQmxvY2tEaXNwbGF5Qm94LnRvcCgpIH07Cit9CisKK0Zsb2F0
aW5nUGFpcjo6RmxvYXRpbmdQYWlyKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgZmxv
YXRzKQorICAgIDogbV9mbG9hdHMoZmxvYXRzKQoreworfQorCitjb25zdCBEaXNwbGF5OjpCb3gq
IEZsb2F0aW5nUGFpcjo6bGVmdCgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2xlZnRJbmRleCkKKyAg
ICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBBU1NFUlQobV9mbG9hdHNbKm1fbGVmdEluZGV4
XS5sYXlvdXRCb3goKS5pc0xlZnRGbG9hdGluZ1Bvc2l0aW9uZWQoKSk7CisgICAgcmV0dXJuICZt
X2Zsb2F0c1sqbV9sZWZ0SW5kZXhdLmRpc3BsYXlCb3goKTsKK30KKworY29uc3QgRGlzcGxheTo6
Qm94KiBGbG9hdGluZ1BhaXI6OnJpZ2h0KCkgY29uc3QKK3sKKyAgICBpZiAoIW1fcmlnaHRJbmRl
eCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBBU1NFUlQobV9mbG9hdHNbKm1fcmln
aHRJbmRleF0ubGF5b3V0Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgpKTsKKyAgICBy
ZXR1cm4gJm1fZmxvYXRzWyptX3JpZ2h0SW5kZXhdLmRpc3BsYXlCb3goKTsKK30KKworYm9vbCBG
bG9hdGluZ1BhaXI6OmludGVyc2VjdHMoY29uc3QgRGlzcGxheTo6Qm94OjpSZWN0JiBjYW5kaWRh
dGVSZWN0KSBjb25zdAoreworICAgIGF1dG8gaW50ZXJzZWN0cyA9IFsmXShjb25zdCBEaXNwbGF5
OjpCb3gqIGZsb2F0aW5nLCBGbG9hdCBmbG9hdGluZ1R5cGUpIHsKKyAgICAgICAgaWYgKCFmbG9h
dGluZykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBhdXRvIG1hcmdpblJl
Y3QgPSBmbG9hdGluZy0+cmVjdFdpdGhNYXJnaW4oKTsKKyAgICAgICAgLy8gQmVmb3JlIGludGVy
c2VjdGluZywgY2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBwb3NpdGlvbiBpcyB0b28gZmFyIHRvIHRo
ZSBsZWZ0L3JpZ2h0LgorICAgICAgICAvLyBUaGUgbmV3IGZsb2F0J3MgY29udGFpbmluZyBibG9j
ayBjb3VsZCBwdXNoIHRoZSBjYW5kaWRhdGUgcG9zaXRpb24gYmV5b25kIHRoZSBjdXJyZW50IGZs
b2F0IGhvcml6b250YWxseS4KKyAgICAgICAgaWYgKChmbG9hdGluZ1R5cGUgPT0gRmxvYXQ6Okxl
ZnQgJiYgY2FuZGlkYXRlUmVjdC5sZWZ0KCkgPCBtYXJnaW5SZWN0LnJpZ2h0KCkpCisgICAgICAg
ICAgICB8fCAoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpSaWdodCAmJiBjYW5kaWRhdGVSZWN0LnJp
Z2h0KCkgPiBtYXJnaW5SZWN0LmxlZnQoKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgcmV0dXJuIG1hcmdpblJlY3QuaW50ZXJzZWN0cyhjYW5kaWRhdGVSZWN0KTsKKyAgICB9
OworCisgICAgaWYgKCFtX2xlZnRJbmRleCAmJiAhbV9yaWdodEluZGV4KSB7CisgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
aWYgKGludGVyc2VjdHMobGVmdCgpLCBGbG9hdDo6TGVmdCkpCisgICAgICAgIHJldHVybiB0cnVl
OworCisgICAgaWYgKGludGVyc2VjdHMocmlnaHQoKSwgRmxvYXQ6OlJpZ2h0KSkKKyAgICAgICAg
cmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRmxvYXRpbmdQYWly
OjpvcGVyYXRvciA9PShjb25zdCBGbG9hdGluZ1BhaXImIG90aGVyKSBjb25zdAoreworICAgIHJl
dHVybiBtX2xlZnRJbmRleCA9PSBvdGhlci5tX2xlZnRJbmRleCAmJiBtX3JpZ2h0SW5kZXggPT0g
b3RoZXIubV9yaWdodEluZGV4OworfQorCitMYXlvdXRVbml0IEZsb2F0aW5nUGFpcjo6Ym90dG9t
KCkgY29uc3QKK3sKKyAgICBhdXRvKiBsZWZ0ID0gdGhpcy0+bGVmdCgpOworICAgIGF1dG8qIHJp
Z2h0ID0gdGhpcy0+cmlnaHQoKTsKKyAgICBBU1NFUlQobGVmdCB8fCByaWdodCk7CisKKyAgICBh
dXRvIGxlZnRCb3R0b20gPSBsZWZ0ID8gc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PihsZWZ0LT5y
ZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKKyAgICBhdXRvIHJpZ2h0
Qm90dG9tID0gcmlnaHQgPyBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+KHJpZ2h0LT5yZWN0V2l0
aE1hcmdpbigpLmJvdHRvbSgpKSA6IHN0ZDo6bnVsbG9wdDsKKworICAgIGlmIChsZWZ0Qm90dG9t
ICYmIHJpZ2h0Qm90dG9tKQorICAgICAgICByZXR1cm4gc3RkOjptYXgoKmxlZnRCb3R0b20sICpy
aWdodEJvdHRvbSk7CisKKyAgICBpZiAobGVmdEJvdHRvbSkKKyAgICAgICAgcmV0dXJuICpsZWZ0
Qm90dG9tOworCisgICAgcmV0dXJuICpyaWdodEJvdHRvbTsKK30KKworSXRlcmF0b3I6Okl0ZXJh
dG9yKGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzLCBzdGQ6Om9wdGlvbmFs
PExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRpb24pCisgICAgOiBtX2Zsb2F0cyhmbG9hdHMpCisg
ICAgLCBtX2N1cnJlbnQoZmxvYXRzKQoreworICAgIGlmICh2ZXJ0aWNhbFBvc2l0aW9uKQorICAg
ICAgICBzZXQoKnZlcnRpY2FsUG9zaXRpb24pOworfQorCitpbmxpbmUgc3RhdGljIHN0ZDo6b3B0
aW9uYWw8dW5zaWduZWQ+IHByZXZpb3VzRmxvYXRpbmdJbmRleChGbG9hdCBmbG9hdGluZ1R5cGUs
IGNvbnN0IEZsb2F0aW5nU3RhdGU6OkZsb2F0TGlzdCYgZmxvYXRzLCB1bnNpZ25lZCBjdXJyZW50
SW5kZXgpCit7CisgICAgUkVMRUFTRV9BU1NFUlQoY3VycmVudEluZGV4IDw9IGZsb2F0cy5zaXpl
KCkpOworCisgICAgd2hpbGUgKGN1cnJlbnRJbmRleCkgeworICAgICAgICBhdXRvJiBmbG9hdGlu
ZyA9IGZsb2F0c1stLWN1cnJlbnRJbmRleF0ubGF5b3V0Qm94KCk7CisgICAgICAgIGlmICgoZmxv
YXRpbmdUeXBlID09IEZsb2F0OjpMZWZ0ICYmIGZsb2F0aW5nLmlzTGVmdEZsb2F0aW5nUG9zaXRp
b25lZCgpKSB8fCAoZmxvYXRpbmdUeXBlID09IEZsb2F0OjpSaWdodCAmJiBmbG9hdGluZy5pc1Jp
Z2h0RmxvYXRpbmdQb3NpdGlvbmVkKCkpKQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRl
eDsKKyAgICB9CisKKyAgICByZXR1cm4geyB9OworfQorCitJdGVyYXRvciYgSXRlcmF0b3I6Om9w
ZXJhdG9yKysoKQoreworICAgIGlmIChtX2N1cnJlbnQuaXNFbXB0eSgpKSB7CisgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAg
YXV0byBmaW5kUHJldmlvdXNGbG9hdGluZ1dpdGhMb3dlckJvdHRvbSA9IFsmXShGbG9hdCBmbG9h
dGluZ1R5cGUsIHVuc2lnbmVkIGN1cnJlbnRJbmRleCkgLT4gc3RkOjpvcHRpb25hbDx1bnNpZ25l
ZD4geworCisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGN1cnJlbnRJbmRleCA8IG1fZmxvYXRzLnNp
emUoKSk7CisKKyAgICAgICAgLy8gTGFzdCBmbG9hdGluZz8gVGhlcmUncyBjZXJ0YWlubHkgbm8g
cHJldmlvdXMgZmxvYXRpbmcgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgaWYgKCFjdXJyZW50SW5k
ZXgpCisgICAgICAgICAgICByZXR1cm4geyB9OworCisgICAgICAgIGF1dG8gY3VycmVudEJvdHRv
bSA9IG1fZmxvYXRzW2N1cnJlbnRJbmRleF0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFyZ2luKCku
Ym90dG9tKCk7CisKKyAgICAgICAgc3RkOjpvcHRpb25hbDx1bnNpZ25lZD4gaW5kZXggPSBjdXJy
ZW50SW5kZXg7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbmRleCA9IHBy
ZXZpb3VzRmxvYXRpbmdJbmRleChmbG9hdGluZ1R5cGUsIG1fZmxvYXRzLCAqaW5kZXgpOworICAg
ICAgICAgICAgaWYgKCFpbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4geyB9OworCisgICAg
ICAgICAgICBpZiAobV9mbG9hdHNbKmluZGV4XS5kaXNwbGF5Qm94KCkucmVjdFdpdGhNYXJnaW4o
KS5ib3R0b20oKSA+IGN1cnJlbnRCb3R0b20pCisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4
OworICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJl
dHVybiB7IH07CisgICAgfTsKKworICAgIC8vIDEuIFRha2UgdGhlIGN1cnJlbnQgZmxvYXRpbmcg
ZnJvbSBsZWZ0IGFuZCByaWdodCBhbmQgY2hlY2sgd2hpY2ggb25lJ3MgYm90dG9tIGVkZ2UgaXMg
cG9zaXRpb25lZCBoaWdoZXIgKHRoZXkgY291bGQgYmUgb24gdGhlIHNhbWUgdmVydGljYWwgcG9z
aXRpb24gdG9vKS4KKyAgICAvLyBUaGUgY3VycmVudCBmbG9hdHMgZnJvbSBsZWZ0IGFuZCByaWdo
dCBhcmUgY29uc2lkZXJlZCB0aGUgaW5uZXItbW9zdCBwYWlyIGZvciB0aGUgY3VycmVudCB2ZXJ0
aWNhbCBwb3NpdGlvbi4KKyAgICAvLyAyLiBNb3ZlIGF3YXkgZnJvbSBpbm5lci1tb3N0IHBhaXIg
YnkgcGlja2luZyBvbmUgb2YgdGhlIHByZXZpb3VzIGZsb2F0cyBpbiB0aGUgbGlzdCgjMSkKKyAg
ICAvLyBFbnN1cmUgdGhhdCB0aGUgbmV3IGZsb2F0aW5nJ3MgYm90dG9tIGVkZ2UgaXMgcG9zaXRp
b25lZCBsb3dlciB0aGFuIHRoZSBjdXJyZW50IG9uZSAtd2hpY2ggZXNzZW50aWFsbHkgbWVhbnMg
c2tpcHBpbmcgaW4tYmV0d2VlbiBmbG9hdHMgdGhhdCBhcmUgcG9zaXRpb25lZCBoaWdoZXIpLgor
ICAgIC8vIDMuIFJlc2V0IHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBhbmQgYWxpZ24gaXQgd2l0aCB0
aGUgbmV3IGxlZnQtcmlnaHQgcGFpci4gVGhlc2UgZmxvYXRzIGFyZSBub3cgdGhlIGlubmVyLW1v
c3QgYm94ZXMgZm9yIHRoZSBjdXJyZW50IHZlcnRpY2FsIHBvc2l0aW9uLgorICAgIC8vIEFzIHRo
ZSByZXN1bHQgd2UgaGF2ZSBtb3JlIGhvcml6b250YWwgc3BhY2Ugb24gdGhlIGN1cnJlbnQgdmVy
dGljYWwgcG9zaXRpb24uCisgICAgYXV0byBsZWZ0Qm90dG9tID0gbV9jdXJyZW50LmxlZnQoKSA/
IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4obV9jdXJyZW50LmxlZnQoKS0+Ym90dG9tKCkpIDog
c3RkOjpudWxsb3B0OworICAgIGF1dG8gcmlnaHRCb3R0b20gPSBtX2N1cnJlbnQucmlnaHQoKSA/
IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4obV9jdXJyZW50LnJpZ2h0KCktPmJvdHRvbSgpKSA6
IHN0ZDo6bnVsbG9wdDsKKworICAgIGF1dG8gdXBkYXRlTGVmdCA9IChsZWZ0Qm90dG9tID09IHJp
Z2h0Qm90dG9tKSB8fCAoIXJpZ2h0Qm90dG9tIHx8IChsZWZ0Qm90dG9tICYmIGxlZnRCb3R0b20g
PCByaWdodEJvdHRvbSkpOyAKKyAgICBhdXRvIHVwZGF0ZVJpZ2h0ID0gKGxlZnRCb3R0b20gPT0g
cmlnaHRCb3R0b20pIHx8ICghbGVmdEJvdHRvbSB8fCAocmlnaHRCb3R0b20gJiYgbGVmdEJvdHRv
bSA+IHJpZ2h0Qm90dG9tKSk7IAorCisgICAgaWYgKHVwZGF0ZUxlZnQpIHsKKyAgICAgICAgQVNT
RVJUKG1fY3VycmVudC5tX2xlZnRJbmRleCk7CisgICAgICAgIG1fY3VycmVudC5tX3ZlcnRpY2Fs
UG9zaXRpb24gPSAqbGVmdEJvdHRvbTsKKyAgICAgICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4ID0g
ZmluZFByZXZpb3VzRmxvYXRpbmdXaXRoTG93ZXJCb3R0b20oRmxvYXQ6OkxlZnQsICptX2N1cnJl
bnQubV9sZWZ0SW5kZXgpOworICAgIH0KKyAgICAKKyAgICBpZiAodXBkYXRlUmlnaHQpIHsKKyAg
ICAgICAgQVNTRVJUKG1fY3VycmVudC5tX3JpZ2h0SW5kZXgpOworICAgICAgICBtX2N1cnJlbnQu
bV92ZXJ0aWNhbFBvc2l0aW9uID0gKnJpZ2h0Qm90dG9tOworICAgICAgICBtX2N1cnJlbnQubV9y
aWdodEluZGV4ID0gZmluZFByZXZpb3VzRmxvYXRpbmdXaXRoTG93ZXJCb3R0b20oRmxvYXQ6OlJp
Z2h0LCAqbV9jdXJyZW50Lm1fcmlnaHRJbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlz
OworfQorCit2b2lkIEl0ZXJhdG9yOjpzZXQoTGF5b3V0VW5pdCB2ZXJ0aWNhbFBvc2l0aW9uKQor
eworICAgIC8vIE1vdmUgdGhlIGl0ZXJhdG9yIHRvIHRoZSBpbml0aWFsIHZlcnRpY2FsIHBvc2l0
aW9uIGJ5IHN0YXJ0aW5nIGF0IHRoZSBpbm5lci1tb3N0IGZsb2F0aW5nIHBhaXIgKGxhc3QgZmxv
YXRzIG9uIGxlZnQvcmlnaHQpLgorICAgIC8vIDEuIENoZWNrIGlmIHRoZSBpbm5lci1tb3N0IHBh
aXIgY292ZXJzIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbi4KKyAgICAvLyAyLiBNb3ZlIG91dHdhcmRz
IGZyb20gdGhlIGlubmVyLW1vc3QgcGFpciB1bnRpbCB0aGUgdmVydGljYWwgcG9zdGlvbiBpbnRl
cnNlY3RzLgorICAgIC8vIChOb3RlIHRoYXQgdmVydGljYWxQb3NpdGlvbiBoYXMgYWxyZWFkeSBi
ZWVuIGFkanVzdGVkIHdpdGggdGhlIHRvcCBvZiB0aGUgbGFzdCBmbG9hdC4pCisKKyAgICBtX2N1
cnJlbnQubV92ZXJ0aWNhbFBvc2l0aW9uID0gdmVydGljYWxQb3NpdGlvbjsKKyAgICAvLyBObyBm
bG9hdHMgYXQgYWxsPworICAgIGlmIChtX2Zsb2F0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisKKyAgICAgICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4ID0geyB9
OworICAgICAgICBtX2N1cnJlbnQubV9yaWdodEluZGV4ID0geyB9OworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgYXV0byBmaW5kRmxvYXRpbmdCZWxvdyA9IFsmXShGbG9hdCBmbG9hdGlu
Z1R5cGUpIC0+IHN0ZDo6b3B0aW9uYWw8dW5zaWduZWQ+IHsKKworICAgICAgICBBU1NFUlQoIW1f
ZmxvYXRzLmlzRW1wdHkoKSk7CisKKyAgICAgICAgYXV0byBpbmRleCA9IGZsb2F0aW5nVHlwZSA9
PSBGbG9hdDo6TGVmdCA/IG1fY3VycmVudC5tX2xlZnRJbmRleCA6IG1fY3VycmVudC5tX3JpZ2h0
SW5kZXg7CisgICAgICAgIC8vIFN0YXJ0IGZyb20gdGhlIGVuZCBpZiB3ZSBkb24ndCBoYXZlIGN1
cnJlbnQgeWV0LgorICAgICAgICBpbmRleCA9IGluZGV4LnZhbHVlX29yKG1fZmxvYXRzLnNpemUo
KSk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbmRleCA9IHByZXZpb3Vz
RmxvYXRpbmdJbmRleChmbG9hdGluZ1R5cGUsIG1fZmxvYXRzLCAqaW5kZXgpOworICAgICAgICAg
ICAgaWYgKCFpbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4geyB9OworCisgICAgICAgICAg
ICBhdXRvIGJvdHRvbSA9IG1fZmxvYXRzWyppbmRleF0uZGlzcGxheUJveCgpLnJlY3RXaXRoTWFy
Z2luKCkuYm90dG9tKCk7CisgICAgICAgICAgICAvLyBJcyB0aGlzIGZsb2F0aW5nIGludHJ1c2l2
ZSBvbiB0aGlzIHBvc2l0aW9uPworICAgICAgICAgICAgaWYgKGJvdHRvbSA+IHZlcnRpY2FsUG9z
aXRpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CisKKyAgICAg
ICAgcmV0dXJuIHsgfTsKKyAgICB9OworCisgICAgbV9jdXJyZW50Lm1fbGVmdEluZGV4ID0gZmlu
ZEZsb2F0aW5nQmVsb3coRmxvYXQ6OkxlZnQpOworICAgIG1fY3VycmVudC5tX3JpZ2h0SW5kZXgg
PSBmaW5kRmxvYXRpbmdCZWxvdyhGbG9hdDo6UmlnaHQpOworCisgICAgQVNTRVJUKCFtX2N1cnJl
bnQubV9sZWZ0SW5kZXggfHwgKCptX2N1cnJlbnQubV9sZWZ0SW5kZXggPCBtX2Zsb2F0cy5zaXpl
KCkgJiYgbV9mbG9hdHNbKm1fY3VycmVudC5tX2xlZnRJbmRleF0ubGF5b3V0Qm94KCkuaXNMZWZ0
RmxvYXRpbmdQb3NpdGlvbmVkKCkpKTsKKyAgICBBU1NFUlQoIW1fY3VycmVudC5tX3JpZ2h0SW5k
ZXggfHwgKCptX2N1cnJlbnQubV9yaWdodEluZGV4IDwgbV9mbG9hdHMuc2l6ZSgpICYmIG1fZmxv
YXRzWyptX2N1cnJlbnQubV9yaWdodEluZGV4XS5sYXlvdXRCb3goKS5pc1JpZ2h0RmxvYXRpbmdQ
b3NpdGlvbmVkKCkpKTsKK30KKworYm9vbCBJdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBJdGVy
YXRvciYgb3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY3VycmVudCA9PSBvdGhlci5tX2N1
cnJlbnQ7Cit9CisKK2Jvb2wgSXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3ImIG90
aGVyKSBjb25zdAoreworICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKK30KKworfQorfQor
I2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvZmxvYXRzL0Zsb2F0aW5n
Q29udGV4dC5oIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zsb2F0cy9GbG9hdGluZ0NvbnRleHQu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5kOTAzYTkzZGEzMzJjNjIyYmQ1YzdhM2Y0NzIzZjEyZmE5NTY5NmE5Ci0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L2Zsb2F0cy9GbG9hdGluZ0Nv
bnRleHQuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
CisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwor
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNp
ZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJTkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkZsb2F0aW5n
U3RhdGUuaCIKKyNpbmNsdWRlICJMYXlvdXRVbml0cy5oIgorI2luY2x1ZGUgPHd0Zi9Jc29NYWxs
b2MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCituYW1lc3BhY2UgTGF5b3V0IHsKKworY2xh
c3MgQm94OworY2xhc3MgQ29udGFpbmVyOworY2xhc3MgRmxvYXRpbmdQYWlyOworY2xhc3MgTGF5
b3V0Q29udGV4dDsKKworLy8gRmxvYXRpbmdDb250ZXh0IGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1
c3RpbmcgdGhlIHBvc2l0aW9uIG9mIGEgYm94IGluIHRoZSBjdXJyZW50IGZvcm1hdHRpbmcgY29u
dGV4dAorLy8gYnkgdGFraW5nIHRoZSBmbG9hdGluZyBib3hlcyBpbnRvIGFjY291bnQuCitjbGFz
cyBGbG9hdGluZ0NvbnRleHQgeworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoRmxvYXRpbmdD
b250ZXh0KTsKK3B1YmxpYzoKKyAgICBGbG9hdGluZ0NvbnRleHQoRmxvYXRpbmdTdGF0ZSYpOwor
CisgICAgRmxvYXRpbmdTdGF0ZSYgZmxvYXRpbmdTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmxv
YXRpbmdTdGF0ZTsgfQorCisgICAgUG9zaXRpb24gcG9zaXRpb25Gb3JGbG9hdChjb25zdCBCb3gm
KSBjb25zdDsKKyAgICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IHZlcnRpY2FsUG9zaXRpb25X
aXRoQ2xlYXJhbmNlKGNvbnN0IEJveCYpIGNvbnN0OworCitwcml2YXRlOgorICAgIExheW91dENv
bnRleHQmIGxheW91dENvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0aW5nU3RhdGUubGF5
b3V0Q29udGV4dCgpOyB9CisKKyAgICBQb3NpdGlvbiBmbG9hdGluZ1Bvc2l0aW9uKGNvbnN0IEZs
b2F0aW5nU3RhdGU6OkZsb2F0SXRlbSYpIGNvbnN0OworCisgICAgTGF5b3V0VW5pdCBpbml0aWFs
VmVydGljYWxQb3NpdGlvbihjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mKSBjb25zdDsK
KyAgICBMYXlvdXRVbml0IGFsaWduV2l0aENvbnRhaW5pbmdCbG9jayhjb25zdCBGbG9hdGluZ1N0
YXRlOjpGbG9hdEl0ZW0mKSBjb25zdDsKKyAgICBMYXlvdXRVbml0IGFsaWduV2l0aEZsb2F0aW5n
cyhjb25zdCBGbG9hdGluZ1BhaXImLCBjb25zdCBGbG9hdGluZ1N0YXRlOjpGbG9hdEl0ZW0mKSBj
b25zdDsKKyAgICBQb3NpdGlvbiB0b0NvbnRhaW5pbmdCbG9jayhjb25zdCBGbG9hdGluZ1N0YXRl
OjpGbG9hdEl0ZW0mLCBQb3NpdGlvbikgY29uc3Q7CisKKyAgICBGbG9hdGluZ1N0YXRlJiBtX2Zs
b2F0aW5nU3RhdGU7Cit9OworCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2xheW91dC9mbG9hdHMvRmxvYXRpbmdTdGF0ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9sYXlv
dXQvZmxvYXRzL0Zsb2F0aW5nU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmE4MmZmOGFkMmI4NjJiZDE1
Y2RlZTc1Y2Y2OWNiMjIxMDA3N2IzODYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9sYXlvdXQvZmxvYXRzL0Zsb2F0aW5nU3RhdGUuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZsb2F0aW5nU3RhdGUuaCIK
KworI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRm9y
bWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJMYXlvdXRCb3guaCIKKyNpbmNsdWRlICJMYXlv
dXRDb250YWluZXIuaCIKKyNpbmNsdWRlICJMYXlvdXRDb250ZXh0LmgiCisjaW5jbHVkZSA8d3Rm
L0lzb01hbGxvY0lubGluZXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworbmFtZXNwYWNlIExh
eW91dCB7CisKK1dURl9NQUtFX0lTT19BTExPQ0FURURfSU1QTChGbG9hdGluZ1N0YXRlKTsKKwor
RmxvYXRpbmdTdGF0ZTo6RmxvYXRJdGVtOjpGbG9hdEl0ZW0oY29uc3QgQm94JiBsYXlvdXRCb3gs
IGNvbnN0IEZsb2F0aW5nU3RhdGUmIGZsb2F0aW5nU3RhdGUpCisgICAgOiBtX2xheW91dEJveCht
YWtlV2Vha1B0cihjb25zdF9jYXN0PEJveCY+KGxheW91dEJveCkpKQorICAgICwgbV9jb250YWlu
aW5nQmxvY2sobWFrZVdlYWtQdHIoY29uc3RfY2FzdDxDb250YWluZXImPigqbGF5b3V0Qm94LmNv
bnRhaW5pbmdCbG9jaygpKSkpCisgICAgLCBtX2Fic29sdXRlRGlzcGxheUJveChGb3JtYXR0aW5n
Q29udGV4dDo6bWFwQm94VG9BbmNlc3RvcihmbG9hdGluZ1N0YXRlLmxheW91dENvbnRleHQoKSwg
bGF5b3V0Qm94LCBkb3duY2FzdDxDb250YWluZXI+KGZsb2F0aW5nU3RhdGUucm9vdCgpKSkpCisg
ICAgLCBtX2NvbnRhaW5pbmdCbG9ja0Fic29sdXRlRGlzcGxheUJveChGb3JtYXR0aW5nQ29udGV4
dDo6bWFwQm94VG9BbmNlc3RvcihmbG9hdGluZ1N0YXRlLmxheW91dENvbnRleHQoKSwgKm1fY29u
dGFpbmluZ0Jsb2NrLCBkb3duY2FzdDxDb250YWluZXI+KGZsb2F0aW5nU3RhdGUucm9vdCgpKSkp
Cit7Cit9CisKK0Zsb2F0aW5nU3RhdGU6OkZsb2F0aW5nU3RhdGUoTGF5b3V0Q29udGV4dCYgbGF5
b3V0Q29udGV4dCwgY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpCisgICAgOiBtX2xh
eW91dENvbnRleHQobGF5b3V0Q29udGV4dCkKKyAgICAsIG1fZm9ybWF0dGluZ0NvbnRleHRSb290
KG1ha2VXZWFrUHRyKGNvbnN0X2Nhc3Q8Qm94Jj4oZm9ybWF0dGluZ0NvbnRleHRSb290KSkpCit7
Cit9CisKKyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgYm9vbCBiZWxvbmdzVG9UaGlzRmxvYXRpbmdD
b250ZXh0KGNvbnN0IEJveCYgbGF5b3V0Qm94LCBjb25zdCBCb3gmIGZsb2F0aW5nU3RhdGVSb290
KQoreworICAgIGF1dG8mIGZvcm1hdHRpbmdDb250ZXh0Um9vdCA9IGxheW91dEJveC5mb3JtYXR0
aW5nQ29udGV4dFJvb3QoKTsKKyAgICBpZiAoJmZvcm1hdHRpbmdDb250ZXh0Um9vdCA9PSAmZmxv
YXRpbmdTdGF0ZVJvb3QpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gTWF5YmUgdGhl
IGxheW91dCBib3ggYmVsb25ncyB0byBhbiBpbmxpbmUgZm9ybWF0dGluZyBjb250ZXh0IHRoYXQg
aW5oZXJpdHMgdGhlIGZsb2F0aW5nIHN0YXRlIGZyb20gdGhlIHBhcmVudCAoYmxvY2spIGZvcm1h
dHRpbmcgY29udGV4dC4gCisgICAgaWYgKCFmb3JtYXR0aW5nQ29udGV4dFJvb3QuZXN0YWJsaXNo
ZXNJbmxpbmVGb3JtYXR0aW5nQ29udGV4dCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICByZXR1cm4gJmZvcm1hdHRpbmdDb250ZXh0Um9vdC5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKSA9
PSAmZmxvYXRpbmdTdGF0ZVJvb3Q7Cit9CisjZW5kaWYKKwordm9pZCBGbG9hdGluZ1N0YXRlOjpy
ZW1vdmUoY29uc3QgQm94JiBsYXlvdXRCb3gpCit7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAw
OyBpbmRleCA8IG1fZmxvYXRzLnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBpZiAoJm1fZmxv
YXRzW2luZGV4XS5sYXlvdXRCb3goKSA9PSAmbGF5b3V0Qm94KSB7CisgICAgICAgICAgICBtX2Zs
b2F0cy5yZW1vdmUoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAg
fQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworfQorCit2b2lkIEZsb2F0aW5nU3RhdGU6OmFw
cGVuZChjb25zdCBCb3gmIGxheW91dEJveCkKK3sKKyAgICBBU1NFUlQoaXM8Q29udGFpbmVyPigq
bV9mb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsKKyAgICBBU1NFUlQoYmVsb25nc1RvVGhpc0Zsb2F0
aW5nQ29udGV4dChsYXlvdXRCb3gsICptX2Zvcm1hdHRpbmdDb250ZXh0Um9vdCkpOworCisgICAg
Ly8gRmxvYXRpbmcgc3RhdGUgc2hvdWxkIGhvbGQgYm94ZXMgd2l0aCBjb21wdXRlZCBwb3NpdGlv
bi9zaXplLgorICAgIEFTU0VSVChtX2xheW91dENvbnRleHQuZGlzcGxheUJveEZvckxheW91dEJv
eChsYXlvdXRCb3gpKTsKKyAgICBBU1NFUlQoaXM8Q29udGFpbmVyPigqbV9mb3JtYXR0aW5nQ29u
dGV4dFJvb3QpKTsKKworICAgIG1fZmxvYXRzLmFwcGVuZCh7IGxheW91dEJveCwgKnRoaXMgfSk7
Cit9CisKK3N0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6Ym90dG9tKGNv
bnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290LCBDbGVhciB0eXBlKSBjb25zdAoreworICAg
IGlmIChtX2Zsb2F0cy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICAvLyBU
T0RPOiBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IGNhbGxlZCBvbmNlIGZvciBlYWNoIGZvcm1hdHRp
bmcgY29udGV4dCByb290IHdpdGggZmxvYXRzIHBlciBsYXlvdXQuCisgICAgLy8gQ2FjaGUgdGhl
IHZhbHVlIGlmIHdlIGVuZCB1cCBjYWxsaW5nIGl0IG1vcmUgZnJlcXVlbnRseSAoYW5kIHVwZGF0
ZSBpdCBhdCBhcHBlbmQvcmVtb3ZlKS4KKyAgICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IGJv
dHRvbTsKKyAgICBmb3IgKGF1dG8mIGZsb2F0SXRlbSA6IG1fZmxvYXRzKSB7CisgICAgICAgIC8v
IElnbm9yZSBmbG9hdHMgZnJvbSBvdGhlciBmb3JtYXR0aW5nIGNvbnRleHRzIHdoZW4gdGhlIGZs
b2F0aW5nIHN0YXRlIGlzIGluaGVyaXRlZC4KKyAgICAgICAgaWYgKCZmb3JtYXR0aW5nQ29udGV4
dFJvb3QgIT0gJmZsb2F0SXRlbS5sYXlvdXRCb3goKS5mb3JtYXR0aW5nQ29udGV4dFJvb3QoKSkK
KyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICgodHlwZSA9PSBDbGVhcjo6TGVm
dCAmJiAhZmxvYXRJdGVtLmxheW91dEJveCgpLmlzTGVmdEZsb2F0aW5nUG9zaXRpb25lZCgpKQor
ICAgICAgICAgICAgfHwgKHR5cGUgPT0gQ2xlYXI6OlJpZ2h0ICYmICFmbG9hdEl0ZW0ubGF5b3V0
Qm94KCkuaXNSaWdodEZsb2F0aW5nUG9zaXRpb25lZCgpKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgIGF1dG8gZmxvYXRzQm90dG9tID0gZmxvYXRJdGVtLmRpc3BsYXlCb3goKS5y
ZWN0V2l0aE1hcmdpbigpLmJvdHRvbSgpOworICAgICAgICBpZiAoYm90dG9tKSB7CisgICAgICAg
ICAgICBib3R0b20gPSBzdGQ6Om1heCgqYm90dG9tLCBmbG9hdHNCb3R0b20pOworICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYm90dG9tID0gZmxvYXRzQm90dG9tOwor
ICAgIH0KKyAgICByZXR1cm4gYm90dG9tOworfQorCit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2xheW91dC9mbG9hdHMvRmxvYXRpbmdTdGF0ZS5oIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L2Zsb2F0cy9GbG9hdGluZ1N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOWE3ZTJiNDI0
ZjhjNzllNDQyM2FkMzY5MmJkY2E2OWMyYjE3MmI3NwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL2xheW91dC9mbG9hdHMvRmxvYXRpbmdTdGF0ZS5oCkBAIC0wLDAgKzEsMTExIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoTEFZT1VUX0ZPUk1BVFRJ
TkdfQ09OVEVYVCkKKworI2luY2x1ZGUgIkRpc3BsYXlCb3guaCIKKyNpbmNsdWRlIDx3dGYvSXNv
TWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL1JlZi5oPgorI2luY2x1ZGUgPHd0Zi9XZWFrUHRyLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIExheW91dCB7CisKK2NsYXNzIEJv
eDsKK2NsYXNzIENvbnRhaW5lcjsKK2NsYXNzIEZvcm1hdHRpbmdTdGF0ZTsKK2NsYXNzIExheW91
dENvbnRleHQ7CisKKy8vIEZsb2F0aW5nU3RhdGUgaG9sZHMgdGhlIGZsb2F0aW5nIGJveGVzIHBl
ciBmb3JtYXR0aW5nIGNvbnRleHQuCitjbGFzcyBGbG9hdGluZ1N0YXRlIDogcHVibGljIFJlZkNv
dW50ZWQ8RmxvYXRpbmdTdGF0ZT4geworICAgIFdURl9NQUtFX0lTT19BTExPQ0FURUQoRmxvYXRp
bmdTdGF0ZSk7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxGbG9hdGluZ1N0YXRlPiBjcmVhdGUo
TGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCwgY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4
dFJvb3QpIHsgcmV0dXJuIGFkb3B0UmVmKCpuZXcgRmxvYXRpbmdTdGF0ZShsYXlvdXRDb250ZXh0
LCBmb3JtYXR0aW5nQ29udGV4dFJvb3QpKTsgfQorCisgICAgdm9pZCBhcHBlbmQoY29uc3QgQm94
JiBsYXlvdXRCb3gpOworICAgIHZvaWQgcmVtb3ZlKGNvbnN0IEJveCYgbGF5b3V0Qm94KTsKKwor
ICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRzLmlzRW1wdHkoKTsgfQor
CisgICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBsZWZ0Qm90dG9tKGNvbnN0IEJveCYgZm9y
bWF0dGluZ0NvbnRleHRSb290KSBjb25zdDsKKyAgICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+
IHJpZ2h0Qm90dG9tKGNvbnN0IEJveCYgZm9ybWF0dGluZ0NvbnRleHRSb290KSBjb25zdDsKKyAg
ICBzdGQ6Om9wdGlvbmFsPExheW91dFVuaXQ+IGJvdHRvbShjb25zdCBCb3gmIGZvcm1hdHRpbmdD
b250ZXh0Um9vdCkgY29uc3Q7CisKKyAgICBjbGFzcyBGbG9hdEl0ZW0geworICAgIHB1YmxpYzoK
KyAgICAgICAgRmxvYXRJdGVtKGNvbnN0IEJveCYsIGNvbnN0IEZsb2F0aW5nU3RhdGUmKTsKKwor
ICAgICAgICBjb25zdCBCb3gmIGxheW91dEJveCgpIGNvbnN0IHsgcmV0dXJuICptX2xheW91dEJv
eDsgfQorICAgICAgICBjb25zdCBDb250YWluZXImIGNvbnRhaW5pbmdCbG9jaygpIGNvbnN0IHsg
cmV0dXJuICptX2NvbnRhaW5pbmdCbG9jazsgfQorCisgICAgICAgIGNvbnN0IERpc3BsYXk6OkJv
eCYgZGlzcGxheUJveCgpIGNvbnN0IHsgcmV0dXJuIG1fYWJzb2x1dGVEaXNwbGF5Qm94OyB9Cisg
ICAgICAgIGNvbnN0IERpc3BsYXk6OkJveCYgY29udGFpbmluZ0Jsb2NrRGlzcGxheUJveCgpIGNv
bnN0IHsgcmV0dXJuIG1fY29udGFpbmluZ0Jsb2NrQWJzb2x1dGVEaXNwbGF5Qm94OyB9CisKKyAg
ICBwcml2YXRlOgorICAgICAgICBXZWFrUHRyPEJveD4gbV9sYXlvdXRCb3g7CisgICAgICAgIFdl
YWtQdHI8Q29udGFpbmVyPiBtX2NvbnRhaW5pbmdCbG9jazsKKworICAgICAgICBEaXNwbGF5OjpC
b3ggbV9hYnNvbHV0ZURpc3BsYXlCb3g7CisgICAgICAgIERpc3BsYXk6OkJveCBtX2NvbnRhaW5p
bmdCbG9ja0Fic29sdXRlRGlzcGxheUJveDsKKyAgICB9OworICAgIHVzaW5nIEZsb2F0TGlzdCA9
IFZlY3RvcjxGbG9hdEl0ZW0+OworICAgIGNvbnN0IEZsb2F0TGlzdCYgZmxvYXRzKCkgY29uc3Qg
eyByZXR1cm4gbV9mbG9hdHM7IH0KKyAgICBjb25zdCBGbG9hdEl0ZW0qIGxhc3QoKSBjb25zdCB7
IHJldHVybiBpc0VtcHR5KCkgPyBudWxscHRyIDogJm1fZmxvYXRzLmxhc3QoKTsgfQorCitwcml2
YXRlOgorICAgIGZyaWVuZCBjbGFzcyBGbG9hdGluZ0NvbnRleHQ7CisgICAgRmxvYXRpbmdTdGF0
ZShMYXlvdXRDb250ZXh0JiwgY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpOworCisg
ICAgTGF5b3V0Q29udGV4dCYgbGF5b3V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fbGF5b3V0
Q29udGV4dDsgfQorICAgIGNvbnN0IEJveCYgcm9vdCgpIGNvbnN0IHsgcmV0dXJuICptX2Zvcm1h
dHRpbmdDb250ZXh0Um9vdDsgfQorCisgICAgc3RkOjpvcHRpb25hbDxMYXlvdXRVbml0PiBib3R0
b20oY29uc3QgQm94JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyKSBjb25zdDsKKworICAg
IExheW91dENvbnRleHQmIG1fbGF5b3V0Q29udGV4dDsKKyAgICBXZWFrUHRyPEJveD4gbV9mb3Jt
YXR0aW5nQ29udGV4dFJvb3Q7CisgICAgRmxvYXRMaXN0IG1fZmxvYXRzOworfTsKKworaW5saW5l
IHN0ZDo6b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6bGVmdEJvdHRvbShjb25z
dCBCb3gmIGZvcm1hdHRpbmdDb250ZXh0Um9vdCkgY29uc3QKK3sgCisgICAgcmV0dXJuIGJvdHRv
bShmb3JtYXR0aW5nQ29udGV4dFJvb3QsIENsZWFyOjpMZWZ0KTsKK30KKworaW5saW5lIHN0ZDo6
b3B0aW9uYWw8TGF5b3V0VW5pdD4gRmxvYXRpbmdTdGF0ZTo6cmlnaHRCb3R0b20oY29uc3QgQm94
JiBmb3JtYXR0aW5nQ29udGV4dFJvb3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGJvdHRvbShmb3Jt
YXR0aW5nQ29udGV4dFJvb3QsIENsZWFyOjpSaWdodCk7Cit9CisKK2lubGluZSBzdGQ6Om9wdGlv
bmFsPExheW91dFVuaXQ+IEZsb2F0aW5nU3RhdGU6OmJvdHRvbShjb25zdCBCb3gmIGZvcm1hdHRp
bmdDb250ZXh0Um9vdCkgY29uc3QKK3sKKyAgICByZXR1cm4gYm90dG9tKGZvcm1hdHRpbmdDb250
ZXh0Um9vdCwgQ2xlYXI6OkJvdGgpOworfQorCit9Cit9CisjZW5kaWYK
</data>

          </attachment>
      

    </bug>

</bugzilla>